@macedon-technologies/batman 1.23.0 → 1.24.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +23 -5
- package/API.md +28 -0
- package/README.md +1 -0
- package/lib/ApiConstructFile.js +2 -2
- package/lib/Application.d.ts +5 -0
- package/lib/Application.js +2 -1
- package/lib/BatmanProject.d.ts +6 -0
- package/lib/BatmanProject.js +5 -3
- package/lib/BootcampApplication.d.ts +5 -0
- package/lib/BootcampApplication.js +2 -1
- package/lib/BootcampProject.js +5 -3
- package/lib/CodeOwnersFile.js +1 -1
- package/lib/PrDeployWorkflow.d.ts +7 -0
- package/lib/PrDeployWorkflow.js +37 -1
- package/lib/ProductionDeployWorkflow.js +1 -1
- package/lib/SoftwareFactoryFiles.js +1 -1
- package/lib/StagingDeployWorkflow.js +1 -1
- package/lib/ViteReactProject.d.ts +6 -0
- package/lib/ViteReactProject.js +294 -2
- package/lib/WorkflowAutoDiscover.js +1 -1
- package/lib/utils.d.ts +1 -1
- package/lib/utils.js +10 -2
- package/package.json +1 -1
package/lib/ViteReactProject.js
CHANGED
|
@@ -14,7 +14,7 @@ class ViteReactProject extends typescript_1.TypeScriptAppProject {
|
|
|
14
14
|
devCommand;
|
|
15
15
|
configFields;
|
|
16
16
|
constructor(options) {
|
|
17
|
-
const { sampleCode = true, srcdir = 'src', publicDir = 'public', title, ...restOptions } = options;
|
|
17
|
+
const { sampleCode = true, srcdir = 'src', publicDir = 'public', title, e2eTesting = true, ...restOptions } = options;
|
|
18
18
|
super({
|
|
19
19
|
...restOptions,
|
|
20
20
|
sampleCode: false, // We'll handle sample code ourselves
|
|
@@ -87,6 +87,12 @@ class ViteReactProject extends typescript_1.TypeScriptAppProject {
|
|
|
87
87
|
publicDir: this.publicDir,
|
|
88
88
|
});
|
|
89
89
|
}
|
|
90
|
+
// Add Playwright e2e testing support
|
|
91
|
+
if (e2eTesting) {
|
|
92
|
+
new PlaywrightE2EComponent(this, {
|
|
93
|
+
publicDir: this.publicDir,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
90
96
|
// Use relative path for devCommand
|
|
91
97
|
const relativeOutdir = this.parent
|
|
92
98
|
? (0, path_1.relative)(this.parent.outdir, this.outdir)
|
|
@@ -667,4 +673,290 @@ html, body, #root {
|
|
|
667
673
|
});
|
|
668
674
|
}
|
|
669
675
|
}
|
|
670
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVml0ZVJlYWN0UHJvamVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9WaXRlUmVhY3RQcm9qZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUEwQztBQUMxQyxtQ0FBc0Y7QUFDdEYsc0RBQXVGO0FBRXZGLG1DQUEyQztBQTRCM0M7O0dBRUc7QUFDSCxNQUFhLGdCQUFpQixTQUFRLGlDQUFvQjtJQUN4QyxNQUFNLENBQVM7SUFDZixTQUFTLENBQVM7SUFDbEIsVUFBVSxDQUFTO0lBQ2xCLFlBQVksQ0FBc0I7SUFFbkQsWUFBWSxPQUFnQztRQUMxQyxNQUFNLEVBQ0osVUFBVSxHQUFHLElBQUksRUFDakIsTUFBTSxHQUFHLEtBQUssRUFDZCxTQUFTLEdBQUcsUUFBUSxFQUNwQixLQUFLLEVBQ0wsR0FBRyxXQUFXLEVBQ2YsR0FBRyxPQUFPLENBQUM7UUFDWixLQUFLLENBQUM7WUFDSixHQUFHLFdBQVc7WUFDZCxVQUFVLEVBQUUsS0FBSyxFQUFFLHFDQUFxQztZQUN4RCxNQUFNLEVBQUUsS0FBSyxFQUFFLG1DQUFtQztZQUNsRCxJQUFJLEVBQUUsS0FBSyxFQUFFLDZCQUE2QjtZQUMxQyxPQUFPLEVBQUUsSUFBSTtZQUNiLGVBQWUsRUFBRSxJQUFJLEVBQUUsa0NBQWtDO1lBQ3pELGNBQWMsRUFBRyxXQUFXLENBQUMsTUFBd0IsQ0FBQyxPQUFPLENBQUMsY0FBYztZQUM1RSxXQUFXLEVBQUU7Z0JBQ1gsb0JBQW9CLEVBQUU7b0JBQ3BCLHVFQUF1RTtvQkFDdkUsc0VBQXNFO29CQUN0RSxvRUFBb0U7b0JBQ3BFLCtEQUErRDtvQkFDL0QsV0FBVyxFQUFFO3dCQUNYLFNBQVMsRUFBRSxJQUFJO3dCQUNmLGVBQWUsRUFBRSxJQUFJO3FCQUN0QjtvQkFDRCxHQUFHLFdBQVcsQ0FBQyxXQUFXLEVBQUUsb0JBQW9CO2lCQUNqRDthQUNGO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLG9CQUFvQjtnQkFDcEIsdUJBQXVCO2dC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QixvRUFBb0U7Z0JBQ3BFLFNBQVM7Z0JBQ1QsRUFBRTtnQkFDRiwrQkFBK0I7Z0JBQy9CLFFBQVE7Z0JBQ1Isb0NBQW9DO2dCQUNwQyxpQkFBaUI7Z0JBQ2pCLE9BQU87Z0JBQ1AsR0FBRzthQUNKO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsd0JBQXdCO1FBQ3hCLElBQUksbUJBQVUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxPQUFPLENBQUMsTUFBTSwwQkFBMEIsRUFBRTtZQUNuRSxRQUFRLEVBQUU7Ozs7Ozs7O0NBUWY7U0FDSSxDQUFDLENBQUM7UUFFSCxpQkFBaUI7UUFDakIsSUFBSSxtQkFBVSxDQUFDLE9BQU8sRUFBRSxHQUFHLE9BQU8sQ0FBQyxNQUFNLFVBQVUsRUFBRTtZQUNuRCxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0F3Q2Y7U0FDSSxDQUFDLENBQUM7UUFFSCxrQkFBa0I7UUFDbEIsSUFBSSxtQkFBVSxDQUFDLE9BQU8sRUFBRSxHQUFHLE9BQU8sQ0FBQyxNQUFNLFdBQVcsRUFBRTtZQUNwRCxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQTBDZjtTQUNJLENBQUMsQ0FBQztRQUVILG1CQUFtQjtRQUNuQixJQUFJLG1CQUFVLENBQUMsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sWUFBWSxFQUFFO1lBQ3JELFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0F3RGY7U0FDSSxDQUFDLENBQUM7SUFFTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWxhdGl2ZSwgYmFzZW5hbWUgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IENvbXBvbmVudCwgRmlsZUJhc2UsIEpzb25GaWxlLCBQcm9qZWN0LCBTYW1wbGVGaWxlLCBUZXh0RmlsZSB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBUeXBlU2NyaXB0QXBwUHJvamVjdCwgVHlwZVNjcmlwdFByb2plY3RPcHRpb25zIH0gZnJvbSAncHJvamVuL2xpYi90eXBlc2NyaXB0JztcbmltcG9ydCB7IEJhdG1hblByb2plY3QgfSBmcm9tICcuL0JhdG1hblByb2plY3QnO1xuaW1wb3J0IHsgcnVuU2NyaXB0Q29tbWFuZCB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZpdGVSZWFjdFByb2plY3RPcHRpb25zIGV4dGVuZHMgVHlwZVNjcmlwdFByb2plY3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZ2VuZXJhdGUgc2FtcGxlIGNvZGVcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgc2FtcGxlQ29kZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNvdXJjZSBkaXJlY3RvcnlcbiAgICogQGRlZmF1bHQgXCJzcmNcIlxuICAgKi9cbiAgcmVhZG9ubHkgc3JjZGlyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQdWJsaWMgZGlyZWN0b3J5IGZvciBzdGF0aWMgYXNzZXRzXG4gICAqIEBkZWZhdWx0IFwicHVibGljXCJcbiAgICovXG4gIHJlYWRvbmx5IHB1YmxpY0Rpcj86IHN0cmluZztcblxuICAvKipcbiAgICogVGl0bGUgZm9yIHRoZSBIVE1MIHBhZ2VcbiAgICogQGRlZmF1bHQgcHJvamVjdCBuYW1lXG4gICAqL1xuICByZWFkb25seSB0aXRsZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBWaXRlICsgUmVhY3QgVHlwZVNjcmlwdCBwcm9qZWN0XG4gKi9cbmV4cG9ydCBjbGFzcyBWaXRlUmVhY3RQcm9qZWN0IGV4dGVuZHMgVHlwZVNjcmlwdEFwcFByb2plY3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgc3JjZGlyOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBwdWJsaWNEaXI6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGRldkNvbW1hbmQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWdGaWVsZHM6IE1hcDxzdHJpbmcsIHN0cmluZz47XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogVml0ZVJlYWN0UHJvamVjdE9wdGlvbnMpIHtcbiAgICBjb25zdCB7XG4gICAgICBzYW1wbGVDb2RlID0gdHJ1ZSxcbiAgICAgIHNyY2RpciA9ICdzcmMnLFxuICAgICAgcHVibGljRGlyID0gJ3B1YmxpYycsXG4gICAgICB0aXRsZSxcbiAgICAgIC4uLnJlc3RPcHRpb25zXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ucmVzdE9wdGlvbnMsXG4gICAgICBzYW1wbGVDb2RlOiBmYWxzZSwgLy8gV2UnbGwgaGFuZGxlIHNhbXBsZSBjb2RlIG91cnNlbHZlc1xuICAgICAgZXNsaW50OiBmYWxzZSwgLy8gV2UnbGwgY29uZmlndXJlIGVzbGludCBvdXJzZWx2ZXNcbiAgICAgIGplc3Q6IGZhbHNlLCAvLyBWaXRlIHVzZXMgdml0ZXN0IHR5cGljYWxseVxuICAgICAgcGFja2FnZTogdHJ1ZSxcbiAgICAgIGRpc2FibGVUc2NvbmZpZzogdHJ1ZSwgLy8gV2UnbGwgbWFuYWdlIHRzY29uZmlnIG91cnNlbHZlc1xuICAgICAgcGFja2FnZU1hbmFnZXI6IChyZXN0T3B0aW9ucy5wYXJlbnQgYXMgQmF0bWFuUHJvamVjdCkucGFja2FnZS5wYWNrYWdlTWFuYWdlcixcbiAgICAgIHBucG1PcHRpb25zOiB7XG4gICAgICAgIHdvcmtzcGFjZVlhbWxPcHRpb25zOiB7XG4gICAgICAgICAgLy8gVGhpcyBzdWJwcm9qZWN0IGhhcyBpdHMgb3duIHNlcGFyYXRlIGxvY2tmaWxlL3N0b3JlIGZyb20gaXRzIHBhcmVudCxcbiAgICAgICAgICAvLyBzbyBpdCBuZWVkcyBpdHMgb3duIGFwcHJvdmFsIGZvciB0aGUgbmF0aXZlIHBvc3RpbnN0YWxsIHNjcmlwdHMgaXRzXG4gICAgICAgICAgLy8gZml4ZWQgZGVwZW5kZW5jeSBzZXQgYWx3YXlzIG5lZWRzIChlc2J1aWxkJ3MgYmluYXJ5IGRvd25sb2FkLCBhbmRcbiAgICAgICAgICAvLyBAY2xlcmsvY2xlcmstcmVhY3QncyB0cmFuc2l0aXZlIEBjbGVyay9zaGFyZWQgc2V0dXAgc2NyaXB0KS5cbiAgICAgICAgICBhbGxvd0J1aWxkczoge1xuICAgICAgICAgICAgJ2VzYnVpbGQnOiB0cnVlLFxuICAgICAgICAgICAgJ0BjbGVyay9zaGFyZWQnOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4ucmVzdE9wdGlvbnMucG5wbU9wdGlvbnM/LndvcmtzcGFjZVlhbWxPcHRpb25zLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGRlcHM6IFtcbiAgICAgICAgJ0BjbGVyay9jbGVyay1yZWFjdCcsXG4gICAgICAgICdAdGFuc3RhY2svcmVhY3QtcXVlcnknLFxuICAgICAgICAnQHRhaWx3aW5kY3NzL3Bvc3Rjc3MnLFxuICAgICAgICAnYXV0b3ByZWZpeGVyJyxcbiAgICAgICAgJ3Bvc3Rjc3MnLFxuICAgICAgICAndGFpbHdpbmRjc3MnLFxuICAgICAgICAncm9sbHVwJyxcbiAgICAgICAgLi4uKG9wdGlvbnMuZGVwcyA/IG9wdGlvbnMuZGVwcyA6IFtdKSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICAvLyBJbml0aWFsaXplIGNvbmZpZyBmaWVsZHMgc3RvcmFnZVxuICAgIHRoaXMuY29uZmlnRmllbGRzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICAgIHRoaXMuc3JjZGlyID0gc3JjZGlyO1xuICAgIHRoaXMucHVibGljRGlyID0gcHVibGljRGlyO1xuXG4gICAgLy8gQWRkIFZpdGUgY29tcG9uZW50XG4gICAgbmV3IFZpdGVDb21wb25lbnQodGhpcywge1xuICAgICAgc3JjZGlyOiB0aGlzLnNyY2RpcixcbiAgICB9KTtcblxuICAgIC8vIEFkZCBFU0xpbnQgY29uZmlndXJhdGlvblxuICAgIG5ldyBWaXRlRXNsaW50Q29uZmlnKHRoaXMpO1xuXG4gICAgLy8gQWRkIGluZGV4Lmh0bWxcbiAgICBuZXcgSW5kZXhIdG1sKHRoaXMsIHtcbiAgICAgIHRpdGxlOiB0aXRsZSA/PyB0aGlzLm5hbWUsXG4gICAgICBzcmNkaXI6IHRoaXMuc3JjZGlyLFxuICAgIH0pO1xuXG4gICAgLy8gQWRkIFR5cGVTY3JpcHQgY29uZmlnc1xuICAgIG5ldyBWaXRlVHNDb25maWdzKHRoaXMsIHtcbiAgICAgIHNyY2RpcjogdGhpcy5zcmNkaXIsXG4gICAgfSk7XG5cbiAgICAvLyBBZGQgLmdpdGlnbm9yZSBlbnRyaWVzXG4gICAgdGhpcy5naXRpZ25vcmU/LmFkZFBhdHRlcm5zKCdkaXN0JywgJ2Rpc3Qtc3NyJywgJyoubG9jYWwnKTtcblxuICAgIC8vIEFkZCB2aXRlLWVudi5kLnRzIGZvciB0eXBlIGRlY2xhcmF0aW9uc1xuICAgIG5ldyBWaXRlRW52RHRzKHRoaXMsIHtcbiAgICAgIHNyY2RpcjogdGhpcy5zcmNkaXIsXG4gICAgfSk7XG5cbiAgICAvLyBBZGQgUG9zdENTUyBjb25maWcgZm9yIFRhaWx3aW5kXG4gICAgbmV3IFBvc3RDU1NDb25maWdGaWxlKHRoaXMpO1xuXG4gICAgLy8gQWRkIGNvbmZpZy50cyBmb3IgcnVudGltZSBjb25maWd1cmF0aW9uXG4gICAgbmV3IENvbmZpZ0ZpbGUodGhpcywge1xuICAgICAgc3JjZGlyOiB0aGlzLnNyY2RpcixcbiAgICB9KTtcblxuICAgIC8vIEFkZCBzYW1wbGUgY29uZmlnLmpzb25cbiAgICBuZXcgQ29uZmlnSnNvbkZpbGUodGhpcywgeyB9KTtcblxuXG4gICAgLy8gQWRkIHNhbXBsZSBjb2RlIGlmIHJlcXVlc3RlZFxuICAgIGlmIChzYW1wbGVDb2RlKSB7XG4gICAgICBuZXcgVml0ZVNhbXBsZUNvZGUodGhpcywge1xuICAgICAgICBzcmNkaXI6IHRoaXMuc3JjZGlyLFxuICAgICAgICBwdWJsaWNEaXI6IHRoaXMucHVibGljRGlyLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gVXNlIHJlbGF0aXZlIHBhdGggZm9yIGRldkNvbW1hbmRcbiAgICBjb25zdCByZWxhdGl2ZU91dGRpciA9IHRoaXMucGFyZW50XG4gICAgICA/IHJlbGF0aXZlKHRoaXMucGFyZW50Lm91dGRpciwgdGhpcy5vdXRkaXIpXG4gICAgICA6IGJhc2VuYW1lKHRoaXMub3V0ZGlyKTtcbiAgICB0aGlzLmRldkNvbW1hbmQgPSBgY2QgJHtyZWxhdGl2ZU91dGRpcn0gJiYgJHtydW5TY3JpcHRDb21tYW5kKHRoaXMucGFja2FnZS5wYWNrYWdlTWFuYWdlciwgJ2RldicpfWA7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgY3VzdG9tIGZpZWxkIHRvIHRoZSBDb25maWcgdHlwZVxuICAgKiBAcGFyYW0gZmllbGROYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWVsZFxuICAgKiBAcGFyYW0gZmllbGRUeXBlIFRoZSBUeXBlU2NyaXB0IHR5cGUgb2YgdGhlIGZpZWxkIChlLmcuLCAnc3RyaW5nJywgJ251bWJlcicsICdib29sZWFuJywgJ3N0cmluZ1tdJylcbiAgICogQHJldHVybnMgdGhpcyBwcm9qZWN0IGluc3RhbmNlIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgYWRkQ29uZmlnRmllbGQoZmllbGROYW1lOiBzdHJpbmcsIGZpZWxkVHlwZTogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy5jb25maWdGaWVsZHMuc2V0KGZpZWxkTmFtZSwgZmllbGRUeXBlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbmZpZyBmaWVsZHMgbWFwIChmb3IgaW50ZXJuYWwgdXNlIGJ5IENvbmZpZ0ZpbGUpXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZ2V0Q29uZmlnRmllbGRzKCk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZ0ZpZWxkcztcbiAgfVxufVxuXG5pbnRlcmZhY2UgVml0ZUNvbXBvbmVudE9wdGlvbnMge1xuICByZWFkb25seSBzcmNkaXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb25maWd1cmVzIFZpdGUgZGVwZW5kZW5jaWVzIGFuZCBzY3JpcHRzXG4gKi9cbmNsYXNzIFZpdGVDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBUeXBlU2NyaXB0QXBwUHJvamVjdCwgX29wdGlvbnM6IFZpdGVDb21wb25lbnRPcHRpb25zKSB7XG4gICAgc3VwZXIocHJvamVjdCk7XG5cbiAgICBjb25zdCB0c1Byb2plY3QgPSBwcm9qZWN0IGFzIFR5cGVTY3JpcHRBcHBQcm9qZWN0O1xuXG4gICAgLy8gU2V0IHBhY2thZ2UgdHlwZSB0byBtb2R1bGUgZm9yIEVTTSBzdXBwb3J0XG4gICAgdHNQcm9qZWN0LnBhY2thZ2UuYWRkRmllbGQoJ3R5cGUnLCAnbW9kdWxlJyk7XG5cbiAgICAvLyBBZGQgUmVhY3QgZGVwZW5kZW5jaWVzXG4gICAgdHNQcm9qZWN0LmFkZERlcHMoJ3JlYWN0QF4xOS4yLjAnLCAncmVhY3QtZG9tQF4xOS4yLjAnKTtcblxuICAgIC8vIEFkZCBkZXYgZGVwZW5kZW5jaWVzXG4gICAgdHNQcm9qZWN0LmFkZERldkRlcHMoXG4gICAgICAnQHR5cGVzL3JlYWN0QF4xOS4yLjInLFxuICAgICAgJ0B0eXBlcy9yZWFjdC1kb21AXjE5LjIuMicsXG4gICAgICAnQHZpdGVqcy9wbHVnaW4tcmVhY3RAXjUuMS4wJyxcbiAgICAgICd2aXRlQF41LjQuMCcsXG4gICAgICAndHlwZXNjcmlwdEB+NS45LjMnLFxuICAgICAgJ0Blc2xpbnQvanNAXjkuMzkuMScsXG4gICAgICAnZXNsaW50QF45LjM5LjEnLFxuICAgICAgJ2VzbGludC1wbHVnaW4tcmVhY3QtaG9va3NAXjUuMi4wJyxcbiAgICAgICdlc2xpbnQtcGx1Z2luLXJlYWN0LXJlZnJlc2hAXjAuNC4yNCcsXG4gICAgICAnZ2xvYmFsc0BeMTYuNS4wJyxcbiAgICAgICd0eXBlc2NyaXB0LWVzbGludEBeOC40Ni4zJyxcbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIHZpdGUuY29uZmlnLnRzIGFzIGEgbWFuYWdlZCBmaWxlXG4gICAgbmV3IFZpdGVDb25maWdGaWxlKHByb2plY3QpO1xuXG4gICAgLy8gQWRkIHNjcmlwdHNcbiAgICB0c1Byb2plY3QuYWRkVGFzaygnZGV2Jywge1xuICAgICAgZGVzY3JpcHRpb246ICdTdGFydCBkZXZlbG9wbWVudCBzZXJ2ZXInLFxuICAgICAgZXhlYzogJ3ZpdGUnLFxuICAgIH0pO1xuXG4gICAgLy8gUmVtb3ZlIGFuZCByZWNyZWF0ZSBidWlsZCB0YXNrIHRvIGN1c3RvbWl6ZSBpdCBmb3IgVml0ZVxuICAgIHRzUHJvamVjdC5yZW1vdmVUYXNrKCdidWlsZCcpO1xuICAgIHRzUHJvamVjdC5hZGRUYXNrKCdidWlsZCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnQnVpbGQgZm9yIHByb2R1Y3Rpb24nLFxuICAgICAgZXhlYzogJ3RzYyAtYiAmJiB2aXRlIGJ1aWxkJyxcbiAgICB9KTtcblxuICAgIHRzUHJvamVjdC5hZGRUYXNrKCdwcmV2aWV3Jywge1xuICAgICAgZGVzY3JpcHRpb246ICdQcmV2aWV3IHByb2R1Y3Rpb24gYnVpbGQnLFxuICAgICAgZXhlYzogJ3ZpdGUgcHJldmlldycsXG4gICAgfSk7XG5cbiAgICB0c1Byb2plY3QuYWRkVGFzaygnbGludCcsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnTGludCBjb2RlJyxcbiAgICAgIGV4ZWM6ICdlc2xpbnQgLicsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBFU0xpbnQgY29uZmlndXJhdGlvbiBmb3IgVml0ZSArIFJlYWN0XG4gKi9cbmNsYXNzIFZpdGVFc2xpbnRDb25maWcgZXh0ZW5kcyBGaWxlQmFzZSB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IFByb2plY3QpIHtcbiAgICBzdXBlcihwcm9qZWN0LCAnZXNsaW50LmNvbmZpZy5qcycsIHtcbiAgICAgIG1hcmtlcjogdHJ1ZSxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgc3ludGhlc2l6ZUNvbnRlbnQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gYGltcG9ydCBqcyBmcm9tICdAZXNsaW50L2pzJ1xuaW1wb3J0IGdsb2JhbHMgZnJvbSAnZ2xvYmFscydcbmltcG9ydCByZWFjdEhvb2tzIGZyb20gJ2VzbGludC1wbHVnaW4tcmVhY3QtaG9va3MnXG5pbXBvcnQgcmVhY3RSZWZyZXNoIGZyb20gJ2VzbGludC1wbHVnaW4tcmVhY3QtcmVmcmVzaCdcbmltcG9ydCB0c2VzbGludCBmcm9tICd0eXBlc2NyaXB0LWVzbGludCdcblxuZXhwb3J0IGRlZmF1bHQgW1xuICB7IGlnbm9yZXM6IFsnZGlzdCddIH0sXG4gIHtcbiAgICBmaWxlczogWycqKi8qLnt0cyx0c3h9J10sXG4gICAgbGFuZ3VhZ2VPcHRpb25zOiB7XG4gICAgICBlY21hVmVyc2lvbjogMjAyMCxcbiAgICAgIGdsb2JhbHM6IGdsb2JhbHMuYnJvd3NlcixcbiAgICB9LFxuICAgIHBsdWdpbnM6IHtcbiAgICAgICdyZWFjdC1ob29rcyc6IHJlYWN0SG9va3MsXG4gICAgICAncmVhY3QtcmVmcmVzaCc6IHJlYWN0UmVmcmVzaCxcbiAgICB9LFxuICAgIHJ1bGVzOiB7XG4gICAgICAuLi5yZWFjdEhvb2tzLmNvbmZpZ3MucmVjb21tZW5kZWQucnVsZXMsXG4gICAgICAncmVhY3QtcmVmcmVzaC9vbmx5LWV4cG9ydC1jb21wb25lbnRzJzogW1xuICAgICAgICAnd2FybicsXG4gICAgICAgIHsgYWxsb3dDb25zdGFudEV4cG9ydDogdHJ1ZSB9LFxuICAgICAgXSxcbiAgICB9LFxuICB9LFxuICBqcy5jb25maWdzLnJlY29tbWVuZGVkLFxuICAuLi50c2VzbGludC5jb25maWdzLnJlY29tbWVuZGVkLFxuXVxuYDtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIHZpdGUuY29uZmlnLnRzIGZpbGVcbiAqL1xuY2xhc3MgVml0ZUNvbmZpZ0ZpbGUgZXh0ZW5kcyBGaWxlQmFzZSB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IFByb2plY3QpIHtcbiAgICBzdXBlcihwcm9qZWN0LCAndml0ZS5jb25maWcudHMnLCB7XG4gICAgICBtYXJrZXI6IHRydWUsXG4gICAgICByZWFkb25seTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHN5bnRoZXNpemVDb250ZW50KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGBpbXBvcnQgeyBkZWZpbmVDb25maWcgfSBmcm9tICd2aXRlJ1xuaW1wb3J0IHJlYWN0IGZyb20gJ0B2aXRlanMvcGx1Z2luLXJlYWN0J1xuXG4vLyBodHRwczovL3ZpdGUuZGV2L2NvbmZpZy9cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7XG4gIHBsdWdpbnM6IFtyZWFjdCgpXSxcbn0pXG5gO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgcG9zdGNzcy5jb25maWcuanMgZmlsZSBmb3IgVGFpbHdpbmQgQ1NTIHY0XG4gKi9cbmNsYXNzIFBvc3RDU1NDb25maWdGaWxlIGV4dGVuZHMgRmlsZUJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBQcm9qZWN0KSB7XG4gICAgc3VwZXIocHJvamVjdCwgJ3Bvc3Rjc3MuY29uZmlnLmpzJywge1xuICAgICAgbWFya2VyOiB0cnVlLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICBzeW50aGVzaXplQ29udGVudCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBgZXhwb3J0IGRlZmF1bHQge1xuICBwbHVnaW5zOiB7XG4gICAgXCJAdGFpbHdpbmRjc3MvcG9zdGNzc1wiOiB7fSxcbiAgICBhdXRvcHJlZml4ZXI6IHt9LFxuICB9LFxufVxuYDtcbiAgfVxufVxuXG5pbnRlcmZhY2UgVml0ZUVudkR0c09wdGlvbnMge1xuICByZWFkb25seSBzcmNkaXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSB2aXRlLWVudi5kLnRzIGZpbGUgZm9yIHR5cGUgZGVjbGFyYXRpb25zXG4gKi9cbmNsYXNzIFZpdGVFbnZEdHMgZXh0ZW5kcyBGaWxlQmFzZSB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IFByb2plY3QsIG9wdGlvbnM6IFZpdGVFbnZEdHNPcHRpb25zKSB7XG4gICAgc3VwZXIocHJvamVjdCwgYCR7b3B0aW9ucy5zcmNkaXJ9L3ZpdGUtZW52LmQudHNgLCB7XG4gICAgICBtYXJrZXI6IHRydWUsXG4gICAgICByZWFkb25seTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHN5bnRoZXNpemVDb250ZW50KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGAvLy8gPHJlZmVyZW5jZSB0eXBlcz1cInZpdGUvY2xpZW50XCIgLz5cbmA7XG4gIH1cbn1cblxuaW50ZXJmYWNlIENvbmZpZ0ZpbGVPcHRpb25zIHtcbiAgcmVhZG9ubHkgc3JjZGlyOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgY29uZmlnLnRzIGZpbGUgZm9yIHJ1bnRpbWUgY29uZmlndXJhdGlvblxuICovXG5jbGFzcyBDb25maWdGaWxlIGV4dGVuZHMgRmlsZUJhc2Uge1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBQcm9qZWN0LCBvcHRpb25zOiBDb25maWdGaWxlT3B0aW9ucykge1xuICAgIHN1cGVyKHByb2plY3QsIGAke29wdGlvbnMuc3JjZGlyfS9jb25maWcudHNgLCB7XG4gICAgICBtYXJrZXI6IHRydWUsXG4gICAgICByZWFkb25seTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHN5bnRoZXNpemVDb250ZW50KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gR2V0IGN1c3RvbSBjb25maWcgZmllbGRzIGZyb20gcGFyZW50IHByb2plY3RcbiAgICBjb25zdCB2aXRlUHJvamVjdCA9IHRoaXMucHJvamVjdCBhcyBWaXRlUmVhY3RQcm9qZWN0O1xuICAgIGNvbnN0IGN1c3RvbUZpZWxkcyA9IHZpdGVQcm9qZWN0LmdldENvbmZpZ0ZpZWxkcygpO1xuXG4gICAgLy8gR2VuZXJhdGUgYmFzZSBjb25maWcgdHlwZVxuICAgIGNvbnN0IGJhc2VDb25maWdUeXBlID0gYHR5cGUgQmFzZUNvbmZpZyA9IHtcbiAgY2xlcmtQdWJsaXNoYWJsZUtleTogc3RyaW5nO1xuICBhcGlCYXNlVXJsOiBzdHJpbmc7XG4gIHRpbWVvdXQ6IG51bWJlcjtcbn1gO1xuXG4gICAgLy8gR2VuZXJhdGUgY3VzdG9tIGZpZWxkcyB0eXBlIGlmIGFueSBleGlzdFxuICAgIGxldCBjb25maWdUeXBlRGVmaW5pdGlvbjogc3RyaW5nO1xuICAgIGlmIChjdXN0b21GaWVsZHMuc2l6ZSA+IDApIHtcbiAgICAgIGNvbnN0IGZpZWxkRGVmaW5pdGlvbnMgPSBBcnJheS5mcm9tKGN1c3RvbUZpZWxkcy5lbnRyaWVzKCkpXG4gICAgICAgIC5tYXAoKFtuYW1lLCB0eXBlXSkgPT4gYCAgJHtuYW1lfTogJHt0eXBlfTtgKVxuICAgICAgICAuam9pbignXFxuJyk7XG5cbiAgICAgIGNvbnN0IGN1c3RvbUZpZWxkc1R5cGUgPSBgdHlwZSBDdXN0b21Db25maWcgPSB7XG4ke2ZpZWxkRGVmaW5pdGlvbnN9XG59YDtcblxuICAgICAgY29uZmlnVHlwZURlZmluaXRpb24gPSBgJHtjdXN0b21GaWVsZHNUeXBlfVxuXG5leHBvcnQgdHlwZSBDb25maWcgPSBCYXNlQ29uZmlnICYgQ3VzdG9tQ29uZmlnO2A7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmZpZ1R5cGVEZWZpbml0aW9uID0gJ2V4cG9ydCB0eXBlIENvbmZpZyA9IEJhc2VDb25maWc7JztcbiAgICB9XG5cbiAgICByZXR1cm4gYGltcG9ydCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5cbiR7YmFzZUNvbmZpZ1R5cGV9XG5cbiR7Y29uZmlnVHlwZURlZmluaXRpb259XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VDb25maWcoKSB7XG4gIGNvbnN0IFtsb2FkZWRDb25maWcsIHNldExvYWRlZENvbmZpZ10gPSB1c2VTdGF0ZTxDb25maWd8dW5kZWZpbmVkPigpO1xuICBjb25zdCBbaXNMb2FkaW5nLCBzZXRJc0xvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFsb2FkZWRDb25maWcpIHtcbiAgICAgIGZldGNoKCcvY29uZmlnLmpzb24nLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pLnRoZW4ocmVzcG9uc2U9PntcbiAgICAgICAgcmVzcG9uc2UuanNvbigpLnRoZW4oKGNvbmZpZykgPT4ge1xuICAgICAgICAgIHNldElzTG9hZGluZyhmYWxzZSlcbiAgICAgICAgICBzZXRMb2FkZWRDb25maWcoY29uZmlnKVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgfVxuICB9LCBbbG9hZGVkQ29uZmlnXSk7XG5cbiAgcmV0dXJuIHsgY29uZmlnOiBsb2FkZWRDb25maWcsIGlzTG9hZGluZyB9O1xufVxuYDtcbiAgfVxufVxuXG5pbnRlcmZhY2UgQ29uZmlnSnNvbkZpbGVPcHRpb25zIHt9XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgY29uZmlnLmpzb24gc2FtcGxlIGZpbGUgZm9yIHJ1bnRpbWUgY29uZmlndXJhdGlvblxuICovXG5jbGFzcyBDb25maWdKc29uRmlsZSBleHRlbmRzIFNhbXBsZUZpbGUge1xuICBwYXRoOiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IFZpdGVSZWFjdFByb2plY3QsIF9vcHRpb25zOiBDb25maWdKc29uRmlsZU9wdGlvbnMpIHtcbiAgICBzdXBlcihwcm9qZWN0LCBgJHtwcm9qZWN0LnB1YmxpY0Rpcn0vY29uZmlnLmpzb25gLCB7XG4gICAgICBjb250ZW50czogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBhcGlCYXNlVXJsOiAnaHR0cDovL2xvY2FsaG9zdDozMDAwL2FwaScsXG4gICAgICAgIGNsZXJrUHVibGlzaGFibGVLZXk6ICd0YmQnLFxuICAgICAgfSwgbnVsbCwgMiksXG4gICAgfSk7XG4gICAgdGhpcy5wYXRoID0gYCR7cHJvamVjdC5wdWJsaWNEaXJ9L2NvbmZpZy5qc29uYDtcbiAgfVxufVxuXG5pbnRlcmZhY2UgSW5kZXhIdG1sT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNyY2Rpcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGluZGV4Lmh0bWwgZmlsZVxuICovXG5jbGFzcyBJbmRleEh0bWwgZXh0ZW5kcyBTYW1wbGVGaWxlIHtcbiAgY29uc3RydWN0b3IocHJvamVjdDogUHJvamVjdCwgb3B0aW9uczogSW5kZXhIdG1sT3B0aW9ucykge1xuICAgIHN1cGVyKHByb2plY3QsICdpbmRleC5odG1sJywge1xuICAgICAgY29udGVudHM6IGA8IWRvY3R5cGUgaHRtbD5cbjxodG1sIGxhbmc9XCJlblwiPlxuICA8aGVhZD5cbiAgICA8bWV0YSBjaGFyc2V0PVwiVVRGLThcIiAvPlxuICAgIDxsaW5rIHJlbD1cImljb25cIiB0eXBlPVwiaW1hZ2Uvc3ZnK3htbFwiIGhyZWY9XCIvdml0ZS5zdmdcIiAvPlxuICAgIDxtZXRhIG5hbWU9XCJ2aWV3cG9ydFwiIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wXCIgLz5cbiAgICA8dGl0bGU+JHtvcHRpb25zLnRpdGxlfTwvdGl0bGU+XG4gIDwvaGVhZD5cbiAgPGJvZHk+XG4gICAgPGRpdiBpZD1cInJvb3RcIj48L2Rpdj5cbiAgICA8c2NyaXB0IHR5cGU9XCJtb2R1bGVcIiBzcmM9XCIvJHtvcHRpb25zLnNyY2Rpcn0vbWFpbi50c3hcIj48L3NjcmlwdD5cbiAgPC9ib2R5PlxuPC9odG1sPlxuYCxcbiAgICB9KTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgVml0ZVRzQ29uZmlnc09wdGlvbnMge1xuICByZWFkb25seSBzcmNkaXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBUeXBlU2NyaXB0IGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yIFZpdGVcbiAqL1xuY2xhc3MgVml0ZVRzQ29uZmlncyBleHRlbmRzIENvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IFByb2plY3QsIG9wdGlvbnM6IFZpdGVUc0NvbmZpZ3NPcHRpb25zKSB7XG4gICAgc3VwZXIocHJvamVjdCk7XG5cbiAgICAvLyBNYWluIHRzY29uZmlnLmpzb24gKHByb2plY3QgcmVmZXJlbmNlcylcbiAgICBuZXcgSnNvbkZpbGUocHJvamVjdCwgJ3RzY29uZmlnLmpzb24nLCB7XG4gICAgICBtYXJrZXI6IHRydWUsXG4gICAgICByZWFkb25seTogdHJ1ZSxcbiAgICAgIG9iajoge1xuICAgICAgICBmaWxlczogW10sXG4gICAgICAgIHJlZmVyZW5jZXM6IFtcbiAgICAgICAgICB7IHBhdGg6ICcuL3RzY29uZmlnLmFwcC5qc29uJyB9LFxuICAgICAgICAgIHsgcGF0aDogJy4vdHNjb25maWcubm9kZS5qc29uJyB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIHRzY29uZmlnLmFwcC5qc29uIChmb3IgYXBwbGljYXRpb24gY29kZSlcbiAgICBuZXcgSnNvbkZpbGUocHJvamVjdCwgJ3RzY29uZmlnLmFwcC5qc29uJywge1xuICAgICAgbWFya2VyOiB0cnVlLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICBvYmo6IHtcbiAgICAgICAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgICAgICAgdGFyZ2V0OiAnRVMyMDIwJyxcbiAgICAgICAgICB1c2VEZWZpbmVGb3JDbGFzc0ZpZWxkczogdHJ1ZSxcbiAgICAgICAgICBsaWI6IFsnRVMyMDIwJywgJ0RPTScsICdET00uSXRlcmFibGUnXSxcbiAgICAgICAgICBtb2R1bGU6ICdFU05leHQnLFxuICAgICAgICAgIHNraXBMaWJDaGVjazogdHJ1ZSxcblxuICAgICAgICAgIC8vIEJ1bmRsZXIgbW9kZVxuICAgICAgICAgIG1vZHVsZVJlc29sdXRpb246ICdidW5kbGVyJyxcbiAgICAgICAgICBhbGxvd0ltcG9ydGluZ1RzRXh0ZW5zaW9uczogdHJ1ZSxcbiAgICAgICAgICBpc29sYXRlZE1vZHVsZXM6IHRydWUsXG4gICAgICAgICAgbW9kdWxlRGV0ZWN0aW9uOiAnZm9yY2UnLFxuICAgICAgICAgIG5vRW1pdDogdHJ1ZSxcbiAgICAgICAgICBqc3g6ICdyZWFjdC1qc3gnLFxuXG4gICAgICAgICAgLy8gTGludGluZ1xuICAgICAgICAgIHN0cmljdDogdHJ1ZSxcbiAgICAgICAgICBub1VudXNlZExvY2FsczogdHJ1ZSxcbiAgICAgICAgICBub1VudXNlZFBhcmFtZXRlcnM6IHRydWUsXG4gICAgICAgICAgbm9GYWxsdGhyb3VnaENhc2VzSW5Td2l0Y2g6IHRydWUsXG4gICAgICAgICAgbm9VbmNoZWNrZWRTaWRlRWZmZWN0SW1wb3J0czogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgaW5jbHVkZTogW29wdGlvbnMuc3JjZGlyXSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyB0c2NvbmZpZy5ub2RlLmpzb24gKGZvciBWaXRlIGNvbmZpZylcbiAgICBuZXcgSnNvbkZpbGUocHJvamVjdCwgJ3RzY29uZmlnLm5vZGUuanNvbicsIHtcbiAgICAgIG1hcmtlcjogdHJ1ZSxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgICAgb2JqOiB7XG4gICAgICAgIGNvbXBpbGVyT3B0aW9uczoge1xuICAgICAgICAgIHRhcmdldDogJ0VTMjAyMicsXG4gICAgICAgICAgbGliOiBbJ0VTMjAyMyddLFxuICAgICAgICAgIG1vZHVsZTogJ0VTTmV4dCcsXG4gICAgICAgICAgc2tpcExpYkNoZWNrOiB0cnVlLFxuXG4gICAgICAgICAgLy8gQnVuZGxlciBtb2RlXG4gICAgICAgICAgbW9kdWxlUmVzb2x1dGlvbjogJ2J1bmRsZXInLFxuICAgICAgICAgIGFsbG93SW1wb3J0aW5nVHNFeHRlbnNpb25zOiB0cnVlLFxuICAgICAgICAgIGlzb2xhdGVkTW9kdWxlczogdHJ1ZSxcbiAgICAgICAgICBtb2R1bGVEZXRlY3Rpb246ICdmb3JjZScsXG4gICAgICAgICAgbm9FbWl0OiB0cnVlLFxuXG4gICAgICAgICAgLy8gTGludGluZ1xuICAgICAgICAgIHN0cmljdDogdHJ1ZSxcbiAgICAgICAgICBub1VudXNlZExvY2FsczogdHJ1ZSxcbiAgICAgICAgICBub1VudXNlZFBhcmFtZXRlcnM6IHRydWUsXG4gICAgICAgICAgbm9GYWxsdGhyb3VnaENhc2VzSW5Td2l0Y2g6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIGluY2x1ZGU6IFsndml0ZS5jb25maWcudHMnXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIFZpdGVTYW1wbGVDb2RlT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHNyY2Rpcjogc3RyaW5nO1xuICByZWFkb25seSBwdWJsaWNEaXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgc2FtcGxlIGNvZGUgZm9yIGEgVml0ZSArIFJlYWN0IHByb2plY3RcbiAqL1xuY2xhc3MgVml0ZVNhbXBsZUNvZGUgZXh0ZW5kcyBDb21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBQcm9qZWN0LCBvcHRpb25zOiBWaXRlU2FtcGxlQ29kZU9wdGlvbnMpIHtcbiAgICBzdXBlcihwcm9qZWN0KTtcblxuICAgIC8vIENyZWF0ZSBBcHAudHN4XG4gICAgbmV3IFNhbXBsZUZpbGUocHJvamVjdCwgYCR7b3B0aW9ucy5zcmNkaXJ9L0FwcC50c3hgLCB7XG4gICAgICBjb250ZW50czogYGltcG9ydCAnLi9BcHAuY3NzJ1xuaW1wb3J0IHsgU2lnbmVkSW4sIFVzZXJCdXR0b24gfSBmcm9tICdAY2xlcmsvY2xlcmstcmVhY3QnO1xuaW1wb3J0IHsgdXNlQmFzZVF1ZXJ5IH0gZnJvbSBcIi4vc2VydmljZXMvQmFzZVNlcnZpY2UudHNcIjtcblxuXG5mdW5jdGlvbiBBcHAoKSB7XG4gIGNvbnN0IHtkYXRhLCBpc0xvYWRpbmd9ID0gdXNlQmFzZVF1ZXJ5KCcvJywge3JldHJ5T25Nb3VudDogdHJ1ZX0pO1xuXG5cbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgICA8aGVhZGVyPlxuXG4gICAgICAgICAgPFNpZ25lZEluPlxuICAgICAgICAgICAgPFVzZXJCdXR0b24vPlxuICAgICAgICAgIDwvU2lnbmVkSW4+XG4gICAgICAgIDwvaGVhZGVyPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNhcmRcIj5cbiAgICAgICAgICB7IGlzTG9hZGluZyA/ICdMb2FkaW5nLi4uJyA6IEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwgLCl9XG4gICAgICAgIDwvZGl2PlxuICAgIDwvPlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IEFwcFxuYCxcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBCYXNlU2VydmljZS50c1xuICAgIG5ldyBUZXh0RmlsZShwcm9qZWN0LCBgJHtvcHRpb25zLnNyY2Rpcn0vc2VydmljZXMvQmFzZVNlcnZpY2UudHNgLCB7XG4gICAgICBtYXJrZXI6IHRydWUsXG4gICAgICByZWFkb25seTogdHJ1ZSxcbiAgICAgIGxpbmVzOiBbXG4gICAgICAgICdpbXBvcnQgeyB1c2VRdWVyeSwgVXNlUXVlcnlPcHRpb25zIH0gZnJvbSBcXCdAdGFuc3RhY2svcmVhY3QtcXVlcnlcXCc7JyxcbiAgICAgICAgJ2ltcG9ydCB7IHVzZUF1dGggfSBmcm9tIFxcJ0BjbGVyay9jbGVyay1yZWFjdFxcJzsnLFxuICAgICAgICAnaW1wb3J0IHsgdXNlQ29uZmlnIH0gZnJvbSBcXCcuLi9jb25maWdcXCc7JyxcbiAgICAgICAgJycsXG4gICAgICAgICdleHBvcnQgZnVuY3Rpb24gdXNlQmFzZVF1ZXJ5PFREYXRhID0gdW5rbm93bj4oJyxcbiAgICAgICAgJyAgcGF0aDogc3RyaW5nLCcsXG4gICAgICAgICcgIG9wdGlvbnM/OiBPbWl0PFVzZVF1ZXJ5T3B0aW9uczxURGF0YT4sIFxcJ3F1ZXJ5S2V5XFwnIHwgXFwncXVlcnlGblxcJz4nLFxuICAgICAgICAnKSB7JyxcbiAgICAgICAgJyAgY29uc3QgeyBjb25maWcgfSA9IHVzZUNvbmZpZygpOycsXG4gICAgICAgICcgIGNvbnN0IHsgZ2V0VG9rZW4gfSA9IHVzZUF1dGgoKTsnLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgcmV0dXJuIHVzZVF1ZXJ5PFREYXRhPih7JyxcbiAgICAgICAgJyAgICBxdWVyeUtleTogW1xcJ2Jhc2VcXCddLCcsXG4gICAgICAgICcgICAgcXVlcnlGbjogYXN5bmMgKCkgPT4geycsXG4gICAgICAgICcgICAgICBpZiAoIWNvbmZpZz8uYXBpQmFzZVVybCkgeycsXG4gICAgICAgICcgICAgICAgIHRocm93IG5ldyBFcnJvcihcXCdBUEkgYmFzZSBVUkwgbm90IGNvbmZpZ3VyZWRcXCcpOycsXG4gICAgICAgICcgICAgICB9JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IGdldFRva2VuKCk7JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgICAgICAvLyBOb3JtYWxpemUgVVJMIGJ5IHJlbW92aW5nIHRyYWlsaW5nIHNsYXNoIGZyb20gYmFzZVVybCBhbmQgZW5zdXJpbmcgcGF0aCBzdGFydHMgd2l0aCBzbGFzaCcsXG4gICAgICAgICcgICAgICBjb25zdCBiYXNlVXJsID0gY29uZmlnLmFwaUJhc2VVcmwucmVwbGFjZSgvXFxcXC8rJC8sIFxcJ1xcJyk7JyxcbiAgICAgICAgJyAgICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5zdGFydHNXaXRoKFxcJy9cXCcpID8gcGF0aCA6IGAvJHtwYXRofWA7JyxcbiAgICAgICAgJyAgICAgICcsXG4gICAgICAgICcgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2Jhc2VVcmx9JHtub3JtYWxpemVkUGF0aH1gLCB7JyxcbiAgICAgICAgJyAgICAgICAgaGVhZGVyczogeycsXG4gICAgICAgICcgICAgICAgICAgXFwnQXV0aG9yaXphdGlvblxcJzogYEJlYXJlciAke3Rva2VufWAsJyxcbiAgICAgICAgJyAgICAgICAgfSwnLFxuICAgICAgICAnICAgICAgfSk7JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7JyxcbiAgICAgICAgJyAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQIGVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApOycsXG4gICAgICAgICcgICAgICB9JyxcbiAgICAgICAgJycsXG4gICAgICAgICcgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpOycsXG4gICAgICAgICcgICAgfSwnLFxuICAgICAgICAnICAgIGVuYWJsZWQ6ICEhY29uZmlnPy5hcGlCYXNlVXJsLCcsXG4gICAgICAgICcgICAgLi4ub3B0aW9ucywnLFxuICAgICAgICAnICB9KTsnLFxuICAgICAgICAnfScsXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIFJvb3RTZXJ2aWNlLnRzXG4gICAgbmV3IFNhbXBsZUZpbGUocHJvamVjdCwgYCR7b3B0aW9ucy5zcmNkaXJ9L3NlcnZpY2VzL1Jvb3RTZXJ2aWNlLnRzYCwge1xuICAgICAgY29udGVudHM6IGBpbXBvcnQgeyBVc2VRdWVyeU9wdGlvbnMgfSBmcm9tICdAdGFuc3RhY2svcmVhY3QtcXVlcnknO1xuaW1wb3J0IHsgdXNlQmFzZVF1ZXJ5IH0gZnJvbSAnLi9CYXNlU2VydmljZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VSb290UXVlcnk8VERhdGEgPSB1bmtub3duPihcbiAgb3B0aW9ucz86IE9taXQ8VXNlUXVlcnlPcHRpb25zPFREYXRhPiwgJ3F1ZXJ5S2V5JyB8ICdxdWVyeUZuJz5cbikge1xuICByZXR1cm4gdXNlQmFzZVF1ZXJ5PFREYXRhPignLycsIG9wdGlvbnMpO1xufVxuYCxcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBBcHAuY3NzXG4gICAgbmV3IFNhbXBsZUZpbGUocHJvamVjdCwgYCR7b3B0aW9ucy5zcmNkaXJ9L0FwcC5jc3NgLCB7XG4gICAgICBjb250ZW50czogYCNyb290IHtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbn1cblxuLmxvZ28ge1xuICBoZWlnaHQ6IDZlbTtcbiAgcGFkZGluZzogMS41ZW07XG4gIHdpbGwtY2hhbmdlOiBmaWx0ZXI7XG4gIHRyYW5zaXRpb246IGZpbHRlciAzMDBtcztcbn1cbi5sb2dvOmhvdmVyIHtcbiAgZmlsdGVyOiBkcm9wLXNoYWRvdygwIDAgMmVtICM2NDZjZmZhYSk7XG59XG4ubG9nby5yZWFjdDpob3ZlciB7XG4gIGZpbHRlcjogZHJvcC1zaGFkb3coMCAwIDJlbSAjNjFkYWZiYWEpO1xufVxuXG5Aa2V5ZnJhbWVzIGxvZ28tc3BpbiB7XG4gIGZyb20ge1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xuICB9XG4gIHRvIHtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpO1xuICB9XG59XG5cbkBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogbm8tcHJlZmVyZW5jZSkge1xuICBhOm50aC1vZi10eXBlKDIpIC5sb2dvIHtcbiAgICBhbmltYXRpb246IGxvZ28tc3BpbiBpbmZpbml0ZSAyMHMgbGluZWFyO1xuICB9XG59XG5cbi5jYXJkIHtcbiAgcGFkZGluZzogMmVtO1xufVxuXG4ucmVhZC10aGUtZG9jcyB7XG4gIGNvbG9yOiAjODg4O1xufVxuYCxcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBtYWluLnRzeFxuICAgIG5ldyBTYW1wbGVGaWxlKHByb2plY3QsIGAke29wdGlvbnMuc3JjZGlyfS9tYWluLnRzeGAsIHtcbiAgICAgIGNvbnRlbnRzOiBgaW1wb3J0IHsgU3RyaWN0TW9kZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgY3JlYXRlUm9vdCB9IGZyb20gJ3JlYWN0LWRvbS9jbGllbnQnXG5pbXBvcnQgJy4vaW5kZXguY3NzJ1xuaW1wb3J0IEFwcCBmcm9tICcuL0FwcC50c3gnXG5pbXBvcnQgeyBDbGVya1Byb3ZpZGVyLCBTaWduZWRJbiwgU2lnbmVkT3V0LCBTaWduSW5CdXR0b24gfSBmcm9tICdAY2xlcmsvY2xlcmstcmVhY3QnXG5pbXBvcnQgeyB1c2VDb25maWcgfSBmcm9tICcuL2NvbmZpZydcbmltcG9ydCB7IFF1ZXJ5Q2xpZW50LCBRdWVyeUNsaWVudFByb3ZpZGVyIH0gZnJvbSBcIkB0YW5zdGFjay9yZWFjdC1xdWVyeVwiXG5cbmZ1bmN0aW9uIEFwcFdyYXBwZXIoKSB7XG4gIGNvbnN0IHsgY29uZmlnLCBpc0xvYWRpbmcgfSA9IHVzZUNvbmZpZygpO1xuICBjb25zdCBxdWVyeUNsaWVudCA9IG5ldyBRdWVyeUNsaWVudCgpXG4gIGlmIChpc0xvYWRpbmcgfHwgIWNvbmZpZykge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImxvYWRpbmctc2NyZWVuXCI+XG4gICAgICAgIExvYWRpbmcuLi5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxDbGVya1Byb3ZpZGVyIHB1Ymxpc2hhYmxlS2V5PXtjb25maWcuY2xlcmtQdWJsaXNoYWJsZUtleX0+XG4gICAgICA8UXVlcnlDbGllbnRQcm92aWRlciBjbGllbnQ9e3F1ZXJ5Q2xpZW50fT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3LWZ1bGwgaC1mdWxsXCI+XG4gICAgICAgICAgPFNpZ25lZE91dD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgbWluLWgtc2NyZWVuXCI+XG4gICAgICAgICAgICAgIDxTaWduSW5CdXR0b24vPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9TaWduZWRPdXQ+XG4gICAgICAgICAgPFNpZ25lZEluPlxuICAgICAgICAgICAgPEFwcC8+XG4gICAgICAgICAgPC9TaWduZWRJbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L1F1ZXJ5Q2xpZW50UHJvdmlkZXI+XG4gICAgPC9DbGVya1Byb3ZpZGVyPlxuICApO1xufVxuXG5jcmVhdGVSb290KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyb290JykhKS5yZW5kZXIoXG4gIDxTdHJpY3RNb2RlPlxuICAgIDxBcHBXcmFwcGVyLz5cbiAgPC9TdHJpY3RNb2RlPlxuKVxuYCxcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBpbmRleC5jc3NcbiAgICBuZXcgU2FtcGxlRmlsZShwcm9qZWN0LCBgJHtvcHRpb25zLnNyY2Rpcn0vaW5kZXguY3NzYCwge1xuICAgICAgY29udGVudHM6IGBAaW1wb3J0IFwidGFpbHdpbmRjc3NcIjtcblxuQHRoZW1lIHtcbiAgLS1jb2xvci1zY2hlbWU6IGxpZ2h0IGRhcms7XG59XG5cbjpyb290IHtcbiAgZm9udC1mYW1pbHk6IEludGVyLCBzeXN0ZW0tdWksIEF2ZW5pciwgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgbGluZS1oZWlnaHQ6IDEuNTtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcblxuICBjb2xvci1zY2hlbWU6IGxpZ2h0IGRhcms7XG5cbiAgZm9udC1zeW50aGVzaXM6IG5vbmU7XG4gIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7XG4gIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkO1xuICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlO1xufVxuXG5hIHtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgY29sb3I6ICM2NDZjZmY7XG4gIHRleHQtZGVjb3JhdGlvbjogaW5oZXJpdDtcbn1cbmE6aG92ZXIge1xuICBjb2xvcjogIzUzNWJmMjtcbn1cblxuYm9keSB7XG4gIG1hcmdpbjogMDtcbiAgbWluLXdpZHRoOiAzMjBweDtcbiAgbWluLWhlaWdodDogMTAwdmg7XG59XG5cbmgxIHtcbiAgZm9udC1zaXplOiAzLjJlbTtcbiAgbGluZS1oZWlnaHQ6IDEuMTtcbn1cblxuYnV0dG9uIHtcbiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLmxvYWRpbmctc2NyZWVuIHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGhlaWdodDogMTAwdmg7XG4gIGZvbnQtc2l6ZTogMS41cmVtO1xufVxuXG5odG1sLCBib2R5LCAjcm9vdCB7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG59XG5gLFxuICAgIH0pO1xuXG4gIH1cbn1cbiJdfQ==
|
|
676
|
+
/**
|
|
677
|
+
* Adds Playwright e2e testing support: devDeps, a `test:e2e` task, e2e-related
|
|
678
|
+
* .gitignore entries, and a scaffolded (one-time, not regenerated on synth)
|
|
679
|
+
* `playwright.config.ts` + `e2e/` starter suite. Generalizes the hand-authored
|
|
680
|
+
* suite added in macedon-technologies/exman#112 so every ViteReactProject
|
|
681
|
+
* consumer gets it for free (macedon-technologies/platform-common#98).
|
|
682
|
+
*/
|
|
683
|
+
class PlaywrightE2EComponent extends projen_1.Component {
|
|
684
|
+
constructor(project, options) {
|
|
685
|
+
super(project);
|
|
686
|
+
project.addDevDeps('@playwright/test@^1.63.0', '@clerk/testing@^2.2.34', '@clerk/backend@^3.17.2', 'dotenv@^17.4.2');
|
|
687
|
+
project.addTask('test:e2e', {
|
|
688
|
+
description: 'Run the Playwright e2e suite (needs CLERK_SECRET_KEY and E2E_CLERK_USER_ID -- see e2e/README.md)',
|
|
689
|
+
exec: 'playwright test',
|
|
690
|
+
});
|
|
691
|
+
project.addGitIgnore('playwright-report/');
|
|
692
|
+
project.addGitIgnore('test-results/');
|
|
693
|
+
project.addGitIgnore('blob-report/');
|
|
694
|
+
// `*.local` (added elsewhere) already covers `.env.local`, but not a plain `.env` --
|
|
695
|
+
// exactly where CLERK_SECRET_KEY (a real secret) is documented to go (e2e/README.md).
|
|
696
|
+
project.addGitIgnore('.env');
|
|
697
|
+
new PlaywrightConfigFile(project);
|
|
698
|
+
new E2EGlobalSetupFile(project, options);
|
|
699
|
+
new E2EClerkSignInFile(project);
|
|
700
|
+
new E2ELiveHelperFile(project);
|
|
701
|
+
new E2ESmokeSpecFile(project);
|
|
702
|
+
new E2EReadmeFile(project);
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
/**
|
|
706
|
+
* Creates the playwright.config.ts file. A `SampleFile`, not a managed `FileBase` --
|
|
707
|
+
* consumers need to customize this (e.g. exman's own config needed a live/stub
|
|
708
|
+
* branch), the same reason ViteReactProject's App.tsx/main.tsx are SampleFiles too.
|
|
709
|
+
*/
|
|
710
|
+
class PlaywrightConfigFile extends projen_1.SampleFile {
|
|
711
|
+
constructor(project) {
|
|
712
|
+
super(project, 'playwright.config.ts', {
|
|
713
|
+
contents: `import { config as loadDotenv } from 'dotenv'
|
|
714
|
+
import { defineConfig, devices } from '@playwright/test'
|
|
715
|
+
import { isLiveRun } from './e2e/support/live'
|
|
716
|
+
|
|
717
|
+
// Loaded here, first, rather than left to @clerk/testing's own internal dotenv call
|
|
718
|
+
// inside global-setup.ts: that call runs inside globalSetup, which executes AFTER
|
|
719
|
+
// Playwright has already collected every spec file and run their module-level code --
|
|
720
|
+
// so anything reading process.env before then would only ever see a .env file's values
|
|
721
|
+
// as unset. Loading it here, at the top of the config file Playwright reads before
|
|
722
|
+
// anything else, means it's populated for collection, globalSetup, and every test.
|
|
723
|
+
loadDotenv()
|
|
724
|
+
|
|
725
|
+
// Set E2E_BASE_URL to run against a real deployment (e.g. a PR's pr-deploy WebsiteUrl)
|
|
726
|
+
// instead of a local dev server -- see e2e/support/live.ts and e2e/README.md.
|
|
727
|
+
// \`|| undefined\`, not \`??\`: an empty string (e.g. an unset GitHub Actions output) is
|
|
728
|
+
// not null/undefined, so ?? would leave baseURL as '' while isLiveRun()'s plain !!
|
|
729
|
+
// check still read the run as non-live -- an invalid, silently-mismatched config.
|
|
730
|
+
const liveBaseUrl = process.env.E2E_BASE_URL || undefined
|
|
731
|
+
|
|
732
|
+
export default defineConfig({
|
|
733
|
+
testDir: './e2e',
|
|
734
|
+
fullyParallel: false,
|
|
735
|
+
forbidOnly: !!process.env.CI,
|
|
736
|
+
retries: process.env.CI ? 1 : 0,
|
|
737
|
+
reporter: process.env.CI ? [['html', { open: 'never' }]] : 'list',
|
|
738
|
+
globalSetup: './e2e/support/global-setup.ts',
|
|
739
|
+
use: {
|
|
740
|
+
baseURL: liveBaseUrl ?? 'http://localhost:5173',
|
|
741
|
+
trace: 'on-first-retry',
|
|
742
|
+
},
|
|
743
|
+
projects: [
|
|
744
|
+
{ name: 'chromium', use: { ...devices['Desktop Chrome'] } },
|
|
745
|
+
],
|
|
746
|
+
// No local server to manage when pointed at a live deployment.
|
|
747
|
+
webServer: isLiveRun() ? undefined : {
|
|
748
|
+
command: '${(0, utils_1.runScriptCommand)(project.package.packageManager, 'dev')}',
|
|
749
|
+
url: 'http://localhost:5173',
|
|
750
|
+
reuseExistingServer: !process.env.CI,
|
|
751
|
+
timeout: 60_000,
|
|
752
|
+
},
|
|
753
|
+
})
|
|
754
|
+
`,
|
|
755
|
+
});
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
/**
|
|
759
|
+
* Creates e2e/support/global-setup.ts, which primes @clerk/testing for the sign-in
|
|
760
|
+
* flow in clerk-sign-in.ts. Reads the Clerk publishable key from the scaffolded
|
|
761
|
+
* public/config.json (ConfigJsonFile) rather than hardcoding one -- ViteReactProject's
|
|
762
|
+
* own app fetches that key at runtime the same way (see config.ts), so there's no
|
|
763
|
+
* build-time constant this construct could embed instead.
|
|
764
|
+
*/
|
|
765
|
+
class E2EGlobalSetupFile extends projen_1.SampleFile {
|
|
766
|
+
constructor(project, options) {
|
|
767
|
+
super(project, 'e2e/support/global-setup.ts', {
|
|
768
|
+
contents: `import { readFileSync } from 'fs'
|
|
769
|
+
import { clerkSetup } from '@clerk/testing/playwright'
|
|
770
|
+
|
|
771
|
+
// A no-op (not a throw) when CLERK_SECRET_KEY is missing: every spec that needs a
|
|
772
|
+
// signed-in user already skips itself in that case (see ../smoke.spec.ts), so running
|
|
773
|
+
// the suite without secrets configured yet reports "skipped", not a crashed global
|
|
774
|
+
// setup. See e2e/README.md for how to get a secret key.
|
|
775
|
+
export default async function globalSetup() {
|
|
776
|
+
if (!process.env.CLERK_SECRET_KEY) {
|
|
777
|
+
return
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
// import.meta.url, not __dirname: the web package sets "type": "module" (ViteComponent),
|
|
781
|
+
// so this file runs as ESM, where __dirname isn't defined. fs.readFileSync accepts a URL
|
|
782
|
+
// directly, so no need to convert it to a path first.
|
|
783
|
+
const configPath = new URL('../../${options.publicDir}/config.json', import.meta.url)
|
|
784
|
+
const { clerkPublishableKey } = JSON.parse(readFileSync(configPath, 'utf-8'))
|
|
785
|
+
|
|
786
|
+
await clerkSetup({ publishableKey: clerkPublishableKey })
|
|
787
|
+
}
|
|
788
|
+
`,
|
|
789
|
+
});
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
/**
|
|
793
|
+
* Creates e2e/support/clerk-sign-in.ts. Signs in as a specific Clerk user by id via a
|
|
794
|
+
* backend-issued sign-in token (ticket strategy), bypassing the app's actual sign-in
|
|
795
|
+
* UI -- which typically only exposes an OAuth provider button that can't be driven
|
|
796
|
+
* reliably from a test. @clerk/testing/playwright's own `clerk.signIn({ emailAddress })`
|
|
797
|
+
* does the same ticket exchange internally after an extra email->user lookup; going
|
|
798
|
+
* from a user id directly (E2E_CLERK_USER_ID) skips that lookup and its failure mode
|
|
799
|
+
* (an existing user without a verified email attached).
|
|
800
|
+
*/
|
|
801
|
+
class E2EClerkSignInFile extends projen_1.SampleFile {
|
|
802
|
+
constructor(project) {
|
|
803
|
+
super(project, 'e2e/support/clerk-sign-in.ts', {
|
|
804
|
+
contents: `import { createClerkClient } from '@clerk/backend'
|
|
805
|
+
import { clerk } from '@clerk/testing/playwright'
|
|
806
|
+
import type { Page } from '@playwright/test'
|
|
807
|
+
|
|
808
|
+
/**
|
|
809
|
+
* Signs in as a specific Clerk user by id. Requires CLERK_SECRET_KEY (also used by
|
|
810
|
+
* global-setup.ts) and a prior page.goto() to a page that loads Clerk.
|
|
811
|
+
*/
|
|
812
|
+
export async function signInAsUser(page: Page, userId: string): Promise<void> {
|
|
813
|
+
const clerkClient = createClerkClient({ secretKey: process.env.CLERK_SECRET_KEY })
|
|
814
|
+
const { token } = await clerkClient.signInTokens.createSignInToken({
|
|
815
|
+
userId,
|
|
816
|
+
expiresInSeconds: 300,
|
|
817
|
+
})
|
|
818
|
+
await clerk.signIn({ page, signInParams: { strategy: 'ticket', ticket: token } })
|
|
819
|
+
}
|
|
820
|
+
`,
|
|
821
|
+
});
|
|
822
|
+
}
|
|
823
|
+
}
|
|
824
|
+
/**
|
|
825
|
+
* Creates e2e/support/live.ts.
|
|
826
|
+
*/
|
|
827
|
+
class E2ELiveHelperFile extends projen_1.SampleFile {
|
|
828
|
+
constructor(project) {
|
|
829
|
+
super(project, 'e2e/support/live.ts', {
|
|
830
|
+
contents: `/**
|
|
831
|
+
* True when this run targets a real deployment (E2E_BASE_URL set -- see
|
|
832
|
+
* playwright.config.ts) rather than a local dev server. Specs read this to decide
|
|
833
|
+
* whether to stub the backend: a live run must hit the real API to prove anything,
|
|
834
|
+
* and stubbing it would just be testing the stub.
|
|
835
|
+
*/
|
|
836
|
+
export function isLiveRun(): boolean {
|
|
837
|
+
return !!process.env.E2E_BASE_URL
|
|
838
|
+
}
|
|
839
|
+
`,
|
|
840
|
+
});
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
/**
|
|
844
|
+
* Creates e2e/smoke.spec.ts -- a generic starter test that only relies on markup
|
|
845
|
+
* ViteReactProject's own scaffolded main.tsx/App.tsx always render (SignedIn/
|
|
846
|
+
* UserButton), so it works before a consumer has written any real pages. Consumers
|
|
847
|
+
* are expected to extend/replace this with real flows, the same way they already
|
|
848
|
+
* customize App.tsx.
|
|
849
|
+
*/
|
|
850
|
+
class E2ESmokeSpecFile extends projen_1.SampleFile {
|
|
851
|
+
constructor(project) {
|
|
852
|
+
super(project, 'e2e/smoke.spec.ts', {
|
|
853
|
+
contents: `import { test, expect } from '@playwright/test'
|
|
854
|
+
import { signInAsUser } from './support/clerk-sign-in'
|
|
855
|
+
|
|
856
|
+
test('signs in and shows the authenticated UserButton', async ({ page }) => {
|
|
857
|
+
// Read from inside the test body, not module scope: Playwright collects (requires)
|
|
858
|
+
// this file before running globalSetup, so a module-level check would always see a
|
|
859
|
+
// .env-sourced value as unset. Exporting the var in the shell works either way.
|
|
860
|
+
const testUserId = process.env.E2E_CLERK_USER_ID
|
|
861
|
+
test.skip(
|
|
862
|
+
!testUserId || !process.env.CLERK_SECRET_KEY,
|
|
863
|
+
'E2E_CLERK_USER_ID and CLERK_SECRET_KEY must both be set -- see e2e/README.md',
|
|
864
|
+
)
|
|
865
|
+
|
|
866
|
+
// signInAsUser requires a prior page.goto() to a page that loads Clerk.
|
|
867
|
+
await page.goto('/')
|
|
868
|
+
await signInAsUser(page, testUserId!)
|
|
869
|
+
await page.goto('/')
|
|
870
|
+
|
|
871
|
+
// '.cl-userButtonTrigger' is one of Clerk's own documented, stable \`cl-\`-prefixed
|
|
872
|
+
// class hooks (part of its theming/appearance API), not an incidental DOM detail --
|
|
873
|
+
// safer to depend on across Clerk versions than app-specific markup this construct
|
|
874
|
+
// doesn't control.
|
|
875
|
+
await expect(page.locator('.cl-userButtonTrigger')).toBeVisible()
|
|
876
|
+
})
|
|
877
|
+
`,
|
|
878
|
+
});
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
/**
|
|
882
|
+
* Creates e2e/README.md documenting the one-time setup and env var convention every
|
|
883
|
+
* consumer needs, so it doesn't have to be re-derived by hand per repo.
|
|
884
|
+
*/
|
|
885
|
+
class E2EReadmeFile extends projen_1.SampleFile {
|
|
886
|
+
constructor(project) {
|
|
887
|
+
const testE2eCommand = (0, utils_1.runScriptCommand)(project.package.packageManager, 'test:e2e');
|
|
888
|
+
super(project, 'e2e/README.md', {
|
|
889
|
+
contents: `# Playwright e2e suite
|
|
890
|
+
|
|
891
|
+
Runs against a real dev server (or a live deployment, via \`E2E_BASE_URL\`) and real
|
|
892
|
+
Clerk authentication.
|
|
893
|
+
|
|
894
|
+
## One-time setup
|
|
895
|
+
|
|
896
|
+
1. Install Playwright's browser binary (not covered by a plain dependency install):
|
|
897
|
+
|
|
898
|
+
\`\`\`bash
|
|
899
|
+
npx playwright install chromium
|
|
900
|
+
\`\`\`
|
|
901
|
+
|
|
902
|
+
2. Get two values from your Clerk dashboard's dev instance:
|
|
903
|
+
|
|
904
|
+
- \`CLERK_SECRET_KEY\` -- the **secret** key (API Keys). Never commit this; export it
|
|
905
|
+
in your shell or put it in a local, gitignored \`.env\`.
|
|
906
|
+
- \`E2E_CLERK_USER_ID\` -- the id (\`user_...\`) of an existing test user (Users -> click
|
|
907
|
+
a user, the id is shown at the top). The user needs a verified email address, not
|
|
908
|
+
just an OAuth connection -- a sign-in token has to bind to a verified
|
|
909
|
+
identification. Creating a dedicated test user with an email set explicitly is the
|
|
910
|
+
safer default.
|
|
911
|
+
|
|
912
|
+
A run with either variable unset **skips** rather than failing, so \`${testE2eCommand}\`
|
|
913
|
+
is always safe to run without them.
|
|
914
|
+
|
|
915
|
+
3. This construct doesn't manage \`vitest.config.ts\` (it's a hand-authored,
|
|
916
|
+
per-consumer file). Add an \`exclude\` entry so vitest's default test glob doesn't
|
|
917
|
+
also try to pick up these Playwright spec files:
|
|
918
|
+
|
|
919
|
+
\`\`\`ts
|
|
920
|
+
import { defineConfig, configDefaults } from 'vitest/config'
|
|
921
|
+
|
|
922
|
+
export default defineConfig({
|
|
923
|
+
test: {
|
|
924
|
+
exclude: [...configDefaults.exclude, 'e2e/**'],
|
|
925
|
+
// ...your existing config
|
|
926
|
+
},
|
|
927
|
+
})
|
|
928
|
+
\`\`\`
|
|
929
|
+
|
|
930
|
+
## Running
|
|
931
|
+
|
|
932
|
+
\`\`\`bash
|
|
933
|
+
CLERK_SECRET_KEY=... E2E_CLERK_USER_ID=... ${testE2eCommand}
|
|
934
|
+
\`\`\`
|
|
935
|
+
|
|
936
|
+
## Running against a live environment
|
|
937
|
+
|
|
938
|
+
Set \`E2E_BASE_URL\` to point the suite at a real deployment (a personal dev stack, or a
|
|
939
|
+
PR's pr-deploy \`WebsiteUrl\`, posted as a PR comment) instead of a local dev server:
|
|
940
|
+
|
|
941
|
+
\`\`\`bash
|
|
942
|
+
E2E_BASE_URL=https://<your-stack>.example.com \\
|
|
943
|
+
CLERK_SECRET_KEY=... E2E_CLERK_USER_ID=... \\
|
|
944
|
+
${testE2eCommand}
|
|
945
|
+
\`\`\`
|
|
946
|
+
|
|
947
|
+
## CI
|
|
948
|
+
|
|
949
|
+
The generated \`pr-deploy.yml\` workflow (see \`PrDeployWorkflow\`) already runs this
|
|
950
|
+
suite against each PR's deployed \`WebsiteUrl\` and uploads the HTML report as a build
|
|
951
|
+
artifact on failure. It self-skips exactly like a local run until both secrets exist
|
|
952
|
+
in the repo:
|
|
953
|
+
|
|
954
|
+
\`\`\`bash
|
|
955
|
+
gh secret set CLERK_SECRET_KEY
|
|
956
|
+
gh secret set E2E_CLERK_USER_ID
|
|
957
|
+
\`\`\`
|
|
958
|
+
`,
|
|
959
|
+
});
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVml0ZVJlYWN0UHJvamVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9WaXRlUmVhY3RQcm9qZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUEwQztBQUMxQyxtQ0FBc0Y7QUFDdEYsc0RBQXVGO0FBRXZGLG1DQUEyQztBQW1DM0M7O0dBRUc7QUFDSCxNQUFhLGdCQUFpQixTQUFRLGlDQUFvQjtJQUN4QyxNQUFNLENBQVM7SUFDZixTQUFTLENBQVM7SUFDbEIsVUFBVSxDQUFTO0lBQ2xCLFlBQVksQ0FBc0I7SUFFbkQsWUFBWSxPQUFnQztRQUMxQyxNQUFNLEVBQ0osVUFBVSxHQUFHLElBQUksRUFDakIsTUFBTSxHQUFHLEtBQUssRUFDZCxTQUFTLEdBQUcsUUFBUSxFQUNwQixLQUFLLEVBQ0wsVUFBVSxHQUFHLElBQUksRUFDakIsR0FBRyxXQUFXLEVBQ2YsR0FBRyxPQUFPLENBQUM7UUFDWixLQUFLLENBQUM7WUFDSixHQUFHLFdBQVc7WUFDZCxVQUFVLEVBQUUsS0FBSyxFQUFFLHFDQUFxQztZQUN4RCxNQUFNLEVBQUUsS0FBSyxFQUFFLG1DQUFtQztZQUNsRCxJQUFJLEVBQUUsS0FBSyxFQUFFLDZCQUE2QjtZQUMxQyxPQUFPLEVBQUUsSUFBSTtZQUNiLGVBQWUsRUFBRSxJQUFJLEVBQUUsa0NBQWtDO1lBQ3pELGNBQWMsRUFBRyxXQUFXLENBQUMsTUFBd0IsQ0FBQyxPQUFPLENBQUMsY0FBYztZQUM1RSxXQUFXLEVBQUU7Z0JBQ1gsb0JBQW9CLEVBQUU7b0JBQ3BCLHVFQUF1RTtvQkFDdkUsc0VBQXNFO29CQUN0RSxvRUFBb0U7b0JBQ3BFLCtEQUErRDtvQkFDL0QsV0FBVyxFQUFFO3dCQUNYLFNBQVMsRUFBRSxJQUFJO3dCQUNmLGVBQWUsRUFBRSxJQUFJO3FCQUN0QjtvQkFDRCxHQUFHLFdBQVcsQ0FBQyxXQUFXLEVBQUUsb0JBQW9CO2lCQUNqRDthQUNGO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLG9C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QyxPQUFPLEVBQUUsZUFBZSxFQUFFO1lBQzlCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MEVBdUIwRCxjQUFjOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7NkNBcUIzQyxjQUFjOzs7Ozs7Ozs7OztFQVd6RCxjQUFjOzs7Ozs7Ozs7Ozs7OztDQWNmO1NBQ0ksQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVsYXRpdmUsIGJhc2VuYW1lIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBDb21wb25lbnQsIEZpbGVCYXNlLCBKc29uRmlsZSwgUHJvamVjdCwgU2FtcGxlRmlsZSwgVGV4dEZpbGUgfSBmcm9tICdwcm9qZW4nO1xuaW1wb3J0IHsgVHlwZVNjcmlwdEFwcFByb2plY3QsIFR5cGVTY3JpcHRQcm9qZWN0T3B0aW9ucyB9IGZyb20gJ3Byb2plbi9saWIvdHlwZXNjcmlwdCc7XG5pbXBvcnQgeyBCYXRtYW5Qcm9qZWN0IH0gZnJvbSAnLi9CYXRtYW5Qcm9qZWN0JztcbmltcG9ydCB7IHJ1blNjcmlwdENvbW1hbmQgfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGludGVyZmFjZSBWaXRlUmVhY3RQcm9qZWN0T3B0aW9ucyBleHRlbmRzIFR5cGVTY3JpcHRQcm9qZWN0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIHNhbXBsZSBjb2RlXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHNhbXBsZUNvZGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTb3VyY2UgZGlyZWN0b3J5XG4gICAqIEBkZWZhdWx0IFwic3JjXCJcbiAgICovXG4gIHJlYWRvbmx5IHNyY2Rpcj86IHN0cmluZztcblxuICAvKipcbiAgICogUHVibGljIGRpcmVjdG9yeSBmb3Igc3RhdGljIGFzc2V0c1xuICAgKiBAZGVmYXVsdCBcInB1YmxpY1wiXG4gICAqL1xuICByZWFkb25seSBwdWJsaWNEaXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRpdGxlIGZvciB0aGUgSFRNTCBwYWdlXG4gICAqIEBkZWZhdWx0IHByb2plY3QgbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgdGl0bGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWRkIFBsYXl3cmlnaHQgZTJlIHRlc3Rpbmcgc3VwcG9ydCAoZGV2RGVwcywgYSBgdGVzdDplMmVgIHRhc2ssXG4gICAqIGFuZCBhIHNjYWZmb2xkZWQgYHBsYXl3cmlnaHQuY29uZmlnLnRzYCArIGBlMmUvYCBzdGFydGVyIHN1aXRlKS5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZTJlVGVzdGluZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVml0ZSArIFJlYWN0IFR5cGVTY3JpcHQgcHJvamVjdFxuICovXG5leHBvcnQgY2xhc3MgVml0ZVJlYWN0UHJvamVjdCBleHRlbmRzIFR5cGVTY3JpcHRBcHBQcm9qZWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IHNyY2Rpcjogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgcHVibGljRGlyOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBkZXZDb21tYW5kOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnRmllbGRzOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFZpdGVSZWFjdFByb2plY3RPcHRpb25zKSB7XG4gICAgY29uc3Qge1xuICAgICAgc2FtcGxlQ29kZSA9IHRydWUsXG4gICAgICBzcmNkaXIgPSAnc3JjJyxcbiAgICAgIHB1YmxpY0RpciA9ICdwdWJsaWMnLFxuICAgICAgdGl0bGUsXG4gICAgICBlMmVUZXN0aW5nID0gdHJ1ZSxcbiAgICAgIC4uLnJlc3RPcHRpb25zXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ucmVzdE9wdGlvbnMsXG4gICAgICBzYW1wbGVDb2RlOiBmYWxzZSwgLy8gV2UnbGwgaGFuZGxlIHNhbXBsZSBjb2RlIG91cnNlbHZlc1xuICAgICAgZXNsaW50OiBmYWxzZSwgLy8gV2UnbGwgY29uZmlndXJlIGVzbGludCBvdXJzZWx2ZXNcbiAgICAgIGplc3Q6IGZhbHNlLCAvLyBWaXRlIHVzZXMgdml0ZXN0IHR5cGljYWxseVxuICAgICAgcGFja2FnZTogdHJ1ZSxcbiAgICAgIGRpc2FibGVUc2NvbmZpZzogdHJ1ZSwgLy8gV2UnbGwgbWFuYWdlIHRzY29uZmlnIG91cnNlbHZlc1xuICAgICAgcGFja2FnZU1hbmFnZXI6IChyZXN0T3B0aW9ucy5wYXJlbnQgYXMgQmF0bWFuUHJvamVjdCkucGFja2FnZS5wYWNrYWdlTWFuYWdlcixcbiAgICAgIHBucG1PcHRpb25zOiB7XG4gICAgICAgIHdvcmtzcGFjZVlhbWxPcHRpb25zOiB7XG4gICAgICAgICAgLy8gVGhpcyBzdWJwcm9qZWN0IGhhcyBpdHMgb3duIHNlcGFyYXRlIGxvY2tmaWxlL3N0b3JlIGZyb20gaXRzIHBhcmVudCxcbiAgICAgICAgICAvLyBzbyBpdCBuZWVkcyBpdHMgb3duIGFwcHJvdmFsIGZvciB0aGUgbmF0aXZlIHBvc3RpbnN0YWxsIHNjcmlwdHMgaXRzXG4gICAgICAgICAgLy8gZml4ZWQgZGVwZW5kZW5jeSBzZXQgYWx3YXlzIG5lZWRzIChlc2J1aWxkJ3MgYmluYXJ5IGRvd25sb2FkLCBhbmRcbiAgICAgICAgICAvLyBAY2xlcmsvY2xlcmstcmVhY3QncyB0cmFuc2l0aXZlIEBjbGVyay9zaGFyZWQgc2V0dXAgc2NyaXB0KS5cbiAgICAgICAgICBhbGxvd0J1aWxkczoge1xuICAgICAgICAgICAgJ2VzYnVpbGQnOiB0cnVlLFxuICAgICAgICAgICAgJ0BjbGVyay9zaGFyZWQnOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4ucmVzdE9wdGlvbnMucG5wbU9wdGlvbnM/LndvcmtzcGFjZVlhbWxPcHRpb25zLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGRlcHM6IFtcbiAgICAgICAgJ0BjbGVyay9jbGVyay1yZWFjdCcsXG4gICAgICAgICdAdGFuc3RhY2svcmVhY3QtcXVlcnknLFxuICAgICAgICAnQHRhaWx3aW5kY3NzL3Bvc3Rjc3MnLFxuICAgICAgICAnYXV0b3ByZWZpeGVyJyxcbiAgICAgICAgJ3Bvc3Rjc3MnLFxuICAgICAgICAndGFpbHdpbmRjc3MnLFxuICAgICAgICAncm9sbHVwJyxcbiAgICAgICAgLi4uKG9wdGlvbnMuZGVwcyA/IG9wdGlvbnMuZGVwcyA6IFtdKSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICAvLyBJbml0aWFsaXplIGNvbmZpZyBmaWVsZHMgc3RvcmFnZVxuICAgIHRoaXMuY29uZmlnRmllbGRzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICAgIHRoaXMuc3JjZGlyID0gc3JjZGlyO1xuICAgIHRoaXMucHVibGljRGlyID0gcHVibGljRGlyO1xuXG4gICAgLy8gQWRkIFZpdGUgY29tcG9uZW50XG4gICAgbmV3IFZpdGVDb21wb25lbnQodGhpcywge1xuICAgICAgc3JjZGlyOiB0aGlzLnNyY2RpcixcbiAgICB9KTtcblxuICAgIC8vIEFkZCBFU0xpbnQgY29uZmlndXJhdGlvblxuICAgIG5ldyBWaXRlRXNsaW50Q29uZmlnKHRoaXMpO1xuXG4gICAgLy8gQWRkIGluZGV4Lmh0bWxcbiAgICBuZXcgSW5kZXhIdG1sKHRoaXMsIHtcbiAgICAgIHRpdGxlOiB0aXRsZSA/PyB0aGlzLm5hbWUsXG4gICAgICBzcmNkaXI6IHRoaXMuc3JjZGlyLFxuICAgIH0pO1xuXG4gICAgLy8gQWRkIFR5cGVTY3JpcHQgY29uZmlnc1xuICAgIG5ldyBWaXRlVHNDb25maWdzKHRoaXMsIHtcbiAgICAgIHNyY2RpcjogdGhpcy5zcmNkaXIsXG4gICAgfSk7XG5cbiAgICAvLyBBZGQgLmdpdGlnbm9yZSBlbnRyaWVzXG4gICAgdGhpcy5naXRpZ25vcmU/LmFkZFBhdHRlcm5zKCdkaXN0JywgJ2Rpc3Qtc3NyJywgJyoubG9jYWwnKTtcblxuICAgIC8vIEFkZCB2aXRlLWVudi5kLnRzIGZvciB0eXBlIGRlY2xhcmF0aW9uc1xuICAgIG5ldyBWaXRlRW52RHRzKHRoaXMsIHtcbiAgICAgIHNyY2RpcjogdGhpcy5zcmNkaXIsXG4gICAgfSk7XG5cbiAgICAvLyBBZGQgUG9zdENTUyBjb25maWcgZm9yIFRhaWx3aW5kXG4gICAgbmV3IFBvc3RDU1NDb25maWdGaWxlKHRoaXMpO1xuXG4gICAgLy8gQWRkIGNvbmZpZy50cyBmb3IgcnVudGltZSBjb25maWd1cmF0aW9uXG4gICAgbmV3IENvbmZpZ0ZpbGUodGhpcywge1xuICAgICAgc3JjZGlyOiB0aGlzLnNyY2RpcixcbiAgICB9KTtcblxuICAgIC8vIEFkZCBzYW1wbGUgY29uZmlnLmpzb25cbiAgICBuZXcgQ29uZmlnSnNvbkZpbGUodGhpcywgeyB9KTtcblxuXG4gICAgLy8gQWRkIHNhbXBsZSBjb2RlIGlmIHJlcXVlc3RlZFxuICAgIGlmIChzYW1wbGVDb2RlKSB7XG4gICAgICBuZXcgVml0ZVNhbXBsZUNvZGUodGhpcywge1xuICAgICAgICBzcmNkaXI6IHRoaXMuc3JjZGlyLFxuICAgICAgICBwdWJsaWNEaXI6IHRoaXMucHVibGljRGlyLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIFBsYXl3cmlnaHQgZTJlIHRlc3Rpbmcgc3VwcG9ydFxuICAgIGlmIChlMmVUZXN0aW5nKSB7XG4gICAgICBuZXcgUGxheXdyaWdodEUyRUNvbXBvbmVudCh0aGlzLCB7XG4gICAgICAgIHB1YmxpY0RpcjogdGhpcy5wdWJsaWNEaXIsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBVc2UgcmVsYXRpdmUgcGF0aCBmb3IgZGV2Q29tbWFuZFxuICAgIGNvbnN0IHJlbGF0aXZlT3V0ZGlyID0gdGhpcy5wYXJlbnRcbiAgICAgID8gcmVsYXRpdmUodGhpcy5wYXJlbnQub3V0ZGlyLCB0aGlzLm91dGRpcilcbiAgICAgIDogYmFzZW5hbWUodGhpcy5vdXRkaXIpO1xuICAgIHRoaXMuZGV2Q29tbWFuZCA9IGBjZCAke3JlbGF0aXZlT3V0ZGlyfSAmJiAke3J1blNjcmlwdENvbW1hbmQodGhpcy5wYWNrYWdlLnBhY2thZ2VNYW5hZ2VyLCAnZGV2Jyl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBjdXN0b20gZmllbGQgdG8gdGhlIENvbmZpZyB0eXBlXG4gICAqIEBwYXJhbSBmaWVsZE5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpZWxkXG4gICAqIEBwYXJhbSBmaWVsZFR5cGUgVGhlIFR5cGVTY3JpcHQgdHlwZSBvZiB0aGUgZmllbGQgKGUuZy4sICdzdHJpbmcnLCAnbnVtYmVyJywgJ2Jvb2xlYW4nLCAnc3RyaW5nW10nKVxuICAgKiBAcmV0dXJucyB0aGlzIHByb2plY3QgaW5zdGFuY2UgZm9yIGNoYWluaW5nXG4gICAqL1xuICBhZGRDb25maWdGaWVsZChmaWVsZE5hbWU6IHN0cmluZywgZmllbGRUeXBlOiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLmNvbmZpZ0ZpZWxkcy5zZXQoZmllbGROYW1lLCBmaWVsZFR5cGUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY29uZmlnIGZpZWxkcyBtYXAgKGZvciBpbnRlcm5hbCB1c2UgYnkgQ29uZmlnRmlsZSlcbiAgICogQGludGVybmFsXG4gICAqL1xuICBnZXRDb25maWdGaWVsZHMoKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnRmllbGRzO1xuICB9XG59XG5cbmludGVyZmFjZSBWaXRlQ29tcG9uZW50T3B0aW9ucyB7XG4gIHJlYWRvbmx5IHNyY2Rpcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyZXMgVml0ZSBkZXBlbmRlbmNpZXMgYW5kIHNjcmlwdHNcbiAqL1xuY2xhc3MgVml0ZUNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IFR5cGVTY3JpcHRBcHBQcm9qZWN0LCBfb3B0aW9uczogVml0ZUNvbXBvbmVudE9wdGlvbnMpIHtcbiAgICBzdXBlcihwcm9qZWN0KTtcblxuICAgIGNvbnN0IHRzUHJvamVjdCA9IHByb2plY3QgYXMgVHlwZVNjcmlwdEFwcFByb2plY3Q7XG5cbiAgICAvLyBTZXQgcGFja2FnZSB0eXBlIHRvIG1vZHVsZSBmb3IgRVNNIHN1cHBvcnRcbiAgICB0c1Byb2plY3QucGFja2FnZS5hZGRGaWVsZCgndHlwZScsICdtb2R1bGUnKTtcblxuICAgIC8vIEFkZCBSZWFjdCBkZXBlbmRlbmNpZXNcbiAgICB0c1Byb2plY3QuYWRkRGVwcygncmVhY3RAXjE5LjIuMCcsICdyZWFjdC1kb21AXjE5LjIuMCcpO1xuXG4gICAgLy8gQWRkIGRldiBkZXBlbmRlbmNpZXNcbiAgICB0c1Byb2plY3QuYWRkRGV2RGVwcyhcbiAgICAgICdAdHlwZXMvcmVhY3RAXjE5LjIuMicsXG4gICAgICAnQHR5cGVzL3JlYWN0LWRvbUBeMTkuMi4yJyxcbiAgICAgICdAdml0ZWpzL3BsdWdpbi1yZWFjdEBeNS4xLjAnLFxuICAgICAgJ3ZpdGVAXjUuNC4wJyxcbiAgICAgICd0eXBlc2NyaXB0QH41LjkuMycsXG4gICAgICAnQGVzbGludC9qc0BeOS4zOS4xJyxcbiAgICAgICdlc2xpbnRAXjkuMzkuMScsXG4gICAgICAnZXNsaW50LXBsdWdpbi1yZWFjdC1ob29rc0BeNS4yLjAnLFxuICAgICAgJ2VzbGludC1wbHVnaW4tcmVhY3QtcmVmcmVzaEBeMC40LjI0JyxcbiAgICAgICdnbG9iYWxzQF4xNi41LjAnLFxuICAgICAgJ3R5cGVzY3JpcHQtZXNsaW50QF44LjQ2LjMnLFxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgdml0ZS5jb25maWcudHMgYXMgYSBtYW5hZ2VkIGZpbGVcbiAgICBuZXcgVml0ZUNvbmZpZ0ZpbGUocHJvamVjdCk7XG5cbiAgICAvLyBBZGQgc2NyaXB0c1xuICAgIHRzUHJvamVjdC5hZGRUYXNrKCdkZXYnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1N0YXJ0IGRldmVsb3BtZW50IHNlcnZlcicsXG4gICAgICBleGVjOiAndml0ZScsXG4gICAgfSk7XG5cbiAgICAvLyBSZW1vdmUgYW5kIHJlY3JlYXRlIGJ1aWxkIHRhc2sgdG8gY3VzdG9taXplIGl0IGZvciBWaXRlXG4gICAgdHNQcm9qZWN0LnJlbW92ZVRhc2soJ2J1aWxkJyk7XG4gICAgdHNQcm9qZWN0LmFkZFRhc2soJ2J1aWxkJywge1xuICAgICAgZGVzY3JpcHRpb246ICdCdWlsZCBmb3IgcHJvZHVjdGlvbicsXG4gICAgICBleGVjOiAndHNjIC1iICYmIHZpdGUgYnVpbGQnLFxuICAgIH0pO1xuXG4gICAgdHNQcm9qZWN0LmFkZFRhc2soJ3ByZXZpZXcnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1ByZXZpZXcgcHJvZHVjdGlvbiBidWlsZCcsXG4gICAgICBleGVjOiAndml0ZSBwcmV2aWV3JyxcbiAgICB9KTtcblxuICAgIHRzUHJvamVjdC5hZGRUYXNrKCdsaW50Jywge1xuICAgICAgZGVzY3JpcHRpb246ICdMaW50IGNvZGUnLFxuICAgICAgZXhlYzogJ2VzbGludCAuJyxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIEVTTGludCBjb25maWd1cmF0aW9uIGZvciBWaXRlICsgUmVhY3RcbiAqL1xuY2xhc3MgVml0ZUVzbGludENvbmZpZyBleHRlbmRzIEZpbGVCYXNlIHtcbiAgY29uc3RydWN0b3IocHJvamVjdDogUHJvamVjdCkge1xuICAgIHN1cGVyKHByb2plY3QsICdlc2xpbnQuY29uZmlnLmpzJywge1xuICAgICAgbWFya2VyOiB0cnVlLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICBzeW50aGVzaXplQ29udGVudCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBgaW1wb3J0IGpzIGZyb20gJ0Blc2xpbnQvanMnXG5pbXBvcnQgZ2xvYmFscyBmcm9tICdnbG9iYWxzJ1xuaW1wb3J0IHJlYWN0SG9va3MgZnJvbSAnZXNsaW50LXBsdWdpbi1yZWFjdC1ob29rcydcbmltcG9ydCByZWFjdFJlZnJlc2ggZnJvbSAnZXNsaW50LXBsdWdpbi1yZWFjdC1yZWZyZXNoJ1xuaW1wb3J0IHRzZXNsaW50IGZyb20gJ3R5cGVzY3JpcHQtZXNsaW50J1xuXG5leHBvcnQgZGVmYXVsdCBbXG4gIHsgaWdub3JlczogWydkaXN0J10gfSxcbiAge1xuICAgIGZpbGVzOiBbJyoqLyoue3RzLHRzeH0nXSxcbiAgICBsYW5ndWFnZU9wdGlvbnM6IHtcbiAgICAgIGVjbWFWZXJzaW9uOiAyMDIwLFxuICAgICAgZ2xvYmFsczogZ2xvYmFscy5icm93c2VyLFxuICAgIH0sXG4gICAgcGx1Z2luczoge1xuICAgICAgJ3JlYWN0LWhvb2tzJzogcmVhY3RIb29rcyxcbiAgICAgICdyZWFjdC1yZWZyZXNoJzogcmVhY3RSZWZyZXNoLFxuICAgIH0sXG4gICAgcnVsZXM6IHtcbiAgICAgIC4uLnJlYWN0SG9va3MuY29uZmlncy5yZWNvbW1lbmRlZC5ydWxlcyxcbiAgICAgICdyZWFjdC1yZWZyZXNoL29ubHktZXhwb3J0LWNvbXBvbmVudHMnOiBbXG4gICAgICAgICd3YXJuJyxcbiAgICAgICAgeyBhbGxvd0NvbnN0YW50RXhwb3J0OiB0cnVlIH0sXG4gICAgICBdLFxuICAgIH0sXG4gIH0sXG4gIGpzLmNvbmZpZ3MucmVjb21tZW5kZWQsXG4gIC4uLnRzZXNsaW50LmNvbmZpZ3MucmVjb21tZW5kZWQsXG5dXG5gO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgdml0ZS5jb25maWcudHMgZmlsZVxuICovXG5jbGFzcyBWaXRlQ29uZmlnRmlsZSBleHRlbmRzIEZpbGVCYXNlIHtcbiAgY29uc3RydWN0b3IocHJvamVjdDogUHJvamVjdCkge1xuICAgIHN1cGVyKHByb2plY3QsICd2aXRlLmNvbmZpZy50cycsIHtcbiAgICAgIG1hcmtlcjogdHJ1ZSxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgc3ludGhlc2l6ZUNvbnRlbnQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gYGltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gJ3ZpdGUnXG5pbXBvcnQgcmVhY3QgZnJvbSAnQHZpdGVqcy9wbHVnaW4tcmVhY3QnXG5cbi8vIGh0dHBzOi8vdml0ZS5kZXYvY29uZmlnL1xuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHtcbiAgcGx1Z2luczogW3JlYWN0KCldLFxufSlcbmA7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBwb3N0Y3NzLmNvbmZpZy5qcyBmaWxlIGZvciBUYWlsd2luZCBDU1MgdjRcbiAqL1xuY2xhc3MgUG9zdENTU0NvbmZpZ0ZpbGUgZXh0ZW5kcyBGaWxlQmFzZSB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IFByb2plY3QpIHtcbiAgICBzdXBlcihwcm9qZWN0LCAncG9zdGNzcy5jb25maWcuanMnLCB7XG4gICAgICBtYXJrZXI6IHRydWUsXG4gICAgICByZWFkb25seTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIHN5bnRoZXNpemVDb250ZW50KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGBleHBvcnQgZGVmYXVsdCB7XG4gIHBsdWdpbnM6IHtcbiAgICBcIkB0YWlsd2luZGNzcy9wb3N0Y3NzXCI6IHt9LFxuICAgIGF1dG9wcmVmaXhlcjoge30sXG4gIH0sXG59XG5gO1xuICB9XG59XG5cbmludGVyZmFjZSBWaXRlRW52RHRzT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHNyY2Rpcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIHZpdGUtZW52LmQudHMgZmlsZSBmb3IgdHlwZSBkZWNsYXJhdGlvbnNcbiAqL1xuY2xhc3MgVml0ZUVudkR0cyBleHRlbmRzIEZpbGVCYXNlIHtcbiAgY29uc3RydWN0b3IocHJvamVjdDogUHJvamVjdCwgb3B0aW9uczogVml0ZUVudkR0c09wdGlvbnMpIHtcbiAgICBzdXBlcihwcm9qZWN0LCBgJHtvcHRpb25zLnNyY2Rpcn0vdml0ZS1lbnYuZC50c2AsIHtcbiAgICAgIG1hcmtlcjogdHJ1ZSxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgc3ludGhlc2l6ZUNvbnRlbnQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gYC8vLyA8cmVmZXJlbmNlIHR5cGVzPVwidml0ZS9jbGllbnRcIiAvPlxuYDtcbiAgfVxufVxuXG5pbnRlcmZhY2UgQ29uZmlnRmlsZU9wdGlvbnMge1xuICByZWFkb25seSBzcmNkaXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBjb25maWcudHMgZmlsZSBmb3IgcnVudGltZSBjb25maWd1cmF0aW9uXG4gKi9cbmNsYXNzIENvbmZpZ0ZpbGUgZXh0ZW5kcyBGaWxlQmFzZSB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IFByb2plY3QsIG9wdGlvbnM6IENvbmZpZ0ZpbGVPcHRpb25zKSB7XG4gICAgc3VwZXIocHJvamVjdCwgYCR7b3B0aW9ucy5zcmNkaXJ9L2NvbmZpZy50c2AsIHtcbiAgICAgIG1hcmtlcjogdHJ1ZSxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgc3ludGhlc2l6ZUNvbnRlbnQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBHZXQgY3VzdG9tIGNvbmZpZyBmaWVsZHMgZnJvbSBwYXJlbnQgcHJvamVjdFxuICAgIGNvbnN0IHZpdGVQcm9qZWN0ID0gdGhpcy5wcm9qZWN0IGFzIFZpdGVSZWFjdFByb2plY3Q7XG4gICAgY29uc3QgY3VzdG9tRmllbGRzID0gdml0ZVByb2plY3QuZ2V0Q29uZmlnRmllbGRzKCk7XG5cbiAgICAvLyBHZW5lcmF0ZSBiYXNlIGNvbmZpZyB0eXBlXG4gICAgY29uc3QgYmFzZUNvbmZpZ1R5cGUgPSBgdHlwZSBCYXNlQ29uZmlnID0ge1xuICBjbGVya1B1Ymxpc2hhYmxlS2V5OiBzdHJpbmc7XG4gIGFwaUJhc2VVcmw6IHN0cmluZztcbiAgdGltZW91dDogbnVtYmVyO1xufWA7XG5cbiAgICAvLyBHZW5lcmF0ZSBjdXN0b20gZmllbGRzIHR5cGUgaWYgYW55IGV4aXN0XG4gICAgbGV0IGNvbmZpZ1R5cGVEZWZpbml0aW9uOiBzdHJpbmc7XG4gICAgaWYgKGN1c3RvbUZpZWxkcy5zaXplID4gMCkge1xuICAgICAgY29uc3QgZmllbGREZWZpbml0aW9ucyA9IEFycmF5LmZyb20oY3VzdG9tRmllbGRzLmVudHJpZXMoKSlcbiAgICAgICAgLm1hcCgoW25hbWUsIHR5cGVdKSA9PiBgICAke25hbWV9OiAke3R5cGV9O2ApXG4gICAgICAgIC5qb2luKCdcXG4nKTtcblxuICAgICAgY29uc3QgY3VzdG9tRmllbGRzVHlwZSA9IGB0eXBlIEN1c3RvbUNvbmZpZyA9IHtcbiR7ZmllbGREZWZpbml0aW9uc31cbn1gO1xuXG4gICAgICBjb25maWdUeXBlRGVmaW5pdGlvbiA9IGAke2N1c3RvbUZpZWxkc1R5cGV9XG5cbmV4cG9ydCB0eXBlIENvbmZpZyA9IEJhc2VDb25maWcgJiBDdXN0b21Db25maWc7YDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZmlnVHlwZURlZmluaXRpb24gPSAnZXhwb3J0IHR5cGUgQ29uZmlnID0gQmFzZUNvbmZpZzsnO1xuICAgIH1cblxuICAgIHJldHVybiBgaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcblxuJHtiYXNlQ29uZmlnVHlwZX1cblxuJHtjb25maWdUeXBlRGVmaW5pdGlvbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUNvbmZpZygpIHtcbiAgY29uc3QgW2xvYWRlZENvbmZpZywgc2V0TG9hZGVkQ29uZmlnXSA9IHVzZVN0YXRlPENvbmZpZ3x1bmRlZmluZWQ+KCk7XG4gIGNvbnN0IFtpc0xvYWRpbmcsIHNldElzTG9hZGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWxvYWRlZENvbmZpZykge1xuICAgICAgZmV0Y2goJy9jb25maWcuanNvbicsIHsgY2FjaGU6ICduby1zdG9yZScgfSkudGhlbihyZXNwb25zZT0+e1xuICAgICAgICByZXNwb25zZS5qc29uKCkudGhlbigoY29uZmlnKSA9PiB7XG4gICAgICAgICAgc2V0SXNMb2FkaW5nKGZhbHNlKVxuICAgICAgICAgIHNldExvYWRlZENvbmZpZyhjb25maWcpXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICB9XG4gIH0sIFtsb2FkZWRDb25maWddKTtcblxuICByZXR1cm4geyBjb25maWc6IGxvYWRlZENvbmZpZywgaXNMb2FkaW5nIH07XG59XG5gO1xuICB9XG59XG5cbmludGVyZmFjZSBDb25maWdKc29uRmlsZU9wdGlvbnMge31cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBjb25maWcuanNvbiBzYW1wbGUgZmlsZSBmb3IgcnVudGltZSBjb25maWd1cmF0aW9uXG4gKi9cbmNsYXNzIENvbmZpZ0pzb25GaWxlIGV4dGVuZHMgU2FtcGxlRmlsZSB7XG4gIHBhdGg6IHN0cmluZztcbiAgY29uc3RydWN0b3IocHJvamVjdDogVml0ZVJlYWN0UHJvamVjdCwgX29wdGlvbnM6IENvbmZpZ0pzb25GaWxlT3B0aW9ucykge1xuICAgIHN1cGVyKHByb2plY3QsIGAke3Byb2plY3QucHVibGljRGlyfS9jb25maWcuanNvbmAsIHtcbiAgICAgIGNvbnRlbnRzOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGFwaUJhc2VVcmw6ICdodHRwOi8vbG9jYWxob3N0OjMwMDAvYXBpJyxcbiAgICAgICAgY2xlcmtQdWJsaXNoYWJsZUtleTogJ3RiZCcsXG4gICAgICB9LCBudWxsLCAyKSxcbiAgICB9KTtcbiAgICB0aGlzLnBhdGggPSBgJHtwcm9qZWN0LnB1YmxpY0Rpcn0vY29uZmlnLmpzb25gO1xuICB9XG59XG5cbmludGVyZmFjZSBJbmRleEh0bWxPcHRpb25zIHtcbiAgcmVhZG9ubHkgdGl0bGU6IHN0cmluZztcbiAgcmVhZG9ubHkgc3JjZGlyOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgaW5kZXguaHRtbCBmaWxlXG4gKi9cbmNsYXNzIEluZGV4SHRtbCBleHRlbmRzIFNhbXBsZUZpbGUge1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBQcm9qZWN0LCBvcHRpb25zOiBJbmRleEh0bWxPcHRpb25zKSB7XG4gICAgc3VwZXIocHJvamVjdCwgJ2luZGV4Lmh0bWwnLCB7XG4gICAgICBjb250ZW50czogYDwhZG9jdHlwZSBodG1sPlxuPGh0bWwgbGFuZz1cImVuXCI+XG4gIDxoZWFkPlxuICAgIDxtZXRhIGNoYXJzZXQ9XCJVVEYtOFwiIC8+XG4gICAgPGxpbmsgcmVsPVwiaWNvblwiIHR5cGU9XCJpbWFnZS9zdmcreG1sXCIgaHJlZj1cIi92aXRlLnN2Z1wiIC8+XG4gICAgPG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjBcIiAvPlxuICAgIDx0aXRsZT4ke29wdGlvbnMudGl0bGV9PC90aXRsZT5cbiAgPC9oZWFkPlxuICA8Ym9keT5cbiAgICA8ZGl2IGlkPVwicm9vdFwiPjwvZGl2PlxuICAgIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiIHNyYz1cIi8ke29wdGlvbnMuc3JjZGlyfS9tYWluLnRzeFwiPjwvc2NyaXB0PlxuICA8L2JvZHk+XG48L2h0bWw+XG5gLFxuICAgIH0pO1xuICB9XG59XG5cbmludGVyZmFjZSBWaXRlVHNDb25maWdzT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHNyY2Rpcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIFR5cGVTY3JpcHQgY29uZmlndXJhdGlvbiBmaWxlcyBmb3IgVml0ZVxuICovXG5jbGFzcyBWaXRlVHNDb25maWdzIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvamVjdDogUHJvamVjdCwgb3B0aW9uczogVml0ZVRzQ29uZmlnc09wdGlvbnMpIHtcbiAgICBzdXBlcihwcm9qZWN0KTtcblxuICAgIC8vIE1haW4gdHNjb25maWcuanNvbiAocHJvamVjdCByZWZlcmVuY2VzKVxuICAgIG5ldyBKc29uRmlsZShwcm9qZWN0LCAndHNjb25maWcuanNvbicsIHtcbiAgICAgIG1hcmtlcjogdHJ1ZSxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgICAgb2JqOiB7XG4gICAgICAgIGZpbGVzOiBbXSxcbiAgICAgICAgcmVmZXJlbmNlczogW1xuICAgICAgICAgIHsgcGF0aDogJy4vdHNjb25maWcuYXBwLmpzb24nIH0sXG4gICAgICAgICAgeyBwYXRoOiAnLi90c2NvbmZpZy5ub2RlLmpzb24nIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gdHNjb25maWcuYXBwLmpzb24gKGZvciBhcHBsaWNhdGlvbiBjb2RlKVxuICAgIG5ldyBKc29uRmlsZShwcm9qZWN0LCAndHNjb25maWcuYXBwLmpzb24nLCB7XG4gICAgICBtYXJrZXI6IHRydWUsXG4gICAgICByZWFkb25seTogdHJ1ZSxcbiAgICAgIG9iajoge1xuICAgICAgICBjb21waWxlck9wdGlvbnM6IHtcbiAgICAgICAgICB0YXJnZXQ6ICdFUzIwMjAnLFxuICAgICAgICAgIHVzZURlZmluZUZvckNsYXNzRmllbGRzOiB0cnVlLFxuICAgICAgICAgIGxpYjogWydFUzIwMjAnLCAnRE9NJywgJ0RPTS5JdGVyYWJsZSddLFxuICAgICAgICAgIG1vZHVsZTogJ0VTTmV4dCcsXG4gICAgICAgICAgc2tpcExpYkNoZWNrOiB0cnVlLFxuXG4gICAgICAgICAgLy8gQnVuZGxlciBtb2RlXG4gICAgICAgICAgbW9kdWxlUmVzb2x1dGlvbjogJ2J1bmRsZXInLFxuICAgICAgICAgIGFsbG93SW1wb3J0aW5nVHNFeHRlbnNpb25zOiB0cnVlLFxuICAgICAgICAgIGlzb2xhdGVkTW9kdWxlczogdHJ1ZSxcbiAgICAgICAgICBtb2R1bGVEZXRlY3Rpb246ICdmb3JjZScsXG4gICAgICAgICAgbm9FbWl0OiB0cnVlLFxuICAgICAgICAgIGpzeDogJ3JlYWN0LWpzeCcsXG5cbiAgICAgICAgICAvLyBMaW50aW5nXG4gICAgICAgICAgc3RyaWN0OiB0cnVlLFxuICAgICAgICAgIG5vVW51c2VkTG9jYWxzOiB0cnVlLFxuICAgICAgICAgIG5vVW51c2VkUGFyYW1ldGVyczogdHJ1ZSxcbiAgICAgICAgICBub0ZhbGx0aHJvdWdoQ2FzZXNJblN3aXRjaDogdHJ1ZSxcbiAgICAgICAgICBub1VuY2hlY2tlZFNpZGVFZmZlY3RJbXBvcnRzOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBpbmNsdWRlOiBbb3B0aW9ucy5zcmNkaXJdLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIHRzY29uZmlnLm5vZGUuanNvbiAoZm9yIFZpdGUgY29uZmlnKVxuICAgIG5ldyBKc29uRmlsZShwcm9qZWN0LCAndHNjb25maWcubm9kZS5qc29uJywge1xuICAgICAgbWFya2VyOiB0cnVlLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICBvYmo6IHtcbiAgICAgICAgY29tcGlsZXJPcHRpb25zOiB7XG4gICAgICAgICAgdGFyZ2V0OiAnRVMyMDIyJyxcbiAgICAgICAgICBsaWI6IFsnRVMyMDIzJ10sXG4gICAgICAgICAgbW9kdWxlOiAnRVNOZXh0JyxcbiAgICAgICAgICBza2lwTGliQ2hlY2s6IHRydWUsXG5cbiAgICAgICAgICAvLyBCdW5kbGVyIG1vZGVcbiAgICAgICAgICBtb2R1bGVSZXNvbHV0aW9uOiAnYnVuZGxlcicsXG4gICAgICAgICAgYWxsb3dJbXBvcnRpbmdUc0V4dGVuc2lvbnM6IHRydWUsXG4gICAgICAgICAgaXNvbGF0ZWRNb2R1bGVzOiB0cnVlLFxuICAgICAgICAgIG1vZHVsZURldGVjdGlvbjogJ2ZvcmNlJyxcbiAgICAgICAgICBub0VtaXQ6IHRydWUsXG5cbiAgICAgICAgICAvLyBMaW50aW5nXG4gICAgICAgICAgc3RyaWN0OiB0cnVlLFxuICAgICAgICAgIG5vVW51c2VkTG9jYWxzOiB0cnVlLFxuICAgICAgICAgIG5vVW51c2VkUGFyYW1ldGVyczogdHJ1ZSxcbiAgICAgICAgICBub0ZhbGx0aHJvdWdoQ2FzZXNJblN3aXRjaDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgaW5jbHVkZTogWyd2aXRlLmNvbmZpZy50cyddLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgVml0ZVNhbXBsZUNvZGVPcHRpb25zIHtcbiAgcmVhZG9ubHkgc3JjZGlyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHB1YmxpY0Rpcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBzYW1wbGUgY29kZSBmb3IgYSBWaXRlICsgUmVhY3QgcHJvamVjdFxuICovXG5jbGFzcyBWaXRlU2FtcGxlQ29kZSBleHRlbmRzIENvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IFByb2plY3QsIG9wdGlvbnM6IFZpdGVTYW1wbGVDb2RlT3B0aW9ucykge1xuICAgIHN1cGVyKHByb2plY3QpO1xuXG4gICAgLy8gQ3JlYXRlIEFwcC50c3hcbiAgICBuZXcgU2FtcGxlRmlsZShwcm9qZWN0LCBgJHtvcHRpb25zLnNyY2Rpcn0vQXBwLnRzeGAsIHtcbiAgICAgIGNvbnRlbnRzOiBgaW1wb3J0ICcuL0FwcC5jc3MnXG5pbXBvcnQgeyBTaWduZWRJbiwgVXNlckJ1dHRvbiB9IGZyb20gJ0BjbGVyay9jbGVyay1yZWFjdCc7XG5pbXBvcnQgeyB1c2VCYXNlUXVlcnkgfSBmcm9tIFwiLi9zZXJ2aWNlcy9CYXNlU2VydmljZS50c1wiO1xuXG5cbmZ1bmN0aW9uIEFwcCgpIHtcbiAgY29uc3Qge2RhdGEsIGlzTG9hZGluZ30gPSB1c2VCYXNlUXVlcnkoJy8nLCB7cmV0cnlPbk1vdW50OiB0cnVlfSk7XG5cblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICAgIDxoZWFkZXI+XG5cbiAgICAgICAgICA8U2lnbmVkSW4+XG4gICAgICAgICAgICA8VXNlckJ1dHRvbi8+XG4gICAgICAgICAgPC9TaWduZWRJbj5cbiAgICAgICAgPC9oZWFkZXI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY2FyZFwiPlxuICAgICAgICAgIHsgaXNMb2FkaW5nID8gJ0xvYWRpbmcuLi4nIDogSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCAsKX1cbiAgICAgICAgPC9kaXY+XG4gICAgPC8+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgQXBwXG5gLFxuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIEJhc2VTZXJ2aWNlLnRzXG4gICAgbmV3IFRleHRGaWxlKHByb2plY3QsIGAke29wdGlvbnMuc3JjZGlyfS9zZXJ2aWNlcy9CYXNlU2VydmljZS50c2AsIHtcbiAgICAgIG1hcmtlcjogdHJ1ZSxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgICAgbGluZXM6IFtcbiAgICAgICAgJ2ltcG9ydCB7IHVzZVF1ZXJ5LCBVc2VRdWVyeU9wdGlvbnMgfSBmcm9tIFxcJ0B0YW5zdGFjay9yZWFjdC1xdWVyeVxcJzsnLFxuICAgICAgICAnaW1wb3J0IHsgdXNlQXV0aCB9IGZyb20gXFwnQGNsZXJrL2NsZXJrLXJlYWN0XFwnOycsXG4gICAgICAgICdpbXBvcnQgeyB1c2VDb25maWcgfSBmcm9tIFxcJy4uL2NvbmZpZ1xcJzsnLFxuICAgICAgICAnJyxcbiAgICAgICAgJ2V4cG9ydCBmdW5jdGlvbiB1c2VCYXNlUXVlcnk8VERhdGEgPSB1bmtub3duPignLFxuICAgICAgICAnICBwYXRoOiBzdHJpbmcsJyxcbiAgICAgICAgJyAgb3B0aW9ucz86IE9taXQ8VXNlUXVlcnlPcHRpb25zPFREYXRhPiwgXFwncXVlcnlLZXlcXCcgfCBcXCdxdWVyeUZuXFwnPicsXG4gICAgICAgICcpIHsnLFxuICAgICAgICAnICBjb25zdCB7IGNvbmZpZyB9ID0gdXNlQ29uZmlnKCk7JyxcbiAgICAgICAgJyAgY29uc3QgeyBnZXRUb2tlbiB9ID0gdXNlQXV0aCgpOycsXG4gICAgICAgICcnLFxuICAgICAgICAnICByZXR1cm4gdXNlUXVlcnk8VERhdGE+KHsnLFxuICAgICAgICAnICAgIHF1ZXJ5S2V5OiBbXFwnYmFzZVxcJ10sJyxcbiAgICAgICAgJyAgICBxdWVyeUZuOiBhc3luYyAoKSA9PiB7JyxcbiAgICAgICAgJyAgICAgIGlmICghY29uZmlnPy5hcGlCYXNlVXJsKSB7JyxcbiAgICAgICAgJyAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcJ0FQSSBiYXNlIFVSTCBub3QgY29uZmlndXJlZFxcJyk7JyxcbiAgICAgICAgJyAgICAgIH0nLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgZ2V0VG9rZW4oKTsnLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgICAgIC8vIE5vcm1hbGl6ZSBVUkwgYnkgcmVtb3ZpbmcgdHJhaWxpbmcgc2xhc2ggZnJvbSBiYXNlVXJsIGFuZCBlbnN1cmluZyBwYXRoIHN0YXJ0cyB3aXRoIHNsYXNoJyxcbiAgICAgICAgJyAgICAgIGNvbnN0IGJhc2VVcmwgPSBjb25maWcuYXBpQmFzZVVybC5yZXBsYWNlKC9cXFxcLyskLywgXFwnXFwnKTsnLFxuICAgICAgICAnICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoLnN0YXJ0c1dpdGgoXFwnL1xcJykgPyBwYXRoIDogYC8ke3BhdGh9YDsnLFxuICAgICAgICAnICAgICAgJyxcbiAgICAgICAgJyAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7YmFzZVVybH0ke25vcm1hbGl6ZWRQYXRofWAsIHsnLFxuICAgICAgICAnICAgICAgICBoZWFkZXJzOiB7JyxcbiAgICAgICAgJyAgICAgICAgICBcXCdBdXRob3JpemF0aW9uXFwnOiBgQmVhcmVyICR7dG9rZW59YCwnLFxuICAgICAgICAnICAgICAgICB9LCcsXG4gICAgICAgICcgICAgICB9KTsnLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgICAgIGlmICghcmVzcG9uc2Uub2spIHsnLFxuICAgICAgICAnICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgZXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YCk7JyxcbiAgICAgICAgJyAgICAgIH0nLFxuICAgICAgICAnJyxcbiAgICAgICAgJyAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7JyxcbiAgICAgICAgJyAgICB9LCcsXG4gICAgICAgICcgICAgZW5hYmxlZDogISFjb25maWc/LmFwaUJhc2VVcmwsJyxcbiAgICAgICAgJyAgICAuLi5vcHRpb25zLCcsXG4gICAgICAgICcgIH0pOycsXG4gICAgICAgICd9JyxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgUm9vdFNlcnZpY2UudHNcbiAgICBuZXcgU2FtcGxlRmlsZShwcm9qZWN0LCBgJHtvcHRpb25zLnNyY2Rpcn0vc2VydmljZXMvUm9vdFNlcnZpY2UudHNgLCB7XG4gICAgICBjb250ZW50czogYGltcG9ydCB7IFVzZVF1ZXJ5T3B0aW9ucyB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSc7XG5pbXBvcnQgeyB1c2VCYXNlUXVlcnkgfSBmcm9tICcuL0Jhc2VTZXJ2aWNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVJvb3RRdWVyeTxURGF0YSA9IHVua25vd24+KFxuICBvcHRpb25zPzogT21pdDxVc2VRdWVyeU9wdGlvbnM8VERhdGE+LCAncXVlcnlLZXknIHwgJ3F1ZXJ5Rm4nPlxuKSB7XG4gIHJldHVybiB1c2VCYXNlUXVlcnk8VERhdGE+KCcvJywgb3B0aW9ucyk7XG59XG5gLFxuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIEFwcC5jc3NcbiAgICBuZXcgU2FtcGxlRmlsZShwcm9qZWN0LCBgJHtvcHRpb25zLnNyY2Rpcn0vQXBwLmNzc2AsIHtcbiAgICAgIGNvbnRlbnRzOiBgI3Jvb3Qge1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuXG4ubG9nbyB7XG4gIGhlaWdodDogNmVtO1xuICBwYWRkaW5nOiAxLjVlbTtcbiAgd2lsbC1jaGFuZ2U6IGZpbHRlcjtcbiAgdHJhbnNpdGlvbjogZmlsdGVyIDMwMG1zO1xufVxuLmxvZ286aG92ZXIge1xuICBmaWx0ZXI6IGRyb3Atc2hhZG93KDAgMCAyZW0gIzY0NmNmZmFhKTtcbn1cbi5sb2dvLnJlYWN0OmhvdmVyIHtcbiAgZmlsdGVyOiBkcm9wLXNoYWRvdygwIDAgMmVtICM2MWRhZmJhYSk7XG59XG5cbkBrZXlmcmFtZXMgbG9nby1zcGluIHtcbiAgZnJvbSB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XG4gIH1cbiAgdG8ge1xuICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XG4gIH1cbn1cblxuQG1lZGlhIChwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiBuby1wcmVmZXJlbmNlKSB7XG4gIGE6bnRoLW9mLXR5cGUoMikgLmxvZ28ge1xuICAgIGFuaW1hdGlvbjogbG9nby1zcGluIGluZmluaXRlIDIwcyBsaW5lYXI7XG4gIH1cbn1cblxuLmNhcmQge1xuICBwYWRkaW5nOiAyZW07XG59XG5cbi5yZWFkLXRoZS1kb2NzIHtcbiAgY29sb3I6ICM4ODg7XG59XG5gLFxuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIG1haW4udHN4XG4gICAgbmV3IFNhbXBsZUZpbGUocHJvamVjdCwgYCR7b3B0aW9ucy5zcmNkaXJ9L21haW4udHN4YCwge1xuICAgICAgY29udGVudHM6IGBpbXBvcnQgeyBTdHJpY3RNb2RlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBjcmVhdGVSb290IH0gZnJvbSAncmVhY3QtZG9tL2NsaWVudCdcbmltcG9ydCAnLi9pbmRleC5jc3MnXG5pbXBvcnQgQXBwIGZyb20gJy4vQXBwLnRzeCdcbmltcG9ydCB7IENsZXJrUHJvdmlkZXIsIFNpZ25lZEluLCBTaWduZWRPdXQsIFNpZ25JbkJ1dHRvbiB9IGZyb20gJ0BjbGVyay9jbGVyay1yZWFjdCdcbmltcG9ydCB7IHVzZUNvbmZpZyB9IGZyb20gJy4vY29uZmlnJ1xuaW1wb3J0IHsgUXVlcnlDbGllbnQsIFF1ZXJ5Q2xpZW50UHJvdmlkZXIgfSBmcm9tIFwiQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5XCJcblxuZnVuY3Rpb24gQXBwV3JhcHBlcigpIHtcbiAgY29uc3QgeyBjb25maWcsIGlzTG9hZGluZyB9ID0gdXNlQ29uZmlnKCk7XG4gIGNvbnN0IHF1ZXJ5Q2xpZW50ID0gbmV3IFF1ZXJ5Q2xpZW50KClcbiAgaWYgKGlzTG9hZGluZyB8fCAhY29uZmlnKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibG9hZGluZy1zY3JlZW5cIj5cbiAgICAgICAgTG9hZGluZy4uLlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPENsZXJrUHJvdmlkZXIgcHVibGlzaGFibGVLZXk9e2NvbmZpZy5jbGVya1B1Ymxpc2hhYmxlS2V5fT5cbiAgICAgIDxRdWVyeUNsaWVudFByb3ZpZGVyIGNsaWVudD17cXVlcnlDbGllbnR9PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInctZnVsbCBoLWZ1bGxcIj5cbiAgICAgICAgICA8U2lnbmVkT3V0PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBtaW4taC1zY3JlZW5cIj5cbiAgICAgICAgICAgICAgPFNpZ25JbkJ1dHRvbi8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L1NpZ25lZE91dD5cbiAgICAgICAgICA8U2lnbmVkSW4+XG4gICAgICAgICAgICA8QXBwLz5cbiAgICAgICAgICA8L1NpZ25lZEluPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvUXVlcnlDbGllbnRQcm92aWRlcj5cbiAgICA8L0NsZXJrUHJvdmlkZXI+XG4gICk7XG59XG5cbmNyZWF0ZVJvb3QoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jvb3QnKSEpLnJlbmRlcihcbiAgPFN0cmljdE1vZGU+XG4gICAgPEFwcFdyYXBwZXIvPlxuICA8L1N0cmljdE1vZGU+XG4pXG5gLFxuICAgIH0pO1xuXG4gICAgLy8gQ3JlYXRlIGluZGV4LmNzc1xuICAgIG5ldyBTYW1wbGVGaWxlKHByb2plY3QsIGAke29wdGlvbnMuc3JjZGlyfS9pbmRleC5jc3NgLCB7XG4gICAgICBjb250ZW50czogYEBpbXBvcnQgXCJ0YWlsd2luZGNzc1wiO1xuXG5AdGhlbWUge1xuICAtLWNvbG9yLXNjaGVtZTogbGlnaHQgZGFyaztcbn1cblxuOnJvb3Qge1xuICBmb250LWZhbWlseTogSW50ZXIsIHN5c3RlbS11aSwgQXZlbmlyLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICBsaW5lLWhlaWdodDogMS41O1xuICBmb250LXdlaWdodDogNDAwO1xuXG4gIGNvbG9yLXNjaGVtZTogbGlnaHQgZGFyaztcblxuICBmb250LXN5bnRoZXNpczogbm9uZTtcbiAgdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTtcbiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XG4gIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7XG59XG5cbmEge1xuICBmb250LXdlaWdodDogNTAwO1xuICBjb2xvcjogIzY0NmNmZjtcbiAgdGV4dC1kZWNvcmF0aW9uOiBpbmhlcml0O1xufVxuYTpob3ZlciB7XG4gIGNvbG9yOiAjNTM1YmYyO1xufVxuXG5ib2R5IHtcbiAgbWFyZ2luOiAwO1xuICBtaW4td2lkdGg6IDMyMHB4O1xuICBtaW4taGVpZ2h0OiAxMDB2aDtcbn1cblxuaDEge1xuICBmb250LXNpemU6IDMuMmVtO1xuICBsaW5lLWhlaWdodDogMS4xO1xufVxuXG5idXR0b24ge1xuICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4ubG9hZGluZy1zY3JlZW4ge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgaGVpZ2h0OiAxMDB2aDtcbiAgZm9udC1zaXplOiAxLjVyZW07XG59XG5cbmh0bWwsIGJvZHksICNyb290IHtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbn1cbmAsXG4gICAgfSk7XG5cbiAgfVxufVxuXG5pbnRlcmZhY2UgUGxheXdyaWdodEUyRUNvbXBvbmVudE9wdGlvbnMge1xuICByZWFkb25seSBwdWJsaWNEaXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBZGRzIFBsYXl3cmlnaHQgZTJlIHRlc3Rpbmcgc3VwcG9ydDogZGV2RGVwcywgYSBgdGVzdDplMmVgIHRhc2ssIGUyZS1yZWxhdGVkXG4gKiAuZ2l0aWdub3JlIGVudHJpZXMsIGFuZCBhIHNjYWZmb2xkZWQgKG9uZS10aW1lLCBub3QgcmVnZW5lcmF0ZWQgb24gc3ludGgpXG4gKiBgcGxheXdyaWdodC5jb25maWcudHNgICsgYGUyZS9gIHN0YXJ0ZXIgc3VpdGUuIEdlbmVyYWxpemVzIHRoZSBoYW5kLWF1dGhvcmVkXG4gKiBzdWl0ZSBhZGRlZCBpbiBtYWNlZG9uLXRlY2hub2xvZ2llcy9leG1hbiMxMTIgc28gZXZlcnkgVml0ZVJlYWN0UHJvamVjdFxuICogY29uc3VtZXIgZ2V0cyBpdCBmb3IgZnJlZSAobWFjZWRvbi10ZWNobm9sb2dpZXMvcGxhdGZvcm0tY29tbW9uIzk4KS5cbiAqL1xuY2xhc3MgUGxheXdyaWdodEUyRUNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IFZpdGVSZWFjdFByb2plY3QsIG9wdGlvbnM6IFBsYXl3cmlnaHRFMkVDb21wb25lbnRPcHRpb25zKSB7XG4gICAgc3VwZXIocHJvamVjdCk7XG5cbiAgICBwcm9qZWN0LmFkZERldkRlcHMoXG4gICAgICAnQHBsYXl3cmlnaHQvdGVzdEBeMS42My4wJyxcbiAgICAgICdAY2xlcmsvdGVzdGluZ0BeMi4yLjM0JyxcbiAgICAgICdAY2xlcmsvYmFja2VuZEBeMy4xNy4yJyxcbiAgICAgICdkb3RlbnZAXjE3LjQuMicsXG4gICAgKTtcblxuICAgIHByb2plY3QuYWRkVGFzaygndGVzdDplMmUnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ1J1biB0aGUgUGxheXdyaWdodCBlMmUgc3VpdGUgKG5lZWRzIENMRVJLX1NFQ1JFVF9LRVkgYW5kIEUyRV9DTEVSS19VU0VSX0lEIC0tIHNlZSBlMmUvUkVBRE1FLm1kKScsXG4gICAgICBleGVjOiAncGxheXdyaWdodCB0ZXN0JyxcbiAgICB9KTtcblxuICAgIHByb2plY3QuYWRkR2l0SWdub3JlKCdwbGF5d3JpZ2h0LXJlcG9ydC8nKTtcbiAgICBwcm9qZWN0LmFkZEdpdElnbm9yZSgndGVzdC1yZXN1bHRzLycpO1xuICAgIHByb2plY3QuYWRkR2l0SWdub3JlKCdibG9iLXJlcG9ydC8nKTtcbiAgICAvLyBgKi5sb2NhbGAgKGFkZGVkIGVsc2V3aGVyZSkgYWxyZWFkeSBjb3ZlcnMgYC5lbnYubG9jYWxgLCBidXQgbm90IGEgcGxhaW4gYC5lbnZgIC0tXG4gICAgLy8gZXhhY3RseSB3aGVyZSBDTEVSS19TRUNSRVRfS0VZIChhIHJlYWwgc2VjcmV0KSBpcyBkb2N1bWVudGVkIHRvIGdvIChlMmUvUkVBRE1FLm1kKS5cbiAgICBwcm9qZWN0LmFkZEdpdElnbm9yZSgnLmVudicpO1xuXG4gICAgbmV3IFBsYXl3cmlnaHRDb25maWdGaWxlKHByb2plY3QpO1xuICAgIG5ldyBFMkVHbG9iYWxTZXR1cEZpbGUocHJvamVjdCwgb3B0aW9ucyk7XG4gICAgbmV3IEUyRUNsZXJrU2lnbkluRmlsZShwcm9qZWN0KTtcbiAgICBuZXcgRTJFTGl2ZUhlbHBlckZpbGUocHJvamVjdCk7XG4gICAgbmV3IEUyRVNtb2tlU3BlY0ZpbGUocHJvamVjdCk7XG4gICAgbmV3IEUyRVJlYWRtZUZpbGUocHJvamVjdCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBwbGF5d3JpZ2h0LmNvbmZpZy50cyBmaWxlLiBBIGBTYW1wbGVGaWxlYCwgbm90IGEgbWFuYWdlZCBgRmlsZUJhc2VgIC0tXG4gKiBjb25zdW1lcnMgbmVlZCB0byBjdXN0b21pemUgdGhpcyAoZS5nLiBleG1hbidzIG93biBjb25maWcgbmVlZGVkIGEgbGl2ZS9zdHViXG4gKiBicmFuY2gpLCB0aGUgc2FtZSByZWFzb24gVml0ZVJlYWN0UHJvamVjdCdzIEFwcC50c3gvbWFpbi50c3ggYXJlIFNhbXBsZUZpbGVzIHRvby5cbiAqL1xuY2xhc3MgUGxheXdyaWdodENvbmZpZ0ZpbGUgZXh0ZW5kcyBTYW1wbGVGaWxlIHtcbiAgY29uc3RydWN0b3IocHJvamVjdDogVml0ZVJlYWN0UHJvamVjdCkge1xuICAgIHN1cGVyKHByb2plY3QsICdwbGF5d3JpZ2h0LmNvbmZpZy50cycsIHtcbiAgICAgIGNvbnRlbnRzOiBgaW1wb3J0IHsgY29uZmlnIGFzIGxvYWREb3RlbnYgfSBmcm9tICdkb3RlbnYnXG5pbXBvcnQgeyBkZWZpbmVDb25maWcsIGRldmljZXMgfSBmcm9tICdAcGxheXdyaWdodC90ZXN0J1xuaW1wb3J0IHsgaXNMaXZlUnVuIH0gZnJvbSAnLi9lMmUvc3VwcG9ydC9saXZlJ1xuXG4vLyBMb2FkZWQgaGVyZSwgZmlyc3QsIHJhdGhlciB0aGFuIGxlZnQgdG8gQGNsZXJrL3Rlc3RpbmcncyBvd24gaW50ZXJuYWwgZG90ZW52IGNhbGxcbi8vIGluc2lkZSBnbG9iYWwtc2V0dXAudHM6IHRoYXQgY2FsbCBydW5zIGluc2lkZSBnbG9iYWxTZXR1cCwgd2hpY2ggZXhlY3V0ZXMgQUZURVJcbi8vIFBsYXl3cmlnaHQgaGFzIGFscmVhZHkgY29sbGVjdGVkIGV2ZXJ5IHNwZWMgZmlsZSBhbmQgcnVuIHRoZWlyIG1vZHVsZS1sZXZlbCBjb2RlIC0tXG4vLyBzbyBhbnl0aGluZyByZWFkaW5nIHByb2Nlc3MuZW52IGJlZm9yZSB0aGVuIHdvdWxkIG9ubHkgZXZlciBzZWUgYSAuZW52IGZpbGUncyB2YWx1ZXNcbi8vIGFzIHVuc2V0LiBMb2FkaW5nIGl0IGhlcmUsIGF0IHRoZSB0b3Agb2YgdGhlIGNvbmZpZyBmaWxlIFBsYXl3cmlnaHQgcmVhZHMgYmVmb3JlXG4vLyBhbnl0aGluZyBlbHNlLCBtZWFucyBpdCdzIHBvcHVsYXRlZCBmb3IgY29sbGVjdGlvbiwgZ2xvYmFsU2V0dXAsIGFuZCBldmVyeSB0ZXN0LlxubG9hZERvdGVudigpXG5cbi8vIFNldCBFMkVfQkFTRV9VUkwgdG8gcnVuIGFnYWluc3QgYSByZWFsIGRlcGxveW1lbnQgKGUuZy4gYSBQUidzIHByLWRlcGxveSBXZWJzaXRlVXJsKVxuLy8gaW5zdGVhZCBvZiBhIGxvY2FsIGRldiBzZXJ2ZXIgLS0gc2VlIGUyZS9zdXBwb3J0L2xpdmUudHMgYW5kIGUyZS9SRUFETUUubWQuXG4vLyBcXGB8fCB1bmRlZmluZWRcXGAsIG5vdCBcXGA/P1xcYDogYW4gZW1wdHkgc3RyaW5nIChlLmcuIGFuIHVuc2V0IEdpdEh1YiBBY3Rpb25zIG91dHB1dCkgaXNcbi8vIG5vdCBudWxsL3VuZGVmaW5lZCwgc28gPz8gd291bGQgbGVhdmUgYmFzZVVSTCBhcyAnJyB3aGlsZSBpc0xpdmVSdW4oKSdzIHBsYWluICEhXG4vLyBjaGVjayBzdGlsbCByZWFkIHRoZSBydW4gYXMgbm9uLWxpdmUgLS0gYW4gaW52YWxpZCwgc2lsZW50bHktbWlzbWF0Y2hlZCBjb25maWcuXG5jb25zdCBsaXZlQmFzZVVybCA9IHByb2Nlc3MuZW52LkUyRV9CQVNFX1VSTCB8fCB1bmRlZmluZWRcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHtcbiAgdGVzdERpcjogJy4vZTJlJyxcbiAgZnVsbHlQYXJhbGxlbDogZmFsc2UsXG4gIGZvcmJpZE9ubHk6ICEhcHJvY2Vzcy5lbnYuQ0ksXG4gIHJldHJpZXM6IHByb2Nlc3MuZW52LkNJID8gMSA6IDAsXG4gIHJlcG9ydGVyOiBwcm9jZXNzLmVudi5DSSA/IFtbJ2h0bWwnLCB7IG9wZW46ICduZXZlcicgfV1dIDogJ2xpc3QnLFxuICBnbG9iYWxTZXR1cDogJy4vZTJlL3N1cHBvcnQvZ2xvYmFsLXNldHVwLnRzJyxcbiAgdXNlOiB7XG4gICAgYmFzZVVSTDogbGl2ZUJhc2VVcmwgPz8gJ2h0dHA6Ly9sb2NhbGhvc3Q6NTE3MycsXG4gICAgdHJhY2U6ICdvbi1maXJzdC1yZXRyeScsXG4gIH0sXG4gIHByb2plY3RzOiBbXG4gICAgeyBuYW1lOiAnY2hyb21pdW0nLCB1c2U6IHsgLi4uZGV2aWNlc1snRGVza3RvcCBDaHJvbWUnXSB9IH0sXG4gIF0sXG4gIC8vIE5vIGxvY2FsIHNlcnZlciB0byBtYW5hZ2Ugd2hlbiBwb2ludGVkIGF0IGEgbGl2ZSBkZXBsb3ltZW50LlxuICB3ZWJTZXJ2ZXI6IGlzTGl2ZVJ1bigpID8gdW5kZWZpbmVkIDoge1xuICAgIGNvbW1hbmQ6ICcke3J1blNjcmlwdENvbW1hbmQocHJvamVjdC5wYWNrYWdlLnBhY2thZ2VNYW5hZ2VyLCAnZGV2Jyl9JyxcbiAgICB1cmw6ICdodHRwOi8vbG9jYWxob3N0OjUxNzMnLFxuICAgIHJldXNlRXhpc3RpbmdTZXJ2ZXI6ICFwcm9jZXNzLmVudi5DSSxcbiAgICB0aW1lb3V0OiA2MF8wMDAsXG4gIH0sXG59KVxuYCxcbiAgICB9KTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgRTJFR2xvYmFsU2V0dXBGaWxlT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHB1YmxpY0Rpcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgZTJlL3N1cHBvcnQvZ2xvYmFsLXNldHVwLnRzLCB3aGljaCBwcmltZXMgQGNsZXJrL3Rlc3RpbmcgZm9yIHRoZSBzaWduLWluXG4gKiBmbG93IGluIGNsZXJrLXNpZ24taW4udHMuIFJlYWRzIHRoZSBDbGVyayBwdWJsaXNoYWJsZSBrZXkgZnJvbSB0aGUgc2NhZmZvbGRlZFxuICogcHVibGljL2NvbmZpZy5qc29uIChDb25maWdKc29uRmlsZSkgcmF0aGVyIHRoYW4gaGFyZGNvZGluZyBvbmUgLS0gVml0ZVJlYWN0UHJvamVjdCdzXG4gKiBvd24gYXBwIGZldGNoZXMgdGhhdCBrZXkgYXQgcnVudGltZSB0aGUgc2FtZSB3YXkgKHNlZSBjb25maWcudHMpLCBzbyB0aGVyZSdzIG5vXG4gKiBidWlsZC10aW1lIGNvbnN0YW50IHRoaXMgY29uc3RydWN0IGNvdWxkIGVtYmVkIGluc3RlYWQuXG4gKi9cbmNsYXNzIEUyRUdsb2JhbFNldHVwRmlsZSBleHRlbmRzIFNhbXBsZUZpbGUge1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBWaXRlUmVhY3RQcm9qZWN0LCBvcHRpb25zOiBFMkVHbG9iYWxTZXR1cEZpbGVPcHRpb25zKSB7XG4gICAgc3VwZXIocHJvamVjdCwgJ2UyZS9zdXBwb3J0L2dsb2JhbC1zZXR1cC50cycsIHtcbiAgICAgIGNvbnRlbnRzOiBgaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSAnZnMnXG5pbXBvcnQgeyBjbGVya1NldHVwIH0gZnJvbSAnQGNsZXJrL3Rlc3RpbmcvcGxheXdyaWdodCdcblxuLy8gQSBuby1vcCAobm90IGEgdGhyb3cpIHdoZW4gQ0xFUktfU0VDUkVUX0tFWSBpcyBtaXNzaW5nOiBldmVyeSBzcGVjIHRoYXQgbmVlZHMgYVxuLy8gc2lnbmVkLWluIHVzZXIgYWxyZWFkeSBza2lwcyBpdHNlbGYgaW4gdGhhdCBjYXNlIChzZWUgLi4vc21va2Uuc3BlYy50cyksIHNvIHJ1bm5pbmdcbi8vIHRoZSBzdWl0ZSB3aXRob3V0IHNlY3JldHMgY29uZmlndXJlZCB5ZXQgcmVwb3J0cyBcInNraXBwZWRcIiwgbm90IGEgY3Jhc2hlZCBnbG9iYWxcbi8vIHNldHVwLiBTZWUgZTJlL1JFQURNRS5tZCBmb3IgaG93IHRvIGdldCBhIHNlY3JldCBrZXkuXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBnbG9iYWxTZXR1cCgpIHtcbiAgaWYgKCFwcm9jZXNzLmVudi5DTEVSS19TRUNSRVRfS0VZKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBpbXBvcnQubWV0YS51cmwsIG5vdCBfX2Rpcm5hbWU6IHRoZSB3ZWIgcGFja2FnZSBzZXRzIFwidHlwZVwiOiBcIm1vZHVsZVwiIChWaXRlQ29tcG9uZW50KSxcbiAgLy8gc28gdGhpcyBmaWxlIHJ1bnMgYXMgRVNNLCB3aGVyZSBfX2Rpcm5hbWUgaXNuJ3QgZGVmaW5lZC4gZnMucmVhZEZpbGVTeW5jIGFjY2VwdHMgYSBVUkxcbiAgLy8gZGlyZWN0bHksIHNvIG5vIG5lZWQgdG8gY29udmVydCBpdCB0byBhIHBhdGggZmlyc3QuXG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBuZXcgVVJMKCcuLi8uLi8ke29wdGlvbnMucHVibGljRGlyfS9jb25maWcuanNvbicsIGltcG9ydC5tZXRhLnVybClcbiAgY29uc3QgeyBjbGVya1B1Ymxpc2hhYmxlS2V5IH0gPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmLTgnKSlcblxuICBhd2FpdCBjbGVya1NldHVwKHsgcHVibGlzaGFibGVLZXk6IGNsZXJrUHVibGlzaGFibGVLZXkgfSlcbn1cbmAsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGUyZS9zdXBwb3J0L2NsZXJrLXNpZ24taW4udHMuIFNpZ25zIGluIGFzIGEgc3BlY2lmaWMgQ2xlcmsgdXNlciBieSBpZCB2aWEgYVxuICogYmFja2VuZC1pc3N1ZWQgc2lnbi1pbiB0b2tlbiAodGlja2V0IHN0cmF0ZWd5KSwgYnlwYXNzaW5nIHRoZSBhcHAncyBhY3R1YWwgc2lnbi1pblxuICogVUkgLS0gd2hpY2ggdHlwaWNhbGx5IG9ubHkgZXhwb3NlcyBhbiBPQXV0aCBwcm92aWRlciBidXR0b24gdGhhdCBjYW4ndCBiZSBkcml2ZW5cbiAqIHJlbGlhYmx5IGZyb20gYSB0ZXN0LiBAY2xlcmsvdGVzdGluZy9wbGF5d3JpZ2h0J3Mgb3duIGBjbGVyay5zaWduSW4oeyBlbWFpbEFkZHJlc3MgfSlgXG4gKiBkb2VzIHRoZSBzYW1lIHRpY2tldCBleGNoYW5nZSBpbnRlcm5hbGx5IGFmdGVyIGFuIGV4dHJhIGVtYWlsLT51c2VyIGxvb2t1cDsgZ29pbmdcbiAqIGZyb20gYSB1c2VyIGlkIGRpcmVjdGx5IChFMkVfQ0xFUktfVVNFUl9JRCkgc2tpcHMgdGhhdCBsb29rdXAgYW5kIGl0cyBmYWlsdXJlIG1vZGVcbiAqIChhbiBleGlzdGluZyB1c2VyIHdpdGhvdXQgYSB2ZXJpZmllZCBlbWFpbCBhdHRhY2hlZCkuXG4gKi9cbmNsYXNzIEUyRUNsZXJrU2lnbkluRmlsZSBleHRlbmRzIFNhbXBsZUZpbGUge1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBWaXRlUmVhY3RQcm9qZWN0KSB7XG4gICAgc3VwZXIocHJvamVjdCwgJ2UyZS9zdXBwb3J0L2NsZXJrLXNpZ24taW4udHMnLCB7XG4gICAgICBjb250ZW50czogYGltcG9ydCB7IGNyZWF0ZUNsZXJrQ2xpZW50IH0gZnJvbSAnQGNsZXJrL2JhY2tlbmQnXG5pbXBvcnQgeyBjbGVyayB9IGZyb20gJ0BjbGVyay90ZXN0aW5nL3BsYXl3cmlnaHQnXG5pbXBvcnQgdHlwZSB7IFBhZ2UgfSBmcm9tICdAcGxheXdyaWdodC90ZXN0J1xuXG4vKipcbiAqIFNpZ25zIGluIGFzIGEgc3BlY2lmaWMgQ2xlcmsgdXNlciBieSBpZC4gUmVxdWlyZXMgQ0xFUktfU0VDUkVUX0tFWSAoYWxzbyB1c2VkIGJ5XG4gKiBnbG9iYWwtc2V0dXAudHMpIGFuZCBhIHByaW9yIHBhZ2UuZ290bygpIHRvIGEgcGFnZSB0aGF0IGxvYWRzIENsZXJrLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnbkluQXNVc2VyKHBhZ2U6IFBhZ2UsIHVzZXJJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNsZXJrQ2xpZW50ID0gY3JlYXRlQ2xlcmtDbGllbnQoeyBzZWNyZXRLZXk6IHByb2Nlc3MuZW52LkNMRVJLX1NFQ1JFVF9LRVkgfSlcbiAgY29uc3QgeyB0b2tlbiB9ID0gYXdhaXQgY2xlcmtDbGllbnQuc2lnbkluVG9rZW5zLmNyZWF0ZVNpZ25JblRva2VuKHtcbiAgICB1c2VySWQsXG4gICAgZXhwaXJlc0luU2Vjb25kczogMzAwLFxuICB9KVxuICBhd2FpdCBjbGVyay5zaWduSW4oeyBwYWdlLCBzaWduSW5QYXJhbXM6IHsgc3RyYXRlZ3k6ICd0aWNrZXQnLCB0aWNrZXQ6IHRva2VuIH0gfSlcbn1cbmAsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGUyZS9zdXBwb3J0L2xpdmUudHMuXG4gKi9cbmNsYXNzIEUyRUxpdmVIZWxwZXJGaWxlIGV4dGVuZHMgU2FtcGxlRmlsZSB7XG4gIGNvbnN0cnVjdG9yKHByb2plY3Q6IFZpdGVSZWFjdFByb2plY3QpIHtcbiAgICBzdXBlcihwcm9qZWN0LCAnZTJlL3N1cHBvcnQvbGl2ZS50cycsIHtcbiAgICAgIGNvbnRlbnRzOiBgLyoqXG4gKiBUcnVlIHdoZW4gdGhpcyBydW4gdGFyZ2V0cyBhIHJlYWwgZGVwbG95bWVudCAoRTJFX0JBU0VfVVJMIHNldCAtLSBzZWVcbiAqIHBsYXl3cmlnaHQuY29uZmlnLnRzKSByYXRoZXIgdGhhbiBhIGxvY2FsIGRldiBzZXJ2ZXIuIFNwZWNzIHJlYWQgdGhpcyB0byBkZWNpZGVcbiAqIHdoZXRoZXIgdG8gc3R1YiB0aGUgYmFja2VuZDogYSBsaXZlIHJ1biBtdXN0IGhpdCB0aGUgcmVhbCBBUEkgdG8gcHJvdmUgYW55dGhpbmcsXG4gKiBhbmQgc3R1YmJpbmcgaXQgd291bGQganVzdCBiZSB0ZXN0aW5nIHRoZSBzdHViLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNMaXZlUnVuKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFwcm9jZXNzLmVudi5FMkVfQkFTRV9VUkxcbn1cbmAsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGUyZS9zbW9rZS5zcGVjLnRzIC0tIGEgZ2VuZXJpYyBzdGFydGVyIHRlc3QgdGhhdCBvbmx5IHJlbGllcyBvbiBtYXJrdXBcbiAqIFZpdGVSZWFjdFByb2plY3QncyBvd24gc2NhZmZvbGRlZCBtYWluLnRzeC9BcHAudHN4IGFsd2F5cyByZW5kZXIgKFNpZ25lZEluL1xuICogVXNlckJ1dHRvbiksIHNvIGl0IHdvcmtzIGJlZm9yZSBhIGNvbnN1bWVyIGhhcyB3cml0dGVuIGFueSByZWFsIHBhZ2VzLiBDb25zdW1lcnNcbiAqIGFyZSBleHBlY3RlZCB0byBleHRlbmQvcmVwbGFjZSB0aGlzIHdpdGggcmVhbCBmbG93cywgdGhlIHNhbWUgd2F5IHRoZXkgYWxyZWFkeVxuICogY3VzdG9taXplIEFwcC50c3guXG4gKi9cbmNsYXNzIEUyRVNtb2tlU3BlY0ZpbGUgZXh0ZW5kcyBTYW1wbGVGaWxlIHtcbiAgY29uc3RydWN0b3IocHJvamVjdDogVml0ZVJlYWN0UHJvamVjdCkge1xuICAgIHN1cGVyKHByb2plY3QsICdlMmUvc21va2Uuc3BlYy50cycsIHtcbiAgICAgIGNvbnRlbnRzOiBgaW1wb3J0IHsgdGVzdCwgZXhwZWN0IH0gZnJvbSAnQHBsYXl3cmlnaHQvdGVzdCdcbmltcG9ydCB7IHNpZ25JbkFzVXNlciB9IGZyb20gJy4vc3VwcG9ydC9jbGVyay1zaWduLWluJ1xuXG50ZXN0KCdzaWducyBpbiBhbmQgc2hvd3MgdGhlIGF1dGhlbnRpY2F0ZWQgVXNlckJ1dHRvbicsIGFzeW5jICh7IHBhZ2UgfSkgPT4ge1xuICAvLyBSZWFkIGZyb20gaW5zaWRlIHRoZSB0ZXN0IGJvZHksIG5vdCBtb2R1bGUgc2NvcGU6IFBsYXl3cmlnaHQgY29sbGVjdHMgKHJlcXVpcmVzKVxuICAvLyB0aGlzIGZpbGUgYmVmb3JlIHJ1bm5pbmcgZ2xvYmFsU2V0dXAsIHNvIGEgbW9kdWxlLWxldmVsIGNoZWNrIHdvdWxkIGFsd2F5cyBzZWUgYVxuICAvLyAuZW52LXNvdXJjZWQgdmFsdWUgYXMgdW5zZXQuIEV4cG9ydGluZyB0aGUgdmFyIGluIHRoZSBzaGVsbCB3b3JrcyBlaXRoZXIgd2F5LlxuICBjb25zdCB0ZXN0VXNlcklkID0gcHJvY2Vzcy5lbnYuRTJFX0NMRVJLX1VTRVJfSURcbiAgdGVzdC5za2lwKFxuICAgICF0ZXN0VXNlcklkIHx8ICFwcm9jZXNzLmVudi5DTEVSS19TRUNSRVRfS0VZLFxuICAgICdFMkVfQ0xFUktfVVNFUl9JRCBhbmQgQ0xFUktfU0VDUkVUX0tFWSBtdXN0IGJvdGggYmUgc2V0IC0tIHNlZSBlMmUvUkVBRE1FLm1kJyxcbiAgKVxuXG4gIC8vIHNpZ25JbkFzVXNlciByZXF1aXJlcyBhIHByaW9yIHBhZ2UuZ290bygpIHRvIGEgcGFnZSB0aGF0IGxvYWRzIENsZXJrLlxuICBhd2FpdCBwYWdlLmdvdG8oJy8nKVxuICBhd2FpdCBzaWduSW5Bc1VzZXIocGFnZSwgdGVzdFVzZXJJZCEpXG4gIGF3YWl0IHBhZ2UuZ290bygnLycpXG5cbiAgLy8gJy5jbC11c2VyQnV0dG9uVHJpZ2dlcicgaXMgb25lIG9mIENsZXJrJ3Mgb3duIGRvY3VtZW50ZWQsIHN0YWJsZSBcXGBjbC1cXGAtcHJlZml4ZWRcbiAgLy8gY2xhc3MgaG9va3MgKHBhcnQgb2YgaXRzIHRoZW1pbmcvYXBwZWFyYW5jZSBBUEkpLCBub3QgYW4gaW5jaWRlbnRhbCBET00gZGV0YWlsIC0tXG4gIC8vIHNhZmVyIHRvIGRlcGVuZCBvbiBhY3Jvc3MgQ2xlcmsgdmVyc2lvbnMgdGhhbiBhcHAtc3BlY2lmaWMgbWFya3VwIHRoaXMgY29uc3RydWN0XG4gIC8vIGRvZXNuJ3QgY29udHJvbC5cbiAgYXdhaXQgZXhwZWN0KHBhZ2UubG9jYXRvcignLmNsLXVzZXJCdXR0b25UcmlnZ2VyJykpLnRvQmVWaXNpYmxlKClcbn0pXG5gLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBlMmUvUkVBRE1FLm1kIGRvY3VtZW50aW5nIHRoZSBvbmUtdGltZSBzZXR1cCBhbmQgZW52IHZhciBjb252ZW50aW9uIGV2ZXJ5XG4gKiBjb25zdW1lciBuZWVkcywgc28gaXQgZG9lc24ndCBoYXZlIHRvIGJlIHJlLWRlcml2ZWQgYnkgaGFuZCBwZXIgcmVwby5cbiAqL1xuY2xhc3MgRTJFUmVhZG1lRmlsZSBleHRlbmRzIFNhbXBsZUZpbGUge1xuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBWaXRlUmVhY3RQcm9qZWN0KSB7XG4gICAgY29uc3QgdGVzdEUyZUNvbW1hbmQgPSBydW5TY3JpcHRDb21tYW5kKHByb2plY3QucGFja2FnZS5wYWNrYWdlTWFuYWdlciwgJ3Rlc3Q6ZTJlJyk7XG4gICAgc3VwZXIocHJvamVjdCwgJ2UyZS9SRUFETUUubWQnLCB7XG4gICAgICBjb250ZW50czogYCMgUGxheXdyaWdodCBlMmUgc3VpdGVcblxuUnVucyBhZ2FpbnN0IGEgcmVhbCBkZXYgc2VydmVyIChvciBhIGxpdmUgZGVwbG95bWVudCwgdmlhIFxcYEUyRV9CQVNFX1VSTFxcYCkgYW5kIHJlYWxcbkNsZXJrIGF1dGhlbnRpY2F0aW9uLlxuXG4jIyBPbmUtdGltZSBzZXR1cFxuXG4xLiBJbnN0YWxsIFBsYXl3cmlnaHQncyBicm93c2VyIGJpbmFyeSAobm90IGNvdmVyZWQgYnkgYSBwbGFpbiBkZXBlbmRlbmN5IGluc3RhbGwpOlxuXG4gICBcXGBcXGBcXGBiYXNoXG4gICBucHggcGxheXdyaWdodCBpbnN0YWxsIGNocm9taXVtXG4gICBcXGBcXGBcXGBcblxuMi4gR2V0IHR3byB2YWx1ZXMgZnJvbSB5b3VyIENsZXJrIGRhc2hib2FyZCdzIGRldiBpbnN0YW5jZTpcblxuICAgLSBcXGBDTEVSS19TRUNSRVRfS0VZXFxgIC0tIHRoZSAqKnNlY3JldCoqIGtleSAoQVBJIEtleXMpLiBOZXZlciBjb21taXQgdGhpczsgZXhwb3J0IGl0XG4gICAgIGluIHlvdXIgc2hlbGwgb3IgcHV0IGl0IGluIGEgbG9jYWwsIGdpdGlnbm9yZWQgXFxgLmVudlxcYC5cbiAgIC0gXFxgRTJFX0NMRVJLX1VTRVJfSURcXGAgLS0gdGhlIGlkIChcXGB1c2VyXy4uLlxcYCkgb2YgYW4gZXhpc3RpbmcgdGVzdCB1c2VyIChVc2VycyAtPiBjbGlja1xuICAgICBhIHVzZXIsIHRoZSBpZCBpcyBzaG93biBhdCB0aGUgdG9wKS4gVGhlIHVzZXIgbmVlZHMgYSB2ZXJpZmllZCBlbWFpbCBhZGRyZXNzLCBub3RcbiAgICAganVzdCBhbiBPQXV0aCBjb25uZWN0aW9uIC0tIGEgc2lnbi1pbiB0b2tlbiBoYXMgdG8gYmluZCB0byBhIHZlcmlmaWVkXG4gICAgIGlkZW50aWZpY2F0aW9uLiBDcmVhdGluZyBhIGRlZGljYXRlZCB0ZXN0IHVzZXIgd2l0aCBhbiBlbWFpbCBzZXQgZXhwbGljaXRseSBpcyB0aGVcbiAgICAgc2FmZXIgZGVmYXVsdC5cblxuICAgQSBydW4gd2l0aCBlaXRoZXIgdmFyaWFibGUgdW5zZXQgKipza2lwcyoqIHJhdGhlciB0aGFuIGZhaWxpbmcsIHNvIFxcYCR7dGVzdEUyZUNvbW1hbmR9XFxgXG4gICBpcyBhbHdheXMgc2FmZSB0byBydW4gd2l0aG91dCB0aGVtLlxuXG4zLiBUaGlzIGNvbnN0cnVjdCBkb2Vzbid0IG1hbmFnZSBcXGB2aXRlc3QuY29uZmlnLnRzXFxgIChpdCdzIGEgaGFuZC1hdXRob3JlZCxcbiAgIHBlci1jb25zdW1lciBmaWxlKS4gQWRkIGFuIFxcYGV4Y2x1ZGVcXGAgZW50cnkgc28gdml0ZXN0J3MgZGVmYXVsdCB0ZXN0IGdsb2IgZG9lc24ndFxuICAgYWxzbyB0cnkgdG8gcGljayB1cCB0aGVzZSBQbGF5d3JpZ2h0IHNwZWMgZmlsZXM6XG5cbiAgIFxcYFxcYFxcYHRzXG4gICBpbXBvcnQgeyBkZWZpbmVDb25maWcsIGNvbmZpZ0RlZmF1bHRzIH0gZnJvbSAndml0ZXN0L2NvbmZpZydcblxuICAgZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHtcbiAgICAgdGVzdDoge1xuICAgICAgIGV4Y2x1ZGU6IFsuLi5jb25maWdEZWZhdWx0cy5leGNsdWRlLCAnZTJlLyoqJ10sXG4gICAgICAgLy8gLi4ueW91ciBleGlzdGluZyBjb25maWdcbiAgICAgfSxcbiAgIH0pXG4gICBcXGBcXGBcXGBcblxuIyMgUnVubmluZ1xuXG5cXGBcXGBcXGBiYXNoXG5DTEVSS19TRUNSRVRfS0VZPS4uLiBFMkVfQ0xFUktfVVNFUl9JRD0uLi4gJHt0ZXN0RTJlQ29tbWFuZH1cblxcYFxcYFxcYFxuXG4jIyBSdW5uaW5nIGFnYWluc3QgYSBsaXZlIGVudmlyb25tZW50XG5cblNldCBcXGBFMkVfQkFTRV9VUkxcXGAgdG8gcG9pbnQgdGhlIHN1aXRlIGF0IGEgcmVhbCBkZXBsb3ltZW50IChhIHBlcnNvbmFsIGRldiBzdGFjaywgb3IgYVxuUFIncyBwci1kZXBsb3kgXFxgV2Vic2l0ZVVybFxcYCwgcG9zdGVkIGFzIGEgUFIgY29tbWVudCkgaW5zdGVhZCBvZiBhIGxvY2FsIGRldiBzZXJ2ZXI6XG5cblxcYFxcYFxcYGJhc2hcbkUyRV9CQVNFX1VSTD1odHRwczovLzx5b3VyLXN0YWNrPi5leGFtcGxlLmNvbSBcXFxcXG5DTEVSS19TRUNSRVRfS0VZPS4uLiBFMkVfQ0xFUktfVVNFUl9JRD0uLi4gXFxcXFxuJHt0ZXN0RTJlQ29tbWFuZH1cblxcYFxcYFxcYFxuXG4jIyBDSVxuXG5UaGUgZ2VuZXJhdGVkIFxcYHByLWRlcGxveS55bWxcXGAgd29ya2Zsb3cgKHNlZSBcXGBQckRlcGxveVdvcmtmbG93XFxgKSBhbHJlYWR5IHJ1bnMgdGhpc1xuc3VpdGUgYWdhaW5zdCBlYWNoIFBSJ3MgZGVwbG95ZWQgXFxgV2Vic2l0ZVVybFxcYCBhbmQgdXBsb2FkcyB0aGUgSFRNTCByZXBvcnQgYXMgYSBidWlsZFxuYXJ0aWZhY3Qgb24gZmFpbHVyZS4gSXQgc2VsZi1za2lwcyBleGFjdGx5IGxpa2UgYSBsb2NhbCBydW4gdW50aWwgYm90aCBzZWNyZXRzIGV4aXN0XG5pbiB0aGUgcmVwbzpcblxuXFxgXFxgXFxgYmFzaFxuZ2ggc2VjcmV0IHNldCBDTEVSS19TRUNSRVRfS0VZXG5naCBzZWNyZXQgc2V0IEUyRV9DTEVSS19VU0VSX0lEXG5cXGBcXGBcXGBcbmAsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -39,7 +39,7 @@ const fs = __importStar(require("fs"));
|
|
|
39
39
|
const path = __importStar(require("path"));
|
|
40
40
|
const projen_1 = require("projen");
|
|
41
41
|
class WorkflowAutoDiscover extends projen_1.Component {
|
|
42
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.WorkflowAutoDiscover", version: "1.
|
|
42
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@macedon-technologies/batman.WorkflowAutoDiscover", version: "1.24.1" };
|
|
43
43
|
constructor(project) {
|
|
44
44
|
super(project);
|
|
45
45
|
}
|
package/lib/utils.d.ts
CHANGED
|
@@ -19,4 +19,4 @@ export declare function installCommand(packageManager: NodePackageManager): stri
|
|
|
19
19
|
*/
|
|
20
20
|
export declare function sanitizeBranchNameScript(): string[];
|
|
21
21
|
export declare function serializeTs(value: any, depth?: number): string;
|
|
22
|
-
export declare function readmeContents(projectName: string): string;
|
|
22
|
+
export declare function readmeContents(projectName: string, e2eTesting?: boolean, packageManager?: NodePackageManager): string;
|