@sochdb/sochdb 0.4.0 → 0.4.1

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 (69) hide show
  1. package/README.md +220 -33
  2. package/_bin/aarch64-apple-darwin/libsochdb_storage.dylib +0 -0
  3. package/_bin/aarch64-apple-darwin/sochdb-bulk +0 -0
  4. package/_bin/aarch64-apple-darwin/sochdb-grpc-server +0 -0
  5. package/_bin/aarch64-apple-darwin/sochdb-server +0 -0
  6. package/_bin/x86_64-pc-windows-msvc/sochdb-bulk.exe +0 -0
  7. package/_bin/x86_64-pc-windows-msvc/sochdb-grpc-server.exe +0 -0
  8. package/_bin/x86_64-pc-windows-msvc/sochdb_storage.dll +0 -0
  9. package/_bin/x86_64-unknown-linux-gnu/libsochdb_storage.so +0 -0
  10. package/_bin/x86_64-unknown-linux-gnu/sochdb-bulk +0 -0
  11. package/_bin/x86_64-unknown-linux-gnu/sochdb-grpc-server +0 -0
  12. package/_bin/x86_64-unknown-linux-gnu/sochdb-server +0 -0
  13. package/bin/sochdb-bulk.js +1 -1
  14. package/bin/sochdb-grpc-server.js +1 -1
  15. package/bin/sochdb-server.js +1 -1
  16. package/dist/cjs/context-builder.js +280 -0
  17. package/dist/cjs/database.js +2 -2
  18. package/dist/cjs/embedded/database.js +2 -2
  19. package/dist/cjs/errors.js +99 -7
  20. package/dist/cjs/index.js +40 -3
  21. package/dist/cjs/ipc-client.js +2 -2
  22. package/dist/cjs/memory/consolidation.js +202 -0
  23. package/dist/cjs/memory/extraction.js +181 -0
  24. package/dist/cjs/memory/index.js +26 -0
  25. package/dist/cjs/memory/retrieval.js +232 -0
  26. package/dist/cjs/memory/types.js +69 -0
  27. package/dist/cjs/namespace.js +255 -0
  28. package/dist/cjs/queue.js +289 -0
  29. package/dist/cjs/semantic-cache.js +220 -0
  30. package/dist/esm/context-builder.js +280 -0
  31. package/dist/esm/database.js +2 -2
  32. package/dist/esm/embedded/database.js +2 -2
  33. package/dist/esm/errors.js +107 -7
  34. package/dist/esm/index.js +40 -3
  35. package/dist/esm/ipc-client.js +2 -2
  36. package/dist/esm/memory/consolidation.js +206 -0
  37. package/dist/esm/memory/extraction.js +185 -0
  38. package/dist/esm/memory/index.js +26 -0
  39. package/dist/esm/memory/retrieval.js +243 -0
  40. package/dist/esm/memory/types.js +72 -0
  41. package/dist/esm/namespace.js +262 -0
  42. package/dist/esm/queue.js +291 -0
  43. package/dist/esm/semantic-cache.js +223 -0
  44. package/dist/types/context-builder.d.ts +97 -0
  45. package/dist/types/context-builder.d.ts.map +1 -0
  46. package/dist/types/database.d.ts +1 -1
  47. package/dist/types/embedded/database.d.ts +1 -1
  48. package/dist/types/errors.d.ts +57 -1
  49. package/dist/types/errors.d.ts.map +1 -1
  50. package/dist/types/index.d.ts +12 -2
  51. package/dist/types/index.d.ts.map +1 -1
  52. package/dist/types/ipc-client.d.ts +1 -1
  53. package/dist/types/memory/consolidation.d.ts +66 -0
  54. package/dist/types/memory/consolidation.d.ts.map +1 -0
  55. package/dist/types/memory/extraction.d.ts +82 -0
  56. package/dist/types/memory/extraction.d.ts.map +1 -0
  57. package/dist/types/memory/index.d.ts +10 -0
  58. package/dist/types/memory/index.d.ts.map +1 -0
  59. package/dist/types/memory/retrieval.d.ts +46 -0
  60. package/dist/types/memory/retrieval.d.ts.map +1 -0
  61. package/dist/types/memory/types.d.ts +147 -0
  62. package/dist/types/memory/types.d.ts.map +1 -0
  63. package/dist/types/namespace.d.ts +129 -0
  64. package/dist/types/namespace.d.ts.map +1 -0
  65. package/dist/types/queue.d.ts +120 -0
  66. package/dist/types/queue.d.ts.map +1 -0
  67. package/dist/types/semantic-cache.d.ts +84 -0
  68. package/dist/types/semantic-cache.d.ts.map +1 -0
  69. package/package.json +1 -1
package/dist/esm/index.js CHANGED
@@ -37,9 +37,9 @@
37
37
  * ```
38
38
  */
39
39
  Object.defineProperty(exports, "__esModule", { value: true });
40
- exports.GrpcClient = exports.DatabaseError = exports.ProtocolError = exports.TransactionError = exports.ConnectionError = exports.SochDBError = exports.Query = exports.FormatConversionError = exports.FormatCapabilities = exports.CanonicalFormat = exports.ContextFormat = exports.WireFormat = exports.IpcClient = exports.SochDBClient = exports.Database = exports.EmbeddedTransaction = exports.EmbeddedDatabase = exports.VERSION = void 0;
40
+ exports.GrpcClient = exports.SplitBrainError = exports.EpochMismatchError = exports.LockTimeoutError = exports.DatabaseLockedError = exports.LockError = exports.ErrorCode = exports.DatabaseError = exports.ProtocolError = exports.TransactionError = exports.ConnectionError = exports.SochDBError = exports.Query = exports.FormatConversionError = exports.FormatCapabilities = exports.CanonicalFormat = exports.ContextFormat = exports.WireFormat = exports.IpcClient = exports.SochDBClient = exports.NamespacePolicy = exports.AllowedSet = exports.HybridRetriever = exports.Consolidator = exports.ExtractionPipeline = exports.createContextBuilder = exports.TruncationStrategy = exports.ContextOutputFormat = exports.ContextQueryBuilder = exports.SemanticCache = exports.createQueue = exports.TaskState = exports.PriorityQueue = exports.CollectionExistsError = exports.CollectionNotFoundError = exports.NamespaceExistsError = exports.NamespaceNotFoundError = exports.DistanceMetric = exports.Collection = exports.Namespace = exports.Database = exports.EmbeddedTransaction = exports.EmbeddedDatabase = exports.VERSION = void 0;
41
41
  // Version
42
- exports.VERSION = '0.4.0';
42
+ exports.VERSION = '0.4.1';
43
43
  // Embedded mode (FFI) - NEW
44
44
  var embedded_1 = require("./embedded");
45
45
  Object.defineProperty(exports, "EmbeddedDatabase", { enumerable: true, get: function () { return embedded_1.EmbeddedDatabase; } });
@@ -48,6 +48,36 @@ Object.defineProperty(exports, "EmbeddedTransaction", { enumerable: true, get: f
48
48
  // Embedded mode (FFI) - Convenience alias
49
49
  var embedded_3 = require("./embedded");
50
50
  Object.defineProperty(exports, "Database", { enumerable: true, get: function () { return embedded_3.EmbeddedDatabase; } });
51
+ // Namespace API (v0.4.1)
52
+ var namespace_1 = require("./namespace");
53
+ Object.defineProperty(exports, "Namespace", { enumerable: true, get: function () { return namespace_1.Namespace; } });
54
+ Object.defineProperty(exports, "Collection", { enumerable: true, get: function () { return namespace_1.Collection; } });
55
+ Object.defineProperty(exports, "DistanceMetric", { enumerable: true, get: function () { return namespace_1.DistanceMetric; } });
56
+ Object.defineProperty(exports, "NamespaceNotFoundError", { enumerable: true, get: function () { return namespace_1.NamespaceNotFoundError; } });
57
+ Object.defineProperty(exports, "NamespaceExistsError", { enumerable: true, get: function () { return namespace_1.NamespaceExistsError; } });
58
+ Object.defineProperty(exports, "CollectionNotFoundError", { enumerable: true, get: function () { return namespace_1.CollectionNotFoundError; } });
59
+ Object.defineProperty(exports, "CollectionExistsError", { enumerable: true, get: function () { return namespace_1.CollectionExistsError; } });
60
+ // Queue API (v0.4.1)
61
+ var queue_1 = require("./queue");
62
+ Object.defineProperty(exports, "PriorityQueue", { enumerable: true, get: function () { return queue_1.PriorityQueue; } });
63
+ Object.defineProperty(exports, "TaskState", { enumerable: true, get: function () { return queue_1.TaskState; } });
64
+ Object.defineProperty(exports, "createQueue", { enumerable: true, get: function () { return queue_1.createQueue; } });
65
+ // Semantic Cache (v0.4.1)
66
+ var semantic_cache_1 = require("./semantic-cache");
67
+ Object.defineProperty(exports, "SemanticCache", { enumerable: true, get: function () { return semantic_cache_1.SemanticCache; } });
68
+ // Context Builder (v0.4.1)
69
+ var context_builder_1 = require("./context-builder");
70
+ Object.defineProperty(exports, "ContextQueryBuilder", { enumerable: true, get: function () { return context_builder_1.ContextQueryBuilder; } });
71
+ Object.defineProperty(exports, "ContextOutputFormat", { enumerable: true, get: function () { return context_builder_1.ContextOutputFormat; } });
72
+ Object.defineProperty(exports, "TruncationStrategy", { enumerable: true, get: function () { return context_builder_1.TruncationStrategy; } });
73
+ Object.defineProperty(exports, "createContextBuilder", { enumerable: true, get: function () { return context_builder_1.createContextBuilder; } });
74
+ // Memory System (v0.4.2)
75
+ var memory_1 = require("./memory");
76
+ Object.defineProperty(exports, "ExtractionPipeline", { enumerable: true, get: function () { return memory_1.ExtractionPipeline; } });
77
+ Object.defineProperty(exports, "Consolidator", { enumerable: true, get: function () { return memory_1.Consolidator; } });
78
+ Object.defineProperty(exports, "HybridRetriever", { enumerable: true, get: function () { return memory_1.HybridRetriever; } });
79
+ Object.defineProperty(exports, "AllowedSet", { enumerable: true, get: function () { return memory_1.AllowedSet; } });
80
+ Object.defineProperty(exports, "NamespacePolicy", { enumerable: true, get: function () { return memory_1.NamespacePolicy; } });
51
81
  // Server mode (gRPC/IPC)
52
82
  var grpc_client_1 = require("./grpc-client");
53
83
  Object.defineProperty(exports, "SochDBClient", { enumerable: true, get: function () { return grpc_client_1.SochDBClient; } });
@@ -69,7 +99,14 @@ Object.defineProperty(exports, "ConnectionError", { enumerable: true, get: funct
69
99
  Object.defineProperty(exports, "TransactionError", { enumerable: true, get: function () { return errors_1.TransactionError; } });
70
100
  Object.defineProperty(exports, "ProtocolError", { enumerable: true, get: function () { return errors_1.ProtocolError; } });
71
101
  Object.defineProperty(exports, "DatabaseError", { enumerable: true, get: function () { return errors_1.DatabaseError; } });
102
+ // Lock errors (v0.4.1)
103
+ Object.defineProperty(exports, "ErrorCode", { enumerable: true, get: function () { return errors_1.ErrorCode; } });
104
+ Object.defineProperty(exports, "LockError", { enumerable: true, get: function () { return errors_1.LockError; } });
105
+ Object.defineProperty(exports, "DatabaseLockedError", { enumerable: true, get: function () { return errors_1.DatabaseLockedError; } });
106
+ Object.defineProperty(exports, "LockTimeoutError", { enumerable: true, get: function () { return errors_1.LockTimeoutError; } });
107
+ Object.defineProperty(exports, "EpochMismatchError", { enumerable: true, get: function () { return errors_1.EpochMismatchError; } });
108
+ Object.defineProperty(exports, "SplitBrainError", { enumerable: true, get: function () { return errors_1.SplitBrainError; } });
72
109
  // Convenience alias
73
110
  var grpc_client_2 = require("./grpc-client");
74
111
  Object.defineProperty(exports, "GrpcClient", { enumerable: true, get: function () { return grpc_client_2.SochDBClient; } });
75
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQ0c7OztBQUVILFVBQVU7QUFDRyxRQUFBLE9BQU8sR0FBRyxPQUFPLENBQUM7QUFFL0IsNEJBQTRCO0FBQzVCLHVDQUFzRTtBQUE3RCw0R0FBQSxnQkFBZ0IsT0FBQTtBQUN6Qix1Q0FBaUQ7QUFBeEMsK0dBQUEsbUJBQW1CLE9BQUE7QUFFNUIsMENBQTBDO0FBQzFDLHVDQUEwRDtBQUFqRCxvR0FBQSxnQkFBZ0IsT0FBWTtBQUVyQyx5QkFBeUI7QUFDekIsNkNBQTZDO0FBQXBDLDJHQUFBLFlBQVksT0FBQTtBQVFyQiwyQ0FBeUM7QUFBaEMsdUdBQUEsU0FBUyxPQUFBO0FBRWxCLG1CQUFtQjtBQUNuQixtQ0FNa0I7QUFMaEIsb0dBQUEsVUFBVSxPQUFBO0FBQ1YsdUdBQUEsYUFBYSxPQUFBO0FBQ2IseUdBQUEsZUFBZSxPQUFBO0FBQ2YsNEdBQUEsa0JBQWtCLE9BQUE7QUFDbEIsK0dBQUEscUJBQXFCLE9BQUE7QUFHdkIsbUJBQW1CO0FBQ25CLGlDQUFnQztBQUF2Qiw4RkFBQSxLQUFLLE9BQUE7QUFHZCxtQ0FNa0I7QUFMaEIscUdBQUEsV0FBVyxPQUFBO0FBQ1gseUdBQUEsZUFBZSxPQUFBO0FBQ2YsMEdBQUEsZ0JBQWdCLE9BQUE7QUFDaEIsdUdBQUEsYUFBYSxPQUFBO0FBQ2IsdUdBQUEsYUFBYSxPQUFBO0FBR2Ysb0JBQW9CO0FBQ3BCLDZDQUEyRDtBQUFsRCx5R0FBQSxZQUFZLE9BQWMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNvY2hEQiBOb2RlLmpzIFNESyB2MC40LjBcbiAqIFxuICogRHVhbC1tb2RlIGFyY2hpdGVjdHVyZTogRW1iZWRkZWQgKEZGSSkgKyBTZXJ2ZXIgKGdSUEMvSVBDKVxuICogXG4gKiBBcmNoaXRlY3R1cmU6IEZsZXhpYmxlIERlcGxveW1lbnRcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFRoaXMgU0RLIHN1cHBvcnRzIEJPVEggbW9kZXM6XG4gKiBcbiAqIDEuIEVtYmVkZGVkIE1vZGUgKEZGSSkgLSBGb3Igc2luZ2xlLXByb2Nlc3MgYXBwczpcbiAqICAgIC0gRGlyZWN0IEZGSSBiaW5kaW5ncyB0byBSdXN0IGxpYnJhcmllc1xuICogICAgLSBObyBzZXJ2ZXIgcmVxdWlyZWQgLSBqdXN0IG5wbSBpbnN0YWxsIGFuZCBydW5cbiAqICAgIC0gQmVzdCBmb3I6IExvY2FsIGRldmVsb3BtZW50LCBzaW1wbGUgYXBwc1xuICogXG4gKiAyLiBTZXJ2ZXIgTW9kZSAoZ1JQQy9JUEMpIC0gRm9yIGRpc3RyaWJ1dGVkIHN5c3RlbXM6XG4gKiAgICAtIFRoaW4gY2xpZW50IGNvbm5lY3RpbmcgdG8gc29jaGRiLWdycGMgc2VydmVyXG4gKiAgICAtIEJlc3QgZm9yOiBQcm9kdWN0aW9uLCBtdWx0aS1sYW5ndWFnZSwgc2NhbGFiaWxpdHlcbiAqIFxuICogQGV4YW1wbGUgRW1iZWRkZWQgTW9kZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgRGF0YWJhc2UgfSBmcm9tICdAc29jaGRiL3NvY2hkYic7XG4gKiBcbiAqIC8vIERpcmVjdCBGRkkgLSBubyBzZXJ2ZXIgbmVlZGVkXG4gKiBjb25zdCBkYiA9IGF3YWl0IERhdGFiYXNlLm9wZW4oJy4vbXlkYicpO1xuICogYXdhaXQgZGIucHV0KEJ1ZmZlci5mcm9tKCdrZXknKSwgQnVmZmVyLmZyb20oJ3ZhbHVlJykpO1xuICogYXdhaXQgZGIuY2xvc2UoKTtcbiAqIGBgYFxuICogXG4gKiBAZXhhbXBsZSBTZXJ2ZXIgTW9kZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgU29jaERCQ2xpZW50IH0gZnJvbSAnQHNvY2hkYi9zb2NoZGInO1xuICogXG4gKiAvLyBDb25uZWN0IHRvIHNlcnZlclxuICogY29uc3QgY2xpZW50ID0gbmV3IFNvY2hEQkNsaWVudCh7IGFkZHJlc3M6ICdsb2NhbGhvc3Q6NTAwNTEnIH0pO1xuICogYXdhaXQgY2xpZW50LnB1dEt2KCdrZXknLCBCdWZmZXIuZnJvbSgndmFsdWUnKSk7XG4gKiBgYGBcbiAqL1xuXG4vLyBWZXJzaW9uXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9ICcwLjQuMCc7XG5cbi8vIEVtYmVkZGVkIG1vZGUgKEZGSSkgLSBORVdcbmV4cG9ydCB7IEVtYmVkZGVkRGF0YWJhc2UsIEVtYmVkZGVkRGF0YWJhc2VDb25maWcgfSBmcm9tICcuL2VtYmVkZGVkJztcbmV4cG9ydCB7IEVtYmVkZGVkVHJhbnNhY3Rpb24gfSBmcm9tICcuL2VtYmVkZGVkJztcblxuLy8gRW1iZWRkZWQgbW9kZSAoRkZJKSAtIENvbnZlbmllbmNlIGFsaWFzXG5leHBvcnQgeyBFbWJlZGRlZERhdGFiYXNlIGFzIERhdGFiYXNlIH0gZnJvbSAnLi9lbWJlZGRlZCc7XG5cbi8vIFNlcnZlciBtb2RlIChnUlBDL0lQQylcbmV4cG9ydCB7IFNvY2hEQkNsaWVudCB9IGZyb20gJy4vZ3JwYy1jbGllbnQnO1xuZXhwb3J0IHR5cGUge1xuICBTZWFyY2hSZXN1bHQsXG4gIERvY3VtZW50LFxuICBHcmFwaE5vZGUsXG4gIEdyYXBoRWRnZSxcbn0gZnJvbSAnLi9ncnBjLWNsaWVudCc7XG5cbmV4cG9ydCB7IElwY0NsaWVudCB9IGZyb20gJy4vaXBjLWNsaWVudCc7XG5cbi8vIEZvcm1hdCB1dGlsaXRpZXNcbmV4cG9ydCB7XG4gIFdpcmVGb3JtYXQsXG4gIENvbnRleHRGb3JtYXQsXG4gIENhbm9uaWNhbEZvcm1hdCxcbiAgRm9ybWF0Q2FwYWJpbGl0aWVzLFxuICBGb3JtYXRDb252ZXJzaW9uRXJyb3IsXG59IGZyb20gJy4vZm9ybWF0JztcblxuLy8gVHlwZSBkZWZpbml0aW9uc1xuZXhwb3J0IHsgUXVlcnkgfSBmcm9tICcuL3F1ZXJ5JztcbmV4cG9ydCB0eXBlIHsgUXVlcnlSZXN1bHQgfSBmcm9tICcuL3F1ZXJ5JztcblxuZXhwb3J0IHtcbiAgU29jaERCRXJyb3IsXG4gIENvbm5lY3Rpb25FcnJvcixcbiAgVHJhbnNhY3Rpb25FcnJvcixcbiAgUHJvdG9jb2xFcnJvcixcbiAgRGF0YWJhc2VFcnJvcixcbn0gZnJvbSAnLi9lcnJvcnMnO1xuXG4vLyBDb252ZW5pZW5jZSBhbGlhc1xuZXhwb3J0IHsgU29jaERCQ2xpZW50IGFzIEdycGNDbGllbnQgfSBmcm9tICcuL2dycGMtY2xpZW50JztcbiJdfQ==
112
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQ0c7OztBQUVILFVBQVU7QUFDRyxRQUFBLE9BQU8sR0FBRyxPQUFPLENBQUM7QUFFL0IsNEJBQTRCO0FBQzVCLHVDQUFzRTtBQUE3RCw0R0FBQSxnQkFBZ0IsT0FBQTtBQUN6Qix1Q0FBaUQ7QUFBeEMsK0dBQUEsbUJBQW1CLE9BQUE7QUFFNUIsMENBQTBDO0FBQzFDLHVDQUEwRDtBQUFqRCxvR0FBQSxnQkFBZ0IsT0FBWTtBQUVyQyx5QkFBeUI7QUFDekIseUNBUXFCO0FBUG5CLHNHQUFBLFNBQVMsT0FBQTtBQUNULHVHQUFBLFVBQVUsT0FBQTtBQUNWLDJHQUFBLGNBQWMsT0FBQTtBQUNkLG1IQUFBLHNCQUFzQixPQUFBO0FBQ3RCLGlIQUFBLG9CQUFvQixPQUFBO0FBQ3BCLG9IQUFBLHVCQUF1QixPQUFBO0FBQ3ZCLGtIQUFBLHFCQUFxQixPQUFBO0FBU3ZCLHFCQUFxQjtBQUNyQixpQ0FJaUI7QUFIZixzR0FBQSxhQUFhLE9BQUE7QUFDYixrR0FBQSxTQUFTLE9BQUE7QUFDVCxvR0FBQSxXQUFXLE9BQUE7QUFTYiwwQkFBMEI7QUFDMUIsbURBRTBCO0FBRHhCLCtHQUFBLGFBQWEsT0FBQTtBQVFmLDJCQUEyQjtBQUMzQixxREFLMkI7QUFKekIsc0hBQUEsbUJBQW1CLE9BQUE7QUFDbkIsc0hBQUEsbUJBQW1CLE9BQUE7QUFDbkIscUhBQUEsa0JBQWtCLE9BQUE7QUFDbEIsdUhBQUEsb0JBQW9CLE9BQUE7QUFNdEIseUJBQXlCO0FBQ3pCLG1DQU1rQjtBQUxoQiw0R0FBQSxrQkFBa0IsT0FBQTtBQUNsQixzR0FBQSxZQUFZLE9BQUE7QUFDWix5R0FBQSxlQUFlLE9BQUE7QUFDZixvR0FBQSxVQUFVLE9BQUE7QUFDVix5R0FBQSxlQUFlLE9BQUE7QUFpQmpCLHlCQUF5QjtBQUN6Qiw2Q0FBNkM7QUFBcEMsMkdBQUEsWUFBWSxPQUFBO0FBUXJCLDJDQUF5QztBQUFoQyx1R0FBQSxTQUFTLE9BQUE7QUFFbEIsbUJBQW1CO0FBQ25CLG1DQU1rQjtBQUxoQixvR0FBQSxVQUFVLE9BQUE7QUFDVix1R0FBQSxhQUFhLE9BQUE7QUFDYix5R0FBQSxlQUFlLE9BQUE7QUFDZiw0R0FBQSxrQkFBa0IsT0FBQTtBQUNsQiwrR0FBQSxxQkFBcUIsT0FBQTtBQUd2QixtQkFBbUI7QUFDbkIsaUNBQWdDO0FBQXZCLDhGQUFBLEtBQUssT0FBQTtBQUdkLG1DQWFrQjtBQVpoQixxR0FBQSxXQUFXLE9BQUE7QUFDWCx5R0FBQSxlQUFlLE9BQUE7QUFDZiwwR0FBQSxnQkFBZ0IsT0FBQTtBQUNoQix1R0FBQSxhQUFhLE9BQUE7QUFDYix1R0FBQSxhQUFhLE9BQUE7QUFDYix1QkFBdUI7QUFDdkIsbUdBQUEsU0FBUyxPQUFBO0FBQ1QsbUdBQUEsU0FBUyxPQUFBO0FBQ1QsNkdBQUEsbUJBQW1CLE9BQUE7QUFDbkIsMEdBQUEsZ0JBQWdCLE9BQUE7QUFDaEIsNEdBQUEsa0JBQWtCLE9BQUE7QUFDbEIseUdBQUEsZUFBZSxPQUFBO0FBR2pCLG9CQUFvQjtBQUNwQiw2Q0FBMkQ7QUFBbEQseUdBQUEsWUFBWSxPQUFjIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTb2NoREIgTm9kZS5qcyBTREsgdjAuNC4wXG4gKiBcbiAqIER1YWwtbW9kZSBhcmNoaXRlY3R1cmU6IEVtYmVkZGVkIChGRkkpICsgU2VydmVyIChnUlBDL0lQQylcbiAqIFxuICogQXJjaGl0ZWN0dXJlOiBGbGV4aWJsZSBEZXBsb3ltZW50XG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBUaGlzIFNESyBzdXBwb3J0cyBCT1RIIG1vZGVzOlxuICogXG4gKiAxLiBFbWJlZGRlZCBNb2RlIChGRkkpIC0gRm9yIHNpbmdsZS1wcm9jZXNzIGFwcHM6XG4gKiAgICAtIERpcmVjdCBGRkkgYmluZGluZ3MgdG8gUnVzdCBsaWJyYXJpZXNcbiAqICAgIC0gTm8gc2VydmVyIHJlcXVpcmVkIC0ganVzdCBucG0gaW5zdGFsbCBhbmQgcnVuXG4gKiAgICAtIEJlc3QgZm9yOiBMb2NhbCBkZXZlbG9wbWVudCwgc2ltcGxlIGFwcHNcbiAqIFxuICogMi4gU2VydmVyIE1vZGUgKGdSUEMvSVBDKSAtIEZvciBkaXN0cmlidXRlZCBzeXN0ZW1zOlxuICogICAgLSBUaGluIGNsaWVudCBjb25uZWN0aW5nIHRvIHNvY2hkYi1ncnBjIHNlcnZlclxuICogICAgLSBCZXN0IGZvcjogUHJvZHVjdGlvbiwgbXVsdGktbGFuZ3VhZ2UsIHNjYWxhYmlsaXR5XG4gKiBcbiAqIEBleGFtcGxlIEVtYmVkZGVkIE1vZGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IERhdGFiYXNlIH0gZnJvbSAnQHNvY2hkYi9zb2NoZGInO1xuICogXG4gKiAvLyBEaXJlY3QgRkZJIC0gbm8gc2VydmVyIG5lZWRlZFxuICogY29uc3QgZGIgPSBhd2FpdCBEYXRhYmFzZS5vcGVuKCcuL215ZGInKTtcbiAqIGF3YWl0IGRiLnB1dChCdWZmZXIuZnJvbSgna2V5JyksIEJ1ZmZlci5mcm9tKCd2YWx1ZScpKTtcbiAqIGF3YWl0IGRiLmNsb3NlKCk7XG4gKiBgYGBcbiAqIFxuICogQGV4YW1wbGUgU2VydmVyIE1vZGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IFNvY2hEQkNsaWVudCB9IGZyb20gJ0Bzb2NoZGIvc29jaGRiJztcbiAqIFxuICogLy8gQ29ubmVjdCB0byBzZXJ2ZXJcbiAqIGNvbnN0IGNsaWVudCA9IG5ldyBTb2NoREJDbGllbnQoeyBhZGRyZXNzOiAnbG9jYWxob3N0OjUwMDUxJyB9KTtcbiAqIGF3YWl0IGNsaWVudC5wdXRLdigna2V5JywgQnVmZmVyLmZyb20oJ3ZhbHVlJykpO1xuICogYGBgXG4gKi9cblxuLy8gVmVyc2lvblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSAnMC40LjEnO1xuXG4vLyBFbWJlZGRlZCBtb2RlIChGRkkpIC0gTkVXXG5leHBvcnQgeyBFbWJlZGRlZERhdGFiYXNlLCBFbWJlZGRlZERhdGFiYXNlQ29uZmlnIH0gZnJvbSAnLi9lbWJlZGRlZCc7XG5leHBvcnQgeyBFbWJlZGRlZFRyYW5zYWN0aW9uIH0gZnJvbSAnLi9lbWJlZGRlZCc7XG5cbi8vIEVtYmVkZGVkIG1vZGUgKEZGSSkgLSBDb252ZW5pZW5jZSBhbGlhc1xuZXhwb3J0IHsgRW1iZWRkZWREYXRhYmFzZSBhcyBEYXRhYmFzZSB9IGZyb20gJy4vZW1iZWRkZWQnO1xuXG4vLyBOYW1lc3BhY2UgQVBJICh2MC40LjEpXG5leHBvcnQge1xuICBOYW1lc3BhY2UsXG4gIENvbGxlY3Rpb24sXG4gIERpc3RhbmNlTWV0cmljLFxuICBOYW1lc3BhY2VOb3RGb3VuZEVycm9yLFxuICBOYW1lc3BhY2VFeGlzdHNFcnJvcixcbiAgQ29sbGVjdGlvbk5vdEZvdW5kRXJyb3IsXG4gIENvbGxlY3Rpb25FeGlzdHNFcnJvcixcbn0gZnJvbSAnLi9uYW1lc3BhY2UnO1xuZXhwb3J0IHR5cGUge1xuICBOYW1lc3BhY2VDb25maWcsXG4gIENvbGxlY3Rpb25Db25maWcsXG4gIFNlYXJjaFJlcXVlc3QsXG4gIFNlYXJjaFJlc3VsdCBhcyBOYW1lc3BhY2VTZWFyY2hSZXN1bHQsXG59IGZyb20gJy4vbmFtZXNwYWNlJztcblxuLy8gUXVldWUgQVBJICh2MC40LjEpXG5leHBvcnQge1xuICBQcmlvcml0eVF1ZXVlLFxuICBUYXNrU3RhdGUsXG4gIGNyZWF0ZVF1ZXVlLFxufSBmcm9tICcuL3F1ZXVlJztcbmV4cG9ydCB0eXBlIHtcbiAgUXVldWVDb25maWcsXG4gIFF1ZXVlS2V5LFxuICBUYXNrLFxuICBRdWV1ZVN0YXRzLFxufSBmcm9tICcuL3F1ZXVlJztcblxuLy8gU2VtYW50aWMgQ2FjaGUgKHYwLjQuMSlcbmV4cG9ydCB7XG4gIFNlbWFudGljQ2FjaGUsXG59IGZyb20gJy4vc2VtYW50aWMtY2FjaGUnO1xuZXhwb3J0IHR5cGUge1xuICBDYWNoZUVudHJ5LFxuICBDYWNoZUhpdCxcbiAgQ2FjaGVTdGF0cyxcbn0gZnJvbSAnLi9zZW1hbnRpYy1jYWNoZSc7XG5cbi8vIENvbnRleHQgQnVpbGRlciAodjAuNC4xKVxuZXhwb3J0IHtcbiAgQ29udGV4dFF1ZXJ5QnVpbGRlcixcbiAgQ29udGV4dE91dHB1dEZvcm1hdCxcbiAgVHJ1bmNhdGlvblN0cmF0ZWd5LFxuICBjcmVhdGVDb250ZXh0QnVpbGRlcixcbn0gZnJvbSAnLi9jb250ZXh0LWJ1aWxkZXInO1xuZXhwb3J0IHR5cGUge1xuICBDb250ZXh0UmVzdWx0LFxufSBmcm9tICcuL2NvbnRleHQtYnVpbGRlcic7XG5cbi8vIE1lbW9yeSBTeXN0ZW0gKHYwLjQuMilcbmV4cG9ydCB7XG4gIEV4dHJhY3Rpb25QaXBlbGluZSxcbiAgQ29uc29saWRhdG9yLFxuICBIeWJyaWRSZXRyaWV2ZXIsXG4gIEFsbG93ZWRTZXQsXG4gIE5hbWVzcGFjZVBvbGljeSxcbn0gZnJvbSAnLi9tZW1vcnknO1xuZXhwb3J0IHR5cGUge1xuICBFbnRpdHksXG4gIFJlbGF0aW9uLFxuICBBc3NlcnRpb24sXG4gIFJhd0Fzc2VydGlvbixcbiAgQ2Fub25pY2FsRmFjdCxcbiAgRXh0cmFjdGlvblJlc3VsdCxcbiAgRXh0cmFjdGlvblNjaGVtYSxcbiAgQ29uc29saWRhdGlvbkNvbmZpZyxcbiAgUmV0cmlldmFsQ29uZmlnLFxuICBSZXRyaWV2YWxSZXN1bHQsXG4gIFJldHJpZXZhbFJlc3BvbnNlLFxuICBOYW1lc3BhY2VHcmFudCxcbn0gZnJvbSAnLi9tZW1vcnknO1xuXG4vLyBTZXJ2ZXIgbW9kZSAoZ1JQQy9JUEMpXG5leHBvcnQgeyBTb2NoREJDbGllbnQgfSBmcm9tICcuL2dycGMtY2xpZW50JztcbmV4cG9ydCB0eXBlIHtcbiAgU2VhcmNoUmVzdWx0LFxuICBEb2N1bWVudCxcbiAgR3JhcGhOb2RlLFxuICBHcmFwaEVkZ2UsXG59IGZyb20gJy4vZ3JwYy1jbGllbnQnO1xuXG5leHBvcnQgeyBJcGNDbGllbnQgfSBmcm9tICcuL2lwYy1jbGllbnQnO1xuXG4vLyBGb3JtYXQgdXRpbGl0aWVzXG5leHBvcnQge1xuICBXaXJlRm9ybWF0LFxuICBDb250ZXh0Rm9ybWF0LFxuICBDYW5vbmljYWxGb3JtYXQsXG4gIEZvcm1hdENhcGFiaWxpdGllcyxcbiAgRm9ybWF0Q29udmVyc2lvbkVycm9yLFxufSBmcm9tICcuL2Zvcm1hdCc7XG5cbi8vIFR5cGUgZGVmaW5pdGlvbnNcbmV4cG9ydCB7IFF1ZXJ5IH0gZnJvbSAnLi9xdWVyeSc7XG5leHBvcnQgdHlwZSB7IFF1ZXJ5UmVzdWx0IH0gZnJvbSAnLi9xdWVyeSc7XG5cbmV4cG9ydCB7XG4gIFNvY2hEQkVycm9yLFxuICBDb25uZWN0aW9uRXJyb3IsXG4gIFRyYW5zYWN0aW9uRXJyb3IsXG4gIFByb3RvY29sRXJyb3IsXG4gIERhdGFiYXNlRXJyb3IsXG4gIC8vIExvY2sgZXJyb3JzICh2MC40LjEpXG4gIEVycm9yQ29kZSxcbiAgTG9ja0Vycm9yLFxuICBEYXRhYmFzZUxvY2tlZEVycm9yLFxuICBMb2NrVGltZW91dEVycm9yLFxuICBFcG9jaE1pc21hdGNoRXJyb3IsXG4gIFNwbGl0QnJhaW5FcnJvcixcbn0gZnJvbSAnLi9lcnJvcnMnO1xuXG4vLyBDb252ZW5pZW5jZSBhbGlhc1xuZXhwb3J0IHsgU29jaERCQ2xpZW50IGFzIEdycGNDbGllbnQgfSBmcm9tICcuL2dycGMtY2xpZW50JztcbiJdfQ==
@@ -112,7 +112,7 @@ const MAX_MESSAGE_SIZE = 16 * 1024 * 1024; // 16 MB
112
112
  *
113
113
  * @example
114
114
  * ```typescript
115
- * import { IpcClient } from '@sushanth/sochdb';
115
+ * import { IpcClient } from '@sochdb/sochdb';
116
116
  *
117
117
  * const client = await IpcClient.connect('/tmp/sochdb.sock');
118
118
  *
@@ -502,4 +502,4 @@ class IpcClient {
502
502
  }
503
503
  }
504
504
  exports.IpcClient = IpcClient;
505
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXBjLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pcGMtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILDBEQUEwRDtBQUMxRCxFQUFFO0FBQ0Ysa0VBQWtFO0FBQ2xFLG1FQUFtRTtBQUNuRSwwQ0FBMEM7QUFDMUMsRUFBRTtBQUNGLGlEQUFpRDtBQUVqRCx5Q0FBMkI7QUFDM0IscUNBQTRFO0FBQzVFLG1DQUFnQztBQUVoQzs7R0FFRztBQUNVLFFBQUEsTUFBTSxHQUFHO0lBQ3BCLGdFQUFnRTtJQUNoRSxHQUFHLEVBQUUsSUFBSTtJQUNULEdBQUcsRUFBRSxJQUFJO0lBQ1QsTUFBTSxFQUFFLElBQUk7SUFDWixRQUFRLEVBQUUsSUFBSTtJQUNkLFNBQVMsRUFBRSxJQUFJO0lBQ2YsUUFBUSxFQUFFLElBQUk7SUFDZCxLQUFLLEVBQUUsSUFBSTtJQUNYLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLE9BQU8sRUFBRSxJQUFJO0lBQ2IsT0FBTyxFQUFFLElBQUk7SUFDYixJQUFJLEVBQUUsSUFBSTtJQUNWLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLEtBQUssRUFBRSxJQUFJO0lBQ1gsSUFBSSxFQUFFLElBQUk7SUFFVixrQkFBa0I7SUFDbEIsRUFBRSxFQUFFLElBQUk7SUFDUixLQUFLLEVBQUUsSUFBSTtJQUNYLEtBQUssRUFBRSxJQUFJO0lBQ1gsS0FBSyxFQUFFLElBQUk7SUFDWCxHQUFHLEVBQUUsSUFBSTtJQUNULFNBQVMsRUFBRSxJQUFJO0lBQ2YsU0FBUyxFQUFFLElBQUk7SUFDZixJQUFJLEVBQUUsSUFBSTtDQUNGLENBQUM7QUFFWCxrREFBa0Q7QUFDbEQsTUFBTSxjQUFjLEdBQUc7SUFDckIsR0FBRyxFQUFFLGNBQU0sQ0FBQyxHQUFHO0lBQ2YsR0FBRyxFQUFFLGNBQU0sQ0FBQyxHQUFHO0lBQ2YsTUFB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QUFDO1NBQ2xELENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsSUFBSTtRQUNSLElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkQsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakQsT0FBTyxNQUFNLEtBQUssY0FBYyxDQUFDLElBQUksQ0FBQztRQUN4QyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLEtBQUs7UUFDVCxJQUFJLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTztRQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUVwQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQzdCLElBQUksQ0FBQyxPQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtvQkFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7b0JBQ3BCLE9BQU8sRUFBRSxDQUFDO2dCQUNaLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBaGNELDhCQWdjQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU29jaERCIElQQyBDbGllbnRcbiAqXG4gKiBDb25uZWN0cyB0byBhIFNvY2hEQiBJUEMgc2VydmVyIHZpYSBVbml4IGRvbWFpbiBzb2NrZXQuXG4gKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKi9cblxuLy8gQ29weXJpZ2h0IDIwMjUgU3VzaGFudGggKGh0dHBzOi8vZ2l0aHViLmNvbS9zdXNoYW50aHB5KVxuLy9cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbmltcG9ydCAqIGFzIG5ldCBmcm9tICduZXQnO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkVycm9yLCBQcm90b2NvbEVycm9yLCBUcmFuc2FjdGlvbkVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgUXVlcnkgfSBmcm9tICcuL3F1ZXJ5JztcblxuLyoqXG4gKiBXaXJlIHByb3RvY29sIG9wY29kZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBPcENvZGUgPSB7XG4gIC8vIENsaWVudCDihpIgU2VydmVyIChtdXN0IG1hdGNoIHNvY2hkYi1zdG9yYWdlL3NyYy9pcGNfc2VydmVyLnJzKVxuICBQdXQ6IDB4MDEsXG4gIEdldDogMHgwMixcbiAgRGVsZXRlOiAweDAzLFxuICBCZWdpblR4bjogMHgwNCxcbiAgQ29tbWl0VHhuOiAweDA1LFxuICBBYm9ydFR4bjogMHgwNixcbiAgUXVlcnk6IDB4MDcsXG4gIENyZWF0ZVRhYmxlOiAweDA4LFxuICBQdXRQYXRoOiAweDA5LFxuICBHZXRQYXRoOiAweDBBLFxuICBTY2FuOiAweDBCLFxuICBDaGVja3BvaW50OiAweDBDLFxuICBTdGF0czogMHgwRCxcbiAgUGluZzogMHgwRSxcblxuICAvLyBTZXJ2ZXIg4oaSIENsaWVudFxuICBPSzogMHg4MCxcbiAgRXJyb3I6IDB4ODEsXG4gIFZhbHVlOiAweDgyLFxuICBUeG5JZDogMHg4MyxcbiAgUm93OiAweDg0LFxuICBFbmRTdHJlYW06IDB4ODUsXG4gIFN0YXRzUmVzcDogMHg4NixcbiAgUG9uZzogMHg4Nyxcbn0gYXMgY29uc3Q7XG5cbi8vIEludGVybmFsIE9wQ29kZSBtYXAgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5jb25zdCBJbnRlcm5hbE9wQ29kZSA9IHtcbiAgUFVUOiBPcENvZGUuUHV0LFxuICBHRVQ6IE9wQ29kZS5HZXQsXG4gIERFTEVURTogT3BDb2RlLkRlbGV0ZSxcbiAgQkVHSU5fVFhOOiBPcENvZGUuQmVnaW5UeG4sXG4gIENPTU1JVF9UWE46IE9wQ29kZS5Db21taXRUeG4sXG4gIEFCT1JUX1RYTjogT3BDb2RlLkFib3J0VHhuLFxuICBRVUVSWTogT3BDb2RlLlF1ZXJ5LFxuICBQVVRfUEFUSDogT3BDb2RlLlB1dFBhdGgsXG4gIEdFVF9QQVRIOiBPcENvZGUuR2V0UGF0aCxcbiAgU0NBTjogT3BDb2RlLlNjYW4sXG4gIENIRUNLUE9JTlQ6IE9wQ29kZS5DaGVja3BvaW50LFxuICBTVEFUUzogT3BDb2RlLlN0YXRzLFxuICBQSU5HOiBPcENvZGUuUGluZyxcbiAgT0s6IE9wQ29kZS5PSyxcbiAgRVJST1I6IE9wQ29kZS5FcnJvcixcbiAgVkFMVUU6IE9wQ29kZS5WYWx1ZSxcbiAgVFhOX0lEOiBPcENvZGUuVHhuSWQsXG4gIFJPVzogT3BDb2RlLlJvdyxcbiAgRU5EX1NUUkVBTTogT3BDb2RlLkVuZFN0cmVhbSxcbiAgU1RBVFNfUkVTUDogT3BDb2RlLlN0YXRzUmVzcCxcbiAgUE9ORzogT3BDb2RlLlBvbmcsXG59IGFzIGNvbnN0O1xuXG5jb25zdCBNQVhfTUVTU0FHRV9TSVpFID0gMTYgKiAxMDI0ICogMTAyNDsgLy8gMTYgTUJcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIElwY0NsaWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJcGNDbGllbnRDb25maWcge1xuICAvKiogUGF0aCB0byBVbml4IGRvbWFpbiBzb2NrZXQgKi9cbiAgc29ja2V0UGF0aDogc3RyaW5nO1xuICAvKiogQ29ubmVjdGlvbiB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdDogNTAwMCkgKi9cbiAgY29ubmVjdFRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKiBSZWFkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIChkZWZhdWx0OiAzMDAwMCkgKi9cbiAgcmVhZFRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogSVBDIENsaWVudCBmb3IgU29jaERCLlxuICpcbiAqIENvbm5lY3RzIHRvIGEgU29jaERCIHNlcnZlciB2aWEgVW5peCBkb21haW4gc29ja2V0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBJcGNDbGllbnQgfSBmcm9tICdAc3VzaGFudGgvc29jaGRiJztcbiAqXG4gKiBjb25zdCBjbGllbnQgPSBhd2FpdCBJcGNDbGllbnQuY29ubmVjdCgnL3RtcC9zb2NoZGIuc29jaycpO1xuICpcbiAqIGF3YWl0IGNsaWVudC5wdXQoQnVmZmVyLmZyb20oJ2tleScpLCBCdWZmZXIuZnJvbSgndmFsdWUnKSk7XG4gKiBjb25zdCB2YWx1ZSA9IGF3YWl0IGNsaWVudC5nZXQoQnVmZmVyLmZyb20oJ2tleScpKTtcbiAqXG4gKiBhd2FpdCBjbGllbnQuY2xvc2UoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgSXBjQ2xpZW50IHtcbiAgcHJpdmF0ZSBfc29ja2V0OiBuZXQuU29ja2V0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2NvbmZpZzogUmVxdWlyZWQ8SXBjQ2xpZW50Q29uZmlnPjtcbiAgcHJpdmF0ZSBfcGVuZGluZ1JlYWRzOiBBcnJheTx7XG4gICAgcmVzb2x2ZTogKGJ1ZjogQnVmZmVyKSA9PiB2b2lkO1xuICAgIHJlamVjdDogKGVycjogRXJyb3IpID0+IHZvaWQ7XG4gIH0+ID0gW107XG4gIHByaXZhdGUgX3JlYWRCdWZmZXI6IEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygwKTtcbiAgcHJpdmF0ZSBfY2xvc2VkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihjb25maWc6IElwY0NsaWVudENvbmZpZykge1xuICAgIHRoaXMuX2NvbmZpZyA9IHtcbiAgICAgIGNvbm5lY3RUaW1lb3V0OiA1MDAwLFxuICAgICAgcmVhZFRpbWVvdXQ6IDMwMDAwLFxuICAgICAgLi4uY29uZmlnLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29ubmVjdCB0byBhIFNvY2hEQiBJUEMgc2VydmVyLlxuICAgKlxuICAgKiBAcGFyYW0gc29ja2V0UGF0aCAtIFBhdGggdG8gdGhlIFVuaXggZG9tYWluIHNvY2tldFxuICAgKiBAcmV0dXJucyBBIGNvbm5lY3RlZCBJcGNDbGllbnQgaW5zdGFuY2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBjbGllbnQgPSBhd2FpdCBJcGNDbGllbnQuY29ubmVjdCgnL3RtcC9zb2NoZGIuc29jaycpO1xuICAgKiBgYGBcbiAgICovXG4gIHN0YXRpYyBhc3luYyBjb25uZWN0KHNvY2tldFBhdGg6IHN0cmluZyk6IFByb21pc2U8SXBjQ2xpZW50PiB7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IElwY0NsaWVudCh7IHNvY2tldFBhdGggfSk7XG4gICAgYXdhaXQgY2xpZW50Ll9jb25uZWN0KCk7XG4gICAgcmV0dXJuIGNsaWVudDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX2Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHNvY2tldCA9IG5ldC5jcmVhdGVDb25uZWN0aW9uKFxuICAgICAgICB7IHBhdGg6IHRoaXMuX2NvbmZpZy5zb2NrZXRQYXRoIH0sXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLl9zb2NrZXQgPSBzb2NrZXQ7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBzb2NrZXQuc2V0VGltZW91dCh0aGlzLl9jb25maWcuY29ubmVjdFRpbWVvdXQpO1xuXG4gICAgICBzb2NrZXQub24oJ3RpbWVvdXQnLCAoKSA9PiB7XG4gICAgICAgIHNvY2tldC5kZXN0cm95KCk7XG4gICAgICAgIHJlamVjdChuZXcgQ29ubmVjdGlvbkVycm9yKCdDb25uZWN0aW9uIHRpbWVvdXQnKSk7XG4gICAgICB9KTtcblxuICAgICAgc29ja2V0Lm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBDb25uZWN0aW9uRXJyb3IoYENvbm5lY3Rpb24gZmFpbGVkOiAke2Vyci5tZXNzYWdlfWApKTtcbiAgICAgIH0pO1xuXG4gICAgICBzb2NrZXQub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICB0aGlzLl9yZWFkQnVmZmVyID0gQnVmZmVyLmNvbmNhdChbdGhpcy5fcmVhZEJ1ZmZlciwgZGF0YV0pO1xuICAgICAgICB0aGlzLl9wcm9jZXNzQnVmZmVyKCk7XG4gICAgICB9KTtcblxuICAgICAgc29ja2V0Lm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgdGhpcy5fY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgZm9yIChjb25zdCBwZW5kaW5nIG9mIHRoaXMuX3BlbmRpbmdSZWFkcykge1xuICAgICAgICAgIHBlbmRpbmcucmVqZWN0KG5ldyBDb25uZWN0aW9uRXJyb3IoJ0Nvbm5lY3Rpb24gY2xvc2VkJykpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3BlbmRpbmdSZWFkcyA9IFtdO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9wcm9jZXNzQnVmZmVyKCk6IHZvaWQge1xuICAgIC8vIFByb2Nlc3MgY29tcGxldGUgbWVzc2FnZXMgZnJvbSB0aGUgYnVmZmVyXG4gICAgd2hpbGUgKHRoaXMuX3JlYWRCdWZmZXIubGVuZ3RoID49IDUgJiYgdGhpcy5fcGVuZGluZ1JlYWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMuX3JlYWRCdWZmZXIucmVhZFVJbnQzMkxFKDEpO1xuICAgICAgY29uc3QgdG90YWxMZW5ndGggPSA1ICsgbGVuZ3RoO1xuXG4gICAgICBpZiAodGhpcy5fcmVhZEJ1ZmZlci5sZW5ndGggPj0gdG90YWxMZW5ndGgpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMuX3JlYWRCdWZmZXIuc3ViYXJyYXkoMCwgdG90YWxMZW5ndGgpO1xuICAgICAgICB0aGlzLl9yZWFkQnVmZmVyID0gdGhpcy5fcmVhZEJ1ZmZlci5zdWJhcnJheSh0b3RhbExlbmd0aCk7XG5cbiAgICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMuX3BlbmRpbmdSZWFkcy5zaGlmdCgpO1xuICAgICAgICBpZiAocGVuZGluZykge1xuICAgICAgICAgIHBlbmRpbmcucmVzb2x2ZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfc2VuZChvcGNvZGU6IG51bWJlciwgcGF5bG9hZDogQnVmZmVyID0gQnVmZmVyLmFsbG9jKDApKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBpZiAodGhpcy5fY2xvc2VkIHx8ICF0aGlzLl9zb2NrZXQpIHtcbiAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoJ05vdCBjb25uZWN0ZWQnKTtcbiAgICB9XG5cbiAgICAvLyBFbmNvZGUgbWVzc2FnZTogb3Bjb2RlICgxKSArIGxlbmd0aCAoNCBMRSkgKyBwYXlsb2FkXG4gICAgY29uc3QgbWVzc2FnZSA9IEJ1ZmZlci5hbGxvYyg1ICsgcGF5bG9hZC5sZW5ndGgpO1xuICAgIG1lc3NhZ2Uud3JpdGVVSW50OChvcGNvZGUsIDApO1xuICAgIG1lc3NhZ2Uud3JpdGVVSW50MzJMRShwYXlsb2FkLmxlbmd0aCwgMSk7XG4gICAgcGF5bG9hZC5jb3B5KG1lc3NhZ2UsIDUpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuX3BlbmRpbmdSZWFkcy5wdXNoKHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuXG4gICAgICB0aGlzLl9zb2NrZXQhLndyaXRlKG1lc3NhZ2UsIChlcnIpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHRoaXMuX3BlbmRpbmdSZWFkcy5wb3AoKTtcbiAgICAgICAgICByZWplY3QobmV3IENvbm5lY3Rpb25FcnJvcihgV3JpdGUgZmFpbGVkOiAke2Vyci5tZXNzYWdlfWApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFNldCB0aW1lb3V0IGZvciByZXNwb25zZVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGlkeCA9IHRoaXMuX3BlbmRpbmdSZWFkcy5maW5kSW5kZXgoKHApID0+IHAucmVzb2x2ZSA9PT0gcmVzb2x2ZSk7XG4gICAgICAgIGlmIChpZHggIT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5fcGVuZGluZ1JlYWRzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgIHJlamVjdChuZXcgQ29ubmVjdGlvbkVycm9yKCdSZWFkIHRpbWVvdXQnKSk7XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMuX2NvbmZpZy5yZWFkVGltZW91dCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9wYXJzZVJlc3BvbnNlKHJlc3BvbnNlOiBCdWZmZXIpOiB7IG9wY29kZTogbnVtYmVyOyBwYXlsb2FkOiBCdWZmZXIgfSB7XG4gICAgY29uc3Qgb3Bjb2RlID0gcmVzcG9uc2UucmVhZFVJbnQ4KDApO1xuICAgIGNvbnN0IGxlbmd0aCA9IHJlc3BvbnNlLnJlYWRVSW50MzJMRSgxKTtcbiAgICBjb25zdCBwYXlsb2FkID0gcmVzcG9uc2Uuc3ViYXJyYXkoNSwgNSArIGxlbmd0aCk7XG5cbiAgICBpZiAob3Bjb2RlID09PSBJbnRlcm5hbE9wQ29kZS5FUlJPUikge1xuICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXJyb3IocGF5bG9hZC50b1N0cmluZygndXRmOCcpKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBvcGNvZGUsIHBheWxvYWQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmNvZGUgYSBrZXkgZm9yIHRoZSB3aXJlIHByb3RvY29sLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHN0YXRpYyBlbmNvZGVLZXkoa2V5OiBCdWZmZXIpOiBCdWZmZXIge1xuICAgIC8vIEZvcm1hdDogW2xlbmd0aDo0XVtvcDoxXVtrZXlfbGVuOjRdW2tleTouLi5dXG4gICAgY29uc3QgbXNnTGVuID0gMSArIDQgKyBrZXkubGVuZ3RoO1xuICAgIGNvbnN0IG1zZyA9IEJ1ZmZlci5hbGxvYyg0ICsgbXNnTGVuKTtcbiAgICBtc2cud3JpdGVVSW50MzJCRShtc2dMZW4sIDApO1xuICAgIG1zZy53cml0ZVVJbnQ4KEludGVybmFsT3BDb2RlLkdFVCwgNCk7XG4gICAgbXNnLndyaXRlVUludDMyQkUoa2V5Lmxlbmd0aCwgNSk7XG4gICAga2V5LmNvcHkobXNnLCA5KTtcbiAgICByZXR1cm4gbXNnO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuY29kZSBhIGtleS12YWx1ZSBwYWlyIGZvciB0aGUgd2lyZSBwcm90b2NvbC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBzdGF0aWMgZW5jb2RlS2V5VmFsdWUoa2V5OiBCdWZmZXIsIHZhbHVlOiBCdWZmZXIpOiBCdWZmZXIge1xuICAgIC8vIEZvcm1hdDogW2xlbmd0aDo0XVtvcDoxXVtrZXlfbGVuOjRdW2tleTouLi5dW3ZhbHVlX2xlbjo0XVt2YWx1ZTouLi5dXG4gICAgY29uc3QgbXNnTGVuID0gMSArIDQgKyBrZXkubGVuZ3RoICsgNCArIHZhbHVlLmxlbmd0aDtcbiAgICBjb25zdCBtc2cgPSBCdWZmZXIuYWxsb2MoNCArIG1zZ0xlbik7XG4gICAgbXNnLndyaXRlVUludDMyQkUobXNnTGVuLCAwKTtcbiAgICBtc2cud3JpdGVVSW50OChJbnRlcm5hbE9wQ29kZS5QVVQsIDQpO1xuICAgIG1zZy53cml0ZVVJbnQzMkJFKGtleS5sZW5ndGgsIDUpO1xuICAgIGtleS5jb3B5KG1zZywgOSk7XG4gICAgbXNnLndyaXRlVUludDMyQkUodmFsdWUubGVuZ3RoLCA5ICsga2V5Lmxlbmd0aCk7XG4gICAgdmFsdWUuY29weShtc2csIDEzICsga2V5Lmxlbmd0aCk7XG4gICAgcmV0dXJuIG1zZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB2YWx1ZSBieSBrZXkuXG4gICAqL1xuICBhc3luYyBnZXQoa2V5OiBCdWZmZXIpOiBQcm9taXNlPEJ1ZmZlciB8IG51bGw+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX3NlbmQoSW50ZXJuYWxPcENvZGUuR0VULCBrZXkpO1xuICAgIGNvbnN0IHsgb3Bjb2RlLCBwYXlsb2FkIH0gPSB0aGlzLl9wYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcblxuICAgIGlmIChvcGNvZGUgPT09IEludGVybmFsT3BDb2RlLlZBTFVFKSB7XG4gICAgICAvLyBJZiBwYXlsb2FkIGlzIGVtcHR5LCB0aGUga2V5IGRvZXNuJ3QgZXhpc3RcbiAgICAgIGlmIChwYXlsb2FkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdXQgYSBrZXktdmFsdWUgcGFpci5cbiAgICovXG4gIGFzeW5jIHB1dChrZXk6IEJ1ZmZlciwgdmFsdWU6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEVuY29kZToga2V5X2xlbiAoNCBMRSkgKyBrZXkgKyB2YWx1ZVxuICAgIGNvbnN0IHBheWxvYWQgPSBCdWZmZXIuYWxsb2MoNCArIGtleS5sZW5ndGggKyB2YWx1ZS5sZW5ndGgpO1xuICAgIHBheWxvYWQud3JpdGVVSW50MzJMRShrZXkubGVuZ3RoLCAwKTtcbiAgICBrZXkuY29weShwYXlsb2FkLCA0KTtcbiAgICB2YWx1ZS5jb3B5KHBheWxvYWQsIDQgKyBrZXkubGVuZ3RoKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fc2VuZChJbnRlcm5hbE9wQ29kZS5QVVQsIHBheWxvYWQpO1xuICAgIHRoaXMuX3BhcnNlUmVzcG9uc2UocmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhIGtleS5cbiAgICovXG4gIGFzeW5jIGRlbGV0ZShrZXk6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fc2VuZChJbnRlcm5hbE9wQ29kZS5ERUxFVEUsIGtleSk7XG4gICAgdGhpcy5fcGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdmFsdWUgYnkgcGF0aC5cbiAgICogV2lyZSBmb3JtYXQ6IHBhdGhfY291bnQoMiBMRSkgKyBbcGF0aF9sZW4oMiBMRSkgKyBwYXRoX3NlZ21lbnRdLi4uXG4gICAqL1xuICBhc3luYyBnZXRQYXRoKHBhdGg6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyIHwgbnVsbD4ge1xuICAgIC8vIEVuY29kZSBwYXRoIGFzIHNpbmdsZSBzZWdtZW50IGZvciBub3cgKGNvdWxkIHNwbGl0IG9uICcvJyBmb3IgbXVsdGktc2VnbWVudClcbiAgICBjb25zdCBwYXRoQnVmID0gQnVmZmVyLmZyb20ocGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBwYXlsb2FkID0gQnVmZmVyLmFsbG9jKDIgKyAyICsgcGF0aEJ1Zi5sZW5ndGgpO1xuICAgIHBheWxvYWQud3JpdGVVSW50MTZMRSgxLCAwKTsgLy8gcGF0aF9jb3VudCA9IDFcbiAgICBwYXlsb2FkLndyaXRlVUludDE2TEUocGF0aEJ1Zi5sZW5ndGgsIDIpOyAvLyBwYXRoX2xlblxuICAgIHBhdGhCdWYuY29weShwYXlsb2FkLCA0KTsgLy8gcGF0aFxuICAgIFxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fc2VuZChJbnRlcm5hbE9wQ29kZS5HRVRfUEFUSCwgcGF5bG9hZCk7XG4gICAgY29uc3QgeyBvcGNvZGUsIHBheWxvYWQ6IHJlc3BvbnNlUGF5bG9hZCB9ID0gdGhpcy5fcGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG5cbiAgICBpZiAob3Bjb2RlID09PSBJbnRlcm5hbE9wQ29kZS5WQUxVRSkge1xuICAgICAgLy8gSWYgcGF5bG9hZCBpcyBlbXB0eSwgdGhlIGtleSBkb2Vzbid0IGV4aXN0XG4gICAgICBpZiAocmVzcG9uc2VQYXlsb2FkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNwb25zZVBheWxvYWQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1dCBhIHZhbHVlIGF0IGEgcGF0aC5cbiAgICogV2lyZSBmb3JtYXQ6IHBhdGhfY291bnQoMiBMRSkgKyBbcGF0aF9sZW4oMiBMRSkgKyBwYXRoX3NlZ21lbnRdLi4uICsgdmFsdWVcbiAgICovXG4gIGFzeW5jIHB1dFBhdGgocGF0aDogc3RyaW5nLCB2YWx1ZTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGF0aEJ1ZiA9IEJ1ZmZlci5mcm9tKHBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgcGF5bG9hZCA9IEJ1ZmZlci5hbGxvYygyICsgMiArIHBhdGhCdWYubGVuZ3RoICsgdmFsdWUubGVuZ3RoKTtcbiAgICBwYXlsb2FkLndyaXRlVUludDE2TEUoMSwgMCk7IC8vIHBhdGhfY291bnQgPSAxXG4gICAgcGF5bG9hZC53cml0ZVVJbnQxNkxFKHBhdGhCdWYubGVuZ3RoLCAyKTsgLy8gcGF0aF9sZW5cbiAgICBwYXRoQnVmLmNvcHkocGF5bG9hZCwgNCk7IC8vIHBhdGhcbiAgICB2YWx1ZS5jb3B5KHBheWxvYWQsIDQgKyBwYXRoQnVmLmxlbmd0aCk7IC8vIHZhbHVlXG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX3NlbmQoSW50ZXJuYWxPcENvZGUuUFVUX1BBVEgsIHBheWxvYWQpO1xuICAgIHRoaXMuX3BhcnNlUmVzcG9uc2UocmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBxdWVyeSBhbmQgcmV0dXJuIFRPT04tZm9ybWF0dGVkIHJlc3VsdHMuXG4gICAqIFxuICAgKiBXaXJlIGZvcm1hdDogcGF0aF9sZW4oMikgKyBwYXRoICsgbGltaXQoNCkgKyBvZmZzZXQoNCkgKyBjb2xzX2NvdW50KDIpICsgW2NvbF9sZW4oMikgKyBjb2xdLi4uXG4gICAqL1xuICBhc3luYyBxdWVyeShcbiAgICBwYXRoUHJlZml4OiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgbGltaXQ/OiBudW1iZXI7IG9mZnNldD86IG51bWJlcjsgY29sdW1ucz86IHN0cmluZ1tdIH1cbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBvcHRzID0gb3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBwYXRoQnVmID0gQnVmZmVyLmZyb20ocGF0aFByZWZpeCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBjb2x1bW5zID0gb3B0cy5jb2x1bW5zIHx8IFtdO1xuICAgIFxuICAgIC8vIENhbGN1bGF0ZSBwYXlsb2FkIHNpemVcbiAgICBsZXQgc2l6ZSA9IDIgKyBwYXRoQnVmLmxlbmd0aCArIDQgKyA0ICsgMjtcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiBjb2x1bW5zKSB7XG4gICAgICBzaXplICs9IDIgKyBCdWZmZXIuYnl0ZUxlbmd0aChjb2wsICd1dGY4Jyk7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHBheWxvYWQgPSBCdWZmZXIuYWxsb2Moc2l6ZSk7XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgXG4gICAgLy8gUGF0aDogcGF0aF9sZW4oMiBMRSkgKyBwYXRoXG4gICAgcGF5bG9hZC53cml0ZVVJbnQxNkxFKHBhdGhCdWYubGVuZ3RoLCBvZmZzZXQpO1xuICAgIG9mZnNldCArPSAyO1xuICAgIHBhdGhCdWYuY29weShwYXlsb2FkLCBvZmZzZXQpO1xuICAgIG9mZnNldCArPSBwYXRoQnVmLmxlbmd0aDtcbiAgICBcbiAgICAvLyBMaW1pdCAoNCBMRSkgLSAwIG1lYW5zIG5vIGxpbWl0XG4gICAgcGF5bG9hZC53cml0ZVVJbnQzMkxFKG9wdHMubGltaXQgfHwgMCwgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gNDtcbiAgICBcbiAgICAvLyBPZmZzZXQgKDQgTEUpXG4gICAgcGF5bG9hZC53cml0ZVVJbnQzMkxFKG9wdHMub2Zmc2V0IHx8IDAsIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IDQ7XG4gICAgXG4gICAgLy8gQ29sdW1uczogY291bnQoMiBMRSkgKyBbY29sX2xlbigyIExFKSArIGNvbF0uLi5cbiAgICBwYXlsb2FkLndyaXRlVUludDE2TEUoY29sdW1ucy5sZW5ndGgsIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IDI7XG4gICAgZm9yIChjb25zdCBjb2wgb2YgY29sdW1ucykge1xuICAgICAgY29uc3QgY29sQnVmID0gQnVmZmVyLmZyb20oY29sLCAndXRmOCcpO1xuICAgICAgcGF5bG9hZC53cml0ZVVJbnQxNkxFKGNvbEJ1Zi5sZW5ndGgsIG9mZnNldCk7XG4gICAgICBvZmZzZXQgKz0gMjtcbiAgICAgIGNvbEJ1Zi5jb3B5KHBheWxvYWQsIG9mZnNldCk7XG4gICAgICBvZmZzZXQgKz0gY29sQnVmLmxlbmd0aDtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX3NlbmQoSW50ZXJuYWxPcENvZGUuUVVFUlksIHBheWxvYWQpO1xuICAgIGNvbnN0IHsgcGF5bG9hZDogcmVzdWx0UGF5bG9hZCB9ID0gdGhpcy5fcGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG5cbiAgICByZXR1cm4gcmVzdWx0UGF5bG9hZC50b1N0cmluZygndXRmOCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjYW4gZm9yIGtleXMgd2l0aCBhIHByZWZpeCwgcmV0dXJuaW5nIGtleS12YWx1ZSBwYWlycy5cbiAgICogVGhpcyBpcyB0aGUgcHJlZmVycmVkIG1ldGhvZCBmb3Igc2ltcGxlIHByZWZpeC1iYXNlZCBpdGVyYXRpb24uXG4gICAqIFxuICAgKiBXaXJlIGZvcm1hdDogcHJlZml4IHN0cmluZ1xuICAgKiBSZXNwb25zZSBmb3JtYXQ6IGNvdW50KDQgTEUpICsgW2tleV9sZW4oMiBMRSkgKyBrZXkgKyB2YWxfbGVuKDQgTEUpICsgdmFsXS4uLlxuICAgKi9cbiAgYXN5bmMgc2NhbihwcmVmaXg6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8eyBrZXk6IEJ1ZmZlcjsgdmFsdWU6IEJ1ZmZlciB9Pj4ge1xuICAgIGNvbnN0IHByZWZpeEJ1ZiA9IEJ1ZmZlci5mcm9tKHByZWZpeCwgJ3V0ZjgnKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX3NlbmQoSW50ZXJuYWxPcENvZGUuU0NBTiwgcHJlZml4QnVmKTtcbiAgICBjb25zdCB7IG9wY29kZSwgcGF5bG9hZCB9ID0gdGhpcy5fcGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG5cbiAgICBpZiAob3Bjb2RlICE9PSBJbnRlcm5hbE9wQ29kZS5WQUxVRSAmJiBvcGNvZGUgIT09IEludGVybmFsT3BDb2RlLk9LKSB7XG4gICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFcnJvcihgVW5leHBlY3RlZCBzY2FuIHJlc3BvbnNlIG9wY29kZTogMHgke29wY29kZS50b1N0cmluZygxNil9YCk7XG4gICAgfVxuXG4gICAgaWYgKHBheWxvYWQubGVuZ3RoIDwgNCkge1xuICAgICAgcmV0dXJuIFtdOyAvLyBFbXB0eSByZXN1bHRcbiAgICB9XG5cbiAgICAvLyBQYXJzZSByZXNwb25zZTogY291bnQoNCBMRSkgKyBba2V5X2xlbigyIExFKSArIGtleSArIHZhbF9sZW4oNCBMRSkgKyB2YWxdLi4uXG4gICAgY29uc3QgY291bnQgPSBwYXlsb2FkLnJlYWRVSW50MzJMRSgwKTtcbiAgICBjb25zdCByZXN1bHRzOiBBcnJheTx7IGtleTogQnVmZmVyOyB2YWx1ZTogQnVmZmVyIH0+ID0gW107XG4gICAgbGV0IG9mZnNldCA9IDQ7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgIGlmIChvZmZzZXQgKyAyID4gcGF5bG9hZC5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXJyb3IoJ1RydW5jYXRlZCBzY2FuIHJlc3BvbnNlIChrZXlfbGVuKScpO1xuICAgICAgfVxuICAgICAgY29uc3Qga2V5TGVuID0gcGF5bG9hZC5yZWFkVUludDE2TEUob2Zmc2V0KTtcbiAgICAgIG9mZnNldCArPSAyO1xuXG4gICAgICBpZiAob2Zmc2V0ICsga2V5TGVuICsgNCA+IHBheWxvYWQubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBQcm90b2NvbEVycm9yKCdUcnVuY2F0ZWQgc2NhbiByZXNwb25zZSAoa2V5K3ZhbF9sZW4pJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBrZXkgPSBwYXlsb2FkLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsga2V5TGVuKTtcbiAgICAgIG9mZnNldCArPSBrZXlMZW47XG5cbiAgICAgIGNvbnN0IHZhbExlbiA9IHBheWxvYWQucmVhZFVJbnQzMkxFKG9mZnNldCk7XG4gICAgICBvZmZzZXQgKz0gNDtcblxuICAgICAgaWYgKG9mZnNldCArIHZhbExlbiA+IHBheWxvYWQubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBQcm90b2NvbEVycm9yKCdUcnVuY2F0ZWQgc2NhbiByZXNwb25zZSAodmFsdWUpJyk7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IHBheWxvYWQuc3ViYXJyYXkob2Zmc2V0LCBvZmZzZXQgKyB2YWxMZW4pO1xuICAgICAgb2Zmc2V0ICs9IHZhbExlbjtcblxuICAgICAgcmVzdWx0cy5wdXNoKHsga2V5LCB2YWx1ZSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBxdWVyeSBidWlsZGVyLlxuICAgKi9cbiAgcXVlcnlCdWlsZGVyKHBhdGhQcmVmaXg6IHN0cmluZyk6IFF1ZXJ5IHtcbiAgICByZXR1cm4gbmV3IFF1ZXJ5KHRoaXMsIHBhdGhQcmVmaXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJlZ2luIGEgbmV3IHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgYmVnaW5UcmFuc2FjdGlvbigpOiBQcm9taXNlPGJpZ2ludD4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fc2VuZChJbnRlcm5hbE9wQ29kZS5CRUdJTl9UWE4pO1xuICAgIGNvbnN0IHsgb3Bjb2RlLCBwYXlsb2FkIH0gPSB0aGlzLl9wYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcblxuICAgIGlmIChvcGNvZGUgPT09IEludGVybmFsT3BDb2RlLlRYTl9JRCkge1xuICAgICAgcmV0dXJuIHBheWxvYWQucmVhZEJpZ1VJbnQ2NExFKDApO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVHJhbnNhY3Rpb25FcnJvcignRmFpbGVkIHRvIGJlZ2luIHRyYW5zYWN0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogQ29tbWl0IGEgdHJhbnNhY3Rpb24uXG4gICAqL1xuICBhc3luYyBjb21taXRUcmFuc2FjdGlvbih0eG5JZDogYmlnaW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGF5bG9hZCA9IEJ1ZmZlci5hbGxvYyg4KTtcbiAgICBwYXlsb2FkLndyaXRlQmlnVUludDY0TEUodHhuSWQsIDApO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fc2VuZChJbnRlcm5hbE9wQ29kZS5DT01NSVRfVFhOLCBwYXlsb2FkKTtcbiAgICB0aGlzLl9wYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBYm9ydCBhIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgYWJvcnRUcmFuc2FjdGlvbih0eG5JZDogYmlnaW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGF5bG9hZCA9IEJ1ZmZlci5hbGxvYyg4KTtcbiAgICBwYXlsb2FkLndyaXRlQmlnVUludDY0TEUodHhuSWQsIDApO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fc2VuZChJbnRlcm5hbE9wQ29kZS5BQk9SVF9UWE4sIHBheWxvYWQpO1xuICAgIHRoaXMuX3BhcnNlUmVzcG9uc2UocmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNlIGEgY2hlY2twb2ludC5cbiAgICovXG4gIGFzeW5jIGNoZWNrcG9pbnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zZW5kKEludGVybmFsT3BDb2RlLkNIRUNLUE9JTlQpO1xuICAgIHRoaXMuX3BhcnNlUmVzcG9uc2UocmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzdG9yYWdlIHN0YXRpc3RpY3MuXG4gICAqL1xuICBhc3luYyBzdGF0cygpOiBQcm9taXNlPHtcbiAgICBtZW10YWJsZVNpemVCeXRlczogbnVtYmVyO1xuICAgIHdhbFNpemVCeXRlczogbnVtYmVyO1xuICAgIGFjdGl2ZVRyYW5zYWN0aW9uczogbnVtYmVyO1xuICB9PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zZW5kKEludGVybmFsT3BDb2RlLlNUQVRTKTtcbiAgICBjb25zdCB7IHBheWxvYWQgfSA9IHRoaXMuX3BhcnNlUmVzcG9uc2UocmVzcG9uc2UpO1xuICAgIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKHBheWxvYWQudG9TdHJpbmcoJ3V0ZjgnKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lbXRhYmxlU2l6ZUJ5dGVzOiBqc29uLm1lbXRhYmxlX3NpemVfYnl0ZXMgfHwgMCxcbiAgICAgIHdhbFNpemVCeXRlczoganNvbi53YWxfc2l6ZV9ieXRlcyB8fCAwLFxuICAgICAgYWN0aXZlVHJhbnNhY3Rpb25zOiBqc29uLmFjdGl2ZV90cmFuc2FjdGlvbnMgfHwgMCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFBpbmcgdGhlIHNlcnZlci5cbiAgICovXG4gIGFzeW5jIHBpbmcoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fc2VuZChJbnRlcm5hbE9wQ29kZS5QSU5HKTtcbiAgICAgIGNvbnN0IHsgb3Bjb2RlIH0gPSB0aGlzLl9wYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgICAgIHJldHVybiBvcGNvZGUgPT09IEludGVybmFsT3BDb2RlLlBPTkc7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSBjb25uZWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgY2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuX2Nsb3NlZCkgcmV0dXJuO1xuICAgIHRoaXMuX2Nsb3NlZCA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5fc29ja2V0KSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgdGhpcy5fc29ja2V0IS5lbmQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3NvY2tldCA9IG51bGw7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIl19
505
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXBjLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pcGMtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILDBEQUEwRDtBQUMxRCxFQUFFO0FBQ0Ysa0VBQWtFO0FBQ2xFLG1FQUFtRTtBQUNuRSwwQ0FBMEM7QUFDMUMsRUFBRTtBQUNGLGlEQUFpRDtBQUVqRCx5Q0FBMkI7QUFDM0IscUNBQTRFO0FBQzVFLG1DQUFnQztBQUVoQzs7R0FFRztBQUNVLFFBQUEsTUFBTSxHQUFHO0lBQ3BCLGdFQUFnRTtJQUNoRSxHQUFHLEVBQUUsSUFBSTtJQUNULEdBQUcsRUFBRSxJQUFJO0lBQ1QsTUFBTSxFQUFFLElBQUk7SUFDWixRQUFRLEVBQUUsSUFBSTtJQUNkLFNBQVMsRUFBRSxJQUFJO0lBQ2YsUUFBUSxFQUFFLElBQUk7SUFDZCxLQUFLLEVBQUUsSUFBSTtJQUNYLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLE9BQU8sRUFBRSxJQUFJO0lBQ2IsT0FBTyxFQUFFLElBQUk7SUFDYixJQUFJLEVBQUUsSUFBSTtJQUNWLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLEtBQUssRUFBRSxJQUFJO0lBQ1gsSUFBSSxFQUFFLElBQUk7SUFFVixrQkFBa0I7SUFDbEIsRUFBRSxFQUFFLElBQUk7SUFDUixLQUFLLEVBQUUsSUFBSTtJQUNYLEtBQUssRUFBRSxJQUFJO0lBQ1gsS0FBSyxFQUFFLElBQUk7SUFDWCxHQUFHLEVBQUUsSUFBSTtJQUNULFNBQVMsRUFBRSxJQUFJO0lBQ2YsU0FBUyxFQUFFLElBQUk7SUFDZixJQUFJLEVBQUUsSUFBSTtDQUNGLENBQUM7QUFFWCxrREFBa0Q7QUFDbEQsTUFBTSxjQUFjLEdBQUc7SUFDckIsR0FBRyxFQUFFLGNBQU0sQ0FBQyxHQUFHO0lBQ2YsR0FBRyxFQUFFLGNBQU0sQ0FBQyxHQUFHO0lBQ2YsTUFB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QUFDO1NBQ2xELENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsSUFBSTtRQUNSLElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkQsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakQsT0FBTyxNQUFNLEtBQUssY0FBYyxDQUFDLElBQUksQ0FBQztRQUN4QyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLEtBQUs7UUFDVCxJQUFJLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTztRQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUVwQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQzdCLElBQUksQ0FBQyxPQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtvQkFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7b0JBQ3BCLE9BQU8sRUFBRSxDQUFDO2dCQUNaLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBaGNELDhCQWdjQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU29jaERCIElQQyBDbGllbnRcbiAqXG4gKiBDb25uZWN0cyB0byBhIFNvY2hEQiBJUEMgc2VydmVyIHZpYSBVbml4IGRvbWFpbiBzb2NrZXQuXG4gKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKi9cblxuLy8gQ29weXJpZ2h0IDIwMjUgU3VzaGFudGggKGh0dHBzOi8vZ2l0aHViLmNvbS9zdXNoYW50aHB5KVxuLy9cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbi8vXG4vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbmltcG9ydCAqIGFzIG5ldCBmcm9tICduZXQnO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkVycm9yLCBQcm90b2NvbEVycm9yLCBUcmFuc2FjdGlvbkVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgUXVlcnkgfSBmcm9tICcuL3F1ZXJ5JztcblxuLyoqXG4gKiBXaXJlIHByb3RvY29sIG9wY29kZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBPcENvZGUgPSB7XG4gIC8vIENsaWVudCDihpIgU2VydmVyIChtdXN0IG1hdGNoIHNvY2hkYi1zdG9yYWdlL3NyYy9pcGNfc2VydmVyLnJzKVxuICBQdXQ6IDB4MDEsXG4gIEdldDogMHgwMixcbiAgRGVsZXRlOiAweDAzLFxuICBCZWdpblR4bjogMHgwNCxcbiAgQ29tbWl0VHhuOiAweDA1LFxuICBBYm9ydFR4bjogMHgwNixcbiAgUXVlcnk6IDB4MDcsXG4gIENyZWF0ZVRhYmxlOiAweDA4LFxuICBQdXRQYXRoOiAweDA5LFxuICBHZXRQYXRoOiAweDBBLFxuICBTY2FuOiAweDBCLFxuICBDaGVja3BvaW50OiAweDBDLFxuICBTdGF0czogMHgwRCxcbiAgUGluZzogMHgwRSxcblxuICAvLyBTZXJ2ZXIg4oaSIENsaWVudFxuICBPSzogMHg4MCxcbiAgRXJyb3I6IDB4ODEsXG4gIFZhbHVlOiAweDgyLFxuICBUeG5JZDogMHg4MyxcbiAgUm93OiAweDg0LFxuICBFbmRTdHJlYW06IDB4ODUsXG4gIFN0YXRzUmVzcDogMHg4NixcbiAgUG9uZzogMHg4Nyxcbn0gYXMgY29uc3Q7XG5cbi8vIEludGVybmFsIE9wQ29kZSBtYXAgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5jb25zdCBJbnRlcm5hbE9wQ29kZSA9IHtcbiAgUFVUOiBPcENvZGUuUHV0LFxuICBHRVQ6IE9wQ29kZS5HZXQsXG4gIERFTEVURTogT3BDb2RlLkRlbGV0ZSxcbiAgQkVHSU5fVFhOOiBPcENvZGUuQmVnaW5UeG4sXG4gIENPTU1JVF9UWE46IE9wQ29kZS5Db21taXRUeG4sXG4gIEFCT1JUX1RYTjogT3BDb2RlLkFib3J0VHhuLFxuICBRVUVSWTogT3BDb2RlLlF1ZXJ5LFxuICBQVVRfUEFUSDogT3BDb2RlLlB1dFBhdGgsXG4gIEdFVF9QQVRIOiBPcENvZGUuR2V0UGF0aCxcbiAgU0NBTjogT3BDb2RlLlNjYW4sXG4gIENIRUNLUE9JTlQ6IE9wQ29kZS5DaGVja3BvaW50LFxuICBTVEFUUzogT3BDb2RlLlN0YXRzLFxuICBQSU5HOiBPcENvZGUuUGluZyxcbiAgT0s6IE9wQ29kZS5PSyxcbiAgRVJST1I6IE9wQ29kZS5FcnJvcixcbiAgVkFMVUU6IE9wQ29kZS5WYWx1ZSxcbiAgVFhOX0lEOiBPcENvZGUuVHhuSWQsXG4gIFJPVzogT3BDb2RlLlJvdyxcbiAgRU5EX1NUUkVBTTogT3BDb2RlLkVuZFN0cmVhbSxcbiAgU1RBVFNfUkVTUDogT3BDb2RlLlN0YXRzUmVzcCxcbiAgUE9ORzogT3BDb2RlLlBvbmcsXG59IGFzIGNvbnN0O1xuXG5jb25zdCBNQVhfTUVTU0FHRV9TSVpFID0gMTYgKiAxMDI0ICogMTAyNDsgLy8gMTYgTUJcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIElwY0NsaWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJcGNDbGllbnRDb25maWcge1xuICAvKiogUGF0aCB0byBVbml4IGRvbWFpbiBzb2NrZXQgKi9cbiAgc29ja2V0UGF0aDogc3RyaW5nO1xuICAvKiogQ29ubmVjdGlvbiB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdDogNTAwMCkgKi9cbiAgY29ubmVjdFRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKiBSZWFkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIChkZWZhdWx0OiAzMDAwMCkgKi9cbiAgcmVhZFRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogSVBDIENsaWVudCBmb3IgU29jaERCLlxuICpcbiAqIENvbm5lY3RzIHRvIGEgU29jaERCIHNlcnZlciB2aWEgVW5peCBkb21haW4gc29ja2V0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBJcGNDbGllbnQgfSBmcm9tICdAc29jaGRiL3NvY2hkYic7XG4gKlxuICogY29uc3QgY2xpZW50ID0gYXdhaXQgSXBjQ2xpZW50LmNvbm5lY3QoJy90bXAvc29jaGRiLnNvY2snKTtcbiAqXG4gKiBhd2FpdCBjbGllbnQucHV0KEJ1ZmZlci5mcm9tKCdrZXknKSwgQnVmZmVyLmZyb20oJ3ZhbHVlJykpO1xuICogY29uc3QgdmFsdWUgPSBhd2FpdCBjbGllbnQuZ2V0KEJ1ZmZlci5mcm9tKCdrZXknKSk7XG4gKlxuICogYXdhaXQgY2xpZW50LmNsb3NlKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIElwY0NsaWVudCB7XG4gIHByaXZhdGUgX3NvY2tldDogbmV0LlNvY2tldCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9jb25maWc6IFJlcXVpcmVkPElwY0NsaWVudENvbmZpZz47XG4gIHByaXZhdGUgX3BlbmRpbmdSZWFkczogQXJyYXk8e1xuICAgIHJlc29sdmU6IChidWY6IEJ1ZmZlcikgPT4gdm9pZDtcbiAgICByZWplY3Q6IChlcnI6IEVycm9yKSA9PiB2b2lkO1xuICB9PiA9IFtdO1xuICBwcml2YXRlIF9yZWFkQnVmZmVyOiBCdWZmZXIgPSBCdWZmZXIuYWxsb2MoMCk7XG4gIHByaXZhdGUgX2Nsb3NlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoY29uZmlnOiBJcGNDbGllbnRDb25maWcpIHtcbiAgICB0aGlzLl9jb25maWcgPSB7XG4gICAgICBjb25uZWN0VGltZW91dDogNTAwMCxcbiAgICAgIHJlYWRUaW1lb3V0OiAzMDAwMCxcbiAgICAgIC4uLmNvbmZpZyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbm5lY3QgdG8gYSBTb2NoREIgSVBDIHNlcnZlci5cbiAgICpcbiAgICogQHBhcmFtIHNvY2tldFBhdGggLSBQYXRoIHRvIHRoZSBVbml4IGRvbWFpbiBzb2NrZXRcbiAgICogQHJldHVybnMgQSBjb25uZWN0ZWQgSXBjQ2xpZW50IGluc3RhbmNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgY2xpZW50ID0gYXdhaXQgSXBjQ2xpZW50LmNvbm5lY3QoJy90bXAvc29jaGRiLnNvY2snKTtcbiAgICogYGBgXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgY29ubmVjdChzb2NrZXRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPElwY0NsaWVudD4ge1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBJcGNDbGllbnQoeyBzb2NrZXRQYXRoIH0pO1xuICAgIGF3YWl0IGNsaWVudC5fY29ubmVjdCgpO1xuICAgIHJldHVybiBjbGllbnQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9jb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzb2NrZXQgPSBuZXQuY3JlYXRlQ29ubmVjdGlvbihcbiAgICAgICAgeyBwYXRoOiB0aGlzLl9jb25maWcuc29ja2V0UGF0aCB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fc29ja2V0ID0gc29ja2V0O1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgc29ja2V0LnNldFRpbWVvdXQodGhpcy5fY29uZmlnLmNvbm5lY3RUaW1lb3V0KTtcblxuICAgICAgc29ja2V0Lm9uKCd0aW1lb3V0JywgKCkgPT4ge1xuICAgICAgICBzb2NrZXQuZGVzdHJveSgpO1xuICAgICAgICByZWplY3QobmV3IENvbm5lY3Rpb25FcnJvcignQ29ubmVjdGlvbiB0aW1lb3V0JykpO1xuICAgICAgfSk7XG5cbiAgICAgIHNvY2tldC5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgIHJlamVjdChuZXcgQ29ubmVjdGlvbkVycm9yKGBDb25uZWN0aW9uIGZhaWxlZDogJHtlcnIubWVzc2FnZX1gKSk7XG4gICAgICB9KTtcblxuICAgICAgc29ja2V0Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgdGhpcy5fcmVhZEJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuX3JlYWRCdWZmZXIsIGRhdGFdKTtcbiAgICAgICAgdGhpcy5fcHJvY2Vzc0J1ZmZlcigpO1xuICAgICAgfSk7XG5cbiAgICAgIHNvY2tldC5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuX2Nsb3NlZCA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgcGVuZGluZyBvZiB0aGlzLl9wZW5kaW5nUmVhZHMpIHtcbiAgICAgICAgICBwZW5kaW5nLnJlamVjdChuZXcgQ29ubmVjdGlvbkVycm9yKCdDb25uZWN0aW9uIGNsb3NlZCcpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wZW5kaW5nUmVhZHMgPSBbXTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJvY2Vzc0J1ZmZlcigpOiB2b2lkIHtcbiAgICAvLyBQcm9jZXNzIGNvbXBsZXRlIG1lc3NhZ2VzIGZyb20gdGhlIGJ1ZmZlclxuICAgIHdoaWxlICh0aGlzLl9yZWFkQnVmZmVyLmxlbmd0aCA+PSA1ICYmIHRoaXMuX3BlbmRpbmdSZWFkcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBsZW5ndGggPSB0aGlzLl9yZWFkQnVmZmVyLnJlYWRVSW50MzJMRSgxKTtcbiAgICAgIGNvbnN0IHRvdGFsTGVuZ3RoID0gNSArIGxlbmd0aDtcblxuICAgICAgaWYgKHRoaXMuX3JlYWRCdWZmZXIubGVuZ3RoID49IHRvdGFsTGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLl9yZWFkQnVmZmVyLnN1YmFycmF5KDAsIHRvdGFsTGVuZ3RoKTtcbiAgICAgICAgdGhpcy5fcmVhZEJ1ZmZlciA9IHRoaXMuX3JlYWRCdWZmZXIuc3ViYXJyYXkodG90YWxMZW5ndGgpO1xuXG4gICAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLl9wZW5kaW5nUmVhZHMuc2hpZnQoKTtcbiAgICAgICAgaWYgKHBlbmRpbmcpIHtcbiAgICAgICAgICBwZW5kaW5nLnJlc29sdmUobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3NlbmQob3Bjb2RlOiBudW1iZXIsIHBheWxvYWQ6IEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYygwKSk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgaWYgKHRoaXMuX2Nsb3NlZCB8fCAhdGhpcy5fc29ja2V0KSB7XG4gICAgICB0aHJvdyBuZXcgQ29ubmVjdGlvbkVycm9yKCdOb3QgY29ubmVjdGVkJyk7XG4gICAgfVxuXG4gICAgLy8gRW5jb2RlIG1lc3NhZ2U6IG9wY29kZSAoMSkgKyBsZW5ndGggKDQgTEUpICsgcGF5bG9hZFxuICAgIGNvbnN0IG1lc3NhZ2UgPSBCdWZmZXIuYWxsb2MoNSArIHBheWxvYWQubGVuZ3RoKTtcbiAgICBtZXNzYWdlLndyaXRlVUludDgob3Bjb2RlLCAwKTtcbiAgICBtZXNzYWdlLndyaXRlVUludDMyTEUocGF5bG9hZC5sZW5ndGgsIDEpO1xuICAgIHBheWxvYWQuY29weShtZXNzYWdlLCA1KTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLl9wZW5kaW5nUmVhZHMucHVzaCh7IHJlc29sdmUsIHJlamVjdCB9KTtcblxuICAgICAgdGhpcy5fc29ja2V0IS53cml0ZShtZXNzYWdlLCAoZXJyKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICB0aGlzLl9wZW5kaW5nUmVhZHMucG9wKCk7XG4gICAgICAgICAgcmVqZWN0KG5ldyBDb25uZWN0aW9uRXJyb3IoYFdyaXRlIGZhaWxlZDogJHtlcnIubWVzc2FnZX1gKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBTZXQgdGltZW91dCBmb3IgcmVzcG9uc2VcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb25zdCBpZHggPSB0aGlzLl9wZW5kaW5nUmVhZHMuZmluZEluZGV4KChwKSA9PiBwLnJlc29sdmUgPT09IHJlc29sdmUpO1xuICAgICAgICBpZiAoaWR4ICE9PSAtMSkge1xuICAgICAgICAgIHRoaXMuX3BlbmRpbmdSZWFkcy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICByZWplY3QobmV3IENvbm5lY3Rpb25FcnJvcignUmVhZCB0aW1lb3V0JykpO1xuICAgICAgICB9XG4gICAgICB9LCB0aGlzLl9jb25maWcucmVhZFRpbWVvdXQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VSZXNwb25zZShyZXNwb25zZTogQnVmZmVyKTogeyBvcGNvZGU6IG51bWJlcjsgcGF5bG9hZDogQnVmZmVyIH0ge1xuICAgIGNvbnN0IG9wY29kZSA9IHJlc3BvbnNlLnJlYWRVSW50OCgwKTtcbiAgICBjb25zdCBsZW5ndGggPSByZXNwb25zZS5yZWFkVUludDMyTEUoMSk7XG4gICAgY29uc3QgcGF5bG9hZCA9IHJlc3BvbnNlLnN1YmFycmF5KDUsIDUgKyBsZW5ndGgpO1xuXG4gICAgaWYgKG9wY29kZSA9PT0gSW50ZXJuYWxPcENvZGUuRVJST1IpIHtcbiAgICAgIHRocm93IG5ldyBQcm90b2NvbEVycm9yKHBheWxvYWQudG9TdHJpbmcoJ3V0ZjgnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgb3Bjb2RlLCBwYXlsb2FkIH07XG4gIH1cblxuICAvKipcbiAgICogRW5jb2RlIGEga2V5IGZvciB0aGUgd2lyZSBwcm90b2NvbC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBzdGF0aWMgZW5jb2RlS2V5KGtleTogQnVmZmVyKTogQnVmZmVyIHtcbiAgICAvLyBGb3JtYXQ6IFtsZW5ndGg6NF1bb3A6MV1ba2V5X2xlbjo0XVtrZXk6Li4uXVxuICAgIGNvbnN0IG1zZ0xlbiA9IDEgKyA0ICsga2V5Lmxlbmd0aDtcbiAgICBjb25zdCBtc2cgPSBCdWZmZXIuYWxsb2MoNCArIG1zZ0xlbik7XG4gICAgbXNnLndyaXRlVUludDMyQkUobXNnTGVuLCAwKTtcbiAgICBtc2cud3JpdGVVSW50OChJbnRlcm5hbE9wQ29kZS5HRVQsIDQpO1xuICAgIG1zZy53cml0ZVVJbnQzMkJFKGtleS5sZW5ndGgsIDUpO1xuICAgIGtleS5jb3B5KG1zZywgOSk7XG4gICAgcmV0dXJuIG1zZztcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmNvZGUgYSBrZXktdmFsdWUgcGFpciBmb3IgdGhlIHdpcmUgcHJvdG9jb2wuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgc3RhdGljIGVuY29kZUtleVZhbHVlKGtleTogQnVmZmVyLCB2YWx1ZTogQnVmZmVyKTogQnVmZmVyIHtcbiAgICAvLyBGb3JtYXQ6IFtsZW5ndGg6NF1bb3A6MV1ba2V5X2xlbjo0XVtrZXk6Li4uXVt2YWx1ZV9sZW46NF1bdmFsdWU6Li4uXVxuICAgIGNvbnN0IG1zZ0xlbiA9IDEgKyA0ICsga2V5Lmxlbmd0aCArIDQgKyB2YWx1ZS5sZW5ndGg7XG4gICAgY29uc3QgbXNnID0gQnVmZmVyLmFsbG9jKDQgKyBtc2dMZW4pO1xuICAgIG1zZy53cml0ZVVJbnQzMkJFKG1zZ0xlbiwgMCk7XG4gICAgbXNnLndyaXRlVUludDgoSW50ZXJuYWxPcENvZGUuUFVULCA0KTtcbiAgICBtc2cud3JpdGVVSW50MzJCRShrZXkubGVuZ3RoLCA1KTtcbiAgICBrZXkuY29weShtc2csIDkpO1xuICAgIG1zZy53cml0ZVVJbnQzMkJFKHZhbHVlLmxlbmd0aCwgOSArIGtleS5sZW5ndGgpO1xuICAgIHZhbHVlLmNvcHkobXNnLCAxMyArIGtleS5sZW5ndGgpO1xuICAgIHJldHVybiBtc2c7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdmFsdWUgYnkga2V5LlxuICAgKi9cbiAgYXN5bmMgZ2V0KGtleTogQnVmZmVyKTogUHJvbWlzZTxCdWZmZXIgfCBudWxsPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zZW5kKEludGVybmFsT3BDb2RlLkdFVCwga2V5KTtcbiAgICBjb25zdCB7IG9wY29kZSwgcGF5bG9hZCB9ID0gdGhpcy5fcGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG5cbiAgICBpZiAob3Bjb2RlID09PSBJbnRlcm5hbE9wQ29kZS5WQUxVRSkge1xuICAgICAgLy8gSWYgcGF5bG9hZCBpcyBlbXB0eSwgdGhlIGtleSBkb2Vzbid0IGV4aXN0XG4gICAgICBpZiAocGF5bG9hZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUHV0IGEga2V5LXZhbHVlIHBhaXIuXG4gICAqL1xuICBhc3luYyBwdXQoa2V5OiBCdWZmZXIsIHZhbHVlOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBFbmNvZGU6IGtleV9sZW4gKDQgTEUpICsga2V5ICsgdmFsdWVcbiAgICBjb25zdCBwYXlsb2FkID0gQnVmZmVyLmFsbG9jKDQgKyBrZXkubGVuZ3RoICsgdmFsdWUubGVuZ3RoKTtcbiAgICBwYXlsb2FkLndyaXRlVUludDMyTEUoa2V5Lmxlbmd0aCwgMCk7XG4gICAga2V5LmNvcHkocGF5bG9hZCwgNCk7XG4gICAgdmFsdWUuY29weShwYXlsb2FkLCA0ICsga2V5Lmxlbmd0aCk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX3NlbmQoSW50ZXJuYWxPcENvZGUuUFVULCBwYXlsb2FkKTtcbiAgICB0aGlzLl9wYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBrZXkuXG4gICAqL1xuICBhc3luYyBkZWxldGUoa2V5OiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX3NlbmQoSW50ZXJuYWxPcENvZGUuREVMRVRFLCBrZXkpO1xuICAgIHRoaXMuX3BhcnNlUmVzcG9uc2UocmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHZhbHVlIGJ5IHBhdGguXG4gICAqIFdpcmUgZm9ybWF0OiBwYXRoX2NvdW50KDIgTEUpICsgW3BhdGhfbGVuKDIgTEUpICsgcGF0aF9zZWdtZW50XS4uLlxuICAgKi9cbiAgYXN5bmMgZ2V0UGF0aChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlciB8IG51bGw+IHtcbiAgICAvLyBFbmNvZGUgcGF0aCBhcyBzaW5nbGUgc2VnbWVudCBmb3Igbm93IChjb3VsZCBzcGxpdCBvbiAnLycgZm9yIG11bHRpLXNlZ21lbnQpXG4gICAgY29uc3QgcGF0aEJ1ZiA9IEJ1ZmZlci5mcm9tKHBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgcGF5bG9hZCA9IEJ1ZmZlci5hbGxvYygyICsgMiArIHBhdGhCdWYubGVuZ3RoKTtcbiAgICBwYXlsb2FkLndyaXRlVUludDE2TEUoMSwgMCk7IC8vIHBhdGhfY291bnQgPSAxXG4gICAgcGF5bG9hZC53cml0ZVVJbnQxNkxFKHBhdGhCdWYubGVuZ3RoLCAyKTsgLy8gcGF0aF9sZW5cbiAgICBwYXRoQnVmLmNvcHkocGF5bG9hZCwgNCk7IC8vIHBhdGhcbiAgICBcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX3NlbmQoSW50ZXJuYWxPcENvZGUuR0VUX1BBVEgsIHBheWxvYWQpO1xuICAgIGNvbnN0IHsgb3Bjb2RlLCBwYXlsb2FkOiByZXNwb25zZVBheWxvYWQgfSA9IHRoaXMuX3BhcnNlUmVzcG9uc2UocmVzcG9uc2UpO1xuXG4gICAgaWYgKG9wY29kZSA9PT0gSW50ZXJuYWxPcENvZGUuVkFMVUUpIHtcbiAgICAgIC8vIElmIHBheWxvYWQgaXMgZW1wdHksIHRoZSBrZXkgZG9lc24ndCBleGlzdFxuICAgICAgaWYgKHJlc3BvbnNlUGF5bG9hZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzcG9uc2VQYXlsb2FkO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdXQgYSB2YWx1ZSBhdCBhIHBhdGguXG4gICAqIFdpcmUgZm9ybWF0OiBwYXRoX2NvdW50KDIgTEUpICsgW3BhdGhfbGVuKDIgTEUpICsgcGF0aF9zZWdtZW50XS4uLiArIHZhbHVlXG4gICAqL1xuICBhc3luYyBwdXRQYXRoKHBhdGg6IHN0cmluZywgdmFsdWU6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhdGhCdWYgPSBCdWZmZXIuZnJvbShwYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IHBheWxvYWQgPSBCdWZmZXIuYWxsb2MoMiArIDIgKyBwYXRoQnVmLmxlbmd0aCArIHZhbHVlLmxlbmd0aCk7XG4gICAgcGF5bG9hZC53cml0ZVVJbnQxNkxFKDEsIDApOyAvLyBwYXRoX2NvdW50ID0gMVxuICAgIHBheWxvYWQud3JpdGVVSW50MTZMRShwYXRoQnVmLmxlbmd0aCwgMik7IC8vIHBhdGhfbGVuXG4gICAgcGF0aEJ1Zi5jb3B5KHBheWxvYWQsIDQpOyAvLyBwYXRoXG4gICAgdmFsdWUuY29weShwYXlsb2FkLCA0ICsgcGF0aEJ1Zi5sZW5ndGgpOyAvLyB2YWx1ZVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zZW5kKEludGVybmFsT3BDb2RlLlBVVF9QQVRILCBwYXlsb2FkKTtcbiAgICB0aGlzLl9wYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgcXVlcnkgYW5kIHJldHVybiBUT09OLWZvcm1hdHRlZCByZXN1bHRzLlxuICAgKiBcbiAgICogV2lyZSBmb3JtYXQ6IHBhdGhfbGVuKDIpICsgcGF0aCArIGxpbWl0KDQpICsgb2Zmc2V0KDQpICsgY29sc19jb3VudCgyKSArIFtjb2xfbGVuKDIpICsgY29sXS4uLlxuICAgKi9cbiAgYXN5bmMgcXVlcnkoXG4gICAgcGF0aFByZWZpeDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7IGxpbWl0PzogbnVtYmVyOyBvZmZzZXQ/OiBudW1iZXI7IGNvbHVtbnM/OiBzdHJpbmdbXSB9XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgb3B0cyA9IG9wdGlvbnMgfHwge307XG4gICAgY29uc3QgcGF0aEJ1ZiA9IEJ1ZmZlci5mcm9tKHBhdGhQcmVmaXgsICd1dGY4Jyk7XG4gICAgY29uc3QgY29sdW1ucyA9IG9wdHMuY29sdW1ucyB8fCBbXTtcbiAgICBcbiAgICAvLyBDYWxjdWxhdGUgcGF5bG9hZCBzaXplXG4gICAgbGV0IHNpemUgPSAyICsgcGF0aEJ1Zi5sZW5ndGggKyA0ICsgNCArIDI7XG4gICAgZm9yIChjb25zdCBjb2wgb2YgY29sdW1ucykge1xuICAgICAgc2l6ZSArPSAyICsgQnVmZmVyLmJ5dGVMZW5ndGgoY29sLCAndXRmOCcpO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBwYXlsb2FkID0gQnVmZmVyLmFsbG9jKHNpemUpO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIFxuICAgIC8vIFBhdGg6IHBhdGhfbGVuKDIgTEUpICsgcGF0aFxuICAgIHBheWxvYWQud3JpdGVVSW50MTZMRShwYXRoQnVmLmxlbmd0aCwgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gMjtcbiAgICBwYXRoQnVmLmNvcHkocGF5bG9hZCwgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gcGF0aEJ1Zi5sZW5ndGg7XG4gICAgXG4gICAgLy8gTGltaXQgKDQgTEUpIC0gMCBtZWFucyBubyBsaW1pdFxuICAgIHBheWxvYWQud3JpdGVVSW50MzJMRShvcHRzLmxpbWl0IHx8IDAsIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IDQ7XG4gICAgXG4gICAgLy8gT2Zmc2V0ICg0IExFKVxuICAgIHBheWxvYWQud3JpdGVVSW50MzJMRShvcHRzLm9mZnNldCB8fCAwLCBvZmZzZXQpO1xuICAgIG9mZnNldCArPSA0O1xuICAgIFxuICAgIC8vIENvbHVtbnM6IGNvdW50KDIgTEUpICsgW2NvbF9sZW4oMiBMRSkgKyBjb2xdLi4uXG4gICAgcGF5bG9hZC53cml0ZVVJbnQxNkxFKGNvbHVtbnMubGVuZ3RoLCBvZmZzZXQpO1xuICAgIG9mZnNldCArPSAyO1xuICAgIGZvciAoY29uc3QgY29sIG9mIGNvbHVtbnMpIHtcbiAgICAgIGNvbnN0IGNvbEJ1ZiA9IEJ1ZmZlci5mcm9tKGNvbCwgJ3V0ZjgnKTtcbiAgICAgIHBheWxvYWQud3JpdGVVSW50MTZMRShjb2xCdWYubGVuZ3RoLCBvZmZzZXQpO1xuICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICBjb2xCdWYuY29weShwYXlsb2FkLCBvZmZzZXQpO1xuICAgICAgb2Zmc2V0ICs9IGNvbEJ1Zi5sZW5ndGg7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zZW5kKEludGVybmFsT3BDb2RlLlFVRVJZLCBwYXlsb2FkKTtcbiAgICBjb25zdCB7IHBheWxvYWQ6IHJlc3VsdFBheWxvYWQgfSA9IHRoaXMuX3BhcnNlUmVzcG9uc2UocmVzcG9uc2UpO1xuXG4gICAgcmV0dXJuIHJlc3VsdFBheWxvYWQudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY2FuIGZvciBrZXlzIHdpdGggYSBwcmVmaXgsIHJldHVybmluZyBrZXktdmFsdWUgcGFpcnMuXG4gICAqIFRoaXMgaXMgdGhlIHByZWZlcnJlZCBtZXRob2QgZm9yIHNpbXBsZSBwcmVmaXgtYmFzZWQgaXRlcmF0aW9uLlxuICAgKiBcbiAgICogV2lyZSBmb3JtYXQ6IHByZWZpeCBzdHJpbmdcbiAgICogUmVzcG9uc2UgZm9ybWF0OiBjb3VudCg0IExFKSArIFtrZXlfbGVuKDIgTEUpICsga2V5ICsgdmFsX2xlbig0IExFKSArIHZhbF0uLi5cbiAgICovXG4gIGFzeW5jIHNjYW4ocHJlZml4OiBzdHJpbmcpOiBQcm9taXNlPEFycmF5PHsga2V5OiBCdWZmZXI7IHZhbHVlOiBCdWZmZXIgfT4+IHtcbiAgICBjb25zdCBwcmVmaXhCdWYgPSBCdWZmZXIuZnJvbShwcmVmaXgsICd1dGY4Jyk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9zZW5kKEludGVybmFsT3BDb2RlLlNDQU4sIHByZWZpeEJ1Zik7XG4gICAgY29uc3QgeyBvcGNvZGUsIHBheWxvYWQgfSA9IHRoaXMuX3BhcnNlUmVzcG9uc2UocmVzcG9uc2UpO1xuXG4gICAgaWYgKG9wY29kZSAhPT0gSW50ZXJuYWxPcENvZGUuVkFMVUUgJiYgb3Bjb2RlICE9PSBJbnRlcm5hbE9wQ29kZS5PSykge1xuICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXJyb3IoYFVuZXhwZWN0ZWQgc2NhbiByZXNwb25zZSBvcGNvZGU6IDB4JHtvcGNvZGUudG9TdHJpbmcoMTYpfWApO1xuICAgIH1cblxuICAgIGlmIChwYXlsb2FkLmxlbmd0aCA8IDQpIHtcbiAgICAgIHJldHVybiBbXTsgLy8gRW1wdHkgcmVzdWx0XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgcmVzcG9uc2U6IGNvdW50KDQgTEUpICsgW2tleV9sZW4oMiBMRSkgKyBrZXkgKyB2YWxfbGVuKDQgTEUpICsgdmFsXS4uLlxuICAgIGNvbnN0IGNvdW50ID0gcGF5bG9hZC5yZWFkVUludDMyTEUoMCk7XG4gICAgY29uc3QgcmVzdWx0czogQXJyYXk8eyBrZXk6IEJ1ZmZlcjsgdmFsdWU6IEJ1ZmZlciB9PiA9IFtdO1xuICAgIGxldCBvZmZzZXQgPSA0O1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICBpZiAob2Zmc2V0ICsgMiA+IHBheWxvYWQubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBQcm90b2NvbEVycm9yKCdUcnVuY2F0ZWQgc2NhbiByZXNwb25zZSAoa2V5X2xlbiknKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGtleUxlbiA9IHBheWxvYWQucmVhZFVJbnQxNkxFKG9mZnNldCk7XG4gICAgICBvZmZzZXQgKz0gMjtcblxuICAgICAgaWYgKG9mZnNldCArIGtleUxlbiArIDQgPiBwYXlsb2FkLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFcnJvcignVHJ1bmNhdGVkIHNjYW4gcmVzcG9uc2UgKGtleSt2YWxfbGVuKScpO1xuICAgICAgfVxuICAgICAgY29uc3Qga2V5ID0gcGF5bG9hZC5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIGtleUxlbik7XG4gICAgICBvZmZzZXQgKz0ga2V5TGVuO1xuXG4gICAgICBjb25zdCB2YWxMZW4gPSBwYXlsb2FkLnJlYWRVSW50MzJMRShvZmZzZXQpO1xuICAgICAgb2Zmc2V0ICs9IDQ7XG5cbiAgICAgIGlmIChvZmZzZXQgKyB2YWxMZW4gPiBwYXlsb2FkLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFcnJvcignVHJ1bmNhdGVkIHNjYW4gcmVzcG9uc2UgKHZhbHVlKScpO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWUgPSBwYXlsb2FkLnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgdmFsTGVuKTtcbiAgICAgIG9mZnNldCArPSB2YWxMZW47XG5cbiAgICAgIHJlc3VsdHMucHVzaCh7IGtleSwgdmFsdWUgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgcXVlcnkgYnVpbGRlci5cbiAgICovXG4gIHF1ZXJ5QnVpbGRlcihwYXRoUHJlZml4OiBzdHJpbmcpOiBRdWVyeSB7XG4gICAgcmV0dXJuIG5ldyBRdWVyeSh0aGlzLCBwYXRoUHJlZml4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCZWdpbiBhIG5ldyB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGFzeW5jIGJlZ2luVHJhbnNhY3Rpb24oKTogUHJvbWlzZTxiaWdpbnQ+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX3NlbmQoSW50ZXJuYWxPcENvZGUuQkVHSU5fVFhOKTtcbiAgICBjb25zdCB7IG9wY29kZSwgcGF5bG9hZCB9ID0gdGhpcy5fcGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG5cbiAgICBpZiAob3Bjb2RlID09PSBJbnRlcm5hbE9wQ29kZS5UWE5fSUQpIHtcbiAgICAgIHJldHVybiBwYXlsb2FkLnJlYWRCaWdVSW50NjRMRSgwKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFRyYW5zYWN0aW9uRXJyb3IoJ0ZhaWxlZCB0byBiZWdpbiB0cmFuc2FjdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbW1pdCBhIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgY29tbWl0VHJhbnNhY3Rpb24odHhuSWQ6IGJpZ2ludCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBheWxvYWQgPSBCdWZmZXIuYWxsb2MoOCk7XG4gICAgcGF5bG9hZC53cml0ZUJpZ1VJbnQ2NExFKHR4bklkLCAwKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX3NlbmQoSW50ZXJuYWxPcENvZGUuQ09NTUlUX1RYTiwgcGF5bG9hZCk7XG4gICAgdGhpcy5fcGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG4gIH1cblxuICAvKipcbiAgICogQWJvcnQgYSB0cmFuc2FjdGlvbi5cbiAgICovXG4gIGFzeW5jIGFib3J0VHJhbnNhY3Rpb24odHhuSWQ6IGJpZ2ludCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBheWxvYWQgPSBCdWZmZXIuYWxsb2MoOCk7XG4gICAgcGF5bG9hZC53cml0ZUJpZ1VJbnQ2NExFKHR4bklkLCAwKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX3NlbmQoSW50ZXJuYWxPcENvZGUuQUJPUlRfVFhOLCBwYXlsb2FkKTtcbiAgICB0aGlzLl9wYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JjZSBhIGNoZWNrcG9pbnQuXG4gICAqL1xuICBhc3luYyBjaGVja3BvaW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fc2VuZChJbnRlcm5hbE9wQ29kZS5DSEVDS1BPSU5UKTtcbiAgICB0aGlzLl9wYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc3RvcmFnZSBzdGF0aXN0aWNzLlxuICAgKi9cbiAgYXN5bmMgc3RhdHMoKTogUHJvbWlzZTx7XG4gICAgbWVtdGFibGVTaXplQnl0ZXM6IG51bWJlcjtcbiAgICB3YWxTaXplQnl0ZXM6IG51bWJlcjtcbiAgICBhY3RpdmVUcmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgfT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fc2VuZChJbnRlcm5hbE9wQ29kZS5TVEFUUyk7XG4gICAgY29uc3QgeyBwYXlsb2FkIH0gPSB0aGlzLl9wYXJzZVJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShwYXlsb2FkLnRvU3RyaW5nKCd1dGY4JykpO1xuICAgIHJldHVybiB7XG4gICAgICBtZW10YWJsZVNpemVCeXRlczoganNvbi5tZW10YWJsZV9zaXplX2J5dGVzIHx8IDAsXG4gICAgICB3YWxTaXplQnl0ZXM6IGpzb24ud2FsX3NpemVfYnl0ZXMgfHwgMCxcbiAgICAgIGFjdGl2ZVRyYW5zYWN0aW9uczoganNvbi5hY3RpdmVfdHJhbnNhY3Rpb25zIHx8IDAsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaW5nIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBhc3luYyBwaW5nKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX3NlbmQoSW50ZXJuYWxPcENvZGUuUElORyk7XG4gICAgICBjb25zdCB7IG9wY29kZSB9ID0gdGhpcy5fcGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG4gICAgICByZXR1cm4gb3Bjb2RlID09PSBJbnRlcm5hbE9wQ29kZS5QT05HO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgY29ubmVjdGlvbi5cbiAgICovXG4gIGFzeW5jIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9jbG9zZWQpIHJldHVybjtcbiAgICB0aGlzLl9jbG9zZWQgPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMuX3NvY2tldCkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHRoaXMuX3NvY2tldCEuZW5kKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9zb2NrZXQgPSBudWxsO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+ /**
3
+ * Consolidator for Memory System
4
+ *
5
+ * Event-sourced consolidation with append-only events and derived canonical facts.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.Consolidator = void 0;
9
+ const crypto_1 = require("crypto");
10
+ /**
11
+ * Consolidator for managing facts
12
+ */
13
+ class Consolidator {
14
+ db;
15
+ namespace;
16
+ config;
17
+ prefix;
18
+ constructor(db, namespace, config) {
19
+ this.db = db;
20
+ this.namespace = namespace;
21
+ this.config = {
22
+ similarityThreshold: config?.similarityThreshold || 0.85,
23
+ useTemporalUpdates: config?.useTemporalUpdates !== false,
24
+ maxConflictAge: config?.maxConflictAge || 86400, // 24 hours default
25
+ };
26
+ this.prefix = Buffer.from(`consolidation:${namespace}:`);
27
+ }
28
+ /**
29
+ * Create consolidator from database
30
+ */
31
+ static fromDatabase(db, namespace, config) {
32
+ return new Consolidator(db, namespace, config);
33
+ }
34
+ /**
35
+ * Add a raw assertion (immutable event)
36
+ */
37
+ async add(assertion) {
38
+ const id = assertion.id || this.generateAssertionId(assertion);
39
+ const timestamp = assertion.timestamp || Date.now();
40
+ const storedAssertion = {
41
+ ...assertion,
42
+ id,
43
+ timestamp,
44
+ };
45
+ const key = Buffer.concat([this.prefix, Buffer.from(`assertion:${id}`)]);
46
+ await this.db.put(key, Buffer.from(JSON.stringify(storedAssertion)));
47
+ return id;
48
+ }
49
+ /**
50
+ * Add assertion with contradiction handling
51
+ */
52
+ async addWithContradiction(newAssertion, contradicts) {
53
+ const id = await this.add(newAssertion);
54
+ // Mark contradicted assertions
55
+ for (const contradictedId of contradicts) {
56
+ const contradictionKey = Buffer.concat([
57
+ this.prefix,
58
+ Buffer.from(`contradiction:${contradictedId}:${id}`),
59
+ ]);
60
+ await this.db.put(contradictionKey, Buffer.from(JSON.stringify({
61
+ from: contradictedId,
62
+ to: id,
63
+ timestamp: Date.now(),
64
+ })));
65
+ }
66
+ return id;
67
+ }
68
+ /**
69
+ * Run consolidation to update canonical view
70
+ */
71
+ async consolidate() {
72
+ const assertions = await this.getAllAssertions();
73
+ const contradictions = await this.getContradictions();
74
+ // Group assertions by subject
75
+ const groups = new Map();
76
+ for (const assertion of assertions) {
77
+ const subject = JSON.stringify(assertion.fact);
78
+ const group = groups.get(subject) || [];
79
+ group.push(assertion);
80
+ groups.set(subject, group);
81
+ }
82
+ let updated = 0;
83
+ // Create canonical facts
84
+ for (const [subject, group] of groups) {
85
+ // Sort by confidence and timestamp
86
+ group.sort((a, b) => {
87
+ if (b.confidence !== a.confidence) {
88
+ return b.confidence - a.confidence;
89
+ }
90
+ return (b.timestamp || 0) - (a.timestamp || 0);
91
+ });
92
+ // Check for contradictions
93
+ const validAssertions = group.filter(a => {
94
+ const isContradicted = contradictions.some(c => c.from === a.id);
95
+ if (isContradicted && this.config.useTemporalUpdates) {
96
+ // Find the contradicting assertion
97
+ const contradiction = contradictions.find(c => c.from === a.id);
98
+ if (contradiction) {
99
+ const age = Date.now() - (contradiction.timestamp || 0);
100
+ return age > this.config.maxConflictAge;
101
+ }
102
+ }
103
+ return !isContradicted;
104
+ });
105
+ if (validAssertions.length > 0) {
106
+ const canonical = {
107
+ id: this.generateCanonicalId(validAssertions[0]),
108
+ mergedFact: validAssertions[0].fact,
109
+ confidence: this.mergeConfidence(validAssertions),
110
+ sources: validAssertions.map(a => a.source),
111
+ validFrom: Math.min(...validAssertions.map(a => a.timestamp || 0)),
112
+ validUntil: undefined,
113
+ };
114
+ const key = Buffer.concat([this.prefix, Buffer.from(`canonical:${canonical.id}`)]);
115
+ await this.db.put(key, Buffer.from(JSON.stringify(canonical)));
116
+ updated++;
117
+ }
118
+ }
119
+ return updated;
120
+ }
121
+ /**
122
+ * Get canonical facts
123
+ */
124
+ async getCanonicalFacts() {
125
+ const facts = [];
126
+ const canonicalPrefix = Buffer.concat([this.prefix, Buffer.from('canonical:')]);
127
+ for await (const [_, value] of this.db.scanPrefix(canonicalPrefix)) {
128
+ facts.push(JSON.parse(value.toString()));
129
+ }
130
+ return facts;
131
+ }
132
+ /**
133
+ * Explain provenance of a fact
134
+ */
135
+ async explain(factId) {
136
+ const key = Buffer.concat([this.prefix, Buffer.from(`canonical:${factId}`)]);
137
+ const value = await this.db.get(key);
138
+ if (!value) {
139
+ return { evidenceCount: 0, sources: [], confidence: 0 };
140
+ }
141
+ const fact = JSON.parse(value.toString());
142
+ return {
143
+ evidenceCount: fact.sources.length,
144
+ sources: fact.sources,
145
+ confidence: fact.confidence,
146
+ };
147
+ }
148
+ /**
149
+ * Get all raw assertions
150
+ */
151
+ async getAllAssertions() {
152
+ const assertions = [];
153
+ const assertionPrefix = Buffer.concat([this.prefix, Buffer.from('assertion:')]);
154
+ for await (const [_, value] of this.db.scanPrefix(assertionPrefix)) {
155
+ assertions.push(JSON.parse(value.toString()));
156
+ }
157
+ return assertions;
158
+ }
159
+ /**
160
+ * Get all contradictions
161
+ */
162
+ async getContradictions() {
163
+ const contradictions = [];
164
+ const contradictionPrefix = Buffer.concat([this.prefix, Buffer.from('contradiction:')]);
165
+ for await (const [_, value] of this.db.scanPrefix(contradictionPrefix)) {
166
+ contradictions.push(JSON.parse(value.toString()));
167
+ }
168
+ return contradictions;
169
+ }
170
+ /**
171
+ * Merge confidence from multiple assertions
172
+ */
173
+ mergeConfidence(assertions) {
174
+ if (assertions.length === 0)
175
+ return 0;
176
+ if (assertions.length === 1)
177
+ return assertions[0].confidence;
178
+ // Average with weight toward higher confidence
179
+ const sorted = [...assertions].sort((a, b) => b.confidence - a.confidence);
180
+ const weights = sorted.map((_, i) => 1 / (i + 1));
181
+ const totalWeight = weights.reduce((a, b) => a + b, 0);
182
+ return sorted.reduce((acc, assertion, i) => {
183
+ return acc + (assertion.confidence * weights[i]) / totalWeight;
184
+ }, 0);
185
+ }
186
+ /**
187
+ * Generate deterministic assertion ID
188
+ */
189
+ generateAssertionId(assertion) {
190
+ return (0, crypto_1.createHash)('sha256')
191
+ .update(JSON.stringify(assertion.fact) + assertion.source)
192
+ .digest('hex')
193
+ .substring(0, 16);
194
+ }
195
+ /**
196
+ * Generate deterministic canonical fact ID
197
+ */
198
+ generateCanonicalId(assertion) {
199
+ return (0, crypto_1.createHash)('sha256')
200
+ .update(JSON.stringify(assertion.fact))
201
+ .digest('hex')
202
+ .substring(0, 16);
203
+ }
204
+ }
205
+ exports.Consolidator = Consolidator;
206
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc29saWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZW1vcnkvY29uc29saWRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7O0FBUUgsbUNBQW9DO0FBRXBDOztHQUVHO0FBQ0gsTUFBYSxZQUFZO0lBQ2YsRUFBRSxDQUFtQjtJQUNyQixTQUFTLENBQVM7SUFDbEIsTUFBTSxDQUFzQjtJQUM1QixNQUFNLENBQVM7SUFFdkIsWUFBWSxFQUFvQixFQUFFLFNBQWlCLEVBQUUsTUFBNEI7UUFDL0UsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxHQUFHO1lBQ1osbUJBQW1CLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixJQUFJLElBQUk7WUFDeEQsa0JBQWtCLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixLQUFLLEtBQUs7WUFDeEQsY0FBYyxFQUFFLE1BQU0sRUFBRSxjQUFjLElBQUksS0FBSyxFQUFFLG1CQUFtQjtTQUNyRSxDQUFDO1FBQ0YsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBb0IsRUFBRSxTQUFpQixFQUFFLE1BQTRCO1FBQ3ZGLE9BQU8sSUFBSSxZQUFZLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQXVCO1FBQy9CLE1BQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sU0FBUyxHQUFHLFNB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QUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXZELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDekMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztRQUNqRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRUQ7O09BRUc7SUFDSyxtQkFBbUIsQ0FBQyxTQUF1QjtRQUNqRCxPQUFPLElBQUEsbUJBQVUsRUFBQyxRQUFRLENBQUM7YUFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7YUFDekQsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUNiLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssbUJBQW1CLENBQUMsU0FBdUI7UUFDakQsT0FBTyxJQUFBLG1CQUFVLEVBQUMsUUFBUSxDQUFDO2FBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN0QyxNQUFNLENBQUMsS0FBSyxDQUFDO2FBQ2IsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN0QixDQUFDO0NBQ0Y7QUEvTkQsb0NBK05DIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb25zb2xpZGF0b3IgZm9yIE1lbW9yeSBTeXN0ZW1cbiAqIFxuICogRXZlbnQtc291cmNlZCBjb25zb2xpZGF0aW9uIHdpdGggYXBwZW5kLW9ubHkgZXZlbnRzIGFuZCBkZXJpdmVkIGNhbm9uaWNhbCBmYWN0cy5cbiAqL1xuXG5pbXBvcnQgeyBFbWJlZGRlZERhdGFiYXNlIH0gZnJvbSAnLi4vZW1iZWRkZWQnO1xuaW1wb3J0IHtcbiAgUmF3QXNzZXJ0aW9uLFxuICBDYW5vbmljYWxGYWN0LFxuICBDb25zb2xpZGF0aW9uQ29uZmlnLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuXG4vKipcbiAqIENvbnNvbGlkYXRvciBmb3IgbWFuYWdpbmcgZmFjdHNcbiAqL1xuZXhwb3J0IGNsYXNzIENvbnNvbGlkYXRvciB7XG4gIHByaXZhdGUgZGI6IEVtYmVkZGVkRGF0YWJhc2U7XG4gIHByaXZhdGUgbmFtZXNwYWNlOiBzdHJpbmc7XG4gIHByaXZhdGUgY29uZmlnOiBDb25zb2xpZGF0aW9uQ29uZmlnO1xuICBwcml2YXRlIHByZWZpeDogQnVmZmVyO1xuXG4gIGNvbnN0cnVjdG9yKGRiOiBFbWJlZGRlZERhdGFiYXNlLCBuYW1lc3BhY2U6IHN0cmluZywgY29uZmlnPzogQ29uc29saWRhdGlvbkNvbmZpZykge1xuICAgIHRoaXMuZGIgPSBkYjtcbiAgICB0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIHNpbWlsYXJpdHlUaHJlc2hvbGQ6IGNvbmZpZz8uc2ltaWxhcml0eVRocmVzaG9sZCB8fCAwLjg1LFxuICAgICAgdXNlVGVtcG9yYWxVcGRhdGVzOiBjb25maWc/LnVzZVRlbXBvcmFsVXBkYXRlcyAhPT0gZmFsc2UsXG4gICAgICBtYXhDb25mbGljdEFnZTogY29uZmlnPy5tYXhDb25mbGljdEFnZSB8fCA4NjQwMCwgLy8gMjQgaG91cnMgZGVmYXVsdFxuICAgIH07XG4gICAgdGhpcy5wcmVmaXggPSBCdWZmZXIuZnJvbShgY29uc29saWRhdGlvbjoke25hbWVzcGFjZX06YCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGNvbnNvbGlkYXRvciBmcm9tIGRhdGFiYXNlXG4gICAqL1xuICBzdGF0aWMgZnJvbURhdGFiYXNlKGRiOiBFbWJlZGRlZERhdGFiYXNlLCBuYW1lc3BhY2U6IHN0cmluZywgY29uZmlnPzogQ29uc29saWRhdGlvbkNvbmZpZyk6IENvbnNvbGlkYXRvciB7XG4gICAgcmV0dXJuIG5ldyBDb25zb2xpZGF0b3IoZGIsIG5hbWVzcGFjZSwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSByYXcgYXNzZXJ0aW9uIChpbW11dGFibGUgZXZlbnQpXG4gICAqL1xuICBhc3luYyBhZGQoYXNzZXJ0aW9uOiBSYXdBc3NlcnRpb24pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGlkID0gYXNzZXJ0aW9uLmlkIHx8IHRoaXMuZ2VuZXJhdGVBc3NlcnRpb25JZChhc3NlcnRpb24pO1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IGFzc2VydGlvbi50aW1lc3RhbXAgfHwgRGF0ZS5ub3coKTtcblxuICAgIGNvbnN0IHN0b3JlZEFzc2VydGlvbjogUmF3QXNzZXJ0aW9uID0ge1xuICAgICAgLi4uYXNzZXJ0aW9uLFxuICAgICAgaWQsXG4gICAgICB0aW1lc3RhbXAsXG4gICAgfTtcblxuICAgIGNvbnN0IGtleSA9IEJ1ZmZlci5jb25jYXQoW3RoaXMucHJlZml4LCBCdWZmZXIuZnJvbShgYXNzZXJ0aW9uOiR7aWR9YCldKTtcbiAgICBhd2FpdCB0aGlzLmRiLnB1dChrZXksIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHN0b3JlZEFzc2VydGlvbikpKTtcblxuICAgIHJldHVybiBpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYXNzZXJ0aW9uIHdpdGggY29udHJhZGljdGlvbiBoYW5kbGluZ1xuICAgKi9cbiAgYXN5bmMgYWRkV2l0aENvbnRyYWRpY3Rpb24obmV3QXNzZXJ0aW9uOiBSYXdBc3NlcnRpb24sIGNvbnRyYWRpY3RzOiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgaWQgPSBhd2FpdCB0aGlzLmFkZChuZXdBc3NlcnRpb24pO1xuXG4gICAgLy8gTWFyayBjb250cmFkaWN0ZWQgYXNzZXJ0aW9uc1xuICAgIGZvciAoY29uc3QgY29udHJhZGljdGVkSWQgb2YgY29udHJhZGljdHMpIHtcbiAgICAgIGNvbnN0IGNvbnRyYWRpY3Rpb25LZXkgPSBCdWZmZXIuY29uY2F0KFtcbiAgICAgICAgdGhpcy5wcmVmaXgsXG4gICAgICAgIEJ1ZmZlci5mcm9tKGBjb250cmFkaWN0aW9uOiR7Y29udHJhZGljdGVkSWR9OiR7aWR9YCksXG4gICAgICBdKTtcbiAgICAgIGF3YWl0IHRoaXMuZGIucHV0KGNvbnRyYWRpY3Rpb25LZXksIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgZnJvbTogY29udHJhZGljdGVkSWQsXG4gICAgICAgIHRvOiBpZCxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgfSkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICAvKipcbiAgICogUnVuIGNvbnNvbGlkYXRpb24gdG8gdXBkYXRlIGNhbm9uaWNhbCB2aWV3XG4gICAqL1xuICBhc3luYyBjb25zb2xpZGF0ZSgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IGFzc2VydGlvbnMgPSBhd2FpdCB0aGlzLmdldEFsbEFzc2VydGlvbnMoKTtcbiAgICBjb25zdCBjb250cmFkaWN0aW9ucyA9IGF3YWl0IHRoaXMuZ2V0Q29udHJhZGljdGlvbnMoKTtcbiAgICBcbiAgICAvLyBHcm91cCBhc3NlcnRpb25zIGJ5IHN1YmplY3RcbiAgICBjb25zdCBncm91cHMgPSBuZXcgTWFwPHN0cmluZywgUmF3QXNzZXJ0aW9uW10+KCk7XG4gICAgZm9yIChjb25zdCBhc3NlcnRpb24gb2YgYXNzZXJ0aW9ucykge1xuICAgICAgY29uc3Qgc3ViamVjdCA9IEpTT04uc3RyaW5naWZ5KGFzc2VydGlvbi5mYWN0KTtcbiAgICAgIGNvbnN0IGdyb3VwID0gZ3JvdXBzLmdldChzdWJqZWN0KSB8fCBbXTtcbiAgICAgIGdyb3VwLnB1c2goYXNzZXJ0aW9uKTtcbiAgICAgIGdyb3Vwcy5zZXQoc3ViamVjdCwgZ3JvdXApO1xuICAgIH1cblxuICAgIGxldCB1cGRhdGVkID0gMDtcblxuICAgIC8vIENyZWF0ZSBjYW5vbmljYWwgZmFjdHNcbiAgICBmb3IgKGNvbnN0IFtzdWJqZWN0LCBncm91cF0gb2YgZ3JvdXBzKSB7XG4gICAgICAvLyBTb3J0IGJ5IGNvbmZpZGVuY2UgYW5kIHRpbWVzdGFtcFxuICAgICAgZ3JvdXAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBpZiAoYi5jb25maWRlbmNlICE9PSBhLmNvbmZpZGVuY2UpIHtcbiAgICAgICAgICByZXR1cm4gYi5jb25maWRlbmNlIC0gYS5jb25maWRlbmNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoYi50aW1lc3RhbXAgfHwgMCkgLSAoYS50aW1lc3RhbXAgfHwgMCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gQ2hlY2sgZm9yIGNvbnRyYWRpY3Rpb25zXG4gICAgICBjb25zdCB2YWxpZEFzc2VydGlvbnMgPSBncm91cC5maWx0ZXIoYSA9PiB7XG4gICAgICAgIGNvbnN0IGlzQ29udHJhZGljdGVkID0gY29udHJhZGljdGlvbnMuc29tZShjID0+IGMuZnJvbSA9PT0gYS5pZCk7XG4gICAgICAgIGlmIChpc0NvbnRyYWRpY3RlZCAmJiB0aGlzLmNvbmZpZy51c2VUZW1wb3JhbFVwZGF0ZXMpIHtcbiAgICAgICAgICAvLyBGaW5kIHRoZSBjb250cmFkaWN0aW5nIGFzc2VydGlvblxuICAgICAgICAgIGNvbnN0IGNvbnRyYWRpY3Rpb24gPSBjb250cmFkaWN0aW9ucy5maW5kKGMgPT4gYy5mcm9tID09PSBhLmlkKTtcbiAgICAgICAgICBpZiAoY29udHJhZGljdGlvbikge1xuICAgICAgICAgICAgY29uc3QgYWdlID0gRGF0ZS5ub3coKSAtIChjb250cmFkaWN0aW9uLnRpbWVzdGFtcCB8fCAwKTtcbiAgICAgICAgICAgIHJldHVybiBhZ2UgPiB0aGlzLmNvbmZpZy5tYXhDb25mbGljdEFnZSE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhaXNDb250cmFkaWN0ZWQ7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHZhbGlkQXNzZXJ0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGNhbm9uaWNhbDogQ2Fub25pY2FsRmFjdCA9IHtcbiAgICAgICAgICBpZDogdGhpcy5nZW5lcmF0ZUNhbm9uaWNhbElkKHZhbGlkQXNzZXJ0aW9uc1swXSksXG4gICAgICAgICAgbWVyZ2VkRmFjdDogdmFsaWRBc3NlcnRpb25zWzBdLmZhY3QsXG4gICAgICAgICAgY29uZmlkZW5jZTogdGhpcy5tZXJnZUNvbmZpZGVuY2UodmFsaWRBc3NlcnRpb25zKSxcbiAgICAgICAgICBzb3VyY2VzOiB2YWxpZEFzc2VydGlvbnMubWFwKGEgPT4gYS5zb3VyY2UpLFxuICAgICAgICAgIHZhbGlkRnJvbTogTWF0aC5taW4oLi4udmFsaWRBc3NlcnRpb25zLm1hcChhID0+IGEudGltZXN0YW1wIHx8IDApKSxcbiAgICAgICAgICB2YWxpZFVudGlsOiB1bmRlZmluZWQsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qga2V5ID0gQnVmZmVyLmNvbmNhdChbdGhpcy5wcmVmaXgsIEJ1ZmZlci5mcm9tKGBjYW5vbmljYWw6JHtjYW5vbmljYWwuaWR9YCldKTtcbiAgICAgICAgYXdhaXQgdGhpcy5kYi5wdXQoa2V5LCBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShjYW5vbmljYWwpKSk7XG4gICAgICAgIHVwZGF0ZWQrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2Fub25pY2FsIGZhY3RzXG4gICAqL1xuICBhc3luYyBnZXRDYW5vbmljYWxGYWN0cygpOiBQcm9taXNlPENhbm9uaWNhbEZhY3RbXT4ge1xuICAgIGNvbnN0IGZhY3RzOiBDYW5vbmljYWxGYWN0W10gPSBbXTtcbiAgICBjb25zdCBjYW5vbmljYWxQcmVmaXggPSBCdWZmZXIuY29uY2F0KFt0aGlzLnByZWZpeCwgQnVmZmVyLmZyb20oJ2Nhbm9uaWNhbDonKV0pO1xuXG4gICAgZm9yIGF3YWl0IChjb25zdCBbXywgdmFsdWVdIG9mIHRoaXMuZGIuc2NhblByZWZpeChjYW5vbmljYWxQcmVmaXgpKSB7XG4gICAgICBmYWN0cy5wdXNoKEpTT04ucGFyc2UodmFsdWUudG9TdHJpbmcoKSkpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWN0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBsYWluIHByb3ZlbmFuY2Ugb2YgYSBmYWN0XG4gICAqL1xuICBhc3luYyBleHBsYWluKGZhY3RJZDogc3RyaW5nKTogUHJvbWlzZTx7IGV2aWRlbmNlQ291bnQ6IG51bWJlcjsgc291cmNlczogc3RyaW5nW107IGNvbmZpZGVuY2U6IG51bWJlciB9PiB7XG4gICAgY29uc3Qga2V5ID0gQnVmZmVyLmNvbmNhdChbdGhpcy5wcmVmaXgsIEJ1ZmZlci5mcm9tKGBjYW5vbmljYWw6JHtmYWN0SWR9YCldKTtcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMuZGIuZ2V0KGtleSk7XG4gICAgXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIHsgZXZpZGVuY2VDb3VudDogMCwgc291cmNlczogW10sIGNvbmZpZGVuY2U6IDAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBmYWN0OiBDYW5vbmljYWxGYWN0ID0gSlNPTi5wYXJzZSh2YWx1ZS50b1N0cmluZygpKTtcbiAgICByZXR1cm4ge1xuICAgICAgZXZpZGVuY2VDb3VudDogZmFjdC5zb3VyY2VzLmxlbmd0aCxcbiAgICAgIHNvdXJjZXM6IGZhY3Quc291cmNlcyxcbiAgICAgIGNvbmZpZGVuY2U6IGZhY3QuY29uZmlkZW5jZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgcmF3IGFzc2VydGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0QWxsQXNzZXJ0aW9ucygpOiBQcm9taXNlPFJhd0Fzc2VydGlvbltdPiB7XG4gICAgY29uc3QgYXNzZXJ0aW9uczogUmF3QXNzZXJ0aW9uW10gPSBbXTtcbiAgICBjb25zdCBhc3NlcnRpb25QcmVmaXggPSBCdWZmZXIuY29uY2F0KFt0aGlzLnByZWZpeCwgQnVmZmVyLmZyb20oJ2Fzc2VydGlvbjonKV0pO1xuXG4gICAgZm9yIGF3YWl0IChjb25zdCBbXywgdmFsdWVdIG9mIHRoaXMuZGIuc2NhblByZWZpeChhc3NlcnRpb25QcmVmaXgpKSB7XG4gICAgICBhc3NlcnRpb25zLnB1c2goSlNPTi5wYXJzZSh2YWx1ZS50b1N0cmluZygpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFzc2VydGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBjb250cmFkaWN0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRDb250cmFkaWN0aW9ucygpOiBQcm9taXNlPEFycmF5PHsgZnJvbTogc3RyaW5nOyB0bzogc3RyaW5nOyB0aW1lc3RhbXA6IG51bWJlciB9Pj4ge1xuICAgIGNvbnN0IGNvbnRyYWRpY3Rpb25zOiBBcnJheTx7IGZyb206IHN0cmluZzsgdG86IHN0cmluZzsgdGltZXN0YW1wOiBudW1iZXIgfT4gPSBbXTtcbiAgICBjb25zdCBjb250cmFkaWN0aW9uUHJlZml4ID0gQnVmZmVyLmNvbmNhdChbdGhpcy5wcmVmaXgsIEJ1ZmZlci5mcm9tKCdjb250cmFkaWN0aW9uOicpXSk7XG5cbiAgICBmb3IgYXdhaXQgKGNvbnN0IFtfLCB2YWx1ZV0gb2YgdGhpcy5kYi5zY2FuUHJlZml4KGNvbnRyYWRpY3Rpb25QcmVmaXgpKSB7XG4gICAgICBjb250cmFkaWN0aW9ucy5wdXNoKEpTT04ucGFyc2UodmFsdWUudG9TdHJpbmcoKSkpO1xuICAgIH1cblxuICAgIHJldHVybiBjb250cmFkaWN0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXJnZSBjb25maWRlbmNlIGZyb20gbXVsdGlwbGUgYXNzZXJ0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBtZXJnZUNvbmZpZGVuY2UoYXNzZXJ0aW9uczogUmF3QXNzZXJ0aW9uW10pOiBudW1iZXIge1xuICAgIGlmIChhc3NlcnRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgaWYgKGFzc2VydGlvbnMubGVuZ3RoID09PSAxKSByZXR1cm4gYXNzZXJ0aW9uc1swXS5jb25maWRlbmNlO1xuXG4gICAgLy8gQXZlcmFnZSB3aXRoIHdlaWdodCB0b3dhcmQgaGlnaGVyIGNvbmZpZGVuY2VcbiAgICBjb25zdCBzb3J0ZWQgPSBbLi4uYXNzZXJ0aW9uc10uc29ydCgoYSwgYikgPT4gYi5jb25maWRlbmNlIC0gYS5jb25maWRlbmNlKTtcbiAgICBjb25zdCB3ZWlnaHRzID0gc29ydGVkLm1hcCgoXywgaSkgPT4gMSAvIChpICsgMSkpO1xuICAgIGNvbnN0IHRvdGFsV2VpZ2h0ID0gd2VpZ2h0cy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgICBcbiAgICByZXR1cm4gc29ydGVkLnJlZHVjZSgoYWNjLCBhc3NlcnRpb24sIGkpID0+IHtcbiAgICAgIHJldHVybiBhY2MgKyAoYXNzZXJ0aW9uLmNvbmZpZGVuY2UgKiB3ZWlnaHRzW2ldKSAvIHRvdGFsV2VpZ2h0O1xuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGRldGVybWluaXN0aWMgYXNzZXJ0aW9uIElEXG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlQXNzZXJ0aW9uSWQoYXNzZXJ0aW9uOiBSYXdBc3NlcnRpb24pOiBzdHJpbmcge1xuICAgIHJldHVybiBjcmVhdGVIYXNoKCdzaGEyNTYnKVxuICAgICAgLnVwZGF0ZShKU09OLnN0cmluZ2lmeShhc3NlcnRpb24uZmFjdCkgKyBhc3NlcnRpb24uc291cmNlKVxuICAgICAgLmRpZ2VzdCgnaGV4JylcbiAgICAgIC5zdWJzdHJpbmcoMCwgMTYpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGRldGVybWluaXN0aWMgY2Fub25pY2FsIGZhY3QgSURcbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVDYW5vbmljYWxJZChhc3NlcnRpb246IFJhd0Fzc2VydGlvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNyZWF0ZUhhc2goJ3NoYTI1NicpXG4gICAgICAudXBkYXRlKEpTT04uc3RyaW5naWZ5KGFzc2VydGlvbi5mYWN0KSlcbiAgICAgIC5kaWdlc3QoJ2hleCcpXG4gICAgICAuc3Vic3RyaW5nKDAsIDE2KTtcbiAgfVxufVxuIl19