diff --git a/local-cli/server/middleware/heapCapture/Makefile b/local-cli/server/middleware/heapCapture/Makefile index 736c16625..c30834163 100644 --- a/local-cli/server/middleware/heapCapture/Makefile +++ b/local-cli/server/middleware/heapCapture/Makefile @@ -1,8 +1,8 @@ SHELL := /bin/bash all: - NODE_PATH="../../../../node_modules/" babel --presets babel-preset-react-native -d out src - for f in out/*.js; do echo "// @generated" >> $$f; done + NODE_PATH="../../../../node_modules/" babel --presets babel-preset-react-native --source-maps inline -d out src + for f in out/*.js; do echo -e "\n// @generated" >> $$f; done watch: NODE_PATH="../../../../node_modules/" babel --watch --presets babel-preset-react-native -d out src diff --git a/local-cli/server/middleware/heapCapture/out/aggrow.js b/local-cli/server/middleware/heapCapture/out/aggrow.js index 83306850b..d980d073e 100644 --- a/local-cli/server/middleware/heapCapture/out/aggrow.js +++ b/local-cli/server/middleware/heapCapture/out/aggrow.js @@ -46,17 +46,16 @@ return stackIdMap[id]; } -function stackRegistry(interner){// eslint-disable-line no-unused-vars +function stackRegistry(){// eslint-disable-line no-unused-vars return{ root:{id:0}, nodeCount:1, -insert:function insertNode(parent,label){ -var labelId=interner.intern(label); -var node=parent[labelId]; +insert:function insertNode(parent,frameId){ +var node=parent[frameId]; if(node===undefined){ node={id:this.nodeCount}; this.nodeCount++; -parent[labelId]=node; +parent[frameId]=node; } return node; }, @@ -116,7 +115,7 @@ return new stackData(stackIdMap,maxStackDepth); } -function aggrow(strings,stacks,numRows){// eslint-disable-line no-unused-vars +function aggrow(numRows){// eslint-disable-line no-unused-vars // expander ID definitions var FIELD_EXPANDER_ID_MIN=0x0000; var FIELD_EXPANDER_ID_MAX=0x7fff; @@ -142,16 +141,16 @@ var NODE_REORDER_BIT=0x0004;// children need to be sorted var NODE_REPOSITION_BIT=0x0008;// children need position var NODE_INDENT_SHIFT=16; -function calleeFrameGetter(stack,depth){ +function calleeFrameIdGetter(stack,depth){ return stack[depth]; } -function callerFrameGetter(stack,depth){ +function callerFrameIdGetter(stack,depth){ return stack[stack.length-depth-1]; } -function createStackComparers(stackGetter,frameGetter){ -var comparers=new Array(stacks.maxDepth);var _loop=function _loop( +function createStackComparers(stackGetter,frameIdGetter,maxStackDepth){ +var comparers=new Array(maxStackDepth);var _loop=function _loop( depth){ var captureDepth=depth;// NB: to capture depth per loop iteration comparers[depth]=function calleeStackComparer(rowA,rowB){ @@ -166,8 +165,8 @@ return-1; }else if(b.length<=captureDepth){ return 1; } -return frameGetter(a,captureDepth)-frameGetter(b,captureDepth); -};};for(var depth=0;depth=STACK_EXPANDER_ID_MAX){ throw'too many stack expanders!'; } state.stackExpanders.push({ name:name,// name for column stackGetter:stackGetter,// row index -> stack array -comparers:createStackComparers(stackGetter,calleeFrameGetter),// depth -> comparer -frameGetter:calleeFrameGetter}); +comparers:createStackComparers(stackGetter,calleeFrameIdGetter,maxStackDepth),// depth -> comparer +frameIdGetter:calleeFrameIdGetter,// (stack, depth) -> string id +frameGetter:frameGetter}); return STACK_EXPANDER_ID_MIN+state.stackExpanders.length-1; }, -addCallerStackExpander:function addCallerStackExpander(name,stackGetter){ +addCallerStackExpander:function addCallerStackExpander(name,maxStackDepth,stackGetter,frameGetter){ if(STACK_EXPANDER_ID_MIN+state.fieldExpanders.length>=STACK_EXPANDER_ID_MAX){ throw'too many stack expanders!'; } state.stackExpanders.push({ name:name, stackGetter:stackGetter, -comparers:createStackComparers(stackGetter,callerFrameGetter), -frameGetter:callerFrameGetter}); +comparers:createStackComparers(stackGetter,callerFrameIdGetter,maxStackDepth), +frameIdGetter:callerFrameIdGetter, +frameGetter:frameGetter}); return STACK_EXPANDER_ID_MIN+state.stackExpanders.length-1; }, @@ -616,4 +618,6 @@ contract:function contract(row){ contractRow(row); }}; -}// @generated +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9hZ2dyb3cuanMiXSwibmFtZXMiOlsic3RyaW5nSW50ZXJuZXIiLCJzdHJpbmdzIiwiaWRzIiwiaW50ZXJuIiwiaW50ZXJuU3RyaW5nIiwicyIsImZpbmQiLCJ1bmRlZmluZWQiLCJpZCIsImxlbmd0aCIsInB1c2giLCJnZXQiLCJnZXRTdHJpbmciLCJzdGFja0RhdGEiLCJzdGFja0lkTWFwIiwibWF4RGVwdGgiLCJnZXRTdGFjayIsInN0YWNrUmVnaXN0cnkiLCJyb290Iiwibm9kZUNvdW50IiwiaW5zZXJ0IiwiaW5zZXJ0Tm9kZSIsInBhcmVudCIsImZyYW1lSWQiLCJub2RlIiwiZmxhdHRlbiIsImZsYXR0ZW5TdGFja3MiLCJzdGFja0ZyYW1lQ291bnQiLCJjb3VudFN0YWNrcyIsInRyZWUiLCJkZXB0aCIsImxlYWYiLCJjb25zb2xlIiwibG9nIiwidG9TdHJpbmciLCJBcnJheSIsInN0YWNrQXJyYXkiLCJJbnQzMkFycmF5IiwibWF4U3RhY2tEZXB0aCIsImZsYXR0ZW5TdGFja3NJbXBsIiwic3RhY2siLCJjaGlsZFN0YWNrIiwiTWF0aCIsIm1heCIsIk51bWJlciIsInBvcCIsInN1YmFycmF5IiwibmV3U3RhY2siLCJpIiwiYWdncm93IiwibnVtUm93cyIsIkZJRUxEX0VYUEFOREVSX0lEX01JTiIsIkZJRUxEX0VYUEFOREVSX0lEX01BWCIsIlNUQUNLX0VYUEFOREVSX0lEX01JTiIsIlNUQUNLX0VYUEFOREVSX0lEX01BWCIsIklOVkFMSURfQUNUSVZFX0VYUEFOREVSIiwiQUNUSVZFX0VYUEFOREVSX01BU0siLCJBQ1RJVkVfRVhQQU5ERVJfRlJBTUVfU0hJRlQiLCJBR0dSRUdBVE9SX0lEX01BWCIsIkFDVElWRV9BR0dSRUdBVE9SX01BU0siLCJBQ1RJVkVfQUdHUkVHQVRPUl9BU0NfQklUIiwiTk9ERV9FWFBBTkRFRF9CSVQiLCJOT0RFX1JFQUdHUkVHQVRFX0JJVCIsIk5PREVfUkVPUkRFUl9CSVQiLCJOT0RFX1JFUE9TSVRJT05fQklUIiwiTk9ERV9JTkRFTlRfU0hJRlQiLCJjYWxsZWVGcmFtZUlkR2V0dGVyIiwiY2FsbGVyRnJhbWVJZEdldHRlciIsImNyZWF0ZVN0YWNrQ29tcGFyZXJzIiwic3RhY2tHZXR0ZXIiLCJmcmFtZUlkR2V0dGVyIiwiY29tcGFyZXJzIiwiY2FwdHVyZURlcHRoIiwiY2FsbGVlU3RhY2tDb21wYXJlciIsInJvd0EiLCJyb3dCIiwiYSIsImIiLCJjcmVhdGVUcmVlTm9kZSIsImxhYmVsIiwiaW5kaWNlcyIsImV4cGFuZGVyIiwiaW5kZW50Iiwic3RhdGUiLCJjaGlsZHJlbiIsImFnZ3JlZ2F0ZXMiLCJ0b3AiLCJoZWlnaHQiLCJub1NvcnRPcmRlciIsImZpZWxkRXhwYW5kZXJzIiwic3RhY2tFeHBhbmRlcnMiLCJhY3RpdmVFeHBhbmRlcnMiLCJhZ2dyZWdhdG9ycyIsImFjdGl2ZUFnZ3JlZ2F0b3JzIiwic29ydGVyIiwiZXZhbHVhdGVBZ2dyZWdhdGUiLCJyb3ciLCJqIiwiYWdncmVnYXRvciIsImV2YWx1YXRlQWdncmVnYXRlcyIsImV2YWx1YXRlT3JkZXIiLCJjaGlsZCIsInNvcnQiLCJldmFsdWF0ZVBvc2l0aW9uIiwiY2hpbGRUb3AiLCJnZXRSb3dzSW1wbCIsInJlc3VsdCIsInVwZGF0ZUhlaWdodCIsImhlaWdodENoYW5nZSIsImFkZENoaWxkcmVuV2l0aEZpZWxkRXhwYW5kZXIiLCJuZXh0QWN0aXZlSW5kZXgiLCJyb3dJbmRpY2VzIiwiY29tcGFyZXIiLCJiZWdpbiIsImVuZCIsIm5hbWUiLCJmb3JtYXR0ZXIiLCJhZGRDaGlsZHJlbldpdGhTdGFja0V4cGFuZGVyIiwiYWN0aXZlSW5kZXgiLCJmcmFtZUdldHRlciIsImV4cGFuZE5leHRGcmFtZSIsImNvbHVtbk5hbWUiLCJiZWdpblN0YWNrIiwiZW5kU3RhY2siLCJjb250cmFjdFJvdyIsInBydW5lRXhwYW5kZXJzIiwib2xkRXhwYW5kZXIiLCJuZXdFeHBhbmRlciIsImFkZEZpZWxkRXhwYW5kZXIiLCJhZGRDYWxsZWVTdGFja0V4cGFuZGVyIiwiYWRkQ2FsbGVyU3RhY2tFeHBhbmRlciIsImdldEV4cGFuZGVycyIsImV4cGFuZGVycyIsImdldEV4cGFuZGVyTmFtZSIsInNldEFjdGl2ZUV4cGFuZGVycyIsInNsaWNlIiwiZ2V0QWN0aXZlRXhwYW5kZXJzIiwiYWRkQWdncmVnYXRvciIsImdldEFnZ3JlZ2F0b3JzIiwiZ2V0QWdncmVnYXRvck5hbWUiLCJzZXRBY3RpdmVBZ2dyZWdhdG9ycyIsImFzY2VuZGluZyIsImNhcHR1cmVTb3J0ZXIiLCJjYXB0dXJlSW5kZXgiLCJjIiwiZ2V0QWN0aXZlQWdncmVnYXRvcnMiLCJnZXRSb3dzIiwiZ2V0Um93TGFiZWwiLCJnZXRSb3dJbmRlbnQiLCJnZXRSb3dBZ2dyZWdhdGUiLCJpbmRleCIsImdldEhlaWdodCIsImNhbkV4cGFuZCIsImNhbkNvbnRyYWN0IiwiZXhwYW5kIiwiZXhJZCIsImNvbnRyYWN0Il0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxRQUFTQSxlQUFULEVBQTBCLENBQUU7QUFDMUIsR0FBTUMsU0FBVSxFQUFoQjtBQUNBLEdBQU1DLEtBQU0sRUFBWjtBQUNBLE1BQU87QUFDTEMsT0FBUSxRQUFTQyxhQUFULENBQXNCQyxDQUF0QixDQUF5QjtBQUMvQixHQUFNQyxNQUFPSixJQUFJRyxDQUFKLENBQWI7QUFDQSxHQUFJQyxPQUFTQyxTQUFiLENBQXdCO0FBQ3RCLEdBQU1DLElBQUtQLFFBQVFRLE1BQW5CO0FBQ0FQLElBQUlHLENBQUosRUFBU0csRUFBVDtBQUNBUCxRQUFRUyxJQUFSLENBQWFMLENBQWI7QUFDQSxNQUFPRyxHQUFQO0FBQ0QsQ0FMRCxJQUtPO0FBQ0wsTUFBT0YsS0FBUDtBQUNEO0FBQ0YsQ0FYSTtBQVlMSyxJQUFLLFFBQVNDLFVBQVQsQ0FBbUJKLEVBQW5CLENBQXVCO0FBQzFCLE1BQU9QLFNBQVFPLEVBQVIsQ0FBUDtBQUNELENBZEksQ0FBUDs7QUFnQkQ7O0FBRUQsUUFB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RFMsQ0FDY0MsZ0JBRGQsQ0FDaUNDLG1CQUQ5QztBQUVBLEdBQUk0QyxjQUFlLENBQW5CO0FBQ0EsSUFBSyxHQUFJNUQsTUFBSSxDQUFiLENBQWdCQSxLQUFJZ0QsSUFBSVosUUFBSixDQUFhM0UsTUFBakMsQ0FBeUN1QyxNQUF6QyxDQUE4QztBQUM1QzRELGNBQWdCWixJQUFJWixRQUFKLENBQWFwQyxJQUFiLEVBQWdCdUMsTUFBaEM7QUFDRDtBQUNEb0IsYUFBYVgsR0FBYixDQUFrQlksWUFBbEI7QUFDQTtBQUNBLEdBQUlaLElBQUlaLFFBQUosQ0FBYTNFLE1BQWIsR0FBd0IsQ0FBeEIsRUFBNkIsS0FBSytJLFNBQUwsQ0FBZXhELElBQUlaLFFBQUosQ0FBYSxDQUFiLENBQWYsQ0FBakMsQ0FBa0U7QUFDaEUsS0FBS3NFLE1BQUwsQ0FBWTFELElBQUlaLFFBQUosQ0FBYSxDQUFiLENBQVo7QUFDRDtBQUNGLENBL01JO0FBZ05Md0UsU0FBVSxRQUFTQSxTQUFULENBQWtCNUQsR0FBbEIsQ0FBdUI7QUFDL0I0QixZQUFZNUIsR0FBWjtBQUNELENBbE5JLENBQVA7O0FBb05EIiwiZmlsZSI6ImFnZ3Jvdy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE2LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuLyplc2xpbnQgbm8tYml0d2lzZTogXCJvZmZcIiovXG4vKmVzbGludCBuby1jb25zb2xlLWRpc2FsbG93OiBcIm9mZlwiKi9cblxuLy8gVE9ETzogZnV0dXJlIGZlYXR1cmVzXG4vLyBwdXQgaW4gYSBtb2R1bGUuZXhwb3J0c1xuLy8gZmlsdGVyaW5nIC8gc2VhcmNoXG4vLyBwaXZvdCBhcm91bmQgZnJhbWVzIGluIHRoZSBtaWRkbGUgb2YgYSBzdGFjayBieSBjYWxsZXJzIC8gY2FsbGVlc1xuLy8gZ3JhcGhpbmc/XG5cbmZ1bmN0aW9uIHN0cmluZ0ludGVybmVyKCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIGNvbnN0IHN0cmluZ3MgPSBbXTtcbiAgY29uc3QgaWRzID0ge307XG4gIHJldHVybiB7XG4gICAgaW50ZXJuOiBmdW5jdGlvbiBpbnRlcm5TdHJpbmcocykge1xuICAgICAgY29uc3QgZmluZCA9IGlkc1tzXTtcbiAgICAgIGlmIChmaW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgaWQgPSBzdHJpbmdzLmxlbmd0aDtcbiAgICAgICAgaWRzW3NdID0gaWQ7XG4gICAgICAgIHN0cmluZ3MucHVzaChzKTtcbiAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZpbmQ7XG4gICAgICB9XG4gICAgfSxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldFN0cmluZyhpZCkge1xuICAgICAgcmV0dXJuIHN0cmluZ3NbaWRdO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0YWNrRGF0YShzdGFja0lkTWFwLCBtYXhEZXB0aCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHJldHVybiB7XG4gICAgbWF4RGVwdGg6IG1heERlcHRoLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0U3RhY2soaWQpIHtcbiAgICAgIHJldHVybiBzdGFja0lkTWFwW2lkXTtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBzdGFja1JlZ2lzdHJ5KCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHJldHVybiB7XG4gICAgcm9vdDogeyBpZDogMCB9LFxuICAgIG5vZGVDb3VudDogMSxcbiAgICBpbnNlcnQ6IGZ1bmN0aW9uIGluc2VydE5vZGUocGFyZW50LCBmcmFtZUlkKSB7XG4gICAgICBsZXQgbm9kZSA9IHBhcmVudFtmcmFtZUlkXTtcbiAgICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbm9kZSA9IHsgaWQ6IHRoaXMubm9kZUNvdW50IH07XG4gICAgICAgIHRoaXMubm9kZUNvdW50Kys7XG4gICAgICAgIHBhcmVudFtmcmFtZUlkXSA9IG5vZGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9LFxuICAgIGZsYXR0ZW46IGZ1bmN0aW9uIGZsYXR0ZW5TdGFja3MoKSB7XG4gICAgICBsZXQgc3RhY2tGcmFtZUNvdW50ID0gMDtcbiAgICAgIGZ1bmN0aW9uIGNvdW50U3RhY2tzKHRyZWUsIGRlcHRoKSB7XG4gICAgICAgIGxldCBsZWFmID0gdHJ1ZTtcbiAgICAgICAgZm9yIChjb25zdCBmcmFtZUlkIGluIHRyZWUpIHtcbiAgICAgICAgICBpZiAoZnJhbWVJZCAhPT0gJ2lkJykge1xuICAgICAgICAgICAgbGVhZiA9IGNvdW50U3RhY2tzKHRyZWVbZnJhbWVJZF0sIGRlcHRoICsgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChsZWFmKSB7XG4gICAgICAgICAgc3RhY2tGcmFtZUNvdW50ICs9IGRlcHRoO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvdW50U3RhY2tzKHRoaXMucm9vdCwgMCk7XG4gICAgICBjb25zb2xlLmxvZygnc2l6ZSBuZWVkZWQgdG8gc3RvcmUgc3RhY2tzOiAnICsgKHN0YWNrRnJhbWVDb3VudCAqIDQpLnRvU3RyaW5nKCkgKyAnQicpO1xuICAgICAgY29uc3Qgc3RhY2tJZE1hcCA9IG5ldyBBcnJheSh0aGlzLm5vZGVDb3VudCk7XG4gICAgICBjb25zdCBzdGFja0FycmF5ID0gbmV3IEludDMyQXJyYXkoc3RhY2tGcmFtZUNvdW50KTtcbiAgICAgIGxldCBtYXhTdGFja0RlcHRoID0gMDtcbiAgICAgIHN0YWNrRnJhbWVDb3VudCA9IDA7XG4gICAgICBmdW5jdGlvbiBmbGF0dGVuU3RhY2tzSW1wbCh0cmVlLCBzdGFjaykge1xuICAgICAgICBsZXQgY2hpbGRTdGFjaztcbiAgICAgICAgbWF4U3RhY2tEZXB0aCA9IE1hdGgubWF4KG1heFN0YWNrRGVwdGgsIHN0YWNrLmxlbmd0aCk7XG4gICAgICAgIGZvciAoY29uc3QgZnJhbWVJZCBpbiB0cmVlKSB7XG4gICAgICAgICAgaWYgKGZyYW1lSWQgIT09ICdpZCcpIHtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goTnVtYmVyKGZyYW1lSWQpKTtcbiAgICAgICAgICAgIGNoaWxkU3RhY2sgPSBmbGF0dGVuU3RhY2tzSW1wbCh0cmVlW2ZyYW1lSWRdLCBzdGFjayk7XG4gICAgICAgICAgICBzdGFjay5wb3AoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpZCA9IHRyZWUuaWQ7XG4gICAgICAgIGlmIChpZCA8IDAgfHwgaWQgPj0gc3RhY2tJZE1hcC5sZW5ndGggfHwgc3RhY2tJZE1hcFtpZF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93ICdpbnZhbGlkIHN0YWNrIGlkISc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hpbGRTdGFjayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gZWFjaCBjaGlsZCBtdXN0IGhhdmUgb3VyIHN0YWNrIGFzIGEgcHJlZml4LCBzbyBqdXN0IHVzZSB0aGF0XG4gICAgICAgICAgc3RhY2tJZE1hcFtpZF0gPSBjaGlsZFN0YWNrLnN1YmFycmF5KDAsIHN0YWNrLmxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgbmV3U3RhY2sgPSBzdGFja0FycmF5LnN1YmFycmF5KHN0YWNrRnJhbWVDb3VudCwgc3RhY2tGcmFtZUNvdW50ICsgc3RhY2subGVuZ3RoKTtcbiAgICAgICAgICBzdGFja0ZyYW1lQ291bnQgKz0gc3RhY2subGVuZ3RoO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhY2subGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG5ld1N0YWNrW2ldID0gc3RhY2tbaV07XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YWNrSWRNYXBbaWRdID0gbmV3U3RhY2s7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YWNrSWRNYXBbaWRdO1xuICAgICAgfVxuICAgICAgZmxhdHRlblN0YWNrc0ltcGwodGhpcy5yb290LCBbXSk7XG5cbiAgICAgIHJldHVybiBuZXcgc3RhY2tEYXRhKHN0YWNrSWRNYXAsIG1heFN0YWNrRGVwdGgpO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFnZ3JvdyhudW1Sb3dzKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgLy8gZXhwYW5kZXIgSUQgZGVmaW5pdGlvbnNcbiAgY29uc3QgRklFTERfRVhQQU5ERVJfSURfTUlOICAgICAgID0gMHgwMDAwO1xuICBjb25zdCBGSUVMRF9FWFBBTkRFUl9JRF9NQVggICAgICAgPSAweDdmZmY7XG4gIGNvbnN0IFNUQUNLX0VYUEFOREVSX0lEX01JTiAgICAgICA9IDB4ODAwMDtcbiAgY29uc3QgU1RBQ0tfRVhQQU5ERVJfSURfTUFYICAgICAgID0gMHhmZmZmO1xuXG4gIC8vIHVzZWQgZm9yIHJvdy5leHBhbmRlciB3aGljaCByZWZlcmVuY2Ugc3RhdGUuYWN0aXZlRXhwYW5kZXJzICh3aXRoIGZyYW1lIGluZGV4IG1hc2tlZCBpbilcbiAgY29uc3QgSU5WQUxJRF9BQ1RJVkVfRVhQQU5ERVIgICAgID0gLTE7XG4gIGNvbnN0IEFDVElWRV9FWFBBTkRFUl9NQVNLICAgICAgICA9IDB4ZmZmZjtcbiAgY29uc3QgQUNUSVZFX0VYUEFOREVSX0ZSQU1FX1NISUZUID0gMTY7XG5cbiAgLy8gYWdncmVnYXRvciBJRCBkZWZpbml0aW9uc1xuICBjb25zdCBBR0dSRUdBVE9SX0lEX01BWCAgICAgICAgICAgPSAweGZmZmY7XG5cbiAgLy8gYWN0aXZlIGFnZ3JhZ2F0b3JzIGNhbiBoYXZlIHNvcnQgb3JkZXIgY2hhbmdlZCBpbiB0aGUgcmVmZXJlbmNlXG4gIGNvbnN0IEFDVElWRV9BR0dSRUdBVE9SX01BU0sgICAgICA9IDB4ZmZmZjtcbiAgY29uc3QgQUNUSVZFX0FHR1JFR0FUT1JfQVNDX0JJVCAgID0gMHgxMDAwMDtcblxuICAvLyB0cmVlIG5vZGUgc3RhdGUgZGVmaW5pdGlvbnNcbiAgY29uc3QgTk9ERV9FWFBBTkRFRF9CSVQgICAgICAgICAgID0gMHgwMDAxOyAvLyB0aGlzIHJvdyBpcyBleHBhbmRlZFxuICBjb25zdCBOT0RFX1JFQUdHUkVHQVRFX0JJVCAgICAgICAgPSAweDAwMDI7IC8vIGNoaWxkcmVuIG5lZWQgYWdncmVnYXRlc1xuICBjb25zdCBOT0RFX1JFT1JERVJfQklUICAgICAgICAgICAgPSAweDAwMDQ7IC8vIGNoaWxkcmVuIG5lZWQgdG8gYmUgc29ydGVkXG4gIGNvbnN0IE5PREVfUkVQT1NJVElPTl9CSVQgICAgICAgICA9IDB4MDAwODsgLy8gY2hpbGRyZW4gbmVlZCBwb3NpdGlvblxuICBjb25zdCBOT0RFX0lOREVOVF9TSElGVCAgICAgICAgICAgPSAxNjtcblxuICBmdW5jdGlvbiBjYWxsZWVGcmFtZUlkR2V0dGVyKHN0YWNrLCBkZXB0aCkge1xuICAgIHJldHVybiBzdGFja1tkZXB0aF07XG4gIH1cblxuICBmdW5jdGlvbiBjYWxsZXJGcmFtZUlkR2V0dGVyKHN0YWNrLCBkZXB0aCkge1xuICAgIHJldHVybiBzdGFja1tzdGFjay5sZW5ndGggLSBkZXB0aCAtIDFdO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlU3RhY2tDb21wYXJlcnMoc3RhY2tHZXR0ZXIsIGZyYW1lSWRHZXR0ZXIsIG1heFN0YWNrRGVwdGgpIHtcbiAgICBjb25zdCBjb21wYXJlcnMgPSBuZXcgQXJyYXkobWF4U3RhY2tEZXB0aCk7XG4gICAgZm9yIChsZXQgZGVwdGggPSAwOyBkZXB0aCA8IG1heFN0YWNrRGVwdGg7IGRlcHRoKyspIHtcbiAgICAgIGNvbnN0IGNhcHR1cmVEZXB0aCA9IGRlcHRoOyAvLyBOQjogdG8gY2FwdHVyZSBkZXB0aCBwZXIgbG9vcCBpdGVyYXRpb25cbiAgICAgIGNvbXBhcmVyc1tkZXB0aF0gPSBmdW5jdGlvbiBjYWxsZWVTdGFja0NvbXBhcmVyKHJvd0EsIHJvd0IpIHtcbiAgICAgICAgY29uc3QgYSA9IHN0YWNrR2V0dGVyKHJvd0EpO1xuICAgICAgICBjb25zdCBiID0gc3RhY2tHZXR0ZXIocm93Qik7XG4gICAgICAgIC8vIE5COiB3ZSBwdXQgdGhlIHN0YWNrcyB0aGF0IGFyZSB0b28gc2hvcnQgYXQgdGhlIHRvcCxcbiAgICAgICAgLy8gc28gdGhleSBjYW4gYmUgZ3JvdXBlZCBpbnRvIHRoZSAnPGV4Y2x1c2l2ZT4nIGJ1Y2tldFxuICAgICAgICBpZiAoYS5sZW5ndGggPD0gY2FwdHVyZURlcHRoICYmIGIubGVuZ3RoIDw9IGNhcHR1cmVEZXB0aCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH0gZWxzZSBpZiAoYS5sZW5ndGggPD0gY2FwdHVyZURlcHRoKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH0gZWxzZSBpZiAoYi5sZW5ndGggPD0gY2FwdHVyZURlcHRoKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnJhbWVJZEdldHRlcihhLCBjYXB0dXJlRGVwdGgpIC0gZnJhbWVJZEdldHRlcihiLCBjYXB0dXJlRGVwdGgpO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBhcmVycztcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVRyZWVOb2RlKHBhcmVudCwgbGFiZWwsIGluZGljZXMsIGV4cGFuZGVyKSB7XG4gICAgY29uc3QgaW5kZW50ID0gcGFyZW50ID09PSBudWxsID8gMCA6IChwYXJlbnQuc3RhdGUgPj4+IE5PREVfSU5ERU5UX1NISUZUKSArIDE7XG4gICAgY29uc3Qgc3RhdGUgPSBOT0RFX1JFUE9TSVRJT05fQklUIHxcbiAgICAgIE5PREVfUkVBR0dSRUdBVEVfQklUIHxcbiAgICAgIE5PREVfUkVPUkRFUl9CSVQgfFxuICAgICAgKGluZGVudCA8PCBOT0RFX0lOREVOVF9TSElGVCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmVudDogcGFyZW50LCAgICAgLy8gbnVsbCBpZiByb290XG4gICAgICBjaGlsZHJlbjogbnVsbCwgICAgIC8vIGFycmF5IG9mIGNoaWxkcmVuIG5vZGVzXG4gICAgICBsYWJlbDogbGFiZWwsICAgICAgIC8vIHN0cmluZyB0byBzaG93IGluIFVJXG4gICAgICBpbmRpY2VzOiBpbmRpY2VzLCAgIC8vIHJvdyBpbmRpY2VzIHVuZGVyIHRoaXMgbm9kZVxuICAgICAgYWdncmVnYXRlczogbnVsbCwgICAvLyByZXN1bHQgb2YgYWdncmVnYXRlIG9uIGluZGljZXNcbiAgICAgIGV4cGFuZGVyOiBleHBhbmRlciwgLy8gaW5kZXggaW50byBzdGF0ZS5hY3RpdmVFeHBhbmRlcnNcbiAgICAgIHRvcDogMCwgICAgICAgICAgICAgLy8geSBwb3NpdGlvbiBvZiB0b3Agcm93IChpbiByb3dzKVxuICAgICAgaGVpZ2h0OiAxLCAgICAgICAgICAvLyBudW1iZXIgb2Ygcm93cyBpbmNsdWRpbmcgY2hpbGRyZW5cbiAgICAgIHN0YXRlOiBzdGF0ZSwgICAgICAgLy8gc2VlIE5PREVfKiBkZWZpbml0aW9ucyBhYm92ZVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBub1NvcnRPcmRlcihhLCBiKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb25zdCBpbmRpY2VzID0gbmV3IEludDMyQXJyYXkobnVtUm93cyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtUm93czsgaSsrKSB7XG4gICAgaW5kaWNlc1tpXSA9IGk7XG4gIH1cblxuICBjb25zdCBzdGF0ZSA9IHtcbiAgICBmaWVsZEV4cGFuZGVyczogW10sICAgICAvLyB0cmVlIGV4cGFuZGVycyB0aGF0IGV4cGFuZCBvbiBzaW1wbGUgdmFsdWVzXG4gICAgc3RhY2tFeHBhbmRlcnM6IFtdLCAgICAgLy8gdHJlZSBleHBhbmRlcnMgdGhhdCBleHBhbmQgc3RhY2tzXG4gICAgYWN0aXZlRXhwYW5kZXJzOiBbXSwgICAgLy8gaW5kZXggaW50byBmaWVsZCBvciBzdGFjayBleHBhbmRlcnMsIGhpZXJhcmNoeSBvZiB0cmVlXG4gICAgYWdncmVnYXRvcnM6IFtdLCAgICAgICAgLy8gYWxsIGF2YWlsYWJsZSBhZ2dyZWdhdG9ycywgbWlnaHQgbm90IGJlIHVzZWRcbiAgICBhY3RpdmVBZ2dyZWdhdG9yczogW10sICAvLyBpbmRleCBpbnRvIGFnZ3JlZ2F0b3JzLCB0byBhY3R1YWxseSBjb21wdXRlXG4gICAgc29ydGVyOiBub1NvcnRPcmRlciwgICAgLy8gY29tcGFyZSBmdW5jdGlvbiB0aGF0IHVzZXMgc29ydE9yZGVyIHRvIHNvcnQgcm93LmNoaWxkcmVuXG4gICAgcm9vdDogY3JlYXRlVHJlZU5vZGUobnVsbCwgJzxyb290PicsIGluZGljZXMsIElOVkFMSURfQUNUSVZFX0VYUEFOREVSKSxcbiAgfTtcblxuICBmdW5jdGlvbiBldmFsdWF0ZUFnZ3JlZ2F0ZShyb3cpIHtcbiAgICBjb25zdCBhY3RpdmVBZ2dyZWdhdG9ycyA9IHN0YXRlLmFjdGl2ZUFnZ3JlZ2F0b3JzO1xuICAgIGNvbnN0IGFnZ3JlZ2F0ZXMgPSBuZXcgQXJyYXkoYWN0aXZlQWdncmVnYXRvcnMubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGFjdGl2ZUFnZ3JlZ2F0b3JzLmxlbmd0aDsgaisrKSB7XG4gICAgICBjb25zdCBhZ2dyZWdhdG9yID0gc3RhdGUuYWdncmVnYXRvcnNbYWN0aXZlQWdncmVnYXRvcnNbal1dO1xuICAgICAgYWdncmVnYXRlc1tqXSA9IGFnZ3JlZ2F0b3IuYWdncmVnYXRvcihyb3cuaW5kaWNlcyk7XG4gICAgfVxuICAgIHJvdy5hZ2dyZWdhdGVzID0gYWdncmVnYXRlcztcbiAgICByb3cuc3RhdGUgfD0gTk9ERV9SRUFHR1JFR0FURV9CSVQ7XG4gIH1cblxuICBmdW5jdGlvbiBldmFsdWF0ZUFnZ3JlZ2F0ZXMocm93KSB7XG4gICAgaWYgKChyb3cuc3RhdGUgJiBOT0RFX0VYUEFOREVEX0JJVCkgIT09IDApIHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gcm93LmNoaWxkcmVuO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBldmFsdWF0ZUFnZ3JlZ2F0ZShjaGlsZHJlbltpXSk7XG4gICAgICB9XG4gICAgICByb3cuc3RhdGUgfD0gTk9ERV9SRU9SREVSX0JJVDtcbiAgICB9XG4gICAgcm93LnN0YXRlIF49IE5PREVfUkVBR0dSRUdBVEVfQklUO1xuICB9XG5cbiAgZnVuY3Rpb24gZXZhbHVhdGVPcmRlcihyb3cpIHtcbiAgICBpZiAoKHJvdy5zdGF0ZSAmIE5PREVfRVhQQU5ERURfQklUKSAhPT0gMCkge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSByb3cuY2hpbGRyZW47XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgIGNoaWxkLnN0YXRlIHw9IE5PREVfUkVPUkRFUl9CSVQ7XG4gICAgICB9XG4gICAgICBjaGlsZHJlbi5zb3J0KHN0YXRlLnNvcnRlcik7XG4gICAgICByb3cuc3RhdGUgfD0gTk9ERV9SRVBPU0lUSU9OX0JJVDtcbiAgICB9XG4gICAgcm93LnN0YXRlIF49IE5PREVfUkVPUkRFUl9CSVQ7XG4gIH1cblxuICBmdW5jdGlvbiBldmFsdWF0ZVBvc2l0aW9uKHJvdykge1xuICAgIGlmICgocm93LnN0YXRlICYgTk9ERV9FWFBBTkRFRF9CSVQpICE9PSAwKSB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHJvdy5jaGlsZHJlbjtcbiAgICAgIGxldCBjaGlsZFRvcCA9IHJvdy50b3AgKyAxO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICBpZiAoY2hpbGQudG9wICE9PSBjaGlsZFRvcCkge1xuICAgICAgICAgIGNoaWxkLnRvcCA9IGNoaWxkVG9wO1xuICAgICAgICAgIGNoaWxkLnN0YXRlIHw9IE5PREVfUkVQT1NJVElPTl9CSVQ7XG4gICAgICAgIH1cbiAgICAgICAgY2hpbGRUb3AgKz0gY2hpbGQuaGVpZ2h0O1xuICAgICAgfVxuICAgIH1cbiAgICByb3cuc3RhdGUgXj0gTk9ERV9SRVBPU0lUSU9OX0JJVDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFJvd3NJbXBsKHJvdywgdG9wLCBoZWlnaHQsIHJlc3VsdCkge1xuICAgIGlmICgocm93LnN0YXRlICYgTk9ERV9SRUFHR1JFR0FURV9CSVQpICE9PSAwKSB7XG4gICAgICBldmFsdWF0ZUFnZ3JlZ2F0ZXMocm93KTtcbiAgICB9XG4gICAgaWYgKChyb3cuc3RhdGUgJiBOT0RFX1JFT1JERVJfQklUKSAhPT0gMCkge1xuICAgICAgZXZhbHVhdGVPcmRlcihyb3cpO1xuICAgIH1cbiAgICBpZiAoKHJvdy5zdGF0ZSAmIE5PREVfUkVQT1NJVElPTl9CSVQpICE9PSAwKSB7XG4gICAgICBldmFsdWF0ZVBvc2l0aW9uKHJvdyk7XG4gICAgfVxuXG4gICAgaWYgKHJvdy50b3AgPj0gdG9wICYmIHJvdy50b3AgPCB0b3AgKyBoZWlnaHQpIHtcbiAgICAgIGlmIChyZXN1bHRbcm93LnRvcCAtIHRvcF0gIT0gbnVsbCkge1xuICAgICAgICB0aHJvdyAnZ2V0Um93cyBwdXQgbW9yZSB0aGFuIG9uZSByb3cgYXQgcG9zaXRpb24gJyArIHJvdy50b3AgKyAnIGludG8gcmVzdWx0JztcbiAgICAgIH1cbiAgICAgIHJlc3VsdFtyb3cudG9wIC0gdG9wXSA9IHJvdztcbiAgICB9XG4gICAgaWYgKChyb3cuc3RhdGUgJiBOT0RFX0VYUEFOREVEX0JJVCkgIT09IDApIHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gcm93LmNoaWxkcmVuO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICBpZiAoY2hpbGQudG9wIDwgdG9wICsgaGVpZ2h0ICYmIHRvcCA8IGNoaWxkLnRvcCArIGNoaWxkLmhlaWdodCkge1xuICAgICAgICAgIGdldFJvd3NJbXBsKGNoaWxkLCB0b3AsIGhlaWdodCwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUhlaWdodChyb3csIGhlaWdodENoYW5nZSkge1xuICAgIHdoaWxlIChyb3cgIT09IG51bGwpIHtcbiAgICAgIHJvdy5oZWlnaHQgKz0gaGVpZ2h0Q2hhbmdlO1xuICAgICAgcm93LnN0YXRlIHw9IE5PREVfUkVQT1NJVElPTl9CSVQ7XG4gICAgICByb3cgPSByb3cucGFyZW50O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZENoaWxkcmVuV2l0aEZpZWxkRXhwYW5kZXIocm93LCBleHBhbmRlciwgbmV4dEFjdGl2ZUluZGV4KSB7XG4gICAgY29uc3Qgcm93SW5kaWNlcyA9IHJvdy5pbmRpY2VzO1xuICAgIGNvbnN0IGNvbXBhcmVyID0gZXhwYW5kZXIuY29tcGFyZXI7XG4gICAgcm93SW5kaWNlcy5zb3J0KGNvbXBhcmVyKTtcbiAgICBsZXQgYmVnaW4gPSAwO1xuICAgIGxldCBlbmQgPSAxO1xuICAgIHJvdy5jaGlsZHJlbiA9IFtdO1xuICAgIHdoaWxlIChlbmQgPCByb3dJbmRpY2VzLmxlbmd0aCkge1xuICAgICAgaWYgKGNvbXBhcmVyKHJvd0luZGljZXNbYmVnaW5dLCByb3dJbmRpY2VzW2VuZF0pICE9PSAwKSB7XG4gICAgICAgIHJvdy5jaGlsZHJlbi5wdXNoKGNyZWF0ZVRyZWVOb2RlKFxuICAgICAgICAgIHJvdyxcbiAgICAgICAgICBleHBhbmRlci5uYW1lICsgJzogJyArIGV4cGFuZGVyLmZvcm1hdHRlcihyb3dJbmRpY2VzW2JlZ2luXSksXG4gICAgICAgICAgcm93SW5kaWNlcy5zdWJhcnJheShiZWdpbiwgZW5kKSxcbiAgICAgICAgICBuZXh0QWN0aXZlSW5kZXgpKTtcbiAgICAgICAgYmVnaW4gPSBlbmQ7XG4gICAgICB9XG4gICAgICBlbmQrKztcbiAgICB9XG4gICAgcm93LmNoaWxkcmVuLnB1c2goY3JlYXRlVHJlZU5vZGUoXG4gICAgICByb3csXG4gICAgICBleHBhbmRlci5uYW1lICsgJzogJyArIGV4cGFuZGVyLmZvcm1hdHRlcihyb3dJbmRpY2VzW2JlZ2luXSksXG4gICAgICByb3dJbmRpY2VzLnN1YmFycmF5KGJlZ2luLCBlbmQpLFxuICAgICAgbmV4dEFjdGl2ZUluZGV4KSk7XG4gIH1cblxuICBmdW5jdGlvbiBhZGRDaGlsZHJlbldpdGhTdGFja0V4cGFuZGVyKHJvdywgZXhwYW5kZXIsIGFjdGl2ZUluZGV4LCBkZXB0aCwgbmV4dEFjdGl2ZUluZGV4KSB7XG4gICAgY29uc3Qgcm93SW5kaWNlcyA9IHJvdy5pbmRpY2VzO1xuICAgIGNvbnN0IHN0YWNrR2V0dGVyID0gZXhwYW5kZXIuc3RhY2tHZXR0ZXI7XG4gICAgY29uc3QgZnJhbWVJZEdldHRlciA9IGV4cGFuZGVyLmZyYW1lSWRHZXR0ZXI7XG4gICAgY29uc3QgZnJhbWVHZXR0ZXIgPSBleHBhbmRlci5mcmFtZUdldHRlcjtcbiAgICBjb25zdCBjb21wYXJlciA9IGV4cGFuZGVyLmNvbXBhcmVyc1tkZXB0aF07XG4gICAgY29uc3QgZXhwYW5kTmV4dEZyYW1lID0gYWN0aXZlSW5kZXggfCAoKGRlcHRoICsgMSkgPDwgQUNUSVZFX0VYUEFOREVSX0ZSQU1FX1NISUZUKTtcbiAgICByb3dJbmRpY2VzLnNvcnQoY29tcGFyZXIpO1xuICAgIGxldCBjb2x1bW5OYW1lID0gJyc7XG4gICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICBjb2x1bW5OYW1lID0gZXhwYW5kZXIubmFtZSArICc6ICc7XG4gICAgfVxuXG4gICAgLy8gcHV0IGFsbCB0aGUgdG9vLXNob3J0IHN0YWNrcyB1bmRlciA8ZXhjbHVzaXZlPlxuICAgIGxldCBiZWdpbiA9IDA7XG4gICAgbGV0IGJlZ2luU3RhY2sgPSBudWxsO1xuICAgIHJvdy5jaGlsZHJlbiA9IFtdO1xuICAgIHdoaWxlIChiZWdpbiA8IHJvd0luZGljZXMubGVuZ3RoKSB7XG4gICAgICBiZWdpblN0YWNrID0gc3RhY2tHZXR0ZXIocm93SW5kaWNlc1tiZWdpbl0pO1xuICAgICAgaWYgKGJlZ2luU3RhY2subGVuZ3RoID4gZGVwdGgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBiZWdpbisrO1xuICAgIH1cbiAgICBpZiAoYmVnaW4gPiAwKSB7XG4gICAgICByb3cuY2hpbGRyZW4ucHVzaChjcmVhdGVUcmVlTm9kZShcbiAgICAgICAgcm93LFxuICAgICAgICBjb2x1bW5OYW1lICsgJzxleGNsdXNpdmU+JyxcbiAgICAgICAgcm93SW5kaWNlcy5zdWJhcnJheSgwLCBiZWdpbiksXG4gICAgICAgIG5leHRBY3RpdmVJbmRleCkpO1xuICAgIH1cbiAgICAvLyBhZ2dyZWdhdGUgdGhlIHJlc3QgdW5kZXIgZnJhbWVzXG4gICAgaWYgKGJlZ2luIDwgcm93SW5kaWNlcy5sZW5ndGgpIHtcbiAgICAgIGxldCBlbmQgPSBiZWdpbiArIDE7XG4gICAgICB3aGlsZSAoZW5kIDwgcm93SW5kaWNlcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZW5kU3RhY2sgPSBzdGFja0dldHRlcihyb3dJbmRpY2VzW2VuZF0pO1xuICAgICAgICBpZiAoZnJhbWVJZEdldHRlcihiZWdpblN0YWNrLCBkZXB0aCkgIT09IGZyYW1lSWRHZXR0ZXIoZW5kU3RhY2ssIGRlcHRoKSkge1xuICAgICAgICAgIHJvdy5jaGlsZHJlbi5wdXNoKGNyZWF0ZVRyZWVOb2RlKFxuICAgICAgICAgICAgcm93LFxuICAgICAgICAgICAgY29sdW1uTmFtZSArIGZyYW1lR2V0dGVyKGZyYW1lSWRHZXR0ZXIoYmVnaW5TdGFjaywgZGVwdGgpKSxcbiAgICAgICAgICAgIHJvd0luZGljZXMuc3ViYXJyYXkoYmVnaW4sIGVuZCksXG4gICAgICAgICAgICBleHBhbmROZXh0RnJhbWUpKTtcbiAgICAgICAgICBiZWdpbiA9IGVuZDtcbiAgICAgICAgICBiZWdpblN0YWNrID0gZW5kU3RhY2s7XG4gICAgICAgIH1cbiAgICAgICAgZW5kKys7XG4gICAgICB9XG4gICAgICByb3cuY2hpbGRyZW4ucHVzaChjcmVhdGVUcmVlTm9kZShcbiAgICAgICAgcm93LFxuICAgICAgICBjb2x1bW5OYW1lICsgZnJhbWVHZXR0ZXIoZnJhbWVJZEdldHRlcihiZWdpblN0YWNrLCBkZXB0aCkpLFxuICAgICAgICByb3dJbmRpY2VzLnN1YmFycmF5KGJlZ2luLCBlbmQpLFxuICAgICAgICBleHBhbmROZXh0RnJhbWUpKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjb250cmFjdFJvdyhyb3cpIHtcbiAgICAgIGlmICgocm93LnN0YXRlICYgTk9ERV9FWFBBTkRFRF9CSVQpID09PSAwKSB7XG4gICAgICAgIHRocm93ICdjYW4gbm90IGNvbnRyYWN0IHJvdywgYWxyZWFkeSBjb250cmFjdGVkJztcbiAgICAgIH1cbiAgICAgIHJvdy5zdGF0ZSBePSBOT0RFX0VYUEFOREVEX0JJVDtcbiAgICAgIGNvbnN0IGhlaWdodENoYW5nZSA9IDEgLSByb3cuaGVpZ2h0O1xuICAgICAgdXBkYXRlSGVpZ2h0KHJvdywgaGVpZ2h0Q2hhbmdlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBydW5lRXhwYW5kZXJzKHJvdywgb2xkRXhwYW5kZXIsIG5ld0V4cGFuZGVyKSB7XG4gICAgcm93LnN0YXRlIHw9IE5PREVfUkVQT1NJVElPTl9CSVQ7XG4gICAgaWYgKHJvdy5leHBhbmRlciA9PT0gb2xkRXhwYW5kZXIpIHtcbiAgICAgIHJvdy5zdGF0ZSB8PSBOT0RFX1JFQUdHUkVHQVRFX0JJVCB8IE5PREVfUkVPUkRFUl9CSVQgfCBOT0RFX1JFUE9TSVRJT05fQklUO1xuICAgICAgaWYgKChyb3cuc3RhdGUgJiBOT0RFX0VYUEFOREVEX0JJVCkgIT09IDApIHtcbiAgICAgICAgY29udHJhY3RSb3cocm93KTtcbiAgICAgIH1cbiAgICAgIHJvdy5jaGlsZHJlbiA9IG51bGw7XG4gICAgICByb3cuZXhwYW5kZXIgPSBuZXdFeHBhbmRlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgcm93LnN0YXRlIHw9IE5PREVfUkVQT1NJVElPTl9CSVQ7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHJvdy5jaGlsZHJlbjtcbiAgICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICAgIHBydW5lRXhwYW5kZXJzKGNoaWxkLCBvbGRFeHBhbmRlciwgbmV3RXhwYW5kZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhZGRGaWVsZEV4cGFuZGVyOiBmdW5jdGlvbiBhZGRGaWVsZEV4cGFuZGVyKG5hbWUsIGZvcm1hdHRlciwgY29tcGFyZXIpIHtcbiAgICAgIGlmIChGSUVMRF9FWFBBTkRFUl9JRF9NSU4gKyBzdGF0ZS5maWVsZEV4cGFuZGVycy5sZW5ndGggPj0gRklFTERfRVhQQU5ERVJfSURfTUFYKSB7XG4gICAgICAgIHRocm93ICd0b28gbWFueSBmaWVsZCBleHBhbmRlcnMhJztcbiAgICAgIH1cbiAgICAgIHN0YXRlLmZpZWxkRXhwYW5kZXJzLnB1c2goe1xuICAgICAgICBuYW1lOiBuYW1lLCAvLyBuYW1lIGZvciBjb2x1bW5cbiAgICAgICAgZm9ybWF0dGVyOiBmb3JtYXR0ZXIsIC8vIHJvdyBpbmRleCAtPiBkaXNwbGF5IHN0cmluZ1xuICAgICAgICBjb21wYXJlcjogY29tcGFyZXIsIC8vIGNvbXBhcmVzIGJ5IHR3byByb3cgaW5kaWNlc1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gRklFTERfRVhQQU5ERVJfSURfTUlOICsgc3RhdGUuZmllbGRFeHBhbmRlcnMubGVuZ3RoIC0gMTtcbiAgICB9LFxuICAgIGFkZENhbGxlZVN0YWNrRXhwYW5kZXI6IGZ1bmN0aW9uIGFkZENhbGxlZVN0YWNrRXhwYW5kZXIobmFtZSwgbWF4U3RhY2tEZXB0aCwgc3RhY2tHZXR0ZXIsIGZyYW1lR2V0dGVyKSB7XG4gICAgICBpZiAoU1RBQ0tfRVhQQU5ERVJfSURfTUlOICsgc3RhdGUuZmllbGRFeHBhbmRlcnMubGVuZ3RoID49IFNUQUNLX0VYUEFOREVSX0lEX01BWCkge1xuICAgICAgICB0aHJvdyAndG9vIG1hbnkgc3RhY2sgZXhwYW5kZXJzISc7XG4gICAgICB9XG4gICAgICBzdGF0ZS5zdGFja0V4cGFuZGVycy5wdXNoKHtcbiAgICAgICAgbmFtZTogbmFtZSwgLy8gbmFtZSBmb3IgY29sdW1uXG4gICAgICAgIHN0YWNrR2V0dGVyOiBzdGFja0dldHRlciwgLy8gcm93IGluZGV4IC0+IHN0YWNrIGFycmF5XG4gICAgICAgIGNvbXBhcmVyczogY3JlYXRlU3RhY2tDb21wYXJlcnMoc3RhY2tHZXR0ZXIsIGNhbGxlZUZyYW1lSWRHZXR0ZXIsIG1heFN0YWNrRGVwdGgpLCAgLy8gZGVwdGggLT4gY29tcGFyZXJcbiAgICAgICAgZnJhbWVJZEdldHRlcjogY2FsbGVlRnJhbWVJZEdldHRlciwgLy8gKHN0YWNrLCBkZXB0aCkgLT4gc3RyaW5nIGlkXG4gICAgICAgIGZyYW1lR2V0dGVyOiBmcmFtZUdldHRlcixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFNUQUNLX0VYUEFOREVSX0lEX01JTiArIHN0YXRlLnN0YWNrRXhwYW5kZXJzLmxlbmd0aCAtIDE7XG4gICAgfSxcbiAgICBhZGRDYWxsZXJTdGFja0V4cGFuZGVyOiBmdW5jdGlvbiBhZGRDYWxsZXJTdGFja0V4cGFuZGVyKG5hbWUsIG1heFN0YWNrRGVwdGgsIHN0YWNrR2V0dGVyLCBmcmFtZUdldHRlcikge1xuICAgICAgaWYgKFNUQUNLX0VYUEFOREVSX0lEX01JTiArIHN0YXRlLmZpZWxkRXhwYW5kZXJzLmxlbmd0aCA+PSBTVEFDS19FWFBBTkRFUl9JRF9NQVgpIHtcbiAgICAgICAgdGhyb3cgJ3RvbyBtYW55IHN0YWNrIGV4cGFuZGVycyEnO1xuICAgICAgfVxuICAgICAgc3RhdGUuc3RhY2tFeHBhbmRlcnMucHVzaCh7XG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIHN0YWNrR2V0dGVyOiBzdGFja0dldHRlcixcbiAgICAgICAgY29tcGFyZXJzOiBjcmVhdGVTdGFja0NvbXBhcmVycyhzdGFja0dldHRlciwgY2FsbGVyRnJhbWVJZEdldHRlciwgbWF4U3RhY2tEZXB0aCksXG4gICAgICAgIGZyYW1lSWRHZXR0ZXI6IGNhbGxlckZyYW1lSWRHZXR0ZXIsXG4gICAgICAgIGZyYW1lR2V0dGVyOiBmcmFtZUdldHRlcixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFNUQUNLX0VYUEFOREVSX0lEX01JTiArIHN0YXRlLnN0YWNrRXhwYW5kZXJzLmxlbmd0aCAtIDE7XG4gICAgfSxcbiAgICBnZXRFeHBhbmRlcnM6IGZ1bmN0aW9uIGdldEV4cGFuZGVycygpIHtcbiAgICAgIGNvbnN0IGV4cGFuZGVycyA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGF0ZS5maWVsZEV4cGFuZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBleHBhbmRlcnMucHVzaChGSUVMRF9FWFBBTkRFUl9JRF9NSU4gKyBpKTtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhdGUuc3RhY2tFeHBhbmRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZXhwYW5kZXJzLnB1c2goU1RBQ0tfRVhQQU5ERVJfSURfTUlOICsgaSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXhwYW5kZXJzO1xuICAgIH0sXG4gICAgZ2V0RXhwYW5kZXJOYW1lOiBmdW5jdGlvbiBnZXRFeHBhbmRlck5hbWUoaWQpIHtcbiAgICAgIGlmIChpZCA+PSBGSUVMRF9FWFBBTkRFUl9JRF9NSU4gJiYgaWQgPD0gRklFTERfRVhQQU5ERVJfSURfTUFYKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZS5maWVsZEV4cGFuZGVyc1tpZCAtIEZJRUxEX0VYUEFOREVSX0lEX01JTl0ubmFtZTtcbiAgICAgIH0gZWxzZSBpZiAoaWQgPj0gU1RBQ0tfRVhQQU5ERVJfSURfTUlOICYmIGlkIDw9IFNUQUNLX0VYUEFOREVSX0lEX01BWCkge1xuICAgICAgICByZXR1cm4gc3RhdGUuc3RhY2tFeHBhbmRlcnNbaWQgLSBTVEFDS19FWFBBTkRFUl9JRF9NSU5dLm5hbWU7XG4gICAgICB9XG4gICAgICB0aHJvdyAnVW5rbm93biBleHBhbmRlciBJRCAnICsgaWQudG9TdHJpbmcoKTtcbiAgICB9LFxuICAgIHNldEFjdGl2ZUV4cGFuZGVyczogZnVuY3Rpb24gc2V0QWN0aXZlRXhwYW5kZXJzKGlkcykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaWQgPSBpZHNbaV07XG4gICAgICAgIGlmIChpZCA+PSBGSUVMRF9FWFBBTkRFUl9JRF9NSU4gJiYgaWQgPD0gRklFTERfRVhQQU5ERVJfSURfTUFYKSB7XG4gICAgICAgICAgaWYgKGlkIC0gRklFTERfRVhQQU5ERVJfSURfTUlOID49IHN0YXRlLmZpZWxkRXhwYW5kZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgJ2ZpZWxkIGV4cGFuZGVyIGZvciBpZCAnICsgaWQudG9TdHJpbmcoKSArICcgZG9lcyBub3QgZXhpc3QhJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaWQgPj0gU1RBQ0tfRVhQQU5ERVJfSURfTUlOICYmIGlkIDw9IFNUQUNLX0VYUEFOREVSX0lEX01BWCkge1xuICAgICAgICAgIGlmIChpZCAtIFNUQUNLX0VYUEFOREVSX0lEX01JTiA+PSBzdGF0ZS5zdGFja0V4cGFuZGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93ICdzdGFjayBleHBhbmRlciBmb3IgaWQgJyArIGlkLnRvU3RyaW5nKCkgKyAnIGRvZXMgbm90IGV4aXN0ISc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoc3RhdGUuYWN0aXZlRXhwYW5kZXJzLmxlbmd0aCA8PSBpKSB7XG4gICAgICAgICAgcHJ1bmVFeHBhbmRlcnMoc3RhdGUucm9vdCwgSU5WQUxJRF9BQ1RJVkVfRVhQQU5ERVIsIGkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKGlkc1tpXSAhPT0gc3RhdGUuYWN0aXZlRXhwYW5kZXJzW2ldKSB7XG4gICAgICAgICAgcHJ1bmVFeHBhbmRlcnMoc3RhdGUucm9vdCwgaSwgaSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFRPRE86IGlmIGlkcyBpcyBwcmVmaXggb2YgYWN0aXZlRXhwYW5kZXJzLCB3ZSBuZWVkIHRvIG1ha2UgYW4gZXhwYW5kZXIgaW52YWxpZFxuICAgICAgc3RhdGUuYWN0aXZlRXhwYW5kZXJzID0gaWRzLnNsaWNlKCk7XG4gICAgfSxcbiAgICBnZXRBY3RpdmVFeHBhbmRlcnM6IGZ1bmN0aW9uIGdldEFjdGl2ZUV4cGFuZGVycygpIHtcbiAgICAgIHJldHVybiBzdGF0ZS5hY3RpdmVFeHBhbmRlcnMuc2xpY2UoKTtcbiAgICB9LFxuICAgIGFkZEFnZ3JlZ2F0b3I6IGZ1bmN0aW9uIGFkZEFnZ3JlZ2F0b3IobmFtZSwgYWdncmVnYXRvciwgZm9ybWF0dGVyLCBzb3J0ZXIpIHtcbiAgICAgIGlmIChzdGF0ZS5hZ2dyZWdhdG9ycy5sZW5ndGggPj0gQUdHUkVHQVRPUl9JRF9NQVgpIHtcbiAgICAgICAgdGhyb3cgJ3RvbyBtYW55IGFnZ3JlZ2F0b3JzISc7XG4gICAgICB9XG4gICAgICBzdGF0ZS5hZ2dyZWdhdG9ycy5wdXNoKHtcbiAgICAgICAgbmFtZTogbmFtZSwgICAgICAgICAgICAgLy8gbmFtZSBmb3IgY29sdW1uXG4gICAgICAgIGFnZ3JlZ2F0b3I6IGFnZ3JlZ2F0b3IsIC8vIGluZGV4IGFycmF5IC0+IGFnZ3JlZ2F0ZSB2YWx1ZVxuICAgICAgICBmb3JtYXR0ZXI6IGZvcm1hdHRlciwgICAvLyBhZ2dyZWdhdGUgdmFsdWUgLT4gZGlzcGxheSBzdHJpbmdcbiAgICAgICAgc29ydGVyOiBzb3J0ZXIsICAgICAgICAgLy8gY29tcGFyZSB0d28gYWdncmVnYXRlIHZhbHVlc1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gc3RhdGUuYWdncmVnYXRvcnMubGVuZ3RoIC0gMTtcbiAgICB9LFxuICAgIGdldEFnZ3JlZ2F0b3JzOiBmdW5jdGlvbiBnZXRBZ2dyZWdhdG9ycygpIHtcbiAgICAgIGNvbnN0IGFnZ3JlZ2F0b3JzID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YXRlLmFnZ3JlZ2F0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFnZ3JlZ2F0b3JzLnB1c2goaSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWdncmVnYXRvcnM7XG4gICAgfSxcbiAgICBnZXRBZ2dyZWdhdG9yTmFtZTogZnVuY3Rpb24gZ2V0QWdncmVnYXRvck5hbWUoaWQpIHtcbiAgICAgIHJldHVybiBzdGF0ZS5hZ2dyZWdhdG9yc1tpZCAmIEFDVElWRV9BR0dSRUdBVE9SX01BU0tdLm5hbWU7XG4gICAgfSxcbiAgICBzZXRBY3RpdmVBZ2dyZWdhdG9yczogZnVuY3Rpb24gc2V0QWN0aXZlQWdncmVnYXRvcnMoaWRzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBpZCA9IGlkc1tpXSAmIEFDVElWRV9BR0dSRUdBVE9SX01BU0s7XG4gICAgICAgIGlmIChpZCA8IDAgfHwgaWQgPiBzdGF0ZS5hZ2dyZWdhdG9ycy5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyAnYWdncmVnYXRvciBpZCAnICsgaWQudG9TdHJpbmcoKSArICcgbm90IHZhbGlkJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RhdGUuYWN0aXZlQWdncmVnYXRvcnMgPSBpZHMuc2xpY2UoKTtcbiAgICAgIC8vIE5COiBldmFsdWF0ZSByb290IGhlcmUgYmVjYXVzZSBkaXJ0eSBiaXQgaXMgZm9yIGNoaWxkcmVuXG4gICAgICAvLyBzbyBzb21lb25lIGhhcyB0byBzdGFydCB3aXRoIHJvb3QsIGFuZCBpdCBtaWdodCBhcyB3ZWxsIGJlIHJpZ2h0IGF3YXlcbiAgICAgIGV2YWx1YXRlQWdncmVnYXRlKHN0YXRlLnJvb3QpO1xuICAgICAgbGV0IHNvcnRlciA9IG5vU29ydE9yZGVyO1xuICAgICAgZm9yIChsZXQgaSA9IGlkcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCBhc2NlbmRpbmcgPSAoaWRzW2ldICYgQUNUSVZFX0FHR1JFR0FUT1JfQVNDX0JJVCkgIT09IDA7XG4gICAgICAgIGNvbnN0IGlkID0gaWRzW2ldICYgQUNUSVZFX0FHR1JFR0FUT1JfTUFTSztcbiAgICAgICAgY29uc3QgY29tcGFyZXIgPSBzdGF0ZS5hZ2dyZWdhdG9yc1tpZF0uc29ydGVyO1xuICAgICAgICBjb25zdCBjYXB0dXJlU29ydGVyID0gc29ydGVyO1xuICAgICAgICBjb25zdCBjYXB0dXJlSW5kZXggPSBpO1xuICAgICAgICBzb3J0ZXIgPSBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgIGNvbnN0IGMgPSBjb21wYXJlcihhLmFnZ3JlZ2F0ZXNbY2FwdHVyZUluZGV4XSwgYi5hZ2dyZWdhdGVzW2NhcHR1cmVJbmRleF0pO1xuICAgICAgICAgIGlmIChjID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FwdHVyZVNvcnRlcihhLCBiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFzY2VuZGluZyA/IC1jIDogYztcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLnNvcnRlciA9IHNvcnRlcjtcbiAgICAgIHN0YXRlLnJvb3Quc3RhdGUgfD0gTk9ERV9SRU9SREVSX0JJVDtcbiAgICB9LFxuICAgIGdldEFjdGl2ZUFnZ3JlZ2F0b3JzOiBmdW5jdGlvbiBnZXRBY3RpdmVBZ2dyZWdhdG9ycygpIHtcbiAgICAgIHJldHVybiBzdGF0ZS5hY3RpdmVBZ2dyZWdhdG9ycy5zbGljZSgpO1xuICAgIH0sXG4gICAgZ2V0Um93czogZnVuY3Rpb24gZ2V0Um93cyh0b3AsIGhlaWdodCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5KGhlaWdodCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7XG4gICAgICAgIHJlc3VsdFtpXSA9IG51bGw7XG4gICAgICB9XG4gICAgICBnZXRSb3dzSW1wbChzdGF0ZS5yb290LCB0b3AsIGhlaWdodCwgcmVzdWx0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgICBnZXRSb3dMYWJlbDogZnVuY3Rpb24gZ2V0Um93TGFiZWwocm93KSB7XG4gICAgICByZXR1cm4gcm93LmxhYmVsO1xuICAgIH0sXG4gICAgZ2V0Um93SW5kZW50OiBmdW5jdGlvbiBnZXRSb3dJbmRlbnQocm93KSB7XG4gICAgICByZXR1cm4gcm93LnN0YXRlID4+PiBOT0RFX0lOREVOVF9TSElGVDtcbiAgICB9LFxuICAgIGdldFJvd0FnZ3JlZ2F0ZTogZnVuY3Rpb24gZ2V0Um93QWdncmVnYXRlKHJvdywgaW5kZXgpIHtcbiAgICAgIGNvbnN0IGFnZ3JlZ2F0b3IgPSBzdGF0ZS5hZ2dyZWdhdG9yc1tzdGF0ZS5hY3RpdmVBZ2dyZWdhdG9yc1tpbmRleF1dO1xuICAgICAgcmV0dXJuIGFnZ3JlZ2F0b3IuZm9ybWF0dGVyKHJvdy5hZ2dyZWdhdGVzW2luZGV4XSk7XG4gICAgfSxcbiAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uIGdldEhlaWdodCgpIHtcbiAgICAgIHJldHVybiBzdGF0ZS5yb290LmhlaWdodDtcbiAgICB9LFxuICAgIGNhbkV4cGFuZDogZnVuY3Rpb24gY2FuRXhwYW5kKHJvdykge1xuICAgICAgcmV0dXJuIChyb3cuc3RhdGUgJiBOT0RFX0VYUEFOREVEX0JJVCkgPT09IDAgJiYgKHJvdy5leHBhbmRlciAhPT0gSU5WQUxJRF9BQ1RJVkVfRVhQQU5ERVIpO1xuICAgIH0sXG4gICAgY2FuQ29udHJhY3Q6IGZ1bmN0aW9uIGNhbkNvbnRyYWN0KHJvdykge1xuICAgICAgcmV0dXJuIChyb3cuc3RhdGUgJiBOT0RFX0VYUEFOREVEX0JJVCkgIT09IDA7XG4gICAgfSxcbiAgICBleHBhbmQ6IGZ1bmN0aW9uIGV4cGFuZChyb3cpIHtcbiAgICAgIGlmICgocm93LnN0YXRlICYgTk9ERV9FWFBBTkRFRF9CSVQpICE9PSAwKSB7XG4gICAgICAgIHRocm93ICdjYW4gbm90IGV4cGFuZCByb3csIGFscmVhZHkgZXhwYW5kZWQnO1xuICAgICAgfVxuICAgICAgaWYgKHJvdy5oZWlnaHQgIT09IDEpIHtcbiAgICAgICAgdGhyb3cgJ3VuZXhwYW5kZWQgcm93IGhhcyBoZWlnaHQgJyArIHJvdy5oZWlnaHQudG9TdHJpbmcoKSArICcgIT0gMSc7XG4gICAgICB9XG4gICAgICBpZiAocm93LmNoaWxkcmVuID09PSBudWxsKSB7ICAvLyBmaXJzdCBleHBhbmQsIGdlbmVyYXRlIGNoaWxkcmVuXG4gICAgICAgIGNvbnN0IGFjdGl2ZUluZGV4ID0gcm93LmV4cGFuZGVyICYgQUNUSVZFX0VYUEFOREVSX01BU0s7XG4gICAgICAgIGxldCBuZXh0QWN0aXZlSW5kZXggPSBhY3RpdmVJbmRleCArIDE7ICAvLyBOQjogaWYgbmV4dCBpcyBzdGFjaywgZnJhbWUgaXMgMFxuICAgICAgICBpZiAobmV4dEFjdGl2ZUluZGV4ID49IHN0YXRlLmFjdGl2ZUV4cGFuZGVycy5sZW5ndGgpIHtcbiAgICAgICAgICBuZXh0QWN0aXZlSW5kZXggPSBJTlZBTElEX0FDVElWRV9FWFBBTkRFUjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWN0aXZlSW5kZXggPj0gc3RhdGUuYWN0aXZlRXhwYW5kZXJzLmxlbmd0aCkge1xuICAgICAgICAgIHRocm93ICdpbnZhbGlkIGFjdGl2ZSBleHBhbmRlciBpbmRleCAnICsgYWN0aXZlSW5kZXgudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleElkID0gc3RhdGUuYWN0aXZlRXhwYW5kZXJzW2FjdGl2ZUluZGV4XTtcbiAgICAgICAgaWYgKGV4SWQgPj0gRklFTERfRVhQQU5ERVJfSURfTUlOICYmXG4gICAgICAgICAgICBleElkIDwgRklFTERfRVhQQU5ERVJfSURfTUlOICsgc3RhdGUuZmllbGRFeHBhbmRlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgZXhwYW5kZXIgPSBzdGF0ZS5maWVsZEV4cGFuZGVyc1tleElkIC0gRklFTERfRVhQQU5ERVJfSURfTUlOXTtcbiAgICAgICAgICBhZGRDaGlsZHJlbldpdGhGaWVsZEV4cGFuZGVyKHJvdywgZXhwYW5kZXIsIG5leHRBY3RpdmVJbmRleCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXhJZCA+PSBTVEFDS19FWFBBTkRFUl9JRF9NSU4gJiZcbiAgICAgICAgICAgIGV4SWQgPCBTVEFDS19FWFBBTkRFUl9JRF9NSU4gKyBzdGF0ZS5zdGFja0V4cGFuZGVycy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBkZXB0aCA9IHJvdy5leHBhbmRlciA+Pj4gQUNUSVZFX0VYUEFOREVSX0ZSQU1FX1NISUZUO1xuICAgICAgICAgIGNvbnN0IGV4cGFuZGVyID0gc3RhdGUuc3RhY2tFeHBhbmRlcnNbZXhJZCAtIFNUQUNLX0VYUEFOREVSX0lEX01JTl07XG4gICAgICAgICAgYWRkQ2hpbGRyZW5XaXRoU3RhY2tFeHBhbmRlcihyb3csIGV4cGFuZGVyLCBhY3RpdmVJbmRleCwgZGVwdGgsIG5leHRBY3RpdmVJbmRleCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgJ3N0YXRlLmFjdGl2ZUluZGV4ICcgKyBhY3RpdmVJbmRleC50b1N0cmluZygpXG4gICAgICAgICAgICArICcgaGFzIGludmFsaWQgZXhwYW5kZXInICsgZXhJZC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByb3cuc3RhdGUgfD0gTk9ERV9FWFBBTkRFRF9CSVRcbiAgICAgICAgfCBOT0RFX1JFQUdHUkVHQVRFX0JJVCB8IE5PREVfUkVPUkRFUl9CSVQgfCBOT0RFX1JFUE9TSVRJT05fQklUO1xuICAgICAgbGV0IGhlaWdodENoYW5nZSA9IDA7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvdy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBoZWlnaHRDaGFuZ2UgKz0gcm93LmNoaWxkcmVuW2ldLmhlaWdodDtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZUhlaWdodChyb3csIGhlaWdodENoYW5nZSk7XG4gICAgICAvLyBpZiBjaGlsZHJlbiBvbmx5IGNvbnRhaW5zIG9uZSBub2RlLCB0aGVuIGV4cGFuZCBpdCBhcyB3ZWxsXG4gICAgICBpZiAocm93LmNoaWxkcmVuLmxlbmd0aCA9PT0gMSAmJiB0aGlzLmNhbkV4cGFuZChyb3cuY2hpbGRyZW5bMF0pKSB7XG4gICAgICAgIHRoaXMuZXhwYW5kKHJvdy5jaGlsZHJlblswXSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBjb250cmFjdDogZnVuY3Rpb24gY29udHJhY3Qocm93KSB7XG4gICAgICBjb250cmFjdFJvdyhyb3cpO1xuICAgIH0sXG4gIH07XG59XG4iXX0= +// @generated diff --git a/local-cli/server/middleware/heapCapture/out/heapCapture.js b/local-cli/server/middleware/heapCapture/out/heapCapture.js index 2f49dcd1e..73d89fc5f 100644 --- a/local-cli/server/middleware/heapCapture/out/heapCapture.js +++ b/local-cli/server/middleware/heapCapture/out/heapCapture.js @@ -145,28 +145,28 @@ return type.getRef().value.name;// element.type symbolicated name return'#unknown'; } -function buildReactComponentTree(visitor,registry){ +function buildReactComponentTree(visitor,registry,strings){ var ref=visitor.getRef(); if(ref.reactTree||ref.reactParent===undefined){ return;// has one or doesn't need one } var parentVisitor=ref.reactParent; if(parentVisitor===null){ -ref.reactTree=registry.insert(registry.root,getInternalInstanceName(visitor)); +ref.reactTree=registry.insert(registry.root,strings.intern(getInternalInstanceName(visitor))); }else if(parentVisitor){ var parentRef=parentVisitor.getRef(); -buildReactComponentTree(parentVisitor,registry); +buildReactComponentTree(parentVisitor,registry,strings); var relativeName=getInternalInstanceName(visitor); if(ref.reactKey){ relativeName=ref.reactKey+': '+relativeName; } -ref.reactTree=registry.insert(parentRef.reactTree,relativeName); +ref.reactTree=registry.insert(parentRef.reactTree,strings.intern(relativeName)); }else{ throw'non react instance parent of react instance'; } } -function markReactComponentTree(refs,registry){ +function markReactComponentTree(refs,registry,strings){ // annotate all refs that are react internal instances with their parent and name // ref.reactParent = visitor that points to parent instance, // null if we know it's an instance, but don't have a parent yet @@ -201,7 +201,7 @@ edgeRef.reactParent=visitorClone; // build tree of react internal instances (since that's what has the structure) // fill in ref.reactTree = path registry node forEachRef(refs,function(visitor){ -buildReactComponentTree(visitor,registry); +buildReactComponentTree(visitor,registry,strings); }); // hook in components by looking at their _reactInternalInstance fields forEachRef(refs,function(visitor){ @@ -253,14 +253,14 @@ ref.module='#unknown '+name; }); } -function registerPathToRoot(refs,registry){ -markReactComponentTree(refs,registry); +function registerPathToRoot(refs,registry,strings){ +markReactComponentTree(refs,registry,strings); markModules(refs); var breadth=[]; forEachRef(refs,function(visitor){ var ref=visitor.getRef(); if(ref.type==='CallbackGlobalObject'){ -ref.rootPath=registry.insert(registry.root,ref.type); +ref.rootPath=registry.insert(registry.root,strings.intern(ref.type)); breadth.push(visitor.clone()); } });var _loop=function _loop(){ @@ -276,7 +276,7 @@ var pathName=edgeRef.type; if(edgeName){ pathName=edgeName+': '+pathName; } -edgeRef.rootPath=registry.insert(ref.rootPath,pathName); +edgeRef.rootPath=registry.insert(ref.rootPath,strings.intern(pathName)); nextBreadth.push(edgeVisitor.clone()); // copy module and react tree forward if(edgeRef.module===undefined){ @@ -330,10 +330,10 @@ newData.set(data); var dataOffset=this.data.length; this.data=null; -registerPathToRoot(capture.refs,this.stacks); +registerPathToRoot(capture.refs,this.stacks,this.strings); var internedCaptureId=this.strings.intern(captureId); var noneString=this.strings.intern('#none'); -var noneStack=this.stacks.insert(this.stacks.root,'#none'); +var noneStack=this.stacks.insert(this.stacks.root,noneString); forEachRef(capture.refs,function(visitor){ var ref=visitor.getRef(); var id=visitor.id; @@ -382,7 +382,7 @@ var agStrings=this.strings; var agStacks=this.stacks.flatten(); var agData=this.data; var agNumRows=agData.length/numFields; -var ag=new aggrow(agStrings,agStacks,agNumRows); +var ag=new aggrow(agNumRows); ag.addFieldExpander('Id', function getId(row){ @@ -414,11 +414,19 @@ function compareSize(rowA,rowB){ return agData[rowA*numFields+traceField]-agData[rowB*numFields+traceField]; }); -var pathExpander=ag.addCalleeStackExpander('Path', -function getStack(row){return agStacks.get(agData[row*numFields+pathField]);}); +var pathExpander=ag.addCalleeStackExpander( +'Path', +agStacks.maxDepth, +function getStack(row){return agStacks.get(agData[row*numFields+pathField]);}, +function getFrame(id){return agStrings.get(id);}); + + +var reactExpander=ag.addCalleeStackExpander( +'React Tree', +agStacks.maxDepth, +function getStack(row){return agStacks.get(agData[row*numFields+reactField]);}, +function getFrame(id){return agStrings.get(id);}); -var reactExpander=ag.addCalleeStackExpander('React Tree', -function getStack(row){return agStacks.get(agData[row*numFields+reactField]);}); var valueExpander=ag.addFieldExpander('Value', function getValue(row){return agStrings.get(agData[row*numFields+valueField]);}, @@ -469,4 +477,6 @@ var r=new captureRegistry(); r.register('trace',preLoadedCapture); preLoadedCapture=undefined;// let GG clean up the capture ReactDOM.render(React.createElement(Table,{aggrow:r.getAggrow()}),document.body); -}// @generated +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9oZWFwQ2FwdHVyZS5qcyJdLCJuYW1lcyI6WyJSZWZWaXNpdG9yIiwicmVmcyIsImlkIiwicHJvdG90eXBlIiwibW92ZVRvRWRnZSIsIm5hbWUiLCJyZWYiLCJlZGdlcyIsImVkZ2VJZCIsInVuZGVmaW5lZCIsIm1vdmVUb0ZpcnN0IiwiY2FsbGJhY2siLCJmb3JFYWNoRWRnZSIsInZpc2l0b3IiLCJnZXRUeXBlIiwidHlwZSIsImdldFJlZiIsImNsb25lIiwiaXNEZWZpbmVkIiwiZ2V0VmFsdWUiLCJ2YWx1ZSIsInJvcGUiLCJzdGFydHNXaXRoIiwiZW5kc1dpdGgiLCJpbmRleCIsInBhcnNlSW50Iiwic3Vic3RyaW5nIiwibGVuZ3RoIiwiam9pbiIsInVybCIsImxpbmUiLCJjb2wiLCJmdW5jdGlvbiIsImNvbnN0cnVjdG9yIiwiZXhlY3V0YWJsZSIsImZvckVhY2hSZWYiLCJmaXJzdFJlZiIsImdldEludGVybmFsSW5zdGFuY2VOYW1lIiwiZGlzcGxheU5hbWUiLCJidWlsZFJlYWN0Q29tcG9uZW50VHJlZSIsInJlZ2lzdHJ5Iiwic3RyaW5ncyIsInJlYWN0VHJlZSIsInJlYWN0UGFyZW50IiwicGFyZW50VmlzaXRvciIsImluc2VydCIsInJvb3QiLCJpbnRlcm4iLCJwYXJlbnRSZWYiLCJyZWxhdGl2ZU5hbWUiLCJyZWFjdEtleSIsIm1hcmtSZWFjdENvbXBvbmVudFRyZWUiLCJ2aXNpdG9yQ2xvbmUiLCJlZGdlTmFtZSIsImVkZ2VWaXNpdG9yIiwiZWRnZVJlZiIsImNoaWxkTmFtZSIsImNoaWxkVmlzaXRvciIsImNoaWxkUmVmIiwiaW5zdGFuY2VSZWYiLCJmdW5jdGlvblVybEZpbGVOYW1lIiwiZmlsZSIsImxhc3RJbmRleE9mIiwibWFya01vZHVsZXMiLCJtb2R1bGVzIiwibWVtYmVyTmFtZSIsIm1lbWJlciIsIm1vZHVsZSIsInJlZ2lzdGVyUGF0aFRvUm9vdCIsImJyZWFkdGgiLCJyb290UGF0aCIsInB1c2giLCJuZXh0QnJlYWR0aCIsImkiLCJwYXRoTmFtZSIsImNhcHR1cmVSZWdpc3RyeSIsInN0cmluZ0ludGVybmVyIiwic3RhY2tzIiwic3RhY2tSZWdpc3RyeSIsImRhdGEiLCJJbnQzMkFycmF5IiwiaWRGaWVsZCIsInR5cGVGaWVsZCIsInNpemVGaWVsZCIsInRyYWNlRmllbGQiLCJwYXRoRmllbGQiLCJyZWFjdEZpZWxkIiwidmFsdWVGaWVsZCIsIm1vZHVsZUZpZWxkIiwibnVtRmllbGRzIiwicmVnaXN0ZXIiLCJyZWdpc3RlckNhcHR1cmUiLCJjYXB0dXJlSWQiLCJjYXB0dXJlIiwicm93Q291bnQiLCJtYXJrZWRCbG9ja3MiLCJjb25zb2xlIiwibG9nIiwidG9TdHJpbmciLCJuZXdEYXRhIiwic2V0IiwiZGF0YU9mZnNldCIsImludGVybmVkQ2FwdHVyZUlkIiwibm9uZVN0cmluZyIsIm5vbmVTdGFjayIsInNpemUiLCJibG9jayIsImNhcGFjaXR5IiwiY2VsbFNpemUiLCJnZXRBZ2dyb3ciLCJhZ1N0cmluZ3MiLCJhZ1N0YWNrcyIsImZsYXR0ZW4iLCJhZ0RhdGEiLCJhZ051bVJvd3MiLCJhZyIsImFnZ3JvdyIsImFkZEZpZWxkRXhwYW5kZXIiLCJnZXRJZCIsInJvdyIsImNvbXBhcmVBZGRyZXNzIiwicm93QSIsInJvd0IiLCJ0eXBlRXhwYW5kZXIiLCJnZXQiLCJjb21wYXJlVHlwZSIsImdldFNpemUiLCJjb21wYXJlU2l6ZSIsInBhdGhFeHBhbmRlciIsImFkZENhbGxlZVN0YWNrRXhwYW5kZXIiLCJtYXhEZXB0aCIsImdldFN0YWNrIiwiZ2V0RnJhbWUiLCJyZWFjdEV4cGFuZGVyIiwidmFsdWVFeHBhbmRlciIsImNvbXBhcmVWYWx1ZSIsIm1vZHVsZUV4cGFuZGVyIiwiZ2V0TW9kdWxlIiwiY29tcGFyZU1vZHVsZSIsInNpemVBZ2dyZWdhdG9yIiwiYWRkQWdncmVnYXRvciIsImFnZ3JlZ2F0ZVNpemUiLCJpbmRpY2VzIiwiZm9ybWF0U2l6ZSIsInNvcnRTaXplIiwiYSIsImIiLCJjb3VudEFnZ3JlZ2F0b3IiLCJhZ2dyZWdhdGVDb3VudCIsImZvcm1hdENvdW50Iiwic29ydENvdW50Iiwic2V0QWN0aXZlRXhwYW5kZXJzIiwic2V0QWN0aXZlQWdncmVnYXRvcnMiLCJwcmVMb2FkZWRDYXB0dXJlIiwiciIsIlJlYWN0RE9NIiwicmVuZGVyIiwiZG9jdW1lbnQiLCJib2R5Il0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7O0FBRUEsUUFBU0EsV0FBVCxDQUFvQkMsSUFBcEIsQ0FBMEJDLEVBQTFCLENBQThCO0FBQzVCLEtBQUtELElBQUwsQ0FBWUEsSUFBWjtBQUNBLEtBQUtDLEVBQUwsQ0FBVUEsRUFBVjtBQUNEOztBQUVERixXQUFXRyxTQUFYLENBQXVCO0FBQ3JCQyxXQUFZLFFBQVNBLFdBQVQsQ0FBb0JDLElBQXBCLENBQTBCO0FBQ3BDLEdBQU1DLEtBQU0sS0FBS0wsSUFBTCxDQUFVLEtBQUtDLEVBQWYsQ0FBWjtBQUNBLEdBQUlJLEtBQU9BLElBQUlDLEtBQWYsQ0FBc0I7QUFDcEIsR0FBTUEsT0FBUUQsSUFBSUMsS0FBbEI7QUFDQSxJQUFLLEdBQU1DLE9BQVgsR0FBcUJELE1BQXJCLENBQTRCO0FBQzFCLEdBQUlBLE1BQU1DLE1BQU4sSUFBa0JILElBQXRCLENBQTRCO0FBQzFCLEtBQUtILEVBQUwsQ0FBVU0sTUFBVjtBQUNBLE1BQU8sS0FBUDtBQUNEO0FBQ0Y7QUFDRjtBQUNELEtBQUtOLEVBQUwsQ0FBVU8sU0FBVjtBQUNBLE1BQU8sS0FBUDtBQUNELENBZG9CO0FBZXJCQyxZQUFhLFFBQVNBLFlBQVQsQ0FBcUJDLFFBQXJCLENBQStCO0FBQzFDLEdBQU1MLEtBQU0sS0FBS0wsSUFBTCxDQUFVLEtBQUtDLEVBQWYsQ0FBWjtBQUNBLEdBQUlJLEtBQU9BLElBQUlDLEtBQWYsQ0FBc0I7QUFDcEIsR0FBTUEsT0FBUUQsSUFBSUMsS0FBbEI7QUFDQSxJQUFLLEdBQU1DLE9BQVgsR0FBcUJELE1BQXJCLENBQTRCO0FBQzFCLEtBQUtMLEVBQUwsQ0FBVU0sTUFBVjtBQUNBLEdB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MEIsQ0FKbEM7QUFLdEIsUUFBU29ELFVBQVQsQ0FBbUJMLENBQW5CLENBQXNCQyxDQUF0QixDQUF5QixDQUFFLE1BQU9BLEdBQUlELENBQVgsQ0FBZSxDQUxwQixDQUF4Qjs7QUFPQTlCLEdBQUdvQyxrQkFBSCxDQUFzQjtBQUNwQnZCLFlBRG9CO0FBRXBCSyxhQUZvQjtBQUdwQkcsY0FIb0I7QUFJcEJiLFlBSm9CO0FBS3BCVyxhQUxvQixDQUF0Qjs7QUFPQW5CLEdBQUdxQyxvQkFBSCxDQUF3QixDQUFDYixjQUFELENBQWlCUSxlQUFqQixDQUF4QjtBQUNBLE1BQU9oQyxHQUFQO0FBQ0QsQ0FqS0ksQ0FBUDs7QUFtS0Q7O0FBRUQsR0FBSXNDLGdCQUFKLENBQXNCO0FBQ3BCLEdBQU1DLEdBQUksR0FBSS9FLGdCQUFKLEVBQVY7QUFDQStFLEVBQUVoRSxRQUFGLENBQVcsT0FBWCxDQUFvQitELGdCQUFwQjtBQUNBQSxpQkFBbUJoSixTQUFuQixDQUE4QjtBQUM5QmtKLFNBQVNDLE1BQVQsQ0FBZ0Isb0JBQUMsS0FBRCxFQUFPLE9BQVFGLEVBQUU3QyxTQUFGLEVBQWYsRUFBaEIsQ0FBa0RnRCxTQUFTQyxJQUEzRDtBQUNEIiwiZmlsZSI6ImhlYXBDYXB0dXJlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG4ndXNlIHN0cmljdCc7XG4vKmVzbGludCBuby1jb25zb2xlLWRpc2FsbG93OiBcIm9mZlwiKi9cbi8qZ2xvYmFsIFJlYWN0IFJlYWN0RE9NIFRhYmxlIHN0cmluZ0ludGVybmVyIHN0YWNrUmVnaXN0cnkgYWdncm93IHByZUxvYWRlZENhcHR1cmU6dHJ1ZSovXG5cbmZ1bmN0aW9uIFJlZlZpc2l0b3IocmVmcywgaWQpIHtcbiAgdGhpcy5yZWZzID0gcmVmcztcbiAgdGhpcy5pZCA9IGlkO1xufVxuXG5SZWZWaXNpdG9yLnByb3RvdHlwZSA9IHtcbiAgbW92ZVRvRWRnZTogZnVuY3Rpb24gbW92ZVRvRWRnZShuYW1lKSB7XG4gICAgY29uc3QgcmVmID0gdGhpcy5yZWZzW3RoaXMuaWRdO1xuICAgIGlmIChyZWYgJiYgcmVmLmVkZ2VzKSB7XG4gICAgICBjb25zdCBlZGdlcyA9IHJlZi5lZGdlcztcbiAgICAgIGZvciAoY29uc3QgZWRnZUlkIGluIGVkZ2VzKSB7XG4gICAgICAgIGlmIChlZGdlc1tlZGdlSWRdID09PSBuYW1lKSB7XG4gICAgICAgICAgdGhpcy5pZCA9IGVkZ2VJZDtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmlkID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBtb3ZlVG9GaXJzdDogZnVuY3Rpb24gbW92ZVRvRmlyc3QoY2FsbGJhY2spIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLnJlZnNbdGhpcy5pZF07XG4gICAgaWYgKHJlZiAmJiByZWYuZWRnZXMpIHtcbiAgICAgIGNvbnN0IGVkZ2VzID0gcmVmLmVkZ2VzO1xuICAgICAgZm9yIChjb25zdCBlZGdlSWQgaW4gZWRnZXMpIHtcbiAgICAgICAgdGhpcy5pZCA9IGVkZ2VJZDtcbiAgICAgICAgaWYgKGNhbGxiYWNrKGVkZ2VzW2VkZ2VJZF0sIHRoaXMpKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5pZCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgZm9yRWFjaEVkZ2U6IGZ1bmN0aW9uIGZvckVhY2hFZGdlKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgcmVmID0gdGhpcy5yZWZzW3RoaXMuaWRdO1xuICAgIGlmIChyZWYgJiYgcmVmLmVkZ2VzKSB7XG4gICAgICBjb25zdCBlZGdlcyA9IHJlZi5lZGdlcztcbiAgICAgIGNvbnN0IHZpc2l0b3IgPSBuZXcgUmVmVmlzaXRvcih0aGlzLnJlZnMsIHVuZGVmaW5lZCk7XG4gICAgICBmb3IgKGNvbnN0IGVkZ2VJZCBpbiBlZGdlcykge1xuICAgICAgICB2aXNpdG9yLmlkID0gZWRnZUlkO1xuICAgICAgICBjYWxsYmFjayhlZGdlc1tlZGdlSWRdLCB2aXNpdG9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGdldFR5cGU6IGZ1bmN0aW9uIGdldFR5cGUoKSB7XG4gICAgY29uc3QgcmVmID0gdGhpcy5yZWZzW3RoaXMuaWRdO1xuICAgIGlmIChyZWYpIHtcbiAgICAgIHJldHVybiByZWYudHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSxcbiAgZ2V0UmVmOiBmdW5jdGlvbiBnZXRSZWYoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVmc1t0aGlzLmlkXTtcbiAgfSxcbiAgY2xvbmU6IGZ1bmN0aW9uIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgUmVmVmlzaXRvcih0aGlzLnJlZnMsIHRoaXMuaWQpO1xuICB9LFxuICBpc0RlZmluZWQ6IGZ1bmN0aW9uIGlzRGVmaW5lZCgpIHtcbiAgICByZXR1cm4gISF0aGlzLmlkO1xuICB9LFxuICBnZXRWYWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWUoKSB7XG4gICAgY29uc3QgcmVmID0gdGhpcy5yZWZzW3RoaXMuaWRdO1xuICAgIGlmIChyZWYpIHtcbiAgICAgIGlmIChyZWYudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHJlZi52YWx1ZSkge1xuICAgICAgICAgIHJldHVybiByZWYudmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3Qgcm9wZSA9IFtdO1xuICAgICAgICAgIHRoaXMuZm9yRWFjaEVkZ2UoKG5hbWUsIHZpc2l0b3IpID0+IHtcbiAgICAgICAgICAgIGlmIChuYW1lICYmIG5hbWUuc3RhcnRzV2l0aCgnWycpICYmIG5hbWUuZW5kc1dpdGgoJ10nKSkge1xuICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KG5hbWUuc3Vic3RyaW5nKDEsIG5hbWUubGVuZ3RoIC0gMSksIDEwKTtcbiAgICAgICAgICAgICAgcm9wZVtpbmRleF0gPSB2aXNpdG9yLmdldFZhbHVlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJvcGUuam9pbignJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocmVmLnR5cGUgPT09ICdTY3JpcHRFeGVjdXRhYmxlJ1xuICAgICAgICAgICAgICB8fCByZWYudHlwZSA9PT0gJ0V2YWxFeGVjdXRhYmxlJ1xuICAgICAgICAgICAgICB8fCByZWYudHlwZSA9PT0gJ1Byb2dyYW1FeGVjdXRhYmxlJykge1xuICAgICAgICByZXR1cm4gcmVmLnZhbHVlLnVybCArICc6JyArIHJlZi52YWx1ZS5saW5lICsgJzonICsgcmVmLnZhbHVlLmNvbDtcbiAgICAgIH0gZWxzZSBpZiAocmVmLnR5cGUgPT09ICdGdW5jdGlvbkV4ZWN1dGFibGUnKSB7XG4gICAgICAgIHJldHVybiByZWYudmFsdWUubmFtZSArICdAJyArIHJlZi52YWx1ZS51cmwgKyAnOicgKyByZWYudmFsdWUubGluZSArICc6JyArIHJlZi52YWx1ZS5jb2w7XG4gICAgICB9IGVsc2UgaWYgKHJlZi50eXBlID09PSAnTmF0aXZlRXhlY3V0YWJsZScpIHtcbiAgICAgICAgcmV0dXJuIHJlZi52YWx1ZS5mdW5jdGlvbiArICcgJyArIHJlZi52YWx1ZS5jb25zdHJ1Y3RvciArICcgJyArIHJlZi52YWx1ZS5uYW1lO1xuICAgICAgfSBlbHNlIGlmIChyZWYudHlwZSA9PT0gJ0Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCBleGVjdXRhYmxlID0gdGhpcy5jbG9uZSgpLm1vdmVUb0VkZ2UoJ0BFeGVjdXRhYmxlJyk7XG4gICAgICAgIGlmIChleGVjdXRhYmxlLmlkKSB7XG4gICAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGUuZ2V0UmVmKCkudHlwZSArICcgJyArIGV4ZWN1dGFibGUuZ2V0VmFsdWUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJyNub25lJztcbiAgfVxufTtcblxuZnVuY3Rpb24gZm9yRWFjaFJlZihyZWZzLCBjYWxsYmFjaykge1xuICBjb25zdCB2aXNpdG9yID0gbmV3IFJlZlZpc2l0b3IocmVmcywgdW5kZWZpbmVkKTtcbiAgZm9yIChjb25zdCBpZCBpbiByZWZzKSB7XG4gICAgdmlzaXRvci5pZCA9IGlkO1xuICAgIGNhbGxiYWNrKHZpc2l0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpcnN0UmVmKHJlZnMsIGNhbGxiYWNrKSB7XG4gIGZvciAoY29uc3QgaWQgaW4gcmVmcykge1xuICAgIGNvbnN0IHJlZiA9IHJlZnNbaWRdO1xuICAgIGlmIChjYWxsYmFjayhpZCwgcmVmKSkge1xuICAgICAgcmV0dXJuIG5ldyBSZWZWaXNpdG9yKHJlZnMsIGlkKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5ldyBSZWZWaXNpdG9yKHJlZnMsIHVuZGVmaW5lZCk7XG59XG5cbmZ1bmN0aW9uIGdldEludGVybmFsSW5zdGFuY2VOYW1lKHZpc2l0b3IpIHtcbiAgY29uc3QgdHlwZSA9IHZpc2l0b3IuY2xvbmUoKS5tb3ZlVG9FZGdlKCdfY3VycmVudEVsZW1lbnQnKS5tb3ZlVG9FZGdlKCd0eXBlJyk7XG4gIGlmICh0eXBlLmdldFR5cGUoKSA9PT0gJ3N0cmluZycpIHsgLy8gZWxlbWVudC50eXBlIGlzIHN0cmluZ1xuICAgIHJldHVybiB0eXBlLmdldFZhbHVlKCk7XG4gIH0gZWxzZSBpZiAodHlwZS5nZXRUeXBlKCkgPT09ICdGdW5jdGlvbicpIHsgLy8gZWxlbWVudC50eXBlIGlzIGZ1bmN0aW9uXG4gICAgY29uc3QgZGlzcGxheU5hbWUgPSB0eXBlLmNsb25lKCkubW92ZVRvRWRnZSgnZGlzcGxheU5hbWUnKTtcbiAgICBpZiAoZGlzcGxheU5hbWUuaXNEZWZpbmVkKCkpIHtcbiAgICAgIHJldHVybiBkaXNwbGF5TmFtZS5nZXRWYWx1ZSgpOyAvLyBlbGVtZW50LnR5cGUuZGlzcGxheU5hbWVcbiAgICB9XG4gICAgY29uc3QgbmFtZSA9IHR5cGUuY2xvbmUoKS5tb3ZlVG9FZGdlKCduYW1lJyk7XG4gICAgaWYgKG5hbWUuaXNEZWZpbmVkKCkpIHtcbiAgICAgIHJldHVybiBuYW1lLmdldFZhbHVlKCk7IC8vIGVsZW1lbnQudHlwZS5uYW1lXG4gICAgfVxuICAgIHR5cGUubW92ZVRvRWRnZSgnQEV4ZWN1dGFibGUnKTtcbiAgICBpZiAodHlwZS5nZXRUeXBlKCkgPT09ICdGdW5jdGlvbkV4ZWN1dGFibGUnKSB7XG4gICAgICByZXR1cm4gdHlwZS5nZXRSZWYoKS52YWx1ZS5uYW1lOyAgLy8gZWxlbWVudC50eXBlIHN5bWJvbGljYXRlZCBuYW1lXG4gICAgfVxuICB9XG4gIHJldHVybiAnI3Vua25vd24nO1xufVxuXG5mdW5jdGlvbiBidWlsZFJlYWN0Q29tcG9uZW50VHJlZSh2aXNpdG9yLCByZWdpc3RyeSwgc3RyaW5ncykge1xuICBjb25zdCByZWYgPSB2aXNpdG9yLmdldFJlZigpO1xuICBpZiAocmVmLnJlYWN0VHJlZSB8fCByZWYucmVhY3RQYXJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjsgLy8gaGFzIG9uZSBvciBkb2Vzbid0IG5lZWQgb25lXG4gIH1cbiAgY29uc3QgcGFyZW50VmlzaXRvciA9IHJlZi5yZWFjdFBhcmVudDtcbiAgaWYgKHBhcmVudFZpc2l0b3IgPT09IG51bGwpIHtcbiAgICByZWYucmVhY3RUcmVlID0gcmVnaXN0cnkuaW5zZXJ0KHJlZ2lzdHJ5LnJvb3QsIHN0cmluZ3MuaW50ZXJuKGdldEludGVybmFsSW5zdGFuY2VOYW1lKHZpc2l0b3IpKSk7XG4gIH0gZWxzZSBpZiAocGFyZW50VmlzaXRvcikge1xuICAgIGNvbnN0IHBhcmVudFJlZiA9IHBhcmVudFZpc2l0b3IuZ2V0UmVmKCk7XG4gICAgYnVpbGRSZWFjdENvbXBvbmVudFRyZWUocGFyZW50VmlzaXRvciwgcmVnaXN0cnksIHN0cmluZ3MpO1xuICAgIGxldCByZWxhdGl2ZU5hbWUgPSBnZXRJbnRlcm5hbEluc3RhbmNlTmFtZSh2aXNpdG9yKTtcbiAgICBpZiAocmVmLnJlYWN0S2V5KSB7XG4gICAgICByZWxhdGl2ZU5hbWUgPSByZWYucmVhY3RLZXkgKyAnOiAnICsgcmVsYXRpdmVOYW1lO1xuICAgIH1cbiAgICByZWYucmVhY3RUcmVlID0gcmVnaXN0cnkuaW5zZXJ0KHBhcmVudFJlZi5yZWFjdFRyZWUsIHN0cmluZ3MuaW50ZXJuKHJlbGF0aXZlTmFtZSkpO1xuICB9IGVsc2Uge1xuICAgIHRocm93ICdub24gcmVhY3QgaW5zdGFuY2UgcGFyZW50IG9mIHJlYWN0IGluc3RhbmNlJztcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrUmVhY3RDb21wb25lbnRUcmVlKHJlZnMsIHJlZ2lzdHJ5LCBzdHJpbmdzKSB7XG4gIC8vIGFubm90YXRlIGFsbCByZWZzIHRoYXQgYXJlIHJlYWN0IGludGVybmFsIGluc3RhbmNlcyB3aXRoIHRoZWlyIHBhcmVudCBhbmQgbmFtZVxuICAvLyByZWYucmVhY3RQYXJlbnQgPSB2aXNpdG9yIHRoYXQgcG9pbnRzIHRvIHBhcmVudCBpbnN0YW5jZSxcbiAgLy8gICBudWxsIGlmIHdlIGtub3cgaXQncyBhbiBpbnN0YW5jZSwgYnV0IGRvbid0IGhhdmUgYSBwYXJlbnQgeWV0XG4gIC8vIHJlZi5yZWFjdEtleSA9IGlmIGEga2V5IGlzIHVzZWQgdG8gZGlzdGluZ3Vpc2ggc2libGluZ3NcbiAgZm9yRWFjaFJlZihyZWZzLCAodmlzaXRvcikgPT4ge1xuICAgIGNvbnN0IHZpc2l0b3JDbG9uZSA9IHZpc2l0b3IuY2xvbmUoKTsgLy8gdmlzaXRvciB3aWxsIGdldCBzdG9tcGVkIG9uIG5leHQgaXRlcmF0aW9uXG4gICAgY29uc3QgcmVmID0gdmlzaXRvci5nZXRSZWYoKTtcbiAgICB2aXNpdG9yLmZvckVhY2hFZGdlKChlZGdlTmFtZSwgZWRnZVZpc2l0b3IpID0+IHtcbiAgICAgIGNvbnN0IGVkZ2VSZWYgPSBlZGdlVmlzaXRvci5nZXRSZWYoKTtcbiAgICAgIGlmIChlZGdlUmVmKSB7XG4gICAgICAgIGlmIChlZGdlTmFtZSA9PT0gJ19yZW5kZXJlZENoaWxkcmVuJykge1xuICAgICAgICAgIGlmIChyZWYucmVhY3RQYXJlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gcmVmIGlzIHJlYWN0IGNvbXBvbmVudCwgZXZlbiBpZiB3ZSBkb24ndCBoYXZlIGEgcGFyZW50IHlldFxuICAgICAgICAgICAgcmVmLnJlYWN0UGFyZW50ID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWRnZVZpc2l0b3IuZm9yRWFjaEVkZ2UoKGNoaWxkTmFtZSwgY2hpbGRWaXNpdG9yKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZFJlZiA9IGNoaWxkVmlzaXRvci5nZXRSZWYoKTtcbiAgICAgICAgICAgIGlmIChjaGlsZFJlZiAmJiBjaGlsZE5hbWUuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAgICAgICAgIGNoaWxkUmVmLnJlYWN0UGFyZW50ID0gdmlzaXRvckNsb25lO1xuICAgICAgICAgICAgICBjaGlsZFJlZi5yZWFjdEtleSA9IGNoaWxkTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChlZGdlTmFtZSA9PT0gJ19yZW5kZXJlZENvbXBvbmVudCcpIHtcbiAgICAgICAgICBpZiAocmVmLnJlYWN0UGFyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlZi5yZWFjdFBhcmVudCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVkZ2VSZWYucmVhY3RQYXJlbnQgPSB2aXNpdG9yQ2xvbmU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIC8vIGJ1aWxkIHRyZWUgb2YgcmVhY3QgaW50ZXJuYWwgaW5zdGFuY2VzIChzaW5jZSB0aGF0J3Mgd2hhdCBoYXMgdGhlIHN0cnVjdHVyZSlcbiAgLy8gZmlsbCBpbiByZWYucmVhY3RUcmVlID0gcGF0aCByZWdpc3RyeSBub2RlXG4gIGZvckVhY2hSZWYocmVmcywgKHZpc2l0b3IpID0+IHtcbiAgICBidWlsZFJlYWN0Q29tcG9uZW50VHJlZSh2aXNpdG9yLCByZWdpc3RyeSwgc3RyaW5ncyk7XG4gIH0pO1xuICAvLyBob29rIGluIGNvbXBvbmVudHMgYnkgbG9va2luZyBhdCB0aGVpciBfcmVhY3RJbnRlcm5hbEluc3RhbmNlIGZpZWxkc1xuICBmb3JFYWNoUmVmKHJlZnMsICh2aXNpdG9yKSA9PiB7XG4gICAgY29uc3QgcmVmID0gdmlzaXRvci5nZXRSZWYoKTtcbiAgICBjb25zdCBpbnN0YW5jZVJlZiA9IHZpc2l0b3IubW92ZVRvRWRnZSgnX3JlYWN0SW50ZXJuYWxJbnN0YW5jZScpLmdldFJlZigpO1xuICAgIGlmIChpbnN0YW5jZVJlZikge1xuICAgICAgcmVmLnJlYWN0VHJlZSA9IGluc3RhbmNlUmVmLnJlYWN0VHJlZTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBmdW5jdGlvblVybEZpbGVOYW1lKHZpc2l0b3IpIHtcbiAgY29uc3QgZXhlY3V0YWJsZSA9IHZpc2l0b3IuY2xvbmUoKS5tb3ZlVG9FZGdlKCdARXhlY3V0YWJsZScpO1xuICBjb25zdCByZWYgPSBleGVjdXRhYmxlLmdldFJlZigpO1xuICBpZiAocmVmICYmIHJlZi52YWx1ZSAmJiByZWYudmFsdWUudXJsKSB7XG4gICAgY29uc3QgdXJsID0gcmVmLnZhbHVlLnVybDtcbiAgICBsZXQgZmlsZSA9IHVybC5zdWJzdHJpbmcodXJsLmxhc3RJbmRleE9mKCcvJykgKyAxKTtcbiAgICBpZiAoZmlsZS5lbmRzV2l0aCgnLmpzJykpIHtcbiAgICAgIGZpbGUgPSBmaWxlLnN1YnN0cmluZygwLCBmaWxlLmxlbmd0aCAtIDMpO1xuICAgIH1cbiAgICByZXR1cm4gZmlsZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBtYXJrTW9kdWxlcyhyZWZzKSB7XG4gIGNvbnN0IG1vZHVsZXMgPSBmaXJzdFJlZihyZWZzLCAoaWQsIHJlZikgPT4gcmVmLnR5cGUgPT09ICdDYWxsYmFja0dsb2JhbE9iamVjdCcpO1xuICBtb2R1bGVzLm1vdmVUb0VkZ2UoJ3JlcXVpcmUnKTtcbiAgbW9kdWxlcy5tb3ZlVG9GaXJzdCgobmFtZSwgdmlzaXRvcikgPT4gdmlzaXRvci5nZXRUeXBlKCkgPT09ICdKU0FjdGl2YXRpb24nKTtcbiAgbW9kdWxlcy5tb3ZlVG9FZGdlKCdtb2R1bGVzJyk7XG4gIG1vZHVsZXMuZm9yRWFjaEVkZ2UoKG5hbWUsIHZpc2l0b3IpID0+IHtcbiAgICBjb25zdCByZWYgPSB2aXNpdG9yLmdldFJlZigpO1xuICAgIHZpc2l0b3IubW92ZVRvRWRnZSgnZXhwb3J0cycpO1xuICAgIGlmICh2aXNpdG9yLmdldFR5cGUoKSA9PT0gJ09iamVjdCcpIHtcbiAgICAgIHZpc2l0b3IubW92ZVRvRmlyc3QoKG1lbWJlck5hbWUsIG1lbWJlcikgPT4gbWVtYmVyLmdldFR5cGUoKSA9PT0gJ0Z1bmN0aW9uJyk7XG4gICAgICBpZiAodmlzaXRvci5pc0RlZmluZWQoKSkge1xuICAgICAgICByZWYubW9kdWxlID0gZnVuY3Rpb25VcmxGaWxlTmFtZSh2aXNpdG9yKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHZpc2l0b3IuZ2V0VHlwZSgpID09PSAnRnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCBkaXNwbGF5TmFtZSA9IHZpc2l0b3IuY2xvbmUoKS5tb3ZlVG9FZGdlKCdkaXNwbGF5TmFtZScpO1xuICAgICAgaWYgKGRpc3BsYXlOYW1lLmlzRGVmaW5lZCgpKSB7XG4gICAgICAgIHJlZi5tb2R1bGUgPSBkaXNwbGF5TmFtZS5nZXRWYWx1ZSgpO1xuICAgICAgfVxuICAgICAgcmVmLm1vZHVsZSA9IGZ1bmN0aW9uVXJsRmlsZU5hbWUodmlzaXRvcik7XG4gICAgfVxuICAgIGlmIChyZWYgJiYgIXJlZi5tb2R1bGUpIHtcbiAgICAgIHJlZi5tb2R1bGUgPSAnI3Vua25vd24gJyArIG5hbWU7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJQYXRoVG9Sb290KHJlZnMsIHJlZ2lzdHJ5LCBzdHJpbmdzKSB7XG4gIG1hcmtSZWFjdENvbXBvbmVudFRyZWUocmVmcywgcmVnaXN0cnksIHN0cmluZ3MpO1xuICBtYXJrTW9kdWxlcyhyZWZzKTtcbiAgbGV0IGJyZWFkdGggPSBbXTtcbiAgZm9yRWFjaFJlZihyZWZzLCAodmlzaXRvcikgPT4ge1xuICAgIGNvbnN0IHJlZiA9IHZpc2l0b3IuZ2V0UmVmKCk7XG4gICAgaWYgKHJlZi50eXBlID09PSAnQ2FsbGJhY2tHbG9iYWxPYmplY3QnKSB7XG4gICAgICByZWYucm9vdFBhdGggPSByZWdpc3RyeS5pbnNlcnQocmVnaXN0cnkucm9vdCwgc3RyaW5ncy5pbnRlcm4ocmVmLnR5cGUpKTtcbiAgICAgIGJyZWFkdGgucHVzaCh2aXNpdG9yLmNsb25lKCkpO1xuICAgIH1cbiAgfSk7XG4gIHdoaWxlIChicmVhZHRoLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBuZXh0QnJlYWR0aCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnJlYWR0aC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdmlzaXRvciA9IGJyZWFkdGhbaV07XG4gICAgICBjb25zdCByZWYgPSB2aXNpdG9yLmdldFJlZigpO1xuICAgICAgdmlzaXRvci5mb3JFYWNoRWRnZSgoZWRnZU5hbWUsIGVkZ2VWaXNpdG9yKSA9PiB7XG4gICAgICAgIGNvbnN0IGVkZ2VSZWYgPSBlZGdlVmlzaXRvci5nZXRSZWYoKTtcbiAgICAgICAgaWYgKGVkZ2VSZWYgJiYgZWRnZVJlZi5yb290UGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbGV0IHBhdGhOYW1lID0gZWRnZVJlZi50eXBlO1xuICAgICAgICAgIGlmIChlZGdlTmFtZSkge1xuICAgICAgICAgICAgcGF0aE5hbWUgPSBlZGdlTmFtZSArICc6ICcgKyBwYXRoTmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWRnZVJlZi5yb290UGF0aCA9IHJlZ2lzdHJ5Lmluc2VydChyZWYucm9vdFBhdGgsIHN0cmluZ3MuaW50ZXJuKHBhdGhOYW1lKSk7XG4gICAgICAgICAgbmV4dEJyZWFkdGgucHVzaChlZGdlVmlzaXRvci5jbG9uZSgpKTtcbiAgICAgICAgICAvLyBjb3B5IG1vZHVsZSBhbmQgcmVhY3QgdHJlZSBmb3J3YXJkXG4gICAgICAgICAgaWYgKGVkZ2VSZWYubW9kdWxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVkZ2VSZWYubW9kdWxlID0gcmVmLm1vZHVsZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVkZ2VSZWYucmVhY3RUcmVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVkZ2VSZWYucmVhY3RUcmVlID0gcmVmLnJlYWN0VHJlZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBicmVhZHRoID0gbmV4dEJyZWFkdGg7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FwdHVyZVJlZ2lzdHJ5KCkge1xuICBjb25zdCBzdHJpbmdzID0gc3RyaW5nSW50ZXJuZXIoKTtcbiAgY29uc3Qgc3RhY2tzID0gc3RhY2tSZWdpc3RyeShzdHJpbmdzKTtcbiAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KDApO1xuXG4gIGNvbnN0IGlkRmllbGQgPSAwO1xuICBjb25zdCB0eXBlRmllbGQgPSAxO1xuICBjb25zdCBzaXplRmllbGQgPSAyO1xuICBjb25zdCB0cmFjZUZpZWxkID0gMztcbiAgY29uc3QgcGF0aEZpZWxkID0gNDtcbiAgY29uc3QgcmVhY3RGaWVsZCA9IDU7XG4gIGNvbnN0IHZhbHVlRmllbGQgPSA2O1xuICBjb25zdCBtb2R1bGVGaWVsZCA9IDc7XG4gIGNvbnN0IG51bUZpZWxkcyA9IDg7XG5cbiAgcmV0dXJuIHtcbiAgICBzdHJpbmdzOiBzdHJpbmdzLFxuICAgIHN0YWNrczogc3RhY2tzLFxuICAgIGRhdGE6IGRhdGEsXG4gICAgcmVnaXN0ZXI6IGZ1bmN0aW9uIHJlZ2lzdGVyQ2FwdHVyZShjYXB0dXJlSWQsIGNhcHR1cmUpIHtcbiAgICAgIC8vIE5COiBjYXB0dXJlLnJlZnMgaXMgcG90ZW50aWFsbHkgVkVSWSBsYXJnZSwgc28gd2UgdHJ5IHRvIGF2b2lkIG1ha2luZ1xuICAgICAgLy8gY29waWVzLCBldmVuIG9mIGl0ZXJhdGlvbiBpcyBhIGJpdCBtb3JlIGFubm95aW5nLlxuICAgICAgbGV0IHJvd0NvdW50ID0gMDtcbiAgICAgIGZvciAoY29uc3QgaWQgaW4gY2FwdHVyZS5yZWZzKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgICAgcm93Q291bnQrKztcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgaWQgaW4gY2FwdHVyZS5tYXJrZWRCbG9ja3MpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgICByb3dDb3VudCsrO1xuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICdpbmNyZWFzaW5nIHJvdyBkYXRhIGZyb20gJyArICh0aGlzLmRhdGEubGVuZ3RoICogNCkudG9TdHJpbmcoKSArICdCIHRvICcgK1xuICAgICAgICAodGhpcy5kYXRhLmxlbmd0aCAqIDQgKyByb3dDb3VudCAqIG51bUZpZWxkcyAqIDQpLnRvU3RyaW5nKCkgKyAnQidcbiAgICAgICk7XG4gICAgICBjb25zdCBuZXdEYXRhID0gbmV3IEludDMyQXJyYXkodGhpcy5kYXRhLmxlbmd0aCArIHJvd0NvdW50ICogbnVtRmllbGRzKTtcbiAgICAgIG5ld0RhdGEuc2V0KGRhdGEpO1xuICAgICAgbGV0IGRhdGFPZmZzZXQgPSB0aGlzLmRhdGEubGVuZ3RoO1xuICAgICAgdGhpcy5kYXRhID0gbnVsbDtcblxuICAgICAgcmVnaXN0ZXJQYXRoVG9Sb290KGNhcHR1cmUucmVmcywgdGhpcy5zdGFja3MsIHRoaXMuc3RyaW5ncyk7XG4gICAgICBjb25zdCBpbnRlcm5lZENhcHR1cmVJZCA9IHRoaXMuc3RyaW5ncy5pbnRlcm4oY2FwdHVyZUlkKTtcbiAgICAgIGNvbnN0IG5vbmVTdHJpbmcgPSB0aGlzLnN0cmluZ3MuaW50ZXJuKCcjbm9uZScpO1xuICAgICAgY29uc3Qgbm9uZVN0YWNrID0gdGhpcy5zdGFja3MuaW5zZXJ0KHRoaXMuc3RhY2tzLnJvb3QsIG5vbmVTdHJpbmcpO1xuICAgICAgZm9yRWFjaFJlZihjYXB0dXJlLnJlZnMsICh2aXNpdG9yKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlZiA9IHZpc2l0b3IuZ2V0UmVmKCk7XG4gICAgICAgIGNvbnN0IGlkID0gdmlzaXRvci5pZDtcbiAgICAgICAgbmV3RGF0YVtkYXRhT2Zmc2V0ICsgaWRGaWVsZF0gPSBwYXJzZUludChpZCwgMTYpO1xuICAgICAgICBuZXdEYXRhW2RhdGFPZmZzZXQgKyB0eXBlRmllbGRdID0gdGhpcy5zdHJpbmdzLmludGVybihyZWYudHlwZSk7XG4gICAgICAgIG5ld0RhdGFbZGF0YU9mZnNldCArIHNpemVGaWVsZF0gPSByZWYuc2l6ZTtcbiAgICAgICAgbmV3RGF0YVtkYXRhT2Zmc2V0ICsgdHJhY2VGaWVsZF0gPSBpbnRlcm5lZENhcHR1cmVJZDtcbiAgICAgICAgaWYgKHJlZi5yb290UGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbmV3RGF0YVtkYXRhT2Zmc2V0ICsgcGF0aEZpZWxkXSA9IG5vbmVTdGFjay5pZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdEYXRhW2RhdGFPZmZzZXQgKyBwYXRoRmllbGRdID0gcmVmLnJvb3RQYXRoLmlkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZWYucmVhY3RUcmVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBuZXdEYXRhW2RhdGFPZmZzZXQgKyByZWFjdEZpZWxkXSA9IG5vbmVTdGFjay5pZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdEYXRhW2RhdGFPZmZzZXQgKyByZWFjdEZpZWxkXSA9IHJlZi5yZWFjdFRyZWUuaWQ7XG4gICAgICAgIH1cbiAgICAgICAgbmV3RGF0YVtkYXRhT2Zmc2V0ICsgdmFsdWVGaWVsZF0gPSB0aGlzLnN0cmluZ3MuaW50ZXJuKHZpc2l0b3IuZ2V0VmFsdWUoKSk7XG4gICAgICAgIGlmIChyZWYubW9kdWxlKSB7XG4gICAgICAgICAgbmV3RGF0YVtkYXRhT2Zmc2V0ICsgbW9kdWxlRmllbGRdID0gdGhpcy5zdHJpbmdzLmludGVybihyZWYubW9kdWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdEYXRhW2RhdGFPZmZzZXQgKyBtb2R1bGVGaWVsZF0gPSBub25lU3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIGRhdGFPZmZzZXQgKz0gbnVtRmllbGRzO1xuICAgICAgfSk7XG4gICAgICBmb3IgKGNvbnN0IGlkIGluIGNhcHR1cmUubWFya2VkQmxvY2tzKSB7XG4gICAgICAgIGNvbnN0IGJsb2NrID0gY2FwdHVyZS5tYXJrZWRCbG9ja3NbaWRdO1xuICAgICAgICBuZXdEYXRhW2RhdGFPZmZzZXQgKyBpZEZpZWxkXSA9IHBhcnNlSW50KGlkLCAxNik7XG4gICAgICAgIG5ld0RhdGFbZGF0YU9mZnNldCArIHR5cGVGaWVsZF0gPSB0aGlzLnN0cmluZ3MuaW50ZXJuKCdNYXJrZWQgQmxvY2sgT3ZlcmhlYWQnKTtcbiAgICAgICAgbmV3RGF0YVtkYXRhT2Zmc2V0ICsgc2l6ZUZpZWxkXSA9IGJsb2NrLmNhcGFjaXR5IC0gYmxvY2suc2l6ZTtcbiAgICAgICAgbmV3RGF0YVtkYXRhT2Zmc2V0ICsgdHJhY2VGaWVsZF0gPSBpbnRlcm5lZENhcHR1cmVJZDtcbiAgICAgICAgbmV3RGF0YVtkYXRhT2Zmc2V0ICsgcGF0aEZpZWxkXSA9IG5vbmVTdGFjay5pZDtcbiAgICAgICAgbmV3RGF0YVtkYXRhT2Zmc2V0ICsgcmVhY3RGaWVsZF0gPSBub25lU3RhY2suaWQ7XG4gICAgICAgIG5ld0RhdGFbZGF0YU9mZnNldCArIHZhbHVlRmllbGRdID0gdGhpcy5zdHJpbmdzLmludGVybihcbiAgICAgICAgICAnY2FwYWNpdHk6ICcgKyBibG9jay5jYXBhY2l0eSArXG4gICAgICAgICAgJywgc2l6ZTogJyArIGJsb2NrLnNpemUgK1xuICAgICAgICAgICcsIGdyYW51bGFyaXR5OiAnICsgYmxvY2suY2VsbFNpemVcbiAgICAgICAgKTtcbiAgICAgICAgbmV3RGF0YVtkYXRhT2Zmc2V0ICsgbW9kdWxlRmllbGRdID0gbm9uZVN0cmluZztcbiAgICAgICAgZGF0YU9mZnNldCArPSBudW1GaWVsZHM7XG4gICAgICB9XG4gICAgICB0aGlzLmRhdGEgPSBuZXdEYXRhO1xuICAgIH0sXG4gICAgZ2V0QWdncm93OiBmdW5jdGlvbiBnZXRBZ2dyb3coKSB7XG4gICAgICBjb25zdCBhZ1N0cmluZ3MgPSB0aGlzLnN0cmluZ3M7XG4gICAgICBjb25zdCBhZ1N0YWNrcyA9IHRoaXMuc3RhY2tzLmZsYXR0ZW4oKTtcbiAgICAgIGNvbnN0IGFnRGF0YSA9IHRoaXMuZGF0YTtcbiAgICAgIGNvbnN0IGFnTnVtUm93cyA9IGFnRGF0YS5sZW5ndGggLyBudW1GaWVsZHM7XG4gICAgICBjb25zdCBhZyA9IG5ldyBhZ2dyb3coYWdOdW1Sb3dzKTtcblxuICAgICAgYWcuYWRkRmllbGRFeHBhbmRlcignSWQnLFxuICAgICAgICBmdW5jdGlvbiBnZXRJZChyb3cpIHtcbiAgICAgICAgICBsZXQgaWQgPSBhZ0RhdGFbcm93ICogbnVtRmllbGRzICsgaWRGaWVsZF07XG4gICAgICAgICAgaWYgKGlkIDwgMCkge1xuICAgICAgICAgICAgaWQgKz0gMHgxMDAwMDAwMDA7IC8vIGRhdGEgaXMgaW50MzIsIGlkIGlzIHVpbnQzMlxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gJzB4JyArIGlkLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgfSxcbiAgICAgICAgZnVuY3Rpb24gY29tcGFyZUFkZHJlc3Mocm93QSwgcm93Qikge1xuICAgICAgICAgIHJldHVybiBhZ0RhdGFbcm93QSAqIG51bUZpZWxkcyArIGlkRmllbGRdIC0gYWdEYXRhW3Jvd0IgKiBudW1GaWVsZHMgKyBpZEZpZWxkXTtcbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR5cGVFeHBhbmRlciA9IGFnLmFkZEZpZWxkRXhwYW5kZXIoJ1R5cGUnLFxuICAgICAgICBmdW5jdGlvbiBnZXRUeXBlKHJvdykgeyByZXR1cm4gYWdTdHJpbmdzLmdldChhZ0RhdGFbcm93ICogbnVtRmllbGRzICsgdHlwZUZpZWxkXSk7IH0sXG4gICAgICAgIGZ1bmN0aW9uIGNvbXBhcmVUeXBlKHJvd0EsIHJvd0IpIHtcbiAgICAgICAgICByZXR1cm4gYWdEYXRhW3Jvd0EgKiBudW1GaWVsZHMgKyB0eXBlRmllbGRdIC0gYWdEYXRhW3Jvd0IgKiBudW1GaWVsZHMgKyB0eXBlRmllbGRdO1xuICAgICAgICB9KTtcblxuICAgICAgYWcuYWRkRmllbGRFeHBhbmRlcignU2l6ZScsXG4gICAgICAgIGZ1bmN0aW9uIGdldFNpemUocm93KSB7IHJldHVybiBhZ0RhdGFbcm93ICogbnVtRmllbGRzICsgc2l6ZUZpZWxkXS50b1N0cmluZygpOyB9LFxuICAgICAgICBmdW5jdGlvbiBjb21wYXJlU2l6ZShyb3dBLCByb3dCKSB7XG4gICAgICAgICAgcmV0dXJuIGFnRGF0YVtyb3dBICogbnVtRmllbGRzICsgc2l6ZUZpZWxkXSAtIGFnRGF0YVtyb3dCICogbnVtRmllbGRzICsgc2l6ZUZpZWxkXTtcbiAgICAgICAgfSk7XG5cbiAgICAgIGFnLmFkZEZpZWxkRXhwYW5kZXIoJ1RyYWNlJyxcbiAgICAgICAgZnVuY3Rpb24gZ2V0U2l6ZShyb3cpIHsgcmV0dXJuIGFnU3RyaW5ncy5nZXQoYWdEYXRhW3JvdyAqIG51bUZpZWxkcyArIHRyYWNlRmllbGRdKTsgfSxcbiAgICAgICAgZnVuY3Rpb24gY29tcGFyZVNpemUocm93QSwgcm93Qikge1xuICAgICAgICAgIHJldHVybiBhZ0RhdGFbcm93QSAqIG51bUZpZWxkcyArIHRyYWNlRmllbGRdIC0gYWdEYXRhW3Jvd0IgKiBudW1GaWVsZHMgKyB0cmFjZUZpZWxkXTtcbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHBhdGhFeHBhbmRlciA9IGFnLmFkZENhbGxlZVN0YWNrRXhwYW5kZXIoXG4gICAgICAgICdQYXRoJyxcbiAgICAgICAgYWdTdGFja3MubWF4RGVwdGgsXG4gICAgICAgIGZ1bmN0aW9uIGdldFN0YWNrKHJvdykgeyByZXR1cm4gYWdTdGFja3MuZ2V0KGFnRGF0YVtyb3cgKiBudW1GaWVsZHMgKyBwYXRoRmllbGRdKTsgfSxcbiAgICAgICAgZnVuY3Rpb24gZ2V0RnJhbWUoaWQpIHsgcmV0dXJuIGFnU3RyaW5ncy5nZXQoaWQpOyB9LFxuICAgICAgKTtcblxuICAgICAgY29uc3QgcmVhY3RFeHBhbmRlciA9IGFnLmFkZENhbGxlZVN0YWNrRXhwYW5kZXIoXG4gICAgICAgICdSZWFjdCBUcmVlJyxcbiAgICAgICAgYWdTdGFja3MubWF4RGVwdGgsXG4gICAgICAgIGZ1bmN0aW9uIGdldFN0YWNrKHJvdykgeyByZXR1cm4gYWdTdGFja3MuZ2V0KGFnRGF0YVtyb3cgKiBudW1GaWVsZHMgKyByZWFjdEZpZWxkXSk7IH0sXG4gICAgICAgIGZ1bmN0aW9uIGdldEZyYW1lKGlkKSB7IHJldHVybiBhZ1N0cmluZ3MuZ2V0KGlkKTsgfSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHZhbHVlRXhwYW5kZXIgPSBhZy5hZGRGaWVsZEV4cGFuZGVyKCdWYWx1ZScsXG4gICAgICAgIGZ1bmN0aW9uIGdldFZhbHVlKHJvdykgeyByZXR1cm4gYWdTdHJpbmdzLmdldChhZ0RhdGFbcm93ICogbnVtRmllbGRzICsgdmFsdWVGaWVsZF0pOyB9LFxuICAgICAgICBmdW5jdGlvbiBjb21wYXJlVmFsdWUocm93QSwgcm93Qikge1xuICAgICAgICAgIHJldHVybiBhZ0RhdGFbcm93QSAqIG51bUZpZWxkcyArIHZhbHVlRmllbGRdIC0gYWdEYXRhW3Jvd0IgKiBudW1GaWVsZHMgKyB2YWx1ZUZpZWxkXTtcbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG1vZHVsZUV4cGFuZGVyID0gYWcuYWRkRmllbGRFeHBhbmRlcignTW9kdWxlJyxcbiAgICAgICAgZnVuY3Rpb24gZ2V0TW9kdWxlKHJvdykgeyByZXR1cm4gYWdTdHJpbmdzLmdldChhZ0RhdGFbcm93ICogbnVtRmllbGRzICsgbW9kdWxlRmllbGRdKTsgfSxcbiAgICAgICAgZnVuY3Rpb24gY29tcGFyZU1vZHVsZShyb3dBLCByb3dCKSB7XG4gICAgICAgICAgcmV0dXJuIGFnRGF0YVtyb3dBICogbnVtRmllbGRzICsgbW9kdWxlRmllbGRdIC0gYWdEYXRhW3Jvd0IgKiBudW1GaWVsZHMgKyBtb2R1bGVGaWVsZF07XG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzaXplQWdncmVnYXRvciA9IGFnLmFkZEFnZ3JlZ2F0b3IoJ1NpemUnLFxuICAgICAgICBmdW5jdGlvbiBhZ2dyZWdhdGVTaXplKGluZGljZXMpIHtcbiAgICAgICAgICBsZXQgc2l6ZSA9IDA7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCByb3cgPSBpbmRpY2VzW2ldO1xuICAgICAgICAgICAgc2l6ZSArPSBhZ0RhdGFbcm93ICogbnVtRmllbGRzICsgc2l6ZUZpZWxkXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgICAgIH0sXG4gICAgICAgIGZ1bmN0aW9uIGZvcm1hdFNpemUodmFsdWUpIHsgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7IH0sXG4gICAgICAgIGZ1bmN0aW9uIHNvcnRTaXplKGEsIGIpIHsgcmV0dXJuIGIgLSBhOyB9ICk7XG5cbiAgICAgIGNvbnN0IGNvdW50QWdncmVnYXRvciA9IGFnLmFkZEFnZ3JlZ2F0b3IoJ0NvdW50JyxcbiAgICAgICAgZnVuY3Rpb24gYWdncmVnYXRlQ291bnQoaW5kaWNlcykge1xuICAgICAgICAgIHJldHVybiBpbmRpY2VzLmxlbmd0aDtcbiAgICAgICAgfSxcbiAgICAgICAgZnVuY3Rpb24gZm9ybWF0Q291bnQodmFsdWUpIHsgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7IH0sXG4gICAgICAgIGZ1bmN0aW9uIHNvcnRDb3VudChhLCBiKSB7IHJldHVybiBiIC0gYTsgfSApO1xuXG4gICAgICBhZy5zZXRBY3RpdmVFeHBhbmRlcnMoW1xuICAgICAgICBwYXRoRXhwYW5kZXIsXG4gICAgICAgIHJlYWN0RXhwYW5kZXIsXG4gICAgICAgIG1vZHVsZUV4cGFuZGVyLFxuICAgICAgICB0eXBlRXhwYW5kZXIsXG4gICAgICAgIHZhbHVlRXhwYW5kZXIsXG4gICAgICBdKTtcbiAgICAgIGFnLnNldEFjdGl2ZUFnZ3JlZ2F0b3JzKFtzaXplQWdncmVnYXRvciwgY291bnRBZ2dyZWdhdG9yXSk7XG4gICAgICByZXR1cm4gYWc7XG4gICAgfSxcbiAgfTtcbn1cblxuaWYgKHByZUxvYWRlZENhcHR1cmUpIHtcbiAgY29uc3QgciA9IG5ldyBjYXB0dXJlUmVnaXN0cnkoKTtcbiAgci5yZWdpc3RlcigndHJhY2UnLCBwcmVMb2FkZWRDYXB0dXJlKTtcbiAgcHJlTG9hZGVkQ2FwdHVyZSA9IHVuZGVmaW5lZDsgLy8gbGV0IEdHIGNsZWFuIHVwIHRoZSBjYXB0dXJlXG4gIFJlYWN0RE9NLnJlbmRlcig8VGFibGUgYWdncm93PXtyLmdldEFnZ3JvdygpfSAvPiwgZG9jdW1lbnQuYm9keSk7XG59XG4iXX0= +// @generated diff --git a/local-cli/server/middleware/heapCapture/out/table.js b/local-cli/server/middleware/heapCapture/out/table.js index 50b00eb99..52f752141 100644 --- a/local-cli/server/middleware/heapCapture/out/table.js +++ b/local-cli/server/middleware/heapCapture/out/table.js @@ -546,4 +546,6 @@ document.body.addEventListener('keydown',this.keydown); { document.body.removeEventListener('keydown',this.keydown); -}}]);return Table;}(React.Component);// @generated +}}]);return Table;}(React.Component); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy90YWJsZS5qcyJdLCJuYW1lcyI6WyJyb3dIZWlnaHQiLCJ0cmVlSW5kZW50IiwiRHJhZ2dhYmxlIiwicHJvcHMiLCJpZCIsImRyYWdTdGFydCIsImUiLCJkYXRhVHJhbnNmZXIiLCJzZXREYXRhIiwiUmVhY3QiLCJjbG9uZUVsZW1lbnQiLCJjaGlsZHJlbiIsImRyYWdnYWJsZSIsIm9uRHJhZ1N0YXJ0IiwiQ29tcG9uZW50IiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwiZWxlbWVudCIsImlzUmVxdWlyZWQiLCJzdHJpbmciLCJEcm9wVGFyZ2V0IiwidGhpc0lkIiwiZHJvcEZpbHRlciIsImRyb3BBY3Rpb24iLCJvbkRyYWdPdmVyIiwic291cmNlSWQiLCJnZXREYXRhIiwicHJldmVudERlZmF1bHQiLCJvbkRyb3AiLCJmdW5jIiwiRXhwYW5kZXJDb25maWd1cmF0aW9uIiwiYWdncm93IiwiZXhwYW5kZXIiLCJ0b1N0cmluZyIsIndpZHRoIiwiaGVpZ2h0IiwiYm9yZGVyIiwibWFyZ2luIiwiZ2V0RXhwYW5kZXJOYW1lIiwiVGFibGVDb25maWd1cmF0aW9uIiwic3RhdGUiLCJleHBhbmRlZCIsImV4IiwiZXhwYW5kZXJUZXh0IiwiY29uZmlnIiwiZ2V0RXhwYW5kZXJzIiwibWFwIiwicmVuZGVyRXhwYW5kZXIiLCJkaXNwbGF5IiwiZmxleERpcmVjdGlvbiIsIm92ZXJmbG93IiwiYm9yZGVyTGVmdCIsInNldFN0YXRlIiwib2JqZWN0IiwiVGFibGVIZWFkZXIiLCJhZ2dyZWdhdG9ycyIsImdldEFjdGl2ZUFnZ3JlZ2F0b3JzIiwiZXhwYW5kZXJzIiwiZ2V0QWN0aXZlRXhwYW5kZXJzIiwiaGVhZGVycyIsImkiLCJsZW5ndGgiLCJuYW1lIiwiZ2V0QWdncmVnYXRvck5hbWUiLCJwdXNoIiwicyIsInN0YXJ0c1dpdGgiLCJiYWNrZ3JvdW5kQ29sb3IiLCJmbGV4U2hyaW5rIiwidGV4dEFsaWduIiwiYmciLCJzZXAiLCJhbGlnbkl0ZW1zIiwiYm9yZGVyQm90dG9tIiwiVGFibGUiLCJ2aWV3cG9ydCIsInRvcCIsImN1cnNvciIsInRhcmdldCIsIk1hdGgiLCJmbG9vciIsInNjcm9sbFRvcCIsImNsaWVudEhlaWdodCIsImNlaWwiLCJyb3ciLCJuZXdDdXJzb3IiLCJjb250cmFjdCIsImNvbnNvbGUiLCJsb2ciLCJleHBhbmQiLCJfc2Nyb2xsRGl2Iiwic2Nyb2xsRGl2IiwiZ2V0Um93cyIsImtleUNvZGUiLCJfa2VlcEN1cnNvckluVmlld3BvcnQiLCJnZXRIZWlnaHQiLCJjYW5Db250cmFjdCIsIl9jb250cmFjdFJvdyIsImdldFJvd0luZGVudCIsImluZGVudCIsImNhbkV4cGFuZCIsIl9leHBhbmRSb3ciLCJkIiwic0luZGV4IiwicGFyc2VJbnQiLCJzdWJzdHIiLCJkSW5kZXgiLCJhY3RpdmUiLCJkcmFnZ2VkIiwic3BsaWNlIiwic2V0QWN0aXZlQWdncmVnYXRvcnMiLCJzZXRBY3RpdmVFeHBhbmRlcnMiLCJzRXhwYW5kZXIiLCJzdWJzdHJpbmciLCJmbGV4R3JvdyIsInNjcm9sbCIsImRpdiIsInBvc2l0aW9uIiwicmVuZGVyVmlydHVhbGl6ZWRSb3dzIiwicm93cyIsInJlbmRlclJvdyIsImNoaWxkIiwiY29sdW1ucyIsInJvd1RleHQiLCJhZ2dyZWdhdGVzIiwicGFyZW50IiwiYWdncmVnYXRlIiwiZ2V0Um93QWdncmVnYXRlIiwibWFyZ2luTGVmdCIsImdldFJvd0xhYmVsIiwid2hpdGVTcGFjZSIsIm1hcmdpblJpZ2h0Iiwia2V5ZG93biIsImJpbmQiLCJkb2N1bWVudCIsImJvZHkiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztBQVNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLEdBQU1BLFdBQVksRUFBbEI7QUFDQSxHQUFNQyxZQUFhLEVBQW5CLEM7O0FBRU1DLFMsa0VBQW9DO0FBQ3hDLG1CQUFZQyxLQUFaLENBQW1CO0FBQ1hBLEtBRFc7QUFFbEIs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QUM1RSxVQUFZb0YsSUFBSVIsR0FBakIsRUFBc0IzQyxRQUF0QixHQUFtQyxJQUhuQztBQUlMZSxRQUFTLE1BSko7QUFLTEMsY0FBZSxLQUxWO0FBTUx1QixXQUFZLFFBTlA7QUFPTEwsZ0JBQWlCRyxFQVBaO0FBUUxHLGFBQWMsZ0JBUlQsQ0FGVDs7QUFZRSxRQUFVLGtCQUFNO0FBQ2QsUUFBS3JCLFFBQUwsQ0FBYyxDQUFDeUIsT0FBUU8sSUFBSVIsR0FBYixDQUFkO0FBQ0QsQ0FkSDtBQWVHOEMsT0FmSCxDQURGOzs7QUFtQkQsQzs7QUFFbUI7QUFDbEIsS0FBS1UsT0FBTCxDQUFlLEtBQUtBLE9BQUwsQ0FBYUMsSUFBYixDQUFrQixJQUFsQixDQUFmO0FBQ0FDLFNBQVNDLElBQVQsQ0FBY0MsZ0JBQWQsQ0FBK0IsU0FBL0IsQ0FBMEMsS0FBS0osT0FBL0M7QUFDRCxDOztBQUVzQjtBQUNyQkUsU0FBU0MsSUFBVCxDQUFjRSxtQkFBZCxDQUFrQyxTQUFsQyxDQUE2QyxLQUFLTCxPQUFsRDtBQUNELEMsbUJBelRpQjNILE1BQU1LLFMiLCJmaWxlIjoidGFibGUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNi1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuLyplc2xpbnQgbm8tY29uc29sZS1kaXNhbGxvdzogXCJvZmZcIiovXG4vKmdsb2JhbCBSZWFjdDp0cnVlKi9cblxuLy8gVE9ETzpcbi8vIHNlbGVjdGlvbiBhbmQgYXJyb3cga2V5cyBmb3IgbmF2aWdhdGluZ1xuXG5jb25zdCByb3dIZWlnaHQgPSAyMDtcbmNvbnN0IHRyZWVJbmRlbnQgPSAxNjtcblxuY2xhc3MgRHJhZ2dhYmxlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBpZCA9IHRoaXMucHJvcHMuaWQ7XG4gICAgZnVuY3Rpb24gZHJhZ1N0YXJ0KGUpIHtcbiAgICAgIGUuZGF0YVRyYW5zZmVyLnNldERhdGEoJ3RleHQvcGxhaW4nLCBpZCk7XG4gICAgfVxuICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQoXG4gICAgICB0aGlzLnByb3BzLmNoaWxkcmVuLFxuICAgICAgeyBkcmFnZ2FibGU6ICd0cnVlJywgb25EcmFnU3RhcnQ6IGRyYWdTdGFydCB9XG4gICAgKTtcbiAgfVxufVxuRHJhZ2dhYmxlLnByb3BUeXBlcyA9IHtcbiAgY2hpbGRyZW46IFJlYWN0LlByb3BUeXBlcy5lbGVtZW50LmlzUmVxdWlyZWQsXG4gIGlkOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG59O1xuXG5jbGFzcyBEcm9wVGFyZ2V0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB0aGlzSWQgPSB0aGlzLnByb3BzLmlkO1xuICAgIGNvbnN0IGRyb3BGaWx0ZXIgPSB0aGlzLnByb3BzLmRyb3BGaWx0ZXI7XG4gICAgY29uc3QgZHJvcEFjdGlvbiA9IHRoaXMucHJvcHMuZHJvcEFjdGlvbjtcbiAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KFxuICAgICAgdGhpcy5wcm9wcy5jaGlsZHJlbixcbiAgICAgIHtcbiAgICAgICAgb25EcmFnT3ZlcjogKGUpID0+IHtcbiAgICAgICAgICBjb25zdCBzb3VyY2VJZCA9IGUuZGF0YVRyYW5zZmVyLmdldERhdGEoJ3RleHQvcGxhaW4nKTtcbiAgICAgICAgICBpZiAoZHJvcEZpbHRlcihzb3VyY2VJZCkpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9uRHJvcDogKGUpID0+IHtcbiAgICAgICAgICBjb25zdCBzb3VyY2VJZCA9IGUuZGF0YVRyYW5zZmVyLmdldERhdGEoJ3RleHQvcGxhaW4nKTtcbiAgICAgICAgICBpZiAoZHJvcEZpbHRlcihzb3VyY2VJZCkpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGRyb3BBY3Rpb24oc291cmNlSWQsIHRoaXNJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuRHJvcFRhcmdldC5wcm9wVHlwZXMgPSB7XG4gIGNoaWxkcmVuOiBSZWFjdC5Qcm9wVHlwZXMuZWxlbWVudC5pc1JlcXVpcmVkLFxuICBpZDogUmVhY3QuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICBkcm9wRmlsdGVyOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBkcm9wQWN0aW9uOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxufTtcblxuY2xhc3MgRXhwYW5kZXJDb25maWd1cmF0aW9uIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IGFnZ3JvdyA9IHRoaXMucHJvcHMuYWdncm93O1xuICAgIGNvbnN0IGV4cGFuZGVyID0gdGhpcy5wcm9wcy5leHBhbmRlcjtcbiAgICByZXR1cm4gKFxuICAgICAgPERyYWdnYWJsZSBpZD17J2V4cGFuZGVyOmFkZDonICsgZXhwYW5kZXIudG9TdHJpbmcoKX0+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgd2lkdGg6ICdhdXRvJyxcbiAgICAgICAgICAgIGhlaWdodDogJzI2cHgnLFxuICAgICAgICAgICAgYm9yZGVyOiAnMXB4IHNvbGlkIGRhcmtHcmF5JyxcbiAgICAgICAgICAgIG1hcmdpbjogJzJweCcsXG4gICAgICAgICAgfX0+XG4gICAgICAgICAge2FnZ3Jvdy5nZXRFeHBhbmRlck5hbWUoZXhwYW5kZXIpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvRHJhZ2dhYmxlPlxuICAgICk7XG4gIH1cbn1cblxuY2xhc3MgVGFibGVDb25maWd1cmF0aW9uIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGV4cGFuZGVkOiBmYWxzZSxcbiAgICB9O1xuICB9XG4gIHJlbmRlckV4cGFuZGVyKGV4KSB7XG4gICAgcmV0dXJuICg8RXhwYW5kZXJDb25maWd1cmF0aW9uIGFnZ3Jvdz17dGhpcy5wcm9wcy5hZ2dyb3d9IGV4cGFuZGVyPXtleH0gLz4pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBleHBhbmRlclRleHQgPSB0aGlzLnN0YXRlLmV4cGFuZGVkID8gJz4+JyA6ICc8PCc7XG4gICAgY29uc3QgYWdncm93ID0gdGhpcy5wcm9wcy5hZ2dyb3c7XG4gICAgbGV0IGNvbmZpZyA9IFtdO1xuICAgIGlmICh0aGlzLnN0YXRlLmV4cGFuZGVkKSB7XG4gICAgICBjb25maWcgPSBhZ2dyb3cuZ2V0RXhwYW5kZXJzKCkubWFwKChleCkgPT4gdGhpcy5yZW5kZXJFeHBhbmRlcihleCkpO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBzdHlsZT17e1xuICAgICAgICAgIHdpZHRoOiB0aGlzLnN0YXRlLmV4cGFuZGVkID8gJzUxMnB4JyA6ICcyNnB4JyxcbiAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsXG4gICAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICAgIGJvcmRlckxlZnQ6ICcycHggc29saWQgYmxhY2snLFxuICAgICAgICB9fT5cbiAgICAgICAgPGRpdiBzdHlsZT17e1xuICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICAgIGhlaWdodDogJzI2cHgnLFxuICAgICAgICAgICAgYm9yZGVyOiAnMXB4IHNvbGlkIGRhcmtHcmF5JyxcbiAgICAgICAgICB9fVxuICAgICAgICAgIG9uQ2xpY2s9eyAoZSkgPT4gdGhpcy5zZXRTdGF0ZSh7ZXhwYW5kZWQ6ICF0aGlzLnN0YXRlLmV4cGFuZGVkfSkgfT5cbiAgICAgICAgICB7IGV4cGFuZGVyVGV4dCB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB7IGNvbmZpZyB9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5cblRhYmxlQ29uZmlndXJhdGlvbi5wcm9wVHlwZXMgPSB7XG4gIGFnZ3JvdzogUmVhY3QuUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxufTtcblxuY2xhc3MgVGFibGVIZWFkZXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgYWdncm93ID0gdGhpcy5wcm9wcy5hZ2dyb3c7XG4gICAgY29uc3QgYWdncmVnYXRvcnMgPSBhZ2dyb3cuZ2V0QWN0aXZlQWdncmVnYXRvcnMoKTtcbiAgICBjb25zdCBleHBhbmRlcnMgPSBhZ2dyb3cuZ2V0QWN0aXZlRXhwYW5kZXJzKCk7XG4gICAgY29uc3QgaGVhZGVycyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWdncmVnYXRvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBhZ2dyb3cuZ2V0QWdncmVnYXRvck5hbWUoYWdncmVnYXRvcnNbaV0pO1xuICAgICAgaGVhZGVycy5wdXNoKChcbiAgICAgICAgPERyb3BUYXJnZXRcbiAgICAgICAgICBpZD17J2FnZ3JlZ2F0ZTppbnNlcnQ6JyArIGkudG9TdHJpbmcoKX1cbiAgICAgICAgICBkcm9wRmlsdGVyPXsocykgPT4gcy5zdGFydHNXaXRoKCdhZ2dyZWdhdGUnKX1cbiAgICAgICAgICBkcm9wQWN0aW9uPXt0aGlzLnByb3BzLmRyb3BBY3Rpb259XG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IHN0eWxlPXt7XG4gICAgICAgICAgICB3aWR0aDogJzE2cHgnLFxuICAgICAgICAgICAgaGVpZ2h0OiAnaW5oZXJpdCcsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdkYXJrR3JheScsXG4gICAgICAgICAgICBmbGV4U2hyaW5rOiAnMCcgfX1cbiAgICAgICAgICA+PC9kaXY+XG4gICAgICAgIDwvRHJvcFRhcmdldD4pKTtcbiAgICAgIGhlYWRlcnMucHVzaCgoPERyYWdnYWJsZSBpZD17J2FnZ3JlZ2F0ZTphY3RpdmU6JyArIGkudG9TdHJpbmcoKX0+XG4gICAgICAgICAgPGRpdiBzdHlsZT17eyB3aWR0aDogJzEyOHB4JywgdGV4dEFsaWduOiAnY2VudGVyJywgZmxleFNocmluazogJzAnIH19PntuYW1lfTwvZGl2PlxuICAgICAgICA8L0RyYWdnYWJsZT4pKTtcbiAgICB9XG4gICAgaGVhZGVycy5wdXNoKChcbiAgICAgIDxEcm9wVGFyZ2V0XG4gICAgICAgIGlkPVwiZGl2aWRlcjppbnNlcnRcIlxuICAgICAgICBkcm9wRmlsdGVyPXsocykgPT4gcy5zdGFydHNXaXRoKCdhZ2dyZWdhdGUnKSB8fCBzLnN0YXJ0c1dpdGgoJ2V4cGFuZGVyJyl9XG4gICAgICAgIGRyb3BBY3Rpb249e3RoaXMucHJvcHMuZHJvcEFjdGlvbn1cbiAgICAgID5cbiAgICAgICAgPGRpdiBzdHlsZT17e1xuICAgICAgICAgIHdpZHRoOiAnMTZweCcsXG4gICAgICAgICAgaGVpZ2h0OiAnaW5oZXJpdCcsXG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnZ29sZCcsXG4gICAgICAgICAgZmxleFNocmluazogJzAnXG4gICAgICAgIH19PjwvZGl2PlxuICAgICAgPC9Ecm9wVGFyZ2V0PikpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwYW5kZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBuYW1lID0gYWdncm93LmdldEV4cGFuZGVyTmFtZShleHBhbmRlcnNbaV0pO1xuICAgICAgY29uc3QgYmcgPSAoaSAlIDIgPT09IDApID8gJ3doaXRlJyA6ICdsaWdodEdyYXknO1xuICAgICAgaGVhZGVycy5wdXNoKCg8RHJhZ2dhYmxlIGlkPXsnZXhwYW5kZXI6YWN0aXZlOicgKyBpLnRvU3RyaW5nKCl9PlxuICAgICAgICAgIDxkaXYgc3R5bGU9e3tcbiAgICAgICAgICAgIHdpZHRoOiAnMTI4cHgnLFxuICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogYmcsXG4gICAgICAgICAgICBmbGV4U2hyaW5rOiAnMCdcbiAgICAgICAgICB9fT5cbiAgICAgICAgICAgIHtuYW1lfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L0RyYWdnYWJsZT4pKTtcbiAgICAgIGNvbnN0IHNlcCA9IGkgKyAxIDwgZXhwYW5kZXJzLmxlbmd0aCA/ICctPicgOiAnLi4uJztcbiAgICAgIGhlYWRlcnMucHVzaCgoXG4gICAgICAgIDxEcm9wVGFyZ2V0XG4gICAgICAgICAgaWQ9eydleHBhbmRlcjppbnNlcnQ6JyArIChpICsgMSkudG9TdHJpbmcoKX1cbiAgICAgICAgICBkcm9wRmlsdGVyPXsoKT0+e3JldHVybiB0cnVlOyB9fVxuICAgICAgICAgIGRyb3BBY3Rpb249e3RoaXMucHJvcHMuZHJvcEFjdGlvbn1cbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgc3R5bGU9e3tcbiAgICAgICAgICAgIGhlaWdodDogJ2luaGVyaXQnLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnZGFya0dyYXknLFxuICAgICAgICAgICAgZmxleFNocmluazogJzAnXG4gICAgICAgICAgfX0+XG4gICAgICAgICAgICB7c2VwfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L0Ryb3BUYXJnZXQ+KVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgc3R5bGU9e3tcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgaGVpZ2h0OiAnMjZweCcsXG4gICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgZmxleERpcmVjdGlvbjogJ3JvdycsXG4gICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICBib3JkZXJCb3R0b206ICcycHggc29saWQgYmxhY2snLFxuICAgICAgfX0+XG4gICAgICAgIHtoZWFkZXJzfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxufVxuXG5UYWJsZUhlYWRlci5wcm9wVHlwZXMgPSB7XG4gIGFnZ3JvdzogUmVhY3QuUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICBkcm9wQWN0aW9uOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxufTtcblxuY2xhc3MgVGFibGUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBhZ2dyb3c6IHByb3BzLmFnZ3JvdyxcbiAgICAgIHZpZXdwb3J0OiB7IHRvcDogMCwgaGVpZ2h0OiAxMDAgfSxcbiAgICAgIGN1cnNvcjogMCxcbiAgICB9O1xuICB9XG5cbiAgc2Nyb2xsKGUpIHtcbiAgICBjb25zdCB2aWV3cG9ydCA9IGUudGFyZ2V0O1xuICAgIGNvbnN0IHRvcCA9IE1hdGguZmxvb3IoKHZpZXdwb3J0LnNjcm9sbFRvcCAtIHZpZXdwb3J0LmNsaWVudEhlaWdodCAqIDEuMCkgLyByb3dIZWlnaHQpO1xuICAgIGNvbnN0IGhlaWdodCA9IE1hdGguY2VpbCh2aWV3cG9ydC5jbGllbnRIZWlnaHQgKiAzLjAgLyByb3dIZWlnaHQpO1xuICAgIGlmICh0b3AgIT09IHRoaXMuc3RhdGUudmlld3BvcnQudG9wIHx8IGhlaWdodCAhPT0gdGhpcy5zdGF0ZS52aWV3cG9ydC5oZWlnaHQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe3ZpZXdwb3J0OiB7dG9wLCBoZWlnaHR9fSk7XG4gICAgfVxuICB9XG5cbiAgX2NvbnRyYWN0Um93KHJvdykge1xuICAgIGxldCBuZXdDdXJzb3IgPSB0aGlzLnN0YXRlLmN1cnNvcjtcbiAgICBpZiAobmV3Q3Vyc29yID4gcm93LnRvcCAmJiBuZXdDdXJzb3IgPCByb3cudG9wICsgcm93LmhlaWdodCkgeyAvLyBpbiBjb250cmFjdGVkIHNlY3Rpb25cbiAgICAgIG5ld0N1cnNvciA9IHJvdy50b3A7XG4gICAgfSBlbHNlIGlmIChuZXdDdXJzb3IgPj0gcm93LnRvcCArIHJvdy5oZWlnaHQpIHsgLy8gYmVsb3cgY29udHJhY3RlZCBzZWN0aW9uXG4gICAgICBuZXdDdXJzb3IgLT0gcm93LmhlaWdodCAtIDE7XG4gICAgfVxuICAgIHRoaXMuc3RhdGUuYWdncm93LmNvbnRyYWN0KHJvdyk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7Y3Vyc29yOiBuZXdDdXJzb3J9KTtcbiAgICBjb25zb2xlLmxvZygnLScgKyByb3cudG9wKTtcbiAgfVxuXG4gIF9leHBhbmRSb3cocm93KSB7XG4gICAgbGV0IG5ld0N1cnNvciA9IHRoaXMuc3RhdGUuY3Vyc29yO1xuICAgIHRoaXMuc3RhdGUuYWdncm93LmV4cGFuZChyb3cpO1xuICAgIGlmIChuZXdDdXJzb3IgPiByb3cudG9wKSB7ICAvLyBiZWxvdyBleHBhbmRlZCBzZWN0aW9uXG4gICAgICBuZXdDdXJzb3IgKz0gcm93LmhlaWdodCAtIDE7XG4gICAgfVxuICAgIHRoaXMuc2V0U3RhdGUoe2N1cnNvcjogbmV3Q3Vyc29yfSk7XG4gICAgY29uc29sZS5sb2coJysnICsgcm93LnRvcCk7XG4gIH1cblxuICBfc2Nyb2xsRGl2OiBudWxsO1xuXG4gIF9rZWVwQ3Vyc29ySW5WaWV3cG9ydCgpIHtcbiAgICBpZiAodGhpcy5fc2Nyb2xsRGl2KSB7XG4gICAgICBjb25zdCBjdXJzb3IgPSB0aGlzLnN0YXRlLmN1cnNvcjtcbiAgICAgIGNvbnN0IHNjcm9sbERpdiA9IHRoaXMuX3Njcm9sbERpdjtcbiAgICAgIGlmIChjdXJzb3IgKiByb3dIZWlnaHQgPCBzY3JvbGxEaXYuc2Nyb2xsVG9wICsgc2Nyb2xsRGl2LmNsaWVudEhlaWdodCAqIDAuMSkge1xuICAgICAgICBzY3JvbGxEaXYuc2Nyb2xsVG9wID0gY3Vyc29yICogcm93SGVpZ2h0IC0gc2Nyb2xsRGl2LmNsaWVudEhlaWdodCAqIDAuMTtcbiAgICAgIH0gZWxzZSBpZiAoKGN1cnNvciArIDEpICogcm93SGVpZ2h0ID4gc2Nyb2xsRGl2LnNjcm9sbFRvcCArIHNjcm9sbERpdi5jbGllbnRIZWlnaHQgKiAwLjkpIHtcbiAgICAgICAgc2Nyb2xsRGl2LnNjcm9sbFRvcCA9IChjdXJzb3IgKyAxKSAqIHJvd0hlaWdodCAtIHNjcm9sbERpdi5jbGllbnRIZWlnaHQgKiAwLjk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAga2V5ZG93bihlKSB7XG4gICAgY29uc3QgYWdncm93ID0gdGhpcy5zdGF0ZS5hZ2dyb3c7XG4gICAgbGV0IGN1cnNvciA9IHRoaXMuc3RhdGUuY3Vyc29yO1xuICAgIGxldCByb3cgPSBhZ2dyb3cuZ2V0Um93cyhjdXJzb3IsIDEpWzBdO1xuICAgIHN3aXRjaCAoZS5rZXlDb2RlKSB7XG4gICAgICBjYXNlIDM4OiAvLyB1cFxuICAgICAgICBpZiAoY3Vyc29yID4gMCkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2N1cnNvcjogY3Vyc29yIC0gMX0pO1xuICAgICAgICAgIHRoaXMuX2tlZXBDdXJzb3JJblZpZXdwb3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDA6IC8vIGRvd25cbiAgICAgICAgaWYgKGN1cnNvciA8IGFnZ3Jvdy5nZXRIZWlnaHQoKSAtIDEpIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtjdXJzb3I6IGN1cnNvciArIDF9KTtcbiAgICAgICAgICB0aGlzLl9rZWVwQ3Vyc29ySW5WaWV3cG9ydCgpO1xuICAgICAgICB9XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM3OiAvLyBsZWZ0XG4gICAgICAgIGlmIChhZ2dyb3cuY2FuQ29udHJhY3Qocm93KSkge1xuICAgICAgICAgIHRoaXMuX2NvbnRyYWN0Um93KHJvdyk7XG4gICAgICAgIH0gZWxzZSBpZiAoYWdncm93LmdldFJvd0luZGVudChyb3cpID4gMCkge1xuICAgICAgICAgIGNvbnN0IGluZGVudCA9IGFnZ3Jvdy5nZXRSb3dJbmRlbnQocm93KSAtIDE7XG4gICAgICAgICAgd2hpbGUgKGFnZ3Jvdy5nZXRSb3dJbmRlbnQocm93KSA+IGluZGVudCkge1xuICAgICAgICAgICAgY3Vyc29yLS07XG4gICAgICAgICAgICByb3cgPSBhZ2dyb3cuZ2V0Um93cyhjdXJzb3IsIDEpWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtjdXJzb3I6IGN1cnNvcn0pO1xuICAgICAgICAgIHRoaXMuX2tlZXBDdXJzb3JJblZpZXdwb3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzk6IC8vIHJpZ2h0XG4gICAgICAgIGlmIChhZ2dyb3cuY2FuRXhwYW5kKHJvdykpIHtcbiAgICAgICAgICB0aGlzLl9leHBhbmRSb3cocm93KTtcbiAgICAgICAgfSBlbHNlIGlmIChjdXJzb3IgPCBhZ2dyb3cuZ2V0SGVpZ2h0KCkgLSAxKSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7Y3Vyc29yOiBjdXJzb3IgKyAxfSk7XG4gICAgICAgICAgdGhpcy5fa2VlcEN1cnNvckluVmlld3BvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGRyb3BBY3Rpb24ocywgZCkge1xuICAgIGNvbnN0IGFnZ3JvdyA9IHRoaXMuc3RhdGUuYWdncm93O1xuICAgIGNvbnNvbGUubG9nKCdkcm9wcGVkICcgKyBzICsgJyB0byAnICsgZCk7XG4gICAgaWYgKHMuc3RhcnRzV2l0aCgnYWdncmVnYXRlOmFjdGl2ZTonKSkge1xuICAgICAgY29uc3Qgc0luZGV4ID0gcGFyc2VJbnQocy5zdWJzdHIoMTcpLCAxMCk7XG4gICAgICBsZXQgZEluZGV4ID0gLTE7XG4gICAgICBjb25zdCBhY3RpdmUgPSBhZ2dyb3cuZ2V0QWN0aXZlQWdncmVnYXRvcnMoKTtcbiAgICAgIGNvbnN0IGRyYWdnZWQgPSBhY3RpdmVbc0luZGV4XTtcbiAgICAgIGlmIChkLnN0YXJ0c1dpdGgoJ2FnZ3JlZ2F0ZTppbnNlcnQ6JykpIHtcbiAgICAgICAgZEluZGV4ID0gcGFyc2VJbnQoZC5zdWJzdHIoMTcpLCAxMCk7XG4gICAgICB9IGVsc2UgaWYgKGQgPT09ICdkaXZpZGVyOmluc2VydCcpIHtcbiAgICAgICAgZEluZGV4ID0gYWN0aXZlLmxlbmd0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93ICdub3QgYWxsb3dlZCB0byBkcmFnICcgKyBzICsgJyB0byAnICsgZDtcbiAgICAgIH1cbiAgICAgIGlmIChkSW5kZXggPiBzSW5kZXgpIHtcbiAgICAgICAgZEluZGV4LS07XG4gICAgICB9XG4gICAgICBhY3RpdmUuc3BsaWNlKHNJbmRleCwgMSk7XG4gICAgICBhY3RpdmUuc3BsaWNlKGRJbmRleCwgMCwgZHJhZ2dlZCk7XG4gICAgICBhZ2dyb3cuc2V0QWN0aXZlQWdncmVnYXRvcnMoYWN0aXZlKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe2N1cnNvcjowfSk7XG4gICAgfSBlbHNlIGlmIChzLnN0YXJ0c1dpdGgoJ2V4cGFuZGVyOmFjdGl2ZTonKSkge1xuICAgICAgY29uc3Qgc0luZGV4ID0gcGFyc2VJbnQocy5zdWJzdHIoMTYpLCAxMCk7XG4gICAgICBsZXQgZEluZGV4ID0gLTE7XG4gICAgICBjb25zdCBhY3RpdmUgPSBhZ2dyb3cuZ2V0QWN0aXZlRXhwYW5kZXJzKCk7XG4gICAgICBjb25zdCBkcmFnZ2VkID0gYWN0aXZlW3NJbmRleF07XG4gICAgICBpZiAoZC5zdGFydHNXaXRoKCdleHBhbmRlcjppbnNlcnQ6JykpIHtcbiAgICAgICAgZEluZGV4ID0gcGFyc2VJbnQoZC5zdWJzdHIoMTYpLCAxMCk7XG4gICAgICB9IGVsc2UgaWYgKGQgPT09ICdkaXZpZGVyOmluc2VydCcpIHtcbiAgICAgICAgZEluZGV4ID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93ICdub3QgYWxsb3dlZCB0byBkcmFnICcgKyBzICsgJyB0byAnICsgZDtcbiAgICAgIH1cbiAgICAgIGlmIChkSW5kZXggPiBzSW5kZXgpIHtcbiAgICAgICAgZEluZGV4LS07XG4gICAgICB9XG4gICAgICBhY3RpdmUuc3BsaWNlKHNJbmRleCwgMSk7XG4gICAgICBhY3RpdmUuc3BsaWNlKGRJbmRleCwgMCwgZHJhZ2dlZCk7XG4gICAgICBhZ2dyb3cuc2V0QWN0aXZlRXhwYW5kZXJzKGFjdGl2ZSk7XG4gICAgICB0aGlzLnNldFN0YXRlKHtjdXJzb3I6MH0pO1xuICAgIH0gZWxzZSBpZiAocy5zdGFydHNXaXRoKCdleHBhbmRlcjphZGQ6JykpIHtcbiAgICAgIGxldCBkSW5kZXggPSAtMTtcbiAgICAgIGNvbnN0IHNFeHBhbmRlciA9IHBhcnNlSW50KHMuc3Vic3RyaW5nKDEzKSwgMTApO1xuICAgICAgaWYgKGQuc3RhcnRzV2l0aCgnZXhwYW5kZXI6aW5zZXJ0OicpKSB7XG4gICAgICAgIGRJbmRleCA9IHBhcnNlSW50KGQuc3Vic3RyKDE2KSwgMTApO1xuICAgICAgfSBlbHNlIGlmIChkID09PSAnZGl2aWRlcjppbnNlcnQnKSB7XG4gICAgICAgIGRJbmRleCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyAnbm90IGFsbG93ZWQgdG8gZHJhZyAnICsgcyArICcgdG8gJyArIGQ7XG4gICAgICB9XG4gICAgICBjb25zdCBhY3RpdmUgPSBhZ2dyb3cuZ2V0QWN0aXZlRXhwYW5kZXJzKCk7XG4gICAgICBhY3RpdmUuc3BsaWNlKGRJbmRleCwgMCwgc0V4cGFuZGVyKTtcbiAgICAgIGFnZ3Jvdy5zZXRBY3RpdmVFeHBhbmRlcnMoYWN0aXZlKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe2N1cnNvcjowfSk7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IHN0eWxlPXt7IHdpZHRoOiAnMTAwJScsIGhlaWdodDogJzEwMCUnLCBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdyb3cnIH19PlxuICAgICAgICA8ZGl2IHN0eWxlPXt7IHdpZHRoOiAnMTAwJScsIGhlaWdodDogJzEwMCUnLCBkaXNwbGF5OiAnZmxleCcsIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLCBvdmVyZmxvdzogJ2hpZGRlbicsIH19PlxuICAgICAgICAgIDxUYWJsZUhlYWRlciBhZ2dyb3c9e3RoaXMuc3RhdGUuYWdncm93fSBkcm9wQWN0aW9uPXsocywgZCkgPT4gdGhpcy5kcm9wQWN0aW9uKHMsIGQpfSAvPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgICAgIGZsZXhHcm93OiAnMScsXG4gICAgICAgICAgICAgIG92ZXJmbG93OiAnc2Nyb2xsJ1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIG9uU2Nyb2xsPXsgKGUpID0+IHRoaXMuc2Nyb2xsKGUpIH1cbiAgICAgICAgICAgIHJlZj17KGRpdikgPT4geyB0aGlzLl9zY3JvbGxEaXYgPSBkaXY7IH0gfT5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9e3sgcG9zaXRpb246ICdyZWxhdGl2ZScgfX0+XG4gICAgICAgICAgICAgIHsgdGhpcy5yZW5kZXJWaXJ0dWFsaXplZFJvd3MoKSB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxUYWJsZUNvbmZpZ3VyYXRpb24gYWdncm93PXt0aGlzLnN0YXRlLmFnZ3Jvd30gLz5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cblxuICByZW5kZXJWaXJ0dWFsaXplZFJvd3MoKSB7XG4gICAgY29uc3QgYWdncm93ID0gdGhpcy5zdGF0ZS5hZ2dyb3c7XG4gICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLnN0YXRlLnZpZXdwb3J0O1xuICAgIGNvbnN0IHJvd3MgPSBhZ2dyb3cuZ2V0Um93cyh2aWV3cG9ydC50b3AsIHZpZXdwb3J0LmhlaWdodCk7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgc3R5bGU9e3tcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgIGhlaWdodDogKHJvd0hlaWdodCAqIChhZ2dyb3cuZ2V0SGVpZ2h0KCkgKyAyMCkpLnRvU3RyaW5nKCkgKyAncHgnXG4gICAgICB9fT5cbiAgICAgICAgeyByb3dzLm1hcChjaGlsZCA9PiB0aGlzLnJlbmRlclJvdyhjaGlsZCkpIH1cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cblxuICByZW5kZXJSb3cocm93KSB7XG4gICAgaWYgKHJvdyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGxldCBiZyA9ICdsaWdodEdyYXknO1xuICAgIGNvbnN0IGFnZ3JvdyA9IHRoaXMuc3RhdGUuYWdncm93O1xuICAgIGNvbnN0IGNvbHVtbnMgPSBbXTtcbiAgICBsZXQgcm93VGV4dCA9ICcnO1xuICAgIGNvbnN0IGluZGVudCA9IDQgKyBhZ2dyb3cuZ2V0Um93SW5kZW50KHJvdykgKiB0cmVlSW5kZW50O1xuICAgIGNvbnN0IGFnZ3JlZ2F0ZXMgPSBhZ2dyb3cuZ2V0QWN0aXZlQWdncmVnYXRvcnMoKTtcbiAgICBpZiAocm93LnBhcmVudCAhPT0gbnVsbCAmJiAocm93LnBhcmVudC5leHBhbmRlciAlIDIgPT09IDApKSB7XG4gICAgICBiZyA9ICd3aGl0ZSc7XG4gICAgfVxuICAgIGlmIChyb3cudG9wID09PSB0aGlzLnN0YXRlLmN1cnNvcikge1xuICAgICAgYmcgPSAnbGlnaHRibHVlJztcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZ2dyZWdhdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYWdncmVnYXRlID0gYWdncm93LmdldFJvd0FnZ3JlZ2F0ZShyb3csIGkpO1xuICAgICAgY29sdW1ucy5wdXNoKChcbiAgICAgICAgPGRpdiBzdHlsZT17e1xuICAgICAgICAgIHdpZHRoOiAnMTZweCcsXG4gICAgICAgICAgaGVpZ2h0OiAnaW5oZXJpdCcsXG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnZGFya0dyYXknLFxuICAgICAgICAgIGZsZXhTaHJpbms6ICcwJ1xuICAgICAgICB9fT48L2Rpdj5cbiAgICAgICkpO1xuICAgICAgY29sdW1ucy5wdXNoKChcbiAgICAgICAgPGRpdiBzdHlsZT17e1xuICAgICAgICAgIHdpZHRoOiAnMTI4cHgnLFxuICAgICAgICAgIHRleHRBbGlnbjogJ3JpZ2h0JyxcbiAgICAgICAgICBmbGV4U2hyaW5rOiAnMCdcbiAgICAgICAgfX0+XG4gICAgICAgICAge2FnZ3JlZ2F0ZX1cbiAgICAgICAgPC9kaXY+XG4gICAgICApKTtcbiAgICB9XG4gICAgY29sdW1ucy5wdXNoKChcbiAgICAgIDxkaXYgc3R5bGU9e3tcbiAgICAgICAgd2lkdGg6ICcxNnB4JyxcbiAgICAgICAgaGVpZ2h0OiAnaW5oZXJpdCcsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJ2dvbGQnLFxuICAgICAgICBmbGV4U2hyaW5rOiAnMCdcbiAgICAgIH19PjwvZGl2PlxuICAgICkpO1xuICAgIGlmIChhZ2dyb3cuY2FuRXhwYW5kKHJvdykpIHtcbiAgICAgIGNvbHVtbnMucHVzaCgoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgbWFyZ2luTGVmdDogaW5kZW50LnRvU3RyaW5nKCkgKyAncHgnLFxuICAgICAgICAgICAgZmxleFNocmluazogJzAnLFxuICAgICAgICAgICAgd2lkdGg6ICcxMnB4JyxcbiAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICAgICBib3JkZXI6ICcxcHggc29saWQgZ3JheScsXG4gICAgICAgICAgfX1cbiAgICAgICAgICBvbkNsaWNrPXsgKCkgPT4gdGhpcy5fZXhwYW5kUm93KHJvdykgfVxuICAgICAgICA+KzwvZGl2PlxuICAgICAgKSk7XG4gICAgfSBlbHNlIGlmIChhZ2dyb3cuY2FuQ29udHJhY3Qocm93KSkge1xuICAgICAgY29sdW1ucy5wdXNoKChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBtYXJnaW5MZWZ0OiBpbmRlbnQudG9TdHJpbmcoKSArICdweCcsXG4gICAgICAgICAgICBmbGV4U2hyaW5rOiAnMCcsXG4gICAgICAgICAgICB3aWR0aDogJzEycHgnLFxuICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCBncmF5JyxcbiAgICAgICAgICB9fVxuICAgICAgICAgIG9uQ2xpY2s9eyAoKSA9PiB0aGlzLl9jb250cmFjdFJvdyhyb3cpIH1cbiAgICAgICAgPi08L2Rpdj5cbiAgICAgICkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb2x1bW5zLnB1c2goKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIG1hcmdpbkxlZnQ6IGluZGVudC50b1N0cmluZygpICsgJ3B4JyxcbiAgICAgICAgICB9fVxuICAgICAgICA+PC9kaXY+XG4gICAgICApKTtcbiAgICB9XG4gICAgcm93VGV4dCArPSBhZ2dyb3cuZ2V0Um93TGFiZWwocm93KTtcbiAgICBjb2x1bW5zLnB1c2goKFxuICAgICAgPGRpdiBzdHlsZT17e1xuICAgICAgICBmbGV4U2hyaW5rOiAnMCcsXG4gICAgICAgIHdoaXRlU3BhY2U6ICdub3dyYXAnLFxuICAgICAgICBtYXJnaW5SaWdodDogJzIwcHgnXG4gICAgICB9fT5cbiAgICAgICAge3Jvd1RleHR9XG4gICAgICA8L2Rpdj5cbiAgICApKTtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdlxuICAgICAgICBrZXk9e3Jvdy50b3B9XG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgaGVpZ2h0OiAocm93SGVpZ2h0IC0gMSkudG9TdHJpbmcoKSArICdweCcsXG4gICAgICAgICAgdG9wOiAocm93SGVpZ2h0ICogcm93LnRvcCkudG9TdHJpbmcoKSArICdweCcsXG4gICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdyb3cnLFxuICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogYmcsXG4gICAgICAgICAgYm9yZGVyQm90dG9tOiAnMXB4IHNvbGlkIGdyYXknLFxuICAgICAgICB9fVxuICAgICAgICBvbkNsaWNrPXsgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2N1cnNvcjogcm93LnRvcH0pO1xuICAgICAgICB9fT5cbiAgICAgICAge2NvbHVtbnN9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy5rZXlkb3duID0gdGhpcy5rZXlkb3duLmJpbmQodGhpcyk7XG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlkb3duKTtcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5ZG93bik7XG4gIH1cbn1cbiJdfQ== +// @generated diff --git a/local-cli/server/middleware/heapCapture/src/aggrow.js b/local-cli/server/middleware/heapCapture/src/aggrow.js index 5b1190cd1..a6c51df55 100644 --- a/local-cli/server/middleware/heapCapture/src/aggrow.js +++ b/local-cli/server/middleware/heapCapture/src/aggrow.js @@ -46,17 +46,16 @@ function stackData(stackIdMap, maxDepth) { // eslint-disable-line no-unused-vars }; } -function stackRegistry(interner) { // eslint-disable-line no-unused-vars +function stackRegistry() { // eslint-disable-line no-unused-vars return { root: { id: 0 }, nodeCount: 1, - insert: function insertNode(parent, label) { - const labelId = interner.intern(label); - let node = parent[labelId]; + insert: function insertNode(parent, frameId) { + let node = parent[frameId]; if (node === undefined) { node = { id: this.nodeCount }; this.nodeCount++; - parent[labelId] = node; + parent[frameId] = node; } return node; }, @@ -116,7 +115,7 @@ function stackRegistry(interner) { // eslint-disable-line no-unused-vars }; } -function aggrow(strings, stacks, numRows) { // eslint-disable-line no-unused-vars +function aggrow(numRows) { // eslint-disable-line no-unused-vars // expander ID definitions const FIELD_EXPANDER_ID_MIN = 0x0000; const FIELD_EXPANDER_ID_MAX = 0x7fff; @@ -142,17 +141,17 @@ function aggrow(strings, stacks, numRows) { // eslint-disable-line no-unused-var const NODE_REPOSITION_BIT = 0x0008; // children need position const NODE_INDENT_SHIFT = 16; - function calleeFrameGetter(stack, depth) { + function calleeFrameIdGetter(stack, depth) { return stack[depth]; } - function callerFrameGetter(stack, depth) { + function callerFrameIdGetter(stack, depth) { return stack[stack.length - depth - 1]; } - function createStackComparers(stackGetter, frameGetter) { - const comparers = new Array(stacks.maxDepth); - for (let depth = 0; depth < stacks.maxDepth; depth++) { + function createStackComparers(stackGetter, frameIdGetter, maxStackDepth) { + const comparers = new Array(maxStackDepth); + for (let depth = 0; depth < maxStackDepth; depth++) { const captureDepth = depth; // NB: to capture depth per loop iteration comparers[depth] = function calleeStackComparer(rowA, rowB) { const a = stackGetter(rowA); @@ -166,7 +165,7 @@ function aggrow(strings, stacks, numRows) { // eslint-disable-line no-unused-var } else if (b.length <= captureDepth) { return 1; } - return frameGetter(a, captureDepth) - frameGetter(b, captureDepth); + return frameIdGetter(a, captureDepth) - frameIdGetter(b, captureDepth); }; } return comparers; @@ -325,6 +324,7 @@ function aggrow(strings, stacks, numRows) { // eslint-disable-line no-unused-var function addChildrenWithStackExpander(row, expander, activeIndex, depth, nextActiveIndex) { const rowIndices = row.indices; const stackGetter = expander.stackGetter; + const frameIdGetter = expander.frameIdGetter; const frameGetter = expander.frameGetter; const comparer = expander.comparers[depth]; const expandNextFrame = activeIndex | ((depth + 1) << ACTIVE_EXPANDER_FRAME_SHIFT); @@ -357,10 +357,10 @@ function aggrow(strings, stacks, numRows) { // eslint-disable-line no-unused-var let end = begin + 1; while (end < rowIndices.length) { const endStack = stackGetter(rowIndices[end]); - if (frameGetter(beginStack, depth) !== frameGetter(endStack, depth)) { + if (frameIdGetter(beginStack, depth) !== frameIdGetter(endStack, depth)) { row.children.push(createTreeNode( row, - columnName + strings.get(frameGetter(beginStack, depth)), + columnName + frameGetter(frameIdGetter(beginStack, depth)), rowIndices.subarray(begin, end), expandNextFrame)); begin = end; @@ -370,7 +370,7 @@ function aggrow(strings, stacks, numRows) { // eslint-disable-line no-unused-var } row.children.push(createTreeNode( row, - columnName + strings.get(frameGetter(beginStack, depth)), + columnName + frameGetter(frameIdGetter(beginStack, depth)), rowIndices.subarray(begin, end), expandNextFrame)); } @@ -418,27 +418,29 @@ function aggrow(strings, stacks, numRows) { // eslint-disable-line no-unused-var }); return FIELD_EXPANDER_ID_MIN + state.fieldExpanders.length - 1; }, - addCalleeStackExpander: function addCalleeStackExpander(name, stackGetter) { + addCalleeStackExpander: function addCalleeStackExpander(name, maxStackDepth, stackGetter, frameGetter) { if (STACK_EXPANDER_ID_MIN + state.fieldExpanders.length >= STACK_EXPANDER_ID_MAX) { throw 'too many stack expanders!'; } state.stackExpanders.push({ name: name, // name for column stackGetter: stackGetter, // row index -> stack array - comparers: createStackComparers(stackGetter, calleeFrameGetter), // depth -> comparer - frameGetter: calleeFrameGetter, // (stack, depth) -> string id + comparers: createStackComparers(stackGetter, calleeFrameIdGetter, maxStackDepth), // depth -> comparer + frameIdGetter: calleeFrameIdGetter, // (stack, depth) -> string id + frameGetter: frameGetter, }); return STACK_EXPANDER_ID_MIN + state.stackExpanders.length - 1; }, - addCallerStackExpander: function addCallerStackExpander(name, stackGetter) { + addCallerStackExpander: function addCallerStackExpander(name, maxStackDepth, stackGetter, frameGetter) { if (STACK_EXPANDER_ID_MIN + state.fieldExpanders.length >= STACK_EXPANDER_ID_MAX) { throw 'too many stack expanders!'; } state.stackExpanders.push({ name: name, stackGetter: stackGetter, - comparers: createStackComparers(stackGetter, callerFrameGetter), - frameGetter: callerFrameGetter, + comparers: createStackComparers(stackGetter, callerFrameIdGetter, maxStackDepth), + frameIdGetter: callerFrameIdGetter, + frameGetter: frameGetter, }); return STACK_EXPANDER_ID_MIN + state.stackExpanders.length - 1; }, diff --git a/local-cli/server/middleware/heapCapture/src/heapCapture.js b/local-cli/server/middleware/heapCapture/src/heapCapture.js index 87b03dbee..7af43b379 100644 --- a/local-cli/server/middleware/heapCapture/src/heapCapture.js +++ b/local-cli/server/middleware/heapCapture/src/heapCapture.js @@ -145,28 +145,28 @@ function getInternalInstanceName(visitor) { return '#unknown'; } -function buildReactComponentTree(visitor, registry) { +function buildReactComponentTree(visitor, registry, strings) { const ref = visitor.getRef(); if (ref.reactTree || ref.reactParent === undefined) { return; // has one or doesn't need one } const parentVisitor = ref.reactParent; if (parentVisitor === null) { - ref.reactTree = registry.insert(registry.root, getInternalInstanceName(visitor)); + ref.reactTree = registry.insert(registry.root, strings.intern(getInternalInstanceName(visitor))); } else if (parentVisitor) { const parentRef = parentVisitor.getRef(); - buildReactComponentTree(parentVisitor, registry); + buildReactComponentTree(parentVisitor, registry, strings); let relativeName = getInternalInstanceName(visitor); if (ref.reactKey) { relativeName = ref.reactKey + ': ' + relativeName; } - ref.reactTree = registry.insert(parentRef.reactTree, relativeName); + ref.reactTree = registry.insert(parentRef.reactTree, strings.intern(relativeName)); } else { throw 'non react instance parent of react instance'; } } -function markReactComponentTree(refs, registry) { +function markReactComponentTree(refs, registry, strings) { // annotate all refs that are react internal instances with their parent and name // ref.reactParent = visitor that points to parent instance, // null if we know it's an instance, but don't have a parent yet @@ -201,7 +201,7 @@ function markReactComponentTree(refs, registry) { // build tree of react internal instances (since that's what has the structure) // fill in ref.reactTree = path registry node forEachRef(refs, (visitor) => { - buildReactComponentTree(visitor, registry); + buildReactComponentTree(visitor, registry, strings); }); // hook in components by looking at their _reactInternalInstance fields forEachRef(refs, (visitor) => { @@ -253,14 +253,14 @@ function markModules(refs) { }); } -function registerPathToRoot(refs, registry) { - markReactComponentTree(refs, registry); +function registerPathToRoot(refs, registry, strings) { + markReactComponentTree(refs, registry, strings); markModules(refs); let breadth = []; forEachRef(refs, (visitor) => { const ref = visitor.getRef(); if (ref.type === 'CallbackGlobalObject') { - ref.rootPath = registry.insert(registry.root, ref.type); + ref.rootPath = registry.insert(registry.root, strings.intern(ref.type)); breadth.push(visitor.clone()); } }); @@ -276,7 +276,7 @@ function registerPathToRoot(refs, registry) { if (edgeName) { pathName = edgeName + ': ' + pathName; } - edgeRef.rootPath = registry.insert(ref.rootPath, pathName); + edgeRef.rootPath = registry.insert(ref.rootPath, strings.intern(pathName)); nextBreadth.push(edgeVisitor.clone()); // copy module and react tree forward if (edgeRef.module === undefined) { @@ -330,10 +330,10 @@ function captureRegistry() { let dataOffset = this.data.length; this.data = null; - registerPathToRoot(capture.refs, this.stacks); + registerPathToRoot(capture.refs, this.stacks, this.strings); const internedCaptureId = this.strings.intern(captureId); const noneString = this.strings.intern('#none'); - const noneStack = this.stacks.insert(this.stacks.root, '#none'); + const noneStack = this.stacks.insert(this.stacks.root, noneString); forEachRef(capture.refs, (visitor) => { const ref = visitor.getRef(); const id = visitor.id; @@ -382,7 +382,7 @@ function captureRegistry() { const agStacks = this.stacks.flatten(); const agData = this.data; const agNumRows = agData.length / numFields; - const ag = new aggrow(agStrings, agStacks, agNumRows); + const ag = new aggrow(agNumRows); ag.addFieldExpander('Id', function getId(row) { @@ -414,11 +414,19 @@ function captureRegistry() { return agData[rowA * numFields + traceField] - agData[rowB * numFields + traceField]; }); - const pathExpander = ag.addCalleeStackExpander('Path', - function getStack(row) { return agStacks.get(agData[row * numFields + pathField]); }); + const pathExpander = ag.addCalleeStackExpander( + 'Path', + agStacks.maxDepth, + function getStack(row) { return agStacks.get(agData[row * numFields + pathField]); }, + function getFrame(id) { return agStrings.get(id); }, + ); - const reactExpander = ag.addCalleeStackExpander('React Tree', - function getStack(row) { return agStacks.get(agData[row * numFields + reactField]); }); + const reactExpander = ag.addCalleeStackExpander( + 'React Tree', + agStacks.maxDepth, + function getStack(row) { return agStacks.get(agData[row * numFields + reactField]); }, + function getFrame(id) { return agStrings.get(id); }, + ); const valueExpander = ag.addFieldExpander('Value', function getValue(row) { return agStrings.get(agData[row * numFields + valueField]); }, diff --git a/local-cli/server/middleware/heapCaptureMiddleware.js b/local-cli/server/middleware/heapCaptureMiddleware.js index 02b4f0a8d..94e5125d6 100644 --- a/local-cli/server/middleware/heapCaptureMiddleware.js +++ b/local-cli/server/middleware/heapCaptureMiddleware.js @@ -109,7 +109,7 @@ function symbolicateHeapCaptureFunctions(capture, onFailure, onSuccess) { if (original.name) { ref.value.name = original.name; } else if (!ref.value.name) { - ref.value.name = path.posix.basename(original.source) + ':' + original.line; + ref.value.name = path.posix.basename(original.source || '') + ':' + original.line; } ref.value.url = original.source; ref.value.line = original.line;