cmp-aws-database 1.1.107-dev.1 → 1.1.107-dev.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.
- package/README.md +82 -5
- package/dist/base-dao.d.ts +1 -2
- package/dist/base-dao.js +11 -22
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -63,23 +63,29 @@ export NODE_ENV=test
|
|
|
63
63
|
|
|
64
64
|
## 🌍 Environment-Specific Behavior
|
|
65
65
|
|
|
66
|
-
###
|
|
66
|
+
### DEV Environment
|
|
67
67
|
- **Database**: Local DynamoDB (http://localhost:8000)
|
|
68
68
|
- **Table Prefix**: `dev-`
|
|
69
69
|
- **Features**: Sequential processing, no caching
|
|
70
70
|
- **Logging**: Debug level
|
|
71
|
+
- **Branch**: `environment/DEV`
|
|
72
|
+
- **NPM Tag**: `@dev`
|
|
71
73
|
|
|
72
|
-
###
|
|
74
|
+
### PRODDEBUG Environment
|
|
73
75
|
- **Database**: AWS DynamoDB
|
|
74
|
-
- **Table Prefix**: `
|
|
76
|
+
- **Table Prefix**: `proddebug-`
|
|
75
77
|
- **Features**: Parallel processing, caching enabled
|
|
76
78
|
- **Logging**: Info level
|
|
79
|
+
- **Branch**: `environment/PRODDEBUG`
|
|
80
|
+
- **NPM Tag**: `@proddebug`
|
|
77
81
|
|
|
78
|
-
###
|
|
82
|
+
### PROD Environment
|
|
79
83
|
- **Database**: AWS DynamoDB
|
|
80
84
|
- **Table Prefix**: None (empty)
|
|
81
85
|
- **Features**: Parallel processing, caching enabled
|
|
82
86
|
- **Logging**: Warn level
|
|
87
|
+
- **Branch**: `environment/PROD`
|
|
88
|
+
- **NPM Tag**: `@latest`
|
|
83
89
|
|
|
84
90
|
### Test Environment
|
|
85
91
|
- **Database**: Local DynamoDB (http://localhost:8000)
|
|
@@ -222,6 +228,77 @@ Apache-2.0
|
|
|
222
228
|
- **Issues**: [GitHub Issues](https://github.com/Surajpatel24-craftmyplate/craft-my-plate-database/issues)
|
|
223
229
|
- **Documentation**: [Package Documentation](https://github.com/Surajpatel24-craftmyplate/craft-my-plate-database#readme)
|
|
224
230
|
|
|
231
|
+
## 🌿 Branch-Based Publishing Strategy
|
|
232
|
+
|
|
233
|
+
### **Branch Structure**
|
|
234
|
+
```
|
|
235
|
+
master (main development)
|
|
236
|
+
├── environment/DEV (DEV environment)
|
|
237
|
+
├── environment/PRODDEBUG (PRODDEBUG environment)
|
|
238
|
+
└── environment/PROD (PROD environment)
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### **Publishing Workflow**
|
|
242
|
+
|
|
243
|
+
#### **1. Create Environment Branches**
|
|
244
|
+
```bash
|
|
245
|
+
# Create all environment branches
|
|
246
|
+
npm run create-branches
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
#### **2. DEV Environment Publishing**
|
|
250
|
+
```bash
|
|
251
|
+
# Switch to DEV branch
|
|
252
|
+
git checkout environment/DEV
|
|
253
|
+
|
|
254
|
+
# Make changes and commit
|
|
255
|
+
git add .
|
|
256
|
+
git commit -m "Add new feature for DEV"
|
|
257
|
+
git push origin environment/DEV
|
|
258
|
+
|
|
259
|
+
# Publish to npm with @dev tag
|
|
260
|
+
npm run deploy:dev
|
|
261
|
+
```
|
|
262
|
+
**Result**: `cmp-aws-database@dev` (version: 1.1.107-dev.1)
|
|
263
|
+
|
|
264
|
+
#### **3. PRODDEBUG Environment Publishing**
|
|
265
|
+
```bash
|
|
266
|
+
# Switch to PRODDEBUG branch
|
|
267
|
+
git checkout environment/PRODDEBUG
|
|
268
|
+
|
|
269
|
+
# Promote changes from DEV
|
|
270
|
+
./scripts/git-workflow.sh promote DEV PRODDEBUG
|
|
271
|
+
|
|
272
|
+
# Publish to npm with @proddebug tag
|
|
273
|
+
npm run deploy:proddebug
|
|
274
|
+
```
|
|
275
|
+
**Result**: `cmp-aws-database@proddebug` (version: 1.1.107-proddebug.1)
|
|
276
|
+
|
|
277
|
+
#### **4. PROD Environment Publishing**
|
|
278
|
+
```bash
|
|
279
|
+
# Switch to PROD branch
|
|
280
|
+
git checkout environment/PROD
|
|
281
|
+
|
|
282
|
+
# Promote changes from PRODDEBUG
|
|
283
|
+
./scripts/git-workflow.sh promote PRODDEBUG PROD
|
|
284
|
+
|
|
285
|
+
# Publish to npm with @latest tag
|
|
286
|
+
npm run deploy:prod
|
|
287
|
+
```
|
|
288
|
+
**Result**: `cmp-aws-database@latest` (version: 1.1.107)
|
|
289
|
+
|
|
290
|
+
### **Installation Commands**
|
|
291
|
+
```bash
|
|
292
|
+
# Install DEV version
|
|
293
|
+
npm install cmp-aws-database@dev
|
|
294
|
+
|
|
295
|
+
# Install PRODDEBUG version
|
|
296
|
+
npm install cmp-aws-database@proddebug
|
|
297
|
+
|
|
298
|
+
# Install PROD version (latest)
|
|
299
|
+
npm install cmp-aws-database@latest
|
|
300
|
+
```
|
|
301
|
+
|
|
225
302
|
## 🔄 Version History
|
|
226
303
|
|
|
227
304
|
- **1.1.107**: Current version with environment-aware configuration
|
|
@@ -229,4 +306,4 @@ Apache-2.0
|
|
|
229
306
|
|
|
230
307
|
---
|
|
231
308
|
|
|
232
|
-
**Note**: This package
|
|
309
|
+
**Note**: This package uses branch-based publishing where each environment has its own branch and publishes with different NPM tags. The same package name is maintained across all environments while providing environment-specific configurations.
|
package/dist/base-dao.d.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { DynamoDB } from '@aws-sdk/client-dynamodb';
|
|
2
1
|
import { DataMapper, ParallelScanOptions, ParallelScanWorkerOptions, QueryOptions, ReadConsistency, ScanOptions } from '@nova-odm/mapper';
|
|
3
2
|
import { ZeroArgumentsConstructor } from '@nova-odm/marshaller';
|
|
4
3
|
import { ConditionExpression, ConditionExpressionPredicate } from '@nova-odm/expressions';
|
|
5
4
|
import { BaseModel } from './base-model';
|
|
6
|
-
export declare const dynamoDB:
|
|
5
|
+
export declare const dynamoDB: any;
|
|
7
6
|
export declare const mapper: DataMapper;
|
|
8
7
|
export declare class GenericDAO<T extends BaseModel> {
|
|
9
8
|
batchUpdate(items: T[], batchSize?: number, authContext?: any): Promise<T[]>;
|
package/dist/base-dao.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.GenericDAO = exports.mapper = exports.dynamoDB = void 0;
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
|
|
5
|
+
const mapper_1 = require("@nova-odm/mapper");
|
|
6
|
+
exports.dynamoDB = new client_dynamodb_1.DynamoDB({
|
|
7
|
+
maxAttempts: 10
|
|
8
|
+
});
|
|
9
|
+
exports.mapper = new mapper_1.DataMapper({ client: exports.dynamoDB });
|
|
9
10
|
class GenericDAO {
|
|
10
11
|
async batchUpdate(items, batchSize = 100, authContext) {
|
|
11
12
|
let success = 0, totalToUpdate = items.length;
|
|
@@ -131,12 +132,9 @@ class GenericDAO {
|
|
|
131
132
|
async delete(item) {
|
|
132
133
|
return await exports.mapper.delete(item, { returnValues: "ALL_OLD" });
|
|
133
134
|
}
|
|
134
|
-
async get(item, readConsistency) {
|
|
135
|
-
// Use environment-specific read consistency if not provided
|
|
136
|
-
const config = environment_config_1.envManager.getDatabaseConfig();
|
|
137
|
-
const consistency = readConsistency || config.readConsistency;
|
|
135
|
+
async get(item, readConsistency = "eventual") {
|
|
138
136
|
const res = await exports.mapper.get(item, {
|
|
139
|
-
readConsistency:
|
|
137
|
+
readConsistency: readConsistency
|
|
140
138
|
});
|
|
141
139
|
return res;
|
|
142
140
|
}
|
|
@@ -161,25 +159,16 @@ class GenericDAO {
|
|
|
161
159
|
}
|
|
162
160
|
return deleteItems;
|
|
163
161
|
}
|
|
164
|
-
async batchGet(items, readConsistency) {
|
|
165
|
-
// Use environment-specific read consistency if not provided
|
|
166
|
-
const config = environment_config_1.envManager.getDatabaseConfig();
|
|
167
|
-
const consistency = readConsistency || config.readConsistency;
|
|
162
|
+
async batchGet(items, readConsistency = "eventual") {
|
|
168
163
|
let getItems = [];
|
|
169
164
|
for await (const item of exports.mapper.batchGet(items, {
|
|
170
|
-
readConsistency:
|
|
165
|
+
readConsistency: readConsistency
|
|
171
166
|
})) {
|
|
172
167
|
getItems.push(item);
|
|
173
168
|
}
|
|
174
169
|
return getItems;
|
|
175
170
|
}
|
|
176
171
|
async parallelBatchGet(inputItems, batchSize = 1000, maxConcurrentSegments = 20, readConsistency) {
|
|
177
|
-
// Check if parallel processing is enabled for this environment
|
|
178
|
-
const config = environment_config_1.envManager.getConfig();
|
|
179
|
-
if (!config.features.enableParallelProcessing) {
|
|
180
|
-
console.warn('Parallel processing is disabled for this environment. Using sequential processing.');
|
|
181
|
-
return this.batchGet(inputItems, readConsistency);
|
|
182
|
-
}
|
|
183
172
|
let startTime = Date.now();
|
|
184
173
|
let items = [];
|
|
185
174
|
items = items.concat(inputItems);
|
|
@@ -253,4 +242,4 @@ class GenericDAO {
|
|
|
253
242
|
}
|
|
254
243
|
}
|
|
255
244
|
exports.GenericDAO = GenericDAO;
|
|
256
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kYW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYmFzZS1kYW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBWUEsZ0VBQTREO0FBQzVELG9FQUF5RDtBQUV6RCwyQ0FBMkM7QUFDOUIsUUFBQSxRQUFRLEdBQUcsa0NBQWUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0FBQy9DLFFBQUEsTUFBTSxHQUFHLGtDQUFlLENBQUMsYUFBYSxFQUFFLENBQUM7QUFFdEQsTUFBYSxVQUFVO0lBQ25CLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBVSxFQUFFLFNBQVMsR0FBRyxHQUFHLEVBQUUsV0FBaUI7UUFDNUQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLGFBQWEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFBO1FBQzdDLElBQUksV0FBVyxHQUFRLEVBQUUsQ0FBQTtRQUN6QixPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEIsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFBO1lBQ2pCLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1lBQ3RDLFFBQVEsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQTtZQUM1RCxJQUFJLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDaEQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDckIsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLFdBQVcsRUFBRSxDQUFDO29CQUMvQixPQUFPLElBQUksQ0FBQyxDQUFBO29CQUNaLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO2dCQUNsQyxDQUFD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SUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVMsRUFBRSxDQUFDLENBQUE7UUFFdEUsT0FBTyxLQUFLLENBQUE7SUFDaEIsQ0FBQztJQUNELE1BQU0sQ0FBQyxpQkFBcUM7UUFDeEMsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQztnQkFDRCxJQUFJLGdCQUFnQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDN0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMvRCxPQUFPLGdCQUFnQixDQUFDO1lBQzVCLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztZQUNqRCxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFBO0lBQ3BCLENBQUM7SUFFRCxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFxQjtRQUM5QixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQzNFLENBQUM7Q0FDSjtBQXBSRCxnQ0FvUkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEeW5hbW9EQiB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1keW5hbW9kYic7XG5pbXBvcnQge1xuICAgIERhdGFNYXBwZXIsXG4gICAgUGFyYWxsZWxTY2FuT3B0aW9ucyxcbiAgICBQYXJhbGxlbFNjYW5Xb3JrZXJPcHRpb25zLFxuICAgIFF1ZXJ5T3B0aW9ucyxcbiAgICBSZWFkQ29uc2lzdGVuY3ksXG4gICAgU2Nhbk9wdGlvbnNcbn0gZnJvbSAnQG5vdmEtb2RtL21hcHBlcic7XG5pbXBvcnQgeyBaZXJvQXJndW1lbnRzQ29uc3RydWN0b3IgfSBmcm9tICdAbm92YS1vZG0vbWFyc2hhbGxlcic7XG5pbXBvcnQgeyBDb25kaXRpb25FeHByZXNzaW9uLCBDb25kaXRpb25FeHByZXNzaW9uUHJlZGljYXRlIH0gZnJvbSAnQG5vdmEtb2RtL2V4cHJlc3Npb25zJztcbmltcG9ydCB7IEJhc2VNb2RlbCB9IGZyb20gJy4vYmFzZS1tb2RlbCc7XG5pbXBvcnQgeyBEYXRhYmFzZUZhY3RvcnkgfSBmcm9tICcuL2NvbmZpZy9kYXRhYmFzZS1mYWN0b3J5JztcbmltcG9ydCB7IGVudk1hbmFnZXIgfSBmcm9tICcuL2NvbmZpZy9lbnZpcm9ubWVudC1jb25maWcnO1xuXG4vLyBVc2UgZW52aXJvbm1lbnQtYXdhcmUgZGF0YWJhc2UgaW5zdGFuY2VzXG5leHBvcnQgY29uc3QgZHluYW1vREIgPSBEYXRhYmFzZUZhY3RvcnkuZ2V0RHluYW1vREJDbGllbnQoKTtcbmV4cG9ydCBjb25zdCBtYXBwZXIgPSBEYXRhYmFzZUZhY3RvcnkuZ2V0RGF0YU1hcHBlcigpO1xuXG5leHBvcnQgY2xhc3MgR2VuZXJpY0RBTzxUIGV4dGVuZHMgQmFzZU1vZGVsPiB7XG4gICAgYXN5bmMgYmF0Y2hVcGRhdGUoaXRlbXM6IFRbXSwgYmF0Y2hTaXplID0gMTAwLCBhdXRoQ29udGV4dD86IGFueSk6IFByb21pc2U8VFtdPiB7XG4gICAgICAgIGxldCBzdWNjZXNzID0gMCwgdG90YWxUb1VwZGF0ZSA9IGl0ZW1zLmxlbmd0aFxuICAgICAgICBsZXQgdXBkYXRlSXRlbXM6IFRbXSA9IFtdXG4gICAgICAgIHdoaWxlIChpdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgcHJvbWlzZXMgPSBbXVxuICAgICAgICAgICAgbGV0IGJhdGNoID0gaXRlbXMuc3BsaWNlKDAsIGJhdGNoU2l6ZSlcbiAgICAgICAgICAgIHByb21pc2VzID0gYmF0Y2gubWFwKGl0ZW0gPT4gdGhpcy51cGRhdGUoaXRlbSwgYXV0aENvbnRleHQpKVxuICAgICAgICAgICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQocHJvbWlzZXMpXG4gICAgICAgICAgICByZXN1bHRzLmZvckVhY2gocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PSBcImZ1bGZpbGxlZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgKz0gMVxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtcy5wdXNoKHJlc3VsdC52YWx1ZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgY29uc29sZS5sb2coYCR7c3VjY2Vzc30vJHt0b3RhbFRvVXBkYXRlfWApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUl0ZW1zXG4gICAgfVxuXG4gICAgYXN5bmMgcGFyYWxsZWxCYXRjaFB1dChpbnB1dEl0ZW1zOiBUW10sIGJhdGNoU2l6ZTogbnVtYmVyID0gMTAwMCwgbWF4Q29uY3VycmVudFNlZ21lbnRzOiBudW1iZXIgPSAyMCwgYXV0aENvbnRleHQ/OiBhbnkpOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICBsZXQgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgICBsZXQgaXRlbXM6IFRbXSA9IFtdXG4gICAgICAgIGl0ZW1zID0gaXRlbXMuY29uY2F0KGlucHV0SXRlbXMpXG4gICAgICAgIGl0ZW1zID0gaXRlbXMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5jcmVhdGVkX3RpbWUgPSBuZXcgRGF0ZSgpXG4gICAgICAgICAgICBpdGVtLmNyZWF0ZWRfdXNlciA9IGF1dGhDb250ZXh0LnVzZXJTdWJcbiAgICAgICAgICAgIHJldHVybiBpdGVtXG4gICAgICAgIH0pXG4gICAgICAgIGxldCBtYXhTZWdtZW50czogVFtdW11bXSA9IFtdXG4gICAgICAgIGxldCBwdXRJdGVtczogVFtdID0gW11cbiAgICAgICAgd2hpbGUgKGl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBiYXRjaCA9IGl0ZW1zLnNwbGljZSgwLCBiYXRjaFNpemUgKiBtYXhDb25jdXJyZW50U2VnbWVudHMpXG4gICAgICAgICAgICBsZXQgc2VnbWVudDogVFtdW10gPSBbXVxuICAgICAgICAgICAgd2hpbGUgKGJhdGNoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBzZWdtZW50LnB1c2goYmF0Y2guc3BsaWNlKDAsIGJhdGNoU2l6ZSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtYXhTZWdtZW50cy5wdXNoKHNlZ21lbnQpXG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBzZWdtZW50IG9mIG1heFNlZ21lbnRzKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgbGV0IHByb21pc2VzOiBQcm9taXNlPFRbXT5bXSA9IFtdXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgYmF0Y2ggbGVuZ3RoID0gJHtzZWdtZW50Lmxlbmd0aH1gKVxuICAgICAgICAgICAgZm9yIChjb25zdCBiYXRjaCBvZiBzZWdtZW50KSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLmJhdGNoUHV0KGJhdGNoLCBhdXRoQ29udGV4dC51c2VyU3ViKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic2VnbWVudCBjb21wbGV0ZVwiKVxuICAgICAgICAgICAgcmVzdWx0LmZvckVhY2goKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIHB1dEl0ZW1zID0gcHV0SXRlbXMuY29uY2F0KHJlcylcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgdGltZSBmb3Igc2VnbWVudCBwdXQgJHtEYXRlLm5vdygpIC0gc3RhcnRUaW1lfWApXG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYHRvdGFsIHRpbWUgZm9yIGNvbXBsZXRlIHBhcmFsbGVsIHB1dCAke0RhdGUubm93KCkgLSBzdGFydFRpbWV9YClcbiAgICAgICAgcmV0dXJuIHB1dEl0ZW1zXG4gICAgfVxuXG4gICAgYXN5bmMgcGFyYWxsZWxCYXRjaERlbGV0ZShpbnB1dEl0ZW1zOiBUW10sIGJhdGNoU2l6ZTogbnVtYmVyID0gMTAwMCwgbWF4Q29uY3VycmVudFNlZ21lbnRzOiBudW1iZXIgPSAyMCk6IFByb21pc2U8VFtdPiB7XG4gICAgICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICAgIGxldCBpdGVtczogVFtdID0gW11cbiAgICAgICAgaXRlbXMgPSBpdGVtcy5jb25jYXQoaW5wdXRJdGVtcylcbiAgICAgICAgbGV0IG1heFNlZ21lbnRzOiBUW11bXVtdID0gW11cbiAgICAgICAgbGV0IHB1dEl0ZW1zOiBUW10gPSBbXVxuICAgICAgICB3aGlsZSAoaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGJhdGNoID0gaXRlbXMuc3BsaWNlKDAsIGJhdGNoU2l6ZSAqIG1heENvbmN1cnJlbnRTZWdtZW50cylcbiAgICAgICAgICAgIGxldCBzZWdtZW50OiBUW11bXSA9IFtdXG4gICAgICAgICAgICB3aGlsZSAoYmF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHNlZ21lbnQucHVzaChiYXRjaC5zcGxpY2UoMCwgYmF0Y2hTaXplKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1heFNlZ21lbnRzLnB1c2goc2VnbWVudClcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgbWF4U2VnbWVudHMpIHtcbiAgICAgICAgICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICAgICAgICBsZXQgcHJvbWlzZXM6IFByb21pc2U8VFtdPltdID0gW11cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBiYXRjaCBsZW5ndGggPSAke3NlZ21lbnQubGVuZ3RofWApXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGJhdGNoIG9mIHNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuYmF0Y2hEZWxldGUoYmF0Y2gpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKVxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzZWdtZW50IGNvbXBsZXRlXCIpXG4gICAgICAgICAgICByZXN1bHQuZm9yRWFjaCgocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgcHV0SXRlbXMgPSBwdXRJdGVtcy5jb25jYXQocmVzKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGB0aW1lIGZvciBzZWdtZW50IGRlbGV0ZSAke0RhdGUubm93KCkgLSBzdGFydFRpbWV9YClcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgdG90YWwgdGltZSBmb3IgY29tcGxldGUgcGFyYWxsZWwgZGVsZXRlICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1gKVxuICAgICAgICByZXR1cm4gcHV0SXRlbXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGhhcyB0byBiZSB1c2VkIG9ubHkgaW4gdGhlIHNjcmlwdHMuXG4gICAgICogXG4gICAgICogQHBhcmFtIHZhbHVlQ29uc3RydWN0b3IgdGhlIG1vZGVsIGNsYXNzXG4gICAgICovXG4gICAgYXN5bmMgcGFyYWxsZWxTY2FuKHZhbHVlQ29uc3RydWN0b3I6IFplcm9Bcmd1bWVudHNDb25zdHJ1Y3RvcjxUPiwgb3B0aW9ucz86IFBhcmFsbGVsU2Nhbk9wdGlvbnMpOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICBsZXQgaXRlbXM6IFRbXSA9IFtdXG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBtYXBwZXIucGFyYWxsZWxTY2FuKHZhbHVlQ29uc3RydWN0b3IsIDQsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pXG4gICAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoICUgMTAwMDAwID09IDApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJlYWQgMTAwS1wiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtc1xuICAgIH1cblxuICAgIGFzeW5jIHNjYW4odmFsdWVDb25zdHJ1Y3RvcjogWmVyb0FyZ3VtZW50c0NvbnN0cnVjdG9yPFQ+LCBvcHRpb25zPzogU2Nhbk9wdGlvbnMgfCBQYXJhbGxlbFNjYW5Xb3JrZXJPcHRpb25zKTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgbGV0IGl0ZW1zOiBUW10gPSBbXVxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgbWFwcGVyLnNjYW4odmFsdWVDb25zdHJ1Y3Rvciwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbXNcbiAgICB9XG5cbiAgICBhc3luYyBzYXZlKGl0ZW06IFQsIGF1dGhDb250ZXh0PzogYW55KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGl0ZW0uY3JlYXRlZF90aW1lID0gbmV3IERhdGUoKVxuICAgICAgICBpdGVtLmNyZWF0ZWRfdXNlciA9IGF1dGhDb250ZXh0LnVzZXJTdWJcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgbWFwcGVyLnB1dChpdGVtKVxuICAgICAgICByZXR1cm4gcmVzXG4gICAgfVxuXG4gICAgYXN5bmMgdXBkYXRlKGl0ZW06IFQsIGF1dGhDb250ZXh0PzogYW55KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGl0ZW0udXBkYXRlZF90aW1lID0gbmV3IERhdGUoKVxuICAgICAgICBpdGVtLnVwZGF0ZWRfdXNlciA9IGF1dGhDb250ZXh0LnVzZXJTdWJcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgbWFwcGVyLnVwZGF0ZShpdGVtLCB7XG4gICAgICAgICAgICBvbk1pc3Npbmc6IFwic2tpcFwiXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiByZXNcbiAgICB9XG5cbiAgICBhc3luYyBkZWxldGUoaXRlbTogVCk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgbWFwcGVyLmRlbGV0ZShpdGVtLCB7IHJldHVyblZhbHVlczogXCJBTExfT0xEXCIgfSlcbiAgICB9XG5cbiAgICBhc3luYyBnZXQoaXRlbTogVCwgcmVhZENvbnNpc3RlbmN5PzogUmVhZENvbnNpc3RlbmN5KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIC8vIFVzZSBlbnZpcm9ubWVudC1zcGVjaWZpYyByZWFkIGNvbnNpc3RlbmN5IGlmIG5vdCBwcm92aWRlZFxuICAgICAgICBjb25zdCBjb25maWcgPSBlbnZNYW5hZ2VyLmdldERhdGFiYXNlQ29uZmlnKCk7XG4gICAgICAgIGNvbnN0IGNvbnNpc3RlbmN5ID0gcmVhZENvbnNpc3RlbmN5IHx8IGNvbmZpZy5yZWFkQ29uc2lzdGVuY3k7XG5cbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgbWFwcGVyLmdldChpdGVtLCB7XG4gICAgICAgICAgICByZWFkQ29uc2lzdGVuY3k6IGNvbnNpc3RlbmN5XG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiByZXNcbiAgICB9XG5cbiAgICBhc3luYyBiYXRjaFB1dChpdGVtczogVFtdLCBhdXRoQ29udGV4dD86IGFueSk6IFByb21pc2U8VFtdPiB7XG5cbiAgICAgICAgbGV0IGZpbmFsSXRlbXM6IFRbXSA9IFtdXG4gICAgICAgIGl0ZW1zID0gaXRlbXMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5jcmVhdGVkX3RpbWUgPSBuZXcgRGF0ZSgpXG4gICAgICAgICAgICBpdGVtLmNyZWF0ZWRfdXNlciA9IGF1dGhDb250ZXh0LnVzZXJTdWJcbiAgICAgICAgICAgIHJldHVybiBpdGVtXG4gICAgICAgIH0pXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCBcIml0ZW06XCIsIGl0ZW1zIClcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIG1hcHBlci5iYXRjaFB1dChpdGVtcykpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGl0ZW0pXG4gICAgICAgICAgICBmaW5hbEl0ZW1zLnB1c2goaXRlbSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmluYWxJdGVtc1xuICAgIH1cblxuICAgIGFzeW5jIGJhdGNoRGVsZXRlKGl0ZW1zOiBUW10pOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICBsZXQgZGVsZXRlSXRlbXM6IFRbXSA9IFtdXG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBtYXBwZXIuYmF0Y2hEZWxldGUoaXRlbXMpKSB7XG4gICAgICAgICAgICBkZWxldGVJdGVtcy5wdXNoKGl0ZW0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlbGV0ZUl0ZW1zXG4gICAgfVxuXG4gICAgYXN5bmMgYmF0Y2hHZXQoaXRlbXM6IFRbXSwgcmVhZENvbnNpc3RlbmN5PzogUmVhZENvbnNpc3RlbmN5KTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgLy8gVXNlIGVudmlyb25tZW50LXNwZWNpZmljIHJlYWQgY29uc2lzdGVuY3kgaWYgbm90IHByb3ZpZGVkXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGVudk1hbmFnZXIuZ2V0RGF0YWJhc2VDb25maWcoKTtcbiAgICAgICAgY29uc3QgY29uc2lzdGVuY3kgPSByZWFkQ29uc2lzdGVuY3kgfHwgY29uZmlnLnJlYWRDb25zaXN0ZW5jeTtcblxuICAgICAgICBsZXQgZ2V0SXRlbXM6IFRbXSA9IFtdXG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBtYXBwZXIuYmF0Y2hHZXQoaXRlbXMsIHtcbiAgICAgICAgICAgIHJlYWRDb25zaXN0ZW5jeTogY29uc2lzdGVuY3lcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICAgIGdldEl0ZW1zLnB1c2goaXRlbSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2V0SXRlbXNcbiAgICB9XG5cbiAgICBhc3luYyBwYXJhbGxlbEJhdGNoR2V0KGlucHV0SXRlbXM6IFRbXSwgYmF0Y2hTaXplOiBudW1iZXIgPSAxMDAwLCBtYXhDb25jdXJyZW50U2VnbWVudHM6IG51bWJlciA9IDIwLCByZWFkQ29uc2lzdGVuY3k/OiBSZWFkQ29uc2lzdGVuY3kpOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICAvLyBDaGVjayBpZiBwYXJhbGxlbCBwcm9jZXNzaW5nIGlzIGVuYWJsZWQgZm9yIHRoaXMgZW52aXJvbm1lbnRcbiAgICAgICAgY29uc3QgY29uZmlnID0gZW52TWFuYWdlci5nZXRDb25maWcoKTtcbiAgICAgICAgaWYgKCFjb25maWcuZmVhdHVyZXMuZW5hYmxlUGFyYWxsZWxQcm9jZXNzaW5nKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1BhcmFsbGVsIHByb2Nlc3NpbmcgaXMgZGlzYWJsZWQgZm9yIHRoaXMgZW52aXJvbm1lbnQuIFVzaW5nIHNlcXVlbnRpYWwgcHJvY2Vzc2luZy4nKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJhdGNoR2V0KGlucHV0SXRlbXMsIHJlYWRDb25zaXN0ZW5jeSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgICBsZXQgaXRlbXM6IFRbXSA9IFtdXG4gICAgICAgIGl0ZW1zID0gaXRlbXMuY29uY2F0KGlucHV0SXRlbXMpXG4gICAgICAgIGxldCBtYXhTZWdtZW50czogVFtdW11bXSA9IFtdXG4gICAgICAgIGxldCByZXN1bHRJdGVtczogVFtdID0gW11cbiAgICAgICAgd2hpbGUgKGl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBiYXRjaCA9IGl0ZW1zLnNwbGljZSgwLCBiYXRjaFNpemUgKiBtYXhDb25jdXJyZW50U2VnbWVudHMpXG4gICAgICAgICAgICBsZXQgc2VnbWVudDogVFtdW10gPSBbXVxuICAgICAgICAgICAgd2hpbGUgKGJhdGNoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBzZWdtZW50LnB1c2goYmF0Y2guc3BsaWNlKDAsIGJhdGNoU2l6ZSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtYXhTZWdtZW50cy5wdXNoKHNlZ21lbnQpXG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBzZWdtZW50IG9mIG1heFNlZ21lbnRzKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgbGV0IHByb21pc2VzOiBQcm9taXNlPFRbXT5bXSA9IFtdXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgYmF0Y2ggbGVuZ3RoID0gJHtzZWdtZW50Lmxlbmd0aH1gKVxuICAgICAgICAgICAgZm9yIChjb25zdCBiYXRjaCBvZiBzZWdtZW50KSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLmJhdGNoR2V0KGJhdGNoLCByZWFkQ29uc2lzdGVuY3kpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKVxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzZWdtZW50IGNvbXBsZXRlXCIpXG4gICAgICAgICAgICByZXN1bHQuZm9yRWFjaCgocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzdWx0SXRlbXMgPSByZXN1bHRJdGVtcy5jb25jYXQocmVzKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGB0aW1lIGZvciBzZWdtZW50IGdldCAke0RhdGUubm93KCkgLSBzdGFydFRpbWV9YClcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgdG90YWwgdGltZSBmb3IgY29tcGxldGUgcGFyYWxsZWwgZ2V0ICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1gKVxuICAgICAgICByZXR1cm4gcmVzdWx0SXRlbXNcbiAgICB9XG4gICAgYXN5bmMgcGFyYWxsZWxRdWVyeShcbiAgICAgICAgdmFsdWVDb25zdHJ1Y3RvcjogWmVyb0FyZ3VtZW50c0NvbnN0cnVjdG9yPFQ+LFxuICAgICAgICBrZXlDb25kaXRpb25zOiBBcnJheTxDb25kaXRpb25FeHByZXNzaW9uIHwgeyBbcHJvcGVydHlOYW1lOiBzdHJpbmddOiBDb25kaXRpb25FeHByZXNzaW9uUHJlZGljYXRlIHwgYW55IH0+LFxuICAgICAgICBtYXhDb25jdXJyZW50Q2FsbHM6IG51bWJlciA9IDIwLFxuICAgICAgICBvcHRpb25zPzogUXVlcnlPcHRpb25zLFxuXG4gICAgKTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgICBjb25zdCByZXN1bHRzOiBUW10gPSBbXVxuICAgICAgICB3aGlsZSAoa2V5Q29uZGl0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBzZWdtZW50Q29uZGl0aW9ucyA9IGtleUNvbmRpdGlvbnMuc3BsaWNlKDAsIG1heENvbmN1cnJlbnRDYWxscylcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5UHJvbWlzZXMgPSBzZWdtZW50Q29uZGl0aW9ucy5tYXAoKGtleUNvbmRpdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmN1c3RvbVF1ZXJ5KHZhbHVlQ29uc3RydWN0b3IsIGtleUNvbmRpdGlvbiwgb3B0aW9ucylcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3QgcXVlcnlSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwocXVlcnlQcm9taXNlcylcblxuICAgICAgICAgICAgZm9yIChjb25zdCBxdWVyeVJlc3VsdCBvZiBxdWVyeVJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goLi4ucXVlcnlSZXN1bHQpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYHRvdGFsIHRpbWUgZm9yIGNvbXBsZXRlIHBhcmFsbGVsIHF1ZXJ5ICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1gKVxuICAgICAgICByZXR1cm4gcmVzdWx0c1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGN1c3RvbVF1ZXJ5KFxuICAgICAgICB2YWx1ZUNvbnN0cnVjdG9yOiBaZXJvQXJndW1lbnRzQ29uc3RydWN0b3I8VD4sXG4gICAgICAgIGtleUNvbmRpdGlvbnM6IENvbmRpdGlvbkV4cHJlc3Npb24gfCB7IFtwcm9wZXJ0eU5hbWU6IHN0cmluZ106IENvbmRpdGlvbkV4cHJlc3Npb25QcmVkaWNhdGUgfCBhbnkgfSxcbiAgICAgICAgb3B0aW9ucz86IFF1ZXJ5T3B0aW9uc1xuICAgICk6IFByb21pc2U8VFtdPiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KClcbiAgICAgICAgY29uc3QgaXRlbXM6IFRbXSA9IFtdXG5cbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIG1hcHBlci5xdWVyeSh2YWx1ZUNvbnN0cnVjdG9yLCBrZXlDb25kaXRpb25zLCBvcHRpb25zKSkge1xuICAgICAgICAgICAgaXRlbXMucHVzaChpdGVtKVxuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGB0b3RhbCB0aW1lIGZvciBjb21wbGV0ZSBxdWVyeSAke0RhdGUubm93KCkgLSBzdGFydFRpbWV9YClcblxuICAgICAgICByZXR1cm4gaXRlbXNcbiAgICB9XG4gICAgZGVjb2RlKGNvbnRpbnVhdGlvblRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGNvbnRpbnVhdGlvblRva2VuKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBsYXN0RXZhbHVhdGVkS2V5ID0gSlNPTi5wYXJzZShCdWZmZXIuZnJvbShjb250aW51YXRpb25Ub2tlbiwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCd1dGY4JykpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSW5jb21pbmcgTGFzdCBFdmFsdWF0ZWQgS2V5IFwiICsgbGFzdEV2YWx1YXRlZEtleSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RFdmFsdWF0ZWRLZXk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb250aW51YXRpb25Ub2tlbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBhc3luYyBlbmNvZGUobGFzdEV2YWx1YXRlZEtleTogYW55KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KGxhc3RFdmFsdWF0ZWRLZXkpKS50b1N0cmluZygnYmFzZTY0JylcbiAgICB9XG59Il19
|
|
245
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kYW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYmFzZS1kYW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsOERBQW9EO0FBQ3BELDZDQU8wQjtBQU1iLFFBQUEsUUFBUSxHQUFHLElBQUksMEJBQVEsQ0FBQztJQUNqQyxXQUFXLEVBQUUsRUFBRTtDQUNsQixDQUFRLENBQUE7QUFDSSxRQUFBLE1BQU0sR0FBRyxJQUFJLG1CQUFVLENBQUMsRUFBRSxNQUFNLEVBQUUsZ0JBQVEsRUFBRSxDQUFDLENBQUM7QUFFM0QsTUFBYSxVQUFVO0lBQ25CLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBVSxFQUFFLFNBQVMsR0FBRyxHQUFHLEVBQUUsV0FBaUI7UUFDNUQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLGFBQWEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFBO1FBQzdDLElBQUksV0FBVyxHQUFRLEVBQUUsQ0FBQTtRQUN6QixPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEIsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFBO1lBQ2pCLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1lBQ3RDLFFBQVEsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQTtZQUM1RCxJQUFJLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDaEQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDckIsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLFdBQVcsRUFBRSxDQUFDO29CQUMvQixPQUFPLElBQUksQ0FBQyxDQUFBO29CQUNaLFdBQVcsQ0FBQyxJQUFJLENBQUMs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Q0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBQ2pELENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUE7SUFDcEIsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNLENBQUMsZ0JBQXFCO1FBQzlCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDM0UsQ0FBQztDQUNKO0FBclFELGdDQXFRQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IER5bmFtb0RCIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWR5bmFtb2RiJztcbmltcG9ydCB7XG4gICAgRGF0YU1hcHBlcixcbiAgICBQYXJhbGxlbFNjYW5PcHRpb25zLFxuICAgIFBhcmFsbGVsU2Nhbldvcmtlck9wdGlvbnMsXG4gICAgUXVlcnlPcHRpb25zLFxuICAgIFJlYWRDb25zaXN0ZW5jeSxcbiAgICBTY2FuT3B0aW9uc1xufSBmcm9tICdAbm92YS1vZG0vbWFwcGVyJztcbmltcG9ydCB7IFplcm9Bcmd1bWVudHNDb25zdHJ1Y3RvciB9IGZyb20gJ0Bub3ZhLW9kbS9tYXJzaGFsbGVyJztcbmltcG9ydCB7IENvbmRpdGlvbkV4cHJlc3Npb24sIENvbmRpdGlvbkV4cHJlc3Npb25QcmVkaWNhdGUgfSBmcm9tICdAbm92YS1vZG0vZXhwcmVzc2lvbnMnO1xuaW1wb3J0IHsgQmFzZU1vZGVsIH0gZnJvbSAnLi9iYXNlLW1vZGVsJztcblxuXG5leHBvcnQgY29uc3QgZHluYW1vREIgPSBuZXcgRHluYW1vREIoe1xuICAgIG1heEF0dGVtcHRzOiAxMFxufSkgYXMgYW55XG5leHBvcnQgY29uc3QgbWFwcGVyID0gbmV3IERhdGFNYXBwZXIoeyBjbGllbnQ6IGR5bmFtb0RCIH0pO1xuXG5leHBvcnQgY2xhc3MgR2VuZXJpY0RBTzxUIGV4dGVuZHMgQmFzZU1vZGVsPiB7XG4gICAgYXN5bmMgYmF0Y2hVcGRhdGUoaXRlbXM6IFRbXSwgYmF0Y2hTaXplID0gMTAwLCBhdXRoQ29udGV4dD86IGFueSk6IFByb21pc2U8VFtdPiB7XG4gICAgICAgIGxldCBzdWNjZXNzID0gMCwgdG90YWxUb1VwZGF0ZSA9IGl0ZW1zLmxlbmd0aFxuICAgICAgICBsZXQgdXBkYXRlSXRlbXM6IFRbXSA9IFtdXG4gICAgICAgIHdoaWxlIChpdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgcHJvbWlzZXMgPSBbXVxuICAgICAgICAgICAgbGV0IGJhdGNoID0gaXRlbXMuc3BsaWNlKDAsIGJhdGNoU2l6ZSlcbiAgICAgICAgICAgIHByb21pc2VzID0gYmF0Y2gubWFwKGl0ZW0gPT4gdGhpcy51cGRhdGUoaXRlbSwgYXV0aENvbnRleHQpKVxuICAgICAgICAgICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQocHJvbWlzZXMpXG4gICAgICAgICAgICByZXN1bHRzLmZvckVhY2gocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PSBcImZ1bGZpbGxlZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgKz0gMVxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtcy5wdXNoKHJlc3VsdC52YWx1ZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgY29uc29sZS5sb2coYCR7c3VjY2Vzc30vJHt0b3RhbFRvVXBkYXRlfWApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUl0ZW1zXG4gICAgfVxuXG4gICAgYXN5bmMgcGFyYWxsZWxCYXRjaFB1dChpbnB1dEl0ZW1zOiBUW10sIGJhdGNoU2l6ZTogbnVtYmVyID0gMTAwMCwgbWF4Q29uY3VycmVudFNlZ21lbnRzOiBudW1iZXIgPSAyMCwgYXV0aENvbnRleHQ/OiBhbnkpOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICBsZXQgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgICBsZXQgaXRlbXM6IFRbXSA9IFtdXG4gICAgICAgIGl0ZW1zID0gaXRlbXMuY29uY2F0KGlucHV0SXRlbXMpXG4gICAgICAgIGl0ZW1zID0gaXRlbXMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5jcmVhdGVkX3RpbWUgPSBuZXcgRGF0ZSgpXG4gICAgICAgICAgICBpdGVtLmNyZWF0ZWRfdXNlciA9IGF1dGhDb250ZXh0LnVzZXJTdWJcbiAgICAgICAgICAgIHJldHVybiBpdGVtXG4gICAgICAgIH0pXG4gICAgICAgIGxldCBtYXhTZWdtZW50czogVFtdW11bXSA9IFtdXG4gICAgICAgIGxldCBwdXRJdGVtczogVFtdID0gW11cbiAgICAgICAgd2hpbGUgKGl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBiYXRjaCA9IGl0ZW1zLnNwbGljZSgwLCBiYXRjaFNpemUgKiBtYXhDb25jdXJyZW50U2VnbWVudHMpXG4gICAgICAgICAgICBsZXQgc2VnbWVudDogVFtdW10gPSBbXVxuICAgICAgICAgICAgd2hpbGUgKGJhdGNoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBzZWdtZW50LnB1c2goYmF0Y2guc3BsaWNlKDAsIGJhdGNoU2l6ZSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtYXhTZWdtZW50cy5wdXNoKHNlZ21lbnQpXG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBzZWdtZW50IG9mIG1heFNlZ21lbnRzKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgbGV0IHByb21pc2VzOiBQcm9taXNlPFRbXT5bXSA9IFtdXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgYmF0Y2ggbGVuZ3RoID0gJHtzZWdtZW50Lmxlbmd0aH1gKVxuICAgICAgICAgICAgZm9yIChjb25zdCBiYXRjaCBvZiBzZWdtZW50KSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLmJhdGNoUHV0KGJhdGNoLCBhdXRoQ29udGV4dC51c2VyU3ViKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic2VnbWVudCBjb21wbGV0ZVwiKVxuICAgICAgICAgICAgcmVzdWx0LmZvckVhY2goKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIHB1dEl0ZW1zID0gcHV0SXRlbXMuY29uY2F0KHJlcylcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgdGltZSBmb3Igc2VnbWVudCBwdXQgJHtEYXRlLm5vdygpIC0gc3RhcnRUaW1lfWApXG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYHRvdGFsIHRpbWUgZm9yIGNvbXBsZXRlIHBhcmFsbGVsIHB1dCAke0RhdGUubm93KCkgLSBzdGFydFRpbWV9YClcbiAgICAgICAgcmV0dXJuIHB1dEl0ZW1zXG4gICAgfVxuXG4gICAgYXN5bmMgcGFyYWxsZWxCYXRjaERlbGV0ZShpbnB1dEl0ZW1zOiBUW10sIGJhdGNoU2l6ZTogbnVtYmVyID0gMTAwMCwgbWF4Q29uY3VycmVudFNlZ21lbnRzOiBudW1iZXIgPSAyMCk6IFByb21pc2U8VFtdPiB7XG4gICAgICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICAgIGxldCBpdGVtczogVFtdID0gW11cbiAgICAgICAgaXRlbXMgPSBpdGVtcy5jb25jYXQoaW5wdXRJdGVtcylcbiAgICAgICAgbGV0IG1heFNlZ21lbnRzOiBUW11bXVtdID0gW11cbiAgICAgICAgbGV0IHB1dEl0ZW1zOiBUW10gPSBbXVxuICAgICAgICB3aGlsZSAoaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGJhdGNoID0gaXRlbXMuc3BsaWNlKDAsIGJhdGNoU2l6ZSAqIG1heENvbmN1cnJlbnRTZWdtZW50cylcbiAgICAgICAgICAgIGxldCBzZWdtZW50OiBUW11bXSA9IFtdXG4gICAgICAgICAgICB3aGlsZSAoYmF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHNlZ21lbnQucHVzaChiYXRjaC5zcGxpY2UoMCwgYmF0Y2hTaXplKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1heFNlZ21lbnRzLnB1c2goc2VnbWVudClcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgbWF4U2VnbWVudHMpIHtcbiAgICAgICAgICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICAgICAgICBsZXQgcHJvbWlzZXM6IFByb21pc2U8VFtdPltdID0gW11cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBiYXRjaCBsZW5ndGggPSAke3NlZ21lbnQubGVuZ3RofWApXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGJhdGNoIG9mIHNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuYmF0Y2hEZWxldGUoYmF0Y2gpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKVxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzZWdtZW50IGNvbXBsZXRlXCIpXG4gICAgICAgICAgICByZXN1bHQuZm9yRWFjaCgocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgcHV0SXRlbXMgPSBwdXRJdGVtcy5jb25jYXQocmVzKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGB0aW1lIGZvciBzZWdtZW50IGRlbGV0ZSAke0RhdGUubm93KCkgLSBzdGFydFRpbWV9YClcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgdG90YWwgdGltZSBmb3IgY29tcGxldGUgcGFyYWxsZWwgZGVsZXRlICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1gKVxuICAgICAgICByZXR1cm4gcHV0SXRlbXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGhhcyB0byBiZSB1c2VkIG9ubHkgaW4gdGhlIHNjcmlwdHMuXG4gICAgICogXG4gICAgICogQHBhcmFtIHZhbHVlQ29uc3RydWN0b3IgdGhlIG1vZGVsIGNsYXNzXG4gICAgICovXG4gICAgYXN5bmMgcGFyYWxsZWxTY2FuKHZhbHVlQ29uc3RydWN0b3I6IFplcm9Bcmd1bWVudHNDb25zdHJ1Y3RvcjxUPiwgb3B0aW9ucz86IFBhcmFsbGVsU2Nhbk9wdGlvbnMpOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICBsZXQgaXRlbXM6IFRbXSA9IFtdXG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBtYXBwZXIucGFyYWxsZWxTY2FuKHZhbHVlQ29uc3RydWN0b3IsIDQsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pXG4gICAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoICUgMTAwMDAwID09IDApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJlYWQgMTAwS1wiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtc1xuICAgIH1cblxuICAgIGFzeW5jIHNjYW4odmFsdWVDb25zdHJ1Y3RvcjogWmVyb0FyZ3VtZW50c0NvbnN0cnVjdG9yPFQ+LCBvcHRpb25zPzogU2Nhbk9wdGlvbnMgfCBQYXJhbGxlbFNjYW5Xb3JrZXJPcHRpb25zKTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgbGV0IGl0ZW1zOiBUW10gPSBbXVxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgbWFwcGVyLnNjYW4odmFsdWVDb25zdHJ1Y3Rvciwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbXNcbiAgICB9XG5cbiAgICBhc3luYyBzYXZlKGl0ZW06IFQsIGF1dGhDb250ZXh0PzogYW55KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGl0ZW0uY3JlYXRlZF90aW1lID0gbmV3IERhdGUoKVxuICAgICAgICBpdGVtLmNyZWF0ZWRfdXNlciA9IGF1dGhDb250ZXh0LnVzZXJTdWJcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgbWFwcGVyLnB1dChpdGVtKVxuICAgICAgICByZXR1cm4gcmVzXG4gICAgfVxuXG4gICAgYXN5bmMgdXBkYXRlKGl0ZW06IFQsIGF1dGhDb250ZXh0PzogYW55KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGl0ZW0udXBkYXRlZF90aW1lID0gbmV3IERhdGUoKVxuICAgICAgICBpdGVtLnVwZGF0ZWRfdXNlciA9IGF1dGhDb250ZXh0LnVzZXJTdWJcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgbWFwcGVyLnVwZGF0ZShpdGVtLCB7XG4gICAgICAgICAgICBvbk1pc3Npbmc6IFwic2tpcFwiXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiByZXNcbiAgICB9XG5cbiAgICBhc3luYyBkZWxldGUoaXRlbTogVCk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgbWFwcGVyLmRlbGV0ZShpdGVtLCB7IHJldHVyblZhbHVlczogXCJBTExfT0xEXCIgfSlcbiAgICB9XG5cbiAgICBhc3luYyBnZXQoaXRlbTogVCwgcmVhZENvbnNpc3RlbmN5OiBSZWFkQ29uc2lzdGVuY3kgPSBcImV2ZW50dWFsXCIpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgbWFwcGVyLmdldChpdGVtLCB7XG4gICAgICAgICAgICByZWFkQ29uc2lzdGVuY3k6IHJlYWRDb25zaXN0ZW5jeVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gcmVzXG4gICAgfVxuXG4gICAgYXN5bmMgYmF0Y2hQdXQoaXRlbXM6IFRbXSwgYXV0aENvbnRleHQ/OiBhbnkpOiBQcm9taXNlPFRbXT4ge1xuXG4gICAgICAgIGxldCBmaW5hbEl0ZW1zOiBUW10gPSBbXVxuICAgICAgICBpdGVtcyA9IGl0ZW1zLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0uY3JlYXRlZF90aW1lID0gbmV3IERhdGUoKVxuICAgICAgICAgICAgaXRlbS5jcmVhdGVkX3VzZXIgPSBhdXRoQ29udGV4dC51c2VyU3ViXG4gICAgICAgICAgICByZXR1cm4gaXRlbVxuICAgICAgICB9KVxuICAgICAgICAvLyBjb25zb2xlLmxvZyggXCJpdGVtOlwiLCBpdGVtcyApXG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBtYXBwZXIuYmF0Y2hQdXQoaXRlbXMpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhpdGVtKVxuICAgICAgICAgICAgZmluYWxJdGVtcy5wdXNoKGl0ZW0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbmFsSXRlbXNcbiAgICB9XG5cbiAgICBhc3luYyBiYXRjaERlbGV0ZShpdGVtczogVFtdKTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgbGV0IGRlbGV0ZUl0ZW1zOiBUW10gPSBbXVxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgbWFwcGVyLmJhdGNoRGVsZXRlKGl0ZW1zKSkge1xuICAgICAgICAgICAgZGVsZXRlSXRlbXMucHVzaChpdGVtKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWxldGVJdGVtc1xuICAgIH1cblxuICAgIGFzeW5jIGJhdGNoR2V0KGl0ZW1zOiBUW10sIHJlYWRDb25zaXN0ZW5jeTogUmVhZENvbnNpc3RlbmN5ID0gXCJldmVudHVhbFwiKTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgbGV0IGdldEl0ZW1zOiBUW10gPSBbXVxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgbWFwcGVyLmJhdGNoR2V0KGl0ZW1zLCB7XG4gICAgICAgICAgICByZWFkQ29uc2lzdGVuY3k6IHJlYWRDb25zaXN0ZW5jeVxuICAgICAgICB9KSkge1xuICAgICAgICAgICAgZ2V0SXRlbXMucHVzaChpdGVtKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXRJdGVtc1xuICAgIH1cblxuICAgIGFzeW5jIHBhcmFsbGVsQmF0Y2hHZXQoaW5wdXRJdGVtczogVFtdLCBiYXRjaFNpemU6IG51bWJlciA9IDEwMDAsIG1heENvbmN1cnJlbnRTZWdtZW50czogbnVtYmVyID0gMjAsIHJlYWRDb25zaXN0ZW5jeT86IFJlYWRDb25zaXN0ZW5jeSk6IFByb21pc2U8VFtdPiB7XG4gICAgICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICAgIGxldCBpdGVtczogVFtdID0gW11cbiAgICAgICAgaXRlbXMgPSBpdGVtcy5jb25jYXQoaW5wdXRJdGVtcylcbiAgICAgICAgbGV0IG1heFNlZ21lbnRzOiBUW11bXVtdID0gW11cbiAgICAgICAgbGV0IHJlc3VsdEl0ZW1zOiBUW10gPSBbXVxuICAgICAgICB3aGlsZSAoaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGJhdGNoID0gaXRlbXMuc3BsaWNlKDAsIGJhdGNoU2l6ZSAqIG1heENvbmN1cnJlbnRTZWdtZW50cylcbiAgICAgICAgICAgIGxldCBzZWdtZW50OiBUW11bXSA9IFtdXG4gICAgICAgICAgICB3aGlsZSAoYmF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHNlZ21lbnQucHVzaChiYXRjaC5zcGxpY2UoMCwgYmF0Y2hTaXplKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1heFNlZ21lbnRzLnB1c2goc2VnbWVudClcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgbWF4U2VnbWVudHMpIHtcbiAgICAgICAgICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICAgICAgICBsZXQgcHJvbWlzZXM6IFByb21pc2U8VFtdPltdID0gW11cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBiYXRjaCBsZW5ndGggPSAke3NlZ21lbnQubGVuZ3RofWApXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGJhdGNoIG9mIHNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuYmF0Y2hHZXQoYmF0Y2gsIHJlYWRDb25zaXN0ZW5jeSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInNlZ21lbnQgY29tcGxldGVcIilcbiAgICAgICAgICAgIHJlc3VsdC5mb3JFYWNoKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICByZXN1bHRJdGVtcyA9IHJlc3VsdEl0ZW1zLmNvbmNhdChyZXMpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgY29uc29sZS5sb2coYHRpbWUgZm9yIHNlZ21lbnQgZ2V0ICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1gKVxuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGB0b3RhbCB0aW1lIGZvciBjb21wbGV0ZSBwYXJhbGxlbCBnZXQgJHtEYXRlLm5vdygpIC0gc3RhcnRUaW1lfWApXG4gICAgICAgIHJldHVybiByZXN1bHRJdGVtc1xuICAgIH1cbiAgICBhc3luYyBwYXJhbGxlbFF1ZXJ5KFxuICAgICAgICB2YWx1ZUNvbnN0cnVjdG9yOiBaZXJvQXJndW1lbnRzQ29uc3RydWN0b3I8VD4sXG4gICAgICAgIGtleUNvbmRpdGlvbnM6IEFycmF5PENvbmRpdGlvbkV4cHJlc3Npb24gfCB7IFtwcm9wZXJ0eU5hbWU6IHN0cmluZ106IENvbmRpdGlvbkV4cHJlc3Npb25QcmVkaWNhdGUgfCBhbnkgfT4sXG4gICAgICAgIG1heENvbmN1cnJlbnRDYWxsczogbnVtYmVyID0gMjAsXG4gICAgICAgIG9wdGlvbnM/OiBRdWVyeU9wdGlvbnMsXG5cbiAgICApOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICAgIGNvbnN0IHJlc3VsdHM6IFRbXSA9IFtdXG4gICAgICAgIHdoaWxlIChrZXlDb25kaXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRDb25kaXRpb25zID0ga2V5Q29uZGl0aW9ucy5zcGxpY2UoMCwgbWF4Q29uY3VycmVudENhbGxzKVxuICAgICAgICAgICAgY29uc3QgcXVlcnlQcm9taXNlcyA9IHNlZ21lbnRDb25kaXRpb25zLm1hcCgoa2V5Q29uZGl0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tUXVlcnkodmFsdWVDb25zdHJ1Y3Rvciwga2V5Q29uZGl0aW9uLCBvcHRpb25zKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBxdWVyeVJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChxdWVyeVByb21pc2VzKVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHF1ZXJ5UmVzdWx0IG9mIHF1ZXJ5UmVzdWx0cykge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCguLi5xdWVyeVJlc3VsdClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgdG90YWwgdGltZSBmb3IgY29tcGxldGUgcGFyYWxsZWwgcXVlcnkgJHtEYXRlLm5vdygpIC0gc3RhcnRUaW1lfWApXG4gICAgICAgIHJldHVybiByZXN1bHRzXG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgY3VzdG9tUXVlcnkoXG4gICAgICAgIHZhbHVlQ29uc3RydWN0b3I6IFplcm9Bcmd1bWVudHNDb25zdHJ1Y3RvcjxUPixcbiAgICAgICAga2V5Q29uZGl0aW9uczogQ29uZGl0aW9uRXhwcmVzc2lvbiB8IHsgW3Byb3BlcnR5TmFtZTogc3RyaW5nXTogQ29uZGl0aW9uRXhwcmVzc2lvblByZWRpY2F0ZSB8IGFueSB9LFxuICAgICAgICBvcHRpb25zPzogUXVlcnlPcHRpb25zXG4gICAgKTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgICBjb25zdCBpdGVtczogVFtdID0gW11cblxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgbWFwcGVyLnF1ZXJ5KHZhbHVlQ29uc3RydWN0b3IsIGtleUNvbmRpdGlvbnMsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pXG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYHRvdGFsIHRpbWUgZm9yIGNvbXBsZXRlIHF1ZXJ5ICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1gKVxuXG4gICAgICAgIHJldHVybiBpdGVtc1xuICAgIH1cbiAgICBkZWNvZGUoY29udGludWF0aW9uVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoY29udGludWF0aW9uVG9rZW4pIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhc3RFdmFsdWF0ZWRLZXkgPSBKU09OLnBhcnNlKEJ1ZmZlci5mcm9tKGNvbnRpbnVhdGlvblRva2VuLCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0ZjgnKSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJJbmNvbWluZyBMYXN0IEV2YWx1YXRlZCBLZXkgXCIgKyBsYXN0RXZhbHVhdGVkS2V5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGFzdEV2YWx1YXRlZEtleTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbnRpbnVhdGlvblRva2VuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGFzeW5jIGVuY29kZShsYXN0RXZhbHVhdGVkS2V5OiBhbnkpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkobGFzdEV2YWx1YXRlZEtleSkpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgIH1cbn0iXX0=
|