UNPKG

aws-cdk

Version:

CDK Toolkit, the command line tool for CDK apps

222 lines 26.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const util_1 = require("../../util"); const assets_1 = require("../../../lib/api/deployments/assets"); const deployments_1 = require("../../../lib/api/deployments"); const environment_resources_1 = require("../../../lib/api/environment-resources"); const mock_sdk_1 = require("../../util/mock-sdk"); const mock_toolkitinfo_1 = require("../../util/mock-toolkitinfo"); let assets; let envRegistry; let envResources; let toolkitMock; beforeEach(() => { assets = new deployments_1.AssetManifestBuilder(); envRegistry = new environment_resources_1.EnvironmentResourcesRegistry(); const sdk = new mock_sdk_1.MockSdk(); envResources = envRegistry.for({ account: '11111111', region: 'us-nowhere', name: 'aws://11111111/us-nowhere' }, sdk); toolkitMock = mock_toolkitinfo_1.MockToolkitInfo.setup(); }); afterEach(() => { toolkitMock.dispose(); }); describe('file assets', () => { test('convert to manifest and parameters', async () => { // GIVEN const ext = __filename.match(/\.([tj]s)$/)?.[1]; const stack = stackWithAssets([ { sourceHash: 'source-hash', path: __filename, id: 'SomeStackSomeResource4567', packaging: 'file', s3BucketParameter: 'BucketParameter', s3KeyParameter: 'KeyParameter', artifactHashParameter: 'ArtifactHashParameter', }, ]); // WHEN const params = await (0, assets_1.addMetadataAssetsToManifest)(stack, assets, envResources); // THEN expect(params).toEqual({ BucketParameter: 'MockToolkitBucketName', KeyParameter: `assets/SomeStackSomeResource4567/||source-hash.${ext}`, ArtifactHashParameter: 'source-hash', }); expect(assets.toManifest('.').entries).toEqual([ expect.objectContaining({ destination: { bucketName: 'MockToolkitBucketName', objectKey: `assets/SomeStackSomeResource4567/source-hash.${ext}`, }, source: { packaging: 'file', path: __filename, }, }), ]); }); test('hash and ID the same => only one path component', async () => { // GIVEN const ext = __filename.match(/\.([tj]s)$/)?.[1]; const stack = stackWithAssets([ { sourceHash: 'source-hash', path: __filename, id: 'source-hash', packaging: 'file', s3BucketParameter: 'BucketParameter', s3KeyParameter: 'KeyParameter', artifactHashParameter: 'ArtifactHashParameter', }, ]); // WHEN await (0, assets_1.addMetadataAssetsToManifest)(stack, assets, envResources); // THEN expect(assets.toManifest('.').entries).toEqual([ expect.objectContaining({ destination: { bucketName: 'MockToolkitBucketName', objectKey: `assets/source-hash.${ext}`, }, }), ]); }); test('reuse', async () => { // GIVEN const stack = stackWithAssets([ { path: __filename, id: 'SomeStackSomeResource4567', packaging: 'file', s3BucketParameter: 'BucketParameter', s3KeyParameter: 'KeyParameter', artifactHashParameter: 'ArtifactHashParameter', sourceHash: 'boom', }, ]); // WHEN const params = await (0, assets_1.addMetadataAssetsToManifest)(stack, assets, envResources, ['SomeStackSomeResource4567']); // THEN expect(params).toEqual({}); expect(assets.toManifest('.').entries).toEqual([]); }); }); describe('docker assets', () => { test('parameter and no repository name (old)', async () => { await (0, util_1.withMocked)(envResources, 'prepareEcrRepository', async () => { // GIVEN const stack = stackWithAssets([ { id: 'Stack:Construct/ABC123', imageNameParameter: 'MyParameter', packaging: 'container-image', path: '/foo', sourceHash: '0123456789abcdef', }, ]); mockFn(envResources.prepareEcrRepository).mockResolvedValue({ repositoryUri: 'docker.uri' }); // WHEN const params = await (0, assets_1.addMetadataAssetsToManifest)(stack, assets, envResources); // THEN expect(envResources.prepareEcrRepository).toHaveBeenCalledWith('cdk/stack-construct-abc123'); expect(params).toEqual({ MyParameter: 'docker.uri:0123456789abcdef', }); expect(assets.toManifest('.').entries).toEqual([ expect.objectContaining({ type: 'docker-image', destination: { imageTag: '0123456789abcdef', repositoryName: 'cdk/stack-construct-abc123', }, source: { directory: '/foo', }, }), ]); }); }); test('if parameter is left out then repo and tag are required', async () => { // GIVEN const stack = stackWithAssets([ { id: 'Stack:Construct/ABC123', packaging: 'container-image', path: '/foo', sourceHash: '0123456789abcdef', }, ]); await expect((0, assets_1.addMetadataAssetsToManifest)(stack, assets, envResources)).rejects.toThrow('Invalid Docker image asset'); }); test('no parameter and repo/tag name (new)', async () => { await (0, util_1.withMocked)(envResources, 'prepareEcrRepository', async () => { // GIVEN const stack = stackWithAssets([ { id: 'Stack:Construct/ABC123', repositoryName: 'reponame', imageTag: '12345', packaging: 'container-image', path: '/foo', sourceHash: '0123456789abcdef', }, ]); mockFn(envResources.prepareEcrRepository).mockResolvedValue({ repositoryUri: 'docker.uri' }); // WHEN const params = await (0, assets_1.addMetadataAssetsToManifest)(stack, assets, envResources); // THEN expect(envResources.prepareEcrRepository).toHaveBeenCalledWith('reponame'); expect(params).toEqual({}); // No parameters! expect(assets.toManifest('.').entries).toEqual([ expect.objectContaining({ type: 'docker-image', destination: { imageTag: '12345', repositoryName: 'reponame', }, source: { directory: '/foo', }, }), ]); }); }); test('reuse', async () => { // GIVEN const stack = stackWithAssets([ { path: __dirname, id: 'SomeStackSomeResource4567', packaging: 'container-image', imageNameParameter: 'asdf', sourceHash: 'source-hash', }, ]); // WHEN const params = await (0, assets_1.addMetadataAssetsToManifest)(stack, assets, envResources, ['SomeStackSomeResource4567']); // THEN expect(params).toEqual({}); expect(assets.toManifest('.').entries).toEqual([]); }); }); function stackWithAssets(assetEntries) { return (0, util_1.testStack)({ stackName: 'SomeStack', assets: assetEntries, template: { Resources: { SomeResource: { Type: 'AWS::Something::Something', }, }, }, }); } function mockFn(fn) { if (!jest.isMockFunction(fn)) { throw new Error(`Not a mock function: ${fn}`); } return fn; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJhc3NldHMudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLHFDQUFtRDtBQUNuRCxnRUFBa0Y7QUFDbEYsOERBQW9FO0FBQ3BFLGtGQUE0RztBQUM1RyxrREFBOEM7QUFDOUMsa0VBQThEO0FBRTlELElBQUksTUFBNEIsQ0FBQztBQUNqQyxJQUFJLFdBQXlDLENBQUM7QUFDOUMsSUFBSSxZQUFrQyxDQUFDO0FBQ3ZDLElBQUksV0FBcUQsQ0FBQztBQUMxRCxVQUFVLENBQUMsR0FBRyxFQUFFO0lBQ2QsTUFBTSxHQUFHLElBQUksa0NBQW9CLEVBQUUsQ0FBQztJQUNwQyxXQUFXLEdBQUcsSUFBSSxvREFBNEIsRUFBRSxDQUFDO0lBRWpELE1BQU0sR0FBRyxHQUFHLElBQUksa0JBQU8sRUFBRSxDQUFDO0lBQzFCLFlBQVksR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSwyQkFBMkIsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3RILFdBQVcsR0FBRyxrQ0FBZSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3hDLENBQUMsQ0FBQyxDQUFDO0FBRUgsU0FBUyxDQUFDLEdBQUcsRUFBRTtJQUNiLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUN4QixDQUFDLENBQUMsQ0FBQztBQUVILFFBQVEsQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFO0lBQzNCLElBQUksQ0FBQyxvQ0FBb0MsRUFBRSxLQUFLLElBQUksRUFBRTtRQUNwRCxRQUFRO1FBQ1IsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQztZQUM1QjtnQkFDRSxVQUFVLEVBQUUsYUFBYTtnQkFDekIsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLEVBQUUsRUFBRSwyQkFBMkI7Z0JBQy9CLFNBQVMsRUFBRSxNQUFNO2dCQUNqQixpQkFBaUIsRUFBRSxpQkFBaUI7Z0JBQ3BDLGNBQWMsRUFBRSxjQUFjO2dCQUM5QixxQkFBcUIsRUFBRSx1QkFBdUI7YUFDL0M7U0FDRixDQUFDLENBQUM7UUFFSCxPQUFPO1FBQ1AsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFBLG9DQUEyQixFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFOUUsT0FBTztRQUNQLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDckIsZUFBZSxFQUFFLHVCQUF1QjtZQUN4QyxZQUFZLEVBQUUsa0RBQWtELEdBQUcsRUFBRTtZQUNyRSxxQkFBcUIsRUFBRSxhQUFhO1NBQ3JDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUM3QyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7Z0JBQ3RCLFdBQVcsRUFBRTtvQkFDWCxVQUFVLEVBQUUsdUJBQXVCO29CQUNuQyxTQUFTLEVBQUUsZ0RBQWdELEdBQUcsRUFBRTtpQkFDakU7Z0JBQ0QsTUFBTSxFQUFFO29CQUNOLFNBQVMsRUFBRSxNQUFNO29CQUNqQixJQUFJLEVBQUUsVUFBVTtpQkFDakI7YUFDRixDQUFDO1NBQ0gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsaURBQWlELEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDakUsUUFBUTtRQUNSLE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRCxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUM7WUFDNUI7Z0JBQ0UsVUFBVSxFQUFFLGFBQWE7Z0JBQ3pCLElBQUksRUFBRSxVQUFVO2dCQUNoQixFQUFFLEVBQUUsYUFBYTtnQkFDakIsU0FBUyxFQUFFLE1BQU07Z0JBQ2pCLGlCQUFpQixFQUFFLGlCQUFpQjtnQkFDcEMsY0FBYyxFQUFFLGNBQWM7Z0JBQzlCLHFCQUFxQixFQUFFLHVCQUF1QjthQUMvQztTQUNGLENBQUMsQ0FBQztRQUVILE9BQU87UUFDUCxNQUFNLElBQUEsb0NBQTJCLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztRQUUvRCxPQUFPO1FBQ1AsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQzdDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDdEIsV0FBVyxFQUFFO29CQUNYLFVBQVUsRUFBRSx1QkFBdUI7b0JBQ25DLFNBQVMsRUFBRSxzQkFBc0IsR0FBRyxFQUFFO2lCQUN2QzthQUNGLENBQUM7U0FDSCxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDdkIsUUFBUTtRQUNSLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQztZQUM1QjtnQkFDRSxJQUFJLEVBQUUsVUFBVTtnQkFDaEIsRUFBRSxFQUFFLDJCQUEyQjtnQkFDL0IsU0FBUyxFQUFFLE1BQU07Z0JBQ2pCLGlCQUFpQixFQUFFLGlCQUFpQjtnQkFDcEMsY0FBYyxFQUFFLGNBQWM7Z0JBQzlCLHFCQUFxQixFQUFFLHVCQUF1QjtnQkFDOUMsVUFBVSxFQUFFLE1BQU07YUFDbkI7U0FDRixDQUFDLENBQUM7UUFFSCxPQUFPO1FBQ1AsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFBLG9DQUEyQixFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDO1FBRTdHLE9BQU87UUFDUCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQ3RCLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNyRCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsUUFBUSxDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUU7SUFDN0IsSUFBSSxDQUFDLHdDQUF3QyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3hELE1BQU0sSUFBQSxpQkFBVSxFQUFDLFlBQVksRUFBRSxzQkFBc0IsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNoRSxRQUFRO1lBQ1IsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDO2dCQUM1QjtvQkFDRSxFQUFFLEVBQUUsd0JBQXdCO29CQUM1QixrQkFBa0IsRUFBRSxhQUFhO29CQUNqQyxTQUFTLEVBQUUsaUJBQWlCO29CQUM1QixJQUFJLEVBQUUsTUFBTTtvQkFDWixVQUFVLEVBQUUsa0JBQWtCO2lCQUMvQjthQUNGLENBQUMsQ0FBQztZQUNILE1BQU0sQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO1lBRTdGLE9BQU87WUFDUCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUEsb0NBQTJCLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztZQUU5RSxPQUFPO1lBQ1AsTUFBTSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLDRCQUE0QixDQUFDLENBQUM7WUFDN0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFDckIsV0FBVyxFQUFFLDZCQUE2QjthQUMzQyxDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQzdDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDdEIsSUFBSSxFQUFFLGNBQWM7b0JBQ3BCLFdBQVcsRUFBRTt3QkFDWCxRQUFRLEVBQUUsa0JBQWtCO3dCQUM1QixjQUFjLEVBQUUsNEJBQTRCO3FCQUM3QztvQkFDRCxNQUFNLEVBQUU7d0JBQ04sU0FBUyxFQUFFLE1BQU07cUJBQ2xCO2lCQUNGLENBQUM7YUFDSCxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLHlEQUF5RCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3pFLFFBQVE7UUFDUixNQUFNLEtBQUssR0FBRyxlQUFlLENBQUM7WUFDNUI7Z0JBQ0UsRUFBRSxFQUFFLHdCQUF3QjtnQkFDNUIsU0FBUyxFQUFFLGlCQUFpQjtnQkFDNUIsSUFBSSxFQUFFLE1BQU07Z0JBQ1osVUFBVSxFQUFFLGtCQUFrQjthQUMvQjtTQUNGLENBQUMsQ0FBQztRQUVILE1BQU0sTUFBTSxDQUFDLElBQUEsb0NBQTJCLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUN2SCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQyxzQ0FBc0MsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN0RCxNQUFNLElBQUEsaUJBQVUsRUFBQyxZQUFZLEVBQUUsc0JBQXNCLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDaEUsUUFBUTtZQUNSLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQztnQkFDNUI7b0JBQ0UsRUFBRSxFQUFFLHdCQUF3QjtvQkFDNUIsY0FBYyxFQUFFLFVBQVU7b0JBQzFCLFFBQVEsRUFBRSxPQUFPO29CQUNqQixTQUFTLEVBQUUsaUJBQWlCO29CQUM1QixJQUFJLEVBQUUsTUFBTTtvQkFDWixVQUFVLEVBQUUsa0JBQWtCO2lCQUMvQjthQUNGLENBQUMsQ0FBQztZQUNILE1BQU0sQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO1lBRTdGLE9BQU87WUFDUCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUEsb0NBQTJCLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztZQUU5RSxPQUFPO1lBQ1AsTUFBTSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzNFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxpQkFBaUI7WUFDN0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDO2dCQUM3QyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7b0JBQ3RCLElBQUksRUFBRSxjQUFjO29CQUNwQixXQUFXLEVBQUU7d0JBQ1gsUUFBUSxFQUFFLE9BQU87d0JBQ2pCLGNBQWMsRUFBRSxVQUFVO3FCQUMzQjtvQkFDRCxNQUFNLEVBQUU7d0JBQ04sU0FBUyxFQUFFLE1BQU07cUJBQ2xCO2lCQUNGLENBQUM7YUFDSCxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUksRUFBRTtRQUN2QixRQUFRO1FBQ1IsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDO1lBQzVCO2dCQUNFLElBQUksRUFBRSxTQUFTO2dCQUNmLEVBQUUsRUFBRSwyQkFBMkI7Z0JBQy9CLFNBQVMsRUFBRSxpQkFBaUI7Z0JBQzVCLGtCQUFrQixFQUFFLE1BQU07Z0JBQzFCLFVBQVUsRUFBRSxhQUFhO2FBQzFCO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsT0FBTztRQUNQLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSxvQ0FBMkIsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQztRQUU3RyxPQUFPO1FBQ1AsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUN0QixDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDckQsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQztBQUVILFNBQVMsZUFBZSxDQUFDLFlBQWtDO0lBQ3pELE9BQU8sSUFBQSxnQkFBUyxFQUFDO1FBQ2YsU0FBUyxFQUFFLFdBQVc7UUFDdEIsTUFBTSxFQUFFLFlBQVk7UUFDcEIsUUFBUSxFQUFFO1lBQ1IsU0FBUyxFQUFFO2dCQUNULFlBQVksRUFBRTtvQkFDWixJQUFJLEVBQUUsMkJBQTJCO2lCQUNsQzthQUNGO1NBQ0Y7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxNQUFNLENBQWtDLEVBQUs7SUFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFDRCxPQUFPLEVBQUUsQ0FBQztBQUNaLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvb3JkZXIgKi9cbmltcG9ydCB7IEFzc2V0TWV0YWRhdGFFbnRyeSB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYSc7XG5pbXBvcnQgeyB0ZXN0U3RhY2ssIHdpdGhNb2NrZWQgfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IGFkZE1ldGFkYXRhQXNzZXRzVG9NYW5pZmVzdCB9IGZyb20gJy4uLy4uLy4uL2xpYi9hcGkvZGVwbG95bWVudHMvYXNzZXRzJztcbmltcG9ydCB7IEFzc2V0TWFuaWZlc3RCdWlsZGVyIH0gZnJvbSAnLi4vLi4vLi4vbGliL2FwaS9kZXBsb3ltZW50cyc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudFJlc291cmNlcywgRW52aXJvbm1lbnRSZXNvdXJjZXNSZWdpc3RyeSB9IGZyb20gJy4uLy4uLy4uL2xpYi9hcGkvZW52aXJvbm1lbnQtcmVzb3VyY2VzJztcbmltcG9ydCB7IE1vY2tTZGsgfSBmcm9tICcuLi8uLi91dGlsL21vY2stc2RrJztcbmltcG9ydCB7IE1vY2tUb29sa2l0SW5mbyB9IGZyb20gJy4uLy4uL3V0aWwvbW9jay10b29sa2l0aW5mbyc7XG5cbmxldCBhc3NldHM6IEFzc2V0TWFuaWZlc3RCdWlsZGVyO1xubGV0IGVudlJlZ2lzdHJ5OiBFbnZpcm9ubWVudFJlc291cmNlc1JlZ2lzdHJ5O1xubGV0IGVudlJlc291cmNlczogRW52aXJvbm1lbnRSZXNvdXJjZXM7XG5sZXQgdG9vbGtpdE1vY2s6IFJldHVyblR5cGU8dHlwZW9mIE1vY2tUb29sa2l0SW5mby5zZXR1cD47XG5iZWZvcmVFYWNoKCgpID0+IHtcbiAgYXNzZXRzID0gbmV3IEFzc2V0TWFuaWZlc3RCdWlsZGVyKCk7XG4gIGVudlJlZ2lzdHJ5ID0gbmV3IEVudmlyb25tZW50UmVzb3VyY2VzUmVnaXN0cnkoKTtcblxuICBjb25zdCBzZGsgPSBuZXcgTW9ja1NkaygpO1xuICBlbnZSZXNvdXJjZXMgPSBlbnZSZWdpc3RyeS5mb3IoeyBhY2NvdW50OiAnMTExMTExMTEnLCByZWdpb246ICd1cy1ub3doZXJlJywgbmFtZTogJ2F3czovLzExMTExMTExL3VzLW5vd2hlcmUnIH0sIHNkayk7XG4gIHRvb2xraXRNb2NrID0gTW9ja1Rvb2xraXRJbmZvLnNldHVwKCk7XG59KTtcblxuYWZ0ZXJFYWNoKCgpID0+IHtcbiAgdG9vbGtpdE1vY2suZGlzcG9zZSgpO1xufSk7XG5cbmRlc2NyaWJlKCdmaWxlIGFzc2V0cycsICgpID0+IHtcbiAgdGVzdCgnY29udmVydCB0byBtYW5pZmVzdCBhbmQgcGFyYW1ldGVycycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBHSVZFTlxuICAgIGNvbnN0IGV4dCA9IF9fZmlsZW5hbWUubWF0Y2goL1xcLihbdGpdcykkLyk/LlsxXTtcbiAgICBjb25zdCBzdGFjayA9IHN0YWNrV2l0aEFzc2V0cyhbXG4gICAgICB7XG4gICAgICAgIHNvdXJjZUhhc2g6ICdzb3VyY2UtaGFzaCcsXG4gICAgICAgIHBhdGg6IF9fZmlsZW5hbWUsXG4gICAgICAgIGlkOiAnU29tZVN0YWNrU29tZVJlc291cmNlNDU2NycsXG4gICAgICAgIHBhY2thZ2luZzogJ2ZpbGUnLFxuICAgICAgICBzM0J1Y2tldFBhcmFtZXRlcjogJ0J1Y2tldFBhcmFtZXRlcicsXG4gICAgICAgIHMzS2V5UGFyYW1ldGVyOiAnS2V5UGFyYW1ldGVyJyxcbiAgICAgICAgYXJ0aWZhY3RIYXNoUGFyYW1ldGVyOiAnQXJ0aWZhY3RIYXNoUGFyYW1ldGVyJyxcbiAgICAgIH0sXG4gICAgXSk7XG5cbiAgICAvLyBXSEVOXG4gICAgY29uc3QgcGFyYW1zID0gYXdhaXQgYWRkTWV0YWRhdGFBc3NldHNUb01hbmlmZXN0KHN0YWNrLCBhc3NldHMsIGVudlJlc291cmNlcyk7XG5cbiAgICAvLyBUSEVOXG4gICAgZXhwZWN0KHBhcmFtcykudG9FcXVhbCh7XG4gICAgICBCdWNrZXRQYXJhbWV0ZXI6ICdNb2NrVG9vbGtpdEJ1Y2tldE5hbWUnLFxuICAgICAgS2V5UGFyYW1ldGVyOiBgYXNzZXRzL1NvbWVTdGFja1NvbWVSZXNvdXJjZTQ1NjcvfHxzb3VyY2UtaGFzaC4ke2V4dH1gLFxuICAgICAgQXJ0aWZhY3RIYXNoUGFyYW1ldGVyOiAnc291cmNlLWhhc2gnLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KGFzc2V0cy50b01hbmlmZXN0KCcuJykuZW50cmllcykudG9FcXVhbChbXG4gICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgIGRlc3RpbmF0aW9uOiB7XG4gICAgICAgICAgYnVja2V0TmFtZTogJ01vY2tUb29sa2l0QnVja2V0TmFtZScsXG4gICAgICAgICAgb2JqZWN0S2V5OiBgYXNzZXRzL1NvbWVTdGFja1NvbWVSZXNvdXJjZTQ1Njcvc291cmNlLWhhc2guJHtleHR9YCxcbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlOiB7XG4gICAgICAgICAgcGFja2FnaW5nOiAnZmlsZScsXG4gICAgICAgICAgcGF0aDogX19maWxlbmFtZSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgIF0pO1xuICB9KTtcblxuICB0ZXN0KCdoYXNoIGFuZCBJRCB0aGUgc2FtZSA9PiBvbmx5IG9uZSBwYXRoIGNvbXBvbmVudCcsIGFzeW5jICgpID0+IHtcbiAgICAvLyBHSVZFTlxuICAgIGNvbnN0IGV4dCA9IF9fZmlsZW5hbWUubWF0Y2goL1xcLihbdGpdcykkLyk/LlsxXTtcbiAgICBjb25zdCBzdGFjayA9IHN0YWNrV2l0aEFzc2V0cyhbXG4gICAgICB7XG4gICAgICAgIHNvdXJjZUhhc2g6ICdzb3VyY2UtaGFzaCcsXG4gICAgICAgIHBhdGg6IF9fZmlsZW5hbWUsXG4gICAgICAgIGlkOiAnc291cmNlLWhhc2gnLFxuICAgICAgICBwYWNrYWdpbmc6ICdmaWxlJyxcbiAgICAgICAgczNCdWNrZXRQYXJhbWV0ZXI6ICdCdWNrZXRQYXJhbWV0ZXInLFxuICAgICAgICBzM0tleVBhcmFtZXRlcjogJ0tleVBhcmFtZXRlcicsXG4gICAgICAgIGFydGlmYWN0SGFzaFBhcmFtZXRlcjogJ0FydGlmYWN0SGFzaFBhcmFtZXRlcicsXG4gICAgICB9LFxuICAgIF0pO1xuXG4gICAgLy8gV0hFTlxuICAgIGF3YWl0IGFkZE1ldGFkYXRhQXNzZXRzVG9NYW5pZmVzdChzdGFjaywgYXNzZXRzLCBlbnZSZXNvdXJjZXMpO1xuXG4gICAgLy8gVEhFTlxuICAgIGV4cGVjdChhc3NldHMudG9NYW5pZmVzdCgnLicpLmVudHJpZXMpLnRvRXF1YWwoW1xuICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICBkZXN0aW5hdGlvbjoge1xuICAgICAgICAgIGJ1Y2tldE5hbWU6ICdNb2NrVG9vbGtpdEJ1Y2tldE5hbWUnLFxuICAgICAgICAgIG9iamVjdEtleTogYGFzc2V0cy9zb3VyY2UtaGFzaC4ke2V4dH1gLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgXSk7XG4gIH0pO1xuXG4gIHRlc3QoJ3JldXNlJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIEdJVkVOXG4gICAgY29uc3Qgc3RhY2sgPSBzdGFja1dpdGhBc3NldHMoW1xuICAgICAge1xuICAgICAgICBwYXRoOiBfX2ZpbGVuYW1lLFxuICAgICAgICBpZDogJ1NvbWVTdGFja1NvbWVSZXNvdXJjZTQ1NjcnLFxuICAgICAgICBwYWNrYWdpbmc6ICdmaWxlJyxcbiAgICAgICAgczNCdWNrZXRQYXJhbWV0ZXI6ICdCdWNrZXRQYXJhbWV0ZXInLFxuICAgICAgICBzM0tleVBhcmFtZXRlcjogJ0tleVBhcmFtZXRlcicsXG4gICAgICAgIGFydGlmYWN0SGFzaFBhcmFtZXRlcjogJ0FydGlmYWN0SGFzaFBhcmFtZXRlcicsXG4gICAgICAgIHNvdXJjZUhhc2g6ICdib29tJyxcbiAgICAgIH0sXG4gICAgXSk7XG5cbiAgICAvLyBXSEVOXG4gICAgY29uc3QgcGFyYW1zID0gYXdhaXQgYWRkTWV0YWRhdGFBc3NldHNUb01hbmlmZXN0KHN0YWNrLCBhc3NldHMsIGVudlJlc291cmNlcywgWydTb21lU3RhY2tTb21lUmVzb3VyY2U0NTY3J10pO1xuXG4gICAgLy8gVEhFTlxuICAgIGV4cGVjdChwYXJhbXMpLnRvRXF1YWwoe1xuICAgIH0pO1xuXG4gICAgZXhwZWN0KGFzc2V0cy50b01hbmlmZXN0KCcuJykuZW50cmllcykudG9FcXVhbChbXSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdkb2NrZXIgYXNzZXRzJywgKCkgPT4ge1xuICB0ZXN0KCdwYXJhbWV0ZXIgYW5kIG5vIHJlcG9zaXRvcnkgbmFtZSAob2xkKScsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCB3aXRoTW9ja2VkKGVudlJlc291cmNlcywgJ3ByZXBhcmVFY3JSZXBvc2l0b3J5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gR0lWRU5cbiAgICAgIGNvbnN0IHN0YWNrID0gc3RhY2tXaXRoQXNzZXRzKFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnU3RhY2s6Q29uc3RydWN0L0FCQzEyMycsXG4gICAgICAgICAgaW1hZ2VOYW1lUGFyYW1ldGVyOiAnTXlQYXJhbWV0ZXInLFxuICAgICAgICAgIHBhY2thZ2luZzogJ2NvbnRhaW5lci1pbWFnZScsXG4gICAgICAgICAgcGF0aDogJy9mb28nLFxuICAgICAgICAgIHNvdXJjZUhhc2g6ICcwMTIzNDU2Nzg5YWJjZGVmJyxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgICAgbW9ja0ZuKGVudlJlc291cmNlcy5wcmVwYXJlRWNyUmVwb3NpdG9yeSkubW9ja1Jlc29sdmVkVmFsdWUoeyByZXBvc2l0b3J5VXJpOiAnZG9ja2VyLnVyaScgfSk7XG5cbiAgICAgIC8vIFdIRU5cbiAgICAgIGNvbnN0IHBhcmFtcyA9IGF3YWl0IGFkZE1ldGFkYXRhQXNzZXRzVG9NYW5pZmVzdChzdGFjaywgYXNzZXRzLCBlbnZSZXNvdXJjZXMpO1xuXG4gICAgICAvLyBUSEVOXG4gICAgICBleHBlY3QoZW52UmVzb3VyY2VzLnByZXBhcmVFY3JSZXBvc2l0b3J5KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnY2RrL3N0YWNrLWNvbnN0cnVjdC1hYmMxMjMnKTtcbiAgICAgIGV4cGVjdChwYXJhbXMpLnRvRXF1YWwoe1xuICAgICAgICBNeVBhcmFtZXRlcjogJ2RvY2tlci51cmk6MDEyMzQ1Njc4OWFiY2RlZicsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChhc3NldHMudG9NYW5pZmVzdCgnLicpLmVudHJpZXMpLnRvRXF1YWwoW1xuICAgICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgICAgdHlwZTogJ2RvY2tlci1pbWFnZScsXG4gICAgICAgICAgZGVzdGluYXRpb246IHtcbiAgICAgICAgICAgIGltYWdlVGFnOiAnMDEyMzQ1Njc4OWFiY2RlZicsXG4gICAgICAgICAgICByZXBvc2l0b3J5TmFtZTogJ2Nkay9zdGFjay1jb25zdHJ1Y3QtYWJjMTIzJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNvdXJjZToge1xuICAgICAgICAgICAgZGlyZWN0b3J5OiAnL2ZvbycsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICBdKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgnaWYgcGFyYW1ldGVyIGlzIGxlZnQgb3V0IHRoZW4gcmVwbyBhbmQgdGFnIGFyZSByZXF1aXJlZCcsIGFzeW5jICgpID0+IHtcbiAgICAvLyBHSVZFTlxuICAgIGNvbnN0IHN0YWNrID0gc3RhY2tXaXRoQXNzZXRzKFtcbiAgICAgIHtcbiAgICAgICAgaWQ6ICdTdGFjazpDb25zdHJ1Y3QvQUJDMTIzJyxcbiAgICAgICAgcGFja2FnaW5nOiAnY29udGFpbmVyLWltYWdlJyxcbiAgICAgICAgcGF0aDogJy9mb28nLFxuICAgICAgICBzb3VyY2VIYXNoOiAnMDEyMzQ1Njc4OWFiY2RlZicsXG4gICAgICB9LFxuICAgIF0pO1xuXG4gICAgYXdhaXQgZXhwZWN0KGFkZE1ldGFkYXRhQXNzZXRzVG9NYW5pZmVzdChzdGFjaywgYXNzZXRzLCBlbnZSZXNvdXJjZXMpKS5yZWplY3RzLnRvVGhyb3coJ0ludmFsaWQgRG9ja2VyIGltYWdlIGFzc2V0Jyk7XG4gIH0pO1xuXG4gIHRlc3QoJ25vIHBhcmFtZXRlciBhbmQgcmVwby90YWcgbmFtZSAobmV3KScsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCB3aXRoTW9ja2VkKGVudlJlc291cmNlcywgJ3ByZXBhcmVFY3JSZXBvc2l0b3J5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gR0lWRU5cbiAgICAgIGNvbnN0IHN0YWNrID0gc3RhY2tXaXRoQXNzZXRzKFtcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnU3RhY2s6Q29uc3RydWN0L0FCQzEyMycsXG4gICAgICAgICAgcmVwb3NpdG9yeU5hbWU6ICdyZXBvbmFtZScsXG4gICAgICAgICAgaW1hZ2VUYWc6ICcxMjM0NScsXG4gICAgICAgICAgcGFja2FnaW5nOiAnY29udGFpbmVyLWltYWdlJyxcbiAgICAgICAgICBwYXRoOiAnL2ZvbycsXG4gICAgICAgICAgc291cmNlSGFzaDogJzAxMjM0NTY3ODlhYmNkZWYnLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgICBtb2NrRm4oZW52UmVzb3VyY2VzLnByZXBhcmVFY3JSZXBvc2l0b3J5KS5tb2NrUmVzb2x2ZWRWYWx1ZSh7IHJlcG9zaXRvcnlVcmk6ICdkb2NrZXIudXJpJyB9KTtcblxuICAgICAgLy8gV0hFTlxuICAgICAgY29uc3QgcGFyYW1zID0gYXdhaXQgYWRkTWV0YWRhdGFBc3NldHNUb01hbmlmZXN0KHN0YWNrLCBhc3NldHMsIGVudlJlc291cmNlcyk7XG5cbiAgICAgIC8vIFRIRU5cbiAgICAgIGV4cGVjdChlbnZSZXNvdXJjZXMucHJlcGFyZUVjclJlcG9zaXRvcnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdyZXBvbmFtZScpO1xuICAgICAgZXhwZWN0KHBhcmFtcykudG9FcXVhbCh7fSk7IC8vIE5vIHBhcmFtZXRlcnMhXG4gICAgICBleHBlY3QoYXNzZXRzLnRvTWFuaWZlc3QoJy4nKS5lbnRyaWVzKS50b0VxdWFsKFtcbiAgICAgICAgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoe1xuICAgICAgICAgIHR5cGU6ICdkb2NrZXItaW1hZ2UnLFxuICAgICAgICAgIGRlc3RpbmF0aW9uOiB7XG4gICAgICAgICAgICBpbWFnZVRhZzogJzEyMzQ1JyxcbiAgICAgICAgICAgIHJlcG9zaXRvcnlOYW1lOiAncmVwb25hbWUnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc291cmNlOiB7XG4gICAgICAgICAgICBkaXJlY3Rvcnk6ICcvZm9vJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgIF0pO1xuICAgIH0pO1xuICB9KTtcblxuICB0ZXN0KCdyZXVzZScsIGFzeW5jICgpID0+IHtcbiAgICAvLyBHSVZFTlxuICAgIGNvbnN0IHN0YWNrID0gc3RhY2tXaXRoQXNzZXRzKFtcbiAgICAgIHtcbiAgICAgICAgcGF0aDogX19kaXJuYW1lLFxuICAgICAgICBpZDogJ1NvbWVTdGFja1NvbWVSZXNvdXJjZTQ1NjcnLFxuICAgICAgICBwYWNrYWdpbmc6ICdjb250YWluZXItaW1hZ2UnLFxuICAgICAgICBpbWFnZU5hbWVQYXJhbWV0ZXI6ICdhc2RmJyxcbiAgICAgICAgc291cmNlSGFzaDogJ3NvdXJjZS1oYXNoJyxcbiAgICAgIH0sXG4gICAgXSk7XG5cbiAgICAvLyBXSEVOXG4gICAgY29uc3QgcGFyYW1zID0gYXdhaXQgYWRkTWV0YWRhdGFBc3NldHNUb01hbmlmZXN0KHN0YWNrLCBhc3NldHMsIGVudlJlc291cmNlcywgWydTb21lU3RhY2tTb21lUmVzb3VyY2U0NTY3J10pO1xuXG4gICAgLy8gVEhFTlxuICAgIGV4cGVjdChwYXJhbXMpLnRvRXF1YWwoe1xuICAgIH0pO1xuXG4gICAgZXhwZWN0KGFzc2V0cy50b01hbmlmZXN0KCcuJykuZW50cmllcykudG9FcXVhbChbXSk7XG4gIH0pO1xufSk7XG5cbmZ1bmN0aW9uIHN0YWNrV2l0aEFzc2V0cyhhc3NldEVudHJpZXM6IEFzc2V0TWV0YWRhdGFFbnRyeVtdKSB7XG4gIHJldHVybiB0ZXN0U3RhY2soe1xuICAgIHN0YWNrTmFtZTogJ1NvbWVTdGFjaycsXG4gICAgYXNzZXRzOiBhc3NldEVudHJpZXMsXG4gICAgdGVtcGxhdGU6IHtcbiAgICAgIFJlc291cmNlczoge1xuICAgICAgICBTb21lUmVzb3VyY2U6IHtcbiAgICAgICAgICBUeXBlOiAnQVdTOjpTb21ldGhpbmc6OlNvbWV0aGluZycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtb2NrRm48RiBleHRlbmRzICguLi54czogYW55W10pID0+IGFueT4oZm46IEYpOiBqZXN0Lk1vY2s8UmV0dXJuVHlwZTxGPj4ge1xuICBpZiAoIWplc3QuaXNNb2NrRnVuY3Rpb24oZm4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBOb3QgYSBtb2NrIGZ1bmN0aW9uOiAke2ZufWApO1xuICB9XG4gIHJldHVybiBmbjtcbn1cbiJdfQ==