npmci/dist/npmci.build.docker.js

245 lines
32 KiB
JavaScript

"use strict";
var plugins = require("./npmci.plugins");
var paths = require("./npmci.paths");
var NpmciEnv = require("./npmci.env");
var npmci_bash_1 = require("./npmci.bash");
exports.build = function () {
var done = plugins.q.defer();
exports.readDockerfiles()
.then(exports.sortDockerfiles)
.then(exports.mapDockerfiles)
.then(exports.buildDockerfiles)
.then(exports.pushDockerfiles)
.then(function () {
done.resolve();
});
return done.promise;
};
exports.readDockerfiles = function () {
var done = plugins.q.defer();
var readDockerfilesArray = [];
plugins.gulp.src("./Dockerfile*")
.pipe(plugins.through2.obj(function (file, enc, cb) {
var myDockerfile = new Dockerfile({
filePath: file.path,
read: true
});
readDockerfilesArray.push(myDockerfile);
cb(null, file);
}, function () {
done.resolve(readDockerfilesArray);
}));
return done.promise;
};
exports.sortDockerfiles = function (sortableArrayArg) {
var done = plugins.q.defer();
var sortedArray = [];
var trackingArray = [];
var sorterFunctionCounter = 0;
var sorterFunction = function () {
sortableArrayArg.forEach(function (dockerfileArg) {
var cleanTags = exports.cleanTagsArrayFunction(sortableArrayArg, trackingArray);
if (cleanTags.indexOf(dockerfileArg.baseImage) == -1 && trackingArray.indexOf(dockerfileArg) == -1) {
sortedArray.push(dockerfileArg);
trackingArray.push(dockerfileArg);
}
else if (cleanTags.indexOf(dockerfileArg.baseImage) != -1) {
dockerfileArg.localBaseImageDependent = true;
}
;
});
if (sortableArrayArg.length == sortedArray.length) {
done.resolve(sortedArray);
}
else if (sorterFunctionCounter < 10) {
sorterFunctionCounter++;
sorterFunction();
}
;
};
sorterFunction();
return done.promise;
};
exports.mapDockerfiles = function (sortedArray) {
var done = plugins.q.defer();
sortedArray.forEach(function (dockerfileArg) {
if (dockerfileArg.localBaseImageDependent) {
sortedArray.forEach(function (dockfile2) {
if (dockfile2.cleanTag == dockerfileArg.baseImage) {
dockerfileArg.localBaseDockerfile = dockfile2;
}
});
}
;
});
done.resolve(sortedArray);
return done.promise;
};
exports.buildDockerfiles = function (sortedArrayArg) {
var done = plugins.q.defer();
sortedArrayArg.forEach(function (dockerfileArg) {
dockerfileArg.build();
});
done.resolve(sortedArrayArg);
return done.promise;
};
exports.pushDockerfiles = function (sortedArrayArg) {
var done = plugins.q.defer();
sortedArrayArg.forEach(function (dockerfileArg) {
dockerfileArg.push();
});
done.resolve(sortedArrayArg);
return done.promise;
};
exports.pullDockerfileImages = function (sortableArrayArg) {
var done = plugins.q.defer();
sortableArrayArg.forEach(function (dockerfileArg) {
dockerfileArg.pull();
});
done.resolve(sortableArrayArg);
return done.promise;
};
exports.testDockerfiles = function (sortedArrayArg) {
var done = plugins.q.defer();
sortedArrayArg.forEach(function (dockerfileArg) {
dockerfileArg.test();
});
done.resolve(sortedArrayArg);
return done.promise;
};
exports.releaseDockerfiles = function (sortedArrayArg) {
var done = plugins.q.defer();
sortedArrayArg.forEach(function (dockerfileArg) {
dockerfileArg.release();
});
done.resolve(sortedArrayArg);
return done.promise;
};
var Dockerfile = (function () {
function Dockerfile(options) {
this.filePath = options.filePath;
this.repo = NpmciEnv.repo.user + "/" + NpmciEnv.repo.repo;
this.version = exports.dockerFileVersion(plugins.path.parse(options.filePath).base);
this.cleanTag = this.repo + ":" + this.version;
this.buildTag = exports.dockerTag(this.repo, this.version, "build");
this.releaseTag = exports.dockerTag(this.repo, this.version, "release");
this.containerName = "dockerfile-" + this.version;
if (options.filePath && options.read) {
this.content = plugins.smartfile.local.toStringSync(plugins.path.resolve(options.filePath));
}
;
this.baseImage = exports.dockerBaseImage(this.content);
this.localBaseImageDependent = false;
}
;
Dockerfile.prototype.build = function () {
var done = plugins.q.defer();
this.patchContents();
npmci_bash_1.bashBare("docker build -t " + this.buildTag + " -f " + this.filePath + " .");
NpmciEnv.dockerFilesBuilt.push(this);
this.restoreContents();
done.resolve();
return done.promise;
};
;
Dockerfile.prototype.push = function () {
var done = plugins.q.defer();
if (this.buildTag) {
npmci_bash_1.bashBare("docker push " + this.buildTag);
}
else {
plugins.beautylog.error("Dockerfile hasn't been built yet!");
}
done.resolve();
return done.promise;
};
Dockerfile.prototype.pull = function () {
npmci_bash_1.bashBare("docker pull " + this.buildTag);
};
;
Dockerfile.prototype.test = function () {
npmci_bash_1.bashBare("docker run -v " +
plugins.path.join(paths.NpmciProjectDir, "./test") + ":/test/ " +
"--name " + this.containerName + " /test/" + "test_" + this.version);
};
;
Dockerfile.prototype.release = function () {
npmci_bash_1.bashBare("docker tag " + this.getId() + " " + this.releaseTag);
npmci_bash_1.bashBare("docker push " + this.releaseTag);
};
Dockerfile.prototype.getId = function () {
var containerId = npmci_bash_1.bashBare("docker inspect --format=\"{{.Id}}\" " + this.buildTag);
return containerId;
};
;
Dockerfile.prototype.patchContents = function () {
var done = plugins.q.defer();
if (this.localBaseImageDependent == true) {
this.patchedContent = this.content.replace(/FROM\s[a-zA-Z0-9\/\-\:]*/, 'FROM ' + this.localBaseDockerfile.buildTag);
plugins.smartfile.memory.toFsSync(this.patchedContent, {
fileName: plugins.path.parse(this.filePath).name,
filePath: plugins.path.parse(this.filePath).dir
});
}
done.resolve();
return done.promise;
};
;
Dockerfile.prototype.restoreContents = function () {
var done = plugins.q.defer();
if (this.localBaseImageDependent == true) {
plugins.smartfile.memory.toFsSync(this.content, {
fileName: plugins.path.parse(this.filePath).name,
filePath: plugins.path.parse(this.filePath).dir
});
}
done.resolve();
return done.promise;
};
;
return Dockerfile;
}());
exports.Dockerfile = Dockerfile;
exports.dockerFileVersion = function (dockerfileNameArg) {
var versionString;
var versionRegex = /Dockerfile_([a-zA-Z0-9\.]*)$/;
var regexResultArray = versionRegex.exec(dockerfileNameArg);
if (regexResultArray && regexResultArray.length == 2) {
versionString = regexResultArray[1];
}
else {
versionString = "latest";
}
return versionString;
};
exports.dockerBaseImage = function (dockerfileContentArg) {
var baseImageRegex = /FROM\s([a-zA-z0-9\/\-\:]*)\n?/;
var regexResultArray = baseImageRegex.exec(dockerfileContentArg);
return regexResultArray[1];
};
exports.dockerTag = function (repoArg, versionArg, stageArg) {
var tagString;
var registry = NpmciEnv.dockerRegistry;
if (stageArg == "build" || stageArg == "test") {
registry = "registry.gitlab.com";
}
var repo = repoArg;
var version = versionArg;
if (NpmciEnv.buildStage == "build" || NpmciEnv.buildStage == "test") {
version = version + "_test";
}
tagString = registry + "/" + repo + ":" + version;
return tagString;
};
exports.cleanTagsArrayFunction = function (dockerfileArrayArg, trackingArrayArg) {
var cleanTagsArray = [];
dockerfileArrayArg.forEach(function (dockerfileArg) {
if (trackingArrayArg.indexOf(dockerfileArg) == -1) {
cleanTagsArray.push(dockerfileArg.cleanTag);
}
});
return cleanTagsArray;
};
//# sourceMappingURL=data:application/json;charset=utf8;base64,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Q0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLENBQUEsQ0FBQztRQUNoRSxPQUFPLEdBQUcsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUNoQyxDQUFDO0lBQ0QsU0FBUyxHQUFHLFFBQVEsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUM7SUFDbEQsTUFBTSxDQUFDLFNBQVMsQ0FBQztBQUNyQixDQUFDLENBQUM7QUFFUyw4QkFBc0IsR0FBRyxVQUFTLGtCQUErQixFQUFDLGdCQUE2QjtJQUN0RyxJQUFJLGNBQWMsR0FBWSxFQUFFLENBQUM7SUFDakMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLFVBQVMsYUFBYTtRQUM3QyxFQUFFLENBQUEsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDO1lBQzlDLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQUM7QUFDMUIsQ0FBQyxDQUFBIiwiZmlsZSI6Im5wbWNpLmJ1aWxkLmRvY2tlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBsdWdpbnMgZnJvbSBcIi4vbnBtY2kucGx1Z2luc1wiO1xuaW1wb3J0ICogYXMgcGF0aHMgZnJvbSBcIi4vbnBtY2kucGF0aHNcIjtcbmltcG9ydCAqIGFzIE5wbWNpRW52IGZyb20gXCIuL25wbWNpLmVudlwiO1xuaW1wb3J0IHtiYXNoQmFyZX0gZnJvbSBcIi4vbnBtY2kuYmFzaFwiO1xuXG5leHBvcnQgbGV0IGJ1aWxkID0gZnVuY3Rpb24oKXtcbiAgICBsZXQgZG9uZSA9IHBsdWdpbnMucS5kZWZlcigpO1xuICAgIHJlYWREb2NrZXJmaWxlcygpXG4gICAgICAgIC50aGVuKHNvcnREb2NrZXJmaWxlcylcbiAgICAgICAgLnRoZW4obWFwRG9ja2VyZmlsZXMpXG4gICAgICAgIC50aGVuKGJ1aWxkRG9ja2VyZmlsZXMpXG4gICAgICAgIC50aGVuKHB1c2hEb2NrZXJmaWxlcylcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZG9uZS5yZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgIHJldHVybiBkb25lLnByb21pc2U7XG59XG5cbmV4cG9ydCBsZXQgcmVhZERvY2tlcmZpbGVzID0gZnVuY3Rpb24oKXtcbiAgICBsZXQgZG9uZSA9IHBsdWdpbnMucS5kZWZlcigpO1xuICAgIGxldCByZWFkRG9ja2VyZmlsZXNBcnJheTpEb2NrZXJmaWxlW10gPSBbXVxuICAgIHBsdWdpbnMuZ3VscC5zcmMoXCIuL0RvY2tlcmZpbGUqXCIpXG4gICAgICAgIC5waXBlKHBsdWdpbnMudGhyb3VnaDIub2JqKGZ1bmN0aW9uKGZpbGUsZW5jLGNiKXtcbiAgICAgICAgICAgIGxldCBteURvY2tlcmZpbGUgPSBuZXcgRG9ja2VyZmlsZSh7XG4gICAgICAgICAgICAgICAgZmlsZVBhdGg6ZmlsZS5wYXRoLFxuICAgICAgICAgICAgICAgIHJlYWQ6dHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZWFkRG9ja2VyZmlsZXNBcnJheS5wdXNoKG15RG9ja2VyZmlsZSk7XG4gICAgICAgICAgICBjYihudWxsLGZpbGUpO1xuICAgICAgICAgfSxmdW5jdGlvbigpe1xuICAgICAgICAgICAgIGRvbmUucmVzb2x2ZShyZWFkRG9ja2VyZmlsZXNBcnJheSk7XG4gICAgICAgICB9KSk7XG4gICAgcmV0dXJuIGRvbmUucHJvbWlzZTtcbn1cblxuZXhwb3J0IGxldCBzb3J0RG9ja2VyZmlsZXMgPSBmdW5jdGlvbihzb3J0YWJsZUFycmF5QXJnOkRvY2tlcmZpbGVbXSl7XG4gICAgbGV0IGRvbmUgPSBwbHVnaW5zLnEuZGVmZXIoKTtcbiAgICBsZXQgc29ydGVkQXJyYXk6RG9ja2VyZmlsZVtdID0gW107IFxuICAgIGxldCB0cmFja2luZ0FycmF5OkRvY2tlcmZpbGVbXSA9IFtdO1xuICAgIGxldCBzb3J0ZXJGdW5jdGlvbkNvdW50ZXI6bnVtYmVyID0gMDtcbiAgICBsZXQgc29ydGVyRnVuY3Rpb24gPSBmdW5jdGlvbigpe1xuICAgICAgICBzb3J0YWJsZUFycmF5QXJnLmZvckVhY2goKGRvY2tlcmZpbGVBcmcpPT57XG4gICAgICAgICAgICBsZXQgY2xlYW5UYWdzID0gY2xlYW5UYWdzQXJyYXlGdW5jdGlvbihzb3J0YWJsZUFycmF5QXJnLHRyYWNraW5nQXJyYXkpO1xuICAgICAgICAgICAgaWYoY2xlYW5UYWdzLmluZGV4T2YoZG9ja2VyZmlsZUFyZy5iYXNlSW1hZ2UpID09IC0xICYmIHRyYWNraW5nQXJyYXkuaW5kZXhPZihkb2NrZXJmaWxlQXJnKSA9PSAtMSl7XG4gICAgICAgICAgICAgICAgc29ydGVkQXJyYXkucHVzaChkb2NrZXJmaWxlQXJnKTtcbiAgICAgICAgICAgICAgICB0cmFja2luZ0FycmF5LnB1c2goZG9ja2VyZmlsZUFyZyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYoY2xlYW5UYWdzLmluZGV4T2YoZG9ja2VyZmlsZUFyZy5iYXNlSW1hZ2UpICE9IC0xKXtcbiAgICAgICAgICAgICAgICBkb2NrZXJmaWxlQXJnLmxvY2FsQmFzZUltYWdlRGVwZW5kZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICBpZihzb3J0YWJsZUFycmF5QXJnLmxlbmd0aCA9PSBzb3J0ZWRBcnJheS5sZW5ndGgpe1xuICAgICAgICAgICAgZG9uZS5yZXNvbHZlKHNvcnRlZEFycmF5KTtcbiAgICAgICAgfSBlbHNlIGlmIChzb3J0ZXJGdW5jdGlvbkNvdW50ZXIgPCAxMCkge1xuICAgICAgICAgICAgc29ydGVyRnVuY3Rpb25Db3VudGVyKys7XG4gICAgICAgICAgICBzb3J0ZXJGdW5jdGlvbigpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBzb3J0ZXJGdW5jdGlvbigpO1xuICAgIHJldHVybiBkb25lLnByb21pc2U7XG59O1xuXG5leHBvcnQgbGV0IG1hcERvY2tlcmZpbGVzID0gZnVuY3Rpb24oc29ydGVkQXJyYXk6RG9ja2VyZmlsZVtdKXtcbiAgICBsZXQgZG9uZSA9IHBsdWdpbnMucS5kZWZlcigpO1xuICAgIHNvcnRlZEFycmF5LmZvckVhY2goKGRvY2tlcmZpbGVBcmcpID0+IHtcbiAgICAgICAgaWYoZG9ja2VyZmlsZUFyZy5sb2NhbEJhc2VJbWFnZURlcGVuZGVudCl7XG4gICAgICAgICAgICBzb3J0ZWRBcnJheS5mb3JFYWNoKChkb2NrZmlsZTI6RG9ja2VyZmlsZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmKGRvY2tmaWxlMi5jbGVhblRhZyA9PSBkb2NrZXJmaWxlQXJnLmJhc2VJbWFnZSl7XG4gICAgICAgICAgICAgICAgICAgIGRvY2tlcmZpbGVBcmcubG9jYWxCYXNlRG9ja2VyZmlsZSA9IGRvY2tmaWxlMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgIH0pO1xuICAgIGRvbmUucmVzb2x2ZShzb3J0ZWRBcnJheSk7XG4gICAgcmV0dXJuIGRvbmUucHJvbWlzZTtcbn1cblxuZXhwb3J0IGxldCBidWlsZERvY2tlcmZpbGVzID0gKHNvcnRlZEFycmF5QXJnOkRvY2tlcmZpbGVbXSkgPT4ge1xuICAgIGxldCBkb25lID0gcGx1Z2lucy5xLmRlZmVyKCk7XG4gICAgc29ydGVkQXJyYXlBcmcuZm9yRWFjaChmdW5jdGlvbihkb2NrZXJmaWxlQXJnKXtcbiAgICAgICAgZG9ja2VyZmlsZUFyZy5idWlsZCgpO1xuICAgIH0pXG4gICAgZG9uZS5yZXNvbHZlKHNvcnRlZEFycmF5QXJnKTtcbiAgICByZXR1cm4gZG9uZS5wcm9taXNlO1xufVxuXG5leHBvcnQgbGV0IHB1c2hEb2NrZXJmaWxlcyA9IGZ1bmN0aW9uKHNvcnRlZEFycmF5QXJnOkRvY2tlcmZpbGVbXSl7XG4gICAgbGV0IGRvbmUgPSBwbHVnaW5zLnEuZGVmZXIoKTtcbiAgICBzb3J0ZWRBcnJheUFyZy5mb3JFYWNoKGZ1bmN0aW9uKGRvY2tlcmZpbGVBcmcpe1xuICAgICAgICBkb2NrZXJmaWxlQXJnLnB1c2goKTtcbiAgICB9KTtcbiAgICBkb25lLnJlc29sdmUoc29ydGVkQXJyYXlBcmcpO1xuICAgIHJldHVybiBkb25lLnByb21pc2U7XG59XG5cbmV4cG9ydCBsZXQgcHVsbERvY2tlcmZpbGVJbWFnZXMgPSAoc29ydGFibGVBcnJheUFyZzpEb2NrZXJmaWxlW10pID0+IHtcbiAgICBsZXQgZG9uZSA9IHBsdWdpbnMucS5kZWZlcigpO1xuICAgIHNvcnRhYmxlQXJyYXlBcmcuZm9yRWFjaCgoZG9ja2VyZmlsZUFyZykgPT4ge1xuICAgICAgICBkb2NrZXJmaWxlQXJnLnB1bGwoKTtcbiAgICB9KTtcbiAgICBkb25lLnJlc29sdmUoc29ydGFibGVBcnJheUFyZyk7XG4gICAgcmV0dXJuIGRvbmUucHJvbWlzZTtcbn1cblxuZXhwb3J0IGxldCB0ZXN0RG9ja2VyZmlsZXMgPSAoc29ydGVkQXJyYXlBcmc6RG9ja2VyZmlsZVtdKSA9PiB7XG4gICAgbGV0IGRvbmUgPSBwbHVnaW5zLnEuZGVmZXIoKTtcbiAgICBzb3J0ZWRBcnJheUFyZy5mb3JFYWNoKGZ1bmN0aW9uKGRvY2tlcmZpbGVBcmcpe1xuICAgICAgICBkb2NrZXJmaWxlQXJnLnRlc3QoKTtcbiAgICB9KTtcbiAgICBkb25lLnJlc29sdmUoc29ydGVkQXJyYXlBcmcpO1xuICAgIHJldHVybiBkb25lLnByb21pc2U7XG59O1xuXG5leHBvcnQgbGV0IHJlbGVhc2VEb2NrZXJmaWxlcyA9IChzb3J0ZWRBcnJheUFyZzpEb2NrZXJmaWxlW10pID0+IHtcbiAgICAgbGV0IGRvbmUgPSBwbHVnaW5zLnEuZGVmZXIoKTtcbiAgICBzb3J0ZWRBcnJheUFyZy5mb3JFYWNoKGZ1bmN0aW9uKGRvY2tlcmZpbGVBcmcpe1xuICAgICAgICBkb2NrZXJmaWxlQXJnLnJlbGVhc2UoKTtcbiAgICB9KTtcbiAgICBkb25lLnJlc29sdmUoc29ydGVkQXJyYXlBcmcpO1xuICAgIHJldHVybiBkb25lLnByb21pc2U7XG59XG5cbmV4cG9ydCBjbGFzcyBEb2NrZXJmaWxlIHtcbiAgICBmaWxlUGF0aDpzdHJpbmc7XG4gICAgcmVwbzpzdHJpbmc7XG4gICAgdmVyc2lvbjpzdHJpbmc7XG4gICAgY2xlYW5UYWc6c3RyaW5nO1xuICAgIGJ1aWxkVGFnOnN0cmluZztcbiAgICByZWxlYXNlVGFnOnN0cmluZztcbiAgICBjb250YWluZXJOYW1lOnN0cmluZ1xuICAgIGNvbnRlbnQ6c3RyaW5nO1xuICAgIHBhdGNoZWRDb250ZW50OnN0cmluZztcbiAgICBiYXNlSW1hZ2U6c3RyaW5nO1xuICAgIGxvY2FsQmFzZUltYWdlRGVwZW5kZW50OmJvb2xlYW47XG4gICAgbG9jYWxCYXNlRG9ja2VyZmlsZTpEb2NrZXJmaWxlO1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6e2ZpbGVQYXRoPzpzdHJpbmcsZmlsZUNvbnRlbnRzPzpzdHJpbmd8QnVmZmVyLHJlYWQ/OmJvb2xlYW59KXtcbiAgICAgICAgdGhpcy5maWxlUGF0aCA9IG9wdGlvbnMuZmlsZVBhdGg7XG4gICAgICAgIHRoaXMucmVwbyA9IE5wbWNpRW52LnJlcG8udXNlciArIFwiL1wiICsgTnBtY2lFbnYucmVwby5yZXBvO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSBkb2NrZXJGaWxlVmVyc2lvbihwbHVnaW5zLnBhdGgucGFyc2Uob3B0aW9ucy5maWxlUGF0aCkuYmFzZSk7XG4gICAgICAgIHRoaXMuY2xlYW5UYWcgPSB0aGlzLnJlcG8gKyBcIjpcIiArIHRoaXMudmVyc2lvbjtcbiAgICAgICAgdGhpcy5idWlsZFRhZyA9IGRvY2tlclRhZyh0aGlzLnJlcG8sdGhpcy52ZXJzaW9uLFwiYnVpbGRcIik7XG4gICAgICAgIHRoaXMucmVsZWFzZVRhZyA9IGRvY2tlclRhZyh0aGlzLnJlcG8sdGhpcy52ZXJzaW9uLFwicmVsZWFzZVwiKTtcbiAgICAgICAgdGhpcy5jb250YWluZXJOYW1lID0gXCJkb2NrZXJmaWxlLVwiICsgdGhpcy52ZXJzaW9uO1xuICAgICAgICBpZihvcHRpb25zLmZpbGVQYXRoICYmIG9wdGlvbnMucmVhZCl7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnQgPSBwbHVnaW5zLnNtYXJ0ZmlsZS5sb2NhbC50b1N0cmluZ1N5bmMocGx1Z2lucy5wYXRoLnJlc29sdmUob3B0aW9ucy5maWxlUGF0aCkpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmJhc2VJbWFnZSA9IGRvY2tlckJhc2VJbWFnZSh0aGlzLmNvbnRlbnQpO1xuICAgICAgICB0aGlzLmxvY2FsQmFzZUltYWdlRGVwZW5kZW50ID0gZmFsc2U7XG4gICAgfTtcbiAgICBidWlsZCgpe1xuICAgICAgICBsZXQgZG9uZSA9IHBsdWdpbnMucS5kZWZlcigpO1xuICAgICAgICB0aGlzLnBhdGNoQ29udGVudHMoKTtcbiAgICAgICAgYmFzaEJhcmUoXCJkb2NrZXIgYnVpbGQgLXQgXCIgKyB0aGlzLmJ1aWxkVGFnICsgXCIgLWYgXCIgKyB0aGlzLmZpbGVQYXRoICsgXCIgLlwiKTtcbiAgICAgICAgTnBtY2lFbnYuZG9ja2VyRmlsZXNCdWlsdC5wdXNoKHRoaXMpO1xuICAgICAgICB0aGlzLnJlc3RvcmVDb250ZW50cygpO1xuICAgICAgICBkb25lLnJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuIGRvbmUucHJvbWlzZTtcbiAgICB9O1xuICAgIHB1c2goKXtcbiAgICAgICAgbGV0IGRvbmUgPSBwbHVnaW5zLnEuZGVmZXIoKTtcbiAgICAgICAgaWYodGhpcy5idWlsZFRhZyl7XG4gICAgICAgICAgICBiYXNoQmFyZShcImRvY2tlciBwdXNoIFwiICsgdGhpcy5idWlsZFRhZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwbHVnaW5zLmJlYXV0eWxvZy5lcnJvcihcIkRvY2tlcmZpbGUgaGFzbid0IGJlZW4gYnVpbHQgeWV0IVwiKTtcbiAgICAgICAgfVxuICAgICAgICBkb25lLnJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuIGRvbmUucHJvbWlzZTtcbiAgICB9XG4gICAgcHVsbCgpe1xuICAgICAgICBiYXNoQmFyZShcImRvY2tlciBwdWxsIFwiICsgdGhpcy5idWlsZFRhZyk7XG4gICAgfTtcbiAgICB0ZXN0KCl7XG5cbiAgICAgICAgYmFzaEJhcmUoXCJkb2NrZXIgcnVuIC12IFwiICsgXG4gICAgICAgICAgICBwbHVnaW5zLnBhdGguam9pbihwYXRocy5OcG1jaVByb2plY3REaXIsXCIuL3Rlc3RcIikgKyBcIjovdGVzdC8gXCIgK1xuICAgICAgICAgICAgXCItLW5hbWUgXCIgKyB0aGlzLmNvbnRhaW5lck5hbWUgKyBcIiAvdGVzdC9cIiArIFwidGVzdF9cIiArIHRoaXMudmVyc2lvbik7XG4gICAgfTtcbiAgICByZWxlYXNlKCl7XG4gICAgICAgIGJhc2hCYXJlKFwiZG9ja2VyIHRhZyBcIiArIHRoaXMuZ2V0SWQoKSArIFwiIFwiICsgdGhpcy5yZWxlYXNlVGFnKTtcbiAgICAgICAgYmFzaEJhcmUoXCJkb2NrZXIgcHVzaCBcIiArIHRoaXMucmVsZWFzZVRhZyk7XG4gICAgfVxuICAgIGdldElkKCl7XG4gICAgICAgIGxldCBjb250YWluZXJJZCA9IGJhc2hCYXJlKFwiZG9ja2VyIGluc3BlY3QgLS1mb3JtYXQ9XFxcInt7LklkfX1cXFwiIFwiICsgdGhpcy5idWlsZFRhZyk7XG4gICAgICAgIHJldHVybiBjb250YWluZXJJZDtcbiAgICB9O1xuICAgIHBhdGNoQ29udGVudHMoKXtcbiAgICAgICAgbGV0IGRvbmUgPSBwbHVnaW5zLnEuZGVmZXIoKTtcbiAgICAgICAgaWYodGhpcy5sb2NhbEJhc2VJbWFnZURlcGVuZGVudCA9PSB0cnVlKXtcbiAgICAgICAgICAgIHRoaXMucGF0Y2hlZENvbnRlbnQgPSB0aGlzLmNvbnRlbnQucmVwbGFjZSgvRlJPTVxcc1thLXpBLVowLTlcXC9cXC1cXDpdKi8sICdGUk9NICcgKyB0aGlzLmxvY2FsQmFzZURvY2tlcmZpbGUuYnVpbGRUYWcpO1xuICAgICAgICAgICAgcGx1Z2lucy5zbWFydGZpbGUubWVtb3J5LnRvRnNTeW5jKFxuICAgICAgICAgICAgICAgIHRoaXMucGF0Y2hlZENvbnRlbnQsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTpwbHVnaW5zLnBhdGgucGFyc2UodGhpcy5maWxlUGF0aCkubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGg6cGx1Z2lucy5wYXRoLnBhcnNlKHRoaXMuZmlsZVBhdGgpLmRpclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZG9uZS5yZXNvbHZlKCk7XG4gICAgICAgIHJldHVybiBkb25lLnByb21pc2U7XG4gICAgfTtcbiAgICByZXN0b3JlQ29udGVudHMoKXtcbiAgICAgICAgbGV0IGRvbmUgPSBwbHVnaW5zLnEuZGVmZXIoKTtcbiAgICAgICAgaWYodGhpcy5sb2NhbEJhc2VJbWFnZURlcGVuZGVudCA9PSB0cnVlKXtcbiAgICAgICAgICAgIHBsdWdpbnMuc21hcnRmaWxlLm1lbW9yeS50b0ZzU3luYyhcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTpwbHVnaW5zLnBhdGgucGFyc2UodGhpcy5maWxlUGF0aCkubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGg6cGx1Z2lucy5wYXRoLnBhcnNlKHRoaXMuZmlsZVBhdGgpLmRpclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZG9uZS5yZXNvbHZlKCk7XG4gICAgICAgIHJldHVybiBkb25lLnByb21pc2U7XG4gICAgfTtcbn1cblxuZXhwb3J0IGxldCBkb2NrZXJGaWxlVmVyc2lvbiA9IGZ1bmN0aW9uKGRvY2tlcmZpbGVOYW1lQXJnOnN0cmluZyk6c3RyaW5ne1xuICAgIGxldCB2ZXJzaW9uU3RyaW5nOnN0cmluZztcbiAgICBsZXQgdmVyc2lvblJlZ2V4ID0gL0RvY2tlcmZpbGVfKFthLXpBLVowLTlcXC5dKikkLztcbiAgICBsZXQgcmVnZXhSZXN1bHRBcnJheSA9IHZlcnNpb25SZWdleC5leGVjKGRvY2tlcmZpbGVOYW1lQXJnKTtcbiAgICBpZihyZWdleFJlc3VsdEFycmF5ICYmIHJlZ2V4UmVzdWx0QXJyYXkubGVuZ3RoID09IDIpe1xuICAgICAgICB2ZXJzaW9uU3RyaW5nID0gcmVnZXhSZXN1bHRBcnJheVsxXTsgICAgICAgIFxuICAgIH0gZWxzZSB7XG4gICAgICAgIHZlcnNpb25TdHJpbmcgPSBcImxhdGVzdFwiO1xuICAgIH1cbiAgICByZXR1cm4gdmVyc2lvblN0cmluZztcbn1cblxuZXhwb3J0IGxldCBkb2NrZXJCYXNlSW1hZ2UgPSBmdW5jdGlvbihkb2NrZXJmaWxlQ29udGVudEFyZzpzdHJpbmcpe1xuICAgIGxldCBiYXNlSW1hZ2VSZWdleCA9IC9GUk9NXFxzKFthLXpBLXowLTlcXC9cXC1cXDpdKilcXG4/L1xuICAgIGxldCByZWdleFJlc3VsdEFycmF5ID0gYmFzZUltYWdlUmVnZXguZXhlYyhkb2NrZXJmaWxlQ29udGVudEFyZylcbiAgICByZXR1cm4gcmVnZXhSZXN1bHRBcnJheVsxXTtcbn1cblxuZXhwb3J0IGxldCBkb2NrZXJUYWcgPSBmdW5jdGlvbihyZXBvQXJnOnN0cmluZyx2ZXJzaW9uQXJnOnN0cmluZyxzdGFnZUFyZzpzdHJpbmcpOnN0cmluZ3tcbiAgICBsZXQgdGFnU3RyaW5nOnN0cmluZztcbiAgICBsZXQgcmVnaXN0cnkgPSBOcG1jaUVudi5kb2NrZXJSZWdpc3RyeTtcbiAgICBpZihzdGFnZUFyZyA9PSBcImJ1aWxkXCIgIHx8IHN0YWdlQXJnID09IFwidGVzdFwiKXtcbiAgICAgICAgcmVnaXN0cnkgPSBcInJlZ2lzdHJ5LmdpdGxhYi5jb21cIjtcbiAgICB9IFxuICAgIGxldCByZXBvID0gcmVwb0FyZztcbiAgICBsZXQgdmVyc2lvbiA9IHZlcnNpb25Bcmc7XG4gICAgaWYoTnBtY2lFbnYuYnVpbGRTdGFnZSA9PSBcImJ1aWxkXCIgfHwgTnBtY2lFbnYuYnVpbGRTdGFnZSA9PSBcInRlc3RcIil7XG4gICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uICsgXCJfdGVzdFwiO1xuICAgIH1cbiAgICB0YWdTdHJpbmcgPSByZWdpc3RyeSArIFwiL1wiICsgcmVwbyArIFwiOlwiICsgdmVyc2lvbjtcbiAgICByZXR1cm4gdGFnU3RyaW5nO1xufTtcblxuZXhwb3J0IGxldCBjbGVhblRhZ3NBcnJheUZ1bmN0aW9uID0gZnVuY3Rpb24oZG9ja2VyZmlsZUFycmF5QXJnOkRvY2tlcmZpbGVbXSx0cmFja2luZ0FycmF5QXJnOkRvY2tlcmZpbGVbXSk6c3RyaW5nW117XG4gICAgbGV0IGNsZWFuVGFnc0FycmF5OnN0cmluZ1tdID0gW107XG4gICAgZG9ja2VyZmlsZUFycmF5QXJnLmZvckVhY2goZnVuY3Rpb24oZG9ja2VyZmlsZUFyZyl7XG4gICAgICAgIGlmKHRyYWNraW5nQXJyYXlBcmcuaW5kZXhPZihkb2NrZXJmaWxlQXJnKSA9PSAtMSl7XG4gICAgICAgICAgICBjbGVhblRhZ3NBcnJheS5wdXNoKGRvY2tlcmZpbGVBcmcuY2xlYW5UYWcpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNsZWFuVGFnc0FycmF5O1xufSJdfQ==