@decaf-ts/transactional-decorators 0.1.1 → 0.1.3

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 (44) hide show
  1. package/LICENSE.md +21 -157
  2. package/dist/transactional-decorators.cjs +166 -67
  3. package/dist/transactional-decorators.esm.cjs +166 -67
  4. package/lib/Transaction.cjs +87 -39
  5. package/lib/Transaction.d.ts +86 -38
  6. package/lib/constants.cjs +14 -1
  7. package/lib/constants.d.ts +13 -0
  8. package/lib/decorators.cjs +35 -11
  9. package/lib/decorators.d.ts +34 -10
  10. package/lib/esm/Transaction.d.ts +86 -38
  11. package/lib/esm/Transaction.js +90 -42
  12. package/lib/esm/constants.d.ts +13 -0
  13. package/lib/esm/constants.js +14 -1
  14. package/lib/esm/decorators.d.ts +34 -10
  15. package/lib/esm/decorators.js +37 -13
  16. package/lib/esm/index.d.ts +7 -13
  17. package/lib/esm/index.js +14 -20
  18. package/lib/esm/interfaces/TransactionLock.d.ts +13 -11
  19. package/lib/esm/interfaces/TransactionLock.js +1 -1
  20. package/lib/esm/interfaces/index.d.ts +5 -0
  21. package/lib/esm/interfaces/index.js +7 -2
  22. package/lib/esm/locks/Lock.d.ts +13 -5
  23. package/lib/esm/locks/Lock.js +14 -6
  24. package/lib/esm/locks/SyncronousLock.d.ts +3 -4
  25. package/lib/esm/locks/SyncronousLock.js +14 -2
  26. package/lib/esm/locks/index.d.ts +5 -0
  27. package/lib/esm/locks/index.js +8 -3
  28. package/lib/esm/types.d.ts +13 -3
  29. package/lib/esm/types.js +1 -1
  30. package/lib/index.cjs +8 -14
  31. package/lib/index.d.ts +7 -13
  32. package/lib/interfaces/TransactionLock.cjs +1 -1
  33. package/lib/interfaces/TransactionLock.d.ts +13 -11
  34. package/lib/interfaces/index.cjs +6 -1
  35. package/lib/interfaces/index.d.ts +5 -0
  36. package/lib/locks/Lock.cjs +14 -6
  37. package/lib/locks/Lock.d.ts +13 -5
  38. package/lib/locks/SyncronousLock.cjs +13 -1
  39. package/lib/locks/SyncronousLock.d.ts +3 -4
  40. package/lib/locks/index.cjs +6 -1
  41. package/lib/locks/index.d.ts +5 -0
  42. package/lib/types.cjs +1 -1
  43. package/lib/types.d.ts +13 -3
  44. package/package.json +2 -2
@@ -1,19 +1,43 @@
1
1
  /**
2
- * @summary Sets a class Async method as transactional
2
+ * @description Method decorator that enables transactional behavior
3
+ * @summary Sets a class async method as transactional, wrapping it in a transaction context that can be managed by the transaction system. This decorator handles transaction creation, binding, and error handling.
4
+ * @param {any[]} [data] - Optional metadata available to the {@link TransactionLock} implementation
5
+ * @return {Function} A decorator function that wraps the original method with transactional behavior
6
+ * @function transactional
7
+ * @category Method Decorators
8
+ * @mermaid
9
+ * sequenceDiagram
10
+ * participant C as Client Code
11
+ * participant D as Decorator
12
+ * participant T as Transaction
13
+ * participant O as Original Method
3
14
  *
4
- * @param {any[]} [data] option metadata available to the {@link TransactionLock}
15
+ * C->>D: Call decorated method
16
+ * D->>D: Check if transaction exists in args
5
17
  *
6
- * @function transactional
18
+ * alt Transaction exists in args
19
+ * D->>T: Create updated transaction
20
+ * T->>T: Bind to original transaction
21
+ * T->>T: Fire transaction
22
+ * else No transaction
23
+ * D->>T: Create new transaction
24
+ * T->>T: Submit transaction
25
+ * end
7
26
  *
8
- * @memberOf module:db-decorators.Decorators.transactions
27
+ * T->>O: Execute original method
28
+ * O-->>T: Return result/error
29
+ * T->>T: Release transaction
30
+ * T-->>C: Return result/error
31
+ * @category Decorators
9
32
  */
10
33
  export declare function transactional(...data: any[]): (target: any, propertyKey?: any, descriptor?: PropertyDescriptor) => void;
11
34
  /**
12
- * @summary Util function to wrap super calls with the transaction when the super's method is also transactional
13
- *
14
- * @param {Function} method the super method (must be bound to the proper this), eg: super.create.bind(this)
15
- * @param {any[]} args the arguments to call the method with
16
- *
17
- * @memberOf module:db-decorators.Transaction
35
+ * @description Utility for handling super calls in transactional methods
36
+ * @summary Wraps super method calls with the current transaction context when the super's method is also transactional, ensuring transaction continuity through the inheritance chain
37
+ * @param {Function} method - The super method (must be bound to the proper this), e.g., super.create.bind(this)
38
+ * @param {any[]} args - The arguments to call the method with
39
+ * @return {any} The result of the super method call
40
+ * @function transactionalSuperCall
41
+ * @memberOf module:transactions
18
42
  */
19
43
  export declare function transactionalSuperCall(method: any, ...args: any): any;
@@ -1,16 +1,48 @@
1
1
  import { TransactionLock } from "./interfaces/TransactionLock";
2
2
  import { Callback } from "./types";
3
3
  /**
4
- * @summary Transaction Class
5
- *
6
- * @param {string} source
7
- * @param {string} [method]
8
- * @param {function(): void} [action]
9
- * @param {any[]} [metadata]
10
- *
4
+ * @description Core transaction management class
5
+ * @summary Manages transaction lifecycle, including creation, execution, and cleanup. Provides mechanisms for binding transactions to objects and methods, ensuring proper transaction context propagation.
6
+ * @param {string} source - The source/origin of the transaction (typically a class name)
7
+ * @param {string} [method] - The method name associated with the transaction
8
+ * @param {function(): any} [action] - The function to execute within the transaction
9
+ * @param {any[]} [metadata] - Additional metadata to associate with the transaction
11
10
  * @class Transaction
11
+ * @example
12
+ * // Creating and submitting a transaction
13
+ * const transaction = new Transaction(
14
+ * 'UserService',
15
+ * 'createUser',
16
+ * async () => {
17
+ * // Transaction logic here
18
+ * await db.insert('users', { name: 'John' });
19
+ * }
20
+ * );
21
+ * Transaction.submit(transaction);
12
22
  *
13
- * @category Transactions
23
+ * // Using the transactional decorator
24
+ * class UserService {
25
+ * @transactional()
26
+ * async createUser(data) {
27
+ * // Method will be executed within a transaction
28
+ * return await db.insert('users', data);
29
+ * }
30
+ * }
31
+ * @mermaid
32
+ * sequenceDiagram
33
+ * participant C as Client Code
34
+ * participant T as Transaction
35
+ * participant L as TransactionLock
36
+ * participant O as Original Method
37
+ *
38
+ * C->>T: new Transaction(source, method, action)
39
+ * C->>T: Transaction.submit(transaction)
40
+ * T->>L: submit(transaction)
41
+ * L->>T: fire()
42
+ * T->>O: Execute action()
43
+ * O-->>T: Return result/error
44
+ * T->>L: release(error?)
45
+ * L-->>C: Return result/error
14
46
  */
15
47
  export declare class Transaction {
16
48
  readonly id: number;
@@ -22,65 +54,81 @@ export declare class Transaction {
22
54
  private static lock;
23
55
  constructor(source: string, method?: string, action?: () => any, metadata?: any[]);
24
56
  /**
25
- * @summary Pushes a transaction to que queue and waits its resolution
26
- *
27
- * @param {any} issuer any class. will be used as this when calling the callbackMethod
28
- * @param {Function} callbackMethod callback function containing the transaction. will be called with the issuear as this
29
- * @param {any[]} args arguments to pass to the method. Last one must be the callback
57
+ * @description Queues a transaction for execution
58
+ * @summary Pushes a transaction to the queue and waits for its resolution. Creates a new transaction with the provided issuer and callback method, then submits it to the transaction lock.
59
+ * @param {any} issuer - Any class instance that will be used as 'this' when calling the callbackMethod
60
+ * @param {Function} callbackMethod - Callback function containing the transaction logic, will be called with the issuer as 'this'
61
+ * @param {any[]} args - Arguments to pass to the method. Last one must be the callback function
62
+ * @return {void}
30
63
  */
31
64
  static push(issuer: any, callbackMethod: (...argzz: (any | Callback)[]) => void, ...args: (any | Callback)[]): void;
32
65
  /**
33
- * @summary Sets the lock to be used
34
- * @param lock
66
+ * @description Configures the transaction lock implementation
67
+ * @summary Sets the lock implementation to be used for transaction management, allowing customization of the transaction behavior
68
+ * @param {TransactionLock} lock - The lock implementation to use for managing transactions
69
+ * @return {void}
35
70
  */
36
71
  static setLock(lock: TransactionLock): void;
37
72
  /**
38
- * @summary gets the lock
73
+ * @description Retrieves the current transaction lock
74
+ * @summary Gets the current transaction lock instance, creating a default SyncronousLock if none exists
75
+ * @return {TransactionLock} The current transaction lock implementation
39
76
  */
40
77
  static getLock(): TransactionLock;
41
78
  /**
42
- * @summary submits a transaction
43
- * @param {Transaction} transaction
79
+ * @description Submits a transaction for processing
80
+ * @summary Submits a transaction to the current transaction lock for processing and execution
81
+ * @param {Transaction} transaction - The transaction to submit for processing
82
+ * @return {void}
44
83
  */
45
84
  static submit(transaction: Transaction): void;
46
85
  /**
47
- * @summary releases the lock
48
- * @param {Err} err
86
+ * @description Releases the transaction lock
87
+ * @summary Releases the current transaction lock, optionally with an error, allowing the next transaction to proceed
88
+ * @param {Error} [err] - Optional error that occurred during transaction execution
89
+ * @return {Promise<void>} A promise that resolves when the lock has been released
49
90
  */
50
91
  static release(err?: Error): Promise<void>;
51
92
  /**
52
- * @summary retrieves the metadata for the transaction
93
+ * @description Retrieves transaction metadata
94
+ * @summary Returns a copy of the metadata associated with this transaction, ensuring the original metadata remains unmodified
95
+ * @return {any[] | undefined} A copy of the transaction metadata or undefined if no metadata exists
53
96
  */
54
97
  getMetadata(): any[] | undefined;
55
98
  /**
56
- * @summary Binds a new operation to the current transaction
57
- * @param {Transaction} nextTransaction
99
+ * @description Links a new transaction to the current one
100
+ * @summary Binds a new transaction operation to the current transaction, transferring logs and binding methods to maintain transaction context
101
+ * @param {Transaction} nextTransaction - The new transaction to bind to the current one
102
+ * @return {void}
58
103
  */
59
104
  bindTransaction(nextTransaction: Transaction): void;
60
105
  /**
61
- * @summary Binds the Transactional Decorated Object to the transaction
62
- * @description by having all {@link transactional} decorated
63
- * methods always pass the current Transaction as an argument
64
- *
65
- * @param {any} obj
66
- * @return {any} the bound {@param obj}
106
+ * @description Binds an object to the current transaction context
107
+ * @summary Binds a transactional decorated object to the transaction by ensuring all transactional methods automatically receive the current transaction as their first argument
108
+ * @param {any} obj - The object to bind to the transaction
109
+ * @return {any} The bound object with transaction-aware method wrappers
67
110
  */
68
111
  bindToTransaction(obj: any): any;
69
112
  /**
70
- * @summary Fires the Transaction
113
+ * @description Executes the transaction action
114
+ * @summary Fires the transaction by executing its associated action function, throwing an error if no action is defined
115
+ * @return {any} The result of the transaction action
71
116
  */
72
117
  fire(): any;
73
118
  /**
74
- * @summary toString override
75
- * @param {boolean} [withId] defaults to true
76
- * @param {boolean} [withLog] defaults to true
119
+ * @description Provides a string representation of the transaction
120
+ * @summary Overrides the default toString method to provide a formatted string representation of the transaction, optionally including the transaction ID and log
121
+ * @param {boolean} [withId=true] - Whether to include the transaction ID in the output
122
+ * @param {boolean} [withLog=false] - Whether to include the transaction log in the output
123
+ * @return {string} A string representation of the transaction
77
124
  */
78
125
  toString(withId?: boolean, withLog?: boolean): string;
79
126
  /**
80
- * @summary gets the transactions reflections key
81
- * @function getRepoKey
82
- * @param {string} key
83
- * @memberOf module:db-decorators.Transactions
84
- * */
127
+ * @description Generates a reflection metadata key for transactions
128
+ * @summary Creates a prefixed reflection key for transaction-related metadata, ensuring proper namespacing
129
+ * @param {string} key - The base key to prefix with the transaction reflection namespace
130
+ * @return {string} The complete reflection key for transaction metadata
131
+ * @function key
132
+ */
85
133
  static key(key: string): string;
86
134
  }
@@ -1,19 +1,51 @@
1
1
  import { Reflection } from "@decaf-ts/reflection";
2
- import { SyncronousLock } from "./locks/SyncronousLock";
2
+ import { SyncronousLock } from "./locks/SyncronousLock.js";
3
3
  import { DBKeys, getAllPropertyDecoratorsRecursive, } from "@decaf-ts/db-decorators";
4
- import { getObjectName } from "./utils";
5
- import { TransactionalKeys } from "./constants";
4
+ import { getObjectName } from "./utils.js";
5
+ import { TransactionalKeys } from "./constants.js";
6
6
  /**
7
- * @summary Transaction Class
8
- *
9
- * @param {string} source
10
- * @param {string} [method]
11
- * @param {function(): void} [action]
12
- * @param {any[]} [metadata]
13
- *
7
+ * @description Core transaction management class
8
+ * @summary Manages transaction lifecycle, including creation, execution, and cleanup. Provides mechanisms for binding transactions to objects and methods, ensuring proper transaction context propagation.
9
+ * @param {string} source - The source/origin of the transaction (typically a class name)
10
+ * @param {string} [method] - The method name associated with the transaction
11
+ * @param {function(): any} [action] - The function to execute within the transaction
12
+ * @param {any[]} [metadata] - Additional metadata to associate with the transaction
14
13
  * @class Transaction
14
+ * @example
15
+ * // Creating and submitting a transaction
16
+ * const transaction = new Transaction(
17
+ * 'UserService',
18
+ * 'createUser',
19
+ * async () => {
20
+ * // Transaction logic here
21
+ * await db.insert('users', { name: 'John' });
22
+ * }
23
+ * );
24
+ * Transaction.submit(transaction);
15
25
  *
16
- * @category Transactions
26
+ * // Using the transactional decorator
27
+ * class UserService {
28
+ * @transactional()
29
+ * async createUser(data) {
30
+ * // Method will be executed within a transaction
31
+ * return await db.insert('users', data);
32
+ * }
33
+ * }
34
+ * @mermaid
35
+ * sequenceDiagram
36
+ * participant C as Client Code
37
+ * participant T as Transaction
38
+ * participant L as TransactionLock
39
+ * participant O as Original Method
40
+ *
41
+ * C->>T: new Transaction(source, method, action)
42
+ * C->>T: Transaction.submit(transaction)
43
+ * T->>L: submit(transaction)
44
+ * L->>T: fire()
45
+ * T->>O: Execute action()
46
+ * O-->>T: Return result/error
47
+ * T->>L: release(error?)
48
+ * L-->>C: Return result/error
17
49
  */
18
50
  export class Transaction {
19
51
  constructor(source, method, action, metadata) {
@@ -25,11 +57,12 @@ export class Transaction {
25
57
  this.metadata = metadata;
26
58
  }
27
59
  /**
28
- * @summary Pushes a transaction to que queue and waits its resolution
29
- *
30
- * @param {any} issuer any class. will be used as this when calling the callbackMethod
31
- * @param {Function} callbackMethod callback function containing the transaction. will be called with the issuear as this
32
- * @param {any[]} args arguments to pass to the method. Last one must be the callback
60
+ * @description Queues a transaction for execution
61
+ * @summary Pushes a transaction to the queue and waits for its resolution. Creates a new transaction with the provided issuer and callback method, then submits it to the transaction lock.
62
+ * @param {any} issuer - Any class instance that will be used as 'this' when calling the callbackMethod
63
+ * @param {Function} callbackMethod - Callback function containing the transaction logic, will be called with the issuer as 'this'
64
+ * @param {any[]} args - Arguments to pass to the method. Last one must be the callback function
65
+ * @return {void}
33
66
  */
34
67
  static push(issuer, callbackMethod, ...args) {
35
68
  const callback = args.pop();
@@ -46,14 +79,18 @@ export class Transaction {
46
79
  Transaction.getLock().submit(transaction);
47
80
  }
48
81
  /**
49
- * @summary Sets the lock to be used
50
- * @param lock
82
+ * @description Configures the transaction lock implementation
83
+ * @summary Sets the lock implementation to be used for transaction management, allowing customization of the transaction behavior
84
+ * @param {TransactionLock} lock - The lock implementation to use for managing transactions
85
+ * @return {void}
51
86
  */
52
87
  static setLock(lock) {
53
88
  this.lock = lock;
54
89
  }
55
90
  /**
56
- * @summary gets the lock
91
+ * @description Retrieves the current transaction lock
92
+ * @summary Gets the current transaction lock instance, creating a default SyncronousLock if none exists
93
+ * @return {TransactionLock} The current transaction lock implementation
57
94
  */
58
95
  static getLock() {
59
96
  if (!this.lock)
@@ -61,28 +98,36 @@ export class Transaction {
61
98
  return this.lock;
62
99
  }
63
100
  /**
64
- * @summary submits a transaction
65
- * @param {Transaction} transaction
101
+ * @description Submits a transaction for processing
102
+ * @summary Submits a transaction to the current transaction lock for processing and execution
103
+ * @param {Transaction} transaction - The transaction to submit for processing
104
+ * @return {void}
66
105
  */
67
106
  static submit(transaction) {
68
107
  Transaction.getLock().submit(transaction);
69
108
  }
70
109
  /**
71
- * @summary releases the lock
72
- * @param {Err} err
110
+ * @description Releases the transaction lock
111
+ * @summary Releases the current transaction lock, optionally with an error, allowing the next transaction to proceed
112
+ * @param {Error} [err] - Optional error that occurred during transaction execution
113
+ * @return {Promise<void>} A promise that resolves when the lock has been released
73
114
  */
74
115
  static async release(err) {
75
116
  return Transaction.getLock().release(err);
76
117
  }
77
118
  /**
78
- * @summary retrieves the metadata for the transaction
119
+ * @description Retrieves transaction metadata
120
+ * @summary Returns a copy of the metadata associated with this transaction, ensuring the original metadata remains unmodified
121
+ * @return {any[] | undefined} A copy of the transaction metadata or undefined if no metadata exists
79
122
  */
80
123
  getMetadata() {
81
124
  return this.metadata ? [...this.metadata] : undefined;
82
125
  }
83
126
  /**
84
- * @summary Binds a new operation to the current transaction
85
- * @param {Transaction} nextTransaction
127
+ * @description Links a new transaction to the current one
128
+ * @summary Binds a new transaction operation to the current transaction, transferring logs and binding methods to maintain transaction context
129
+ * @param {Transaction} nextTransaction - The new transaction to bind to the current one
130
+ * @return {void}
86
131
  */
87
132
  bindTransaction(nextTransaction) {
88
133
  // all(`Binding the {0} to {1}`, nextTransaction, this);
@@ -92,12 +137,10 @@ export class Transaction {
92
137
  this.action = nextTransaction.action;
93
138
  }
94
139
  /**
95
- * @summary Binds the Transactional Decorated Object to the transaction
96
- * @description by having all {@link transactional} decorated
97
- * methods always pass the current Transaction as an argument
98
- *
99
- * @param {any} obj
100
- * @return {any} the bound {@param obj}
140
+ * @description Binds an object to the current transaction context
141
+ * @summary Binds a transactional decorated object to the transaction by ensuring all transactional methods automatically receive the current transaction as their first argument
142
+ * @param {any} obj - The object to bind to the transaction
143
+ * @return {any} The bound object with transaction-aware method wrappers
101
144
  */
102
145
  bindToTransaction(obj) {
103
146
  const transactionalMethods = getAllPropertyDecoratorsRecursive(obj, undefined, TransactionalKeys.REFLECT);
@@ -131,7 +174,9 @@ export class Transaction {
131
174
  return boundObj;
132
175
  }
133
176
  /**
134
- * @summary Fires the Transaction
177
+ * @description Executes the transaction action
178
+ * @summary Fires the transaction by executing its associated action function, throwing an error if no action is defined
179
+ * @return {any} The result of the transaction action
135
180
  */
136
181
  fire() {
137
182
  if (!this.action)
@@ -139,21 +184,24 @@ export class Transaction {
139
184
  return this.action();
140
185
  }
141
186
  /**
142
- * @summary toString override
143
- * @param {boolean} [withId] defaults to true
144
- * @param {boolean} [withLog] defaults to true
187
+ * @description Provides a string representation of the transaction
188
+ * @summary Overrides the default toString method to provide a formatted string representation of the transaction, optionally including the transaction ID and log
189
+ * @param {boolean} [withId=true] - Whether to include the transaction ID in the output
190
+ * @param {boolean} [withLog=false] - Whether to include the transaction log in the output
191
+ * @return {string} A string representation of the transaction
145
192
  */
146
193
  toString(withId = true, withLog = false) {
147
194
  return `${withId ? `[${this.id}]` : ""}[Transaction][${this.source}.${this.method}${withLog ? `]\nTransaction Log:\n${this.log.join("\n")}` : "]"}`;
148
195
  }
149
196
  /**
150
- * @summary gets the transactions reflections key
151
- * @function getRepoKey
152
- * @param {string} key
153
- * @memberOf module:db-decorators.Transactions
154
- * */
197
+ * @description Generates a reflection metadata key for transactions
198
+ * @summary Creates a prefixed reflection key for transaction-related metadata, ensuring proper namespacing
199
+ * @param {string} key - The base key to prefix with the transaction reflection namespace
200
+ * @return {string} The complete reflection key for transaction metadata
201
+ * @function key
202
+ */
155
203
  static key(key) {
156
204
  return TransactionalKeys.REFLECT + key;
157
205
  }
158
206
  }
159
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvVHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWxELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RCxPQUFPLEVBQ0wsTUFBTSxFQUNOLGlDQUFpQyxHQUNsQyxNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDeEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWhEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxPQUFPLFdBQVc7SUFVdEIsWUFDRSxNQUFjLEVBQ2QsTUFBZSxFQUNmLE1BQWtCLEVBQ2xCLFFBQWdCO1FBRWhCLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsSUFBSSxDQUNULE1BQVcsRUFDWCxjQUFzRCxFQUN0RCxHQUFHLElBQXdCO1FBRTNCLE1BQU0sUUFBUSxHQUFhLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsUUFBUSxJQUFJLE9BQU8sUUFB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QUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FDNUQsRUFBRSxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7OztTQUtLO0lBQ0wsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFXO1FBQ3BCLE9BQU8saUJBQWlCLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQztJQUN6QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUcmFuc2FjdGlvbkxvY2sgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL1RyYW5zYWN0aW9uTG9ja1wiO1xuaW1wb3J0IHsgUmVmbGVjdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgQ2FsbGJhY2sgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgU3luY3Jvbm91c0xvY2sgfSBmcm9tIFwiLi9sb2Nrcy9TeW5jcm9ub3VzTG9ja1wiO1xuaW1wb3J0IHtcbiAgREJLZXlzLFxuICBnZXRBbGxQcm9wZXJ0eURlY29yYXRvcnNSZWN1cnNpdmUsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgZ2V0T2JqZWN0TmFtZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbmFsS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRyYW5zYWN0aW9uIENsYXNzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVxuICogQHBhcmFtIHtzdHJpbmd9IFttZXRob2RdXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCk6IHZvaWR9IFthY3Rpb25dXG4gKiBAcGFyYW0ge2FueVtdfSBbbWV0YWRhdGFdXG4gKlxuICogQGNsYXNzIFRyYW5zYWN0aW9uXG4gKlxuICogQGNhdGVnb3J5IFRyYW5zYWN0aW9uc1xuICovXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb24ge1xuICByZWFkb25seSBpZDogbnVtYmVyO1xuICBwcm90ZWN0ZWQgYWN0aW9uPzogKCkgPT4gYW55O1xuICByZWFkb25seSBtZXRob2Q/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNvdXJjZT86IHN0cmluZztcbiAgcmVhZG9ubHkgbG9nOiBzdHJpbmdbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBtZXRhZGF0YT86IGFueVtdO1xuXG4gIHByaXZhdGUgc3RhdGljIGxvY2s6IFRyYW5zYWN0aW9uTG9jaztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzb3VyY2U6IHN0cmluZyxcbiAgICBtZXRob2Q/OiBzdHJpbmcsXG4gICAgYWN0aW9uPzogKCkgPT4gYW55LFxuICAgIG1ldGFkYXRhPzogYW55W11cbiAgKSB7XG4gICAgdGhpcy5pZCA9IERhdGUubm93KCk7XG4gICAgdGhpcy5hY3Rpb24gPSBhY3Rpb247XG4gICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7XG4gICAgdGhpcy5sb2cgPSBbW3RoaXMuaWQsIHNvdXJjZSwgbWV0aG9kXS5qb2luKFwiIHwgXCIpXTtcbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUHVzaGVzIGEgdHJhbnNhY3Rpb24gdG8gcXVlIHF1ZXVlIGFuZCB3YWl0cyBpdHMgcmVzb2x1dGlvblxuICAgKlxuICAgKiBAcGFyYW0ge2FueX0gaXNzdWVyIGFueSBjbGFzcy4gd2lsbCBiZSB1c2VkIGFzIHRoaXMgd2hlbiBjYWxsaW5nIHRoZSBjYWxsYmFja01ldGhvZFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja01ldGhvZCBjYWxsYmFjayBmdW5jdGlvbiBjb250YWluaW5nIHRoZSB0cmFuc2FjdGlvbi4gd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgaXNzdWVhciBhcyB0aGlzXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZC4gTGFzdCBvbmUgbXVzdCBiZSB0aGUgY2FsbGJhY2tcbiAgICovXG4gIHN0YXRpYyBwdXNoKFxuICAgIGlzc3VlcjogYW55LFxuICAgIGNhbGxiYWNrTWV0aG9kOiAoLi4uYXJneno6IChhbnkgfCBDYWxsYmFjaylbXSkgPT4gdm9pZCxcbiAgICAuLi5hcmdzOiAoYW55IHwgQ2FsbGJhY2spW11cbiAgKSB7XG4gICAgY29uc3QgY2FsbGJhY2s6IENhbGxiYWNrID0gYXJncy5wb3AoKTtcbiAgICBpZiAoIWNhbGxiYWNrIHx8IHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBjYWxsYmFja1wiKTtcbiAgICBjb25zdCBjYiA9IChlcnI/OiBFcnJvciwgLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgIFRyYW5zYWN0aW9uLmdldExvY2soKVxuICAgICAgICAucmVsZWFzZShlcnIpXG4gICAgICAgIC50aGVuKCgpID0+IGNhbGxiYWNrKGVyciwgLi4uYXJncykpO1xuICAgIH07XG4gICAgY29uc3QgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKFxuICAgICAgaXNzdWVyLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgICBjYWxsYmFja01ldGhvZC5uYW1lID8gZ2V0T2JqZWN0TmFtZShjYWxsYmFja01ldGhvZCkgOiBcIkFub255bW91c1wiLFxuICAgICAgKCkgPT4ge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2tNZXRob2QuY2FsbChcbiAgICAgICAgICB0cmFuc2FjdGlvbi5iaW5kVG9UcmFuc2FjdGlvbihpc3N1ZXIpLFxuICAgICAgICAgIC4uLmFyZ3MsXG4gICAgICAgICAgY2JcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICApO1xuICAgIFRyYW5zYWN0aW9uLmdldExvY2soKS5zdWJtaXQodHJhbnNhY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFNldHMgdGhlIGxvY2sgdG8gYmUgdXNlZFxuICAgKiBAcGFyYW0gbG9ja1xuICAgKi9cbiAgc3RhdGljIHNldExvY2sobG9jazogVHJhbnNhY3Rpb25Mb2NrKSB7XG4gICAgdGhpcy5sb2NrID0gbG9jaztcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBnZXRzIHRoZSBsb2NrXG4gICAqL1xuICBzdGF0aWMgZ2V0TG9jaygpOiBUcmFuc2FjdGlvbkxvY2sge1xuICAgIGlmICghdGhpcy5sb2NrKSB0aGlzLmxvY2sgPSBuZXcgU3luY3Jvbm91c0xvY2soKTtcbiAgICByZXR1cm4gdGhpcy5sb2NrO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IHN1Ym1pdHMgYSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKi9cbiAgc3RhdGljIHN1Ym1pdCh0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pIHtcbiAgICBUcmFuc2FjdGlvbi5nZXRMb2NrKCkuc3VibWl0KHRyYW5zYWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSByZWxlYXNlcyB0aGUgbG9ja1xuICAgKiBAcGFyYW0ge0Vycn0gZXJyXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcmVsZWFzZShlcnI/OiBFcnJvcikge1xuICAgIHJldHVybiBUcmFuc2FjdGlvbi5nZXRMb2NrKCkucmVsZWFzZShlcnIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IHJldHJpZXZlcyB0aGUgbWV0YWRhdGEgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKi9cbiAgZ2V0TWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0YWRhdGEgPyBbLi4udGhpcy5tZXRhZGF0YV0gOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgQmluZHMgYSBuZXcgb3BlcmF0aW9uIHRvIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb259IG5leHRUcmFuc2FjdGlvblxuICAgKi9cbiAgYmluZFRyYW5zYWN0aW9uKG5leHRUcmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pIHtcbiAgICAvLyBhbGwoYEJpbmRpbmcgdGhlIHswfSB0byB7MX1gLCBuZXh0VHJhbnNhY3Rpb24sIHRoaXMpO1xuICAgIHRoaXMubG9nLnB1c2goLi4ubmV4dFRyYW5zYWN0aW9uLmxvZyk7XG4gICAgbmV4dFRyYW5zYWN0aW9uLmJpbmRUcmFuc2FjdGlvbiA9IHRoaXMuYmluZFRvVHJhbnNhY3Rpb24uYmluZCh0aGlzKTtcbiAgICBuZXh0VHJhbnNhY3Rpb24uYmluZFRvVHJhbnNhY3Rpb24gPSB0aGlzLmJpbmRUb1RyYW5zYWN0aW9uLmJpbmQodGhpcyk7XG4gICAgdGhpcy5hY3Rpb24gPSBuZXh0VHJhbnNhY3Rpb24uYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEJpbmRzIHRoZSBUcmFuc2FjdGlvbmFsIERlY29yYXRlZCBPYmplY3QgdG8gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBkZXNjcmlwdGlvbiBieSBoYXZpbmcgYWxsIHtAbGluayB0cmFuc2FjdGlvbmFsfSBkZWNvcmF0ZWRcbiAgICogbWV0aG9kcyBhbHdheXMgcGFzcyB0aGUgY3VycmVudCBUcmFuc2FjdGlvbiBhcyBhbiBhcmd1bWVudFxuICAgKlxuICAgKiBAcGFyYW0ge2FueX0gb2JqXG4gICAqIEByZXR1cm4ge2FueX0gdGhlIGJvdW5kIHtAcGFyYW0gb2JqfVxuICAgKi9cbiAgYmluZFRvVHJhbnNhY3Rpb24ob2JqOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uYWxNZXRob2RzID0gZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzUmVjdXJzaXZlKFxuICAgICAgb2JqLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgVHJhbnNhY3Rpb25hbEtleXMuUkVGTEVDVFxuICAgICk7XG4gICAgaWYgKCF0cmFuc2FjdGlvbmFsTWV0aG9kcykgcmV0dXJuIG9iajtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGNvbnN0IGJvdW5kT2JqID0gUmVmbGVjdGlvbi5nZXRBbGxQcm9wZXJ0aWVzKG9iaikucmVkdWNlKFxuICAgICAgKGFjY3VtOiBhbnksIGs6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgT2JqZWN0LmtleXModHJhbnNhY3Rpb25hbE1ldGhvZHMpLmluZGV4T2YoaykgIT09IC0xICYmXG4gICAgICAgICAgdHJhbnNhY3Rpb25hbE1ldGhvZHNba10uZmluZChcbiAgICAgICAgICAgIChvKSA9PiBvLmtleSA9PT0gVHJhbnNhY3Rpb25hbEtleXMuVFJBTlNBQ1RJT05BTFxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAgIGFjY3VtW2tdID0gKC4uLmFyZ3M6IGFueVtdKSA9PlxuICAgICAgICAgICAgb2JqW2tdLmNhbGwob2JqLl9fb3JpZ2luYWxPYmogfHwgb2JqLCBzZWxmLCAuLi5hcmdzKTtcbiAgICAgICAgZWxzZSBpZiAoayA9PT0gXCJjbGF6elwiIHx8IGsgPT09IFwiY29uc3RydWN0b3JcIikgYWNjdW1ba10gPSBvYmpba107XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBvYmpba10gPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICBhY2N1bVtrXSA9IG9ialtrXS5iaW5kKG9iai5fX29yaWdpbmFsT2JqIHx8IG9iaik7XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBvYmpba10gPT09IFwib2JqZWN0XCIgJiYgb2JqW2tdLmNvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgY29uc3QgZGVjcyA9IFJlZmxlY3Rpb24uZ2V0Q2xhc3NEZWNvcmF0b3JzKFxuICAgICAgICAgICAgVHJhbnNhY3Rpb25hbEtleXMuUkVGTEVDVCxcbiAgICAgICAgICAgIG9ialtrXVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGRlY3MuZmluZCgoZTogYW55KSA9PiBlLmtleSA9PT0gVHJhbnNhY3Rpb25hbEtleXMuVFJBTlNBQ1RJT05BTCkpXG4gICAgICAgICAgICBhY2N1bVtrXSA9IHNlbGYuYmluZFRvVHJhbnNhY3Rpb24ob2JqW2tdKTtcbiAgICAgICAgICBlbHNlIGFjY3VtW2tdID0gb2JqW2tdO1xuICAgICAgICB9IGVsc2UgYWNjdW1ba10gPSBvYmpba107XG5cbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSxcbiAgICAgIHt9XG4gICAgKTtcblxuICAgIGJvdW5kT2JqW0RCS2V5cy5PUklHSU5BTF0gPSBvYmpbREJLZXlzLk9SSUdJTkFMXSB8fCBvYmo7XG4gICAgYm91bmRPYmoudG9TdHJpbmcgPSAoKSA9PlxuICAgICAgZ2V0T2JqZWN0TmFtZShib3VuZE9ialtEQktleXMuT1JJR0lOQUxdKSArXG4gICAgICBcIiBwcm94eSBmb3IgdHJhbnNhY3Rpb24gXCIgK1xuICAgICAgdGhpcy5pZDtcblxuICAgIHJldHVybiBib3VuZE9iajtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBGaXJlcyB0aGUgVHJhbnNhY3Rpb25cbiAgICovXG4gIGZpcmUoKSB7XG4gICAgaWYgKCF0aGlzLmFjdGlvbikgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHRoZSBtZXRob2RgKTtcbiAgICByZXR1cm4gdGhpcy5hY3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSB0b1N0cmluZyBvdmVycmlkZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt3aXRoSWRdIGRlZmF1bHRzIHRvIHRydWVcbiAgICogQHBhcmFtIHtib29sZWFufSBbd2l0aExvZ10gZGVmYXVsdHMgdG8gdHJ1ZVxuICAgKi9cbiAgdG9TdHJpbmcod2l0aElkID0gdHJ1ZSwgd2l0aExvZyA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIGAke3dpdGhJZCA/IGBbJHt0aGlzLmlkfV1gIDogXCJcIn1bVHJhbnNhY3Rpb25dWyR7dGhpcy5zb3VyY2V9LiR7dGhpcy5tZXRob2R9JHtcbiAgICAgIHdpdGhMb2cgPyBgXVxcblRyYW5zYWN0aW9uIExvZzpcXG4ke3RoaXMubG9nLmpvaW4oXCJcXG5cIil9YCA6IFwiXVwiXG4gICAgfWA7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgZ2V0cyB0aGUgdHJhbnNhY3Rpb25zIHJlZmxlY3Rpb25zIGtleVxuICAgKiBAZnVuY3Rpb24gZ2V0UmVwb0tleVxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEBtZW1iZXJPZiBtb2R1bGU6ZGItZGVjb3JhdG9ycy5UcmFuc2FjdGlvbnNcbiAgICogKi9cbiAgc3RhdGljIGtleShrZXk6IHN0cmluZykge1xuICAgIHJldHVybiBUcmFuc2FjdGlvbmFsS2V5cy5SRUZMRUNUICsga2V5O1xuICB9XG59XG4iXX0=
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvVHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWxELE9BQU8sRUFBRSxjQUFjLEVBQUUsa0NBQStCO0FBQ3hELE9BQU8sRUFDTCxNQUFNLEVBQ04saUNBQWlDLEdBQ2xDLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFFLGFBQWEsRUFBRSxtQkFBZ0I7QUFDeEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLHVCQUFvQjtBQUVoRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJDRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBVXRCLFlBQ0UsTUFBYyxFQUNkLE1BQWUsRUFDZixNQUFrQixFQUNsQixRQUFnQjtRQUVoQixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyxJQUFJLENBQ1QsTUFBVyxFQUNYLGNBQXNELEVBQ3RELEdBQUcsSUFBd0I7UUFFM0IsTUFBTSxRQUFRLEdBQWEsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxRQUFRLElBQUks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Q0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQzVELEVBQUUsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQVc7UUFDcEIsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO0lBQ3pDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRyYW5zYWN0aW9uTG9jayB9IGZyb20gXCIuL2ludGVyZmFjZXMvVHJhbnNhY3Rpb25Mb2NrXCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBDYWxsYmFjayB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBTeW5jcm9ub3VzTG9jayB9IGZyb20gXCIuL2xvY2tzL1N5bmNyb25vdXNMb2NrXCI7XG5pbXBvcnQge1xuICBEQktleXMsXG4gIGdldEFsbFByb3BlcnR5RGVjb3JhdG9yc1JlY3Vyc2l2ZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBnZXRPYmplY3ROYW1lIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IFRyYW5zYWN0aW9uYWxLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvcmUgdHJhbnNhY3Rpb24gbWFuYWdlbWVudCBjbGFzc1xuICogQHN1bW1hcnkgTWFuYWdlcyB0cmFuc2FjdGlvbiBsaWZlY3ljbGUsIGluY2x1ZGluZyBjcmVhdGlvbiwgZXhlY3V0aW9uLCBhbmQgY2xlYW51cC4gUHJvdmlkZXMgbWVjaGFuaXNtcyBmb3IgYmluZGluZyB0cmFuc2FjdGlvbnMgdG8gb2JqZWN0cyBhbmQgbWV0aG9kcywgZW5zdXJpbmcgcHJvcGVyIHRyYW5zYWN0aW9uIGNvbnRleHQgcHJvcGFnYXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gVGhlIHNvdXJjZS9vcmlnaW4gb2YgdGhlIHRyYW5zYWN0aW9uICh0eXBpY2FsbHkgYSBjbGFzcyBuYW1lKVxuICogQHBhcmFtIHtzdHJpbmd9IFttZXRob2RdIC0gVGhlIG1ldGhvZCBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb25cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKTogYW55fSBbYWN0aW9uXSAtIFRoZSBmdW5jdGlvbiB0byBleGVjdXRlIHdpdGhpbiB0aGUgdHJhbnNhY3Rpb25cbiAqIEBwYXJhbSB7YW55W119IFttZXRhZGF0YV0gLSBBZGRpdGlvbmFsIG1ldGFkYXRhIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSB0cmFuc2FjdGlvblxuICogQGNsYXNzIFRyYW5zYWN0aW9uXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRpbmcgYW5kIHN1Ym1pdHRpbmcgYSB0cmFuc2FjdGlvblxuICogY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oXG4gKiAgICdVc2VyU2VydmljZScsXG4gKiAgICdjcmVhdGVVc2VyJyxcbiAqICAgYXN5bmMgKCkgPT4ge1xuICogICAgIC8vIFRyYW5zYWN0aW9uIGxvZ2ljIGhlcmVcbiAqICAgICBhd2FpdCBkYi5pbnNlcnQoJ3VzZXJzJywgeyBuYW1lOiAnSm9obicgfSk7XG4gKiAgIH1cbiAqICk7XG4gKiBUcmFuc2FjdGlvbi5zdWJtaXQodHJhbnNhY3Rpb24pO1xuICogXG4gKiAvLyBVc2luZyB0aGUgdHJhbnNhY3Rpb25hbCBkZWNvcmF0b3JcbiAqIGNsYXNzIFVzZXJTZXJ2aWNlIHtcbiAqICAgQHRyYW5zYWN0aW9uYWwoKVxuICogICBhc3luYyBjcmVhdGVVc2VyKGRhdGEpIHtcbiAqICAgICAvLyBNZXRob2Qgd2lsbCBiZSBleGVjdXRlZCB3aXRoaW4gYSB0cmFuc2FjdGlvblxuICogICAgIHJldHVybiBhd2FpdCBkYi5pbnNlcnQoJ3VzZXJzJywgZGF0YSk7XG4gKiAgIH1cbiAqIH1cbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQyBhcyBDbGllbnQgQ29kZVxuICogICBwYXJ0aWNpcGFudCBUIGFzIFRyYW5zYWN0aW9uXG4gKiAgIHBhcnRpY2lwYW50IEwgYXMgVHJhbnNhY3Rpb25Mb2NrXG4gKiAgIHBhcnRpY2lwYW50IE8gYXMgT3JpZ2luYWwgTWV0aG9kXG4gKiAgIFxuICogICBDLT4+VDogbmV3IFRyYW5zYWN0aW9uKHNvdXJjZSwgbWV0aG9kLCBhY3Rpb24pXG4gKiAgIEMtPj5UOiBUcmFuc2FjdGlvbi5zdWJtaXQodHJhbnNhY3Rpb24pXG4gKiAgIFQtPj5MOiBzdWJtaXQodHJhbnNhY3Rpb24pXG4gKiAgIEwtPj5UOiBmaXJlKClcbiAqICAgVC0+Pk86IEV4ZWN1dGUgYWN0aW9uKClcbiAqICAgTy0tPj5UOiBSZXR1cm4gcmVzdWx0L2Vycm9yXG4gKiAgIFQtPj5MOiByZWxlYXNlKGVycm9yPylcbiAqICAgTC0tPj5DOiBSZXR1cm4gcmVzdWx0L2Vycm9yXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiB7XG4gIHJlYWRvbmx5IGlkOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhY3Rpb24/OiAoKSA9PiBhbnk7XG4gIHJlYWRvbmx5IG1ldGhvZD86IHN0cmluZztcbiAgcmVhZG9ubHkgc291cmNlPzogc3RyaW5nO1xuICByZWFkb25seSBsb2c6IHN0cmluZ1tdO1xuICBwcml2YXRlIHJlYWRvbmx5IG1ldGFkYXRhPzogYW55W107XG5cbiAgcHJpdmF0ZSBzdGF0aWMgbG9jazogVHJhbnNhY3Rpb25Mb2NrO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNvdXJjZTogc3RyaW5nLFxuICAgIG1ldGhvZD86IHN0cmluZyxcbiAgICBhY3Rpb24/OiAoKSA9PiBhbnksXG4gICAgbWV0YWRhdGE/OiBhbnlbXVxuICApIHtcbiAgICB0aGlzLmlkID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLmFjdGlvbiA9IGFjdGlvbjtcbiAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDtcbiAgICB0aGlzLmxvZyA9IFtbdGhpcy5pZCwgc291cmNlLCBtZXRob2RdLmpvaW4oXCIgfCBcIildO1xuICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUXVldWVzIGEgdHJhbnNhY3Rpb24gZm9yIGV4ZWN1dGlvblxuICAgKiBAc3VtbWFyeSBQdXNoZXMgYSB0cmFuc2FjdGlvbiB0byB0aGUgcXVldWUgYW5kIHdhaXRzIGZvciBpdHMgcmVzb2x1dGlvbi4gQ3JlYXRlcyBhIG5ldyB0cmFuc2FjdGlvbiB3aXRoIHRoZSBwcm92aWRlZCBpc3N1ZXIgYW5kIGNhbGxiYWNrIG1ldGhvZCwgdGhlbiBzdWJtaXRzIGl0IHRvIHRoZSB0cmFuc2FjdGlvbiBsb2NrLlxuICAgKiBAcGFyYW0ge2FueX0gaXNzdWVyIC0gQW55IGNsYXNzIGluc3RhbmNlIHRoYXQgd2lsbCBiZSB1c2VkIGFzICd0aGlzJyB3aGVuIGNhbGxpbmcgdGhlIGNhbGxiYWNrTWV0aG9kXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrTWV0aG9kIC0gQ2FsbGJhY2sgZnVuY3Rpb24gY29udGFpbmluZyB0aGUgdHJhbnNhY3Rpb24gbG9naWMsIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGlzc3VlciBhcyAndGhpcydcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyAtIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2QuIExhc3Qgb25lIG11c3QgYmUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgcHVzaChcbiAgICBpc3N1ZXI6IGFueSxcbiAgICBjYWxsYmFja01ldGhvZDogKC4uLmFyZ3p6OiAoYW55IHwgQ2FsbGJhY2spW10pID0+IHZvaWQsXG4gICAgLi4uYXJnczogKGFueSB8IENhbGxiYWNrKVtdXG4gICkge1xuICAgIGNvbnN0IGNhbGxiYWNrOiBDYWxsYmFjayA9IGFyZ3MucG9wKCk7XG4gICAgaWYgKCFjYWxsYmFjayB8fCB0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgY2FsbGJhY2tcIik7XG4gICAgY29uc3QgY2IgPSAoZXJyPzogRXJyb3IsIC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICBUcmFuc2FjdGlvbi5nZXRMb2NrKClcbiAgICAgICAgLnJlbGVhc2UoZXJyKVxuICAgICAgICAudGhlbigoKSA9PiBjYWxsYmFjayhlcnIsIC4uLmFyZ3MpKTtcbiAgICB9O1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbihcbiAgICAgIGlzc3Vlci5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgY2FsbGJhY2tNZXRob2QubmFtZSA/IGdldE9iamVjdE5hbWUoY2FsbGJhY2tNZXRob2QpIDogXCJBbm9ueW1vdXNcIixcbiAgICAgICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrTWV0aG9kLmNhbGwoXG4gICAgICAgICAgdHJhbnNhY3Rpb24uYmluZFRvVHJhbnNhY3Rpb24oaXNzdWVyKSxcbiAgICAgICAgICAuLi5hcmdzLFxuICAgICAgICAgIGNiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgKTtcbiAgICBUcmFuc2FjdGlvbi5nZXRMb2NrKCkuc3VibWl0KHRyYW5zYWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29uZmlndXJlcyB0aGUgdHJhbnNhY3Rpb24gbG9jayBpbXBsZW1lbnRhdGlvblxuICAgKiBAc3VtbWFyeSBTZXRzIHRoZSBsb2NrIGltcGxlbWVudGF0aW9uIHRvIGJlIHVzZWQgZm9yIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQsIGFsbG93aW5nIGN1c3RvbWl6YXRpb24gb2YgdGhlIHRyYW5zYWN0aW9uIGJlaGF2aW9yXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25Mb2NrfSBsb2NrIC0gVGhlIGxvY2sgaW1wbGVtZW50YXRpb24gdG8gdXNlIGZvciBtYW5hZ2luZyB0cmFuc2FjdGlvbnNcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBzZXRMb2NrKGxvY2s6IFRyYW5zYWN0aW9uTG9jaykge1xuICAgIHRoaXMubG9jayA9IGxvY2s7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBsb2NrXG4gICAqIEBzdW1tYXJ5IEdldHMgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gbG9jayBpbnN0YW5jZSwgY3JlYXRpbmcgYSBkZWZhdWx0IFN5bmNyb25vdXNMb2NrIGlmIG5vbmUgZXhpc3RzXG4gICAqIEByZXR1cm4ge1RyYW5zYWN0aW9uTG9ja30gVGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gbG9jayBpbXBsZW1lbnRhdGlvblxuICAgKi9cbiAgc3RhdGljIGdldExvY2soKTogVHJhbnNhY3Rpb25Mb2NrIHtcbiAgICBpZiAoIXRoaXMubG9jaykgdGhpcy5sb2NrID0gbmV3IFN5bmNyb25vdXNMb2NrKCk7XG4gICAgcmV0dXJuIHRoaXMubG9jaztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3VibWl0cyBhIHRyYW5zYWN0aW9uIGZvciBwcm9jZXNzaW5nXG4gICAqIEBzdW1tYXJ5IFN1Ym1pdHMgYSB0cmFuc2FjdGlvbiB0byB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBsb2NrIGZvciBwcm9jZXNzaW5nIGFuZCBleGVjdXRpb25cbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb24gLSBUaGUgdHJhbnNhY3Rpb24gdG8gc3VibWl0IGZvciBwcm9jZXNzaW5nXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgc3VibWl0KHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbikge1xuICAgIFRyYW5zYWN0aW9uLmdldExvY2soKS5zdWJtaXQodHJhbnNhY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWxlYXNlcyB0aGUgdHJhbnNhY3Rpb24gbG9ja1xuICAgKiBAc3VtbWFyeSBSZWxlYXNlcyB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBsb2NrLCBvcHRpb25hbGx5IHdpdGggYW4gZXJyb3IsIGFsbG93aW5nIHRoZSBuZXh0IHRyYW5zYWN0aW9uIHRvIHByb2NlZWRcbiAgICogQHBhcmFtIHtFcnJvcn0gW2Vycl0gLSBPcHRpb25hbCBlcnJvciB0aGF0IG9jY3VycmVkIGR1cmluZyB0cmFuc2FjdGlvbiBleGVjdXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbG9jayBoYXMgYmVlbiByZWxlYXNlZFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHJlbGVhc2UoZXJyPzogRXJyb3IpIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb24uZ2V0TG9jaygpLnJlbGVhc2UoZXJyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHRyYW5zYWN0aW9uIG1ldGFkYXRhXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgYSBjb3B5IG9mIHRoZSBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2FjdGlvbiwgZW5zdXJpbmcgdGhlIG9yaWdpbmFsIG1ldGFkYXRhIHJlbWFpbnMgdW5tb2RpZmllZFxuICAgKiBAcmV0dXJuIHthbnlbXSB8IHVuZGVmaW5lZH0gQSBjb3B5IG9mIHRoZSB0cmFuc2FjdGlvbiBtZXRhZGF0YSBvciB1bmRlZmluZWQgaWYgbm8gbWV0YWRhdGEgZXhpc3RzXG4gICAqL1xuICBnZXRNZXRhZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRhZGF0YSA/IFsuLi50aGlzLm1ldGFkYXRhXSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTGlua3MgYSBuZXcgdHJhbnNhY3Rpb24gdG8gdGhlIGN1cnJlbnQgb25lXG4gICAqIEBzdW1tYXJ5IEJpbmRzIGEgbmV3IHRyYW5zYWN0aW9uIG9wZXJhdGlvbiB0byB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiwgdHJhbnNmZXJyaW5nIGxvZ3MgYW5kIGJpbmRpbmcgbWV0aG9kcyB0byBtYWludGFpbiB0cmFuc2FjdGlvbiBjb250ZXh0XG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb259IG5leHRUcmFuc2FjdGlvbiAtIFRoZSBuZXcgdHJhbnNhY3Rpb24gdG8gYmluZCB0byB0aGUgY3VycmVudCBvbmVcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIGJpbmRUcmFuc2FjdGlvbihuZXh0VHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKSB7XG4gICAgLy8gYWxsKGBCaW5kaW5nIHRoZSB7MH0gdG8gezF9YCwgbmV4dFRyYW5zYWN0aW9uLCB0aGlzKTtcbiAgICB0aGlzLmxvZy5wdXNoKC4uLm5leHRUcmFuc2FjdGlvbi5sb2cpO1xuICAgIG5leHRUcmFuc2FjdGlvbi5iaW5kVHJhbnNhY3Rpb24gPSB0aGlzLmJpbmRUb1RyYW5zYWN0aW9uLmJpbmQodGhpcyk7XG4gICAgbmV4dFRyYW5zYWN0aW9uLmJpbmRUb1RyYW5zYWN0aW9uID0gdGhpcy5iaW5kVG9UcmFuc2FjdGlvbi5iaW5kKHRoaXMpO1xuICAgIHRoaXMuYWN0aW9uID0gbmV4dFRyYW5zYWN0aW9uLmFjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQmluZHMgYW4gb2JqZWN0IHRvIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGNvbnRleHRcbiAgICogQHN1bW1hcnkgQmluZHMgYSB0cmFuc2FjdGlvbmFsIGRlY29yYXRlZCBvYmplY3QgdG8gdGhlIHRyYW5zYWN0aW9uIGJ5IGVuc3VyaW5nIGFsbCB0cmFuc2FjdGlvbmFsIG1ldGhvZHMgYXV0b21hdGljYWxseSByZWNlaXZlIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGFzIHRoZWlyIGZpcnN0IGFyZ3VtZW50XG4gICAqIEBwYXJhbSB7YW55fSBvYmogLSBUaGUgb2JqZWN0IHRvIGJpbmQgdG8gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge2FueX0gVGhlIGJvdW5kIG9iamVjdCB3aXRoIHRyYW5zYWN0aW9uLWF3YXJlIG1ldGhvZCB3cmFwcGVyc1xuICAgKi9cbiAgYmluZFRvVHJhbnNhY3Rpb24ob2JqOiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uYWxNZXRob2RzID0gZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzUmVjdXJzaXZlKFxuICAgICAgb2JqLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgVHJhbnNhY3Rpb25hbEtleXMuUkVGTEVDVFxuICAgICk7XG4gICAgaWYgKCF0cmFuc2FjdGlvbmFsTWV0aG9kcykgcmV0dXJuIG9iajtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGNvbnN0IGJvdW5kT2JqID0gUmVmbGVjdGlvbi5nZXRBbGxQcm9wZXJ0aWVzKG9iaikucmVkdWNlKFxuICAgICAgKGFjY3VtOiBhbnksIGs6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgT2JqZWN0LmtleXModHJhbnNhY3Rpb25hbE1ldGhvZHMpLmluZGV4T2YoaykgIT09IC0xICYmXG4gICAgICAgICAgdHJhbnNhY3Rpb25hbE1ldGhvZHNba10uZmluZChcbiAgICAgICAgICAgIChvKSA9PiBvLmtleSA9PT0gVHJhbnNhY3Rpb25hbEtleXMuVFJBTlNBQ1RJT05BTFxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAgIGFjY3VtW2tdID0gKC4uLmFyZ3M6IGFueVtdKSA9PlxuICAgICAgICAgICAgb2JqW2tdLmNhbGwob2JqLl9fb3JpZ2luYWxPYmogfHwgb2JqLCBzZWxmLCAuLi5hcmdzKTtcbiAgICAgICAgZWxzZSBpZiAoayA9PT0gXCJjbGF6elwiIHx8IGsgPT09IFwiY29uc3RydWN0b3JcIikgYWNjdW1ba10gPSBvYmpba107XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBvYmpba10gPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICBhY2N1bVtrXSA9IG9ialtrXS5iaW5kKG9iai5fX29yaWdpbmFsT2JqIHx8IG9iaik7XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBvYmpba10gPT09IFwib2JqZWN0XCIgJiYgb2JqW2tdLmNvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgY29uc3QgZGVjcyA9IFJlZmxlY3Rpb24uZ2V0Q2xhc3NEZWNvcmF0b3JzKFxuICAgICAgICAgICAgVHJhbnNhY3Rpb25hbEtleXMuUkVGTEVDVCxcbiAgICAgICAgICAgIG9ialtrXVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGRlY3MuZmluZCgoZTogYW55KSA9PiBlLmtleSA9PT0gVHJhbnNhY3Rpb25hbEtleXMuVFJBTlNBQ1RJT05BTCkpXG4gICAgICAgICAgICBhY2N1bVtrXSA9IHNlbGYuYmluZFRvVHJhbnNhY3Rpb24ob2JqW2tdKTtcbiAgICAgICAgICBlbHNlIGFjY3VtW2tdID0gb2JqW2tdO1xuICAgICAgICB9IGVsc2UgYWNjdW1ba10gPSBvYmpba107XG5cbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSxcbiAgICAgIHt9XG4gICAgKTtcblxuICAgIGJvdW5kT2JqW0RCS2V5cy5PUklHSU5BTF0gPSBvYmpbREJLZXlzLk9SSUdJTkFMXSB8fCBvYmo7XG4gICAgYm91bmRPYmoudG9TdHJpbmcgPSAoKSA9PlxuICAgICAgZ2V0T2JqZWN0TmFtZShib3VuZE9ialtEQktleXMuT1JJR0lOQUxdKSArXG4gICAgICBcIiBwcm94eSBmb3IgdHJhbnNhY3Rpb24gXCIgK1xuICAgICAgdGhpcy5pZDtcblxuICAgIHJldHVybiBib3VuZE9iajtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgdGhlIHRyYW5zYWN0aW9uIGFjdGlvblxuICAgKiBAc3VtbWFyeSBGaXJlcyB0aGUgdHJhbnNhY3Rpb24gYnkgZXhlY3V0aW5nIGl0cyBhc3NvY2lhdGVkIGFjdGlvbiBmdW5jdGlvbiwgdGhyb3dpbmcgYW4gZXJyb3IgaWYgbm8gYWN0aW9uIGlzIGRlZmluZWRcbiAgICogQHJldHVybiB7YW55fSBUaGUgcmVzdWx0IG9mIHRoZSB0cmFuc2FjdGlvbiBhY3Rpb25cbiAgICovXG4gIGZpcmUoKSB7XG4gICAgaWYgKCF0aGlzLmFjdGlvbikgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHRoZSBtZXRob2RgKTtcbiAgICByZXR1cm4gdGhpcy5hY3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBzdW1tYXJ5IE92ZXJyaWRlcyB0aGUgZGVmYXVsdCB0b1N0cmluZyBtZXRob2QgdG8gcHJvdmlkZSBhIGZvcm1hdHRlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRyYW5zYWN0aW9uLCBvcHRpb25hbGx5IGluY2x1ZGluZyB0aGUgdHJhbnNhY3Rpb24gSUQgYW5kIGxvZ1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt3aXRoSWQ9dHJ1ZV0gLSBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHRyYW5zYWN0aW9uIElEIGluIHRoZSBvdXRwdXRcbiAgICogQHBhcmFtIHtib29sZWFufSBbd2l0aExvZz1mYWxzZV0gLSBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHRyYW5zYWN0aW9uIGxvZyBpbiB0aGUgb3V0cHV0XG4gICAqIEByZXR1cm4ge3N0cmluZ30gQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRyYW5zYWN0aW9uXG4gICAqL1xuICB0b1N0cmluZyh3aXRoSWQgPSB0cnVlLCB3aXRoTG9nID0gZmFsc2UpIHtcbiAgICByZXR1cm4gYCR7d2l0aElkID8gYFske3RoaXMuaWR9XWAgOiBcIlwifVtUcmFuc2FjdGlvbl1bJHt0aGlzLnNvdXJjZX0uJHt0aGlzLm1ldGhvZH0ke1xuICAgICAgd2l0aExvZyA/IGBdXFxuVHJhbnNhY3Rpb24gTG9nOlxcbiR7dGhpcy5sb2cuam9pbihcIlxcblwiKX1gIDogXCJdXCJcbiAgICB9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgcmVmbGVjdGlvbiBtZXRhZGF0YSBrZXkgZm9yIHRyYW5zYWN0aW9uc1xuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgcHJlZml4ZWQgcmVmbGVjdGlvbiBrZXkgZm9yIHRyYW5zYWN0aW9uLXJlbGF0ZWQgbWV0YWRhdGEsIGVuc3VyaW5nIHByb3BlciBuYW1lc3BhY2luZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGJhc2Uga2V5IHRvIHByZWZpeCB3aXRoIHRoZSB0cmFuc2FjdGlvbiByZWZsZWN0aW9uIG5hbWVzcGFjZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjb21wbGV0ZSByZWZsZWN0aW9uIGtleSBmb3IgdHJhbnNhY3Rpb24gbWV0YWRhdGFcbiAgICogQGZ1bmN0aW9uIGtleVxuICAgKi9cbiAgc3RhdGljIGtleShrZXk6IHN0cmluZykge1xuICAgIHJldHVybiBUcmFuc2FjdGlvbmFsS2V5cy5SRUZMRUNUICsga2V5O1xuICB9XG59XG4iXX0=
@@ -1 +1,14 @@
1
+ /**
2
+ * @typedef {Object} TransactionalKeysType
3
+ * @property {string} REFLECT - Key used for reflection metadata related to transactional models
4
+ * @property {string} TRANSACTIONAL - Key used to identify transactional properties
5
+ * @memberOf module:transactions
6
+ */
7
+ /**
8
+ * @description Keys used for transactional operations
9
+ * @summary Constant object containing string keys used throughout the transactional system for reflection and identification
10
+ * @type {TransactionalKeysType}
11
+ * @const TransactionalKeys
12
+ * @memberOf module:transactions
13
+ */
1
14
  export declare const TransactionalKeys: Record<string, string>;
@@ -1,5 +1,18 @@
1
+ /**
2
+ * @typedef {Object} TransactionalKeysType
3
+ * @property {string} REFLECT - Key used for reflection metadata related to transactional models
4
+ * @property {string} TRANSACTIONAL - Key used to identify transactional properties
5
+ * @memberOf module:transactions
6
+ */
7
+ /**
8
+ * @description Keys used for transactional operations
9
+ * @summary Constant object containing string keys used throughout the transactional system for reflection and identification
10
+ * @type {TransactionalKeysType}
11
+ * @const TransactionalKeys
12
+ * @memberOf module:transactions
13
+ */
1
14
  export const TransactionalKeys = {
2
15
  REFLECT: "model.transactional.",
3
16
  TRANSACTIONAL: "transactional",
4
17
  };
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBMkI7SUFDdkQsT0FBTyxFQUFFLHNCQUFzQjtJQUMvQixhQUFhLEVBQUUsZUFBZTtDQUMvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IFRyYW5zYWN0aW9uYWxLZXlzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBSRUZMRUNUOiBcIm1vZGVsLnRyYW5zYWN0aW9uYWwuXCIsXG4gIFRSQU5TQUNUSU9OQUw6IFwidHJhbnNhY3Rpb25hbFwiLFxufTtcbiJdfQ==
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVIOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUEyQjtJQUN2RCxPQUFPLEVBQUUsc0JBQXNCO0lBQy9CLGFBQWEsRUFBRSxlQUFlO0NBQy9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFRyYW5zYWN0aW9uYWxLZXlzVHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFRkxFQ1QgLSBLZXkgdXNlZCBmb3IgcmVmbGVjdGlvbiBtZXRhZGF0YSByZWxhdGVkIHRvIHRyYW5zYWN0aW9uYWwgbW9kZWxzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVFJBTlNBQ1RJT05BTCAtIEtleSB1c2VkIHRvIGlkZW50aWZ5IHRyYW5zYWN0aW9uYWwgcHJvcGVydGllc1xuICogQG1lbWJlck9mIG1vZHVsZTp0cmFuc2FjdGlvbnNcbiAqL1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBLZXlzIHVzZWQgZm9yIHRyYW5zYWN0aW9uYWwgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgQ29uc3RhbnQgb2JqZWN0IGNvbnRhaW5pbmcgc3RyaW5nIGtleXMgdXNlZCB0aHJvdWdob3V0IHRoZSB0cmFuc2FjdGlvbmFsIHN5c3RlbSBmb3IgcmVmbGVjdGlvbiBhbmQgaWRlbnRpZmljYXRpb25cbiAqIEB0eXBlIHtUcmFuc2FjdGlvbmFsS2V5c1R5cGV9XG4gKiBAY29uc3QgVHJhbnNhY3Rpb25hbEtleXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dHJhbnNhY3Rpb25zXG4gKi9cbmV4cG9ydCBjb25zdCBUcmFuc2FjdGlvbmFsS2V5czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgUkVGTEVDVDogXCJtb2RlbC50cmFuc2FjdGlvbmFsLlwiLFxuICBUUkFOU0FDVElPTkFMOiBcInRyYW5zYWN0aW9uYWxcIixcbn07XG4iXX0=
@@ -1,19 +1,43 @@
1
1
  /**
2
- * @summary Sets a class Async method as transactional
2
+ * @description Method decorator that enables transactional behavior
3
+ * @summary Sets a class async method as transactional, wrapping it in a transaction context that can be managed by the transaction system. This decorator handles transaction creation, binding, and error handling.
4
+ * @param {any[]} [data] - Optional metadata available to the {@link TransactionLock} implementation
5
+ * @return {Function} A decorator function that wraps the original method with transactional behavior
6
+ * @function transactional
7
+ * @category Method Decorators
8
+ * @mermaid
9
+ * sequenceDiagram
10
+ * participant C as Client Code
11
+ * participant D as Decorator
12
+ * participant T as Transaction
13
+ * participant O as Original Method
3
14
  *
4
- * @param {any[]} [data] option metadata available to the {@link TransactionLock}
15
+ * C->>D: Call decorated method
16
+ * D->>D: Check if transaction exists in args
5
17
  *
6
- * @function transactional
18
+ * alt Transaction exists in args
19
+ * D->>T: Create updated transaction
20
+ * T->>T: Bind to original transaction
21
+ * T->>T: Fire transaction
22
+ * else No transaction
23
+ * D->>T: Create new transaction
24
+ * T->>T: Submit transaction
25
+ * end
7
26
  *
8
- * @memberOf module:db-decorators.Decorators.transactions
27
+ * T->>O: Execute original method
28
+ * O-->>T: Return result/error
29
+ * T->>T: Release transaction
30
+ * T-->>C: Return result/error
31
+ * @category Decorators
9
32
  */
10
33
  export declare function transactional(...data: any[]): (target: any, propertyKey?: any, descriptor?: PropertyDescriptor) => void;
11
34
  /**
12
- * @summary Util function to wrap super calls with the transaction when the super's method is also transactional
13
- *
14
- * @param {Function} method the super method (must be bound to the proper this), eg: super.create.bind(this)
15
- * @param {any[]} args the arguments to call the method with
16
- *
17
- * @memberOf module:db-decorators.Transaction
35
+ * @description Utility for handling super calls in transactional methods
36
+ * @summary Wraps super method calls with the current transaction context when the super's method is also transactional, ensuring transaction continuity through the inheritance chain
37
+ * @param {Function} method - The super method (must be bound to the proper this), e.g., super.create.bind(this)
38
+ * @param {any[]} args - The arguments to call the method with
39
+ * @return {any} The result of the super method call
40
+ * @function transactionalSuperCall
41
+ * @memberOf module:transactions
18
42
  */
19
43
  export declare function transactionalSuperCall(method: any, ...args: any): any;