cdk-assets 3.3.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/THIRD_PARTY_LICENSES +18764 -0
- package/bin/cdk-assets.js +109830 -62
- package/bin/docker-credential-cdk-assets.js +4 -4
- package/bin/list.js +3 -3
- package/bin/logging.js +3 -1
- package/bin/publish.js +6 -6
- package/package.json +11 -30
- package/lib/asset-manifest.d.ts +0 -186
- package/lib/asset-manifest.js +0 -270
- package/lib/aws-types.d.ts +0 -1666
- package/lib/aws-types.js +0 -144
- package/lib/aws.d.ts +0 -71
- package/lib/aws.js +0 -131
- package/lib/index.d.ts +0 -4
- package/lib/index.js +0 -21
- package/lib/private/archive.d.ts +0 -3
- package/lib/private/archive.js +0 -87
- package/lib/private/asset-handler.d.ts +0 -60
- package/lib/private/asset-handler.js +0 -3
- package/lib/private/docker-credentials.d.ts +0 -35
- package/lib/private/docker-credentials.js +0 -90
- package/lib/private/docker.d.ts +0 -98
- package/lib/private/docker.js +0 -235
- package/lib/private/fs-extra.d.ts +0 -3
- package/lib/private/fs-extra.js +0 -37
- package/lib/private/handlers/client-options.d.ts +0 -3
- package/lib/private/handlers/client-options.js +0 -12
- package/lib/private/handlers/container-images.d.ts +0 -22
- package/lib/private/handlers/container-images.js +0 -224
- package/lib/private/handlers/files.d.ts +0 -14
- package/lib/private/handlers/files.js +0 -289
- package/lib/private/handlers/index.d.ts +0 -3
- package/lib/private/handlers/index.js +0 -16
- package/lib/private/p-limit.d.ts +0 -10
- package/lib/private/p-limit.js +0 -51
- package/lib/private/placeholders.d.ts +0 -10
- package/lib/private/placeholders.js +0 -34
- package/lib/private/shell.d.ts +0 -24
- package/lib/private/shell.js +0 -131
- package/lib/private/util.d.ts +0 -5
- package/lib/private/util.js +0 -16
- package/lib/progress.d.ts +0 -114
- package/lib/progress.js +0 -104
- package/lib/publishing.d.ts +0 -118
- package/lib/publishing.js +0 -193
- package/scripts/manual-test-manifest.json +0 -12
- package/scripts/manual-test.sh +0 -22
package/lib/private/docker.js
DELETED
|
@@ -1,235 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DockerFactory = exports.Docker = void 0;
|
|
4
|
-
const fs = require("fs");
|
|
5
|
-
const os = require("os");
|
|
6
|
-
const path = require("path");
|
|
7
|
-
const docker_credentials_1 = require("./docker-credentials");
|
|
8
|
-
const shell_1 = require("./shell");
|
|
9
|
-
const util_1 = require("./util");
|
|
10
|
-
const progress_1 = require("../progress");
|
|
11
|
-
var InspectImageErrorCode;
|
|
12
|
-
(function (InspectImageErrorCode) {
|
|
13
|
-
InspectImageErrorCode[InspectImageErrorCode["Docker"] = 1] = "Docker";
|
|
14
|
-
InspectImageErrorCode[InspectImageErrorCode["Podman"] = 125] = "Podman";
|
|
15
|
-
})(InspectImageErrorCode || (InspectImageErrorCode = {}));
|
|
16
|
-
class Docker {
|
|
17
|
-
constructor(eventEmitter, subprocessOutputDestination) {
|
|
18
|
-
this.eventEmitter = eventEmitter;
|
|
19
|
-
this.subprocessOutputDestination = subprocessOutputDestination;
|
|
20
|
-
this.configDir = undefined;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Whether an image with the given tag exists
|
|
24
|
-
*/
|
|
25
|
-
async exists(tag) {
|
|
26
|
-
try {
|
|
27
|
-
await this.execute(['inspect', tag], {
|
|
28
|
-
subprocessOutputDestination: 'ignore',
|
|
29
|
-
});
|
|
30
|
-
return true;
|
|
31
|
-
}
|
|
32
|
-
catch (e) {
|
|
33
|
-
const error = e;
|
|
34
|
-
/**
|
|
35
|
-
* The only error we expect to be thrown will have this property and value.
|
|
36
|
-
* If it doesn't, it's unrecognized so re-throw it.
|
|
37
|
-
*/
|
|
38
|
-
if (error.code !== 'PROCESS_FAILED') {
|
|
39
|
-
throw error;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* If we know the shell command above returned an error, check to see
|
|
43
|
-
* if the exit code is one we know to actually mean that the image doesn't
|
|
44
|
-
* exist.
|
|
45
|
-
*/
|
|
46
|
-
switch (error.exitCode) {
|
|
47
|
-
case InspectImageErrorCode.Docker:
|
|
48
|
-
case InspectImageErrorCode.Podman:
|
|
49
|
-
// Docker and Podman will return this exit code when an image doesn't exist, return false
|
|
50
|
-
// context: https://github.com/aws/aws-cdk/issues/16209
|
|
51
|
-
return false;
|
|
52
|
-
default:
|
|
53
|
-
// This is an error but it's not an exit code we recognize, throw.
|
|
54
|
-
throw error;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
async build(options) {
|
|
59
|
-
const buildCommand = [
|
|
60
|
-
'build',
|
|
61
|
-
...flatten(Object.entries(options.buildArgs || {}).map(([k, v]) => ['--build-arg', `${k}=${v}`])),
|
|
62
|
-
...flatten(Object.entries(options.buildSecrets || {}).map(([k, v]) => ['--secret', `id=${k},${v}`])),
|
|
63
|
-
...(options.buildSsh ? ['--ssh', options.buildSsh] : []),
|
|
64
|
-
'--tag',
|
|
65
|
-
options.tag,
|
|
66
|
-
...(options.target ? ['--target', options.target] : []),
|
|
67
|
-
...(options.file ? ['--file', options.file] : []),
|
|
68
|
-
...(options.networkMode ? ['--network', options.networkMode] : []),
|
|
69
|
-
...(options.platform ? ['--platform', options.platform] : []),
|
|
70
|
-
...(options.outputs ? options.outputs.map((output) => [`--output=${output}`]) : []),
|
|
71
|
-
...(options.cacheFrom
|
|
72
|
-
? [
|
|
73
|
-
...options.cacheFrom
|
|
74
|
-
.map((cacheFrom) => ['--cache-from', this.cacheOptionToFlag(cacheFrom)])
|
|
75
|
-
.flat(),
|
|
76
|
-
]
|
|
77
|
-
: []),
|
|
78
|
-
...(options.cacheTo ? ['--cache-to', this.cacheOptionToFlag(options.cacheTo)] : []),
|
|
79
|
-
...(options.cacheDisabled ? ['--no-cache'] : []),
|
|
80
|
-
'.',
|
|
81
|
-
];
|
|
82
|
-
await this.execute(buildCommand, {
|
|
83
|
-
cwd: options.directory,
|
|
84
|
-
subprocessOutputDestination: this.subprocessOutputDestination,
|
|
85
|
-
env: {
|
|
86
|
-
BUILDX_NO_DEFAULT_ATTESTATIONS: '1', // Docker Build adds provenance attestations by default that confuse cdk-assets
|
|
87
|
-
},
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Get credentials from ECR and run docker login
|
|
92
|
-
*/
|
|
93
|
-
async login(ecr) {
|
|
94
|
-
const credentials = await (0, docker_credentials_1.obtainEcrCredentials)(ecr, this.eventEmitter);
|
|
95
|
-
// Use --password-stdin otherwise docker will complain. Loudly.
|
|
96
|
-
await this.execute(['login', '--username', credentials.username, '--password-stdin', credentials.endpoint.replace(/^https?:\/\/|\/$/g, '')], {
|
|
97
|
-
input: credentials.password,
|
|
98
|
-
// Need to ignore otherwise Docker will complain
|
|
99
|
-
// 'WARNING! Your password will be stored unencrypted'
|
|
100
|
-
// doesn't really matter since it's a token.
|
|
101
|
-
subprocessOutputDestination: 'ignore',
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
async tag(sourceTag, targetTag) {
|
|
105
|
-
await this.execute(['tag', sourceTag, targetTag]);
|
|
106
|
-
}
|
|
107
|
-
async push(options) {
|
|
108
|
-
await this.execute(['push', options.tag], {
|
|
109
|
-
subprocessOutputDestination: this.subprocessOutputDestination,
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* If a CDK Docker Credentials file exists, creates a new Docker config directory.
|
|
114
|
-
* Sets up `docker-credential-cdk-assets` to be the credential helper for each domain in the CDK config.
|
|
115
|
-
* All future commands (e.g., `build`, `push`) will use this config.
|
|
116
|
-
*
|
|
117
|
-
* See https://docs.docker.com/engine/reference/commandline/login/#credential-helpers for more details on cred helpers.
|
|
118
|
-
*
|
|
119
|
-
* @returns true if CDK config was found and configured, false otherwise
|
|
120
|
-
*/
|
|
121
|
-
configureCdkCredentials() {
|
|
122
|
-
const config = (0, docker_credentials_1.cdkCredentialsConfig)();
|
|
123
|
-
if (!config) {
|
|
124
|
-
return false;
|
|
125
|
-
}
|
|
126
|
-
this.configDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cdkDockerConfig'));
|
|
127
|
-
const domains = Object.keys(config.domainCredentials);
|
|
128
|
-
const credHelpers = domains.reduce((map, domain) => {
|
|
129
|
-
map[domain] = 'cdk-assets'; // Use docker-credential-cdk-assets for this domain
|
|
130
|
-
return map;
|
|
131
|
-
}, {});
|
|
132
|
-
fs.writeFileSync(path.join(this.configDir, 'config.json'), JSON.stringify({ credHelpers }), {
|
|
133
|
-
encoding: 'utf-8',
|
|
134
|
-
});
|
|
135
|
-
return true;
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Removes any configured Docker config directory.
|
|
139
|
-
* All future commands (e.g., `build`, `push`) will use the default config.
|
|
140
|
-
*
|
|
141
|
-
* This is useful after calling `configureCdkCredentials` to reset to default credentials.
|
|
142
|
-
*/
|
|
143
|
-
resetAuthPlugins() {
|
|
144
|
-
this.configDir = undefined;
|
|
145
|
-
}
|
|
146
|
-
async execute(args, options = {}) {
|
|
147
|
-
const configArgs = this.configDir ? ['--config', this.configDir] : [];
|
|
148
|
-
const pathToCdkAssets = path.resolve(__dirname, '..', '..', 'bin');
|
|
149
|
-
const shellEventPublisher = (0, progress_1.shellEventPublisherFromEventEmitter)(this.eventEmitter);
|
|
150
|
-
try {
|
|
151
|
-
await (0, shell_1.shell)([getDockerCmd(), ...configArgs, ...args], {
|
|
152
|
-
...options,
|
|
153
|
-
shellEventPublisher: shellEventPublisher,
|
|
154
|
-
env: {
|
|
155
|
-
...process.env,
|
|
156
|
-
...options.env,
|
|
157
|
-
PATH: `${pathToCdkAssets}${path.delimiter}${options.env?.PATH ?? process.env.PATH}`,
|
|
158
|
-
},
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
catch (e) {
|
|
162
|
-
if (e.code === 'ENOENT') {
|
|
163
|
-
throw new Error(`Failed to find and execute '${getDockerCmd()}' while attempting to build a container asset. Please install '${getDockerCmd()}' and try again. (Or set the 'CDK_DOCKER ' environment variable to choose a different compatible container client.)`);
|
|
164
|
-
}
|
|
165
|
-
throw e;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
cacheOptionToFlag(option) {
|
|
169
|
-
let flag = `type=${option.type}`;
|
|
170
|
-
if (option.params) {
|
|
171
|
-
flag +=
|
|
172
|
-
',' +
|
|
173
|
-
Object.entries(option.params)
|
|
174
|
-
.map(([k, v]) => `${k}=${v}`)
|
|
175
|
-
.join(',');
|
|
176
|
-
}
|
|
177
|
-
return flag;
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
exports.Docker = Docker;
|
|
181
|
-
/**
|
|
182
|
-
* Helps get appropriately configured Docker instances during the container
|
|
183
|
-
* image publishing process.
|
|
184
|
-
*/
|
|
185
|
-
class DockerFactory {
|
|
186
|
-
constructor() {
|
|
187
|
-
this.enterLoggedInDestinationsCriticalSection = (0, util_1.createCriticalSection)();
|
|
188
|
-
this.loggedInDestinations = new Set();
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Gets a Docker instance for building images.
|
|
192
|
-
*/
|
|
193
|
-
async forBuild(options) {
|
|
194
|
-
const docker = new Docker(options.eventEmitter, options.subprocessOutputDestination);
|
|
195
|
-
// Default behavior is to login before build so that the Dockerfile can reference images in the ECR repo
|
|
196
|
-
// However, if we're in a pipelines environment (for example),
|
|
197
|
-
// we may have alternative credentials to the default ones to use for the build itself.
|
|
198
|
-
// If the special config file is present, delay the login to the default credentials until the push.
|
|
199
|
-
// If the config file is present, we will configure and use those credentials for the build.
|
|
200
|
-
let cdkDockerCredentialsConfigured = docker.configureCdkCredentials();
|
|
201
|
-
if (!cdkDockerCredentialsConfigured) {
|
|
202
|
-
await this.loginOncePerDestination(docker, options);
|
|
203
|
-
}
|
|
204
|
-
return docker;
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Gets a Docker instance for pushing images to ECR.
|
|
208
|
-
*/
|
|
209
|
-
async forEcrPush(options) {
|
|
210
|
-
const docker = new Docker(options.eventEmitter, options.subprocessOutputDestination);
|
|
211
|
-
await this.loginOncePerDestination(docker, options);
|
|
212
|
-
return docker;
|
|
213
|
-
}
|
|
214
|
-
async loginOncePerDestination(docker, options) {
|
|
215
|
-
// Changes: 012345678910.dkr.ecr.us-west-2.amazonaws.com/tagging-test
|
|
216
|
-
// To this: 012345678910.dkr.ecr.us-west-2.amazonaws.com
|
|
217
|
-
const repositoryDomain = options.repoUri.split('/')[0];
|
|
218
|
-
// Ensure one-at-a-time access to loggedInDestinations.
|
|
219
|
-
await this.enterLoggedInDestinationsCriticalSection(async () => {
|
|
220
|
-
if (this.loggedInDestinations.has(repositoryDomain)) {
|
|
221
|
-
return;
|
|
222
|
-
}
|
|
223
|
-
await docker.login(options.ecr);
|
|
224
|
-
this.loggedInDestinations.add(repositoryDomain);
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
exports.DockerFactory = DockerFactory;
|
|
229
|
-
function getDockerCmd() {
|
|
230
|
-
return process.env.CDK_DOCKER ?? 'docker';
|
|
231
|
-
}
|
|
232
|
-
function flatten(x) {
|
|
233
|
-
return Array.prototype.concat([], ...x);
|
|
234
|
-
}
|
|
235
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9ja2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZG9ja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlCQUF5QjtBQUN6Qix5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLDZEQUFrRjtBQUVsRixtQ0FBZ0M7QUFDaEMsaUNBQStDO0FBSS9DLDBDQUFrRTtBQW9DbEUsSUFBSyxxQkFHSjtBQUhELFdBQUsscUJBQXFCO0lBQ3hCLHFFQUFVLENBQUE7SUFDVix1RUFBWSxDQUFBO0FBQ2QsQ0FBQyxFQUhJLHFCQUFxQixLQUFyQixxQkFBcUIsUUFHekI7QUFPRCxNQUFhLE1BQU07SUFHakIsWUFDbUIsWUFBMEIsRUFDMUIsMkJBQXdEO1FBRHhELGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGdDQUEyQixHQUEzQiwyQkFBMkIsQ0FBNkI7UUFKbkUsY0FBUyxHQUF1QixTQUFTLENBQUM7SUFNbEQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFXO1FBQzdCLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFDbkMsMkJBQTJCLEVBQUUsUUFBUTthQUN0QyxDQUFDLENBQUM7WUFDSCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO1lBQ2hCLE1BQU0sS0FBSyxHQUF1QixDQUFDLENBQUM7WUFFcEM7OztlQUdHO1lBQ0gsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sS0FBSyxDQUFDO1lBQ2QsQ0FBQztZQUVEOzs7O2VBSUc7WUFDSCxRQUFRLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDdkIsS0FBSyxxQkFBcUIsQ0FBQyxNQUFNLENBQUM7Z0JBQ2xDLEtBQUsscUJBQXFCLENBQUMsTUFBTTtvQkFDL0IseUZBQXlGO29CQUN6Rix1REFBdUQ7b0JBQ3ZELE9BQU8sS0FBSyxDQUFDO2dCQUNmO29CQUNFLGtFQUFrRTtvQkFDbEUsTUFBTSxLQUFLLENBQUM7WUFDaEIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFxQjtRQUN0QyxNQUFNLFlBQVksR0FBRztZQUNuQixPQUFPO1lBQ1AsR0FBRyxPQUFPLENBQ1IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQ3RGO1lBQ0QsR0FBRyxPQUFPLENBQ1IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQ3pGO1lBQ0QsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3hELE9BQU87WUFDUCxPQUFPLENBQUMsR0FBRztZQUNYLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN2RCxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDakQsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2xFLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM3RCxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNuRixHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVM7Z0JBQ25CLENBQUMsQ0FBQztvQkFDQSxHQUFHLE9BQU8sQ0FBQyxTQUFTO3lCQUNqQixHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO3lCQUN2RSxJQUFJLEVBQUU7aUJBQ1Y7Z0JBQ0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNQLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNuRixHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2hELEdBQUc7U0FDSixDQUFDO1FBQ0YsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTtZQUMvQixHQUFHLEVBQUUsT0FBTyxDQUFDLFNBQVM7WUFDdEIsMkJBQTJCLEVBQUUsSUFBSSxDQUFDLDJCQUEyQjtZQUM3RCxHQUFHLEVBQUU7Z0JBQ0gsOEJBQThCLEVBQUUsR0FBRyxFQUFFLCtFQUErRTthQUNySDtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBZTtRQUNoQyxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUEseUNBQW9CLEVBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUV2RSwrREFBK0Q7UUFDL0QsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUNoQixDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDLFFBQVEsRUFBRSxrQkFBa0IsRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUN4SDtZQUNFLEtBQUssRUFBRSxXQUFXLENBQUMsUUFBUTtZQUUzQixnREFBZ0Q7WUFDaEQsc0RBQXNEO1lBQ3RELDRDQUE0QztZQUM1QywyQkFBMkIsRUFBRSxRQUFRO1NBQ3RDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTSxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQWlCLEVBQUUsU0FBaUI7UUFDbkQsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFTSxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQW9CO1FBQ3BDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDeEMsMkJBQTJCLEVBQUUsSUFBSSxDQUFDLDJCQUEyQjtTQUM5RCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSSx1QkFBdUI7UUFDNUIsTUFBTSxNQUFNLEdBQUcsSUFBQSx5Q0FBb0IsR0FBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7UUFFM0UsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN0RCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBMkIsRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUN6RSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsbURBQW1EO1lBQy9FLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ1AsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUU7WUFDMUYsUUFBUSxFQUFFLE9BQU87U0FDbEIsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxnQkFBZ0I7UUFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVPLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBYyxFQUFFLFVBQXFELEVBQUU7UUFDM0YsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFdEUsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVuRSxNQUFNLG1CQUFtQixHQUFHLElBQUEsOENBQW1DLEVBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ25GLElBQUksQ0FBQztZQUNILE1BQU0sSUFBQSxhQUFLLEVBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxHQUFHLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFO2dCQUNwRCxHQUFHLE9BQU87Z0JBQ1YsbUJBQW1CLEVBQUUsbUJBQW1CO2dCQUN4QyxHQUFHLEVBQUU7b0JBQ0gsR0FBRyxPQUFPLENBQUMsR0FBRztvQkFDZCxHQUFHLE9BQU8sQ0FBQyxHQUFHO29CQUNkLElBQUksRUFBRSxHQUFHLGVBQWUsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFO2lCQUNwRjthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxJQUFJLEtBQUssQ0FDYiwrQkFBK0IsWUFBWSxFQUFFLGtFQUFrRSxZQUFZLEVBQUUscUhBQXFILENBQ25QLENBQUM7WUFDSixDQUFDO1lBQ0QsTUFBTSxDQUFDLENBQUM7UUFDVixDQUFDO0lBQ0gsQ0FBQztJQUVPLGlCQUFpQixDQUFDLE1BQXlCO1FBQ2pELElBQUksSUFBSSxHQUFHLFFBQVEsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pDLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLElBQUk7Z0JBQ0YsR0FBRztvQkFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7eUJBQzFCLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQzt5QkFDNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRjtBQTlMRCx3QkE4TEM7QUFTRDs7O0dBR0c7QUFDSCxNQUFhLGFBQWE7SUFBMUI7UUFDVSw2Q0FBd0MsR0FBRyxJQUFBLDRCQUFxQixHQUFFLENBQUM7UUFDbkUseUJBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQTZDbkQsQ0FBQztJQTNDQzs7T0FFRztJQUNJLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBNkI7UUFDakQsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUVyRix3R0FBd0c7UUFDeEcsOERBQThEO1FBQzlELHVGQUF1RjtRQUN2RixvR0FBb0c7UUFDcEcsNEZBQTRGO1FBQzVGLElBQUksOEJBQThCLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDdEUsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7WUFDcEMsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQTZCO1FBQ25ELE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDckYsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3BELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxLQUFLLENBQUMsdUJBQXVCLENBQUMsTUFBYyxFQUFFLE9BQTZCO1FBQ2pGLHFFQUFxRTtRQUNyRSx3REFBd0Q7UUFDeEQsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV2RCx1REFBdUQ7UUFDdkQsTUFBTSxJQUFJLENBQUMsd0NBQXdDLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDN0QsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztnQkFDcEQsT0FBTztZQUNULENBQUM7WUFFRCxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQS9DRCxzQ0ErQ0M7QUFFRCxTQUFTLFlBQVk7SUFDbkIsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxRQUFRLENBQUM7QUFDNUMsQ0FBQztBQUVELFNBQVMsT0FBTyxDQUFDLENBQWE7SUFDNUIsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGNka0NyZWRlbnRpYWxzQ29uZmlnLCBvYnRhaW5FY3JDcmVkZW50aWFscyB9IGZyb20gJy4vZG9ja2VyLWNyZWRlbnRpYWxzJztcbmltcG9ydCB0eXBlIHsgU2hlbGxPcHRpb25zLCBQcm9jZXNzRmFpbGVkRXJyb3IgfSBmcm9tICcuL3NoZWxsJztcbmltcG9ydCB7IHNoZWxsIH0gZnJvbSAnLi9zaGVsbCc7XG5pbXBvcnQgeyBjcmVhdGVDcml0aWNhbFNlY3Rpb24gfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHR5cGUgeyBJRUNSQ2xpZW50IH0gZnJvbSAnLi4vYXdzJztcbmltcG9ydCB0eXBlIHsgU3VicHJvY2Vzc091dHB1dERlc3RpbmF0aW9uIH0gZnJvbSAnLi9hc3NldC1oYW5kbGVyJztcbmltcG9ydCB0eXBlIHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vcHJvZ3Jlc3MnO1xuaW1wb3J0IHsgc2hlbGxFdmVudFB1Ymxpc2hlckZyb21FdmVudEVtaXR0ZXIgfSBmcm9tICcuLi9wcm9ncmVzcyc7XG5cbmludGVyZmFjZSBCdWlsZE9wdGlvbnMge1xuICByZWFkb25seSBkaXJlY3Rvcnk6IHN0cmluZztcblxuICAvKipcbiAgICogVGFnIHRoZSBpbWFnZSB3aXRoIGEgZ2l2ZW4gcmVwb05hbWU6dGFnIGNvbWJpbmF0aW9uXG4gICAqL1xuICByZWFkb25seSB0YWc6IHN0cmluZztcbiAgcmVhZG9ubHkgdGFyZ2V0Pzogc3RyaW5nO1xuICByZWFkb25seSBmaWxlPzogc3RyaW5nO1xuICByZWFkb25seSBidWlsZEFyZ3M/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICByZWFkb25seSBidWlsZFNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICByZWFkb25seSBidWlsZFNzaD86IHN0cmluZztcbiAgcmVhZG9ubHkgbmV0d29ya01vZGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsYXRmb3JtPzogc3RyaW5nO1xuICByZWFkb25seSBvdXRwdXRzPzogc3RyaW5nW107XG4gIHJlYWRvbmx5IGNhY2hlRnJvbT86IERvY2tlckNhY2hlT3B0aW9uW107XG4gIHJlYWRvbmx5IGNhY2hlVG8/OiBEb2NrZXJDYWNoZU9wdGlvbjtcbiAgcmVhZG9ubHkgY2FjaGVEaXNhYmxlZD86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBQdXNoT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHRhZzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERvY2tlckNyZWRlbnRpYWxzQ29uZmlnIHtcbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuICByZWFkb25seSBkb21haW5DcmVkZW50aWFsczogUmVjb3JkPHN0cmluZywgRG9ja2VyRG9tYWluQ3JlZGVudGlhbHM+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERvY2tlckRvbWFpbkNyZWRlbnRpYWxzIHtcbiAgcmVhZG9ubHkgc2VjcmV0c01hbmFnZXJTZWNyZXRJZD86IHN0cmluZztcbiAgcmVhZG9ubHkgZWNyUmVwb3NpdG9yeT86IHN0cmluZztcbn1cblxuZW51bSBJbnNwZWN0SW1hZ2VFcnJvckNvZGUge1xuICBEb2NrZXIgPSAxLFxuICBQb2RtYW4gPSAxMjUsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG9ja2VyQ2FjaGVPcHRpb24ge1xuICByZWFkb25seSB0eXBlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBhcmFtcz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbmV4cG9ydCBjbGFzcyBEb2NrZXIge1xuICBwcml2YXRlIGNvbmZpZ0Rpcjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdWJwcm9jZXNzT3V0cHV0RGVzdGluYXRpb246IFN1YnByb2Nlc3NPdXRwdXREZXN0aW5hdGlvbixcbiAgKSB7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBhbiBpbWFnZSB3aXRoIHRoZSBnaXZlbiB0YWcgZXhpc3RzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZXhpc3RzKHRhZzogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZShbJ2luc3BlY3QnLCB0YWddLCB7XG4gICAgICAgIHN1YnByb2Nlc3NPdXRwdXREZXN0aW5hdGlvbjogJ2lnbm9yZScsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgY29uc3QgZXJyb3I6IFByb2Nlc3NGYWlsZWRFcnJvciA9IGU7XG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIG9ubHkgZXJyb3Igd2UgZXhwZWN0IHRvIGJlIHRocm93biB3aWxsIGhhdmUgdGhpcyBwcm9wZXJ0eSBhbmQgdmFsdWUuXG4gICAgICAgKiBJZiBpdCBkb2Vzbid0LCBpdCdzIHVucmVjb2duaXplZCBzbyByZS10aHJvdyBpdC5cbiAgICAgICAqL1xuICAgICAgaWYgKGVycm9yLmNvZGUgIT09ICdQUk9DRVNTX0ZBSUxFRCcpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogSWYgd2Uga25vdyB0aGUgc2hlbGwgY29tbWFuZCBhYm92ZSByZXR1cm5lZCBhbiBlcnJvciwgY2hlY2sgdG8gc2VlXG4gICAgICAgKiBpZiB0aGUgZXhpdCBjb2RlIGlzIG9uZSB3ZSBrbm93IHRvIGFjdHVhbGx5IG1lYW4gdGhhdCB0aGUgaW1hZ2UgZG9lc24ndFxuICAgICAgICogZXhpc3QuXG4gICAgICAgKi9cbiAgICAgIHN3aXRjaCAoZXJyb3IuZXhpdENvZGUpIHtcbiAgICAgICAgY2FzZSBJbnNwZWN0SW1hZ2VFcnJvckNvZGUuRG9ja2VyOlxuICAgICAgICBjYXNlIEluc3BlY3RJbWFnZUVycm9yQ29kZS5Qb2RtYW46XG4gICAgICAgICAgLy8gRG9ja2VyIGFuZCBQb2RtYW4gd2lsbCByZXR1cm4gdGhpcyBleGl0IGNvZGUgd2hlbiBhbiBpbWFnZSBkb2Vzbid0IGV4aXN0LCByZXR1cm4gZmFsc2VcbiAgICAgICAgICAvLyBjb250ZXh0OiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzLzE2MjA5XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIFRoaXMgaXMgYW4gZXJyb3IgYnV0IGl0J3Mgbm90IGFuIGV4aXQgY29kZSB3ZSByZWNvZ25pemUsIHRocm93LlxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBidWlsZChvcHRpb25zOiBCdWlsZE9wdGlvbnMpIHtcbiAgICBjb25zdCBidWlsZENvbW1hbmQgPSBbXG4gICAgICAnYnVpbGQnLFxuICAgICAgLi4uZmxhdHRlbihcbiAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0aW9ucy5idWlsZEFyZ3MgfHwge30pLm1hcCgoW2ssIHZdKSA9PiBbJy0tYnVpbGQtYXJnJywgYCR7a309JHt2fWBdKSxcbiAgICAgICksXG4gICAgICAuLi5mbGF0dGVuKFxuICAgICAgICBPYmplY3QuZW50cmllcyhvcHRpb25zLmJ1aWxkU2VjcmV0cyB8fCB7fSkubWFwKChbaywgdl0pID0+IFsnLS1zZWNyZXQnLCBgaWQ9JHtrfSwke3Z9YF0pLFxuICAgICAgKSxcbiAgICAgIC4uLihvcHRpb25zLmJ1aWxkU3NoID8gWyctLXNzaCcsIG9wdGlvbnMuYnVpbGRTc2hdIDogW10pLFxuICAgICAgJy0tdGFnJyxcbiAgICAgIG9wdGlvbnMudGFnLFxuICAgICAgLi4uKG9wdGlvbnMudGFyZ2V0ID8gWyctLXRhcmdldCcsIG9wdGlvbnMudGFyZ2V0XSA6IFtdKSxcbiAgICAgIC4uLihvcHRpb25zLmZpbGUgPyBbJy0tZmlsZScsIG9wdGlvbnMuZmlsZV0gOiBbXSksXG4gICAgICAuLi4ob3B0aW9ucy5uZXR3b3JrTW9kZSA/IFsnLS1uZXR3b3JrJywgb3B0aW9ucy5uZXR3b3JrTW9kZV0gOiBbXSksXG4gICAgICAuLi4ob3B0aW9ucy5wbGF0Zm9ybSA/IFsnLS1wbGF0Zm9ybScsIG9wdGlvbnMucGxhdGZvcm1dIDogW10pLFxuICAgICAgLi4uKG9wdGlvbnMub3V0cHV0cyA/IG9wdGlvbnMub3V0cHV0cy5tYXAoKG91dHB1dCkgPT4gW2AtLW91dHB1dD0ke291dHB1dH1gXSkgOiBbXSksXG4gICAgICAuLi4ob3B0aW9ucy5jYWNoZUZyb21cbiAgICAgICAgPyBbXG4gICAgICAgICAgLi4ub3B0aW9ucy5jYWNoZUZyb21cbiAgICAgICAgICAgIC5tYXAoKGNhY2hlRnJvbSkgPT4gWyctLWNhY2hlLWZyb20nLCB0aGlzLmNhY2hlT3B0aW9uVG9GbGFnKGNhY2hlRnJvbSldKVxuICAgICAgICAgICAgLmZsYXQoKSxcbiAgICAgICAgXVxuICAgICAgICA6IFtdKSxcbiAgICAgIC4uLihvcHRpb25zLmNhY2hlVG8gPyBbJy0tY2FjaGUtdG8nLCB0aGlzLmNhY2hlT3B0aW9uVG9GbGFnKG9wdGlvbnMuY2FjaGVUbyldIDogW10pLFxuICAgICAgLi4uKG9wdGlvbnMuY2FjaGVEaXNhYmxlZCA/IFsnLS1uby1jYWNoZSddIDogW10pLFxuICAgICAgJy4nLFxuICAgIF07XG4gICAgYXdhaXQgdGhpcy5leGVjdXRlKGJ1aWxkQ29tbWFuZCwge1xuICAgICAgY3dkOiBvcHRpb25zLmRpcmVjdG9yeSxcbiAgICAgIHN1YnByb2Nlc3NPdXRwdXREZXN0aW5hdGlvbjogdGhpcy5zdWJwcm9jZXNzT3V0cHV0RGVzdGluYXRpb24sXG4gICAgICBlbnY6IHtcbiAgICAgICAgQlVJTERYX05PX0RFRkFVTFRfQVRURVNUQVRJT05TOiAnMScsIC8vIERvY2tlciBCdWlsZCBhZGRzIHByb3ZlbmFuY2UgYXR0ZXN0YXRpb25zIGJ5IGRlZmF1bHQgdGhhdCBjb25mdXNlIGNkay1hc3NldHNcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNyZWRlbnRpYWxzIGZyb20gRUNSIGFuZCBydW4gZG9ja2VyIGxvZ2luXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbG9naW4oZWNyOiBJRUNSQ2xpZW50KSB7XG4gICAgY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCBvYnRhaW5FY3JDcmVkZW50aWFscyhlY3IsIHRoaXMuZXZlbnRFbWl0dGVyKTtcblxuICAgIC8vIFVzZSAtLXBhc3N3b3JkLXN0ZGluIG90aGVyd2lzZSBkb2NrZXIgd2lsbCBjb21wbGFpbi4gTG91ZGx5LlxuICAgIGF3YWl0IHRoaXMuZXhlY3V0ZShcbiAgICAgIFsnbG9naW4nLCAnLS11c2VybmFtZScsIGNyZWRlbnRpYWxzLnVzZXJuYW1lLCAnLS1wYXNzd29yZC1zdGRpbicsIGNyZWRlbnRpYWxzLmVuZHBvaW50LnJlcGxhY2UoL15odHRwcz86XFwvXFwvfFxcLyQvZywgJycpXSxcbiAgICAgIHtcbiAgICAgICAgaW5wdXQ6IGNyZWRlbnRpYWxzLnBhc3N3b3JkLFxuXG4gICAgICAgIC8vIE5lZWQgdG8gaWdub3JlIG90aGVyd2lzZSBEb2NrZXIgd2lsbCBjb21wbGFpblxuICAgICAgICAvLyAnV0FSTklORyEgWW91ciBwYXNzd29yZCB3aWxsIGJlIHN0b3JlZCB1bmVuY3J5cHRlZCdcbiAgICAgICAgLy8gZG9lc24ndCByZWFsbHkgbWF0dGVyIHNpbmNlIGl0J3MgYSB0b2tlbi5cbiAgICAgICAgc3VicHJvY2Vzc091dHB1dERlc3RpbmF0aW9uOiAnaWdub3JlJyxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB0YWcoc291cmNlVGFnOiBzdHJpbmcsIHRhcmdldFRhZzogc3RyaW5nKSB7XG4gICAgYXdhaXQgdGhpcy5leGVjdXRlKFsndGFnJywgc291cmNlVGFnLCB0YXJnZXRUYWddKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBwdXNoKG9wdGlvbnM6IFB1c2hPcHRpb25zKSB7XG4gICAgYXdhaXQgdGhpcy5leGVjdXRlKFsncHVzaCcsIG9wdGlvbnMudGFnXSwge1xuICAgICAgc3VicHJvY2Vzc091dHB1dERlc3RpbmF0aW9uOiB0aGlzLnN1YnByb2Nlc3NPdXRwdXREZXN0aW5hdGlvbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBhIENESyBEb2NrZXIgQ3JlZGVudGlhbHMgZmlsZSBleGlzdHMsIGNyZWF0ZXMgYSBuZXcgRG9ja2VyIGNvbmZpZyBkaXJlY3RvcnkuXG4gICAqIFNldHMgdXAgYGRvY2tlci1jcmVkZW50aWFsLWNkay1hc3NldHNgIHRvIGJlIHRoZSBjcmVkZW50aWFsIGhlbHBlciBmb3IgZWFjaCBkb21haW4gaW4gdGhlIENESyBjb25maWcuXG4gICAqIEFsbCBmdXR1cmUgY29tbWFuZHMgKGUuZy4sIGBidWlsZGAsIGBwdXNoYCkgd2lsbCB1c2UgdGhpcyBjb25maWcuXG4gICAqXG4gICAqIFNlZSBodHRwczovL2RvY3MuZG9ja2VyLmNvbS9lbmdpbmUvcmVmZXJlbmNlL2NvbW1hbmRsaW5lL2xvZ2luLyNjcmVkZW50aWFsLWhlbHBlcnMgZm9yIG1vcmUgZGV0YWlscyBvbiBjcmVkIGhlbHBlcnMuXG4gICAqXG4gICAqIEByZXR1cm5zIHRydWUgaWYgQ0RLIGNvbmZpZyB3YXMgZm91bmQgYW5kIGNvbmZpZ3VyZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgcHVibGljIGNvbmZpZ3VyZUNka0NyZWRlbnRpYWxzKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGNka0NyZWRlbnRpYWxzQ29uZmlnKCk7XG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbmZpZ0RpciA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ2Nka0RvY2tlckNvbmZpZycpKTtcblxuICAgIGNvbnN0IGRvbWFpbnMgPSBPYmplY3Qua2V5cyhjb25maWcuZG9tYWluQ3JlZGVudGlhbHMpO1xuICAgIGNvbnN0IGNyZWRIZWxwZXJzID0gZG9tYWlucy5yZWR1Y2UoKG1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgZG9tYWluKSA9PiB7XG4gICAgICBtYXBbZG9tYWluXSA9ICdjZGstYXNzZXRzJzsgLy8gVXNlIGRvY2tlci1jcmVkZW50aWFsLWNkay1hc3NldHMgZm9yIHRoaXMgZG9tYWluXG4gICAgICByZXR1cm4gbWFwO1xuICAgIH0sIHt9KTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbih0aGlzLmNvbmZpZ0RpciwgJ2NvbmZpZy5qc29uJyksIEpTT04uc3RyaW5naWZ5KHsgY3JlZEhlbHBlcnMgfSksIHtcbiAgICAgIGVuY29kaW5nOiAndXRmLTgnLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbnkgY29uZmlndXJlZCBEb2NrZXIgY29uZmlnIGRpcmVjdG9yeS5cbiAgICogQWxsIGZ1dHVyZSBjb21tYW5kcyAoZS5nLiwgYGJ1aWxkYCwgYHB1c2hgKSB3aWxsIHVzZSB0aGUgZGVmYXVsdCBjb25maWcuXG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZnVsIGFmdGVyIGNhbGxpbmcgYGNvbmZpZ3VyZUNka0NyZWRlbnRpYWxzYCB0byByZXNldCB0byBkZWZhdWx0IGNyZWRlbnRpYWxzLlxuICAgKi9cbiAgcHVibGljIHJlc2V0QXV0aFBsdWdpbnMoKSB7XG4gICAgdGhpcy5jb25maWdEaXIgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGUoYXJnczogc3RyaW5nW10sIG9wdGlvbnM6IE9taXQ8U2hlbGxPcHRpb25zLCAnc2hlbGxFdmVudFB1Ymxpc2hlcic+ID0ge30pIHtcbiAgICBjb25zdCBjb25maWdBcmdzID0gdGhpcy5jb25maWdEaXIgPyBbJy0tY29uZmlnJywgdGhpcy5jb25maWdEaXJdIDogW107XG5cbiAgICBjb25zdCBwYXRoVG9DZGtBc3NldHMgPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAnYmluJyk7XG5cbiAgICBjb25zdCBzaGVsbEV2ZW50UHVibGlzaGVyID0gc2hlbGxFdmVudFB1Ymxpc2hlckZyb21FdmVudEVtaXR0ZXIodGhpcy5ldmVudEVtaXR0ZXIpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzaGVsbChbZ2V0RG9ja2VyQ21kKCksIC4uLmNvbmZpZ0FyZ3MsIC4uLmFyZ3NdLCB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIHNoZWxsRXZlbnRQdWJsaXNoZXI6IHNoZWxsRXZlbnRQdWJsaXNoZXIsXG4gICAgICAgIGVudjoge1xuICAgICAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgICAgIC4uLm9wdGlvbnMuZW52LFxuICAgICAgICAgIFBBVEg6IGAke3BhdGhUb0Nka0Fzc2V0c30ke3BhdGguZGVsaW1pdGVyfSR7b3B0aW9ucy5lbnY/LlBBVEggPz8gcHJvY2Vzcy5lbnYuUEFUSH1gLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBpZiAoZS5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBmaW5kIGFuZCBleGVjdXRlICcke2dldERvY2tlckNtZCgpfScgd2hpbGUgYXR0ZW1wdGluZyB0byBidWlsZCBhIGNvbnRhaW5lciBhc3NldC4gUGxlYXNlIGluc3RhbGwgJyR7Z2V0RG9ja2VyQ21kKCl9JyBhbmQgdHJ5IGFnYWluLiAoT3Igc2V0IHRoZSAnQ0RLX0RPQ0tFUiAnIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGNob29zZSBhIGRpZmZlcmVudCBjb21wYXRpYmxlIGNvbnRhaW5lciBjbGllbnQuKWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2FjaGVPcHRpb25Ub0ZsYWcob3B0aW9uOiBEb2NrZXJDYWNoZU9wdGlvbik6IHN0cmluZyB7XG4gICAgbGV0IGZsYWcgPSBgdHlwZT0ke29wdGlvbi50eXBlfWA7XG4gICAgaWYgKG9wdGlvbi5wYXJhbXMpIHtcbiAgICAgIGZsYWcgKz1cbiAgICAgICAgJywnICtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0aW9uLnBhcmFtcylcbiAgICAgICAgICAubWFwKChbaywgdl0pID0+IGAke2t9PSR7dn1gKVxuICAgICAgICAgIC5qb2luKCcsJyk7XG4gICAgfVxuICAgIHJldHVybiBmbGFnO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG9ja2VyRmFjdG9yeU9wdGlvbnMge1xuICByZWFkb25seSByZXBvVXJpOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVjcjogSUVDUkNsaWVudDtcbiAgcmVhZG9ubHkgZXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXI7XG4gIHJlYWRvbmx5IHN1YnByb2Nlc3NPdXRwdXREZXN0aW5hdGlvbjogU3VicHJvY2Vzc091dHB1dERlc3RpbmF0aW9uO1xufVxuXG4vKipcbiAqIEhlbHBzIGdldCBhcHByb3ByaWF0ZWx5IGNvbmZpZ3VyZWQgRG9ja2VyIGluc3RhbmNlcyBkdXJpbmcgdGhlIGNvbnRhaW5lclxuICogaW1hZ2UgcHVibGlzaGluZyBwcm9jZXNzLlxuICovXG5leHBvcnQgY2xhc3MgRG9ja2VyRmFjdG9yeSB7XG4gIHByaXZhdGUgZW50ZXJMb2dnZWRJbkRlc3RpbmF0aW9uc0NyaXRpY2FsU2VjdGlvbiA9IGNyZWF0ZUNyaXRpY2FsU2VjdGlvbigpO1xuICBwcml2YXRlIGxvZ2dlZEluRGVzdGluYXRpb25zID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIEdldHMgYSBEb2NrZXIgaW5zdGFuY2UgZm9yIGJ1aWxkaW5nIGltYWdlcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBmb3JCdWlsZChvcHRpb25zOiBEb2NrZXJGYWN0b3J5T3B0aW9ucyk6IFByb21pc2U8RG9ja2VyPiB7XG4gICAgY29uc3QgZG9ja2VyID0gbmV3IERvY2tlcihvcHRpb25zLmV2ZW50RW1pdHRlciwgb3B0aW9ucy5zdWJwcm9jZXNzT3V0cHV0RGVzdGluYXRpb24pO1xuXG4gICAgLy8gRGVmYXVsdCBiZWhhdmlvciBpcyB0byBsb2dpbiBiZWZvcmUgYnVpbGQgc28gdGhhdCB0aGUgRG9ja2VyZmlsZSBjYW4gcmVmZXJlbmNlIGltYWdlcyBpbiB0aGUgRUNSIHJlcG9cbiAgICAvLyBIb3dldmVyLCBpZiB3ZSdyZSBpbiBhIHBpcGVsaW5lcyBlbnZpcm9ubWVudCAoZm9yIGV4YW1wbGUpLFxuICAgIC8vIHdlIG1heSBoYXZlIGFsdGVybmF0aXZlIGNyZWRlbnRpYWxzIHRvIHRoZSBkZWZhdWx0IG9uZXMgdG8gdXNlIGZvciB0aGUgYnVpbGQgaXRzZWxmLlxuICAgIC8vIElmIHRoZSBzcGVjaWFsIGNvbmZpZyBmaWxlIGlzIHByZXNlbnQsIGRlbGF5IHRoZSBsb2dpbiB0byB0aGUgZGVmYXVsdCBjcmVkZW50aWFscyB1bnRpbCB0aGUgcHVzaC5cbiAgICAvLyBJZiB0aGUgY29uZmlnIGZpbGUgaXMgcHJlc2VudCwgd2Ugd2lsbCBjb25maWd1cmUgYW5kIHVzZSB0aG9zZSBjcmVkZW50aWFscyBmb3IgdGhlIGJ1aWxkLlxuICAgIGxldCBjZGtEb2NrZXJDcmVkZW50aWFsc0NvbmZpZ3VyZWQgPSBkb2NrZXIuY29uZmlndXJlQ2RrQ3JlZGVudGlhbHMoKTtcbiAgICBpZiAoIWNka0RvY2tlckNyZWRlbnRpYWxzQ29uZmlndXJlZCkge1xuICAgICAgYXdhaXQgdGhpcy5sb2dpbk9uY2VQZXJEZXN0aW5hdGlvbihkb2NrZXIsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiBkb2NrZXI7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIERvY2tlciBpbnN0YW5jZSBmb3IgcHVzaGluZyBpbWFnZXMgdG8gRUNSLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZvckVjclB1c2gob3B0aW9uczogRG9ja2VyRmFjdG9yeU9wdGlvbnMpIHtcbiAgICBjb25zdCBkb2NrZXIgPSBuZXcgRG9ja2VyKG9wdGlvbnMuZXZlbnRFbWl0dGVyLCBvcHRpb25zLnN1YnByb2Nlc3NPdXRwdXREZXN0aW5hdGlvbik7XG4gICAgYXdhaXQgdGhpcy5sb2dpbk9uY2VQZXJEZXN0aW5hdGlvbihkb2NrZXIsIG9wdGlvbnMpO1xuICAgIHJldHVybiBkb2NrZXI7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvZ2luT25jZVBlckRlc3RpbmF0aW9uKGRvY2tlcjogRG9ja2VyLCBvcHRpb25zOiBEb2NrZXJGYWN0b3J5T3B0aW9ucykge1xuICAgIC8vIENoYW5nZXM6IDAxMjM0NTY3ODkxMC5ka3IuZWNyLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tL3RhZ2dpbmctdGVzdFxuICAgIC8vIFRvIHRoaXM6IDAxMjM0NTY3ODkxMC5ka3IuZWNyLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tXG4gICAgY29uc3QgcmVwb3NpdG9yeURvbWFpbiA9IG9wdGlvbnMucmVwb1VyaS5zcGxpdCgnLycpWzBdO1xuXG4gICAgLy8gRW5zdXJlIG9uZS1hdC1hLXRpbWUgYWNjZXNzIHRvIGxvZ2dlZEluRGVzdGluYXRpb25zLlxuICAgIGF3YWl0IHRoaXMuZW50ZXJMb2dnZWRJbkRlc3RpbmF0aW9uc0NyaXRpY2FsU2VjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5sb2dnZWRJbkRlc3RpbmF0aW9ucy5oYXMocmVwb3NpdG9yeURvbWFpbikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBkb2NrZXIubG9naW4ob3B0aW9ucy5lY3IpO1xuICAgICAgdGhpcy5sb2dnZWRJbkRlc3RpbmF0aW9ucy5hZGQocmVwb3NpdG9yeURvbWFpbik7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RG9ja2VyQ21kKCk6IHN0cmluZyB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5DREtfRE9DS0VSID8/ICdkb2NrZXInO1xufVxuXG5mdW5jdGlvbiBmbGF0dGVuKHg6IHN0cmluZ1tdW10pIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQoW10sIC4uLngpO1xufVxuIl19
|
package/lib/private/fs-extra.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.pathExists = pathExists;
|
|
4
|
-
exports.emptyDirSync = emptyDirSync;
|
|
5
|
-
exports.rmRfSync = rmRfSync;
|
|
6
|
-
const fs = require("fs");
|
|
7
|
-
const path = require("path");
|
|
8
|
-
const pfs = fs.promises;
|
|
9
|
-
async function pathExists(pathName) {
|
|
10
|
-
try {
|
|
11
|
-
await pfs.stat(pathName);
|
|
12
|
-
return true;
|
|
13
|
-
}
|
|
14
|
-
catch (e) {
|
|
15
|
-
if (e.code !== 'ENOENT') {
|
|
16
|
-
throw e;
|
|
17
|
-
}
|
|
18
|
-
return false;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
function emptyDirSync(dir) {
|
|
22
|
-
fs.readdirSync(dir, { withFileTypes: true }).forEach((dirent) => {
|
|
23
|
-
const fullPath = path.join(dir, dirent.name);
|
|
24
|
-
if (dirent.isDirectory()) {
|
|
25
|
-
emptyDirSync(fullPath);
|
|
26
|
-
fs.rmdirSync(fullPath);
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
fs.unlinkSync(fullPath);
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
function rmRfSync(dir) {
|
|
34
|
-
emptyDirSync(dir);
|
|
35
|
-
fs.rmdirSync(dir);
|
|
36
|
-
}
|
|
37
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMtZXh0cmEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmcy1leHRyYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUtBLGdDQVVDO0FBRUQsb0NBVUM7QUFFRCw0QkFHQztBQWhDRCx5QkFBeUI7QUFDekIsNkJBQTZCO0FBRTdCLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUM7QUFFakIsS0FBSyxVQUFVLFVBQVUsQ0FBQyxRQUFnQjtJQUMvQyxJQUFJLENBQUM7UUFDSCxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDeEIsTUFBTSxDQUFDLENBQUM7UUFDVixDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQWdCLFlBQVksQ0FBQyxHQUFXO0lBQ3RDLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDOUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDekIsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZCLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekIsQ0FBQzthQUFNLENBQUM7WUFDTixFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFnQixRQUFRLENBQUMsR0FBVztJQUNsQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuY29uc3QgcGZzID0gZnMucHJvbWlzZXM7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYXRoRXhpc3RzKHBhdGhOYW1lOiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBwZnMuc3RhdChwYXRoTmFtZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIGlmIChlLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVtcHR5RGlyU3luYyhkaXI6IHN0cmluZykge1xuICBmcy5yZWFkZGlyU3luYyhkaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KS5mb3JFYWNoKChkaXJlbnQpID0+IHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXIsIGRpcmVudC5uYW1lKTtcbiAgICBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGVtcHR5RGlyU3luYyhmdWxsUGF0aCk7XG4gICAgICBmcy5ybWRpclN5bmMoZnVsbFBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmcy51bmxpbmtTeW5jKGZ1bGxQYXRoKTtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcm1SZlN5bmMoZGlyOiBzdHJpbmcpIHtcbiAgZW1wdHlEaXJTeW5jKGRpcik7XG4gIGZzLnJtZGlyU3luYyhkaXIpO1xufVxuIl19
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.destinationToClientOptions = destinationToClientOptions;
|
|
4
|
-
function destinationToClientOptions(destination) {
|
|
5
|
-
return {
|
|
6
|
-
assumeRoleArn: destination.assumeRoleArn,
|
|
7
|
-
assumeRoleExternalId: destination.assumeRoleExternalId,
|
|
8
|
-
assumeRoleAdditionalOptions: destination.assumeRoleAdditionalOptions,
|
|
9
|
-
region: destination.region,
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LW9wdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjbGllbnQtb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLGdFQU9DO0FBUEQsU0FBZ0IsMEJBQTBCLENBQUMsV0FBMkI7SUFDcEUsT0FBTztRQUNMLGFBQWEsRUFBRSxXQUFXLENBQUMsYUFBYTtRQUN4QyxvQkFBb0IsRUFBRSxXQUFXLENBQUMsb0JBQW9CO1FBQ3RELDJCQUEyQixFQUFFLFdBQVcsQ0FBQywyQkFBMkI7UUFDcEUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxNQUFNO0tBQzNCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBd3NEZXN0aW5hdGlvbiB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYSc7XG5pbXBvcnQgdHlwZSB7IENsaWVudE9wdGlvbnMgfSBmcm9tICcuLi8uLi9hd3MnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVzdGluYXRpb25Ub0NsaWVudE9wdGlvbnMoZGVzdGluYXRpb246IEF3c0Rlc3RpbmF0aW9uKTogQ2xpZW50T3B0aW9ucyB7XG4gIHJldHVybiB7XG4gICAgYXNzdW1lUm9sZUFybjogZGVzdGluYXRpb24uYXNzdW1lUm9sZUFybixcbiAgICBhc3N1bWVSb2xlRXh0ZXJuYWxJZDogZGVzdGluYXRpb24uYXNzdW1lUm9sZUV4dGVybmFsSWQsXG4gICAgYXNzdW1lUm9sZUFkZGl0aW9uYWxPcHRpb25zOiBkZXN0aW5hdGlvbi5hc3N1bWVSb2xlQWRkaXRpb25hbE9wdGlvbnMsXG4gICAgcmVnaW9uOiBkZXN0aW5hdGlvbi5yZWdpb24sXG4gIH07XG59XG4iXX0=
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { DockerImageManifestEntry } from '../../asset-manifest';
|
|
2
|
-
import type { IAssetHandler, IHandlerHost, IHandlerOptions } from '../asset-handler';
|
|
3
|
-
export declare class ContainerImageAssetHandler implements IAssetHandler {
|
|
4
|
-
private readonly workDir;
|
|
5
|
-
private readonly asset;
|
|
6
|
-
private readonly host;
|
|
7
|
-
private readonly options;
|
|
8
|
-
private init?;
|
|
9
|
-
constructor(workDir: string, asset: DockerImageManifestEntry, host: IHandlerHost, options: IHandlerOptions);
|
|
10
|
-
build(): Promise<void>;
|
|
11
|
-
isPublished(): Promise<boolean>;
|
|
12
|
-
publish(): Promise<void>;
|
|
13
|
-
private initOnce;
|
|
14
|
-
/**
|
|
15
|
-
* Check whether the image already exists in the ECR repo
|
|
16
|
-
*
|
|
17
|
-
* Use the fields from the destination to do the actual check. The imageUri
|
|
18
|
-
* should correspond to that, but is only used to print Docker image location
|
|
19
|
-
* for user benefit (the format is slightly different).
|
|
20
|
-
*/
|
|
21
|
-
private destinationAlreadyExists;
|
|
22
|
-
}
|
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ContainerImageAssetHandler = void 0;
|
|
4
|
-
const path = require("path");
|
|
5
|
-
const client_options_1 = require("./client-options");
|
|
6
|
-
const progress_1 = require("../../progress");
|
|
7
|
-
const placeholders_1 = require("../placeholders");
|
|
8
|
-
const shell_1 = require("../shell");
|
|
9
|
-
class ContainerImageAssetHandler {
|
|
10
|
-
constructor(workDir, asset, host, options) {
|
|
11
|
-
this.workDir = workDir;
|
|
12
|
-
this.asset = asset;
|
|
13
|
-
this.host = host;
|
|
14
|
-
this.options = options;
|
|
15
|
-
}
|
|
16
|
-
async build() {
|
|
17
|
-
const initOnce = await this.initOnce();
|
|
18
|
-
if (initOnce.destinationAlreadyExists) {
|
|
19
|
-
return;
|
|
20
|
-
}
|
|
21
|
-
if (this.host.aborted) {
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
const dockerForBuilding = await this.host.dockerFactory.forBuild({
|
|
25
|
-
repoUri: initOnce.repoUri,
|
|
26
|
-
eventEmitter: (m) => this.host.emitMessage(progress_1.EventType.DEBUG, m),
|
|
27
|
-
ecr: initOnce.ecr,
|
|
28
|
-
subprocessOutputDestination: this.options.subprocessOutputDestination,
|
|
29
|
-
});
|
|
30
|
-
const builder = new ContainerImageBuilder(dockerForBuilding, this.workDir, this.asset, this.host);
|
|
31
|
-
const localTagName = await builder.build();
|
|
32
|
-
if (localTagName === undefined || this.host.aborted) {
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
if (this.host.aborted) {
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
await dockerForBuilding.tag(localTagName, initOnce.imageUri);
|
|
39
|
-
}
|
|
40
|
-
async isPublished() {
|
|
41
|
-
try {
|
|
42
|
-
const initOnce = await this.initOnce({ quiet: true });
|
|
43
|
-
return initOnce.destinationAlreadyExists;
|
|
44
|
-
}
|
|
45
|
-
catch (e) {
|
|
46
|
-
this.host.emitMessage(progress_1.EventType.DEBUG, `${e.message}`);
|
|
47
|
-
}
|
|
48
|
-
return false;
|
|
49
|
-
}
|
|
50
|
-
async publish() {
|
|
51
|
-
const initOnce = await this.initOnce();
|
|
52
|
-
if (initOnce.destinationAlreadyExists) {
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
if (this.host.aborted) {
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
const dockerForPushing = await this.host.dockerFactory.forEcrPush({
|
|
59
|
-
repoUri: initOnce.repoUri,
|
|
60
|
-
eventEmitter: this.host.emitMessage,
|
|
61
|
-
ecr: initOnce.ecr,
|
|
62
|
-
subprocessOutputDestination: this.options.subprocessOutputDestination,
|
|
63
|
-
});
|
|
64
|
-
if (this.host.aborted) {
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
this.host.emitMessage(progress_1.EventType.UPLOAD, `Push ${initOnce.imageUri}`);
|
|
68
|
-
await dockerForPushing.push({
|
|
69
|
-
tag: initOnce.imageUri,
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
async initOnce(options = {}) {
|
|
73
|
-
if (this.init) {
|
|
74
|
-
return this.init;
|
|
75
|
-
}
|
|
76
|
-
const destination = await (0, placeholders_1.replaceAwsPlaceholders)(this.asset.destination, this.host.aws);
|
|
77
|
-
const ecr = await this.host.aws.ecrClient({
|
|
78
|
-
...(0, client_options_1.destinationToClientOptions)(destination),
|
|
79
|
-
quiet: options.quiet,
|
|
80
|
-
});
|
|
81
|
-
const account = async () => (await this.host.aws.discoverCurrentAccount())?.accountId;
|
|
82
|
-
const repoUri = await repositoryUri(ecr, destination.repositoryName);
|
|
83
|
-
if (!repoUri) {
|
|
84
|
-
throw new Error(`No ECR repository named '${destination.repositoryName}' in account ${await account()}. Is this account bootstrapped?`);
|
|
85
|
-
}
|
|
86
|
-
const imageUri = `${repoUri}:${destination.imageTag}`;
|
|
87
|
-
this.init = {
|
|
88
|
-
imageUri,
|
|
89
|
-
ecr,
|
|
90
|
-
repoUri,
|
|
91
|
-
destinationAlreadyExists: await this.destinationAlreadyExists(ecr, destination, imageUri),
|
|
92
|
-
};
|
|
93
|
-
return this.init;
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Check whether the image already exists in the ECR repo
|
|
97
|
-
*
|
|
98
|
-
* Use the fields from the destination to do the actual check. The imageUri
|
|
99
|
-
* should correspond to that, but is only used to print Docker image location
|
|
100
|
-
* for user benefit (the format is slightly different).
|
|
101
|
-
*/
|
|
102
|
-
async destinationAlreadyExists(ecr, destination, imageUri) {
|
|
103
|
-
this.host.emitMessage(progress_1.EventType.CHECK, `Check ${imageUri}`);
|
|
104
|
-
if (await imageExists(ecr, destination.repositoryName, destination.imageTag)) {
|
|
105
|
-
this.host.emitMessage(progress_1.EventType.FOUND, `Found ${imageUri}`);
|
|
106
|
-
return true;
|
|
107
|
-
}
|
|
108
|
-
return false;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
exports.ContainerImageAssetHandler = ContainerImageAssetHandler;
|
|
112
|
-
class ContainerImageBuilder {
|
|
113
|
-
constructor(docker, workDir, asset, host) {
|
|
114
|
-
this.docker = docker;
|
|
115
|
-
this.workDir = workDir;
|
|
116
|
-
this.asset = asset;
|
|
117
|
-
this.host = host;
|
|
118
|
-
}
|
|
119
|
-
async build() {
|
|
120
|
-
return this.asset.source.executable
|
|
121
|
-
? this.buildExternalAsset(this.asset.source.executable)
|
|
122
|
-
: this.buildDirectoryAsset();
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Build a (local) Docker asset from a directory with a Dockerfile
|
|
126
|
-
*
|
|
127
|
-
* Tags under a deterministic, unique, local identifier wich will skip
|
|
128
|
-
* the build if it already exists.
|
|
129
|
-
*/
|
|
130
|
-
async buildDirectoryAsset() {
|
|
131
|
-
const localTagName = `cdkasset-${this.asset.id.assetId.toLowerCase()}`;
|
|
132
|
-
if (!(await this.isImageCached(localTagName))) {
|
|
133
|
-
if (this.host.aborted) {
|
|
134
|
-
return undefined;
|
|
135
|
-
}
|
|
136
|
-
await this.buildImage(localTagName);
|
|
137
|
-
}
|
|
138
|
-
return localTagName;
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* Build a (local) Docker asset by running an external command
|
|
142
|
-
*
|
|
143
|
-
* External command is responsible for deduplicating the build if possible,
|
|
144
|
-
* and is expected to return the generated image identifier on stdout.
|
|
145
|
-
*/
|
|
146
|
-
async buildExternalAsset(executable, cwd) {
|
|
147
|
-
const assetPath = cwd ?? this.workDir;
|
|
148
|
-
this.host.emitMessage(progress_1.EventType.BUILD, `Building Docker image using command '${executable}'`);
|
|
149
|
-
if (this.host.aborted) {
|
|
150
|
-
return undefined;
|
|
151
|
-
}
|
|
152
|
-
const shellEventPublisher = (0, progress_1.shellEventPublisherFromEventEmitter)(this.host.emitMessage);
|
|
153
|
-
return (await (0, shell_1.shell)(executable, {
|
|
154
|
-
cwd: assetPath,
|
|
155
|
-
shellEventPublisher,
|
|
156
|
-
subprocessOutputDestination: 'ignore',
|
|
157
|
-
})).trim();
|
|
158
|
-
}
|
|
159
|
-
async buildImage(localTagName) {
|
|
160
|
-
const source = this.asset.source;
|
|
161
|
-
if (!source.directory) {
|
|
162
|
-
throw new Error(`'directory' is expected in the DockerImage asset source, got: ${JSON.stringify(source)}`);
|
|
163
|
-
}
|
|
164
|
-
const fullPath = path.resolve(this.workDir, source.directory);
|
|
165
|
-
this.host.emitMessage(progress_1.EventType.BUILD, `Building Docker image at ${fullPath}`);
|
|
166
|
-
await this.docker.build({
|
|
167
|
-
directory: fullPath,
|
|
168
|
-
tag: localTagName,
|
|
169
|
-
buildArgs: source.dockerBuildArgs,
|
|
170
|
-
buildSecrets: source.dockerBuildSecrets,
|
|
171
|
-
buildSsh: source.dockerBuildSsh,
|
|
172
|
-
target: source.dockerBuildTarget,
|
|
173
|
-
file: source.dockerFile,
|
|
174
|
-
networkMode: source.networkMode,
|
|
175
|
-
platform: source.platform,
|
|
176
|
-
outputs: source.dockerOutputs,
|
|
177
|
-
cacheFrom: source.cacheFrom,
|
|
178
|
-
cacheTo: source.cacheTo,
|
|
179
|
-
cacheDisabled: source.cacheDisabled,
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
async isImageCached(localTagName) {
|
|
183
|
-
if (await this.docker.exists(localTagName)) {
|
|
184
|
-
this.host.emitMessage(progress_1.EventType.CACHED, `Cached ${localTagName}`);
|
|
185
|
-
return true;
|
|
186
|
-
}
|
|
187
|
-
return false;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
async function imageExists(ecr, repositoryName, imageTag) {
|
|
191
|
-
try {
|
|
192
|
-
await ecr.describeImages({
|
|
193
|
-
repositoryName,
|
|
194
|
-
imageIds: [{ imageTag }],
|
|
195
|
-
});
|
|
196
|
-
return true;
|
|
197
|
-
}
|
|
198
|
-
catch (e) {
|
|
199
|
-
if (e.name !== 'ImageNotFoundException') {
|
|
200
|
-
throw e;
|
|
201
|
-
}
|
|
202
|
-
return false;
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
/**
|
|
206
|
-
* Return the URI for the repository with the given name
|
|
207
|
-
*
|
|
208
|
-
* Returns undefined if the repository does not exist.
|
|
209
|
-
*/
|
|
210
|
-
async function repositoryUri(ecr, repositoryName) {
|
|
211
|
-
try {
|
|
212
|
-
const response = await ecr.describeRepositories({
|
|
213
|
-
repositoryNames: [repositoryName],
|
|
214
|
-
});
|
|
215
|
-
return (response.repositories || [])[0]?.repositoryUri;
|
|
216
|
-
}
|
|
217
|
-
catch (e) {
|
|
218
|
-
if (e.name !== 'RepositoryNotFoundException') {
|
|
219
|
-
throw e;
|
|
220
|
-
}
|
|
221
|
-
return undefined;
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFpbmVyLWltYWdlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvbnRhaW5lci1pbWFnZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQTZCO0FBRTdCLHFEQUE4RDtBQUc5RCw2Q0FBZ0Y7QUFHaEYsa0RBQXlEO0FBQ3pELG9DQUFpQztBQVNqQyxNQUFhLDBCQUEwQjtJQUdyQyxZQUNtQixPQUFlLEVBQ2YsS0FBK0IsRUFDL0IsSUFBa0IsRUFDbEIsT0FBd0I7UUFIeEIsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUNmLFVBQUssR0FBTCxLQUFLLENBQTBCO1FBQy9CLFNBQUksR0FBSixJQUFJLENBQWM7UUFDbEIsWUFBTyxHQUFQLE9BQU8sQ0FBaUI7SUFFM0MsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRXZDLElBQUksUUFBUSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDdEMsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdEIsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLGlCQUFpQixHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDO1lBQy9ELE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTztZQUN6QixZQUFZLEVBQUUsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUN0RSxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUc7WUFDakIsMkJBQTJCLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQywyQkFBMkI7U0FDdEUsQ0FBQyxDQUFDO1FBRUgsTUFBTSxPQUFPLEdBQUcsSUFBSSxxQkFBcUIsQ0FDdkMsaUJBQWlC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QUFRLEdBQUcsTUFBTSxHQUFHLENBQUMsb0JBQW9CLENBQUM7WUFDOUMsZUFBZSxFQUFFLENBQUMsY0FBYyxDQUFDO1NBQ2xDLENBQUMsQ0FBQztRQUNILE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQztJQUN6RCxDQUFDO0lBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssNkJBQTZCLEVBQUUsQ0FBQztZQUM3QyxNQUFNLENBQUMsQ0FBQztRQUNWLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgdHlwZSB7IERvY2tlckltYWdlRGVzdGluYXRpb24gfSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1zY2hlbWEnO1xuaW1wb3J0IHsgZGVzdGluYXRpb25Ub0NsaWVudE9wdGlvbnMgfSBmcm9tICcuL2NsaWVudC1vcHRpb25zJztcbmltcG9ydCB0eXBlIHsgRG9ja2VySW1hZ2VNYW5pZmVzdEVudHJ5IH0gZnJvbSAnLi4vLi4vYXNzZXQtbWFuaWZlc3QnO1xuaW1wb3J0IHR5cGUgeyBJRUNSQ2xpZW50IH0gZnJvbSAnLi4vLi4vYXdzJztcbmltcG9ydCB7IEV2ZW50VHlwZSwgc2hlbGxFdmVudFB1Ymxpc2hlckZyb21FdmVudEVtaXR0ZXIgfSBmcm9tICcuLi8uLi9wcm9ncmVzcyc7XG5pbXBvcnQgdHlwZSB7IElBc3NldEhhbmRsZXIsIElIYW5kbGVySG9zdCwgSUhhbmRsZXJPcHRpb25zIH0gZnJvbSAnLi4vYXNzZXQtaGFuZGxlcic7XG5pbXBvcnQgdHlwZSB7IERvY2tlciB9IGZyb20gJy4uL2RvY2tlcic7XG5pbXBvcnQgeyByZXBsYWNlQXdzUGxhY2Vob2xkZXJzIH0gZnJvbSAnLi4vcGxhY2Vob2xkZXJzJztcbmltcG9ydCB7IHNoZWxsIH0gZnJvbSAnLi4vc2hlbGwnO1xuXG5pbnRlcmZhY2UgQ29udGFpbmVySW1hZ2VBc3NldEhhbmRsZXJJbml0IHtcbiAgcmVhZG9ubHkgZWNyOiBJRUNSQ2xpZW50O1xuICByZWFkb25seSByZXBvVXJpOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGltYWdlVXJpOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRlc3RpbmF0aW9uQWxyZWFkeUV4aXN0czogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIENvbnRhaW5lckltYWdlQXNzZXRIYW5kbGVyIGltcGxlbWVudHMgSUFzc2V0SGFuZGxlciB7XG4gIHByaXZhdGUgaW5pdD86IENvbnRhaW5lckltYWdlQXNzZXRIYW5kbGVySW5pdDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdvcmtEaXI6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFzc2V0OiBEb2NrZXJJbWFnZU1hbmlmZXN0RW50cnksXG4gICAgcHJpdmF0ZSByZWFkb25seSBob3N0OiBJSGFuZGxlckhvc3QsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBJSGFuZGxlck9wdGlvbnMsXG4gICkge1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGJ1aWxkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGluaXRPbmNlID0gYXdhaXQgdGhpcy5pbml0T25jZSgpO1xuXG4gICAgaWYgKGluaXRPbmNlLmRlc3RpbmF0aW9uQWxyZWFkeUV4aXN0cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5ob3N0LmFib3J0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkb2NrZXJGb3JCdWlsZGluZyA9IGF3YWl0IHRoaXMuaG9zdC5kb2NrZXJGYWN0b3J5LmZvckJ1aWxkKHtcbiAgICAgIHJlcG9Vcmk6IGluaXRPbmNlLnJlcG9VcmksXG4gICAgICBldmVudEVtaXR0ZXI6IChtOiBzdHJpbmcpID0+IHRoaXMuaG9zdC5lbWl0TWVzc2FnZShFdmVudFR5cGUuREVCVUcsIG0pLFxuICAgICAgZWNyOiBpbml0T25jZS5lY3IsXG4gICAgICBzdWJwcm9jZXNzT3V0cHV0RGVzdGluYXRpb246IHRoaXMub3B0aW9ucy5zdWJwcm9jZXNzT3V0cHV0RGVzdGluYXRpb24sXG4gICAgfSk7XG5cbiAgICBjb25zdCBidWlsZGVyID0gbmV3IENvbnRhaW5lckltYWdlQnVpbGRlcihcbiAgICAgIGRvY2tlckZvckJ1aWxkaW5nLFxuICAgICAgdGhpcy53b3JrRGlyLFxuICAgICAgdGhpcy5hc3NldCxcbiAgICAgIHRoaXMuaG9zdCxcbiAgICApO1xuICAgIGNvbnN0IGxvY2FsVGFnTmFtZSA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcblxuICAgIGlmIChsb2NhbFRhZ05hbWUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmhvc3QuYWJvcnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5ob3N0LmFib3J0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBkb2NrZXJGb3JCdWlsZGluZy50YWcobG9jYWxUYWdOYW1lLCBpbml0T25jZS5pbWFnZVVyaSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaXNQdWJsaXNoZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGluaXRPbmNlID0gYXdhaXQgdGhpcy5pbml0T25jZSh7IHF1aWV0OiB0cnVlIH0pO1xuICAgICAgcmV0dXJuIGluaXRPbmNlLmRlc3RpbmF0aW9uQWxyZWFkeUV4aXN0cztcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRoaXMuaG9zdC5lbWl0TWVzc2FnZShFdmVudFR5cGUuREVCVUcsIGAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHB1Ymxpc2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW5pdE9uY2UgPSBhd2FpdCB0aGlzLmluaXRPbmNlKCk7XG5cbiAgICBpZiAoaW5pdE9uY2UuZGVzdGluYXRpb25BbHJlYWR5RXhpc3RzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmhvc3QuYWJvcnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRvY2tlckZvclB1c2hpbmcgPSBhd2FpdCB0aGlzLmhvc3QuZG9ja2VyRmFjdG9yeS5mb3JFY3JQdXNoKHtcbiAgICAgIHJlcG9Vcmk6IGluaXRPbmNlLnJlcG9VcmksXG4gICAgICBldmVudEVtaXR0ZXI6IHRoaXMuaG9zdC5lbWl0TWVzc2FnZSxcbiAgICAgIGVjcjogaW5pdE9uY2UuZWNyLFxuICAgICAgc3VicHJvY2Vzc091dHB1dERlc3RpbmF0aW9uOiB0aGlzLm9wdGlvbnMuc3VicHJvY2Vzc091dHB1dERlc3RpbmF0aW9uLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuaG9zdC5hYm9ydGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5ob3N0LmVtaXRNZXNzYWdlKEV2ZW50VHlwZS5VUExPQUQsIGBQdXNoICR7aW5pdE9uY2UuaW1hZ2VVcml9YCk7XG4gICAgYXdhaXQgZG9ja2VyRm9yUHVzaGluZy5wdXNoKHtcbiAgICAgIHRhZzogaW5pdE9uY2UuaW1hZ2VVcmksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluaXRPbmNlKFxuICAgIG9wdGlvbnM6IHsgcXVpZXQ/OiBib29sZWFuIH0gPSB7fSxcbiAgKTogUHJvbWlzZTxDb250YWluZXJJbWFnZUFzc2V0SGFuZGxlckluaXQ+IHtcbiAgICBpZiAodGhpcy5pbml0KSB7XG4gICAgICByZXR1cm4gdGhpcy5pbml0O1xuICAgIH1cblxuICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gYXdhaXQgcmVwbGFjZUF3c1BsYWNlaG9sZGVycyh0aGlzLmFzc2V0LmRlc3RpbmF0aW9uLCB0aGlzLmhvc3QuYXdzKTtcbiAgICBjb25zdCBlY3IgPSBhd2FpdCB0aGlzLmhvc3QuYXdzLmVjckNsaWVudCh7XG4gICAgICAuLi5kZXN0aW5hdGlvblRvQ2xpZW50T3B0aW9ucyhkZXN0aW5hdGlvbiksXG4gICAgICBxdWlldDogb3B0aW9ucy5xdWlldCxcbiAgICB9KTtcbiAgICBjb25zdCBhY2NvdW50ID0gYXN5bmMgKCkgPT4gKGF3YWl0IHRoaXMuaG9zdC5hd3MuZGlzY292ZXJDdXJyZW50QWNjb3VudCgpKT8uYWNjb3VudElkO1xuXG4gICAgY29uc3QgcmVwb1VyaSA9IGF3YWl0IHJlcG9zaXRvcnlVcmkoZWNyLCBkZXN0aW5hdGlvbi5yZXBvc2l0b3J5TmFtZSk7XG4gICAgaWYgKCFyZXBvVXJpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBObyBFQ1IgcmVwb3NpdG9yeSBuYW1lZCAnJHtkZXN0aW5hdGlvbi5yZXBvc2l0b3J5TmFtZX0nIGluIGFjY291bnQgJHthd2FpdCBhY2NvdW50KCl9LiBJcyB0aGlzIGFjY291bnQgYm9vdHN0cmFwcGVkP2AsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGltYWdlVXJpID0gYCR7cmVwb1VyaX06JHtkZXN0aW5hdGlvbi5pbWFnZVRhZ31gO1xuXG4gICAgdGhpcy5pbml0ID0ge1xuICAgICAgaW1hZ2VVcmksXG4gICAgICBlY3IsXG4gICAgICByZXBvVXJpLFxuICAgICAgZGVzdGluYXRpb25BbHJlYWR5RXhpc3RzOiBhd2FpdCB0aGlzLmRlc3RpbmF0aW9uQWxyZWFkeUV4aXN0cyhlY3IsIGRlc3RpbmF0aW9uLCBpbWFnZVVyaSksXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmluaXQ7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgd2hldGhlciB0aGUgaW1hZ2UgYWxyZWFkeSBleGlzdHMgaW4gdGhlIEVDUiByZXBvXG4gICAqXG4gICAqIFVzZSB0aGUgZmllbGRzIGZyb20gdGhlIGRlc3RpbmF0aW9uIHRvIGRvIHRoZSBhY3R1YWwgY2hlY2suIFRoZSBpbWFnZVVyaVxuICAgKiBzaG91bGQgY29ycmVzcG9uZCB0byB0aGF0LCBidXQgaXMgb25seSB1c2VkIHRvIHByaW50IERvY2tlciBpbWFnZSBsb2NhdGlvblxuICAgKiBmb3IgdXNlciBiZW5lZml0ICh0aGUgZm9ybWF0IGlzIHNsaWdodGx5IGRpZmZlcmVudCkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRlc3RpbmF0aW9uQWxyZWFkeUV4aXN0cyhcbiAgICBlY3I6IElFQ1JDbGllbnQsXG4gICAgZGVzdGluYXRpb246IERvY2tlckltYWdlRGVzdGluYXRpb24sXG4gICAgaW1hZ2VVcmk6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdGhpcy5ob3N0LmVtaXRNZXNzYWdlKEV2ZW50VHlwZS5DSEVDSywgYENoZWNrICR7aW1hZ2VVcml9YCk7XG4gICAgaWYgKGF3YWl0IGltYWdlRXhpc3RzKGVjciwgZGVzdGluYXRpb24ucmVwb3NpdG9yeU5hbWUsIGRlc3RpbmF0aW9uLmltYWdlVGFnKSkge1xuICAgICAgdGhpcy5ob3N0LmVtaXRNZXNzYWdlKEV2ZW50VHlwZS5GT1VORCwgYEZvdW5kICR7aW1hZ2VVcml9YCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuY2xhc3MgQ29udGFpbmVySW1hZ2VCdWlsZGVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBkb2NrZXI6IERvY2tlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdvcmtEaXI6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFzc2V0OiBEb2NrZXJJbWFnZU1hbmlmZXN0RW50cnksXG4gICAgcHJpdmF0ZSByZWFkb25seSBob3N0OiBJSGFuZGxlckhvc3QsXG4gICkge1xuICB9XG5cbiAgYXN5bmMgYnVpbGQoKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5hc3NldC5zb3VyY2UuZXhlY3V0YWJsZVxuICAgICAgPyB0aGlzLmJ1aWxkRXh0ZXJuYWxBc3NldCh0aGlzLmFzc2V0LnNvdXJjZS5leGVjdXRhYmxlKVxuICAgICAgOiB0aGlzLmJ1aWxkRGlyZWN0b3J5QXNzZXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIChsb2NhbCkgRG9ja2VyIGFzc2V0IGZyb20gYSBkaXJlY3Rvcnkgd2l0aCBhIERvY2tlcmZpbGVcbiAgICpcbiAgICogVGFncyB1bmRlciBhIGRldGVybWluaXN0aWMsIHVuaXF1ZSwgbG9jYWwgaWRlbnRpZmllciB3aWNoIHdpbGwgc2tpcFxuICAgKiB0aGUgYnVpbGQgaWYgaXQgYWxyZWFkeSBleGlzdHMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGJ1aWxkRGlyZWN0b3J5QXNzZXQoKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBsb2NhbFRhZ05hbWUgPSBgY2RrYXNzZXQtJHt0aGlzLmFzc2V0LmlkLmFzc2V0SWQudG9Mb3dlckNhc2UoKX1gO1xuXG4gICAgaWYgKCEoYXdhaXQgdGhpcy5pc0ltYWdlQ2FjaGVkKGxvY2FsVGFnTmFtZSkpKSB7XG4gICAgICBpZiAodGhpcy5ob3N0LmFib3J0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5idWlsZEltYWdlKGxvY2FsVGFnTmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxvY2FsVGFnTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIChsb2NhbCkgRG9ja2VyIGFzc2V0IGJ5IHJ1bm5pbmcgYW4gZXh0ZXJuYWwgY29tbWFuZFxuICAgKlxuICAgKiBFeHRlcm5hbCBjb21tYW5kIGlzIHJlc3BvbnNpYmxlIGZvciBkZWR1cGxpY2F0aW5nIHRoZSBidWlsZCBpZiBwb3NzaWJsZSxcbiAgICogYW5kIGlzIGV4cGVjdGVkIHRvIHJldHVybiB0aGUgZ2VuZXJhdGVkIGltYWdlIGlkZW50aWZpZXIgb24gc3Rkb3V0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBidWlsZEV4dGVybmFsQXNzZXQoXG4gICAgZXhlY3V0YWJsZTogc3RyaW5nW10sXG4gICAgY3dkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGFzc2V0UGF0aCA9IGN3ZCA/PyB0aGlzLndvcmtEaXI7XG5cbiAgICB0aGlzLmhvc3QuZW1pdE1lc3NhZ2UoRXZlbnRUeXBlLkJVSUxELCBgQnVpbGRpbmcgRG9ja2VyIGltYWdlIHVzaW5nIGNvbW1hbmQgJyR7ZXhlY3V0YWJsZX0nYCk7XG4gICAgaWYgKHRoaXMuaG9zdC5hYm9ydGVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHNoZWxsRXZlbnRQdWJsaXNoZXIgPSBzaGVsbEV2ZW50UHVibGlzaGVyRnJvbUV2ZW50RW1pdHRlcih0aGlzLmhvc3QuZW1pdE1lc3NhZ2UpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIGF3YWl0IHNoZWxsKGV4ZWN1dGFibGUsIHtcbiAgICAgICAgY3dkOiBhc3NldFBhdGgsXG4gICAgICAgIHNoZWxsRXZlbnRQdWJsaXNoZXIsXG4gICAgICAgIHN1YnByb2Nlc3NPdXRwdXREZXN0aW5hdGlvbjogJ2lnbm9yZScsXG4gICAgICB9KVxuICAgICkudHJpbSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWlsZEltYWdlKGxvY2FsVGFnTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5hc3NldC5zb3VyY2U7XG4gICAgaWYgKCFzb3VyY2UuZGlyZWN0b3J5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAnZGlyZWN0b3J5JyBpcyBleHBlY3RlZCBpbiB0aGUgRG9ja2VySW1hZ2UgYXNzZXQgc291cmNlLCBnb3Q6ICR7SlNPTi5zdHJpbmdpZnkoc291cmNlKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGgucmVzb2x2ZSh0aGlzLndvcmtEaXIsIHNvdXJjZS5kaXJlY3RvcnkpO1xuICAgIHRoaXMuaG9zdC5lbWl0TWVzc2FnZShFdmVudFR5cGUuQlVJTEQsIGBCdWlsZGluZyBEb2NrZXIgaW1hZ2UgYXQgJHtmdWxsUGF0aH1gKTtcblxuICAgIGF3YWl0IHRoaXMuZG9ja2VyLmJ1aWxkKHtcbiAgICAgIGRpcmVjdG9yeTogZnVsbFBhdGgsXG4gICAgICB0YWc6IGxvY2FsVGFnTmFtZSxcbiAgICAgIGJ1aWxkQXJnczogc291cmNlLmRvY2tlckJ1aWxkQXJncyxcbiAgICAgIGJ1aWxkU2VjcmV0czogc291cmNlLmRvY2tlckJ1aWxkU2VjcmV0cyxcbiAgICAgIGJ1aWxkU3NoOiBzb3VyY2UuZG9ja2VyQnVpbGRTc2gsXG4gICAgICB0YXJnZXQ6IHNvdXJjZS5kb2NrZXJCdWlsZFRhcmdldCxcbiAgICAgIGZpbGU6IHNvdXJjZS5kb2NrZXJGaWxlLFxuICAgICAgbmV0d29ya01vZGU6IHNvdXJjZS5uZXR3b3JrTW9kZSxcbiAgICAgIHBsYXRmb3JtOiBzb3VyY2UucGxhdGZvcm0sXG4gICAgICBvdXRwdXRzOiBzb3VyY2UuZG9ja2VyT3V0cHV0cyxcbiAgICAgIGNhY2hlRnJvbTogc291cmNlLmNhY2hlRnJvbSxcbiAgICAgIGNhY2hlVG86IHNvdXJjZS5jYWNoZVRvLFxuICAgICAgY2FjaGVEaXNhYmxlZDogc291cmNlLmNhY2hlRGlzYWJsZWQsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGlzSW1hZ2VDYWNoZWQobG9jYWxUYWdOYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoYXdhaXQgdGhpcy5kb2NrZXIuZXhpc3RzKGxvY2FsVGFnTmFtZSkpIHtcbiAgICAgIHRoaXMuaG9zdC5lbWl0TWVzc2FnZShFdmVudFR5cGUuQ0FDSEVELCBgQ2FjaGVkICR7bG9jYWxUYWdOYW1lfWApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGltYWdlRXhpc3RzKGVjcjogSUVDUkNsaWVudCwgcmVwb3NpdG9yeU5hbWU6IHN0cmluZywgaW1hZ2VUYWc6IHN0cmluZykge1xuICB0cnkge1xuICAgIGF3YWl0IGVjci5kZXNjcmliZUltYWdlcyh7XG4gICAgICByZXBvc2l0b3J5TmFtZSxcbiAgICAgIGltYWdlSWRzOiBbeyBpbWFnZVRhZyB9XSxcbiAgICB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgaWYgKGUubmFtZSAhPT0gJ0ltYWdlTm90Rm91bmRFeGNlcHRpb24nKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIFVSSSBmb3IgdGhlIHJlcG9zaXRvcnkgd2l0aCB0aGUgZ2l2ZW4gbmFtZVxuICpcbiAqIFJldHVybnMgdW5kZWZpbmVkIGlmIHRoZSByZXBvc2l0b3J5IGRvZXMgbm90IGV4aXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiByZXBvc2l0b3J5VXJpKGVjcjogSUVDUkNsaWVudCwgcmVwb3NpdG9yeU5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBlY3IuZGVzY3JpYmVSZXBvc2l0b3JpZXMoe1xuICAgICAgcmVwb3NpdG9yeU5hbWVzOiBbcmVwb3NpdG9yeU5hbWVdLFxuICAgIH0pO1xuICAgIHJldHVybiAocmVzcG9uc2UucmVwb3NpdG9yaWVzIHx8IFtdKVswXT8ucmVwb3NpdG9yeVVyaTtcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgaWYgKGUubmFtZSAhPT0gJ1JlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbicpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { FileManifestEntry } from '../../asset-manifest';
|
|
2
|
-
import type { IAssetHandler, IHandlerHost, PublishOptions } from '../asset-handler';
|
|
3
|
-
export declare class FileAssetHandler implements IAssetHandler {
|
|
4
|
-
private readonly workDir;
|
|
5
|
-
private readonly asset;
|
|
6
|
-
private readonly host;
|
|
7
|
-
private readonly fileCacheRoot;
|
|
8
|
-
constructor(workDir: string, asset: FileManifestEntry, host: IHandlerHost);
|
|
9
|
-
build(): Promise<void>;
|
|
10
|
-
isPublished(): Promise<boolean>;
|
|
11
|
-
publish(options?: PublishOptions): Promise<void>;
|
|
12
|
-
private packageFile;
|
|
13
|
-
private externalPackageFile;
|
|
14
|
-
}
|