sliftutils 0.10.0 → 0.12.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.
Files changed (77) hide show
  1. package/.gitignore +38 -0
  2. package/assets/icon128.png +0 -0
  3. package/assets/icon16.png +0 -0
  4. package/assets/icon48.png +0 -0
  5. package/build-electron/assets/icon128.png +0 -0
  6. package/build-electron/assets/icon16.png +0 -0
  7. package/build-electron/assets/icon48.png +0 -0
  8. package/build-electron/electron/electronIndex.html +12 -0
  9. package/build-electron/electronMain.js +5185 -0
  10. package/build-electron/electronRenderer.js +20852 -0
  11. package/build-extension/assets/icon128.png +0 -0
  12. package/build-extension/assets/icon16.png +0 -0
  13. package/build-extension/assets/icon48.png +0 -0
  14. package/build-extension/extBackground.js +5246 -0
  15. package/build-extension/extContentScript.js +5243 -0
  16. package/build-extension/manifest.json +29 -0
  17. package/build-nodejs/server.js +198610 -0
  18. package/build-web/assets/icon128.png +0 -0
  19. package/build-web/assets/icon16.png +0 -0
  20. package/build-web/assets/icon48.png +0 -0
  21. package/build-web/browser.js +199266 -0
  22. package/build-web/web/index.html +32 -0
  23. package/builders/dist/electronBuild.ts.cache +105 -0
  24. package/builders/dist/extensionBuild.ts.cache +146 -0
  25. package/builders/dist/generateIndexDts.ts.cache +74 -0
  26. package/builders/dist/hotReload.ts.cache +93 -0
  27. package/builders/dist/nodeJSBuild.ts.cache +29 -0
  28. package/builders/dist/watch.ts.cache +163 -0
  29. package/builders/dist/webBuild.ts.cache +81 -0
  30. package/builders/generateIndexDts.ts +1 -1
  31. package/bundler/dist/bundleEntry.ts.cache +48 -0
  32. package/bundler/dist/bundleEntryCaller.ts.cache +18 -0
  33. package/bundler/dist/bundleRequire.ts.cache +246 -0
  34. package/bundler/dist/bundleWrapper.ts.cache +101 -0
  35. package/bundler/dist/bundler.ts.cache +66 -0
  36. package/bundler/dist/sourceMaps.ts.cache +210 -0
  37. package/dist/electronMain.ts.cache +27 -0
  38. package/dist/electronRenderer.tsx.cache +62 -0
  39. package/electron/dist/electronMain.ts.cache +26 -0
  40. package/electron/dist/electronRenderer.tsx.cache +64 -0
  41. package/extension/dist/extBackground.ts.cache +20 -0
  42. package/extension/dist/extContentScript.ts.cache +17 -0
  43. package/index.d.ts +478 -0
  44. package/misc/dist/environment.ts.cache +50 -0
  45. package/misc/dist/fs.ts.cache +29 -0
  46. package/nodejs/dist/exampleFile.ts.cache +11 -0
  47. package/nodejs/dist/server.ts.cache +15 -0
  48. package/package.json +5 -1
  49. package/render-utils/dist/observer.tsx.cache +33 -0
  50. package/storage/CachedStorage.d.ts +2 -0
  51. package/storage/DelayedStorage.d.ts +14 -0
  52. package/storage/DiskCollection.d.ts +99 -0
  53. package/storage/FileFolderAPI.d.ts +71 -0
  54. package/storage/IStorage.d.ts +38 -0
  55. package/storage/IndexedDBFileFolderAPI.d.ts +6 -0
  56. package/storage/JSONStorage.d.ts +16 -0
  57. package/storage/PendingManager.d.ts +6 -0
  58. package/storage/PendingStorage.d.ts +18 -0
  59. package/storage/PrivateFileSystemStorage.d.ts +23 -0
  60. package/storage/StorageObservable.d.ts +32 -0
  61. package/storage/TransactionStorage.d.ts +46 -0
  62. package/storage/dist/CachedStorage.ts.cache +31 -0
  63. package/storage/dist/DelayedStorage.ts.cache +35 -0
  64. package/storage/dist/DiskCollection.ts.cache +241 -0
  65. package/storage/dist/FileFolderAPI.tsx.cache +345 -0
  66. package/storage/dist/IndexedDBFileFolderAPI.ts.cache +142 -0
  67. package/storage/dist/JSONStorage.ts.cache +38 -0
  68. package/storage/dist/PendingManager.tsx.cache +73 -0
  69. package/storage/dist/PendingStorage.ts.cache +49 -0
  70. package/storage/dist/PrivateFileSystemStorage.ts.cache +178 -0
  71. package/storage/dist/StorageObservable.ts.cache +120 -0
  72. package/storage/dist/TransactionStorage.ts.cache +421 -0
  73. package/storage/dist/fileSystemPointer.ts.cache +77 -0
  74. package/storage/fileSystemPointer.d.ts +11 -0
  75. package/tsconfig.declarations.json +3 -1
  76. package/web/dist/browser.tsx.cache +66 -0
  77. package/yarn.lock +1752 -0
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
12
+ //exports.PendingDisplay = exports.hasPending = exports.setPending = void 0;
13
+ const misc_1 = require("socket-function/src/misc");
14
+ const mobxTyped_1 = require("../misc/mobxTyped");
15
+ const preact_1 = __importDefault(require("preact"));
16
+ const typesafecss_1 = require("typesafecss");
17
+ const observer_1 = require("../misc/observer");
18
+ const format_1 = require("socket-function/src/formatting/format");
19
+ let watchState = (0, mobxTyped_1.observable)({
20
+ pending: {}
21
+ });
22
+ let pendingLastSets = new Map();
23
+ let pendingCache = new Map();
24
+ // "" clears the pending value
25
+ function setPending(group, message) {
26
+ pendingCache.set(group, message);
27
+ void setPendingBase();
28
+ }
29
+ exports.setPending = setPending;
30
+ function hasPending() {
31
+ return Object.keys(watchState.pending).length > 0;
32
+ }
33
+ exports.hasPending = hasPending;
34
+ // NOTE: This not only prevents render overload, but also means any pending that are < this
35
+ // delay don't show up (which is useful to reduce unnecessary pending messages).
36
+ const setPendingBase = (0, misc_1.throttleFunction)(500, function setPendingBase() {
37
+ for (let [group, message] of pendingCache) {
38
+ if (!message) {
39
+ let lastSet = pendingLastSets.get(group);
40
+ if (lastSet) {
41
+ let duration = Date.now() - lastSet;
42
+ if (duration > 500) {
43
+ console.log(`Finished slow task after ${(0, format_1.formatTime)(duration)}: ${JSON.stringify(group)}, last is ${JSON.stringify(watchState.pending[group])}`);
44
+ }
45
+ pendingLastSets.delete(group);
46
+ }
47
+ delete watchState.pending[group];
48
+ }
49
+ else {
50
+ //console.log("setPending", group, message);
51
+ if (!(group in watchState.pending)) {
52
+ pendingLastSets.set(group, Date.now());
53
+ }
54
+ watchState.pending[group] = message;
55
+ }
56
+ }
57
+ pendingCache.clear();
58
+ });
59
+ let PendingDisplay = class PendingDisplay extends preact_1.default.Component {
60
+ render() {
61
+ // Single line, giving equal space, and ellipsis for overflow
62
+ return preact_1.default.createElement("div", { className: typesafecss_1.css.hbox(10) }, Object.keys(watchState.pending).map(group => (preact_1.default.createElement("div", { className: typesafecss_1.css.center.textOverflow("ellipsis").border("1px solid black").pad2(6, 2) },
63
+ group,
64
+ ": ",
65
+ watchState.pending[group]))));
66
+ }
67
+ };
68
+ exports.PendingDisplay = PendingDisplay;
69
+ exports.PendingDisplay = PendingDisplay = __decorate([
70
+ observer_1.observer
71
+ ], PendingDisplay);
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGVuZGluZ01hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJQZW5kaW5nTWFuYWdlci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsbURBQTREO0FBQzVELGlEQUErQztBQUMvQyxvREFBNEI7QUFDNUIsNkNBQWtDO0FBQ2xDLCtDQUE0QztBQUM1QyxrRUFBbUU7QUFFbkUsSUFBSSxVQUFVLEdBQUcsSUFBQSxzQkFBVSxFQUFDO0lBQ3hCLE9BQU8sRUFBRSxFQUFpQztDQUM3QyxDQUFDLENBQUM7QUFDSCxJQUFJLGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztBQUVoRCxJQUFJLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztBQUU3Qyw4QkFBOEI7QUFDOUIsU0FBZ0IsVUFBVSxDQUFDLEtBQWEsRUFBRSxPQUFlO0lBQ3JELFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2pDLEtBQUssY0FBYyxFQUFFLENBQUM7QUFDMUIsQ0FBQztBQUhELGdDQUdDO0FBRUQsU0FBZ0IsVUFBVTtJQUN0QixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUZELGdDQUVDO0FBRUQsMkZBQTJGO0FBQzNGLGlGQUFpRjtBQUNqRixNQUFNLGNBQWMsR0FBRyxJQUFBLHVCQUFnQixFQUFDLEdBQUcsRUFBRSxTQUFTLGNBQWM7SUFDaEUsS0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXhDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNYLElBQUksT0FBTyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekMsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDVixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDO2dCQUNwQyxJQUFJLFFBQVEsR0FBRyxHQUFHLEVBQUUsQ0FBQztvQkFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsSUFBQSxtQkFBVSxFQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLGFBQWEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNwSixDQUFDO2dCQUNELGVBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEMsQ0FBQztZQUNELE9BQU8sVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxDQUFDO2FBQU0sQ0FBQztZQUNKLDRDQUE0QztZQUM1QyxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQzNDLENBQUM7WUFDRCxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUN4QyxDQUFDO0lBQ0wsQ0FBQztJQUNELFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUN6QixDQUFDLENBQUMsQ0FBQztBQUdJLElBQU0sY0FBYyxHQUFwQixNQUFNLGNBQWUsU0FBUSxnQkFBTSxDQUFDLFNBQVM7SUFDaEQsTUFBTTtRQUNGLDZEQUE2RDtRQUM3RCxPQUFPLHdDQUFLLFNBQVMsRUFBRSxpQkFBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFDOUIsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FDMUMsd0NBQUssU0FBUyxFQUFFLGlCQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNuRixLQUFLOztZQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQ2pDLENBQ1QsQ0FBQyxDQUNBLENBQUM7SUFDWCxDQUFDO0NBQ0osQ0FBQTtBQVhZLHdDQUFjO3lCQUFkLGNBQWM7SUFEMUIsbUJBQVE7R0FDSSxjQUFjLENBVzFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdGhyb3R0bGVGdW5jdGlvbiB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IG9ic2VydmFibGUgfSBmcm9tIFwiLi4vbWlzYy9tb2J4VHlwZWRcIjtcbmltcG9ydCBwcmVhY3QgZnJvbSBcInByZWFjdFwiO1xuaW1wb3J0IHsgY3NzIH0gZnJvbSBcInR5cGVzYWZlY3NzXCI7XG5pbXBvcnQgeyBvYnNlcnZlciB9IGZyb20gXCIuLi9taXNjL29ic2VydmVyXCI7XG5pbXBvcnQgeyBmb3JtYXRUaW1lIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvZm9ybWF0dGluZy9mb3JtYXRcIjtcblxubGV0IHdhdGNoU3RhdGUgPSBvYnNlcnZhYmxlKHtcbiAgICBwZW5kaW5nOiB7fSBhcyB7IFtncm91cDogc3RyaW5nXTogc3RyaW5nIH1cbn0pO1xubGV0IHBlbmRpbmdMYXN0U2V0cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbmxldCBwZW5kaW5nQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4vLyBcIlwiIGNsZWFycyB0aGUgcGVuZGluZyB2YWx1ZVxuZXhwb3J0IGZ1bmN0aW9uIHNldFBlbmRpbmcoZ3JvdXA6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgcGVuZGluZ0NhY2hlLnNldChncm91cCwgbWVzc2FnZSk7XG4gICAgdm9pZCBzZXRQZW5kaW5nQmFzZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzUGVuZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMod2F0Y2hTdGF0ZS5wZW5kaW5nKS5sZW5ndGggPiAwO1xufVxuXG4vLyBOT1RFOiBUaGlzIG5vdCBvbmx5IHByZXZlbnRzIHJlbmRlciBvdmVybG9hZCwgYnV0IGFsc28gbWVhbnMgYW55IHBlbmRpbmcgdGhhdCBhcmUgPCB0aGlzXG4vLyAgZGVsYXkgZG9uJ3Qgc2hvdyB1cCAod2hpY2ggaXMgdXNlZnVsIHRvIHJlZHVjZSB1bm5lY2Vzc2FyeSBwZW5kaW5nIG1lc3NhZ2VzKS5cbmNvbnN0IHNldFBlbmRpbmdCYXNlID0gdGhyb3R0bGVGdW5jdGlvbig1MDAsIGZ1bmN0aW9uIHNldFBlbmRpbmdCYXNlKCkge1xuICAgIGZvciAobGV0IFtncm91cCwgbWVzc2FnZV0gb2YgcGVuZGluZ0NhY2hlKSB7XG5cbiAgICAgICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICAgICAgICBsZXQgbGFzdFNldCA9IHBlbmRpbmdMYXN0U2V0cy5nZXQoZ3JvdXApO1xuICAgICAgICAgICAgaWYgKGxhc3RTZXQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gbGFzdFNldDtcbiAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb24gPiA1MDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEZpbmlzaGVkIHNsb3cgdGFzayBhZnRlciAke2Zvcm1hdFRpbWUoZHVyYXRpb24pfTogJHtKU09OLnN0cmluZ2lmeShncm91cCl9LCBsYXN0IGlzICR7SlNPTi5zdHJpbmdpZnkod2F0Y2hTdGF0ZS5wZW5kaW5nW2dyb3VwXSl9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBlbmRpbmdMYXN0U2V0cy5kZWxldGUoZ3JvdXApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlIHdhdGNoU3RhdGUucGVuZGluZ1tncm91cF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwic2V0UGVuZGluZ1wiLCBncm91cCwgbWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAoIShncm91cCBpbiB3YXRjaFN0YXRlLnBlbmRpbmcpKSB7XG4gICAgICAgICAgICAgICAgcGVuZGluZ0xhc3RTZXRzLnNldChncm91cCwgRGF0ZS5ub3coKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YXRjaFN0YXRlLnBlbmRpbmdbZ3JvdXBdID0gbWVzc2FnZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwZW5kaW5nQ2FjaGUuY2xlYXIoKTtcbn0pO1xuXG5Ab2JzZXJ2ZXJcbmV4cG9ydCBjbGFzcyBQZW5kaW5nRGlzcGxheSBleHRlbmRzIHByZWFjdC5Db21wb25lbnQge1xuICAgIHJlbmRlcigpIHtcbiAgICAgICAgLy8gU2luZ2xlIGxpbmUsIGdpdmluZyBlcXVhbCBzcGFjZSwgYW5kIGVsbGlwc2lzIGZvciBvdmVyZmxvd1xuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e2Nzcy5oYm94KDEwKX0+XG4gICAgICAgICAgICB7T2JqZWN0LmtleXMod2F0Y2hTdGF0ZS5wZW5kaW5nKS5tYXAoZ3JvdXAgPT4gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjc3MuY2VudGVyLnRleHRPdmVyZmxvdyhcImVsbGlwc2lzXCIpLmJvcmRlcihcIjFweCBzb2xpZCBibGFja1wiKS5wYWQyKDYsIDIpfT5cbiAgICAgICAgICAgICAgICAgICAge2dyb3VwfToge3dhdGNoU3RhdGUucGVuZGluZ1tncm91cF19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApKX1cbiAgICAgICAgPC9kaXY+O1xuICAgIH1cbn0iXX0=
73
+ /* _JS_SOURCE_HASH = "8f559dbbe9527016120e06db80675bb022384607e057609b93840bc57618742e"; */
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
3
+ //exports.PendingStorage = void 0;
4
+ const misc_1 = require("socket-function/src/misc");
5
+ const PendingManager_1 = require("./PendingManager");
6
+ class PendingStorage {
7
+ constructor(pendingGroup, storage) {
8
+ this.pendingGroup = pendingGroup;
9
+ this.storage = storage;
10
+ this.pending = new Map();
11
+ this.updatePending = (0, misc_1.throttleFunction)(100, () => {
12
+ let text = Array.from(this.pending.entries()).map(([key, value]) => `${key}: ${value}`).join(", ");
13
+ (0, PendingManager_1.setPending)(this.pendingGroup, text);
14
+ });
15
+ }
16
+ async get(key) {
17
+ return this.watchPending("get", this.storage.get(key));
18
+ }
19
+ async set(key, value) {
20
+ return this.watchPending("set", this.storage.set(key, value));
21
+ }
22
+ async remove(key) {
23
+ return this.watchPending("remove", this.storage.remove(key));
24
+ }
25
+ async getKeys() {
26
+ return this.watchPending("getKeys", this.storage.getKeys());
27
+ }
28
+ async getInfo(key) {
29
+ return this.watchPending("getInfo", this.storage.getInfo(key));
30
+ }
31
+ watchPending(type, promise) {
32
+ this.pending.set(type, (this.pending.get(type) || 0) + 1);
33
+ void this.updatePending();
34
+ void promise.finally(() => {
35
+ this.pending.set(type, (this.pending.get(type) || 0) - 1);
36
+ if (this.pending.get(type) === 0) {
37
+ this.pending.delete(type);
38
+ }
39
+ void this.updatePending();
40
+ });
41
+ return promise;
42
+ }
43
+ async reset() {
44
+ return this.storage.reset();
45
+ }
46
+ }
47
+ exports.PendingStorage = PendingStorage;
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGVuZGluZ1N0b3JhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJQZW5kaW5nU3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBNEQ7QUFFNUQscURBQThDO0FBRTlDLE1BQWEsY0FBYztJQUV2QixZQUNZLFlBQW9CLEVBQ3BCLE9BQW9CO1FBRHBCLGlCQUFZLEdBQVosWUFBWSxDQUFRO1FBQ3BCLFlBQU8sR0FBUCxPQUFPLENBQWE7UUFIaEMsWUFBTyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1FBaUM1QixrQkFBYSxHQUFHLElBQUEsdUJBQWdCLEVBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtZQUMvQyxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkcsSUFBQSwyQkFBVSxFQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEMsQ0FBQyxDQUFDLENBQUM7SUFoQ0MsQ0FBQztJQUNFLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBVztRQUN4QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUNNLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBVyxFQUFFLEtBQVE7UUFDbEMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBQ00sS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFXO1FBQzNCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBQ00sS0FBSyxDQUFDLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUNNLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBVztRQUM1QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVPLFlBQVksQ0FBSSxJQUFZLEVBQUUsT0FBbUI7UUFDckQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUQsS0FBSyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDMUIsS0FBSyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRTtZQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5QixDQUFDO1lBQ0QsS0FBSyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBTU0sS0FBSyxDQUFDLEtBQUs7UUFDZCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDaEMsQ0FBQztDQUNKO0FBMUNELHdDQTBDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHRocm90dGxlRnVuY3Rpb24gfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9taXNjXCI7XG5pbXBvcnQgeyBJU3RvcmFnZSB9IGZyb20gXCIuL0lTdG9yYWdlXCI7XG5pbXBvcnQgeyBzZXRQZW5kaW5nIH0gZnJvbSBcIi4vUGVuZGluZ01hbmFnZXJcIjtcblxuZXhwb3J0IGNsYXNzIFBlbmRpbmdTdG9yYWdlPFQ+IGltcGxlbWVudHMgSVN0b3JhZ2U8VD4ge1xuICAgIHBlbmRpbmcgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHBlbmRpbmdHcm91cDogc3RyaW5nLFxuICAgICAgICBwcml2YXRlIHN0b3JhZ2U6IElTdG9yYWdlPFQ+LFxuICAgICkgeyB9XG4gICAgcHVibGljIGFzeW5jIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy53YXRjaFBlbmRpbmcoXCJnZXRcIiwgdGhpcy5zdG9yYWdlLmdldChrZXkpKTtcbiAgICB9XG4gICAgcHVibGljIGFzeW5jIHNldChrZXk6IHN0cmluZywgdmFsdWU6IFQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2F0Y2hQZW5kaW5nKFwic2V0XCIsIHRoaXMuc3RvcmFnZS5zZXQoa2V5LCB2YWx1ZSkpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgcmVtb3ZlKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLndhdGNoUGVuZGluZyhcInJlbW92ZVwiLCB0aGlzLnN0b3JhZ2UucmVtb3ZlKGtleSkpO1xuICAgIH1cbiAgICBwdWJsaWMgYXN5bmMgZ2V0S2V5cygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLndhdGNoUGVuZGluZyhcImdldEtleXNcIiwgdGhpcy5zdG9yYWdlLmdldEtleXMoKSk7XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyBnZXRJbmZvKGtleTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndhdGNoUGVuZGluZyhcImdldEluZm9cIiwgdGhpcy5zdG9yYWdlLmdldEluZm8oa2V5KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3YXRjaFBlbmRpbmc8VD4odHlwZTogc3RyaW5nLCBwcm9taXNlOiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIHRoaXMucGVuZGluZy5zZXQodHlwZSwgKHRoaXMucGVuZGluZy5nZXQodHlwZSkgfHwgMCkgKyAxKTtcbiAgICAgICAgdm9pZCB0aGlzLnVwZGF0ZVBlbmRpbmcoKTtcbiAgICAgICAgdm9pZCBwcm9taXNlLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nLnNldCh0eXBlLCAodGhpcy5wZW5kaW5nLmdldCh0eXBlKSB8fCAwKSAtIDEpO1xuICAgICAgICAgICAgaWYgKHRoaXMucGVuZGluZy5nZXQodHlwZSkgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKHR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdm9pZCB0aGlzLnVwZGF0ZVBlbmRpbmcoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbiAgICBwcml2YXRlIHVwZGF0ZVBlbmRpbmcgPSB0aHJvdHRsZUZ1bmN0aW9uKDEwMCwgKCkgPT4ge1xuICAgICAgICBsZXQgdGV4dCA9IEFycmF5LmZyb20odGhpcy5wZW5kaW5nLmVudHJpZXMoKSkubWFwKChba2V5LCB2YWx1ZV0pID0+IGAke2tleX06ICR7dmFsdWV9YCkuam9pbihcIiwgXCIpO1xuICAgICAgICBzZXRQZW5kaW5nKHRoaXMucGVuZGluZ0dyb3VwLCB0ZXh0KTtcbiAgICB9KTtcblxuICAgIHB1YmxpYyBhc3luYyByZXNldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5yZXNldCgpO1xuICAgIH1cbn0iXX0=
49
+ /* _JS_SOURCE_HASH = "ed2840ea8600cecb451e492c01363588df0ab65b7e5c4231cffb60d15727a4b6"; */
@@ -0,0 +1,178 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
3
+ //exports.PrivateFileSystemStorage = void 0;
4
+ class PrivateFileSystemStorage {
5
+ constructor(path) {
6
+ this.path = path;
7
+ }
8
+ async ensureInitialized() {
9
+ var _a;
10
+ if (!this.rootHandle) {
11
+ if (!((_a = navigator.storage) === null || _a === void 0 ? void 0 : _a.getDirectory)) {
12
+ throw new Error("Private File System Access API not supported in this browser");
13
+ }
14
+ this.rootHandle = await navigator.storage.getDirectory();
15
+ }
16
+ return this.rootHandle;
17
+ }
18
+ async directoryExists() {
19
+ try {
20
+ const root = await this.ensureInitialized();
21
+ if (!this.path || this.path === "" || this.path === "/") {
22
+ return true; // Root always exists
23
+ }
24
+ const pathParts = this.path.split("/").filter(part => part.length > 0);
25
+ let currentHandle = root;
26
+ for (const part of pathParts) {
27
+ try {
28
+ currentHandle = await currentHandle.getDirectoryHandle(part);
29
+ }
30
+ catch (error) {
31
+ return false;
32
+ }
33
+ }
34
+ return true;
35
+ }
36
+ catch (error) {
37
+ return false;
38
+ }
39
+ }
40
+ async getDirectoryHandle(createPath = true) {
41
+ const root = await this.ensureInitialized();
42
+ if (!this.path || this.path === "" || this.path === "/") {
43
+ return root;
44
+ }
45
+ const pathParts = this.path.split("/").filter(part => part.length > 0);
46
+ let currentHandle = root;
47
+ for (const part of pathParts) {
48
+ try {
49
+ currentHandle = await currentHandle.getDirectoryHandle(part, { create: createPath });
50
+ }
51
+ catch (error) {
52
+ if (!createPath) {
53
+ throw new Error(`Directory not found: ${this.path}`);
54
+ }
55
+ throw error;
56
+ }
57
+ }
58
+ return currentHandle;
59
+ }
60
+ async getFileHandle(key, create = false) {
61
+ try {
62
+ const dirHandle = await this.getDirectoryHandle(create);
63
+ return await dirHandle.getFileHandle(key, { create });
64
+ }
65
+ catch (error) {
66
+ return undefined;
67
+ }
68
+ }
69
+ async fileExists(key) {
70
+ try {
71
+ // First check if directory exists
72
+ if (!(await this.directoryExists())) {
73
+ return false;
74
+ }
75
+ const dirHandle = await this.getDirectoryHandle(false);
76
+ await dirHandle.getFileHandle(key);
77
+ return true;
78
+ }
79
+ catch (error) {
80
+ return false;
81
+ }
82
+ }
83
+ async get(key) {
84
+ // Check if file exists first to avoid unnecessary errors
85
+ if (!(await this.fileExists(key))) {
86
+ return undefined;
87
+ }
88
+ try {
89
+ const fileHandle = await this.getFileHandle(key, false);
90
+ if (!fileHandle) {
91
+ return undefined;
92
+ }
93
+ const file = await fileHandle.getFile();
94
+ const arrayBuffer = await file.arrayBuffer();
95
+ return Buffer.from(arrayBuffer);
96
+ }
97
+ catch (error) {
98
+ console.warn(`Error reading file ${key}:`, error);
99
+ return undefined;
100
+ }
101
+ }
102
+ async set(key, value) {
103
+ try {
104
+ const fileHandle = await this.getFileHandle(key, true);
105
+ if (!fileHandle) {
106
+ throw new Error(`Failed to create file handle for key: ${key}`);
107
+ }
108
+ const writable = await fileHandle.createWritable();
109
+ await writable.write(value);
110
+ await writable.close();
111
+ }
112
+ catch (error) {
113
+ throw new Error(`Failed to write file ${key}: ${error}`);
114
+ }
115
+ }
116
+ async append(key, value) {
117
+ const existingContent = await this.get(key);
118
+ let newContent;
119
+ if (existingContent) {
120
+ newContent = Buffer.concat([existingContent, value]);
121
+ }
122
+ else {
123
+ newContent = value;
124
+ }
125
+ await this.set(key, newContent);
126
+ }
127
+ async remove(key) {
128
+ // Check if file exists first to avoid unnecessary errors
129
+ if (!(await this.fileExists(key))) {
130
+ return; // File doesn't exist, nothing to remove
131
+ }
132
+ try {
133
+ const dirHandle = await this.getDirectoryHandle(false);
134
+ await dirHandle.removeEntry(key);
135
+ }
136
+ catch (_a) { }
137
+ }
138
+ async getKeys() {
139
+ // Check if directory exists first to avoid unnecessary errors
140
+ if (!(await this.directoryExists())) {
141
+ return [];
142
+ }
143
+ try {
144
+ const dirHandle = await this.getDirectoryHandle(false);
145
+ const keys = [];
146
+ // Use the async iterator protocol for FileSystemDirectoryHandle
147
+ for await (const [name, handle] of dirHandle.entries()) {
148
+ if (handle.kind === "file") {
149
+ keys.push(name);
150
+ }
151
+ }
152
+ return keys.sort();
153
+ }
154
+ catch (error) {
155
+ if (error instanceof Error && error.message.includes("Directory not found")) {
156
+ return [];
157
+ }
158
+ throw new Error(`Failed to list files: ${error}`);
159
+ }
160
+ }
161
+ async getInfo(key) {
162
+ let fileHandle = await this.getFileHandle(key, false);
163
+ if (!fileHandle) {
164
+ return undefined;
165
+ }
166
+ let file = await fileHandle.getFile();
167
+ return {
168
+ size: file.size,
169
+ lastModified: file.lastModified,
170
+ };
171
+ }
172
+ async reset() {
173
+ throw new Error("Not implemented");
174
+ }
175
+ }
176
+ exports.PrivateFileSystemStorage = PrivateFileSystemStorage;
177
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJpdmF0ZUZpbGVTeXN0ZW1TdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiUHJpdmF0ZUZpbGVTeXN0ZW1TdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLE1BQWEsd0JBQXdCO0lBR2pDLFlBQW9CLElBQVk7UUFBWixTQUFJLEdBQUosSUFBSSxDQUFRO0lBQUksQ0FBQztJQUU3QixLQUFLLENBQUMsaUJBQWlCOztRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxDQUFBLE1BQUEsU0FBUyxDQUFDLE9BQU8sMENBQUUsWUFBWSxDQUFBLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyw4REFBOEQsQ0FBQyxDQUFDO1lBQ3BGLENBQUM7WUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sU0FBUyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUM3RCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQzNCLENBQUM7SUFFTyxLQUFLLENBQUMsZUFBZTtRQUN6QixJQUFJLENBQUM7WUFDRCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBRTVDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ3RELE9BQU8sSUFBSSxDQUFDLENBQUMscUJBQXFCO1lBQ3RDLENBQUM7WUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3ZFLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQztZQUV6QixLQUFLLE1BQU0sSUFBSSxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUM7b0JBQ0QsYUFBYSxHQUFHLE1BQU0sYUFBYSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNqRSxDQUFDO2dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQ2IsT0FBTyxLQUFLLENBQUM7Z0JBQ2pCLENBQUM7WUFDTCxDQUFDO1lBRUQsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxhQUFzQixJQUFJO1FBQ3ZELE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUN0RCxPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN2RSxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFFekIsS0FBSyxNQUFNLElBQUksSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUM7Z0JBQ0QsYUFBYSxHQUFHLE1BQU0sYUFBYSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQ3pGLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNiLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDZCxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDekQsQ0FBQztnQkFDRCxNQUFNLEtBQUssQ0FBQztZQUNoQixDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sYUFBYSxDQUFDO0lBQ3pCLENBQUM7SUFFTyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQVcsRUFBRSxTQUFrQixLQUFLO1FBQzVELElBQUksQ0FBQztZQUNELE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hELE9BQU8sTUFBTSxTQUFTLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixPQUFPLFNBQVMsQ0FBQztRQUNyQixDQUFDO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBVztRQUNoQyxJQUFJLENBQUM7WUFDRCxrQ0FBa0M7WUFDbEMsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxPQUFPLEtBQUssQ0FBQztZQUNqQixDQUFDO1lBRUQsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkQsTUFBTSxTQUFTLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25DLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2IsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQVc7UUFDeEIseURBQXlEO1FBQ3pELElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDaEMsT0FBTyxTQUFTLENBQUM7UUFDckIsQ0FBQztRQUVELElBQUksQ0FBQztZQUNELE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNkLE9BQU8sU0FBUyxDQUFDO1lBQ3JCLENBQUM7WUFFRCxNQUFNLElBQUksR0FBRyxNQUFNLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN4QyxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM3QyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixPQUFPLENBQUMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNsRCxPQUFPLFNBQVMsQ0FBQztRQUNyQixDQUFDO0lBQ0wsQ0FBQztJQUVNLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBVyxFQUFFLEtBQWE7UUFDdkMsSUFBSSxDQUFDO1lBQ0QsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUNwRSxDQUFDO1lBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxVQUFVLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDbkQsTUFBTSxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVCLE1BQU0sUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzNCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDN0QsQ0FBQztJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQVcsRUFBRSxLQUFhO1FBQzFDLE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QyxJQUFJLFVBQWtCLENBQUM7UUFDdkIsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNsQixVQUFVLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3pELENBQUM7YUFBTSxDQUFDO1lBQ0osVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN2QixDQUFDO1FBQ0QsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFXO1FBQzNCLHlEQUF5RDtRQUN6RCxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2hDLE9BQU8sQ0FBQyx3Q0FBd0M7UUFDcEQsQ0FBQztRQUVELElBQUksQ0FBQztZQUNELE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sU0FBUyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQUMsV0FBTSxDQUFDLENBQUMsQ0FBQztJQUNmLENBQUM7SUFFTSxLQUFLLENBQUMsT0FBTztRQUNoQiw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sRUFBRSxDQUFDO1FBQ2QsQ0FBQztRQUVELElBQUksQ0FBQztZQUNELE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sSUFBSSxHQUFhLEVBQUUsQ0FBQztZQUUxQixnRUFBZ0U7WUFDaEUsSUFBSSxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSyxTQUFpQixDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7Z0JBQzlELElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztvQkFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEIsQ0FBQztZQUNMLENBQUM7WUFFRCxPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNiLElBQUksS0FBSyxZQUFZLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUM7Z0JBQzFFLE9BQU8sRUFBRSxDQUFDO1lBQ2QsQ0FBQztZQUNELE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDdEQsQ0FBQztJQUNMLENBQUM7SUFDTSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQVc7UUFJNUIsSUFBSSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDZCxPQUFPLFNBQVMsQ0FBQztRQUNyQixDQUFDO1FBQ0QsSUFBSSxJQUFJLEdBQUcsTUFBTSxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdEMsT0FBTztZQUNILElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtTQUNsQyxDQUFDO0lBQ04sQ0FBQztJQUNNLEtBQUssQ0FBQyxLQUFLO1FBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7Q0FDSjtBQTdMRCw0REE2TEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJU3RvcmFnZVJhdyB9IGZyb20gXCIuL0lTdG9yYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBQcml2YXRlRmlsZVN5c3RlbVN0b3JhZ2UgaW1wbGVtZW50cyBJU3RvcmFnZVJhdyB7XG4gICAgcHJpdmF0ZSByb290SGFuZGxlOiBGaWxlU3lzdGVtRGlyZWN0b3J5SGFuZGxlIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBwYXRoOiBzdHJpbmcpIHsgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBlbnN1cmVJbml0aWFsaXplZCgpOiBQcm9taXNlPEZpbGVTeXN0ZW1EaXJlY3RvcnlIYW5kbGU+IHtcbiAgICAgICAgaWYgKCF0aGlzLnJvb3RIYW5kbGUpIHtcbiAgICAgICAgICAgIGlmICghbmF2aWdhdG9yLnN0b3JhZ2U/LmdldERpcmVjdG9yeSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlByaXZhdGUgRmlsZSBTeXN0ZW0gQWNjZXNzIEFQSSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlclwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucm9vdEhhbmRsZSA9IGF3YWl0IG5hdmlnYXRvci5zdG9yYWdlLmdldERpcmVjdG9yeSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJvb3RIYW5kbGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBkaXJlY3RvcnlFeGlzdHMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByb290ID0gYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMucGF0aCB8fCB0aGlzLnBhdGggPT09IFwiXCIgfHwgdGhpcy5wYXRoID09PSBcIi9cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBSb290IGFsd2F5cyBleGlzdHNcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcGF0aFBhcnRzID0gdGhpcy5wYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIocGFydCA9PiBwYXJ0Lmxlbmd0aCA+IDApO1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRIYW5kbGUgPSByb290O1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGF0aFBhcnRzKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEhhbmRsZSA9IGF3YWl0IGN1cnJlbnRIYW5kbGUuZ2V0RGlyZWN0b3J5SGFuZGxlKHBhcnQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXREaXJlY3RvcnlIYW5kbGUoY3JlYXRlUGF0aDogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPEZpbGVTeXN0ZW1EaXJlY3RvcnlIYW5kbGU+IHtcbiAgICAgICAgY29uc3Qgcm9vdCA9IGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcblxuICAgICAgICBpZiAoIXRoaXMucGF0aCB8fCB0aGlzLnBhdGggPT09IFwiXCIgfHwgdGhpcy5wYXRoID09PSBcIi9cIikge1xuICAgICAgICAgICAgcmV0dXJuIHJvb3Q7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXRoUGFydHMgPSB0aGlzLnBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihwYXJ0ID0+IHBhcnQubGVuZ3RoID4gMCk7XG4gICAgICAgIGxldCBjdXJyZW50SGFuZGxlID0gcm9vdDtcblxuICAgICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGF0aFBhcnRzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRIYW5kbGUgPSBhd2FpdCBjdXJyZW50SGFuZGxlLmdldERpcmVjdG9yeUhhbmRsZShwYXJ0LCB7IGNyZWF0ZTogY3JlYXRlUGF0aCB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjcmVhdGVQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRGlyZWN0b3J5IG5vdCBmb3VuZDogJHt0aGlzLnBhdGh9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnRIYW5kbGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRGaWxlSGFuZGxlKGtleTogc3RyaW5nLCBjcmVhdGU6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8RmlsZVN5c3RlbUZpbGVIYW5kbGUgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGRpckhhbmRsZSA9IGF3YWl0IHRoaXMuZ2V0RGlyZWN0b3J5SGFuZGxlKGNyZWF0ZSk7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZGlySGFuZGxlLmdldEZpbGVIYW5kbGUoa2V5LCB7IGNyZWF0ZSB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGZpbGVFeGlzdHMoa2V5OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEZpcnN0IGNoZWNrIGlmIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgICAgICAgIGlmICghKGF3YWl0IHRoaXMuZGlyZWN0b3J5RXhpc3RzKCkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkaXJIYW5kbGUgPSBhd2FpdCB0aGlzLmdldERpcmVjdG9yeUhhbmRsZShmYWxzZSk7XG4gICAgICAgICAgICBhd2FpdCBkaXJIYW5kbGUuZ2V0RmlsZUhhbmRsZShrZXkpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgZmlsZSBleGlzdHMgZmlyc3QgdG8gYXZvaWQgdW5uZWNlc3NhcnkgZXJyb3JzXG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuZmlsZUV4aXN0cyhrZXkpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlSGFuZGxlID0gYXdhaXQgdGhpcy5nZXRGaWxlSGFuZGxlKGtleSwgZmFsc2UpO1xuICAgICAgICAgICAgaWYgKCFmaWxlSGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmlsZSA9IGF3YWl0IGZpbGVIYW5kbGUuZ2V0RmlsZSgpO1xuICAgICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCBmaWxlLmFycmF5QnVmZmVyKCk7XG4gICAgICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oYXJyYXlCdWZmZXIpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBFcnJvciByZWFkaW5nIGZpbGUgJHtrZXl9OmAsIGVycm9yKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlSGFuZGxlID0gYXdhaXQgdGhpcy5nZXRGaWxlSGFuZGxlKGtleSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoIWZpbGVIYW5kbGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgZmlsZSBoYW5kbGUgZm9yIGtleTogJHtrZXl9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHdyaXRhYmxlID0gYXdhaXQgZmlsZUhhbmRsZS5jcmVhdGVXcml0YWJsZSgpO1xuICAgICAgICAgICAgYXdhaXQgd3JpdGFibGUud3JpdGUodmFsdWUpO1xuICAgICAgICAgICAgYXdhaXQgd3JpdGFibGUuY2xvc2UoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHdyaXRlIGZpbGUgJHtrZXl9OiAke2Vycm9yfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGFwcGVuZChrZXk6IHN0cmluZywgdmFsdWU6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBleGlzdGluZ0NvbnRlbnQgPSBhd2FpdCB0aGlzLmdldChrZXkpO1xuICAgICAgICBsZXQgbmV3Q29udGVudDogQnVmZmVyO1xuICAgICAgICBpZiAoZXhpc3RpbmdDb250ZW50KSB7XG4gICAgICAgICAgICBuZXdDb250ZW50ID0gQnVmZmVyLmNvbmNhdChbZXhpc3RpbmdDb250ZW50LCB2YWx1ZV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3Q29udGVudCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0KGtleSwgbmV3Q29udGVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlbW92ZShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBDaGVjayBpZiBmaWxlIGV4aXN0cyBmaXJzdCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBlcnJvcnNcbiAgICAgICAgaWYgKCEoYXdhaXQgdGhpcy5maWxlRXhpc3RzKGtleSkpKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIEZpbGUgZG9lc24ndCBleGlzdCwgbm90aGluZyB0byByZW1vdmVcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBkaXJIYW5kbGUgPSBhd2FpdCB0aGlzLmdldERpcmVjdG9yeUhhbmRsZShmYWxzZSk7XG4gICAgICAgICAgICBhd2FpdCBkaXJIYW5kbGUucmVtb3ZlRW50cnkoa2V5KTtcbiAgICAgICAgfSBjYXRjaCB7IH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0S2V5cygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIC8vIENoZWNrIGlmIGRpcmVjdG9yeSBleGlzdHMgZmlyc3QgdG8gYXZvaWQgdW5uZWNlc3NhcnkgZXJyb3JzXG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuZGlyZWN0b3J5RXhpc3RzKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZGlySGFuZGxlID0gYXdhaXQgdGhpcy5nZXREaXJlY3RvcnlIYW5kbGUoZmFsc2UpO1xuICAgICAgICAgICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICAgICAgLy8gVXNlIHRoZSBhc3luYyBpdGVyYXRvciBwcm90b2NvbCBmb3IgRmlsZVN5c3RlbURpcmVjdG9yeUhhbmRsZVxuICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBbbmFtZSwgaGFuZGxlXSBvZiAoZGlySGFuZGxlIGFzIGFueSkuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZS5raW5kID09PSBcImZpbGVcIikge1xuICAgICAgICAgICAgICAgICAgICBrZXlzLnB1c2gobmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ga2V5cy5zb3J0KCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiRGlyZWN0b3J5IG5vdCBmb3VuZFwiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxpc3QgZmlsZXM6ICR7ZXJyb3J9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHVibGljIGFzeW5jIGdldEluZm8oa2V5OiBzdHJpbmcpOiBQcm9taXNlPHVuZGVmaW5lZCB8IHtcbiAgICAgICAgc2l6ZTogbnVtYmVyO1xuICAgICAgICBsYXN0TW9kaWZpZWQ6IG51bWJlcjtcbiAgICB9PiB7XG4gICAgICAgIGxldCBmaWxlSGFuZGxlID0gYXdhaXQgdGhpcy5nZXRGaWxlSGFuZGxlKGtleSwgZmFsc2UpO1xuICAgICAgICBpZiAoIWZpbGVIYW5kbGUpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZpbGUgPSBhd2FpdCBmaWxlSGFuZGxlLmdldEZpbGUoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNpemU6IGZpbGUuc2l6ZSxcbiAgICAgICAgICAgIGxhc3RNb2RpZmllZDogZmlsZS5sYXN0TW9kaWZpZWQsXG4gICAgICAgIH07XG4gICAgfVxuICAgIHB1YmxpYyBhc3luYyByZXNldCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpO1xuICAgIH1cbn0iXX0=
178
+ /* _JS_SOURCE_HASH = "148396348ae7c1ec76d652412f67620680447daaa3a8cfe83212b76412f8bc73"; */
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
3
+ //exports.StorageSync = void 0;
4
+ const mobxTyped_1 = require("../misc/mobxTyped");
5
+ const types_1 = require("../misc/types");
6
+ // NOTE: At around 500K values (depending on their size to some degree), this will take about 2 minutes to load. But once it does it will be fast. So... keep that in mind. I recommend not exceeding 100K
7
+ class StorageSync {
8
+ constructor(storage) {
9
+ this.storage = storage;
10
+ this.cached = mobxTyped_1.observable.map(undefined, { deep: false });
11
+ this.infoCached = mobxTyped_1.observable.map(undefined, { deep: false });
12
+ this.keys = new Set();
13
+ this.synced = (0, mobxTyped_1.observable)({
14
+ keySeqNum: 0,
15
+ }, undefined, { deep: false });
16
+ this.loadedKeys = false;
17
+ }
18
+ get(key) {
19
+ if (!this.cached.has(key)) {
20
+ this.cached.set(key, undefined);
21
+ void this.getPromise(key);
22
+ }
23
+ if (this.cached.get(key) === undefined) {
24
+ this.synced.keySeqNum;
25
+ }
26
+ return this.cached.get(key);
27
+ }
28
+ set(key, value) {
29
+ if (!this.keys.has(key)) {
30
+ this.keys.add(key);
31
+ this.synced.keySeqNum++;
32
+ }
33
+ this.cached.set(key, value);
34
+ void this.storage.set(key, value);
35
+ }
36
+ remove(key) {
37
+ if (this.keys.has(key)) {
38
+ this.keys.delete(key);
39
+ this.synced.keySeqNum++;
40
+ }
41
+ this.cached.delete(key);
42
+ void this.storage.remove(key);
43
+ }
44
+ getKeys() {
45
+ void this.getKeysPromise();
46
+ this.synced.keySeqNum;
47
+ return Array.from(this.keys);
48
+ }
49
+ getInfo(key) {
50
+ if (!this.infoCached.has(key)) {
51
+ this.infoCached.set(key, { size: 0, lastModified: 0 });
52
+ void this.storage.getInfo(key).then(info => {
53
+ this.infoCached.set(key, info);
54
+ });
55
+ }
56
+ return this.infoCached.get(key);
57
+ }
58
+ getValues() {
59
+ let keys = this.getKeys();
60
+ return keys.map(key => this.get(key)).filter(types_1.isDefined);
61
+ }
62
+ getEntries() {
63
+ let keys = this.getKeys();
64
+ return keys.map(key => [key, this.get(key)]).filter(([_, value]) => (0, types_1.isDefined)(value));
65
+ }
66
+ async getPromise(key) {
67
+ let value = this.cached.get(key);
68
+ if (value === undefined) {
69
+ value = await this.storage.get(key);
70
+ if (this.cached.get(key) === undefined) {
71
+ this.cached.set(key, value);
72
+ }
73
+ }
74
+ return value;
75
+ }
76
+ async getKeysPromise() {
77
+ if (this.pendingGetKeys) {
78
+ return this.pendingGetKeys;
79
+ }
80
+ if (this.loadedKeys)
81
+ return Array.from(this.keys);
82
+ this.loadedKeys = true;
83
+ this.pendingGetKeys = this.storage.getKeys();
84
+ void this.pendingGetKeys.finally(() => {
85
+ this.pendingGetKeys = undefined;
86
+ });
87
+ let keys = await this.pendingGetKeys;
88
+ if (keys.length > 0) {
89
+ this.keys = new Set(keys);
90
+ this.synced.keySeqNum++;
91
+ }
92
+ return Array.from(this.keys);
93
+ }
94
+ reload() {
95
+ this.loadedKeys = false;
96
+ this.synced.keySeqNum++;
97
+ this.cached.clear();
98
+ this.infoCached.clear();
99
+ this.keys.clear();
100
+ }
101
+ reloadKeys() {
102
+ this.loadedKeys = false;
103
+ this.synced.keySeqNum++;
104
+ }
105
+ reloadKey(key) {
106
+ this.cached.delete(key);
107
+ this.infoCached.delete(key);
108
+ this.keys.delete(key);
109
+ }
110
+ async reset() {
111
+ this.cached.clear();
112
+ this.infoCached.clear();
113
+ this.keys.clear();
114
+ this.synced.keySeqNum++;
115
+ await this.storage.reset();
116
+ }
117
+ }
118
+ exports.StorageSync = StorageSync;
119
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RvcmFnZU9ic2VydmFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJTdG9yYWdlT2JzZXJ2YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpREFBK0M7QUFDL0MseUNBQTBDO0FBRzFDLDBNQUEwTTtBQUMxTSxNQUFhLFdBQVc7SUFRcEIsWUFBbUIsT0FBb0I7UUFBcEIsWUFBTyxHQUFQLE9BQU8sQ0FBYTtRQVB2QyxXQUFNLEdBQUcsc0JBQVUsQ0FBQyxHQUFHLENBQXdCLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzNFLGVBQVUsR0FBRyxzQkFBVSxDQUFDLEdBQUcsQ0FBNkQsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDcEgsU0FBSSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDekIsV0FBTSxHQUFHLElBQUEsc0JBQVUsRUFBQztZQUNoQixTQUFTLEVBQUUsQ0FBQztTQUNmLEVBQUUsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUE4QnZCLGVBQVUsR0FBRyxLQUFLLENBQUM7SUE1QmdCLENBQUM7SUFFckMsR0FBRyxDQUFDLEdBQVc7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLEtBQUssSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUMxQixDQUFDO1FBQ0QsT0FBTyxJ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QUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVNLE1BQU07UUFDVCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFDTSxVQUFVO1FBQ2IsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBQ00sU0FBUyxDQUFDLEdBQVc7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUFLO1FBQ2QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN4QixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDL0IsQ0FBQztDQUNKO0FBcEhELGtDQW9IQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG9ic2VydmFibGUgfSBmcm9tIFwiLi4vbWlzYy9tb2J4VHlwZWRcIjtcbmltcG9ydCB7IGlzRGVmaW5lZCB9IGZyb20gXCIuLi9taXNjL3R5cGVzXCI7XG5pbXBvcnQgeyBJU3RvcmFnZSwgSVN0b3JhZ2VTeW5jIH0gZnJvbSBcIi4vSVN0b3JhZ2VcIjtcblxuLy8gTk9URTogQXQgYXJvdW5kIDUwMEsgdmFsdWVzIChkZXBlbmRpbmcgb24gdGhlaXIgc2l6ZSB0byBzb21lIGRlZ3JlZSksIHRoaXMgd2lsbCB0YWtlIGFib3V0IDIgbWludXRlcyB0byBsb2FkLiBCdXQgb25jZSBpdCBkb2VzIGl0IHdpbGwgYmUgZmFzdC4gU28uLi4ga2VlcCB0aGF0IGluIG1pbmQuIEkgcmVjb21tZW5kIG5vdCBleGNlZWRpbmcgMTAwS1xuZXhwb3J0IGNsYXNzIFN0b3JhZ2VTeW5jPFQ+IGltcGxlbWVudHMgSVN0b3JhZ2VTeW5jPFQ+IHtcbiAgICBjYWNoZWQgPSBvYnNlcnZhYmxlLm1hcDxzdHJpbmcsIFQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCwgeyBkZWVwOiBmYWxzZSB9KTtcbiAgICBpbmZvQ2FjaGVkID0gb2JzZXJ2YWJsZS5tYXA8c3RyaW5nLCB7IHNpemU6IG51bWJlcjsgbGFzdE1vZGlmaWVkOiBudW1iZXIgfSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkLCB7IGRlZXA6IGZhbHNlIH0pO1xuICAgIGtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBzeW5jZWQgPSBvYnNlcnZhYmxlKHtcbiAgICAgICAga2V5U2VxTnVtOiAwLFxuICAgIH0sIHVuZGVmaW5lZCwgeyBkZWVwOiBmYWxzZSB9KTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBzdG9yYWdlOiBJU3RvcmFnZTxUPikgeyB9XG5cbiAgICBwdWJsaWMgZ2V0KGtleTogc3RyaW5nKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICghdGhpcy5jYWNoZWQuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHRoaXMuY2FjaGVkLnNldChrZXksIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB2b2lkIHRoaXMuZ2V0UHJvbWlzZShrZXkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNhY2hlZC5nZXQoa2V5KSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnN5bmNlZC5rZXlTZXFOdW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkLmdldChrZXkpO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogVCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMua2V5cy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgdGhpcy5rZXlzLmFkZChrZXkpO1xuICAgICAgICAgICAgdGhpcy5zeW5jZWQua2V5U2VxTnVtKys7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWNoZWQuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB2b2lkIHRoaXMuc3RvcmFnZS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICAgIHB1YmxpYyByZW1vdmUoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMua2V5cy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgdGhpcy5rZXlzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgdGhpcy5zeW5jZWQua2V5U2VxTnVtKys7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWNoZWQuZGVsZXRlKGtleSk7XG4gICAgICAgIHZvaWQgdGhpcy5zdG9yYWdlLnJlbW92ZShrZXkpO1xuICAgIH1cbiAgICBwcml2YXRlIGxvYWRlZEtleXMgPSBmYWxzZTtcbiAgICBwdWJsaWMgZ2V0S2V5cygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHZvaWQgdGhpcy5nZXRLZXlzUHJvbWlzZSgpO1xuICAgICAgICB0aGlzLnN5bmNlZC5rZXlTZXFOdW07XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMua2V5cyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEluZm8oa2V5OiBzdHJpbmcpOiB7IHNpemU6IG51bWJlcjsgbGFzdE1vZGlmaWVkOiBudW1iZXIgfSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICghdGhpcy5pbmZvQ2FjaGVkLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICB0aGlzLmluZm9DYWNoZWQuc2V0KGtleSwgeyBzaXplOiAwLCBsYXN0TW9kaWZpZWQ6IDAgfSk7XG4gICAgICAgICAgICB2b2lkIHRoaXMuc3RvcmFnZS5nZXRJbmZvKGtleSkudGhlbihpbmZvID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmluZm9DYWNoZWQuc2V0KGtleSwgaW5mbyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5pbmZvQ2FjaGVkLmdldChrZXkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRWYWx1ZXMoKTogVFtdIHtcbiAgICAgICAgbGV0IGtleXMgPSB0aGlzLmdldEtleXMoKTtcbiAgICAgICAgcmV0dXJuIGtleXMubWFwKGtleSA9PiB0aGlzLmdldChrZXkpKS5maWx0ZXIoaXNEZWZpbmVkKTtcbiAgICB9XG4gICAgcHVibGljIGdldEVudHJpZXMoKTogW3N0cmluZywgVF1bXSB7XG4gICAgICAgIGxldCBrZXlzID0gdGhpcy5nZXRLZXlzKCk7XG4gICAgICAgIHJldHVybiBrZXlzLm1hcChrZXkgPT4gW2tleSwgdGhpcy5nZXQoa2V5KV0pLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gaXNEZWZpbmVkKHZhbHVlKSkgYXMgW3N0cmluZywgVF1bXTtcbiAgICB9XG5cblxuICAgIHB1YmxpYyBhc3luYyBnZXRQcm9taXNlKGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuY2FjaGVkLmdldChrZXkpO1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFsdWUgPSBhd2FpdCB0aGlzLnN0b3JhZ2UuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAodGhpcy5jYWNoZWQuZ2V0KGtleSkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVkLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHByaXZhdGUgcGVuZGluZ0dldEtleXM6IFByb21pc2U8c3RyaW5nW10+IHwgdW5kZWZpbmVkO1xuICAgIHB1YmxpYyBhc3luYyBnZXRLZXlzUHJvbWlzZSgpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdHZXRLZXlzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wZW5kaW5nR2V0S2V5cztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5sb2FkZWRLZXlzKSByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmtleXMpO1xuICAgICAgICB0aGlzLmxvYWRlZEtleXMgPSB0cnVlO1xuICAgICAgICB0aGlzLnBlbmRpbmdHZXRLZXlzID0gdGhpcy5zdG9yYWdlLmdldEtleXMoKTtcbiAgICAgICAgdm9pZCB0aGlzLnBlbmRpbmdHZXRLZXlzLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nR2V0S2V5cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBrZXlzID0gYXdhaXQgdGhpcy5wZW5kaW5nR2V0S2V5cztcbiAgICAgICAgaWYgKGtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5rZXlzID0gbmV3IFNldChrZXlzKTtcbiAgICAgICAgICAgIHRoaXMuc3luY2VkLmtleVNlcU51bSsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMua2V5cyk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbG9hZCgpIHtcbiAgICAgICAgdGhpcy5sb2FkZWRLZXlzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc3luY2VkLmtleVNlcU51bSsrO1xuICAgICAgICB0aGlzLmNhY2hlZC5jbGVhcigpO1xuICAgICAgICB0aGlzLmluZm9DYWNoZWQuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5rZXlzLmNsZWFyKCk7XG4gICAgfVxuICAgIHB1YmxpYyByZWxvYWRLZXlzKCkge1xuICAgICAgICB0aGlzLmxvYWRlZEtleXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zeW5jZWQua2V5U2VxTnVtKys7XG4gICAgfVxuICAgIHB1YmxpYyByZWxvYWRLZXkoa2V5OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5jYWNoZWQuZGVsZXRlKGtleSk7XG4gICAgICAgIHRoaXMuaW5mb0NhY2hlZC5kZWxldGUoa2V5KTtcbiAgICAgICAgdGhpcy5rZXlzLmRlbGV0ZShrZXkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZXNldCgpIHtcbiAgICAgICAgdGhpcy5jYWNoZWQuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5pbmZvQ2FjaGVkLmNsZWFyKCk7XG4gICAgICAgIHRoaXMua2V5cy5jbGVhcigpO1xuICAgICAgICB0aGlzLnN5bmNlZC5rZXlTZXFOdW0rKztcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlLnJlc2V0KCk7XG4gICAgfVxufSJdfQ==
120
+ /* _JS_SOURCE_HASH = "83f7e3709b75068426ee34cfb27c8af75bbde2d429ccc896355bd2c176744eaa"; */