UNPKG

@dashkite/tempo

Version:

Mono/polyrepo project management

527 lines (526 loc) 73.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function _export(target, all) { for(var name in all)Object.defineProperty(target, name, { enumerable: true, get: Object.getOwnPropertyDescriptor(all, name).get }); } _export(exports, { get Repo () { return Repo; }, get Repos () { return Repos; } }); const _nodepath = /*#__PURE__*/ _interop_require_default(require("node:path")); const _nodecrypto = /*#__PURE__*/ _interop_require_default(require("node:crypto")); const _function = /*#__PURE__*/ _interop_require_wildcard(require("@dashkite/joy/function")); const _iterable = /*#__PURE__*/ _interop_require_wildcard(require("@dashkite/joy/iterable")); const _type = /*#__PURE__*/ _interop_require_wildcard(require("@dashkite/joy/type")); const _text = /*#__PURE__*/ _interop_require_wildcard(require("@dashkite/joy/text")); const _generic = require("@dashkite/joy/generic"); const _bake = require("@dashkite/bake"); const _zephyr = /*#__PURE__*/ _interop_require_default(require("@dashkite/zephyr")); const _kaiko = /*#__PURE__*/ _interop_require_default(require("@dashkite/kaiko")); const _plimit = /*#__PURE__*/ _interop_require_default(require("p-limit")); const _progress = /*#__PURE__*/ _interop_require_default(require("./progress")); const _scripts = require("./scripts"); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interop_require_wildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = { __proto__: null }; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for(var key in obj){ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } var Hash, Memos, Repo, Repos, has, partition, push, remove, slice, indexOf = [].indexOf; has = function(keys) { if (!_type.isArray(keys)) { keys = [ keys ]; } return function(value) { return keys.every(function(key) { return value[key] != null; }); }; }; push = function(stack, value) { stack.unshift(value); return value; }; remove = function(list, target) { var index; if ((index = list.indexOf(target)) > -1) { return list.splice(index, 1); } }; slice = function(stack, start, skip) { return stack.slice(start, start + skip); }; partition = function*(size, list) { var i, j, results; i = 0; j = Math.ceil(list.length / size); results = []; while(i < j){ results.push((yield slice(list, i++ * size, size))); } return results; }; Hash = { md5: function(buffer) { return (0, _bake.convert)({ from: "bytes", to: "base36" }, new Uint8Array(function() { return _nodecrypto.default.createHash("md5").update(buffer).digest().buffer; }())); }, array: function(array) { return _text.truncate(8, Hash.md5(array.sort().join(","))); } }; Memos = { path: _nodepath.default.join(".tempo", "memos.json") }; Repos = { path: _nodepath.default.join(".tempo", "repos.yaml"), initialize: function() { return _zephyr.default.update(Repos.path, function(repos) { return repos != null ? repos : repos = []; }); }, load: function() { return _zephyr.default.read(Repos.path); }, get: async function(name) { var repos; repos = await Repos.load(); return repos.find(function(repo) { return repo.name === name; }); }, add: function({ organization, name }) { return _zephyr.default.update(Repos.path, function(repos) { repos.push({ organization, name }); return repos; }); }, remove: function({ organization, name }) { return _zephyr.default.update(Repos.path, function(repos) { var repo; repo = repos.find(function(repo) { return repo.organization === organization && repo.name === name; }); remove(repos, repo); return repos; }); }, tag: async function(repos, tags) { var k, len, repo, results; results = []; for(k = 0, len = repos.length; k < len; k++){ repo = repos[k]; results.push(await Repo.tag(repo, tags)); } return results; }, untag: async function(repos, tags) { var k, len, repo, results; results = []; for(k = 0, len = repos.length; k < len; k++){ repo = repos[k]; results.push(await Repo.untag(repo, tags)); } return results; }, find: function({ find }) { find = (0, _generic.generic)({ name: "Repos.find", default: function() { return Repos.load(); } }); (0, _generic.generic)(find, has("repos"), function({ repos, ...options }) { return _function.flow([ function() { return Repos.find(options); }, _iterable.select(function(repo) { var ref; return ref = repo.name, indexOf.call(repos, ref) >= 0; }) ])(); }); (0, _generic.generic)(find, has("include"), async function({ include, ...options }) { var repos; repos = await _zephyr.default.read(include); return Repos.find({ repos, ...options }); }); (0, _generic.generic)(find, has([ "repos", "include" ]), function({ repos, include }) { return _function.flow([ Repos.find({ include: repos }), async function(result) { return result.concat(await Repos.find({ include })); } ])(); }); (0, _generic.generic)(find, has("tags"), function({ tags, ...options }) { return _function.flow([ function() { return Repos.find(options); }, _iterable.select(function(repo) { return repo.tags != null && tags.some(function(tag) { return indexOf.call(repo.tags, tag) >= 0; }); }) ])(); }); (0, _generic.generic)(find, has("exclude"), async function({ exclude, ...options }) { exclude = await _zephyr.default.read(exclude); return _function.flow([ function() { return Repos.find(options); }, _iterable.select(function(repo) { var ref; return !(ref = repo.name, indexOf.call(exclude, ref) >= 0); }) ])(); }); return find; }({}), run: function({ run }) { run = (0, _generic.generic)({ name: "Repos.run" }); (0, _generic.generic)(run, _type.isObject, async function({ repos, command, key, batch, retry }) { var before, count, done, failed, failures, found, group, groups, hash, history, index, k, l, len, len1, len2, len3, limiter, m, memos, mulligan, n, name1, pending, progress, repo, retries, succeeded; if (batch == null) { batch = 6; // max parallel builds } if (retry == null) { retry = true; } if (retry) { memos = await _zephyr.default.read(Memos.path); if (memos == null) { memos = {}; } groups = memos[key]; } // default the trivial group if (groups == null) { groups = [ repos.map(function({ name }) { return name; }) ]; } // check for missing repos // add to first group if we find any for(k = 0, len = repos.length; k < len; k++){ repo = repos[k]; found = groups.find(function(group) { var ref; return ref = repo.name, indexOf.call(group, ref) >= 0; }) != null; if (!found) { push(groups[0], repo.name); } } // remove repos that are not in the target repos list groups = groups.map(function(group) { return group.filter(function(name) { return repos.find(function(repo) { return repo.name === name; }) != null; }); // remove empty groups since they will halt the run loop }).filter(function(group) { return group.length !== 0; }); failed = void 0; hash = void 0; retries = retry ? 6 : 0; history = []; // initialize failures lookup failures = {}; for(l = 0, len1 = repos.length; l < len1; l++){ repo = repos[l]; failures[repo.name] = 0; } _kaiko.default.info({ console: true, message: `Running [ ${_text.elide(40, "...", command)} ]`, command: command }); limiter = (0, _plimit.default)(batch); done = function() { var ref; return failed != null && (failed.length === 0 || (ref = hash = Hash.array(failed), indexOf.call(history, ref) >= 0)); }; count = 0; while(!done()){ if (hash != null) { history.push(hash); } if (failed != null) { groups.push(failed); } index = 0; succeeded = 0; before = -1; if (typeof progress !== "undefined" && progress !== null) { progress.stop(); } console.log(`Attempt #${++count}`); progress = _progress.default.make({ count: repos.length }); progress.start(); mulligan = true; while((group = groups[index]) != null && (succeeded > before || mulligan)){ if (succeeded === before) { mulligan = false; } before = succeeded; failed = []; pending = function() { var len2, m, results; results = []; for(m = 0, len2 = group.length; m < len2; m++){ repo = group[m]; results.push(function(repo) { return limiter(async function() { var error, result; _kaiko.default.debug({ repo, command }); if (failures[repo] <= retries) { try { result = await _scripts.Script.run(command, { cwd: repo }); _kaiko.default.debug({ repo, result }); succeeded++; return progress.increment(); } catch (error1) { error = error1; _kaiko.default.error({ repo: repo, message: error.message, error: error }); return push(failed, repo); } } else { _kaiko.default.error({ repo: repo, failures: failures[repo], retries: retries, message: "Too many failures" }); return push(failed, repo); } }); }(repo)); } return results; }(); await Promise.all(pending); // demote failures if (succeeded > before && failed.length > 0) { if (groups[name1 = index + 1] == null) { groups[name1] = []; } for(m = 0, len2 = failed.length; m < len2; m++){ repo = failed[m]; _kaiko.default.debug({ message: "demoting repo", repo }); failures[repo]++; remove(group, repo); push(groups[index + 1], repo); } } index++; } } progress.stop(); for(n = 0, len3 = failed.length; n < len3; n++){ repo = failed[n]; _kaiko.default.error({ console: true, repo: repo, message: "failed" }); } _kaiko.default.info({ console: true, message: `succeeded: ${succeeded}, failed: ${repos.length - succeeded}` }); memos[key] = groups; return _zephyr.default.write(".tempo/memos.json", memos); }); (0, _generic.generic)(run, has("serial"), function({ serial, ...options }) { return Repos.run({ batch: 1, ...options }); }); (0, _generic.generic)(run, has([ "command", "args" ]), function({ command, args, ...options }) { if (_type.isObject(command)) { ({ command } = command); options = { ...options, ...command.options }; } return Repos.run({ command: _scripts.Script.expand(command, args), ...options }); }); (0, _generic.generic)(run, has("script"), async function({ script, ...options }) { return Repos.run({ command: await _scripts.Scripts.find(script), ...options }); }); return run; }({}) }; Repo = { parse: function(specifier) { var name, organization; [organization, name] = specifier.split("/"); return { organization, name }; }, same: function(a, b) { return a.organization === b.organization && a.name === b.name; }, save: function(repo) { return _zephyr.default.update(Repos.path, function(repos) { var _repo, k, len, results; results = []; for(k = 0, len = repos.length; k < len; k++){ _repo = repos[k]; if (Repo.same(_repo, repo)) { results.push(repo); } else { results.push(_repo); } } return results; }); }, tag: function(repo, tags) { if (repo.tags == null) { repo.tags = []; } repo.tags = Array.from(new Set([ ...repo.tags, ...tags ])); return Repo.save(repo); }, untag: function(repo, tags) { repo.tags = function() { var k, len, ref, results, tag; ref = repo.tags; results = []; for(k = 0, len = ref.length; k < len; k++){ tag = ref[k]; if (!(indexOf.call(tags, tag) >= 0)) { results.push(tag); } } return results; }(); return Repo.save(repo); }, changed: async function(name) { try { // returns non-zero status if there are changes in the repo await _scripts.Script.run("git diff-index --quiet HEAD", { cwd: name }); return false; } catch (error1) { return true; } } }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiL0BkYXNoa2l0ZS90ZW1wby9zcmMvaGVscGVycy9yZXBvcy5jb2ZmZWUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsSUFBQSxJQUFBLEVBQUEsS0FBQSxFQUFBLElBQUEsRUFBQSxLQUFBLEVBQUEsR0FBQSxFQUFBLFNBQUEsRUFBQSxJQUFBLEVBQUEsTUFBQSxFQUFBLEtBQUE7RUFBQTs7QUFBQSxPQUFPLElBQVAsTUFBQTs7QUFDQSxPQUFPLE1BQVAsTUFBQTs7QUFDQSxPQUFPLENBQUEsTUFBUCxNQUFBOztBQUNBLE9BQU8sQ0FBQSxNQUFQLE1BQUE7O0FBQ0EsT0FBTyxDQUFBLFFBQVAsTUFBQTs7QUFDQSxPQUFPLENBQUEsUUFBUCxNQUFBOztBQUNBLE9BQUE7RUFBUyxPQUFUO0NBQUEsTUFBQTs7QUFDQSxPQUFBO0VBQVMsT0FBVDtDQUFBLE1BQUE7O0FBQ0EsT0FBTyxNQUFQLE1BQUE7O0FBQ0EsT0FBTyxHQUFQLE1BQUE7O0FBQ0EsT0FBTyxNQUFQLE1BQUE7O0FBQ0EsT0FBTyxRQUFQLE1BQUE7O0FBQ0EsT0FBQTtFQUFTLE9BQVQ7RUFBa0IsTUFBbEI7Q0FBQSxNQUFBOztBQUVBLEdBQUEsR0FBTSxRQUFBLENBQUUsSUFBRixDQUFBO0VBQ0osSUFBRyxDQUFDLENBQUUsSUFBSSxDQUFDLE9BQUwsQ0FBYSxJQUFiLENBQUYsQ0FBSjtJQUNFLElBQUEsR0FBTyxDQUFFLElBQUYsRUFEVDs7U0FFQSxRQUFBLENBQUUsS0FBRixDQUFBO1dBQWEsSUFBSSxDQUFDLEtBQUwsQ0FBVyxRQUFBLENBQUUsR0FBRixDQUFBO2FBQVc7SUFBWCxDQUFYO0VBQWI7QUFISTs7QUFLTixJQUFBLEdBQU8sUUFBQSxDQUFFLEtBQUYsRUFBUyxLQUFULENBQUE7RUFBb0IsS0FBSyxDQUFDLE9BQU4sQ0FBYyxLQUFkO1NBQXNCO0FBQTFDOztBQUVQLE1BQUEsR0FBUyxRQUFBLENBQUUsSUFBRixFQUFRLE1BQVIs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O01BQUwsQ0FBMUM7YUFDTixNQUhGO0tBSUEsY0FBQTthQUNFLEtBREY7O0VBTE87QUF6QlQ7O0FBaUNGLE9BQUE7RUFBUyxLQUFUO0VBQWdCLElBQWhCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgQ3J5cHRvIGZyb20gXCJub2RlOmNyeXB0b1wiXG5pbXBvcnQgKiBhcyBGbiBmcm9tIFwiQGRhc2hraXRlL2pveS9mdW5jdGlvblwiXG5pbXBvcnQgKiBhcyBJdCBmcm9tIFwiQGRhc2hraXRlL2pveS9pdGVyYWJsZVwiXG5pbXBvcnQgKiBhcyBUeXBlIGZyb20gXCJAZGFzaGtpdGUvam95L3R5cGVcIlxuaW1wb3J0ICogYXMgVGV4dCBmcm9tIFwiQGRhc2hraXRlL2pveS90ZXh0XCJcbmltcG9ydCB7IGdlbmVyaWMgfSBmcm9tIFwiQGRhc2hraXRlL2pveS9nZW5lcmljXCJcbmltcG9ydCB7IGNvbnZlcnQgfSBmcm9tIFwiQGRhc2hraXRlL2Jha2VcIlxuaW1wb3J0IFplcGh5ciBmcm9tIFwiQGRhc2hraXRlL3plcGh5clwiXG5pbXBvcnQgbG9nIGZyb20gXCJAZGFzaGtpdGUva2Fpa29cIlxuaW1wb3J0IHBMaW1pdCBmcm9tIFwicC1saW1pdFwiXG5pbXBvcnQgUHJvZ3Jlc3MgZnJvbSBcIi4vcHJvZ3Jlc3NcIlxuaW1wb3J0IHsgU2NyaXB0cywgU2NyaXB0IH0gZnJvbSBcIi4vc2NyaXB0c1wiXG5cbmhhcyA9ICgga2V5cyApIC0+IFxuICBpZiAhKCBUeXBlLmlzQXJyYXkga2V5cyApXG4gICAga2V5cyA9IFsga2V5cyBdXG4gICggdmFsdWUgKSAtPiBrZXlzLmV2ZXJ5ICgga2V5ICkgLT4gdmFsdWVbIGtleSBdP1xuXG5wdXNoID0gKCBzdGFjaywgdmFsdWUgKSAtPiBzdGFjay51bnNoaWZ0IHZhbHVlIDsgdmFsdWVcblxucmVtb3ZlID0gKCBsaXN0LCB0YXJnZXQgKSAtPlxuICBpZiAoIGluZGV4ID0gbGlzdC5pbmRleE9mIHRhcmdldCApID4gLTFcbiAgICBsaXN0LnNwbGljZSBpbmRleCwgMVxuXG5zbGljZSA9ICggc3RhY2ssIHN0YXJ0LCBza2lwICkgLT5cbiAgc3RhY2suc2xpY2Ugc3RhcnQsIHN0YXJ0ICsgc2tpcFxuXG5wYXJ0aXRpb24gPSAoIHNpemUsIGxpc3QgKSAtPlxuICBpID0gMFxuICBqID0gTWF0aC5jZWlsIGxpc3QubGVuZ3RoIC8gc2l6ZVxuICB3aGlsZSBpIDwgalxuICAgIHlpZWxkIHNsaWNlIGxpc3QsICggaSsrICogc2l6ZSApLCBzaXplXG5cblxuSGFzaCA9XG5cbiAgbWQ1OiAoIGJ1ZmZlciApIC0+XG4gICAgY29udmVydCBmcm9tOiBcImJ5dGVzXCIsIHRvOiBcImJhc2UzNlwiLFxuICAgICAgbmV3IFVpbnQ4QXJyYXkgZG8gLT5cbiAgICAgICAgQ3J5cHRvXG4gICAgICAgICAgLmNyZWF0ZUhhc2ggXCJtZDVcIlxuICAgICAgICAgIC51cGRhdGUgYnVmZmVyXG4gICAgICAgICAgLmRpZ2VzdCgpXG4gICAgICAgICAgLmJ1ZmZlclxuXG4gIGFycmF5OiAoIGFycmF5ICkgLT5cbiAgICBUZXh0LnRydW5jYXRlIDgsIFxuICAgICAgSGFzaC5tZDUgYXJyYXkuc29ydCgpLmpvaW4gXCIsXCJcblxuTWVtb3MgPVxuXG4gIHBhdGg6IFBhdGguam9pbiBcIi50ZW1wb1wiLCBcIm1lbW9zLmpzb25cIlxuXG5SZXBvcyA9XG4gIFxuICBwYXRoOiBQYXRoLmpvaW4gXCIudGVtcG9cIiwgXCJyZXBvcy55YW1sXCJcblxuICBpbml0aWFsaXplOiAtPlxuICAgIFplcGh5ci51cGRhdGUgUmVwb3MucGF0aCwgKCByZXBvcyApIC0+IHJlcG9zID89IFtdXG5cbiAgbG9hZDogLT4gWmVwaHlyLnJlYWQgUmVwb3MucGF0aFxuXG4gIGdldDogKCBuYW1lICkgLT5cbiAgICByZXBvcyA9IGF3YWl0IGRvIFJlcG9zLmxvYWRcbiAgICByZXBvcy5maW5kICggcmVwbyApIC0+IHJlcG8ubmFtZSA9PSBuYW1lXG5cbiAgYWRkOiAoeyBvcmdhbml6YXRpb24sIG5hbWUgfSkgLT5cbiAgICBaZXBoeXIudXBkYXRlIFJlcG9zLnBhdGgsICggcmVwb3MgKSAtPlxuICAgICAgcmVwb3MucHVzaCB7IG9yZ2FuaXphdGlvbiwgbmFtZSB9XG4gICAgICByZXBvc1xuXG4gIHJlbW92ZTogKHsgb3JnYW5pemF0aW9uLCBuYW1lIH0pIC0+XG4gICAgWmVwaHlyLnVwZGF0ZSBSZXBvcy5wYXRoLCAoIHJlcG9zICkgLT5cbiAgICAgIHJlcG8gPSByZXBvcy5maW5kICggcmVwbyApIC0+XG4gICAgICAgIHJlcG8ub3JnYW5pemF0aW9uID09IG9yZ2FuaXphdGlvbiAmJlxuICAgICAgICAgIHJlcG8ubmFtZSA9PSBuYW1lXG4gICAgICByZW1vdmUgcmVwb3MsIHJlcG9cbiAgICAgIHJlcG9zXG5cbiAgdGFnOiAoIHJlcG9zLCB0YWdzICkgLT5cbiAgICBmb3IgcmVwbyBpbiByZXBvc1xuICAgICAgYXdhaXQgUmVwby50YWcgcmVwbywgdGFnc1xuXG4gIHVudGFnOiAoIHJlcG9zLCB0YWdzICkgLT5cbiAgICBmb3IgcmVwbyBpbiByZXBvc1xuICAgICAgYXdhaXQgUmVwby51bnRhZyByZXBvLCB0YWdzXG5cbiAgZmluZDogZG8gKHsgZmluZCB9ID0ge30pIC0+XG5cbiAgICBmaW5kID0gZ2VuZXJpY1xuICAgICAgbmFtZTogXCJSZXBvcy5maW5kXCJcbiAgICAgIGRlZmF1bHQ6IC0+IGRvIFJlcG9zLmxvYWRcblxuICAgIGdlbmVyaWMgZmluZCxcbiAgICAgICggaGFzIFwicmVwb3NcIiApLFxuICAgICAgKHsgcmVwb3MsIG9wdGlvbnMuLi4gfSkgLT4gXG4gICAgICAgIGRvIEZuLmZsb3cgW1xuICAgICAgICAgIC0+IFJlcG9zLmZpbmQgb3B0aW9uc1xuICAgICAgICAgIEl0LnNlbGVjdCAoIHJlcG8gKSAtPiByZXBvLm5hbWUgaW4gcmVwb3NcbiAgICAgICAgXVxuICAgICAgICBcbiAgICBnZW5lcmljIGZpbmQsXG4gICAgICAoIGhhcyBcImluY2x1ZGVcIiApLFxuICAgICAgKHsgaW5jbHVkZSwgb3B0aW9ucy4uLiB9KSAtPlxuICAgICAgICByZXBvcyA9IGF3YWl0IFplcGh5ci5yZWFkIGluY2x1ZGVcbiAgICAgICAgUmVwb3MuZmluZCB7IHJlcG9zLCBvcHRpb25zLi4uIH1cblxuICAgIGdlbmVyaWMgZmluZCxcbiAgICAgICggaGFzIFsgXCJyZXBvc1wiLCBcImluY2x1ZGVcIiBdICksXG4gICAgICAoeyByZXBvcywgaW5jbHVkZSB9KSAtPlxuICAgICAgICBkbyBGbi5mbG93IFtcbiAgICAgICAgICBSZXBvcy5maW5kIGluY2x1ZGU6IHJlcG9zXG4gICAgICAgICAgKCByZXN1bHQgKSAtPiBcbiAgICAgICAgICAgIHJlc3VsdC5jb25jYXQgYXdhaXQgUmVwb3MuZmluZCB7IGluY2x1ZGUgfVxuICAgICAgICBdXG5cbiAgICBnZW5lcmljIGZpbmQsXG4gICAgICAoIGhhcyBcInRhZ3NcIiApLFxuICAgICAgKHsgdGFncywgb3B0aW9ucy4uLiB9KSAtPlxuICAgICAgICBkbyBGbi5mbG93IFtcbiAgICAgICAgICAtPiBSZXBvcy5maW5kIG9wdGlvbnNcbiAgICAgICAgICBJdC5zZWxlY3QgKCByZXBvICkgLT4gXG4gICAgICAgICAgICByZXBvLnRhZ3M/ICYmICggdGFncy5zb21lICggdGFnICkgLT4gdGFnIGluIHJlcG8udGFncyApXG4gICAgICAgIF1cblxuICAgIGdlbmVyaWMgZmluZCxcbiAgICAgICggaGFzIFwiZXhjbHVkZVwiICksXG4gICAgICAoeyBleGNsdWRlLCBvcHRpb25zLi4uIH0pIC0+XG4gICAgICAgIGV4Y2x1ZGUgPSBhd2FpdCBaZXBoeXIucmVhZCBleGNsdWRlXG4gICAgICAgIGRvIEZuLmZsb3cgW1xuICAgICAgICAgIC0+IFJlcG9zLmZpbmQgb3B0aW9uc1xuICAgICAgICAgIEl0LnNlbGVjdCAoIHJlcG8gKSAtPiAhKCByZXBvLm5hbWUgaW4gZXhjbHVkZSApXG4gICAgICAgIF1cblxuICAgIGZpbmRcblxuICBydW46IGRvICh7IHJ1biB9ID0ge30pIC0+XG4gIFxuICAgIHJ1biA9IGdlbmVyaWMgbmFtZTogXCJSZXBvcy5ydW5cIlxuXG4gICAgZ2VuZXJpYyBydW4sIFR5cGUuaXNPYmplY3QsXG4gICAgICAoeyByZXBvcywgY29tbWFuZCwga2V5LCBiYXRjaCwgcmV0cnkgfSkgLT5cblxuICAgICAgICBiYXRjaCA/PSA2ICMgbWF4IHBhcmFsbGVsIGJ1aWxkc1xuICAgICAgICByZXRyeSA/PSB0cnVlXG5cbiAgICAgICAgaWYgcmV0cnlcbiAgICAgICAgICBtZW1vcyA9IGF3YWl0IFplcGh5ci5yZWFkIE1lbW9zLnBhdGhcbiAgICAgICAgICBtZW1vcyA/PSB7fVxuICAgICAgICAgIGdyb3VwcyA9IG1lbW9zWyBrZXkgXVxuXG4gICAgICAgICMgZGVmYXVsdCB0aGUgdHJpdmlhbCBncm91cFxuICAgICAgICBncm91cHMgPz0gWyggcmVwb3MubWFwICh7IG5hbWUgfSkgLT4gbmFtZSApXVxuXG4gICAgICAgICMgY2hlY2sgZm9yIG1pc3NpbmcgcmVwb3NcbiAgICAgICAgIyBhZGQgdG8gZmlyc3QgZ3JvdXAgaWYgd2UgZmluZCBhbnlcbiAgICAgICAgZm9yIHJlcG8gaW4gcmVwb3NcbiAgICAgICAgICBmb3VuZCA9ICggZ3JvdXBzLmZpbmQgKCBncm91cCApIC0+IHJlcG8ubmFtZSBpbiBncm91cCApP1xuICAgICAgICAgIHVubGVzcyBmb3VuZFxuICAgICAgICAgICAgcHVzaCBncm91cHNbIDAgXSwgcmVwby5uYW1lXG4gICAgICAgIFxuICAgICAgICBncm91cHMgPSBncm91cHNcbiAgICAgICAgICAjIHJlbW92ZSByZXBvcyB0aGF0IGFyZSBub3QgaW4gdGhlIHRhcmdldCByZXBvcyBsaXN0XG4gICAgICAgICAgLm1hcCAoIGdyb3VwICkgLT5cbiAgICAgICAgICAgIGdyb3VwLmZpbHRlciAoIG5hbWUgKSAtPlxuICAgICAgICAgICAgICAoIHJlcG9zLmZpbmQgKCByZXBvICkgLT4gcmVwby5uYW1lID09IG5hbWUgKT9cbiAgICAgICAgICAjIHJlbW92ZSBlbXB0eSBncm91cHMgc2luY2UgdGhleSB3aWxsIGhhbHQgdGhlIHJ1biBsb29wXG4gICAgICAgICAgLmZpbHRlciAoIGdyb3VwICkgLT4gZ3JvdXAubGVuZ3RoICE9IDBcblxuICAgICAgICBmYWlsZWQgPSB1bmRlZmluZWRcbiAgICAgICAgaGFzaCA9IHVuZGVmaW5lZFxuICAgICAgICByZXRyaWVzID0gaWYgcmV0cnkgdGhlbiA2IGVsc2UgMFxuICAgICAgICBoaXN0b3J5ID0gW11cblxuICAgICAgICAjIGluaXRpYWxpemUgZmFpbHVyZXMgbG9va3VwXG4gICAgICAgIGZhaWx1cmVzID0ge31cbiAgICAgICAgKCBmYWlsdXJlc1sgcmVwby5uYW1lIF0gPSAwICkgZm9yIHJlcG8gaW4gcmVwb3MgIFxuXG4gIFxuXG4gICAgICAgIGxvZy5pbmZvIFxuICAgICAgICAgIGNvbnNvbGU6IHRydWVcbiAgICAgICAgICBtZXNzYWdlOiBcIlJ1bm5pbmcgWyAjeyBUZXh0LmVsaWRlIDQwLCBcIi4uLlwiLCBjb21tYW5kIH0gXVwiXG4gICAgICAgICAgY29tbWFuZDogY29tbWFuZFxuXG4gICAgICAgIGxpbWl0ZXIgPSBwTGltaXQgYmF0Y2hcblxuICAgICAgICBkb25lID0gLT5cbiAgICAgICAgICBmYWlsZWQ/ICYmXG4gICAgICAgICAgICAoKCBmYWlsZWQubGVuZ3RoID09IDAgKSB8fFxuICAgICAgICAgICAgICAoKCBoYXNoID0gSGFzaC5hcnJheSBmYWlsZWQgKSBpbiBoaXN0b3J5ICkpXG5cbiAgICAgICAgY291bnQgPSAwXG4gICAgICAgIHdoaWxlICFkb25lKClcblxuICAgICAgICAgICggaGlzdG9yeS5wdXNoIGhhc2ggKSBpZiBoYXNoP1xuICAgICAgICAgICggZ3JvdXBzLnB1c2ggZmFpbGVkICkgaWYgZmFpbGVkP1xuXG4gICAgICAgICAgaW5kZXggPSAwXG4gICAgICAgICAgc3VjY2VlZGVkID0gMFxuICAgICAgICAgIGJlZm9yZSA9IC0xXG5cbiAgICAgICAgICBwcm9ncmVzcy5zdG9wKCkgaWYgcHJvZ3Jlc3M/XG4gICAgICAgICAgY29uc29sZS5sb2cgXCJBdHRlbXB0ICMjeyArK2NvdW50IH1cIlxuICAgICAgICAgIHByb2dyZXNzID0gUHJvZ3Jlc3MubWFrZSBjb3VudDogcmVwb3MubGVuZ3RoXG4gICAgICAgICAgcHJvZ3Jlc3Muc3RhcnQoKVxuXG4gICAgICAgICAgbXVsbGlnYW4gPSB0cnVlXG4gICAgICAgICAgd2hpbGUgKCBncm91cCA9IGdyb3Vwc1sgaW5kZXggXSk/ICYmICgoIHN1Y2NlZWRlZCA+IGJlZm9yZSApIHx8IG11bGxpZ2FuKVxuICAgICAgICAgICAgbXVsbGlnYW4gPSBmYWxzZSBpZiBzdWNjZWVkZWQgPT0gYmVmb3JlXG4gICAgICAgICAgICBiZWZvcmUgPSBzdWNjZWVkZWRcbiAgICAgICAgICAgIGZhaWxlZCA9IFtdXG5cbiAgICAgICAgICAgIHBlbmRpbmcgPSBcbiAgICAgICAgICAgICAgZm9yIHJlcG8gaW4gZ3JvdXBcbiAgICAgICAgICAgICAgICBkbyAoIHJlcG8gKSAtPlxuICAgICAgICAgICAgICAgICAgbGltaXRlciAtPlxuICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcgeyByZXBvLCBjb21tYW5kIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgZmFpbHVyZXNbIHJlcG8gXSA8PSByZXRyaWVzXG4gICAgICAgICAgICAgICAgICAgICAgdHJ5XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBTY3JpcHQucnVuIGNvbW1hbmQsIGN3ZDogcmVwb1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnIHsgcmVwbywgcmVzdWx0IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2NlZWRlZCsrXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcy5pbmNyZW1lbnQoKVxuICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIGVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbzogcmVwb1xuICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBmYWlsZWQsIHJlcG9cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbzogcmVwbyBcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVzOiBmYWlsdXJlc1sgcmVwbyBdXG4gICAgICAgICAgICAgICAgICAgICAgICByZXRyaWVzOiByZXRyaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIlRvbyBtYW55IGZhaWx1cmVzXCJcbiAgICAgICAgICAgICAgICAgICAgICBwdXNoIGZhaWxlZCwgcmVwb1xuXG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCBwZW5kaW5nXG5cbiAgICAgICAgICAgICMgZGVtb3RlIGZhaWx1cmVzXG4gICAgICAgICAgICBpZiAoIHN1Y2NlZWRlZCA+IGJlZm9yZSApICYmICggZmFpbGVkLmxlbmd0aCA+IDAgKVxuICAgICAgICAgICAgICBncm91cHNbIGluZGV4ICsgMSBdID89IFtdXG4gICAgICAgICAgICAgIGZvciByZXBvIGluIGZhaWxlZFxuICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyB7XG4gICAgICAgICAgICAgICAgICBtZXNzYWdlOiBcImRlbW90aW5nIHJlcG9cIlxuICAgICAgICAgICAgICAgICAgcmVwb1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmYWlsdXJlc1sgcmVwbyBdKytcbiAgICAgICAgICAgICAgICByZW1vdmUgZ3JvdXAsIHJlcG9cbiAgICAgICAgICAgICAgICBwdXNoIGdyb3Vwc1sgaW5kZXggKyAxIF0sIHJlcG9cblxuICAgICAgICAgICAgaW5kZXgrK1xuXG4gICAgICAgIHByb2dyZXNzLnN0b3AoKVxuXG4gICAgICAgIGZvciByZXBvIGluIGZhaWxlZFxuICAgICAgICAgIGxvZy5lcnJvclxuICAgICAgICAgICAgY29uc29sZTp0cnVlXG4gICAgICAgICAgICByZXBvOiByZXBvXG4gICAgICAgICAgICBtZXNzYWdlOiBcImZhaWxlZFwiXG5cblxuICAgICAgICBsb2cuaW5mbyBcbiAgICAgICAgICBjb25zb2xlOiB0cnVlXG4gICAgICAgICAgbWVzc2FnZTogXCJzdWNjZWVkZWQ6ICN7IHN1Y2NlZWRlZCB9LFxuICAgICAgICAgICAgZmFpbGVkOiAjeyByZXBvcy5sZW5ndGggLSBzdWNjZWVkZWQgfVwiXG5cbiAgICAgICAgbWVtb3NbIGtleSBdID0gZ3JvdXBzXG4gICAgICAgIFplcGh5ci53cml0ZSBcIi50ZW1wby9tZW1vcy5qc29uXCIsIG1lbW9zXG5cbiAgICBnZW5lcmljIHJ1biwgXG4gICAgICAoIGhhcyBcInNlcmlhbFwiICksXG4gICAgICAoeyBzZXJpYWwsIG9wdGlvbnMuLi4gfSkgLT5cbiAgICAgICAgUmVwb3MucnVuIHsgYmF0Y2g6IDEsIG9wdGlvbnMuLi4gfVxuXG4gICAgZ2VuZXJpYyBydW4sIFxuICAgICAgKCBoYXMgWyBcImNvbW1hbmRcIiwgXCJhcmdzXCIgIF0pLFxuICAgICAgKHsgY29tbWFuZCwgYXJncywgb3B0aW9ucy4uLiB9KSAtPlxuICAgICAgICBpZiBUeXBlLmlzT2JqZWN0IGNvbW1hbmRcbiAgICAgICAgICB7IGNvbW1hbmQgfSA9IGNvbW1hbmRcbiAgICAgICAgICBvcHRpb25zID0geyBvcHRpb25zLi4uLCBjb21tYW5kLm9wdGlvbnMuLi4gfVxuICAgICAgICBSZXBvcy5ydW4ge1xuICAgICAgICAgIGNvbW1hbmQ6IFNjcmlwdC5leHBhbmQgY29tbWFuZCwgYXJnc1xuICAgICAgICAgIG9wdGlvbnMuLi5cbiAgICAgICAgfVxuXG4gICAgZ2VuZXJpYyBydW4sIFxuICAgICAgKCBoYXMgXCJzY3JpcHRcIiApLFxuICAgICAgKHsgc2NyaXB0LCBvcHRpb25zLi4uIH0pIC0+XG4gICAgICAgIFJlcG9zLnJ1biB7XG4gICAgICAgICAgY29tbWFuZDogYXdhaXQgU2NyaXB0cy5maW5kIHNjcmlwdFxuICAgICAgICAgIG9wdGlvbnMuLi5cbiAgICAgICAgfVxuXG4gICAgcnVuXG5cblJlcG8gPVxuXG4gIHBhcnNlOiAoIHNwZWNpZmllciApIC0+XG4gICAgWyBvcmdhbml6YXRpb24sIG5hbWUgXSA9IHNwZWNpZmllci5zcGxpdCBcIi9cIlxuICAgIHsgb3JnYW5pemF0aW9uLCBuYW1lIH1cblxuICBzYW1lOiAoIGEsIGIgKSAtPlxuICAgIGEub3JnYW5pemF0aW9uID09IGIub3JnYW5pemF0aW9uICYmIGEubmFtZSA9PSBiLm5hbWVcblxuICBzYXZlOiAoIHJlcG8gKSAtPlxuICAgIFplcGh5ci51cGRhdGUgUmVwb3MucGF0aCwgKCByZXBvcyApIC0+XG4gICAgICBmb3IgX3JlcG8gaW4gcmVwb3MgICAgICBcbiAgICAgICAgaWYgUmVwby5zYW1lIF9yZXBvLCByZXBvXG4gICAgICAgICAgcmVwb1xuICAgICAgICBlbHNlXG4gICAgICAgICAgX3JlcG9cblxuICB0YWc6ICggcmVwbywgdGFncyApIC0+XG4gICAgcmVwby50YWdzID89IFtdXG4gICAgcmVwby50YWdzID0gQXJyYXkuZnJvbSBuZXcgU2V0IFsgcmVwby50YWdzLi4uLCB0YWdzLi4uIF1cbiAgICBSZXBvLnNhdmUgcmVwb1xuXG4gIHVudGFnOiAoIHJlcG8sIHRhZ3MgKSAtPlxuICAgIHJlcG8udGFncyA9IGRvIC0+XG4gICAgICB0YWcgZm9yIHRhZyBpbiByZXBvLnRhZ3Mgd2hlbiAhKCB0YWcgaW4gdGFncyApXG4gICAgUmVwby5zYXZlIHJlcG9cblxuICBjaGFuZ2VkOiAoIG5hbWUgKSAtPlxuICAgIHRyeVxuICAgICAgIyByZXR1cm5zIG5vbi16ZXJvIHN0YXR1cyBpZiB0aGVyZSBhcmUgY2hhbmdlcyBpbiB0aGUgcmVwb1xuICAgICAgYXdhaXQgU2NyaXB0LnJ1biBcImdpdCBkaWZmLWluZGV4IC0tcXVpZXQgSEVBRFwiLCBjd2Q6IG5hbWVcbiAgICAgIGZhbHNlXG4gICAgY2F0Y2hcbiAgICAgIHRydWVcblxuZXhwb3J0IHsgUmVwb3MsIFJlcG8gfSJdfQ== //# sourceURL=/@dashkite/tempo/src/helpers/repos.coffee //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlcyI6WyIvQGRhc2hraXRlL3RlbXBvL3NyYy9oZWxwZXJzL3JlcG9zLmNvZmZlZSJdLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQgQ3J5cHRvIGZyb20gXCJub2RlOmNyeXB0b1wiXG5pbXBvcnQgKiBhcyBGbiBmcm9tIFwiQGRhc2hraXRlL2pveS9mdW5jdGlvblwiXG5pbXBvcnQgKiBhcyBJdCBmcm9tIFwiQGRhc2hraXRlL2pveS9pdGVyYWJsZVwiXG5pbXBvcnQgKiBhcyBUeXBlIGZyb20gXCJAZGFzaGtpdGUvam95L3R5cGVcIlxuaW1wb3J0ICogYXMgVGV4dCBmcm9tIFwiQGRhc2hraXRlL2pveS90ZXh0XCJcbmltcG9ydCB7IGdlbmVyaWMgfSBmcm9tIFwiQGRhc2hraXRlL2pveS9nZW5lcmljXCJcbmltcG9ydCB7IGNvbnZlcnQgfSBmcm9tIFwiQGRhc2hraXRlL2Jha2VcIlxuaW1wb3J0IFplcGh5ciBmcm9tIFwiQGRhc2hraXRlL3plcGh5clwiXG5pbXBvcnQgbG9nIGZyb20gXCJAZGFzaGtpdGUva2Fpa29cIlxuaW1wb3J0IHBMaW1pdCBmcm9tIFwicC1saW1pdFwiXG5pbXBvcnQgUHJvZ3Jlc3MgZnJvbSBcIi4vcHJvZ3Jlc3NcIlxuaW1wb3J0IHsgU2NyaXB0cywgU2NyaXB0IH0gZnJvbSBcIi4vc2NyaXB0c1wiXG5cbmhhcyA9ICgga2V5cyApIC0+IFxuICBpZiAhKCBUeXBlLmlzQXJyYXkga2V5cyApXG4gICAga2V5cyA9IFsga2V5cyBdXG4gICggdmFsdWUgKSAtPiBrZXlzLmV2ZXJ5ICgga2V5ICkgLT4gdmFsdWVbIGtleSBdP1xuXG5wdXNoID0gKCBzdGFjaywgdmFsdWUgKSAtPiBzdGFjay51bnNoaWZ0IHZhbHVlIDsgdmFsdWVcblxucmVtb3ZlID0gKCBsaXN0LCB0YXJnZXQgKSAtPlxuICBpZiAoIGluZGV4ID0gbGlzdC5pbmRleE9mIHRhcmdldCApID4gLTFcbiAgICBsaXN0LnNwbGljZSBpbmRleCwgMVxuXG5zbGljZSA9ICggc3RhY2ssIHN0YXJ0LCBza2lwICkgLT5cbiAgc3RhY2suc2xpY2Ugc3RhcnQsIHN0YXJ0ICsgc2tpcFxuXG5wYXJ0aXRpb24gPSAoIHNpemUsIGxpc3QgKSAtPlxuICBpID0gMFxuICBqID0gTWF0aC5jZWlsIGxpc3QubGVuZ3RoIC8gc2l6ZVxuICB3aGlsZSBpIDwgalxuICAgIHlpZWxkIHNsaWNlIGxpc3QsICggaSsrICogc2l6ZSApLCBzaXplXG5cblxuSGFzaCA9XG5cbiAgbWQ1OiAoIGJ1ZmZlciApIC0+XG4gICAgY29udmVydCBmcm9tOiBcImJ5dGVzXCIsIHRvOiBcImJhc2UzNlwiLFxuICAgICAgbmV3IFVpbnQ4QXJyYXkgZG8gLT5cbiAgICAgICAgQ3J5cHRvXG4gICAgICAgICAgLmNyZWF0ZUhhc2ggXCJtZDVcIlxuICAgICAgICAgIC51cGRhdGUgYnVmZmVyXG4gICAgICAgICAgLmRpZ2VzdCgpXG4gICAgICAgICAgLmJ1ZmZlclxuXG4gIGFycmF5OiAoIGFycmF5ICkgLT5cbiAgICBUZXh0LnRydW5jYXRlIDgsIFxuICAgICAgSGFzaC5tZDUgYXJyYXkuc29ydCgpLmpvaW4gXCIsXCJcblxuTWVtb3MgPVxuXG4gIHBhdGg6IFBhdGguam9pbiBcIi50ZW1wb1wiLCBcIm1lbW9zLmpzb25cIlxuXG5SZXBvcyA9XG4gIFxuICBwYXRoOiBQYXRoLmpvaW4gXCIudGVtcG9cIiwgXCJyZXBvcy55YW1sXCJcblxuICBpbml0aWFsaXplOiAtPlxuICAgIFplcGh5ci51cGRhdGUgUmVwb3MucGF0aCwgKCByZXBvcyApIC0+IHJlcG9zID89IFtdXG5cbiAgbG9hZDogLT4gWmVwaHlyLnJlYWQgUmVwb3MucGF0aFxuXG4gIGdldDogKCBuYW1lICkgLT5cbiAgICByZXBvcyA9IGF3YWl0IGRvIFJlcG9zLmxvYWRcbiAgICByZXBvcy5maW5kICggcmVwbyApIC0+IHJlcG8ubmFtZSA9PSBuYW1lXG5cbiAgYWRkOiAoeyBvcmdhbml6YXRpb24sIG5hbWUgfSkgLT5cbiAgICBaZXBoeXIudXBkYXRlIFJlcG9zLnBhdGgsICggcmVwb3MgKSAtPlxuICAgICAgcmVwb3MucHVzaCB7IG9yZ2FuaXphdGlvbiwgbmFtZSB9XG4gICAgICByZXBvc1xuXG4gIHJlbW92ZTogKHsgb3JnYW5pemF0aW9uLCBuYW1lIH0pIC0+XG4gICAgWmVwaHlyLnVwZGF0ZSBSZXBvcy5wYXRoLCAoIHJlcG9zICkgLT5cbiAgICAgIHJlcG8gPSByZXBvcy5maW5kICggcmVwbyApIC0+XG4gICAgICAgIHJlcG8ub3JnYW5pemF0aW9uID09IG9yZ2FuaXphdGlvbiAmJlxuICAgICAgICAgIHJlcG8ubmFtZSA9PSBuYW1lXG4gICAgICByZW1vdmUgcmVwb3MsIHJlcG9cbiAgICAgIHJlcG9zXG5cbiAgdGFnOiAoIHJlcG9zLCB0YWdzICkgLT5cbiAgICBmb3IgcmVwbyBpbiByZXBvc1xuICAgICAgYXdhaXQgUmVwby50YWcgcmVwbywgdGFnc1xuXG4gIHVudGFnOiAoIHJlcG9zLCB0YWdzICkgLT5cbiAgICBmb3IgcmVwbyBpbiByZXBvc1xuICAgICAgYXdhaXQgUmVwby51bnRhZyByZXBvLCB0YWdzXG5cbiAgZmluZDogZG8gKHsgZmluZCB9ID0ge30pIC0+XG5cbiAgICBmaW5kID0gZ2VuZXJpY1xuICAgICAgbmFtZTogXCJSZXBvcy5maW5kXCJcbiAgICAgIGRlZmF1bHQ6IC0+IGRvIFJlcG9zLmxvYWRcblxuICAgIGdlbmVyaWMgZmluZCxcbiAgICAgICggaGFzIFwicmVwb3NcIiApLFxuICAgICAgKHsgcmVwb3MsIG9wdGlvbnMuLi4gfSkgLT4gXG4gICAgICAgIGRvIEZuLmZsb3cgW1xuICAgICAgICAgIC0+IFJlcG9zLmZpbmQgb3B0aW9uc1xuICAgICAgICAgIEl0LnNlbGVjdCAoIHJlcG8gKSAtPiByZXBvLm5hbWUgaW4gcmVwb3NcbiAgICAgICAgXVxuICAgICAgICBcbiAgICBnZW5lcmljIGZpbmQsXG4gICAgICAoIGhhcyBcImluY2x1ZGVcIiApLFxuICAgICAgKHsgaW5jbHVkZSwgb3B0aW9ucy4uLiB9KSAtPlxuICAgICAgICByZXBvcyA9IGF3YWl0IFplcGh5ci5yZWFkIGluY2x1ZGVcbiAgICAgICAgUmVwb3MuZmluZCB7IHJlcG9zLCBvcHRpb25zLi4uIH1cblxuICAgIGdlbmVyaWMgZmluZCxcbiAgICAgICggaGFzIFsgXCJyZXBvc1wiLCBcImluY2x1ZGVcIiBdICksXG4gICAgICAoeyByZXBvcywgaW5jbHVkZSB9KSAtPlxuICAgICAgICBkbyBGbi5mbG93IFtcbiAgICAgICAgICBSZXBvcy5maW5kIGluY2x1ZGU6IHJlcG9zXG4gICAgICAgICAgKCByZXN1bHQgKSAtPiBcbiAgICAgICAgICAgIHJlc3VsdC5jb25jYXQgYXdhaXQgUmVwb3MuZmluZCB7IGluY2x1ZGUgfVxuICAgICAgICBdXG5cbiAgICBnZW5lcmljIGZpbmQsXG4gICAgICAoIGhhcyBcInRhZ3NcIiApLFxuICAgICAgKHsgdGFncywgb3B0aW9ucy4uLiB9KSAtPlxuICAgICAgICBkbyBGbi5mbG93IFtcbiAgICAgICAgICAtPiBSZXBvcy5maW5kIG9wdGlvbnNcbiAgICAgICAgICBJdC5zZWxlY3QgKCByZXBvICkgLT4gXG4gICAgICAgICAgICByZXBvLnRhZ3M/ICYmICggdGFncy5zb21lICggdGFnICkgLT4gdGFnIGluIHJlcG8udGFncyApXG4gICAgICAgIF1cblxuICAgIGdlbmVyaWMgZmluZCxcbiAgI