lazy-object-view
Version:
A simple JS object tree visualizer/explorer that adheres to 'what you see is what's in the DOM'
2 lines • 71.8 kB
JavaScript
!function(c,f){"object"==typeof exports&&"object"==typeof module?module.exports=f():"function"==typeof define&&define.amd?define([],f):"object"==typeof exports?exports.LazyObjectView=f():c.LazyObjectView=f()}(window,function(){return function(c){var f={};function r(i){if(f[i])return f[i].exports;var p=f[i]={i:i,l:!1,exports:{}};return c[i].call(p.exports,p,p.exports,r),p.l=!0,p.exports}return r.m=c,r.c=f,r.d=function(c,f,i){r.o(c,f)||Object.defineProperty(c,f,{enumerable:!0,get:i})},r.r=function(c){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(c,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(c,"__esModule",{value:!0})},r.t=function(c,f){if(1&f&&(c=r(c)),8&f)return c;if(4&f&&"object"==typeof c&&c&&c.__esModule)return c;var i=Object.create(null);if(r.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:c}),2&f&&"string"!=typeof c)for(var p in c)r.d(i,p,function(f){return c[f]}.bind(null,p));return i},r.n=function(c){var f=c&&c.__esModule?function(){return c.default}:function(){return c};return r.d(f,"a",f),f},r.o=function(c,f){return Object.prototype.hasOwnProperty.call(c,f)},r.p="",r(r.s=0)}([function(c,f,r){"use strict";Object.defineProperty(f,"__esModule",{value:!0}),r(1);var i=function(){function c(c){this.elementTypeToUse="div",this.keyValueClassName="key-value",this.keyClassName="key",this.valueClassName="value",this.subtreeClassName="subtree",this.defaultRootNodeName="root",this.window=c||window}return c.prototype.render=function(c,f,r){if(null==c)throw new Error("target HTMLElement must not be null or undefined.");if(null==f)return null;if(r&&r.useRootElement){var i=f;(f={})[r.rootName||this.defaultRootNodeName]=i,r.useRootElement=!1}var p=this.window.document.createDocumentFragment();for(var o in f)if(f.hasOwnProperty(o)){var n=this.constructRenderedKeyValue(o,f[o],r);p.appendChild(n)}c.appendChild(p)},c.prototype.collapse=function(c){c.innerHTML=""},c.prototype.constructTextElement=function(c,f){var r=this;if(f&&void 0!==f.collapseStringsOver&&null!==f.collapseStringsOver&&f.collapseStringsOver>=0&&c.length>f.collapseStringsOver){var i=this.window.document.createElement("span"),p=c.substring(0,f.collapseStringsOver),o=this.window.document.createTextNode(p);i.appendChild(o);var n=this.window.document.createElement("span");n.className="ellipses";var v=this.window.document.createTextNode("... [+"+(c.length-f.collapseStringsOver)+"]");return n.appendChild(v),i.appendChild(n),n.onclick=function(f){i.innerHTML="";var p=r.window.document.createTextNode(c);i.appendChild(p)},i}return this.window.document.createTextNode(c)},c.prototype.constructRenderedKeyValue=function(c,f,r){var i=this,p=this.window.document.createElement(this.elementTypeToUse);p.className=this.keyValueClassName;var o=this.window.document.createElement(this.elementTypeToUse);o.className=this.keyClassName;var n=this.window.document.createTextNode(c);o.appendChild(n),p.appendChild(o);var v=typeof f,d=this.window.document.createElement(this.elementTypeToUse);if(d.className=this.valueClassName+" "+v,"undefined"===v){var w=this.constructTextElement("undefined",r);d.appendChild(w),p.appendChild(d)}else if(null===f){w=this.constructTextElement("null",r);d.appendChild(w),d.className+=" null",p.appendChild(d)}else if(Array.isArray(f)&&0===f.length){w=this.constructTextElement("[]",r);d.appendChild(w),d.className+=" empty",p.appendChild(d)}else if("object"===v){var N=this.window.document.createElement(this.elementTypeToUse);N.className=this.subtreeClassName,p.appendChild(N),o.className+=" collapsed";var u=!1;o.onclick=function(c){if(!1===u)if(r&&r.showLoadingIndicator){var p=i.window.document.createElement("div");p.className="spinner",N.appendChild(p),i.window.setTimeout(function(){i.render(N,f,r),u=!0,N.removeChild(p),o.className=o.className.replace(/\bcollapsed\b/,"expanded")},10)}else i.render(N,f,r),u=!0,o.className=o.className.replace(/\bcollapsed\b/,"expanded");else i.collapse(N),u=!1,o.className=o.className.replace(/\bexpanded\b/,"collapsed")}}else if("string"===v){w=this.constructTextElement('"'+f+'"',r);d.appendChild(w),p.appendChild(d)}else{w=this.constructTextElement(f.toString(),r);d.appendChild(w),p.appendChild(d)}return p},c}();f.LazyObjectView=i,f.default=i},function(c,f,r){var i=r(2);"string"==typeof i&&(i=[[c.i,i,""]]);var p={hmr:!0,transform:void 0,insertInto:void 0};r(4)(i,p);i.locals&&(c.exports=i.locals)},function(c,f,r){(c.exports=r(3)(!1)).push([c.i,'.spinner{border:3px solid #f3f3f3;border-top:3px solid #999999;border-radius:50%;width:10px;height:10px;animation:spin 2s linear infinite;display:inline-block;margin-top:5px}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.collapsed::before{content:"+"}.expanded::before{content:"-"}.subtree{margin-left:15px}.key{font-style:italic;cursor:pointer;display:inline-block}.key::before{font-size:0.8em;color:#999;display:inline-block;width:10px}.key::after{content:":"}.value{margin-left:10px;display:inline-block;white-space:pre-wrap}.value.undefined,.value.null,.value.empty{color:#666}.key-value{margin:2px 0px;font-family:monospace}.ellipses{margin-left:4px;font-size:0.8em;color:#999;cursor:pointer}\n',""])},function(c,f,r){"use strict";c.exports=function(c){var f=[];return f.toString=function(){return this.map(function(f){var r=function(c,f){var r=c[1]||"",i=c[3];if(!i)return r;if(f&&"function"==typeof btoa){var p=(n=i,"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(n))))+" */"),o=i.sources.map(function(c){return"/*# sourceURL="+i.sourceRoot+c+" */"});return[r].concat(o).concat([p]).join("\n")}var n;return[r].join("\n")}(f,c);return f[2]?"@media "+f[2]+"{"+r+"}":r}).join("")},f.i=function(c,r){"string"==typeof c&&(c=[[null,c,""]]);for(var i={},p=0;p<this.length;p++){var o=this[p][0];null!=o&&(i[o]=!0)}for(p=0;p<c.length;p++){var n=c[p];null!=n[0]&&i[n[0]]||(r&&!n[2]?n[2]=r:r&&(n[2]="("+n[2]+") and ("+r+")"),f.push(n))}},f}},function(c,f,r){var i,p,o={},n=(i=function(){return window&&document&&document.all&&!window.atob},function(){return void 0===p&&(p=i.apply(this,arguments)),p}),v=function(c){var f={};return function(c,r){if("function"==typeof c)return c();if(void 0===f[c]){var i=function(c,f){return f?f.querySelector(c):document.querySelector(c)}.call(this,c,r);if(window.HTMLIFrameElement&&i instanceof window.HTMLIFrameElement)try{i=i.contentDocument.head}catch(c){i=null}f[c]=i}return f[c]}}(),d=null,w=0,N=[],u=r(5);function C(c,f){for(var r=0;r<c.length;r++){var i=c[r],p=o[i.id];if(p){p.refs++;for(var n=0;n<p.parts.length;n++)p.parts[n](i.parts[n]);for(;n<i.parts.length;n++)p.parts.push(a(i.parts[n],f))}else{var v=[];for(n=0;n<i.parts.length;n++)v.push(a(i.parts[n],f));o[i.id]={id:i.id,refs:1,parts:v}}}}function x(c,f){for(var r=[],i={},p=0;p<c.length;p++){var o=c[p],n=f.base?o[0]+f.base:o[0],v={css:o[1],media:o[2],sourceMap:o[3]};i[n]?i[n].parts.push(v):r.push(i[n]={id:n,parts:[v]})}return r}function U(c,f){var r=v(c.insertInto);if(!r)throw new Error("Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid.");var i=N[N.length-1];if("top"===c.insertAt)i?i.nextSibling?r.insertBefore(f,i.nextSibling):r.appendChild(f):r.insertBefore(f,r.firstChild),N.push(f);else if("bottom"===c.insertAt)r.appendChild(f);else{if("object"!=typeof c.insertAt||!c.insertAt.before)throw new Error("[Style Loader]\n\n Invalid value for parameter 'insertAt' ('options.insertAt') found.\n Must be 'top', 'bottom', or Object.\n (https://github.com/webpack-contrib/style-loader#insertat)\n");var p=v(c.insertAt.before,r);r.insertBefore(f,p)}}function L(c){if(null===c.parentNode)return!1;c.parentNode.removeChild(c);var f=N.indexOf(c);f>=0&&N.splice(f,1)}function O(c){var f=document.createElement("style");if(void 0===c.attrs.type&&(c.attrs.type="text/css"),void 0===c.attrs.nonce){var i=function(){0;return r.nc}();i&&(c.attrs.nonce=i)}return R(f,c.attrs),U(c,f),f}function R(c,f){Object.keys(f).forEach(function(r){c.setAttribute(r,f[r])})}function a(c,f){var r,i,p,o;if(f.transform&&c.css){if(!(o="function"==typeof f.transform?f.transform(c.css):f.transform.default(c.css)))return function(){};c.css=o}if(f.singleton){var n=w++;r=d||(d=O(f)),i=B.bind(null,r,n,!1),p=B.bind(null,r,n,!0)}else c.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(r=function(c){var f=document.createElement("link");return void 0===c.attrs.type&&(c.attrs.type="text/css"),c.attrs.rel="stylesheet",R(f,c.attrs),U(c,f),f}(f),i=function(c,f,r){var i=r.css,p=r.sourceMap,o=void 0===f.convertToAbsoluteUrls&&p;(f.convertToAbsoluteUrls||o)&&(i=u(i));p&&(i+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(p))))+" */");var n=new Blob([i],{type:"text/css"}),v=c.href;c.href=URL.createObjectURL(n),v&&URL.revokeObjectURL(v)}.bind(null,r,f),p=function(){L(r),r.href&&URL.revokeObjectURL(r.href)}):(r=O(f),i=function(c,f){var r=f.css,i=f.media;i&&c.setAttribute("media",i);if(c.styleSheet)c.styleSheet.cssText=r;else{for(;c.firstChild;)c.removeChild(c.firstChild);c.appendChild(document.createTextNode(r))}}.bind(null,r),p=function(){L(r)});return i(c),function(f){if(f){if(f.css===c.css&&f.media===c.media&&f.sourceMap===c.sourceMap)return;i(c=f)}else p()}}c.exports=function(c,f){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");(f=f||{}).attrs="object"==typeof f.attrs?f.attrs:{},f.singleton||"boolean"==typeof f.singleton||(f.singleton=n()),f.insertInto||(f.insertInto="head"),f.insertAt||(f.insertAt="bottom");var r=x(c,f);return C(r,f),function(c){for(var i=[],p=0;p<r.length;p++){var n=r[p];(v=o[n.id]).refs--,i.push(v)}c&&C(x(c,f),f);for(p=0;p<i.length;p++){var v;if(0===(v=i[p]).refs){for(var d=0;d<v.parts.length;d++)v.parts[d]();delete o[v.id]}}}};var s,M=(s=[],function(c,f){return s[c]=f,s.filter(Boolean).join("\n")});function B(c,f,r,i){var p=r?"":i.css;if(c.styleSheet)c.styleSheet.cssText=M(f,p);else{var o=document.createTextNode(p),n=c.childNodes;n[f]&&c.removeChild(n[f]),n.length?c.insertBefore(o,n[f]):c.appendChild(o)}}},function(c,f){c.exports=function(c){var f="undefined"!=typeof window&&window.location;if(!f)throw new Error("fixUrls requires window.location");if(!c||"string"!=typeof c)return c;var r=f.protocol+"//"+f.host,i=r+f.pathname.replace(/\/[^\/]*$/,"/");return c.replace(/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi,function(c,f){var p,o=f.trim().replace(/^"(.*)"$/,function(c,f){return f}).replace(/^'(.*)'$/,function(c,f){return f});return/^(#|data:|http:\/\/|https:\/\/|file:\/\/\/|\s*$)/i.test(o)?c:(p=0===o.indexOf("//")?o:0===o.indexOf("/")?r+o:i+o.replace(/^\.\//,""),"url("+JSON.stringify(p)+")")})}}])});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9MYXp5T2JqZWN0Vmlldy93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vTGF6eU9iamVjdFZpZXcvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vTGF6eU9iamVjdFZpZXcvLi9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vTGF6eU9iamVjdFZpZXcvLi9zcmMvc3R5bGVzL2luZGV4LnNjc3M/MDBjZiIsIndlYnBhY2s6Ly9MYXp5T2JqZWN0Vmlldy8uL3NyYy9zdHlsZXMvaW5kZXguc2NzcyIsIndlYnBhY2s6Ly9MYXp5T2JqZWN0Vmlldy8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanMiLCJ3ZWJwYWNrOi8vTGF6eU9iamVjdFZpZXcvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2xpYi9hZGRTdHlsZXMuanMiLCJ3ZWJwYWNrOi8vTGF6eU9iamVjdFZpZXcvLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2xpYi91cmxzLmpzIl0sIm5hbWVzIjpbInJvb3QiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIm1vZHVsZSIsImRlZmluZSIsImFtZCIsIndpbmRvdyIsImluc3RhbGxlZE1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpIiwibCIsIm1vZHVsZXMiLCJjYWxsIiwibSIsImMiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJyIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJ2YWx1ZSIsInQiLCJtb2RlIiwiX19lc01vZHVsZSIsIm5zIiwiY3JlYXRlIiwia2V5IiwiYmluZCIsIm4iLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJMYXp5T2JqZWN0VmlldyIsIndpbmRvd09iamVjdCIsInRoaXMiLCJlbGVtZW50VHlwZVRvVXNlIiwia2V5VmFsdWVDbGFzc05hbWUiLCJrZXlDbGFzc05hbWUiLCJ2YWx1ZUNsYXNzTmFtZSIsInN1YnRyZWVDbGFzc05hbWUiLCJkZWZhdWx0Um9vdE5vZGVOYW1lIiwicmVuZGVyIiwidGFyZ2V0IiwiZGF0YSIsIm9wdGlvbnMiLCJFcnJvciIsInVzZVJvb3RFbGVtZW50IiwiZGF0YVJlZiIsInJvb3ROYW1lIiwiYWNjdW11bGF0b3IiLCJkb2N1bWVudCIsImNyZWF0ZURvY3VtZW50RnJhZ21lbnQiLCJkYXRhQXR0cmlidXRlTmFtZSIsImtleVZhbHVlUGFyZW50IiwiY29uc3RydWN0UmVuZGVyZWRLZXlWYWx1ZSIsImFwcGVuZENoaWxkIiwiY29sbGFwc2UiLCJpbm5lckhUTUwiLCJjb25zdHJ1Y3RUZXh0RWxlbWVudCIsInRleHRWYWx1ZSIsIl90aGlzIiwiY29sbGFwc2VTdHJpbmdzT3ZlciIsImxlbmd0aCIsInBhcmVudEVsZW1lbnRfMSIsImNyZWF0ZUVsZW1lbnQiLCJkaXNwbGF5ZWRQYXJ0U3RyaW5nIiwic3Vic3RyaW5nIiwidGV4dEVsZW1lbnQiLCJjcmVhdGVUZXh0Tm9kZSIsImVsbGlwc2VzRWxlbWVudCIsImNsYXNzTmFtZSIsImVsbGlwc2VzVGV4dCIsIm9uY2xpY2siLCJldmVudCIsImZ1bGxUZXh0RWxlbWVudCIsImRhdGFBdHRyaWJ1dGVWYWx1ZSIsImtleUVsZW1lbnQiLCJrZXlUZXh0RWxlbWVudCIsImRhdGFBdHRyaWJ1dGVUeXBlIiwidmFsdWVFbGVtZW50IiwidmFsdWVUZXh0RWxlbWVudCIsIkFycmF5IiwiaXNBcnJheSIsInN1YnRyZWVFbGVtZW50XzEiLCJ0aGlzVG9nZ2xlU3RhdGVfMSIsInNob3dMb2FkaW5nSW5kaWNhdG9yIiwibG9hZGVyRWxlbWVudF8xIiwic2V0VGltZW91dCIsInJlbW92ZUNoaWxkIiwicmVwbGFjZSIsInRvU3RyaW5nIiwiZGVmYXVsdCIsImNvbnRlbnQiLCJobXIiLCJ0cmFuc2Zvcm0iLCJpbnNlcnRJbnRvIiwidW5kZWZpbmVkIiwibG9jYWxzIiwicHVzaCIsInVzZVNvdXJjZU1hcCIsImxpc3QiLCJtYXAiLCJpdGVtIiwiY3NzTWFwcGluZyIsImJ0b2EiLCJzb3VyY2VNYXBwaW5nIiwic291cmNlTWFwIiwidW5lc2NhcGUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJKU09OIiwic3RyaW5naWZ5Iiwic291cmNlVVJMcyIsInNvdXJjZXMiLCJzb3VyY2UiLCJzb3VyY2VSb290IiwiY29uY2F0Iiwiam9pbiIsImNzc1dpdGhNYXBwaW5nVG9TdHJpbmciLCJtZWRpYVF1ZXJ5IiwiYWxyZWFkeUltcG9ydGVkTW9kdWxlcyIsImlkIiwiZm4iLCJtZW1vIiwic3R5bGVzSW5Eb20iLCJpc09sZElFIiwiYWxsIiwiYXRvYiIsImFwcGx5IiwiYXJndW1lbnRzIiwiZ2V0RWxlbWVudCIsInBhcmVudCIsInN0eWxlVGFyZ2V0IiwicXVlcnlTZWxlY3RvciIsIkhUTUxJRnJhbWVFbGVtZW50IiwiY29udGVudERvY3VtZW50IiwiaGVhZCIsImUiLCJzaW5nbGV0b24iLCJzaW5nbGV0b25Db3VudGVyIiwic3R5bGVzSW5zZXJ0ZWRBdFRvcCIsImZpeFVybHMiLCJhZGRTdHlsZXNUb0RvbSIsInN0eWxlcyIsImRvbVN0eWxlIiwicmVmcyIsImoiLCJwYXJ0cyIsImFkZFN0eWxlIiwibGlzdFRvU3R5bGVzIiwibmV3U3R5bGVzIiwiYmFzZSIsInBhcnQiLCJjc3MiLCJtZWRpYSIsImluc2VydFN0eWxlRWxlbWVudCIsInN0eWxlIiwibGFzdFN0eWxlRWxlbWVudEluc2VydGVkQXRUb3AiLCJpbnNlcnRBdCIsIm5leHRTaWJsaW5nIiwiaW5zZXJ0QmVmb3JlIiwiZmlyc3RDaGlsZCIsImJlZm9yZSIsInJlbW92ZVN0eWxlRWxlbWVudCIsInBhcmVudE5vZGUiLCJpZHgiLCJpbmRleE9mIiwic3BsaWNlIiwiY3JlYXRlU3R5bGVFbGVtZW50IiwiYXR0cnMiLCJ0eXBlIiwibm9uY2UiLCJuYyIsImdldE5vbmNlIiwiYWRkQXR0cnMiLCJlbCIsImtleXMiLCJmb3JFYWNoIiwic2V0QXR0cmlidXRlIiwib2JqIiwidXBkYXRlIiwicmVtb3ZlIiwicmVzdWx0Iiwic3R5bGVJbmRleCIsImFwcGx5VG9TaW5nbGV0b25UYWciLCJVUkwiLCJjcmVhdGVPYmplY3RVUkwiLCJyZXZva2VPYmplY3RVUkwiLCJCbG9iIiwibGluayIsInJlbCIsImNyZWF0ZUxpbmtFbGVtZW50IiwiYXV0b0ZpeFVybHMiLCJjb252ZXJ0VG9BYnNvbHV0ZVVybHMiLCJibG9iIiwib2xkU3JjIiwiaHJlZiIsInN0eWxlU2hlZXQiLCJjc3NUZXh0IiwibmV3T2JqIiwiREVCVUciLCJuZXdMaXN0IiwibWF5UmVtb3ZlIiwidGV4dFN0b3JlIiwicmVwbGFjZVRleHQiLCJpbmRleCIsInJlcGxhY2VtZW50IiwiZmlsdGVyIiwiQm9vbGVhbiIsImNzc05vZGUiLCJjaGlsZE5vZGVzIiwibG9jYXRpb24iLCJiYXNlVXJsIiwicHJvdG9jb2wiLCJob3N0IiwiY3VycmVudERpciIsInBhdGhuYW1lIiwiZnVsbE1hdGNoIiwib3JpZ1VybCIsIm5ld1VybCIsInVucXVvdGVkT3JpZ1VybCIsInRyaW0iLCIkMSIsInRlc3QiXSwibWFwcGluZ3MiOiJDQUFBLFNBQUFBLEVBQUFDLEdBQ0EsaUJBQUFDLFNBQUEsaUJBQUFDLE9BQ0FBLE9BQUFELFFBQUFELElBQ0EsbUJBQUFHLGVBQUFDLElBQ0FELE9BQUEsR0FBQUgsR0FDQSxpQkFBQUMsUUFDQUEsUUFBQSxlQUFBRCxJQUVBRCxFQUFBLGVBQUFDLElBUkEsQ0FTQ0ssT0FBQSxXQUNELG1CQ1RBLElBQUFDLEVBQUEsR0FHQSxTQUFBQyxFQUFBQyxHQUdBLEdBQUFGLEVBQUFFLEdBQ0EsT0FBQUYsRUFBQUUsR0FBQVAsUUFHQSxJQUFBQyxFQUFBSSxFQUFBRSxHQUFBLENBQ0FDLEVBQUFELEVBQ0FFLEdBQUEsRUFDQVQsUUFBQSxJQVVBLE9BTkFVLEVBQUFILEdBQUFJLEtBQUFWLEVBQUFELFFBQUFDLElBQUFELFFBQUFNLEdBR0FM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RUFBQXhCLEVBQUFGLEdBQ0EsSUFBQTFCLEVBQUE0QixFQUFBLEdBQUFGLEVBQUExQixJQUVBLEdBQUFHLEVBQUF5QyxXQUNBekMsRUFBQXlDLFdBQUFDLFFBQUFNLEVBQUFDLEVBQUFwRCxPQUNFLENBQ0YsSUFBQXdELEVBQUE5SixTQUFBa0IsZUFBQW9GLEdBQ0F5RCxFQUFBdEQsRUFBQXNELFdBRUFBLEVBQUFMLElBQUFqRCxFQUFBbkUsWUFBQXlILEVBQUFMLElBRUFLLEVBQUFuSixPQUNBNkYsRUFBQUksYUFBQWlELEVBQUFDLEVBQUFMLElBRUFqRCxFQUFBcEcsWUFBQXlKLG9CQzdVQXZOLEVBQUFELFFBQUEsU0FBQWdLLEdBRUEsSUFBQTBELEVBQUEsb0JBQUF0TixlQUFBc04sU0FFQSxJQUFBQSxFQUNBLFVBQUFySyxNQUFBLG9DQUlBLElBQUEyRyxHQUFBLGlCQUFBQSxFQUNBLE9BQUFBLEVBR0EsSUFBQTJELEVBQUFELEVBQUFFLFNBQUEsS0FBQUYsRUFBQUcsS0FDQUMsRUFBQUgsRUFBQUQsRUFBQUssU0FBQTlILFFBQUEsaUJBMkRBLE9BL0JBK0QsRUFBQS9ELFFBQUEsK0RBQUErSCxFQUFBQyxHQUVBLElBV0FDLEVBWEFDLEVBQUFGLEVBQ0FHLE9BQ0FuSSxRQUFBLG9CQUFBaEYsRUFBQW9OLEdBQXdDLE9BQUFBLElBQ3hDcEksUUFBQSxvQkFBQWhGLEVBQUFvTixHQUF3QyxPQUFBQSxJQUd4QywwREFBQUMsS0FBQUgsR0FDQUgsR0FRQUUsRUFGQSxJQUFBQyxFQUFBdEQsUUFBQSxNQUVBc0QsRUFDRyxJQUFBQSxFQUFBdEQsUUFBQSxLQUVIOEMsRUFBQVEsRUFHQUwsRUFBQUssRUFBQWxJLFFBQUEsWUFJQSxPQUFBb0IsS0FBQUMsVUFBQTRHLEdBQUEiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJMYXp5T2JqZWN0Vmlld1wiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJMYXp5T2JqZWN0Vmlld1wiXSA9IGZhY3RvcnkoKTtcbn0pKHdpbmRvdywgZnVuY3Rpb24oKSB7XG5yZXR1cm4gIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDApO1xuIiwiaW1wb3J0IFwiLi9zdHlsZXMvaW5kZXguc2Nzc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElSZW5kZXJPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0byBlbmNhcHN1bGF0ZSB0aGUgZW50aXJlIG9iamVjdCBpbnNpZGUgYSBzaW5nbGUgcm9vdCBlbGVtZW50LlxuICAgICAqL1xuICAgIHVzZVJvb3RFbGVtZW50PzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSByb290IGVsZW1lbnQgdG8gdXNlIGlmIHVzZVJvb3RFbGVtZW50IGlzIHRydWUuIERlZmF1bHRzIHRvIFwicm9vdFwiLlxuICAgICAqL1xuICAgIHJvb3ROYW1lPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQXR0ZW1wdCB0byBzaG93IGEgbG9hZGluZyBpbmRpY2F0b3IgYmVmb3JlIGV4cGFuZGluZyBub2Rlc1xuICAgICAqIE5vdGUgdGhhdCB0aGlzIGludHJvZHVjZXMgYSBzbWFsbCBhcnRpZmljaWFsIGRlbGF5IG9mIDEwbXMgd2hlbiBleHBhbmRpbmdcbiAgICAgKi9cbiAgICBzaG93TG9hZGluZ0luZGljYXRvcj86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBJZiBzZXQgd2lsbCBjb2xsYXBzZSB2YWx1ZXMgb3ZlciB0aGF0IG51bWJlciBhbmQgc2hvdyBhbiBlbGxpcHNlcyAoLi4uKSBhdCB0aGVcbiAgICAgKiBlbmQgd2l0aCB0aGUgcmVtYWluaW5nIGNvdW50IHRvIGV4cGFuZC5cbiAgICAgKi9cbiAgICBjb2xsYXBzZVN0cmluZ3NPdmVyPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgTGF6eU9iamVjdFZpZXcge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFR5cGVUb1VzZTogc3RyaW5nID0gXCJkaXZcIjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGtleVZhbHVlQ2xhc3NOYW1lOiBzdHJpbmcgPSBcImtleS12YWx1ZVwiO1xuICAgIHByaXZhdGUgcmVhZG9ubHkga2V5Q2xhc3NOYW1lOiBzdHJpbmcgPSBcImtleVwiO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdmFsdWVDbGFzc05hbWU6IHN0cmluZyA9IFwidmFsdWVcIjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN1YnRyZWVDbGFzc05hbWU6IHN0cmluZyA9IFwic3VidHJlZVwiO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFJvb3ROb2RlTmFtZTogc3RyaW5nID0gXCJyb290XCI7XG4gICAgcHJpdmF0ZSB3aW5kb3c6IFdpbmRvdztcblxuICAgIGNvbnN0cnVjdG9yKHdpbmRvd09iamVjdD86IFdpbmRvdykge1xuICAgICAgICB0aGlzLndpbmRvdyA9IHdpbmRvd09iamVjdCB8fCB3aW5kb3c7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyBhIGpzb24gdmlld2VyIG9uIHRoZSB0YXJnZXQgZWxlbWVudCBmb3IgdGhlIGdpdmVuIGRhdGFcbiAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgZWxlbWVudCB0byByZW5kZXIgdGhlIEpTT04gZG9jdW1lbnQgdW5kZXJcbiAgICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byByZW5kZXIgYXMgYSB0cmVlIHZpZXdcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciByZW5kZXJpbmcgdGhlIHZpZXdlclxuICAgICAqL1xuICAgIHB1YmxpYyByZW5kZXIodGFyZ2V0OiBIVE1MRWxlbWVudCwgZGF0YTogYW55LCBvcHRpb25zPzogSVJlbmRlck9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHRhcmdldCA9PT0gbnVsbCB8fCB0eXBlb2YgdGFyZ2V0ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0YXJnZXQgSFRNTEVsZW1lbnQgbXVzdCBub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEgPT09IG51bGwgfHwgdHlwZW9mIGRhdGEgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy51c2VSb290RWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3Qgcm9vdE5hbWUgPSBvcHRpb25zLnJvb3ROYW1lIHx8IHRoaXMuZGVmYXVsdFJvb3ROb2RlTmFtZTtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFSZWYgPSBkYXRhO1xuICAgICAgICAgICAgZGF0YSA9IHt9O1xuICAgICAgICAgICAgZGF0YVtyb290TmFtZV0gPSBkYXRhUmVmO1xuICAgICAgICAgICAgb3B0aW9ucy51c2VSb290RWxlbWVudCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWNjdW11bGF0b3IgPSB0aGlzLndpbmRvdy5kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgICAgIGZvciAoY29uc3QgZGF0YUF0dHJpYnV0ZU5hbWUgaW4gZGF0YSkge1xuICAgICAgICAgICAgaWYgKCFkYXRhLmhhc093blByb3BlcnR5KGRhdGFBdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBrZXlWYWx1ZVBhcmVudCA9IHRoaXMuY29uc3RydWN0UmVuZGVyZWRLZXlWYWx1ZShcbiAgICAgICAgICAgICAgICBkYXRhQXR0cmlidXRlTmFtZSxcbiAgICAgICAgICAgICAgICBkYXRhW2RhdGFBdHRyaWJ1dGVOYW1lXSxcbiAgICAgICAgICAgICAgICBvcHRpb25zKTtcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yLmFwcGVuZENoaWxkKGtleVZhbHVlUGFyZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhcmdldC5hcHBlbmRDaGlsZChhY2N1bXVsYXRvcik7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbGxhcHNlKHRhcmdldDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgdGFyZ2V0LmlubmVySFRNTCA9IFwiXCI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RUZXh0RWxlbWVudCh0ZXh0VmFsdWU6IHN0cmluZywgb3B0aW9ucz86IElSZW5kZXJPcHRpb25zKTogSFRNTEVsZW1lbnQgfCBUZXh0IHtcbiAgICAgICAgaWYgKG9wdGlvbnNcbiAgICAgICAgICAgICYmIHR5cGVvZiBvcHRpb25zLmNvbGxhcHNlU3RyaW5nc092ZXIgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICAgICYmIG9wdGlvbnMuY29sbGFwc2VTdHJpbmdzT3ZlciAhPT0gbnVsbFxuICAgICAgICAgICAgJiYgb3B0aW9ucy5jb2xsYXBzZVN0cmluZ3NPdmVyID49IDBcbiAgICAgICAgICAgICYmIHRleHRWYWx1ZS5sZW5ndGggPiBvcHRpb25zLmNvbGxhcHNlU3RyaW5nc092ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEVsZW1lbnQgPSB0aGlzLndpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICAgICAgICAgIGNvbnN0IGRpc3BsYXllZFBhcnRTdHJpbmcgPSB0ZXh0VmFsdWUuc3Vic3RyaW5nKDAsIG9wdGlvbnMuY29sbGFwc2VTdHJpbmdzT3Zlcik7XG4gICAgICAgICAgICBjb25zdCB0ZXh0RWxlbWVudCA9IHRoaXMud2luZG93LmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRpc3BsYXllZFBhcnRTdHJpbmcpO1xuICAgICAgICAgICAgcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0ZXh0RWxlbWVudCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGVsbGlwc2VzRWxlbWVudCA9IHRoaXMud2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICAgICAgZWxsaXBzZXNFbGVtZW50LmNsYXNzTmFtZSA9IFwiZWxsaXBzZXNcIjtcbiAgICAgICAgICAgIGNvbnN0IGVsbGlwc2VzVGV4dCA9IHRoaXMud2luZG93LmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFxuICAgICAgICAgICAgICAgIFwiLi4uIFsrXCIgKyAodGV4dFZhbHVlLmxlbmd0aCAtIG9wdGlvbnMuY29sbGFwc2VTdHJpbmdzT3ZlcikgKyBcIl1cIik7XG4gICAgICAgICAgICBlbGxpcHNlc0VsZW1lbnQuYXBwZW5kQ2hpbGQoZWxsaXBzZXNUZXh0KTtcbiAgICAgICAgICAgIHBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoZWxsaXBzZXNFbGVtZW50KTtcbiAgICAgICAgICAgIGVsbGlwc2VzRWxlbWVudC5vbmNsaWNrID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgcGFyZW50RWxlbWVudC5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZ1bGxUZXh0RWxlbWVudCA9IHRoaXMud2luZG93LmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChmdWxsVGV4dEVsZW1lbnQpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmV0dXJuIHBhcmVudEVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy53aW5kb3cuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dFZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdFJlbmRlcmVkS2V5VmFsdWUoXG4gICAgICAgIGRhdGFBdHRyaWJ1dGVOYW1lOiBzdHJpbmcsXG4gICAgICAgIGRhdGFBdHRyaWJ1dGVWYWx1ZTogYW55LFxuICAgICAgICBvcHRpb25zPzogSVJlbmRlck9wdGlvbnMpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IGtleVZhbHVlUGFyZW50ID0gdGhpcy53aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0aGlzLmVsZW1lbnRUeXBlVG9Vc2UpO1xuICAgICAgICBrZXlWYWx1ZVBhcmVudC5jbGFzc05hbWUgPSB0aGlzLmtleVZhbHVlQ2xhc3NOYW1lO1xuICAgICAgICBjb25zdCBrZXlFbGVtZW50ID0gdGhpcy53aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0aGlzLmVsZW1lbnRUeXBlVG9Vc2UpO1xuICAgICAgICBrZXlFbGVtZW50LmNsYXNzTmFtZSA9IHRoaXMua2V5Q2xhc3NOYW1lO1xuICAgICAgICBjb25zdCBrZXlUZXh0RWxlbWVudCA9IHRoaXMud2luZG93LmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRhdGFBdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAga2V5RWxlbWVudC5hcHBlbmRDaGlsZChrZXlUZXh0RWxlbWVudCk7XG4gICAgICAgIGtleVZhbHVlUGFyZW50LmFwcGVuZENoaWxkKGtleUVsZW1lbnQpO1xuXG4gICAgICAgIGNvbnN0IGRhdGFBdHRyaWJ1dGVUeXBlID0gdHlwZW9mIGRhdGFBdHRyaWJ1dGVWYWx1ZTtcbiAgICAgICAgbGV0IHZhbHVlRWxlbWVudCA9IHRoaXMud2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5lbGVtZW50VHlwZVRvVXNlKTtcbiAgICAgICAgdmFsdWVFbGVtZW50LmNsYXNzTmFtZSA9IHRoaXMudmFsdWVDbGFzc05hbWUgKyBcIiBcIiArIGRhdGFBdHRyaWJ1dGVUeXBlO1xuICAgICAgICBpZiAoZGF0YUF0dHJpYnV0ZVR5cGUgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlVGV4dEVsZW1lbnQgPSB0aGlzLmNvbnN0cnVjdFRleHRFbGVtZW50KFwidW5kZWZpbmVkXCIsIG9wdGlvbnMpO1xuICAgICAgICAgICAgdmFsdWVFbGVtZW50LmFwcGVuZENoaWxkKHZhbHVlVGV4dEVsZW1lbnQpO1xuICAgICAgICAgICAga2V5VmFsdWVQYXJlbnQuYXBwZW5kQ2hpbGQodmFsdWVFbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhQXR0cmlidXRlVmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlVGV4dEVsZW1lbnQgPSB0aGlzLmNvbnN0cnVjdFRleHRFbGVtZW50KFwibnVsbFwiLCBvcHRpb25zKTtcbiAgICAgICAgICAgIHZhbHVlRWxlbWVudC5hcHBlbmRDaGlsZCh2YWx1ZVRleHRFbGVtZW50KTtcbiAgICAgICAgICAgIHZhbHVlRWxlbWVudC5jbGFzc05hbWUgKz0gXCIgbnVsbFwiO1xuICAgICAgICAgICAga2V5VmFsdWVQYXJlbnQuYXBwZW5kQ2hpbGQodmFsdWVFbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGRhdGFBdHRyaWJ1dGVWYWx1ZSkgJiYgZGF0YUF0dHJpYnV0ZVZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWVUZXh0RWxlbWVudCA9IHRoaXMuY29uc3RydWN0VGV4dEVsZW1lbnQoXCJbXVwiLCBvcHRpb25zKTtcbiAgICAgICAgICAgIHZhbHVlRWxlbWVudC5hcHBlbmRDaGlsZCh2YWx1ZVRleHRFbGVtZW50KTtcbiAgICAgICAgICAgIHZhbHVlRWxlbWVudC5jbGFzc05hbWUgKz0gXCIgZW1wdHlcIjtcbiAgICAgICAgICAgIGtleVZhbHVlUGFyZW50LmFwcGVuZENoaWxkKHZhbHVlRWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YUF0dHJpYnV0ZVR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1YnRyZWVFbGVtZW50ID0gdGhpcy53aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0aGlzLmVsZW1lbnRUeXBlVG9Vc2UpO1xuICAgICAgICAgICAgc3VidHJlZUVsZW1lbnQuY2xhc3NOYW1lID0gdGhpcy5zdWJ0cmVlQ2xhc3NOYW1lO1xuICAgICAgICAgICAga2V5VmFsdWVQYXJlbnQuYXBwZW5kQ2hpbGQoc3VidHJlZUVsZW1lbnQpO1xuXG4gICAgICAgICAgICBrZXlFbGVtZW50LmNsYXNzTmFtZSArPSBcIiBjb2xsYXBzZWRcIjtcbiAgICAgICAgICAgIGxldCB0aGlzVG9nZ2xlU3RhdGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGtleUVsZW1lbnQub25jbGljayA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzVG9nZ2xlU3RhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuc2hvd0xvYWRpbmdJbmRpY2F0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlckVsZW1lbnQgPSB0aGlzLndpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyRWxlbWVudC5jbGFzc05hbWUgPSBcInNwaW5uZXJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRyZWVFbGVtZW50LmFwcGVuZENoaWxkKGxvYWRlckVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgcmV1c2UgdGhlIHNhbWUgYWN0aW9uIGhlcmUgYXMgYmVsb3cgc2luY2Ugd2Ugd2FudCB0byByZW1vdmUgdGhlIHNwaW5uZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgYWN0dWFsbHkgc2V0dGluZyB0aGUgZXhwYW5kZWQgY2xhc3Mgb24gdGhlIGtleSBlbGVtZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyKHN1YnRyZWVFbGVtZW50LCBkYXRhQXR0cmlidXRlVmFsdWUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNUb2dnbGVTdGF0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHJlZUVsZW1lbnQucmVtb3ZlQ2hpbGQobG9hZGVyRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5RWxlbWVudC5jbGFzc05hbWUgPSBrZXlFbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKC9cXGJjb2xsYXBzZWRcXGIvLCBcImV4cGFuZGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIoc3VidHJlZUVsZW1lbnQsIGRhdGFBdHRyaWJ1dGVWYWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzVG9nZ2xlU3RhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5RWxlbWVudC5jbGFzc05hbWUgPSBrZXlFbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKC9cXGJjb2xsYXBzZWRcXGIvLCBcImV4cGFuZGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2xsYXBzZShzdWJ0cmVlRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNUb2dnbGVTdGF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBrZXlFbGVtZW50LmNsYXNzTmFtZSA9IGtleUVsZW1lbnQuY2xhc3NOYW1lLnJlcGxhY2UoL1xcYmV4cGFuZGVkXFxiLywgXCJjb2xsYXBzZWRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhQXR0cmlidXRlVHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgY29uc3QgdmFsdWVUZXh0RWxlbWVudCA9IHRoaXMuY29uc3RydWN0VGV4dEVsZW1lbnQoXCJcXFwiXCIgKyBkYXRhQXR0cmlidXRlVmFsdWUgKyBcIlxcXCJcIiwgb3B0aW9ucyk7XG4gICAgICAgICAgICB2YWx1ZUVsZW1lbnQuYXBwZW5kQ2hpbGQodmFsdWVUZXh0RWxlbWVudCk7XG4gICAgICAgICAgICBrZXlWYWx1ZVBhcmVudC5hcHBlbmRDaGlsZCh2YWx1ZUVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdmFsdWVUZXh0RWxlbWVudCA9IHRoaXMuY29uc3RydWN0VGV4dEVsZW1lbnQoZGF0YUF0dHJpYnV0ZVZhbHVlLnRvU3RyaW5nKCksIG9wdGlvbnMpO1xuICAgICAgICAgICAgdmFsdWVFbGVtZW50LmFwcGVuZENoaWxkKHZhbHVlVGV4dEVsZW1lbnQpO1xuICAgICAgICAgICAga2V5VmFsdWVQYXJlbnQuYXBwZW5kQ2hpbGQodmFsdWVFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBrZXlWYWx1ZVBhcmVudDtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExhenlPYmplY3RWaWV3O1xuIiwiXG52YXIgY29udGVudCA9IHJlcXVpcmUoXCIhIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4uLy4uL25vZGVfbW9kdWxlcy9zYXNzLWxvYWRlci9saWIvbG9hZGVyLmpzIS4vaW5kZXguc2Nzc1wiKTtcblxuaWYodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG5cbnZhciB0cmFuc2Zvcm07XG52YXIgaW5zZXJ0SW50bztcblxuXG5cbnZhciBvcHRpb25zID0ge1wiaG1yXCI6dHJ1ZX1cblxub3B0aW9ucy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm1cbm9wdGlvbnMuaW5zZXJ0SW50byA9IHVuZGVmaW5lZDtcblxudmFyIHVwZGF0ZSA9IHJlcXVpcmUoXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9saWIvYWRkU3R5bGVzLmpzXCIpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5pZihjb250ZW50LmxvY2FscykgbW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2FscztcblxuaWYobW9kdWxlLmhvdCkge1xuXHRtb2R1bGUuaG90LmFjY2VwdChcIiEhLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vbm9kZV9tb2R1bGVzL3Nhc3MtbG9hZGVyL2xpYi9sb2FkZXIuanMhLi9pbmRleC5zY3NzXCIsIGZ1bmN0aW9uKCkge1xuXHRcdHZhciBuZXdDb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi4vLi4vbm9kZV9tb2R1bGVzL3Nhc3MtbG9hZGVyL2xpYi9sb2FkZXIuanMhLi9pbmRleC5zY3NzXCIpO1xuXG5cdFx0aWYodHlwZW9mIG5ld0NvbnRlbnQgPT09ICdzdHJpbmcnKSBuZXdDb250ZW50ID0gW1ttb2R1bGUuaWQsIG5ld0NvbnRlbnQsICcnXV07XG5cblx0XHR2YXIgbG9jYWxzID0gKGZ1bmN0aW9uKGEsIGIpIHtcblx0XHRcdHZhciBrZXksIGlkeCA9IDA7XG5cblx0XHRcdGZvcihrZXkgaW4gYSkge1xuXHRcdFx0XHRpZighYiB8fCBhW2tleV0gIT09IGJba2V5XSkgcmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRpZHgrKztcblx0XHRcdH1cblxuXHRcdFx0Zm9yKGtleSBpbiBiKSBpZHgtLTtcblxuXHRcdFx0cmV0dXJuIGlkeCA9PT0gMDtcblx0XHR9KGNvbnRlbnQubG9jYWxzLCBuZXdDb250ZW50LmxvY2FscykpO1xuXG5cdFx0aWYoIWxvY2FscykgdGhyb3cgbmV3IEVycm9yKCdBYm9ydGluZyBDU1MgSE1SIGR1ZSB0byBjaGFuZ2VkIGNzcy1tb2R1bGVzIGxvY2Fscy4nKTtcblxuXHRcdHVwZGF0ZShuZXdDb250ZW50KTtcblx0fSk7XG5cblx0bW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkgeyB1cGRhdGUoKTsgfSk7XG59IiwiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIikoZmFsc2UpO1xuLy8gTW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCIuc3Bpbm5lcntib3JkZXI6M3B4IHNvbGlkICNmM2YzZjM7Ym9yZGVyLXRvcDozcHggc29saWQgIzk5OTk5OTtib3JkZXItcmFkaXVzOjUwJTt3aWR0aDoxMHB4O2hlaWdodDoxMHB4O2FuaW1hdGlvbjpzcGluIDJzIGxpbmVhciBpbmZpbml0ZTtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tdG9wOjVweH1Aa2V5ZnJhbWVzIHNwaW57MCV7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX0xMDAle3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19LmNvbGxhcHNlZDo6YmVmb3Jle2NvbnRlbnQ6XFxcIitcXFwifS5leHBhbmRlZDo6YmVmb3Jle2NvbnRlbnQ6XFxcIi1cXFwifS5zdWJ0cmVle21hcmdpbi1sZWZ0OjE1cHh9LmtleXtmb250LXN0eWxlOml0YWxpYztjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmlubGluZS1ibG9ja30ua2V5OjpiZWZvcmV7Zm9udC1zaXplOjAuOGVtO2NvbG9yOiM5OTk7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MTBweH0ua2V5OjphZnRlcntjb250ZW50OlxcXCI6XFxcIn0udmFsdWV7bWFyZ2luLWxlZnQ6MTBweDtkaXNwbGF5OmlubGluZS1ibG9jazt3aGl0ZS1zcGFjZTpwcmUtd3JhcH0udmFsdWUudW5kZWZpbmVkLC52YWx1ZS5udWxsLC52YWx1ZS5lbXB0eXtjb2xvcjojNjY2fS5rZXktdmFsdWV7bWFyZ2luOjJweCAwcHg7Zm9udC1mYW1pbHk6bW9ub3NwYWNlfS5lbGxpcHNlc3ttYXJnaW4tbGVmdDo0cHg7Zm9udC1zaXplOjAuOGVtO2NvbG9yOiM5OTk7Y3Vyc29yOnBvaW50ZXJ9XFxuXCIsIFwiXCJdKTtcblxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qXG4gIE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXG4gIEF1dGhvciBUb2JpYXMgS29wcGVycyBAc29rcmFcbiovXG4vLyBjc3MgYmFzZSBjb2RlLCBpbmplY3RlZCBieSB0aGUgY3NzLWxvYWRlclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodXNlU291cmNlTWFwKSB7XG4gIHZhciBsaXN0ID0gW107IC8vIHJldHVybiB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzIGNzcyBzdHJpbmdcblxuICBsaXN0LnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgY29udGVudCA9IGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcoaXRlbSwgdXNlU291cmNlTWFwKTtcblxuICAgICAgaWYgKGl0ZW1bMl0pIHtcbiAgICAgICAgcmV0dXJuICdAbWVkaWEgJyArIGl0ZW1bMl0gKyAneycgKyBjb250ZW50ICsgJ30nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICB9XG4gICAgfSkuam9pbignJyk7XG4gIH07IC8vIGltcG9ydCBhIGxpc3Qgb2YgbW9kdWxlcyBpbnRvIHRoZSBsaXN0XG5cblxuICBsaXN0LmkgPSBmdW5jdGlvbiAobW9kdWxlcywgbWVkaWFRdWVyeSkge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG1vZHVsZXMgPSBbW251bGwsIG1vZHVsZXMsICcnXV07XG4gICAgfVxuXG4gICAgdmFyIGFscmVhZHlJbXBvcnRlZE1vZHVsZXMgPSB7fTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkID0gdGhpc1tpXVswXTtcblxuICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpZF0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoaSA9IDA7IGkgPCBtb2R1bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IG1vZHVsZXNbaV07IC8vIHNraXAgYWxyZWFkeSBpbXBvcnRlZCBtb2R1bGVcbiAgICAgIC8vIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IDEwMCUgcGVyZmVjdCBmb3Igd2VpcmQgbWVkaWEgcXVlcnkgY29tYmluYXRpb25zXG4gICAgICAvLyB3aGVuIGEgbW9kdWxlIGlzIGltcG9ydGVkIG11bHRpcGxlIHRpbWVzIHdpdGggZGlmZmVyZW50IG1lZGlhIHF1ZXJpZXMuXG4gICAgICAvLyBJIGhvcGUgdGhpcyB3aWxsIG5ldmVyIG9jY3VyIChIZXkgdGhpcyB3YXkgd2UgaGF2ZSBzbWFsbGVyIGJ1bmRsZXMpXG5cbiAgICAgIGlmIChpdGVtWzBdID09IG51bGwgfHwgIWFscmVhZHlJbXBvcnRlZE1vZHVsZXNbaXRlbVswXV0pIHtcbiAgICAgICAgaWYgKG1lZGlhUXVlcnkgJiYgIWl0ZW1bMl0pIHtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWFRdWVyeTtcbiAgICAgICAgfSBlbHNlIGlmIChtZWRpYVF1ZXJ5KSB7XG4gICAgICAgICAgaXRlbVsyXSA9ICcoJyArIGl0ZW1bMl0gKyAnKSBhbmQgKCcgKyBtZWRpYVF1ZXJ5ICsgJyknO1xuICAgICAgICB9XG5cbiAgICAgICAgbGlzdC5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZXR1cm4gbGlzdDtcbn07XG5cbmZ1bmN0aW9uIGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcoaXRlbSwgdXNlU291cmNlTWFwKSB7XG4gIHZhciBjb250ZW50ID0gaXRlbVsxXSB8fCAnJztcbiAgdmFyIGNzc01hcHBpbmcgPSBpdGVtWzNdO1xuXG4gIGlmICghY3NzTWFwcGluZykge1xuICAgIHJldHVybiBjb250ZW50O1xuICB9XG5cbiAgaWYgKHVzZVNvdXJjZU1hcCAmJiB0eXBlb2YgYnRvYSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBzb3VyY2VNYXBwaW5nID0gdG9Db21tZW50KGNzc01hcHBpbmcpO1xuICAgIHZhciBzb3VyY2VVUkxzID0gY3NzTWFwcGluZy5zb3VyY2VzLm1hcChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgICByZXR1cm4gJy8qIyBzb3VyY2VVUkw9JyArIGNzc01hcHBpbmcuc291cmNlUm9vdCArIHNvdXJjZSArICcgKi8nO1xuICAgIH0pO1xuICAgIHJldHVybiBbY29udGVudF0uY29uY2F0KHNvdXJjZVVSTHMpLmNvbmNhdChbc291cmNlTWFwcGluZ10pLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgcmV0dXJuIFtjb250ZW50XS5qb2luKCdcXG4nKTtcbn0gLy8gQWRhcHRlZCBmcm9tIGNvbnZlcnQtc291cmNlLW1hcCAoTUlUKVxuXG5cbmZ1bmN0aW9uIHRvQ29tbWVudChzb3VyY2VNYXApIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHZhciBiYXNlNjQgPSBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpO1xuICB2YXIgZGF0YSA9ICdzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCwnICsgYmFzZTY0O1xuICByZXR1cm4gJy8qIyAnICsgZGF0YSArICcgKi8nO1xufSIsIi8qXG5cdE1JVCBMaWNlbnNlIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXG5cdEF1dGhvciBUb2JpYXMgS29wcGVycyBAc29rcmFcbiovXG5cbnZhciBzdHlsZXNJbkRvbSA9IHt9O1xuXG52YXJcdG1lbW9pemUgPSBmdW5jdGlvbiAoZm4pIHtcblx0dmFyIG1lbW87XG5cblx0cmV0dXJuIGZ1bmN0aW9uICgpIHtcblx0XHRpZiAodHlwZW9mIG1lbW8gPT09IFwidW5kZWZpbmVkXCIpIG1lbW8gPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHRcdHJldHVybiBtZW1vO1xuXHR9O1xufTtcblxudmFyIGlzT2xkSUUgPSBtZW1vaXplKGZ1bmN0aW9uICgpIHtcblx0Ly8gVGVzdCBmb3IgSUUgPD0gOSBhcyBwcm9wb3NlZCBieSBCcm93c2VyaGFja3Ncblx0Ly8gQHNlZSBodHRwOi8vYnJvd3NlcmhhY2tzLmNvbS8jaGFjay1lNzFkODY5MmY2NTMzNDE3M2ZlZTcxNWMyMjJjYjgwNVxuXHQvLyBUZXN0cyBmb3IgZXhpc3RlbmNlIG9mIHN0YW5kYXJkIGdsb2JhbHMgaXMgdG8gYWxsb3cgc3R5bGUtbG9hZGVyXG5cdC8vIHRvIG9wZXJhdGUgY29ycmVjdGx5IGludG8gbm9uLXN0YW5kYXJkIGVudmlyb25tZW50c1xuXHQvLyBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJwYWNrLWNvbnRyaWIvc3R5bGUtbG9hZGVyL2lzc3Vlcy8xNzdcblx0cmV0dXJuIHdpbmRvdyAmJiBkb2N1bWVudCAmJiBkb2N1bWVudC5hbGwgJiYgIXdpbmRvdy5hdG9iO1xufSk7XG5cbnZhciBnZXRUYXJnZXQgPSBmdW5jdGlvbiAodGFyZ2V0LCBwYXJlbnQpIHtcbiAgaWYgKHBhcmVudCl7XG4gICAgcmV0dXJuIHBhcmVudC5xdWVyeVNlbGVjdG9yKHRhcmdldCk7XG4gIH1cbiAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTtcbn07XG5cbnZhciBnZXRFbGVtZW50ID0gKGZ1bmN0aW9uIChmbikge1xuXHR2YXIgbWVtbyA9IHt9O1xuXG5cdHJldHVybiBmdW5jdGlvbih0YXJnZXQsIHBhcmVudCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHBhc3NpbmcgZnVuY3Rpb24gaW4gb3B0aW9ucywgdGhlbiB1c2UgaXQgZm9yIHJlc29sdmUgXCJoZWFkXCIgZWxlbWVudC5cbiAgICAgICAgICAgICAgICAvLyBVc2VmdWwgZm9yIFNoYWRvdyBSb290IHN0eWxlIGkuZVxuICAgICAgICAgICAgICAgIC8vIHtcbiAgICAgICAgICAgICAgICAvLyAgIGluc2VydEludG86IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjZm9vXCIpLnNoYWRvd1Jvb3QgfVxuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1lbW9bdGFyZ2V0XSA9PT0gXCJ1bmRlZmluZWRcIikge1xuXHRcdFx0dmFyIHN0eWxlVGFyZ2V0ID0gZ2V0VGFyZ2V0LmNhbGwodGhpcywgdGFyZ2V0LCBwYXJlbnQpO1xuXHRcdFx0Ly8gU3BlY2lhbCBjYXNlIHRvIHJldHVybiBoZWFkIG9mIGlmcmFtZSBpbnN0ZWFkIG9mIGlmcmFtZSBpdHNlbGZcblx0XHRcdGlmICh3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQgJiYgc3R5bGVUYXJnZXQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQpIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHQvLyBUaGlzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFjY2VzcyB0byBpZnJhbWUgaXMgYmxvY2tlZFxuXHRcdFx0XHRcdC8vIGR1ZSB0byBjcm9zcy1vcmlnaW4gcmVzdHJpY3Rpb25zXG5cdFx0XHRcdFx0c3R5bGVUYXJnZXQgPSBzdHlsZVRhcmdldC5jb250ZW50RG9jdW1lbnQuaGVhZDtcblx0XHRcdFx0fSBjYXRjaChlKSB7XG5cdFx0XHRcdFx0c3R5bGVUYXJnZXQgPSBudWxsO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRtZW1vW3RhcmdldF0gPSBzdHlsZVRhcmdldDtcblx0XHR9XG5cdFx0cmV0dXJuIG1lbW9bdGFyZ2V0XVxuXHR9O1xufSkoKTtcblxudmFyIHNpbmdsZXRvbiA9IG51bGw7XG52YXJcdHNpbmdsZXRvbkNvdW50ZXIgPSAwO1xudmFyXHRzdHlsZXNJbnNlcnRlZEF0VG9wID0gW107XG5cbnZhclx0Zml4VXJscyA9IHJlcXVpcmUoXCIuL3VybHNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obGlzdCwgb3B0aW9ucykge1xuXHRpZiAodHlwZW9mIERFQlVHICE9PSBcInVuZGVmaW5lZFwiICYmIERFQlVHKSB7XG5cdFx0aWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHN0eWxlLWxvYWRlciBjYW5ub3QgYmUgdXNlZCBpbiBhIG5vbi1icm93c2VyIGVudmlyb25tZW50XCIpO1xuXHR9XG5cblx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0b3B0aW9ucy5hdHRycyA9IHR5cGVvZiBvcHRpb25zLmF0dHJzID09PSBcIm9iamVjdFwiID8gb3B0aW9ucy5hdHRycyA6IHt9O1xuXG5cdC8vIEZvcmNlIHNpbmdsZS10YWcgc29sdXRpb24gb24gSUU2LTksIHdoaWNoIGhhcyBhIGhhcmQgbGltaXQgb24gdGhlICMgb2YgPHN0eWxlPlxuXHQvLyB0YWdzIGl0IHdpbGwgYWxsb3cgb24gYSBwYWdlXG5cdGlmICghb3B0aW9ucy5zaW5nbGV0b24gJiYgdHlwZW9mIG9wdGlvbnMuc2luZ2xldG9uICE9PSBcImJvb2xlYW5cIikgb3B0aW9ucy5zaW5nbGV0b24gPSBpc09sZElFKCk7XG5cblx0Ly8gQnkgZGVmYXVsdCwgYWRkIDxzdHlsZT4gdGFncyB0byB0aGUgPGhlYWQ+IGVsZW1lbnRcbiAgICAgICAgaWYgKCFvcHRpb25zLmluc2VydEludG8pIG9wdGlvbnMuaW5zZXJ0SW50byA9IFwiaGVhZFwiO1xuXG5cdC8vIEJ5IGRlZmF1bHQsIGFkZCA8c3R5bGU+IHRhZ3MgdG8gdGhlIGJvdHRvbSBvZiB0aGUgdGFyZ2V0XG5cdGlmICghb3B0aW9ucy5pbnNlcnRBdCkgb3B0aW9ucy5pbnNlcnRBdCA9IFwiYm90dG9tXCI7XG5cblx0dmFyIHN0eWxlcyA9IGxpc3RUb1N0eWxlcyhsaXN0LCBvcHRpb25zKTtcblxuXHRhZGRTdHlsZXNUb0RvbShzdHlsZXMsIG9wdGlvbnMpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUgKG5ld0xpc3QpIHtcblx0XHR2YXIgbWF5UmVtb3ZlID0gW107XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGl0ZW0gPSBzdHlsZXNbaV07XG5cdFx0XHR2YXIgZG9tU3R5bGUgPSBzdHlsZXNJbkRvbVtpdGVtLmlkXTtcblxuXHRcdFx0ZG9tU3R5bGUucmVmcy0tO1xuXHRcdFx0bWF5UmVtb3ZlLnB1c2goZG9tU3R5bGUpO1xuXHRcdH1cblxuXHRcdGlmKG5ld0xpc3QpIHtcblx0XHRcdHZhciBuZXdTdHlsZXMgPSBsaXN0VG9TdHlsZXMobmV3TGlzdCwgb3B0aW9ucyk7XG5cdFx0XHRhZGRTdHlsZXNUb0RvbShuZXdTdHlsZXMsIG9wdGlvbnMpO1xuXHRcdH1cblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbWF5UmVtb3ZlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgZG9tU3R5bGUgPSBtYXlSZW1vdmVbaV07XG5cblx0XHRcdGlmKGRvbVN0eWxlLnJlZnMgPT09IDApIHtcblx0XHRcdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBkb21TdHlsZS5wYXJ0cy5sZW5ndGg7IGorKykgZG9tU3R5bGUucGFydHNbal0oKTtcblxuXHRcdFx0XHRkZWxldGUgc3R5bGVzSW5Eb21bZG9tU3R5bGUuaWRdO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn07XG5cbmZ1bmN0aW9uIGFkZFN0eWxlc1RvRG9tIChzdHlsZXMsIG9wdGlvbnMpIHtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgaXRlbSA9IHN0eWxlc1tpXTtcblx0XHR2YXIgZG9tU3R5bGUgPSBzdHlsZXNJbkRvbVtpdGVtLmlkXTtcblxuXHRcdGlmKGRvbVN0eWxlKSB7XG5cdFx0XHRkb21TdHlsZS5yZWZzKys7XG5cblx0XHRcdGZvcih2YXIgaiA9IDA7IGogPCBkb21TdHlsZS5wYXJ0cy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRkb21TdHlsZS5wYXJ0c1tqXShpdGVtLnBhcnRzW2pdKTtcblx0XHRcdH1cblxuXHRcdFx0Zm9yKDsgaiA8IGl0ZW0ucGFydHMubGVuZ3RoOyBqKyspIHtcblx0XHRcdFx0ZG9tU3R5bGUucGFydHMucHVzaChhZGRTdHlsZShpdGVtLnBhcnRzW2pdLCBvcHRpb25zKSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhciBwYXJ0cyA9IFtdO1xuXG5cdFx0XHRmb3IodmFyIGogPSAwOyBqIDwgaXRlbS5wYXJ0cy5sZW5ndGg7IGorKykge1xuXHRcdFx0XHRwYXJ0cy5wdXNoKGFkZFN0eWxlKGl0ZW0ucGFydHNbal0sIG9wdGlvbnMpKTtcblx0XHRcdH1cblxuXHRcdFx0c3R5bGVzSW5Eb21baXRlbS5pZF0gPSB7aWQ6IGl0ZW0uaWQsIHJlZnM6IDEsIHBhcnRzOiBwYXJ0c307XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGxpc3RUb1N0eWxlcyAobGlzdCwgb3B0aW9ucykge1xuXHR2YXIgc3R5bGVzID0gW107XG5cdHZhciBuZXdTdHlsZXMgPSB7fTtcblxuXHRmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcblx0XHR2YXIgaXRlbSA9IGxpc3RbaV07XG5cdFx0dmFyIGlkID0gb3B0aW9ucy5iYXNlID8gaXRlbVswXSArIG9wdGlvbnMuYmFzZSA6IGl0ZW1bMF07XG5cdFx0dmFyIGNzcyA9IGl0ZW1bMV07XG5cdFx0dmFyIG1lZGlhID0gaXRlbVsyXTtcblx0XHR2YXIgc291cmNlTWFwID0gaXRlbVszXTtcblx0XHR2YXIgcGFydCA9IHtjc3M6IGNzcywgbWVkaWE6IG1lZGlhLCBzb3VyY2VNYXA6IHNvdXJjZU1hcH07XG5cblx0XHRpZighbmV3U3R5bGVzW2lkXSkgc3R5bGVzLnB1c2gobmV3U3R5bGVzW2lkXSA9IHtpZDogaWQsIHBhcnRzOiBbcGFydF19KTtcblx0XHRlbHNlIG5ld1N0eWxlc1tpZF0ucGFydHMucHVzaChwYXJ0KTtcblx0fVxuXG5cdHJldHVybiBzdHlsZXM7XG59XG5cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudCAob3B0aW9ucywgc3R5bGUpIHtcblx0dmFyIHRhcmdldCA9IGdldEVsZW1lbnQob3B0aW9ucy5pbnNlcnRJbnRvKVxuXG5cdGlmICghdGFyZ2V0KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnRJbnRvJyBwYXJhbWV0ZXIgaXMgaW52YWxpZC5cIik7XG5cdH1cblxuXHR2YXIgbGFzdFN0eWxlRWxlbWVudEluc2VydGVkQXRUb3AgPSBzdHlsZXNJbnNlcnRlZEF0VG9wW3N0eWxlc0luc2VydGVkQXRUb3AubGVuZ3RoIC0gMV07XG5cblx0aWYgKG9wdGlvbnMuaW5zZXJ0QXQgPT09IFwidG9wXCIpIHtcblx0XHRpZiAoIWxhc3RTdHlsZUVsZW1lbnRJbnNlcnRlZEF0VG9wKSB7XG5cdFx0XHR0YXJnZXQuaW5zZXJ0QmVmb3JlKHN0eWxlLCB0YXJnZXQuZmlyc3RDaGlsZCk7XG5cdFx0fSBlbHNlIGlmIChsYXN0U3R5bGVFbGVtZW50SW5zZXJ0ZWRBdFRvcC5uZXh0U2libGluZykge1xuXHRcdFx0dGFyZ2V0Lmluc2VydEJlZm9yZShzdHlsZSwgbGFzdFN0eWxlRWxlbWVudEluc2VydGVkQXRUb3AubmV4dFNpYmxpbmcpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuXHRcdH1cblx0XHRzdHlsZXNJbnNlcnRlZEF0VG9wLnB1c2goc3R5bGUpO1xuXHR9IGVsc2UgaWYgKG9wdGlvbnMuaW5zZXJ0QXQgPT09IFwiYm90dG9tXCIpIHtcblx0XHR0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zLmluc2VydEF0ID09PSBcIm9iamVjdFwiICYmIG9wdGlvbnMuaW5zZXJ0QXQuYmVmb3JlKSB7XG5cdFx0dmFyIG5leHRTaWJsaW5nID0gZ2V0RWxlbWVudChvcHRpb25zLmluc2VydEF0LmJlZm9yZSwgdGFyZ2V0KTtcblx0XHR0YXJnZXQuaW5zZXJ0QmVmb3JlKHN0eWxlLCBuZXh0U2libGluZyk7XG5cdH0gZWxzZSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwiW1N0eWxlIExvYWRlcl1cXG5cXG4gSW52YWxpZCB2YWx1ZSBmb3IgcGFyYW1ldGVyICdpbnNlcnRBdCcgKCdvcHRpb25zLmluc2VydEF0JykgZm91bmQuXFxuIE11c3QgYmUgJ3RvcCcsICdib3R0b20nLCBvciBPYmplY3QuXFxuIChodHRwczovL2dpdGh1Yi5jb20vd2VicGFjay1jb250cmliL3N0eWxlLWxvYWRlciNpbnNlcnRhdClcXG5cIik7XG5cdH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlU3R5bGVFbGVtZW50IChzdHlsZSkge1xuXHRpZiAoc3R5bGUucGFyZW50Tm9kZSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuXHRzdHlsZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlKTtcblxuXHR2YXIgaWR4ID0gc3R5bGVzSW5zZXJ0ZWRBdFRvcC5pbmRleE9mKHN0eWxlKTtcblx0aWYoaWR4ID49IDApIHtcblx0XHRzdHlsZXNJbnNlcnRlZEF0VG9wLnNwbGljZShpZHgsIDEpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVN0eWxlRWxlbWVudCAob3B0aW9ucykge1xuXHR2YXIgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG5cblx0aWYob3B0aW9ucy5hdHRycy50eXBlID09PSB1bmRlZmluZWQpIHtcblx0XHRvcHRpb25zLmF0dHJzLnR5cGUgPSBcInRleHQvY3NzXCI7XG5cdH1cblxuXHRpZihvcHRpb25zLmF0dHJzLm5vbmNlID09PSB1bmRlZmluZWQpIHtcblx0XHR2YXIgbm9uY2UgPSBnZXROb25jZSgpO1xuXHRcdGlmIChub25jZSkge1xuXHRcdFx0b3B0aW9ucy5hdHRycy5ub25jZSA9IG5vbmNlO1xuXHRcdH1cblx0fVxuXG5cdGFkZEF0dHJzKHN0eWxlLCBvcHRpb25zLmF0dHJzKTtcblx0aW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMsIHN0eWxlKTtcblxuXHRyZXR1cm4gc3R5bGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUxpbmtFbGVtZW50IChvcHRpb25zKSB7XG5cdHZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpbmtcIik7XG5cblx0aWYob3B0aW9ucy5hdHRycy50eXBlID09PSB1bmRlZmluZWQpIHtcblx0XHRvcHRpb25zLmF0dHJzLnR5cGUgPSBcInRleHQvY3NzXCI7XG5cdH1cblx0b3B0aW9ucy5hdHRycy5yZWwgPSBcInN0eWxlc2hlZXRcIjtcblxuXHRhZGRBdHRycyhsaW5rLCBvcHRpb25zLmF0dHJzKTtcblx0aW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMsIGxpbmspO1xuXG5cdHJldHVybiBsaW5rO1xufVxuXG5mdW5jdGlvbiBhZGRBdHRycyAoZWwsIGF0dHJzKSB7XG5cdE9iamVjdC5rZXlzKGF0dHJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcblx0XHRlbC5zZXRBdHRyaWJ1dGUoa2V5LCBhdHRyc1trZXldKTtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIGdldE5vbmNlKCkge1xuXHRpZiAodHlwZW9mIF9fd2VicGFja19ub25jZV9fID09PSAndW5kZWZpbmVkJykge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0cmV0dXJuIF9fd2VicGFja19ub25jZV9fO1xufVxuXG5mdW5jdGlvbiBhZGRTdHlsZSAob2JqLCBvcHRpb25zKSB7XG5cdHZhciBzdHlsZSwgdXBkYXRlLCByZW1vdmUsIHJlc3VsdDtcblxuXHQvLyBJZiBhIHRyYW5zZm9ybSBmdW5jdGlvbiB3YXMgZGVmaW5lZCwgcnVuIGl0IG9uIHRoZSBjc3Ncblx0aWYgKG9wdGlvbnMudHJhbnNmb3JtICYmIG9iai5jc3MpIHtcblx0ICAgIHJlc3VsdCA9IHR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJ1xuXHRcdCA/IG9wdGlvbnMudHJhbnNmb3JtKG9iai5jc3MpIFxuXHRcdCA6IG9wdGlvbnMudHJhbnNmb3JtLmRlZmF1bHQob2JqLmNzcyk7XG5cblx0ICAgIGlmIChyZXN1bHQpIHtcblx0ICAgIFx0Ly8gSWYgdHJhbnNmb3JtIHJldHVybnMgYSB2YWx1ZSwgdXNlIHRoYXQgaW5zdGVhZCBvZiB0aGUgb3JpZ2luYWwgY3NzLlxuXHQgICAgXHQvLyBUaGlzIGFsbG93cyBydW5uaW5nIHJ1bnRpbWUgdHJhbnNmb3JtYXRpb25zIG9uIHRoZSBjc3MuXG5cdCAgICBcdG9iai5jc3MgPSByZXN1bHQ7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgXHQvLyBJZiB0aGUgdHJhbnNmb3JtIGZ1bmN0aW9uIHJldHVybnMgYSBmYWxzeSB2YWx1ZSwgZG9uJ3QgYWRkIHRoaXMgY3NzLlxuXHQgICAgXHQvLyBUaGlzIGFsbG93cyBjb25kaXRpb25hbCBsb2FkaW5nIG9mIGNzc1xuXHQgICAgXHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdCAgICBcdFx0Ly8gbm9vcFxuXHQgICAgXHR9O1xuXHQgICAgfVxuXHR9XG5cblx0aWYgKG9wdGlvbnMuc2luZ2xldG9uKSB7XG5cdFx0dmFyIHN0eWxlSW5kZXggPSBzaW5nbGV0b25Db3VudGVyKys7XG5cblx0XHRzdHlsZSA9IHNpbmdsZXRvbiB8fCAoc2luZ2xldG9uID0gY3JlYXRlU3R5bGVFbGVtZW50KG9wdGlvbnMpKTtcblxuXHRcdHVwZGF0ZSA9IGFwcGx5VG9TaW5nbGV0b25UYWcuYmluZChudWxsLCBzdHlsZSwgc3R5bGVJbmRleCwgZmFsc2UpO1xuXHRcdHJlbW92ZSA9IGFwcGx5VG9TaW5nbGV0b25UYWcuYmluZChudWxsLCBzdHlsZSwgc3R5bGVJbmRleCwgdHJ1ZSk7XG5cblx0fSBlbHNlIGlmIChcblx0XHRvYmouc291cmNlTWFwICYmXG5cdFx0dHlwZW9mIFVSTCA9PT0gXCJmdW5jdGlvblwiICYmXG5cdFx0dHlwZW9mIFVSTC5jcmVhdGVPYmplY3RVUkwgPT09IFwiZnVuY3Rpb25cIiAmJlxuXHRcdHR5cGVvZiBVUkwucmV2b2tlT2JqZWN0VVJMID09PSBcImZ1bmN0aW9uXCIgJiZcblx0XHR0eXBlb2YgQmxvYiA9PT0gXCJmdW5jdGlvblwiICYmXG5cdFx0dHlwZW9mIGJ0b2EgPT09IFwiZnVuY3Rpb25cIlxuXHQpIHtcblx0XHRzdHlsZSA9IGNyZWF0ZUxpbmtFbGVtZW50KG9wdGlvbnMpO1xuXHRcdHVwZGF0ZSA9IHVwZGF0ZUxpbmsuYmluZChudWxsLCBzdHlsZSwgb3B0aW9ucyk7XG5cdFx0cmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0cmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlKTtcblxuXHRcdFx0aWYoc3R5bGUuaHJlZikgVVJMLnJldm9rZU9iamVjdFVSTChzdHlsZS5ocmVmKTtcblx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdHN0eWxlID0gY3JlYXRlU3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuXHRcdHVwZGF0ZSA9IGFwcGx5VG9UYWcuYmluZChudWxsLCBzdHlsZSk7XG5cdFx0cmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0cmVtb3ZlU3R5bGVFbGVtZW50KHN0eWxlKTtcblx0XHR9O1xuXHR9XG5cblx0dXBkYXRlKG9iaik7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZVN0eWxlIChuZXdPYmopIHtcblx0XHRpZiAobmV3T2JqKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdG5ld09iai5jc3MgPT09IG9iai5jc3MgJiZcblx0XHRcdFx0bmV3T2JqLm1lZGlhID09PSBvYmoubWVkaWEgJiZcblx0XHRcdFx0bmV3T2JqLnNvdXJjZU1hcCA9PT0gb2JqLnNvdXJjZU1hcFxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dXBkYXRlKG9iaiA9IG5ld09iaik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlbW92ZSgpO1xuXHRcdH1cblx0fTtcbn1cblxudmFyIHJlcGxhY2VUZXh0ID0gKGZ1bmN0aW9uICgpIHtcblx0dmFyIHRleHRTdG9yZSA9IFtdO1xuXG5cdHJldHVybiBmdW5jdGlvbiAoaW5kZXgsIHJlcGxhY2VtZW50KSB7XG5cdFx0dGV4dFN0b3JlW2luZGV4XSA9IHJlcGxhY2VtZW50O1xuXG5cdFx0cmV0dXJuIHRleHRTdG9yZS5maWx0ZXIoQm9vbGVhbikuam9pbignXFxuJyk7XG5cdH07XG59KSgpO1xuXG5mdW5jdGlvbiBhcHBseVRvU2luZ2xldG9uVGFnIChzdHlsZSwgaW5kZXgsIHJlbW92ZSwgb2JqKSB7XG5cdHZhciBjc3MgPSByZW1vdmUgPyBcIlwiIDogb2JqLmNzcztcblxuXHRpZiAoc3R5bGUuc3R5bGVTaGVldCkge1xuXHRcdHN0eWxlLnN0eWxlU2hlZXQuY3NzVGV4dCA9IHJlcGxhY2VUZXh0KGluZGV4LCBjc3MpO1xuXHR9IGVsc2Uge1xuXHRcdHZhciBjc3NOb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKTtcblx0XHR2YXIgY2hpbGROb2RlcyA9IHN0eWxlLmNoaWxkTm9kZXM7XG5cblx0XHRpZiAoY2hpbGROb2Rlc1tpbmRleF0pIHN0eWxlLnJlbW92ZUNoaWxkKGNoaWxkTm9kZXNbaW5kZXhdKTtcblxuXHRcdGlmIChjaGlsZE5vZGVzLmxlbmd0aCkge1xuXHRcdFx0c3R5bGUuaW5zZXJ0QmVmb3JlKGNzc05vZGUsIGNoaWxkTm9kZXNbaW5kZXhdKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c3R5bGUuYXBwZW5kQ2hpbGQoY3NzTm9kZSk7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIGFwcGx5VG9UYWcgKHN0eWxlLCBvYmopIHtcblx0dmFyIGNzcyA9IG9iai5jc3M7XG5cdHZhciBtZWRpYSA9IG9iai5tZWRpYTtcblxuXHRpZihtZWRpYSkge1xuXHRcdHN0eWxlLnNldEF0dHJpYnV0ZShcIm1lZGlhXCIsIG1lZGlhKVxuXHR9XG5cblx0aWYoc3R5bGUuc3R5bGVTaGVldCkge1xuXHRcdHN0eWxlLnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzcztcblx0fSBlbHNlIHtcblx0XHR3aGlsZShzdHlsZS5maXJzdENoaWxkKSB7XG5cdFx0XHRzdHlsZS5yZW1vdmVDaGlsZChzdHlsZS5maXJzdENoaWxkKTtcblx0XHR9XG5cblx0XHRzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcblx0fVxufVxuXG5mdW5jdGlvbiB1cGRhdGVMaW5rIChsaW5rLCBvcHRpb25zLCBvYmopIHtcblx0dmFyIGNzcyA9IG9iai5jc3M7XG5cdHZhciBzb3VyY2VNYXAgPSBvYmouc291cmNlTWFwO1xuXG5cdC8qXG5cdFx0SWYgY29udmVydFRvQWJzb2x1dGVVcmxzIGlzbid0IGRlZmluZWQsIGJ1dCBzb3VyY2VtYXBzIGFyZSBlbmFibGVkXG5cdFx0YW5kIHRoZXJlIGlzIG5vIHB1YmxpY1BhdGggZGVmaW5lZCB0aGVuIGxldHMgdHVybiBjb252ZXJ0VG9BYnNvbHV0ZVVybHNcblx0XHRvbiBieSBkZWZhdWx0LiAgT3RoZXJ3aXNlIGRlZmF1bHQgdG8gdGhlIGNvbnZlcnRUb0Fic29sdXRlVXJscyBvcHRpb25cblx0XHRkaXJlY3RseVxuXHQqL1xuXHR2YXIgYXV0b0ZpeFVybHMgPSBvcHRpb25zLmNvbnZlcnRUb0Fic29sdXRlVXJscyA9PT0gdW5kZWZpbmVkICYmIHNvdXJjZU1hcDtcblxuXHRpZiAob3B0aW9ucy5jb252ZXJ0VG9BYnNvbHV0ZVVybHMgfHwgYXV0b0ZpeFVybHMpIHtcblx0XHRjc3MgPSBmaXhVcmxzKGNzcyk7XG5cdH1cblxuXHRpZiAoc291cmNlTWFwKSB7XG5cdFx0Ly8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjY2MDM4NzVcblx0XHRjc3MgKz0gXCJcXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LFwiICsgYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoc291cmNlTWFwKSkpKSArIFwiICovXCI7XG5cdH1cblxuXHR2YXIgYmxvYiA9IG5ldyBCbG9iKFtjc3NdLCB7IHR5cGU6IFwidGV4dC9jc3NcIiB9KTtcblxuXHR2YXIgb2xkU3JjID0gbGluay5ocmVmO1xuXG5cdGxpbmsuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG5cblx0aWYob2xkU3JjKSBVUkwucmV2b2tlT2JqZWN0VVJMKG9sZFNyYyk7XG59XG4iLCJcbi8qKlxuICogV2hlbiBzb3VyY2UgbWFwcyBhcmUgZW5hYmxlZCwgYHN0eWxlLWxvYWRlcmAgdXNlcyBhIGxpbmsgZWxlbWVudCB3aXRoIGEgZGF0YS11cmkgdG9cbiAqIGVtYmVkIHRoZSBjc3Mgb24gdGhlIHBhZ2UuIFRoaXMgYnJlYWtzIGFsbCByZWxhdGl2ZSB1cmxzIGJlY2F1c2Ugbm93IHRoZXkgYXJlIHJlbGF0aXZlIHRvIGFcbiAqIGJ1bmRsZSBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHBhZ2UuXG4gKlxuICogT25lIHNvbHV0aW9uIGlzIHRvIG9ubHkgdXNlIGZ1bGwgdXJscywgYnV0IHRoYXQgbWF5IGJlIGltcG9zc2libGUuXG4gKlxuICogSW5zdGVhZCwgdGhpcyBmdW5jdGlvbiBcImZpeGVzXCIgdGhlIHJlbGF0aXZlIHVybHMgdG8gYmUgYWJzb2x1dGUgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHBhZ2UgbG9jYXRpb24uXG4gKlxuICogQSBydWRpbWVudGFyeSB0ZXN0IHN1aXRlIGlzIGxvY2F0ZWQgYXQgYHRlc3QvZml4VXJscy5qc2AgYW5kIGNhbiBiZSBydW4gdmlhIHRoZSBgbnBtIHRlc3RgIGNvbW1hbmQuXG4gKlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNzcykge1xuICAvLyBnZXQgY3VycmVudCBsb2NhdGlvblxuICB2YXIgbG9jYXRpb24gPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5sb2NhdGlvbjtcblxuICBpZiAoIWxvY2F0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiZml4VXJscyByZXF1aXJlcyB3aW5kb3cubG9jYXRpb25cIik7XG4gIH1cblxuXHQvLyBibGFuayBvciBudWxsP1xuXHRpZiAoIWNzcyB8fCB0eXBlb2YgY3NzICE9PSBcInN0cmluZ1wiKSB7XG5cdCAgcmV0dXJuIGNzcztcbiAgfVxuXG4gIHZhciBiYXNlVXJsID0gbG9jYXRpb24ucHJvdG9jb2wgKyBcIi8vXCIgKyBsb2NhdGlvbi5ob3N0O1xuICB2YXIgY3VycmVudERpciA9IGJhc2VVcmwgKyBsb2NhdGlvbi5wYXRobmFtZS5yZXBsYWNlKC9cXC9bXlxcL10qJC8sIFwiL1wiKTtcblxuXHQvLyBjb252ZXJ0IGVhY2ggdXJsKC4uLilcblx0Lypcblx0VGhpcyByZWd1bGFyIGV4cHJlc3Npb24gaXMganVzdCBhIHdheSB0byByZWN1cnNpdmVseSBtYXRjaCBicmFja2V0cyB3aXRoaW5cblx0YSBzdHJpbmcuXG5cblx0IC91cmxcXHMqXFwoICA9IE1hdGNoIG9uIHRoZSB3b3JkIFwidXJsXCIgd2l0aCBhbnkgd2hpdGVzcGFjZSBhZnRlciBpdCBhbmQgdGhlbiBhIHBhcmVuc1xuXHQgICAoICA9IFN0YXJ0IGEgY2FwdHVyaW5nIGdyb3VwXG5cdCAgICAgKD86ICA9IFN0YXJ0IGEgbm9uLWNhcHR1cmluZyBncm91cFxuXHQgICAgICAgICBbXikoXSAgPSBNYXRjaCBhbnl0aGluZyB0aGF0IGlzbid0IGEgcGFyZW50aGVzZXNcblx0ICAgICAgICAgfCAgPSBPUlxuXHQgICAgICAgICBcXCggID0gTWF0Y2ggYSBzdGFydCBwYXJlbnRoZXNlc1xuXHQgICAgICAgICAgICAgKD86ICA9IFN0YXJ0IGFub3RoZXIgbm9uLWNhcHR1cmluZyBncm91cHNcblx0ICAgICAgICAgICAgICAgICBbXikoXSsgID0gTWF0Y2ggYW55dGhpbmcgdGhhdCBpc24ndCBhIHBhcmVudGhlc2VzXG5cdCAgICAgICAgICAgICAgICAgfCAgPSBPUlxuXHQgICAgICAgICAgICAgICAgIFxcKCAgPSBNYXRjaCBhIHN0YXJ0IHBhcmVudGhlc2VzXG5cdCAgICAgICAgICAgICAgICAgICAgIFteKShdKiAgPSBNYXRjaCBhbnl0aGluZyB0aGF0IGlzbid0IGEgcGFyZW50aGVzZXNcblx0ICAgICAgICAgICAgICAgICBcXCkgID0gTWF0Y2ggYSBlbmQgcGFyZW50aGVzZXNcblx0ICAgICAgICAgICAgICkgID0gRW5kIEdyb3VwXG4gICAgICAgICAgICAgICpcXCkgPSBNYXRjaCBhbnl0aGluZyBhbmQgdGhlbiBhIGNsb3NlIHBhcmVuc1xuICAgICAgICAgICkgID0gQ2xvc2Ugbm9uLWNhcHR1cmluZyBncm91cFxuICAgICAgICAgICogID0gTWF0Y2ggYW55dGhpbmdcbiAgICAgICApICA9IENsb3NlIGNhcHR1cmluZyBncm91cFxuXHQgXFwpICA9IE1hdGNoIGEgY2xvc2UgcGFyZW5zXG5cblx0IC9naSAgPSBHZXQgYWxsIG1hdGNoZXMsIG5vdCB0aGUgZmlyc3QuICBCZSBjYXNlIGluc2Vuc2l0aXZlLlxuXHQgKi9cblx0dmFyIGZpeGVkQ3NzID0gY3NzLnJlcGxhY2UoL3VybFxccypcXCgoKD86W14pKF18XFwoKD86W14pKF0rfFxcKFteKShdKlxcKSkqXFwpKSopXFwpL2dpLCBmdW5jdGlvbihmdWxsTWF0Y2gsIG9yaWdVcmwpIHtcblx0XHQvLyBzdHJpcCBxdW90ZXMgKGlmIHRoZXkgZXhpc3QpXG5cdFx0dmFyIHVucXVvdGVkT3JpZ1VybCA9IG9yaWdVcmxcblx0XHRcdC50cmltKClcblx0XHRcdC5yZXBsYWNlKC9eXCIoLiopXCIkLywgZnVuY3Rpb24obywgJDEpeyByZXR1cm4gJDE7IH0pXG5cdFx0XHQucmVwbGFjZSgvXicoLiopJyQvLCBmdW5jdGlvbihvLCAkMSl7IHJldHVybiAkMTsgfSk7XG5cblx0XHQvLyBhbHJlYWR5IGEgZnVsbCB1cmw/IG5vIGNoYW5nZVxuXHRcdGlmICgvXigjfGRhdGE6fGh0dHA6XFwvXFwvfGh0dHBzOlxcL1xcL3xmaWxlOlxcL1xcL1xcL3xcXHMqJCkvaS50ZXN0KHVucXVvdGVkT3JpZ1VybCkpIHtcblx0XHQgIHJldHVybiBmdWxsTWF0Y2g7XG5cdFx0fVxuXG5cdFx0Ly8gY29udmVydCB0aGUgdXJsIHRvIGEgZnVsbCB1cmxcblx0XHR2YXIgbmV3VXJsO1xuXG5cdFx0aWYgKHVucXVvdGVkT3JpZ1VybC5pbmRleE9mKFwiLy9cIikgPT09IDApIHtcblx0XHQgIFx0Ly9UT0RPOiBzaG91bGQgd2UgYWRkIHByb3RvY29sP1xuXHRcdFx0bmV3VXJsID0gdW5xdW90ZWRPcmlnVXJsO1xuXHRcdH0gZWxzZSBpZiAodW5xdW90ZWRPcmlnVXJsLmluZGV4T2YoXCIvXCIpID09PSAwKSB7XG5cdFx0XHQvLyBwYXRoIHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgYmFzZSB1cmxcblx0XHRcdG5ld1VybCA9IGJhc2VVcmwgKyB1bnF1b3RlZE9yaWdVcmw7IC8vIGFscmVhZHkgc3RhcnRzIHdpdGggJy8nXG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHBhdGggc2hvdWxkIGJlIHJlbGF0aXZlIHRvIGN1cnJlbnQgZGlyZWN0b3J5XG5cdFx0XHRuZXdVcmwgPSBjdXJyZW50RGlyICsgdW5xdW90ZWRPcmlnVXJsLnJlcGxhY2UoL15cXC5cXC8vLCBcIlwiKTsgLy8gU3RyaXAgbGVhZGluZyAnLi8nXG5cdFx0fVxuXG5cdFx0Ly8gc2VuZCBiYWNrIHRoZSBmaXhlZCB1cmwoLi4uKVxuXHRcdHJldHVybiBcInVybChcIiArIEpTT04uc3RyaW5naWZ5KG5ld1VybCkgKyBcIilcIjtcblx0fSk7XG5cblx0Ly8gc2VuZCBiYWNrIHRoZSBmaXhlZCBjc3Ncblx0cmV0dXJuIGZpeGVkQ3NzO1xufTtcbiJdLCJzb3VyY2VSb290IjoiIn0=