@dbx-tools/fs 0.6.72 → 0.6.74
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/README.md +4 -2
- package/lib/src/local-fs.d.ts +1 -0
- package/lib/src/local-fs.js +9 -5
- package/lib/src/os-path.d.ts +2 -2
- package/lib/src/os-path.js +5 -5
- package/package.json +5 -5
- package/src/local-fs.ts +8 -4
- package/src/os-path.ts +4 -4
package/README.md
CHANGED
|
@@ -15,6 +15,7 @@ Key features:
|
|
|
15
15
|
- Read/write/append/copy/move plus mkdir/rmdir/readdir/stat/exists
|
|
16
16
|
- Optional read-only mode
|
|
17
17
|
- Native append / copy / rename via Node when available
|
|
18
|
+
- Cross-process serialization for concurrent rebuilds of the same stable temp tree
|
|
18
19
|
|
|
19
20
|
## Why Use This Over Native Node fs
|
|
20
21
|
|
|
@@ -40,7 +41,8 @@ await work.init(); // only needed when handing the root to `node:fs` or a subpro
|
|
|
40
41
|
|
|
41
42
|
// Regenerate on every boot, but into ONE stable directory: the callback writes
|
|
42
43
|
// into a scratch root that replaces the stable one only on success, so restarts
|
|
43
|
-
// don't pile up directories
|
|
44
|
+
// don't pile up directories, a failed rebuild keeps the last good tree, and
|
|
45
|
+
// concurrent rebuilds of the same key are serialized across processes.
|
|
44
46
|
const skills = await localFS.rebuildFS("agent-skills", (scratch) => downloadInto(scratch.root));
|
|
45
47
|
```
|
|
46
48
|
|
|
@@ -52,7 +54,7 @@ const skills = await localFS.rebuildFS("agent-skills", (scratch) => downloadInto
|
|
|
52
54
|
| `LocalFileSystemOptions` | Constructor options |
|
|
53
55
|
| `localFS.homeFS` / `localFS.tmpFS` | `LocalFileSystem` under resolved home / temp |
|
|
54
56
|
| `localFS.scratchFS` | `tmpFS` on a `<prefix>-<id>` root unique per call |
|
|
55
|
-
| `localFS.rebuildFS` |
|
|
57
|
+
| `localFS.rebuildFS` | Serialized stable temp rebuild via atomic scratch swap |
|
|
56
58
|
| `osPath.resolveLocalHome` | Home: `homedir` → `HOME` → `/home/app` → `./.home` |
|
|
57
59
|
| `osPath.resolveLocalTemp` | Temp: `tmpdir` → `TMPDIR`/`TMP`/`TEMP` → `<home>/.tmp` |
|
|
58
60
|
| `localPath.expandLocalHomePath` | Expand `~` against a home dir |
|
package/lib/src/local-fs.d.ts
CHANGED
|
@@ -143,6 +143,7 @@ export declare function scratchFS(prefix: string, options?: OsFileSystemOptions)
|
|
|
143
143
|
* - a reader never observes a half-written tree, and a failed rebuild leaves
|
|
144
144
|
* the previous one intact.
|
|
145
145
|
*
|
|
146
|
+
* Rebuilds targeting the same stable tree are serialized across processes.
|
|
146
147
|
* The swap is a `rename` within the same temp root, so it is atomic.
|
|
147
148
|
*
|
|
148
149
|
* @param key - Stable temp-relative path. May be nested (`"skills/abc123"`)
|
package/lib/src/local-fs.js
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
import { appendFile, cp, lstat, mkdir, readdir, readFile, realpath, rename, rm, rmdir, writeFile, } from "node:fs/promises";
|
|
11
11
|
import path from "node:path";
|
|
12
|
+
import { fileLock } from "@dbx-tools/core";
|
|
12
13
|
import { hash } from "@dbx-tools/shared-core";
|
|
13
14
|
import { BaseFileSystem, baseFS, FileSystemError, posixPath, } from "@dbx-tools/shared-fs";
|
|
14
15
|
import { resolveLocalRoot } from "./local-path.js";
|
|
@@ -290,6 +291,7 @@ export function scratchFS(prefix, options = {}) {
|
|
|
290
291
|
* - a reader never observes a half-written tree, and a failed rebuild leaves
|
|
291
292
|
* the previous one intact.
|
|
292
293
|
*
|
|
294
|
+
* Rebuilds targeting the same stable tree are serialized across processes.
|
|
293
295
|
* The swap is a `rename` within the same temp root, so it is atomic.
|
|
294
296
|
*
|
|
295
297
|
* @param key - Stable temp-relative path. May be nested (`"skills/abc123"`)
|
|
@@ -314,10 +316,12 @@ export async function rebuildFS(key, materialize, options = {}) {
|
|
|
314
316
|
}
|
|
315
317
|
const stable = tmpFS(key, options);
|
|
316
318
|
const stableHost = path.resolve(stable.root);
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
319
|
+
return fileLock.withFileLock(["rebuildFS", stableHost], async () => {
|
|
320
|
+
await rm(stableHost, { recursive: true, force: true });
|
|
321
|
+
await mkdir(path.dirname(stableHost), { recursive: true });
|
|
322
|
+
await rename(path.resolve(scratch.root), stableHost);
|
|
323
|
+
return stable;
|
|
324
|
+
});
|
|
321
325
|
}
|
|
322
326
|
/**
|
|
323
327
|
* Join {@link relativeRoot} under {@link base}. Empty / `.` keeps {@link base};
|
|
@@ -327,4 +331,4 @@ function joinUnderBase(base, relativeRoot) {
|
|
|
327
331
|
const rest = posixPath.toRelativeSegment(relativeRoot);
|
|
328
332
|
return rest ? path.resolve(base, rest) : base;
|
|
329
333
|
}
|
|
330
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbG9jYWwtZnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQ0wsVUFBVSxFQUNWLEVBQUUsRUFDRixLQUFLLEVBQ0wsS0FBSyxFQUNMLE9BQU8sRUFDUCxRQUFRLEVBQ1IsUUFBUSxFQUNSLE1BQU0sRUFDTixFQUFFLEVBQ0YsS0FBSyxFQUNMLFNBQVMsR0FDVixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUMsT0FBTyxFQUNMLGNBQWMsRUFDZCxNQUFNLEVBQ04sZUFBZSxFQUNmLFNBQVMsR0FPVixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBOEIsTUFBTSxjQUFjLENBQUM7QUE4QzlGOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxPQUFPLGVBQWdCLFNBQVEsY0FBdUI7SUFDekMsU0FBUyxDQUFVO0lBQ3BDLCtEQUErRDtJQUN2RCxRQUFRLENBQVM7SUFFekIsWUFBWSxPQUErQjtRQUN6QyxNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1RCxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNsRSxLQUFLLENBQUM7WUFDSixFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsSUFBSSxTQUFTLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDL0MsT0FBTyxFQUFF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LENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEhvc3QtbG9jYWwge0BsaW5rIEZpbGVTeXN0ZW19IGJhY2tlZCBieSBOb2RlJ3MgYG5vZGU6ZnMvcHJvbWlzZXNgLlxuICpcbiAqIEV4dGVuZHMge0BsaW5rIEJhc2VGaWxlU3lzdGVtfSBzbyB0aGlzIG1vZHVsZSBvbmx5IG93bnMgTm9kZSBJL08sIGhvc3QgcGF0aFxuICogY29udmVyc2lvbiwgYW5kIHN5bWxpbmsgY29udGFpbm1lbnQuIFBvcnRhYmxlIGJlaGF2aW9yIChlbmNvZGluZywgcmVjdXJzaW9uLFxuICogcGFyZW50IGNyZWF0aW9uLCBmYWxsYmFja3MsIFBPU0lYIG5hbWVzcGFjZSBwYXRocykgbGl2ZXMgaW4gYEBkYngtdG9vbHMvc2hhcmVkLWZzYC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgYXBwZW5kRmlsZSxcbiAgY3AsXG4gIGxzdGF0LFxuICBta2RpcixcbiAgcmVhZGRpcixcbiAgcmVhZEZpbGUsXG4gIHJlYWxwYXRoLFxuICByZW5hbWUsXG4gIHJtLFxuICBybWRpcixcbiAgd3JpdGVGaWxlLFxufSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgaGFzaCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBCYXNlRmlsZVN5c3RlbSxcbiAgYmFzZUZTLFxuICBGaWxlU3lzdGVtRXJyb3IsXG4gIHBvc2l4UGF0aCxcbiAgdHlwZSBDb3B5T3B0aW9ucyxcbiAgdHlwZSBGaWxlRW50cnksXG4gIHR5cGUgRmlsZUVudHJ5VHlwZSxcbiAgdHlwZSBGaWxlU3RhdCxcbiAgdHlwZSBGaWxlU3lzdGVtRXJyb3JDb2RlLFxuICB0eXBlIFdyaXRlRmlsZU9wdGlvbnMsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1mc1wiO1xuaW1wb3J0IHsgcmVzb2x2ZUxvY2FsUm9vdCB9IGZyb20gXCIuL2xvY2FsLXBhdGgudHNcIjtcbmltcG9ydCB7IHJlc29sdmVMb2NhbEhvbWUsIHJlc29sdmVMb2NhbFRlbXAsIHR5cGUgUmVzb2x2ZU9zUGF0aHNPcHRpb25zIH0gZnJvbSBcIi4vb3MtcGF0aC50c1wiO1xuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIExvY2FsRmlsZVN5c3RlbX0uICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsRmlsZVN5c3RlbU9wdGlvbnMge1xuICAvKiogVW5pcXVlIGlkZW50aWZpZXIuIERlZmF1bHRzIHRvIGEgc3RhYmxlIGhhc2ggb2YgdGhlIGFic29sdXRlIHJvb3QuICovXG4gIGlkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSb290IGRpcmVjdG9yeSBvbiBkaXNrLiBSZWxhdGl2ZSBwYXRocyByZXNvbHZlIGFnYWluc3QgYHByb2Nlc3MuY3dkKClgLlxuICAgKiBgfmAgLyBgfi8uLi5gIGV4cGFuZCB2aWEgYG9zLmhvbWVkaXIoKWAgKGJlZm9yZSBgSE9NRWApLCBBcHAgYC9ob21lL2FwcGAsXG4gICAqIG9yIGEgY3JlYXRlZCBgLi8uaG9tZWAgKGNyZWF0ZSBmYWlsdXJlcyBza2lwKS5cbiAgICogU3RvcmVkIG9uIHtAbGluayBMb2NhbEZpbGVTeXN0ZW0ucm9vdH0gaW4gUE9TSVggZm9ybS5cbiAgICovXG4gIHJvb3Q6IHN0cmluZztcblxuICAvKiogQmxvY2sgYWxsIHdyaXRlIG9wZXJhdGlvbnMuIERlZmF1bHRzIHRvIGZhbHNlLiAqL1xuICByZWFkT25seT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEtlZXAgZXZlcnkgcmVzb2x2ZWQgcGF0aCB1bmRlciB7QGxpbmsgcm9vdH0uIERlZmF1bHRzIHRvIHRydWUuXG4gICAqIFdoZW4gZmFsc2UsIGFic29sdXRlIGlucHV0IHBhdGhzIGFyZSBhY2NlcHRlZCBhcy1pcyAobm8gc2FuZGJveCkuXG4gICAqL1xuICBjb250YWluZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUge0BsaW5rIHJvb3R9IChhbmQgcGFyZW50cykgZHVyaW5nIGluaXQuIERlZmF1bHRzIHRvIHRydWUuXG4gICAqL1xuICBjcmVhdGVSb290PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5qZWN0YWJsZXMgZm9yd2FyZGVkIHRvIHtAbGluayByZXNvbHZlTG9jYWxSb290fSBmb3IgYH5gIGV4cGFuc2lvbiAoaG9tZSAvXG4gICAqIHRlbXAgLyBjd2Qgb3ZlcnJpZGVzKS4gTWFpbmx5IGZvciB0ZXN0czogYnVuJ3MgYG9zLmhvbWVkaXIoKWAgaWdub3JlcyBhXG4gICAqIHByb2Nlc3Mtc2V0IGBIT01FYCwgc28gb3ZlcnJpZGluZyBob21lIHZpYSBgeyBvczogeyBob21lRGlyIH0gfWAgaXMgdGhlXG4gICAqIHJ1bnRpbWUtYWdub3N0aWMgd2F5IHRvIHBvaW50IGEgYH5gIHJvb3QgYXQgYSBjaG9zZW4gZGlyZWN0b3J5LlxuICAgKi9cbiAgb3M/OiBSZXNvbHZlT3NQYXRoc09wdGlvbnM7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIGZhY3RvcmllcyB0aGF0IHRha2UgdGhlaXIgcm9vdCBGUk9NIHRoZSBPU1xuICogKHtAbGluayBob21lRlN9IC8ge0BsaW5rIHRtcEZTfSAvIHtAbGluayBzY3JhdGNoRlN9KSByYXRoZXIgdGhhbiBmcm9tIHRoZVxuICogY2FsbGVyOiB7QGxpbmsgTG9jYWxGaWxlU3lzdGVtT3B0aW9uc30gd2l0aG91dCBgcm9vdGAsIHBsdXMgdGhlXG4gKiB7QGxpbmsgcmVzb2x2ZU9zUGF0aHN9IGluamVjdGFibGVzLlxuICovXG5leHBvcnQgdHlwZSBPc0ZpbGVTeXN0ZW1PcHRpb25zID0gT21pdDxMb2NhbEZpbGVTeXN0ZW1PcHRpb25zLCBcInJvb3RcIj47XG5cbi8qKlxuICoge0BsaW5rIEZpbGVTeXN0ZW19IGltcGxlbWVudGF0aW9uIHRoYXQgc3RvcmVzIGZpbGVzIGluIGEgZm9sZGVyIG9uIHRoZSBsb2NhbFxuICogbWFjaGluZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IGZzID0gbmV3IExvY2FsRmlsZVN5c3RlbSh7IHJvb3Q6IFwiLi9kYXRhXCIgfSk7XG4gKiBhd2FpdCBmcy5pbml0KCk7XG4gKiBhd2FpdCBmcy53cml0ZUZpbGUoXCJoZWxsby50eHRcIiwgXCJoaVwiKTtcbiAqXG4gKiBjb25zdCBob21lID0gbmV3IExvY2FsRmlsZVN5c3RlbSh7IHJvb3Q6IFwifi9wcm9qZWN0cy9kYXRhXCIgfSk7XG4gKiBjb25zdCBzY3JhdGNoID0gdG1wRlMoXCJteS1qb2JcIik7XG4gKiBjb25zdCBjYWNoZSA9IGhvbWVGUyhcIi5jYWNoZS9hcHBcIik7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIExvY2FsRmlsZVN5c3RlbSBleHRlbmRzIEJhc2VGaWxlU3lzdGVtPFwibG9jYWxcIj4ge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lZDogYm9vbGVhbjtcbiAgLyoqIFN5bWxpbmstcmVzb2x2ZWQgaG9zdCByb290LCByZWZyZXNoZWQgaW4ge0BsaW5rIG9uSW5pdH0uICovXG4gIHByaXZhdGUgcmVhbFJvb3Q6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBMb2NhbEZpbGVTeXN0ZW1PcHRpb25zKSB7XG4gICAgY29uc3QgaG9zdFJvb3QgPSByZXNvbHZlTG9jYWxSb290KG9wdGlvbnMucm9vdCwgb3B0aW9ucy5vcyk7XG4gICAgY29uc3Qgcm9vdCA9IHBvc2l4UGF0aC5ub3JtYWxpemVSb290KHBvc2l4UGF0aC50b1Bvc2l4KGhvc3RSb290KSk7XG4gICAgc3VwZXIoe1xuICAgICAgaWQ6IG9wdGlvbnMuaWQgPz8gYGxvY2FsLSR7aGFzaC5mbnZIYXNoKHJvb3QpfWAsXG4gICAgICBiYWNrZW5kOiBcImxvY2FsXCIsXG4gICAgICByb290LFxuICAgICAgcmVhZE9ubHk6IG9wdGlvbnMucmVhZE9ubHksXG4gICAgICBjcmVhdGVSb290OiBvcHRpb25zLmNyZWF0ZVJvb3QgPz8gdHJ1ZSxcbiAgICB9KTtcbiAgICB0aGlzLnJlYWxSb290ID0gdGhpcy50b0JhY2tlbmRQYXRoKHJvb3QpO1xuICAgIHRoaXMuY29udGFpbmVkID0gb3B0aW9ucy5jb250YWluZWQgPz8gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB0b0JhY2tlbmRQYXRoKHBvc2l4QmFja2VuZFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBvc2l4UGF0aC50b0hvc3QocG9zaXhCYWNrZW5kUGF0aCwgcGF0aC5zZXApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZVJvb3REaXJlY3RvcnkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbWtkaXIodGhpcy50b0JhY2tlbmRQYXRoKHRoaXMucm9vdCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIG9uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBob3N0Um9vdCA9IHRoaXMudG9CYWNrZW5kUGF0aCh0aGlzLnJvb3QpO1xuICAgIGlmICghdGhpcy5jcmVhdGVSb290KSB7XG4gICAgICBjb25zdCBpbmZvID0gYXdhaXQgbHN0YXQoaG9zdFJvb3QpO1xuICAgICAgaWYgKCFpbmZvLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FcnJvcihcbiAgICAgICAgICBcIk5PVF9ESVJFQ1RPUllcIixcbiAgICAgICAgICBgTG9jYWwgZmlsZXN5c3RlbSByb290IGlzIG5vdCBhIGRpcmVjdG9yeTogJHt0aGlzLnJvb3R9YCxcbiAgICAgICAgICB0aGlzLnJvb3QsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIENhbm9uaWNhbGl6ZSBzbyBjb250YWlubWVudCBjaGVja3Mgc3Vydml2ZSBPUyByb290IHN5bWxpbmtzIChlLmcuIC92YXIgLT4gL3ByaXZhdGUvdmFyKS5cbiAgICB0aGlzLnJlYWxSb290ID0gYXdhaXQgcmVhbHBhdGgoaG9zdFJvb3QpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVzb2x2ZVBhdGgoaW5wdXRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5jb250YWluZWQpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gcGF0aC5pc0Fic29sdXRlKGlucHV0UGF0aClcbiAgICAgICAgPyBwYXRoLnJlc29sdmUoaW5wdXRQYXRoKVxuICAgICAgICA6IHBhdGgucmVzb2x2ZSh0aGlzLnRvQmFja2VuZFBhdGgodGhpcy5yb290KSwgaW5wdXRQYXRoKTtcbiAgICAgIHJldHVybiB0aGlzLnRvQmFja2VuZFBhdGgocG9zaXhQYXRoLnRvUG9zaXgocmVzb2x2ZWQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLnJlc29sdmVQYXRoKGlucHV0UGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogV2hlbiBjb250YWluZWQsIHJlc29sdmUgc3ltbGlua3MgYW5kIGVuc3VyZSB0aGUgcmVhbCBwYXRoIHN0aWxsIHNpdHMgdW5kZXJcbiAgICoge0BsaW5rIHJvb3R9LiBNaXNzaW5nIGxlYWYgcGF0aHMgYXJlIGFsbG93ZWQgd2hlbiBgYWxsb3dNaXNzaW5nYCBpcyBzZXQgc29cbiAgICogd3JpdGVzIGNhbiBjcmVhdGUgbmV3IGZpbGVzLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHByZXBhcmVQYXRoKFxuICAgIHJlc29sdmVkUGF0aDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7IGFsbG93TWlzc2luZz86IGJvb2xlYW4gfSxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXRoaXMuY29udGFpbmVkKSByZXR1cm4gcmVzb2x2ZWRQYXRoO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWFsID0gYXdhaXQgcmVhbHBhdGgocmVzb2x2ZWRQYXRoKTtcbiAgICAgIGlmICghaXNXaXRoaW5Ib3N0Um9vdCh0aGlzLnJlYWxSb290LCByZWFsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUVycm9yKFxuICAgICAgICAgIFwiUEVSTUlTU0lPTl9ERU5JRURcIixcbiAgICAgICAgICBcIlBhdGggZXNjYXBlcyB0aGUgZmlsZXN5c3RlbSByb290XCIsXG4gICAgICAgICAgcmVzb2x2ZWRQYXRoLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc29sdmVkUGF0aDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBGaWxlU3lzdGVtRXJyb3IpIHRocm93IGVycjtcbiAgICAgIGlmIChvcHRpb25zPy5hbGxvd01pc3NpbmcgJiYgaXNFcnJubyhlcnIsIFwiRU5PRU5UXCIpKSB7XG4gICAgICAgIGxldCBjdXJzb3IgPSBwYXRoLmRpcm5hbWUocmVzb2x2ZWRQYXRoKTtcbiAgICAgICAgd2hpbGUgKGN1cnNvciAhPT0gcGF0aC5kaXJuYW1lKGN1cnNvcikpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVhbCA9IGF3YWl0IHJlYWxwYXRoKGN1cnNvcik7XG4gICAgICAgICAgICBpZiAoIWlzV2l0aGluSG9zdFJvb3QodGhpcy5yZWFsUm9vdCwgcmVhbCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FcnJvcihcbiAgICAgICAgICAgICAgICBcIlBFUk1JU1NJT05fREVOSUVEXCIsXG4gICAgICAgICAgICAgICAgXCJQYXRoIGVzY2FwZXMgdGhlIGZpbGVzeXN0ZW0gcm9vdFwiLFxuICAgICAgICAgICAgICAgIHJlc29sdmVkUGF0aCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlZFBhdGg7XG4gICAgICAgICAgfSBjYXRjaCAoaW5uZXIpIHtcbiAgICAgICAgICAgIGlmIChpbm5lciBpbnN0YW5jZW9mIEZpbGVTeXN0ZW1FcnJvcikgdGhyb3cgaW5uZXI7XG4gICAgICAgICAgICBpZiAoIWlzRXJybm8oaW5uZXIsIFwiRU5PRU5UXCIpKSB0aHJvdyB0aGlzLm1hcEVycm9yKGlubmVyLCByZXNvbHZlZFBhdGgpO1xuICAgICAgICAgICAgY3Vyc29yID0gcGF0aC5kaXJuYW1lKGN1cnNvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNvbHZlZFBhdGg7XG4gICAgICB9XG4gICAgICB0aHJvdyB0aGlzLm1hcEVycm9yKGVyciwgcmVzb2x2ZWRQYXRoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2xhc3NpZnkgTm9kZSBlcnJubyBjb2Rlczsge0BsaW5rIEJhc2VGaWxlU3lzdGVtfSB3cmFwcyBldmVyeSBwcmltaXRpdmUuICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBtYXBFcnJvcihlcnI6IHVua25vd24sIGZpbGVQYXRoOiBzdHJpbmcpOiBGaWxlU3lzdGVtRXJyb3Ige1xuICAgIHJldHVybiBiYXNlRlMubWFwRmlsZVN5c3RlbUVycm9yKGVyciwgZmlsZVBhdGgsIG5vZGVFcnJvckNvZGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHJlYWRCeXRlc0F0KHJlc29sdmVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgY29uc3QgYnVmZmVyID0gYXdhaXQgcmVhZEZpbGUocmVzb2x2ZWRQYXRoKTtcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyLmJ1ZmZlciwgYnVmZmVyLmJ5dGVPZmZzZXQsIGJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyB3cml0ZUJ5dGVzQXQoXG4gICAgcmVzb2x2ZWRQYXRoOiBzdHJpbmcsXG4gICAgY29udGVudDogVWludDhBcnJheSxcbiAgICBvcHRpb25zOiBSZXF1aXJlZDxXcml0ZUZpbGVPcHRpb25zPixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgd3JpdGVGaWxlKHJlc29sdmVkUGF0aCwgY29udGVudCwgb3B0aW9ucy5vdmVyd3JpdGUgPyB1bmRlZmluZWQgOiB7IGZsYWc6IFwid3hcIiB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBkZWxldGVGaWxlQXQocmVzb2x2ZWRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBybShyZXNvbHZlZFBhdGgsIHsgZm9yY2U6IGZhbHNlIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZURpcmVjdG9yeUF0KHJlc29sdmVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbWtkaXIocmVzb2x2ZWRQYXRoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyByZW1vdmVEaXJlY3RvcnlBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHJtZGlyKHJlc29sdmVkUGF0aCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgbGlzdERpcmVjdG9yeUF0KHJlc29sdmVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTxGaWxlRW50cnlbXT4ge1xuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCByZWFkZGlyKHJlc29sdmVkUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGNvbnN0IGVudHJpZXM6IEZpbGVFbnRyeVtdID0gW107XG4gICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZGlyZW50cykge1xuICAgICAgY29uc3QgdHlwZSA9IGVudHJ5VHlwZShkaXJlbnQpO1xuICAgICAgbGV0IHNpemU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0eXBlID09PSBcImZpbGVcIiB8fCB0eXBlID09PSBcInN5bWJvbGljLWxpbmtcIikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHNpemUgPSAoYXdhaXQgbHN0YXQocGF0aC5qb2luKHJlc29sdmVkUGF0aCwgZGlyZW50Lm5hbWUpKSkuc2l6ZTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gUmFjZSB3aXRoIGNvbmN1cnJlbnQgZGVsZXRlczsgb21pdCBzaXplLlxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbnRyaWVzLnB1c2goXG4gICAgICAgIHNpemUgPT09IHVuZGVmaW5lZCA/IHsgbmFtZTogZGlyZW50Lm5hbWUsIHR5cGUgfSA6IHsgbmFtZTogZGlyZW50Lm5hbWUsIHR5cGUsIHNpemUgfSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHN0YXRBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8T21pdDxGaWxlU3RhdCwgXCJwYXRoXCI+PiB7XG4gICAgY29uc3QgaW5mbyA9IGF3YWl0IGxzdGF0KHJlc29sdmVkUGF0aCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHBhdGguYmFzZW5hbWUocmVzb2x2ZWRQYXRoKSB8fCBwYXRoLmJhc2VuYW1lKHRoaXMudG9CYWNrZW5kUGF0aCh0aGlzLnJvb3QpKSxcbiAgICAgIHR5cGU6IGVudHJ5VHlwZShpbmZvKSxcbiAgICAgIHNpemU6IGluZm8uc2l6ZSxcbiAgICAgIGNyZWF0ZWRBdDogaW5mby5iaXJ0aHRpbWUsXG4gICAgICBtb2RpZmllZEF0OiBpbmZvLm10aW1lLFxuICAgICAgYWNjZXNzZWRBdDogaW5mby5hdGltZSxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGlzTm90Rm91bmRFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAoZXJyb3IgaW5zdGFuY2VvZiBGaWxlU3lzdGVtRXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gXCJOT1RfRk9VTkRcIikgfHwgaXNFcnJubyhlcnJvciwgXCJFTk9FTlRcIilcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHRyeUFwcGVuZEZpbGVBdChcbiAgICByZXNvbHZlZFBhdGg6IHN0cmluZyxcbiAgICBjb250ZW50OiBVaW50OEFycmF5LFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBhd2FpdCBhcHBlbmRGaWxlKHJlc29sdmVkUGF0aCwgY29udGVudCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgdHJ5Q29weUZpbGVBdChcbiAgICBzb3VyY2VQYXRoOiBzdHJpbmcsXG4gICAgZGVzdGluYXRpb25QYXRoOiBzdHJpbmcsXG4gICAgb3B0aW9uczogUmVxdWlyZWQ8Q29weU9wdGlvbnM+LFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBhd2FpdCBjcChzb3VyY2VQYXRoLCBkZXN0aW5hdGlvblBhdGgsIHtcbiAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgIGZvcmNlOiBvcHRpb25zLm92ZXJ3cml0ZSxcbiAgICAgIGVycm9yT25FeGlzdDogIW9wdGlvbnMub3ZlcndyaXRlLFxuICAgIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHRyeU1vdmVGaWxlQXQoXG4gICAgc291cmNlUGF0aDogc3RyaW5nLFxuICAgIGRlc3RpbmF0aW9uUGF0aDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFJlcXVpcmVkPENvcHlPcHRpb25zPixcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJlbmFtZShzb3VyY2VQYXRoLCBkZXN0aW5hdGlvblBhdGgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gQWNyb3NzIGRldmljZXMgYHJlbmFtZWAgY2Fubm90IHdvcms7IGZhbGwgYmFjayB0byBjb3B5ICsgcmVtb3ZlLiBBbnlcbiAgICAgIC8vIG90aGVyIGZhaWx1cmUgcHJvcGFnYXRlcyBmb3IgdGhlIGJhc2UgY2xhc3MgdG8gbWFwLlxuICAgICAgaWYgKCFpc0Vycm5vKGVyciwgXCJFWERFVlwiKSkgdGhyb3cgZXJyO1xuICAgICAgYXdhaXQgY3Aoc291cmNlUGF0aCwgZGVzdGluYXRpb25QYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IG9wdGlvbnMub3ZlcndyaXRlIH0pO1xuICAgICAgYXdhaXQgcm0oc291cmNlUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuZnVuY3Rpb24gaXNXaXRoaW5Ib3N0Um9vdChyb290OiBzdHJpbmcsIGNhbmRpZGF0ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlbGF0aXZlID0gcGF0aC5yZWxhdGl2ZShyb290LCBjYW5kaWRhdGUpO1xuICByZXR1cm4gcmVsYXRpdmUgPT09IFwiXCIgfHwgKCFyZWxhdGl2ZS5zdGFydHNXaXRoKFwiLi5cIikgJiYgIXBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZSkpO1xufVxuXG5mdW5jdGlvbiBpc0Vycm5vKGVycjogdW5rbm93biwgY29kZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIGVyciA9PT0gXCJvYmplY3RcIiAmJlxuICAgIGVyciAhPT0gbnVsbCAmJlxuICAgIFwiY29kZVwiIGluIGVyciAmJlxuICAgIChlcnIgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSBjb2RlXG4gICk7XG59XG5cbmZ1bmN0aW9uIGVudHJ5VHlwZShlbnRyeToge1xuICBpc0ZpbGUoKTogYm9vbGVhbjtcbiAgaXNEaXJlY3RvcnkoKTogYm9vbGVhbjtcbiAgaXNTeW1ib2xpY0xpbmsoKTogYm9vbGVhbjtcbn0pOiBGaWxlRW50cnlUeXBlIHtcbiAgaWYgKGVudHJ5LmlzU3ltYm9saWNMaW5rKCkpIHJldHVybiBcInN5bWJvbGljLWxpbmtcIjtcbiAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHJldHVybiBcImRpcmVjdG9yeVwiO1xuICBpZiAoZW50cnkuaXNGaWxlKCkpIHJldHVybiBcImZpbGVcIjtcbiAgcmV0dXJuIFwib3RoZXJcIjtcbn1cblxuLyoqIE5vZGUgZXJybm8gLT4gcG9ydGFibGUge0BsaW5rIEZpbGVTeXN0ZW1FcnJvckNvZGV9LiAqL1xuY29uc3QgTk9ERV9FUlJPUl9DT0RFUzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgRmlsZVN5c3RlbUVycm9yQ29kZT4+ID0ge1xuICBFTk9FTlQ6IFwiTk9UX0ZPVU5EXCIsXG4gIEVFWElTVDogXCJBTFJFQURZX0VYSVNUU1wiLFxuICBFTk9URElSOiBcIk5PVF9ESVJFQ1RPUllcIixcbiAgRUlTRElSOiBcIklTX0RJUkVDVE9SWVwiLFxuICBFTk9URU1QVFk6IFwiRElSRUNUT1JZX05PVF9FTVBUWVwiLFxuICBFQUNDRVM6IFwiUEVSTUlTU0lPTl9ERU5JRURcIixcbiAgRVBFUk06IFwiUEVSTUlTU0lPTl9ERU5JRURcIixcbn07XG5cbmZ1bmN0aW9uIG5vZGVFcnJvckNvZGUoZXJyOiB1bmtub3duKTogRmlsZVN5c3RlbUVycm9yQ29kZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvZGUgPSAoZXJyIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB8IHVuZGVmaW5lZCk/LmNvZGU7XG4gIHJldHVybiBjb2RlID8gTk9ERV9FUlJPUl9DT0RFU1tjb2RlXSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiB7QGxpbmsgTG9jYWxGaWxlU3lzdGVtfSByb290ZWQgdW5kZXIge0BsaW5rIHJlc29sdmVMb2NhbEhvbWV9LCB3aXRoXG4gKiB7QGxpbmsgcmVsYXRpdmVSb290fSBqb2luZWQgYXMgYSByZWxhdGl2ZSBwYXRoIChsZWFkaW5nIGAvYCAvIGB+YCBzdHJpcHBlZFxuICogc28gdGhlIHJlc3VsdCBzdGF5cyB1bmRlciBob21lKS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IGNhY2hlID0gaG9tZUZTKFwiLmNhY2hlL215LWFwcFwiKTtcbiAqIGF3YWl0IGNhY2hlLndyaXRlRmlsZShcInN0YXRlLmpzb25cIiwgXCJ7fVwiKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gaG9tZUZTKFxuICByZWxhdGl2ZVJvb3Q6IHN0cmluZyA9IFwiLlwiLFxuICBvcHRpb25zOiBPc0ZpbGVTeXN0ZW1PcHRpb25zID0ge30sXG4pOiBMb2NhbEZpbGVTeXN0ZW0ge1xuICBjb25zdCB7IG9zLCAuLi5mc09wdGlvbnMgfSA9IG9wdGlvbnM7XG4gIHJldHVybiBuZXcgTG9jYWxGaWxlU3lzdGVtKHtcbiAgICAuLi5mc09wdGlvbnMsXG4gICAgcm9vdDogam9pblVuZGVyQmFzZShyZXNvbHZlTG9jYWxIb21lKG9zKSwgcmVsYXRpdmVSb290KSxcbiAgfSk7XG59XG5cbi8qKlxuICoge0BsaW5rIExvY2FsRmlsZVN5c3RlbX0gcm9vdGVkIHVuZGVyIHtAbGluayByZXNvbHZlTG9jYWxUZW1wfSwgd2l0aFxuICoge0BsaW5rIHJlbGF0aXZlUm9vdH0gam9pbmVkIGFzIGEgcmVsYXRpdmUgcGF0aCAobGVhZGluZyBgL2AgLyBgfmAgc3RyaXBwZWRcbiAqIHNvIHRoZSByZXN1bHQgc3RheXMgdW5kZXIgdGVtcCkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCBzY3JhdGNoID0gdG1wRlMoXCJqb2ItNDJcIik7XG4gKiBhd2FpdCBzY3JhdGNoLndyaXRlRmlsZShcIm91dC5iaW5cIiwgYnl0ZXMpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0bXBGUyhcbiAgcmVsYXRpdmVSb290OiBzdHJpbmcgPSBcIi5cIixcbiAgb3B0aW9uczogT3NGaWxlU3lzdGVtT3B0aW9ucyA9IHt9LFxuKTogTG9jYWxGaWxlU3lzdGVtIHtcbiAgY29uc3QgeyBvcywgLi4uZnNPcHRpb25zIH0gPSBvcHRpb25zO1xuICByZXR1cm4gbmV3IExvY2FsRmlsZVN5c3RlbSh7XG4gICAgLi4uZnNPcHRpb25zLFxuICAgIHJvb3Q6IGpvaW5VbmRlckJhc2UocmVzb2x2ZUxvY2FsVGVtcChvcyksIHJlbGF0aXZlUm9vdCksXG4gIH0pO1xufVxuXG4vKipcbiAqIHtAbGluayB0bXBGU30gdW5kZXIgYSByb290IHRoYXQgaXMgdW5pcXVlIHBlciBjYWxsIChgPHByZWZpeD4tPGlkPmApLCBmb3IgYVxuICogc2NyYXRjaCBhcmVhIG5vIG90aGVyIHByb2Nlc3Mgb3IgcnVuIGNhbiBjb2xsaWRlIHdpdGguXG4gKlxuICogUHJlZmVyIHRoaXMgb3ZlciBtaW50aW5nIHRoZSBpZCBhdCB0aGUgY2FsbCBzaXRlIC0gaXQgaXMgdGhlIG9uZSBwbGFjZSB0aGF0XG4gKiBkZWNpZGVzIHdoYXQgYSB0aHJvd2F3YXkgd29ya2luZyBkaXJlY3RvcnkgbG9va3MgbGlrZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IHNjcmF0Y2ggPSBzY3JhdGNoRlMoXCJyZW1vdGUtc2tpbGxzXCIpO1xuICogYXdhaXQgc2NyYXRjaC53cml0ZUZpbGUoXCJTS0lMTC5tZFwiLCBib2R5KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2NyYXRjaEZTKHByZWZpeDogc3RyaW5nLCBvcHRpb25zOiBPc0ZpbGVTeXN0ZW1PcHRpb25zID0ge30pOiBMb2NhbEZpbGVTeXN0ZW0ge1xuICByZXR1cm4gdG1wRlMoYCR7cHJlZml4fS0ke2hhc2guaWQoKX1gLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBSZWJ1aWxkIHRoZSBTVEFCTEUgdGVtcCB0cmVlIG5hbWVkIGJ5IHtAbGluayBrZXl9LCBldmVyeSBjYWxsLlxuICpcbiAqIHtAbGluayBtYXRlcmlhbGl6ZX0gd3JpdGVzIGludG8gYSB0aHJvd2F3YXkge0BsaW5rIHNjcmF0Y2hGU30gcm9vdDsgb25seSBvblxuICogc3VjY2VzcyBkb2VzIHRoYXQgcm9vdCBSRVBMQUNFIHRoZSBzdGFibGUgb25lLiBUd28gcHJvcGVydGllcyBmYWxsIG91dCBvZlxuICogdGhhdCBvcmRlcmluZywgYW5kIGJvdGggYXJlIHRoZSByZWFzb24gdG8gcHJlZmVyIHRoaXMgb3ZlciB3cml0aW5nIGludG8gdGhlXG4gKiBzdGFibGUgcGF0aCBkaXJlY3RseTpcbiAqXG4gKiAtIHJlcGVhdGVkIHJ1bnMgcmV1c2UgT05FIGRpcmVjdG9yeSBpbnN0ZWFkIG9mIGxlYXZpbmcgYSBuZXcgc2NyYXRjaCBiZWhpbmRcbiAqICAgb24gZXZlcnkgYm9vdCwgYW5kXG4gKiAtIGEgcmVhZGVyIG5ldmVyIG9ic2VydmVzIGEgaGFsZi13cml0dGVuIHRyZWUsIGFuZCBhIGZhaWxlZCByZWJ1aWxkIGxlYXZlc1xuICogICB0aGUgcHJldmlvdXMgb25lIGludGFjdC5cbiAqXG4gKiBUaGUgc3dhcCBpcyBhIGByZW5hbWVgIHdpdGhpbiB0aGUgc2FtZSB0ZW1wIHJvb3QsIHNvIGl0IGlzIGF0b21pYy5cbiAqXG4gKiBAcGFyYW0ga2V5IC0gU3RhYmxlIHRlbXAtcmVsYXRpdmUgcGF0aC4gTWF5IGJlIG5lc3RlZCAoYFwic2tpbGxzL2FiYzEyM1wiYClcbiAqICAgdG8gZ2l2ZSBlYWNoIGlucHV0IGl0cyBvd24gZGlyZWN0b3J5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3Qgc2tpbGxzID0gYXdhaXQgcmVidWlsZEZTKFwiYWdlbnQtc2tpbGxzXCIsIChzY3JhdGNoKSA9PlxuICogICBkb3dubG9hZEludG8oc2NyYXRjaC5yb290KSxcbiAqICk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYnVpbGRGUyhcbiAga2V5OiBzdHJpbmcsXG4gIG1hdGVyaWFsaXplOiAoc2NyYXRjaDogTG9jYWxGaWxlU3lzdGVtKSA9PiBQcm9taXNlPHZvaWQ+LFxuICBvcHRpb25zOiBPc0ZpbGVTeXN0ZW1PcHRpb25zID0ge30sXG4pOiBQcm9taXNlPExvY2FsRmlsZVN5c3RlbT4ge1xuICBjb25zdCBzY3JhdGNoID0gc2NyYXRjaEZTKGtleSwgb3B0aW9ucyk7XG4gIGF3YWl0IHNjcmF0Y2guaW5pdCgpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgbWF0ZXJpYWxpemUoc2NyYXRjaCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGF3YWl0IHJtKHNjcmF0Y2gucm9vdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgdGhyb3cgZXJyO1xuICB9XG5cbiAgY29uc3Qgc3RhYmxlID0gdG1wRlMoa2V5LCBvcHRpb25zKTtcbiAgY29uc3Qgc3RhYmxlSG9zdCA9IHBhdGgucmVzb2x2ZShzdGFibGUucm9vdCk7XG4gIGF3YWl0IHJtKHN0YWJsZUhvc3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgYXdhaXQgbWtkaXIocGF0aC5kaXJuYW1lKHN0YWJsZUhvc3QpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgcmVuYW1lKHBhdGgucmVzb2x2ZShzY3JhdGNoLnJvb3QpLCBzdGFibGVIb3N0KTtcbiAgcmV0dXJuIHN0YWJsZTtcbn1cblxuLyoqXG4gKiBKb2luIHtAbGluayByZWxhdGl2ZVJvb3R9IHVuZGVyIHtAbGluayBiYXNlfS4gRW1wdHkgLyBgLmAga2VlcHMge0BsaW5rIGJhc2V9O1xuICogbGVhZGluZyBgfmAgb3IgYC9gIGlzIHN0cmlwcGVkIHNvIGFuIGFic29sdXRlLWxvb2tpbmcgaW5wdXQgY2Fubm90IGVzY2FwZS5cbiAqL1xuZnVuY3Rpb24gam9pblVuZGVyQmFzZShiYXNlOiBzdHJpbmcsIHJlbGF0aXZlUm9vdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzdCA9IHBvc2l4UGF0aC50b1JlbGF0aXZlU2VnbWVudChyZWxhdGl2ZVJvb3QpO1xuICByZXR1cm4gcmVzdCA/IHBhdGgucmVzb2x2ZShiYXNlLCByZXN0KSA6IGJhc2U7XG59XG4iXX0=
|
|
334
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbG9jYWwtZnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQ0wsVUFBVSxFQUNWLEVBQUUsRUFDRixLQUFLLEVBQ0wsS0FBSyxFQUNMLE9BQU8sRUFDUCxRQUFRLEVBQ1IsUUFBUSxFQUNSLE1BQU0sRUFDTixFQUFFLEVBQ0YsS0FBSyxFQUNMLFNBQVMsR0FDVixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlDLE9BQU8sRUFDTCxjQUFjLEVBQ2QsTUFBTSxFQUNOLGVBQWUsRUFDZixTQUFTLEdBT1YsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQThCLE1BQU0sY0FBYyxDQUFDO0FBOEM5Rjs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sT0FBTyxlQUFnQixTQUFRLGNBQXVCO0lBQ3pDLFNBQVMsQ0FBVTtJQUNwQywrREFBK0Q7SUFDdkQsUUFBUSxDQUFTO0lBRXpCLFlBQVksT0FBK0I7UUFDekMsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUQsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDbEUsS0FBSyxDQUFDO1lBQ0osRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLElBQUksU0FBUyxJQUFJLENB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RyxTQUFTLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDdkQsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDaEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSG9zdC1sb2NhbCB7QGxpbmsgRmlsZVN5c3RlbX0gYmFja2VkIGJ5IE5vZGUncyBgbm9kZTpmcy9wcm9taXNlc2AuXG4gKlxuICogRXh0ZW5kcyB7QGxpbmsgQmFzZUZpbGVTeXN0ZW19IHNvIHRoaXMgbW9kdWxlIG9ubHkgb3ducyBOb2RlIEkvTywgaG9zdCBwYXRoXG4gKiBjb252ZXJzaW9uLCBhbmQgc3ltbGluayBjb250YWlubWVudC4gUG9ydGFibGUgYmVoYXZpb3IgKGVuY29kaW5nLCByZWN1cnNpb24sXG4gKiBwYXJlbnQgY3JlYXRpb24sIGZhbGxiYWNrcywgUE9TSVggbmFtZXNwYWNlIHBhdGhzKSBsaXZlcyBpbiBgQGRieC10b29scy9zaGFyZWQtZnNgLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQge1xuICBhcHBlbmRGaWxlLFxuICBjcCxcbiAgbHN0YXQsXG4gIG1rZGlyLFxuICByZWFkZGlyLFxuICByZWFkRmlsZSxcbiAgcmVhbHBhdGgsXG4gIHJlbmFtZSxcbiAgcm0sXG4gIHJtZGlyLFxuICB3cml0ZUZpbGUsXG59IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBmaWxlTG9jayB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB7IGhhc2ggfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgQmFzZUZpbGVTeXN0ZW0sXG4gIGJhc2VGUyxcbiAgRmlsZVN5c3RlbUVycm9yLFxuICBwb3NpeFBhdGgsXG4gIHR5cGUgQ29weU9wdGlvbnMsXG4gIHR5cGUgRmlsZUVudHJ5LFxuICB0eXBlIEZpbGVFbnRyeVR5cGUsXG4gIHR5cGUgRmlsZVN0YXQsXG4gIHR5cGUgRmlsZVN5c3RlbUVycm9yQ29kZSxcbiAgdHlwZSBXcml0ZUZpbGVPcHRpb25zLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtZnNcIjtcbmltcG9ydCB7IHJlc29sdmVMb2NhbFJvb3QgfSBmcm9tIFwiLi9sb2NhbC1wYXRoLnRzXCI7XG5pbXBvcnQgeyByZXNvbHZlTG9jYWxIb21lLCByZXNvbHZlTG9jYWxUZW1wLCB0eXBlIFJlc29sdmVPc1BhdGhzT3B0aW9ucyB9IGZyb20gXCIuL29zLXBhdGgudHNcIjtcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBMb2NhbEZpbGVTeXN0ZW19LiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2NhbEZpbGVTeXN0ZW1PcHRpb25zIHtcbiAgLyoqIFVuaXF1ZSBpZGVudGlmaWVyLiBEZWZhdWx0cyB0byBhIHN0YWJsZSBoYXNoIG9mIHRoZSBhYnNvbHV0ZSByb290LiAqL1xuICBpZD86IHN0cmluZztcblxuICAvKipcbiAgICogUm9vdCBkaXJlY3Rvcnkgb24gZGlzay4gUmVsYXRpdmUgcGF0aHMgcmVzb2x2ZSBhZ2FpbnN0IGBwcm9jZXNzLmN3ZCgpYC5cbiAgICogYH5gIC8gYH4vLi4uYCBleHBhbmQgdmlhIGBvcy5ob21lZGlyKClgIChiZWZvcmUgYEhPTUVgKSwgQXBwIGAvaG9tZS9hcHBgLFxuICAgKiBvciBhIGNyZWF0ZWQgYC4vLmhvbWVgIChjcmVhdGUgZmFpbHVyZXMgc2tpcCkuXG4gICAqIFN0b3JlZCBvbiB7QGxpbmsgTG9jYWxGaWxlU3lzdGVtLnJvb3R9IGluIFBPU0lYIGZvcm0uXG4gICAqL1xuICByb290OiBzdHJpbmc7XG5cbiAgLyoqIEJsb2NrIGFsbCB3cml0ZSBvcGVyYXRpb25zLiBEZWZhdWx0cyB0byBmYWxzZS4gKi9cbiAgcmVhZE9ubHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBLZWVwIGV2ZXJ5IHJlc29sdmVkIHBhdGggdW5kZXIge0BsaW5rIHJvb3R9LiBEZWZhdWx0cyB0byB0cnVlLlxuICAgKiBXaGVuIGZhbHNlLCBhYnNvbHV0ZSBpbnB1dCBwYXRocyBhcmUgYWNjZXB0ZWQgYXMtaXMgKG5vIHNhbmRib3gpLlxuICAgKi9cbiAgY29udGFpbmVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ3JlYXRlIHtAbGluayByb290fSAoYW5kIHBhcmVudHMpIGR1cmluZyBpbml0LiBEZWZhdWx0cyB0byB0cnVlLlxuICAgKi9cbiAgY3JlYXRlUm9vdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluamVjdGFibGVzIGZvcndhcmRlZCB0byB7QGxpbmsgcmVzb2x2ZUxvY2FsUm9vdH0gZm9yIGB+YCBleHBhbnNpb24gKGhvbWUgL1xuICAgKiB0ZW1wIC8gY3dkIG92ZXJyaWRlcykuIE1haW5seSBmb3IgdGVzdHM6IGJ1bidzIGBvcy5ob21lZGlyKClgIGlnbm9yZXMgYVxuICAgKiBwcm9jZXNzLXNldCBgSE9NRWAsIHNvIG92ZXJyaWRpbmcgaG9tZSB2aWEgYHsgb3M6IHsgaG9tZURpciB9IH1gIGlzIHRoZVxuICAgKiBydW50aW1lLWFnbm9zdGljIHdheSB0byBwb2ludCBhIGB+YCByb290IGF0IGEgY2hvc2VuIGRpcmVjdG9yeS5cbiAgICovXG4gIG9zPzogUmVzb2x2ZU9zUGF0aHNPcHRpb25zO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSBmYWN0b3JpZXMgdGhhdCB0YWtlIHRoZWlyIHJvb3QgRlJPTSB0aGUgT1NcbiAqICh7QGxpbmsgaG9tZUZTfSAvIHtAbGluayB0bXBGU30gLyB7QGxpbmsgc2NyYXRjaEZTfSkgcmF0aGVyIHRoYW4gZnJvbSB0aGVcbiAqIGNhbGxlcjoge0BsaW5rIExvY2FsRmlsZVN5c3RlbU9wdGlvbnN9IHdpdGhvdXQgYHJvb3RgLCBwbHVzIHRoZVxuICoge0BsaW5rIHJlc29sdmVPc1BhdGhzfSBpbmplY3RhYmxlcy5cbiAqL1xuZXhwb3J0IHR5cGUgT3NGaWxlU3lzdGVtT3B0aW9ucyA9IE9taXQ8TG9jYWxGaWxlU3lzdGVtT3B0aW9ucywgXCJyb290XCI+O1xuXG4vKipcbiAqIHtAbGluayBGaWxlU3lzdGVtfSBpbXBsZW1lbnRhdGlvbiB0aGF0IHN0b3JlcyBmaWxlcyBpbiBhIGZvbGRlciBvbiB0aGUgbG9jYWxcbiAqIG1hY2hpbmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCBmcyA9IG5ldyBMb2NhbEZpbGVTeXN0ZW0oeyByb290OiBcIi4vZGF0YVwiIH0pO1xuICogYXdhaXQgZnMuaW5pdCgpO1xuICogYXdhaXQgZnMud3JpdGVGaWxlKFwiaGVsbG8udHh0XCIsIFwiaGlcIik7XG4gKlxuICogY29uc3QgaG9tZSA9IG5ldyBMb2NhbEZpbGVTeXN0ZW0oeyByb290OiBcIn4vcHJvamVjdHMvZGF0YVwiIH0pO1xuICogY29uc3Qgc2NyYXRjaCA9IHRtcEZTKFwibXktam9iXCIpO1xuICogY29uc3QgY2FjaGUgPSBob21lRlMoXCIuY2FjaGUvYXBwXCIpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2NhbEZpbGVTeXN0ZW0gZXh0ZW5kcyBCYXNlRmlsZVN5c3RlbTxcImxvY2FsXCI+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZWQ6IGJvb2xlYW47XG4gIC8qKiBTeW1saW5rLXJlc29sdmVkIGhvc3Qgcm9vdCwgcmVmcmVzaGVkIGluIHtAbGluayBvbkluaXR9LiAqL1xuICBwcml2YXRlIHJlYWxSb290OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTG9jYWxGaWxlU3lzdGVtT3B0aW9ucykge1xuICAgIGNvbnN0IGhvc3RSb290ID0gcmVzb2x2ZUxvY2FsUm9vdChvcHRpb25zLnJvb3QsIG9wdGlvbnMub3MpO1xuICAgIGNvbnN0IHJvb3QgPSBwb3NpeFBhdGgubm9ybWFsaXplUm9vdChwb3NpeFBhdGgudG9Qb3NpeChob3N0Um9vdCkpO1xuICAgIHN1cGVyKHtcbiAgICAgIGlkOiBvcHRpb25zLmlkID8/IGBsb2NhbC0ke2hhc2guZm52SGFzaChyb290KX1gLFxuICAgICAgYmFja2VuZDogXCJsb2NhbFwiLFxuICAgICAgcm9vdCxcbiAgICAgIHJlYWRPbmx5OiBvcHRpb25zLnJlYWRPbmx5LFxuICAgICAgY3JlYXRlUm9vdDogb3B0aW9ucy5jcmVhdGVSb290ID8/IHRydWUsXG4gICAgfSk7XG4gICAgdGhpcy5yZWFsUm9vdCA9IHRoaXMudG9CYWNrZW5kUGF0aChyb290KTtcbiAgICB0aGlzLmNvbnRhaW5lZCA9IG9wdGlvbnMuY29udGFpbmVkID8/IHRydWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdG9CYWNrZW5kUGF0aChwb3NpeEJhY2tlbmRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBwb3NpeFBhdGgudG9Ib3N0KHBvc2l4QmFja2VuZFBhdGgsIHBhdGguc2VwKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVSb290RGlyZWN0b3J5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IG1rZGlyKHRoaXMudG9CYWNrZW5kUGF0aCh0aGlzLnJvb3QpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBvbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaG9zdFJvb3QgPSB0aGlzLnRvQmFja2VuZFBhdGgodGhpcy5yb290KTtcbiAgICBpZiAoIXRoaXMuY3JlYXRlUm9vdCkge1xuICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IGxzdGF0KGhvc3RSb290KTtcbiAgICAgIGlmICghaW5mby5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXJyb3IoXG4gICAgICAgICAgXCJOT1RfRElSRUNUT1JZXCIsXG4gICAgICAgICAgYExvY2FsIGZpbGVzeXN0ZW0gcm9vdCBpcyBub3QgYSBkaXJlY3Rvcnk6ICR7dGhpcy5yb290fWAsXG4gICAgICAgICAgdGhpcy5yb290LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBDYW5vbmljYWxpemUgc28gY29udGFpbm1lbnQgY2hlY2tzIHN1cnZpdmUgT1Mgcm9vdCBzeW1saW5rcyAoZS5nLiAvdmFyIC0+IC9wcml2YXRlL3ZhcikuXG4gICAgdGhpcy5yZWFsUm9vdCA9IGF3YWl0IHJlYWxwYXRoKGhvc3RSb290KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlc29sdmVQYXRoKGlucHV0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuY29udGFpbmVkKSB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IHBhdGguaXNBYnNvbHV0ZShpbnB1dFBhdGgpXG4gICAgICAgID8gcGF0aC5yZXNvbHZlKGlucHV0UGF0aClcbiAgICAgICAgOiBwYXRoLnJlc29sdmUodGhpcy50b0JhY2tlbmRQYXRoKHRoaXMucm9vdCksIGlucHV0UGF0aCk7XG4gICAgICByZXR1cm4gdGhpcy50b0JhY2tlbmRQYXRoKHBvc2l4UGF0aC50b1Bvc2l4KHJlc29sdmVkKSk7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5yZXNvbHZlUGF0aChpbnB1dFBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gY29udGFpbmVkLCByZXNvbHZlIHN5bWxpbmtzIGFuZCBlbnN1cmUgdGhlIHJlYWwgcGF0aCBzdGlsbCBzaXRzIHVuZGVyXG4gICAqIHtAbGluayByb290fS4gTWlzc2luZyBsZWFmIHBhdGhzIGFyZSBhbGxvd2VkIHdoZW4gYGFsbG93TWlzc2luZ2AgaXMgc2V0IHNvXG4gICAqIHdyaXRlcyBjYW4gY3JlYXRlIG5ldyBmaWxlcy5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBwcmVwYXJlUGF0aChcbiAgICByZXNvbHZlZFBhdGg6IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyBhbGxvd01pc3Npbmc/OiBib29sZWFuIH0sXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lZCkgcmV0dXJuIHJlc29sdmVkUGF0aDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVhbCA9IGF3YWl0IHJlYWxwYXRoKHJlc29sdmVkUGF0aCk7XG4gICAgICBpZiAoIWlzV2l0aGluSG9zdFJvb3QodGhpcy5yZWFsUm9vdCwgcmVhbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FcnJvcihcbiAgICAgICAgICBcIlBFUk1JU1NJT05fREVOSUVEXCIsXG4gICAgICAgICAgXCJQYXRoIGVzY2FwZXMgdGhlIGZpbGVzeXN0ZW0gcm9vdFwiLFxuICAgICAgICAgIHJlc29sdmVkUGF0aCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNvbHZlZFBhdGg7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRmlsZVN5c3RlbUVycm9yKSB0aHJvdyBlcnI7XG4gICAgICBpZiAob3B0aW9ucz8uYWxsb3dNaXNzaW5nICYmIGlzRXJybm8oZXJyLCBcIkVOT0VOVFwiKSkge1xuICAgICAgICBsZXQgY3Vyc29yID0gcGF0aC5kaXJuYW1lKHJlc29sdmVkUGF0aCk7XG4gICAgICAgIHdoaWxlIChjdXJzb3IgIT09IHBhdGguZGlybmFtZShjdXJzb3IpKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlYWwgPSBhd2FpdCByZWFscGF0aChjdXJzb3IpO1xuICAgICAgICAgICAgaWYgKCFpc1dpdGhpbkhvc3RSb290KHRoaXMucmVhbFJvb3QsIHJlYWwpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlU3lzdGVtRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJQRVJNSVNTSU9OX0RFTklFRFwiLFxuICAgICAgICAgICAgICAgIFwiUGF0aCBlc2NhcGVzIHRoZSBmaWxlc3lzdGVtIHJvb3RcIixcbiAgICAgICAgICAgICAgICByZXNvbHZlZFBhdGgsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZWRQYXRoO1xuICAgICAgICAgIH0gY2F0Y2ggKGlubmVyKSB7XG4gICAgICAgICAgICBpZiAoaW5uZXIgaW5zdGFuY2VvZiBGaWxlU3lzdGVtRXJyb3IpIHRocm93IGlubmVyO1xuICAgICAgICAgICAgaWYgKCFpc0Vycm5vKGlubmVyLCBcIkVOT0VOVFwiKSkgdGhyb3cgdGhpcy5tYXBFcnJvcihpbm5lciwgcmVzb2x2ZWRQYXRoKTtcbiAgICAgICAgICAgIGN1cnNvciA9IHBhdGguZGlybmFtZShjdXJzb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzb2x2ZWRQYXRoO1xuICAgICAgfVxuICAgICAgdGhyb3cgdGhpcy5tYXBFcnJvcihlcnIsIHJlc29sdmVkUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENsYXNzaWZ5IE5vZGUgZXJybm8gY29kZXM7IHtAbGluayBCYXNlRmlsZVN5c3RlbX0gd3JhcHMgZXZlcnkgcHJpbWl0aXZlLiAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgbWFwRXJyb3IoZXJyOiB1bmtub3duLCBmaWxlUGF0aDogc3RyaW5nKTogRmlsZVN5c3RlbUVycm9yIHtcbiAgICByZXR1cm4gYmFzZUZTLm1hcEZpbGVTeXN0ZW1FcnJvcihlcnIsIGZpbGVQYXRoLCBub2RlRXJyb3JDb2RlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyByZWFkQnl0ZXNBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHJlYWRGaWxlKHJlc29sdmVkUGF0aCk7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ1ZmZlci5idWZmZXIsIGJ1ZmZlci5ieXRlT2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgd3JpdGVCeXRlc0F0KFxuICAgIHJlc29sdmVkUGF0aDogc3RyaW5nLFxuICAgIGNvbnRlbnQ6IFVpbnQ4QXJyYXksXG4gICAgb3B0aW9uczogUmVxdWlyZWQ8V3JpdGVGaWxlT3B0aW9ucz4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHdyaXRlRmlsZShyZXNvbHZlZFBhdGgsIGNvbnRlbnQsIG9wdGlvbnMub3ZlcndyaXRlID8gdW5kZWZpbmVkIDogeyBmbGFnOiBcInd4XCIgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlRmlsZUF0KHJlc29sdmVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgcm0ocmVzb2x2ZWRQYXRoLCB7IGZvcmNlOiBmYWxzZSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVEaXJlY3RvcnlBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IG1rZGlyKHJlc29sdmVkUGF0aCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgcmVtb3ZlRGlyZWN0b3J5QXQocmVzb2x2ZWRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBybWRpcihyZXNvbHZlZFBhdGgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGxpc3REaXJlY3RvcnlBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8RmlsZUVudHJ5W10+IHtcbiAgICBjb25zdCBkaXJlbnRzID0gYXdhaXQgcmVhZGRpcihyZXNvbHZlZFBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBjb25zdCBlbnRyaWVzOiBGaWxlRW50cnlbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZGlyZW50IG9mIGRpcmVudHMpIHtcbiAgICAgIGNvbnN0IHR5cGUgPSBlbnRyeVR5cGUoZGlyZW50KTtcbiAgICAgIGxldCBzaXplOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAodHlwZSA9PT0gXCJmaWxlXCIgfHwgdHlwZSA9PT0gXCJzeW1ib2xpYy1saW5rXCIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzaXplID0gKGF3YWl0IGxzdGF0KHBhdGguam9pbihyZXNvbHZlZFBhdGgsIGRpcmVudC5uYW1lKSkpLnNpemU7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIFJhY2Ugd2l0aCBjb25jdXJyZW50IGRlbGV0ZXM7IG9taXQgc2l6ZS5cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZW50cmllcy5wdXNoKFxuICAgICAgICBzaXplID09PSB1bmRlZmluZWQgPyB7IG5hbWU6IGRpcmVudC5uYW1lLCB0eXBlIH0gOiB7IG5hbWU6IGRpcmVudC5uYW1lLCB0eXBlLCBzaXplIH0sXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZW50cmllcztcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBzdGF0QXQocmVzb2x2ZWRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPE9taXQ8RmlsZVN0YXQsIFwicGF0aFwiPj4ge1xuICAgIGNvbnN0IGluZm8gPSBhd2FpdCBsc3RhdChyZXNvbHZlZFBhdGgpO1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBwYXRoLmJhc2VuYW1lKHJlc29sdmVkUGF0aCkgfHwgcGF0aC5iYXNlbmFtZSh0aGlzLnRvQmFja2VuZFBhdGgodGhpcy5yb290KSksXG4gICAgICB0eXBlOiBlbnRyeVR5cGUoaW5mbyksXG4gICAgICBzaXplOiBpbmZvLnNpemUsXG4gICAgICBjcmVhdGVkQXQ6IGluZm8uYmlydGh0aW1lLFxuICAgICAgbW9kaWZpZWRBdDogaW5mby5tdGltZSxcbiAgICAgIGFjY2Vzc2VkQXQ6IGluZm8uYXRpbWUsXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBpc05vdEZvdW5kRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgKGVycm9yIGluc3RhbmNlb2YgRmlsZVN5c3RlbUVycm9yICYmIGVycm9yLmNvZGUgPT09IFwiTk9UX0ZPVU5EXCIpIHx8IGlzRXJybm8oZXJyb3IsIFwiRU5PRU5UXCIpXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyB0cnlBcHBlbmRGaWxlQXQoXG4gICAgcmVzb2x2ZWRQYXRoOiBzdHJpbmcsXG4gICAgY29udGVudDogVWludDhBcnJheSxcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgYXdhaXQgYXBwZW5kRmlsZShyZXNvbHZlZFBhdGgsIGNvbnRlbnQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHRyeUNvcHlGaWxlQXQoXG4gICAgc291cmNlUGF0aDogc3RyaW5nLFxuICAgIGRlc3RpbmF0aW9uUGF0aDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFJlcXVpcmVkPENvcHlPcHRpb25zPixcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgYXdhaXQgY3Aoc291cmNlUGF0aCwgZGVzdGluYXRpb25QYXRoLCB7XG4gICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICBmb3JjZTogb3B0aW9ucy5vdmVyd3JpdGUsXG4gICAgICBlcnJvck9uRXhpc3Q6ICFvcHRpb25zLm92ZXJ3cml0ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyB0cnlNb3ZlRmlsZUF0KFxuICAgIHNvdXJjZVBhdGg6IHN0cmluZyxcbiAgICBkZXN0aW5hdGlvblBhdGg6IHN0cmluZyxcbiAgICBvcHRpb25zOiBSZXF1aXJlZDxDb3B5T3B0aW9ucz4sXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCByZW5hbWUoc291cmNlUGF0aCwgZGVzdGluYXRpb25QYXRoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIEFjcm9zcyBkZXZpY2VzIGByZW5hbWVgIGNhbm5vdCB3b3JrOyBmYWxsIGJhY2sgdG8gY29weSArIHJlbW92ZS4gQW55XG4gICAgICAvLyBvdGhlciBmYWlsdXJlIHByb3BhZ2F0ZXMgZm9yIHRoZSBiYXNlIGNsYXNzIHRvIG1hcC5cbiAgICAgIGlmICghaXNFcnJubyhlcnIsIFwiRVhERVZcIikpIHRocm93IGVycjtcbiAgICAgIGF3YWl0IGNwKHNvdXJjZVBhdGgsIGRlc3RpbmF0aW9uUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiBvcHRpb25zLm92ZXJ3cml0ZSB9KTtcbiAgICAgIGF3YWl0IHJtKHNvdXJjZVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmZ1bmN0aW9uIGlzV2l0aGluSG9zdFJvb3Qocm9vdDogc3RyaW5nLCBjYW5kaWRhdGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCByZWxhdGl2ZSA9IHBhdGgucmVsYXRpdmUocm9vdCwgY2FuZGlkYXRlKTtcbiAgcmV0dXJuIHJlbGF0aXZlID09PSBcIlwiIHx8ICghcmVsYXRpdmUuc3RhcnRzV2l0aChcIi4uXCIpICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmUpKTtcbn1cblxuZnVuY3Rpb24gaXNFcnJubyhlcnI6IHVua25vd24sIGNvZGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBlcnIgPT09IFwib2JqZWN0XCIgJiZcbiAgICBlcnIgIT09IG51bGwgJiZcbiAgICBcImNvZGVcIiBpbiBlcnIgJiZcbiAgICAoZXJyIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gY29kZVxuICApO1xufVxuXG5mdW5jdGlvbiBlbnRyeVR5cGUoZW50cnk6IHtcbiAgaXNGaWxlKCk6IGJvb2xlYW47XG4gIGlzRGlyZWN0b3J5KCk6IGJvb2xlYW47XG4gIGlzU3ltYm9saWNMaW5rKCk6IGJvb2xlYW47XG59KTogRmlsZUVudHJ5VHlwZSB7XG4gIGlmIChlbnRyeS5pc1N5bWJvbGljTGluaygpKSByZXR1cm4gXCJzeW1ib2xpYy1saW5rXCI7XG4gIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSByZXR1cm4gXCJkaXJlY3RvcnlcIjtcbiAgaWYgKGVudHJ5LmlzRmlsZSgpKSByZXR1cm4gXCJmaWxlXCI7XG4gIHJldHVybiBcIm90aGVyXCI7XG59XG5cbi8qKiBOb2RlIGVycm5vIC0+IHBvcnRhYmxlIHtAbGluayBGaWxlU3lzdGVtRXJyb3JDb2RlfS4gKi9cbmNvbnN0IE5PREVfRVJST1JfQ09ERVM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIEZpbGVTeXN0ZW1FcnJvckNvZGU+PiA9IHtcbiAgRU5PRU5UOiBcIk5PVF9GT1VORFwiLFxuICBFRVhJU1Q6IFwiQUxSRUFEWV9FWElTVFNcIixcbiAgRU5PVERJUjogXCJOT1RfRElSRUNUT1JZXCIsXG4gIEVJU0RJUjogXCJJU19ESVJFQ1RPUllcIixcbiAgRU5PVEVNUFRZOiBcIkRJUkVDVE9SWV9OT1RfRU1QVFlcIixcbiAgRUFDQ0VTOiBcIlBFUk1JU1NJT05fREVOSUVEXCIsXG4gIEVQRVJNOiBcIlBFUk1JU1NJT05fREVOSUVEXCIsXG59O1xuXG5mdW5jdGlvbiBub2RlRXJyb3JDb2RlKGVycjogdW5rbm93bik6IEZpbGVTeXN0ZW1FcnJvckNvZGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBjb2RlID0gKGVyciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24gfCB1bmRlZmluZWQpPy5jb2RlO1xuICByZXR1cm4gY29kZSA/IE5PREVfRVJST1JfQ09ERVNbY29kZV0gOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICoge0BsaW5rIExvY2FsRmlsZVN5c3RlbX0gcm9vdGVkIHVuZGVyIHtAbGluayByZXNvbHZlTG9jYWxIb21lfSwgd2l0aFxuICoge0BsaW5rIHJlbGF0aXZlUm9vdH0gam9pbmVkIGFzIGEgcmVsYXRpdmUgcGF0aCAobGVhZGluZyBgL2AgLyBgfmAgc3RyaXBwZWRcbiAqIHNvIHRoZSByZXN1bHQgc3RheXMgdW5kZXIgaG9tZSkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCBjYWNoZSA9IGhvbWVGUyhcIi5jYWNoZS9teS1hcHBcIik7XG4gKiBhd2FpdCBjYWNoZS53cml0ZUZpbGUoXCJzdGF0ZS5qc29uXCIsIFwie31cIik7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhvbWVGUyhcbiAgcmVsYXRpdmVSb290OiBzdHJpbmcgPSBcIi5cIixcbiAgb3B0aW9uczogT3NGaWxlU3lzdGVtT3B0aW9ucyA9IHt9LFxuKTogTG9jYWxGaWxlU3lzdGVtIHtcbiAgY29uc3QgeyBvcywgLi4uZnNPcHRpb25zIH0gPSBvcHRpb25zO1xuICByZXR1cm4gbmV3IExvY2FsRmlsZVN5c3RlbSh7XG4gICAgLi4uZnNPcHRpb25zLFxuICAgIHJvb3Q6IGpvaW5VbmRlckJhc2UocmVzb2x2ZUxvY2FsSG9tZShvcyksIHJlbGF0aXZlUm9vdCksXG4gIH0pO1xufVxuXG4vKipcbiAqIHtAbGluayBMb2NhbEZpbGVTeXN0ZW19IHJvb3RlZCB1bmRlciB7QGxpbmsgcmVzb2x2ZUxvY2FsVGVtcH0sIHdpdGhcbiAqIHtAbGluayByZWxhdGl2ZVJvb3R9IGpvaW5lZCBhcyBhIHJlbGF0aXZlIHBhdGggKGxlYWRpbmcgYC9gIC8gYH5gIHN0cmlwcGVkXG4gKiBzbyB0aGUgcmVzdWx0IHN0YXlzIHVuZGVyIHRlbXApLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3Qgc2NyYXRjaCA9IHRtcEZTKFwiam9iLTQyXCIpO1xuICogYXdhaXQgc2NyYXRjaC53cml0ZUZpbGUoXCJvdXQuYmluXCIsIGJ5dGVzKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG1wRlMoXG4gIHJlbGF0aXZlUm9vdDogc3RyaW5nID0gXCIuXCIsXG4gIG9wdGlvbnM6IE9zRmlsZVN5c3RlbU9wdGlvbnMgPSB7fSxcbik6IExvY2FsRmlsZVN5c3RlbSB7XG4gIGNvbnN0IHsgb3MsIC4uLmZzT3B0aW9ucyB9ID0gb3B0aW9ucztcbiAgcmV0dXJuIG5ldyBMb2NhbEZpbGVTeXN0ZW0oe1xuICAgIC4uLmZzT3B0aW9ucyxcbiAgICByb290OiBqb2luVW5kZXJCYXNlKHJlc29sdmVMb2NhbFRlbXAob3MpLCByZWxhdGl2ZVJvb3QpLFxuICB9KTtcbn1cblxuLyoqXG4gKiB7QGxpbmsgdG1wRlN9IHVuZGVyIGEgcm9vdCB0aGF0IGlzIHVuaXF1ZSBwZXIgY2FsbCAoYDxwcmVmaXg+LTxpZD5gKSwgZm9yIGFcbiAqIHNjcmF0Y2ggYXJlYSBubyBvdGhlciBwcm9jZXNzIG9yIHJ1biBjYW4gY29sbGlkZSB3aXRoLlxuICpcbiAqIFByZWZlciB0aGlzIG92ZXIgbWludGluZyB0aGUgaWQgYXQgdGhlIGNhbGwgc2l0ZSAtIGl0IGlzIHRoZSBvbmUgcGxhY2UgdGhhdFxuICogZGVjaWRlcyB3aGF0IGEgdGhyb3dhd2F5IHdvcmtpbmcgZGlyZWN0b3J5IGxvb2tzIGxpa2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCBzY3JhdGNoID0gc2NyYXRjaEZTKFwicmVtb3RlLXNraWxsc1wiKTtcbiAqIGF3YWl0IHNjcmF0Y2gud3JpdGVGaWxlKFwiU0tJTEwubWRcIiwgYm9keSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjcmF0Y2hGUyhwcmVmaXg6IHN0cmluZywgb3B0aW9uczogT3NGaWxlU3lzdGVtT3B0aW9ucyA9IHt9KTogTG9jYWxGaWxlU3lzdGVtIHtcbiAgcmV0dXJuIHRtcEZTKGAke3ByZWZpeH0tJHtoYXNoLmlkKCl9YCwgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogUmVidWlsZCB0aGUgU1RBQkxFIHRlbXAgdHJlZSBuYW1lZCBieSB7QGxpbmsga2V5fSwgZXZlcnkgY2FsbC5cbiAqXG4gKiB7QGxpbmsgbWF0ZXJpYWxpemV9IHdyaXRlcyBpbnRvIGEgdGhyb3dhd2F5IHtAbGluayBzY3JhdGNoRlN9IHJvb3Q7IG9ubHkgb25cbiAqIHN1Y2Nlc3MgZG9lcyB0aGF0IHJvb3QgUkVQTEFDRSB0aGUgc3RhYmxlIG9uZS4gVHdvIHByb3BlcnRpZXMgZmFsbCBvdXQgb2ZcbiAqIHRoYXQgb3JkZXJpbmcsIGFuZCBib3RoIGFyZSB0aGUgcmVhc29uIHRvIHByZWZlciB0aGlzIG92ZXIgd3JpdGluZyBpbnRvIHRoZVxuICogc3RhYmxlIHBhdGggZGlyZWN0bHk6XG4gKlxuICogLSByZXBlYXRlZCBydW5zIHJldXNlIE9ORSBkaXJlY3RvcnkgaW5zdGVhZCBvZiBsZWF2aW5nIGEgbmV3IHNjcmF0Y2ggYmVoaW5kXG4gKiAgIG9uIGV2ZXJ5IGJvb3QsIGFuZFxuICogLSBhIHJlYWRlciBuZXZlciBvYnNlcnZlcyBhIGhhbGYtd3JpdHRlbiB0cmVlLCBhbmQgYSBmYWlsZWQgcmVidWlsZCBsZWF2ZXNcbiAqICAgdGhlIHByZXZpb3VzIG9uZSBpbnRhY3QuXG4gKlxuICogUmVidWlsZHMgdGFyZ2V0aW5nIHRoZSBzYW1lIHN0YWJsZSB0cmVlIGFyZSBzZXJpYWxpemVkIGFjcm9zcyBwcm9jZXNzZXMuXG4gKiBUaGUgc3dhcCBpcyBhIGByZW5hbWVgIHdpdGhpbiB0aGUgc2FtZSB0ZW1wIHJvb3QsIHNvIGl0IGlzIGF0b21pYy5cbiAqXG4gKiBAcGFyYW0ga2V5IC0gU3RhYmxlIHRlbXAtcmVsYXRpdmUgcGF0aC4gTWF5IGJlIG5lc3RlZCAoYFwic2tpbGxzL2FiYzEyM1wiYClcbiAqICAgdG8gZ2l2ZSBlYWNoIGlucHV0IGl0cyBvd24gZGlyZWN0b3J5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3Qgc2tpbGxzID0gYXdhaXQgcmVidWlsZEZTKFwiYWdlbnQtc2tpbGxzXCIsIChzY3JhdGNoKSA9PlxuICogICBkb3dubG9hZEludG8oc2NyYXRjaC5yb290KSxcbiAqICk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYnVpbGRGUyhcbiAga2V5OiBzdHJpbmcsXG4gIG1hdGVyaWFsaXplOiAoc2NyYXRjaDogTG9jYWxGaWxlU3lzdGVtKSA9PiBQcm9taXNlPHZvaWQ+LFxuICBvcHRpb25zOiBPc0ZpbGVTeXN0ZW1PcHRpb25zID0ge30sXG4pOiBQcm9taXNlPExvY2FsRmlsZVN5c3RlbT4ge1xuICBjb25zdCBzY3JhdGNoID0gc2NyYXRjaEZTKGtleSwgb3B0aW9ucyk7XG4gIGF3YWl0IHNjcmF0Y2guaW5pdCgpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgbWF0ZXJpYWxpemUoc2NyYXRjaCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGF3YWl0IHJtKHNjcmF0Y2gucm9vdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgdGhyb3cgZXJyO1xuICB9XG5cbiAgY29uc3Qgc3RhYmxlID0gdG1wRlMoa2V5LCBvcHRpb25zKTtcbiAgY29uc3Qgc3RhYmxlSG9zdCA9IHBhdGgucmVzb2x2ZShzdGFibGUucm9vdCk7XG4gIHJldHVybiBmaWxlTG9jay53aXRoRmlsZUxvY2soW1wicmVidWlsZEZTXCIsIHN0YWJsZUhvc3RdLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgcm0oc3RhYmxlSG9zdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIGF3YWl0IG1rZGlyKHBhdGguZGlybmFtZShzdGFibGVIb3N0KSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgcmVuYW1lKHBhdGgucmVzb2x2ZShzY3JhdGNoLnJvb3QpLCBzdGFibGVIb3N0KTtcbiAgICByZXR1cm4gc3RhYmxlO1xuICB9KTtcbn1cblxuLyoqXG4gKiBKb2luIHtAbGluayByZWxhdGl2ZVJvb3R9IHVuZGVyIHtAbGluayBiYXNlfS4gRW1wdHkgLyBgLmAga2VlcHMge0BsaW5rIGJhc2V9O1xuICogbGVhZGluZyBgfmAgb3IgYC9gIGlzIHN0cmlwcGVkIHNvIGFuIGFic29sdXRlLWxvb2tpbmcgaW5wdXQgY2Fubm90IGVzY2FwZS5cbiAqL1xuZnVuY3Rpb24gam9pblVuZGVyQmFzZShiYXNlOiBzdHJpbmcsIHJlbGF0aXZlUm9vdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzdCA9IHBvc2l4UGF0aC50b1JlbGF0aXZlU2VnbWVudChyZWxhdGl2ZVJvb3QpO1xuICByZXR1cm4gcmVzdCA/IHBhdGgucmVzb2x2ZShiYXNlLCByZXN0KSA6IGJhc2U7XG59XG4iXX0=
|
package/lib/src/os-path.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Home order (mkdir + write/delete probe; failure skips):
|
|
5
5
|
* 1. `os.homedir()`
|
|
6
6
|
* 2. `HOME` / `USERPROFILE`
|
|
7
|
-
* 3. `/home/app` when {@link
|
|
7
|
+
* 3. `/home/app` when {@link envUtil.isAppEnv}
|
|
8
8
|
* 4. `./.home` under cwd
|
|
9
9
|
*
|
|
10
10
|
* Temp order (same ensure/probe/skip):
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
*
|
|
19
19
|
* @module
|
|
20
20
|
*/
|
|
21
|
-
/** Databricks Apps container home when {@link
|
|
21
|
+
/** Databricks Apps container home when {@link envUtil.isAppEnv}. */
|
|
22
22
|
export declare const APP_HOME = "/home/app";
|
|
23
23
|
/** Resolved home + temp for one cwd. */
|
|
24
24
|
export interface OsPaths {
|
package/lib/src/os-path.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Home order (mkdir + write/delete probe; failure skips):
|
|
5
5
|
* 1. `os.homedir()`
|
|
6
6
|
* 2. `HOME` / `USERPROFILE`
|
|
7
|
-
* 3. `/home/app` when {@link
|
|
7
|
+
* 3. `/home/app` when {@link envUtil.isAppEnv}
|
|
8
8
|
* 4. `./.home` under cwd
|
|
9
9
|
*
|
|
10
10
|
* Temp order (same ensure/probe/skip):
|
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
import { mkdirSync, unlinkSync, writeFileSync } from "node:fs";
|
|
22
22
|
import { homedir, tmpdir } from "node:os";
|
|
23
23
|
import path from "node:path";
|
|
24
|
-
import {
|
|
25
|
-
/** Databricks Apps container home when {@link
|
|
24
|
+
import { env as envUtil } from "@dbx-tools/shared-core";
|
|
25
|
+
/** Databricks Apps container home when {@link envUtil.isAppEnv}. */
|
|
26
26
|
export const APP_HOME = "/home/app";
|
|
27
27
|
/** Memoized {@link OsPaths} keyed by resolved cwd. */
|
|
28
28
|
const osPathsCache = new Map();
|
|
@@ -65,7 +65,7 @@ function resolveHome(env, cwd, options) {
|
|
|
65
65
|
tryCall(options.homeDir ?? homedir),
|
|
66
66
|
env.HOME?.trim(),
|
|
67
67
|
env.USERPROFILE?.trim(),
|
|
68
|
-
|
|
68
|
+
envUtil.isAppEnv(env) ? (options.appHome ?? APP_HOME) : undefined,
|
|
69
69
|
];
|
|
70
70
|
for (const candidate of candidates) {
|
|
71
71
|
if (!candidate || tried.has(candidate))
|
|
@@ -140,4 +140,4 @@ function isUsableDir(dir) {
|
|
|
140
140
|
}
|
|
141
141
|
}
|
|
142
142
|
}
|
|
143
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3MtcGF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcy1wYXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzFDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFL0MsdUVBQXVFO0FBQ3ZFLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUM7QUFvQnBDLHNEQUFzRDtBQUN0RCxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBbUIsQ0FBQztBQUVoRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxVQUFpQyxFQUFFO0lBQ2hFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUN2RCxNQUFNLFlBQVksR0FBRyxHQUFHLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUN6RCxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pCLE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEMsSUFBSSxHQUFHO1lBQUUsT0FBTyxHQUFHLENBQUM7SUFDdEIsQ0FBQztJQUVELE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQztJQUN2QyxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPLENB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QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXNvbHZlIGR1cmFibGUgbG9jYWwgaG9tZSBhbmQgdGVtcCBkaXJlY3RvcmllcyBmb3IgTm9kZSBob3N0cy5cbiAqXG4gKiBIb21lIG9yZGVyIChta2RpciArIHdyaXRlL2RlbGV0ZSBwcm9iZTsgZmFpbHVyZSBza2lwcyk6XG4gKiAxLiBgb3MuaG9tZWRpcigpYFxuICogMi4gYEhPTUVgIC8gYFVTRVJQUk9GSUxFYFxuICogMy4gYC9ob21lL2FwcGAgd2hlbiB7QGxpbmsgZGF0YWJyaWNrcy5pc0FwcEVudn1cbiAqIDQuIGAuLy5ob21lYCB1bmRlciBjd2RcbiAqXG4gKiBUZW1wIG9yZGVyIChzYW1lIGVuc3VyZS9wcm9iZS9za2lwKTpcbiAqIDEuIGBvcy50bXBkaXIoKWBcbiAqIDIuIGBUTVBESVJgIC8gYFRNUGAgLyBgVEVNUGBcbiAqIDMuIGAudG1wYCB1bmRlciB0aGUgcmVzb2x2ZWQgaG9tZVxuICpcbiAqIEJvdGggcGF0aHMgYXJlIG1lbW9pemVkIHBlciByZXNvbHZlZCBjd2QgKHNhbWUgaWRlYSBhc1xuICogYEBkYngtdG9vbHMvY29yZWAgYHByb2plY3RgIGNvbW1hbmQgY2FjaGluZyk6IGN3ZCBpcyBwYXJ0IG9mIHRoZSBrZXkgYmVjYXVzZVxuICogdGhlIGAuLy5ob21lYCAvIGA8aG9tZT4vLnRtcGAgZmFsbGJhY2tzIGRlcGVuZCBvbiBpdC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgbWtkaXJTeW5jLCB1bmxpbmtTeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGhvbWVkaXIsIHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBkYXRhYnJpY2tzIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5cbi8qKiBEYXRhYnJpY2tzIEFwcHMgY29udGFpbmVyIGhvbWUgd2hlbiB7QGxpbmsgZGF0YWJyaWNrcy5pc0FwcEVudn0uICovXG5leHBvcnQgY29uc3QgQVBQX0hPTUUgPSBcIi9ob21lL2FwcFwiO1xuXG4vKiogUmVzb2x2ZWQgaG9tZSArIHRlbXAgZm9yIG9uZSBjd2QuICovXG5leHBvcnQgaW50ZXJmYWNlIE9zUGF0aHMge1xuICByZWFkb25seSBob21lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRtcDogc3RyaW5nO1xufVxuXG4vKiogSW5qZWN0YWJsZSBrbm9icyBmb3Ige0BsaW5rIHJlc29sdmVPc1BhdGhzfSAobW9zdGx5IHRlc3RzKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZU9zUGF0aHNPcHRpb25zIHtcbiAgZW52PzogTm9kZUpTLlByb2Nlc3NFbnY7XG4gIGN3ZD86IHN0cmluZztcbiAgLyoqIERlZmF1bHRzIHRvIGBvcy5ob21lZGlyYC4gKi9cbiAgaG9tZURpcj86ICgpID0+IHN0cmluZztcbiAgLyoqIERlZmF1bHRzIHRvIGBvcy50bXBkaXJgLiAqL1xuICB0bXBEaXI/OiAoKSA9PiBzdHJpbmc7XG4gIC8qKiBBcHAtZW52IGNhbmRpZGF0ZTsgZGVmYXVsdHMgdG8ge0BsaW5rIEFQUF9IT01FfS4gKi9cbiAgYXBwSG9tZT86IHN0cmluZztcbn1cblxuLyoqIE1lbW9pemVkIHtAbGluayBPc1BhdGhzfSBrZXllZCBieSByZXNvbHZlZCBjd2QuICovXG5jb25zdCBvc1BhdGhzQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgT3NQYXRocz4oKTtcblxuLyoqXG4gKiBSZXNvbHZlIGhvbWUgKyB0ZW1wIGZvciB7QGxpbmsgY3dkfSwgbWVtb2l6ZWQgd2hlbiB7QGxpbmsgY3dkfSBpcyB0aGUgcHJvY2Vzc1xuICogY3dkIChhbiBleHBsaWNpdCBvdGhlciBjd2QgaXMgY29tcHV0ZWQgZnJlc2gsIG1hdGNoaW5nIGNvcmUgYHByb2plY3RgXG4gKiBjYWNoaW5nKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVPc1BhdGhzKG9wdGlvbnM6IFJlc29sdmVPc1BhdGhzT3B0aW9ucyA9IHt9KTogT3NQYXRocyB7XG4gIGNvbnN0IGN3ZCA9IHBhdGgucmVzb2x2ZShvcHRpb25zLmN3ZCA/PyBwcm9jZXNzLmN3ZCgpKTtcbiAgY29uc3QgY2FjaGVFbmFibGVkID0gY3dkID09PSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSk7XG4gIGlmIChjYWNoZUVuYWJsZWQpIHtcbiAgICBjb25zdCBoaXQgPSBvc1BhdGhzQ2FjaGUuZ2V0KGN3ZCk7XG4gICAgaWYgKGhpdCkgcmV0dXJuIGhpdDtcbiAgfVxuXG4gIGNvbnN0IGVudiA9IG9wdGlvbnMuZW52ID8/IHByb2Nlc3MuZW52O1xuICBjb25zdCBob21lID0gcmVzb2x2ZUhvbWUoZW52LCBjd2QsIG9wdGlvbnMpO1xuICBjb25zdCB0bXAgPSByZXNvbHZlVGVtcChlbnYsIGhvbWUsIG9wdGlvbnMpO1xuICBjb25zdCByZXNvbHZlZDogT3NQYXRocyA9IHsgaG9tZSwgdG1wIH07XG5cbiAgaWYgKGNhY2hlRW5hYmxlZCkgb3NQYXRoc0NhY2hlLnNldChjd2QsIHJlc29sdmVkKTtcbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuXG4vKioge0BsaW5rIHJlc29sdmVPc1BhdGhzfS5ob21lICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUxvY2FsSG9tZShvcHRpb25zOiBSZXNvbHZlT3NQYXRoc09wdGlvbnMgPSB7fSk6IHN0cmluZyB7XG4gIHJldHVybiByZXNvbHZlT3NQYXRocyhvcHRpb25zKS5ob21lO1xufVxuXG4vKioge0BsaW5rIHJlc29sdmVPc1BhdGhzfS50bXAgKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTG9jYWxUZW1wKG9wdGlvbnM6IFJlc29sdmVPc1BhdGhzT3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlc29sdmVPc1BhdGhzKG9wdGlvbnMpLnRtcDtcbn1cblxuLyoqIERyb3AgbWVtb2l6ZWQgZW50cmllcyAodGVzdHMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyT3NQYXRoc0NhY2hlKCk6IHZvaWQge1xuICBvc1BhdGhzQ2FjaGUuY2xlYXIoKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUhvbWUoZW52OiBOb2RlSlMuUHJvY2Vzc0VudiwgY3dkOiBzdHJpbmcsIG9wdGlvbnM6IFJlc29sdmVPc1BhdGhzT3B0aW9ucyk6IHN0cmluZyB7XG4gIGNvbnN0IHRyaWVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGNhbmRpZGF0ZXM6IEFycmF5PHN0cmluZyB8IHVuZGVmaW5lZD4gPSBbXG4gICAgdHJ5Q2FsbChvcHRpb25zLmhvbWVEaXIgPz8gaG9tZWRpciksXG4gICAgZW52LkhPTUU/LnRyaW0oKSxcbiAgICBlbnYuVVNFUlBST0ZJTEU/LnRyaW0oKSxcbiAgICBkYXRhYnJpY2tzLmlzQXBwRW52KGVudikgPyAob3B0aW9ucy5hcHBIb21lID8/IEFQUF9IT01FKSA6IHVuZGVmaW5lZCxcbiAgXTtcblxuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgaWYgKCFjYW5kaWRhdGUgfHwgdHJpZWQuaGFzKGNhbmRpZGF0ZSkpIGNvbnRpbnVlO1xuICAgIHRyaWVkLmFkZChjYW5kaWRhdGUpO1xuICAgIGlmIChpc1VzYWJsZURpcihjYW5kaWRhdGUpKSByZXR1cm4gY2FuZGlkYXRlO1xuICB9XG5cbiAgY29uc3QgZmFsbGJhY2sgPSBwYXRoLnJlc29sdmUoY3dkLCBcIi5ob21lXCIpO1xuICBpZiAoIWlzVXNhYmxlRGlyKGZhbGxiYWNrKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGNyZWF0ZSBhIHdyaXRhYmxlIGhvbWUgZGlyZWN0b3J5IGF0ICR7ZmFsbGJhY2t9YCk7XG4gIH1cbiAgcmV0dXJuIGZhbGxiYWNrO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlVGVtcChlbnY6IE5vZGVKUy5Qcm9jZXNzRW52LCBob21lOiBzdHJpbmcsIG9wdGlvbnM6IFJlc29sdmVPc1BhdGhzT3B0aW9ucyk6IHN0cmluZyB7XG4gIGNvbnN0IHRyaWVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8vIG9zLnRtcGRpciBmaXJzdCwgdGhlbiB0aGUgc3RhbmRhcmQgb3ZlcnJpZGUgZW52IHZhcnMgKE5vZGUgY2hlY2tzXG4gIC8vIFRNUERJUi9UTVAvVEVNUCBvbiBQT1NJWCBhbmQgVEVNUC9UTVAgb24gV2luZG93cyBpbnNpZGUgdG1wZGlyIGl0c2VsZjtcbiAgLy8gbGlzdGluZyB0aGVtIGFnYWluIGxldHMgYSBmYWlsZWQgY3JlYXRlL3dyaXRlIGZhbGwgdGhyb3VnaCB0byB0aGUgbmV4dCkuXG4gIGNvbnN0IGNhbmRpZGF0ZXM6IEFycmF5PHN0cmluZyB8IHVuZGVmaW5lZD4gPSBbXG4gICAgdHJ5Q2FsbChvcHRpb25zLnRtcERpciA/PyB0bXBkaXIpLFxuICAgIGVudi5UTVBESVI/LnRyaW0oKSxcbiAgICBlbnYuVE1QPy50cmltKCksXG4gICAgZW52LlRFTVA/LnRyaW0oKSxcbiAgXTtcblxuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgaWYgKCFjYW5kaWRhdGUgfHwgdHJpZWQuaGFzKGNhbmRpZGF0ZSkpIGNvbnRpbnVlO1xuICAgIHRyaWVkLmFkZChjYW5kaWRhdGUpO1xuICAgIGlmIChpc1VzYWJsZURpcihjYW5kaWRhdGUpKSByZXR1cm4gY2FuZGlkYXRlO1xuICB9XG5cbiAgY29uc3QgZmFsbGJhY2sgPSBwYXRoLmpvaW4oaG9tZSwgXCIudG1wXCIpO1xuICBpZiAoIWlzVXNhYmxlRGlyKGZhbGxiYWNrKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGNyZWF0ZSBhIHdyaXRhYmxlIHRlbXAgZGlyZWN0b3J5IGF0ICR7ZmFsbGJhY2t9YCk7XG4gIH1cbiAgcmV0dXJuIGZhbGxiYWNrO1xufVxuXG5mdW5jdGlvbiB0cnlDYWxsKGZuOiAoKSA9PiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBmbigpLnRyaW0oKSB8fCB1bmRlZmluZWQ7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBUcnVlIHdoZW4ge0BsaW5rIGRpcn0gY2FuIGJlIGNyZWF0ZWQgKGlmIG1pc3NpbmcpIGFuZCBhIHByb2JlIGZpbGUgY2FuIGJlXG4gKiB3cml0dGVuIHRoZW4gZGVsZXRlZC4gUmVhZC1vbmx5IG9yIG90aGVyd2lzZSB1bnVzYWJsZSBkaXJzIHJldHVybiBmYWxzZS5cbiAqL1xuZnVuY3Rpb24gaXNVc2FibGVEaXIoZGlyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgcHJvYmUgPSBwYXRoLmpvaW4oZGlyLCBgLmRieC1vcy1wYXRoLXByb2JlLSR7cHJvY2Vzcy5waWR9LSR7cHJvY2Vzcy5ocnRpbWUuYmlnaW50KCl9YCk7XG4gIHRyeSB7XG4gICAgd3JpdGVGaWxlU3luYyhwcm9iZSwgXCJcIik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgdW5saW5rU3luYyhwcm9iZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBQcm9iZSBjbGVhbnVwIGlzIGJlc3QtZWZmb3J0OyB1c2FiaWxpdHkgYWxyZWFkeSBkZWNpZGVkIGJ5IHRoZSB3cml0ZS5cbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
143
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3MtcGF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcy1wYXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzFDLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLEVBQUUsR0FBRyxJQUFJLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXhELG9FQUFvRTtBQUNwRSxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDO0FBb0JwQyxzREFBc0Q7QUFDdEQsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7QUFFaEQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsVUFBaUMsRUFBRTtJQUNoRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDdkQsTUFBTSxZQUFZLEdBQUcsR0FBRyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDekQsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNqQixNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLElBQUksR0FBRztZQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUM7SUFDdkMsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVB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SUFDSCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVzb2x2ZSBkdXJhYmxlIGxvY2FsIGhvbWUgYW5kIHRlbXAgZGlyZWN0b3JpZXMgZm9yIE5vZGUgaG9zdHMuXG4gKlxuICogSG9tZSBvcmRlciAobWtkaXIgKyB3cml0ZS9kZWxldGUgcHJvYmU7IGZhaWx1cmUgc2tpcHMpOlxuICogMS4gYG9zLmhvbWVkaXIoKWBcbiAqIDIuIGBIT01FYCAvIGBVU0VSUFJPRklMRWBcbiAqIDMuIGAvaG9tZS9hcHBgIHdoZW4ge0BsaW5rIGVudlV0aWwuaXNBcHBFbnZ9XG4gKiA0LiBgLi8uaG9tZWAgdW5kZXIgY3dkXG4gKlxuICogVGVtcCBvcmRlciAoc2FtZSBlbnN1cmUvcHJvYmUvc2tpcCk6XG4gKiAxLiBgb3MudG1wZGlyKClgXG4gKiAyLiBgVE1QRElSYCAvIGBUTVBgIC8gYFRFTVBgXG4gKiAzLiBgLnRtcGAgdW5kZXIgdGhlIHJlc29sdmVkIGhvbWVcbiAqXG4gKiBCb3RoIHBhdGhzIGFyZSBtZW1vaXplZCBwZXIgcmVzb2x2ZWQgY3dkIChzYW1lIGlkZWEgYXNcbiAqIGBAZGJ4LXRvb2xzL2NvcmVgIGBwcm9qZWN0YCBjb21tYW5kIGNhY2hpbmcpOiBjd2QgaXMgcGFydCBvZiB0aGUga2V5IGJlY2F1c2VcbiAqIHRoZSBgLi8uaG9tZWAgLyBgPGhvbWU+Ly50bXBgIGZhbGxiYWNrcyBkZXBlbmQgb24gaXQuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IG1rZGlyU3luYywgdW5saW5rU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBob21lZGlyLCB0bXBkaXIgfSBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZW52IGFzIGVudlV0aWwgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuXG4vKiogRGF0YWJyaWNrcyBBcHBzIGNvbnRhaW5lciBob21lIHdoZW4ge0BsaW5rIGVudlV0aWwuaXNBcHBFbnZ9LiAqL1xuZXhwb3J0IGNvbnN0IEFQUF9IT01FID0gXCIvaG9tZS9hcHBcIjtcblxuLyoqIFJlc29sdmVkIGhvbWUgKyB0ZW1wIGZvciBvbmUgY3dkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPc1BhdGhzIHtcbiAgcmVhZG9ubHkgaG9tZTogc3RyaW5nO1xuICByZWFkb25seSB0bXA6IHN0cmluZztcbn1cblxuLyoqIEluamVjdGFibGUga25vYnMgZm9yIHtAbGluayByZXNvbHZlT3NQYXRoc30gKG1vc3RseSB0ZXN0cykuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVPc1BhdGhzT3B0aW9ucyB7XG4gIGVudj86IE5vZGVKUy5Qcm9jZXNzRW52O1xuICBjd2Q/OiBzdHJpbmc7XG4gIC8qKiBEZWZhdWx0cyB0byBgb3MuaG9tZWRpcmAuICovXG4gIGhvbWVEaXI/OiAoKSA9PiBzdHJpbmc7XG4gIC8qKiBEZWZhdWx0cyB0byBgb3MudG1wZGlyYC4gKi9cbiAgdG1wRGlyPzogKCkgPT4gc3RyaW5nO1xuICAvKiogQXBwLWVudiBjYW5kaWRhdGU7IGRlZmF1bHRzIHRvIHtAbGluayBBUFBfSE9NRX0uICovXG4gIGFwcEhvbWU/OiBzdHJpbmc7XG59XG5cbi8qKiBNZW1vaXplZCB7QGxpbmsgT3NQYXRoc30ga2V5ZWQgYnkgcmVzb2x2ZWQgY3dkLiAqL1xuY29uc3Qgb3NQYXRoc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE9zUGF0aHM+KCk7XG5cbi8qKlxuICogUmVzb2x2ZSBob21lICsgdGVtcCBmb3Ige0BsaW5rIGN3ZH0sIG1lbW9pemVkIHdoZW4ge0BsaW5rIGN3ZH0gaXMgdGhlIHByb2Nlc3NcbiAqIGN3ZCAoYW4gZXhwbGljaXQgb3RoZXIgY3dkIGlzIGNvbXB1dGVkIGZyZXNoLCBtYXRjaGluZyBjb3JlIGBwcm9qZWN0YFxuICogY2FjaGluZykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlT3NQYXRocyhvcHRpb25zOiBSZXNvbHZlT3NQYXRoc09wdGlvbnMgPSB7fSk6IE9zUGF0aHMge1xuICBjb25zdCBjd2QgPSBwYXRoLnJlc29sdmUob3B0aW9ucy5jd2QgPz8gcHJvY2Vzcy5jd2QoKSk7XG4gIGNvbnN0IGNhY2hlRW5hYmxlZCA9IGN3ZCA9PT0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCkpO1xuICBpZiAoY2FjaGVFbmFibGVkKSB7XG4gICAgY29uc3QgaGl0ID0gb3NQYXRoc0NhY2hlLmdldChjd2QpO1xuICAgIGlmIChoaXQpIHJldHVybiBoaXQ7XG4gIH1cblxuICBjb25zdCBlbnYgPSBvcHRpb25zLmVudiA/PyBwcm9jZXNzLmVudjtcbiAgY29uc3QgaG9tZSA9IHJlc29sdmVIb21lKGVudiwgY3dkLCBvcHRpb25zKTtcbiAgY29uc3QgdG1wID0gcmVzb2x2ZVRlbXAoZW52LCBob21lLCBvcHRpb25zKTtcbiAgY29uc3QgcmVzb2x2ZWQ6IE9zUGF0aHMgPSB7IGhvbWUsIHRtcCB9O1xuXG4gIGlmIChjYWNoZUVuYWJsZWQpIG9zUGF0aHNDYWNoZS5zZXQoY3dkLCByZXNvbHZlZCk7XG4gIHJldHVybiByZXNvbHZlZDtcbn1cblxuLyoqIHtAbGluayByZXNvbHZlT3NQYXRoc30uaG9tZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVMb2NhbEhvbWUob3B0aW9uczogUmVzb2x2ZU9zUGF0aHNPcHRpb25zID0ge30pOiBzdHJpbmcge1xuICByZXR1cm4gcmVzb2x2ZU9zUGF0aHMob3B0aW9ucykuaG9tZTtcbn1cblxuLyoqIHtAbGluayByZXNvbHZlT3NQYXRoc30udG1wICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUxvY2FsVGVtcChvcHRpb25zOiBSZXNvbHZlT3NQYXRoc09wdGlvbnMgPSB7fSk6IHN0cmluZyB7XG4gIHJldHVybiByZXNvbHZlT3NQYXRocyhvcHRpb25zKS50bXA7XG59XG5cbi8qKiBEcm9wIG1lbW9pemVkIGVudHJpZXMgKHRlc3RzKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhck9zUGF0aHNDYWNoZSgpOiB2b2lkIHtcbiAgb3NQYXRoc0NhY2hlLmNsZWFyKCk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVIb21lKGVudjogTm9kZUpTLlByb2Nlc3NFbnYsIGN3ZDogc3RyaW5nLCBvcHRpb25zOiBSZXNvbHZlT3NQYXRoc09wdGlvbnMpOiBzdHJpbmcge1xuICBjb25zdCB0cmllZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBjYW5kaWRhdGVzOiBBcnJheTxzdHJpbmcgfCB1bmRlZmluZWQ+ID0gW1xuICAgIHRyeUNhbGwob3B0aW9ucy5ob21lRGlyID8/IGhvbWVkaXIpLFxuICAgIGVudi5IT01FPy50cmltKCksXG4gICAgZW52LlVTRVJQUk9GSUxFPy50cmltKCksXG4gICAgZW52VXRpbC5pc0FwcEVudihlbnYpID8gKG9wdGlvbnMuYXBwSG9tZSA/PyBBUFBfSE9NRSkgOiB1bmRlZmluZWQsXG4gIF07XG5cbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgIGlmICghY2FuZGlkYXRlIHx8IHRyaWVkLmhhcyhjYW5kaWRhdGUpKSBjb250aW51ZTtcbiAgICB0cmllZC5hZGQoY2FuZGlkYXRlKTtcbiAgICBpZiAoaXNVc2FibGVEaXIoY2FuZGlkYXRlKSkgcmV0dXJuIGNhbmRpZGF0ZTtcbiAgfVxuXG4gIGNvbnN0IGZhbGxiYWNrID0gcGF0aC5yZXNvbHZlKGN3ZCwgXCIuaG9tZVwiKTtcbiAgaWYgKCFpc1VzYWJsZURpcihmYWxsYmFjaykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBjcmVhdGUgYSB3cml0YWJsZSBob21lIGRpcmVjdG9yeSBhdCAke2ZhbGxiYWNrfWApO1xuICB9XG4gIHJldHVybiBmYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVRlbXAoZW52OiBOb2RlSlMuUHJvY2Vzc0VudiwgaG9tZTogc3RyaW5nLCBvcHRpb25zOiBSZXNvbHZlT3NQYXRoc09wdGlvbnMpOiBzdHJpbmcge1xuICBjb25zdCB0cmllZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvLyBvcy50bXBkaXIgZmlyc3QsIHRoZW4gdGhlIHN0YW5kYXJkIG92ZXJyaWRlIGVudiB2YXJzIChOb2RlIGNoZWNrc1xuICAvLyBUTVBESVIvVE1QL1RFTVAgb24gUE9TSVggYW5kIFRFTVAvVE1QIG9uIFdpbmRvd3MgaW5zaWRlIHRtcGRpciBpdHNlbGY7XG4gIC8vIGxpc3RpbmcgdGhlbSBhZ2FpbiBsZXRzIGEgZmFpbGVkIGNyZWF0ZS93cml0ZSBmYWxsIHRocm91Z2ggdG8gdGhlIG5leHQpLlxuICBjb25zdCBjYW5kaWRhdGVzOiBBcnJheTxzdHJpbmcgfCB1bmRlZmluZWQ+ID0gW1xuICAgIHRyeUNhbGwob3B0aW9ucy50bXBEaXIgPz8gdG1wZGlyKSxcbiAgICBlbnYuVE1QRElSPy50cmltKCksXG4gICAgZW52LlRNUD8udHJpbSgpLFxuICAgIGVudi5URU1QPy50cmltKCksXG4gIF07XG5cbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgIGlmICghY2FuZGlkYXRlIHx8IHRyaWVkLmhhcyhjYW5kaWRhdGUpKSBjb250aW51ZTtcbiAgICB0cmllZC5hZGQoY2FuZGlkYXRlKTtcbiAgICBpZiAoaXNVc2FibGVEaXIoY2FuZGlkYXRlKSkgcmV0dXJuIGNhbmRpZGF0ZTtcbiAgfVxuXG4gIGNvbnN0IGZhbGxiYWNrID0gcGF0aC5qb2luKGhvbWUsIFwiLnRtcFwiKTtcbiAgaWYgKCFpc1VzYWJsZURpcihmYWxsYmFjaykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBjcmVhdGUgYSB3cml0YWJsZSB0ZW1wIGRpcmVjdG9yeSBhdCAke2ZhbGxiYWNrfWApO1xuICB9XG4gIHJldHVybiBmYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gdHJ5Q2FsbChmbjogKCkgPT4gc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKS50cmltKCkgfHwgdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogVHJ1ZSB3aGVuIHtAbGluayBkaXJ9IGNhbiBiZSBjcmVhdGVkIChpZiBtaXNzaW5nKSBhbmQgYSBwcm9iZSBmaWxlIGNhbiBiZVxuICogd3JpdHRlbiB0aGVuIGRlbGV0ZWQuIFJlYWQtb25seSBvciBvdGhlcndpc2UgdW51c2FibGUgZGlycyByZXR1cm4gZmFsc2UuXG4gKi9cbmZ1bmN0aW9uIGlzVXNhYmxlRGlyKGRpcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgbWtkaXJTeW5jKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHByb2JlID0gcGF0aC5qb2luKGRpciwgYC5kYngtb3MtcGF0aC1wcm9iZS0ke3Byb2Nlc3MucGlkfS0ke3Byb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpfWApO1xuICB0cnkge1xuICAgIHdyaXRlRmlsZVN5bmMocHJvYmUsIFwiXCIpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIHVubGlua1N5bmMocHJvYmUpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gUHJvYmUgY2xlYW51cCBpcyBiZXN0LWVmZm9ydDsgdXNhYmlsaXR5IGFscmVhZHkgZGVjaWRlZCBieSB0aGUgd3JpdGUuXG4gICAgfVxuICB9XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"repository": {
|
|
4
4
|
"type": "git",
|
|
5
5
|
"url": "git+https://github.com/reggie-db/dbx-tools.git",
|
|
6
|
-
"directory": "packages/node/fs"
|
|
6
|
+
"directory": "js-packages/node/fs"
|
|
7
7
|
},
|
|
8
8
|
"scripts": {
|
|
9
9
|
"build": "projen build",
|
|
@@ -23,9 +23,9 @@
|
|
|
23
23
|
"typescript": "^5.9.3"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@dbx-tools/
|
|
27
|
-
"@dbx-tools/shared-core": "0.6.
|
|
28
|
-
"@dbx-tools/shared-fs": "0.6.
|
|
26
|
+
"@dbx-tools/core": "0.6.74",
|
|
27
|
+
"@dbx-tools/shared-core": "0.6.74",
|
|
28
|
+
"@dbx-tools/shared-fs": "0.6.74"
|
|
29
29
|
},
|
|
30
30
|
"main": "./lib/index.js",
|
|
31
31
|
"license": "UNLICENSED",
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"./package.json": "./package.json"
|
|
42
42
|
}
|
|
43
43
|
},
|
|
44
|
-
"version": "0.6.
|
|
44
|
+
"version": "0.6.74",
|
|
45
45
|
"types": "./lib/index.d.ts",
|
|
46
46
|
"type": "module",
|
|
47
47
|
"exports": {
|
package/src/local-fs.ts
CHANGED
|
@@ -22,6 +22,7 @@ import {
|
|
|
22
22
|
writeFile,
|
|
23
23
|
} from "node:fs/promises";
|
|
24
24
|
import path from "node:path";
|
|
25
|
+
import { fileLock } from "@dbx-tools/core";
|
|
25
26
|
import { hash } from "@dbx-tools/shared-core";
|
|
26
27
|
import {
|
|
27
28
|
BaseFileSystem,
|
|
@@ -421,6 +422,7 @@ export function scratchFS(prefix: string, options: OsFileSystemOptions = {}): Lo
|
|
|
421
422
|
* - a reader never observes a half-written tree, and a failed rebuild leaves
|
|
422
423
|
* the previous one intact.
|
|
423
424
|
*
|
|
425
|
+
* Rebuilds targeting the same stable tree are serialized across processes.
|
|
424
426
|
* The swap is a `rename` within the same temp root, so it is atomic.
|
|
425
427
|
*
|
|
426
428
|
* @param key - Stable temp-relative path. May be nested (`"skills/abc123"`)
|
|
@@ -450,10 +452,12 @@ export async function rebuildFS(
|
|
|
450
452
|
|
|
451
453
|
const stable = tmpFS(key, options);
|
|
452
454
|
const stableHost = path.resolve(stable.root);
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
455
|
+
return fileLock.withFileLock(["rebuildFS", stableHost], async () => {
|
|
456
|
+
await rm(stableHost, { recursive: true, force: true });
|
|
457
|
+
await mkdir(path.dirname(stableHost), { recursive: true });
|
|
458
|
+
await rename(path.resolve(scratch.root), stableHost);
|
|
459
|
+
return stable;
|
|
460
|
+
});
|
|
457
461
|
}
|
|
458
462
|
|
|
459
463
|
/**
|
package/src/os-path.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Home order (mkdir + write/delete probe; failure skips):
|
|
5
5
|
* 1. `os.homedir()`
|
|
6
6
|
* 2. `HOME` / `USERPROFILE`
|
|
7
|
-
* 3. `/home/app` when {@link
|
|
7
|
+
* 3. `/home/app` when {@link envUtil.isAppEnv}
|
|
8
8
|
* 4. `./.home` under cwd
|
|
9
9
|
*
|
|
10
10
|
* Temp order (same ensure/probe/skip):
|
|
@@ -22,9 +22,9 @@
|
|
|
22
22
|
import { mkdirSync, unlinkSync, writeFileSync } from "node:fs";
|
|
23
23
|
import { homedir, tmpdir } from "node:os";
|
|
24
24
|
import path from "node:path";
|
|
25
|
-
import {
|
|
25
|
+
import { env as envUtil } from "@dbx-tools/shared-core";
|
|
26
26
|
|
|
27
|
-
/** Databricks Apps container home when {@link
|
|
27
|
+
/** Databricks Apps container home when {@link envUtil.isAppEnv}. */
|
|
28
28
|
export const APP_HOME = "/home/app";
|
|
29
29
|
|
|
30
30
|
/** Resolved home + temp for one cwd. */
|
|
@@ -91,7 +91,7 @@ function resolveHome(env: NodeJS.ProcessEnv, cwd: string, options: ResolveOsPath
|
|
|
91
91
|
tryCall(options.homeDir ?? homedir),
|
|
92
92
|
env.HOME?.trim(),
|
|
93
93
|
env.USERPROFILE?.trim(),
|
|
94
|
-
|
|
94
|
+
envUtil.isAppEnv(env) ? (options.appHome ?? APP_HOME) : undefined,
|
|
95
95
|
];
|
|
96
96
|
|
|
97
97
|
for (const candidate of candidates) {
|