systemview 2.0.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/cli/runTests.js CHANGED
@@ -1,5 +1,3 @@
1
- const fs = require("fs");
2
- const path = require("path");
3
1
  const { createClient } = require("systemlynx");
4
2
  const { createCookieHttpClient } = require("./cookieClient");
5
3
  const cookieHttpClient = createCookieHttpClient();
@@ -48,7 +46,6 @@ module.exports = async function runTests(
48
46
  {
49
47
  json = false,
50
48
  verbose = false,
51
- manifest: manifestPath,
52
49
  headers: cliHeaders = {},
53
50
  bail = false,
54
51
  dryRun = false,
@@ -64,22 +61,25 @@ module.exports = async function runTests(
64
61
  return 1;
65
62
  }
66
63
 
67
- const { services: connectedServices, probeHeaders: manifestHeaders } = await resolveServices(
68
- api,
69
- project_code,
70
- manifestPath
71
- );
64
+ const { services: connectedServices, resolvedNamespace } = await resolveServices(api, project_code);
65
+ if (resolvedNamespace && !namespace) namespace = resolvedNamespace;
72
66
  if (!connectedServices || !connectedServices.length) {
73
67
  log.warn("No connected services found for project: " + project_code);
74
68
  return 1;
75
69
  }
76
70
 
77
- const extraHeaders = { ...manifestHeaders, ...cliHeaders };
71
+ const extraHeaders = { ...cliHeaders };
78
72
 
79
73
  if (!json) {
80
74
  connectedServices.forEach(({ serviceId, system }) => {
81
75
  log.success(`connected: ${serviceId} @ ${system.connectionData.serviceUrl}`);
82
76
  });
77
+ if (namespace || skipPatterns.length) {
78
+ console.log("");
79
+ console.log(chalk.dim(` Filters:`));
80
+ if (namespace) console.log(` ${chalk.dim(`namespace: ${chalk.white(namespace)}`)}`);
81
+ if (skipPatterns.length) console.log(` ${chalk.dim(`skip: ${chalk.white(skipPatterns.join(", "))}`)}`);
82
+ }
83
83
  }
84
84
 
85
85
  const allTestLists = await getTests(connectedServices, Client);
@@ -356,38 +356,32 @@ async function getTests(connectedServices, Client) {
356
356
  return results;
357
357
  }
358
358
 
359
- async function resolveServices(api, project_code, manifestPath) {
360
- const manifestFile = manifestPath || path.join(process.cwd(), "systemview.manifest.json");
359
+ async function resolveServices(api, project_code) {
360
+ try {
361
+ const { SystemView } = await Client.loadService(api);
361
362
 
362
- if (fs.existsSync(manifestFile)) {
363
- try {
364
- const raw = JSON.parse(fs.readFileSync(manifestFile, "utf8"));
365
- const services = raw.services
366
- ? raw.services
367
- : [{ serviceId: raw.serviceId, system: raw.system, specList: raw.specList }];
368
-
369
- if (project_code && raw.projectCode && raw.projectCode !== project_code) {
370
- log.warn(
371
- `Manifest projectCode "${raw.projectCode}" doesn't match "${project_code}", falling back to API`
372
- );
373
- } else {
374
- return { services, probeHeaders: raw.probeHeaders || {} };
375
- }
376
- } catch (err) {
377
- log.warn(`Failed to read manifest: ${err.message}`);
363
+ // Try exact project code match first
364
+ const services = await SystemView.getServices(project_code);
365
+ if (services && services.length) {
366
+ return { services };
378
367
  }
379
- }
380
368
 
381
- const services = await getConnectedServices(api, project_code, Client);
382
- return { services, probeHeaders: {} };
383
- }
369
+ // Fuzzy namespace: check if project_code matches any module or method across all services
370
+ const projects = await SystemView.getProjects();
371
+ const all = Object.values(projects).flat();
372
+ const isNamespace = all.some(({ system }) =>
373
+ (system.connectionData.modules || []).some(({ name, methods }) =>
374
+ name.toLowerCase().includes(project_code.toLowerCase()) ||
375
+ (methods || []).some(({ fn }) => fn.toLowerCase().includes(project_code.toLowerCase()))
376
+ )
377
+ );
378
+ if (isNamespace) {
379
+ return { services: all, resolvedNamespace: project_code };
380
+ }
384
381
 
385
- async function getConnectedServices(api, project_code, Client) {
386
- try {
387
- const { SystemView } = await Client.loadService(api);
388
- return await SystemView.getServices(project_code);
382
+ return { services: [] };
389
383
  } catch (error) {
390
384
  log.error("Failed to connect to SystemView: " + error.message);
391
- return [];
385
+ return { services: [] };
392
386
  }
393
387
  }
@@ -1,54 +1,179 @@
1
1
  const runTests = require("./runTests");
2
- const cli = require("./utils/cli");
2
+ const listTests = require("./listTests");
3
+ const connectService = require("./connectService");
4
+ const manifestCommands = require("./manifest");
5
+ const probe = require("./probe");
3
6
  const openBrowser = require("./openBrowser");
4
7
  const logsCommand = require("./logs");
8
+ const log = require("./logger");
9
+ const cli = require("./utils/cli");
5
10
  const readline = require("readline");
11
+ const { createClient } = require("systemlynx");
12
+ const { createCookieHttpClient } = require("./cookieClient");
13
+ const Client = createClient(createCookieHttpClient());
6
14
 
7
- module.exports = function startLineReader(url) {
15
+ module.exports = async function startLineReader(url, { connectedUrls = new Set() } = {}) {
8
16
  const lineReader = readline.createInterface({
9
17
  input: process.stdin,
10
18
  output: process.stdout,
11
19
  });
12
20
 
13
- const handleInput = (input = "") => {
14
- const parts = input.trim().split(/\s+/);
15
- const command = parts[0];
16
- const args = parts.slice(1);
21
+ let CLI = null;
22
+ try {
23
+ ({ CLI } = await Client.loadService(`${url}/systemview/api`));
24
+ const history = await CLI.getHistory();
25
+ lineReader.history = [...history].reverse();
26
+ } catch {}
27
+
28
+ let stopLogs = null;
17
29
 
18
- const flags = { filter: [], or: [] };
30
+ const parseArgs = (args) => {
31
+ const flags = { filter: [], or: [], include: [], skip: [], headers: {} };
19
32
  const positional = [];
20
33
  for (let i = 0; i < args.length; i++) {
21
34
  if (args[i] === "--level" && args[i + 1]) { flags.level = args[++i]; }
22
35
  else if (args[i] === "--limit" && args[i + 1]) { flags.limit = parseInt(args[++i], 10); }
23
36
  else if (args[i] === "--filter" && args[i + 1]) { flags.filter.push(args[++i]); }
24
37
  else if (args[i] === "--or" && args[i + 1]) { flags.or.push(args[++i]); }
38
+ else if (args[i] === "--include" && args[i + 1]) { flags.include.push(args[++i]); }
39
+ else if (args[i] === "--skip" && args[i + 1]) { flags.skip.push(args[++i]); }
40
+ else if (args[i] === "--phase" && args[i + 1]) { flags.phase = args[++i]; }
41
+ else if (args[i] === "--index" && args[i + 1]) { flags.index = parseInt(args[++i], 10); }
42
+ else if (args[i] === "--header" && args[i + 1]) {
43
+ const val = args[++i];
44
+ const colonIdx = val.indexOf(":");
45
+ if (colonIdx !== -1) flags.headers[val.slice(0, colonIdx).trim()] = val.slice(colonIdx + 1).trim();
46
+ }
25
47
  else if (args[i] === "--verbose") { flags.verbose = true; }
26
48
  else if (args[i] === "--current") { flags.current = true; }
49
+ else if (args[i] === "--follow" || args[i] === "-f") { flags.follow = true; }
50
+ else if (args[i] === "--clear") { flags.clear = true; }
27
51
  else if (args[i] === "--json") { flags.json = true; }
28
- else if (!args[i].startsWith("--")) { positional.push(args[i]); }
52
+ else if (args[i] === "--bail") { flags.bail = true; }
53
+ else if (args[i] === "--dry-run") { flags.dryRun = true; }
54
+ else if (args[i] === "--force") { flags.force = true; }
55
+ else if (args[i] === "--manifest") { flags.useManifest = true; }
56
+ else if (args[i] === "--saved") { flags.saved = true; }
57
+ else if (args[i] === "--save" && args[i + 1] && !args[i + 1].startsWith("-")) { flags.save = args[++i]; }
58
+ else if (args[i] === "--save") { flags.save = true; }
59
+ else if (args[i] === "--save-limit" && args[i + 1]) { flags.saveLimit = parseInt(args[++i], 10); }
60
+ else if (!args[i].startsWith("-")) { positional.push(args[i]); }
29
61
  }
62
+ return { flags, positional };
63
+ };
30
64
 
31
- if (["exit", "q", "shutdown", "stop"].includes(command)) {
65
+ const handleInput = async (input = "") => {
66
+ const parts = input.trim().split(/\s+/);
67
+ const command = parts[0];
68
+ if (!command) { lineReader.prompt(); return; }
69
+ const { flags, positional } = parseArgs(parts.slice(1));
70
+
71
+ if (["exit", "q"].includes(command)) {
32
72
  process.exit(0);
73
+ } else if (["stop", "shutdown"].includes(command)) {
74
+ const api = `${url}/systemview/api`;
75
+ try {
76
+ const { SystemView } = await Client.loadService(api);
77
+ await SystemView.shutdown();
78
+ } catch {}
79
+ const appIsRunning = require("./appIsRunning");
80
+ if (!(await appIsRunning(api))) {
81
+ log.success("SystemView stopped.");
82
+ process.exit(0);
83
+ } else {
84
+ log.error("Shutdown failed.");
85
+ lineReader.prompt();
86
+ }
33
87
  } else if (command === "test") {
34
- try { runTests(url, positional[0], positional[1]); } catch (e) { console.error(e.message); }
88
+ try {
89
+ await runTests(url, positional[0], positional[1], {
90
+ headers: flags.headers,
91
+ json: flags.json,
92
+ verbose: flags.verbose,
93
+ bail: flags.bail,
94
+ dryRun: flags.dryRun,
95
+ phase: flags.phase,
96
+ index: flags.index,
97
+ skip: flags.skip,
98
+ });
99
+ } catch (e) { console.error(e.message); }
100
+ lineReader.prompt();
101
+ } else if (command === "list") {
102
+ try {
103
+ await listTests(url, positional[0], positional[1], {
104
+ connectedUrls,
105
+ verbose: flags.verbose,
106
+ });
107
+ } catch (e) { console.error(e.message); }
35
108
  lineReader.prompt();
36
109
  } else if (command === "logs") {
37
- logsCommand(url, positional[0], positional[1], { ...flags, follow: true, current: flags.current });
110
+ if (stopLogs) { stopLogs(); stopLogs = null; }
111
+ logsCommand(positional[0], positional[1], {
112
+ ...flags,
113
+ uiUrl: url,
114
+ }).then((stop) => { if (stop) stopLogs = stop; });
115
+ } else if (command === "stoplogs" || command === "unsubscribe") {
116
+ if (stopLogs) { stopLogs(); stopLogs = null; log.success("Log streaming stopped."); }
117
+ else { log.warn("No active log stream."); }
118
+ lineReader.prompt();
38
119
  } else if (command === "clearlogs" || command === "flush") {
39
- logsCommand(url, null, null, { clear: true, follow: false });
40
- } else if (command === "help") {
41
- cli.showHelp(0);
120
+ if (stopLogs) { stopLogs(); stopLogs = null; }
121
+ logsCommand(null, null, { clear: true, uiUrl: url });
122
+ lineReader.prompt();
123
+ } else if (command === "connect") {
124
+ try {
125
+ await connectService(positional[0], {
126
+ useManifest: flags.useManifest,
127
+ force: flags.force,
128
+ connectedUrls,
129
+ uiUrl: url,
130
+ });
131
+ } catch (e) { console.error(e.message); }
132
+ lineReader.prompt();
133
+ } else if (command === "disconnect") {
134
+ try {
135
+ await manifestCommands.disconnect(positional[0], positional[1], {
136
+ connectedUrls,
137
+ uiUrl: url,
138
+ });
139
+ } catch (e) { console.error(e.message); }
140
+ lineReader.prompt();
141
+ } else if (command === "manifest") {
142
+ const sub = positional[0];
143
+ try {
144
+ if (sub === "save") {
145
+ manifestCommands.save(undefined, undefined, {});
146
+ } else if (sub === "clean") {
147
+ await manifestCommands.clean();
148
+ } else {
149
+ console.log(" Usage: manifest <save|clean>");
150
+ }
151
+ } catch (e) { console.error(e.message); }
152
+ lineReader.prompt();
153
+ } else if (command === "probe") {
154
+ try {
155
+ await probe(positional[0], positional[1], { json: flags.json, headers: flags.headers, uiUrl: url });
156
+ } catch (e) { console.error(e.message); }
157
+ lineReader.prompt();
42
158
  } else if (command === "open") {
43
159
  openBrowser(url, positional[0], positional[1]);
44
160
  lineReader.prompt();
161
+ } else if (command === "help") {
162
+ cli.showHelp(false);
163
+ lineReader.prompt();
45
164
  } else {
46
165
  lineReader.prompt();
47
166
  }
48
167
  };
49
168
 
50
169
  lineReader.prompt();
51
- lineReader.on("line", handleInput);
170
+ lineReader.on("line", async (input) => {
171
+ const trimmed = input.trim();
172
+ if (trimmed && CLI) {
173
+ try { await CLI.saveHistory(trimmed); } catch {}
174
+ }
175
+ handleInput(trimmed);
176
+ });
52
177
  lineReader.on("close", () => process.exit(0));
53
178
  return lineReader;
54
179
  };
package/cli/utils/cli.js CHANGED
@@ -8,28 +8,44 @@ const HELP_TEXT = `
8
8
  start [port] Launch SystemView UI (default port 3000)
9
9
  test <projectCode> [namespace] Run saved tests for a project
10
10
  list [projectCode] [namespace] List projects, services, or tests
11
- logs [projectCode] [namespace] View log entries
12
- connect <serviceId> <url> Register a service and write manifest
13
- connect Re-probe all services in existing manifest
14
- probe <ServiceId.Module.method> [args] Call a method ad-hoc
11
+ logs [projectCode] [namespace] Stream log entries from connected services
12
+ unsubscribe Stop streaming logs (keeps log file) [alias: stoplogs]
13
+ flush Wipe the log file and stop streaming [alias: clearlogs]
14
+ connect [url|projectCode] Connect a service URL, reconnect a stored project, or connect all
15
+ connect <url> --manifest Connect via plugin manifest — registers under real projectCode
16
+ disconnect [projectCode] [serviceId] Remove a project or service from the UI store
17
+ manifest clean Re-probe manifest entries, remove stale ones
18
+ probe <ServiceId.Module.method> [args] Call a service method ad-hoc
15
19
  open [projectCode] [namespace] Open the browser UI
16
- shutdown [port] Stop a running SystemView instance
20
+ shutdown [port] Stop a running SystemView instance [aliases: exit, stop, q]
17
21
 
18
22
  Flags:
19
23
  --version Print version and exit
24
+ -d, --debug Verbose debug output
20
25
  --json Output results as JSON (for agents/CI)
21
- --verbose test: full results and args for all phases; list: expand to show methods and test titles
22
- --manifest <path> Path to manifest file (default: ./systemview.manifest.json)
23
- --header "Name: Value" Extra request header (repeatable; overrides manifest.probeHeaders)
26
+ --verbose test: full results and args for all phases; list: expand hierarchy
27
+ --manifest connect: use plugin manifest to get real projectCode
28
+ --manifest <path> probe: path to manifest file (default: ./systemview.manifest.json)
29
+ --header "Name: Value" Extra request header (repeatable)
24
30
  --skip <pattern> Exclude tests matching pattern (repeatable)
25
31
  --bail Stop after first failure
26
32
  --dry-run Print which tests would run without executing
27
33
  --phase <before|main|events|after> Run only specified phase(s), comma-separated
28
34
  --index <n> Run only action at index n within each phase (0-based)
29
- --level <trace|info|warn|error|debug> logs: filter by level
30
- --limit <n> logs: max entries to return (default 50)
31
- --follow logs: stream new entries as they arrive
32
- --clear logs: wipe the log file
35
+ --level <trace|log|warn|error|debug> logs: filter by level
36
+ --limit <n> logs: max entries to show with --current (default 50)
37
+ --current logs: show existing entries (use --follow to also stream)
38
+ -f, --follow logs: keep streaming after --current
39
+ --clear logs: wipe log store then stream
40
+ --filter <field=value> logs: AND filter on a field (repeatable); field can be a dot path
41
+ --filter has=<field> → only entries where field is present
42
+ --filter missing=<field> → only entries where field is absent
43
+ --or <field=value> logs: OR filter on a field (repeatable)
44
+ --include <field> logs: include extra field as a column (repeatable)
45
+ --save [path] logs: append streamed entries to a local snapshot file
46
+ --saved logs: read from local snapshot instead of live service
47
+ --save-limit <n> logs: max entries to keep in snapshot (default 500)
48
+ --force connect: re-probe even if already connected
33
49
 
34
50
  Examples:
35
51
  systemview start
@@ -40,8 +56,19 @@ const HELP_TEXT = `
40
56
  systemview list
41
57
  systemview list buAPI
42
58
  systemview list buAPI --verbose
43
- systemview list buAPI signUp
44
- systemview connect ProfilesService http://localhost:4100/bu/api/profiles
59
+ systemview logs buAPI
60
+ systemview logs buAPI --current --limit 20
61
+ systemview logs buAPI --current --follow
62
+ systemview logs buAPI --filter level=error
63
+ systemview logs buAPI --filter has=log.userId
64
+ systemview logs buAPI --filter missing=error --include log
65
+ systemview logs buAPI --save
66
+ systemview logs buAPI --saved
67
+ systemview connect http://localhost:4100/bu/api/profiles
68
+ systemview connect http://localhost:4100/bu/api/profiles --manifest
69
+ systemview connect buAPI
70
+ systemview disconnect buAPI
71
+ systemview disconnect buAPI ProfilesService
45
72
  systemview probe ProfilesService.Users.getUser '{"userId":"123"}'
46
73
  systemview open buAPI signUp
47
74
  systemview test buAPI --header "X-Api-Key: secret"
@@ -49,7 +76,7 @@ const HELP_TEXT = `
49
76
 
50
77
  const rawArgs = process.argv.slice(2);
51
78
 
52
- const flagValueArgs = ["--manifest", "--header", "--skip", "--phase", "--index", "--level", "--limit", "--follow", "--filter", "--or"];
79
+ const flagValueArgs = ["--manifest", "--header", "--skip", "--phase", "--index", "--level", "--limit", "--follow", "--filter", "--or", "--include", "--save", "--save-limit"];
53
80
 
54
81
  const flags = {
55
82
  json: rawArgs.includes("--json"),
@@ -89,6 +116,7 @@ const flags = {
89
116
  return isNaN(val) ? undefined : val;
90
117
  })(),
91
118
  follow: rawArgs.includes("--follow") || rawArgs.includes("-f"),
119
+ current: rawArgs.includes("--current"),
92
120
  filter: (() => {
93
121
  const result = [];
94
122
  rawArgs.forEach((a, i) => { if (a === "--filter" && rawArgs[i + 1]) result.push(rawArgs[i + 1]); });
@@ -99,7 +127,26 @@ const flags = {
99
127
  rawArgs.forEach((a, i) => { if (a === "--or" && rawArgs[i + 1]) result.push(rawArgs[i + 1]); });
100
128
  return result;
101
129
  })(),
130
+ include: (() => {
131
+ const result = [];
132
+ rawArgs.forEach((a, i) => { if (a === "--include" && rawArgs[i + 1]) result.push(rawArgs[i + 1]); });
133
+ return result;
134
+ })(),
102
135
  clear: rawArgs.includes("--clear"),
136
+ force: rawArgs.includes("--force"),
137
+ save: (() => {
138
+ const i = rawArgs.indexOf("--save");
139
+ if (i === -1) return false;
140
+ const next = rawArgs[i + 1];
141
+ return (next && !next.startsWith("-")) ? next : true;
142
+ })(),
143
+ saved: rawArgs.includes("--saved"),
144
+ saveLimit: (() => {
145
+ const i = rawArgs.indexOf("--save-limit");
146
+ if (i === -1) return 500;
147
+ const val = parseInt(rawArgs[i + 1], 10);
148
+ return isNaN(val) ? 500 : val;
149
+ })(),
103
150
  headers: (() => {
104
151
  const result = {};
105
152
  rawArgs.forEach((a, i) => {
@@ -124,8 +171,8 @@ const input = rawArgs.filter((a, i) => {
124
171
  module.exports = {
125
172
  input,
126
173
  flags,
127
- showHelp() {
174
+ showHelp(exit = true) {
128
175
  console.log(HELP_TEXT);
129
- process.exit(0);
176
+ if (exit) process.exit(0);
130
177
  },
131
178
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "systemview",
3
3
  "description": "A documentation and testing suite for SystemLynx",
4
- "version": "2.0.0",
4
+ "version": "2.2.0",
5
5
  "license": "UNLICENSED",
6
6
  "bin": {
7
7
  "systemview": "cli/index.js"
@@ -16,7 +16,7 @@
16
16
  "chalk": "^4.1.2",
17
17
  "express": "^4.18.2",
18
18
  "moment": "^2.29.1",
19
- "systemlynx": "^2.0.0",
19
+ "systemlynx": "^2.1.0",
20
20
  "systemlynx-client": "^2.0.0",
21
21
  "web-vitals": "^0.2.4"
22
22
  },
@@ -1,15 +0,0 @@
1
- @font-face{font-family:SF Mono;src:url(/static/media/FontsFree-Net-SFMono-Regular.9647425ef282c28529df.ttf) format("ttf")}@font-face{font-family:Malkor;src:url(/static/media/Malkor-Regular.f55d6a829566789554a5.ttf) format("ttf")}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;margin:0}code{font-family:SF Mono,system-ui,source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}
2
-
3
- /*!
4
- * Bootstrap Grid v4.0.0 (https://getbootstrap.com)
5
- * Copyright 2011-2018 The Bootstrap Authors
6
- * Copyright 2011-2018 Twitter, Inc.
7
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
8
- */.textbox{flex:1 1}.textbox input,.textbox textarea{font-size:15px;padding:7px;width:100%}.link{color:#282d33;font-size:16px;text-decoration:none}.link:hover{text-decoration:underline}.expandable-list{text-indent:10px}.expandable-list__items--hidden{display:none}.expandable-list__button{display:flex;text-align:left}.expandable-list__button a,.expandable-list__button>span{align-items:center;display:flex}.list{color:#343542;display:flex;flex-direction:column;line-height:20px;padding:6px 0 6px 6px;text-align:left;text-indent:29px}.expandable-icon{cursor:pointer;font-family:sans-serif;font-size:11px}.server-module__methods{display:flex}.server-module__methods--selected-true{background:linear-gradient(90deg,#deefe8 69%,#fff);background:linear-gradient(90deg,#d8d7e9 69%,#fff);border-radius:5px 2px 2px 5px;font-weight:700}.server-module__methods--selected-true>a{color:#575fc1}.server-module__docs-icon{display:inline;margin-left:auto}.server-module__docs-icon img{width:23px!important}.server-module__name--plugin a{color:#4caf50;font-weight:700}.system-nav{max-height:100vh;overflow:auto;padding:3rem 1rem}.system-nav__section{margin:21px 10px}.system-nav__object-title{display:inline}.system-nav__service-url{color:#3f51b5;color:#607d8b!important;display:block!important;font-size:13px;overflow:hidden;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;width:230px}.system-nav__link{margin-left:3px;width:100%}.system-nav__link--selected-true{background:linear-gradient(90deg,#deefe8 69%,#fff);background:linear-gradient(90deg,#d8d7e9 69%,#fff);border-radius:5px 2px 2px 5px}.system-nav__link--selected-true>a{color:#575fc1!important;font-weight:700}.doc-tabs{border-bottom:2px solid #e0e0e8;display:flex;gap:0;margin-bottom:16px}.doc-tab{background:none;border:none;border-bottom:2px solid #0000;color:#888;cursor:pointer;font-size:13px;margin-bottom:-2px;padding:6px 16px}.doc-tab--active{border-bottom-color:#6886ba;color:#6886ba;font-weight:600}.doc-tab:hover:not(.doc-tab--active){color:#555}.inline-logs{max-height:calc(100vh - 220px);overflow-y:auto}.inline-logs__empty{color:#aaa;font-size:13px;padding:16px 4px}.documentation-view{color:#000;padding-top:2rem}.documentation-view__parameter{color:#3dceac;font-weight:700}.documentation-view__data-table{margin-bottom:30px}.documentation-view__title{align-items:flex-start;color:#454c69;display:flex;margin-left:4px}.documentation-view__parentheses{font-size:26px}.description-box{width:100%}.description-box__textbox{background:#fff;border:none;border-bottom:1px solid #07625a;border-radius:2px;color:#000;font-size:13px;font-size:15px;font-weight:500;max-width:100%;min-height:70vh;min-width:100%;outline:none;padding:38px;resize:none}.edit-box{background:#fff;border:2px solid #f1f1f1;border-radius:13px;max-height:80vh;overflow:scroll;width:100%}.edit-box--read:hover{border:2px dashed #8b97ba;cursor:pointer}.edit-box__main{border:2px dashed #0000}.edit-box__form--hidden,.edit-box__main--hidden{display:none}.edit-box__button{display:flex;flex-direction:row;justify-content:flex-end;padding:6px 15px;width:100%}.button{background:linear-gradient(180deg,#f9f9f9 5%,#e9e9e9);border:1px solid;border-radius:3px;color:#666;cursor:pointer;display:inline-block;font-family:Arial;font-size:15px;font-weight:700;margin:4px 10px;padding:6px 24px;text-decoration:none;text-shadow:0 1px 0 #fff}.button:hover{background:linear-gradient(180deg,#e9e9e9 5%,#f9f9f9);background-color:#e9e9e9}.button:active{position:relative;top:1px}.clear-button{align-self:flex-end;background:#607d8b;border-radius:17px;color:#fff;font-weight:600;padding:0 8px}.clear-button>img{padding-top:2px;width:13px}.title{color:#0e886b;font-family:sans-serif;font-size:28px;position:relative}.markdown{background-color:#fff;font-size:15px;line-height:1.6;padding:30px}.markdown>:first-child{margin-top:0!important}.markdown>:last-child{margin-bottom:0!important}.markdown a{color:#4183c4}.markdown a.absent{color:#c00}.markdown a.anchor{bottom:0;cursor:pointer;display:block;left:0;margin-left:-30px;padding-left:30px;position:absolute;top:0}.markdown h1,.markdown h2,.markdown h3,.markdown h4,.markdown h5,.markdown h6{-webkit-font-smoothing:antialiased;color:#5960b6!important;cursor:text;font-weight:700;margin:20px 0 10px;padding:0;position:relative}.markdown h1:hover a.anchor,.markdown h2:hover a.anchor,.markdown h3:hover a.anchor,.markdown h4:hover a.anchor,.markdown h5:hover a.anchor,.markdown h6:hover a.anchor{text-decoration:none}.markdown h1 code,.markdown h1 tt,.markdown h2 code,.markdown h2 tt,.markdown h3 code,.markdown h3 tt,.markdown h4 code,.markdown h4 tt,.markdown h5 code,.markdown h5 tt,.markdown h6 code,.markdown h6 tt{font-size:inherit}.markdown h1{color:#000;font-size:28px}.markdown h2{border-bottom:1px solid #ccc;color:#000;font-size:24px}.markdown h3{font-size:18px}.markdown h4{font-size:16px}.markdown h5,.markdown h6{font-size:14px}.markdown h6{color:#777}.markdown blockquote,.markdown dl,.markdown li,.markdown ol,.markdown p,.markdown pre,.markdown table,.markdown ul{margin:15px 0}.markdown hr{border:0;border-bottom:1px solid;color:#ccc;height:4px;padding:0}.markdown a:first-child h1,.markdown a:first-child h2,.markdown a:first-child h3,.markdown a:first-child h4,.markdown a:first-child h5,.markdown a:first-child h6,.markdown>h1:first-child,.markdown>h1:first-child+h2,.markdown>h2:first-child,.markdown>h3:first-child,.markdown>h4:first-child,.markdown>h5:first-child,.markdown>h6:first-child{margin-top:0;padding-top:0}.markdown h1 p,.markdown h2 p,.markdown h3 p,.markdown h4 p,.markdown h5 p,.markdown h6 p{margin-top:0}.markdown li p.first{display:inline-block}.markdown li{margin:0}.markdown ol,.markdown ul{padding-left:30px}.markdown ol :first-child,.markdown ul :first-child{margin-top:0}.markdown dl{padding:0}.markdown dl dt{font-size:14px;font-style:italic;font-weight:700;margin:15px 0 5px;padding:0}.markdown dl dt:first-child{padding:0}.markdown dl dt>:first-child{margin-top:0}.markdown dl dt>:last-child{margin-bottom:0}.markdown dl dd{margin:0 0 15px;padding:0 15px}.markdown dl dd>:first-child{margin-top:0}.markdown dl dd>:last-child{margin-bottom:0}.markdown blockquote{border-left:3px solid #c3c3c3;color:#777;font-size:14px;text-indent:8px}.markdown blockquote>:first-child{margin-top:0}.markdown blockquote>:last-child{margin-bottom:0}.markdown table{border-collapse:collapse;padding:0}.markdown table tr{background-color:#fff;border-top:1px solid #ccc;margin:0;padding:0}.markdown table tr:nth-child(2n){background-color:#f8f8f8}.markdown table tr th{font-weight:700}.markdown table tr td,.markdown table tr th{border:1px solid #ccc;margin:0;padding:6px 13px}.markdown table tr td :first-child,.markdown table tr th :first-child{margin-top:0}.markdown table tr td :last-child,.markdown table tr th :last-child{margin-bottom:0}.markdown img{max-width:100%}.markdown span.frame,.markdown span.frame>span{display:block;overflow:hidden}.markdown span.frame>span{border:1px solid #ddd;float:left;margin:13px 0 0;padding:7px;width:auto}.markdown span.frame span img{display:block;float:left}.markdown span.frame span span{clear:both;color:#333;display:block;padding:5px 0 0}.markdown span.align-center{clear:both;display:block;overflow:hidden}.markdown span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown span.align-center span img{margin:0 auto;text-align:center}.markdown span.align-right{clear:both;display:block;overflow:hidden}.markdown span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown span.align-right span img{margin:0;text-align:right}.markdown span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown span.float-left span{margin:13px 0 0}.markdown span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown code,.markdown tt{background-color:#efeeee;border-radius:3px;color:#3f51b5;font-size:14px;margin:0 2px;padding:2px 3px;white-space:nowrap}.markdown pre code{background:#0000;border:none;margin:0;padding:0;white-space:pre}.markdown .highlight pre,.markdown pre{font-size:13px}.markdown pre code,.markdown pre tt{background-color:#0000;border:none}.markdown sup{font-size:.83em;line-height:0;vertical-align:super}.markdown *{-webkit-print-color-adjust:exact}@media screen and (min-width:914px){.markdown body{margin:0 auto;width:854px}}@media print{.markdown pre,.markdown table{page-break-inside:avoid}.markdown pre{word-wrap:break-word}}.expandable-section{margin-bottom:6px;width:100%}.expandable-section__items--hidden{display:none}.expandable-section__title{display:flex;margin-bottom:7px;position:relative}.expandable-section__title__btn{cursor:pointer}.expandable-section__btn--hide-true{visibility:hidden}.test-caption{align-items:center;display:flex;font-family:sans-serif;font-size:16px;font-weight:400;margin:0 4px;padding:0 8px;width:100%}.test-caption__title{color:#0d8065}.test-caption__description-input{flex:1 1;padding-left:5px}.test-caption__description-input input{background:#e9e9e9;border:none;border-radius:41px;color:#5a77e5;color:#676767;font-size:16px;line-height:19px;text-indent:10px;text-overflow:ellipsis;width:104%}.test-caption__description-input input::placeholder{color:#bebebe;font-style:italic;font-weight:400}.test-caption__description-input--visible-false{display:none}.auto-complete{display:inline;display:initial;position:relative}.auto-complete__suggestions{box-shadow:1px 3px 4px #736c6c;display:grid;font-family:monospace;left:0;max-height:365px;overflow-y:auto;position:absolute;top:19px;z-index:1}.auto-complete__suggestion{background:#fff;cursor:pointer;display:inline-flex;padding:6px 7px;width:calc(300px + 1rem)}.auto-complete__suggestion--active,.auto-complete__suggestion:hover:not(.auto-complete__suggestion--empty){background-color:#cbcbff;background-color:#dadaed;color:#5960b6;color:#3f495d;font-weight:100;font-weight:700}.auto-complete__suggestion--empty{justify-content:center}.json-text-box{position:relative}.json-text-box__textbox{border:1px solid #8ea8eb;margin-top:6px;max-width:100%;min-height:100px;min-width:100%}.json-text-box__btn-container{position:absolute;right:1px;top:9px}.json-text-box__btn{border-radius:1px;cursor:pointer;font-family:system-ui;font-weight:500;margin-left:4px;padding:2px 6px}.json-text-box__btn:active{position:relative;top:1px}.json-text-box__btn--is-json-true{background:#25d0a8;color:#fff}.json-text-box__btn--is-json-false{background:#cfc2c2;color:#8c3c3c;text-decoration:line-through}.json-text-box__btn--cancel{background:#ff6b6b;color:#fff}.type-selector{-webkit-appearance:none;appearance:none;background:none;border:none;color:blue;cursor:pointer;font-family:SF Mono,monospace;outline:none}.switch{display:inline-block;height:33px;position:relative;width:60px}.switch input{height:0;opacity:0;width:0}.slider{background-color:#a78686;background-color:#6e6e78;bottom:0;cursor:pointer;left:0;right:0;top:0}.slider,.slider:before{position:absolute;transition:.4s}.slider:before{background-color:#fff;bottom:4px;content:"";height:26px;left:4px;width:26px}input:checked+.slider{background-color:#29ab8c}input:focus+.slider{box-shadow:0 0 1px #29ab8c}input:checked+.slider:before{transform:translateX(26px)}.slider.round{border-radius:34px}.slider.round:before{border-radius:50%}.args{display:inline;width:100%}.args__add-btn{background:#5a77e5;border-radius:21px;color:#fff;font-family:monospace;font-size:16px;font-weight:700;line-height:16px;margin:0 5px;padding:0 3px}.args__data{background:#cecee3;border-radius:7px;margin:2px;padding:11px;position:relative}.args__data__delete-btn{border-radius:0 7px 0 0!important;padding:0 5px 1px!important;right:0!important;top:0!important}.args__name{white-space:nowrap}.args__name__text{background:#5a77e5;border-radius:100px;color:#fff;cursor:pointer;display:inline-block;font-weight:700;margin:1px 0;padding:2px 10px}.args__from-container{display:flex}.args__form--is12{margin-top:10px}.args__form__undefined{color:#5a5a5a}.args__form__input{background:none;border:none;border-bottom:1px solid #9797d1;font-family:monospace;font-size:14px}.args__form__input--number{color:#9741ed;font-weight:700}.args__form__input--string,.args__form__input--target{color:#cf5f2e;font-style:italic;height:31px;max-height:320px;max-width:100%;min-height:31px;min-width:100%;text-indent:5px}.args__form__input--target{color:#009572;font-weight:700}.args__form__input--date{color:#9f4040;margin-top:6px}.args__form__value--boolean{font-weight:700;position:relative;top:7px}.args__form__value--boolean--true{color:#2eab8c;margin-right:5px}.args__form__value--boolean--false{color:#d52518}.args__quote{color:#209cff;font-size:21px;line-height:1px}.args__type{text-align:center}.args__name-display{display:inline-block;margin-right:4px}.args__expand-btn{color:#0035cf61;text-shadow:1px 1px 1px #cfcfcf}.args__add-json-btn{border-radius:2px;color:#0d8065;padding:2px 3px;position:absolute;right:0;top:6px}.args__add-json-btn:hover{text-decoration:underline}.args__json-txb--show-false{display:none!important}.args__value{padding:14px}.args__value--hide{display:none}.args__value__number{color:#9741ed;font-weight:700}.args__value__string{color:#cf5f2e;white-space:pre-line}.args__value__date{color:#9f4040}.args__value__undefined{color:#5a5a5a}.args__value__object{padding:0}.args__value__boolean{font-weight:700}.args__value__boolean--true{color:#207844}.args__value__boolean--false{color:#cf1515}.scratchpad{--text-length:auto;overflow-wrap:anywhere;width:100%}.scratchpad__test-data-container{position:relative;width:100%}.scratchpad__test-data{background:#e9e9e9;border-radius:5px 5px 0 0;padding:25px 15px}.scratchpad__test-data__parentheses{font-size:19px}.scratchpad__response-data{background:#fff;border-left:1px solid #e9e9e9;border-right:1px solid #e9e9e9;padding:12px 15px;position:relative}.scratchpad__response-data--visible-false{display:none}.scratchpad__response-data__clear-btn{color:#c50000;font-family:sans-serif;position:absolute;right:9px;top:5px}.scratchpad__response-value{align-items:flex-start;color:#223a95;color:#a954ff;display:flex;flex-wrap:wrap;font-family:FS Mono,monospace;font-weight:500;margin:5px 0 0 5px}.scratchpad__response-value span.collapsed-icon{left:7px;position:relative;top:2px}.scratchpad__response-type{color:#a954ff;font-size:15px;font-weight:700}.scratchpad__btn-container{position:absolute;right:4px;top:4px}.scratchpad__btn-container>span{margin:0 5px}.scratchpad__run-test-btn{cursor:pointer}.scratchpad__test-method-input{background:none;border:none;color:#223a95;font-family:SF Mono,monospace;font-size:17px;max-width:100%;text-indent:0;text-overflow:clip;width:var(--text-length)}.scratchpad__test-method-input:focus{background:#fff}.scratchpad__eval-btn{bottom:3px;color:#3f51b5;font-size:15px;font-weight:700;position:absolute;right:7px}.doc-icon{display:inline-flex;vertical-align:middle}.doc-icon img{width:20px}.delete-button{background:#fff;border-radius:40px;color:#c50000;font-family:system-ui;font-weight:300;padding:6px 3px}.error-message{color:#ff5722;font-family:monospace;padding:4px 25px;word-break:break-word}.error-message__message-container{background:#ededed}.error-message__message{background:#ededed;border-radius:5px;padding:6px 23px}.error-message__namespace{color:#b136c6;font-weight:600}.error-message__expected{color:#0b8b22;font-weight:700}.validation-input{display:flex;margin:3px 0}.validation-input__input,.validation-input__selector{background:none;border:none;font-family:monospace;font-size:14px}.validation-input__selector{-webkit-appearance:none;appearance:none;border-right:none;color:#009688;cursor:pointer;font-weight:700;outline:none;padding:3px;text-indent:5px}.validation-input__selector:hover{background:#b3c1e8;border-radius:33px}.validation-input__input{color:#0d8065;outline:none;padding:4px}.validation-input__value--boolean{font-weight:700;position:relative;top:7px}.validation-input__value--boolean--true{color:#207844}.validation-input__value--boolean--false{color:#cf1515}input:-webkit-autofill{border:3px solid blue}input:autofill{border:3px solid blue}.count{background:#dcdcdc;border-radius:12px;color:#777!important;font-size:14px;font-weight:700;margin-left:5px;padding:0 9px}.count,.count__stat{display:inline-block}.count__stat{padding:3px 0}.count__error{background:#ffc4b1;color:#f44336!important}.count__caution{color:#bcb047!important}.count__passed{background:#6fc878;color:#fff!important}.test-container__title-section{display:flex;font-size:16px;margin:0 4px;padding:0 8px;width:100%}.test-container__test-description-input{flex:1 1}.test-container__test-description-input input{background:none;border:none;color:#5a77e5;font-weight:700;text-overflow:ellipsis;width:105%}.multi-test-section{width:100%}.multi-test-section__test-data{background:#dadada;border-radius:5px;padding:12px 15px;width:100%}.multi-test-section__add-btn{background:#cecee3;border-radius:21px;color:#5960b6;font-family:monospace;font-size:16px;font-weight:700;padding:0 4px}.evaluations{background:#25d0a8;background:#76b1f7;background:#ced8f4;border-radius:0 0 4px 4px;font-family:monospace;overflow-wrap:anywhere;padding:12px 18px}.evaluations--visible-false{display:none}.evaluations__row{margin:4px;padding:8px 5px}.evaluations__title{--type-width:auto;margin-left:10px;width:100%}.evaluations__title select{width:var(--type-width)}.evaluations__input>input{background:#a5ffda;border:1px solid #383836;box-sizing:border-box;margin:8px 0;padding:6px 9px;width:100%}.evaluations__input--visible-false{display:none}.evaluations__add-validation-btn{background:#5a77ca;border-radius:16px;color:#fff;font-weight:700;padding:0 5px 1px}.evaluations__validation-container{display:inline-grid;margin-left:4px}.evaluations__add-btn-container{display:inline-grid}.evaluations__validation{border-bottom:1px solid #9797d1}.evaluations__validation__delete-btn{color:#6565a1;display:inline;font-family:system-ui;font-size:15px;margin-left:6px}.evaluations__validation__delete-btn:hover{color:#c30f0f}.evaluations__validation__input{display:inline-flex}.evaluations__type-error-msg{display:none}.evaluations__type-error-msg--true{display:inline;display:initial}.evaluations--error-true,.evaluations--error-true>*{color:#cd4343;font-weight:700}.evaluations__total{color:gray}.evaluations__checkbox{cursor:pointer}.evaluations__index-button{align-items:center;display:flex;flex-direction:row}.evaluations__index-button.btn:hover{color:#2326fe;color:#ff5722;color:#c717e5;color:#1131df;font-weight:700}.evaluations__index-button--indexed-true{font-weight:700}.evaluations__namespace{display:inline-flex;flex-wrap:wrap}.evaluations__index-input{height:15px;width:45px}.evaluations__brackets{align-self:baseline;color:#000;font-size:14px;font-weight:700}.evaluations__index-checkbox{cursor:pointer}.evaluations__random{align-self:baseline;color:#2b9b2c;font-style:italic;font-weight:700}.evaluations__clear-error{color:gray;font-size:16px}.evaluations__clear-error:hover{color:#000}.evaluations__add-index-btn{color:#2776ff;font-size:16px;font-weight:700}.test__buttons{justify-content:space-between;margin-bottom:3px}.test__buttons>span>span{margin:0 5px}.test__buttons>span{background:#e9e9e9;border-radius:41px;font-family:Helvetica,arial,sans-serif;margin-right:3px;padding:2px 11px}.test-panel{font-size:14px;max-height:100vh;overflow:auto;padding:2rem 1rem}.test-panel__section{margin-bottom:6px}.test-panel__section>section{width:100%}.test-panel__error-message{align-items:center;background:#e4d554;background:#d4d4d4;color:#c02a2a;display:flex;font-weight:700;padding:2px 8px!important}.test-panel__error-message--hide-true{opacity:0}.test-panel__error-message--error-false{color:green}.save-icon{height:16px}.test-summary{border:1px solid #dfdfdf;border-bottom:1px solid #e8e8e8;border-top:none;padding:8px 5px}.test-summary:last-child{border-bottom:1px solid #dfdfdf}.test-summary__actions{display:flex;font-weight:300;padding:3px 0}.test-summary__action-text{flex:1 1}.test-summary__method{align-items:flex-start;color:#223a95;color:#a954ff;display:flex;flex-wrap:wrap;font-family:FS Mono,monospace;font-weight:500;margin-bottom:10px;margin-left:10px}.test-summary__method span.collapsed-icon{left:7px;position:relative;top:2px}.test-summary__validations .expandable-icon{align-self:flex-end;margin-left:3px}.test-summary__failed-validations{color:#ff5722;font-family:monospace;padding:4px 25px}.test-summary__failed-validations--namespace{color:#a954ff;font-weight:700}.test-summary__header{align-items:center;display:flex}.test-summary__parameter{background:#fff;border:1px solid #fce8ff;border-radius:4px;display:inline-flex}.test-summary__comma{align-self:flex-end;color:green;font-size:17;font-weight:700;margin-right:3px}.test-summary__parentheses{align-self:flex-end;font-size:15px;font-weight:bolder;position:relative;top:-1px}.test-summary__results{color:#a954ff;font-weight:700}.test-summary__arrow{margin-right:10px}.test-summary__caption--Main{font-weight:700}.test-saved-section{border-top:1px solid #e9e9e9;padding-top:10px;width:100%}.test-saved-section__test-data{background:#dcdcdc;padding:12px 15px;width:100%}.test-saved-section__test-container{margin:5px 0}.test-saved-section__test-row{align-items:center;background:#e9e9e9;border:1px solid #e9e9e9;display:flex;padding:4px 5px}.test-saved-section__test-index{color:#4caf50;color:#3d3d3d;flex:1 1;font-size:14px;font-weight:600;padding:0 8px}.test-saved-section__test-title{color:#236382;flex:5 1}.test-saved-section__buttons{align-items:center;display:flex;flex:2 1;flex-direction:row;justify-content:space-around}.test-saved-section__top-buttons{flex:none;width:77px}.test-saved-section__clear-button{align-self:flex-end;background:#607d8b;border-radius:17px;color:#fff;font-weight:600;padding:0 8px}.test-saved-section__clear-button>img{padding-top:2px;width:13px}.test-saved-section__delete-prompt{color:#c02a2a;font-weight:700}.test-saved-section__delete-btn{background:gray;border-radius:4px;color:#fff;margin:0 5px;padding:0 6px}.test-saved-section__delete-btn--yes:hover{color:#c02a2a}.react-json-view{font-size:14px}.status-indicator{align-items:center;align-self:center;background:#22886b;background:#292936;border-radius:41px;color:#e9e9e9;color:#3bcaa1;display:flex;font-family:sans-serif;font-weight:500;font-weight:700;line-height:19px;margin:0 5px;padding:3px 0;text-align:center;text-overflow:ellipsis}.status-indicator__title{padding:0 13px}.status-indicator__clear-button{border-radius:0 40px 40px 0;color:#fff;display:flex!important;font-family:system-ui;padding:0 11px 1px 0}.status-indicator__clear-button:hover{color:#f10;font-weight:300}
9
- /*!
10
- * Bootstrap Grid v4.0.0 (https://getbootstrap.com)
11
- * Copyright 2011-2018 The Bootstrap Authors
12
- * Copyright 2011-2018 Twitter, Inc.
13
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
14
- */html{-ms-overflow-style:scrollbar;box-sizing:border-box}*,:after,:before{box-sizing:inherit}.container{margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px;width:100%}@media(min-width:576px){.container{max-width:540px}}@media(min-width:768px){.container{max-width:720px}}@media(min-width:992px){.container{max-width:960px}}@media(min-width:1200px){.container{max-width:1140px}}.container-fluid{margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px;width:100%}.row{display:flex;flex-wrap:wrap;margin-left:-15px;margin-right:-15px}.no-gutters{margin-left:0;margin-right:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-left:0;padding-right:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{min-height:1px;padding-left:15px;padding-right:15px;position:relative;width:100%}.col{flex-basis:0;flex-grow:1;max-width:100%}.col-auto{flex:0 0 auto;max-width:none;width:auto}.col-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.3333333333%}.offset-2{margin-left:16.6666666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.3333333333%}.offset-5{margin-left:41.6666666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.3333333333%}.offset-8{margin-left:66.6666666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.3333333333%}.offset-11{margin-left:91.6666666667%}@media(min-width:576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.col-sm-auto{flex:0 0 auto;max-width:none;width:auto}.col-sm-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-sm-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-sm-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-sm-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-sm-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.3333333333%}.offset-sm-2{margin-left:16.6666666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.3333333333%}.offset-sm-5{margin-left:41.6666666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.3333333333%}.offset-sm-8{margin-left:66.6666666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.3333333333%}.offset-sm-11{margin-left:91.6666666667%}}@media(min-width:768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.col-md-auto{flex:0 0 auto;max-width:none;width:auto}.col-md-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-md-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-md-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-md-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-md-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.3333333333%}.offset-md-2{margin-left:16.6666666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.3333333333%}.offset-md-5{margin-left:41.6666666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.3333333333%}.offset-md-8{margin-left:66.6666666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.3333333333%}.offset-md-11{margin-left:91.6666666667%}}@media(min-width:992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.col-lg-auto{flex:0 0 auto;max-width:none;width:auto}.col-lg-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-lg-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-lg-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-lg-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-lg-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.3333333333%}.offset-lg-2{margin-left:16.6666666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.3333333333%}.offset-lg-5{margin-left:41.6666666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.3333333333%}.offset-lg-8{margin-left:66.6666666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.3333333333%}.offset-lg-11{margin-left:91.6666666667%}}@media(min-width:1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.col-xl-auto{flex:0 0 auto;max-width:none;width:auto}.col-xl-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-xl-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-xl-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-xl-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-xl-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.3333333333%}.offset-xl-2{margin-left:16.6666666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.3333333333%}.offset-xl-5{margin-left:41.6666666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.3333333333%}.offset-xl-8{margin-left:66.6666666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.3333333333%}.offset-xl-11{margin-left:91.6666666667%}}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}@media(min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}}@media(min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}}@media(min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}}@media(min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}@media(min-width:576px){.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}}@media(min-width:768px){.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}}@media(min-width:992px){.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}}@media(min-width:1200px){.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}}.system-viewer{background:#f5f5f5;height:100vh;overflow:hidden;padding-top:61px}.system-viewer>div{max-width:100vw}.btn{cursor:pointer;display:inline-block}.btn:active{transform:translateY(-2px)}.delete-btn{background:#fff;border-radius:0 40px 40px 0;color:#c50000;font-family:system-ui;font-weight:300;opacity:0;padding:0 6px 2px;position:absolute;right:-4px;top:1px}.delete-btn:hover{opacity:1}.page-header{align-items:center;background:#fff;border-bottom:1px solid #9494b7;display:flex;height:62px;justify-content:center;padding:0 35px;position:absolute;top:0;width:100vw}.logs-nav-link{background:#f4f6fb;border:1.5px solid #b0bed8;border-radius:20px;color:#6886ba;font-family:Malkor;font-size:16px;padding:5px 16px;position:absolute;right:35px;text-decoration:none;transition:background .15s,border-color .15s}.logs-nav-link:hover{background:#e4eaf8;border-color:#6886ba}.scroll-buffer{height:20vh}::-webkit-input-placeholder{font-style:italic}:-moz-placeholder,::-moz-placeholder{font-style:italic}:-ms-input-placeholder{font-style:italic}@keyframes bounce{to{transform:scale(1.2)}}.logs-table{border-collapse:collapse;font-family:monospace;font-size:13px;width:100%}.log-th{background:#f5f5fa;border-bottom:2px solid #e0e0e8;color:#888;font-size:11px;font-weight:700;letter-spacing:.04em;padding:7px 10px;text-align:left;text-transform:uppercase;white-space:nowrap}.log-th--time{min-width:80px}.log-th--project,.log-th--service{min-width:130px}.log-th--method{min-width:160px}.log-th--level{min-width:70px}.log-th--traceid{color:#9494b7;flex:0 0 110px;font-size:10px;letter-spacing:.02em}.log-th--dynamic{color:#7070a0;flex:0 0 120px;font-style:normal;font-weight:600;letter-spacing:0;overflow:hidden;text-overflow:ellipsis;text-transform:none;white-space:nowrap}.log-row{border-bottom:1px solid #ebebf0}.log-row--dim .log-level{opacity:.55}.log-row--clickable{cursor:pointer}.log-row--clickable:hover .log-cell{background:#e4e4f4}.log-row--active .log-cell{background:#d0d0ec!important;opacity:1!important}.log-row--expanded{background:#f7f7fb;cursor:pointer}.log-row--expanded:hover{background:#eeeef8}.log-cell{padding:5px 10px;vertical-align:top;white-space:nowrap}.log-cell--time{color:#888;min-width:80px}.log-cell--project,.log-cell--service{color:#57a;min-width:130px}.log-cell--method{color:#333;min-width:160px}.log-cell--level{min-width:70px}.log-cell--msg{color:#555;max-width:360px;white-space:normal}.log-cell--traceid{color:#9494b7;flex:0 0 110px;font-family:monospace;font-size:10px}.log-cell--dynamic{color:#7070a0;flex:0 0 100px;font-size:11px;overflow:hidden;text-overflow:ellipsis}.log-level{border-radius:3px;display:inline-block;font-size:11px;font-weight:600;padding:1px 6px;text-transform:uppercase}.log-level--dim{background:#eee;color:#999}.log-level--info,.log-level--log{background:#e8f0fe;color:#3367d6}.log-level--warn{background:#fef9e7;color:#d4a017}.log-level--error{background:#fdecea;color:#c62828}.log-level--debug{background:#e8f5e9;color:#2e7d32}.log-duration{color:#999;font-size:11px;margin-left:6px}.log-cell--detail{padding:0!important}.log-data-wrap{position:relative}.log-data-copy{background:#ffffff1f;border:1px solid #fff3;border-radius:4px;color:#cdd6f4;cursor:pointer;font-size:11px;padding:2px 8px;position:absolute;right:14px;top:10px;z-index:1}.log-data-copy:hover{background:#ffffff38}.log-data{background:#1e1e2e;border-radius:4px;color:#cdd6f4;font-family:monospace;font-size:12px;margin:0;max-height:60vh;overflow:auto;padding:10px 14px}.logs-page{background:#f5f5f5;display:flex;flex-direction:column;height:100vh;overflow:hidden;padding-top:61px}.logs-back{background:none;border:none;color:#6886ba;cursor:pointer;font-size:13px;left:20px;padding:0;position:absolute}.logs-back:hover{text-decoration:underline}.logs-title{margin-right:10px}.logs-heading,.logs-title{color:#6886ba;font-family:Malkor;font-size:28px;text-shadow:1px 1px 2px #d6cbca}.logs-heading{margin-left:10px}.logs-sticky-area{background:#fff;border-bottom:1px solid #e0e0e8;flex-shrink:0}.logs-toolbar{align-items:center;background:#fff;border-bottom:1px solid #f0f0f0;display:flex;gap:10px;padding:10px 20px}.logs-toolbar select{background:#fafafa;border:1px solid #ccc;border-radius:4px;color:#333;font-size:13px;padding:4px 8px}.logs-count{color:#999}.logs-count,.logs-quick-filter{font-family:monospace;font-size:12px}.logs-quick-filter{align-items:center;background:#e8f0fe;border:1px solid #6886ba;border-radius:12px;color:#3367d6;cursor:pointer;display:inline-flex;gap:5px;padding:3px 10px}.logs-quick-filter:hover{background:#d0e0fc}.logs-quick-filter--or{background:#e8f5e9;border-color:#4caf50;color:#2e7d32}.logs-quick-filter--or:hover{background:#d4edda}.logs-filter-op{color:#9494b7;font-size:11px;font-weight:700;padding:0 2px}.logs-filter-op,.logs-filter-paren{font-family:monospace;-webkit-user-select:none;user-select:none}.logs-filter-paren{color:#b0b0cc;font-size:13px;font-weight:400}.logs-clear-btn{background:#fff;border:1px solid #d9534f;border-radius:4px;color:#d9534f;cursor:pointer;font-size:13px;margin-left:auto;padding:4px 14px}.logs-clear-btn:hover{background:#d9534f;color:#fff}.dashboard{background:#fff;padding:10px 20px}.dashboard__panels{align-items:flex-start;display:flex;flex-wrap:nowrap;gap:12px;overflow-x:auto;padding-bottom:6px}.dashboard__add{align-self:flex-start;background:#f0f0f8;border:1px dashed #9494b7;border-radius:4px;color:#6886ba;cursor:pointer;font-size:12px;margin-top:2px;padding:5px 12px}.dashboard__add:hover{background:#e4e4f0}.dash-panel{background:#fafafa;border:1px solid #e0e0e8;border-radius:6px;display:flex;flex-direction:column;max-width:260px;min-width:180px;overflow:hidden}.dash-panel.dash-panel--wide{max-width:420px}.dash-panel__header{align-items:center;background:#f0f0f8;color:#555;display:flex;flex-shrink:0;font-size:12px;font-weight:600;gap:6px;justify-content:space-between;padding:7px 10px}.dash-panel__field-select{background:#0000;border:none;color:#444;cursor:pointer;flex:1 1;font-size:12px;min-width:0}.dash-panel__remove{background:none;border:none;color:#aaa;cursor:pointer;flex-shrink:0;font-size:14px;line-height:1;padding:0 2px}.dash-panel__remove:hover{color:#c62828}.dash-panel__body{max-height:150px;overflow-y:auto}.dash-panel__table{border-collapse:collapse;font-family:monospace;font-size:12px;width:100%}.dash-panel__row{cursor:pointer}.dash-panel__row:hover td{background:#e8e8f4}.dash-panel__row--active td{background:#d0d8f0}.dash-panel__row--faded{cursor:default;opacity:.35;pointer-events:none}.dash-panel__val{color:#333;max-width:180px;overflow:hidden;padding:4px 10px;text-overflow:ellipsis;white-space:nowrap}.dash-panel__count{color:#6886ba;font-weight:600;padding:4px 10px 4px 0;text-align:right;white-space:nowrap}.dash-panel__empty{color:#bbb;font-size:12px;margin:0;padding:8px 10px}.field-analyzer__crumbs{flex:1 1;font-size:11px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.field-analyzer__crumb{color:#6886ba;cursor:pointer;font-weight:600}.field-analyzer__crumb:hover{text-decoration:underline}.field-analyzer__crumb--leaf{color:#777;cursor:default;font-weight:400}.field-analyzer__crumb--leaf:hover{text-decoration:none}.field-analyzer__drill{color:#9494b7;font-size:10px}.field-analyzer__search{background:#0000;border:none;color:#333;font-family:monospace;font-size:12px;outline:none;padding:0;width:100%}.field-analyzer__search::placeholder{color:#bbb;font-style:italic}.field-analyzer__apply{color:#6886ba;cursor:pointer;font-weight:700}.field-analyzer__apply:hover{color:#3367d6}.field-analyzer__conj{align-items:center;background:#e8f0fe;border:1px solid;border-radius:3px;color:#3367d6;cursor:pointer;display:flex;flex-shrink:0;font-family:monospace;font-size:11px;font-weight:700;height:20px;justify-content:center;padding:0;width:20px}.field-analyzer__conj:hover{opacity:.75}.field-analyzer__conj--or{background:#e8f5e9;color:#2e7d32}.dash-panel__row--search{background:#f7f7fb;border-bottom:1px solid #e0e0e8}.dash-panel__row--search:hover td{background:#f0f0f8}.dash-panel__row--date .dash-panel__val--date-label{color:#9494b7;font-size:11px;font-style:italic;width:36px}.dash-panel__row--date .dash-panel__val--date-input{padding:3px 6px}.dash-panel__row--date .dash-panel__val--date-input input[type=datetime-local]{background:#f7f7fb;border:1px solid #d0d0e8;border-radius:3px;color:#333;font-family:monospace;font-size:11px;padding:2px 4px;width:100%}.dash-panel__row--date .dash-panel__val--date-input input[type=datetime-local]:focus{border-color:#9494b7;outline:none}.dash-panel__row--presence{cursor:pointer}.dash-panel__row--presence .dash-panel__val--presence{color:#9494b7;font-size:11px;font-style:italic}.dash-panel__row--presence:hover td{background:#eeeef8}.dash-panel__row--divider td{background:#e0e0e8;height:1px;padding:0}.logs-table-header{display:flex;width:100%}.logs-table-header .log-th{flex:1 1}.logs-body{flex:1 1;overflow-x:auto;overflow-y:auto;padding-bottom:40px}.logs-body .log-row{display:flex;width:100%}.logs-body .log-row--expanded{display:block}.logs-body .log-cell{flex:1 1}.logs-empty{color:#aaa;font-size:14px;padding:24px 20px}
15
- /*# sourceMappingURL=main.ff3d0549.css.map*/