@appland/appmap 3.200.0 → 3.201.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/CHANGELOG.md +17 -0
- package/built/cli.js +2 -0
- package/built/cli.js.map +1 -1
- package/built/cmds/sanitize/sanitize.js +121 -0
- package/built/cmds/sanitize/sanitize.js.map +1 -0
- package/built/cmds/trim/trim.js +21 -1
- package/built/cmds/trim/trim.js.map +1 -1
- package/built/diffArchive/ChangeAnalysis.js +2 -20
- package/built/diffArchive/ChangeAnalysis.js.map +1 -1
- package/built/html/query-ui/tailwind.css +1 -1
- package/built/lib/sanitizeAppMap.js +304 -0
- package/built/lib/sanitizeAppMap.js.map +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,20 @@
|
|
|
1
|
+
# [@appland/appmap-v3.201.0](https://github.com/getappmap/appmap-js/compare/@appland/appmap-v3.200.0...@appland/appmap-v3.201.0) (2026-07-11)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* **cli:** sanitize eventUpdates too ([0cc5b94](https://github.com/getappmap/appmap-js/commit/0cc5b94f2c0828a93b1a5b85e2c8da5ec6e77dc6))
|
|
7
|
+
* **cli:** sanitize exits non-zero when any file in the batch is skipped ([77ce035](https://github.com/getappmap/appmap-js/commit/77ce035efdb748f08ca8a0186cf93bc2b27e6cfc))
|
|
8
|
+
* **cli:** the masking walk sanitizes metadata itself ([e280c56](https://github.com/getappmap/appmap-js/commit/e280c5601aad1a7968e75942325105f5905edffe))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
* **cli:** add 'appmap sanitize' — equality-preserving value tokenization ([4b2cd63](https://github.com/getappmap/appmap-js/commit/4b2cd63d26dc2d171dbcdb4115bd5c2729b60dc6))
|
|
14
|
+
* **cli:** normalize AppMaps as the first step of sanitize ([5a414d9](https://github.com/getappmap/appmap-js/commit/5a414d98d7c8a1f3c3b17a2cbd482408c4e75a0b))
|
|
15
|
+
* **cli:** normalize HTTP routes in sanitize instead of tokenizing ([f76cd70](https://github.com/getappmap/appmap-js/commit/f76cd7085caa2449628d2dc142ae46a0a46f9f7f))
|
|
16
|
+
* **cli:** provenance markers for sanitize and trim ([1157abc](https://github.com/getappmap/appmap-js/commit/1157abc9687261227b3046ac3b5a2ba50f3396ec))
|
|
17
|
+
|
|
1
18
|
# [@appland/appmap-v3.200.0](https://github.com/getappmap/appmap-js/compare/@appland/appmap-v3.199.2...@appland/appmap-v3.200.0) (2026-07-03)
|
|
2
19
|
|
|
3
20
|
|
package/built/cli.js
CHANGED
|
@@ -47,6 +47,7 @@ const status_1 = __importDefault(require("./cmds/agentInstaller/status"));
|
|
|
47
47
|
const openapi_1 = __importDefault(require("./cmds/openapi/openapi"));
|
|
48
48
|
const prune_1 = __importDefault(require("./cmds/prune/prune"));
|
|
49
49
|
const trim_1 = __importDefault(require("./cmds/trim/trim"));
|
|
50
|
+
const sanitize_1 = __importDefault(require("./cmds/sanitize/sanitize"));
|
|
50
51
|
const record_1 = __importDefault(require("./cmds/record/record"));
|
|
51
52
|
const handleWorkingDirectory_1 = require("./lib/handleWorkingDirectory");
|
|
52
53
|
const locateAppMapDir_1 = require("./lib/locateAppMapDir");
|
|
@@ -164,6 +165,7 @@ yargs(process.argv.slice(2))
|
|
|
164
165
|
.command(SequenceDiagramDiffCommand)
|
|
165
166
|
.command(prune_1.default)
|
|
166
167
|
.command(trim_1.default)
|
|
168
|
+
.command(sanitize_1.default)
|
|
167
169
|
.command(ArchiveCommand)
|
|
168
170
|
.command(RestoreCommand)
|
|
169
171
|
.command(CompareCommand)
|
package/built/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const models_1 = require("@appland/models");
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const handleWorkingDirectory_1 = require("../../lib/handleWorkingDirectory");
|
|
7
|
+
const sanitizeAppMap_1 = require("../../lib/sanitizeAppMap");
|
|
8
|
+
const utils_1 = require("../../utils");
|
|
9
|
+
// Build the allowlist: built-ins plus values the user curated. Exact whole-value
|
|
10
|
+
// matches only — an allowed word inside a larger value keeps nothing.
|
|
11
|
+
function buildAllowList(allow, allowFile) {
|
|
12
|
+
const values = new Set(sanitizeAppMap_1.BUILTIN_ALLOW);
|
|
13
|
+
for (const value of allow)
|
|
14
|
+
values.add(value);
|
|
15
|
+
if (allowFile) {
|
|
16
|
+
for (const line of (0, fs_1.readFileSync)(allowFile, 'utf8').split('\n')) {
|
|
17
|
+
// Skip blanks and comment lines; a literal leading '#' value can be
|
|
18
|
+
// passed with --allow instead.
|
|
19
|
+
const value = line.replace(/\r$/, '');
|
|
20
|
+
if (value && !value.startsWith('#'))
|
|
21
|
+
values.add(value);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return values;
|
|
25
|
+
}
|
|
26
|
+
exports.default = {
|
|
27
|
+
command: 'sanitize <files..>',
|
|
28
|
+
describe: 'Replace captured values in AppMaps with per-file equality-preserving tokens, so the files cannot carry secrets',
|
|
29
|
+
builder: (args) => {
|
|
30
|
+
args.positional('files', {
|
|
31
|
+
describe: 'AppMap file(s) to sanitize',
|
|
32
|
+
type: 'string',
|
|
33
|
+
});
|
|
34
|
+
args.option('allow', {
|
|
35
|
+
describe: 'Value to keep verbatim (repeatable). Exact whole-value match; meant for small public vocabularies such as state or role names',
|
|
36
|
+
type: 'array',
|
|
37
|
+
default: [],
|
|
38
|
+
});
|
|
39
|
+
args.option('allow-file', {
|
|
40
|
+
describe: 'File of values to keep verbatim, one per line (# comments and blank lines skipped)',
|
|
41
|
+
type: 'string',
|
|
42
|
+
});
|
|
43
|
+
args.option('output-dir', {
|
|
44
|
+
describe: 'Write sanitized AppMaps here (default: overwrite each file in place)',
|
|
45
|
+
type: 'string',
|
|
46
|
+
alias: 'o',
|
|
47
|
+
});
|
|
48
|
+
args.option('directory', {
|
|
49
|
+
describe: 'Working directory for the command',
|
|
50
|
+
type: 'string',
|
|
51
|
+
alias: 'd',
|
|
52
|
+
});
|
|
53
|
+
return args;
|
|
54
|
+
},
|
|
55
|
+
handler: async (argv) => {
|
|
56
|
+
var _a;
|
|
57
|
+
(0, handleWorkingDirectory_1.handleWorkingDirectory)(argv.directory);
|
|
58
|
+
const allow = buildAllowList(argv.allow.map(String), argv.allowFile);
|
|
59
|
+
const files = argv.files;
|
|
60
|
+
if (argv.outputDir)
|
|
61
|
+
(0, fs_1.mkdirSync)(argv.outputDir, { recursive: true });
|
|
62
|
+
const userAllow = [...allow].filter((v) => !sanitizeAppMap_1.BUILTIN_ALLOW.has(v)).sort();
|
|
63
|
+
let failed = 0;
|
|
64
|
+
for (const file of files) {
|
|
65
|
+
let before;
|
|
66
|
+
let sanitized;
|
|
67
|
+
let distinct;
|
|
68
|
+
try {
|
|
69
|
+
before = (0, fs_1.readFileSync)(file, 'utf8');
|
|
70
|
+
const appmap = JSON.parse(before);
|
|
71
|
+
// The metadata.sanitized marker is the file's provenance: skip when
|
|
72
|
+
// this exact CLI version already sanitized it with these options.
|
|
73
|
+
const prior = (_a = appmap === null || appmap === void 0 ? void 0 : appmap.metadata) === null || _a === void 0 ? void 0 : _a.sanitized;
|
|
74
|
+
if (prior &&
|
|
75
|
+
prior.version === sanitizeAppMap_1.CLI_VERSION &&
|
|
76
|
+
JSON.stringify(prior.allow_values) === JSON.stringify(userAllow)) {
|
|
77
|
+
console.warn(`sanitize ${file}: already sanitized (v${sanitizeAppMap_1.CLI_VERSION}), skipping`);
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
// Masking is one-way: allowing a value now cannot restore it if an
|
|
81
|
+
// earlier run already masked it.
|
|
82
|
+
if (prior) {
|
|
83
|
+
const restored = userAllow.filter((v) => !prior.allow_values.includes(v));
|
|
84
|
+
if (restored.length > 0)
|
|
85
|
+
console.warn(`sanitize ${file}: ${restored.length} allow value(s) were not allowed on the ` +
|
|
86
|
+
`first run; already-masked values cannot be restored (re-record to loosen)`);
|
|
87
|
+
}
|
|
88
|
+
// Normalize first — the same transform every AppMap viewer applies on
|
|
89
|
+
// load: eventUpdates merged into their events, event ids re-indexed,
|
|
90
|
+
// unreturned calls balanced, and credentials stripped from
|
|
91
|
+
// metadata.git.repository. Masking then runs over the canonical form.
|
|
92
|
+
const normalized = JSON.parse(JSON.stringify((0, models_1.buildAppMap)().source(appmap).normalize().build()));
|
|
93
|
+
// A fresh masker per file: the token namespace is per-AppMap by
|
|
94
|
+
// design, so values never correlate across files.
|
|
95
|
+
const masker = new sanitizeAppMap_1.ValueMasker(allow);
|
|
96
|
+
sanitized = JSON.stringify((0, sanitizeAppMap_1.sanitizeAppMap)(normalized, masker));
|
|
97
|
+
distinct = masker.distinctCount;
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
// Skip an unreadable/malformed file rather than aborting: one bad file
|
|
101
|
+
// in a batch must not stop the rest or leave earlier files half-done.
|
|
102
|
+
failed += 1;
|
|
103
|
+
console.warn(`sanitize ${file}: skipped (${error.message})`);
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
const outputPath = argv.outputDir ? (0, path_1.join)(argv.outputDir, (0, path_1.basename)(file)) : file;
|
|
107
|
+
// Write atomically (temp file in the same dir, then rename) so an
|
|
108
|
+
// interrupted or failed write never leaves a partial AppMap in place.
|
|
109
|
+
await (0, utils_1.writeFileAtomic)((0, path_1.dirname)(outputPath), (0, path_1.basename)(outputPath), 'sanitize.tmp', sanitized);
|
|
110
|
+
console.warn(`sanitize ${file}: ${distinct} distinct value(s) tokenized, ${before.length} -> ${sanitized.length} bytes`);
|
|
111
|
+
}
|
|
112
|
+
// The exit code is the contract: 0 means every file is now sanitized. A
|
|
113
|
+
// skipped file keeps its original, possibly secret-bearing contents, so a
|
|
114
|
+
// partial batch must not look like success. All files are still processed
|
|
115
|
+
// before failing; callers who want best-effort can append `|| true`.
|
|
116
|
+
if (failed > 0) {
|
|
117
|
+
throw new Error(`sanitize: ${failed} of ${files.length} file(s) failed to process and remain unsanitized`);
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
//# sourceMappingURL=sanitize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../../../src/cmds/sanitize/sanitize.ts"],"names":[],"mappings":"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"}
|
package/built/cmds/trim/trim.js
CHANGED
|
@@ -6,6 +6,8 @@ const path_1 = require("path");
|
|
|
6
6
|
const handleWorkingDirectory_1 = require("../../lib/handleWorkingDirectory");
|
|
7
7
|
const truncateStructValue_1 = require("../../lib/truncateStructValue");
|
|
8
8
|
const utils_1 = require("../../utils");
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
10
|
+
const CLI_VERSION = require('../../../package.json').version;
|
|
9
11
|
function trimSlot(slot, budget) {
|
|
10
12
|
if (slot && typeof slot.value === 'string') {
|
|
11
13
|
slot.value = (0, truncateStructValue_1.truncateStructValue)(slot.value, budget);
|
|
@@ -56,6 +58,7 @@ exports.default = {
|
|
|
56
58
|
return args;
|
|
57
59
|
},
|
|
58
60
|
handler: async (argv) => {
|
|
61
|
+
var _a, _b;
|
|
59
62
|
(0, handleWorkingDirectory_1.handleWorkingDirectory)(argv.directory);
|
|
60
63
|
// --max-length is a hard cap on every captured value string: it sets the
|
|
61
64
|
// flat cap and, so the flag means what it says, lowers the per-field and id
|
|
@@ -78,7 +81,24 @@ exports.default = {
|
|
|
78
81
|
let trimmed;
|
|
79
82
|
try {
|
|
80
83
|
before = (0, fs_1.readFileSync)(file, 'utf8');
|
|
81
|
-
|
|
84
|
+
const appmap = JSON.parse(before);
|
|
85
|
+
// metadata.trimmed is the file's provenance: skip when this exact CLI
|
|
86
|
+
// version already trimmed it to this cap. Truncation is one-way, so a
|
|
87
|
+
// re-run records the smaller of the two caps and can never grow values.
|
|
88
|
+
const prior = (_a = appmap.metadata) === null || _a === void 0 ? void 0 : _a.trimmed;
|
|
89
|
+
if (prior && prior.version === CLI_VERSION && prior.max_length === maxLength) {
|
|
90
|
+
console.warn(`trim ${file}: already trimmed (v${CLI_VERSION}), skipping`);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (prior && maxLength > prior.max_length)
|
|
94
|
+
console.warn(`trim ${file}: already trimmed to ${prior.max_length}; a larger cap cannot ` +
|
|
95
|
+
`restore truncated values (re-record to grow them)`);
|
|
96
|
+
trimAppMap(appmap, budget);
|
|
97
|
+
appmap.metadata = Object.assign(Object.assign({}, ((_b = appmap.metadata) !== null && _b !== void 0 ? _b : {})), { trimmed: {
|
|
98
|
+
version: CLI_VERSION,
|
|
99
|
+
max_length: prior ? Math.min(prior.max_length, maxLength) : maxLength,
|
|
100
|
+
} });
|
|
101
|
+
trimmed = JSON.stringify(appmap);
|
|
82
102
|
}
|
|
83
103
|
catch (error) {
|
|
84
104
|
// Skip an unreadable/malformed file rather than aborting: one bad file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trim.js","sourceRoot":"","sources":["../../../src/cmds/trim/trim.ts"],"names":[],"mappings":";;;AAAA,2BAA6C;AAC7C,+BAA+C;AAG/C,6EAA0E;AAC1E,uEAA6F;AAE7F,uCAA8C;
|
|
1
|
+
{"version":3,"file":"trim.js","sourceRoot":"","sources":["../../../src/cmds/trim/trim.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ const path_1 = require("path");
|
|
|
9
9
|
const async_1 = require("async");
|
|
10
10
|
const assert_1 = __importDefault(require("assert"));
|
|
11
11
|
const console_1 = require("console");
|
|
12
|
+
const scanner_1 = require("@appland/scanner");
|
|
12
13
|
const Paths_1 = require("../diffArchive/Paths");
|
|
13
14
|
const Digests_1 = require("../diffArchive/Digests");
|
|
14
15
|
const RevisionName_1 = require("../diffArchive/RevisionName");
|
|
@@ -204,26 +205,7 @@ class ChangeAnalysisImpl {
|
|
|
204
205
|
(0, assert_1.default)(baseManifest && headManifest && paths);
|
|
205
206
|
const baseFindings = await (0, loadFindings_1.default)(paths, RevisionName_1.RevisionName.Base, baseManifest.appMapDir);
|
|
206
207
|
const headFindings = await (0, loadFindings_1.default)(paths, RevisionName_1.RevisionName.Head, headManifest.appMapDir);
|
|
207
|
-
|
|
208
|
-
let resolvedFindings;
|
|
209
|
-
const baseFindingHashes = baseFindings.reduce((memo, finding) => (memo.add(finding.hash_v2), memo), new Set());
|
|
210
|
-
const headFindingHashes = headFindings.reduce((memo, finding) => (memo.add(finding.hash_v2), memo), new Set());
|
|
211
|
-
const newFindingHashes = [...headFindingHashes].filter((hash) => !baseFindingHashes.has(hash));
|
|
212
|
-
const resolvedFindingHashes = [...baseFindingHashes].filter((hash) => !headFindingHashes.has(hash));
|
|
213
|
-
newFindings = Object.values(headFindings
|
|
214
|
-
.filter((finding) => newFindingHashes.includes(finding.hash_v2))
|
|
215
|
-
.reduce((memo, finding) => {
|
|
216
|
-
if (!(finding.hash_v2 in memo))
|
|
217
|
-
memo[finding.hash_v2] = finding;
|
|
218
|
-
return memo;
|
|
219
|
-
}, {}));
|
|
220
|
-
resolvedFindings = Object.values(baseFindings
|
|
221
|
-
.filter((finding) => resolvedFindingHashes.includes(finding.hash_v2))
|
|
222
|
-
.reduce((memo, finding) => {
|
|
223
|
-
if (!(finding.hash_v2 in memo))
|
|
224
|
-
memo[finding.hash_v2] = finding;
|
|
225
|
-
return memo;
|
|
226
|
-
}, {}));
|
|
208
|
+
const { newFindings, resolvedFindings } = (0, scanner_1.diffFindings)(baseFindings, headFindings);
|
|
227
209
|
this.findingDiff = {
|
|
228
210
|
new: newFindings,
|
|
229
211
|
resolved: resolvedFindings,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChangeAnalysis.js","sourceRoot":"","sources":["../../src/diffArchive/ChangeAnalysis.ts"],"names":[],"mappings":";;;;;;AAAA,0CAA2C;AAC3C,+BAA4B;AAC5B,iCAA8B;AAC9B,oDAA4B;AAC5B,qCAA+B;
|
|
1
|
+
{"version":3,"file":"ChangeAnalysis.js","sourceRoot":"","sources":["../../src/diffArchive/ChangeAnalysis.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,0.5);--tw-ring-offset-shadow:0 0 transparent;--tw-ring-shadow:0 0 transparent;--tw-shadow:0 0 transparent;--tw-shadow-colored:0 0 transparent;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,0.5);--tw-ring-offset-shadow:0 0 transparent;--tw-ring-shadow:0 0 transparent;--tw-shadow:0 0 transparent;--tw-shadow-colored:0 0 transparent;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.right-2{right:.5rem}.top-1\/2{top:50%}.mx-2{margin-left:.5rem;margin-right:.5rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.-mb-px{margin-bottom:-1px}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.mr-2{margin-right:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-3{height:.75rem}.h-full{height:100%}.max-h-96{max-height:24rem}.min-h-screen{min-height:100vh}.w-12{width:3rem}.w-14{width:3.5rem}.w-20{width:5rem}.w-24{width:6rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-full{width:100%}.min-w-0{min-width:0}.flex-1{flex:1 1 0%}.flex-none{flex:none}.shrink{flex-shrink:1}.-translate-y-1\/2{--tw-translate-y:-50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0.125rem*var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0.25rem*var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0.5rem*var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0.75rem*var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.border{border-width:1px}.border-0{border-width:0}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-t{border-top-width:1px}.border-blue-500{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity,1))}.border-blue-700{--tw-border-opacity:1;border-color:rgb(29 78 216/var(--tw-border-opacity,1))}.border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.border-gray-800{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity,1))}.border-gray-900{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity,1))}.border-green-700{--tw-border-opacity:1;border-color:rgb(21 128 61/var(--tw-border-opacity,1))}.border-orange-700{--tw-border-opacity:1;border-color:rgb(194 65 12/var(--tw-border-opacity,1))}.border-purple-700{--tw-border-opacity:1;border-color:rgb(126 34 206/var(--tw-border-opacity,1))}.border-purple-900\/40{border-color:rgba(88,28,135,.4)}.border-red-700{--tw-border-opacity:1;border-color:rgb(185 28 28/var(--tw-border-opacity,1))}.border-transparent{border-color:transparent}.border-yellow-700{--tw-border-opacity:1;border-color:rgb(161 98 7/var(--tw-border-opacity,1))}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.bg-blue-900\/40{background-color:rgba(30,58,138,.4)}.bg-blue-900\/50{background-color:rgba(30,58,138,.5)}.bg-blue-900\/60{background-color:rgba(30,58,138,.6)}.bg-blue-950{--tw-bg-opacity:1;background-color:rgb(23 37 84/var(--tw-bg-opacity,1))}.bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.bg-gray-800\/50{background-color:rgba(31,41,55,.5)}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.bg-gray-950{--tw-bg-opacity:1;background-color:rgb(3 7 18/var(--tw-bg-opacity,1))}.bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))}.bg-green-900\/40{background-color:rgba(20,83,45,.4)}.bg-green-900\/50{background-color:rgba(20,83,45,.5)}.bg-green-900\/60{background-color:rgba(20,83,45,.6)}.bg-green-950{--tw-bg-opacity:1;background-color:rgb(5 46 22/var(--tw-bg-opacity,1))}.bg-orange-500{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity,1))}.bg-orange-900\/60{background-color:rgba(124,45,18,.6)}.bg-orange-950{--tw-bg-opacity:1;background-color:rgb(67 20 7/var(--tw-bg-opacity,1))}.bg-purple-900\/50{background-color:rgba(88,28,135,.5)}.bg-purple-900\/60{background-color:rgba(88,28,135,.6)}.bg-purple-950{--tw-bg-opacity:1;background-color:rgb(59 7 100/var(--tw-bg-opacity,1))}.bg-purple-950\/30{background-color:rgba(59,7,100,.3)}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.bg-red-900\/50{background-color:rgba(127,29,29,.5)}.bg-red-900\/60{background-color:rgba(127,29,29,.6)}.bg-red-950{--tw-bg-opacity:1;background-color:rgb(69 10 10/var(--tw-bg-opacity,1))}.bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.bg-yellow-900\/50{background-color:rgba(113,63,18,.5)}.bg-yellow-950{--tw-bg-opacity:1;background-color:rgb(66 32 6/var(--tw-bg-opacity,1))}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.pb-1{padding-bottom:.25rem}.pb-2{padding-bottom:.5rem}.pr-20{padding-right:5rem}.pt-2{padding-top:.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.leading-relaxed{line-height:1.625}.tracking-wide{letter-spacing:.025em}.text-blue-200{--tw-text-opacity:1;color:rgb(191 219 254/var(--tw-text-opacity,1))}.text-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.text-green-200{--tw-text-opacity:1;color:rgb(187 247 208/var(--tw-text-opacity,1))}.text-green-300{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity,1))}.text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity,1))}.text-orange-200{--tw-text-opacity:1;color:rgb(254 215 170/var(--tw-text-opacity,1))}.text-orange-300{--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity,1))}.text-orange-400{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity,1))}.text-purple-200{--tw-text-opacity:1;color:rgb(233 213 255/var(--tw-text-opacity,1))}.text-purple-300{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity,1))}.text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity,1))}.text-red-200{--tw-text-opacity:1;color:rgb(254 202 202/var(--tw-text-opacity,1))}.text-red-300{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity,1))}.text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-yellow-200{--tw-text-opacity:1;color:rgb(254 240 138/var(--tw-text-opacity,1))}.text-yellow-400{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity,1))}.text-yellow-500\/80{color:rgba(234,179,8,.8)}.underline{-webkit-text-decoration-line:underline;text-decoration-line:underline}.no-underline{-webkit-text-decoration-line:none;text-decoration-line:none}.decoration-gray-600{-webkit-text-decoration-color:#4b5563;text-decoration-color:#4b5563}.decoration-dotted{-webkit-text-decoration-style:dotted;text-decoration-style:dotted}.placeholder-gray-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(107 114 128/var(--tw-placeholder-opacity,1))}.placeholder-gray-500::placeholder{--tw-placeholder-opacity:1;color:rgb(107 114 128/var(--tw-placeholder-opacity,1))}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px -1px rgba(0,0,0,0.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 transparent)}.ring-blue-500{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.\!filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.last\:border-b-0:last-child{border-bottom-width:0}.hover\:border-gray-500:hover{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity,1))}.hover\:border-gray-600:hover{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.hover\:bg-blue-500:hover{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.hover\:bg-gray-800\/50:hover{background-color:rgba(31,41,55,.5)}.hover\:bg-gray-800\/60:hover{background-color:rgba(31,41,55,.6)}.hover\:text-blue-300:hover{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.hover\:text-gray-200:hover{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.hover\:text-purple-300:hover{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity,1))}.hover\:underline:hover{-webkit-text-decoration-line:underline;text-decoration-line:underline}.hover\:decoration-blue-400:hover{-webkit-text-decoration-color:#60a5fa;text-decoration-color:#60a5fa}.hover\:ring-1:hover{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 transparent)}.hover\:ring-gray-500:hover{--tw-ring-opacity:1;--tw-ring-color:rgb(107 114 128/var(--tw-ring-opacity,1))}.focus\:border-blue-500:focus{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity,1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 transparent)}.focus\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.disabled\:opacity-50:disabled{opacity:.5}@media (min-width:768px){.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}@media (min-width:1024px){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1280px){.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}
|
|
1
|
+
*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,0.5);--tw-ring-offset-shadow:0 0 transparent;--tw-ring-shadow:0 0 transparent;--tw-shadow:0 0 transparent;--tw-shadow-colored:0 0 transparent;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,0.5);--tw-ring-offset-shadow:0 0 transparent;--tw-ring-shadow:0 0 transparent;--tw-shadow:0 0 transparent;--tw-shadow-colored:0 0 transparent;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.right-2{right:.5rem}.top-1\/2{top:50%}.mx-2{margin-left:.5rem;margin-right:.5rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.-mb-px{margin-bottom:-1px}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.mr-2{margin-right:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-3{height:.75rem}.h-full{height:100%}.max-h-96{max-height:24rem}.min-h-screen{min-height:100vh}.w-12{width:3rem}.w-14{width:3.5rem}.w-20{width:5rem}.w-24{width:6rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-full{width:100%}.min-w-0{min-width:0}.flex-1{flex:1 1 0%}.flex-none{flex:none}.shrink{flex-shrink:1}.grow{flex-grow:1}.-translate-y-1\/2{--tw-translate-y:-50%}.-translate-y-1\/2,.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0.125rem*var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0.25rem*var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0.5rem*var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0.75rem*var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.border{border-width:1px}.border-0{border-width:0}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-t{border-top-width:1px}.border-blue-500{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity,1))}.border-blue-700{--tw-border-opacity:1;border-color:rgb(29 78 216/var(--tw-border-opacity,1))}.border-gray-600{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.border-gray-800{--tw-border-opacity:1;border-color:rgb(31 41 55/var(--tw-border-opacity,1))}.border-gray-900{--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity,1))}.border-green-700{--tw-border-opacity:1;border-color:rgb(21 128 61/var(--tw-border-opacity,1))}.border-orange-700{--tw-border-opacity:1;border-color:rgb(194 65 12/var(--tw-border-opacity,1))}.border-purple-700{--tw-border-opacity:1;border-color:rgb(126 34 206/var(--tw-border-opacity,1))}.border-purple-900\/40{border-color:rgba(88,28,135,.4)}.border-red-700{--tw-border-opacity:1;border-color:rgb(185 28 28/var(--tw-border-opacity,1))}.border-transparent{border-color:transparent}.border-yellow-700{--tw-border-opacity:1;border-color:rgb(161 98 7/var(--tw-border-opacity,1))}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(37 99 235/var(--tw-bg-opacity,1))}.bg-blue-900\/40{background-color:rgba(30,58,138,.4)}.bg-blue-900\/50{background-color:rgba(30,58,138,.5)}.bg-blue-900\/60{background-color:rgba(30,58,138,.6)}.bg-blue-950{--tw-bg-opacity:1;background-color:rgb(23 37 84/var(--tw-bg-opacity,1))}.bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.bg-gray-800\/50{background-color:rgba(31,41,55,.5)}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.bg-gray-950{--tw-bg-opacity:1;background-color:rgb(3 7 18/var(--tw-bg-opacity,1))}.bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))}.bg-green-900\/40{background-color:rgba(20,83,45,.4)}.bg-green-900\/50{background-color:rgba(20,83,45,.5)}.bg-green-900\/60{background-color:rgba(20,83,45,.6)}.bg-green-950{--tw-bg-opacity:1;background-color:rgb(5 46 22/var(--tw-bg-opacity,1))}.bg-orange-500{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity,1))}.bg-orange-900\/60{background-color:rgba(124,45,18,.6)}.bg-orange-950{--tw-bg-opacity:1;background-color:rgb(67 20 7/var(--tw-bg-opacity,1))}.bg-purple-900\/50{background-color:rgba(88,28,135,.5)}.bg-purple-900\/60{background-color:rgba(88,28,135,.6)}.bg-purple-950{--tw-bg-opacity:1;background-color:rgb(59 7 100/var(--tw-bg-opacity,1))}.bg-purple-950\/30{background-color:rgba(59,7,100,.3)}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.bg-red-900\/50{background-color:rgba(127,29,29,.5)}.bg-red-900\/60{background-color:rgba(127,29,29,.6)}.bg-red-950{--tw-bg-opacity:1;background-color:rgb(69 10 10/var(--tw-bg-opacity,1))}.bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.bg-yellow-900\/50{background-color:rgba(113,63,18,.5)}.bg-yellow-950{--tw-bg-opacity:1;background-color:rgb(66 32 6/var(--tw-bg-opacity,1))}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.pb-1{padding-bottom:.25rem}.pb-2{padding-bottom:.5rem}.pr-20{padding-right:5rem}.pt-2{padding-top:.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.leading-relaxed{line-height:1.625}.tracking-wide{letter-spacing:.025em}.text-blue-200{--tw-text-opacity:1;color:rgb(191 219 254/var(--tw-text-opacity,1))}.text-blue-300{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.text-blue-400{--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity,1))}.text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.text-gray-200{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.text-green-200{--tw-text-opacity:1;color:rgb(187 247 208/var(--tw-text-opacity,1))}.text-green-300{--tw-text-opacity:1;color:rgb(134 239 172/var(--tw-text-opacity,1))}.text-green-400{--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity,1))}.text-orange-200{--tw-text-opacity:1;color:rgb(254 215 170/var(--tw-text-opacity,1))}.text-orange-300{--tw-text-opacity:1;color:rgb(253 186 116/var(--tw-text-opacity,1))}.text-orange-400{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity,1))}.text-purple-200{--tw-text-opacity:1;color:rgb(233 213 255/var(--tw-text-opacity,1))}.text-purple-300{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity,1))}.text-purple-400{--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity,1))}.text-red-200{--tw-text-opacity:1;color:rgb(254 202 202/var(--tw-text-opacity,1))}.text-red-300{--tw-text-opacity:1;color:rgb(252 165 165/var(--tw-text-opacity,1))}.text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-yellow-200{--tw-text-opacity:1;color:rgb(254 240 138/var(--tw-text-opacity,1))}.text-yellow-400{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity,1))}.text-yellow-500\/80{color:rgba(234,179,8,.8)}.underline{-webkit-text-decoration-line:underline;text-decoration-line:underline}.no-underline{-webkit-text-decoration-line:none;text-decoration-line:none}.decoration-gray-600{-webkit-text-decoration-color:#4b5563;text-decoration-color:#4b5563}.decoration-dotted{-webkit-text-decoration-style:dotted;text-decoration-style:dotted}.placeholder-gray-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(107 114 128/var(--tw-placeholder-opacity,1))}.placeholder-gray-500::placeholder{--tw-placeholder-opacity:1;color:rgb(107 114 128/var(--tw-placeholder-opacity,1))}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,0.1),0 1px 2px -1px rgba(0,0,0,0.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 transparent)}.ring-blue-500{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.\!filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.last\:border-b-0:last-child{border-bottom-width:0}.hover\:border-gray-500:hover{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity,1))}.hover\:border-gray-600:hover{--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.hover\:bg-blue-500:hover{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.hover\:bg-gray-600:hover{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.hover\:bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.hover\:bg-gray-800\/50:hover{background-color:rgba(31,41,55,.5)}.hover\:bg-gray-800\/60:hover{background-color:rgba(31,41,55,.6)}.hover\:text-blue-300:hover{--tw-text-opacity:1;color:rgb(147 197 253/var(--tw-text-opacity,1))}.hover\:text-gray-200:hover{--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.hover\:text-purple-300:hover{--tw-text-opacity:1;color:rgb(216 180 254/var(--tw-text-opacity,1))}.hover\:underline:hover{-webkit-text-decoration-line:underline;text-decoration-line:underline}.hover\:decoration-blue-400:hover{-webkit-text-decoration-color:#60a5fa;text-decoration-color:#60a5fa}.hover\:ring-1:hover{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 transparent)}.hover\:ring-gray-500:hover{--tw-ring-opacity:1;--tw-ring-color:rgb(107 114 128/var(--tw-ring-opacity,1))}.focus\:border-blue-500:focus{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity,1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 transparent)}.focus\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity,1))}.disabled\:opacity-50:disabled{opacity:.5}@media (min-width:768px){.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}@media (min-width:1024px){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1280px){.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sanitizeAppMap = exports.ValueMasker = exports.BUILTIN_ALLOW = exports.CLI_VERSION = void 0;
|
|
4
|
+
const models_1 = require("@appland/models");
|
|
5
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
6
|
+
exports.CLI_VERSION = require('../../package.json').version;
|
|
7
|
+
// Sanitize an AppMap so its committed form is structurally incapable of
|
|
8
|
+
// carrying a secret. Every captured runtime value string is replaced with a
|
|
9
|
+
// per-AppMap token (`<v1>`, `<v2>`, …) assigned in order of first appearance,
|
|
10
|
+
// so equality WITHIN one AppMap is preserved exactly (data-flow correlation
|
|
11
|
+
// still reads), while no content characters are retained. Tokens are shared
|
|
12
|
+
// across all value positions, so a header value, a parameter, and a return
|
|
13
|
+
// value that held the same string get the same token.
|
|
14
|
+
//
|
|
15
|
+
// Two fields are the exception: an HTTP server `path_info` with no route
|
|
16
|
+
// template, and a client `url`. These are the only captured values that feed
|
|
17
|
+
// the `appmap compare` digest (through the request route), so a per-file token
|
|
18
|
+
// would make two otherwise-identical recordings compare as different. They are
|
|
19
|
+
// instead normalized to a deterministic, lossy route template (see
|
|
20
|
+
// normalizeUrl) — stable across files, with the concrete id dropped rather than
|
|
21
|
+
// encoded. (A content hash would give cross-file stability for free, but a hash
|
|
22
|
+
// of low-entropy PII is reversible by guess-and-check; erasure is not.)
|
|
23
|
+
//
|
|
24
|
+
// Sanitization is positional, driven by the AppMap format: it touches only
|
|
25
|
+
// the fields defined to hold captured runtime data. Code object names,
|
|
26
|
+
// classes, paths, labels, and route templates are schema, not data, and are
|
|
27
|
+
// never modified.
|
|
28
|
+
//
|
|
29
|
+
// The per-file token namespace is deliberate: unlinkability across
|
|
30
|
+
// files/revisions is the anti-correlation guarantee, and (routes aside) values
|
|
31
|
+
// are excluded from the comparison digest, so nothing is lost by it.
|
|
32
|
+
// Kind recognizers annotate a token with the *shape* of the original value
|
|
33
|
+
// (`<uuid:v3>`) — readability only. Recognition never exempts a value from
|
|
34
|
+
// sanitization: a UUID is exactly the shape session tokens take.
|
|
35
|
+
const KIND_PATTERNS = [
|
|
36
|
+
['uuid', /^\{?[0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}\}?$/],
|
|
37
|
+
['iso8601', /^\d{4}-\d{2}-\d{2}([T ]\d{2}:\d{2}(:\d{2}(\.\d+)?)?(Z|[+-]\d{2}:?\d{2})?)?$/],
|
|
38
|
+
['hex', /^(0x)?[0-9a-fA-F]{16,}$/],
|
|
39
|
+
['int', /^-?\d+$/],
|
|
40
|
+
];
|
|
41
|
+
// The shape of an assigned token. Recognition of existing tokens is gated on
|
|
42
|
+
// the file's metadata.sanitized marker: in a marked file the tokens are ours
|
|
43
|
+
// and pass through (making re-runs idempotent); in a fresh file a string that
|
|
44
|
+
// merely looks like a token is application data and is masked like any other.
|
|
45
|
+
const TOKEN_PATTERN = /^<(?:[a-z0-9]+:)?v\d+>$/;
|
|
46
|
+
// Values kept verbatim: universally enumerable sets with no secret capacity.
|
|
47
|
+
// Project-specific vocabularies (enum strings such as state names) are added
|
|
48
|
+
// via the command's --allow/--allow-file options — curated by a human, exact
|
|
49
|
+
// match only. Matching never keeps part of a value.
|
|
50
|
+
exports.BUILTIN_ALLOW = new Set([
|
|
51
|
+
'',
|
|
52
|
+
'true',
|
|
53
|
+
'false',
|
|
54
|
+
'True',
|
|
55
|
+
'False',
|
|
56
|
+
'TRUE',
|
|
57
|
+
'FALSE',
|
|
58
|
+
'null',
|
|
59
|
+
'NULL',
|
|
60
|
+
'nil',
|
|
61
|
+
'None',
|
|
62
|
+
'undefined',
|
|
63
|
+
]);
|
|
64
|
+
class ValueMasker {
|
|
65
|
+
constructor(allow = exports.BUILTIN_ALLOW) {
|
|
66
|
+
this.allow = allow;
|
|
67
|
+
this.tokens = new Map();
|
|
68
|
+
this.counter = 0;
|
|
69
|
+
// Set by sanitizeAppMap when the file carries a metadata.sanitized marker.
|
|
70
|
+
this.recognizeTokens = false;
|
|
71
|
+
}
|
|
72
|
+
get distinctCount() {
|
|
73
|
+
return this.tokens.size;
|
|
74
|
+
}
|
|
75
|
+
// The user-supplied allowlist (built-ins excluded), for the provenance marker.
|
|
76
|
+
get userAllowValues() {
|
|
77
|
+
return [...this.allow].filter((v) => !exports.BUILTIN_ALLOW.has(v)).sort();
|
|
78
|
+
}
|
|
79
|
+
// Start numbering new tokens above `n`. Used when a document already carries
|
|
80
|
+
// tokens (sanitized before this code covered some field): a new value must
|
|
81
|
+
// never receive a token that another value in the document already holds.
|
|
82
|
+
reserveThrough(n) {
|
|
83
|
+
this.counter = Math.max(this.counter, n);
|
|
84
|
+
}
|
|
85
|
+
// The masking primitive: every captured value string passes through here
|
|
86
|
+
// and is replaced with a content-free token (allow-list and
|
|
87
|
+
// already-assigned tokens excepted). Labeled so appmap-review interprets
|
|
88
|
+
// changes to what escapes masking.
|
|
89
|
+
// @label security.sanitization
|
|
90
|
+
mask(value) {
|
|
91
|
+
var _a;
|
|
92
|
+
if (this.allow.has(value) || (this.recognizeTokens && TOKEN_PATTERN.test(value)))
|
|
93
|
+
return value;
|
|
94
|
+
let token = this.tokens.get(value);
|
|
95
|
+
if (!token) {
|
|
96
|
+
const kind = (_a = KIND_PATTERNS.find(([, pattern]) => pattern.test(value))) === null || _a === void 0 ? void 0 : _a[0];
|
|
97
|
+
this.counter += 1;
|
|
98
|
+
token = `<${kind ? `${kind}:` : ''}v${this.counter}>`;
|
|
99
|
+
this.tokens.set(value, token);
|
|
100
|
+
}
|
|
101
|
+
return token;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
exports.ValueMasker = ValueMasker;
|
|
105
|
+
// SQL is parameterized, not tokenized: the statement shape is behavioral
|
|
106
|
+
// signal the review reads; the literals are where secrets/PII live.
|
|
107
|
+
// normalizeSQL (the New Relic obfuscator) replaces literals with `?` — but on
|
|
108
|
+
// a statement it cannot reliably obfuscate it returns the ORIGINAL, which is
|
|
109
|
+
// fail-open. Sanitization must fail closed, so any residue that suggests an
|
|
110
|
+
// unobfuscated literal downgrades the whole statement to a token.
|
|
111
|
+
// Residue patterns per adapter follow the obfuscator's own cleanup table
|
|
112
|
+
// (double quotes are string literals in MySQL but identifiers in Postgres).
|
|
113
|
+
const SQL_RESIDUE = {
|
|
114
|
+
mysql: /'|"|\/\*|\*\//,
|
|
115
|
+
mysql2: /'|"|\/\*|\*\//,
|
|
116
|
+
postgres: /'|\/\*|\*\/|\$(?!\?)/,
|
|
117
|
+
sqlite: /'|\/\*|\*\//,
|
|
118
|
+
cassandra: /'|\/\*|\*\//,
|
|
119
|
+
oracle: /'|\/\*|\*\//,
|
|
120
|
+
oracle_enhanced: /'|\/\*|\*\//,
|
|
121
|
+
};
|
|
122
|
+
const SQL_RESIDUE_DEFAULT = /'|"|\/\*|\*\//;
|
|
123
|
+
// @label security.sanitization
|
|
124
|
+
function sanitizeSql(sql, adapter, masker) {
|
|
125
|
+
if (masker.recognizeTokens && TOKEN_PATTERN.test(sql))
|
|
126
|
+
return sql;
|
|
127
|
+
const normalized = (0, models_1.normalizeSQL)(sql, adapter !== null && adapter !== void 0 ? adapter : '');
|
|
128
|
+
const residue = (adapter && SQL_RESIDUE[adapter]) || SQL_RESIDUE_DEFAULT;
|
|
129
|
+
if (residue.test(normalized))
|
|
130
|
+
return masker.mask(sql);
|
|
131
|
+
return normalized;
|
|
132
|
+
}
|
|
133
|
+
function sanitizeSlot(slot, masker) {
|
|
134
|
+
if (slot && typeof slot.value === 'string')
|
|
135
|
+
slot.value = masker.mask(slot.value);
|
|
136
|
+
}
|
|
137
|
+
// Header NAMES are schema (kept); header VALUES are captured data (tokenized).
|
|
138
|
+
function sanitizeHeaders(headers, masker) {
|
|
139
|
+
if (!headers)
|
|
140
|
+
return;
|
|
141
|
+
for (const name of Object.keys(headers)) {
|
|
142
|
+
const value = headers[name];
|
|
143
|
+
if (typeof value === 'string')
|
|
144
|
+
headers[name] = masker.mask(value);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// HTTP paths and client URLs are the one kind of captured value that feeds the
|
|
148
|
+
// `appmap compare` digest: the request route is derived from `path_info`/`url`
|
|
149
|
+
// (Event.route). A per-file `<vN>` token there would vary between recordings
|
|
150
|
+
// and destabilize the digest, so instead of tokenizing we normalize to a route
|
|
151
|
+
// template — deterministic (same input, same output, so the digest is stable
|
|
152
|
+
// across files) and lossy (the concrete id is dropped, not encoded, so there is
|
|
153
|
+
// nothing to reverse).
|
|
154
|
+
//
|
|
155
|
+
// A segment that looks like a value (numeric/uuid/hex/timestamp id) becomes a
|
|
156
|
+
// `:kind` placeholder; a plain route word or version segment is kept; anything
|
|
157
|
+
// else (mixed-alnum ids, opaque tokens, emails) falls to `:param`. Without the
|
|
158
|
+
// application's route table this is a heuristic: a purely alphabetic segment
|
|
159
|
+
// (a username in `/users/alice`) is indistinguishable from a route word and is
|
|
160
|
+
// kept — the one spot a template-less path can retain a value.
|
|
161
|
+
function normalizeSegment(seg) {
|
|
162
|
+
var _a;
|
|
163
|
+
if (seg === '')
|
|
164
|
+
return seg; // preserve leading/trailing/'//' structure
|
|
165
|
+
const kind = (_a = KIND_PATTERNS.find(([, pattern]) => pattern.test(seg))) === null || _a === void 0 ? void 0 : _a[0];
|
|
166
|
+
if (kind)
|
|
167
|
+
return `:${kind}`;
|
|
168
|
+
if (/^[A-Za-z][A-Za-z_-]*$/.test(seg) || /^v\d+$/.test(seg))
|
|
169
|
+
return seg;
|
|
170
|
+
return ':param';
|
|
171
|
+
}
|
|
172
|
+
// Drop the query string and fragment entirely: they are the densest home for
|
|
173
|
+
// secrets and PII (tokens, emails, ids as `?user=…`) and carry little route
|
|
174
|
+
// signal, so dropping them is both the safest and simplest choice. (A later
|
|
175
|
+
// revision could instead keep sorted parameter *names* with erased values, if
|
|
176
|
+
// query-distinguished endpoints ever need to compare apart.)
|
|
177
|
+
// @label security.sanitization
|
|
178
|
+
function normalizePath(path) {
|
|
179
|
+
return path.split(/[?#]/)[0].split('/').map(normalizeSegment).join('/');
|
|
180
|
+
}
|
|
181
|
+
// Client URL: strip userinfo (a `user:pass@` can ride here as in a git URL),
|
|
182
|
+
// keep scheme + host + port as route signal, parameterize the path, drop query
|
|
183
|
+
// and fragment. A relative or malformed URL that won't parse is parameterized
|
|
184
|
+
// as a bare path — deterministic and secret-free, never fail-open.
|
|
185
|
+
// @label security.sanitization
|
|
186
|
+
function normalizeUrl(url) {
|
|
187
|
+
try {
|
|
188
|
+
const parsed = new URL(url);
|
|
189
|
+
return `${parsed.protocol}//${parsed.host}${normalizePath(parsed.pathname)}`;
|
|
190
|
+
}
|
|
191
|
+
catch (_a) {
|
|
192
|
+
return normalizePath(url);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
const TOKEN_SCAN = /<(?:[a-z0-9]+:)?v(\d+)>/g;
|
|
196
|
+
// The redaction boundary: sanitizes every field defined to hold captured
|
|
197
|
+
// runtime data (parameters, return values, exceptions, HTTP paths/headers,
|
|
198
|
+
// SQL) so the committed AppMap is structurally incapable of carrying a secret.
|
|
199
|
+
// Labeled so appmap-review interprets any change to this boundary.
|
|
200
|
+
// @label security.sanitization
|
|
201
|
+
function sanitizeAppMap(appmap, masker = new ValueMasker()) {
|
|
202
|
+
var _a, _b, _c, _d;
|
|
203
|
+
const prior = (_a = appmap.metadata) === null || _a === void 0 ? void 0 : _a.sanitized;
|
|
204
|
+
masker.recognizeTokens = Boolean(prior);
|
|
205
|
+
if (prior) {
|
|
206
|
+
// The document's tokens are ours: number new tokens above them so no
|
|
207
|
+
// token is ever shared by two different values.
|
|
208
|
+
for (const match of JSON.stringify(appmap).matchAll(TOKEN_SCAN)) {
|
|
209
|
+
masker.reserveThrough(Number(match[1]));
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
for (const event of (_b = appmap.events) !== null && _b !== void 0 ? _b : [])
|
|
213
|
+
sanitizeEvent(event, masker);
|
|
214
|
+
// eventUpdates carry the same captured-data fields as events; sanitize them
|
|
215
|
+
// in place, in the same token namespace. They are deliberately not merged
|
|
216
|
+
// into their events — sanitize changes values only, never structure.
|
|
217
|
+
for (const update of Object.values((_c = appmap.eventUpdates) !== null && _c !== void 0 ? _c : {}))
|
|
218
|
+
sanitizeEvent(update, masker);
|
|
219
|
+
sanitizeMetadata(appmap.metadata, masker);
|
|
220
|
+
// Provenance. Masking is one-way, so on a re-run the values still verbatim
|
|
221
|
+
// are those allowed by BOTH runs — the marker records that intersection.
|
|
222
|
+
const current = masker.userAllowValues;
|
|
223
|
+
const allowValues = prior
|
|
224
|
+
? current.filter((v) => prior.allow_values.includes(v))
|
|
225
|
+
: current;
|
|
226
|
+
appmap.metadata = Object.assign(Object.assign({}, ((_d = appmap.metadata) !== null && _d !== void 0 ? _d : {})), { sanitized: { version: exports.CLI_VERSION, allow_values: allowValues } });
|
|
227
|
+
return appmap;
|
|
228
|
+
}
|
|
229
|
+
exports.sanitizeAppMap = sanitizeAppMap;
|
|
230
|
+
// Metadata carries captured data too: the git identity, credentials embedded
|
|
231
|
+
// in the repository URL, and exception / test-failure messages. The command
|
|
232
|
+
// pipeline's normalize step also strips repository credentials, but the walk
|
|
233
|
+
// must not depend on it — the security guarantee lives here, alone.
|
|
234
|
+
function sanitizeMetadata(metadata, masker) {
|
|
235
|
+
if (!metadata)
|
|
236
|
+
return;
|
|
237
|
+
const git = metadata.git;
|
|
238
|
+
if (git) {
|
|
239
|
+
if (typeof git.repository === 'string' && /^https?:/.test(git.repository)) {
|
|
240
|
+
const repository = git.repository;
|
|
241
|
+
try {
|
|
242
|
+
const url = new URL(repository);
|
|
243
|
+
url.username = '';
|
|
244
|
+
url.password = '';
|
|
245
|
+
git.repository = url.toString();
|
|
246
|
+
}
|
|
247
|
+
catch (_a) {
|
|
248
|
+
// Unparseable URL: mask the whole value rather than risk a credential.
|
|
249
|
+
git.repository = masker.mask(repository);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
if (typeof git.user_name === 'string')
|
|
253
|
+
git.user_name = masker.mask(git.user_name);
|
|
254
|
+
if (typeof git.user_email === 'string')
|
|
255
|
+
git.user_email = masker.mask(git.user_email);
|
|
256
|
+
}
|
|
257
|
+
if (metadata.exception && typeof metadata.exception.message === 'string')
|
|
258
|
+
metadata.exception.message = masker.mask(metadata.exception.message);
|
|
259
|
+
if (metadata.test_failure && typeof metadata.test_failure.message === 'string')
|
|
260
|
+
metadata.test_failure.message = masker.mask(metadata.test_failure.message);
|
|
261
|
+
}
|
|
262
|
+
function sanitizeEvent(event, masker) {
|
|
263
|
+
var _a, _b, _c, _d, _e;
|
|
264
|
+
for (const p of (_a = event.parameters) !== null && _a !== void 0 ? _a : [])
|
|
265
|
+
sanitizeSlot(p, masker);
|
|
266
|
+
for (const m of (_b = event.message) !== null && _b !== void 0 ? _b : [])
|
|
267
|
+
sanitizeSlot(m, masker);
|
|
268
|
+
sanitizeSlot(event.receiver, masker);
|
|
269
|
+
sanitizeSlot(event.return_value, masker);
|
|
270
|
+
for (const x of (_c = event.exceptions) !== null && _c !== void 0 ? _c : []) {
|
|
271
|
+
if (typeof x.message === 'string')
|
|
272
|
+
x.message = masker.mask(x.message);
|
|
273
|
+
if (typeof x.value === 'string')
|
|
274
|
+
x.value = masker.mask(x.value);
|
|
275
|
+
}
|
|
276
|
+
const serverRequest = event.http_server_request;
|
|
277
|
+
if (serverRequest) {
|
|
278
|
+
// path_info carries the concrete path (ids, PII). When a route template
|
|
279
|
+
// (normalized_path_info) is present it wins the digest, so the concrete
|
|
280
|
+
// path is not structural and we fully redact it to a token. When it is
|
|
281
|
+
// absent, path_info IS the digest's route, so normalize it to a
|
|
282
|
+
// deterministic template instead — a per-file token there would vary
|
|
283
|
+
// between recordings and destabilize `appmap compare`.
|
|
284
|
+
if (typeof serverRequest.path_info === 'string')
|
|
285
|
+
serverRequest.path_info = serverRequest.normalized_path_info
|
|
286
|
+
? masker.mask(serverRequest.path_info)
|
|
287
|
+
: normalizePath(serverRequest.path_info);
|
|
288
|
+
sanitizeHeaders(serverRequest.headers, masker);
|
|
289
|
+
}
|
|
290
|
+
const clientRequest = event.http_client_request;
|
|
291
|
+
if (clientRequest) {
|
|
292
|
+
// The client URL always feeds the ClientRPC route/digest, so normalize it
|
|
293
|
+
// to a route template rather than tokenize it (see normalizeUrl).
|
|
294
|
+
if (typeof clientRequest.url === 'string')
|
|
295
|
+
clientRequest.url = normalizeUrl(clientRequest.url);
|
|
296
|
+
sanitizeHeaders(clientRequest.headers, masker);
|
|
297
|
+
}
|
|
298
|
+
sanitizeHeaders((_d = event.http_server_response) === null || _d === void 0 ? void 0 : _d.headers, masker);
|
|
299
|
+
sanitizeHeaders((_e = event.http_client_response) === null || _e === void 0 ? void 0 : _e.headers, masker);
|
|
300
|
+
const sqlQuery = event.sql_query;
|
|
301
|
+
if (sqlQuery && typeof sqlQuery.sql === 'string')
|
|
302
|
+
sqlQuery.sql = sanitizeSql(sqlQuery.sql, sqlQuery.database_type, masker);
|
|
303
|
+
}
|
|
304
|
+
//# sourceMappingURL=sanitizeAppMap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitizeAppMap.js","sourceRoot":"","sources":["../../src/lib/sanitizeAppMap.ts"],"names":[],"mappings":"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"}
|