@appium/support 2.59.5 → 2.61.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/build/lib/console.js +3 -3
- package/build/lib/console.js.map +1 -0
- package/build/lib/env.d.ts +8 -18
- package/build/lib/env.d.ts.map +1 -1
- package/build/lib/env.js +57 -36
- package/build/lib/env.js.map +1 -0
- package/build/lib/fs.d.ts +39 -10
- package/build/lib/fs.d.ts.map +1 -1
- package/build/lib/fs.js +20 -4
- package/build/lib/fs.js.map +1 -0
- package/build/lib/image-util.js +3 -3
- package/build/lib/image-util.js.map +1 -0
- package/build/lib/index.js.map +1 -0
- package/build/lib/log-internal.js +3 -3
- package/build/lib/log-internal.js.map +1 -0
- package/build/lib/logger.js.map +1 -0
- package/build/lib/logging.js +3 -3
- package/build/lib/logging.js.map +1 -0
- package/build/lib/mjpeg.js +3 -3
- package/build/lib/mjpeg.js.map +1 -0
- package/build/lib/mkdirp.js.map +1 -0
- package/build/lib/net.js +3 -3
- package/build/lib/net.js.map +1 -0
- package/build/lib/node.d.ts +10 -0
- package/build/lib/node.d.ts.map +1 -1
- package/build/lib/node.js +27 -3
- package/build/lib/node.js.map +1 -0
- package/build/lib/npm.d.ts +3 -1
- package/build/lib/npm.d.ts.map +1 -1
- package/build/lib/npm.js +39 -14
- package/build/lib/npm.js.map +1 -0
- package/build/lib/plist.js +3 -3
- package/build/lib/plist.js.map +1 -0
- package/build/lib/process.js.map +1 -0
- package/build/lib/system.js +3 -3
- package/build/lib/system.js.map +1 -0
- package/build/lib/tempdir.js +3 -3
- package/build/lib/tempdir.js.map +1 -0
- package/build/lib/timing.js +3 -3
- package/build/lib/timing.js.map +1 -0
- package/build/lib/util.js +3 -3
- package/build/lib/util.js.map +1 -0
- package/build/lib/zip.js +3 -3
- package/build/lib/zip.js.map +1 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/lib/env.js +63 -74
- package/lib/fs.js +34 -7
- package/lib/node.js +28 -1
- package/lib/npm.js +38 -27
- package/package.json +9 -10
package/build/lib/util.js
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
3
|
Object.defineProperty(exports, "__esModule", {
|
|
6
4
|
value: true
|
|
7
5
|
});
|
|
@@ -85,6 +83,8 @@ var _uuid = require("uuid");
|
|
|
85
83
|
|
|
86
84
|
var _lockfile2 = _interopRequireDefault(require("lockfile"));
|
|
87
85
|
|
|
86
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
87
|
+
|
|
88
88
|
const W3C_WEB_ELEMENT_IDENTIFIER = 'element-6066-11e4-a52e-4f735466cecf';
|
|
89
89
|
exports.W3C_WEB_ELEMENT_IDENTIFIER = W3C_WEB_ELEMENT_IDENTIFIER;
|
|
90
90
|
const KiB = 1024;
|
|
@@ -414,4 +414,4 @@ function getLockFileGuard(lockFile, opts = {}) {
|
|
|
414
414
|
|
|
415
415
|
return guard;
|
|
416
416
|
}
|
|
417
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUiIsIktpQiIsIk1pQiIsIkdpQiIsImhhc0NvbnRlbnQiLCJ2YWwiLCJfIiwiaXNTdHJpbmciLCJoYXNWYWx1ZSIsImlzTnVtYmVyIiwiaXNOYU4iLCJpc1VuZGVmaW5lZCIsImlzTnVsbCIsImVzY2FwZVNwYWNlIiwic3RyIiwic3BsaXQiLCJqb2luIiwiZXNjYXBlU3BlY2lhbENoYXJzIiwicXVvdGVFc2NhcGUiLCJyZXBsYWNlIiwicmUiLCJSZWdFeHAiLCJsb2NhbElwIiwiaXAiLCJjaGFpbiIsIm9zIiwibmV0d29ya0ludGVyZmFjZXMiLCJ2YWx1ZXMiLCJmbGF0dGVuIiwiZmlsdGVyIiwiZmFtaWx5IiwiaW50ZXJuYWwiLCJtYXAiLCJmaXJzdCIsInZhbHVlIiwiY2FuY2VsbGFibGVEZWxheSIsIm1zIiwidGltZXIiLCJyZXNvbHZlIiwicmVqZWN0IiwiZGVsYXkiLCJCIiwiUHJvbWlzZSIsIl9yZXNvbHZlIiwiX3JlamVjdCIsInNldFRpbWVvdXQiLCJjYW5jZWwiLCJjbGVhclRpbWVvdXQiLCJDYW5jZWxsYXRpb25FcnJvciIsIm11bHRpUmVzb2x2ZSIsInJvb3RzIiwiYXJncyIsInJvb3QiLCJwYXRoIiwic2FmZUpzb25QYXJzZSIsIm9iaiIsIkpTT04iLCJwYXJzZSIsImlnbiIsImpzb25TdHJpbmdpZnkiLCJyZXBsYWNlciIsInNwYWNlIiwiaXNGdW5jdGlvbiIsImsiLCJ2IiwiYnVmZmVyVG9KU09OIiwiQnVmZmVyIiwicHJvdG90eXBlIiwidG9KU09OIiwic3RyaW5naWZ5Iiwia2V5IiwidXBkYXRlZFZhbHVlIiwiaXNCdWZmZXIiLCJ0b1N0cmluZyIsInVud3JhcEVsZW1lbnQiLCJlbCIsInByb3BOYW1lIiwiaGFzIiwid3JhcEVsZW1lbnQiLCJlbGVtZW50SWQiLCJFTEVNRU5UIiwiZmlsdGVyT2JqZWN0IiwicHJlZGljYXRlIiwibmV3T2JqIiwiY2xvbmUiLCJ2YWx1ZVByZWRpY2F0ZSIsIk9iamVjdCIsImtleXMiLCJ0b1JlYWRhYmxlU2l6ZVN0cmluZyIsImJ5dGVzIiwiaW50Qnl0ZXMiLCJwYXJzZUludCIsIlN0cmluZyIsIkVycm9yIiwidG9GaXhlZCIsImlzU3ViUGF0aCIsIm9yaWdpbmFsUGF0aCIsImZvcmNlUG9zaXgiLCJwYXRoT2JqIiwicG9zaXgiLCJwIiwiaXNBYnNvbHV0ZSIsIm5vcm1hbGl6ZWRSb290Iiwibm9ybWFsaXplIiwibm9ybWFsaXplZFBhdGgiLCJzdGFydHNXaXRoIiwiaXNTYW1lRGVzdGluYXRpb24iLCJwYXRoMSIsInBhdGgyIiwicGF0aE4iLCJhbGxQYXRocyIsInJlZHVjZSIsImEiLCJiIiwiZnMiLCJleGlzdHMiLCJhcmVBbGxJdGVtc0VxdWFsIiwiYXJyIiwiTmFOIiwibWFwQ2IiLCJ4Iiwic3RhdCIsImJpZ2ludCIsImlubyIsImNvZXJjZVZlcnNpb24iLCJ2ZXIiLCJzdHJpY3QiLCJyZXN1bHQiLCJzZW12ZXIiLCJ2YWxpZCIsImNvZXJjZSIsIlNVUFBPUlRFRF9PUEVSQVRPUlMiLCJjb21wYXJlVmVyc2lvbnMiLCJ2ZXIxIiwib3BlcmF0b3IiLCJ2ZXIyIiwiaW5jbHVkZXMiLCJzZW12ZXJPcGVyYXRvciIsInNhdGlzZmllcyIsInF1b3RlIiwic2hlbGxRdW90ZSIsImNhc3RBcnJheSIsInVubGVha1N0cmluZyIsInMiLCJzdWJzdHIiLCJwbHVyYWxpemUiLCJ3b3JkIiwiY291bnQiLCJvcHRpb25zIiwiaW5jbHVzaXZlIiwiaXNCb29sZWFuIiwicGx1cmFsaXplTGliIiwidG9Jbk1lbW9yeUJhc2U2NCIsInNyY1BhdGgiLCJvcHRzIiwiaXNEaXJlY3RvcnkiLCJtYXhTaXplIiwicmVzdWx0QnVmZmVycyIsInJlc3VsdEJ1ZmZlcnNTaXplIiwicmVzdWx0V3JpdGVTdHJlYW0iLCJzdHJlYW0iLCJXcml0YWJsZSIsIndyaXRlIiwiYnVmZmVyIiwiZW5jb2RpbmciLCJuZXh0IiwicHVzaCIsImxlbmd0aCIsImVtaXQiLCJyZWFkZXJTdHJlYW0iLCJjcmVhdGVSZWFkU3RyZWFtIiwiYmFzZTY0RW5jb2RlclN0cmVhbSIsIkJhc2U2NEVuY29kZSIsInJlc3VsdFdyaXRlU3RyZWFtUHJvbWlzZSIsIm9uY2UiLCJlIiwidW5waXBlIiwiZGVzdHJveSIsInJlYWRTdHJlYW1Qcm9taXNlIiwibWVzc2FnZSIsInBpcGUiLCJhbGwiLCJjb25jYXQiLCJnZXRMb2NrRmlsZUd1YXJkIiwibG9ja0ZpbGUiLCJ0aW1lb3V0IiwidHJ5UmVjb3ZlcnkiLCJsb2NrIiwicHJvbWlzaWZ5IiwiX2xvY2tmaWxlIiwiY2hlY2siLCJ1bmxvY2siLCJndWFyZCIsImJlaGF2aW9yIiwidHJpZWRSZWNvdmVyeSIsImNoZWNrU3luYyIsIndhaXQiLCJsb2NrU3luYyIsInVubG9ja1N5bmMiXSwic291cmNlcyI6WyIuLi8uLi9saWIvdXRpbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGZzIGZyb20gJy4vZnMnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHtcbiAgLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2Uvc2hlbGwtcXVvdGVcbiAgcXVvdGUgYXMgc2hlbGxRdW90ZSxcbiAgcGFyc2UgYXMgc2hlbGxQYXJzZSxcbn0gZnJvbSAnc2hlbGwtcXVvdGUnO1xuaW1wb3J0IHBsdXJhbGl6ZUxpYiBmcm9tICdwbHVyYWxpemUnO1xuaW1wb3J0IHN0cmVhbSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHtCYXNlNjRFbmNvZGV9IGZyb20gJ2Jhc2U2NC1zdHJlYW0nO1xuaW1wb3J0IHtcbiAgLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvdXVpZFxuICB2MSBhcyB1dWlkVjEsXG4gIHYzIGFzIHV1aWRWMyxcbiAgdjQgYXMgdXVpZFY0LFxuICB2NSBhcyB1dWlkVjUsXG59IGZyb20gJ3V1aWQnO1xuaW1wb3J0IF9sb2NrZmlsZSBmcm9tICdsb2NrZmlsZSc7XG5cbmNvbnN0IFczQ19XRUJfRUxFTUVOVF9JREVOVElGSUVSID0gJ2VsZW1lbnQtNjA2Ni0xMWU0LWE1MmUtNGY3MzU0NjZjZWNmJztcbmNvbnN0IEtpQiA9IDEwMjQ7XG5jb25zdCBNaUIgPSBLaUIgKiAxMDI0O1xuY29uc3QgR2lCID0gTWlCICogMTAyNDtcblxuLyoqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gVFxuICogQHBhcmFtIHtUfSB2YWxcbiAqIEByZXR1cm5zIHt2YWwgaXMgTm9uRW1wdHlTdHJpbmc8VD59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNDb250ZW50KHZhbCkge1xuICByZXR1cm4gXy5pc1N0cmluZyh2YWwpICYmIHZhbCAhPT0gJyc7XG59XG5cbi8qKlxuICogcmV0dXJuIHRydWUgaWYgdGhlIHRoZSB2YWx1ZSBpcyBub3QgYHVuZGVmaW5lZGAsIGBudWxsYCwgb3IgYE5hTmAuXG4gKlxuICogWFhYOiBgTmFOYCBpcyBub3QgZXhwcmVzc2libGUgaW4gVHlwZVNjcmlwdC5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHZhbFxuICogQHJldHVybnMge3ZhbCBpcyBOb25OdWxsYWJsZTxUPn1cbiAqL1xuZnVuY3Rpb24gaGFzVmFsdWUodmFsKSB7XG4gIC8vIGF2b2lkIGluY29ycmVjdGx5IGV2YWx1YXRpbmcgYDBgIGFzIGZhbHNlXG4gIGlmIChfLmlzTnVtYmVyKHZhbCkpIHtcbiAgICByZXR1cm4gIV8uaXNOYU4odmFsKTtcbiAgfVxuICByZXR1cm4gIV8uaXNVbmRlZmluZWQodmFsKSAmJiAhXy5pc051bGwodmFsKTtcbn1cblxuLy8gZXNjYXBlIHNwYWNlcyBpbiBzdHJpbmcsIGZvciBjb21tYW5kbGluZSBjYWxsc1xuZnVuY3Rpb24gZXNjYXBlU3BhY2Uoc3RyKSB7XG4gIHJldHVybiBzdHIuc3BsaXQoLyAvKS5qb2luKCdcXFxcICcpO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVTcGVjaWFsQ2hhcnMoc3RyLCBxdW90ZUVzY2FwZSkge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIGlmICh0eXBlb2YgcXVvdGVFc2NhcGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcXVvdGVFc2NhcGUgPSBmYWxzZTtcbiAgfVxuICBzdHIgPSBzdHJcbiAgICAucmVwbGFjZSgvW1xcXFxdL2csICdcXFxcXFxcXCcpXG4gICAgLnJlcGxhY2UoL1tcXC9dL2csICdcXFxcLycpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcbiAgICAucmVwbGFjZSgvW1xcYl0vZywgJ1xcXFxiJylcbiAgICAucmVwbGFjZSgvW1xcZl0vZywgJ1xcXFxmJylcbiAgICAucmVwbGFjZSgvW1xcbl0vZywgJ1xcXFxuJylcbiAgICAucmVwbGFjZSgvW1xccl0vZywgJ1xcXFxyJylcbiAgICAucmVwbGFjZSgvW1xcdF0vZywgJ1xcXFx0JylcbiAgICAucmVwbGFjZSgvW1xcXCJdL2csICdcXFxcXCInKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4gICAgLnJlcGxhY2UoL1xcXFwnL2csIFwiXFxcXCdcIik7XG4gIGlmIChxdW90ZUVzY2FwZSkge1xuICAgIGxldCByZSA9IG5ldyBSZWdFeHAocXVvdGVFc2NhcGUsICdnJyk7XG4gICAgc3RyID0gc3RyLnJlcGxhY2UocmUsIGBcXFxcJHtxdW90ZUVzY2FwZX1gKTtcbiAgfVxuICByZXR1cm4gc3RyO1xufVxuXG5mdW5jdGlvbiBsb2NhbElwKCkge1xuICBsZXQgaXAgPSBfLmNoYWluKG9zLm5ldHdvcmtJbnRlcmZhY2VzKCkpXG4gICAgLnZhbHVlcygpXG4gICAgLmZsYXR0ZW4oKVxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICAuZmlsdGVyKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHJldHVybiB2YWwuZmFtaWx5ID09PSAnSVB2NCcgJiYgdmFsLmludGVybmFsID09PSBmYWxzZTtcbiAgICB9KVxuICAgIC5tYXAoJ2FkZHJlc3MnKVxuICAgIC5maXJzdCgpXG4gICAgLnZhbHVlKCk7XG4gIHJldHVybiBpcDtcbn1cblxuLypcbiAqIENyZWF0ZXMgYSBwcm9taXNlIHRoYXQgaXMgY2FuY2VsbGFibGUsIGFuZCB3aWxsIHRpbWVvdXRcbiAqIGFmdGVyIGBtc2AgZGVsYXlcbiAqL1xuZnVuY3Rpb24gY2FuY2VsbGFibGVEZWxheShtcykge1xuICBsZXQgdGltZXI7XG4gIGxldCByZXNvbHZlO1xuICBsZXQgcmVqZWN0O1xuXG4gIGNvbnN0IGRlbGF5ID0gbmV3IEIuUHJvbWlzZSgoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcbiAgICByZXNvbHZlID0gX3Jlc29sdmU7XG4gICAgcmVqZWN0ID0gX3JlamVjdDtcbiAgICB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0sIG1zKTtcbiAgfSk7XG5cbiAgLy8gb3ZlcnJpZGUgQmx1ZWJpcmQncyBgY2FuY2VsYCwgd2hpY2ggZG9lcyBub3Qgd29yayB3aGVuIHVzaW5nIGBhd2FpdGAgb25cbiAgLy8gYSBwcm9taXNlLCBzaW5jZSBgcmVzb2x2ZWAvYHJlamVjdGAgYXJlIG5ldmVyIGNhbGxlZFxuICBkZWxheS5jYW5jZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICByZWplY3QobmV3IEIuQ2FuY2VsbGF0aW9uRXJyb3IoKSk7XG4gIH07XG4gIHJldHVybiBkZWxheTtcbn1cblxuZnVuY3Rpb24gbXVsdGlSZXNvbHZlKHJvb3RzLCAuLi5hcmdzKSB7XG4gIHJldHVybiByb290cy5tYXAoKHJvb3QpID0+IHBhdGgucmVzb2x2ZShyb290LCAuLi5hcmdzKSk7XG59XG5cbi8qXG4gKiBQYXJzZXMgYW4gb2JqZWN0IGlmIHBvc3NpYmxlLiBPdGhlcndpc2UgcmV0dXJucyB0aGUgb2JqZWN0IHdpdGhvdXQgcGFyc2luZy5cbiAqL1xuZnVuY3Rpb24gc2FmZUpzb25QYXJzZShvYmopIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShvYmopO1xuICB9IGNhdGNoIChpZ24pIHtcbiAgICAvLyBpZ25vcmU6IHRoaXMgaXMgbm90IGpzb24gcGFyc2FibGVcbiAgICByZXR1cm4gb2JqO1xuICB9XG59XG5cbi8qXG4gKiBTdHJpbmdpZmllcyB0aGUgb2JqZWN0IHBhc3NlZCBpbiwgY29udmVydGluZyBCdWZmZXJzIGludG8gU3RyaW5ncyBmb3IgYmV0dGVyXG4gKiBkaXNwbGF5LiBUaGlzIG1pbWljcyBKU09OLnN0cmluZ2lmeSAoc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0pTT04vc3RyaW5naWZ5KVxuICogZXhjZXB0IHRoZSBgcmVwbGFjZXJgIGFyZ3VtZW50IGNhbiBvbmx5IGJlIGEgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9iaiAtIHRoZSBvYmplY3QgdG8gYmUgc2VyaWFsaXplZFxuICogQHBhcmFtIHs/ZnVuY3Rpb259IHJlcGxhY2VyIC0gZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHRoZSBwcm9wZXJ0aWVzIGFkZGVkIHRvIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZCBvYmplY3RcbiAqIEBwYXJhbSB7P251bWJlcnxzdHJpbmd9IHNwYWNlIC0gdXNlZCB0byBpbnNlcnQgd2hpdGUgc3BhY2UgaW50byB0aGUgb3V0cHV0IEpTT05cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZvciByZWFkYWJpbGl0eSBwdXJwb3Nlcy4gRGVmYXVsdHMgdG8gMlxuICogcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBKU09OIG9iamVjdCBzZXJpYWxpemVkIGFzIGEgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGpzb25TdHJpbmdpZnkob2JqLCByZXBsYWNlciwgc3BhY2UgPSAyKSB7XG4gIC8vIGlmIG5vIHJlcGxhY2VyIGlzIHBhc3NlZCwgb3IgaXQgaXMgbm90IGEgZnVuY3Rpb24sIGp1c3QgdXNlIGEgcGFzcy10aHJvdWdoXG4gIGlmICghXy5pc0Z1bmN0aW9uKHJlcGxhY2VyKSkge1xuICAgIHJlcGxhY2VyID0gKGssIHYpID0+IHY7XG4gIH1cblxuICAvLyBCdWZmZXJzIGNhbm5vdCBiZSBzZXJpYWxpemVkIGluIGEgcmVhZGFibGUgd2F5XG4gIGNvbnN0IGJ1ZmZlclRvSlNPTiA9IEJ1ZmZlci5wcm90b3R5cGUudG9KU09OO1xuICBkZWxldGUgQnVmZmVyLnByb3RvdHlwZS50b0pTT047XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFxuICAgICAgb2JqLFxuICAgICAgKGtleSwgdmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlZFZhbHVlID0gQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSA/IHZhbHVlLnRvU3RyaW5nKCd1dGY4JykgOiB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHJlcGxhY2VyKGtleSwgdXBkYXRlZFZhbHVlKTtcbiAgICAgIH0sXG4gICAgICBzcGFjZVxuICAgICk7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gcmVzdG9yZSB0aGUgZnVuY3Rpb24sIHNvIGFzIHRvIG5vdCBicmVhayBmdXJ0aGVyIHNlcmlhbGl6YXRpb25cbiAgICBCdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGJ1ZmZlclRvSlNPTjtcbiAgfVxufVxuXG4vKlxuICogUmVtb3ZlcyB0aGUgd3JhcHBlciBmcm9tIGVsZW1lbnQsIGlmIGl0IGV4aXN0cy5cbiAqICAgeyBFTEVNRU5UOiA0IH0gYmVjb21lcyA0XG4gKiAgIHsgZWxlbWVudC02MDY2LTExZTQtYTUyZS00ZjczNTQ2NmNlY2Y6IDUgfSBiZWNvbWVzIDVcbiAqL1xuZnVuY3Rpb24gdW53cmFwRWxlbWVudChlbCkge1xuICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIFtXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUiwgJ0VMRU1FTlQnXSkge1xuICAgIGlmIChfLmhhcyhlbCwgcHJvcE5hbWUpKSB7XG4gICAgICByZXR1cm4gZWxbcHJvcE5hbWVdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZWw7XG59XG5cbmZ1bmN0aW9uIHdyYXBFbGVtZW50KGVsZW1lbnRJZCkge1xuICByZXR1cm4ge1xuICAgIEVMRU1FTlQ6IGVsZW1lbnRJZCxcbiAgICBbVzNDX1dFQl9FTEVNRU5UX0lERU5USUZJRVJdOiBlbGVtZW50SWQsXG4gIH07XG59XG5cbi8qXG4gKiBSZXR1cm5zIG9iamVjdCBjb25zaXN0aW5nIG9mIGFsbCBwcm9wZXJ0aWVzIGluIHRoZSBvcmlnaW5hbCBlbGVtZW50XG4gKiB3aGljaCB3ZXJlIHRydXRoeSBnaXZlbiB0aGUgcHJlZGljYXRlLlxuICogSWYgdGhlIHByZWRpY2F0ZSBpc1xuICogICAqIG1pc3NpbmcgLSBpdCB3aWxsIHJlbW92ZSBhbGwgcHJvcGVydGllcyB3aG9zZSB2YWx1ZXMgYXJlIGB1bmRlZmluZWRgXG4gKiAgICogYSBzY2FsYXIgLSBpdCB3aWxsIHRlc3QgYWxsIHByb3BlcnRpZXMnIHZhbHVlcyBhZ2FpbnN0IHRoYXQgdmFsdWVcbiAqICAgKiBhIGZ1bmN0aW9uIC0gaXQgd2lsbCBwYXNzIGVhY2ggdmFsdWUgYW5kIHRoZSBvcmlnaW5hbCBvYmplY3QgaW50byB0aGUgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gZmlsdGVyT2JqZWN0KG9iaiwgcHJlZGljYXRlKSB7XG4gIGxldCBuZXdPYmogPSBfLmNsb25lKG9iaik7XG4gIGlmIChfLmlzVW5kZWZpbmVkKHByZWRpY2F0ZSkpIHtcbiAgICAvLyByZW1vdmUgYW55IGVsZW1lbnQgZnJvbSB0aGUgb2JqZWN0IHdob3NlIHZhbHVlIGlzIHVuZGVmaW5lZFxuICAgIHByZWRpY2F0ZSA9ICh2KSA9PiAhXy5pc1VuZGVmaW5lZCh2KTtcbiAgfSBlbHNlIGlmICghXy5pc0Z1bmN0aW9uKHByZWRpY2F0ZSkpIHtcbiAgICAvLyBtYWtlIHByZWRpY2F0ZSBpbnRvIGEgZnVuY3Rpb25cbiAgICBjb25zdCB2YWx1ZVByZWRpY2F0ZSA9IHByZWRpY2F0ZTtcbiAgICBwcmVkaWNhdGUgPSAodikgPT4gdiA9PT0gdmFsdWVQcmVkaWNhdGU7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgIGlmICghcHJlZGljYXRlKG9ialtrZXldLCBvYmopKSB7XG4gICAgICBkZWxldGUgbmV3T2JqW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXdPYmo7XG59XG5cbi8qKlxuICogQ29udmVydHMgbnVtYmVyIG9mIGJ5dGVzIHRvIGEgcmVhZGFibGUgc2l6ZSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBieXRlcyAtIFRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzLlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGFjdHVhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24sIGZvciBleGFtcGxlXG4gKiAgICAgICAgICAgICAgICAgICAnMS4wMCBLQicgZm9yICcxMDI0IEInXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYnl0ZXMgY291bnQgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyIG9yXG4gKiAgICAgICAgICAgICAgICAgaWYgaXQgaXMgbGVzcyB0aGFuIHplcm8uXG4gKi9cbmZ1bmN0aW9uIHRvUmVhZGFibGVTaXplU3RyaW5nKGJ5dGVzKSB7XG4gIGNvbnN0IGludEJ5dGVzID0gcGFyc2VJbnQoU3RyaW5nKGJ5dGVzKSwgMTApO1xuICBpZiAoaXNOYU4oaW50Qnl0ZXMpIHx8IGludEJ5dGVzIDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvbnZlcnQgJyR7Ynl0ZXN9JyB0byBhIHJlYWRhYmxlIHNpemUgZm9ybWF0YCk7XG4gIH1cbiAgaWYgKGludEJ5dGVzID49IEdpQikge1xuICAgIHJldHVybiBgJHsoaW50Qnl0ZXMgLyAoR2lCICogMS4wKSkudG9GaXhlZCgyKX0gR0JgO1xuICB9IGVsc2UgaWYgKGludEJ5dGVzID49IE1pQikge1xuICAgIHJldHVybiBgJHsoaW50Qnl0ZXMgLyAoTWlCICogMS4wKSkudG9GaXhlZCgyKX0gTUJgO1xuICB9IGVsc2UgaWYgKGludEJ5dGVzID49IEtpQikge1xuICAgIHJldHVybiBgJHsoaW50Qnl0ZXMgLyAoS2lCICogMS4wKSkudG9GaXhlZCgyKX0gS0JgO1xuICB9XG4gIHJldHVybiBgJHtpbnRCeXRlc30gQmA7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHBhdGggaXMgYSBzdWJwYXRoIG9mIHRoZVxuICogcGFydGljdWxhciByb290IGZvbGRlci4gQm90aCBwYXRocyBjYW4gaW5jbHVkZSAuLiBhbmQgLiBzcGVjaWZpZXJzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG9yaWdpbmFsUGF0aCBUaGUgYWJzb2x1dGUgZmlsZS9mb2xkZXIgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHJvb3QgVGhlIGFic29sdXRlIHJvb3QgZm9sZGVyIHBhdGhcbiAqIEBwYXJhbSB7P2Jvb2xlYW59IGZvcmNlUG9zaXggU2V0IGl0IHRvIHRydWUgaWYgcGF0aHMgbXVzdCBiZSBpbnRlcnByZXRlZCBpbiBQT1NJWCBmb3JtYXRcbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSBnaXZlbiBvcmlnaW5hbCBwYXRoIGlzIHRoZSBzdWJwYXRoIG9mIHRoZSByb290IGZvbGRlclxuICogQHRocm93cyB7RXJyb3J9IGlmIGFueSBvZiB0aGUgZ2l2ZW4gcGF0aHMgaXMgbm90IGFic29sdXRlXG4gKi9cbmZ1bmN0aW9uIGlzU3ViUGF0aChvcmlnaW5hbFBhdGgsIHJvb3QsIGZvcmNlUG9zaXggPSBudWxsKSB7XG4gIGNvbnN0IHBhdGhPYmogPSBmb3JjZVBvc2l4ID8gcGF0aC5wb3NpeCA6IHBhdGg7XG4gIGZvciAoY29uc3QgcCBvZiBbb3JpZ2luYWxQYXRoLCByb290XSkge1xuICAgIGlmICghcGF0aE9iai5pc0Fic29sdXRlKHApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke3B9JyBpcyBleHBlY3RlZCB0byBiZSBhbiBhYnNvbHV0ZSBwYXRoYCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IG5vcm1hbGl6ZWRSb290ID0gcGF0aE9iai5ub3JtYWxpemUocm9vdCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aE9iai5ub3JtYWxpemUob3JpZ2luYWxQYXRoKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgobm9ybWFsaXplZFJvb3QpO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBwYXRocyBhcmUgcG9pbnRpbmcgdG8gdGhlIHNhbWUgZmlsZSBzeXN0ZW1cbiAqIGRlc3RpbmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoMSAtIEFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGggdG8gYSBmaWxlL2ZvbGRlclxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGgyIC0gQWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aCB0byBhIGZpbGUvZm9sZGVyXG4gKiBAcGFyYW0gey4uLnN0cmluZ30gcGF0aE4gLSBaZXJvIG9yIG1vcmUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aHMgdG8gZmlsZXMvZm9sZGVyc1xuICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IHRydWUgaWYgYWxsIHBhdGhzIGFyZSBwb2ludGluZyB0byB0aGUgc2FtZSBmaWxlIHN5c3RlbSBpdGVtXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzU2FtZURlc3RpbmF0aW9uKHBhdGgxLCBwYXRoMiwgLi4ucGF0aE4pIHtcbiAgY29uc3QgYWxsUGF0aHMgPSBbcGF0aDEsIHBhdGgyLCAuLi5wYXRoTl07XG4gIGlmICghKGF3YWl0IEIucmVkdWNlKGFsbFBhdGhzLCBhc3luYyAoYSwgYikgPT4gYSAmJiAoYXdhaXQgZnMuZXhpc3RzKGIpKSwgdHJ1ZSkpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgYXJlQWxsSXRlbXNFcXVhbCA9IChhcnIpID0+ICEhYXJyLnJlZHVjZSgoYSwgYikgPT4gKGEgPT09IGIgPyBhIDogTmFOKSk7XG4gIGlmIChhcmVBbGxJdGVtc0VxdWFsKGFsbFBhdGhzKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgbGV0IG1hcENiID0gYXN5bmMgKHgpID0+XG4gICAgKFxuICAgICAgYXdhaXQgZnMuc3RhdCh4LCB7XG4gICAgICAgIGJpZ2ludDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgKS5pbm87XG4gIHJldHVybiBhcmVBbGxJdGVtc0VxdWFsKGF3YWl0IEIubWFwKGFsbFBhdGhzLCBtYXBDYikpO1xufVxuXG4vKipcbiAqIENvZXJjZXMgdGhlIGdpdmVuIG51bWJlci9zdHJpbmcgdG8gYSB2YWxpZCB2ZXJzaW9uIHN0cmluZ1xuICpcbiAqIEB0ZW1wbGF0ZSB7Ym9vbGVhbn0gW1N0cmljdD10cnVlXVxuICogQHBhcmFtIHtzdHJpbmd9IHZlciAtIFZlcnNpb24gc3RyaW5nIHRvIGNvZXJjZVxuICogQHBhcmFtIHtTdHJpY3R9IFtzdHJpY3RdIC0gSWYgYHRydWVgIHRoZW4gYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duXG4gKiBpZiBgdmVyYCBjYW5ub3QgYmUgY29lcmNlZFxuICogQHJldHVybnMge1N0cmljdCBleHRlbmRzIHRydWUgPyBzdHJpbmcgOiBzdHJpbmd8bnVsbH0gQ29lcmNlZCB2ZXJzaW9uIG51bWJlciBvciBudWxsIGlmIHRoZSBzdHJpbmcgY2Fubm90IGJlXG4gKiBjb2VyY2VkIGFuZCBzdHJpY3QgbW9kZSBpcyBkaXNhYmxlZFxuICogQHRocm93cyB7RXJyb3J9IGlmIHN0cmljdCBtb2RlIGlzIGVuYWJsZWQgYW5kIGB2ZXJgIGNhbm5vdCBiZSBjb2VyY2VkXG4gKi9cbmZ1bmN0aW9uIGNvZXJjZVZlcnNpb24odmVyLCBzdHJpY3QgPSAvKiogQHR5cGUge1N0cmljdH0gKi8gKHRydWUpKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHNlbXZlci52YWxpZChzZW12ZXIuY29lcmNlKGAke3Zlcn1gKSk7XG4gIGlmIChzdHJpY3QgJiYgIXJlc3VsdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJyR7dmVyfScgY2Fubm90IGJlIGNvZXJjZWQgdG8gYSB2YWxpZCB2ZXJzaW9uIG51bWJlcmApO1xuICB9XG4gIHJldHVybiAvKiogQHR5cGUge1N0cmljdCBleHRlbmRzIHRydWUgPyBzdHJpbmcgOiBzdHJpbmc/fSAqLyAocmVzdWx0KTtcbn1cblxuY29uc3QgU1VQUE9SVEVEX09QRVJBVE9SUyA9IFsnPT0nLCAnIT0nLCAnPicsICc8JywgJz49JywgJzw9JywgJz0nXTtcblxuLyoqXG4gKiBDb21wYXJlcyB0d28gdmVyc2lvbiBzdHJpbmdzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZlcjEgLSBUaGUgZmlyc3QgdmVyc2lvbiBudW1iZXIgdG8gY29tcGFyZS4gU2hvdWxkIGJlIGEgdmFsaWRcbiAqIHZlcnNpb24gbnVtYmVyIHN1cHBvcnRlZCBieSBzZW12ZXIgcGFyc2VyLlxuICogQHBhcmFtIHtzdHJpbmd9IHZlcjIgLSBUaGUgc2Vjb25kIHZlcnNpb24gbnVtYmVyIHRvIGNvbXBhcmUuIFNob3VsZCBiZSBhIHZhbGlkXG4gKiB2ZXJzaW9uIG51bWJlciBzdXBwb3J0ZWQgYnkgc2VtdmVyIHBhcnNlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRvciAtIE9uZSBvZiBzdXBwb3J0ZWQgdmVyc2lvbiBudW1iZXIgb3BlcmF0b3JzOlxuICogPT0sICE9LCA+LCA8LCA8PSwgPj0sID1cbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIG9yIGZhbHNlIGRlcGVuZGluZyBvbiB0aGUgYWN0dWFsIGNvbXBhcmlzb24gcmVzdWx0XG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgYW4gdW5zdXBwb3J0ZWQgb3BlcmF0b3IgaXMgc3VwcGxpZWQgb3IgYW55IG9mIHRoZSBzdXBwbGllZFxuICogdmVyc2lvbiBzdHJpbmdzIGNhbm5vdCBiZSBjb2VyY2VkXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyh2ZXIxLCBvcGVyYXRvciwgdmVyMikge1xuICBpZiAoIVNVUFBPUlRFRF9PUEVSQVRPUlMuaW5jbHVkZXMob3BlcmF0b3IpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSAnJHtvcGVyYXRvcn0nIGNvbXBhcmlzb24gb3BlcmF0b3IgaXMgbm90IHN1cHBvcnRlZC4gYCArXG4gICAgICAgIGBPbmx5ICcke0pTT04uc3RyaW5naWZ5KFNVUFBPUlRFRF9PUEVSQVRPUlMpfScgb3BlcmF0b3JzIGFyZSBzdXBwb3J0ZWRgXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHNlbXZlck9wZXJhdG9yID0gWyc9PScsICchPSddLmluY2x1ZGVzKG9wZXJhdG9yKSA/ICc9JyA6IG9wZXJhdG9yO1xuICBjb25zdCByZXN1bHQgPSBzZW12ZXIuc2F0aXNmaWVzKGNvZXJjZVZlcnNpb24odmVyMSksIGAke3NlbXZlck9wZXJhdG9yfSR7Y29lcmNlVmVyc2lvbih2ZXIyKX1gKTtcbiAgcmV0dXJuIG9wZXJhdG9yID09PSAnIT0nID8gIXJlc3VsdCA6IHJlc3VsdDtcbn1cblxuLyoqXG4gKiBBZGQgYXBwcm9wcmlhdGUgcXVvdGVzIHRvIGNvbW1hbmQgYXJndW1lbnRzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3N1YnN0YWNrL25vZGUtc2hlbGwtcXVvdGVcbiAqIGZvciBtb3JlIGRldGFpbHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gYXJncyAtIFRoZSBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhcnNlZFxuICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgYXJndW1lbnRzLCBxdW90ZWRcbiAqL1xuZnVuY3Rpb24gcXVvdGUoYXJncykge1xuICByZXR1cm4gc2hlbGxRdW90ZShfLmNhc3RBcnJheShhcmdzKSk7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBuZWNlc3NhcnkgdG8gd29ya2Fyb3VuZCB1bmV4cGVjdGVkIG1lbW9yeSBsZWFrc1xuICogY2F1c2VkIGJ5IE5vZGVKUyBzdHJpbmcgaW50ZXJuaW5nXG4gKiBiZWhhdmlvciBkZXNjcmliZWQgaW4gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9Mjg2OVxuICpcbiAqIEBwYXJhbSB7Kn0gcyAtIFRoZSBzdHJpbmcgdG8gdW5sZWFrXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEVpdGhlciB0aGUgdW5sZWFrZWQgc3RyaW5nIG9yIHRoZSBvcmlnaW5hbCBvYmplY3QgY29udmVydGVkIHRvIHN0cmluZ1xuICovXG5mdW5jdGlvbiB1bmxlYWtTdHJpbmcocykge1xuICByZXR1cm4gYCAke3N9YC5zdWJzdHIoMSk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYgUGx1cmFsaXplT3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbaW5jbHVzaXZlPWZhbHNlXSAtIFdoZXRoZXIgdG8gcHJlZml4IHdpdGggdGhlIG51bWJlciAoZS5nLiwgMyBkdWNrcylcbiAqL1xuXG4vKipcbiAqIEdldCB0aGUgZm9ybSBvZiBhIHdvcmQgYXBwcm9wcmlhdGUgdG8gdGhlIGNvdW50XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHdvcmQgLSBUaGUgd29yZCB0byBwbHVyYWxpemVcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIEhvdyBtYW55IG9mIHRoZSB3b3JkIGV4aXN0XG4gKiBAcGFyYW0ge1BsdXJhbGl6ZU9wdGlvbnN8Ym9vbGVhbn0gb3B0aW9ucyAtIG9wdGlvbnMgZm9yIHdvcmQgcGx1cmFsaXphdGlvbixcbiAqICAgb3IgYSBib29sZWFuIGluZGljYXRpbmcgdGhlIG9wdGlvbnMuaW5jbHVzaXZlIHByb3BlcnR5XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgd29yZCBwbHVyYWxpemVkIGFjY29yZGluZyB0byB0aGUgbnVtYmVyXG4gKi9cbmZ1bmN0aW9uIHBsdXJhbGl6ZSh3b3JkLCBjb3VudCwgb3B0aW9ucyA9IHt9KSB7XG4gIGxldCBpbmNsdXNpdmUgPSBmYWxzZTtcbiAgaWYgKF8uaXNCb29sZWFuKG9wdGlvbnMpKSB7XG4gICAgLy8gaWYgcGFzc2VkIGluIGFzIGEgYm9vbGVhblxuICAgIGluY2x1c2l2ZSA9IG9wdGlvbnM7XG4gIH0gZWxzZSBpZiAoXy5pc0Jvb2xlYW4ob3B0aW9ucz8uaW5jbHVzaXZlKSkge1xuICAgIC8vIGlmIHBhc3NlZCBpbiBhcyBhbiBvcHRpb25zIGhhc2hcbiAgICBpbmNsdXNpdmUgPSBvcHRpb25zLmluY2x1c2l2ZTtcbiAgfVxuICByZXR1cm4gcGx1cmFsaXplTGliKHdvcmQsIGNvdW50LCBpbmNsdXNpdmUpO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIEVuY29kaW5nT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhTaXplPTEwNzM3NDE4MjRdIFRoZSBtYXhpbXVtIHNpemUgb2ZcbiAqIHRoZSByZXN1bHRpbmcgYnVmZmVyIGluIGJ5dGVzLiBUaGlzIGlzIHNldCB0byAxR0IgYnkgZGVmYXVsdCwgYmVjYXVzZVxuICogQXBwaXVtIGxpbWl0cyB0aGUgbWF4aW11bSBIVFRQIGJvZHkgc2l6ZSB0byAxR0IuIEFsc28sIHRoZSBOb2RlSlMgaGVhcFxuICogc2l6ZSBtdXN0IGJlIGVub3VnaCB0byBrZWVwIHRoZSByZXN1bHRpbmcgb2JqZWN0ICh1c3VhbGx5IHRoaXMgc2l6ZSBpc1xuICogbGltaXRlZCB0byAxLjQgR0IpXG4gKi9cblxuLyoqXG4gKiBDb252ZXJ0cyBjb250ZW50cyBvZiBhIGxvY2FsIGZpbGUgdG8gYW4gaW4tbWVtb3J5IGJhc2UtNjQgZW5jb2RlZCBidWZmZXIuXG4gKiBUaGUgb3BlcmF0aW9uIGlzIG1lbW9yeS11c2FnZSBmcmllbmRseSBhbmQgc2hvdWxkIGJlIHVzZWQgd2hpbGUgZW5jb2RpbmdcbiAqIGxhcmdlIGZpbGVzIHRvIGJhc2U2NFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcmNQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIGZpbGUgYmVpbmcgZW5jb2RlZFxuICogQHBhcmFtIHtFbmNvZGluZ09wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPEJ1ZmZlcj59IGJhc2U2NC1lbmNvZGVkIGNvbnRlbnQgb2YgdGhlIHNvdXJjZSBmaWxlIGFzIG1lbW9yeSBidWZmZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgcmVhZGluZyB0aGUgc291cmNlIGZpbGVcbiAqIG9yIHRoZSBzb3VyY2UgZmlsZSBpcyB0b29cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdG9Jbk1lbW9yeUJhc2U2NChzcmNQYXRoLCBvcHRzID0ge30pIHtcbiAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKHNyY1BhdGgpKSB8fCAoYXdhaXQgZnMuc3RhdChzcmNQYXRoKSkuaXNEaXJlY3RvcnkoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gc3VjaCBmaWxlOiAke3NyY1BhdGh9YCk7XG4gIH1cblxuICBjb25zdCB7bWF4U2l6ZSA9IDEgKiBHaUJ9ID0gb3B0cztcbiAgY29uc3QgcmVzdWx0QnVmZmVycyA9IFtdO1xuICBsZXQgcmVzdWx0QnVmZmVyc1NpemUgPSAwO1xuICBjb25zdCByZXN1bHRXcml0ZVN0cmVhbSA9IG5ldyBzdHJlYW0uV3JpdGFibGUoe1xuICAgIHdyaXRlOiAoYnVmZmVyLCBlbmNvZGluZywgbmV4dCkgPT4ge1xuICAgICAgcmVzdWx0QnVmZmVycy5wdXNoKGJ1ZmZlcik7XG4gICAgICByZXN1bHRCdWZmZXJzU2l6ZSArPSBidWZmZXIubGVuZ3RoO1xuICAgICAgaWYgKG1heFNpemUgPiAwICYmIHJlc3VsdEJ1ZmZlcnNTaXplID4gbWF4U2l6ZSkge1xuICAgICAgICByZXN1bHRXcml0ZVN0cmVhbS5lbWl0KFxuICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRoZSBzaXplIG9mIHRoZSByZXN1bHRpbmcgYCArXG4gICAgICAgICAgICAgIGBidWZmZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuICR7dG9SZWFkYWJsZVNpemVTdHJpbmcobWF4U2l6ZSl9YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG5leHQoKTtcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCByZWFkZXJTdHJlYW0gPSBmcy5jcmVhdGVSZWFkU3RyZWFtKHNyY1BhdGgpO1xuICBjb25zdCBiYXNlNjRFbmNvZGVyU3RyZWFtID0gbmV3IEJhc2U2NEVuY29kZSgpO1xuICBjb25zdCByZXN1bHRXcml0ZVN0cmVhbVByb21pc2UgPSBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgcmVzdWx0V3JpdGVTdHJlYW0ub25jZSgnZXJyb3InLCAoZSkgPT4ge1xuICAgICAgcmVhZGVyU3RyZWFtLnVucGlwZShiYXNlNjRFbmNvZGVyU3RyZWFtKTtcbiAgICAgIGJhc2U2NEVuY29kZXJTdHJlYW0udW5waXBlKHJlc3VsdFdyaXRlU3RyZWFtKTtcbiAgICAgIHJlYWRlclN0cmVhbS5kZXN0cm95KCk7XG4gICAgICByZWplY3QoZSk7XG4gICAgfSk7XG4gICAgcmVzdWx0V3JpdGVTdHJlYW0ub25jZSgnZmluaXNoJywgcmVzb2x2ZSk7XG4gIH0pO1xuICBjb25zdCByZWFkU3RyZWFtUHJvbWlzZSA9IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICByZWFkZXJTdHJlYW0ub25jZSgnY2xvc2UnLCByZXNvbHZlKTtcbiAgICByZWFkZXJTdHJlYW0ub25jZSgnZXJyb3InLCAoZSkgPT5cbiAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byByZWFkICcke3NyY1BhdGh9JzogJHtlLm1lc3NhZ2V9YCkpXG4gICAgKTtcbiAgfSk7XG4gIHJlYWRlclN0cmVhbS5waXBlKGJhc2U2NEVuY29kZXJTdHJlYW0pO1xuICBiYXNlNjRFbmNvZGVyU3RyZWFtLnBpcGUocmVzdWx0V3JpdGVTdHJlYW0pO1xuXG4gIGF3YWl0IEIuYWxsKFtyZWFkU3RyZWFtUHJvbWlzZSwgcmVzdWx0V3JpdGVTdHJlYW1Qcm9taXNlXSk7XG4gIHJldHVybiBCdWZmZXIuY29uY2F0KHJlc3VsdEJ1ZmZlcnMpO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIExvY2tGaWxlT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0PTEyMF0gVGhlIG1heCB0aW1lIGluIHNlY29uZHMgdG8gd2FpdCBmb3IgdGhlIGxvY2tcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyeVJlY292ZXJ5PWZhbHNlXSBXaGV0aGVyIHRvIHRyeSBsb2NrIHJlY292ZXJ5IGlmXG4gKiB0aGUgZmlyc3QgYXR0ZW1wdCB0byBhY3F1aXJlIGl0IHRpbWVkIG91dC5cbiAqL1xuXG4vKipcbiAqIENyZWF0ZSBhbiBhc3luYyBmdW5jdGlvbiB3aGljaCwgd2hlbiBjYWxsZWQsIHdpbGwgbm90IHByb2NlZWQgdW50aWwgYSBjZXJ0YWluIGZpbGUgaXMgbm9cbiAqIGxvbmdlciBwcmVzZW50IG9uIHRoZSBzeXN0ZW0uIFRoaXMgYWxsb3dzIGZvciBwcmV2ZW50aW5nIGNvbmN1cnJlbnQgYmVoYXZpb3IgYWNyb3NzIHByb2Nlc3Nlc1xuICogdXNpbmcgYSBrbm93biBsb2NrZmlsZSBwYXRoLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9ja0ZpbGUgVGhlIGZ1bGwgcGF0aCB0byB0aGUgZmlsZSB1c2VkIGZvciB0aGUgbG9ja1xuICogQHBhcmFtIHtMb2NrRmlsZU9wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIGFzeW5jIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYW5vdGhlciBhc3luYyBmdW5jdGlvbiBkZWZpbmluZyB0aGUgbG9ja2VkXG4gKiBiZWhhdmlvclxuICovXG5mdW5jdGlvbiBnZXRMb2NrRmlsZUd1YXJkKGxvY2tGaWxlLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge3RpbWVvdXQgPSAxMjAsIHRyeVJlY292ZXJ5ID0gZmFsc2V9ID0gb3B0cztcblxuICBjb25zdCBsb2NrID0gLyoqIEB0eXBlIHsobG9ja2ZpbGU6IHN0cmluZywgb3B0czogaW1wb3J0KCdsb2NrZmlsZScpLk9wdGlvbnMpPT5CPHZvaWQ+fSAqLyAoXG4gICAgQi5wcm9taXNpZnkoX2xvY2tmaWxlLmxvY2spXG4gICk7XG4gIGNvbnN0IGNoZWNrID0gQi5wcm9taXNpZnkoX2xvY2tmaWxlLmNoZWNrKTtcbiAgY29uc3QgdW5sb2NrID0gQi5wcm9taXNpZnkoX2xvY2tmaWxlLnVubG9jayk7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBUfSBiZWhhdmlvclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn1cbiAgICovXG4gIGNvbnN0IGd1YXJkID0gYXN5bmMgKGJlaGF2aW9yKSA9PiB7XG4gICAgbGV0IHRyaWVkUmVjb3ZlcnkgPSBmYWxzZTtcbiAgICBkbyB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBpZiB0aGUgbG9ja2ZpbGUgZG9lc24ndCBleGlzdCwgbG9jayBpdCBzeW5jaHJvbm91c2x5IHRvIG1ha2Ugc3VyZSBubyBvdGhlciBjYWxsXG4gICAgICAgIC8vIG9uIHRoZSBzYW1lIHNwaW4gb2YgdGhlIGV2ZW50IGxvb3AgY2FuIGFsc28gaW5pdGlhdGUgYSBsb2NrLiBJZiB0aGUgbG9ja2ZpbGUgZG9lcyBleGlzdFxuICAgICAgICAvLyB0aGVuIGp1c3QgdXNlIHRoZSByZWd1bGFyIGFzeW5jICdsb2NrJyBtZXRob2Qgd2hpY2ggd2lsbCB3YWl0IG9uIHRoZSBsb2NrLlxuICAgICAgICBpZiAoX2xvY2tmaWxlLmNoZWNrU3luYyhsb2NrRmlsZSkpIHtcbiAgICAgICAgICBhd2FpdCBsb2NrKGxvY2tGaWxlLCB7d2FpdDogdGltZW91dCAqIDEwMDB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfbG9ja2ZpbGUubG9ja1N5bmMobG9ja0ZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoXy5pbmNsdWRlcyhlLm1lc3NhZ2UsICdFRVhJU1QnKSAmJiB0cnlSZWNvdmVyeSAmJiAhdHJpZWRSZWNvdmVyeSkge1xuICAgICAgICAgIC8vIFRoZXJlIGNvdWxkIGJlIGNhc2VzIHdoZXJlIGEgcHJvY2VzcyBoYXMgYmVlbiBmb3JjZWZ1bGx5IHRlcm1pbmF0ZWRcbiAgICAgICAgICAvLyB3aXRob3V0IGEgY2hhbmNlIHRvIGNsZWFuIHVwIHBlbmRpbmcgbG9ja3M6IGh0dHBzOi8vZ2l0aHViLmNvbS9ucG0vbG9ja2ZpbGUvaXNzdWVzLzI2XG4gICAgICAgICAgX2xvY2tmaWxlLnVubG9ja1N5bmMobG9ja0ZpbGUpO1xuICAgICAgICAgIHRyaWVkUmVjb3ZlcnkgPSB0cnVlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ291bGQgbm90IGFjcXVpcmUgbG9jayBvbiAnJHtsb2NrRmlsZX0nIGFmdGVyICR7dGltZW91dH1zLiBgICtcbiAgICAgICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnN0YW50LWNvbmRpdGlvblxuICAgIH0gd2hpbGUgKHRydWUpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgYmVoYXZpb3IoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gd2hldGhlciB0aGUgYmVoYXZpb3Igc3VjY2VlZGVkIG9yIG5vdCwgZ2V0IHJpZCBvZiB0aGUgbG9ja1xuICAgICAgYXdhaXQgdW5sb2NrKGxvY2tGaWxlKTtcbiAgICB9XG4gIH07XG5cbiAgZ3VhcmQuY2hlY2sgPSBhc3luYyAoKSA9PiBhd2FpdCBjaGVjayhsb2NrRmlsZSk7XG5cbiAgcmV0dXJuIGd1YXJkO1xufVxuXG5leHBvcnQge1xuICBoYXNWYWx1ZSxcbiAgZXNjYXBlU3BhY2UsXG4gIGVzY2FwZVNwZWNpYWxDaGFycyxcbiAgbG9jYWxJcCxcbiAgY2FuY2VsbGFibGVEZWxheSxcbiAgbXVsdGlSZXNvbHZlLFxuICBzYWZlSnNvblBhcnNlLFxuICB3cmFwRWxlbWVudCxcbiAgdW53cmFwRWxlbWVudCxcbiAgZmlsdGVyT2JqZWN0LFxuICB0b1JlYWRhYmxlU2l6ZVN0cmluZyxcbiAgaXNTdWJQYXRoLFxuICBXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUixcbiAgaXNTYW1lRGVzdGluYXRpb24sXG4gIGNvbXBhcmVWZXJzaW9ucyxcbiAgY29lcmNlVmVyc2lvbixcbiAgcXVvdGUsXG4gIHVubGVha1N0cmluZyxcbiAganNvblN0cmluZ2lmeSxcbiAgcGx1cmFsaXplLFxuICBHaUIsXG4gIE1pQixcbiAgS2lCLFxuICB0b0luTWVtb3J5QmFzZTY0LFxuICB1dWlkVjEsXG4gIHV1aWRWMyxcbiAgdXVpZFY0LFxuICB1dWlkVjUsXG4gIHNoZWxsUGFyc2UsXG4gIGdldExvY2tGaWxlR3VhcmQsXG59O1xuXG4vKipcbiAqIEEgYHN0cmluZ2Agd2hpY2ggaXMgbmV2ZXIgYCcnYC5cbiAqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gVFxuICogQHR5cGVkZWYge1QgZXh0ZW5kcyAnJyA/IG5ldmVyIDogVH0gTm9uRW1wdHlTdHJpbmdcbiAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFLQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFPQTs7QUFFQSxNQUFNQSwwQkFBMEIsR0FBRyxxQ0FBbkM7O0FBQ0EsTUFBTUMsR0FBRyxHQUFHLElBQVo7O0FBQ0EsTUFBTUMsR0FBRyxHQUFHRCxHQUFHLEdBQUcsSUFBbEI7O0FBQ0EsTUFBTUUsR0FBRyxH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
|
|
417
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUiIsIktpQiIsIk1pQiIsIkdpQiIsImhhc0NvbnRlbnQiLCJ2YWwiLCJfIiwiaXNTdHJpbmciLCJoYXNWYWx1ZSIsImlzTnVtYmVyIiwiaXNOYU4iLCJpc1VuZGVmaW5lZCIsImlzTnVsbCIsImVzY2FwZVNwYWNlIiwic3RyIiwic3BsaXQiLCJqb2luIiwiZXNjYXBlU3BlY2lhbENoYXJzIiwicXVvdGVFc2NhcGUiLCJyZXBsYWNlIiwicmUiLCJSZWdFeHAiLCJsb2NhbElwIiwiaXAiLCJjaGFpbiIsIm9zIiwibmV0d29ya0ludGVyZmFjZXMiLCJ2YWx1ZXMiLCJmbGF0dGVuIiwiZmlsdGVyIiwiZmFtaWx5IiwiaW50ZXJuYWwiLCJtYXAiLCJmaXJzdCIsInZhbHVlIiwiY2FuY2VsbGFibGVEZWxheSIsIm1zIiwidGltZXIiLCJyZXNvbHZlIiwicmVqZWN0IiwiZGVsYXkiLCJCIiwiUHJvbWlzZSIsIl9yZXNvbHZlIiwiX3JlamVjdCIsInNldFRpbWVvdXQiLCJjYW5jZWwiLCJjbGVhclRpbWVvdXQiLCJDYW5jZWxsYXRpb25FcnJvciIsIm11bHRpUmVzb2x2ZSIsInJvb3RzIiwiYXJncyIsInJvb3QiLCJwYXRoIiwic2FmZUpzb25QYXJzZSIsIm9iaiIsIkpTT04iLCJwYXJzZSIsImlnbiIsImpzb25TdHJpbmdpZnkiLCJyZXBsYWNlciIsInNwYWNlIiwiaXNGdW5jdGlvbiIsImsiLCJ2IiwiYnVmZmVyVG9KU09OIiwiQnVmZmVyIiwicHJvdG90eXBlIiwidG9KU09OIiwic3RyaW5naWZ5Iiwia2V5IiwidXBkYXRlZFZhbHVlIiwiaXNCdWZmZXIiLCJ0b1N0cmluZyIsInVud3JhcEVsZW1lbnQiLCJlbCIsInByb3BOYW1lIiwiaGFzIiwid3JhcEVsZW1lbnQiLCJlbGVtZW50SWQiLCJFTEVNRU5UIiwiZmlsdGVyT2JqZWN0IiwicHJlZGljYXRlIiwibmV3T2JqIiwiY2xvbmUiLCJ2YWx1ZVByZWRpY2F0ZSIsIk9iamVjdCIsImtleXMiLCJ0b1JlYWRhYmxlU2l6ZVN0cmluZyIsImJ5dGVzIiwiaW50Qnl0ZXMiLCJwYXJzZUludCIsIlN0cmluZyIsIkVycm9yIiwidG9GaXhlZCIsImlzU3ViUGF0aCIsIm9yaWdpbmFsUGF0aCIsImZvcmNlUG9zaXgiLCJwYXRoT2JqIiwicG9zaXgiLCJwIiwiaXNBYnNvbHV0ZSIsIm5vcm1hbGl6ZWRSb290Iiwibm9ybWFsaXplIiwibm9ybWFsaXplZFBhdGgiLCJzdGFydHNXaXRoIiwiaXNTYW1lRGVzdGluYXRpb24iLCJwYXRoMSIsInBhdGgyIiwicGF0aE4iLCJhbGxQYXRocyIsInJlZHVjZSIsImEiLCJiIiwiZnMiLCJleGlzdHMiLCJhcmVBbGxJdGVtc0VxdWFsIiwiYXJyIiwiTmFOIiwibWFwQ2IiLCJ4Iiwic3RhdCIsImJpZ2ludCIsImlubyIsImNvZXJjZVZlcnNpb24iLCJ2ZXIiLCJzdHJpY3QiLCJyZXN1bHQiLCJzZW12ZXIiLCJ2YWxpZCIsImNvZXJjZSIsIlNVUFBPUlRFRF9PUEVSQVRPUlMiLCJjb21wYXJlVmVyc2lvbnMiLCJ2ZXIxIiwib3BlcmF0b3IiLCJ2ZXIyIiwiaW5jbHVkZXMiLCJzZW12ZXJPcGVyYXRvciIsInNhdGlzZmllcyIsInF1b3RlIiwic2hlbGxRdW90ZSIsImNhc3RBcnJheSIsInVubGVha1N0cmluZyIsInMiLCJzdWJzdHIiLCJwbHVyYWxpemUiLCJ3b3JkIiwiY291bnQiLCJvcHRpb25zIiwiaW5jbHVzaXZlIiwiaXNCb29sZWFuIiwicGx1cmFsaXplTGliIiwidG9Jbk1lbW9yeUJhc2U2NCIsInNyY1BhdGgiLCJvcHRzIiwiaXNEaXJlY3RvcnkiLCJtYXhTaXplIiwicmVzdWx0QnVmZmVycyIsInJlc3VsdEJ1ZmZlcnNTaXplIiwicmVzdWx0V3JpdGVTdHJlYW0iLCJzdHJlYW0iLCJXcml0YWJsZSIsIndyaXRlIiwiYnVmZmVyIiwiZW5jb2RpbmciLCJuZXh0IiwicHVzaCIsImxlbmd0aCIsImVtaXQiLCJyZWFkZXJTdHJlYW0iLCJjcmVhdGVSZWFkU3RyZWFtIiwiYmFzZTY0RW5jb2RlclN0cmVhbSIsIkJhc2U2NEVuY29kZSIsInJlc3VsdFdyaXRlU3RyZWFtUHJvbWlzZSIsIm9uY2UiLCJlIiwidW5waXBlIiwiZGVzdHJveSIsInJlYWRTdHJlYW1Qcm9taXNlIiwibWVzc2FnZSIsInBpcGUiLCJhbGwiLCJjb25jYXQiLCJnZXRMb2NrRmlsZUd1YXJkIiwibG9ja0ZpbGUiLCJ0aW1lb3V0IiwidHJ5UmVjb3ZlcnkiLCJsb2NrIiwicHJvbWlzaWZ5IiwiX2xvY2tmaWxlIiwiY2hlY2siLCJ1bmxvY2siLCJndWFyZCIsImJlaGF2aW9yIiwidHJpZWRSZWNvdmVyeSIsImNoZWNrU3luYyIsIndhaXQiLCJsb2NrU3luYyIsInVubG9ja1N5bmMiXSwic291cmNlcyI6WyIuLi8uLi9saWIvdXRpbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGZzIGZyb20gJy4vZnMnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHtcbiAgLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2Uvc2hlbGwtcXVvdGVcbiAgcXVvdGUgYXMgc2hlbGxRdW90ZSxcbiAgcGFyc2UgYXMgc2hlbGxQYXJzZSxcbn0gZnJvbSAnc2hlbGwtcXVvdGUnO1xuaW1wb3J0IHBsdXJhbGl6ZUxpYiBmcm9tICdwbHVyYWxpemUnO1xuaW1wb3J0IHN0cmVhbSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHtCYXNlNjRFbmNvZGV9IGZyb20gJ2Jhc2U2NC1zdHJlYW0nO1xuaW1wb3J0IHtcbiAgLy8gaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvdXVpZFxuICB2MSBhcyB1dWlkVjEsXG4gIHYzIGFzIHV1aWRWMyxcbiAgdjQgYXMgdXVpZFY0LFxuICB2NSBhcyB1dWlkVjUsXG59IGZyb20gJ3V1aWQnO1xuaW1wb3J0IF9sb2NrZmlsZSBmcm9tICdsb2NrZmlsZSc7XG5cbmNvbnN0IFczQ19XRUJfRUxFTUVOVF9JREVOVElGSUVSID0gJ2VsZW1lbnQtNjA2Ni0xMWU0LWE1MmUtNGY3MzU0NjZjZWNmJztcbmNvbnN0IEtpQiA9IDEwMjQ7XG5jb25zdCBNaUIgPSBLaUIgKiAxMDI0O1xuY29uc3QgR2lCID0gTWlCICogMTAyNDtcblxuLyoqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gVFxuICogQHBhcmFtIHtUfSB2YWxcbiAqIEByZXR1cm5zIHt2YWwgaXMgTm9uRW1wdHlTdHJpbmc8VD59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNDb250ZW50KHZhbCkge1xuICByZXR1cm4gXy5pc1N0cmluZyh2YWwpICYmIHZhbCAhPT0gJyc7XG59XG5cbi8qKlxuICogcmV0dXJuIHRydWUgaWYgdGhlIHRoZSB2YWx1ZSBpcyBub3QgYHVuZGVmaW5lZGAsIGBudWxsYCwgb3IgYE5hTmAuXG4gKlxuICogWFhYOiBgTmFOYCBpcyBub3QgZXhwcmVzc2libGUgaW4gVHlwZVNjcmlwdC5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHZhbFxuICogQHJldHVybnMge3ZhbCBpcyBOb25OdWxsYWJsZTxUPn1cbiAqL1xuZnVuY3Rpb24gaGFzVmFsdWUodmFsKSB7XG4gIC8vIGF2b2lkIGluY29ycmVjdGx5IGV2YWx1YXRpbmcgYDBgIGFzIGZhbHNlXG4gIGlmIChfLmlzTnVtYmVyKHZhbCkpIHtcbiAgICByZXR1cm4gIV8uaXNOYU4odmFsKTtcbiAgfVxuICByZXR1cm4gIV8uaXNVbmRlZmluZWQodmFsKSAmJiAhXy5pc051bGwodmFsKTtcbn1cblxuLy8gZXNjYXBlIHNwYWNlcyBpbiBzdHJpbmcsIGZvciBjb21tYW5kbGluZSBjYWxsc1xuZnVuY3Rpb24gZXNjYXBlU3BhY2Uoc3RyKSB7XG4gIHJldHVybiBzdHIuc3BsaXQoLyAvKS5qb2luKCdcXFxcICcpO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVTcGVjaWFsQ2hhcnMoc3RyLCBxdW90ZUVzY2FwZSkge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIGlmICh0eXBlb2YgcXVvdGVFc2NhcGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcXVvdGVFc2NhcGUgPSBmYWxzZTtcbiAgfVxuICBzdHIgPSBzdHJcbiAgICAucmVwbGFjZSgvW1xcXFxdL2csICdcXFxcXFxcXCcpXG4gICAgLnJlcGxhY2UoL1tcXC9dL2csICdcXFxcLycpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcbiAgICAucmVwbGFjZSgvW1xcYl0vZywgJ1xcXFxiJylcbiAgICAucmVwbGFjZSgvW1xcZl0vZywgJ1xcXFxmJylcbiAgICAucmVwbGFjZSgvW1xcbl0vZywgJ1xcXFxuJylcbiAgICAucmVwbGFjZSgvW1xccl0vZywgJ1xcXFxyJylcbiAgICAucmVwbGFjZSgvW1xcdF0vZywgJ1xcXFx0JylcbiAgICAucmVwbGFjZSgvW1xcXCJdL2csICdcXFxcXCInKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4gICAgLnJlcGxhY2UoL1xcXFwnL2csIFwiXFxcXCdcIik7XG4gIGlmIChxdW90ZUVzY2FwZSkge1xuICAgIGxldCByZSA9IG5ldyBSZWdFeHAocXVvdGVFc2NhcGUsICdnJyk7XG4gICAgc3RyID0gc3RyLnJlcGxhY2UocmUsIGBcXFxcJHtxdW90ZUVzY2FwZX1gKTtcbiAgfVxuICByZXR1cm4gc3RyO1xufVxuXG5mdW5jdGlvbiBsb2NhbElwKCkge1xuICBsZXQgaXAgPSBfLmNoYWluKG9zLm5ldHdvcmtJbnRlcmZhY2VzKCkpXG4gICAgLnZhbHVlcygpXG4gICAgLmZsYXR0ZW4oKVxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICAuZmlsdGVyKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHJldHVybiB2YWwuZmFtaWx5ID09PSAnSVB2NCcgJiYgdmFsLmludGVybmFsID09PSBmYWxzZTtcbiAgICB9KVxuICAgIC5tYXAoJ2FkZHJlc3MnKVxuICAgIC5maXJzdCgpXG4gICAgLnZhbHVlKCk7XG4gIHJldHVybiBpcDtcbn1cblxuLypcbiAqIENyZWF0ZXMgYSBwcm9taXNlIHRoYXQgaXMgY2FuY2VsbGFibGUsIGFuZCB3aWxsIHRpbWVvdXRcbiAqIGFmdGVyIGBtc2AgZGVsYXlcbiAqL1xuZnVuY3Rpb24gY2FuY2VsbGFibGVEZWxheShtcykge1xuICBsZXQgdGltZXI7XG4gIGxldCByZXNvbHZlO1xuICBsZXQgcmVqZWN0O1xuXG4gIGNvbnN0IGRlbGF5ID0gbmV3IEIuUHJvbWlzZSgoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcbiAgICByZXNvbHZlID0gX3Jlc29sdmU7XG4gICAgcmVqZWN0ID0gX3JlamVjdDtcbiAgICB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0sIG1zKTtcbiAgfSk7XG5cbiAgLy8gb3ZlcnJpZGUgQmx1ZWJpcmQncyBgY2FuY2VsYCwgd2hpY2ggZG9lcyBub3Qgd29yayB3aGVuIHVzaW5nIGBhd2FpdGAgb25cbiAgLy8gYSBwcm9taXNlLCBzaW5jZSBgcmVzb2x2ZWAvYHJlamVjdGAgYXJlIG5ldmVyIGNhbGxlZFxuICBkZWxheS5jYW5jZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICByZWplY3QobmV3IEIuQ2FuY2VsbGF0aW9uRXJyb3IoKSk7XG4gIH07XG4gIHJldHVybiBkZWxheTtcbn1cblxuZnVuY3Rpb24gbXVsdGlSZXNvbHZlKHJvb3RzLCAuLi5hcmdzKSB7XG4gIHJldHVybiByb290cy5tYXAoKHJvb3QpID0+IHBhdGgucmVzb2x2ZShyb290LCAuLi5hcmdzKSk7XG59XG5cbi8qXG4gKiBQYXJzZXMgYW4gb2JqZWN0IGlmIHBvc3NpYmxlLiBPdGhlcndpc2UgcmV0dXJucyB0aGUgb2JqZWN0IHdpdGhvdXQgcGFyc2luZy5cbiAqL1xuZnVuY3Rpb24gc2FmZUpzb25QYXJzZShvYmopIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShvYmopO1xuICB9IGNhdGNoIChpZ24pIHtcbiAgICAvLyBpZ25vcmU6IHRoaXMgaXMgbm90IGpzb24gcGFyc2FibGVcbiAgICByZXR1cm4gb2JqO1xuICB9XG59XG5cbi8qXG4gKiBTdHJpbmdpZmllcyB0aGUgb2JqZWN0IHBhc3NlZCBpbiwgY29udmVydGluZyBCdWZmZXJzIGludG8gU3RyaW5ncyBmb3IgYmV0dGVyXG4gKiBkaXNwbGF5LiBUaGlzIG1pbWljcyBKU09OLnN0cmluZ2lmeSAoc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0pTT04vc3RyaW5naWZ5KVxuICogZXhjZXB0IHRoZSBgcmVwbGFjZXJgIGFyZ3VtZW50IGNhbiBvbmx5IGJlIGEgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9iaiAtIHRoZSBvYmplY3QgdG8gYmUgc2VyaWFsaXplZFxuICogQHBhcmFtIHs/ZnVuY3Rpb259IHJlcGxhY2VyIC0gZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHRoZSBwcm9wZXJ0aWVzIGFkZGVkIHRvIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZCBvYmplY3RcbiAqIEBwYXJhbSB7P251bWJlcnxzdHJpbmd9IHNwYWNlIC0gdXNlZCB0byBpbnNlcnQgd2hpdGUgc3BhY2UgaW50byB0aGUgb3V0cHV0IEpTT05cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZvciByZWFkYWJpbGl0eSBwdXJwb3Nlcy4gRGVmYXVsdHMgdG8gMlxuICogcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBKU09OIG9iamVjdCBzZXJpYWxpemVkIGFzIGEgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGpzb25TdHJpbmdpZnkob2JqLCByZXBsYWNlciwgc3BhY2UgPSAyKSB7XG4gIC8vIGlmIG5vIHJlcGxhY2VyIGlzIHBhc3NlZCwgb3IgaXQgaXMgbm90IGEgZnVuY3Rpb24sIGp1c3QgdXNlIGEgcGFzcy10aHJvdWdoXG4gIGlmICghXy5pc0Z1bmN0aW9uKHJlcGxhY2VyKSkge1xuICAgIHJlcGxhY2VyID0gKGssIHYpID0+IHY7XG4gIH1cblxuICAvLyBCdWZmZXJzIGNhbm5vdCBiZSBzZXJpYWxpemVkIGluIGEgcmVhZGFibGUgd2F5XG4gIGNvbnN0IGJ1ZmZlclRvSlNPTiA9IEJ1ZmZlci5wcm90b3R5cGUudG9KU09OO1xuICBkZWxldGUgQnVmZmVyLnByb3RvdHlwZS50b0pTT047XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFxuICAgICAgb2JqLFxuICAgICAgKGtleSwgdmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlZFZhbHVlID0gQnVmZmVyLmlzQnVmZmVyKHZhbHVlKSA/IHZhbHVlLnRvU3RyaW5nKCd1dGY4JykgOiB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHJlcGxhY2VyKGtleSwgdXBkYXRlZFZhbHVlKTtcbiAgICAgIH0sXG4gICAgICBzcGFjZVxuICAgICk7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gcmVzdG9yZSB0aGUgZnVuY3Rpb24sIHNvIGFzIHRvIG5vdCBicmVhayBmdXJ0aGVyIHNlcmlhbGl6YXRpb25cbiAgICBCdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGJ1ZmZlclRvSlNPTjtcbiAgfVxufVxuXG4vKlxuICogUmVtb3ZlcyB0aGUgd3JhcHBlciBmcm9tIGVsZW1lbnQsIGlmIGl0IGV4aXN0cy5cbiAqICAgeyBFTEVNRU5UOiA0IH0gYmVjb21lcyA0XG4gKiAgIHsgZWxlbWVudC02MDY2LTExZTQtYTUyZS00ZjczNTQ2NmNlY2Y6IDUgfSBiZWNvbWVzIDVcbiAqL1xuZnVuY3Rpb24gdW53cmFwRWxlbWVudChlbCkge1xuICBmb3IgKGNvbnN0IHByb3BOYW1lIG9mIFtXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUiwgJ0VMRU1FTlQnXSkge1xuICAgIGlmIChfLmhhcyhlbCwgcHJvcE5hbWUpKSB7XG4gICAgICByZXR1cm4gZWxbcHJvcE5hbWVdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZWw7XG59XG5cbmZ1bmN0aW9uIHdyYXBFbGVtZW50KGVsZW1lbnRJZCkge1xuICByZXR1cm4ge1xuICAgIEVMRU1FTlQ6IGVsZW1lbnRJZCxcbiAgICBbVzNDX1dFQl9FTEVNRU5UX0lERU5USUZJRVJdOiBlbGVtZW50SWQsXG4gIH07XG59XG5cbi8qXG4gKiBSZXR1cm5zIG9iamVjdCBjb25zaXN0aW5nIG9mIGFsbCBwcm9wZXJ0aWVzIGluIHRoZSBvcmlnaW5hbCBlbGVtZW50XG4gKiB3aGljaCB3ZXJlIHRydXRoeSBnaXZlbiB0aGUgcHJlZGljYXRlLlxuICogSWYgdGhlIHByZWRpY2F0ZSBpc1xuICogICAqIG1pc3NpbmcgLSBpdCB3aWxsIHJlbW92ZSBhbGwgcHJvcGVydGllcyB3aG9zZSB2YWx1ZXMgYXJlIGB1bmRlZmluZWRgXG4gKiAgICogYSBzY2FsYXIgLSBpdCB3aWxsIHRlc3QgYWxsIHByb3BlcnRpZXMnIHZhbHVlcyBhZ2FpbnN0IHRoYXQgdmFsdWVcbiAqICAgKiBhIGZ1bmN0aW9uIC0gaXQgd2lsbCBwYXNzIGVhY2ggdmFsdWUgYW5kIHRoZSBvcmlnaW5hbCBvYmplY3QgaW50byB0aGUgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gZmlsdGVyT2JqZWN0KG9iaiwgcHJlZGljYXRlKSB7XG4gIGxldCBuZXdPYmogPSBfLmNsb25lKG9iaik7XG4gIGlmIChfLmlzVW5kZWZpbmVkKHByZWRpY2F0ZSkpIHtcbiAgICAvLyByZW1vdmUgYW55IGVsZW1lbnQgZnJvbSB0aGUgb2JqZWN0IHdob3NlIHZhbHVlIGlzIHVuZGVmaW5lZFxuICAgIHByZWRpY2F0ZSA9ICh2KSA9PiAhXy5pc1VuZGVmaW5lZCh2KTtcbiAgfSBlbHNlIGlmICghXy5pc0Z1bmN0aW9uKHByZWRpY2F0ZSkpIHtcbiAgICAvLyBtYWtlIHByZWRpY2F0ZSBpbnRvIGEgZnVuY3Rpb25cbiAgICBjb25zdCB2YWx1ZVByZWRpY2F0ZSA9IHByZWRpY2F0ZTtcbiAgICBwcmVkaWNhdGUgPSAodikgPT4gdiA9PT0gdmFsdWVQcmVkaWNhdGU7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgIGlmICghcHJlZGljYXRlKG9ialtrZXldLCBvYmopKSB7XG4gICAgICBkZWxldGUgbmV3T2JqW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXdPYmo7XG59XG5cbi8qKlxuICogQ29udmVydHMgbnVtYmVyIG9mIGJ5dGVzIHRvIGEgcmVhZGFibGUgc2l6ZSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBieXRlcyAtIFRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzLlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGFjdHVhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24sIGZvciBleGFtcGxlXG4gKiAgICAgICAgICAgICAgICAgICAnMS4wMCBLQicgZm9yICcxMDI0IEInXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYnl0ZXMgY291bnQgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyIG9yXG4gKiAgICAgICAgICAgICAgICAgaWYgaXQgaXMgbGVzcyB0aGFuIHplcm8uXG4gKi9cbmZ1bmN0aW9uIHRvUmVhZGFibGVTaXplU3RyaW5nKGJ5dGVzKSB7XG4gIGNvbnN0IGludEJ5dGVzID0gcGFyc2VJbnQoU3RyaW5nKGJ5dGVzKSwgMTApO1xuICBpZiAoaXNOYU4oaW50Qnl0ZXMpIHx8IGludEJ5dGVzIDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvbnZlcnQgJyR7Ynl0ZXN9JyB0byBhIHJlYWRhYmxlIHNpemUgZm9ybWF0YCk7XG4gIH1cbiAgaWYgKGludEJ5dGVzID49IEdpQikge1xuICAgIHJldHVybiBgJHsoaW50Qnl0ZXMgLyAoR2lCICogMS4wKSkudG9GaXhlZCgyKX0gR0JgO1xuICB9IGVsc2UgaWYgKGludEJ5dGVzID49IE1pQikge1xuICAgIHJldHVybiBgJHsoaW50Qnl0ZXMgLyAoTWlCICogMS4wKSkudG9GaXhlZCgyKX0gTUJgO1xuICB9IGVsc2UgaWYgKGludEJ5dGVzID49IEtpQikge1xuICAgIHJldHVybiBgJHsoaW50Qnl0ZXMgLyAoS2lCICogMS4wKSkudG9GaXhlZCgyKX0gS0JgO1xuICB9XG4gIHJldHVybiBgJHtpbnRCeXRlc30gQmA7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHBhdGggaXMgYSBzdWJwYXRoIG9mIHRoZVxuICogcGFydGljdWxhciByb290IGZvbGRlci4gQm90aCBwYXRocyBjYW4gaW5jbHVkZSAuLiBhbmQgLiBzcGVjaWZpZXJzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG9yaWdpbmFsUGF0aCBUaGUgYWJzb2x1dGUgZmlsZS9mb2xkZXIgcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHJvb3QgVGhlIGFic29sdXRlIHJvb3QgZm9sZGVyIHBhdGhcbiAqIEBwYXJhbSB7P2Jvb2xlYW59IGZvcmNlUG9zaXggU2V0IGl0IHRvIHRydWUgaWYgcGF0aHMgbXVzdCBiZSBpbnRlcnByZXRlZCBpbiBQT1NJWCBmb3JtYXRcbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHRoZSBnaXZlbiBvcmlnaW5hbCBwYXRoIGlzIHRoZSBzdWJwYXRoIG9mIHRoZSByb290IGZvbGRlclxuICogQHRocm93cyB7RXJyb3J9IGlmIGFueSBvZiB0aGUgZ2l2ZW4gcGF0aHMgaXMgbm90IGFic29sdXRlXG4gKi9cbmZ1bmN0aW9uIGlzU3ViUGF0aChvcmlnaW5hbFBhdGgsIHJvb3QsIGZvcmNlUG9zaXggPSBudWxsKSB7XG4gIGNvbnN0IHBhdGhPYmogPSBmb3JjZVBvc2l4ID8gcGF0aC5wb3NpeCA6IHBhdGg7XG4gIGZvciAoY29uc3QgcCBvZiBbb3JpZ2luYWxQYXRoLCByb290XSkge1xuICAgIGlmICghcGF0aE9iai5pc0Fic29sdXRlKHApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke3B9JyBpcyBleHBlY3RlZCB0byBiZSBhbiBhYnNvbHV0ZSBwYXRoYCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IG5vcm1hbGl6ZWRSb290ID0gcGF0aE9iai5ub3JtYWxpemUocm9vdCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aE9iai5ub3JtYWxpemUob3JpZ2luYWxQYXRoKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgobm9ybWFsaXplZFJvb3QpO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBwYXRocyBhcmUgcG9pbnRpbmcgdG8gdGhlIHNhbWUgZmlsZSBzeXN0ZW1cbiAqIGRlc3RpbmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoMSAtIEFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGggdG8gYSBmaWxlL2ZvbGRlclxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGgyIC0gQWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aCB0byBhIGZpbGUvZm9sZGVyXG4gKiBAcGFyYW0gey4uLnN0cmluZ30gcGF0aE4gLSBaZXJvIG9yIG1vcmUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aHMgdG8gZmlsZXMvZm9sZGVyc1xuICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IHRydWUgaWYgYWxsIHBhdGhzIGFyZSBwb2ludGluZyB0byB0aGUgc2FtZSBmaWxlIHN5c3RlbSBpdGVtXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzU2FtZURlc3RpbmF0aW9uKHBhdGgxLCBwYXRoMiwgLi4ucGF0aE4pIHtcbiAgY29uc3QgYWxsUGF0aHMgPSBbcGF0aDEsIHBhdGgyLCAuLi5wYXRoTl07XG4gIGlmICghKGF3YWl0IEIucmVkdWNlKGFsbFBhdGhzLCBhc3luYyAoYSwgYikgPT4gYSAmJiAoYXdhaXQgZnMuZXhpc3RzKGIpKSwgdHJ1ZSkpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgYXJlQWxsSXRlbXNFcXVhbCA9IChhcnIpID0+ICEhYXJyLnJlZHVjZSgoYSwgYikgPT4gKGEgPT09IGIgPyBhIDogTmFOKSk7XG4gIGlmIChhcmVBbGxJdGVtc0VxdWFsKGFsbFBhdGhzKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgbGV0IG1hcENiID0gYXN5bmMgKHgpID0+XG4gICAgKFxuICAgICAgYXdhaXQgZnMuc3RhdCh4LCB7XG4gICAgICAgIGJpZ2ludDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgKS5pbm87XG4gIHJldHVybiBhcmVBbGxJdGVtc0VxdWFsKGF3YWl0IEIubWFwKGFsbFBhdGhzLCBtYXBDYikpO1xufVxuXG4vKipcbiAqIENvZXJjZXMgdGhlIGdpdmVuIG51bWJlci9zdHJpbmcgdG8gYSB2YWxpZCB2ZXJzaW9uIHN0cmluZ1xuICpcbiAqIEB0ZW1wbGF0ZSB7Ym9vbGVhbn0gW1N0cmljdD10cnVlXVxuICogQHBhcmFtIHtzdHJpbmd9IHZlciAtIFZlcnNpb24gc3RyaW5nIHRvIGNvZXJjZVxuICogQHBhcmFtIHtTdHJpY3R9IFtzdHJpY3RdIC0gSWYgYHRydWVgIHRoZW4gYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duXG4gKiBpZiBgdmVyYCBjYW5ub3QgYmUgY29lcmNlZFxuICogQHJldHVybnMge1N0cmljdCBleHRlbmRzIHRydWUgPyBzdHJpbmcgOiBzdHJpbmd8bnVsbH0gQ29lcmNlZCB2ZXJzaW9uIG51bWJlciBvciBudWxsIGlmIHRoZSBzdHJpbmcgY2Fubm90IGJlXG4gKiBjb2VyY2VkIGFuZCBzdHJpY3QgbW9kZSBpcyBkaXNhYmxlZFxuICogQHRocm93cyB7RXJyb3J9IGlmIHN0cmljdCBtb2RlIGlzIGVuYWJsZWQgYW5kIGB2ZXJgIGNhbm5vdCBiZSBjb2VyY2VkXG4gKi9cbmZ1bmN0aW9uIGNvZXJjZVZlcnNpb24odmVyLCBzdHJpY3QgPSAvKiogQHR5cGUge1N0cmljdH0gKi8gKHRydWUpKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHNlbXZlci52YWxpZChzZW12ZXIuY29lcmNlKGAke3Zlcn1gKSk7XG4gIGlmIChzdHJpY3QgJiYgIXJlc3VsdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJyR7dmVyfScgY2Fubm90IGJlIGNvZXJjZWQgdG8gYSB2YWxpZCB2ZXJzaW9uIG51bWJlcmApO1xuICB9XG4gIHJldHVybiAvKiogQHR5cGUge1N0cmljdCBleHRlbmRzIHRydWUgPyBzdHJpbmcgOiBzdHJpbmc/fSAqLyAocmVzdWx0KTtcbn1cblxuY29uc3QgU1VQUE9SVEVEX09QRVJBVE9SUyA9IFsnPT0nLCAnIT0nLCAnPicsICc8JywgJz49JywgJzw9JywgJz0nXTtcblxuLyoqXG4gKiBDb21wYXJlcyB0d28gdmVyc2lvbiBzdHJpbmdzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZlcjEgLSBUaGUgZmlyc3QgdmVyc2lvbiBudW1iZXIgdG8gY29tcGFyZS4gU2hvdWxkIGJlIGEgdmFsaWRcbiAqIHZlcnNpb24gbnVtYmVyIHN1cHBvcnRlZCBieSBzZW12ZXIgcGFyc2VyLlxuICogQHBhcmFtIHtzdHJpbmd9IHZlcjIgLSBUaGUgc2Vjb25kIHZlcnNpb24gbnVtYmVyIHRvIGNvbXBhcmUuIFNob3VsZCBiZSBhIHZhbGlkXG4gKiB2ZXJzaW9uIG51bWJlciBzdXBwb3J0ZWQgYnkgc2VtdmVyIHBhcnNlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRvciAtIE9uZSBvZiBzdXBwb3J0ZWQgdmVyc2lvbiBudW1iZXIgb3BlcmF0b3JzOlxuICogPT0sICE9LCA+LCA8LCA8PSwgPj0sID1cbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIG9yIGZhbHNlIGRlcGVuZGluZyBvbiB0aGUgYWN0dWFsIGNvbXBhcmlzb24gcmVzdWx0XG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgYW4gdW5zdXBwb3J0ZWQgb3BlcmF0b3IgaXMgc3VwcGxpZWQgb3IgYW55IG9mIHRoZSBzdXBwbGllZFxuICogdmVyc2lvbiBzdHJpbmdzIGNhbm5vdCBiZSBjb2VyY2VkXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyh2ZXIxLCBvcGVyYXRvciwgdmVyMikge1xuICBpZiAoIVNVUFBPUlRFRF9PUEVSQVRPUlMuaW5jbHVkZXMob3BlcmF0b3IpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSAnJHtvcGVyYXRvcn0nIGNvbXBhcmlzb24gb3BlcmF0b3IgaXMgbm90IHN1cHBvcnRlZC4gYCArXG4gICAgICAgIGBPbmx5ICcke0pTT04uc3RyaW5naWZ5KFNVUFBPUlRFRF9PUEVSQVRPUlMpfScgb3BlcmF0b3JzIGFyZSBzdXBwb3J0ZWRgXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHNlbXZlck9wZXJhdG9yID0gWyc9PScsICchPSddLmluY2x1ZGVzKG9wZXJhdG9yKSA/ICc9JyA6IG9wZXJhdG9yO1xuICBjb25zdCByZXN1bHQgPSBzZW12ZXIuc2F0aXNmaWVzKGNvZXJjZVZlcnNpb24odmVyMSksIGAke3NlbXZlck9wZXJhdG9yfSR7Y29lcmNlVmVyc2lvbih2ZXIyKX1gKTtcbiAgcmV0dXJuIG9wZXJhdG9yID09PSAnIT0nID8gIXJlc3VsdCA6IHJlc3VsdDtcbn1cblxuLyoqXG4gKiBBZGQgYXBwcm9wcmlhdGUgcXVvdGVzIHRvIGNvbW1hbmQgYXJndW1lbnRzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3N1YnN0YWNrL25vZGUtc2hlbGwtcXVvdGVcbiAqIGZvciBtb3JlIGRldGFpbHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzdHJpbmdbXX0gYXJncyAtIFRoZSBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhcnNlZFxuICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgYXJndW1lbnRzLCBxdW90ZWRcbiAqL1xuZnVuY3Rpb24gcXVvdGUoYXJncykge1xuICByZXR1cm4gc2hlbGxRdW90ZShfLmNhc3RBcnJheShhcmdzKSk7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyBuZWNlc3NhcnkgdG8gd29ya2Fyb3VuZCB1bmV4cGVjdGVkIG1lbW9yeSBsZWFrc1xuICogY2F1c2VkIGJ5IE5vZGVKUyBzdHJpbmcgaW50ZXJuaW5nXG4gKiBiZWhhdmlvciBkZXNjcmliZWQgaW4gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9Mjg2OVxuICpcbiAqIEBwYXJhbSB7Kn0gcyAtIFRoZSBzdHJpbmcgdG8gdW5sZWFrXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEVpdGhlciB0aGUgdW5sZWFrZWQgc3RyaW5nIG9yIHRoZSBvcmlnaW5hbCBvYmplY3QgY29udmVydGVkIHRvIHN0cmluZ1xuICovXG5mdW5jdGlvbiB1bmxlYWtTdHJpbmcocykge1xuICByZXR1cm4gYCAke3N9YC5zdWJzdHIoMSk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYgUGx1cmFsaXplT3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbaW5jbHVzaXZlPWZhbHNlXSAtIFdoZXRoZXIgdG8gcHJlZml4IHdpdGggdGhlIG51bWJlciAoZS5nLiwgMyBkdWNrcylcbiAqL1xuXG4vKipcbiAqIEdldCB0aGUgZm9ybSBvZiBhIHdvcmQgYXBwcm9wcmlhdGUgdG8gdGhlIGNvdW50XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHdvcmQgLSBUaGUgd29yZCB0byBwbHVyYWxpemVcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCAtIEhvdyBtYW55IG9mIHRoZSB3b3JkIGV4aXN0XG4gKiBAcGFyYW0ge1BsdXJhbGl6ZU9wdGlvbnN8Ym9vbGVhbn0gb3B0aW9ucyAtIG9wdGlvbnMgZm9yIHdvcmQgcGx1cmFsaXphdGlvbixcbiAqICAgb3IgYSBib29sZWFuIGluZGljYXRpbmcgdGhlIG9wdGlvbnMuaW5jbHVzaXZlIHByb3BlcnR5XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgd29yZCBwbHVyYWxpemVkIGFjY29yZGluZyB0byB0aGUgbnVtYmVyXG4gKi9cbmZ1bmN0aW9uIHBsdXJhbGl6ZSh3b3JkLCBjb3VudCwgb3B0aW9ucyA9IHt9KSB7XG4gIGxldCBpbmNsdXNpdmUgPSBmYWxzZTtcbiAgaWYgKF8uaXNCb29sZWFuKG9wdGlvbnMpKSB7XG4gICAgLy8gaWYgcGFzc2VkIGluIGFzIGEgYm9vbGVhblxuICAgIGluY2x1c2l2ZSA9IG9wdGlvbnM7XG4gIH0gZWxzZSBpZiAoXy5pc0Jvb2xlYW4ob3B0aW9ucz8uaW5jbHVzaXZlKSkge1xuICAgIC8vIGlmIHBhc3NlZCBpbiBhcyBhbiBvcHRpb25zIGhhc2hcbiAgICBpbmNsdXNpdmUgPSBvcHRpb25zLmluY2x1c2l2ZTtcbiAgfVxuICByZXR1cm4gcGx1cmFsaXplTGliKHdvcmQsIGNvdW50LCBpbmNsdXNpdmUpO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIEVuY29kaW5nT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhTaXplPTEwNzM3NDE4MjRdIFRoZSBtYXhpbXVtIHNpemUgb2ZcbiAqIHRoZSByZXN1bHRpbmcgYnVmZmVyIGluIGJ5dGVzLiBUaGlzIGlzIHNldCB0byAxR0IgYnkgZGVmYXVsdCwgYmVjYXVzZVxuICogQXBwaXVtIGxpbWl0cyB0aGUgbWF4aW11bSBIVFRQIGJvZHkgc2l6ZSB0byAxR0IuIEFsc28sIHRoZSBOb2RlSlMgaGVhcFxuICogc2l6ZSBtdXN0IGJlIGVub3VnaCB0byBrZWVwIHRoZSByZXN1bHRpbmcgb2JqZWN0ICh1c3VhbGx5IHRoaXMgc2l6ZSBpc1xuICogbGltaXRlZCB0byAxLjQgR0IpXG4gKi9cblxuLyoqXG4gKiBDb252ZXJ0cyBjb250ZW50cyBvZiBhIGxvY2FsIGZpbGUgdG8gYW4gaW4tbWVtb3J5IGJhc2UtNjQgZW5jb2RlZCBidWZmZXIuXG4gKiBUaGUgb3BlcmF0aW9uIGlzIG1lbW9yeS11c2FnZSBmcmllbmRseSBhbmQgc2hvdWxkIGJlIHVzZWQgd2hpbGUgZW5jb2RpbmdcbiAqIGxhcmdlIGZpbGVzIHRvIGJhc2U2NFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcmNQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIGZpbGUgYmVpbmcgZW5jb2RlZFxuICogQHBhcmFtIHtFbmNvZGluZ09wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPEJ1ZmZlcj59IGJhc2U2NC1lbmNvZGVkIGNvbnRlbnQgb2YgdGhlIHNvdXJjZSBmaWxlIGFzIG1lbW9yeSBidWZmZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgcmVhZGluZyB0aGUgc291cmNlIGZpbGVcbiAqIG9yIHRoZSBzb3VyY2UgZmlsZSBpcyB0b29cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdG9Jbk1lbW9yeUJhc2U2NChzcmNQYXRoLCBvcHRzID0ge30pIHtcbiAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKHNyY1BhdGgpKSB8fCAoYXdhaXQgZnMuc3RhdChzcmNQYXRoKSkuaXNEaXJlY3RvcnkoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gc3VjaCBmaWxlOiAke3NyY1BhdGh9YCk7XG4gIH1cblxuICBjb25zdCB7bWF4U2l6ZSA9IDEgKiBHaUJ9ID0gb3B0cztcbiAgY29uc3QgcmVzdWx0QnVmZmVycyA9IFtdO1xuICBsZXQgcmVzdWx0QnVmZmVyc1NpemUgPSAwO1xuICBjb25zdCByZXN1bHRXcml0ZVN0cmVhbSA9IG5ldyBzdHJlYW0uV3JpdGFibGUoe1xuICAgIHdyaXRlOiAoYnVmZmVyLCBlbmNvZGluZywgbmV4dCkgPT4ge1xuICAgICAgcmVzdWx0QnVmZmVycy5wdXNoKGJ1ZmZlcik7XG4gICAgICByZXN1bHRCdWZmZXJzU2l6ZSArPSBidWZmZXIubGVuZ3RoO1xuICAgICAgaWYgKG1heFNpemUgPiAwICYmIHJlc3VsdEJ1ZmZlcnNTaXplID4gbWF4U2l6ZSkge1xuICAgICAgICByZXN1bHRXcml0ZVN0cmVhbS5lbWl0KFxuICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRoZSBzaXplIG9mIHRoZSByZXN1bHRpbmcgYCArXG4gICAgICAgICAgICAgIGBidWZmZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuICR7dG9SZWFkYWJsZVNpemVTdHJpbmcobWF4U2l6ZSl9YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG5leHQoKTtcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCByZWFkZXJTdHJlYW0gPSBmcy5jcmVhdGVSZWFkU3RyZWFtKHNyY1BhdGgpO1xuICBjb25zdCBiYXNlNjRFbmNvZGVyU3RyZWFtID0gbmV3IEJhc2U2NEVuY29kZSgpO1xuICBjb25zdCByZXN1bHRXcml0ZVN0cmVhbVByb21pc2UgPSBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgcmVzdWx0V3JpdGVTdHJlYW0ub25jZSgnZXJyb3InLCAoZSkgPT4ge1xuICAgICAgcmVhZGVyU3RyZWFtLnVucGlwZShiYXNlNjRFbmNvZGVyU3RyZWFtKTtcbiAgICAgIGJhc2U2NEVuY29kZXJTdHJlYW0udW5waXBlKHJlc3VsdFdyaXRlU3RyZWFtKTtcbiAgICAgIHJlYWRlclN0cmVhbS5kZXN0cm95KCk7XG4gICAgICByZWplY3QoZSk7XG4gICAgfSk7XG4gICAgcmVzdWx0V3JpdGVTdHJlYW0ub25jZSgnZmluaXNoJywgcmVzb2x2ZSk7XG4gIH0pO1xuICBjb25zdCByZWFkU3RyZWFtUHJvbWlzZSA9IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICByZWFkZXJTdHJlYW0ub25jZSgnY2xvc2UnLCByZXNvbHZlKTtcbiAgICByZWFkZXJTdHJlYW0ub25jZSgnZXJyb3InLCAoZSkgPT5cbiAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byByZWFkICcke3NyY1BhdGh9JzogJHtlLm1lc3NhZ2V9YCkpXG4gICAgKTtcbiAgfSk7XG4gIHJlYWRlclN0cmVhbS5waXBlKGJhc2U2NEVuY29kZXJTdHJlYW0pO1xuICBiYXNlNjRFbmNvZGVyU3RyZWFtLnBpcGUocmVzdWx0V3JpdGVTdHJlYW0pO1xuXG4gIGF3YWl0IEIuYWxsKFtyZWFkU3RyZWFtUHJvbWlzZSwgcmVzdWx0V3JpdGVTdHJlYW1Qcm9taXNlXSk7XG4gIHJldHVybiBCdWZmZXIuY29uY2F0KHJlc3VsdEJ1ZmZlcnMpO1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIExvY2tGaWxlT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0PTEyMF0gVGhlIG1heCB0aW1lIGluIHNlY29uZHMgdG8gd2FpdCBmb3IgdGhlIGxvY2tcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyeVJlY292ZXJ5PWZhbHNlXSBXaGV0aGVyIHRvIHRyeSBsb2NrIHJlY292ZXJ5IGlmXG4gKiB0aGUgZmlyc3QgYXR0ZW1wdCB0byBhY3F1aXJlIGl0IHRpbWVkIG91dC5cbiAqL1xuXG4vKipcbiAqIENyZWF0ZSBhbiBhc3luYyBmdW5jdGlvbiB3aGljaCwgd2hlbiBjYWxsZWQsIHdpbGwgbm90IHByb2NlZWQgdW50aWwgYSBjZXJ0YWluIGZpbGUgaXMgbm9cbiAqIGxvbmdlciBwcmVzZW50IG9uIHRoZSBzeXN0ZW0uIFRoaXMgYWxsb3dzIGZvciBwcmV2ZW50aW5nIGNvbmN1cnJlbnQgYmVoYXZpb3IgYWNyb3NzIHByb2Nlc3Nlc1xuICogdXNpbmcgYSBrbm93biBsb2NrZmlsZSBwYXRoLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9ja0ZpbGUgVGhlIGZ1bGwgcGF0aCB0byB0aGUgZmlsZSB1c2VkIGZvciB0aGUgbG9ja1xuICogQHBhcmFtIHtMb2NrRmlsZU9wdGlvbnN9IG9wdHNcbiAqIEByZXR1cm5zIGFzeW5jIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYW5vdGhlciBhc3luYyBmdW5jdGlvbiBkZWZpbmluZyB0aGUgbG9ja2VkXG4gKiBiZWhhdmlvclxuICovXG5mdW5jdGlvbiBnZXRMb2NrRmlsZUd1YXJkKGxvY2tGaWxlLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge3RpbWVvdXQgPSAxMjAsIHRyeVJlY292ZXJ5ID0gZmFsc2V9ID0gb3B0cztcblxuICBjb25zdCBsb2NrID0gLyoqIEB0eXBlIHsobG9ja2ZpbGU6IHN0cmluZywgb3B0czogaW1wb3J0KCdsb2NrZmlsZScpLk9wdGlvbnMpPT5CPHZvaWQ+fSAqLyAoXG4gICAgQi5wcm9taXNpZnkoX2xvY2tmaWxlLmxvY2spXG4gICk7XG4gIGNvbnN0IGNoZWNrID0gQi5wcm9taXNpZnkoX2xvY2tmaWxlLmNoZWNrKTtcbiAgY29uc3QgdW5sb2NrID0gQi5wcm9taXNpZnkoX2xvY2tmaWxlLnVubG9jayk7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBUfSBiZWhhdmlvclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn1cbiAgICovXG4gIGNvbnN0IGd1YXJkID0gYXN5bmMgKGJlaGF2aW9yKSA9PiB7XG4gICAgbGV0IHRyaWVkUmVjb3ZlcnkgPSBmYWxzZTtcbiAgICBkbyB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBpZiB0aGUgbG9ja2ZpbGUgZG9lc24ndCBleGlzdCwgbG9jayBpdCBzeW5jaHJvbm91c2x5IHRvIG1ha2Ugc3VyZSBubyBvdGhlciBjYWxsXG4gICAgICAgIC8vIG9uIHRoZSBzYW1lIHNwaW4gb2YgdGhlIGV2ZW50IGxvb3AgY2FuIGFsc28gaW5pdGlhdGUgYSBsb2NrLiBJZiB0aGUgbG9ja2ZpbGUgZG9lcyBleGlzdFxuICAgICAgICAvLyB0aGVuIGp1c3QgdXNlIHRoZSByZWd1bGFyIGFzeW5jICdsb2NrJyBtZXRob2Qgd2hpY2ggd2lsbCB3YWl0IG9uIHRoZSBsb2NrLlxuICAgICAgICBpZiAoX2xvY2tmaWxlLmNoZWNrU3luYyhsb2NrRmlsZSkpIHtcbiAgICAgICAgICBhd2FpdCBsb2NrKGxvY2tGaWxlLCB7d2FpdDogdGltZW91dCAqIDEwMDB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfbG9ja2ZpbGUubG9ja1N5bmMobG9ja0ZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoXy5pbmNsdWRlcyhlLm1lc3NhZ2UsICdFRVhJU1QnKSAmJiB0cnlSZWNvdmVyeSAmJiAhdHJpZWRSZWNvdmVyeSkge1xuICAgICAgICAgIC8vIFRoZXJlIGNvdWxkIGJlIGNhc2VzIHdoZXJlIGEgcHJvY2VzcyBoYXMgYmVlbiBmb3JjZWZ1bGx5IHRlcm1pbmF0ZWRcbiAgICAgICAgICAvLyB3aXRob3V0IGEgY2hhbmNlIHRvIGNsZWFuIHVwIHBlbmRpbmcgbG9ja3M6IGh0dHBzOi8vZ2l0aHViLmNvbS9ucG0vbG9ja2ZpbGUvaXNzdWVzLzI2XG4gICAgICAgICAgX2xvY2tmaWxlLnVubG9ja1N5bmMobG9ja0ZpbGUpO1xuICAgICAgICAgIHRyaWVkUmVjb3ZlcnkgPSB0cnVlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ291bGQgbm90IGFjcXVpcmUgbG9jayBvbiAnJHtsb2NrRmlsZX0nIGFmdGVyICR7dGltZW91dH1zLiBgICtcbiAgICAgICAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnN0YW50LWNvbmRpdGlvblxuICAgIH0gd2hpbGUgKHRydWUpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgYmVoYXZpb3IoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gd2hldGhlciB0aGUgYmVoYXZpb3Igc3VjY2VlZGVkIG9yIG5vdCwgZ2V0IHJpZCBvZiB0aGUgbG9ja1xuICAgICAgYXdhaXQgdW5sb2NrKGxvY2tGaWxlKTtcbiAgICB9XG4gIH07XG5cbiAgZ3VhcmQuY2hlY2sgPSBhc3luYyAoKSA9PiBhd2FpdCBjaGVjayhsb2NrRmlsZSk7XG5cbiAgcmV0dXJuIGd1YXJkO1xufVxuXG5leHBvcnQge1xuICBoYXNWYWx1ZSxcbiAgZXNjYXBlU3BhY2UsXG4gIGVzY2FwZVNwZWNpYWxDaGFycyxcbiAgbG9jYWxJcCxcbiAgY2FuY2VsbGFibGVEZWxheSxcbiAgbXVsdGlSZXNvbHZlLFxuICBzYWZlSnNvblBhcnNlLFxuICB3cmFwRWxlbWVudCxcbiAgdW53cmFwRWxlbWVudCxcbiAgZmlsdGVyT2JqZWN0LFxuICB0b1JlYWRhYmxlU2l6ZVN0cmluZyxcbiAgaXNTdWJQYXRoLFxuICBXM0NfV0VCX0VMRU1FTlRfSURFTlRJRklFUixcbiAgaXNTYW1lRGVzdGluYXRpb24sXG4gIGNvbXBhcmVWZXJzaW9ucyxcbiAgY29lcmNlVmVyc2lvbixcbiAgcXVvdGUsXG4gIHVubGVha1N0cmluZyxcbiAganNvblN0cmluZ2lmeSxcbiAgcGx1cmFsaXplLFxuICBHaUIsXG4gIE1pQixcbiAgS2lCLFxuICB0b0luTWVtb3J5QmFzZTY0LFxuICB1dWlkVjEsXG4gIHV1aWRWMyxcbiAgdXVpZFY0LFxuICB1dWlkVjUsXG4gIHNoZWxsUGFyc2UsXG4gIGdldExvY2tGaWxlR3VhcmQsXG59O1xuXG4vKipcbiAqIEEgYHN0cmluZ2Agd2hpY2ggaXMgbmV2ZXIgYCcnYC5cbiAqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gVFxuICogQHR5cGVkZWYge1QgZXh0ZW5kcyAnJyA/IG5ldmVyIDogVH0gTm9uRW1wdHlTdHJpbmdcbiAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBS0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBT0E7Ozs7QUFFQSxNQUFNQSwwQkFBMEIsR0FBRyxxQ0FBbkM7O0FBQ0EsTUFBTUMsR0FBRyxHQUFHLElBQVo7O0FBQ0EsTUFBTUMsR0FBRyxHQUFHRCxHQUFHLEdBQUcsSUFBbEI7O0FBQ0EsTUFBTUUsR0FBRyxH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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","names":["W3C_WEB_ELEMENT_IDENTIFIER","KiB","MiB","GiB","hasContent","val","_","isString","hasValue","isNumber","isNaN","isUndefined","isNull","escapeSpace","str","split","join","escapeSpecialChars","quoteEscape","replace","re","RegExp","localIp","ip","chain","os","networkInterfaces","values","flatten","filter","family","internal","map","first","value","cancellableDelay","ms","timer","resolve","reject","delay","B","Promise","_resolve","_reject","setTimeout","cancel","clearTimeout","CancellationError","multiResolve","roots","args","root","path","safeJsonParse","obj","JSON","parse","ign","jsonStringify","replacer","space","isFunction","k","v","bufferToJSON","Buffer","prototype","toJSON","stringify","key","updatedValue","isBuffer","toString","unwrapElement","el","propName","has","wrapElement","elementId","ELEMENT","filterObject","predicate","newObj","clone","valuePredicate","Object","keys","toReadableSizeString","bytes","intBytes","parseInt","String","Error","toFixed","isSubPath","originalPath","forcePosix","pathObj","posix","p","isAbsolute","normalizedRoot","normalize","normalizedPath","startsWith","isSameDestination","path1","path2","pathN","allPaths","reduce","a","b","fs","exists","areAllItemsEqual","arr","NaN","mapCb","x","stat","bigint","ino","coerceVersion","ver","strict","result","semver","valid","coerce","SUPPORTED_OPERATORS","compareVersions","ver1","operator","ver2","includes","semverOperator","satisfies","quote","shellQuote","castArray","unleakString","s","substr","pluralize","word","count","options","inclusive","isBoolean","pluralizeLib","toInMemoryBase64","srcPath","opts","isDirectory","maxSize","resultBuffers","resultBuffersSize","resultWriteStream","stream","Writable","write","buffer","encoding","next","push","length","emit","readerStream","createReadStream","base64EncoderStream","Base64Encode","resultWriteStreamPromise","once","e","unpipe","destroy","readStreamPromise","message","pipe","all","concat","getLockFileGuard","lockFile","timeout","tryRecovery","lock","promisify","_lockfile","check","unlock","guard","behavior","triedRecovery","checkSync","wait","lockSync","unlockSync"],"sources":["../../lib/util.js"],"sourcesContent":["import B from 'bluebird';\nimport _ from 'lodash';\nimport os from 'os';\nimport path from 'path';\nimport fs from './fs';\nimport semver from 'semver';\nimport {\n // https://www.npmjs.com/package/shell-quote\n quote as shellQuote,\n parse as shellParse,\n} from 'shell-quote';\nimport pluralizeLib from 'pluralize';\nimport stream from 'stream';\nimport {Base64Encode} from 'base64-stream';\nimport {\n // https://www.npmjs.com/package/uuid\n v1 as uuidV1,\n v3 as uuidV3,\n v4 as uuidV4,\n v5 as uuidV5,\n} from 'uuid';\nimport _lockfile from 'lockfile';\n\nconst W3C_WEB_ELEMENT_IDENTIFIER = 'element-6066-11e4-a52e-4f735466cecf';\nconst KiB = 1024;\nconst MiB = KiB * 1024;\nconst GiB = MiB * 1024;\n\n/**\n * @template {string} T\n * @param {T} val\n * @returns {val is NonEmptyString<T>}\n */\nexport function hasContent(val) {\n return _.isString(val) && val !== '';\n}\n\n/**\n * return true if the the value is not `undefined`, `null`, or `NaN`.\n *\n * XXX: `NaN` is not expressible in TypeScript.\n * @template T\n * @param {T} val\n * @returns {val is NonNullable<T>}\n */\nfunction hasValue(val) {\n // avoid incorrectly evaluating `0` as false\n if (_.isNumber(val)) {\n return !_.isNaN(val);\n }\n return !_.isUndefined(val) && !_.isNull(val);\n}\n\n// escape spaces in string, for commandline calls\nfunction escapeSpace(str) {\n return str.split(/ /).join('\\\\ ');\n}\n\nfunction escapeSpecialChars(str, quoteEscape) {\n if (typeof str !== 'string') {\n return str;\n }\n if (typeof quoteEscape === 'undefined') {\n quoteEscape = false;\n }\n str = str\n .replace(/[\\\\]/g, '\\\\\\\\')\n .replace(/[\\/]/g, '\\\\/') // eslint-disable-line no-useless-escape\n .replace(/[\\b]/g, '\\\\b')\n .replace(/[\\f]/g, '\\\\f')\n .replace(/[\\n]/g, '\\\\n')\n .replace(/[\\r]/g, '\\\\r')\n .replace(/[\\t]/g, '\\\\t')\n .replace(/[\\\"]/g, '\\\\\"') // eslint-disable-line no-useless-escape\n .replace(/\\\\'/g, \"\\\\'\");\n if (quoteEscape) {\n let re = new RegExp(quoteEscape, 'g');\n str = str.replace(re, `\\\\${quoteEscape}`);\n }\n return str;\n}\n\nfunction localIp() {\n let ip = _.chain(os.networkInterfaces())\n .values()\n .flatten()\n // @ts-ignore\n .filter(function (val) {\n return val.family === 'IPv4' && val.internal === false;\n })\n .map('address')\n .first()\n .value();\n return ip;\n}\n\n/*\n * Creates a promise that is cancellable, and will timeout\n * after `ms` delay\n */\nfunction cancellableDelay(ms) {\n let timer;\n let resolve;\n let reject;\n\n const delay = new B.Promise((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n timer = setTimeout(function () {\n resolve();\n }, ms);\n });\n\n // override Bluebird's `cancel`, which does not work when using `await` on\n // a promise, since `resolve`/`reject` are never called\n delay.cancel = function () {\n clearTimeout(timer);\n reject(new B.CancellationError());\n };\n return delay;\n}\n\nfunction multiResolve(roots, ...args) {\n return roots.map((root) => path.resolve(root, ...args));\n}\n\n/*\n * Parses an object if possible. Otherwise returns the object without parsing.\n */\nfunction safeJsonParse(obj) {\n try {\n return JSON.parse(obj);\n } catch (ign) {\n // ignore: this is not json parsable\n return obj;\n }\n}\n\n/*\n * Stringifies the object passed in, converting Buffers into Strings for better\n * display. This mimics JSON.stringify (see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify)\n * except the `replacer` argument can only be a function.\n *\n * @param {object} obj - the object to be serialized\n * @param {?function} replacer - function to transform the properties added to the\n * serialized object\n * @param {?number|string} space - used to insert white space into the output JSON\n * string for readability purposes. Defaults to 2\n * returns {string} - the JSON object serialized as a string\n */\nfunction jsonStringify(obj, replacer, space = 2) {\n // if no replacer is passed, or it is not a function, just use a pass-through\n if (!_.isFunction(replacer)) {\n replacer = (k, v) => v;\n }\n\n // Buffers cannot be serialized in a readable way\n const bufferToJSON = Buffer.prototype.toJSON;\n delete Buffer.prototype.toJSON;\n try {\n return JSON.stringify(\n obj,\n (key, value) => {\n const updatedValue = Buffer.isBuffer(value) ? value.toString('utf8') : value;\n return replacer(key, updatedValue);\n },\n space\n );\n } finally {\n // restore the function, so as to not break further serialization\n Buffer.prototype.toJSON = bufferToJSON;\n }\n}\n\n/*\n * Removes the wrapper from element, if it exists.\n * { ELEMENT: 4 } becomes 4\n * { element-6066-11e4-a52e-4f735466cecf: 5 } becomes 5\n */\nfunction unwrapElement(el) {\n for (const propName of [W3C_WEB_ELEMENT_IDENTIFIER, 'ELEMENT']) {\n if (_.has(el, propName)) {\n return el[propName];\n }\n }\n return el;\n}\n\nfunction wrapElement(elementId) {\n return {\n ELEMENT: elementId,\n [W3C_WEB_ELEMENT_IDENTIFIER]: elementId,\n };\n}\n\n/*\n * Returns object consisting of all properties in the original element\n * which were truthy given the predicate.\n * If the predicate is\n * * missing - it will remove all properties whose values are `undefined`\n * * a scalar - it will test all properties' values against that value\n * * a function - it will pass each value and the original object into the function\n */\nfunction filterObject(obj, predicate) {\n let newObj = _.clone(obj);\n if (_.isUndefined(predicate)) {\n // remove any element from the object whose value is undefined\n predicate = (v) => !_.isUndefined(v);\n } else if (!_.isFunction(predicate)) {\n // make predicate into a function\n const valuePredicate = predicate;\n predicate = (v) => v === valuePredicate;\n }\n for (const key of Object.keys(obj)) {\n if (!predicate(obj[key], obj)) {\n delete newObj[key];\n }\n }\n return newObj;\n}\n\n/**\n * Converts number of bytes to a readable size string.\n *\n * @param {number|string} bytes - The actual number of bytes.\n * @returns {string} The actual string representation, for example\n * '1.00 KB' for '1024 B'\n * @throws {Error} If bytes count cannot be converted to an integer or\n * if it is less than zero.\n */\nfunction toReadableSizeString(bytes) {\n const intBytes = parseInt(String(bytes), 10);\n if (isNaN(intBytes) || intBytes < 0) {\n throw new Error(`Cannot convert '${bytes}' to a readable size format`);\n }\n if (intBytes >= GiB) {\n return `${(intBytes / (GiB * 1.0)).toFixed(2)} GB`;\n } else if (intBytes >= MiB) {\n return `${(intBytes / (MiB * 1.0)).toFixed(2)} MB`;\n } else if (intBytes >= KiB) {\n return `${(intBytes / (KiB * 1.0)).toFixed(2)} KB`;\n }\n return `${intBytes} B`;\n}\n\n/**\n * Checks whether the given path is a subpath of the\n * particular root folder. Both paths can include .. and . specifiers\n *\n * @param {string} originalPath The absolute file/folder path\n * @param {string} root The absolute root folder path\n * @param {?boolean} forcePosix Set it to true if paths must be interpreted in POSIX format\n * @returns {boolean} true if the given original path is the subpath of the root folder\n * @throws {Error} if any of the given paths is not absolute\n */\nfunction isSubPath(originalPath, root, forcePosix = null) {\n const pathObj = forcePosix ? path.posix : path;\n for (const p of [originalPath, root]) {\n if (!pathObj.isAbsolute(p)) {\n throw new Error(`'${p}' is expected to be an absolute path`);\n }\n }\n const normalizedRoot = pathObj.normalize(root);\n const normalizedPath = pathObj.normalize(originalPath);\n return normalizedPath.startsWith(normalizedRoot);\n}\n\n/**\n * Checks whether the given paths are pointing to the same file system\n * destination.\n *\n * @param {string} path1 - Absolute or relative path to a file/folder\n * @param {string} path2 - Absolute or relative path to a file/folder\n * @param {...string} pathN - Zero or more absolute or relative paths to files/folders\n * @returns {Promise<boolean>} true if all paths are pointing to the same file system item\n */\nasync function isSameDestination(path1, path2, ...pathN) {\n const allPaths = [path1, path2, ...pathN];\n if (!(await B.reduce(allPaths, async (a, b) => a && (await fs.exists(b)), true))) {\n return false;\n }\n\n const areAllItemsEqual = (arr) => !!arr.reduce((a, b) => (a === b ? a : NaN));\n if (areAllItemsEqual(allPaths)) {\n return true;\n }\n\n let mapCb = async (x) =>\n (\n await fs.stat(x, {\n bigint: true,\n })\n ).ino;\n return areAllItemsEqual(await B.map(allPaths, mapCb));\n}\n\n/**\n * Coerces the given number/string to a valid version string\n *\n * @template {boolean} [Strict=true]\n * @param {string} ver - Version string to coerce\n * @param {Strict} [strict] - If `true` then an exception will be thrown\n * if `ver` cannot be coerced\n * @returns {Strict extends true ? string : string|null} Coerced version number or null if the string cannot be\n * coerced and strict mode is disabled\n * @throws {Error} if strict mode is enabled and `ver` cannot be coerced\n */\nfunction coerceVersion(ver, strict = /** @type {Strict} */ (true)) {\n const result = semver.valid(semver.coerce(`${ver}`));\n if (strict && !result) {\n throw new Error(`'${ver}' cannot be coerced to a valid version number`);\n }\n return /** @type {Strict extends true ? string : string?} */ (result);\n}\n\nconst SUPPORTED_OPERATORS = ['==', '!=', '>', '<', '>=', '<=', '='];\n\n/**\n * Compares two version strings\n *\n * @param {string} ver1 - The first version number to compare. Should be a valid\n * version number supported by semver parser.\n * @param {string} ver2 - The second version number to compare. Should be a valid\n * version number supported by semver parser.\n * @param {string} operator - One of supported version number operators:\n * ==, !=, >, <, <=, >=, =\n * @returns {boolean} true or false depending on the actual comparison result\n * @throws {Error} if an unsupported operator is supplied or any of the supplied\n * version strings cannot be coerced\n */\nfunction compareVersions(ver1, operator, ver2) {\n if (!SUPPORTED_OPERATORS.includes(operator)) {\n throw new Error(\n `The '${operator}' comparison operator is not supported. ` +\n `Only '${JSON.stringify(SUPPORTED_OPERATORS)}' operators are supported`\n );\n }\n\n const semverOperator = ['==', '!='].includes(operator) ? '=' : operator;\n const result = semver.satisfies(coerceVersion(ver1), `${semverOperator}${coerceVersion(ver2)}`);\n return operator === '!=' ? !result : result;\n}\n\n/**\n * Add appropriate quotes to command arguments. See https://github.com/substack/node-shell-quote\n * for more details\n *\n * @param {string|string[]} args - The arguments that will be parsed\n * @returns {string} - The arguments, quoted\n */\nfunction quote(args) {\n return shellQuote(_.castArray(args));\n}\n\n/**\n * This function is necessary to workaround unexpected memory leaks\n * caused by NodeJS string interning\n * behavior described in https://bugs.chromium.org/p/v8/issues/detail?id=2869\n *\n * @param {*} s - The string to unleak\n * @return {string} Either the unleaked string or the original object converted to string\n */\nfunction unleakString(s) {\n return ` ${s}`.substr(1);\n}\n\n/**\n * @typedef PluralizeOptions\n * @property {boolean} [inclusive=false] - Whether to prefix with the number (e.g., 3 ducks)\n */\n\n/**\n * Get the form of a word appropriate to the count\n *\n * @param {string} word - The word to pluralize\n * @param {number} count - How many of the word exist\n * @param {PluralizeOptions|boolean} options - options for word pluralization,\n * or a boolean indicating the options.inclusive property\n * @returns {string} The word pluralized according to the number\n */\nfunction pluralize(word, count, options = {}) {\n let inclusive = false;\n if (_.isBoolean(options)) {\n // if passed in as a boolean\n inclusive = options;\n } else if (_.isBoolean(options?.inclusive)) {\n // if passed in as an options hash\n inclusive = options.inclusive;\n }\n return pluralizeLib(word, count, inclusive);\n}\n\n/**\n * @typedef EncodingOptions\n * @property {number} [maxSize=1073741824] The maximum size of\n * the resulting buffer in bytes. This is set to 1GB by default, because\n * Appium limits the maximum HTTP body size to 1GB. Also, the NodeJS heap\n * size must be enough to keep the resulting object (usually this size is\n * limited to 1.4 GB)\n */\n\n/**\n * Converts contents of a local file to an in-memory base-64 encoded buffer.\n * The operation is memory-usage friendly and should be used while encoding\n * large files to base64\n *\n * @param {string} srcPath The full path to the file being encoded\n * @param {EncodingOptions} opts\n * @returns {Promise<Buffer>} base64-encoded content of the source file as memory buffer\n * @throws {Error} if there was an error while reading the source file\n * or the source file is too\n */\nasync function toInMemoryBase64(srcPath, opts = {}) {\n if (!(await fs.exists(srcPath)) || (await fs.stat(srcPath)).isDirectory()) {\n throw new Error(`No such file: ${srcPath}`);\n }\n\n const {maxSize = 1 * GiB} = opts;\n const resultBuffers = [];\n let resultBuffersSize = 0;\n const resultWriteStream = new stream.Writable({\n write: (buffer, encoding, next) => {\n resultBuffers.push(buffer);\n resultBuffersSize += buffer.length;\n if (maxSize > 0 && resultBuffersSize > maxSize) {\n resultWriteStream.emit(\n 'error',\n new Error(\n `The size of the resulting ` +\n `buffer must not be greater than ${toReadableSizeString(maxSize)}`\n )\n );\n }\n next();\n },\n });\n\n const readerStream = fs.createReadStream(srcPath);\n const base64EncoderStream = new Base64Encode();\n const resultWriteStreamPromise = new B((resolve, reject) => {\n resultWriteStream.once('error', (e) => {\n readerStream.unpipe(base64EncoderStream);\n base64EncoderStream.unpipe(resultWriteStream);\n readerStream.destroy();\n reject(e);\n });\n resultWriteStream.once('finish', resolve);\n });\n const readStreamPromise = new B((resolve, reject) => {\n readerStream.once('close', resolve);\n readerStream.once('error', (e) =>\n reject(new Error(`Failed to read '${srcPath}': ${e.message}`))\n );\n });\n readerStream.pipe(base64EncoderStream);\n base64EncoderStream.pipe(resultWriteStream);\n\n await B.all([readStreamPromise, resultWriteStreamPromise]);\n return Buffer.concat(resultBuffers);\n}\n\n/**\n * @typedef LockFileOptions\n * @property {number} [timeout=120] The max time in seconds to wait for the lock\n * @property {boolean} [tryRecovery=false] Whether to try lock recovery if\n * the first attempt to acquire it timed out.\n */\n\n/**\n * Create an async function which, when called, will not proceed until a certain file is no\n * longer present on the system. This allows for preventing concurrent behavior across processes\n * using a known lockfile path.\n *\n * @template T\n * @param {string} lockFile The full path to the file used for the lock\n * @param {LockFileOptions} opts\n * @returns async function that takes another async function defining the locked\n * behavior\n */\nfunction getLockFileGuard(lockFile, opts = {}) {\n const {timeout = 120, tryRecovery = false} = opts;\n\n const lock = /** @type {(lockfile: string, opts: import('lockfile').Options)=>B<void>} */ (\n B.promisify(_lockfile.lock)\n );\n const check = B.promisify(_lockfile.check);\n const unlock = B.promisify(_lockfile.unlock);\n\n /**\n * @param {(...args: any[]) => T} behavior\n * @returns {Promise<T>}\n */\n const guard = async (behavior) => {\n let triedRecovery = false;\n do {\n try {\n // if the lockfile doesn't exist, lock it synchronously to make sure no other call\n // on the same spin of the event loop can also initiate a lock. If the lockfile does exist\n // then just use the regular async 'lock' method which will wait on the lock.\n if (_lockfile.checkSync(lockFile)) {\n await lock(lockFile, {wait: timeout * 1000});\n } else {\n _lockfile.lockSync(lockFile);\n }\n break;\n } catch (e) {\n if (_.includes(e.message, 'EEXIST') && tryRecovery && !triedRecovery) {\n // There could be cases where a process has been forcefully terminated\n // without a chance to clean up pending locks: https://github.com/npm/lockfile/issues/26\n _lockfile.unlockSync(lockFile);\n triedRecovery = true;\n continue;\n }\n throw new Error(\n `Could not acquire lock on '${lockFile}' after ${timeout}s. ` +\n `Original error: ${e.message}`\n );\n }\n // eslint-disable-next-line no-constant-condition\n } while (true);\n try {\n return await behavior();\n } finally {\n // whether the behavior succeeded or not, get rid of the lock\n await unlock(lockFile);\n }\n };\n\n guard.check = async () => await check(lockFile);\n\n return guard;\n}\n\nexport {\n hasValue,\n escapeSpace,\n escapeSpecialChars,\n localIp,\n cancellableDelay,\n multiResolve,\n safeJsonParse,\n wrapElement,\n unwrapElement,\n filterObject,\n toReadableSizeString,\n isSubPath,\n W3C_WEB_ELEMENT_IDENTIFIER,\n isSameDestination,\n compareVersions,\n coerceVersion,\n quote,\n unleakString,\n jsonStringify,\n pluralize,\n GiB,\n MiB,\n KiB,\n toInMemoryBase64,\n uuidV1,\n uuidV3,\n uuidV4,\n uuidV5,\n shellParse,\n getLockFileGuard,\n};\n\n/**\n * A `string` which is never `''`.\n *\n * @template {string} T\n * @typedef {T extends '' ? never : T} NonEmptyString\n */\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAKA;;AACA;;AACA;;AACA;;AAOA;;;;AAEA,MAAMA,0BAA0B,GAAG,qCAAnC;;AACA,MAAMC,GAAG,GAAG,IAAZ;;AACA,MAAMC,GAAG,GAAGD,GAAG,GAAG,IAAlB;;AACA,MAAME,GAAG,GAAGD,GAAG,GAAG,IAAlB;;;AAOO,SAASE,UAAT,CAAoBC,GAApB,EAAyB;EAC9B,OAAOC,eAAA,CAAEC,QAAF,CAAWF,GAAX,KAAmBA,GAAG,KAAK,EAAlC;AACD;;AAUD,SAASG,QAAT,CAAkBH,GAAlB,EAAuB;EAErB,IAAIC,eAAA,CAAEG,QAAF,CAAWJ,GAAX,CAAJ,EAAqB;IACnB,OAAO,CAACC,eAAA,CAAEI,KAAF,CAAQL,GAAR,CAAR;EACD;;EACD,OAAO,CAACC,eAAA,CAAEK,WAAF,CAAcN,GAAd,CAAD,IAAuB,CAACC,eAAA,CAAEM,MAAF,CAASP,GAAT,CAA/B;AACD;;AAGD,SAASQ,WAAT,CAAqBC,GAArB,EAA0B;EACxB,OAAOA,GAAG,CAACC,KAAJ,CAAU,GAAV,EAAeC,IAAf,CAAoB,KAApB,CAAP;AACD;;AAED,SAASC,kBAAT,CAA4BH,GAA5B,EAAiCI,WAAjC,EAA8C;EAC5C,IAAI,OAAOJ,GAAP,KAAe,QAAnB,EAA6B;IAC3B,OAAOA,GAAP;EACD;;EACD,IAAI,OAAOI,WAAP,KAAuB,WAA3B,EAAwC;IACtCA,WAAW,GAAG,KAAd;EACD;;EACDJ,GAAG,GAAGA,GAAG,CACNK,OADG,CACK,OADL,EACc,MADd,EAEHA,OAFG,CAEK,OAFL,EAEc,KAFd,EAGHA,OAHG,CAGK,OAHL,EAGc,KAHd,EAIHA,OAJG,CAIK,OAJL,EAIc,KAJd,EAKHA,OALG,CAKK,OALL,EAKc,KALd,EAMHA,OANG,CAMK,OANL,EAMc,KANd,EAOHA,OAPG,CAOK,OAPL,EAOc,KAPd,EAQHA,OARG,CAQK,OARL,EAQc,KARd,EASHA,OATG,CASK,MATL,EASa,KATb,CAAN;;EAUA,IAAID,WAAJ,EAAiB;IACf,IAAIE,EAAE,GAAG,IAAIC,MAAJ,CAAWH,WAAX,EAAwB,GAAxB,CAAT;IACAJ,GAAG,GAAGA,GAAG,CAACK,OAAJ,CAAYC,EAAZ,EAAiB,KAAIF,WAAY,EAAjC,CAAN;EACD;;EACD,OAAOJ,GAAP;AACD;;AAED,SAASQ,OAAT,GAAmB;EACjB,IAAIC,EAAE,GAAGjB,eAAA,CAAEkB,KAAF,CAAQC,WAAA,CAAGC,iBAAH,EAAR,EACNC,MADM,GAENC,OAFM,GAINC,MAJM,CAIC,UAAUxB,GAAV,EAAe;IACrB,OAAOA,GAAG,CAACyB,MAAJ,KAAe,MAAf,IAAyBzB,GAAG,CAAC0B,QAAJ,KAAiB,KAAjD;EACD,CANM,EAONC,GAPM,CAOF,SAPE,EAQNC,KARM,GASNC,KATM,EAAT;;EAUA,OAAOX,EAAP;AACD;;AAMD,SAASY,gBAAT,CAA0BC,EAA1B,EAA8B;EAC5B,IAAIC,KAAJ;EACA,IAAIC,OAAJ;EACA,IAAIC,MAAJ;EAEA,MAAMC,KAAK,GAAG,IAAIC,iBAAA,CAAEC,OAAN,CAAc,CAACC,QAAD,EAAWC,OAAX,KAAuB;IACjDN,OAAO,GAAGK,QAAV;IACAJ,MAAM,GAAGK,OAAT;IACAP,KAAK,GAAGQ,UAAU,CAAC,YAAY;MAC7BP,OAAO;IACR,CAFiB,EAEfF,EAFe,CAAlB;EAGD,CANa,CAAd;;EAUAI,KAAK,CAACM,MAAN,GAAe,YAAY;IACzBC,YAAY,CAACV,KAAD,CAAZ;IACAE,MAAM,CAAC,IAAIE,iBAAA,CAAEO,iBAAN,EAAD,CAAN;EACD,CAHD;;EAIA,OAAOR,KAAP;AACD;;AAED,SAASS,YAAT,CAAsBC,KAAtB,EAA6B,GAAGC,IAAhC,EAAsC;EACpC,OAAOD,KAAK,CAAClB,GAAN,CAAWoB,IAAD,IAAUC,aAAA,CAAKf,OAAL,CAAac,IAAb,EAAmB,GAAGD,IAAtB,CAApB,CAAP;AACD;;AAKD,SAASG,aAAT,CAAuBC,GAAvB,EAA4B;EAC1B,IAAI;IACF,OAAOC,IAAI,CAACC,KAAL,CAAWF,GAAX,CAAP;EACD,CAFD,CAEE,OAAOG,GAAP,EAAY;IAEZ,OAAOH,GAAP;EACD;AACF;;AAcD,SAASI,aAAT,CAAuBJ,GAAvB,EAA4BK,QAA5B,EAAsCC,KAAK,GAAG,CAA9C,EAAiD;EAE/C,IAAI,CAACvD,eAAA,CAAEwD,UAAF,CAAaF,QAAb,CAAL,EAA6B;IAC3BA,QAAQ,GAAG,CAACG,CAAD,EAAIC,CAAJ,KAAUA,CAArB;EACD;;EAGD,MAAMC,YAAY,GAAGC,MAAM,CAACC,SAAP,CAAiBC,MAAtC;EACA,OAAOF,MAAM,CAACC,SAAP,CAAiBC,MAAxB;;EACA,IAAI;IACF,OAAOZ,IAAI,CAACa,SAAL,CACLd,GADK,EAEL,CAACe,GAAD,EAAMpC,KAAN,KAAgB;MACd,MAAMqC,YAAY,GAAGL,MAAM,CAACM,QAAP,CAAgBtC,KAAhB,IAAyBA,KAAK,CAACuC,QAAN,CAAe,MAAf,CAAzB,GAAkDvC,KAAvE;MACA,OAAO0B,QAAQ,CAACU,GAAD,EAAMC,YAAN,CAAf;IACD,CALI,EAMLV,KANK,CAAP;EAQD,CATD,SASU;IAERK,MAAM,CAACC,SAAP,CAAiBC,MAAjB,GAA0BH,YAA1B;EACD;AACF;;AAOD,SAASS,aAAT,CAAuBC,EAAvB,EAA2B;EACzB,KAAK,MAAMC,QAAX,IAAuB,CAAC5E,0BAAD,EAA6B,SAA7B,CAAvB,EAAgE;IAC9D,IAAIM,eAAA,CAAEuE,GAAF,CAAMF,EAAN,EAAUC,QAAV,CAAJ,EAAyB;MACvB,OAAOD,EAAE,CAACC,QAAD,CAAT;IACD;EACF;;EACD,OAAOD,EAAP;AACD;;AAED,SAASG,WAAT,CAAqBC,SAArB,EAAgC;EAC9B,OAAO;IACLC,OAAO,EAAED,SADJ;IAEL,CAAC/E,0BAAD,GAA8B+E;EAFzB,CAAP;AAID;;AAUD,SAASE,YAAT,CAAsB1B,GAAtB,EAA2B2B,SAA3B,EAAsC;EACpC,IAAIC,MAAM,GAAG7E,eAAA,CAAE8E,KAAF,CAAQ7B,GAAR,CAAb;;EACA,IAAIjD,eAAA,CAAEK,WAAF,CAAcuE,SAAd,CAAJ,EAA8B;IAE5BA,SAAS,GAAIlB,CAAD,IAAO,CAAC1D,eAAA,CAAEK,WAAF,CAAcqD,CAAd,CAApB;EACD,CAHD,MAGO,IAAI,CAAC1D,eAAA,CAAEwD,UAAF,CAAaoB,SAAb,CAAL,EAA8B;IAEnC,MAAMG,cAAc,GAAGH,SAAvB;;IACAA,SAAS,GAAIlB,CAAD,IAAOA,CAAC,KAAKqB,cAAzB;EACD;;EACD,KAAK,MAAMf,GAAX,IAAkBgB,MAAM,CAACC,IAAP,CAAYhC,GAAZ,CAAlB,EAAoC;IAClC,IAAI,CAAC2B,SAAS,CAAC3B,GAAG,CAACe,GAAD,CAAJ,EAAWf,GAAX,CAAd,EAA+B;MAC7B,OAAO4B,MAAM,CAACb,GAAD,CAAb;IACD;EACF;;EACD,OAAOa,MAAP;AACD;;AAWD,SAASK,oBAAT,CAA8BC,KAA9B,EAAqC;EACnC,MAAMC,QAAQ,GAAGC,QAAQ,CAACC,MAAM,CAACH,KAAD,CAAP,EAAgB,EAAhB,CAAzB;;EACA,IAAI/E,KAAK,CAACgF,QAAD,CAAL,IAAmBA,QAAQ,GAAG,CAAlC,EAAqC;IACnC,MAAM,IAAIG,KAAJ,CAAW,mBAAkBJ,KAAM,6BAAnC,CAAN;EACD;;EACD,IAAIC,QAAQ,IAAIvF,GAAhB,EAAqB;IACnB,OAAQ,GAAE,CAACuF,QAAQ,IAAIvF,GAAG,GAAG,GAAV,CAAT,EAAyB2F,OAAzB,CAAiC,CAAjC,CAAoC,KAA9C;EACD,CAFD,MAEO,IAAIJ,QAAQ,IAAIxF,GAAhB,EAAqB;IAC1B,OAAQ,GAAE,CAACwF,QAAQ,IAAIxF,GAAG,GAAG,GAAV,CAAT,EAAyB4F,OAAzB,CAAiC,CAAjC,CAAoC,KAA9C;EACD,CAFM,MAEA,IAAIJ,QAAQ,IAAIzF,GAAhB,EAAqB;IAC1B,OAAQ,GAAE,CAACyF,QAAQ,IAAIzF,GAAG,GAAG,GAAV,CAAT,EAAyB6F,OAAzB,CAAiC,CAAjC,CAAoC,KAA9C;EACD;;EACD,OAAQ,GAAEJ,QAAS,IAAnB;AACD;;AAYD,SAASK,SAAT,CAAmBC,YAAnB,EAAiC5C,IAAjC,EAAuC6C,UAAU,GAAG,IAApD,EAA0D;EACxD,MAAMC,OAAO,GAAGD,UAAU,GAAG5C,aAAA,CAAK8C,KAAR,GAAgB9C,aAA1C;;EACA,KAAK,MAAM+C,CAAX,IAAgB,CAACJ,YAAD,EAAe5C,IAAf,CAAhB,EAAsC;IACpC,IAAI,CAAC8C,OAAO,CAACG,UAAR,CAAmBD,CAAnB,CAAL,EAA4B;MAC1B,MAAM,IAAIP,KAAJ,CAAW,IAAGO,CAAE,sCAAhB,CAAN;IACD;EACF;;EACD,MAAME,cAAc,GAAGJ,OAAO,CAACK,SAAR,CAAkBnD,IAAlB,CAAvB;EACA,MAAMoD,cAAc,GAAGN,OAAO,CAACK,SAAR,CAAkBP,YAAlB,CAAvB;EACA,OAAOQ,cAAc,CAACC,UAAf,CAA0BH,cAA1B,CAAP;AACD;;AAWD,eAAeI,iBAAf,CAAiCC,KAAjC,EAAwCC,KAAxC,EAA+C,GAAGC,KAAlD,EAAyD;EACvD,MAAMC,QAAQ,GAAG,CAACH,KAAD,EAAQC,KAAR,EAAe,GAAGC,KAAlB,CAAjB;;EACA,IAAI,EAAE,MAAMpE,iBAAA,CAAEsE,MAAF,CAASD,QAAT,EAAmB,OAAOE,CAAP,EAAUC,CAAV,KAAgBD,CAAC,KAAK,MAAME,WAAA,CAAGC,MAAH,CAAUF,CAAV,CAAX,CAApC,EAA8D,IAA9D,CAAR,CAAJ,EAAkF;IAChF,OAAO,KAAP;EACD;;EAED,MAAMG,gBAAgB,GAAIC,GAAD,IAAS,CAAC,CAACA,GAAG,CAACN,MAAJ,CAAW,CAACC,CAAD,EAAIC,CAAJ,KAAWD,CAAC,KAAKC,CAAN,GAAUD,CAAV,GAAcM,GAApC,CAApC;;EACA,IAAIF,gBAAgB,CAACN,QAAD,CAApB,EAAgC;IAC9B,OAAO,IAAP;EACD;;EAED,IAAIS,KAAK,GAAG,MAAOC,CAAP,IACV,CACE,MAAMN,WAAA,CAAGO,IAAH,CAAQD,CAAR,EAAW;IACfE,MAAM,EAAE;EADO,CAAX,CADR,EAIEC,GALJ;;EAMA,OAAOP,gBAAgB,CAAC,MAAM3E,iBAAA,CAAET,GAAF,CAAM8E,QAAN,EAAgBS,KAAhB,CAAP,CAAvB;AACD;;AAaD,SAASK,aAAT,CAAuBC,GAAvB,EAA4BC,MAAM,GAA0B,IAA5D,EAAmE;EACjE,MAAMC,MAAM,GAAGC,eAAA,CAAOC,KAAP,CAAaD,eAAA,CAAOE,MAAP,CAAe,GAAEL,GAAI,EAArB,CAAb,CAAf;;EACA,IAAIC,MAAM,IAAI,CAACC,MAAf,EAAuB;IACrB,MAAM,IAAIlC,KAAJ,CAAW,IAAGgC,GAAI,+CAAlB,CAAN;EACD;;EACD,OAA8DE,MAA9D;AACD;;AAED,MAAMI,mBAAmB,GAAG,CAAC,IAAD,EAAO,IAAP,EAAa,GAAb,EAAkB,GAAlB,EAAuB,IAAvB,EAA6B,IAA7B,EAAmC,GAAnC,CAA5B;;AAeA,SAASC,eAAT,CAAyBC,IAAzB,EAA+BC,QAA/B,EAAyCC,IAAzC,EAA+C;EAC7C,IAAI,CAACJ,mBAAmB,CAACK,QAApB,CAA6BF,QAA7B,CAAL,EAA6C;IAC3C,MAAM,IAAIzC,KAAJ,CACH,QAAOyC,QAAS,0CAAjB,GACG,SAAQ9E,IAAI,CAACa,SAAL,CAAe8D,mBAAf,CAAoC,2BAF3C,CAAN;EAID;;EAED,MAAMM,cAAc,GAAG,CAAC,IAAD,EAAO,IAAP,EAAaD,QAAb,CAAsBF,QAAtB,IAAkC,GAAlC,GAAwCA,QAA/D;;EACA,MAAMP,MAAM,GAAGC,eAAA,CAAOU,SAAP,CAAiBd,aAAa,CAACS,IAAD,CAA9B,EAAuC,GAAEI,cAAe,GAAEb,aAAa,CAACW,IAAD,CAAO,EAA9E,CAAf;;EACA,OAAOD,QAAQ,KAAK,IAAb,GAAoB,CAACP,MAArB,GAA8BA,MAArC;AACD;;AASD,SAASY,KAAT,CAAexF,IAAf,EAAqB;EACnB,OAAO,IAAAyF,iBAAA,EAAWtI,eAAA,CAAEuI,SAAF,CAAY1F,IAAZ,CAAX,CAAP;AACD;;AAUD,SAAS2F,YAAT,CAAsBC,CAAtB,EAAyB;EACvB,OAAQ,IAAGA,CAAE,EAAN,CAAQC,MAAR,CAAe,CAAf,CAAP;AACD;;AAgBD,SAASC,SAAT,CAAmBC,IAAnB,EAAyBC,KAAzB,EAAgCC,OAAO,GAAG,EAA1C,EAA8C;EAC5C,IAAIC,SAAS,GAAG,KAAhB;;EACA,IAAI/I,eAAA,CAAEgJ,SAAF,CAAYF,OAAZ,CAAJ,EAA0B;IAExBC,SAAS,GAAGD,OAAZ;EACD,CAHD,MAGO,IAAI9I,eAAA,CAAEgJ,SAAF,CAAYF,OAAZ,aAAYA,OAAZ,uBAAYA,OAAO,CAAEC,SAArB,CAAJ,EAAqC;IAE1CA,SAAS,GAAGD,OAAO,CAACC,SAApB;EACD;;EACD,OAAO,IAAAE,kBAAA,EAAaL,IAAb,EAAmBC,KAAnB,EAA0BE,SAA1B,CAAP;AACD;;AAsBD,eAAeG,gBAAf,CAAgCC,OAAhC,EAAyCC,IAAI,GAAG,EAAhD,EAAoD;EAClD,IAAI,EAAE,MAAMxC,WAAA,CAAGC,MAAH,CAAUsC,OAAV,CAAR,KAA+B,CAAC,MAAMvC,WAAA,CAAGO,IAAH,CAAQgC,OAAR,CAAP,EAAyBE,WAAzB,EAAnC,EAA2E;IACzE,MAAM,IAAI9D,KAAJ,CAAW,iBAAgB4D,OAAQ,EAAnC,CAAN;EACD;;EAED,MAAM;IAACG,OAAO,GAAG,IAAIzJ;EAAf,IAAsBuJ,IAA5B;EACA,MAAMG,aAAa,GAAG,EAAtB;EACA,IAAIC,iBAAiB,GAAG,CAAxB;EACA,MAAMC,iBAAiB,GAAG,IAAIC,eAAA,CAAOC,QAAX,CAAoB;IAC5CC,KAAK,EAAE,CAACC,MAAD,EAASC,QAAT,EAAmBC,IAAnB,KAA4B;MACjCR,aAAa,CAACS,IAAd,CAAmBH,MAAnB;MACAL,iBAAiB,IAAIK,MAAM,CAACI,MAA5B;;MACA,IAAIX,OAAO,GAAG,CAAV,IAAeE,iBAAiB,GAAGF,OAAvC,EAAgD;QAC9CG,iBAAiB,CAACS,IAAlB,CACE,OADF,EAEE,IAAI3E,KAAJ,CACG,4BAAD,GACG,mCAAkCL,oBAAoB,CAACoE,OAAD,CAAU,EAFrE,CAFF;MAOD;;MACDS,IAAI;IACL;EAd2C,CAApB,CAA1B;;EAiBA,MAAMI,YAAY,GAAGvD,WAAA,CAAGwD,gBAAH,CAAoBjB,OAApB,CAArB;;EACA,MAAMkB,mBAAmB,GAAG,IAAIC,0BAAJ,EAA5B;EACA,MAAMC,wBAAwB,GAAG,IAAIpI,iBAAJ,CAAM,CAACH,OAAD,EAAUC,MAAV,KAAqB;IAC1DwH,iBAAiB,CAACe,IAAlB,CAAuB,OAAvB,EAAiCC,CAAD,IAAO;MACrCN,YAAY,CAACO,MAAb,CAAoBL,mBAApB;MACAA,mBAAmB,CAACK,MAApB,CAA2BjB,iBAA3B;MACAU,YAAY,CAACQ,OAAb;MACA1I,MAAM,CAACwI,CAAD,CAAN;IACD,CALD;IAMAhB,iBAAiB,CAACe,IAAlB,CAAuB,QAAvB,EAAiCxI,OAAjC;EACD,CARgC,CAAjC;EASA,MAAM4I,iBAAiB,GAAG,IAAIzI,iBAAJ,CAAM,CAACH,OAAD,EAAUC,MAAV,KAAqB;IACnDkI,YAAY,CAACK,IAAb,CAAkB,OAAlB,EAA2BxI,OAA3B;IACAmI,YAAY,CAACK,IAAb,CAAkB,OAAlB,EAA4BC,CAAD,IACzBxI,MAAM,CAAC,IAAIsD,KAAJ,CAAW,mBAAkB4D,OAAQ,MAAKsB,CAAC,CAACI,OAAQ,EAApD,CAAD,CADR;EAGD,CALyB,CAA1B;EAMAV,YAAY,CAACW,IAAb,CAAkBT,mBAAlB;EACAA,mBAAmB,CAACS,IAApB,CAAyBrB,iBAAzB;EAEA,MAAMtH,iBAAA,CAAE4I,GAAF,CAAM,CAACH,iBAAD,EAAoBL,wBAApB,CAAN,CAAN;EACA,OAAO3G,MAAM,CAACoH,MAAP,CAAczB,aAAd,CAAP;AACD;;AAoBD,SAAS0B,gBAAT,CAA0BC,QAA1B,EAAoC9B,IAAI,GAAG,EAA3C,EAA+C;EAC7C,MAAM;IAAC+B,OAAO,GAAG,GAAX;IAAgBC,WAAW,GAAG;EAA9B,IAAuChC,IAA7C;;EAEA,MAAMiC,IAAI,GACRlJ,iBAAA,CAAEmJ,SAAF,CAAYC,kBAAA,CAAUF,IAAtB,CADF;;EAGA,MAAMG,KAAK,GAAGrJ,iBAAA,CAAEmJ,SAAF,CAAYC,kBAAA,CAAUC,KAAtB,CAAd;;EACA,MAAMC,MAAM,GAAGtJ,iBAAA,CAAEmJ,SAAF,CAAYC,kBAAA,CAAUE,MAAtB,CAAf;;EAMA,MAAMC,KAAK,GAAG,MAAOC,QAAP,IAAoB;IAChC,IAAIC,aAAa,GAAG,KAApB;;IACA,GAAG;MACD,IAAI;QAIF,IAAIL,kBAAA,CAAUM,SAAV,CAAoBX,QAApB,CAAJ,EAAmC;UACjC,MAAMG,IAAI,CAACH,QAAD,EAAW;YAACY,IAAI,EAAEX,OAAO,GAAG;UAAjB,CAAX,CAAV;QACD,CAFD,MAEO;UACLI,kBAAA,CAAUQ,QAAV,CAAmBb,QAAnB;QACD;;QACD;MACD,CAVD,CAUE,OAAOT,CAAP,EAAU;QACV,IAAIzK,eAAA,CAAEkI,QAAF,CAAWuC,CAAC,CAACI,OAAb,EAAsB,QAAtB,KAAmCO,WAAnC,IAAkD,CAACQ,aAAvD,EAAsE;UAGpEL,kBAAA,CAAUS,UAAV,CAAqBd,QAArB;;UACAU,aAAa,GAAG,IAAhB;UACA;QACD;;QACD,MAAM,IAAIrG,KAAJ,CACH,8BAA6B2F,QAAS,WAAUC,OAAQ,KAAzD,GACG,mBAAkBV,CAAC,CAACI,OAAQ,EAF3B,CAAN;MAID;IAEF,CAzBD,QAyBS,IAzBT;;IA0BA,IAAI;MACF,OAAO,MAAMc,QAAQ,EAArB;IACD,CAFD,SAEU;MAER,MAAMF,MAAM,CAACP,QAAD,CAAZ;IACD;EACF,CAlCD;;EAoCAQ,KAAK,CAACF,KAAN,GAAc,YAAY,MAAMA,KAAK,CAACN,QAAD,CAArC;;EAEA,OAAOQ,KAAP;AACD"}
|
package/build/lib/zip.js
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
3
|
Object.defineProperty(exports, "__esModule", {
|
|
6
4
|
value: true
|
|
7
5
|
});
|
|
@@ -45,6 +43,8 @@ var _getStream = _interopRequireDefault(require("get-stream"));
|
|
|
45
43
|
|
|
46
44
|
var _teen_process = require("teen_process");
|
|
47
45
|
|
|
46
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
47
|
+
|
|
48
48
|
const openZip = _bluebird.default.promisify(_yauzl.default.open);
|
|
49
49
|
|
|
50
50
|
const pipeline = _bluebird.default.promisify(_stream.default.pipeline);
|
|
@@ -458,4 +458,4 @@ var _default = {
|
|
|
458
458
|
toArchive
|
|
459
459
|
};
|
|
460
460
|
exports.default = _default;
|
|
461
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJvcGVuWmlwIiwiQiIsInByb21pc2lmeSIsInlhdXpsIiwib3BlbiIsInBpcGVsaW5lIiwic3RyZWFtIiwiWklQX01BR0lDIiwiSUZNVCIsIklGRElSIiwiSUZMTksiLCJaaXBFeHRyYWN0b3IiLCJ6aXBmaWxlIiwiY29uc3RydWN0b3IiLCJzb3VyY2VQYXRoIiwib3B0cyIsInppcFBhdGgiLCJjYW5jZWxlZCIsImV4dHJhY3RGaWxlTmFtZSIsImVudHJ5IiwiXyIsImlzQnVmZmVyIiwiZmlsZU5hbWUiLCJ0b1N0cmluZyIsImZpbGVOYW1lc0VuY29kaW5nIiwiZXh0cmFjdCIsImRpciIsImxhenlFbnRyaWVzIiwiZGVjb2RlU3RyaW5ncyIsInJlc29sdmUiLCJyZWplY3QiLCJvbiIsImVyciIsInJlYWRFbnRyeSIsInN0YXJ0c1dpdGgiLCJkZXN0RGlyIiwicGF0aCIsImRpcm5hbWUiLCJqb2luIiwiZnMiLCJta2RpciIsInJlY3Vyc2l2ZSIsImNhbm9uaWNhbERlc3REaXIiLCJyZWFscGF0aCIsInJlbGF0aXZlRGVzdERpciIsInJlbGF0aXZlIiwic3BsaXQiLCJzZXAiLCJpbmNsdWRlcyIsIkVycm9yIiwiZXh0cmFjdEVudHJ5IiwiY2xvc2UiLCJkZXN0IiwibW9kZSIsImV4dGVybmFsRmlsZUF0dHJpYnV0ZXMiLCJpc1N5bWxpbmsiLCJpc0RpciIsImVuZHNXaXRoIiwidmVyc2lvbk1hZGVCeSIsInByb2NNb2RlIiwiZ2V0RXh0cmFjdGVkTW9kZSIsIm1rZGlyT3B0aW9ucyIsIm9wZW5SZWFkU3RyZWFtIiwiYmluZCIsInJlYWRTdHJlYW0iLCJsaW5rIiwiZ2V0U3RyZWFtIiwic3ltbGluayIsImNyZWF0ZVdyaXRlU3RyZWFtIiwiZW50cnlNb2RlIiwiZGVmYXVsdERpck1vZGUiLCJkZWZhdWx0RmlsZU1vZGUiLCJwYXJzZUludCIsImV4dHJhY3RBbGxUbyIsInppcEZpbGVQYXRoIiwiaXNBYnNvbHV0ZSIsInVzZVN5c3RlbVVuemlwIiwiZXh0cmFjdFdpdGhTeXN0ZW1VbnppcCIsImxvZyIsIndhcm4iLCJzdGRlcnIiLCJtZXNzYWdlIiwiZXh0cmFjdG9yIiwiaXNXaW5kb3dzSG9zdCIsImlzV2luZG93cyIsImV4ZWN1dGFibGVQYXRoIiwiZ2V0RXhlY3V0YWJsZVBhdGgiLCJlIiwiZXhlYyIsIl9leHRyYWN0RW50cnlUbyIsInppcEZpbGUiLCJkc3RQYXRoIiwidGVzdCIsImV4aXN0cyIsIm1rZGlycCIsIndyaXRlU3RyZWFtIiwiZmxhZ3MiLCJ3cml0ZVN0cmVhbVByb21pc2UiLCJvbmNlIiwiemlwUmVhZFN0cmVhbSIsInppcFJlYWRTdHJlYW1Qcm9taXNlIiwicGlwZSIsImFsbCIsInJlYWRFbnRyaWVzIiwib25FbnRyeSIsInJlcyIsImV4dHJhY3RFbnRyeVRvIiwiZW1pdCIsInRvSW5NZW1vcnlaaXAiLCJzcmNQYXRoIiwiaXNNZXRlcmVkIiwiZW5jb2RlVG9CYXNlNjQiLCJtYXhTaXplIiwiR2lCIiwibGV2ZWwiLCJyZXN1bHRCdWZmZXJzIiwicmVzdWx0QnVmZmVyc1NpemUiLCJyZXN1bHRXcml0ZVN0cmVhbSIsIldyaXRhYmxlIiwid3JpdGUiLCJidWZmZXIiLCJlbmNvZGluZyIsIm5leHQiLCJwdXNoIiwibGVuZ3RoIiwidG9SZWFkYWJsZVNpemVTdHJpbmciLCJhcmNoaXZlIiwiYXJjaGl2ZXIiLCJ6bGliIiwic3JjU2l6ZSIsImJhc2U2NEVuY29kZXJTdHJlYW0iLCJCYXNlNjRFbmNvZGUiLCJyZXN1bHRXcml0ZVN0cmVhbVByb21pc2UiLCJ1bnBpcGUiLCJhYm9ydCIsImRlc3Ryb3kiLCJwb2ludGVyIiwiYXJjaGl2ZVN0cmVhbVByb21pc2UiLCJ0aW1lciIsIlRpbWVyIiwic3RhcnQiLCJzdGF0IiwiaXNEaXJlY3RvcnkiLCJkaXJlY3RvcnkiLCJmaWxlIiwibmFtZSIsImJhc2VuYW1lIiwiZmluYWxpemUiLCJkZWJ1ZyIsImdldER1cmF0aW9uIiwiYXNTZWNvbmRzIiwidG9GaXhlZCIsIkJ1ZmZlciIsImNvbmNhdCIsImFzc2VydFZhbGlkWmlwIiwiZmlsZVBhdGgiLCJzaXplIiwiZmQiLCJhbGxvYyIsInJlYWQiLCJzaWduYXR1cmUiLCJ0b0FyY2hpdmUiLCJzcmMiLCJwYXR0ZXJuIiwiY3dkIiwiaWdub3JlIiwiZ2xvYiIsIm1lbW9pemUiLCJiaW5hcnlOYW1lIiwiZnVsbFBhdGgiLCJ3aGljaCJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi96aXAuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB5YXV6bCBmcm9tICd5YXV6bCc7XG5pbXBvcnQgYXJjaGl2ZXIgZnJvbSAnYXJjaGl2ZXInO1xuaW1wb3J0IHtjcmVhdGVXcml0ZVN0cmVhbX0gZnJvbSAnZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgc3RyZWFtIGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgZnMgZnJvbSAnLi9mcyc7XG5pbXBvcnQge2lzV2luZG93c30gZnJvbSAnLi9zeXN0ZW0nO1xuaW1wb3J0IHtCYXNlNjRFbmNvZGV9IGZyb20gJ2Jhc2U2NC1zdHJlYW0nO1xuaW1wb3J0IHt0b1JlYWRhYmxlU2l6ZVN0cmluZywgR2lCfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IFRpbWVyIGZyb20gJy4vdGltaW5nJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IGdldFN0cmVhbSBmcm9tICdnZXQtc3RyZWFtJztcbmltcG9ydCB7ZXhlY30gZnJvbSAndGVlbl9wcm9jZXNzJztcblxuLyoqXG4gKiBAdHlwZSB7KHBhdGg6IHN0cmluZywgb3B0aW9ucz86IHlhdXpsLk9wdGlvbnMpID0+IFByb21pc2U8eWF1emwuWmlwRmlsZT59XG4gKi9cbmNvbnN0IG9wZW5aaXAgPSBCLnByb21pc2lmeSh5YXV6bC5vcGVuKTtcbi8qKlxuICogQHR5cGUgeyhzb3VyY2U6IE5vZGVKUy5SZWFkYWJsZVN0cmVhbSwgZGVzdGluYXRpb246IE5vZGVKUy5Xcml0YWJsZVN0cmVhbSkgPT4gUHJvbWlzZTxOb2RlSlMuV3JpdGFibGVTdHJlYW0+fVxuICovXG5jb25zdCBwaXBlbGluZSA9IEIucHJvbWlzaWZ5KHN0cmVhbS5waXBlbGluZSk7XG5jb25zdCBaSVBfTUFHSUMgPSAnUEsnO1xuY29uc3QgSUZNVCA9IDYxNDQwO1xuY29uc3QgSUZESVIgPSAxNjM4NDtcbmNvbnN0IElGTE5LID0gNDA5NjA7XG5cbi8vIFRoaXMgY2xhc3MgaXMgbW9zdGx5IGNvcGllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXhvZ2Rlbi9leHRyYWN0LXppcC9ibG9iL21hc3Rlci9pbmRleC5qc1xuY2xhc3MgWmlwRXh0cmFjdG9yIHtcbiAgLyoqIEB0eXBlIHt5YXV6bC5aaXBGaWxlfSAqL1xuICB6aXBmaWxlO1xuXG4gIGNvbnN0cnVjdG9yKHNvdXJjZVBhdGgsIG9wdHMgPSB7fSkge1xuICAgIHRoaXMuemlwUGF0aCA9IHNvdXJjZVBhdGg7XG4gICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICB0aGlzLmNhbmNlbGVkID0gZmFsc2U7XG4gIH1cblxuICBleHRyYWN0RmlsZU5hbWUoZW50cnkpIHtcbiAgICByZXR1cm4gXy5pc0J1ZmZlcihlbnRyeS5maWxlTmFtZSlcbiAgICAgID8gZW50cnkuZmlsZU5hbWUudG9TdHJpbmcodGhpcy5vcHRzLmZpbGVOYW1lc0VuY29kaW5nKVxuICAgICAgOiBlbnRyeS5maWxlTmFtZTtcbiAgfVxuXG4gIGFzeW5jIGV4dHJhY3QoKSB7XG4gICAgY29uc3Qge2RpciwgZmlsZU5hbWVzRW5jb2Rpbmd9ID0gdGhpcy5vcHRzO1xuICAgIHRoaXMuemlwZmlsZSA9IGF3YWl0IG9wZW5aaXAodGhpcy56aXBQYXRoLCB7XG4gICAgICBsYXp5RW50cmllczogdHJ1ZSxcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90aGVqb3Nod29sZmUveWF1emwvY29tbWl0L2NjNzQ1NWFjNzg5YmE4NDk3MzE4NGU1ZWJkZTA1ODFjZGM0YzNiMzkjZGlmZi0wNGM2ZTkwZmFhYzI2NzVhYTg5ZTIxNzZkMmVlYzdkOFI5NVxuICAgICAgZGVjb2RlU3RyaW5nczogIWZpbGVOYW1lc0VuY29kaW5nLFxuICAgIH0pO1xuICAgIHRoaXMuY2FuY2VsZWQgPSBmYWxzZTtcblxuICAgIHJldHVybiBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnppcGZpbGUub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICB0aGlzLmNhbmNlbGVkID0gdHJ1ZTtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuemlwZmlsZS5yZWFkRW50cnkoKTtcblxuICAgICAgdGhpcy56aXBmaWxlLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmNhbmNlbGVkKSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy56aXBmaWxlLm9uKCdlbnRyeScsIGFzeW5jIChlbnRyeSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jYW5jZWxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gdGhpcy5leHRyYWN0RmlsZU5hbWUoZW50cnkpO1xuICAgICAgICBpZiAoZmlsZU5hbWUuc3RhcnRzV2l0aCgnX19NQUNPU1gvJykpIHtcbiAgICAgICAgICB0aGlzLnppcGZpbGUucmVhZEVudHJ5KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVzdERpciA9IHBhdGguZGlybmFtZShwYXRoLmpvaW4oZGlyLCBmaWxlTmFtZSkpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKGRlc3REaXIsIHtyZWN1cnNpdmU6IHRydWV9KTtcblxuICAgICAgICAgIGNvbnN0IGNhbm9uaWNhbERlc3REaXIgPSBhd2FpdCBmcy5yZWFscGF0aChkZXN0RGlyKTtcbiAgICAgICAgICBjb25zdCByZWxhdGl2ZURlc3REaXIgPSBwYXRoLnJlbGF0aXZlKGRpciwgY2Fub25pY2FsRGVzdERpcik7XG5cbiAgICAgICAgICBpZiAocmVsYXRpdmVEZXN0RGlyLnNwbGl0KHBhdGguc2VwKS5pbmNsdWRlcygnLi4nKSkge1xuICAgICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgT3V0IG9mIGJvdW5kIHBhdGggXCIke2Nhbm9uaWNhbERlc3REaXJ9XCIgZm91bmQgd2hpbGUgcHJvY2Vzc2luZyBmaWxlICR7ZmlsZU5hbWV9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhd2FpdCB0aGlzLmV4dHJhY3RFbnRyeShlbnRyeSk7XG4gICAgICAgICAgdGhpcy56aXBmaWxlLnJlYWRFbnRyeSgpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aGlzLmNhbmNlbGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnppcGZpbGUuY2xvc2UoKTtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBleHRyYWN0RW50cnkoZW50cnkpIHtcbiAgICBpZiAodGhpcy5jYW5jZWxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHtkaXJ9ID0gdGhpcy5vcHRzO1xuXG4gICAgY29uc3QgZmlsZU5hbWUgPSB0aGlzLmV4dHJhY3RGaWxlTmFtZShlbnRyeSk7XG4gICAgY29uc3QgZGVzdCA9IHBhdGguam9pbihkaXIsIGZpbGVOYW1lKTtcblxuICAgIC8vIGNvbnZlcnQgZXh0ZXJuYWwgZmlsZSBhdHRyIGludCBpbnRvIGEgZnMgc3RhdCBtb2RlIGludFxuICAgIGNvbnN0IG1vZGUgPSAoZW50cnkuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyA+PiAxNikgJiAweGZmZmY7XG4gICAgLy8gY2hlY2sgaWYgaXQncyBhIHN5bWxpbmsgb3IgZGlyICh1c2luZyBzdGF0IG1vZGUgY29uc3RhbnRzKVxuICAgIGNvbnN0IGlzU3ltbGluayA9IChtb2RlICYgSUZNVCkgPT09IElGTE5LO1xuICAgIGNvbnN0IGlzRGlyID1cbiAgICAgIChtb2RlICYgSUZNVCkgPT09IElGRElSIHx8XG4gICAgICAvLyBGYWlsc2FmZSwgYm9ycm93ZWQgZnJvbSBqc1ppcFxuICAgICAgZmlsZU5hbWUuZW5kc1dpdGgoJy8nKSB8fFxuICAgICAgLy8gY2hlY2sgZm9yIHdpbmRvd3Mgd2VpcmQgd2F5IG9mIHNwZWNpZnlpbmcgYSBkaXJlY3RvcnlcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXhvZ2Rlbi9leHRyYWN0LXppcC9pc3N1ZXMvMTMjaXNzdWVjb21tZW50LTE1NDQ5NDU2NlxuICAgICAgKGVudHJ5LnZlcnNpb25NYWRlQnkgPj4gOCA9PT0gMCAmJiBlbnRyeS5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzID09PSAxNik7XG4gICAgY29uc3QgcHJvY01vZGUgPSB0aGlzLmdldEV4dHJhY3RlZE1vZGUobW9kZSwgaXNEaXIpICYgMG83Nzc7XG4gICAgLy8gYWx3YXlzIGVuc3VyZSBmb2xkZXJzIGFyZSBjcmVhdGVkXG4gICAgY29uc3QgZGVzdERpciA9IGlzRGlyID8gZGVzdCA6IHBhdGguZGlybmFtZShkZXN0KTtcbiAgICBjb25zdCBta2Rpck9wdGlvbnMgPSB7cmVjdXJzaXZlOiB0cnVlfTtcbiAgICBpZiAoaXNEaXIpIHtcbiAgICAgIG1rZGlyT3B0aW9ucy5tb2RlID0gcHJvY01vZGU7XG4gICAgfVxuICAgIGF3YWl0IGZzLm1rZGlyKGRlc3REaXIsIG1rZGlyT3B0aW9ucyk7XG4gICAgaWYgKGlzRGlyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHsoZW50cnk6IHlhdXpsLkVudHJ5KSA9PiBQcm9taXNlPE5vZGVKUy5SZWFkYWJsZVN0cmVhbT59ICovXG4gICAgY29uc3Qgb3BlblJlYWRTdHJlYW0gPSBCLnByb21pc2lmeSh0aGlzLnppcGZpbGUub3BlblJlYWRTdHJlYW0uYmluZCh0aGlzLnppcGZpbGUpKTtcbiAgICBjb25zdCByZWFkU3RyZWFtID0gYXdhaXQgb3BlblJlYWRTdHJlYW0oZW50cnkpO1xuICAgIGlmIChpc1N5bWxpbmspIHtcbiAgICAgIGNvbnN0IGxpbmsgPSBhd2FpdCBnZXRTdHJlYW0ocmVhZFN0cmVhbSk7XG4gICAgICBhd2FpdCBmcy5zeW1saW5rKGxpbmssIGRlc3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBwaXBlbGluZShyZWFkU3RyZWFtLCBmcy5jcmVhdGVXcml0ZVN0cmVhbShkZXN0LCB7bW9kZTogcHJvY01vZGV9KSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RXh0cmFjdGVkTW9kZShlbnRyeU1vZGUsIGlzRGlyKSB7XG4gICAgY29uc3Qge2RlZmF1bHREaXJNb2RlLCBkZWZhdWx0RmlsZU1vZGV9ID0gdGhpcy5vcHRzO1xuXG4gICAgbGV0IG1vZGUgPSBlbnRyeU1vZGU7XG4gICAgLy8gU2V0IGRlZmF1bHRzLCBpZiBuZWNlc3NhcnlcbiAgICBpZiAobW9kZSA9PT0gMCkge1xuICAgICAgaWYgKGlzRGlyKSB7XG4gICAgICAgIGlmIChkZWZhdWx0RGlyTW9kZSkge1xuICAgICAgICAgIG1vZGUgPSBwYXJzZUludChkZWZhdWx0RGlyTW9kZSwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFtb2RlKSB7XG4gICAgICAgICAgbW9kZSA9IDBvNzU1O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZGVmYXVsdEZpbGVNb2RlKSB7XG4gICAgICAgICAgbW9kZSA9IHBhcnNlSW50KGRlZmF1bHRGaWxlTW9kZSwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFtb2RlKSB7XG4gICAgICAgICAgbW9kZSA9IDBvNjQ0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGU7XG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZWRlZiBFeHRyYWN0QWxsT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtmaWxlTmFtZXNFbmNvZGluZ10gVGhlIGVuY29kaW5nIHRvIHVzZSBmb3IgZXh0cmFjdGVkIGZpbGUgbmFtZXMuXG4gKiBGb3IgWklQIGFyY2hpdmVzIGNyZWF0ZWQgb24gTWFjT1MgaXQgaXMgdXN1YWxseSBleHBlY3RlZCB0byBiZSBgdXRmOGAuXG4gKiBCeSBkZWZhdWx0IGl0IGlzIGF1dG9kZXRlY3RlZCBiYXNlZCBvbiB0aGUgZW50cnkgbWV0YWRhdGEgYW5kIGlzIG9ubHkgbmVlZGVkIHRvIGJlIHNldCBleHBsaWNpdGx5XG4gKiBpZiB0aGUgcGFydGljdWxhciBhcmNoaXZlIGRvZXMgbm90IGNvbXBseSB0byB0aGUgc3RhbmRhcmRzLCB3aGljaCBsZWFkcyB0byBjb3JydXB0ZWQgZmlsZSBuYW1lc1xuICogYWZ0ZXIgZXh0cmFjdGlvbi4gT25seSBhcHBsaWNhYmxlIGlmIHN5c3RlbSB1bnppcCBiaW5hcnkgaXMgTk9UIGJlaW5nIHVzZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt1c2VTeXN0ZW1VbnppcF0gSWYgdHJ1ZSwgYXR0ZW1wdCB0byB1c2Ugc3lzdGVtIHVuemlwOyBpZiB0aGlzIGZhaWxzLFxuICogZmFsbGJhY2sgdG8gdGhlIEpTIHVuemlwIGltcGxlbWVudGF0aW9uLlxuICovXG5cbi8qKlxuICogRXh0cmFjdCB6aXBmaWxlIHRvIGEgZGlyZWN0b3J5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHppcEZpbGVQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIHNvdXJjZSBaSVAgZmlsZVxuICogQHBhcmFtIHtzdHJpbmd9IGRlc3REaXIgVGhlIGZ1bGwgcGF0aCB0byB0aGUgZGVzdGluYXRpb24gZm9sZGVyXG4gKiBAcGFyYW0ge0V4dHJhY3RBbGxPcHRpb25zfSBbb3B0c11cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXh0cmFjdEFsbFRvKHppcEZpbGVQYXRoLCBkZXN0RGlyLCBvcHRzID0gLyoqIEB0eXBlIHtFeHRyYWN0QWxsT3B0aW9uc30gKi8gKHt9KSkge1xuICBpZiAoIXBhdGguaXNBYnNvbHV0ZShkZXN0RGlyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGFyZ2V0IHBhdGggJyR7ZGVzdERpcn0nIGlzIGV4cGVjdGVkIHRvIGJlIGFic29sdXRlYCk7XG4gIH1cblxuICBhd2FpdCBmcy5ta2RpcihkZXN0RGlyLCB7cmVjdXJzaXZlOiB0cnVlfSk7XG4gIGNvbnN0IGRpciA9IGF3YWl0IGZzLnJlYWxwYXRoKGRlc3REaXIpO1xuICBpZiAob3B0cy51c2VTeXN0ZW1VbnppcCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleHRyYWN0V2l0aFN5c3RlbVVuemlwKHppcEZpbGVQYXRoLCBkaXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLndhcm4oJ3VuemlwIGZhaWxlZDsgZmFsbGluZyBiYWNrIHRvIEpTOiAlcycsIGVyci5zdGRlcnIgfHwgZXJyLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuICBjb25zdCBleHRyYWN0b3IgPSBuZXcgWmlwRXh0cmFjdG9yKHppcEZpbGVQYXRoLCB7XG4gICAgLi4ub3B0cyxcbiAgICBkaXIsXG4gIH0pO1xuICBhd2FpdCBleHRyYWN0b3IuZXh0cmFjdCgpO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIHN5c3RlbSB1bnppcCAoZS5nLiwgYC91c3IvYmluL3VuemlwYCkuIElmIGF2YWlsYWJsZSwgaXQgaXNcbiAqIHNpZ25pZmljYW50bHkgZmFzdGVyIHRoYW4gdGhlIEpTIGltcGxlbWVudGF0aW9uLlxuICogQnkgZGVmYXVsdCBhbGwgZmlsZXMgaW4gdGhlIGRlc3REaXIgZ2V0IG92ZXJyaWRkZW4gaWYgYWxyZWFkeSBleGlzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gemlwRmlsZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgc291cmNlIFpJUCBmaWxlXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzdERpciBUaGUgZnVsbCBwYXRoIHRvIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIuXG4gKiBUaGlzIGZvbGRlciBpcyBleHBlY3RlZCB0byBhbHJlYWR5IGV4aXN0IGJlZm9yZSBleHRyYWN0aW5nIHRoZSBhcmNoaXZlLlxuICovXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0V2l0aFN5c3RlbVVuemlwKHppcEZpbGVQYXRoLCBkZXN0RGlyKSB7XG4gIGNvbnN0IGlzV2luZG93c0hvc3QgPSBpc1dpbmRvd3MoKTtcbiAgbGV0IGV4ZWN1dGFibGVQYXRoO1xuICB0cnkge1xuICAgIGV4ZWN1dGFibGVQYXRoID0gYXdhaXQgZ2V0RXhlY3V0YWJsZVBhdGgoaXNXaW5kb3dzSG9zdCA/ICdwb3dlcnNoZWxsLmV4ZScgOiAndW56aXAnKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgc3lzdGVtIHVuemlwJyk7XG4gIH1cblxuICBpZiAoaXNXaW5kb3dzSG9zdCkge1xuICAgIC8vIG9uIFdpbmRvd3Mgd2UgdXNlIFBvd2VyU2hlbGwgdG8gdW56aXAgZmlsZXNcbiAgICBhd2FpdCBleGVjKGV4ZWN1dGFibGVQYXRoLCBbXG4gICAgICAnLWNvbW1hbmQnLFxuICAgICAgJ0V4cGFuZC1BcmNoaXZlJyxcbiAgICAgICctTGl0ZXJhbFBhdGgnLFxuICAgICAgemlwRmlsZVBhdGgsXG4gICAgICAnLURlc3RpbmF0aW9uUGF0aCcsXG4gICAgICBkZXN0RGlyLFxuICAgICAgJy1Gb3JjZScsXG4gICAgXSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gLXEgbWVhbnMgcXVpZXQgKG5vIHN0ZG91dClcbiAgICAvLyAtbyBtZWFucyBvdmVyd3JpdGVcbiAgICAvLyAtZCBpcyB0aGUgZGVzdCBkaXJcbiAgICBhd2FpdCBleGVjKGV4ZWN1dGFibGVQYXRoLCBbJy1xJywgJy1vJywgemlwRmlsZVBhdGgsICctZCcsIGRlc3REaXJdKTtcbiAgfVxufVxuXG4vKipcbiAqIEV4dHJhY3QgYSBzaW5nbGUgemlwIGVudHJ5IHRvIGEgZGlyZWN0b3J5XG4gKlxuICogQHBhcmFtIHt5YXV6bC5aaXBGaWxlfSB6aXBGaWxlIFRoZSBzb3VyY2UgWklQIHN0cmVhbVxuICogQHBhcmFtIHt5YXV6bC5FbnRyeX0gZW50cnkgVGhlIGVudHJ5IGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzdERpciBUaGUgZnVsbCBwYXRoIHRvIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gX2V4dHJhY3RFbnRyeVRvKHppcEZpbGUsIGVudHJ5LCBkZXN0RGlyKSB7XG4gIGNvbnN0IGRzdFBhdGggPSBwYXRoLnJlc29sdmUoZGVzdERpciwgZW50cnkuZmlsZU5hbWUpO1xuXG4gIC8vIENyZWF0ZSBkZXN0IGRpcmVjdG9yeSBpZiBkb2Vzbid0IGV4aXN0IGFscmVhZHlcbiAgaWYgKC9cXC8kLy50ZXN0KGVudHJ5LmZpbGVOYW1lKSkge1xuICAgIGlmICghKGF3YWl0IGZzLmV4aXN0cyhkc3RQYXRoKSkpIHtcbiAgICAgIGF3YWl0IGZzLm1rZGlycChkc3RQYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9IGVsc2UgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKHBhdGguZGlybmFtZShkc3RQYXRoKSkpKSB7XG4gICAgYXdhaXQgZnMubWtkaXJwKHBhdGguZGlybmFtZShkc3RQYXRoKSk7XG4gIH1cblxuICAvLyBDcmVhdGUgYSB3cml0ZSBzdHJlYW1cbiAgY29uc3Qgd3JpdGVTdHJlYW0gPSBjcmVhdGVXcml0ZVN0cmVhbShkc3RQYXRoLCB7ZmxhZ3M6ICd3J30pO1xuICBjb25zdCB3cml0ZVN0cmVhbVByb21pc2UgPSBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgd3JpdGVTdHJlYW0ub25jZSgnZmluaXNoJywgcmVzb2x2ZSk7XG4gICAgd3JpdGVTdHJlYW0ub25jZSgnZXJyb3InLCByZWplY3QpO1xuICB9KTtcblxuICAvLyBDcmVhdGUgemlwUmVhZFN0cmVhbSBhbmQgcGlwZSBkYXRhIHRvIHRoZSB3cml0ZSBzdHJlYW1cbiAgLy8gKGZvciBzb21lIG9kZCByZWFzb24gQi5wcm9taXNpZnkgZG9lc24ndCB3b3JrIG9uIHppcGZpbGUub3BlblJlYWRTdHJlYW0sIGl0IGNhdXNlcyBhbiBlcnJvciAnY2xvc2VkJylcbiAgY29uc3QgemlwUmVhZFN0cmVhbSA9IGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB6aXBGaWxlLm9wZW5SZWFkU3RyZWFtKGVudHJ5LCAoZXJyLCByZWFkU3RyZWFtKSA9PiAoZXJyID8gcmVqZWN0KGVycikgOiByZXNvbHZlKHJlYWRTdHJlYW0pKSk7XG4gIH0pO1xuICBjb25zdCB6aXBSZWFkU3RyZWFtUHJvbWlzZSA9IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB6aXBSZWFkU3RyZWFtLm9uY2UoJ2VuZCcsIHJlc29sdmUpO1xuICAgIHppcFJlYWRTdHJlYW0ub25jZSgnZXJyb3InLCByZWplY3QpO1xuICB9KTtcbiAgemlwUmVhZFN0cmVhbS5waXBlKHdyaXRlU3RyZWFtKTtcblxuICAvLyBXYWl0IGZvciB0aGUgemlwUmVhZFN0cmVhbSBhbmQgd3JpdGVTdHJlYW0gdG8gZW5kIGJlZm9yZSByZXR1cm5pbmdcbiAgcmV0dXJuIGF3YWl0IEIuYWxsKFt6aXBSZWFkU3RyZWFtUHJvbWlzZSwgd3JpdGVTdHJlYW1Qcm9taXNlXSk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYgWmlwRW50cnlcbiAqIEBwcm9wZXJ0eSB7eWF1emwuRW50cnl9IGVudHJ5IFRoZSBhY3R1YWwgZW50cnkgaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IGV4dHJhY3RFbnRyeVRvIEFuIGFzeW5jIGZ1bmN0aW9uLCB3aGljaCBhY2NlcHRzIG9uZSBwYXJhbWV0ZXIuXG4gKiBUaGlzIHBhcmFtZXRlciBjb250YWlucyB0aGUgZGVzdGluYXRpb24gZm9sZGVyIHBhdGggdG8gd2hpY2ggdGhpcyBmdW5jdGlvbiBpcyBnb2luZyB0byBleHRyYWN0IHRoZSBlbnRyeS5cbiAqL1xuXG4vKipcbiAqIEdldCBlbnRyaWVzIGZvciBhIHppcCBmb2xkZXJcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gemlwRmlsZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgc291cmNlIFpJUCBmaWxlXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBvbkVudHJ5IENhbGxiYWNrIHdoZW4gZW50cnkgaXMgcmVhZC5cbiAqIFRoZSBjYWxsYmFjayBpcyBleHBlY3RlZCB0byBhY2NlcHQgb25lIGFyZ3VtZW50IG9mIFppcEVudHJ5IHR5cGUuXG4gKiBUaGUgaXRlcmF0aW9uIHRocm91Z2ggdGhlIHNvdXJjZSB6aXAgZmlsZSB3aWxsIGJpIHRlcm1pbmF0ZWQgYXMgc29vbiBhc1xuICogdGhlIHJlc3VsdCBvZiB0aGlzIGZ1bmN0aW9uIGVxdWFscyB0byBgZmFsc2VgLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkRW50cmllcyh6aXBGaWxlUGF0aCwgb25FbnRyeSkge1xuICAvLyBPcGVuIGEgemlwIGZpbGUgYW5kIHN0YXJ0IHJlYWRpbmcgZW50cmllc1xuICBjb25zdCB6aXBmaWxlID0gYXdhaXQgb3BlblppcCh6aXBGaWxlUGF0aCwge2xhenlFbnRyaWVzOiB0cnVlfSk7XG4gIGNvbnN0IHppcFJlYWRTdHJlYW1Qcm9taXNlID0gbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHppcGZpbGUub25jZSgnZW5kJywgcmVzb2x2ZSk7XG4gICAgemlwZmlsZS5vbmNlKCdlcnJvcicsIHJlamVjdCk7XG5cbiAgICAvLyBPbiBlYWNoIGVudHJ5LCBjYWxsICdvbkVudHJ5JyBhbmQgdGhlbiByZWFkIHRoZSBuZXh0IGVudHJ5XG4gICAgemlwZmlsZS5vbignZW50cnknLCBhc3luYyAoZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IG9uRW50cnkoe1xuICAgICAgICBlbnRyeSxcbiAgICAgICAgZXh0cmFjdEVudHJ5VG86IGFzeW5jIChkZXN0RGlyKSA9PiBhd2FpdCBfZXh0cmFjdEVudHJ5VG8oemlwZmlsZSwgZW50cnksIGRlc3REaXIpLFxuICAgICAgfSk7XG4gICAgICBpZiAocmVzID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gemlwZmlsZS5lbWl0KCdlbmQnKTtcbiAgICAgIH1cbiAgICAgIHppcGZpbGUucmVhZEVudHJ5KCk7XG4gICAgfSk7XG4gIH0pO1xuICB6aXBmaWxlLnJlYWRFbnRyeSgpO1xuXG4gIC8vIFdhaXQgZm9yIHRoZSBlbnRyaWVzIHRvIGZpbmlzaCBiZWluZyBpdGVyYXRlZCB0aHJvdWdoXG4gIHJldHVybiBhd2FpdCB6aXBSZWFkU3RyZWFtUHJvbWlzZTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiBaaXBPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGVuY29kZVRvQmFzZTY0IFtmYWxzZV0gV2hldGhlciB0byBlbmNvZGVcbiAqIHRoZSByZXN1bHRpbmcgYXJjaGl2ZSB0byBhIGJhc2U2NC1lbmNvZGVkIHN0cmluZ1xuICogQHByb3BlcnR5IHtib29sZWFufSBpc01ldGVyZWQgW3RydWVdIFdoZXRoZXIgdG8gbG9nIHRoZSBhY3R1YWxcbiAqIGFyY2hpdmVyIHBlcmZvcm1hbmNlXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWF4U2l6ZSBbMTA3Mzc0MTgyNF0gVGhlIG1heGltdW0gc2l6ZSBvZlxuICogdGhlIHJlc3VsdGluZyBhcmNoaXZlIGluIGJ5dGVzLiBUaGlzIGlzIHNldCB0byAxR0IgYnkgZGVmYXVsdCwgYmVjYXVzZVxuICogQXBwaXVtIGxpbWl0cyB0aGUgbWF4aW11bSBIVFRQIGJvZHkgc2l6ZSB0byAxR0IuIEFsc28sIHRoZSBOb2RlSlMgaGVhcFxuICogc2l6ZSBtdXN0IGJlIGVub3VnaCB0byBrZWVwIHRoZSByZXN1bHRpbmcgb2JqZWN0ICh1c3VhbGx5IHRoaXMgc2l6ZSBpc1xuICogbGltaXRlZCB0byAxLjQgR0IpXG4gKiBAcHJvcGVydHkge251bWJlcn0gbGV2ZWwgWzldIFRoZSBjb21wcmVzc2lvbiBsZXZlbC4gVGhlIG1heGltdW1cbiAqIGxldmVsIGlzIDkgKHRoZSBiZXN0IGNvbXByZXNzaW9uLCB3b3JzdCBwZXJmb3JtYW5jZSkuIFRoZSBtaW5pbXVtXG4gKiBjb21wcmVzc2lvbiBsZXZlbCBpcyAwIChubyBjb21wcmVzc2lvbikuXG4gKi9cblxuLyoqXG4gKiBDb252ZXJ0cyBjb250ZW50cyBvZiBsb2NhbCBkaXJlY3RvcnkgdG8gYW4gaW4tbWVtb3J5IC56aXAgYnVmZmVyXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNyY1BhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgZm9sZGVyIG9yIGZpbGUgYmVpbmcgemlwcGVkXG4gKiBAcGFyYW0ge1ppcE9wdGlvbnN9IG9wdHMgWmlwcGluZyBvcHRpb25zXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCdWZmZXI+fSBaaXBwZWQgKGFuZCBlbmNvZGVkIGlmIGBlbmNvZGVUb0Jhc2U2NGAgaXMgdHJ1dGh5KVxuICogY29udGVudCBvZiB0aGUgc291cmNlIHBhdGggYXMgbWVtb3J5IGJ1ZmZlclxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSByZWFkaW5nIHRoZSBzb3VyY2VcbiAqIG9yIHRoZSBzb3VyY2UgaXMgdG9vIGJpZ1xuICovXG5hc3luYyBmdW5jdGlvbiB0b0luTWVtb3J5WmlwKHNyY1BhdGgsIG9wdHMgPSAvKiogQHR5cGUge1ppcE9wdGlvbnN9ICovICh7fSkpIHtcbiAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKHNyY1BhdGgpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gc3VjaCBmaWxlIG9yIGZvbGRlcjogJHtzcmNQYXRofWApO1xuICB9XG5cbiAgY29uc3Qge2lzTWV0ZXJlZCA9IHRydWUsIGVuY29kZVRvQmFzZTY0ID0gZmFsc2UsIG1heFNpemUgPSAxICogR2lCLCBsZXZlbCA9IDl9ID0gb3B0cztcbiAgY29uc3QgcmVzdWx0QnVmZmVycyA9IFtdO1xuICBsZXQgcmVzdWx0QnVmZmVyc1NpemUgPSAwO1xuICAvLyBDcmVhdGUgYSB3cml0YWJsZSBzdHJlYW0gdGhhdCB6aXAgYnVmZmVycyB3aWxsIGJlIHN0cmVhbWVkIHRvXG4gIGNvbnN0IHJlc3VsdFdyaXRlU3RyZWFtID0gbmV3IHN0cmVhbS5Xcml0YWJsZSh7XG4gICAgd3JpdGU6IChidWZmZXIsIGVuY29kaW5nLCBuZXh0KSA9PiB7XG4gICAgICByZXN1bHRCdWZmZXJzLnB1c2goYnVmZmVyKTtcbiAgICAgIHJlc3VsdEJ1ZmZlcnNTaXplICs9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICBpZiAobWF4U2l6ZSA+IDAgJiYgcmVzdWx0QnVmZmVyc1NpemUgPiBtYXhTaXplKSB7XG4gICAgICAgIHJlc3VsdFdyaXRlU3RyZWFtLmVtaXQoXG4gICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVGhlIHNpemUgb2YgdGhlIHJlc3VsdGluZyBgICtcbiAgICAgICAgICAgICAgYGFyY2hpdmUgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuICR7dG9SZWFkYWJsZVNpemVTdHJpbmcobWF4U2l6ZSl9YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG5leHQoKTtcbiAgICB9LFxuICB9KTtcblxuICAvLyBaaXAgJ3NyY0RpcicgYW5kIHN0cmVhbSBpdCB0byB0aGUgYWJvdmUgd3JpdGFibGUgc3RyZWFtXG4gIGNvbnN0IGFyY2hpdmUgPSBhcmNoaXZlcignemlwJywge1xuICAgIHpsaWI6IHtsZXZlbH0sXG4gIH0pO1xuICBsZXQgc3JjU2l6ZSA9IG51bGw7XG4gIGNvbnN0IGJhc2U2NEVuY29kZXJTdHJlYW0gPSBlbmNvZGVUb0Jhc2U2NCA/IG5ldyBCYXNlNjRFbmNvZGUoKSA6IG51bGw7XG4gIGNvbnN0IHJlc3VsdFdyaXRlU3RyZWFtUHJvbWlzZSA9IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICByZXN1bHRXcml0ZVN0cmVhbS5vbmNlKCdlcnJvcicsIChlKSA9PiB7XG4gICAgICBpZiAoYmFzZTY0RW5jb2RlclN0cmVhbSkge1xuICAgICAgICBhcmNoaXZlLnVucGlwZShiYXNlNjRFbmNvZGVyU3RyZWFtKTtcbiAgICAgICAgYmFzZTY0RW5jb2RlclN0cmVhbS51bnBpcGUocmVzdWx0V3JpdGVTdHJlYW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXJjaGl2ZS51bnBpcGUocmVzdWx0V3JpdGVTdHJlYW0pO1xuICAgICAgfVxuICAgICAgYXJjaGl2ZS5hYm9ydCgpO1xuICAgICAgYXJjaGl2ZS5kZXN0cm95KCk7XG4gICAgICByZWplY3QoZSk7XG4gICAgfSk7XG4gICAgcmVzdWx0V3JpdGVTdHJlYW0ub25jZSgnZmluaXNoJywgKCkgPT4ge1xuICAgICAgc3JjU2l6ZSA9IGFyY2hpdmUucG9pbnRlcigpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbiAgY29uc3QgYXJjaGl2ZVN0cmVhbVByb21pc2UgPSBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgYXJjaGl2ZS5vbmNlKCdmaW5pc2gnLCByZXNvbHZlKTtcbiAgICBhcmNoaXZlLm9uY2UoJ2Vycm9yJywgKGUpID0+IHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBhcmNoaXZlICcke3NyY1BhdGh9JzogJHtlLm1lc3NhZ2V9YCkpKTtcbiAgfSk7XG4gIGNvbnN0IHRpbWVyID0gaXNNZXRlcmVkID8gbmV3IFRpbWVyKCkuc3RhcnQoKSA6IG51bGw7XG4gIGlmICgoYXdhaXQgZnMuc3RhdChzcmNQYXRoKSkuaXNEaXJlY3RvcnkoKSkge1xuICAgIGFyY2hpdmUuZGlyZWN0b3J5KHNyY1BhdGgsIGZhbHNlKTtcbiAgfSBlbHNlIHtcbiAgICBhcmNoaXZlLmZpbGUoc3JjUGF0aCwge1xuICAgICAgbmFtZTogcGF0aC5iYXNlbmFtZShzcmNQYXRoKSxcbiAgICB9KTtcbiAgfVxuICBpZiAoYmFzZTY0RW5jb2RlclN0cmVhbSkge1xuICAgIGFyY2hpdmUucGlwZShiYXNlNjRFbmNvZGVyU3RyZWFtKTtcbiAgICBiYXNlNjRFbmNvZGVyU3RyZWFtLnBpcGUocmVzdWx0V3JpdGVTdHJlYW0pO1xuICB9IGVsc2Uge1xuICAgIGFyY2hpdmUucGlwZShyZXN1bHRXcml0ZVN0cmVhbSk7XG4gIH1cbiAgYXJjaGl2ZS5maW5hbGl6ZSgpO1xuXG4gIC8vIFdhaXQgZm9yIHRoZSBzdHJlYW1zIHRvIGZpbmlzaFxuICBhd2FpdCBCLmFsbChbYXJjaGl2ZVN0cmVhbVByb21pc2UsIHJlc3VsdFdyaXRlU3RyZWFtUHJvbWlzZV0pO1xuXG4gIGlmICh0aW1lcikge1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBaaXBwZWQgJHtlbmNvZGVUb0Jhc2U2NCA/ICdhbmQgYmFzZTY0LWVuY29kZWQgJyA6ICcnfWAgK1xuICAgICAgICBgJyR7cGF0aC5iYXNlbmFtZShzcmNQYXRoKX0nIGAgK1xuICAgICAgICAoc3JjU2l6ZSA/IGAoJHt0b1JlYWRhYmxlU2l6ZVN0cmluZyhzcmNTaXplKX0pIGAgOiAnJykgK1xuICAgICAgICBgaW4gJHt0aW1lci5nZXREdXJhdGlvbigpLmFzU2Vjb25kcy50b0ZpeGVkKDMpfXMgYCArXG4gICAgICAgIGAoY29tcHJlc3Npb24gbGV2ZWw6ICR7bGV2ZWx9KWBcbiAgICApO1xuICB9XG4gIC8vIFJldHVybiB0aGUgYXJyYXkgb2YgemlwIGJ1ZmZlcnMgY29uY2F0ZW5hdGVkIGludG8gb25lIGJ1ZmZlclxuICByZXR1cm4gQnVmZmVyLmNvbmNhdChyZXN1bHRCdWZmZXJzKTtcbn1cblxuLyoqXG4gKiBWZXJpZmllcyB3aGV0aGVyIHRoZSBnaXZlbiBmaWxlIGlzIGEgdmFsaWQgWklQIGFyY2hpdmVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGggLSBGdWxsIHBhdGggdG8gdGhlIGZpbGVcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYSB2YWxpZCBaSVAgYXJjaGl2ZVxuICovXG5hc3luYyBmdW5jdGlvbiBhc3NlcnRWYWxpZFppcChmaWxlUGF0aCkge1xuICBpZiAoIShhd2FpdCBmcy5leGlzdHMoZmlsZVBhdGgpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGZpbGUgYXQgJyR7ZmlsZVBhdGh9JyBkb2VzIG5vdCBleGlzdGApO1xuICB9XG5cbiAgY29uc3Qge3NpemV9ID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aCk7XG4gIGlmIChzaXplIDwgNCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGZpbGUgYXQgJyR7ZmlsZVBhdGh9JyBpcyB0b28gc21hbGwgdG8gYmUgYSBaSVAgYXJjaGl2ZWApO1xuICB9XG4gIGNvbnN0IGZkID0gYXdhaXQgZnMub3BlbihmaWxlUGF0aCwgJ3InKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2MoWklQX01BR0lDLmxlbmd0aCk7XG4gICAgYXdhaXQgZnMucmVhZChmZCwgYnVmZmVyLCAwLCBaSVBfTUFHSUMubGVuZ3RoLCAwKTtcbiAgICBjb25zdCBzaWduYXR1cmUgPSBidWZmZXIudG9TdHJpbmcoJ2FzY2lpJyk7XG4gICAgaWYgKHNpZ25hdHVyZSAhPT0gWklQX01BR0lDKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgZmlsZSBzaWduYXR1cmUgJyR7c2lnbmF0dXJlfScgb2YgJyR7ZmlsZVBhdGh9JyBgICtcbiAgICAgICAgICBgaXMgbm90IGVxdWFsIHRvIHRoZSBleHBlY3RlZCBaSVAgYXJjaGl2ZSBzaWduYXR1cmUgJyR7WklQX01BR0lDfSdgXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5jbG9zZShmZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZWRlZiBaaXBDb21wcmVzc2lvbk9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsZXZlbCBbOV0gLSBDb21wcmVzc2lvbiBsZXZlbCBpbiByYW5nZSAwLi45XG4gKiAoZ3JlYXRlciBudW1iZXJzIG1lYW4gYmV0dGVyIGNvbXByZXNzaW9uLCBidXQgbG9uZ2VyIHByb2Nlc3NpbmcgdGltZSlcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFppcFNvdXJjZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXR0ZXJuIFsnKipcXC8qJ10gLSBHTE9CIHBhdHRlcm4gZm9yIGNvbXByZXNzaW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY3dkIC0gVGhlIHNvdXJjZSByb290IGZvbGRlciAodGhlIHBhcmVudCBmb2xkZXIgb2ZcbiAqIHRoZSBkZXN0aW5hdGlvbiBmaWxlIGJ5IGRlZmF1bHQpXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbaWdub3JlXSAtIFRoZSBsaXN0IG9mIGlnbm9yZWQgcGF0dGVybnNcbiAqL1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJjaGl2ZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gZ2xvYiBwYXR0ZXJuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGRzdFBhdGggLSBUaGUgcmVzdWx0aW5nIGFyY2hpdmUgcGF0aFxuICogQHBhcmFtIHtaaXBTb3VyY2VPcHRpb25zfSBzcmMgLSBTb3VyY2Ugb3B0aW9uc1xuICogQHBhcmFtIHtaaXBDb21wcmVzc2lvbk9wdGlvbnN9IG9wdHMgLSBDb21wcmVzc2lvbiBvcHRpb25zXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBhcmNoaXZlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRvQXJjaGl2ZShcbiAgZHN0UGF0aCxcbiAgc3JjID0gLyoqIEB0eXBlIHtaaXBTb3VyY2VPcHRpb25zfSAqLyAoe30pLFxuICBvcHRzID0gLyoqIEB0eXBlIHtaaXBDb21wcmVzc2lvbk9wdGlvbnN9ICovICh7fSlcbikge1xuICBjb25zdCB7bGV2ZWwgPSA5fSA9IG9wdHM7XG4gIGNvbnN0IHtwYXR0ZXJuID0gJyoqLyonLCBjd2QgPSBwYXRoLmRpcm5hbWUoZHN0UGF0aCksIGlnbm9yZSA9IFtdfSA9IHNyYztcbiAgY29uc3QgYXJjaGl2ZSA9IGFyY2hpdmVyKCd6aXAnLCB7emxpYjoge2xldmVsfX0pO1xuICBjb25zdCBzdHJlYW0gPSBmcy5jcmVhdGVXcml0ZVN0cmVhbShkc3RQYXRoKTtcbiAgcmV0dXJuIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBhcmNoaXZlXG4gICAgICAuZ2xvYihwYXR0ZXJuLCB7XG4gICAgICAgIGN3ZCxcbiAgICAgICAgaWdub3JlLFxuICAgICAgfSlcbiAgICAgIC5vbignZXJyb3InLCByZWplY3QpXG4gICAgICAucGlwZShzdHJlYW0pO1xuICAgIHN0cmVhbVxuICAgICAgLm9uKCdlcnJvcicsIChlKSA9PiB7XG4gICAgICAgIGFyY2hpdmUudW5waXBlKHN0cmVhbSk7XG4gICAgICAgIGFyY2hpdmUuYWJvcnQoKTtcbiAgICAgICAgYXJjaGl2ZS5kZXN0cm95KCk7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH0pXG4gICAgICAub24oJ2ZpbmlzaCcsIHJlc29sdmUpO1xuICAgIGFyY2hpdmUuZmluYWxpemUoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogRmluZHMgYW5kIG1lbW9pemVzIHRoZSBmdWxsIHBhdGggdG8gdGhlIGdpdmVuIGV4ZWN1dGFibGUuXG4gKiBSZWplY3RzIGlmIGl0IGlzIG5vdCBmb3VuZC5cbiAqL1xuY29uc3QgZ2V0RXhlY3V0YWJsZVBhdGggPSBfLm1lbW9pemUoXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBGdWxsIFBhdGggdG8gdGhlIGV4ZWN1dGFibGVcbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIGdldEV4ZWN1dGFibGVQYXRoKGJpbmFyeU5hbWUpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IGF3YWl0IGZzLndoaWNoKGJpbmFyeU5hbWUpO1xuICAgIGxvZy5kZWJ1ZyhgRm91bmQgJyR7YmluYXJ5TmFtZX0nIGF0ICcke2Z1bGxQYXRofSdgKTtcbiAgICByZXR1cm4gZnVsbFBhdGg7XG4gIH1cbik7XG5cbmV4cG9ydCB7ZXh0cmFjdEFsbFRvLCByZWFkRW50cmllcywgdG9Jbk1lbW9yeVppcCwgX2V4dHJhY3RFbnRyeVRvLCBhc3NlcnRWYWxpZFppcCwgdG9BcmNoaXZlfTtcbmV4cG9ydCBkZWZhdWx0IHtcbiAgZXh0cmFjdEFsbFRvLFxuICByZWFkRW50cmllcyxcbiAgdG9Jbk1lbW9yeVppcCxcbiAgYXNzZXJ0VmFsaWRaaXAsXG4gIHRvQXJjaGl2ZSxcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBS0EsTUFBTUEsT0FBTyxHQUFHQyxpQkFBQSxDQUFFQyxTQUFGLENBQVlDLGNBQUEsQ0FBTUMsSUFBbEIsQ0FBaEI7O0FBSUEsTUFBTUMsUUFBUSxHQUFHSixpQkFBQSxDQUFFQyxTQUFGLENBQVlJLGVBQUEsQ0FBT0QsUUFBbkIsQ0FBakI7O0FBQ0EsTUFBTUUsU0FBUyxHQUFHLElBQWxCO0FBQ0EsTUFBTUMsSUFBSSxHQUFHLEtBQWI7QUFDQSxNQUFNQyxLQUFLLEdBQUcsS0FBZDtBQUNBLE1BQU1DLEtBQUssR0FBRyxLQUFkOztBQUdBLE1BQU1DLFlBQU4sQ0FBbUI7RUFFakJDLE9BQU87O0VBRVBDLFdBQVcsQ0FBQ0MsVUFBRCxFQUFhQyxJQUFJLEdBQUcsRUFBcEIsRUFBd0I7SUFDakMsS0FBS0MsT0FBTCxHQUFlRixVQUFmO0lBQ0EsS0FBS0MsSUFBTCxHQUFZQSxJQUFaO0lBQ0EsS0FBS0UsUUFBTCxHQUFnQixLQUFoQjtFQUNEOztFQUVEQyxlQUFlLENBQUNDLEtBQUQsRUFBUTtJQUNyQixPQUFPQyxlQUFBLENBQUVDLFFBQUYsQ0FBV0YsS0FBSyxDQUFDRyxRQUFqQixJQUNISCxLQUFLLENBQUNH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
|
|
461
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJvcGVuWmlwIiwiQiIsInByb21pc2lmeSIsInlhdXpsIiwib3BlbiIsInBpcGVsaW5lIiwic3RyZWFtIiwiWklQX01BR0lDIiwiSUZNVCIsIklGRElSIiwiSUZMTksiLCJaaXBFeHRyYWN0b3IiLCJ6aXBmaWxlIiwiY29uc3RydWN0b3IiLCJzb3VyY2VQYXRoIiwib3B0cyIsInppcFBhdGgiLCJjYW5jZWxlZCIsImV4dHJhY3RGaWxlTmFtZSIsImVudHJ5IiwiXyIsImlzQnVmZmVyIiwiZmlsZU5hbWUiLCJ0b1N0cmluZyIsImZpbGVOYW1lc0VuY29kaW5nIiwiZXh0cmFjdCIsImRpciIsImxhenlFbnRyaWVzIiwiZGVjb2RlU3RyaW5ncyIsInJlc29sdmUiLCJyZWplY3QiLCJvbiIsImVyciIsInJlYWRFbnRyeSIsInN0YXJ0c1dpdGgiLCJkZXN0RGlyIiwicGF0aCIsImRpcm5hbWUiLCJqb2luIiwiZnMiLCJta2RpciIsInJlY3Vyc2l2ZSIsImNhbm9uaWNhbERlc3REaXIiLCJyZWFscGF0aCIsInJlbGF0aXZlRGVzdERpciIsInJlbGF0aXZlIiwic3BsaXQiLCJzZXAiLCJpbmNsdWRlcyIsIkVycm9yIiwiZXh0cmFjdEVudHJ5IiwiY2xvc2UiLCJkZXN0IiwibW9kZSIsImV4dGVybmFsRmlsZUF0dHJpYnV0ZXMiLCJpc1N5bWxpbmsiLCJpc0RpciIsImVuZHNXaXRoIiwidmVyc2lvbk1hZGVCeSIsInByb2NNb2RlIiwiZ2V0RXh0cmFjdGVkTW9kZSIsIm1rZGlyT3B0aW9ucyIsIm9wZW5SZWFkU3RyZWFtIiwiYmluZCIsInJlYWRTdHJlYW0iLCJsaW5rIiwiZ2V0U3RyZWFtIiwic3ltbGluayIsImNyZWF0ZVdyaXRlU3RyZWFtIiwiZW50cnlNb2RlIiwiZGVmYXVsdERpck1vZGUiLCJkZWZhdWx0RmlsZU1vZGUiLCJwYXJzZUludCIsImV4dHJhY3RBbGxUbyIsInppcEZpbGVQYXRoIiwiaXNBYnNvbHV0ZSIsInVzZVN5c3RlbVVuemlwIiwiZXh0cmFjdFdpdGhTeXN0ZW1VbnppcCIsImxvZyIsIndhcm4iLCJzdGRlcnIiLCJtZXNzYWdlIiwiZXh0cmFjdG9yIiwiaXNXaW5kb3dzSG9zdCIsImlzV2luZG93cyIsImV4ZWN1dGFibGVQYXRoIiwiZ2V0RXhlY3V0YWJsZVBhdGgiLCJlIiwiZXhlYyIsIl9leHRyYWN0RW50cnlUbyIsInppcEZpbGUiLCJkc3RQYXRoIiwidGVzdCIsImV4aXN0cyIsIm1rZGlycCIsIndyaXRlU3RyZWFtIiwiZmxhZ3MiLCJ3cml0ZVN0cmVhbVByb21pc2UiLCJvbmNlIiwiemlwUmVhZFN0cmVhbSIsInppcFJlYWRTdHJlYW1Qcm9taXNlIiwicGlwZSIsImFsbCIsInJlYWRFbnRyaWVzIiwib25FbnRyeSIsInJlcyIsImV4dHJhY3RFbnRyeVRvIiwiZW1pdCIsInRvSW5NZW1vcnlaaXAiLCJzcmNQYXRoIiwiaXNNZXRlcmVkIiwiZW5jb2RlVG9CYXNlNjQiLCJtYXhTaXplIiwiR2lCIiwibGV2ZWwiLCJyZXN1bHRCdWZmZXJzIiwicmVzdWx0QnVmZmVyc1NpemUiLCJyZXN1bHRXcml0ZVN0cmVhbSIsIldyaXRhYmxlIiwid3JpdGUiLCJidWZmZXIiLCJlbmNvZGluZyIsIm5leHQiLCJwdXNoIiwibGVuZ3RoIiwidG9SZWFkYWJsZVNpemVTdHJpbmciLCJhcmNoaXZlIiwiYXJjaGl2ZXIiLCJ6bGliIiwic3JjU2l6ZSIsImJhc2U2NEVuY29kZXJTdHJlYW0iLCJCYXNlNjRFbmNvZGUiLCJyZXN1bHRXcml0ZVN0cmVhbVByb21pc2UiLCJ1bnBpcGUiLCJhYm9ydCIsImRlc3Ryb3kiLCJwb2ludGVyIiwiYXJjaGl2ZVN0cmVhbVByb21pc2UiLCJ0aW1lciIsIlRpbWVyIiwic3RhcnQiLCJzdGF0IiwiaXNEaXJlY3RvcnkiLCJkaXJlY3RvcnkiLCJmaWxlIiwibmFtZSIsImJhc2VuYW1lIiwiZmluYWxpemUiLCJkZWJ1ZyIsImdldER1cmF0aW9uIiwiYXNTZWNvbmRzIiwidG9GaXhlZCIsIkJ1ZmZlciIsImNvbmNhdCIsImFzc2VydFZhbGlkWmlwIiwiZmlsZVBhdGgiLCJzaXplIiwiZmQiLCJhbGxvYyIsInJlYWQiLCJzaWduYXR1cmUiLCJ0b0FyY2hpdmUiLCJzcmMiLCJwYXR0ZXJuIiwiY3dkIiwiaWdub3JlIiwiZ2xvYiIsIm1lbW9pemUiLCJiaW5hcnlOYW1lIiwiZnVsbFBhdGgiLCJ3aGljaCJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi96aXAuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB5YXV6bCBmcm9tICd5YXV6bCc7XG5pbXBvcnQgYXJjaGl2ZXIgZnJvbSAnYXJjaGl2ZXInO1xuaW1wb3J0IHtjcmVhdGVXcml0ZVN0cmVhbX0gZnJvbSAnZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgc3RyZWFtIGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgZnMgZnJvbSAnLi9mcyc7XG5pbXBvcnQge2lzV2luZG93c30gZnJvbSAnLi9zeXN0ZW0nO1xuaW1wb3J0IHtCYXNlNjRFbmNvZGV9IGZyb20gJ2Jhc2U2NC1zdHJlYW0nO1xuaW1wb3J0IHt0b1JlYWRhYmxlU2l6ZVN0cmluZywgR2lCfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IFRpbWVyIGZyb20gJy4vdGltaW5nJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IGdldFN0cmVhbSBmcm9tICdnZXQtc3RyZWFtJztcbmltcG9ydCB7ZXhlY30gZnJvbSAndGVlbl9wcm9jZXNzJztcblxuLyoqXG4gKiBAdHlwZSB7KHBhdGg6IHN0cmluZywgb3B0aW9ucz86IHlhdXpsLk9wdGlvbnMpID0+IFByb21pc2U8eWF1emwuWmlwRmlsZT59XG4gKi9cbmNvbnN0IG9wZW5aaXAgPSBCLnByb21pc2lmeSh5YXV6bC5vcGVuKTtcbi8qKlxuICogQHR5cGUgeyhzb3VyY2U6IE5vZGVKUy5SZWFkYWJsZVN0cmVhbSwgZGVzdGluYXRpb246IE5vZGVKUy5Xcml0YWJsZVN0cmVhbSkgPT4gUHJvbWlzZTxOb2RlSlMuV3JpdGFibGVTdHJlYW0+fVxuICovXG5jb25zdCBwaXBlbGluZSA9IEIucHJvbWlzaWZ5KHN0cmVhbS5waXBlbGluZSk7XG5jb25zdCBaSVBfTUFHSUMgPSAnUEsnO1xuY29uc3QgSUZNVCA9IDYxNDQwO1xuY29uc3QgSUZESVIgPSAxNjM4NDtcbmNvbnN0IElGTE5LID0gNDA5NjA7XG5cbi8vIFRoaXMgY2xhc3MgaXMgbW9zdGx5IGNvcGllZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXhvZ2Rlbi9leHRyYWN0LXppcC9ibG9iL21hc3Rlci9pbmRleC5qc1xuY2xhc3MgWmlwRXh0cmFjdG9yIHtcbiAgLyoqIEB0eXBlIHt5YXV6bC5aaXBGaWxlfSAqL1xuICB6aXBmaWxlO1xuXG4gIGNvbnN0cnVjdG9yKHNvdXJjZVBhdGgsIG9wdHMgPSB7fSkge1xuICAgIHRoaXMuemlwUGF0aCA9IHNvdXJjZVBhdGg7XG4gICAgdGhpcy5vcHRzID0gb3B0cztcbiAgICB0aGlzLmNhbmNlbGVkID0gZmFsc2U7XG4gIH1cblxuICBleHRyYWN0RmlsZU5hbWUoZW50cnkpIHtcbiAgICByZXR1cm4gXy5pc0J1ZmZlcihlbnRyeS5maWxlTmFtZSlcbiAgICAgID8gZW50cnkuZmlsZU5hbWUudG9TdHJpbmcodGhpcy5vcHRzLmZpbGVOYW1lc0VuY29kaW5nKVxuICAgICAgOiBlbnRyeS5maWxlTmFtZTtcbiAgfVxuXG4gIGFzeW5jIGV4dHJhY3QoKSB7XG4gICAgY29uc3Qge2RpciwgZmlsZU5hbWVzRW5jb2Rpbmd9ID0gdGhpcy5vcHRzO1xuICAgIHRoaXMuemlwZmlsZSA9IGF3YWl0IG9wZW5aaXAodGhpcy56aXBQYXRoLCB7XG4gICAgICBsYXp5RW50cmllczogdHJ1ZSxcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90aGVqb3Nod29sZmUveWF1emwvY29tbWl0L2NjNzQ1NWFjNzg5YmE4NDk3MzE4NGU1ZWJkZTA1ODFjZGM0YzNiMzkjZGlmZi0wNGM2ZTkwZmFhYzI2NzVhYTg5ZTIxNzZkMmVlYzdkOFI5NVxuICAgICAgZGVjb2RlU3RyaW5nczogIWZpbGVOYW1lc0VuY29kaW5nLFxuICAgIH0pO1xuICAgIHRoaXMuY2FuY2VsZWQgPSBmYWxzZTtcblxuICAgIHJldHVybiBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnppcGZpbGUub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICB0aGlzLmNhbmNlbGVkID0gdHJ1ZTtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuemlwZmlsZS5yZWFkRW50cnkoKTtcblxuICAgICAgdGhpcy56aXBmaWxlLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmNhbmNlbGVkKSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy56aXBmaWxlLm9uKCdlbnRyeScsIGFzeW5jIChlbnRyeSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jYW5jZWxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gdGhpcy5leHRyYWN0RmlsZU5hbWUoZW50cnkpO1xuICAgICAgICBpZiAoZmlsZU5hbWUuc3RhcnRzV2l0aCgnX19NQUNPU1gvJykpIHtcbiAgICAgICAgICB0aGlzLnppcGZpbGUucmVhZEVudHJ5KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVzdERpciA9IHBhdGguZGlybmFtZShwYXRoLmpvaW4oZGlyLCBmaWxlTmFtZSkpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGZzLm1rZGlyKGRlc3REaXIsIHtyZWN1cnNpdmU6IHRydWV9KTtcblxuICAgICAgICAgIGNvbnN0IGNhbm9uaWNhbERlc3REaXIgPSBhd2FpdCBmcy5yZWFscGF0aChkZXN0RGlyKTtcbiAgICAgICAgICBjb25zdCByZWxhdGl2ZURlc3REaXIgPSBwYXRoLnJlbGF0aXZlKGRpciwgY2Fub25pY2FsRGVzdERpcik7XG5cbiAgICAgICAgICBpZiAocmVsYXRpdmVEZXN0RGlyLnNwbGl0KHBhdGguc2VwKS5pbmNsdWRlcygnLi4nKSkge1xuICAgICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgT3V0IG9mIGJvdW5kIHBhdGggXCIke2Nhbm9uaWNhbERlc3REaXJ9XCIgZm91bmQgd2hpbGUgcHJvY2Vzc2luZyBmaWxlICR7ZmlsZU5hbWV9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhd2FpdCB0aGlzLmV4dHJhY3RFbnRyeShlbnRyeSk7XG4gICAgICAgICAgdGhpcy56aXBmaWxlLnJlYWRFbnRyeSgpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aGlzLmNhbmNlbGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnppcGZpbGUuY2xvc2UoKTtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBleHRyYWN0RW50cnkoZW50cnkpIHtcbiAgICBpZiAodGhpcy5jYW5jZWxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHtkaXJ9ID0gdGhpcy5vcHRzO1xuXG4gICAgY29uc3QgZmlsZU5hbWUgPSB0aGlzLmV4dHJhY3RGaWxlTmFtZShlbnRyeSk7XG4gICAgY29uc3QgZGVzdCA9IHBhdGguam9pbihkaXIsIGZpbGVOYW1lKTtcblxuICAgIC8vIGNvbnZlcnQgZXh0ZXJuYWwgZmlsZSBhdHRyIGludCBpbnRvIGEgZnMgc3RhdCBtb2RlIGludFxuICAgIGNvbnN0IG1vZGUgPSAoZW50cnkuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyA+PiAxNikgJiAweGZmZmY7XG4gICAgLy8gY2hlY2sgaWYgaXQncyBhIHN5bWxpbmsgb3IgZGlyICh1c2luZyBzdGF0IG1vZGUgY29uc3RhbnRzKVxuICAgIGNvbnN0IGlzU3ltbGluayA9IChtb2RlICYgSUZNVCkgPT09IElGTE5LO1xuICAgIGNvbnN0IGlzRGlyID1cbiAgICAgIChtb2RlICYgSUZNVCkgPT09IElGRElSIHx8XG4gICAgICAvLyBGYWlsc2FmZSwgYm9ycm93ZWQgZnJvbSBqc1ppcFxuICAgICAgZmlsZU5hbWUuZW5kc1dpdGgoJy8nKSB8fFxuICAgICAgLy8gY2hlY2sgZm9yIHdpbmRvd3Mgd2VpcmQgd2F5IG9mIHNwZWNpZnlpbmcgYSBkaXJlY3RvcnlcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXhvZ2Rlbi9leHRyYWN0LXppcC9pc3N1ZXMvMTMjaXNzdWVjb21tZW50LTE1NDQ5NDU2NlxuICAgICAgKGVudHJ5LnZlcnNpb25NYWRlQnkgPj4gOCA9PT0gMCAmJiBlbnRyeS5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzID09PSAxNik7XG4gICAgY29uc3QgcHJvY01vZGUgPSB0aGlzLmdldEV4dHJhY3RlZE1vZGUobW9kZSwgaXNEaXIpICYgMG83Nzc7XG4gICAgLy8gYWx3YXlzIGVuc3VyZSBmb2xkZXJzIGFyZSBjcmVhdGVkXG4gICAgY29uc3QgZGVzdERpciA9IGlzRGlyID8gZGVzdCA6IHBhdGguZGlybmFtZShkZXN0KTtcbiAgICBjb25zdCBta2Rpck9wdGlvbnMgPSB7cmVjdXJzaXZlOiB0cnVlfTtcbiAgICBpZiAoaXNEaXIpIHtcbiAgICAgIG1rZGlyT3B0aW9ucy5tb2RlID0gcHJvY01vZGU7XG4gICAgfVxuICAgIGF3YWl0IGZzLm1rZGlyKGRlc3REaXIsIG1rZGlyT3B0aW9ucyk7XG4gICAgaWYgKGlzRGlyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHsoZW50cnk6IHlhdXpsLkVudHJ5KSA9PiBQcm9taXNlPE5vZGVKUy5SZWFkYWJsZVN0cmVhbT59ICovXG4gICAgY29uc3Qgb3BlblJlYWRTdHJlYW0gPSBCLnByb21pc2lmeSh0aGlzLnppcGZpbGUub3BlblJlYWRTdHJlYW0uYmluZCh0aGlzLnppcGZpbGUpKTtcbiAgICBjb25zdCByZWFkU3RyZWFtID0gYXdhaXQgb3BlblJlYWRTdHJlYW0oZW50cnkpO1xuICAgIGlmIChpc1N5bWxpbmspIHtcbiAgICAgIGNvbnN0IGxpbmsgPSBhd2FpdCBnZXRTdHJlYW0ocmVhZFN0cmVhbSk7XG4gICAgICBhd2FpdCBmcy5zeW1saW5rKGxpbmssIGRlc3QpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBwaXBlbGluZShyZWFkU3RyZWFtLCBmcy5jcmVhdGVXcml0ZVN0cmVhbShkZXN0LCB7bW9kZTogcHJvY01vZGV9KSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RXh0cmFjdGVkTW9kZShlbnRyeU1vZGUsIGlzRGlyKSB7XG4gICAgY29uc3Qge2RlZmF1bHREaXJNb2RlLCBkZWZhdWx0RmlsZU1vZGV9ID0gdGhpcy5vcHRzO1xuXG4gICAgbGV0IG1vZGUgPSBlbnRyeU1vZGU7XG4gICAgLy8gU2V0IGRlZmF1bHRzLCBpZiBuZWNlc3NhcnlcbiAgICBpZiAobW9kZSA9PT0gMCkge1xuICAgICAgaWYgKGlzRGlyKSB7XG4gICAgICAgIGlmIChkZWZhdWx0RGlyTW9kZSkge1xuICAgICAgICAgIG1vZGUgPSBwYXJzZUludChkZWZhdWx0RGlyTW9kZSwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFtb2RlKSB7XG4gICAgICAgICAgbW9kZSA9IDBvNzU1O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZGVmYXVsdEZpbGVNb2RlKSB7XG4gICAgICAgICAgbW9kZSA9IHBhcnNlSW50KGRlZmF1bHRGaWxlTW9kZSwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFtb2RlKSB7XG4gICAgICAgICAgbW9kZSA9IDBvNjQ0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZGU7XG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZWRlZiBFeHRyYWN0QWxsT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtmaWxlTmFtZXNFbmNvZGluZ10gVGhlIGVuY29kaW5nIHRvIHVzZSBmb3IgZXh0cmFjdGVkIGZpbGUgbmFtZXMuXG4gKiBGb3IgWklQIGFyY2hpdmVzIGNyZWF0ZWQgb24gTWFjT1MgaXQgaXMgdXN1YWxseSBleHBlY3RlZCB0byBiZSBgdXRmOGAuXG4gKiBCeSBkZWZhdWx0IGl0IGlzIGF1dG9kZXRlY3RlZCBiYXNlZCBvbiB0aGUgZW50cnkgbWV0YWRhdGEgYW5kIGlzIG9ubHkgbmVlZGVkIHRvIGJlIHNldCBleHBsaWNpdGx5XG4gKiBpZiB0aGUgcGFydGljdWxhciBhcmNoaXZlIGRvZXMgbm90IGNvbXBseSB0byB0aGUgc3RhbmRhcmRzLCB3aGljaCBsZWFkcyB0byBjb3JydXB0ZWQgZmlsZSBuYW1lc1xuICogYWZ0ZXIgZXh0cmFjdGlvbi4gT25seSBhcHBsaWNhYmxlIGlmIHN5c3RlbSB1bnppcCBiaW5hcnkgaXMgTk9UIGJlaW5nIHVzZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt1c2VTeXN0ZW1VbnppcF0gSWYgdHJ1ZSwgYXR0ZW1wdCB0byB1c2Ugc3lzdGVtIHVuemlwOyBpZiB0aGlzIGZhaWxzLFxuICogZmFsbGJhY2sgdG8gdGhlIEpTIHVuemlwIGltcGxlbWVudGF0aW9uLlxuICovXG5cbi8qKlxuICogRXh0cmFjdCB6aXBmaWxlIHRvIGEgZGlyZWN0b3J5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHppcEZpbGVQYXRoIFRoZSBmdWxsIHBhdGggdG8gdGhlIHNvdXJjZSBaSVAgZmlsZVxuICogQHBhcmFtIHtzdHJpbmd9IGRlc3REaXIgVGhlIGZ1bGwgcGF0aCB0byB0aGUgZGVzdGluYXRpb24gZm9sZGVyXG4gKiBAcGFyYW0ge0V4dHJhY3RBbGxPcHRpb25zfSBbb3B0c11cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXh0cmFjdEFsbFRvKHppcEZpbGVQYXRoLCBkZXN0RGlyLCBvcHRzID0gLyoqIEB0eXBlIHtFeHRyYWN0QWxsT3B0aW9uc30gKi8gKHt9KSkge1xuICBpZiAoIXBhdGguaXNBYnNvbHV0ZShkZXN0RGlyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGFyZ2V0IHBhdGggJyR7ZGVzdERpcn0nIGlzIGV4cGVjdGVkIHRvIGJlIGFic29sdXRlYCk7XG4gIH1cblxuICBhd2FpdCBmcy5ta2RpcihkZXN0RGlyLCB7cmVjdXJzaXZlOiB0cnVlfSk7XG4gIGNvbnN0IGRpciA9IGF3YWl0IGZzLnJlYWxwYXRoKGRlc3REaXIpO1xuICBpZiAob3B0cy51c2VTeXN0ZW1VbnppcCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleHRyYWN0V2l0aFN5c3RlbVVuemlwKHppcEZpbGVQYXRoLCBkaXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nLndhcm4oJ3VuemlwIGZhaWxlZDsgZmFsbGluZyBiYWNrIHRvIEpTOiAlcycsIGVyci5zdGRlcnIgfHwgZXJyLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuICBjb25zdCBleHRyYWN0b3IgPSBuZXcgWmlwRXh0cmFjdG9yKHppcEZpbGVQYXRoLCB7XG4gICAgLi4ub3B0cyxcbiAgICBkaXIsXG4gIH0pO1xuICBhd2FpdCBleHRyYWN0b3IuZXh0cmFjdCgpO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIHN5c3RlbSB1bnppcCAoZS5nLiwgYC91c3IvYmluL3VuemlwYCkuIElmIGF2YWlsYWJsZSwgaXQgaXNcbiAqIHNpZ25pZmljYW50bHkgZmFzdGVyIHRoYW4gdGhlIEpTIGltcGxlbWVudGF0aW9uLlxuICogQnkgZGVmYXVsdCBhbGwgZmlsZXMgaW4gdGhlIGRlc3REaXIgZ2V0IG92ZXJyaWRkZW4gaWYgYWxyZWFkeSBleGlzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gemlwRmlsZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgc291cmNlIFpJUCBmaWxlXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzdERpciBUaGUgZnVsbCBwYXRoIHRvIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIuXG4gKiBUaGlzIGZvbGRlciBpcyBleHBlY3RlZCB0byBhbHJlYWR5IGV4aXN0IGJlZm9yZSBleHRyYWN0aW5nIHRoZSBhcmNoaXZlLlxuICovXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0V2l0aFN5c3RlbVVuemlwKHppcEZpbGVQYXRoLCBkZXN0RGlyKSB7XG4gIGNvbnN0IGlzV2luZG93c0hvc3QgPSBpc1dpbmRvd3MoKTtcbiAgbGV0IGV4ZWN1dGFibGVQYXRoO1xuICB0cnkge1xuICAgIGV4ZWN1dGFibGVQYXRoID0gYXdhaXQgZ2V0RXhlY3V0YWJsZVBhdGgoaXNXaW5kb3dzSG9zdCA/ICdwb3dlcnNoZWxsLmV4ZScgOiAndW56aXAnKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgc3lzdGVtIHVuemlwJyk7XG4gIH1cblxuICBpZiAoaXNXaW5kb3dzSG9zdCkge1xuICAgIC8vIG9uIFdpbmRvd3Mgd2UgdXNlIFBvd2VyU2hlbGwgdG8gdW56aXAgZmlsZXNcbiAgICBhd2FpdCBleGVjKGV4ZWN1dGFibGVQYXRoLCBbXG4gICAgICAnLWNvbW1hbmQnLFxuICAgICAgJ0V4cGFuZC1BcmNoaXZlJyxcbiAgICAgICctTGl0ZXJhbFBhdGgnLFxuICAgICAgemlwRmlsZVBhdGgsXG4gICAgICAnLURlc3RpbmF0aW9uUGF0aCcsXG4gICAgICBkZXN0RGlyLFxuICAgICAgJy1Gb3JjZScsXG4gICAgXSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gLXEgbWVhbnMgcXVpZXQgKG5vIHN0ZG91dClcbiAgICAvLyAtbyBtZWFucyBvdmVyd3JpdGVcbiAgICAvLyAtZCBpcyB0aGUgZGVzdCBkaXJcbiAgICBhd2FpdCBleGVjKGV4ZWN1dGFibGVQYXRoLCBbJy1xJywgJy1vJywgemlwRmlsZVBhdGgsICctZCcsIGRlc3REaXJdKTtcbiAgfVxufVxuXG4vKipcbiAqIEV4dHJhY3QgYSBzaW5nbGUgemlwIGVudHJ5IHRvIGEgZGlyZWN0b3J5XG4gKlxuICogQHBhcmFtIHt5YXV6bC5aaXBGaWxlfSB6aXBGaWxlIFRoZSBzb3VyY2UgWklQIHN0cmVhbVxuICogQHBhcmFtIHt5YXV6bC5FbnRyeX0gZW50cnkgVGhlIGVudHJ5IGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzdERpciBUaGUgZnVsbCBwYXRoIHRvIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gX2V4dHJhY3RFbnRyeVRvKHppcEZpbGUsIGVudHJ5LCBkZXN0RGlyKSB7XG4gIGNvbnN0IGRzdFBhdGggPSBwYXRoLnJlc29sdmUoZGVzdERpciwgZW50cnkuZmlsZU5hbWUpO1xuXG4gIC8vIENyZWF0ZSBkZXN0IGRpcmVjdG9yeSBpZiBkb2Vzbid0IGV4aXN0IGFscmVhZHlcbiAgaWYgKC9cXC8kLy50ZXN0KGVudHJ5LmZpbGVOYW1lKSkge1xuICAgIGlmICghKGF3YWl0IGZzLmV4aXN0cyhkc3RQYXRoKSkpIHtcbiAgICAgIGF3YWl0IGZzLm1rZGlycChkc3RQYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9IGVsc2UgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKHBhdGguZGlybmFtZShkc3RQYXRoKSkpKSB7XG4gICAgYXdhaXQgZnMubWtkaXJwKHBhdGguZGlybmFtZShkc3RQYXRoKSk7XG4gIH1cblxuICAvLyBDcmVhdGUgYSB3cml0ZSBzdHJlYW1cbiAgY29uc3Qgd3JpdGVTdHJlYW0gPSBjcmVhdGVXcml0ZVN0cmVhbShkc3RQYXRoLCB7ZmxhZ3M6ICd3J30pO1xuICBjb25zdCB3cml0ZVN0cmVhbVByb21pc2UgPSBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgd3JpdGVTdHJlYW0ub25jZSgnZmluaXNoJywgcmVzb2x2ZSk7XG4gICAgd3JpdGVTdHJlYW0ub25jZSgnZXJyb3InLCByZWplY3QpO1xuICB9KTtcblxuICAvLyBDcmVhdGUgemlwUmVhZFN0cmVhbSBhbmQgcGlwZSBkYXRhIHRvIHRoZSB3cml0ZSBzdHJlYW1cbiAgLy8gKGZvciBzb21lIG9kZCByZWFzb24gQi5wcm9taXNpZnkgZG9lc24ndCB3b3JrIG9uIHppcGZpbGUub3BlblJlYWRTdHJlYW0sIGl0IGNhdXNlcyBhbiBlcnJvciAnY2xvc2VkJylcbiAgY29uc3QgemlwUmVhZFN0cmVhbSA9IGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB6aXBGaWxlLm9wZW5SZWFkU3RyZWFtKGVudHJ5LCAoZXJyLCByZWFkU3RyZWFtKSA9PiAoZXJyID8gcmVqZWN0KGVycikgOiByZXNvbHZlKHJlYWRTdHJlYW0pKSk7XG4gIH0pO1xuICBjb25zdCB6aXBSZWFkU3RyZWFtUHJvbWlzZSA9IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB6aXBSZWFkU3RyZWFtLm9uY2UoJ2VuZCcsIHJlc29sdmUpO1xuICAgIHppcFJlYWRTdHJlYW0ub25jZSgnZXJyb3InLCByZWplY3QpO1xuICB9KTtcbiAgemlwUmVhZFN0cmVhbS5waXBlKHdyaXRlU3RyZWFtKTtcblxuICAvLyBXYWl0IGZvciB0aGUgemlwUmVhZFN0cmVhbSBhbmQgd3JpdGVTdHJlYW0gdG8gZW5kIGJlZm9yZSByZXR1cm5pbmdcbiAgcmV0dXJuIGF3YWl0IEIuYWxsKFt6aXBSZWFkU3RyZWFtUHJvbWlzZSwgd3JpdGVTdHJlYW1Qcm9taXNlXSk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYgWmlwRW50cnlcbiAqIEBwcm9wZXJ0eSB7eWF1emwuRW50cnl9IGVudHJ5IFRoZSBhY3R1YWwgZW50cnkgaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IGV4dHJhY3RFbnRyeVRvIEFuIGFzeW5jIGZ1bmN0aW9uLCB3aGljaCBhY2NlcHRzIG9uZSBwYXJhbWV0ZXIuXG4gKiBUaGlzIHBhcmFtZXRlciBjb250YWlucyB0aGUgZGVzdGluYXRpb24gZm9sZGVyIHBhdGggdG8gd2hpY2ggdGhpcyBmdW5jdGlvbiBpcyBnb2luZyB0byBleHRyYWN0IHRoZSBlbnRyeS5cbiAqL1xuXG4vKipcbiAqIEdldCBlbnRyaWVzIGZvciBhIHppcCBmb2xkZXJcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gemlwRmlsZVBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgc291cmNlIFpJUCBmaWxlXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBvbkVudHJ5IENhbGxiYWNrIHdoZW4gZW50cnkgaXMgcmVhZC5cbiAqIFRoZSBjYWxsYmFjayBpcyBleHBlY3RlZCB0byBhY2NlcHQgb25lIGFyZ3VtZW50IG9mIFppcEVudHJ5IHR5cGUuXG4gKiBUaGUgaXRlcmF0aW9uIHRocm91Z2ggdGhlIHNvdXJjZSB6aXAgZmlsZSB3aWxsIGJpIHRlcm1pbmF0ZWQgYXMgc29vbiBhc1xuICogdGhlIHJlc3VsdCBvZiB0aGlzIGZ1bmN0aW9uIGVxdWFscyB0byBgZmFsc2VgLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkRW50cmllcyh6aXBGaWxlUGF0aCwgb25FbnRyeSkge1xuICAvLyBPcGVuIGEgemlwIGZpbGUgYW5kIHN0YXJ0IHJlYWRpbmcgZW50cmllc1xuICBjb25zdCB6aXBmaWxlID0gYXdhaXQgb3BlblppcCh6aXBGaWxlUGF0aCwge2xhenlFbnRyaWVzOiB0cnVlfSk7XG4gIGNvbnN0IHppcFJlYWRTdHJlYW1Qcm9taXNlID0gbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHppcGZpbGUub25jZSgnZW5kJywgcmVzb2x2ZSk7XG4gICAgemlwZmlsZS5vbmNlKCdlcnJvcicsIHJlamVjdCk7XG5cbiAgICAvLyBPbiBlYWNoIGVudHJ5LCBjYWxsICdvbkVudHJ5JyBhbmQgdGhlbiByZWFkIHRoZSBuZXh0IGVudHJ5XG4gICAgemlwZmlsZS5vbignZW50cnknLCBhc3luYyAoZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IG9uRW50cnkoe1xuICAgICAgICBlbnRyeSxcbiAgICAgICAgZXh0cmFjdEVudHJ5VG86IGFzeW5jIChkZXN0RGlyKSA9PiBhd2FpdCBfZXh0cmFjdEVudHJ5VG8oemlwZmlsZSwgZW50cnksIGRlc3REaXIpLFxuICAgICAgfSk7XG4gICAgICBpZiAocmVzID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gemlwZmlsZS5lbWl0KCdlbmQnKTtcbiAgICAgIH1cbiAgICAgIHppcGZpbGUucmVhZEVudHJ5KCk7XG4gICAgfSk7XG4gIH0pO1xuICB6aXBmaWxlLnJlYWRFbnRyeSgpO1xuXG4gIC8vIFdhaXQgZm9yIHRoZSBlbnRyaWVzIHRvIGZpbmlzaCBiZWluZyBpdGVyYXRlZCB0aHJvdWdoXG4gIHJldHVybiBhd2FpdCB6aXBSZWFkU3RyZWFtUHJvbWlzZTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiBaaXBPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGVuY29kZVRvQmFzZTY0IFtmYWxzZV0gV2hldGhlciB0byBlbmNvZGVcbiAqIHRoZSByZXN1bHRpbmcgYXJjaGl2ZSB0byBhIGJhc2U2NC1lbmNvZGVkIHN0cmluZ1xuICogQHByb3BlcnR5IHtib29sZWFufSBpc01ldGVyZWQgW3RydWVdIFdoZXRoZXIgdG8gbG9nIHRoZSBhY3R1YWxcbiAqIGFyY2hpdmVyIHBlcmZvcm1hbmNlXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWF4U2l6ZSBbMTA3Mzc0MTgyNF0gVGhlIG1heGltdW0gc2l6ZSBvZlxuICogdGhlIHJlc3VsdGluZyBhcmNoaXZlIGluIGJ5dGVzLiBUaGlzIGlzIHNldCB0byAxR0IgYnkgZGVmYXVsdCwgYmVjYXVzZVxuICogQXBwaXVtIGxpbWl0cyB0aGUgbWF4aW11bSBIVFRQIGJvZHkgc2l6ZSB0byAxR0IuIEFsc28sIHRoZSBOb2RlSlMgaGVhcFxuICogc2l6ZSBtdXN0IGJlIGVub3VnaCB0byBrZWVwIHRoZSByZXN1bHRpbmcgb2JqZWN0ICh1c3VhbGx5IHRoaXMgc2l6ZSBpc1xuICogbGltaXRlZCB0byAxLjQgR0IpXG4gKiBAcHJvcGVydHkge251bWJlcn0gbGV2ZWwgWzldIFRoZSBjb21wcmVzc2lvbiBsZXZlbC4gVGhlIG1heGltdW1cbiAqIGxldmVsIGlzIDkgKHRoZSBiZXN0IGNvbXByZXNzaW9uLCB3b3JzdCBwZXJmb3JtYW5jZSkuIFRoZSBtaW5pbXVtXG4gKiBjb21wcmVzc2lvbiBsZXZlbCBpcyAwIChubyBjb21wcmVzc2lvbikuXG4gKi9cblxuLyoqXG4gKiBDb252ZXJ0cyBjb250ZW50cyBvZiBsb2NhbCBkaXJlY3RvcnkgdG8gYW4gaW4tbWVtb3J5IC56aXAgYnVmZmVyXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNyY1BhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgZm9sZGVyIG9yIGZpbGUgYmVpbmcgemlwcGVkXG4gKiBAcGFyYW0ge1ppcE9wdGlvbnN9IG9wdHMgWmlwcGluZyBvcHRpb25zXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCdWZmZXI+fSBaaXBwZWQgKGFuZCBlbmNvZGVkIGlmIGBlbmNvZGVUb0Jhc2U2NGAgaXMgdHJ1dGh5KVxuICogY29udGVudCBvZiB0aGUgc291cmNlIHBhdGggYXMgbWVtb3J5IGJ1ZmZlclxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSByZWFkaW5nIHRoZSBzb3VyY2VcbiAqIG9yIHRoZSBzb3VyY2UgaXMgdG9vIGJpZ1xuICovXG5hc3luYyBmdW5jdGlvbiB0b0luTWVtb3J5WmlwKHNyY1BhdGgsIG9wdHMgPSAvKiogQHR5cGUge1ppcE9wdGlvbnN9ICovICh7fSkpIHtcbiAgaWYgKCEoYXdhaXQgZnMuZXhpc3RzKHNyY1BhdGgpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gc3VjaCBmaWxlIG9yIGZvbGRlcjogJHtzcmNQYXRofWApO1xuICB9XG5cbiAgY29uc3Qge2lzTWV0ZXJlZCA9IHRydWUsIGVuY29kZVRvQmFzZTY0ID0gZmFsc2UsIG1heFNpemUgPSAxICogR2lCLCBsZXZlbCA9IDl9ID0gb3B0cztcbiAgY29uc3QgcmVzdWx0QnVmZmVycyA9IFtdO1xuICBsZXQgcmVzdWx0QnVmZmVyc1NpemUgPSAwO1xuICAvLyBDcmVhdGUgYSB3cml0YWJsZSBzdHJlYW0gdGhhdCB6aXAgYnVmZmVycyB3aWxsIGJlIHN0cmVhbWVkIHRvXG4gIGNvbnN0IHJlc3VsdFdyaXRlU3RyZWFtID0gbmV3IHN0cmVhbS5Xcml0YWJsZSh7XG4gICAgd3JpdGU6IChidWZmZXIsIGVuY29kaW5nLCBuZXh0KSA9PiB7XG4gICAgICByZXN1bHRCdWZmZXJzLnB1c2goYnVmZmVyKTtcbiAgICAgIHJlc3VsdEJ1ZmZlcnNTaXplICs9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICBpZiAobWF4U2l6ZSA+IDAgJiYgcmVzdWx0QnVmZmVyc1NpemUgPiBtYXhTaXplKSB7XG4gICAgICAgIHJlc3VsdFdyaXRlU3RyZWFtLmVtaXQoXG4gICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVGhlIHNpemUgb2YgdGhlIHJlc3VsdGluZyBgICtcbiAgICAgICAgICAgICAgYGFyY2hpdmUgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuICR7dG9SZWFkYWJsZVNpemVTdHJpbmcobWF4U2l6ZSl9YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG5leHQoKTtcbiAgICB9LFxuICB9KTtcblxuICAvLyBaaXAgJ3NyY0RpcicgYW5kIHN0cmVhbSBpdCB0byB0aGUgYWJvdmUgd3JpdGFibGUgc3RyZWFtXG4gIGNvbnN0IGFyY2hpdmUgPSBhcmNoaXZlcignemlwJywge1xuICAgIHpsaWI6IHtsZXZlbH0sXG4gIH0pO1xuICBsZXQgc3JjU2l6ZSA9IG51bGw7XG4gIGNvbnN0IGJhc2U2NEVuY29kZXJTdHJlYW0gPSBlbmNvZGVUb0Jhc2U2NCA/IG5ldyBCYXNlNjRFbmNvZGUoKSA6IG51bGw7XG4gIGNvbnN0IHJlc3VsdFdyaXRlU3RyZWFtUHJvbWlzZSA9IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICByZXN1bHRXcml0ZVN0cmVhbS5vbmNlKCdlcnJvcicsIChlKSA9PiB7XG4gICAgICBpZiAoYmFzZTY0RW5jb2RlclN0cmVhbSkge1xuICAgICAgICBhcmNoaXZlLnVucGlwZShiYXNlNjRFbmNvZGVyU3RyZWFtKTtcbiAgICAgICAgYmFzZTY0RW5jb2RlclN0cmVhbS51bnBpcGUocmVzdWx0V3JpdGVTdHJlYW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXJjaGl2ZS51bnBpcGUocmVzdWx0V3JpdGVTdHJlYW0pO1xuICAgICAgfVxuICAgICAgYXJjaGl2ZS5hYm9ydCgpO1xuICAgICAgYXJjaGl2ZS5kZXN0cm95KCk7XG4gICAgICByZWplY3QoZSk7XG4gICAgfSk7XG4gICAgcmVzdWx0V3JpdGVTdHJlYW0ub25jZSgnZmluaXNoJywgKCkgPT4ge1xuICAgICAgc3JjU2l6ZSA9IGFyY2hpdmUucG9pbnRlcigpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbiAgY29uc3QgYXJjaGl2ZVN0cmVhbVByb21pc2UgPSBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgYXJjaGl2ZS5vbmNlKCdmaW5pc2gnLCByZXNvbHZlKTtcbiAgICBhcmNoaXZlLm9uY2UoJ2Vycm9yJywgKGUpID0+IHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBhcmNoaXZlICcke3NyY1BhdGh9JzogJHtlLm1lc3NhZ2V9YCkpKTtcbiAgfSk7XG4gIGNvbnN0IHRpbWVyID0gaXNNZXRlcmVkID8gbmV3IFRpbWVyKCkuc3RhcnQoKSA6IG51bGw7XG4gIGlmICgoYXdhaXQgZnMuc3RhdChzcmNQYXRoKSkuaXNEaXJlY3RvcnkoKSkge1xuICAgIGFyY2hpdmUuZGlyZWN0b3J5KHNyY1BhdGgsIGZhbHNlKTtcbiAgfSBlbHNlIHtcbiAgICBhcmNoaXZlLmZpbGUoc3JjUGF0aCwge1xuICAgICAgbmFtZTogcGF0aC5iYXNlbmFtZShzcmNQYXRoKSxcbiAgICB9KTtcbiAgfVxuICBpZiAoYmFzZTY0RW5jb2RlclN0cmVhbSkge1xuICAgIGFyY2hpdmUucGlwZShiYXNlNjRFbmNvZGVyU3RyZWFtKTtcbiAgICBiYXNlNjRFbmNvZGVyU3RyZWFtLnBpcGUocmVzdWx0V3JpdGVTdHJlYW0pO1xuICB9IGVsc2Uge1xuICAgIGFyY2hpdmUucGlwZShyZXN1bHRXcml0ZVN0cmVhbSk7XG4gIH1cbiAgYXJjaGl2ZS5maW5hbGl6ZSgpO1xuXG4gIC8vIFdhaXQgZm9yIHRoZSBzdHJlYW1zIHRvIGZpbmlzaFxuICBhd2FpdCBCLmFsbChbYXJjaGl2ZVN0cmVhbVByb21pc2UsIHJlc3VsdFdyaXRlU3RyZWFtUHJvbWlzZV0pO1xuXG4gIGlmICh0aW1lcikge1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBaaXBwZWQgJHtlbmNvZGVUb0Jhc2U2NCA/ICdhbmQgYmFzZTY0LWVuY29kZWQgJyA6ICcnfWAgK1xuICAgICAgICBgJyR7cGF0aC5iYXNlbmFtZShzcmNQYXRoKX0nIGAgK1xuICAgICAgICAoc3JjU2l6ZSA/IGAoJHt0b1JlYWRhYmxlU2l6ZVN0cmluZyhzcmNTaXplKX0pIGAgOiAnJykgK1xuICAgICAgICBgaW4gJHt0aW1lci5nZXREdXJhdGlvbigpLmFzU2Vjb25kcy50b0ZpeGVkKDMpfXMgYCArXG4gICAgICAgIGAoY29tcHJlc3Npb24gbGV2ZWw6ICR7bGV2ZWx9KWBcbiAgICApO1xuICB9XG4gIC8vIFJldHVybiB0aGUgYXJyYXkgb2YgemlwIGJ1ZmZlcnMgY29uY2F0ZW5hdGVkIGludG8gb25lIGJ1ZmZlclxuICByZXR1cm4gQnVmZmVyLmNvbmNhdChyZXN1bHRCdWZmZXJzKTtcbn1cblxuLyoqXG4gKiBWZXJpZmllcyB3aGV0aGVyIHRoZSBnaXZlbiBmaWxlIGlzIGEgdmFsaWQgWklQIGFyY2hpdmVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGggLSBGdWxsIHBhdGggdG8gdGhlIGZpbGVcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYSB2YWxpZCBaSVAgYXJjaGl2ZVxuICovXG5hc3luYyBmdW5jdGlvbiBhc3NlcnRWYWxpZFppcChmaWxlUGF0aCkge1xuICBpZiAoIShhd2FpdCBmcy5leGlzdHMoZmlsZVBhdGgpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGZpbGUgYXQgJyR7ZmlsZVBhdGh9JyBkb2VzIG5vdCBleGlzdGApO1xuICB9XG5cbiAgY29uc3Qge3NpemV9ID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aCk7XG4gIGlmIChzaXplIDwgNCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGZpbGUgYXQgJyR7ZmlsZVBhdGh9JyBpcyB0b28gc21hbGwgdG8gYmUgYSBaSVAgYXJjaGl2ZWApO1xuICB9XG4gIGNvbnN0IGZkID0gYXdhaXQgZnMub3BlbihmaWxlUGF0aCwgJ3InKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2MoWklQX01BR0lDLmxlbmd0aCk7XG4gICAgYXdhaXQgZnMucmVhZChmZCwgYnVmZmVyLCAwLCBaSVBfTUFHSUMubGVuZ3RoLCAwKTtcbiAgICBjb25zdCBzaWduYXR1cmUgPSBidWZmZXIudG9TdHJpbmcoJ2FzY2lpJyk7XG4gICAgaWYgKHNpZ25hdHVyZSAhPT0gWklQX01BR0lDKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgZmlsZSBzaWduYXR1cmUgJyR7c2lnbmF0dXJlfScgb2YgJyR7ZmlsZVBhdGh9JyBgICtcbiAgICAgICAgICBgaXMgbm90IGVxdWFsIHRvIHRoZSBleHBlY3RlZCBaSVAgYXJjaGl2ZSBzaWduYXR1cmUgJyR7WklQX01BR0lDfSdgXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5jbG9zZShmZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAdHlwZWRlZiBaaXBDb21wcmVzc2lvbk9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsZXZlbCBbOV0gLSBDb21wcmVzc2lvbiBsZXZlbCBpbiByYW5nZSAwLi45XG4gKiAoZ3JlYXRlciBudW1iZXJzIG1lYW4gYmV0dGVyIGNvbXByZXNzaW9uLCBidXQgbG9uZ2VyIHByb2Nlc3NpbmcgdGltZSlcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFppcFNvdXJjZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXR0ZXJuIFsnKipcXC8qJ10gLSBHTE9CIHBhdHRlcm4gZm9yIGNvbXByZXNzaW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY3dkIC0gVGhlIHNvdXJjZSByb290IGZvbGRlciAodGhlIHBhcmVudCBmb2xkZXIgb2ZcbiAqIHRoZSBkZXN0aW5hdGlvbiBmaWxlIGJ5IGRlZmF1bHQpXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbaWdub3JlXSAtIFRoZSBsaXN0IG9mIGlnbm9yZWQgcGF0dGVybnNcbiAqL1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJjaGl2ZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gZ2xvYiBwYXR0ZXJuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGRzdFBhdGggLSBUaGUgcmVzdWx0aW5nIGFyY2hpdmUgcGF0aFxuICogQHBhcmFtIHtaaXBTb3VyY2VPcHRpb25zfSBzcmMgLSBTb3VyY2Ugb3B0aW9uc1xuICogQHBhcmFtIHtaaXBDb21wcmVzc2lvbk9wdGlvbnN9IG9wdHMgLSBDb21wcmVzc2lvbiBvcHRpb25zXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGNyZWF0aW5nIHRoZSBhcmNoaXZlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRvQXJjaGl2ZShcbiAgZHN0UGF0aCxcbiAgc3JjID0gLyoqIEB0eXBlIHtaaXBTb3VyY2VPcHRpb25zfSAqLyAoe30pLFxuICBvcHRzID0gLyoqIEB0eXBlIHtaaXBDb21wcmVzc2lvbk9wdGlvbnN9ICovICh7fSlcbikge1xuICBjb25zdCB7bGV2ZWwgPSA5fSA9IG9wdHM7XG4gIGNvbnN0IHtwYXR0ZXJuID0gJyoqLyonLCBjd2QgPSBwYXRoLmRpcm5hbWUoZHN0UGF0aCksIGlnbm9yZSA9IFtdfSA9IHNyYztcbiAgY29uc3QgYXJjaGl2ZSA9IGFyY2hpdmVyKCd6aXAnLCB7emxpYjoge2xldmVsfX0pO1xuICBjb25zdCBzdHJlYW0gPSBmcy5jcmVhdGVXcml0ZVN0cmVhbShkc3RQYXRoKTtcbiAgcmV0dXJuIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBhcmNoaXZlXG4gICAgICAuZ2xvYihwYXR0ZXJuLCB7XG4gICAgICAgIGN3ZCxcbiAgICAgICAgaWdub3JlLFxuICAgICAgfSlcbiAgICAgIC5vbignZXJyb3InLCByZWplY3QpXG4gICAgICAucGlwZShzdHJlYW0pO1xuICAgIHN0cmVhbVxuICAgICAgLm9uKCdlcnJvcicsIChlKSA9PiB7XG4gICAgICAgIGFyY2hpdmUudW5waXBlKHN0cmVhbSk7XG4gICAgICAgIGFyY2hpdmUuYWJvcnQoKTtcbiAgICAgICAgYXJjaGl2ZS5kZXN0cm95KCk7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH0pXG4gICAgICAub24oJ2ZpbmlzaCcsIHJlc29sdmUpO1xuICAgIGFyY2hpdmUuZmluYWxpemUoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogRmluZHMgYW5kIG1lbW9pemVzIHRoZSBmdWxsIHBhdGggdG8gdGhlIGdpdmVuIGV4ZWN1dGFibGUuXG4gKiBSZWplY3RzIGlmIGl0IGlzIG5vdCBmb3VuZC5cbiAqL1xuY29uc3QgZ2V0RXhlY3V0YWJsZVBhdGggPSBfLm1lbW9pemUoXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBGdWxsIFBhdGggdG8gdGhlIGV4ZWN1dGFibGVcbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIGdldEV4ZWN1dGFibGVQYXRoKGJpbmFyeU5hbWUpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IGF3YWl0IGZzLndoaWNoKGJpbmFyeU5hbWUpO1xuICAgIGxvZy5kZWJ1ZyhgRm91bmQgJyR7YmluYXJ5TmFtZX0nIGF0ICcke2Z1bGxQYXRofSdgKTtcbiAgICByZXR1cm4gZnVsbFBhdGg7XG4gIH1cbik7XG5cbmV4cG9ydCB7ZXh0cmFjdEFsbFRvLCByZWFkRW50cmllcywgdG9Jbk1lbW9yeVppcCwgX2V4dHJhY3RFbnRyeVRvLCBhc3NlcnRWYWxpZFppcCwgdG9BcmNoaXZlfTtcbmV4cG9ydCBkZWZhdWx0IHtcbiAgZXh0cmFjdEFsbFRvLFxuICByZWFkRW50cmllcyxcbiAgdG9Jbk1lbW9yeVppcCxcbiAgYXNzZXJ0VmFsaWRaaXAsXG4gIHRvQXJjaGl2ZSxcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBS0EsTUFBTUEsT0FBTyxHQUFHQyxpQkFBQSxDQUFFQyxTQUFGLENBQVlDLGNBQUEsQ0FBTUMsSUFBbEIsQ0FBaEI7O0FBSUEsTUFBTUMsUUFBUSxHQUFHSixpQkFBQSxDQUFFQyxTQUFGLENBQVlJLGVBQUEsQ0FBT0QsUUFBbkIsQ0FBakI7O0FBQ0EsTUFBTUUsU0FBUyxHQUFHLElBQWxCO0FBQ0EsTUFBTUMsSUFBSSxHQUFHLEtBQWI7QUFDQSxNQUFNQyxLQUFLLEdBQUcsS0FBZDtBQUNBLE1BQU1DLEtBQUssR0FBRyxLQUFkOztBQUdBLE1BQU1DLFlBQU4sQ0FBbUI7RUFFakJDLE9BQU87O0VBRVBDLFdBQVcsQ0FBQ0MsVUFBRCxFQUFhQyxJQUFJLEdBQUcsRUFBcEIsRUFBd0I7SUFDakMsS0FBS0MsT0FBTCxHQUFlRixVQUFmO0lBQ0EsS0FBS0MsSUFBTCxHQUFZQSxJQUFaO0lBQ0EsS0FBS0UsUUFBTCxHQUFnQixLQUFoQjtFQUNEOztFQUVEQyxlQUFlLENBQUNDLEtBQUQsRUFBUTtJQUNyQixPQUFPQyxlQUFBLENBQUVDLFFBQUYsQ0FBV0YsS0FBSyxDQUFDRyxRQUFqQixJQUNISCxLQUFLLENBQUNH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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zip.js","names":["openZip","B","promisify","yauzl","open","pipeline","stream","ZIP_MAGIC","IFMT","IFDIR","IFLNK","ZipExtractor","zipfile","constructor","sourcePath","opts","zipPath","canceled","extractFileName","entry","_","isBuffer","fileName","toString","fileNamesEncoding","extract","dir","lazyEntries","decodeStrings","resolve","reject","on","err","readEntry","startsWith","destDir","path","dirname","join","fs","mkdir","recursive","canonicalDestDir","realpath","relativeDestDir","relative","split","sep","includes","Error","extractEntry","close","dest","mode","externalFileAttributes","isSymlink","isDir","endsWith","versionMadeBy","procMode","getExtractedMode","mkdirOptions","openReadStream","bind","readStream","link","getStream","symlink","createWriteStream","entryMode","defaultDirMode","defaultFileMode","parseInt","extractAllTo","zipFilePath","isAbsolute","useSystemUnzip","extractWithSystemUnzip","log","warn","stderr","message","extractor","isWindowsHost","isWindows","executablePath","getExecutablePath","e","exec","_extractEntryTo","zipFile","dstPath","test","exists","mkdirp","writeStream","flags","writeStreamPromise","once","zipReadStream","zipReadStreamPromise","pipe","all","readEntries","onEntry","res","extractEntryTo","emit","toInMemoryZip","srcPath","isMetered","encodeToBase64","maxSize","GiB","level","resultBuffers","resultBuffersSize","resultWriteStream","Writable","write","buffer","encoding","next","push","length","toReadableSizeString","archive","archiver","zlib","srcSize","base64EncoderStream","Base64Encode","resultWriteStreamPromise","unpipe","abort","destroy","pointer","archiveStreamPromise","timer","Timer","start","stat","isDirectory","directory","file","name","basename","finalize","debug","getDuration","asSeconds","toFixed","Buffer","concat","assertValidZip","filePath","size","fd","alloc","read","signature","toArchive","src","pattern","cwd","ignore","glob","memoize","binaryName","fullPath","which"],"sources":["../../lib/zip.js"],"sourcesContent":["import _ from 'lodash';\nimport B from 'bluebird';\nimport yauzl from 'yauzl';\nimport archiver from 'archiver';\nimport {createWriteStream} from 'fs';\nimport path from 'path';\nimport stream from 'stream';\nimport fs from './fs';\nimport {isWindows} from './system';\nimport {Base64Encode} from 'base64-stream';\nimport {toReadableSizeString, GiB} from './util';\nimport Timer from './timing';\nimport log from './logger';\nimport getStream from 'get-stream';\nimport {exec} from 'teen_process';\n\n/**\n * @type {(path: string, options?: yauzl.Options) => Promise<yauzl.ZipFile>}\n */\nconst openZip = B.promisify(yauzl.open);\n/**\n * @type {(source: NodeJS.ReadableStream, destination: NodeJS.WritableStream) => Promise<NodeJS.WritableStream>}\n */\nconst pipeline = B.promisify(stream.pipeline);\nconst ZIP_MAGIC = 'PK';\nconst IFMT = 61440;\nconst IFDIR = 16384;\nconst IFLNK = 40960;\n\n// This class is mostly copied from https://github.com/maxogden/extract-zip/blob/master/index.js\nclass ZipExtractor {\n /** @type {yauzl.ZipFile} */\n zipfile;\n\n constructor(sourcePath, opts = {}) {\n this.zipPath = sourcePath;\n this.opts = opts;\n this.canceled = false;\n }\n\n extractFileName(entry) {\n return _.isBuffer(entry.fileName)\n ? entry.fileName.toString(this.opts.fileNamesEncoding)\n : entry.fileName;\n }\n\n async extract() {\n const {dir, fileNamesEncoding} = this.opts;\n this.zipfile = await openZip(this.zipPath, {\n lazyEntries: true,\n // https://github.com/thejoshwolfe/yauzl/commit/cc7455ac789ba84973184e5ebde0581cdc4c3b39#diff-04c6e90faac2675aa89e2176d2eec7d8R95\n decodeStrings: !fileNamesEncoding,\n });\n this.canceled = false;\n\n return new B((resolve, reject) => {\n this.zipfile.on('error', (err) => {\n this.canceled = true;\n reject(err);\n });\n this.zipfile.readEntry();\n\n this.zipfile.on('close', () => {\n if (!this.canceled) {\n resolve();\n }\n });\n\n this.zipfile.on('entry', async (entry) => {\n if (this.canceled) {\n return;\n }\n\n const fileName = this.extractFileName(entry);\n if (fileName.startsWith('__MACOSX/')) {\n this.zipfile.readEntry();\n return;\n }\n\n const destDir = path.dirname(path.join(dir, fileName));\n try {\n await fs.mkdir(destDir, {recursive: true});\n\n const canonicalDestDir = await fs.realpath(destDir);\n const relativeDestDir = path.relative(dir, canonicalDestDir);\n\n if (relativeDestDir.split(path.sep).includes('..')) {\n new Error(\n `Out of bound path \"${canonicalDestDir}\" found while processing file ${fileName}`\n );\n }\n\n await this.extractEntry(entry);\n this.zipfile.readEntry();\n } catch (err) {\n this.canceled = true;\n this.zipfile.close();\n reject(err);\n }\n });\n });\n }\n\n async extractEntry(entry) {\n if (this.canceled) {\n return;\n }\n\n const {dir} = this.opts;\n\n const fileName = this.extractFileName(entry);\n const dest = path.join(dir, fileName);\n\n // convert external file attr int into a fs stat mode int\n const mode = (entry.externalFileAttributes >> 16) & 0xffff;\n // check if it's a symlink or dir (using stat mode constants)\n const isSymlink = (mode & IFMT) === IFLNK;\n const isDir =\n (mode & IFMT) === IFDIR ||\n // Failsafe, borrowed from jsZip\n fileName.endsWith('/') ||\n // check for windows weird way of specifying a directory\n // https://github.com/maxogden/extract-zip/issues/13#issuecomment-154494566\n (entry.versionMadeBy >> 8 === 0 && entry.externalFileAttributes === 16);\n const procMode = this.getExtractedMode(mode, isDir) & 0o777;\n // always ensure folders are created\n const destDir = isDir ? dest : path.dirname(dest);\n const mkdirOptions = {recursive: true};\n if (isDir) {\n mkdirOptions.mode = procMode;\n }\n await fs.mkdir(destDir, mkdirOptions);\n if (isDir) {\n return;\n }\n\n /** @type {(entry: yauzl.Entry) => Promise<NodeJS.ReadableStream>} */\n const openReadStream = B.promisify(this.zipfile.openReadStream.bind(this.zipfile));\n const readStream = await openReadStream(entry);\n if (isSymlink) {\n const link = await getStream(readStream);\n await fs.symlink(link, dest);\n } else {\n await pipeline(readStream, fs.createWriteStream(dest, {mode: procMode}));\n }\n }\n\n getExtractedMode(entryMode, isDir) {\n const {defaultDirMode, defaultFileMode} = this.opts;\n\n let mode = entryMode;\n // Set defaults, if necessary\n if (mode === 0) {\n if (isDir) {\n if (defaultDirMode) {\n mode = parseInt(defaultDirMode, 10);\n }\n\n if (!mode) {\n mode = 0o755;\n }\n } else {\n if (defaultFileMode) {\n mode = parseInt(defaultFileMode, 10);\n }\n\n if (!mode) {\n mode = 0o644;\n }\n }\n }\n\n return mode;\n }\n}\n\n/**\n * @typedef ExtractAllOptions\n * @property {string} [fileNamesEncoding] The encoding to use for extracted file names.\n * For ZIP archives created on MacOS it is usually expected to be `utf8`.\n * By default it is autodetected based on the entry metadata and is only needed to be set explicitly\n * if the particular archive does not comply to the standards, which leads to corrupted file names\n * after extraction. Only applicable if system unzip binary is NOT being used.\n * @property {boolean} [useSystemUnzip] If true, attempt to use system unzip; if this fails,\n * fallback to the JS unzip implementation.\n */\n\n/**\n * Extract zipfile to a directory\n *\n * @param {string} zipFilePath The full path to the source ZIP file\n * @param {string} destDir The full path to the destination folder\n * @param {ExtractAllOptions} [opts]\n */\nasync function extractAllTo(zipFilePath, destDir, opts = /** @type {ExtractAllOptions} */ ({})) {\n if (!path.isAbsolute(destDir)) {\n throw new Error(`Target path '${destDir}' is expected to be absolute`);\n }\n\n await fs.mkdir(destDir, {recursive: true});\n const dir = await fs.realpath(destDir);\n if (opts.useSystemUnzip) {\n try {\n await extractWithSystemUnzip(zipFilePath, dir);\n return;\n } catch (err) {\n log.warn('unzip failed; falling back to JS: %s', err.stderr || err.message);\n }\n }\n const extractor = new ZipExtractor(zipFilePath, {\n ...opts,\n dir,\n });\n await extractor.extract();\n}\n\n/**\n * Executes system unzip (e.g., `/usr/bin/unzip`). If available, it is\n * significantly faster than the JS implementation.\n * By default all files in the destDir get overridden if already exist.\n *\n * @param {string} zipFilePath The full path to the source ZIP file\n * @param {string} destDir The full path to the destination folder.\n * This folder is expected to already exist before extracting the archive.\n */\nasync function extractWithSystemUnzip(zipFilePath, destDir) {\n const isWindowsHost = isWindows();\n let executablePath;\n try {\n executablePath = await getExecutablePath(isWindowsHost ? 'powershell.exe' : 'unzip');\n } catch (e) {\n throw new Error('Could not find system unzip');\n }\n\n if (isWindowsHost) {\n // on Windows we use PowerShell to unzip files\n await exec(executablePath, [\n '-command',\n 'Expand-Archive',\n '-LiteralPath',\n zipFilePath,\n '-DestinationPath',\n destDir,\n '-Force',\n ]);\n } else {\n // -q means quiet (no stdout)\n // -o means overwrite\n // -d is the dest dir\n await exec(executablePath, ['-q', '-o', zipFilePath, '-d', destDir]);\n }\n}\n\n/**\n * Extract a single zip entry to a directory\n *\n * @param {yauzl.ZipFile} zipFile The source ZIP stream\n * @param {yauzl.Entry} entry The entry instance\n * @param {string} destDir The full path to the destination folder\n */\nasync function _extractEntryTo(zipFile, entry, destDir) {\n const dstPath = path.resolve(destDir, entry.fileName);\n\n // Create dest directory if doesn't exist already\n if (/\\/$/.test(entry.fileName)) {\n if (!(await fs.exists(dstPath))) {\n await fs.mkdirp(dstPath);\n }\n return;\n } else if (!(await fs.exists(path.dirname(dstPath)))) {\n await fs.mkdirp(path.dirname(dstPath));\n }\n\n // Create a write stream\n const writeStream = createWriteStream(dstPath, {flags: 'w'});\n const writeStreamPromise = new B((resolve, reject) => {\n writeStream.once('finish', resolve);\n writeStream.once('error', reject);\n });\n\n // Create zipReadStream and pipe data to the write stream\n // (for some odd reason B.promisify doesn't work on zipfile.openReadStream, it causes an error 'closed')\n const zipReadStream = await new B((resolve, reject) => {\n zipFile.openReadStream(entry, (err, readStream) => (err ? reject(err) : resolve(readStream)));\n });\n const zipReadStreamPromise = new B((resolve, reject) => {\n zipReadStream.once('end', resolve);\n zipReadStream.once('error', reject);\n });\n zipReadStream.pipe(writeStream);\n\n // Wait for the zipReadStream and writeStream to end before returning\n return await B.all([zipReadStreamPromise, writeStreamPromise]);\n}\n\n/**\n * @typedef ZipEntry\n * @property {yauzl.Entry} entry The actual entry instance\n * @property {function} extractEntryTo An async function, which accepts one parameter.\n * This parameter contains the destination folder path to which this function is going to extract the entry.\n */\n\n/**\n * Get entries for a zip folder\n *\n * @param {string} zipFilePath The full path to the source ZIP file\n * @param {function} onEntry Callback when entry is read.\n * The callback is expected to accept one argument of ZipEntry type.\n * The iteration through the source zip file will bi terminated as soon as\n * the result of this function equals to `false`.\n */\nasync function readEntries(zipFilePath, onEntry) {\n // Open a zip file and start reading entries\n const zipfile = await openZip(zipFilePath, {lazyEntries: true});\n const zipReadStreamPromise = new B((resolve, reject) => {\n zipfile.once('end', resolve);\n zipfile.once('error', reject);\n\n // On each entry, call 'onEntry' and then read the next entry\n zipfile.on('entry', async (entry) => {\n const res = await onEntry({\n entry,\n extractEntryTo: async (destDir) => await _extractEntryTo(zipfile, entry, destDir),\n });\n if (res === false) {\n return zipfile.emit('end');\n }\n zipfile.readEntry();\n });\n });\n zipfile.readEntry();\n\n // Wait for the entries to finish being iterated through\n return await zipReadStreamPromise;\n}\n\n/**\n * @typedef ZipOptions\n * @property {boolean} encodeToBase64 [false] Whether to encode\n * the resulting archive to a base64-encoded string\n * @property {boolean} isMetered [true] Whether to log the actual\n * archiver performance\n * @property {number} maxSize [1073741824] The maximum size of\n * the resulting archive in bytes. This is set to 1GB by default, because\n * Appium limits the maximum HTTP body size to 1GB. Also, the NodeJS heap\n * size must be enough to keep the resulting object (usually this size is\n * limited to 1.4 GB)\n * @property {number} level [9] The compression level. The maximum\n * level is 9 (the best compression, worst performance). The minimum\n * compression level is 0 (no compression).\n */\n\n/**\n * Converts contents of local directory to an in-memory .zip buffer\n *\n * @param {string} srcPath The full path to the folder or file being zipped\n * @param {ZipOptions} opts Zipping options\n * @returns {Promise<Buffer>} Zipped (and encoded if `encodeToBase64` is truthy)\n * content of the source path as memory buffer\n * @throws {Error} if there was an error while reading the source\n * or the source is too big\n */\nasync function toInMemoryZip(srcPath, opts = /** @type {ZipOptions} */ ({})) {\n if (!(await fs.exists(srcPath))) {\n throw new Error(`No such file or folder: ${srcPath}`);\n }\n\n const {isMetered = true, encodeToBase64 = false, maxSize = 1 * GiB, level = 9} = opts;\n const resultBuffers = [];\n let resultBuffersSize = 0;\n // Create a writable stream that zip buffers will be streamed to\n const resultWriteStream = new stream.Writable({\n write: (buffer, encoding, next) => {\n resultBuffers.push(buffer);\n resultBuffersSize += buffer.length;\n if (maxSize > 0 && resultBuffersSize > maxSize) {\n resultWriteStream.emit(\n 'error',\n new Error(\n `The size of the resulting ` +\n `archive must not be greater than ${toReadableSizeString(maxSize)}`\n )\n );\n }\n next();\n },\n });\n\n // Zip 'srcDir' and stream it to the above writable stream\n const archive = archiver('zip', {\n zlib: {level},\n });\n let srcSize = null;\n const base64EncoderStream = encodeToBase64 ? new Base64Encode() : null;\n const resultWriteStreamPromise = new B((resolve, reject) => {\n resultWriteStream.once('error', (e) => {\n if (base64EncoderStream) {\n archive.unpipe(base64EncoderStream);\n base64EncoderStream.unpipe(resultWriteStream);\n } else {\n archive.unpipe(resultWriteStream);\n }\n archive.abort();\n archive.destroy();\n reject(e);\n });\n resultWriteStream.once('finish', () => {\n srcSize = archive.pointer();\n resolve();\n });\n });\n const archiveStreamPromise = new B((resolve, reject) => {\n archive.once('finish', resolve);\n archive.once('error', (e) => reject(new Error(`Failed to archive '${srcPath}': ${e.message}`)));\n });\n const timer = isMetered ? new Timer().start() : null;\n if ((await fs.stat(srcPath)).isDirectory()) {\n archive.directory(srcPath, false);\n } else {\n archive.file(srcPath, {\n name: path.basename(srcPath),\n });\n }\n if (base64EncoderStream) {\n archive.pipe(base64EncoderStream);\n base64EncoderStream.pipe(resultWriteStream);\n } else {\n archive.pipe(resultWriteStream);\n }\n archive.finalize();\n\n // Wait for the streams to finish\n await B.all([archiveStreamPromise, resultWriteStreamPromise]);\n\n if (timer) {\n log.debug(\n `Zipped ${encodeToBase64 ? 'and base64-encoded ' : ''}` +\n `'${path.basename(srcPath)}' ` +\n (srcSize ? `(${toReadableSizeString(srcSize)}) ` : '') +\n `in ${timer.getDuration().asSeconds.toFixed(3)}s ` +\n `(compression level: ${level})`\n );\n }\n // Return the array of zip buffers concatenated into one buffer\n return Buffer.concat(resultBuffers);\n}\n\n/**\n * Verifies whether the given file is a valid ZIP archive\n *\n * @param {string} filePath - Full path to the file\n * @throws {Error} If the file does not exist or is not a valid ZIP archive\n */\nasync function assertValidZip(filePath) {\n if (!(await fs.exists(filePath))) {\n throw new Error(`The file at '${filePath}' does not exist`);\n }\n\n const {size} = await fs.stat(filePath);\n if (size < 4) {\n throw new Error(`The file at '${filePath}' is too small to be a ZIP archive`);\n }\n const fd = await fs.open(filePath, 'r');\n try {\n const buffer = Buffer.alloc(ZIP_MAGIC.length);\n await fs.read(fd, buffer, 0, ZIP_MAGIC.length, 0);\n const signature = buffer.toString('ascii');\n if (signature !== ZIP_MAGIC) {\n throw new Error(\n `The file signature '${signature}' of '${filePath}' ` +\n `is not equal to the expected ZIP archive signature '${ZIP_MAGIC}'`\n );\n }\n return true;\n } finally {\n await fs.close(fd);\n }\n}\n\n/**\n * @typedef ZipCompressionOptions\n * @property {number} level [9] - Compression level in range 0..9\n * (greater numbers mean better compression, but longer processing time)\n */\n\n/**\n * @typedef ZipSourceOptions\n * @property {string} pattern ['**\\/*'] - GLOB pattern for compression\n * @property {string} cwd - The source root folder (the parent folder of\n * the destination file by default)\n * @property {string[]} [ignore] - The list of ignored patterns\n */\n\n/**\n * Creates an archive based on the given glob pattern\n *\n * @param {string} dstPath - The resulting archive path\n * @param {ZipSourceOptions} src - Source options\n * @param {ZipCompressionOptions} opts - Compression options\n * @throws {Error} If there was an error while creating the archive\n */\nasync function toArchive(\n dstPath,\n src = /** @type {ZipSourceOptions} */ ({}),\n opts = /** @type {ZipCompressionOptions} */ ({})\n) {\n const {level = 9} = opts;\n const {pattern = '**/*', cwd = path.dirname(dstPath), ignore = []} = src;\n const archive = archiver('zip', {zlib: {level}});\n const stream = fs.createWriteStream(dstPath);\n return await new B((resolve, reject) => {\n archive\n .glob(pattern, {\n cwd,\n ignore,\n })\n .on('error', reject)\n .pipe(stream);\n stream\n .on('error', (e) => {\n archive.unpipe(stream);\n archive.abort();\n archive.destroy();\n reject(e);\n })\n .on('finish', resolve);\n archive.finalize();\n });\n}\n\n/**\n * Finds and memoizes the full path to the given executable.\n * Rejects if it is not found.\n */\nconst getExecutablePath = _.memoize(\n /**\n * @returns {Promise<string>} Full Path to the executable\n */\n async function getExecutablePath(binaryName) {\n const fullPath = await fs.which(binaryName);\n log.debug(`Found '${binaryName}' at '${fullPath}'`);\n return fullPath;\n }\n);\n\nexport {extractAllTo, readEntries, toInMemoryZip, _extractEntryTo, assertValidZip, toArchive};\nexport default {\n extractAllTo,\n readEntries,\n toInMemoryZip,\n assertValidZip,\n toArchive,\n};\n"],"mappings":"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"}
|