@nikovirtala/projen-typedoc 0.0.0 → 1.0.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.
- package/.jsii +79 -79
- package/API.md +83 -83
- package/README.md +10 -0
- package/docs/api/assets/search.js +1 -1
- package/docs/api/classes/TypeDoc.html +11 -11
- package/docs/api/enums/CommentStyle.html +3 -3
- package/docs/api/enums/EntryPointStrategy.html +6 -6
- package/docs/api/enums/LogLevel.html +3 -3
- package/docs/api/enums/Visibility.html +3 -3
- package/docs/api/functions/toJson_TypeDocConfiguration.html +1 -1
- package/docs/api/index.html +9 -1
- package/docs/api/interfaces/TypeDocConfiguration.html +94 -94
- package/docs/api/interfaces/TypeDocOptions.html +3 -3
- package/docs/api/interfaces/ValidationOptions.html +5 -5
- package/lib/index.js +3 -2
- package/lib/typedoc-config.d.ts +67 -67
- package/lib/typedoc-config.js +6 -6
- package/package.json +2 -2
- package/typedoc.jsonc +2 -1
- package/.amazonq/rules/standards.md +0 -320
package/lib/typedoc-config.js
CHANGED
|
@@ -42,7 +42,7 @@ function toJson_TypeDocConfiguration(obj) {
|
|
|
42
42
|
packageJson: obj.packageJson,
|
|
43
43
|
gitRevision: obj.gitRevision,
|
|
44
44
|
gitRemote: obj.gitRemote,
|
|
45
|
-
|
|
45
|
+
sourceLinkTemplate: obj.sourceLinkTemplate,
|
|
46
46
|
disableSources: obj.disableSources,
|
|
47
47
|
disableGit: obj.disableGit,
|
|
48
48
|
hideGenerator: obj.hideGenerator,
|
|
@@ -69,7 +69,7 @@ function toJson_TypeDocConfiguration(obj) {
|
|
|
69
69
|
/**
|
|
70
70
|
* Specifies the strategy to be used to convert entry points into documentation
|
|
71
71
|
*
|
|
72
|
-
* @see https://typedoc.org/
|
|
72
|
+
* @see https://typedoc.org/documents/Options.Input.html#entrypointstrategy
|
|
73
73
|
*/
|
|
74
74
|
var EntryPointStrategy;
|
|
75
75
|
(function (EntryPointStrategy) {
|
|
@@ -93,7 +93,7 @@ var EntryPointStrategy;
|
|
|
93
93
|
/**
|
|
94
94
|
* Specifies the logger that should be used
|
|
95
95
|
*
|
|
96
|
-
* @see https://typedoc.org/
|
|
96
|
+
* @see https://typedoc.org/documents/Options.Other.html#loglevel
|
|
97
97
|
*/
|
|
98
98
|
var LogLevel;
|
|
99
99
|
(function (LogLevel) {
|
|
@@ -106,7 +106,7 @@ var LogLevel;
|
|
|
106
106
|
/**
|
|
107
107
|
* Specifies the documentation mode TypeDoc should use
|
|
108
108
|
*
|
|
109
|
-
* @see https://typedoc.org/
|
|
109
|
+
* @see https://typedoc.org/documents/Options.Comments.html#commentstyle
|
|
110
110
|
*/
|
|
111
111
|
var CommentStyle;
|
|
112
112
|
(function (CommentStyle) {
|
|
@@ -118,7 +118,7 @@ var CommentStyle;
|
|
|
118
118
|
/**
|
|
119
119
|
* Specifies the default visibility for members without a visibility tag
|
|
120
120
|
*
|
|
121
|
-
* @see https://typedoc.org/
|
|
121
|
+
* @see https://typedoc.org/documents/Options.Comments.html#defaultvisibility
|
|
122
122
|
*/
|
|
123
123
|
var Visibility;
|
|
124
124
|
(function (Visibility) {
|
|
@@ -126,4 +126,4 @@ var Visibility;
|
|
|
126
126
|
Visibility["PROTECTED"] = "protected";
|
|
127
127
|
Visibility["PRIVATE"] = "private";
|
|
128
128
|
})(Visibility || (exports.Visibility = Visibility = {}));
|
|
129
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWRvYy1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZWRvYy1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBNlVBLGtFQTZEQztBQWpFRDs7O0dBR0c7QUFDSCxTQUFnQiwyQkFBMkIsQ0FDdkMsR0FBcUM7SUFFckMsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDcEIsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUE0QjtRQUNwQyxXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVc7UUFDNUIsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLGtCQUFrQjtRQUMxQyxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU87UUFDcEIsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLGdCQUFnQjtRQUN0QyxjQUFjLEVBQUUsR0FBRyxDQUFDLGNBQWM7UUFDbEMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLGdCQUFnQjtRQUN0QyxlQUFlLEVBQUUsR0FBRyxDQUFDLGVBQWU7UUFDcEMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHO1FBQ1osSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1FBQ2QsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLO1FBQ2hCLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUTtRQUN0QixJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7UUFDZCxjQUFjLEVBQUUsR0FBRyxDQUFDLGNBQWM7UUFDbEMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRO1FBQ3RCLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSztRQUNoQixXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVc7UUFDNUIsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRO1FBQ3RCLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUTtRQUN0QixJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7UUFDZCxlQUFlLEVBQUUsR0FBRyxDQUFDLGVBQWU7UUFDcEMs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ZmlndXJhdGlvblxuICpcbiAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9vcHRpb25zL1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVEb2NDb25maWd1cmF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgdGhlIGVudHJ5IHBvaW50cyB0byBiZSBkb2N1bWVudGVkIGJ5IFR5cGVEb2MuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvb3B0aW9ucy9pbnB1dC8jZW50cnlwb2ludHNcbiAgICAgKi9cbiAgICByZWFkb25seSBlbnRyeVBvaW50cz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSBzdHJhdGVneSB0byBiZSB1c2VkIHRvIGNvbnZlcnQgZW50cnkgcG9pbnRzIGludG8gZG9jdW1lbnRhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9vcHRpb25zL2lucHV0LyNlbnRyeXBvaW50c3RyYXRlZ3lcbiAgICAgKi9cbiAgICByZWFkb25seSBlbnRyeVBvaW50U3RyYXRlZ3k/OiBFbnRyeVBvaW50U3RyYXRlZ3k7XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgcGF0dGVybnMgdG8gYmUgZXhjbHVkZWQgd2hlbiBleHBhbmRpbmcgZGlyZWN0b3JpZXMuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvb3B0aW9ucy9pbnB1dC8jZXhjbHVkZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGV4Y2x1ZGU/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIFByZXZlbnQgZXh0ZXJuYWxseSByZXNvbHZlZCBzeW1ib2xzIGZyb20gYmVpbmcgZG9jdW1lbnRlZC5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9vcHRpb25zL2lucHV0LyNleGNsdWRlZXh0ZXJuYWxzXG4gICAgICovXG4gICAgcmVhZG9ubHkgZXhjbHVkZUV4dGVybmFscz86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBQcmV2ZW50IHByaXZhdGUgbWVtYmVycyBmcm9tIGJlaW5nIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbi5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9vcHRpb25zL2lucHV0LyNleGNsdWRlcHJpdmF0ZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGV4Y2x1ZGVQcml2YXRlPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFByZXZlbnQgcHJvdGVjdGVkIG1lbWJlcnMgZnJvbSBiZWluZyBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24uXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvb3B0aW9ucy9pbnB1dC8jZXhjbHVkZXByb3RlY3RlZFxuICAgICAqL1xuICAgIHJlYWRvbmx5IGV4Y2x1ZGVQcm90ZWN0ZWQ/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogUHJldmVudCBzeW1ib2xzIHRoYXQgYXJlIG5vdCBleHBvcnRlZCBmcm9tIGJlaW5nIGRvY3VtZW50ZWQuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvb3B0aW9ucy9pbnB1dC8jZXhjbHVkZWludGVybmFsXG4gICAgICovXG4gICAgcmVhZG9ubHkgZXhjbHVkZUludGVybmFsPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB0aGUgb3V0cHV0IGRpcmVjdG9yeSB0aGUgZG9jdW1lbnRhdGlvbiBzaG91bGQgYmUgd3JpdHRlbiB0by5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9vcHRpb25zL291dHB1dC8jb3V0XG4gICAgICovXG4gICAgcmVhZG9ubHkgb3V0Pzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgbG9jYXRpb24gdGhlIGRvY3VtZW50YXRpb24gc2hvdWxkIGJlIHdyaXR0ZW4gdG8uXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvb3B0aW9ucy9vdXRwdXQvI2pzb25cbiAgICAgKi9cbiAgICByZWFkb25seSBqc29uPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBhIHRoZW1lIG5hbWUgdG8gdXNlLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL29wdGlvbnMvb3V0cHV0LyN0aGVtZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IHRoZW1lPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgYmFzZSBwYXRoIGZvciBhbGwgdXJscy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9vcHRpb25zL291dHB1dC8jYmFzZXBhdGhcbiAgICAgKi9cbiAgICByZWFkb25seSBiYXNlUGF0aD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgaGVhZGVyIG9mIHRoZSB0ZW1wbGF0ZS5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9vcHRpb25zL291dHB1dC8jbmFtZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBQcmV2ZW50IFR5cGVEb2MgZnJvbSBjbGVhbmluZyB0aGUgb3V0cHV0IGRpcmVjdG9yeSBzcGVjaWZpZWQgd2l0aCAtLW91dC5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9vcHRpb25zL291dHB1dC8jY2xlYW5vdXRwdXRkaXJcbiAgICAgKi9cbiAgICByZWFkb25seSBjbGVhbk91dHB1dERpcj86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHRoZSBsb2NhdGlvbiB0byBsb29rIGZvciBpbmNsdWRlZCBkb2N1bWVudHMuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvb3B0aW9ucy9vdXRwdXQvI2luY2x1ZGVzXG4gICAgICovXG4gICAgcmVhZG9ubHkgaW5jbHVkZXM/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHRoZSBsb2NhdGlvbiB3aXRoIG1lZGlhIGZpbGVzIHRoYXQgc2hvdWxkIGJlIGNvcGllZCB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9vcHRpb25zL291dHB1dC8jbWVkaWFcbiAgICAgKi9cbiAgICByZWFkb25seSBtZWRpYT86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGxvY2F0aW9uIGFuZCBmaWxlbmFtZSBhIC50c2J1aWxkaW5mbyBmaWxlIHNob3VsZCBiZSB3cml0dGVuIHRvLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL29wdGlvbnMvaW5wdXQvI3RzYnVpbGRpbmZvXG4gICAgICovXG4gICAgcmVhZG9ubHkgdHNCdWlsZEluZm8/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IGEgVHlwZVNjcmlwdCBjb25maWcgZmlsZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGxvYWQgVHlwZVNjcmlwdCBjb25maWd1cmF0aW9uLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL29wdGlvbnMvaW5wdXQvI3RzY29uZmlnXG4gICAgICovXG4gICAgcmVhZG9ubHkgdHNjb25maWc/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHRoZSBsb2dnZXIgdGhhdCBzaG91bGQgYmUgdXNlZC5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9vcHRpb25zL290aGVyLyNsb2dsZXZlbFxuICAgICAqL1xuICAgIHJlYWRvbmx5IGxvZ0xldmVsPzogTG9nTGV2ZWw7XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHRoZSBzb3J0IHN0cmF0ZWd5IGZvciBkb2N1bWVudGVkIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9vcHRpb25zL29yZ2FuaXphdGlvbi8jc29ydFxuICAgICAqL1xuICAgIHJlYWRvbmx5IHNvcnQ/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIHNvcnQgc3RyYXRlZ3kgZm9yIHN0YXRpYyBhbmQgaW5zdGFuY2UgbWVtYmVycy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9vcHRpb25zL29yZ2FuaXphdGlvbi8jc29ydGVudHJ5cG9pbnRzXG4gICAgICovXG4gICAgcmVhZG9ubHkgc29ydEVudHJ5UG9pbnRzPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGRvY3VtZW50YXRpb24gbW9kZSBUeXBlRG9jIHNob3VsZCB1c2UuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvb3B0aW9ucy9jb21tZW50cy8jY29tbWVudHN0eWxlXG4gICAgICovXG4gICAgcmVhZG9ubHkgY29tbWVudFN0eWxlPzogQ29tbWVudFN0eWxlO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgZGVmYXVsdCB2aXNpYmlsaXR5IGZvciBtZW1iZXJzIHdpdGhvdXQgYSB2aXNpYmlsaXR5IHRhZy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9vcHRpb25zL2NvbW1lbnRzLyNkZWZhdWx0dmlzaWJpbGl0eVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGRlZmF1bHRWaXNpYmlsaXR5PzogVmlzaWJpbGl0eTtcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGRlZmF1bHQgY2F0ZWdvcnkgZm9yIHJlZmxlY3Rpb25zIHdpdGhvdXQgYSBjYXRlZ29yeS5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9vcHRpb25zL29yZ2FuaXphdGlvbi8jZGVmYXVsdGNhdGVnb3J5XG4gICAgICovXG4gICAgcmVhZG9ubHkgZGVmYXVsdENhdGVnb3J5Pzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgZGVmYXVsdCBncm91cCBmb3IgcmVmbGVjdGlvbnMgd2l0aG91dCBhIGdyb3VwLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL29wdGlvbnMvb3JnYW5pemF0aW9uLyNkZWZhdWx0Z3JvdXBcbiAgICAgKi9cbiAgICByZWFkb25seSBkZWZhdWx0R3JvdXA/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHRoZSBjYXRlZ29yaWVzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGdyb3VwIHJlZmxlY3Rpb25zLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL29wdGlvbnMvb3JnYW5pemF0aW9uLyNjYXRlZ29yaXplYnlncm91cFxuICAgICAqL1xuICAgIHJlYWRvbmx5IGNhdGVnb3JpemVCeUdyb3VwPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIHNlYXJjaCBncm91cCBib29zdHMuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvb3B0aW9ucy9vcmdhbml6YXRpb24vI3NlYXJjaGdyb3VwYm9vc3RzXG4gICAgICovXG4gICAgcmVhZG9ubHkgc2VhcmNoR3JvdXBCb29zdHM/OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+O1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgc2VhcmNoIGNhdGVnb3J5IGJvb3N0cy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9vcHRpb25zL29yZ2FuaXphdGlvbi8jc2VhcmNoY2F0ZWdvcnlib29zdHNcbiAgICAgKi9cbiAgICByZWFkb25seSBzZWFyY2hDYXRlZ29yeUJvb3N0cz86IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHRoZSByZWFkbWUgZmlsZSB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgb24gdGhlIGluZGV4IHBhZ2UuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvb3B0aW9ucy9pbnB1dC8jcmVhZG1lXG4gICAgICovXG4gICAgcmVhZG9ubHkgcmVhZG1lPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgcGFja2FnZS5qc29uIGZpbGUgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHBhY2thZ2UgbmFtZS5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9vcHRpb25zL2lucHV0LyNwYWNrYWdlanNvblxuICAgICAqL1xuICAgIHJlYWRvbmx5IHBhY2thZ2VKc29uPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgZ2l0IHJldmlzaW9uIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gbGluayB0byBzb3VyY2UgZmlsZXMuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvb3B0aW9ucy9jb21tZW50cy8jZ2l0cmV2aXNpb25cbiAgICAgKi9cbiAgICByZWFkb25seSBnaXRSZXZpc2lvbj86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGdpdCByZW1vdGUgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBsaW5rIHRvIHNvdXJjZSBmaWxlcy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9vcHRpb25zL2NvbW1lbnRzLyNnaXRyZW1vdGVcbiAgICAgKi9cbiAgICByZWFkb25seSBnaXRSZW1vdGU/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHRoZSBiYXNlIFVSTCBmb3IgbGlua3MgdG8gc291cmNlIGZpbGVzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL29wdGlvbnMvY29tbWVudHMvI3NvdXJjZXVybHRlbXBsYXRlXG4gICAgICovXG4gICAgcmVhZG9ubHkgc291cmNlVXJsVGVtcGxhdGU/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHRoZSBiYXNlIFVSTCBmb3IgbGlua3MgdG8gc291cmNlIGZpbGVzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL29wdGlvbnMvY29tbWVudHMvI3NvdXJjZXVybHRlbXBsYXRlXG4gICAgICovXG4gICAgcmVhZG9ubHkgZGlzYWJsZVNvdXJjZXM/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgYmFzZSBVUkwgZm9yIGxpbmtzIHRvIHNvdXJjZSBmaWxlcy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9vcHRpb25zL2NvbW1lbnRzLyNzb3VyY2V1cmx0ZW1wbGF0ZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGRpc2FibGVHaXQ/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgYmFzZSBVUkwgZm9yIGxpbmtzIHRvIHNvdXJjZSBmaWxlcy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9vcHRpb25zL2NvbW1lbnRzLyNzb3VyY2V1cmx0ZW1wbGF0ZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGhpZGVHZW5lcmF0b3I/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgYmFzZSBVUkwgZm9yIGxpbmtzIHRvIHNvdXJjZSBmaWxlcy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9vcHRpb25zL2NvbW1lbnRzLyNzb3VyY2V1cmx0ZW1wbGF0ZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGhpZGVQYXJhbWV0ZXJUeXBlc0luVGl0bGU/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgYmFzZSBVUkwgZm9yIGxpbmtzIHRvIHNvdXJjZSBmaWxlcy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9vcHRpb25zL2NvbW1lbnRzLyNzb3VyY2V1cmx0ZW1wbGF0ZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGNhY2hlQnVzdD86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHRoZSBiYXNlIFVSTCBmb3IgbGlua3MgdG8gc291cmNlIGZpbGVzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL29wdGlvbnMvY29tbWVudHMvI3NvdXJjZXVybHRlbXBsYXRlXG4gICAgICovXG4gICAgcmVhZG9ubHkgc2VhcmNoSW5Db21tZW50cz86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHRoZSBiYXNlIFVSTCBmb3IgbGlua3MgdG8gc291cmNlIGZpbGVzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL29wdGlvbnMvY29tbWVudHMvI3NvdXJjZXVybHRlbXBsYXRlXG4gICAgICovXG4gICAgcmVhZG9ubHkgc2VhcmNoSW5Eb2N1bWVudHM/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgYmFzZSBVUkwgZm9yIGxpbmtzIHRvIHNvdXJjZSBmaWxlcy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9vcHRpb25zL2NvbW1lbnRzLyNzb3VyY2V1cmx0ZW1wbGF0ZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IHZhbGlkYXRpb24/OiBWYWxpZGF0aW9uT3B0aW9ucztcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGJhc2UgVVJMIGZvciBsaW5rcyB0byBzb3VyY2UgZmlsZXMuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvb3B0aW9ucy9jb21tZW50cy8jc291cmNldXJsdGVtcGxhdGVcbiAgICAgKi9cbiAgICByZWFkb25seSByZXF1aXJlZFRvQmVEb2N1bWVudGVkPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHRoZSBiYXNlIFVSTCBmb3IgbGlua3MgdG8gc291cmNlIGZpbGVzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL29wdGlvbnMvY29tbWVudHMvI3NvdXJjZXVybHRlbXBsYXRlXG4gICAgICovXG4gICAgcmVhZG9ubHkgdHJlYXRXYXJuaW5nc0FzRXJyb3JzPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGJhc2UgVVJMIGZvciBsaW5rcyB0byBzb3VyY2UgZmlsZXMuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvb3B0aW9ucy9jb21tZW50cy8jc291cmNldXJsdGVtcGxhdGVcbiAgICAgKi9cbiAgICByZWFkb25seSB0cmVhdFZhbGlkYXRpb25XYXJuaW5nc0FzRXJyb3JzPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGJhc2UgVVJMIGZvciBsaW5rcyB0byBzb3VyY2UgZmlsZXMuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvb3B0aW9ucy9jb21tZW50cy8jc291cmNldXJsdGVtcGxhdGVcbiAgICAgKi9cbiAgICByZWFkb25seSBpbnRlbnRpb25hbGx5Tm90RXhwb3J0ZWQ/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGJhc2UgVVJMIGZvciBsaW5rcyB0byBzb3VyY2UgZmlsZXMuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvb3B0aW9ucy9jb21tZW50cy8jc291cmNldXJsdGVtcGxhdGVcbiAgICAgKi9cbiAgICByZWFkb25seSBleHRlcm5hbFBhdHRlcm4/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGJhc2UgVVJMIGZvciBsaW5rcyB0byBzb3VyY2UgZmlsZXMuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvb3B0aW9ucy9jb21tZW50cy8jc291cmNldXJsdGVtcGxhdGVcbiAgICAgKi9cbiAgICByZWFkb25seSBleHRlcm5hbFN5bWJvbExpbmtNYXBwaW5ncz86IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIFR5cGVEb2NDb25maWd1cmF0aW9uIHRvIEpTT04gcmVwcmVzZW50YXRpb25cbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1R5cGVEb2NDb25maWd1cmF0aW9uKFxuICAgIG9iajogVHlwZURvY0NvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQsXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICAgIGVudHJ5UG9pbnRzOiBvYmouZW50cnlQb2ludHMsXG4gICAgICAgIGVudHJ5UG9pbnRTdHJhdGVneTogb2JqLmVudHJ5UG9pbnRTdHJhdGVneSxcbiAgICAgICAgZXhjbHVkZTogb2JqLmV4Y2x1ZGUsXG4gICAgICAgIGV4Y2x1ZGVFeHRlcm5hbHM6IG9iai5leGNsdWRlRXh0ZXJuYWxzLFxuICAgICAgICBleGNsdWRlUHJpdmF0ZTogb2JqLmV4Y2x1ZGVQcml2YXRlLFxuICAgICAgICBleGNsdWRlUHJvdGVjdGVkOiBvYmouZXhjbHVkZVByb3RlY3RlZCxcbiAgICAgICAgZXhjbHVkZUludGVybmFsOiBvYmouZXhjbHVkZUludGVybmFsLFxuICAgICAgICBvdXQ6IG9iai5vdXQsXG4gICAgICAgIGpzb246IG9iai5qc29uLFxuICAgICAgICB0aGVtZTogb2JqLnRoZW1lLFxuICAgICAgICBiYXNlUGF0aDogb2JqLmJhc2VQYXRoLFxuICAgICAgICBuYW1lOiBvYmoubmFtZSxcbiAgICAgICAgY2xlYW5PdXRwdXREaXI6IG9iai5jbGVhbk91dHB1dERpcixcbiAgICAgICAgaW5jbHVkZXM6IG9iai5pbmNsdWRlcyxcbiAgICAgICAgbWVkaWE6IG9iai5tZWRpYSxcbiAgICAgICAgdHNCdWlsZEluZm86IG9iai50c0J1aWxkSW5mbyxcbiAgICAgICAgdHNjb25maWc6IG9iai50c2NvbmZpZyxcbiAgICAgICAgbG9nTGV2ZWw6IG9iai5sb2dMZXZlbCxcbiAgICAgICAgc29ydDogb2JqLnNvcnQsXG4gICAgICAgIHNvcnRFbnRyeVBvaW50czogb2JqLnNvcnRFbnRyeVBvaW50cyxcbiAgICAgICAgY29tbWVudFN0eWxlOiBvYmouY29tbWVudFN0eWxlLFxuICAgICAgICBkZWZhdWx0VmlzaWJpbGl0eTogb2JqLmRlZmF1bHRWaXNpYmlsaXR5LFxuICAgICAgICBkZWZhdWx0Q2F0ZWdvcnk6IG9iai5kZWZhdWx0Q2F0ZWdvcnksXG4gICAgICAgIGRlZmF1bHRHcm91cDogb2JqLmRlZmF1bHRHcm91cCxcbiAgICAgICAgY2F0ZWdvcml6ZUJ5R3JvdXA6IG9iai5jYXRlZ29yaXplQnlHcm91cCxcbiAgICAgICAgc2VhcmNoR3JvdXBCb29zdHM6IG9iai5zZWFyY2hHcm91cEJvb3N0cyxcbiAgICAgICAgc2VhcmNoQ2F0ZWdvcnlCb29zdHM6IG9iai5zZWFyY2hDYXRlZ29yeUJvb3N0cyxcbiAgICAgICAgcmVhZG1lOiBvYmoucmVhZG1lLFxuICAgICAgICBwYWNrYWdlSnNvbjogb2JqLnBhY2thZ2VKc29uLFxuICAgICAgICBnaXRSZXZpc2lvbjogb2JqLmdpdFJldmlzaW9uLFxuICAgICAgICBnaXRSZW1vdGU6IG9iai5naXRSZW1vdGUsXG4gICAgICAgIHNvdXJjZVVybFRlbXBsYXRlOiBvYmouc291cmNlVXJsVGVtcGxhdGUsXG4gICAgICAgIGRpc2FibGVTb3VyY2VzOiBvYmouZGlzYWJsZVNvdXJjZXMsXG4gICAgICAgIGRpc2FibGVHaXQ6IG9iai5kaXNhYmxlR2l0LFxuICAgICAgICBoaWRlR2VuZXJhdG9yOiBvYmouaGlkZUdlbmVyYXRvcixcbiAgICAgICAgaGlkZVBhcmFtZXRlclR5cGVzSW5UaXRsZTogb2JqLmhpZGVQYXJhbWV0ZXJUeXBlc0luVGl0bGUsXG4gICAgICAgIGNhY2hlQnVzdDogb2JqLmNhY2hlQnVzdCxcbiAgICAgICAgc2VhcmNoSW5Db21tZW50czogb2JqLnNlYXJjaEluQ29tbWVudHMsXG4gICAgICAgIHNlYXJjaEluRG9jdW1lbnRzOiBvYmouc2VhcmNoSW5Eb2N1bWVudHMsXG4gICAgICAgIHZhbGlkYXRpb246IG9iai52YWxpZGF0aW9uLFxuICAgICAgICByZXF1aXJlZFRvQmVEb2N1bWVudGVkOiBvYmoucmVxdWlyZWRUb0JlRG9jdW1lbnRlZCxcbiAgICAgICAgdHJlYXRXYXJuaW5nc0FzRXJyb3JzOiBvYmoudHJlYXRXYXJuaW5nc0FzRXJyb3JzLFxuICAgICAgICB0cmVhdFZhbGlkYXRpb25XYXJuaW5nc0FzRXJyb3JzOiBvYmoudHJlYXRWYWxpZGF0aW9uV2FybmluZ3NBc0Vycm9ycyxcbiAgICAgICAgaW50ZW50aW9uYWxseU5vdEV4cG9ydGVkOiBvYmouaW50ZW50aW9uYWxseU5vdEV4cG9ydGVkLFxuICAgICAgICBleHRlcm5hbFBhdHRlcm46IG9iai5leHRlcm5hbFBhdHRlcm4sXG4gICAgICAgIGV4dGVybmFsU3ltYm9sTGlua01hcHBpbmdzOiBvYmouZXh0ZXJuYWxTeW1ib2xMaW5rTWFwcGluZ3MsXG4gICAgfTtcbiAgICBjb25zdCBmaWx0ZXJlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZXN1bHQpKSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmaWx0ZXJlZFtrZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpbHRlcmVkO1xufVxuXG4vKipcbiAqIFNwZWNpZmllcyB0aGUgc3RyYXRlZ3kgdG8gYmUgdXNlZCB0byBjb252ZXJ0IGVudHJ5IHBvaW50cyBpbnRvIGRvY3VtZW50YXRpb25cbiAqXG4gKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvb3B0aW9ucy9pbnB1dC8jZW50cnlwb2ludHN0cmF0ZWd5XG4gKi9cbmV4cG9ydCBlbnVtIEVudHJ5UG9pbnRTdHJhdGVneSB7XG4gICAgLyoqXG4gICAgICogRXhwZWN0cyBhbGwgZW50cnkgcG9pbnRzIHRvIGJlIGNvbnRhaW5lZCB3aXRoaW4gYSBzaW5nbGUgcGFja2FnZVxuICAgICAqL1xuICAgIFJFU09MVkUgPSBcInJlc29sdmVcIixcbiAgICAvKipcbiAgICAgKiBFeHBlY3RzIGFsbCBlbnRyeSBwb2ludHMgdG8gYmUgdG9wLWxldmVsIGRpcmVjdG9yaWVzXG4gICAgICovXG4gICAgRVhQQU5EID0gXCJleHBhbmRcIixcbiAgICAvKipcbiAgICAgKiBFeHBlY3RzIGFsbCBlbnRyeSBwb2ludHMgdG8gYmUgaW5kaXZpZHVhbCBmaWxlc1xuICAgICAqL1xuICAgIFBBQ0tBR0VTID0gXCJwYWNrYWdlc1wiLFxuICAgIC8qKlxuICAgICAqIE1lcmdlcyBtdWx0aXBsZSBwcm9qZWN0cyBpbnRvIGEgc2luZ2xlIGRvY3VtZW50YXRpb24gc2l0ZVxuICAgICAqL1xuICAgIE1FUkdFID0gXCJtZXJnZVwiLFxufVxuXG4vKipcbiAqIFNwZWNpZmllcyB0aGUgbG9nZ2VyIHRoYXQgc2hvdWxkIGJlIHVzZWRcbiAqXG4gKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvb3B0aW9ucy9vdGhlci8jbG9nbGV2ZWxcbiAqL1xuZXhwb3J0IGVudW0gTG9nTGV2ZWwge1xuICAgIFZFUkJPU0UgPSBcIlZlcmJvc2VcIixcbiAgICBJTkZPID0gXCJJbmZvXCIsXG4gICAgV0FSTiA9IFwiV2FyblwiLFxuICAgIEVSUk9SID0gXCJFcnJvclwiLFxuICAgIE5PTkUgPSBcIk5vbmVcIixcbn1cblxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIGRvY3VtZW50YXRpb24gbW9kZSBUeXBlRG9jIHNob3VsZCB1c2VcbiAqXG4gKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvb3B0aW9ucy9jb21tZW50cy8jY29tbWVudHN0eWxlXG4gKi9cbmV4cG9ydCBlbnVtIENvbW1lbnRTdHlsZSB7XG4gICAgSlNET0MgPSBcImpzZG9jXCIsXG4gICAgQkxPQ0sgPSBcImJsb2NrXCIsXG4gICAgTElORSA9IFwibGluZVwiLFxuICAgIEFMTCA9IFwiYWxsXCIsXG59XG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSBkZWZhdWx0IHZpc2liaWxpdHkgZm9yIG1lbWJlcnMgd2l0aG91dCBhIHZpc2liaWxpdHkgdGFnXG4gKlxuICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL29wdGlvbnMvY29tbWVudHMvI2RlZmF1bHR2aXNpYmlsaXR5XG4gKi9cbmV4cG9ydCBlbnVtIFZpc2liaWxpdHkge1xuICAgIFBVQkxJQyA9IFwicHVibGljXCIsXG4gICAgUFJPVEVDVEVEID0gXCJwcm90ZWN0ZWRcIixcbiAgICBQUklWQVRFID0gXCJwcml2YXRlXCIsXG59XG5cbi8qKlxuICogVmFsaWRhdGlvbiBvcHRpb25zXG4gKlxuICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL29wdGlvbnMvdmFsaWRhdGlvbi9cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uT3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCBUeXBlRG9jIHdpbGwgcHJvZHVjZSB3YXJuaW5ncyB3aGVuIGEgc3ltYm9sIGlzIHJlZmVyZW5jZWQgYnkgdGhlIGRvY3VtZW50YXRpb25cbiAgICAgKi9cbiAgICByZWFkb25seSBub3RFeHBvcnRlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCBUeXBlRG9jIHdpbGwgcHJvZHVjZSB3YXJuaW5ncyB3aGVuIGFuIGV4cG9ydGVkIHN5bWJvbCBpcyBub3QgZG9jdW1lbnRlZFxuICAgICAqL1xuICAgIHJlYWRvbmx5IG5vdERvY3VtZW50ZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgVHlwZURvYyB3aWxsIHByb2R1Y2Ugd2FybmluZ3MgYWJvdXQgXFxAbGluayB0YWdzIHdoaWNoIHdpbGwgcHJvZHVjZSBicm9rZW4gbGlua3NcbiAgICAgKi9cbiAgICByZWFkb25seSBpbnZhbGlkTGluaz86IGJvb2xlYW47XG59XG4iXX0=
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWRvYy1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZWRvYy1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBNlVBLGtFQTZEQztBQWpFRDs7O0dBR0c7QUFDSCxTQUFnQiwyQkFBMkIsQ0FDdkMsR0FBcUM7SUFFckMsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDcEIsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUE0QjtRQUNwQyxXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVc7UUFDNUIsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLGtCQUFrQjtRQUMxQyxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU87UUFDcEIsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLGdCQUFnQjtRQUN0QyxjQUFjLEVBQUUsR0FBRyxDQUFDLGNBQWM7UUFDbEMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLGdCQUFnQjtRQUN0QyxlQUFlLEVBQUUsR0FBRyxDQUFDLGVBQWU7UUFDcEMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHO1FBQ1osSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1FBQ2QsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLO1FBQ2hCLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUTtRQUN0QixJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7UUFDZCxjQUFjLEVBQUUsR0FBRyxDQUFDLGNBQWM7UUFDbEMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRO1FBQ3RCLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSztRQUNoQixXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVc7UUFDNUIsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRO1FBQ3RCLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUTtRQUN0QixJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUk7UUFDZCxlQUFlLEVBQUUsR0FBRyxDQUFDLGVBQWU7UUFDcEMs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ZmlndXJhdGlvblxuICpcbiAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9vcHRpb25zL1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVEb2NDb25maWd1cmF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgdGhlIGVudHJ5IHBvaW50cyB0byBiZSBkb2N1bWVudGVkIGJ5IFR5cGVEb2MuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvZG9jdW1lbnRzL09wdGlvbnMuSW5wdXQuaHRtbCNlbnRyeXBvaW50c1xuICAgICAqL1xuICAgIHJlYWRvbmx5IGVudHJ5UG9pbnRzPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgdGhlIHN0cmF0ZWd5IHRvIGJlIHVzZWQgdG8gY29udmVydCBlbnRyeSBwb2ludHMgaW50byBkb2N1bWVudGF0aW9uLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL2RvY3VtZW50cy9PcHRpb25zLklucHV0Lmh0bWwjZW50cnlwb2ludHN0cmF0ZWd5XG4gICAgICovXG4gICAgcmVhZG9ubHkgZW50cnlQb2ludFN0cmF0ZWd5PzogRW50cnlQb2ludFN0cmF0ZWd5O1xuXG4gICAgLyoqXG4gICAgICogRGVmaW5lIHBhdHRlcm5zIHRvIGJlIGV4Y2x1ZGVkIHdoZW4gZXhwYW5kaW5nIGRpcmVjdG9yaWVzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL2RvY3VtZW50cy9PcHRpb25zLklucHV0Lmh0bWwjZXhjbHVkZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGV4Y2x1ZGU/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIFByZXZlbnQgZXh0ZXJuYWxseSByZXNvbHZlZCBzeW1ib2xzIGZyb20gYmVpbmcgZG9jdW1lbnRlZC5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9kb2N1bWVudHMvT3B0aW9ucy5JbnB1dC5odG1sI2V4Y2x1ZGVleHRlcm5hbHNcbiAgICAgKi9cbiAgICByZWFkb25seSBleGNsdWRlRXh0ZXJuYWxzPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFByZXZlbnQgcHJpdmF0ZSBtZW1iZXJzIGZyb20gYmVpbmcgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL2RvY3VtZW50cy9PcHRpb25zLklucHV0Lmh0bWwjZXhjbHVkZXByaXZhdGVcbiAgICAgKi9cbiAgICByZWFkb25seSBleGNsdWRlUHJpdmF0ZT86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBQcmV2ZW50IHByb3RlY3RlZCBtZW1iZXJzIGZyb20gYmVpbmcgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL2RvY3VtZW50cy9PcHRpb25zLklucHV0Lmh0bWwjZXhjbHVkZXByb3RlY3RlZFxuICAgICAqL1xuICAgIHJlYWRvbmx5IGV4Y2x1ZGVQcm90ZWN0ZWQ/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogUHJldmVudCBzeW1ib2xzIHRoYXQgYXJlIG5vdCBleHBvcnRlZCBmcm9tIGJlaW5nIGRvY3VtZW50ZWQuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvZG9jdW1lbnRzL09wdGlvbnMuSW5wdXQuaHRtbCNleGNsdWRlaW50ZXJuYWxcbiAgICAgKi9cbiAgICByZWFkb25seSBleGNsdWRlSW50ZXJuYWw/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSBvdXRwdXQgZGlyZWN0b3J5IHRoZSBkb2N1bWVudGF0aW9uIHNob3VsZCBiZSB3cml0dGVuIHRvLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL2RvY3VtZW50cy9PcHRpb25zLk91dHB1dC5odG1sI291dFxuICAgICAqL1xuICAgIHJlYWRvbmx5IG91dD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGxvY2F0aW9uIHRoZSBkb2N1bWVudGF0aW9uIHNob3VsZCBiZSB3cml0dGVuIHRvLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL2RvY3VtZW50cy9PcHRpb25zLk91dHB1dC5odG1sI2pzb25cbiAgICAgKi9cbiAgICByZWFkb25seSBqc29uPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBhIHRoZW1lIG5hbWUgdG8gdXNlLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL2RvY3VtZW50cy9PcHRpb25zLk91dHB1dC5odG1sI3RoZW1lXG4gICAgICovXG4gICAgcmVhZG9ubHkgdGhlbWU/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHRoZSBiYXNlIHBhdGggZm9yIGFsbCB1cmxzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL2RvY3VtZW50cy9PcHRpb25zLk91dHB1dC5odG1sI2Jhc2VwYXRoXG4gICAgICovXG4gICAgcmVhZG9ubHkgYmFzZVBhdGg/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGhlYWRlciBvZiB0aGUgdGVtcGxhdGUuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvZG9jdW1lbnRzL09wdGlvbnMuT3V0cHV0Lmh0bWwjbmFtZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBQcmV2ZW50IFR5cGVEb2MgZnJvbSBjbGVhbmluZyB0aGUgb3V0cHV0IGRpcmVjdG9yeSBzcGVjaWZpZWQgd2l0aCAtLW91dC5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9kb2N1bWVudHMvT3B0aW9ucy5PdXRwdXQuaHRtbCNjbGVhbm91dHB1dGRpclxuICAgICAqL1xuICAgIHJlYWRvbmx5IGNsZWFuT3V0cHV0RGlyPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGxvY2F0aW9uIHRvIGxvb2sgZm9yIGluY2x1ZGVkIGRvY3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9kb2N1bWVudHMvT3B0aW9ucy5PdXRwdXQuaHRtbCNpbmNsdWRlc1xuICAgICAqL1xuICAgIHJlYWRvbmx5IGluY2x1ZGVzPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgbG9jYXRpb24gd2l0aCBtZWRpYSBmaWxlcyB0aGF0IHNob3VsZCBiZSBjb3BpZWQgdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvZG9jdW1lbnRzL09wdGlvbnMuT3V0cHV0Lmh0bWwjbWVkaWFcbiAgICAgKi9cbiAgICByZWFkb25seSBtZWRpYT86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGxvY2F0aW9uIGFuZCBmaWxlbmFtZSBhIC50c2J1aWxkaW5mbyBmaWxlIHNob3VsZCBiZSB3cml0dGVuIHRvLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL2RvY3VtZW50cy9PcHRpb25zLklucHV0Lmh0bWwjdHNidWlsZGluZm9cbiAgICAgKi9cbiAgICByZWFkb25seSB0c0J1aWxkSW5mbz86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYSBUeXBlU2NyaXB0IGNvbmZpZyBmaWxlIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gbG9hZCBUeXBlU2NyaXB0IGNvbmZpZ3VyYXRpb24uXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvZG9jdW1lbnRzL09wdGlvbnMuSW5wdXQuaHRtbCN0c2NvbmZpZ1xuICAgICAqL1xuICAgIHJlYWRvbmx5IHRzY29uZmlnPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgbG9nZ2VyIHRoYXQgc2hvdWxkIGJlIHVzZWQuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvZG9jdW1lbnRzL09wdGlvbnMuT3RoZXIuaHRtbCNsb2dsZXZlbFxuICAgICAqL1xuICAgIHJlYWRvbmx5IGxvZ0xldmVsPzogTG9nTGV2ZWw7XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHRoZSBzb3J0IHN0cmF0ZWd5IGZvciBkb2N1bWVudGVkIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9kb2N1bWVudHMvT3B0aW9ucy5Pcmdhbml6YXRpb24uaHRtbCNzb3J0XG4gICAgICovXG4gICAgcmVhZG9ubHkgc29ydD86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgc29ydCBzdHJhdGVneSBmb3Igc3RhdGljIGFuZCBpbnN0YW5jZSBtZW1iZXJzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL2RvY3VtZW50cy9PcHRpb25zLk9yZ2FuaXphdGlvbi5odG1sI3NvcnRlbnRyeXBvaW50c1xuICAgICAqL1xuICAgIHJlYWRvbmx5IHNvcnRFbnRyeVBvaW50cz86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHRoZSBkb2N1bWVudGF0aW9uIG1vZGUgVHlwZURvYyBzaG91bGQgdXNlLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL2RvY3VtZW50cy9PcHRpb25zLkNvbW1lbnRzLmh0bWwjY29tbWVudHN0eWxlXG4gICAgICovXG4gICAgcmVhZG9ubHkgY29tbWVudFN0eWxlPzogQ29tbWVudFN0eWxlO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgZGVmYXVsdCB2aXNpYmlsaXR5IGZvciBtZW1iZXJzIHdpdGhvdXQgYSB2aXNpYmlsaXR5IHRhZy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9kb2N1bWVudHMvT3B0aW9ucy5Db21tZW50cy5odG1sI2RlZmF1bHR2aXNpYmlsaXR5XG4gICAgICovXG4gICAgcmVhZG9ubHkgZGVmYXVsdFZpc2liaWxpdHk/OiBWaXNpYmlsaXR5O1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgZGVmYXVsdCBjYXRlZ29yeSBmb3IgcmVmbGVjdGlvbnMgd2l0aG91dCBhIGNhdGVnb3J5LlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL2RvY3VtZW50cy9PcHRpb25zLk9yZ2FuaXphdGlvbi5odG1sI2RlZmF1bHRjYXRlZ29yeVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGRlZmF1bHRDYXRlZ29yeT86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGRlZmF1bHQgZ3JvdXAgZm9yIHJlZmxlY3Rpb25zIHdpdGhvdXQgYSBncm91cC5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9kb2N1bWVudHMvT3B0aW9ucy5Pcmdhbml6YXRpb24uaHRtbCNkZWZhdWx0Z3JvdXBcbiAgICAgKi9cbiAgICByZWFkb25seSBkZWZhdWx0R3JvdXA/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHRoZSBjYXRlZ29yaWVzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGdyb3VwIHJlZmxlY3Rpb25zLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL2RvY3VtZW50cy9PcHRpb25zLk9yZ2FuaXphdGlvbi5odG1sI2NhdGVnb3JpemVieWdyb3VwXG4gICAgICovXG4gICAgcmVhZG9ubHkgY2F0ZWdvcml6ZUJ5R3JvdXA/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgc2VhcmNoIGdyb3VwIGJvb3N0cy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9kb2N1bWVudHMvT3B0aW9ucy5Pcmdhbml6YXRpb24uaHRtbCNzZWFyY2hncm91cGJvb3N0c1xuICAgICAqL1xuICAgIHJlYWRvbmx5IHNlYXJjaEdyb3VwQm9vc3RzPzogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIHNlYXJjaCBjYXRlZ29yeSBib29zdHMuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvZG9jdW1lbnRzL09wdGlvbnMuT3JnYW5pemF0aW9uLmh0bWwjc2VhcmNoY2F0ZWdvcnlib29zdHNcbiAgICAgKi9cbiAgICByZWFkb25seSBzZWFyY2hDYXRlZ29yeUJvb3N0cz86IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHRoZSByZWFkbWUgZmlsZSB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgb24gdGhlIGluZGV4IHBhZ2UuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvZG9jdW1lbnRzL09wdGlvbnMuSW5wdXQuaHRtbCNyZWFkbWVcbiAgICAgKi9cbiAgICByZWFkb25seSByZWFkbWU/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHRoZSBwYWNrYWdlLmpzb24gZmlsZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgcGFja2FnZSBuYW1lLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL2RvY3VtZW50cy9PcHRpb25zLklucHV0Lmh0bWwjcGFja2FnZWpzb25cbiAgICAgKi9cbiAgICByZWFkb25seSBwYWNrYWdlSnNvbj86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGdpdCByZXZpc2lvbiB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGxpbmsgdG8gc291cmNlIGZpbGVzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL2RvY3VtZW50cy9PcHRpb25zLkNvbW1lbnRzLmh0bWwjZ2l0cmV2aXNpb25cbiAgICAgKi9cbiAgICByZWFkb25seSBnaXRSZXZpc2lvbj86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGdpdCByZW1vdGUgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBsaW5rIHRvIHNvdXJjZSBmaWxlcy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9kb2N1bWVudHMvT3B0aW9ucy5Db21tZW50cy5odG1sI2dpdHJlbW90ZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGdpdFJlbW90ZT86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYSBsaW5rIHRlbXBsYXRlIHRvIGJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHNvdXJjZSB1cmxzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL2RvY3VtZW50cy9PcHRpb25zLklucHV0Lmh0bWwjc291cmNlbGlua3RlbXBsYXRlXG4gICAgICovXG4gICAgcmVhZG9ubHkgc291cmNlTGlua1RlbXBsYXRlPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZXMgYXV0b21hdGljYWxseSBsaW5raW5nIHRvIHNvdXJjZSBjb2RlLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL2RvY3VtZW50cy9PcHRpb25zLkNvbW1lbnRzLmh0bWwjZGlzYWJsZXNvdXJjZXNcbiAgICAgKi9cbiAgICByZWFkb25seSBkaXNhYmxlU291cmNlcz86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyBzZXR0aW5nIHRoZSBzb3VyY2Ugb2YgcmVmbGVjdGlvbnMgd2hlbiBkb2N1bWVudGluZyBwcm9qZWN0cyB3aXRoaW4gYSBHaXQgcmVwb3NpdG9yeS5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9kb2N1bWVudHMvT3B0aW9ucy5Db21tZW50cy5odG1sI2Rpc2FibGVnaXRcbiAgICAgKi9cbiAgICByZWFkb25seSBkaXNhYmxlR2l0PzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIERvIG5vdCBwcmludCB0aGUgVHlwZURvYyBsaW5rIGF0IHRoZSBlbmQgb2YgdGhlIHBhZ2UuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvZG9jdW1lbnRzL09wdGlvbnMuT3V0cHV0Lmh0bWwjaGlkZWdlbmVyYXRvclxuICAgICAqL1xuICAgIHJlYWRvbmx5IGhpZGVHZW5lcmF0b3I/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogSGlkZSBwYXJhbWV0ZXIgdHlwZXMgaW4gdGhlIHNpZ25hdHVyZS5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9kb2N1bWVudHMvT3B0aW9ucy5PdXRwdXQuaHRtbCNoaWRlcGFyYW1ldGVydHlwZXNpbnRpdGxlXG4gICAgICovXG4gICAgcmVhZG9ubHkgaGlkZVBhcmFtZXRlclR5cGVzSW5UaXRsZT86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBJbmNsdWRlIHRoZSBnZW5lcmF0aW9uIHRpbWUgaW4gbGlua3MgdG8gcHJldmVudCBicm93c2VycyBmcm9tIHVzaW5nIGEgY2FjaGVkIHZlcnNpb24uXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvZG9jdW1lbnRzL09wdGlvbnMuT3V0cHV0Lmh0bWwjY2FjaGVidXN0XG4gICAgICovXG4gICAgcmVhZG9ubHkgY2FjaGVCdXN0PzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIElmIHNldCwgdGhlIHNlYXJjaCBpbmRleCB3aWxsIGFsc28gaW5jbHVkZSBjb21tZW50cy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9kb2N1bWVudHMvT3B0aW9ucy5PdXRwdXQuaHRtbCNzZWFyY2hpbmNvbW1lbnRzXG4gICAgICovXG4gICAgcmVhZG9ubHkgc2VhcmNoSW5Db21tZW50cz86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBJZiBzZXQsIHRoZSBzZWFyY2ggaW5kZXggd2lsbCBhbHNvIGluY2x1ZGUgZG9jdW1lbnRzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL2RvY3VtZW50cy9PcHRpb25zLk91dHB1dC5odG1sI3NlYXJjaGluZG9jdW1lbnRzXG4gICAgICovXG4gICAgcmVhZG9ubHkgc2VhcmNoSW5Eb2N1bWVudHM/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB2YWxpZGF0aW9uIG9wdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvZG9jdW1lbnRzL09wdGlvbnMuVmFsaWRhdGlvbi5odG1sXG4gICAgICovXG4gICAgcmVhZG9ubHkgdmFsaWRhdGlvbj86IFZhbGlkYXRpb25PcHRpb25zO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgdHlwZSBvZiByZWZsZWN0aW9ucyB0aGF0IG11c3QgYmUgZG9jdW1lbnRlZC5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9kb2N1bWVudHMvT3B0aW9ucy5WYWxpZGF0aW9uLmh0bWwjcmVxdWlyZWR0b2JlZG9jdW1lbnRlZFxuICAgICAqL1xuICAgIHJlYWRvbmx5IHJlcXVpcmVkVG9CZURvY3VtZW50ZWQ/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIElmIHNldCwgd2FybmluZ3Mgd2lsbCBiZSB0cmVhdGVkIGFzIGVycm9ycy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9kb2N1bWVudHMvT3B0aW9ucy5WYWxpZGF0aW9uLmh0bWwjdHJlYXR3YXJuaW5nc2FzZXJyb3JzXG4gICAgICovXG4gICAgcmVhZG9ubHkgdHJlYXRXYXJuaW5nc0FzRXJyb3JzPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIElmIHNldCwgdmFsaWRhdGlvbiB3YXJuaW5ncyB3aWxsIGJlIHRyZWF0ZWQgYXMgZXJyb3JzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL2RvY3VtZW50cy9PcHRpb25zLlZhbGlkYXRpb24uaHRtbCN0cmVhdHZhbGlkYXRpb253YXJuaW5nc2FzZXJyb3JzXG4gICAgICovXG4gICAgcmVhZG9ubHkgdHJlYXRWYWxpZGF0aW9uV2FybmluZ3NBc0Vycm9ycz86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgdHlwZXMgdGhhdCBzaG91bGQgbm90IHByb2R1Y2Ugd2FybmluZ3Mgd2hlbiBub3QgYmVpbmcgZXhwb3J0ZWQuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvZG9jdW1lbnRzL09wdGlvbnMuVmFsaWRhdGlvbi5odG1sI2ludGVudGlvbmFsbHlub3RleHBvcnRlZFxuICAgICAqL1xuICAgIHJlYWRvbmx5IGludGVudGlvbmFsbHlOb3RFeHBvcnRlZD86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogRGVmaW5lIHBhdHRlcm5zIGZvciBmaWxlcyB0aGF0IHNob3VsZCBiZSBjb25zaWRlcmVkIGV4dGVybmFsLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL2RvY3VtZW50cy9PcHRpb25zLklucHV0Lmh0bWwjZXh0ZXJuYWxwYXR0ZXJuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZXh0ZXJuYWxQYXR0ZXJuPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgY3VzdG9tIG1hcHBpbmdzIGZvciBzeW1ib2xzIGluIGV4dGVybmFsIHBhY2thZ2VzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL2RvY3VtZW50cy9PcHRpb25zLkNvbW1lbnRzLmh0bWwjZXh0ZXJuYWxzeW1ib2xsaW5rbWFwcGluZ3NcbiAgICAgKi9cbiAgICByZWFkb25seSBleHRlcm5hbFN5bWJvbExpbmtNYXBwaW5ncz86IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIFR5cGVEb2NDb25maWd1cmF0aW9uIHRvIEpTT04gcmVwcmVzZW50YXRpb25cbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Kc29uX1R5cGVEb2NDb25maWd1cmF0aW9uKFxuICAgIG9iajogVHlwZURvY0NvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQsXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKG9iaiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICAgIGVudHJ5UG9pbnRzOiBvYmouZW50cnlQb2ludHMsXG4gICAgICAgIGVudHJ5UG9pbnRTdHJhdGVneTogb2JqLmVudHJ5UG9pbnRTdHJhdGVneSxcbiAgICAgICAgZXhjbHVkZTogb2JqLmV4Y2x1ZGUsXG4gICAgICAgIGV4Y2x1ZGVFeHRlcm5hbHM6IG9iai5leGNsdWRlRXh0ZXJuYWxzLFxuICAgICAgICBleGNsdWRlUHJpdmF0ZTogb2JqLmV4Y2x1ZGVQcml2YXRlLFxuICAgICAgICBleGNsdWRlUHJvdGVjdGVkOiBvYmouZXhjbHVkZVByb3RlY3RlZCxcbiAgICAgICAgZXhjbHVkZUludGVybmFsOiBvYmouZXhjbHVkZUludGVybmFsLFxuICAgICAgICBvdXQ6IG9iai5vdXQsXG4gICAgICAgIGpzb246IG9iai5qc29uLFxuICAgICAgICB0aGVtZTogb2JqLnRoZW1lLFxuICAgICAgICBiYXNlUGF0aDogb2JqLmJhc2VQYXRoLFxuICAgICAgICBuYW1lOiBvYmoubmFtZSxcbiAgICAgICAgY2xlYW5PdXRwdXREaXI6IG9iai5jbGVhbk91dHB1dERpcixcbiAgICAgICAgaW5jbHVkZXM6IG9iai5pbmNsdWRlcyxcbiAgICAgICAgbWVkaWE6IG9iai5tZWRpYSxcbiAgICAgICAgdHNCdWlsZEluZm86IG9iai50c0J1aWxkSW5mbyxcbiAgICAgICAgdHNjb25maWc6IG9iai50c2NvbmZpZyxcbiAgICAgICAgbG9nTGV2ZWw6IG9iai5sb2dMZXZlbCxcbiAgICAgICAgc29ydDogb2JqLnNvcnQsXG4gICAgICAgIHNvcnRFbnRyeVBvaW50czogb2JqLnNvcnRFbnRyeVBvaW50cyxcbiAgICAgICAgY29tbWVudFN0eWxlOiBvYmouY29tbWVudFN0eWxlLFxuICAgICAgICBkZWZhdWx0VmlzaWJpbGl0eTogb2JqLmRlZmF1bHRWaXNpYmlsaXR5LFxuICAgICAgICBkZWZhdWx0Q2F0ZWdvcnk6IG9iai5kZWZhdWx0Q2F0ZWdvcnksXG4gICAgICAgIGRlZmF1bHRHcm91cDogb2JqLmRlZmF1bHRHcm91cCxcbiAgICAgICAgY2F0ZWdvcml6ZUJ5R3JvdXA6IG9iai5jYXRlZ29yaXplQnlHcm91cCxcbiAgICAgICAgc2VhcmNoR3JvdXBCb29zdHM6IG9iai5zZWFyY2hHcm91cEJvb3N0cyxcbiAgICAgICAgc2VhcmNoQ2F0ZWdvcnlCb29zdHM6IG9iai5zZWFyY2hDYXRlZ29yeUJvb3N0cyxcbiAgICAgICAgcmVhZG1lOiBvYmoucmVhZG1lLFxuICAgICAgICBwYWNrYWdlSnNvbjogb2JqLnBhY2thZ2VKc29uLFxuICAgICAgICBnaXRSZXZpc2lvbjogb2JqLmdpdFJldmlzaW9uLFxuICAgICAgICBnaXRSZW1vdGU6IG9iai5naXRSZW1vdGUsXG4gICAgICAgIHNvdXJjZUxpbmtUZW1wbGF0ZTogb2JqLnNvdXJjZUxpbmtUZW1wbGF0ZSxcbiAgICAgICAgZGlzYWJsZVNvdXJjZXM6IG9iai5kaXNhYmxlU291cmNlcyxcbiAgICAgICAgZGlzYWJsZUdpdDogb2JqLmRpc2FibGVHaXQsXG4gICAgICAgIGhpZGVHZW5lcmF0b3I6IG9iai5oaWRlR2VuZXJhdG9yLFxuICAgICAgICBoaWRlUGFyYW1ldGVyVHlwZXNJblRpdGxlOiBvYmouaGlkZVBhcmFtZXRlclR5cGVzSW5UaXRsZSxcbiAgICAgICAgY2FjaGVCdXN0OiBvYmouY2FjaGVCdXN0LFxuICAgICAgICBzZWFyY2hJbkNvbW1lbnRzOiBvYmouc2VhcmNoSW5Db21tZW50cyxcbiAgICAgICAgc2VhcmNoSW5Eb2N1bWVudHM6IG9iai5zZWFyY2hJbkRvY3VtZW50cyxcbiAgICAgICAgdmFsaWRhdGlvbjogb2JqLnZhbGlkYXRpb24sXG4gICAgICAgIHJlcXVpcmVkVG9CZURvY3VtZW50ZWQ6IG9iai5yZXF1aXJlZFRvQmVEb2N1bWVudGVkLFxuICAgICAgICB0cmVhdFdhcm5pbmdzQXNFcnJvcnM6IG9iai50cmVhdFdhcm5pbmdzQXNFcnJvcnMsXG4gICAgICAgIHRyZWF0VmFsaWRhdGlvbldhcm5pbmdzQXNFcnJvcnM6IG9iai50cmVhdFZhbGlkYXRpb25XYXJuaW5nc0FzRXJyb3JzLFxuICAgICAgICBpbnRlbnRpb25hbGx5Tm90RXhwb3J0ZWQ6IG9iai5pbnRlbnRpb25hbGx5Tm90RXhwb3J0ZWQsXG4gICAgICAgIGV4dGVybmFsUGF0dGVybjogb2JqLmV4dGVybmFsUGF0dGVybixcbiAgICAgICAgZXh0ZXJuYWxTeW1ib2xMaW5rTWFwcGluZ3M6IG9iai5leHRlcm5hbFN5bWJvbExpbmtNYXBwaW5ncyxcbiAgICB9O1xuICAgIGNvbnN0IGZpbHRlcmVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlc3VsdCkpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZpbHRlcmVkW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmlsdGVyZWQ7XG59XG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSBzdHJhdGVneSB0byBiZSB1c2VkIHRvIGNvbnZlcnQgZW50cnkgcG9pbnRzIGludG8gZG9jdW1lbnRhdGlvblxuICpcbiAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9kb2N1bWVudHMvT3B0aW9ucy5JbnB1dC5odG1sI2VudHJ5cG9pbnRzdHJhdGVneVxuICovXG5leHBvcnQgZW51bSBFbnRyeVBvaW50U3RyYXRlZ3kge1xuICAgIC8qKlxuICAgICAqIEV4cGVjdHMgYWxsIGVudHJ5IHBvaW50cyB0byBiZSBjb250YWluZWQgd2l0aGluIGEgc2luZ2xlIHBhY2thZ2VcbiAgICAgKi9cbiAgICBSRVNPTFZFID0gXCJyZXNvbHZlXCIsXG4gICAgLyoqXG4gICAgICogRXhwZWN0cyBhbGwgZW50cnkgcG9pbnRzIHRvIGJlIHRvcC1sZXZlbCBkaXJlY3Rvcmllc1xuICAgICAqL1xuICAgIEVYUEFORCA9IFwiZXhwYW5kXCIsXG4gICAgLyoqXG4gICAgICogRXhwZWN0cyBhbGwgZW50cnkgcG9pbnRzIHRvIGJlIGluZGl2aWR1YWwgZmlsZXNcbiAgICAgKi9cbiAgICBQQUNLQUdFUyA9IFwicGFja2FnZXNcIixcbiAgICAvKipcbiAgICAgKiBNZXJnZXMgbXVsdGlwbGUgcHJvamVjdHMgaW50byBhIHNpbmdsZSBkb2N1bWVudGF0aW9uIHNpdGVcbiAgICAgKi9cbiAgICBNRVJHRSA9IFwibWVyZ2VcIixcbn1cblxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIGxvZ2dlciB0aGF0IHNob3VsZCBiZSB1c2VkXG4gKlxuICogQHNlZSBodHRwczovL3R5cGVkb2Mub3JnL2RvY3VtZW50cy9PcHRpb25zLk90aGVyLmh0bWwjbG9nbGV2ZWxcbiAqL1xuZXhwb3J0IGVudW0gTG9nTGV2ZWwge1xuICAgIFZFUkJPU0UgPSBcIlZlcmJvc2VcIixcbiAgICBJTkZPID0gXCJJbmZvXCIsXG4gICAgV0FSTiA9IFwiV2FyblwiLFxuICAgIEVSUk9SID0gXCJFcnJvclwiLFxuICAgIE5PTkUgPSBcIk5vbmVcIixcbn1cblxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIGRvY3VtZW50YXRpb24gbW9kZSBUeXBlRG9jIHNob3VsZCB1c2VcbiAqXG4gKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvZG9jdW1lbnRzL09wdGlvbnMuQ29tbWVudHMuaHRtbCNjb21tZW50c3R5bGVcbiAqL1xuZXhwb3J0IGVudW0gQ29tbWVudFN0eWxlIHtcbiAgICBKU0RPQyA9IFwianNkb2NcIixcbiAgICBCTE9DSyA9IFwiYmxvY2tcIixcbiAgICBMSU5FID0gXCJsaW5lXCIsXG4gICAgQUxMID0gXCJhbGxcIixcbn1cblxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIGRlZmF1bHQgdmlzaWJpbGl0eSBmb3IgbWVtYmVycyB3aXRob3V0IGEgdmlzaWJpbGl0eSB0YWdcbiAqXG4gKiBAc2VlIGh0dHBzOi8vdHlwZWRvYy5vcmcvZG9jdW1lbnRzL09wdGlvbnMuQ29tbWVudHMuaHRtbCNkZWZhdWx0dmlzaWJpbGl0eVxuICovXG5leHBvcnQgZW51bSBWaXNpYmlsaXR5IHtcbiAgICBQVUJMSUMgPSBcInB1YmxpY1wiLFxuICAgIFBST1RFQ1RFRCA9IFwicHJvdGVjdGVkXCIsXG4gICAgUFJJVkFURSA9IFwicHJpdmF0ZVwiLFxufVxuXG4vKipcbiAqIFZhbGlkYXRpb24gb3B0aW9uc1xuICpcbiAqIEBzZWUgaHR0cHM6Ly90eXBlZG9jLm9yZy9kb2N1bWVudHMvT3B0aW9ucy5WYWxpZGF0aW9uLmh0bWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uT3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCBUeXBlRG9jIHdpbGwgcHJvZHVjZSB3YXJuaW5ncyB3aGVuIGEgc3ltYm9sIGlzIHJlZmVyZW5jZWQgYnkgdGhlIGRvY3VtZW50YXRpb25cbiAgICAgKi9cbiAgICByZWFkb25seSBub3RFeHBvcnRlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCBUeXBlRG9jIHdpbGwgcHJvZHVjZSB3YXJuaW5ncyB3aGVuIGFuIGV4cG9ydGVkIHN5bWJvbCBpcyBub3QgZG9jdW1lbnRlZFxuICAgICAqL1xuICAgIHJlYWRvbmx5IG5vdERvY3VtZW50ZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIElmIHNldCwgVHlwZURvYyB3aWxsIHByb2R1Y2Ugd2FybmluZ3MgYWJvdXQgXFxAbGluayB0YWdzIHdoaWNoIHdpbGwgcHJvZHVjZSBicm9rZW4gbGlua3NcbiAgICAgKi9cbiAgICByZWFkb25seSBpbnZhbGlkTGluaz86IGJvb2xlYW47XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"@types/node": "^22",
|
|
17
17
|
"@vitest/coverage-v8": "^4",
|
|
18
18
|
"commit-and-tag-version": "^12",
|
|
19
|
-
"constructs": "^10.
|
|
19
|
+
"constructs": "^10.4.3",
|
|
20
20
|
"jsii": "~5.9.3",
|
|
21
21
|
"jsii-diff": "^1.118.0",
|
|
22
22
|
"jsii-docgen": "^10.5.0",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"publishConfig": {
|
|
44
44
|
"access": "public"
|
|
45
45
|
},
|
|
46
|
-
"version": "
|
|
46
|
+
"version": "1.0.1",
|
|
47
47
|
"types": "lib/index.d.ts",
|
|
48
48
|
"stability": "stable",
|
|
49
49
|
"jsii": {
|
package/typedoc.jsonc
CHANGED
|
@@ -1,320 +0,0 @@
|
|
|
1
|
-
# Business domain
|
|
2
|
-
|
|
3
|
-
We operate in the retail business, offering services across:
|
|
4
|
-
|
|
5
|
-
- supermarket trade
|
|
6
|
-
- department store trade
|
|
7
|
-
- specialty store trade
|
|
8
|
-
|
|
9
|
-
All code examples, domain modeling, and ubiquitous language should reflect retail business concepts (products, assortments, customers, orders, pricing, promotions, etc.).
|
|
10
|
-
|
|
11
|
-
# Design philosophy
|
|
12
|
-
|
|
13
|
-
- Favor simplicity over cleverness. Use the simplest solution that solves the core problem. Avoid premature optimization and unnecessary abstractions.
|
|
14
|
-
- Apply Domain-Driven Design with Hexagonal Architecture. Organize code by bounded contexts with a clear separation between domain logic (core), application services (ports), and infrastructure adapters. The domain layer must not depend on external concerns.
|
|
15
|
-
|
|
16
|
-
# Domain-Driven Design and Hexagonal Architecture
|
|
17
|
-
|
|
18
|
-
- Structure code by bounded contexts. Each context is independently deployable with its own domain model, application layer, and adapters.
|
|
19
|
-
- Keep domain logic pure. Domain entities, value objects, and aggregates must not import infrastructure code (AWS SDK, database clients, external APIs).
|
|
20
|
-
- Define ports as interfaces in the application layer. Implement adapters in the infrastructure layer (DynamoDB repositories, event publishers, Lambda function handlers).
|
|
21
|
-
- Use ubiquitous language from the business domain in all code, tests, and documentation. Avoid technical jargon in domain layer naming.
|
|
22
|
-
- Communicate between bounded contexts exclusively through domain events. Never share domain models or databases across contexts.
|
|
23
|
-
- Use Anti-Corruption Layer (ACL) adapters when integrating with external systems or legacy services. The ACL translates external models and protocols into your bounded context's domain language, preventing external concepts from polluting your domain model.
|
|
24
|
-
- Cache raw external data before ACL transformation. Store the original payload from external systems (APIs, message queues, webhooks) in DynamoDB with a TTL before processing through the ACL. This enables replay and reprocessing if bugs are discovered in the ACL or business logic, without depending on external system retention policies or availability. Use key pattern: `pk: "RAW#<source>#<id>"`, `sk: "RAW#<timestamp>"`. For financial data, set TTL to 6 years to meet regulatory retention requirements. Use DynamoDB Standard-IA storage class for raw data to optimize costs.
|
|
25
|
-
|
|
26
|
-
# Architecture
|
|
27
|
-
|
|
28
|
-
- Default to event-driven architecture. Use events for bounded context communication.
|
|
29
|
-
- Use AWS serverless architecture (Lambda, API Gateway, DynamoDB, EventBridge, etc.).
|
|
30
|
-
- Use AWS CDK (TypeScript) for infrastructure as code.
|
|
31
|
-
- Kafka is hosted on Confluent Cloud.
|
|
32
|
-
|
|
33
|
-
# Project structure
|
|
34
|
-
|
|
35
|
-
Each bounded context is a separate git repository organized by hexagonal layers under `src/`:
|
|
36
|
-
|
|
37
|
-
- `src/domain/` - Entities, value objects, aggregates, domain events (pure TypeScript, no external dependencies)
|
|
38
|
-
- `src/application/` - Use cases and port interfaces (depends only on domain)
|
|
39
|
-
- `src/infrastructure/` - Adapters: repositories, event publishers, Lambda function handlers, Zod schemas (implements ports)
|
|
40
|
-
- `src/stacks/` - CDK stack definitions
|
|
41
|
-
- `src/constructs/` - Reusable CDK constructs
|
|
42
|
-
- `src/` - CDK app entry point
|
|
43
|
-
|
|
44
|
-
# Documents
|
|
45
|
-
|
|
46
|
-
- Write all documents in Markdown format.
|
|
47
|
-
- Use sentence case for all document headings (capitalize only the first word and proper nouns).
|
|
48
|
-
- Design documents must include relevant Mermaid visualizations: logical architecture diagrams, process flowcharts, ER models, or sequence diagrams.
|
|
49
|
-
|
|
50
|
-
# Code documentation
|
|
51
|
-
|
|
52
|
-
- Use TSDoc for all code documentation. Include appropriate TSDoc tags (@param, @returns, @throws, @example, @deprecated, etc.) to fully describe the API contract.
|
|
53
|
-
- Document all interface properties and enum members with TSDoc comments. Every property and enum value must have a description explaining its purpose and constraints.
|
|
54
|
-
- Include reference links to AWS service documentation when documenting code that uses AWS services. Use @see tag with the relevant docs.aws.amazon.com URL.
|
|
55
|
-
- Add extensive inline documentation throughout business logic and utility code using block comments (`/* */`) to document:
|
|
56
|
-
- The "what": What the code is doing and why it exists
|
|
57
|
-
- The "why": Business rules, assumptions, constraints, and reasoning behind implementation decisions
|
|
58
|
-
- Focus on intent and context, not just mechanics
|
|
59
|
-
- Avoid single-line (`//`) comments for documentation.
|
|
60
|
-
|
|
61
|
-
# Coding standards
|
|
62
|
-
|
|
63
|
-
- Use latest TypeScript and Node.js LTS versions.
|
|
64
|
-
- Use TypeScript with ES modules.
|
|
65
|
-
- Use descriptive names; avoid single-letter variables except in loops.
|
|
66
|
-
- Do not expose implementation details in business-facing names. Use domain language for entities, events, use cases, AWS resources, and API endpoints. Reserve technical terms (like "bitemporal", "CQRS", "event-sourced") for infrastructure code, internal documentation, and reusable generic components.
|
|
67
|
-
- Do not use any type. Use specific types or unknown instead.
|
|
68
|
-
- Avoid type assertions (`as` keyword). Use Zod for runtime validation and type inference when handling external data. Use type guards for narrowing types when runtime checks are needed.
|
|
69
|
-
- Use Zod schemas in infrastructure adapters for runtime validation of external data (API requests, database records, event payloads). Keep domain types as pure TypeScript interfaces without runtime validation dependencies.
|
|
70
|
-
- Use JSON format for all logging output.
|
|
71
|
-
- Avoid `forEach()`. Use `for...of` for iteration with async/await or control flow, or use functional methods like `map()`, `filter()`, and `reduce()` for transformations.
|
|
72
|
-
- Use async/await syntax, including top-level await. Parallelize independent operations with `Promise.all()` or `Promise.allSettled()`.
|
|
73
|
-
- Prefer immutable data. Use `const` and avoid mutating objects or arrays.
|
|
74
|
-
- Do not use Express or other traditional web frameworks. Use AWS serverless services (API Gateway, Lambda) for HTTP APIs.
|
|
75
|
-
- Use nullish coalescing.
|
|
76
|
-
- Use satisfies for object literals.
|
|
77
|
-
|
|
78
|
-
# Data structures
|
|
79
|
-
|
|
80
|
-
- Use ISO 8601 format for timestamps in data structures to enable lexicographic sorting. Include at least millisecond precision and timezone offset (e.g., `2025-10-30T09:10:51.312+02:00`). Prefer Europe/Helsinki timezone when generating timestamps.
|
|
81
|
-
- Use lowerCamelCase for all data structure attribute/property names.
|
|
82
|
-
- Use PascalCase for classes and interfaces.
|
|
83
|
-
- Use UPPER_SNAKE_CASE for constants.
|
|
84
|
-
|
|
85
|
-
# DynamoDB
|
|
86
|
-
|
|
87
|
-
- Each bounded context owns a single DynamoDB table with overloaded `pk`/`sk` keys and GSIs for its access patterns. Use multi-table design within a context only when tables have fundamentally different characteristics (e.g., one table with append-only writes and another with mutable writes).
|
|
88
|
-
- Use lowercase for DynamoDB key attribute names. Default keys: partition key `pk` (string), sort key `sk` (string). GSI keys follow the pattern `gsi1pk`, `gsi1sk`, `gsi2pk`, `gsi2sk`, etc.
|
|
89
|
-
- Use DynamoDB `DynamoDBDocumentClient` from `@aws-sdk/lib-dynamodb`.
|
|
90
|
-
- Use DynamoDB Streams for event-driven patterns.
|
|
91
|
-
- Enable bisect on function error for DynamoDB Stream event sources.
|
|
92
|
-
- Design DynamoDB access patterns to use Query operations (avoid Scan).
|
|
93
|
-
- Use DynamoDB transactions (`transactWrite` and `transactGet`) for atomic operations across multiple items. Always include condition expressions to verify that source data hasn't changed since it was read.
|
|
94
|
-
|
|
95
|
-
# AWS SDK
|
|
96
|
-
|
|
97
|
-
- Use latest major version of the AWS SDK for JavaScript.
|
|
98
|
-
|
|
99
|
-
# AWS CDK project management
|
|
100
|
-
|
|
101
|
-
- Check if the project uses Projen (.projenrc.ts or .projenrc.js). If Projen is configured, use it for all project configuration and dependency management.
|
|
102
|
-
- Do not manually edit package.json, tsconfig.json, or other generated files in Projen projects.
|
|
103
|
-
|
|
104
|
-
# AWS CDK imports
|
|
105
|
-
|
|
106
|
-
- Import AWS service constructs from the main `aws-cdk-lib` package using named imports with underscore notation.
|
|
107
|
-
- Do not use namespace imports from service-specific subpaths.
|
|
108
|
-
|
|
109
|
-
**Correct:**
|
|
110
|
-
|
|
111
|
-
```typescript
|
|
112
|
-
import { aws_lambda, aws_dynamodb, aws_s3 } from "aws-cdk-lib";
|
|
113
|
-
|
|
114
|
-
const fn = new aws_lambda.Function(this, "MyFunction", { ... });
|
|
115
|
-
const table = new aws_dynamodb.Table(this, "MyTable", { ... });
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
**Incorrect:**
|
|
119
|
-
|
|
120
|
-
```typescript
|
|
121
|
-
import * as lambda from "aws-cdk-lib/aws-lambda";
|
|
122
|
-
import * as dynamodb from "aws-cdk-lib/aws-dynamodb";
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
# AWS CDK security and networking
|
|
126
|
-
|
|
127
|
-
- Follow least privilege principle for all IAM permissions.
|
|
128
|
-
- Prefer CDK grant methods (e.g., `bucket.grantRead()`, `table.grantWriteData()`) over creating custom IAM roles and policies.
|
|
129
|
-
- For network security groups, use the `connections` property (e.g., `lambda.connections.allowTo()`, `rds.connections.allowFrom()`) instead of manually managing security group rules.
|
|
130
|
-
|
|
131
|
-
# AWS Lambda
|
|
132
|
-
|
|
133
|
-
- Use latest available LTS version of Node.js runtime.
|
|
134
|
-
- Use ARM-based architecture.
|
|
135
|
-
- Use AWS CDK `NodeJsFunction` construct to bundle the handler code.
|
|
136
|
-
- For Lambda functions triggered by DynamoDB Streams, enable `bisectBatchOnError: true` on the event source mapping.
|
|
137
|
-
|
|
138
|
-
# Amazon CloudFront
|
|
139
|
-
|
|
140
|
-
- Use CloudFront distributions for serving static content.
|
|
141
|
-
- Configure S3 buckets as CloudFront origins with Origin Access Control (OAC).
|
|
142
|
-
- Use CloudFront VPC origins for private Application Load Balancers and other VPC resources.
|
|
143
|
-
|
|
144
|
-
# Terminology
|
|
145
|
-
|
|
146
|
-
Use these proper nouns with exact capitalization:
|
|
147
|
-
|
|
148
|
-
- Sales Flow
|
|
149
|
-
- Session Event
|
|
150
|
-
- Session Service
|
|
151
|
-
- Session Event Design Document
|
|
152
|
-
- Session Service Design Document
|
|
153
|
-
|
|
154
|
-
# Testing
|
|
155
|
-
|
|
156
|
-
- All code must have test coverage: use unit tests for business-logic and utility code, integration tests for Lambda function handlers, CDK assertions for infrastructure code.
|
|
157
|
-
- Test domain logic in isolation without any infrastructure dependencies or mocks.
|
|
158
|
-
- If no testing framework is configured, use Vitest.
|
|
159
|
-
- Avoid mocking in tests. Prefer dependency injection and testing pure functions with real implementations. For AWS services, use local alternatives (e.g., DynamoDB Local, LocalStack) or in-memory implementations for integration tests.
|
|
160
|
-
|
|
161
|
-
# Error handling
|
|
162
|
-
|
|
163
|
-
- Use custom error classes. Extend the base `Error` class and set the error name.
|
|
164
|
-
- Define all errors in `src/domain/errors.ts` (or `src/domain/errors/` for multiple files).
|
|
165
|
-
- Domain errors represent business rule violations (e.g., `InvalidPriceError`, `ProductNotAvailableError`).
|
|
166
|
-
- Application errors represent operational failures (e.g., `ProductNotFoundError`, `ConcurrencyError`).
|
|
167
|
-
- Infrastructure errors represent technical failures (e.g., `DatabaseConnectionError`, `ExternalServiceError`).
|
|
168
|
-
- Lambda handlers must catch errors and map them to appropriate HTTP status codes or event handling logic.
|
|
169
|
-
- Include relevant context in error messages and properties. Never expose sensitive data.
|
|
170
|
-
- Configure dead letter queues (DLQ) for all asynchronous Lambda invocations, DynamoDB Streams, EventBridge rules, and SNS subscriptions.
|
|
171
|
-
|
|
172
|
-
**Example:**
|
|
173
|
-
|
|
174
|
-
```typescript
|
|
175
|
-
export class InvalidPriceError extends Error {
|
|
176
|
-
constructor(price: number) {
|
|
177
|
-
super(`Price must be positive, got ${price}`);
|
|
178
|
-
this.name = "InvalidPriceError";
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
export class ProductNotFoundError extends Error {
|
|
183
|
-
constructor(public readonly productId: string) {
|
|
184
|
-
super(`Product not found: ${productId}`);
|
|
185
|
-
this.name = "ProductNotFoundError";
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
# Idempotency
|
|
191
|
-
|
|
192
|
-
- Design all event handlers and async operations to be idempotent.
|
|
193
|
-
- Use DynamoDB conditional writes with idempotency keys. Store the idempotency key with a TTL.
|
|
194
|
-
- For DynamoDB Stream handlers, use the event ID from the stream record as the idempotency key.
|
|
195
|
-
- For EventBridge events, include a unique event ID in the event payload and use it as the idempotency key.
|
|
196
|
-
- Store idempotency records in the same table as your domain data using key pattern: `pk: "IDEMPOTENCY#<eventId>"`, `sk: "IDEMPOTENCY"`.
|
|
197
|
-
- Set TTL on idempotency records (e.g., 24 hours).
|
|
198
|
-
|
|
199
|
-
**Example:**
|
|
200
|
-
|
|
201
|
-
```typescript
|
|
202
|
-
async function handleProductUpdate(event: DynamoDBStreamEvent) {
|
|
203
|
-
for (const record of event.Records) {
|
|
204
|
-
const idempotencyKey = record.eventID;
|
|
205
|
-
|
|
206
|
-
try {
|
|
207
|
-
await dynamodb.put({
|
|
208
|
-
TableName: TABLE_NAME,
|
|
209
|
-
Item: {
|
|
210
|
-
pk: `IDEMPOTENCY#${idempotencyKey}`,
|
|
211
|
-
sk: "IDEMPOTENCY",
|
|
212
|
-
ttl: Math.floor(Date.now() / 1000) + 86400, // 24 hours
|
|
213
|
-
},
|
|
214
|
-
ConditionExpression: "attribute_not_exists(pk)",
|
|
215
|
-
});
|
|
216
|
-
|
|
217
|
-
// Process the event - this only runs if idempotency key was successfully stored
|
|
218
|
-
await processProductUpdate(record);
|
|
219
|
-
} catch (error) {
|
|
220
|
-
if (error.name === "ConditionalCheckFailedException") {
|
|
221
|
-
// Already processed, skip
|
|
222
|
-
continue;
|
|
223
|
-
}
|
|
224
|
-
throw error;
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
# Observability
|
|
231
|
-
|
|
232
|
-
- Emit a single context-rich structured log (wide event) per service hop for each request.
|
|
233
|
-
- Use high-cardinality fields (user IDs, request IDs, entity IDs).
|
|
234
|
-
- Include high-dimensional data with many fields.
|
|
235
|
-
- Connect all events for a request using a correlation ID (request ID or trace ID).
|
|
236
|
-
- Redact sensitive data (passwords, tokens, PII) before logging.
|
|
237
|
-
|
|
238
|
-
**Required fields in all events:**
|
|
239
|
-
|
|
240
|
-
- `requestId` - Correlation ID for the entire request flow
|
|
241
|
-
- `timestamp` - ISO 8601 format with timezone
|
|
242
|
-
- `service` - Service name
|
|
243
|
-
- `message` - Human-readable description
|
|
244
|
-
- `outcome` - Result status (e.g., "ok", "error")
|
|
245
|
-
- `duration` - Operation duration in milliseconds
|
|
246
|
-
|
|
247
|
-
**Recommended context fields:**
|
|
248
|
-
|
|
249
|
-
- Request details: `method`, `path`, `statusCode`, `headers`
|
|
250
|
-
- User context: `userId`, user properties relevant to business logic
|
|
251
|
-
- Entity data: Full entity objects involved in the operation
|
|
252
|
-
- Infrastructure: `commitHash`, database queries, cache operations
|
|
253
|
-
- Downstream calls: Service names, durations, status codes
|
|
254
|
-
|
|
255
|
-
**Example wide event:**
|
|
256
|
-
|
|
257
|
-
```json
|
|
258
|
-
{
|
|
259
|
-
"requestId": "8bfdf7ecdd485694",
|
|
260
|
-
"timestamp": "2024-09-08T06:14:05.680+03:00",
|
|
261
|
-
"service": "order-processing",
|
|
262
|
-
"message": "Order placed",
|
|
263
|
-
"outcome": "ok",
|
|
264
|
-
"duration": 268,
|
|
265
|
-
"commitHash": "690de31f245eb4f2160643e0dbb5304179a1cdd3",
|
|
266
|
-
"event": {
|
|
267
|
-
"type": "OrderPlaced",
|
|
268
|
-
"source": "order-service",
|
|
269
|
-
"eventId": "evt_f8d4d21c-f1fd-48b9"
|
|
270
|
-
},
|
|
271
|
-
"customer": {
|
|
272
|
-
"id": "cust_fdc4ddd4-8b30",
|
|
273
|
-
"segment": "premium",
|
|
274
|
-
"storeId": "store-123"
|
|
275
|
-
},
|
|
276
|
-
"order": {
|
|
277
|
-
"id": "ord_f8d4d21c-f1fd",
|
|
278
|
-
"totalAmount": 45.99,
|
|
279
|
-
"itemCount": 3,
|
|
280
|
-
"fulfillmentType": "home-delivery"
|
|
281
|
-
},
|
|
282
|
-
"dynamodb": {
|
|
283
|
-
"operation": "transactWrite",
|
|
284
|
-
"items": [
|
|
285
|
-
{
|
|
286
|
-
"table": "orders-table",
|
|
287
|
-
"pk": "ORDER#ord_f8d4d21c-f1fd",
|
|
288
|
-
"sk": "METADATA",
|
|
289
|
-
"operation": "put"
|
|
290
|
-
},
|
|
291
|
-
{
|
|
292
|
-
"table": "orders-table",
|
|
293
|
-
"pk": "CUSTOMER#cust_fdc4ddd4-8b30",
|
|
294
|
-
"sk": "ORDER#ord_f8d4d21c-f1fd",
|
|
295
|
-
"operation": "put"
|
|
296
|
-
}
|
|
297
|
-
],
|
|
298
|
-
"duration": 45
|
|
299
|
-
},
|
|
300
|
-
"downstream": {
|
|
301
|
-
"eventBridge": {
|
|
302
|
-
"eventBus": "retail-events",
|
|
303
|
-
"published": true,
|
|
304
|
-
"duration": 12
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
```
|
|
309
|
-
|
|
310
|
-
# Formal modeling
|
|
311
|
-
|
|
312
|
-
When designing logic for event-driven architectures, distributed systems, or asynchronous communication patterns:
|
|
313
|
-
|
|
314
|
-
- Model the system using P language (https://p-org.github.io/P/) to formally verify correctness
|
|
315
|
-
- Define state machines for each component/actor in the system
|
|
316
|
-
- Specify safety properties (what should never happen) and liveness properties (what should eventually happen)
|
|
317
|
-
- Model all possible event orderings and race conditions
|
|
318
|
-
- Use P's model checker to verify the design before implementation
|
|
319
|
-
- Include the P model specification alongside architecture diagrams
|
|
320
|
-
- Focus on modeling: message protocols, failure scenarios, concurrent interactions, and state transitions
|