boundless-dialog
Version:
A non-blocking, focus-stealing container.
2 lines • 68.2 kB
JavaScript
module.exports=function(e){function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}var t={};return n.m=e,n.c=t,n.i=function(e){return e},n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:o})},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="",n(n.s=9)}([function(e,n,t){"function"==typeof Symbol&&Symbol.iterator;e.exports=t(7)()},function(e,n){e.exports=require("boundless-portal")},function(e,n){e.exports=require("boundless-utils-omit-keys")},function(e,n){e.exports=require("classnames")},function(e,n){e.exports=require("react")},function(e,n,t){"use strict";function o(e){return function(){return e}}var r=function(){};r.thatReturns=o,r.thatReturnsFalse=o(!1),r.thatReturnsTrue=o(!0),r.thatReturnsNull=o(null),r.thatReturnsThis=function(){return this},r.thatReturnsArgument=function(e){return e},e.exports=r},function(e,n,t){"use strict";function o(e,n,t,o,i,s,a,l){if(r(n),!e){var u;if(void 0===n)u=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[t,o,i,s,a,l],p=0;u=new Error(n.replace(/%s/g,function(){return c[p++]})),u.name="Invariant Violation"}throw u.framesToPop=1,u}}var r=function(e){};e.exports=o},function(e,n,t){"use strict";var o=t(5),r=t(6),i=t(8);e.exports=function(){function e(e,n,t,o,s,a){a!==i&&r(!1,"Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types")}function n(){return e}e.isRequired=e;var t={array:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:n,element:e,instanceOf:n,node:e,objectOf:n,oneOf:n,oneOfType:n,shape:n};return t.checkPropTypes=o,t.PropTypes=t,t}},function(e,n,t){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},function(e,n,t){"use strict";function o(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}function r(e,n){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!n||"object"!=typeof n&&"function"!=typeof n?e:n}function i(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Super expression must either be null or a function, not "+typeof n);e.prototype=Object.create(n&&n.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),n&&(Object.setPrototypeOf?Object.setPrototypeOf(e,n):e.__proto__=n)}Object.defineProperty(n,"__esModule",{value:!0});var s=t(0),a=t.n(s),l=t(4),u=(t.n(l),t(3)),c=t.n(u),p=t(1),d=t.n(p),f=t(2),h=t.n(f),O=Object.assign||function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o])}return e},y=function(){function e(e,n){for(var t=0;t<n.length;t++){var o=n[t];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(n,t,o){return t&&e(n.prototype,t),o&&e(n,o),n}}(),m=function(e){return"function"==typeof e},v=function(){},w=Array.prototype.slice,g=function(e){function n(){var e,t,i,s;o(this,n);for(var a=arguments.length,l=Array(a),u=0;u<a;u++)l[u]=arguments[u];return t=i=r(this,(e=n.__proto__||Object.getPrototypeOf(n)).call.apply(e,[this].concat(l))),i.mounted=!1,i.handleFocus=function(e){if(i.props.captureFocus){var n=e.explicitOriginalTarget||e.relatedTarget;i.isPartOfDialog(n)&&!i.isPartOfDialog(e.target)&&(e.preventDefault(),n.focus())}else if(i.shouldDialogCloseOnEvent("closeOnOutsideFocus",e)&&!i.isPartOfDialog(e.target))return window.setTimeout(i.props.onClose,0)},i.handleKeyDown=function(e){"Escape"===e.key&&i.shouldDialogCloseOnEvent("closeOnEscKey",e)&&window.setTimeout(i.props.onClose,0),i.props.onKeyDown&&i.props.onKeyDown(e)},i.handleInsideClick=function(e){i.shouldDialogCloseOnEvent("closeOnInsideClick",e)&&window.setTimeout(i.props.onClose,0)},i.handleOutsideClick=function(e){i.shouldDialogCloseOnEvent("closeOnOutsideClick",e)&&!i.isPartOfDialog(e.target)&&window.setTimeout(i.props.onClose,0)},i.handleOutsideScrollWheel=function(e){i.shouldDialogCloseOnEvent("closeOnOutsideScroll",e)&&!i.isPartOfDialog(e.target)&&window.setTimeout(i.props.onClose,0)},s=t,r(i,s)}return i(n,e),y(n,[{key:"isPartOfDialog",value:function(e){if(!e||e===window)return!1;var n=[this.$wrapper].concat(w.call(this.$wrapper.querySelectorAll("["+d.a.PORTAL_DATA_ATTRIBUTE+"]")).map(function(e){return document.getElementById(e.getAttribute(d.a.PORTAL_DATA_ATTRIBUTE))})),t=e.nodeType!==Node.ELEMENT_NODE?e.parentNode:e;return n.some(function(e){return e.contains(t)})}},{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,n){return m(this.props[e])?this.props[e](n):this.props[e]}},{key:"renderFocusBoundary",value:function(){if(this.props.captureFocus)return t.i(l.createElement)("div",{className:"b-offscreen",tabIndex:"0","aria-hidden":"true"}," ")}},{key:"render",value:function(){var e=this;return t.i(l.createElement)(this.props.component,O({},h()(this.props,n.internalKeys),{ref:function(n){return e.$wrapper=n},className:c()("b-dialog-wrapper",this.props.className)}),this.renderFocusBoundary(),this.props.before,t.i(l.createElement)(this.props.dialogComponent,O({},this.dialogProps,{ref:function(n){return e.$dialog=n},className:c()("b-dialog",this.props.dialogProps.className),onClick:this.handleInsideClick,onKeyDown:this.handleKeyDown,role:this.props.captureFocus?"alertdialog":"dialog",tabIndex:"0"}),this.props.children),this.props.after,this.renderFocusBoundary())}}]),n}(l.PureComponent);g.propTypes={"*":a.a.any,after:a.a.node,before:a.a.node,captureFocus:a.a.bool,closeOnEscKey:a.a.oneOfType([a.a.bool,a.a.func]),closeOnInsideClick:a.a.oneOfType([a.a.bool,a.a.func]),closeOnOutsideClick:a.a.oneOfType([a.a.bool,a.a.func]),closeOnOutsideFocus:a.a.oneOfType([a.a.bool,a.a.func]),closeOnOutsideScroll:a.a.oneOfType([a.a.bool,a.a.func]),component:a.a.string,dialogComponent:a.a.string,dialogProps:a.a.shape({"*":a.a.any}),onClose:a.a.func},g.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:v,onKeyDown:v},g.internalKeys=Object.keys(g.defaultProps),n.default=g}]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIGUyYjc1MzQ1YWQyYzgyZDEwZmJlIiwid2VicGFjazovLy8uL34vcHJvcC10eXBlcy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtcG9ydGFsXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiY2xhc3NuYW1lc1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdFwifSIsIndlYnBhY2s6Ly8vLi9+L2ZianMvbGliL2VtcHR5RnVuY3Rpb24uanMiLCJ3ZWJwYWNrOi8vLy4vfi9mYmpzL2xpYi9pbnZhcmlhbnQuanMiLCJ3ZWJwYWNrOi8vLy4vfi9wcm9wLXR5cGVzL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcy5qcyIsIndlYnBhY2s6Ly8vLi9+L3Byb3AtdHlwZXMvbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0LmpzIiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy1kaWFsb2cvaW5kZXguanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJ2YWx1ZSIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJyZXF1aXJlIiwibWFrZUVtcHR5RnVuY3Rpb24iLCJhcmciLCJlbXB0eUZ1bmN0aW9uIiwidGhhdFJldHVybnMiLCJ0aGF0UmV0dXJuc0ZhbHNlIiwidGhhdFJldHVybnNUcnVlIiwidGhhdFJldHVybnNOdWxsIiwidGhhdFJldHVybnNUaGlzIiwidGhpcyIsInRoYXRSZXR1cm5zQXJndW1lbnQiLCJpbnZhcmlhbnQiLCJjb25kaXRpb24iLCJmb3JtYXQiLCJhIiwiYiIsImUiLCJmIiwidmFsaWRhdGVGb3JtYXQiLCJlcnJvciIsInVuZGVmaW5lZCIsIkVycm9yIiwiYXJncyIsImFyZ0luZGV4IiwicmVwbGFjZSIsImZyYW1lc1RvUG9wIiwiUmVhY3RQcm9wVHlwZXNTZWNyZXQiLCJzaGltIiwicHJvcHMiLCJwcm9wTmFtZSIsImNvbXBvbmVudE5hbWUiLCJsb2NhdGlvbiIsInByb3BGdWxsTmFtZSIsInNlY3JldCIsImdldFNoaW0iLCJpc1JlcXVpcmVkIiwiUmVhY3RQcm9wVHlwZXMiLCJhcnJheSIsImJvb2wiLCJmdW5jIiwibnVtYmVyIiwic3RyaW5nIiwic3ltYm9sIiwiYW55IiwiYXJyYXlPZiIsImVsZW1lbnQiLCJpbnN0YW5jZU9mIiwibm9kZSIsIm9iamVjdE9mIiwib25lT2YiLCJvbmVPZlR5cGUiLCJzaGFwZSIsImNoZWNrUHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwiX193ZWJwYWNrX2V4cG9ydHNfXyIsIl9jbGFzc0NhbGxDaGVjayIsImluc3RhbmNlIiwiQ29uc3RydWN0b3IiLCJUeXBlRXJyb3IiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiIsInNlbGYiLCJSZWZlcmVuY2VFcnJvciIsIl9pbmhlcml0cyIsInN1YkNsYXNzIiwic3VwZXJDbGFzcyIsImNyZWF0ZSIsImNvbnN0cnVjdG9yIiwid3JpdGFibGUiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9wcm9wX3R5cGVzX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcHJvcF90eXBlc19fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfcmVhY3RfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9jbGFzc25hbWVzX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfY2xhc3NuYW1lc19fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3BvcnRhbF9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc19wb3J0YWxfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCIsIl9leHRlbmRzIiwiYXNzaWduIiwidGFyZ2V0IiwiYXJndW1lbnRzIiwibGVuZ3RoIiwic291cmNlIiwia2V5IiwiX2NyZWF0ZUNsYXNzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlc2NyaXB0b3IiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJpc0Z1bmN0aW9uIiwieCIsIm5vb3AiLCJ0b0FycmF5IiwiQXJyYXkiLCJzbGljZSIsIkRpYWxvZyIsIl9QdXJlQ29tcG9uZW50IiwiX3JlZiIsIl90ZW1wIiwiX3RoaXMiLCJfcmV0IiwiX2xlbiIsIl9rZXkiLCJnZXRQcm90b3R5cGVPZiIsImFwcGx5IiwiY29uY2F0IiwibW91bnRlZCIsImhhbmRsZUZvY3VzIiwibmF0aXZlRXZlbnQiLCJjYXB0dXJlRm9jdXMiLCJwcmV2aW91cyIsImV4cGxpY2l0T3JpZ2luYWxUYXJnZXQiLCJyZWxhdGVkVGFyZ2V0IiwiaXNQYXJ0T2ZEaWFsb2ciLCJwcmV2ZW50RGVmYXVsdCIsImZvY3VzIiwic2hvdWxkRGlhbG9nQ2xvc2VPbkV2ZW50Iiwid2luZG93Iiwic2V0VGltZW91dCIsIm9uQ2xvc2UiLCJoYW5kbGVLZXlEb3duIiwiZXZlbnQiLCJvbktleURvd24iLCJoYW5kbGVJbnNpZGVDbGljayIsImhhbmRsZU91dHNpZGVDbGljayIsImhhbmRsZU91dHNpZGVTY3JvbGxXaGVlbCIsInJvb3RzIiwiJHdyYXBwZXIiLCJxdWVyeVNlbGVjdG9yQWxsIiwiUE9SVEFMX0RBVEFfQVRUUklCVVRFIiwibWFwIiwiZG9tIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImdldEF0dHJpYnV0ZSIsIm5vZGVUeXBlIiwiTm9kZSIsIkVMRU1FTlRfTk9ERSIsInBhcmVudE5vZGUiLCJzb21lIiwiY29udGFpbnMiLCJhZGRFdmVudExpc3RlbmVyIiwiYWN0aXZlRWxlbWVudCIsIiRkaWFsb2ciLCJyZW1vdmVFdmVudExpc3RlbmVyIiwicHJvcCIsImNsYXNzTmFtZSIsInRhYkluZGV4IiwiYXJpYS1oaWRkZW4iLCJfdGhpczIiLCJjb21wb25lbnQiLCJpbnRlcm5hbEtleXMiLCJyZWYiLCJyZW5kZXJGb2N1c0JvdW5kYXJ5IiwiYmVmb3JlIiwiZGlhbG9nQ29tcG9uZW50IiwiZGlhbG9nUHJvcHMiLCJvbkNsaWNrIiwicm9sZSIsImNoaWxkcmVuIiwiYWZ0ZXIiLCJwcm9wVHlwZXMiLCIqIiwiY2xvc2VPbkVzY0tleSIsImNsb3NlT25JbnNpZGVDbGljayIsImNsb3NlT25PdXRzaWRlQ2xpY2siLCJjbG9zZU9uT3V0c2lkZUZvY3VzIiwiY2xvc2VPbk91dHNpZGVTY3JvbGwiLCJkZWZhdWx0UHJvcHMiLCJrZXlzIl0sIm1hcHBpbmdzIjoiQUFBQUEsT0FBT0MsUUFDRSxTQUFVQyxHQ0duQixRQUFBQyxHQUFBQyxHQUdBLEdBQUFDLEVBQUFELEdBQ0EsTUFBQUMsR0FBQUQsR0FBQUgsT0FHQSxJQUFBRCxHQUFBSyxFQUFBRCxJQUNBRSxFQUFBRixFQUNBRyxHQUFBLEVBQ0FOLFdBVUEsT0FOQUMsR0FBQUUsR0FBQUksS0FBQVIsRUFBQUMsUUFBQUQsSUFBQUMsUUFBQUUsR0FHQUgsRUFBQU8sR0FBQSxFQUdBUCxF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Iiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPVxuLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRpOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGw6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4vKioqKioqLyBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4vKioqKioqLyBcdFx0XHRcdGdldDogZ2V0dGVyXG4vKioqKioqLyBcdFx0XHR9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gOSk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbnZhciBfdHlwZW9mPXR5cGVvZiBTeW1ib2w9PT1cImZ1bmN0aW9uXCImJnR5cGVvZiBTeW1ib2wuaXRlcmF0b3I9PT1cInN5bWJvbFwiP2Z1bmN0aW9uKG9iail7cmV0dXJuIHR5cGVvZiBvYmo7fTpmdW5jdGlvbihvYmope3JldHVybiBvYmomJnR5cGVvZiBTeW1ib2w9PT1cImZ1bmN0aW9uXCImJm9iai5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmb2JqIT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiBvYmo7fTtpZihmYWxzZSl7dmFyIFJFQUNUX0VMRU1FTlRfVFlQRT10eXBlb2YgU3ltYm9sPT09J2Z1bmN0aW9uJyYmU3ltYm9sLmZvciYmU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpfHwweGVhYzc7dmFyIGlzVmFsaWRFbGVtZW50PWZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50KG9iamVjdCl7cmV0dXJuKHR5cGVvZiBvYmplY3Q9PT0ndW5kZWZpbmVkJz8ndW5kZWZpbmVkJzpfdHlwZW9mKG9iamVjdCkpPT09J29iamVjdCcmJm9iamVjdCE9PW51bGwmJm9iamVjdC4kJHR5cGVvZj09PVJFQUNUX0VMRU1FTlRfVFlQRTt9O3ZhciB0aHJvd09uRGlyZWN0QWNjZXNzPXRydWU7bW9kdWxlLmV4cG9ydHM9cmVxdWlyZSgnLi9mYWN0b3J5V2l0aFR5cGVDaGVja2VycycpKGlzVmFsaWRFbGVtZW50LHRocm93T25EaXJlY3RBY2Nlc3MpO31lbHNle21vZHVsZS5leHBvcnRzPV9fd2VicGFja19yZXF1aXJlX18oNykoKTt9XG5cbi8qKiovIH0pLFxuLyogMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtcG9ydGFsXCIpO1xuXG4vKioqLyB9KSxcbi8qIDIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXV0aWxzLW9taXQta2V5c1wiKTtcblxuLyoqKi8gfSksXG4vKiAzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNsYXNzbmFtZXNcIik7XG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxuLyoqKi8gfSksXG4vKiA1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuZnVuY3Rpb24gbWFrZUVtcHR5RnVuY3Rpb24oYXJnKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYXJnO307fXZhciBlbXB0eUZ1bmN0aW9uPWZ1bmN0aW9uIGVtcHR5RnVuY3Rpb24oKXt9O2VtcHR5RnVuY3Rpb24udGhhdFJldHVybnM9bWFrZUVtcHR5RnVuY3Rpb247ZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc0ZhbHNlPW1ha2VFbXB0eUZ1bmN0aW9uKGZhbHNlKTtlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zVHJ1ZT1tYWtlRW1wdHlGdW5jdGlvbih0cnVlKTtlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zTnVsbD1tYWtlRW1wdHlGdW5jdGlvbihudWxsKTtlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zVGhpcz1mdW5jdGlvbigpe3JldHVybiB0aGlzO307ZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc0FyZ3VtZW50PWZ1bmN0aW9uKGFyZyl7cmV0dXJuIGFyZzt9O21vZHVsZS5leHBvcnRzPWVtcHR5RnVuY3Rpb247XG5cbi8qKiovIH0pLFxuLyogNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbnZhciB2YWxpZGF0ZUZvcm1hdD1mdW5jdGlvbiB2YWxpZGF0ZUZvcm1hdChmb3JtYXQpe307aWYoZmFsc2Upe3ZhbGlkYXRlRm9ybWF0PWZ1bmN0aW9uIHZhbGlkYXRlRm9ybWF0KGZvcm1hdCl7aWYoZm9ybWF0PT09dW5kZWZpbmVkKXt0aHJvdyBuZXcgRXJyb3IoJ2ludmFyaWFudCByZXF1aXJlcyBhbiBlcnJvciBtZXNzYWdlIGFyZ3VtZW50Jyk7fX07fWZ1bmN0aW9uIGludmFyaWFudChjb25kaXRpb24sZm9ybWF0LGEsYixjLGQsZSxmKXt2YWxpZGF0ZUZvcm1hdChmb3JtYXQpO2lmKCFjb25kaXRpb24pe3ZhciBlcnJvcjtpZihmb3JtYXQ9PT11bmRlZmluZWQpe2Vycm9yPW5ldyBFcnJvcignTWluaWZpZWQgZXhjZXB0aW9uIG9jY3VycmVkOyB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgJysnZm9yIHRoZSBmdWxsIGVycm9yIG1lc3NhZ2UgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4nKTt9ZWxzZXt2YXIgYXJncz1bYSxiLGMsZCxlLGZdO3ZhciBhcmdJbmRleD0wO2Vycm9yPW5ldyBFcnJvcihmb3JtYXQucmVwbGFjZSgvJXMvZyxmdW5jdGlvbigpe3JldHVybiBhcmdzW2FyZ0luZGV4KytdO30pKTtlcnJvci5uYW1lPSdJbnZhcmlhbnQgVmlvbGF0aW9uJzt9ZXJyb3IuZnJhbWVzVG9Qb3A9MTt0aHJvdyBlcnJvcjt9fW1vZHVsZS5leHBvcnRzPWludmFyaWFudDtcblxuLyoqKi8gfSksXG4vKiA3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xudmFyIGVtcHR5RnVuY3Rpb249X193ZWJwYWNrX3JlcXVpcmVfXyg1KTt2YXIgaW52YXJpYW50PV9fd2VicGFja19yZXF1aXJlX18oNik7dmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0PV9fd2VicGFja19yZXF1aXJlX18oOCk7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBzaGltKHByb3BzLHByb3BOYW1lLGNvbXBvbmVudE5hbWUsbG9jYXRpb24scHJvcEZ1bGxOYW1lLHNlY3JldCl7aWYoc2VjcmV0PT09UmVhY3RQcm9wVHlwZXNTZWNyZXQpe3JldHVybjt9aW52YXJpYW50KGZhbHNlLCdDYWxsaW5nIFByb3BUeXBlcyB2YWxpZGF0b3JzIGRpcmVjdGx5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiAnKydVc2UgUHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzKCkgdG8gY2FsbCB0aGVtLiAnKydSZWFkIG1vcmUgYXQgaHR0cDovL2ZiLm1lL3VzZS1jaGVjay1wcm9wLXR5cGVzJyk7fTtzaGltLmlzUmVxdWlyZWQ9c2hpbTtmdW5jdGlvbiBnZXRTaGltKCl7cmV0dXJuIHNoaW07fTt2YXIgUmVhY3RQcm9wVHlwZXM9e2FycmF5OnNoaW0sYm9vbDpzaGltLGZ1bmM6c2hpbSxudW1iZXI6c2hpbSxvYmplY3Q6c2hpbSxzdHJpbmc6c2hpbSxzeW1ib2w6c2hpbSxhbnk6c2hpbSxhcnJheU9mOmdldFNoaW0sZWxlbWVudDpzaGltLGluc3RhbmNlT2Y6Z2V0U2hpbSxub2RlOnNoaW0sb2JqZWN0T2Y6Z2V0U2hpbSxvbmVPZjpnZXRTaGltLG9uZU9mVHlwZTpnZXRTaGltLHNoYXBlOmdldFNoaW19O1JlYWN0UHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzPWVtcHR5RnVuY3Rpb247UmVhY3RQcm9wVHlwZXMuUHJvcFR5cGVzPVJlYWN0UHJvcFR5cGVzO3JldHVybiBSZWFjdFByb3BUeXBlczt9O1xuXG4vKioqLyB9KSxcbi8qIDggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQ9J1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJzttb2R1bGUuZXhwb3J0cz1SZWFjdFByb3BUeXBlc1NlY3JldDtcblxuLyoqKi8gfSksXG4vKiA5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KF9fd2VicGFja19leHBvcnRzX18sIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9wcm9wX3R5cGVzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9wcm9wX3R5cGVzX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcHJvcF90eXBlc19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfcmVhY3RfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX3JlYWN0X19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfcmVhY3RfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2NsYXNzbmFtZXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2NsYXNzbmFtZXNfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9jbGFzc25hbWVzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfcG9ydGFsX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfcG9ydGFsX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3BvcnRhbF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyk7XG52YXIgX2V4dGVuZHM9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odGFyZ2V0KXtmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXt2YXIgc291cmNlPWFyZ3VtZW50c1tpXTtmb3IodmFyIGtleSBpbiBzb3VyY2Upe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2Usa2V5KSl7dGFyZ2V0W2tleV09c291cmNlW2tleV07fX19cmV0dXJuIHRhcmdldDt9O3ZhciBfY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCxwcm9wcyl7Zm9yKHZhciBpPTA7aTxwcm9wcy5sZW5ndGg7aSsrKXt2YXIgZGVzY3JpcHRvcj1wcm9wc1tpXTtkZXNjcmlwdG9yLmVudW1lcmFibGU9ZGVzY3JpcHRvci5lbnVtZXJhYmxlfHxmYWxzZTtkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZT10cnVlO2lmKFwidmFsdWVcImluIGRlc2NyaXB0b3IpZGVzY3JpcHRvci53cml0YWJsZT10cnVlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsZGVzY3JpcHRvci5rZXksZGVzY3JpcHRvcik7fX1yZXR1cm4gZnVuY3Rpb24oQ29uc3RydWN0b3IscHJvdG9Qcm9wcyxzdGF0aWNQcm9wcyl7aWYocHJvdG9Qcm9wcylkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSxwcm90b1Byb3BzKTtpZihzdGF0aWNQcm9wcylkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLHN0YXRpY1Byb3BzKTtyZXR1cm4gQ29uc3RydWN0b3I7fTt9KCk7ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLENvbnN0cnVjdG9yKXtpZighKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO319ZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZixjYWxsKXtpZighc2VsZil7dGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO31yZXR1cm4gY2FsbCYmKHR5cGVvZiBjYWxsPT09XCJvYmplY3RcInx8dHlwZW9mIGNhbGw9PT1cImZ1bmN0aW9uXCIpP2NhbGw6c2VsZjt9ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLHN1cGVyQ2xhc3Mpe2lmKHR5cGVvZiBzdXBlckNsYXNzIT09XCJmdW5jdGlvblwiJiZzdXBlckNsYXNzIT09bnVsbCl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIrdHlwZW9mIHN1cGVyQ2xhc3MpO31zdWJDbGFzcy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzJiZzdXBlckNsYXNzLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnN1YkNsYXNzLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX19KTtpZihzdXBlckNsYXNzKU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3Msc3VwZXJDbGFzcyk6c3ViQ2xhc3MuX19wcm90b19fPXN1cGVyQ2xhc3M7fXZhciBpc0Z1bmN0aW9uPWZ1bmN0aW9uIGlzRnVuY3Rpb24oeCl7cmV0dXJuIHR5cGVvZiB4PT09J2Z1bmN0aW9uJzt9O3ZhciBub29wPWZ1bmN0aW9uIG5vb3AoKXt9O3ZhciB0b0FycmF5PUFycmF5LnByb3RvdHlwZS5zbGljZTt2YXIgRGlhbG9nPWZ1bmN0aW9uKF9QdXJlQ29tcG9uZW50KXtfaW5oZXJpdHMoRGlhbG9nLF9QdXJlQ29tcG9uZW50KTtmdW5jdGlvbiBEaWFsb2coKXt2YXIgX3JlZjt2YXIgX3RlbXAsX3RoaXMsX3JldDtfY2xhc3NDYWxsQ2hlY2sodGhpcyxEaWFsb2cpO2Zvcih2YXIgX2xlbj1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkoX2xlbiksX2tleT0wO19rZXk8X2xlbjtfa2V5Kyspe2FyZ3NbX2tleV09YXJndW1lbnRzW19rZXldO31yZXR1cm4gX3JldD0oX3RlbXA9KF90aGlzPV9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKF9yZWY9RGlhbG9nLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKERpYWxvZykpLmNhbGwuYXBwbHkoX3JlZixbdGhpc10uY29uY2F0KGFyZ3MpKSksX3RoaXMpLF90aGlzLm1vdW50ZWQ9ZmFsc2UsX3RoaXMuaGFuZGxlRm9jdXM9ZnVuY3Rpb24obmF0aXZlRXZlbnQpe2lmKCFfdGhpcy5wcm9wcy5jYXB0dXJlRm9jdXMpe2lmKF90aGlzLnNob3VsZERpYWxvZ0Nsb3NlT25FdmVudCgnY2xvc2VPbk91dHNpZGVGb2N1cycsbmF0aXZlRXZlbnQpJiYhX3RoaXMuaXNQYXJ0T2ZEaWFsb2cobmF0aXZlRXZlbnQudGFyZ2V0KSl7cmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KF90aGlzLnByb3BzLm9uQ2xvc2UsMCk7fXJldHVybjt9dmFyIHByZXZpb3VzPW5hdGl2ZUV2ZW50LmV4cGxpY2l0T3JpZ2luYWxUYXJnZXR8fG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQ7aWYoX3RoaXMuaXNQYXJ0T2ZEaWFsb2cocHJldmlvdXMpJiYhX3RoaXMuaXNQYXJ0T2ZEaWFsb2cobmF0aXZlRXZlbnQudGFyZ2V0KSl7bmF0aXZlRXZlbnQucHJldmVudERlZmF1bHQoKTtwcmV2aW91cy5mb2N1cygpO319LF90aGlzLmhhbmRsZUtleURvd249ZnVuY3Rpb24oZXZlbnQpe2lmKGV2ZW50LmtleT09PSdFc2NhcGUnKXtpZihfdGhpcy5zaG91bGREaWFsb2dDbG9zZU9uRXZlbnQoJ2Nsb3NlT25Fc2NLZXknLGV2ZW50KSl7d2luZG93LnNldFRpbWVvdXQoX3RoaXMucHJvcHMub25DbG9zZSwwKTt9fWlmKF90aGlzLnByb3BzLm9uS2V5RG93bil7X3RoaXMucHJvcHMub25LZXlEb3duKGV2ZW50KTt9fSxfdGhpcy5oYW5kbGVJbnNpZGVDbGljaz1mdW5jdGlvbihldmVudCl7aWYoX3RoaXMuc2hvdWxkRGlhbG9nQ2xvc2VPbkV2ZW50KCdjbG9zZU9uSW5zaWRlQ2xpY2snLGV2ZW50KSl7d2luZG93LnNldFRpbWVvdXQoX3RoaXMucHJvcHMub25DbG9zZSwwKTt9fSxfdGhpcy5oYW5kbGVPdXRzaWRlQ2xpY2s9ZnVuY3Rpb24obmF0aXZlRXZlbnQpe2lmKF90aGlzLnNob3VsZERpYWxvZ0Nsb3NlT25FdmVudCgnY2xvc2VPbk91dHNpZGVDbGljaycsbmF0aXZlRXZlbnQpJiYhX3RoaXMuaXNQYXJ0T2ZEaWFsb2cobmF0aXZlRXZlbnQudGFyZ2V0KSl7d2luZG93LnNldFRpbWVvdXQoX3RoaXMucHJvcHMub25DbG9zZSwwKTt9fSxfdGhpcy5oYW5kbGVPdXRzaWRlU2Nyb2xsV2hlZWw9ZnVuY3Rpb24obmF0aXZlRXZlbnQpe2lmKF90aGlzLnNob3VsZERpYWxvZ0Nsb3NlT25FdmVudCgnY2xvc2VPbk91dHNpZGVTY3JvbGwnLG5hdGl2ZUV2ZW50KSYmIV90aGlzLmlzUGFydE9mRGlhbG9nKG5hdGl2ZUV2ZW50LnRhcmdldCkpe3dpbmRvdy5zZXRUaW1lb3V0KF90aGlzLnByb3BzLm9uQ2xvc2UsMCk7fX0sX3RlbXApLF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLF9yZXQpO31fY3JlYXRlQ2xhc3MoRGlhbG9nLFt7a2V5Oidpc1BhcnRPZkRpYWxvZycsdmFsdWU6ZnVuY3Rpb24gaXNQYXJ0T2ZEaWFsb2cobm9kZSl7aWYoIW5vZGV8fG5vZGU9PT13aW5kb3cpe3JldHVybiBmYWxzZTt9dmFyIHJvb3RzPVt0aGlzLiR3cmFwcGVyXS5jb25jYXQodG9BcnJheS5jYWxsKHRoaXMuJHdyYXBwZXIucXVlcnlTZWxlY3RvckFsbCgnWycrX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc19wb3J0YWxfX19kZWZhdWx0LmEuUE9SVEFMX0RBVEFfQVRUUklCVVRFKyddJykpLm1hcChmdW5jdGlvbihkb20pe3JldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkb20uZ2V0QXR0cmlidXRlKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfcG9ydGFsX19fZGVmYXVsdC5hLlBPUlRBTF9EQVRBX0FUVFJJQlVURSkpO30pKTt2YXIgZWxlbWVudD1ub2RlLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREU/bm9kZS5wYXJlbnROb2RlOm5vZGU7cmV0dXJuIHJvb3RzLnNvbWUoZnVuY3Rpb24oZG9tKXtyZXR1cm4gZG9tLmNvbnRhaW5zKGVsZW1lbnQpO30pO319LHtrZXk6J2NvbXBvbmVudERpZE1vdW50Jyx2YWx1ZTpmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsdGhpcy5oYW5kbGVPdXRzaWRlQ2xpY2ssdHJ1ZSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jyx0aGlzLmhhbmRsZU91dHNpZGVDbGljayx0cnVlKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLHRoaXMuaGFuZGxlRm9jdXMsdHJ1ZSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsdGhpcy5oYW5kbGVPdXRzaWRlU2Nyb2xsV2hlZWwsdHJ1ZSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJyx0aGlzLmhhbmRsZU91dHNpZGVTY3JvbGxXaGVlbCx0cnVlKTtpZih0aGlzLnByb3BzLmNhcHR1cmVGb2N1cyYmIXRoaXMuaXNQYXJ0T2ZEaWFsb2coZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpe3RoaXMuJGRpYWxvZy5mb2N1cygpO319fSx7a2V5Oidjb21wb25lbnRXaWxsVW5tb3VudCcsdmFsdWU6ZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLHRoaXMuaGFuZGxlT3V0c2lkZUNsaWNrLHRydWUpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsdGhpcy5oYW5kbGVPdXRzaWRlQ2xpY2ssdHJ1ZSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzJyx0aGlzLmhhbmRsZUZvY3VzLHRydWUpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLHRoaXMuaGFuZGxlT3V0c2lkZVNjcm9sbFdoZWVsLHRydWUpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd3aGVlbCcsdGhpcy5oYW5kbGVPdXRzaWRlU2Nyb2xsV2hlZWwsdHJ1ZSk7fX0se2tleTonc2hvdWxkRGlhbG9nQ2xvc2VPbkV2ZW50Jyx2YWx1ZTpmdW5jdGlvbiBzaG91bGREaWFsb2dDbG9zZU9uRXZlbnQocHJvcCxldmVudCl7cmV0dXJuIGlzRnVuY3Rpb24odGhpcy5wcm9wc1twcm9wXSk/dGhpcy5wcm9wc1twcm9wXShldmVudCk6dGhpcy5wcm9wc1twcm9wXTt9fSx7a2V5OidyZW5kZXJGb2N1c0JvdW5kYXJ5Jyx2YWx1ZTpmdW5jdGlvbiByZW5kZXJGb2N1c0JvdW5kYXJ5KCl7aWYodGhpcy5wcm9wcy5jYXB0dXJlRm9jdXMpe3JldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fLmkoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX3JlYWN0X19bXCJjcmVhdGVFbGVtZW50XCJdKSgnZGl2Jyx7Y2xhc3NOYW1lOidiLW9mZnNjcmVlbicsdGFiSW5kZXg6JzAnLCdhcmlhLWhpZGRlbic6J3RydWUnfSwnXFx4QTAnKTt9fX0se2tleToncmVuZGVyJyx2YWx1ZTpmdW5jdGlvbiByZW5kZXIoKXt2YXIgX3RoaXMyPXRoaXM7cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18uaShfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfcmVhY3RfX1tcImNyZWF0ZUVsZW1lbnRcIl0pKHRoaXMucHJvcHMuY29tcG9uZW50LF9leHRlbmRzKHt9LF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCgpKHRoaXMucHJvcHMsRGlhbG9nLmludGVybmFsS2V5cykse3JlZjpmdW5jdGlvbiByZWYobm9kZSl7cmV0dXJuIF90aGlzMi4kd3JhcHBlcj1ub2RlO30sY2xhc3NOYW1lOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9jbGFzc25hbWVzX19fZGVmYXVsdCgpKCdiLWRpYWxvZy13cmFwcGVyJyx0aGlzLnByb3BzLmNsYXNzTmFtZSl9KSx0aGlzLnJlbmRlckZvY3VzQm91bmRhcnkoKSx0aGlzLnByb3BzLmJlZm9yZSxfX3dlYnBhY2tfcmVxdWlyZV9fLmkoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX3JlYWN0X19bXCJjcmVhdGVFbGVtZW50XCJdKSh0aGlzLnByb3BzLmRpYWxvZ0NvbXBvbmVudCxfZXh0ZW5kcyh7fSx0aGlzLmRpYWxvZ1Byb3BzLHtyZWY6ZnVuY3Rpb24gcmVmKG5vZGUpe3JldHVybiBfdGhpczIuJGRpYWxvZz1ub2RlO30sY2xhc3NOYW1lOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9jbGFzc25hbWVzX19fZGVmYXVsdCgpKCdiLWRpYWxvZycsdGhpcy5wcm9wcy5kaWFsb2dQcm9wcy5jbGFzc05hbWUpLG9uQ2xpY2s6dGhpcy5oYW5kbGVJbnNpZGVDbGljayxvbktleURvd246dGhpcy5oYW5kbGVLZXlEb3duLHJvbGU6dGhpcy5wcm9wcy5jYXB0dXJlRm9jdXM/J2FsZXJ0ZGlhbG9nJzonZGlhbG9nJyx0YWJJbmRleDonMCd9KSx0aGlzLnByb3BzLmNoaWxkcmVuKSx0aGlzLnByb3BzLmFmdGVyLHRoaXMucmVuZGVyRm9jdXNCb3VuZGFyeSgpKTt9fV0pO3JldHVybiBEaWFsb2c7fShfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfcmVhY3RfX1tcIlB1cmVDb21wb25lbnRcIl0pO0RpYWxvZy5wcm9wVHlwZXM9eycqJzpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcHJvcF90eXBlc19fX2RlZmF1bHQuYS5hbnksYWZ0ZXI6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3Byb3BfdHlwZXNfX19kZWZhdWx0LmEubm9kZSxiZWZvcmU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3Byb3BfdHlwZXNfX19kZWZhdWx0LmEubm9kZSxjYXB0dXJlRm9jdXM6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3Byb3BfdHlwZXNfX19kZWZhdWx0LmEuYm9vbCxjbG9zZU9uRXNjS2V5Ol9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9wcm9wX3R5cGVzX19fZGVmYXVsdC5hLm9uZU9mVHlwZShbX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3Byb3BfdHlwZXNfX19kZWZhdWx0LmEuYm9vbCxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcHJvcF90eXBlc19fX2RlZmF1bHQuYS5mdW5jXSksY2xvc2VPbkluc2lkZUNsaWNrOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9wcm9wX3R5cGVzX19fZGVmYXVsdC5hLm9uZU9mVHlwZShbX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3Byb3BfdHlwZXNfX19kZWZhdWx0LmEuYm9vbCxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcHJvcF90eXBlc19fX2RlZmF1bHQuYS5mdW5jXSksY2xvc2VPbk91dHNpZGVDbGljazpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcHJvcF90eXBlc19fX2RlZmF1bHQuYS5vbmVPZlR5cGUoW19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9wcm9wX3R5cGVzX19fZGVmYXVsdC5hLmJvb2wsX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3Byb3BfdHlwZXNfX19kZWZhdWx0LmEuZnVuY10pLGNsb3NlT25PdXRzaWRlRm9jdXM6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3Byb3BfdHlwZXNfX19kZWZhdWx0LmEub25lT2ZUeXBlKFtfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcHJvcF90eXBlc19fX2RlZmF1bHQuYS5ib29sLF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9wcm9wX3R5cGVzX19fZGVmYXVsdC5hLmZ1bmNdKSxjbG9zZU9uT3V0c2lkZVNjcm9sbDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcHJvcF90eXBlc19fX2RlZmF1bHQuYS5vbmVPZlR5cGUoW19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9wcm9wX3R5cGVzX19fZGVmYXVsdC5hLmJvb2wsX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3Byb3BfdHlwZXNfX19kZWZhdWx0LmEuZnVuY10pLGNvbXBvbmVudDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcHJvcF90eXBlc19fX2RlZmF1bHQuYS5zdHJpbmcsZGlhbG9nQ29tcG9uZW50Ol9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9wcm9wX3R5cGVzX19fZGVmYXVsdC5hLnN0cmluZyxkaWFsb2dQcm9wczpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcHJvcF90eXBlc19fX2RlZmF1bHQuYS5zaGFwZSh7JyonOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9wcm9wX3R5cGVzX19fZGVmYXVsdC5hLmFueX0pLG9uQ2xvc2U6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3Byb3BfdHlwZXNfX19kZWZhdWx0LmEuZnVuY307RGlhbG9nLmRlZmF1bHRQcm9wcz17YWZ0ZXI6bnVsbCxiZWZvcmU6bnVsbCxjYXB0dXJlRm9jdXM6dHJ1ZSxjaGlsZHJlbjpudWxsLGNsb3NlT25Fc2NLZXk6ZmFsc2UsY2xvc2VPbkluc2lkZUNsaWNrOmZhbHNlLGNsb3NlT25PdXRzaWRlQ2xpY2s6ZmFsc2UsY2xvc2VPbk91dHNpZGVGb2N1czpmYWxzZSxjbG9zZU9uT3V0c2lkZVNjcm9sbDpmYWxzZSxjb21wb25lbnQ6J2RpdicsZGlhbG9nQ29tcG9uZW50OidkaXYnLGRpYWxvZ1Byb3BzOnt9LG9uQ2xvc2U6bm9vcCxvbktleURvd246bm9vcH07RGlhbG9nLmludGVybmFsS2V5cz1PYmplY3Qua2V5cyhEaWFsb2cuZGVmYXVsdFByb3BzKTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gKERpYWxvZyk7XG5cbi8qKiovIH0pXG4vKioqKioqLyBdKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gaW5kZXguanMiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDkpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIGUyYjc1MzQ1YWQyYzgyZDEwZmJlIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKi9cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9ICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmXG4gICAgU3ltYm9sLmZvciAmJlxuICAgIFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSkgfHxcbiAgICAweGVhYzc7XG5cbiAgdmFyIGlzVmFsaWRFbGVtZW50ID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmXG4gICAgICBvYmplY3QgIT09IG51bGwgJiZcbiAgICAgIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xuICB9O1xuXG4gIC8vIEJ5IGV4cGxpY2l0bHkgdXNpbmcgYHByb3AtdHlwZXNgIHlvdSBhcmUgb3B0aW5nIGludG8gbmV3IGRldmVsb3BtZW50IGJlaGF2aW9yLlxuICAvLyBodHRwOi8vZmIubWUvcHJvcC10eXBlcy1pbi1wcm9kXG4gIHZhciB0aHJvd09uRGlyZWN0QWNjZXNzID0gdHJ1ZTtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzJykoaXNWYWxpZEVsZW1lbnQsIHRocm93T25EaXJlY3RBY2Nlc3MpO1xufSBlbHNlIHtcbiAgLy8gQnkgZXhwbGljaXRseSB1c2luZyBgcHJvcC10eXBlc2AgeW91IGFyZSBvcHRpbmcgaW50byBuZXcgcHJvZHVjdGlvbiBiZWhhdmlvci5cbiAgLy8gaHR0cDovL2ZiLm1lL3Byb3AtdHlwZXMtaW4tcHJvZFxuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZmFjdG9yeVdpdGhUaHJvd2luZ1NoaW1zJykoKTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL34vcHJvcC10eXBlcy9pbmRleC5qcyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy1wb3J0YWxcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtcG9ydGFsXCJ9XG4vLyBtb2R1bGUgaWQgPSAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzXCJ9XG4vLyBtb2R1bGUgaWQgPSAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNsYXNzbmFtZXNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJjbGFzc25hbWVzXCJ9XG4vLyBtb2R1bGUgaWQgPSAzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn1cbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG5mdW5jdGlvbiBtYWtlRW1wdHlGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gYXJnO1xuICB9O1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gYWNjZXB0cyBhbmQgZGlzY2FyZHMgaW5wdXRzOyBpdCBoYXMgbm8gc2lkZSBlZmZlY3RzLiBUaGlzIGlzXG4gKiBwcmltYXJpbHkgdXNlZnVsIGlkaW9tYXRpY2FsbHkgZm9yIG92ZXJyaWRhYmxlIGZ1bmN0aW9uIGVuZHBvaW50cyB3aGljaFxuICogYWx3YXlzIG5lZWQgdG8gYmUgY2FsbGFibGUsIHNpbmNlIEpTIGxhY2tzIGEgbnVsbC1jYWxsIGlkaW9tIGFsYSBDb2NvYS5cbiAqL1xudmFyIGVtcHR5RnVuY3Rpb24gPSBmdW5jdGlvbiBlbXB0eUZ1bmN0aW9uKCkge307XG5cbmVtcHR5RnVuY3Rpb24udGhhdFJldHVybnMgPSBtYWtlRW1wdHlGdW5jdGlvbjtcbmVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNGYWxzZSA9IG1ha2VFbXB0eUZ1bmN0aW9uKGZhbHNlKTtcbmVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNUcnVlID0gbWFrZUVtcHR5Rn