All files / boundless/packages/boundless-dialog/build index.js

46.99% Statements 39/83
28.21% Branches 22/78
41.03% Functions 16/39
100% Lines 1/1
1 26x  
module.exports=function(e){function o(t){Iif(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,o),r.l=!0,r.exports}var n={};return o.m=e,o.c=n,o.i=function(e){return e},o.d=function(e,n,t){o.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:t})},o.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(n,"a",n),n},o.o=function(e,o){return Object.prototype.hasOwnProperty.call(e,o)},o.p="",o(o.s=4)}([function(e,o){e.exports=require("boundless-portal")},function(e,o){e.exports=require("boundless-utils-omit-keys")},function(e,o){e.exports=require("classnames")},function(e,o){e.exports=require("react")},function(e,o,n){"use strict";function t(e,o){if(!(e instanceof o))throw new TypeError("Cannot call a class as a function")}function r(e,o){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!o||"object"!=typeof o&&"function"!=typeof o?e:o}function s(e,o){Iif("function"!=typeof o&&null!==o)throw new TypeError("Super expression must either be null or a function, not "+typeof o);e.prototype=Object.create(o&&o.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),o&&(Object.setPrototypeOf?Object.setPrototypeOf(e,o):e.__proto__=o)}Object.defineProperty(o,"__esModule",{value:!0});var i=n(3),l=n.n(i),u=n(2),c=n.n(u),p=n(0),a=n.n(p),d=n(1),f=n.n(d),y=Object.assign||function(e){for(var o=1;o<arguments.length;o++){var n=arguments[o];for(var t in n)Object.prototype.hasOwnProperty.call(n,t)&&(e[t]=n[t])}return e},h=function(){function e(e,o){for(var n=0;n<o.length;n++){var t=o[n];t.enumerable=t.enumerable||!1,t.configurable=!0,"value"in t&&(t.writable=!0),Object.defineProperty(e,t.key,t)}}return function(o,n,t){return n&&e(o.prototype,n),t&&e(o,t),o}}(),O=function(e){return"function"==typeof e},w=function(){},T=Array.prototype.slice,v=function(e){function o(){var e,n,s,i;t(this,o);for(var l=arguments.length,u=Array(l),c=0;c<l;c++)u[c]=arguments[c];return n=s=r(this,(e=o.__proto__||Object.getPrototypeOf(o)).call.apply(e,[this].concat(u))),s.mounted=!1,s.handleFocus=function(e){if(s.props.captureFocus){var o=e.explicitOriginalTarget||e.relatedTarget;s.isPartOfDialog(o)&&!s.isPartOfDialog(e.target)&&(e.preventDefault(),o.focus())}else if(s.shouldDialogCloseOnEvent("closeOnOutsideFocus",e)&&!s.isPartOfDialog(e.target))return window.setTimeout(s.props.onClose,0)},s.handleKeyDown=function(e){"Escape"===e.key&&s.shouldDialogCloseOnEvent("closeOnEscKey",e)&&window.setTimeout(s.props.onClose,0),s.props.onKeyDown&&s.props.onKeyDown(e)},s.handleInsideClick=function(e){s.shouldDialogCloseOnEvent("closeOnInsideClick",e)&&window.setTimeout(s.props.onClose,0)},s.handleOutsideClick=function(e){s.shouldDialogCloseOnEvent("closeOnOutsideClick",e)&&!s.isPartOfDialog(e.target)&&window.setTimeout(s.props.onClose,0)},s.handleOutsideScrollWheel=function(e){s.shouldDialogCloseOnEvent("closeOnOutsideScroll",e)&&!s.isPartOfDialog(e.target)&&window.setTimeout(s.props.onClose,0)},i=n,r(s,i)}return s(o,e),h(o,[{key:"isPartOfDialog",value:function(e){if(!e||e===window)return!1;var o=[this.$wrapper].concat(T.call(this.$wrapper.querySelectorAll("["+a.a.PORTAL_DATA_ATTRIBUTE+"]")).map(function(e){return document.getElementById(e.getAttribute(a.a.PORTAL_DATA_ATTRIBUTE))})),n=e.nodeType!==Node.ELEMENT_NODE?e.parentNode:e;return o.some(function(e){return e.contains(n)})}},{key:"componentDidMount",value:function(){window.addEventListener("click",this.handleOutsideClick,!0),window.addEventListener("contextmenu",this.handleOutsideClick,!0),window.addEventListener("focus",this.handleFocus,!0),window.addEventListener("scroll",this.handleOutsideScrollWheel,!0),window.addEventListener("wheel",this.handleOutsideScrollWheel,!0),this.props.captureFocus&&!this.isPartOfDialog(document.activeElement)&&this.$dialog.focus()}},{key:"componentWillUnmount",value:function(){window.removeEventListener("click",this.handleOutsideClick,!0),window.removeEventListener("contextmenu",this.handleOutsideClick,!0),window.removeEventListener("focus",this.handleFocus,!0),window.removeEventListener("scroll",this.handleOutsideScrollWheel,!0),window.removeEventListener("wheel",this.handleOutsideScrollWheel,!0)}},{key:"shouldDialogCloseOnEvent",value:function(e,o){return O(this.props[e])?this.props[e](o):this.props[e]}},{key:"renderFocusBoundary",value:function(){if(this.props.captureFocus)return l.a.createElement("div",{className:"b-offscreen",tabIndex:"0","aria-hidden":"true"}," ")}},{key:"render",value:function(){var e=this;return l.a.createElement(this.props.component,y({},f()(this.props,o.internalKeys),{ref:function(o){return e.$wrapper=o},className:c()("b-dialog-wrapper",this.props.className)}),this.renderFocusBoundary(),this.props.before,l.a.createElement(this.props.dialogComponent,y({},this.dialogProps,{ref:function(o){return e.$dialog=o},className:c()("b-dialog",this.props.dialogProps.className),onClick:this.handleInsideClick,onKeyDown:this.handleKeyDown,role:"dialog",tabIndex:"0"}),this.props.children),this.props.after,this.renderFocusBoundary())}}]),o}(l.a.PureComponent);v.propTypes={"*":i.PropTypes.any,after:i.PropTypes.node,before:i.PropTypes.node,captureFocus:i.PropTypes.bool,closeOnEscKey:i.PropTypes.oneOfType([i.PropTypes.bool,i.PropTypes.func]),closeOnInsideClick:i.PropTypes.oneOfType([i.PropTypes.bool,i.PropTypes.func]),closeOnOutsideClick:i.PropTypes.oneOfType([i.PropTypes.bool,i.PropTypes.func]),closeOnOutsideFocus:i.PropTypes.oneOfType([i.PropTypes.bool,i.PropTypes.func]),closeOnOutsideScroll:i.PropTypes.oneOfType([i.PropTypes.bool,i.PropTypes.func]),component:i.PropTypes.string,dialogComponent:i.PropTypes.string,dialogProps:i.PropTypes.shape({"*":i.PropTypes.any}),onClose:i.PropTypes.func},v.defaultProps={after:null,before:null,captureFocus:!0,children:null,closeOnEscKey:!1,closeOnInsideClick:!1,closeOnOutsideClick:!1,closeOnOutsideFocus:!1,closeOnOutsideScroll:!1,component:"div",dialogComponent:"div",dialogProps:{},onClose:w,onKeyDown:w},v.internalKeys=Object.keys(v.defaultProps),o.default=v}]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIGYxZjc0OWNhMzNjZDE0ZDdjN2M2Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy1wb3J0YWxcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXV0aWxzLW9taXQta2V5c1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJjbGFzc25hbWVzXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0XCJ9Iiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy1kaWFsb2cvaW5kZXguanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJ2YWx1ZSIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwicmVxdWlyZSIsIl9fd2VicGFja19leHBvcnRzX18iLCJfY2xhc3NDYWxsQ2hlY2siLCJpbnN0YW5jZSIsIkNvbnN0cnVjdG9yIiwiVHlwZUVycm9yIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJzZWxmIiwiUmVmZXJlbmNlRXJyb3IiLCJfaW5oZXJpdHMiLCJzdWJDbGFzcyIsInN1cGVyQ2xhc3MiLCJjcmVhdGUiLCJjb25zdHJ1Y3RvciIsIndyaXRhYmxlIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc19wb3J0YWxfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfcG9ydGFsX19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fX2RlZmF1bHQiLCJfZXh0ZW5kcyIsImFzc2lnbiIsInRhcmdldCIsImFyZ3VtZW50cyIsImxlbmd0aCIsInNvdXJjZSIsImtleSIsIl9jcmVhdGVDbGFzcyIsImRlZmluZVByb3BlcnRpZXMiLCJwcm9wcyIsImRlc2NyaXB0b3IiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJpc0Z1bmN0aW9uIiwieCIsIm5vb3AiLCJ0b0FycmF5IiwiQXJyYXkiLCJzbGljZSIsIkRpYWxvZyIsIl9SZWFjdCRQdXJlQ29tcG9uZW50IiwiX3JlZiIsIl90ZW1wIiwiX3RoaXMiLCJfcmV0IiwidGhpcyIsIl9sZW4iLCJhcmdzIiwiX2tleSIsImdldFByb3RvdHlwZU9mIiwiYXBwbHkiLCJjb25jYXQiLCJtb3VudGVkIiwiaGFuZGxlRm9jdXMiLCJuYXRpdmVFdmVudCIsImNhcHR1cmVGb2N1cyIsInByZXZpb3VzIiwiZXhwbGljaXRPcmlnaW5hbFRhcmdldCIsInJlbGF0ZWRUYXJnZXQiLCJpc1BhcnRPZkRpYWxvZyIsInByZXZlbnREZWZhdWx0IiwiZm9jdXMiLCJzaG91bGREaWFsb2dDbG9zZU9uRXZlbnQiLCJ3aW5kb3ciLCJzZXRUaW1lb3V0Iiwib25DbG9zZSIsImhhbmRsZUtleURvd24iLCJldmVudCIsIm9uS2V5RG93biIsImhhbmRsZUluc2lkZUNsaWNrIiwiaGFuZGxlT3V0c2lkZUNsaWNrIiwiaGFuZGxlT3V0c2lkZVNjcm9sbFdoZWVsIiwibm9kZSIsInJvb3RzIiwiJHdyYXBwZXIiLCJxdWVyeVNlbGVjdG9yQWxsIiwiYSIsIlBPUlRBTF9EQVRBX0FUVFJJQlVURSIsIm1hcCIsImRvbSIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJnZXRBdHRyaWJ1dGUiLCJlbGVtZW50Iiwibm9kZVR5cGUiLCJOb2RlIiwiRUxFTUVOVF9OT0RFIiwicGFyZW50Tm9kZSIsInNvbWUiLCJjb250YWlucyIsImFkZEV2ZW50TGlzdGVuZXIiLCJhY3RpdmVFbGVtZW50IiwiJGRpYWxvZyIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJwcm9wIiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsInRhYkluZGV4IiwiYXJpYS1oaWRkZW4iLCJfdGhpczIiLCJjb21wb25lbnQiLCJpbnRlcm5hbEtleXMiLCJyZWYiLCJyZW5kZXJGb2N1c0JvdW5kYXJ5IiwiYmVmb3JlIiwiZGlhbG9nQ29tcG9uZW50IiwiZGlhbG9nUHJvcHMiLCJvbkNsaWNrIiwicm9sZSIsImNoaWxkcmVuIiwiYWZ0ZXIiLCJQdXJlQ29tcG9uZW50IiwicHJvcFR5cGVzIiwiKiIsImFueSIsImJvb2wiLCJjbG9zZU9uRXNjS2V5Iiwib25lT2ZUeXBlIiwiZnVuYyIsImNsb3NlT25JbnNpZGVDbGljayIsImNsb3NlT25PdXRzaWRlQ2xpY2siLCJjbG9zZU9uT3V0c2lkZUZvY3VzIiwiY2xvc2VPbk91dHNpZGVTY3JvbGwiLCJzdHJpbmciLCJzaGFwZSIsImRlZmF1bHRQcm9wcyIsImtleXMiXSwibWFwcGluZ3MiOiJBQUFBQSxPQUFPQyxRQUNFLFNBQVVDLEdDR25CLFFBQUFDLEdBQUFDLEdBR0EsR0FBQUMsRUFBQUQsR0FDQSxNQUFBQyxHQUFBRCxH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T2RJLHFCQUFzQjlHLEVBQUEsVUFBVXlHLFdBQzVCekcsRUFBQSxVQUFVdUcsS0FDVnZHLEVBQUEsVUFBVTBHLE9BTWRsQixVQUFXeEYsRUFBQSxVQUFVK0csT0FLckJsQixnQkFBaUI3RixFQUFBLFVBQVUrRyxPQUUzQmpCLFlBQWE5RixFQUFBLFVBQVVnSCxPQUluQlgsSUFBS3JHLEVBQUEsVUFBVXNHLE1BTW5CakQsUUFBU3JELEVBQUEsVUFBVTBHLE1BdkZOL0UsRUEwRlZzRixjQUNIZixNQUFPLEtBQ1BOLE9BQVEsS0FDUmpELGNBQWMsRUFDZHNELFNBQVUsS0FDVk8sZUFBZSxFQUNmRyxvQkFBb0IsRUFDcEJDLHFCQUFxQixFQUNyQkMscUJBQXFCLEVBQ3JCQyxzQkFBc0IsRUFDdEJ0QixVQUFXLE1BQ1hLLGdCQUFpQixNQUNqQkMsZUFDQXpDLFFBQVM5QixFQUNUaUMsVUFBV2pDLEdBeEdFSSxFQTJHVjhELGFBQWV2SCxPQUFPZ0osS0FBS3ZGLEVBQU9zRixjTmxCKzNQakksRUFBNkIsUU16RnA3UDJDIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPVxuLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbi8qKioqKiovIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuLyoqKioqKi8gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuLyoqKioqKi8gXHRcdFx0XHRnZXQ6IGdldHRlclxuLyoqKioqKi8gXHRcdFx0fSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4vKioqKioqLyBcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDQpO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtcG9ydGFsXCIpO1xuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXV0aWxzLW9taXQta2V5c1wiKTtcblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNsYXNzbmFtZXNcIik7XG5cbi8qKiovIH0pLFxuLyogMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxuLyoqKi8gfSksXG4vKiA0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KF9fd2VicGFja19leHBvcnRzX18sIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc19wb3J0YWxfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc19wb3J0YWxfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfcG9ydGFsX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fKTtcbnZhciBfZXh0ZW5kcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0YXJnZXQpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9YXJndW1lbnRzW2ldO2Zvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSxrZXkpKXt0YXJnZXRba2V5XT1zb3VyY2Vba2V5XTt9fX1yZXR1cm4gdGFyZ2V0O307dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoXCJ2YWx1ZVwiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKTt9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcjt9O30oKTtmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7fX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLGNhbGwpe2lmKCFzZWxmKXt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7fXJldHVybiBjYWxsJiYodHlwZW9mIGNhbGw9PT1cIm9iamVjdFwifHx0eXBlb2YgY2FsbD09PVwiZnVuY3Rpb25cIik/Y2FsbDpzZWxmO31mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT1cImZ1bmN0aW9uXCImJnN1cGVyQ2xhc3MhPT1udWxsKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2Ygc3VwZXJDbGFzcyk7fXN1YkNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MmJnN1cGVyQ2xhc3MucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6c3ViQ2xhc3MsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfX0pO2lmKHN1cGVyQ2xhc3MpT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcyxzdXBlckNsYXNzKTpzdWJDbGFzcy5fX3Byb3RvX189c3VwZXJDbGFzczt9dmFyIGlzRnVuY3Rpb249ZnVuY3Rpb24gaXNGdW5jdGlvbih4KXtyZXR1cm4gdHlwZW9mIHg9PT0nZnVuY3Rpb24nO307dmFyIG5vb3A9ZnVuY3Rpb24gbm9vcCgpe307dmFyIHRvQXJyYXk9QXJyYXkucHJvdG90eXBlLnNsaWNlO3ZhciBEaWFsb2c9ZnVuY3Rpb24oX1JlYWN0JFB1cmVDb21wb25lbnQpe19pbmhlcml0cyhEaWFsb2csX1JlYWN0JFB1cmVDb21wb25lbnQpO2Z1bmN0aW9uIERpYWxvZygpe3ZhciBfcmVmO3ZhciBfdGVtcCxfdGhpcyxfcmV0O19jbGFzc0NhbGxDaGVjayh0aGlzLERpYWxvZyk7Zm9yKHZhciBfbGVuPWFyZ3VtZW50cy5sZW5ndGgsYXJncz1BcnJheShfbGVuKSxfa2V5PTA7X2tleTxfbGVuO19rZXkrKyl7YXJnc1tfa2V5XT1hcmd1bWVudHNbX2tleV07fXJldHVybiBfcmV0PShfdGVtcD0oX3RoaXM9X3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywoX3JlZj1EaWFsb2cuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoRGlhbG9nKSkuY2FsbC5hcHBseShfcmVmLFt0aGlzXS5jb25jYXQoYXJncykpKSxfdGhpcyksX3RoaXMubW91bnRlZD1mYWxzZSxfdGhpcy5oYW5kbGVGb2N1cz1mdW5jdGlvbihuYXRpdmVFdmVudCl7aWYoIV90aGlzLnByb3BzLmNhcHR1cmVGb2N1cyl7aWYoX3RoaXMuc2hvdWxkRGlhbG9nQ2xvc2VPbkV2ZW50KCdjbG9zZU9uT3V0c2lkZUZvY3VzJyxuYXRpdmVFdmVudCkmJiFfdGhpcy5pc1BhcnRPZkRpYWxvZyhuYXRpdmVFdmVudC50YXJnZXQpKXtyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoX3RoaXMucHJvcHMub25DbG9zZSwwKTt9cmV0dXJuO312YXIgcHJldmlvdXM9bmF0aXZlRXZlbnQuZXhwbGljaXRPcmlnaW5hbFRhcmdldHx8bmF0aXZlRXZlbnQucmVsYXRlZFRhcmdldDtpZihfdGhpcy5pc1BhcnRPZkRpYWxvZyhwcmV2aW91cykmJiFfdGhpcy5pc1BhcnRPZkRpYWxvZyhuYXRpdmVFdmVudC50YXJnZXQpKXtuYXRpdmVFdmVudC5wcmV2ZW50RGVmYXVsdCgpO3ByZXZpb3VzLmZvY3VzKCk7fX0sX3RoaXMuaGFuZGxlS2V5RG93bj1mdW5jdGlvbihldmVudCl7aWYoZXZlbnQua2V5PT09J0VzY2FwZScpe2lmKF90aGlzLnNob3VsZERpYWxvZ0Nsb3NlT25FdmVudCgnY2xvc2VPbkVzY0tleScsZXZlbnQpKXt3aW5kb3cuc2V0VGltZW91dChfdGhpcy5wcm9wcy5vbkNsb3NlLDApO319aWYoX3RoaXMucHJvcHMub25LZXlEb3duKXtfdGhpcy5wcm9wcy5vbktleURvd24oZXZlbnQpO319LF90aGlzLmhhbmRsZUluc2lkZUNsaWNrPWZ1bmN0aW9uKGV2ZW50KXtpZihfdGhpcy5zaG91bGREaWFsb2dDbG9zZU9uRXZlbnQoJ2Nsb3NlT25JbnNpZGVDbGljaycsZXZlbnQpKXt3aW5kb3cuc2V0VGltZW91dChfdGhpcy5wcm9wcy5vbkNsb3NlLDApO319LF90aGlzLmhhbmRsZU91dHNpZGVDbGljaz1mdW5jdGlvbihuYXRpdmVFdmVudCl7aWYoX3RoaXMuc2hvdWxkRGlhbG9nQ2xvc2VPbkV2ZW50KCdjbG9zZU9uT3V0c2lkZUNsaWNrJyxuYXRpdmVFdmVudCkmJiFfdGhpcy5pc1BhcnRPZkRpYWxvZyhuYXRpdmVFdmVudC50YXJnZXQpKXt3aW5kb3cuc2V0VGltZW91dChfdGhpcy5wcm9wcy5vbkNsb3NlLDApO319LF90aGlzLmhhbmRsZU91dHNpZGVTY3JvbGxXaGVlbD1mdW5jdGlvbihuYXRpdmVFdmVudCl7aWYoX3RoaXMuc2hvdWxkRGlhbG9nQ2xvc2VPbkV2ZW50KCdjbG9zZU9uT3V0c2lkZVNjcm9sbCcsbmF0aXZlRXZlbnQpJiYhX3RoaXMuaXNQYXJ0T2ZEaWFsb2cobmF0aXZlRXZlbnQudGFyZ2V0KSl7d2luZG93LnNldFRpbWVvdXQoX3RoaXMucHJvcHMub25DbG9zZSwwKTt9fSxfdGVtcCksX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsX3JldCk7fV9jcmVhdGVDbGFzcyhEaWFsb2csW3trZXk6J2lzUGFydE9mRGlhbG9nJyx2YWx1ZTpmdW5jdGlvbiBpc1BhcnRPZkRpYWxvZyhub2RlKXtpZighbm9kZXx8bm9kZT09PXdpbmRvdyl7cmV0dXJuIGZhbHNlO312YXIgcm9vdHM9W3RoaXMuJHdyYXBwZXJdLmNvbmNhdCh0b0FycmF5LmNhbGwodGhpcy4kd3JhcHBlci5xdWVyeVNlbGVjdG9yQWxsKCdbJytfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3BvcnRhbF9fX2RlZmF1bHQuYS5QT1JUQUxfREFUQV9BVFRSSUJVVEUrJ10nKSkubWFwKGZ1bmN0aW9uKGRvbSl7cmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRvbS5nZXRBdHRyaWJ1dGUoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc19wb3J0YWxfX19kZWZhdWx0LmEuUE9SVEFMX0RBVEFfQVRUUklCVVRFKSk7fSkpO3ZhciBlbGVtZW50PW5vZGUubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERT9ub2RlLnBhcmVudE5vZGU6bm9kZTtyZXR1cm4gcm9vdHMuc29tZShmdW5jdGlvbihkb20pe3JldHVybiBkb20uY29udGFpbnMoZWxlbWVudCk7fSk7fX0se2tleTonY29tcG9uZW50RGlkTW91bnQnLHZhbHVlOmZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLmhhbmRsZU91dHNpZGVDbGljayx0cnVlKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLHRoaXMuaGFuZGxlT3V0c2lkZUNsaWNrLHRydWUpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsdGhpcy5oYW5kbGVGb2N1cyx0cnVlKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJyx0aGlzLmhhbmRsZU91dHNpZGVTY3JvbGxXaGVlbCx0cnVlKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLHRoaXMuaGFuZGxlT3V0c2lkZVNjcm9sbFdoZWVsLHRydWUpO2lmKHRoaXMucHJvcHMuY2FwdHVyZUZvY3VzJiYhdGhpcy5pc1BhcnRPZkRpYWxvZyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSl7dGhpcy4kZGlhbG9nLmZvY3VzKCk7fX19LHtrZXk6J2NvbXBvbmVudFdpbGxVbm1vdW50Jyx2YWx1ZTpmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5oYW5kbGVPdXRzaWRlQ2xpY2ssdHJ1ZSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jyx0aGlzLmhhbmRsZU91dHNpZGVDbGljayx0cnVlKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXMnLHRoaXMuaGFuZGxlRm9jdXMsdHJ1ZSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsdGhpcy5oYW5kbGVPdXRzaWRlU2Nyb2xsV2hlZWwsdHJ1ZSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3doZWVsJyx0aGlzLmhhbmRsZU91dHNpZGVTY3JvbGxXaGVlbCx0cnVlKTt9fSx7a2V5OidzaG91bGREaWFsb2dDbG9zZU9uRXZlbnQnLHZhbHVlOmZ1bmN0aW9uIHNob3VsZERpYWxvZ0Nsb3NlT25FdmVudChwcm9wLGV2ZW50KXtyZXR1cm4gaXNGdW5jdGlvbih0aGlzLnByb3BzW3Byb3BdKT90aGlzLnByb3BzW3Byb3BdKGV2ZW50KTp0aGlzLnByb3BzW3Byb3BdO319LHtrZXk6J3JlbmRlckZvY3VzQm91bmRhcnknLHZhbHVlOmZ1bmN0aW9uIHJlbmRlckZvY3VzQm91bmRhcnkoKXtpZih0aGlzLnByb3BzLmNhcHR1cmVGb2N1cyl7cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KCdkaXYnLHtjbGFzc05hbWU6J2Itb2Zmc2NyZWVuJyx0YWJJbmRleDonMCcsJ2FyaWEtaGlkZGVuJzondHJ1ZSd9LCdcXHhBMCcpO319fSx7a2V5OidyZW5kZXInLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3ZhciBfdGhpczI9dGhpcztyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQodGhpcy5wcm9wcy5jb21wb25lbnQsX2V4dGVuZHMoe30sX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfX19kZWZhdWx0KCkodGhpcy5wcm9wcyxEaWFsb2cuaW50ZXJuYWxLZXlzKSx7cmVmOmZ1bmN0aW9uIHJlZihub2RlKXtyZXR1cm4gX3RoaXMyLiR3cmFwcGVyPW5vZGU7fSxjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItZGlhbG9nLXdyYXBwZXInLHRoaXMucHJvcHMuY2xhc3NOYW1lKX0pLHRoaXMucmVuZGVyRm9jdXNCb3VuZGFyeSgpLHRoaXMucHJvcHMuYmVmb3JlLF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KHRoaXMucHJvcHMuZGlhbG9nQ29tcG9uZW50LF9leHRlbmRzKHt9LHRoaXMuZGlhbG9nUHJvcHMse3JlZjpmdW5jdGlvbiByZWYobm9kZSl7cmV0dXJuIF90aGlzMi4kZGlhbG9nPW5vZGU7fSxjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItZGlhbG9nJyx0aGlzLnByb3BzLmRpYWxvZ1Byb3BzLmNsYXNzTmFtZSksb25DbGljazp0aGlzLmhhbmRsZUluc2lkZUNsaWNrLG9uS2V5RG93bjp0aGlzLmhhbmRsZUtleURvd24scm9sZTonZGlhbG9nJyx0YWJJbmRleDonMCd9KSx0aGlzLnByb3BzLmNoaWxkcmVuKSx0aGlzLnByb3BzLmFmdGVyLHRoaXMucmVuZGVyRm9jdXNCb3VuZGFyeSgpKTt9fV0pO3JldHVybiBEaWFsb2c7fShfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuUHVyZUNvbXBvbmVudCk7RGlhbG9nLnByb3BUeXBlcz17JyonOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmFueSxhZnRlcjpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ub2RlLGJlZm9yZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ub2RlLGNhcHR1cmVGb2N1czpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ib29sLGNsb3NlT25Fc2NLZXk6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub25lT2ZUeXBlKFtfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ib29sLF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmNdKSxjbG9zZU9uSW5zaWRlQ2xpY2s6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub25lT2ZUeXBlKFtfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ib29sLF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmNdKSxjbG9zZU9uT3V0c2lkZUNsaWNrOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm9uZU9mVHlwZShbX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYm9vbCxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jXSksY2xvc2VPbk91dHNpZGVGb2N1czpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5vbmVPZlR5cGUoW19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmJvb2wsX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uZnVuY10pLGNsb3NlT25PdXRzaWRlU2Nyb2xsOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm9uZU9mVHlwZShbX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYm9vbCxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jXSksY29tcG9uZW50Ol9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLnN0cmluZyxkaWFsb2dDb21wb25lbnQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc3RyaW5nLGRpYWxvZ1Byb3BzOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLnNoYXBlKHsnKic6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYW55fSksb25DbG9zZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jfTtEaWFsb2cuZGVmYXVsdFByb3BzPXthZnRlcjpudWxsLGJlZm9yZTpudWxsLGNhcHR1cmVGb2N1czp0cnVlLGNoaWxkcmVuOm51bGwsY2xvc2VPbkVzY0tleTpmYWxzZSxjbG9zZU9uSW5zaWRlQ2xpY2s6ZmFsc2UsY2xvc2VPbk91dHNpZGVDbGljazpmYWxzZSxjbG9zZU9uT3V0c2lkZUZvY3VzOmZhbHNlLGNsb3NlT25PdXRzaWRlU2Nyb2xsOmZhbHNlLGNvbXBvbmVudDonZGl2JyxkaWFsb2dDb21wb25lbnQ6J2RpdicsZGlhbG9nUHJvcHM6e30sb25DbG9zZTpub29wLG9uS2V5RG93bjpub29wfTtEaWFsb2cuaW50ZXJuYWxLZXlzPU9iamVjdC5rZXlzKERpYWxvZy5kZWZhdWx0UHJvcHMpOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSBEaWFsb2c7XG5cbi8qKiovIH0pXG4vKioqKioqLyBdKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gaW5kZXguanMiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA0KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCBmMWY3NDljYTMzY2QxNGQ3YzdjNiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy1wb3J0YWxcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtcG9ydGFsXCJ9XG4vLyBtb2R1bGUgaWQgPSAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzXCJ9XG4vLyBtb2R1bGUgaWQgPSAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNsYXNzbmFtZXNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJjbGFzc25hbWVzXCJ9XG4vLyBtb2R1bGUgaWQgPSAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn1cbi8vIG1vZHVsZSBpZCA9IDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IFJlYWN0LCB7UHJvcFR5cGVzfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY3ggZnJvbSAnY2xhc3NuYW1lcyc7XG5cbmltcG9ydCBQb3J0YWwgZnJvbSAnYm91bmRsZXNzLXBvcnRhbCc7XG5pbXBvcnQgb21pdCBmcm9tICdib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzJztcblxuY29uc3QgaXNGdW5jdGlvbiA9ICh4KSA9PiB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJztcbmNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcbmNvbnN0IHRvQXJyYXkgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cbi8qKlxuX19BIG5vbi1ibG9ja2luZywgZm9jdXMtc3RlYWxpbmcgY29udGFpbmVyLl9fXG5cbkEgZGlhbG9nIGRpZmZlcnMgZnJvbSBhIG1vZGFsIGluIHRoYXQgaXQgZG9lcyBub3QgY29tZSB3aXRoIGEgbWFza2luZyBsYXllciAodG8gb2JzY3VyZSB0aGUgcmVzdCBvZiB0aGUgcGFnZSlcbmFuZCB0aGUgdXNlciBjYW4gY2hvb3NlIHRvIHNoaWZ0IGZvY3VzIGF3YXkgZnJvbSB0aGUgZGlhbG9nIGNvbnRlbnRzIHZpYSBtb3VzZSBjbGljayBvciBhIGtleWJvYXJkIHNob3J0Y3V0LlxuXG5JZiB5b3UgZGVjaWRlIHRvIHByb3ZpZGUgYSBoZWFkZXIgaW5zaWRlIHlvdXIgZGlhbG9nLCBpdCdzIHJlY29tbWVuZGVkIHRvIGNvbmZpZ3VyZSB0aGUgW2BhcmlhLWxhYmVsbGVkYnlgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BY2Nlc3NpYmlsaXR5L0FSSUEvQVJJQV9UZWNobmlxdWVzL1VzaW5nX3RoZV9hcmlhLWxhYmVsbGVkYnlfYXR0cmlidXRlKSBhdHRyaWJ1dGUsIHdoaWNoIGNhbiBiZSBhZGRlZCB0byBgcHJvcHMuZGlhbG9nUHJvcHNgLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEaWFsb2cgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgICAvKipcbiAgICAgICAgICogYW55IFtSZWFjdC1zdXBwb3J0ZWQgYXR0cmlidXRlXShodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RhZ3MtYW5kLWF0dHJpYnV0ZXMuaHRtbCNodG1sLWF0dHJpYnV0ZXMpXG4gICAgICAgICAqL1xuICAgICAgICAnKic6IFByb3BUeXBlcy5hbnksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFyYml0cmFyeSBjb250ZW50IHRvIGJlIHJlbmRlcmVkIGFmdGVyIHRoZSBkaWFsb2cgaW4gdGhlIERPTVxuICAgICAgICAgKi9cbiAgICAgICAgYWZ0ZXI6IFByb3BUeXBlcy5ub2RlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhcmJpdHJhcnkgY29udGVudCB0byBiZSByZW5kZXJlZCBiZWZvcmUgdGhlIGRpYWxvZyBpbiB0aGUgRE9NXG4gICAgICAgICAqL1xuICAgICAgICBiZWZvcmU6IFByb3BUeXBlcy5ub2RlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBkZXRlcm1pbmVzIGlmIGZvY3VzIGlzIGFsbG93ZWQgdG8gbW92ZSBhd2F5IGZyb20gdGhlIGRpYWxvZ1xuICAgICAgICAgKi9cbiAgICAgICAgY2FwdHVyZUZvY3VzOiBQcm9wVHlwZXMuYm9vbCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogZW5hYmxlIGRldGVjdGlvbiBvZiBcIkVzY2FwZVwiIGtleXByZXNzZXMgdG8gdHJpZ2dlciBgcHJvcHMub25DbG9zZWA7IGlmIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQsIHRoZSByZXR1cm5cbiAgICAgICAgICogdmFsdWUgZGV0ZXJtaW5lcyBpZiB0aGUgZGlhbG9nIHdpbGwgYmUgY2xvc2VkXG4gICAgICAgICAqL1xuICAgICAgICBjbG9zZU9uRXNjS2V5OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgICAgIFByb3BUeXBlcy5ib29sLFxuICAgICAgICAgICAgUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIF0pLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBlbmFibGUgZGV0ZWN0aW9uIG9mIGNsaWNrcyBpbnNpZGUgdGhlIGRpYWxvZyBhcmVhIHRvIHRyaWdnZXIgYHByb3BzLm9uQ2xvc2VgOyBpZiBhIGZ1bmN0aW9uIGlzIHByb3ZpZGVkLCB0aGUgcmV0dXJuXG4gICAgICAgICAqIHZhbHVlIGRldGVybWluZXMgaWYgdGhlIGRpYWxvZyB3aWxsIGJlIGNsb3NlZFxuICAgICAgICAgKi9cbiAgICAgICAgY2xvc2VPbkluc2lkZUNsaWNrOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgICAgIFByb3BUeXBlcy5ib29sLFxuICAgICAgICAgICAgUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIF0pLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBlbmFibGUgZGV0ZWN0aW9uIG9mIGNsaWNrcyBvdXRzaWRlIHRoZSBkaWFsb2cgYXJlYSB0byB0cmlnZ2VyIGBwcm9wcy5vbkNsb3NlYDsgaWYgYSBmdW5jdGlvbiBpcyBwcm92aWRlZCwgdGhlIHJldHVyblxuICAgICAgICAgKiB2YWx1ZSBkZXRlcm1pbmVzIGlmIHRoZSBkaWFsb2cgd2lsbCBiZSBjbG9zZWRcbiAgICAgICAgICovXG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgICAgICAgICAgUHJvcFR5cGVzLmJvb2wsXG4gICAgICAgICAgICBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgXSksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGVuYWJsZSBkZXRlY3Rpb24gb2YgZm9jdXMgb3V0c2lkZSB0aGUgZGlhbG9nIGFyZWEgdG8gdHJpZ2dlciBgcHJvcHMub25DbG9zZWA7IGlmIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQsIHRoZSByZXR1cm5cbiAgICAgICAgICogdmFsdWUgZGV0ZXJtaW5lcyBpZiB0aGUgZGlhbG9nIHdpbGwgYmUgY2xvc2VkXG4gICAgICAgICAqL1xuICAgICAgICBjbG9zZU9uT3V0c2lkZUZvY3VzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgICAgIFByb3BUeXBlcy5ib29sLFxuICAgICAgICAgICAgUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIF0pLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBlbmFibGUgZGV0ZWN0aW9uIG9mIHNjcm9sbCBhbmQgbW91c2V3aGVlbCBldmVudHMgb3V0c2lkZSB0aGUgZGlhbG9nIGFyZWEgdG8gdHJpZ2dlciBgcHJvcHMub25DbG9zZWA7IGlmIGEgZnVuY3Rpb1xuICAgICAgICAgKiBpcyBwcm92aWRlZCwgdGhlIHJldHVybiB2YWx1ZSBkZXRlcm1pbmVzIGlmIHRoZSBkaWFsb2cgd2lsbCBiZSBjbG9zZWRcbiAgICAgICAgICovXG4gICAgICAgIGNsb3NlT25PdXRzaWRlU2Nyb2xsOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgICAgIFByb3BUeXBlcy5ib29sLFxuICAgICAgICAgICAgUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIF0pLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBvdmVycmlkZSB0aGUgdHlwZSBvZiBgLmItZGlhbG9nLXdyYXBwZXJgIEhUTUwgZWxlbWVudFxuICAgICAgICAgKi9cbiAgICAgICAgY29tcG9uZW50OiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBvdmVycmlkZSB0aGUgdHlwZSBvZiBgLmItZGlhbG9nYCBIVE1MIGVsZW1lbnRcbiAgICAgICAgICovXG4gICAgICAgIGRpYWxvZ0NvbXBvbmVudDogUHJvcFR5cGVzLnN0cmluZyxcblxuICAgICAgICBkaWFsb2dQcm9wczogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogYW55IFtSZWFjdC1zdXBwb3J0ZWQgYXR0cmlidXRlXShodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RhZ3MtYW5kLWF0dHJpYnV0ZXMuaHRtbCNodG1sLWF0dHJpYnV0ZXMpXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICcqJzogUHJvcFR5cGVzLmFueSxcbiAgICAgICAgfSksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGEgY3VzdG9tIGV2ZW50IGhhbmRsZXIgdGhhdCBpcyBjYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZGlhbG9nIHNob3VsZCBiZSB1bnJlbmRlcmVkIGJ5IGl0cyBwYXJlbnQ7IHRoZSBldmVudCBvY2N1cnMgaWYgb25lIG9yIG1vcmUgb2YgdGhlIFwiY2xvc2VPblwiIHByb3BzIChgY2xvc2VPbkVzY0tleWAsIGBjbG9zZU9uT3V0c2lkZUNsaWNrYCwgZXRjLikgYXJlIHBhc3NlZCBhcyBgdHJ1ZWAgYW5kIHRoZSBkaXNtaXNzYWwgY3JpdGVyaWEgYXJlIHNhdGlzZmllZFxuICAgICAgICAgKi9cbiAgICAgICAgb25DbG9zZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgfVxuXG4gICAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgICAgYWZ0ZXI6IG51bGwsXG4gICAgICAgIGJlZm9yZTogbnVsbCxcbiAgICAgICAgY2FwdHVyZUZvY3VzOiB0cnVlLFxuICAgICAgICBjaGlsZHJlbjogbnVsbCxcbiAgICAgICAgY2xvc2VPbkVzY0tleTogZmFsc2UsXG4gICAgICAgIGNsb3NlT25JbnNpZGVDbGljazogZmFsc2UsXG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGZhbHNlLFxuICAgICAgICBjbG9zZU9uT3V0c2lkZUZvY3VzOiBmYWxzZSxcbiAgICAgICAgY2xvc2VPbk91dHNpZGVTY3JvbGw6IGZhbHNlLFxuICAgICAgICBjb21wb25lbnQ6ICdkaXYnLFxuICAgICAgICBkaWFsb2dDb21wb25lbnQ6ICdkaXYnLFxuICAgICAgICBkaWFsb2dQcm9wczoge30sXG4gICAgICAgIG9uQ2xvc2U6IG5vb3AsXG4gICAgICAgIG9uS2V5RG93bjogbm9vcCxcbiAgICB9XG5cbiAgICBzdGF0aWMgaW50ZXJuYWxLZXlzID0gT2JqZWN0LmtleXMoRGlhbG9nLmRlZmF1bHRQcm9wcylcblxuICAgIG1vdW50ZWQgPSBmYWxzZVxuXG4gICAgaXNQYXJ0T2ZEaWFsb2cobm9kZSkge1xuICAgICAgICBpZiAoIW5vZGUgfHwgbm9kZSA9PT0gd2luZG93KSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgICAgIGNvbnN0IHJvb3RzID0gW3RoaXMuJHdyYXBwZXJdLmNvbmNhdChcbiAgICAgICAgICAgIHRvQXJyYXkuY2FsbChcbiAgICAgICAgICAgICAgICB0aGlzLiR3cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoYFske1BvcnRhbC5QT1JUQUxfREFUQV9BVFRSSUJVVEV9XWApXG4gICAgICAgICAgICApLm1hcCgoZG9tKSA9PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkb20uZ2V0QXR0cmlidXRlKFBvcnRhbC5QT1JUQUxfREFUQV9BVFRSSUJVVEUpKSlcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBlbGVtZW50ID0gbm9kZS5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUgPyBub2RlLnBhcmVudE5vZGUgOiBub2RlO1xuXG4gICAgICAgIHJldHVybiByb290cy5zb21lKChkb20pID0+IGRvbS5jb250YWlucyhlbGVtZW50KSk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlT3V0c2lkZUNsaWNrLCB0cnVlKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5oYW5kbGVPdXRzaWRlQ2xpY2ssIHRydWUpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB0aGlzLmhhbmRsZUZvY3VzLCB0cnVlKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuaGFuZGxlT3V0c2lkZVNjcm9sbFdoZWVsLCB0cnVlKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgdGhpcy5oYW5kbGVPdXRzaWRlU2Nyb2xsV2hlZWwsIHRydWUpO1xuXG4gICAgICAgIGlmICh0aGlzLnByb3BzLmNhcHR1cmVGb2N1cyAmJiAhdGhpcy5pc1BhcnRPZkRpYWxvZyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgICAgICAgdGhpcy4kZGlhbG9nLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVPdXRzaWRlQ2xpY2ssIHRydWUpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCB0aGlzLmhhbmRsZU91dHNpZGVDbGljaywgdHJ1ZSk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuaGFuZGxlRm9jdXMsIHRydWUpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5oYW5kbGVPdXRzaWRlU2Nyb2xsV2hlZWwsIHRydWUpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLmhhbmRsZU91dHNpZGVTY3JvbGxXaGVlbCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgc2hvdWxkRGlhbG9nQ2xvc2VPbkV2ZW50KHByb3AsIGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKHRoaXMucHJvcHNbcHJvcF0pID8gdGhpcy5wcm9wc1twcm9wXShldmVudCkgOiB0aGlzLnByb3BzW3Byb3BdO1xuICAgIH1cblxuICAgIGhhbmRsZUZvY3VzID0gKG5hdGl2ZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5wcm9wcy5jYXB0dXJlRm9jdXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZERpYWxvZ0Nsb3NlT25FdmVudCgnY2xvc2VPbk91dHNpZGVGb2N1cycsIG5hdGl2ZUV2ZW50KSAmJiAhdGhpcy5pc1BhcnRPZkRpYWxvZyhuYXRpdmVFdmVudC50YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucHJvcHMub25DbG9zZSwgMCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGV4cGxpY2l0T3JpZ2luYWxUYXJnZXQgaXMgZm9yIEZpcmVmb3gsIGFzIGl0IGRvZXNuJ3Qgc3VwcG9ydCByZWxhdGVkVGFyZ2V0XG4gICAgICAgIGxldCBwcmV2aW91cyA9IG5hdGl2ZUV2ZW50LmV4cGxpY2l0T3JpZ2luYWxUYXJnZXQgfHwgbmF0aXZlRXZlbnQucmVsYXRlZFRhcmdldDtcblxuICAgICAgICBpZiAodGhpcy5pc1BhcnRPZkRpYWxvZyhwcmV2aW91cykgJiYgIXRoaXMuaXNQYXJ0T2ZEaWFsb2cobmF0aXZlRXZlbnQudGFyZ2V0KSkge1xuICAgICAgICAgICAgbmF0aXZlRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHByZXZpb3VzLmZvY3VzKCk7IC8vIHJlc3RvcmUgZm9jdXNcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZUtleURvd24gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZERpYWxvZ0Nsb3NlT25FdmVudCgnY2xvc2VPbkVzY0tleScsIGV2ZW50KSkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucHJvcHMub25DbG9zZSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbktleURvd24pIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25LZXlEb3duKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZUluc2lkZUNsaWNrID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZERpYWxvZ0Nsb3NlT25FdmVudCgnY2xvc2VPbkluc2lkZUNsaWNrJywgZXZlbnQpKSB7XG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnByb3BzLm9uQ2xvc2UsIDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlT3V0c2lkZUNsaWNrID0gKG5hdGl2ZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZERpYWxvZ0Nsb3NlT25FdmVudCgnY2xvc2VPbk91dHNpZGVDbGljaycsIG5hdGl2ZUV2ZW50KSAmJiAhdGhpcy5pc1BhcnRPZkRpYWxvZyhuYXRpdmVFdmVudC50YXJnZXQpKSB7XG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnByb3BzLm9uQ2xvc2UsIDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlT3V0c2lkZVNjcm9sbFdoZWVsID0gKG5hdGl2ZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZERpYWxvZ0Nsb3NlT25FdmVudCgnY2xvc2VPbk91dHNpZGVTY3JvbGwnLCBuYXRpdmVFdmVudCkgJiYgIXRoaXMuaXNQYXJ0T2ZEaWFsb2cobmF0aXZlRXZlbnQudGFyZ2V0KSkge1xuICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQodGhpcy5wcm9wcy5vbkNsb3NlLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlckZvY3VzQm91bmRhcnkoKSB7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmNhcHR1cmVGb2N1cykge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nYi1vZmZzY3JlZW4nIHRhYkluZGV4PScwJyBhcmlhLWhpZGRlbj0ndHJ1ZSc+Jm5ic3A7PC9kaXY+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfSAvLyB1c2VkIHRvIGxvY2sgZm9jdXMgaW50byBhIHBhcnRpY3VsYXIgc3Vic2V0IG9mIERPTVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPHRoaXMucHJvcHMuY29tcG9uZW50XG4gICAgICAgICAgICAgICAgey4uLm9taXQodGhpcy5wcm9wcywgRGlhbG9nLmludGVybmFsS2V5cyl9XG4gICAgICAgICAgICAgICAgcmVmPXsobm9kZSkgPT4gKHRoaXMuJHdyYXBwZXIgPSBub2RlKX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KCdiLWRpYWxvZy13cmFwcGVyJywgdGhpcy5wcm9wcy5jbGFzc05hbWUpfT5cbiAgICAgICAgICAgICAgICB7dGhpcy5yZW5kZXJGb2N1c0JvdW5kYXJ5KCl9XG5cbiAgICAgICAgICAgICAgICB7dGhpcy5wcm9wcy5iZWZvcmV9XG5cbiAgICAgICAgICAgICAgICA8dGhpcy5wcm9wcy5kaWFsb2dDb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgey4uLnRoaXMuZGlhbG9nUHJvcHN9XG4gICAgICAgICAgICAgICAgICAgIHJlZj17KG5vZGUpID0+ICh0aGlzLiRkaWFsb2cgPSBub2RlKX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjeCgnYi1kaWFsb2cnLCB0aGlzLnByb3BzLmRpYWxvZ1Byb3BzLmNsYXNzTmFtZSl9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuaGFuZGxlSW5zaWRlQ2xpY2t9XG4gICAgICAgICAgICAgICAgICAgIG9uS2V5RG93bj17dGhpcy5oYW5kbGVLZXlEb3dufVxuICAgICAgICAgICAgICAgICAgICByb2xlPSdkaWFsb2cnXG4gICAgICAgICAgICAgICAgICAgIHRhYkluZGV4PScwJz5cbiAgICAgICAgICAgICAgICAgICAge3RoaXMucHJvcHMuY2hpbGRyZW59XG4gICAgICAgICAgICAgICAgPC90aGlzLnByb3BzLmRpYWxvZ0NvbXBvbmVudD5cblxuICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLmFmdGVyfVxuXG4gICAgICAgICAgICAgICAge3RoaXMucmVuZGVyRm9jdXNCb3VuZGFyeSgpfVxuICAgICAgICAgICAgPC90aGlzLnByb3BzLmNvbXBvbmVudD5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9ib3VuZGxlc3MtZGlhbG9nL2luZGV4LmpzIl0sInNvdXJjZVJvb3QiOiIifQ==