Comparing version
# Changelog | ||
### 1.0.0-beta.7 (2017-02-03) | ||
7be9e24 Fix site | ||
cdd21d9 Tweak the utils site pages, rebuild | ||
3e9bea9 Trim old code out of webNotification | ||
cf2f339 Ignore built coverage | ||
2096d10 Allow tables inside tables to auto-size themselves | ||
83aff1a Rebuild master files | ||
c956a0f Add wildcard propType for places where anything is accepted | ||
6a79d2f SegmentedControl prop audit | ||
a31c57b Fix Image styling | ||
da7b449 Radio prop audit | ||
c76e2fd ProgressiveDisclosure prop audit | ||
65bfb32 Progress prop audit | ||
b9e0748 Make one of the test helpers more useful | ||
8038a78 Portal test cleanup | ||
7396453 Popover test cleanup | ||
f95da0b Pagination prop audit | ||
8cdef4b Modal test cleanup, no prop changes | ||
632116a Input prop audit | ||
1999ed9 Image prop audit* | ||
56607fd FittedText prop audit | ||
b471fe8 Dialog prop audit | ||
c1d2ca0 CheckboxGroup prop audit | ||
6fa61f1 boundless-utils-conformance -> boundless-utils-test-helpers | ||
517a851 Some site changes | ||
9a3bc92 Checkbox prop audit | ||
4ba5d7e Button prop audit | ||
71b0d80 Async prop audit | ||
52dbc1e ArrowKeyNavigation prop review & light refactor | ||
08c7a72 Fix a prop rendering edge case | ||
89a458e Add Boundless philosophy | ||
3da2615 Add some keywords to the main build package.json | ||
be814fd Add some keywords to the main build package.json | ||
f5d633a Build CSS for each styled package alongside the JS | ||
3bf6995 Fix missing site H1s | ||
8984be9 Try an alternative way to do SPAs on github pages | ||
689cba7 Rebuild all targets | ||
9d7b697 Overwrite old symlinks to the variables file if needed | ||
47b47d6 Include notes re: reference styles in the package READMEs | ||
c504ac5 Autolink variables.styl into each package | ||
4dc3c1e Refine the autogenerated package READMEs | ||
df509c7 Stylus variable audit & overall style refactor | ||
bb7366e Add a "kitchen sink" page | ||
af8effe Use a more accurate luminance algorithm for constasting color | ||
d96e4ca Remove jest module field until it's merged | ||
00096a3 Autogenerated sitemap | ||
03f3317 Adjust README gen strategy, publish uuid and webnotification | ||
04151dd Add Google search verification | ||
dd772e8 Add version badge | ||
3926c0b Add a favicon, import -> require in Stylus files | ||
46422c6 Stop mangling the dev build | ||
3980c9c Update the readme to remove the beta tag | ||
dac1e42 Simplify the use of fetch in component-page for the site | ||
c07a1a3 Fix linting | ||
### 1.0.0-beta.6 (2017-01-26) | ||
bd1801a Fix build issues, start publishing utils | ||
### 1.0.0-beta.5 (2017-01-25) | ||
@@ -4,0 +64,0 @@ |
{ | ||
"name": "boundless", | ||
"description": "Intuitive, accessible solutions for common UI needs in React.", | ||
"version": "1.0.0-beta.6", | ||
"description": "accessible, battle-tested, infinitely composable react components", | ||
"version": "1.0.0-beta.7", | ||
"author": "Evan Scott <glitterbyte@gmail.com> (http://yaycmyk.com)", | ||
@@ -11,2 +11,9 @@ "contributors": [ | ||
"license": "MIT", | ||
"keywords": [ | ||
"react", | ||
"component", | ||
"library", | ||
"toolkit", | ||
"ui" | ||
], | ||
"main": "public/boundless.js", | ||
@@ -33,2 +40,3 @@ "dependencies": { | ||
"eslint-plugin-react": "^6.3.0", | ||
"extract-comments": "^0.10.1", | ||
"extract-text-webpack-plugin": "^2.0.0-beta.4", | ||
@@ -49,2 +57,3 @@ "git-rev-sync": "^1.8.0", | ||
"sinon": "^1.17.3", | ||
"sitemap-webpack-plugin": "^0.3.0", | ||
"style-loader": "^0.13.1", | ||
@@ -62,2 +71,8 @@ "stylus": "^0.54.2", | ||
"cacheDirectory": "node_modules/.cache/jest-cli", | ||
"coveragePathIgnorePatterns": [ | ||
"/build/", | ||
"/docs/", | ||
"/node_modules/", | ||
"/packages/boundless-utils-test-helpers/" | ||
], | ||
"coverageReporters": [ | ||
@@ -86,4 +101,6 @@ "text", | ||
"prerelease": "npm i && npm run bootstrap && rm -f docs/assets/*.js && rm -f docs/assets/*.css", | ||
"release": "npm run build:css && npm run build:css:release && npm run build:js:master && npm run build:js:packages && npm run site" | ||
"release": "npm run build:css && npm run build:css:release && npm run build:js:master && npm run build:js:packages && npm run site", | ||
"prepublish": "lerna exec --ignore boundless-utils* -- ln -fs ../../variables.styl variables.styl", | ||
"publish": "lerna publish --skip-git --repo-version $(node -e \"console.log(require('./package.json').version)\")" | ||
} | ||
} |
@@ -1,2 +0,2 @@ | ||
module.exports=function(e){function t(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,o){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:o})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=4)}([function(e,t,n){"use strict";function o(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Object.keys(e).reduce(function(n,o){return t.indexOf(o)===-1&&(n[o]=e[o]),n},{})}t.a=o},function(e,t,n){"use strict";function o(){return"b-"+([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,function(e){return(e^16*Math.random()>>e/4).toString(16)})}t.a=o},function(e,t){e.exports=require("react")},function(e,t){e.exports=require("react-dom")},function(e,t,n){"use strict";function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=n(2),c=n.n(a),s=n(3),u=(n.n(s),n(0)),p=n(1),d=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},l=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,n,o){return n&&e(t.prototype,n),o&&e(t,o),t}}(),f=function(e){function t(){var e,n,i,a;o(this,t);for(var s=arguments.length,u=Array(s),p=0;p<s;p++)u[p]=arguments[p];return n=i=r(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(u))),i.state={activeChildIndex:i.props.defaultActiveChildIndex},i.handleKeyDown=function(e){switch(e.key){case"ArrowUp":i.props.mode!==t.mode.VERTICAL&&i.props.mode!==t.mode.BOTH||(e.preventDefault(),i.moveFocus(-1));break;case"ArrowLeft":i.props.mode!==t.mode.HORIZONTAL&&i.props.mode!==t.mode.BOTH||(e.preventDefault(),i.moveFocus(-1));break;case"ArrowDown":i.props.mode!==t.mode.VERTICAL&&i.props.mode!==t.mode.BOTH||(e.preventDefault(),i.moveFocus(1));break;case"ArrowRight":i.props.mode!==t.mode.HORIZONTAL&&i.props.mode!==t.mode.BOTH||(e.preventDefault(),i.moveFocus(1))}i.props.onKeyDown&&i.props.onKeyDown(e)},i.handleFocus=function(e){if(e.target.hasAttribute("data-focus-index")){var t=parseInt(e.target.getAttribute("data-focus-index"),10),n=c.a.Children.toArray(i.props.children)[t];i.setState({activeChildIndex:t}),n.props.onFocus&&n.props.onFocus(e)}},a=n,r(i,a)}return i(t,e),l(t,[{key:"componentDidUpdate",value:function(e,t){this.state.activeChildIndex!==t.activeChildIndex&&this.setFocus(this.state.activeChildIndex)}},{key:"componentWillReceiveProps",value:function(e){if(0!==this.state.activeChildIndex){var t=e.children?c.a.Children.count(e.children):0;0===t?this.setState({activeChildIndex:0}):this.state.activeChildIndex>=t&&this.setState({activeChildIndex:t-1})}}},{key:"setFocus",value:function(e){var t=(this.refs.wrapper instanceof HTMLElement?this.refs.wrapper:n.i(s.findDOMNode)(this.refs.wrapper)).children[e];t&&t.hasAttribute("data-skip")?this.moveFocus(t.compareDocumentPosition(document.activeElement)&Node.DOCUMENT_POSITION_FOLLOWING?-1:1):t&&document.activeElement!==t&&t.focus()}},{key:"moveFocus",value:function(e){var t=this.props.children?c.a.Children.count(this.props.children):0,n=this.state.activeChildIndex+e;n>=t?n=0:n<0&&(n=t-1),this.setState({activeChildIndex:n})}},{key:"children",value:function(){var e=this;return c.a.Children.map(this.props.children,function(t,n){return c.a.cloneElement(t,{"data-focus-index":n,"data-skip":parseInt(t.props.tabIndex,10)===-1||void 0,key:t.key||n,tabIndex:e.state.activeChildIndex===n?0:-1})})}},{key:"render",value:function(){return c.a.createElement(this.props.component,d({},n.i(u.a)(this.props,t.internalKeys),{ref:"wrapper",onFocus:this.handleFocus,onKeyDown:this.handleKeyDown}),this.children())}}]),t}(c.a.PureComponent);f.mode={HORIZONTAL:n.i(p.a)(),VERTICAL:n.i(p.a)(),BOTH:n.i(p.a)()},f.propTypes={component:a.PropTypes.oneOfType([a.PropTypes.string,a.PropTypes.func]),defaultActiveChildIndex:a.PropTypes.number,mode:a.PropTypes.oneOf([f.mode.BOTH,f.mode.HORIZONTAL,f.mode.VERTICAL])},f.defaultProps={component:"div",defaultActiveChildIndex:0,mode:f.mode.BOTH,onKeyDown:function(){}},f.internalKeys=Object.keys(f.defaultProps),t.default=f}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIDIyMTQwMjVlZmNjNGNiZWI2ZDQxIiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvYm91bmRsZXNzLXV0aWxzLXV1aWQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3QtZG9tXCJ9Iiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy1hcnJvdy1rZXktbmF2aWdhdGlvbi9pbmRleC5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwibW9kdWxlcyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImluc3RhbGxlZE1vZHVsZXMiLCJpIiwibCIsImNhbGwiLCJtIiwiYyIsInZhbHVlIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwiZ2V0IiwibiIsIl9fZXNNb2R1bGUiLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJfX3dlYnBhY2tfZXhwb3J0c19fIiwib21pdEtleXNGcm9tU291cmNlT2JqZWN0Iiwic291cmNlIiwib21pdHRlZEtleXMiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJrZXlzIiwicmVkdWNlIiwiaGFzaCIsImtleSIsImluZGV4T2YiLCJ1dWlkIiwicmVwbGFjZSIsImEiLCJNYXRoIiwicmFuZG9tIiwidG9TdHJpbmciLCJyZXF1aXJlIiwiX2NsYXNzQ2FsbENoZWNrIiwiaW5zdGFuY2UiLCJDb25zdHJ1Y3RvciIsIlR5cGVFcnJvciIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIiwic2VsZiIsIlJlZmVyZW5jZUVycm9yIiwiX2luaGVyaXRzIiwic3ViQ2xhc3MiLCJzdXBlckNsYXNzIiwiY3JlYXRlIiwiY29uc3RydWN0b3IiLCJ3cml0YWJsZSIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX3JlYWN0X2RvbV9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfdXVpZF9fIiwiX2V4dGVuZHMiLCJhc3NpZ24iLCJ0YXJnZXQiLCJfY3JlYXRlQ2xhc3MiLCJkZWZpbmVQcm9wZXJ0aWVzIiwicHJvcHMiLCJkZXNjcmlwdG9yIiwicHJvdG9Qcm9wcyIsInN0YXRpY1Byb3BzIiwiQXJyb3dLZXlOYXZpZ2F0aW9uIiwiX1JlYWN0JFB1cmVDb21wb25lbnQiLCJfcmVmIiwiX3RlbXAiLCJfdGhpcyIsIl9yZXQiLCJ0aGlzIiwiX2xlbiIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJnZXRQcm90b3R5cGVPZiIsImFwcGx5IiwiY29uY2F0Iiwic3RhdGUiLCJhY3RpdmVDaGlsZEluZGV4IiwiZGVmYXVsdEFjdGl2ZUNoaWxkSW5kZXgiLCJoYW5kbGVLZXlEb3duIiwiZXZlbnQiLCJtb2RlIiwiVkVSVElDQUwiLCJCT1RIIiwicHJldmVudERlZmF1bHQiLCJtb3ZlRm9jdXMiLCJIT1JJWk9OVEFMIiwib25LZXlEb3duIiwiaGFuZGxlRm9jdXMiLCJoYXNBdHRyaWJ1dGUiLCJpbmRleCIsInBhcnNlSW50IiwiZ2V0QXR0cmlidXRlIiwiY2hpbGQiLCJDaGlsZHJlbiIsInRvQXJyYXkiLCJjaGlsZHJlbiIsInNldFN0YXRlIiwib25Gb2N1cyIsInByZXZQcm9wcyIsInByZXZTdGF0ZSIsInNldEZvY3VzIiwibmV4dFByb3BzIiwibnVtQ2hpbGRyZW4iLCJjb3VudCIsImNoaWxkTm9kZSIsInJlZnMiLCJ3cmFwcGVyIiwiSFRNTEVsZW1lbnQiLCJjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiIsImRvY3VtZW50IiwiYWN0aXZlRWxlbWVudCIsIk5vZGUiLCJET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkciLCJmb2N1cyIsImRlbHRhIiwibmV4dEluZGV4IiwiX3RoaXMyIiwibWFwIiwiY2xvbmVFbGVtZW50IiwiZGF0YS1mb2N1cy1pbmRleCIsImRhdGEtc2tpcCIsInRhYkluZGV4IiwiY3JlYXRlRWxlbWVudCIsImNvbXBvbmVudCIsImludGVybmFsS2V5cyIsInJlZiIsIlB1cmVDb21wb25lbnQiLCJwcm9wVHlwZXMiLCJvbmVPZlR5cGUiLCJzdHJpbmciLCJmdW5jIiwibnVtYmVyIiwib25lT2YiLCJkZWZhdWx0UHJvcHMiXSwibWFwcGluZ3MiOiJBQUFBQSxPQUFPQyxRQUNFLFNBQVVDLEdDR25CLFFBQUFDLEdBQUFDLEdBR0EsR0FBQUMsRUFBQUQsR0FDQSxNQUFBQyxHQUFBRCxHQUFBSCxPQUdBLElBQUFELEdBQUFLLEVBQUFELElBQ0FFLEVBQUFGLEVBQ0FHLEdBQUEsRUFDQU4sV0FVQSxPQU5BQyxHQUFBRSxHQUFBSSxLQUFBUixFQUFBQyxRQUFBRCxJQUFBQyxRQUFBRSxHQUdBSCxFQUFBTyxHQUFBLEVBR0FQLEVBQUFDLFFBdkJBLEdBQUFJLEtBK0RBLE9BbkNBRixHQUFBTSxFQUFBUCxFQUdBQyxFQUFBTyxFQUFBTCxFQUdBRixFQUFBRyxFQUFBLFNBQUFLLEdBQTJDLE1BQUFBLElBRzNDUixFQUFBUyxFQUFBLFNBQUFYLEVBQUFZLEVBQUFDLEdBQ0FYLEVBQUFZLEVBQUFkLEVBQUFZLElBQ0FHLE9BQUFDLGVBQUFoQixFQUFBWSxHQUNBSyxjQUFBLEVBQ0FDLFlBQUEs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QUFBK0YsY0FBQXZELEtBQU1WLE1BQU1rRSxVQUFadkUsS0FDUWpFLEVBQUFHLEVBQUE0RCxFQUFBLEdBQUtpQixLQUFLVixNQUFPSSxFQUFtQitELGVBQ3hDQyxJQUFJLFVBQ0o1QixRQUFTOUIsS0FBS29CLFlBQ2RELFVBQVduQixLQUFLVyxnQkFDZlgsS0FBSzRCLGdCTnRGdTRLbEMsR003RjcyS2IsRUFBQXJCLEVBQU1tRyxjQUFqQ2pFLEdBQ1ZtQixNQUNISyxXQUFZbEcsRUFBQUcsRUFBQTZELEVBQUEsS0FDWjhCLFNBQVU5RixFQUFBRyxFQUFBNkQsRUFBQSxLQUNWK0IsS0FBTS9GLEVBQUFHLEVBQUE2RCxFQUFBLE1BSk9VLEVBT1ZrRSxXQUlISixVQUFXNUUsRUFBQSxVQUFVaUYsV0FDakJqRixFQUFBLFVBQVVrRixPQUNWbEYsRUFBQSxVQUFVbUYsT0FNZHJELHdCQUF5QjlCLEVBQUEsVUFBVW9GLE9BYW5DbkQsS0FBTWpDLEVBQUEsVUFBVXFGLE9BQ1p2RSxFQUFtQm1CLEtBQUtFLEtBQ3hCckIsRUFBbUJtQixLQUFLSyxXQUN4QnhCLEVBQW1CbUIsS0FBS0MsWUFuQ2ZwQixFQXVDVndFLGNBQ0hWLFVBQVcsTUFDWDlDLHdCQUF5QixFQUN6QkcsS0FBTW5CLEVBQW1CbUIsS0FBS0UsS0FDOUJJLFVBQVcsY0EzQ0V6QixFQThDVitELGFBQWU1SCxPQUFPb0IsS0FBS3lDLEVBQW1Cd0UsY04rQ284TXhILEVBQTZCLFFNN0ZyZ05nRCIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbi8qKioqKiovIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbi8qKioqKiovIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA0KTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGV4cG9ydCAoaW1tdXRhYmxlKSAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IG9taXRLZXlzRnJvbVNvdXJjZU9iamVjdDtcbmZ1bmN0aW9uIG9taXRLZXlzRnJvbVNvdXJjZU9iamVjdChzb3VyY2Upe3ZhciBvbWl0dGVkS2V5cz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMV06W107cmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIHJlbG9jYXRlQWNjZXB0ZWRLZXlzKGhhc2gsa2V5KXtpZihvbWl0dGVkS2V5cy5pbmRleE9mKGtleSk9PT0tMSl7aGFzaFtrZXldPXNvdXJjZVtrZXldO31yZXR1cm4gaGFzaDt9LHt9KTt9XG5cbi8qKiovIH0pLFxuLyogMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgZXhwb3J0IChpbW11dGFibGUpICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gdXVpZDtcbmZ1bmN0aW9uIHV1aWQoKXtyZXR1cm4nYi0nKyhbMWU3XSstMWUzKy00ZTMrLThlMystMWUxMSkucmVwbGFjZSgvWzAxOF0vZyxmdW5jdGlvbihhKXtyZXR1cm4oYV5NYXRoLnJhbmRvbSgpKjE2Pj5hLzQpLnRvU3RyaW5nKDE2KTt9KTt9XG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxuLyoqKi8gfSksXG4vKiAzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0LWRvbVwiKTtcblxuLyoqKi8gfSksXG4vKiA0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KF9fd2VicGFja19leHBvcnRzX18sIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfcmVhY3RfZG9tX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9kb21fX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9kb21fXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc191dWlkX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xudmFyIF9leHRlbmRzPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHRhcmdldCl7Zm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIHNvdXJjZT1hcmd1bWVudHNbaV07Zm9yKHZhciBrZXkgaW4gc291cmNlKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLGtleSkpe3RhcmdldFtrZXldPXNvdXJjZVtrZXldO319fXJldHVybiB0YXJnZXQ7fTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQscHJvcHMpe2Zvcih2YXIgaT0wO2k8cHJvcHMubGVuZ3RoO2krKyl7dmFyIGRlc2NyaXB0b3I9cHJvcHNbaV07ZGVzY3JpcHRvci5lbnVtZXJhYmxlPWRlc2NyaXB0b3IuZW51bWVyYWJsZXx8ZmFsc2U7ZGVzY3JpcHRvci5jb25maWd1cmFibGU9dHJ1ZTtpZihcInZhbHVlXCJpbiBkZXNjcmlwdG9yKWRlc2NyaXB0b3Iud3JpdGFibGU9dHJ1ZTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LGRlc2NyaXB0b3Iua2V5LGRlc2NyaXB0b3IpO319cmV0dXJuIGZ1bmN0aW9uKENvbnN0cnVjdG9yLHByb3RvUHJvcHMsc3RhdGljUHJvcHMpe2lmKHByb3RvUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUscHJvdG9Qcm9wcyk7aWYoc3RhdGljUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3RvcixzdGF0aWNQcm9wcyk7cmV0dXJuIENvbnN0cnVjdG9yO307fSgpO2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSxDb25zdHJ1Y3Rvcil7aWYoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTt9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsY2FsbCl7aWYoIXNlbGYpe3Rocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTt9cmV0dXJuIGNhbGwmJih0eXBlb2YgY2FsbD09PVwib2JqZWN0XCJ8fHR5cGVvZiBjYWxsPT09XCJmdW5jdGlvblwiKT9jYWxsOnNlbGY7fWZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcyxzdXBlckNsYXNzKXtpZih0eXBlb2Ygc3VwZXJDbGFzcyE9PVwiZnVuY3Rpb25cIiYmc3VwZXJDbGFzcyE9PW51bGwpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiK3R5cGVvZiBzdXBlckNsYXNzKTt9c3ViQ2xhc3MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyYmc3VwZXJDbGFzcy5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpzdWJDbGFzcyxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9fSk7aWYoc3VwZXJDbGFzcylPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLHN1cGVyQ2xhc3MpOnN1YkNsYXNzLl9fcHJvdG9fXz1zdXBlckNsYXNzO312YXIgQXJyb3dLZXlOYXZpZ2F0aW9uPWZ1bmN0aW9uKF9SZWFjdCRQdXJlQ29tcG9uZW50KXtfaW5oZXJpdHMoQXJyb3dLZXlOYXZpZ2F0aW9uLF9SZWFjdCRQdXJlQ29tcG9uZW50KTtmdW5jdGlvbiBBcnJvd0tleU5hdmlnYXRpb24oKXt2YXIgX3JlZjt2YXIgX3RlbXAsX3RoaXMsX3JldDtfY2xhc3NDYWxsQ2hlY2sodGhpcyxBcnJvd0tleU5hdmlnYXRpb24pO2Zvcih2YXIgX2xlbj1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkoX2xlbiksX2tleT0wO19rZXk8X2xlbjtfa2V5Kyspe2FyZ3NbX2tleV09YXJndW1lbnRzW19rZXldO31yZXR1cm4gX3JldD0oX3RlbXA9KF90aGlzPV9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKF9yZWY9QXJyb3dLZXlOYXZpZ2F0aW9uLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKEFycm93S2V5TmF2aWdhdGlvbikpLmNhbGwuYXBwbHkoX3JlZixbdGhpc10uY29uY2F0KGFyZ3MpKSksX3RoaXMpLF90aGlzLnN0YXRlPXthY3RpdmVDaGlsZEluZGV4Ol90aGlzLnByb3BzLmRlZmF1bHRBY3RpdmVDaGlsZEluZGV4fSxfdGhpcy5oYW5kbGVLZXlEb3duPWZ1bmN0aW9uKGV2ZW50KXtzd2l0Y2goZXZlbnQua2V5KXtjYXNlJ0Fycm93VXAnOmlmKF90aGlzLnByb3BzLm1vZGU9PT1BcnJvd0tleU5hdmlnYXRpb24ubW9kZS5WRVJUSUNBTHx8X3RoaXMucHJvcHMubW9kZT09PUFycm93S2V5TmF2aWdhdGlvbi5tb2RlLkJPVEgpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7X3RoaXMubW92ZUZvY3VzKC0xKTt9YnJlYWs7Y2FzZSdBcnJvd0xlZnQnOmlmKF90aGlzLnByb3BzLm1vZGU9PT1BcnJvd0tleU5hdmlnYXRpb24ubW9kZS5IT1JJWk9OVEFMfHxfdGhpcy5wcm9wcy5tb2RlPT09QXJyb3dLZXlOYXZpZ2F0aW9uLm1vZGUuQk9USCl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtfdGhpcy5tb3ZlRm9jdXMoLTEpO31icmVhaztjYXNlJ0Fycm93RG93bic6aWYoX3RoaXMucHJvcHMubW9kZT09PUFycm93S2V5TmF2aWdhdGlvbi5tb2RlLlZFUlRJQ0FMfHxfdGhpcy5wcm9wcy5tb2RlPT09QXJyb3dLZXlOYXZpZ2F0aW9uLm1vZGUuQk9USCl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtfdGhpcy5tb3ZlRm9jdXMoMSk7fWJyZWFrO2Nhc2UnQXJyb3dSaWdodCc6aWYoX3RoaXMucHJvcHMubW9kZT09PUFycm93S2V5TmF2aWdhdGlvbi5tb2RlLkhPUklaT05UQUx8fF90aGlzLnByb3BzLm1vZGU9PT1BcnJvd0tleU5hdmlnYXRpb24ubW9kZS5CT1RIKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO190aGlzLm1vdmVGb2N1cygxKTt9YnJlYWs7fWlmKF90aGlzLnByb3BzLm9uS2V5RG93bil7X3RoaXMucHJvcHMub25LZXlEb3duKGV2ZW50KTt9fSxfdGhpcy5oYW5kbGVGb2N1cz1mdW5jdGlvbihldmVudCl7aWYoZXZlbnQudGFyZ2V0Lmhhc0F0dHJpYnV0ZSgnZGF0YS1mb2N1cy1pbmRleCcpKXt2YXIgaW5kZXg9cGFyc2VJbnQoZXZlbnQudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1mb2N1cy1pbmRleCcpLDEwKTt2YXIgY2hpbGQ9X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLkNoaWxkcmVuLnRvQXJyYXkoX3RoaXMucHJvcHMuY2hpbGRyZW4pW2luZGV4XTtfdGhpcy5zZXRTdGF0ZSh7YWN0aXZlQ2hpbGRJbmRleDppbmRleH0pO2lmKGNoaWxkLnByb3BzLm9uRm9jdXMpe2NoaWxkLnByb3BzLm9uRm9jdXMoZXZlbnQpO319fSxfdGVtcCksX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsX3JldCk7fV9jcmVhdGVDbGFzcyhBcnJvd0tleU5hdmlnYXRpb24sW3trZXk6J2NvbXBvbmVudERpZFVwZGF0ZScsdmFsdWU6ZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcyxwcmV2U3RhdGUpe2lmKHRoaXMuc3RhdGUuYWN0aXZlQ2hpbGRJbmRleCE9PXByZXZTdGF0ZS5hY3RpdmVDaGlsZEluZGV4KXt0aGlzLnNldEZvY3VzKHRoaXMuc3RhdGUuYWN0aXZlQ2hpbGRJbmRleCk7fX19LHtrZXk6J2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMnLHZhbHVlOmZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKXtpZih0aGlzLnN0YXRlLmFjdGl2ZUNoaWxkSW5kZXghPT0wKXt2YXIgbnVtQ2hpbGRyZW49bmV4dFByb3BzLmNoaWxkcmVuP19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5DaGlsZHJlbi5jb3VudChuZXh0UHJvcHMuY2hpbGRyZW4pOjA7aWYobnVtQ2hpbGRyZW49PT0wKXt0aGlzLnNldFN0YXRlKHthY3RpdmVDaGlsZEluZGV4OjB9KTt9ZWxzZSBpZih0aGlzLnN0YXRlLmFjdGl2ZUNoaWxkSW5kZXg+PW51bUNoaWxkcmVuKXt0aGlzLnNldFN0YXRlKHthY3RpdmVDaGlsZEluZGV4Om51bUNoaWxkcmVuLTF9KTt9fX19LHtrZXk6J3NldEZvY3VzJyx2YWx1ZTpmdW5jdGlvbiBzZXRGb2N1cyhpbmRleCl7dmFyIGNoaWxkTm9kZT0odGhpcy5yZWZzLndyYXBwZXIgaW5zdGFuY2VvZiBIVE1MRWxlbWVudD90aGlzLnJlZnMud3JhcHBlcjpfX3dlYnBhY2tfcmVxdWlyZV9fLmkoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX3JlYWN0X2RvbV9fW1wiZmluZERPTU5vZGVcIl0pKHRoaXMucmVmcy53cmFwcGVyKSkuY2hpbGRyZW5baW5kZXhdO2lmKGNoaWxkTm9kZSYmY2hpbGROb2RlLmhhc0F0dHJpYnV0ZSgnZGF0YS1za2lwJykpe3RoaXMubW92ZUZvY3VzKGNoaWxkTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihkb2N1bWVudC5hY3RpdmVFbGVtZW50KSZOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORz8tMToxKTt9ZWxzZSBpZihjaGlsZE5vZGUmJmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQhPT1jaGlsZE5vZGUpe2NoaWxkTm9kZS5mb2N1cygpO319fSx7a2V5Oidtb3ZlRm9jdXMnLHZhbHVlOmZ1bmN0aW9uIG1vdmVGb2N1cyhkZWx0YSl7dmFyIG51bUNoaWxkcmVuPXRoaXMucHJvcHMuY2hpbGRyZW4/X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLkNoaWxkcmVuLmNvdW50KHRoaXMucHJvcHMuY2hpbGRyZW4pOjA7dmFyIG5leHRJbmRleD10aGlzLnN0YXRlLmFjdGl2ZUNoaWxkSW5kZXgrZGVsdGE7aWYobmV4dEluZGV4Pj1udW1DaGlsZHJlbil7bmV4dEluZGV4PTA7fWVsc2UgaWYobmV4dEluZGV4PDApe25leHRJbmRleD1udW1DaGlsZHJlbi0xO310aGlzLnNldFN0YXRlKHthY3RpdmVDaGlsZEluZGV4Om5leHRJbmRleH0pO319LHtrZXk6J2NoaWxkcmVuJyx2YWx1ZTpmdW5jdGlvbiBjaGlsZHJlbigpe3ZhciBfdGhpczI9dGhpcztyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLkNoaWxkcmVuLm1hcCh0aGlzLnByb3BzLmNoaWxkcmVuLGZ1bmN0aW9uKGNoaWxkLGluZGV4KXtyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNsb25lRWxlbWVudChjaGlsZCx7J2RhdGEtZm9jdXMtaW5kZXgnOmluZGV4LCdkYXRhLXNraXAnOnBhcnNlSW50KGNoaWxkLnByb3BzLnRhYkluZGV4LDEwKT09PS0xfHx1bmRlZmluZWQsa2V5OmNoaWxkLmtleXx8aW5kZXgsdGFiSW5kZXg6X3RoaXMyLnN0YXRlLmFjdGl2ZUNoaWxkSW5kZXg9PT1pbmRleD8wOi0xfSk7fSk7fX0se2tleToncmVuZGVyJyx2YWx1ZTpmdW5jdGlvbiByZW5kZXIoKXtyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQodGhpcy5wcm9wcy5jb21wb25lbnQsX2V4dGVuZHMoe30sX193ZWJwYWNrX3JlcXVpcmVfXy5pKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKHRoaXMucHJvcHMsQXJyb3dLZXlOYXZpZ2F0aW9uLmludGVybmFsS2V5cykse3JlZjond3JhcHBlcicsb25Gb2N1czp0aGlzLmhhbmRsZUZvY3VzLG9uS2V5RG93bjp0aGlzLmhhbmRsZUtleURvd259KSx0aGlzLmNoaWxkcmVuKCkpO319XSk7cmV0dXJuIEFycm93S2V5TmF2aWdhdGlvbjt9KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5QdXJlQ29tcG9uZW50KTtBcnJvd0tleU5hdmlnYXRpb24ubW9kZT17SE9SSVpPTlRBTDpfX3dlYnBhY2tfcmVxdWlyZV9fLmkoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc191dWlkX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKCksVkVSVElDQUw6X193ZWJwYWNrX3JlcXVpcmVfXy5pKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfdXVpZF9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKSgpLEJPVEg6X193ZWJwYWNrX3JlcXVpcmVfXy5pKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfdXVpZF9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKSgpfTtBcnJvd0tleU5hdmlnYXRpb24ucHJvcFR5cGVzPXtjb21wb25lbnQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub25lT2ZUeXBlKFtfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5zdHJpbmcsX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uZnVuY10pLGRlZmF1bHRBY3RpdmVDaGlsZEluZGV4Ol9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm51bWJlcixtb2RlOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm9uZU9mKFtBcnJvd0tleU5hdmlnYXRpb24ubW9kZS5CT1RILEFycm93S2V5TmF2aWdhdGlvbi5tb2RlLkhPUklaT05UQUwsQXJyb3dLZXlOYXZpZ2F0aW9uLm1vZGUuVkVSVElDQUxdKX07QXJyb3dLZXlOYXZpZ2F0aW9uLmRlZmF1bHRQcm9wcz17Y29tcG9uZW50OidkaXYnLGRlZmF1bHRBY3RpdmVDaGlsZEluZGV4OjAsbW9kZTpBcnJvd0tleU5hdmlnYXRpb24ubW9kZS5CT1RILG9uS2V5RG93bjpmdW5jdGlvbiBvbktleURvd24oKXt9fTtBcnJvd0tleU5hdmlnYXRpb24uaW50ZXJuYWxLZXlzPU9iamVjdC5rZXlzKEFycm93S2V5TmF2aWdhdGlvbi5kZWZhdWx0UHJvcHMpOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSBBcnJvd0tleU5hdmlnYXRpb247XG5cbi8qKiovIH0pXG4vKioqKioqLyBdKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gaW5kZXguanMiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA0KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCAyMjE0MDI1ZWZjYzRjYmViNmQ0MSIsIi8qKlxuICogUmV0dXJucyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHN1cHBsaWVkIG9iamVjdCB3aXRob3V0IHRoZSBnaXZlbiBrZXlzLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBvbWl0S2V5c0Zyb21Tb3VyY2VPYmplY3Qoc291cmNlLCBvbWl0dGVkS2V5cyA9IFtdKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIHJlbG9jYXRlQWNjZXB0ZWRLZXlzKGhhc2gsIGtleSkge1xuICAgICAgICBpZiAob21pdHRlZEtleXMuaW5kZXhPZihrZXkpID09PSAtMSkge1xuICAgICAgICAgICAgaGFzaFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFzaDtcbiAgICB9LCB7fSk7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9ib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzL2luZGV4LmpzIiwiLyoqXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQuIEFkZHMgYSBwcmVmaXggc28gaXQgaXMgc3VpdGFibGUgZm9yIHVzZSBhcyBhbiBIVE1MIElELlxuICogQmFzZWQgb24ge0BsaW5rIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2plZC85ODI4ODMgdGhpcyBpbXBsZW1lbnRhdGlvbn0uXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBhIHVuaXF1ZSBpZGVudGlmaWVyXG4gKlxuICogQGV4YW1wbGVcbiAqIHV1aWQoKTsgLy8gYi0xZjJjZDI3Zi0wNzU0LTQzNDQtOWQyMC00MzZhMjAxYjJmODBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXVpZCgpIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAgIHJldHVybiAnYi0nICsgKFsxZTddKy0xZTMrLTRlMystOGUzKy0xZTExKS5yZXBsYWNlKC9bMDE4XS9nLGE9PihhXk1hdGgucmFuZG9tKCkqMTY+PmEvNCkudG9TdHJpbmcoMTYpKTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlICovXG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9ib3VuZGxlc3MtdXRpbHMtdXVpZC9pbmRleC5qcyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn1cbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3QtZG9tXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3QtZG9tXCJ9XG4vLyBtb2R1bGUgaWQgPSAzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCBSZWFjdCwge1Byb3BUeXBlc30gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtmaW5kRE9NTm9kZX0gZnJvbSAncmVhY3QtZG9tJztcblxuaW1wb3J0IG9taXQgZnJvbSAnYm91bmRsZXNzLXV0aWxzLW9taXQta2V5cyc7XG5pbXBvcnQgdXVpZCBmcm9tICdib3VuZGxlc3MtdXRpbHMtdXVpZCc7XG5cbi8qKlxuIyBBcnJvd0tleU5hdmlnYXRpb25cbl9fQSBoaWdoZXItb3JkZXIgY29tcG9uZW50IGZvciBhcnJvdyBrZXkgbmF2aWdhdGlvbiBvbiBhIGdyb3VwaW5nIG9mIGNoaWxkcmVuLl9fXG5cbkFycm93S2V5TmF2aWdhdGlvbiBpcyBkZXNpZ25lZCBub3QgdG8gY2FyZSBhYm91dCB0aGUgY29tcG9uZW50IHR5cGVzIGl0IGlzIHdyYXBwaW5nLiBEdWUgdG8gdGhpcywgeW91IGNhbiBwYXNzXG53aGF0ZXZlciBIVE1MIHRhZyB5b3UgbGlrZSBpbnRvIGBwcm9wcy5jb21wb25lbnRgIG9yIGV2ZW4gYSBSZWFjdCBjb21wb25lbnQgeW91J3ZlIG1hZGUgZWxzZXdoZXJlLiBBZGRpdGlvbmFsXG5wcm9wcyBwYXNzZWQgdG8gYDxBcnJvd0tleU5hdmlnYXRpb24gLi4uPmAgd2lsbCBiZSBmb3J3YXJkZWQgb24gdG8gdGhlIGNvbXBvbmVudCBvciBIVE1MIHRhZyBuYW1lIHlvdSd2ZSBzdXBwbGllZC5cblxuVGhlIGNoaWxkcmVuLCBzaW1pbGFybHksIGNhbiBiZSBhbnkgdHlwZSBvZiBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFycm93S2V5TmF2aWdhdGlvbiBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xuICAgIHN0YXRpYyBtb2RlID0ge1xuICAgICAgICBIT1JJWk9OVEFMOiB1dWlkKCksXG4gICAgICAgIFZFUlRJQ0FMOiB1dWlkKCksXG4gICAgICAgIEJPVEg6IHV1aWQoKSxcbiAgICB9XG5cbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgICAvKipcbiAgICAgICAgICAgIEFueSB2YWxpZCBIVE1MIHRhZyBuYW1lIG9yIGEgUmVhY3QgY29tcG9uZW50IGZhY3RvcnksIGFueXRoaW5nIHRoYXQgY2FuIGJlIHBhc3NlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gYFJlYWN0LmNyZWF0ZUVsZW1lbnRgXG4gICAgICAgICovXG4gICAgICAgIGNvbXBvbmVudDogUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgICAgICAgICBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgICAgICAgUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIF0pLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgICAgQWxsb3dzIGZvciBhIHBhcnRpY3VsYXIgY2hpbGQgdG8gYmUgaW5pdGlhbGx5IHJlYWNoYWJsZSB2aWEgdGFiYmluZ1xuICAgICAgICAqL1xuICAgICAgICBkZWZhdWx0QWN0aXZlQ2hpbGRJbmRleDogUHJvcFR5cGVzLm51bWJlcixcblxuICAgICAgICAvKipcbiAgICAgICAgICogY29udHJvbHMgd2hpY2ggYXJyb3cga2V5IGV2ZW50cyBhcmUgY2FwdHVyZWQgdG8gbW92ZSBhY3RpdmUgZm9jdXMgd2l0aGluIHRoZSBsaXN0OlxuICAgICAgICAgKlxuICAgICAgICAgKiBNb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBLZXlzXG4gICAgICAgICAqIC0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IC0tLS1cbiAgICAgICAgICogYEFycm93S2V5TmF2aWdhdGlvbi5tb2RlLkJPVEhgICAgICAgIHwg4qyF77iPIOKeoe+4jyDirIbvuI8g4qyH77iPXG4gICAgICAgICAqIGBBcnJvd0tleU5hdmlnYXRpb24ubW9kZS5IT1JJWk9OVEFMYCB8IOKshe+4jyDinqHvuI9cbiAgICAgICAgICogYEFycm93S2V5TmF2aWdhdGlvbi5tb2RlLlZFUlRJQ0FMYCAgIHwg4qyG77iPIOKsh++4j1xuICAgICAgICAgKlxuICAgICAgICAgKiBfTm90ZTogZm9jdXMgbG9vcHMgd2hlbiBhcnJvd2luZyBwYXN0IG9uZSBvZiB0aGUgYm91bmRhcmllczsgdGFiYmluZyBtb3ZlcyB0aGUgdXNlciBhd2F5IGZyb20gdGhlIGxpc3QuX1xuICAgICAgICAqL1xuICAgICAgICBtb2RlOiBQcm9wVHlwZXMub25lT2YoW1xuICAgICAgICAgICAgQXJyb3dLZXlOYXZpZ2F0aW9uLm1vZGUuQk9USCxcbiAgICAgICAgICAgIEFycm93S2V5TmF2aWdhdGlvbi5tb2RlLkhPUklaT05UQUwsXG4gICAgICAgICAgICBBcnJvd0tleU5hdmlnYXRpb24ubW9kZS5WRVJUSUNBTCxcbiAgICAgICAgXSksXG4gICAgfVxuXG4gICAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgICAgY29tcG9uZW50OiAnZGl2JyxcbiAgICAgICAgZGVmYXVsdEFjdGl2ZUNoaWxkSW5kZXg6IDAsXG4gICAgICAgIG1vZGU6IEFycm93S2V5TmF2aWdhdGlvbi5tb2RlLkJPVEgsXG4gICAgICAgIG9uS2V5RG93bjogKCkgPT4ge30sXG4gICAgfVxuXG4gICAgc3RhdGljIGludGVybmFsS2V5cyA9IE9iamVjdC5rZXlzKEFycm93S2V5TmF2aWdhdGlvbi5kZWZhdWx0UHJvcHMpXG5cbiAgICBzdGF0ZSA9IHtcbiAgICAgICAgYWN0aXZlQ2hpbGRJbmRleDogdGhpcy5wcm9wcy5kZWZhdWx0QWN0aXZlQ2hpbGRJbmRleCxcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuYWN0aXZlQ2hpbGRJbmRleCAhPT0gcHJldlN0YXRlLmFjdGl2ZUNoaWxkSW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Rm9jdXModGhpcy5zdGF0ZS5hY3RpdmVDaGlsZEluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmFjdGl2ZUNoaWxkSW5kZXggIT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IG51bUNoaWxkcmVuID0gICBuZXh0UHJvcHMuY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBSZWFjdC5DaGlsZHJlbi5jb3VudChuZXh0UHJvcHMuY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDtcblxuICAgICAgICAgICAgaWYgKG51bUNoaWxkcmVuID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7YWN0aXZlQ2hpbGRJbmRleDogMH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLmFjdGl2ZUNoaWxkSW5kZXggPj0gbnVtQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHthY3RpdmVDaGlsZEluZGV4OiBudW1DaGlsZHJlbiAtIDF9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldEZvY3VzKGluZGV4KSB7XG4gICAgICAgIGNvbnN0IGNoaWxkTm9kZSA9IChcbiAgICAgICAgICAgIHRoaXMucmVmcy53cmFwcGVyIGluc3RhbmNlb2YgSFRNTEVsZW1lbnRcbiAgICAgICAgICA/IHRoaXMucmVmcy53cmFwcGVyXG4gICAgICAgICAgOiBmaW5kRE9NTm9kZSh0aGlzLnJlZnMud3JhcHBlcilcbiAgICAgICAgKS5jaGlsZHJlbltpbmRleF07XG5cbiAgICAgICAgaWYgKGNoaWxkTm9kZSAmJiBjaGlsZE5vZGUuaGFzQXR0cmlidXRlKCdkYXRhLXNraXAnKSkge1xuICAgICAgICAgICAgdGhpcy5tb3ZlRm9jdXMoXG4gICAgICAgICAgICAgICAgY2hpbGROb2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkcgPyAtMSA6IDFcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hpbGROb2RlICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IGNoaWxkTm9kZSkge1xuICAgICAgICAgICAgY2hpbGROb2RlLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBtb3ZlRm9jdXMoZGVsdGEpIHtcbiAgICAgICAgY29uc3QgbnVtQ2hpbGRyZW4gPSB0aGlzLnByb3BzLmNoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBSZWFjdC5DaGlsZHJlbi5jb3VudCh0aGlzLnByb3BzLmNoaWxkcmVuKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDtcblxuICAgICAgICBsZXQgbmV4dEluZGV4ID0gdGhpcy5zdGF0ZS5hY3RpdmVDaGlsZEluZGV4ICsgZGVsdGE7XG5cbiAgICAgICAgaWYgKG5leHRJbmRleCA+PSBudW1DaGlsZHJlbikge1xuICAgICAgICAgICAgbmV4dEluZGV4ID0gMDsgLy8gbG9vcFxuICAgICAgICB9IGVsc2UgaWYgKG5leHRJbmRleCA8IDApIHtcbiAgICAgICAgICAgIG5leHRJbmRleCA9IG51bUNoaWxkcmVuIC0gMTsgLy8gcmV2ZXJzZSBsb29wXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldFN0YXRlKHthY3RpdmVDaGlsZEluZGV4OiBuZXh0SW5kZXh9KTtcbiAgICB9XG5cbiAgICBoYW5kbGVLZXlEb3duID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMubW9kZSA9PT0gQXJyb3dLZXlOYXZpZ2F0aW9uLm1vZGUuVkVSVElDQUxcbiAgICAgICAgICAgICAgICB8fCB0aGlzLnByb3BzLm1vZGUgPT09IEFycm93S2V5TmF2aWdhdGlvbi5tb2RlLkJPVEgpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMubW92ZUZvY3VzKC0xKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLm1vZGUgPT09IEFycm93S2V5TmF2aWdhdGlvbi5tb2RlLkhPUklaT05UQUxcbiAgICAgICAgICAgICAgICB8fCB0aGlzLnByb3BzLm1vZGUgPT09IEFycm93S2V5TmF2aWdhdGlvbi5tb2RlLkJPVEgpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMubW92ZUZvY3VzKC0xKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLm1vZGUgPT09IEFycm93S2V5TmF2aWdhdGlvbi5tb2RlLlZFUlRJQ0FMXG4gICAgICAgICAgICAgICAgfHwgdGhpcy5wcm9wcy5tb2RlID09PSBBcnJvd0tleU5hdmlnYXRpb24ubW9kZS5CT1RIKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1vdmVGb2N1cygxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9wcy5tb2RlID09PSBBcnJvd0tleU5hdmlnYXRpb24ubW9kZS5IT1JJWk9OVEFMXG4gICAgICAgICAgICAgICAgfHwgdGhpcy5wcm9wcy5tb2RlID09PSBBcnJvd0tleU5hdmlnYXRpb24ubW9kZS5CT1RIKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1vdmVGb2N1cygxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbktleURvd24pIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25LZXlEb3duKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZUZvY3VzID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudC50YXJnZXQuaGFzQXR0cmlidXRlKCdkYXRhLWZvY3VzLWluZGV4JykpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoZXZlbnQudGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1mb2N1cy1pbmRleCcpLCAxMCk7XG4gICAgICAgICAgICBjb25zdCBjaGlsZCA9IFJlYWN0LkNoaWxkcmVuLnRvQXJyYXkodGhpcy5wcm9wcy5jaGlsZHJlbilbaW5kZXhdO1xuXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHthY3RpdmVDaGlsZEluZGV4OiBpbmRleH0pO1xuXG4gICAgICAgICAgICBpZiAoY2hpbGQucHJvcHMub25Gb2N1cykge1xuICAgICAgICAgICAgICAgIGNoaWxkLnByb3BzLm9uRm9jdXMoZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2hpbGRyZW4oKSB7XG4gICAgICAgIHJldHVybiBSZWFjdC5DaGlsZHJlbi5tYXAodGhpcy5wcm9wcy5jaGlsZHJlbiwgKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudChjaGlsZCwge1xuICAgICAgICAgICAgICAgICdkYXRhLWZvY3VzLWluZGV4JzogaW5kZXgsXG4gICAgICAgICAgICAgICAgJ2RhdGEtc2tpcCc6IHBhcnNlSW50KGNoaWxkLnByb3BzLnRhYkluZGV4LCAxMCkgPT09IC0xIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBrZXk6IGNoaWxkLmtleSB8fCBpbmRleCxcbiAgICAgICAgICAgICAgICB0YWJJbmRleDogdGhpcy5zdGF0ZS5hY3RpdmVDaGlsZEluZGV4ID09PSBpbmRleCA/IDAgOiAtMSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8dGhpcy5wcm9wcy5jb21wb25lbnRcbiAgICAgICAgICAgICAgICB7Li4ub21pdCh0aGlzLnByb3BzLCBBcnJvd0tleU5hdmlnYXRpb24uaW50ZXJuYWxLZXlzKX1cbiAgICAgICAgICAgICAgICByZWY9J3dyYXBwZXInXG4gICAgICAgICAgICAgICAgb25Gb2N1cz17dGhpcy5oYW5kbGVGb2N1c31cbiAgICAgICAgICAgICAgICBvbktleURvd249e3RoaXMuaGFuZGxlS2V5RG93bn0+XG4gICAgICAgICAgICAgICAge3RoaXMuY2hpbGRyZW4oKX1cbiAgICAgICAgICAgIDwvdGhpcy5wcm9wcy5jb21wb25lbnQ+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvYm91bmRsZXNzLWFycm93LWtleS1uYXZpZ2F0aW9uL2luZGV4LmpzIl0sInNvdXJjZVJvb3QiOiIifQ== | ||
module.exports=function(e){function t(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,o){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:o})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=4)}([function(e,t){e.exports=require("boundless-utils-omit-keys")},function(e,t){e.exports=require("boundless-utils-uuid")},function(e,t){e.exports=require("react")},function(e,t){e.exports=require("react-dom")},function(e,t,n){"use strict";function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=n(2),c=n.n(a),u=n(3),p=(n.n(u),n(0)),d=n.n(p),l=n(1),f=n.n(l),h=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},m=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,n,o){return n&&e(t.prototype,n),o&&e(t,o),t}}(),v="data-focus-index",y="data-focus-skip",O=function(e){function t(){var e,o,s,c;r(this,t);for(var p=arguments.length,d=Array(p),l=0;l<p;l++)d[l]=arguments[l];return o=s=i(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(d))),s.state={activeChildIndex:s.props.defaultActiveChildIndex},s.handleKeyDown=function(e){switch(e.key){case"ArrowUp":s.props.mode!==t.mode.VERTICAL&&s.props.mode!==t.mode.BOTH||(e.preventDefault(),s.moveFocus(-1));break;case"ArrowLeft":s.props.mode!==t.mode.HORIZONTAL&&s.props.mode!==t.mode.BOTH||(e.preventDefault(),s.moveFocus(-1));break;case"ArrowDown":s.props.mode!==t.mode.VERTICAL&&s.props.mode!==t.mode.BOTH||(e.preventDefault(),s.moveFocus(1));break;case"ArrowRight":s.props.mode!==t.mode.HORIZONTAL&&s.props.mode!==t.mode.BOTH||(e.preventDefault(),s.moveFocus(1))}s.props.onKeyDown&&s.props.onKeyDown(e)},s.handleFocus=function(e){if(e.target.hasAttribute(v)){var t=parseInt(e.target.getAttribute(v),10),n=a.Children.toArray(s.props.children)[t];s.setState({activeChildIndex:t}),n.props.onFocus&&n.props.onFocus(e)}},s.persistWrapperElementReference=function(e){s.$wrapper=e instanceof HTMLElement?e:n.i(u.findDOMNode)(e)},c=o,i(s,c)}return s(t,e),m(t,[{key:"componentDidUpdate",value:function(e,t){this.state.activeChildIndex!==t.activeChildIndex&&this.setFocus(this.state.activeChildIndex)}},{key:"componentWillReceiveProps",value:function(e){if(0!==this.state.activeChildIndex){var t=e.children?a.Children.count(e.children):0;0===t?this.setState({activeChildIndex:0}):this.state.activeChildIndex>=t&&this.setState({activeChildIndex:t-1})}}},{key:"setFocus",value:function(e){var t=this.$wrapper.children[e];t&&t.hasAttribute(y)?this.moveFocus(t.compareDocumentPosition(document.activeElement)&Node.DOCUMENT_POSITION_FOLLOWING?-1:1):t&&document.activeElement!==t&&t.focus()}},{key:"moveFocus",value:function(e){var t=this.props.children?a.Children.count(this.props.children):0,n=this.state.activeChildIndex+e;n>=t?n=0:n<0&&(n=t-1),this.setState({activeChildIndex:n})}},{key:"renderChildren",value:function(){var e=this;return a.Children.map(this.props.children,function(t,n){var r;return c.a.cloneElement(t,(r={},o(r,v,n),o(r,y,parseInt(t.props.tabIndex,10)===-1||void 0),o(r,"key",t.key||n),o(r,"tabIndex",e.state.activeChildIndex===n?0:-1),r))})}},{key:"render",value:function(){return c.a.createElement(this.props.component,h({},d()(this.props,t.internalKeys),{ref:this.persistWrapperElementReference,onFocus:this.handleFocus,onKeyDown:this.handleKeyDown}),this.renderChildren())}}]),t}(c.a.PureComponent);O.mode={HORIZONTAL:f()(),VERTICAL:f()(),BOTH:f()()},O.propTypes={"*":a.PropTypes.any,component:a.PropTypes.oneOfType([a.PropTypes.string,a.PropTypes.func]),defaultActiveChildIndex:a.PropTypes.number,mode:a.PropTypes.oneOf([O.mode.BOTH,O.mode.HORIZONTAL,O.mode.VERTICAL])},O.defaultProps={component:"div",defaultActiveChildIndex:0,mode:O.mode.BOTH,onKeyDown:function(){}},O.internalKeys=Object.keys(O.defaultProps),t.default=O}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIGEzZDgwOTAwYmVmMGNkNTQ3OTFmIiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXV0aWxzLXV1aWRcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3QtZG9tXCJ9Iiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy1hcnJvdy1rZXktbmF2aWdhdGlvbi9pbmRleC5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwibW9kdWxlcyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImluc3RhbGxlZE1vZHVsZXMiLCJpIiwibCIsImNhbGwiLCJtIiwiYyIsInZhbHVlIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwiZ2V0IiwibiIsIl9fZXNNb2R1bGUiLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJyZXF1aXJlIiwiX193ZWJwYWNrX2V4cG9ydHNfXyIsIl9kZWZpbmVQcm9wZXJ0eSIsIm9iaiIsImtleSIsIndyaXRhYmxlIiwiX2NsYXNzQ2FsbENoZWNrIiwiaW5zdGFuY2UiLCJDb25zdHJ1Y3RvciIsIlR5cGVFcnJvciIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIiwic2VsZiIsIlJlZmVyZW5jZUVycm9yIiwiX2luaGVyaXRzIiwic3ViQ2xhc3MiLCJzdXBlckNsYXNzIiwiY3JlYXRlIiwiY29uc3RydWN0b3IiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9kb21fXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX3V1aWRfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfdXVpZF9fX2RlZmF1bHQiLCJfZXh0ZW5kcyIsImFzc2lnbiIsInRhcmdldCIsImFyZ3VtZW50cyIsImxlbmd0aCIsInNvdXJjZSIsIl9jcmVhdGVDbGFzcyIsImRlZmluZVByb3BlcnRpZXMiLCJwcm9wcyIsImRlc2NyaXB0b3IiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJEQVRBX0FUVFJJQlVURV9JTkRFWCIsIkRBVEFfQVRUUklCVVRFX1NLSVAiLCJBcnJvd0tleU5hdmlnYXRpb24iLCJfUmVhY3QkUHVyZUNvbXBvbmVudCIsIl9yZWYiLCJfdGVtcCIsIl90aGlzIiwiX3JldCIsInRoaXMiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImdldFByb3RvdHlwZU9mIiwiYXBwbHkiLCJjb25jYXQiLCJzdGF0ZSIsImFjdGl2ZUNoaWxkSW5kZXgiLCJkZWZhdWx0QWN0aXZlQ2hpbGRJbmRleCIsImhhbmRsZUtleURvd24iLCJldmVudCIsIm1vZGUiLCJWRVJUSUNBTCIsIkJPVEgiLCJwcmV2ZW50RGVmYXVsdCIsIm1vdmVGb2N1cyIsIkhPUklaT05UQUwiLCJvbktleURvd24iLCJoYW5kbGVGb2N1cyIsImhhc0F0dHJpYnV0ZSIsImluZGV4IiwicGFyc2VJbnQiLCJnZXRBdHRyaWJ1dGUiLCJjaGlsZCIsInRvQXJyYXkiLCJjaGlsZHJlbiIsInNldFN0YXRlIiwib25Gb2N1cyIsInBlcnNpc3RXcmFwcGVyRWxlbWVudFJlZmVyZW5jZSIsInVua25vd25UeXBlIiwiJHdyYXBwZXIiLCJIVE1MRWxlbWVudCIsInByZXZQcm9wcyIsInByZXZTdGF0ZSIsInNldEZvY3VzIiwibmV4dFByb3BzIiwibnVtQ2hpbGRyZW4iLCJjb3VudCIsImNoaWxkTm9kZSIsImNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIiwiZG9jdW1lbnQiLCJhY3RpdmVFbGVtZW50IiwiTm9kZSIsIkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORyIsImZvY3VzIiwiZGVsdGEiLCJuZXh0SW5kZXgiLCJfdGhpczIiLCJtYXAiLCJfUmVhY3QkY2xvbmVFbGVtZW50IiwiYSIsImNsb25lRWxlbWVudCIsInRhYkluZGV4IiwidW5kZWZpbmVkIiwiY3JlYXRlRWxlbWVudCIsImNvbXBvbmVudCIsImludGVybmFsS2V5cyIsInJlZiIsInJlbmRlckNoaWxkcmVuIiwiUHVyZUNvbXBvbmVudCIsInByb3BUeXBlcyIsIioiLCJhbnkiLCJvbmVPZlR5cGUiLCJzdHJpbmciLCJmdW5jIiwibnVtYmVyIiwib25lT2YiLCJkZWZhdWx0UHJvcHMiLCJrZXlzIl0sIm1hcHBpbmdzIjoiQUFBQUEsT0FBT0MsUUFDRSxTQUFVQyxHQ0duQixRQUFBQyxHQUFBQyxHQUdBLEdBQUFDLEVBQUFELEdBQ0EsTUFBQUMsR0FBQUQsR0FBQUgsT0FHQSxJQUFBRCxHQUFBSyxFQUFBRCxJQUNBRSxFQUFBRixFQUNBRyxHQUFBLEVBQ0FOLFdBVUEsT0FOQUMsR0FBQUUsR0FBQUksS0FBQVIsRUFBQUMsUUFBQUQsSUFBQUMsUUFBQUUsR0FHQUgsRUFBQU8sR0FBQSxFQUdBUCxFQUFBQyxRQXZCQSxHQUFBSSxLQStEQSxPQW5DQUYsR0FBQU0sRUFBQVAsRUFHQUMsRUFB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RTFCLEVBQU1wRSxLQUFPaUUsR0FIZm5FLEVBQUFnRyxFQUFBLFdBSU9GLEVBQUt6QyxNQUFNQyxtQkFBcUJhLEVBQVEsR0FBSSxHQUpuRDZCLFNOcEVra0w5RixJQUFJLFNBQVN0QixNQUFNLFdNa0ZobUwsTUFDSXVDLEdBQUE4RSxFQUFBSSxjQUFBeEQsS0FBTVosTUFBTXFFLFVBQVo3RSxLQUNRSCxJQUFLdUIsS0FBS1osTUFBT00sRUFBbUJnRSxlQUN4Q0MsSUFBSzNELEtBQUs4QiwrQkFDVkQsUUFBUzdCLEtBQUtvQixZQUNkRCxVQUFXbkIsS0FBS1csZ0JBQ2ZYLEtBQUs0RCxzQk54RjA3TGxFLEdNM0ZoNkxwQixFQUFBOEUsRUFBTVMsY0FBakNuRSxHQUNWbUIsTUFDSEssV0FBWXZDLE1BQ1ptQyxTQUFVbkMsTUFDVm9DLEtBQU1wQyxPQUpPZSxFQU9Wb0UsV0FJSEMsSUFBSzFGLEVBQUEsVUFBVTJGLElBS2ZQLFVBQVdwRixFQUFBLFVBQVU0RixXQUNqQjVGLEVBQUEsVUFBVTZGLE9BQ1Y3RixFQUFBLFVBQVU4RixPQU1kekQsd0JBQXlCckMsRUFBQSxVQUFVK0YsT0FhbkN2RCxLQUFNeEMsRUFBQSxVQUFVZ0csT0FDWjNFLEVBQW1CbUIsS0FBS0UsS0FDeEJyQixFQUFtQm1CLEtBQUtLLFdBQ3hCeEIsRUFBbUJtQixLQUFLQyxZQXhDZnBCLEVBNENWNEUsY0FDSGIsVUFBVyxNQUNYL0Msd0JBQXlCLEVBQ3pCRyxLQUFNbkIsRUFBbUJtQixLQUFLRSxLQUM5QkksVUFBVyxjQWhERXpCLEVBbURWZ0UsYUFBZXRILE9BQU9tSSxLQUFLN0UsRUFBbUI0RSxjTndDZzlOcEgsRUFBNkIsUU0zRmpoT3dDIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPVxuLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbi8qKioqKiovIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuLyoqKioqKi8gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuLyoqKioqKi8gXHRcdFx0XHRnZXQ6IGdldHRlclxuLyoqKioqKi8gXHRcdFx0fSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4vKioqKioqLyBcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDQpO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzXCIpO1xuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXV0aWxzLXV1aWRcIik7XG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxuLyoqKi8gfSksXG4vKiAzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0LWRvbVwiKTtcblxuLyoqKi8gfSksXG4vKiA0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KF9fd2VicGFja19leHBvcnRzX18sIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfcmVhY3RfZG9tX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9kb21fX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9kb21fXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfdXVpZF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX3V1aWRfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfdXVpZF9fKTtcbnZhciBfZXh0ZW5kcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0YXJnZXQpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9YXJndW1lbnRzW2ldO2Zvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSxrZXkpKXt0YXJnZXRba2V5XT1zb3VyY2Vba2V5XTt9fX1yZXR1cm4gdGFyZ2V0O307dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoXCJ2YWx1ZVwiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKTt9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcjt9O30oKTtmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLGtleSx2YWx1ZSl7aWYoa2V5IGluIG9iail7T2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaixrZXkse3ZhbHVlOnZhbHVlLGVudW1lcmFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZSx3cml0YWJsZTp0cnVlfSk7fWVsc2V7b2JqW2tleV09dmFsdWU7fXJldHVybiBvYmo7fWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSxDb25zdHJ1Y3Rvcil7aWYoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTt9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsY2FsbCl7aWYoIXNlbGYpe3Rocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTt9cmV0dXJuIGNhbGwmJih0eXBlb2YgY2FsbD09PVwib2JqZWN0XCJ8fHR5cGVvZiBjYWxsPT09XCJmdW5jdGlvblwiKT9jYWxsOnNlbGY7fWZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcyxzdXBlckNsYXNzKXtpZih0eXBlb2Ygc3VwZXJDbGFzcyE9PVwiZnVuY3Rpb25cIiYmc3VwZXJDbGFzcyE9PW51bGwpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiK3R5cGVvZiBzdXBlckNsYXNzKTt9c3ViQ2xhc3MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyYmc3VwZXJDbGFzcy5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpzdWJDbGFzcyxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9fSk7aWYoc3VwZXJDbGFzcylPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLHN1cGVyQ2xhc3MpOnN1YkNsYXNzLl9fcHJvdG9fXz1zdXBlckNsYXNzO312YXIgREFUQV9BVFRSSUJVVEVfSU5ERVg9J2RhdGEtZm9jdXMtaW5kZXgnO3ZhciBEQVRBX0FUVFJJQlVURV9TS0lQPSdkYXRhLWZvY3VzLXNraXAnO3ZhciBBcnJvd0tleU5hdmlnYXRpb249ZnVuY3Rpb24oX1JlYWN0JFB1cmVDb21wb25lbnQpe19pbmhlcml0cyhBcnJvd0tleU5hdmlnYXRpb24sX1JlYWN0JFB1cmVDb21wb25lbnQpO2Z1bmN0aW9uIEFycm93S2V5TmF2aWdhdGlvbigpe3ZhciBfcmVmO3ZhciBfdGVtcCxfdGhpcyxfcmV0O19jbGFzc0NhbGxDaGVjayh0aGlzLEFycm93S2V5TmF2aWdhdGlvbik7Zm9yKHZhciBfbGVuPWFyZ3VtZW50cy5sZW5ndGgsYXJncz1BcnJheShfbGVuKSxfa2V5PTA7X2tleTxfbGVuO19rZXkrKyl7YXJnc1tfa2V5XT1hcmd1bWVudHNbX2tleV07fXJldHVybiBfcmV0PShfdGVtcD0oX3RoaXM9X3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywoX3JlZj1BcnJvd0tleU5hdmlnYXRpb24uX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoQXJyb3dLZXlOYXZpZ2F0aW9uKSkuY2FsbC5hcHBseShfcmVmLFt0aGlzXS5jb25jYXQoYXJncykpKSxfdGhpcyksX3RoaXMuc3RhdGU9e2FjdGl2ZUNoaWxkSW5kZXg6X3RoaXMucHJvcHMuZGVmYXVsdEFjdGl2ZUNoaWxkSW5kZXh9LF90aGlzLmhhbmRsZUtleURvd249ZnVuY3Rpb24oZXZlbnQpe3N3aXRjaChldmVudC5rZXkpe2Nhc2UnQXJyb3dVcCc6aWYoX3RoaXMucHJvcHMubW9kZT09PUFycm93S2V5TmF2aWdhdGlvbi5tb2RlLlZFUlRJQ0FMfHxfdGhpcy5wcm9wcy5tb2RlPT09QXJyb3dLZXlOYXZpZ2F0aW9uLm1vZGUuQk9USCl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtfdGhpcy5tb3ZlRm9jdXMoLTEpO31icmVhaztjYXNlJ0Fycm93TGVmdCc6aWYoX3RoaXMucHJvcHMubW9kZT09PUFycm93S2V5TmF2aWdhdGlvbi5tb2RlLkhPUklaT05UQUx8fF90aGlzLnByb3BzLm1vZGU9PT1BcnJvd0tleU5hdmlnYXRpb24ubW9kZS5CT1RIKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO190aGlzLm1vdmVGb2N1cygtMSk7fWJyZWFrO2Nhc2UnQXJyb3dEb3duJzppZihfdGhpcy5wcm9wcy5tb2RlPT09QXJyb3dLZXlOYXZpZ2F0aW9uLm1vZGUuVkVSVElDQUx8fF90aGlzLnByb3BzLm1vZGU9PT1BcnJvd0tleU5hdmlnYXRpb24ubW9kZS5CT1RIKXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO190aGlzLm1vdmVGb2N1cygxKTt9YnJlYWs7Y2FzZSdBcnJvd1JpZ2h0JzppZihfdGhpcy5wcm9wcy5tb2RlPT09QXJyb3dLZXlOYXZpZ2F0aW9uLm1vZGUuSE9SSVpPTlRBTHx8X3RoaXMucHJvcHMubW9kZT09PUFycm93S2V5TmF2aWdhdGlvbi5tb2RlLkJPVEgpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7X3RoaXMubW92ZUZvY3VzKDEpO31icmVhazt9aWYoX3RoaXMucHJvcHMub25LZXlEb3duKXtfdGhpcy5wcm9wcy5vbktleURvd24oZXZlbnQpO319LF90aGlzLmhhbmRsZUZvY3VzPWZ1bmN0aW9uKGV2ZW50KXtpZihldmVudC50YXJnZXQuaGFzQXR0cmlidXRlKERBVEFfQVRUUklCVVRFX0lOREVYKSl7dmFyIGluZGV4PXBhcnNlSW50KGV2ZW50LnRhcmdldC5nZXRBdHRyaWJ1dGUoREFUQV9BVFRSSUJVVEVfSU5ERVgpLDEwKTt2YXIgY2hpbGQ9X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJDaGlsZHJlblwiXS50b0FycmF5KF90aGlzLnByb3BzLmNoaWxkcmVuKVtpbmRleF07X3RoaXMuc2V0U3RhdGUoe2FjdGl2ZUNoaWxkSW5kZXg6aW5kZXh9KTtpZihjaGlsZC5wcm9wcy5vbkZvY3VzKXtjaGlsZC5wcm9wcy5vbkZvY3VzKGV2ZW50KTt9fX0sX3RoaXMucGVyc2lzdFdyYXBwZXJFbGVtZW50UmVmZXJlbmNlPWZ1bmN0aW9uKHVua25vd25UeXBlKXtfdGhpcy4kd3JhcHBlcj11bmtub3duVHlwZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50P3Vua25vd25UeXBlOl9fd2VicGFja19yZXF1aXJlX18uaShfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfcmVhY3RfZG9tX19bXCJmaW5kRE9NTm9kZVwiXSkodW5rbm93blR5cGUpO30sX3RlbXApLF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLF9yZXQpO31fY3JlYXRlQ2xhc3MoQXJyb3dLZXlOYXZpZ2F0aW9uLFt7a2V5Oidjb21wb25lbnREaWRVcGRhdGUnLHZhbHVlOmZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMscHJldlN0YXRlKXtpZih0aGlzLnN0YXRlLmFjdGl2ZUNoaWxkSW5kZXghPT1wcmV2U3RhdGUuYWN0aXZlQ2hpbGRJbmRleCl7dGhpcy5zZXRGb2N1cyh0aGlzLnN0YXRlLmFjdGl2ZUNoaWxkSW5kZXgpO319fSx7a2V5Oidjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJyx2YWx1ZTpmdW5jdGlvbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcyl7aWYodGhpcy5zdGF0ZS5hY3RpdmVDaGlsZEluZGV4IT09MCl7dmFyIG51bUNoaWxkcmVuPW5leHRQcm9wcy5jaGlsZHJlbj9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIkNoaWxkcmVuXCJdLmNvdW50KG5leHRQcm9wcy5jaGlsZHJlbik6MDtpZihudW1DaGlsZHJlbj09PTApe3RoaXMuc2V0U3RhdGUoe2FjdGl2ZUNoaWxkSW5kZXg6MH0pO31lbHNlIGlmKHRoaXMuc3RhdGUuYWN0aXZlQ2hpbGRJbmRleD49bnVtQ2hpbGRyZW4pe3RoaXMuc2V0U3RhdGUoe2FjdGl2ZUNoaWxkSW5kZXg6bnVtQ2hpbGRyZW4tMX0pO319fX0se2tleTonc2V0Rm9jdXMnLHZhbHVlOmZ1bmN0aW9uIHNldEZvY3VzKGluZGV4KXt2YXIgY2hpbGROb2RlPXRoaXMuJHdyYXBwZXIuY2hpbGRyZW5baW5kZXhdO2lmKGNoaWxkTm9kZSYmY2hpbGROb2RlLmhhc0F0dHJpYnV0ZShEQVRBX0FUVFJJQlVURV9TS0lQKSl7dGhpcy5tb3ZlRm9jdXMoY2hpbGROb2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpJk5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HPy0xOjEpO31lbHNlIGlmKGNoaWxkTm9kZSYmZG9jdW1lbnQuYWN0aXZlRWxlbWVudCE9PWNoaWxkTm9kZSl7Y2hpbGROb2RlLmZvY3VzKCk7fX19LHtrZXk6J21vdmVGb2N1cycsdmFsdWU6ZnVuY3Rpb24gbW92ZUZvY3VzKGRlbHRhKXt2YXIgbnVtQ2hpbGRyZW49dGhpcy5wcm9wcy5jaGlsZHJlbj9fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIkNoaWxkcmVuXCJdLmNvdW50KHRoaXMucHJvcHMuY2hpbGRyZW4pOjA7dmFyIG5leHRJbmRleD10aGlzLnN0YXRlLmFjdGl2ZUNoaWxkSW5kZXgrZGVsdGE7aWYobmV4dEluZGV4Pj1udW1DaGlsZHJlbil7bmV4dEluZGV4PTA7fWVsc2UgaWYobmV4dEluZGV4PDApe25leHRJbmRleD1udW1DaGlsZHJlbi0xO310aGlzLnNldFN0YXRlKHthY3RpdmVDaGlsZEluZGV4Om5leHRJbmRleH0pO319LHtrZXk6J3JlbmRlckNoaWxkcmVuJyx2YWx1ZTpmdW5jdGlvbiByZW5kZXJDaGlsZHJlbigpe3ZhciBfdGhpczI9dGhpcztyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJDaGlsZHJlblwiXS5tYXAodGhpcy5wcm9wcy5jaGlsZHJlbixmdW5jdGlvbihjaGlsZCxpbmRleCl7dmFyIF9SZWFjdCRjbG9uZUVsZW1lbnQ7cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jbG9uZUVsZW1lbnQoY2hpbGQsKF9SZWFjdCRjbG9uZUVsZW1lbnQ9e30sX2RlZmluZVByb3BlcnR5KF9SZWFjdCRjbG9uZUVsZW1lbnQsREFUQV9BVFRSSUJVVEVfSU5ERVgsaW5kZXgpLF9kZWZpbmVQcm9wZXJ0eShfUmVhY3QkY2xvbmVFbGVtZW50LERBVEFfQVRUUklCVVRFX1NLSVAscGFyc2VJbnQoY2hpbGQucHJvcHMudGFiSW5kZXgsMTApPT09LTF8fHVuZGVmaW5lZCksX2RlZmluZVByb3BlcnR5KF9SZWFjdCRjbG9uZUVsZW1lbnQsJ2tleScsY2hpbGQua2V5fHxpbmRleCksX2RlZmluZVByb3BlcnR5KF9SZWFjdCRjbG9uZUVsZW1lbnQsJ3RhYkluZGV4JyxfdGhpczIuc3RhdGUuYWN0aXZlQ2hpbGRJbmRleD09PWluZGV4PzA6LTEpLF9SZWFjdCRjbG9uZUVsZW1lbnQpKTt9KTt9fSx7a2V5OidyZW5kZXInLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudCh0aGlzLnByb3BzLmNvbXBvbmVudCxfZXh0ZW5kcyh7fSxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fX2RlZmF1bHQoKSh0aGlzLnByb3BzLEFycm93S2V5TmF2aWdhdGlvbi5pbnRlcm5hbEtleXMpLHtyZWY6dGhpcy5wZXJzaXN0V3JhcHBlckVsZW1lbnRSZWZlcmVuY2Usb25Gb2N1czp0aGlzLmhhbmRsZUZvY3VzLG9uS2V5RG93bjp0aGlzLmhhbmRsZUtleURvd259KSx0aGlzLnJlbmRlckNoaWxkcmVuKCkpO319XSk7cmV0dXJuIEFycm93S2V5TmF2aWdhdGlvbjt9KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5QdXJlQ29tcG9uZW50KTtBcnJvd0tleU5hdmlnYXRpb24ubW9kZT17SE9SSVpPTlRBTDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX3V1aWRfX19kZWZhdWx0KCkoKSxWRVJUSUNBTDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX3V1aWRfX19kZWZhdWx0KCkoKSxCT1RIOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfdXVpZF9fX2RlZmF1bHQoKSgpfTtBcnJvd0tleU5hdmlnYXRpb24ucHJvcFR5cGVzPXsnKic6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYW55LGNvbXBvbmVudDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5vbmVPZlR5cGUoW19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLnN0cmluZyxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jXSksZGVmYXVsdEFjdGl2ZUNoaWxkSW5kZXg6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ubnVtYmVyLG1vZGU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub25lT2YoW0Fycm93S2V5TmF2aWdhdGlvbi5tb2RlLkJPVEgsQXJyb3dLZXlOYXZpZ2F0aW9uLm1vZGUuSE9SSVpPTlRBTCxBcnJvd0tleU5hdmlnYXRpb24ubW9kZS5WRVJUSUNBTF0pfTtBcnJvd0tleU5hdmlnYXRpb24uZGVmYXVsdFByb3BzPXtjb21wb25lbnQ6J2RpdicsZGVmYXVsdEFjdGl2ZUNoaWxkSW5kZXg6MCxtb2RlOkFycm93S2V5TmF2aWdhdGlvbi5tb2RlLkJPVEgsb25LZXlEb3duOmZ1bmN0aW9uIG9uS2V5RG93bigpe319O0Fycm93S2V5TmF2aWdhdGlvbi5pbnRlcm5hbEtleXM9T2JqZWN0LmtleXMoQXJyb3dLZXlOYXZpZ2F0aW9uLmRlZmF1bHRQcm9wcyk7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IEFycm93S2V5TmF2aWdhdGlvbjtcblxuLyoqKi8gfSlcbi8qKioqKiovIF0pO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBpbmRleC5qcyIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDQpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIGEzZDgwOTAwYmVmMGNkNTQ3OTFmIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXV0aWxzLW9taXQta2V5c1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIn1cbi8vIG1vZHVsZSBpZCA9IDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXV0aWxzLXV1aWRcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtdXRpbHMtdXVpZFwifVxuLy8gbW9kdWxlIGlkID0gMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0XCJ9XG4vLyBtb2R1bGUgaWQgPSAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0LWRvbVwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0LWRvbVwifVxuLy8gbW9kdWxlIGlkID0gM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgUmVhY3QsIHtDaGlsZHJlbiwgUHJvcFR5cGVzfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge2ZpbmRET01Ob2RlfSBmcm9tICdyZWFjdC1kb20nO1xuXG5pbXBvcnQgb21pdCBmcm9tICdib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzJztcbmltcG9ydCB1dWlkIGZyb20gJ2JvdW5kbGVzcy11dGlscy11dWlkJztcblxuY29uc3QgREFUQV9BVFRSSUJVVEVfSU5ERVggPSAnZGF0YS1mb2N1cy1pbmRleCc7XG5jb25zdCBEQVRBX0FUVFJJQlVURV9TS0lQID0gJ2RhdGEtZm9jdXMtc2tpcCc7XG5cbi8qKlxuX19BIGhpZ2hlci1vcmRlciBjb21wb25lbnQgZm9yIGFycm93IGtleSBuYXZpZ2F0aW9uIG9uIGEgZ3JvdXBpbmcgb2YgY2hpbGRyZW4uX19cblxuQXJyb3dLZXlOYXZpZ2F0aW9uIGlzIGRlc2lnbmVkIG5vdCB0byBjYXJlIGFib3V0IHRoZSBjb21wb25lbnQgdHlwZXMgaXQgaXMgd3JhcHBpbmcuIER1ZSB0byB0aGlzLCB5b3UgY2FuIHBhc3Mgd2hhdGV2ZXIgSFRNTCB0YWcgeW91IGxpa2UgaW50byBgcHJvcHMuY29tcG9uZW50YCBvciBldmVuIGEgUmVhY3QgY29tcG9uZW50IHlvdSd2ZSBtYWRlIGVsc2V3aGVyZS4gQWRkaXRpb25hbCBwcm9wcyBwYXNzZWQgdG8gYDxBcnJvd0tleU5hdmlnYXRpb24gLi4uPmAgd2lsbCBiZSBmb3J3YXJkZWQgb24gdG8gdGhlIGNvbXBvbmVudCBvciBIVE1MIHRhZyBuYW1lIHlvdSd2ZSBzdXBwbGllZC5cblxuVGhlIGNoaWxkcmVuLCBzaW1pbGFybHksIGNhbiBiZSBhbnkgdHlwZSBvZiBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFycm93S2V5TmF2aWdhdGlvbiBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xuICAgIHN0YXRpYyBtb2RlID0ge1xuICAgICAgICBIT1JJWk9OVEFMOiB1dWlkKCksXG4gICAgICAgIFZFUlRJQ0FMOiB1dWlkKCksXG4gICAgICAgIEJPVEg6IHV1aWQoKSxcbiAgICB9XG5cbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgICAvKipcbiAgICAgICAgICogYW55IFtSZWFjdC1zdXBwb3J0ZWQgYXR0cmlidXRlXShodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RhZ3MtYW5kLWF0dHJpYnV0ZXMuaHRtbCNodG1sLWF0dHJpYnV0ZXMpXG4gICAgICAgICAqL1xuICAgICAgICAnKic6IFByb3BUeXBlcy5hbnksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAgICBBbnkgdmFsaWQgSFRNTCB0YWcgbmFtZSBvciBhIFJlYWN0IGNvbXBvbmVudCBmYWN0b3J5LCBhbnl0aGluZyB0aGF0IGNhbiBiZSBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIGBSZWFjdC5jcmVhdGVFbGVtZW50YFxuICAgICAgICAqL1xuICAgICAgICBjb21wb25lbnQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgICAgICAgICAgUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgICAgIFByb3BUeXBlcy5mdW5jLFxuICAgICAgICBdKSxcblxuICAgICAgICAvKipcbiAgICAgICAgICAgIEFsbG93cyBmb3IgYSBwYXJ0aWN1bGFyIGNoaWxkIHRvIGJlIGluaXRpYWxseSByZWFjaGFibGUgdmlhIHRhYmJpbmc7IG9ubHkgYXBwbGllZCBkdXJpbmcgZmlyc3QgcmVuZGVyXG4gICAgICAgICovXG4gICAgICAgIGRlZmF1bHRBY3RpdmVDaGlsZEluZGV4OiBQcm9wVHlwZXMubnVtYmVyLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBjb250cm9scyB3aGljaCBhcnJvdyBrZXkgZXZlbnRzIGFyZSBjYXB0dXJlZCB0byBtb3ZlIGFjdGl2ZSBmb2N1cyB3aXRoaW4gdGhlIGxpc3Q6XG4gICAgICAgICAqXG4gICAgICAgICAqIE1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEtleXNcbiAgICAgICAgICogLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgLS0tLVxuICAgICAgICAgKiBgQXJyb3dLZXlOYXZpZ2F0aW9uLm1vZGUuQk9USGAgICAgICAgfCDirIXvuI8g4p6h77iPIOKshu+4jyDirIfvuI9cbiAgICAgICAgICogYEFycm93S2V5TmF2aWdhdGlvbi5tb2RlLkhPUklaT05UQUxgIHwg4qyF77iPIOKeoe+4j1xuICAgICAgICAgKiBgQXJyb3dLZXlOYXZpZ2F0aW9uLm1vZGUuVkVSVElDQUxgICAgfCDirIbvuI8g4qyH77iPXG4gICAgICAgICAqXG4gICAgICAgICAqIF9Ob3RlOiBmb2N1cyBsb29wcyB3aGVuIGFycm93aW5nIHBhc3Qgb25lIG9mIHRoZSBib3VuZGFyaWVzOyB0YWJiaW5nIG1vdmVzIHRoZSB1c2VyIGF3YXkgZnJvbSB0aGUgbGlzdC5fXG4gICAgICAgICovXG4gICAgICAgIG1vZGU6IFByb3BUeXBlcy5vbmVPZihbXG4gICAgICAgICAgICBBcnJvd0tleU5hdmlnYXRpb24ubW9kZS5CT1RILFxuICAgICAgICAgICAgQXJyb3dLZXlOYXZpZ2F0aW9uLm1vZGUuSE9SSVpPTlRBTCxcbiAgICAgICAgICAgIEFycm93S2V5TmF2aWdhdGlvbi5tb2RlLlZFUlRJQ0FMLFxuICAgICAgICBdKSxcbiAgICB9XG5cbiAgICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgICBjb21wb25lbnQ6ICdkaXYnLFxuICAgICAgICBkZWZhdWx0QWN0aXZlQ2hpbGRJbmRleDogMCxcbiAgICAgICAgbW9kZTogQXJyb3dLZXlOYXZpZ2F0aW9uLm1vZGUuQk9USCxcbiAgICAgICAgb25LZXlEb3duOiAoKSA9PiB7fSxcbiAgICB9XG5cbiAgICBzdGF0aWMgaW50ZXJuYWxLZXlzID0gT2JqZWN0LmtleXMoQXJyb3dLZXlOYXZpZ2F0aW9uLmRlZmF1bHRQcm9wcylcblxuICAgIHN0YXRlID0ge1xuICAgICAgICBhY3RpdmVDaGlsZEluZGV4OiB0aGlzLnByb3BzLmRlZmF1bHRBY3RpdmVDaGlsZEluZGV4LFxuICAgIH1cblxuICAgIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5hY3RpdmVDaGlsZEluZGV4ICE9PSBwcmV2U3RhdGUuYWN0aXZlQ2hpbGRJbmRleCkge1xuICAgICAgICAgICAgdGhpcy5zZXRGb2N1cyh0aGlzLnN0YXRlLmFjdGl2ZUNoaWxkSW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuYWN0aXZlQ2hpbGRJbmRleCAhPT0gMCkge1xuICAgICAgICAgICAgY29uc3QgbnVtQ2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW4gPyBDaGlsZHJlbi5jb3VudChuZXh0UHJvcHMuY2hpbGRyZW4pIDogMDtcblxuICAgICAgICAgICAgaWYgKG51bUNoaWxkcmVuID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7YWN0aXZlQ2hpbGRJbmRleDogMH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlLmFjdGl2ZUNoaWxkSW5kZXggPj0gbnVtQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHthY3RpdmVDaGlsZEluZGV4OiBudW1DaGlsZHJlbiAtIDF9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldEZvY3VzKGluZGV4KSB7XG4gICAgICAgIGNvbnN0IGNoaWxkTm9kZSA9IHRoaXMuJHdyYXBwZXIuY2hpbGRyZW5baW5kZXhdO1xuXG4gICAgICAgIGlmIChjaGlsZE5vZGUgJiYgY2hpbGROb2RlLmhhc0F0dHJpYnV0ZShEQVRBX0FUVFJJQlVURV9TS0lQKSkge1xuICAgICAgICAgICAgdGhpcy5tb3ZlRm9jdXMoXG4gICAgICAgICAgICAgICAgY2hpbGROb2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkcgPyAtMSA6IDFcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoY2hpbGROb2RlICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IGNoaWxkTm9kZSkge1xuICAgICAgICAgICAgY2hpbGROb2RlLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBtb3ZlRm9jdXMoZGVsdGEpIHtcbiAgICAgICAgY29uc3QgbnVtQ2hpbGRyZW4gPSB0aGlzLnByb3BzLmNoaWxkcmVuID8gQ2hpbGRyZW4uY291bnQodGhpcy5wcm9wcy5jaGlsZHJlbikgOiAwO1xuICAgICAgICBsZXQgbmV4dEluZGV4ID0gdGhpcy5zdGF0ZS5hY3RpdmVDaGlsZEluZGV4ICsgZGVsdGE7XG5cbiAgICAgICAgaWYgKG5leHRJbmRleCA+PSBudW1DaGlsZHJlbikge1xuICAgICAgICAgICAgbmV4dEluZGV4ID0gMDsgLy8gbG9vcFxuICAgICAgICB9IGVsc2UgaWYgKG5leHRJbmRleCA8IDApIHtcbiAgICAgICAgICAgIG5leHRJbmRleCA9IG51bUNoaWxkcmVuIC0gMTsgLy8gcmV2ZXJzZSBsb29wXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldFN0YXRlKHthY3RpdmVDaGlsZEluZGV4OiBuZXh0SW5kZXh9KTtcbiAgICB9XG5cbiAgICBoYW5kbGVLZXlEb3duID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMubW9kZSA9PT0gQXJyb3dLZXlOYXZpZ2F0aW9uLm1vZGUuVkVSVElDQUxcbiAgICAgICAgICAgICAgICB8fCB0aGlzLnByb3BzLm1vZGUgPT09IEFycm93S2V5TmF2aWdhdGlvbi5tb2RlLkJPVEgpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMubW92ZUZvY3VzKC0xKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLm1vZGUgPT09IEFycm93S2V5TmF2aWdhdGlvbi5tb2RlLkhPUklaT05UQUxcbiAgICAgICAgICAgICAgICB8fCB0aGlzLnByb3BzLm1vZGUgPT09IEFycm93S2V5TmF2aWdhdGlvbi5tb2RlLkJPVEgpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMubW92ZUZvY3VzKC0xKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLm1vZGUgPT09IEFycm93S2V5TmF2aWdhdGlvbi5tb2RlLlZFUlRJQ0FMXG4gICAgICAgICAgICAgICAgfHwgdGhpcy5wcm9wcy5tb2RlID09PSBBcnJvd0tleU5hdmlnYXRpb24ubW9kZS5CT1RIKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1vdmVGb2N1cygxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9wcy5tb2RlID09PSBBcnJvd0tleU5hdmlnYXRpb24ubW9kZS5IT1JJWk9OVEFMXG4gICAgICAgICAgICAgICAgfHwgdGhpcy5wcm9wcy5tb2RlID09PSBBcnJvd0tleU5hdmlnYXRpb24ubW9kZS5CT1RIKSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1vdmVGb2N1cygxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbktleURvd24pIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25LZXlEb3duKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZUZvY3VzID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudC50YXJnZXQuaGFzQXR0cmlidXRlKERBVEFfQVRUUklCVVRFX0lOREVYKSkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJzZUludChldmVudC50YXJnZXQuZ2V0QXR0cmlidXRlKERBVEFfQVRUUklCVVRFX0lOREVYKSwgMTApO1xuICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBDaGlsZHJlbi50b0FycmF5KHRoaXMucHJvcHMuY2hpbGRyZW4pW2luZGV4XTtcblxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7YWN0aXZlQ2hpbGRJbmRleDogaW5kZXh9KTtcblxuICAgICAgICAgICAgaWYgKGNoaWxkLnByb3BzLm9uRm9jdXMpIHtcbiAgICAgICAgICAgICAgICBjaGlsZC5wcm9wcy5vbkZvY3VzKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlckNoaWxkcmVuKCkge1xuICAgICAgICByZXR1cm4gQ2hpbGRyZW4ubWFwKHRoaXMucHJvcHMuY2hpbGRyZW4sIChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGQsIHtcbiAgICAgICAgICAgICAgICBbREFUQV9BVFRSSUJVVEVfSU5ERVhdOiBpbmRleCxcbiAgICAgICAgICAgICAgICBbREFUQV9BVFRSSUJVVEVfU0tJUF06IHBhcnNlSW50KGNoaWxkLnByb3BzLnRhYkluZGV4LCAxMCkgPT09IC0xIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBrZXk6IGNoaWxkLmtleSB8fCBpbmRleCxcbiAgICAgICAgICAgICAgICB0YWJJbmRleDogdGhpcy5zdGF0ZS5hY3RpdmVDaGlsZEluZGV4ID09PSBpbmRleCA/IDAgOiAtMSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwZXJzaXN0V3JhcHBlckVsZW1lbnRSZWZlcmVuY2UgPSAodW5rbm93blR5cGUpID0+IHtcbiAgICAgICAgdGhpcy4kd3JhcHBlciA9IHVua25vd25UeXBlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyB1bmtub3duVHlwZSA6IGZpbmRET01Ob2RlKHVua25vd25UeXBlKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8dGhpcy5wcm9wcy5jb21wb25lbnRcbiAgICAgICAgICAgICAgICB7Li4ub21pdCh0aGlzLnByb3BzLCBBcnJvd0tleU5hdmlnYXRpb24uaW50ZXJuYWxLZXlzKX1cbiAgICAgICAgICAgICAgICByZWY9e3RoaXMucGVyc2lzdFdyYXBwZXJFbGVtZW50UmVmZXJlbmNlfVxuICAgICAgICAgICAgICAgIG9uRm9jdXM9e3RoaXMuaGFuZGxlRm9jdXN9XG4gICAgICAgICAgICAgICAgb25LZXlEb3duPXt0aGlzLmhhbmRsZUtleURvd259PlxuICAgICAgICAgICAgICAgIHt0aGlzLnJlbmRlckNoaWxkcmVuKCl9XG4gICAgICAgICAgICA8L3RoaXMucHJvcHMuY29tcG9uZW50PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL2JvdW5kbGVzcy1hcnJvdy1rZXktbmF2aWdhdGlvbi9pbmRleC5qcyJdLCJzb3VyY2VSb290IjoiIn0= |
@@ -1,2 +0,2 @@ | ||
import React, {PropTypes} from 'react'; | ||
import React, {Children, PropTypes} from 'react'; | ||
import {findDOMNode} from 'react-dom'; | ||
@@ -7,9 +7,9 @@ | ||
const DATA_ATTRIBUTE_INDEX = 'data-focus-index'; | ||
const DATA_ATTRIBUTE_SKIP = 'data-focus-skip'; | ||
/** | ||
# ArrowKeyNavigation | ||
__A higher-order component for arrow key navigation on a grouping of children.__ | ||
ArrowKeyNavigation is designed not to care about the component types it is wrapping. Due to this, you can pass | ||
whatever HTML tag you like into `props.component` or even a React component you've made elsewhere. Additional | ||
props passed to `<ArrowKeyNavigation ...>` will be forwarded on to the component or HTML tag name you've supplied. | ||
ArrowKeyNavigation is designed not to care about the component types it is wrapping. Due to this, you can pass whatever HTML tag you like into `props.component` or even a React component you've made elsewhere. Additional props passed to `<ArrowKeyNavigation ...>` will be forwarded on to the component or HTML tag name you've supplied. | ||
@@ -27,2 +27,7 @@ The children, similarly, can be any type of component. | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
'*': PropTypes.any, | ||
/** | ||
Any valid HTML tag name or a React component factory, anything that can be passed as the first argument to `React.createElement` | ||
@@ -36,3 +41,3 @@ */ | ||
/** | ||
Allows for a particular child to be initially reachable via tabbing | ||
Allows for a particular child to be initially reachable via tabbing; only applied during first render | ||
*/ | ||
@@ -80,5 +85,3 @@ defaultActiveChildIndex: PropTypes.number, | ||
if (this.state.activeChildIndex !== 0) { | ||
const numChildren = nextProps.children | ||
? React.Children.count(nextProps.children) | ||
: 0; | ||
const numChildren = nextProps.children ? Children.count(nextProps.children) : 0; | ||
@@ -94,9 +97,5 @@ if (numChildren === 0) { | ||
setFocus(index) { | ||
const childNode = ( | ||
this.refs.wrapper instanceof HTMLElement | ||
? this.refs.wrapper | ||
: findDOMNode(this.refs.wrapper) | ||
).children[index]; | ||
const childNode = this.$wrapper.children[index]; | ||
if (childNode && childNode.hasAttribute('data-skip')) { | ||
if (childNode && childNode.hasAttribute(DATA_ATTRIBUTE_SKIP)) { | ||
this.moveFocus( | ||
@@ -111,6 +110,3 @@ childNode.compareDocumentPosition(document.activeElement) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1 | ||
moveFocus(delta) { | ||
const numChildren = this.props.children | ||
? React.Children.count(this.props.children) | ||
: 0; | ||
const numChildren = this.props.children ? Children.count(this.props.children) : 0; | ||
let nextIndex = this.state.activeChildIndex + delta; | ||
@@ -172,5 +168,5 @@ | ||
handleFocus = (event) => { | ||
if (event.target.hasAttribute('data-focus-index')) { | ||
const index = parseInt(event.target.getAttribute('data-focus-index'), 10); | ||
const child = React.Children.toArray(this.props.children)[index]; | ||
if (event.target.hasAttribute(DATA_ATTRIBUTE_INDEX)) { | ||
const index = parseInt(event.target.getAttribute(DATA_ATTRIBUTE_INDEX), 10); | ||
const child = Children.toArray(this.props.children)[index]; | ||
@@ -185,7 +181,7 @@ this.setState({activeChildIndex: index}); | ||
children() { | ||
return React.Children.map(this.props.children, (child, index) => { | ||
renderChildren() { | ||
return Children.map(this.props.children, (child, index) => { | ||
return React.cloneElement(child, { | ||
'data-focus-index': index, | ||
'data-skip': parseInt(child.props.tabIndex, 10) === -1 || undefined, | ||
[DATA_ATTRIBUTE_INDEX]: index, | ||
[DATA_ATTRIBUTE_SKIP]: parseInt(child.props.tabIndex, 10) === -1 || undefined, | ||
key: child.key || index, | ||
@@ -197,2 +193,6 @@ tabIndex: this.state.activeChildIndex === index ? 0 : -1, | ||
persistWrapperElementReference = (unknownType) => { | ||
this.$wrapper = unknownType instanceof HTMLElement ? unknownType : findDOMNode(unknownType); | ||
} | ||
render() { | ||
@@ -202,6 +202,6 @@ return ( | ||
{...omit(this.props, ArrowKeyNavigation.internalKeys)} | ||
ref='wrapper' | ||
ref={this.persistWrapperElementReference} | ||
onFocus={this.handleFocus} | ||
onKeyDown={this.handleKeyDown}> | ||
{this.children()} | ||
{this.renderChildren()} | ||
</this.props.component> | ||
@@ -208,0 +208,0 @@ ); |
{ | ||
"name": "boundless-arrow-key-navigation", | ||
"version": "1.0.0-beta.5", | ||
"version": "1.0.0-beta.7", | ||
"description": "A higher-order component for arrow key navigation on a grouping of children.", | ||
@@ -28,4 +28,4 @@ "main": "build/index.js", | ||
"dependencies": { | ||
"boundless-utils-omit-keys": "^1.0.0-beta.5", | ||
"boundless-utils-uuid": "^1.0.0-beta.5" | ||
"boundless-utils-omit-keys": "^1.0.0-beta.7", | ||
"boundless-utils-uuid": "^1.0.0-beta.7" | ||
}, | ||
@@ -32,0 +32,0 @@ "peerDependencies": { |
@@ -0,15 +1,72 @@ | ||
<!--- | ||
THIS IS AN AUTOGENERATED FILE. EDIT INDEX.JS INSTEAD. | ||
--> | ||
# ArrowKeyNavigation | ||
# ArrowKeyNavigation | ||
__A higher-order component for arrow key navigation on a grouping of children.__ | ||
ArrowKeyNavigation is designed not to care about the component types it is wrapping. Due to this, you can pass | ||
whatever HTML tag you like into `props.component` or even a React component you've made elsewhere. Additional | ||
props passed to `<ArrowKeyNavigation ...>` will be forwarded on to the component or HTML tag name you've supplied. | ||
ArrowKeyNavigation is designed not to care about the component types it is wrapping. Due to this, you can pass whatever HTML tag you like into `props.component` or even a React component you've made elsewhere. Additional props passed to `<ArrowKeyNavigation ...>` will be forwarded on to the component or HTML tag name you've supplied. | ||
The children, similarly, can be any type of component. | ||
## Example Usage | ||
```jsx | ||
import React from 'react'; | ||
import ArrowKeyNavigation from '../index'; | ||
export default class ArrowKeyNavigationDemo extends React.PureComponent { | ||
state = { | ||
items: ['lorem', 'ipsum', 'dolor'], | ||
} | ||
render() { | ||
return ( | ||
<div className='spread'> | ||
<section> | ||
<h6>Horizontal-only</h6> | ||
<ArrowKeyNavigation className='demo-loose-list' mode={ArrowKeyNavigation.mode.HORIZONTAL}> | ||
{this.state.items.map((item) => <span key={item}>{item}</span>)} | ||
</ArrowKeyNavigation> | ||
</section> | ||
<section> | ||
<h6>Vertical-only</h6> | ||
<ArrowKeyNavigation component='ul' mode={ArrowKeyNavigation.mode.VERTICAL}> | ||
{this.state.items.map((item) => <li key={item}>{item}</li>)} | ||
</ArrowKeyNavigation> | ||
</section> | ||
<section> | ||
<h6>Both directions</h6> | ||
<ArrowKeyNavigation component='ol' mode={ArrowKeyNavigation.mode.BOTH}> | ||
{this.state.items.map((item) => <li key={item}>{item}</li>)} | ||
</ArrowKeyNavigation> | ||
</section> | ||
<section> | ||
<h6>Second child active by default</h6> | ||
<ArrowKeyNavigation component='ul' mode={ArrowKeyNavigation.mode.VERTICAL} defaultActiveChildIndex={1}> | ||
{this.state.items.map((item) => <li key={item}>{item}</li>)} | ||
</ArrowKeyNavigation> | ||
</section> | ||
<section> | ||
<h6>Ignored child (horizontal rule)</h6> | ||
<ArrowKeyNavigation> | ||
<div>lorem</div> | ||
<hr tabIndex='-1' /> | ||
<div>dolor</div> | ||
</ArrowKeyNavigation> | ||
</section> | ||
</div> | ||
); | ||
} | ||
} | ||
``` | ||
## Props | ||
_Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/ArrowKeyNavigation#props)._ | ||
> Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/ArrowKeyNavigation#props). | ||
@@ -23,43 +80,34 @@ ### Required Props | ||
<table> | ||
<tr> | ||
<th>Name</th> | ||
<th>Type</th> | ||
<th>Default Value</th> | ||
<th>Description</th> | ||
</tr> | ||
- __`*`__ ・ any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
<tr> | ||
<td>component</td> | ||
<td><pre><code>string or function</code></pre></td> | ||
<td><pre><code class="language-js">'div'</code></pre></td> | ||
<td>Any valid HTML tag name or a React component factory, anything that can be passed as the first argument to `React.createElement`</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any` | `n/a` | ||
<tr> | ||
<td>defaultActiveChildIndex</td> | ||
<td><pre><code>number</code></pre></td> | ||
<td><pre><code class="language-js">0</code></pre></td> | ||
<td>Allows for a particular child to be initially reachable via tabbing</td> | ||
</tr> | ||
- __`component`__ ・ any valid HTML tag name or a React component factory, anything that can be passed as the first argument to `React.createElement` | ||
<tr> | ||
<td>mode</td> | ||
<td><pre><code>ArrowKeyNavigation.mode.BOTH or | ||
ArrowKeyNavigation.mode.HORIZONTAL or | ||
ArrowKeyNavigation.mode.VERTICAL</code></pre></td> | ||
<td><pre><code class="language-js">ArrowKeyNavigation.mode.BOTH</code></pre></td> | ||
<td>controls which arrow key events are captured to move active focus within the list: | ||
Expects | Default Value | ||
- | - | ||
`string or function` | `'div'` | ||
Mode | Keys | ||
---- | ---- | ||
`ArrowKeyNavigation.mode.BOTH` | ⬅️ ➡️ ⬆️ ⬇️ | ||
`ArrowKeyNavigation.mode.HORIZONTAL` | ⬅️ ➡️ | ||
`ArrowKeyNavigation.mode.VERTICAL` | ⬆️ ⬇️ | ||
- __`defaultActiveChildIndex`__ ・ allows for a particular child to be initially reachable via tabbing; only applied during first render | ||
_Note: focus loops when arrowing past one of the boundaries; tabbing moves the user away from the list._</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`number` | `0` | ||
</table> | ||
- __`mode`__ ・ controls which arrow key events are captured to move active focus within the list: | ||
Mode | Keys | ||
---- | ---- | ||
`ArrowKeyNavigation.mode.BOTH` | ⬅️ ➡️ ⬆️ ⬇️ | ||
`ArrowKeyNavigation.mode.HORIZONTAL` | ⬅️ ➡️ | ||
`ArrowKeyNavigation.mode.VERTICAL` | ⬆️ ⬇️ | ||
_Note: focus loops when arrowing past one of the boundaries; tabbing moves the user away from the list._ | ||
Expects | Default Value | ||
- | - | ||
`ArrowKeyNavigation.mode.BOTH or ArrowKeyNavigation.mode.HORIZONTAL or ArrowKeyNavigation.mode.VERTICAL` | `ArrowKeyNavigation.mode.BOTH` | ||
@@ -1,2 +0,2 @@ | ||
module.exports=function(t){function e(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return t[o].call(r.exports,r,r.exports,e),r.l=!0,r.exports}var n={};return e.m=t,e.c=n,e.i=function(t){return t},e.d=function(t,n,o){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:o})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=3)}([function(t,e,n){"use strict";function o(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Object.keys(t).reduce(function(n,o){return e.indexOf(o)===-1&&(n[o]=t[o]),n},{})}e.a=o},function(t,e){t.exports=require("classnames")},function(t,e){t.exports=require("react")},function(t,e,n){"use strict";function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function r(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function a(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var c=n(2),i=n.n(c),s=n(1),u=n.n(s),l=n(0),p=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(t[o]=n[o])}return t},f=function(){function t(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}return function(e,n,o){return n&&t(e.prototype,n),o&&t(e,o),e}}(),d=function(t){function e(){var t,n,a,c;o(this,e);for(var i=arguments.length,s=Array(i),u=0;u<i;u++)s[u]=arguments[u];return n=a=r(this,(t=e.__proto__||Object.getPrototypeOf(e)).call.apply(t,[this].concat(s))),a.mounted=!1,a.state={},c=n,r(a,c)}return a(e,t),f(e,[{key:"convertDataToJSXOrWait",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.props,n=e.data;return n instanceof Promise?(this.setState({component:null}),n.then(function(e){t.mounted&&t.setState(function(t,o){return{component:o.data===n?o.convertToJSXFunc(e):t.component}})},function(){return t.setState({component:!1})})):void this.setState({component:e.convertToJSXFunc(n)})}},{key:"fireCallbackIfDataRendered",value:function(){this.state.component&&this.props.contentRenderedFunc()}},{key:"componentWillMount",value:function(){this.convertDataToJSXOrWait()}},{key:"componentDidMount",value:function(){this.mounted=!0,this.fireCallbackIfDataRendered()}},{key:"componentDidUpdate",value:function(){this.fireCallbackIfDataRendered()}},{key:"componentWillReceiveProps",value:function(t){this.convertDataToJSXOrWait(t)}},{key:"componentWillUnmount",value:function(){this.mounted=!1}},{key:"getClasses",value:function(t){return u()("b-async",this.props.className,t,{"b-async-error":this.state.component===!1,"b-async-loading":null===this.state.component})}},{key:"render",value:function(){return null===this.state.component||this.state.component===!1?i.a.createElement("div",p({},n.i(l.a)(this.props,e.internalKeys),{className:this.getClasses()}),null===this.state.component?this.props.loadingContent:this.props.errorContent):i.a.cloneElement(this.state.component,p({},n.i(l.a)(this.props,e.internalKeys),{className:this.getClasses(this.state.component.props&&this.state.component.props.className)}))}}]),e}(i.a.PureComponent);d.propTypes={contentRenderedFunc:c.PropTypes.func,convertToJSXFunc:c.PropTypes.func,data:c.PropTypes.any,errorContent:c.PropTypes.node,loadingContent:c.PropTypes.node},d.defaultProps={contentRenderedFunc:function(){},convertToJSXFunc:function(t){return t},data:null,errorContent:"⚠️",loadingContent:null},d.internalKeys=Object.keys(d.defaultProps),e.default=d}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIGMzNmUzYmQ4YzNlMDJiNWI1MjVhIiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiY2xhc3NuYW1lc1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdFwifSIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9ib3VuZGxlc3MtYXN5bmMvaW5kZXguanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJ2YWx1ZSIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiX193ZWJwYWNrX2V4cG9ydHNfXyIsIm9taXRLZXlzRnJvbVNvdXJjZU9iamVjdCIsInNvdXJjZSIsIm9taXR0ZWRLZXlzIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwia2V5cyIsInJlZHVjZSIsImhhc2giLCJrZXkiLCJpbmRleE9mIiwicmVxdWlyZSIsIl9jbGFzc0NhbGxDaGVjayIsImluc3RhbmNlIiwiQ29uc3RydWN0b3IiLCJUeXBlRXJyb3IiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiIsInNlbGYiLCJSZWZlcmVuY2VFcnJvciIsIl9pbmhlcml0cyIsInN1YkNsYXNzIiwic3VwZXJDbGFzcyIsImNyZWF0ZSIsImNvbnN0cnVjdG9yIiwid3JpdGFibGUiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fIiwiX2V4dGVuZHMiLCJhc3NpZ24iLCJ0YXJnZXQiLCJfY3JlYXRlQ2xhc3MiLCJkZWZpbmVQcm9wZXJ0aWVzIiwicHJvcHMiLCJkZXNjcmlwdG9yIiwicHJvdG9Qcm9wcyIsInN0YXRpY1Byb3BzIiwiQXN5bmMiLCJfUmVhY3QkUHVyZUNvbXBvbmVudCIsIl9yZWYiLCJfdGVtcCIsIl90aGlzIiwiX3JldCIsInRoaXMiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImdldFByb3RvdHlwZU9mIiwiYXBwbHkiLCJjb25jYXQiLCJtb3VudGVkIiwic3RhdGUiLCJfdGhpczIiLCJkYXRhIiwiUHJvbWlzZSIsInNldFN0YXRlIiwiY29tcG9uZW50IiwidGhlbiIsInBheWxvYWQiLCJjdXJyZW50UHJvcHMiLCJjb252ZXJ0VG9KU1hGdW5jIiwiY29udGVudFJlbmRlcmVkRnVuYyIsImNvbnZlcnREYXRhVG9KU1hPcldhaXQiLCJmaXJlQ2FsbGJhY2tJZkRhdGFSZW5kZXJlZCIsIm5leHRQcm9wcyIsImV4dHJhQ2xhc3NlcyIsImNsYXNzTmFtZSIsImItYXN5bmMtZXJyb3IiLCJiLWFzeW5jLWxvYWRpbmciLCJhIiwiY3JlYXRlRWxlbWVudCIsImludGVybmFsS2V5cyIsImdldENsYXNzZXMiLCJsb2FkaW5nQ29udGVudCIsImVycm9yQ29udGVudCIsImNsb25lRWxlbWVudCIsIlB1cmVDb21wb25l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LEtBQUtTLE1BQU1LLGFBQWMsRUFFdERqQyxFQUFBOEMsRUFBQUMsY0FBQSxNQUFBM0MsS0FBUzNELEVBQUFHLEVBQUF1RCxFQUFBLEdBQUtnQixLQUFLVixNQUFPSSxFQUFNbUMsZUFBZUwsVUFBV3hCLEtBQUs4QixlQUNqQyxPQUF6QjlCLEtBQUtTLE1BQU1LLFVBQ1RkLEtBQUtWLE1BQU15QyxlQUNYL0IsS0FBS1YsTUFBTTBDLGNBS25CbkQsRUFBQThDLEVBQU1NLGFBQWFqQyxLQUFLUyxNQUFNSyxVQUE5QjdCLEtBQ0EzRCxFQUFBRyxFQUFBdUQsRUFBQSxHQUFLZ0IsS0FBS1YsTUFBT0ksRUFBTW1DLGVBQzFCTCxVQUFXeEIsS0FBSzhCLFdBQVc5QixLQUFLUyxNQUFNSyxVQUFVeEIsT0FBU1UsS0FBS1MsTUFBTUssVUFBVXhCLE1BQU1rQyxrQkxDa25JOUIsR0tyRi9xSWIsRUFBQThDLEVBQU1PLGNBQXBCeEMsR0FDVnlDLFdBRUhoQixvQkFBcUJ2QyxFQUFBLFVBQVV3RCxLQUcvQmxCLGlCQUFrQnRDLEVBQUEsVUFBVXdELEtBRzVCekIsS0FBTS9CLEVBQUEsVUFBVXlELElBR2hCTCxhQUFjcEQsRUFBQSxVQUFVMEQsS0FHeEJQLGVBQWdCbkQsRUFBQSxVQUFVMEQsTUFmYjVDLEVBa0JWNkMsY0FDSHBCLG9CQUFxQixhQUNyQkQsaUJBQWtCLFNBQUNzQixHQUFELE1BQU9BLElBQ3pCN0IsS0FBTSxLQUNOcUIsYUFBYyxLQUNkRCxlQUFnQixNQXZCSHJDLEVBMEJWbUMsYUFBZTFGLE9BQU9vQixLQUFLbUMsRUFBTTZDLGNMMkRtMUp2RixFQUE2QixRS3JGdjRKMEMiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9XG4vKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRpOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGw6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4vKioqKioqLyBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4vKioqKioqLyBcdFx0XHRcdGdldDogZ2V0dGVyXG4vKioqKioqLyBcdFx0XHR9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMyk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBleHBvcnQgKGltbXV0YWJsZSkgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSBvbWl0S2V5c0Zyb21Tb3VyY2VPYmplY3Q7XG5mdW5jdGlvbiBvbWl0S2V5c0Zyb21Tb3VyY2VPYmplY3Qoc291cmNlKXt2YXIgb21pdHRlZEtleXM9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOltdO3JldHVybiBPYmplY3Qua2V5cyhzb3VyY2UpLnJlZHVjZShmdW5jdGlvbiByZWxvY2F0ZUFjY2VwdGVkS2V5cyhoYXNoLGtleSl7aWYob21pdHRlZEtleXMuaW5kZXhPZihrZXkpPT09LTEpe2hhc2hba2V5XT1zb3VyY2Vba2V5XTt9cmV0dXJuIGhhc2g7fSx7fSk7fVxuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2xhc3NuYW1lc1wiKTtcblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbnZhciBfZXh0ZW5kcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0YXJnZXQpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9YXJndW1lbnRzW2ldO2Zvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSxrZXkpKXt0YXJnZXRba2V5XT1zb3VyY2Vba2V5XTt9fX1yZXR1cm4gdGFyZ2V0O307dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoXCJ2YWx1ZVwiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKTt9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcjt9O30oKTtmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7fX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLGNhbGwpe2lmKCFzZWxmKXt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7fXJldHVybiBjYWxsJiYodHlwZW9mIGNhbGw9PT1cIm9iamVjdFwifHx0eXBlb2YgY2FsbD09PVwiZnVuY3Rpb25cIik/Y2FsbDpzZWxmO31mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT1cImZ1bmN0aW9uXCImJnN1cGVyQ2xhc3MhPT1udWxsKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2Ygc3VwZXJDbGFzcyk7fXN1YkNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MmJnN1cGVyQ2xhc3MucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6c3ViQ2xhc3MsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfX0pO2lmKHN1cGVyQ2xhc3MpT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcyxzdXBlckNsYXNzKTpzdWJDbGFzcy5fX3Byb3RvX189c3VwZXJDbGFzczt9dmFyIEFzeW5jPWZ1bmN0aW9uKF9SZWFjdCRQdXJlQ29tcG9uZW50KXtfaW5oZXJpdHMoQXN5bmMsX1JlYWN0JFB1cmVDb21wb25lbnQpO2Z1bmN0aW9uIEFzeW5jKCl7dmFyIF9yZWY7dmFyIF90ZW1wLF90aGlzLF9yZXQ7X2NsYXNzQ2FsbENoZWNrKHRoaXMsQXN5bmMpO2Zvcih2YXIgX2xlbj1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkoX2xlbiksX2tleT0wO19rZXk8X2xlbjtfa2V5Kyspe2FyZ3NbX2tleV09YXJndW1lbnRzW19rZXldO31yZXR1cm4gX3JldD0oX3RlbXA9KF90aGlzPV9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKF9yZWY9QXN5bmMuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoQXN5bmMpKS5jYWxsLmFwcGx5KF9yZWYsW3RoaXNdLmNvbmNhdChhcmdzKSkpLF90aGlzKSxfdGhpcy5tb3VudGVkPWZhbHNlLF90aGlzLnN0YXRlPXt9LF90ZW1wKSxfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcyxfcmV0KTt9X2NyZWF0ZUNsYXNzKEFzeW5jLFt7a2V5Oidjb252ZXJ0RGF0YVRvSlNYT3JXYWl0Jyx2YWx1ZTpmdW5jdGlvbiBjb252ZXJ0RGF0YVRvSlNYT3JXYWl0KCl7dmFyIF90aGlzMj10aGlzO3ZhciBwcm9wcz1hcmd1bWVudHMubGVuZ3RoPjAmJmFyZ3VtZW50c1swXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMF06dGhpcy5wcm9wczt2YXIgZGF0YT1wcm9wcy5kYXRhO2lmKGRhdGEgaW5zdGFuY2VvZiBQcm9taXNlKXt0aGlzLnNldFN0YXRlKHtjb21wb25lbnQ6bnVsbH0pO3JldHVybiBkYXRhLnRoZW4oZnVuY3Rpb24ocGF5bG9hZCl7aWYoX3RoaXMyLm1vdW50ZWQpe190aGlzMi5zZXRTdGF0ZShmdW5jdGlvbihzdGF0ZSxjdXJyZW50UHJvcHMpe3JldHVybntjb21wb25lbnQ6Y3VycmVudFByb3BzLmRhdGE9PT1kYXRhP2N1cnJlbnRQcm9wcy5jb252ZXJ0VG9KU1hGdW5jKHBheWxvYWQpOnN0YXRlLmNvbXBvbmVudH07fSk7fX0sZnVuY3Rpb24oKXtyZXR1cm4gX3RoaXMyLnNldFN0YXRlKHtjb21wb25lbnQ6ZmFsc2V9KTt9KTt9dGhpcy5zZXRTdGF0ZSh7Y29tcG9uZW50OnByb3BzLmNvbnZlcnRUb0pTWEZ1bmMoZGF0YSl9KTt9fSx7a2V5OidmaXJlQ2FsbGJhY2tJZkRhdGFSZW5kZXJlZCcsdmFsdWU6ZnVuY3Rpb24gZmlyZUNhbGxiYWNrSWZEYXRhUmVuZGVyZWQoKXtpZih0aGlzLnN0YXRlLmNvbXBvbmVudCl7dGhpcy5wcm9wcy5jb250ZW50UmVuZGVyZWRGdW5jKCk7fX19LHtrZXk6J2NvbXBvbmVudFdpbGxNb3VudCcsdmFsdWU6ZnVuY3Rpb24gY29tcG9uZW50V2lsbE1vdW50KCl7dGhpcy5jb252ZXJ0RGF0YVRvSlNYT3JXYWl0KCk7fX0se2tleTonY29tcG9uZW50RGlkTW91bnQnLHZhbHVlOmZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCl7dGhpcy5tb3VudGVkPXRydWU7dGhpcy5maXJlQ2FsbGJhY2tJZkRhdGFSZW5kZXJlZCgpO319LHtrZXk6J2NvbXBvbmVudERpZFVwZGF0ZScsdmFsdWU6ZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCl7dGhpcy5maXJlQ2FsbGJhY2tJZkRhdGFSZW5kZXJlZCgpO319LHtrZXk6J2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMnLHZhbHVlOmZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKXt0aGlzLmNvbnZlcnREYXRhVG9KU1hPcldhaXQobmV4dFByb3BzKTt9fSx7a2V5Oidjb21wb25lbnRXaWxsVW5tb3VudCcsdmFsdWU6ZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKXt0aGlzLm1vdW50ZWQ9ZmFsc2U7fX0se2tleTonZ2V0Q2xhc3NlcycsdmFsdWU6ZnVuY3Rpb24gZ2V0Q2xhc3NlcyhleHRyYUNsYXNzZXMpe3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQoKSgnYi1hc3luYycsdGhpcy5wcm9wcy5jbGFzc05hbWUsZXh0cmFDbGFzc2VzLHsnYi1hc3luYy1lcnJvcic6dGhpcy5zdGF0ZS5jb21wb25lbnQ9PT1mYWxzZSwnYi1hc3luYy1sb2FkaW5nJzp0aGlzLnN0YXRlLmNvbXBvbmVudD09PW51bGx9KTt9fSx7a2V5OidyZW5kZXInLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe2lmKHRoaXMuc3RhdGUuY29tcG9uZW50PT09bnVsbHx8dGhpcy5zdGF0ZS5jb21wb25lbnQ9PT1mYWxzZSl7cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KCdkaXYnLF9leHRlbmRzKHt9LF9fd2VicGFja19yZXF1aXJlX18uaShfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKSh0aGlzLnByb3BzLEFzeW5jLmludGVybmFsS2V5cykse2NsYXNzTmFtZTp0aGlzLmdldENsYXNzZXMoKX0pLHRoaXMuc3RhdGUuY29tcG9uZW50PT09bnVsbD90aGlzLnByb3BzLmxvYWRpbmdDb250ZW50OnRoaXMucHJvcHMuZXJyb3JDb250ZW50KTt9cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jbG9uZUVsZW1lbnQodGhpcy5zdGF0ZS5jb21wb25lbnQsX2V4dGVuZHMoe30sX193ZWJwYWNrX3JlcXVpcmVfXy5pKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKHRoaXMucHJvcHMsQXN5bmMuaW50ZXJuYWxLZXlzKSx7Y2xhc3NOYW1lOnRoaXMuZ2V0Q2xhc3Nlcyh0aGlzLnN0YXRlLmNvbXBvbmVudC5wcm9wcyYmdGhpcy5zdGF0ZS5jb21wb25lbnQucHJvcHMuY2xhc3NOYW1lKX0pKTt9fV0pO3JldHVybiBBc3luYzt9KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5QdXJlQ29tcG9uZW50KTtBc3luYy5wcm9wVHlwZXM9e2NvbnRlbnRSZW5kZXJlZEZ1bmM6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uZnVuYyxjb252ZXJ0VG9KU1hGdW5jOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmMsZGF0YTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5hbnksZXJyb3JDb250ZW50Ol9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm5vZGUsbG9hZGluZ0NvbnRlbnQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ubm9kZX07QXN5bmMuZGVmYXVsdFByb3BzPXtjb250ZW50UmVuZGVyZWRGdW5jOmZ1bmN0aW9uIGNvbnRlbnRSZW5kZXJlZEZ1bmMoKXt9LGNvbnZlcnRUb0pTWEZ1bmM6ZnVuY3Rpb24gY29udmVydFRvSlNYRnVuYyh4KXtyZXR1cm4geDt9LGRhdGE6bnVsbCxlcnJvckNvbnRlbnQ6J+KaoO+4jycsbG9hZGluZ0NvbnRlbnQ6bnVsbH07QXN5bmMuaW50ZXJuYWxLZXlzPU9iamVjdC5rZXlzKEFzeW5jLmRlZmF1bHRQcm9wcyk7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IEFzeW5jO1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGluZGV4LmpzIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbiBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgYzM2ZTNiZDhjM2UwMmI1YjUyNWEiLCIvKipcbiAqIFJldHVybnMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBzdXBwbGllZCBvYmplY3Qgd2l0aG91dCB0aGUgZ2l2ZW4ga2V5cy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb21pdEtleXNGcm9tU291cmNlT2JqZWN0KHNvdXJjZSwgb21pdHRlZEtleXMgPSBbXSkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhzb3VyY2UpLnJlZHVjZShmdW5jdGlvbiByZWxvY2F0ZUFjY2VwdGVkS2V5cyhoYXNoLCBrZXkpIHtcbiAgICAgICAgaWYgKG9taXR0ZWRLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpIHtcbiAgICAgICAgICAgIGhhc2hba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhc2g7XG4gICAgfSwge30pO1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvYm91bmRsZXNzLXV0aWxzLW9taXQta2V5cy9pbmRleC5qcyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNsYXNzbmFtZXNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJjbGFzc25hbWVzXCJ9XG4vLyBtb2R1bGUgaWQgPSAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn1cbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IFJlYWN0LCB7UHJvcFR5cGVzfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY3ggZnJvbSAnY2xhc3NuYW1lcyc7XG5cbmltcG9ydCBvbWl0IGZyb20gJ2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMnO1xuXG5cbi8qKlxuICogIyBBc3luY1xuICogX19BIGhpZ2hlci1vcmRlciBjb21wb25lbnQgZm9yIHJlbmRlcmluZyBkYXRhIHRoYXQgaXNuJ3QgcmVhZHkgeWV0Ll9fXG4gKlxuICogVGhlcmUgYXJlIHBsZW50eSBvZiBzaXR1YXRpb25zIHdoZXJlIHlvdSBuZWVkIHRvIGZldGNoIGNvbnRlbnQgdG8gYmUgZGlzcGxheWVkLCBidXQgd2FudFxuICogdG8gc2hvdyBzb21lIHNvcnQgb2YgbG9hZGluZyBncmFwaGljIGluIHRoZSBpbnRlcmltLiBUaGlzIGNvbXBvbmVudCBoZWxwcyB0byBzaW1wbGlmeVxuICogdGhhdCBwYXR0ZXJuIGJ5IGhhbmRsaW5nIGNvbW1vbiB0eXBlcyBvZiBwcm9taXNlcyBhbmQgcHJvdmlkaW5nIGEgc2ltcGxlIG1lY2hhbmlzbVxuICogZm9yIG1hdGVyaWFsaXppbmcgdGhlIHJlc29sdmVkIGRhdGEgaW50byBKU1guXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFzeW5jIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgICAgLyoqIGEgY2FsbGJhY2sgZm9yIHdoZW4gcmVhbCBjb250ZW50IGhhcyBiZWVuIHJlbmRlcmVkOyBlaXRoZXIgbm9ybWFsIHBhc3NlZCBkYXRhIG9yIHdoZW4gYSBwYXNzZWQgcHJvbWlzZSByZXNvbHZlcyAqL1xuICAgICAgICBjb250ZW50UmVuZGVyZWRGdW5jOiBQcm9wVHlwZXMuZnVuYyxcblxuICAgICAgICAvKiogYSBmdW5jdGlvbiB0aGF0IHRha2VzIHRoZSByZXNvbHZlZCBwYXlsb2FkIG9mIGEgcHJvbWlzZSBwcm92aWRlZCBieSBgcHJvcHMuZGF0YWAgYW5kIHJldHVybnMgcmVuZGVyYWJsZSBKU1g7IGRlZmF1bHRzIHRvIHRyeWluZyB0byByZW5kZXIgdGhlIHJlc29sdmVkIHZhbHVlIG9mIHRoZSBQcm9taXNlICovXG4gICAgICAgIGNvbnZlcnRUb0pTWEZ1bmM6IFByb3BUeXBlcy5mdW5jLFxuXG4gICAgICAgIC8qKiBhIHByb21pc2UsIG9yIHNvbWUgb3RoZXIgcGllY2Ugb2YgZGF0YSB0byBiZSBydW4gdGhyb3VnaCBgcHJvcHMuY29udmVydFRvSlNYRnVuY2AgKi9cbiAgICAgICAgZGF0YTogUHJvcFR5cGVzLmFueSxcblxuICAgICAgICAvKiogY29udGVudCB0byBiZSBzaG93biBpZiB0aGUgcHJvbWlzZSBpcyByZWplY3RlZCAqL1xuICAgICAgICBlcnJvckNvbnRlbnQ6IFByb3BUeXBlcy5ub2RlLFxuXG4gICAgICAgIC8qKiBjb250ZW50IHRvIGJlIHNob3duIHdoaWxlIHRoZSBwcm9taXNlIGlzIGluIHBlbmRpbmcgc3RhdGUgKi9cbiAgICAgICAgbG9hZGluZ0NvbnRlbnQ6IFByb3BUeXBlcy5ub2RlLFxuICAgIH1cblxuICAgIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgICAgIGNvbnRlbnRSZW5kZXJlZEZ1bmM6ICgpID0+IHt9LFxuICAgICAgICBjb252ZXJ0VG9KU1hGdW5jOiAoeCkgPT4geCxcbiAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgZXJyb3JDb250ZW50OiAn4pqg77iPJyxcbiAgICAgICAgbG9hZGluZ0NvbnRlbnQ6IG51bGwsXG4gICAgfVxuXG4gICAgc3RhdGljIGludGVybmFsS2V5cyA9IE9iamVjdC5rZXlzKEFzeW5jLmRlZmF1bHRQcm9wcylcblxuICAgIG1vdW50ZWQgPSBmYWxzZVxuICAgIHN0YXRlID0ge31cblxuICAgIGNvbnZlcnREYXRhVG9KU1hPcldhaXQocHJvcHMgPSB0aGlzLnByb3BzKSB7XG4gICAgICAgIGNvbnN0IHtkYXRhfSA9IHByb3BzO1xuXG4gICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7Y29tcG9uZW50OiBudWxsfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBkYXRhLnRoZW4oKHBheWxvYWQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tb3VudGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgcmVwbGFjZSBpZiB3ZSdyZSBsb29raW5nIGF0IHRoZSBzYW1lIHByb21pc2UsIG90aGVyd2lzZSBkbyBub3RoaW5nXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoKHN0YXRlLCBjdXJyZW50UHJvcHMpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IGN1cnJlbnRQcm9wcy5kYXRhID09PSBkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY3VycmVudFByb3BzLmNvbnZlcnRUb0pTWEZ1bmMocGF5bG9hZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzdGF0ZS5jb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAoKSA9PiB0aGlzLnNldFN0YXRlKHtjb21wb25lbnQ6IGZhbHNlfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7Y29tcG9uZW50OiBwcm9wcy5jb252ZXJ0VG9KU1hGdW5jKGRhdGEpfSk7XG4gICAgfVxuXG4gICAgZmlyZUNhbGxiYWNrSWZEYXRhUmVuZGVyZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmNvbXBvbmVudCkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5jb250ZW50UmVuZGVyZWRGdW5jKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsTW91bnQoKSAgICAgICAgICAgICAgICAgeyB0aGlzLmNvbnZlcnREYXRhVG9KU1hPcldhaXQoKTsgfVxuICAgIGNvbXBvbmVudERpZE1vdW50KCkgICAgICAgICAgICAgICAgICB7IHRoaXMubW91bnRlZCA9IHRydWU7IHRoaXMuZmlyZUNhbGxiYWNrSWZEYXRhUmVuZGVyZWQoKTsgfVxuICAgIGNvbXBvbmVudERpZFVwZGF0ZSgpICAgICAgICAgICAgICAgICB7IHRoaXMuZmlyZUNhbGxiYWNrSWZEYXRhUmVuZGVyZWQoKTsgfVxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7IHRoaXMuY29udmVydERhdGFUb0pTWE9yV2FpdChuZXh0UHJvcHMpOyB9XG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSAgICAgICAgICAgICAgIHsgdGhpcy5tb3VudGVkID0gZmFsc2U7IH1cblxuICAgIGdldENsYXNzZXMoZXh0cmFDbGFzc2VzKSB7XG4gICAgICAgIHJldHVybiBjeCgnYi1hc3luYycsIHRoaXMucHJvcHMuY2xhc3NOYW1lLCBleHRyYUNsYXNzZXMsIHtcbiAgICAgICAgICAgICdiLWFzeW5jLWVycm9yJzogdGhpcy5zdGF0ZS5jb21wb25lbnQgPT09IGZhbHNlLFxuICAgICAgICAgICAgJ2ItYXN5bmMtbG9hZGluZyc6IHRoaXMuc3RhdGUuY29tcG9uZW50ID09PSBudWxsLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmNvbXBvbmVudCA9PT0gbnVsbCB8fCB0aGlzLnN0YXRlLmNvbXBvbmVudCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPGRpdiB7Li4ub21pdCh0aGlzLnByb3BzLCBBc3luYy5pbnRlcm5hbEtleXMpfSBjbGFzc05hbWU9e3RoaXMuZ2V0Q2xhc3NlcygpfT5cbiAgICAgICAgICAgICAgICAgICAge3RoaXMuc3RhdGUuY29tcG9uZW50ID09PSBudWxsXG4gICAgICAgICAgICAgICAgICAgICA/IHRoaXMucHJvcHMubG9hZGluZ0NvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5wcm9wcy5lcnJvckNvbnRlbnR9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudCh0aGlzLnN0YXRlLmNvbXBvbmVudCwge1xuICAgICAgICAgICAgLi4ub21pdCh0aGlzLnByb3BzLCBBc3luYy5pbnRlcm5hbEtleXMpLFxuICAgICAgICAgICAgY2xhc3NOYW1lOiB0aGlzLmdldENsYXNzZXModGhpcy5zdGF0ZS5jb21wb25lbnQucHJvcHMgJiYgdGhpcy5zdGF0ZS5jb21wb25lbnQucHJvcHMuY2xhc3NOYW1lKSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvYm91bmRsZXNzLWFzeW5jL2luZGV4LmpzIl0sInNvdXJjZVJvb3QiOiIifQ== | ||
module.exports=function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var t={};return n.m=e,n.c=t,n.i=function(e){return e},n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},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=3)}([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 r(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}function o(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 u=t(2),l=t.n(u),s=t(1),c=t.n(s),a=t(0),p=t.n(a),f=Object.assign||function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])}return e},d=function(){function e(e,n){for(var t=0;t<n.length;t++){var r=n[t];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(n,t,r){return t&&e(n.prototype,t),r&&e(n,r),n}}(),h=function(e,n,t){return n.split(".").reduce(function(e,n){return e[n]||t},e)},y=function(e){function n(){var e,t,i,u;r(this,n);for(var l=arguments.length,s=Array(l),c=0;c<l;c++)s[c]=arguments[c];return t=i=o(this,(e=n.__proto__||Object.getPrototypeOf(n)).call.apply(e,[this].concat(s))),i.mounted=!1,i.promise=null,i.state={},u=t,o(i,u)}return i(n,e),d(n,[{key:"handlePromiseFulfillment",value:function(e,n){this.mounted&&this.setState(function(t){return this.promise===e?(this.promise=null,{component:n}):t},this.fireRenderCallback)}},{key:"handleChildren",value:function(e){var n=e;if(l.a.isValidElement(n))return this.setState({component:n},this.fireRenderCallback);if("function"==typeof n)return this.handleChildren(n(this.props));var t=this.handlePromiseFulfillment.bind(this,n);this.promise=n,this.setState({component:null},function(){return n.then(t,t)})}},{key:"fireRenderCallback",value:function(){this.state.component&&this.props.childrenDidRender()}},{key:"componentWillMount",value:function(){this.handleChildren(this.props.children)}},{key:"componentDidMount",value:function(){this.mounted=!0}},{key:"componentWillReceiveProps",value:function(e){this.handleChildren(e.children)}},{key:"componentWillUnmount",value:function(){this.mounted=!1}},{key:"render",value:function(){var e=this.props,t=this.state;return l.a.cloneElement(t.component||e.pendingContent,f({},p()(e,n.internalKeys),{className:c()("b-async",e.className,null===t.component&&h(e,"pendingContent.props.className"),t.component&&h(t,"component.props.className",""),{"b-async-pending":null===t.component})}))}}]),n}(l.a.PureComponent);y.propTypes={"*":u.PropTypes.any,children:u.PropTypes.oneOfType([u.PropTypes.func,u.PropTypes.node,u.PropTypes.instanceOf(Promise)]).isRequired,childrenDidRender:u.PropTypes.func,pendingContent:u.PropTypes.node},y.defaultProps={children:l.a.createElement("div",null),childrenDidRender:function(){},pendingContent:l.a.createElement("div",null)},y.internalKeys=Object.keys(y.defaultProps),n.default=y}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIGY1MWYwNTM1MmQwZTg1ZTNhNjk5Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiY2xhc3NuYW1lc1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdFwifSIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9ib3VuZGxlc3MtYXN5bmMvaW5kZXguanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJ2YWx1ZSIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwicmVxdWlyZSIsIl9fd2VicGFja19leHBvcnRzX18iLCJfY2xhc3NDYWxsQ2hlY2siLCJpbnN0YW5jZSIsIkNvbnN0cnVjdG9yIiwiVHlwZUVycm9yIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJzZWxmIiwiUmVmZXJlbmNlRXJyb3IiLCJfaW5oZXJpdHMiLCJzdWJDbGFzcyIsInN1cGVyQ2xhc3MiLCJjcmVhdGUiLCJjb25zdHJ1Y3RvciIsIndyaXRhYmxlIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCIsIl9leHRlbmRzIiwiYXNzaWduIiwidGFyZ2V0IiwiYXJndW1lbnRzIiwibGVuZ3RoIiwic291cmNlIiwia2V5IiwiX2NyZWF0ZUNsYXNzIiwiZGVmaW5lUHJvcGVydGllcyIsInByb3BzIiwiZGVzY3JpcHRvciIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsImJhc2UiLCJwYXRoIiwiZmFsbGJhY2siLCJzcGxpdCIsInJlZHVjZSIsImN1cnJlbnQiLCJmcmFnbWVudCIsIkFzeW5jIiwiX1JlYWN0JFB1cmVDb21wb25lbnQiLCJfcmVmIiwiX3RlbXAiLCJfdGhpcyIsIl9yZXQiLCJ0aGlzIiwiX2xlbiIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJnZXRQcm90b3R5cGVPZiIsImFwcGx5IiwiY29uY2F0IiwibW91bnRlZCIsInByb21pc2UiLCJzdGF0ZSIsImNvbnRleHQiLCJwYXlsb2FkIiwic2V0U3RhdGUiLCJjb21wb25lbnQiLCJmaXJlUmVuZGVyQ2FsbGJhY2siLCJjaGlsZHJlbiIsImNvbnRlbnQiLCJhIiwiaXNWYWxpZEVsZW1lbnQiLCJoYW5kbGVDaGlsZHJlbiIsImJvdW5kSGFuZGxlciIsImhhbmRsZVByb21pc2VGdWxmaWxsbWVudCIsImJpbmQiLCJ0aGVuIiwiY2hpbGRyZW5EaWRSZW5kZXIiLCJuZXh0UHJvcHMiLCJjbG9uZUVsZW1lbnQiLCJwZW5kaW5nQ29udGVudCIsImludGVybmFsS2V5cyIsImNsYXNzTmFtZSIsImItYXN5bmMtcGVuZGluZyIsIlB1cmVDb21wb25lbnQiLCJwcm9wVHlwZXMiLCIqIiwiYW55Iiwib25lT2ZUeXBlIiwiZnVuYyIsIm5vZGUiLCJpbnN0YW5jZU9mIiwiUHJvbWlzZSIsImlzUmVxdWlyZWQiLCJkZWZhdWx0UHJvcHMiLCJjcmVhdGVFbGVtZW50Iiwia2V5cyJdLCJtYXBwaW5ncyI6IkFBQUFBLE9BQU9DLFFBQ0UsU0FBVUMsR0NHbkIsUUFBQUMsR0FBQUMsR0FHQSxHQUFBQyxFQUFBRCxHQUNBLE1BQUFDLEdBQUFELEdBQUFILE9BR0EsSUFBQUQsR0FBQUssRUFBQUQsSUFDQUUsRUFBQUYsRUFDQUcsR0FBQSxFQUNBTixXQVVBLE9BTkFDLEdBQUFFLEdBQUFJLEtBQUFSLEVBQUFDLFFBQUFELElBQUFDLFFBQUFFLEdBR0FILEVBQUFPLEdBQUEsRUFHQVAsRUFBQUMsUUF2QkEsR0FBQUksS0ErREEsT0FuQ0FGLEdBQUFNLEVBQUFQLEVBR0FDLEVBQUFPLEVBQUFMLEVBR0FGLEVBQUFHLEVBQUEsU0FBQUssR0FBMkMsTUFBQUEsSUFHM0NSLEVBQUFTLEVBQUEsU0FBQVgsRUFBQVksRUFBQUMsR0FDQVgsRUFBQVksRUFBQWQsRUFBQVksSUFDQUcsT0FBQUMsZUFBQWhCLEVBQUFZLEdBQ0FLLGNBQUEsRUFDQUMsWUFBQSxFQUNBQyxJQUFBTixLQU1BWCxFQUFBa0IsRUFBQSxTQUFBckIsR0FDQSxHQUFBYyxHQUFBZCxLQUFBc0IsV0FDQSxXQUEyQixNQUFBdEIsR0FBQSxTQUMzQixXQUFpQyxNQUFBQSxHQUVqQyxPQURBRyxHQUFBUyxFQUFBRSxFQUFBLElBQUFBLEdBQ0FBLEdBSUFYLEVBQUFZLEVBQUEsU0FBQVEsRUFBQUMsR0FBc0QsTUFBQVIsUUFBQVMsVUFBQUMsZUFBQWxCLEtBQUFlLEVBQUFDLElBR3REckIsRUFBQXdCLEVBQUEsR0FHQXhCLElBQUF5QixFQUFBLEtET00sU0FBVTVCLEVBQVFDLEdFdkV4QkQsRUFBQUMsUUFBQTRCLFFBQUEsOEJGNkVNLFNBQVU3QixFQUFRQyxHRzdFeEJELEVBQUFDLFFBQUE0QixRQUFB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QUNBRCxJQUFLVSxFQUFPVyxFQUFNbUMsZUFDckJDLFVBQVczRCxJQUNQLFVBQ0FZLEVBQU0rQyxVQUNjLE9BQXBCcEIsRUFBTUksV0FBc0J4RSxFQUFJeUMsRUFBTyxrQ0FDdkMyQixFQUFNSSxXQUFheEUsRUFBSW9FLEVBQU8sNEJBQTZCLEtBQzFEcUIsa0JBQXVDLE9BQXBCckIsRUFBTUksbUJML0M2OEhwQixHS3BGcDlIekIsRUFBQWlELEVBQU1jLGNBQXBCdEMsR0FDVnVDLFdBSUhDLElBQUtsRSxFQUFBLFVBQVVtRSxJQStDZm5CLFNBQVVoRCxFQUFBLFVBQVVvRSxXQUNoQnBFLEVBQUEsVUFBVXFFLEtBQ1ZyRSxFQUFBLFVBQVVzRSxLQUNWdEUsRUFBQSxVQUFVdUUsV0FBV0MsV0FDdEJDLFdBR0hoQixrQkFBbUJ6RCxFQUFBLFVBQVVxRSxLQUc3QlQsZUFBZ0I1RCxFQUFBLFVBQVVzRSxNQTlEYjVDLEVBaUVWZ0QsY0FDSDFCLFNBQVUvQyxFQUFBaUQsRUFBQXlCLGNBQUEsWUFDVmxCLGtCQUFtQixhQUNuQkcsZUFBZ0IzRCxFQUFBaUQsRUFBQXlCLGNBQUEsYUFwRUhqRCxFQXVFVm1DLGFBQWUzRixPQUFPMEcsS0FBS2xELEVBQU1nRCxjTGF5eUoxRixFQUE2QixRS3BGNzFKMEMiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9XG4vKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRpOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGw6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4vKioqKioqLyBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4vKioqKioqLyBcdFx0XHRcdGdldDogZ2V0dGVyXG4vKioqKioqLyBcdFx0XHR9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMyk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIik7XG5cbi8qKiovIH0pLFxuLyogMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpO1xuXG4vKioqLyB9KSxcbi8qIDIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cbi8qKiovIH0pLFxuLyogMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShfX3dlYnBhY2tfZXhwb3J0c19fLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fKTtcbnZhciBfZXh0ZW5kcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0YXJnZXQpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9YXJndW1lbnRzW2ldO2Zvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSxrZXkpKXt0YXJnZXRba2V5XT1zb3VyY2Vba2V5XTt9fX1yZXR1cm4gdGFyZ2V0O307dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoXCJ2YWx1ZVwiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKTt9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcjt9O30oKTtmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7fX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLGNhbGwpe2lmKCFzZWxmKXt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7fXJldHVybiBjYWxsJiYodHlwZW9mIGNhbGw9PT1cIm9iamVjdFwifHx0eXBlb2YgY2FsbD09PVwiZnVuY3Rpb25cIik/Y2FsbDpzZWxmO31mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT1cImZ1bmN0aW9uXCImJnN1cGVyQ2xhc3MhPT1udWxsKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2Ygc3VwZXJDbGFzcyk7fXN1YkNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MmJnN1cGVyQ2xhc3MucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6c3ViQ2xhc3MsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfX0pO2lmKHN1cGVyQ2xhc3MpT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcyxzdXBlckNsYXNzKTpzdWJDbGFzcy5fX3Byb3RvX189c3VwZXJDbGFzczt9dmFyIGdldD1mdW5jdGlvbiBnZXQoYmFzZSxwYXRoLGZhbGxiYWNrKXtyZXR1cm4gcGF0aC5zcGxpdCgnLicpLnJlZHVjZShmdW5jdGlvbihjdXJyZW50LGZyYWdtZW50KXtyZXR1cm4gY3VycmVudFtmcmFnbWVudF18fGZhbGxiYWNrO30sYmFzZSk7fTt2YXIgQXN5bmM9ZnVuY3Rpb24oX1JlYWN0JFB1cmVDb21wb25lbnQpe19pbmhlcml0cyhBc3luYyxfUmVhY3QkUHVyZUNvbXBvbmVudCk7ZnVuY3Rpb24gQXN5bmMoKXt2YXIgX3JlZjt2YXIgX3RlbXAsX3RoaXMsX3JldDtfY2xhc3NDYWxsQ2hlY2sodGhpcyxBc3luYyk7Zm9yKHZhciBfbGVuPWFyZ3VtZW50cy5sZW5ndGgsYXJncz1BcnJheShfbGVuKSxfa2V5PTA7X2tleTxfbGVuO19rZXkrKyl7YXJnc1tfa2V5XT1hcmd1bWVudHNbX2tleV07fXJldHVybiBfcmV0PShfdGVtcD0oX3RoaXM9X3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywoX3JlZj1Bc3luYy5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihBc3luYykpLmNhbGwuYXBwbHkoX3JlZixbdGhpc10uY29uY2F0KGFyZ3MpKSksX3RoaXMpLF90aGlzLm1vdW50ZWQ9ZmFsc2UsX3RoaXMucHJvbWlzZT1udWxsLF90aGlzLnN0YXRlPXt9LF90ZW1wKSxfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcyxfcmV0KTt9X2NyZWF0ZUNsYXNzKEFzeW5jLFt7a2V5OidoYW5kbGVQcm9taXNlRnVsZmlsbG1lbnQnLHZhbHVlOmZ1bmN0aW9uIGhhbmRsZVByb21pc2VGdWxmaWxsbWVudChjb250ZXh0LHBheWxvYWQpe2lmKCF0aGlzLm1vdW50ZWQpe3JldHVybjt9dGhpcy5zZXRTdGF0ZShmdW5jdGlvbiByZW5kZXJQYXlsb2FkSWZQcm9taXNlTWF0Y2hlcyhzdGF0ZSl7aWYodGhpcy5wcm9taXNlPT09Y29udGV4dCl7dGhpcy5wcm9taXNlPW51bGw7cmV0dXJue2NvbXBvbmVudDpwYXlsb2FkfTt9cmV0dXJuIHN0YXRlO30sdGhpcy5maXJlUmVuZGVyQ2FsbGJhY2spO319LHtrZXk6J2hhbmRsZUNoaWxkcmVuJyx2YWx1ZTpmdW5jdGlvbiBoYW5kbGVDaGlsZHJlbihjaGlsZHJlbil7dmFyIGNvbnRlbnQ9Y2hpbGRyZW47aWYoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmlzVmFsaWRFbGVtZW50KGNvbnRlbnQpKXtyZXR1cm4gdGhpcy5zZXRTdGF0ZSh7Y29tcG9uZW50OmNvbnRlbnR9LHRoaXMuZmlyZVJlbmRlckNhbGxiYWNrKTt9ZWxzZSBpZih0eXBlb2YgY29udGVudD09PSdmdW5jdGlvbicpe3JldHVybiB0aGlzLmhhbmRsZUNoaWxkcmVuKGNvbnRlbnQodGhpcy5wcm9wcykpO312YXIgYm91bmRIYW5kbGVyPXRoaXMuaGFuZGxlUHJvbWlzZUZ1bGZpbGxtZW50LmJpbmQodGhpcyxjb250ZW50KTt0aGlzLnByb21pc2U9Y29udGVudDt0aGlzLnNldFN0YXRlKHtjb21wb25lbnQ6bnVsbH0sZnVuY3Rpb24oKXtyZXR1cm4gY29udGVudC50aGVuKGJvdW5kSGFuZGxlcixib3VuZEhhbmRsZXIpO30pO319LHtrZXk6J2ZpcmVSZW5kZXJDYWxsYmFjaycsdmFsdWU6ZnVuY3Rpb24gZmlyZVJlbmRlckNhbGxiYWNrKCl7aWYodGhpcy5zdGF0ZS5jb21wb25lbnQpe3RoaXMucHJvcHMuY2hpbGRyZW5EaWRSZW5kZXIoKTt9fX0se2tleTonY29tcG9uZW50V2lsbE1vdW50Jyx2YWx1ZTpmdW5jdGlvbiBjb21wb25lbnRXaWxsTW91bnQoKXt0aGlzLmhhbmRsZUNoaWxkcmVuKHRoaXMucHJvcHMuY2hpbGRyZW4pO319LHtrZXk6J2NvbXBvbmVudERpZE1vdW50Jyx2YWx1ZTpmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpe3RoaXMubW91bnRlZD10cnVlO319LHtrZXk6J2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMnLHZhbHVlOmZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKXt0aGlzLmhhbmRsZUNoaWxkcmVuKG5leHRQcm9wcy5jaGlsZHJlbik7fX0se2tleTonY29tcG9uZW50V2lsbFVubW91bnQnLHZhbHVlOmZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCl7dGhpcy5tb3VudGVkPWZhbHNlO319LHtrZXk6J3JlbmRlcicsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyKCl7dmFyIHByb3BzPXRoaXMucHJvcHMsc3RhdGU9dGhpcy5zdGF0ZTtyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNsb25lRWxlbWVudChzdGF0ZS5jb21wb25lbnR8fHByb3BzLnBlbmRpbmdDb250ZW50LF9leHRlbmRzKHt9LF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCgpKHByb3BzLEFzeW5jLmludGVybmFsS2V5cykse2NsYXNzTmFtZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQoKSgnYi1hc3luYycscHJvcHMuY2xhc3NOYW1lLHN0YXRlLmNvbXBvbmVudD09PW51bGwmJmdldChwcm9wcywncGVuZGluZ0NvbnRlbnQucHJvcHMuY2xhc3NOYW1lJyksc3RhdGUuY29tcG9uZW50JiZnZXQoc3RhdGUsJ2NvbXBvbmVudC5wcm9wcy5jbGFzc05hbWUnLCcnKSx7J2ItYXN5bmMtcGVuZGluZyc6c3RhdGUuY29tcG9uZW50PT09bnVsbH0pfSkpO319XSk7cmV0dXJuIEFzeW5jO30oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLlB1cmVDb21wb25lbnQpO0FzeW5jLnByb3BUeXBlcz17JyonOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmFueSxjaGlsZHJlbjpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5vbmVPZlR5cGUoW19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmMsX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ubm9kZSxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5pbnN0YW5jZU9mKFByb21pc2UpXSkuaXNSZXF1aXJlZCxjaGlsZHJlbkRpZFJlbmRlcjpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jLHBlbmRpbmdDb250ZW50Ol9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm5vZGV9O0FzeW5jLmRlZmF1bHRQcm9wcz17Y2hpbGRyZW46X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoJ2RpdicsbnVsbCksY2hpbGRyZW5EaWRSZW5kZXI6ZnVuY3Rpb24gY2hpbGRyZW5EaWRSZW5kZXIoKXt9LHBlbmRpbmdDb250ZW50Ol9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KCdkaXYnLG51bGwpfTtBc3luYy5pbnRlcm5hbEtleXM9T2JqZWN0LmtleXMoQXN5bmMuZGVmYXVsdFByb3BzKTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gQXN5bmM7XG5cbi8qKiovIH0pXG4vKioqKioqLyBdKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gaW5kZXguanMiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAzKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCBmNTFmMDUzNTJkMGU4NWUzYTY5OSIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzXCJ9XG4vLyBtb2R1bGUgaWQgPSAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNsYXNzbmFtZXNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJjbGFzc25hbWVzXCJ9XG4vLyBtb2R1bGUgaWQgPSAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn1cbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IFJlYWN0LCB7UHJvcFR5cGVzfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY3ggZnJvbSAnY2xhc3NuYW1lcyc7XG5cbmltcG9ydCBvbWl0IGZyb20gJ2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMnO1xuXG5jb25zdCBnZXQgPSAoYmFzZSwgcGF0aCwgZmFsbGJhY2spID0+IHBhdGguc3BsaXQoJy4nKS5yZWR1Y2UoKGN1cnJlbnQsIGZyYWdtZW50KSA9PiBjdXJyZW50W2ZyYWdtZW50XSB8fCBmYWxsYmFjaywgYmFzZSk7XG5cbi8qKlxuICogX19BIGhpZ2hlci1vcmRlciBjb21wb25lbnQgZm9yIHJlbmRlcmluZyBkYXRhIHRoYXQgaXNuJ3QgcmVhZHkgeWV0Ll9fXG4gKlxuICogVGhlcmUgYXJlIHBsZW50eSBvZiBzaXR1YXRpb25zIHdoZXJlIHlvdSBuZWVkIHRvIGZldGNoIGNvbnRlbnQgdG8gYmUgZGlzcGxheWVkLCBidXQgd2FudFxuICogdG8gc2hvdyBzb21lIHNvcnQgb2YgbG9hZGluZyBncmFwaGljIGluIHRoZSBpbnRlcmltLiBUaGlzIGNvbXBvbmVudCBoZWxwcyB0byBzaW1wbGlmeVxuICogdGhhdCBwYXR0ZXJuIGJ5IGhhbmRsaW5nIGNvbW1vbiB0eXBlcyBvZiBwcm9taXNlcyBhbmQgcHJvdmlkaW5nIGEgc2ltcGxlIG1lY2hhbmlzbVxuICogZm9yIG1hdGVyaWFsaXppbmcgdGhlIGZ1bGZpbGxlZCBwYXlsb2FkIGludG8gSlNYLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBc3luYyBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xuICAgIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhbnkgW1JlYWN0LXN1cHBvcnRlZCBhdHRyaWJ1dGVdKGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdGFncy1hbmQtYXR0cmlidXRlcy5odG1sI2h0bWwtYXR0cmlidXRlcylcbiAgICAgICAgICovXG4gICAgICAgICcqJzogUHJvcFR5cGVzLmFueSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogYSBwcm9taXNlLCBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBwcm9taXNlLCBvciBvdGhlciB0eXBlIG9mIHJlbmRlcmFibGUgY29udGVudDsgaWYgYSBmdW5jdGlvbiBpcyBwYXNzZWQsIGl0IHdpbGxcbiAgICAgICAgICogYmUgY2FsbGVkIHdpdGggdGhlIGN1cnJlbnQgcHJvcHNcbiAgICAgICAgICpcbiAgICAgICAgICogUHJvbWlzZSBleGFtcGxlOlxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGBqc3hcbiAgICAgICAgICogY29uc3QgbGlzdERhdGFQcm9taXNlID0gZmV0Y2goJy9zb21lL2xpc3QvZGF0YS9lbmRwb2ludCcpLnRoZW4oXG4gICAgICAgICAqICAgICAocmVzcG9uc2UpID0+IHJlc3BvbnNlLm9rID8gcmVzcG9uc2UuanNvbigpIDogJ0ZhaWxlZCB0byByZWNlaXZlIGxpc3QgZGF0YScsXG4gICAgICAgICAqICAgICAoZXJyb3IpID0+IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAqICkudGhlbigocGF5bG9hZCkgPT4ge1xuICAgICAgICAgKiAgICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgKiAgICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9J2Vycm9yJz57cGF5bG9hZH08L2Rpdj4pO1xuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgcmV0dXJuIChcbiAgICAgICAgICogICAgICAgICA8dWw+XG4gICAgICAgICAqICAgICAgICAgICAgIHtwYXlsb2FkLm1hcCgoaXRlbSkgPT4gKDxsaSBrZXk9e2l0ZW0uaWR9PntpdGVtLmNvbnRlbnR9PC9saT4pKX1cbiAgICAgICAgICogICAgICAgICA8L3VsPlxuICAgICAgICAgKiAgICAgKTtcbiAgICAgICAgICogfSk7XG4gICAgICAgICAqXG4gICAgICAgICAqIDxBc3luYz57bGlzdERhdGFQcm9taXNlfTwvQXN5bmM+XG4gICAgICAgICAqXG4gICAgICAgICAqIEZ1bmN0aW9uIGV4YW1wbGU6XG4gICAgICAgICAqXG4gICAgICAgICAqIGBgYGpzeFxuICAgICAgICAgKiBjb25zdCBmZXRjaExpc3REYXRhID0gKHByb3BzKSA9PiBmZXRjaChwcm9wc1snZGF0YS1lbmRwb2ludCddKS50aGVuKFxuICAgICAgICAgKiAgICAgKHJlc3BvbnNlKSA9PiByZXNwb25zZS5vayA/IHJlc3BvbnNlLmpzb24oKSA6ICdGYWlsZWQgdG8gcmVjZWl2ZSBsaXN0IGRhdGEnLFxuICAgICAgICAgKiAgICAgKGVycm9yKSA9PiBlcnJvci5tZXNzYWdlLFxuICAgICAgICAgKiApLnRoZW4oKHBheWxvYWQpID0+IHtcbiAgICAgICAgICogICAgIGlmICh0eXBlb2YgcGF5bG9hZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICogICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPSdlcnJvcic+e3BheWxvYWR9PC9kaXY+KTtcbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIHJldHVybiAoXG4gICAgICAgICAqICAgICAgICAgPHVsPlxuICAgICAgICAgKiAgICAgICAgICAgICB7cGF5bG9hZC5tYXAoKGl0ZW0pID0+ICg8bGkga2V5PXtpdGVtLmlkfT57aXRlbS5jb250ZW50fTwvbGk+KSl9XG4gICAgICAgICAqICAgICAgICAgPC91bD5cbiAgICAgICAgICogICAgICk7XG4gICAgICAgICAqIH0pO1xuICAgICAgICAgKlxuICAgICAgICAgKiA8QXN5bmMgZGF0YS1lbmRwb2ludD0nL3NvbWUvbGlzdC9kYXRhL2VuZHBvaW50Jz57ZmV0Y2hMaXN0RGF0YX08L0FzeW5jPlxuICAgICAgICAgKiBgYGBcbiAgICAgICAgICovXG4gICAgICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgICAgIFByb3BUeXBlcy5mdW5jLFxuICAgICAgICAgICAgUHJvcFR5cGVzLm5vZGUsXG4gICAgICAgICAgICBQcm9wVHlwZXMuaW5zdGFuY2VPZihQcm9taXNlKSxcbiAgICAgICAgXSkuaXNSZXF1aXJlZCxcblxuICAgICAgICAvKiogYSBjYWxsYmFjayBmb3Igd2hlbiByZWFsIGNvbnRlbnQgaGFzIGJlZW4gcmVuZGVyZWQ7IHRoaXMgd2lsbCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgaWYgbm9ybWFsIEpTWCBpcyBwYXNzZWQgdG8gQXN5bmMsIG9yLCBpbiB0aGUgY2FzZSBvZiBhIHByb21pc2UsIHVwb24gcmVzb2x1dGlvbiBvciByZWplY3Rpb24gKi9cbiAgICAgICAgY2hpbGRyZW5EaWRSZW5kZXI6IFByb3BUeXBlcy5mdW5jLFxuXG4gICAgICAgIC8qKiBjb250ZW50IHRvIGJlIHNob3duIHdoaWxlIHRoZSBwcm9taXNlIGlzIGluIFwicGVuZGluZ1wiIHN0YXRlIChsaWtlIGEgbG9hZGluZyBncmFwaGljLCBwZXJoYXBzKSAqL1xuICAgICAgICBwZW5kaW5nQ29udGVudDogUHJvcFR5cGVzLm5vZGUsXG4gICAgfVxuXG4gICAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgICAgY2hpbGRyZW46IDxkaXYgLz4sXG4gICAgICAgIGNoaWxkcmVuRGlkUmVuZGVyOiAoKSA9PiB7fSxcbiAgICAgICAgcGVuZGluZ0NvbnRlbnQ6IDxkaXYgLz4sXG4gICAgfVxuXG4gICAgc3RhdGljIGludGVybmFsS2V5cyA9IE9iamVjdC5rZXlzKEFzeW5jLmRlZmF1bHRQcm9wcylcblxuICAgIG1vdW50ZWQgPSBmYWxzZVxuICAgIHByb21pc2UgPSBudWxsXG4gICAgc3RhdGUgPSB7fVxuXG4gICAgaGFuZGxlUHJvbWlzZUZ1bGZpbGxtZW50KGNvbnRleHQsIHBheWxvYWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLm1vdW50ZWQpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgLy8gb25seSBzZXQgdGhlIGNvbXBvbmVudCBpZiB0aGUgcHJvbWlzZSB0aGF0IGlzIGZ1bGZpbGxlZCBtYXRjaGVzXG4gICAgICAgIC8vIHRoZSBvbmUgd2UncmUgdHJhY2tpbmcgaW4gc3RhdGUsIG90aGVyd2lzZSBpZ25vcmUgaXQgYW5kIHJldGFpbiB0aGUgcHJldmlvdXMgZGF0YVxuICAgICAgICB0aGlzLnNldFN0YXRlKGZ1bmN0aW9uIHJlbmRlclBheWxvYWRJZlByb21pc2VNYXRjaGVzKHN0YXRlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9taXNlID09PSBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlID0gbnVsbDtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7Y29tcG9uZW50OiBwYXlsb2FkfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgICB9LCB0aGlzLmZpcmVSZW5kZXJDYWxsYmFjayk7XG4gICAgfVxuXG4gICAgaGFuZGxlQ2hpbGRyZW4oY2hpbGRyZW4pIHtcbiAgICAgICAgbGV0IGNvbnRlbnQgPSBjaGlsZHJlbjtcblxuICAgICAgICBpZiAoUmVhY3QuaXNWYWxpZEVsZW1lbnQoY29udGVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldFN0YXRlKHtjb21wb25lbnQ6IGNvbnRlbnR9LCB0aGlzLmZpcmVSZW5kZXJDYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUNoaWxkcmVuKGNvbnRlbnQodGhpcy5wcm9wcykpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYm91bmRIYW5kbGVyID0gdGhpcy5oYW5kbGVQcm9taXNlRnVsZmlsbG1lbnQuYmluZCh0aGlzLCBjb250ZW50KTtcblxuICAgICAgICAvLyB0aGlzIGlzIGtlcHQgb3V0c2lkZSBzdGF0ZSBzbyBpdCBjYW4gYmUgc2V0IGltbWVkaWF0ZWx5IGlmIHRoZSBwcm9wcyBjaGFuZ2VcbiAgICAgICAgdGhpcy5wcm9taXNlID0gY29udGVudDtcblxuICAgICAgICB0aGlzLnNldFN0YXRlKHtjb21wb25lbnQ6IG51bGx9LCAoKSA9PiBjb250ZW50LnRoZW4oYm91bmRIYW5kbGVyLCBib3VuZEhhbmRsZXIpKTtcbiAgICB9XG5cbiAgICBmaXJlUmVuZGVyQ2FsbGJhY2soKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmNvbXBvbmVudCkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5jaGlsZHJlbkRpZFJlbmRlcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbE1vdW50KCkgICAgICAgICAgICAgICAgIHsgdGhpcy5oYW5kbGVDaGlsZHJlbih0aGlzLnByb3BzLmNoaWxkcmVuKTsgfVxuICAgIGNvbXBvbmVudERpZE1vdW50KCkgICAgICAgICAgICAgICAgICB7IHRoaXMubW91bnRlZCA9IHRydWU7IH1cbiAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykgeyB0aGlzLmhhbmRsZUNoaWxkcmVuKG5leHRQcm9wcy5jaGlsZHJlbik7IH1cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpICAgICAgICAgICAgICAgeyB0aGlzLm1vdW50ZWQgPSBmYWxzZTsgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCB7cHJvcHMsIHN0YXRlfSA9IHRoaXM7XG5cbiAgICAgICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudChzdGF0ZS5jb21wb25lbnQgfHwgcHJvcHMucGVuZGluZ0NvbnRlbnQsIHtcbiAgICAgICAgICAgIC4uLm9taXQocHJvcHMsIEFzeW5jLmludGVybmFsS2V5cyksXG4gICAgICAgICAgICBjbGFzc05hbWU6IGN4KFxuICAgICAgICAgICAgICAgICdiLWFzeW5jJyxcbiAgICAgICAgICAgICAgICBwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgc3RhdGUuY29tcG9uZW50ID09PSBudWxsICYmIGdldChwcm9wcywgJ3BlbmRpbmdDb250ZW50LnByb3BzLmNsYXNzTmFtZScpLFxuICAgICAgICAgICAgICAgIHN0YXRlLmNvbXBvbmVudCAmJiBnZXQoc3RhdGUsICdjb21wb25lbnQucHJvcHMuY2xhc3NOYW1lJywgJycpLFxuICAgICAgICAgICAgICAgIHsnYi1hc3luYy1wZW5kaW5nJzogc3RhdGUuY29tcG9uZW50ID09PSBudWxsfVxuICAgICAgICAgICAgKSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvYm91bmRsZXNzLWFzeW5jL2luZGV4LmpzIl0sInNvdXJjZVJvb3QiOiIifQ== |
@@ -6,5 +6,5 @@ import React, {PropTypes} from 'react'; | ||
const get = (base, path, fallback) => path.split('.').reduce((current, fragment) => current[fragment] || fallback, base); | ||
/** | ||
* # Async | ||
* __A higher-order component for rendering data that isn't ready yet.__ | ||
@@ -15,28 +15,73 @@ * | ||
* that pattern by handling common types of promises and providing a simple mechanism | ||
* for materializing the resolved data into JSX. | ||
* for materializing the fulfilled payload into JSX. | ||
*/ | ||
export default class Async extends React.PureComponent { | ||
static propTypes = { | ||
/** a callback for when real content has been rendered; either normal passed data or when a passed promise resolves */ | ||
contentRenderedFunc: PropTypes.func, | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
'*': PropTypes.any, | ||
/** a function that takes the resolved payload of a promise provided by `props.data` and returns renderable JSX; defaults to trying to render the resolved value of the Promise */ | ||
convertToJSXFunc: PropTypes.func, | ||
/** | ||
* a promise, function that returns a promise, or other type of renderable content; if a function is passed, it will | ||
* be called with the current props | ||
* | ||
* Promise example: | ||
* | ||
* ```jsx | ||
* const listDataPromise = fetch('/some/list/data/endpoint').then( | ||
* (response) => response.ok ? response.json() : 'Failed to receive list data', | ||
* (error) => error.message, | ||
* ).then((payload) => { | ||
* if (typeof payload === 'string') { | ||
* return (<div className='error'>{payload}</div>); | ||
* } | ||
* | ||
* return ( | ||
* <ul> | ||
* {payload.map((item) => (<li key={item.id}>{item.content}</li>))} | ||
* </ul> | ||
* ); | ||
* }); | ||
* | ||
* <Async>{listDataPromise}</Async> | ||
* | ||
* Function example: | ||
* | ||
* ```jsx | ||
* const fetchListData = (props) => fetch(props['data-endpoint']).then( | ||
* (response) => response.ok ? response.json() : 'Failed to receive list data', | ||
* (error) => error.message, | ||
* ).then((payload) => { | ||
* if (typeof payload === 'string') { | ||
* return (<div className='error'>{payload}</div>); | ||
* } | ||
* | ||
* return ( | ||
* <ul> | ||
* {payload.map((item) => (<li key={item.id}>{item.content}</li>))} | ||
* </ul> | ||
* ); | ||
* }); | ||
* | ||
* <Async data-endpoint='/some/list/data/endpoint'>{fetchListData}</Async> | ||
* ``` | ||
*/ | ||
children: PropTypes.oneOfType([ | ||
PropTypes.func, | ||
PropTypes.node, | ||
PropTypes.instanceOf(Promise), | ||
]).isRequired, | ||
/** a promise, or some other piece of data to be run through `props.convertToJSXFunc` */ | ||
data: PropTypes.any, | ||
/** a callback for when real content has been rendered; this will be called immediately if normal JSX is passed to Async, or, in the case of a promise, upon resolution or rejection */ | ||
childrenDidRender: PropTypes.func, | ||
/** content to be shown if the promise is rejected */ | ||
errorContent: PropTypes.node, | ||
/** content to be shown while the promise is in pending state */ | ||
loadingContent: PropTypes.node, | ||
/** content to be shown while the promise is in "pending" state (like a loading graphic, perhaps) */ | ||
pendingContent: PropTypes.node, | ||
} | ||
static defaultProps = { | ||
contentRenderedFunc: () => {}, | ||
convertToJSXFunc: (x) => x, | ||
data: null, | ||
errorContent: '⚠️', | ||
loadingContent: null, | ||
children: <div />, | ||
childrenDidRender: () => {}, | ||
pendingContent: <div />, | ||
} | ||
@@ -47,60 +92,63 @@ | ||
mounted = false | ||
promise = null | ||
state = {} | ||
convertDataToJSXOrWait(props = this.props) { | ||
const {data} = props; | ||
handlePromiseFulfillment(context, payload) { | ||
if (!this.mounted) { return; } | ||
if (data instanceof Promise) { | ||
this.setState({component: null}); | ||
// only set the component if the promise that is fulfilled matches | ||
// the one we're tracking in state, otherwise ignore it and retain the previous data | ||
this.setState(function renderPayloadIfPromiseMatches(state) { | ||
if (this.promise === context) { | ||
this.promise = null; | ||
return data.then((payload) => { | ||
if (this.mounted) { | ||
// only replace if we're looking at the same promise, otherwise do nothing | ||
this.setState((state, currentProps) => ({ | ||
component: currentProps.data === data | ||
? currentProps.convertToJSXFunc(payload) | ||
: state.component, | ||
})); | ||
} | ||
}, () => this.setState({component: false})); | ||
return {component: payload}; | ||
} | ||
return state; | ||
}, this.fireRenderCallback); | ||
} | ||
handleChildren(children) { | ||
let content = children; | ||
if (React.isValidElement(content)) { | ||
return this.setState({component: content}, this.fireRenderCallback); | ||
} else if (typeof content === 'function') { | ||
return this.handleChildren(content(this.props)); | ||
} | ||
this.setState({component: props.convertToJSXFunc(data)}); | ||
const boundHandler = this.handlePromiseFulfillment.bind(this, content); | ||
// this is kept outside state so it can be set immediately if the props change | ||
this.promise = content; | ||
this.setState({component: null}, () => content.then(boundHandler, boundHandler)); | ||
} | ||
fireCallbackIfDataRendered() { | ||
fireRenderCallback() { | ||
if (this.state.component) { | ||
this.props.contentRenderedFunc(); | ||
this.props.childrenDidRender(); | ||
} | ||
} | ||
componentWillMount() { this.convertDataToJSXOrWait(); } | ||
componentDidMount() { this.mounted = true; this.fireCallbackIfDataRendered(); } | ||
componentDidUpdate() { this.fireCallbackIfDataRendered(); } | ||
componentWillReceiveProps(nextProps) { this.convertDataToJSXOrWait(nextProps); } | ||
componentWillMount() { this.handleChildren(this.props.children); } | ||
componentDidMount() { this.mounted = true; } | ||
componentWillReceiveProps(nextProps) { this.handleChildren(nextProps.children); } | ||
componentWillUnmount() { this.mounted = false; } | ||
getClasses(extraClasses) { | ||
return cx('b-async', this.props.className, extraClasses, { | ||
'b-async-error': this.state.component === false, | ||
'b-async-loading': this.state.component === null, | ||
}); | ||
} | ||
render() { | ||
if (this.state.component === null || this.state.component === false) { | ||
return ( | ||
<div {...omit(this.props, Async.internalKeys)} className={this.getClasses()}> | ||
{this.state.component === null | ||
? this.props.loadingContent | ||
: this.props.errorContent} | ||
</div> | ||
); | ||
} | ||
const {props, state} = this; | ||
return React.cloneElement(this.state.component, { | ||
...omit(this.props, Async.internalKeys), | ||
className: this.getClasses(this.state.component.props && this.state.component.props.className), | ||
return React.cloneElement(state.component || props.pendingContent, { | ||
...omit(props, Async.internalKeys), | ||
className: cx( | ||
'b-async', | ||
props.className, | ||
state.component === null && get(props, 'pendingContent.props.className'), | ||
state.component && get(state, 'component.props.className', ''), | ||
{'b-async-pending': state.component === null} | ||
), | ||
}); | ||
} | ||
} |
{ | ||
"name": "boundless-async", | ||
"version": "1.0.0-beta.5", | ||
"version": "1.0.0-beta.7", | ||
"description": "A higher-order component for rendering data that isn't ready yet.", | ||
@@ -24,3 +24,3 @@ "author": "Evan Scott <glitterbyte@gmail.com> (http://yaycmyk.com) (http://yaycmyk.com)", | ||
"dependencies": { | ||
"boundless-utils-omit-keys": "^1.0.0-beta.5", | ||
"boundless-utils-omit-keys": "^1.0.0-beta.7", | ||
"classnames": "^2.1.5" | ||
@@ -27,0 +27,0 @@ }, |
@@ -0,4 +1,6 @@ | ||
<!--- | ||
THIS IS AN AUTOGENERATED FILE. EDIT INDEX.JS INSTEAD. | ||
--> | ||
# Async | ||
# Async | ||
__A higher-order component for rendering data that isn't ready yet.__ | ||
@@ -9,60 +11,96 @@ | ||
that pattern by handling common types of promises and providing a simple mechanism | ||
for materializing the resolved data into JSX. | ||
for materializing the fulfilled payload into JSX. | ||
## Props | ||
_Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/Async#props)._ | ||
> Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/Async#props). | ||
### Required Props | ||
There are no required props. | ||
- __`children`__ ・ a promise, function that returns a promise, or other type of renderable content; if a function is passed, it will | ||
be called with the current props | ||
Promise example: | ||
```jsx | ||
const listDataPromise = fetch('/some/list/data/endpoint').then( | ||
(response) => response.ok ? response.json() : 'Failed to receive list data', | ||
(error) => error.message, | ||
).then((payload) => { | ||
if (typeof payload === 'string') { | ||
return (<div className='error'>{payload}</div>); | ||
} | ||
return ( | ||
<ul> | ||
{payload.map((item) => (<li key={item.id}>{item.content}</li>))} | ||
</ul> | ||
); | ||
}); | ||
<Async>{listDataPromise}</Async> | ||
Function example: | ||
```jsx | ||
const fetchListData = (props) => fetch(props['data-endpoint']).then( | ||
(response) => response.ok ? response.json() : 'Failed to receive list data', | ||
(error) => error.message, | ||
).then((payload) => { | ||
if (typeof payload === 'string') { | ||
return (<div className='error'>{payload}</div>); | ||
} | ||
return ( | ||
<ul> | ||
{payload.map((item) => (<li key={item.id}>{item.content}</li>))} | ||
</ul> | ||
); | ||
}); | ||
<Async data-endpoint='/some/list/data/endpoint'>{fetchListData}</Async> | ||
``` | ||
Expects | Default Value | ||
- | - | ||
`function or any renderable or Promise` | `<div />` | ||
### Optional Props | ||
<table> | ||
<tr> | ||
<th>Name</th> | ||
<th>Type</th> | ||
<th>Default Value</th> | ||
<th>Description</th> | ||
</tr> | ||
- __`*`__ ・ any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
<tr> | ||
<td>contentRenderedFunc</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">() => {}</code></pre></td> | ||
<td>a callback for when real content has been rendered; either normal passed data or when a passed promise resolves</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any` | `n/a` | ||
<tr> | ||
<td>convertToJSXFunc</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">(x) => x</code></pre></td> | ||
<td>a function that takes the resolved payload of a promise provided by `props.data` and returns renderable JSX; defaults to trying to render the resolved value of the Promise</td> | ||
</tr> | ||
- __`childrenDidRender`__ ・ a callback for when real content has been rendered; this will be called immediately if normal JSX is passed to Async, or, in the case of a promise, upon resolution or rejection | ||
<tr> | ||
<td>data</td> | ||
<td><pre><code>any</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>a promise, or some other piece of data to be run through `props.convertToJSXFunc`</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`function` | `() => {}` | ||
<tr> | ||
<td>errorContent</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">'⚠️'</code></pre></td> | ||
<td>content to be shown if the promise is rejected</td> | ||
</tr> | ||
- __`pendingContent`__ ・ content to be shown while the promise is in "pending" state (like a loading graphic, perhaps) | ||
<tr> | ||
<td>loadingContent</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>content to be shown while the promise is in pending state</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any renderable` | `<div />` | ||
</table> | ||
## Reference Styles | ||
### Stylus | ||
```stylus | ||
// Bring in Boundless's base Stylus variables | ||
@require "node_modules/boundless-async/variables" | ||
// Redefine any variables as desired, e.g. | ||
color-accent = royalblue | ||
// Bring in the component styles; they will be autoconfigured based on the above | ||
@require "node_modules/boundless-async/style" | ||
``` | ||
### CSS | ||
If desired, a precompiled plain CSS stylesheet is available for customization at `/build/style.css`, based on Boundless's [default variables](https://github.com/enigma-io/boundless/blob/master/variables.styl). | ||
@@ -1,2 +0,2 @@ | ||
module.exports=function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var t={};return n.m=e,n.c=t,n.i=function(e){return e},n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},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=3)}([function(e,n,t){"use strict";function r(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Object.keys(e).reduce(function(t,r){return n.indexOf(r)===-1&&(t[r]=e[r]),t},{})}n.a=r},function(e,n){e.exports=require("classnames")},function(e,n){e.exports=require("react")},function(e,n,t){"use strict";function r(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}function o(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 s(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 p=t(2),i=t.n(p),u=t(1),c=t.n(u),a=t(0),l=Object.assign||function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])}return e},f=function(){function e(e,n){for(var t=0;t<n.length;t++){var r=n[t];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(n,t,r){return t&&e(n.prototype,t),r&&e(n,r),n}}(),d=function(e){return"function"==typeof e},y=function(){},b=function(e){function n(){var e,t,s,p;r(this,n);for(var i=arguments.length,u=Array(i),c=0;c<i;c++)u[c]=arguments[c];return t=s=o(this,(e=n.__proto__||Object.getPrototypeOf(n)).call.apply(e,[this].concat(u))),s.handleClick=function(e){s.props.disabled||(s.toggleState(e),d(s.props.onClick)&&s.props.onClick(e))},s.handleKeyDown=function(e){if(!s.props.disabled){switch(e.key){case"Enter":case"Space":e.preventDefault(),s.toggleState(e)}d(s.props.onKeyDown)&&s.props.onKeyDown(e)}},p=t,o(s,p)}return s(n,e),f(n,[{key:"toggleState",value:function(e){this.props[this.props.pressed?"onUnpressed":"onPressed"](e)}},{key:"render",value:function(){return i.a.createElement(this.props.component,l({},t.i(a.a)(this.props,n.internalKeys),{ref:"button",className:c()("b-button",this.props.className,{"b-button-pressable":"undefined"!=typeof this.props.pressed,"b-button-pressed":this.props.pressed}),"aria-pressed":this.props.pressed,onKeyDown:this.handleKeyDown,onClick:this.handleClick}),this.props.children)}}]),n}(i.a.PureComponent);b.propTypes={children:p.PropTypes.node,component:p.PropTypes.oneOfType([p.PropTypes.string,p.PropTypes.func]),onClick:p.PropTypes.func,onPressed:p.PropTypes.func,onUnpressed:p.PropTypes.func,pressed:p.PropTypes.bool},b.defaultProps={children:null,component:"button",onClick:y,onPressed:y,onUnpressed:y,pressed:void 0},b.internalKeys=Object.keys(b.defaultProps),n.default=b}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIGI2YWUwMzAwZjdkODNiZTc5YzcwIiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiY2xhc3NuYW1lc1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdFwifSIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9ib3VuZGxlc3MtYnV0dG9uL2luZGV4LmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJtb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiaW5zdGFsbGVkTW9kdWxlcyIsImkiLCJsIiwiY2FsbCIsIm0iLCJjIiwidmFsdWUiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJnZXQiLCJuIiwiX19lc01vZHVsZSIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsIl9fd2VicGFja19leHBvcnRzX18iLCJvbWl0S2V5c0Zyb21Tb3VyY2VPYmplY3QiLCJzb3VyY2UiLCJvbWl0dGVkS2V5cyIsImFyZ3VtZW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsImtleXMiLCJyZWR1Y2UiLCJoYXNoIiwia2V5IiwiaW5kZXhPZiIsInJlcXVpcmUiLCJfY2xhc3NDYWxsQ2hlY2siLCJpbnN0YW5jZSIsIkNvbnN0cnVjdG9yIiwiVHlwZUVycm9yIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJzZWxmIiwiUmVmZXJlbmNlRXJyb3IiLCJfaW5oZXJpdHMiLCJzdWJDbGFzcyIsInN1cGVyQ2xhc3MiLCJjcmVhdGUiLCJjb25zdHJ1Y3RvciIsIndyaXRhYmxlIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyIsIl9leHRlbmRzIiwiYXNzaWduIiwidGFyZ2V0IiwiX2NyZWF0ZUNsYXNzIiwiZGVmaW5lUHJvcGVydGllcyIsInByb3BzIiwiZGVzY3JpcHRvciIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsImlzRnVuY3Rpb24iLCJ4Iiwibm9vcCIsIkJ1dHRvbiIsIl9SZWFjdCRQdXJlQ29tcG9uZW50IiwiX3JlZiIsIl90ZW1wIiwiX3RoaXMiLCJfcmV0IiwidGhpcyIsIl9sZW4iLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiZ2V0UHJvdG90eXBlT2YiLCJhcHBseSIsImNvbmNhdCIsImhhbmRsZUNsaWNrIiwiZXZlbnQiLCJkaXNhYmxlZCIsInRvZ2dsZVN0YXRlIiwib25DbGljayIsImhhbmRsZUtleURvd24iLCJwcmV2ZW50RGVmYXVsdCIsIm9uS2V5RG93biIsInByZXNzZWQiLCJhIiwiY3JlYXRlRWxlbWVudCIsImNvbXBvbmVudCIsImludGVybmFsS2V5cyIsInJlZiIsImNsYXNzTmFtZSIsImItYnV0dG9uLXByZXNzYWJsZSIsImItYnV0dG9uLXByZXNzZWQiLCJhcmlhLXByZXNzZWQiLCJjaGlsZHJlbiIsIlB1cmVDb21wb25lbnQiLCJwcm9wVHlwZXMiLCJub2RlIiwib25lT2ZUeXBlIiwic3RyaW5nIiwiZnVuYyIsIm9uUHJlc3NlZCIsIm9uVW5wcmVzc2VkIiwiYm9vbCIsImRlZmF1bHRQ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QyxjQUNIVixTQUFVLEtBQ1ZQLFVBQVcsU0FDWFAsUUFBU25CLEVBQ1R3QyxVQUFXeEMsRUFDWHlDLFlBQWF6QyxFQUNidUIsUUFBUzdELFFBcENJdUMsRUF1Q1YwQixhQUFlcEYsT0FBT29CLEtBQUtzQyxFQUFPMEMsY0wyQjI0SHZGLEVBQTZCLFFLbEVoOEg2QyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbi8qKioqKiovIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbi8qKioqKiovIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAzKTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGV4cG9ydCAoaW1tdXRhYmxlKSAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IG9taXRLZXlzRnJvbVNvdXJjZU9iamVjdDtcbmZ1bmN0aW9uIG9taXRLZXlzRnJvbVNvdXJjZU9iamVjdChzb3VyY2Upe3ZhciBvbWl0dGVkS2V5cz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMV06W107cmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIHJlbG9jYXRlQWNjZXB0ZWRLZXlzKGhhc2gsa2V5KXtpZihvbWl0dGVkS2V5cy5pbmRleE9mKGtleSk9PT0tMSl7aGFzaFtrZXldPXNvdXJjZVtrZXldO31yZXR1cm4gaGFzaDt9LHt9KTt9XG5cbi8qKiovIH0pLFxuLyogMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpO1xuXG4vKioqLyB9KSxcbi8qIDIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cbi8qKiovIH0pLFxuLyogMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShfX3dlYnBhY2tfZXhwb3J0c19fLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xudmFyIF9leHRlbmRzPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHRhcmdldCl7Zm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIHNvdXJjZT1hcmd1bWVudHNbaV07Zm9yKHZhciBrZXkgaW4gc291cmNlKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLGtleSkpe3RhcmdldFtrZXldPXNvdXJjZVtrZXldO319fXJldHVybiB0YXJnZXQ7fTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQscHJvcHMpe2Zvcih2YXIgaT0wO2k8cHJvcHMubGVuZ3RoO2krKyl7dmFyIGRlc2NyaXB0b3I9cHJvcHNbaV07ZGVzY3JpcHRvci5lbnVtZXJhYmxlPWRlc2NyaXB0b3IuZW51bWVyYWJsZXx8ZmFsc2U7ZGVzY3JpcHRvci5jb25maWd1cmFibGU9dHJ1ZTtpZihcInZhbHVlXCJpbiBkZXNjcmlwdG9yKWRlc2NyaXB0b3Iud3JpdGFibGU9dHJ1ZTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LGRlc2NyaXB0b3Iua2V5LGRlc2NyaXB0b3IpO319cmV0dXJuIGZ1bmN0aW9uKENvbnN0cnVjdG9yLHByb3RvUHJvcHMsc3RhdGljUHJvcHMpe2lmKHByb3RvUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUscHJvdG9Qcm9wcyk7aWYoc3RhdGljUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3RvcixzdGF0aWNQcm9wcyk7cmV0dXJuIENvbnN0cnVjdG9yO307fSgpO2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSxDb25zdHJ1Y3Rvcil7aWYoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTt9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsY2FsbCl7aWYoIXNlbGYpe3Rocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTt9cmV0dXJuIGNhbGwmJih0eXBlb2YgY2FsbD09PVwib2JqZWN0XCJ8fHR5cGVvZiBjYWxsPT09XCJmdW5jdGlvblwiKT9jYWxsOnNlbGY7fWZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcyxzdXBlckNsYXNzKXtpZih0eXBlb2Ygc3VwZXJDbGFzcyE9PVwiZnVuY3Rpb25cIiYmc3VwZXJDbGFzcyE9PW51bGwpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiK3R5cGVvZiBzdXBlckNsYXNzKTt9c3ViQ2xhc3MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyYmc3VwZXJDbGFzcy5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpzdWJDbGFzcyxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9fSk7aWYoc3VwZXJDbGFzcylPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLHN1cGVyQ2xhc3MpOnN1YkNsYXNzLl9fcHJvdG9fXz1zdXBlckNsYXNzO312YXIgaXNGdW5jdGlvbj1mdW5jdGlvbiBpc0Z1bmN0aW9uKHgpe3JldHVybiB0eXBlb2YgeD09PSdmdW5jdGlvbic7fTt2YXIgbm9vcD1mdW5jdGlvbiBub29wKCl7fTt2YXIgQnV0dG9uPWZ1bmN0aW9uKF9SZWFjdCRQdXJlQ29tcG9uZW50KXtfaW5oZXJpdHMoQnV0dG9uLF9SZWFjdCRQdXJlQ29tcG9uZW50KTtmdW5jdGlvbiBCdXR0b24oKXt2YXIgX3JlZjt2YXIgX3RlbXAsX3RoaXMsX3JldDtfY2xhc3NDYWxsQ2hlY2sodGhpcyxCdXR0b24pO2Zvcih2YXIgX2xlbj1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkoX2xlbiksX2tleT0wO19rZXk8X2xlbjtfa2V5Kyspe2FyZ3NbX2tleV09YXJndW1lbnRzW19rZXldO31yZXR1cm4gX3JldD0oX3RlbXA9KF90aGlzPV9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKF9yZWY9QnV0dG9uLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKEJ1dHRvbikpLmNhbGwuYXBwbHkoX3JlZixbdGhpc10uY29uY2F0KGFyZ3MpKSksX3RoaXMpLF90aGlzLmhhbmRsZUNsaWNrPWZ1bmN0aW9uKGV2ZW50KXtpZihfdGhpcy5wcm9wcy5kaXNhYmxlZCl7cmV0dXJuO31fdGhpcy50b2dnbGVTdGF0ZShldmVudCk7aWYoaXNGdW5jdGlvbihfdGhpcy5wcm9wcy5vbkNsaWNrKSl7X3RoaXMucHJvcHMub25DbGljayhldmVudCk7fX0sX3RoaXMuaGFuZGxlS2V5RG93bj1mdW5jdGlvbihldmVudCl7aWYoX3RoaXMucHJvcHMuZGlzYWJsZWQpe3JldHVybjt9c3dpdGNoKGV2ZW50LmtleSl7Y2FzZSdFbnRlcic6Y2FzZSdTcGFjZSc6ZXZlbnQucHJldmVudERlZmF1bHQoKTtfdGhpcy50b2dnbGVTdGF0ZShldmVudCk7fWlmKGlzRnVuY3Rpb24oX3RoaXMucHJvcHMub25LZXlEb3duKSl7X3RoaXMucHJvcHMub25LZXlEb3duKGV2ZW50KTt9fSxfdGVtcCksX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsX3JldCk7fV9jcmVhdGVDbGFzcyhCdXR0b24sW3trZXk6J3RvZ2dsZVN0YXRlJyx2YWx1ZTpmdW5jdGlvbiB0b2dnbGVTdGF0ZShldmVudCl7dGhpcy5wcm9wc1t0aGlzLnByb3BzLnByZXNzZWQ/J29uVW5wcmVzc2VkJzonb25QcmVzc2VkJ10oZXZlbnQpO319LHtrZXk6J3JlbmRlcicsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyKCl7cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KHRoaXMucHJvcHMuY29tcG9uZW50LF9leHRlbmRzKHt9LF9fd2VicGFja19yZXF1aXJlX18uaShfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKSh0aGlzLnByb3BzLEJ1dHRvbi5pbnRlcm5hbEtleXMpLHtyZWY6J2J1dHRvbicsY2xhc3NOYW1lOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCgpKCdiLWJ1dHRvbicsdGhpcy5wcm9wcy5jbGFzc05hbWUseydiLWJ1dHRvbi1wcmVzc2FibGUnOnR5cGVvZiB0aGlzLnByb3BzLnByZXNzZWQhPT0ndW5kZWZpbmVkJywnYi1idXR0b24tcHJlc3NlZCc6dGhpcy5wcm9wcy5wcmVzc2VkfSksJ2FyaWEtcHJlc3NlZCc6dGhpcy5wcm9wcy5wcmVzc2VkLG9uS2V5RG93bjp0aGlzLmhhbmRsZUtleURvd24sb25DbGljazp0aGlzLmhhbmRsZUNsaWNrfSksdGhpcy5wcm9wcy5jaGlsZHJlbik7fX1dKTtyZXR1cm4gQnV0dG9uO30oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLlB1cmVDb21wb25lbnQpO0J1dHRvbi5wcm9wVHlwZXM9e2NoaWxkcmVuOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm5vZGUsY29tcG9uZW50Ol9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm9uZU9mVHlwZShbX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc3RyaW5nLF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmNdKSxvbkNsaWNrOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmMsb25QcmVzc2VkOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmMsb25VbnByZXNzZWQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uZnVuYyxwcmVzc2VkOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmJvb2x9O0J1dHRvbi5kZWZhdWx0UHJvcHM9e2NoaWxkcmVuOm51bGwsY29tcG9uZW50OididXR0b24nLG9uQ2xpY2s6bm9vcCxvblByZXNzZWQ6bm9vcCxvblVucHJlc3NlZDpub29wLHByZXNzZWQ6dW5kZWZpbmVkfTtCdXR0b24uaW50ZXJuYWxLZXlzPU9iamVjdC5rZXlzKEJ1dHRvbi5kZWZhdWx0UHJvcHMpOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSBCdXR0b247XG5cbi8qKiovIH0pXG4vKioqKioqLyBdKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gaW5kZXguanMiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAzKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCBiNmFlMDMwMGY3ZDgzYmU3OWM3MCIsIi8qKlxuICogUmV0dXJucyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHN1cHBsaWVkIG9iamVjdCB3aXRob3V0IHRoZSBnaXZlbiBrZXlzLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBvbWl0S2V5c0Zyb21Tb3VyY2VPYmplY3Qoc291cmNlLCBvbWl0dGVkS2V5cyA9IFtdKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIHJlbG9jYXRlQWNjZXB0ZWRLZXlzKGhhc2gsIGtleSkge1xuICAgICAgICBpZiAob21pdHRlZEtleXMuaW5kZXhPZihrZXkpID09PSAtMSkge1xuICAgICAgICAgICAgaGFzaFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFzaDtcbiAgICB9LCB7fSk7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9ib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzL2luZGV4LmpzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2xhc3NuYW1lc1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImNsYXNzbmFtZXNcIn1cbi8vIG1vZHVsZSBpZCA9IDFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdFwifVxuLy8gbW9kdWxlIGlkID0gMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgUmVhY3QsIHtQcm9wVHlwZXN9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjeCBmcm9tICdjbGFzc25hbWVzJztcblxuaW1wb3J0IG9taXQgZnJvbSAnYm91bmRsZXNzLXV0aWxzLW9taXQta2V5cyc7XG5cbmNvbnN0IGlzRnVuY3Rpb24gPSAoeCkgPT4gdHlwZW9mIHggPT09ICdmdW5jdGlvbic7XG5jb25zdCBub29wID0gKCkgPT4ge307XG5cbi8qKlxuIyBCdXR0b25cbl9fQSBjb250cm9sIHdpdGggXCJwcmVzc2VkXCIgc3RhdGUgc3VwcG9ydC5fX1xuXG5CdXR0b24gaGFzIHR3byBtb2RlcyBvZiBvcGVyYXRpb246XG5cbjEuIHN0YXRlbGVzcyAobGlrZSBhIG5vcm1hbCBgPGJ1dHRvbj5gKVxuICAgYGBganN4XG4gICA8QnV0dG9uIG9uUHJlc3NlZD17ZG9Tb21ldGhpbmd9PmZvbzwvQnV0dG9uPlxuICAgYGBgXG5cbiAgID4gTm90ZSB0aGF0IGluc3RlYWQgb2YgYG9uQ2xpY2tgLCBCdXR0b24gdXNlcyBgb25QcmVzc2VkYC4gVGhpcyBpcyBiZWNhdXNlIHRoZSBjb21wb25lbnQgYWxzbyBsaXN0ZW5zIGZvciBrZXlib2FyZCA8a2JkPkVudGVyPC9rYmQ+IGV2ZW50cywgc28gYG9uQ2xpY2tgIG9ubHkgdGVsbHMgaGFsZiB0aGUgc3RvcnkuIFlvdSBjYW4gc3RpbGwgYmluZCB0byB0aGF0IHBhcnRpY3VsYXIgUmVhY3QgZXZlbnQgdGhvdWdoIGlmIHRoZXJlJ3MgYSBuZWVkIHRvIHRlbGwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBjbGlja3MgYW5kIEVudGVyIHByZXNzZXMuXG5cbjIuIHN0YXRlZnVsIChsaWtlIGEgdG9nZ2xlLCBlLmcuIGJvbGQtbW9kZSBpbiBhIHJpY2ggdGV4dCBlZGl0b3IpXG5cbiAgIFwic3RhdGVmdWxcIiBtb2RlIGlzIHRyaWdnZXJlZCBieSBwYXNzaW5nIGEgYm9vbGVhbiB0byBgcHJlc3NlZGAuIFRoaXMgZW5hYmxlcyB0aGUgYnV0dG9uIHRvIGFjdCBsaWtlIGEgY29udHJvbGxlZCBjb21wb25lbnQuIFRoZSBgb25VbnByZXNzZWRgIGV2ZW50IGNhbGxiYWNrIHdpbGwgYWxzbyBub3cgYmUgZmlyZWQgd2hlbiBhcHByb3ByaWF0ZS5cblxuICAgYGBganN4XG4gICA8QnV0dG9uXG4gICAgICAgcHJlc3NlZD17dHJ1ZX1cbiAgICAgICBvblByZXNzZWQ9e2RvU29tZXRoaW5nfVxuICAgICAgIG9uVW5wcmVzc2VkPXtkb1NvbWV0aGluZ0Vsc2V9PlxuICAgICAgIGZvb1xuICAgPC9CdXR0b24+XG4gICBgYGBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnV0dG9uIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgICAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgICAgQW55IHZhbGlkIEhUTUwgdGFnIG5hbWUgb3IgYSBSZWFjdCBjb21wb25lbnQgZmFjdG9yeSwgYW55dGhpbmcgdGhhdCBjYW4gYmUgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byBgUmVhY3QuY3JlYXRlRWxlbWVudGBcbiAgICAgICAgKi9cbiAgICAgICAgY29tcG9uZW50OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgICAgIFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICAgICAgICBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgXSksXG5cbiAgICAgICAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGNhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGJlY29tZXMgXCJwcmVzc2VkXCIgb3IgdHJpZ2dlcmVkIGJ5IHRoZSB1c2VyIChtb3VzZSBvciBrZXlib2FyZCk7IGJhY2tpbmcgZGF0YSBtdXN0IGJlIHVwZGF0ZWQgdG8gcGVyc2lzdCB0aGUgc3RhdGUgY2hhbmdlOyB0aGlzIGZ1bmN0aW9uIHdpbGwgc3RpbGwgYmUgY2FsbGVkIGlmIGBwcm9wcy5wcmVzc2VkYCBpcyBub3QgcGFzc2VkXG4gICAgICAgICAqL1xuICAgICAgICBvblByZXNzZWQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBjYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBiZWNvbWVzIFwidW5wcmVzc2VkXCI7IGJhY2tpbmcgZGF0YSBtdXN0IGJlIHVwZGF0ZWQgdG8gcGVyc2lzdCB0aGUgc3RhdGUgY2hhbmdlXG4gICAgICAgICAqL1xuICAgICAgICBvblVucHJlc3NlZDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGVuYWJsZXMgXCJwcmVzc2VkXCIgc3VwcG9ydCBhbmQgYWRkcyB0aGUgYGFyaWEtcHJlc3NlZGAgYXR0cmlidXRlIHRvIHRoZSBgLmItYnV0dG9uYCBub2RlOyBlc3NlbnRpYWxseSBhIFwic3RhdGVmdWxcIiBidXR0b24gKHNlZSB0aGUgXCJ1bnByZXNzZWQvcHJlc3NlZFwiIGV4YW1wbGUgZGVtbyBhYm92ZSlcbiAgICAgICAgICovXG4gICAgICAgIHByZXNzZWQ6IFByb3BUeXBlcy5ib29sLFxuICAgIH1cblxuICAgIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgICAgIGNoaWxkcmVuOiBudWxsLFxuICAgICAgICBjb21wb25lbnQ6ICdidXR0b24nLFxuICAgICAgICBvbkNsaWNrOiBub29wLFxuICAgICAgICBvblByZXNzZWQ6IG5vb3AsXG4gICAgICAgIG9uVW5wcmVzc2VkOiBub29wLFxuICAgICAgICBwcmVzc2VkOiB1bmRlZmluZWQsXG4gICAgfVxuXG4gICAgc3RhdGljIGludGVybmFsS2V5cyA9IE9iamVjdC5rZXlzKEJ1dHRvbi5kZWZhdWx0UHJvcHMpXG5cbiAgICB0b2dnbGVTdGF0ZShldmVudCkge1xuICAgICAgICB0aGlzLnByb3BzW3RoaXMucHJvcHMucHJlc3NlZCA/ICdvblVucHJlc3NlZCcgOiAnb25QcmVzc2VkJ10oZXZlbnQpO1xuICAgIH1cblxuICAgIGhhbmRsZUNsaWNrID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmRpc2FibGVkKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHRoaXMudG9nZ2xlU3RhdGUoZXZlbnQpO1xuXG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHRoaXMucHJvcHMub25DbGljaykpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25DbGljayhldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYW5kbGVLZXlEb3duID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmRpc2FibGVkKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgY2FzZSAnU3BhY2UnOlxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlU3RhdGUoZXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpcy5wcm9wcy5vbktleURvd24pKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uS2V5RG93bihldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8dGhpcy5wcm9wcy5jb21wb25lbnRcbiAgICAgICAgICAgICAgICB7Li4ub21pdCh0aGlzLnByb3BzLCBCdXR0b24uaW50ZXJuYWxLZXlzKX1cbiAgICAgICAgICAgICAgICByZWY9J2J1dHRvbidcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KCdiLWJ1dHRvbicsIHRoaXMucHJvcHMuY2xhc3NOYW1lLCB7XG4gICAgICAgICAgICAgICAgICAgICdiLWJ1dHRvbi1wcmVzc2FibGUnOiB0eXBlb2YgdGhpcy5wcm9wcy5wcmVzc2VkICE9PSAndW5kZWZpbmVkJyxcbiAgICAgICAgICAgICAgICAgICAgJ2ItYnV0dG9uLXByZXNzZWQnOiB0aGlzLnByb3BzLnByZXNzZWQsXG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgYXJpYS1wcmVzc2VkPXt0aGlzLnByb3BzLnByZXNzZWR9XG4gICAgICAgICAgICAgICAgb25LZXlEb3duPXt0aGlzLmhhbmRsZUtleURvd259XG4gICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5oYW5kbGVDbGlja30+XG4gICAgICAgICAgICAgICAge3RoaXMucHJvcHMuY2hpbGRyZW59XG4gICAgICAgICAgICA8L3RoaXMucHJvcHMuY29tcG9uZW50PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL2JvdW5kbGVzcy1idXR0b24vaW5kZXguanMiXSwic291cmNlUm9vdCI6IiJ9 | ||
module.exports=function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var t={};return n.m=e,n.c=t,n.i=function(e){return e},n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},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=3)}([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 r(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}function o(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 s(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 p=t(2),i=t.n(p),u=t(1),a=t.n(u),c=t(0),l=t.n(c),f=Object.assign||function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])}return e},y=function(){function e(e,n){for(var t=0;t<n.length;t++){var r=n[t];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(n,t,r){return t&&e(n.prototype,t),r&&e(n,r),n}}(),d=function(e){function n(){var e,t,s,p;r(this,n);for(var i=arguments.length,u=Array(i),a=0;a<i;a++)u[a]=arguments[a];return t=s=o(this,(e=n.__proto__||Object.getPrototypeOf(n)).call.apply(e,[this].concat(u))),s.handleClick=function(e){s.props.disabled||(s.props.onClick(e),s.fireStatefulCallback(e))},s.handleKeyDown=function(e){if(!s.props.disabled)switch(s.props.onKeyDown(e),e.key){case"Enter":case"Space":e.preventDefault(),s.fireStatefulCallback(e)}},p=t,o(s,p)}return s(n,e),y(n,[{key:"fireStatefulCallback",value:function(e){this.props[this.props.pressed?"onUnpressed":"onPressed"](e)}},{key:"render",value:function(){return i.a.createElement(this.props.component,f({},l()(this.props,n.internalKeys),{className:a()("b-button",this.props.className,{"b-button-pressable":void 0!==this.props.pressed,"b-button-pressed":this.props.pressed}),"aria-pressed":this.props.pressed,role:"button",onKeyDown:this.handleKeyDown,onClick:this.handleClick}),this.props.children)}}]),n}(i.a.PureComponent);d.propTypes={"*":p.PropTypes.any,component:p.PropTypes.oneOfType([p.PropTypes.string,p.PropTypes.func]),onPressed:p.PropTypes.func,onUnpressed:p.PropTypes.func,pressed:p.PropTypes.bool},d.defaultProps={component:"button",onClick:function(){},onKeyDown:function(){},onPressed:function(){},onUnpressed:function(){},pressed:void 0},d.internalKeys=Object.keys(d.defaultProps),n.default=d}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIDZmZTg3MTNiODQzYWNhOTNkMjE3Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiY2xhc3NuYW1lc1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdFwifSIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9ib3VuZGxlc3MtYnV0dG9uL2luZGV4LmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJtb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiaW5zdGFsbGVkTW9kdWxlcyIsImkiLCJsIiwiY2FsbCIsIm0iLCJjIiwidmFsdWUiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJnZXQiLCJuIiwiX19lc01vZHVsZSIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsInJlcXVpcmUiLCJfX3dlYnBhY2tfZXhwb3J0c19fIiwiX2NsYXNzQ2FsbENoZWNrIiwiaW5zdGFuY2UiLCJDb25zdHJ1Y3RvciIsIlR5cGVFcnJvciIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIiwic2VsZiIsIlJlZmVyZW5jZUVycm9yIiwiX2luaGVyaXRzIiwic3ViQ2xhc3MiLCJzdXBlckNsYXNzIiwiY3JlYXRlIiwiY29uc3RydWN0b3IiLCJ3cml0YWJsZSIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fX2RlZmF1bHQiLCJfZXh0ZW5kcyIsImFzc2lnbiIsInRhcmdldCIsImFyZ3VtZW50cyIsImxlbmd0aCIsInNvdXJjZSIsImtleSIsIl9jcmVhdGVDbGFzcyIsImRlZmluZVByb3BlcnRpZXMiLCJwcm9wcyIsImRlc2NyaXB0b3IiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJCdXR0b24iLCJfUmVhY3QkUHVyZUNvbXBvbmVudCIsIl9yZWYiLCJfdGVtcCIsIl90aGlzIiwiX3JldCIsInRoaXMiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImdldFByb3RvdHlwZU9mIiwiYXBwbHkiLCJjb25jYXQiLCJoYW5kbGVDbGljayIsImV2ZW50IiwiZGlzYWJsZWQiLCJvbkNsaWNrIiwiZmlyZVN0YXRlZnVsQ2FsbGJhY2siLCJoYW5kbGVLZXlEb3duIiwib25LZXlEb3duIiwicHJldmVudERlZmF1bHQiLCJwcmVzc2VkIiwiYSIsImNyZWF0ZUVsZW1lbnQiLCJjb21wb25lbnQiLCJpbnRlcm5hbEtleXMiLCJjbGFzc05hbWUiLCJiLWJ1dHRvbi1wcmVzc2FibGUiLCJ1bmRlZmluZWQiLCJiLWJ1dHRvbi1wcmVzc2VkIiwiYXJpYS1wcmVzc2VkIiwicm9sZSIsImNoaWxkcmVuIiwiUHVyZUNvbXBvbmVudCIsInByb3BUeXBlcyIsIioiLCJhbnkiLCJvbmVPZlR5cGUiLCJzdHJpbmciLCJmdW5jIiwib25QcmVzc2VkIiwib25VbnByZXNzZWQiLCJib29sIiwiZGVmYXVsdFByb3BzIiwia2V5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VSxLQUFLVixNQUFNMEIsUUFBVSxjQUFnQixhQUFhUCxNTHdCZzRFdEIsSUFBSSxTQUFTL0MsTUFBTSxXS0FoOUUsTUFDSW9DLEdBQUF5QyxFQUFBQyxjQUFBbEIsS0FBTVYsTUFBTTZCLFVBQVp0QyxLQUNRRCxJQUFLb0IsS0FBS1YsTUFBT0ksRUFBTzBCLGVBQzVCQyxVQUFXM0MsSUFBRyxXQUFZc0IsS0FBS1YsTUFBTStCLFdBQ2pDQyxxQkFBNkNDLFNBQXZCdkIsS0FBS1YsTUFBTTBCLFFBQ2pDUSxtQkFBb0J4QixLQUFLVixNQUFNMEIsVUFFbkNTLGVBQWN6QixLQUFLVixNQUFNMEIsUUFDekJVLEtBQUssU0FDTFosVUFBV2QsS0FBS2EsY0FDaEJGLFFBQVNYLEtBQUtRLGNBQ2JSLEtBQUtWLE1BQU1xQyxjTFh3OUZqQyxHS3JFaDlGbEIsRUFBQXlDLEVBQU1XLGNBQXJCbEMsR0FDVm1DLFdBSUhDLElBQUt2RCxFQUFBLFVBQVV3RCxJQU9mWixVQUFXNUMsRUFBQSxVQUFVeUQsV0FDakJ6RCxFQUFBLFVBQVUwRCxPQUNWMUQsRUFBQSxVQUFVMkQsT0FNZEMsVUFBVzVELEVBQUEsVUFBVTJELEtBS3JCRSxZQUFhN0QsRUFBQSxVQUFVMkQsS0FLdkJsQixRQUFTekMsRUFBQSxVQUFVOEQsTUE5Qk4zQyxFQWlDVjRDLGNBQ0huQixVQUFXLFNBQ1hSLFFBQVMsYUFDVEcsVUFBVyxhQUNYcUIsVUFBVyxhQUNYQyxZQUFhLGFBQ2JwQixRQUFTTyxRQXZDSTdCLEVBMENWMEIsYUFBZTNFLE9BQU84RixLQUFLN0MsRUFBTzRDLGNMMkJndUgvRSxFQUE2QixRS3JFcnhIbUMiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9XG4vKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRpOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGw6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4vKioqKioqLyBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4vKioqKioqLyBcdFx0XHRcdGdldDogZ2V0dGVyXG4vKioqKioqLyBcdFx0XHR9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMyk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIik7XG5cbi8qKiovIH0pLFxuLyogMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpO1xuXG4vKioqLyB9KSxcbi8qIDIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cbi8qKiovIH0pLFxuLyogMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShfX3dlYnBhY2tfZXhwb3J0c19fLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fKTtcbnZhciBfZXh0ZW5kcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0YXJnZXQpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9YXJndW1lbnRzW2ldO2Zvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSxrZXkpKXt0YXJnZXRba2V5XT1zb3VyY2Vba2V5XTt9fX1yZXR1cm4gdGFyZ2V0O307dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoXCJ2YWx1ZVwiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKTt9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcjt9O30oKTtmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7fX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLGNhbGwpe2lmKCFzZWxmKXt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7fXJldHVybiBjYWxsJiYodHlwZW9mIGNhbGw9PT1cIm9iamVjdFwifHx0eXBlb2YgY2FsbD09PVwiZnVuY3Rpb25cIik/Y2FsbDpzZWxmO31mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT1cImZ1bmN0aW9uXCImJnN1cGVyQ2xhc3MhPT1udWxsKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2Ygc3VwZXJDbGFzcyk7fXN1YkNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MmJnN1cGVyQ2xhc3MucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6c3ViQ2xhc3MsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfX0pO2lmKHN1cGVyQ2xhc3MpT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcyxzdXBlckNsYXNzKTpzdWJDbGFzcy5fX3Byb3RvX189c3VwZXJDbGFzczt9dmFyIEJ1dHRvbj1mdW5jdGlvbihfUmVhY3QkUHVyZUNvbXBvbmVudCl7X2luaGVyaXRzKEJ1dHRvbixfUmVhY3QkUHVyZUNvbXBvbmVudCk7ZnVuY3Rpb24gQnV0dG9uKCl7dmFyIF9yZWY7dmFyIF90ZW1wLF90aGlzLF9yZXQ7X2NsYXNzQ2FsbENoZWNrKHRoaXMsQnV0dG9uKTtmb3IodmFyIF9sZW49YXJndW1lbnRzLmxlbmd0aCxhcmdzPUFycmF5KF9sZW4pLF9rZXk9MDtfa2V5PF9sZW47X2tleSsrKXthcmdzW19rZXldPWFyZ3VtZW50c1tfa2V5XTt9cmV0dXJuIF9yZXQ9KF90ZW1wPShfdGhpcz1fcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLChfcmVmPUJ1dHRvbi5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihCdXR0b24pKS5jYWxsLmFwcGx5KF9yZWYsW3RoaXNdLmNvbmNhdChhcmdzKSkpLF90aGlzKSxfdGhpcy5oYW5kbGVDbGljaz1mdW5jdGlvbihldmVudCl7aWYoX3RoaXMucHJvcHMuZGlzYWJsZWQpe3JldHVybjt9X3RoaXMucHJvcHMub25DbGljayhldmVudCk7X3RoaXMuZmlyZVN0YXRlZnVsQ2FsbGJhY2soZXZlbnQpO30sX3RoaXMuaGFuZGxlS2V5RG93bj1mdW5jdGlvbihldmVudCl7aWYoX3RoaXMucHJvcHMuZGlzYWJsZWQpe3JldHVybjt9X3RoaXMucHJvcHMub25LZXlEb3duKGV2ZW50KTtzd2l0Y2goZXZlbnQua2V5KXtjYXNlJ0VudGVyJzpjYXNlJ1NwYWNlJzpldmVudC5wcmV2ZW50RGVmYXVsdCgpO190aGlzLmZpcmVTdGF0ZWZ1bENhbGxiYWNrKGV2ZW50KTt9fSxfdGVtcCksX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsX3JldCk7fV9jcmVhdGVDbGFzcyhCdXR0b24sW3trZXk6J2ZpcmVTdGF0ZWZ1bENhbGxiYWNrJyx2YWx1ZTpmdW5jdGlvbiBmaXJlU3RhdGVmdWxDYWxsYmFjayhldmVudCl7dGhpcy5wcm9wc1t0aGlzLnByb3BzLnByZXNzZWQ/J29uVW5wcmVzc2VkJzonb25QcmVzc2VkJ10oZXZlbnQpO319LHtrZXk6J3JlbmRlcicsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyKCl7cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KHRoaXMucHJvcHMuY29tcG9uZW50LF9leHRlbmRzKHt9LF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCgpKHRoaXMucHJvcHMsQnV0dG9uLmludGVybmFsS2V5cykse2NsYXNzTmFtZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQoKSgnYi1idXR0b24nLHRoaXMucHJvcHMuY2xhc3NOYW1lLHsnYi1idXR0b24tcHJlc3NhYmxlJzp0aGlzLnByb3BzLnByZXNzZWQhPT11bmRlZmluZWQsJ2ItYnV0dG9uLXByZXNzZWQnOnRoaXMucHJvcHMucHJlc3NlZH0pLCdhcmlhLXByZXNzZWQnOnRoaXMucHJvcHMucHJlc3NlZCxyb2xlOididXR0b24nLG9uS2V5RG93bjp0aGlzLmhhbmRsZUtleURvd24sb25DbGljazp0aGlzLmhhbmRsZUNsaWNrfSksdGhpcy5wcm9wcy5jaGlsZHJlbik7fX1dKTtyZXR1cm4gQnV0dG9uO30oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLlB1cmVDb21wb25lbnQpO0J1dHRvbi5wcm9wVHlwZXM9eycqJzpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5hbnksY29tcG9uZW50Ol9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm9uZU9mVHlwZShbX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc3RyaW5nLF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmNdKSxvblByZXNzZWQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uZnVuYyxvblVucHJlc3NlZDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jLHByZXNzZWQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYm9vbH07QnV0dG9uLmRlZmF1bHRQcm9wcz17Y29tcG9uZW50OididXR0b24nLG9uQ2xpY2s6ZnVuY3Rpb24gb25DbGljaygpe30sb25LZXlEb3duOmZ1bmN0aW9uIG9uS2V5RG93bigpe30sb25QcmVzc2VkOmZ1bmN0aW9uIG9uUHJlc3NlZCgpe30sb25VbnByZXNzZWQ6ZnVuY3Rpb24gb25VbnByZXNzZWQoKXt9LHByZXNzZWQ6dW5kZWZpbmVkfTtCdXR0b24uaW50ZXJuYWxLZXlzPU9iamVjdC5rZXlzKEJ1dHRvbi5kZWZhdWx0UHJvcHMpOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSBCdXR0b247XG5cbi8qKiovIH0pXG4vKioqKioqLyBdKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gaW5kZXguanMiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAzKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCA2ZmU4NzEzYjg0M2FjYTkzZDIxNyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzXCJ9XG4vLyBtb2R1bGUgaWQgPSAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNsYXNzbmFtZXNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJjbGFzc25hbWVzXCJ9XG4vLyBtb2R1bGUgaWQgPSAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn1cbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IFJlYWN0LCB7UHJvcFR5cGVzfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY3ggZnJvbSAnY2xhc3NuYW1lcyc7XG5cbmltcG9ydCBvbWl0IGZyb20gJ2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMnO1xuXG4vKipcbl9fQSBjb250cm9sIHdpdGggXCJwcmVzc2VkXCIgc3RhdGUgc3VwcG9ydC5fX1xuXG5CdXR0b24gaGFzIHR3byBtb2RlcyBvZiBvcGVyYXRpb246XG5cbjEuIHN0YXRlbGVzcyAobGlrZSBhIG5vcm1hbCBgPGJ1dHRvbj5gKVxuICAgYGBganN4XG4gICA8QnV0dG9uIG9uUHJlc3NlZD17ZG9Tb21ldGhpbmd9PmZvbzwvQnV0dG9uPlxuICAgYGBgXG5cbiAgID4gTm90ZSB0aGF0IGluc3RlYWQgb2YgYG9uQ2xpY2tgLCBCdXR0b24gdXNlcyBgb25QcmVzc2VkYC4gVGhpcyBpcyBiZWNhdXNlIHRoZSBjb21wb25lbnQgYWxzbyBsaXN0ZW5zIGZvciBrZXlib2FyZCA8a2JkPkVudGVyPC9rYmQ+IGV2ZW50cywgc28gYG9uQ2xpY2tgIG9ubHkgdGVsbHMgaGFsZiB0aGUgc3RvcnkuIFlvdSBjYW4gc3RpbGwgYmluZCB0byB0aGF0IHBhcnRpY3VsYXIgUmVhY3QgZXZlbnQgdGhvdWdoIGlmIHRoZXJlJ3MgYSBuZWVkIHRvIHRlbGwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBjbGlja3MgYW5kIEVudGVyIHByZXNzZXMuXG5cbjIuIHN0YXRlZnVsIChsaWtlIGEgdG9nZ2xlLCBlLmcuIGJvbGQtbW9kZSBpbiBhIHJpY2ggdGV4dCBlZGl0b3IpXG5cbiAgIFwic3RhdGVmdWxcIiBtb2RlIGlzIHRyaWdnZXJlZCBieSBwYXNzaW5nIGEgYm9vbGVhbiB0byBgcHJvcHMucHJlc3NlZGAuIFRoaXMgZW5hYmxlcyB0aGUgYnV0dG9uIHRvIGFjdCBsaWtlIGEgY29udHJvbGxlZCBjb21wb25lbnQuIFRoZSBgb25VbnByZXNzZWRgIGV2ZW50IGNhbGxiYWNrIHdpbGwgYWxzbyBub3cgYmUgZmlyZWQgd2hlbiBhcHByb3ByaWF0ZS5cblxuICAgYGBganN4XG4gICA8QnV0dG9uXG4gICAgICAgcHJlc3NlZD17dHJ1ZX1cbiAgICAgICBvblByZXNzZWQ9e2RvU29tZXRoaW5nfVxuICAgICAgIG9uVW5wcmVzc2VkPXtkb1NvbWV0aGluZ0Vsc2V9PlxuICAgICAgIGZvb1xuICAgPC9CdXR0b24+XG4gICBgYGBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnV0dG9uIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFueSBbUmVhY3Qtc3VwcG9ydGVkIGF0dHJpYnV0ZV0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90YWdzLWFuZC1hdHRyaWJ1dGVzLmh0bWwjaHRtbC1hdHRyaWJ1dGVzKVxuICAgICAgICAgKi9cbiAgICAgICAgJyonOiBQcm9wVHlwZXMuYW55LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbnkgdmFsaWQgSFRNTCB0YWcgbmFtZSBvciBhIFJlYWN0Q29tcG9uZW50LCBhbnl0aGluZyB0aGF0IGNhbiBiZSBwYXNzZWQgYXMgdGhlXG4gICAgICAgICAqIGZpcnN0IGFyZ3VtZW50IHRvIGBSZWFjdC5jcmVhdGVFbGVtZW50YDsgbm90ZSB0aGF0IHRoaXMgY29tcG9uZW50IHNldHMgdGhlIGByb2xlYCBhbmQgYGFyaWEtY2hlY2tlZGBcbiAgICAgICAgICogYXR0cmlidXRlcyBzbyBub24tYDxidXR0b24+YCBlbGVtZW50cyB3aWxsIHN0aWxsIGJlaGF2ZSBsaWtlIGEgYnV0dG9uIGZvciBzY3JlZW4gcmVhZGVyc1xuICAgICAgICAgKi9cbiAgICAgICAgY29tcG9uZW50OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgICAgIFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICAgICAgICBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgXSksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHVzZSB0aGlzIGNhbGxiYWNrIGluc3RlYWQgb2YgYG9uQ2xpY2tgIChpdCdzIGBvbkNsaWNrYCArIGBvbktleURvd246RW50ZXJgKTsgZmlyZXMgZm9yIGJvdGggYnV0dG9uIG1vZGVzXG4gICAgICAgICAqL1xuICAgICAgICBvblByZXNzZWQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBjYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBiZWNvbWVzIFwidW5wcmVzc2VkXCI7IG9ubHkgZmlyZXMgd2hlbiB0aGUgQnV0dG9uIGlzIGluIHN0YXRlZnVsIG1vZGVcbiAgICAgICAgICovXG4gICAgICAgIG9uVW5wcmVzc2VkOiBQcm9wVHlwZXMuZnVuYyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogcGFzc3Rocm91Z2ggdG8gYGFyaWEtcHJlc3NlZGA7IHVzaW5nIHRoaXMgcHJvcCB0dXJucyBvbiB0aGUgYG9uVW5wcmVzc2VkYCBjYWxsYmFjayB3aGVuIGFwcGxpY2FibGVcbiAgICAgICAgICovXG4gICAgICAgIHByZXNzZWQ6IFByb3BUeXBlcy5ib29sLFxuICAgIH1cblxuICAgIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgICAgIGNvbXBvbmVudDogJ2J1dHRvbicsXG4gICAgICAgIG9uQ2xpY2s6ICgpID0+IHt9LFxuICAgICAgICBvbktleURvd246ICgpID0+IHt9LFxuICAgICAgICBvblByZXNzZWQ6ICgpID0+IHt9LFxuICAgICAgICBvblVucHJlc3NlZDogKCkgPT4ge30sXG4gICAgICAgIHByZXNzZWQ6IHVuZGVmaW5lZCxcbiAgICB9XG5cbiAgICBzdGF0aWMgaW50ZXJuYWxLZXlzID0gT2JqZWN0LmtleXMoQnV0dG9uLmRlZmF1bHRQcm9wcylcblxuICAgIGZpcmVTdGF0ZWZ1bENhbGxiYWNrKGV2ZW50KSB7XG4gICAgICAgIHRoaXMucHJvcHNbdGhpcy5wcm9wcy5wcmVzc2VkID8gJ29uVW5wcmVzc2VkJyA6ICdvblByZXNzZWQnXShldmVudCk7XG4gICAgfVxuXG4gICAgaGFuZGxlQ2xpY2sgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuZGlzYWJsZWQpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgdGhpcy5wcm9wcy5vbkNsaWNrKGV2ZW50KTtcbiAgICAgICAgdGhpcy5maXJlU3RhdGVmdWxDYWxsYmFjayhldmVudCk7XG4gICAgfVxuXG4gICAgaGFuZGxlS2V5RG93biA9IChldmVudCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5kaXNhYmxlZCkgeyByZXR1cm47IH1cblxuICAgICAgICB0aGlzLnByb3BzLm9uS2V5RG93bihldmVudCk7XG5cbiAgICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgICBjYXNlICdTcGFjZSc6XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5maXJlU3RhdGVmdWxDYWxsYmFjayhldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8dGhpcy5wcm9wcy5jb21wb25lbnRcbiAgICAgICAgICAgICAgICB7Li4ub21pdCh0aGlzLnByb3BzLCBCdXR0b24uaW50ZXJuYWxLZXlzKX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KCdiLWJ1dHRvbicsIHRoaXMucHJvcHMuY2xhc3NOYW1lLCB7XG4gICAgICAgICAgICAgICAgICAgICdiLWJ1dHRvbi1wcmVzc2FibGUnOiB0aGlzLnByb3BzLnByZXNzZWQgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgJ2ItYnV0dG9uLXByZXNzZWQnOiB0aGlzLnByb3BzLnByZXNzZWQsXG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgYXJpYS1wcmVzc2VkPXt0aGlzLnByb3BzLnByZXNzZWR9XG4gICAgICAgICAgICAgICAgcm9sZT0nYnV0dG9uJ1xuICAgICAgICAgICAgICAgIG9uS2V5RG93bj17dGhpcy5oYW5kbGVLZXlEb3dufVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuaGFuZGxlQ2xpY2t9PlxuICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLmNoaWxkcmVufVxuICAgICAgICAgICAgPC90aGlzLnByb3BzLmNvbXBvbmVudD5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9ib3VuZGxlc3MtYnV0dG9uL2luZGV4LmpzIl0sInNvdXJjZVJvb3QiOiIifQ== |
@@ -6,7 +6,3 @@ import React, {PropTypes} from 'react'; | ||
const isFunction = (x) => typeof x === 'function'; | ||
const noop = () => {}; | ||
/** | ||
# Button | ||
__A control with "pressed" state support.__ | ||
@@ -25,3 +21,3 @@ | ||
"stateful" mode is triggered by passing a boolean to `pressed`. This enables the button to act like a controlled component. The `onUnpressed` event callback will also now be fired when appropriate. | ||
"stateful" mode is triggered by passing a boolean to `props.pressed`. This enables the button to act like a controlled component. The `onUnpressed` event callback will also now be fired when appropriate. | ||
@@ -39,7 +35,12 @@ ```jsx | ||
static propTypes = { | ||
children: PropTypes.node, | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
'*': PropTypes.any, | ||
/** | ||
Any valid HTML tag name or a React component factory, anything that can be passed as the first argument to `React.createElement` | ||
*/ | ||
* Any valid HTML tag name or a ReactComponent, anything that can be passed as the | ||
* first argument to `React.createElement`; note that this component sets the `role` and `aria-checked` | ||
* attributes so non-`<button>` elements will still behave like a button for screen readers | ||
*/ | ||
component: PropTypes.oneOfType([ | ||
@@ -50,6 +51,4 @@ PropTypes.string, | ||
onClick: PropTypes.func, | ||
/** | ||
* called when the element becomes "pressed" or triggered by the user (mouse or keyboard); backing data must be updated to persist the state change; this function will still be called if `props.pressed` is not passed | ||
* use this callback instead of `onClick` (it's `onClick` + `onKeyDown:Enter`); fires for both button modes | ||
*/ | ||
@@ -59,3 +58,3 @@ onPressed: PropTypes.func, | ||
/** | ||
* called when the element becomes "unpressed"; backing data must be updated to persist the state change | ||
* called when the element becomes "unpressed"; only fires when the Button is in stateful mode | ||
*/ | ||
@@ -65,3 +64,3 @@ onUnpressed: PropTypes.func, | ||
/** | ||
* enables "pressed" support and adds the `aria-pressed` attribute to the `.b-button` node; essentially a "stateful" button (see the "unpressed/pressed" example demo above) | ||
* passthrough to `aria-pressed`; using this prop turns on the `onUnpressed` callback when applicable | ||
*/ | ||
@@ -72,7 +71,7 @@ pressed: PropTypes.bool, | ||
static defaultProps = { | ||
children: null, | ||
component: 'button', | ||
onClick: noop, | ||
onPressed: noop, | ||
onUnpressed: noop, | ||
onClick: () => {}, | ||
onKeyDown: () => {}, | ||
onPressed: () => {}, | ||
onUnpressed: () => {}, | ||
pressed: undefined, | ||
@@ -83,3 +82,3 @@ } | ||
toggleState(event) { | ||
fireStatefulCallback(event) { | ||
this.props[this.props.pressed ? 'onUnpressed' : 'onPressed'](event); | ||
@@ -91,7 +90,4 @@ } | ||
this.toggleState(event); | ||
if (isFunction(this.props.onClick)) { | ||
this.props.onClick(event); | ||
} | ||
this.props.onClick(event); | ||
this.fireStatefulCallback(event); | ||
} | ||
@@ -102,2 +98,4 @@ | ||
this.props.onKeyDown(event); | ||
switch (event.key) { | ||
@@ -107,8 +105,4 @@ case 'Enter': | ||
event.preventDefault(); | ||
this.toggleState(event); | ||
this.fireStatefulCallback(event); | ||
} | ||
if (isFunction(this.props.onKeyDown)) { | ||
this.props.onKeyDown(event); | ||
} | ||
} | ||
@@ -120,8 +114,8 @@ | ||
{...omit(this.props, Button.internalKeys)} | ||
ref='button' | ||
className={cx('b-button', this.props.className, { | ||
'b-button-pressable': typeof this.props.pressed !== 'undefined', | ||
'b-button-pressable': this.props.pressed !== undefined, | ||
'b-button-pressed': this.props.pressed, | ||
})} | ||
aria-pressed={this.props.pressed} | ||
role='button' | ||
onKeyDown={this.handleKeyDown} | ||
@@ -128,0 +122,0 @@ onClick={this.handleClick}> |
{ | ||
"name": "boundless-button", | ||
"version": "1.0.0-beta.5", | ||
"version": "1.0.0-beta.7", | ||
"description": "A control with \"pressed\" state support.", | ||
@@ -30,3 +30,3 @@ "main": "build/index.js", | ||
"classnames": "^2.1.5", | ||
"boundless-utils-omit-keys": "^1.0.0-beta.3" | ||
"boundless-utils-omit-keys": "^1.0.0-beta.7" | ||
}, | ||
@@ -33,0 +33,0 @@ "peerDependencies": { |
@@ -0,4 +1,6 @@ | ||
<!--- | ||
THIS IS AN AUTOGENERATED FILE. EDIT INDEX.JS INSTEAD. | ||
--> | ||
# Button | ||
# Button | ||
__A control with "pressed" state support.__ | ||
@@ -17,3 +19,3 @@ | ||
"stateful" mode is triggered by passing a boolean to `pressed`. This enables the button to act like a controlled component. The `onUnpressed` event callback will also now be fired when appropriate. | ||
"stateful" mode is triggered by passing a boolean to `props.pressed`. This enables the button to act like a controlled component. The `onUnpressed` event callback will also now be fired when appropriate. | ||
@@ -29,5 +31,55 @@ ```jsx | ||
## Example Usage | ||
```jsx | ||
import React from 'react'; | ||
import Button from '../index'; | ||
export default class ButtonDemo extends React.PureComponent { | ||
state = { | ||
pressed: false, | ||
} | ||
handleClick = () => { | ||
// eslint-disable-next-line no-alert | ||
alert('A single-click was detected.'); | ||
} | ||
handlePressed = () => { | ||
this.setState({pressed: true}); | ||
} | ||
handleUnpressed = () => { | ||
this.setState({pressed: false}); | ||
} | ||
render() { | ||
return ( | ||
<div> | ||
<Button onPressed={this.handleClick}> | ||
Click Me | ||
</Button> | ||
<Button | ||
onPressed={this.handlePressed} | ||
onUnpressed={this.handleUnpressed} | ||
pressed={this.state.pressed}> | ||
{this.state.pressed ? 'Pressed' : 'Unpressed'} | ||
</Button> | ||
<Button | ||
onPressed={this.handleClick} | ||
disabled={true}> | ||
Disabled | ||
</Button> | ||
</div> | ||
); | ||
} | ||
} | ||
``` | ||
## Props | ||
_Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/Button#props)._ | ||
> Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/Button#props). | ||
@@ -41,54 +93,50 @@ ### Required Props | ||
<table> | ||
<tr> | ||
<th>Name</th> | ||
<th>Type</th> | ||
<th>Default Value</th> | ||
<th>Description</th> | ||
</tr> | ||
- __`*`__ ・ any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
<tr> | ||
<td>children</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td></td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any` | `n/a` | ||
<tr> | ||
<td>component</td> | ||
<td><pre><code>string or function</code></pre></td> | ||
<td><pre><code class="language-js">'button'</code></pre></td> | ||
<td>Any valid HTML tag name or a React component factory, anything that can be passed as the first argument to `React.createElement`</td> | ||
</tr> | ||
- __`component`__ ・ any valid HTML tag name or a ReactComponent, anything that can be passed as the | ||
first argument to `React.createElement`; note that this component sets the `role` and `aria-checked` | ||
attributes so non-`<button>` elements will still behave like a button for screen readers | ||
<tr> | ||
<td>onClick</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">() => {}</code></pre></td> | ||
<td></td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`string or function` | `'button'` | ||
<tr> | ||
<td>onPressed</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">() => {}</code></pre></td> | ||
<td>called when the element becomes "pressed" or triggered by the user (mouse or keyboard); backing data must be updated to persist the state change; this function will still be called if `props.pressed` is not passed</td> | ||
</tr> | ||
- __`onPressed`__ ・ use this callback instead of `onClick` (it's `onClick` + `onKeyDown:Enter`); fires for both button modes | ||
<tr> | ||
<td>onUnpressed</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">() => {}</code></pre></td> | ||
<td>called when the element becomes "unpressed"; backing data must be updated to persist the state change</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`function` | `() => {}` | ||
<tr> | ||
<td>pressed</td> | ||
<td><pre><code>bool</code></pre></td> | ||
<td><pre><code class="language-js">undefined</code></pre></td> | ||
<td>enables "pressed" support and adds the `aria-pressed` attribute to the `.b-button` node; essentially a "stateful" button (see the "unpressed/pressed" example demo above)</td> | ||
</tr> | ||
- __`onUnpressed`__ ・ called when the element becomes "unpressed"; only fires when the Button is in stateful mode | ||
</table> | ||
Expects | Default Value | ||
- | - | ||
`function` | `() => {}` | ||
- __`pressed`__ ・ passthrough to `aria-pressed`; using this prop turns on the `onUnpressed` callback when applicable | ||
Expects | Default Value | ||
- | - | ||
`bool` | `undefined` | ||
## Reference Styles | ||
### Stylus | ||
```stylus | ||
// Bring in Boundless's base Stylus variables | ||
@require "node_modules/boundless-button/variables" | ||
// Redefine any variables as desired, e.g. | ||
color-accent = royalblue | ||
// Bring in the component styles; they will be autoconfigured based on the above | ||
@require "node_modules/boundless-button/style" | ||
``` | ||
### CSS | ||
If desired, a precompiled plain CSS stylesheet is available for customization at `/build/style.css`, based on Boundless's [default variables](https://github.com/enigma-io/boundless/blob/master/variables.styl). | ||
@@ -1,2 +0,2 @@ | ||
module.exports=function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=5)}([function(e,t,n){"use strict";function r(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Object.keys(e).reduce(function(n,r){return t.indexOf(r)===-1&&(n[r]=e[r]),n},{})}t.a=r},function(e,t,n){"use strict";function r(){return"b-"+([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,function(e){return(e^16*Math.random()>>e/4).toString(16)})}t.a=r},function(e,t){e.exports=require("boundless-checkbox")},function(e,t){e.exports=require("classnames")},function(e,t){e.exports=require("react")},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var l=n(4),c=n.n(l),i=n(3),p=n.n(i),u=n(2),a=n.n(u),f=n(0),h=n(1),d=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},y=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),P=function(){},b=function(e){function t(){return r(this,t),o(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return s(t,e),y(t,[{key:"allItemsChecked",value:function(){return this.props.items.every(function(e){return e.inputProps.checked===!0})}},{key:"anyItemsChecked",value:function(){return this.props.items.some(function(e){return e.inputProps.checked===!0})}},{key:"renderSelectAll",value:function(){if(this.props.selectAll){var e=this.allItemsChecked(),t=this.props.selectAllProps.inputProps;return c.a.createElement(a.a,d({},this.props.selectAllProps,{ref:"select_all",key:"cb_select_all",className:p()("b-checkbox-group-selectall",this.props.selectAllProps.className),inputProps:d({},t,{checked:e,indeterminate:!e&&this.anyItemsChecked(),name:t&&t.name?t.name:"cb_select_all"}),label:this.props.selectAllProps.label||"Select All",onChecked:this.props.onAllChecked,onUnchecked:this.props.onAllUnchecked}))}}},{key:"renderCheckboxes",value:function(){var e=this;return this.props.items.map(function(t){return c.a.createElement(a.a,d({},t,{key:t.inputProps.name,onChecked:e.props.onChildChecked,onUnchecked:e.props.onChildUnchecked}))})}},{key:"renderChildren",value:function(){var e=[this.renderCheckboxes()];if(this.props.selectAll&&this.props.selectAllPosition)switch(this.props.selectAllPosition){case t.selectAllPosition.BEFORE:e.unshift(this.renderSelectAll());break;case t.selectAllPosition.AFTER:e.push(this.renderSelectAll())}return e}},{key:"render",value:function(){return c.a.createElement("div",d({},n.i(f.a)(this.props,t.internalKeys),{ref:"group",className:p()("b-checkbox-group",this.props.className)}),this.renderChildren())}}]),t}(c.a.PureComponent);b.selectAllPosition={BEFORE:n.i(h.a)(),AFTER:n.i(h.a)()},b.propTypes={items:l.PropTypes.arrayOf(a.a.propTypes.inputProps).isRequired,onAllChecked:l.PropTypes.func,onAllUnchecked:l.PropTypes.func,onChildChecked:l.PropTypes.func,onChildUnchecked:l.PropTypes.func,selectAll:l.PropTypes.bool,selectAllProps:l.PropTypes.shape({label:l.PropTypes.string,inputProps:l.PropTypes.object}),selectAllPosition:l.PropTypes.oneOf([b.selectAllPosition.BEFORE,b.selectAllPosition.AFTER])},b.defaultProps={items:[],onAllChecked:P,onAllUnchecked:P,onChildChecked:P,onChildUnchecked:P,selectAll:!1,selectAllProps:{},selectAllPosition:b.selectAllPosition.BEFORE},b.internalKeys=Object.keys(b.defaultProps),t.default=b}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIGE0MDdiMWQ3M2Y2NWYwMGI1MGYxIiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvYm91bmRsZXNzLXV0aWxzLXV1aWQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLWNoZWNrYm94XCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImNsYXNzbmFtZXNcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn0iLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvYm91bmRsZXNzLWNoZWNrYm94LWdyb3VwL2luZGV4LmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJtb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiaW5zdGFsbGVkTW9kdWxlcyIsImkiLCJsIiwiY2FsbCIsIm0iLCJjIiwidmFsdWUiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJnZXQiLCJuIiwiX19lc01vZHVsZSIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsIl9fd2VicGFja19leHBvcnRzX18iLCJvbWl0S2V5c0Zyb21Tb3VyY2VPYmplY3QiLCJzb3VyY2UiLCJvbWl0dGVkS2V5cyIsImFyZ3VtZW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsImtleXMiLCJyZWR1Y2UiLCJoYXNoIiwia2V5IiwiaW5kZXhPZiIsInV1aWQiLCJyZXBsYWNlIiwiYSIsIk1hdGgiLCJyYW5kb20iLCJ0b1N0cmluZyIsInJlcXVpcmUiLCJfY2xhc3NDYWxsQ2hlY2siLCJpbnN0YW5jZSIsIkNvbnN0cnVjdG9yIiwiVHlwZUVycm9yIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJzZWxmIiwiUmVmZXJlbmNlRXJyb3IiLCJfaW5oZXJpdHMiLCJzdWJDbGFzcyIsInN1cGVyQ2xhc3MiLCJjcmVhdGUiLCJjb25zdHJ1Y3RvciIsIndyaXRhYmxlIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc19jaGVja2JveF9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc19jaGVja2JveF9fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X2JvdW5kbGVzc191dGlsc191dWlkX18iLCJfZXh0ZW5kcyIsImFzc2lnbiIsInRhcmdldCIsIl9jcmVhdGVDbGFzcyIsImRlZmluZVByb3BlcnRpZXMiLCJwcm9wcyIsImRlc2NyaXB0b3IiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJub29wIiwiQ2hlY2tib3hHcm91cCIsIl9SZWFjdCRQdXJlQ29tcG9uZW50IiwidGhpcyIsImdldFByb3RvdHlwZU9mIiwiYXBwbHkiLCJpdGVtcyIsImV2ZXJ5IiwiaXRlbSIsImlucHV0UHJvcHMiLCJjaGVja2VkIiwic29tZSIsInNlbGVjdEFsbCIsImFsbENoZWNrZWQiLCJhbGxJdGVtc0NoZWNrZWQiLCJzZWxlY3RBbGxQcm9wcyIsImNyZWF0ZUVsZW1lbnQiLCJyZWYiLCJjbGFzc05hbWUiLCJpbmRldGVybWluYXRlIiwiYW55SXRlbXNDaGVja2VkIiwibGFiZWwiLCJvbkNoZWNrZWQiLCJvbkFsbENoZWNrZWQiLCJvblVuY2hlY2tlZCIsIm9uQWxsVW5jaGVja2VkIiwiX3RoaXMyIiwibWFwIiwib25DaGlsZENoZWNrZWQiLCJvbkNoaWxkVW5jaGVja2VkIiwidG9CZVJlbmRlcmVkIiwicmVuZGVyQ2hlY2tib3hlcyIsInNlbGVjdEFsbFBvc2l0aW9uIiwiQkVGT1JFIiwidW5zaGlmdCIsInJlbmRlclNlbGVjdEFsbCIsIkFGVEVSIiwicHVzaCIsImludGVybmFsS2V5cyIsInJlbmRlckNoaWxkcmVuIiwiUHVyZUNvbXBvbmVudCIsInByb3BUeXBlcyIsImFycmF5T2YiLCJpc1JlcXVpcmVkIiwiZnVuYyIsImJvb2wiLCJzaGFwZSIsInN0cmluZyIsIm9uZU9mIiwiZGVmYXVsdFByb3BzIl0sIm1hcHBpbmdzIjoiQUFBQUEsT0FBT0MsUUFDRSxTQUFVQyxHQ0duQixRQUFBQyxHQUFBQyxHQUdBLEdBQUFDLEVBQUFELEdBQ0EsTUFBQUMsR0FBQUQsR0FBQUgsT0FHQSxJQUFBRCxHQUFBSyxFQUFBRCxJQUNBRSxFQUFBRixFQUNBRyxHQUFBLEVBQ0FOLFdBVUEsT0FOQUMsR0FBQUUsR0FBQUksS0FBQVIsRUFBQUMsUUFBQUQsSUFBQUMsUUFBQUUsR0FHQUgsRUFBQU8sR0FBQSxFQUdBUCxFQUFBQyxRQXZCQSxHQUFBSSxLQStEQSxPQW5DQUYsR0FBQU0sRUFBQVAsRUFHQUMsRUFBQU8sRUFBQUwsRUFHQUYsRUFBQUcsRUFBQSxTQUFBSyxHQUEyQyxNQUFBQSxJQUczQ1IsRUFBQVMsRUFBQSxTQUFBWCxFQUFBWSxFQUFBQyxHQUNBWCxFQUFBWSxFQUFBZCxFQUFBWSxJQUNBRyxPQUFBQyxlQUFBaEIsRUFBQVksR0FDQUssY0FBQSxFQUNBQyxZQUFBLEVBQ0FDLElBQUFOLEtBTUFYLEVBQUFrQixF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NkUsY0FBNUJ2QyxHQUNWK0IsbUJBQ0hDLE9BQVE5RyxFQUFBRyxFQUFBZ0UsRUFBQSxLQUNSOEMsTUFBT2pILEVBQUFHLEVBQUFnRSxFQUFBLE1BSE1XLEVBTVZ3QyxXQUlIbkMsTUFBT3ZCLEVBQUEsVUFBVTJELFFBQVF0RCxFQUFBekIsRUFBUzhFLFVBQVVoQyxZQUFZa0MsV0FLeERwQixhQUFjeEMsRUFBQSxVQUFVNkQsS0FLeEJuQixlQUFnQjFDLEVBQUEsVUFBVTZELEtBSzFCaEIsZUFBZ0I3QyxFQUFBLFVBQVU2RCxLQUsxQmYsaUJBQWtCOUMsRUFBQSxVQUFVNkQsS0FLNUJoQyxVQUFXN0IsRUFBQSxVQUFVOEQsS0FLckI5QixlQUFnQmhDLEVBQUEsVUFBVStELE9BSXRCekIsTUFBT3RDLEVBQUEsVUFBVWdFLE9BQ2pCdEMsV0FBWTFCLEVBQUEsVUFBVXhDLFNBRzFCeUYsa0JBQW1CakQsRUFBQSxVQUFVaUUsT0FDekIvQyxFQUFjK0Isa0JBQWtCQyxPQUNoQ2hDLEVBQWMrQixrQkFBa0JJLFNBbER2Qm5DLEVBc0RWZ0QsY0FDSDNDLFNBQ0FpQixhQUFjdkIsRUFDZHlCLGVBQWdCekIsRUFDaEI0QixlQUFnQjVCLEVBQ2hCNkIsaUJBQWtCN0IsRUFDbEJZLFdBQVcsRUFDWEcsa0JBQ0FpQixrQkFBbUIvQixFQUFjK0Isa0JBQWtCQyxRQTlEdENoQyxFQWlFVnFDLGFBQWV0RyxPQUFPb0IsS0FBSzZDLEVBQWNnRCxjUG9DdStLcEcsRUFBNkIsUU9yR25pTG9EIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPVxuLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbi8qKioqKiovIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuLyoqKioqKi8gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuLyoqKioqKi8gXHRcdFx0XHRnZXQ6IGdldHRlclxuLyoqKioqKi8gXHRcdFx0fSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4vKioqKioqLyBcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDUpO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgZXhwb3J0IChpbW11dGFibGUpICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gb21pdEtleXNGcm9tU291cmNlT2JqZWN0O1xuZnVuY3Rpb24gb21pdEtleXNGcm9tU291cmNlT2JqZWN0KHNvdXJjZSl7dmFyIG9taXR0ZWRLZXlzPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dW5kZWZpbmVkP2FyZ3VtZW50c1sxXTpbXTtyZXR1cm4gT2JqZWN0LmtleXMoc291cmNlKS5yZWR1Y2UoZnVuY3Rpb24gcmVsb2NhdGVBY2NlcHRlZEtleXMoaGFzaCxrZXkpe2lmKG9taXR0ZWRLZXlzLmluZGV4T2Yoa2V5KT09PS0xKXtoYXNoW2tleV09c291cmNlW2tleV07fXJldHVybiBoYXNoO30se30pO31cblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBleHBvcnQgKGltbXV0YWJsZSkgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSB1dWlkO1xuZnVuY3Rpb24gdXVpZCgpe3JldHVybidiLScrKFsxZTddKy0xZTMrLTRlMystOGUzKy0xZTExKS5yZXBsYWNlKC9bMDE4XS9nLGZ1bmN0aW9uKGEpe3JldHVybihhXk1hdGgucmFuZG9tKCkqMTY+PmEvNCkudG9TdHJpbmcoMTYpO30pO31cblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy1jaGVja2JveFwiKTtcblxuLyoqKi8gfSksXG4vKiAzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNsYXNzbmFtZXNcIik7XG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxuLyoqKi8gfSksXG4vKiA1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KF9fd2VicGFja19leHBvcnRzX18sIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc19jaGVja2JveF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX2NoZWNrYm94X19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX2NoZWNrYm94X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfdXRpbHNfdXVpZF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcbnZhciBfZXh0ZW5kcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0YXJnZXQpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9YXJndW1lbnRzW2ldO2Zvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSxrZXkpKXt0YXJnZXRba2V5XT1zb3VyY2Vba2V5XTt9fX1yZXR1cm4gdGFyZ2V0O307dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoXCJ2YWx1ZVwiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKTt9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcjt9O30oKTtmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7fX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLGNhbGwpe2lmKCFzZWxmKXt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7fXJldHVybiBjYWxsJiYodHlwZW9mIGNhbGw9PT1cIm9iamVjdFwifHx0eXBlb2YgY2FsbD09PVwiZnVuY3Rpb25cIik/Y2FsbDpzZWxmO31mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT1cImZ1bmN0aW9uXCImJnN1cGVyQ2xhc3MhPT1udWxsKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2Ygc3VwZXJDbGFzcyk7fXN1YkNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MmJnN1cGVyQ2xhc3MucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6c3ViQ2xhc3MsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfX0pO2lmKHN1cGVyQ2xhc3MpT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcyxzdXBlckNsYXNzKTpzdWJDbGFzcy5fX3Byb3RvX189c3VwZXJDbGFzczt9dmFyIG5vb3A9ZnVuY3Rpb24gbm9vcCgpe307dmFyIENoZWNrYm94R3JvdXA9ZnVuY3Rpb24oX1JlYWN0JFB1cmVDb21wb25lbnQpe19pbmhlcml0cyhDaGVja2JveEdyb3VwLF9SZWFjdCRQdXJlQ29tcG9uZW50KTtmdW5jdGlvbiBDaGVja2JveEdyb3VwKCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsQ2hlY2tib3hHcm91cCk7cmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKENoZWNrYm94R3JvdXAuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ2hlY2tib3hHcm91cCkpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSk7fV9jcmVhdGVDbGFzcyhDaGVja2JveEdyb3VwLFt7a2V5OidhbGxJdGVtc0NoZWNrZWQnLHZhbHVlOmZ1bmN0aW9uIGFsbEl0ZW1zQ2hlY2tlZCgpe3JldHVybiB0aGlzLnByb3BzLml0ZW1zLmV2ZXJ5KGZ1bmN0aW9uKGl0ZW0pe3JldHVybiBpdGVtLmlucHV0UHJvcHMuY2hlY2tlZD09PXRydWU7fSk7fX0se2tleTonYW55SXRlbXNDaGVja2VkJyx2YWx1ZTpmdW5jdGlvbiBhbnlJdGVtc0NoZWNrZWQoKXtyZXR1cm4gdGhpcy5wcm9wcy5pdGVtcy5zb21lKGZ1bmN0aW9uKGl0ZW0pe3JldHVybiBpdGVtLmlucHV0UHJvcHMuY2hlY2tlZD09PXRydWU7fSk7fX0se2tleToncmVuZGVyU2VsZWN0QWxsJyx2YWx1ZTpmdW5jdGlvbiByZW5kZXJTZWxlY3RBbGwoKXtpZih0aGlzLnByb3BzLnNlbGVjdEFsbCl7dmFyIGFsbENoZWNrZWQ9dGhpcy5hbGxJdGVtc0NoZWNrZWQoKTt2YXIgaW5wdXRQcm9wcz10aGlzLnByb3BzLnNlbGVjdEFsbFByb3BzLmlucHV0UHJvcHM7cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfY2hlY2tib3hfX19kZWZhdWx0LmEsX2V4dGVuZHMoe30sdGhpcy5wcm9wcy5zZWxlY3RBbGxQcm9wcyx7cmVmOidzZWxlY3RfYWxsJyxrZXk6J2NiX3NlbGVjdF9hbGwnLGNsYXNzTmFtZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQoKSgnYi1jaGVja2JveC1ncm91cC1zZWxlY3RhbGwnLHRoaXMucHJvcHMuc2VsZWN0QWxsUHJvcHMuY2xhc3NOYW1lKSxpbnB1dFByb3BzOl9leHRlbmRzKHt9LGlucHV0UHJvcHMse2NoZWNrZWQ6YWxsQ2hlY2tlZCxpbmRldGVybWluYXRlOiFhbGxDaGVja2VkJiZ0aGlzLmFueUl0ZW1zQ2hlY2tlZCgpLG5hbWU6aW5wdXRQcm9wcyYmaW5wdXRQcm9wcy5uYW1lP2lucHV0UHJvcHMubmFtZTonY2Jfc2VsZWN0X2FsbCd9KSxsYWJlbDp0aGlzLnByb3BzLnNlbGVjdEFsbFByb3BzLmxhYmVsfHwnU2VsZWN0IEFsbCcsb25DaGVja2VkOnRoaXMucHJvcHMub25BbGxDaGVja2VkLG9uVW5jaGVja2VkOnRoaXMucHJvcHMub25BbGxVbmNoZWNrZWR9KSk7fX19LHtrZXk6J3JlbmRlckNoZWNrYm94ZXMnLHZhbHVlOmZ1bmN0aW9uIHJlbmRlckNoZWNrYm94ZXMoKXt2YXIgX3RoaXMyPXRoaXM7cmV0dXJuIHRoaXMucHJvcHMuaXRlbXMubWFwKGZ1bmN0aW9uKGl0ZW0pe3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX2NoZWNrYm94X19fZGVmYXVsdC5hLF9leHRlbmRzKHt9LGl0ZW0se2tleTppdGVtLmlucHV0UHJvcHMubmFtZSxvbkNoZWNrZWQ6X3RoaXMyLnByb3BzLm9uQ2hpbGRDaGVja2VkLG9uVW5jaGVja2VkOl90aGlzMi5wcm9wcy5vbkNoaWxkVW5jaGVja2VkfSkpO30pO319LHtrZXk6J3JlbmRlckNoaWxkcmVuJyx2YWx1ZTpmdW5jdGlvbiByZW5kZXJDaGlsZHJlbigpe3ZhciB0b0JlUmVuZGVyZWQ9W3RoaXMucmVuZGVyQ2hlY2tib3hlcygpXTtpZih0aGlzLnByb3BzLnNlbGVjdEFsbCYmdGhpcy5wcm9wcy5zZWxlY3RBbGxQb3NpdGlvbil7c3dpdGNoKHRoaXMucHJvcHMuc2VsZWN0QWxsUG9zaXRpb24pe2Nhc2UgQ2hlY2tib3hHcm91cC5zZWxlY3RBbGxQb3NpdGlvbi5CRUZPUkU6dG9CZVJlbmRlcmVkLnVuc2hpZnQodGhpcy5yZW5kZXJTZWxlY3RBbGwoKSk7YnJlYWs7Y2FzZSBDaGVja2JveEdyb3VwLnNlbGVjdEFsbFBvc2l0aW9uLkFGVEVSOnRvQmVSZW5kZXJlZC5wdXNoKHRoaXMucmVuZGVyU2VsZWN0QWxsKCkpO2JyZWFrO319cmV0dXJuIHRvQmVSZW5kZXJlZDt9fSx7a2V5OidyZW5kZXInLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudCgnZGl2JyxfZXh0ZW5kcyh7fSxfX3dlYnBhY2tfcmVxdWlyZV9fLmkoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkodGhpcy5wcm9wcyxDaGVja2JveEdyb3VwLmludGVybmFsS2V5cykse3JlZjonZ3JvdXAnLGNsYXNzTmFtZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQoKSgnYi1jaGVja2JveC1ncm91cCcsdGhpcy5wcm9wcy5jbGFzc05hbWUpfSksdGhpcy5yZW5kZXJDaGlsZHJlbigpKTt9fV0pO3JldHVybiBDaGVja2JveEdyb3VwO30oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLlB1cmVDb21wb25lbnQpO0NoZWNrYm94R3JvdXAuc2VsZWN0QWxsUG9zaXRpb249e0JFRk9SRTpfX3dlYnBhY2tfcmVxdWlyZV9fLmkoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X2JvdW5kbGVzc191dGlsc191dWlkX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKCksQUZURVI6X193ZWJwYWNrX3JlcXVpcmVfXy5pKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfdXRpbHNfdXVpZF9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKSgpfTtDaGVja2JveEdyb3VwLnByb3BUeXBlcz17aXRlbXM6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYXJyYXlPZihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX2NoZWNrYm94X19fZGVmYXVsdC5hLnByb3BUeXBlcy5pbnB1dFByb3BzKS5pc1JlcXVpcmVkLG9uQWxsQ2hlY2tlZDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jLG9uQWxsVW5jaGVja2VkOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmMsb25DaGlsZENoZWNrZWQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uZnVuYyxvbkNoaWxkVW5jaGVja2VkOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmMsc2VsZWN0QWxsOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmJvb2wsc2VsZWN0QWxsUHJvcHM6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc2hhcGUoe2xhYmVsOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLnN0cmluZyxpbnB1dFByb3BzOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm9iamVjdH0pLHNlbGVjdEFsbFBvc2l0aW9uOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm9uZU9mKFtDaGVja2JveEdyb3VwLnNlbGVjdEFsbFBvc2l0aW9uLkJFRk9SRSxDaGVja2JveEdyb3VwLnNlbGVjdEFsbFBvc2l0aW9uLkFGVEVSXSl9O0NoZWNrYm94R3JvdXAuZGVmYXVsdFByb3BzPXtpdGVtczpbXSxvbkFsbENoZWNrZWQ6bm9vcCxvbkFsbFVuY2hlY2tlZDpub29wLG9uQ2hpbGRDaGVja2VkOm5vb3Asb25DaGlsZFVuY2hlY2tlZDpub29wLHNlbGVjdEFsbDpmYWxzZSxzZWxlY3RBbGxQcm9wczp7fSxzZWxlY3RBbGxQb3NpdGlvbjpDaGVja2JveEdyb3VwLnNlbGVjdEFsbFBvc2l0aW9uLkJFRk9SRX07Q2hlY2tib3hHcm91cC5pbnRlcm5hbEtleXM9T2JqZWN0LmtleXMoQ2hlY2tib3hHcm91cC5kZWZhdWx0UHJvcHMpOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSBDaGVja2JveEdyb3VwO1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGluZGV4LmpzIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbiBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gNSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgYTQwN2IxZDczZjY1ZjAwYjUwZjEiLCIvKipcbiAqIFJldHVybnMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBzdXBwbGllZCBvYmplY3Qgd2l0aG91dCB0aGUgZ2l2ZW4ga2V5cy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb21pdEtleXNGcm9tU291cmNlT2JqZWN0KHNvdXJjZSwgb21pdHRlZEtleXMgPSBbXSkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhzb3VyY2UpLnJlZHVjZShmdW5jdGlvbiByZWxvY2F0ZUFjY2VwdGVkS2V5cyhoYXNoLCBrZXkpIHtcbiAgICAgICAgaWYgKG9taXR0ZWRLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpIHtcbiAgICAgICAgICAgIGhhc2hba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhc2g7XG4gICAgfSwge30pO1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvYm91bmRsZXNzLXV0aWxzLW9taXQta2V5cy9pbmRleC5qcyIsIi8qKlxuICogR2VuZXJhdGVzIGEgdW5pcXVlIElELiBBZGRzIGEgcHJlZml4IHNvIGl0IGlzIHN1aXRhYmxlIGZvciB1c2UgYXMgYW4gSFRNTCBJRC5cbiAqIEJhc2VkIG9uIHtAbGluayBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9qZWQvOTgyODgzIHRoaXMgaW1wbGVtZW50YXRpb259LlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gYSB1bmlxdWUgaWRlbnRpZmllclxuICpcbiAqIEBleGFtcGxlXG4gKiB1dWlkKCk7IC8vIGItMWYyY2QyN2YtMDc1NC00MzQ0LTlkMjAtNDM2YTIwMWIyZjgwXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHV1aWQoKSB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgKi9cbiAgICByZXR1cm4gJ2ItJyArIChbMWU3XSstMWUzKy00ZTMrLThlMystMWUxMSkucmVwbGFjZSgvWzAxOF0vZyxhPT4oYV5NYXRoLnJhbmRvbSgpKjE2Pj5hLzQpLnRvU3RyaW5nKDE2KSk7XG4gICAgLyogZXNsaW50LWVuYWJsZSAqL1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvYm91bmRsZXNzLXV0aWxzLXV1aWQvaW5kZXguanMiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtY2hlY2tib3hcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtY2hlY2tib3hcIn1cbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2xhc3NuYW1lc1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImNsYXNzbmFtZXNcIn1cbi8vIG1vZHVsZSBpZCA9IDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdFwifVxuLy8gbW9kdWxlIGlkID0gNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgUmVhY3QsIHtQcm9wVHlwZXN9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjeCBmcm9tICdjbGFzc25hbWVzJztcblxuaW1wb3J0IENoZWNrYm94IGZyb20gJ2JvdW5kbGVzcy1jaGVja2JveCc7XG5pbXBvcnQgb21pdCBmcm9tICdib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzJztcbmltcG9ydCB1dWlkIGZyb20gJ2JvdW5kbGVzcy11dGlscy11dWlkJztcblxuY29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuXG4vKipcbiMgQ2hlY2tib3hHcm91cFxuX19BIGNvbnRyb2xsZXIgdmlldyBmb3IgbWFuYWdpbmcgdGhlIGFnZ3JlZ2F0ZSBzdGF0ZSBvZiBtdWx0aXBsZSwgcmVsYXRlZCBjaGVja2JveGVzLl9fXG5cblRoZSBtb3N0IGNvbW1vbiB1c2UgY2FzZSBmb3IgYENoZWNrYm94R3JvdXBgIGlzIGEgXCJzZWxlY3QgYWxsXCIgLyBjaGlsZHJlbiBzY2VuYXJpby4gVGhpcyBwYXJ0aWN1bGFyXG5jb25maWd1cmF0aW9uIGlzIGJ1aWx0LWluIGFuZCBpcyBhY3RpdmF0ZWQgYnkgcGFzc2luZyB0aGUgYHNlbGVjdEFsbGAgcHJvcC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2hlY2tib3hHcm91cCBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xuICAgIHN0YXRpYyBzZWxlY3RBbGxQb3NpdGlvbiA9IHtcbiAgICAgICAgQkVGT1JFOiB1dWlkKCksXG4gICAgICAgIEFGVEVSOiB1dWlkKCksXG4gICAgfVxuXG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRoZSBkYXRhIHdpc2hlZCB0byBiZSByZW5kZXJlZCwgZWFjaCBpdGVtIG11c3QgY29uZm9ybSB0byB0aGUgW0NoZWNrYm94IHByb3Agc3BlY10oLi9DaGVja2JveCNwcm9wcylcbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1zOiBQcm9wVHlwZXMuYXJyYXlPZihDaGVja2JveC5wcm9wVHlwZXMuaW5wdXRQcm9wcykuaXNSZXF1aXJlZCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogY2FsbGVkIHdoZW4gYWxsIGNoaWxkcmVuIGJlY29tZSBjaGVja2VkIChub3QgZmlyZWQgb24gZmlyc3QgcmVuZGVyKSwgbm8gcmV0dXJuXG4gICAgICAgICAqL1xuICAgICAgICBvbkFsbENoZWNrZWQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBjYWxsZWQgd2hlbiBhbGwgY2hpbGRyZW4gYmVjb21lIHVuY2hlY2tlZCAobm90IGZpcmVkIG9uIGZpcnN0IHJlbmRlciksIG5vIHJldHVyblxuICAgICAgICAgKi9cbiAgICAgICAgb25BbGxVbmNoZWNrZWQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBjYWxsZWQgd2hlbiBhIHNwZWNpZmljIGNoaWxkIGhhcyBiZWNvbWUgY2hlY2tlZCwgcmV0dXJucyB0aGUgY2hpbGQgZGVmaW5pdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgb25DaGlsZENoZWNrZWQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBjYWxsZWQgd2hlbiBhIHNwZWNpZmljIGNoaWxkIGhhcyBiZWNvbWUgY2hlY2tlZCwgcmV0dXJucyB0aGUgY2hpbGQgZGVmaW5pdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgb25DaGlsZFVuY2hlY2tlZDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHJlbmRlcnMgYSBtYXN0ZXIgY2hlY2tib3ggdGhhdCBjYW4gbWFuaXB1bGF0ZSB0aGUgdmFsdWVzIG9mIGFsbCBjaGlsZHJlbiBzaW11bHRhbmVvdXNseVxuICAgICAgICAgKi9cbiAgICAgICAgc2VsZWN0QWxsOiBQcm9wVHlwZXMuYm9vbCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogbXVzdCBjb25mb3JtIHRvIHRoZSBbQ2hlY2tib3ggcHJvcCBzcGVjXSguL0NoZWNrYm94I3Byb3BzKVxuICAgICAgICAgKi9cbiAgICAgICAgc2VsZWN0QWxsUHJvcHM6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIHRoZSB0ZXh0IG9yIHJlbmRlcmFibGUgbm9kZSB0byBkaXNwbGF5IG5leHQgdG8gdGhlIGNoZWNrYm94XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGxhYmVsOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgICAgICAgaW5wdXRQcm9wczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICAgICAgfSksXG5cbiAgICAgICAgc2VsZWN0QWxsUG9zaXRpb246IFByb3BUeXBlcy5vbmVPZihbXG4gICAgICAgICAgICBDaGVja2JveEdyb3VwLnNlbGVjdEFsbFBvc2l0aW9uLkJFRk9SRSxcbiAgICAgICAgICAgIENoZWNrYm94R3JvdXAuc2VsZWN0QWxsUG9zaXRpb24uQUZURVIsXG4gICAgICAgIF0pLFxuICAgIH1cblxuICAgIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgb25BbGxDaGVja2VkOiBub29wLFxuICAgICAgICBvbkFsbFVuY2hlY2tlZDogbm9vcCxcbiAgICAgICAgb25DaGlsZENoZWNrZWQ6IG5vb3AsXG4gICAgICAgIG9uQ2hpbGRVbmNoZWNrZWQ6IG5vb3AsXG4gICAgICAgIHNlbGVjdEFsbDogZmFsc2UsXG4gICAgICAgIHNlbGVjdEFsbFByb3BzOiB7fSxcbiAgICAgICAgc2VsZWN0QWxsUG9zaXRpb246IENoZWNrYm94R3JvdXAuc2VsZWN0QWxsUG9zaXRpb24uQkVGT1JFLFxuICAgIH1cblxuICAgIHN0YXRpYyBpbnRlcm5hbEtleXMgPSBPYmplY3Qua2V5cyhDaGVja2JveEdyb3VwLmRlZmF1bHRQcm9wcylcblxuICAgIGFsbEl0ZW1zQ2hlY2tlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuaXRlbXMuZXZlcnkoKGl0ZW0pID0+IGl0ZW0uaW5wdXRQcm9wcy5jaGVja2VkID09PSB0cnVlKTtcbiAgICB9XG5cbiAgICBhbnlJdGVtc0NoZWNrZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLml0ZW1zLnNvbWUoKGl0ZW0pID0+IGl0ZW0uaW5wdXRQcm9wcy5jaGVja2VkID09PSB0cnVlKTtcbiAgICB9XG5cbiAgICByZW5kZXJTZWxlY3RBbGwoKSB7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLnNlbGVjdEFsbCkge1xuICAgICAgICAgICAgY29uc3QgYWxsQ2hlY2tlZCA9IHRoaXMuYWxsSXRlbXNDaGVja2VkKCk7XG4gICAgICAgICAgICBjb25zdCB7aW5wdXRQcm9wc30gPSB0aGlzLnByb3BzLnNlbGVjdEFsbFByb3BzO1xuXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICB7Li4udGhpcy5wcm9wcy5zZWxlY3RBbGxQcm9wc31cbiAgICAgICAgICAgICAgICAgICAgcmVmPSdzZWxlY3RfYWxsJ1xuICAgICAgICAgICAgICAgICAgICBrZXk9J2NiX3NlbGVjdF9hbGwnXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y3goJ2ItY2hlY2tib3gtZ3JvdXAtc2VsZWN0YWxsJywgdGhpcy5wcm9wcy5zZWxlY3RBbGxQcm9wcy5jbGFzc05hbWUpfVxuICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3BzPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5pbnB1dFByb3BzLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZDogYWxsQ2hlY2tlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV0ZXJtaW5hdGU6ICFhbGxDaGVja2VkICYmIHRoaXMuYW55SXRlbXNDaGVja2VkKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBpbnB1dFByb3BzICYmIGlucHV0UHJvcHMubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpbnB1dFByb3BzLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2NiX3NlbGVjdF9hbGwnLFxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICBsYWJlbD17dGhpcy5wcm9wcy5zZWxlY3RBbGxQcm9wcy5sYWJlbCB8fCAnU2VsZWN0IEFsbCd9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hlY2tlZD17dGhpcy5wcm9wcy5vbkFsbENoZWNrZWR9XG4gICAgICAgICAgICAgICAgICAgIG9uVW5jaGVja2VkPXt0aGlzLnByb3BzLm9uQWxsVW5jaGVja2VkfSAvPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlckNoZWNrYm94ZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLml0ZW1zLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8Q2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgey4uLml0ZW19XG4gICAgICAgICAgICAgICAgICAgIGtleT17aXRlbS5pbnB1dFByb3BzLm5hbWV9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hlY2tlZD17dGhpcy5wcm9wcy5vbkNoaWxkQ2hlY2tlZH1cbiAgICAgICAgICAgICAgICAgICAgb25VbmNoZWNrZWQ9e3RoaXMucHJvcHMub25DaGlsZFVuY2hlY2tlZH0gLz5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbmRlckNoaWxkcmVuKCkge1xuICAgICAgICBjb25zdCB0b0JlUmVuZGVyZWQgPSBbdGhpcy5yZW5kZXJDaGVja2JveGVzKCldO1xuXG4gICAgICAgIGlmICh0aGlzLnByb3BzLnNlbGVjdEFsbCAmJiB0aGlzLnByb3BzLnNlbGVjdEFsbFBvc2l0aW9uKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMucHJvcHMuc2VsZWN0QWxsUG9zaXRpb24pIHtcbiAgICAgICAgICAgIGNhc2UgQ2hlY2tib3hHcm91cC5zZWxlY3RBbGxQb3NpdGlvbi5CRUZPUkU6XG4gICAgICAgICAgICAgICAgdG9CZVJlbmRlcmVkLnVuc2hpZnQodGhpcy5yZW5kZXJTZWxlY3RBbGwoKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgQ2hlY2tib3hHcm91cC5zZWxlY3RBbGxQb3NpdGlvbi5BRlRFUjpcbiAgICAgICAgICAgICAgICB0b0JlUmVuZGVyZWQucHVzaCh0aGlzLnJlbmRlclNlbGVjdEFsbCgpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0b0JlUmVuZGVyZWQ7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIHsuLi5vbWl0KHRoaXMucHJvcHMsIENoZWNrYm94R3JvdXAuaW50ZXJuYWxLZXlzKX1cbiAgICAgICAgICAgICAgICByZWY9J2dyb3VwJ1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y3goJ2ItY2hlY2tib3gtZ3JvdXAnLCB0aGlzLnByb3BzLmNsYXNzTmFtZSl9PlxuICAgICAgICAgICAgICAgIHt0aGlzLnJlbmRlckNoaWxkcmVuKCl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9ib3VuZGxlc3MtY2hlY2tib3gtZ3JvdXAvaW5kZXguanMiXSwic291cmNlUm9vdCI6IiJ9 | ||
module.exports=function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=5)}([function(e,t){e.exports=require("boundless-checkbox")},function(e,t){e.exports=require("boundless-utils-omit-keys")},function(e,t){e.exports=require("boundless-utils-uuid")},function(e,t){e.exports=require("classnames")},function(e,t){e.exports=require("react")},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var l=n(4),c=n.n(l),p=n(3),i=n.n(p),u=n(0),a=n.n(u),h=n(1),f=n.n(h),d=n(2),y=n.n(d),k=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},b=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),m=function(){},P=function(e){function t(){var e,n,s,l;r(this,t);for(var c=arguments.length,p=Array(c),i=0;i<c;i++)p[i]=arguments[i];return n=s=o(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(p))),s.selectAllUUID=y()(),l=n,o(s,l)}return s(t,e),b(t,[{key:"allItemsChecked",value:function(){return this.props.items.every(function(e){return e.inputProps.checked===!0})}},{key:"anyItemsChecked",value:function(){return this.props.items.some(function(e){return e.inputProps.checked===!0})}},{key:"renderSelectAllCheckbox",value:function(){var e=this.allItemsChecked(),t=this.props.selectAllProps.inputProps;return c.a.createElement(a.a,k({},this.props.selectAllProps,{key:this.selectAllUUID,className:i()("b-checkbox-group-all",this.props.selectAllProps.className),inputProps:k({},t,{checked:e,indeterminate:!e&&this.anyItemsChecked(),name:t&&t.name?t.name:null}),label:this.props.selectAllProps.label||"Select All",onChecked:this.props.onAllChecked,onUnchecked:this.props.onAllUnchecked}))}},{key:"renderCheckboxes",value:function(){var e=this;return this.props.items.map(function(t){return c.a.createElement(a.a,k({},t,{key:t.inputProps.name,onChecked:e.props.onChildChecked,onUnchecked:e.props.onChildUnchecked}))})}},{key:"renderChildren",value:function(){var e=[this.renderCheckboxes()];switch(this.props.selectAll){case t.selectAll.BEFORE:e.unshift(this.renderSelectAllCheckbox());break;case t.selectAll.AFTER:e.push(this.renderSelectAllCheckbox())}return e}},{key:"render",value:function(){return c.a.createElement(this.props.component,k({},f()(this.props,t.internalKeys),{className:i()("b-checkbox-group",this.props.className)}),this.renderChildren())}}]),t}(c.a.PureComponent);P.selectAll={BEFORE:y()(),AFTER:y()(),NONE:y()()},P.propTypes={"*":l.PropTypes.any,component:l.PropTypes.string,items:l.PropTypes.arrayOf(a.a.propTypes.inputProps).isRequired,onAllChecked:l.PropTypes.func,onAllUnchecked:l.PropTypes.func,onChildChecked:l.PropTypes.func,onChildUnchecked:l.PropTypes.func,selectAll:l.PropTypes.oneOf([P.selectAll.BEFORE,P.selectAll.AFTER,P.selectAll.NONE]),selectAllProps:l.PropTypes.shape({"*":l.PropTypes.any,label:l.PropTypes.string,inputProps:l.PropTypes.object})},P.defaultProps={component:"div",items:[],onAllChecked:m,onAllUnchecked:m,onChildChecked:m,onChildUnchecked:m,selectAll:P.selectAll.BEFORE,selectAllProps:{}},P.internalKeys=Object.keys(P.defaultProps),t.default=P}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIDIyZGI0MDhkYjIwMGY2Y2U2NDU1Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy1jaGVja2JveFwifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy11dWlkXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImNsYXNzbmFtZXNcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn0iLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvYm91bmRsZXNzLWNoZWNrYm94LWdyb3VwL2luZGV4LmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJtb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiaW5zdGFsbGVkTW9kdWxlcyIsImkiLCJsIiwiY2FsbCIsIm0iLCJjIiwidmFsdWUiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJnZXQiLCJuIiwiX19lc01vZHVsZSIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsInJlcXVpcmUiLCJfX3dlYnBhY2tfZXhwb3J0c19fIiwiX2NsYXNzQ2FsbENoZWNrIiwiaW5zdGFuY2UiLCJDb25zdHJ1Y3RvciIsIlR5cGVFcnJvciIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIiwic2VsZiIsIlJlZmVyZW5jZUVycm9yIiwiX2luaGVyaXRzIiwic3ViQ2xhc3MiLCJzdXBlckNsYXNzIiwiY3JlYXRlIiwiY29uc3RydWN0b3IiLCJ3cml0YWJsZSIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfY2hlY2tib3hfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfY2hlY2tib3hfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfdXRpbHNfdXVpZF9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X2JvdW5kbGVzc191dGlsc191dWlkX19fZGVmYXVsdCIsIl9leHRlbmRzIiwiYXNzaWduIiwidGFyZ2V0IiwiYXJndW1lbnRzIiwibGVuZ3RoIiwic291cmNlIiwia2V5IiwiX2NyZWF0ZUNsYXNzIiwiZGVmaW5lUHJvcGVydGllcyIsInByb3BzIiwiZGVzY3JpcHRvciIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsIm5vb3AiLCJDaGVja2JveEdyb3VwIiwiX1JlYWN0JFB1cmVDb21wb25lbnQiLCJfcmVmIiwiX3RlbXAiLCJfdGhpcyIsIl9yZXQiLCJ0aGlzIiwiX2xlbiIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJnZXRQcm90b3R5cGVPZiIsImFwcGx5IiwiY29uY2F0Iiwic2VsZWN0QWxsVVVJRCIsIml0ZW1zIiwiZXZlcnkiLCJpdGVtIiwiaW5wdXRQcm9wcyIsImNoZWNrZWQiLCJzb21lIiwiYWxsQ2hlY2tlZCIsImFsbEl0ZW1zQ2hlY2tlZCIsInNlbGVjdEFsbFByb3BzIiwiYSIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJpbmRldGVybWluYXRlIiwiYW55SXRlbXNDaGVja2VkIiwibGFiZWwiLCJvbkNoZWNrZWQiLCJvbkFsbENoZWNrZWQiLCJvblVuY2hlY2tlZCIsIm9uQWxsVW5jaGVja2VkIiwiX3RoaXMyIiwibWFwIiwib25DaGlsZENoZWNrZWQiLCJvbkNoaWxkVW5jaGVja2VkIiwiY2hpbGRyZW4iLCJyZW5kZXJDaGVja2JveGVzIiwic2VsZWN0QWxsIiwiQkVGT1JFIiwidW5zaGlmdCIsInJlbmRlclNlbGVjdEFsbENoZWNrYm94IiwiQUZURVIiLCJwdXNoIiwiY29tcG9uZW50IiwiaW50ZXJuYWxLZXlzIiwicmVuZGVyQ2hpbGRyZW4iLCJQdXJlQ29tcG9uZW50IiwiTk9ORSIsInByb3BUeXBlcyIsIioiLCJhbnkiLCJzdHJpbmciLCJhcnJheU9mIiwiaXNSZXF1aXJlZCIsImZ1bmMiLCJvbmVPZiIsInNoYXBlIiwiZGVmYXVsdFByb3BzIiwia2V5cyJdLCJtYXBwaW5ncyI6IkFBQUFBLE9BQU9DLFFBQ0UsU0FBVUMsR0NHbkIsUUFBQUMsR0FBQUMsR0FHQSxHQUFBQyxFQUFBRCxHQUNBLE1BQUFDLEdBQUFELEdBQUFILE9BR0EsSUFBQUQsR0FBQUssRUFBQUQsSUFDQUUsRUFBQUYsRUFDQUcsR0FBQSxFQUNBTixXQVVBLE9BTkFDLEdBQUFFLEdBQUFJLEtBQUFSLEVBQUFDLFFBQUFELElBQUFDLFFBQUFFLEdBR0FILEVBQUFPLEdBQUEsRUFHQVAsRUFBQUMsUUF2QkEsR0FBQUksS0ErREEsT0FuQ0FGLEdBQUFNLEVBQUFQLEVBR0FDLEVBQUFPLEVBQUFMLEVBR0FGLEVBQUFHLEVBQUEsU0FBQUssR0FBMkMsTUFBQUEsSUFHM0NSLEVBQUFTLEVBQUEsU0FBQVgsRUFB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QUNQaUUsS0FBTWpFLE9BSk9lLEVBT1ZtRCxXQUlIQyxJQUFLNUUsRUFBQSxVQUFVNkUsSUFLZlAsVUFBV3RFLEVBQUEsVUFBVThFLE9BS3JCdkMsTUFBT3ZDLEVBQUEsVUFBVStFLFFBQVExRSxFQUFBMkMsRUFBUzJCLFVBQVVqQyxZQUFZc0MsV0FLeER6QixhQUFjdkQsRUFBQSxVQUFVaUYsS0FLeEJ4QixlQUFnQnpELEVBQUEsVUFBVWlGLEtBSzFCckIsZUFBZ0I1RCxFQUFBLFVBQVVpRixLQUsxQnBCLGlCQUFrQjdELEVBQUEsVUFBVWlGLEtBSzVCakIsVUFBV2hFLEVBQUEsVUFBVWtGLE9BQ2pCMUQsRUFBY3dDLFVBQVVDLE9BQ3hCekMsRUFBY3dDLFVBQVVJLE1BQ3hCNUMsRUFBY3dDLFVBQVVVLE9BTTVCM0IsZUFBZ0IvQyxFQUFBLFVBQVVtRixPQUl0QlAsSUFBSzVFLEVBQUEsVUFBVTZFLElBS2Z4QixNQUFPckQsRUFBQSxVQUFVOEUsT0FDakJwQyxXQUFZMUMsRUFBQSxVQUFVdkIsVUFqRWIrQyxFQXFFVjRELGNBQ0hkLFVBQVcsTUFDWC9CLFNBQ0FnQixhQUFjaEMsRUFDZGtDLGVBQWdCbEMsRUFDaEJxQyxlQUFnQnJDLEVBQ2hCc0MsaUJBQWtCdEMsRUFDbEJ5QyxVQUFXeEMsRUFBY3dDLFVBQVVDLE9BQ25DbEIsbUJBN0VhdkIsRUFnRlYrQyxhQUFlckcsT0FBT21ILEtBQUs3RCxFQUFjNEQsY1BvQnV1THBHLEVBQTZCLFFPcEdueUx3QyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbi8qKioqKiovIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbi8qKioqKiovIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA1KTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLWNoZWNrYm94XCIpO1xuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXV0aWxzLW9taXQta2V5c1wiKTtcblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy11dGlscy11dWlkXCIpO1xuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2xhc3NuYW1lc1wiKTtcblxuLyoqKi8gfSksXG4vKiA0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG4vKioqLyB9KSxcbi8qIDUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX2NoZWNrYm94X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfY2hlY2tib3hfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfY2hlY2tib3hfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfdXRpbHNfdXVpZF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfYm91bmRsZXNzX3V0aWxzX3V1aWRfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfdXRpbHNfdXVpZF9fKTtcbnZhciBfZXh0ZW5kcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0YXJnZXQpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9YXJndW1lbnRzW2ldO2Zvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSxrZXkpKXt0YXJnZXRba2V5XT1zb3VyY2Vba2V5XTt9fX1yZXR1cm4gdGFyZ2V0O307dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoXCJ2YWx1ZVwiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKTt9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcjt9O30oKTtmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7fX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLGNhbGwpe2lmKCFzZWxmKXt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7fXJldHVybiBjYWxsJiYodHlwZW9mIGNhbGw9PT1cIm9iamVjdFwifHx0eXBlb2YgY2FsbD09PVwiZnVuY3Rpb25cIik/Y2FsbDpzZWxmO31mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT1cImZ1bmN0aW9uXCImJnN1cGVyQ2xhc3MhPT1udWxsKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2Ygc3VwZXJDbGFzcyk7fXN1YkNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MmJnN1cGVyQ2xhc3MucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6c3ViQ2xhc3MsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfX0pO2lmKHN1cGVyQ2xhc3MpT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcyxzdXBlckNsYXNzKTpzdWJDbGFzcy5fX3Byb3RvX189c3VwZXJDbGFzczt9dmFyIG5vb3A9ZnVuY3Rpb24gbm9vcCgpe307dmFyIENoZWNrYm94R3JvdXA9ZnVuY3Rpb24oX1JlYWN0JFB1cmVDb21wb25lbnQpe19pbmhlcml0cyhDaGVja2JveEdyb3VwLF9SZWFjdCRQdXJlQ29tcG9uZW50KTtmdW5jdGlvbiBDaGVja2JveEdyb3VwKCl7dmFyIF9yZWY7dmFyIF90ZW1wLF90aGlzLF9yZXQ7X2NsYXNzQ2FsbENoZWNrKHRoaXMsQ2hlY2tib3hHcm91cCk7Zm9yKHZhciBfbGVuPWFyZ3VtZW50cy5sZW5ndGgsYXJncz1BcnJheShfbGVuKSxfa2V5PTA7X2tleTxfbGVuO19rZXkrKyl7YXJnc1tfa2V5XT1hcmd1bWVudHNbX2tleV07fXJldHVybiBfcmV0PShfdGVtcD0oX3RoaXM9X3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywoX3JlZj1DaGVja2JveEdyb3VwLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKENoZWNrYm94R3JvdXApKS5jYWxsLmFwcGx5KF9yZWYsW3RoaXNdLmNvbmNhdChhcmdzKSkpLF90aGlzKSxfdGhpcy5zZWxlY3RBbGxVVUlEPV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfdXRpbHNfdXVpZF9fX2RlZmF1bHQoKSgpLF90ZW1wKSxfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcyxfcmV0KTt9X2NyZWF0ZUNsYXNzKENoZWNrYm94R3JvdXAsW3trZXk6J2FsbEl0ZW1zQ2hlY2tlZCcsdmFsdWU6ZnVuY3Rpb24gYWxsSXRlbXNDaGVja2VkKCl7cmV0dXJuIHRoaXMucHJvcHMuaXRlbXMuZXZlcnkoZnVuY3Rpb24oaXRlbSl7cmV0dXJuIGl0ZW0uaW5wdXRQcm9wcy5jaGVja2VkPT09dHJ1ZTt9KTt9fSx7a2V5OidhbnlJdGVtc0NoZWNrZWQnLHZhbHVlOmZ1bmN0aW9uIGFueUl0ZW1zQ2hlY2tlZCgpe3JldHVybiB0aGlzLnByb3BzLml0ZW1zLnNvbWUoZnVuY3Rpb24oaXRlbSl7cmV0dXJuIGl0ZW0uaW5wdXRQcm9wcy5jaGVja2VkPT09dHJ1ZTt9KTt9fSx7a2V5OidyZW5kZXJTZWxlY3RBbGxDaGVja2JveCcsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyU2VsZWN0QWxsQ2hlY2tib3goKXt2YXIgYWxsQ2hlY2tlZD10aGlzLmFsbEl0ZW1zQ2hlY2tlZCgpO3ZhciBpbnB1dFByb3BzPXRoaXMucHJvcHMuc2VsZWN0QWxsUHJvcHMuaW5wdXRQcm9wcztyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc19jaGVja2JveF9fX2RlZmF1bHQuYSxfZXh0ZW5kcyh7fSx0aGlzLnByb3BzLnNlbGVjdEFsbFByb3BzLHtrZXk6dGhpcy5zZWxlY3RBbGxVVUlELGNsYXNzTmFtZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQoKSgnYi1jaGVja2JveC1ncm91cC1hbGwnLHRoaXMucHJvcHMuc2VsZWN0QWxsUHJvcHMuY2xhc3NOYW1lKSxpbnB1dFByb3BzOl9leHRlbmRzKHt9LGlucHV0UHJvcHMse2NoZWNrZWQ6YWxsQ2hlY2tlZCxpbmRldGVybWluYXRlOiFhbGxDaGVja2VkJiZ0aGlzLmFueUl0ZW1zQ2hlY2tlZCgpLG5hbWU6aW5wdXRQcm9wcyYmaW5wdXRQcm9wcy5uYW1lP2lucHV0UHJvcHMubmFtZTpudWxsfSksbGFiZWw6dGhpcy5wcm9wcy5zZWxlY3RBbGxQcm9wcy5sYWJlbHx8J1NlbGVjdCBBbGwnLG9uQ2hlY2tlZDp0aGlzLnByb3BzLm9uQWxsQ2hlY2tlZCxvblVuY2hlY2tlZDp0aGlzLnByb3BzLm9uQWxsVW5jaGVja2VkfSkpO319LHtrZXk6J3JlbmRlckNoZWNrYm94ZXMnLHZhbHVlOmZ1bmN0aW9uIHJlbmRlckNoZWNrYm94ZXMoKXt2YXIgX3RoaXMyPXRoaXM7cmV0dXJuIHRoaXMucHJvcHMuaXRlbXMubWFwKGZ1bmN0aW9uKGl0ZW0pe3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX2NoZWNrYm94X19fZGVmYXVsdC5hLF9leHRlbmRzKHt9LGl0ZW0se2tleTppdGVtLmlucHV0UHJvcHMubmFtZSxvbkNoZWNrZWQ6X3RoaXMyLnByb3BzLm9uQ2hpbGRDaGVja2VkLG9uVW5jaGVja2VkOl90aGlzMi5wcm9wcy5vbkNoaWxkVW5jaGVja2VkfSkpO30pO319LHtrZXk6J3JlbmRlckNoaWxkcmVuJyx2YWx1ZTpmdW5jdGlvbiByZW5kZXJDaGlsZHJlbigpe3ZhciBjaGlsZHJlbj1bdGhpcy5yZW5kZXJDaGVja2JveGVzKCldO3N3aXRjaCh0aGlzLnByb3BzLnNlbGVjdEFsbCl7Y2FzZSBDaGVja2JveEdyb3VwLnNlbGVjdEFsbC5CRUZPUkU6Y2hpbGRyZW4udW5zaGlmdCh0aGlzLnJlbmRlclNlbGVjdEFsbENoZWNrYm94KCkpO2JyZWFrO2Nhc2UgQ2hlY2tib3hHcm91cC5zZWxlY3RBbGwuQUZURVI6Y2hpbGRyZW4ucHVzaCh0aGlzLnJlbmRlclNlbGVjdEFsbENoZWNrYm94KCkpO2JyZWFrO31yZXR1cm4gY2hpbGRyZW47fX0se2tleToncmVuZGVyJyx2YWx1ZTpmdW5jdGlvbiByZW5kZXIoKXtyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQodGhpcy5wcm9wcy5jb21wb25lbnQsX2V4dGVuZHMoe30sX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfX19kZWZhdWx0KCkodGhpcy5wcm9wcyxDaGVja2JveEdyb3VwLmludGVybmFsS2V5cykse2NsYXNzTmFtZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQoKSgnYi1jaGVja2JveC1ncm91cCcsdGhpcy5wcm9wcy5jbGFzc05hbWUpfSksdGhpcy5yZW5kZXJDaGlsZHJlbigpKTt9fV0pO3JldHVybiBDaGVja2JveEdyb3VwO30oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLlB1cmVDb21wb25lbnQpO0NoZWNrYm94R3JvdXAuc2VsZWN0QWxsPXtCRUZPUkU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X2JvdW5kbGVzc191dGlsc191dWlkX19fZGVmYXVsdCgpKCksQUZURVI6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X2JvdW5kbGVzc191dGlsc191dWlkX19fZGVmYXVsdCgpKCksTk9ORTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfYm91bmRsZXNzX3V0aWxzX3V1aWRfX19kZWZhdWx0KCkoKX07Q2hlY2tib3hHcm91cC5wcm9wVHlwZXM9eycqJzpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5hbnksY29tcG9uZW50Ol9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLnN0cmluZyxpdGVtczpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5hcnJheU9mKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfY2hlY2tib3hfX19kZWZhdWx0LmEucHJvcFR5cGVzLmlucHV0UHJvcHMpLmlzUmVxdWlyZWQsb25BbGxDaGVja2VkOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmMsb25BbGxVbmNoZWNrZWQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uZnVuYyxvbkNoaWxkQ2hlY2tlZDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jLG9uQ2hpbGRVbmNoZWNrZWQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uZnVuYyxzZWxlY3RBbGw6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub25lT2YoW0NoZWNrYm94R3JvdXAuc2VsZWN0QWxsLkJFRk9SRSxDaGVja2JveEdyb3VwLnNlbGVjdEFsbC5BRlRFUixDaGVja2JveEdyb3VwLnNlbGVjdEFsbC5OT05FXSksc2VsZWN0QWxsUHJvcHM6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc2hhcGUoeycqJzpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5hbnksbGFiZWw6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc3RyaW5nLGlucHV0UHJvcHM6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub2JqZWN0fSl9O0NoZWNrYm94R3JvdXAuZGVmYXVsdFByb3BzPXtjb21wb25lbnQ6J2RpdicsaXRlbXM6W10sb25BbGxDaGVja2VkOm5vb3Asb25BbGxVbmNoZWNrZWQ6bm9vcCxvbkNoaWxkQ2hlY2tlZDpub29wLG9uQ2hpbGRVbmNoZWNrZWQ6bm9vcCxzZWxlY3RBbGw6Q2hlY2tib3hHcm91cC5zZWxlY3RBbGwuQkVGT1JFLHNlbGVjdEFsbFByb3BzOnt9fTtDaGVja2JveEdyb3VwLmludGVybmFsS2V5cz1PYmplY3Qua2V5cyhDaGVja2JveEdyb3VwLmRlZmF1bHRQcm9wcyk7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IENoZWNrYm94R3JvdXA7XG5cbi8qKiovIH0pXG4vKioqKioqLyBdKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gaW5kZXguanMiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA1KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCAyMmRiNDA4ZGIyMDBmNmNlNjQ1NSIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy1jaGVja2JveFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy1jaGVja2JveFwifVxuLy8gbW9kdWxlIGlkID0gMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXV0aWxzLW9taXQta2V5c1wifVxuLy8gbW9kdWxlIGlkID0gMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtdXRpbHMtdXVpZFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy11dWlkXCJ9XG4vLyBtb2R1bGUgaWQgPSAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNsYXNzbmFtZXNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJjbGFzc25hbWVzXCJ9XG4vLyBtb2R1bGUgaWQgPSAzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn1cbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IFJlYWN0LCB7UHJvcFR5cGVzfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY3ggZnJvbSAnY2xhc3NuYW1lcyc7XG5cbmltcG9ydCBDaGVja2JveCBmcm9tICdib3VuZGxlc3MtY2hlY2tib3gnO1xuaW1wb3J0IG9taXQgZnJvbSAnYm91bmRsZXNzLXV0aWxzLW9taXQta2V5cyc7XG5pbXBvcnQgdXVpZCBmcm9tICdib3VuZGxlc3MtdXRpbHMtdXVpZCc7XG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcblxuLyoqXG5fX0EgY29udHJvbGxlciB2aWV3IGZvciBtYW5hZ2luZyB0aGUgYWdncmVnYXRlIHN0YXRlIG9mIG11bHRpcGxlLCByZWxhdGVkIGNoZWNrYm94ZXMuX19cblxuVGhlIG1vc3QgY29tbW9uIHVzZSBjYXNlIGZvciBgQ2hlY2tib3hHcm91cGAgaXMgYSBcInNlbGVjdCBhbGxcIiAvIGNoaWxkcmVuIHNjZW5hcmlvLiBUaGlzIHBhcnRpY3VsYXJcbmNvbmZpZ3VyYXRpb24gaXMgYnVpbHQtaW4gYW5kIGlzIGFjdGl2YXRlZCBieSBwYXNzaW5nIHRoZSBgc2VsZWN0QWxsYCBwcm9wLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDaGVja2JveEdyb3VwIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XG4gICAgc3RhdGljIHNlbGVjdEFsbCA9IHtcbiAgICAgICAgQkVGT1JFOiB1dWlkKCksXG4gICAgICAgIEFGVEVSOiB1dWlkKCksXG4gICAgICAgIE5PTkU6IHV1aWQoKSxcbiAgICB9XG5cbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgICAvKipcbiAgICAgICAgICogYW55IFtSZWFjdC1zdXBwb3J0ZWQgYXR0cmlidXRlXShodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RhZ3MtYW5kLWF0dHJpYnV0ZXMuaHRtbCNodG1sLWF0dHJpYnV0ZXMpXG4gICAgICAgICAqL1xuICAgICAgICAnKic6IFByb3BUeXBlcy5hbnksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIG92ZXJyaWRlIHRoZSB3cmFwcGVyIEhUTUwgZWxlbWVudCBpZiBkZXNpcmVkXG4gICAgICAgICAqL1xuICAgICAgICBjb21wb25lbnQ6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRoZSBkYXRhIHdpc2hlZCB0byBiZSByZW5kZXJlZCwgZWFjaCBpdGVtIG11c3QgY29uZm9ybSB0byB0aGUgW0NoZWNrYm94IHByb3Agc3BlY10oLi9DaGVja2JveCNwcm9wcylcbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1zOiBQcm9wVHlwZXMuYXJyYXlPZihDaGVja2JveC5wcm9wVHlwZXMuaW5wdXRQcm9wcykuaXNSZXF1aXJlZCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogY2FsbGVkIHdoZW4gYWxsIGNoaWxkcmVuIGJlY29tZSBjaGVja2VkIChub3QgZmlyZWQgb24gZmlyc3QgcmVuZGVyKSwgbm8gcmV0dXJuXG4gICAgICAgICAqL1xuICAgICAgICBvbkFsbENoZWNrZWQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBjYWxsZWQgd2hlbiBhbGwgY2hpbGRyZW4gYmVjb21lIHVuY2hlY2tlZCAobm90IGZpcmVkIG9uIGZpcnN0IHJlbmRlciksIG5vIHJldHVyblxuICAgICAgICAgKi9cbiAgICAgICAgb25BbGxVbmNoZWNrZWQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBjYWxsZWQgd2hlbiBhIHNwZWNpZmljIGNoaWxkIGhhcyBiZWNvbWUgY2hlY2tlZCwgcmV0dXJucyB0aGUgY2hpbGQgZGVmaW5pdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgb25DaGlsZENoZWNrZWQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBjYWxsZWQgd2hlbiBhIHNwZWNpZmljIGNoaWxkIGhhcyBiZWNvbWUgY2hlY2tlZCwgcmV0dXJucyB0aGUgY2hpbGQgZGVmaW5pdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgb25DaGlsZFVuY2hlY2tlZDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHJlbmRlcnMgYSBtYXN0ZXIgY2hlY2tib3ggdGhhdCBjYW4gbWFuaXB1bGF0ZSB0aGUgdmFsdWVzIG9mIGFsbCBjaGlsZHJlbiBzaW11bHRhbmVvdXNseVxuICAgICAgICAgKi9cbiAgICAgICAgc2VsZWN0QWxsOiBQcm9wVHlwZXMub25lT2YoW1xuICAgICAgICAgICAgQ2hlY2tib3hHcm91cC5zZWxlY3RBbGwuQkVGT1JFLFxuICAgICAgICAgICAgQ2hlY2tib3hHcm91cC5zZWxlY3RBbGwuQUZURVIsXG4gICAgICAgICAgICBDaGVja2JveEdyb3VwLnNlbGVjdEFsbC5OT05FLFxuICAgICAgICBdKSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogbXVzdCBjb25mb3JtIHRvIHRoZSBbQ2hlY2tib3ggcHJvcCBzcGVjXSguL0NoZWNrYm94I3Byb3BzKVxuICAgICAgICAgKi9cbiAgICAgICAgc2VsZWN0QWxsUHJvcHM6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIGFueSBbUmVhY3Qtc3VwcG9ydGVkIGF0dHJpYnV0ZV0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90YWdzLWFuZC1hdHRyaWJ1dGVzLmh0bWwjaHRtbC1hdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICAnKic6IFByb3BUeXBlcy5hbnksXG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogdGhlIHRleHQgb3IgcmVuZGVyYWJsZSBub2RlIHRvIGRpc3BsYXkgbmV4dCB0byB0aGUgY2hlY2tib3hcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgbGFiZWw6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICAgICAgICBpbnB1dFByb3BzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgICAgICB9KSxcbiAgICB9XG5cbiAgICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgICBjb21wb25lbnQ6ICdkaXYnLFxuICAgICAgICBpdGVtczogW10sXG4gICAgICAgIG9uQWxsQ2hlY2tlZDogbm9vcCxcbiAgICAgICAgb25BbGxVbmNoZWNrZWQ6IG5vb3AsXG4gICAgICAgIG9uQ2hpbGRDaGVja2VkOiBub29wLFxuICAgICAgICBvbkNoaWxkVW5jaGVja2VkOiBub29wLFxuICAgICAgICBzZWxlY3RBbGw6IENoZWNrYm94R3JvdXAuc2VsZWN0QWxsLkJFRk9SRSxcbiAgICAgICAgc2VsZWN0QWxsUHJvcHM6IHt9LFxuICAgIH1cblxuICAgIHN0YXRpYyBpbnRlcm5hbEtleXMgPSBPYmplY3Qua2V5cyhDaGVja2JveEdyb3VwLmRlZmF1bHRQcm9wcylcblxuICAgIHNlbGVjdEFsbFVVSUQgPSB1dWlkKClcblxuICAgIGFsbEl0ZW1zQ2hlY2tlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuaXRlbXMuZXZlcnkoKGl0ZW0pID0+IGl0ZW0uaW5wdXRQcm9wcy5jaGVja2VkID09PSB0cnVlKTtcbiAgICB9XG5cbiAgICBhbnlJdGVtc0NoZWNrZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLml0ZW1zLnNvbWUoKGl0ZW0pID0+IGl0ZW0uaW5wdXRQcm9wcy5jaGVja2VkID09PSB0cnVlKTtcbiAgICB9XG5cbiAgICByZW5kZXJTZWxlY3RBbGxDaGVja2JveCgpIHtcbiAgICAgICAgY29uc3QgYWxsQ2hlY2tlZCA9IHRoaXMuYWxsSXRlbXNDaGVja2VkKCk7XG4gICAgICAgIGNvbnN0IHtpbnB1dFByb3BzfSA9IHRoaXMucHJvcHMuc2VsZWN0QWxsUHJvcHM7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxDaGVja2JveFxuICAgICAgICAgICAgICAgIHsuLi50aGlzLnByb3BzLnNlbGVjdEFsbFByb3BzfVxuICAgICAgICAgICAgICAgIGtleT17dGhpcy5zZWxlY3RBbGxVVUlEfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y3goJ2ItY2hlY2tib3gtZ3JvdXAtYWxsJywgdGhpcy5wcm9wcy5zZWxlY3RBbGxQcm9wcy5jbGFzc05hbWUpfVxuICAgICAgICAgICAgICAgIGlucHV0UHJvcHM9e3tcbiAgICAgICAgICAgICAgICAgICAgLi4uaW5wdXRQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tlZDogYWxsQ2hlY2tlZCxcbiAgICAgICAgICAgICAgICAgICAgaW5kZXRlcm1pbmF0ZTogIWFsbENoZWNrZWQgJiYgdGhpcy5hbnlJdGVtc0NoZWNrZWQoKSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogaW5wdXRQcm9wcyAmJiBpbnB1dFByb3BzLm5hbWUgPyBpbnB1dFByb3BzLm5hbWUgOiBudWxsLFxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgbGFiZWw9e3RoaXMucHJvcHMuc2VsZWN0QWxsUHJvcHMubGFiZWwgfHwgJ1NlbGVjdCBBbGwnfVxuICAgICAgICAgICAgICAgIG9uQ2hlY2tlZD17dGhpcy5wcm9wcy5vbkFsbENoZWNrZWR9XG4gICAgICAgICAgICAgICAgb25VbmNoZWNrZWQ9e3RoaXMucHJvcHMub25BbGxVbmNoZWNrZWR9IC8+XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmVuZGVyQ2hlY2tib3hlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuaXRlbXMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICB7Li4uaXRlbX1cbiAgICAgICAgICAgICAgICAgICAga2V5PXtpdGVtLmlucHV0UHJvcHMubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGVja2VkPXt0aGlzLnByb3BzLm9uQ2hpbGRDaGVja2VkfVxuICAgICAgICAgICAgICAgICAgICBvblVuY2hlY2tlZD17dGhpcy5wcm9wcy5vbkNoaWxkVW5jaGVja2VkfSAvPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVuZGVyQ2hpbGRyZW4oKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gW3RoaXMucmVuZGVyQ2hlY2tib3hlcygpXTtcblxuICAgICAgICBzd2l0Y2ggKHRoaXMucHJvcHMuc2VsZWN0QWxsKSB7XG4gICAgICAgIGNhc2UgQ2hlY2tib3hHcm91cC5zZWxlY3RBbGwuQkVGT1JFOlxuICAgICAgICAgICAgY2hpbGRyZW4udW5zaGlmdCh0aGlzLnJlbmRlclNlbGVjdEFsbENoZWNrYm94KCkpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBDaGVja2JveEdyb3VwLnNlbGVjdEFsbC5BRlRFUjpcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2godGhpcy5yZW5kZXJTZWxlY3RBbGxDaGVja2JveCgpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDx0aGlzLnByb3BzLmNvbXBvbmVudFxuICAgICAgICAgICAgICAgIHsuLi5vbWl0KHRoaXMucHJvcHMsIENoZWNrYm94R3JvdXAuaW50ZXJuYWxLZXlzKX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KCdiLWNoZWNrYm94LWdyb3VwJywgdGhpcy5wcm9wcy5jbGFzc05hbWUpfT5cbiAgICAgICAgICAgICAgICB7dGhpcy5yZW5kZXJDaGlsZHJlbigpfVxuICAgICAgICAgICAgPC90aGlzLnByb3BzLmNvbXBvbmVudD5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9ib3VuZGxlc3MtY2hlY2tib3gtZ3JvdXAvaW5kZXguanMiXSwic291cmNlUm9vdCI6IiJ9 |
@@ -11,3 +11,2 @@ import React, {PropTypes} from 'react'; | ||
/** | ||
# CheckboxGroup | ||
__A controller view for managing the aggregate state of multiple, related checkboxes.__ | ||
@@ -19,5 +18,6 @@ | ||
export default class CheckboxGroup extends React.PureComponent { | ||
static selectAllPosition = { | ||
static selectAll = { | ||
BEFORE: uuid(), | ||
AFTER: uuid(), | ||
NONE: uuid(), | ||
} | ||
@@ -27,2 +27,12 @@ | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
'*': PropTypes.any, | ||
/** | ||
* override the wrapper HTML element if desired | ||
*/ | ||
component: PropTypes.string, | ||
/** | ||
* the data wished to be rendered, each item must conform to the [Checkbox prop spec](./Checkbox#props) | ||
@@ -55,3 +65,7 @@ */ | ||
*/ | ||
selectAll: PropTypes.bool, | ||
selectAll: PropTypes.oneOf([ | ||
CheckboxGroup.selectAll.BEFORE, | ||
CheckboxGroup.selectAll.AFTER, | ||
CheckboxGroup.selectAll.NONE, | ||
]), | ||
@@ -63,2 +77,7 @@ /** | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
'*': PropTypes.any, | ||
/** | ||
* the text or renderable node to display next to the checkbox | ||
@@ -69,10 +88,6 @@ */ | ||
}), | ||
selectAllPosition: PropTypes.oneOf([ | ||
CheckboxGroup.selectAllPosition.BEFORE, | ||
CheckboxGroup.selectAllPosition.AFTER, | ||
]), | ||
} | ||
static defaultProps = { | ||
component: 'div', | ||
items: [], | ||
@@ -83,5 +98,4 @@ onAllChecked: noop, | ||
onChildUnchecked: noop, | ||
selectAll: false, | ||
selectAll: CheckboxGroup.selectAll.BEFORE, | ||
selectAllProps: {}, | ||
selectAllPosition: CheckboxGroup.selectAllPosition.BEFORE, | ||
} | ||
@@ -91,2 +105,4 @@ | ||
selectAllUUID = uuid() | ||
allItemsChecked() { | ||
@@ -100,26 +116,21 @@ return this.props.items.every((item) => item.inputProps.checked === true); | ||
renderSelectAll() { | ||
if (this.props.selectAll) { | ||
const allChecked = this.allItemsChecked(); | ||
const {inputProps} = this.props.selectAllProps; | ||
renderSelectAllCheckbox() { | ||
const allChecked = this.allItemsChecked(); | ||
const {inputProps} = this.props.selectAllProps; | ||
return ( | ||
<Checkbox | ||
{...this.props.selectAllProps} | ||
ref='select_all' | ||
key='cb_select_all' | ||
className={cx('b-checkbox-group-selectall', this.props.selectAllProps.className)} | ||
inputProps={{ | ||
...inputProps, | ||
checked: allChecked, | ||
indeterminate: !allChecked && this.anyItemsChecked(), | ||
name: inputProps && inputProps.name | ||
? inputProps.name | ||
: 'cb_select_all', | ||
}} | ||
label={this.props.selectAllProps.label || 'Select All'} | ||
onChecked={this.props.onAllChecked} | ||
onUnchecked={this.props.onAllUnchecked} /> | ||
); | ||
} | ||
return ( | ||
<Checkbox | ||
{...this.props.selectAllProps} | ||
key={this.selectAllUUID} | ||
className={cx('b-checkbox-group-all', this.props.selectAllProps.className)} | ||
inputProps={{ | ||
...inputProps, | ||
checked: allChecked, | ||
indeterminate: !allChecked && this.anyItemsChecked(), | ||
name: inputProps && inputProps.name ? inputProps.name : null, | ||
}} | ||
label={this.props.selectAllProps.label || 'Select All'} | ||
onChecked={this.props.onAllChecked} | ||
onUnchecked={this.props.onAllUnchecked} /> | ||
); | ||
} | ||
@@ -140,17 +151,15 @@ | ||
renderChildren() { | ||
const toBeRendered = [this.renderCheckboxes()]; | ||
const children = [this.renderCheckboxes()]; | ||
if (this.props.selectAll && this.props.selectAllPosition) { | ||
switch (this.props.selectAllPosition) { | ||
case CheckboxGroup.selectAllPosition.BEFORE: | ||
toBeRendered.unshift(this.renderSelectAll()); | ||
break; | ||
switch (this.props.selectAll) { | ||
case CheckboxGroup.selectAll.BEFORE: | ||
children.unshift(this.renderSelectAllCheckbox()); | ||
break; | ||
case CheckboxGroup.selectAllPosition.AFTER: | ||
toBeRendered.push(this.renderSelectAll()); | ||
break; | ||
} | ||
case CheckboxGroup.selectAll.AFTER: | ||
children.push(this.renderSelectAllCheckbox()); | ||
break; | ||
} | ||
return toBeRendered; | ||
return children; | ||
} | ||
@@ -160,10 +169,9 @@ | ||
return ( | ||
<div | ||
<this.props.component | ||
{...omit(this.props, CheckboxGroup.internalKeys)} | ||
ref='group' | ||
className={cx('b-checkbox-group', this.props.className)}> | ||
{this.renderChildren()} | ||
</div> | ||
</this.props.component> | ||
); | ||
} | ||
} |
{ | ||
"name": "boundless-checkbox-group", | ||
"version": "1.0.0-beta.5", | ||
"version": "1.0.0-beta.7", | ||
"description": "A controller view for managing the aggregate state of multiple, related checkboxes.", | ||
@@ -30,5 +30,5 @@ "main": "build/index.js", | ||
"dependencies": { | ||
"boundless-checkbox": "^1.0.0-beta.5", | ||
"boundless-utils-omit-keys": "^1.0.0-beta.5", | ||
"boundless-utils-uuid": "^1.0.0-beta.5", | ||
"boundless-checkbox": "^1.0.0-beta.7", | ||
"boundless-utils-omit-keys": "^1.0.0-beta.7", | ||
"boundless-utils-uuid": "^1.0.0-beta.7", | ||
"classnames": "^2.1.5" | ||
@@ -35,0 +35,0 @@ }, |
@@ -0,4 +1,6 @@ | ||
<!--- | ||
THIS IS AN AUTOGENERATED FILE. EDIT INDEX.JS INSTEAD. | ||
--> | ||
# CheckboxGroup | ||
# CheckboxGroup | ||
__A controller view for managing the aggregate state of multiple, related checkboxes.__ | ||
@@ -9,88 +11,192 @@ | ||
## Example Usage | ||
```jsx | ||
import React from 'react'; | ||
import CheckboxGroup from '../index'; | ||
import {filter, map, merge, some} from 'lodash'; | ||
export default class CheckboxGroupDemo extends React.PureComponent { | ||
state = { | ||
items: [{ | ||
inputProps: { | ||
checked: false, | ||
name: 'likes-science', | ||
}, | ||
label: 'Science', | ||
}, { | ||
inputProps: { | ||
checked: false, | ||
name: 'likes-math', | ||
}, | ||
label: 'Mathematics', | ||
}, { | ||
inputProps: { | ||
checked: false, | ||
name: 'likes-tech', | ||
}, | ||
label: 'Technology', | ||
}, { | ||
inputProps: { | ||
checked: false, | ||
name: 'likes-art', | ||
}, | ||
label: 'Art', | ||
}, { | ||
inputProps: { | ||
checked: false, | ||
name: 'likes-sports', | ||
}, | ||
label: 'Sports', | ||
}], | ||
} | ||
mutateAll(delta) { | ||
this.setState({ | ||
items: map(this.state.items, function transformer(item) { | ||
return merge({}, item, delta); | ||
}), | ||
}); | ||
} | ||
mutateOne(name, delta) { | ||
this.setState({ | ||
items: map(this.state.items, function transformer(item) { | ||
if (item.inputProps.name !== name) { | ||
return item; | ||
} | ||
return merge({}, item, delta); | ||
}), | ||
}); | ||
} | ||
handleAllChecked = () => { | ||
this.mutateAll({inputProps: {checked: true}}); | ||
} | ||
handleAllUnchecked = () => { | ||
this.mutateAll({inputProps: {checked: false}}); | ||
} | ||
handleChildChecked = (name) => { | ||
this.mutateOne(name, {inputProps: {checked: true}}); | ||
} | ||
handleChildUnchecked = (name) => { | ||
this.mutateOne(name, {inputProps: {checked: false}}); | ||
} | ||
renderFeedback() { | ||
if (some(this.state.items, {inputProps: {checked: true}})) { | ||
const liked = map(filter(this.state.items, {inputProps: {checked: true}}), 'label'); | ||
const lastIndex = liked.length - 1; | ||
return ( | ||
<p>You said you like: {liked.length === 1 ? liked[0] : [liked.slice(0, lastIndex).join(', '), 'and', liked.slice(lastIndex)].join(' ')}.</p> | ||
); | ||
} | ||
} | ||
render() { | ||
return ( | ||
<div> | ||
<p>What subjects are you interested in?</p> | ||
<CheckboxGroup | ||
className='checkbox-group-demo' | ||
items={this.state.items} | ||
selectAll={CheckboxGroup.selectAll.AFTER} | ||
selectAllProps={{label: 'All of the above'}} | ||
onAllChecked={this.handleAllChecked} | ||
onAllUnchecked={this.handleAllUnchecked} | ||
onChildChecked={this.handleChildChecked} | ||
onChildUnchecked={this.handleChildUnchecked} /> | ||
<br /> | ||
{this.renderFeedback()} | ||
</div> | ||
); | ||
} | ||
} | ||
``` | ||
## Props | ||
_Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/CheckboxGroup#props)._ | ||
> Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/CheckboxGroup#props). | ||
### Required Props | ||
<table> | ||
<tr> | ||
<th>Name</th> | ||
<th>Type</th> | ||
<th>Default Value</th> | ||
<th>Description</th> | ||
</tr> | ||
- __`items`__ ・ the data wished to be rendered, each item must conform to the [Checkbox prop spec](./Checkbox#props) | ||
<tr> | ||
<td>items</td> | ||
<td><pre><code>array</code></pre></td> | ||
<td><pre><code class="language-js">[]</code></pre></td> | ||
<td>the data wished to be rendered, each item must conform to the [Checkbox prop spec](./Checkbox#props)</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`array` | `[]` | ||
</table> | ||
### Optional Props | ||
<table> | ||
<tr> | ||
<th>Name</th> | ||
<th>Type</th> | ||
<th>Default Value</th> | ||
<th>Description</th> | ||
</tr> | ||
- __`*`__ ・ any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
<tr> | ||
<td>onAllChecked</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">() => {}</code></pre></td> | ||
<td>called when all children become checked (not fired on first render), no return</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any` | `n/a` | ||
<tr> | ||
<td>onAllUnchecked</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">() => {}</code></pre></td> | ||
<td>called when all children become unchecked (not fired on first render), no return</td> | ||
</tr> | ||
- __`component`__ ・ override the wrapper HTML element if desired | ||
<tr> | ||
<td>onChildChecked</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">() => {}</code></pre></td> | ||
<td>called when a specific child has become checked, returns the child definition</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`string` | `'div'` | ||
<tr> | ||
<td>onChildUnchecked</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">() => {}</code></pre></td> | ||
<td>called when a specific child has become checked, returns the child definition</td> | ||
</tr> | ||
- __`onAllChecked`__ ・ called when all children become checked (not fired on first render), no return | ||
<tr> | ||
<td>selectAll</td> | ||
<td><pre><code>bool</code></pre></td> | ||
<td><pre><code class="language-js">false</code></pre></td> | ||
<td>renders a master checkbox that can manipulate the values of all children simultaneously</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`function` | `() => {}` | ||
<tr> | ||
<td>selectAllPosition</td> | ||
<td><pre><code>CheckboxGroup.selectAllPosition.BEFORE or | ||
CheckboxGroup.selectAllPosition.AFTER</code></pre></td> | ||
<td><pre><code class="language-js">CheckboxGroup.selectAllPosition.BEFORE</code></pre></td> | ||
<td></td> | ||
</tr> | ||
- __`onAllUnchecked`__ ・ called when all children become unchecked (not fired on first render), no return | ||
<tr> | ||
<td>selectAllProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>must conform to the [Checkbox prop spec](./Checkbox#props)</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`function` | `() => {}` | ||
</table> | ||
- __`onChildChecked`__ ・ called when a specific child has become checked, returns the child definition | ||
Expects | Default Value | ||
- | - | ||
`function` | `() => {}` | ||
- __`onChildUnchecked`__ ・ called when a specific child has become checked, returns the child definition | ||
Expects | Default Value | ||
- | - | ||
`function` | `() => {}` | ||
- __`selectAll`__ ・ renders a master checkbox that can manipulate the values of all children simultaneously | ||
Expects | Default Value | ||
- | - | ||
`CheckboxGroup.selectAll.BEFORE or CheckboxGroup.selectAll.AFTER or CheckboxGroup.selectAll.NONE` | `CheckboxGroup.selectAll.BEFORE` | ||
- __`selectAllProps`__ ・ must conform to the [Checkbox prop spec](./Checkbox#props) | ||
Expects | Default Value | ||
- | - | ||
`object` | `{}` | ||
## Reference Styles | ||
### Stylus | ||
```stylus | ||
// Bring in Boundless's base Stylus variables | ||
@require "node_modules/boundless-checkbox-group/variables" | ||
// Redefine any variables as desired, e.g. | ||
color-accent = royalblue | ||
// Bring in the component styles; they will be autoconfigured based on the above | ||
@require "node_modules/boundless-checkbox-group/style" | ||
``` | ||
### CSS | ||
If desired, a precompiled plain CSS stylesheet is available for customization at `/build/style.css`, based on Boundless's [default variables](https://github.com/enigma-io/boundless/blob/master/variables.styl). | ||
@@ -1,2 +0,2 @@ | ||
module.exports=function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=4)}([function(e,t,n){"use strict";function r(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Object.keys(e).reduce(function(n,r){return t.indexOf(r)===-1&&(n[r]=e[r]),n},{})}t.a=r},function(e,t,n){"use strict";function r(){return"b-"+([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,function(e){return(e^16*Math.random()>>e/4).toString(16)})}t.a=r},function(e,t){e.exports=require("classnames")},function(e,t){e.exports=require("react")},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function p(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var i=n(3),s=n.n(i),a=n(2),c=n.n(a),u=n(0),l=n(1),f=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},h=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),d=function(e){return"function"==typeof e},b=function(){},P=function(e){function t(){var e,p,i,s;r(this,t);for(var a=arguments.length,c=Array(a),u=0;u<a;u++)c[u]=arguments[u];return p=i=o(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(c))),i.id=n.i(l.a)(),i.handleChange=function(e){i.props.inputProps.disabled||(i.props[i.props.inputProps.checked?"onUnchecked":"onChecked"](i.props.inputProps.name),d(i.props.inputProps.onChange)&&i.props.inputProps.onChange(e))},i.handleClick=function(e){i.props.inputProps.disabled||(i.refs.input.focus(),d(i.props.inputProps.onClick)&&i.props.inputProps.onClick(e))},s=p,o(i,s)}return p(t,e),h(t,[{key:"componentDidMount",value:function(){this.props.inputProps.indeterminate&&this.setIndeterminate()}},{key:"componentDidUpdate",value:function(e){e.inputProps.indeterminate!==this.props.inputProps.indeterminate&&this.setIndeterminate()}},{key:"setIndeterminate",value:function(){this.refs.input.indeterminate=!!this.props.inputProps.indeterminate}},{key:"getAriaState",value:function(){return this.props.inputProps.indeterminate?"mixed":String(this.props.inputProps.checked)}},{key:"renderInput",value:function(){return s.a.createElement("input",f({},n.i(u.a)(this.props.inputProps,"indeterminate"),{ref:"input",type:"checkbox",className:c()("b-checkbox",this.props.inputProps.className,{"b-checkbox-mixed":this.props.inputProps.indeterminate,"b-checkbox-checked":this.props.inputProps.checked,"b-checkbox-unchecked":!this.props.inputProps.indeterminate&&!this.props.inputProps.checked}),id:this.props.inputProps.id||this.id,"aria-checked":this.getAriaState(),onChange:this.handleChange,onClick:this.handleClick}))}},{key:"renderLabel",value:function(){if(this.props.label)return s.a.createElement("label",f({},this.props.labelProps,{ref:"label",className:c()("b-checkbox-label",this.props.labelProps.className),htmlFor:this.props.inputProps.id||this.id}),this.props.label)}},{key:"render",value:function(){return s.a.createElement("div",f({},n.i(u.a)(this.props,t.internalKeys),{ref:"wrapper",className:c()("b-checkbox-wrapper",this.props.className)}),this.renderInput(),this.renderLabel())}}]),t}(s.a.PureComponent);P.propTypes={inputProps:i.PropTypes.shape({checked:i.PropTypes.bool,className:i.PropTypes.string,disabled:i.PropTypes.bool,id:i.PropTypes.string,indeterminate:i.PropTypes.bool,onChange:i.PropTypes.func,onClick:i.PropTypes.func,name:i.PropTypes.string,value:i.PropTypes.string}),label:i.PropTypes.node,labelProps:i.PropTypes.object,onChecked:i.PropTypes.func,onUnchecked:i.PropTypes.func},P.defaultProps={inputProps:{checked:!1,indeterminate:!1},label:null,labelProps:{},onChecked:b,onUnchecked:b},P.internalKeys=Object.keys(P.defaultProps),t.default=P}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIDM2MmUyOThiZTVkMGUxZDI5MDJjIiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvYm91bmRsZXNzLXV0aWxzLXV1aWQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiY2xhc3NuYW1lc1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdFwifSIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9ib3VuZGxlc3MtY2hlY2tib3gvaW5kZXguanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJ2YWx1ZSIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiX193ZWJwYWNrX2V4cG9ydHNfXyIsIm9taXRLZXlzRnJvbVNvdXJjZU9iamVjdCIsInNvdXJjZSIsIm9taXR0ZWRLZXlzIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwia2V5cyIsInJlZHVjZSIsImhhc2giLCJrZXkiLCJpbmRleE9mIiwidXVpZCIsInJlcGxhY2UiLCJhIiwiTWF0aCIsInJhbmRvbSIsInRvU3RyaW5nIiwicmVxdWlyZSIsIl9jbGFzc0NhbGxDaGVjayIsImluc3RhbmNlIiwiQ29uc3RydWN0b3IiLCJUeXBlRXJyb3IiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiIsInNlbGYiLCJSZWZlcmVuY2VFcnJvciIsIl9pbmhlcml0cyIsInN1YkNsYXNzIiwic3VwZXJDbGFzcyIsImNyZWF0ZSIsImNvbnN0cnVjdG9yIiwid3JpdGFibGUiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc191dWlkX18iLCJfZXh0ZW5kcyIsImFzc2lnbiIsInRhcmdldCIsIl9jcmVhdGVDbGFzcyIsImRlZmluZVByb3BlcnRpZXMiLCJwcm9wcyIsImRlc2NyaXB0b3IiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJpc0Z1bmN0aW9uIiwieCIsIm5vb3AiLCJDaGVja2JveCIsIl9SZWFjdCRQdXJlQ29tcG9uZW50IiwiX3JlZiIsIl90ZW1wIiwiX3RoaXMiLCJfcmV0IiwidGhpcyIsIl9sZW4iLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiZ2V0UHJvdG90eXBlT2YiLCJhcHBseSIsImNvbmNhdCIsImlkIiwiaGFuZGxlQ2hhbmdlIiwiZXZlbnQiLCJpbnB1dFByb3BzIiwiZGlzYWJsZWQiLCJjaGVja2VkIiwib25DaGFuZ2UiLCJoYW5kbGVDbGljayIsInJlZnMiLCJpbnB1dCIsImZvY3VzIiwib25DbGljayIsImluZGV0ZXJtaW5hdGUiLCJzZXRJbmRldGVybWluYXRlIiwicHJldlByb3BzIiwiU3RyaW5nIiwiY3JlYXRlRWxlbWVudCIsInJlZiIsInR5cGUiLCJjbGFzc05hbWUiLCJiLWNoZWNrYm94LW1peGVkIiwiYi1jaGVja2JveC1jaGVja2VkIiwiYi1jaGVja2JveC11bmNoZWNrZWQiLCJhcmlhLWNoZWNrZWQiLCJnZXRBcmlhU3RhdGUiLCJsYWJlbCIsImxhYmVsUHJvcHMiLCJodG1sRm9yIiwiaW50ZXJuYWxLZXlzIiwicmVuZGVySW5wdXQiLCJyZW5kZXJMYWJlbCIsIlB1cmVDb21wb25lbnQiLCJwcm9wVHlwZXMiLCJzaGFwZSIsImJvb2wiLCJzdHJpbmciLCJmdW5jIiwibm9kZSIsIm9uQ2hlY2tlZCIsIm9uVW5jaGVja2VkIiwiZGVmYXVsdFByb3BzIl0sIm1hcHBpbmdzIjoiQUFBQUEsT0FBT0MsUUFDRSxTQUFVQyxHQ0duQixRQUFBQyxHQUFBQyxHQUdBLEdBQUFDLEVBQUFELEdBQ0EsTUFBQUMsR0FBQUQsR0FBQUgsT0FHQSxJQUFBRCxHQUFBSyxFQUFBRCxJQUNBRSxFQUFBRixFQUNBRyxHQUFBLEVBQ0FOLFdBVUEsT0FOQUMsR0FBQUUsR0FBQUksS0FBQVIsRUFBQUMsUUFBQUQsSUFBQUMsUUFBQUUsR0FHQUgsRUFBQU8sR0FBQSxFQUdBUCxFQUFBQyxRQXZCQSxHQUFBSSxLQStEQSxPQW5DQUYsR0FBQU0sRUFBQVAsRUFHQUMsRUFBQU8sRUFBQUwsRUFHQUYsRUFBQUcsRUFBQSxTQUFBSyxHQUEyQyxNQUFBQSxJQUczQ1IsRUFBQVMsRUFBQSxTQUFBWCxFQUFBWSxFQUFBQyxHQUNBWCxFQUFBWSxFQUFBZCxFQUFBWSxJQUNBRyxPQUFBQyxlQUFBaEIsRUFBQVksR0FDQUssY0FBQSxFQUNBQyxZQUFBLEVBQ0FDLElBQUFOLEtBTUFYLEVBQUFrQixFQUFBLFNBQUFyQixHQUNBLEdBQUFjLEdBQUFkLEtBQUFzQixXQUNBLFdBQTJCLE1BQUF0QixHQUFBLFNBQzNCLFdBQWlDLE1BQUFBLEdBRWpDLE9BREFHLEdBQUFTLEVBQUFFLEVBQUEsSUFBQUEsR0FDQUEsR0FJQVgsRUFBQVksRUFBQSxTQUFBUSxFQUFBQyxH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USxLQUN6Q1IsS0FBS2IsTUFBTThDLFVOakRzd0lqRixJQUFJLFNBQVM1QixNQUFNLFdNd0RqekksTUFDSXFELEdBQUFyQixFQUFBb0UsY0FBQSxNQUFBMUMsS0FDUWxFLEVBQUFHLEVBQUE2RCxFQUFBLEdBQUtvQixLQUFLYixNQUFPTyxFQUFTMEMsZUFDOUJYLElBQUksVUFDSkUsVUFBV2hELElBQUcscUJBQXNCcUIsS0FBS2IsTUFBTXdDLGFBQzlDM0IsS0FBS3FDLGNBQ0xyQyxLQUFLc0MsbUJOOUQwcko1QyxHTTVGMXFKakIsRUFBQXJCLEVBQU1tRixjQUF2QjdDLEdBQ1Y4QyxXQUtIN0IsV0FBWW5DLEVBQUEsVUFBVWlFLE9BSWxCNUIsUUFBU3JDLEVBQUEsVUFBVWtFLEtBRW5CZixVQUFXbkQsRUFBQSxVQUFVbUUsT0FLckIvQixTQUFVcEMsRUFBQSxVQUFVa0UsS0FDcEJsQyxHQUFJaEMsRUFBQSxVQUFVbUUsT0FLZHZCLGNBQWU1QyxFQUFBLFVBQVVrRSxLQUV6QjVCLFNBQVV0QyxFQUFBLFVBQVVvRSxLQUNwQnpCLFFBQVMzQyxFQUFBLFVBQVVvRSxLQUtuQnRILEtBQU1rRCxFQUFBLFVBQVVtRSxPQUtoQnZILE1BQU9vRCxFQUFBLFVBQVVtRSxTQU1yQlYsTUFBT3pELEVBQUEsVUFBVXFFLEtBS2pCWCxXQUFZMUQsRUFBQSxVQUFVeEMsT0FLdEI4RyxVQUFXdEUsRUFBQSxVQUFVb0UsS0FLckJHLFlBQWF2RSxFQUFBLFVBQVVvRSxNQXpEVmxELEVBNERWc0QsY0FDSHJDLFlBQ0lFLFNBQVMsRUFDVE8sZUFBZSxHQUVuQmEsTUFBTyxLQUNQQyxjQUNBWSxVQUFXckQsRUFDWHNELFlBQWF0RCxHQXBFQUMsRUF1RVYwQyxhQUFlM0csT0FBT29CLEtBQUs2QyxFQUFTc0QsY05xQmcxTDFHLEVBQTZCLFFNNUZ2NExvRCIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbi8qKioqKiovIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbi8qKioqKiovIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA0KTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGV4cG9ydCAoaW1tdXRhYmxlKSAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IG9taXRLZXlzRnJvbVNvdXJjZU9iamVjdDtcbmZ1bmN0aW9uIG9taXRLZXlzRnJvbVNvdXJjZU9iamVjdChzb3VyY2Upe3ZhciBvbWl0dGVkS2V5cz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMV06W107cmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIHJlbG9jYXRlQWNjZXB0ZWRLZXlzKGhhc2gsa2V5KXtpZihvbWl0dGVkS2V5cy5pbmRleE9mKGtleSk9PT0tMSl7aGFzaFtrZXldPXNvdXJjZVtrZXldO31yZXR1cm4gaGFzaDt9LHt9KTt9XG5cbi8qKiovIH0pLFxuLyogMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgZXhwb3J0IChpbW11dGFibGUpICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gdXVpZDtcbmZ1bmN0aW9uIHV1aWQoKXtyZXR1cm4nYi0nKyhbMWU3XSstMWUzKy00ZTMrLThlMystMWUxMSkucmVwbGFjZSgvWzAxOF0vZyxmdW5jdGlvbihhKXtyZXR1cm4oYV5NYXRoLnJhbmRvbSgpKjE2Pj5hLzQpLnRvU3RyaW5nKDE2KTt9KTt9XG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpO1xuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShfX3dlYnBhY2tfZXhwb3J0c19fLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfdXVpZF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcbnZhciBfZXh0ZW5kcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0YXJnZXQpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9YXJndW1lbnRzW2ldO2Zvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSxrZXkpKXt0YXJnZXRba2V5XT1zb3VyY2Vba2V5XTt9fX1yZXR1cm4gdGFyZ2V0O307dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoXCJ2YWx1ZVwiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKTt9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcjt9O30oKTtmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7fX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLGNhbGwpe2lmKCFzZWxmKXt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7fXJldHVybiBjYWxsJiYodHlwZW9mIGNhbGw9PT1cIm9iamVjdFwifHx0eXBlb2YgY2FsbD09PVwiZnVuY3Rpb25cIik/Y2FsbDpzZWxmO31mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT1cImZ1bmN0aW9uXCImJnN1cGVyQ2xhc3MhPT1udWxsKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2Ygc3VwZXJDbGFzcyk7fXN1YkNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MmJnN1cGVyQ2xhc3MucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6c3ViQ2xhc3MsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfX0pO2lmKHN1cGVyQ2xhc3MpT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcyxzdXBlckNsYXNzKTpzdWJDbGFzcy5fX3Byb3RvX189c3VwZXJDbGFzczt9dmFyIGlzRnVuY3Rpb249ZnVuY3Rpb24gaXNGdW5jdGlvbih4KXtyZXR1cm4gdHlwZW9mIHg9PT0nZnVuY3Rpb24nO307dmFyIG5vb3A9ZnVuY3Rpb24gbm9vcCgpe307dmFyIENoZWNrYm94PWZ1bmN0aW9uKF9SZWFjdCRQdXJlQ29tcG9uZW50KXtfaW5oZXJpdHMoQ2hlY2tib3gsX1JlYWN0JFB1cmVDb21wb25lbnQpO2Z1bmN0aW9uIENoZWNrYm94KCl7dmFyIF9yZWY7dmFyIF90ZW1wLF90aGlzLF9yZXQ7X2NsYXNzQ2FsbENoZWNrKHRoaXMsQ2hlY2tib3gpO2Zvcih2YXIgX2xlbj1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkoX2xlbiksX2tleT0wO19rZXk8X2xlbjtfa2V5Kyspe2FyZ3NbX2tleV09YXJndW1lbnRzW19rZXldO31yZXR1cm4gX3JldD0oX3RlbXA9KF90aGlzPV9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKF9yZWY9Q2hlY2tib3guX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ2hlY2tib3gpKS5jYWxsLmFwcGx5KF9yZWYsW3RoaXNdLmNvbmNhdChhcmdzKSkpLF90aGlzKSxfdGhpcy5pZD1fX3dlYnBhY2tfcmVxdWlyZV9fLmkoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc191dWlkX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKCksX3RoaXMuaGFuZGxlQ2hhbmdlPWZ1bmN0aW9uKGV2ZW50KXtpZihfdGhpcy5wcm9wcy5pbnB1dFByb3BzLmRpc2FibGVkKXtyZXR1cm47fV90aGlzLnByb3BzWyFfdGhpcy5wcm9wcy5pbnB1dFByb3BzLmNoZWNrZWQ/J29uQ2hlY2tlZCc6J29uVW5jaGVja2VkJ10oX3RoaXMucHJvcHMuaW5wdXRQcm9wcy5uYW1lKTtpZihpc0Z1bmN0aW9uKF90aGlzLnByb3BzLmlucHV0UHJvcHMub25DaGFuZ2UpKXtfdGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uQ2hhbmdlKGV2ZW50KTt9fSxfdGhpcy5oYW5kbGVDbGljaz1mdW5jdGlvbihldmVudCl7aWYoX3RoaXMucHJvcHMuaW5wdXRQcm9wcy5kaXNhYmxlZCl7cmV0dXJuO31fdGhpcy5yZWZzLmlucHV0LmZvY3VzKCk7aWYoaXNGdW5jdGlvbihfdGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uQ2xpY2spKXtfdGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uQ2xpY2soZXZlbnQpO319LF90ZW1wKSxfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcyxfcmV0KTt9X2NyZWF0ZUNsYXNzKENoZWNrYm94LFt7a2V5Oidjb21wb25lbnREaWRNb3VudCcsdmFsdWU6ZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKXtpZih0aGlzLnByb3BzLmlucHV0UHJvcHMuaW5kZXRlcm1pbmF0ZSl7dGhpcy5zZXRJbmRldGVybWluYXRlKCk7fX19LHtrZXk6J2NvbXBvbmVudERpZFVwZGF0ZScsdmFsdWU6ZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcyl7aWYocHJldlByb3BzLmlucHV0UHJvcHMuaW5kZXRlcm1pbmF0ZSE9PXRoaXMucHJvcHMuaW5wdXRQcm9wcy5pbmRldGVybWluYXRlKXt0aGlzLnNldEluZGV0ZXJtaW5hdGUoKTt9fX0se2tleTonc2V0SW5kZXRlcm1pbmF0ZScsdmFsdWU6ZnVuY3Rpb24gc2V0SW5kZXRlcm1pbmF0ZSgpe3RoaXMucmVmcy5pbnB1dC5pbmRldGVybWluYXRlPSEhdGhpcy5wcm9wcy5pbnB1dFByb3BzLmluZGV0ZXJtaW5hdGU7fX0se2tleTonZ2V0QXJpYVN0YXRlJyx2YWx1ZTpmdW5jdGlvbiBnZXRBcmlhU3RhdGUoKXtyZXR1cm4gdGhpcy5wcm9wcy5pbnB1dFByb3BzLmluZGV0ZXJtaW5hdGU/J21peGVkJzpTdHJpbmcodGhpcy5wcm9wcy5pbnB1dFByb3BzLmNoZWNrZWQpO319LHtrZXk6J3JlbmRlcklucHV0Jyx2YWx1ZTpmdW5jdGlvbiByZW5kZXJJbnB1dCgpe3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudCgnaW5wdXQnLF9leHRlbmRzKHt9LF9fd2VicGFja19yZXF1aXJlX18uaShfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKSh0aGlzLnByb3BzLmlucHV0UHJvcHMsJ2luZGV0ZXJtaW5hdGUnKSx7cmVmOidpbnB1dCcsdHlwZTonY2hlY2tib3gnLGNsYXNzTmFtZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQoKSgnYi1jaGVja2JveCcsdGhpcy5wcm9wcy5pbnB1dFByb3BzLmNsYXNzTmFtZSx7J2ItY2hlY2tib3gtbWl4ZWQnOnRoaXMucHJvcHMuaW5wdXRQcm9wcy5pbmRldGVybWluYXRlLCdiLWNoZWNrYm94LWNoZWNrZWQnOnRoaXMucHJvcHMuaW5wdXRQcm9wcy5jaGVja2VkLCdiLWNoZWNrYm94LXVuY2hlY2tlZCc6IXRoaXMucHJvcHMuaW5wdXRQcm9wcy5pbmRldGVybWluYXRlJiYhdGhpcy5wcm9wcy5pbnB1dFByb3BzLmNoZWNrZWR9KSxpZDp0aGlzLnByb3BzLmlucHV0UHJvcHMuaWR8fHRoaXMuaWQsJ2FyaWEtY2hlY2tlZCc6dGhpcy5nZXRBcmlhU3RhdGUoKSxvbkNoYW5nZTp0aGlzLmhhbmRsZUNoYW5nZSxvbkNsaWNrOnRoaXMuaGFuZGxlQ2xpY2t9KSk7fX0se2tleToncmVuZGVyTGFiZWwnLHZhbHVlOmZ1bmN0aW9uIHJlbmRlckxhYmVsKCl7aWYodGhpcy5wcm9wcy5sYWJlbCl7cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KCdsYWJlbCcsX2V4dGVuZHMoe30sdGhpcy5wcm9wcy5sYWJlbFByb3BzLHtyZWY6J2xhYmVsJyxjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItY2hlY2tib3gtbGFiZWwnLHRoaXMucHJvcHMubGFiZWxQcm9wcy5jbGFzc05hbWUpLGh0bWxGb3I6dGhpcy5wcm9wcy5pbnB1dFByb3BzLmlkfHx0aGlzLmlkfSksdGhpcy5wcm9wcy5sYWJlbCk7fX19LHtrZXk6J3JlbmRlcicsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyKCl7cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KCdkaXYnLF9leHRlbmRzKHt9LF9fd2VicGFja19yZXF1aXJlX18uaShfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKSh0aGlzLnByb3BzLENoZWNrYm94LmludGVybmFsS2V5cykse3JlZjond3JhcHBlcicsY2xhc3NOYW1lOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCgpKCdiLWNoZWNrYm94LXdyYXBwZXInLHRoaXMucHJvcHMuY2xhc3NOYW1lKX0pLHRoaXMucmVuZGVySW5wdXQoKSx0aGlzLnJlbmRlckxhYmVsKCkpO319XSk7cmV0dXJuIENoZWNrYm94O30oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLlB1cmVDb21wb25lbnQpO0NoZWNrYm94LnByb3BUeXBlcz17aW5wdXRQcm9wczpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5zaGFwZSh7Y2hlY2tlZDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ib29sLGNsYXNzTmFtZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5zdHJpbmcsZGlzYWJsZWQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYm9vbCxpZDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5zdHJpbmcsaW5kZXRlcm1pbmF0ZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ib29sLG9uQ2hhbmdlOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmMsb25DbGljazpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jLG5hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc3RyaW5nLHZhbHVlOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLnN0cmluZ30pLGxhYmVsOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm5vZGUsbGFiZWxQcm9wczpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5vYmplY3Qsb25DaGVja2VkOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmMsb25VbmNoZWNrZWQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uZnVuY307Q2hlY2tib3guZGVmYXVsdFByb3BzPXtpbnB1dFByb3BzOntjaGVja2VkOmZhbHNlLGluZGV0ZXJtaW5hdGU6ZmFsc2V9LGxhYmVsOm51bGwsbGFiZWxQcm9wczp7fSxvbkNoZWNrZWQ6bm9vcCxvblVuY2hlY2tlZDpub29wfTtDaGVja2JveC5pbnRlcm5hbEtleXM9T2JqZWN0LmtleXMoQ2hlY2tib3guZGVmYXVsdFByb3BzKTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gQ2hlY2tib3g7XG5cbi8qKiovIH0pXG4vKioqKioqLyBdKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gaW5kZXguanMiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA0KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCAzNjJlMjk4YmU1ZDBlMWQyOTAyYyIsIi8qKlxuICogUmV0dXJucyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHN1cHBsaWVkIG9iamVjdCB3aXRob3V0IHRoZSBnaXZlbiBrZXlzLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBvbWl0S2V5c0Zyb21Tb3VyY2VPYmplY3Qoc291cmNlLCBvbWl0dGVkS2V5cyA9IFtdKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIHJlbG9jYXRlQWNjZXB0ZWRLZXlzKGhhc2gsIGtleSkge1xuICAgICAgICBpZiAob21pdHRlZEtleXMuaW5kZXhPZihrZXkpID09PSAtMSkge1xuICAgICAgICAgICAgaGFzaFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFzaDtcbiAgICB9LCB7fSk7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9ib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzL2luZGV4LmpzIiwiLyoqXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQuIEFkZHMgYSBwcmVmaXggc28gaXQgaXMgc3VpdGFibGUgZm9yIHVzZSBhcyBhbiBIVE1MIElELlxuICogQmFzZWQgb24ge0BsaW5rIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2plZC85ODI4ODMgdGhpcyBpbXBsZW1lbnRhdGlvbn0uXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBhIHVuaXF1ZSBpZGVudGlmaWVyXG4gKlxuICogQGV4YW1wbGVcbiAqIHV1aWQoKTsgLy8gYi0xZjJjZDI3Zi0wNzU0LTQzNDQtOWQyMC00MzZhMjAxYjJmODBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXVpZCgpIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAgIHJldHVybiAnYi0nICsgKFsxZTddKy0xZTMrLTRlMystOGUzKy0xZTExKS5yZXBsYWNlKC9bMDE4XS9nLGE9PihhXk1hdGgucmFuZG9tKCkqMTY+PmEvNCkudG9TdHJpbmcoMTYpKTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlICovXG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9ib3VuZGxlc3MtdXRpbHMtdXVpZC9pbmRleC5qcyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNsYXNzbmFtZXNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJjbGFzc25hbWVzXCJ9XG4vLyBtb2R1bGUgaWQgPSAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn1cbi8vIG1vZHVsZSBpZCA9IDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IFJlYWN0LCB7UHJvcFR5cGVzfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY3ggZnJvbSAnY2xhc3NuYW1lcyc7XG5cbmltcG9ydCBvbWl0IGZyb20gJ2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMnO1xuaW1wb3J0IHV1aWQgZnJvbSAnYm91bmRsZXNzLXV0aWxzLXV1aWQnO1xuXG5jb25zdCBpc0Z1bmN0aW9uID0gKHgpID0+IHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nO1xuY29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuXG4vKipcbiMgQ2hlY2tib3hcbl9fQW4gYWNjZXNzaWJsZSBjaGVja2JveCB3aXRoIGluZGV0ZXJtaW5hdGUgc3VwcG9ydC5fX1xuXG5DaGVja2JveCBpcyBpbXBsZW1lbnRlZCBhcyBhIFwiY29udHJvbGxlZCBpbnB1dFwiLCBtZWFuaW5nIGl0IGlzIGEgZGlyZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBkYXRhIHBhc3NlZFxuaW5zaWRlLiBVc2VyIGludGVyYWN0aW9uIHdpbGwgYnViYmxlIGNoYW5nZXMgaW4gdGhlIGZvcm0gb2YgYG9uQ2hlY2tlZGAgYW5kIGBvblVuY2hlY2tlZGAgdGhhdCBhIGNvbnRyb2xsZXJcbnZpZXcgbXVzdCBpbnRlcmNlcHQgYW5kIGFwcGx5IGFnYWluc3QgdGhlIGRhdGEgcHJvdmlkZXIuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENoZWNrYm94IGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFsbCBpbnB1dC1zcGVjaWZpYyBwcm9wcyBsaWtlIGB2YWx1ZWAsIGBuYW1lYCwgZXRjIHNob3VsZCBiZSBwYXNzZWQgaGVyZSAtLSBjb21tb24gb25lcyBhcmUgbGlzdGVkIGJlbG93LlxuICAgICAgICAgKiBBbHNvIHN1cHBvcnRzIGFueSBbUmVhY3Qtc3VwcG9ydGVkIGF0dHJpYnV0ZV0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90YWdzLWFuZC1hdHRyaWJ1dGVzLmh0bWwjaHRtbC1hdHRyaWJ1dGVzKTsgYXBwbGllZCB0byB0aGUgYC5iLWNoZWNrYm94YCBub2RlXG4gICAgICAgICAqL1xuICAgICAgICBpbnB1dFByb3BzOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBkZXRlcm1pbmVzIGlmIHRoZSBjaGVja2JveCBpcyByZW5kZXJlZCBhcyBjaGVja2VkL3VuY2hlY2tlZCwgc2VlIFJlYWN0IFtcImNvbnRyb2xsZWQgaW5wdXRzXCJdKGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvZm9ybXMuaHRtbCNjb250cm9sbGVkLWNvbXBvbmVudHMpKVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjaGVja2VkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAgICAgICAgICAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIHByZXZlbnRzIHRoZSBgb257Q2hlY2tlZCxVbmNoZWNrZWR9YCBldmVudHMgZnJvbSBmaXJpbmcgd2hlbiBgdHJ1ZWBcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuICAgICAgICAgICAgaWQ6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogZW5hYmxlcyBvciBkaXNhYmxlcyBcIm1peGVkXCIgY2hlY2tib3ggc3RhdGUsIHJlYWQgdGhpcyBbQ1NTLVRyaWNrcyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2luZGV0ZXJtaW5hdGUtY2hlY2tib3hlcy8pICBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgZXhhbXBsZXNcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaW5kZXRlcm1pbmF0ZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgICAgICAgICAgIG9uQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgICAgIG9uQ2xpY2s6IFByb3BUeXBlcy5mdW5jLFxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIHJlbmRlcmVkIGFzIHRoZSBpbnB1dCBjb250cm9sJ3MgZm9ybSBuYW1lXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIG5hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogIHBhc3NlZC10aHJvdWdoIHRvIHRoZSBpbnB1dCBub2RlLCBsaWtlIGBuYW1lYFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICB2YWx1ZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgfSksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFueSBSZWFjdC1yZW5kZXJhYmxlIGNvbnRlbnQsIG1vc3QgY29tbW9ubHkgYSBzaW1wbGUgc3RyaW5nXG4gICAgICAgICAqL1xuICAgICAgICBsYWJlbDogUHJvcFR5cGVzLm5vZGUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFueSBbUmVhY3Qtc3VwcG9ydGVkIGF0dHJpYnV0ZV0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90YWdzLWFuZC1hdHRyaWJ1dGVzLmh0bWwjaHRtbC1hdHRyaWJ1dGVzKTsgYXBwbGllZCB0byB0aGUgYC5iLWNoZWNrYm94LWxhYmVsYCBub2RlXG4gICAgICAgICAqL1xuICAgICAgICBsYWJlbFByb3BzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBjYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBiZWNvbWVzIGNoZWNrZWQ7IGJhY2tpbmcgZGF0YSBtdXN0IGJlIHVwZGF0ZWQgdG8gcGVyc2lzdCB0aGUgc3RhdGUgY2hhbmdlXG4gICAgICAgICAqL1xuICAgICAgICBvbkNoZWNrZWQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBjYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBiZWNvbWVzIHVuY2hlY2tlZDsgYmFja2luZyBkYXRhIG11c3QgYmUgdXBkYXRlZCB0byBwZXJzaXN0IHRoZSBzdGF0ZSBjaGFuZ2VcbiAgICAgICAgICovXG4gICAgICAgIG9uVW5jaGVja2VkOiBQcm9wVHlwZXMuZnVuYyxcbiAgICB9XG5cbiAgICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgICBpbnB1dFByb3BzOiB7XG4gICAgICAgICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICAgICAgICAgIGluZGV0ZXJtaW5hdGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBsYWJlbDogbnVsbCxcbiAgICAgICAgbGFiZWxQcm9wczoge30sXG4gICAgICAgIG9uQ2hlY2tlZDogbm9vcCxcbiAgICAgICAgb25VbmNoZWNrZWQ6IG5vb3AsXG4gICAgfVxuXG4gICAgc3RhdGljIGludGVybmFsS2V5cyA9IE9iamVjdC5rZXlzKENoZWNrYm94LmRlZmF1bHRQcm9wcylcblxuICAgIGlkID0gdXVpZCgpXG5cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuaW5wdXRQcm9wcy5pbmRldGVybWluYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnNldEluZGV0ZXJtaW5hdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICAgICAgaWYgKHByZXZQcm9wcy5pbnB1dFByb3BzLmluZGV0ZXJtaW5hdGUgIT09IHRoaXMucHJvcHMuaW5wdXRQcm9wcy5pbmRldGVybWluYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnNldEluZGV0ZXJtaW5hdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldEluZGV0ZXJtaW5hdGUoKSB7XG4gICAgICAgIHRoaXMucmVmcy5pbnB1dC5pbmRldGVybWluYXRlID0gISF0aGlzLnByb3BzLmlucHV0UHJvcHMuaW5kZXRlcm1pbmF0ZTtcbiAgICB9XG5cbiAgICBoYW5kbGVDaGFuZ2UgPSAoZXZlbnQpID0+IHsgLy8gU2VuZCB0aGUgb3Bwb3NpdGUgc2lnbmFsIGZyb20gd2hhdCB3YXMgcGFzc2VkIHRvIHRvZ2dsZSB0aGUgZGF0YVxuICAgICAgICBpZiAodGhpcy5wcm9wcy5pbnB1dFByb3BzLmRpc2FibGVkKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHRoaXMucHJvcHNbIXRoaXMucHJvcHMuaW5wdXRQcm9wcy5jaGVja2VkID8gJ29uQ2hlY2tlZCcgOiAnb25VbmNoZWNrZWQnXSh0aGlzLnByb3BzLmlucHV0UHJvcHMubmFtZSk7XG5cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uQ2hhbmdlKSkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZUNsaWNrID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmlucHV0UHJvcHMuZGlzYWJsZWQpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgdGhpcy5yZWZzLmlucHV0LmZvY3VzKCk7XG5cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uQ2xpY2spKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLmlucHV0UHJvcHMub25DbGljayhldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRBcmlhU3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLmlucHV0UHJvcHMuaW5kZXRlcm1pbmF0ZSA/ICdtaXhlZCcgOiBTdHJpbmcodGhpcy5wcm9wcy5pbnB1dFByb3BzLmNoZWNrZWQpO1xuICAgIH1cblxuICAgIHJlbmRlcklucHV0KCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgey4uLm9taXQodGhpcy5wcm9wcy5pbnB1dFByb3BzLCAnaW5kZXRlcm1pbmF0ZScpfVxuICAgICAgICAgICAgICAgIHJlZj0naW5wdXQnXG4gICAgICAgICAgICAgICAgdHlwZT0nY2hlY2tib3gnXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjeCgnYi1jaGVja2JveCcsIHRoaXMucHJvcHMuaW5wdXRQcm9wcy5jbGFzc05hbWUsIHtcbiAgICAgICAgICAgICAgICAgICAgJ2ItY2hlY2tib3gtbWl4ZWQnOiB0aGlzLnByb3BzLmlucHV0UHJvcHMuaW5kZXRlcm1pbmF0ZSxcbiAgICAgICAgICAgICAgICAgICAgJ2ItY2hlY2tib3gtY2hlY2tlZCc6IHRoaXMucHJvcHMuaW5wdXRQcm9wcy5jaGVja2VkLFxuICAgICAgICAgICAgICAgICAgICAnYi1jaGVja2JveC11bmNoZWNrZWQnOiAhdGhpcy5wcm9wcy5pbnB1dFByb3BzLmluZGV0ZXJtaW5hdGUgJiYgIXRoaXMucHJvcHMuaW5wdXRQcm9wcy5jaGVja2VkLFxuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgIGlkPXt0aGlzLnByb3BzLmlucHV0UHJvcHMuaWQgfHwgdGhpcy5pZH1cbiAgICAgICAgICAgICAgICBhcmlhLWNoZWNrZWQ9e3RoaXMuZ2V0QXJpYVN0YXRlKCl9XG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuaGFuZGxlQ2hhbmdlfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuaGFuZGxlQ2xpY2t9IC8+XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmVuZGVyTGFiZWwoKSB7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmxhYmVsKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICB7Li4udGhpcy5wcm9wcy5sYWJlbFByb3BzfVxuICAgICAgICAgICAgICAgICAgICByZWY9J2xhYmVsJ1xuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KCdiLWNoZWNrYm94LWxhYmVsJywgdGhpcy5wcm9wcy5sYWJlbFByb3BzLmNsYXNzTmFtZSl9XG4gICAgICAgICAgICAgICAgICAgIGh0bWxGb3I9e3RoaXMucHJvcHMuaW5wdXRQcm9wcy5pZCB8fCB0aGlzLmlkfT5cbiAgICAgICAgICAgICAgICAgICAge3RoaXMucHJvcHMubGFiZWx9XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgey4uLm9taXQodGhpcy5wcm9wcywgQ2hlY2tib3guaW50ZXJuYWxLZXlzKX1cbiAgICAgICAgICAgICAgICByZWY9J3dyYXBwZXInXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjeCgnYi1jaGVja2JveC13cmFwcGVyJywgdGhpcy5wcm9wcy5jbGFzc05hbWUpfT5cbiAgICAgICAgICAgICAgICB7dGhpcy5yZW5kZXJJbnB1dCgpfVxuICAgICAgICAgICAgICAgIHt0aGlzLnJlbmRlckxhYmVsKCl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9ib3VuZGxlc3MtY2hlY2tib3gvaW5kZXguanMiXSwic291cmNlUm9vdCI6IiJ9 | ||
module.exports=function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var t={};return n.m=e,n.c=t,n.i=function(e){return e},n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},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=4)}([function(e,n){e.exports=require("boundless-utils-omit-keys")},function(e,n){e.exports=require("boundless-utils-uuid")},function(e,n){e.exports=require("classnames")},function(e,n){e.exports=require("react")},function(e,n,t){"use strict";function r(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}function o(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 p(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 i=t(3),s=t.n(i),a=t(2),c=t.n(a),u=t(0),l=t.n(u),h=t(1),f=t.n(h),d=Object.assign||function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])}return e},b=function(){function e(e,n){for(var t=0;t<n.length;t++){var r=n[t];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(n,t,r){return t&&e(n.prototype,t),r&&e(n,r),n}}(),y=function(e){return"function"==typeof e},P=function(){},m=function(e){function n(){var e,t,p,i;r(this,n);for(var s=arguments.length,a=Array(s),c=0;c<s;c++)a[c]=arguments[c];return t=p=o(this,(e=n.__proto__||Object.getPrototypeOf(n)).call.apply(e,[this].concat(a))),p.id=f()(),p.handleChange=function(e){p.props.inputProps.disabled||(p.props[p.props.inputProps.checked?"onUnchecked":"onChecked"](p.props.inputProps.name),y(p.props.inputProps.onChange)&&p.props.inputProps.onChange(e))},p.handleClick=function(e){p.props.inputProps.disabled||(p.refs.input.focus(),y(p.props.inputProps.onClick)&&p.props.inputProps.onClick(e))},i=t,o(p,i)}return p(n,e),b(n,[{key:"componentDidMount",value:function(){this.props.inputProps.indeterminate&&this.setIndeterminate()}},{key:"componentDidUpdate",value:function(e){e.inputProps.indeterminate!==this.props.inputProps.indeterminate&&this.setIndeterminate()}},{key:"setIndeterminate",value:function(){this.refs.input.indeterminate=!!this.props.inputProps.indeterminate}},{key:"getAriaState",value:function(){return this.props.inputProps.indeterminate?"mixed":String(this.props.inputProps.checked)}},{key:"renderInput",value:function(){return s.a.createElement("input",d({},l()(this.props.inputProps,"indeterminate"),{ref:"input",type:"checkbox",className:c()("b-checkbox",this.props.inputProps.className,{"b-checkbox-mixed":this.props.inputProps.indeterminate,"b-checkbox-checked":this.props.inputProps.checked,"b-checkbox-unchecked":!this.props.inputProps.indeterminate&&!this.props.inputProps.checked}),id:this.props.inputProps.id||this.id,"aria-checked":this.getAriaState(),onChange:this.handleChange,onClick:this.handleClick}))}},{key:"renderLabel",value:function(){if(this.props.label)return s.a.createElement("label",d({},this.props.labelProps,{ref:"label",className:c()("b-checkbox-label",this.props.labelProps.className),htmlFor:this.props.inputProps.id||this.id}),this.props.label)}},{key:"render",value:function(){return s.a.createElement(this.props.component,d({},l()(this.props,n.internalKeys),{ref:"wrapper",className:c()("b-checkbox-wrapper",this.props.className)}),this.renderInput(),this.renderLabel())}}]),n}(s.a.PureComponent);m.propTypes={"*":i.PropTypes.any,component:i.PropTypes.string,inputProps:i.PropTypes.shape({"*":i.PropTypes.any,checked:i.PropTypes.bool,className:i.PropTypes.string,disabled:i.PropTypes.bool,id:i.PropTypes.string,indeterminate:i.PropTypes.bool,onChange:i.PropTypes.func,onClick:i.PropTypes.func,name:i.PropTypes.string,value:i.PropTypes.string}),label:i.PropTypes.node,labelProps:i.PropTypes.shape({"*":i.PropTypes.any}),onChecked:i.PropTypes.func,onUnchecked:i.PropTypes.func},m.defaultProps={component:"div",inputProps:{checked:!1,indeterminate:!1},label:null,labelProps:{},onChecked:P,onUnchecked:P},m.internalKeys=Object.keys(m.defaultProps),n.default=m}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIDY5MDRlNWZkZDQxNTY1ZTVmZmYzIiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXV0aWxzLXV1aWRcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiY2xhc3NuYW1lc1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdFwifSIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9ib3VuZGxlc3MtY2hlY2tib3gvaW5kZXguanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJ2YWx1ZSIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwicmVxdWlyZSIsIl9fd2VicGFja19leHBvcnRzX18iLCJfY2xhc3NDYWxsQ2hlY2siLCJpbnN0YW5jZSIsIkNvbnN0cnVjdG9yIiwiVHlwZUVycm9yIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJzZWxmIiwiUmVmZXJlbmNlRXJyb3IiLCJfaW5oZXJpdHMiLCJzdWJDbGFzcyIsInN1cGVyQ2xhc3MiLCJjcmVhdGUiLCJjb25zdHJ1Y3RvciIsIndyaXRhYmxlIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfdXVpZF9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc191dWlkX19fZGVmYXVsdCIsIl9leHRlbmRzIiwiYXNzaWduIiwidGFyZ2V0IiwiYXJndW1lbnRzIiwibGVuZ3RoIiwic291cmNlIiwia2V5IiwiX2NyZWF0ZUNsYXNzIiwiZGVmaW5lUHJvcGVydGllcyIsInByb3BzIiwiZGVzY3JpcHRvciIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsImlzRnVuY3Rpb24iLCJ4Iiwibm9vcCIsIkNoZWNrYm94IiwiX1JlYWN0JFB1cmVDb21wb25lbnQiLCJfcmVmIiwiX3RlbXAiLCJfdGhpcyIsIl9yZXQiLCJ0aGlzIiwiX2xlbiIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJnZXRQcm90b3R5cGVPZiIsImFwcGx5IiwiY29uY2F0IiwiaWQiLCJoYW5kbGVDaGFuZ2UiLCJldmVudCIsImlucHV0UHJvcHMiLCJkaXNhYmxlZCIsImNoZWNrZWQiLCJvbkNoYW5nZSIsImhhbmRsZUNsaWNrIiwicmVmcyIsImlucHV0IiwiZm9jdXMiLCJvbkNsaWNrIiwiaW5kZXRlcm1pbmF0ZSIsInNldEluZGV0ZXJtaW5hdGUiLCJwcmV2UHJvcHMiLCJTdHJpbmciLCJhIiwiY3JlYXRlRWxlbWVudCIsInJlZiIsInR5cGUiLCJjbGFzc05hbWUiLCJiLWNoZWNrYm94LW1peGVkIiwiYi1jaGVja2JveC1jaGVja2VkIiwiYi1jaGVja2JveC11bmNoZWNrZWQiLCJhcmlhLWNoZWNrZWQiLCJnZXRBcmlhU3RhdGUiLCJsYWJlbCIsImxhYmVsUHJvcHMiLCJodG1sRm9yIiwiY29tcG9uZW50IiwiaW50ZXJuYWxLZXlzIiwicmVuZGVySW5wdXQiLCJyZW5kZXJMYWJlbCIsIlB1cmVDb21wb25lbnQiLCJwcm9wVHlwZXMiLCIqIiwiYW55Iiwic3RyaW5nIiwic2hhcGUiLCJib29sIiwiZnVuYyIsIm5vZGUiLCJvbkNoZWNrZWQiLCJvblVuY2hlY2tlZCIsImRlZmF1bHRQcm9wcyIsImtleXMiXSwibWFwcGluZ3MiOiJBQUFBQSxPQUFPQyxRQUNFLFNBQVVDLEdDR25CLFFBQUFDLEdBQUFDLEdBR0EsR0FBQUMsRUFBQUQsR0FDQSxNQUFBQyxHQUFBRCxHQUFBSCxPQUdBLElBQUFELEdBQUFLLEVBQUFELElBQ0FFLEVBQUFGLEVBQ0FHLEdBQUEsRUFDQU4sV0FVQSxPQU5BQyxHQUFBRSxHQUFBSSxLQUFBUixFQUFBQyxRQUFBRCxJQUFBQyxRQUFBRSxHQUdBSCxFQUFBTyxHQUFBLEVBR0FQLEVBQUFDLFFBdkJBLEdBQUFJLEtBK0RBLE9BbkNBRixHQUFBTSxFQUFBUCxFQUdBQyxFQUFBTyxFQUFBTCxFQUdBRixFQUFBRyxFQUFBLFNBQUFLLEdBQTJDLE1BQUFBLElBRzNDUixFQUFBUyxFQUFBLFNBQUFYLEVBQUFZLEVBQUFDLEdBQ0FYLEVBQUFZLEVBQUFkLEVBQUFZLElBQ0FHLE9BQUFDLGVBQUFoQixFQUFBWSxHQUNBSyxjQUFBLEVBQ0FDLFlBQUEsRUFDQUMsSUFBQU4sS0FNQVgsRUFBQWtCLEVBQUEsU0FBQXJCLEdBQ0EsR0FBQWMsR0FBQWQsS0FBQXNCLFdBQ0EsV0FBMkIsTUFBQXRCLEdBQUEsU0FDM0IsV0FBaUMsTUFBQUEsR0FFakMsT0FEQUcsR0FBQVMsRUFBQUUsRUFB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QyxJQUFLekUsRUFBQSxVQUFVMEUsSUFLZlAsVUFBV25FLEVBQUEsVUFBVTJFLE9BS3JCbEMsV0FBWXpDLEVBQUEsVUFBVTRFLE9BSWxCSCxJQUFLekUsRUFBQSxVQUFVMEUsSUFLZi9CLFFBQVMzQyxFQUFBLFVBQVU2RSxLQUVuQm5CLFVBQVcxRCxFQUFBLFVBQVUyRSxPQUtyQmpDLFNBQVUxQyxFQUFBLFVBQVU2RSxLQUNwQnZDLEdBQUl0QyxFQUFBLFVBQVUyRSxPQUtkekIsY0FBZWxELEVBQUEsVUFBVTZFLEtBRXpCakMsU0FBVTVDLEVBQUEsVUFBVThFLEtBQ3BCN0IsUUFBU2pELEVBQUEsVUFBVThFLEtBS25CL0csS0FBTWlDLEVBQUEsVUFBVTJFLE9BS2hCOUcsTUFBT21DLEVBQUEsVUFBVTJFLFNBTXJCWCxNQUFPaEUsRUFBQSxVQUFVK0UsS0FFakJkLFdBQVlqRSxFQUFBLFVBQVU0RSxPQUlsQkgsSUFBS3pFLEVBQUEsVUFBVTBFLE1BTW5CTSxVQUFXaEYsRUFBQSxVQUFVOEUsS0FLckJHLFlBQWFqRixFQUFBLFVBQVU4RSxNQXpFVnRELEVBNEVWMEQsY0FDSGYsVUFBVyxNQUNYMUIsWUFDSUUsU0FBUyxFQUNUTyxlQUFlLEdBRW5CYyxNQUFPLEtBQ1BDLGNBQ0FlLFVBQVd6RCxFQUNYMEQsWUFBYTFELEdBckZBQyxFQXdGVjRDLGFBQWVsRyxPQUFPaUgsS0FBSzNELEVBQVMwRCxjTkc4L0xsRyxFQUE2QixRTTNGcmpNd0MiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9XG4vKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRpOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGw6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4vKioqKioqLyBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4vKioqKioqLyBcdFx0XHRcdGdldDogZ2V0dGVyXG4vKioqKioqLyBcdFx0XHR9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gNCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIik7XG5cbi8qKiovIH0pLFxuLyogMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtdXRpbHMtdXVpZFwiKTtcblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNsYXNzbmFtZXNcIik7XG5cbi8qKiovIH0pLFxuLyogMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxuLyoqKi8gfSksXG4vKiA0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KF9fd2VicGFja19leHBvcnRzX18sIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfdXVpZF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX3V1aWRfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfdXVpZF9fKTtcbnZhciBfZXh0ZW5kcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0YXJnZXQpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9YXJndW1lbnRzW2ldO2Zvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSxrZXkpKXt0YXJnZXRba2V5XT1zb3VyY2Vba2V5XTt9fX1yZXR1cm4gdGFyZ2V0O307dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoXCJ2YWx1ZVwiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKTt9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcjt9O30oKTtmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7fX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLGNhbGwpe2lmKCFzZWxmKXt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7fXJldHVybiBjYWxsJiYodHlwZW9mIGNhbGw9PT1cIm9iamVjdFwifHx0eXBlb2YgY2FsbD09PVwiZnVuY3Rpb25cIik/Y2FsbDpzZWxmO31mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT1cImZ1bmN0aW9uXCImJnN1cGVyQ2xhc3MhPT1udWxsKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2Ygc3VwZXJDbGFzcyk7fXN1YkNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MmJnN1cGVyQ2xhc3MucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6c3ViQ2xhc3MsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfX0pO2lmKHN1cGVyQ2xhc3MpT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcyxzdXBlckNsYXNzKTpzdWJDbGFzcy5fX3Byb3RvX189c3VwZXJDbGFzczt9dmFyIGlzRnVuY3Rpb249ZnVuY3Rpb24gaXNGdW5jdGlvbih4KXtyZXR1cm4gdHlwZW9mIHg9PT0nZnVuY3Rpb24nO307dmFyIG5vb3A9ZnVuY3Rpb24gbm9vcCgpe307dmFyIENoZWNrYm94PWZ1bmN0aW9uKF9SZWFjdCRQdXJlQ29tcG9uZW50KXtfaW5oZXJpdHMoQ2hlY2tib3gsX1JlYWN0JFB1cmVDb21wb25lbnQpO2Z1bmN0aW9uIENoZWNrYm94KCl7dmFyIF9yZWY7dmFyIF90ZW1wLF90aGlzLF9yZXQ7X2NsYXNzQ2FsbENoZWNrKHRoaXMsQ2hlY2tib3gpO2Zvcih2YXIgX2xlbj1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkoX2xlbiksX2tleT0wO19rZXk8X2xlbjtfa2V5Kyspe2FyZ3NbX2tleV09YXJndW1lbnRzW19rZXldO31yZXR1cm4gX3JldD0oX3RlbXA9KF90aGlzPV9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKF9yZWY9Q2hlY2tib3guX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoQ2hlY2tib3gpKS5jYWxsLmFwcGx5KF9yZWYsW3RoaXNdLmNvbmNhdChhcmdzKSkpLF90aGlzKSxfdGhpcy5pZD1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX3V1aWRfX19kZWZhdWx0KCkoKSxfdGhpcy5oYW5kbGVDaGFuZ2U9ZnVuY3Rpb24oZXZlbnQpe2lmKF90aGlzLnByb3BzLmlucHV0UHJvcHMuZGlzYWJsZWQpe3JldHVybjt9X3RoaXMucHJvcHNbIV90aGlzLnByb3BzLmlucHV0UHJvcHMuY2hlY2tlZD8nb25DaGVja2VkJzonb25VbmNoZWNrZWQnXShfdGhpcy5wcm9wcy5pbnB1dFByb3BzLm5hbWUpO2lmKGlzRnVuY3Rpb24oX3RoaXMucHJvcHMuaW5wdXRQcm9wcy5vbkNoYW5nZSkpe190aGlzLnByb3BzLmlucHV0UHJvcHMub25DaGFuZ2UoZXZlbnQpO319LF90aGlzLmhhbmRsZUNsaWNrPWZ1bmN0aW9uKGV2ZW50KXtpZihfdGhpcy5wcm9wcy5pbnB1dFByb3BzLmRpc2FibGVkKXtyZXR1cm47fV90aGlzLnJlZnMuaW5wdXQuZm9jdXMoKTtpZihpc0Z1bmN0aW9uKF90aGlzLnByb3BzLmlucHV0UHJvcHMub25DbGljaykpe190aGlzLnByb3BzLmlucHV0UHJvcHMub25DbGljayhldmVudCk7fX0sX3RlbXApLF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLF9yZXQpO31fY3JlYXRlQ2xhc3MoQ2hlY2tib3gsW3trZXk6J2NvbXBvbmVudERpZE1vdW50Jyx2YWx1ZTpmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpe2lmKHRoaXMucHJvcHMuaW5wdXRQcm9wcy5pbmRldGVybWluYXRlKXt0aGlzLnNldEluZGV0ZXJtaW5hdGUoKTt9fX0se2tleTonY29tcG9uZW50RGlkVXBkYXRlJyx2YWx1ZTpmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKXtpZihwcmV2UHJvcHMuaW5wdXRQcm9wcy5pbmRldGVybWluYXRlIT09dGhpcy5wcm9wcy5pbnB1dFByb3BzLmluZGV0ZXJtaW5hdGUpe3RoaXMuc2V0SW5kZXRlcm1pbmF0ZSgpO319fSx7a2V5OidzZXRJbmRldGVybWluYXRlJyx2YWx1ZTpmdW5jdGlvbiBzZXRJbmRldGVybWluYXRlKCl7dGhpcy5yZWZzLmlucHV0LmluZGV0ZXJtaW5hdGU9ISF0aGlzLnByb3BzLmlucHV0UHJvcHMuaW5kZXRlcm1pbmF0ZTt9fSx7a2V5OidnZXRBcmlhU3RhdGUnLHZhbHVlOmZ1bmN0aW9uIGdldEFyaWFTdGF0ZSgpe3JldHVybiB0aGlzLnByb3BzLmlucHV0UHJvcHMuaW5kZXRlcm1pbmF0ZT8nbWl4ZWQnOlN0cmluZyh0aGlzLnByb3BzLmlucHV0UHJvcHMuY2hlY2tlZCk7fX0se2tleToncmVuZGVySW5wdXQnLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcklucHV0KCl7cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KCdpbnB1dCcsX2V4dGVuZHMoe30sX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfX19kZWZhdWx0KCkodGhpcy5wcm9wcy5pbnB1dFByb3BzLCdpbmRldGVybWluYXRlJykse3JlZjonaW5wdXQnLHR5cGU6J2NoZWNrYm94JyxjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItY2hlY2tib3gnLHRoaXMucHJvcHMuaW5wdXRQcm9wcy5jbGFzc05hbWUseydiLWNoZWNrYm94LW1peGVkJzp0aGlzLnByb3BzLmlucHV0UHJvcHMuaW5kZXRlcm1pbmF0ZSwnYi1jaGVja2JveC1jaGVja2VkJzp0aGlzLnByb3BzLmlucHV0UHJvcHMuY2hlY2tlZCwnYi1jaGVja2JveC11bmNoZWNrZWQnOiF0aGlzLnByb3BzLmlucHV0UHJvcHMuaW5kZXRlcm1pbmF0ZSYmIXRoaXMucHJvcHMuaW5wdXRQcm9wcy5jaGVja2VkfSksaWQ6dGhpcy5wcm9wcy5pbnB1dFByb3BzLmlkfHx0aGlzLmlkLCdhcmlhLWNoZWNrZWQnOnRoaXMuZ2V0QXJpYVN0YXRlKCksb25DaGFuZ2U6dGhpcy5oYW5kbGVDaGFuZ2Usb25DbGljazp0aGlzLmhhbmRsZUNsaWNrfSkpO319LHtrZXk6J3JlbmRlckxhYmVsJyx2YWx1ZTpmdW5jdGlvbiByZW5kZXJMYWJlbCgpe2lmKHRoaXMucHJvcHMubGFiZWwpe3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudCgnbGFiZWwnLF9leHRlbmRzKHt9LHRoaXMucHJvcHMubGFiZWxQcm9wcyx7cmVmOidsYWJlbCcsY2xhc3NOYW1lOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCgpKCdiLWNoZWNrYm94LWxhYmVsJyx0aGlzLnByb3BzLmxhYmVsUHJvcHMuY2xhc3NOYW1lKSxodG1sRm9yOnRoaXMucHJvcHMuaW5wdXRQcm9wcy5pZHx8dGhpcy5pZH0pLHRoaXMucHJvcHMubGFiZWwpO319fSx7a2V5OidyZW5kZXInLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudCh0aGlzLnByb3BzLmNvbXBvbmVudCxfZXh0ZW5kcyh7fSxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fX2RlZmF1bHQoKSh0aGlzLnByb3BzLENoZWNrYm94LmludGVybmFsS2V5cykse3JlZjond3JhcHBlcicsY2xhc3NOYW1lOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCgpKCdiLWNoZWNrYm94LXdyYXBwZXInLHRoaXMucHJvcHMuY2xhc3NOYW1lKX0pLHRoaXMucmVuZGVySW5wdXQoKSx0aGlzLnJlbmRlckxhYmVsKCkpO319XSk7cmV0dXJuIENoZWNrYm94O30oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLlB1cmVDb21wb25lbnQpO0NoZWNrYm94LnByb3BUeXBlcz17JyonOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmFueSxjb21wb25lbnQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc3RyaW5nLGlucHV0UHJvcHM6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc2hhcGUoeycqJzpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5hbnksY2hlY2tlZDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ib29sLGNsYXNzTmFtZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5zdHJpbmcsZGlzYWJsZWQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYm9vbCxpZDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5zdHJpbmcsaW5kZXRlcm1pbmF0ZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ib29sLG9uQ2hhbmdlOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmMsb25DbGljazpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jLG5hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc3RyaW5nLHZhbHVlOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLnN0cmluZ30pLGxhYmVsOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm5vZGUsbGFiZWxQcm9wczpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5zaGFwZSh7JyonOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmFueX0pLG9uQ2hlY2tlZDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jLG9uVW5jaGVja2VkOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmN9O0NoZWNrYm94LmRlZmF1bHRQcm9wcz17Y29tcG9uZW50OidkaXYnLGlucHV0UHJvcHM6e2NoZWNrZWQ6ZmFsc2UsaW5kZXRlcm1pbmF0ZTpmYWxzZX0sbGFiZWw6bnVsbCxsYWJlbFByb3BzOnt9LG9uQ2hlY2tlZDpub29wLG9uVW5jaGVja2VkOm5vb3B9O0NoZWNrYm94LmludGVybmFsS2V5cz1PYmplY3Qua2V5cyhDaGVja2JveC5kZWZhdWx0UHJvcHMpOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSBDaGVja2JveDtcblxuLyoqKi8gfSlcbi8qKioqKiovIF0pO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBpbmRleC5qcyIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDQpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIDY5MDRlNWZkZDQxNTY1ZTVmZmYzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXV0aWxzLW9taXQta2V5c1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIn1cbi8vIG1vZHVsZSBpZCA9IDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXV0aWxzLXV1aWRcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtdXRpbHMtdXVpZFwifVxuLy8gbW9kdWxlIGlkID0gMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiY2xhc3NuYW1lc1wifVxuLy8gbW9kdWxlIGlkID0gMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0XCJ9XG4vLyBtb2R1bGUgaWQgPSAzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCBSZWFjdCwge1Byb3BUeXBlc30gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGN4IGZyb20gJ2NsYXNzbmFtZXMnO1xuXG5pbXBvcnQgb21pdCBmcm9tICdib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzJztcbmltcG9ydCB1dWlkIGZyb20gJ2JvdW5kbGVzcy11dGlscy11dWlkJztcblxuY29uc3QgaXNGdW5jdGlvbiA9ICh4KSA9PiB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJztcbmNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcblxuLyoqXG5fX0FuIGFjY2Vzc2libGUgY2hlY2tib3ggd2l0aCBpbmRldGVybWluYXRlIHN1cHBvcnQuX19cblxuQ2hlY2tib3ggaXMgaW1wbGVtZW50ZWQgYXMgYSBcImNvbnRyb2xsZWQgaW5wdXRcIiwgbWVhbmluZyBpdCBpcyBhIGRpcmVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgZGF0YSBwYXNzZWRcbmluc2lkZS4gVXNlciBpbnRlcmFjdGlvbiB3aWxsIGJ1YmJsZSBjaGFuZ2VzIGluIHRoZSBmb3JtIG9mIGBvbkNoZWNrZWRgIGFuZCBgb25VbmNoZWNrZWRgIHRoYXQgYSBjb250cm9sbGVyXG52aWV3IG11c3QgaW50ZXJjZXB0IGFuZCBhcHBseSBhZ2FpbnN0IHRoZSBkYXRhIHByb3ZpZGVyLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDaGVja2JveCBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xuICAgIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhbnkgW1JlYWN0LXN1cHBvcnRlZCBhdHRyaWJ1dGVdKGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdGFncy1hbmQtYXR0cmlidXRlcy5odG1sI2h0bWwtYXR0cmlidXRlcylcbiAgICAgICAgICovXG4gICAgICAgICcqJzogUHJvcFR5cGVzLmFueSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogYW55IHZhbGlkIEhUTUwgdGFnIG5hbWVcbiAgICAgICAgICovXG4gICAgICAgIGNvbXBvbmVudDogUHJvcFR5cGVzLnN0cmluZyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogYWxsIGlucHV0LXNwZWNpZmljIHByb3BzIGxpa2UgYHZhbHVlYCwgYG5hbWVgLCBldGMgc2hvdWxkIGJlIHBhc3NlZCBoZXJlIC0tIGNvbW1vbiBvbmVzIGFyZSBsaXN0ZWQgYmVsb3dcbiAgICAgICAgICovXG4gICAgICAgIGlucHV0UHJvcHM6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIGFueSBbUmVhY3Qtc3VwcG9ydGVkIGF0dHJpYnV0ZV0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90YWdzLWFuZC1hdHRyaWJ1dGVzLmh0bWwjaHRtbC1hdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICAnKic6IFByb3BUeXBlcy5hbnksXG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogZGV0ZXJtaW5lcyBpZiB0aGUgY2hlY2tib3ggaXMgcmVuZGVyZWQgYXMgY2hlY2tlZC91bmNoZWNrZWQsIHNlZSBSZWFjdCBbXCJjb250cm9sbGVkIGlucHV0c1wiXShodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL2Zvcm1zLmh0bWwjY29udHJvbGxlZC1jb21wb25lbnRzKSlcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY2hlY2tlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgICAgICAgICAgIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBwcmV2ZW50cyB0aGUgYG9ue0NoZWNrZWQsVW5jaGVja2VkfWAgZXZlbnRzIGZyb20gZmlyaW5nIHdoZW4gYHRydWVgXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgICAgICAgIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIGVuYWJsZXMgb3IgZGlzYWJsZXMgXCJtaXhlZFwiIGNoZWNrYm94IHN0YXRlLCByZWFkIHRoaXMgW0NTUy1Ucmlja3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9pbmRldGVybWluYXRlLWNoZWNrYm94ZXMvKSAgZm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIGV4YW1wbGVzXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGluZGV0ZXJtaW5hdGU6IFByb3BUeXBlcy5ib29sLFxuXG4gICAgICAgICAgICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgICAgICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiByZW5kZXJlZCBhcyB0aGUgaW5wdXQgY29udHJvbCdzIGZvcm0gbmFtZVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBuYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqICBwYXNzZWQtdGhyb3VnaCB0byB0aGUgaW5wdXQgbm9kZSwgbGlrZSBgbmFtZWBcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdmFsdWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICAgIH0pLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhbnkgUmVhY3QtcmVuZGVyYWJsZSBjb250ZW50LCBtb3N0IGNvbW1vbmx5IGEgc2ltcGxlIHN0cmluZ1xuICAgICAgICAgKi9cbiAgICAgICAgbGFiZWw6IFByb3BUeXBlcy5ub2RlLFxuXG4gICAgICAgIGxhYmVsUHJvcHM6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIGFueSBbUmVhY3Qtc3VwcG9ydGVkIGF0dHJpYnV0ZV0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90YWdzLWFuZC1hdHRyaWJ1dGVzLmh0bWwjaHRtbC1hdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICAnKic6IFByb3BUeXBlcy5hbnksXG4gICAgICAgIH0pLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBjYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBiZWNvbWVzIGNoZWNrZWQ7IGJhY2tpbmcgZGF0YSBtdXN0IGJlIHVwZGF0ZWQgdG8gcGVyc2lzdCB0aGUgc3RhdGUgY2hhbmdlXG4gICAgICAgICAqL1xuICAgICAgICBvbkNoZWNrZWQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBjYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBiZWNvbWVzIHVuY2hlY2tlZDsgYmFja2luZyBkYXRhIG11c3QgYmUgdXBkYXRlZCB0byBwZXJzaXN0IHRoZSBzdGF0ZSBjaGFuZ2VcbiAgICAgICAgICovXG4gICAgICAgIG9uVW5jaGVja2VkOiBQcm9wVHlwZXMuZnVuYyxcbiAgICB9XG5cbiAgICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgICBjb21wb25lbnQ6ICdkaXYnLFxuICAgICAgICBpbnB1dFByb3BzOiB7XG4gICAgICAgICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICAgICAgICAgIGluZGV0ZXJtaW5hdGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBsYWJlbDogbnVsbCxcbiAgICAgICAgbGFiZWxQcm9wczoge30sXG4gICAgICAgIG9uQ2hlY2tlZDogbm9vcCxcbiAgICAgICAgb25VbmNoZWNrZWQ6IG5vb3AsXG4gICAgfVxuXG4gICAgc3RhdGljIGludGVybmFsS2V5cyA9IE9iamVjdC5rZXlzKENoZWNrYm94LmRlZmF1bHRQcm9wcylcblxuICAgIGlkID0gdXVpZCgpXG5cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuaW5wdXRQcm9wcy5pbmRldGVybWluYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnNldEluZGV0ZXJtaW5hdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICAgICAgaWYgKHByZXZQcm9wcy5pbnB1dFByb3BzLmluZGV0ZXJtaW5hdGUgIT09IHRoaXMucHJvcHMuaW5wdXRQcm9wcy5pbmRldGVybWluYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnNldEluZGV0ZXJtaW5hdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldEluZGV0ZXJtaW5hdGUoKSB7XG4gICAgICAgIHRoaXMucmVmcy5pbnB1dC5pbmRldGVybWluYXRlID0gISF0aGlzLnByb3BzLmlucHV0UHJvcHMuaW5kZXRlcm1pbmF0ZTtcbiAgICB9XG5cbiAgICBoYW5kbGVDaGFuZ2UgPSAoZXZlbnQpID0+IHsgLy8gU2VuZCB0aGUgb3Bwb3NpdGUgc2lnbmFsIGZyb20gd2hhdCB3YXMgcGFzc2VkIHRvIHRvZ2dsZSB0aGUgZGF0YVxuICAgICAgICBpZiAodGhpcy5wcm9wcy5pbnB1dFByb3BzLmRpc2FibGVkKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHRoaXMucHJvcHNbIXRoaXMucHJvcHMuaW5wdXRQcm9wcy5jaGVja2VkID8gJ29uQ2hlY2tlZCcgOiAnb25VbmNoZWNrZWQnXSh0aGlzLnByb3BzLmlucHV0UHJvcHMubmFtZSk7XG5cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uQ2hhbmdlKSkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZUNsaWNrID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmlucHV0UHJvcHMuZGlzYWJsZWQpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgdGhpcy5yZWZzLmlucHV0LmZvY3VzKCk7XG5cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uQ2xpY2spKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLmlucHV0UHJvcHMub25DbGljayhldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRBcmlhU3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLmlucHV0UHJvcHMuaW5kZXRlcm1pbmF0ZSA/ICdtaXhlZCcgOiBTdHJpbmcodGhpcy5wcm9wcy5pbnB1dFByb3BzLmNoZWNrZWQpO1xuICAgIH1cblxuICAgIHJlbmRlcklucHV0KCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgey4uLm9taXQodGhpcy5wcm9wcy5pbnB1dFByb3BzLCAnaW5kZXRlcm1pbmF0ZScpfVxuICAgICAgICAgICAgICAgIHJlZj0naW5wdXQnXG4gICAgICAgICAgICAgICAgdHlwZT0nY2hlY2tib3gnXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjeCgnYi1jaGVja2JveCcsIHRoaXMucHJvcHMuaW5wdXRQcm9wcy5jbGFzc05hbWUsIHtcbiAgICAgICAgICAgICAgICAgICAgJ2ItY2hlY2tib3gtbWl4ZWQnOiB0aGlzLnByb3BzLmlucHV0UHJvcHMuaW5kZXRlcm1pbmF0ZSxcbiAgICAgICAgICAgICAgICAgICAgJ2ItY2hlY2tib3gtY2hlY2tlZCc6IHRoaXMucHJvcHMuaW5wdXRQcm9wcy5jaGVja2VkLFxuICAgICAgICAgICAgICAgICAgICAnYi1jaGVja2JveC11bmNoZWNrZWQnOiAhdGhpcy5wcm9wcy5pbnB1dFByb3BzLmluZGV0ZXJtaW5hdGUgJiYgIXRoaXMucHJvcHMuaW5wdXRQcm9wcy5jaGVja2VkLFxuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgIGlkPXt0aGlzLnByb3BzLmlucHV0UHJvcHMuaWQgfHwgdGhpcy5pZH1cbiAgICAgICAgICAgICAgICBhcmlhLWNoZWNrZWQ9e3RoaXMuZ2V0QXJpYVN0YXRlKCl9XG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuaGFuZGxlQ2hhbmdlfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuaGFuZGxlQ2xpY2t9IC8+XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmVuZGVyTGFiZWwoKSB7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmxhYmVsKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICB7Li4udGhpcy5wcm9wcy5sYWJlbFByb3BzfVxuICAgICAgICAgICAgICAgICAgICByZWY9J2xhYmVsJ1xuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KCdiLWNoZWNrYm94LWxhYmVsJywgdGhpcy5wcm9wcy5sYWJlbFByb3BzLmNsYXNzTmFtZSl9XG4gICAgICAgICAgICAgICAgICAgIGh0bWxGb3I9e3RoaXMucHJvcHMuaW5wdXRQcm9wcy5pZCB8fCB0aGlzLmlkfT5cbiAgICAgICAgICAgICAgICAgICAge3RoaXMucHJvcHMubGFiZWx9XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8dGhpcy5wcm9wcy5jb21wb25lbnRcbiAgICAgICAgICAgICAgICB7Li4ub21pdCh0aGlzLnByb3BzLCBDaGVja2JveC5pbnRlcm5hbEtleXMpfVxuICAgICAgICAgICAgICAgIHJlZj0nd3JhcHBlcidcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KCdiLWNoZWNrYm94LXdyYXBwZXInLCB0aGlzLnByb3BzLmNsYXNzTmFtZSl9PlxuICAgICAgICAgICAgICAgIHt0aGlzLnJlbmRlcklucHV0KCl9XG4gICAgICAgICAgICAgICAge3RoaXMucmVuZGVyTGFiZWwoKX1cbiAgICAgICAgICAgIDwvdGhpcy5wcm9wcy5jb21wb25lbnQ+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvYm91bmRsZXNzLWNoZWNrYm94L2luZGV4LmpzIl0sInNvdXJjZVJvb3QiOiIifQ== |
@@ -11,3 +11,2 @@ import React, {PropTypes} from 'react'; | ||
/** | ||
# Checkbox | ||
__An accessible checkbox with indeterminate support.__ | ||
@@ -22,7 +21,21 @@ | ||
/** | ||
* all input-specific props like `value`, `name`, etc should be passed here -- common ones are listed below. | ||
* Also supports any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-checkbox` node | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
'*': PropTypes.any, | ||
/** | ||
* any valid HTML tag name | ||
*/ | ||
component: PropTypes.string, | ||
/** | ||
* all input-specific props like `value`, `name`, etc should be passed here -- common ones are listed below | ||
*/ | ||
inputProps: PropTypes.shape({ | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
'*': PropTypes.any, | ||
/** | ||
* determines if the checkbox is rendered as checked/unchecked, see React ["controlled inputs"](https://facebook.github.io/react/docs/forms.html#controlled-components)) | ||
@@ -64,6 +77,8 @@ */ | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-checkbox-label` node | ||
*/ | ||
labelProps: PropTypes.object, | ||
labelProps: PropTypes.shape({ | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
'*': PropTypes.any, | ||
}), | ||
@@ -82,2 +97,3 @@ /** | ||
static defaultProps = { | ||
component: 'div', | ||
inputProps: { | ||
@@ -171,3 +187,3 @@ checked: false, | ||
return ( | ||
<div | ||
<this.props.component | ||
{...omit(this.props, Checkbox.internalKeys)} | ||
@@ -178,5 +194,5 @@ ref='wrapper' | ||
{this.renderLabel()} | ||
</div> | ||
</this.props.component> | ||
); | ||
} | ||
} |
{ | ||
"name": "boundless-checkbox", | ||
"version": "1.0.0-beta.5", | ||
"version": "1.0.0-beta.7", | ||
"description": "An accessible checkbox with indeterminate support.", | ||
@@ -28,4 +28,4 @@ "main": "build/index.js", | ||
"classnames": "^2.1.5", | ||
"boundless-utils-omit-keys": "^1.0.0-beta.5", | ||
"boundless-utils-uuid": "^1.0.0-beta.5" | ||
"boundless-utils-omit-keys": "^1.0.0-beta.7", | ||
"boundless-utils-uuid": "^1.0.0-beta.7" | ||
}, | ||
@@ -32,0 +32,0 @@ "peerDependencies": { |
@@ -0,4 +1,6 @@ | ||
<!--- | ||
THIS IS AN AUTOGENERATED FILE. EDIT INDEX.JS INSTEAD. | ||
--> | ||
# Checkbox | ||
# Checkbox | ||
__An accessible checkbox with indeterminate support.__ | ||
@@ -10,5 +12,55 @@ | ||
## Example Usage | ||
```jsx | ||
import React from 'react'; | ||
import Checkbox from '../index'; | ||
export default class CheckboxDemo extends React.PureComponent { | ||
state = { | ||
checkboxes: [{ | ||
checked: false, | ||
indeterminate: false, | ||
label: 'An unchecked checkbox', | ||
name: 'box1', | ||
}, { | ||
checked: true, | ||
indeterminate: false, | ||
label: 'A checked checkbox', | ||
name: 'box2', | ||
}, { | ||
checked: false, | ||
indeterminate: true, | ||
label: 'An indeterminate (mixed) checkbox', | ||
name: 'box3', | ||
}], | ||
} | ||
handleInteraction(event) { | ||
// eslint-disable-next-line no-alert | ||
alert(`${event.target.name} ${event.target.checked ? 'checked' : 'unchecked'}!\n\nThe input will now revert to its previous state because this demo does not persist model changes.`); | ||
} | ||
render() { | ||
return ( | ||
<div className='spread'> | ||
{this.state.checkboxes.map((definition) => { | ||
return ( | ||
<Checkbox | ||
key={definition.name} | ||
inputProps={definition} | ||
label={definition.label} | ||
onChange={this.handleInteraction} /> | ||
); | ||
})} | ||
</div> | ||
); | ||
} | ||
} | ||
``` | ||
## Props | ||
_Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/Checkbox#props)._ | ||
> Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/Checkbox#props). | ||
@@ -22,51 +74,63 @@ ### Required Props | ||
<table> | ||
<tr> | ||
<th>Name</th> | ||
<th>Type</th> | ||
<th>Default Value</th> | ||
<th>Description</th> | ||
</tr> | ||
- __`*`__ ・ any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
<tr> | ||
<td>inputProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{ | ||
Expects | Default Value | ||
- | - | ||
`any` | `n/a` | ||
- __`component`__ ・ any valid HTML tag name | ||
Expects | Default Value | ||
- | - | ||
`string` | `'div'` | ||
- __`inputProps`__ ・ all input-specific props like `value`, `name`, etc should be passed here -- common ones are listed below | ||
Expects | Default Value | ||
- | - | ||
`object` | `{ | ||
checked: false, | ||
indeterminate: false, | ||
}</code></pre></td> | ||
<td>all input-specific props like `value`, `name`, etc should be passed here -- common ones are listed below. | ||
Also supports any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-checkbox` node</td> | ||
</tr> | ||
}` | ||
<tr> | ||
<td>label</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>any React-renderable content, most commonly a simple string</td> | ||
</tr> | ||
- __`label`__ ・ any React-renderable content, most commonly a simple string | ||
<tr> | ||
<td>labelProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-checkbox-label` node</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any renderable` | `null` | ||
<tr> | ||
<td>onChecked</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">() => {}</code></pre></td> | ||
<td>called when the element becomes checked; backing data must be updated to persist the state change</td> | ||
</tr> | ||
- __`labelProps`__ | ||
<tr> | ||
<td>onUnchecked</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">() => {}</code></pre></td> | ||
<td>called when the element becomes unchecked; backing data must be updated to persist the state change</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`object` | `{}` | ||
</table> | ||
- __`onChecked`__ ・ called when the element becomes checked; backing data must be updated to persist the state change | ||
Expects | Default Value | ||
- | - | ||
`function` | `() => {}` | ||
- __`onUnchecked`__ ・ called when the element becomes unchecked; backing data must be updated to persist the state change | ||
Expects | Default Value | ||
- | - | ||
`function` | `() => {}` | ||
## Reference Styles | ||
### Stylus | ||
```stylus | ||
// Bring in Boundless's base Stylus variables | ||
@require "node_modules/boundless-checkbox/variables" | ||
// Redefine any variables as desired, e.g. | ||
color-accent = royalblue | ||
// Bring in the component styles; they will be autoconfigured based on the above | ||
@require "node_modules/boundless-checkbox/style" | ||
``` | ||
### CSS | ||
If desired, a precompiled plain CSS stylesheet is available for customization at `/build/style.css`, based on Boundless's [default variables](https://github.com/enigma-io/boundless/blob/master/variables.styl). | ||
@@ -1,2 +0,2 @@ | ||
module.exports=function(e){function o(t){if(r[t])return r[t].exports;var n=r[t]={i:t,l:!1,exports:{}};return e[t].call(n.exports,n,n.exports,o),n.l=!0,n.exports}var r={};return o.m=e,o.c=r,o.i=function(e){return e},o.d=function(e,r,t){o.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:t})},o.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(r,"a",r),r},o.o=function(e,o){return Object.prototype.hasOwnProperty.call(e,o)},o.p="",o(o.s=5)}([function(e,o,r){"use strict";function t(e){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Object.keys(e).reduce(function(r,t){return o.indexOf(t)===-1&&(r[t]=e[t]),r},{})}o.a=t},function(e,o,r){"use strict";function t(){return"b-"+([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,function(e){return(e^16*Math.random()>>e/4).toString(16)})}o.a=t},function(e,o){e.exports=require("boundless-portal")},function(e,o){e.exports=require("classnames")},function(e,o){e.exports=require("react")},function(e,o,r){"use strict";function t(e,o){if(!(e instanceof o))throw new TypeError("Cannot call a class as a function")}function n(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){if("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=r(4),l=r.n(i),a=r(3),p=r.n(a),u=r(2),c=r.n(u),d=r(0),f=r(1),h=Object.assign||function(e){for(var o=1;o<arguments.length;o++){var r=arguments[o];for(var t in r)Object.prototype.hasOwnProperty.call(r,t)&&(e[t]=r[t])}return e},y=function(){function e(e,o){for(var r=0;r<o.length;r++){var t=o[r];t.enumerable=t.enumerable||!1,t.configurable=!0,"value"in t&&(t.writable=!0),Object.defineProperty(e,t.key,t)}}return function(o,r,t){return r&&e(o.prototype,r),t&&e(o,t),o}}(),O=function(e){return"function"==typeof e},P=function(){},b=Array.prototype.slice,w=function(e){function o(){var e,s,i,l;t(this,o);for(var a=arguments.length,p=Array(a),u=0;u<a;u++)p[u]=arguments[u];return s=i=n(this,(e=o.__proto__||Object.getPrototypeOf(o)).call.apply(e,[this].concat(p))),i.mounted=!1,i.uuidHeader=r.i(f.a)(),i.uuidBody=r.i(f.a)(),i.handleFocus=function(e){if(i.props.captureFocus){var o=e.explicitOriginalTarget||e.relatedTarget;i.isPartOfDialog(o)&&!i.isPartOfDialog(e.target)&&(e.preventDefault(),o.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)},l=s,n(i,l)}return s(o,e),y(o,[{key:"isPartOfDialog",value:function(e){if(!e||e===window)return!1;var o=[this.$wrapper].concat(b.call(this.$wrapper.querySelectorAll("["+c.a.PORTAL_DATA_ATTRIBUTE+"]")).map(function(e){return document.getElementById(e.getAttribute(c.a.PORTAL_DATA_ATTRIBUTE))})),r=e.nodeType!==Node.ELEMENT_NODE?e.parentNode:e;return o.some(function(e){return e.contains(r)})}},{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:"renderBody",value:function(){return l.a.createElement("div",h({},this.props.bodyProps,{id:this.props.bodyProps.id||this.uuidBody,className:p()("b-dialog-body",this.props.bodyProps.className)}),this.props.children)}},{key:"renderFooter",value:function(){if(this.props.footer)return l.a.createElement("footer",h({},this.props.footerProps,{className:p()("b-dialog-footer",this.props.footerProps.className)}),this.props.footer)}},{key:"renderHeader",value:function(){if(this.props.header)return l.a.createElement("header",h({},this.props.headerProps,{id:this.props.headerProps.id||this.uuidHeader,className:p()("b-dialog-header",this.props.headerProps.className)}),this.props.header)}},{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("div",h({},this.props.wrapperProps,{ref:function(o){return e.$wrapper=o},className:p()("b-dialog-wrapper",this.props.wrapperProps.className),tabIndex:"0"}),this.renderFocusBoundary(),this.props.before,l.a.createElement("div",h({},r.i(d.a)(this.props,o.internalKeys),{ref:function(o){return e.$dialog=o},className:p()("b-dialog",this.props.className),onClick:this.handleInsideClick,onKeyDown:this.handleKeyDown,role:"dialog","aria-labelledby":this.uuidHeader,"aria-describedby":this.uuidBody,tabIndex:"0"}),this.renderHeader(),this.renderBody(),this.renderFooter()),this.props.after,this.renderFocusBoundary())}}]),o}(l.a.PureComponent);w.propTypes={after:i.PropTypes.node,before:i.PropTypes.node,bodyProps:i.PropTypes.object,captureFocus:i.PropTypes.bool,children:i.PropTypes.node,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]),footer:i.PropTypes.node,footerProps:i.PropTypes.object,header:i.PropTypes.node,headerProps:i.PropTypes.object,onClose:i.PropTypes.func,wrapperProps:i.PropTypes.object},w.defaultProps={after:null,before:null,bodyProps:{},captureFocus:!0,children:null,closeOnEscKey:!1,closeOnInsideClick:!1,closeOnOutsideClick:!1,closeOnOutsideFocus:!1,closeOnOutsideScroll:!1,footer:null,footerProps:{},header:null,headerProps:{},onClose:P,onKeyDown:P,wrapperProps:{}},w.internalKeys=Object.keys(w.defaultProps),o.default=w}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIDhmZmEyNWM2MTYwMGU4YmJmOTQ0Iiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvYm91bmRsZXNzLXV0aWxzLXV1aWQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXBvcnRhbFwifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJjbGFzc25hbWVzXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0XCJ9Iiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy1kaWFsb2cvaW5kZXguanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJ2YWx1ZSIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiX193ZWJwYWNrX2V4cG9ydHNfXyIsIm9taXRLZXlzRnJvbVNvdXJjZU9iamVjdCIsInNvdXJjZSIsIm9taXR0ZWRLZXlzIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwia2V5cyIsInJlZHVjZSIsImhhc2giLCJrZXkiLCJpbmRleE9mIiwidXVpZCIsInJlcGxhY2UiLCJhIiwiTWF0aCIsInJhbmRvbSIsInRvU3RyaW5nIiwicmVxdWlyZSIsIl9jbGFzc0NhbGxDaGVjayIsImluc3RhbmNlIiwiQ29uc3RydWN0b3IiLCJUeXBlRXJyb3IiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiIsInNlbGYiLCJSZWZlcmVuY2VFcnJvciIsIl9pbmhlcml0cyIsInN1YkNsYXNzIiwic3VwZXJDbGFzcyIsImNyZWF0ZSIsImNvbnN0cnVjdG9yIiwid3JpdGFibGUiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3BvcnRhbF9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc19wb3J0YWxfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfdXRpbHNfdXVpZF9fIiwiX2V4dGVuZHMiLCJhc3NpZ24iLCJ0YXJnZXQiLCJfY3JlYXRlQ2xhc3MiLCJkZWZpbmVQcm9wZXJ0aWVzIiwicHJvcHMiLCJkZXNjcmlwdG9yIiwicHJvdG9Qcm9wcyIsInN0YXRpY1Byb3BzIiwiaXNGdW5jdGlvbiIsIngiLCJub29wIiwidG9BcnJheSIsIkFycmF5Iiwic2xpY2UiLCJEaWFsb2ciLCJfUmVhY3QkUHVyZUNvbXBvbmVudCIsIl9yZWYiLCJfdGVtcCIsIl90aGlzIiwiX3JldCIsInRoaXMiLCJfbGVuIiwiYXJncyIsIl9rZXkiLCJnZXRQcm90b3R5cGVPZiIsImFwcGx5IiwiY29uY2F0IiwibW91bnRlZCIsInV1aWRIZWFkZXIiLCJ1dWlkQm9keSIsImhhbmRsZUZvY3VzIiwibmF0aXZlRXZlbnQiLCJjYXB0dXJlRm9jdXMiLCJwcmV2aW91cyIsImV4cGxpY2l0T3JpZ2luYWxUYXJnZXQiLCJyZWxhdGVkVGFyZ2V0IiwiaXNQYXJ0T2ZEaWFsb2ciLCJwcmV2ZW50RGVmYXVsdCIsImZvY3VzIiwic2hvdWxkRGlhbG9nQ2xvc2VPbkV2ZW50Iiwid2luZG93Iiwic2V0VGltZW91dCIsIm9uQ2xvc2UiLCJoYW5kbGVLZXlEb3duIiwiZXZlbnQiLCJvbktleURvd24iLCJoYW5kbGVJbnNpZGVDbGljayIsImhhbmRsZU91dHNpZGVDbGljayIsImhhbmRsZU91dHNpZGVTY3JvbGxXaGVlbCIsIm5vZGUiLCJyb290cyIsIiR3cmFwcGVyIiwicXVlcnlTZWxlY3RvckFsbCIsIlBPUlRBTF9EQVRBX0FUVFJJQlVURSIsIm1hcCIsImRvbSIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJnZXRBdHRyaWJ1dGUiLCJlbGVtZW50Iiwibm9kZVR5cGUiLCJOb2RlIiwiRUxFTUVOVF9OT0RFIiwicGFyZW50Tm9kZSIsInNvbWUiLCJjb250YWlucyIsImFkZEV2ZW50TGlzdGVuZXIiLCJhY3RpdmVFbGVtZW50IiwiJGRpYWxvZyIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJwcm9wIiwiY3JlYXRlRWxlbWVudCIsImJvZHlQcm9wcyIsImlkIiwiY2xhc3NOYW1lIiwiY2hpbGRyZW4iLCJmb290ZXIiLCJmb290ZXJQcm9wcyIsImhlYWRlciIsImhlYWRlclByb3BzIiwidGFiSW5kZXgiLCJhcmlhLWhpZGRlbiIsIl90aGlzMiIsIndyYXBwZXJQcm9wcyIsInJlZiIsInJlbmRlckZvY3VzQm91bmRhcnkiLCJiZWZvcmUiLCJpbnRlcm5hbEtleXMiLCJvbkNsaWNrIiwicm9sZSIsImFyaWEtbGFiZWxsZWRieSIsImFyaWEtZGVzY3JpYmVkYnkiLCJyZW5kZXJIZWFkZXIiLCJyZW5kZXJCb2R5IiwicmVuZGVyRm9vdGVyIiwiYWZ0ZXIiLCJQdXJlQ29tcG9uZW50IiwicHJvcFR5cGVzIiwiYm9vbCIsImNsb3NlT25Fc2NLZXkiLCJvbmVPZlR5cGUiLCJmdW5jIiwiY2xvc2VPbkluc2lkZUNsaWNrIiwiY2xvc2VPbk91dHNpZGVDbGljayIsImNsb3NlT25PdXRzaWRlRm9jdXMiLCJjbG9zZU9uT3V0c2lkZVNjcm9sbCIsImRlZmF1bHRQcm9wcyJdLCJtYXBwaW5ncyI6IkFBQUFBLE9BQU9DLFFBQ0UsU0FBVUMsR0NHbkIsUUFBQUMsR0FBQUMsR0FHQSxHQUFBQyxFQUFBRCxHQUNBLE1BQUFDLEdBQUFELEdBQUFILE9BR0EsSUFBQUQsR0FBQUssRUFBQUQsSUFDQUUsRUFBQUYsRUFDQUcsR0FBQSxFQUNBTixXQVVBLE9BTkFDLEdBQUFFLEdBQUFJLEtBQUFSLEVBQUFDLFFBQUFELElBQUFDLFFBQUFFLEdBR0FILEVBQUFPLEdBQUEsRUFHQVAsRUFBQUMsUUF2QkEsR0FBQUksS0ErREEsT0FuQ0FGLEdBQUFNLEVBQUFQLEVBR0FDLEVBQUFPLEVBQUFMLEVBR0FGLEVBQUFHLEVBQUEsU0FBQUssR0FBMkMsTUFBQUEsSUFHM0NSLEVBQUFTLEVBQUEsU0FBQVgsRUFBQVksRUFBQUMsR0FDQVgsRUFBQVksRUFBQWQsRUFBQVksSUFDQUcsT0FBQUMsZUFBQWhCLEVBQUFZLEdBQ0FLLGNBQUEsRUFDQUMsWUFBQSxFQUNBQyxJQUFBTixLQU1BWCxFQUFBa0IsRUFBQSxTQUFBckIsR0FDQSxHQUFBYyxHQUFBZCxLQUFBc0IsV0FDQSxXQUEyQixNQUFBdEIsR0FBQSxTQUMzQixXQUFpQyxNQUFBQSxHQUVqQyxPQURBRyxHQUFBUyxFQUFBRSxFQUFBLElBQUFBLEdBQ0FBLEdBSUFYLEVBQUFZLEVBQUEsU0FBQVEsRUFBQUMsR0FBc0QsTUFBQVIsUUFBQVMsVUFBQUMsZUFBQWxCLEtBQUFlLEVBQUFDLElBR3REckIsRUFBQXdCLEVBQUEsR0FHQXhCLElBQUF5QixFQUFBLEtET00sU0FBVTVCLEVBQVE2QixFQUFxQjFCLEdBRTdDLFlFdEVlLFNBQVMy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QXFCLEVBQ3JCQyxzQkFBc0IsRUFDdEI3QixPQUFRLEtBQ1JDLGVBQ0FDLE9BQVEsS0FDUkMsZUFDQXJDLFFBQVNoQyxFQUNUbUMsVUFBV25DLEVBQ1h5RSxpQkFySGFyRSxFQXdIVnlFLGFBQWUvSSxPQUFPb0IsS0FBS2tELEVBQU80RixjUHpCdTNTckosRUFBNkIsUU8vRjU2U3lEIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPVxuLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbi8qKioqKiovIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuLyoqKioqKi8gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuLyoqKioqKi8gXHRcdFx0XHRnZXQ6IGdldHRlclxuLyoqKioqKi8gXHRcdFx0fSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4vKioqKioqLyBcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDUpO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgZXhwb3J0IChpbW11dGFibGUpICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gb21pdEtleXNGcm9tU291cmNlT2JqZWN0O1xuZnVuY3Rpb24gb21pdEtleXNGcm9tU291cmNlT2JqZWN0KHNvdXJjZSl7dmFyIG9taXR0ZWRLZXlzPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dW5kZWZpbmVkP2FyZ3VtZW50c1sxXTpbXTtyZXR1cm4gT2JqZWN0LmtleXMoc291cmNlKS5yZWR1Y2UoZnVuY3Rpb24gcmVsb2NhdGVBY2NlcHRlZEtleXMoaGFzaCxrZXkpe2lmKG9taXR0ZWRLZXlzLmluZGV4T2Yoa2V5KT09PS0xKXtoYXNoW2tleV09c291cmNlW2tleV07fXJldHVybiBoYXNoO30se30pO31cblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBleHBvcnQgKGltbXV0YWJsZSkgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSB1dWlkO1xuZnVuY3Rpb24gdXVpZCgpe3JldHVybidiLScrKFsxZTddKy0xZTMrLTRlMystOGUzKy0xZTExKS5yZXBsYWNlKC9bMDE4XS9nLGZ1bmN0aW9uKGEpe3JldHVybihhXk1hdGgucmFuZG9tKCkqMTY+PmEvNCkudG9TdHJpbmcoMTYpO30pO31cblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy1wb3J0YWxcIik7XG5cbi8qKiovIH0pLFxuLyogMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpO1xuXG4vKioqLyB9KSxcbi8qIDQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cbi8qKiovIH0pLFxuLyogNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShfX3dlYnBhY2tfZXhwb3J0c19fLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfcG9ydGFsX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfcG9ydGFsX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3BvcnRhbF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfYm91bmRsZXNzX3V0aWxzX3V1aWRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG52YXIgX2V4dGVuZHM9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odGFyZ2V0KXtmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXt2YXIgc291cmNlPWFyZ3VtZW50c1tpXTtmb3IodmFyIGtleSBpbiBzb3VyY2Upe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2Usa2V5KSl7dGFyZ2V0W2tleV09c291cmNlW2tleV07fX19cmV0dXJuIHRhcmdldDt9O3ZhciBfY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCxwcm9wcyl7Zm9yKHZhciBpPTA7aTxwcm9wcy5sZW5ndGg7aSsrKXt2YXIgZGVzY3JpcHRvcj1wcm9wc1tpXTtkZXNjcmlwdG9yLmVudW1lcmFibGU9ZGVzY3JpcHRvci5lbnVtZXJhYmxlfHxmYWxzZTtkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZT10cnVlO2lmKFwidmFsdWVcImluIGRlc2NyaXB0b3IpZGVzY3JpcHRvci53cml0YWJsZT10cnVlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsZGVzY3JpcHRvci5rZXksZGVzY3JpcHRvcik7fX1yZXR1cm4gZnVuY3Rpb24oQ29uc3RydWN0b3IscHJvdG9Qcm9wcyxzdGF0aWNQcm9wcyl7aWYocHJvdG9Qcm9wcylkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSxwcm90b1Byb3BzKTtpZihzdGF0aWNQcm9wcylkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLHN0YXRpY1Byb3BzKTtyZXR1cm4gQ29uc3RydWN0b3I7fTt9KCk7ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLENvbnN0cnVjdG9yKXtpZighKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO319ZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZixjYWxsKXtpZighc2VsZil7dGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO31yZXR1cm4gY2FsbCYmKHR5cGVvZiBjYWxsPT09XCJvYmplY3RcInx8dHlwZW9mIGNhbGw9PT1cImZ1bmN0aW9uXCIpP2NhbGw6c2VsZjt9ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLHN1cGVyQ2xhc3Mpe2lmKHR5cGVvZiBzdXBlckNsYXNzIT09XCJmdW5jdGlvblwiJiZzdXBlckNsYXNzIT09bnVsbCl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIrdHlwZW9mIHN1cGVyQ2xhc3MpO31zdWJDbGFzcy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzJiZzdXBlckNsYXNzLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnN1YkNsYXNzLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX19KTtpZihzdXBlckNsYXNzKU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3Msc3VwZXJDbGFzcyk6c3ViQ2xhc3MuX19wcm90b19fPXN1cGVyQ2xhc3M7fXZhciBpc0Z1bmN0aW9uPWZ1bmN0aW9uIGlzRnVuY3Rpb24oeCl7cmV0dXJuIHR5cGVvZiB4PT09J2Z1bmN0aW9uJzt9O3ZhciBub29wPWZ1bmN0aW9uIG5vb3AoKXt9O3ZhciB0b0FycmF5PUFycmF5LnByb3RvdHlwZS5zbGljZTt2YXIgRGlhbG9nPWZ1bmN0aW9uKF9SZWFjdCRQdXJlQ29tcG9uZW50KXtfaW5oZXJpdHMoRGlhbG9nLF9SZWFjdCRQdXJlQ29tcG9uZW50KTtmdW5jdGlvbiBEaWFsb2coKXt2YXIgX3JlZjt2YXIgX3RlbXAsX3RoaXMsX3JldDtfY2xhc3NDYWxsQ2hlY2sodGhpcyxEaWFsb2cpO2Zvcih2YXIgX2xlbj1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkoX2xlbiksX2tleT0wO19rZXk8X2xlbjtfa2V5Kyspe2FyZ3NbX2tleV09YXJndW1lbnRzW19rZXldO31yZXR1cm4gX3JldD0oX3RlbXA9KF90aGlzPV9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKF9yZWY9RGlhbG9nLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKERpYWxvZykpLmNhbGwuYXBwbHkoX3JlZixbdGhpc10uY29uY2F0KGFyZ3MpKSksX3RoaXMpLF90aGlzLm1vdW50ZWQ9ZmFsc2UsX3RoaXMudXVpZEhlYWRlcj1fX3dlYnBhY2tfcmVxdWlyZV9fLmkoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X2JvdW5kbGVzc191dGlsc191dWlkX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKCksX3RoaXMudXVpZEJvZHk9X193ZWJwYWNrX3JlcXVpcmVfXy5pKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfdXRpbHNfdXVpZF9fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKSgpLF90aGlzLmhhbmRsZUZvY3VzPWZ1bmN0aW9uKG5hdGl2ZUV2ZW50KXtpZighX3RoaXMucHJvcHMuY2FwdHVyZUZvY3VzKXtpZihfdGhpcy5zaG91bGREaWFsb2dDbG9zZU9uRXZlbnQoJ2Nsb3NlT25PdXRzaWRlRm9jdXMnLG5hdGl2ZUV2ZW50KSYmIV90aGlzLmlzUGFydE9mRGlhbG9nKG5hdGl2ZUV2ZW50LnRhcmdldCkpe3JldHVybiB3aW5kb3cuc2V0VGltZW91dChfdGhpcy5wcm9wcy5vbkNsb3NlLDApO31yZXR1cm47fXZhciBwcmV2aW91cz1uYXRpdmVFdmVudC5leHBsaWNpdE9yaWdpbmFsVGFyZ2V0fHxuYXRpdmVFdmVudC5yZWxhdGVkVGFyZ2V0O2lmKF90aGlzLmlzUGFydE9mRGlhbG9nKHByZXZpb3VzKSYmIV90aGlzLmlzUGFydE9mRGlhbG9nKG5hdGl2ZUV2ZW50LnRhcmdldCkpe25hdGl2ZUV2ZW50LnByZXZlbnREZWZhdWx0KCk7cHJldmlvdXMuZm9jdXMoKTt9fSxfdGhpcy5oYW5kbGVLZXlEb3duPWZ1bmN0aW9uKGV2ZW50KXtpZihldmVudC5rZXk9PT0nRXNjYXBlJyl7aWYoX3RoaXMuc2hvdWxkRGlhbG9nQ2xvc2VPbkV2ZW50KCdjbG9zZU9uRXNjS2V5JyxldmVudCkpe3dpbmRvdy5zZXRUaW1lb3V0KF90aGlzLnByb3BzLm9uQ2xvc2UsMCk7fX1pZihfdGhpcy5wcm9wcy5vbktleURvd24pe190aGlzLnByb3BzLm9uS2V5RG93bihldmVudCk7fX0sX3RoaXMuaGFuZGxlSW5zaWRlQ2xpY2s9ZnVuY3Rpb24oZXZlbnQpe2lmKF90aGlzLnNob3VsZERpYWxvZ0Nsb3NlT25FdmVudCgnY2xvc2VPbkluc2lkZUNsaWNrJyxldmVudCkpe3dpbmRvdy5zZXRUaW1lb3V0KF90aGlzLnByb3BzLm9uQ2xvc2UsMCk7fX0sX3RoaXMuaGFuZGxlT3V0c2lkZUNsaWNrPWZ1bmN0aW9uKG5hdGl2ZUV2ZW50KXtpZihfdGhpcy5zaG91bGREaWFsb2dDbG9zZU9uRXZlbnQoJ2Nsb3NlT25PdXRzaWRlQ2xpY2snLG5hdGl2ZUV2ZW50KSYmIV90aGlzLmlzUGFydE9mRGlhbG9nKG5hdGl2ZUV2ZW50LnRhcmdldCkpe3dpbmRvdy5zZXRUaW1lb3V0KF90aGlzLnByb3BzLm9uQ2xvc2UsMCk7fX0sX3RoaXMuaGFuZGxlT3V0c2lkZVNjcm9sbFdoZWVsPWZ1bmN0aW9uKG5hdGl2ZUV2ZW50KXtpZihfdGhpcy5zaG91bGREaWFsb2dDbG9zZU9uRXZlbnQoJ2Nsb3NlT25PdXRzaWRlU2Nyb2xsJyxuYXRpdmVFdmVudCkmJiFfdGhpcy5pc1BhcnRPZkRpYWxvZyhuYXRpdmVFdmVudC50YXJnZXQpKXt3aW5kb3cuc2V0VGltZW91dChfdGhpcy5wcm9wcy5vbkNsb3NlLDApO319LF90ZW1wKSxfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcyxfcmV0KTt9X2NyZWF0ZUNsYXNzKERpYWxvZyxbe2tleTonaXNQYXJ0T2ZEaWFsb2cnLHZhbHVlOmZ1bmN0aW9uIGlzUGFydE9mRGlhbG9nKG5vZGUpe2lmKCFub2RlfHxub2RlPT09d2luZG93KXtyZXR1cm4gZmFsc2U7fXZhciByb290cz1bdGhpcy4kd3JhcHBlcl0uY29uY2F0KHRvQXJyYXkuY2FsbCh0aGlzLiR3cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ1snK19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfcG9ydGFsX19fZGVmYXVsdC5hLlBPUlRBTF9EQVRBX0FUVFJJQlVURSsnXScpKS5tYXAoZnVuY3Rpb24oZG9tKXtyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZG9tLmdldEF0dHJpYnV0ZShfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3BvcnRhbF9fX2RlZmF1bHQuYS5QT1JUQUxfREFUQV9BVFRSSUJVVEUpKTt9KSk7dmFyIGVsZW1lbnQ9bm9kZS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFP25vZGUucGFyZW50Tm9kZTpub2RlO3JldHVybiByb290cy5zb21lKGZ1bmN0aW9uKGRvbSl7cmV0dXJuIGRvbS5jb250YWlucyhlbGVtZW50KTt9KTt9fSx7a2V5Oidjb21wb25lbnREaWRNb3VudCcsdmFsdWU6ZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLHRoaXMuaGFuZGxlT3V0c2lkZUNsaWNrLHRydWUpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsdGhpcy5oYW5kbGVPdXRzaWRlQ2xpY2ssdHJ1ZSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJyx0aGlzLmhhbmRsZUZvY3VzLHRydWUpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLHRoaXMuaGFuZGxlT3V0c2lkZVNjcm9sbFdoZWVsLHRydWUpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd3aGVlbCcsdGhpcy5oYW5kbGVPdXRzaWRlU2Nyb2xsV2hlZWwsdHJ1ZSk7aWYodGhpcy5wcm9wcy5jYXB0dXJlRm9jdXMmJiF0aGlzLmlzUGFydE9mRGlhbG9nKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKXt0aGlzLiRkaWFsb2cuZm9jdXMoKTt9fX0se2tleTonY29tcG9uZW50V2lsbFVubW91bnQnLHZhbHVlOmZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJyx0aGlzLmhhbmRsZU91dHNpZGVDbGljayx0cnVlKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLHRoaXMuaGFuZGxlT3V0c2lkZUNsaWNrLHRydWUpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsdGhpcy5oYW5kbGVGb2N1cyx0cnVlKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJyx0aGlzLmhhbmRsZU91dHNpZGVTY3JvbGxXaGVlbCx0cnVlKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLHRoaXMuaGFuZGxlT3V0c2lkZVNjcm9sbFdoZWVsLHRydWUpO319LHtrZXk6J3Nob3VsZERpYWxvZ0Nsb3NlT25FdmVudCcsdmFsdWU6ZnVuY3Rpb24gc2hvdWxkRGlhbG9nQ2xvc2VPbkV2ZW50KHByb3AsZXZlbnQpe3JldHVybiBpc0Z1bmN0aW9uKHRoaXMucHJvcHNbcHJvcF0pP3RoaXMucHJvcHNbcHJvcF0oZXZlbnQpOnRoaXMucHJvcHNbcHJvcF07fX0se2tleToncmVuZGVyQm9keScsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyQm9keSgpe3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudCgnZGl2JyxfZXh0ZW5kcyh7fSx0aGlzLnByb3BzLmJvZHlQcm9wcyx7aWQ6dGhpcy5wcm9wcy5ib2R5UHJvcHMuaWR8fHRoaXMudXVpZEJvZHksY2xhc3NOYW1lOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCgpKCdiLWRpYWxvZy1ib2R5Jyx0aGlzLnByb3BzLmJvZHlQcm9wcy5jbGFzc05hbWUpfSksdGhpcy5wcm9wcy5jaGlsZHJlbik7fX0se2tleToncmVuZGVyRm9vdGVyJyx2YWx1ZTpmdW5jdGlvbiByZW5kZXJGb290ZXIoKXtpZih0aGlzLnByb3BzLmZvb3Rlcil7cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KCdmb290ZXInLF9leHRlbmRzKHt9LHRoaXMucHJvcHMuZm9vdGVyUHJvcHMse2NsYXNzTmFtZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQoKSgnYi1kaWFsb2ctZm9vdGVyJyx0aGlzLnByb3BzLmZvb3RlclByb3BzLmNsYXNzTmFtZSl9KSx0aGlzLnByb3BzLmZvb3Rlcik7fX19LHtrZXk6J3JlbmRlckhlYWRlcicsdmFsdWU6ZnVuY3Rpb24gcmVuZGVySGVhZGVyKCl7aWYodGhpcy5wcm9wcy5oZWFkZXIpe3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudCgnaGVhZGVyJyxfZXh0ZW5kcyh7fSx0aGlzLnByb3BzLmhlYWRlclByb3BzLHtpZDp0aGlzLnByb3BzLmhlYWRlclByb3BzLmlkfHx0aGlzLnV1aWRIZWFkZXIsY2xhc3NOYW1lOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCgpKCdiLWRpYWxvZy1oZWFkZXInLHRoaXMucHJvcHMuaGVhZGVyUHJvcHMuY2xhc3NOYW1lKX0pLHRoaXMucHJvcHMuaGVhZGVyKTt9fX0se2tleToncmVuZGVyRm9jdXNCb3VuZGFyeScsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyRm9jdXNCb3VuZGFyeSgpe2lmKHRoaXMucHJvcHMuY2FwdHVyZUZvY3VzKXtyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoJ2Rpdicse2NsYXNzTmFtZTonYi1vZmZzY3JlZW4nLHRhYkluZGV4OicwJywnYXJpYS1oaWRkZW4nOid0cnVlJ30sJ1xceEEwJyk7fX19LHtrZXk6J3JlbmRlcicsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyKCl7dmFyIF90aGlzMj10aGlzO3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudCgnZGl2JyxfZXh0ZW5kcyh7fSx0aGlzLnByb3BzLndyYXBwZXJQcm9wcyx7cmVmOmZ1bmN0aW9uIHJlZihub2RlKXtyZXR1cm4gX3RoaXMyLiR3cmFwcGVyPW5vZGU7fSxjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItZGlhbG9nLXdyYXBwZXInLHRoaXMucHJvcHMud3JhcHBlclByb3BzLmNsYXNzTmFtZSksdGFiSW5kZXg6JzAnfSksdGhpcy5yZW5kZXJGb2N1c0JvdW5kYXJ5KCksdGhpcy5wcm9wcy5iZWZvcmUsX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoJ2RpdicsX2V4dGVuZHMoe30sX193ZWJwYWNrX3JlcXVpcmVfXy5pKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKHRoaXMucHJvcHMsRGlhbG9nLmludGVybmFsS2V5cykse3JlZjpmdW5jdGlvbiByZWYobm9kZSl7cmV0dXJuIF90aGlzMi4kZGlhbG9nPW5vZGU7fSxjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItZGlhbG9nJyx0aGlzLnByb3BzLmNsYXNzTmFtZSksb25DbGljazp0aGlzLmhhbmRsZUluc2lkZUNsaWNrLG9uS2V5RG93bjp0aGlzLmhhbmRsZUtleURvd24scm9sZTonZGlhbG9nJywnYXJpYS1sYWJlbGxlZGJ5Jzp0aGlzLnV1aWRIZWFkZXIsJ2FyaWEtZGVzY3JpYmVkYnknOnRoaXMudXVpZEJvZHksdGFiSW5kZXg6JzAnfSksdGhpcy5yZW5kZXJIZWFkZXIoKSx0aGlzLnJlbmRlckJvZHkoKSx0aGlzLnJlbmRlckZvb3RlcigpKSx0aGlzLnByb3BzLmFmdGVyLHRoaXMucmVuZGVyRm9jdXNCb3VuZGFyeSgpKTt9fV0pO3JldHVybiBEaWFsb2c7fShfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuUHVyZUNvbXBvbmVudCk7RGlhbG9nLnByb3BUeXBlcz17YWZ0ZXI6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ubm9kZSxiZWZvcmU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ubm9kZSxib2R5UHJvcHM6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub2JqZWN0LGNhcHR1cmVGb2N1czpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ib29sLGNoaWxkcmVuOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm5vZGUsY2xvc2VPbkVzY0tleTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5vbmVPZlR5cGUoW19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmJvb2wsX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uZnVuY10pLGNsb3NlT25JbnNpZGVDbGljazpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5vbmVPZlR5cGUoW19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmJvb2wsX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uZnVuY10pLGNsb3NlT25PdXRzaWRlQ2xpY2s6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub25lT2ZUeXBlKFtfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ib29sLF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmNdKSxjbG9zZU9uT3V0c2lkZUZvY3VzOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm9uZU9mVHlwZShbX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYm9vbCxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jXSksY2xvc2VPbk91dHNpZGVTY3JvbGw6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub25lT2ZUeXBlKFtfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ib29sLF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmNdKSxmb290ZXI6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ubm9kZSxmb290ZXJQcm9wczpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5vYmplY3QsaGVhZGVyOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm5vZGUsaGVhZGVyUHJvcHM6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub2JqZWN0LG9uQ2xvc2U6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uZnVuYyx3cmFwcGVyUHJvcHM6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub2JqZWN0fTtEaWFsb2cuZGVmYXVsdFByb3BzPXthZnRlcjpudWxsLGJlZm9yZTpudWxsLGJvZHlQcm9wczp7fSxjYXB0dXJlRm9jdXM6dHJ1ZSxjaGlsZHJlbjpudWxsLGNsb3NlT25Fc2NLZXk6ZmFsc2UsY2xvc2VPbkluc2lkZUNsaWNrOmZhbHNlLGNsb3NlT25PdXRzaWRlQ2xpY2s6ZmFsc2UsY2xvc2VPbk91dHNpZGVGb2N1czpmYWxzZSxjbG9zZU9uT3V0c2lkZVNjcm9sbDpmYWxzZSxmb290ZXI6bnVsbCxmb290ZXJQcm9wczp7fSxoZWFkZXI6bnVsbCxoZWFkZXJQcm9wczp7fSxvbkNsb3NlOm5vb3Asb25LZXlEb3duOm5vb3Asd3JhcHBlclByb3BzOnt9fTtEaWFsb2cuaW50ZXJuYWxLZXlzPU9iamVjdC5rZXlzKERpYWxvZy5kZWZhdWx0UHJvcHMpOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSBEaWFsb2c7XG5cbi8qKiovIH0pXG4vKioqKioqLyBdKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gaW5kZXguanMiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA1KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCA4ZmZhMjVjNjE2MDBlOGJiZjk0NCIsIi8qKlxuICogUmV0dXJucyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHN1cHBsaWVkIG9iamVjdCB3aXRob3V0IHRoZSBnaXZlbiBrZXlzLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBvbWl0S2V5c0Zyb21Tb3VyY2VPYmplY3Qoc291cmNlLCBvbWl0dGVkS2V5cyA9IFtdKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIHJlbG9jYXRlQWNjZXB0ZWRLZXlzKGhhc2gsIGtleSkge1xuICAgICAgICBpZiAob21pdHRlZEtleXMuaW5kZXhPZihrZXkpID09PSAtMSkge1xuICAgICAgICAgICAgaGFzaFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFzaDtcbiAgICB9LCB7fSk7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9ib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzL2luZGV4LmpzIiwiLyoqXG4gKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQuIEFkZHMgYSBwcmVmaXggc28gaXQgaXMgc3VpdGFibGUgZm9yIHVzZSBhcyBhbiBIVE1MIElELlxuICogQmFzZWQgb24ge0BsaW5rIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2plZC85ODI4ODMgdGhpcyBpbXBsZW1lbnRhdGlvbn0uXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBhIHVuaXF1ZSBpZGVudGlmaWVyXG4gKlxuICogQGV4YW1wbGVcbiAqIHV1aWQoKTsgLy8gYi0xZjJjZDI3Zi0wNzU0LTQzNDQtOWQyMC00MzZhMjAxYjJmODBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXVpZCgpIHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAgIHJldHVybiAnYi0nICsgKFsxZTddKy0xZTMrLTRlMystOGUzKy0xZTExKS5yZXBsYWNlKC9bMDE4XS9nLGE9PihhXk1hdGgucmFuZG9tKCkqMTY+PmEvNCkudG9TdHJpbmcoMTYpKTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlICovXG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9ib3VuZGxlc3MtdXRpbHMtdXVpZC9pbmRleC5qcyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy1wb3J0YWxcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtcG9ydGFsXCJ9XG4vLyBtb2R1bGUgaWQgPSAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNsYXNzbmFtZXNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJjbGFzc25hbWVzXCJ9XG4vLyBtb2R1bGUgaWQgPSAzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn1cbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IFJlYWN0LCB7UHJvcFR5cGVzfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY3ggZnJvbSAnY2xhc3NuYW1lcyc7XG5cbmltcG9ydCBQb3J0YWwgZnJvbSAnYm91bmRsZXNzLXBvcnRhbCc7XG5pbXBvcnQgb21pdCBmcm9tICdib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzJztcbmltcG9ydCB1dWlkIGZyb20gJ2JvdW5kbGVzcy11dGlscy11dWlkJztcblxuY29uc3QgaXNGdW5jdGlvbiA9ICh4KSA9PiB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJztcbmNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcbmNvbnN0IHRvQXJyYXkgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cbi8qKlxuIyBEaWFsb2dcbl9fQSBub24tYmxvY2tpbmcsIGZvY3VzLXN0ZWFsaW5nIGNvbnRhaW5lci5fX1xuXG5BIGRpYWxvZyBkaWZmZXJzIGZyb20gYSBtb2RhbCBpbiB0aGF0IGl0IGRvZXMgbm90IGNvbWUgd2l0aCBhIG1hc2tpbmcgbGF5ZXIgKHRvIG9ic2N1cmUgdGhlIHJlc3Qgb2YgdGhlIHBhZ2UpXG5hbmQgdGhlIHVzZXIgY2FuIGNob29zZSB0byBzaGlmdCBmb2N1cyBhd2F5IGZyb20gdGhlIGRpYWxvZyBjb250ZW50cyB2aWEgbW91c2UgY2xpY2sgb3IgYSBrZXlib2FyZCBzaG9ydGN1dC5cblxuU3BlY2lmaWMgYXJlYXMgKGhlYWRlciwgYm9keSwgZm9vdGVyKSBhcmUgZGVmaW5lZCB0byBwcm92aWRlIGVhc3kgY29uZm9ybWFuY2UgdG8gdGhlXG5bV0FJLUFSSUEgc3BlY10oaHR0cDovL3d3dy53My5vcmcgKiAvVFIvd2FpLWFyaWEvc3RhdGVzX2FuZF9wcm9wZXJ0aWVzI2FyaWEtbGFiZWxsZWRieSkgZm9yIGBhcmlhLWxhYmVsbGVkYnlgXG5hbmQgYGFyaWEtZGVzY3JpYmVkYnlgIChzY3JlZW4gcmVhZGVyICAqIGFjY2Vzc2liaWxpdHkpLiBUaGVpciB1c2UgaXMgb3B0aW9uYWwsIGJ1dCBlbmNvdXJhZ2VkLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEaWFsb2cgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgICAvKipcbiAgICAgICAgICogYXJiaXRyYXJ5IGNvbnRlbnQgdG8gYmUgcmVuZGVyZWQgYWZ0ZXIgdGhlIGRpYWxvZyBpbiB0aGUgRE9NXG4gICAgICAgICAqL1xuICAgICAgICBhZnRlcjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFyYml0cmFyeSBjb250ZW50IHRvIGJlIHJlbmRlcmVkIGJlZm9yZSB0aGUgZGlhbG9nIGluIHRoZSBET01cbiAgICAgICAgICovXG4gICAgICAgIGJlZm9yZTogUHJvcFR5cGVzLm5vZGUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFueSBbUmVhY3Qtc3VwcG9ydGVkIGF0dHJpYnV0ZV0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90YWdzLWFuZC1hdHRyaWJ1dGVzLmh0bWwjaHRtbC1hdHRyaWJ1dGVzKTsgYXBwbGllZCB0byB0aGUgYC5iLWRpYWxvZy1ib2R5YCBub2RlXG4gICAgICAgICAqL1xuICAgICAgICBib2R5UHJvcHM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGRldGVybWluZXMgaWYgZm9jdXMgaXMgYWxsb3dlZCB0byBtb3ZlIGF3YXkgZnJvbSB0aGUgZGlhbG9nXG4gICAgICAgICAqL1xuICAgICAgICBjYXB0dXJlRm9jdXM6IFByb3BUeXBlcy5ib29sLFxuXG4gICAgICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogZW5hYmxlIGRldGVjdGlvbiBvZiBcIkVzY2FwZVwiIGtleXByZXNzZXMgdG8gdHJpZ2dlciBgcHJvcHMub25DbG9zZWA7IGlmIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQsIHRoZSByZXR1cm5cbiAgICAgICAgICogdmFsdWUgZGV0ZXJtaW5lcyBpZiB0aGUgZGlhbG9nIHdpbGwgYmUgY2xvc2VkXG4gICAgICAgICAqL1xuICAgICAgICBjbG9zZU9uRXNjS2V5OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgICAgIFByb3BUeXBlcy5ib29sLFxuICAgICAgICAgICAgUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIF0pLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBlbmFibGUgZGV0ZWN0aW9uIG9mIGNsaWNrcyBpbnNpZGUgdGhlIGRpYWxvZyBhcmVhIHRvIHRyaWdnZXIgYHByb3BzLm9uQ2xvc2VgOyBpZiBhIGZ1bmN0aW9uIGlzIHByb3ZpZGVkLCB0aGUgcmV0dXJuXG4gICAgICAgICAqIHZhbHVlIGRldGVybWluZXMgaWYgdGhlIGRpYWxvZyB3aWxsIGJlIGNsb3NlZFxuICAgICAgICAgKi9cbiAgICAgICAgY2xvc2VPbkluc2lkZUNsaWNrOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgICAgIFByb3BUeXBlcy5ib29sLFxuICAgICAgICAgICAgUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIF0pLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBlbmFibGUgZGV0ZWN0aW9uIG9mIGNsaWNrcyBvdXRzaWRlIHRoZSBkaWFsb2cgYXJlYSB0byB0cmlnZ2VyIGBwcm9wcy5vbkNsb3NlYDsgaWYgYSBmdW5jdGlvbiBpcyBwcm92aWRlZCwgdGhlIHJldHVyblxuICAgICAgICAgKiB2YWx1ZSBkZXRlcm1pbmVzIGlmIHRoZSBkaWFsb2cgd2lsbCBiZSBjbG9zZWRcbiAgICAgICAgICovXG4gICAgICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgICAgICAgICAgUHJvcFR5cGVzLmJvb2wsXG4gICAgICAgICAgICBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgXSksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGVuYWJsZSBkZXRlY3Rpb24gb2YgZm9jdXMgb3V0c2lkZSB0aGUgZGlhbG9nIGFyZWEgdG8gdHJpZ2dlciBgcHJvcHMub25DbG9zZWA7IGlmIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQsIHRoZSByZXR1cm5cbiAgICAgICAgICogdmFsdWUgZGV0ZXJtaW5lcyBpZiB0aGUgZGlhbG9nIHdpbGwgYmUgY2xvc2VkXG4gICAgICAgICAqL1xuICAgICAgICBjbG9zZU9uT3V0c2lkZUZvY3VzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgICAgIFByb3BUeXBlcy5ib29sLFxuICAgICAgICAgICAgUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIF0pLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBlbmFibGUgZGV0ZWN0aW9uIG9mIHNjcm9sbCBhbmQgbW91c2V3aGVlbCBldmVudHMgb3V0c2lkZSB0aGUgZGlhbG9nIGFyZWEgdG8gdHJpZ2dlciBgcHJvcHMub25DbG9zZWA7IGlmIGEgZnVuY3Rpb1xuICAgICAgICAgKiBpcyBwcm92aWRlZCwgdGhlIHJldHVybiB2YWx1ZSBkZXRlcm1pbmVzIGlmIHRoZSBkaWFsb2cgd2lsbCBiZSBjbG9zZWRcbiAgICAgICAgICovXG4gICAgICAgIGNsb3NlT25PdXRzaWRlU2Nyb2xsOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgICAgIFByb3BUeXBlcy5ib29sLFxuICAgICAgICAgICAgUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIF0pLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0ZXh0LCBSZWFjdEVsZW1lbnRzLCBldGMuIGNvbXByaXNpbmcgdGhlIFwiZm9vdGVyXCIgYXJlYSBvZiB0aGUgZGlhbG9nLCBlLmcuIGNvbmZpcm0vY2FuY2VsIGJ1dHRvbnNcbiAgICAgICAgICovXG4gICAgICAgIGZvb3RlcjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFueSBbUmVhY3Qtc3VwcG9ydGVkIGF0dHJpYnV0ZV0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90YWdzLWFuZC1hdHRyaWJ1dGVzLmh0bWwjaHRtbC1hdHRyaWJ1dGVzKTsgYXBwbGllZCB0byB0aGUgYC5iLWRpYWxvZy1mb290ZXJgIG5vZGVcbiAgICAgICAgICovXG4gICAgICAgIGZvb3RlclByb3BzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0ZXh0LCBSZWFjdEVsZW1lbnRzLCBldGMuIHRvIHJlcHJlc2VudCB0aGUgXCJ0aXRsZSBiYXJcIiBhcmVhIG9mIHRoZSBkaWFsb2dcbiAgICAgICAgICovXG4gICAgICAgIGhlYWRlcjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFueSBbUmVhY3Qtc3VwcG9ydGVkIGF0dHJpYnV0ZV0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90YWdzLWFuZC1hdHRyaWJ1dGVzLmh0bWwjaHRtbC1hdHRyaWJ1dGVzKTsgYXBwbGllZCB0byB0aGUgYC5iLWRpYWxvZy1oZWFkZXJgIG5vZGVcbiAgICAgICAgICovXG4gICAgICAgIGhlYWRlclByb3BzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhIGN1c3RvbSBldmVudCBoYW5kbGVyIHRoYXQgaXMgY2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGRpYWxvZyBzaG91bGQgYmUgdW5yZW5kZXJlZCBieSBpdHMgcGFyZW50OyB0aGUgZXZlbnQgb2NjdXJzIGlmIG9uZSBvciBtb3JlIG9mIHRoZSBgY2xvc2VPbmAgcHJvcHMgKGBjbG9zZU9uRXNjS2V5YCwgYGNsb3NlT25PdXRzaWRlQ2xpY2tgLCBldGMuKSBhcmUgcGFzc2VkIGFzIGB0cnVlYCBhbmQgdGhlIGRpc21pc3NhbCBjcml0ZXJpYSBhcmUgc2F0aXNmaWVkXG4gICAgICAgICAqL1xuICAgICAgICBvbkNsb3NlOiBQcm9wVHlwZXMuZnVuYyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogYW55IFtSZWFjdC1zdXBwb3J0ZWQgYXR0cmlidXRlXShodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RhZ3MtYW5kLWF0dHJpYnV0ZXMuaHRtbCNodG1sLWF0dHJpYnV0ZXMpOyBhcHBsaWVkIHRvIHRoZSBgLmItZGlhbG9nLXdyYXBwZXJgIG5vZGVcbiAgICAgICAgICovXG4gICAgICAgIHdyYXBwZXJQcm9wczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICB9XG5cbiAgICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgICBhZnRlcjogbnVsbCxcbiAgICAgICAgYmVmb3JlOiBudWxsLFxuICAgICAgICBib2R5UHJvcHM6IHt9LFxuICAgICAgICBjYXB0dXJlRm9jdXM6IHRydWUsXG4gICAgICAgIGNoaWxkcmVuOiBudWxsLFxuICAgICAgICBjbG9zZU9uRXNjS2V5OiBmYWxzZSxcbiAgICAgICAgY2xvc2VPbkluc2lkZUNsaWNrOiBmYWxzZSxcbiAgICAgICAgY2xvc2VPbk91dHNpZGVDbGljazogZmFsc2UsXG4gICAgICAgIGNsb3NlT25PdXRzaWRlRm9jdXM6IGZhbHNlLFxuICAgICAgICBjbG9zZU9uT3V0c2lkZVNjcm9sbDogZmFsc2UsXG4gICAgICAgIGZvb3RlcjogbnVsbCxcbiAgICAgICAgZm9vdGVyUHJvcHM6IHt9LFxuICAgICAgICBoZWFkZXI6IG51bGwsXG4gICAgICAgIGhlYWRlclByb3BzOiB7fSxcbiAgICAgICAgb25DbG9zZTogbm9vcCxcbiAgICAgICAgb25LZXlEb3duOiBub29wLFxuICAgICAgICB3cmFwcGVyUHJvcHM6IHt9LFxuICAgIH1cblxuICAgIHN0YXRpYyBpbnRlcm5hbEtleXMgPSBPYmplY3Qua2V5cyhEaWFsb2cuZGVmYXVsdFByb3BzKVxuXG4gICAgbW91bnRlZCA9IGZhbHNlXG5cbiAgICAvLyBmYWxsYmFja3MgaWYgb25lIGlzbid0IHBhc3NlZFxuICAgIHV1aWRIZWFkZXIgPSB1dWlkKClcbiAgICB1dWlkQm9keSA9IHV1aWQoKVxuXG4gICAgaXNQYXJ0T2ZEaWFsb2cobm9kZSkge1xuICAgICAgICBpZiAoIW5vZGUgfHwgbm9kZSA9PT0gd2luZG93KSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgICAgIGNvbnN0IHJvb3RzID0gW3RoaXMuJHdyYXBwZXJdLmNvbmNhdChcbiAgICAgICAgICAgIHRvQXJyYXkuY2FsbChcbiAgICAgICAgICAgICAgICB0aGlzLiR3cmFwcGVyLnF1ZXJ5U2VsZWN0b3JBbGwoYFske1BvcnRhbC5QT1JUQUxfREFUQV9BVFRSSUJVVEV9XWApXG4gICAgICAgICAgICApLm1hcCgoZG9tKSA9PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkb20uZ2V0QXR0cmlidXRlKFBvcnRhbC5QT1JUQUxfREFUQV9BVFRSSUJVVEUpKSlcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBlbGVtZW50ID0gbm9kZS5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUgPyBub2RlLnBhcmVudE5vZGUgOiBub2RlO1xuXG4gICAgICAgIHJldHVybiByb290cy5zb21lKChkb20pID0+IGRvbS5jb250YWlucyhlbGVtZW50KSk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuaGFuZGxlT3V0c2lkZUNsaWNrLCB0cnVlKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5oYW5kbGVPdXRzaWRlQ2xpY2ssIHRydWUpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB0aGlzLmhhbmRsZUZvY3VzLCB0cnVlKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuaGFuZGxlT3V0c2lkZVNjcm9sbFdoZWVsLCB0cnVlKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgdGhpcy5oYW5kbGVPdXRzaWRlU2Nyb2xsV2hlZWwsIHRydWUpO1xuXG4gICAgICAgIGlmICh0aGlzLnByb3BzLmNhcHR1cmVGb2N1cyAmJiAhdGhpcy5pc1BhcnRPZkRpYWxvZyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgICAgICAgdGhpcy4kZGlhbG9nLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVPdXRzaWRlQ2xpY2ssIHRydWUpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCB0aGlzLmhhbmRsZU91dHNpZGVDbGljaywgdHJ1ZSk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuaGFuZGxlRm9jdXMsIHRydWUpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5oYW5kbGVPdXRzaWRlU2Nyb2xsV2hlZWwsIHRydWUpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLmhhbmRsZU91dHNpZGVTY3JvbGxXaGVlbCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgc2hvdWxkRGlhbG9nQ2xvc2VPbkV2ZW50KHByb3AsIGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKHRoaXMucHJvcHNbcHJvcF0pID8gdGhpcy5wcm9wc1twcm9wXShldmVudCkgOiB0aGlzLnByb3BzW3Byb3BdO1xuICAgIH1cblxuICAgIGhhbmRsZUZvY3VzID0gKG5hdGl2ZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5wcm9wcy5jYXB0dXJlRm9jdXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZERpYWxvZ0Nsb3NlT25FdmVudCgnY2xvc2VPbk91dHNpZGVGb2N1cycsIG5hdGl2ZUV2ZW50KSAmJiAhdGhpcy5pc1BhcnRPZkRpYWxvZyhuYXRpdmVFdmVudC50YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucHJvcHMub25DbG9zZSwgMCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGV4cGxpY2l0T3JpZ2luYWxUYXJnZXQgaXMgZm9yIEZpcmVmb3gsIGFzIGl0IGRvZXNuJ3Qgc3VwcG9ydCByZWxhdGVkVGFyZ2V0XG4gICAgICAgIGxldCBwcmV2aW91cyA9IG5hdGl2ZUV2ZW50LmV4cGxpY2l0T3JpZ2luYWxUYXJnZXQgfHwgbmF0aXZlRXZlbnQucmVsYXRlZFRhcmdldDtcblxuICAgICAgICBpZiAodGhpcy5pc1BhcnRPZkRpYWxvZyhwcmV2aW91cykgJiYgIXRoaXMuaXNQYXJ0T2ZEaWFsb2cobmF0aXZlRXZlbnQudGFyZ2V0KSkge1xuICAgICAgICAgICAgbmF0aXZlRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHByZXZpb3VzLmZvY3VzKCk7IC8vIHJlc3RvcmUgZm9jdXNcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZUtleURvd24gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZERpYWxvZ0Nsb3NlT25FdmVudCgnY2xvc2VPbkVzY0tleScsIGV2ZW50KSkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucHJvcHMub25DbG9zZSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbktleURvd24pIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25LZXlEb3duKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZUluc2lkZUNsaWNrID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZERpYWxvZ0Nsb3NlT25FdmVudCgnY2xvc2VPbkluc2lkZUNsaWNrJywgZXZlbnQpKSB7XG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnByb3BzLm9uQ2xvc2UsIDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlT3V0c2lkZUNsaWNrID0gKG5hdGl2ZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZERpYWxvZ0Nsb3NlT25FdmVudCgnY2xvc2VPbk91dHNpZGVDbGljaycsIG5hdGl2ZUV2ZW50KSAmJiAhdGhpcy5pc1BhcnRPZkRpYWxvZyhuYXRpdmVFdmVudC50YXJnZXQpKSB7XG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnByb3BzLm9uQ2xvc2UsIDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlT3V0c2lkZVNjcm9sbFdoZWVsID0gKG5hdGl2ZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZERpYWxvZ0Nsb3NlT25FdmVudCgnY2xvc2VPbk91dHNpZGVTY3JvbGwnLCBuYXRpdmVFdmVudCkgJiYgIXRoaXMuaXNQYXJ0T2ZEaWFsb2cobmF0aXZlRXZlbnQudGFyZ2V0KSkge1xuICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQodGhpcy5wcm9wcy5vbkNsb3NlLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlckJvZHkoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgey4uLnRoaXMucHJvcHMuYm9keVByb3BzfVxuICAgICAgICAgICAgICAgIGlkPXt0aGlzLnByb3BzLmJvZHlQcm9wcy5pZCB8fCB0aGlzLnV1aWRCb2R5fVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y3goJ2ItZGlhbG9nLWJvZHknLCB0aGlzLnByb3BzLmJvZHlQcm9wcy5jbGFzc05hbWUpfT5cbiAgICAgICAgICAgICAgICB7dGhpcy5wcm9wcy5jaGlsZHJlbn1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJlbmRlckZvb3RlcigpIHtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuZm9vdGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxmb290ZXJcbiAgICAgICAgICAgICAgICAgICAgey4uLnRoaXMucHJvcHMuZm9vdGVyUHJvcHN9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y3goJ2ItZGlhbG9nLWZvb3RlcicsIHRoaXMucHJvcHMuZm9vdGVyUHJvcHMuY2xhc3NOYW1lKX0+XG4gICAgICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLmZvb3Rlcn1cbiAgICAgICAgICAgICAgICA8L2Zvb3Rlcj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXJIZWFkZXIoKSB7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmhlYWRlcikge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8aGVhZGVyXG4gICAgICAgICAgICAgICAgICAgIHsuLi50aGlzLnByb3BzLmhlYWRlclByb3BzfVxuICAgICAgICAgICAgICAgICAgICBpZD17dGhpcy5wcm9wcy5oZWFkZXJQcm9wcy5pZCB8fCB0aGlzLnV1aWRIZWFkZXJ9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y3goJ2ItZGlhbG9nLWhlYWRlcicsIHRoaXMucHJvcHMuaGVhZGVyUHJvcHMuY2xhc3NOYW1lKX0+XG4gICAgICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLmhlYWRlcn1cbiAgICAgICAgICAgICAgICA8L2hlYWRlcj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXJGb2N1c0JvdW5kYXJ5KCkge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5jYXB0dXJlRm9jdXMpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2Itb2Zmc2NyZWVuJyB0YWJJbmRleD0nMCcgYXJpYS1oaWRkZW49J3RydWUnPiZuYnNwOzwvZGl2PlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH0gLy8gdXNlZCB0byBsb2NrIGZvY3VzIGludG8gYSBwYXJ0aWN1bGFyIHN1YnNldCBvZiBET01cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICB7Li4udGhpcy5wcm9wcy53cmFwcGVyUHJvcHN9XG4gICAgICAgICAgICAgICAgcmVmPXsobm9kZSkgPT4gKHRoaXMuJHdyYXBwZXIgPSBub2RlKX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KCdiLWRpYWxvZy13cmFwcGVyJywgdGhpcy5wcm9wcy53cmFwcGVyUHJvcHMuY2xhc3NOYW1lKX1cbiAgICAgICAgICAgICAgICB0YWJJbmRleD0nMCc+XG4gICAgICAgICAgICAgICAge3RoaXMucmVuZGVyRm9jdXNCb3VuZGFyeSgpfVxuXG4gICAgICAgICAgICAgICAge3RoaXMucHJvcHMuYmVmb3JlfVxuXG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICB7Li4ub21pdCh0aGlzLnByb3BzLCBEaWFsb2cuaW50ZXJuYWxLZXlzKX1cbiAgICAgICAgICAgICAgICAgICAgcmVmPXsobm9kZSkgPT4gKHRoaXMuJGRpYWxvZyA9IG5vZGUpfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KCdiLWRpYWxvZycsIHRoaXMucHJvcHMuY2xhc3NOYW1lKX1cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5oYW5kbGVJbnNpZGVDbGlja31cbiAgICAgICAgICAgICAgICAgICAgb25LZXlEb3duPXt0aGlzLmhhbmRsZUtleURvd259XG4gICAgICAgICAgICAgICAgICAgIHJvbGU9J2RpYWxvZydcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PXt0aGlzLnV1aWRIZWFkZXJ9XG4gICAgICAgICAgICAgICAgICAgIGFyaWEtZGVzY3JpYmVkYnk9e3RoaXMudXVpZEJvZHl9XG4gICAgICAgICAgICAgICAgICAgIHRhYkluZGV4PScwJz5cbiAgICAgICAgICAgICAgICAgICAge3RoaXMucmVuZGVySGVhZGVyKCl9XG4gICAgICAgICAgICAgICAgICAgIHt0aGlzLnJlbmRlckJvZHkoKX1cbiAgICAgICAgICAgICAgICAgICAge3RoaXMucmVuZGVyRm9vdGVyKCl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICB7dGhpcy5wcm9wcy5hZnRlcn1cblxuICAgICAgICAgICAgICAgIHt0aGlzLnJlbmRlckZvY3VzQm91bmRhcnkoKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL2JvdW5kbGVzcy1kaWFsb2cvaW5kZXguanMiXSwic291cmNlUm9vdCI6IiJ9 | ||
module.exports=function(e){function o(t){if(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){if("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== |
@@ -6,3 +6,2 @@ import React, {PropTypes} from 'react'; | ||
import omit from 'boundless-utils-omit-keys'; | ||
import uuid from 'boundless-utils-uuid'; | ||
@@ -14,3 +13,2 @@ const isFunction = (x) => typeof x === 'function'; | ||
/** | ||
# Dialog | ||
__A non-blocking, focus-stealing container.__ | ||
@@ -21,5 +19,3 @@ | ||
Specific areas (header, body, footer) are defined to provide easy conformance to the | ||
[WAI-ARIA spec](http://www.w3.org * /TR/wai-aria/states_and_properties#aria-labelledby) for `aria-labelledby` | ||
and `aria-describedby` (screen reader * accessibility). Their use is optional, but encouraged. | ||
If you decide to provide a header inside your dialog, it's recommended to configure the [`aria-labelledby`](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-labelledby_attribute) attribute, which can be added to `props.dialogProps`. | ||
*/ | ||
@@ -29,2 +25,7 @@ export default class Dialog extends React.PureComponent { | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
'*': PropTypes.any, | ||
/** | ||
* arbitrary content to be rendered after the dialog in the DOM | ||
@@ -40,7 +41,2 @@ */ | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-dialog-body` node | ||
*/ | ||
bodyProps: PropTypes.object, | ||
/** | ||
* determines if focus is allowed to move away from the dialog | ||
@@ -50,4 +46,2 @@ */ | ||
children: PropTypes.node, | ||
/** | ||
@@ -99,30 +93,22 @@ * enable detection of "Escape" keypresses to trigger `props.onClose`; if a function is provided, the return | ||
/** | ||
* text, ReactElements, etc. comprising the "footer" area of the dialog, e.g. confirm/cancel buttons | ||
* override the type of `.b-dialog-wrapper` HTML element | ||
*/ | ||
footer: PropTypes.node, | ||
component: PropTypes.string, | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-dialog-footer` node | ||
* override the type of `.b-dialog` HTML element | ||
*/ | ||
footerProps: PropTypes.object, | ||
dialogComponent: PropTypes.string, | ||
/** | ||
* text, ReactElements, etc. to represent the "title bar" area of the dialog | ||
*/ | ||
header: PropTypes.node, | ||
dialogProps: PropTypes.shape({ | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
'*': PropTypes.any, | ||
}), | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-dialog-header` node | ||
* a custom event handler that is called to indicate that the dialog should be unrendered by its parent; the event occurs if one or more of the "closeOn" props (`closeOnEscKey`, `closeOnOutsideClick`, etc.) are passed as `true` and the dismissal criteria are satisfied | ||
*/ | ||
headerProps: PropTypes.object, | ||
/** | ||
* a custom event handler that is called to indicate that the dialog should be unrendered by its parent; the event occurs if one or more of the `closeOn` props (`closeOnEscKey`, `closeOnOutsideClick`, etc.) are passed as `true` and the dismissal criteria are satisfied | ||
*/ | ||
onClose: PropTypes.func, | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-dialog-wrapper` node | ||
*/ | ||
wrapperProps: PropTypes.object, | ||
} | ||
@@ -133,3 +119,2 @@ | ||
before: null, | ||
bodyProps: {}, | ||
captureFocus: true, | ||
@@ -142,9 +127,7 @@ children: null, | ||
closeOnOutsideScroll: false, | ||
footer: null, | ||
footerProps: {}, | ||
header: null, | ||
headerProps: {}, | ||
component: 'div', | ||
dialogComponent: 'div', | ||
dialogProps: {}, | ||
onClose: noop, | ||
onKeyDown: noop, | ||
wrapperProps: {}, | ||
} | ||
@@ -156,6 +139,2 @@ | ||
// fallbacks if one isn't passed | ||
uuidHeader = uuid() | ||
uuidBody = uuid() | ||
isPartOfDialog(node) { | ||
@@ -247,38 +226,2 @@ if (!node || node === window) { return false; } | ||
renderBody() { | ||
return ( | ||
<div | ||
{...this.props.bodyProps} | ||
id={this.props.bodyProps.id || this.uuidBody} | ||
className={cx('b-dialog-body', this.props.bodyProps.className)}> | ||
{this.props.children} | ||
</div> | ||
); | ||
} | ||
renderFooter() { | ||
if (this.props.footer) { | ||
return ( | ||
<footer | ||
{...this.props.footerProps} | ||
className={cx('b-dialog-footer', this.props.footerProps.className)}> | ||
{this.props.footer} | ||
</footer> | ||
); | ||
} | ||
} | ||
renderHeader() { | ||
if (this.props.header) { | ||
return ( | ||
<header | ||
{...this.props.headerProps} | ||
id={this.props.headerProps.id || this.uuidHeader} | ||
className={cx('b-dialog-header', this.props.headerProps.className)}> | ||
{this.props.header} | ||
</header> | ||
); | ||
} | ||
} | ||
renderFocusBoundary() { | ||
@@ -294,7 +237,6 @@ if (this.props.captureFocus) { | ||
return ( | ||
<div | ||
{...this.props.wrapperProps} | ||
<this.props.component | ||
{...omit(this.props, Dialog.internalKeys)} | ||
ref={(node) => (this.$wrapper = node)} | ||
className={cx('b-dialog-wrapper', this.props.wrapperProps.className)} | ||
tabIndex='0'> | ||
className={cx('b-dialog-wrapper', this.props.className)}> | ||
{this.renderFocusBoundary()} | ||
@@ -304,16 +246,12 @@ | ||
<div | ||
{...omit(this.props, Dialog.internalKeys)} | ||
<this.props.dialogComponent | ||
{...this.dialogProps} | ||
ref={(node) => (this.$dialog = node)} | ||
className={cx('b-dialog', this.props.className)} | ||
className={cx('b-dialog', this.props.dialogProps.className)} | ||
onClick={this.handleInsideClick} | ||
onKeyDown={this.handleKeyDown} | ||
role='dialog' | ||
aria-labelledby={this.uuidHeader} | ||
aria-describedby={this.uuidBody} | ||
tabIndex='0'> | ||
{this.renderHeader()} | ||
{this.renderBody()} | ||
{this.renderFooter()} | ||
</div> | ||
{this.props.children} | ||
</this.props.dialogComponent> | ||
@@ -323,5 +261,5 @@ {this.props.after} | ||
{this.renderFocusBoundary()} | ||
</div> | ||
</this.props.component> | ||
); | ||
} | ||
} |
{ | ||
"name": "boundless-dialog", | ||
"version": "1.0.0-beta.5", | ||
"version": "1.0.0-beta.7", | ||
"description": "A non-blocking, focus-stealing container.", | ||
@@ -27,5 +27,4 @@ "main": "build/index.js", | ||
"dependencies": { | ||
"boundless-portal": "^1.0.0-beta.5", | ||
"boundless-utils-omit-keys": "^1.0.0-beta.5", | ||
"boundless-utils-uuid": "^1.0.0-beta.5", | ||
"boundless-portal": "^1.0.0-beta.7", | ||
"boundless-utils-omit-keys": "^1.0.0-beta.7", | ||
"classnames": "^2.1.5" | ||
@@ -32,0 +31,0 @@ }, |
@@ -0,4 +1,6 @@ | ||
<!--- | ||
THIS IS AN AUTOGENERATED FILE. EDIT INDEX.JS INSTEAD. | ||
--> | ||
# Dialog | ||
# Dialog | ||
__A non-blocking, focus-stealing container.__ | ||
@@ -9,9 +11,72 @@ | ||
Specific areas (header, body, footer) are defined to provide easy conformance to the | ||
[WAI-ARIA spec](http://www.w3.org * /TR/wai-aria/states_and_properties#aria-labelledby) for `aria-labelledby` | ||
and `aria-describedby` (screen reader * accessibility). Their use is optional, but encouraged. | ||
If you decide to provide a header inside your dialog, it's recommended to configure the [`aria-labelledby`](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-labelledby_attribute) attribute, which can be added to `props.dialogProps`. | ||
## Example Usage | ||
```jsx | ||
import React from 'react'; | ||
import {findDOMNode} from 'react-dom'; | ||
import Button from '../../boundless-button/index'; | ||
import Dialog from '../index'; | ||
export default class DialogDemo extends React.PureComponent { | ||
state = { | ||
showDialog: false, | ||
} | ||
componentDidMount() { | ||
const node = findDOMNode(this.refs.trigger); | ||
this.setState({ | ||
leftPosition: node.offsetLeft + node.offsetWidth + 10 + 'px', | ||
topPosition: node.offsetTop + 'px', | ||
}); | ||
} | ||
toggleDialog = () => { | ||
this.setState({showDialog: !this.state.showDialog}); | ||
} | ||
renderDialog() { | ||
if (this.state.showDialog) { | ||
return ( | ||
<Dialog | ||
closeOnEscKey={true} | ||
closeOnOutsideClick={true} | ||
onClose={this.toggleDialog} | ||
style={{ | ||
left: this.state.leftPosition, | ||
top: this.state.topPosition, | ||
}}> | ||
<iframe | ||
className='dialog-demo-video-frame' | ||
width='560' | ||
height='315' | ||
src='https://www.youtube.com/embed/HEheh1BH34Q?autoplay=1&showinfo=0&autohide=1' | ||
frameBorder='0' | ||
allowFullScreen /> | ||
<Button | ||
className='dialog-demo-close-button' | ||
title='Close' | ||
onPressed={this.toggleDialog} /> | ||
</Dialog> | ||
); | ||
} | ||
} | ||
render() { | ||
return ( | ||
<div> | ||
<Button ref='trigger' onPressed={this.toggleDialog}>Launch Video</Button> | ||
{this.renderDialog()} | ||
</div> | ||
); | ||
} | ||
} | ||
``` | ||
## Props | ||
_Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/Dialog#props)._ | ||
> Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/Dialog#props). | ||
@@ -25,129 +90,101 @@ ### Required Props | ||
<table> | ||
<tr> | ||
<th>Name</th> | ||
<th>Type</th> | ||
<th>Default Value</th> | ||
<th>Description</th> | ||
</tr> | ||
- __`*`__ ・ any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
<tr> | ||
<td>after</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>arbitrary content to be rendered after the dialog in the DOM</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any` | `n/a` | ||
<tr> | ||
<td>before</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>arbitrary content to be rendered before the dialog in the DOM</td> | ||
</tr> | ||
- __`after`__ ・ arbitrary content to be rendered after the dialog in the DOM | ||
<tr> | ||
<td>bodyProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-dialog-body` node</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any renderable` | `null` | ||
<tr> | ||
<td>captureFocus</td> | ||
<td><pre><code>bool</code></pre></td> | ||
<td><pre><code class="language-js">true</code></pre></td> | ||
<td>determines if focus is allowed to move away from the dialog</td> | ||
</tr> | ||
- __`before`__ ・ arbitrary content to be rendered before the dialog in the DOM | ||
<tr> | ||
<td>children</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td></td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any renderable` | `null` | ||
<tr> | ||
<td>closeOnEscKey</td> | ||
<td><pre><code>bool or function</code></pre></td> | ||
<td><pre><code class="language-js">false</code></pre></td> | ||
<td>enable detection of "Escape" keypresses to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed</td> | ||
</tr> | ||
- __`captureFocus`__ ・ determines if focus is allowed to move away from the dialog | ||
<tr> | ||
<td>closeOnInsideClick</td> | ||
<td><pre><code>bool or function</code></pre></td> | ||
<td><pre><code class="language-js">false</code></pre></td> | ||
<td>enable detection of clicks inside the dialog area to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`bool` | `true` | ||
<tr> | ||
<td>closeOnOutsideClick</td> | ||
<td><pre><code>bool or function</code></pre></td> | ||
<td><pre><code class="language-js">false</code></pre></td> | ||
<td>enable detection of clicks outside the dialog area to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed</td> | ||
</tr> | ||
- __`closeOnEscKey`__ ・ enable detection of "Escape" keypresses to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed | ||
<tr> | ||
<td>closeOnOutsideFocus</td> | ||
<td><pre><code>bool or function</code></pre></td> | ||
<td><pre><code class="language-js">false</code></pre></td> | ||
<td>enable detection of focus outside the dialog area to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`bool or function` | `false` | ||
<tr> | ||
<td>closeOnOutsideScroll</td> | ||
<td><pre><code>bool or function</code></pre></td> | ||
<td><pre><code class="language-js">false</code></pre></td> | ||
<td>enable detection of scroll and mousewheel events outside the dialog area to trigger `props.onClose`; if a functio | ||
is provided, the return value determines if the dialog will be closed</td> | ||
</tr> | ||
- __`closeOnInsideClick`__ ・ enable detection of clicks inside the dialog area to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed | ||
<tr> | ||
<td>footer</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>text, ReactElements, etc. comprising the "footer" area of the dialog, e.g. confirm/cancel buttons</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`bool or function` | `false` | ||
<tr> | ||
<td>footerProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-dialog-footer` node</td> | ||
</tr> | ||
- __`closeOnOutsideClick`__ ・ enable detection of clicks outside the dialog area to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed | ||
<tr> | ||
<td>header</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>text, ReactElements, etc. to represent the "title bar" area of the dialog</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`bool or function` | `false` | ||
<tr> | ||
<td>headerProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-dialog-header` node</td> | ||
</tr> | ||
- __`closeOnOutsideFocus`__ ・ enable detection of focus outside the dialog area to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed | ||
<tr> | ||
<td>onClose</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">() => {}</code></pre></td> | ||
<td>a custom event handler that is called to indicate that the dialog should be unrendered by its parent; the event occurs if one or more of the `closeOn` props (`closeOnEscKey`, `closeOnOutsideClick`, etc.) are passed as `true` and the dismissal criteria are satisfied</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`bool or function` | `false` | ||
<tr> | ||
<td>wrapperProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-dialog-wrapper` node</td> | ||
</tr> | ||
- __`closeOnOutsideScroll`__ ・ enable detection of scroll and mousewheel events outside the dialog area to trigger `props.onClose`; if a functio | ||
is provided, the return value determines if the dialog will be closed | ||
</table> | ||
Expects | Default Value | ||
- | - | ||
`bool or function` | `false` | ||
- __`component`__ ・ override the type of `.b-dialog-wrapper` HTML element | ||
Expects | Default Value | ||
- | - | ||
`string` | `'div'` | ||
- __`dialogComponent`__ ・ override the type of `.b-dialog` HTML element | ||
Expects | Default Value | ||
- | - | ||
`string` | `'div'` | ||
- __`dialogProps`__ | ||
Expects | Default Value | ||
- | - | ||
`object` | `{}` | ||
- __`onClose`__ ・ a custom event handler that is called to indicate that the dialog should be unrendered by its parent; the event occurs if one or more of the "closeOn" props (`closeOnEscKey`, `closeOnOutsideClick`, etc.) are passed as `true` and the dismissal criteria are satisfied | ||
Expects | Default Value | ||
- | - | ||
`function` | `() => {}` | ||
## Reference Styles | ||
### Stylus | ||
```stylus | ||
// Bring in Boundless's base Stylus variables | ||
@require "node_modules/boundless-dialog/variables" | ||
// Redefine any variables as desired, e.g. | ||
color-accent = royalblue | ||
// Bring in the component styles; they will be autoconfigured based on the above | ||
@require "node_modules/boundless-dialog/style" | ||
``` | ||
### CSS | ||
If desired, a precompiled plain CSS stylesheet is available for customization at `/build/style.css`, based on Boundless's [default variables](https://github.com/enigma-io/boundless/blob/master/variables.styl). | ||
@@ -1,2 +0,2 @@ | ||
module.exports=function(e){function t(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,o){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:o})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=4)}([function(e,t,n){"use strict";function o(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Object.keys(e).reduce(function(n,o){return t.indexOf(o)===-1&&(n[o]=e[o]),n},{})}t.a=o},function(e,t){e.exports=require("classnames")},function(e,t){e.exports=require("react")},function(e,t){e.exports=require("react-dom")},function(e,t,n){"use strict";function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function u(e){return parseInt(e,10)}function p(e){var t=n.i(d.findDOMNode)(e),o=window.getComputedStyle(t.parentNode),r=u(window.getComputedStyle(t).fontSize),i=u(o.height),p=u(o.width);"border-box"!==o.boxSizing&&"padding-box"!==o.boxSizing||(i-=u(o.paddingTop)+u(o.paddingBottom),p-=u(o.paddingLeft)+u(o.paddingRight));var a=Math.floor(r/t.offsetHeight*i),c=Math.floor(r/t.offsetWidth*p);t.style.fontSize=(Math.min(e.props.maxFontSize,a,c)||1)+"px"}function a(){v.forEach(function(e){return p(e)})}function c(e){0===v.length&&window.addEventListener("resize",a,!0),v.push(e)}function s(e){v.splice(v.indexOf(e),1),0===v.length&&window.removeEventListener("resize",a,!0)}Object.defineProperty(t,"__esModule",{value:!0});var f=n(2),l=n.n(f),d=n(3),y=(n.n(d),n(1)),h=n.n(y),b=n(0),m=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},g=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,n,o){return n&&e(t.prototype,n),o&&e(t,o),t}}(),v=[],x=function(e){function t(){return o(this,t),r(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return i(t,e),g(t,[{key:"componentDidMount",value:function(){p(this),c(this)}},{key:"componentDidUpdate",value:function(){p(this)}},{key:"componentWillUnmount",value:function(){s(this)}},{key:"render",value:function(){return l.a.createElement(this.props.component,m({},n.i(b.a)(this.props,t.internalKeys),{className:h()("b-text",this.props.className)}),this.props.children)}}]),t}(l.a.PureComponent);x.propTypes={component:f.PropTypes.oneOfType([f.PropTypes.string,f.PropTypes.func]),maxFontSize:f.PropTypes.number},x.defaultProps={component:"span",maxFontSize:Number.MAX_VALUE},x.internalKeys=Object.keys(x.defaultProps),t.default=x}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIDMzYTZjYzcwMTRjMTI3MjdlZjY0Iiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiY2xhc3NuYW1lc1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdFwifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdC1kb21cIn0iLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvYm91bmRsZXNzLWZpdHRlZC10ZXh0L2luZGV4LmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJtb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiaW5zdGFsbGVkTW9kdWxlcyIsImkiLCJsIiwiY2FsbCIsIm0iLCJjIiwidmFsdWUiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJnZXQiLCJuIiwiX19lc01vZHVsZSIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsIl9fd2VicGFja19leHBvcnRzX18iLCJvbWl0S2V5c0Zyb21Tb3VyY2VPYmplY3QiLCJzb3VyY2UiLCJvbWl0dGVkS2V5cyIsImFyZ3VtZW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsImtleXMiLCJyZWR1Y2UiLCJoYXNoIiwia2V5IiwiaW5kZXhPZiIsInJlcXVpcmUiLCJfY2xhc3NDYWxsQ2hlY2siLCJpbnN0YW5jZSIsIkNvbnN0cnVjdG9yIiwiVHlwZUVycm9yIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJzZWxmIiwiUmVmZXJlbmNlRXJyb3IiLCJfaW5oZXJpdHMiLCJzdWJDbGFzcyIsInN1cGVyQ2xhc3MiLCJjcmVhdGUiLCJjb25zdHJ1Y3RvciIsIndyaXRhYmxlIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJ0b0kiLCJzdHJpbmdOdW1iZXIiLCJwYXJzZUludCIsInJlc2NhbGUiLCJub2RlIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX3JlYWN0X2RvbV9fIiwiY29udGFpbmVyQm94Iiwid2luZG93IiwiZ2V0Q29tcHV0ZWRTdHlsZSIsInBhcmVudE5vZGUiLCJmb250U2l6ZSIsImNvbnRhaW5lckhlaWdodCIsImhlaWdodCIsImNvbnRhaW5lcldpZHRoIiwid2lkdGgiLCJib3hTaXppbmciLCJwYWRkaW5nVG9wIiwicGFkZGluZ0JvdHRvbSIsInBhZGRpbmdMZWZ0IiwicGFkZGluZ1JpZ2h0Iiwib3B0aW1pemVGb3JIZWlnaHQiLCJNYXRoIiwiZmxvb3IiLCJvZmZzZXRIZWlnaHQiLCJvcHRpbWl6ZUZvcldpZHRoIiwib2Zmc2V0V2lkdGgiLCJzdHlsZSIsIm1pbiIsInByb3BzIiwibWF4Rm9udFNpemUiLCJoYW5kbGVXaW5kb3dSZXNpemUiLCJpbnN0YW5jZXMiLCJmb3JFYWNoIiwicmVnaXN0ZXJJbnN0YW5jZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJwdXNoIiwidW5yZWdpc3Rlckluc3RhbmNlIiwic3BsaWNlIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9jbGFzc25hbWVzX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfY2xhc3NuYW1lc19fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fIiwiX2V4dGVuZHMiLCJhc3NpZ24iLCJ0YXJnZXQiLCJfY3JlYXRlQ2xhc3MiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVzY3JpcHRvciIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsIkZpdHRlZFRleHQiLCJfUmVhY3QkUHVyZUNvbXBvbmVudCIsInRoaXMiLCJnZXRQcm90b3R5cGVPZiIsImFwcGx5IiwiYSIsImNyZWF0ZUVsZW1lbnQiLCJjb21wb25lbnQiLCJpbnRlcm5hbEtleXMiLCJjbGFzc05hbWUiLCJjaGlsZHJlbiIsIlB1cmVDb21wb25lbnQiLCJwcm9wVHlwZXMiLCJvbmVPZlR5cGUiLCJzdHJpbmciLCJmdW5jIiwibnVtYmVyIiwiZGVmYXVsdFByb3BzIiwiTnVtYmVyIiwiTUFYX1ZBTFVFIl0sIm1hcHBpbmdzIjoiQUFBQUEsT0FBT0MsUUFDRSxTQUFVQyxHQ0duQixRQUFBQyxHQUFBQyxHQUdBLEdBQUFDLEVBQUFELEdBQ0EsTUFBQUMsR0FBQUQsR0FBQUgsT0FHQSxJQUFBRCxHQUFBSyxFQUFBRCxJQUNBRSxFQUFBRixFQUNBRyxHQUFBLEVBQ0FOLFdBVUEsT0FOQUMsR0FBQUUsR0FBQUksS0FBQVIsRUFBQUMsUUFBQUQsSUFBQUMsUUFBQUUsR0FHQUgsRUFBQU8sR0FBQSxFQUdBUCxFQUFBQyxRQXZCQSxHQUFBSSxLQStEQSxPQW5DQUYsR0FBQU0sRUFBQVAsRUFHQUMsRUFBQU8sRUFBQUwsRUFHQUYsRUFBQUcsRUFBQSxTQUFBSyxHQUEyQyxNQUFBQSxJQUczQ1IsRUFBQVMsRUFBQSxTQUFBWCxFQUFBWSxFQUFBQyxHQUNBWCxFQUFBWSxFQUFBZCxFQUFBWSxJQUNBRyxPQUFBQyxlQUFBaEIsRUFBQVksR0FDQUssY0FBQSxFQUNBQyxZQUFBLEVBQ0FDLElBQUFOLEtBTUFYLEVBQUFrQixFQUFBLFNBQUFyQixHQUNBLEdBQUFjLEdBQUFkLEtBQUFzQixXQUNBLFdBQTJCLE1BQUF0QixHQUFBLFNBQzNCLFdBQWlDLE1BQUFBLEdBRWpDLE9BREFHLEdBQUFTLEVBQUFFLEVBQUEsSUFBQUEsR0FDQUEsR0FJQVgsRUFBQVksRUFBQSxTQUFBUSxFQUFBQyxHQUFzRCxNQUFBUixRQUFBUyxVQUFBQyxlQUFBbEIsS0FBQWUsRUFBQUMsSUFHdERyQixFQUFBd0IsRUFBQSxHQUdBeEIsSUFBQXlCLEVBQUEsS0RPTSxTQUFVNUIsRUFBUTZCLEVBQXFCMUIsR0FFN0MsWUV0RWUsU0FBUzJCLEdBQXlCQyxHQUEwQixHQUFsQkMsR0FBa0JDLFVBQUFDLE9BQUEsR0FBQUMsU0FBQUYsVUFBQSxHQUFBQSxVQUFBLEtBQ3ZFLE9BQU9qQixRQUFPb0IsS0FBS0wsR0FBUU0sT0FBTyxTQUE4QkMsRUFBTUMsR0FLbEUsTUFKSVAsR0FBWVEsUUFBUUQsTUFBUyxJQUM3QkQsRUFBS0MsR0FBT1IsRUFBT1EsSUFHaEJELE9GaUVrQlQsRUFBdUIsRUFBSUMsR0FLdEQsU0FBVTlCLEVBQVFDLEdHL0V4QkQsRUFBQUMsUUFBQXdDLFFBQUEsZUhxRk0sU0FBVXpDLEVBQVFDLEdJckZ4QkQsRUFBQUMsUUFBQXdDLFFBQUEsVUoyRk0sU0FBVXpDLEVBQVFDLEdLM0Z4QkQsRUFBQUMsUUFBQXdDLFFBQUEsY0xpR00sU0FBVXpDLEVBQVE2QixFQUFxQjFCLEdBRTdDLFlBUzh0QixTQUFTdUMsR0FBZ0JDLEVBQVNDLEdBQWEsS0FBS0QsWUFBb0JDLElBQWMsS0FBTSxJQUFJQyxXQUFVLHFDQUF1QyxRQUFTQyxHQUEyQkMsRUFBS3ZDLEdBQU0sSUFBSXVDLEVBQU0sS0FBTSxJQUFJQyxnQkFBZSw0REFBOEQsUUFBT3hDLEdBQXFCLGdCQUFQQSxJQUErQixrQkFBUEEsR0FBd0J1QyxFQUFMdkMsRUFBVyxRQUFTeUMsR0FBVUMsRUFBU0MsR0FBWSxHQUF1QixrQkFBYkEsSUFBc0MsT0FBYkEsRUFBbUIsS0FBTSxJQUFJTixXQUFVLGlFQUFrRU0sR0FBYUQsR0FBU3pCLFVBQVVULE9BQU9vQyxPQUFPRCxHQUFZQSxFQUFXMUIsV0FBVzRCLGFBQWExQyxNQUFNdUMsRUFBUy9CLFlBQVcsRUFBTW1DLFVBQVMsRUFBS3BDLGNBQWEsS0FBV2lDLElBQVduQyxPQUFPdUMsZUFBZXZDLE9BQU91QyxlQUFlTCxFQUFTQyxHQUFZRCxFQUFTTSxVQUFVTCxHTXBHaGdELFFBQVNNLEdBQUlDLEdBQ1QsTUFBT0MsVUFBU0QsRUFBYyxJQUdsQyxRQUFTRSxHQUFRakIsR0FDYixHQUFNa0IsR0FBTzFELEVBQUFHLEVBQUF3RCxFQUFBLGFBQVluQixHQUNuQm9CLEVBQWVDLE9BQU9DLGlCQUFpQkosRUFBS0ssWUFDNUNDLEVBQVdWLEVBQUlPLE9BQU9DLGlCQUFpQkosR0FBTU0sVUFFL0NDLEVBQWtCWCxFQUFJTSxFQUFhTSxRQUNuQ0MsRUFBaUJiLEVBQUlNLEVBQWFRLE1BR1AsZ0JBQTNCUixFQUFhUyxXQUF5RCxnQkFBM0JULEVBQWFTLFlBQ3hESixHQUFtQlgsRUFBSU0sRUFBYVUsWUFBY2hCLEVBQUlNLEVBQWFXLGVBQ25FSixHQUFrQmIsRUFBSU0sRUFBYVksYUFBZWxCLEVBQUlNLEVBQWFhLGNBR3ZFLElBQU1DLEdBQW9CQyxLQUFLQyxNQUFPWixFQUFXTixFQUFLbUIsYUFBZ0JaLEdBQ2hFYSxFQUFtQkgsS0FBS0MsTUFBT1osRUFBV04sRUFBS3FCLFlBQWVaLEVBR3BFVCxHQUFLc0IsTUFBTWhCLFVBQVlXLEtBQUtNLElBQUl6QyxFQUFTMEMsTUFBTUMsWUFBYVQsRUFBbUJJLElBQXFCLEdBQUssS0FHN0csUUFBU00sS0FDTEMsRUFBVUMsUUFBUSxTQUFDOUMsR0FBRCxNQUFjaUIsR0FBUWpCLEtBRzVDLFFBQVMrQyxHQUFpQi9DLEdBQ0csSUFBckI2QyxFQUFVdEQsUUFDVjhCLE9BQU8yQixpQkFBaUIsU0FBVUosR0FBb0IsR0FHMURDLEVBQVVJLEtBQUtqRCxHQUduQixRQUFTa0QsR0FBbUJsRCxHQUN4QjZDLEVBQVVNLE9BQU9OLEVBQVVoRCxRQUFRRyxHQUFXLEdBRXJCLElBQXJCNkMsRUFBVXRELFFBQ1Y4QixPQUFPK0Isb0JBQW9CLFNBQVVSLEdBQW9CLEdObURqRXZFLE9BQU9DLGVBQWVZLEVBQXFCLGNBQWdCbEIsT0FBTyxHQUM3QyxJQUFJcUYsR0FBc0M3RixFQUFvQixHQUMxRDhGLEVBQThDOUYsRUFBb0JrQixFQUFFMkUsR0FDcEVsQyxFQUEwQzNELEVBQW9CLEdBRTlEK0YsR0FEa0QvRixFQUFvQmtCLEVBQUV5QyxHQUM3QjNELEVBQW9CLElBQy9EZ0csRUFBbURoRyxFQUFvQmtCLEVBQUU2RSxHQUN6RUUsRUFBMERqRyxFQUFvQixHQUNuR2tHLEVBQVNyRixPQUFPc0YsUUFBUSxTQUFTQyxHQUFRLElBQUksR0FBSWpHLEdBQUUsRUFBRUEsRUFBRTJCLFVBQVVDLE9BQU81QixJQUFJLENBQUMsR0FBSXlCLEdBQU9FLFVBQVUzQixFQUFHLEtBQUksR0FBSWlDLEtBQU9SLEdBQVdmLE9BQU9TLFVBQVVDLGVBQWVsQixLQUFLdUIsRUFBT1EsS0FBTWdFLEVBQU9oRSxHQUFLUixFQUFPUSxJQUFRLE1BQU9nRSxJQUFhQyxFQUFhLFdBQVcsUUFBU0MsR0FBaUJGLEVBQU9sQixHQUFPLElBQUksR0FBSS9FLEdBQUUsRUFBRUEsRUFBRStFLEVBQU1uRCxPQUFPNUIsSUFBSSxDQUFDLEdBQUlvRyxHQUFXckIsRUFBTS9FLEVBQUdvRyxHQUFXdkYsV0FBV3VGLEVBQVd2RixhQUFZLEVBQU11RixFQUFXeEYsY0FBYSxFQUFRLFNBQVV3RixLQUFXQSxFQUFXcEQsVUFBUyxHQUFLdEMsT0FBT0MsZUFBZXNGLEVBQU9HLEVBQVduRSxJQUFJbUUsSUFBYyxNQUFPLFVBQVM5RCxFQUFZK0QsRUFBV0MsR0FBdUksTUFBdkhELElBQVdGLEVBQWlCN0QsRUFBWW5CLFVBQVVrRixHQUFlQyxHQUFZSCxFQUFpQjdELEVBQVlnRSxHQUFvQmhFLE1NdEd0c0I0QyxLQXFEZXFCLEVOaUR1eUYsU0FBU0MsR0FBaUUsUUFBU0QsS0FBOEMsTUFBakNuRSxHQUFnQnFFLEtBQUtGLEdBQW1CL0QsRUFBMkJpRSxNQUFNRixFQUFXckQsV0FBV3hDLE9BQU9nRyxlQUFlSCxJQUFhSSxNQUFNRixLQUFLOUUsWUFBZ3NCLE1BQTk0QmdCLEdBQVU0RCxFQUFXQyxHQUFzTU4sRUFBYUssSUFBYXRFLElBQUksb0JBQW9CNUIsTUFBTSxXTXpCdG1HaUQsRUFBUW1ELE1BSVJyQixFQUFpQnFCLFNOcUIycEd4RSxJQUFJLHFCQUFxQjVCLE1BQU0sV01qQjNzR2lELEVBQVFtRCxTTmlCbXZHeEUsSUFBSSx1QkFBdUI1QixNQUFNLFdNYjV4R2tGLEVBQW1Ca0IsU05hczBHeEUsSUFBSSxTQUFTNUIsTUFBTSxXTVQ1MkcsTUFDSXNGLEdBQUFpQixFQUFBQyxjQUFBSixLQUFNMUIsTUFBTStCLFVBQVpmLEtBQ1FsRyxFQUFBRyxFQUFBOEYsRUFBQSxHQUFLVyxLQUFLMUIsTUFBT3dCLEVBQVdRLGVBQ2hDQyxVQUFXbkIsSUFBRyxTQUFVWSxLQUFLMUIsTUFBTWlDLGFBQ2xDUCxLQUFLMUIsTUFBTWtDLGNOS290SFYsR01qRHhzSFosRUFBQWlCLEVBQU1NLGNBQXpCWCxHQUNWWSxXQUlITCxVQUFXcEIsRUFBQSxVQUFVMEIsV0FDakIxQixFQUFBLFVBQVUyQixPQUNWM0IsRUFBQSxVQUFVNEIsT0FNZHRDLFlBQWFVLEVBQUEsVUFBVTZCLFFBYlZoQixFQWdCVmlCLGNBQ0hWLFVBQVcsT0FDWDlCLFlBQWF5QyxPQUFPQyxXQWxCUG5CLEVBcUJWUSxhQUFlckcsT0FBT29CLEtBQUt5RSxFQUFXaUIsY040QjRySWpHLEVBQTZCLFFNakRydklnRiIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbi8qKioqKiovIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbi8qKioqKiovIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA0KTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGV4cG9ydCAoaW1tdXRhYmxlKSAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IG9taXRLZXlzRnJvbVNvdXJjZU9iamVjdDtcbmZ1bmN0aW9uIG9taXRLZXlzRnJvbVNvdXJjZU9iamVjdChzb3VyY2Upe3ZhciBvbWl0dGVkS2V5cz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMV06W107cmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIHJlbG9jYXRlQWNjZXB0ZWRLZXlzKGhhc2gsa2V5KXtpZihvbWl0dGVkS2V5cy5pbmRleE9mKGtleSk9PT0tMSl7aGFzaFtrZXldPXNvdXJjZVtrZXldO31yZXR1cm4gaGFzaDt9LHt9KTt9XG5cbi8qKiovIH0pLFxuLyogMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpO1xuXG4vKioqLyB9KSxcbi8qIDIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cbi8qKiovIH0pLFxuLyogMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdC1kb21cIik7XG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShfX3dlYnBhY2tfZXhwb3J0c19fLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX3JlYWN0X2RvbV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfcmVhY3RfZG9tX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfcmVhY3RfZG9tX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9jbGFzc25hbWVzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9jbGFzc25hbWVzX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfY2xhc3NuYW1lc19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbnZhciBfZXh0ZW5kcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0YXJnZXQpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9YXJndW1lbnRzW2ldO2Zvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSxrZXkpKXt0YXJnZXRba2V5XT1zb3VyY2Vba2V5XTt9fX1yZXR1cm4gdGFyZ2V0O307dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoXCJ2YWx1ZVwiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKTt9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcjt9O30oKTtmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7fX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLGNhbGwpe2lmKCFzZWxmKXt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7fXJldHVybiBjYWxsJiYodHlwZW9mIGNhbGw9PT1cIm9iamVjdFwifHx0eXBlb2YgY2FsbD09PVwiZnVuY3Rpb25cIik/Y2FsbDpzZWxmO31mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT1cImZ1bmN0aW9uXCImJnN1cGVyQ2xhc3MhPT1udWxsKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2Ygc3VwZXJDbGFzcyk7fXN1YkNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MmJnN1cGVyQ2xhc3MucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6c3ViQ2xhc3MsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfX0pO2lmKHN1cGVyQ2xhc3MpT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcyxzdXBlckNsYXNzKTpzdWJDbGFzcy5fX3Byb3RvX189c3VwZXJDbGFzczt9dmFyIGluc3RhbmNlcz1bXTtmdW5jdGlvbiB0b0koc3RyaW5nTnVtYmVyKXtyZXR1cm4gcGFyc2VJbnQoc3RyaW5nTnVtYmVyLDEwKTt9ZnVuY3Rpb24gcmVzY2FsZShpbnN0YW5jZSl7dmFyIG5vZGU9X193ZWJwYWNrX3JlcXVpcmVfXy5pKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9kb21fX1tcImZpbmRET01Ob2RlXCJdKShpbnN0YW5jZSk7dmFyIGNvbnRhaW5lckJveD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLnBhcmVudE5vZGUpO3ZhciBmb250U2l6ZT10b0kod2luZG93LmdldENvbXB1dGVkU3R5bGUobm9kZSkuZm9udFNpemUpO3ZhciBjb250YWluZXJIZWlnaHQ9dG9JKGNvbnRhaW5lckJveC5oZWlnaHQpO3ZhciBjb250YWluZXJXaWR0aD10b0koY29udGFpbmVyQm94LndpZHRoKTtpZihjb250YWluZXJCb3guYm94U2l6aW5nPT09J2JvcmRlci1ib3gnfHxjb250YWluZXJCb3guYm94U2l6aW5nPT09J3BhZGRpbmctYm94Jyl7Y29udGFpbmVySGVpZ2h0LT10b0koY29udGFpbmVyQm94LnBhZGRpbmdUb3ApK3RvSShjb250YWluZXJCb3gucGFkZGluZ0JvdHRvbSk7Y29udGFpbmVyV2lkdGgtPXRvSShjb250YWluZXJCb3gucGFkZGluZ0xlZnQpK3RvSShjb250YWluZXJCb3gucGFkZGluZ1JpZ2h0KTt9dmFyIG9wdGltaXplRm9ySGVpZ2h0PU1hdGguZmxvb3IoZm9udFNpemUvbm9kZS5vZmZzZXRIZWlnaHQqY29udGFpbmVySGVpZ2h0KTt2YXIgb3B0aW1pemVGb3JXaWR0aD1NYXRoLmZsb29yKGZvbnRTaXplL25vZGUub2Zmc2V0V2lkdGgqY29udGFpbmVyV2lkdGgpO25vZGUuc3R5bGUuZm9udFNpemU9KE1hdGgubWluKGluc3RhbmNlLnByb3BzLm1heEZvbnRTaXplLG9wdGltaXplRm9ySGVpZ2h0LG9wdGltaXplRm9yV2lkdGgpfHwxKSsncHgnO31mdW5jdGlvbiBoYW5kbGVXaW5kb3dSZXNpemUoKXtpbnN0YW5jZXMuZm9yRWFjaChmdW5jdGlvbihpbnN0YW5jZSl7cmV0dXJuIHJlc2NhbGUoaW5zdGFuY2UpO30pO31mdW5jdGlvbiByZWdpc3Rlckluc3RhbmNlKGluc3RhbmNlKXtpZihpbnN0YW5jZXMubGVuZ3RoPT09MCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsaGFuZGxlV2luZG93UmVzaXplLHRydWUpO31pbnN0YW5jZXMucHVzaChpbnN0YW5jZSk7fWZ1bmN0aW9uIHVucmVnaXN0ZXJJbnN0YW5jZShpbnN0YW5jZSl7aW5zdGFuY2VzLnNwbGljZShpbnN0YW5jZXMuaW5kZXhPZihpbnN0YW5jZSksMSk7aWYoaW5zdGFuY2VzLmxlbmd0aD09PTApe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLGhhbmRsZVdpbmRvd1Jlc2l6ZSx0cnVlKTt9fXZhciBGaXR0ZWRUZXh0PWZ1bmN0aW9uKF9SZWFjdCRQdXJlQ29tcG9uZW50KXtfaW5oZXJpdHMoRml0dGVkVGV4dCxfUmVhY3QkUHVyZUNvbXBvbmVudCk7ZnVuY3Rpb24gRml0dGVkVGV4dCgpe19jbGFzc0NhbGxDaGVjayh0aGlzLEZpdHRlZFRleHQpO3JldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLChGaXR0ZWRUZXh0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKEZpdHRlZFRleHQpKS5hcHBseSh0aGlzLGFyZ3VtZW50cykpO31fY3JlYXRlQ2xhc3MoRml0dGVkVGV4dCxbe2tleTonY29tcG9uZW50RGlkTW91bnQnLHZhbHVlOmZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCl7cmVzY2FsZSh0aGlzKTtyZWdpc3Rlckluc3RhbmNlKHRoaXMpO319LHtrZXk6J2NvbXBvbmVudERpZFVwZGF0ZScsdmFsdWU6ZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCl7cmVzY2FsZSh0aGlzKTt9fSx7a2V5Oidjb21wb25lbnRXaWxsVW5tb3VudCcsdmFsdWU6ZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKXt1bnJlZ2lzdGVySW5zdGFuY2UodGhpcyk7fX0se2tleToncmVuZGVyJyx2YWx1ZTpmdW5jdGlvbiByZW5kZXIoKXtyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQodGhpcy5wcm9wcy5jb21wb25lbnQsX2V4dGVuZHMoe30sX193ZWJwYWNrX3JlcXVpcmVfXy5pKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKHRoaXMucHJvcHMsRml0dGVkVGV4dC5pbnRlcm5hbEtleXMpLHtjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItdGV4dCcsdGhpcy5wcm9wcy5jbGFzc05hbWUpfSksdGhpcy5wcm9wcy5jaGlsZHJlbik7fX1dKTtyZXR1cm4gRml0dGVkVGV4dDt9KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5QdXJlQ29tcG9uZW50KTtGaXR0ZWRUZXh0LnByb3BUeXBlcz17Y29tcG9uZW50Ol9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm9uZU9mVHlwZShbX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc3RyaW5nLF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmNdKSxtYXhGb250U2l6ZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5udW1iZXJ9O0ZpdHRlZFRleHQuZGVmYXVsdFByb3BzPXtjb21wb25lbnQ6J3NwYW4nLG1heEZvbnRTaXplOk51bWJlci5NQVhfVkFMVUV9O0ZpdHRlZFRleHQuaW50ZXJuYWxLZXlzPU9iamVjdC5rZXlzKEZpdHRlZFRleHQuZGVmYXVsdFByb3BzKTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gRml0dGVkVGV4dDtcblxuLyoqKi8gfSlcbi8qKioqKiovIF0pO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBpbmRleC5qcyIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDQpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIDMzYTZjYzcwMTRjMTI3MjdlZjY0IiwiLyoqXG4gKiBSZXR1cm5zIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgc3VwcGxpZWQgb2JqZWN0IHdpdGhvdXQgdGhlIGdpdmVuIGtleXMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG9taXRLZXlzRnJvbVNvdXJjZU9iamVjdChzb3VyY2UsIG9taXR0ZWRLZXlzID0gW10pIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc291cmNlKS5yZWR1Y2UoZnVuY3Rpb24gcmVsb2NhdGVBY2NlcHRlZEtleXMoaGFzaCwga2V5KSB7XG4gICAgICAgIGlmIChvbWl0dGVkS2V5cy5pbmRleE9mKGtleSkgPT09IC0xKSB7XG4gICAgICAgICAgICBoYXNoW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYXNoO1xuICAgIH0sIHt9KTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMvaW5kZXguanMiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiY2xhc3NuYW1lc1wifVxuLy8gbW9kdWxlIGlkID0gMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0XCJ9XG4vLyBtb2R1bGUgaWQgPSAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0LWRvbVwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0LWRvbVwifVxuLy8gbW9kdWxlIGlkID0gM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgUmVhY3QsIHtQcm9wVHlwZXN9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7ZmluZERPTU5vZGV9IGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgY3ggZnJvbSAnY2xhc3NuYW1lcyc7XG5cbmltcG9ydCBvbWl0IGZyb20gJ2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMnO1xuXG5jb25zdCBpbnN0YW5jZXMgPSBbXTtcblxuZnVuY3Rpb24gdG9JKHN0cmluZ051bWJlcikge1xuICAgIHJldHVybiBwYXJzZUludChzdHJpbmdOdW1iZXIsIDEwKTtcbn1cblxuZnVuY3Rpb24gcmVzY2FsZShpbnN0YW5jZSkge1xuICAgIGNvbnN0IG5vZGUgPSBmaW5kRE9NTm9kZShpbnN0YW5jZSk7XG4gICAgY29uc3QgY29udGFpbmVyQm94ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUobm9kZS5wYXJlbnROb2RlKTtcbiAgICBjb25zdCBmb250U2l6ZSA9IHRvSSh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlKS5mb250U2l6ZSk7XG5cbiAgICBsZXQgY29udGFpbmVySGVpZ2h0ID0gdG9JKGNvbnRhaW5lckJveC5oZWlnaHQpO1xuICAgIGxldCBjb250YWluZXJXaWR0aCA9IHRvSShjb250YWluZXJCb3gud2lkdGgpO1xuXG4gICAgLy8gbmVlZCB0byBhY2NvdW50IGZvciBwYWRkaW5nXG4gICAgaWYgKGNvbnRhaW5lckJveC5ib3hTaXppbmcgPT09ICdib3JkZXItYm94JyB8fCBjb250YWluZXJCb3guYm94U2l6aW5nID09PSAncGFkZGluZy1ib3gnKSB7XG4gICAgICAgIGNvbnRhaW5lckhlaWdodCAtPSB0b0koY29udGFpbmVyQm94LnBhZGRpbmdUb3ApICsgdG9JKGNvbnRhaW5lckJveC5wYWRkaW5nQm90dG9tKTtcbiAgICAgICAgY29udGFpbmVyV2lkdGggLT0gdG9JKGNvbnRhaW5lckJveC5wYWRkaW5nTGVmdCkgKyB0b0koY29udGFpbmVyQm94LnBhZGRpbmdSaWdodCk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW1pemVGb3JIZWlnaHQgPSBNYXRoLmZsb29yKChmb250U2l6ZSAvIG5vZGUub2Zmc2V0SGVpZ2h0KSAqIGNvbnRhaW5lckhlaWdodCk7XG4gICAgY29uc3Qgb3B0aW1pemVGb3JXaWR0aCA9IE1hdGguZmxvb3IoKGZvbnRTaXplIC8gbm9kZS5vZmZzZXRXaWR0aCkgKiBjb250YWluZXJXaWR0aCk7XG5cbiAgICAvLyB0aGUgfHwgMSBpcyBhIGZhbGxiYWNrIHRvIHByZXZlbnQgZm9udFNpemUgZnJvbSBiZWluZyBzZXQgdG8gemVybywgd2hpY2ggZnViYXJzIHRoaW5nc1xuICAgIG5vZGUuc3R5bGUuZm9udFNpemUgPSAoTWF0aC5taW4oaW5zdGFuY2UucHJvcHMubWF4Rm9udFNpemUsIG9wdGltaXplRm9ySGVpZ2h0LCBvcHRpbWl6ZUZvcldpZHRoKSB8fCAxKSArICdweCc7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVdpbmRvd1Jlc2l6ZSgpIHtcbiAgICBpbnN0YW5jZXMuZm9yRWFjaCgoaW5zdGFuY2UpID0+IHJlc2NhbGUoaW5zdGFuY2UpKTtcbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJJbnN0YW5jZShpbnN0YW5jZSkge1xuICAgIGlmIChpbnN0YW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBoYW5kbGVXaW5kb3dSZXNpemUsIHRydWUpO1xuICAgIH1cblxuICAgIGluc3RhbmNlcy5wdXNoKGluc3RhbmNlKTtcbn1cblxuZnVuY3Rpb24gdW5yZWdpc3Rlckluc3RhbmNlKGluc3RhbmNlKSB7XG4gICAgaW5zdGFuY2VzLnNwbGljZShpbnN0YW5jZXMuaW5kZXhPZihpbnN0YW5jZSksIDEpO1xuXG4gICAgaWYgKGluc3RhbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGhhbmRsZVdpbmRvd1Jlc2l6ZSwgdHJ1ZSk7XG4gICAgfVxufVxuXG4vKipcbiMgRml0dGVkVGV4dFxuX19GaXQgZ2l2ZW4gdGV4dCBpbnNpZGUgYSBwYXJlbnQgY29udGFpbmVyLCBvYmV5aW5nIGltcGxpY3QgYW5kIGV4cGxpY2l0IGNvbnN0cmFpbnRzLl9fXG5cblRoZSBtb3N0IGNvbW1vbiB1c2UgY2FzZSBmb3IgdGhpcyBjbGFzcyBpcyBmaXR0aW5nIHNpbmdsZS1saW5lIHRleHQgb2YgdW5rbm93bi92YXJpYWJsZSBsZW5ndGggaW50byBhIGJ1dHRvbiBvciBoZWFkaW5nIHdpdGggZmluaXRlIGJvdW5kYXJpZXMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpdHRlZFRleHQgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgICAvKipcbiAgICAgICAgICogYW55IHZhbGlkIEhUTUwgdGFnIG5hbWUgb3IgYSBSZWFjdCBjb21wb25lbnQgZmFjdG9yeSwgYW55dGhpbmcgdGhhdCBjYW4gYmUgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byBgUmVhY3QuY3JlYXRlRWxlbWVudGBcbiAgICAgICAgICovXG4gICAgICAgIGNvbXBvbmVudDogUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgICAgICAgICBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgICAgICAgUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIF0pLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhbiB1cHBlciBib3VuZCAoaW4gcGl4ZWxzKSBmb3IgaG93IGxhcmdlIHRoZSB0ZXh0IGlzIGFsbG93ZWQgdG8gZ3Jvd1xuICAgICAgICAgKi9cbiAgICAgICAgbWF4Rm9udFNpemU6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgfVxuXG4gICAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgICAgY29tcG9uZW50OiAnc3BhbicsXG4gICAgICAgIG1heEZvbnRTaXplOiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgIH1cblxuICAgIHN0YXRpYyBpbnRlcm5hbEtleXMgPSBPYmplY3Qua2V5cyhGaXR0ZWRUZXh0LmRlZmF1bHRQcm9wcylcblxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICByZXNjYWxlKHRoaXMpO1xuXG4gICAgICAgIC8vIHRoZXJlIGFyZSBsaWtlbHkgdG8gYmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoaXMgY29tcG9uZW50IG9uIGEgcGFnZSwgc28gaXQgbWFrZXMgc2Vuc2UgdG8ganVzdCB1c2VcbiAgICAgICAgLy8gYSBzaGFyZWQgZ2xvYmFsIHJlc2l6ZSBsaXN0ZW5lciBpbnN0ZWFkIG9mIGVhY2ggY29tcG9uZW50IGhhdmluZyBpdHMgb3duXG4gICAgICAgIHJlZ2lzdGVySW5zdGFuY2UodGhpcyk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgICByZXNjYWxlKHRoaXMpO1xuICAgIH1cblxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICB1bnJlZ2lzdGVySW5zdGFuY2UodGhpcyk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPHRoaXMucHJvcHMuY29tcG9uZW50XG4gICAgICAgICAgICAgICAgey4uLm9taXQodGhpcy5wcm9wcywgRml0dGVkVGV4dC5pbnRlcm5hbEtleXMpfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y3goJ2ItdGV4dCcsIHRoaXMucHJvcHMuY2xhc3NOYW1lKX0+XG4gICAgICAgICAgICAgICAge3RoaXMucHJvcHMuY2hpbGRyZW59XG4gICAgICAgICAgICA8L3RoaXMucHJvcHMuY29tcG9uZW50PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL2JvdW5kbGVzcy1maXR0ZWQtdGV4dC9pbmRleC5qcyJdLCJzb3VyY2VSb290IjoiIn0= | ||
module.exports=function(e){function t(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,o){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:o})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=4)}([function(e,t){e.exports=require("boundless-utils-omit-keys")},function(e,t){e.exports=require("classnames")},function(e,t){e.exports=require("react")},function(e,t){e.exports=require("react-dom")},function(e,t,n){"use strict";function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function u(e){return parseInt(e,10)}function a(e){var t=n.i(d.findDOMNode)(e),o=window.getComputedStyle(t.parentNode),r=u(window.getComputedStyle(t).fontSize);null===e.baseFontSize&&(e.baseFontSize=r);var i=u(o.height),a=u(o.width);"border-box"!==o.boxSizing&&"padding-box"!==o.boxSizing||(i-=u(o.paddingTop)+u(o.paddingBottom),a-=u(o.paddingLeft)+u(o.paddingRight));var s=Math.floor(r/t.offsetHeight*i),p=Math.floor(r/t.offsetWidth*a);e.props.upscale?t.style.fontSize=(Math.max(s,p)||1)+"px":t.style.fontSize=(Math.min(e.baseFontSize,s,p)||1)+"px"}function s(){x.forEach(function(e){return a(e)})}function p(e){0===x.length&&window.addEventListener("resize",s,!0),x.push(e)}function c(e){x.splice(x.indexOf(e),1),0===x.length&&window.removeEventListener("resize",s,!0)}Object.defineProperty(t,"__esModule",{value:!0});var f=n(2),l=n.n(f),d=n(3),y=(n.n(d),n(1)),h=n.n(y),b=n(0),m=n.n(b),g=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},v=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,n,o){return n&&e(t.prototype,n),o&&e(t,o),t}}(),x=[],w=function(e){function t(){var e,n,i,u;o(this,t);for(var a=arguments.length,s=Array(a),p=0;p<a;p++)s[p]=arguments[p];return n=i=r(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(s))),i.baseFontSize=null,u=n,r(i,u)}return i(t,e),v(t,[{key:"componentDidMount",value:function(){a(this),p(this)}},{key:"componentDidUpdate",value:function(){a(this)}},{key:"componentWillUnmount",value:function(){c(this)}},{key:"render",value:function(){return l.a.createElement(this.props.component,g({},m()(this.props,t.internalKeys),{className:h()("b-text",this.props.className)}),this.props.children)}}]),t}(l.a.PureComponent);w.propTypes={"*":f.PropTypes.any,component:f.PropTypes.string,upscale:f.PropTypes.bool},w.defaultProps={component:"span",upscale:!1},w.internalKeys=Object.keys(w.defaultProps),t.default=w}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIGQyYmNlMmU2MzJiYjgzMmRmZTcxIiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiY2xhc3NuYW1lc1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdFwifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdC1kb21cIn0iLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvYm91bmRsZXNzLWZpdHRlZC10ZXh0L2luZGV4LmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJtb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiaW5zdGFsbGVkTW9kdWxlcyIsImkiLCJsIiwiY2FsbCIsIm0iLCJjIiwidmFsdWUiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJnZXQiLCJuIiwiX19lc01vZHVsZSIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsInJlcXVpcmUiLCJfX3dlYnBhY2tfZXhwb3J0c19fIiwiX2NsYXNzQ2FsbENoZWNrIiwiaW5zdGFuY2UiLCJDb25zdHJ1Y3RvciIsIlR5cGVFcnJvciIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIiwic2VsZiIsIlJlZmVyZW5jZUVycm9yIiwiX2luaGVyaXRzIiwic3ViQ2xhc3MiLCJzdXBlckNsYXNzIiwiY3JlYXRlIiwiY29uc3RydWN0b3IiLCJ3cml0YWJsZSIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwidG9JIiwic3RyaW5nTnVtYmVyIiwicGFyc2VJbnQiLCJyZXNjYWxlIiwibm9kZSIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9kb21fXyIsImNvbnRhaW5lckJveCIsIndpbmRvdyIsImdldENvbXB1dGVkU3R5bGUiLCJwYXJlbnROb2RlIiwiZm9udFNpemUiLCJiYXNlRm9udFNpemUiLCJjb250YWluZXJIZWlnaHQiLCJoZWlnaHQiLCJjb250YWluZXJXaWR0aCIsIndpZHRoIiwiYm94U2l6aW5nIiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iLCJwYWRkaW5nTGVmdCIsInBhZGRpbmdSaWdodCIsIm9wdGltaXplRm9ySGVpZ2h0IiwiTWF0aCIsImZsb29yIiwib2Zmc2V0SGVpZ2h0Iiwib3B0aW1pemVGb3JXaWR0aCIsIm9mZnNldFdpZHRoIiwicHJvcHMiLCJ1cHNjYWxlIiwic3R5bGUiLCJtYXgiLCJtaW4iLCJoYW5kbGVXaW5kb3dSZXNpemUiLCJpbnN0YW5jZXMiLCJmb3JFYWNoIiwicmVnaXN0ZXJJbnN0YW5jZSIsImxlbmd0aCIsImFkZEV2ZW50TGlzdGVuZXIiLCJwdXNoIiwidW5yZWdpc3Rlckluc3RhbmNlIiwic3BsaWNlIiwiaW5kZXhPZiIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfY2xhc3NuYW1lc19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2NsYXNzbmFtZXNfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCIsIl9leHRlbmRzIiwiYXNzaWduIiwidGFyZ2V0IiwiYXJndW1lbnRzIiwic291cmNlIiwia2V5IiwiX2NyZWF0ZUNsYXNzIiwiZGVmaW5lUHJvcGVydGllcyIsImRlc2NyaXB0b3IiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJGaXR0ZWRUZXh0IiwiX1JlYWN0JFB1cmVDb21wb25lbnQiLCJfcmVmIiwiX3RlbXAiLCJfdGhpcyIsIl9yZXQiLCJ0aGlzIiwiX2xlbiIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJnZXRQcm90b3R5cGVPZiIsImFwcGx5IiwiY29uY2F0IiwiYSIsImNyZWF0ZUVsZW1lbnQiLCJjb21wb25lbnQiLCJpbnRlcm5hbEtleXMiLCJjbGFzc05hbWUiLCJjaGlsZHJlbiIsIlB1cmVDb21wb25lbnQiLCJwcm9wVHlwZXMiLCIqIiwiYW55Iiwic3RyaW5nIiwiYm9vbCIsImRlZmF1bHRQcm9wcyIsImtleXMiXSwibWFwcGluZ3MiOiJBQUFBQSxPQUFPQyxRQUNFLFNBQVVDLEdDR25CLFFBQUFDLEdBQUFDLEdBR0EsR0FBQUMsRUFBQUQsR0FDQSxNQUFBQyxHQUFBRCxHQUFBSCxPQUdBLElBQUFELEdBQUFLLEVBQUFELElBQ0FFLEVBQUFGLEVBQ0FHLEdBQUEsRUFDQU4sV0FVQSxPQU5BQyxHQUFBRSxHQUFBSSxLQUFBUixFQUFBQyxRQUFBRCxJQUFBQyxRQUFBRSxHQUdBSCxFQUFBTyxHQUFBLEVBR0FQLEVBQUFDLFFBdkJBLEdBQUFJLEtBK0RBLE9BbkNBRixHQUFBTSxFQUFBUCxFQUdBQyxFQUFBTyxFQUFBTCxFQUdBRixFQUFBRyxFQUFBLFNBQUFLLEdBQTJDLE1BQUFBLElBRzNDUixFQUFBUyxFQUFBLFNBQUFYLEVBQUFZLEVBQUFDLEdBQ0FYLEVBQUFZLEVBQUFkLEVBQUFZLElBQ0FHLE9BQUFDLGVBQUFoQixFQUFBWSxHQUNBSyxjQUFBLEVBQ0FDLFlBQUEsRUFDQUMsSUFBQU4sS0FNQVgsRUFBQWtCLEVBQUEsU0FBQXJCLEdBQ0EsR0FBQWMsR0FBQWQsS0FBQXNCLFdBQ0EsV0FBMkIsTUFBQXRCLEdBQUEsU0FDM0IsV0FB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bEIsVUFBVWtCLEVBQU8sT0FBYVAsR0FBT0MsRUFBTTNFLEVBQTJCNkUsTUFBTUosRUFBS0YsRUFBVzdELFdBQVc3QixPQUFPcUcsZUFBZVgsSUFBYWxHLEtBQUs4RyxNQUFNVixHQUFNSSxNQUFNTyxPQUFPTCxLQUFlSixFTWQxNEdyRCxhQUFlLEtOYzR0R3NELEVBQXVMRixFQUFPMUUsRUFBMkIyRSxFQUFNQyxHQUEwcEIsTUFBcG1DekUsR0FBVW9FLEVBQVdDLEdBQTRiTixFQUFhSyxJQUFhTixJQUFJLG9CQUFvQnpGLE1BQU0sV01YcmdIc0MsRUFBUStELE1BSVIvQixFQUFpQitCLFNOTzBqSFosSUFBSSxxQkFBcUJ6RixNQUFNLFdNSDFtSHNDLEVBQVErRCxTTkdrcEhaLElBQUksdUJBQXVCekYsTUFBTSxXTUMzckgwRSxFQUFtQjJCLFNORHF1SFosSUFBSSxTQUFTekYsTUFBTSxXTUszd0gsTUFDSStFLEdBQUE4QixFQUFBQyxjQUFBVCxLQUFNdkMsTUFBTWlELFVBQVozQixLQUNRRCxJQUFLa0IsS0FBS3ZDLE1BQU9pQyxFQUFXaUIsZUFDaENDLFVBQVdoQyxJQUFHLFNBQVVvQixLQUFLdkMsTUFBTW1ELGFBQ2xDWixLQUFLdkMsTUFBTW9ELGNOVG1sSW5CLEdNekN2a0loQixFQUFBOEIsRUFBTU0sY0FBekJwQixHQUNWcUIsV0FJSEMsSUFBS3ZDLEVBQUEsVUFBVXdDLElBS2ZQLFVBQVdqQyxFQUFBLFVBQVV5QyxPQU1yQnhELFFBQVNlLEVBQUEsVUFBVTBDLE1BaEJOekIsRUFtQlYwQixjQUNIVixVQUFXLE9BQ1hoRCxTQUFTLEdBckJJZ0MsRUF3QlZpQixhQUFlM0csT0FBT3FILEtBQUszQixFQUFXMEIsY05pQjIrSXRHLEVBQTZCLFFNekNwaUo0RSIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbi8qKioqKiovIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbi8qKioqKiovIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA0KTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXV0aWxzLW9taXQta2V5c1wiKTtcblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNsYXNzbmFtZXNcIik7XG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxuLyoqKi8gfSksXG4vKiAzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0LWRvbVwiKTtcblxuLyoqKi8gfSksXG4vKiA0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KF9fd2VicGFja19leHBvcnRzX18sIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfcmVhY3RfZG9tX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9kb21fX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9kb21fXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2NsYXNzbmFtZXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2NsYXNzbmFtZXNfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9jbGFzc25hbWVzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fKTtcbnZhciBfZXh0ZW5kcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0YXJnZXQpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9YXJndW1lbnRzW2ldO2Zvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSxrZXkpKXt0YXJnZXRba2V5XT1zb3VyY2Vba2V5XTt9fX1yZXR1cm4gdGFyZ2V0O307dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoXCJ2YWx1ZVwiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKTt9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcjt9O30oKTtmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7fX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLGNhbGwpe2lmKCFzZWxmKXt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7fXJldHVybiBjYWxsJiYodHlwZW9mIGNhbGw9PT1cIm9iamVjdFwifHx0eXBlb2YgY2FsbD09PVwiZnVuY3Rpb25cIik/Y2FsbDpzZWxmO31mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT1cImZ1bmN0aW9uXCImJnN1cGVyQ2xhc3MhPT1udWxsKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2Ygc3VwZXJDbGFzcyk7fXN1YkNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MmJnN1cGVyQ2xhc3MucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6c3ViQ2xhc3MsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfX0pO2lmKHN1cGVyQ2xhc3MpT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcyxzdXBlckNsYXNzKTpzdWJDbGFzcy5fX3Byb3RvX189c3VwZXJDbGFzczt9dmFyIGluc3RhbmNlcz1bXTtmdW5jdGlvbiB0b0koc3RyaW5nTnVtYmVyKXtyZXR1cm4gcGFyc2VJbnQoc3RyaW5nTnVtYmVyLDEwKTt9ZnVuY3Rpb24gcmVzY2FsZShpbnN0YW5jZSl7dmFyIG5vZGU9X193ZWJwYWNrX3JlcXVpcmVfXy5pKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9kb21fX1tcImZpbmRET01Ob2RlXCJdKShpbnN0YW5jZSk7dmFyIGNvbnRhaW5lckJveD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLnBhcmVudE5vZGUpO3ZhciBmb250U2l6ZT10b0kod2luZG93LmdldENvbXB1dGVkU3R5bGUobm9kZSkuZm9udFNpemUpO2lmKGluc3RhbmNlLmJhc2VGb250U2l6ZT09PW51bGwpe2luc3RhbmNlLmJhc2VGb250U2l6ZT1mb250U2l6ZTt9dmFyIGNvbnRhaW5lckhlaWdodD10b0koY29udGFpbmVyQm94LmhlaWdodCk7dmFyIGNvbnRhaW5lcldpZHRoPXRvSShjb250YWluZXJCb3gud2lkdGgpO2lmKGNvbnRhaW5lckJveC5ib3hTaXppbmc9PT0nYm9yZGVyLWJveCd8fGNvbnRhaW5lckJveC5ib3hTaXppbmc9PT0ncGFkZGluZy1ib3gnKXtjb250YWluZXJIZWlnaHQtPXRvSShjb250YWluZXJCb3gucGFkZGluZ1RvcCkrdG9JKGNvbnRhaW5lckJveC5wYWRkaW5nQm90dG9tKTtjb250YWluZXJXaWR0aC09dG9JKGNvbnRhaW5lckJveC5wYWRkaW5nTGVmdCkrdG9JKGNvbnRhaW5lckJveC5wYWRkaW5nUmlnaHQpO312YXIgb3B0aW1pemVGb3JIZWlnaHQ9TWF0aC5mbG9vcihmb250U2l6ZS9ub2RlLm9mZnNldEhlaWdodCpjb250YWluZXJIZWlnaHQpO3ZhciBvcHRpbWl6ZUZvcldpZHRoPU1hdGguZmxvb3IoZm9udFNpemUvbm9kZS5vZmZzZXRXaWR0aCpjb250YWluZXJXaWR0aCk7aWYoaW5zdGFuY2UucHJvcHMudXBzY2FsZSl7bm9kZS5zdHlsZS5mb250U2l6ZT0oTWF0aC5tYXgob3B0aW1pemVGb3JIZWlnaHQsb3B0aW1pemVGb3JXaWR0aCl8fDEpKydweCc7fWVsc2V7bm9kZS5zdHlsZS5mb250U2l6ZT0oTWF0aC5taW4oaW5zdGFuY2UuYmFzZUZvbnRTaXplLG9wdGltaXplRm9ySGVpZ2h0LG9wdGltaXplRm9yV2lkdGgpfHwxKSsncHgnO319ZnVuY3Rpb24gaGFuZGxlV2luZG93UmVzaXplKCl7aW5zdGFuY2VzLmZvckVhY2goZnVuY3Rpb24oaW5zdGFuY2Upe3JldHVybiByZXNjYWxlKGluc3RhbmNlKTt9KTt9ZnVuY3Rpb24gcmVnaXN0ZXJJbnN0YW5jZShpbnN0YW5jZSl7aWYoaW5zdGFuY2VzLmxlbmd0aD09PTApe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLGhhbmRsZVdpbmRvd1Jlc2l6ZSx0cnVlKTt9aW5zdGFuY2VzLnB1c2goaW5zdGFuY2UpO31mdW5jdGlvbiB1bnJlZ2lzdGVySW5zdGFuY2UoaW5zdGFuY2Upe2luc3RhbmNlcy5zcGxpY2UoaW5zdGFuY2VzLmluZGV4T2YoaW5zdGFuY2UpLDEpO2lmKGluc3RhbmNlcy5sZW5ndGg9PT0wKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJyxoYW5kbGVXaW5kb3dSZXNpemUsdHJ1ZSk7fX12YXIgRml0dGVkVGV4dD1mdW5jdGlvbihfUmVhY3QkUHVyZUNvbXBvbmVudCl7X2luaGVyaXRzKEZpdHRlZFRleHQsX1JlYWN0JFB1cmVDb21wb25lbnQpO2Z1bmN0aW9uIEZpdHRlZFRleHQoKXt2YXIgX3JlZjt2YXIgX3RlbXAsX3RoaXMsX3JldDtfY2xhc3NDYWxsQ2hlY2sodGhpcyxGaXR0ZWRUZXh0KTtmb3IodmFyIF9sZW49YXJndW1lbnRzLmxlbmd0aCxhcmdzPUFycmF5KF9sZW4pLF9rZXk9MDtfa2V5PF9sZW47X2tleSsrKXthcmdzW19rZXldPWFyZ3VtZW50c1tfa2V5XTt9cmV0dXJuIF9yZXQ9KF90ZW1wPShfdGhpcz1fcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLChfcmVmPUZpdHRlZFRleHQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoRml0dGVkVGV4dCkpLmNhbGwuYXBwbHkoX3JlZixbdGhpc10uY29uY2F0KGFyZ3MpKSksX3RoaXMpLF90aGlzLmJhc2VGb250U2l6ZT1udWxsLF90ZW1wKSxfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcyxfcmV0KTt9X2NyZWF0ZUNsYXNzKEZpdHRlZFRleHQsW3trZXk6J2NvbXBvbmVudERpZE1vdW50Jyx2YWx1ZTpmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpe3Jlc2NhbGUodGhpcyk7cmVnaXN0ZXJJbnN0YW5jZSh0aGlzKTt9fSx7a2V5Oidjb21wb25lbnREaWRVcGRhdGUnLHZhbHVlOmZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpe3Jlc2NhbGUodGhpcyk7fX0se2tleTonY29tcG9uZW50V2lsbFVubW91bnQnLHZhbHVlOmZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCl7dW5yZWdpc3Rlckluc3RhbmNlKHRoaXMpO319LHtrZXk6J3JlbmRlcicsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyKCl7cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KHRoaXMucHJvcHMuY29tcG9uZW50LF9leHRlbmRzKHt9LF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCgpKHRoaXMucHJvcHMsRml0dGVkVGV4dC5pbnRlcm5hbEtleXMpLHtjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItdGV4dCcsdGhpcy5wcm9wcy5jbGFzc05hbWUpfSksdGhpcy5wcm9wcy5jaGlsZHJlbik7fX1dKTtyZXR1cm4gRml0dGVkVGV4dDt9KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5QdXJlQ29tcG9uZW50KTtGaXR0ZWRUZXh0LnByb3BUeXBlcz17JyonOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmFueSxjb21wb25lbnQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc3RyaW5nLHVwc2NhbGU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYm9vbH07Rml0dGVkVGV4dC5kZWZhdWx0UHJvcHM9e2NvbXBvbmVudDonc3BhbicsdXBzY2FsZTpmYWxzZX07Rml0dGVkVGV4dC5pbnRlcm5hbEtleXM9T2JqZWN0LmtleXMoRml0dGVkVGV4dC5kZWZhdWx0UHJvcHMpOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSBGaXR0ZWRUZXh0O1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGluZGV4LmpzIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbiBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gNCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgZDJiY2UyZTYzMmJiODMyZGZlNzEiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXV0aWxzLW9taXQta2V5c1wifVxuLy8gbW9kdWxlIGlkID0gMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiY2xhc3NuYW1lc1wifVxuLy8gbW9kdWxlIGlkID0gMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0XCJ9XG4vLyBtb2R1bGUgaWQgPSAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0LWRvbVwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0LWRvbVwifVxuLy8gbW9kdWxlIGlkID0gM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgUmVhY3QsIHtQcm9wVHlwZXN9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7ZmluZERPTU5vZGV9IGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgY3ggZnJvbSAnY2xhc3NuYW1lcyc7XG5cbmltcG9ydCBvbWl0IGZyb20gJ2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMnO1xuXG5jb25zdCBpbnN0YW5jZXMgPSBbXTtcblxuZnVuY3Rpb24gdG9JKHN0cmluZ051bWJlcikge1xuICAgIHJldHVybiBwYXJzZUludChzdHJpbmdOdW1iZXIsIDEwKTtcbn1cblxuZnVuY3Rpb24gcmVzY2FsZShpbnN0YW5jZSkge1xuICAgIGNvbnN0IG5vZGUgPSBmaW5kRE9NTm9kZShpbnN0YW5jZSk7XG4gICAgY29uc3QgY29udGFpbmVyQm94ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUobm9kZS5wYXJlbnROb2RlKTtcbiAgICBjb25zdCBmb250U2l6ZSA9IHRvSSh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlKS5mb250U2l6ZSk7XG5cbiAgICBpZiAoaW5zdGFuY2UuYmFzZUZvbnRTaXplID09PSBudWxsKSB7XG4gICAgICAgIGluc3RhbmNlLmJhc2VGb250U2l6ZSA9IGZvbnRTaXplO1xuICAgIH1cblxuICAgIGxldCBjb250YWluZXJIZWlnaHQgPSB0b0koY29udGFpbmVyQm94LmhlaWdodCk7XG4gICAgbGV0IGNvbnRhaW5lcldpZHRoID0gdG9JKGNvbnRhaW5lckJveC53aWR0aCk7XG5cbiAgICAvLyBuZWVkIHRvIGFjY291bnQgZm9yIHBhZGRpbmdcbiAgICBpZiAoY29udGFpbmVyQm94LmJveFNpemluZyA9PT0gJ2JvcmRlci1ib3gnIHx8IGNvbnRhaW5lckJveC5ib3hTaXppbmcgPT09ICdwYWRkaW5nLWJveCcpIHtcbiAgICAgICAgY29udGFpbmVySGVpZ2h0IC09IHRvSShjb250YWluZXJCb3gucGFkZGluZ1RvcCkgKyB0b0koY29udGFpbmVyQm94LnBhZGRpbmdCb3R0b20pO1xuICAgICAgICBjb250YWluZXJXaWR0aCAtPSB0b0koY29udGFpbmVyQm94LnBhZGRpbmdMZWZ0KSArIHRvSShjb250YWluZXJCb3gucGFkZGluZ1JpZ2h0KTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpbWl6ZUZvckhlaWdodCA9IE1hdGguZmxvb3IoKGZvbnRTaXplIC8gbm9kZS5vZmZzZXRIZWlnaHQpICogY29udGFpbmVySGVpZ2h0KTtcbiAgICBjb25zdCBvcHRpbWl6ZUZvcldpZHRoID0gTWF0aC5mbG9vcigoZm9udFNpemUgLyBub2RlLm9mZnNldFdpZHRoKSAqIGNvbnRhaW5lcldpZHRoKTtcblxuICAgIC8vIGlmIHVwc2NhbGluZyBpcyBhbGxvd2VkLCB0aGF0IGNoYW5nZXMgdGhlIG1hdGggYSBiaXRcbiAgICBpZiAoaW5zdGFuY2UucHJvcHMudXBzY2FsZSkge1xuICAgICAgICBub2RlLnN0eWxlLmZvbnRTaXplID0gKE1hdGgubWF4KG9wdGltaXplRm9ySGVpZ2h0LCBvcHRpbWl6ZUZvcldpZHRoKSB8fCAxKSArICdweCc7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS5zdHlsZS5mb250U2l6ZSA9IChNYXRoLm1pbihpbnN0YW5jZS5iYXNlRm9udFNpemUsIG9wdGltaXplRm9ySGVpZ2h0LCBvcHRpbWl6ZUZvcldpZHRoKSB8fCAxKSArICdweCc7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVXaW5kb3dSZXNpemUoKSB7XG4gICAgaW5zdGFuY2VzLmZvckVhY2goKGluc3RhbmNlKSA9PiByZXNjYWxlKGluc3RhbmNlKSk7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVySW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgICBpZiAoaW5zdGFuY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaGFuZGxlV2luZG93UmVzaXplLCB0cnVlKTtcbiAgICB9XG5cbiAgICBpbnN0YW5jZXMucHVzaChpbnN0YW5jZSk7XG59XG5cbmZ1bmN0aW9uIHVucmVnaXN0ZXJJbnN0YW5jZShpbnN0YW5jZSkge1xuICAgIGluc3RhbmNlcy5zcGxpY2UoaW5zdGFuY2VzLmluZGV4T2YoaW5zdGFuY2UpLCAxKTtcblxuICAgIGlmIChpbnN0YW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBoYW5kbGVXaW5kb3dSZXNpemUsIHRydWUpO1xuICAgIH1cbn1cblxuLyoqXG5fX0ZpdCBzaW5nbGUtbGluZSB0ZXh0IGluc2lkZSBhIHBhcmVudCBjb250YWluZXIsIG9iZXlpbmcgaW1wbGljdCBjb25zdHJhaW50cy5fX1xuXG5UaGlzIGNvbXBvbmVudCBjYW4gYmUgdXNlZnVsIGluIHNpdHVhdGlvbnMgd2hlcmUgYW4gaW50ZXJuYXRpb25hbGl6ZWQgc3RyaW5nIGlzIGJlaW5nIHBsYWNlZCBpbnRvIHRoZSBVSSBhbmQgaXQncyB1bmNsZWFyIGlmIGFsbCB2YXJpYXRpb25zIG9mIGl0IHdpbGwgZml0IHdpdGhvdXQgZXhjZXNzaXZlIGFtb3VudHMgb2YgZWRnZS1jYXNlIENTUy4gVWx0aW1hdGVseSwgaXQncyBnb29kIGF0IG1ha2luZyBzdXJlIHdoYXQgeW91IHB1dCBpbiBkb2Vzbid0IG92ZXJmbG93LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaXR0ZWRUZXh0IGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFueSBbUmVhY3Qtc3VwcG9ydGVkIGF0dHJpYnV0ZV0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90YWdzLWFuZC1hdHRyaWJ1dGVzLmh0bWwjaHRtbC1hdHRyaWJ1dGVzKVxuICAgICAgICAgKi9cbiAgICAgICAgJyonOiBQcm9wVHlwZXMuYW55LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhbnkgdmFsaWQgSFRNTCB0YWcgbmFtZVxuICAgICAgICAgKi9cbiAgICAgICAgY29tcG9uZW50OiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBjb250cm9scyBpZiBGaXR0ZWRUZXh0IHdpbGwgYXV0b21hdGljYWxseSBzY2FsZSB1cCB0aGUgY29udGVudCB0byBmaXQgdGhlIGF2YWlsYWJsZSBzcGFjZTsgbm9ybWFsbHkgdGhlIGNvbXBvbmVudFxuICAgICAgICAgKiBvbmx5IHNjYWxlcyB0ZXh0IGRvd24gYXMgbmVlZGVkIHRvIGZpdFxuICAgICAgICAgKi9cbiAgICAgICAgdXBzY2FsZTogUHJvcFR5cGVzLmJvb2wsXG4gICAgfVxuXG4gICAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgICAgY29tcG9uZW50OiAnc3BhbicsXG4gICAgICAgIHVwc2NhbGU6IGZhbHNlLFxuICAgIH1cblxuICAgIHN0YXRpYyBpbnRlcm5hbEtleXMgPSBPYmplY3Qua2V5cyhGaXR0ZWRUZXh0LmRlZmF1bHRQcm9wcylcblxuICAgIC8vIHNldCBkdXJpbmcgdGhlIGZpcnN0IHJlc2NhbGUoKSBydW5cbiAgICBiYXNlRm9udFNpemUgPSBudWxsXG5cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgcmVzY2FsZSh0aGlzKTtcblxuICAgICAgICAvLyB0aGVyZSBhcmUgbGlrZWx5IHRvIGJlIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGlzIGNvbXBvbmVudCBvbiBhIHBhZ2UsIHNvIGl0IG1ha2VzIHNlbnNlIHRvIGp1c3QgdXNlXG4gICAgICAgIC8vIGEgc2hhcmVkIGdsb2JhbCByZXNpemUgbGlzdGVuZXIgaW5zdGVhZCBvZiBlYWNoIGNvbXBvbmVudCBoYXZpbmcgaXRzIG93blxuICAgICAgICByZWdpc3Rlckluc3RhbmNlKHRoaXMpO1xuICAgIH1cblxuICAgIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAgICAgcmVzY2FsZSh0aGlzKTtcbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgdW5yZWdpc3Rlckluc3RhbmNlKHRoaXMpO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDx0aGlzLnByb3BzLmNvbXBvbmVudFxuICAgICAgICAgICAgICAgIHsuLi5vbWl0KHRoaXMucHJvcHMsIEZpdHRlZFRleHQuaW50ZXJuYWxLZXlzKX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KCdiLXRleHQnLCB0aGlzLnByb3BzLmNsYXNzTmFtZSl9PlxuICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLmNoaWxkcmVufVxuICAgICAgICAgICAgPC90aGlzLnByb3BzLmNvbXBvbmVudD5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9ib3VuZGxlc3MtZml0dGVkLXRleHQvaW5kZXguanMiXSwic291cmNlUm9vdCI6IiJ9 |
@@ -18,2 +18,6 @@ import React, {PropTypes} from 'react'; | ||
if (instance.baseFontSize === null) { | ||
instance.baseFontSize = fontSize; | ||
} | ||
let containerHeight = toI(containerBox.height); | ||
@@ -31,4 +35,8 @@ let containerWidth = toI(containerBox.width); | ||
// the || 1 is a fallback to prevent fontSize from being set to zero, which fubars things | ||
node.style.fontSize = (Math.min(instance.props.maxFontSize, optimizeForHeight, optimizeForWidth) || 1) + 'px'; | ||
// if upscaling is allowed, that changes the math a bit | ||
if (instance.props.upscale) { | ||
node.style.fontSize = (Math.max(optimizeForHeight, optimizeForWidth) || 1) + 'px'; | ||
} else { | ||
node.style.fontSize = (Math.min(instance.baseFontSize, optimizeForHeight, optimizeForWidth) || 1) + 'px'; | ||
} | ||
} | ||
@@ -57,6 +65,5 @@ | ||
/** | ||
# FittedText | ||
__Fit given text inside a parent container, obeying implict and explicit constraints.__ | ||
__Fit single-line text inside a parent container, obeying implict constraints.__ | ||
The most common use case for this class is fitting single-line text of unknown/variable length into a button or heading with finite boundaries. | ||
This component can be useful in situations where an internationalized string is being placed into the UI and it's unclear if all variations of it will fit without excessive amounts of edge-case CSS. Ultimately, it's good at making sure what you put in doesn't overflow. | ||
*/ | ||
@@ -66,13 +73,16 @@ export default class FittedText extends React.PureComponent { | ||
/** | ||
* any valid HTML tag name or a React component factory, anything that can be passed as the first argument to `React.createElement` | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
component: PropTypes.oneOfType([ | ||
PropTypes.string, | ||
PropTypes.func, | ||
]), | ||
'*': PropTypes.any, | ||
/** | ||
* an upper bound (in pixels) for how large the text is allowed to grow | ||
* any valid HTML tag name | ||
*/ | ||
maxFontSize: PropTypes.number, | ||
component: PropTypes.string, | ||
/** | ||
* controls if FittedText will automatically scale up the content to fit the available space; normally the component | ||
* only scales text down as needed to fit | ||
*/ | ||
upscale: PropTypes.bool, | ||
} | ||
@@ -82,3 +92,3 @@ | ||
component: 'span', | ||
maxFontSize: Number.MAX_VALUE, | ||
upscale: false, | ||
} | ||
@@ -88,2 +98,5 @@ | ||
// set during the first rescale() run | ||
baseFontSize = null | ||
componentDidMount() { | ||
@@ -90,0 +103,0 @@ rescale(this); |
{ | ||
"name": "boundless-fitted-text", | ||
"version": "1.0.0-beta.5", | ||
"version": "1.0.0-beta.7", | ||
"description": "Fit given text inside a parent container, obeying implict and explicit constraints.", | ||
@@ -30,3 +30,3 @@ "main": "build/index.js", | ||
"dependencies": { | ||
"boundless-utils-omit-keys": "^1.0.0-beta.5", | ||
"boundless-utils-omit-keys": "^1.0.0-beta.7", | ||
"classnames": "^2.1.5" | ||
@@ -33,0 +33,0 @@ }, |
@@ -0,11 +1,42 @@ | ||
<!--- | ||
THIS IS AN AUTOGENERATED FILE. EDIT INDEX.JS INSTEAD. | ||
--> | ||
# FittedText | ||
__Fit given text inside a parent container, obeying implict and explicit constraints.__ | ||
The most common use case for this class is fitting single-line text of unknown/variable length into a button or heading with finite boundaries. | ||
__Fit single-line text inside a parent container, obeying implict constraints.__ | ||
This component can be useful in situations where an internationalized string is being placed into the UI and it's unclear if all variations of it will fit without excessive amounts of edge-case CSS. Ultimately, it's good at making sure what you put in doesn't overflow. | ||
## Example Usage | ||
```jsx | ||
import React from 'react'; | ||
import Button from '../../boundless-button/index'; | ||
import FittedText from '../index'; | ||
export default () => ( | ||
<div className='spread'> | ||
<Button className='tall-button'> | ||
<FittedText>Welcome</FittedText> | ||
</Button> | ||
<Button className='tall-button'> | ||
<FittedText>Добро пожаловать</FittedText> | ||
</Button> | ||
<Button className='tall-button'> | ||
<FittedText>Benvenuto</FittedText> | ||
</Button> | ||
<Button className='tall-button'> | ||
<FittedText>환영합니다</FittedText> | ||
</Button> | ||
<Button className='tall-button'> | ||
<FittedText>സ്വാഗതം</FittedText> | ||
</Button> | ||
</div> | ||
); | ||
``` | ||
## Props | ||
_Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/FittedText#props)._ | ||
> Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/FittedText#props). | ||
@@ -19,26 +50,37 @@ ### Required Props | ||
<table> | ||
<tr> | ||
<th>Name</th> | ||
<th>Type</th> | ||
<th>Default Value</th> | ||
<th>Description</th> | ||
</tr> | ||
- __`*`__ ・ any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
<tr> | ||
<td>component</td> | ||
<td><pre><code>string or function</code></pre></td> | ||
<td><pre><code class="language-js">'span'</code></pre></td> | ||
<td>any valid HTML tag name or a React component factory, anything that can be passed as the first argument to `React.createElement`</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any` | `n/a` | ||
<tr> | ||
<td>maxFontSize</td> | ||
<td><pre><code>number</code></pre></td> | ||
<td><pre><code class="language-js">Number.MAX_VALUE</code></pre></td> | ||
<td>an upper bound (in pixels) for how large the text is allowed to grow</td> | ||
</tr> | ||
- __`component`__ ・ any valid HTML tag name | ||
</table> | ||
Expects | Default Value | ||
- | - | ||
`string` | `'span'` | ||
- __`upscale`__ ・ controls if FittedText will automatically scale up the content to fit the available space; normally the component | ||
only scales text down as needed to fit | ||
Expects | Default Value | ||
- | - | ||
`bool` | `false` | ||
## Reference Styles | ||
### Stylus | ||
```stylus | ||
// Bring in Boundless's base Stylus variables | ||
@require "node_modules/boundless-fitted-text/variables" | ||
// Redefine any variables as desired, e.g. | ||
color-accent = royalblue | ||
// Bring in the component styles; they will be autoconfigured based on the above | ||
@require "node_modules/boundless-fitted-text/style" | ||
``` | ||
### CSS | ||
If desired, a precompiled plain CSS stylesheet is available for customization at `/build/style.css`, based on Boundless's [default variables](https://github.com/enigma-io/boundless/blob/master/variables.styl). | ||
@@ -1,2 +0,2 @@ | ||
module.exports=function(e){function t(s){if(r[s])return r[s].exports;var o=r[s]={i:s,l:!1,exports:{}};return e[s].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var r={};return t.m=e,t.c=r,t.i=function(e){return e},t.d=function(e,r,s){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:s})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=3)}([function(e,t,r){"use strict";function s(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Object.keys(e).reduce(function(r,s){return t.indexOf(s)===-1&&(r[s]=e[s]),r},{})}t.a=s},function(e,t){e.exports=require("classnames")},function(e,t){e.exports=require("react")},function(e,t,r){"use strict";function s(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function n(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=r(2),i=r.n(a),u=r(1),p=r.n(u),l=r(0),c=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var s in r)Object.prototype.hasOwnProperty.call(r,s)&&(e[s]=r[s])}return e},f=function(){function e(e,t){for(var r=0;r<t.length;r++){var s=t[r];s.enumerable=s.enumerable||!1,s.configurable=!0,"value"in s&&(s.writable=!0),Object.defineProperty(e,s.key,s)}}return function(t,r,s){return r&&e(t.prototype,r),s&&e(t,s),t}}(),d=function(){},m=function(e){function t(){var e,r,n,a;s(this,t);for(var i=arguments.length,u=Array(i),p=0;p<i;p++)u[p]=arguments[p];return r=n=o(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(u))),n.state={status:t.status.LOADING},a=r,o(n,a)}return n(t,e),f(t,[{key:"componentWillReceiveProps",value:function(e){e.src!==this.props.src&&(this.resetPreloader(),this.setState({status:t.status.LOADING}))}},{key:"componentDidMount",value:function(){this.preload()}},{key:"componentDidUpdate",value:function(){this.preload()}},{key:"componentWillUnmount",value:function(){this.resetPreloader()}},{key:"resetPreloader",value:function(){this.loader.onload=null,this.loader.onerror=null,this.loader=null}},{key:"preload",value:function(){var e=this;this.loader||(this.loader=document.createElement("img"),this.loader.onload=function(){return e.setState({status:t.status.LOADED})},this.loader.onerror=function(){return e.setState({status:t.status.ERROR})},this.loader.src=this.props.src)}},{key:"renderImage",value:function(){return this.props.displayAsBackgroundImage?i.a.createElement("div",c({},this.props.imageProps,{ref:"image",className:p()("b-image",this.props.imageProps.className),title:this.props.alt,style:c({},this.props.imageProps.style,{backgroundImage:"url("+this.props.src+")"})})):i.a.createElement("img",c({},this.props.imageProps,{ref:"image",className:p()("b-image",this.props.imageProps.className),src:this.props.src,alt:this.props.alt,onLoad:d,onError:d}))}},{key:"renderStatus",value:function(){return i.a.createElement("div",c({},this.props.statusProps,{ref:"status",className:p()("b-image-status",this.props.statusProps.className,{"b-image-loading":this.state.status===t.status.LOADING,"b-image-loaded":this.state.status===t.status.LOADED,"b-image-error":this.state.status===t.status.ERROR}),role:"presentation"}))}},{key:"render",value:function(){return i.a.createElement("div",c({},r.i(l.a)(this.props,t.internalKeys),{ref:"wrapper",className:p()("b-image-wrapper",this.props.className)}),this.renderImage(),this.renderStatus())}}]),t}(i.a.PureComponent);m.status={LOADING:"LOADING",LOADED:"LOADED",ERROR:"ERROR"},m.propTypes={alt:a.PropTypes.string,displayAsBackgroundImage:a.PropTypes.bool,imageProps:a.PropTypes.object,src:a.PropTypes.string.isRequired,statusProps:a.PropTypes.object},m.defaultProps={alt:null,displayAsBackgroundImage:!1,imageProps:{},src:"about:blank",statusProps:{}},m.internalKeys=Object.keys(m.defaultProps),t.default=m}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIGE2OGE1YjJjMzZjOTFlNDA1OTAwIiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiY2xhc3NuYW1lc1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdFwifSIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9ib3VuZGxlc3MtaW1hZ2UvaW5kZXguanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJ2YWx1ZSIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiX193ZWJwYWNrX2V4cG9ydHNfXyIsIm9taXRLZXlzRnJvbVNvdXJjZU9iamVjdCIsInNvdXJjZSIsIm9taXR0ZWRLZXlzIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwia2V5cyIsInJlZHVjZSIsImhhc2giLCJrZXkiLCJpbmRleE9mIiwicmVxdWlyZSIsIl9jbGFzc0NhbGxDaGVjayIsImluc3RhbmNlIiwiQ29uc3RydWN0b3IiLCJUeXBlRXJyb3IiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiIsInNlbGYiLCJSZWZlcmVuY2VFcnJvciIsIl9pbmhlcml0cyIsInN1YkNsYXNzIiwic3VwZXJDbGFzcyIsImNyZWF0ZSIsImNvbnN0cnVjdG9yIiwid3JpdGFibGUiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fIiwiX2V4dGVuZHMiLCJhc3NpZ24iLCJ0YXJnZXQiLCJfY3JlYXRlQ2xhc3MiLCJkZWZpbmVQcm9wZXJ0aWVzIiwicHJvcHMiLCJkZXNjcmlwdG9yIiwicHJvdG9Qcm9wcyIsInN0YXRpY1Byb3BzIiwibm9vcCIsIkltYWdlIiwiX1JlYWN0JFB1cmVDb21wb25lbnQiLCJfcmVmIiwiX3RlbXAiLCJfdGhpcyIsIl9yZXQiLCJ0aGlzIiwiX2xlbiIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJnZXRQcm90b3R5cGVPZiIsImFwcGx5IiwiY29uY2F0Iiwic3RhdGUiLCJzdGF0dXMiLCJMT0FESU5HIiwibmV4dFByb3BzIiwic3JjIiwicmVzZXRQcmVsb2FkZXIiLCJzZXRTdGF0ZSIsInByZWxvYWQiLCJsb2FkZXIiLCJvbmxvYWQiLCJvbmVycm9yIiwiX3RoaXMyIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiTE9BREVEIiwiRVJST1IiLCJkaXNwbGF5QXNCYWNrZ3JvdW5kSW1hZ2UiLCJhIiwiaW1hZ2VQcm9wcyIsInJlZiIsImNsYXNzTmFtZSIsInRpdGxlIiwiYWx0Iiwic3R5bGUiLCJiYWNrZ3JvdW5kSW1hZ2UiLCJvbkxvYWQiLCJvbkVycm9yIiwic3RhdHVzUHJvcHMiLCJiLWltYWdlLWxvYWRpbmciLCJiLWltYWdlLWxvYWRlZCIsImItaW1hZ2UtZXJyb3IiLCJyb2xlIiwiaW50ZXJuYWxLZXlzIiwicmVuZGVySW1hZ2UiLCJyZW5kZXJTdGF0dXMiLCJQdXJlQ29tcG9uZW50IiwicHJvcFR5cGVzIiwic3RyaW5nIiwiYm9vbCIsImlzUmVxdWlyZWQiLCJkZWZhdWx0UHJvcHMiXSwibWFwcGluZ3MiOiJBQUFBQSxPQUFPQyxRQUNFLFNBQVVDLEdDR25CLFFBQUFDLEdBQUFDLEdBR0EsR0FBQUMsRUFBQUQsR0FDQSxNQUFBQyxHQUFBRCxHQUFBSCxPQUdBLElBQUFELEdBQUFLLEVBQUFELElBQ0FFLEVBQUFGLEVBQ0FHLEdBQUEsRUFDQU4sV0FVQSxPQU5BQyxHQUFBRSxHQUFBSSxLQUFBUixFQUFBQyxRQUFBRCxJQUFBQyxRQUFBRSxHQUdBSCxFQUFBTyxHQUFBLEVBR0FQLEVBQUFDLFFBdkJBLEdBQUFJLEtBK0RBLE9BbkNBRixHQUFBTSxFQUFBUCxFQUdBQyxFQUFBTyxFQUFBTCxFQUdBRixFQUFBRyxFQUFBLFNBQUFLLEdBQTJDLE1BQUFBLElBRzNDUixFQUFBUyxFQUFBLFNBQUFYLEVBQUFZLEVBQUFDLEdBQ0FYLEVBQUFZLEVBQUFkLEVBQUFZLElBQ0FHLE9BQUFDLGVBQUFoQixFQUFBWSxHQUNBSyxjQUFBLEVBQ0FDLFlBQUEsRUFDQUMsSUFBQU4sS0FNQVgsRUFBQWtCLEVBQUEsU0FBQXJCLEdBQ0EsR0FBQWMsR0FBQWQsS0FBQXNCLFdBQ0EsV0FBMkIsTUFBQXRCLEdBQUEsU0FDM0IsV0FBaUMsTUFBQUEsR0FFakMsT0FEQUcsR0FBQVMsRUFBQUUsRUFBQSxJQUFBQSxHQUNBQSxHQUlBWCxFQUFBWSxFQUFBLFNBQUFRLEVBQUFDLEdBQXNELE1BQUFSLFFBQUFTLFVBQUFDLGVBQUFsQixLQUFBZSxFQUFBQyxJQUd0RHJCLEVBQUF3QixFQUFBLEdBR0F4QixJQUFBeUIsRUFBQSxLRE9NLFNBQVU1QixFQUFRNkIsRUFBcUIxQixHQUU3QyxZRXRFZSxTQUFTMkIsR0FBeUJDLEdBQTBCLEdBQWxCQyxHQUFrQkMsVUFBQUMsT0FBQSxHQUFBQyxTQUFBRixVQUFBLEdBQUFBLFVBQUEsS0FD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RSxPQUFPRSxXQUt0QlosWUFBYXhELEVBQUEsVUFBVWxDLFFBL0JWaUQsRUFrQ1ZzRCxjQUNIbEIsSUFBSyxLQUNMTiwwQkFBMEIsRUFDMUJFLGNBQ0FkLElBQUssY0FDTHVCLGdCQXZDYXpDLEVBMENWOEMsYUFBZXRHLE9BQU9vQixLQUFLb0MsRUFBTXNELGNMK0Nnb0tqRyxFQUE2QixRS3pGcHJLMkMiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9XG4vKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRpOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGw6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4vKioqKioqLyBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4vKioqKioqLyBcdFx0XHRcdGdldDogZ2V0dGVyXG4vKioqKioqLyBcdFx0XHR9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMyk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBleHBvcnQgKGltbXV0YWJsZSkgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSBvbWl0S2V5c0Zyb21Tb3VyY2VPYmplY3Q7XG5mdW5jdGlvbiBvbWl0S2V5c0Zyb21Tb3VyY2VPYmplY3Qoc291cmNlKXt2YXIgb21pdHRlZEtleXM9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOltdO3JldHVybiBPYmplY3Qua2V5cyhzb3VyY2UpLnJlZHVjZShmdW5jdGlvbiByZWxvY2F0ZUFjY2VwdGVkS2V5cyhoYXNoLGtleSl7aWYob21pdHRlZEtleXMuaW5kZXhPZihrZXkpPT09LTEpe2hhc2hba2V5XT1zb3VyY2Vba2V5XTt9cmV0dXJuIGhhc2g7fSx7fSk7fVxuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2xhc3NuYW1lc1wiKTtcblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbnZhciBfZXh0ZW5kcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0YXJnZXQpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9YXJndW1lbnRzW2ldO2Zvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSxrZXkpKXt0YXJnZXRba2V5XT1zb3VyY2Vba2V5XTt9fX1yZXR1cm4gdGFyZ2V0O307dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoXCJ2YWx1ZVwiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKTt9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcjt9O30oKTtmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7fX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLGNhbGwpe2lmKCFzZWxmKXt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7fXJldHVybiBjYWxsJiYodHlwZW9mIGNhbGw9PT1cIm9iamVjdFwifHx0eXBlb2YgY2FsbD09PVwiZnVuY3Rpb25cIik/Y2FsbDpzZWxmO31mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT1cImZ1bmN0aW9uXCImJnN1cGVyQ2xhc3MhPT1udWxsKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2Ygc3VwZXJDbGFzcyk7fXN1YkNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MmJnN1cGVyQ2xhc3MucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6c3ViQ2xhc3MsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfX0pO2lmKHN1cGVyQ2xhc3MpT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcyxzdXBlckNsYXNzKTpzdWJDbGFzcy5fX3Byb3RvX189c3VwZXJDbGFzczt9dmFyIG5vb3A9ZnVuY3Rpb24gbm9vcCgpe307dmFyIEltYWdlPWZ1bmN0aW9uKF9SZWFjdCRQdXJlQ29tcG9uZW50KXtfaW5oZXJpdHMoSW1hZ2UsX1JlYWN0JFB1cmVDb21wb25lbnQpO2Z1bmN0aW9uIEltYWdlKCl7dmFyIF9yZWY7dmFyIF90ZW1wLF90aGlzLF9yZXQ7X2NsYXNzQ2FsbENoZWNrKHRoaXMsSW1hZ2UpO2Zvcih2YXIgX2xlbj1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkoX2xlbiksX2tleT0wO19rZXk8X2xlbjtfa2V5Kyspe2FyZ3NbX2tleV09YXJndW1lbnRzW19rZXldO31yZXR1cm4gX3JldD0oX3RlbXA9KF90aGlzPV9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKF9yZWY9SW1hZ2UuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoSW1hZ2UpKS5jYWxsLmFwcGx5KF9yZWYsW3RoaXNdLmNvbmNhdChhcmdzKSkpLF90aGlzKSxfdGhpcy5zdGF0ZT17c3RhdHVzOkltYWdlLnN0YXR1cy5MT0FESU5HfSxfdGVtcCksX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsX3JldCk7fV9jcmVhdGVDbGFzcyhJbWFnZSxbe2tleTonY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcycsdmFsdWU6ZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpe2lmKG5leHRQcm9wcy5zcmMhPT10aGlzLnByb3BzLnNyYyl7dGhpcy5yZXNldFByZWxvYWRlcigpO3RoaXMuc2V0U3RhdGUoe3N0YXR1czpJbWFnZS5zdGF0dXMuTE9BRElOR30pO319fSx7a2V5Oidjb21wb25lbnREaWRNb3VudCcsdmFsdWU6ZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKXt0aGlzLnByZWxvYWQoKTt9fSx7a2V5Oidjb21wb25lbnREaWRVcGRhdGUnLHZhbHVlOmZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpe3RoaXMucHJlbG9hZCgpO319LHtrZXk6J2NvbXBvbmVudFdpbGxVbm1vdW50Jyx2YWx1ZTpmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpe3RoaXMucmVzZXRQcmVsb2FkZXIoKTt9fSx7a2V5OidyZXNldFByZWxvYWRlcicsdmFsdWU6ZnVuY3Rpb24gcmVzZXRQcmVsb2FkZXIoKXt0aGlzLmxvYWRlci5vbmxvYWQ9bnVsbDt0aGlzLmxvYWRlci5vbmVycm9yPW51bGw7dGhpcy5sb2FkZXI9bnVsbDt9fSx7a2V5OidwcmVsb2FkJyx2YWx1ZTpmdW5jdGlvbiBwcmVsb2FkKCl7dmFyIF90aGlzMj10aGlzO2lmKHRoaXMubG9hZGVyKXtyZXR1cm47fXRoaXMubG9hZGVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO3RoaXMubG9hZGVyLm9ubG9hZD1mdW5jdGlvbigpe3JldHVybiBfdGhpczIuc2V0U3RhdGUoe3N0YXR1czpJbWFnZS5zdGF0dXMuTE9BREVEfSk7fTt0aGlzLmxvYWRlci5vbmVycm9yPWZ1bmN0aW9uKCl7cmV0dXJuIF90aGlzMi5zZXRTdGF0ZSh7c3RhdHVzOkltYWdlLnN0YXR1cy5FUlJPUn0pO307dGhpcy5sb2FkZXIuc3JjPXRoaXMucHJvcHMuc3JjO319LHtrZXk6J3JlbmRlckltYWdlJyx2YWx1ZTpmdW5jdGlvbiByZW5kZXJJbWFnZSgpe2lmKHRoaXMucHJvcHMuZGlzcGxheUFzQmFja2dyb3VuZEltYWdlKXtyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoJ2RpdicsX2V4dGVuZHMoe30sdGhpcy5wcm9wcy5pbWFnZVByb3BzLHtyZWY6J2ltYWdlJyxjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItaW1hZ2UnLHRoaXMucHJvcHMuaW1hZ2VQcm9wcy5jbGFzc05hbWUpLHRpdGxlOnRoaXMucHJvcHMuYWx0LHN0eWxlOl9leHRlbmRzKHt9LHRoaXMucHJvcHMuaW1hZ2VQcm9wcy5zdHlsZSx7YmFja2dyb3VuZEltYWdlOid1cmwoJyt0aGlzLnByb3BzLnNyYysnKSd9KX0pKTt9cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KCdpbWcnLF9leHRlbmRzKHt9LHRoaXMucHJvcHMuaW1hZ2VQcm9wcyx7cmVmOidpbWFnZScsY2xhc3NOYW1lOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCgpKCdiLWltYWdlJyx0aGlzLnByb3BzLmltYWdlUHJvcHMuY2xhc3NOYW1lKSxzcmM6dGhpcy5wcm9wcy5zcmMsYWx0OnRoaXMucHJvcHMuYWx0LG9uTG9hZDpub29wLG9uRXJyb3I6bm9vcH0pKTt9fSx7a2V5OidyZW5kZXJTdGF0dXMnLHZhbHVlOmZ1bmN0aW9uIHJlbmRlclN0YXR1cygpe3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudCgnZGl2JyxfZXh0ZW5kcyh7fSx0aGlzLnByb3BzLnN0YXR1c1Byb3BzLHtyZWY6J3N0YXR1cycsY2xhc3NOYW1lOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCgpKCdiLWltYWdlLXN0YXR1cycsdGhpcy5wcm9wcy5zdGF0dXNQcm9wcy5jbGFzc05hbWUseydiLWltYWdlLWxvYWRpbmcnOnRoaXMuc3RhdGUuc3RhdHVzPT09SW1hZ2Uuc3RhdHVzLkxPQURJTkcsJ2ItaW1hZ2UtbG9hZGVkJzp0aGlzLnN0YXRlLnN0YXR1cz09PUltYWdlLnN0YXR1cy5MT0FERUQsJ2ItaW1hZ2UtZXJyb3InOnRoaXMuc3RhdGUuc3RhdHVzPT09SW1hZ2Uuc3RhdHVzLkVSUk9SfSkscm9sZToncHJlc2VudGF0aW9uJ30pKTt9fSx7a2V5OidyZW5kZXInLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudCgnZGl2JyxfZXh0ZW5kcyh7fSxfX3dlYnBhY2tfcmVxdWlyZV9fLmkoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkodGhpcy5wcm9wcyxJbWFnZS5pbnRlcm5hbEtleXMpLHtyZWY6J3dyYXBwZXInLGNsYXNzTmFtZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQoKSgnYi1pbWFnZS13cmFwcGVyJyx0aGlzLnByb3BzLmNsYXNzTmFtZSl9KSx0aGlzLnJlbmRlckltYWdlKCksdGhpcy5yZW5kZXJTdGF0dXMoKSk7fX1dKTtyZXR1cm4gSW1hZ2U7fShfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuUHVyZUNvbXBvbmVudCk7SW1hZ2Uuc3RhdHVzPXtMT0FESU5HOidMT0FESU5HJyxMT0FERUQ6J0xPQURFRCcsRVJST1I6J0VSUk9SJ307SW1hZ2UucHJvcFR5cGVzPXthbHQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc3RyaW5nLGRpc3BsYXlBc0JhY2tncm91bmRJbWFnZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ib29sLGltYWdlUHJvcHM6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub2JqZWN0LHNyYzpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5zdHJpbmcuaXNSZXF1aXJlZCxzdGF0dXNQcm9wczpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5vYmplY3R9O0ltYWdlLmRlZmF1bHRQcm9wcz17YWx0Om51bGwsZGlzcGxheUFzQmFja2dyb3VuZEltYWdlOmZhbHNlLGltYWdlUHJvcHM6e30sc3JjOidhYm91dDpibGFuaycsc3RhdHVzUHJvcHM6e319O0ltYWdlLmludGVybmFsS2V5cz1PYmplY3Qua2V5cyhJbWFnZS5kZWZhdWx0UHJvcHMpOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSBJbWFnZTtcblxuLyoqKi8gfSlcbi8qKioqKiovIF0pO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBpbmRleC5qcyIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDMpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIGE2OGE1YjJjMzZjOTFlNDA1OTAwIiwiLyoqXG4gKiBSZXR1cm5zIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgc3VwcGxpZWQgb2JqZWN0IHdpdGhvdXQgdGhlIGdpdmVuIGtleXMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG9taXRLZXlzRnJvbVNvdXJjZU9iamVjdChzb3VyY2UsIG9taXR0ZWRLZXlzID0gW10pIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc291cmNlKS5yZWR1Y2UoZnVuY3Rpb24gcmVsb2NhdGVBY2NlcHRlZEtleXMoaGFzaCwga2V5KSB7XG4gICAgICAgIGlmIChvbWl0dGVkS2V5cy5pbmRleE9mKGtleSkgPT09IC0xKSB7XG4gICAgICAgICAgICBoYXNoW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYXNoO1xuICAgIH0sIHt9KTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMvaW5kZXguanMiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiY2xhc3NuYW1lc1wifVxuLy8gbW9kdWxlIGlkID0gMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0XCJ9XG4vLyBtb2R1bGUgaWQgPSAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCBSZWFjdCwge1Byb3BUeXBlc30gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGN4IGZyb20gJ2NsYXNzbmFtZXMnO1xuXG5pbXBvcnQgb21pdCBmcm9tICdib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzJztcblxuY29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuXG4vKipcbiMgSW1hZ2Vcbl9fQW4gaW1hZ2UgYmxvY2sgd2l0aCBwbGFjZWhvbGRlciBzdXBwb3J0IGZvciBsb2FkaW5nIGFuZCBmYWxsYmFjayBzY2VuYXJpb3MuX19cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW1hZ2UgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgc3RhdHVzID0ge1xuICAgICAgICBMT0FESU5HOiAnTE9BRElORycsXG4gICAgICAgIExPQURFRDogJ0xPQURFRCcsXG4gICAgICAgIEVSUk9SOiAnRVJST1InLFxuICAgIH1cblxuICAgIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhIHdyaXR0ZW4gZGVzY3JpcHRpb24gb2YgdGhlIGltYWdlIGZvciBzZWFyY2ggZW5naW5lcywgaG92ZXJ0ZXh0IGFuZCB0aG9zZSB1c2luZyBhY2Nlc3NpYmlsaXR5IHRlY2hub2xvZ2llczsgYXBwbGllZCB0byB0aGUgYC5iLWltYWdlYCBhcyB0aGUgSFRNTCBhdHRyaWJ1dGVzIGBhbHRgIG9yIGB0aXRsZWAsIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiByZW5kZXJlZCBub2RlXG4gICAgICAgICAqL1xuICAgICAgICBhbHQ6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGVtaXRzIHRoZSBpbWFnZSBhcyBhIGA8ZGl2PmAgd2l0aCBgYmFja2dyb3VuZC1pbWFnZWAgY3NzIHByb3BlcnR5IHNldCBpbnN0ZWFkIG9mIGA8aW1nPmBcbiAgICAgICAgICovXG4gICAgICAgIGRpc3BsYXlBc0JhY2tncm91bmRJbWFnZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFueSBbUmVhY3Qtc3VwcG9ydGVkIGF0dHJpYnV0ZV0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90YWdzLWFuZC1hdHRyaWJ1dGVzLmh0bWwjaHRtbC1hdHRyaWJ1dGVzKTsgYXBwbGllZCB0byB0aGUgYC5iLWltYWdlYCBub2RlXG4gICAgICAgICAqL1xuICAgICAgICBpbWFnZVByb3BzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhIHZhbGlkIHBhdGggdG8gdGhlIGRlc2lyZWQgaW1hZ2VcbiAgICAgICAgICovXG4gICAgICAgIHNyYzogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhbnkgW1JlYWN0LXN1cHBvcnRlZCBhdHRyaWJ1dGVdKGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdGFncy1hbmQtYXR0cmlidXRlcy5odG1sI2h0bWwtYXR0cmlidXRlcyk7IGFwcGxpZWQgdG8gdGhlIGAuYi1pbWFnZS1zdGF0dXNgIG5vZGVcbiAgICAgICAgICovXG4gICAgICAgIHN0YXR1c1Byb3BzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIH1cblxuICAgIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgICAgIGFsdDogbnVsbCxcbiAgICAgICAgZGlzcGxheUFzQmFja2dyb3VuZEltYWdlOiBmYWxzZSxcbiAgICAgICAgaW1hZ2VQcm9wczoge30sXG4gICAgICAgIHNyYzogJ2Fib3V0OmJsYW5rJyxcbiAgICAgICAgc3RhdHVzUHJvcHM6IHt9LFxuICAgIH1cblxuICAgIHN0YXRpYyBpbnRlcm5hbEtleXMgPSBPYmplY3Qua2V5cyhJbWFnZS5kZWZhdWx0UHJvcHMpXG5cbiAgICBzdGF0ZSA9IHtcbiAgICAgICAgc3RhdHVzOiBJbWFnZS5zdGF0dXMuTE9BRElORyxcbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgICBpZiAobmV4dFByb3BzLnNyYyAhPT0gdGhpcy5wcm9wcy5zcmMpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRQcmVsb2FkZXIoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe3N0YXR1czogSW1hZ2Uuc3RhdHVzLkxPQURJTkd9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICB0aGlzLnByZWxvYWQoKTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgICAgIHRoaXMucHJlbG9hZCgpO1xuICAgIH1cblxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICB0aGlzLnJlc2V0UHJlbG9hZGVyKCk7XG4gICAgfVxuXG4gICAgcmVzZXRQcmVsb2FkZXIoKSB7XG4gICAgICAgIHRoaXMubG9hZGVyLm9ubG9hZCA9IG51bGw7XG4gICAgICAgIHRoaXMubG9hZGVyLm9uZXJyb3IgPSBudWxsO1xuICAgICAgICB0aGlzLmxvYWRlciA9IG51bGw7XG4gICAgfVxuXG4gICAgcHJlbG9hZCgpIHtcbiAgICAgICAgaWYgKHRoaXMubG9hZGVyKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHRoaXMubG9hZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XG5cbiAgICAgICAgdGhpcy5sb2FkZXIub25sb2FkID0gKCkgPT4gdGhpcy5zZXRTdGF0ZSh7c3RhdHVzOiBJbWFnZS5zdGF0dXMuTE9BREVEfSk7XG4gICAgICAgIHRoaXMubG9hZGVyLm9uZXJyb3IgPSAoKSA9PiB0aGlzLnNldFN0YXRlKHtzdGF0dXM6IEltYWdlLnN0YXR1cy5FUlJPUn0pO1xuXG4gICAgICAgIHRoaXMubG9hZGVyLnNyYyA9IHRoaXMucHJvcHMuc3JjO1xuICAgIH1cblxuICAgIHJlbmRlckltYWdlKCkge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5kaXNwbGF5QXNCYWNrZ3JvdW5kSW1hZ2UpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICB7Li4udGhpcy5wcm9wcy5pbWFnZVByb3BzfVxuICAgICAgICAgICAgICAgICAgICByZWY9J2ltYWdlJ1xuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KCdiLWltYWdlJywgdGhpcy5wcm9wcy5pbWFnZVByb3BzLmNsYXNzTmFtZSl9XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPXt0aGlzLnByb3BzLmFsdH1cbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMucHJvcHMuaW1hZ2VQcm9wcy5zdHlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRJbWFnZTogYHVybCgke3RoaXMucHJvcHMuc3JjfSlgLFxuICAgICAgICAgICAgICAgICAgICB9fSAvPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgey4uLnRoaXMucHJvcHMuaW1hZ2VQcm9wc31cbiAgICAgICAgICAgICAgICByZWY9J2ltYWdlJ1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y3goJ2ItaW1hZ2UnLCB0aGlzLnByb3BzLmltYWdlUHJvcHMuY2xhc3NOYW1lKX1cbiAgICAgICAgICAgICAgICBzcmM9e3RoaXMucHJvcHMuc3JjfVxuICAgICAgICAgICAgICAgIGFsdD17dGhpcy5wcm9wcy5hbHR9XG4gICAgICAgICAgICAgICAgb25Mb2FkPXtub29wfVxuICAgICAgICAgICAgICAgIG9uRXJyb3I9e25vb3B9IC8+XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmVuZGVyU3RhdHVzKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiB7Li4udGhpcy5wcm9wcy5zdGF0dXNQcm9wc31cbiAgICAgICAgICAgICAgICAgcmVmPSdzdGF0dXMnXG4gICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y3goJ2ItaW1hZ2Utc3RhdHVzJywgdGhpcy5wcm9wcy5zdGF0dXNQcm9wcy5jbGFzc05hbWUsIHtcbiAgICAgICAgICAgICAgICAgICAgJ2ItaW1hZ2UtbG9hZGluZyc6IHRoaXMuc3RhdGUuc3RhdHVzID09PSBJbWFnZS5zdGF0dXMuTE9BRElORyxcbiAgICAgICAgICAgICAgICAgICAgJ2ItaW1hZ2UtbG9hZGVkJzogdGhpcy5zdGF0ZS5zdGF0dXMgPT09IEltYWdlLnN0YXR1cy5MT0FERUQsXG4gICAgICAgICAgICAgICAgICAgICdiLWltYWdlLWVycm9yJzogdGhpcy5zdGF0ZS5zdGF0dXMgPT09IEltYWdlLnN0YXR1cy5FUlJPUixcbiAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgIHJvbGU9J3ByZXNlbnRhdGlvbicgLz5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgey4uLm9taXQodGhpcy5wcm9wcywgSW1hZ2UuaW50ZXJuYWxLZXlzKX1cbiAgICAgICAgICAgICAgICByZWY9J3dyYXBwZXInXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjeCgnYi1pbWFnZS13cmFwcGVyJywgdGhpcy5wcm9wcy5jbGFzc05hbWUpfT5cbiAgICAgICAgICAgICAgICB7dGhpcy5yZW5kZXJJbWFnZSgpfVxuICAgICAgICAgICAgICAgIHt0aGlzLnJlbmRlclN0YXR1cygpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvYm91bmRsZXNzLWltYWdlL2luZGV4LmpzIl0sInNvdXJjZVJvb3QiOiIifQ== | ||
module.exports=function(t){function e(n){if(r[n])return r[n].exports;var o=r[n]={i:n,l:!1,exports:{}};return t[n].call(o.exports,o,o.exports,e),o.l=!0,o.exports}var r={};return e.m=t,e.c=r,e.i=function(t){return t},e.d=function(t,r,n){e.o(t,r)||Object.defineProperty(t,r,{configurable:!1,enumerable:!0,get:n})},e.n=function(t){var r=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(r,"a",r),r},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=4)}([function(t,e){t.exports=require("boundless-utils-omit-keys")},function(t,e){t.exports=require("boundless-utils-uuid")},function(t,e){t.exports=require("classnames")},function(t,e){t.exports=require("react")},function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var a=r(3),u=r.n(a),i=r(2),l=r.n(i),c=r(0),p=r.n(c),f=r(1),d=r.n(f),y=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(t[n]=r[n])}return t},h=function(){function t(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,r,n){return r&&t(e.prototype,r),n&&t(e,n),e}}(),b=function(t){function e(){var t,r,s,a;n(this,e);for(var u=arguments.length,i=Array(u),l=0;l<u;l++)i[l]=arguments[l];return r=s=o(this,(t=e.__proto__||Object.getPrototypeOf(e)).call.apply(t,[this].concat(i))),s.state={status:e.status.LOADING},a=r,o(s,a)}return s(e,t),h(e,[{key:"componentWillReceiveProps",value:function(t){t.src!==this.props.src&&(this.resetPreloader(),this.setState({status:e.status.LOADING}))}},{key:"componentDidMount",value:function(){this.preload()}},{key:"componentDidUpdate",value:function(){this.preload()}},{key:"componentWillUnmount",value:function(){this.resetPreloader()}},{key:"resetPreloader",value:function(){this.loader.onload=null,this.loader.onerror=null,this.loader=null}},{key:"preload",value:function(){var t=this;this.loader||(this.loader=document.createElement("img"),this.loader.onload=function(){return t.setState({status:e.status.LOADED})},this.loader.onerror=function(){return t.setState({status:e.status.ERROR})},this.loader.src=this.props.src)}},{key:"render",value:function(){return u.a.createElement(this.props.component,y({},p()(this.props,e.internalKeys),{className:l()("b-image",this.props.className,{"b-image-loading":this.state.status===e.status.LOADING,"b-image-loaded":this.state.status===e.status.LOADED,"b-image-error":this.state.status===e.status.ERROR}),title:this.props.alt,role:"img",style:y({},this.props.style,{backgroundImage:"url("+this.props.src+")"})})," ")}}]),e}(u.a.PureComponent);b.status={LOADING:d()(),LOADED:d()(),ERROR:d()()},b.propTypes={"*":a.PropTypes.any,alt:a.PropTypes.string,component:a.PropTypes.string,src:a.PropTypes.string.isRequired},b.defaultProps={alt:"",component:"div",src:"about:blank"},b.internalKeys=Object.keys(b.defaultProps),e.default=b}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIGYyNmRiMzAxNTJhMmJiMTVhOTRmIiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXV0aWxzLXV1aWRcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiY2xhc3NuYW1lc1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdFwifSIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9ib3VuZGxlc3MtaW1hZ2UvaW5kZXguanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJ2YWx1ZSIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwicmVxdWlyZSIsIl9fd2VicGFja19leHBvcnRzX18iLCJfY2xhc3NDYWxsQ2hlY2siLCJpbnN0YW5jZSIsIkNvbnN0cnVjdG9yIiwiVHlwZUVycm9yIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJzZWxmIiwiUmVmZXJlbmNlRXJyb3IiLCJfaW5oZXJpdHMiLCJzdWJDbGFzcyIsInN1cGVyQ2xhc3MiLCJjcmVhdGUiLCJjb25zdHJ1Y3RvciIsIndyaXRhYmxlIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfdXVpZF9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc191dWlkX19fZGVmYXVsdCIsIl9leHRlbmRzIiwiYXNzaWduIiwidGFyZ2V0IiwiYXJndW1lbnRzIiwibGVuZ3RoIiwic291cmNlIiwia2V5IiwiX2NyZWF0ZUNsYXNzIiwiZGVmaW5lUHJvcGVydGllcyIsInByb3BzIiwiZGVzY3JpcHRvciIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsIkltYWdlIiwiX1JlYWN0JFB1cmVDb21wb25lbnQiLCJfcmVmIiwiX3RlbXAiLCJfdGhpcyIsIl9yZXQiLCJ0aGlzIiwiX2xlbiIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJnZXRQcm90b3R5cGVPZiIsImFwcGx5IiwiY29uY2F0Iiwic3RhdGUiLCJzdGF0dXMiLCJMT0FESU5HIiwibmV4dFByb3BzIiwic3JjIiwicmVzZXRQcmVsb2FkZXIiLCJzZXRTdGF0ZSIsInByZWxvYWQiLCJsb2FkZXIiLCJvbmxvYWQiLCJvbmVycm9yIiwiX3RoaXMyIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiTE9BREVEIiwiRVJST1IiLCJhIiwiY29tcG9uZW50IiwiaW50ZXJuYWxLZXlzIiwiY2xhc3NOYW1lIiwiYi1pbWFnZS1sb2FkaW5nIiwiYi1pbWFnZS1sb2FkZWQiLCJiLWltYWdlLWVycm9yIiwidGl0bGUiLCJhbHQiLCJyb2xlIiwic3R5bGUiLCJiYWNrZ3JvdW5kSW1hZ2UiLCJQdXJlQ29tcG9uZW50IiwicHJvcFR5cGVzIiwiKiIsImFueSIsInN0cmluZyIsImlzUmVxdWlyZWQiLCJkZWZhdWx0UHJvcHMiLCJrZXlzIl0sIm1hcHBpbmdzIjoiQUFBQUEsT0FBT0MsUUFDRSxTQUFVQyxHQ0duQixRQUFBQyxHQUFBQyxHQUdBLEdBQUFDLEVBQUFELEdBQ0EsTUFBQUMsR0FBQUQsR0FBQUgsT0FHQSxJQUFBRCxHQUFBSyxFQUFBRCxJQUNBRSxFQUFBRixFQUNBRyxHQUFBLEVBQ0FOLFdBVUEsT0FOQUMsR0FBQUUsR0FBQUksS0FBQVIsRUFBQUMsUUFBQUQsSUFBQUMsUUFBQUUsR0FHQUgsRUFBQU8sR0FBQSxFQUdBUCxFQUFBQyxRQXZCQSxHQUFBSSxLQStEQSxPQW5DQUYsR0FBQU0sRUFBQVAsRUFHQUMsRUFBQU8sRUFBQUwsRUFHQUYsRUFBQUcsRUFBQSxTQUFBSyxHQUEyQyxNQUFBQSxJQUczQ1IsRUFBQVMsRUFBQSxTQUFBWCxFQUFBWSxFQUFBQyxHQUNBWCxFQUFBWSxFQUFBZCxFQUFBWSxJQUNBRyxPQUFBQyxlQUFBaEIsRUFBQVksR0FDQUssY0FBQSxFQUNBQyxZQUFBLEVBQ0FDLElBQUFOLEtBTUFYLEVBQUFrQixFQUFBLFNBQUFyQixHQUNBLEdBQUFjLEdBQUFkLEtBQUFzQixXQUNBLFdBQTJCLE1BQUF0QixHQUFBLFNBQzNCLFdBQWlDLE1BQUFBLEdBRWpDLE9BREFHLEdBQUFTLEVBQUFFLEVBQUEsSUFBQUEsR0FDQUEsR0FJQVgsRUFBQVksRUFBQSxTQUFBUSxFQUFBQyxHQUFzRCxNQUFBUixRQUFBUyxVQUFBQyxlQUFBbEIsS0FBQWUsRUFBQUMsSUFHdERyQixFQUFBd0IsRUFBQSxHQUdBeEIsSUFBQXlCLEVBQUEsS0RPTSxTQUFVNUIsRUFBUUMsR0V2RXhCRCxFQUFBQyxRQUFBNEIsUUFB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USxNQUFNQyxTQUFXZixFQUFNZSxPQUFPYyxRQUV4RFEsTUFBTy9CLEtBQUtWLE1BQU0wQyxJQUNsQkMsS0FBSyxNQUNMQyxNQUFBckQsS0FDT21CLEtBQUtWLE1BQU00QyxPQUNkQyx1QkFBd0JuQyxLQUFLVixNQUFNc0IsSUFBbkMsUUFYUixTTjJCNC9HbEIsR01sR3IrR3BCLEVBQUFrRCxFQUFNWSxjQUFwQjFDLEdBQ1ZlLFFBQ0hDLFFBQVM5QixNQUNUMEMsT0FBUTFDLE1BQ1IyQyxNQUFPM0MsT0FKTWMsRUFPVjJDLFdBSUhDLElBQUtqRSxFQUFBLFVBQVVrRSxJQUtmUCxJQUFLM0QsRUFBQSxVQUFVbUUsT0FLZmYsVUFBV3BELEVBQUEsVUFBVW1FLE9BS3JCNUIsSUFBS3ZDLEVBQUEsVUFBVW1FLE9BQU9DLFlBMUJUL0MsRUE2QlZnRCxjQUNIVixJQUFLLEdBQ0xQLFVBQVcsTUFDWGIsSUFBSyxlQWhDUWxCLEVBbUNWZ0MsYUFBZW5GLE9BQU9vRyxLQUFLakQsRUFBTWdELGNOK0RncUlyRixFQUE2QixRTWxHcHRJcUMiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9XG4vKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRpOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGw6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4vKioqKioqLyBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4vKioqKioqLyBcdFx0XHRcdGdldDogZ2V0dGVyXG4vKioqKioqLyBcdFx0XHR9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gNCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIik7XG5cbi8qKiovIH0pLFxuLyogMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtdXRpbHMtdXVpZFwiKTtcblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNsYXNzbmFtZXNcIik7XG5cbi8qKiovIH0pLFxuLyogMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxuLyoqKi8gfSksXG4vKiA0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KF9fd2VicGFja19leHBvcnRzX18sIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfdXVpZF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX3V1aWRfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfdXVpZF9fKTtcbnZhciBfZXh0ZW5kcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0YXJnZXQpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9YXJndW1lbnRzW2ldO2Zvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSxrZXkpKXt0YXJnZXRba2V5XT1zb3VyY2Vba2V5XTt9fX1yZXR1cm4gdGFyZ2V0O307dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoXCJ2YWx1ZVwiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKTt9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcjt9O30oKTtmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7fX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLGNhbGwpe2lmKCFzZWxmKXt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7fXJldHVybiBjYWxsJiYodHlwZW9mIGNhbGw9PT1cIm9iamVjdFwifHx0eXBlb2YgY2FsbD09PVwiZnVuY3Rpb25cIik/Y2FsbDpzZWxmO31mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT1cImZ1bmN0aW9uXCImJnN1cGVyQ2xhc3MhPT1udWxsKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2Ygc3VwZXJDbGFzcyk7fXN1YkNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MmJnN1cGVyQ2xhc3MucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6c3ViQ2xhc3MsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfX0pO2lmKHN1cGVyQ2xhc3MpT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcyxzdXBlckNsYXNzKTpzdWJDbGFzcy5fX3Byb3RvX189c3VwZXJDbGFzczt9dmFyIEltYWdlPWZ1bmN0aW9uKF9SZWFjdCRQdXJlQ29tcG9uZW50KXtfaW5oZXJpdHMoSW1hZ2UsX1JlYWN0JFB1cmVDb21wb25lbnQpO2Z1bmN0aW9uIEltYWdlKCl7dmFyIF9yZWY7dmFyIF90ZW1wLF90aGlzLF9yZXQ7X2NsYXNzQ2FsbENoZWNrKHRoaXMsSW1hZ2UpO2Zvcih2YXIgX2xlbj1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkoX2xlbiksX2tleT0wO19rZXk8X2xlbjtfa2V5Kyspe2FyZ3NbX2tleV09YXJndW1lbnRzW19rZXldO31yZXR1cm4gX3JldD0oX3RlbXA9KF90aGlzPV9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKF9yZWY9SW1hZ2UuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoSW1hZ2UpKS5jYWxsLmFwcGx5KF9yZWYsW3RoaXNdLmNvbmNhdChhcmdzKSkpLF90aGlzKSxfdGhpcy5zdGF0ZT17c3RhdHVzOkltYWdlLnN0YXR1cy5MT0FESU5HfSxfdGVtcCksX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsX3JldCk7fV9jcmVhdGVDbGFzcyhJbWFnZSxbe2tleTonY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcycsdmFsdWU6ZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpe2lmKG5leHRQcm9wcy5zcmMhPT10aGlzLnByb3BzLnNyYyl7dGhpcy5yZXNldFByZWxvYWRlcigpO3RoaXMuc2V0U3RhdGUoe3N0YXR1czpJbWFnZS5zdGF0dXMuTE9BRElOR30pO319fSx7a2V5Oidjb21wb25lbnREaWRNb3VudCcsdmFsdWU6ZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKXt0aGlzLnByZWxvYWQoKTt9fSx7a2V5Oidjb21wb25lbnREaWRVcGRhdGUnLHZhbHVlOmZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpe3RoaXMucHJlbG9hZCgpO319LHtrZXk6J2NvbXBvbmVudFdpbGxVbm1vdW50Jyx2YWx1ZTpmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpe3RoaXMucmVzZXRQcmVsb2FkZXIoKTt9fSx7a2V5OidyZXNldFByZWxvYWRlcicsdmFsdWU6ZnVuY3Rpb24gcmVzZXRQcmVsb2FkZXIoKXt0aGlzLmxvYWRlci5vbmxvYWQ9bnVsbDt0aGlzLmxvYWRlci5vbmVycm9yPW51bGw7dGhpcy5sb2FkZXI9bnVsbDt9fSx7a2V5OidwcmVsb2FkJyx2YWx1ZTpmdW5jdGlvbiBwcmVsb2FkKCl7dmFyIF90aGlzMj10aGlzO2lmKHRoaXMubG9hZGVyKXtyZXR1cm47fXRoaXMubG9hZGVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO3RoaXMubG9hZGVyLm9ubG9hZD1mdW5jdGlvbigpe3JldHVybiBfdGhpczIuc2V0U3RhdGUoe3N0YXR1czpJbWFnZS5zdGF0dXMuTE9BREVEfSk7fTt0aGlzLmxvYWRlci5vbmVycm9yPWZ1bmN0aW9uKCl7cmV0dXJuIF90aGlzMi5zZXRTdGF0ZSh7c3RhdHVzOkltYWdlLnN0YXR1cy5FUlJPUn0pO307dGhpcy5sb2FkZXIuc3JjPXRoaXMucHJvcHMuc3JjO319LHtrZXk6J3JlbmRlcicsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyKCl7cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KHRoaXMucHJvcHMuY29tcG9uZW50LF9leHRlbmRzKHt9LF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCgpKHRoaXMucHJvcHMsSW1hZ2UuaW50ZXJuYWxLZXlzKSx7Y2xhc3NOYW1lOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCgpKCdiLWltYWdlJyx0aGlzLnByb3BzLmNsYXNzTmFtZSx7J2ItaW1hZ2UtbG9hZGluZyc6dGhpcy5zdGF0ZS5zdGF0dXM9PT1JbWFnZS5zdGF0dXMuTE9BRElORywnYi1pbWFnZS1sb2FkZWQnOnRoaXMuc3RhdGUuc3RhdHVzPT09SW1hZ2Uuc3RhdHVzLkxPQURFRCwnYi1pbWFnZS1lcnJvcic6dGhpcy5zdGF0ZS5zdGF0dXM9PT1JbWFnZS5zdGF0dXMuRVJST1J9KSx0aXRsZTp0aGlzLnByb3BzLmFsdCxyb2xlOidpbWcnLHN0eWxlOl9leHRlbmRzKHt9LHRoaXMucHJvcHMuc3R5bGUse2JhY2tncm91bmRJbWFnZTondXJsKCcrdGhpcy5wcm9wcy5zcmMrJyknfSl9KSwnXFx4QTAnKTt9fV0pO3JldHVybiBJbWFnZTt9KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5QdXJlQ29tcG9uZW50KTtJbWFnZS5zdGF0dXM9e0xPQURJTkc6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc191dWlkX19fZGVmYXVsdCgpKCksTE9BREVEOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfdXVpZF9fX2RlZmF1bHQoKSgpLEVSUk9SOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfdXVpZF9fX2RlZmF1bHQoKSgpfTtJbWFnZS5wcm9wVHlwZXM9eycqJzpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5hbnksYWx0Ol9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLnN0cmluZyxjb21wb25lbnQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc3RyaW5nLHNyYzpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5zdHJpbmcuaXNSZXF1aXJlZH07SW1hZ2UuZGVmYXVsdFByb3BzPXthbHQ6JycsY29tcG9uZW50OidkaXYnLHNyYzonYWJvdXQ6YmxhbmsnfTtJbWFnZS5pbnRlcm5hbEtleXM9T2JqZWN0LmtleXMoSW1hZ2UuZGVmYXVsdFByb3BzKTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gSW1hZ2U7XG5cbi8qKiovIH0pXG4vKioqKioqLyBdKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gaW5kZXguanMiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA0KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCBmMjZkYjMwMTUyYTJiYjE1YTk0ZiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzXCJ9XG4vLyBtb2R1bGUgaWQgPSAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy11dGlscy11dWlkXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXV0aWxzLXV1aWRcIn1cbi8vIG1vZHVsZSBpZCA9IDFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2xhc3NuYW1lc1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImNsYXNzbmFtZXNcIn1cbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdFwifVxuLy8gbW9kdWxlIGlkID0gM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgUmVhY3QsIHtQcm9wVHlwZXN9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjeCBmcm9tICdjbGFzc25hbWVzJztcblxuaW1wb3J0IG9taXQgZnJvbSAnYm91bmRsZXNzLXV0aWxzLW9taXQta2V5cyc7XG5pbXBvcnQgdXVpZCBmcm9tICdib3VuZGxlc3MtdXRpbHMtdXVpZCc7XG5cbi8qKlxuX19BbiBpbWFnZSBibG9jayB3aXRoIHBsYWNlaG9sZGVyIHN1cHBvcnQgZm9yIGxvYWRpbmcgYW5kIGZhbGxiYWNrIHNjZW5hcmlvcy5fX1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbWFnZSBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xuICAgIHN0YXRpYyBzdGF0dXMgPSB7XG4gICAgICAgIExPQURJTkc6IHV1aWQoKSxcbiAgICAgICAgTE9BREVEOiB1dWlkKCksXG4gICAgICAgIEVSUk9SOiB1dWlkKCksXG4gICAgfVxuXG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFueSBbUmVhY3Qtc3VwcG9ydGVkIGF0dHJpYnV0ZV0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90YWdzLWFuZC1hdHRyaWJ1dGVzLmh0bWwjaHRtbC1hdHRyaWJ1dGVzKVxuICAgICAgICAgKi9cbiAgICAgICAgJyonOiBQcm9wVHlwZXMuYW55LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhIHdyaXR0ZW4gZGVzY3JpcHRpb24gb2YgdGhlIGltYWdlIGZvciBzZWFyY2ggZW5naW5lcywgaG92ZXJ0ZXh0IGFuZCB0aG9zZSB1c2luZyBhY2Nlc3NpYmlsaXR5IHRlY2hub2xvZ2llc1xuICAgICAgICAgKi9cbiAgICAgICAgYWx0OiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBvdmVycmlkZXMgdGhlIGNvbXBvbmVudCBIVE1MIHRhZ1xuICAgICAgICAgKi9cbiAgICAgICAgY29tcG9uZW50OiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhIHZhbGlkIHBhdGggdG8gdGhlIGRlc2lyZWQgaW1hZ2VcbiAgICAgICAgICovXG4gICAgICAgIHNyYzogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIH1cblxuICAgIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgICAgIGFsdDogJycsXG4gICAgICAgIGNvbXBvbmVudDogJ2RpdicsXG4gICAgICAgIHNyYzogJ2Fib3V0OmJsYW5rJyxcbiAgICB9XG5cbiAgICBzdGF0aWMgaW50ZXJuYWxLZXlzID0gT2JqZWN0LmtleXMoSW1hZ2UuZGVmYXVsdFByb3BzKVxuXG4gICAgc3RhdGUgPSB7XG4gICAgICAgIHN0YXR1czogSW1hZ2Uuc3RhdHVzLkxPQURJTkcsXG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICAgICAgaWYgKG5leHRQcm9wcy5zcmMgIT09IHRoaXMucHJvcHMuc3JjKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0UHJlbG9hZGVyKCk7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtzdGF0dXM6IEltYWdlLnN0YXR1cy5MT0FESU5HfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRNb3VudCgpICAgICB7IHRoaXMucHJlbG9hZCgpOyB9XG4gICAgY29tcG9uZW50RGlkVXBkYXRlKCkgICAgeyB0aGlzLnByZWxvYWQoKTsgfVxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkgIHsgdGhpcy5yZXNldFByZWxvYWRlcigpOyB9XG5cbiAgICByZXNldFByZWxvYWRlcigpIHtcbiAgICAgICAgdGhpcy5sb2FkZXIub25sb2FkID0gbnVsbDtcbiAgICAgICAgdGhpcy5sb2FkZXIub25lcnJvciA9IG51bGw7XG4gICAgICAgIHRoaXMubG9hZGVyID0gbnVsbDtcbiAgICB9XG5cbiAgICBwcmVsb2FkKCkge1xuICAgICAgICBpZiAodGhpcy5sb2FkZXIpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgdGhpcy5sb2FkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcblxuICAgICAgICB0aGlzLmxvYWRlci5vbmxvYWQgPSAoKSA9PiB0aGlzLnNldFN0YXRlKHtzdGF0dXM6IEltYWdlLnN0YXR1cy5MT0FERUR9KTtcbiAgICAgICAgdGhpcy5sb2FkZXIub25lcnJvciA9ICgpID0+IHRoaXMuc2V0U3RhdGUoe3N0YXR1czogSW1hZ2Uuc3RhdHVzLkVSUk9SfSk7XG5cbiAgICAgICAgdGhpcy5sb2FkZXIuc3JjID0gdGhpcy5wcm9wcy5zcmM7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPHRoaXMucHJvcHMuY29tcG9uZW50XG4gICAgICAgICAgICAgICAgey4uLm9taXQodGhpcy5wcm9wcywgSW1hZ2UuaW50ZXJuYWxLZXlzKX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KCdiLWltYWdlJywgdGhpcy5wcm9wcy5jbGFzc05hbWUsIHtcbiAgICAgICAgICAgICAgICAgICAgJ2ItaW1hZ2UtbG9hZGluZyc6IHRoaXMuc3RhdGUuc3RhdHVzID09PSBJbWFnZS5zdGF0dXMuTE9BRElORyxcbiAgICAgICAgICAgICAgICAgICAgJ2ItaW1hZ2UtbG9hZGVkJzogdGhpcy5zdGF0ZS5zdGF0dXMgPT09IEltYWdlLnN0YXR1cy5MT0FERUQsXG4gICAgICAgICAgICAgICAgICAgICdiLWltYWdlLWVycm9yJzogdGhpcy5zdGF0ZS5zdGF0dXMgPT09IEltYWdlLnN0YXR1cy5FUlJPUixcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICB0aXRsZT17dGhpcy5wcm9wcy5hbHR9XG4gICAgICAgICAgICAgICAgcm9sZT0naW1nJ1xuICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMucHJvcHMuc3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRJbWFnZTogYHVybCgke3RoaXMucHJvcHMuc3JjfSlgLFxuICAgICAgICAgICAgICAgIH19PlxuICAgICAgICAgICAgICAgICZuYnNwO1xuICAgICAgICAgICAgPC90aGlzLnByb3BzLmNvbXBvbmVudD5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9ib3VuZGxlc3MtaW1hZ2UvaW5kZXguanMiXSwic291cmNlUm9vdCI6IiJ9 |
@@ -5,7 +5,5 @@ import React, {PropTypes} from 'react'; | ||
import omit from 'boundless-utils-omit-keys'; | ||
import uuid from 'boundless-utils-uuid'; | ||
const noop = () => {}; | ||
/** | ||
# Image | ||
__An image block with placeholder support for loading and fallback scenarios.__ | ||
@@ -15,5 +13,5 @@ */ | ||
static status = { | ||
LOADING: 'LOADING', | ||
LOADED: 'LOADED', | ||
ERROR: 'ERROR', | ||
LOADING: uuid(), | ||
LOADED: uuid(), | ||
ERROR: uuid(), | ||
} | ||
@@ -23,15 +21,15 @@ | ||
/** | ||
* a written description of the image for search engines, hovertext and those using accessibility technologies; applied to the `.b-image` as the HTML attributes `alt` or `title`, depending on the type of rendered node | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
alt: PropTypes.string, | ||
'*': PropTypes.any, | ||
/** | ||
* emits the image as a `<div>` with `background-image` css property set instead of `<img>` | ||
* a written description of the image for search engines, hovertext and those using accessibility technologies | ||
*/ | ||
displayAsBackgroundImage: PropTypes.bool, | ||
alt: PropTypes.string, | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-image` node | ||
* overrides the component HTML tag | ||
*/ | ||
imageProps: PropTypes.object, | ||
component: PropTypes.string, | ||
@@ -42,15 +40,8 @@ /** | ||
src: PropTypes.string.isRequired, | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-image-status` node | ||
*/ | ||
statusProps: PropTypes.object, | ||
} | ||
static defaultProps = { | ||
alt: null, | ||
displayAsBackgroundImage: false, | ||
imageProps: {}, | ||
alt: '', | ||
component: 'div', | ||
src: 'about:blank', | ||
statusProps: {}, | ||
} | ||
@@ -71,14 +62,6 @@ | ||
componentDidMount() { | ||
this.preload(); | ||
} | ||
componentDidMount() { this.preload(); } | ||
componentDidUpdate() { this.preload(); } | ||
componentWillUnmount() { this.resetPreloader(); } | ||
componentDidUpdate() { | ||
this.preload(); | ||
} | ||
componentWillUnmount() { | ||
this.resetPreloader(); | ||
} | ||
resetPreloader() { | ||
@@ -101,53 +84,21 @@ this.loader.onload = null; | ||
renderImage() { | ||
if (this.props.displayAsBackgroundImage) { | ||
return ( | ||
<div | ||
{...this.props.imageProps} | ||
ref='image' | ||
className={cx('b-image', this.props.imageProps.className)} | ||
title={this.props.alt} | ||
style={{ | ||
...this.props.imageProps.style, | ||
backgroundImage: `url(${this.props.src})`, | ||
}} /> | ||
); | ||
} | ||
render() { | ||
return ( | ||
<img | ||
{...this.props.imageProps} | ||
ref='image' | ||
className={cx('b-image', this.props.imageProps.className)} | ||
src={this.props.src} | ||
alt={this.props.alt} | ||
onLoad={noop} | ||
onError={noop} /> | ||
); | ||
} | ||
renderStatus() { | ||
return ( | ||
<div {...this.props.statusProps} | ||
ref='status' | ||
className={cx('b-image-status', this.props.statusProps.className, { | ||
<this.props.component | ||
{...omit(this.props, Image.internalKeys)} | ||
className={cx('b-image', this.props.className, { | ||
'b-image-loading': this.state.status === Image.status.LOADING, | ||
'b-image-loaded': this.state.status === Image.status.LOADED, | ||
'b-image-error': this.state.status === Image.status.ERROR, | ||
})} | ||
role='presentation' /> | ||
})} | ||
title={this.props.alt} | ||
role='img' | ||
style={{ | ||
...this.props.style, | ||
backgroundImage: `url(${this.props.src})`, | ||
}}> | ||
| ||
</this.props.component> | ||
); | ||
} | ||
render() { | ||
return ( | ||
<div | ||
{...omit(this.props, Image.internalKeys)} | ||
ref='wrapper' | ||
className={cx('b-image-wrapper', this.props.className)}> | ||
{this.renderImage()} | ||
{this.renderStatus()} | ||
</div> | ||
); | ||
} | ||
} |
{ | ||
"name": "boundless-image", | ||
"version": "1.0.0-beta.5", | ||
"version": "1.0.0-beta.7", | ||
"description": "An image block with placeholder support for loading and fallback scenarios.", | ||
@@ -27,3 +27,4 @@ "main": "build/index.js", | ||
"dependencies": { | ||
"boundless-utils-omit-keys": "^1.0.0-beta.5", | ||
"boundless-utils-omit-keys": "^1.0.0-beta.7", | ||
"boundless-utils-uuid": "^1.0.0-beta.7", | ||
"classnames": "^2.1.5" | ||
@@ -30,0 +31,0 @@ }, |
@@ -0,70 +1,122 @@ | ||
<!--- | ||
THIS IS AN AUTOGENERATED FILE. EDIT INDEX.JS INSTEAD. | ||
--> | ||
# Image | ||
# Image | ||
__An image block with placeholder support for loading and fallback scenarios.__ | ||
## Example Usage | ||
```jsx | ||
import React from 'react'; | ||
import Button from '../../boundless-button/index'; | ||
import Image from '../index'; | ||
export default class ImageDemo extends React.PureComponent { | ||
state = { | ||
normal: Date.now(), | ||
delayed: Date.now(), | ||
error: Date.now(), | ||
} | ||
remountImage(refName) { | ||
this.setState({[refName]: Date.now()}); | ||
} | ||
render() { | ||
return ( | ||
<div className='demo-image spread center'> | ||
<figure> | ||
<h5>Normal</h5> | ||
<Image | ||
ref='normal' | ||
src={`https://c2.staticflickr.com/6/5128/5288605976_9b06c0de8f_b.jpg?${this.state.normal}`} | ||
alt='A snowy drive.' /> | ||
<Button | ||
onPressed={this.remountImage.bind(this, 'normal')} | ||
style={{marginTop: '1rem'}}> | ||
Remount Image | ||
</Button> | ||
</figure> | ||
<figure> | ||
<h5>Delayed</h5> | ||
<Image | ||
ref='delayed' | ||
src={`http://deelay.me/5000/http://igcdn-photos-g-a.akamaihd.net/hphotos-ak-xfa1/t51.2885-15/11244434_646274218842534_532892887_n.jpg?${this.state.delayed}`} | ||
alt='A beachscape.' /> | ||
<Button onPressed={this.remountImage.bind(this, 'delayed')} | ||
style={{marginTop: '1rem'}}> | ||
Remount Image | ||
</Button> | ||
</figure> | ||
<figure> | ||
<h5>Errored Out</h5> | ||
<Image | ||
ref='error' | ||
src={`http://www.flickr.com/1o2k3ok1231?${this.state.error}`} | ||
alt='A dead image.' /> | ||
<Button | ||
onPressed={this.remountImage.bind(this, 'error')} | ||
style={{marginTop: '1rem'}}> | ||
Remount Image | ||
</Button> | ||
</figure> | ||
</div> | ||
); | ||
} | ||
} | ||
``` | ||
## Props | ||
_Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/Image#props)._ | ||
> Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/Image#props). | ||
### Required Props | ||
<table> | ||
<tr> | ||
<th>Name</th> | ||
<th>Type</th> | ||
<th>Default Value</th> | ||
<th>Description</th> | ||
</tr> | ||
- __`src`__ ・ a valid path to the desired image | ||
<tr> | ||
<td>src</td> | ||
<td><pre><code>string</code></pre></td> | ||
<td><pre><code class="language-js">'about:blank'</code></pre></td> | ||
<td>a valid path to the desired image</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`string` | `'about:blank'` | ||
</table> | ||
### Optional Props | ||
<table> | ||
<tr> | ||
<th>Name</th> | ||
<th>Type</th> | ||
<th>Default Value</th> | ||
<th>Description</th> | ||
</tr> | ||
- __`*`__ ・ any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
<tr> | ||
<td>alt</td> | ||
<td><pre><code>string</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>a written description of the image for search engines, hovertext and those using accessibility technologies; applied to the `.b-image` as the HTML attributes `alt` or `title`, depending on the type of rendered node</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any` | `n/a` | ||
<tr> | ||
<td>displayAsBackgroundImage</td> | ||
<td><pre><code>bool</code></pre></td> | ||
<td><pre><code class="language-js">false</code></pre></td> | ||
<td>emits the image as a `<div>` with `background-image` css property set instead of `<img>`</td> | ||
</tr> | ||
- __`alt`__ ・ a written description of the image for search engines, hovertext and those using accessibility technologies | ||
<tr> | ||
<td>imageProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-image` node</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`string` | `''` | ||
<tr> | ||
<td>statusProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-image-status` node</td> | ||
</tr> | ||
- __`component`__ ・ overrides the component HTML tag | ||
</table> | ||
Expects | Default Value | ||
- | - | ||
`string` | `'div'` | ||
## Reference Styles | ||
### Stylus | ||
```stylus | ||
// Bring in Boundless's base Stylus variables | ||
@require "node_modules/boundless-image/variables" | ||
// Redefine any variables as desired, e.g. | ||
color-accent = royalblue | ||
// Bring in the component styles; they will be autoconfigured based on the above | ||
@require "node_modules/boundless-image/style" | ||
``` | ||
### CSS | ||
If desired, a precompiled plain CSS stylesheet is available for customization at `/build/style.css`, based on Boundless's [default variables](https://github.com/enigma-io/boundless/blob/master/variables.styl). | ||
@@ -1,2 +0,2 @@ | ||
module.exports=function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=3)}([function(e,t,n){"use strict";function r(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Object.keys(e).reduce(function(n,r){return t.indexOf(r)===-1&&(n[r]=e[r]),n},{})}t.a=r},function(e,t){e.exports=require("classnames")},function(e,t){e.exports=require("react")},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function u(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=n(2),p=n.n(s),i=n(1),a=n.n(i),l=n(0),c=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},f=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),h=function(e){return"function"==typeof e},d=function(e){function t(){var e,n,u,s;r(this,t);for(var p=arguments.length,i=Array(p),a=0;a<p;a++)i[a]=arguments[a];return n=u=o(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(i))),u.state={input:"",isControlled:"string"==typeof u.props.inputProps.value,isFocused:!1},u.setInputValue=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return u.setState({input:e})},u.getValue=function(){return u.refs.field.value},u.handleBlur=function(e){u.setState({isFocused:!1}),h(u.props.inputProps.onBlur)===!0&&u.props.inputProps.onBlur(e)},u.handleFocus=function(e){u.setState({isFocused:!0}),h(u.props.inputProps.onFocus)===!0&&u.props.inputProps.onFocus(e)},u.handleChange=function(e){u.state.isControlled===!1&&u.setInputValue(e.target.value),h(u.props.inputProps.onChange)===!0&&u.props.inputProps.onChange(e)},s=n,o(u,s)}return u(t,e),f(t,[{key:"componentWillMount",value:function(){return this.state.isControlled===!0?this.setInputValue(this.props.inputProps.value):void this.setInputValue(this.props.inputProps.defaultValue)}},{key:"componentWillReceiveProps",value:function(e){e.inputProps.value!==this.props.inputProps.value&&this.setInputValue(e.inputProps.value)}},{key:"setValue",value:function(e){this.setInputValue(e),this.refs.field.value=e,this.state.isControlled===!0&&(this.refs.field.dispatchEvent(new Event("input",{bubbles:!0})),this.refs.field.dispatchEvent(new Event("change",{bubbles:!0})))}},{key:"getPlaceholderText",value:function(){var e=""!==this.state.input,t=this.props.hidePlaceholderOnFocus===!0?this.state.isFocused===!1&&e===!1:e===!1;return t?this.props.inputProps.placeholder:""}},{key:"renderPlaceholder",value:function(){return p.a.createElement("div",{ref:"placeholder",className:"b-input-placeholder b-input"},this.getPlaceholderText())}},{key:"render",value:function(){var e=this.props;return p.a.createElement("div",c({},n.i(l.a)(e,t.internalKeys),{ref:"wrapper",className:a()("b-input-wrapper",e.className),title:this.getPlaceholderText()}),this.renderPlaceholder(),p.a.createElement("input",c({},e.inputProps,{ref:"field",className:a()("b-input",e.inputProps.className),placeholder:null,onBlur:this.handleBlur,onFocus:this.handleFocus,onChange:this.handleChange})))}}]),t}(p.a.PureComponent);d.propTypes={hidePlaceholderOnFocus:s.PropTypes.bool,inputProps:s.PropTypes.shape({defaultValue:s.PropTypes.string,onBlur:s.PropTypes.func,onFocus:s.PropTypes.func,onChange:s.PropTypes.func,placeholder:s.PropTypes.string,type:s.PropTypes.string,value:s.PropTypes.string})},d.defaultProps={hidePlaceholderOnFocus:!0,inputProps:{type:"text"}},d.internalKeys=Object.keys(d.defaultProps),t.default=d}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIDJkM2Y3YjA0OWFkZWMzNWZlZDM0Iiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiY2xhc3NuYW1lc1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdFwifSIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9ib3VuZGxlc3MtaW5wdXQvaW5kZXguanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJ2YWx1ZSIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiX193ZWJwYWNrX2V4cG9ydHNfXyIsIm9taXRLZXlzRnJvbVNvdXJjZU9iamVjdCIsInNvdXJjZSIsIm9taXR0ZWRLZXlzIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwia2V5cyIsInJlZHVjZSIsImhhc2giLCJrZXkiLCJpbmRleE9mIiwicmVxdWlyZSIsIl9jbGFzc0NhbGxDaGVjayIsImluc3RhbmNlIiwiQ29uc3RydWN0b3IiLCJUeXBlRXJyb3IiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiIsInNlbGYiLCJSZWZlcmVuY2VFcnJvciIsIl9pbmhlcml0cyIsInN1YkNsYXNzIiwic3VwZXJDbGFzcyIsImNyZWF0ZSIsImNvbnN0cnVjdG9yIiwid3JpdGFibGUiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fIiwiX2V4dGVuZHMiLCJhc3NpZ24iLCJ0YXJnZXQiLCJfY3JlYXRlQ2xhc3MiLCJkZWZpbmVQcm9wZXJ0aWVzIiwicHJvcHMiLCJkZXNjcmlwdG9yIiwicHJvdG9Qcm9wcyIsInN0YXRpY1Byb3BzIiwiaXNGdW5jdGlvbiIsIngiLCJJbnB1dCIsIl9SZWFjdCRQdXJlQ29tcG9uZW50IiwiX3JlZiIsIl90ZW1wIiwiX3RoaXMiLCJfcmV0IiwidGhpcyIsIl9sZW4iLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiZ2V0UHJvdG90eXBlT2YiLCJhcHBseSIsImNvbmNhdCIsInN0YXRlIiwiaW5wdXQiLCJpc0NvbnRyb2xsZWQiLCJpbnB1dFByb3BzIiwiaXNGb2N1c2VkIiwic2V0SW5wdXRWYWx1ZSIsInNldFN0YXRlIiwiZ2V0VmFsdWUiLCJyZWZzIiwiZmllbGQiLCJoYW5kbGVCbHVyIiwiZXZlbnQiLCJvbkJsdXIiLCJoYW5kbGVGb2N1cyIsIm9uRm9jdXMiLCJoYW5kbGVDaGFuZ2UiLCJvbkNoYW5nZSIsImRlZmF1bHRWYWx1ZSIsIm5leHRQcm9wcyIsIm5leHRWYWx1ZSIsImRpc3BhdGNoRXZlbnQiLCJFdmVudCIsImJ1YmJsZXMiLCJpc05vbkVtcHR5Iiwic2hvdWxkU2hvd1BsYWNlaG9sZGVyIiwiaGlkZVBsYWNlaG9sZGVyT25Gb2N1cyIsInBsYWNlaG9sZGVyIiwiYSIsImNyZWF0ZUVsZW1lbnQiLCJyZWYiLCJjbGFzc05hbWUiLCJnZXRQbGFjZWhvbGRlclRleHQiLCJpbnRlcm5hbEtleXMiLCJ0aXRsZSIsInJlbmRlclBsYWNlaG9sZGVyIiwiUHVyZUNvbXBvbmVudCIsInByb3BUeXBlcyIsImJvb2wiLCJzaGFwZSIsInN0cmluZyIsImZ1bmMiLCJ0eXBlIiwiZGVmYXVsdFByb3BzIl0sIm1hcHBpbmdzIjoiQUFBQUEsT0FBT0MsUUFDRSxTQUFVQyxHQ0duQixRQUFBQyxHQUFBQyxHQUdBLEdBQUFDLEVBQUFELEdBQ0EsTUFBQUMsR0FBQUQsR0FBQUgsT0FHQSxJQUFBRCxHQUFBSyxFQUFBRCxJQUNBRSxFQUFBRixFQUNBRyxHQUFBLEVBQ0FOLFdBVUEsT0FOQUMsR0FBQUUsR0FBQUksS0FBQVIsRUFBQUMsUUFBQUQsSUFBQUMsUUFBQUUsR0FHQUgsRUFBQU8sR0FBQSxFQUdBUCxFQUFBQyxRQXZCQSxHQUFBSSxLQStEQSxPQW5DQUYsR0FBQU0sRUFBQVAsRUFHQUMsRUFBQU8sRUFBQUwsRUFHQUYsRUFBQUcsRUFBQSxTQUFBSyxHQUEyQyxNQUFBQSxJQUczQ1IsRUFBQVMsRUFBQSxTQUFBWCxFQUFBWSxFQUFBQyxHQUNBWCxFQUFBWSxFQUFBZCxFQUFBWSxJQUNBRyxPQUFBQyxlQUFBaEIsRUFBQVksR0FDQUssY0FBQSxFQUNBQyxZQUFBLEVBQ0FDLElBQUFOLEtBTUFYLEVBQUFrQixFQUFBLFNBQUFyQixHQUNBLEdBQUFjLEdBQUFkLEtBQUFzQixXQUNBLFdBQTJCLE1BQUF0QixHQUFBLFNBQzNCLFdBQWlDLE1BQUFBLEdBRWpDLE9BREFHLEdBQUFTLEVBQUFFLEVBQUEsSUFBQUEsR0FDQUEsR0FJQVgsRUFBQVksRUFBQSxTQUFBUSxFQUFBQyxHQUFzRCxNQUFBUixRQUFBUyxVQUFBQyxlQUFBbEIsS0FBQWUsRUFBQUMsSUFHdERyQixFQUFBd0IsRUFBQSxHQUdBeEIsSUFBQXlCLEVBQUEsS0RPTSxTQUFVNUIsRUFBUTZCLEVBQXFCMUIsR0FFN0MsWUV0RWUsU0FBUzJCLEdBQXlCQyxHQUEw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QUFXekQsSUFBRyxVQUFXTyxFQUFNdUIsV0FBVzJCLFdBQzFDSixZQUFhLEtBQ2JkLE9BQVFwQixLQUFLa0IsV0FDYkksUUFBU3RCLEtBQUtxQixZQUNkRyxTQUFVeEIsS0FBS3VCLHFCTHRENnZKN0IsR0s1RTd2SmYsRUFBQXdELEVBQU1RLGNBQXBCakQsR0FDVmtELFdBSUhYLHVCQUF3QnZELEVBQUEsVUFBVW1FLEtBS2xDbEMsV0FBWWpDLEVBQUEsVUFBVW9FLE9BQ2xCckIsYUFBYy9DLEVBQUEsVUFBVXFFLE9BQ3hCM0IsT0FBUTFDLEVBQUEsVUFBVXNFLEtBQ2xCMUIsUUFBUzVDLEVBQUEsVUFBVXNFLEtBQ25CeEIsU0FBVTlDLEVBQUEsVUFBVXNFLEtBQ3BCZCxZQUFheEQsRUFBQSxVQUFVcUUsT0FDdkJFLEtBQU12RSxFQUFBLFVBQVVxRSxPQUNoQm5ILE1BQU84QyxFQUFBLFVBQVVxRSxVQWpCUnJELEVBcUJWd0QsY0FDSGpCLHdCQUF3QixFQUN4QnRCLFlBQ0lzQyxLQUFNLFNBeEJHdkQsRUE0QlY4QyxhQUFldkcsT0FBT29CLEtBQUtxQyxFQUFNd0QsY0xnRHFqTHBHLEVBQTZCLFFLNUV6bUw0QyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbi8qKioqKiovIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbi8qKioqKiovIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAzKTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGV4cG9ydCAoaW1tdXRhYmxlKSAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IG9taXRLZXlzRnJvbVNvdXJjZU9iamVjdDtcbmZ1bmN0aW9uIG9taXRLZXlzRnJvbVNvdXJjZU9iamVjdChzb3VyY2Upe3ZhciBvbWl0dGVkS2V5cz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMV06W107cmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIHJlbG9jYXRlQWNjZXB0ZWRLZXlzKGhhc2gsa2V5KXtpZihvbWl0dGVkS2V5cy5pbmRleE9mKGtleSk9PT0tMSl7aGFzaFtrZXldPXNvdXJjZVtrZXldO31yZXR1cm4gaGFzaDt9LHt9KTt9XG5cbi8qKiovIH0pLFxuLyogMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpO1xuXG4vKioqLyB9KSxcbi8qIDIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cbi8qKiovIH0pLFxuLyogMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShfX3dlYnBhY2tfZXhwb3J0c19fLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xudmFyIF9leHRlbmRzPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHRhcmdldCl7Zm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIHNvdXJjZT1hcmd1bWVudHNbaV07Zm9yKHZhciBrZXkgaW4gc291cmNlKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLGtleSkpe3RhcmdldFtrZXldPXNvdXJjZVtrZXldO319fXJldHVybiB0YXJnZXQ7fTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQscHJvcHMpe2Zvcih2YXIgaT0wO2k8cHJvcHMubGVuZ3RoO2krKyl7dmFyIGRlc2NyaXB0b3I9cHJvcHNbaV07ZGVzY3JpcHRvci5lbnVtZXJhYmxlPWRlc2NyaXB0b3IuZW51bWVyYWJsZXx8ZmFsc2U7ZGVzY3JpcHRvci5jb25maWd1cmFibGU9dHJ1ZTtpZihcInZhbHVlXCJpbiBkZXNjcmlwdG9yKWRlc2NyaXB0b3Iud3JpdGFibGU9dHJ1ZTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LGRlc2NyaXB0b3Iua2V5LGRlc2NyaXB0b3IpO319cmV0dXJuIGZ1bmN0aW9uKENvbnN0cnVjdG9yLHByb3RvUHJvcHMsc3RhdGljUHJvcHMpe2lmKHByb3RvUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUscHJvdG9Qcm9wcyk7aWYoc3RhdGljUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3RvcixzdGF0aWNQcm9wcyk7cmV0dXJuIENvbnN0cnVjdG9yO307fSgpO2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSxDb25zdHJ1Y3Rvcil7aWYoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTt9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsY2FsbCl7aWYoIXNlbGYpe3Rocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTt9cmV0dXJuIGNhbGwmJih0eXBlb2YgY2FsbD09PVwib2JqZWN0XCJ8fHR5cGVvZiBjYWxsPT09XCJmdW5jdGlvblwiKT9jYWxsOnNlbGY7fWZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcyxzdXBlckNsYXNzKXtpZih0eXBlb2Ygc3VwZXJDbGFzcyE9PVwiZnVuY3Rpb25cIiYmc3VwZXJDbGFzcyE9PW51bGwpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiK3R5cGVvZiBzdXBlckNsYXNzKTt9c3ViQ2xhc3MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyYmc3VwZXJDbGFzcy5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpzdWJDbGFzcyxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9fSk7aWYoc3VwZXJDbGFzcylPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLHN1cGVyQ2xhc3MpOnN1YkNsYXNzLl9fcHJvdG9fXz1zdXBlckNsYXNzO312YXIgaXNGdW5jdGlvbj1mdW5jdGlvbiBpc0Z1bmN0aW9uKHgpe3JldHVybiB0eXBlb2YgeD09PSdmdW5jdGlvbic7fTt2YXIgSW5wdXQ9ZnVuY3Rpb24oX1JlYWN0JFB1cmVDb21wb25lbnQpe19pbmhlcml0cyhJbnB1dCxfUmVhY3QkUHVyZUNvbXBvbmVudCk7ZnVuY3Rpb24gSW5wdXQoKXt2YXIgX3JlZjt2YXIgX3RlbXAsX3RoaXMsX3JldDtfY2xhc3NDYWxsQ2hlY2sodGhpcyxJbnB1dCk7Zm9yKHZhciBfbGVuPWFyZ3VtZW50cy5sZW5ndGgsYXJncz1BcnJheShfbGVuKSxfa2V5PTA7X2tleTxfbGVuO19rZXkrKyl7YXJnc1tfa2V5XT1hcmd1bWVudHNbX2tleV07fXJldHVybiBfcmV0PShfdGVtcD0oX3RoaXM9X3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywoX3JlZj1JbnB1dC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihJbnB1dCkpLmNhbGwuYXBwbHkoX3JlZixbdGhpc10uY29uY2F0KGFyZ3MpKSksX3RoaXMpLF90aGlzLnN0YXRlPXtpbnB1dDonJyxpc0NvbnRyb2xsZWQ6dHlwZW9mIF90aGlzLnByb3BzLmlucHV0UHJvcHMudmFsdWU9PT0nc3RyaW5nJyxpc0ZvY3VzZWQ6ZmFsc2V9LF90aGlzLnNldElucHV0VmFsdWU9ZnVuY3Rpb24oKXt2YXIgdmFsdWU9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT11bmRlZmluZWQ/YXJndW1lbnRzWzBdOicnO3JldHVybiBfdGhpcy5zZXRTdGF0ZSh7aW5wdXQ6dmFsdWV9KTt9LF90aGlzLmdldFZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIF90aGlzLnJlZnMuZmllbGQudmFsdWU7fSxfdGhpcy5oYW5kbGVCbHVyPWZ1bmN0aW9uKGV2ZW50KXtfdGhpcy5zZXRTdGF0ZSh7aXNGb2N1c2VkOmZhbHNlfSk7aWYoaXNGdW5jdGlvbihfdGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uQmx1cik9PT10cnVlKXtfdGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uQmx1cihldmVudCk7fX0sX3RoaXMuaGFuZGxlRm9jdXM9ZnVuY3Rpb24oZXZlbnQpe190aGlzLnNldFN0YXRlKHtpc0ZvY3VzZWQ6dHJ1ZX0pO2lmKGlzRnVuY3Rpb24oX3RoaXMucHJvcHMuaW5wdXRQcm9wcy5vbkZvY3VzKT09PXRydWUpe190aGlzLnByb3BzLmlucHV0UHJvcHMub25Gb2N1cyhldmVudCk7fX0sX3RoaXMuaGFuZGxlQ2hhbmdlPWZ1bmN0aW9uKGV2ZW50KXtpZihfdGhpcy5zdGF0ZS5pc0NvbnRyb2xsZWQ9PT1mYWxzZSl7X3RoaXMuc2V0SW5wdXRWYWx1ZShldmVudC50YXJnZXQudmFsdWUpO31pZihpc0Z1bmN0aW9uKF90aGlzLnByb3BzLmlucHV0UHJvcHMub25DaGFuZ2UpPT09dHJ1ZSl7X3RoaXMucHJvcHMuaW5wdXRQcm9wcy5vbkNoYW5nZShldmVudCk7fX0sX3RlbXApLF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLF9yZXQpO31fY3JlYXRlQ2xhc3MoSW5wdXQsW3trZXk6J2NvbXBvbmVudFdpbGxNb3VudCcsdmFsdWU6ZnVuY3Rpb24gY29tcG9uZW50V2lsbE1vdW50KCl7aWYodGhpcy5zdGF0ZS5pc0NvbnRyb2xsZWQ9PT10cnVlKXtyZXR1cm4gdGhpcy5zZXRJbnB1dFZhbHVlKHRoaXMucHJvcHMuaW5wdXRQcm9wcy52YWx1ZSk7fXRoaXMuc2V0SW5wdXRWYWx1ZSh0aGlzLnByb3BzLmlucHV0UHJvcHMuZGVmYXVsdFZhbHVlKTt9fSx7a2V5Oidjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJyx2YWx1ZTpmdW5jdGlvbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcyl7aWYobmV4dFByb3BzLmlucHV0UHJvcHMudmFsdWUhPT10aGlzLnByb3BzLmlucHV0UHJvcHMudmFsdWUpe3RoaXMuc2V0SW5wdXRWYWx1ZShuZXh0UHJvcHMuaW5wdXRQcm9wcy52YWx1ZSk7fX19LHtrZXk6J3NldFZhbHVlJyx2YWx1ZTpmdW5jdGlvbiBzZXRWYWx1ZShuZXh0VmFsdWUpe3RoaXMuc2V0SW5wdXRWYWx1ZShuZXh0VmFsdWUpO3RoaXMucmVmcy5maWVsZC52YWx1ZT1uZXh0VmFsdWU7aWYodGhpcy5zdGF0ZS5pc0NvbnRyb2xsZWQ9PT10cnVlKXt0aGlzLnJlZnMuZmllbGQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2lucHV0Jyx7YnViYmxlczp0cnVlfSkpO3RoaXMucmVmcy5maWVsZC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2hhbmdlJyx7YnViYmxlczp0cnVlfSkpO319fSx7a2V5OidnZXRQbGFjZWhvbGRlclRleHQnLHZhbHVlOmZ1bmN0aW9uIGdldFBsYWNlaG9sZGVyVGV4dCgpe3ZhciBpc05vbkVtcHR5PXRoaXMuc3RhdGUuaW5wdXQhPT0nJzt2YXIgc2hvdWxkU2hvd1BsYWNlaG9sZGVyPXRoaXMucHJvcHMuaGlkZVBsYWNlaG9sZGVyT25Gb2N1cz09PXRydWU/dGhpcy5zdGF0ZS5pc0ZvY3VzZWQ9PT1mYWxzZSYmaXNOb25FbXB0eT09PWZhbHNlOmlzTm9uRW1wdHk9PT1mYWxzZTtyZXR1cm4gc2hvdWxkU2hvd1BsYWNlaG9sZGVyP3RoaXMucHJvcHMuaW5wdXRQcm9wcy5wbGFjZWhvbGRlcjonJzt9fSx7a2V5OidyZW5kZXJQbGFjZWhvbGRlcicsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyUGxhY2Vob2xkZXIoKXtyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoJ2Rpdicse3JlZjoncGxhY2Vob2xkZXInLGNsYXNzTmFtZTonYi1pbnB1dC1wbGFjZWhvbGRlciBiLWlucHV0J30sdGhpcy5nZXRQbGFjZWhvbGRlclRleHQoKSk7fX0se2tleToncmVuZGVyJyx2YWx1ZTpmdW5jdGlvbiByZW5kZXIoKXt2YXIgcHJvcHM9dGhpcy5wcm9wcztyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoJ2RpdicsX2V4dGVuZHMoe30sX193ZWJwYWNrX3JlcXVpcmVfXy5pKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKHByb3BzLElucHV0LmludGVybmFsS2V5cykse3JlZjond3JhcHBlcicsY2xhc3NOYW1lOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCgpKCdiLWlucHV0LXdyYXBwZXInLHByb3BzLmNsYXNzTmFtZSksdGl0bGU6dGhpcy5nZXRQbGFjZWhvbGRlclRleHQoKX0pLHRoaXMucmVuZGVyUGxhY2Vob2xkZXIoKSxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudCgnaW5wdXQnLF9leHRlbmRzKHt9LHByb3BzLmlucHV0UHJvcHMse3JlZjonZmllbGQnLGNsYXNzTmFtZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQoKSgnYi1pbnB1dCcscHJvcHMuaW5wdXRQcm9wcy5jbGFzc05hbWUpLHBsYWNlaG9sZGVyOm51bGwsb25CbHVyOnRoaXMuaGFuZGxlQmx1cixvbkZvY3VzOnRoaXMuaGFuZGxlRm9jdXMsb25DaGFuZ2U6dGhpcy5oYW5kbGVDaGFuZ2V9KSkpO319XSk7cmV0dXJuIElucHV0O30oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLlB1cmVDb21wb25lbnQpO0lucHV0LnByb3BUeXBlcz17aGlkZVBsYWNlaG9sZGVyT25Gb2N1czpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ib29sLGlucHV0UHJvcHM6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc2hhcGUoe2RlZmF1bHRWYWx1ZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5zdHJpbmcsb25CbHVyOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmMsb25Gb2N1czpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jLG9uQ2hhbmdlOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmMscGxhY2Vob2xkZXI6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc3RyaW5nLHR5cGU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc3RyaW5nLHZhbHVlOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLnN0cmluZ30pfTtJbnB1dC5kZWZhdWx0UHJvcHM9e2hpZGVQbGFjZWhvbGRlck9uRm9jdXM6dHJ1ZSxpbnB1dFByb3BzOnt0eXBlOid0ZXh0J319O0lucHV0LmludGVybmFsS2V5cz1PYmplY3Qua2V5cyhJbnB1dC5kZWZhdWx0UHJvcHMpOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSBJbnB1dDtcblxuLyoqKi8gfSlcbi8qKioqKiovIF0pO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBpbmRleC5qcyIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDMpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIDJkM2Y3YjA0OWFkZWMzNWZlZDM0IiwiLyoqXG4gKiBSZXR1cm5zIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgc3VwcGxpZWQgb2JqZWN0IHdpdGhvdXQgdGhlIGdpdmVuIGtleXMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG9taXRLZXlzRnJvbVNvdXJjZU9iamVjdChzb3VyY2UsIG9taXR0ZWRLZXlzID0gW10pIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc291cmNlKS5yZWR1Y2UoZnVuY3Rpb24gcmVsb2NhdGVBY2NlcHRlZEtleXMoaGFzaCwga2V5KSB7XG4gICAgICAgIGlmIChvbWl0dGVkS2V5cy5pbmRleE9mKGtleSkgPT09IC0xKSB7XG4gICAgICAgICAgICBoYXNoW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYXNoO1xuICAgIH0sIHt9KTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMvaW5kZXguanMiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiY2xhc3NuYW1lc1wifVxuLy8gbW9kdWxlIGlkID0gMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0XCJ9XG4vLyBtb2R1bGUgaWQgPSAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCBSZWFjdCwge1Byb3BUeXBlc30gZnJvbSAncmVhY3QnO1xuaW1wb3J0IGN4IGZyb20gJ2NsYXNzbmFtZXMnO1xuXG5pbXBvcnQgb21pdCBmcm9tICdib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzJztcblxuY29uc3QgaXNGdW5jdGlvbiA9ICh4KSA9PiB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJztcblxuLyoqXG4jIElucHV0XG5fX0FuIGlucHV0IGNvbnRyb2wgd2l0aCBwbGFjZWhvbGRlciBlbXVsYXRpb24gZm9yIG5vbi1zdXBwb3J0aW5nIHBsYXRmb3Jtcy5fX1xuXG5JbnB1dCBhYnN0cmFjdHMgYXdheSB0aGUgY3Jvc3MtcGxhdGZvcm0gZGlmZmVyZW5jZXMgb2YgcGxhY2Vob2xkZXIgc3R5bGluZyBhbmQgYmVoYXZpb3JzLCBmb3IgZXhhbXBsZTogSW50ZXJuZXQgRXhwbG9yZXIgZGlzbWlzc2VzIG5hdGl2ZSBwbGFjZWhvbGRlcnMgb24gaW5wdXQgZm9jdXMgYW5kIG90aGVyIHBsYXRmb3JtcyBkbyBub3QuIFRoaXMgY29tcG9uZW50IGVuc3VyZXMgdGhhdCB0ZXh0IGlucHV0IGNvbnRyb2xzIHdpbGwgZmVlbCBhbmQgYmVoYXZlIHNpbWlsYXJseSBvbiBtb3JlIGRldmljZXMuXG5cbiMjIENvbXBvbmVudCBJbnN0YW5jZSBNZXRob2RzXG5cbldoZW4gdXNpbmcgYElucHV0YCBpbiB5b3VyIHByb2plY3QsIHlvdSBtYXkgY2FsbCB0aGUgZm9sbG93aW5nIG1ldGhvZHMgb24gYSByZW5kZXJlZCBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50LiBVc2UgW2ByZWZzYF0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy9yZWZzLWFuZC10aGUtZG9tLmh0bWwpIHRvIGdldCB0aGUgaW5zdGFuY2UuXG5cbi0gX19nZXRWYWx1ZSgpX19cbiAgcmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgaW5wdXQgZmllbGRcblxuLSBfX3NldFZhbHVlKHN0cmluZylfX1xuICBwcm9ncmFtbWF0aWNhbGx5IHNldCB0aGUgaW5wdXQgdmFsdWU7IHVzZWZ1bCBmb3IgY2xlYXJpbmcgb3V0IHRoZSBpbnB1dCBpbiBcInVuY29udHJvbGxlZFwiIG1vZGUgLS0gbm90ZSB0aGF0IGRpZ2dpbmcgaW50byB0aGUgaW50ZXJuYWxzIGFuZCBzZXR0aW5nIHRoZSBgcmVmcy5maWVsZC52YWx1ZSA9ICcnYCBkaXJlY3RseSB3aWxsIG5vdCB0cmlnZ2VyIGV2ZW50cyBhbmQgbWVzc2VzIHVwIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgY29tcG9uZW50XG5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW5wdXQgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgICAvKipcbiAgICAgICAgICogdHJpZ2dlcnMgdGhlIHBsYWNlaG9sZGVyIHRvIGRpc2FwcGVhciB3aGVuIHRoZSBpbnB1dCBmaWVsZCBpcyBmb2N1c2VkLCByZWFwcGVhcnMgd2hlbiB0aGUgdXNlciBoYXMgdGFiYmVkIGF3YXkgb3IgZm9jdXMgaXMgbW92ZWRcbiAgICAgICAgICovXG4gICAgICAgIGhpZGVQbGFjZWhvbGRlck9uRm9jdXM6IFByb3BUeXBlcy5ib29sLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBwcm9wcyB0byBiZSBwYXNzZWQgdGhyb3VnaCB0byB0aGUgaW5wdXQgbm9kZSwgYC5iLXRleHR1YWwtaW5wdXRgOyB0aGlzIGluY2x1ZGVzIHRoZSBzdGFuZGFyZCBzZXQgb2YgUmVhY3QgaW5wdXQgcHJvcHMgbGlrZSBgZGVmYXVsdFZhbHVlYCwgYHZhbHVlYCwgYG5hbWVgLCBgcGxhY2Vob2xkZXJgLCBgYXV0b0ZvY3VzYCwgZXRjLlxuICAgICAgICAgKi9cbiAgICAgICAgaW5wdXRQcm9wczogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgICAgIG9uQmx1cjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgICAgICBvbkZvY3VzOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgICAgICAgdHlwZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgICAgIHZhbHVlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgICB9KSxcbiAgICB9XG5cbiAgICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgICBoaWRlUGxhY2Vob2xkZXJPbkZvY3VzOiB0cnVlLFxuICAgICAgICBpbnB1dFByb3BzOiB7XG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgIH0sXG4gICAgfVxuXG4gICAgc3RhdGljIGludGVybmFsS2V5cyA9IE9iamVjdC5rZXlzKElucHV0LmRlZmF1bHRQcm9wcylcblxuICAgIHN0YXRlID0ge1xuICAgICAgICBpbnB1dDogJycsXG4gICAgICAgIGlzQ29udHJvbGxlZDogdHlwZW9mIHRoaXMucHJvcHMuaW5wdXRQcm9wcy52YWx1ZSA9PT0gJ3N0cmluZycsXG4gICAgICAgIGlzRm9jdXNlZDogZmFsc2UsXG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbE1vdW50KCkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5pc0NvbnRyb2xsZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldElucHV0VmFsdWUodGhpcy5wcm9wcy5pbnB1dFByb3BzLnZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0SW5wdXRWYWx1ZSh0aGlzLnByb3BzLmlucHV0UHJvcHMuZGVmYXVsdFZhbHVlKTtcbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgICBpZiAobmV4dFByb3BzLmlucHV0UHJvcHMudmFsdWUgIT09IHRoaXMucHJvcHMuaW5wdXRQcm9wcy52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRJbnB1dFZhbHVlKG5leHRQcm9wcy5pbnB1dFByb3BzLnZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldElucHV0VmFsdWUgPSAodmFsdWUgPSAnJykgPT4gdGhpcy5zZXRTdGF0ZSh7aW5wdXQ6IHZhbHVlfSlcblxuICAgIGdldFZhbHVlID0gKCkgPT4gdGhpcy5yZWZzLmZpZWxkLnZhbHVlXG5cbiAgICBzZXRWYWx1ZShuZXh0VmFsdWUpIHtcbiAgICAgICAgdGhpcy5zZXRJbnB1dFZhbHVlKG5leHRWYWx1ZSk7XG4gICAgICAgIHRoaXMucmVmcy5maWVsZC52YWx1ZSA9IG5leHRWYWx1ZTtcblxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5pc0NvbnRyb2xsZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIC8vIHNpbXVsYXRlIGlucHV0IGNoYW5nZSBldmVudCBmbG93XG4gICAgICAgICAgICB0aGlzLnJlZnMuZmllbGQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2lucHV0Jywge2J1YmJsZXM6IHRydWV9KSk7XG4gICAgICAgICAgICB0aGlzLnJlZnMuZmllbGQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2NoYW5nZScsIHtidWJibGVzOiB0cnVlfSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlQmx1ciA9IChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtpc0ZvY3VzZWQ6IGZhbHNlfSk7XG5cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uQmx1cikgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMuaW5wdXRQcm9wcy5vbkJsdXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlRm9jdXMgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7aXNGb2N1c2VkOiB0cnVlfSk7XG5cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uRm9jdXMpID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLmlucHV0UHJvcHMub25Gb2N1cyhldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYW5kbGVDaGFuZ2UgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgLy8gZm9yIFwiY29udHJvbGxlZFwiIHNjZW5hcmlvcywgdXBkYXRlcyB0byB0aGUgY2FjaGVkIGlucHV0IHRleHQgc2hvdWxkIGNvbWVcbiAgICAgICAgLy8gZXhjbHVzaXZlbHkgdmlhIHByb3BzIChjV1JQKSBzbyBpdCBleGFjdGx5IG1pcnJvcnMgdGhlIGN1cnJlbnQgYXBwbGljYXRpb25cbiAgICAgICAgLy8gc3RhdGUsIG90aGVyd2lzZSBhIHJlLXJlbmRlciB3aWxsIG9jY3VyIGJlZm9yZSB0aGUgbmV3IHRleHQgaGFzIGNvbXBsZXRlZCBpdHNcbiAgICAgICAgLy8gZmVlZGJhY2sgbG9vcCBhbmQgdGhlIGN1cnNvciBwb3NpdGlvbiBpcyBsb3N0XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmlzQ29udHJvbGxlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5wdXRWYWx1ZShldmVudC50YXJnZXQudmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uQ2hhbmdlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFBsYWNlaG9sZGVyVGV4dCgpIHtcbiAgICAgICAgY29uc3QgaXNOb25FbXB0eSA9IHRoaXMuc3RhdGUuaW5wdXQgIT09ICcnO1xuICAgICAgICBjb25zdCBzaG91bGRTaG93UGxhY2Vob2xkZXIgPSAgIHRoaXMucHJvcHMuaGlkZVBsYWNlaG9sZGVyT25Gb2N1cyA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5zdGF0ZS5pc0ZvY3VzZWQgPT09IGZhbHNlICYmIGlzTm9uRW1wdHkgPT09IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpc05vbkVtcHR5ID09PSBmYWxzZTtcblxuICAgICAgICByZXR1cm4gc2hvdWxkU2hvd1BsYWNlaG9sZGVyID8gdGhpcy5wcm9wcy5pbnB1dFByb3BzLnBsYWNlaG9sZGVyIDogJyc7XG4gICAgfVxuXG4gICAgcmVuZGVyUGxhY2Vob2xkZXIoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IHJlZj0ncGxhY2Vob2xkZXInIGNsYXNzTmFtZT0nYi1pbnB1dC1wbGFjZWhvbGRlciBiLWlucHV0Jz5cbiAgICAgICAgICAgICAgICB7dGhpcy5nZXRQbGFjZWhvbGRlclRleHQoKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3Qge3Byb3BzfSA9IHRoaXM7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICB7Li4ub21pdChwcm9wcywgSW5wdXQuaW50ZXJuYWxLZXlzKX1cbiAgICAgICAgICAgICAgICByZWY9J3dyYXBwZXInXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjeCgnYi1pbnB1dC13cmFwcGVyJywgcHJvcHMuY2xhc3NOYW1lKX1cbiAgICAgICAgICAgICAgICB0aXRsZT17dGhpcy5nZXRQbGFjZWhvbGRlclRleHQoKX0+XG4gICAgICAgICAgICAgICAge3RoaXMucmVuZGVyUGxhY2Vob2xkZXIoKX1cblxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICB7Li4ucHJvcHMuaW5wdXRQcm9wc31cbiAgICAgICAgICAgICAgICAgICAgcmVmPSdmaWVsZCdcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjeCgnYi1pbnB1dCcsIHByb3BzLmlucHV0UHJvcHMuY2xhc3NOYW1lKX1cbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e251bGx9XG4gICAgICAgICAgICAgICAgICAgIG9uQmx1cj17dGhpcy5oYW5kbGVCbHVyfVxuICAgICAgICAgICAgICAgICAgICBvbkZvY3VzPXt0aGlzLmhhbmRsZUZvY3VzfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5oYW5kbGVDaGFuZ2V9IC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9ib3VuZGxlc3MtaW5wdXQvaW5kZXguanMiXSwic291cmNlUm9vdCI6IiJ9 | ||
module.exports=function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=3)}([function(e,t){e.exports=require("boundless-utils-omit-keys")},function(e,t){e.exports=require("classnames")},function(e,t){e.exports=require("react")},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var p=n(2),u=n.n(p),i=n(1),a=n.n(i),l=n(0),c=n.n(l),f=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},h=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),d=function(e){return"function"==typeof e},y=function(e){function t(){var e,n,s,p;r(this,t);for(var u=arguments.length,i=Array(u),a=0;a<u;a++)i[a]=arguments[a];return n=s=o(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(i))),s.state={input:"",isControlled:"string"==typeof s.props.inputProps.value,isFocused:!1},s.setInputValue=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return s.setState({input:e})},s.getValue=function(){return s.refs.field.value},s.handleBlur=function(e){s.setState({isFocused:!1}),d(s.props.inputProps.onBlur)===!0&&s.props.inputProps.onBlur(e)},s.handleFocus=function(e){s.setState({isFocused:!0}),d(s.props.inputProps.onFocus)===!0&&s.props.inputProps.onFocus(e)},s.handleChange=function(e){s.state.isControlled===!1&&s.setInputValue(e.target.value),d(s.props.inputProps.onChange)===!0&&s.props.inputProps.onChange(e)},p=n,o(s,p)}return s(t,e),h(t,[{key:"componentWillMount",value:function(){return this.state.isControlled===!0?this.setInputValue(this.props.inputProps.value):void this.setInputValue(this.props.inputProps.defaultValue)}},{key:"componentWillReceiveProps",value:function(e){e.inputProps.value!==this.props.inputProps.value&&this.setInputValue(e.inputProps.value)}},{key:"setValue",value:function(e){this.setInputValue(e),this.refs.field.value=e,this.state.isControlled===!0&&(this.refs.field.dispatchEvent(new Event("input",{bubbles:!0})),this.refs.field.dispatchEvent(new Event("change",{bubbles:!0})))}},{key:"getPlaceholderText",value:function(){var e=""!==this.state.input,t=this.props.hidePlaceholderOnFocus===!0?this.state.isFocused===!1&&e===!1:e===!1;return t?this.props.inputProps.placeholder:""}},{key:"render",value:function(){return u.a.createElement(this.props.component,f({},c()(this.props,t.internalKeys),{className:a()("b-input-wrapper",this.props.className),title:this.getPlaceholderText()}),u.a.createElement("input",f({},this.props.inputProps,{ref:"field",className:a()("b-input",this.props.inputProps.className),placeholder:null,onBlur:this.handleBlur,onFocus:this.handleFocus,onChange:this.handleChange})),u.a.createElement("div",{className:"b-input-placeholder b-input"},this.getPlaceholderText()))}}]),t}(u.a.PureComponent);y.propTypes={"*":p.PropTypes.any,component:p.PropTypes.string,hidePlaceholderOnFocus:p.PropTypes.bool,inputProps:p.PropTypes.shape({"*":p.PropTypes.any,defaultValue:p.PropTypes.string,onBlur:p.PropTypes.func,onFocus:p.PropTypes.func,onChange:p.PropTypes.func,placeholder:p.PropTypes.string,type:p.PropTypes.string,value:p.PropTypes.string})},y.defaultProps={component:"div",hidePlaceholderOnFocus:!0,inputProps:{type:"text"}},y.internalKeys=Object.keys(y.defaultProps),t.default=y}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIGU3YTJkYjNkM2VhYWEwMDFjM2I4Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiY2xhc3NuYW1lc1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdFwifSIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9ib3VuZGxlc3MtaW5wdXQvaW5kZXguanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJ2YWx1ZSIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwicmVxdWlyZSIsIl9fd2VicGFja19leHBvcnRzX18iLCJfY2xhc3NDYWxsQ2hlY2siLCJpbnN0YW5jZSIsIkNvbnN0cnVjdG9yIiwiVHlwZUVycm9yIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJzZWxmIiwiUmVmZXJlbmNlRXJyb3IiLCJfaW5oZXJpdHMiLCJzdWJDbGFzcyIsInN1cGVyQ2xhc3MiLCJjcmVhdGUiLCJjb25zdHJ1Y3RvciIsIndyaXRhYmxlIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCIsIl9leHRlbmRzIiwiYXNzaWduIiwidGFyZ2V0IiwiYXJndW1lbnRzIiwibGVuZ3RoIiwic291cmNlIiwia2V5IiwiX2NyZWF0ZUNsYXNzIiwiZGVmaW5lUHJvcGVydGllcyIsInByb3BzIiwiZGVzY3JpcHRvciIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsImlzRnVuY3Rpb24iLCJ4IiwiSW5wdXQiLCJfUmVhY3QkUHVyZUNvbXBvbmVudCIsIl9yZWYiLCJfdGVtcCIsIl90aGlzIiwiX3JldCIsInRoaXMiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImdldFByb3RvdHlwZU9mIiwiYXBwbHkiLCJjb25jYXQiLCJzdGF0ZSIsImlucHV0IiwiaXNDb250cm9sbGVkIiwiaW5wdXRQcm9wcyIsImlzRm9jdXNlZCIsInNldElucHV0VmFsdWUiLCJ1bmRlZmluZWQiLCJzZXRTdGF0ZSIsImdldFZhbHVlIiwicmVmcyIsImZpZWxkIiwiaGFuZGxlQmx1ciIsImV2ZW50Iiwib25CbHVyIiwiaGFuZGxlRm9jdXMiLCJvbkZvY3VzIiwiaGFuZGxlQ2hhbmdlIiwib25DaGFuZ2UiLCJkZWZhdWx0VmFsdWUiLCJuZXh0UHJvcHMiLCJuZXh0VmFsdWUiLCJkaXNwYXRjaEV2ZW50IiwiRXZlbnQiLCJidWJibGVzIiwiaXNOb25FbXB0eSIsInNob3VsZFNob3dQbGFjZWhvbGRlciIsImhpZGVQbGFjZWhvbGRlck9uRm9jdXMiLCJwbGFjZWhvbGRlciIsImEiLCJjcmVhdGVFbGVtZW50IiwiY29tcG9uZW50IiwiaW50ZXJuYWxLZXlzIiwiY2xhc3NOYW1lIiwidGl0bGUiLCJnZXRQbGFjZWhvbGRlclRleHQiLCJyZWYiLCJQdXJlQ29tcG9uZW50IiwicHJvcFR5cGVzIiwiKiIsImFueSIsInN0cmluZyIsImJvb2wiLCJzaGFwZSIsImZ1bmMiLCJ0eXBlIiwiZGVmYXVsdFByb3BzIiwia2V5cyJdLCJtYXBwaW5ncyI6IkFBQUFBLE9BQU9DLFFBQ0UsU0FBVUMsR0NHbkIsUUFBQUMsR0FBQUMsR0FHQSxHQUFBQyxFQUFBRCxHQUNBLE1BQUFDLEdBQUFELEdBQUFILE9BR0EsSUFBQUQsR0FBQUssRUFBQUQsSUFDQUUsRUFBQUYsRUFDQUcsR0FBQSxFQUNBTixXQVVBLE9BTkFDLEdBQUFFLEdBQUFJLEtBQUFSLEVBQUFDLFFBQUFELElBQUFDLFFBQUFFLEdBR0FILEVBQUFPLEdBQUEsRUFHQVAsRUFBQUMsUUF2QkEsR0FBQUksS0ErREEsT0FuQ0FGLEdBQUFNLEVBQUFQLEVBR0FDLEVBQUFPLEVBQUFMLEVBR0FGLEVBQUFHLEVBQUEsU0FBQUssR0FBMkMsTUFBQUEsSUFHM0NSLEVBQUFTLEVBQUEsU0FBQVgsRUFBQVksRUFBQUMsR0FDQVgsRUFBQVksRUFBQWQsRUFBQVksSUFDQUcsT0FBQUMsZUFBQWhCLEVBQUFZLEdBQ0FLLGNBQUEsRUFDQUMsWUFBQSxFQUNBQyxJQUFBTixLQU1BWCxFQUFBa0IsRUFBQSxTQUFBckIsR0FDQSxHQUFBYyxHQUFBZCxLQUFBc0IsV0FDQSxXQUEyQixNQUFBdEIsR0FBQSxTQUMzQixXQUFpQyxNQUFBQSxHQUVqQyxPQURBRyxHQUFBUyxFQUFBRSxFQUFBLElBQUFBLEdBQ0FBLEdBSUFYLEVBQUFZLEVBQUEsU0FBQVEsRUFBQUMsR0FBc0QsTUFBQVIsUUFBQVMsVUFBQUMsZUFBQWxCLEtBQUFlLEVBQUFDLElBR3REckIsRUFBQXdCLEVBQUEsR0FHQXhCLElBQUF5QixFQUFBLEtET00sU0FBVTVCLEVBQVFDLEdFdkV4QkQsRUFBQUMsUUFBQTRCLFFBQUEsOEJG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V0FBWXRDLEVBQUEsVUFBVTZFLE9BSWxCSixJQUFLekUsRUFBQSxVQUFVMEUsSUFFZnJCLGFBQWNyRCxFQUFBLFVBQVUyRSxPQUN4QjNCLE9BQVFoRCxFQUFBLFVBQVU4RSxLQUNsQjVCLFFBQVNsRCxFQUFBLFVBQVU4RSxLQUNuQjFCLFNBQVVwRCxFQUFBLFVBQVU4RSxLQUNwQmhCLFlBQWE5RCxFQUFBLFVBQVUyRSxPQUN2QkksS0FBTS9FLEVBQUEsVUFBVTJFLE9BQ2hCOUcsTUFBT21DLEVBQUEsVUFBVTJFLFVBN0JSdEQsRUFpQ1YyRCxjQUNIZixVQUFXLE1BQ1hKLHdCQUF3QixFQUN4QnZCLFlBQ0l5QyxLQUFNLFNBckNHMUQsRUF5Q1Y2QyxhQUFlaEcsT0FBTytHLEtBQUs1RCxFQUFNMkQsY0xtQ3dtTGhHLEVBQTZCLFFLNUU1cExxQyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbi8qKioqKiovIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbi8qKioqKiovIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAzKTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXV0aWxzLW9taXQta2V5c1wiKTtcblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNsYXNzbmFtZXNcIik7XG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxuLyoqKi8gfSksXG4vKiAzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KF9fd2VicGFja19leHBvcnRzX18sIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18pO1xudmFyIF9leHRlbmRzPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHRhcmdldCl7Zm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIHNvdXJjZT1hcmd1bWVudHNbaV07Zm9yKHZhciBrZXkgaW4gc291cmNlKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLGtleSkpe3RhcmdldFtrZXldPXNvdXJjZVtrZXldO319fXJldHVybiB0YXJnZXQ7fTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQscHJvcHMpe2Zvcih2YXIgaT0wO2k8cHJvcHMubGVuZ3RoO2krKyl7dmFyIGRlc2NyaXB0b3I9cHJvcHNbaV07ZGVzY3JpcHRvci5lbnVtZXJhYmxlPWRlc2NyaXB0b3IuZW51bWVyYWJsZXx8ZmFsc2U7ZGVzY3JpcHRvci5jb25maWd1cmFibGU9dHJ1ZTtpZihcInZhbHVlXCJpbiBkZXNjcmlwdG9yKWRlc2NyaXB0b3Iud3JpdGFibGU9dHJ1ZTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LGRlc2NyaXB0b3Iua2V5LGRlc2NyaXB0b3IpO319cmV0dXJuIGZ1bmN0aW9uKENvbnN0cnVjdG9yLHByb3RvUHJvcHMsc3RhdGljUHJvcHMpe2lmKHByb3RvUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUscHJvdG9Qcm9wcyk7aWYoc3RhdGljUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3RvcixzdGF0aWNQcm9wcyk7cmV0dXJuIENvbnN0cnVjdG9yO307fSgpO2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSxDb25zdHJ1Y3Rvcil7aWYoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTt9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsY2FsbCl7aWYoIXNlbGYpe3Rocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTt9cmV0dXJuIGNhbGwmJih0eXBlb2YgY2FsbD09PVwib2JqZWN0XCJ8fHR5cGVvZiBjYWxsPT09XCJmdW5jdGlvblwiKT9jYWxsOnNlbGY7fWZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcyxzdXBlckNsYXNzKXtpZih0eXBlb2Ygc3VwZXJDbGFzcyE9PVwiZnVuY3Rpb25cIiYmc3VwZXJDbGFzcyE9PW51bGwpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiK3R5cGVvZiBzdXBlckNsYXNzKTt9c3ViQ2xhc3MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyYmc3VwZXJDbGFzcy5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpzdWJDbGFzcyxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9fSk7aWYoc3VwZXJDbGFzcylPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLHN1cGVyQ2xhc3MpOnN1YkNsYXNzLl9fcHJvdG9fXz1zdXBlckNsYXNzO312YXIgaXNGdW5jdGlvbj1mdW5jdGlvbiBpc0Z1bmN0aW9uKHgpe3JldHVybiB0eXBlb2YgeD09PSdmdW5jdGlvbic7fTt2YXIgSW5wdXQ9ZnVuY3Rpb24oX1JlYWN0JFB1cmVDb21wb25lbnQpe19pbmhlcml0cyhJbnB1dCxfUmVhY3QkUHVyZUNvbXBvbmVudCk7ZnVuY3Rpb24gSW5wdXQoKXt2YXIgX3JlZjt2YXIgX3RlbXAsX3RoaXMsX3JldDtfY2xhc3NDYWxsQ2hlY2sodGhpcyxJbnB1dCk7Zm9yKHZhciBfbGVuPWFyZ3VtZW50cy5sZW5ndGgsYXJncz1BcnJheShfbGVuKSxfa2V5PTA7X2tleTxfbGVuO19rZXkrKyl7YXJnc1tfa2V5XT1hcmd1bWVudHNbX2tleV07fXJldHVybiBfcmV0PShfdGVtcD0oX3RoaXM9X3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywoX3JlZj1JbnB1dC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihJbnB1dCkpLmNhbGwuYXBwbHkoX3JlZixbdGhpc10uY29uY2F0KGFyZ3MpKSksX3RoaXMpLF90aGlzLnN0YXRlPXtpbnB1dDonJyxpc0NvbnRyb2xsZWQ6dHlwZW9mIF90aGlzLnByb3BzLmlucHV0UHJvcHMudmFsdWU9PT0nc3RyaW5nJyxpc0ZvY3VzZWQ6ZmFsc2V9LF90aGlzLnNldElucHV0VmFsdWU9ZnVuY3Rpb24oKXt2YXIgdmFsdWU9YXJndW1lbnRzLmxlbmd0aD4wJiZhcmd1bWVudHNbMF0hPT11bmRlZmluZWQ/YXJndW1lbnRzWzBdOicnO3JldHVybiBfdGhpcy5zZXRTdGF0ZSh7aW5wdXQ6dmFsdWV9KTt9LF90aGlzLmdldFZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIF90aGlzLnJlZnMuZmllbGQudmFsdWU7fSxfdGhpcy5oYW5kbGVCbHVyPWZ1bmN0aW9uKGV2ZW50KXtfdGhpcy5zZXRTdGF0ZSh7aXNGb2N1c2VkOmZhbHNlfSk7aWYoaXNGdW5jdGlvbihfdGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uQmx1cik9PT10cnVlKXtfdGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uQmx1cihldmVudCk7fX0sX3RoaXMuaGFuZGxlRm9jdXM9ZnVuY3Rpb24oZXZlbnQpe190aGlzLnNldFN0YXRlKHtpc0ZvY3VzZWQ6dHJ1ZX0pO2lmKGlzRnVuY3Rpb24oX3RoaXMucHJvcHMuaW5wdXRQcm9wcy5vbkZvY3VzKT09PXRydWUpe190aGlzLnByb3BzLmlucHV0UHJvcHMub25Gb2N1cyhldmVudCk7fX0sX3RoaXMuaGFuZGxlQ2hhbmdlPWZ1bmN0aW9uKGV2ZW50KXtpZihfdGhpcy5zdGF0ZS5pc0NvbnRyb2xsZWQ9PT1mYWxzZSl7X3RoaXMuc2V0SW5wdXRWYWx1ZShldmVudC50YXJnZXQudmFsdWUpO31pZihpc0Z1bmN0aW9uKF90aGlzLnByb3BzLmlucHV0UHJvcHMub25DaGFuZ2UpPT09dHJ1ZSl7X3RoaXMucHJvcHMuaW5wdXRQcm9wcy5vbkNoYW5nZShldmVudCk7fX0sX3RlbXApLF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLF9yZXQpO31fY3JlYXRlQ2xhc3MoSW5wdXQsW3trZXk6J2NvbXBvbmVudFdpbGxNb3VudCcsdmFsdWU6ZnVuY3Rpb24gY29tcG9uZW50V2lsbE1vdW50KCl7aWYodGhpcy5zdGF0ZS5pc0NvbnRyb2xsZWQ9PT10cnVlKXtyZXR1cm4gdGhpcy5zZXRJbnB1dFZhbHVlKHRoaXMucHJvcHMuaW5wdXRQcm9wcy52YWx1ZSk7fXRoaXMuc2V0SW5wdXRWYWx1ZSh0aGlzLnByb3BzLmlucHV0UHJvcHMuZGVmYXVsdFZhbHVlKTt9fSx7a2V5Oidjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJyx2YWx1ZTpmdW5jdGlvbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcyl7aWYobmV4dFByb3BzLmlucHV0UHJvcHMudmFsdWUhPT10aGlzLnByb3BzLmlucHV0UHJvcHMudmFsdWUpe3RoaXMuc2V0SW5wdXRWYWx1ZShuZXh0UHJvcHMuaW5wdXRQcm9wcy52YWx1ZSk7fX19LHtrZXk6J3NldFZhbHVlJyx2YWx1ZTpmdW5jdGlvbiBzZXRWYWx1ZShuZXh0VmFsdWUpe3RoaXMuc2V0SW5wdXRWYWx1ZShuZXh0VmFsdWUpO3RoaXMucmVmcy5maWVsZC52YWx1ZT1uZXh0VmFsdWU7aWYodGhpcy5zdGF0ZS5pc0NvbnRyb2xsZWQ9PT10cnVlKXt0aGlzLnJlZnMuZmllbGQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2lucHV0Jyx7YnViYmxlczp0cnVlfSkpO3RoaXMucmVmcy5maWVsZC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2hhbmdlJyx7YnViYmxlczp0cnVlfSkpO319fSx7a2V5OidnZXRQbGFjZWhvbGRlclRleHQnLHZhbHVlOmZ1bmN0aW9uIGdldFBsYWNlaG9sZGVyVGV4dCgpe3ZhciBpc05vbkVtcHR5PXRoaXMuc3RhdGUuaW5wdXQhPT0nJzt2YXIgc2hvdWxkU2hvd1BsYWNlaG9sZGVyPXRoaXMucHJvcHMuaGlkZVBsYWNlaG9sZGVyT25Gb2N1cz09PXRydWU/dGhpcy5zdGF0ZS5pc0ZvY3VzZWQ9PT1mYWxzZSYmaXNOb25FbXB0eT09PWZhbHNlOmlzTm9uRW1wdHk9PT1mYWxzZTtyZXR1cm4gc2hvdWxkU2hvd1BsYWNlaG9sZGVyP3RoaXMucHJvcHMuaW5wdXRQcm9wcy5wbGFjZWhvbGRlcjonJzt9fSx7a2V5OidyZW5kZXInLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudCh0aGlzLnByb3BzLmNvbXBvbmVudCxfZXh0ZW5kcyh7fSxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fX2RlZmF1bHQoKSh0aGlzLnByb3BzLElucHV0LmludGVybmFsS2V5cykse2NsYXNzTmFtZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQoKSgnYi1pbnB1dC13cmFwcGVyJyx0aGlzLnByb3BzLmNsYXNzTmFtZSksdGl0bGU6dGhpcy5nZXRQbGFjZWhvbGRlclRleHQoKX0pLF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KCdpbnB1dCcsX2V4dGVuZHMoe30sdGhpcy5wcm9wcy5pbnB1dFByb3BzLHtyZWY6J2ZpZWxkJyxjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItaW5wdXQnLHRoaXMucHJvcHMuaW5wdXRQcm9wcy5jbGFzc05hbWUpLHBsYWNlaG9sZGVyOm51bGwsb25CbHVyOnRoaXMuaGFuZGxlQmx1cixvbkZvY3VzOnRoaXMuaGFuZGxlRm9jdXMsb25DaGFuZ2U6dGhpcy5oYW5kbGVDaGFuZ2V9KSksX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoJ2Rpdicse2NsYXNzTmFtZTonYi1pbnB1dC1wbGFjZWhvbGRlciBiLWlucHV0J30sdGhpcy5nZXRQbGFjZWhvbGRlclRleHQoKSkpO319XSk7cmV0dXJuIElucHV0O30oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLlB1cmVDb21wb25lbnQpO0lucHV0LnByb3BUeXBlcz17JyonOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmFueSxjb21wb25lbnQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc3RyaW5nLGhpZGVQbGFjZWhvbGRlck9uRm9jdXM6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYm9vbCxpbnB1dFByb3BzOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLnNoYXBlKHsnKic6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYW55LGRlZmF1bHRWYWx1ZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5zdHJpbmcsb25CbHVyOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmMsb25Gb2N1czpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jLG9uQ2hhbmdlOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmMscGxhY2Vob2xkZXI6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc3RyaW5nLHR5cGU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc3RyaW5nLHZhbHVlOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLnN0cmluZ30pfTtJbnB1dC5kZWZhdWx0UHJvcHM9e2NvbXBvbmVudDonZGl2JyxoaWRlUGxhY2Vob2xkZXJPbkZvY3VzOnRydWUsaW5wdXRQcm9wczp7dHlwZTondGV4dCd9fTtJbnB1dC5pbnRlcm5hbEtleXM9T2JqZWN0LmtleXMoSW5wdXQuZGVmYXVsdFByb3BzKTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gSW5wdXQ7XG5cbi8qKiovIH0pXG4vKioqKioqLyBdKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gaW5kZXguanMiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAzKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCBlN2EyZGIzZDNlYWFhMDAxYzNiOCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzXCJ9XG4vLyBtb2R1bGUgaWQgPSAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNsYXNzbmFtZXNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJjbGFzc25hbWVzXCJ9XG4vLyBtb2R1bGUgaWQgPSAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn1cbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IFJlYWN0LCB7UHJvcFR5cGVzfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY3ggZnJvbSAnY2xhc3NuYW1lcyc7XG5cbmltcG9ydCBvbWl0IGZyb20gJ2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMnO1xuXG5jb25zdCBpc0Z1bmN0aW9uID0gKHgpID0+IHR5cGVvZiB4ID09PSAnZnVuY3Rpb24nO1xuXG4vKipcbl9fQW4gaW5wdXQgY29udHJvbCB3aXRoIHBsYWNlaG9sZGVyIGVtdWxhdGlvbiBmb3Igbm9uLXN1cHBvcnRpbmcgcGxhdGZvcm1zLl9fXG5cbklucHV0IGFic3RyYWN0cyBhd2F5IHRoZSBjcm9zcy1wbGF0Zm9ybSBkaWZmZXJlbmNlcyBvZiBwbGFjZWhvbGRlciBzdHlsaW5nIGFuZCBiZWhhdmlvcnMsIGZvciBleGFtcGxlOiBJbnRlcm5ldCBFeHBsb3JlciBkaXNtaXNzZXMgbmF0aXZlIHBsYWNlaG9sZGVycyBvbiBpbnB1dCBmb2N1cyBhbmQgb3RoZXIgcGxhdGZvcm1zIGRvIG5vdC4gVGhpcyBjb21wb25lbnQgZW5zdXJlcyB0aGF0IHRleHQgaW5wdXQgY29udHJvbHMgd2lsbCBmZWVsIGFuZCBiZWhhdmUgc2ltaWxhcmx5IG9uIG1vcmUgZGV2aWNlcy5cblxuIyMgQ29tcG9uZW50IEluc3RhbmNlIE1ldGhvZHNcblxuV2hlbiB1c2luZyBgSW5wdXRgIGluIHlvdXIgcHJvamVjdCwgeW91IG1heSBjYWxsIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvbiBhIHJlbmRlcmVkIGluc3RhbmNlIG9mIHRoZSBjb21wb25lbnQuIFVzZSBbYHJlZnNgXShodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3JlZnMtYW5kLXRoZS1kb20uaHRtbCkgdG8gZ2V0IHRoZSBpbnN0YW5jZS5cblxuLSBfX2dldFZhbHVlKClfX1xuICByZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBpbnB1dCBmaWVsZFxuXG4tIF9fc2V0VmFsdWUoc3RyaW5nKV9fXG4gIHByb2dyYW1tYXRpY2FsbHkgc2V0IHRoZSBpbnB1dCB2YWx1ZTsgdXNlZnVsIGZvciBjbGVhcmluZyBvdXQgdGhlIGlucHV0IGluIFwidW5jb250cm9sbGVkXCIgbW9kZSAtLSBub3RlIHRoYXQgZGlnZ2luZyBpbnRvIHRoZSBpbnRlcm5hbHMgYW5kIHNldHRpbmcgdGhlIGByZWZzLmZpZWxkLnZhbHVlID0gJydgIGRpcmVjdGx5IHdpbGwgbm90IHRyaWdnZXIgZXZlbnRzIGFuZCBtZXNzZXMgdXAgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBjb21wb25lbnRcblxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbnB1dCBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xuICAgIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhbnkgW1JlYWN0LXN1cHBvcnRlZCBhdHRyaWJ1dGVdKGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdGFncy1hbmQtYXR0cmlidXRlcy5odG1sI2h0bWwtYXR0cmlidXRlcylcbiAgICAgICAgICovXG4gICAgICAgICcqJzogUHJvcFR5cGVzLmFueSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogb3ZlcnJpZGVzIHRoZSBIVE1MIGNvbnRhaW5lciB0YWdcbiAgICAgICAgICovXG4gICAgICAgIGNvbXBvbmVudDogUHJvcFR5cGVzLnN0cmluZyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogdHJpZ2dlcnMgdGhlIHBsYWNlaG9sZGVyIHRvIGRpc2FwcGVhciB3aGVuIHRoZSBpbnB1dCBmaWVsZCBpcyBmb2N1c2VkLCByZWFwcGVhcnMgd2hlbiB0aGUgdXNlciBoYXMgdGFiYmVkIGF3YXkgb3IgZm9jdXMgaXMgbW92ZWRcbiAgICAgICAgICovXG4gICAgICAgIGhpZGVQbGFjZWhvbGRlck9uRm9jdXM6IFByb3BUeXBlcy5ib29sLFxuXG4gICAgICAgIGlucHV0UHJvcHM6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIGFueSBbUmVhY3Qtc3VwcG9ydGVkIGF0dHJpYnV0ZV0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90YWdzLWFuZC1hdHRyaWJ1dGVzLmh0bWwjaHRtbC1hdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICAnKic6IFByb3BUeXBlcy5hbnksXG5cbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgICAgIG9uQmx1cjogUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgICAgICBvbkZvY3VzOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgICAgICAgdHlwZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgICAgIHZhbHVlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgICB9KSxcbiAgICB9XG5cbiAgICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgICBjb21wb25lbnQ6ICdkaXYnLFxuICAgICAgICBoaWRlUGxhY2Vob2xkZXJPbkZvY3VzOiB0cnVlLFxuICAgICAgICBpbnB1dFByb3BzOiB7XG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgIH0sXG4gICAgfVxuXG4gICAgc3RhdGljIGludGVybmFsS2V5cyA9IE9iamVjdC5rZXlzKElucHV0LmRlZmF1bHRQcm9wcylcblxuICAgIHN0YXRlID0ge1xuICAgICAgICBpbnB1dDogJycsXG4gICAgICAgIGlzQ29udHJvbGxlZDogdHlwZW9mIHRoaXMucHJvcHMuaW5wdXRQcm9wcy52YWx1ZSA9PT0gJ3N0cmluZycsXG4gICAgICAgIGlzRm9jdXNlZDogZmFsc2UsXG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbE1vdW50KCkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5pc0NvbnRyb2xsZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNldElucHV0VmFsdWUodGhpcy5wcm9wcy5pbnB1dFByb3BzLnZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0SW5wdXRWYWx1ZSh0aGlzLnByb3BzLmlucHV0UHJvcHMuZGVmYXVsdFZhbHVlKTtcbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgICBpZiAobmV4dFByb3BzLmlucHV0UHJvcHMudmFsdWUgIT09IHRoaXMucHJvcHMuaW5wdXRQcm9wcy52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRJbnB1dFZhbHVlKG5leHRQcm9wcy5pbnB1dFByb3BzLnZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldElucHV0VmFsdWUgPSAodmFsdWUgPSAnJykgPT4gdGhpcy5zZXRTdGF0ZSh7aW5wdXQ6IHZhbHVlfSlcblxuICAgIGdldFZhbHVlID0gKCkgPT4gdGhpcy5yZWZzLmZpZWxkLnZhbHVlXG5cbiAgICBzZXRWYWx1ZShuZXh0VmFsdWUpIHtcbiAgICAgICAgdGhpcy5zZXRJbnB1dFZhbHVlKG5leHRWYWx1ZSk7XG4gICAgICAgIHRoaXMucmVmcy5maWVsZC52YWx1ZSA9IG5leHRWYWx1ZTtcblxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5pc0NvbnRyb2xsZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIC8vIHNpbXVsYXRlIGlucHV0IGNoYW5nZSBldmVudCBmbG93XG4gICAgICAgICAgICB0aGlzLnJlZnMuZmllbGQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2lucHV0Jywge2J1YmJsZXM6IHRydWV9KSk7XG4gICAgICAgICAgICB0aGlzLnJlZnMuZmllbGQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2NoYW5nZScsIHtidWJibGVzOiB0cnVlfSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlQmx1ciA9IChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtpc0ZvY3VzZWQ6IGZhbHNlfSk7XG5cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uQmx1cikgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMuaW5wdXRQcm9wcy5vbkJsdXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlRm9jdXMgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7aXNGb2N1c2VkOiB0cnVlfSk7XG5cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uRm9jdXMpID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLmlucHV0UHJvcHMub25Gb2N1cyhldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYW5kbGVDaGFuZ2UgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgLy8gZm9yIFwiY29udHJvbGxlZFwiIHNjZW5hcmlvcywgdXBkYXRlcyB0byB0aGUgY2FjaGVkIGlucHV0IHRleHQgc2hvdWxkIGNvbWVcbiAgICAgICAgLy8gZXhjbHVzaXZlbHkgdmlhIHByb3BzIChjV1JQKSBzbyBpdCBleGFjdGx5IG1pcnJvcnMgdGhlIGN1cnJlbnQgYXBwbGljYXRpb25cbiAgICAgICAgLy8gc3RhdGUsIG90aGVyd2lzZSBhIHJlLXJlbmRlciB3aWxsIG9jY3VyIGJlZm9yZSB0aGUgbmV3IHRleHQgaGFzIGNvbXBsZXRlZCBpdHNcbiAgICAgICAgLy8gZmVlZGJhY2sgbG9vcCBhbmQgdGhlIGN1cnNvciBwb3NpdGlvbiBpcyBsb3N0XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmlzQ29udHJvbGxlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SW5wdXRWYWx1ZShldmVudC50YXJnZXQudmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uQ2hhbmdlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFBsYWNlaG9sZGVyVGV4dCgpIHtcbiAgICAgICAgY29uc3QgaXNOb25FbXB0eSA9IHRoaXMuc3RhdGUuaW5wdXQgIT09ICcnO1xuICAgICAgICBjb25zdCBzaG91bGRTaG93UGxhY2Vob2xkZXIgPSB0aGlzLnByb3BzLmhpZGVQbGFjZWhvbGRlck9uRm9jdXMgPT09IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnN0YXRlLmlzRm9jdXNlZCA9PT0gZmFsc2UgJiYgaXNOb25FbXB0eSA9PT0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpc05vbkVtcHR5ID09PSBmYWxzZTtcblxuICAgICAgICByZXR1cm4gc2hvdWxkU2hvd1BsYWNlaG9sZGVyID8gdGhpcy5wcm9wcy5pbnB1dFByb3BzLnBsYWNlaG9sZGVyIDogJyc7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPHRoaXMucHJvcHMuY29tcG9uZW50XG4gICAgICAgICAgICAgICAgey4uLm9taXQodGhpcy5wcm9wcywgSW5wdXQuaW50ZXJuYWxLZXlzKX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KCdiLWlucHV0LXdyYXBwZXInLCB0aGlzLnByb3BzLmNsYXNzTmFtZSl9XG4gICAgICAgICAgICAgICAgdGl0bGU9e3RoaXMuZ2V0UGxhY2Vob2xkZXJUZXh0KCl9PlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICB7Li4udGhpcy5wcm9wcy5pbnB1dFByb3BzfVxuICAgICAgICAgICAgICAgICAgICByZWY9J2ZpZWxkJ1xuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KCdiLWlucHV0JywgdGhpcy5wcm9wcy5pbnB1dFByb3BzLmNsYXNzTmFtZSl9XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtudWxsfVxuICAgICAgICAgICAgICAgICAgICBvbkJsdXI9e3RoaXMuaGFuZGxlQmx1cn1cbiAgICAgICAgICAgICAgICAgICAgb25Gb2N1cz17dGhpcy5oYW5kbGVGb2N1c31cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuaGFuZGxlQ2hhbmdlfSAvPlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2ItaW5wdXQtcGxhY2Vob2xkZXIgYi1pbnB1dCc+XG4gICAgICAgICAgICAgICAgICAgIHt0aGlzLmdldFBsYWNlaG9sZGVyVGV4dCgpfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC90aGlzLnByb3BzLmNvbXBvbmVudD5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9ib3VuZGxlc3MtaW5wdXQvaW5kZXguanMiXSwic291cmNlUm9vdCI6IiJ9 |
@@ -9,3 +9,2 @@ import React, {PropTypes} from 'react'; | ||
/** | ||
# Input | ||
__An input control with placeholder emulation for non-supporting platforms.__ | ||
@@ -29,2 +28,12 @@ | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
'*': PropTypes.any, | ||
/** | ||
* overrides the HTML container tag | ||
*/ | ||
component: PropTypes.string, | ||
/** | ||
* triggers the placeholder to disappear when the input field is focused, reappears when the user has tabbed away or focus is moved | ||
@@ -34,6 +43,8 @@ */ | ||
/** | ||
* props to be passed through to the input node, `.b-textual-input`; this includes the standard set of React input props like `defaultValue`, `value`, `name`, `placeholder`, `autoFocus`, etc. | ||
*/ | ||
inputProps: PropTypes.shape({ | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
'*': PropTypes.any, | ||
defaultValue: PropTypes.string, | ||
@@ -50,2 +61,3 @@ onBlur: PropTypes.func, | ||
static defaultProps = { | ||
component: 'div', | ||
hidePlaceholderOnFocus: true, | ||
@@ -126,5 +138,5 @@ inputProps: { | ||
const isNonEmpty = this.state.input !== ''; | ||
const shouldShowPlaceholder = this.props.hidePlaceholderOnFocus === true | ||
? this.state.isFocused === false && isNonEmpty === false | ||
: isNonEmpty === false; | ||
const shouldShowPlaceholder = this.props.hidePlaceholderOnFocus === true | ||
? this.state.isFocused === false && isNonEmpty === false | ||
: isNonEmpty === false; | ||
@@ -134,25 +146,12 @@ return shouldShowPlaceholder ? this.props.inputProps.placeholder : ''; | ||
renderPlaceholder() { | ||
return ( | ||
<div ref='placeholder' className='b-input-placeholder b-input'> | ||
{this.getPlaceholderText()} | ||
</div> | ||
); | ||
} | ||
render() { | ||
const {props} = this; | ||
return ( | ||
<div | ||
{...omit(props, Input.internalKeys)} | ||
ref='wrapper' | ||
className={cx('b-input-wrapper', props.className)} | ||
<this.props.component | ||
{...omit(this.props, Input.internalKeys)} | ||
className={cx('b-input-wrapper', this.props.className)} | ||
title={this.getPlaceholderText()}> | ||
{this.renderPlaceholder()} | ||
<input | ||
{...props.inputProps} | ||
{...this.props.inputProps} | ||
ref='field' | ||
className={cx('b-input', props.inputProps.className)} | ||
className={cx('b-input', this.props.inputProps.className)} | ||
placeholder={null} | ||
@@ -162,5 +161,9 @@ onBlur={this.handleBlur} | ||
onChange={this.handleChange} /> | ||
</div> | ||
<div className='b-input-placeholder b-input'> | ||
{this.getPlaceholderText()} | ||
</div> | ||
</this.props.component> | ||
); | ||
} | ||
} |
{ | ||
"name": "boundless-input", | ||
"version": "1.0.0-beta.5", | ||
"version": "1.0.0-beta.7", | ||
"description": "An input control with placeholder emulation for non-supporting platforms.", | ||
@@ -28,3 +28,3 @@ "main": "build/index.js", | ||
"dependencies": { | ||
"boundless-utils-omit-keys": "^1.0.0-beta.5", | ||
"boundless-utils-omit-keys": "^1.0.0-beta.7", | ||
"classnames": "^2.1.5" | ||
@@ -31,0 +31,0 @@ }, |
@@ -0,4 +1,6 @@ | ||
<!--- | ||
THIS IS AN AUTOGENERATED FILE. EDIT INDEX.JS INSTEAD. | ||
--> | ||
# Input | ||
# Input | ||
__An input control with placeholder emulation for non-supporting platforms.__ | ||
@@ -18,5 +20,56 @@ | ||
## Example Usage | ||
```jsx | ||
import React from 'react'; | ||
import Input from '../index'; | ||
export default class InputDemo extends React.PureComponent { | ||
state = { | ||
input: '', | ||
} | ||
handleChange = (e) => this.setState({input: e.target.value}) | ||
render() { | ||
return ( | ||
<div className='spread'> | ||
<div> | ||
<h5><code>hidePlaceholderOnFocus={false}</code></h5> | ||
<Input | ||
hidePlaceholderOnFocus={false} | ||
inputProps={{ | ||
placeholder: 'Start typing and I disappear!', | ||
}} /> | ||
</div> | ||
<div style={{marginLeft: '1em'}}> | ||
<h5><code>hidePlaceholderOnFocus={true}</code></h5> | ||
<Input | ||
hidePlaceholderOnFocus={true} | ||
inputProps={{ | ||
placeholder: 'Focus on me and I disappear!', | ||
}} /> | ||
</div> | ||
<div style={{marginLeft: '1em'}}> | ||
<h5>"controlled" input</h5> | ||
<Input | ||
hidePlaceholderOnFocus={true} | ||
inputProps={{ | ||
placeholder: 'Focus on me and I disappear!', | ||
onChange: this.handleChange, | ||
value: this.state.input, | ||
}} /> | ||
</div> | ||
</div> | ||
); | ||
} | ||
} | ||
``` | ||
## Props | ||
_Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/Input#props)._ | ||
> Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/Input#props). | ||
@@ -30,28 +83,44 @@ ### Required Props | ||
<table> | ||
<tr> | ||
<th>Name</th> | ||
<th>Type</th> | ||
<th>Default Value</th> | ||
<th>Description</th> | ||
</tr> | ||
- __`*`__ ・ any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
<tr> | ||
<td>hidePlaceholderOnFocus</td> | ||
<td><pre><code>bool</code></pre></td> | ||
<td><pre><code class="language-js">true</code></pre></td> | ||
<td>triggers the placeholder to disappear when the input field is focused, reappears when the user has tabbed away or focus is moved</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any` | `n/a` | ||
<tr> | ||
<td>inputProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{ | ||
- __`component`__ ・ overrides the HTML container tag | ||
Expects | Default Value | ||
- | - | ||
`string` | `'div'` | ||
- __`hidePlaceholderOnFocus`__ ・ triggers the placeholder to disappear when the input field is focused, reappears when the user has tabbed away or focus is moved | ||
Expects | Default Value | ||
- | - | ||
`bool` | `true` | ||
- __`inputProps`__ | ||
Expects | Default Value | ||
- | - | ||
`object` | `{ | ||
type: 'text', | ||
}</code></pre></td> | ||
<td>props to be passed through to the input node, `.b-textual-input`; this includes the standard set of React input props like `defaultValue`, `value`, `name`, `placeholder`, `autoFocus`, etc.</td> | ||
</tr> | ||
}` | ||
</table> | ||
## Reference Styles | ||
### Stylus | ||
```stylus | ||
// Bring in Boundless's base Stylus variables | ||
@require "node_modules/boundless-input/variables" | ||
// Redefine any variables as desired, e.g. | ||
color-accent = royalblue | ||
// Bring in the component styles; they will be autoconfigured based on the above | ||
@require "node_modules/boundless-input/style" | ||
``` | ||
### CSS | ||
If desired, a precompiled plain CSS stylesheet is available for customization at `/build/style.css`, based on Boundless's [default variables](https://github.com/enigma-io/boundless/blob/master/variables.styl). | ||
@@ -1,2 +0,2 @@ | ||
module.exports=function(e){function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}var t={};return r.m=e,r.c=t,r.i=function(e){return e},r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:n})},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r.p="",r(r.s=6)}([function(e,r,t){"use strict";function n(e,r){return Object.keys(r).reduce(function(r,t){return t in e&&(r[t]=e[t]),r},{})}r.a=n},function(e,r,t){"use strict";function n(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Object.keys(e).reduce(function(t,n){return r.indexOf(n)===-1&&(t[n]=e[n]),t},{})}r.a=n},function(e,r){e.exports=require("boundless-dialog")},function(e,r){e.exports=require("boundless-portal")},function(e,r){e.exports=require("classnames")},function(e,r){e.exports=require("react")},function(e,r,t){"use strict";function n(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")}function o(e,r){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!r||"object"!=typeof r&&"function"!=typeof r?e:r}function a(e,r){if("function"!=typeof r&&null!==r)throw new TypeError("Super expression must either be null or a function, not "+typeof r);e.prototype=Object.create(r&&r.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),r&&(Object.setPrototypeOf?Object.setPrototypeOf(e,r):e.__proto__=r)}Object.defineProperty(r,"__esModule",{value:!0});var s=t(5),u=t.n(s),c=t(4),p=t.n(c),i=t(2),l=t.n(i),f=t(3),d=t.n(f),b=t(0),y=t(1),m=Object.assign||function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e},P=function(){function e(e,r){for(var t=0;t<r.length;t++){var n=r[t];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(r,t,n){return t&&e(r.prototype,t),n&&e(r,n),r}}(),h=function(e){function r(){return n(this,r),o(this,(r.__proto__||Object.getPrototypeOf(r)).apply(this,arguments))}return a(r,e),P(r,[{key:"render",value:function(){var e=this,n=this.props;return u.a.createElement(d.a,n.portalProps,u.a.createElement("div",m({},t.i(y.a)(n,r.internalKeys),{ref:function(r){return e.$modal=r},className:p()("b-modal-wrapper",n.className)}),u.a.createElement("div",m({},n.maskProps,{className:p()("b-modal-mask",n.maskProps.className)})),u.a.createElement(l.a,m({},t.i(b.a)(n,l.a.defaultProps),n.modalProps,{className:p()("b-modal",n.modalProps.className)}),n.children)))}}]),r}(u.a.PureComponent);h.propTypes=m({},l.a.propTypes,{maskProps:s.PropTypes.object,modalProps:s.PropTypes.object,portalProps:s.PropTypes.shape(d.a.propTypes)}),h.defaultProps=m({},l.a.defaultProps,{captureFocus:!0,maskProps:{},modalProps:{},portalProps:{}}),h.internalKeys=Object.keys(h.defaultProps),r.default=h}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIGQyZTU0NTVmYjRhYzFjOTA1OTYyIiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vYmplY3QtaW50ZXJzZWN0aW9uL2luZGV4LmpzIiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLWRpYWxvZ1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtcG9ydGFsXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImNsYXNzbmFtZXNcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn0iLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvYm91bmRsZXNzLW1vZGFsL2luZGV4LmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJtb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiaW5zdGFsbGVkTW9kdWxlcyIsImkiLCJsIiwiY2FsbCIsIm0iLCJjIiwidmFsdWUiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJnZXQiLCJuIiwiX19lc01vZHVsZSIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsIl9fd2VicGFja19leHBvcnRzX18iLCJnZXRJbnRlcnNlY3Rpb24iLCJvYmoxIiwib2JqMiIsImtleXMiLCJyZWR1Y2UiLCJjaGlsZFByb3BzIiwia2V5Iiwib21pdEtleXNGcm9tU291cmNlT2JqZWN0Iiwic291cmNlIiwib21pdHRlZEtleXMiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJoYXNoIiwiaW5kZXhPZiIsInJlcXVpcmUiLCJfY2xhc3NDYWxsQ2hlY2siLCJpbnN0YW5jZSIsIkNvbnN0cnVjdG9yIiwiVHlwZUVycm9yIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJzZWxmIiwiUmVmZXJlbmNlRXJyb3IiLCJfaW5oZXJpdHMiLCJzdWJDbGFzcyIsInN1cGVyQ2xhc3MiLCJjcmVhdGUiLCJjb25zdHJ1Y3RvciIsIndyaXRhYmxlIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc19kaWFsb2dfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfZGlhbG9nX19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfcG9ydGFsX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3BvcnRhbF9fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfYm91bmRsZXNzX3V0aWxzX29iamVjdF9pbnRlcnNlY3Rpb25fXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18iLCJfZXh0ZW5kcyIsImFzc2lnbiIsInRhcmdldCIsIl9jcmVhdGVDbGFzcyIsImRlZmluZVByb3BlcnRpZXMiLCJwcm9wcyIsImRlc2NyaXB0b3IiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJNb2RhbCIsIl9SZWFjdCRQdXJlQ29tcG9uZW50IiwidGhpcyIsImdldFByb3RvdHlwZU9mIiwiYXBwbHkiLCJfdGhpczIiLCJhIiwiY3JlYXRlRWxlbWVudCIsInBvcnRhbFByb3BzIiwiaW50ZXJuYWxLZXlzIiwicmVmIiwibm9kZSIsIiRtb2RhbCIsImNsYXNzTmFtZSIsIm1hc2tQcm9wcyIsImRlZmF1bHRQcm9wcyIsIm1vZGFsUHJvcHMiLCJjaGlsZHJlbiIsIlB1cmVDb21wb25lbnQiLCJwcm9wVHlwZXMiLCJzaGFwZSIsImNhcHR1cmVGb2N1cyJdLCJtYXBwaW5ncyI6IkFBQUFBLE9BQU9DLFFBQ0UsU0FBVUMsR0NHbkIsUUFBQUMsR0FBQUMsR0FHQSxHQUFBQyxFQUFBRCxHQUNBLE1BQUFDLEdBQUFELEdBQUFILE9BR0EsSUFBQUQsR0FBQUssRUFBQUQsSUFDQUUsRUFBQUYsRUFDQUcsR0FBQSxFQUNBTixXQVVBLE9BTkFDLEdBQUFFLEdBQUFJLEtBQUFSLEVBQUFDLFFBQUFELElBQUFDLFFBQUFFLEdBR0FILEVBQUFPLEdBQUEsRUFHQVAsRUFBQUMsUUF2QkEsR0FBQUksS0ErREEsT0FuQ0FGLEdBQUFNLEVBQUFQLEVBR0FDLEVBQUFPLEVBQUFMLEVBR0FGLEVBQUFHLEVBQUEsU0FBQUssR0FBMkMsTUFBQUEsSUFHM0NSLEVBQUFTLEVBQUEsU0FBQVgsRUFBQVksRUFBQUMsR0FDQVgsRUFBQVksRUFBQWQsRUFBQVksSUFDQUcsT0FBQUMsZUFBQWhCLEVBQUFZLEdBQ0FLLGNBQUEsRUFDQUMsWUFBQSxFQUNBQyxJQUFBTixLQU1BWCxFQUFBa0IsRUFBQSxTQUFBckIsR0FDQSxHQUFBYyxHQUFBZCxLQUFBc0IsV0FDQSxXQUEyQixNQUFBdEIsR0FBQSxTQUMzQixXQUFpQyxNQUFBQSxHQUVqQyxPQURBRyxHQUFBUyxFQUFBRSxFQUFBLElBQUFBLEdBQ0FBLEdBSUFYLEVBQUFZLEVBQUEsU0FBQVEsRUFBQUMsR0FBc0QsTUFBQVIsUUFBQVMsVUFBQUMsZUFBQWxCLEtBQUFlLEVB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S1E1R3RpR0wsRUFBQW9CLEVBQU9hLFdBS1ZMLFVBQVdqQyxFQUFBLFVBQVV0QyxPQUtyQnlFLFdBQVluQyxFQUFBLFVBQVV0QyxPQUt0QmlFLFlBQWEzQixFQUFBLFVBQVV1QyxNQUFNaEMsRUFBQWtCLEVBQU9hLGFBbEJ2Qm5CLEVBcUJWZSxhUjBGdTVHeEIsS1F6RnY1R0wsRUFBQW9CLEVBQU9TLGNBQ1ZNLGNBQWMsRUFDZFAsYUFDQUUsY0FDQVIsaUJBMUJhUixFQTZCVlMsYUFBZXpFLE9BQU9pQixLQUFLK0MsRUFBTWUsY1JrRnVsSGxFLEVBQTZCLFFRL0czb0htRCIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbi8qKioqKiovIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbi8qKioqKiovIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA2KTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGV4cG9ydCAoaW1tdXRhYmxlKSAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IGdldEludGVyc2VjdGlvbjtcbmZ1bmN0aW9uIGdldEludGVyc2VjdGlvbihvYmoxLG9iajIpe3JldHVybiBPYmplY3Qua2V5cyhvYmoyKS5yZWR1Y2UoZnVuY3Rpb24oY2hpbGRQcm9wcyxrZXkpe2lmKGtleSBpbiBvYmoxKXtjaGlsZFByb3BzW2tleV09b2JqMVtrZXldO31yZXR1cm4gY2hpbGRQcm9wczt9LHt9KTt9XG5cbi8qKiovIH0pLFxuLyogMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgZXhwb3J0IChpbW11dGFibGUpICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gb21pdEtleXNGcm9tU291cmNlT2JqZWN0O1xuZnVuY3Rpb24gb21pdEtleXNGcm9tU291cmNlT2JqZWN0KHNvdXJjZSl7dmFyIG9taXR0ZWRLZXlzPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dW5kZWZpbmVkP2FyZ3VtZW50c1sxXTpbXTtyZXR1cm4gT2JqZWN0LmtleXMoc291cmNlKS5yZWR1Y2UoZnVuY3Rpb24gcmVsb2NhdGVBY2NlcHRlZEtleXMoaGFzaCxrZXkpe2lmKG9taXR0ZWRLZXlzLmluZGV4T2Yoa2V5KT09PS0xKXtoYXNoW2tleV09c291cmNlW2tleV07fXJldHVybiBoYXNoO30se30pO31cblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy1kaWFsb2dcIik7XG5cbi8qKiovIH0pLFxuLyogMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtcG9ydGFsXCIpO1xuXG4vKioqLyB9KSxcbi8qIDQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2xhc3NuYW1lc1wiKTtcblxuLyoqKi8gfSksXG4vKiA1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG4vKioqLyB9KSxcbi8qIDYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX2RpYWxvZ19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX2RpYWxvZ19fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc19kaWFsb2dfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc19wb3J0YWxfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc19wb3J0YWxfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfcG9ydGFsX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfdXRpbHNfb2JqZWN0X2ludGVyc2VjdGlvbl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcbnZhciBfZXh0ZW5kcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0YXJnZXQpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9YXJndW1lbnRzW2ldO2Zvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSxrZXkpKXt0YXJnZXRba2V5XT1zb3VyY2Vba2V5XTt9fX1yZXR1cm4gdGFyZ2V0O307dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoXCJ2YWx1ZVwiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKTt9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcjt9O30oKTtmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7fX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLGNhbGwpe2lmKCFzZWxmKXt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7fXJldHVybiBjYWxsJiYodHlwZW9mIGNhbGw9PT1cIm9iamVjdFwifHx0eXBlb2YgY2FsbD09PVwiZnVuY3Rpb25cIik/Y2FsbDpzZWxmO31mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT1cImZ1bmN0aW9uXCImJnN1cGVyQ2xhc3MhPT1udWxsKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2Ygc3VwZXJDbGFzcyk7fXN1YkNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MmJnN1cGVyQ2xhc3MucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6c3ViQ2xhc3MsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfX0pO2lmKHN1cGVyQ2xhc3MpT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcyxzdXBlckNsYXNzKTpzdWJDbGFzcy5fX3Byb3RvX189c3VwZXJDbGFzczt9dmFyIE1vZGFsPWZ1bmN0aW9uKF9SZWFjdCRQdXJlQ29tcG9uZW50KXtfaW5oZXJpdHMoTW9kYWwsX1JlYWN0JFB1cmVDb21wb25lbnQpO2Z1bmN0aW9uIE1vZGFsKCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsTW9kYWwpO3JldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLChNb2RhbC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihNb2RhbCkpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSk7fV9jcmVhdGVDbGFzcyhNb2RhbCxbe2tleToncmVuZGVyJyx2YWx1ZTpmdW5jdGlvbiByZW5kZXIoKXt2YXIgX3RoaXMyPXRoaXM7dmFyIHByb3BzPXRoaXMucHJvcHM7cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfcG9ydGFsX19fZGVmYXVsdC5hLHByb3BzLnBvcnRhbFByb3BzLF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KCdkaXYnLF9leHRlbmRzKHt9LF9fd2VicGFja19yZXF1aXJlX18uaShfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKShwcm9wcyxNb2RhbC5pbnRlcm5hbEtleXMpLHtyZWY6ZnVuY3Rpb24gcmVmKG5vZGUpe3JldHVybiBfdGhpczIuJG1vZGFsPW5vZGU7fSxjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItbW9kYWwtd3JhcHBlcicscHJvcHMuY2xhc3NOYW1lKX0pLF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KCdkaXYnLF9leHRlbmRzKHt9LHByb3BzLm1hc2tQcm9wcyx7Y2xhc3NOYW1lOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCgpKCdiLW1vZGFsLW1hc2snLHByb3BzLm1hc2tQcm9wcy5jbGFzc05hbWUpfSkpLF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfZGlhbG9nX19fZGVmYXVsdC5hLF9leHRlbmRzKHt9LF9fd2VicGFja19yZXF1aXJlX18uaShfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfYm91bmRsZXNzX3V0aWxzX29iamVjdF9pbnRlcnNlY3Rpb25fX1tcImFcIiAvKiBkZWZhdWx0ICovXSkocHJvcHMsX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc19kaWFsb2dfX19kZWZhdWx0LmEuZGVmYXVsdFByb3BzKSxwcm9wcy5tb2RhbFByb3BzLHtjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItbW9kYWwnLHByb3BzLm1vZGFsUHJvcHMuY2xhc3NOYW1lKX0pLHByb3BzLmNoaWxkcmVuKSkpO319XSk7cmV0dXJuIE1vZGFsO30oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLlB1cmVDb21wb25lbnQpO01vZGFsLnByb3BUeXBlcz1fZXh0ZW5kcyh7fSxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX2RpYWxvZ19fX2RlZmF1bHQuYS5wcm9wVHlwZXMse21hc2tQcm9wczpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5vYmplY3QsbW9kYWxQcm9wczpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5vYmplY3QscG9ydGFsUHJvcHM6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc2hhcGUoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc19wb3J0YWxfX19kZWZhdWx0LmEucHJvcFR5cGVzKX0pO01vZGFsLmRlZmF1bHRQcm9wcz1fZXh0ZW5kcyh7fSxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX2RpYWxvZ19fX2RlZmF1bHQuYS5kZWZhdWx0UHJvcHMse2NhcHR1cmVGb2N1czp0cnVlLG1hc2tQcm9wczp7fSxtb2RhbFByb3BzOnt9LHBvcnRhbFByb3BzOnt9fSk7TW9kYWwuaW50ZXJuYWxLZXlzPU9iamVjdC5rZXlzKE1vZGFsLmRlZmF1bHRQcm9wcyk7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IE1vZGFsO1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGluZGV4LmpzIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbiBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gNik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgZDJlNTQ1NWZiNGFjMWM5MDU5NjIiLCIvKipcbiAqIFJldHVybnMgYW4gaW50ZXJzZWN0aW9uIG9mIHRoZSBmaXJzdCBhcmd1bWVudCBhZ2FpbnN0IHRoZSBzZWNvbmQgYXJndW1lbnQncyBrZXlzLlxuICogZS5nLiB1c2VkIGluIFR5cGVhaGVhZCB0byBpZGVudGlmeSB3aGljaCBwcm9wcyBhcmUgbWVhbnQgZm9yIElucHV0XG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSBvYmoxXG4gKiBAcGFyYW0gIHtPYmplY3R9IG9iajJcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9IGtleTogdmFsdWVzIGluIG9iajEgbWF0Y2hpbmcgdGhlIGtleXMgc3VwcGxpZWQgaW4gb2JqMlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEludGVyc2VjdGlvbihvYmoxLCBvYmoyKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iajIpLnJlZHVjZSgoY2hpbGRQcm9wcywga2V5KSA9PiB7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqMSkge1xuICAgICAgICAgICAgY2hpbGRQcm9wc1trZXldID0gb2JqMVtrZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNoaWxkUHJvcHM7XG5cbiAgICB9LCB7fSk7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9ib3VuZGxlc3MtdXRpbHMtb2JqZWN0LWludGVyc2VjdGlvbi9pbmRleC5qcyIsIi8qKlxuICogUmV0dXJucyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHN1cHBsaWVkIG9iamVjdCB3aXRob3V0IHRoZSBnaXZlbiBrZXlzLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBvbWl0S2V5c0Zyb21Tb3VyY2VPYmplY3Qoc291cmNlLCBvbWl0dGVkS2V5cyA9IFtdKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIHJlbG9jYXRlQWNjZXB0ZWRLZXlzKGhhc2gsIGtleSkge1xuICAgICAgICBpZiAob21pdHRlZEtleXMuaW5kZXhPZihrZXkpID09PSAtMSkge1xuICAgICAgICAgICAgaGFzaFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFzaDtcbiAgICB9LCB7fSk7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9ib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzL2luZGV4LmpzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLWRpYWxvZ1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy1kaWFsb2dcIn1cbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXBvcnRhbFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy1wb3J0YWxcIn1cbi8vIG1vZHVsZSBpZCA9IDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2xhc3NuYW1lc1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImNsYXNzbmFtZXNcIn1cbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdFwifVxuLy8gbW9kdWxlIGlkID0gNVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgUmVhY3QsIHtQcm9wVHlwZXN9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjeCBmcm9tICdjbGFzc25hbWVzJztcblxuaW1wb3J0IERpYWxvZyBmcm9tICdib3VuZGxlc3MtZGlhbG9nJztcbmltcG9ydCBQb3J0YWwgZnJvbSAnYm91bmRsZXNzLXBvcnRhbCc7XG5pbXBvcnQgZXh0cmFjdENoaWxkUHJvcHMgZnJvbSAnYm91bmRsZXNzLXV0aWxzLW9iamVjdC1pbnRlcnNlY3Rpb24nO1xuaW1wb3J0IG9taXQgZnJvbSAnYm91bmRsZXNzLXV0aWxzLW9taXQta2V5cyc7XG5cbi8qKlxuIyBNb2RhbFxuX19BIGJsb2NraW5nLCBmb2N1cy1zdGVhbGluZyBjb250YWluZXIuX19cblxuTW9kYWwgaXMgYW4gZW5oYW5jZW1lbnQgdXBvbiBbRGlhbG9nXShodHRwczovL2dpdGh1Yi5jb20vZW5pZ21hLWlvL2JvdW5kbGVzcy9ibG9iL21hc3Rlci9wYWNrYWdlcy9ib3VuZGxlc3MtZGlhbG9nL1JFQURNRS5tZCkuIFR5cGljYWxseSwgYSBtYXNraW5nIGxheWVyIGlzIHByb3ZpZGVkIHRvIG9ic2N1cmUgdGhlIHJlc3Qgb2YgdGhlIHBhZ2UgaW4gc29tZSBmYXNoaW9uLCB3aGlsZSBhbHNvIGJsb2NraW5nIG91dHNpZGUgY2xpY2sgYW5kIGtleXN0cm9rZSBhY2Nlc3MgdW50aWwgdGhlIG1vZGFsIGlzIGRpc21pc3NlZC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kYWwgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgICAvKiogTW9kYWwgc3VwcG9ydHMgYWxsIFtEaWFsb2cgcHJvcHNdKGh0dHBzOi8vZ2l0aHViLmNvbS9lbmlnbWEtaW8vYm91bmRsZXNzL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL2JvdW5kbGVzcy1kaWFsb2cvUkVBRE1FLm1kI3Byb3BzKSAqL1xuICAgICAgICAuLi5EaWFsb2cucHJvcFR5cGVzLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhbnkgW1JlYWN0LXN1cHBvcnRlZCBhdHRyaWJ1dGVdKGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdGFncy1hbmQtYXR0cmlidXRlcy5odG1sI2h0bWwtYXR0cmlidXRlcyk7IGFwcGxpZWQgdG8gdGhlIGAuYi1tb2RhbC1tYXNrYCBIVE1MIGVsZW1lbnRcbiAgICAgICAgICovXG4gICAgICAgIG1hc2tQcm9wczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogYW55IFtSZWFjdC1zdXBwb3J0ZWQgYXR0cmlidXRlXShodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RhZ3MtYW5kLWF0dHJpYnV0ZXMuaHRtbCNodG1sLWF0dHJpYnV0ZXMpOyBhcHBsaWVkIHRvIHRoZSBgLmItbW9kYWxgIEhUTUwgZWxlbWVudFxuICAgICAgICAgKi9cbiAgICAgICAgbW9kYWxQcm9wczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogYW55L2FsbCBzdXBwb3J0ZWQgW1BvcnRhbCBwcm9wc10oaHR0cHM6Ly9naXRodWIuY29tL2VuaWdtYS1pby9ib3VuZGxlc3MvYmxvYi9tYXN0ZXIvcGFja2FnZXMvYm91bmRsZXNzLXBvcnRhbC9SRUFETUUubWQjcHJvcHMpXG4gICAgICAgICAqL1xuICAgICAgICBwb3J0YWxQcm9wczogUHJvcFR5cGVzLnNoYXBlKFBvcnRhbC5wcm9wVHlwZXMpLFxuICAgIH1cblxuICAgIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgICAgIC4uLkRpYWxvZy5kZWZhdWx0UHJvcHMsXG4gICAgICAgIGNhcHR1cmVGb2N1czogdHJ1ZSxcbiAgICAgICAgbWFza1Byb3BzOiB7fSxcbiAgICAgICAgbW9kYWxQcm9wczoge30sXG4gICAgICAgIHBvcnRhbFByb3BzOiB7fSxcbiAgICB9XG5cbiAgICBzdGF0aWMgaW50ZXJuYWxLZXlzID0gT2JqZWN0LmtleXMoTW9kYWwuZGVmYXVsdFByb3BzKVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCB7cHJvcHN9ID0gdGhpcztcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPFBvcnRhbCB7Li4ucHJvcHMucG9ydGFsUHJvcHN9PlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgey4uLm9taXQocHJvcHMsIE1vZGFsLmludGVybmFsS2V5cyl9XG4gICAgICAgICAgICAgICAgICAgIHJlZj17KG5vZGUpID0+ICh0aGlzLiRtb2RhbCA9IG5vZGUpfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KCdiLW1vZGFsLXdyYXBwZXInLCBwcm9wcy5jbGFzc05hbWUpfT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgey4uLnByb3BzLm1hc2tQcm9wc31cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y3goJ2ItbW9kYWwtbWFzaycsIHByb3BzLm1hc2tQcm9wcy5jbGFzc05hbWUpfSAvPlxuXG4gICAgICAgICAgICAgICAgICAgIDxEaWFsb2dcbiAgICAgICAgICAgICAgICAgICAgICAgIHsuLi5leHRyYWN0Q2hpbGRQcm9wcyhwcm9wcywgRGlhbG9nLmRlZmF1bHRQcm9wcyl9XG4gICAgICAgICAgICAgICAgICAgICAgICB7Li4ucHJvcHMubW9kYWxQcm9wc31cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y3goJ2ItbW9kYWwnLCBwcm9wcy5tb2RhbFByb3BzLmNsYXNzTmFtZSl9PlxuICAgICAgICAgICAgICAgICAgICAgICAge3Byb3BzLmNoaWxkcmVufVxuICAgICAgICAgICAgICAgICAgICA8L0RpYWxvZz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvUG9ydGFsPlxuICAgICAgICApO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL2JvdW5kbGVzcy1tb2RhbC9pbmRleC5qcyJdLCJzb3VyY2VSb290IjoiIn0= | ||
module.exports=function(e){function r(o){if(t[o])return t[o].exports;var n=t[o]={i:o,l:!1,exports:{}};return e[o].call(n.exports,n,n.exports,r),n.l=!0,n.exports}var t={};return r.m=e,r.c=t,r.i=function(e){return e},r.d=function(e,t,o){r.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:o})},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r.p="",r(r.s=6)}([function(e,r){e.exports=require("boundless-dialog")},function(e,r){e.exports=require("boundless-portal")},function(e,r){e.exports=require("boundless-utils-object-intersection")},function(e,r){e.exports=require("boundless-utils-omit-keys")},function(e,r){e.exports=require("classnames")},function(e,r){e.exports=require("react")},function(e,r,t){"use strict";function o(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")}function n(e,r){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!r||"object"!=typeof r&&"function"!=typeof r?e:r}function a(e,r){if("function"!=typeof r&&null!==r)throw new TypeError("Super expression must either be null or a function, not "+typeof r);e.prototype=Object.create(r&&r.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),r&&(Object.setPrototypeOf?Object.setPrototypeOf(e,r):e.__proto__=r)}Object.defineProperty(r,"__esModule",{value:!0});var s=t(5),p=t.n(s),u=t(4),i=t.n(u),l=t(0),c=t.n(l),f=t(1),y=t.n(f),d=t(2),m=t.n(d),b=t(3),P=t.n(b),h=Object.assign||function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o])}return e},v=function(){function e(e,r){for(var t=0;t<r.length;t++){var o=r[t];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(r,t,o){return t&&e(r.prototype,t),o&&e(r,o),r}}(),O=function(e){function r(){return o(this,r),n(this,(r.__proto__||Object.getPrototypeOf(r)).apply(this,arguments))}return a(r,e),v(r,[{key:"render",value:function(){var e=this,t=this.props;return p.a.createElement(y.a,t.portalProps,p.a.createElement("div",h({},P()(t,r.internalKeys),{ref:function(r){return e.$modal=r},className:i()("b-modal-wrapper",t.className)}),p.a.createElement("div",h({},t.maskProps,{className:i()("b-modal-mask",t.maskProps.className)})),p.a.createElement(c.a,h({},m()(t,c.a.defaultProps),t.modalProps,{className:i()("b-modal",t.modalProps.className)}),t.children)))}}]),r}(p.a.PureComponent);O.propTypes=h({},c.a.propTypes,{maskProps:s.PropTypes.shape({"*":s.PropTypes.any}),modalProps:s.PropTypes.shape({"*":s.PropTypes.any}),portalProps:s.PropTypes.shape(y.a.propTypes)}),O.defaultProps=h({},c.a.defaultProps,{captureFocus:!0,maskProps:{},modalProps:{},portalProps:{}}),O.internalKeys=Object.keys(O.defaultProps),r.default=O}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIGU3NTg4ZDgzZjdiNjg2NTBmMjhmIiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy1kaWFsb2dcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXBvcnRhbFwifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtdXRpbHMtb2JqZWN0LWludGVyc2VjdGlvblwifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImNsYXNzbmFtZXNcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn0iLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvYm91bmRsZXNzLW1vZGFsL2luZGV4LmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJtb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiaW5zdGFsbGVkTW9kdWxlcyIsImkiLCJsIiwiY2FsbCIsIm0iLCJjIiwidmFsdWUiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJnZXQiLCJuIiwiX19lc01vZHVsZSIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsInJlcXVpcmUiLCJfX3dlYnBhY2tfZXhwb3J0c19fIiwiX2NsYXNzQ2FsbENoZWNrIiwiaW5zdGFuY2UiLCJDb25zdHJ1Y3RvciIsIlR5cGVFcnJvciIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIiwic2VsZiIsIlJlZmVyZW5jZUVycm9yIiwiX2luaGVyaXRzIiwic3ViQ2xhc3MiLCJzdXBlckNsYXNzIiwiY3JlYXRlIiwiY29uc3RydWN0b3IiLCJ3cml0YWJsZSIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfZGlhbG9nX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX2RpYWxvZ19fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3BvcnRhbF9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc19wb3J0YWxfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X2JvdW5kbGVzc191dGlsc19vYmplY3RfaW50ZXJzZWN0aW9uX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfYm91bmRsZXNzX3V0aWxzX29iamVjdF9pbnRlcnNlY3Rpb25fX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV81X2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCIsIl9leHRlbmRzIiwiYXNzaWduIiwidGFyZ2V0IiwiYXJndW1lbnRzIiwibGVuZ3RoIiwic291cmNlIiwia2V5IiwiX2NyZWF0ZUNsYXNzIiwiZGVmaW5lUHJvcGVydGllcyIsInByb3BzIiwiZGVzY3JpcHRvciIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsIk1vZGFsIiwiX1JlYWN0JFB1cmVDb21wb25lbnQiLCJ0aGlzIiwiZ2V0UHJvdG90eXBlT2YiLCJhcHBseSIsIl90aGlzMiIsImEiLCJjcmVhdGVFbGVtZW50IiwicG9ydGFsUHJvcHMiLCJpbnRlcm5hbEtleXMiLCJyZWYiLCJub2RlIiwiJG1vZGFsIiwiY2xhc3NOYW1lIiwibWFza1Byb3BzIiwiZGVmYXVsdFByb3BzIiwibW9kYWxQcm9wcyIsImNoaWxkcmVuIiwiUHVyZUNvbXBvbmVudCIsInByb3BUeXBlcyIsInNoYXBlIiwiKiIsImFueSIsImNhcHR1cmVGb2N1cyIsImtleXMiXSwibWFwcGluZ3MiOiJBQUFBQSxPQUFPQyxRQUNFLFNBQVVDLEdDR25CLFFBQUFDLEdBQUFDLEdBR0EsR0FBQUMsRUFBQUQsR0FDQSxNQUFBQyxHQUFBRCxHQUFBSCxPQUdBLElBQUFELEdBQUFLLEVBQUFELElBQ0FFLEVBQUFGLEVBQ0FHLEdBQUEsRUFDQU4sV0FVQSxPQU5BQyxHQUFBRSxHQUFBSSxLQUFBUixFQUFBQyxRQUFBRCxJQUFBQyxRQUFBRSxHQUdBSCxFQUFBTyxHQUFBLEVBR0FQLEVBQUFDLFFBdkJBLEdBQUFJLEtBK0RBLE9BbkNBRixHQUFBTSxFQUFBUCxFQUdBQyxFQUFBTyxFQUFBTCxFQUdBRixFQUFBRyxFQUFBLFNBQUFLLEdBQTJDLE1BQUFBLElBRzNDUixFQUFBUyxFQUFBLFNBQUFYLEVBQUFZLEVBQUFDLEdBQ0FYLEVBQUFZLEVBQUFkLEVBQUFZLElBQ0FHLE9BQUFDLGVBQUFoQixFQUFBWSxHQUNBSyxjQUFBLEVBQ0FDLFlBQUEsRUFDQUMsSUFBQU4sS0FNQVgsRUFBQWtCLEVBQUEsU0FBQXJCLEdBQ0EsR0FBQWMsR0FBQWQsS0FBQXNCLFdBQ0EsV0FBMkIsTUFBQXRCLEdBQUEsU0FDM0IsV0FBaUMsTUFBQUEsR0FFakMsT0FEQUcsR0FBQVMsRUFBQUUsRUFBQSxJQUFBQSxHQUNBQSxHQUlBWCxFQUFBWSxFQUFBLFNBQUFR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ZWhFLE9BQU8rRSxLQUFLeEIsRUFBTWUsY1JpRjZvSHhELEVBQTZCLFFROUdqc0h5QyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbi8qKioqKiovIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbi8qKioqKiovIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA2KTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLWRpYWxvZ1wiKTtcblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy1wb3J0YWxcIik7XG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtdXRpbHMtb2JqZWN0LWludGVyc2VjdGlvblwiKTtcblxuLyoqKi8gfSksXG4vKiAzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIik7XG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpO1xuXG4vKioqLyB9KSxcbi8qIDUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cbi8qKiovIH0pLFxuLyogNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShfX3dlYnBhY2tfZXhwb3J0c19fLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfZGlhbG9nX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfZGlhbG9nX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX2RpYWxvZ19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3BvcnRhbF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3BvcnRhbF9fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc19wb3J0YWxfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X2JvdW5kbGVzc191dGlsc19vYmplY3RfaW50ZXJzZWN0aW9uX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfdXRpbHNfb2JqZWN0X2ludGVyc2VjdGlvbl9fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X2JvdW5kbGVzc191dGlsc19vYmplY3RfaW50ZXJzZWN0aW9uX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzVfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fKTtcbnZhciBfZXh0ZW5kcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0YXJnZXQpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9YXJndW1lbnRzW2ldO2Zvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSxrZXkpKXt0YXJnZXRba2V5XT1zb3VyY2Vba2V5XTt9fX1yZXR1cm4gdGFyZ2V0O307dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoXCJ2YWx1ZVwiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKTt9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcjt9O30oKTtmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7fX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLGNhbGwpe2lmKCFzZWxmKXt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7fXJldHVybiBjYWxsJiYodHlwZW9mIGNhbGw9PT1cIm9iamVjdFwifHx0eXBlb2YgY2FsbD09PVwiZnVuY3Rpb25cIik/Y2FsbDpzZWxmO31mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT1cImZ1bmN0aW9uXCImJnN1cGVyQ2xhc3MhPT1udWxsKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2Ygc3VwZXJDbGFzcyk7fXN1YkNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MmJnN1cGVyQ2xhc3MucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6c3ViQ2xhc3MsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfX0pO2lmKHN1cGVyQ2xhc3MpT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcyxzdXBlckNsYXNzKTpzdWJDbGFzcy5fX3Byb3RvX189c3VwZXJDbGFzczt9dmFyIE1vZGFsPWZ1bmN0aW9uKF9SZWFjdCRQdXJlQ29tcG9uZW50KXtfaW5oZXJpdHMoTW9kYWwsX1JlYWN0JFB1cmVDb21wb25lbnQpO2Z1bmN0aW9uIE1vZGFsKCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsTW9kYWwpO3JldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLChNb2RhbC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihNb2RhbCkpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSk7fV9jcmVhdGVDbGFzcyhNb2RhbCxbe2tleToncmVuZGVyJyx2YWx1ZTpmdW5jdGlvbiByZW5kZXIoKXt2YXIgX3RoaXMyPXRoaXM7dmFyIHByb3BzPXRoaXMucHJvcHM7cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfcG9ydGFsX19fZGVmYXVsdC5hLHByb3BzLnBvcnRhbFByb3BzLF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KCdkaXYnLF9leHRlbmRzKHt9LF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNV9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCgpKHByb3BzLE1vZGFsLmludGVybmFsS2V5cykse3JlZjpmdW5jdGlvbiByZWYobm9kZSl7cmV0dXJuIF90aGlzMi4kbW9kYWw9bm9kZTt9LGNsYXNzTmFtZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQoKSgnYi1tb2RhbC13cmFwcGVyJyxwcm9wcy5jbGFzc05hbWUpfSksX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoJ2RpdicsX2V4dGVuZHMoe30scHJvcHMubWFza1Byb3BzLHtjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItbW9kYWwtbWFzaycscHJvcHMubWFza1Byb3BzLmNsYXNzTmFtZSl9KSksX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc19kaWFsb2dfX19kZWZhdWx0LmEsX2V4dGVuZHMoe30sX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X2JvdW5kbGVzc191dGlsc19vYmplY3RfaW50ZXJzZWN0aW9uX19fZGVmYXVsdCgpKHByb3BzLF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfZGlhbG9nX19fZGVmYXVsdC5hLmRlZmF1bHRQcm9wcykscHJvcHMubW9kYWxQcm9wcyx7Y2xhc3NOYW1lOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCgpKCdiLW1vZGFsJyxwcm9wcy5tb2RhbFByb3BzLmNsYXNzTmFtZSl9KSxwcm9wcy5jaGlsZHJlbikpKTt9fV0pO3JldHVybiBNb2RhbDt9KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5QdXJlQ29tcG9uZW50KTtNb2RhbC5wcm9wVHlwZXM9X2V4dGVuZHMoe30sX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc19kaWFsb2dfX19kZWZhdWx0LmEucHJvcFR5cGVzLHttYXNrUHJvcHM6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc2hhcGUoeycqJzpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5hbnl9KSxtb2RhbFByb3BzOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLnNoYXBlKHsnKic6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYW55fSkscG9ydGFsUHJvcHM6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc2hhcGUoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc19wb3J0YWxfX19kZWZhdWx0LmEucHJvcFR5cGVzKX0pO01vZGFsLmRlZmF1bHRQcm9wcz1fZXh0ZW5kcyh7fSxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX2RpYWxvZ19fX2RlZmF1bHQuYS5kZWZhdWx0UHJvcHMse2NhcHR1cmVGb2N1czp0cnVlLG1hc2tQcm9wczp7fSxtb2RhbFByb3BzOnt9LHBvcnRhbFByb3BzOnt9fSk7TW9kYWwuaW50ZXJuYWxLZXlzPU9iamVjdC5rZXlzKE1vZGFsLmRlZmF1bHRQcm9wcyk7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IE1vZGFsO1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGluZGV4LmpzIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbiBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gNik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgZTc1ODhkODNmN2I2ODY1MGYyOGYiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtZGlhbG9nXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLWRpYWxvZ1wifVxuLy8gbW9kdWxlIGlkID0gMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtcG9ydGFsXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXBvcnRhbFwifVxuLy8gbW9kdWxlIGlkID0gMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtdXRpbHMtb2JqZWN0LWludGVyc2VjdGlvblwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy1vYmplY3QtaW50ZXJzZWN0aW9uXCJ9XG4vLyBtb2R1bGUgaWQgPSAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzXCJ9XG4vLyBtb2R1bGUgaWQgPSAzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNsYXNzbmFtZXNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJjbGFzc25hbWVzXCJ9XG4vLyBtb2R1bGUgaWQgPSA0XG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn1cbi8vIG1vZHVsZSBpZCA9IDVcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IFJlYWN0LCB7UHJvcFR5cGVzfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY3ggZnJvbSAnY2xhc3NuYW1lcyc7XG5cbmltcG9ydCBEaWFsb2cgZnJvbSAnYm91bmRsZXNzLWRpYWxvZyc7XG5pbXBvcnQgUG9ydGFsIGZyb20gJ2JvdW5kbGVzcy1wb3J0YWwnO1xuaW1wb3J0IGV4dHJhY3RDaGlsZFByb3BzIGZyb20gJ2JvdW5kbGVzcy11dGlscy1vYmplY3QtaW50ZXJzZWN0aW9uJztcbmltcG9ydCBvbWl0IGZyb20gJ2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMnO1xuXG4vKipcbl9fQSBibG9ja2luZywgZm9jdXMtc3RlYWxpbmcgY29udGFpbmVyLl9fXG5cbk1vZGFsIGlzIGFuIGVuaGFuY2VtZW50IHVwb24gW0RpYWxvZ10oaHR0cHM6Ly9naXRodWIuY29tL2VuaWdtYS1pby9ib3VuZGxlc3MvYmxvYi9tYXN0ZXIvcGFja2FnZXMvYm91bmRsZXNzLWRpYWxvZy9SRUFETUUubWQpLiBUeXBpY2FsbHksIGEgbWFza2luZyBsYXllciBpcyBwcm92aWRlZCB0byBvYnNjdXJlIHRoZSByZXN0IG9mIHRoZSBwYWdlIGluIHNvbWUgZmFzaGlvbiwgd2hpbGUgYWxzbyBibG9ja2luZyBvdXRzaWRlIGNsaWNrIGFuZCBrZXlzdHJva2UgYWNjZXNzIHVudGlsIHRoZSBtb2RhbCBpcyBkaXNtaXNzZWQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vZGFsIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgICAgLi4uRGlhbG9nLnByb3BUeXBlcyxcblxuICAgICAgICBtYXNrUHJvcHM6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIGFueSBbUmVhY3Qtc3VwcG9ydGVkIGF0dHJpYnV0ZV0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90YWdzLWFuZC1hdHRyaWJ1dGVzLmh0bWwjaHRtbC1hdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICAnKic6IFByb3BUeXBlcy5hbnksXG4gICAgICAgIH0pLFxuXG4gICAgICAgIG1vZGFsUHJvcHM6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIGFueSBbUmVhY3Qtc3VwcG9ydGVkIGF0dHJpYnV0ZV0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90YWdzLWFuZC1hdHRyaWJ1dGVzLmh0bWwjaHRtbC1hdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICAnKic6IFByb3BUeXBlcy5hbnksXG4gICAgICAgIH0pLFxuXG4gICAgICAgIHBvcnRhbFByb3BzOiBQcm9wVHlwZXMuc2hhcGUoUG9ydGFsLnByb3BUeXBlcyksXG4gICAgfVxuXG4gICAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgICAgLi4uRGlhbG9nLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgY2FwdHVyZUZvY3VzOiB0cnVlLFxuICAgICAgICBtYXNrUHJvcHM6IHt9LFxuICAgICAgICBtb2RhbFByb3BzOiB7fSxcbiAgICAgICAgcG9ydGFsUHJvcHM6IHt9LFxuICAgIH1cblxuICAgIHN0YXRpYyBpbnRlcm5hbEtleXMgPSBPYmplY3Qua2V5cyhNb2RhbC5kZWZhdWx0UHJvcHMpXG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHtwcm9wc30gPSB0aGlzO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8UG9ydGFsIHsuLi5wcm9wcy5wb3J0YWxQcm9wc30+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICB7Li4ub21pdChwcm9wcywgTW9kYWwuaW50ZXJuYWxLZXlzKX1cbiAgICAgICAgICAgICAgICAgICAgcmVmPXsobm9kZSkgPT4gKHRoaXMuJG1vZGFsID0gbm9kZSl9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y3goJ2ItbW9kYWwtd3JhcHBlcicsIHByb3BzLmNsYXNzTmFtZSl9PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICB7Li4ucHJvcHMubWFza1Byb3BzfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjeCgnYi1tb2RhbC1tYXNrJywgcHJvcHMubWFza1Byb3BzLmNsYXNzTmFtZSl9IC8+XG5cbiAgICAgICAgICAgICAgICAgICAgPERpYWxvZ1xuICAgICAgICAgICAgICAgICAgICAgICAgey4uLmV4dHJhY3RDaGlsZFByb3BzKHByb3BzLCBEaWFsb2cuZGVmYXVsdFByb3BzKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHsuLi5wcm9wcy5tb2RhbFByb3BzfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjeCgnYi1tb2RhbCcsIHByb3BzLm1vZGFsUHJvcHMuY2xhc3NOYW1lKX0+XG4gICAgICAgICAgICAgICAgICAgICAgICB7cHJvcHMuY2hpbGRyZW59XG4gICAgICAgICAgICAgICAgICAgIDwvRGlhbG9nPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9Qb3J0YWw+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvYm91bmRsZXNzLW1vZGFsL2luZGV4LmpzIl0sInNvdXJjZVJvb3QiOiIifQ== |
@@ -10,3 +10,2 @@ import React, {PropTypes} from 'react'; | ||
/** | ||
# Modal | ||
__A blocking, focus-stealing container.__ | ||
@@ -18,18 +17,18 @@ | ||
static propTypes = { | ||
/** Modal supports all [Dialog props](https://github.com/enigma-io/boundless/blob/master/packages/boundless-dialog/README.md#props) */ | ||
...Dialog.propTypes, | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-modal-mask` HTML element | ||
*/ | ||
maskProps: PropTypes.object, | ||
maskProps: PropTypes.shape({ | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
'*': PropTypes.any, | ||
}), | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-modal` HTML element | ||
*/ | ||
modalProps: PropTypes.object, | ||
modalProps: PropTypes.shape({ | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
'*': PropTypes.any, | ||
}), | ||
/** | ||
* any/all supported [Portal props](https://github.com/enigma-io/boundless/blob/master/packages/boundless-portal/README.md#props) | ||
*/ | ||
portalProps: PropTypes.shape(Portal.propTypes), | ||
@@ -36,0 +35,0 @@ } |
{ | ||
"name": "boundless-modal", | ||
"version": "1.0.0-beta.5", | ||
"version": "1.0.0-beta.7", | ||
"description": "A blocking, focus-stealing container.", | ||
@@ -27,6 +27,6 @@ "main": "build/index.js", | ||
"dependencies": { | ||
"boundless-dialog": "^1.0.0-beta.5", | ||
"boundless-portal": "^1.0.0-beta.5", | ||
"boundless-utils-object-intersection": "^1.0.0-beta.5", | ||
"boundless-utils-omit-keys": "^1.0.0-beta.5", | ||
"boundless-dialog": "^1.0.0-beta.7", | ||
"boundless-portal": "^1.0.0-beta.7", | ||
"boundless-utils-object-intersection": "^1.0.0-beta.7", | ||
"boundless-utils-omit-keys": "^1.0.0-beta.7", | ||
"classnames": "^2.1.5" | ||
@@ -33,0 +33,0 @@ }, |
@@ -0,4 +1,6 @@ | ||
<!--- | ||
THIS IS AN AUTOGENERATED FILE. EDIT INDEX.JS INSTEAD. | ||
--> | ||
# Modal | ||
# Modal | ||
__A blocking, focus-stealing container.__ | ||
@@ -8,5 +10,50 @@ | ||
## Example Usage | ||
```jsx | ||
import React from 'react'; | ||
import Button from '../../boundless-button/index'; | ||
import Modal from '../index'; | ||
export default class ModalDemo extends React.PureComponent { | ||
state = { | ||
showModal: false, | ||
} | ||
toggleModal = () => { | ||
this.setState({showModal: !this.state.showModal}); | ||
} | ||
renderModal() { | ||
if (this.state.showModal) { | ||
return ( | ||
<Modal className='demo-modal'> | ||
<h3>Account Deletion</h3> | ||
<p>Are you sure you want to remove your account permanently?</p> | ||
<Button onPressed={this.toggleModal}>Yes</Button> | ||
<Button className='demo-modal-cancel-button' onPressed={this.toggleModal}>No</Button> | ||
</Modal> | ||
); | ||
} | ||
} | ||
render() { | ||
return ( | ||
<div> | ||
<Button ref='trigger' onPressed={this.toggleModal}> | ||
Delete Account | ||
</Button> | ||
{this.renderModal()} | ||
</div> | ||
); | ||
} | ||
} | ||
``` | ||
## Props | ||
_Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/Modal#props)._ | ||
> Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/Modal#props). | ||
@@ -20,150 +67,119 @@ ### Required Props | ||
<table> | ||
<tr> | ||
<th>Name</th> | ||
<th>Type</th> | ||
<th>Default Value</th> | ||
<th>Description</th> | ||
</tr> | ||
- __`*`__ ・ any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
<tr> | ||
<td>after</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>arbitrary content to be rendered after the dialog in the DOM</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any` | `n/a` | ||
<tr> | ||
<td>before</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>arbitrary content to be rendered before the dialog in the DOM</td> | ||
</tr> | ||
- __`after`__ ・ arbitrary content to be rendered after the dialog in the DOM | ||
<tr> | ||
<td>bodyProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-dialog-body` node</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any renderable` | `null` | ||
<tr> | ||
<td>captureFocus</td> | ||
<td><pre><code>bool</code></pre></td> | ||
<td><pre><code class="language-js">true</code></pre></td> | ||
<td>determines if focus is allowed to move away from the dialog</td> | ||
</tr> | ||
- __`before`__ ・ arbitrary content to be rendered before the dialog in the DOM | ||
<tr> | ||
<td>children</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td></td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any renderable` | `null` | ||
<tr> | ||
<td>closeOnEscKey</td> | ||
<td><pre><code>bool or function</code></pre></td> | ||
<td><pre><code class="language-js">false</code></pre></td> | ||
<td>enable detection of "Escape" keypresses to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed</td> | ||
</tr> | ||
- __`captureFocus`__ ・ determines if focus is allowed to move away from the dialog | ||
<tr> | ||
<td>closeOnInsideClick</td> | ||
<td><pre><code>bool or function</code></pre></td> | ||
<td><pre><code class="language-js">false</code></pre></td> | ||
<td>enable detection of clicks inside the dialog area to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`bool` | `true` | ||
<tr> | ||
<td>closeOnOutsideClick</td> | ||
<td><pre><code>bool or function</code></pre></td> | ||
<td><pre><code class="language-js">false</code></pre></td> | ||
<td>enable detection of clicks outside the dialog area to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed</td> | ||
</tr> | ||
- __`closeOnEscKey`__ ・ enable detection of "Escape" keypresses to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed | ||
<tr> | ||
<td>closeOnOutsideFocus</td> | ||
<td><pre><code>bool or function</code></pre></td> | ||
<td><pre><code class="language-js">false</code></pre></td> | ||
<td>enable detection of focus outside the dialog area to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`bool or function` | `false` | ||
<tr> | ||
<td>closeOnOutsideScroll</td> | ||
<td><pre><code>bool or function</code></pre></td> | ||
<td><pre><code class="language-js">false</code></pre></td> | ||
<td>enable detection of scroll and mousewheel events outside the dialog area to trigger `props.onClose`; if a functio | ||
is provided, the return value determines if the dialog will be closed</td> | ||
</tr> | ||
- __`closeOnInsideClick`__ ・ enable detection of clicks inside the dialog area to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed | ||
<tr> | ||
<td>footer</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>text, ReactElements, etc. comprising the "footer" area of the dialog, e.g. confirm/cancel buttons</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`bool or function` | `false` | ||
<tr> | ||
<td>footerProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-dialog-footer` node</td> | ||
</tr> | ||
- __`closeOnOutsideClick`__ ・ enable detection of clicks outside the dialog area to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed | ||
<tr> | ||
<td>header</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>text, ReactElements, etc. to represent the "title bar" area of the dialog</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`bool or function` | `false` | ||
<tr> | ||
<td>headerProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-dialog-header` node</td> | ||
</tr> | ||
- __`closeOnOutsideFocus`__ ・ enable detection of focus outside the dialog area to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed | ||
<tr> | ||
<td>maskProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-modal-mask` HTML element</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`bool or function` | `false` | ||
<tr> | ||
<td>modalProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-modal` HTML element</td> | ||
</tr> | ||
- __`closeOnOutsideScroll`__ ・ enable detection of scroll and mousewheel events outside the dialog area to trigger `props.onClose`; if a functio | ||
is provided, the return value determines if the dialog will be closed | ||
<tr> | ||
<td>onClose</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">() => {}</code></pre></td> | ||
<td>a custom event handler that is called to indicate that the dialog should be unrendered by its parent; the event occurs if one or more of the `closeOn` props (`closeOnEscKey`, `closeOnOutsideClick`, etc.) are passed as `true` and the dismissal criteria are satisfied</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`bool or function` | `false` | ||
<tr> | ||
<td>portalProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any/all supported [Portal props](https://github.com/enigma-io/boundless/blob/master/packages/boundless-portal/README.md#props)</td> | ||
</tr> | ||
- __`component`__ ・ override the type of `.b-dialog-wrapper` HTML element | ||
<tr> | ||
<td>wrapperProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-dialog-wrapper` node</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`string` | `'div'` | ||
</table> | ||
- __`dialogComponent`__ ・ override the type of `.b-dialog` HTML element | ||
Expects | Default Value | ||
- | - | ||
`string` | `'div'` | ||
- __`dialogProps`__ | ||
Expects | Default Value | ||
- | - | ||
`object` | `{}` | ||
- __`maskProps`__ | ||
Expects | Default Value | ||
- | - | ||
`object` | `{}` | ||
- __`modalProps`__ | ||
Expects | Default Value | ||
- | - | ||
`object` | `{}` | ||
- __`onClose`__ ・ a custom event handler that is called to indicate that the dialog should be unrendered by its parent; the event occurs if one or more of the "closeOn" props (`closeOnEscKey`, `closeOnOutsideClick`, etc.) are passed as `true` and the dismissal criteria are satisfied | ||
Expects | Default Value | ||
- | - | ||
`function` | `() => {}` | ||
- __`portalProps`__ | ||
Expects | Default Value | ||
- | - | ||
`object` | `{}` | ||
## Reference Styles | ||
### Stylus | ||
```stylus | ||
// Bring in Boundless's base Stylus variables | ||
@require "node_modules/boundless-modal/variables" | ||
// Redefine any variables as desired, e.g. | ||
color-accent = royalblue | ||
// Bring in the component styles; they will be autoconfigured based on the above | ||
@require "node_modules/boundless-modal/style" | ||
``` | ||
### CSS | ||
If desired, a precompiled plain CSS stylesheet is available for customization at `/build/style.css`, based on Boundless's [default variables](https://github.com/enigma-io/boundless/blob/master/variables.styl). | ||
@@ -17,33 +17,40 @@ import React, {PropTypes} from 'react'; | ||
/** | ||
# Pagination | ||
__View and navigate heterogenious content one page at a time.__ | ||
Pagination is implemented as an encapsulated view system, accepting an array of items as input. | ||
## Component Instance Methods | ||
When using `Pagination` in your project, you may call the following methods on a rendered instance of the component. Use [`refs`](https://facebook.github.io/react/docs/refs-and-the-dom.html) to get the instance. | ||
- __`currentPage()`__ | ||
returns the ___one___-indexed page number currently in view | ||
- __`pageToIndex(index: number)`__ | ||
renders the page that contains the ___zero___-indexed item | ||
* __View and navigate heterogenious content one page at a time.__ | ||
* | ||
* Pagination is implemented as an encapsulated view system, accepting an array of items as input. | ||
* | ||
* ## Component Instance Methods | ||
* | ||
* When using `Pagination` in your project, you may call the following methods on a rendered | ||
* instance of the component. Use [`refs`](https:// * facebook.github.io/react/docs/refs-and-the-dom.html) | ||
* to get the instance. | ||
* | ||
* - __`currentPage()`__ returns the ___one___-indexed page number currently in view | ||
* | ||
* - __`jumpToIndex(index: number)`__ renders the page that contains the ___zero___-indexed item | ||
*/ | ||
export default class Pagination extends React.PureComponent { | ||
static controls = { | ||
FIRST: 'FIRST', | ||
PREVIOUS: 'PREVIOUS', | ||
NEXT: 'NEXT', | ||
LAST: 'LAST', | ||
static control = { | ||
CUSTOM: uuid(), | ||
FIRST: uuid(), | ||
LAST: uuid(), | ||
NEXT: uuid(), | ||
PREVIOUS: uuid(), | ||
} | ||
static positions = { | ||
ABOVE: 'ABOVE', | ||
BELOW: 'BELOW', | ||
BOTH: 'BOTH', | ||
static position = { | ||
ABOVE: uuid(), | ||
BELOW: uuid(), | ||
BOTH: uuid(), | ||
} | ||
static CONTROL_DATA_ATTRIBUTE = 'data-page-control' | ||
static propTypes = { | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
'*': PropTypes.any, | ||
/** | ||
* arbitrary content to be rendered after the items in the DOM | ||
@@ -58,2 +65,9 @@ */ | ||
controlWrapperProps: PropTypes.shape({ | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
'*': PropTypes.any, | ||
}), | ||
/** | ||
@@ -65,8 +79,11 @@ * allows for arbitrary content to be rendered into the control area | ||
/** | ||
* called with a desired item index when that item comes into view; accepts a `Promise` if you need to fetch the row asynchronously | ||
* called with a desired item index when that item comes into view; | ||
* accepts a `Promise` if you need to fetch the row asynchronously | ||
*/ | ||
getItem: PropTypes.func, | ||
getItem: PropTypes.func.isRequired, | ||
/** | ||
* does not render the paging controls if the number of items supplied to the view is less-than-or-equal-to the number of items to show per page via `props.numItemsPerPage` | ||
* does not render the paging controls if the number of items supplied | ||
* to the view is less-than-or-equal-to the number of items to show | ||
* per page via `props.numItemsPerPage` | ||
*/ | ||
@@ -76,3 +93,4 @@ hidePagerIfNotNeeded: PropTypes.bool, | ||
/** | ||
* a unique name for the dataset being consumed; pass a different name to cause the view to fully reset and pull brand new data | ||
* a unique name for the data source being consumed; pass a | ||
* different name to cause the view to fully reset and pull fresh data | ||
*/ | ||
@@ -82,3 +100,5 @@ identifier: PropTypes.string.isRequired, | ||
/** | ||
* the (_one-indexed_) number of the page that should be initially displayed; must be a positive integer less than or equal to the total number of pages | ||
* the (__one-indexed__) number of the page that should be initially | ||
* displayed; must be a positive integer less than or equal to | ||
* the total number of pages | ||
*/ | ||
@@ -98,3 +118,4 @@ initialPage: function validateInitialPage(props) { | ||
/** | ||
* allows for arbitrary content to be rendered into pagination items as they're loading if the backing data is a `Promise` | ||
* allows for arbitrary content to be rendered into pagination items | ||
* as they're loading if the backing data is a `Promise` | ||
*/ | ||
@@ -104,10 +125,30 @@ itemLoadingContent: PropTypes.node, | ||
/** | ||
* an optional function to specify how an item should be converted to JSX, if it is not already renderable by React | ||
* an function to specify how an item should be converted | ||
* to JSX, if it is not already renderable by React | ||
* | ||
* ```jsx | ||
* | ||
* const getItem = () => ({id: 1234, text: 'foo'}); | ||
* const objToJSX = ({id, text}) => <div data-id={id}>{text}</div>; | ||
* | ||
* <Pagination | ||
* getItem={getItem} | ||
* identifer='foo' | ||
* itemToJSXConverter={objToJSX} | ||
* totalItems={1} /> | ||
* ``` | ||
*/ | ||
itemToJSXConverterFunc: PropTypes.func, | ||
itemToJSXConverter: PropTypes.func, | ||
itemWrapperProps: PropTypes.shape({ | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
'*': PropTypes.any, | ||
}), | ||
/** | ||
* content to be displayed inside of the "First page" control button | ||
*/ | ||
jumpToFirstControlContent: PropTypes.node, | ||
jumpToFirstPageControlContent: PropTypes.node, | ||
@@ -117,16 +158,17 @@ /** | ||
*/ | ||
jumpToLastControlContent: PropTypes.node, | ||
jumpToLastPageControlContent: PropTypes.node, | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-pagination-item-list` node | ||
* content to be displayed inside of the "Next page" control button | ||
*/ | ||
listWrapperProps: PropTypes.object, | ||
jumpToNextPageControlContent: PropTypes.node, | ||
/** | ||
* content to be displayed inside of the "Next page" control button | ||
* content to be displayed inside of the "Previous page" control button | ||
*/ | ||
nextPageControlContent: PropTypes.node, | ||
jumpToPreviousPageControlContent: PropTypes.node, | ||
/** | ||
* the maximum number of items to be displayed on each page; must be greater than zero | ||
* the maximum number of items to be displayed on each page; must be | ||
* greater than zero | ||
*/ | ||
@@ -142,3 +184,4 @@ numItemsPerPage: function validateNumItemsPerPage(props) { | ||
/** | ||
* the maximum number of pages to be displayed in the control bar at one time | ||
* the maximum number of pages to be displayed in the control bar at | ||
* one time | ||
*/ | ||
@@ -148,24 +191,37 @@ numPageToggles: PropTypes.number, | ||
/** | ||
* determines whether the pagination controls are displayed above, below, or both above and below the content | ||
* determines whether the pagination controls are displayed above, | ||
* below, or both above and below the content | ||
*/ | ||
position: PropTypes.oneOf(Object.keys(Pagination.positions)), | ||
position: PropTypes.oneOf([ | ||
Pagination.position.ABOVE, | ||
Pagination.position.BELOW, | ||
Pagination.position.BOTH, | ||
]), | ||
/** | ||
* content to be displayed inside of the "Previous page" control button | ||
* whether the "first page" control button should be displayed | ||
*/ | ||
previousPageControlContent: PropTypes.node, | ||
showJumpToFirstPageControl: PropTypes.bool, | ||
/** | ||
* whether the "First page" control button should be displayed | ||
* whether the "last page" control button should be displayed | ||
*/ | ||
showJumpToFirst: PropTypes.bool, | ||
showJumpToLastPageControl: PropTypes.bool, | ||
/** | ||
* whether the "Last page" control button should be displayed | ||
* whether the "next page" control button should be displayed | ||
*/ | ||
showJumpToLast: PropTypes.bool, | ||
showJumpToNextPageControl: PropTypes.bool, | ||
/** | ||
* renders an element called `.b-pagination-control-state` that contains the current state of the pagination like "1 of 10"; alternatively, this prop also accepts a function that it will call with the currentPage and totalPages for you to format: | ||
* whether the "previous page" control button should be displayed | ||
*/ | ||
showJumpToPreviousPageControl: PropTypes.bool, | ||
/** | ||
* renders an element called `.b-pagination-control-state` that | ||
* contains the current state of the pagination like "1 of 10"; | ||
* alternatively, this prop also accepts a function that it will | ||
* call with the currentPage and totalPages for you to format: | ||
* ```jsx | ||
@@ -187,7 +243,2 @@ * showPaginatedState={ | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the SegmentedControl node(s), `.b-pagination-controls` | ||
*/ | ||
toggleWrapperProps: PropTypes.object, | ||
/** | ||
* the total number of items to be displayed in the view | ||
@@ -201,2 +252,3 @@ */ | ||
before: null, | ||
controlWrapperProps: {}, | ||
customControlContent: null, | ||
@@ -207,16 +259,17 @@ getItem: noop, | ||
initialPage: 1, | ||
itemLoadingContent: null, | ||
itemToJSXConverterFunc: identity, | ||
jumpToFirstControlContent: '« First', | ||
jumpToLastControlContent: 'Last »', | ||
listWrapperProps: {}, | ||
nextPageControlContent: 'Next ›', | ||
itemLoadingContent: undefined, | ||
itemToJSXConverter: identity, | ||
itemWrapperProps: {}, | ||
jumpToFirstPageControlContent: '⇤', | ||
jumpToLastPageControlContent: '⇥', | ||
jumpToNextPageControlContent: '→', | ||
jumpToPreviousPageControlContent: '←', | ||
numItemsPerPage: 10, | ||
numPageToggles: 5, | ||
position: Pagination.positions.ABOVE, | ||
previousPageControlContent: '‹ Previous', | ||
showJumpToFirst: true, | ||
showJumpToLast: true, | ||
position: Pagination.position.ABOVE, | ||
showJumpToFirstPageControl: true, | ||
showJumpToLastPageControl: true, | ||
showJumpToNextPageControl: true, | ||
showJumpToPreviousPageControl: true, | ||
showPaginationState: true, | ||
toggleWrapperProps: {}, | ||
totalItems: null, | ||
@@ -227,2 +280,4 @@ } | ||
mounted = false | ||
state = { | ||
@@ -233,3 +288,7 @@ currentPage: this.props.initialPage, | ||
/** | ||
* @public | ||
*/ | ||
currentPage = () => this.state.currentPage | ||
getPageForIndex = (index, itemsPerPage = this.props.numItemsPerPage) => Math.ceil((index + 1) / itemsPerPage) | ||
@@ -240,3 +299,6 @@ totalPages = () => Math.ceil(this.props.totalItems / this.props.numItemsPerPage) | ||
componentDidUpdate(prevProps, prevState) { | ||
componentDidMount() { this.mounted = true; } | ||
componentWillUnmount() { this.mounted = false; } | ||
componentDidUpdate(_, prevState) { | ||
if (prevState.currentPage !== this.currentPage()) { | ||
@@ -251,3 +313,3 @@ findDOMNode(this.refs.item_0).focus(); | ||
// use transactional `setState()` syntax to ensure that pending state updates are honored, | ||
// like those from `pageToIndex()` | ||
// like those from `jumpToIndex()` | ||
this.setState((state, props) => { | ||
@@ -270,5 +332,8 @@ // NOTE: `props` here is technically the `nextProps` you'd receive from the first cWRP argument | ||
pageToIndex = (i) => { | ||
/** | ||
* @public | ||
*/ | ||
jumpToIndex = (i) => { | ||
if (i < 0 || i >= this.props.totalItems) { | ||
return new Error(`Cannot page to invalid index ${i}.`); | ||
throw Error(`Cannot page to invalid index ${i}.`); | ||
} | ||
@@ -282,65 +347,61 @@ | ||
createPageButtonOptions() { | ||
generateControls() { | ||
const options = []; | ||
const currentPage = this.currentPage(); | ||
const numPageToggles = this.props.numPageToggles; | ||
const totalPages = this.totalPages(); | ||
const startPage = currentPage - ((currentPage - 1) % numPageToggles); | ||
const endPage = Math.min(startPage + numPageToggles - 1, totalPages); | ||
const startPage = currentPage - ((currentPage - 1) % this.props.numPageToggles); | ||
const endPage = Math.min(startPage + this.props.numPageToggles - 1, totalPages); | ||
if (this.props.showPaginationState) { | ||
options.push({ | ||
selected: false, | ||
content: isFunction(this.props.showPaginationState) | ||
? this.props.showPaginationState(currentPage, totalPages) | ||
: `${currentPage} of ${totalPages}`, | ||
value: '', | ||
children: isFunction(this.props.showPaginationState) | ||
? this.props.showPaginationState(currentPage, totalPages) | ||
: `${currentPage} / ${totalPages}`, | ||
className: 'b-pagination-control b-pagination-control-state', | ||
disabled: true, | ||
className: 'b-pagination-control b-pagination-control-state', | ||
}); | ||
} | ||
if (this.props.showJumpToFirst) { | ||
if (this.props.showJumpToFirstPageControl) { | ||
options.push({ | ||
selected: false, | ||
content: this.props.jumpToFirstControlContent, | ||
value: Pagination.controls.FIRST, | ||
disabled: this.currentPage() === 1, | ||
[Pagination.CONTROL_DATA_ATTRIBUTE]: Pagination.control.FIRST, | ||
children: this.props.jumpToFirstPageControlContent, | ||
className: 'b-pagination-control b-pagination-control-first', | ||
disabled: currentPage === 1, | ||
}); | ||
} | ||
options.push({ | ||
selected: false, | ||
content: this.props.previousPageControlContent, | ||
value: Pagination.controls.PREVIOUS, | ||
disabled: this.currentPage() === 1, | ||
className: 'b-pagination-control b-pagination-control-previous', | ||
}); | ||
if (this.props.showJumpToPreviousPageControl) { | ||
options.push({ | ||
[Pagination.CONTROL_DATA_ATTRIBUTE]: Pagination.control.PREVIOUS, | ||
children: this.props.jumpToPreviousPageControlContent, | ||
className: 'b-pagination-control b-pagination-control-previous', | ||
disabled: currentPage === 1, | ||
}); | ||
} | ||
for (let i = startPage; i <= endPage; i++) { | ||
options.push({ | ||
[Pagination.CONTROL_DATA_ATTRIBUTE]: i, | ||
children: i, | ||
className: 'b-pagination-control', | ||
'data-page-number': i, | ||
selected: i === this.currentPage(), | ||
content: i, | ||
value: i, | ||
pressed: currentPage === i, | ||
}); | ||
} | ||
options.push({ | ||
selected: false, | ||
content: this.props.nextPageControlContent, | ||
value: Pagination.controls.NEXT, | ||
disabled: this.currentPage() === totalPages, | ||
className: 'b-pagination-control b-pagination-control-next', | ||
}); | ||
if (this.props.showJumpToNextPageControl) { | ||
options.push({ | ||
[Pagination.CONTROL_DATA_ATTRIBUTE]: Pagination.control.NEXT, | ||
children: this.props.jumpToNextPageControlContent, | ||
className: 'b-pagination-control b-pagination-control-next', | ||
disabled: currentPage === totalPages, | ||
}); | ||
} | ||
if (this.props.showJumpToLast) { | ||
if (this.props.showJumpToLastPageControl) { | ||
options.push({ | ||
selected: false, | ||
content: this.props.jumpToLastControlContent, | ||
value: Pagination.controls.LAST, | ||
disabled: this.currentPage() === totalPages, | ||
[Pagination.CONTROL_DATA_ATTRIBUTE]: Pagination.control.LAST, | ||
children: this.props.jumpToLastPageControlContent, | ||
className: 'b-pagination-control b-pagination-control-last', | ||
disabled: currentPage === totalPages, | ||
}); | ||
@@ -351,7 +412,5 @@ } | ||
options.push({ | ||
selected: false, | ||
content: this.props.customControlContent, | ||
value: uuid(), | ||
children: this.props.customControlContent, | ||
className: 'b-pagination-control b-pagination-control-custom', | ||
disabled: true, | ||
className: 'b-pagination-control b-pagination-control-custom', | ||
}); | ||
@@ -364,31 +423,38 @@ } | ||
generateItems() { | ||
const generatedItems = []; | ||
const firstItemIndex = this.firstVisibleItemIndex(); | ||
const lastItemIndex = Math.min(this.props.totalItems, firstItemIndex + this.props.numItemsPerPage) - 1; | ||
const items = []; | ||
const firstIndex = this.firstVisibleItemIndex(); | ||
const lastIndex = Math.min(this.props.totalItems, firstIndex + this.props.numItemsPerPage) - 1; | ||
for (let i = firstItemIndex; i <= lastItemIndex; i += 1) { | ||
generatedItems.push({data: this.props.getItem(i)}); | ||
for (let i = firstIndex; i <= lastIndex; i += 1) { | ||
items.push(this.props.getItem(i)); | ||
} | ||
return generatedItems; | ||
return items; | ||
} | ||
handleClick = (value) => { | ||
handlePageSelected = (option) => { | ||
let nextTargetIndex; | ||
switch (value) { | ||
case Pagination.controls.FIRST: | ||
switch (option[Pagination.CONTROL_DATA_ATTRIBUTE]) { | ||
case undefined: | ||
return; | ||
case Pagination.control.FIRST: | ||
nextTargetIndex = 0; | ||
break; | ||
case Pagination.controls.PREVIOUS: | ||
case Pagination.control.PREVIOUS: | ||
nextTargetIndex = this.firstVisibleItemIndex() - this.props.numItemsPerPage; | ||
break; | ||
case Pagination.controls.NEXT: | ||
case Pagination.control.NEXT: | ||
nextTargetIndex = this.firstVisibleItemIndex() + this.props.numItemsPerPage; | ||
break; | ||
case Pagination.controls.LAST: | ||
case Pagination.control.LAST: | ||
nextTargetIndex = this.props.totalItems - 1; | ||
break; | ||
default: | ||
nextTargetIndex = parseInt(value, 10) * this.props.numItemsPerPage - 1; | ||
nextTargetIndex = parseInt(option[Pagination.CONTROL_DATA_ATTRIBUTE], 10) * this.props.numItemsPerPage - 1; | ||
} | ||
@@ -402,5 +468,10 @@ | ||
handleItemPromiseFulfillment = (payload) => { | ||
if (this.mounted) { | ||
return this.props.itemToJSXConverter(payload); | ||
} | ||
} | ||
renderItems() { | ||
const props = this.props.listWrapperProps; | ||
const indexOffset = this.props.numItemsPerPage * (this.currentPage() - 1); | ||
const props = this.props.itemWrapperProps; | ||
@@ -410,3 +481,2 @@ return ( | ||
{...props} | ||
ref='itemList' | ||
className={cx('b-pagination-items', props.className)}> | ||
@@ -416,3 +486,3 @@ {this.generateItems().map((item, index) => { | ||
<Async | ||
ref={`item_${index}`} | ||
ref={index === 0 ? 'item_0' : null} | ||
key={index} | ||
@@ -423,6 +493,8 @@ className={cx('b-pagination-item', { | ||
})} | ||
convertToJSXFunc={this.props.itemToJSXConverterFunc} | ||
data={item.data} | ||
data-pagination-index={indexOffset + index} | ||
loadingContent={this.props.itemLoadingContent} /> | ||
data-pagination-index={this.props.numItemsPerPage * (this.currentPage() - 1) + index} | ||
pendingContent={this.props.itemLoadingContent}> | ||
{item instanceof Promise | ||
? item.then(this.handleItemPromiseFulfillment, this.handleItemPromiseFulfillment) | ||
: this.props.itemToJSXConverter(item)} | ||
</Async> | ||
); | ||
@@ -435,20 +507,15 @@ })} | ||
renderControls(position) { | ||
if ( this.props.hidePagerIfNotNeeded | ||
&& this.props.totalItems <= this.props.numItemsPerPage) { | ||
if (this.props.hidePagerIfNotNeeded && this.props.totalItems <= this.props.numItemsPerPage) { | ||
return; | ||
} | ||
const props = this.props.toggleWrapperProps; | ||
const positionLower = position.toLowerCase(); | ||
const positionCapitalized = positionLower[0].toUpperCase() + positionLower.slice(1); | ||
return ( | ||
<SegmentedControl | ||
{...props} | ||
ref={`segmentedControl${positionCapitalized}`} | ||
className={cx('b-pagination-controls', props.className, { | ||
[`b-pagination-controls-${positionLower}`]: true, | ||
{...this.props.controlWrapperProps} | ||
className={cx('b-pagination-controls', this.props.controlWrapperProps.className, { | ||
['b-pagination-controls-above']: position === Pagination.position.ABOVE, | ||
['b-pagination-controls-below']: position === Pagination.position.BELOW, | ||
})} | ||
options={this.createPageButtonOptions()} | ||
onOptionSelected={this.handleClick} /> | ||
options={this.generateControls()} | ||
onOptionSelected={this.handlePageSelected} /> | ||
); | ||
@@ -458,25 +525,12 @@ } | ||
renderView() { | ||
const {props} = this; | ||
const position = Pagination.positions; | ||
const {position} = this.props; | ||
const p = Pagination.position; | ||
return ( | ||
<div | ||
ref='paginatedView' | ||
className='b-pagination'> | ||
{ | ||
(props.position === position.ABOVE || props.position === position.BOTH) | ||
? this.renderControls(position.ABOVE) | ||
: noop | ||
} | ||
{props.before} | ||
<div className='b-pagination'> | ||
{position === p.ABOVE || position === p.BOTH ? this.renderControls(p.ABOVE) : null} | ||
{this.props.before} | ||
{this.renderItems()} | ||
{props.after} | ||
{ | ||
(props.position === position.BELOW || props.position === position.BOTH) | ||
? this.renderControls(position.BELOW) | ||
: noop | ||
} | ||
{this.props.after} | ||
{position === p.BELOW || position === p.BOTH ? this.renderControls(p.BELOW) : null} | ||
</div> | ||
@@ -488,6 +542,3 @@ ); | ||
return ( | ||
<div | ||
{...omit(this.props, Pagination.internalKeys)} | ||
ref='wrapper' | ||
className={cx('b-pagination-wrapper', this.props.className)}> | ||
<div {...omit(this.props, Pagination.internalKeys)} className={cx('b-pagination-wrapper', this.props.className)}> | ||
{this.renderView()} | ||
@@ -494,0 +545,0 @@ </div> |
{ | ||
"name": "boundless-pagination", | ||
"version": "1.0.0-beta.5", | ||
"version": "1.0.0-beta.7", | ||
"description": "View and navigate heterogenious content one page at a time.", | ||
@@ -27,7 +27,7 @@ "main": "build/index.js", | ||
"dependencies": { | ||
"boundless-arrow-key-navigation": "^1.0.0-beta.5", | ||
"boundless-async": "^1.0.0-beta.5", | ||
"boundless-segmented-control": "^1.0.0-beta.5", | ||
"boundless-utils-omit-keys": "^1.0.0-beta.5", | ||
"boundless-utils-uuid": "^1.0.0-beta.5", | ||
"boundless-arrow-key-navigation": "^1.0.0-beta.7", | ||
"boundless-async": "^1.0.0-beta.7", | ||
"boundless-segmented-control": "^1.0.0-beta.7", | ||
"boundless-utils-omit-keys": "^1.0.0-beta.7", | ||
"boundless-utils-uuid": "^1.0.0-beta.7", | ||
"classnames": "^2.1.5", | ||
@@ -34,0 +34,0 @@ "lodash.isinteger": "^4.0.4" |
@@ -0,4 +1,6 @@ | ||
<!--- | ||
THIS IS AN AUTOGENERATED FILE. EDIT INDEX.JS INSTEAD. | ||
--> | ||
# Pagination | ||
# Pagination | ||
__View and navigate heterogenious content one page at a time.__ | ||
@@ -10,203 +12,287 @@ | ||
When using `Pagination` in your project, you may call the following methods on a rendered instance of the component. Use [`refs`](https://facebook.github.io/react/docs/refs-and-the-dom.html) to get the instance. | ||
When using `Pagination` in your project, you may call the following methods on a rendered | ||
instance of the component. Use [`refs`](https:// * facebook.github.io/react/docs/refs-and-the-dom.html) | ||
to get the instance. | ||
- __`currentPage()`__ | ||
returns the ___one___-indexed page number currently in view | ||
- __`currentPage()`__ returns the ___one___-indexed page number currently in view | ||
- __`pageToIndex(index: number)`__ | ||
renders the page that contains the ___zero___-indexed item | ||
- __`jumpToIndex(index: number)`__ renders the page that contains the ___zero___-indexed item | ||
## Example Usage | ||
```jsx | ||
/* eslint no-console:0 */ | ||
import React from 'react'; | ||
import Pagination from '../index'; | ||
export default class PaginationDemo extends React.PureComponent { | ||
state = { | ||
items: require('./fixture.json'), | ||
identifier: 'rolodex1000', | ||
} | ||
itemToJSX = (data) => ( | ||
<div | ||
onFocus={() => console.log('focused id: ' + data.id)} | ||
onKeyDown={(e) => console.log('pressed ' + e.key + ' on id: ' + data.id)}> | ||
<div className='card-left'> | ||
<strong>{data.first_name} {data.last_name}</strong><br/> | ||
<em>{data.job_title}</em> | ||
</div> | ||
<div className='card-right'> | ||
{data.address1}<br/> | ||
{data.city}, {data.country}<br/> | ||
<strong>p:</strong> {data.phone}<br/> | ||
<strong>e:</strong> {data.email} | ||
</div> | ||
</div> | ||
) | ||
handleItemRequest = (index) => { | ||
// this might be async if row must be retrieved remotely | ||
if (index >= 10) { | ||
return new Promise((resolve) => { | ||
window.setTimeout((setIndex) => { | ||
resolve(this.state.items[setIndex]); | ||
}, 2000, index); | ||
}); | ||
} | ||
return this.state.items[index]; | ||
} | ||
render() { | ||
return ( | ||
<Pagination | ||
className='demo-pagination' | ||
customControlContent='Your custom content' | ||
getItem={this.handleItemRequest} | ||
identifier={this.state.identifier} | ||
itemToJSXConverter={this.itemToJSX} | ||
jumpToFirstPageControlContent='⇤' | ||
jumpToLastPageControlContent='⇥' | ||
jumpToNextPageControlContent='→' | ||
jumpToPreviousPageControlContent='←' | ||
numItemsPerPage={5} | ||
showPaginationState={true} | ||
totalItems={this.state.items.length} /> | ||
); | ||
} | ||
} | ||
``` | ||
## Props | ||
_Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/Pagination#props)._ | ||
> Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/Pagination#props). | ||
### Required Props | ||
<table> | ||
<tr> | ||
<th>Name</th> | ||
<th>Type</th> | ||
<th>Default Value</th> | ||
<th>Description</th> | ||
</tr> | ||
- __`getItem`__ ・ called with a desired item index when that item comes into view; | ||
accepts a `Promise` if you need to fetch the row asynchronously | ||
<tr> | ||
<td>identifier</td> | ||
<td><pre><code>string</code></pre></td> | ||
<td><pre><code class="language-js">uuid()</code></pre></td> | ||
<td>a unique name for the dataset being consumed; pass a different name to cause the view to fully reset and pull brand new data</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`function` | `() => {}` | ||
<tr> | ||
<td>totalItems</td> | ||
<td><pre><code>number</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>the total number of items to be displayed in the view</td> | ||
</tr> | ||
- __`identifier`__ ・ a unique name for the data source being consumed; pass a | ||
different name to cause the view to fully reset and pull fresh data | ||
</table> | ||
Expects | Default Value | ||
- | - | ||
`string` | `uuid()` | ||
- __`totalItems`__ ・ the total number of items to be displayed in the view | ||
Expects | Default Value | ||
- | - | ||
`number` | `null` | ||
### Optional Props | ||
<table> | ||
<tr> | ||
<th>Name</th> | ||
<th>Type</th> | ||
<th>Default Value</th> | ||
<th>Description</th> | ||
</tr> | ||
- __`*`__ ・ any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
<tr> | ||
<td>after</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>arbitrary content to be rendered after the items in the DOM</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any` | `n/a` | ||
<tr> | ||
<td>before</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>arbitrary content to be rendered before the items in the DOM</td> | ||
</tr> | ||
- __`after`__ ・ arbitrary content to be rendered after the items in the DOM | ||
<tr> | ||
<td>customControlContent</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>allows for arbitrary content to be rendered into the control area</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any renderable` | `null` | ||
<tr> | ||
<td>getItem</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">() => {}</code></pre></td> | ||
<td>called with a desired item index when that item comes into view; accepts a `Promise` if you need to fetch the row asynchronously</td> | ||
</tr> | ||
- __`before`__ ・ arbitrary content to be rendered before the items in the DOM | ||
<tr> | ||
<td>hidePagerIfNotNeeded</td> | ||
<td><pre><code>bool</code></pre></td> | ||
<td><pre><code class="language-js">false</code></pre></td> | ||
<td>does not render the paging controls if the number of items supplied to the view is less-than-or-equal-to the number of items to show per page via `props.numItemsPerPage`</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any renderable` | `null` | ||
<tr> | ||
<td>initialPage</td> | ||
<td><pre><code>custom</code></pre></td> | ||
<td><pre><code class="language-js">1</code></pre></td> | ||
<td>the (_one-indexed_) number of the page that should be initially displayed; must be a positive integer less than or equal to the total number of pages</td> | ||
</tr> | ||
- __`controlWrapperProps`__ | ||
<tr> | ||
<td>itemLoadingContent</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>allows for arbitrary content to be rendered into pagination items as they're loading if the backing data is a `Promise`</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`object` | `{}` | ||
<tr> | ||
<td>itemToJSXConverterFunc</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">(x) => x</code></pre></td> | ||
<td>an optional function to specify how an item should be converted to JSX, if it is not already renderable by React</td> | ||
</tr> | ||
- __`customControlContent`__ ・ allows for arbitrary content to be rendered into the control area | ||
<tr> | ||
<td>jumpToFirstControlContent</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">'« First'</code></pre></td> | ||
<td>content to be displayed inside of the "First page" control button</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any renderable` | `null` | ||
<tr> | ||
<td>jumpToLastControlContent</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">'Last »'</code></pre></td> | ||
<td>content to be displayed inside of the "Last page" control button</td> | ||
</tr> | ||
- __`hidePagerIfNotNeeded`__ ・ does not render the paging controls if the number of items supplied | ||
to the view is less-than-or-equal-to the number of items to show | ||
per page via `props.numItemsPerPage` | ||
<tr> | ||
<td>listWrapperProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-pagination-item-list` node</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`bool` | `false` | ||
<tr> | ||
<td>nextPageControlContent</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">'Next ›'</code></pre></td> | ||
<td>content to be displayed inside of the "Next page" control button</td> | ||
</tr> | ||
- __`initialPage`__ ・ the (__one-indexed__) number of the page that should be initially | ||
displayed; must be a positive integer less than or equal to | ||
the total number of pages | ||
<tr> | ||
<td>numItemsPerPage</td> | ||
<td><pre><code>custom</code></pre></td> | ||
<td><pre><code class="language-js">10</code></pre></td> | ||
<td>the maximum number of items to be displayed on each page; must be greater than zero</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`custom` | `1` | ||
<tr> | ||
<td>numPageToggles</td> | ||
<td><pre><code>number</code></pre></td> | ||
<td><pre><code class="language-js">5</code></pre></td> | ||
<td>the maximum number of pages to be displayed in the control bar at one time</td> | ||
</tr> | ||
- __`itemLoadingContent`__ ・ allows for arbitrary content to be rendered into pagination items | ||
as they're loading if the backing data is a `Promise` | ||
<tr> | ||
<td>position</td> | ||
<td><pre><code></code></pre></td> | ||
<td><pre><code class="language-js">Pagination.positions.ABOVE</code></pre></td> | ||
<td>determines whether the pagination controls are displayed above, below, or both above and below the content</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any renderable` | `undefined` | ||
<tr> | ||
<td>previousPageControlContent</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">'‹ Previous'</code></pre></td> | ||
<td>content to be displayed inside of the "Previous page" control button</td> | ||
</tr> | ||
- __`itemToJSXConverter`__ ・ an function to specify how an item should be converted | ||
to JSX, if it is not already renderable by React | ||
```jsx | ||
const getItem = () => ({id: 1234, text: 'foo'}); | ||
const objToJSX = ({id, text}) => <div data-id={id}>{text}</div>; | ||
<Pagination | ||
getItem={getItem} | ||
identifer='foo' | ||
itemToJSXConverter={objToJSX} | ||
totalItems={1} /> | ||
``` | ||
<tr> | ||
<td>showJumpToFirst</td> | ||
<td><pre><code>bool</code></pre></td> | ||
<td><pre><code class="language-js">true</code></pre></td> | ||
<td>whether the "First page" control button should be displayed</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`function` | `(x) => x` | ||
<tr> | ||
<td>showJumpToLast</td> | ||
<td><pre><code>bool</code></pre></td> | ||
<td><pre><code class="language-js">true</code></pre></td> | ||
<td>whether the "Last page" control button should be displayed</td> | ||
</tr> | ||
- __`itemWrapperProps`__ | ||
<tr> | ||
<td>showPaginationState</td> | ||
<td><pre><code>bool or function</code></pre></td> | ||
<td><pre><code class="language-js">true</code></pre></td> | ||
<td>renders an element called `.b-pagination-control-state` that contains the current state of the pagination like "1 of 10"; alternatively, this prop also accepts a function that it will call with the currentPage and totalPages for you to format: | ||
Expects | Default Value | ||
- | - | ||
`object` | `{}` | ||
```jsx | ||
showPaginatedState={ | ||
(currentPage, totalPages) => ( | ||
<div className='foo'> | ||
You're on page {currentPage} of {totalPages} pages! | ||
</div> | ||
) | ||
} | ||
```</td> | ||
</tr> | ||
- __`jumpToFirstPageControlContent`__ ・ content to be displayed inside of the "First page" control button | ||
<tr> | ||
<td>toggleWrapperProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the SegmentedControl node(s), `.b-pagination-controls`</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any renderable` | `'⇤'` | ||
</table> | ||
- __`jumpToLastPageControlContent`__ ・ content to be displayed inside of the "Last page" control button | ||
Expects | Default Value | ||
- | - | ||
`any renderable` | `'⇥'` | ||
- __`jumpToNextPageControlContent`__ ・ content to be displayed inside of the "Next page" control button | ||
Expects | Default Value | ||
- | - | ||
`any renderable` | `'→'` | ||
- __`jumpToPreviousPageControlContent`__ ・ content to be displayed inside of the "Previous page" control button | ||
Expects | Default Value | ||
- | - | ||
`any renderable` | `'←'` | ||
- __`numItemsPerPage`__ ・ the maximum number of items to be displayed on each page; must be | ||
greater than zero | ||
Expects | Default Value | ||
- | - | ||
`custom` | `10` | ||
- __`numPageToggles`__ ・ the maximum number of pages to be displayed in the control bar at | ||
one time | ||
Expects | Default Value | ||
- | - | ||
`number` | `5` | ||
- __`position`__ ・ determines whether the pagination controls are displayed above, | ||
below, or both above and below the content | ||
Expects | Default Value | ||
- | - | ||
`Pagination.position.ABOVE or Pagination.position.BELOW or Pagination.position.BOTH` | `Pagination.position.ABOVE` | ||
- __`showJumpToFirstPageControl`__ ・ whether the "first page" control button should be displayed | ||
Expects | Default Value | ||
- | - | ||
`bool` | `true` | ||
- __`showJumpToLastPageControl`__ ・ whether the "last page" control button should be displayed | ||
Expects | Default Value | ||
- | - | ||
`bool` | `true` | ||
- __`showJumpToNextPageControl`__ ・ whether the "next page" control button should be displayed | ||
Expects | Default Value | ||
- | - | ||
`bool` | `true` | ||
- __`showJumpToPreviousPageControl`__ ・ whether the "previous page" control button should be displayed | ||
Expects | Default Value | ||
- | - | ||
`bool` | `true` | ||
- __`showPaginationState`__ ・ renders an element called `.b-pagination-control-state` that | ||
contains the current state of the pagination like "1 of 10"; | ||
alternatively, this prop also accepts a function that it will | ||
call with the currentPage and totalPages for you to format: | ||
```jsx | ||
showPaginatedState={ | ||
(currentPage, totalPages) => ( | ||
<div className='foo'> | ||
You're on page {currentPage} of {totalPages} pages! | ||
</div> | ||
) | ||
} | ||
``` | ||
Expects | Default Value | ||
- | - | ||
`bool or function` | `true` | ||
## Reference Styles | ||
### Stylus | ||
```stylus | ||
// Bring in Boundless's base Stylus variables | ||
@require "node_modules/boundless-pagination/variables" | ||
// Redefine any variables as desired, e.g. | ||
color-accent = royalblue | ||
// Bring in the component styles; they will be autoconfigured based on the above | ||
@require "node_modules/boundless-pagination/style" | ||
``` | ||
### CSS | ||
If desired, a precompiled plain CSS stylesheet is available for customization at `/build/style.css`, based on Boundless's [default variables](https://github.com/enigma-io/boundless/blob/master/variables.styl). | ||
@@ -56,3 +56,2 @@ import React, {PropTypes} from 'react'; | ||
/** | ||
# Popover | ||
__A non-blocking container positioned to a specific anchor element.__ | ||
@@ -96,3 +95,5 @@ | ||
PropTypes.instanceOf(HTMLElement), | ||
PropTypes.element, | ||
PropTypes.shape({ | ||
props: PropTypes.object, | ||
}), | ||
]).isRequired, | ||
@@ -112,3 +113,5 @@ | ||
PropTypes.instanceOf(HTMLElement), | ||
PropTypes.element, | ||
PropTypes.shape({ | ||
props: PropTypes.object, | ||
}), | ||
]), | ||
@@ -146,7 +149,2 @@ | ||
]), | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-popover` node | ||
*/ | ||
wrapperProps: PropTypes.object, | ||
} | ||
@@ -166,3 +164,2 @@ | ||
preset: Popover.preset.S, | ||
wrapperProps: {}, | ||
} | ||
@@ -448,6 +445,3 @@ | ||
} | ||
wrapperProps={{ | ||
...props.wrapperProps, | ||
className: cx('b-popover', props.wrapperProps.className), | ||
}} /> | ||
className={cx('b-popover', props.className)} /> | ||
</Portal> | ||
@@ -454,0 +448,0 @@ ); |
{ | ||
"name": "boundless-popover", | ||
"version": "1.0.0-beta.5", | ||
"version": "1.0.0-beta.7", | ||
"description": "A non-blocking container positioned to a specific anchor element.", | ||
@@ -28,6 +28,6 @@ "main": "build/index.js", | ||
"dependencies": { | ||
"boundless-dialog": "^1.0.0-beta.5", | ||
"boundless-portal": "^1.0.0-beta.5", | ||
"boundless-utils-omit-keys": "^1.0.0-beta.5", | ||
"boundless-utils-transform-property": "^1.0.0-beta.5", | ||
"boundless-dialog": "^1.0.0-beta.7", | ||
"boundless-portal": "^1.0.0-beta.7", | ||
"boundless-utils-omit-keys": "^1.0.0-beta.7", | ||
"boundless-utils-transform-property": "^1.0.0-beta.7", | ||
"classnames": "^2.1.5" | ||
@@ -34,0 +34,0 @@ }, |
@@ -0,4 +1,6 @@ | ||
<!--- | ||
THIS IS AN AUTOGENERATED FILE. EDIT INDEX.JS INSTEAD. | ||
--> | ||
# Popover | ||
# Popover | ||
__A non-blocking container positioned to a specific anchor element.__ | ||
@@ -30,84 +32,204 @@ | ||
## Example Usage | ||
```jsx | ||
import React from 'react'; | ||
import ArrowKeyNavigation from '../../boundless-arrow-key-navigation/index'; | ||
import Button from '../../boundless-button/index'; | ||
import Popover from '../index'; | ||
export default class PopoverDemo extends React.PureComponent { | ||
state = { | ||
words: [{ | ||
word: 'transcendental', | ||
syllabicRepresentation: 'tran·scen·den·tal', | ||
type: 'adjective', | ||
primaryDefinition: '', | ||
secondaryDefinitions: [ | ||
'of or relating to a spiritual or nonphysical realm', | ||
'(of a number, e.g., e or π) real but not a root of an algebraic equation with rational roots', | ||
], | ||
}, { | ||
word: 'obstetrics', | ||
syllabicRepresentation: 'ob·stet·rics', | ||
type: 'noun', | ||
preset: Popover.preset.N, | ||
primaryDefinition: 'the branch of medicine and surgery concerned with childbirth and the care of women giving birth', | ||
secondaryDefinitions: [], | ||
}, { | ||
word: 'olio', | ||
syllabicRepresentation: 'o·li·o', | ||
type: 'noun', | ||
preset: Popover.preset.E, | ||
primaryDefinition: [ | ||
<span key='1'>another term for </span>, | ||
<a key='2' href='https://www.google.com/search?safe=active&espv=2&biw=1440&bih=74&q=define+olla+podrida&sa=X&ved=0CB8QgCswAGoVChMIlbiutZmDxwIVQx0-Ch1f-g9t'>olla podrida</a>, | ||
], | ||
secondaryDefinitions: [ | ||
'a miscellaneous collection of things', | ||
'a variety act or show', | ||
], | ||
}, { | ||
word: 'anastrophe', | ||
syllabicRepresentation: 'a·nas·tro·phe', | ||
type: 'noun', | ||
preset: Popover.preset.W, | ||
primaryDefinition: 'the inversion of the usual order of words or clauses', | ||
secondaryDefinitions: [], | ||
}, { | ||
word: 'octothorp', | ||
syllabicRepresentation: 'oc·to·thorp', | ||
type: 'noun', | ||
preset: Popover.preset.WNW, | ||
primaryDefinition: 'another term for the pound sign (#)', | ||
secondaryDefinitions: [], | ||
}], | ||
} | ||
handleKeyDown(index, event) { | ||
if (event.key === 'Enter') { | ||
this[this.state['showPopover' + index] ? 'showPopover' : 'hidePopover'](index, event); | ||
} | ||
} | ||
openPopover(index) { | ||
this.setState({ ['showPopover' + index]: true }); | ||
} | ||
closePopover(index) { | ||
this.setState({ ['showPopover' + index]: false }); | ||
} | ||
renderSecondaryDefinitions(definitions = []) { | ||
return definitions.length ? ( | ||
<ArrowKeyNavigation component='ol'> | ||
{definitions.map((definition, index) => <li key={index}>{definition}</li>)} | ||
</ArrowKeyNavigation> | ||
) : null; | ||
} | ||
renderPrimaryDefinition(definition) { | ||
return definition ? (<p>{definition}</p>) : null; | ||
} | ||
renderBody(definition) { | ||
return ( | ||
<div> | ||
<strong>{definition.syllabicRepresentation}</strong> | ||
<br /> | ||
<em>{definition.type}</em> | ||
{this.renderPrimaryDefinition(definition.primaryDefinition)} | ||
{this.renderSecondaryDefinitions(definition.secondaryDefinitions)} | ||
</div> | ||
); | ||
} | ||
renderPopovers() { | ||
return this.state.words.map((definition, index) => { | ||
return this.state['showPopover' + index] ? ( | ||
<Popover | ||
key={definition.word} | ||
anchor={this.refs[`$word${index}`]} | ||
caretAnchor={this.refs[`$word-caret-anchor${index}`]} | ||
className='demo-popover' | ||
closeOnOutsideFocus={true} | ||
preset={definition.preset} | ||
onClose={() => this.closePopover(index)}> | ||
{this.renderBody(definition)} | ||
</Popover> | ||
) : undefined; | ||
}); | ||
} | ||
render() { | ||
return ( | ||
<div> | ||
<p> | ||
Words of the day for {(new Date()).toLocaleDateString()}:<br /> | ||
<sub>Note that the words with ⓘ symbols have their caret anchored to the symbol, rather than the center of the button.</sub> | ||
</p> | ||
<div className='spread'> | ||
{this.state.words.map((definition, index) => { | ||
return ( | ||
<Button | ||
key={definition.word} | ||
ref={`$word${index}`} | ||
className='show-help-popover' | ||
onPressed={() => this.openPopover(index)} | ||
pressed={this.state[`showPopover${index}`]} | ||
tabIndex='0'> | ||
{definition.word} {index % 2 === 0 ? <span ref={`$word-caret-anchor${index}`}>ⓘ</span> : null} | ||
</Button> | ||
); | ||
})} | ||
</div> | ||
{this.renderPopovers()} | ||
</div> | ||
); | ||
} | ||
} | ||
``` | ||
## Props | ||
_Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/Popover#props)._ | ||
> Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/Popover#props). | ||
### Required Props | ||
<table> | ||
<tr> | ||
<th>Name</th> | ||
<th>Type</th> | ||
<th>Default Value</th> | ||
<th>Description</th> | ||
</tr> | ||
- __`anchor`__ ・ a DOM element or React reference (ref) to one for positioning purposes | ||
<tr> | ||
<td>anchor</td> | ||
<td><pre><code>HTMLElement or ReactElement</code></pre></td> | ||
<td><pre><code class="language-js">undefined</code></pre></td> | ||
<td>a DOM element or React reference (ref) to one for positioning purposes</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`HTMLElement or object` | `undefined` | ||
</table> | ||
### Optional Props | ||
<table> | ||
<tr> | ||
<th>Name</th> | ||
<th>Type</th> | ||
<th>Default Value</th> | ||
<th>Description</th> | ||
</tr> | ||
- __`*`__ ・ any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
<tr> | ||
<td>after</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>arbitrary content to be rendered after the dialog in the DOM</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any` | `n/a` | ||
<tr> | ||
<td>autoReposition</td> | ||
<td><pre><code>bool</code></pre></td> | ||
<td><pre><code class="language-js">true</code></pre></td> | ||
<td>if the given alignment settings would take the popover out of bounds, change the alignment as necessary to remain in the viewport</td> | ||
</tr> | ||
- __`after`__ ・ arbitrary content to be rendered after the dialog in the DOM | ||
<tr> | ||
<td>before</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>arbitrary content to be rendered before the dialog in the DOM</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any renderable` | `null` | ||
<tr> | ||
<td>bodyProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-dialog-body` node</td> | ||
</tr> | ||
- __`autoReposition`__ ・ if the given alignment settings would take the popover out of bounds, change the alignment as necessary to remain in the viewport | ||
<tr> | ||
<td>captureFocus</td> | ||
<td><pre><code>bool</code></pre></td> | ||
<td><pre><code class="language-js">true</code></pre></td> | ||
<td>determines if focus is allowed to move away from the dialog</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`bool` | `true` | ||
<tr> | ||
<td>caretAnchor</td> | ||
<td><pre><code>HTMLElement or ReactElement</code></pre></td> | ||
<td><pre><code class="language-js">undefined</code></pre></td> | ||
<td>a DOM element or React reference (ref) to one for positioning purposes, the caret component will | ||
be automatically positioned to center on this provided anchor; by default it will center | ||
on `props.anchor`</td> | ||
</tr> | ||
- __`before`__ ・ arbitrary content to be rendered before the dialog in the DOM | ||
<tr> | ||
<td>caretComponent</td> | ||
<td><pre><code>ReactElement</code></pre></td> | ||
<td><pre><code class="language-js"><svg viewBox='0 0 14 9.5' xmlns='http://www.w3.org/2000/svg'> | ||
Expects | Default Value | ||
- | - | ||
`any renderable` | `null` | ||
- __`captureFocus`__ ・ determines if focus is allowed to move away from the dialog | ||
Expects | Default Value | ||
- | - | ||
`bool` | `true` | ||
- __`caretAnchor`__ ・ a DOM element or React reference (ref) to one for positioning purposes, the caret component will | ||
be automatically positioned to center on this provided anchor; by default it will center | ||
on `props.anchor` | ||
Expects | Default Value | ||
- | - | ||
`HTMLElement or object` | `undefined` | ||
- __`caretComponent`__ ・ the JSX that is rendered and used to point at the middle of the anchor element and indicate the context of the popover | ||
Expects | Default Value | ||
- | - | ||
`ReactElement` | `<svg viewBox='0 0 14 9.5' xmlns='http://www.w3.org/2000/svg'> | ||
<g> | ||
@@ -117,128 +239,97 @@ <polygon className='b-popover-caret-border' fill='#000' points='7 0 14 10 0 10' /> | ||
</g> | ||
</svg></code></pre></td> | ||
<td>the JSX that is rendered and used to point at the middle of the anchor element and indicate the context of the popover</td> | ||
</tr> | ||
</svg>` | ||
<tr> | ||
<td>children</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td></td> | ||
</tr> | ||
- __`closeOnEscKey`__ ・ enable detection of "Escape" keypresses to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed | ||
<tr> | ||
<td>closeOnEscKey</td> | ||
<td><pre><code>bool or function</code></pre></td> | ||
<td><pre><code class="language-js">false</code></pre></td> | ||
<td>enable detection of "Escape" keypresses to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`bool or function` | `false` | ||
<tr> | ||
<td>closeOnInsideClick</td> | ||
<td><pre><code>bool or function</code></pre></td> | ||
<td><pre><code class="language-js">false</code></pre></td> | ||
<td>enable detection of clicks inside the dialog area to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed</td> | ||
</tr> | ||
- __`closeOnInsideClick`__ ・ enable detection of clicks inside the dialog area to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed | ||
<tr> | ||
<td>closeOnOutsideClick</td> | ||
<td><pre><code>bool or function</code></pre></td> | ||
<td><pre><code class="language-js">false</code></pre></td> | ||
<td>enable detection of clicks outside the dialog area to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`bool or function` | `false` | ||
<tr> | ||
<td>closeOnOutsideFocus</td> | ||
<td><pre><code>bool or function</code></pre></td> | ||
<td><pre><code class="language-js">false</code></pre></td> | ||
<td>enable detection of focus outside the dialog area to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed</td> | ||
</tr> | ||
- __`closeOnOutsideClick`__ ・ enable detection of clicks outside the dialog area to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed | ||
<tr> | ||
<td>closeOnOutsideScroll</td> | ||
<td><pre><code>bool or function</code></pre></td> | ||
<td><pre><code class="language-js">false</code></pre></td> | ||
<td>enable detection of scroll and mousewheel events outside the dialog area to trigger `props.onClose`; if a functio | ||
is provided, the return value determines if the dialog will be closed</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`bool or function` | `false` | ||
<tr> | ||
<td>footer</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>text, ReactElements, etc. comprising the "footer" area of the dialog, e.g. confirm/cancel buttons</td> | ||
</tr> | ||
- __`closeOnOutsideFocus`__ ・ enable detection of focus outside the dialog area to trigger `props.onClose`; if a function is provided, the return | ||
value determines if the dialog will be closed | ||
<tr> | ||
<td>footerProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-dialog-footer` node</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`bool or function` | `false` | ||
<tr> | ||
<td>header</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>text, ReactElements, etc. to represent the "title bar" area of the dialog</td> | ||
</tr> | ||
- __`closeOnOutsideScroll`__ ・ enable detection of scroll and mousewheel events outside the dialog area to trigger `props.onClose`; if a functio | ||
is provided, the return value determines if the dialog will be closed | ||
<tr> | ||
<td>headerProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-dialog-header` node</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`bool or function` | `false` | ||
<tr> | ||
<td>onClose</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">() => {}</code></pre></td> | ||
<td>a custom event handler that is called to indicate that the dialog should be unrendered by its parent; the event occurs if one or more of the `closeOn` props (`closeOnEscKey`, `closeOnOutsideClick`, etc.) are passed as `true` and the dismissal criteria are satisfied</td> | ||
</tr> | ||
- __`component`__ ・ override the type of `.b-dialog-wrapper` HTML element | ||
<tr> | ||
<td>portalProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td></td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`string` | `'div'` | ||
<tr> | ||
<td>preset</td> | ||
<td><pre><code>Popover.preset.NNW or | ||
Popover.preset.N or | ||
Popover.preset.NNE or | ||
Popover.preset.ENE or | ||
Popover.preset.E or | ||
Popover.preset.ESE or | ||
Popover.preset.SSE or | ||
Popover.preset.S or | ||
Popover.preset.SSW or | ||
Popover.preset.WSW or | ||
Popover.preset.W or | ||
Popover.preset.WNW</code></pre></td> | ||
<td><pre><code class="language-js">Popover.preset.S</code></pre></td> | ||
<td>```jsx | ||
<Popover | ||
anchor={document.querySelector('.some-anchor-element')} | ||
preset={Popover.preset.NNE}> | ||
My popover content! | ||
</Popover> | ||
```</td> | ||
</tr> | ||
- __`dialogComponent`__ ・ override the type of `.b-dialog` HTML element | ||
<tr> | ||
<td>wrapperProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-dialog-wrapper` node</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`string` | `'div'` | ||
</table> | ||
- __`dialogProps`__ | ||
Expects | Default Value | ||
- | - | ||
`object` | `{}` | ||
- __`onClose`__ ・ a custom event handler that is called to indicate that the dialog should be unrendered by its parent; the event occurs if one or more of the "closeOn" props (`closeOnEscKey`, `closeOnOutsideClick`, etc.) are passed as `true` and the dismissal criteria are satisfied | ||
Expects | Default Value | ||
- | - | ||
`function` | `() => {}` | ||
- __`portalProps`__ | ||
Expects | Default Value | ||
- | - | ||
`object` | `{}` | ||
- __`preset`__ ・ ```jsx | ||
<Popover | ||
anchor={document.querySelector('.some-anchor-element')} | ||
preset={Popover.preset.NNE}> | ||
My popover content! | ||
</Popover> | ||
``` | ||
Expects | Default Value | ||
- | - | ||
`Popover.preset.NNW or Popover.preset.N or Popover.preset.NNE or Popover.preset.ENE or Popover.preset.E or Popover.preset.ESE or Popover.preset.SSE or Popover.preset.S or Popover.preset.SSW or Popover.preset.WSW or Popover.preset.W or Popover.preset.WNW` | `Popover.preset.S` | ||
## Reference Styles | ||
### Stylus | ||
```stylus | ||
// Bring in Boundless's base Stylus variables | ||
@require "node_modules/boundless-popover/variables" | ||
// Redefine any variables as desired, e.g. | ||
color-accent = royalblue | ||
// Bring in the component styles; they will be autoconfigured based on the above | ||
@require "node_modules/boundless-popover/style" | ||
``` | ||
### CSS | ||
If desired, a precompiled plain CSS stylesheet is available for customization at `/build/style.css`, based on Boundless's [default variables](https://github.com/enigma-io/boundless/blob/master/variables.styl). | ||
@@ -1,2 +0,2 @@ | ||
module.exports=function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=4)}([function(e,t,n){"use strict";function r(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Object.keys(e).reduce(function(n,r){return t.indexOf(r)===-1&&(n[r]=e[r]),n},{})}t.a=r},function(e,t,n){"use strict";function r(){return"b-"+([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,function(e){return(e^16*Math.random()>>e/4).toString(16)})}t.a=r},function(e,t){e.exports=require("react")},function(e,t){e.exports=require("react-dom")},function(e,t,n){"use strict";function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var u=n(2),l=n.n(u),p=n(3),c=n.n(p),s=n(0),f=n(1),d=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},h=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),y=function(e){function t(){var e,r,a,u;o(this,t);for(var l=arguments.length,p=Array(l),c=0;c<l;c++)p[c]=arguments[c];return r=a=i(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(p))),a.id=n.i(f.a)(),a.$portal=null,a.$passenger=null,u=r,i(a,u)}return a(t,e),h(t,[{key:"componentWillMount",value:function(){this.$portal=document.createElement("div"),this.props.destination.appendChild(this.$portal),this.renderPortalledContent()}},{key:"renderPortalledContent",value:function(){var e=l.a.isValidElement(this.props.children)?this.props.children:l.a.createElement("div",null,this.props.children);this.$portal.id=this.props.portalId||this.id,c.a.unstable_renderSubtreeIntoContainer(this,e,this.$portal),this.$passenger=this.$portal.children[0]}},{key:"componentDidUpdate",value:function(){this.renderPortalledContent()}},{key:"componentWillUnmount",value:function(){c.a.unmountComponentAtNode(this.$portal),this.props.destination.removeChild(this.$portal)}},{key:"render",value:function(){return l.a.createElement("span",d({},n.i(s.a)(this.props,t.internalKeys),r({},t.PORTAL_DATA_ATTRIBUTE,this.props.portalId||this.id)))}}]),t}(l.a.Component);y.propTypes={children:l.a.PropTypes.node,destination:u.PropTypes.instanceOf(HTMLElement),portalId:u.PropTypes.string},y.defaultProps={children:null,destination:document.body,portalId:null},y.internalKeys=Object.keys(y.defaultProps),y.PORTAL_DATA_ATTRIBUTE="data-portal-id",t.default=y}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIGFiMWQ1ZDRlYjdjMzc5Njk4OWM4Iiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvYm91bmRsZXNzLXV0aWxzLXV1aWQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3QtZG9tXCJ9Iiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy1wb3J0YWwvaW5kZXguanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJ2YWx1ZSIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiX193ZWJwYWNrX2V4cG9ydHNfXyIsIm9taXRLZXlzRnJvbVNvdXJjZU9iamVjdCIsInNvdXJjZSIsIm9taXR0ZWRLZXlzIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwia2V5cyIsInJlZHVjZSIsImhhc2giLCJrZXkiLCJpbmRleE9mIiwidXVpZCIsInJlcGxhY2UiLCJhIiwiTWF0aCIsInJhbmRvbSIsInRvU3RyaW5nIiwicmVxdWlyZSIsIl9kZWZpbmVQcm9wZXJ0eSIsIm9iaiIsIndyaXRhYmxlIiwiX2NsYXNzQ2FsbENoZWNrIiwiaW5zdGFuY2UiLCJDb25zdHJ1Y3RvciIsIlR5cGVFcnJvciIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIiwic2VsZiIsIlJlZmVyZW5jZUVycm9yIiwiX2luaGVyaXRzIiwic3ViQ2xhc3MiLCJzdXBlckNsYXNzIiwiY3JlYXRlIiwiY29uc3RydWN0b3IiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9kb21fXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9kb21fX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfdXVpZF9fIiwiX2V4dGVuZHMiLCJhc3NpZ24iLCJ0YXJnZXQiLCJfY3JlYXRlQ2xhc3MiLCJkZWZpbmVQcm9wZXJ0aWVzIiwicHJvcHMiLCJkZXNjcmlwdG9yIiwicHJvdG9Qcm9wcyIsInN0YXRpY1Byb3BzIiwiUG9ydGFsIiwiX1JlYWN0JENvbXBvbmVudCIsIl9yZWYiLCJfdGVtcCIsIl90aGlzIiwiX3JldCIsInRoaXMiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImdldFByb3RvdHlwZU9mIiwiYXBwbHkiLCJjb25jYXQiLCJpZCIsIiRwb3J0YWwiLCIkcGFzc2VuZ2VyIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiZGVzdGluYXRpb24iLCJhcHBlbmRDaGlsZCIsInJlbmRlclBvcnRhbGxlZENvbnRlbnQiLCJjaGlsZCIsImlzVmFsaWRFbGVtZW50IiwiY2hpbGRyZW4iLCJwb3J0YWxJZCIsInVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyIiwidW5tb3VudENvbXBvbmVudEF0Tm9kZSIsInJlbW92ZUNoaWxkIiwiaW50ZXJuYWxLZXlzIiwiUE9SVEFMX0RBVEFfQVRUUklCVVRFIiwiQ29tcG9uZW50IiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwibm9kZSIsImluc3RhbmNlT2YiLCJIVE1MRWxlbWVudCIsInN0cmluZyIsImRlZmF1bHRQcm9wcyIsImJvZHkiXSwibWFwcGluZ3MiOiJBQUFBQSxPQUFPQyxRQUNFLFNBQVVDLEdDR25CLFFBQUFDLEdBQUFDLEdBR0EsR0FBQUMsRUFBQUQsR0FDQSxNQUFBQyxHQUFBRCxHQUFBSCxPQUdBLElBQUFELEdBQUFLLEVBQUFELElBQ0FFLEVBQUFGLEVBQ0FHLEdBQUEsRUFDQU4sV0FVQSxPQU5BQyxHQUFBRSxHQUFBSSxLQUFBUixFQUFBQyxRQUFBRCxJQUFBQyxRQUFBRSxHQUdBSCxFQUFBTyxHQUFBLEVBR0FQLEVBQUFDLFFBdkJBLEdBQUFJLEtBK0RBLE9BbkNBRixHQUFBTSxFQUFBUCxFQUdBQyxFQUFBTyxFQUFBTCxFQUdBRixFQUFBRyxFQUFBLFNBQUFLLEdBQTJDLE1BQUFBLElBRzNDUixFQUFBUyxFQUFBLFNBQUFYLEVBQUFZLEVBQUFDLEdBQ0FYLEVBQUFZLEVBQUFkLEVBQUFZLElBQ0FHLE9BQUFDLGVBQUFoQixFQUFBWSxHQUNBSyxjQUFBLEVBQ0FDLFlBQUEsRUFDQUMsSUFBQU4sS0FNQVgsRUFBQWtCLEVBQUEsU0FBQXJCLEdBQ0EsR0FBQWMsR0FBQWQsS0FBQXNCLFdBQ0EsV0FBMkIsTUFBQXRCLEdBQUEsU0FDM0IsV0FBaUMsTUFBQUEsR0FFakMsT0FEQUcsR0FBQVMsRUFBQUUsRUFBQSxJQUFBQSxHQUNBQSxHQUlBWCxFQUFBWSxFQUFBLFNBQUFRLEVBQUFDLEdBQXNELE1BQUFSLFFBQUFTLFVBQUFDLGVBQUFsQixLQUFBZSxFQUFBQyxJQUd0RHJCLEVBQUF3QixFQUFBLEdBR0F4QixJQUFBeUIsRUFBQSxLRE9NLFNBQVU1QixFQUFRNkIsRUFBcUIxQixHQUU3QyxZRXRFZSxTQUFTMkIsR0FB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SSxxQkFBcUI1QixNQUFNLFdNZHo4RjJFLEtBQUtlLDRCTmNvZ0c5RCxJQUFJLHVCQUF1QjVCLE1BQU0sV01YN2pHeUQsRUFBQXpCLEVBQVNnRSx1QkFBdUJyQixLQUFLUyxTQUNyQ1QsS0FBS1YsTUFBTXVCLFlBQVlTLFlBQVl0QixLQUFLUyxZTlVpc0d4RCxJQUFJLFNBQVM1QixNQUFNLFdNTjV2RyxNQUNJdUQsR0FBQXZCLEVBQUF1RCxjQUFBLE9BQUEzQixLQUNRcEUsRUFBQUcsRUFBQStELEVBQUEsR0FBS2lCLEtBQUtWLE1BQU9JLEVBQU82QixjQURoQzdELEtBRVVnQyxFQUFPOEIsc0JBQXdCeEIsS0FBS1YsTUFBTTZCLFVBQVluQixLQUFLUSxVTkd5L0dkLEdNakd0aUhkLEVBQUF2QixFQUFNb0UsVUFBckIvQixHQUNWZ0MsV0FrQ0hSLFNBQVV0QyxFQUFBdkIsRUFBTXNFLFVBQVVDLEtBSzFCZixZQUFhbEMsRUFBQSxVQUFVa0QsV0FBV0MsYUFLbENYLFNBQVV4QyxFQUFBLFVBQVVvRCxRQTdDUHJDLEVBZ0RWc0MsY0FDSGQsU0FBVSxLQUNWTCxZQUFhRixTQUFTc0IsS0FDdEJkLFNBQVUsTUFuREd6QixFQXNEVjZCLGFBQWU3RixPQUFPb0IsS0FBSzRDLEVBQU9zQyxjQXREeEJ0QyxFQXdEVjhCLHNCQUF3QixpQk55Q29pSWpGLEVBQTZCLFFNakcva0ltRCIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbi8qKioqKiovIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbi8qKioqKiovIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA0KTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGV4cG9ydCAoaW1tdXRhYmxlKSAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IG9taXRLZXlzRnJvbVNvdXJjZU9iamVjdDtcbmZ1bmN0aW9uIG9taXRLZXlzRnJvbVNvdXJjZU9iamVjdChzb3VyY2Upe3ZhciBvbWl0dGVkS2V5cz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMV06W107cmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIHJlbG9jYXRlQWNjZXB0ZWRLZXlzKGhhc2gsa2V5KXtpZihvbWl0dGVkS2V5cy5pbmRleE9mKGtleSk9PT0tMSl7aGFzaFtrZXldPXNvdXJjZVtrZXldO31yZXR1cm4gaGFzaDt9LHt9KTt9XG5cbi8qKiovIH0pLFxuLyogMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgZXhwb3J0IChpbW11dGFibGUpICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gdXVpZDtcbmZ1bmN0aW9uIHV1aWQoKXtyZXR1cm4nYi0nKyhbMWU3XSstMWUzKy00ZTMrLThlMystMWUxMSkucmVwbGFjZSgvWzAxOF0vZyxmdW5jdGlvbihhKXtyZXR1cm4oYV5NYXRoLnJhbmRvbSgpKjE2Pj5hLzQpLnRvU3RyaW5nKDE2KTt9KTt9XG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxuLyoqKi8gfSksXG4vKiAzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0LWRvbVwiKTtcblxuLyoqKi8gfSksXG4vKiA0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KF9fd2VicGFja19leHBvcnRzX18sIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfcmVhY3RfZG9tX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9kb21fX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9kb21fXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc191dWlkX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xudmFyIF9leHRlbmRzPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHRhcmdldCl7Zm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIHNvdXJjZT1hcmd1bWVudHNbaV07Zm9yKHZhciBrZXkgaW4gc291cmNlKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLGtleSkpe3RhcmdldFtrZXldPXNvdXJjZVtrZXldO319fXJldHVybiB0YXJnZXQ7fTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQscHJvcHMpe2Zvcih2YXIgaT0wO2k8cHJvcHMubGVuZ3RoO2krKyl7dmFyIGRlc2NyaXB0b3I9cHJvcHNbaV07ZGVzY3JpcHRvci5lbnVtZXJhYmxlPWRlc2NyaXB0b3IuZW51bWVyYWJsZXx8ZmFsc2U7ZGVzY3JpcHRvci5jb25maWd1cmFibGU9dHJ1ZTtpZihcInZhbHVlXCJpbiBkZXNjcmlwdG9yKWRlc2NyaXB0b3Iud3JpdGFibGU9dHJ1ZTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LGRlc2NyaXB0b3Iua2V5LGRlc2NyaXB0b3IpO319cmV0dXJuIGZ1bmN0aW9uKENvbnN0cnVjdG9yLHByb3RvUHJvcHMsc3RhdGljUHJvcHMpe2lmKHByb3RvUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUscHJvdG9Qcm9wcyk7aWYoc3RhdGljUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3RvcixzdGF0aWNQcm9wcyk7cmV0dXJuIENvbnN0cnVjdG9yO307fSgpO2Z1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosa2V5LHZhbHVlKXtpZihrZXkgaW4gb2JqKXtPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLGtleSx7dmFsdWU6dmFsdWUsZW51bWVyYWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlLHdyaXRhYmxlOnRydWV9KTt9ZWxzZXtvYmpba2V5XT12YWx1ZTt9cmV0dXJuIG9iajt9ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLENvbnN0cnVjdG9yKXtpZighKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO319ZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZixjYWxsKXtpZighc2VsZil7dGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO31yZXR1cm4gY2FsbCYmKHR5cGVvZiBjYWxsPT09XCJvYmplY3RcInx8dHlwZW9mIGNhbGw9PT1cImZ1bmN0aW9uXCIpP2NhbGw6c2VsZjt9ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLHN1cGVyQ2xhc3Mpe2lmKHR5cGVvZiBzdXBlckNsYXNzIT09XCJmdW5jdGlvblwiJiZzdXBlckNsYXNzIT09bnVsbCl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIrdHlwZW9mIHN1cGVyQ2xhc3MpO31zdWJDbGFzcy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzJiZzdXBlckNsYXNzLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnN1YkNsYXNzLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX19KTtpZihzdXBlckNsYXNzKU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3Msc3VwZXJDbGFzcyk6c3ViQ2xhc3MuX19wcm90b19fPXN1cGVyQ2xhc3M7fXZhciBQb3J0YWw9ZnVuY3Rpb24oX1JlYWN0JENvbXBvbmVudCl7X2luaGVyaXRzKFBvcnRhbCxfUmVhY3QkQ29tcG9uZW50KTtmdW5jdGlvbiBQb3J0YWwoKXt2YXIgX3JlZjt2YXIgX3RlbXAsX3RoaXMsX3JldDtfY2xhc3NDYWxsQ2hlY2sodGhpcyxQb3J0YWwpO2Zvcih2YXIgX2xlbj1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkoX2xlbiksX2tleT0wO19rZXk8X2xlbjtfa2V5Kyspe2FyZ3NbX2tleV09YXJndW1lbnRzW19rZXldO31yZXR1cm4gX3JldD0oX3RlbXA9KF90aGlzPV9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKF9yZWY9UG9ydGFsLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKFBvcnRhbCkpLmNhbGwuYXBwbHkoX3JlZixbdGhpc10uY29uY2F0KGFyZ3MpKSksX3RoaXMpLF90aGlzLmlkPV9fd2VicGFja19yZXF1aXJlX18uaShfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX3V1aWRfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkoKSxfdGhpcy4kcG9ydGFsPW51bGwsX3RoaXMuJHBhc3Nlbmdlcj1udWxsLF90ZW1wKSxfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcyxfcmV0KTt9X2NyZWF0ZUNsYXNzKFBvcnRhbCxbe2tleTonY29tcG9uZW50V2lsbE1vdW50Jyx2YWx1ZTpmdW5jdGlvbiBjb21wb25lbnRXaWxsTW91bnQoKXt0aGlzLiRwb3J0YWw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7dGhpcy5wcm9wcy5kZXN0aW5hdGlvbi5hcHBlbmRDaGlsZCh0aGlzLiRwb3J0YWwpO3RoaXMucmVuZGVyUG9ydGFsbGVkQ29udGVudCgpO319LHtrZXk6J3JlbmRlclBvcnRhbGxlZENvbnRlbnQnLHZhbHVlOmZ1bmN0aW9uIHJlbmRlclBvcnRhbGxlZENvbnRlbnQoKXt2YXIgY2hpbGQ9X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmlzVmFsaWRFbGVtZW50KHRoaXMucHJvcHMuY2hpbGRyZW4pP3RoaXMucHJvcHMuY2hpbGRyZW46X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoJ2RpdicsbnVsbCx0aGlzLnByb3BzLmNoaWxkcmVuKTt0aGlzLiRwb3J0YWwuaWQ9dGhpcy5wcm9wcy5wb3J0YWxJZHx8dGhpcy5pZDtfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfcmVhY3RfZG9tX19fZGVmYXVsdC5hLnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHRoaXMsY2hpbGQsdGhpcy4kcG9ydGFsKTt0aGlzLiRwYXNzZW5nZXI9dGhpcy4kcG9ydGFsLmNoaWxkcmVuWzBdO319LHtrZXk6J2NvbXBvbmVudERpZFVwZGF0ZScsdmFsdWU6ZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCl7dGhpcy5yZW5kZXJQb3J0YWxsZWRDb250ZW50KCk7fX0se2tleTonY29tcG9uZW50V2lsbFVubW91bnQnLHZhbHVlOmZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCl7X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX3JlYWN0X2RvbV9fX2RlZmF1bHQuYS51bm1vdW50Q29tcG9uZW50QXROb2RlKHRoaXMuJHBvcnRhbCk7dGhpcy5wcm9wcy5kZXN0aW5hdGlvbi5yZW1vdmVDaGlsZCh0aGlzLiRwb3J0YWwpO319LHtrZXk6J3JlbmRlcicsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyKCl7cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KCdzcGFuJyxfZXh0ZW5kcyh7fSxfX3dlYnBhY2tfcmVxdWlyZV9fLmkoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkodGhpcy5wcm9wcyxQb3J0YWwuaW50ZXJuYWxLZXlzKSxfZGVmaW5lUHJvcGVydHkoe30sUG9ydGFsLlBPUlRBTF9EQVRBX0FUVFJJQlVURSx0aGlzLnByb3BzLnBvcnRhbElkfHx0aGlzLmlkKSkpO319XSk7cmV0dXJuIFBvcnRhbDt9KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5Db21wb25lbnQpO1BvcnRhbC5wcm9wVHlwZXM9e2NoaWxkcmVuOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5Qcm9wVHlwZXMubm9kZSxkZXN0aW5hdGlvbjpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5pbnN0YW5jZU9mKEhUTUxFbGVtZW50KSxwb3J0YWxJZDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5zdHJpbmd9O1BvcnRhbC5kZWZhdWx0UHJvcHM9e2NoaWxkcmVuOm51bGwsZGVzdGluYXRpb246ZG9jdW1lbnQuYm9keSxwb3J0YWxJZDpudWxsfTtQb3J0YWwuaW50ZXJuYWxLZXlzPU9iamVjdC5rZXlzKFBvcnRhbC5kZWZhdWx0UHJvcHMpO1BvcnRhbC5QT1JUQUxfREFUQV9BVFRSSUJVVEU9J2RhdGEtcG9ydGFsLWlkJzsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gUG9ydGFsO1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGluZGV4LmpzIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbiBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gNCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgYWIxZDVkNGViN2MzNzk2OTg5YzgiLCIvKipcbiAqIFJldHVybnMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBzdXBwbGllZCBvYmplY3Qgd2l0aG91dCB0aGUgZ2l2ZW4ga2V5cy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb21pdEtleXNGcm9tU291cmNlT2JqZWN0KHNvdXJjZSwgb21pdHRlZEtleXMgPSBbXSkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhzb3VyY2UpLnJlZHVjZShmdW5jdGlvbiByZWxvY2F0ZUFjY2VwdGVkS2V5cyhoYXNoLCBrZXkpIHtcbiAgICAgICAgaWYgKG9taXR0ZWRLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpIHtcbiAgICAgICAgICAgIGhhc2hba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhc2g7XG4gICAgfSwge30pO1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvYm91bmRsZXNzLXV0aWxzLW9taXQta2V5cy9pbmRleC5qcyIsIi8qKlxuICogR2VuZXJhdGVzIGEgdW5pcXVlIElELiBBZGRzIGEgcHJlZml4IHNvIGl0IGlzIHN1aXRhYmxlIGZvciB1c2UgYXMgYW4gSFRNTCBJRC5cbiAqIEJhc2VkIG9uIHtAbGluayBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9qZWQvOTgyODgzIHRoaXMgaW1wbGVtZW50YXRpb259LlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gYSB1bmlxdWUgaWRlbnRpZmllclxuICpcbiAqIEBleGFtcGxlXG4gKiB1dWlkKCk7IC8vIGItMWYyY2QyN2YtMDc1NC00MzQ0LTlkMjAtNDM2YTIwMWIyZjgwXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHV1aWQoKSB7XG4gICAgLyogZXNsaW50LWRpc2FibGUgKi9cbiAgICByZXR1cm4gJ2ItJyArIChbMWU3XSstMWUzKy00ZTMrLThlMystMWUxMSkucmVwbGFjZSgvWzAxOF0vZyxhPT4oYV5NYXRoLnJhbmRvbSgpKjE2Pj5hLzQpLnRvU3RyaW5nKDE2KSk7XG4gICAgLyogZXNsaW50LWVuYWJsZSAqL1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvYm91bmRsZXNzLXV0aWxzLXV1aWQvaW5kZXguanMiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0XCJ9XG4vLyBtb2R1bGUgaWQgPSAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0LWRvbVwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0LWRvbVwifVxuLy8gbW9kdWxlIGlkID0gM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgUmVhY3QsIHtQcm9wVHlwZXN9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuXG5pbXBvcnQgb21pdCBmcm9tICdib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzJztcbmltcG9ydCB1dWlkIGZyb20gJ2JvdW5kbGVzcy11dGlscy11dWlkJztcblxuLyoqXG4jIFBvcnRhbFxuX19BIGhpZ2hlci1vcmRlciBjb21wb25lbnQgZm9yIHRoZSByZW5kZXJpbmcgb2YgY29tcG9uZW50cyBvdXRzaWRlIHRoZSBub3JtYWwgUmVhY3QgdHJlZS5fX1xuXG5gUG9ydGFsYCBpcyB1c2VkIGluIG90aGVyIGNvbXBvbmVudHMgc3VjaCBhcyBgUG9wb3ZlcmAgdG8gcmVuZGVyIGNvbnRlbnQgdG8gcGxhY2VzIGxpa2UgdGhlIEhUTUwgYDxib2R5PmAgdGFnLCBhdm9pZGluZyBzdHlsZSBsZWFrYWdlIGFuZCBwYXJlbnQgbGF5b3V0IGNvbnRleHRzLiBPbmx5IGFjY2VwdHMgYSBzaW5nbGUgdG9wLWxldmVsIGNoaWxkOyBuYWtlZCB0ZXh0LCBldGMgd2lsbCBiZSB3cmFwcGVkIGluIGEgYDxkaXY+YC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG9ydGFsIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgICAvLyBzaW5nbGUgY2hpbGQgb25seSAtIGFycmF5cyBub3QgYWxsb3dlZFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhbnkgbm9ybWFsIFJlYWN0IGNoaWxkLCBidXQgbXVzdCBiZSBzaW5ndWxhcjsgbXVsdGlwbGUgc2libGluZyBjaGlsZHJlbiBtdXN0IGhhdmUgYSBjb21tb24gd3JhcHBlciwgc3VjaCBhcyBhIFwibGF5b3V0XCIgYDxkaXY+YFxuXG4gICAgICAgICAqIOKchSBPSzpcblxuICAgICAgICAgKiBgYGBqc3hcbiAgICAgICAgICogPFBvcnRhbD5cbiAgICAgICAgICogICBmb29cbiAgICAgICAgICogPC9Qb3J0YWw+XG5cbiAgICAgICAgICogPFBvcnRhbD5cbiAgICAgICAgICogICA8ZGl2PmZvbzwvZGl2PlxuICAgICAgICAgKiA8L1BvcnRhbD5cblxuICAgICAgICAgKiA8UG9ydGFsPlxuICAgICAgICAgKiAgIDxkaXY+XG4gICAgICAgICAqICAgICAgIDxkaXY+Zm9vPC9kaXY+XG4gICAgICAgICAqICAgICAgIDxkaXY+YmFyPC9kaXY+XG4gICAgICAgICAqICAgPC9kaXY+XG4gICAgICAgICAqIDwvUG9ydGFsPlxuICAgICAgICAgKiBgYGBcblxuICAgICAgICAgKiDim5TvuI8gTm90IE9LOlxuXG4gICAgICAgICAqIGBgYGpzeFxuICAgICAgICAgKiA8UG9ydGFsPlxuICAgICAgICAgKiAgIDxkaXY+Zm9vPC9kaXY+XG4gICAgICAgICAqICAgPGRpdj5iYXI8L2Rpdj5cbiAgICAgICAgICogPC9Qb3J0YWw+XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKi9cbiAgICAgICAgY2hpbGRyZW46IFJlYWN0LlByb3BUeXBlcy5ub2RlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0aGUgbG9jYXRpb24gdG8gYXBwZW5kIHRoZSBnZW5lcmF0ZWQgcG9ydGFsIGFuZCBjaGlsZCBlbGVtZW50c1xuICAgICAgICAgKi9cbiAgICAgICAgZGVzdGluYXRpb246IFByb3BUeXBlcy5pbnN0YW5jZU9mKEhUTUxFbGVtZW50KSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogdGhlIElEIHVzZWQgdG8gbGluayB0aGUgcG9ydGFsIG9yaWdpbiB0byB0aGUgZGVzdGluYXRpb247IGFkZGVkIHRvIGdlbmVyYXRlZCBgPGRpdj5gIGFwcGVuZGVkIHRvIHRoZSBkZXN0aW5hdGlvbiBIVE1MIG5vZGVcbiAgICAgICAgICovXG4gICAgICAgIHBvcnRhbElkOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIH1cblxuICAgIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgICAgIGNoaWxkcmVuOiBudWxsLFxuICAgICAgICBkZXN0aW5hdGlvbjogZG9jdW1lbnQuYm9keSxcbiAgICAgICAgcG9ydGFsSWQ6IG51bGwsXG4gICAgfVxuXG4gICAgc3RhdGljIGludGVybmFsS2V5cyA9IE9iamVjdC5rZXlzKFBvcnRhbC5kZWZhdWx0UHJvcHMpXG5cbiAgICBzdGF0aWMgUE9SVEFMX0RBVEFfQVRUUklCVVRFID0gJ2RhdGEtcG9ydGFsLWlkJ1xuXG4gICAgaWQgPSB1dWlkKClcblxuICAgIC8vIHRoZSA8ZGl2PiB0aGF0IHRoZSBjaGlsZHJlbiBhcmUgcmVuZGVyZWQgaW50b1xuICAgICRwb3J0YWwgPSBudWxsXG5cbiAgICAvLyB0aGUgdG9wLWxldmVsIGNoaWxkIHJlbmRlcmVkIGludG8gdGhlICRwb3J0YWxcbiAgICAkcGFzc2VuZ2VyID0gbnVsbDtcblxuICAgIGNvbXBvbmVudFdpbGxNb3VudCgpIHtcbiAgICAgICAgdGhpcy4kcG9ydGFsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRoaXMucHJvcHMuZGVzdGluYXRpb24uYXBwZW5kQ2hpbGQodGhpcy4kcG9ydGFsKTtcblxuICAgICAgICB0aGlzLnJlbmRlclBvcnRhbGxlZENvbnRlbnQoKTtcbiAgICB9XG5cbiAgICByZW5kZXJQb3J0YWxsZWRDb250ZW50KCkge1xuICAgICAgICBjb25zdCBjaGlsZCA9IFJlYWN0LmlzVmFsaWRFbGVtZW50KHRoaXMucHJvcHMuY2hpbGRyZW4pID8gdGhpcy5wcm9wcy5jaGlsZHJlbiA6ICg8ZGl2Pnt0aGlzLnByb3BzLmNoaWxkcmVufTwvZGl2Pik7XG5cbiAgICAgICAgLy8gdXBkYXRlIHRoZSBwb3J0YWwgSUQgbGluayBpZiBuZWVkZWRcbiAgICAgICAgdGhpcy4kcG9ydGFsLmlkID0gdGhpcy5wcm9wcy5wb3J0YWxJZCB8fCB0aGlzLmlkO1xuXG4gICAgICAgIFJlYWN0RE9NLnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKHRoaXMsIGNoaWxkLCB0aGlzLiRwb3J0YWwpO1xuICAgICAgICB0aGlzLiRwYXNzZW5nZXIgPSB0aGlzLiRwb3J0YWwuY2hpbGRyZW5bMF07XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkVXBkYXRlKCkgeyB0aGlzLnJlbmRlclBvcnRhbGxlZENvbnRlbnQoKTsgfVxuXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIFJlYWN0RE9NLnVubW91bnRDb21wb25lbnRBdE5vZGUodGhpcy4kcG9ydGFsKTtcbiAgICAgICAgdGhpcy5wcm9wcy5kZXN0aW5hdGlvbi5yZW1vdmVDaGlsZCh0aGlzLiRwb3J0YWwpO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgey4uLm9taXQodGhpcy5wcm9wcywgUG9ydGFsLmludGVybmFsS2V5cyl9XG4gICAgICAgICAgICAgICAgey4uLntbUG9ydGFsLlBPUlRBTF9EQVRBX0FUVFJJQlVURV06IHRoaXMucHJvcHMucG9ydGFsSWQgfHwgdGhpcy5pZH19IC8+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvYm91bmRsZXNzLXBvcnRhbC9pbmRleC5qcyJdLCJzb3VyY2VSb290IjoiIn0= | ||
module.exports=function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=4)}([function(e,t){e.exports=require("boundless-utils-omit-keys")},function(e,t){e.exports=require("boundless-utils-uuid")},function(e,t){e.exports=require("react")},function(e,t){e.exports=require("react-dom")},function(e,t,n){"use strict";function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var l=n(2),u=n.n(l),p=n(3),s=n.n(p),c=n(0),f=n.n(c),d=n(1),h=n.n(d),y=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},b=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),m=function(e){function t(){var e,n,r,a;o(this,t);for(var l=arguments.length,u=Array(l),p=0;p<l;p++)u[p]=arguments[p];return n=r=i(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(u))),r.id=h()(),r.$portal=null,r.$passenger=null,a=n,i(r,a)}return a(t,e),b(t,[{key:"componentWillMount",value:function(){this.$portal=document.createElement("div"),this.props.destination.appendChild(this.$portal),this.renderPortalledContent()}},{key:"renderPortalledContent",value:function(){var e=u.a.isValidElement(this.props.children)?this.props.children:u.a.createElement("div",null,this.props.children);this.$portal.id=this.props.portalId||this.id,s.a.unstable_renderSubtreeIntoContainer(this,e,this.$portal),this.$passenger=this.$portal.children[0]}},{key:"componentDidUpdate",value:function(){this.renderPortalledContent()}},{key:"componentWillUnmount",value:function(){s.a.unmountComponentAtNode(this.$portal),this.props.destination.removeChild(this.$portal)}},{key:"render",value:function(){return u.a.createElement("span",y({},f()(this.props,t.internalKeys),r({},t.PORTAL_DATA_ATTRIBUTE,this.props.portalId||this.id)))}}]),t}(u.a.Component);m.propTypes={"*":l.PropTypes.any,children:u.a.PropTypes.node,destination:l.PropTypes.instanceOf(HTMLElement),portalId:l.PropTypes.string},m.defaultProps={children:null,destination:document.body,portalId:null},m.internalKeys=Object.keys(m.defaultProps),m.PORTAL_DATA_ATTRIBUTE="data-portal-id",t.default=m}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIGQzZDFhODhjOGQ4YmI0NWZjYzA5Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXV0aWxzLXV1aWRcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3QtZG9tXCJ9Iiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy1wb3J0YWwvaW5kZXguanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJ2YWx1ZSIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwicmVxdWlyZSIsIl9fd2VicGFja19leHBvcnRzX18iLCJfZGVmaW5lUHJvcGVydHkiLCJvYmoiLCJrZXkiLCJ3cml0YWJsZSIsIl9jbGFzc0NhbGxDaGVjayIsImluc3RhbmNlIiwiQ29uc3RydWN0b3IiLCJUeXBlRXJyb3IiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiIsInNlbGYiLCJSZWZlcmVuY2VFcnJvciIsIl9pbmhlcml0cyIsInN1YkNsYXNzIiwic3VwZXJDbGFzcyIsImNyZWF0ZSIsImNvbnN0cnVjdG9yIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfcmVhY3RfZG9tX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfcmVhY3RfZG9tX19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX3V1aWRfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfdXVpZF9fX2RlZmF1bHQiLCJfZXh0ZW5kcyIsImFzc2lnbiIsInRhcmdldCIsImFyZ3VtZW50cyIsImxlbmd0aCIsInNvdXJjZSIsIl9jcmVhdGVDbGFzcyIsImRlZmluZVByb3BlcnRpZXMiLCJwcm9wcyIsImRlc2NyaXB0b3IiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJQb3J0YWwiLCJfUmVhY3QkQ29tcG9uZW50IiwiX3JlZiIsIl90ZW1wIiwiX3RoaXMiLCJfcmV0IiwidGhpcyIsIl9sZW4iLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiZ2V0UHJvdG90eXBlT2YiLCJhcHBseSIsImNvbmNhdCIsImlkIiwiJHBvcnRhbCIsIiRwYXNzZW5nZXIiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJkZXN0aW5hdGlvbiIsImFwcGVuZENoaWxkIiwicmVuZGVyUG9ydGFsbGVkQ29udGVudCIsImNoaWxkIiwiYSIsImlzVmFsaWRFbGVtZW50IiwiY2hpbGRyZW4iLCJwb3J0YWxJZCIsInVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyIiwidW5tb3VudENvbXBvbmVudEF0Tm9kZSIsInJlbW92ZUNoaWxkIiwiaW50ZXJuYWxLZXlzIiwiUE9SVEFMX0RBVEFfQVRUUklCVVRFIiwiQ29tcG9uZW50IiwicHJvcFR5cGVzIiwiKiIsImFueSIsIlByb3BUeXBlcyIsIm5vZGUiLCJpbnN0YW5jZU9mIiwiSFRNTEVsZW1lbnQiLCJzdHJpbmciLCJkZWZhdWx0UHJvcHMiLCJib2R5Iiwia2V5cyJdLCJtYXBwaW5ncyI6IkFBQUFBLE9BQU9DLFFBQ0UsU0FBVUMsR0NHbkIsUUFBQUMsR0FBQUMsR0FHQSxHQUFBQyxFQUFBRCxHQUNBLE1BQUFDLEdBQUFELEdBQUFILE9BR0EsSUFBQUQsR0FBQUssRUFBQUQsSUFDQUUsRUFBQUYsRUFDQUcsR0FBQSxFQUNBTixXQVVBLE9BTkFDLEdBQUFFLEdBQUFJLEtBQUFSLEVBQUFDLFFBQUFELElBQUFDLFFBQUFFLEdBR0FILEVBQUFPLEdBQUEsRUFHQVAsRUFBQUMsUUF2QkEsR0FBQUksS0ErREEsT0FuQ0FGLEdBQUFNLEVBQUFQLEVBR0FDLEVBQUFPLEVBQUFMLEVBR0FGLEVBQUFHLEVBQUEsU0FBQUssR0FBMkMsTUFBQUEsSUFHM0NSLEVBQUFTLEVBQUEsU0FBQVgsRUFBQVksRUFBQUMsR0FDQVgsRUFBQVksRUFBQWQsRUFBQVksSUFDQUcsT0FBQUMsZUFBQWhCLEVBQUFZLEdBQ0FLLGNBQUEsRUFDQUMsWUFBQSxFQUNBQyxJQUFBTixLQU1BWCxFQUFBa0IsRUFBQSxTQUFBckIsR0FDQSxHQUFBYyxHQUFBZCxLQUFBc0IsV0FDQSxXQUEyQixNQUFBdEIsR0FBQSxTQUMzQixXQUFpQyxNQUFBQSxHQUVqQyxPQURBRyxHQUFBUyxFQUFBRSxFQUFBLElBQUFBLEdBQ0FBLEdBSUFYLEVBQUFZLEVBQUEsU0FBQVEsRUFBQUMsR0FBc0QsTUFBQVIsUUFBQVMsVUFBQUMsZUFBQWxCLEtBQUFlLEVBQUFDLElBR3REckIsRUFBQXdCLEVBQUEsR0FHQXhCLElBQUF5QixFQUFBLEtET00sU0FBVTVCLEVBQVFD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QUF3QnpCLEtBQUtWLE1BQU04QixVQUFZcEIsS0FBS1EsVU5IeTdHZCxHTWhHdCtHbkIsRUFBQTBDLEVBQU1TLFVBQXJCaEMsR0FDVmlDLFdBSUhDLElBQUt0RCxFQUFBLFVBQVV1RCxJQW1DZlYsU0FBVTVDLEVBQUEwQyxFQUFNYSxVQUFVQyxLQUsxQmxCLFlBQWF2QyxFQUFBLFVBQVUwRCxXQUFXQyxhQUtsQ2IsU0FBVTlDLEVBQUEsVUFBVTRELFFBbERQeEMsRUFxRFZ5QyxjQUNIaEIsU0FBVSxLQUNWTixZQUFhRixTQUFTeUIsS0FDdEJoQixTQUFVLE1BeERHMUIsRUEyRFY4QixhQUFlbkYsT0FBT2dHLEtBQUszQyxFQUFPeUMsY0EzRHhCekMsRUE2RFYrQixzQkFBd0IsaUJObUM2aEl0RSxFQUE2QixRTWhHeGtJdUMiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9XG4vKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRpOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGw6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4vKioqKioqLyBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4vKioqKioqLyBcdFx0XHRcdGdldDogZ2V0dGVyXG4vKioqKioqLyBcdFx0XHR9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gNCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIik7XG5cbi8qKiovIH0pLFxuLyogMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtdXRpbHMtdXVpZFwiKTtcblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3QtZG9tXCIpO1xuXG4vKioqLyB9KSxcbi8qIDQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9kb21fXyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX3JlYWN0X2RvbV9fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX3JlYWN0X2RvbV9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc191dWlkX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfdXVpZF9fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc191dWlkX18pO1xudmFyIF9leHRlbmRzPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHRhcmdldCl7Zm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIHNvdXJjZT1hcmd1bWVudHNbaV07Zm9yKHZhciBrZXkgaW4gc291cmNlKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLGtleSkpe3RhcmdldFtrZXldPXNvdXJjZVtrZXldO319fXJldHVybiB0YXJnZXQ7fTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQscHJvcHMpe2Zvcih2YXIgaT0wO2k8cHJvcHMubGVuZ3RoO2krKyl7dmFyIGRlc2NyaXB0b3I9cHJvcHNbaV07ZGVzY3JpcHRvci5lbnVtZXJhYmxlPWRlc2NyaXB0b3IuZW51bWVyYWJsZXx8ZmFsc2U7ZGVzY3JpcHRvci5jb25maWd1cmFibGU9dHJ1ZTtpZihcInZhbHVlXCJpbiBkZXNjcmlwdG9yKWRlc2NyaXB0b3Iud3JpdGFibGU9dHJ1ZTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LGRlc2NyaXB0b3Iua2V5LGRlc2NyaXB0b3IpO319cmV0dXJuIGZ1bmN0aW9uKENvbnN0cnVjdG9yLHByb3RvUHJvcHMsc3RhdGljUHJvcHMpe2lmKHByb3RvUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUscHJvdG9Qcm9wcyk7aWYoc3RhdGljUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3RvcixzdGF0aWNQcm9wcyk7cmV0dXJuIENvbnN0cnVjdG9yO307fSgpO2Z1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosa2V5LHZhbHVlKXtpZihrZXkgaW4gb2JqKXtPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLGtleSx7dmFsdWU6dmFsdWUsZW51bWVyYWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlLHdyaXRhYmxlOnRydWV9KTt9ZWxzZXtvYmpba2V5XT12YWx1ZTt9cmV0dXJuIG9iajt9ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLENvbnN0cnVjdG9yKXtpZighKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO319ZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZixjYWxsKXtpZighc2VsZil7dGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO31yZXR1cm4gY2FsbCYmKHR5cGVvZiBjYWxsPT09XCJvYmplY3RcInx8dHlwZW9mIGNhbGw9PT1cImZ1bmN0aW9uXCIpP2NhbGw6c2VsZjt9ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLHN1cGVyQ2xhc3Mpe2lmKHR5cGVvZiBzdXBlckNsYXNzIT09XCJmdW5jdGlvblwiJiZzdXBlckNsYXNzIT09bnVsbCl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIrdHlwZW9mIHN1cGVyQ2xhc3MpO31zdWJDbGFzcy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzJiZzdXBlckNsYXNzLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnN1YkNsYXNzLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX19KTtpZihzdXBlckNsYXNzKU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3Msc3VwZXJDbGFzcyk6c3ViQ2xhc3MuX19wcm90b19fPXN1cGVyQ2xhc3M7fXZhciBQb3J0YWw9ZnVuY3Rpb24oX1JlYWN0JENvbXBvbmVudCl7X2luaGVyaXRzKFBvcnRhbCxfUmVhY3QkQ29tcG9uZW50KTtmdW5jdGlvbiBQb3J0YWwoKXt2YXIgX3JlZjt2YXIgX3RlbXAsX3RoaXMsX3JldDtfY2xhc3NDYWxsQ2hlY2sodGhpcyxQb3J0YWwpO2Zvcih2YXIgX2xlbj1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkoX2xlbiksX2tleT0wO19rZXk8X2xlbjtfa2V5Kyspe2FyZ3NbX2tleV09YXJndW1lbnRzW19rZXldO31yZXR1cm4gX3JldD0oX3RlbXA9KF90aGlzPV9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKF9yZWY9UG9ydGFsLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKFBvcnRhbCkpLmNhbGwuYXBwbHkoX3JlZixbdGhpc10uY29uY2F0KGFyZ3MpKSksX3RoaXMpLF90aGlzLmlkPV9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfdXVpZF9fX2RlZmF1bHQoKSgpLF90aGlzLiRwb3J0YWw9bnVsbCxfdGhpcy4kcGFzc2VuZ2VyPW51bGwsX3RlbXApLF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLF9yZXQpO31fY3JlYXRlQ2xhc3MoUG9ydGFsLFt7a2V5Oidjb21wb25lbnRXaWxsTW91bnQnLHZhbHVlOmZ1bmN0aW9uIGNvbXBvbmVudFdpbGxNb3VudCgpe3RoaXMuJHBvcnRhbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTt0aGlzLnByb3BzLmRlc3RpbmF0aW9uLmFwcGVuZENoaWxkKHRoaXMuJHBvcnRhbCk7dGhpcy5yZW5kZXJQb3J0YWxsZWRDb250ZW50KCk7fX0se2tleToncmVuZGVyUG9ydGFsbGVkQ29udGVudCcsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyUG9ydGFsbGVkQ29udGVudCgpe3ZhciBjaGlsZD1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuaXNWYWxpZEVsZW1lbnQodGhpcy5wcm9wcy5jaGlsZHJlbik/dGhpcy5wcm9wcy5jaGlsZHJlbjpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudCgnZGl2JyxudWxsLHRoaXMucHJvcHMuY2hpbGRyZW4pO3RoaXMuJHBvcnRhbC5pZD10aGlzLnByb3BzLnBvcnRhbElkfHx0aGlzLmlkO19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9kb21fX19kZWZhdWx0LmEudW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIodGhpcyxjaGlsZCx0aGlzLiRwb3J0YWwpO3RoaXMuJHBhc3Nlbmdlcj10aGlzLiRwb3J0YWwuY2hpbGRyZW5bMF07fX0se2tleTonY29tcG9uZW50RGlkVXBkYXRlJyx2YWx1ZTpmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUoKXt0aGlzLnJlbmRlclBvcnRhbGxlZENvbnRlbnQoKTt9fSx7a2V5Oidjb21wb25lbnRXaWxsVW5tb3VudCcsdmFsdWU6ZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKXtfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfcmVhY3RfZG9tX19fZGVmYXVsdC5hLnVubW91bnRDb21wb25lbnRBdE5vZGUodGhpcy4kcG9ydGFsKTt0aGlzLnByb3BzLmRlc3RpbmF0aW9uLnJlbW92ZUNoaWxkKHRoaXMuJHBvcnRhbCk7fX0se2tleToncmVuZGVyJyx2YWx1ZTpmdW5jdGlvbiByZW5kZXIoKXtyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nLF9leHRlbmRzKHt9LF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCgpKHRoaXMucHJvcHMsUG9ydGFsLmludGVybmFsS2V5cyksX2RlZmluZVByb3BlcnR5KHt9LFBvcnRhbC5QT1JUQUxfREFUQV9BVFRSSUJVVEUsdGhpcy5wcm9wcy5wb3J0YWxJZHx8dGhpcy5pZCkpKTt9fV0pO3JldHVybiBQb3J0YWw7fShfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuQ29tcG9uZW50KTtQb3J0YWwucHJvcFR5cGVzPXsnKic6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYW55LGNoaWxkcmVuOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5Qcm9wVHlwZXMubm9kZSxkZXN0aW5hdGlvbjpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5pbnN0YW5jZU9mKEhUTUxFbGVtZW50KSxwb3J0YWxJZDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5zdHJpbmd9O1BvcnRhbC5kZWZhdWx0UHJvcHM9e2NoaWxkcmVuOm51bGwsZGVzdGluYXRpb246ZG9jdW1lbnQuYm9keSxwb3J0YWxJZDpudWxsfTtQb3J0YWwuaW50ZXJuYWxLZXlzPU9iamVjdC5rZXlzKFBvcnRhbC5kZWZhdWx0UHJvcHMpO1BvcnRhbC5QT1JUQUxfREFUQV9BVFRSSUJVVEU9J2RhdGEtcG9ydGFsLWlkJzsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gUG9ydGFsO1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGluZGV4LmpzIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbiBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gNCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgZDNkMWE4OGM4ZDhiYjQ1ZmNjMDkiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXV0aWxzLW9taXQta2V5c1wifVxuLy8gbW9kdWxlIGlkID0gMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtdXRpbHMtdXVpZFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy11dWlkXCJ9XG4vLyBtb2R1bGUgaWQgPSAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn1cbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3QtZG9tXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3QtZG9tXCJ9XG4vLyBtb2R1bGUgaWQgPSAzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsImltcG9ydCBSZWFjdCwge1Byb3BUeXBlc30gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5cbmltcG9ydCBvbWl0IGZyb20gJ2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMnO1xuaW1wb3J0IHV1aWQgZnJvbSAnYm91bmRsZXNzLXV0aWxzLXV1aWQnO1xuXG4vKipcbl9fQSBoaWdoZXItb3JkZXIgY29tcG9uZW50IGZvciB0aGUgcmVuZGVyaW5nIG9mIGNvbXBvbmVudHMgb3V0c2lkZSB0aGUgbm9ybWFsIFJlYWN0IHRyZWUuX19cblxuYFBvcnRhbGAgaXMgdXNlZCBpbiBvdGhlciBjb21wb25lbnRzIHN1Y2ggYXMgYFBvcG92ZXJgIHRvIHJlbmRlciBjb250ZW50IHRvIHBsYWNlcyBsaWtlIHRoZSBIVE1MIGA8Ym9keT5gIHRhZywgYXZvaWRpbmcgc3R5bGUgbGVha2FnZSBhbmQgcGFyZW50IGxheW91dCBjb250ZXh0cy4gT25seSBhY2NlcHRzIGEgc2luZ2xlIHRvcC1sZXZlbCBjaGlsZDsgbmFrZWQgdGV4dCwgZXRjIHdpbGwgYmUgd3JhcHBlZCBpbiBhIGA8ZGl2PmAuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBvcnRhbCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFueSBbUmVhY3Qtc3VwcG9ydGVkIGF0dHJpYnV0ZV0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90YWdzLWFuZC1hdHRyaWJ1dGVzLmh0bWwjaHRtbC1hdHRyaWJ1dGVzKVxuICAgICAgICAgKi9cbiAgICAgICAgJyonOiBQcm9wVHlwZXMuYW55LFxuXG4gICAgICAgIC8vIHNpbmdsZSBjaGlsZCBvbmx5IC0gYXJyYXlzIG5vdCBhbGxvd2VkXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFueSBub3JtYWwgUmVhY3QgY2hpbGQsIGJ1dCBtdXN0IGJlIHNpbmd1bGFyOyBtdWx0aXBsZSBzaWJsaW5nIGNoaWxkcmVuIG11c3QgaGF2ZSBhIGNvbW1vbiB3cmFwcGVyLCBzdWNoIGFzIGEgXCJsYXlvdXRcIiBgPGRpdj5gXG5cbiAgICAgICAgICog4pyFIE9LOlxuXG4gICAgICAgICAqIGBgYGpzeFxuICAgICAgICAgKiA8UG9ydGFsPlxuICAgICAgICAgKiAgIGZvb1xuICAgICAgICAgKiA8L1BvcnRhbD5cblxuICAgICAgICAgKiA8UG9ydGFsPlxuICAgICAgICAgKiAgIDxkaXY+Zm9vPC9kaXY+XG4gICAgICAgICAqIDwvUG9ydGFsPlxuXG4gICAgICAgICAqIDxQb3J0YWw+XG4gICAgICAgICAqICAgPGRpdj5cbiAgICAgICAgICogICAgICAgPGRpdj5mb288L2Rpdj5cbiAgICAgICAgICogICAgICAgPGRpdj5iYXI8L2Rpdj5cbiAgICAgICAgICogICA8L2Rpdj5cbiAgICAgICAgICogPC9Qb3J0YWw+XG4gICAgICAgICAqIGBgYFxuXG4gICAgICAgICAqIOKblO+4jyBOb3QgT0s6XG5cbiAgICAgICAgICogYGBganN4XG4gICAgICAgICAqIDxQb3J0YWw+XG4gICAgICAgICAqICAgPGRpdj5mb288L2Rpdj5cbiAgICAgICAgICogICA8ZGl2PmJhcjwvZGl2PlxuICAgICAgICAgKiA8L1BvcnRhbD5cbiAgICAgICAgICogYGBgXG4gICAgICAgICAqL1xuICAgICAgICBjaGlsZHJlbjogUmVhY3QuUHJvcFR5cGVzLm5vZGUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRoZSBsb2NhdGlvbiB0byBhcHBlbmQgdGhlIGdlbmVyYXRlZCBwb3J0YWwgYW5kIGNoaWxkIGVsZW1lbnRzXG4gICAgICAgICAqL1xuICAgICAgICBkZXN0aW5hdGlvbjogUHJvcFR5cGVzLmluc3RhbmNlT2YoSFRNTEVsZW1lbnQpLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0aGUgSUQgdXNlZCB0byBsaW5rIHRoZSBwb3J0YWwgb3JpZ2luIHRvIHRoZSBkZXN0aW5hdGlvbjsgYWRkZWQgdG8gZ2VuZXJhdGVkIGA8ZGl2PmAgYXBwZW5kZWQgdG8gdGhlIGRlc3RpbmF0aW9uIEhUTUwgbm9kZVxuICAgICAgICAgKi9cbiAgICAgICAgcG9ydGFsSWQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgfVxuXG4gICAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgICAgY2hpbGRyZW46IG51bGwsXG4gICAgICAgIGRlc3RpbmF0aW9uOiBkb2N1bWVudC5ib2R5LFxuICAgICAgICBwb3J0YWxJZDogbnVsbCxcbiAgICB9XG5cbiAgICBzdGF0aWMgaW50ZXJuYWxLZXlzID0gT2JqZWN0LmtleXMoUG9ydGFsLmRlZmF1bHRQcm9wcylcblxuICAgIHN0YXRpYyBQT1JUQUxfREFUQV9BVFRSSUJVVEUgPSAnZGF0YS1wb3J0YWwtaWQnXG5cbiAgICBpZCA9IHV1aWQoKVxuXG4gICAgLy8gdGhlIDxkaXY+IHRoYXQgdGhlIGNoaWxkcmVuIGFyZSByZW5kZXJlZCBpbnRvXG4gICAgJHBvcnRhbCA9IG51bGxcblxuICAgIC8vIHRoZSB0b3AtbGV2ZWwgY2hpbGQgcmVuZGVyZWQgaW50byB0aGUgJHBvcnRhbFxuICAgICRwYXNzZW5nZXIgPSBudWxsO1xuXG4gICAgY29tcG9uZW50V2lsbE1vdW50KCkge1xuICAgICAgICB0aGlzLiRwb3J0YWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGhpcy5wcm9wcy5kZXN0aW5hdGlvbi5hcHBlbmRDaGlsZCh0aGlzLiRwb3J0YWwpO1xuXG4gICAgICAgIHRoaXMucmVuZGVyUG9ydGFsbGVkQ29udGVudCgpO1xuICAgIH1cblxuICAgIHJlbmRlclBvcnRhbGxlZENvbnRlbnQoKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gUmVhY3QuaXNWYWxpZEVsZW1lbnQodGhpcy5wcm9wcy5jaGlsZHJlbikgPyB0aGlzLnByb3BzLmNoaWxkcmVuIDogKDxkaXY+e3RoaXMucHJvcHMuY2hpbGRyZW59PC9kaXY+KTtcblxuICAgICAgICAvLyB1cGRhdGUgdGhlIHBvcnRhbCBJRCBsaW5rIGlmIG5lZWRlZFxuICAgICAgICB0aGlzLiRwb3J0YWwuaWQgPSB0aGlzLnByb3BzLnBvcnRhbElkIHx8IHRoaXMuaWQ7XG5cbiAgICAgICAgUmVhY3RET00udW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIodGhpcywgY2hpbGQsIHRoaXMuJHBvcnRhbCk7XG4gICAgICAgIHRoaXMuJHBhc3NlbmdlciA9IHRoaXMuJHBvcnRhbC5jaGlsZHJlblswXTtcbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRVcGRhdGUoKSB7IHRoaXMucmVuZGVyUG9ydGFsbGVkQ29udGVudCgpOyB9XG5cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgUmVhY3RET00udW5tb3VudENvbXBvbmVudEF0Tm9kZSh0aGlzLiRwb3J0YWwpO1xuICAgICAgICB0aGlzLnByb3BzLmRlc3RpbmF0aW9uLnJlbW92ZUNoaWxkKHRoaXMuJHBvcnRhbCk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICB7Li4ub21pdCh0aGlzLnByb3BzLCBQb3J0YWwuaW50ZXJuYWxLZXlzKX1cbiAgICAgICAgICAgICAgICB7Li4ue1tQb3J0YWwuUE9SVEFMX0RBVEFfQVRUUklCVVRFXTogdGhpcy5wcm9wcy5wb3J0YWxJZCB8fCB0aGlzLmlkfX0gLz5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9ib3VuZGxlc3MtcG9ydGFsL2luZGV4LmpzIl0sInNvdXJjZVJvb3QiOiIifQ== |
@@ -8,3 +8,2 @@ import React, {PropTypes} from 'react'; | ||
/** | ||
# Portal | ||
__A higher-order component for the rendering of components outside the normal React tree.__ | ||
@@ -16,2 +15,7 @@ | ||
static propTypes = { | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
'*': PropTypes.any, | ||
// single child only - arrays not allowed | ||
@@ -18,0 +22,0 @@ |
{ | ||
"name": "boundless-portal", | ||
"version": "1.0.0-beta.5", | ||
"version": "1.0.0-beta.7", | ||
"description": "A higher-order component for the rendering of components outside the normal React tree.", | ||
@@ -28,4 +28,4 @@ "main": "build/index.js", | ||
"dependencies": { | ||
"boundless-utils-omit-keys": "^1.0.0-beta.5", | ||
"boundless-utils-uuid": "^1.0.0-beta.5" | ||
"boundless-utils-omit-keys": "^1.0.0-beta.7", | ||
"boundless-utils-uuid": "^1.0.0-beta.7" | ||
}, | ||
@@ -32,0 +32,0 @@ "peerDependencies": { |
@@ -0,4 +1,6 @@ | ||
<!--- | ||
THIS IS AN AUTOGENERATED FILE. EDIT INDEX.JS INSTEAD. | ||
--> | ||
# Portal | ||
# Portal | ||
__A higher-order component for the rendering of components outside the normal React tree.__ | ||
@@ -8,5 +10,6 @@ | ||
## Props | ||
_Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/Portal#props)._ | ||
> Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/Portal#props). | ||
@@ -20,61 +23,54 @@ ### Required Props | ||
<table> | ||
<tr> | ||
<th>Name</th> | ||
<th>Type</th> | ||
<th>Default Value</th> | ||
<th>Description</th> | ||
</tr> | ||
- __`*`__ ・ any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
<tr> | ||
<td>children</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>any normal React child, but must be singular; multiple sibling children must have a common wrapper, such as a "layout" `<div>` | ||
Expects | Default Value | ||
- | - | ||
`any` | `n/a` | ||
✅ OK: | ||
- __`children`__ ・ any normal React child, but must be singular; multiple sibling children must have a common wrapper, such as a "layout" `<div>` | ||
✅ OK: | ||
```jsx | ||
<Portal> | ||
foo | ||
</Portal> | ||
<Portal> | ||
<div>foo</div> | ||
</Portal> | ||
<Portal> | ||
<div> | ||
<div>foo</div> | ||
<div>bar</div> | ||
</div> | ||
</Portal> | ||
``` | ||
⛔️ Not OK: | ||
```jsx | ||
<Portal> | ||
<div>foo</div> | ||
<div>bar</div> | ||
</Portal> | ||
``` | ||
```jsx | ||
<Portal> | ||
foo | ||
</Portal> | ||
Expects | Default Value | ||
- | - | ||
`any renderable` | `null` | ||
<Portal> | ||
<div>foo</div> | ||
</Portal> | ||
- __`destination`__ ・ the location to append the generated portal and child elements | ||
<Portal> | ||
<div> | ||
<div>foo</div> | ||
<div>bar</div> | ||
</div> | ||
</Portal> | ||
``` | ||
Expects | Default Value | ||
- | - | ||
`HTMLElement` | `document.body` | ||
⛔️ Not OK: | ||
- __`portalId`__ ・ the ID used to link the portal origin to the destination; added to generated `<div>` appended to the destination HTML node | ||
```jsx | ||
<Portal> | ||
<div>foo</div> | ||
<div>bar</div> | ||
</Portal> | ||
```</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`string` | `null` | ||
<tr> | ||
<td>destination</td> | ||
<td><pre><code>HTMLElement</code></pre></td> | ||
<td><pre><code class="language-js">document.body</code></pre></td> | ||
<td>the location to append the generated portal and child elements</td> | ||
</tr> | ||
<tr> | ||
<td>portalId</td> | ||
<td><pre><code>string</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>the ID used to link the portal origin to the destination; added to generated `<div>` appended to the destination HTML node</td> | ||
</tr> | ||
</table> | ||
@@ -1,2 +0,2 @@ | ||
module.exports=function(e){function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}var t={};return r.m=e,r.c=t,r.i=function(e){return e},r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:n})},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r.p="",r(r.s=4)}([function(e,r,t){"use strict";function n(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Object.keys(e).reduce(function(t,n){return r.indexOf(n)===-1&&(t[n]=e[n]),t},{})}r.a=n},function(e,r){e.exports=require("boundless-button")},function(e,r){e.exports=require("classnames")},function(e,r){e.exports=require("react")},function(e,r,t){"use strict";function n(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function o(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")}function s(e,r){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!r||"object"!=typeof r&&"function"!=typeof r?e:r}function p(e,r){if("function"!=typeof r&&null!==r)throw new TypeError("Super expression must either be null or a function, not "+typeof r);e.prototype=Object.create(r&&r.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),r&&(Object.setPrototypeOf?Object.setPrototypeOf(e,r):e.__proto__=r)}Object.defineProperty(r,"__esModule",{value:!0});var a=t(3),i=t.n(a),c=t(2),l=t.n(c),u=t(1),f=t.n(u),b=t(0),y=Object.assign||function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e},P=function(){function e(e,r){for(var t=0;t<r.length;t++){var n=r[t];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(r,t,n){return t&&e(r.prototype,t),n&&e(r,n),r}}(),d=function(e){function r(){return o(this,r),s(this,(r.__proto__||Object.getPrototypeOf(r)).apply(this,arguments))}return p(r,e),P(r,[{key:"renderLabel",value:function(){if(this.props.label)return i.a.createElement("div",y({},this.props.labelProps,{ref:"label",className:l()("b-progress-label",this.props.labelProps.className)}),this.props.label)}},{key:"renderCancel",value:function(){if(this.props.onCancel)return i.a.createElement(f.a,y({},this.props.cancelProps,{ref:"cancel",className:l()("b-progress-cancel",this.props.cancelProps.className),onPressed:this.props.onCancel}))}},{key:"renderProgress",value:function(){return i.a.createElement("div",y({},this.props.progressProps,{ref:"progress",className:l()("b-progress",this.props.progressProps.className,{"b-progress-indeterminate":"undefined"==typeof this.props.progress}),role:"presentation",style:y({},this.props.progressProps.style,n({},this.props.tweenProperty,this.props.progress))}))}},{key:"render",value:function(){return i.a.createElement(this.props.component,y({},t.i(b.a)(this.props,r.internalKeys),{ref:"wrapper",className:l()("b-progress-wrapper",this.props.className)}),this.renderProgress(),this.renderLabel(),this.renderCancel())}}]),r}(i.a.PureComponent);d.propTypes={cancelProps:a.PropTypes.object,component:a.PropTypes.oneOfType([a.PropTypes.string,a.PropTypes.func]),label:a.PropTypes.node,labelProps:a.PropTypes.object,onCancel:a.PropTypes.func,progress:a.PropTypes.oneOfType([a.PropTypes.string,a.PropTypes.number]),progressProps:a.PropTypes.object,tweenProperty:a.PropTypes.string},d.defaultProps={cancelProps:{},component:"div",label:null,labelProps:{},onCancel:null,progress:void 0,progressProps:{},tweenProperty:"width"},d.internalKeys=Object.keys(d.defaultProps),r.default=d}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIGM4MzY0NTNkYTYyYWExZjk3NWI3Iiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLWJ1dHRvblwifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJjbGFzc25hbWVzXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0XCJ9Iiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy1wcm9ncmVzcy9pbmRleC5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwibW9kdWxlcyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImluc3RhbGxlZE1vZHVsZXMiLCJpIiwibCIsImNhbGwiLCJtIiwiYyIsInZhbHVlIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwiZ2V0IiwibiIsIl9fZXNNb2R1bGUiLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJfX3dlYnBhY2tfZXhwb3J0c19fIiwib21pdEtleXNGcm9tU291cmNlT2JqZWN0Iiwic291cmNlIiwib21pdHRlZEtleXMiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJrZXlzIiwicmVkdWNlIiwiaGFzaCIsImtleSIsImluZGV4T2YiLCJyZXF1aXJlIiwiX2RlZmluZVByb3BlcnR5Iiwib2JqIiwid3JpdGFibGUiLCJfY2xhc3NDYWxsQ2hlY2siLCJpbnN0YW5jZSIsIkNvbnN0cnVjdG9yIiwiVHlwZUVycm9yIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJzZWxmIiwiUmVmZXJlbmNlRXJyb3IiLCJfaW5oZXJpdHMiLCJzdWJDbGFzcyIsInN1cGVyQ2xhc3MiLCJjcmVhdGUiLCJjb25zdHJ1Y3RvciIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfYnV0dG9uX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX2J1dHRvbl9fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fIiwiX2V4dGVuZHMiLCJhc3NpZ24iLCJ0YXJnZXQiLCJfY3JlYXRlQ2xhc3MiLCJkZWZpbmVQcm9wZXJ0aWVzIiwicHJvcHMiLCJkZXNjcmlwdG9yIiwicHJvdG9Qcm9wcyIsInN0YXRpY1Byb3BzIiwiUHJvZ3Jlc3MiLCJfUmVhY3QkUHVyZUNvbXBvbmVudCIsInRoaXMiLCJnZXRQcm90b3R5cGVPZiIsImFwcGx5IiwibGFiZWwiLCJhIiwiY3JlYXRlRWxlbWVudCIsImxhYmVsUHJvcHMiLCJyZWYiLCJjbGFzc05hbWUiLCJvbkNhbmNlbCIsImNhbmNlbFByb3BzIiwib25QcmVzc2VkIiwicHJvZ3Jlc3NQcm9wcyIsImItcHJvZ3Jlc3MtaW5kZXRlcm1pbmF0ZSIsInByb2dyZXNzIiwicm9sZSIsInN0eWxlIiwidHdlZW5Qcm9wZXJ0eSIsImNvbXBvbmVudCIsImludGVybmFsS2V5cyIsInJlbmRlclByb2dyZXNzIiwicmVuZGVyTGFiZWwiLCJyZW5kZXJDYW5jZWwiLCJQdXJlQ29tcG9uZW50IiwicHJvcFR5cGVzIiwib25lT2ZUeXBlIiwic3RyaW5nIiwiZnVuYyIsIm5vZGUiLCJudW1iZXIiLCJkZWZhdWx0UHJvcHMiXSwibWFwcGluZ3MiOiJBQUFBQSxPQUFPQyxRQUNFLFNBQVVDLEdDR25CLFFBQUFDLEdBQUFDLEdBR0EsR0FBQUMsRUFBQUQsR0FDQSxNQUFBQyxHQUFBRCxHQUFBSCxPQUdBLElBQUFELEdBQUFLLEVBQUFELElBQ0FFLEVBQUFGLEVBQ0FHLEdBQUEsRUFDQU4sV0FVQSxPQU5BQyxHQUFBRSxHQUFBSSxLQUFBUixFQUFBQyxRQUFBRCxJQUFBQyxRQUFBRSxHQUdBSCxFQUFBTyxHQUFBLEVBR0FQLEVBQUFDLFFBdkJBLEdBQUFJLEtBK0RBLE9BbkNBRixHQUFBTSxFQUFBUCxFQUdBQyxFQUFBTyxFQUFBTCxFQUdBRixFQUFBRyxFQUFBLFNBQUFLLEdBQTJDLE1BQUFBLElBRzNDUixFQUFBUyxFQUFBLFNBQUFYLEVBQUFZLEVBQUFDLEdBQ0FYLEVBQUFZLEVBQUFkLEVBQUFZLElBQ0FHLE9BQUFDLGVBQUFoQixFQUFBWSxHQUNBSyxjQUFBLEVBQ0FDLFlBQUEsRUFDQUMsSUFBQU4sS0FNQVgsRUFBQWtCLEVBQUEsU0FBQXJCLEdBQ0EsR0FBQWMsR0FBQWQsS0FBQXNCLFdBQ0EsV0FBMkIsTUFBQXRCLEdBQUEsU0FDM0IsV0FBaUMsTUFBQUEsR0FFakMsT0FEQUcsR0FBQVMsRUFBQUUsRUFBQSxJQUFBQSxHQUNBQSxHQUlBWCxFQUFBWSxFQUFBLFNBQUFRLEVBQUFDLEdBQXNELE1BQUFSLFFBQUFTLFVBQUFDLGVBQUFsQixLQUFBZSxFQUFBQyxJQUd0RHJCLEVBQUF3QixFQUFBLEdBR0F4QixJQUFBeUIsRUFBQSxLRE9NLFNBQVU1QixFQUFRNkIsRUFBcUIxQixHQUU3QyxZRXRFZSxTQUFTMkIsR0FBeUJDLEdBQTBCLEdBQWxCQyxHQUFrQkMsVUFBQUMsT0FBQSxHQUFBQyxTQUFBRixVQUFBLEdBQUFBLFVBQUEsS0FDdkUsT0FBT2pCLFFB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bEh4QixHTWxHM2tIZixFQUFBcUIsRUFBTW1CLGNBQXZCekIsR0FDVjBCLFdBSUhkLFlBQWE1QixFQUFBLFVBQVVwQyxPQUt2QndFLFVBQVdwQyxFQUFBLFVBQVUyQyxXQUNuQjNDLEVBQUEsVUFBVTRDLE9BQ1Y1QyxFQUFBLFVBQVU2QyxPQU1aeEIsTUFBT3JCLEVBQUEsVUFBVThDLEtBS2pCdEIsV0FBWXhCLEVBQUEsVUFBVXBDLE9BS3RCK0QsU0FBVTNCLEVBQUEsVUFBVTZDLEtBS3BCYixTQUFVaEMsRUFBQSxVQUFVMkMsV0FDbEIzQyxFQUFBLFVBQVU0QyxPQUNWNUMsRUFBQSxVQUFVK0MsU0FNWmpCLGNBQWU5QixFQUFBLFVBQVVwQyxPQUt6QnVFLGNBQWVuQyxFQUFBLFVBQVU0QyxRQTlDWjVCLEVBaURWZ0MsY0FDSHBCLGVBQ0FRLFVBQVcsTUFDWGYsTUFBTyxLQUNQRyxjQUNBRyxTQUFVLEtBQ1ZLLFNBQVV4RCxPQUNWc0QsaUJBQ0FLLGNBQWUsU0F6REZuQixFQTREVnFCLGFBQWVoRixPQUFPb0IsS0FBS3VDLEVBQVNnQyxjTnNDd29KOUUsRUFBNkIsUU1sRy9ySjhDIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPVxuLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbi8qKioqKiovIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuLyoqKioqKi8gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuLyoqKioqKi8gXHRcdFx0XHRnZXQ6IGdldHRlclxuLyoqKioqKi8gXHRcdFx0fSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4vKioqKioqLyBcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDQpO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgZXhwb3J0IChpbW11dGFibGUpICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gb21pdEtleXNGcm9tU291cmNlT2JqZWN0O1xuZnVuY3Rpb24gb21pdEtleXNGcm9tU291cmNlT2JqZWN0KHNvdXJjZSl7dmFyIG9taXR0ZWRLZXlzPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dW5kZWZpbmVkP2FyZ3VtZW50c1sxXTpbXTtyZXR1cm4gT2JqZWN0LmtleXMoc291cmNlKS5yZWR1Y2UoZnVuY3Rpb24gcmVsb2NhdGVBY2NlcHRlZEtleXMoaGFzaCxrZXkpe2lmKG9taXR0ZWRLZXlzLmluZGV4T2Yoa2V5KT09PS0xKXtoYXNoW2tleV09c291cmNlW2tleV07fXJldHVybiBoYXNoO30se30pO31cblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy1idXR0b25cIik7XG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpO1xuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShfX3dlYnBhY2tfZXhwb3J0c19fLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfYnV0dG9uX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfYnV0dG9uX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX2J1dHRvbl9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbnZhciBfZXh0ZW5kcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0YXJnZXQpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9YXJndW1lbnRzW2ldO2Zvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSxrZXkpKXt0YXJnZXRba2V5XT1zb3VyY2Vba2V5XTt9fX1yZXR1cm4gdGFyZ2V0O307dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoXCJ2YWx1ZVwiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKTt9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcjt9O30oKTtmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLGtleSx2YWx1ZSl7aWYoa2V5IGluIG9iail7T2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaixrZXkse3ZhbHVlOnZhbHVlLGVudW1lcmFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZSx3cml0YWJsZTp0cnVlfSk7fWVsc2V7b2JqW2tleV09dmFsdWU7fXJldHVybiBvYmo7fWZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSxDb25zdHJ1Y3Rvcil7aWYoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTt9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsY2FsbCl7aWYoIXNlbGYpe3Rocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTt9cmV0dXJuIGNhbGwmJih0eXBlb2YgY2FsbD09PVwib2JqZWN0XCJ8fHR5cGVvZiBjYWxsPT09XCJmdW5jdGlvblwiKT9jYWxsOnNlbGY7fWZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcyxzdXBlckNsYXNzKXtpZih0eXBlb2Ygc3VwZXJDbGFzcyE9PVwiZnVuY3Rpb25cIiYmc3VwZXJDbGFzcyE9PW51bGwpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiK3R5cGVvZiBzdXBlckNsYXNzKTt9c3ViQ2xhc3MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyYmc3VwZXJDbGFzcy5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpzdWJDbGFzcyxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9fSk7aWYoc3VwZXJDbGFzcylPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLHN1cGVyQ2xhc3MpOnN1YkNsYXNzLl9fcHJvdG9fXz1zdXBlckNsYXNzO312YXIgUHJvZ3Jlc3M9ZnVuY3Rpb24oX1JlYWN0JFB1cmVDb21wb25lbnQpe19pbmhlcml0cyhQcm9ncmVzcyxfUmVhY3QkUHVyZUNvbXBvbmVudCk7ZnVuY3Rpb24gUHJvZ3Jlc3MoKXtfY2xhc3NDYWxsQ2hlY2sodGhpcyxQcm9ncmVzcyk7cmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKFByb2dyZXNzLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKFByb2dyZXNzKSkuYXBwbHkodGhpcyxhcmd1bWVudHMpKTt9X2NyZWF0ZUNsYXNzKFByb2dyZXNzLFt7a2V5OidyZW5kZXJMYWJlbCcsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyTGFiZWwoKXtpZih0aGlzLnByb3BzLmxhYmVsKXtyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoJ2RpdicsX2V4dGVuZHMoe30sdGhpcy5wcm9wcy5sYWJlbFByb3BzLHtyZWY6J2xhYmVsJyxjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItcHJvZ3Jlc3MtbGFiZWwnLHRoaXMucHJvcHMubGFiZWxQcm9wcy5jbGFzc05hbWUpfSksdGhpcy5wcm9wcy5sYWJlbCk7fX19LHtrZXk6J3JlbmRlckNhbmNlbCcsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyQ2FuY2VsKCl7aWYodGhpcy5wcm9wcy5vbkNhbmNlbCl7cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfYnV0dG9uX19fZGVmYXVsdC5hLF9leHRlbmRzKHt9LHRoaXMucHJvcHMuY2FuY2VsUHJvcHMse3JlZjonY2FuY2VsJyxjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItcHJvZ3Jlc3MtY2FuY2VsJyx0aGlzLnByb3BzLmNhbmNlbFByb3BzLmNsYXNzTmFtZSksb25QcmVzc2VkOnRoaXMucHJvcHMub25DYW5jZWx9KSk7fX19LHtrZXk6J3JlbmRlclByb2dyZXNzJyx2YWx1ZTpmdW5jdGlvbiByZW5kZXJQcm9ncmVzcygpe3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudCgnZGl2JyxfZXh0ZW5kcyh7fSx0aGlzLnByb3BzLnByb2dyZXNzUHJvcHMse3JlZjoncHJvZ3Jlc3MnLGNsYXNzTmFtZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQoKSgnYi1wcm9ncmVzcycsdGhpcy5wcm9wcy5wcm9ncmVzc1Byb3BzLmNsYXNzTmFtZSx7J2ItcHJvZ3Jlc3MtaW5kZXRlcm1pbmF0ZSc6dHlwZW9mIHRoaXMucHJvcHMucHJvZ3Jlc3M9PT0ndW5kZWZpbmVkJ30pLHJvbGU6J3ByZXNlbnRhdGlvbicsc3R5bGU6X2V4dGVuZHMoe30sdGhpcy5wcm9wcy5wcm9ncmVzc1Byb3BzLnN0eWxlLF9kZWZpbmVQcm9wZXJ0eSh7fSx0aGlzLnByb3BzLnR3ZWVuUHJvcGVydHksdGhpcy5wcm9wcy5wcm9ncmVzcykpfSkpO319LHtrZXk6J3JlbmRlcicsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyKCl7cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KHRoaXMucHJvcHMuY29tcG9uZW50LF9leHRlbmRzKHt9LF9fd2VicGFja19yZXF1aXJlX18uaShfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKSh0aGlzLnByb3BzLFByb2dyZXNzLmludGVybmFsS2V5cykse3JlZjond3JhcHBlcicsY2xhc3NOYW1lOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCgpKCdiLXByb2dyZXNzLXdyYXBwZXInLHRoaXMucHJvcHMuY2xhc3NOYW1lKX0pLHRoaXMucmVuZGVyUHJvZ3Jlc3MoKSx0aGlzLnJlbmRlckxhYmVsKCksdGhpcy5yZW5kZXJDYW5jZWwoKSk7fX1dKTtyZXR1cm4gUHJvZ3Jlc3M7fShfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuUHVyZUNvbXBvbmVudCk7UHJvZ3Jlc3MucHJvcFR5cGVzPXtjYW5jZWxQcm9wczpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5vYmplY3QsY29tcG9uZW50Ol9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm9uZU9mVHlwZShbX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc3RyaW5nLF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmNdKSxsYWJlbDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ub2RlLGxhYmVsUHJvcHM6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub2JqZWN0LG9uQ2FuY2VsOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmMscHJvZ3Jlc3M6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub25lT2ZUeXBlKFtfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5zdHJpbmcsX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ubnVtYmVyXSkscHJvZ3Jlc3NQcm9wczpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5vYmplY3QsdHdlZW5Qcm9wZXJ0eTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5zdHJpbmd9O1Byb2dyZXNzLmRlZmF1bHRQcm9wcz17Y2FuY2VsUHJvcHM6e30sY29tcG9uZW50OidkaXYnLGxhYmVsOm51bGwsbGFiZWxQcm9wczp7fSxvbkNhbmNlbDpudWxsLHByb2dyZXNzOnVuZGVmaW5lZCxwcm9ncmVzc1Byb3BzOnt9LHR3ZWVuUHJvcGVydHk6J3dpZHRoJ307UHJvZ3Jlc3MuaW50ZXJuYWxLZXlzPU9iamVjdC5rZXlzKFByb2dyZXNzLmRlZmF1bHRQcm9wcyk7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IFByb2dyZXNzO1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGluZGV4LmpzIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbiBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gNCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgYzgzNjQ1M2RhNjJhYTFmOTc1YjciLCIvKipcbiAqIFJldHVybnMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBzdXBwbGllZCBvYmplY3Qgd2l0aG91dCB0aGUgZ2l2ZW4ga2V5cy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb21pdEtleXNGcm9tU291cmNlT2JqZWN0KHNvdXJjZSwgb21pdHRlZEtleXMgPSBbXSkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhzb3VyY2UpLnJlZHVjZShmdW5jdGlvbiByZWxvY2F0ZUFjY2VwdGVkS2V5cyhoYXNoLCBrZXkpIHtcbiAgICAgICAgaWYgKG9taXR0ZWRLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpIHtcbiAgICAgICAgICAgIGhhc2hba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhc2g7XG4gICAgfSwge30pO1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvYm91bmRsZXNzLXV0aWxzLW9taXQta2V5cy9pbmRleC5qcyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy1idXR0b25cIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtYnV0dG9uXCJ9XG4vLyBtb2R1bGUgaWQgPSAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNsYXNzbmFtZXNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJjbGFzc25hbWVzXCJ9XG4vLyBtb2R1bGUgaWQgPSAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn1cbi8vIG1vZHVsZSBpZCA9IDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IFJlYWN0LCB7UHJvcFR5cGVzfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY3ggZnJvbSAnY2xhc3NuYW1lcyc7XG5cbmltcG9ydCBCdXR0b24gZnJvbSAnYm91bmRsZXNzLWJ1dHRvbic7XG5pbXBvcnQgb21pdCBmcm9tICdib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzJztcblxuLyoqXG4jIFByb2dyZXNzXG5fX0FuIHVub3BpbmlvbmF0ZWQgcHJvZ3Jlc3MgaW1wbGVtZW50YXRpb24sIGFsbG93aW5nIGZvciBhIHZhcmlldHkgb2Ygc2hhcGVzIGFuZCBlZmZlY3RzLl9fXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByb2dyZXNzIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFueSBbUmVhY3Qtc3VwcG9ydGVkIGF0dHJpYnV0ZV0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90YWdzLWFuZC1hdHRyaWJ1dGVzLmh0bWwjaHRtbC1hdHRyaWJ1dGVzKTsgYXBwbGllZCB0byB0aGUgYC5iLXByb2dyZXNzLWNhbmNlbGAgbm9kZVxuICAgICAgICAgKi9cbiAgICAgICAgY2FuY2VsUHJvcHM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFueSB2YWxpZCBIVE1MIHRhZyBuYW1lIG9yIGEgUmVhY3QgY29tcG9uZW50IGZhY3RvcnksIGFueXRoaW5nIHRoYXQgY2FuIGJlIHBhc3NlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gYFJlYWN0LmNyZWF0ZUVsZW1lbnRgXG4gICAgICAgICAqL1xuICAgICAgICBjb21wb25lbnQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgICAgICAgIFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICAgICAgUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIF0pLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0aGUgdmFsdWUgdG8gc2hvdyBhcyBhIGxhYmVsIG9mIHRoZSBwcm9ncmVzcywgZS5nLiBcIjUwJVwiXG4gICAgICAgICAqL1xuICAgICAgICBsYWJlbDogUHJvcFR5cGVzLm5vZGUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFueSBbUmVhY3Qtc3VwcG9ydGVkIGF0dHJpYnV0ZV0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90YWdzLWFuZC1hdHRyaWJ1dGVzLmh0bWwjaHRtbC1hdHRyaWJ1dGVzKTsgYXBwbGllZCB0byB0aGUgYC5iLXByb2dyZXNzLWxhYmVsYCBub2RlXG4gICAgICAgICAqL1xuICAgICAgICBsYWJlbFByb3BzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBpZiBzdXBwbGllZCwgYWRkcyBhIGNhbmNlbCBlbGVtZW50IGFuZCBjYWxscyB0aGlzIGZ1bmN0aW9uIHdoZW4gdGhhdCBlbGVtZW50IGlzIGNsaWNrZWRcbiAgICAgICAgICovXG4gICAgICAgIG9uQ2FuY2VsOiBQcm9wVHlwZXMuZnVuYyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogdGhlIGludGVnZXIgKGFuZCB1bml0LCBpZiBhcHBsaWNhYmxlKSBvZiB0aGUgY3VycmVudCBwcm9ncmVzcyBzdGF0ZSwgZS5nLiAwLjAxIChvcGFjaXR5KVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvZ3Jlc3M6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgICAgICAgIFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICAgICAgUHJvcFR5cGVzLm51bWJlcixcbiAgICAgICAgXSksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFueSBbUmVhY3Qtc3VwcG9ydGVkIGF0dHJpYnV0ZV0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90YWdzLWFuZC1hdHRyaWJ1dGVzLmh0bWwjaHRtbC1hdHRyaWJ1dGVzKTsgYXBwbGllZCB0byB0aGUgYC5iLXByb2dyZXNzYCBub2RlXG4gICAgICAgICAqL1xuICAgICAgICBwcm9ncmVzc1Byb3BzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0aGUgQ1NTIHByb3BlcnR5IHRvIHR3ZWVuIChtdXN0IGFjY2VwdCBwZXJjZW50YWdlcykgLSBkZWZhdWx0cyB0byBcIndpZHRoXCJcbiAgICAgICAgICovXG4gICAgICAgIHR3ZWVuUHJvcGVydHk6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgfVxuXG4gICAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgICAgY2FuY2VsUHJvcHM6IHt9LFxuICAgICAgICBjb21wb25lbnQ6ICdkaXYnLFxuICAgICAgICBsYWJlbDogbnVsbCxcbiAgICAgICAgbGFiZWxQcm9wczoge30sXG4gICAgICAgIG9uQ2FuY2VsOiBudWxsLFxuICAgICAgICBwcm9ncmVzczogdW5kZWZpbmVkLFxuICAgICAgICBwcm9ncmVzc1Byb3BzOiB7fSxcbiAgICAgICAgdHdlZW5Qcm9wZXJ0eTogJ3dpZHRoJyxcbiAgICB9XG5cbiAgICBzdGF0aWMgaW50ZXJuYWxLZXlzID0gT2JqZWN0LmtleXMoUHJvZ3Jlc3MuZGVmYXVsdFByb3BzKVxuXG4gICAgcmVuZGVyTGFiZWwoKSB7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmxhYmVsKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgey4uLnRoaXMucHJvcHMubGFiZWxQcm9wc31cbiAgICAgICAgICAgICAgICAgICAgcmVmPSdsYWJlbCdcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjeCgnYi1wcm9ncmVzcy1sYWJlbCcsIHRoaXMucHJvcHMubGFiZWxQcm9wcy5jbGFzc05hbWUpfT5cbiAgICAgICAgICAgICAgICAgICAge3RoaXMucHJvcHMubGFiZWx9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyQ2FuY2VsKCkge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbkNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHsuLi50aGlzLnByb3BzLmNhbmNlbFByb3BzfVxuICAgICAgICAgICAgICAgICAgICByZWY9J2NhbmNlbCdcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjeCgnYi1wcm9ncmVzcy1jYW5jZWwnLCB0aGlzLnByb3BzLmNhbmNlbFByb3BzLmNsYXNzTmFtZSl9XG4gICAgICAgICAgICAgICAgICAgIG9uUHJlc3NlZD17dGhpcy5wcm9wcy5vbkNhbmNlbH0gLz5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXJQcm9ncmVzcygpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICB7Li4udGhpcy5wcm9wcy5wcm9ncmVzc1Byb3BzfVxuICAgICAgICAgICAgICAgIHJlZj0ncHJvZ3Jlc3MnXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjeCgnYi1wcm9ncmVzcycsIHRoaXMucHJvcHMucHJvZ3Jlc3NQcm9wcy5jbGFzc05hbWUsIHtcbiAgICAgICAgICAgICAgICAgICAgJ2ItcHJvZ3Jlc3MtaW5kZXRlcm1pbmF0ZSc6IHR5cGVvZiB0aGlzLnByb3BzLnByb2dyZXNzID09PSAndW5kZWZpbmVkJyxcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICByb2xlPSdwcmVzZW50YXRpb24nXG4gICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5wcm9wcy5wcm9ncmVzc1Byb3BzLnN0eWxlLFxuICAgICAgICAgICAgICAgICAgICBbdGhpcy5wcm9wcy50d2VlblByb3BlcnR5XTogdGhpcy5wcm9wcy5wcm9ncmVzcyxcbiAgICAgICAgICAgICAgICB9fSAvPlxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDx0aGlzLnByb3BzLmNvbXBvbmVudFxuICAgICAgICAgICAgICAgIHsuLi5vbWl0KHRoaXMucHJvcHMsIFByb2dyZXNzLmludGVybmFsS2V5cyl9XG4gICAgICAgICAgICAgICAgcmVmPSd3cmFwcGVyJ1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y3goJ2ItcHJvZ3Jlc3Mtd3JhcHBlcicsIHRoaXMucHJvcHMuY2xhc3NOYW1lKX0+XG4gICAgICAgICAgICAgICAge3RoaXMucmVuZGVyUHJvZ3Jlc3MoKX1cbiAgICAgICAgICAgICAgICB7dGhpcy5yZW5kZXJMYWJlbCgpfVxuICAgICAgICAgICAgICAgIHt0aGlzLnJlbmRlckNhbmNlbCgpfVxuICAgICAgICAgICAgPC90aGlzLnByb3BzLmNvbXBvbmVudD5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9ib3VuZGxlc3MtcHJvZ3Jlc3MvaW5kZXguanMiXSwic291cmNlUm9vdCI6IiJ9 | ||
module.exports=function(e){function r(n){if(o[n])return o[n].exports;var t=o[n]={i:n,l:!1,exports:{}};return e[n].call(t.exports,t,t.exports,r),t.l=!0,t.exports}var o={};return r.m=e,r.c=o,r.i=function(e){return e},r.d=function(e,o,n){r.o(e,o)||Object.defineProperty(e,o,{configurable:!1,enumerable:!0,get:n})},r.n=function(e){var o=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(o,"a",o),o},r.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r.p="",r(r.s=4)}([function(e,r){e.exports=require("boundless-button")},function(e,r){e.exports=require("boundless-utils-omit-keys")},function(e,r){e.exports=require("classnames")},function(e,r){e.exports=require("react")},function(e,r,o){"use strict";function n(e,r,o){return r in e?Object.defineProperty(e,r,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[r]=o,e}function t(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")}function s(e,r){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!r||"object"!=typeof r&&"function"!=typeof r?e:r}function p(e,r){if("function"!=typeof r&&null!==r)throw new TypeError("Super expression must either be null or a function, not "+typeof r);e.prototype=Object.create(r&&r.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),r&&(Object.setPrototypeOf?Object.setPrototypeOf(e,r):e.__proto__=r)}Object.defineProperty(r,"__esModule",{value:!0});var i=o(3),a=o.n(i),c=o(2),u=o.n(c),l=o(0),f=o.n(l),y=o(1),P=o.n(y),h=Object.assign||function(e){for(var r=1;r<arguments.length;r++){var o=arguments[r];for(var n in o)Object.prototype.hasOwnProperty.call(o,n)&&(e[n]=o[n])}return e},b=function(){function e(e,r){for(var o=0;o<r.length;o++){var n=r[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(r,o,n){return o&&e(r.prototype,o),n&&e(r,n),r}}(),g=function(e){function r(){return t(this,r),s(this,(r.__proto__||Object.getPrototypeOf(r)).apply(this,arguments))}return p(r,e),b(r,[{key:"renderCancel",value:function(){if(this.props.onCancel)return a.a.createElement(f.a,h({},this.props.cancelProps,{className:u()("b-progress-cancel",this.props.cancelProps.className),component:this.props.cancelComponent,onPressed:this.props.onCancel}))}},{key:"renderProgress",value:function(){return a.a.createElement(this.props.progressComponent,h({},this.props.progressProps,{className:u()("b-progress",this.props.progressProps.className,{"b-progress-indeterminate":void 0===this.props.progress}),role:"presentation",style:h({},this.props.progressProps.style,n({},this.props.tweenProperty,this.props.progress))}))}},{key:"render",value:function(){return a.a.createElement(this.props.component,h({},P()(this.props,r.internalKeys),{className:u()("b-progress-wrapper",this.props.className),"data-progress":void 0!==this.props.progress?this.props.progress:null}),this.renderProgress(),this.props.children,this.renderCancel())}}]),r}(a.a.PureComponent);g.propTypes={"*":i.PropTypes.any,cancelComponent:i.PropTypes.oneOfType([i.PropTypes.string,i.PropTypes.func]),cancelProps:i.PropTypes.shape({"*":i.PropTypes.any}),component:i.PropTypes.string,onCancel:i.PropTypes.func,progress:i.PropTypes.oneOfType([i.PropTypes.string,i.PropTypes.number]),progressComponent:i.PropTypes.string,progressProps:i.PropTypes.shape({"*":i.PropTypes.any}),tweenProperty:i.PropTypes.string},g.defaultProps={cancelComponent:"button",cancelProps:{},component:"div",onCancel:null,progress:void 0,progressComponent:"div",progressProps:{},tweenProperty:"width"},g.internalKeys=Object.keys(g.defaultProps),r.default=g}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIDA1ZmJhNDExYzA2NDZhMTRkYzAxIiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy1idXR0b25cIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXV0aWxzLW9taXQta2V5c1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJjbGFzc25hbWVzXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0XCJ9Iiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy1wcm9ncmVzcy9pbmRleC5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwibW9kdWxlcyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImluc3RhbGxlZE1vZHVsZXMiLCJpIiwibCIsImNhbGwiLCJtIiwiYyIsInZhbHVlIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwiZ2V0IiwibiIsIl9fZXNNb2R1bGUiLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJyZXF1aXJlIiwiX193ZWJwYWNrX2V4cG9ydHNfXyIsIl9kZWZpbmVQcm9wZXJ0eSIsIm9iaiIsImtleSIsIndyaXRhYmxlIiwiX2NsYXNzQ2FsbENoZWNrIiwiaW5zdGFuY2UiLCJDb25zdHJ1Y3RvciIsIlR5cGVFcnJvciIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIiwic2VsZiIsIlJlZmVyZW5jZUVycm9yIiwiX2luaGVyaXRzIiwic3ViQ2xhc3MiLCJzdXBlckNsYXNzIiwiY3JlYXRlIiwiY29uc3RydWN0b3IiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX2J1dHRvbl9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc19idXR0b25fX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCIsIl9leHRlbmRzIiwiYXNzaWduIiwidGFyZ2V0IiwiYXJndW1lbnRzIiwibGVuZ3RoIiwic291cmNlIiwiX2NyZWF0ZUNsYXNzIiwiZGVmaW5lUHJvcGVydGllcyIsInByb3BzIiwiZGVzY3JpcHRvciIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsIlByb2dyZXNzIiwiX1JlYWN0JFB1cmVDb21wb25lbnQiLCJ0aGlzIiwiZ2V0UHJvdG90eXBlT2YiLCJhcHBseSIsIm9uQ2FuY2VsIiwiYSIsImNyZWF0ZUVsZW1lbnQiLCJjYW5jZWxQcm9wcyIsImNsYXNzTmFtZSIsImNvbXBvbmVudCIsImNhbmNlbENvbXBvbmVudCIsIm9uUHJlc3NlZCIsInByb2dyZXNzQ29tcG9uZW50IiwicHJvZ3Jlc3NQcm9wcyIsImItcHJvZ3Jlc3MtaW5kZXRlcm1pbmF0ZSIsInVuZGVmaW5lZCIsInByb2dyZXNzIiwicm9sZSIsInN0eWxlIiwidHdlZW5Qcm9wZXJ0eSIsImludGVybmFsS2V5cyIsImRhdGEtcHJvZ3Jlc3MiLCJyZW5kZXJQcm9ncmVzcyIsImNoaWxkcmVuIiwicmVuZGVyQ2FuY2VsIiwiUHVyZUNvbXBvbmVudCIsInByb3BUeXBlcyIsIioiLCJhbnkiLCJvbmVPZlR5cGUiLCJzdHJpbmciLCJmdW5jIiwic2hhcGUiLCJudW1iZXIiLCJkZWZhdWx0UHJvcHMiLCJrZXlzIl0sIm1hcHBpbmdzIjoiQUFBQUEsT0FBT0MsUUFDRSxTQUFVQyxHQ0duQixRQUFBQyxHQUFBQyxHQUdBLEdBQUFDLEVBQUFELEdBQ0EsTUFBQUMsR0FBQUQsR0FBQUgsT0FHQSxJQUFBRCxHQUFBSyxFQUFBRCxJQUNBRSxFQUFBRixFQUNBRyxHQUFBLEVBQ0FOLFdBVUEsT0FOQUMsR0FBQUUsR0FBQUksS0FBQVIsRUFBQUMsUUFBQUQsSUFBQUMsUUFBQUUsR0FHQUgsRUFBQU8sR0FBQSxFQUdBUCxFQUFBQyxRQXZCQSxHQUFBSSxLQStEQSxPQW5DQUYsR0FBQU0sRUFBQVAsRUFHQUMsRUFBQU8sRUFBQUwsRUFHQUYsRUFBQUcsRUFBQSxTQUFBSyxHQUEyQyxNQUFBQSxJQUczQ1IsRUFBQVMsRUFBQSxTQUFBWCxFQUFBWSxFQUFBQyxHQUNBWCxFQUFBWSxFQUFBZCxFQUFBWSxJQUNBRyxPQUFBQyxlQUFBaEIsRUFBQVksR0FDQUssY0FBQSxFQUNBQyxZQUFBLEVBQ0FDLElBQUFOLEtBTUFYLEVBQUFrQixFQUFBLFNBQUFyQixHQUNBLEdBQUFjLEdBQUFkLEtBQUFzQixXQUNBLFdBQTJCLE1BQUF0QixHQUFBLFNBQzNCLFdBQWlDLE1BQUFBLEdBRWpDLE9BREFHLEdBQUFTLEVBQUFFLEVBQUEsSUFBQUEsR0FDQUEsR0FJQVgsRUFBQVksRUFBQSxTQUFBUSxFQUFBQyxHQUFzRCxNQUFBUixRQUFBUyxVQUFBQyxlQUFBbEIsS0FBQWUsRUFBQUMsSUFHdERyQixFQUFBd0IsRUFBQSxHQUdBeEIsSUFBQXlCLEVBQUEsS0RPTSxTQUFVNUIsRUFBUUMsR0V2RXhCRCxFQUFBQyxRQUFBNEIsUUFBQSxxQkY2RU0sU0FBVTdCLEVBQVFDLEdHN0V4QkQsRUFBQUMsUUFBQTRC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VXJDLEVBQUEsVUFBVWtELFdBQ2xCbEQsRUFBQSxVQUFVbUQsT0FDVm5ELEVBQUEsVUFBVXNELFNBTVpyQixrQkFBbUJqQyxFQUFBLFVBQVVtRCxPQUU3QmpCLGNBQWVsQyxFQUFBLFVBQVVxRCxPQUlyQkwsSUFBS2hELEVBQUEsVUFBVWlELE1BTW5CVCxjQUFleEMsRUFBQSxVQUFVbUQsUUF2RFovQixFQTBEVm1DLGNBQ0h4QixnQkFBaUIsU0FDakJILGVBQ0FFLFVBQVcsTUFDWEwsU0FBVSxLQUNWWSxTQUFVRCxPQUNWSCxrQkFBbUIsTUFDbkJDLGlCQUNBTSxjQUFlLFNBbEVGcEIsRUFxRVZxQixhQUFlMUUsT0FBT3lGLEtBQUtwQyxFQUFTbUMsY042QitrSjFFLEVBQTZCLFFNbEd0b0p1QyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbi8qKioqKiovIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbi8qKioqKiovIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA0KTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLWJ1dHRvblwiKTtcblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIik7XG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpO1xuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShfX3dlYnBhY2tfZXhwb3J0c19fLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfYnV0dG9uX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfYnV0dG9uX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX2J1dHRvbl9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyk7XG52YXIgX2V4dGVuZHM9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odGFyZ2V0KXtmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXt2YXIgc291cmNlPWFyZ3VtZW50c1tpXTtmb3IodmFyIGtleSBpbiBzb3VyY2Upe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2Usa2V5KSl7dGFyZ2V0W2tleV09c291cmNlW2tleV07fX19cmV0dXJuIHRhcmdldDt9O3ZhciBfY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCxwcm9wcyl7Zm9yKHZhciBpPTA7aTxwcm9wcy5sZW5ndGg7aSsrKXt2YXIgZGVzY3JpcHRvcj1wcm9wc1tpXTtkZXNjcmlwdG9yLmVudW1lcmFibGU9ZGVzY3JpcHRvci5lbnVtZXJhYmxlfHxmYWxzZTtkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZT10cnVlO2lmKFwidmFsdWVcImluIGRlc2NyaXB0b3IpZGVzY3JpcHRvci53cml0YWJsZT10cnVlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsZGVzY3JpcHRvci5rZXksZGVzY3JpcHRvcik7fX1yZXR1cm4gZnVuY3Rpb24oQ29uc3RydWN0b3IscHJvdG9Qcm9wcyxzdGF0aWNQcm9wcyl7aWYocHJvdG9Qcm9wcylkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSxwcm90b1Byb3BzKTtpZihzdGF0aWNQcm9wcylkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLHN0YXRpY1Byb3BzKTtyZXR1cm4gQ29uc3RydWN0b3I7fTt9KCk7ZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaixrZXksdmFsdWUpe2lmKGtleSBpbiBvYmope09iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosa2V5LHt2YWx1ZTp2YWx1ZSxlbnVtZXJhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWUsd3JpdGFibGU6dHJ1ZX0pO31lbHNle29ialtrZXldPXZhbHVlO31yZXR1cm4gb2JqO31mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7fX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLGNhbGwpe2lmKCFzZWxmKXt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7fXJldHVybiBjYWxsJiYodHlwZW9mIGNhbGw9PT1cIm9iamVjdFwifHx0eXBlb2YgY2FsbD09PVwiZnVuY3Rpb25cIik/Y2FsbDpzZWxmO31mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT1cImZ1bmN0aW9uXCImJnN1cGVyQ2xhc3MhPT1udWxsKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2Ygc3VwZXJDbGFzcyk7fXN1YkNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MmJnN1cGVyQ2xhc3MucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6c3ViQ2xhc3MsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfX0pO2lmKHN1cGVyQ2xhc3MpT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcyxzdXBlckNsYXNzKTpzdWJDbGFzcy5fX3Byb3RvX189c3VwZXJDbGFzczt9dmFyIFByb2dyZXNzPWZ1bmN0aW9uKF9SZWFjdCRQdXJlQ29tcG9uZW50KXtfaW5oZXJpdHMoUHJvZ3Jlc3MsX1JlYWN0JFB1cmVDb21wb25lbnQpO2Z1bmN0aW9uIFByb2dyZXNzKCl7X2NsYXNzQ2FsbENoZWNrKHRoaXMsUHJvZ3Jlc3MpO3JldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLChQcm9ncmVzcy5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihQcm9ncmVzcykpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSk7fV9jcmVhdGVDbGFzcyhQcm9ncmVzcyxbe2tleToncmVuZGVyQ2FuY2VsJyx2YWx1ZTpmdW5jdGlvbiByZW5kZXJDYW5jZWwoKXtpZih0aGlzLnByb3BzLm9uQ2FuY2VsKXtyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc19idXR0b25fX19kZWZhdWx0LmEsX2V4dGVuZHMoe30sdGhpcy5wcm9wcy5jYW5jZWxQcm9wcyx7Y2xhc3NOYW1lOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCgpKCdiLXByb2dyZXNzLWNhbmNlbCcsdGhpcy5wcm9wcy5jYW5jZWxQcm9wcy5jbGFzc05hbWUpLGNvbXBvbmVudDp0aGlzLnByb3BzLmNhbmNlbENvbXBvbmVudCxvblByZXNzZWQ6dGhpcy5wcm9wcy5vbkNhbmNlbH0pKTt9fX0se2tleToncmVuZGVyUHJvZ3Jlc3MnLHZhbHVlOmZ1bmN0aW9uIHJlbmRlclByb2dyZXNzKCl7cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KHRoaXMucHJvcHMucHJvZ3Jlc3NDb21wb25lbnQsX2V4dGVuZHMoe30sdGhpcy5wcm9wcy5wcm9ncmVzc1Byb3BzLHtjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItcHJvZ3Jlc3MnLHRoaXMucHJvcHMucHJvZ3Jlc3NQcm9wcy5jbGFzc05hbWUseydiLXByb2dyZXNzLWluZGV0ZXJtaW5hdGUnOnRoaXMucHJvcHMucHJvZ3Jlc3M9PT11bmRlZmluZWR9KSxyb2xlOidwcmVzZW50YXRpb24nLHN0eWxlOl9leHRlbmRzKHt9LHRoaXMucHJvcHMucHJvZ3Jlc3NQcm9wcy5zdHlsZSxfZGVmaW5lUHJvcGVydHkoe30sdGhpcy5wcm9wcy50d2VlblByb3BlcnR5LHRoaXMucHJvcHMucHJvZ3Jlc3MpKX0pKTt9fSx7a2V5OidyZW5kZXInLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudCh0aGlzLnByb3BzLmNvbXBvbmVudCxfZXh0ZW5kcyh7fSxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fX2RlZmF1bHQoKSh0aGlzLnByb3BzLFByb2dyZXNzLmludGVybmFsS2V5cykse2NsYXNzTmFtZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQoKSgnYi1wcm9ncmVzcy13cmFwcGVyJyx0aGlzLnByb3BzLmNsYXNzTmFtZSksJ2RhdGEtcHJvZ3Jlc3MnOnRoaXMucHJvcHMucHJvZ3Jlc3MhPT11bmRlZmluZWQ/dGhpcy5wcm9wcy5wcm9ncmVzczpudWxsfSksdGhpcy5yZW5kZXJQcm9ncmVzcygpLHRoaXMucHJvcHMuY2hpbGRyZW4sdGhpcy5yZW5kZXJDYW5jZWwoKSk7fX1dKTtyZXR1cm4gUHJvZ3Jlc3M7fShfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuUHVyZUNvbXBvbmVudCk7UHJvZ3Jlc3MucHJvcFR5cGVzPXsnKic6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYW55LGNhbmNlbENvbXBvbmVudDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5vbmVPZlR5cGUoW19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLnN0cmluZyxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jXSksY2FuY2VsUHJvcHM6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc2hhcGUoeycqJzpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5hbnl9KSxjb21wb25lbnQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc3RyaW5nLG9uQ2FuY2VsOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmMscHJvZ3Jlc3M6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub25lT2ZUeXBlKFtfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5zdHJpbmcsX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ubnVtYmVyXSkscHJvZ3Jlc3NDb21wb25lbnQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc3RyaW5nLHByb2dyZXNzUHJvcHM6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc2hhcGUoeycqJzpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5hbnl9KSx0d2VlblByb3BlcnR5Ol9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLnN0cmluZ307UHJvZ3Jlc3MuZGVmYXVsdFByb3BzPXtjYW5jZWxDb21wb25lbnQ6J2J1dHRvbicsY2FuY2VsUHJvcHM6e30sY29tcG9uZW50OidkaXYnLG9uQ2FuY2VsOm51bGwscHJvZ3Jlc3M6dW5kZWZpbmVkLHByb2dyZXNzQ29tcG9uZW50OidkaXYnLHByb2dyZXNzUHJvcHM6e30sdHdlZW5Qcm9wZXJ0eTond2lkdGgnfTtQcm9ncmVzcy5pbnRlcm5hbEtleXM9T2JqZWN0LmtleXMoUHJvZ3Jlc3MuZGVmYXVsdFByb3BzKTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gUHJvZ3Jlc3M7XG5cbi8qKiovIH0pXG4vKioqKioqLyBdKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gaW5kZXguanMiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA0KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCAwNWZiYTQxMWMwNjQ2YTE0ZGMwMSIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy1idXR0b25cIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtYnV0dG9uXCJ9XG4vLyBtb2R1bGUgaWQgPSAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzXCJ9XG4vLyBtb2R1bGUgaWQgPSAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNsYXNzbmFtZXNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJjbGFzc25hbWVzXCJ9XG4vLyBtb2R1bGUgaWQgPSAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn1cbi8vIG1vZHVsZSBpZCA9IDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IFJlYWN0LCB7UHJvcFR5cGVzfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY3ggZnJvbSAnY2xhc3NuYW1lcyc7XG5cbmltcG9ydCBCdXR0b24gZnJvbSAnYm91bmRsZXNzLWJ1dHRvbic7XG5pbXBvcnQgb21pdCBmcm9tICdib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzJztcblxuLyoqXG5fX0FuIHVub3BpbmlvbmF0ZWQgcHJvZ3Jlc3MgaW1wbGVtZW50YXRpb24sIGFsbG93aW5nIGZvciBhIHZhcmlldHkgb2Ygc2hhcGVzIGFuZCBlZmZlY3RzLl9fXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByb2dyZXNzIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFueSBbUmVhY3Qtc3VwcG9ydGVkIGF0dHJpYnV0ZV0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90YWdzLWFuZC1hdHRyaWJ1dGVzLmh0bWwjaHRtbC1hdHRyaWJ1dGVzKVxuICAgICAgICAgKi9cbiAgICAgICAgJyonOiBQcm9wVHlwZXMuYW55LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhbnkgdmFsaWQgSFRNTCB0YWcgbmFtZVxuICAgICAgICAgKi9cbiAgICAgICAgY2FuY2VsQ29tcG9uZW50OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgICAgIFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICAgICAgICBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgXSksXG5cbiAgICAgICAgY2FuY2VsUHJvcHM6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIGFueSBbUmVhY3Qtc3VwcG9ydGVkIGF0dHJpYnV0ZV0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90YWdzLWFuZC1hdHRyaWJ1dGVzLmh0bWwjaHRtbC1hdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICAnKic6IFByb3BUeXBlcy5hbnksXG4gICAgICAgIH0pLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhbnkgdmFsaWQgSFRNTCB0YWcgbmFtZVxuICAgICAgICAgKi9cbiAgICAgICAgY29tcG9uZW50OiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBpZiBzdXBwbGllZCwgYWRkcyBhIGNhbmNlbCBlbGVtZW50IGFuZCBjYWxscyB0aGlzIGZ1bmN0aW9uIHdoZW4gdGhhdCBlbGVtZW50IGlzIGNsaWNrZWRcbiAgICAgICAgICovXG4gICAgICAgIG9uQ2FuY2VsOiBQcm9wVHlwZXMuZnVuYyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogdGhlIGludGVnZXIgKGFuZCB1bml0LCBpZiBhcHBsaWNhYmxlKSBvZiB0aGUgY3VycmVudCBwcm9ncmVzcyBzdGF0ZSwgZS5nLiAwLjAxIChvcGFjaXR5KVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvZ3Jlc3M6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgICAgICAgIFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICAgICAgUHJvcFR5cGVzLm51bWJlcixcbiAgICAgICAgXSksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFueSB2YWxpZCBIVE1MIHRhZyBuYW1lXG4gICAgICAgICAqL1xuICAgICAgICBwcm9ncmVzc0NvbXBvbmVudDogUHJvcFR5cGVzLnN0cmluZyxcblxuICAgICAgICBwcm9ncmVzc1Byb3BzOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBhbnkgW1JlYWN0LXN1cHBvcnRlZCBhdHRyaWJ1dGVdKGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdGFncy1hbmQtYXR0cmlidXRlcy5odG1sI2h0bWwtYXR0cmlidXRlcylcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgJyonOiBQcm9wVHlwZXMuYW55LFxuICAgICAgICB9KSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogdGhlIENTUyBwcm9wZXJ0eSB0byB0d2VlbiAobXVzdCBhY2NlcHQgcGVyY2VudGFnZXMpIC0gZGVmYXVsdHMgdG8gXCJ3aWR0aFwiXG4gICAgICAgICAqL1xuICAgICAgICB0d2VlblByb3BlcnR5OiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIH1cblxuICAgIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgICAgIGNhbmNlbENvbXBvbmVudDogJ2J1dHRvbicsXG4gICAgICAgIGNhbmNlbFByb3BzOiB7fSxcbiAgICAgICAgY29tcG9uZW50OiAnZGl2JyxcbiAgICAgICAgb25DYW5jZWw6IG51bGwsXG4gICAgICAgIHByb2dyZXNzOiB1bmRlZmluZWQsXG4gICAgICAgIHByb2dyZXNzQ29tcG9uZW50OiAnZGl2JyxcbiAgICAgICAgcHJvZ3Jlc3NQcm9wczoge30sXG4gICAgICAgIHR3ZWVuUHJvcGVydHk6ICd3aWR0aCcsXG4gICAgfVxuXG4gICAgc3RhdGljIGludGVybmFsS2V5cyA9IE9iamVjdC5rZXlzKFByb2dyZXNzLmRlZmF1bHRQcm9wcylcblxuICAgIHJlbmRlckNhbmNlbCgpIHtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25DYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB7Li4udGhpcy5wcm9wcy5jYW5jZWxQcm9wc31cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjeCgnYi1wcm9ncmVzcy1jYW5jZWwnLCB0aGlzLnByb3BzLmNhbmNlbFByb3BzLmNsYXNzTmFtZSl9XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudD17dGhpcy5wcm9wcy5jYW5jZWxDb21wb25lbnR9XG4gICAgICAgICAgICAgICAgICAgIG9uUHJlc3NlZD17dGhpcy5wcm9wcy5vbkNhbmNlbH0gLz5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXJQcm9ncmVzcygpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDx0aGlzLnByb3BzLnByb2dyZXNzQ29tcG9uZW50XG4gICAgICAgICAgICAgICAgey4uLnRoaXMucHJvcHMucHJvZ3Jlc3NQcm9wc31cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KCdiLXByb2dyZXNzJywgdGhpcy5wcm9wcy5wcm9ncmVzc1Byb3BzLmNsYXNzTmFtZSwge1xuICAgICAgICAgICAgICAgICAgICAnYi1wcm9ncmVzcy1pbmRldGVybWluYXRlJzogdGhpcy5wcm9wcy5wcm9ncmVzcyA9PT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgIHJvbGU9J3ByZXNlbnRhdGlvbidcbiAgICAgICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLnByb3BzLnByb2dyZXNzUHJvcHMuc3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIFt0aGlzLnByb3BzLnR3ZWVuUHJvcGVydHldOiB0aGlzLnByb3BzLnByb2dyZXNzLFxuICAgICAgICAgICAgICAgIH19IC8+XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPHRoaXMucHJvcHMuY29tcG9uZW50XG4gICAgICAgICAgICAgICAgey4uLm9taXQodGhpcy5wcm9wcywgUHJvZ3Jlc3MuaW50ZXJuYWxLZXlzKX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KCdiLXByb2dyZXNzLXdyYXBwZXInLCB0aGlzLnByb3BzLmNsYXNzTmFtZSl9XG4gICAgICAgICAgICAgICAgZGF0YS1wcm9ncmVzcz17dGhpcy5wcm9wcy5wcm9ncmVzcyAhPT0gdW5kZWZpbmVkID8gdGhpcy5wcm9wcy5wcm9ncmVzcyA6IG51bGx9PlxuICAgICAgICAgICAgICAgIHt0aGlzLnJlbmRlclByb2dyZXNzKCl9XG4gICAgICAgICAgICAgICAge3RoaXMucHJvcHMuY2hpbGRyZW59XG4gICAgICAgICAgICAgICAge3RoaXMucmVuZGVyQ2FuY2VsKCl9XG4gICAgICAgICAgICA8L3RoaXMucHJvcHMuY29tcG9uZW50PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL2JvdW5kbGVzcy1wcm9ncmVzcy9pbmRleC5qcyJdLCJzb3VyY2VSb290IjoiIn0= |
@@ -8,3 +8,2 @@ import React, {PropTypes} from 'react'; | ||
/** | ||
# Progress | ||
__An unopinionated progress implementation, allowing for a variety of shapes and effects.__ | ||
@@ -15,23 +14,25 @@ */ | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-progress-cancel` node | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
cancelProps: PropTypes.object, | ||
'*': PropTypes.any, | ||
/** | ||
* any valid HTML tag name or a React component factory, anything that can be passed as the first argument to `React.createElement` | ||
* any valid HTML tag name | ||
*/ | ||
component: PropTypes.oneOfType([ | ||
PropTypes.string, | ||
PropTypes.func, | ||
cancelComponent: PropTypes.oneOfType([ | ||
PropTypes.string, | ||
PropTypes.func, | ||
]), | ||
/** | ||
* the value to show as a label of the progress, e.g. "50%" | ||
*/ | ||
label: PropTypes.node, | ||
cancelProps: PropTypes.shape({ | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
'*': PropTypes.any, | ||
}), | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-progress-label` node | ||
* any valid HTML tag name | ||
*/ | ||
labelProps: PropTypes.object, | ||
component: PropTypes.string, | ||
@@ -52,6 +53,13 @@ /** | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-progress` node | ||
* any valid HTML tag name | ||
*/ | ||
progressProps: PropTypes.object, | ||
progressComponent: PropTypes.string, | ||
progressProps: PropTypes.shape({ | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
'*': PropTypes.any, | ||
}), | ||
/** | ||
@@ -64,8 +72,8 @@ * the CSS property to tween (must accept percentages) - defaults to "width" | ||
static defaultProps = { | ||
cancelComponent: 'button', | ||
cancelProps: {}, | ||
component: 'div', | ||
label: null, | ||
labelProps: {}, | ||
onCancel: null, | ||
progress: undefined, | ||
progressComponent: 'div', | ||
progressProps: {}, | ||
@@ -77,15 +85,2 @@ tweenProperty: 'width', | ||
renderLabel() { | ||
if (this.props.label) { | ||
return ( | ||
<div | ||
{...this.props.labelProps} | ||
ref='label' | ||
className={cx('b-progress-label', this.props.labelProps.className)}> | ||
{this.props.label} | ||
</div> | ||
); | ||
} | ||
} | ||
renderCancel() { | ||
@@ -96,4 +91,4 @@ if (this.props.onCancel) { | ||
{...this.props.cancelProps} | ||
ref='cancel' | ||
className={cx('b-progress-cancel', this.props.cancelProps.className)} | ||
component={this.props.cancelComponent} | ||
onPressed={this.props.onCancel} /> | ||
@@ -106,7 +101,6 @@ ); | ||
return ( | ||
<div | ||
<this.props.progressComponent | ||
{...this.props.progressProps} | ||
ref='progress' | ||
className={cx('b-progress', this.props.progressProps.className, { | ||
'b-progress-indeterminate': typeof this.props.progress === 'undefined', | ||
'b-progress-indeterminate': this.props.progress === undefined, | ||
})} | ||
@@ -125,6 +119,6 @@ role='presentation' | ||
{...omit(this.props, Progress.internalKeys)} | ||
ref='wrapper' | ||
className={cx('b-progress-wrapper', this.props.className)}> | ||
className={cx('b-progress-wrapper', this.props.className)} | ||
data-progress={this.props.progress !== undefined ? this.props.progress : null}> | ||
{this.renderProgress()} | ||
{this.renderLabel()} | ||
{this.props.children} | ||
{this.renderCancel()} | ||
@@ -131,0 +125,0 @@ </this.props.component> |
{ | ||
"name": "boundless-progress", | ||
"version": "1.0.0-beta.5", | ||
"version": "1.0.0-beta.7", | ||
"description": "An unopinionated progress implementation, allowing for a variety of shapes and effects.", | ||
@@ -27,4 +27,4 @@ "main": "build/index.js", | ||
"dependencies": { | ||
"boundless-button": "^1.0.0-beta.5", | ||
"boundless-utils-omit-keys": "^1.0.0-beta.5", | ||
"boundless-button": "^1.0.0-beta.7", | ||
"boundless-utils-omit-keys": "^1.0.0-beta.7", | ||
"classnames": "^2.1.5" | ||
@@ -31,0 +31,0 @@ }, |
@@ -0,9 +1,92 @@ | ||
<!--- | ||
THIS IS AN AUTOGENERATED FILE. EDIT INDEX.JS INSTEAD. | ||
--> | ||
# Progress | ||
# Progress | ||
__An unopinionated progress implementation, allowing for a variety of shapes and effects.__ | ||
## Example Usage | ||
```jsx | ||
import React from 'react'; | ||
import Button from '../../boundless-button/index'; | ||
import Progress from '../index'; | ||
import {each} from 'lodash'; | ||
export default class ProgressDemo extends React.PureComponent { | ||
state = { | ||
barProgress: 0, | ||
meterProgress: 0, | ||
} | ||
componentDidMount() { | ||
each(this.refs, (value, key) => this.updateProgress(key)); | ||
} | ||
componentWillUnmount() { | ||
window.clearTimeout(this.barTimerHandle); | ||
window.clearTimeout(this.meterTimerHandle); | ||
} | ||
updateProgress(type) { | ||
if (this.state[`${type}Progress`] < 100) { | ||
this[`${type}TimerHandle`] = window.setTimeout(() => { | ||
this.setState({ [`${type}Progress`]: this.state[`${type}Progress`] + 1 }, () => { | ||
this.updateProgress(type); | ||
}); | ||
}, 35); | ||
} | ||
} | ||
resetProgress(type) { | ||
window.clearTimeout(this[`${type}TimerHandle`]); | ||
this.setState({ [`${type}Progress`]: 0 }, () => { this.updateProgress(type); }); | ||
} | ||
render() { | ||
return ( | ||
<div className='progress-demo spread align-end'> | ||
<figure> | ||
<h5>Horizontal Progress Bar</h5> | ||
<Progress | ||
ref='bar' | ||
aria-label={`${this.state.barProgress}% complete`} | ||
progress={`${this.state.barProgress}%`} /> | ||
<Button | ||
onPressed={this.resetProgress.bind(this, 'bar')} | ||
style={{marginTop: '1rem'}}> | ||
Reset | ||
</Button> | ||
</figure> | ||
<figure> | ||
<h5>Filling Progress Meter</h5> | ||
<Progress | ||
ref='meter' | ||
id='progress-meter' | ||
aria-label={`${this.state.meterProgress}% complete`} | ||
progress={`${this.state.meterProgress}%`} | ||
tweenProperty='height' /> | ||
<Button | ||
onPressed={this.resetProgress.bind(this, 'meter')} | ||
style={{marginTop: '1rem'}}> | ||
Reset | ||
</Button> | ||
</figure> | ||
<figure> | ||
<h5>Indeterminate Progress Bar</h5> | ||
<Progress | ||
ref='indeterminate' | ||
aria-label={'Processing...'} /> | ||
</figure> | ||
</div> | ||
); | ||
} | ||
} | ||
``` | ||
## Props | ||
_Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/Progress#props)._ | ||
> Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/Progress#props). | ||
@@ -17,68 +100,72 @@ ### Required Props | ||
<table> | ||
<tr> | ||
<th>Name</th> | ||
<th>Type</th> | ||
<th>Default Value</th> | ||
<th>Description</th> | ||
</tr> | ||
- __`*`__ ・ any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
<tr> | ||
<td>cancelProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-progress-cancel` node</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any` | `n/a` | ||
<tr> | ||
<td>component</td> | ||
<td><pre><code>string or function</code></pre></td> | ||
<td><pre><code class="language-js">'div'</code></pre></td> | ||
<td>any valid HTML tag name or a React component factory, anything that can be passed as the first argument to `React.createElement`</td> | ||
</tr> | ||
- __`cancelComponent`__ ・ any valid HTML tag name | ||
<tr> | ||
<td>label</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>the value to show as a label of the progress, e.g. "50%"</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`string or function` | `'button'` | ||
<tr> | ||
<td>labelProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-progress-label` node</td> | ||
</tr> | ||
- __`cancelProps`__ | ||
<tr> | ||
<td>onCancel</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>if supplied, adds a cancel element and calls this function when that element is clicked</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`object` | `{}` | ||
<tr> | ||
<td>progress</td> | ||
<td><pre><code>string or number</code></pre></td> | ||
<td><pre><code class="language-js">undefined</code></pre></td> | ||
<td>the integer (and unit, if applicable) of the current progress state, e.g. 0.01 (opacity)</td> | ||
</tr> | ||
- __`component`__ ・ any valid HTML tag name | ||
<tr> | ||
<td>progressProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-progress` node</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`string` | `'div'` | ||
<tr> | ||
<td>tweenProperty</td> | ||
<td><pre><code>string</code></pre></td> | ||
<td><pre><code class="language-js">'width'</code></pre></td> | ||
<td>the CSS property to tween (must accept percentages) - defaults to "width"</td> | ||
</tr> | ||
- __`onCancel`__ ・ if supplied, adds a cancel element and calls this function when that element is clicked | ||
</table> | ||
Expects | Default Value | ||
- | - | ||
`function` | `null` | ||
- __`progress`__ ・ the integer (and unit, if applicable) of the current progress state, e.g. 0.01 (opacity) | ||
Expects | Default Value | ||
- | - | ||
`string or number` | `undefined` | ||
- __`progressComponent`__ ・ any valid HTML tag name | ||
Expects | Default Value | ||
- | - | ||
`string` | `'div'` | ||
- __`progressProps`__ | ||
Expects | Default Value | ||
- | - | ||
`object` | `{}` | ||
- __`tweenProperty`__ ・ the CSS property to tween (must accept percentages) - defaults to "width" | ||
Expects | Default Value | ||
- | - | ||
`string` | `'width'` | ||
## Reference Styles | ||
### Stylus | ||
```stylus | ||
// Bring in Boundless's base Stylus variables | ||
@require "node_modules/boundless-progress/variables" | ||
// Redefine any variables as desired, e.g. | ||
color-accent = royalblue | ||
// Bring in the component styles; they will be autoconfigured based on the above | ||
@require "node_modules/boundless-progress/style" | ||
``` | ||
### CSS | ||
If desired, a precompiled plain CSS stylesheet is available for customization at `/build/style.css`, based on Boundless's [default variables](https://github.com/enigma-io/boundless/blob/master/variables.styl). | ||
@@ -1,2 +0,2 @@ | ||
module.exports=function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=3)}([function(e,t,n){"use strict";function r(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Object.keys(e).reduce(function(n,r){return t.indexOf(r)===-1&&(n[r]=e[r]),n},{})}t.a=r},function(e,t){e.exports=require("classnames")},function(e,t){e.exports=require("react")},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function p(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=n(2),a=n.n(s),i=n(1),c=n.n(i),l=n(0),u=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},d=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),f=function(e){return"function"==typeof e},h=function(){},y=function(e){function t(){var e,n,p,s;r(this,t);for(var a=arguments.length,i=Array(a),c=0;c<a;c++)i[c]=arguments[c];return n=p=o(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(i))),p.state={expanded:p.props.expanded},p.dispatchCallback=function(){p.props[p.state.expanded?"onExpand":"onHide"]()},p.handleClick=function(e){p.setState({expanded:!p.state.expanded},p.dispatchCallback),f(p.props.toggleProps.onClick)&&p.props.toggleProps.onClick(e)},p.handleKeyDown=function(e){switch(e.key){case"Enter":e.preventDefault(),p.setState({expanded:!p.state.expanded},p.dispatchCallback)}f(p.props.toggleProps.onKeyDown)&&p.props.toggleProps.onKeyDown(e)},s=n,o(p,s)}return p(t,e),d(t,[{key:"componentWillReceiveProps",value:function(e){e.expanded!==this.props.expanded&&this.setState({expanded:e.expanded},this.dispatchCallback)}},{key:"renderContent",value:function(){if(this.state.expanded)return a.a.createElement("div",{ref:"content",className:"b-disclosure-content"},f(this.props.children)?this.props.children():this.props.children)}},{key:"render",value:function(){return a.a.createElement(this.props.component,u({},n.i(l.a)(this.props,t.internalKeys),{ref:"wrapper",className:c()("b-disclosure",this.props.className,{"b-disclosure-expanded":this.state.expanded})}),a.a.createElement("div",u({},this.props.toggleProps,{ref:"toggle",className:c()("b-disclosure-toggle",this.props.toggleProps.className),onClick:this.handleClick,onKeyDown:this.handleKeyDown,tabIndex:"0"}),this.state.expanded?this.props.teaserExpanded||this.props.teaser:this.props.teaser),this.renderContent())}}]),t}(a.a.PureComponent);y.propTypes={children:s.PropTypes.any,component:s.PropTypes.oneOfType([s.PropTypes.string,s.PropTypes.func]),expanded:s.PropTypes.bool,onExpand:s.PropTypes.func,onHide:s.PropTypes.func,teaser:s.PropTypes.node,teaserExpanded:s.PropTypes.node,toggleProps:s.PropTypes.object},y.defaultProps={children:null,component:"div",expanded:!1,onExpand:h,onHide:h,teaser:null,teaserExpanded:null,toggleProps:{}},y.internalKeys=Object.keys(y.defaultProps),t.default=y}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIDYwMzAzZjMyMDE3ZGYxMzE3YjVjIiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiY2xhc3NuYW1lc1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdFwifSIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9ib3VuZGxlc3MtcHJvZ3Jlc3NpdmUtZGlzY2xvc3VyZS9pbmRleC5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwibW9kdWxlcyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImluc3RhbGxlZE1vZHVsZXMiLCJpIiwibCIsImNhbGwiLCJtIiwiYyIsInZhbHVlIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwiZ2V0IiwibiIsIl9fZXNNb2R1bGUiLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJfX3dlYnBhY2tfZXhwb3J0c19fIiwib21pdEtleXNGcm9tU291cmNlT2JqZWN0Iiwic291cmNlIiwib21pdHRlZEtleXMiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJrZXlzIiwicmVkdWNlIiwiaGFzaCIsImtleSIsImluZGV4T2YiLCJyZXF1aXJlIiwiX2NsYXNzQ2FsbENoZWNrIiwiaW5zdGFuY2UiLCJDb25zdHJ1Y3RvciIsIlR5cGVFcnJvciIsIl9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIiwic2VsZiIsIlJlZmVyZW5jZUVycm9yIiwiX2luaGVyaXRzIiwic3ViQ2xhc3MiLCJzdXBlckNsYXNzIiwiY3JlYXRlIiwiY29uc3RydWN0b3IiLCJ3cml0YWJsZSIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18iLCJfZXh0ZW5kcyIsImFzc2lnbiIsInRhcmdldCIsIl9jcmVhdGVDbGFzcyIsImRlZmluZVByb3BlcnRpZXMiLCJwcm9wcyIsImRlc2NyaXB0b3IiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJpc0Z1bmN0aW9uIiwieCIsIm5vb3AiLCJQcm9ncmVzc2l2ZURpc2Nsb3N1cmUiLCJfUmVhY3QkUHVyZUNvbXBvbmVudCIsIl9yZWYiLCJfdGVtcCIsIl90aGlzIiwiX3JldCIsInRoaXMiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImdldFByb3RvdHlwZU9mIiwiYXBwbHkiLCJjb25jYXQiLCJzdGF0ZSIsImV4cGFuZGVkIiwiZGlzcGF0Y2hDYWxsYmFjayIsImhhbmRsZUNsaWNrIiwiZXZlbnQiLCJzZXRTdGF0ZSIsInRvZ2dsZVByb3BzIiwib25DbGljayIsImhhbmRsZUtleURvd24iLCJwcmV2ZW50RGVmYXVsdCIsIm9uS2V5RG93biIsIm5ld1Byb3BzIiwiYSIsImNyZWF0ZUVsZW1lbnQiLCJyZWYiLCJjbGFzc05hbWUiLCJjaGlsZHJlbiIsImNvbXBvbmVudCIsImludGVybmFsS2V5cyIsImItZGlzY2xvc3VyZS1leHBhbmRlZCIsInRhYkluZGV4IiwidGVhc2VyRXhwYW5kZWQiLCJ0ZWFzZXIiLCJyZW5kZXJDb250ZW50IiwiUHVyZUNvbXBvbmVudCIsInByb3BUeXBlcyIsImFueSIsIm9uZU9mVHlwZSIsInN0cmluZyIsImZ1bmMiLCJib29sIiwib25FeHBhbmQiLCJvbkhpZGUiLCJub2RlIiwiZGVmYXVsdFByb3BzIl0sIm1hcHBpbmdzIjoiQUFBQUEsT0FBT0MsUUFDRSxTQUFVQyxHQ0duQixRQUFBQyxHQUFBQyxHQUdBLEdBQUFDLEVBQUFELEdBQ0EsTUFBQUMsR0FBQUQsR0FBQUgsT0FHQSxJQUFBRCxHQUFBSyxFQUFBRCxJQUNBRSxFQUFBRixFQUNBRyxHQUFBLEVBQ0FOLFdBVUEsT0FOQUMsR0FBQUUsR0FBQUksS0FBQVIsRUFBQUMsUUFBQUQsSUFBQUMsUUFBQUUsR0FHQUgsRUFBQU8sR0FBQSxFQUdBUCxFQUFBQyxRQXZCQSxHQUFBSSxLQStEQSxPQW5DQUYsR0FBQU0sRUFBQVAsRUFHQUMsRUFBQU8sRUFBQUwsRUFHQUYsRUFBQUcsRUFBQSxTQUFBSyxHQUEyQyxNQUFBQSxJQUczQ1IsRUFBQVMsRUFBQSxTQUFBWCxFQUFBWSxFQUFBQyxHQUNBWCxFQUFBWSxFQUFBZCxFQUFBWSxJQUNBRyxPQUFBQyxlQUFBaEIsRUFBQVksR0FDQUssY0FBQSxFQUNBQyxZQUFBLEVBQ0FDLElBQUFOLEtBTUFYLEVBQUFrQixFQUFBLFNBQUFyQixHQUNBLEdBQUFjLEdBQUFkLEtBQUFzQixXQUNBLFdBQTJCLE1BQUF0QixHQUFBLFNBQzNCLFdBQWlDLE1BQUFBLEdBRWpDLE9BREFHLEdBQUFTLEVBQUFFLEVBQUEsSUFBQUEsR0FDQUEsR0FJQVgsRUFBQVksRUFBQSxTQUFBUSxFQUFBQyxHQUFzRCxNQUFBUixRQUFBUyxVQUFBQyxlQUFBbEIsS0FBQWUsRUFBQUMsSUFHdERyQixFQUFBd0IsRUFBQSxHQUdBeEIsSUFBQXlCLEVBQUEsS0RPTSxTQUFVNUIsRUFBUTZCLEVBQXFCMUIsR0FFN0MsWUV0RWUsU0FBUzJCLEdBQXlCQyxHQUEwQixHQUFsQkMsR0FBa0JDLFVBQUFDLE9BQUEsR0FBQUMsU0FBQUYsVUFBQSxHQUFBQSxVQUFBLEtBQ3ZFLE9BQU9q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QyxVQUFXM0MsSUFBRyxlQUFnQm9CLEtBQUtiLE1BQU1vQyxXQUN0Q0ksd0JBQXlCM0IsS0FBS1EsTUFBTUMsYUFHdkMvQixFQUFBMEMsRUFBQUMsY0FBQSxNQUFBdkMsS0FDUWtCLEtBQUtiLE1BQU0yQixhQUNmUSxJQUFJLFNBQ0pDLFVBQVczQyxJQUFHLHNCQUF1Qm9CLEtBQUtiLE1BQU0yQixZQUFZUyxXQUM1RFIsUUFBU2YsS0FBS1csWUFDZE8sVUFBV2xCLEtBQUtnQixjQUNoQlksU0FBUyxNQUNSNUIsS0FBS1EsTUFBTUMsU0FBV1QsS0FBS2IsTUFBTTBDLGdCQUFrQjdCLEtBQUtiLE1BQU0yQyxPQUFTOUIsS0FBS2IsTUFBTTJDLFFBR3RGOUIsS0FBSytCLHFCTHJDeWlJckMsR0t0RjVnSWhCLEVBQUEwQyxFQUFNWSxjQUFwQ3RDLEdBQ1Z1QyxXQUVIVCxTQUFVL0MsRUFBQSxVQUFVeUQsSUFLcEJULFVBQVdoRCxFQUFBLFVBQVUwRCxXQUNqQjFELEVBQUEsVUFBVTJELE9BQ1YzRCxFQUFBLFVBQVU0RCxPQU1kNUIsU0FBVWhDLEVBQUEsVUFBVTZELEtBS3BCQyxTQUFVOUQsRUFBQSxVQUFVNEQsS0FLcEJHLE9BQVEvRCxFQUFBLFVBQVU0RCxLQUtsQlAsT0FBUXJELEVBQUEsVUFBVWdFLEtBS2xCWixlQUFnQnBELEVBQUEsVUFBVWdFLEtBSzFCM0IsWUFBYXJDLEVBQUEsVUFBVWxDLFFBekNWbUQsRUE0Q1ZnRCxjQUNIbEIsU0FBVSxLQUNWQyxVQUFXLE1BQ1hoQixVQUFVLEVBQ1Y4QixTQUFVOUMsRUFDVitDLE9BQVEvQyxFQUNScUMsT0FBUSxLQUNSRCxlQUFnQixLQUNoQmYsZ0JBcERhcEIsRUF1RFZnQyxhQUFlMUYsT0FBT29CLEtBQUtzQyxFQUFzQmdELGNMK0IwL0o3RixFQUE2QixRS3RGOWpLNkMiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9XG4vKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRpOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGw6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4vKioqKioqLyBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4vKioqKioqLyBcdFx0XHRcdGdldDogZ2V0dGVyXG4vKioqKioqLyBcdFx0XHR9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMyk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBleHBvcnQgKGltbXV0YWJsZSkgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSBvbWl0S2V5c0Zyb21Tb3VyY2VPYmplY3Q7XG5mdW5jdGlvbiBvbWl0S2V5c0Zyb21Tb3VyY2VPYmplY3Qoc291cmNlKXt2YXIgb21pdHRlZEtleXM9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOltdO3JldHVybiBPYmplY3Qua2V5cyhzb3VyY2UpLnJlZHVjZShmdW5jdGlvbiByZWxvY2F0ZUFjY2VwdGVkS2V5cyhoYXNoLGtleSl7aWYob21pdHRlZEtleXMuaW5kZXhPZihrZXkpPT09LTEpe2hhc2hba2V5XT1zb3VyY2Vba2V5XTt9cmV0dXJuIGhhc2g7fSx7fSk7fVxuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2xhc3NuYW1lc1wiKTtcblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbnZhciBfZXh0ZW5kcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0YXJnZXQpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9YXJndW1lbnRzW2ldO2Zvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSxrZXkpKXt0YXJnZXRba2V5XT1zb3VyY2Vba2V5XTt9fX1yZXR1cm4gdGFyZ2V0O307dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoXCJ2YWx1ZVwiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKTt9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcjt9O30oKTtmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7fX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLGNhbGwpe2lmKCFzZWxmKXt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7fXJldHVybiBjYWxsJiYodHlwZW9mIGNhbGw9PT1cIm9iamVjdFwifHx0eXBlb2YgY2FsbD09PVwiZnVuY3Rpb25cIik/Y2FsbDpzZWxmO31mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT1cImZ1bmN0aW9uXCImJnN1cGVyQ2xhc3MhPT1udWxsKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2Ygc3VwZXJDbGFzcyk7fXN1YkNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MmJnN1cGVyQ2xhc3MucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6c3ViQ2xhc3MsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfX0pO2lmKHN1cGVyQ2xhc3MpT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcyxzdXBlckNsYXNzKTpzdWJDbGFzcy5fX3Byb3RvX189c3VwZXJDbGFzczt9dmFyIGlzRnVuY3Rpb249ZnVuY3Rpb24gaXNGdW5jdGlvbih4KXtyZXR1cm4gdHlwZW9mIHg9PT0nZnVuY3Rpb24nO307dmFyIG5vb3A9ZnVuY3Rpb24gbm9vcCgpe307dmFyIFByb2dyZXNzaXZlRGlzY2xvc3VyZT1mdW5jdGlvbihfUmVhY3QkUHVyZUNvbXBvbmVudCl7X2luaGVyaXRzKFByb2dyZXNzaXZlRGlzY2xvc3VyZSxfUmVhY3QkUHVyZUNvbXBvbmVudCk7ZnVuY3Rpb24gUHJvZ3Jlc3NpdmVEaXNjbG9zdXJlKCl7dmFyIF9yZWY7dmFyIF90ZW1wLF90aGlzLF9yZXQ7X2NsYXNzQ2FsbENoZWNrKHRoaXMsUHJvZ3Jlc3NpdmVEaXNjbG9zdXJlKTtmb3IodmFyIF9sZW49YXJndW1lbnRzLmxlbmd0aCxhcmdzPUFycmF5KF9sZW4pLF9rZXk9MDtfa2V5PF9sZW47X2tleSsrKXthcmdzW19rZXldPWFyZ3VtZW50c1tfa2V5XTt9cmV0dXJuIF9yZXQ9KF90ZW1wPShfdGhpcz1fcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLChfcmVmPVByb2dyZXNzaXZlRGlzY2xvc3VyZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihQcm9ncmVzc2l2ZURpc2Nsb3N1cmUpKS5jYWxsLmFwcGx5KF9yZWYsW3RoaXNdLmNvbmNhdChhcmdzKSkpLF90aGlzKSxfdGhpcy5zdGF0ZT17ZXhwYW5kZWQ6X3RoaXMucHJvcHMuZXhwYW5kZWR9LF90aGlzLmRpc3BhdGNoQ2FsbGJhY2s9ZnVuY3Rpb24oKXtfdGhpcy5wcm9wc1tfdGhpcy5zdGF0ZS5leHBhbmRlZD8nb25FeHBhbmQnOidvbkhpZGUnXSgpO30sX3RoaXMuaGFuZGxlQ2xpY2s9ZnVuY3Rpb24oZXZlbnQpe190aGlzLnNldFN0YXRlKHtleHBhbmRlZDohX3RoaXMuc3RhdGUuZXhwYW5kZWR9LF90aGlzLmRpc3BhdGNoQ2FsbGJhY2spO2lmKGlzRnVuY3Rpb24oX3RoaXMucHJvcHMudG9nZ2xlUHJvcHMub25DbGljaykpe190aGlzLnByb3BzLnRvZ2dsZVByb3BzLm9uQ2xpY2soZXZlbnQpO319LF90aGlzLmhhbmRsZUtleURvd249ZnVuY3Rpb24oZXZlbnQpe3N3aXRjaChldmVudC5rZXkpe2Nhc2UnRW50ZXInOmV2ZW50LnByZXZlbnREZWZhdWx0KCk7X3RoaXMuc2V0U3RhdGUoe2V4cGFuZGVkOiFfdGhpcy5zdGF0ZS5leHBhbmRlZH0sX3RoaXMuZGlzcGF0Y2hDYWxsYmFjayk7fWlmKGlzRnVuY3Rpb24oX3RoaXMucHJvcHMudG9nZ2xlUHJvcHMub25LZXlEb3duKSl7X3RoaXMucHJvcHMudG9nZ2xlUHJvcHMub25LZXlEb3duKGV2ZW50KTt9fSxfdGVtcCksX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsX3JldCk7fV9jcmVhdGVDbGFzcyhQcm9ncmVzc2l2ZURpc2Nsb3N1cmUsW3trZXk6J2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMnLHZhbHVlOmZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV3UHJvcHMpe2lmKG5ld1Byb3BzLmV4cGFuZGVkIT09dGhpcy5wcm9wcy5leHBhbmRlZCl7dGhpcy5zZXRTdGF0ZSh7ZXhwYW5kZWQ6bmV3UHJvcHMuZXhwYW5kZWR9LHRoaXMuZGlzcGF0Y2hDYWxsYmFjayk7fX19LHtrZXk6J3JlbmRlckNvbnRlbnQnLHZhbHVlOmZ1bmN0aW9uIHJlbmRlckNvbnRlbnQoKXtpZih0aGlzLnN0YXRlLmV4cGFuZGVkKXtyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoJ2Rpdicse3JlZjonY29udGVudCcsY2xhc3NOYW1lOidiLWRpc2Nsb3N1cmUtY29udGVudCd9LGlzRnVuY3Rpb24odGhpcy5wcm9wcy5jaGlsZHJlbik/dGhpcy5wcm9wcy5jaGlsZHJlbigpOnRoaXMucHJvcHMuY2hpbGRyZW4pO319fSx7a2V5OidyZW5kZXInLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudCh0aGlzLnByb3BzLmNvbXBvbmVudCxfZXh0ZW5kcyh7fSxfX3dlYnBhY2tfcmVxdWlyZV9fLmkoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkodGhpcy5wcm9wcyxQcm9ncmVzc2l2ZURpc2Nsb3N1cmUuaW50ZXJuYWxLZXlzKSx7cmVmOid3cmFwcGVyJyxjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItZGlzY2xvc3VyZScsdGhpcy5wcm9wcy5jbGFzc05hbWUseydiLWRpc2Nsb3N1cmUtZXhwYW5kZWQnOnRoaXMuc3RhdGUuZXhwYW5kZWR9KX0pLF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KCdkaXYnLF9leHRlbmRzKHt9LHRoaXMucHJvcHMudG9nZ2xlUHJvcHMse3JlZjondG9nZ2xlJyxjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItZGlzY2xvc3VyZS10b2dnbGUnLHRoaXMucHJvcHMudG9nZ2xlUHJvcHMuY2xhc3NOYW1lKSxvbkNsaWNrOnRoaXMuaGFuZGxlQ2xpY2ssb25LZXlEb3duOnRoaXMuaGFuZGxlS2V5RG93bix0YWJJbmRleDonMCd9KSx0aGlzLnN0YXRlLmV4cGFuZGVkP3RoaXMucHJvcHMudGVhc2VyRXhwYW5kZWR8fHRoaXMucHJvcHMudGVhc2VyOnRoaXMucHJvcHMudGVhc2VyKSx0aGlzLnJlbmRlckNvbnRlbnQoKSk7fX1dKTtyZXR1cm4gUHJvZ3Jlc3NpdmVEaXNjbG9zdXJlO30oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLlB1cmVDb21wb25lbnQpO1Byb2dyZXNzaXZlRGlzY2xvc3VyZS5wcm9wVHlwZXM9e2NoaWxkcmVuOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmFueSxjb21wb25lbnQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub25lT2ZUeXBlKFtfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5zdHJpbmcsX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uZnVuY10pLGV4cGFuZGVkOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmJvb2wsb25FeHBhbmQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uZnVuYyxvbkhpZGU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uZnVuYyx0ZWFzZXI6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ubm9kZSx0ZWFzZXJFeHBhbmRlZDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ub2RlLHRvZ2dsZVByb3BzOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm9iamVjdH07UHJvZ3Jlc3NpdmVEaXNjbG9zdXJlLmRlZmF1bHRQcm9wcz17Y2hpbGRyZW46bnVsbCxjb21wb25lbnQ6J2RpdicsZXhwYW5kZWQ6ZmFsc2Usb25FeHBhbmQ6bm9vcCxvbkhpZGU6bm9vcCx0ZWFzZXI6bnVsbCx0ZWFzZXJFeHBhbmRlZDpudWxsLHRvZ2dsZVByb3BzOnt9fTtQcm9ncmVzc2l2ZURpc2Nsb3N1cmUuaW50ZXJuYWxLZXlzPU9iamVjdC5rZXlzKFByb2dyZXNzaXZlRGlzY2xvc3VyZS5kZWZhdWx0UHJvcHMpOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSBQcm9ncmVzc2l2ZURpc2Nsb3N1cmU7XG5cbi8qKiovIH0pXG4vKioqKioqLyBdKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gaW5kZXguanMiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAzKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCA2MDMwM2YzMjAxN2RmMTMxN2I1YyIsIi8qKlxuICogUmV0dXJucyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIHN1cHBsaWVkIG9iamVjdCB3aXRob3V0IHRoZSBnaXZlbiBrZXlzLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBvbWl0S2V5c0Zyb21Tb3VyY2VPYmplY3Qoc291cmNlLCBvbWl0dGVkS2V5cyA9IFtdKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIHJlbG9jYXRlQWNjZXB0ZWRLZXlzKGhhc2gsIGtleSkge1xuICAgICAgICBpZiAob21pdHRlZEtleXMuaW5kZXhPZihrZXkpID09PSAtMSkge1xuICAgICAgICAgICAgaGFzaFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFzaDtcbiAgICB9LCB7fSk7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9ib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzL2luZGV4LmpzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2xhc3NuYW1lc1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImNsYXNzbmFtZXNcIn1cbi8vIG1vZHVsZSBpZCA9IDFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdFwifVxuLy8gbW9kdWxlIGlkID0gMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgUmVhY3QsIHtQcm9wVHlwZXN9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjeCBmcm9tICdjbGFzc25hbWVzJztcblxuaW1wb3J0IG9taXQgZnJvbSAnYm91bmRsZXNzLXV0aWxzLW9taXQta2V5cyc7XG5cbmNvbnN0IGlzRnVuY3Rpb24gPSAoeCkgPT4gdHlwZW9mIHggPT09ICdmdW5jdGlvbic7XG5jb25zdCBub29wID0gKCkgPT4ge307XG5cbi8qKlxuIyBQcm9ncmVzc2l2ZURpc2Nsb3N1cmVcbl9fSGlkZSBjb250ZW50IHVudGlsIGl0J3MgbmVlZGVkLCB3aXRoIGNvbmZpZ3VyYWJsZSB0ZWFzZXJzLl9fXG5cbk1lY2hhbmljYWxseSwgaGlkZGVuIGRpc2Nsb3N1cmUgY29udGVudCBpcyBub3QgcmVuZGVyZWQgdG8gdGhlIERPTSB1bnRpbCBpdCBpcyBuZWVkZWQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByb2dyZXNzaXZlRGlzY2xvc3VyZSBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xuICAgIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgICAgIC8qKiBpZiBhIGZ1bmN0aW9uIGlzIHBhc3NlZCwgaXQgd2lsbCBub3QgYmUgY2FsbGVkIHVudGlsIHRoZSBkaXNjbG9zdXJlIGNvbnRlbnQgaXMgZHVlIHRvIGJlIHJlbmRlcmVkICovXG4gICAgICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMuYW55LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhbnkgdmFsaWQgSFRNTCB0YWcgbmFtZSBvciBhIFJlYWN0IGNvbXBvbmVudCBmYWN0b3J5LCBhbnl0aGluZyB0aGF0IGNhbiBiZSBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIGBSZWFjdC5jcmVhdGVFbGVtZW50YFxuICAgICAgICAgKi9cbiAgICAgICAgY29tcG9uZW50OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgICAgIFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICAgICAgICBQcm9wVHlwZXMuZnVuYyxcbiAgICAgICAgXSksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFsbG93cyB0aGUgZGlzY2xvc3VyZSB0byBiZSByZW5kZXJlZCBleHBhbmRlZCBieSBkZWZhdWx0XG4gICAgICAgICAqL1xuICAgICAgICBleHBhbmRlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGNhbGxlZCB3aGVuIHRoZSBjb250ZW50IGlzIHNob3duOyBub3QgY2FsbGVkIG9uIGluaXRpYWwgcmVuZGVyXG4gICAgICAgICAqL1xuICAgICAgICBvbkV4cGFuZDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGNhbGxlZCB3aGVuIHRoZSBjb250ZW50IGlzIGhpZGRlbjsgbm90IGNhbGxlZCBvbiBpbml0aWFsIHJlbmRlclxuICAgICAgICAgKi9cbiAgICAgICAgb25IaWRlOiBQcm9wVHlwZXMuZnVuYyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogY29udGVudCB0byBiZSBzaG93biBuZXh0IHRvIHRoZSBleHBhbnNpb24gdG9nZ2xlLCBlLmcuIFwiQWR2YW5jZWQgT3B0aW9uc1wiXG4gICAgICAgICAqL1xuICAgICAgICB0ZWFzZXI6IFByb3BUeXBlcy5ub2RlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBjb250ZW50IHRvIGJlIHNob3duIG5leHQgdG8gdGhlIGV4cGFuc2lvbiB0b2dnbGUgd2hlbiB0aGUgZGlzY2xvc3VyZSBpcyBpbiBcImV4cGFuZGVkXCIgc3RhdGUsIGUuZy4gXCJIaWRlIEFkdmFuY2VkIE9wdGlvbnNcIlxuICAgICAgICAgKi9cbiAgICAgICAgdGVhc2VyRXhwYW5kZWQ6IFByb3BUeXBlcy5ub2RlLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhbnkgW1JlYWN0LXN1cHBvcnRlZCBhdHRyaWJ1dGVdKGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdGFncy1hbmQtYXR0cmlidXRlcy5odG1sI2h0bWwtYXR0cmlidXRlcyk7IGFwcGxpZWQgdG8gdGhlIGAuYi1kaXNjbG9zdXJlLXRvZ2dsZWAgbm9kZVxuICAgICAgICAgKi9cbiAgICAgICAgdG9nZ2xlUHJvcHM6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgfVxuXG4gICAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgICAgY2hpbGRyZW46IG51bGwsXG4gICAgICAgIGNvbXBvbmVudDogJ2RpdicsXG4gICAgICAgIGV4cGFuZGVkOiBmYWxzZSxcbiAgICAgICAgb25FeHBhbmQ6IG5vb3AsXG4gICAgICAgIG9uSGlkZTogbm9vcCxcbiAgICAgICAgdGVhc2VyOiBudWxsLFxuICAgICAgICB0ZWFzZXJFeHBhbmRlZDogbnVsbCxcbiAgICAgICAgdG9nZ2xlUHJvcHM6IHt9LFxuICAgIH1cblxuICAgIHN0YXRpYyBpbnRlcm5hbEtleXMgPSBPYmplY3Qua2V5cyhQcm9ncmVzc2l2ZURpc2Nsb3N1cmUuZGVmYXVsdFByb3BzKVxuXG4gICAgc3RhdGUgPSB7XG4gICAgICAgIGV4cGFuZGVkOiB0aGlzLnByb3BzLmV4cGFuZGVkLFxuICAgIH1cblxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV3UHJvcHMpIHtcbiAgICAgICAgaWYgKG5ld1Byb3BzLmV4cGFuZGVkICE9PSB0aGlzLnByb3BzLmV4cGFuZGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtleHBhbmRlZDogbmV3UHJvcHMuZXhwYW5kZWR9LCB0aGlzLmRpc3BhdGNoQ2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzcGF0Y2hDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5wcm9wc1t0aGlzLnN0YXRlLmV4cGFuZGVkID8gJ29uRXhwYW5kJyA6ICdvbkhpZGUnXSgpO1xuICAgIH1cblxuICAgIGhhbmRsZUNsaWNrID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2V4cGFuZGVkOiAhdGhpcy5zdGF0ZS5leHBhbmRlZH0sIHRoaXMuZGlzcGF0Y2hDYWxsYmFjayk7XG5cbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpcy5wcm9wcy50b2dnbGVQcm9wcy5vbkNsaWNrKSkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy50b2dnbGVQcm9wcy5vbkNsaWNrKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZUtleURvd24gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2V4cGFuZGVkOiAhdGhpcy5zdGF0ZS5leHBhbmRlZH0sIHRoaXMuZGlzcGF0Y2hDYWxsYmFjayk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAoaXNGdW5jdGlvbih0aGlzLnByb3BzLnRvZ2dsZVByb3BzLm9uS2V5RG93bikpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMudG9nZ2xlUHJvcHMub25LZXlEb3duKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlckNvbnRlbnQoKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmV4cGFuZGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxkaXYgcmVmPSdjb250ZW50J1xuICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdiLWRpc2Nsb3N1cmUtY29udGVudCc+XG4gICAgICAgICAgICAgICAgICAgIHtpc0Z1bmN0aW9uKHRoaXMucHJvcHMuY2hpbGRyZW4pID8gdGhpcy5wcm9wcy5jaGlsZHJlbigpIDogdGhpcy5wcm9wcy5jaGlsZHJlbn1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8dGhpcy5wcm9wcy5jb21wb25lbnRcbiAgICAgICAgICAgICAgICB7Li4ub21pdCh0aGlzLnByb3BzLCBQcm9ncmVzc2l2ZURpc2Nsb3N1cmUuaW50ZXJuYWxLZXlzKX1cbiAgICAgICAgICAgICAgICByZWY9J3dyYXBwZXInXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjeCgnYi1kaXNjbG9zdXJlJywgdGhpcy5wcm9wcy5jbGFzc05hbWUsIHtcbiAgICAgICAgICAgICAgICAgICAnYi1kaXNjbG9zdXJlLWV4cGFuZGVkJzogdGhpcy5zdGF0ZS5leHBhbmRlZCxcbiAgICAgICAgICAgICAgICB9KX0+XG5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIHsuLi50aGlzLnByb3BzLnRvZ2dsZVByb3BzfVxuICAgICAgICAgICAgICAgICAgICByZWY9J3RvZ2dsZSdcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjeCgnYi1kaXNjbG9zdXJlLXRvZ2dsZScsIHRoaXMucHJvcHMudG9nZ2xlUHJvcHMuY2xhc3NOYW1lKX1cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5oYW5kbGVDbGlja31cbiAgICAgICAgICAgICAgICAgICAgb25LZXlEb3duPXt0aGlzLmhhbmRsZUtleURvd259XG4gICAgICAgICAgICAgICAgICAgIHRhYkluZGV4PScwJz5cbiAgICAgICAgICAgICAgICAgICAge3RoaXMuc3RhdGUuZXhwYW5kZWQgPyB0aGlzLnByb3BzLnRlYXNlckV4cGFuZGVkIHx8IHRoaXMucHJvcHMudGVhc2VyIDogdGhpcy5wcm9wcy50ZWFzZXJ9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICB7dGhpcy5yZW5kZXJDb250ZW50KCl9XG4gICAgICAgICAgICA8L3RoaXMucHJvcHMuY29tcG9uZW50PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL2JvdW5kbGVzcy1wcm9ncmVzc2l2ZS1kaXNjbG9zdXJlL2luZGV4LmpzIl0sInNvdXJjZVJvb3QiOiIifQ== | ||
module.exports=function(e){function t(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,o){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:o})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=3)}([function(e,t){e.exports=require("boundless-utils-omit-keys")},function(e,t){e.exports=require("classnames")},function(e,t){e.exports=require("react")},function(e,t,n){"use strict";function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function p(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=n(2),a=n.n(s),i=n(1),l=n.n(i),c=n(0),u=n.n(c),d=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},f=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,n,o){return n&&e(t.prototype,n),o&&e(t,o),t}}(),y=function(e){return"function"==typeof e},g=function(){},h=function(e){function t(){var e,n,p,s;o(this,t);for(var a=arguments.length,i=Array(a),l=0;l<a;l++)i[l]=arguments[l];return n=p=r(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(i))),p.state={expanded:p.props.expanded},p.fireStatefulCallback=function(){return p.props[p.state.expanded?"onExpand":"onHide"]()},p.handleClick=function(e){p.setState({expanded:!p.state.expanded},p.fireStatefulCallback),y(p.props.toggleProps.onClick)&&p.props.toggleProps.onClick(e)},p.handleKeyDown=function(e){"Enter"===e.key&&(e.preventDefault(),p.setState({expanded:!p.state.expanded},p.fireStatefulCallback)),y(p.props.toggleProps.onKeyDown)&&p.props.toggleProps.onKeyDown(e)},s=n,r(p,s)}return p(t,e),f(t,[{key:"componentWillReceiveProps",value:function(e){e.expanded!==this.props.expanded&&this.setState({expanded:e.expanded},this.fireStatefulCallback)}},{key:"renderContent",value:function(){if(this.state.expanded)return a.a.createElement("div",{className:"b-disclosure-content"},y(this.props.children)?this.props.children():this.props.children)}},{key:"render",value:function(){return a.a.createElement(this.props.component,d({},u()(this.props,t.internalKeys),{className:l()("b-disclosure",this.props.className,{"b-disclosure-expanded":this.state.expanded})}),a.a.createElement(this.props.toggleComponent,d({},this.props.toggleProps,{className:l()("b-disclosure-toggle",this.props.toggleProps.className),onClick:this.handleClick,onKeyDown:this.handleKeyDown,tabIndex:"0"}),this.state.expanded?this.props.toggleExpandedContent||this.props.toggleContent:this.props.toggleContent),this.renderContent())}}]),t}(a.a.PureComponent);h.propTypes={"*":s.PropTypes.any,children:s.PropTypes.oneOfType([s.PropTypes.node,s.PropTypes.arrayOf(s.PropTypes.node),s.PropTypes.func]),component:s.PropTypes.string,expanded:s.PropTypes.bool,onExpand:s.PropTypes.func,onHide:s.PropTypes.func,toggleComponent:s.PropTypes.string,toggleContent:s.PropTypes.node,toggleExpandedContent:s.PropTypes.node,toggleProps:s.PropTypes.shape({"*":s.PropTypes.any})},h.defaultProps={children:null,component:"div",expanded:!1,onExpand:g,onHide:g,toggleComponent:"div",toggleContent:null,toggleExpandedContent:null,toggleProps:{}},h.internalKeys=Object.keys(h.defaultProps),t.default=h}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIGUyMDM4Mjk1YjEwMjBiZWUxODU5Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiY2xhc3NuYW1lc1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdFwifSIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9ib3VuZGxlc3MtcHJvZ3Jlc3NpdmUtZGlzY2xvc3VyZS9pbmRleC5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwibW9kdWxlcyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImluc3RhbGxlZE1vZHVsZXMiLCJpIiwibCIsImNhbGwiLCJtIiwiYyIsInZhbHVlIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwiZ2V0IiwibiIsIl9fZXNNb2R1bGUiLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJyZXF1aXJlIiwiX193ZWJwYWNrX2V4cG9ydHNfXyIsIl9jbGFzc0NhbGxDaGVjayIsImluc3RhbmNlIiwiQ29uc3RydWN0b3IiLCJUeXBlRXJyb3IiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiIsInNlbGYiLCJSZWZlcmVuY2VFcnJvciIsIl9pbmhlcml0cyIsInN1YkNsYXNzIiwic3VwZXJDbGFzcyIsImNyZWF0ZSIsImNvbnN0cnVjdG9yIiwid3JpdGFibGUiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfX19kZWZhdWx0IiwiX2V4dGVuZHMiLCJhc3NpZ24iLCJ0YXJnZXQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJzb3VyY2UiLCJrZXkiLCJfY3JlYXRlQ2xhc3MiLCJkZWZpbmVQcm9wZXJ0aWVzIiwicHJvcHMiLCJkZXNjcmlwdG9yIiwicHJvdG9Qcm9wcyIsInN0YXRpY1Byb3BzIiwiaXNGdW5jdGlvbiIsIngiLCJub29wIiwiUHJvZ3Jlc3NpdmVEaXNjbG9zdXJlIiwiX1JlYWN0JFB1cmVDb21wb25lbnQiLCJfcmVmIiwiX3RlbXAiLCJfdGhpcyIsIl9yZXQiLCJ0aGlzIiwiX2xlbiIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJnZXRQcm90b3R5cGVPZiIsImFwcGx5IiwiY29uY2F0Iiwic3RhdGUiLCJleHBhbmRlZCIsImZpcmVTdGF0ZWZ1bENhbGxiYWNrIiwiaGFuZGxlQ2xpY2siLCJldmVudCIsInNldFN0YXRlIiwidG9nZ2xlUHJvcHMiLCJvbkNsaWNrIiwiaGFuZGxlS2V5RG93biIsInByZXZlbnREZWZhdWx0Iiwib25LZXlEb3duIiwibmV3UHJvcHMiLCJhIiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsImNoaWxkcmVuIiwiY29tcG9uZW50IiwiaW50ZXJuYWxLZXlzIiwiYi1kaXNjbG9zdXJlLWV4cGFuZGVkIiwidG9nZ2xlQ29tcG9uZW50IiwidGFiSW5kZXgiLCJ0b2dnbGVFeHBhbmRlZENvbnRlbnQiLCJ0b2dnbGVDb250ZW50IiwicmVuZGVyQ29udGVudCIsIlB1cmVDb21wb25lbnQiLCJwcm9wVHlwZXMiLCIqIiwiYW55Iiwib25lT2ZUeXBlIiwibm9kZSIsImFycmF5T2YiLCJmdW5jIiwic3RyaW5nIiwiYm9vbCIsIm9uRXhwYW5kIiwib25IaWRlIiwic2hhcGUiLCJkZWZhdWx0UHJvcHMiLCJrZXlzIl0sIm1hcHBpbmdzIjoiQUFBQUEsT0FBT0MsUUFDRSxTQUFVQyxHQ0duQixRQUFBQyxHQUFBQyxHQUdBLEdBQUFDLEVBQUFELEdBQ0EsTUFBQUMsR0FBQUQsR0FBQUgsT0FHQSxJQUFBRCxHQUFBSyxFQUFBRCxJQUNBRSxFQUFBRixFQUNBRyxHQUFBLEVBQ0FOLFdBVUEsT0FOQUMsR0FBQUUsR0FBQUksS0FBQVIsRUFBQUMsUUFBQUQsSUFBQUMsUUFBQUUsR0FHQUgsRUFBQU8sR0FBQSxFQUdBUCxFQUFBQyxRQXZCQSxHQUFBSSxLQStEQSxPQW5DQUYsR0FBQU0sRUFBQVAsRUFHQUMsRUFBQU8sRUFBQUwsRUFHQUYsRUFBQUcsRUFBQSxTQUFBSyxHQUEyQyxNQUFBQSxJQUczQ1IsRUFBQVMsRUFBQSxTQUFBWCxFQUFBWSxFQUFBQyxHQUNBWCxFQUFBWSxFQUFBZCxFQUFBWSxJQUNBRyxPQUFBQyxlQUFBaEIsRUFBQVksR0FDQUssY0FBQSxFQUNBQyxZQUFBLEVBQ0FDLElBQUFOLEtBTUFYLEVBQUFrQixFQUFBLFNBQUFyQixHQUNBLEdBQUFjLEdBQUFkLEtBQUFzQixXQUNBLFdBQTJCLE1BQUF0QixHQUFBLFNBQzNCLFdBQWlDLE1BQUFBLEdBRWpDLE9BREFHLEdBQUFTLEVBQUFFLEVBQUEsSUFBQUEsR0FDQUEsR0FJQVgsRUFBQVksRUFBQSxTQUFBUSxFQUFBQyxHQUFzRCxNQUFBUixRQUFBUyxVQUFBQyxlQUFBbEIsS0FBQWUsRUFBQUMsSUFHdERyQixFQUFBd0IsRUFBQSxHQUdBeEIsSUFBQXlCLEVBQUEsS0RPTSxTQUFVNUIsRUFBUUMsR0V2RXhCRCxFQUFBQyxRQUFBNEIsUUFBQSw4QkY2RU0sU0FBVTdCLEVBQVFDLEdHN0V4QkQsRUFB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RFAsUUFBU2YsS0FBS1csWUFDZE8sVUFBV2xCLEtBQUtnQixjQUNoQlksU0FBUyxNQUNSNUIsS0FBS1EsTUFBTUMsU0FBV1QsS0FBS2IsTUFBTTBDLHVCQUF5QjdCLEtBQUtiLE1BQU0yQyxjQUFnQjlCLEtBQUtiLE1BQU0yQyxlQUdwRzlCLEtBQUsrQixxQkw3QzJoSXJDLEdLdEY5L0hyQixFQUFBK0MsRUFBTVksY0FBcEN0QyxHQUNWdUMsV0FJSEMsSUFBSzlELEVBQUEsVUFBVStELElBR2ZaLFNBQVVuRCxFQUFBLFVBQVVnRSxXQUNoQmhFLEVBQUEsVUFBVWlFLEtBQ1ZqRSxFQUFBLFVBQVVrRSxRQUFRbEUsRUFBQSxVQUFVaUUsTUFDNUJqRSxFQUFBLFVBQVVtRSxPQU1kZixVQUFXcEQsRUFBQSxVQUFVb0UsT0FLckIvQixTQUFVckMsRUFBQSxVQUFVcUUsS0FLcEJDLFNBQVV0RSxFQUFBLFVBQVVtRSxLQUtwQkksT0FBUXZFLEVBQUEsVUFBVW1FLEtBS2xCWixnQkFBaUJ2RCxFQUFBLFVBQVVvRSxPQUszQlYsY0FBZTFELEVBQUEsVUFBVWlFLEtBS3pCUixzQkFBdUJ6RCxFQUFBLFVBQVVpRSxLQUVqQ3ZCLFlBQWExQyxFQUFBLFVBQVV3RSxPQUluQlYsSUFBSzlELEVBQUEsVUFBVStELE9BckROekMsRUF5RFZtRCxjQUNIdEIsU0FBVSxLQUNWQyxVQUFXLE1BQ1hmLFVBQVUsRUFDVmlDLFNBQVVqRCxFQUNWa0QsT0FBUWxELEVBQ1JrQyxnQkFBaUIsTUFDakJHLGNBQWUsS0FDZkQsc0JBQXVCLEtBQ3ZCZixnQkFsRWFwQixFQXFFVitCLGFBQWVuRixPQUFPd0csS0FBS3BELEVBQXNCbUQsY0xpQjIwS3pGLEVBQTZCLFFLdEYvNEtzQyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbi8qKioqKiovIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbi8qKioqKiovIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAzKTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXV0aWxzLW9taXQta2V5c1wiKTtcblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNsYXNzbmFtZXNcIik7XG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxuLyoqKi8gfSksXG4vKiAzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KF9fd2VicGFja19leHBvcnRzX18sIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18pO1xudmFyIF9leHRlbmRzPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHRhcmdldCl7Zm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIHNvdXJjZT1hcmd1bWVudHNbaV07Zm9yKHZhciBrZXkgaW4gc291cmNlKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLGtleSkpe3RhcmdldFtrZXldPXNvdXJjZVtrZXldO319fXJldHVybiB0YXJnZXQ7fTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQscHJvcHMpe2Zvcih2YXIgaT0wO2k8cHJvcHMubGVuZ3RoO2krKyl7dmFyIGRlc2NyaXB0b3I9cHJvcHNbaV07ZGVzY3JpcHRvci5lbnVtZXJhYmxlPWRlc2NyaXB0b3IuZW51bWVyYWJsZXx8ZmFsc2U7ZGVzY3JpcHRvci5jb25maWd1cmFibGU9dHJ1ZTtpZihcInZhbHVlXCJpbiBkZXNjcmlwdG9yKWRlc2NyaXB0b3Iud3JpdGFibGU9dHJ1ZTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LGRlc2NyaXB0b3Iua2V5LGRlc2NyaXB0b3IpO319cmV0dXJuIGZ1bmN0aW9uKENvbnN0cnVjdG9yLHByb3RvUHJvcHMsc3RhdGljUHJvcHMpe2lmKHByb3RvUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUscHJvdG9Qcm9wcyk7aWYoc3RhdGljUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3RvcixzdGF0aWNQcm9wcyk7cmV0dXJuIENvbnN0cnVjdG9yO307fSgpO2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSxDb25zdHJ1Y3Rvcil7aWYoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTt9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsY2FsbCl7aWYoIXNlbGYpe3Rocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTt9cmV0dXJuIGNhbGwmJih0eXBlb2YgY2FsbD09PVwib2JqZWN0XCJ8fHR5cGVvZiBjYWxsPT09XCJmdW5jdGlvblwiKT9jYWxsOnNlbGY7fWZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcyxzdXBlckNsYXNzKXtpZih0eXBlb2Ygc3VwZXJDbGFzcyE9PVwiZnVuY3Rpb25cIiYmc3VwZXJDbGFzcyE9PW51bGwpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiK3R5cGVvZiBzdXBlckNsYXNzKTt9c3ViQ2xhc3MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyYmc3VwZXJDbGFzcy5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpzdWJDbGFzcyxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9fSk7aWYoc3VwZXJDbGFzcylPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLHN1cGVyQ2xhc3MpOnN1YkNsYXNzLl9fcHJvdG9fXz1zdXBlckNsYXNzO312YXIgaXNGdW5jdGlvbj1mdW5jdGlvbiBpc0Z1bmN0aW9uKHgpe3JldHVybiB0eXBlb2YgeD09PSdmdW5jdGlvbic7fTt2YXIgbm9vcD1mdW5jdGlvbiBub29wKCl7fTt2YXIgUHJvZ3Jlc3NpdmVEaXNjbG9zdXJlPWZ1bmN0aW9uKF9SZWFjdCRQdXJlQ29tcG9uZW50KXtfaW5oZXJpdHMoUHJvZ3Jlc3NpdmVEaXNjbG9zdXJlLF9SZWFjdCRQdXJlQ29tcG9uZW50KTtmdW5jdGlvbiBQcm9ncmVzc2l2ZURpc2Nsb3N1cmUoKXt2YXIgX3JlZjt2YXIgX3RlbXAsX3RoaXMsX3JldDtfY2xhc3NDYWxsQ2hlY2sodGhpcyxQcm9ncmVzc2l2ZURpc2Nsb3N1cmUpO2Zvcih2YXIgX2xlbj1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkoX2xlbiksX2tleT0wO19rZXk8X2xlbjtfa2V5Kyspe2FyZ3NbX2tleV09YXJndW1lbnRzW19rZXldO31yZXR1cm4gX3JldD0oX3RlbXA9KF90aGlzPV9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKF9yZWY9UHJvZ3Jlc3NpdmVEaXNjbG9zdXJlLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKFByb2dyZXNzaXZlRGlzY2xvc3VyZSkpLmNhbGwuYXBwbHkoX3JlZixbdGhpc10uY29uY2F0KGFyZ3MpKSksX3RoaXMpLF90aGlzLnN0YXRlPXtleHBhbmRlZDpfdGhpcy5wcm9wcy5leHBhbmRlZH0sX3RoaXMuZmlyZVN0YXRlZnVsQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gX3RoaXMucHJvcHNbX3RoaXMuc3RhdGUuZXhwYW5kZWQ/J29uRXhwYW5kJzonb25IaWRlJ10oKTt9LF90aGlzLmhhbmRsZUNsaWNrPWZ1bmN0aW9uKGV2ZW50KXtfdGhpcy5zZXRTdGF0ZSh7ZXhwYW5kZWQ6IV90aGlzLnN0YXRlLmV4cGFuZGVkfSxfdGhpcy5maXJlU3RhdGVmdWxDYWxsYmFjayk7aWYoaXNGdW5jdGlvbihfdGhpcy5wcm9wcy50b2dnbGVQcm9wcy5vbkNsaWNrKSl7X3RoaXMucHJvcHMudG9nZ2xlUHJvcHMub25DbGljayhldmVudCk7fX0sX3RoaXMuaGFuZGxlS2V5RG93bj1mdW5jdGlvbihldmVudCl7aWYoZXZlbnQua2V5PT09J0VudGVyJyl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtfdGhpcy5zZXRTdGF0ZSh7ZXhwYW5kZWQ6IV90aGlzLnN0YXRlLmV4cGFuZGVkfSxfdGhpcy5maXJlU3RhdGVmdWxDYWxsYmFjayk7fWlmKGlzRnVuY3Rpb24oX3RoaXMucHJvcHMudG9nZ2xlUHJvcHMub25LZXlEb3duKSl7X3RoaXMucHJvcHMudG9nZ2xlUHJvcHMub25LZXlEb3duKGV2ZW50KTt9fSxfdGVtcCksX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsX3JldCk7fV9jcmVhdGVDbGFzcyhQcm9ncmVzc2l2ZURpc2Nsb3N1cmUsW3trZXk6J2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMnLHZhbHVlOmZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV3UHJvcHMpe2lmKG5ld1Byb3BzLmV4cGFuZGVkIT09dGhpcy5wcm9wcy5leHBhbmRlZCl7dGhpcy5zZXRTdGF0ZSh7ZXhwYW5kZWQ6bmV3UHJvcHMuZXhwYW5kZWR9LHRoaXMuZmlyZVN0YXRlZnVsQ2FsbGJhY2spO319fSx7a2V5OidyZW5kZXJDb250ZW50Jyx2YWx1ZTpmdW5jdGlvbiByZW5kZXJDb250ZW50KCl7aWYodGhpcy5zdGF0ZS5leHBhbmRlZCl7cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KCdkaXYnLHtjbGFzc05hbWU6J2ItZGlzY2xvc3VyZS1jb250ZW50J30saXNGdW5jdGlvbih0aGlzLnByb3BzLmNoaWxkcmVuKT90aGlzLnByb3BzLmNoaWxkcmVuKCk6dGhpcy5wcm9wcy5jaGlsZHJlbik7fX19LHtrZXk6J3JlbmRlcicsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyKCl7cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KHRoaXMucHJvcHMuY29tcG9uZW50LF9leHRlbmRzKHt9LF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCgpKHRoaXMucHJvcHMsUHJvZ3Jlc3NpdmVEaXNjbG9zdXJlLmludGVybmFsS2V5cykse2NsYXNzTmFtZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQoKSgnYi1kaXNjbG9zdXJlJyx0aGlzLnByb3BzLmNsYXNzTmFtZSx7J2ItZGlzY2xvc3VyZS1leHBhbmRlZCc6dGhpcy5zdGF0ZS5leHBhbmRlZH0pfSksX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQodGhpcy5wcm9wcy50b2dnbGVDb21wb25lbnQsX2V4dGVuZHMoe30sdGhpcy5wcm9wcy50b2dnbGVQcm9wcyx7Y2xhc3NOYW1lOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCgpKCdiLWRpc2Nsb3N1cmUtdG9nZ2xlJyx0aGlzLnByb3BzLnRvZ2dsZVByb3BzLmNsYXNzTmFtZSksb25DbGljazp0aGlzLmhhbmRsZUNsaWNrLG9uS2V5RG93bjp0aGlzLmhhbmRsZUtleURvd24sdGFiSW5kZXg6JzAnfSksdGhpcy5zdGF0ZS5leHBhbmRlZD90aGlzLnByb3BzLnRvZ2dsZUV4cGFuZGVkQ29udGVudHx8dGhpcy5wcm9wcy50b2dnbGVDb250ZW50OnRoaXMucHJvcHMudG9nZ2xlQ29udGVudCksdGhpcy5yZW5kZXJDb250ZW50KCkpO319XSk7cmV0dXJuIFByb2dyZXNzaXZlRGlzY2xvc3VyZTt9KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5QdXJlQ29tcG9uZW50KTtQcm9ncmVzc2l2ZURpc2Nsb3N1cmUucHJvcFR5cGVzPXsnKic6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYW55LGNoaWxkcmVuOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm9uZU9mVHlwZShbX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ubm9kZSxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5hcnJheU9mKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm5vZGUpLF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmNdKSxjb21wb25lbnQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc3RyaW5nLGV4cGFuZGVkOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmJvb2wsb25FeHBhbmQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uZnVuYyxvbkhpZGU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uZnVuYyx0b2dnbGVDb21wb25lbnQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc3RyaW5nLHRvZ2dsZUNvbnRlbnQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ubm9kZSx0b2dnbGVFeHBhbmRlZENvbnRlbnQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ubm9kZSx0b2dnbGVQcm9wczpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5zaGFwZSh7JyonOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmFueX0pfTtQcm9ncmVzc2l2ZURpc2Nsb3N1cmUuZGVmYXVsdFByb3BzPXtjaGlsZHJlbjpudWxsLGNvbXBvbmVudDonZGl2JyxleHBhbmRlZDpmYWxzZSxvbkV4cGFuZDpub29wLG9uSGlkZTpub29wLHRvZ2dsZUNvbXBvbmVudDonZGl2Jyx0b2dnbGVDb250ZW50Om51bGwsdG9nZ2xlRXhwYW5kZWRDb250ZW50Om51bGwsdG9nZ2xlUHJvcHM6e319O1Byb2dyZXNzaXZlRGlzY2xvc3VyZS5pbnRlcm5hbEtleXM9T2JqZWN0LmtleXMoUHJvZ3Jlc3NpdmVEaXNjbG9zdXJlLmRlZmF1bHRQcm9wcyk7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IFByb2dyZXNzaXZlRGlzY2xvc3VyZTtcblxuLyoqKi8gfSlcbi8qKioqKiovIF0pO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBpbmRleC5qcyIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDMpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIGUyMDM4Mjk1YjEwMjBiZWUxODU5IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXV0aWxzLW9taXQta2V5c1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIn1cbi8vIG1vZHVsZSBpZCA9IDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2xhc3NuYW1lc1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImNsYXNzbmFtZXNcIn1cbi8vIG1vZHVsZSBpZCA9IDFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdFwifVxuLy8gbW9kdWxlIGlkID0gMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgUmVhY3QsIHtQcm9wVHlwZXN9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjeCBmcm9tICdjbGFzc25hbWVzJztcblxuaW1wb3J0IG9taXQgZnJvbSAnYm91bmRsZXNzLXV0aWxzLW9taXQta2V5cyc7XG5cbmNvbnN0IGlzRnVuY3Rpb24gPSAoeCkgPT4gdHlwZW9mIHggPT09ICdmdW5jdGlvbic7XG5jb25zdCBub29wID0gKCkgPT4ge307XG5cbi8qKlxuX19IaWRlIGNvbnRlbnQgdW50aWwgaXQncyBuZWVkZWQsIHdpdGggY29uZmlndXJhYmxlIHRlYXNlcnMuX19cblxuTWVjaGFuaWNhbGx5LCBoaWRkZW4gZGlzY2xvc3VyZSBjb250ZW50IGlzIG5vdCByZW5kZXJlZCB0byB0aGUgRE9NIHVudGlsIGl0IGlzIG5lZWRlZC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJvZ3Jlc3NpdmVEaXNjbG9zdXJlIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFueSBbUmVhY3Qtc3VwcG9ydGVkIGF0dHJpYnV0ZV0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90YWdzLWFuZC1hdHRyaWJ1dGVzLmh0bWwjaHRtbC1hdHRyaWJ1dGVzKVxuICAgICAgICAgKi9cbiAgICAgICAgJyonOiBQcm9wVHlwZXMuYW55LFxuXG4gICAgICAgIC8qKiBpZiBhIGZ1bmN0aW9uIGlzIHBhc3NlZCwgaXQgd2lsbCBub3QgYmUgY2FsbGVkIHVudGlsIHRoZSBkaXNjbG9zdXJlIGNvbnRlbnQgaXMgZHVlIHRvIGJlIHJlbmRlcmVkICovXG4gICAgICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgICAgIFByb3BUeXBlcy5ub2RlLFxuICAgICAgICAgICAgUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm5vZGUpLFxuICAgICAgICAgICAgUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIF0pLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBhbnkgdmFsaWQgSFRNTCB0YWcgbmFtZVxuICAgICAgICAgKi9cbiAgICAgICAgY29tcG9uZW50OiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBjb250cm9scyB0aGUgUHJvZ3Jlc3NEaXNjbG9zdXJlIFwiZXhwYW5kZWRcIiBzdGF0ZSBkZWNsYXJhdGl2ZWx5XG4gICAgICAgICAqL1xuICAgICAgICBleHBhbmRlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGNhbGxlZCB3aGVuIHRoZSBjb250ZW50IGlzIHNob3duOyBub3QgY2FsbGVkIG9uIGluaXRpYWwgcmVuZGVyXG4gICAgICAgICAqL1xuICAgICAgICBvbkV4cGFuZDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGNhbGxlZCB3aGVuIHRoZSBjb250ZW50IGlzIGhpZGRlbjsgbm90IGNhbGxlZCBvbiBpbml0aWFsIHJlbmRlclxuICAgICAgICAgKi9cbiAgICAgICAgb25IaWRlOiBQcm9wVHlwZXMuZnVuYyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogYW55IHZhbGlkIEhUTUwgdGFnIG5hbWVcbiAgICAgICAgICovXG4gICAgICAgIHRvZ2dsZUNvbXBvbmVudDogUHJvcFR5cGVzLnN0cmluZyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogY29udGVudCB0byBiZSBzaG93biBuZXh0IHRvIHRoZSBleHBhbnNpb24gdG9nZ2xlIHdoZW4gdGhlIGRpc2Nsb3N1cmUgaXMgaW4gXCJjb250cmFjdGVkXCIgc3RhdGUsIGUuZy4gXCJTaG93IEFkdmFuY2VkIE9wdGlvbnNcIlxuICAgICAgICAgKi9cbiAgICAgICAgdG9nZ2xlQ29udGVudDogUHJvcFR5cGVzLm5vZGUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGNvbnRlbnQgdG8gYmUgc2hvd24gbmV4dCB0byB0aGUgZXhwYW5zaW9uIHRvZ2dsZSB3aGVuIHRoZSBkaXNjbG9zdXJlIGlzIGluIFwiZXhwYW5kZWRcIiBzdGF0ZSwgZS5nLiBcIkhpZGUgQWR2YW5jZWQgT3B0aW9uc1wiXG4gICAgICAgICAqL1xuICAgICAgICB0b2dnbGVFeHBhbmRlZENvbnRlbnQ6IFByb3BUeXBlcy5ub2RlLFxuXG4gICAgICAgIHRvZ2dsZVByb3BzOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBhbnkgW1JlYWN0LXN1cHBvcnRlZCBhdHRyaWJ1dGVdKGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdGFncy1hbmQtYXR0cmlidXRlcy5odG1sI2h0bWwtYXR0cmlidXRlcylcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgJyonOiBQcm9wVHlwZXMuYW55LFxuICAgICAgICB9KSxcbiAgICB9XG5cbiAgICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgICBjaGlsZHJlbjogbnVsbCxcbiAgICAgICAgY29tcG9uZW50OiAnZGl2JyxcbiAgICAgICAgZXhwYW5kZWQ6IGZhbHNlLFxuICAgICAgICBvbkV4cGFuZDogbm9vcCxcbiAgICAgICAgb25IaWRlOiBub29wLFxuICAgICAgICB0b2dnbGVDb21wb25lbnQ6ICdkaXYnLFxuICAgICAgICB0b2dnbGVDb250ZW50OiBudWxsLFxuICAgICAgICB0b2dnbGVFeHBhbmRlZENvbnRlbnQ6IG51bGwsXG4gICAgICAgIHRvZ2dsZVByb3BzOiB7fSxcbiAgICB9XG5cbiAgICBzdGF0aWMgaW50ZXJuYWxLZXlzID0gT2JqZWN0LmtleXMoUHJvZ3Jlc3NpdmVEaXNjbG9zdXJlLmRlZmF1bHRQcm9wcylcblxuICAgIHN0YXRlID0ge1xuICAgICAgICBleHBhbmRlZDogdGhpcy5wcm9wcy5leHBhbmRlZCxcbiAgICB9XG5cbiAgICBmaXJlU3RhdGVmdWxDYWxsYmFjayA9ICgpID0+IHRoaXMucHJvcHNbdGhpcy5zdGF0ZS5leHBhbmRlZCA/ICdvbkV4cGFuZCcgOiAnb25IaWRlJ10oKVxuXG4gICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXdQcm9wcykge1xuICAgICAgICBpZiAobmV3UHJvcHMuZXhwYW5kZWQgIT09IHRoaXMucHJvcHMuZXhwYW5kZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2V4cGFuZGVkOiBuZXdQcm9wcy5leHBhbmRlZH0sIHRoaXMuZmlyZVN0YXRlZnVsQ2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlQ2xpY2sgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7ZXhwYW5kZWQ6ICF0aGlzLnN0YXRlLmV4cGFuZGVkfSwgdGhpcy5maXJlU3RhdGVmdWxDYWxsYmFjayk7XG5cbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpcy5wcm9wcy50b2dnbGVQcm9wcy5vbkNsaWNrKSkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy50b2dnbGVQcm9wcy5vbkNsaWNrKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZUtleURvd24gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2V4cGFuZGVkOiAhdGhpcy5zdGF0ZS5leHBhbmRlZH0sIHRoaXMuZmlyZVN0YXRlZnVsQ2FsbGJhY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpcy5wcm9wcy50b2dnbGVQcm9wcy5vbktleURvd24pKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLnRvZ2dsZVByb3BzLm9uS2V5RG93bihldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXJDb250ZW50KCkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5leHBhbmRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nYi1kaXNjbG9zdXJlLWNvbnRlbnQnPlxuICAgICAgICAgICAgICAgICAgICB7aXNGdW5jdGlvbih0aGlzLnByb3BzLmNoaWxkcmVuKSA/IHRoaXMucHJvcHMuY2hpbGRyZW4oKSA6IHRoaXMucHJvcHMuY2hpbGRyZW59XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPHRoaXMucHJvcHMuY29tcG9uZW50XG4gICAgICAgICAgICAgICAgey4uLm9taXQodGhpcy5wcm9wcywgUHJvZ3Jlc3NpdmVEaXNjbG9zdXJlLmludGVybmFsS2V5cyl9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjeCgnYi1kaXNjbG9zdXJlJywgdGhpcy5wcm9wcy5jbGFzc05hbWUsIHtcbiAgICAgICAgICAgICAgICAgICAnYi1kaXNjbG9zdXJlLWV4cGFuZGVkJzogdGhpcy5zdGF0ZS5leHBhbmRlZCxcbiAgICAgICAgICAgICAgICB9KX0+XG5cbiAgICAgICAgICAgICAgICA8dGhpcy5wcm9wcy50b2dnbGVDb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgey4uLnRoaXMucHJvcHMudG9nZ2xlUHJvcHN9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y3goJ2ItZGlzY2xvc3VyZS10b2dnbGUnLCB0aGlzLnByb3BzLnRvZ2dsZVByb3BzLmNsYXNzTmFtZSl9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuaGFuZGxlQ2xpY2t9XG4gICAgICAgICAgICAgICAgICAgIG9uS2V5RG93bj17dGhpcy5oYW5kbGVLZXlEb3dufVxuICAgICAgICAgICAgICAgICAgICB0YWJJbmRleD0nMCc+XG4gICAgICAgICAgICAgICAgICAgIHt0aGlzLnN0YXRlLmV4cGFuZGVkID8gdGhpcy5wcm9wcy50b2dnbGVFeHBhbmRlZENvbnRlbnQgfHwgdGhpcy5wcm9wcy50b2dnbGVDb250ZW50IDogdGhpcy5wcm9wcy50b2dnbGVDb250ZW50fVxuICAgICAgICAgICAgICAgIDwvdGhpcy5wcm9wcy50b2dnbGVDb21wb25lbnQ+XG5cbiAgICAgICAgICAgICAgICB7dGhpcy5yZW5kZXJDb250ZW50KCl9XG4gICAgICAgICAgICA8L3RoaXMucHJvcHMuY29tcG9uZW50PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL2JvdW5kbGVzcy1wcm9ncmVzc2l2ZS1kaXNjbG9zdXJlL2luZGV4LmpzIl0sInNvdXJjZVJvb3QiOiIifQ== |
@@ -10,3 +10,2 @@ import React, {PropTypes} from 'react'; | ||
/** | ||
# ProgressiveDisclosure | ||
__Hide content until it's needed, with configurable teasers.__ | ||
@@ -18,10 +17,11 @@ | ||
static propTypes = { | ||
/** if a function is passed, it will not be called until the disclosure content is due to be rendered */ | ||
children: PropTypes.any, | ||
/** | ||
* any valid HTML tag name or a React component factory, anything that can be passed as the first argument to `React.createElement` | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
component: PropTypes.oneOfType([ | ||
PropTypes.string, | ||
'*': PropTypes.any, | ||
/** if a function is passed, it will not be called until the disclosure content is due to be rendered */ | ||
children: PropTypes.oneOfType([ | ||
PropTypes.node, | ||
PropTypes.arrayOf(PropTypes.node), | ||
PropTypes.func, | ||
@@ -31,4 +31,9 @@ ]), | ||
/** | ||
* allows the disclosure to be rendered expanded by default | ||
* any valid HTML tag name | ||
*/ | ||
component: PropTypes.string, | ||
/** | ||
* controls the ProgressDisclosure "expanded" state declaratively | ||
*/ | ||
expanded: PropTypes.bool, | ||
@@ -47,15 +52,22 @@ | ||
/** | ||
* content to be shown next to the expansion toggle, e.g. "Advanced Options" | ||
* any valid HTML tag name | ||
*/ | ||
teaser: PropTypes.node, | ||
toggleComponent: PropTypes.string, | ||
/** | ||
* content to be shown next to the expansion toggle when the disclosure is in "expanded" state, e.g. "Hide Advanced Options" | ||
* content to be shown next to the expansion toggle when the disclosure is in "contracted" state, e.g. "Show Advanced Options" | ||
*/ | ||
teaserExpanded: PropTypes.node, | ||
toggleContent: PropTypes.node, | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-disclosure-toggle` node | ||
* content to be shown next to the expansion toggle when the disclosure is in "expanded" state, e.g. "Hide Advanced Options" | ||
*/ | ||
toggleProps: PropTypes.object, | ||
toggleExpandedContent: PropTypes.node, | ||
toggleProps: PropTypes.shape({ | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
'*': PropTypes.any, | ||
}), | ||
} | ||
@@ -69,4 +81,5 @@ | ||
onHide: noop, | ||
teaser: null, | ||
teaserExpanded: null, | ||
toggleComponent: 'div', | ||
toggleContent: null, | ||
toggleExpandedContent: null, | ||
toggleProps: {}, | ||
@@ -81,14 +94,12 @@ } | ||
fireStatefulCallback = () => this.props[this.state.expanded ? 'onExpand' : 'onHide']() | ||
componentWillReceiveProps(newProps) { | ||
if (newProps.expanded !== this.props.expanded) { | ||
this.setState({expanded: newProps.expanded}, this.dispatchCallback); | ||
this.setState({expanded: newProps.expanded}, this.fireStatefulCallback); | ||
} | ||
} | ||
dispatchCallback = () => { | ||
this.props[this.state.expanded ? 'onExpand' : 'onHide'](); | ||
} | ||
handleClick = (event) => { | ||
this.setState({expanded: !this.state.expanded}, this.dispatchCallback); | ||
this.setState({expanded: !this.state.expanded}, this.fireStatefulCallback); | ||
@@ -102,6 +113,5 @@ /* istanbul ignore else */ | ||
handleKeyDown = (event) => { | ||
switch (event.key) { | ||
case 'Enter': | ||
if (event.key === 'Enter') { | ||
event.preventDefault(); | ||
this.setState({expanded: !this.state.expanded}, this.dispatchCallback); | ||
this.setState({expanded: !this.state.expanded}, this.fireStatefulCallback); | ||
} | ||
@@ -118,4 +128,3 @@ | ||
return ( | ||
<div ref='content' | ||
className='b-disclosure-content'> | ||
<div className='b-disclosure-content'> | ||
{isFunction(this.props.children) ? this.props.children() : this.props.children} | ||
@@ -131,3 +140,2 @@ </div> | ||
{...omit(this.props, ProgressiveDisclosure.internalKeys)} | ||
ref='wrapper' | ||
className={cx('b-disclosure', this.props.className, { | ||
@@ -137,5 +145,4 @@ 'b-disclosure-expanded': this.state.expanded, | ||
<div | ||
<this.props.toggleComponent | ||
{...this.props.toggleProps} | ||
ref='toggle' | ||
className={cx('b-disclosure-toggle', this.props.toggleProps.className)} | ||
@@ -145,4 +152,4 @@ onClick={this.handleClick} | ||
tabIndex='0'> | ||
{this.state.expanded ? this.props.teaserExpanded || this.props.teaser : this.props.teaser} | ||
</div> | ||
{this.state.expanded ? this.props.toggleExpandedContent || this.props.toggleContent : this.props.toggleContent} | ||
</this.props.toggleComponent> | ||
@@ -149,0 +156,0 @@ {this.renderContent()} |
{ | ||
"name": "boundless-progressive-disclosure", | ||
"version": "1.0.0-beta.5", | ||
"version": "1.0.0-beta.7", | ||
"description": "Hide content until it's needed, with configurable teasers.", | ||
@@ -28,3 +28,3 @@ "main": "build/index.js", | ||
"dependencies": { | ||
"boundless-utils-omit-keys": "^1.0.0-beta.5", | ||
"boundless-utils-omit-keys": "^1.0.0-beta.7", | ||
"classnames": "^2.1.5" | ||
@@ -31,0 +31,0 @@ }, |
@@ -0,4 +1,6 @@ | ||
<!--- | ||
THIS IS AN AUTOGENERATED FILE. EDIT INDEX.JS INSTEAD. | ||
--> | ||
# ProgressiveDisclosure | ||
# ProgressiveDisclosure | ||
__Hide content until it's needed, with configurable teasers.__ | ||
@@ -8,5 +10,25 @@ | ||
## Example Usage | ||
```jsx | ||
import React from 'react'; | ||
import ProgressiveDisclosure from '../index'; | ||
export default class ProgressiveDisclosureDemo extends React.PureComponent { | ||
render() { | ||
return ( | ||
<ProgressiveDisclosure | ||
toggleContent='Click me to learn the truth...' | ||
toggleExpandedContent='Click me to hide the truth once again...'> | ||
And now, all is revealed. | ||
</ProgressiveDisclosure> | ||
); | ||
} | ||
} | ||
``` | ||
## Props | ||
_Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/ProgressiveDisclosure#props)._ | ||
> Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/ProgressiveDisclosure#props). | ||
@@ -20,68 +42,78 @@ ### Required Props | ||
<table> | ||
<tr> | ||
<th>Name</th> | ||
<th>Type</th> | ||
<th>Default Value</th> | ||
<th>Description</th> | ||
</tr> | ||
- __`*`__ ・ any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
<tr> | ||
<td>children</td> | ||
<td><pre><code>any</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>if a function is passed, it will not be called until the disclosure content is due to be rendered</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any` | `n/a` | ||
<tr> | ||
<td>component</td> | ||
<td><pre><code>string or function</code></pre></td> | ||
<td><pre><code class="language-js">'div'</code></pre></td> | ||
<td>any valid HTML tag name or a React component factory, anything that can be passed as the first argument to `React.createElement`</td> | ||
</tr> | ||
- __`children`__ ・ if a function is passed, it will not be called until the disclosure content is due to be rendered | ||
<tr> | ||
<td>expanded</td> | ||
<td><pre><code>bool</code></pre></td> | ||
<td><pre><code class="language-js">false</code></pre></td> | ||
<td>allows the disclosure to be rendered expanded by default</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any renderable or arrayOf(any renderable) or function` | `null` | ||
<tr> | ||
<td>onExpand</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">() => {}</code></pre></td> | ||
<td>called when the content is shown; not called on initial render</td> | ||
</tr> | ||
- __`component`__ ・ any valid HTML tag name | ||
<tr> | ||
<td>onHide</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">() => {}</code></pre></td> | ||
<td>called when the content is hidden; not called on initial render</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`string` | `'div'` | ||
<tr> | ||
<td>teaser</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>content to be shown next to the expansion toggle, e.g. "Advanced Options"</td> | ||
</tr> | ||
- __`expanded`__ ・ controls the ProgressDisclosure "expanded" state declaratively | ||
<tr> | ||
<td>teaserExpanded</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>content to be shown next to the expansion toggle when the disclosure is in "expanded" state, e.g. "Hide Advanced Options"</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`bool` | `false` | ||
<tr> | ||
<td>toggleProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-disclosure-toggle` node</td> | ||
</tr> | ||
- __`onExpand`__ ・ called when the content is shown; not called on initial render | ||
</table> | ||
Expects | Default Value | ||
- | - | ||
`function` | `() => {}` | ||
- __`onHide`__ ・ called when the content is hidden; not called on initial render | ||
Expects | Default Value | ||
- | - | ||
`function` | `() => {}` | ||
- __`toggleComponent`__ ・ any valid HTML tag name | ||
Expects | Default Value | ||
- | - | ||
`string` | `'div'` | ||
- __`toggleContent`__ ・ content to be shown next to the expansion toggle when the disclosure is in "contracted" state, e.g. "Show Advanced Options" | ||
Expects | Default Value | ||
- | - | ||
`any renderable` | `null` | ||
- __`toggleExpandedContent`__ ・ content to be shown next to the expansion toggle when the disclosure is in "expanded" state, e.g. "Hide Advanced Options" | ||
Expects | Default Value | ||
- | - | ||
`any renderable` | `null` | ||
- __`toggleProps`__ | ||
Expects | Default Value | ||
- | - | ||
`object` | `{}` | ||
## Reference Styles | ||
### Stylus | ||
```stylus | ||
// Bring in Boundless's base Stylus variables | ||
@require "node_modules/boundless-progressive-disclosure/variables" | ||
// Redefine any variables as desired, e.g. | ||
color-accent = royalblue | ||
// Bring in the component styles; they will be autoconfigured based on the above | ||
@require "node_modules/boundless-progressive-disclosure/style" | ||
``` | ||
### CSS | ||
If desired, a precompiled plain CSS stylesheet is available for customization at `/build/style.css`, based on Boundless's [default variables](https://github.com/enigma-io/boundless/blob/master/variables.styl). | ||
@@ -1,2 +0,2 @@ | ||
module.exports=function(e){function t(n){if(r[n])return r[n].exports;var o=r[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var r={};return t.m=e,t.c=r,t.i=function(e){return e},t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=4)}([function(e,t,r){"use strict";function n(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Object.keys(e).reduce(function(r,n){return t.indexOf(n)===-1&&(r[n]=e[n]),r},{})}t.a=n},function(e,t,r){"use strict";function n(){return"b-"+([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,function(e){return(e^16*Math.random()>>e/4).toString(16)})}t.a=n},function(e,t){e.exports=require("classnames")},function(e,t){e.exports=require("react")},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=r(3),p=r.n(s),a=r(2),u=r.n(a),l=r(0),c=r(1),f=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},d=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),h=function(e){return"function"==typeof e},b=function(e){function t(){var e,i,s,p;n(this,t);for(var a=arguments.length,u=Array(a),l=0;l<a;l++)u[l]=arguments[l];return i=s=o(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(u))),s.uuid=r.i(c.a)(),s.handleChange=function(e){e.target.checked&&s.props.onSelected(e.target.value),h(s.props.inputProps.onChange)&&s.props.inputProps.onChange(e)},p=i,o(s,p)}return i(t,e),d(t,[{key:"renderInput",value:function(){return p.a.createElement("input",f({},this.props.inputProps,{ref:"input",type:"radio",id:this.props.id||this.props.inputProps.id||this.uuid,className:u()("b-radio",this.props.inputProps.className,{"b-radio-selected":this.props.selected}),name:this.props.name,value:this.props.value,checked:this.props.selected,"aria-checked":String(this.props.selected),onChange:this.handleChange}))}},{key:"renderLabel",value:function(){if(this.props.label)return p.a.createElement("label",f({},this.props.labelProps,{ref:"label",className:u()("b-radio-label",this.props.labelProps.className),htmlFor:this.props.id||this.props.inputProps.id||this.uuid}),this.props.label)}},{key:"render",value:function(){return p.a.createElement("div",f({},r.i(l.a)(this.props,t.internalKeys),{ref:"wrapper",className:u()("b-radio-wrapper",this.props.className)}),this.renderInput(),this.renderLabel())}}]),t}(p.a.PureComponent);b.propTypes={inputProps:s.PropTypes.object,label:s.PropTypes.node,labelProps:s.PropTypes.object,name:s.PropTypes.string.isRequired,onSelected:s.PropTypes.func,selected:s.PropTypes.bool,value:s.PropTypes.string.isRequired},b.defaultProps={inputProps:{},label:null,labelProps:{},name:"",onSelected:function(){},selected:!1,value:""},b.internalKeys=Object.keys(b.defaultProps),t.default=b}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIDA3YTRkZjlkY2QwYWUzZmRkZGY4Iiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vcGFja2FnZXMvYm91bmRsZXNzLXV0aWxzLXV1aWQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiY2xhc3NuYW1lc1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdFwifSIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9ib3VuZGxlc3MtcmFkaW8vaW5kZXguanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJ2YWx1ZSIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiX193ZWJwYWNrX2V4cG9ydHNfXyIsIm9taXRLZXlzRnJvbVNvdXJjZU9iamVjdCIsInNvdXJjZSIsIm9taXR0ZWRLZXlzIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwia2V5cyIsInJlZHVjZSIsImhhc2giLCJrZXkiLCJpbmRleE9mIiwidXVpZCIsInJlcGxhY2UiLCJhIiwiTWF0aCIsInJhbmRvbSIsInRvU3RyaW5nIiwicmVxdWlyZSIsIl9jbGFzc0NhbGxDaGVjayIsImluc3RhbmNlIiwiQ29uc3RydWN0b3IiLCJUeXBlRXJyb3IiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiIsInNlbGYiLCJSZWZlcmVuY2VFcnJvciIsIl9pbmhlcml0cyIsInN1YkNsYXNzIiwic3VwZXJDbGFzcyIsImNyZWF0ZSIsImNvbnN0cnVjdG9yIiwid3JpdGFibGUiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc191dWlkX18iLCJfZXh0ZW5kcyIsImFzc2lnbiIsInRhcmdldCIsIl9jcmVhdGVDbGFzcyIsImRlZmluZVByb3BlcnRpZXMiLCJwcm9wcyIsImRlc2NyaXB0b3IiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJpc0Z1bmN0aW9uIiwieCIsIlJhZGlvIiwiX1JlYWN0JFB1cmVDb21wb25lbnQiLCJfcmVmIiwiX3RlbXAiLCJfdGhpcyIsIl9yZXQiLCJ0aGlzIiwiX2xlbiIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJnZXRQcm90b3R5cGVPZiIsImFwcGx5IiwiY29uY2F0IiwiaGFuZGxlQ2hhbmdlIiwiZXZlbnQiLCJjaGVja2VkIiwib25TZWxlY3RlZCIsImlucHV0UHJvcHMiLCJvbkNoYW5nZSIsImNyZWF0ZUVsZW1lbnQiLCJyZWYiLCJ0eXBlIiwiaWQiLCJjbGFzc05hbWUiLCJiLXJhZGlvLXNlbGVjdGVkIiwic2VsZWN0ZWQiLCJhcmlhLWNoZWNrZWQiLCJTdHJpbmciLCJsYWJlbCIsImxhYmVsUHJvcHMiLCJodG1sRm9yIiwiaW50ZXJuYWxLZXlzIiwicmVuZGVySW5wdXQiLCJyZW5kZXJMYWJlbCIsIlB1cmVDb21wb25lbnQiLCJwcm9wVHlwZXMiLCJub2RlIiwic3RyaW5nIiwiaXNSZXF1aXJlZCIsImZ1bmMiLCJib29sIiwiZGVmYXVsdFByb3BzIl0sIm1hcHBpbmdzIjoiQUFBQUEsT0FBT0MsUUFDRSxTQUFVQyxHQ0duQixRQUFBQyxHQUFBQyxHQUdBLEdBQUFDLEVBQUFELEdBQ0EsTUFBQUMsR0FBQUQsR0FBQUgsT0FHQSxJQUFBRCxHQUFBSyxFQUFBRCxJQUNBRSxFQUFBRixFQUNBRyxHQUFBLEVBQ0FOLFdBVUEsT0FOQUMsR0FBQUUsR0FBQUksS0FBQVIsRUFBQUMsUUFBQUQsSUFBQUMsUUFBQUUsR0FHQUgsRUFBQU8sR0FBQSxFQUdBUCxFQUFBQyxRQXZCQSxHQUFBSSxLQStEQSxPQW5DQUYsR0FBQU0sRUFBQVAsRUFHQUMsRUFBQU8sRUFBQUwsRUFHQUYsRUFBQUcsRUFBQSxTQUFBSyxHQUEyQyxNQUFBQSxJQUczQ1IsRUFBQVMsRUFBQSxTQUFBWCxFQUFBWSxFQUFBQyxHQUNBWCxFQUFBWSxFQUFBZCxFQUFBWSxJQUNBRyxPQUFBQyxlQUFBaEIsRUFBQVksR0FDQUssY0FBQSxFQUNBQyxZQUFBLEVBQ0FDLElBQUFOLEtBTUFYLEVBQUFrQixFQUFBLFNBQUFyQixHQUNBLEdBQUFjLEdBQUFkLEtBQUFzQixXQUNBLFdBQTJCLE1BQUF0QixHQUFBLFNBQzNCLFdBQWlDLE1BQUFBLEdBRWpDLE9BREFHLEdBQUFTLEVBQUFFLEVBQUEsSUFBQUEsR0FDQUEsR0FJQVgsRUFBQVksRUFBQSxTQUFBUSxFQUFBQyxHQUFzRCxNQUFBUixRQUFBUyxVQUFBQyxlQUFBbEIsS0FBQWUsRUFBQUMsSUFHdERyQixFQUFBd0IsRUFBQSxHQUdBeEIsSUFBQXlCLEVBQUEsS0RPTSxTQUFVNUIsRUFBUTZCLEVBQXFCMUIsR0FFN0MsWUV0RWUsU0FBUzJCLEdBQXlCQyxHQUEwQixHQUFsQkMsR0FBa0JDLFVBQUFDLE9BQUEsR0FBQUMsU0FBQUYsVUFBQSxHQUFBQSxVQUFBLEtBQ3ZFLE9BQU9qQixRQUFPb0IsS0FBS0wsR0FBUU0sT0FBTyxTQUE4QkMsRUFBTUMsR0FLbEUsTUFKSVAsR0FBWVEsUUFBUUQsTUFBUyxJQUM3QkQsRUFBS0MsR0FBT1IsRUFBT1EsSUFHaEJELE9GaUVrQlQsRUFBdUIsRUFBSUMsR0FLdEQsU0FBVTlCLEVBQVE2QixFQUFxQjFCLEdBRTdDLFlHeEVlLFNBQVNzQyxLQUVwQixNQUFPLE9BQVMsTUFBSyxLQUFLLEtBQUssS0FBSyxNQUFPQyxRQUFRLFNBQVMsU0FBQUMsR0FBQSxPQUFJQSxFQUFnQixHQUFkQyxLQUFLQyxVQUFhRixFQUFFLEdBQUdHLFNBQVMsTUh1RXJFakIsRUFBdUIsRUFBSVksR0FLdEQsU0FBVXpDLEVBQVFDLEdJdkZ4QkQsRUFBQUMsUUFBQThDLFFBQUEsZUo2Rk0sU0FBVS9DLEVBQVFDLEdLN0Z4QkQsRUFBQUMsUUFBQThDLFFBQUEsVUxtR00sU0FBVS9DLEVBQVE2QixFQUFxQjFCLEdBRTdDLFlBUTh0QixTQUFTNkMsR0FBZ0JDLEVBQVNDLEdBQWEsS0FBS0QsWUFBb0JDLElBQWMsS0FBTSxJQUFJQyxXQUFVLHFDQUF1QyxRQUFTQyxHQUEyQkMsRUFBSzdDLEdBQU0sSUFBSTZDLEVBQU0sS0FBTSxJQUFJQyxnQkFBZSw0REFBOEQsUUFBTzlDLEdBQXFCLGdCQUFQQSxJQUErQixrQkFBUEEsR0FBd0I2QyxFQUFMN0MsRUFBVyxRQUFTK0MsR0FBVUMsRUFBU0MsR0FBWSxHQUF1QixrQkFBYkEsSUFBc0MsT0FBYkEsRUFBbUIsS0FBTSxJQUFJTixXQUFVLGlFQUFrRU0sR0FBYUQsR0FBUy9CLFVBQVVULE9BQU8wQyxPQUFPRCxHQUFZQSxFQUFXaEMsV0FBV2tDLGFBQWFoRCxNQUFNNkMsRUFBU3JDLFlBQVcsRUFBTXlDLFVBQVMsRUFBSzFDLGNBQWEsS0FBV3VDLElBQVd6QyxPQUFPNkMsZUFBZTdDLE9BQU82QyxlQUFlTCxFQUFTQyxHQUFZRCxFQUFTTSxVQUFVTCxHQVBoZ0R6QyxPQUFPQyxlQUFlWSxFQUFxQixjQUFnQmxCLE9BQU8sR0FDN0MsSUFBSW9ELEdBQXNDNUQsRUFBb0IsR0FDMUQ2RCxFQUE4QzdELEVBQW9Ca0IsRUFBRTBDLEdBQ3BFRSxFQUEyQzlELEVBQW9CLEdBQy9EK0QsRUFBbUQvRCxFQUFvQmtCLEVBQUU0QyxHQUN6RUUsRUFBMERoRSxFQUFvQixHQUM5RWlFLEVBQXFEakUsRUFBb0IsR0FDOUZrRSxFQUFTckQsT0FBT3NELFFBQVEsU0FBU0MsR0FBUSxJQUFJLEdBQUlqRSxHQUFFLEVBQUVBLEVBQUUyQixVQUFVQyxPQUFPNUIsSUFBSSxDQUFDLEdBQUl5QixHQUFPRSxVQUFVM0IsRUFBRyxLQUFJLEdBQUlpQyxLQUFPUixHQUFXZixPQUFPUyxVQUFVQyxlQUFlbEIsS0FBS3VCLEVBQU9RLEtBQU1nQyxFQUFPaEMsR0FBS1IsRUFBT1EsSUFBUSxNQUFPZ0MsSUFBYUMsRUFBYSxXQUFXLFFBQVNDLEdBQWlCRixFQUFPRyxHQUFPLElBQUksR0FBSXBFLEdBQUUsRUFBRUEsRUFBRW9FLEVBQU14QyxPQUFPNUIsSUFBSSxDQUFDLEdBQUlxRSxHQUFXRCxFQUFNcEUsRUFBR3FFLEdBQVd4RCxXQUFXd0QsRUFBV3hELGFBQVksRUFBTXdELEVBQVd6RCxjQUFhLEVBQVEsU0FBVXlELEtBQVdBLEVBQVdmLFVBQVMsR0FBSzVDLE9BQU9DLGVBQWVzRCxFQUFPSSxFQUFXcEMsSUFBSW9DLElBQWMsTUFBTyxVQUFTekIsRUFBWTBCLEVBQVdDLEdBQXVJLE1BQXZIRCxJQUFXSCxFQUFpQnZCLEVBQVl6QixVQUFVbUQsR0FBZUMsR0FBWUosRUFBaUJ2QixFQUFZMkIsR0FBb0IzQixNTXZHdHNCNEIsRUFBYSxTQUFDQyxHQUFELE1BQW9CLGtCQUFOQSxJQVFaQyxFTitGc2tELFNBQVNDLEdBQTRELFFBQVNELEtBQVEsR0FBSUUsR0FBU0MsRUFBTUMsRUFBTUMsQ0FBS3JDLEdBQWdCc0MsS0FBS04sRUFBTyxLQUFJLEdBQUlPLEdBQUt0RCxVQUFVQyxPQUFPc0QsRUFBS0MsTUFBTUYsR0FBTUcsRUFBSyxFQUFFQSxFQUFLSCxFQUFLRyxJQUFRRixFQUFLRSxHQUFNekQsVUFBVXlELEVBQU8sT0FBYVAsR0FBT0MsRUFBTWhDLEVBQTJCa0MsTUFBTUosRUFBS0YsRUFBTWxCLFdBQVc5QyxPQUFPMkUsZUFBZVgsSUFBUXhFLEtBQUtvRixNQUFNVixHQUFNSSxNQUFNTyxPQUFPTCxLQUFlSixFTTdDditEM0MsS0FBT3RDLEVBQUFHLEVBQUE4RCxFQUFBLEtONkMwa0VnQixFTTNDamxFVSxhQUFlLFNBQUNDLEdBQ1JBLEVBQU14QixPQUFPeUIsU0FDYlosRUFBS1YsTUFBTXVCLFdBQVdGLEVBQU14QixPQUFPNUQsT0FJbkNtRSxFQUFXTSxFQUFLVixNQUFNd0IsV0FBV0MsV0FDakNmLEVBQUtWLE1BQU13QixXQUFXQyxTQUFTSixJTm9DMnlEVixFQUFpY0YsRUFBTy9CLEVBQTJCZ0MsRUFBTUMsR0FBMjBDLE1BQWhoRTlCLEdBQVV5QixFQUFNQyxHQUE0ckJULEVBQWFRLElBQVF6QyxJQUFJLGNBQWM1QixNQUFNLFdNL0IzMkUsTUFDSXFELEdBQUFyQixFQUFBeUQsY0FBQSxRQUFBL0IsS0FDUWlCLEtBQUtaLE1BQU13QixZQUNmRyxJQUFJLFFBQ0pDLEtBQUssUUFDTEMsR0FBSWpCLEtBQUtaLE1BQU02QixJQUFNakIsS0FBS1osTUFBTXdCLFdBQVdLLElBQU1qQixLQUFLN0MsS0FDdEQrRCxVQUFXdEMsSUFBRyxVQUFXb0IsS0FBS1osTUFBTXdCLFdBQVdNLFdBQzNDQyxtQkFBb0JuQixLQUFLWixNQUFNZ0MsV0FFbkM3RixLQUFNeUUsS0FBS1osTUFBTTdELEtBQ2pCRixNQUFPMkUsS0FBS1osTUFBTS9ELE1BQ2xCcUYsUUFBU1YsS0FBS1osTUFBTWdDLFNBQ3BCQyxlQUFjQyxPQUFPdEIsS0FBS1osTUFBTWdDLFVBQ2hDUCxTQUFVYixLQUFLUSxtQk5rQjgwRnZELElBQUksY0FBYzVCLE1BQU0sV01iNzNGLEdBQUkyRSxLQUFLWixNQUFNbUMsTUFDWCxNQUNJN0MsR0FBQXJCLEVBQUF5RCxjQUFBLFFBQUEvQixLQUNRaUIsS0FBS1osTUFBTW9DLFlBQ2ZULElBQUksUUFDSkcsVUFBV3RDLElBQUcsZ0JBQWlCb0IsS0FBS1osTUFBTW9DLFdBQVdOLFdBQ3JETyxRQUFTekIsS0FBS1osTUFBTTZCLElBQU1qQixLQUFLWixNQUFNd0IsV0FBV0ssSUFBTWpCLEtBQUs3QyxPQUMxRDZDLEtBQUtaLE1BQU1tQyxVTk02c0d0RSxJQUFJLFNBQVM1QixNQUFNLFdNQ3h2RyxNQUNJcUQsR0FBQXJCLEVBQUF5RCxjQUFBLE1BQUEvQixLQUNRbEUsRUFBQUcsRUFBQTZELEVBQUEsR0FBS21CLEtBQUtaLE1BQU9NLEVBQU1nQyxlQUMzQlgsSUFBSSxVQUNKRyxVQUFXdEMsSUFBRyxrQkFBbUJvQixLQUFLWixNQUFNOEIsYUFDM0NsQixLQUFLMkIsY0FDTDNCLEtBQUs0QixtQk5QMm5IbEMsR00vRjltSGhCLEVBQUFyQixFQUFNd0UsY0FBcEJuQyxHQUNWb0MsV0FJSGxCLFdBQVluQyxFQUFBLFVBQVV4QyxPQUt0QnNGLE1BQU85QyxFQUFBLFVBQVVzRCxLQUtqQlAsV0FBWS9DLEVBQUEsVUFBVXhDLE9BS3RCVixLQUFNa0QsRUFBQSxVQUFVdUQsT0FBT0MsV0FLdkJ0QixXQUFZbEMsRUFBQSxVQUFVeUQsS0FLdEJkLFNBQVUzQyxFQUFBLFVBQVUwRCxLQUtwQjlHLE1BQU9vRCxFQUFBLFVBQVV1RCxPQUFPQyxZQW5DWHZDLEVBc0NWMEMsY0FDSHhCLGNBQ0FXLE1BQU8sS0FDUEMsY0FDQWpHLEtBQU0sR0FDTm9GLFdBQVksYUFDWlMsVUFBVSxFQUNWL0YsTUFBTyxJQTdDTXFFLEVBZ0RWZ0MsYUFBZWhHLE9BQU9vQixLQUFLNEMsRUFBTTBDLGNOK0M4MUk3RixFQUE2QixRTS9GbDVJbUQiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9XG4vKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRpOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGw6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4vKioqKioqLyBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4vKioqKioqLyBcdFx0XHRcdGdldDogZ2V0dGVyXG4vKioqKioqLyBcdFx0XHR9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gNCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyogaGFybW9ueSBleHBvcnQgKGltbXV0YWJsZSkgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImFcIl0gPSBvbWl0S2V5c0Zyb21Tb3VyY2VPYmplY3Q7XG5mdW5jdGlvbiBvbWl0S2V5c0Zyb21Tb3VyY2VPYmplY3Qoc291cmNlKXt2YXIgb21pdHRlZEtleXM9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOltdO3JldHVybiBPYmplY3Qua2V5cyhzb3VyY2UpLnJlZHVjZShmdW5jdGlvbiByZWxvY2F0ZUFjY2VwdGVkS2V5cyhoYXNoLGtleSl7aWYob21pdHRlZEtleXMuaW5kZXhPZihrZXkpPT09LTEpe2hhc2hba2V5XT1zb3VyY2Vba2V5XTt9cmV0dXJuIGhhc2g7fSx7fSk7fVxuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGV4cG9ydCAoaW1tdXRhYmxlKSAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IHV1aWQ7XG5mdW5jdGlvbiB1dWlkKCl7cmV0dXJuJ2ItJysoWzFlN10rLTFlMystNGUzKy04ZTMrLTFlMTEpLnJlcGxhY2UoL1swMThdL2csZnVuY3Rpb24oYSl7cmV0dXJuKGFeTWF0aC5yYW5kb20oKSoxNj4+YS80KS50b1N0cmluZygxNik7fSk7fVxuXG4vKioqLyB9KSxcbi8qIDIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2xhc3NuYW1lc1wiKTtcblxuLyoqKi8gfSksXG4vKiAzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG4vKioqLyB9KSxcbi8qIDQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX3V1aWRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG52YXIgX2V4dGVuZHM9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odGFyZ2V0KXtmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXt2YXIgc291cmNlPWFyZ3VtZW50c1tpXTtmb3IodmFyIGtleSBpbiBzb3VyY2Upe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2Usa2V5KSl7dGFyZ2V0W2tleV09c291cmNlW2tleV07fX19cmV0dXJuIHRhcmdldDt9O3ZhciBfY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCxwcm9wcyl7Zm9yKHZhciBpPTA7aTxwcm9wcy5sZW5ndGg7aSsrKXt2YXIgZGVzY3JpcHRvcj1wcm9wc1tpXTtkZXNjcmlwdG9yLmVudW1lcmFibGU9ZGVzY3JpcHRvci5lbnVtZXJhYmxlfHxmYWxzZTtkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZT10cnVlO2lmKFwidmFsdWVcImluIGRlc2NyaXB0b3IpZGVzY3JpcHRvci53cml0YWJsZT10cnVlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsZGVzY3JpcHRvci5rZXksZGVzY3JpcHRvcik7fX1yZXR1cm4gZnVuY3Rpb24oQ29uc3RydWN0b3IscHJvdG9Qcm9wcyxzdGF0aWNQcm9wcyl7aWYocHJvdG9Qcm9wcylkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSxwcm90b1Byb3BzKTtpZihzdGF0aWNQcm9wcylkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLHN0YXRpY1Byb3BzKTtyZXR1cm4gQ29uc3RydWN0b3I7fTt9KCk7ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLENvbnN0cnVjdG9yKXtpZighKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO319ZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZixjYWxsKXtpZighc2VsZil7dGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO31yZXR1cm4gY2FsbCYmKHR5cGVvZiBjYWxsPT09XCJvYmplY3RcInx8dHlwZW9mIGNhbGw9PT1cImZ1bmN0aW9uXCIpP2NhbGw6c2VsZjt9ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLHN1cGVyQ2xhc3Mpe2lmKHR5cGVvZiBzdXBlckNsYXNzIT09XCJmdW5jdGlvblwiJiZzdXBlckNsYXNzIT09bnVsbCl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIrdHlwZW9mIHN1cGVyQ2xhc3MpO31zdWJDbGFzcy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzJiZzdXBlckNsYXNzLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnN1YkNsYXNzLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX19KTtpZihzdXBlckNsYXNzKU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3Msc3VwZXJDbGFzcyk6c3ViQ2xhc3MuX19wcm90b19fPXN1cGVyQ2xhc3M7fXZhciBpc0Z1bmN0aW9uPWZ1bmN0aW9uIGlzRnVuY3Rpb24oeCl7cmV0dXJuIHR5cGVvZiB4PT09J2Z1bmN0aW9uJzt9O3ZhciBSYWRpbz1mdW5jdGlvbihfUmVhY3QkUHVyZUNvbXBvbmVudCl7X2luaGVyaXRzKFJhZGlvLF9SZWFjdCRQdXJlQ29tcG9uZW50KTtmdW5jdGlvbiBSYWRpbygpe3ZhciBfcmVmO3ZhciBfdGVtcCxfdGhpcyxfcmV0O19jbGFzc0NhbGxDaGVjayh0aGlzLFJhZGlvKTtmb3IodmFyIF9sZW49YXJndW1lbnRzLmxlbmd0aCxhcmdzPUFycmF5KF9sZW4pLF9rZXk9MDtfa2V5PF9sZW47X2tleSsrKXthcmdzW19rZXldPWFyZ3VtZW50c1tfa2V5XTt9cmV0dXJuIF9yZXQ9KF90ZW1wPShfdGhpcz1fcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLChfcmVmPVJhZGlvLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKFJhZGlvKSkuY2FsbC5hcHBseShfcmVmLFt0aGlzXS5jb25jYXQoYXJncykpKSxfdGhpcyksX3RoaXMudXVpZD1fX3dlYnBhY2tfcmVxdWlyZV9fLmkoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc191dWlkX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKCksX3RoaXMuaGFuZGxlQ2hhbmdlPWZ1bmN0aW9uKGV2ZW50KXtpZihldmVudC50YXJnZXQuY2hlY2tlZCl7X3RoaXMucHJvcHMub25TZWxlY3RlZChldmVudC50YXJnZXQudmFsdWUpO31pZihpc0Z1bmN0aW9uKF90aGlzLnByb3BzLmlucHV0UHJvcHMub25DaGFuZ2UpKXtfdGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uQ2hhbmdlKGV2ZW50KTt9fSxfdGVtcCksX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsX3JldCk7fV9jcmVhdGVDbGFzcyhSYWRpbyxbe2tleToncmVuZGVySW5wdXQnLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcklucHV0KCl7cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KCdpbnB1dCcsX2V4dGVuZHMoe30sdGhpcy5wcm9wcy5pbnB1dFByb3BzLHtyZWY6J2lucHV0Jyx0eXBlOidyYWRpbycsaWQ6dGhpcy5wcm9wcy5pZHx8dGhpcy5wcm9wcy5pbnB1dFByb3BzLmlkfHx0aGlzLnV1aWQsY2xhc3NOYW1lOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCgpKCdiLXJhZGlvJyx0aGlzLnByb3BzLmlucHV0UHJvcHMuY2xhc3NOYW1lLHsnYi1yYWRpby1zZWxlY3RlZCc6dGhpcy5wcm9wcy5zZWxlY3RlZH0pLG5hbWU6dGhpcy5wcm9wcy5uYW1lLHZhbHVlOnRoaXMucHJvcHMudmFsdWUsY2hlY2tlZDp0aGlzLnByb3BzLnNlbGVjdGVkLCdhcmlhLWNoZWNrZWQnOlN0cmluZyh0aGlzLnByb3BzLnNlbGVjdGVkKSxvbkNoYW5nZTp0aGlzLmhhbmRsZUNoYW5nZX0pKTt9fSx7a2V5OidyZW5kZXJMYWJlbCcsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyTGFiZWwoKXtpZih0aGlzLnByb3BzLmxhYmVsKXtyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyxfZXh0ZW5kcyh7fSx0aGlzLnByb3BzLmxhYmVsUHJvcHMse3JlZjonbGFiZWwnLGNsYXNzTmFtZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQoKSgnYi1yYWRpby1sYWJlbCcsdGhpcy5wcm9wcy5sYWJlbFByb3BzLmNsYXNzTmFtZSksaHRtbEZvcjp0aGlzLnByb3BzLmlkfHx0aGlzLnByb3BzLmlucHV0UHJvcHMuaWR8fHRoaXMudXVpZH0pLHRoaXMucHJvcHMubGFiZWwpO319fSx7a2V5OidyZW5kZXInLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudCgnZGl2JyxfZXh0ZW5kcyh7fSxfX3dlYnBhY2tfcmVxdWlyZV9fLmkoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkodGhpcy5wcm9wcyxSYWRpby5pbnRlcm5hbEtleXMpLHtyZWY6J3dyYXBwZXInLGNsYXNzTmFtZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQoKSgnYi1yYWRpby13cmFwcGVyJyx0aGlzLnByb3BzLmNsYXNzTmFtZSl9KSx0aGlzLnJlbmRlcklucHV0KCksdGhpcy5yZW5kZXJMYWJlbCgpKTt9fV0pO3JldHVybiBSYWRpbzt9KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5QdXJlQ29tcG9uZW50KTtSYWRpby5wcm9wVHlwZXM9e2lucHV0UHJvcHM6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0ub2JqZWN0LGxhYmVsOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm5vZGUsbGFiZWxQcm9wczpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5vYmplY3QsbmFtZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5zdHJpbmcuaXNSZXF1aXJlZCxvblNlbGVjdGVkOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmZ1bmMsc2VsZWN0ZWQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYm9vbCx2YWx1ZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5zdHJpbmcuaXNSZXF1aXJlZH07UmFkaW8uZGVmYXVsdFByb3BzPXtpbnB1dFByb3BzOnt9LGxhYmVsOm51bGwsbGFiZWxQcm9wczp7fSxuYW1lOicnLG9uU2VsZWN0ZWQ6ZnVuY3Rpb24gb25TZWxlY3RlZCgpe30sc2VsZWN0ZWQ6ZmFsc2UsdmFsdWU6Jyd9O1JhZGlvLmludGVybmFsS2V5cz1PYmplY3Qua2V5cyhSYWRpby5kZWZhdWx0UHJvcHMpOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSBSYWRpbztcblxuLyoqKi8gfSlcbi8qKioqKiovIF0pO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBpbmRleC5qcyIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDQpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIDA3YTRkZjlkY2QwYWUzZmRkZGY4IiwiLyoqXG4gKiBSZXR1cm5zIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgc3VwcGxpZWQgb2JqZWN0IHdpdGhvdXQgdGhlIGdpdmVuIGtleXMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG9taXRLZXlzRnJvbVNvdXJjZU9iamVjdChzb3VyY2UsIG9taXR0ZWRLZXlzID0gW10pIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc291cmNlKS5yZWR1Y2UoZnVuY3Rpb24gcmVsb2NhdGVBY2NlcHRlZEtleXMoaGFzaCwga2V5KSB7XG4gICAgICAgIGlmIChvbWl0dGVkS2V5cy5pbmRleE9mKGtleSkgPT09IC0xKSB7XG4gICAgICAgICAgICBoYXNoW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYXNoO1xuICAgIH0sIHt9KTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMvaW5kZXguanMiLCIvKipcbiAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBJRC4gQWRkcyBhIHByZWZpeCBzbyBpdCBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIGFuIEhUTUwgSUQuXG4gKiBCYXNlZCBvbiB7QGxpbmsgaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vamVkLzk4Mjg4MyB0aGlzIGltcGxlbWVudGF0aW9ufS5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IGEgdW5pcXVlIGlkZW50aWZpZXJcbiAqXG4gKiBAZXhhbXBsZVxuICogdXVpZCgpOyAvLyBiLTFmMmNkMjdmLTA3NTQtNDM0NC05ZDIwLTQzNmEyMDFiMmY4MFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1dWlkKCkge1xuICAgIC8qIGVzbGludC1kaXNhYmxlICovXG4gICAgcmV0dXJuICdiLScgKyAoWzFlN10rLTFlMystNGUzKy04ZTMrLTFlMTEpLnJlcGxhY2UoL1swMThdL2csYT0+KGFeTWF0aC5yYW5kb20oKSoxNj4+YS80KS50b1N0cmluZygxNikpO1xuICAgIC8qIGVzbGludC1lbmFibGUgKi9cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy11dWlkL2luZGV4LmpzIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2xhc3NuYW1lc1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImNsYXNzbmFtZXNcIn1cbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdFwifVxuLy8gbW9kdWxlIGlkID0gM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgUmVhY3QsIHtQcm9wVHlwZXN9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjeCBmcm9tICdjbGFzc25hbWVzJztcblxuaW1wb3J0IG9taXQgZnJvbSAnYm91bmRsZXNzLXV0aWxzLW9taXQta2V5cyc7XG5pbXBvcnQgdXVpZCBmcm9tICdib3VuZGxlc3MtdXRpbHMtdXVpZCc7XG5cbmNvbnN0IGlzRnVuY3Rpb24gPSAoeCkgPT4gdHlwZW9mIHggPT09ICdmdW5jdGlvbic7XG5cbi8qKlxuIyBSYWRpb1xuX19BbiBhY2Nlc3NpYmxlIHJhZGlvIGZvcm0gY29udHJvbC5fX1xuXG5SYWRpbyBpcyBpbXBsZW1lbnRlZCBhcyBhIFwiY29udHJvbGxlZCBpbnB1dFwiLCBtZWFuaW5nIGl0IGlzIGEgZGlyZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBkYXRhIHBhc3NlZCBpbnNpZGUuIFVzZXIgaW50ZXJhY3Rpb24gd2lsbCBidWJibGUgY2hhbmdlcyBpbiB0aGUgZm9ybSBvZiBgb25TZWxlY3RlZGAgdGhhdCBhIGNvbnRyb2xsZXIgdmlldyBtdXN0IGludGVyY2VwdCBhbmQgYXBwbHkgYWdhaW5zdCB0aGUgZGF0YSBwcm92aWRlci5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmFkaW8gZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgICAvKipcbiAgICAgICAgICogYW55IFtSZWFjdC1zdXBwb3J0ZWQgYXR0cmlidXRlXShodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RhZ3MtYW5kLWF0dHJpYnV0ZXMuaHRtbCNodG1sLWF0dHJpYnV0ZXMpOyBhcHBsaWVkIHRvIHRoZSBgLmItcmFkaW9gIG5vZGVcbiAgICAgICAgICovXG4gICAgICAgIGlucHV0UHJvcHM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFueSBSZWFjdC1yZW5kZXJhYmxlIGNvbnRlbnQsIG1vc3QgY29tbW9ubHkgYSBzaW1wbGUgc3RyaW5nXG4gICAgICAgICAqL1xuICAgICAgICBsYWJlbDogUHJvcFR5cGVzLm5vZGUsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFueSBbUmVhY3Qtc3VwcG9ydGVkIGF0dHJpYnV0ZV0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90YWdzLWFuZC1hdHRyaWJ1dGVzLmh0bWwjaHRtbC1hdHRyaWJ1dGVzKTsgYXBwbGllZCB0byB0aGUgYC5iLXJhZGlvLWxhYmVsYCBub2RlXG4gICAgICAgICAqL1xuICAgICAgICBsYWJlbFByb3BzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBwYXNzdGhyb3VnaCB0byB0aGUgSFRNTCBgbmFtZWAgYXR0cmlidXRlIG9uIHRoZSBgLmItcmFkaW9gIG5vZGVcbiAgICAgICAgICovXG4gICAgICAgIG5hbWU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogY2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQgYmVjb21lcyBzZWxlY3RlZDsgYmFja2luZyBkYXRhIG11c3QgYmUgdXBkYXRlZCB0byBwZXJzaXN0IHRoZSBzdGF0ZSBjaGFuZ2VcbiAgICAgICAgICovXG4gICAgICAgIG9uU2VsZWN0ZWQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBkZXRlcm1pbmVzIHRoZSBhY3RpdmF0aW9uIHN0YXRlIG9mIHRoZSByYWRpbyBjb250cm9sLCBzZWUgUmVhY3QgW1wiY29udHJvbGxlZCBpbnB1dHNcIl0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy9mb3Jtcy5odG1sI2NvbnRyb2xsZWQtY29tcG9uZW50cykpXG4gICAgICAgICAqL1xuICAgICAgICBzZWxlY3RlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHBhc3N0aHJvdWdoIHRvIHRoZSBIVE1MIGB2YWx1ZWAgYXR0cmlidXRlIG9uIHRoZSBgLmItcmFkaW9gIG5vZGVcbiAgICAgICAgICovXG4gICAgICAgIHZhbHVlOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgfVxuXG4gICAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgICAgaW5wdXRQcm9wczoge30sXG4gICAgICAgIGxhYmVsOiBudWxsLFxuICAgICAgICBsYWJlbFByb3BzOiB7fSxcbiAgICAgICAgbmFtZTogJycsXG4gICAgICAgIG9uU2VsZWN0ZWQ6ICgpID0+IHt9LFxuICAgICAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgICAgIHZhbHVlOiAnJyxcbiAgICB9XG5cbiAgICBzdGF0aWMgaW50ZXJuYWxLZXlzID0gT2JqZWN0LmtleXMoUmFkaW8uZGVmYXVsdFByb3BzKVxuXG4gICAgdXVpZCA9IHV1aWQoKVxuXG4gICAgaGFuZGxlQ2hhbmdlID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudC50YXJnZXQuY2hlY2tlZCkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5vblNlbGVjdGVkKGV2ZW50LnRhcmdldC52YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAoaXNGdW5jdGlvbih0aGlzLnByb3BzLmlucHV0UHJvcHMub25DaGFuZ2UpKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLmlucHV0UHJvcHMub25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVySW5wdXQoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICB7Li4udGhpcy5wcm9wcy5pbnB1dFByb3BzfVxuICAgICAgICAgICAgICAgIHJlZj0naW5wdXQnXG4gICAgICAgICAgICAgICAgdHlwZT0ncmFkaW8nXG4gICAgICAgICAgICAgICAgaWQ9e3RoaXMucHJvcHMuaWQgfHwgdGhpcy5wcm9wcy5pbnB1dFByb3BzLmlkIHx8IHRoaXMudXVpZH1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KCdiLXJhZGlvJywgdGhpcy5wcm9wcy5pbnB1dFByb3BzLmNsYXNzTmFtZSwge1xuICAgICAgICAgICAgICAgICAgICAnYi1yYWRpby1zZWxlY3RlZCc6IHRoaXMucHJvcHMuc2VsZWN0ZWQsXG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgbmFtZT17dGhpcy5wcm9wcy5uYW1lfVxuICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnByb3BzLnZhbHVlfVxuICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3RoaXMucHJvcHMuc2VsZWN0ZWR9XG4gICAgICAgICAgICAgICAgYXJpYS1jaGVja2VkPXtTdHJpbmcodGhpcy5wcm9wcy5zZWxlY3RlZCl9XG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuaGFuZGxlQ2hhbmdlfSAvPlxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJlbmRlckxhYmVsKCkge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5sYWJlbCkge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgey4uLnRoaXMucHJvcHMubGFiZWxQcm9wc31cbiAgICAgICAgICAgICAgICAgICAgcmVmPSdsYWJlbCdcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjeCgnYi1yYWRpby1sYWJlbCcsIHRoaXMucHJvcHMubGFiZWxQcm9wcy5jbGFzc05hbWUpfVxuICAgICAgICAgICAgICAgICAgICBodG1sRm9yPXt0aGlzLnByb3BzLmlkIHx8IHRoaXMucHJvcHMuaW5wdXRQcm9wcy5pZCB8fCB0aGlzLnV1aWR9PlxuICAgICAgICAgICAgICAgICAgICB7dGhpcy5wcm9wcy5sYWJlbH1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICB7Li4ub21pdCh0aGlzLnByb3BzLCBSYWRpby5pbnRlcm5hbEtleXMpfVxuICAgICAgICAgICAgICAgIHJlZj0nd3JhcHBlcidcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KCdiLXJhZGlvLXdyYXBwZXInLCB0aGlzLnByb3BzLmNsYXNzTmFtZSl9PlxuICAgICAgICAgICAgICAgIHt0aGlzLnJlbmRlcklucHV0KCl9XG4gICAgICAgICAgICAgICAge3RoaXMucmVuZGVyTGFiZWwoKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL2JvdW5kbGVzcy1yYWRpby9pbmRleC5qcyJdLCJzb3VyY2VSb290IjoiIn0= | ||
module.exports=function(e){function t(n){if(r[n])return r[n].exports;var o=r[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var r={};return t.m=e,t.c=r,t.i=function(e){return e},t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=4)}([function(e,t){e.exports=require("boundless-utils-omit-keys")},function(e,t){e.exports=require("boundless-utils-uuid")},function(e,t){e.exports=require("classnames")},function(e,t){e.exports=require("react")},function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function p(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var s=r(3),i=r.n(s),a=r(2),u=r.n(a),l=r(0),c=r.n(l),f=r(1),d=r.n(f),h=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},y=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),b=function(e){return"function"==typeof e},P=function(e){function t(){var e,r,p,s;n(this,t);for(var i=arguments.length,a=Array(i),u=0;u<i;u++)a[u]=arguments[u];return r=p=o(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(a))),p.uuid=d()(),p.handleChange=function(e){e.target.checked&&p.props.onSelected(e.target.value),b(p.props.inputProps.onChange)&&p.props.inputProps.onChange(e)},s=r,o(p,s)}return p(t,e),y(t,[{key:"renderInput",value:function(){return i.a.createElement("input",h({},this.props.inputProps,{type:"radio",id:this.props.id||this.props.inputProps.id||this.uuid,className:u()("b-radio",this.props.inputProps.className,{"b-radio-selected":this.props.selected}),name:this.props.name,value:this.props.value,checked:this.props.selected,"aria-checked":String(this.props.selected),onChange:this.handleChange}))}},{key:"renderLabel",value:function(){if(this.props.labelContent)return i.a.createElement("label",h({},this.props.labelProps,{className:u()("b-radio-label",this.props.labelProps.className),htmlFor:this.props.id||this.props.inputProps.id||this.uuid}),this.props.labelContent)}},{key:"render",value:function(){return i.a.createElement(this.props.component,h({},c()(this.props,t.internalKeys),{className:u()("b-radio-wrapper",this.props.className)}),this.renderInput(),this.renderLabel())}}]),t}(i.a.PureComponent);P.propTypes={"*":s.PropTypes.any,component:s.PropTypes.string,inputProps:s.PropTypes.shape({"*":s.PropTypes.any}),labelContent:s.PropTypes.oneOfType([s.PropTypes.node,s.PropTypes.arrayOf(s.PropTypes.node)]),labelProps:s.PropTypes.shape({"*":s.PropTypes.any}),name:s.PropTypes.string.isRequired,onSelected:s.PropTypes.func,selected:s.PropTypes.bool,value:s.PropTypes.string.isRequired},P.defaultProps={component:"div",inputProps:{},labelContent:null,labelProps:{},name:"",onSelected:function(){},selected:!1,value:""},P.internalKeys=Object.keys(P.defaultProps),t.default=P}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIGI5NTFlNTY3MTNkYTE4M2FmZGJjIiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXV0aWxzLXV1aWRcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiY2xhc3NuYW1lc1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdFwifSIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9ib3VuZGxlc3MtcmFkaW8vaW5kZXguanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJ2YWx1ZSIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwicmVxdWlyZSIsIl9fd2VicGFja19leHBvcnRzX18iLCJfY2xhc3NDYWxsQ2hlY2siLCJpbnN0YW5jZSIsIkNvbnN0cnVjdG9yIiwiVHlwZUVycm9yIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJzZWxmIiwiUmVmZXJlbmNlRXJyb3IiLCJfaW5oZXJpdHMiLCJzdWJDbGFzcyIsInN1cGVyQ2xhc3MiLCJjcmVhdGUiLCJjb25zdHJ1Y3RvciIsIndyaXRhYmxlIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfdXVpZF9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc191dWlkX19fZGVmYXVsdCIsIl9leHRlbmRzIiwiYXNzaWduIiwidGFyZ2V0IiwiYXJndW1lbnRzIiwibGVuZ3RoIiwic291cmNlIiwia2V5IiwiX2NyZWF0ZUNsYXNzIiwiZGVmaW5lUHJvcGVydGllcyIsInByb3BzIiwiZGVzY3JpcHRvciIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsImlzRnVuY3Rpb24iLCJ4IiwiUmFkaW8iLCJfUmVhY3QkUHVyZUNvbXBvbmVudCIsIl9yZWYiLCJfdGVtcCIsIl90aGlzIiwiX3JldCIsInRoaXMiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImdldFByb3RvdHlwZU9mIiwiYXBwbHkiLCJjb25jYXQiLCJ1dWlkIiwiaGFuZGxlQ2hhbmdlIiwiZXZlbnQiLCJjaGVja2VkIiwib25TZWxlY3RlZCIsImlucHV0UHJvcHMiLCJvbkNoYW5nZSIsImEiLCJjcmVhdGVFbGVtZW50IiwidHlwZSIsImlkIiwiY2xhc3NOYW1lIiwiYi1yYWRpby1zZWxlY3RlZCIsInNlbGVjdGVkIiwiYXJpYS1jaGVja2VkIiwiU3RyaW5nIiwibGFiZWxDb250ZW50IiwibGFiZWxQcm9wcyIsImh0bWxGb3IiLCJjb21wb25lbnQiLCJpbnRlcm5hbEtleXMiLCJyZW5kZXJJbnB1dCIsInJlbmRlckxhYmVsIiwiUHVyZUNvbXBvbmVudCIsInByb3BUeXBlcyIsIioiLCJhbnkiLCJzdHJpbmciLCJzaGFwZSIsIm9uZU9mVHlwZSIsIm5vZGUiLCJhcnJheU9mIiwiaXNSZXF1aXJlZCIsImZ1bmMiLCJib29sIiwiZGVmYXVsdFByb3BzIiwia2V5cyJdLCJtYXBwaW5ncyI6IkFBQUFBLE9BQU9DLFFBQ0UsU0FBVUMsR0NHbkIsUUFBQUMsR0FBQUMsR0FHQSxHQUFBQyxFQUFBRCxHQUNBLE1BQUFDLEdBQUFELEdBQUFILE9BR0EsSUFBQUQsR0FBQUssRUFBQUQsSUFDQUUsRUFBQUYsRUFDQUcsR0FBQSxFQUNBTixXQVVBLE9BTkFDLEdBQUFFLEdBQUFJLEtBQUFSLEVBQUFDLFFBQUFELElBQUFDLFFBQUFFLEdBR0FILEVBQUFPLEdBQUEsRUFHQVAsRUFBQUMsUUF2QkEsR0FBQUksS0ErREEsT0FuQ0FGLEdBQUFNLEVBQUFQLEVBR0FDLEVBQUFPLEVBQUFMLEVBR0FGLEVBQUFHLEVBQUEsU0FBQUssR0FBMkMsTUFBQUEsSUFHM0NSLEVBQUFTLEVBQUEsU0FBQVgsRUFBQVksRUFBQUMsR0FDQVgsRUFBQVksRUFBQWQsRUFBQVksSUFDQUcsT0FBQUMsZUFBQWhCLEVBQUFZLEdBQ0FLLGNBQUEsRUFDQUMsWUFBQSxFQUNBQyxJQUFBTixLQU1BWCxFQUFBa0IsRUFBQSxTQUFBckIsR0FDQSxHQUFBYyxHQUFBZCxLQUFBc0IsV0FDQSxXQUEyQixNQUFBdEIsR0FBQSxTQUMzQixXQUFpQyxNQUFBQSxHQUVqQyxPQURBRyxHQUFBUyxFQUFBRSxFQUFBLElBQUFBLEdBQ0FBLEdBSUFYLEVBQUFZLEVBQUEsU0FBQVEsRUFBQUMsR0FBc0QsTUFBQVIsUUFBQVMsVUFBQUMsZUFBQWxCLEtBQUFlLEVBQUFDLElBR3REckIsRUFBQXdCLEVBQUEsR0FHQXhCLElBQUF5QixFQUFBLEtET00sU0FBVTVCLEVBQVFDLEdFdkV4QkQsRUFBQUMsUUFBQTRCLFFBQUEsOEJGNkVNLFNBQVU3QixFQUFRQyxHRzdFeEJELEVBQUFDLFFBQUE0QixRQUFBLHlCSG1GTSxTQUFVN0IsRUFBUUMsR0luRnhCRCxFQUFBQyxRQUFBNEIsUUFBQSxlSnlGTSxTQUFVN0IsRUFBUUMsR0t6RnhCRCxFQUFBQyxRQUFBNEIsUUFBQSxVTCtGTSxTQUFVN0IsRUFBUThCLEVBQXFCM0IsR0FFN0MsWUFVOHRCLFNBQVM0QixHQUFnQkMsRUFBU0MsR0FBYSxLQUFLRCxZQUFvQkMsSUFBYyxLQUFNLElBQUlDLFdBQVUscUNBQXVDLFFBQVNDLEdBQTJCQyxFQUFLNUIsR0FBTSxJQUFJNEIsRUFBTSxLQUFNLElBQUlDLGdCQUFlLDREQUE4RCxRQUFPN0IsR0FBcUIsZ0JBQVBBLElBQStCLGtCQUFQQSxHQUF3QjRCLEVBQUw1QixFQUFXLFFBQVM4QixHQUFVQyxFQUFTQyxHQUFZLEdBQXVCLGtCQUFiQSxJQUFzQyxPQUFiQSxFQUFtQixLQUFNLElBQUlOLFdBQVUsaUVBQWtFTSxHQUFhRCxHQUFTZCxVQUFVVCxPQUFPeUIsT0FBT0QsR0FBWUEsRUFBV2YsV0FBV2lCLGFBQWEvQixNQUFNNEIsRUFBU3BCLFlBQVcsRUFBTXdCLFVBQVMsRUFBS3pCLGNBQWEsS0FBV3NCLElBQVd4QixPQUFPNEIsZUFBZTVCLE9BQU80QixlQUFlTCxFQUFTQyxHQUFZRCxFQUFTTSxVQUFVTCxHQVRoZ0R4QixPQUFPQyxlQUFlYSxFQUFxQixjQUFnQm5CLE9BQU8sR0FDN0MsSUFBSW1DLEdBQXNDM0MsRUFBb0IsR0FDMUQ0QyxFQUE4QzVDLEVBQW9Ca0IsRUFBRXlCLEdBQ3BFRSxFQUEyQzdDLEVBQW9CLEdBQy9EOEMsRUFBbUQ5QyxFQUFvQmtCLEVBQUUyQixHQUN6RUUsRUFBMEQvQyxFQUFvQixHQUM5RWdELEVBQWtFaEQsRUFBb0JrQixFQUFFNkIsR0FDeEZFLEVBQXFEakQsRUFBb0IsR0FDekVrRCxFQUE2RGxELEVBQW9Ca0IsRUFBRStCLEdBQ3hHRSxFQUFTdEMsT0FBT3VDLFFBQVEsU0FBU0MsR0FBUSxJQUFJLEdBQUlsRCxHQUFFLEVBQUVBLEVBQUVtRCxVQUFVQyxPQUFPcEQsSUFBSSxDQUFDLEdBQUlxRCxHQUFPRixVQUFVbkQsRUFBRyxLQUFJLEdBQUlzRCxLQUFPRCxHQUFXM0MsT0FBT1MsVUFBVUMsZUFBZWxCLEtBQUttRCxFQUFPQyxLQUFNSixFQUFPSSxHQUFLRCxFQUFPQyxJQUFRLE1BQU9KLElBQWFLLEVBQWEsV0FBVyxRQUFTQyxHQUFpQk4sRUFBT08sR0FBTyxJQUFJLEdBQUl6RCxHQUFFLEVBQUVBLEVBQUV5RCxFQUFNTCxPQUFPcEQsSUFBSSxDQUFDLEdBQUkwRCxHQUFXRCxFQUFNekQsRUFBRzBELEdBQVc3QyxXQUFXNkMsRUFBVzdDLGFBQVksRUFBTTZDLEVBQVc5QyxjQUFhLEVBQVEsU0FBVThDLEtBQVdBLEVBQVdyQixVQUFTLEdBQUszQixPQUFPQyxlQUFldUMsRUFBT1EsRUFBV0osSUFBSUksSUFBYyxNQUFPLFVBQVMvQixFQUFZZ0MsRUFBV0MsR0FBdUksTUFBdkhELElBQVdILEVBQWlCN0IsRUFBWVIsVUFBVXdDLEdBQWVDLEdBQVlKLEVBQWlCN0IsRUFBWWlDLEdBQW9CakMsTU1yR3RzQmtDLEVBQWEsU0FBQ0MsR0FBRCxNQUFvQixrQkFBTkEsSUFPWkMsRU44RnNrRCxTQUFTQyxHQUE0RCxRQUFTRCxLQUFRLEdBQUlFLEdBQVNDLEVBQU1DLEVBQU1DLENBQUszQyxHQUFnQjRDLEtBQUtOLEVBQU8sS0FBSSxHQUFJTyxHQUFLbkIsVUFBVUMsT0FBT21CLEVBQUtDLE1BQU1GLEdBQU1HLEVBQUssRUFBRUEsRUFBS0gsRUFBS0csSUFBUUYsRUFBS0UsR0FBTXRCLFVBQVVzQixFQUFPLE9BQWFQLEdBQU9DLEVBQU10QyxFQUEyQndDLE1BQU1KLEVBQUtGLEVBQU14QixXQUFXN0IsT0FBT2dFLGVBQWVYLElBQVE3RCxLQUFLeUUsTUFBTVYsR0FBTUksTUFBTU8sT0FBT0wsS0FBZUosRU0xQnYrRFUsS0FBTzlCLE1OMEIwaUVvQixFTXhCampFVyxhQUFlLFNBQUNDLEdBQ1JBLEVBQU03QixPQUFPOEIsU0FDYmIsRUFBS1YsTUFBTXdCLFdBQVdGLEVBQU03QixPQUFPN0MsT0FJbkN3RCxFQUFXTSxFQUFLVixNQUFNeUIsV0FBV0MsV0FDakNoQixFQUFLVixNQUFNeUIsV0FBV0MsU0FBU0osSU5pQjJ5RFgsRUFBaWFGLEVBQU9yQyxFQUEyQnNDLEVBQU1DLEdBQWt5QyxNQUF2OERwQyxHQUFVK0IsRUFBTUMsR0FBNHBCVCxFQUFhUSxJQUFRVCxJQUFJLGNBQWNqRCxNQUFNLFdNWjMwRSxNQUNJb0MsR0FBQTJDLEVBQUFDLGNBQUEsUUFBQXJDLEtBQ1FxQixLQUFLWixNQUFNeUIsWUFDZkksS0FBSyxRQUNMQyxHQUFJbEIsS0FBS1osTUFBTThCLElBQU1sQixLQUFLWixNQUFNeUIsV0FBV0ssSUFBTWxCLEtBQUtRLEtBQ3REVyxVQUFXN0MsSUFBRyxVQUFXMEIsS0FBS1osTUFBTXlCLFdBQVdNLFdBQzNDQyxtQkFBb0JwQixLQUFLWixNQUFNaUMsV0FFbkNuRixLQUFNOEQsS0FBS1osTUFBTWxELEtBQ2pCRixNQUFPZ0UsS0FBS1osTUFBTXBELE1BQ2xCMkUsUUFBU1gsS0FBS1osTUFBTWlDLFNBQ3BCQyxlQUFjQyxPQUFPdkIsS0FBS1osTUFBTWlDLFVBQ2hDUCxTQUFVZCxLQUFLUyxtQk5Ba3lGeEIsSUFBSSxjQUFjakQsTUFBTSxXTUtqMUYsR0FBSWdFLEtBQUtaLE1BQU1vQyxhQUNYLE1BQ0lwRCxHQUFBMkMsRUFBQUMsY0FBQSxRQUFBckMsS0FDUXFCLEtBQUtaLE1BQU1xQyxZQUNmTixVQUFXN0MsSUFBRyxnQkFBaUIwQixLQUFLWixNQUFNcUMsV0FBV04sV0FDckRPLFFBQVMxQixLQUFLWixNQUFNOEIsSUFBTWxCLEtBQUtaLE1BQU15QixXQUFXSyxJQUFNbEIsS0FBS1EsT0FDMURSLEtBQUtaLE1BQU1vQyxpQk5YbXFHdkMsSUFBSSxTQUFTakQsTUFBTSxXTWtCOXNHLE1BQ0lvQyxHQUFBMkMsRUFBQUMsY0FBQWhCLEtBQU1aLE1BQU11QyxVQUFaaEQsS0FDUUgsSUFBS3dCLEtBQUtaLE1BQU9NLEVBQU1rQyxlQUMzQlQsVUFBVzdDLElBQUcsa0JBQW1CMEIsS0FBS1osTUFBTStCLGFBQzNDbkIsS0FBSzZCLGNBQ0w3QixLQUFLOEIsbUJOdkJrakhwQyxHTTlGcmlIdEIsRUFBQTJDLEVBQU1nQixjQUFwQnJDLEdBQ1ZzQyxXQUlIQyxJQUFLOUQsRUFBQSxVQUFVK0QsSUFLZlAsVUFBV3hELEVBQUEsVUFBVWdFLE9BRXJCdEIsV0FBWTFDLEVBQUEsVUFBVWlFLE9BSWxCSCxJQUFLOUQsRUFBQSxVQUFVK0QsTUFNbkJWLGFBQWNyRCxFQUFBLFVBQVVrRSxXQUNwQmxFLEVBQUEsVUFBVW1FLEtBQ1ZuRSxFQUFBLFVBQVVvRSxRQUFRcEUsRUFBQSxVQUFVbUUsUUFHaENiLFdBQVl0RCxFQUFBLFVBQVVpRSxPQUlsQkgsSUFBSzlELEVBQUEsVUFBVStELE1BTW5CaEcsS0FBTWlDLEVBQUEsVUFBVWdFLE9BQU9LLFdBS3ZCNUIsV0FBWXpDLEVBQUEsVUFBVXNFLEtBS3RCcEIsU0FBVWxELEVBQUEsVUFBVXVFLEtBS3BCMUcsTUFBT21DLEVBQUEsVUFBVWdFLE9BQU9LLFlBcERYOUMsRUF1RFZpRCxjQUNIaEIsVUFBVyxNQUNYZCxjQUNBVyxhQUFjLEtBQ2RDLGNBQ0F2RixLQUFNLEdBQ04wRSxXQUFZLGFBQ1pTLFVBQVUsRUFDVnJGLE1BQU8sSUEvRE0wRCxFQWtFVmtDLGFBQWV2RixPQUFPdUcsS0FBS2xELEVBQU1pRCxjTjRCa3RKeEYsRUFBNkIsUU05RnR3SnVDIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPVxuLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbi8qKioqKiovIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuLyoqKioqKi8gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuLyoqKioqKi8gXHRcdFx0XHRnZXQ6IGdldHRlclxuLyoqKioqKi8gXHRcdFx0fSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4vKioqKioqLyBcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDQpO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzXCIpO1xuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXV0aWxzLXV1aWRcIik7XG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpO1xuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShfX3dlYnBhY2tfZXhwb3J0c19fLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX3V1aWRfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc191dWlkX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX3V1aWRfXyk7XG52YXIgX2V4dGVuZHM9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odGFyZ2V0KXtmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXt2YXIgc291cmNlPWFyZ3VtZW50c1tpXTtmb3IodmFyIGtleSBpbiBzb3VyY2Upe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2Usa2V5KSl7dGFyZ2V0W2tleV09c291cmNlW2tleV07fX19cmV0dXJuIHRhcmdldDt9O3ZhciBfY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCxwcm9wcyl7Zm9yKHZhciBpPTA7aTxwcm9wcy5sZW5ndGg7aSsrKXt2YXIgZGVzY3JpcHRvcj1wcm9wc1tpXTtkZXNjcmlwdG9yLmVudW1lcmFibGU9ZGVzY3JpcHRvci5lbnVtZXJhYmxlfHxmYWxzZTtkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZT10cnVlO2lmKFwidmFsdWVcImluIGRlc2NyaXB0b3IpZGVzY3JpcHRvci53cml0YWJsZT10cnVlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsZGVzY3JpcHRvci5rZXksZGVzY3JpcHRvcik7fX1yZXR1cm4gZnVuY3Rpb24oQ29uc3RydWN0b3IscHJvdG9Qcm9wcyxzdGF0aWNQcm9wcyl7aWYocHJvdG9Qcm9wcylkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSxwcm90b1Byb3BzKTtpZihzdGF0aWNQcm9wcylkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLHN0YXRpY1Byb3BzKTtyZXR1cm4gQ29uc3RydWN0b3I7fTt9KCk7ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLENvbnN0cnVjdG9yKXtpZighKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO319ZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZixjYWxsKXtpZighc2VsZil7dGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO31yZXR1cm4gY2FsbCYmKHR5cGVvZiBjYWxsPT09XCJvYmplY3RcInx8dHlwZW9mIGNhbGw9PT1cImZ1bmN0aW9uXCIpP2NhbGw6c2VsZjt9ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLHN1cGVyQ2xhc3Mpe2lmKHR5cGVvZiBzdXBlckNsYXNzIT09XCJmdW5jdGlvblwiJiZzdXBlckNsYXNzIT09bnVsbCl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIrdHlwZW9mIHN1cGVyQ2xhc3MpO31zdWJDbGFzcy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzJiZzdXBlckNsYXNzLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnN1YkNsYXNzLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX19KTtpZihzdXBlckNsYXNzKU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3Msc3VwZXJDbGFzcyk6c3ViQ2xhc3MuX19wcm90b19fPXN1cGVyQ2xhc3M7fXZhciBpc0Z1bmN0aW9uPWZ1bmN0aW9uIGlzRnVuY3Rpb24oeCl7cmV0dXJuIHR5cGVvZiB4PT09J2Z1bmN0aW9uJzt9O3ZhciBSYWRpbz1mdW5jdGlvbihfUmVhY3QkUHVyZUNvbXBvbmVudCl7X2luaGVyaXRzKFJhZGlvLF9SZWFjdCRQdXJlQ29tcG9uZW50KTtmdW5jdGlvbiBSYWRpbygpe3ZhciBfcmVmO3ZhciBfdGVtcCxfdGhpcyxfcmV0O19jbGFzc0NhbGxDaGVjayh0aGlzLFJhZGlvKTtmb3IodmFyIF9sZW49YXJndW1lbnRzLmxlbmd0aCxhcmdzPUFycmF5KF9sZW4pLF9rZXk9MDtfa2V5PF9sZW47X2tleSsrKXthcmdzW19rZXldPWFyZ3VtZW50c1tfa2V5XTt9cmV0dXJuIF9yZXQ9KF90ZW1wPShfdGhpcz1fcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLChfcmVmPVJhZGlvLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKFJhZGlvKSkuY2FsbC5hcHBseShfcmVmLFt0aGlzXS5jb25jYXQoYXJncykpKSxfdGhpcyksX3RoaXMudXVpZD1fX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX3V1aWRfX19kZWZhdWx0KCkoKSxfdGhpcy5oYW5kbGVDaGFuZ2U9ZnVuY3Rpb24oZXZlbnQpe2lmKGV2ZW50LnRhcmdldC5jaGVja2VkKXtfdGhpcy5wcm9wcy5vblNlbGVjdGVkKGV2ZW50LnRhcmdldC52YWx1ZSk7fWlmKGlzRnVuY3Rpb24oX3RoaXMucHJvcHMuaW5wdXRQcm9wcy5vbkNoYW5nZSkpe190aGlzLnByb3BzLmlucHV0UHJvcHMub25DaGFuZ2UoZXZlbnQpO319LF90ZW1wKSxfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcyxfcmV0KTt9X2NyZWF0ZUNsYXNzKFJhZGlvLFt7a2V5OidyZW5kZXJJbnB1dCcsdmFsdWU6ZnVuY3Rpb24gcmVuZGVySW5wdXQoKXtyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoJ2lucHV0JyxfZXh0ZW5kcyh7fSx0aGlzLnByb3BzLmlucHV0UHJvcHMse3R5cGU6J3JhZGlvJyxpZDp0aGlzLnByb3BzLmlkfHx0aGlzLnByb3BzLmlucHV0UHJvcHMuaWR8fHRoaXMudXVpZCxjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItcmFkaW8nLHRoaXMucHJvcHMuaW5wdXRQcm9wcy5jbGFzc05hbWUseydiLXJhZGlvLXNlbGVjdGVkJzp0aGlzLnByb3BzLnNlbGVjdGVkfSksbmFtZTp0aGlzLnByb3BzLm5hbWUsdmFsdWU6dGhpcy5wcm9wcy52YWx1ZSxjaGVja2VkOnRoaXMucHJvcHMuc2VsZWN0ZWQsJ2FyaWEtY2hlY2tlZCc6U3RyaW5nKHRoaXMucHJvcHMuc2VsZWN0ZWQpLG9uQ2hhbmdlOnRoaXMuaGFuZGxlQ2hhbmdlfSkpO319LHtrZXk6J3JlbmRlckxhYmVsJyx2YWx1ZTpmdW5jdGlvbiByZW5kZXJMYWJlbCgpe2lmKHRoaXMucHJvcHMubGFiZWxDb250ZW50KXtyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyxfZXh0ZW5kcyh7fSx0aGlzLnByb3BzLmxhYmVsUHJvcHMse2NsYXNzTmFtZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQoKSgnYi1yYWRpby1sYWJlbCcsdGhpcy5wcm9wcy5sYWJlbFByb3BzLmNsYXNzTmFtZSksaHRtbEZvcjp0aGlzLnByb3BzLmlkfHx0aGlzLnByb3BzLmlucHV0UHJvcHMuaWR8fHRoaXMudXVpZH0pLHRoaXMucHJvcHMubGFiZWxDb250ZW50KTt9fX0se2tleToncmVuZGVyJyx2YWx1ZTpmdW5jdGlvbiByZW5kZXIoKXtyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQodGhpcy5wcm9wcy5jb21wb25lbnQsX2V4dGVuZHMoe30sX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfX19kZWZhdWx0KCkodGhpcy5wcm9wcyxSYWRpby5pbnRlcm5hbEtleXMpLHtjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItcmFkaW8td3JhcHBlcicsdGhpcy5wcm9wcy5jbGFzc05hbWUpfSksdGhpcy5yZW5kZXJJbnB1dCgpLHRoaXMucmVuZGVyTGFiZWwoKSk7fX1dKTtyZXR1cm4gUmFkaW87fShfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuUHVyZUNvbXBvbmVudCk7UmFkaW8ucHJvcFR5cGVzPXsnKic6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYW55LGNvbXBvbmVudDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5zdHJpbmcsaW5wdXRQcm9wczpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5zaGFwZSh7JyonOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmFueX0pLGxhYmVsQ29udGVudDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5vbmVPZlR5cGUoW19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm5vZGUsX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYXJyYXlPZihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ub2RlKV0pLGxhYmVsUHJvcHM6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uc2hhcGUoeycqJzpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5hbnl9KSxuYW1lOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLnN0cmluZy5pc1JlcXVpcmVkLG9uU2VsZWN0ZWQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uZnVuYyxzZWxlY3RlZDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ib29sLHZhbHVlOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLnN0cmluZy5pc1JlcXVpcmVkfTtSYWRpby5kZWZhdWx0UHJvcHM9e2NvbXBvbmVudDonZGl2JyxpbnB1dFByb3BzOnt9LGxhYmVsQ29udGVudDpudWxsLGxhYmVsUHJvcHM6e30sbmFtZTonJyxvblNlbGVjdGVkOmZ1bmN0aW9uIG9uU2VsZWN0ZWQoKXt9LHNlbGVjdGVkOmZhbHNlLHZhbHVlOicnfTtSYWRpby5pbnRlcm5hbEtleXM9T2JqZWN0LmtleXMoUmFkaW8uZGVmYXVsdFByb3BzKTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gUmFkaW87XG5cbi8qKiovIH0pXG4vKioqKioqLyBdKTtcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gaW5kZXguanMiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA0KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCBiOTUxZTU2NzEzZGExODNhZmRiYyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzXCJ9XG4vLyBtb2R1bGUgaWQgPSAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy11dGlscy11dWlkXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXV0aWxzLXV1aWRcIn1cbi8vIG1vZHVsZSBpZCA9IDFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2xhc3NuYW1lc1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImNsYXNzbmFtZXNcIn1cbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdFwifVxuLy8gbW9kdWxlIGlkID0gM1xuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgUmVhY3QsIHtQcm9wVHlwZXN9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjeCBmcm9tICdjbGFzc25hbWVzJztcblxuaW1wb3J0IG9taXQgZnJvbSAnYm91bmRsZXNzLXV0aWxzLW9taXQta2V5cyc7XG5pbXBvcnQgdXVpZCBmcm9tICdib3VuZGxlc3MtdXRpbHMtdXVpZCc7XG5cbmNvbnN0IGlzRnVuY3Rpb24gPSAoeCkgPT4gdHlwZW9mIHggPT09ICdmdW5jdGlvbic7XG5cbi8qKlxuX19BbiBhY2Nlc3NpYmxlIHJhZGlvIGZvcm0gY29udHJvbC5fX1xuXG5SYWRpbyBpcyBpbXBsZW1lbnRlZCBhcyBhIFwiY29udHJvbGxlZCBpbnB1dFwiLCBtZWFuaW5nIGl0IGlzIGEgZGlyZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBkYXRhIHBhc3NlZCBpbnNpZGUuIFVzZXIgaW50ZXJhY3Rpb24gd2lsbCBidWJibGUgY2hhbmdlcyBpbiB0aGUgZm9ybSBvZiBgb25TZWxlY3RlZGAgdGhhdCBhIGNvbnRyb2xsZXIgdmlldyBtdXN0IGludGVyY2VwdCBhbmQgYXBwbHkgYWdhaW5zdCB0aGUgZGF0YSBwcm92aWRlci5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmFkaW8gZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgICAvKipcbiAgICAgICAgICogYW55IFtSZWFjdC1zdXBwb3J0ZWQgYXR0cmlidXRlXShodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RhZ3MtYW5kLWF0dHJpYnV0ZXMuaHRtbCNodG1sLWF0dHJpYnV0ZXMpXG4gICAgICAgICAqL1xuICAgICAgICAnKic6IFByb3BUeXBlcy5hbnksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIG92ZXJyaWRlIHRoZSB3cmFwcGVyIGNvbXBvbmVudCBIVE1MIGVsZW1lbnQgdGFnIGlmIGRlc2lyZWRcbiAgICAgICAgICovXG4gICAgICAgIGNvbXBvbmVudDogUHJvcFR5cGVzLnN0cmluZyxcblxuICAgICAgICBpbnB1dFByb3BzOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBhbnkgW1JlYWN0LXN1cHBvcnRlZCBhdHRyaWJ1dGVdKGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdGFncy1hbmQtYXR0cmlidXRlcy5odG1sI2h0bWwtYXR0cmlidXRlcylcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgJyonOiBQcm9wVHlwZXMuYW55LFxuICAgICAgICB9KSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogYW55IFJlYWN0LXJlbmRlcmFibGUgY29udGVudFxuICAgICAgICAgKi9cbiAgICAgICAgbGFiZWxDb250ZW50OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICAgICAgICAgIFByb3BUeXBlcy5ub2RlLFxuICAgICAgICAgICAgUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm5vZGUpLFxuICAgICAgICBdKSxcblxuICAgICAgICBsYWJlbFByb3BzOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBhbnkgW1JlYWN0LXN1cHBvcnRlZCBhdHRyaWJ1dGVdKGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdGFncy1hbmQtYXR0cmlidXRlcy5odG1sI2h0bWwtYXR0cmlidXRlcylcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgJyonOiBQcm9wVHlwZXMuYW55LFxuICAgICAgICB9KSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogcGFzc3Rocm91Z2ggdG8gdGhlIEhUTUwgYG5hbWVgIGF0dHJpYnV0ZSBvbiB0aGUgYC5iLXJhZGlvYCBub2RlXG4gICAgICAgICAqL1xuICAgICAgICBuYW1lOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGNhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGJlY29tZXMgc2VsZWN0ZWQ7IGJhY2tpbmcgZGF0YSBtdXN0IGJlIHVwZGF0ZWQgdG8gcGVyc2lzdCB0aGUgc3RhdGUgY2hhbmdlXG4gICAgICAgICAqL1xuICAgICAgICBvblNlbGVjdGVkOiBQcm9wVHlwZXMuZnVuYyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogZGV0ZXJtaW5lcyB0aGUgYWN0aXZhdGlvbiBzdGF0ZSBvZiB0aGUgcmFkaW8gY29udHJvbCwgc2VlIFJlYWN0IFtcImNvbnRyb2xsZWQgaW5wdXRzXCJdKGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvZm9ybXMuaHRtbCNjb250cm9sbGVkLWNvbXBvbmVudHMpKVxuICAgICAgICAgKi9cbiAgICAgICAgc2VsZWN0ZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBwYXNzdGhyb3VnaCB0byB0aGUgSFRNTCBgdmFsdWVgIGF0dHJpYnV0ZSBvbiB0aGUgYC5iLXJhZGlvYCBub2RlXG4gICAgICAgICAqL1xuICAgICAgICB2YWx1ZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIH1cblxuICAgIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgICAgIGNvbXBvbmVudDogJ2RpdicsXG4gICAgICAgIGlucHV0UHJvcHM6IHt9LFxuICAgICAgICBsYWJlbENvbnRlbnQ6IG51bGwsXG4gICAgICAgIGxhYmVsUHJvcHM6IHt9LFxuICAgICAgICBuYW1lOiAnJyxcbiAgICAgICAgb25TZWxlY3RlZDogKCkgPT4ge30sXG4gICAgICAgIHNlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6ICcnLFxuICAgIH1cblxuICAgIHN0YXRpYyBpbnRlcm5hbEtleXMgPSBPYmplY3Qua2V5cyhSYWRpby5kZWZhdWx0UHJvcHMpXG5cbiAgICB1dWlkID0gdXVpZCgpXG5cbiAgICBoYW5kbGVDaGFuZ2UgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldC5jaGVja2VkKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uU2VsZWN0ZWQoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHRoaXMucHJvcHMuaW5wdXRQcm9wcy5vbkNoYW5nZSkpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMuaW5wdXRQcm9wcy5vbkNoYW5nZShldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXJJbnB1dCgpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHsuLi50aGlzLnByb3BzLmlucHV0UHJvcHN9XG4gICAgICAgICAgICAgICAgdHlwZT0ncmFkaW8nXG4gICAgICAgICAgICAgICAgaWQ9e3RoaXMucHJvcHMuaWQgfHwgdGhpcy5wcm9wcy5pbnB1dFByb3BzLmlkIHx8IHRoaXMudXVpZH1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KCdiLXJhZGlvJywgdGhpcy5wcm9wcy5pbnB1dFByb3BzLmNsYXNzTmFtZSwge1xuICAgICAgICAgICAgICAgICAgICAnYi1yYWRpby1zZWxlY3RlZCc6IHRoaXMucHJvcHMuc2VsZWN0ZWQsXG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgbmFtZT17dGhpcy5wcm9wcy5uYW1lfVxuICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnByb3BzLnZhbHVlfVxuICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3RoaXMucHJvcHMuc2VsZWN0ZWR9XG4gICAgICAgICAgICAgICAgYXJpYS1jaGVja2VkPXtTdHJpbmcodGhpcy5wcm9wcy5zZWxlY3RlZCl9XG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuaGFuZGxlQ2hhbmdlfSAvPlxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJlbmRlckxhYmVsKCkge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5sYWJlbENvbnRlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIHsuLi50aGlzLnByb3BzLmxhYmVsUHJvcHN9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y3goJ2ItcmFkaW8tbGFiZWwnLCB0aGlzLnByb3BzLmxhYmVsUHJvcHMuY2xhc3NOYW1lKX1cbiAgICAgICAgICAgICAgICAgICAgaHRtbEZvcj17dGhpcy5wcm9wcy5pZCB8fCB0aGlzLnByb3BzLmlucHV0UHJvcHMuaWQgfHwgdGhpcy51dWlkfT5cbiAgICAgICAgICAgICAgICAgICAge3RoaXMucHJvcHMubGFiZWxDb250ZW50fVxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPHRoaXMucHJvcHMuY29tcG9uZW50XG4gICAgICAgICAgICAgICAgey4uLm9taXQodGhpcy5wcm9wcywgUmFkaW8uaW50ZXJuYWxLZXlzKX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KCdiLXJhZGlvLXdyYXBwZXInLCB0aGlzLnByb3BzLmNsYXNzTmFtZSl9PlxuICAgICAgICAgICAgICAgIHt0aGlzLnJlbmRlcklucHV0KCl9XG4gICAgICAgICAgICAgICAge3RoaXMucmVuZGVyTGFiZWwoKX1cbiAgICAgICAgICAgIDwvdGhpcy5wcm9wcy5jb21wb25lbnQ+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvYm91bmRsZXNzLXJhZGlvL2luZGV4LmpzIl0sInNvdXJjZVJvb3QiOiIifQ== |
@@ -10,3 +10,2 @@ import React, {PropTypes} from 'react'; | ||
/** | ||
# Radio | ||
__An accessible radio form control.__ | ||
@@ -19,16 +18,33 @@ | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-radio` node | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
inputProps: PropTypes.object, | ||
'*': PropTypes.any, | ||
/** | ||
* any React-renderable content, most commonly a simple string | ||
* override the wrapper component HTML element tag if desired | ||
*/ | ||
label: PropTypes.node, | ||
component: PropTypes.string, | ||
inputProps: PropTypes.shape({ | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
'*': PropTypes.any, | ||
}), | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-radio-label` node | ||
* any React-renderable content | ||
*/ | ||
labelProps: PropTypes.object, | ||
labelContent: PropTypes.oneOfType([ | ||
PropTypes.node, | ||
PropTypes.arrayOf(PropTypes.node), | ||
]), | ||
labelProps: PropTypes.shape({ | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
'*': PropTypes.any, | ||
}), | ||
/** | ||
@@ -56,4 +72,5 @@ * passthrough to the HTML `name` attribute on the `.b-radio` node | ||
static defaultProps = { | ||
component: 'div', | ||
inputProps: {}, | ||
label: null, | ||
labelContent: null, | ||
labelProps: {}, | ||
@@ -85,3 +102,2 @@ name: '', | ||
{...this.props.inputProps} | ||
ref='input' | ||
type='radio' | ||
@@ -101,10 +117,9 @@ id={this.props.id || this.props.inputProps.id || this.uuid} | ||
renderLabel() { | ||
if (this.props.label) { | ||
if (this.props.labelContent) { | ||
return ( | ||
<label | ||
{...this.props.labelProps} | ||
ref='label' | ||
className={cx('b-radio-label', this.props.labelProps.className)} | ||
htmlFor={this.props.id || this.props.inputProps.id || this.uuid}> | ||
{this.props.label} | ||
{this.props.labelContent} | ||
</label> | ||
@@ -117,11 +132,10 @@ ); | ||
return ( | ||
<div | ||
<this.props.component | ||
{...omit(this.props, Radio.internalKeys)} | ||
ref='wrapper' | ||
className={cx('b-radio-wrapper', this.props.className)}> | ||
{this.renderInput()} | ||
{this.renderLabel()} | ||
</div> | ||
</this.props.component> | ||
); | ||
} | ||
} |
{ | ||
"name": "boundless-radio", | ||
"version": "1.0.0-beta.5", | ||
"version": "1.0.0-beta.7", | ||
"description": "An accessible radio form control.", | ||
@@ -28,4 +28,4 @@ "main": "build/index.js", | ||
"dependencies": { | ||
"boundless-utils-omit-keys": "^1.0.0-beta.5", | ||
"boundless-utils-uuid": "^1.0.0-beta.5", | ||
"boundless-utils-omit-keys": "^1.0.0-beta.7", | ||
"boundless-utils-uuid": "^1.0.0-beta.7", | ||
"classnames": "^2.1.5" | ||
@@ -32,0 +32,0 @@ }, |
@@ -0,4 +1,6 @@ | ||
<!--- | ||
THIS IS AN AUTOGENERATED FILE. EDIT INDEX.JS INSTEAD. | ||
--> | ||
# Radio | ||
# Radio | ||
__An accessible radio form control.__ | ||
@@ -8,31 +10,83 @@ | ||
## Example Usage | ||
```jsx | ||
import React from 'react'; | ||
import Radio from '../index'; | ||
export default class RadioDemo extends React.PureComponent { | ||
state = { | ||
options: [{ | ||
labelContent: 'Business', | ||
name: 'major', | ||
selected: false, | ||
value: 'bus', | ||
}, { | ||
labelContent: 'Engineering', | ||
name: 'major', | ||
selected: true, | ||
value: 'eng', | ||
}, { | ||
labelContent: 'Physical Sciences', | ||
name: 'major', | ||
selected: false, | ||
value: 'phys-sci', | ||
}, { | ||
labelContent: 'Psychology', | ||
name: 'major', | ||
selected: false, | ||
value: 'psy', | ||
}, { | ||
labelContent: 'Law', | ||
name: 'major', | ||
selected: false, | ||
value: 'law', | ||
}], | ||
} | ||
handleInteraction(code) { | ||
// eslint-disable-next-line no-alert | ||
alert(`${code} selected!\n\nThe input will now revert to its previous state because this demo does not persist model changes.`); | ||
} | ||
render() { | ||
return ( | ||
<div> | ||
<p>What is your academic major?</p> | ||
<div className='spread'> | ||
{this.state.options.map((definition) => { | ||
let boundFunc = this.handleInteraction.bind(this, definition.value); | ||
return ( | ||
<Radio {...definition} | ||
key={definition.value} | ||
labelContent={definition.labelContent} | ||
onSelected={boundFunc} /> | ||
); | ||
})} | ||
</div> | ||
</div> | ||
); | ||
} | ||
} | ||
``` | ||
## Props | ||
_Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/Radio#props)._ | ||
> Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/Radio#props). | ||
### Required Props | ||
<table> | ||
<tr> | ||
<th>Name</th> | ||
<th>Type</th> | ||
<th>Default Value</th> | ||
<th>Description</th> | ||
</tr> | ||
- __`name`__ ・ passthrough to the HTML `name` attribute on the `.b-radio` node | ||
<tr> | ||
<td>name</td> | ||
<td><pre><code>string</code></pre></td> | ||
<td><pre><code class="language-js">''</code></pre></td> | ||
<td>passthrough to the HTML `name` attribute on the `.b-radio` node</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`string` | `''` | ||
<tr> | ||
<td>value</td> | ||
<td><pre><code>string</code></pre></td> | ||
<td><pre><code class="language-js">''</code></pre></td> | ||
<td>passthrough to the HTML `value` attribute on the `.b-radio` node</td> | ||
</tr> | ||
- __`value`__ ・ passthrough to the HTML `value` attribute on the `.b-radio` node | ||
</table> | ||
Expects | Default Value | ||
- | - | ||
`string` | `''` | ||
@@ -42,47 +96,60 @@ | ||
<table> | ||
<tr> | ||
<th>Name</th> | ||
<th>Type</th> | ||
<th>Default Value</th> | ||
<th>Description</th> | ||
</tr> | ||
- __`*`__ ・ any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
<tr> | ||
<td>inputProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-radio` node</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any` | `n/a` | ||
<tr> | ||
<td>label</td> | ||
<td><pre><code>any renderable</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>any React-renderable content, most commonly a simple string</td> | ||
</tr> | ||
- __`component`__ ・ override the wrapper component HTML element tag if desired | ||
<tr> | ||
<td>labelProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-radio-label` node</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`string` | `'div'` | ||
<tr> | ||
<td>onSelected</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">() => {}</code></pre></td> | ||
<td>called when the element becomes selected; backing data must be updated to persist the state change</td> | ||
</tr> | ||
- __`inputProps`__ | ||
<tr> | ||
<td>selected</td> | ||
<td><pre><code>bool</code></pre></td> | ||
<td><pre><code class="language-js">false</code></pre></td> | ||
<td>determines the activation state of the radio control, see React ["controlled inputs"](https://facebook.github.io/react/docs/forms.html#controlled-components))</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`object` | `{}` | ||
</table> | ||
- __`labelContent`__ ・ any React-renderable content | ||
Expects | Default Value | ||
- | - | ||
`any renderable or arrayOf(any renderable)` | `null` | ||
- __`labelProps`__ | ||
Expects | Default Value | ||
- | - | ||
`object` | `{}` | ||
- __`onSelected`__ ・ called when the element becomes selected; backing data must be updated to persist the state change | ||
Expects | Default Value | ||
- | - | ||
`function` | `() => {}` | ||
- __`selected`__ ・ determines the activation state of the radio control, see React ["controlled inputs"](https://facebook.github.io/react/docs/forms.html#controlled-components)) | ||
Expects | Default Value | ||
- | - | ||
`bool` | `false` | ||
## Reference Styles | ||
### Stylus | ||
```stylus | ||
// Bring in Boundless's base Stylus variables | ||
@require "node_modules/boundless-radio/variables" | ||
// Redefine any variables as desired, e.g. | ||
color-accent = royalblue | ||
// Bring in the component styles; they will be autoconfigured based on the above | ||
@require "node_modules/boundless-radio/style" | ||
``` | ||
### CSS | ||
If desired, a precompiled plain CSS stylesheet is available for customization at `/build/style.css`, based on Boundless's [default variables](https://github.com/enigma-io/boundless/blob/master/variables.styl). | ||
@@ -1,2 +0,2 @@ | ||
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=5)}([function(e,n,t){"use strict";function o(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Object.keys(e).reduce(function(t,o){return n.indexOf(o)===-1&&(t[o]=e[o]),t},{})}n.a=o},function(e,n){e.exports=require("boundless-button")},function(e,n){e.exports=require("classnames")},function(e,n){e.exports=require("react")},function(e,n){e.exports=require("react-dom")},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 u=t(3),s=t.n(u),c=t(4),p=(t.n(c),t(2)),a=t.n(p),l=t(1),f=t.n(l),d=t(0),h=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}}(),v=function(e){return"function"==typeof e},O=function(e){function n(){var e,t,i,u;o(this,n);for(var s=arguments.length,c=Array(s),p=0;p<s;p++)c[p]=arguments[p];return t=i=r(this,(e=n.__proto__||Object.getPrototypeOf(n)).call.apply(e,[this].concat(c))),i.state={indexOfOptionInFocus:null},i.handleKeyDown=function(e){var n=e.key,t=i.state.indexOfOptionInFocus;"ArrowLeft"===n?(i.setFocus(i.getPreviousOptionIndex(t)),e.preventDefault()):"ArrowRight"===n?(i.setFocus(i.getNextOptionIndex(t)),e.preventDefault()):"Enter"===n&&(i.handleOptionClick(i.props.options[t]),e.preventDefault()),v(i.props.onKeyDown)&&i.props.onKeyDown(e)},u=t,r(i,u)}return i(n,e),y(n,[{key:"currentValue",value:function(){var e=void 0;return this.props.options.some(function(n){if(n.selected)return e=n.value,!0}),e}},{key:"setFocus",value:function(e){t.i(c.findDOMNode)(this.refs["option_$"+e]).focus()}},{key:"getNextOptionIndex",value:function(e){var n=e+1;return n<this.props.options.length?n:0}},{key:"getPreviousOptionIndex",value:function(e){var n=e-1;return n<0?this.props.options.length-1:n}},{key:"handleOptionBlur",value:function(e,n){this.state.indexOfOptionInFocus===this.props.options.indexOf(e)&&this.setState({indexOfOptionInFocus:null}),v(e.onBlur)&&e.onBlur(n)}},{key:"handleOptionClick",value:function(e,n){this.props.onOptionSelected(e.value),v(e.onClick)&&e.onClick(n)}},{key:"handleOptionFocus",value:function(e,n){this.setState({indexOfOptionInFocus:this.props.options.indexOf(e)}),v(e.onFocus)&&e.onFocus(n)}},{key:"renderOptions",value:function(){var e=this;return this.props.options.map(function(o,r){return s.a.createElement(f.a,h({},t.i(d.a)(o,n.internalChildKeys),{role:"radio","aria-checked":String(o.selected),ref:"option_$"+r,key:o.value,className:a()("b-segmented-control-option",o.className,{"b-segmented-control-option-selected":o.selected}),tabIndex:o.selected?"0":"-1",onBlur:e.handleOptionBlur.bind(e,o),onPressed:e.handleOptionClick.bind(e,o),onFocus:e.handleOptionFocus.bind(e,o)}),o.content)})}},{key:"render",value:function(){return s.a.createElement("div",h({},t.i(d.a)(this.props,n.internalKeys),{ref:"wrapper",role:"radiogroup",className:a()("b-segmented-control",this.props.className),onKeyDown:this.handleKeyDown}),this.renderOptions())}}]),n}(s.a.PureComponent);O.propTypes={onOptionSelected:u.PropTypes.func,options:function(e){if(e.options.length<2)throw new Error("Must provide at least two options.");var n=e.options.some(function(e){if(!("selected"in e))return!0});if(n)throw new Error("Must provide a `selected` prop for each option.");var t=!1,o=e.options.some(function(e){if(e.selected){if(t)return!0;t=!0}});if(o)throw new Error("Encountered multiple options with `selected: true`. There can be only one.");if(e.options.some(function(e){return"undefined"==typeof e.value}))throw new Error("Must provide a `value` prop for each option.")}},O.defaultProps={onOptionSelected:function(){},options:[]},O.internalKeys=Object.keys(O.defaultProps),O.internalChildKeys=["content","value","selected"],n.default=O}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIDUwMDMxYzEwZWJkMWYxZDZhN2U1Iiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLWJ1dHRvblwifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJjbGFzc25hbWVzXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0XCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0LWRvbVwifSIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9ib3VuZGxlc3Mtc2VnbWVudGVkLWNvbnRyb2wvaW5kZXguanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJ2YWx1ZSIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiX193ZWJwYWNrX2V4cG9ydHNfXyIsIm9taXRLZXlzRnJvbVNvdXJjZU9iamVjdCIsInNvdXJjZSIsIm9taXR0ZWRLZXlzIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwia2V5cyIsInJlZHVjZSIsImhhc2giLCJrZXkiLCJpbmRleE9mIiwicmVxdWlyZSIsIl9jbGFzc0NhbGxDaGVjayIsImluc3RhbmNlIiwiQ29uc3RydWN0b3IiLCJUeXBlRXJyb3IiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiIsInNlbGYiLCJSZWZlcmVuY2VFcnJvciIsIl9pbmhlcml0cyIsInN1YkNsYXNzIiwic3VwZXJDbGFzcyIsImNyZWF0ZSIsImNvbnN0cnVjdG9yIiwid3JpdGFibGUiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9kb21fXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9jbGFzc25hbWVzX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfY2xhc3NuYW1lc19fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX2J1dHRvbl9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc19idXR0b25fX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyIsIl9leHRlbmRzIiwiYXNzaWduIiwidGFyZ2V0IiwiX2NyZWF0ZUNsYXNzIiwiZGVmaW5lUHJvcGVydGllcyIsInByb3BzIiwiZGVzY3JpcHRvciIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsImlzRnVuY3Rpb24iLCJ4IiwiU2VnbWVudGVkQ29udHJvbCIsIl9SZWFjdCRQdXJlQ29tcG9uZW50IiwiX3JlZiIsIl90ZW1wIiwiX3RoaXMiLCJfcmV0IiwidGhpcyIsIl9sZW4iLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiZ2V0UHJvdG90eXBlT2YiLCJhcHBseSIsImNvbmNhdCIsInN0YXRlIiwiaW5kZXhPZk9wdGlvbkluRm9jdXMiLCJoYW5kbGVLZXlEb3duIiwiZXZlbnQiLCJhY3RpdmVJdGVtSW5kZXgiLCJzZXRGb2N1cyIsImdldFByZXZpb3VzT3B0aW9uSW5kZXgiLCJwcmV2ZW50RGVmYXVsdCIsImdldE5leHRPcHRpb25JbmRleCIsImhhbmRsZU9wdGlvbkNsaWNrIiwib3B0aW9ucyIsIm9uS2V5RG93biIsInNvbWUiLCJvcHRpb24iLCJzZWxlY3RlZCIsImluZGV4IiwicmVmcyIsImZvY3VzIiwiY3VycmVudE9wdGlvbkluZGV4IiwibmV4dCIsInByZXZpb3VzIiwic2V0U3RhdGUiLCJvbkJsdXIiLCJvbk9wdGlvblNlbGVjdGVkIiwib25DbGljayIsIm9uRm9jdXMiLCJfdGhpczIiLCJtYXAiLCJkZWZpbml0aW9uIiwiYSIsImNyZWF0ZUVsZW1lbnQiLCJpbnRlcm5hbENoaWxkS2V5cyIsInJvbGUiLCJhcmlhLWNoZWNrZWQiLCJTdHJpbmciLCJyZWYiLCJjbGFzc05hbWUiLCJiLXNlZ21lbnRlZC1jb250cm9sLW9wdGlvbi1zZWxlY3RlZCIsInRhYkluZGV4IiwiaGFuZGxlT3B0aW9uQmx1ciIsImJpbmQiLCJvblByZXNzZWQiLCJoYW5kbGVPcHRpb25Gb2N1cyIsImNvbnRlbnQiLCJpbnRlcm5hbEtleXMiLCJyZW5kZXJPcHRpb25zIiwiUHVyZUNvbXBvbmVudCIsInByb3BUeXBlcyIsImZ1bmMiLCJFcnJvciIsIm1pc3NpbmdTZWxlY3RlZCIsInNlZW5TZWxlY3RlZCIsIm11bHRpcGxlU2VsZWN0ZWQiLCJkZWZhdWx0UHJvcHMiXSwibWFwcGluZ3MiOiJBQUFBQSxPQUFPQyxRQUNFLFNBQVVDLEdDR25CLFFBQUFDLEdBQUFDLEdBR0EsR0FBQUMsRUFBQUQsR0FDQSxNQUFBQyxHQUFBRCxHQUFBSCxPQUdBLElBQUFELEdBQUFLLEVBQUFELElBQ0FFLEVBQUFGLEVBQ0FHLEdBQUEsRUFDQU4sV0FVQSxPQU5BQyxHQUFBRSxHQUFBSSxLQUFBUixFQUFBQyxRQUFBRCxJQUFBQyxRQUFBRSxHQUdBSCxFQUFBTyxHQUFBLEVBR0FQLEVBQUFDLFFBdkJBLEdBQUFJLEtBK0RBLE9BbkNBRixHQUFBTSxFQUFB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OUUwdkszRCxHT3JHbHVLbEIsRUFBQTZELEVBQU1pQixjQUEvQjVELEdBQ1Y2RCxXQUlIeEIsaUJBQWtCeEQsRUFBQSxVQUFVaUYsS0FnQjVCdEMsUUFBUyxTQUF5QjlCLEdBQzlCLEdBQUlBLEVBQU04QixRQUFRbEUsT0FBUyxFQUN2QixLQUFNLElBQUl5RyxPQUFNLHFDQUdwQixJQUFNQyxHQUFrQnRFLEVBQU04QixRQUFRRSxLQUFLLFNBQUNDLEdBQ3hDLEtBQU0sWUFBY0EsSUFDaEIsT0FBTyxHQUlmLElBQUlxQyxFQUNBLEtBQU0sSUFBSUQsT0FBTSxrREFHcEIsSUFBSUUsSUFBZSxFQUNiQyxFQUFtQnhFLEVBQU04QixRQUFRRSxLQUFLLFNBQUNDLEdBQ3pDLEdBQUlBLEVBQU9DLFNBQVUsQ0FDakIsR0FBSXFDLEVBQ0EsT0FBTyxDQUdYQSxJQUFlLElBSXZCLElBQUlDLEVBQ0EsS0FBTSxJQUFJSCxPQUFNLDZFQUdwQixJQUFJckUsRUFBTThCLFFBQVFFLEtBQUssU0FBQ0MsR0FBRCxNQUFvQyxtQkFBakJBLEdBQU81RixRQUM3QyxLQUFNLElBQUlnSSxPQUFNLGtEQXBEWC9ELEVBeURWbUUsY0FDSDlCLGlCQUFrQixhQUNsQmIsWUEzRGF4QixFQThEVjBELGFBQWV0SCxPQUFPb0IsS0FBS3dDLEVBQWlCbUUsY0E5RGxDbkUsRUErRFY2QyxtQkFDSCxVQUNBLFFBQ0EsWVBtQ3M1TTVGLEVBQTZCLFFPckd0Nk0rQyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbi8qKioqKiovIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbi8qKioqKiovIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA1KTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGV4cG9ydCAoaW1tdXRhYmxlKSAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IG9taXRLZXlzRnJvbVNvdXJjZU9iamVjdDtcbmZ1bmN0aW9uIG9taXRLZXlzRnJvbVNvdXJjZU9iamVjdChzb3VyY2Upe3ZhciBvbWl0dGVkS2V5cz1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMV06W107cmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIHJlbG9jYXRlQWNjZXB0ZWRLZXlzKGhhc2gsa2V5KXtpZihvbWl0dGVkS2V5cy5pbmRleE9mKGtleSk9PT0tMSl7aGFzaFtrZXldPXNvdXJjZVtrZXldO31yZXR1cm4gaGFzaDt9LHt9KTt9XG5cbi8qKiovIH0pLFxuLyogMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtYnV0dG9uXCIpO1xuXG4vKioqLyB9KSxcbi8qIDIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2xhc3NuYW1lc1wiKTtcblxuLyoqKi8gfSksXG4vKiAzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG4vKioqLyB9KSxcbi8qIDQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3QtZG9tXCIpO1xuXG4vKioqLyB9KSxcbi8qIDUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9kb21fXyA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX3JlYWN0X2RvbV9fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX3JlYWN0X2RvbV9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfY2xhc3NuYW1lc19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfY2xhc3NuYW1lc19fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2NsYXNzbmFtZXNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc19idXR0b25fXyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc19idXR0b25fX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfYnV0dG9uX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xudmFyIF9leHRlbmRzPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHRhcmdldCl7Zm9yKHZhciBpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyl7dmFyIHNvdXJjZT1hcmd1bWVudHNbaV07Zm9yKHZhciBrZXkgaW4gc291cmNlKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLGtleSkpe3RhcmdldFtrZXldPXNvdXJjZVtrZXldO319fXJldHVybiB0YXJnZXQ7fTt2YXIgX2NyZWF0ZUNsYXNzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQscHJvcHMpe2Zvcih2YXIgaT0wO2k8cHJvcHMubGVuZ3RoO2krKyl7dmFyIGRlc2NyaXB0b3I9cHJvcHNbaV07ZGVzY3JpcHRvci5lbnVtZXJhYmxlPWRlc2NyaXB0b3IuZW51bWVyYWJsZXx8ZmFsc2U7ZGVzY3JpcHRvci5jb25maWd1cmFibGU9dHJ1ZTtpZihcInZhbHVlXCJpbiBkZXNjcmlwdG9yKWRlc2NyaXB0b3Iud3JpdGFibGU9dHJ1ZTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LGRlc2NyaXB0b3Iua2V5LGRlc2NyaXB0b3IpO319cmV0dXJuIGZ1bmN0aW9uKENvbnN0cnVjdG9yLHByb3RvUHJvcHMsc3RhdGljUHJvcHMpe2lmKHByb3RvUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUscHJvdG9Qcm9wcyk7aWYoc3RhdGljUHJvcHMpZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3RvcixzdGF0aWNQcm9wcyk7cmV0dXJuIENvbnN0cnVjdG9yO307fSgpO2Z1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSxDb25zdHJ1Y3Rvcil7aWYoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTt9fWZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsY2FsbCl7aWYoIXNlbGYpe3Rocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTt9cmV0dXJuIGNhbGwmJih0eXBlb2YgY2FsbD09PVwib2JqZWN0XCJ8fHR5cGVvZiBjYWxsPT09XCJmdW5jdGlvblwiKT9jYWxsOnNlbGY7fWZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcyxzdXBlckNsYXNzKXtpZih0eXBlb2Ygc3VwZXJDbGFzcyE9PVwiZnVuY3Rpb25cIiYmc3VwZXJDbGFzcyE9PW51bGwpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiK3R5cGVvZiBzdXBlckNsYXNzKTt9c3ViQ2xhc3MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyYmc3VwZXJDbGFzcy5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTpzdWJDbGFzcyxlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9fSk7aWYoc3VwZXJDbGFzcylPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLHN1cGVyQ2xhc3MpOnN1YkNsYXNzLl9fcHJvdG9fXz1zdXBlckNsYXNzO312YXIgaXNGdW5jdGlvbj1mdW5jdGlvbiBpc0Z1bmN0aW9uKHgpe3JldHVybiB0eXBlb2YgeD09PSdmdW5jdGlvbic7fTt2YXIgU2VnbWVudGVkQ29udHJvbD1mdW5jdGlvbihfUmVhY3QkUHVyZUNvbXBvbmVudCl7X2luaGVyaXRzKFNlZ21lbnRlZENvbnRyb2wsX1JlYWN0JFB1cmVDb21wb25lbnQpO2Z1bmN0aW9uIFNlZ21lbnRlZENvbnRyb2woKXt2YXIgX3JlZjt2YXIgX3RlbXAsX3RoaXMsX3JldDtfY2xhc3NDYWxsQ2hlY2sodGhpcyxTZWdtZW50ZWRDb250cm9sKTtmb3IodmFyIF9sZW49YXJndW1lbnRzLmxlbmd0aCxhcmdzPUFycmF5KF9sZW4pLF9rZXk9MDtfa2V5PF9sZW47X2tleSsrKXthcmdzW19rZXldPWFyZ3VtZW50c1tfa2V5XTt9cmV0dXJuIF9yZXQ9KF90ZW1wPShfdGhpcz1fcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLChfcmVmPVNlZ21lbnRlZENvbnRyb2wuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoU2VnbWVudGVkQ29udHJvbCkpLmNhbGwuYXBwbHkoX3JlZixbdGhpc10uY29uY2F0KGFyZ3MpKSksX3RoaXMpLF90aGlzLnN0YXRlPXtpbmRleE9mT3B0aW9uSW5Gb2N1czpudWxsfSxfdGhpcy5oYW5kbGVLZXlEb3duPWZ1bmN0aW9uKGV2ZW50KXt2YXIga2V5PWV2ZW50LmtleTt2YXIgYWN0aXZlSXRlbUluZGV4PV90aGlzLnN0YXRlLmluZGV4T2ZPcHRpb25JbkZvY3VzO2lmKGtleT09PSdBcnJvd0xlZnQnKXtfdGhpcy5zZXRGb2N1cyhfdGhpcy5nZXRQcmV2aW91c09wdGlvbkluZGV4KGFjdGl2ZUl0ZW1JbmRleCkpO2V2ZW50LnByZXZlbnREZWZhdWx0KCk7fWVsc2UgaWYoa2V5PT09J0Fycm93UmlnaHQnKXtfdGhpcy5zZXRGb2N1cyhfdGhpcy5nZXROZXh0T3B0aW9uSW5kZXgoYWN0aXZlSXRlbUluZGV4KSk7ZXZlbnQucHJldmVudERlZmF1bHQoKTt9ZWxzZSBpZihrZXk9PT0nRW50ZXInKXtfdGhpcy5oYW5kbGVPcHRpb25DbGljayhfdGhpcy5wcm9wcy5vcHRpb25zW2FjdGl2ZUl0ZW1JbmRleF0pO2V2ZW50LnByZXZlbnREZWZhdWx0KCk7fWlmKGlzRnVuY3Rpb24oX3RoaXMucHJvcHMub25LZXlEb3duKSl7X3RoaXMucHJvcHMub25LZXlEb3duKGV2ZW50KTt9fSxfdGVtcCksX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsX3JldCk7fV9jcmVhdGVDbGFzcyhTZWdtZW50ZWRDb250cm9sLFt7a2V5OidjdXJyZW50VmFsdWUnLHZhbHVlOmZ1bmN0aW9uIGN1cnJlbnRWYWx1ZSgpe3ZhciB2YWx1ZT12b2lkIDA7dGhpcy5wcm9wcy5vcHRpb25zLnNvbWUoZnVuY3Rpb24ob3B0aW9uKXtpZihvcHRpb24uc2VsZWN0ZWQpe3ZhbHVlPW9wdGlvbi52YWx1ZTtyZXR1cm4gdHJ1ZTt9fSk7cmV0dXJuIHZhbHVlO319LHtrZXk6J3NldEZvY3VzJyx2YWx1ZTpmdW5jdGlvbiBzZXRGb2N1cyhpbmRleCl7X193ZWJwYWNrX3JlcXVpcmVfXy5pKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9yZWFjdF9kb21fX1tcImZpbmRET01Ob2RlXCJdKSh0aGlzLnJlZnNbJ29wdGlvbl8kJytpbmRleF0pLmZvY3VzKCk7fX0se2tleTonZ2V0TmV4dE9wdGlvbkluZGV4Jyx2YWx1ZTpmdW5jdGlvbiBnZXROZXh0T3B0aW9uSW5kZXgoY3VycmVudE9wdGlvbkluZGV4KXt2YXIgbmV4dD1jdXJyZW50T3B0aW9uSW5kZXgrMTtyZXR1cm4gbmV4dDx0aGlzLnByb3BzLm9wdGlvbnMubGVuZ3RoP25leHQ6MDt9fSx7a2V5OidnZXRQcmV2aW91c09wdGlvbkluZGV4Jyx2YWx1ZTpmdW5jdGlvbiBnZXRQcmV2aW91c09wdGlvbkluZGV4KGN1cnJlbnRPcHRpb25JbmRleCl7dmFyIHByZXZpb3VzPWN1cnJlbnRPcHRpb25JbmRleC0xO3JldHVybiBwcmV2aW91czwwP3RoaXMucHJvcHMub3B0aW9ucy5sZW5ndGgtMTpwcmV2aW91czt9fSx7a2V5OidoYW5kbGVPcHRpb25CbHVyJyx2YWx1ZTpmdW5jdGlvbiBoYW5kbGVPcHRpb25CbHVyKG9wdGlvbixldmVudCl7aWYodGhpcy5zdGF0ZS5pbmRleE9mT3B0aW9uSW5Gb2N1cz09PXRoaXMucHJvcHMub3B0aW9ucy5pbmRleE9mKG9wdGlvbikpe3RoaXMuc2V0U3RhdGUoe2luZGV4T2ZPcHRpb25JbkZvY3VzOm51bGx9KTt9aWYoaXNGdW5jdGlvbihvcHRpb24ub25CbHVyKSl7b3B0aW9uLm9uQmx1cihldmVudCk7fX19LHtrZXk6J2hhbmRsZU9wdGlvbkNsaWNrJyx2YWx1ZTpmdW5jdGlvbiBoYW5kbGVPcHRpb25DbGljayhvcHRpb24sZXZlbnQpe3RoaXMucHJvcHMub25PcHRpb25TZWxlY3RlZChvcHRpb24udmFsdWUpO2lmKGlzRnVuY3Rpb24ob3B0aW9uLm9uQ2xpY2spKXtvcHRpb24ub25DbGljayhldmVudCk7fX19LHtrZXk6J2hhbmRsZU9wdGlvbkZvY3VzJyx2YWx1ZTpmdW5jdGlvbiBoYW5kbGVPcHRpb25Gb2N1cyhvcHRpb24sZXZlbnQpe3RoaXMuc2V0U3RhdGUoe2luZGV4T2ZPcHRpb25JbkZvY3VzOnRoaXMucHJvcHMub3B0aW9ucy5pbmRleE9mKG9wdGlvbil9KTtpZihpc0Z1bmN0aW9uKG9wdGlvbi5vbkZvY3VzKSl7b3B0aW9uLm9uRm9jdXMoZXZlbnQpO319fSx7a2V5OidyZW5kZXJPcHRpb25zJyx2YWx1ZTpmdW5jdGlvbiByZW5kZXJPcHRpb25zKCl7dmFyIF90aGlzMj10aGlzO3JldHVybiB0aGlzLnByb3BzLm9wdGlvbnMubWFwKGZ1bmN0aW9uKGRlZmluaXRpb24saW5kZXgpe3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX2J1dHRvbl9fX2RlZmF1bHQuYSxfZXh0ZW5kcyh7fSxfX3dlYnBhY2tfcmVxdWlyZV9fLmkoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfX1tcImFcIiAvKiBkZWZhdWx0ICovXSkoZGVmaW5pdGlvbixTZWdtZW50ZWRDb250cm9sLmludGVybmFsQ2hpbGRLZXlzKSx7cm9sZToncmFkaW8nLCdhcmlhLWNoZWNrZWQnOlN0cmluZyhkZWZpbml0aW9uLnNlbGVjdGVkKSxyZWY6J29wdGlvbl8kJytpbmRleCxrZXk6ZGVmaW5pdGlvbi52YWx1ZSxjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2Itc2VnbWVudGVkLWNvbnRyb2wtb3B0aW9uJyxkZWZpbml0aW9uLmNsYXNzTmFtZSx7J2Itc2VnbWVudGVkLWNvbnRyb2wtb3B0aW9uLXNlbGVjdGVkJzpkZWZpbml0aW9uLnNlbGVjdGVkfSksdGFiSW5kZXg6ZGVmaW5pdGlvbi5zZWxlY3RlZD8nMCc6Jy0xJyxvbkJsdXI6X3RoaXMyLmhhbmRsZU9wdGlvbkJsdXIuYmluZChfdGhpczIsZGVmaW5pdGlvbiksb25QcmVzc2VkOl90aGlzMi5oYW5kbGVPcHRpb25DbGljay5iaW5kKF90aGlzMixkZWZpbml0aW9uKSxvbkZvY3VzOl90aGlzMi5oYW5kbGVPcHRpb25Gb2N1cy5iaW5kKF90aGlzMixkZWZpbml0aW9uKX0pLGRlZmluaXRpb24uY29udGVudCk7fSk7fX0se2tleToncmVuZGVyJyx2YWx1ZTpmdW5jdGlvbiByZW5kZXIoKXtyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoJ2RpdicsX2V4dGVuZHMoe30sX193ZWJwYWNrX3JlcXVpcmVfXy5pKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19bXCJhXCIgLyogZGVmYXVsdCAqL10pKHRoaXMucHJvcHMsU2VnbWVudGVkQ29udHJvbC5pbnRlcm5hbEtleXMpLHtyZWY6J3dyYXBwZXInLHJvbGU6J3JhZGlvZ3JvdXAnLGNsYXNzTmFtZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfY2xhc3NuYW1lc19fX2RlZmF1bHQoKSgnYi1zZWdtZW50ZWQtY29udHJvbCcsdGhpcy5wcm9wcy5jbGFzc05hbWUpLG9uS2V5RG93bjp0aGlzLmhhbmRsZUtleURvd259KSx0aGlzLnJlbmRlck9wdGlvbnMoKSk7fX1dKTtyZXR1cm4gU2VnbWVudGVkQ29udHJvbDt9KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5QdXJlQ29tcG9uZW50KTtTZWdtZW50ZWRDb250cm9sLnByb3BUeXBlcz17b25PcHRpb25TZWxlY3RlZDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jLG9wdGlvbnM6ZnVuY3Rpb24gdmFsaWRhdGVPcHRpb25zKHByb3BzKXtpZihwcm9wcy5vcHRpb25zLmxlbmd0aDwyKXt0aHJvdyBuZXcgRXJyb3IoJ011c3QgcHJvdmlkZSBhdCBsZWFzdCB0d28gb3B0aW9ucy4nKTt9dmFyIG1pc3NpbmdTZWxlY3RlZD1wcm9wcy5vcHRpb25zLnNvbWUoZnVuY3Rpb24ob3B0aW9uKXtpZighKCdzZWxlY3RlZCdpbiBvcHRpb24pKXtyZXR1cm4gdHJ1ZTt9fSk7aWYobWlzc2luZ1NlbGVjdGVkKXt0aHJvdyBuZXcgRXJyb3IoJ011c3QgcHJvdmlkZSBhIGBzZWxlY3RlZGAgcHJvcCBmb3IgZWFjaCBvcHRpb24uJyk7fXZhciBzZWVuU2VsZWN0ZWQ9ZmFsc2U7dmFyIG11bHRpcGxlU2VsZWN0ZWQ9cHJvcHMub3B0aW9ucy5zb21lKGZ1bmN0aW9uKG9wdGlvbil7aWYob3B0aW9uLnNlbGVjdGVkKXtpZihzZWVuU2VsZWN0ZWQpe3JldHVybiB0cnVlO31zZWVuU2VsZWN0ZWQ9dHJ1ZTt9fSk7aWYobXVsdGlwbGVTZWxlY3RlZCl7dGhyb3cgbmV3IEVycm9yKCdFbmNvdW50ZXJlZCBtdWx0aXBsZSBvcHRpb25zIHdpdGggYHNlbGVjdGVkOiB0cnVlYC4gVGhlcmUgY2FuIGJlIG9ubHkgb25lLicpO31pZihwcm9wcy5vcHRpb25zLnNvbWUoZnVuY3Rpb24ob3B0aW9uKXtyZXR1cm4gdHlwZW9mIG9wdGlvbi52YWx1ZT09PSd1bmRlZmluZWQnO30pKXt0aHJvdyBuZXcgRXJyb3IoJ011c3QgcHJvdmlkZSBhIGB2YWx1ZWAgcHJvcCBmb3IgZWFjaCBvcHRpb24uJyk7fX19O1NlZ21lbnRlZENvbnRyb2wuZGVmYXVsdFByb3BzPXtvbk9wdGlvblNlbGVjdGVkOmZ1bmN0aW9uIG9uT3B0aW9uU2VsZWN0ZWQoKXt9LG9wdGlvbnM6W119O1NlZ21lbnRlZENvbnRyb2wuaW50ZXJuYWxLZXlzPU9iamVjdC5rZXlzKFNlZ21lbnRlZENvbnRyb2wuZGVmYXVsdFByb3BzKTtTZWdtZW50ZWRDb250cm9sLmludGVybmFsQ2hpbGRLZXlzPVsnY29udGVudCcsJ3ZhbHVlJywnc2VsZWN0ZWQnXTsvKiBoYXJtb255IGRlZmF1bHQgZXhwb3J0ICovIF9fd2VicGFja19leHBvcnRzX19bXCJkZWZhdWx0XCJdID0gU2VnbWVudGVkQ29udHJvbDtcblxuLyoqKi8gfSlcbi8qKioqKiovIF0pO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBpbmRleC5qcyIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDUpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIDUwMDMxYzEwZWJkMWYxZDZhN2U1IiwiLyoqXG4gKiBSZXR1cm5zIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgc3VwcGxpZWQgb2JqZWN0IHdpdGhvdXQgdGhlIGdpdmVuIGtleXMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG9taXRLZXlzRnJvbVNvdXJjZU9iamVjdChzb3VyY2UsIG9taXR0ZWRLZXlzID0gW10pIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc291cmNlKS5yZWR1Y2UoZnVuY3Rpb24gcmVsb2NhdGVBY2NlcHRlZEtleXMoaGFzaCwga2V5KSB7XG4gICAgICAgIGlmIChvbWl0dGVkS2V5cy5pbmRleE9mKGtleSkgPT09IC0xKSB7XG4gICAgICAgICAgICBoYXNoW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYXNoO1xuICAgIH0sIHt9KTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMvaW5kZXguanMiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtYnV0dG9uXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLWJ1dHRvblwifVxuLy8gbW9kdWxlIGlkID0gMVxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiY2xhc3NuYW1lc1wifVxuLy8gbW9kdWxlIGlkID0gMlxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0XCJ9XG4vLyBtb2R1bGUgaWQgPSAzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0LWRvbVwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0LWRvbVwifVxuLy8gbW9kdWxlIGlkID0gNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgUmVhY3QsIHtQcm9wVHlwZXN9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7ZmluZERPTU5vZGV9IGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgY3ggZnJvbSAnY2xhc3NuYW1lcyc7XG5cbmltcG9ydCBCdXR0b24gZnJvbSAnYm91bmRsZXNzLWJ1dHRvbic7XG5pbXBvcnQgb21pdCBmcm9tICdib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzJztcblxuY29uc3QgaXNGdW5jdGlvbiA9ICh4KSA9PiB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJztcblxuLyoqXG4jIFNlZ21lbnRlZENvbnRyb2xcbl9fQSBjb250cm9sIGNvbnRhaW5pbmcgbXVsdGlwbGUgYnV0dG9ucywgb25seSBvbmUgb2Ygd2hpY2ggY2FuIGJlIGFjdGl2ZSBhdCBhIHRpbWUuX19cblxuU2VnbWVudGVkQ29udHJvbCBpcyBpbXBsZW1lbnRlZCBhcyBhIFwiY29udHJvbGxlZCBjb21wb25lbnRcIiwgbWVhbmluZyBpdCBpcyBhIGRpcmVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgZGF0YSBwYXNzZWQgaW5zaWRlLiBVc2VyIGludGVyYWN0aW9uIHdpbGwgYnViYmxlIGNoYW5nZXMgaW4gdGhlIGZvcm0gb2YgYG9uT3B0aW9uU2VsZWN0ZWRgIHRoYXQgYSBjb250cm9sbGVyIHZpZXcgbXVzdCBpbnRlcmNlcHQgYW5kIGFwcGx5IGFnYWluc3QgdGhlIGRhdGEgcHJvdmlkZXIuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlZ21lbnRlZENvbnRyb2wgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgICAvKipcbiAgICAgICAgICogY2FsbGVkIHdoZW4gYSBjaGlsZCBlbGVtZW50IGJlY29tZXMgc2VsZWN0ZWQ7IGJhY2tpbmcgZGF0YSBtdXN0IGJlIHVwZGF0ZWQgdG8gcGVyc2lzdCB0aGUgc3RhdGUgY2hhbmdlXG4gICAgICAgICAqL1xuICAgICAgICBvbk9wdGlvblNlbGVjdGVkOiBQcm9wVHlwZXMuZnVuYyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogdGhlIGJhY2tpbmcgZGF0YSBmb3IgdGhlIHNlZ21lbnRzIG9mIHRoZSByZW5kZXJlZCBjb250cm9sXG5cbiAgICAgICAgICogPiBfX1ZhbGlkYXRpb24gQ3JpdGVyaWE6X19cbiAgICAgICAgICogPlxuICAgICAgICAgKiA+IDEuIFRoZXJlIG11c3QgYmUgYXQgbGVhc3QgdHdvIGBvcHRpb25zYCAoYSBzZWdtZW50ZWQgY29udHJvbCB3aXRoIG9uZSBidXR0b24gaXMgbm90IGFsbG93ZWQpXG4gICAgICAgICAqID4gMS4gVGhlcmUgbXVzdCBvbmx5IGJlIG9uZSBgb3B0aW9uYCB3aG9zZSBgc2VsZWN0ZWRgIGF0dHJpYnV0ZSBpcyBgdHJ1ZWAgKG11bHRpcGxlIHNlbGVjdGlvbnMgYXJlIG5vdCBhbGxvd2VkKVxuICAgICAgICAgKiA+IDEuIEVhY2ggYHZhbHVlYCBhdHRyaWJ1dGUgbXVzdCBiZSB1bmlxdWUgYWNyb3NzIHRoZSBzZXQgb2YgYG9wdGlvbnNgXG5cbiAgICAgICAgICogLSBfX29wdGlvbnNbXS5zZWxlY3RlZF9fIGBCb29sZWFuYFxuICAgICAgICAgKiAtIF9fb3B0aW9uc1tdLnZhbHVlX18gYFN0cmluZ2BcbiAgICAgICAgICogLSBfX29wdGlvbnNbXS5jb250ZW50X18gYCpgXG4gICAgICAgICAgICogdGhlIGNvbnRlbnQgdG8gZ28gaW5zaWRlIHRoZSBidXR0b25cbiAgICAgICAgICovXG4gICAgICAgIG9wdGlvbnM6IGZ1bmN0aW9uIHZhbGlkYXRlT3B0aW9ucyhwcm9wcykge1xuICAgICAgICAgICAgaWYgKHByb3BzLm9wdGlvbnMubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBwcm92aWRlIGF0IGxlYXN0IHR3byBvcHRpb25zLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtaXNzaW5nU2VsZWN0ZWQgPSBwcm9wcy5vcHRpb25zLnNvbWUoKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghKCdzZWxlY3RlZCcgaW4gb3B0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKG1pc3NpbmdTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBwcm92aWRlIGEgYHNlbGVjdGVkYCBwcm9wIGZvciBlYWNoIG9wdGlvbi4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHNlZW5TZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgbXVsdGlwbGVTZWxlY3RlZCA9IHByb3BzLm9wdGlvbnMuc29tZSgob3B0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbi5zZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VlblNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHNlZW5TZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChtdWx0aXBsZVNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNvdW50ZXJlZCBtdWx0aXBsZSBvcHRpb25zIHdpdGggYHNlbGVjdGVkOiB0cnVlYC4gVGhlcmUgY2FuIGJlIG9ubHkgb25lLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvcHMub3B0aW9ucy5zb21lKChvcHRpb24pID0+IHR5cGVvZiBvcHRpb24udmFsdWUgPT09ICd1bmRlZmluZWQnKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBwcm92aWRlIGEgYHZhbHVlYCBwcm9wIGZvciBlYWNoIG9wdGlvbi4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9XG5cbiAgICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgICBvbk9wdGlvblNlbGVjdGVkOiAoKSA9PiB7fSxcbiAgICAgICAgb3B0aW9uczogW10sXG4gICAgfVxuXG4gICAgc3RhdGljIGludGVybmFsS2V5cyA9IE9iamVjdC5rZXlzKFNlZ21lbnRlZENvbnRyb2wuZGVmYXVsdFByb3BzKVxuICAgIHN0YXRpYyBpbnRlcm5hbENoaWxkS2V5cyA9IFtcbiAgICAgICAgJ2NvbnRlbnQnLFxuICAgICAgICAndmFsdWUnLFxuICAgICAgICAnc2VsZWN0ZWQnLFxuICAgIF1cblxuICAgIHN0YXRlID0ge1xuICAgICAgICBpbmRleE9mT3B0aW9uSW5Gb2N1czogbnVsbCxcbiAgICB9XG5cbiAgICBjdXJyZW50VmFsdWUoKSB7XG4gICAgICAgIGxldCB2YWx1ZTtcblxuICAgICAgICB0aGlzLnByb3BzLm9wdGlvbnMuc29tZSgob3B0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAob3B0aW9uLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBvcHRpb24udmFsdWU7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHNldEZvY3VzKGluZGV4KSB7XG4gICAgICAgIGZpbmRET01Ob2RlKHRoaXMucmVmc1snb3B0aW9uXyQnICsgaW5kZXhdKS5mb2N1cygpO1xuICAgIH1cblxuICAgIGdldE5leHRPcHRpb25JbmRleChjdXJyZW50T3B0aW9uSW5kZXgpIHtcbiAgICAgICAgbGV0IG5leHQgPSBjdXJyZW50T3B0aW9uSW5kZXggKyAxO1xuXG4gICAgICAgIHJldHVybiBuZXh0IDwgdGhpcy5wcm9wcy5vcHRpb25zLmxlbmd0aCA/IG5leHQgOiAwO1xuICAgIH1cblxuICAgIGdldFByZXZpb3VzT3B0aW9uSW5kZXgoY3VycmVudE9wdGlvbkluZGV4KSB7XG4gICAgICAgIGxldCBwcmV2aW91cyA9IGN1cnJlbnRPcHRpb25JbmRleCAtIDE7XG5cbiAgICAgICAgcmV0dXJuIHByZXZpb3VzIDwgMCA/IHRoaXMucHJvcHMub3B0aW9ucy5sZW5ndGggLSAxIDogcHJldmlvdXM7XG4gICAgfVxuXG4gICAgaGFuZGxlT3B0aW9uQmx1cihvcHRpb24sIGV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmluZGV4T2ZPcHRpb25JbkZvY3VzID09PSB0aGlzLnByb3BzLm9wdGlvbnMuaW5kZXhPZihvcHRpb24pKSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtpbmRleE9mT3B0aW9uSW5Gb2N1czogbnVsbH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24ob3B0aW9uLm9uQmx1cikpIHtcbiAgICAgICAgICAgIG9wdGlvbi5vbkJsdXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlT3B0aW9uQ2xpY2sob3B0aW9uLCBldmVudCkge1xuICAgICAgICB0aGlzLnByb3BzLm9uT3B0aW9uU2VsZWN0ZWQob3B0aW9uLnZhbHVlKTtcblxuICAgICAgICBpZiAoaXNGdW5jdGlvbihvcHRpb24ub25DbGljaykpIHtcbiAgICAgICAgICAgIG9wdGlvbi5vbkNsaWNrKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZU9wdGlvbkZvY3VzKG9wdGlvbiwgZXZlbnQpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7aW5kZXhPZk9wdGlvbkluRm9jdXM6IHRoaXMucHJvcHMub3B0aW9ucy5pbmRleE9mKG9wdGlvbil9KTtcblxuICAgICAgICBpZiAoaXNGdW5jdGlvbihvcHRpb24ub25Gb2N1cykpIHtcbiAgICAgICAgICAgIG9wdGlvbi5vbkZvY3VzKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZUtleURvd24gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gZXZlbnQua2V5O1xuICAgICAgICBjb25zdCBhY3RpdmVJdGVtSW5kZXggPSB0aGlzLnN0YXRlLmluZGV4T2ZPcHRpb25JbkZvY3VzO1xuXG4gICAgICAgIGlmIChrZXkgPT09ICdBcnJvd0xlZnQnKSB7XG4gICAgICAgICAgICB0aGlzLnNldEZvY3VzKHRoaXMuZ2V0UHJldmlvdXNPcHRpb25JbmRleChhY3RpdmVJdGVtSW5kZXgpKTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnQXJyb3dSaWdodCcpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Rm9jdXModGhpcy5nZXROZXh0T3B0aW9uSW5kZXgoYWN0aXZlSXRlbUluZGV4KSk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ0VudGVyJykge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVPcHRpb25DbGljayh0aGlzLnByb3BzLm9wdGlvbnNbYWN0aXZlSXRlbUluZGV4XSk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpcy5wcm9wcy5vbktleURvd24pKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uS2V5RG93bihldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXJPcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5vcHRpb25zLm1hcCgoZGVmaW5pdGlvbiwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB7Li4ub21pdChkZWZpbml0aW9uLCBTZWdtZW50ZWRDb250cm9sLmludGVybmFsQ2hpbGRLZXlzKX1cbiAgICAgICAgICAgICAgICAgICAgcm9sZT0ncmFkaW8nXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtY2hlY2tlZD17U3RyaW5nKGRlZmluaXRpb24uc2VsZWN0ZWQpfVxuICAgICAgICAgICAgICAgICAgICByZWY9eydvcHRpb25fJCcgKyBpbmRleH1cbiAgICAgICAgICAgICAgICAgICAga2V5PXtkZWZpbml0aW9uLnZhbHVlfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KCdiLXNlZ21lbnRlZC1jb250cm9sLW9wdGlvbicsIGRlZmluaXRpb24uY2xhc3NOYW1lLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnYi1zZWdtZW50ZWQtY29udHJvbC1vcHRpb24tc2VsZWN0ZWQnOiBkZWZpbml0aW9uLnNlbGVjdGVkLFxuICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgICAgdGFiSW5kZXg9e2RlZmluaXRpb24uc2VsZWN0ZWQgPyAnMCcgOiAnLTEnfVxuICAgICAgICAgICAgICAgICAgICBvbkJsdXI9e3RoaXMuaGFuZGxlT3B0aW9uQmx1ci5iaW5kKHRoaXMsIGRlZmluaXRpb24pfVxuICAgICAgICAgICAgICAgICAgICBvblByZXNzZWQ9e3RoaXMuaGFuZGxlT3B0aW9uQ2xpY2suYmluZCh0aGlzLCBkZWZpbml0aW9uKX1cbiAgICAgICAgICAgICAgICAgICAgb25Gb2N1cz17dGhpcy5oYW5kbGVPcHRpb25Gb2N1cy5iaW5kKHRoaXMsIGRlZmluaXRpb24pfT5cbiAgICAgICAgICAgICAgICAgICAge2RlZmluaXRpb24uY29udGVudH1cbiAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICB7Li4ub21pdCh0aGlzLnByb3BzLCBTZWdtZW50ZWRDb250cm9sLmludGVybmFsS2V5cyl9XG4gICAgICAgICAgICAgICAgcmVmPSd3cmFwcGVyJ1xuICAgICAgICAgICAgICAgIHJvbGU9J3JhZGlvZ3JvdXAnXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjeCgnYi1zZWdtZW50ZWQtY29udHJvbCcsIHRoaXMucHJvcHMuY2xhc3NOYW1lKX1cbiAgICAgICAgICAgICAgICBvbktleURvd249e3RoaXMuaGFuZGxlS2V5RG93bn0+XG4gICAgICAgICAgICAgICAge3RoaXMucmVuZGVyT3B0aW9ucygpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvYm91bmRsZXNzLXNlZ21lbnRlZC1jb250cm9sL2luZGV4LmpzIl0sInNvdXJjZVJvb3QiOiIifQ== | ||
module.exports=function(e){function t(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,o){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:o})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=5)}([function(e,t){e.exports=require("boundless-arrow-key-navigation")},function(e,t){e.exports=require("boundless-button")},function(e,t){e.exports=require("boundless-utils-omit-keys")},function(e,t){e.exports=require("classnames")},function(e,t){e.exports=require("react")},function(e,t,n){"use strict";function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function i(e,t){for(var n=void 0,o=0,r=e.length;o<r;o+=1)if(t(e[o])){n=o;break}return n}Object.defineProperty(t,"__esModule",{value:!0});var p=n(4),c=n.n(p),a=n(3),l=n.n(a),u=n(0),d=n.n(u),f=n(1),y=n.n(f),x=n(2),O=n.n(x),h=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},b=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,n,o){return n&&e(t.prototype,n),o&&e(t,o),t}}(),m=function(e){function t(){var e,n,s,p;o(this,t);for(var c=arguments.length,a=Array(c),l=0;l<c;l++)a[l]=arguments[l];return n=s=r(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(a))),s.state={selectedIndex:null},s.handleOptionSelection=function(e){var t=Array.prototype.indexOf.call(e.target.parentElement.children,e.target);s.state.selectedIndex!==t&&s.setState({selectedIndex:t},function(){s.props.onOptionSelected(s.props.options[s.state.selectedIndex],s.state.selectedIndex)})},s.getSelectedOption=function(){return s.props.options[s.state.selectedIndex]},s.getSelectedOptionIndex=function(){return s.state.selectedIndex},s.selectOption=function(e){return s.setState({selectedIndex:s.props.options.indexOf(e)})},s.selectOptionByKey=function(e,t){return s.setState({selectedIndex:i(s.props.options,function(n){return n[e]===t})})},s.selectOptionIndex=function(e){return s.setState({selectedIndex:e})},p=n,r(s,p)}return s(t,e),b(t,[{key:"inferSelectedOptionIndex",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.props,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.state;return i(e.options,function(e){return e.pressed})||t.selectedIndex}},{key:"componentWillMount",value:function(){this.setState({selectedIndex:this.inferSelectedOptionIndex()||this.props.defaultOptionSelectedIndex})}},{key:"componentWillReceiveProps",value:function(e){e.options!==this.props.options&&this.setState({selectedIndex:this.inferSelectedOptionIndex(e)})}},{key:"render",value:function(){var e=this;return c.a.createElement(d.a,h({},O()(this.props,t.internalKeys),{role:"radiogroup",className:l()("b-segmented-control",this.props.className),mode:d.a.mode.HORIZONTAL}),this.props.options.map(function(t,n){return c.a.createElement(y.a,h({},t,{key:t.key||n,"aria-checked":n===e.state.selectedIndex,component:t.component||e.props.optionComponent,className:l()("b-segmented-control-option",t.className,{"b-segmented-control-option-selected":n===e.state.selectedIndex}),onPressed:e.handleOptionSelection,pressed:n===e.state.selectedIndex,role:"radio"}),t.children)}))}}]),t}(c.a.PureComponent);m.propTypes={"*":p.PropTypes.any,defaultOptionSelectedIndex:p.PropTypes.number,onOptionSelected:p.PropTypes.func,optionComponent:p.PropTypes.oneOfType([p.PropTypes.string,p.PropTypes.func]),options:p.PropTypes.arrayOf(p.PropTypes.shape({"*":p.PropTypes.any,children:p.PropTypes.node})).isRequired},m.defaultProps={defaultOptionSelectedIndex:0,onOptionSelected:function(){},optionComponent:"button",options:[]},m.internalKeys=Object.keys(m.defaultProps),t.default=m}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIDgzOGFkMzg1NTNmZWYyNmE1OGFhIiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy1hcnJvdy1rZXktbmF2aWdhdGlvblwifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtYnV0dG9uXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiY2xhc3NuYW1lc1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdFwifSIsIndlYnBhY2s6Ly8vLi9wYWNrYWdlcy9ib3VuZGxlc3Mtc2VnbWVudGVkLWNvbnRyb2wvaW5kZXguanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJ2YWx1ZSIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwicmVxdWlyZSIsIl9fd2VicGFja19leHBvcnRzX18iLCJfY2xhc3NDYWxsQ2hlY2siLCJpbnN0YW5jZSIsIkNvbnN0cnVjdG9yIiwiVHlwZUVycm9yIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJzZWxmIiwiUmVmZXJlbmNlRXJyb3IiLCJfaW5oZXJpdHMiLCJzdWJDbGFzcyIsInN1cGVyQ2xhc3MiLCJjcmVhdGUiLCJjb25zdHJ1Y3RvciIsIndyaXRhYmxlIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJmaW5kSW5kZXgiLCJhcnIiLCJ0ZXN0IiwiZm91bmQiLCJsZW4iLCJsZW5ndGgiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc19hcnJvd19rZXlfbmF2aWdhdGlvbl9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc19hcnJvd19rZXlfbmF2aWdhdGlvbl9fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX2J1dHRvbl9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc19idXR0b25fX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCIsIl9leHRlbmRzIiwiYXNzaWduIiwidGFyZ2V0IiwiYXJndW1lbnRzIiwic291cmNlIiwia2V5IiwiX2NyZWF0ZUNsYXNzIiwiZGVmaW5lUHJvcGVydGllcyIsInByb3BzIiwiZGVzY3JpcHRvciIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsIlNlZ21lbnRlZENvbnRyb2wiLCJfUmVhY3QkUHVyZUNvbXBvbmVudCIsIl9yZWYiLCJfdGVtcCIsIl90aGlzIiwiX3JldCIsInRoaXMiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImdldFByb3RvdHlwZU9mIiwiYXBwbHkiLCJjb25jYXQiLCJzdGF0ZSIsInNlbGVjdGVkSW5kZXgiLCJoYW5kbGVPcHRpb25TZWxlY3Rpb24iLCJldmVudCIsImluZGV4IiwiaW5kZXhPZiIsInBhcmVudEVsZW1lbnQiLCJjaGlsZHJlbiIsInNldFN0YXRlIiwib25PcHRpb25TZWxlY3RlZCIsIm9wdGlvbnMiLCJnZXRTZWxlY3RlZE9wdGlvbiIsImdldFNlbGVjdGVkT3B0aW9uSW5kZXgiLCJzZWxlY3RPcHRpb24iLCJvcHRpb24iLCJzZWxlY3RPcHRpb25CeUtleSIsImsiLCJ2Iiwic2VsZWN0T3B0aW9uSW5kZXgiLCJ1bmRlZmluZWQiLCJwcmVzc2VkIiwiaW5mZXJTZWxlY3RlZE9wdGlvbkluZGV4IiwiZGVmYXVsdE9wdGlvblNlbGVjdGVkSW5kZXgiLCJuZXh0UHJvcHMiLCJfdGhpczIiLCJhIiwiY3JlYXRlRWxlbWVudCIsImludGVybmFsS2V5cyIsInJvbGUiLCJjbGFzc05hbWUiLCJtb2RlIiwiSE9SSVpPTlRBTCIsIm1hcCIsImFyaWEtY2hlY2tlZCIsImNvbXBvbmVudCIsIm9wdGlvbkNvbXBvbmVudCIsImItc2VnbWVudGVkLWNvbnRyb2wtb3B0aW9uLXNlbGVjdGVkIiwib25QcmVzc2VkIiwiUHVyZUNvbXBvbmVudCIsInByb3BUeXBlcyIsIioiLCJhbnkiLCJudW1iZXIiLCJmdW5jIiwib25lT2ZUeXBlIiwic3RyaW5nIiwiYXJyYXlPZiIsInNoYXBlIiwibm9kZSIsImlzUmVxdWlyZWQiLCJkZWZhdWx0UHJvcHMiLCJrZXlzIl0sIm1hcHBpbmdzIjoiQUFBQUEsT0FBT0MsUUFDRSxTQUFVQyxHQ0duQixRQUFBQyxHQUFBQyxHQUdBLEdBQUFDLEVBQUFELEdBQ0EsTUFBQUMsR0FBQUQsR0FBQUgsT0FHQSxJQUFBRCxHQUFBSyxFQUFBRCxJQUNBRSxFQUFBRixFQUNBRyxHQUFBLEVBQ0FOLFdBVUEsT0FOQUMsR0FBQUUsR0FBQUksS0FBQVIsRUFBQUMsUUFB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SUFBSzVFLEVBQUEsVUFBVTZFLElBQ2ZsQyxTQUFVM0MsRUFBQSxVQUFVb0YsUUFFMUJDLFlBaERXL0QsRUFtRFZnRSxjQUNINUIsMkJBQTRCLEVBQzVCYixpQkFBa0IsYUFDbEIwQixnQkFBaUIsU0FDakJ6QixZQXZEYXhCLEVBMERWeUMsYUFBZW5HLE9BQU8ySCxLQUFLakUsRUFBaUJnRSxjUG1CaXlMNUcsRUFBNkIsUU83RWgyTDRDIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPVxuLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbi8qKioqKiovIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuLyoqKioqKi8gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuLyoqKioqKi8gXHRcdFx0XHRnZXQ6IGdldHRlclxuLyoqKioqKi8gXHRcdFx0fSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4vKioqKioqLyBcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDUpO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtYXJyb3cta2V5LW5hdmlnYXRpb25cIik7XG5cbi8qKiovIH0pLFxuLyogMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtYnV0dG9uXCIpO1xuXG4vKioqLyB9KSxcbi8qIDIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXV0aWxzLW9taXQta2V5c1wiKTtcblxuLyoqKi8gfSksXG4vKiAzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNsYXNzbmFtZXNcIik7XG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcblxuLyoqKi8gfSksXG4vKiA1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KF9fd2VicGFja19leHBvcnRzX18sIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc19hcnJvd19rZXlfbmF2aWdhdGlvbl9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX2Fycm93X2tleV9uYXZpZ2F0aW9uX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX2Fycm93X2tleV9uYXZpZ2F0aW9uX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfYnV0dG9uX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfYnV0dG9uX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX2J1dHRvbl9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyk7XG52YXIgX2V4dGVuZHM9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odGFyZ2V0KXtmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXt2YXIgc291cmNlPWFyZ3VtZW50c1tpXTtmb3IodmFyIGtleSBpbiBzb3VyY2Upe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2Usa2V5KSl7dGFyZ2V0W2tleV09c291cmNlW2tleV07fX19cmV0dXJuIHRhcmdldDt9O3ZhciBfY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCxwcm9wcyl7Zm9yKHZhciBpPTA7aTxwcm9wcy5sZW5ndGg7aSsrKXt2YXIgZGVzY3JpcHRvcj1wcm9wc1tpXTtkZXNjcmlwdG9yLmVudW1lcmFibGU9ZGVzY3JpcHRvci5lbnVtZXJhYmxlfHxmYWxzZTtkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZT10cnVlO2lmKFwidmFsdWVcImluIGRlc2NyaXB0b3IpZGVzY3JpcHRvci53cml0YWJsZT10cnVlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsZGVzY3JpcHRvci5rZXksZGVzY3JpcHRvcik7fX1yZXR1cm4gZnVuY3Rpb24oQ29uc3RydWN0b3IscHJvdG9Qcm9wcyxzdGF0aWNQcm9wcyl7aWYocHJvdG9Qcm9wcylkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSxwcm90b1Byb3BzKTtpZihzdGF0aWNQcm9wcylkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLHN0YXRpY1Byb3BzKTtyZXR1cm4gQ29uc3RydWN0b3I7fTt9KCk7ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLENvbnN0cnVjdG9yKXtpZighKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO319ZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZixjYWxsKXtpZighc2VsZil7dGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO31yZXR1cm4gY2FsbCYmKHR5cGVvZiBjYWxsPT09XCJvYmplY3RcInx8dHlwZW9mIGNhbGw9PT1cImZ1bmN0aW9uXCIpP2NhbGw6c2VsZjt9ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLHN1cGVyQ2xhc3Mpe2lmKHR5cGVvZiBzdXBlckNsYXNzIT09XCJmdW5jdGlvblwiJiZzdXBlckNsYXNzIT09bnVsbCl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIrdHlwZW9mIHN1cGVyQ2xhc3MpO31zdWJDbGFzcy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzJiZzdXBlckNsYXNzLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnN1YkNsYXNzLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX19KTtpZihzdXBlckNsYXNzKU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3Msc3VwZXJDbGFzcyk6c3ViQ2xhc3MuX19wcm90b19fPXN1cGVyQ2xhc3M7fWZ1bmN0aW9uIGZpbmRJbmRleChhcnIsdGVzdCl7dmFyIGZvdW5kPXZvaWQgMDtmb3IodmFyIGk9MCxsZW49YXJyLmxlbmd0aDtpPGxlbjtpKz0xKXtpZih0ZXN0KGFycltpXSkpe2ZvdW5kPWk7YnJlYWs7fX1yZXR1cm4gZm91bmQ7fXZhciBTZWdtZW50ZWRDb250cm9sPWZ1bmN0aW9uKF9SZWFjdCRQdXJlQ29tcG9uZW50KXtfaW5oZXJpdHMoU2VnbWVudGVkQ29udHJvbCxfUmVhY3QkUHVyZUNvbXBvbmVudCk7ZnVuY3Rpb24gU2VnbWVudGVkQ29udHJvbCgpe3ZhciBfcmVmO3ZhciBfdGVtcCxfdGhpcyxfcmV0O19jbGFzc0NhbGxDaGVjayh0aGlzLFNlZ21lbnRlZENvbnRyb2wpO2Zvcih2YXIgX2xlbj1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkoX2xlbiksX2tleT0wO19rZXk8X2xlbjtfa2V5Kyspe2FyZ3NbX2tleV09YXJndW1lbnRzW19rZXldO31yZXR1cm4gX3JldD0oX3RlbXA9KF90aGlzPV9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKF9yZWY9U2VnbWVudGVkQ29udHJvbC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihTZWdtZW50ZWRDb250cm9sKSkuY2FsbC5hcHBseShfcmVmLFt0aGlzXS5jb25jYXQoYXJncykpKSxfdGhpcyksX3RoaXMuc3RhdGU9e3NlbGVjdGVkSW5kZXg6bnVsbH0sX3RoaXMuaGFuZGxlT3B0aW9uU2VsZWN0aW9uPWZ1bmN0aW9uKGV2ZW50KXt2YXIgaW5kZXg9QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChldmVudC50YXJnZXQucGFyZW50RWxlbWVudC5jaGlsZHJlbixldmVudC50YXJnZXQpO2lmKF90aGlzLnN0YXRlLnNlbGVjdGVkSW5kZXghPT1pbmRleCl7X3RoaXMuc2V0U3RhdGUoe3NlbGVjdGVkSW5kZXg6aW5kZXh9LGZ1bmN0aW9uKCl7X3RoaXMucHJvcHMub25PcHRpb25TZWxlY3RlZChfdGhpcy5wcm9wcy5vcHRpb25zW190aGlzLnN0YXRlLnNlbGVjdGVkSW5kZXhdLF90aGlzLnN0YXRlLnNlbGVjdGVkSW5kZXgpO30pO319LF90aGlzLmdldFNlbGVjdGVkT3B0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIF90aGlzLnByb3BzLm9wdGlvbnNbX3RoaXMuc3RhdGUuc2VsZWN0ZWRJbmRleF07fSxfdGhpcy5nZXRTZWxlY3RlZE9wdGlvbkluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIF90aGlzLnN0YXRlLnNlbGVjdGVkSW5kZXg7fSxfdGhpcy5zZWxlY3RPcHRpb249ZnVuY3Rpb24ob3B0aW9uKXtyZXR1cm4gX3RoaXMuc2V0U3RhdGUoe3NlbGVjdGVkSW5kZXg6X3RoaXMucHJvcHMub3B0aW9ucy5pbmRleE9mKG9wdGlvbil9KTt9LF90aGlzLnNlbGVjdE9wdGlvbkJ5S2V5PWZ1bmN0aW9uKGssdil7cmV0dXJuIF90aGlzLnNldFN0YXRlKHtzZWxlY3RlZEluZGV4OmZpbmRJbmRleChfdGhpcy5wcm9wcy5vcHRpb25zLGZ1bmN0aW9uKG9wdGlvbil7cmV0dXJuIG9wdGlvbltrXT09PXY7fSl9KTt9LF90aGlzLnNlbGVjdE9wdGlvbkluZGV4PWZ1bmN0aW9uKGluZGV4KXtyZXR1cm4gX3RoaXMuc2V0U3RhdGUoe3NlbGVjdGVkSW5kZXg6aW5kZXh9KTt9LF90ZW1wKSxfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcyxfcmV0KTt9X2NyZWF0ZUNsYXNzKFNlZ21lbnRlZENvbnRyb2wsW3trZXk6J2luZmVyU2VsZWN0ZWRPcHRpb25JbmRleCcsdmFsdWU6ZnVuY3Rpb24gaW5mZXJTZWxlY3RlZE9wdGlvbkluZGV4KCl7dmFyIHByb3BzPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dW5kZWZpbmVkP2FyZ3VtZW50c1swXTp0aGlzLnByb3BzO3ZhciBzdGF0ZT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXVuZGVmaW5lZD9hcmd1bWVudHNbMV06dGhpcy5zdGF0ZTtyZXR1cm4gZmluZEluZGV4KHByb3BzLm9wdGlvbnMsZnVuY3Rpb24ob3B0aW9uKXtyZXR1cm4gb3B0aW9uLnByZXNzZWQ7fSl8fHN0YXRlLnNlbGVjdGVkSW5kZXg7fX0se2tleTonY29tcG9uZW50V2lsbE1vdW50Jyx2YWx1ZTpmdW5jdGlvbiBjb21wb25lbnRXaWxsTW91bnQoKXt0aGlzLnNldFN0YXRlKHtzZWxlY3RlZEluZGV4OnRoaXMuaW5mZXJTZWxlY3RlZE9wdGlvbkluZGV4KCl8fHRoaXMucHJvcHMuZGVmYXVsdE9wdGlvblNlbGVjdGVkSW5kZXh9KTt9fSx7a2V5Oidjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJyx2YWx1ZTpmdW5jdGlvbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcyl7aWYobmV4dFByb3BzLm9wdGlvbnMhPT10aGlzLnByb3BzLm9wdGlvbnMpe3RoaXMuc2V0U3RhdGUoe3NlbGVjdGVkSW5kZXg6dGhpcy5pbmZlclNlbGVjdGVkT3B0aW9uSW5kZXgobmV4dFByb3BzKX0pO319fSx7a2V5OidyZW5kZXInLHZhbHVlOmZ1bmN0aW9uIHJlbmRlcigpe3ZhciBfdGhpczI9dGhpcztyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc19hcnJvd19rZXlfbmF2aWdhdGlvbl9fX2RlZmF1bHQuYSxfZXh0ZW5kcyh7fSxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fX2RlZmF1bHQoKSh0aGlzLnByb3BzLFNlZ21lbnRlZENvbnRyb2wuaW50ZXJuYWxLZXlzKSx7cm9sZToncmFkaW9ncm91cCcsY2xhc3NOYW1lOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCgpKCdiLXNlZ21lbnRlZC1jb250cm9sJyx0aGlzLnByb3BzLmNsYXNzTmFtZSksbW9kZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX2Fycm93X2tleV9uYXZpZ2F0aW9uX19fZGVmYXVsdC5hLm1vZGUuSE9SSVpPTlRBTH0pLHRoaXMucHJvcHMub3B0aW9ucy5tYXAoZnVuY3Rpb24ocHJvcHMsaW5kZXgpe3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX2J1dHRvbl9fX2RlZmF1bHQuYSxfZXh0ZW5kcyh7fSxwcm9wcyx7a2V5OnByb3BzLmtleXx8aW5kZXgsJ2FyaWEtY2hlY2tlZCc6aW5kZXg9PT1fdGhpczIuc3RhdGUuc2VsZWN0ZWRJbmRleCxjb21wb25lbnQ6cHJvcHMuY29tcG9uZW50fHxfdGhpczIucHJvcHMub3B0aW9uQ29tcG9uZW50LGNsYXNzTmFtZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQoKSgnYi1zZWdtZW50ZWQtY29udHJvbC1vcHRpb24nLHByb3BzLmNsYXNzTmFtZSx7J2Itc2VnbWVudGVkLWNvbnRyb2wtb3B0aW9uLXNlbGVjdGVkJzppbmRleD09PV90aGlzMi5zdGF0ZS5zZWxlY3RlZEluZGV4fSksb25QcmVzc2VkOl90aGlzMi5oYW5kbGVPcHRpb25TZWxlY3Rpb24scHJlc3NlZDppbmRleD09PV90aGlzMi5zdGF0ZS5zZWxlY3RlZEluZGV4LHJvbGU6J3JhZGlvJ30pLHByb3BzLmNoaWxkcmVuKTt9KSk7fX1dKTtyZXR1cm4gU2VnbWVudGVkQ29udHJvbDt9KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5QdXJlQ29tcG9uZW50KTtTZWdtZW50ZWRDb250cm9sLnByb3BUeXBlcz17JyonOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLmFueSxkZWZhdWx0T3B0aW9uU2VsZWN0ZWRJbmRleDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5udW1iZXIsb25PcHRpb25TZWxlY3RlZDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jLG9wdGlvbkNvbXBvbmVudDpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5vbmVPZlR5cGUoW19fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLnN0cmluZyxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jXSksb3B0aW9uczpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5hcnJheU9mKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLnNoYXBlKHsnKic6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYW55LGNoaWxkcmVuOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm5vZGV9KSkuaXNSZXF1aXJlZH07U2VnbWVudGVkQ29udHJvbC5kZWZhdWx0UHJvcHM9e2RlZmF1bHRPcHRpb25TZWxlY3RlZEluZGV4OjAsb25PcHRpb25TZWxlY3RlZDpmdW5jdGlvbiBvbk9wdGlvblNlbGVjdGVkKCl7fSxvcHRpb25Db21wb25lbnQ6J2J1dHRvbicsb3B0aW9uczpbXX07U2VnbWVudGVkQ29udHJvbC5pbnRlcm5hbEtleXM9T2JqZWN0LmtleXMoU2VnbWVudGVkQ29udHJvbC5kZWZhdWx0UHJvcHMpOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSBTZWdtZW50ZWRDb250cm9sO1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGluZGV4LmpzIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbiBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gNSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgODM4YWQzODU1M2ZlZjI2YTU4YWEiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtYXJyb3cta2V5LW5hdmlnYXRpb25cIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtYXJyb3cta2V5LW5hdmlnYXRpb25cIn1cbi8vIG1vZHVsZSBpZCA9IDBcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLWJ1dHRvblwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy1idXR0b25cIn1cbi8vIG1vZHVsZSBpZCA9IDFcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXV0aWxzLW9taXQta2V5c1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIn1cbi8vIG1vZHVsZSBpZCA9IDJcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2xhc3NuYW1lc1wiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImNsYXNzbmFtZXNcIn1cbi8vIG1vZHVsZSBpZCA9IDNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJyZWFjdFwifVxuLy8gbW9kdWxlIGlkID0gNFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJpbXBvcnQgUmVhY3QsIHtQcm9wVHlwZXN9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjeCBmcm9tICdjbGFzc25hbWVzJztcblxuaW1wb3J0IEFycm93S2V5TmF2aWdhdGlvbiBmcm9tICdib3VuZGxlc3MtYXJyb3cta2V5LW5hdmlnYXRpb24nO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICdib3VuZGxlc3MtYnV0dG9uJztcbmltcG9ydCBvbWl0IGZyb20gJ2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMnO1xuXG5mdW5jdGlvbiBmaW5kSW5kZXgoYXJyLCB0ZXN0KSB7XG4gICAgbGV0IGZvdW5kO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGFyci5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICBpZiAodGVzdChhcnJbaV0pKSB7XG4gICAgICAgICAgICBmb3VuZCA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmb3VuZDtcbn1cblxuLyoqXG5fX0EgY29udHJvbCBjb250YWluaW5nIG11bHRpcGxlIGJ1dHRvbnMsIG9ubHkgb25lIG9mIHdoaWNoIGNhbiBiZSBhY3RpdmUgYXQgYSB0aW1lLl9fXG5cblNlZ21lbnRlZENvbnRyb2wgaGFzIG1hbnkgcG90ZW50aWFsIHVzZXMsIHRoZSBtb3N0IGNvbW1vbiBiZWluZzpcblxuMS4gVGhlIGNvbnRyb2xzIGZvciBhIHRhYmJlZCB2aWV3XG4yLiBBIG1vZGUgc3dpdGNoXG5cbkVzc2VudGlhbGx5LCBpdCBiZWhhdmVzIGxpa2UgYSByYWRpbyBncm91cCB3aXRob3V0IGFjdHVhbGx5IHVzaW5nIGlucHV0IGNvbnRyb2xzLiBPbmx5IG9uZSBvcHRpb24gY2FuIGJlIHNlbGVjdGVkIGF0IGEgdGltZS5cblxuIyMjIENvbXBvbmVudCBJbnN0YW5jZSBNZXRob2RzXG5cbi0gYGdldFNlbGVjdGVkT3B0aW9uKClgIHJldHJpZXZlcyB0aGUgb3B0aW9uIHRoYXQgaXMgc2VsZWN0ZWRcbi0gYGdldFNlbGVjdGVkT3B0aW9uSW5kZXgoKWAgcmV0cmlldmVzIHRoZSBpbmRleCBvZiB0aGUgb3B0aW9uIHRoYXQgaXMgc2VsZWN0ZWRcbi0gYHNlbGVjdE9wdGlvbihvcHRpb24pYCBhbGxvd3MgZm9yIHByb2dyYW1tYXRpYyBzd2l0Y2hpbmcgb2YgdGhlIGFjdGl2ZSBTZWdtZW50ZWRDb250cm9sIG9wdGlvblxuLSBgc2VsZWN0T3B0aW9uQnlLZXkoa2V5LCB2YWx1ZSlgIGFsbG93cyBmb3IgcHJvZ3JhbW1hdGljIHN3aXRjaGluZyBvZiB0aGUgYWN0aXZlIFNlZ21lbnRlZENvbnRyb2wgb3B0aW9uIHVzaW5nIGEgdW5pcXVlIGtleVxuLSBgc2VsZWN0T3B0aW9uSW5kZXgoaW5kZXgpYCBhbGxvd3MgZm9yIHByb2dyYW1tYXRpYyBzd2l0Y2hpbmcgb2YgdGhlIGFjdGl2ZSBTZWdtZW50ZWRDb250cm9sIG9wdGlvbiBieSBpbmRleFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZWdtZW50ZWRDb250cm9sIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFueSBbUmVhY3Qtc3VwcG9ydGVkIGF0dHJpYnV0ZV0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90YWdzLWFuZC1hdHRyaWJ1dGVzLmh0bWwjaHRtbC1hdHRyaWJ1dGVzKVxuICAgICAgICAgKi9cbiAgICAgICAgJyonOiBQcm9wVHlwZXMuYW55LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBzZXRzIHRoZSBpbml0aWFsIHNlbGVjdGVkIG9wdGlvbiBvbiBmaXJzdCBtb3VudFxuICAgICAgICAgKi9cbiAgICAgICAgZGVmYXVsdE9wdGlvblNlbGVjdGVkSW5kZXg6IFByb3BUeXBlcy5udW1iZXIsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGNhbGxlZCB3aGVuIGEgY2hpbGQgZWxlbWVudCBiZWNvbWVzIHNlbGVjdGVkIHdpdGggdGhlIG9wdGlvbiBhbmQgb3B0aW9uIGluZGV4XG4gICAgICAgICAqL1xuICAgICAgICBvbk9wdGlvblNlbGVjdGVkOiBQcm9wVHlwZXMuZnVuYyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogcHJvdmlkZSBhIGN1c3RvbWl6ZWQgY29tcG9uZW50IHR5cGUgaWYgZGVzaXJlZCwgZWl0aGVyIGEgSFRNTCBlbGVtZW50IG5hbWUgb3IgUmVhY3RDb21wb25lbnRcbiAgICAgICAgICovXG4gICAgICAgIG9wdGlvbkNvbXBvbmVudDogUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgICAgICAgICBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgICAgICAgUHJvcFR5cGVzLmZ1bmMsXG4gICAgICAgIF0pLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBwcm9wIG9iamVjdHMgdG8gYmUgYXBwbGllZCBhZ2FpbnN0IHRoZSBTZWdtZW50ZWRDb250cm9sIGJ1dHRvbnMsIGFjY2VwdHMgYW55IHZhbGlkIFJlYWN0IHByb3BzXG4gICAgICAgICAqXG4gICAgICAgICAqICMjIyMgRXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiBgYGBqc3hcbiAgICAgICAgICogb3B0aW9ucz17W3tcbiAgICAgICAgICogICAgIGNoaWxkcmVuOiAnRm9vJyxcbiAgICAgICAgICogICAgIGNsYXNzTmFtZTogJ2ZvbycsXG4gICAgICAgICAqIH0sIHtcbiAgICAgICAgICogICAgIGNoaWxkcmVuOiA8c3Bhbj5CYXI8L3NwYW4+LFxuICAgICAgICAgKiAgICAgJ2RhdGEtaWQnOiAnYmFyJyxcbiAgICAgICAgICogfV19XG4gICAgICAgICAqIGBgYFxuICAgICAgICAgKi9cbiAgICAgICAgb3B0aW9uczogUHJvcFR5cGVzLmFycmF5T2YoXG4gICAgICAgICAgICBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIGFueSBbUmVhY3Qtc3VwcG9ydGVkIGF0dHJpYnV0ZV0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90YWdzLWFuZC1hdHRyaWJ1dGVzLmh0bWwjaHRtbC1hdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICcqJzogUHJvcFR5cGVzLmFueSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG4gICAgICAgICAgICB9KVxuICAgICAgICApLmlzUmVxdWlyZWQsXG4gICAgfVxuXG4gICAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgICAgZGVmYXVsdE9wdGlvblNlbGVjdGVkSW5kZXg6IDAsXG4gICAgICAgIG9uT3B0aW9uU2VsZWN0ZWQ6ICgpID0+IHt9LFxuICAgICAgICBvcHRpb25Db21wb25lbnQ6ICdidXR0b24nLFxuICAgICAgICBvcHRpb25zOiBbXSxcbiAgICB9XG5cbiAgICBzdGF0aWMgaW50ZXJuYWxLZXlzID0gT2JqZWN0LmtleXMoU2VnbWVudGVkQ29udHJvbC5kZWZhdWx0UHJvcHMpXG5cbiAgICBzdGF0ZSA9IHtcbiAgICAgICAgc2VsZWN0ZWRJbmRleDogbnVsbCxcbiAgICB9XG5cbiAgICBpbmZlclNlbGVjdGVkT3B0aW9uSW5kZXgocHJvcHMgPSB0aGlzLnByb3BzLCBzdGF0ZSA9IHRoaXMuc3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRJbmRleChwcm9wcy5vcHRpb25zLCAob3B0aW9uKSA9PiBvcHRpb24ucHJlc3NlZCkgfHwgc3RhdGUuc2VsZWN0ZWRJbmRleDtcbiAgICB9XG5cbiAgICBjb21wb25lbnRXaWxsTW91bnQoKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3NlbGVjdGVkSW5kZXg6IHRoaXMuaW5mZXJTZWxlY3RlZE9wdGlvbkluZGV4KCkgfHwgdGhpcy5wcm9wcy5kZWZhdWx0T3B0aW9uU2VsZWN0ZWRJbmRleH0pO1xuICAgIH1cblxuICAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgICAgIGlmIChuZXh0UHJvcHMub3B0aW9ucyAhPT0gdGhpcy5wcm9wcy5vcHRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtzZWxlY3RlZEluZGV4OiB0aGlzLmluZmVyU2VsZWN0ZWRPcHRpb25JbmRleChuZXh0UHJvcHMpfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYW5kbGVPcHRpb25TZWxlY3Rpb24gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGV2ZW50LnRhcmdldC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuLCBldmVudC50YXJnZXQpO1xuXG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnNlbGVjdGVkSW5kZXggIT09IGluZGV4KSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtzZWxlY3RlZEluZGV4OiBpbmRleH0sICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm9uT3B0aW9uU2VsZWN0ZWQodGhpcy5wcm9wcy5vcHRpb25zW3RoaXMuc3RhdGUuc2VsZWN0ZWRJbmRleF0sIHRoaXMuc3RhdGUuc2VsZWN0ZWRJbmRleCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBnZXRTZWxlY3RlZE9wdGlvbiA9ICgpID0+IHRoaXMucHJvcHMub3B0aW9uc1t0aGlzLnN0YXRlLnNlbGVjdGVkSW5kZXhdXG5cbiAgICAvKipcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgZ2V0U2VsZWN0ZWRPcHRpb25JbmRleCA9ICgpID0+IHRoaXMuc3RhdGUuc2VsZWN0ZWRJbmRleFxuXG4gICAgLyoqXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIHNlbGVjdE9wdGlvbiA9IChvcHRpb24pID0+IHRoaXMuc2V0U3RhdGUoe3NlbGVjdGVkSW5kZXg6IHRoaXMucHJvcHMub3B0aW9ucy5pbmRleE9mKG9wdGlvbil9KVxuXG4gICAgLyoqXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIHNlbGVjdE9wdGlvbkJ5S2V5ID0gKGssIHYpID0+IHRoaXMuc2V0U3RhdGUoe3NlbGVjdGVkSW5kZXg6IGZpbmRJbmRleCh0aGlzLnByb3BzLm9wdGlvbnMsIChvcHRpb24pID0+IG9wdGlvbltrXSA9PT0gdil9KVxuXG4gICAgLyoqXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIHNlbGVjdE9wdGlvbkluZGV4ID0gKGluZGV4KSA9PiB0aGlzLnNldFN0YXRlKHtzZWxlY3RlZEluZGV4OiBpbmRleH0pXG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8QXJyb3dLZXlOYXZpZ2F0aW9uXG4gICAgICAgICAgICAgICAgey4uLm9taXQodGhpcy5wcm9wcywgU2VnbWVudGVkQ29udHJvbC5pbnRlcm5hbEtleXMpfVxuICAgICAgICAgICAgICAgIHJvbGU9J3JhZGlvZ3JvdXAnXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjeCgnYi1zZWdtZW50ZWQtY29udHJvbCcsIHRoaXMucHJvcHMuY2xhc3NOYW1lKX1cbiAgICAgICAgICAgICAgICBtb2RlPXtBcnJvd0tleU5hdmlnYXRpb24ubW9kZS5IT1JJWk9OVEFMfT5cbiAgICAgICAgICAgICAgICB7dGhpcy5wcm9wcy5vcHRpb25zLm1hcCgocHJvcHMsIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHsuLi5wcm9wc31cbiAgICAgICAgICAgICAgICAgICAgICAgIGtleT17cHJvcHMua2V5IHx8IGluZGV4fVxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1jaGVja2VkPXtpbmRleCA9PT0gdGhpcy5zdGF0ZS5zZWxlY3RlZEluZGV4fVxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50PXtwcm9wcy5jb21wb25lbnQgfHwgdGhpcy5wcm9wcy5vcHRpb25Db21wb25lbnR9XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KCdiLXNlZ21lbnRlZC1jb250cm9sLW9wdGlvbicsIHByb3BzLmNsYXNzTmFtZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiLXNlZ21lbnRlZC1jb250cm9sLW9wdGlvbi1zZWxlY3RlZCc6IGluZGV4ID09PSB0aGlzLnN0YXRlLnNlbGVjdGVkSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uUHJlc3NlZD17dGhpcy5oYW5kbGVPcHRpb25TZWxlY3Rpb259XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVzc2VkPXtpbmRleCA9PT0gdGhpcy5zdGF0ZS5zZWxlY3RlZEluZGV4fVxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT0ncmFkaW8nPlxuICAgICAgICAgICAgICAgICAgICAgICAge3Byb3BzLmNoaWxkcmVufVxuICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvQXJyb3dLZXlOYXZpZ2F0aW9uPlxuICAgICAgICApO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL2JvdW5kbGVzcy1zZWdtZW50ZWQtY29udHJvbC9pbmRleC5qcyJdLCJzb3VyY2VSb290IjoiIn0= |
import React, {PropTypes} from 'react'; | ||
import {findDOMNode} from 'react-dom'; | ||
import cx from 'classnames'; | ||
import ArrowKeyNavigation from 'boundless-arrow-key-navigation'; | ||
import Button from 'boundless-button'; | ||
import omit from 'boundless-utils-omit-keys'; | ||
const isFunction = (x) => typeof x === 'function'; | ||
function findIndex(arr, test) { | ||
let found; | ||
for (let i = 0, len = arr.length; i < len; i += 1) { | ||
if (test(arr[i])) { | ||
found = i; | ||
break; | ||
} | ||
} | ||
return found; | ||
} | ||
/** | ||
# SegmentedControl | ||
__A control containing multiple buttons, only one of which can be active at a time.__ | ||
SegmentedControl is implemented as a "controlled component", meaning it is a direct representation of the model data passed inside. User interaction will bubble changes in the form of `onOptionSelected` that a controller view must intercept and apply against the data provider. | ||
SegmentedControl has many potential uses, the most common being: | ||
1. The controls for a tabbed view | ||
2. A mode switch | ||
Essentially, it behaves like a radio group without actually using input controls. Only one option can be selected at a time. | ||
### Component Instance Methods | ||
- `getSelectedOption()` retrieves the option that is selected | ||
- `getSelectedOptionIndex()` retrieves the index of the option that is selected | ||
- `selectOption(option)` allows for programmatic switching of the active SegmentedControl option | ||
- `selectOptionByKey(key, value)` allows for programmatic switching of the active SegmentedControl option using a unique key | ||
- `selectOptionIndex(index)` allows for programmatic switching of the active SegmentedControl option by index | ||
*/ | ||
@@ -19,58 +42,54 @@ export default class SegmentedControl extends React.PureComponent { | ||
/** | ||
* called when a child element becomes selected; backing data must be updated to persist the state change | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
onOptionSelected: PropTypes.func, | ||
'*': PropTypes.any, | ||
/** | ||
* the backing data for the segments of the rendered control | ||
* sets the initial selected option on first mount | ||
*/ | ||
defaultOptionSelectedIndex: PropTypes.number, | ||
* > __Validation Criteria:__ | ||
* > | ||
* > 1. There must be at least two `options` (a segmented control with one button is not allowed) | ||
* > 1. There must only be one `option` whose `selected` attribute is `true` (multiple selections are not allowed) | ||
* > 1. Each `value` attribute must be unique across the set of `options` | ||
/** | ||
* called when a child element becomes selected with the option and option index | ||
*/ | ||
onOptionSelected: PropTypes.func, | ||
* - __options[].selected__ `Boolean` | ||
* - __options[].value__ `String` | ||
* - __options[].content__ `*` | ||
* the content to go inside the button | ||
/** | ||
* provide a customized component type if desired, either a HTML element name or ReactComponent | ||
*/ | ||
options: function validateOptions(props) { | ||
if (props.options.length < 2) { | ||
throw new Error('Must provide at least two options.'); | ||
} | ||
optionComponent: PropTypes.oneOfType([ | ||
PropTypes.string, | ||
PropTypes.func, | ||
]), | ||
const missingSelected = props.options.some((option) => { | ||
if (!('selected' in option)) { | ||
return true; | ||
} | ||
}); | ||
if (missingSelected) { | ||
throw new Error('Must provide a `selected` prop for each option.'); | ||
} | ||
let seenSelected = false; | ||
const multipleSelected = props.options.some((option) => { | ||
if (option.selected) { | ||
if (seenSelected) { | ||
return true; | ||
} | ||
seenSelected = true; | ||
} | ||
}); | ||
if (multipleSelected) { | ||
throw new Error('Encountered multiple options with `selected: true`. There can be only one.'); | ||
} | ||
if (props.options.some((option) => typeof option.value === 'undefined')) { | ||
throw new Error('Must provide a `value` prop for each option.'); | ||
} | ||
}, | ||
/** | ||
* prop objects to be applied against the SegmentedControl buttons, accepts any valid React props | ||
* | ||
* #### Example | ||
* | ||
* ```jsx | ||
* options={[{ | ||
* children: 'Foo', | ||
* className: 'foo', | ||
* }, { | ||
* children: <span>Bar</span>, | ||
* 'data-id': 'bar', | ||
* }]} | ||
* ``` | ||
*/ | ||
options: PropTypes.arrayOf( | ||
PropTypes.shape({ | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
'*': PropTypes.any, | ||
children: PropTypes.node, | ||
}) | ||
).isRequired, | ||
} | ||
static defaultProps = { | ||
defaultOptionSelectedIndex: 0, | ||
onOptionSelected: () => {}, | ||
optionComponent: 'button', | ||
options: [], | ||
@@ -80,122 +99,81 @@ } | ||
static internalKeys = Object.keys(SegmentedControl.defaultProps) | ||
static internalChildKeys = [ | ||
'content', | ||
'value', | ||
'selected', | ||
] | ||
state = { | ||
indexOfOptionInFocus: null, | ||
selectedIndex: null, | ||
} | ||
currentValue() { | ||
let value; | ||
this.props.options.some((option) => { | ||
if (option.selected) { | ||
value = option.value; | ||
return true; | ||
} | ||
}); | ||
return value; | ||
inferSelectedOptionIndex(props = this.props, state = this.state) { | ||
return findIndex(props.options, (option) => option.pressed) || state.selectedIndex; | ||
} | ||
setFocus(index) { | ||
findDOMNode(this.refs['option_$' + index]).focus(); | ||
componentWillMount() { | ||
this.setState({selectedIndex: this.inferSelectedOptionIndex() || this.props.defaultOptionSelectedIndex}); | ||
} | ||
getNextOptionIndex(currentOptionIndex) { | ||
let next = currentOptionIndex + 1; | ||
return next < this.props.options.length ? next : 0; | ||
} | ||
getPreviousOptionIndex(currentOptionIndex) { | ||
let previous = currentOptionIndex - 1; | ||
return previous < 0 ? this.props.options.length - 1 : previous; | ||
} | ||
handleOptionBlur(option, event) { | ||
if (this.state.indexOfOptionInFocus === this.props.options.indexOf(option)) { | ||
this.setState({indexOfOptionInFocus: null}); | ||
componentWillReceiveProps(nextProps) { | ||
if (nextProps.options !== this.props.options) { | ||
this.setState({selectedIndex: this.inferSelectedOptionIndex(nextProps)}); | ||
} | ||
if (isFunction(option.onBlur)) { | ||
option.onBlur(event); | ||
} | ||
} | ||
handleOptionClick(option, event) { | ||
this.props.onOptionSelected(option.value); | ||
handleOptionSelection = (event) => { | ||
const index = Array.prototype.indexOf.call(event.target.parentElement.children, event.target); | ||
if (isFunction(option.onClick)) { | ||
option.onClick(event); | ||
if (this.state.selectedIndex !== index) { | ||
this.setState({selectedIndex: index}, () => { | ||
this.props.onOptionSelected(this.props.options[this.state.selectedIndex], this.state.selectedIndex); | ||
}); | ||
} | ||
} | ||
handleOptionFocus(option, event) { | ||
this.setState({indexOfOptionInFocus: this.props.options.indexOf(option)}); | ||
/** | ||
* @public | ||
*/ | ||
getSelectedOption = () => this.props.options[this.state.selectedIndex] | ||
if (isFunction(option.onFocus)) { | ||
option.onFocus(event); | ||
} | ||
} | ||
/** | ||
* @public | ||
*/ | ||
getSelectedOptionIndex = () => this.state.selectedIndex | ||
handleKeyDown = (event) => { | ||
const key = event.key; | ||
const activeItemIndex = this.state.indexOfOptionInFocus; | ||
/** | ||
* @public | ||
*/ | ||
selectOption = (option) => this.setState({selectedIndex: this.props.options.indexOf(option)}) | ||
if (key === 'ArrowLeft') { | ||
this.setFocus(this.getPreviousOptionIndex(activeItemIndex)); | ||
event.preventDefault(); | ||
} else if (key === 'ArrowRight') { | ||
this.setFocus(this.getNextOptionIndex(activeItemIndex)); | ||
event.preventDefault(); | ||
} else if (key === 'Enter') { | ||
this.handleOptionClick(this.props.options[activeItemIndex]); | ||
event.preventDefault(); | ||
} | ||
/** | ||
* @public | ||
*/ | ||
selectOptionByKey = (k, v) => this.setState({selectedIndex: findIndex(this.props.options, (option) => option[k] === v)}) | ||
if (isFunction(this.props.onKeyDown)) { | ||
this.props.onKeyDown(event); | ||
} | ||
} | ||
/** | ||
* @public | ||
*/ | ||
selectOptionIndex = (index) => this.setState({selectedIndex: index}) | ||
renderOptions() { | ||
return this.props.options.map((definition, index) => { | ||
return ( | ||
<Button | ||
{...omit(definition, SegmentedControl.internalChildKeys)} | ||
role='radio' | ||
aria-checked={String(definition.selected)} | ||
ref={'option_$' + index} | ||
key={definition.value} | ||
className={cx('b-segmented-control-option', definition.className, { | ||
'b-segmented-control-option-selected': definition.selected, | ||
})} | ||
tabIndex={definition.selected ? '0' : '-1'} | ||
onBlur={this.handleOptionBlur.bind(this, definition)} | ||
onPressed={this.handleOptionClick.bind(this, definition)} | ||
onFocus={this.handleOptionFocus.bind(this, definition)}> | ||
{definition.content} | ||
</Button> | ||
); | ||
}); | ||
} | ||
render() { | ||
return ( | ||
<div | ||
<ArrowKeyNavigation | ||
{...omit(this.props, SegmentedControl.internalKeys)} | ||
ref='wrapper' | ||
role='radiogroup' | ||
className={cx('b-segmented-control', this.props.className)} | ||
onKeyDown={this.handleKeyDown}> | ||
{this.renderOptions()} | ||
</div> | ||
mode={ArrowKeyNavigation.mode.HORIZONTAL}> | ||
{this.props.options.map((props, index) => ( | ||
<Button | ||
{...props} | ||
key={props.key || index} | ||
aria-checked={index === this.state.selectedIndex} | ||
component={props.component || this.props.optionComponent} | ||
className={cx('b-segmented-control-option', props.className, { | ||
'b-segmented-control-option-selected': index === this.state.selectedIndex, | ||
})} | ||
onPressed={this.handleOptionSelection} | ||
pressed={index === this.state.selectedIndex} | ||
role='radio'> | ||
{props.children} | ||
</Button> | ||
))} | ||
</ArrowKeyNavigation> | ||
); | ||
} | ||
} |
{ | ||
"name": "boundless-segmented-control", | ||
"version": "1.0.0-beta.5", | ||
"version": "1.0.0-beta.7", | ||
"description": "A control containing multiple buttons, only one of which can be active at a time.", | ||
@@ -29,4 +29,5 @@ "main": "build/index.js", | ||
"dependencies": { | ||
"boundless-button": "^1.0.0-beta.5", | ||
"boundless-utils-omit-keys": "^1.0.0-beta.5", | ||
"boundless-arrow-key-navigation": "^1.0.0-beta.7", | ||
"boundless-button": "^1.0.0-beta.7", | ||
"boundless-utils-omit-keys": "^1.0.0-beta.7", | ||
"classnames": "^2.1.5" | ||
@@ -33,0 +34,0 @@ }, |
@@ -0,54 +1,154 @@ | ||
<!--- | ||
THIS IS AN AUTOGENERATED FILE. EDIT INDEX.JS INSTEAD. | ||
--> | ||
# SegmentedControl | ||
# SegmentedControl | ||
__A control containing multiple buttons, only one of which can be active at a time.__ | ||
SegmentedControl is implemented as a "controlled component", meaning it is a direct representation of the model data passed inside. User interaction will bubble changes in the form of `onOptionSelected` that a controller view must intercept and apply against the data provider. | ||
SegmentedControl has many potential uses, the most common being: | ||
1. The controls for a tabbed view | ||
2. A mode switch | ||
Essentially, it behaves like a radio group without actually using input controls. Only one option can be selected at a time. | ||
### Component Instance Methods | ||
- `getSelectedOption()` retrieves the option that is selected | ||
- `getSelectedOptionIndex()` retrieves the index of the option that is selected | ||
- `selectOption(option)` allows for programmatic switching of the active SegmentedControl option | ||
- `selectOptionByKey(key, value)` allows for programmatic switching of the active SegmentedControl option using a unique key | ||
- `selectOptionIndex(index)` allows for programmatic switching of the active SegmentedControl option by index | ||
## Example Usage | ||
```jsx | ||
import React from 'react'; | ||
import {capitalize, map} from 'lodash'; | ||
import SegmentedControl from '../index'; | ||
import Image from '../../boundless-image/index'; | ||
export default class SegmentedControlDemo extends React.PureComponent { | ||
state = { | ||
selectedGroupIndex: 0, | ||
groups: [{ | ||
key: 'galaxies', | ||
images: [ | ||
{alt: 'Triangulum (M33)', src: 'https://c1.staticflickr.com/5/4128/5043159769_f382995a9b_b.jpg'}, | ||
{alt: 'Andromeda (M31)', src: 'https://c1.staticflickr.com/7/6215/6242076308_d01dccd1b4_b.jpg'}, | ||
{alt: 'Milky Way Galactic Core', src: 'https://c2.staticflickr.com/6/5236/5896162967_a656cf460a_b.jpg'}, | ||
{alt: 'M77', src: 'http://farm9.static.flickr.com/8668/15864469305_b3db67dd1d_m.jpg'}, | ||
{alt: 'Whirlpool (M51)', src: 'http://36.media.tumblr.com/687f0a2cd276b3d0013aa36aa2908845/tumblr_mmhvnnIx4L1qgvl7lo1_500.jpg'}, | ||
], | ||
}, { | ||
key: 'nebulae', | ||
images: [ | ||
{alt: 'Horsehead', src: 'https://c1.staticflickr.com/9/8244/8663227196_1e3719be69_b.jpg'}, | ||
{alt: 'Dust of Orion', src: 'https://c1.staticflickr.com/5/4113/5216868239_b53b8d5e80_b.jpg'}, | ||
{alt: 'Carina', src: 'https://c1.staticflickr.com/3/2796/4398656115_ceb9a987ce_b.jpg'}, | ||
{alt: 'Trifid', src: 'https://c1.staticflickr.com/1/468/19550653503_e4e0017579_b.jpg'}, | ||
{alt: 'Medusa', src: 'https://s-media-cache-ak0.pinimg.com/736x/df/5f/71/df5f7105d0de64246395fdda57f51ddf.jpg'}, | ||
], | ||
}, { | ||
key: 'planets', | ||
images: [ | ||
{alt: 'Mercury', src: 'https://c1.staticflickr.com/9/8228/8497927563_00dcb3fe09_b.jpg'}, | ||
{alt: 'Venus', src: 'http://vedichealing.com/wp-content/uploads/2013/03/Venusflickr-300x300.jpg'}, | ||
{alt: 'Earth', src: 'https://c1.staticflickr.com/3/2084/2222523486_5e1894e314_b.jpg'}, | ||
{alt: 'Mars', src: 'https://c2.staticflickr.com/4/3079/3191775310_bc6a8234d3.jpg'}, | ||
{alt: 'Jupiter', src: 'https://c2.staticflickr.com/4/3935/15652333232_6b44ff9cbf_b.jpg'}, | ||
], | ||
}], | ||
} | ||
handleOptionSelected = (_, index) => this.setState({selectedGroupIndex: index}) | ||
render() { | ||
return ( | ||
<div className='demo-segmented-control'> | ||
<p>Which astronomical features would you like to view?</p> | ||
<SegmentedControl | ||
options={map(this.state.groups, (group) => ({children: capitalize(group.key)}))} | ||
onOptionSelected={this.handleOptionSelected} /> | ||
<br /> | ||
<div className='spread'> | ||
{this.state.groups[this.state.selectedGroupIndex].images.map((props) => ( | ||
<Image key={props.alt} {...props} /> | ||
))} | ||
</div> | ||
</div> | ||
); | ||
} | ||
} | ||
``` | ||
## Props | ||
_Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/SegmentedControl#props)._ | ||
> Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/SegmentedControl#props). | ||
### Required Props | ||
There are no required props. | ||
- __`options`__ ・ prop objects to be applied against the SegmentedControl buttons, accepts any valid React props | ||
#### Example | ||
```jsx | ||
options={[{ | ||
children: 'Foo', | ||
className: 'foo', | ||
}, { | ||
children: <span>Bar</span>, | ||
'data-id': 'bar', | ||
}]} | ||
``` | ||
Expects | Default Value | ||
- | - | ||
`arrayOf(object)` | `[]` | ||
### Optional Props | ||
<table> | ||
<tr> | ||
<th>Name</th> | ||
<th>Type</th> | ||
<th>Default Value</th> | ||
<th>Description</th> | ||
</tr> | ||
- __`*`__ ・ any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
<tr> | ||
<td>onOptionSelected</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">() => {}</code></pre></td> | ||
<td>called when a child element becomes selected; backing data must be updated to persist the state change</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any` | `n/a` | ||
<tr> | ||
<td>options</td> | ||
<td><pre><code>custom</code></pre></td> | ||
<td><pre><code class="language-js">[]</code></pre></td> | ||
<td>the backing data for the segments of the rendered control | ||
- __`defaultOptionSelectedIndex`__ ・ sets the initial selected option on first mount | ||
> __Validation Criteria:__ | ||
> | ||
> 1. There must be at least two `options` (a segmented control with one button is not allowed) | ||
> 1. There must only be one `option` whose `selected` attribute is `true` (multiple selections are not allowed) | ||
> 1. Each `value` attribute must be unique across the set of `options` | ||
Expects | Default Value | ||
- | - | ||
`number` | `0` | ||
- __options[].selected__ `Boolean` | ||
- __options[].value__ `String` | ||
- __options[].content__ `*` | ||
the content to go inside the button</td> | ||
</tr> | ||
- __`onOptionSelected`__ ・ called when a child element becomes selected with the option and option index | ||
</table> | ||
Expects | Default Value | ||
- | - | ||
`function` | `() => {}` | ||
- __`optionComponent`__ ・ provide a customized component type if desired, either a HTML element name or ReactComponent | ||
Expects | Default Value | ||
- | - | ||
`string or function` | `'button'` | ||
## Reference Styles | ||
### Stylus | ||
```stylus | ||
// Bring in Boundless's base Stylus variables | ||
@require "node_modules/boundless-segmented-control/variables" | ||
// Redefine any variables as desired, e.g. | ||
color-accent = royalblue | ||
// Bring in the component styles; they will be autoconfigured based on the above | ||
@require "node_modules/boundless-segmented-control/style" | ||
``` | ||
### CSS | ||
If desired, a precompiled plain CSS stylesheet is available for customization at `/build/style.css`, based on Boundless's [default variables](https://github.com/enigma-io/boundless/blob/master/variables.styl). | ||
@@ -1,2 +0,2 @@ | ||
module.exports=function(e){function t(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,o){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:o})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=5)}([function(e,t,n){"use strict";function o(e,t){return Object.keys(t).reduce(function(t,n){return n in e&&(t[n]=e[n]),t},{})}t.a=o},function(e,t,n){"use strict";function o(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Object.keys(e).reduce(function(n,o){return t.indexOf(o)===-1&&(n[o]=e[o]),n},{})}t.a=o},function(e,t){e.exports=require("boundless-typeahead")},function(e,t){e.exports=require("classnames")},function(e,t){e.exports=require("react")},function(e,t,n){"use strict";function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var i=n(4),c=n.n(i),l=n(3),p=n.n(l),a=n(2),u=n.n(a),f=n(0),h=n(1),d=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},k=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,n,o){return n&&e(t.prototype,n),o&&e(t,o),t}}(),y=function(e){return e[0]},v=function(e){return e[e.length-1]},b=function(e){return"function"==typeof e},T=function(){},m=function(e){function t(){var e,n,s,i;o(this,t);for(var c=arguments.length,l=Array(c),p=0;p<c;p++)l[p]=arguments[p];return n=s=r(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(l))),s.focus=function(){return s.refs.typeahead.focus()},s.getInputNode=function(){return s.refs.typeahead.getInputNode()},s.getSelectedEntityText=function(){return s.refs.typeahead.getSelectedEntityText()},s.getValue=function(){return s.refs.typeahead.getValue()},s.select=function(){return s.refs.typeahead.select()},s.setValue=function(e){return s.refs.typeahead.setValue(e)},s.add=function(e){s.props.tokens.indexOf(e)===-1&&s.props.handleAddToken(e)},s.handleInputClick=function(e){s.clearSelection(),b(s.props.inputProps.onClick)&&s.props.inputProps.onClick(e)},s.handleInputFocus=function(e){s.clearSelection(),b(s.props.inputProps.onFocus)&&s.props.inputProps.onFocus(e)},s.handleKeyDown=function(e){switch(e.which){case 37:s.selectPreviousToken(e.shiftKey);break;case 39:s.selectNextToken(e.shiftKey);break;case 8:s.props.tokensSelected.length&&(s.remove(s.props.tokensSelected),s.focus());break;case 65:e.metaKey&&(e.preventDefault(),s.focus(),s.select(),s._suppressNextTokenSelection=!0,s.props.handleNewSelection(s.props.tokens))}b(s.props.onKeyDown)&&s.props.onKeyDown(e)},i=n,r(s,i)}return s(t,e),k(t,[{key:"componentDidUpdate",value:function(e){var t=e.tokensSelected,n=this.props.tokensSelected;if(this.props.tokens.length>e.tokens.length&&this.setValue(""),this._suppressNextTokenSelection)return void(this._suppressNextTokenSelection=!1);if(t!==n&&0!==n.length){if(1===n.length||n[0]!==t[0])return this.refs["token_"+n[0]].focus();if(v(n)!==v(t))return this.refs["token_"+v(n)].focus();this.refs["token_"+n[0]].focus()}}},{key:"remove",value:function(e){var t=this,n=(Array.isArray(e)?e:[e]).filter(function(e){return t.props.tokens.indexOf(e)!==-1});n.length&&this.props.handleRemoveTokens(n)}},{key:"selectToken",value:function(e){this.props.handleNewSelection([e])}},{key:"selectTokens",value:function(e){this.props.handleNewSelection(e)}},{key:"selectPreviousToken",value:function(e){var t=this.props.tokensSelected,n=this.props.tokens;if(1!==t.length||y(t)!==y(n))if(0===t.length)this.selectToken(v(n));else{var o=n[n.indexOf(y(t))-1];this.selectTokens(e?[o].concat(t):[o])}}},{key:"selectNextToken",value:function(e){var t=this.props.tokensSelected,n=this.props.tokens;if(0!==t.length)if(v(t)===v(n))this.clearSelection(),this.focus();else{var o=n[n.indexOf(v(t))+1];this.selectTokens(e?t.concat(o):[o])}}},{key:"clearSelection",value:function(){this.props.handleNewSelection([])}},{key:"handleTokenCloseClick",value:function(e,t){t.stopPropagation(),this.remove(e),this.focus(),this.props.tokenCloseComponent.props.onClick&&this.props.tokenCloseComponent.props.onClick(t)}},{key:"renderTokenClose",value:function(e){if(this.props.tokenCloseVisible)return c.a.cloneElement(this.props.tokenCloseComponent,{className:p()("b-tokenfield-token-close",this.props.tokenCloseComponent.props.className),onClick:this.handleTokenCloseClick.bind(this,e)})}},{key:"handleTokenKeyDown",value:function(e,t){switch(t.which){case 13:case 32:this.selectToken(e),t.preventDefault();break;case 8:this.remove(e),this.focus(),t.preventDefault()}}},{key:"renderTokens",value:function(){var e=this;return c.a.createElement("div",{className:"b-tokenfield-tokens"},this.props.tokens.map(function(t){return c.a.createElement("div",{ref:"token_"+t,key:t,className:p()("b-tokenfield-token",{"b-tokenfield-token-selected":e.props.tokensSelected.indexOf(t)!==-1}),onClick:e.selectToken.bind(e,t),onKeyDown:e.handleTokenKeyDown.bind(e,t),tabIndex:"0"},e.props.entities[t].text,e.renderTokenClose(t))}))}},{key:"render",value:function(){return c.a.createElement("div",d({},n.i(h.a)(this.props,t.internalKeys),{ref:"wrapper",className:p()("b-tokenfield-wrapper",this.props.className),onKeyDown:this.handleKeyDown}),this.renderTokens(),c.a.createElement(u.a,d({},n.i(f.a)(this.props,u.a.defaultProps),{ref:"typeahead",className:"b-tokenfield",clearOnSelection:!0,inputProps:d({},this.props.inputProps,{onClick:this.handleInputClick,onFocus:this.handleInputFocus}),onEntitySelected:this.add})))}}]),t}(c.a.PureComponent);m.propTypes=d({},u.a.propTypes,{handleAddToken:i.PropTypes.func,handleRemoveTokens:i.PropTypes.func,handleNewSelection:i.PropTypes.func,tokenCloseComponent:i.PropTypes.element,tokenCloseVisible:i.PropTypes.bool,tokens:i.PropTypes.arrayOf(i.PropTypes.number),tokensSelected:i.PropTypes.arrayOf(i.PropTypes.number)}),m.defaultProps=d({},u.a.defaultProps,{handleAddToken:T,handleRemoveTokens:T,handleNewSelection:T,tokenCloseComponent:c.a.createElement("div",null,"X"),tokenCloseVisible:!0,tokens:[],tokensSelected:[]}),m.internalKeys=Object.keys(m.defaultProps),t.default=m}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIDg3ZTZhOGQ2NjhjNjM4ZjhiMzhjIiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vYmplY3QtaW50ZXJzZWN0aW9uL2luZGV4LmpzIiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXR5cGVhaGVhZFwifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJjbGFzc25hbWVzXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0XCJ9Iiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy10b2tlbml6ZWQtaW5wdXQvaW5kZXguanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJ2YWx1ZSIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiX193ZWJwYWNrX2V4cG9ydHNfXyIsImdldEludGVyc2VjdGlvbiIsIm9iajEiLCJvYmoyIiwia2V5cyIsInJlZHVjZSIsImNoaWxkUHJvcHMiLCJrZXkiLCJvbWl0S2V5c0Zyb21Tb3VyY2VPYmplY3QiLCJzb3VyY2UiLCJvbWl0dGVkS2V5cyIsImFyZ3VtZW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsImhhc2giLCJpbmRleE9mIiwicmVxdWlyZSIsIl9jbGFzc0NhbGxDaGVjayIsImluc3RhbmNlIiwiQ29uc3RydWN0b3IiLCJUeXBlRXJyb3IiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiIsInNlbGYiLCJSZWZlcmVuY2VFcnJvciIsIl9pbmhlcml0cyIsInN1YkNsYXNzIiwic3VwZXJDbGFzcyIsImNyZWF0ZSIsImNvbnN0cnVjdG9yIiwid3JpdGFibGUiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3R5cGVhaGVhZF9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc190eXBlYWhlYWRfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc19vYmplY3RfaW50ZXJzZWN0aW9uX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fIiwiX2V4dGVuZHMiLCJhc3NpZ24iLCJ0YXJnZXQiLCJfY3JlYXRlQ2xhc3MiLCJkZWZpbmVQcm9wZXJ0aWVzIiwicHJvcHMiLCJkZXNjcmlwdG9yIiwicHJvdG9Qcm9wcyIsInN0YXRpY1Byb3BzIiwiZmlyc3QiLCJhcnJheSIsImxhc3QiLCJpc0Z1bmN0aW9uIiwieCIsIm5vb3AiLCJUb2tlbml6ZWRJbnB1dCIsIl9SZWFjdCRQdXJlQ29tcG9uZW50IiwiX3JlZiIsIl90ZW1wIiwiX3RoaXMiLCJfcmV0IiwidGhpcyIsIl9sZW4iLCJhcmdzIiwiQXJyYXkiLCJfa2V5IiwiZ2V0UHJvdG90eXBlT2YiLCJhcHBseSIsImNvbmNhdCIsImZvY3VzIiwicmVmcyIsInR5cGVhaGVhZCIsImdldElucHV0Tm9kZSIsImdldFNlbGVjdGVkRW50aXR5VGV4dCIsImdldFZhbHVlIiwic2VsZWN0Iiwic2V0VmFsdWUiLCJhZGQiLCJpbmRleCIsInRva2VucyIsImhhbmRsZUFkZFRva2VuIiwiaGFuZGxlSW5wdXRDbGljayIsImV2ZW50IiwiY2xlYXJTZWxlY3Rpb24iLCJpbnB1dFByb3BzIiwib25DbGljayIsImhhbmRsZUlucHV0Rm9jdXMiLCJvbkZvY3VzIiwiaGFuZGxlS2V5RG93biIsIndoaWNoIiwic2VsZWN0UHJldmlvdXNUb2tlbiIsInNoaWZ0S2V5Iiwic2VsZWN0TmV4dFRva2VuIiwidG9rZW5zU2VsZWN0ZWQiLCJyZW1vdmUiLCJtZXRhS2V5IiwicHJldmVudERlZmF1bHQiLCJfc3VwcHJlc3NOZXh0VG9rZW5TZWxlY3Rpb24iLCJoYW5kbGVOZXdTZWxlY3Rpb24iLCJvbktleURvd24iLCJwcmV2UHJvcHMiLCJwcmV2aW91c1NlbGVjdGVkSW5kZXhlcyIsImN1cnJlbnRTZWxlY3RlZEluZGV4ZXMiLCJfdGhpczIiLCJpbmRleGVzIiwiaXNBcnJheSIsImZpbHRlciIsImlkeCIsImhhbmRsZVJlbW92ZVRva2VucyIsImFwcGVuZCIsInNlbGVjdGVkIiwic2VsZWN0VG9rZW4iLCJwcmV2aW91c1Rva2VuIiwic2VsZWN0VG9rZW5zIiwibmV4dFRva2VuIiwic3RvcFByb3BhZ2F0aW9uIiwidG9rZW5DbG9zZUNvbXBvbmVudCIsInRva2VuQ2xvc2VWaXNpYmxlIiwiYSIsImNsb25lRWxlbWVudCIsImNsYXNzTmFtZSIsImhhbmRsZVRva2VuQ2xvc2VDbGljayIsImJpbmQiLCJfdGhpczMiLCJjcmVhdGVFbGVtZW50IiwibWFwIiwicmVmIiwiYi10b2tlbmZpZWxkLXRva2VuLXNlbGVjdGVkIiwiaGFuZGxlVG9rZW5LZXlEb3duIiwidGFiSW5kZXgiLCJlbnRpdGllcyIsInRleHQiLCJyZW5kZXJUb2tlbkNsb3NlIiwiaW50ZXJuYWxLZXlzIiwicmVuZGVyVG9rZW5zIiwiZGVmYXVsdFByb3BzIiwiY2xlYXJPblNlbGVjdGlvbiIsIm9uRW50aXR5U2VsZWN0ZWQiLCJQdXJlQ29tcG9uZW50IiwicHJvcFR5cGVzIiwiZnVuYyIsImVsZW1lbnQiLCJib29sIiwiYXJyYXlPZiIsIm51bWJlciJdLCJtYXBwaW5ncyI6IkFBQUFBLE9BQU9DLFFBQ0UsU0FBVUMsR0NHbkIsUUFBQUMsR0FBQUMsR0FHQSxHQUFBQyxFQUFBRCxHQUNBLE1BQUFDLEdBQUFELEdBQUFILE9BR0EsSUFBQUQsR0FBQUssRUFBQUQsSUFDQUUsRUFBQUYsRUFDQUcsR0FBQSxFQUNBTixXQVVBLE9BTkFDLEdBQUFFLEdBQUFJLEtBQUFSLEVBQUFDLFFBQUFELElBQUFDLFFBQUFFLEdBR0FILEVBQUFPLEdBQUEsRUFHQVAsRUFBQUMsUUF2QkEsR0FBQUksS0ErREEsT0FuQ0FGLEdBQUFNLEVBQUFQLEVBR0FDLEVBQUFPLEVBQUFMLEVBR0FGLEVBQUFHLEVBQUEsU0FBQUssR0FBMkMsTUFBQUEsSUFHM0NSLEVBQUFTLEVBQUEsU0FBQVgsRUFBQVksRUFBQUMsR0FDQVgsRUFBQVksRUFBQWQsRUFBQVksSUFDQUcsT0FBQUMsZUFBQWhCLEVBQUFZLEdBQ0FLLGNBQUEsRUFDQUMsWUFBQSxFQUNBQyxJQUFBTixLQU1BWCxFQUFBa0IsRUFBQSxTQUFBckIsR0FDQSxHQUFBYyxHQUFBZCxLQUFBc0IsV0FDQSxXQUEyQixNQUFBdEIsR0FBQSxTQUMzQixXQUFpQyxNQUFBQSxHQUVqQyxPQURBRyxHQUFBUyxFQUFBRSxFQUFBLElBQUFBLEdBQ0FBLEdBSUFYLEVBQUFZLEVBQUEsU0FBQVEsRUFBQUMsR0FBc0QsTUFBQVIsUUFBQVMsVUFBQUMsZUFBQWxCLEtBQUFlLEVBQUFDLElBR3REckIsRUFBQXdCLEVBQUEsR0FHQXhCLElBQUF5QixFQUFBLEtET00sU0FBVTVCLEVBQVE2QixFQUFxQjFCLEdBRTdDLFlFL0RlLFNBQVMyQixHQUFnQkMsRUFBTUMsR0FDMUMsTUFBT2hCLFFBQU9pQixLQUFLRCxHQUFNRSxPQUFPLFNBQUNDLEVBQVlDLEdBS3pDLE1BSklBLEtBQU9MLEtBQ1BJLEVBQVdDLEdBQU9MLEVBQUtLLElBR3BCRCxPRjBEa0JOLEVBQXVCLEVBQUlDLEdBS3RELFNBQVU5QixFQUFRNkIsRUFBcUIxQixHQUU3QyxZRzlFZSxTQUFTa0MsR0FBeUJDLEdBQTBCLEdBQWxCQyxHQUFrQkMsVUFBQUMsT0FBQSxHQUFBQyxTQUFBRixVQUFBLEdBQUFBLFVBQUEsS0FDdkUsT0FBT3hCLFFBQU9pQixLQUFLSyxHQUFRSixPQUFPLFNBQThCUyxFQUFNUCxHQUtsRSxNQUpJRyxHQUFZSyxRQUFRUixNQUFTLElBQzdCTyxFQUFLUCxHQUFPRSxFQUFPRixJQUdoQk8sT0h5RWtCZCxFQUF1QixFQUFJUSxHQUt0RCxTQUFVckMsRUFBUUMsR0l2RnhCRCxFQUFBQyxRQUFBNEMsUUFBQSx3Qko2Rk0sU0FBVTdDLEVBQVFDLEdLN0Z4QkQsRUFBQUMsUUFBQTRDLFFBQUEsZUxtR00sU0FBVTdDLEVBQVFDLEdNbkd4QkQsRUFBQUMsUUFBQTRDLFFBQUEsVU55R00sU0FBVTdDLEVBQVE2QixFQUFxQjFCLEdBRTdDLFlBVTh0QixTQUFTMkMsR0FBZ0JDLEVBQVNDLEdBQWEsS0FBS0QsWUFBb0JDLElBQWMsS0FBTSxJQUFJQyxXQUFVLHFDQUF1QyxRQUFTQyxHQUEyQkMsRUFBSzNDLEdBQU0sSUFBSTJDLEVBQU0sS0FBTSxJQUFJQyxnQkFBZSw0REFBOEQsUUFBTzVDLEdBQXFCLGdCQUFQQSxJQUErQixrQkFBUEEsR0FBd0IyQyxFQUFMM0MsRUFBVyxRQUFTNkMsR0FBVUMsRUFBU0MsR0FBWSxHQUF1QixrQkFBYkEsSUFBc0MsT0FBYkEsRUFBbUIsS0FBTSxJQUFJTixXQUFVLGlFQUFrRU0sR0FBYUQsR0FBUzdCLFVBQVVULE9BQU93QyxPQUFPRCxHQUFZQSxFQUFXOUIsV0FBV2dDLGFBQWE5QyxNQUFNMkMsRUFBU25DLFlBQVcsRUFBTXVDLFVBQVMsRUFBS3hDLGNBQWEsS0FBV3FDLElBQVd2QyxPQUFPMkMsZUFBZTNDLE9BQU8yQyxlQUFlTCxFQUFTQyxHQUFZRCxFQUFTTSxVQUFVTCxHQVRoZ0R2QyxPQUFPQyxlQUFlWSxFQUFxQixjQUFnQmxCLE9BQU8sR0FDN0MsSUFBSWtELEdBQXNDMUQsRUFBb0IsR0FDMUQyRCxFQUE4QzNELEVBQW9Ca0IsRUFBRXdDLEdBQ3BFRSxFQUEyQzVELEVBQW9CLEdBQy9ENkQsRUFBbUQ3RCxFQUFvQmtCLEVBQUUwQyxHQUN6RUUsRUFBb0Q5RCxFQUFvQixHQUN4RStELEVBQTREL0QsRUFBb0JrQixFQUFFNEMsR0FDbEZFLEVBQW9FaEUsRUFBb0IsR0FDeEZpRSxFQUEwRGpFLEVBQW9CLEdBQ25Ha0UsRUFBU3JELE9BQU9zRCxRQUFRLFNBQVNDLEdBQVEsSUFBSSxHQUFJakUsR0FBRSxFQUFFQSxFQUFFa0MsVUFBVUMsT0FBT25DLElBQUksQ0FBQyxHQUFJZ0MsR0FBT0UsVUFBVWxDLEVBQUcsS0FBSSxHQUFJOEIsS0FBT0UsR0FBV3RCLE9BQU9TLFVBQVVDLGVBQWVsQixLQUFLOEIsRUFBT0YsS0FBTW1DLEVBQU9uQyxHQUFLRSxFQUFPRixJQUFRLE1BQU9tQyxJQUFhQyxFQUFhLFdBQVcsUUFBU0MsR0FBaUJGLEVBQU9HLEdBQU8sSUFBSSxHQUFJcEUsR0FBRSxFQUFFQSxFQUFFb0UsRUFBTWpDLE9BQU9uQyxJQUFJLENBQUMsR0FBSXFFLEdBQVdELEVBQU1wRSxFQUFHcUUsR0FBV3hELFdBQVd3RCxFQUFXeEQsYUFBWSxFQUFNd0QsRUFBV3pELGNBQWEsRUFBUSxTQUFVeUQsS0FBV0EsRUFBV2pCLFVBQVMsR0FBSzFDLE9BQU9DLGVBQWVzRCxFQUFPSSxFQUFXdkMsSUFBSXVDLElBQWMsTUFBTyxVQUFTM0IsRUFBWTRCLEVBQVdDLEdBQXVJLE1BQXZIRCxJQUFXSCxFQUFpQnpCLEVBQVl2QixVQUFVbUQsR0FBZUMsR0FBWUosRUFBaUJ6QixFQUFZNkIsR0FBb0I3QixNTzlHdHNCOEIsRUFBUSxTQUFDQyxHQUFELE1BQVdBLEdBQU0sSUFDekJDLEVBQU8sU0FBQ0QsR0FBRCxNQUFXQSxHQUFNQSxFQUFNdEMsT0FBUyxJQUN2Q3dDLEVBQWEsU0FBQ0MsR0FBRCxNQUFvQixrQkFBTkEsSUFDM0JDLEVBQU8sYUFvQ1FDLEVQdUV5dEQsU0FBU0MsR0FBcUUsUUFBU0QsS0FBaUIsR0FBSUUsR0FBU0MsRUFBTUMsRUFBTUMsQ0FBSzNDLEdBQWdCNEMsS0FBS04sRUFBZ0IsS0FBSSxHQUFJTyxHQUFLbkQsVUFBVUMsT0FBT21ELEVBQUtDLE1BQU1GLEdBQU1HLEVBQUssRUFBRUEsRUFBS0gsRUFBS0csSUFBUUYsRUFBS0UsR0FBTXRELFVBQVVzRCxFQUFPLE9BQWFQLEdBQU9DLEVBQU10QyxFQUEyQndDLE1BQU1KLEVBQUtGLEVBQWV4QixXQUFXNUMsT0FBTytFLGVBQWVYLElBQWlCNUUsS0FBS3dGLE1BQU1WLEdBQU1JLE1BQU1PLE9BQU9MLEtBQWVKLEVPV3ZxRVUsTUFBUSxpQkFBTVYsR0FBS1csS0FBS0MsVUFBVUYsU1BYa3NFVixFT1lwdUVhLGFBQWUsaUJBQU1iLEdBQUtXLEtBQUtDLFVBQVVDLGdCUFpzd0ViLEVPYS95RWMsc0JBQXdCLGlCQUFNZCxHQUFLVyxLQUFLQyxVQUFVRSx5QlBiMDFFZCxFT2M1NEVlLFNBQVcsaUJBQU1mLEdBQUtXLEtBQUtDLFVBQVVHLFlQZDA2RWYsRU9lLzhFZ0IsT0FBUyxpQkFBTWhCLEdBQUtXLEtBQUtDLFVBQVVJLFVQZjIrRWhCLEVPZ0I5Z0ZpQixTQUFXLFNBQUM5RixHQUFELE1BQVc2RSxHQUFLVyxLQUFLQyxVQUFVSyxTQUFTOUYsSVBoQndpRjZFLEVPa0IzbEZrQixJQUFNLFNBQUNDLEdBQ0NuQixFQUFLZCxNQUFNa0MsT0FBT2hFLFFBQVErRCxNQUFXLEdBQU1uQixFQUFLZCxNQUFNbUMsZUFBZUYsSVBuQnduRm5CLEVPOEVyc0ZzQixpQkFBbUIsU0FBQ0MsR0FDaEJ2QixFQUFLd0IsaUJBRUQvQixFQUFXTyxFQUFLZCxNQUFNdUMsV0FBV0MsVUFDakMxQixFQUFLZCxNQUFNdUMsV0FBV0MsUUFBUUgsSVBsRnF6RnZCLEVPc0YzMUYyQixpQkFBbUIsU0FBQ0osR0FDaEJ2QixFQUFLd0IsaUJBRUQvQixFQUFXTyxFQUFLZCxNQUFNdUMsV0FBV0csVUFDakM1QixFQUFLZCxNQUFNdUMsV0FBV0csUUFBUUwsSVAxRjI4RnZCLEVPOEZqL0Y2QixjQUFnQixTQUFDTixHQUNiLE9BQVFBLEVBQU1PLE9BQ2QsSUFBSyxJQUNEOUIsRUFBSytCLG9CQUFvQlIsRUFBTVMsU0FDL0IsTUFFSixLQUFLLElBQ0RoQyxFQUFLaUMsZ0JBQWdCVixFQUFNUyxTQUMzQixNQUVKLEtBQUssR0FDR2hDLEVBQUtkLE1BQU1nRCxlQUFlakYsU0FDMUIrQyxFQUFLbUMsT0FBT25DLEVBQUtkLE1BQU1nRCxnQkFDdkJsQyxFQUFLVSxRQUdULE1BRUosS0FBSyxJQUNHYSxFQUFNYSxVQUNOYixFQUFNYyxpQkFFTnJDLEVBQUtVLFFBQ0xWLEVBQUtnQixTQUdMaEIsRUFBS3NDLDZCQUE4QixFQUVuQ3RDLEVBQUtkLE1BQU1xRCxtQkFBbUJ2QyxFQUFLZCxNQUFNa0MsU0FJN0MzQixFQUFXTyxFQUFLZCxNQUFNc0QsWUFDdEJ4QyxFQUFLZCxNQUFNc0QsVUFBVWpCLElQL0htK0R0QixFQUFnL0NGLEVBQU9yQyxFQUEyQnNDLEVBQU1DLEdBQW0vSSxNQUFsd01wQyxHQUFVK0IsRUFBZUMsR0FBNnZEYixFQUFhWSxJQUFpQmhELElBQUkscUJBQXFCekIsTUFBTSxTT2pCemtIc0gsR0FDZixHQUFNQyxHQUEwQkQsRUFBVVAsZUFDcENTLEVBQXlCekMsS0FBS2hCLE1BQU1nRCxjQU0xQyxJQUpJaEMsS0FBS2hCLE1BQU1rQyxPQUFPbkUsT0FBU3dGLEVBQVVyQixPQUFPbkUsUUFDNUNpRCxLQUFLZSxTQUFTLElBR2RmLEtBQUtvQyw0QkFHTCxZQUZBcEMsS0FBS29DLDZCQUE4QixFQUt2QyxJQUFPSSxJQUE0QkMsR0FDTSxJQUFsQ0EsRUFBdUIxRixPQUFjLENBQ3hDLEdBQXlDLElBQWxDMEYsRUFBdUIxRixRQUNoQjBGLEVBQXVCLEtBQU9ELEVBQXdCLEdBQ2hFLE1BQU94QyxNQUFLUyxLQUFMLFNBQW1CZ0MsRUFBdUIsSUFBTWpDLE9BQ3BELElBQUlsQixFQUFLbUQsS0FBNEJuRCxFQUFLa0QsR0FDN0MsTUFBT3hDLE1BQUtTLEtBQUwsU0FBbUJuQixFQUFLbUQsSUFBMkJqQyxPQUc5RFIsTUFBS1MsS0FBTCxTQUFtQmdDLEVBQXVCLElBQU1qQyxZUE51d0k5RCxJQUFJLFNBQVN6QixNQUFNLFNPc0IzMElnRyxHQUFPLEdBQUF5QixHQUFBMUMsS0FDSjJDLEdBQVd4QyxNQUFNeUMsUUFBUTNCLEdBQVNBLEdBQVNBLElBQVE0QixPQUFPLFNBQUNDLEdBQzdELE1BQU9KLEdBQUsxRCxNQUFNa0MsT0FBT2hFLFFBQVE0RixNQUFTLEdBRzFDSCxHQUFRNUYsUUFBVWlELEtBQUtoQixNQUFNK0QsbUJBQW1CSixNUDNCcy9JakcsSUFBSSxjQUFjekIsTUFBTSxTTzhCMWpKZ0csR0FDUmpCLEtBQUtoQixNQUFNcUQsb0JBQW9CcEIsT1AvQjBtSnZFLElBQUksZUFBZXpCLE1BQU0sU09rQ3pwSjBILEdBQ1QzQyxLQUFLaEIsTUFBTXFELG1CQUFtQk0sTVBuQzhzSmpHLElBQUksc0JBQXNCekIsTUFBTSxTT3NDNXZKK0gsR0FDaEIsR0FBTUMsR0FBV2pELEtBQUtoQixNQUFNZ0QsZUFDdEJXLEVBQVUzQyxLQUFLaEIsTUFBTWtDLE1BRTNCLElBQTJCLElBQXBCK0IsRUFBU2xHLFFBQ1RxQyxFQUFNNkQsS0FBYzdELEVBQU11RCxHQUlqQyxHQUF3QixJQUFwQk0sRUFBU2xHLE9BQ1RpRCxLQUFLa0QsWUFBWTVELEVBQUtxRCxRQUNuQixDQUNILEdBQU1RLEdBQWdCUixFQUFRQSxFQUFRekYsUUFBUWtDLEVBQU02RCxJQUFhLEVBRWpFakQsTUFBS29ELGFBQWFKLEdBQVVHLEdBQWU1QyxPQUFPMEMsSUFBYUUsUVBwRGlrS3pHLElBQUksa0JBQWtCekIsTUFBTSxTT3dEcHBLK0gsR0FDWixHQUFNQyxHQUFXakQsS0FBS2hCLE1BQU1nRCxlQUN0QlcsRUFBVTNDLEtBQUtoQixNQUFNa0MsTUFFM0IsSUFBd0IsSUFBcEIrQixFQUFTbEcsT0FJYixHQUFJdUMsRUFBSzJELEtBQWMzRCxFQUFLcUQsR0FDeEIzQyxLQUFLc0IsaUJBQ0x0QixLQUFLUSxZQUNGLENBQ0gsR0FBTTZDLEdBQVlWLEVBQVFBLEVBQVF6RixRQUFRb0MsRUFBSzJELElBQWEsRUFFNURqRCxNQUFLb0QsYUFBYUosRUFBU0MsRUFBUzFDLE9BQU84QyxJQUFjQSxRUHRFbzdLM0csSUFBSSxpQkFBaUJ6QixNQUFNLFdPMkU1Z0wrRSxLQUFLaEIsTUFBTXFELDBCUDNFaWtMM0YsSUFBSSx3QkFBd0J6QixNQUFNLFNPbUk1bExnRyxFQUFPSSxHQUV6QkEsRUFBTWlDLGtCQUVOdEQsS0FBS2lDLE9BQU9oQixHQUNaakIsS0FBS1EsUUFFRFIsS0FBS2hCLE1BQU11RSxvQkFBb0J2RSxNQUFNd0MsU0FDckN4QixLQUFLaEIsTUFBTXVFLG9CQUFvQnZFLE1BQU13QyxRQUFRSCxNUDNJMndMM0UsSUFBSSxtQkFBbUJ6QixNQUFNLFNPK0k1MExnRyxHQUNiLEdBQUlqQixLQUFLaEIsTUFBTXdFLGtCQUNYLE1BQU9wRixHQUFBcUYsRUFBTUMsYUFBYTFELEtBQUtoQixNQUFNdUUscUJBQ2pDSSxVQUFXckYsSUFBRywyQkFBNEIwQixLQUFLaEIsTUFBTXVFLG9CQUFvQnZFLE1BQU0yRSxXQUMvRW5DLFFBQVN4QixLQUFLNEQsc0JBQXNCQyxLQUFLN0QsS0FBTWlCLFFQbkp5b012RSxJQUFJLHFCQUFxQnpCLE1BQU0sU093Smh0TWdHLEVBQU9JLEdBQ3RCLE9BQVFBLEVBQU1PLE9BQ2QsSUFBSyxJQUNMLElBQUssSUFDRDVCLEtBQUtrRCxZQUFZakMsR0FDakJJLEVBQU1jLGdCQUNOLE1BRUosS0FBSyxHQUNEbkMsS0FBS2lDLE9BQU9oQixHQUNaakIsS0FBS1EsUUFDTGEsRUFBTWMscUJQbktnNk16RixJQUFJLGVBQWV6QixNQUFNLFdPd0t4N00sR0FBQTZJLEdBQUE5RCxJQUNYLE9BQ0k1QixHQUFBcUYsRUFBQU0sY0FBQSxPQUFLSixVQUFVLHVCQUNWM0QsS0FBS2hCLE1BQU1rQyxPQUFPOEMsSUFBSSxTQUFDL0MsR0FDcEIsTUFDSTdDLEdBQUFxRixFQUFBTSxjQUFBLE9BQ0lFLElBQUEsU0FBY2hELEVBQ2R2RSxJQUFLdUUsRUFDTDBDLFVBQVdyRixJQUFHLHNCQUNYNEYsOEJBQStCSixFQUFLOUUsTUFBTWdELGVBQWU5RSxRQUFRK0QsTUFBVyxJQUUvRU8sUUFBU3NDLEVBQUtaLFlBQVlXLEtBQWpCQyxFQUE0QjdDLEdBQ3JDcUIsVUFBV3dCLEVBQUtLLG1CQUFtQk4sS0FBeEJDLEVBQW1DN0MsR0FDOUNtRCxTQUFTLEtBQ1JOLEVBQUs5RSxNQUFNcUYsU0FBU3BELEdBQU9xRCxLQUMzQlIsRUFBS1MsaUJBQWlCdEQsVVB2THdoT3ZFLElBQUksU0FBU3pCLE1BQU0sV09nTXRsTyxNQUNJbUQsR0FBQXFGLEVBQUFNLGNBQUEsTUFBQXBGLEtBQ1FsRSxFQUFBRyxFQUFBOEQsRUFBQSxHQUFLc0IsS0FBS2hCLE1BQU9VLEVBQWU4RSxlQUNwQ1AsSUFBSSxVQUNKTixVQUFXckYsSUFBRyx1QkFBd0IwQixLQUFLaEIsTUFBTTJFLFdBQ2pEckIsVUFBV3RDLEtBQUsyQixnQkFDZjNCLEtBQUt5RSxlQUVOckcsRUFBQXFGLEVBQUFNLGNBQUN2RixFQUFBaUYsRUFBRDlFLEtBQ1FsRSxFQUFBRyxFQUFBNkQsRUFBQSxHQUFrQnVCLEtBQUtoQixNQUFPUixFQUFBaUYsRUFBVWlCLGVBQzVDVCxJQUFJLFlBQ0pOLFVBQVUsZUFDVmdCLGtCQUFrQixFQUNsQnBELFdBQUE1QyxLQUNPcUIsS0FBS2hCLE1BQU11QyxZQUNkQyxRQUFTeEIsS0FBS29CLGlCQUNkTSxRQUFTMUIsS0FBS3lCLG1CQUVsQm1ELGlCQUFrQjVFLEtBQUtnQixZUGxOMitQdEIsR092RTErUHRCLEVBQUFxRixFQUFNb0IsY0FBN0JuRixHQUNWb0YsVVBzRWtuUW5HLEtPcEVsblFILEVBQUFpRixFQUFVcUIsV0FLYjNELGVBQWdCaEQsRUFBQSxVQUFVNEcsS0FLMUJoQyxtQkFBb0I1RSxFQUFBLFVBQVU0RyxLQUs5QjFDLG1CQUFvQmxFLEVBQUEsVUFBVTRHLEtBSzlCeEIsb0JBQXFCcEYsRUFBQSxVQUFVNkcsUUFLL0J4QixrQkFBbUJyRixFQUFBLFVBQVU4RyxLQUs3Qi9ELE9BQVEvQyxFQUFBLFVBQVUrRyxRQUFRL0csRUFBQSxVQUFVZ0gsUUFLcENuRCxlQUFnQjdELEVBQUEsVUFBVStHLFFBQVEvRyxFQUFBLFVBQVVnSCxVQXRDL0J6RixFQXlDVmdGLGFQOEJ5MFIvRixLTzdCejBSSCxFQUFBaUYsRUFBVWlCLGNBQ2J2RCxlQUFnQjFCLEVBQ2hCc0QsbUJBQW9CdEQsRUFDcEI0QyxtQkFBb0I1QyxFQUNwQjhELG9CQUFzQm5GLEVBQUFxRixFQUFBTSxjQUFBLGdCQUN0QlAsbUJBQW1CLEVBQ25CdEMsVUFDQWMsb0JBakRhdEMsRUFvRFY4RSxhQUFlbEosT0FBT2lCLEtBQUttRCxFQUFlZ0YsY1BtQmdyU3ZJLEVBQTZCLFFPdkU3dVN1RCIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbi8qKioqKiovIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbi8qKioqKiovIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA1KTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG4vKiBoYXJtb255IGV4cG9ydCAoaW1tdXRhYmxlKSAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiYVwiXSA9IGdldEludGVyc2VjdGlvbjtcbmZ1bmN0aW9uIGdldEludGVyc2VjdGlvbihvYmoxLG9iajIpe3JldHVybiBPYmplY3Qua2V5cyhvYmoyKS5yZWR1Y2UoZnVuY3Rpb24oY2hpbGRQcm9wcyxrZXkpe2lmKGtleSBpbiBvYmoxKXtjaGlsZFByb3BzW2tleV09b2JqMVtrZXldO31yZXR1cm4gY2hpbGRQcm9wczt9LHt9KTt9XG5cbi8qKiovIH0pLFxuLyogMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qIGhhcm1vbnkgZXhwb3J0IChpbW11dGFibGUpICovIF9fd2VicGFja19leHBvcnRzX19bXCJhXCJdID0gb21pdEtleXNGcm9tU291cmNlT2JqZWN0O1xuZnVuY3Rpb24gb21pdEtleXNGcm9tU291cmNlT2JqZWN0KHNvdXJjZSl7dmFyIG9taXR0ZWRLZXlzPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dW5kZWZpbmVkP2FyZ3VtZW50c1sxXTpbXTtyZXR1cm4gT2JqZWN0LmtleXMoc291cmNlKS5yZWR1Y2UoZnVuY3Rpb24gcmVsb2NhdGVBY2NlcHRlZEtleXMoaGFzaCxrZXkpe2lmKG9taXR0ZWRLZXlzLmluZGV4T2Yoa2V5KT09PS0xKXtoYXNoW2tleV09c291cmNlW2tleV07fXJldHVybiBoYXNoO30se30pO31cblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy10eXBlYWhlYWRcIik7XG5cbi8qKiovIH0pLFxuLyogMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpO1xuXG4vKioqLyB9KSxcbi8qIDQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3RcIik7XG5cbi8qKiovIH0pLFxuLyogNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgX193ZWJwYWNrX2V4cG9ydHNfXywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShfX3dlYnBhY2tfZXhwb3J0c19fLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5uKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdHlwZWFoZWFkX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdHlwZWFoZWFkX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3R5cGVhaGVhZF9fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX29iamVjdF9pbnRlcnNlY3Rpb25fXyA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfXyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG52YXIgX2V4dGVuZHM9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24odGFyZ2V0KXtmb3IodmFyIGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXt2YXIgc291cmNlPWFyZ3VtZW50c1tpXTtmb3IodmFyIGtleSBpbiBzb3VyY2Upe2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2Usa2V5KSl7dGFyZ2V0W2tleV09c291cmNlW2tleV07fX19cmV0dXJuIHRhcmdldDt9O3ZhciBfY3JlYXRlQ2xhc3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCxwcm9wcyl7Zm9yKHZhciBpPTA7aTxwcm9wcy5sZW5ndGg7aSsrKXt2YXIgZGVzY3JpcHRvcj1wcm9wc1tpXTtkZXNjcmlwdG9yLmVudW1lcmFibGU9ZGVzY3JpcHRvci5lbnVtZXJhYmxlfHxmYWxzZTtkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZT10cnVlO2lmKFwidmFsdWVcImluIGRlc2NyaXB0b3IpZGVzY3JpcHRvci53cml0YWJsZT10cnVlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsZGVzY3JpcHRvci5rZXksZGVzY3JpcHRvcik7fX1yZXR1cm4gZnVuY3Rpb24oQ29uc3RydWN0b3IscHJvdG9Qcm9wcyxzdGF0aWNQcm9wcyl7aWYocHJvdG9Qcm9wcylkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSxwcm90b1Byb3BzKTtpZihzdGF0aWNQcm9wcylkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLHN0YXRpY1Byb3BzKTtyZXR1cm4gQ29uc3RydWN0b3I7fTt9KCk7ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLENvbnN0cnVjdG9yKXtpZighKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO319ZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZixjYWxsKXtpZighc2VsZil7dGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO31yZXR1cm4gY2FsbCYmKHR5cGVvZiBjYWxsPT09XCJvYmplY3RcInx8dHlwZW9mIGNhbGw9PT1cImZ1bmN0aW9uXCIpP2NhbGw6c2VsZjt9ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLHN1cGVyQ2xhc3Mpe2lmKHR5cGVvZiBzdXBlckNsYXNzIT09XCJmdW5jdGlvblwiJiZzdXBlckNsYXNzIT09bnVsbCl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIrdHlwZW9mIHN1cGVyQ2xhc3MpO31zdWJDbGFzcy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzJiZzdXBlckNsYXNzLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnN1YkNsYXNzLGVudW1lcmFibGU6ZmFsc2Usd3JpdGFibGU6dHJ1ZSxjb25maWd1cmFibGU6dHJ1ZX19KTtpZihzdXBlckNsYXNzKU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3Msc3VwZXJDbGFzcyk6c3ViQ2xhc3MuX19wcm90b19fPXN1cGVyQ2xhc3M7fXZhciBmaXJzdD1mdW5jdGlvbiBmaXJzdChhcnJheSl7cmV0dXJuIGFycmF5WzBdO307dmFyIGxhc3Q9ZnVuY3Rpb24gbGFzdChhcnJheSl7cmV0dXJuIGFycmF5W2FycmF5Lmxlbmd0aC0xXTt9O3ZhciBpc0Z1bmN0aW9uPWZ1bmN0aW9uIGlzRnVuY3Rpb24oeCl7cmV0dXJuIHR5cGVvZiB4PT09J2Z1bmN0aW9uJzt9O3ZhciBub29wPWZ1bmN0aW9uIG5vb3AoKXt9O3ZhciBUb2tlbml6ZWRJbnB1dD1mdW5jdGlvbihfUmVhY3QkUHVyZUNvbXBvbmVudCl7X2luaGVyaXRzKFRva2VuaXplZElucHV0LF9SZWFjdCRQdXJlQ29tcG9uZW50KTtmdW5jdGlvbiBUb2tlbml6ZWRJbnB1dCgpe3ZhciBfcmVmO3ZhciBfdGVtcCxfdGhpcyxfcmV0O19jbGFzc0NhbGxDaGVjayh0aGlzLFRva2VuaXplZElucHV0KTtmb3IodmFyIF9sZW49YXJndW1lbnRzLmxlbmd0aCxhcmdzPUFycmF5KF9sZW4pLF9rZXk9MDtfa2V5PF9sZW47X2tleSsrKXthcmdzW19rZXldPWFyZ3VtZW50c1tfa2V5XTt9cmV0dXJuIF9yZXQ9KF90ZW1wPShfdGhpcz1fcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLChfcmVmPVRva2VuaXplZElucHV0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKFRva2VuaXplZElucHV0KSkuY2FsbC5hcHBseShfcmVmLFt0aGlzXS5jb25jYXQoYXJncykpKSxfdGhpcyksX3RoaXMuZm9jdXM9ZnVuY3Rpb24oKXtyZXR1cm4gX3RoaXMucmVmcy50eXBlYWhlYWQuZm9jdXMoKTt9LF90aGlzLmdldElucHV0Tm9kZT1mdW5jdGlvbigpe3JldHVybiBfdGhpcy5yZWZzLnR5cGVhaGVhZC5nZXRJbnB1dE5vZGUoKTt9LF90aGlzLmdldFNlbGVjdGVkRW50aXR5VGV4dD1mdW5jdGlvbigpe3JldHVybiBfdGhpcy5yZWZzLnR5cGVhaGVhZC5nZXRTZWxlY3RlZEVudGl0eVRleHQoKTt9LF90aGlzLmdldFZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIF90aGlzLnJlZnMudHlwZWFoZWFkLmdldFZhbHVlKCk7fSxfdGhpcy5zZWxlY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gX3RoaXMucmVmcy50eXBlYWhlYWQuc2VsZWN0KCk7fSxfdGhpcy5zZXRWYWx1ZT1mdW5jdGlvbih2YWx1ZSl7cmV0dXJuIF90aGlzLnJlZnMudHlwZWFoZWFkLnNldFZhbHVlKHZhbHVlKTt9LF90aGlzLmFkZD1mdW5jdGlvbihpbmRleCl7aWYoX3RoaXMucHJvcHMudG9rZW5zLmluZGV4T2YoaW5kZXgpPT09LTEpe190aGlzLnByb3BzLmhhbmRsZUFkZFRva2VuKGluZGV4KTt9fSxfdGhpcy5oYW5kbGVJbnB1dENsaWNrPWZ1bmN0aW9uKGV2ZW50KXtfdGhpcy5jbGVhclNlbGVjdGlvbigpO2lmKGlzRnVuY3Rpb24oX3RoaXMucHJvcHMuaW5wdXRQcm9wcy5vbkNsaWNrKSl7X3RoaXMucHJvcHMuaW5wdXRQcm9wcy5vbkNsaWNrKGV2ZW50KTt9fSxfdGhpcy5oYW5kbGVJbnB1dEZvY3VzPWZ1bmN0aW9uKGV2ZW50KXtfdGhpcy5jbGVhclNlbGVjdGlvbigpO2lmKGlzRnVuY3Rpb24oX3RoaXMucHJvcHMuaW5wdXRQcm9wcy5vbkZvY3VzKSl7X3RoaXMucHJvcHMuaW5wdXRQcm9wcy5vbkZvY3VzKGV2ZW50KTt9fSxfdGhpcy5oYW5kbGVLZXlEb3duPWZ1bmN0aW9uKGV2ZW50KXtzd2l0Y2goZXZlbnQud2hpY2gpe2Nhc2UgMzc6X3RoaXMuc2VsZWN0UHJldmlvdXNUb2tlbihldmVudC5zaGlmdEtleSk7YnJlYWs7Y2FzZSAzOTpfdGhpcy5zZWxlY3ROZXh0VG9rZW4oZXZlbnQuc2hpZnRLZXkpO2JyZWFrO2Nhc2UgODppZihfdGhpcy5wcm9wcy50b2tlbnNTZWxlY3RlZC5sZW5ndGgpe190aGlzLnJlbW92ZShfdGhpcy5wcm9wcy50b2tlbnNTZWxlY3RlZCk7X3RoaXMuZm9jdXMoKTt9YnJlYWs7Y2FzZSA2NTppZihldmVudC5tZXRhS2V5KXtldmVudC5wcmV2ZW50RGVmYXVsdCgpO190aGlzLmZvY3VzKCk7X3RoaXMuc2VsZWN0KCk7X3RoaXMuX3N1cHByZXNzTmV4dFRva2VuU2VsZWN0aW9uPXRydWU7X3RoaXMucHJvcHMuaGFuZGxlTmV3U2VsZWN0aW9uKF90aGlzLnByb3BzLnRva2Vucyk7fX1pZihpc0Z1bmN0aW9uKF90aGlzLnByb3BzLm9uS2V5RG93bikpe190aGlzLnByb3BzLm9uS2V5RG93bihldmVudCk7fX0sX3RlbXApLF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLF9yZXQpO31fY3JlYXRlQ2xhc3MoVG9rZW5pemVkSW5wdXQsW3trZXk6J2NvbXBvbmVudERpZFVwZGF0ZScsdmFsdWU6ZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcyl7dmFyIHByZXZpb3VzU2VsZWN0ZWRJbmRleGVzPXByZXZQcm9wcy50b2tlbnNTZWxlY3RlZDt2YXIgY3VycmVudFNlbGVjdGVkSW5kZXhlcz10aGlzLnByb3BzLnRva2Vuc1NlbGVjdGVkO2lmKHRoaXMucHJvcHMudG9rZW5zLmxlbmd0aD5wcmV2UHJvcHMudG9rZW5zLmxlbmd0aCl7dGhpcy5zZXRWYWx1ZSgnJyk7fWlmKHRoaXMuX3N1cHByZXNzTmV4dFRva2VuU2VsZWN0aW9uKXt0aGlzLl9zdXBwcmVzc05leHRUb2tlblNlbGVjdGlvbj1mYWxzZTtyZXR1cm47fWlmKHByZXZpb3VzU2VsZWN0ZWRJbmRleGVzIT09Y3VycmVudFNlbGVjdGVkSW5kZXhlcyYmY3VycmVudFNlbGVjdGVkSW5kZXhlcy5sZW5ndGghPT0wKXtpZihjdXJyZW50U2VsZWN0ZWRJbmRleGVzLmxlbmd0aD09PTF8fGN1cnJlbnRTZWxlY3RlZEluZGV4ZXNbMF0hPT1wcmV2aW91c1NlbGVjdGVkSW5kZXhlc1swXSl7cmV0dXJuIHRoaXMucmVmc1sndG9rZW5fJytjdXJyZW50U2VsZWN0ZWRJbmRleGVzWzBdXS5mb2N1cygpO31lbHNlIGlmKGxhc3QoY3VycmVudFNlbGVjdGVkSW5kZXhlcykhPT1sYXN0KHByZXZpb3VzU2VsZWN0ZWRJbmRleGVzKSl7cmV0dXJuIHRoaXMucmVmc1sndG9rZW5fJytsYXN0KGN1cnJlbnRTZWxlY3RlZEluZGV4ZXMpXS5mb2N1cygpO310aGlzLnJlZnNbJ3Rva2VuXycrY3VycmVudFNlbGVjdGVkSW5kZXhlc1swXV0uZm9jdXMoKTt9fX0se2tleToncmVtb3ZlJyx2YWx1ZTpmdW5jdGlvbiByZW1vdmUoaW5kZXgpe3ZhciBfdGhpczI9dGhpczt2YXIgaW5kZXhlcz0oQXJyYXkuaXNBcnJheShpbmRleCk/aW5kZXg6W2luZGV4XSkuZmlsdGVyKGZ1bmN0aW9uKGlkeCl7cmV0dXJuIF90aGlzMi5wcm9wcy50b2tlbnMuaW5kZXhPZihpZHgpIT09LTE7fSk7aWYoaW5kZXhlcy5sZW5ndGgpe3RoaXMucHJvcHMuaGFuZGxlUmVtb3ZlVG9rZW5zKGluZGV4ZXMpO319fSx7a2V5OidzZWxlY3RUb2tlbicsdmFsdWU6ZnVuY3Rpb24gc2VsZWN0VG9rZW4oaW5kZXgpe3RoaXMucHJvcHMuaGFuZGxlTmV3U2VsZWN0aW9uKFtpbmRleF0pO319LHtrZXk6J3NlbGVjdFRva2VucycsdmFsdWU6ZnVuY3Rpb24gc2VsZWN0VG9rZW5zKGluZGV4ZXMpe3RoaXMucHJvcHMuaGFuZGxlTmV3U2VsZWN0aW9uKGluZGV4ZXMpO319LHtrZXk6J3NlbGVjdFByZXZpb3VzVG9rZW4nLHZhbHVlOmZ1bmN0aW9uIHNlbGVjdFByZXZpb3VzVG9rZW4oYXBwZW5kKXt2YXIgc2VsZWN0ZWQ9dGhpcy5wcm9wcy50b2tlbnNTZWxlY3RlZDt2YXIgaW5kZXhlcz10aGlzLnByb3BzLnRva2VucztpZihzZWxlY3RlZC5sZW5ndGg9PT0xJiZmaXJzdChzZWxlY3RlZCk9PT1maXJzdChpbmRleGVzKSl7cmV0dXJuO31pZihzZWxlY3RlZC5sZW5ndGg9PT0wKXt0aGlzLnNlbGVjdFRva2VuKGxhc3QoaW5kZXhlcykpO31lbHNle3ZhciBwcmV2aW91c1Rva2VuPWluZGV4ZXNbaW5kZXhlcy5pbmRleE9mKGZpcnN0KHNlbGVjdGVkKSktMV07dGhpcy5zZWxlY3RUb2tlbnMoYXBwZW5kP1twcmV2aW91c1Rva2VuXS5jb25jYXQoc2VsZWN0ZWQpOltwcmV2aW91c1Rva2VuXSk7fX19LHtrZXk6J3NlbGVjdE5leHRUb2tlbicsdmFsdWU6ZnVuY3Rpb24gc2VsZWN0TmV4dFRva2VuKGFwcGVuZCl7dmFyIHNlbGVjdGVkPXRoaXMucHJvcHMudG9rZW5zU2VsZWN0ZWQ7dmFyIGluZGV4ZXM9dGhpcy5wcm9wcy50b2tlbnM7aWYoc2VsZWN0ZWQubGVuZ3RoPT09MCl7cmV0dXJuO31pZihsYXN0KHNlbGVjdGVkKT09PWxhc3QoaW5kZXhlcykpe3RoaXMuY2xlYXJTZWxlY3Rpb24oKTt0aGlzLmZvY3VzKCk7fWVsc2V7dmFyIG5leHRUb2tlbj1pbmRleGVzW2luZGV4ZXMuaW5kZXhPZihsYXN0KHNlbGVjdGVkKSkrMV07dGhpcy5zZWxlY3RUb2tlbnMoYXBwZW5kP3NlbGVjdGVkLmNvbmNhdChuZXh0VG9rZW4pOltuZXh0VG9rZW5dKTt9fX0se2tleTonY2xlYXJTZWxlY3Rpb24nLHZhbHVlOmZ1bmN0aW9uIGNsZWFyU2VsZWN0aW9uKCl7dGhpcy5wcm9wcy5oYW5kbGVOZXdTZWxlY3Rpb24oW10pO319LHtrZXk6J2hhbmRsZVRva2VuQ2xvc2VDbGljaycsdmFsdWU6ZnVuY3Rpb24gaGFuZGxlVG9rZW5DbG9zZUNsaWNrKGluZGV4LGV2ZW50KXtldmVudC5zdG9wUHJvcGFnYXRpb24oKTt0aGlzLnJlbW92ZShpbmRleCk7dGhpcy5mb2N1cygpO2lmKHRoaXMucHJvcHMudG9rZW5DbG9zZUNvbXBvbmVudC5wcm9wcy5vbkNsaWNrKXt0aGlzLnByb3BzLnRva2VuQ2xvc2VDb21wb25lbnQucHJvcHMub25DbGljayhldmVudCk7fX19LHtrZXk6J3JlbmRlclRva2VuQ2xvc2UnLHZhbHVlOmZ1bmN0aW9uIHJlbmRlclRva2VuQ2xvc2UoaW5kZXgpe2lmKHRoaXMucHJvcHMudG9rZW5DbG9zZVZpc2libGUpe3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY2xvbmVFbGVtZW50KHRoaXMucHJvcHMudG9rZW5DbG9zZUNvbXBvbmVudCx7Y2xhc3NOYW1lOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCgpKCdiLXRva2VuZmllbGQtdG9rZW4tY2xvc2UnLHRoaXMucHJvcHMudG9rZW5DbG9zZUNvbXBvbmVudC5wcm9wcy5jbGFzc05hbWUpLG9uQ2xpY2s6dGhpcy5oYW5kbGVUb2tlbkNsb3NlQ2xpY2suYmluZCh0aGlzLGluZGV4KX0pO319fSx7a2V5OidoYW5kbGVUb2tlbktleURvd24nLHZhbHVlOmZ1bmN0aW9uIGhhbmRsZVRva2VuS2V5RG93bihpbmRleCxldmVudCl7c3dpdGNoKGV2ZW50LndoaWNoKXtjYXNlIDEzOmNhc2UgMzI6dGhpcy5zZWxlY3RUb2tlbihpbmRleCk7ZXZlbnQucHJldmVudERlZmF1bHQoKTticmVhaztjYXNlIDg6dGhpcy5yZW1vdmUoaW5kZXgpO3RoaXMuZm9jdXMoKTtldmVudC5wcmV2ZW50RGVmYXVsdCgpO2JyZWFrO319fSx7a2V5OidyZW5kZXJUb2tlbnMnLHZhbHVlOmZ1bmN0aW9uIHJlbmRlclRva2Vucygpe3ZhciBfdGhpczM9dGhpcztyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoJ2Rpdicse2NsYXNzTmFtZTonYi10b2tlbmZpZWxkLXRva2Vucyd9LHRoaXMucHJvcHMudG9rZW5zLm1hcChmdW5jdGlvbihpbmRleCl7cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KCdkaXYnLHtyZWY6J3Rva2VuXycraW5kZXgsa2V5OmluZGV4LGNsYXNzTmFtZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQoKSgnYi10b2tlbmZpZWxkLXRva2VuJyx7J2ItdG9rZW5maWVsZC10b2tlbi1zZWxlY3RlZCc6X3RoaXMzLnByb3BzLnRva2Vuc1NlbGVjdGVkLmluZGV4T2YoaW5kZXgpIT09LTF9KSxvbkNsaWNrOl90aGlzMy5zZWxlY3RUb2tlbi5iaW5kKF90aGlzMyxpbmRleCksb25LZXlEb3duOl90aGlzMy5oYW5kbGVUb2tlbktleURvd24uYmluZChfdGhpczMsaW5kZXgpLHRhYkluZGV4OicwJ30sX3RoaXMzLnByb3BzLmVudGl0aWVzW2luZGV4XS50ZXh0LF90aGlzMy5yZW5kZXJUb2tlbkNsb3NlKGluZGV4KSk7fSkpO319LHtrZXk6J3JlbmRlcicsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyKCl7cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KCdkaXYnLF9leHRlbmRzKHt9LF9fd2VicGFja19yZXF1aXJlX18uaShfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fW1wiYVwiIC8qIGRlZmF1bHQgKi9dKSh0aGlzLnByb3BzLFRva2VuaXplZElucHV0LmludGVybmFsS2V5cykse3JlZjond3JhcHBlcicsY2xhc3NOYW1lOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCgpKCdiLXRva2VuZmllbGQtd3JhcHBlcicsdGhpcy5wcm9wcy5jbGFzc05hbWUpLG9uS2V5RG93bjp0aGlzLmhhbmRsZUtleURvd259KSx0aGlzLnJlbmRlclRva2VucygpLF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdHlwZWFoZWFkX19fZGVmYXVsdC5hLF9leHRlbmRzKHt9LF9fd2VicGFja19yZXF1aXJlX18uaShfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX29iamVjdF9pbnRlcnNlY3Rpb25fX1tcImFcIiAvKiBkZWZhdWx0ICovXSkodGhpcy5wcm9wcyxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3R5cGVhaGVhZF9fX2RlZmF1bHQuYS5kZWZhdWx0UHJvcHMpLHtyZWY6J3R5cGVhaGVhZCcsY2xhc3NOYW1lOidiLXRva2VuZmllbGQnLGNsZWFyT25TZWxlY3Rpb246dHJ1ZSxpbnB1dFByb3BzOl9leHRlbmRzKHt9LHRoaXMucHJvcHMuaW5wdXRQcm9wcyx7b25DbGljazp0aGlzLmhhbmRsZUlucHV0Q2xpY2ssb25Gb2N1czp0aGlzLmhhbmRsZUlucHV0Rm9jdXN9KSxvbkVudGl0eVNlbGVjdGVkOnRoaXMuYWRkfSkpKTt9fV0pO3JldHVybiBUb2tlbml6ZWRJbnB1dDt9KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5QdXJlQ29tcG9uZW50KTtUb2tlbml6ZWRJbnB1dC5wcm9wVHlwZXM9X2V4dGVuZHMoe30sX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc190eXBlYWhlYWRfX19kZWZhdWx0LmEucHJvcFR5cGVzLHtoYW5kbGVBZGRUb2tlbjpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jLGhhbmRsZVJlbW92ZVRva2VuczpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jLGhhbmRsZU5ld1NlbGVjdGlvbjpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jLHRva2VuQ2xvc2VDb21wb25lbnQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uZWxlbWVudCx0b2tlbkNsb3NlVmlzaWJsZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ib29sLHRva2VuczpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5hcnJheU9mKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm51bWJlciksdG9rZW5zU2VsZWN0ZWQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYXJyYXlPZihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5udW1iZXIpfSk7VG9rZW5pemVkSW5wdXQuZGVmYXVsdFByb3BzPV9leHRlbmRzKHt9LF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdHlwZWFoZWFkX19fZGVmYXVsdC5hLmRlZmF1bHRQcm9wcyx7aGFuZGxlQWRkVG9rZW46bm9vcCxoYW5kbGVSZW1vdmVUb2tlbnM6bm9vcCxoYW5kbGVOZXdTZWxlY3Rpb246bm9vcCx0b2tlbkNsb3NlQ29tcG9uZW50Ol9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jcmVhdGVFbGVtZW50KCdkaXYnLG51bGwsJ1gnKSx0b2tlbkNsb3NlVmlzaWJsZTp0cnVlLHRva2VuczpbXSx0b2tlbnNTZWxlY3RlZDpbXX0pO1Rva2VuaXplZElucHV0LmludGVybmFsS2V5cz1PYmplY3Qua2V5cyhUb2tlbml6ZWRJbnB1dC5kZWZhdWx0UHJvcHMpOy8qIGhhcm1vbnkgZGVmYXVsdCBleHBvcnQgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSBUb2tlbml6ZWRJbnB1dDtcblxuLyoqKi8gfSlcbi8qKioqKiovIF0pO1xuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBpbmRleC5qcyIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDUpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIDg3ZTZhOGQ2NjhjNjM4ZjhiMzhjIiwiLyoqXG4gKiBSZXR1cm5zIGFuIGludGVyc2VjdGlvbiBvZiB0aGUgZmlyc3QgYXJndW1lbnQgYWdhaW5zdCB0aGUgc2Vjb25kIGFyZ3VtZW50J3Mga2V5cy5cbiAqIGUuZy4gdXNlZCBpbiBUeXBlYWhlYWQgdG8gaWRlbnRpZnkgd2hpY2ggcHJvcHMgYXJlIG1lYW50IGZvciBJbnB1dFxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gb2JqMVxuICogQHBhcmFtICB7T2JqZWN0fSBvYmoyXG4gKlxuICogQHJldHVybiB7T2JqZWN0fSBrZXk6IHZhbHVlcyBpbiBvYmoxIG1hdGNoaW5nIHRoZSBrZXlzIHN1cHBsaWVkIGluIG9iajJcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRJbnRlcnNlY3Rpb24ob2JqMSwgb2JqMikge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmoyKS5yZWR1Y2UoKGNoaWxkUHJvcHMsIGtleSkgPT4ge1xuICAgICAgICBpZiAoa2V5IGluIG9iajEpIHtcbiAgICAgICAgICAgIGNoaWxkUHJvcHNba2V5XSA9IG9iajFba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjaGlsZFByb3BzO1xuXG4gICAgfSwge30pO1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvYm91bmRsZXNzLXV0aWxzLW9iamVjdC1pbnRlcnNlY3Rpb24vaW5kZXguanMiLCIvKipcbiAqIFJldHVybnMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBzdXBwbGllZCBvYmplY3Qgd2l0aG91dCB0aGUgZ2l2ZW4ga2V5cy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb21pdEtleXNGcm9tU291cmNlT2JqZWN0KHNvdXJjZSwgb21pdHRlZEtleXMgPSBbXSkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhzb3VyY2UpLnJlZHVjZShmdW5jdGlvbiByZWxvY2F0ZUFjY2VwdGVkS2V5cyhoYXNoLCBrZXkpIHtcbiAgICAgICAgaWYgKG9taXR0ZWRLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpIHtcbiAgICAgICAgICAgIGhhc2hba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhc2g7XG4gICAgfSwge30pO1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvYm91bmRsZXNzLXV0aWxzLW9taXQta2V5cy9pbmRleC5qcyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy10eXBlYWhlYWRcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtdHlwZWFoZWFkXCJ9XG4vLyBtb2R1bGUgaWQgPSAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNsYXNzbmFtZXNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJjbGFzc25hbWVzXCJ9XG4vLyBtb2R1bGUgaWQgPSAzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn1cbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IFJlYWN0LCB7UHJvcFR5cGVzfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY3ggZnJvbSAnY2xhc3NuYW1lcyc7XG5cbmltcG9ydCBUeXBlYWhlYWQgZnJvbSAnYm91bmRsZXNzLXR5cGVhaGVhZCc7XG5pbXBvcnQgZXh0cmFjdENoaWxkUHJvcHMgZnJvbSAnYm91bmRsZXNzLXV0aWxzLW9iamVjdC1pbnRlcnNlY3Rpb24nO1xuaW1wb3J0IG9taXQgZnJvbSAnYm91bmRsZXNzLXV0aWxzLW9taXQta2V5cyc7XG5cbmNvbnN0IGZpcnN0ID0gKGFycmF5KSA9PiBhcnJheVswXTtcbmNvbnN0IGxhc3QgPSAoYXJyYXkpID0+IGFycmF5W2FycmF5Lmxlbmd0aCAtIDFdO1xuY29uc3QgaXNGdW5jdGlvbiA9ICh4KSA9PiB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJztcbmNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcblxuLyoqXG4jIFRva2VuaXplZElucHV0XG5fX0Rpc3RpbGwgcmljaCBlbnRpdHkgZGF0YSBtYXRjaGVkIHZpYSB0eXBlYWhlYWQgaW5wdXQgaW50byBzaW1wbGUgdmlzdWFsIGFic3RyYWN0aW9ucy5fX1xuXG5CYXNpYyB1c2FnZSBvZiB0aGlzIGNvbXBvbmVudCBpcyBpZGVudGljYWwgdG8gdGhhdCBvZiBbVHlwZWFoZWFkXShodHRwczovL2dpdGh1Yi5jb20vZW5pZ21hLWlvL2JvdW5kbGVzcy9tYXN0ZXIvcGFja2FnZXMvYm91bmRsZXNzLXR5cGVhaGVhZCkuIEFkZGl0aW9uYWwgcHJvcHMgYXJlIGF2YWlsYWJsZSB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgdG9rZW5pemF0aW9uIGZ1bmN0aW9uYWxpdHkuXG5cbiMjIENvbXBvbmVudCBJbnN0YW5jZSBNZXRob2RzXG5cbldoZW4gdXNpbmcgYFRva2VuaXplZElucHV0YCBpbiB5b3VyIHByb2plY3QsIHlvdSBtYXkgY2FsbCB0aGUgZm9sbG93aW5nIG1ldGhvZHMgb24gYSByZW5kZXJlZCBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50LiBVc2UgW2ByZWZzYF0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy9yZWZzLWFuZC10aGUtZG9tLmh0bWwpIHRvIGdldCB0aGUgaW5zdGFuY2UuXG5cbi0gX19gYWRkKGluZGV4OiBudW1iZXIpYF9fXG4gIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlcyBhIHRva2VuIGZvciBgcHJvcHMuZW50aXRpZXNbaW5kZXhdYDsgYHByb3BzLmhhbmRsZUFkZFRva2VuYCB3aWxsIGJlIGNhbGxlZCBhcyBhIGhpbnQgdG8gcGVyc2lzdCB0aGUgY2hhbmdlIGluIHlvdXIgY29udHJvbGxlciB2aWV3IG9yIG90aGVyIGFwcGxpY2F0aW9uIHN0YXRlXG5cbi0gX19gZm9jdXMoKWBfX1xuICBmb2N1c2VzIHRoZSBicm93c2VyIG9vbiB0aGUgdW5kZXJseWluZyB0ZXh0dWFsIGlucHV0IGZvciBpbW1lZGlhdGUgdGV4dCBlbnRyeVxuXG4tIF9fYGdldElucHV0Tm9kZSgpYF9fXG4gIHJldHVybnMgdGhlIHJhdyB1bmRlcmx5aW5nIHRleHR1YWwgaW5wdXQgRE9NIG5vZGVcblxuLSBfX2BnZXRTZWxlY3RlZEVudGl0eVRleHQoKWBfX1xuICByZXR1cm5zIHRoZSBgdGV4dGAgcHJvcGVydHkgb2YgdGhlIGN1cnJlbnRseSBoaWdobGlnaHRlZCBlbnRpdHkgKGZyb20gYHByb3BzLmVudGl0aWVzYCksIG9yIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nXG5cbi0gX19gZ2V0VmFsdWUoKWBfX1xuICByZXRyaWV2ZXMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHVuZGVybHlpbmcgdGV4dHVhbCBpbnB1dFxuXG4tIF9fYHJlbW92ZShpbmRleDogbnVtYmVyKWBfX1xuICBwcm9ncmFtbWF0aWNhbGx5IHJlbW92ZXMgdGhlIHRva2VuIGZvciBgcHJvcHMuZW50aXRpZXNbaW5kZXhdYDsgYHByb3BzLmhhbmRsZVJlbW92ZVRva2Vuc2Agd2lsbCBiZSBjYWxsZWQgYXMgYSBoaW50IHRvIHBlcnNpc3QgdGhlIGNoYW5nZSBpbiB5b3VyIGNvbnRyb2xsZXIgdmlldyBvciBvdGhlciBhcHBsaWNhdGlvbiBzdGF0ZVxuXG4tIF9fYHNlbGVjdCgpYF9fXG4gIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlcyBhIGZ1bGwgc2VsZWN0aW9uIG9uIHRoZSB1bmRlcmx5aW5nIHRleHR1YWwgaW5wdXQgc3VjaCB0aGF0IGEgcHJlc3Mgb2YgdGhlIEJhY2tzcGFjZSBrZXkgd291bGQgZnVsbHkgY2xlYXIgdGhlIGlucHV0XG5cbi0gX19gc2V0VmFsdWUodmFsdWU6IHN0cmluZylgX19cbiAgc2V0cyB0aGUgdW5kZXJseWluZyB0ZXh0dWFsIGlucHV0IHRvIHRoZSBzcGVjaWZpZWQgdGV4dCBhbmQgdXBkYXRlcyBpbnRlcm5hbCBzdGF0ZTsgZG8gbm90IHVzZSB0aGlzIG1ldGhvZCB3aGVuIHVzaW5nIGBUeXBlYWhlYWRgIGFzIGEgXCJjb250cm9sbGVkIGlucHV0XCJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVG9rZW5pemVkSW5wdXQgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgICAvKiogVG9rZW5pemVkSW5wdXQgYWNjZXB0cyBhbGwgW2BUeXBlYWhlYWRgXSgvVHlwZWFoZWFkI3Byb3BzKSBhbmQgW2BJbnB1dGBdKC9JbnB1dCNwcm9wcykgcHJvcHMgKi9cbiAgICAgICAgLi4uVHlwZWFoZWFkLnByb3BUeXBlcyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogZnVuY3Rpb24gaGFuZGxlciB0aGF0IGlzIGNhbGxlZCB3aGVuIGFuIGVudGl0eSBpcyBzZWxlY3RlZCBieSB0aGUgdXNlciBhbmQgYSB0b2tlbiBzaG91bGQgYmUgY3JlYXRlZFxuICAgICAgICAgKi9cbiAgICAgICAgaGFuZGxlQWRkVG9rZW46IFByb3BUeXBlcy5mdW5jLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBmdW5jdGlvbiBoYW5kbGVyIHRoYXQgaXMgY2FsbGVkIHdoZW4gb25lIG9yIG1vcmUgdG9rZW5zIGFyZSByZW1vdmVkIGJ5IHRoZSB1c2VyIHZpYSBjbGlja2luZyB0aGUgXCJjbG9zZVwiIGJ1dHRvbiBvciBwcmVzc2luZyB0aGUgYEJhY2tzcGFjZWAga2V5IHdoaWxlIHRva2VucyBhcmUgc2VsZWN0ZWRcbiAgICAgICAgICovXG4gICAgICAgIGhhbmRsZVJlbW92ZVRva2VuczogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGZ1bmN0aW9uIGhhbmRsZXIgdGhhdCBpcyBjYWxsZWQgd2hlbiBvbmUgb3IgbW9yZSB0b2tlbnMgYXJlIHNlbGVjdGVkIGJ5IHRoZSB1c2VyIHZpYSBjbGljayBvciBrZXlib2FyZCBhY3Rpb25zOyBjYWxsZWQgd2l0aCB3aGF0IHRoZSBuZXcgc2VsZWN0aW9uIHNob3VsZCBiZVxuICAgICAgICAgKi9cbiAgICAgICAgaGFuZGxlTmV3U2VsZWN0aW9uOiBQcm9wVHlwZXMuZnVuYyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogdGhlIEpTWCB1c2VkIGZvciB0aGUgY2xvc2UgYnV0dG9uIGl0c2VsZlxuICAgICAgICAgKi9cbiAgICAgICAgdG9rZW5DbG9zZUNvbXBvbmVudDogUHJvcFR5cGVzLmVsZW1lbnQsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGRldGVybWluZXMgaWYgdGhlIGAuYi10b2tlbmZpZWxkLXRva2VuLWNsb3NlYCBlbGVtZW50IHNob3VsZCBiZSByZW5kZXJlZCBmb3IgZWFjaCB0b2tlblxuICAgICAgICAgKi9cbiAgICAgICAgdG9rZW5DbG9zZVZpc2libGU6IFByb3BUeXBlcy5ib29sLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0aGUgaW5kZXhlcyBvZiBlbnRpdGllcyB0aGF0IHNob3VsZCBiZSByZW5kZXJlZCBhcyBcInRva2Vuc1wiIGluIHRoZSBjb21wb25lbnQgVUlcbiAgICAgICAgICovXG4gICAgICAgIHRva2VuczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm51bWJlciksXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRoZSBpbmRleGVzIG9mIHRva2VuaXplZCBlbnRpdGllcyB0aGF0IGFyZSBwYXJ0IG9mIGFuIGFjdGl2ZSBzZWxlY3Rpb247IHRoZSB1c2VyIGNhbiBwcmVzcyBgQmFja3NwYWNlYCB0byB0cmlnZ2VyIGBoYW5kbGVSZW1vdmVUb2tlbnNgXG4gICAgICAgICAqL1xuICAgICAgICB0b2tlbnNTZWxlY3RlZDogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm51bWJlciksXG4gICAgfVxuXG4gICAgc3RhdGljIGRlZmF1bHRQcm9wcyA9IHtcbiAgICAgICAgLi4uVHlwZWFoZWFkLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgaGFuZGxlQWRkVG9rZW46IG5vb3AsXG4gICAgICAgIGhhbmRsZVJlbW92ZVRva2Vuczogbm9vcCxcbiAgICAgICAgaGFuZGxlTmV3U2VsZWN0aW9uOiBub29wLFxuICAgICAgICB0b2tlbkNsb3NlQ29tcG9uZW50OiAoPGRpdj5YPC9kaXY+KSxcbiAgICAgICAgdG9rZW5DbG9zZVZpc2libGU6IHRydWUsXG4gICAgICAgIHRva2VuczogW10sXG4gICAgICAgIHRva2Vuc1NlbGVjdGVkOiBbXSxcbiAgICB9XG5cbiAgICBzdGF0aWMgaW50ZXJuYWxLZXlzID0gT2JqZWN0LmtleXMoVG9rZW5pemVkSW5wdXQuZGVmYXVsdFByb3BzKVxuXG4gICAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgICAgICBjb25zdCBwcmV2aW91c1NlbGVjdGVkSW5kZXhlcyA9IHByZXZQcm9wcy50b2tlbnNTZWxlY3RlZDtcbiAgICAgICAgY29uc3QgY3VycmVudFNlbGVjdGVkSW5kZXhlcyA9IHRoaXMucHJvcHMudG9rZW5zU2VsZWN0ZWQ7XG5cbiAgICAgICAgaWYgKHRoaXMucHJvcHMudG9rZW5zLmxlbmd0aCA+IHByZXZQcm9wcy50b2tlbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlKCcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9zdXBwcmVzc05leHRUb2tlblNlbGVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fc3VwcHJlc3NOZXh0VG9rZW5TZWxlY3Rpb24gPSBmYWxzZTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCAgIHByZXZpb3VzU2VsZWN0ZWRJbmRleGVzICE9PSBjdXJyZW50U2VsZWN0ZWRJbmRleGVzXG4gICAgICAgICAgICAmJiBjdXJyZW50U2VsZWN0ZWRJbmRleGVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgaWYgKCAgIGN1cnJlbnRTZWxlY3RlZEluZGV4ZXMubGVuZ3RoID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgIHx8IGN1cnJlbnRTZWxlY3RlZEluZGV4ZXNbMF0gIT09IHByZXZpb3VzU2VsZWN0ZWRJbmRleGVzWzBdIC8qIG11bHRpIHNlbGVjdGlvbiwgbGVmdHdhcmQgKi8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWZzW2B0b2tlbl8ke2N1cnJlbnRTZWxlY3RlZEluZGV4ZXNbMF19YF0uZm9jdXMoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdChjdXJyZW50U2VsZWN0ZWRJbmRleGVzKSAhPT0gbGFzdChwcmV2aW91c1NlbGVjdGVkSW5kZXhlcykgLyogbXVsdGkgc2VsZWN0aW9uLCByaWdodHdhcmQgKi8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWZzW2B0b2tlbl8ke2xhc3QoY3VycmVudFNlbGVjdGVkSW5kZXhlcyl9YF0uZm9jdXMoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5yZWZzW2B0b2tlbl8ke2N1cnJlbnRTZWxlY3RlZEluZGV4ZXNbMF19YF0uZm9jdXMoKTtcbiAgICAgICAgfSAvLyBtb3ZlIGZvY3VzXG4gICAgfVxuXG4gICAgLy8gcGFzc3Rocm91Z2hzIHRvIFR5cGVhaGVhZCBpbnN0YW5jZSBtZXRob2RzXG4gICAgZm9jdXMgPSAoKSA9PiB0aGlzLnJlZnMudHlwZWFoZWFkLmZvY3VzKClcbiAgICBnZXRJbnB1dE5vZGUgPSAoKSA9PiB0aGlzLnJlZnMudHlwZWFoZWFkLmdldElucHV0Tm9kZSgpXG4gICAgZ2V0U2VsZWN0ZWRFbnRpdHlUZXh0ID0gKCkgPT4gdGhpcy5yZWZzLnR5cGVhaGVhZC5nZXRTZWxlY3RlZEVudGl0eVRleHQoKVxuICAgIGdldFZhbHVlID0gKCkgPT4gdGhpcy5yZWZzLnR5cGVhaGVhZC5nZXRWYWx1ZSgpXG4gICAgc2VsZWN0ID0gKCkgPT4gdGhpcy5yZWZzLnR5cGVhaGVhZC5zZWxlY3QoKVxuICAgIHNldFZhbHVlID0gKHZhbHVlKSA9PiB0aGlzLnJlZnMudHlwZWFoZWFkLnNldFZhbHVlKHZhbHVlKVxuXG4gICAgYWRkID0gKGluZGV4KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLnRva2Vucy5pbmRleE9mKGluZGV4KSA9PT0gLTEpIHsgdGhpcy5wcm9wcy5oYW5kbGVBZGRUb2tlbihpbmRleCk7IH1cbiAgICB9XG5cbiAgICByZW1vdmUoaW5kZXgpIHtcbiAgICAgICAgY29uc3QgaW5kZXhlcyA9IChBcnJheS5pc0FycmF5KGluZGV4KSA/IGluZGV4IDogW2luZGV4XSkuZmlsdGVyKChpZHgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3BzLnRva2Vucy5pbmRleE9mKGlkeCkgIT09IC0xO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaW5kZXhlcy5sZW5ndGgpIHsgdGhpcy5wcm9wcy5oYW5kbGVSZW1vdmVUb2tlbnMoaW5kZXhlcyk7IH1cbiAgICB9XG5cbiAgICBzZWxlY3RUb2tlbihpbmRleCkge1xuICAgICAgICB0aGlzLnByb3BzLmhhbmRsZU5ld1NlbGVjdGlvbihbaW5kZXhdKTtcbiAgICB9XG5cbiAgICBzZWxlY3RUb2tlbnMoaW5kZXhlcykge1xuICAgICAgICB0aGlzLnByb3BzLmhhbmRsZU5ld1NlbGVjdGlvbihpbmRleGVzKTtcbiAgICB9XG5cbiAgICBzZWxlY3RQcmV2aW91c1Rva2VuKGFwcGVuZCkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMucHJvcHMudG9rZW5zU2VsZWN0ZWQ7XG4gICAgICAgIGNvbnN0IGluZGV4ZXMgPSB0aGlzLnByb3BzLnRva2VucztcblxuICAgICAgICBpZiAoICAgc2VsZWN0ZWQubGVuZ3RoID09PSAxXG4gICAgICAgICAgICAmJiBmaXJzdChzZWxlY3RlZCkgPT09IGZpcnN0KGluZGV4ZXMpKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIGFscmVhZHkgYXQgbGVmdG1vc3QgYm91bmRcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPT09IDApIHsgLy8gcGljayB0aGUgcmlnaHRtb3N0XG4gICAgICAgICAgICB0aGlzLnNlbGVjdFRva2VuKGxhc3QoaW5kZXhlcykpO1xuICAgICAgICB9IGVsc2UgeyAvLyBhZGQgdGhlIG5leHQgbGVmdG1vc3QgdG8gYSByZWNvbnN0cnVjdGVkIFwic2VsZWN0ZWRcIiBhcnJheVxuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNUb2tlbiA9IGluZGV4ZXNbaW5kZXhlcy5pbmRleE9mKGZpcnN0KHNlbGVjdGVkKSkgLSAxXTtcblxuICAgICAgICAgICAgdGhpcy5zZWxlY3RUb2tlbnMoYXBwZW5kID8gW3ByZXZpb3VzVG9rZW5dLmNvbmNhdChzZWxlY3RlZCkgOiBbcHJldmlvdXNUb2tlbl0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VsZWN0TmV4dFRva2VuKGFwcGVuZCkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMucHJvcHMudG9rZW5zU2VsZWN0ZWQ7XG4gICAgICAgIGNvbnN0IGluZGV4ZXMgPSB0aGlzLnByb3BzLnRva2VucztcblxuICAgICAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGFzdChzZWxlY3RlZCkgPT09IGxhc3QoaW5kZXhlcykpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHRUb2tlbiA9IGluZGV4ZXNbaW5kZXhlcy5pbmRleE9mKGxhc3Qoc2VsZWN0ZWQpKSArIDFdO1xuXG4gICAgICAgICAgICB0aGlzLnNlbGVjdFRva2VucyhhcHBlbmQgPyBzZWxlY3RlZC5jb25jYXQobmV4dFRva2VuKSA6IFtuZXh0VG9rZW5dKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsZWFyU2VsZWN0aW9uKCkge1xuICAgICAgICB0aGlzLnByb3BzLmhhbmRsZU5ld1NlbGVjdGlvbihbXSk7XG4gICAgfVxuXG4gICAgaGFuZGxlSW5wdXRDbGljayA9IChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uQ2xpY2spKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLmlucHV0UHJvcHMub25DbGljayhldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYW5kbGVJbnB1dEZvY3VzID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcblxuICAgICAgICBpZiAoaXNGdW5jdGlvbih0aGlzLnByb3BzLmlucHV0UHJvcHMub25Gb2N1cykpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMuaW5wdXRQcm9wcy5vbkZvY3VzKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZUtleURvd24gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgc3dpdGNoIChldmVudC53aGljaCkge1xuICAgICAgICBjYXNlIDM3OiAgICAvLyBsZWZ0IGFycm93XG4gICAgICAgICAgICB0aGlzLnNlbGVjdFByZXZpb3VzVG9rZW4oZXZlbnQuc2hpZnRLZXkpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAzOTogICAgLy8gcmlnaHQgYXJyb3dcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0TmV4dFRva2VuKGV2ZW50LnNoaWZ0S2V5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgODogICAgIC8vIGJhY2tzcGFjZVxuICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMudG9rZW5zU2VsZWN0ZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUodGhpcy5wcm9wcy50b2tlbnNTZWxlY3RlZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDY1OiAgICAvLyBsZXR0ZXIgXCJhXCJcbiAgICAgICAgICAgIGlmIChldmVudC5tZXRhS2V5KSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdCgpO1xuXG4gICAgICAgICAgICAgICAgLy8gaGFja3ksIGJ1dCB0aGUgb25seSB3YXkgdW5sZXNzIHdlIG1vdmUgc2VsZWN0aW9uIG1hbmFnZW1lbnQgaW50ZXJuYWwgYWdhaW5cbiAgICAgICAgICAgICAgICB0aGlzLl9zdXBwcmVzc05leHRUb2tlblNlbGVjdGlvbiA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLmhhbmRsZU5ld1NlbGVjdGlvbih0aGlzLnByb3BzLnRva2Vucyk7XG4gICAgICAgICAgICB9IC8vIFwiY21kXCJcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHRoaXMucHJvcHMub25LZXlEb3duKSkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5vbktleURvd24oZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlVG9rZW5DbG9zZUNsaWNrKGluZGV4LCBldmVudCkge1xuICAgICAgICAvLyBpZiB3ZSBkb24ndCBzdG9wIHByb3BhZ2F0aW9uLCB0aGUgZXZlbnQgYnViYmxlcyBhbmQgcmVzdWx0cyBpbiBhIGZhaWxlZCB0b2tlbiBzZWxlY3Rpb25cbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgdGhpcy5yZW1vdmUoaW5kZXgpO1xuICAgICAgICB0aGlzLmZvY3VzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMucHJvcHMudG9rZW5DbG9zZUNvbXBvbmVudC5wcm9wcy5vbkNsaWNrKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLnRva2VuQ2xvc2VDb21wb25lbnQucHJvcHMub25DbGljayhldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXJUb2tlbkNsb3NlKGluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLnRva2VuQ2xvc2VWaXNpYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KHRoaXMucHJvcHMudG9rZW5DbG9zZUNvbXBvbmVudCwge1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogY3goJ2ItdG9rZW5maWVsZC10b2tlbi1jbG9zZScsIHRoaXMucHJvcHMudG9rZW5DbG9zZUNvbXBvbmVudC5wcm9wcy5jbGFzc05hbWUpLFxuICAgICAgICAgICAgICAgIG9uQ2xpY2s6IHRoaXMuaGFuZGxlVG9rZW5DbG9zZUNsaWNrLmJpbmQodGhpcywgaW5kZXgpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYW5kbGVUb2tlbktleURvd24oaW5kZXgsIGV2ZW50KSB7XG4gICAgICAgIHN3aXRjaCAoZXZlbnQud2hpY2gpIHtcbiAgICAgICAgY2FzZSAxMzogLy8gZW50ZXJcbiAgICAgICAgY2FzZSAzMjogLy8gc3BhY2VcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0VG9rZW4oaW5kZXgpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgODogLy8gYmFja3NwYWNlXG4gICAgICAgICAgICB0aGlzLnJlbW92ZShpbmRleCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXJUb2tlbnMoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nYi10b2tlbmZpZWxkLXRva2Vucyc+XG4gICAgICAgICAgICAgICAge3RoaXMucHJvcHMudG9rZW5zLm1hcCgoaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9e2B0b2tlbl8ke2luZGV4fWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KCdiLXRva2VuZmllbGQtdG9rZW4nLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ItdG9rZW5maWVsZC10b2tlbi1zZWxlY3RlZCc6IHRoaXMucHJvcHMudG9rZW5zU2VsZWN0ZWQuaW5kZXhPZihpbmRleCkgIT09IC0xLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuc2VsZWN0VG9rZW4uYmluZCh0aGlzLCBpbmRleCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25LZXlEb3duPXt0aGlzLmhhbmRsZVRva2VuS2V5RG93bi5iaW5kKHRoaXMsIGluZGV4KX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJJbmRleD0nMCc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3RoaXMucHJvcHMuZW50aXRpZXNbaW5kZXhdLnRleHR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3RoaXMucmVuZGVyVG9rZW5DbG9zZShpbmRleCl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICB7Li4ub21pdCh0aGlzLnByb3BzLCBUb2tlbml6ZWRJbnB1dC5pbnRlcm5hbEtleXMpfVxuICAgICAgICAgICAgICAgIHJlZj0nd3JhcHBlcidcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2N4KCdiLXRva2VuZmllbGQtd3JhcHBlcicsIHRoaXMucHJvcHMuY2xhc3NOYW1lKX1cbiAgICAgICAgICAgICAgICBvbktleURvd249e3RoaXMuaGFuZGxlS2V5RG93bn0+XG4gICAgICAgICAgICAgICAge3RoaXMucmVuZGVyVG9rZW5zKCl9XG5cbiAgICAgICAgICAgICAgICA8VHlwZWFoZWFkXG4gICAgICAgICAgICAgICAgICAgIHsuLi5leHRyYWN0Q2hpbGRQcm9wcyh0aGlzLnByb3BzLCBUeXBlYWhlYWQuZGVmYXVsdFByb3BzKX1cbiAgICAgICAgICAgICAgICAgICAgcmVmPSd0eXBlYWhlYWQnXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0nYi10b2tlbmZpZWxkJ1xuICAgICAgICAgICAgICAgICAgICBjbGVhck9uU2VsZWN0aW9uPXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3BzPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLnByb3BzLmlucHV0UHJvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUlucHV0Q2xpY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkZvY3VzOiB0aGlzLmhhbmRsZUlucHV0Rm9jdXMsXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIG9uRW50aXR5U2VsZWN0ZWQ9e3RoaXMuYWRkfSAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvYm91bmRsZXNzLXRva2VuaXplZC1pbnB1dC9pbmRleC5qcyJdLCJzb3VyY2VSb290IjoiIn0= | ||
module.exports=function(e){function t(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,o){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:o})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=5)}([function(e,t){e.exports=require("boundless-typeahead")},function(e,t){e.exports=require("boundless-utils-object-intersection")},function(e,t){e.exports=require("boundless-utils-omit-keys")},function(e,t){e.exports=require("classnames")},function(e,t){e.exports=require("react")},function(e,t,n){"use strict";function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var i=n(4),l=n.n(i),p=n(3),c=n.n(p),a=n(0),u=n.n(a),f=n(1),h=n.n(f),d=n(2),k=n.n(d),y=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},v=function(){function e(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}return function(t,n,o){return n&&e(t.prototype,n),o&&e(t,o),t}}(),b=function(e){return e[0]},T=function(e){return e[e.length-1]},m=function(e){return"function"==typeof e},C=function(e){function t(){var e,n,s,i;o(this,t);for(var l=arguments.length,p=Array(l),c=0;c<l;c++)p[c]=arguments[c];return n=s=r(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(p))),s.focus=function(){return s.refs.typeahead.focus()},s.getInputNode=function(){return s.refs.typeahead.getInputNode()},s.getSelectedEntityText=function(){return s.refs.typeahead.getSelectedEntityText()},s.getValue=function(){return s.refs.typeahead.getValue()},s.select=function(){return s.refs.typeahead.select()},s.setValue=function(e){return s.refs.typeahead.setValue(e)},s.add=function(e){s.props.tokens.indexOf(e)===-1&&s.props.handleAddToken(e)},s.handleInputClick=function(e){s.clearSelection(),m(s.props.inputProps.onClick)&&s.props.inputProps.onClick(e)},s.handleInputFocus=function(e){s.clearSelection(),m(s.props.inputProps.onFocus)&&s.props.inputProps.onFocus(e)},s.handleKeyDown=function(e){switch(e.which){case 37:s.selectPreviousToken(e.shiftKey);break;case 39:s.selectNextToken(e.shiftKey);break;case 8:s.props.tokensSelected.length&&(s.remove(s.props.tokensSelected),s.focus());break;case 65:e.metaKey&&(e.preventDefault(),s.focus(),s.select(),s._suppressNextTokenSelection=!0,s.props.handleNewSelection(s.props.tokens))}m(s.props.onKeyDown)&&s.props.onKeyDown(e)},i=n,r(s,i)}return s(t,e),v(t,[{key:"componentDidUpdate",value:function(e){var t=e.tokensSelected,n=this.props.tokensSelected;if(this.props.tokens.length>e.tokens.length&&this.setValue(""),this._suppressNextTokenSelection)return void(this._suppressNextTokenSelection=!1);if(t!==n&&0!==n.length){if(1===n.length||n[0]!==t[0])return this.refs["token_"+n[0]].focus();if(T(n)!==T(t))return this.refs["token_"+T(n)].focus();this.refs["token_"+n[0]].focus()}}},{key:"remove",value:function(e){var t=this,n=(Array.isArray(e)?e:[e]).filter(function(e){return t.props.tokens.indexOf(e)!==-1});n.length&&this.props.handleRemoveTokens(n)}},{key:"selectToken",value:function(e){this.props.handleNewSelection([e])}},{key:"selectTokens",value:function(e){this.props.handleNewSelection(e)}},{key:"selectPreviousToken",value:function(e){var t=this.props.tokensSelected,n=this.props.tokens;if(1!==t.length||b(t)!==b(n))if(0===t.length)this.selectToken(T(n));else{var o=n[n.indexOf(b(t))-1];this.selectTokens(e?[o].concat(t):[o])}}},{key:"selectNextToken",value:function(e){var t=this.props.tokensSelected,n=this.props.tokens;if(0!==t.length)if(T(t)===T(n))this.clearSelection(),this.focus();else{var o=n[n.indexOf(T(t))+1];this.selectTokens(e?t.concat(o):[o])}}},{key:"clearSelection",value:function(){this.props.handleNewSelection([])}},{key:"handleTokenCloseClick",value:function(e,t){t.stopPropagation(),this.remove(e),this.focus(),this.props.tokenCloseComponent.props.onClick&&this.props.tokenCloseComponent.props.onClick(t)}},{key:"renderTokenClose",value:function(e){if(this.props.tokenCloseVisible)return l.a.cloneElement(this.props.tokenCloseComponent,{className:c()("b-tokenfield-token-close",this.props.tokenCloseComponent.props.className),onClick:this.handleTokenCloseClick.bind(this,e)})}},{key:"handleTokenKeyDown",value:function(e,t){switch(t.which){case 13:case 32:this.selectToken(e),t.preventDefault();break;case 8:this.remove(e),this.focus(),t.preventDefault()}}},{key:"renderTokens",value:function(){var e=this;return l.a.createElement("div",{className:"b-tokenfield-tokens"},this.props.tokens.map(function(t){return l.a.createElement("div",{ref:"token_"+t,key:t,className:c()("b-tokenfield-token",{"b-tokenfield-token-selected":e.props.tokensSelected.indexOf(t)!==-1}),onClick:e.selectToken.bind(e,t),onKeyDown:e.handleTokenKeyDown.bind(e,t),tabIndex:"0"},e.props.entities[t].text,e.renderTokenClose(t))}))}},{key:"render",value:function(){return l.a.createElement("div",y({},k()(this.props,t.internalKeys),{ref:"wrapper",className:c()("b-tokenfield-wrapper",this.props.className),onKeyDown:this.handleKeyDown}),this.renderTokens(),l.a.createElement(u.a,y({},h()(this.props,u.a.defaultProps),{ref:"typeahead",className:"b-tokenfield",clearOnSelection:!0,inputProps:y({},this.props.inputProps,{onClick:this.handleInputClick,onFocus:this.handleInputFocus}),onEntitySelected:this.add})))}}]),t}(l.a.PureComponent);C.propTypes=y({},u.a.propTypes,{handleAddToken:i.PropTypes.func,handleRemoveTokens:i.PropTypes.func,handleNewSelection:i.PropTypes.func,tokenCloseComponent:i.PropTypes.element,tokenCloseVisible:i.PropTypes.bool,tokens:i.PropTypes.arrayOf(i.PropTypes.number),tokensSelected:i.PropTypes.arrayOf(i.PropTypes.number)}),C.defaultProps=y({},u.a.defaultProps,{handleAddToken:function(){},handleRemoveTokens:function(){},handleNewSelection:function(){},tokenCloseComponent:l.a.createElement("div",null,"X"),tokenCloseVisible:!0,tokens:[],tokensSelected:[]}),C.internalKeys=Object.keys(C.defaultProps),t.default=C}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIGE5MWMxMzEzYzJjYjdiNGVjOWQxIiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy10eXBlYWhlYWRcIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXV0aWxzLW9iamVjdC1pbnRlcnNlY3Rpb25cIn0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXV0aWxzLW9taXQta2V5c1wifSIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJjbGFzc25hbWVzXCJ9Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qczJcIjpcInJlYWN0XCJ9Iiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy10b2tlbml6ZWQtaW5wdXQvaW5kZXguanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJ2YWx1ZSIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwicmVxdWlyZSIsIl9fd2VicGFja19leHBvcnRzX18iLCJfY2xhc3NDYWxsQ2hlY2siLCJpbnN0YW5jZSIsIkNvbnN0cnVjdG9yIiwiVHlwZUVycm9yIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJzZWxmIiwiUmVmZXJlbmNlRXJyb3IiLCJfaW5oZXJpdHMiLCJzdWJDbGFzcyIsInN1cGVyQ2xhc3MiLCJjcmVhdGUiLCJjb25zdHJ1Y3RvciIsIndyaXRhYmxlIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQiLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0IiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc190eXBlYWhlYWRfXyIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdHlwZWFoZWFkX19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfb2JqZWN0X2ludGVyc2VjdGlvbl9fIiwiX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc19vYmplY3RfaW50ZXJzZWN0aW9uX19fZGVmYXVsdCIsIl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18iLCJfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fX2RlZmF1bHQiLCJfZXh0ZW5kcyIsImFzc2lnbiIsInRhcmdldCIsImFyZ3VtZW50cyIsImxlbmd0aCIsInNvdXJjZSIsImtleSIsIl9jcmVhdGVDbGFzcyIsImRlZmluZVByb3BlcnRpZXMiLCJwcm9wcyIsImRlc2NyaXB0b3IiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJmaXJzdCIsImFycmF5IiwibGFzdCIsImlzRnVuY3Rpb24iLCJ4IiwiVG9rZW5pemVkSW5wdXQiLCJfUmVhY3QkUHVyZUNvbXBvbmVudCIsIl9yZWYiLCJfdGVtcCIsIl90aGlzIiwiX3JldCIsInRoaXMiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImdldFByb3RvdHlwZU9mIiwiYXBwbHkiLCJjb25jYXQiLCJmb2N1cyIsInJlZnMiLCJ0eXBlYWhlYWQiLCJnZXRJbnB1dE5vZGUiLCJnZXRTZWxlY3RlZEVudGl0eVRleHQiLCJnZXRWYWx1ZSIsInNlbGVjdCIsInNldFZhbHVlIiwiYWRkIiwiaW5kZXgiLCJ0b2tlbnMiLCJpbmRleE9mIiwiaGFuZGxlQWRkVG9rZW4iLCJoYW5kbGVJbnB1dENsaWNrIiwiZXZlbnQiLCJjbGVhclNlbGVjdGlvbiIsImlucHV0UHJvcHMiLCJvbkNsaWNrIiwiaGFuZGxlSW5wdXRGb2N1cyIsIm9uRm9jdXMiLCJoYW5kbGVLZXlEb3duIiwid2hpY2giLCJzZWxlY3RQcmV2aW91c1Rva2VuIiwic2hpZnRLZXkiLCJzZWxlY3ROZXh0VG9rZW4iLCJ0b2tlbnNTZWxlY3RlZCIsInJlbW92ZSIsIm1ldGFLZXkiLCJwcmV2ZW50RGVmYXVsdCIsIl9zdXBwcmVzc05leHRUb2tlblNlbGVjdGlvbiIsImhhbmRsZU5ld1NlbGVjdGlvbiIsIm9uS2V5RG93biIsInByZXZQcm9wcyIsInByZXZpb3VzU2VsZWN0ZWRJbmRleGVzIiwiY3VycmVudFNlbGVjdGVkSW5kZXhlcyIsIl90aGlzMiIsImluZGV4ZXMiLCJpc0FycmF5IiwiZmlsdGVyIiwiaWR4IiwiaGFuZGxlUmVtb3ZlVG9rZW5zIiwiYXBwZW5kIiwic2VsZWN0ZWQiLCJzZWxlY3RUb2tlbiIsInByZXZpb3VzVG9rZW4iLCJzZWxlY3RUb2tlbnMiLCJuZXh0VG9rZW4iLCJzdG9wUHJvcGFnYXRpb24iLCJ0b2tlbkNsb3NlQ29tcG9uZW50IiwidG9rZW5DbG9zZVZpc2libGUiLCJhIiwiY2xvbmVFbGVtZW50IiwiY2xhc3NOYW1lIiwiaGFuZGxlVG9rZW5DbG9zZUNsaWNrIiwiYmluZCIsIl90aGlzMyIsImNyZWF0ZUVsZW1lbnQiLCJtYXAiLCJyZWYiLCJiLXRva2VuZmllbGQtdG9rZW4tc2VsZWN0ZWQiLCJoYW5kbGVUb2tlbktleURvd24iLCJ0YWJJbmRleCIsImVudGl0aWVzIiwidGV4dCIsInJlbmRlclRva2VuQ2xvc2UiLCJpbnRlcm5hbEtleXMiLCJyZW5kZXJUb2tlbnMiLCJkZWZhdWx0UHJvcHMiLCJjbGVhck9uU2VsZWN0aW9uIiwib25FbnRpdHlTZWxlY3RlZCIsIlB1cmVDb21wb25lbnQiLCJwcm9wVHlwZXMiLCJmdW5jIiwiZWxlbWVudCIsImJvb2wiLCJhcnJheU9mIiwibnVtYmVyIiwia2V5cyJdLCJtYXBwaW5ncyI6IkFBQUFBLE9BQU9DLFFBQ0UsU0FBVUMsR0NHbkIsUUFBQUMsR0FBQUMsR0FHQSxHQUFBQyxFQUFBRCxHQUNBLE1BQUFDLEdBQUFELEdBQUFILE9BR0EsSUFBQUQsR0FBQUssRUFBQUQsSUFDQUUsRUFBQUYsRUFDQUcsR0FBQSxFQUNBTixXQVVBLE9BTkFDLEdBQUFFLEdBQUFJLEtBQUFSLEVBQUFDLFFBQUFELElBQUFDLFFBQUFFLEdBR0FILEVBQUFPLEdBQUEsRUFHQVAsRUFBQUMsUUF2QkEsR0FBQUksS0ErREEsT0FuQ0FGLEdBQUFNLEVBQUFQLEVBR0FDLEVBQUFPLEVBQUFMLEVBR0FGLEVBQUFHLEVBQUEsU0FBQUssR0FBMkMsTUFBQUEsSUFHM0NSLEVBQUFTLEVBQUEsU0FBQVgsRUFBQVksRUFBQUMsR0FDQVgsRUFBQVksRUFBQWQsRUFBQVksSUFDQUcsT0FBQUMsZUFBQWhCLEVBQUFZLEdBQ0FLLGNBQUEsRUFDQUMsWUFBQSxFQUNBQyxJQUFBTixLQU1BWCxFQUFBa0IsRUFBQSxTQUFBckIsR0FDQSxHQUFBYyxHQUFBZCxLQUFBc0IsV0FDQSxXQUEyQixNQUFBdEIsR0FBQSxTQUMzQixXQUFpQyxNQUFBQSxHQUVqQyxPQURBRyxHQUFBUyxFQUFBRSxFQUFBLElBQUFBLEdBQ0FBLEdBSUFYLEVBQUFZLEVBQUEsU0FBQVEsRUFBQUMsR0FBc0QsTUFBQVIsUUFBQVMsVUFBQUMsZUFBQWxCLEtBQUFlLEVBQUFDLElBR3REckIsRUFBQXdCLEVBQUEsR0FHQXhCLElBQUF5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QUFvQixhQUNwQlYsbUJBQW9CLGFBQ3BCa0Isb0JBQXNCekYsRUFBQTJGLEVBQUFNLGNBQUEsZ0JBQ3RCUCxtQkFBbUIsRUFDbkJ2QyxVQUNBZSxvQkFoRGF2QyxFQW1EVitFLGFBQWV6SSxPQUFPcUosS0FBSzNGLEVBQWVpRixjUG9Ca3FTN0gsRUFBNkIsUU92RS90UzRDIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPVxuLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbi8qKioqKiovIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4vKioqKioqLyBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuLyoqKioqKi8gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuLyoqKioqKi8gXHRcdFx0XHRnZXQ6IGdldHRlclxuLyoqKioqKi8gXHRcdFx0fSk7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4vKioqKioqLyBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbi8qKioqKiovIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4vKioqKioqLyBcdFx0cmV0dXJuIGdldHRlcjtcbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDUpO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtdHlwZWFoZWFkXCIpO1xuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYm91bmRsZXNzLXV0aWxzLW9iamVjdC1pbnRlcnNlY3Rpb25cIik7XG5cbi8qKiovIH0pLFxuLyogMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzXCIpO1xuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2xhc3NuYW1lc1wiKTtcblxuLyoqKi8gfSksXG4vKiA0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG4vKioqLyB9KSxcbi8qIDUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIF9fd2VicGFja19leHBvcnRzX18sIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoX193ZWJwYWNrX2V4cG9ydHNfXywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3R5cGVhaGVhZF9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbi8qIGhhcm1vbnkgaW1wb3J0ICovIHZhciBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3R5cGVhaGVhZF9fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc190eXBlYWhlYWRfXyk7XG4vKiBoYXJtb255IGltcG9ydCAqLyB2YXIgX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc19vYmplY3RfaW50ZXJzZWN0aW9uX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfM19ib3VuZGxlc3NfdXRpbHNfb2JqZWN0X2ludGVyc2VjdGlvbl9fX2RlZmF1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLm4oX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8zX2JvdW5kbGVzc191dGlsc19vYmplY3RfaW50ZXJzZWN0aW9uX18pO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuLyogaGFybW9ueSBpbXBvcnQgKi8gdmFyIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfNF9ib3VuZGxlc3NfdXRpbHNfb21pdF9rZXlzX19fZGVmYXVsdCA9IF9fd2VicGFja19yZXF1aXJlX18ubihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzRfYm91bmRsZXNzX3V0aWxzX29taXRfa2V5c19fKTtcbnZhciBfZXh0ZW5kcz1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0YXJnZXQpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBzb3VyY2U9YXJndW1lbnRzW2ldO2Zvcih2YXIga2V5IGluIHNvdXJjZSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSxrZXkpKXt0YXJnZXRba2V5XT1zb3VyY2Vba2V5XTt9fX1yZXR1cm4gdGFyZ2V0O307dmFyIF9jcmVhdGVDbGFzcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LHByb3BzKXtmb3IodmFyIGk9MDtpPHByb3BzLmxlbmd0aDtpKyspe3ZhciBkZXNjcmlwdG9yPXByb3BzW2ldO2Rlc2NyaXB0b3IuZW51bWVyYWJsZT1kZXNjcmlwdG9yLmVudW1lcmFibGV8fGZhbHNlO2Rlc2NyaXB0b3IuY29uZmlndXJhYmxlPXRydWU7aWYoXCJ2YWx1ZVwiaW4gZGVzY3JpcHRvcilkZXNjcmlwdG9yLndyaXRhYmxlPXRydWU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxkZXNjcmlwdG9yLmtleSxkZXNjcmlwdG9yKTt9fXJldHVybiBmdW5jdGlvbihDb25zdHJ1Y3Rvcixwcm90b1Byb3BzLHN0YXRpY1Byb3BzKXtpZihwcm90b1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLHByb3RvUHJvcHMpO2lmKHN0YXRpY1Byb3BzKWRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3Isc3RhdGljUHJvcHMpO3JldHVybiBDb25zdHJ1Y3Rvcjt9O30oKTtmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsQ29uc3RydWN0b3Ipe2lmKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3Rvcikpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7fX1mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLGNhbGwpe2lmKCFzZWxmKXt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7fXJldHVybiBjYWxsJiYodHlwZW9mIGNhbGw9PT1cIm9iamVjdFwifHx0eXBlb2YgY2FsbD09PVwiZnVuY3Rpb25cIik/Y2FsbDpzZWxmO31mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3Msc3VwZXJDbGFzcyl7aWYodHlwZW9mIHN1cGVyQ2xhc3MhPT1cImZ1bmN0aW9uXCImJnN1cGVyQ2xhc3MhPT1udWxsKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIit0eXBlb2Ygc3VwZXJDbGFzcyk7fXN1YkNsYXNzLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MmJnN1cGVyQ2xhc3MucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6c3ViQ2xhc3MsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfX0pO2lmKHN1cGVyQ2xhc3MpT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcyxzdXBlckNsYXNzKTpzdWJDbGFzcy5fX3Byb3RvX189c3VwZXJDbGFzczt9dmFyIGZpcnN0PWZ1bmN0aW9uIGZpcnN0KGFycmF5KXtyZXR1cm4gYXJyYXlbMF07fTt2YXIgbGFzdD1mdW5jdGlvbiBsYXN0KGFycmF5KXtyZXR1cm4gYXJyYXlbYXJyYXkubGVuZ3RoLTFdO307dmFyIGlzRnVuY3Rpb249ZnVuY3Rpb24gaXNGdW5jdGlvbih4KXtyZXR1cm4gdHlwZW9mIHg9PT0nZnVuY3Rpb24nO307dmFyIFRva2VuaXplZElucHV0PWZ1bmN0aW9uKF9SZWFjdCRQdXJlQ29tcG9uZW50KXtfaW5oZXJpdHMoVG9rZW5pemVkSW5wdXQsX1JlYWN0JFB1cmVDb21wb25lbnQpO2Z1bmN0aW9uIFRva2VuaXplZElucHV0KCl7dmFyIF9yZWY7dmFyIF90ZW1wLF90aGlzLF9yZXQ7X2NsYXNzQ2FsbENoZWNrKHRoaXMsVG9rZW5pemVkSW5wdXQpO2Zvcih2YXIgX2xlbj1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkoX2xlbiksX2tleT0wO19rZXk8X2xlbjtfa2V5Kyspe2FyZ3NbX2tleV09YXJndW1lbnRzW19rZXldO31yZXR1cm4gX3JldD0oX3RlbXA9KF90aGlzPV9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsKF9yZWY9VG9rZW5pemVkSW5wdXQuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoVG9rZW5pemVkSW5wdXQpKS5jYWxsLmFwcGx5KF9yZWYsW3RoaXNdLmNvbmNhdChhcmdzKSkpLF90aGlzKSxfdGhpcy5mb2N1cz1mdW5jdGlvbigpe3JldHVybiBfdGhpcy5yZWZzLnR5cGVhaGVhZC5mb2N1cygpO30sX3RoaXMuZ2V0SW5wdXROb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIF90aGlzLnJlZnMudHlwZWFoZWFkLmdldElucHV0Tm9kZSgpO30sX3RoaXMuZ2V0U2VsZWN0ZWRFbnRpdHlUZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIF90aGlzLnJlZnMudHlwZWFoZWFkLmdldFNlbGVjdGVkRW50aXR5VGV4dCgpO30sX3RoaXMuZ2V0VmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gX3RoaXMucmVmcy50eXBlYWhlYWQuZ2V0VmFsdWUoKTt9LF90aGlzLnNlbGVjdD1mdW5jdGlvbigpe3JldHVybiBfdGhpcy5yZWZzLnR5cGVhaGVhZC5zZWxlY3QoKTt9LF90aGlzLnNldFZhbHVlPWZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gX3RoaXMucmVmcy50eXBlYWhlYWQuc2V0VmFsdWUodmFsdWUpO30sX3RoaXMuYWRkPWZ1bmN0aW9uKGluZGV4KXtpZihfdGhpcy5wcm9wcy50b2tlbnMuaW5kZXhPZihpbmRleCk9PT0tMSl7X3RoaXMucHJvcHMuaGFuZGxlQWRkVG9rZW4oaW5kZXgpO319LF90aGlzLmhhbmRsZUlucHV0Q2xpY2s9ZnVuY3Rpb24oZXZlbnQpe190aGlzLmNsZWFyU2VsZWN0aW9uKCk7aWYoaXNGdW5jdGlvbihfdGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uQ2xpY2spKXtfdGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uQ2xpY2soZXZlbnQpO319LF90aGlzLmhhbmRsZUlucHV0Rm9jdXM9ZnVuY3Rpb24oZXZlbnQpe190aGlzLmNsZWFyU2VsZWN0aW9uKCk7aWYoaXNGdW5jdGlvbihfdGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uRm9jdXMpKXtfdGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uRm9jdXMoZXZlbnQpO319LF90aGlzLmhhbmRsZUtleURvd249ZnVuY3Rpb24oZXZlbnQpe3N3aXRjaChldmVudC53aGljaCl7Y2FzZSAzNzpfdGhpcy5zZWxlY3RQcmV2aW91c1Rva2VuKGV2ZW50LnNoaWZ0S2V5KTticmVhaztjYXNlIDM5Ol90aGlzLnNlbGVjdE5leHRUb2tlbihldmVudC5zaGlmdEtleSk7YnJlYWs7Y2FzZSA4OmlmKF90aGlzLnByb3BzLnRva2Vuc1NlbGVjdGVkLmxlbmd0aCl7X3RoaXMucmVtb3ZlKF90aGlzLnByb3BzLnRva2Vuc1NlbGVjdGVkKTtfdGhpcy5mb2N1cygpO31icmVhaztjYXNlIDY1OmlmKGV2ZW50Lm1ldGFLZXkpe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7X3RoaXMuZm9jdXMoKTtfdGhpcy5zZWxlY3QoKTtfdGhpcy5fc3VwcHJlc3NOZXh0VG9rZW5TZWxlY3Rpb249dHJ1ZTtfdGhpcy5wcm9wcy5oYW5kbGVOZXdTZWxlY3Rpb24oX3RoaXMucHJvcHMudG9rZW5zKTt9fWlmKGlzRnVuY3Rpb24oX3RoaXMucHJvcHMub25LZXlEb3duKSl7X3RoaXMucHJvcHMub25LZXlEb3duKGV2ZW50KTt9fSxfdGVtcCksX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsX3JldCk7fV9jcmVhdGVDbGFzcyhUb2tlbml6ZWRJbnB1dCxbe2tleTonY29tcG9uZW50RGlkVXBkYXRlJyx2YWx1ZTpmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKXt2YXIgcHJldmlvdXNTZWxlY3RlZEluZGV4ZXM9cHJldlByb3BzLnRva2Vuc1NlbGVjdGVkO3ZhciBjdXJyZW50U2VsZWN0ZWRJbmRleGVzPXRoaXMucHJvcHMudG9rZW5zU2VsZWN0ZWQ7aWYodGhpcy5wcm9wcy50b2tlbnMubGVuZ3RoPnByZXZQcm9wcy50b2tlbnMubGVuZ3RoKXt0aGlzLnNldFZhbHVlKCcnKTt9aWYodGhpcy5fc3VwcHJlc3NOZXh0VG9rZW5TZWxlY3Rpb24pe3RoaXMuX3N1cHByZXNzTmV4dFRva2VuU2VsZWN0aW9uPWZhbHNlO3JldHVybjt9aWYocHJldmlvdXNTZWxlY3RlZEluZGV4ZXMhPT1jdXJyZW50U2VsZWN0ZWRJbmRleGVzJiZjdXJyZW50U2VsZWN0ZWRJbmRleGVzLmxlbmd0aCE9PTApe2lmKGN1cnJlbnRTZWxlY3RlZEluZGV4ZXMubGVuZ3RoPT09MXx8Y3VycmVudFNlbGVjdGVkSW5kZXhlc1swXSE9PXByZXZpb3VzU2VsZWN0ZWRJbmRleGVzWzBdKXtyZXR1cm4gdGhpcy5yZWZzWyd0b2tlbl8nK2N1cnJlbnRTZWxlY3RlZEluZGV4ZXNbMF1dLmZvY3VzKCk7fWVsc2UgaWYobGFzdChjdXJyZW50U2VsZWN0ZWRJbmRleGVzKSE9PWxhc3QocHJldmlvdXNTZWxlY3RlZEluZGV4ZXMpKXtyZXR1cm4gdGhpcy5yZWZzWyd0b2tlbl8nK2xhc3QoY3VycmVudFNlbGVjdGVkSW5kZXhlcyldLmZvY3VzKCk7fXRoaXMucmVmc1sndG9rZW5fJytjdXJyZW50U2VsZWN0ZWRJbmRleGVzWzBdXS5mb2N1cygpO319fSx7a2V5OidyZW1vdmUnLHZhbHVlOmZ1bmN0aW9uIHJlbW92ZShpbmRleCl7dmFyIF90aGlzMj10aGlzO3ZhciBpbmRleGVzPShBcnJheS5pc0FycmF5KGluZGV4KT9pbmRleDpbaW5kZXhdKS5maWx0ZXIoZnVuY3Rpb24oaWR4KXtyZXR1cm4gX3RoaXMyLnByb3BzLnRva2Vucy5pbmRleE9mKGlkeCkhPT0tMTt9KTtpZihpbmRleGVzLmxlbmd0aCl7dGhpcy5wcm9wcy5oYW5kbGVSZW1vdmVUb2tlbnMoaW5kZXhlcyk7fX19LHtrZXk6J3NlbGVjdFRva2VuJyx2YWx1ZTpmdW5jdGlvbiBzZWxlY3RUb2tlbihpbmRleCl7dGhpcy5wcm9wcy5oYW5kbGVOZXdTZWxlY3Rpb24oW2luZGV4XSk7fX0se2tleTonc2VsZWN0VG9rZW5zJyx2YWx1ZTpmdW5jdGlvbiBzZWxlY3RUb2tlbnMoaW5kZXhlcyl7dGhpcy5wcm9wcy5oYW5kbGVOZXdTZWxlY3Rpb24oaW5kZXhlcyk7fX0se2tleTonc2VsZWN0UHJldmlvdXNUb2tlbicsdmFsdWU6ZnVuY3Rpb24gc2VsZWN0UHJldmlvdXNUb2tlbihhcHBlbmQpe3ZhciBzZWxlY3RlZD10aGlzLnByb3BzLnRva2Vuc1NlbGVjdGVkO3ZhciBpbmRleGVzPXRoaXMucHJvcHMudG9rZW5zO2lmKHNlbGVjdGVkLmxlbmd0aD09PTEmJmZpcnN0KHNlbGVjdGVkKT09PWZpcnN0KGluZGV4ZXMpKXtyZXR1cm47fWlmKHNlbGVjdGVkLmxlbmd0aD09PTApe3RoaXMuc2VsZWN0VG9rZW4obGFzdChpbmRleGVzKSk7fWVsc2V7dmFyIHByZXZpb3VzVG9rZW49aW5kZXhlc1tpbmRleGVzLmluZGV4T2YoZmlyc3Qoc2VsZWN0ZWQpKS0xXTt0aGlzLnNlbGVjdFRva2VucyhhcHBlbmQ/W3ByZXZpb3VzVG9rZW5dLmNvbmNhdChzZWxlY3RlZCk6W3ByZXZpb3VzVG9rZW5dKTt9fX0se2tleTonc2VsZWN0TmV4dFRva2VuJyx2YWx1ZTpmdW5jdGlvbiBzZWxlY3ROZXh0VG9rZW4oYXBwZW5kKXt2YXIgc2VsZWN0ZWQ9dGhpcy5wcm9wcy50b2tlbnNTZWxlY3RlZDt2YXIgaW5kZXhlcz10aGlzLnByb3BzLnRva2VucztpZihzZWxlY3RlZC5sZW5ndGg9PT0wKXtyZXR1cm47fWlmKGxhc3Qoc2VsZWN0ZWQpPT09bGFzdChpbmRleGVzKSl7dGhpcy5jbGVhclNlbGVjdGlvbigpO3RoaXMuZm9jdXMoKTt9ZWxzZXt2YXIgbmV4dFRva2VuPWluZGV4ZXNbaW5kZXhlcy5pbmRleE9mKGxhc3Qoc2VsZWN0ZWQpKSsxXTt0aGlzLnNlbGVjdFRva2VucyhhcHBlbmQ/c2VsZWN0ZWQuY29uY2F0KG5leHRUb2tlbik6W25leHRUb2tlbl0pO319fSx7a2V5OidjbGVhclNlbGVjdGlvbicsdmFsdWU6ZnVuY3Rpb24gY2xlYXJTZWxlY3Rpb24oKXt0aGlzLnByb3BzLmhhbmRsZU5ld1NlbGVjdGlvbihbXSk7fX0se2tleTonaGFuZGxlVG9rZW5DbG9zZUNsaWNrJyx2YWx1ZTpmdW5jdGlvbiBoYW5kbGVUb2tlbkNsb3NlQ2xpY2soaW5kZXgsZXZlbnQpe2V2ZW50LnN0b3BQcm9wYWdhdGlvbigpO3RoaXMucmVtb3ZlKGluZGV4KTt0aGlzLmZvY3VzKCk7aWYodGhpcy5wcm9wcy50b2tlbkNsb3NlQ29tcG9uZW50LnByb3BzLm9uQ2xpY2spe3RoaXMucHJvcHMudG9rZW5DbG9zZUNvbXBvbmVudC5wcm9wcy5vbkNsaWNrKGV2ZW50KTt9fX0se2tleToncmVuZGVyVG9rZW5DbG9zZScsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyVG9rZW5DbG9zZShpbmRleCl7aWYodGhpcy5wcm9wcy50b2tlbkNsb3NlVmlzaWJsZSl7cmV0dXJuIF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5jbG9uZUVsZW1lbnQodGhpcy5wcm9wcy50b2tlbkNsb3NlQ29tcG9uZW50LHtjbGFzc05hbWU6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8xX2NsYXNzbmFtZXNfX19kZWZhdWx0KCkoJ2ItdG9rZW5maWVsZC10b2tlbi1jbG9zZScsdGhpcy5wcm9wcy50b2tlbkNsb3NlQ29tcG9uZW50LnByb3BzLmNsYXNzTmFtZSksb25DbGljazp0aGlzLmhhbmRsZVRva2VuQ2xvc2VDbGljay5iaW5kKHRoaXMsaW5kZXgpfSk7fX19LHtrZXk6J2hhbmRsZVRva2VuS2V5RG93bicsdmFsdWU6ZnVuY3Rpb24gaGFuZGxlVG9rZW5LZXlEb3duKGluZGV4LGV2ZW50KXtzd2l0Y2goZXZlbnQud2hpY2gpe2Nhc2UgMTM6Y2FzZSAzMjp0aGlzLnNlbGVjdFRva2VuKGluZGV4KTtldmVudC5wcmV2ZW50RGVmYXVsdCgpO2JyZWFrO2Nhc2UgODp0aGlzLnJlbW92ZShpbmRleCk7dGhpcy5mb2N1cygpO2V2ZW50LnByZXZlbnREZWZhdWx0KCk7YnJlYWs7fX19LHtrZXk6J3JlbmRlclRva2VucycsdmFsdWU6ZnVuY3Rpb24gcmVuZGVyVG9rZW5zKCl7dmFyIF90aGlzMz10aGlzO3JldHVybiBfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudCgnZGl2Jyx7Y2xhc3NOYW1lOidiLXRva2VuZmllbGQtdG9rZW5zJ30sdGhpcy5wcm9wcy50b2tlbnMubWFwKGZ1bmN0aW9uKGluZGV4KXtyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoJ2Rpdicse3JlZjondG9rZW5fJytpbmRleCxrZXk6aW5kZXgsY2xhc3NOYW1lOl9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMV9jbGFzc25hbWVzX19fZGVmYXVsdCgpKCdiLXRva2VuZmllbGQtdG9rZW4nLHsnYi10b2tlbmZpZWxkLXRva2VuLXNlbGVjdGVkJzpfdGhpczMucHJvcHMudG9rZW5zU2VsZWN0ZWQuaW5kZXhPZihpbmRleCkhPT0tMX0pLG9uQ2xpY2s6X3RoaXMzLnNlbGVjdFRva2VuLmJpbmQoX3RoaXMzLGluZGV4KSxvbktleURvd246X3RoaXMzLmhhbmRsZVRva2VuS2V5RG93bi5iaW5kKF90aGlzMyxpbmRleCksdGFiSW5kZXg6JzAnfSxfdGhpczMucHJvcHMuZW50aXRpZXNbaW5kZXhdLnRleHQsX3RoaXMzLnJlbmRlclRva2VuQ2xvc2UoaW5kZXgpKTt9KSk7fX0se2tleToncmVuZGVyJyx2YWx1ZTpmdW5jdGlvbiByZW5kZXIoKXtyZXR1cm4gX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoJ2RpdicsX2V4dGVuZHMoe30sX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV80X2JvdW5kbGVzc191dGlsc19vbWl0X2tleXNfX19kZWZhdWx0KCkodGhpcy5wcm9wcyxUb2tlbml6ZWRJbnB1dC5pbnRlcm5hbEtleXMpLHtyZWY6J3dyYXBwZXInLGNsYXNzTmFtZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzFfY2xhc3NuYW1lc19fX2RlZmF1bHQoKSgnYi10b2tlbmZpZWxkLXdyYXBwZXInLHRoaXMucHJvcHMuY2xhc3NOYW1lKSxvbktleURvd246dGhpcy5oYW5kbGVLZXlEb3dufSksdGhpcy5yZW5kZXJUb2tlbnMoKSxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX19kZWZhdWx0LmEuY3JlYXRlRWxlbWVudChfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3R5cGVhaGVhZF9fX2RlZmF1bHQuYSxfZXh0ZW5kcyh7fSxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzNfYm91bmRsZXNzX3V0aWxzX29iamVjdF9pbnRlcnNlY3Rpb25fX19kZWZhdWx0KCkodGhpcy5wcm9wcyxfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzJfYm91bmRsZXNzX3R5cGVhaGVhZF9fX2RlZmF1bHQuYS5kZWZhdWx0UHJvcHMpLHtyZWY6J3R5cGVhaGVhZCcsY2xhc3NOYW1lOidiLXRva2VuZmllbGQnLGNsZWFyT25TZWxlY3Rpb246dHJ1ZSxpbnB1dFByb3BzOl9leHRlbmRzKHt9LHRoaXMucHJvcHMuaW5wdXRQcm9wcyx7b25DbGljazp0aGlzLmhhbmRsZUlucHV0Q2xpY2ssb25Gb2N1czp0aGlzLmhhbmRsZUlucHV0Rm9jdXN9KSxvbkVudGl0eVNlbGVjdGVkOnRoaXMuYWRkfSkpKTt9fV0pO3JldHVybiBUb2tlbml6ZWRJbnB1dDt9KF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fX2RlZmF1bHQuYS5QdXJlQ29tcG9uZW50KTtUb2tlbml6ZWRJbnB1dC5wcm9wVHlwZXM9X2V4dGVuZHMoe30sX19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8yX2JvdW5kbGVzc190eXBlYWhlYWRfX19kZWZhdWx0LmEucHJvcFR5cGVzLHtoYW5kbGVBZGRUb2tlbjpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jLGhhbmRsZVJlbW92ZVRva2VuczpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jLGhhbmRsZU5ld1NlbGVjdGlvbjpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5mdW5jLHRva2VuQ2xvc2VDb21wb25lbnQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uZWxlbWVudCx0b2tlbkNsb3NlVmlzaWJsZTpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5ib29sLHRva2VuczpfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5hcnJheU9mKF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMF9yZWFjdF9fW1wiUHJvcFR5cGVzXCJdLm51bWJlciksdG9rZW5zU2VsZWN0ZWQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19bXCJQcm9wVHlwZXNcIl0uYXJyYXlPZihfX1dFQlBBQ0tfSU1QT1JURURfTU9EVUxFXzBfcmVhY3RfX1tcIlByb3BUeXBlc1wiXS5udW1iZXIpfSk7VG9rZW5pemVkSW5wdXQuZGVmYXVsdFByb3BzPV9leHRlbmRzKHt9LF9fV0VCUEFDS19JTVBPUlRFRF9NT0RVTEVfMl9ib3VuZGxlc3NfdHlwZWFoZWFkX19fZGVmYXVsdC5hLmRlZmF1bHRQcm9wcyx7aGFuZGxlQWRkVG9rZW46ZnVuY3Rpb24gaGFuZGxlQWRkVG9rZW4oKXt9LGhhbmRsZVJlbW92ZVRva2VuczpmdW5jdGlvbiBoYW5kbGVSZW1vdmVUb2tlbnMoKXt9LGhhbmRsZU5ld1NlbGVjdGlvbjpmdW5jdGlvbiBoYW5kbGVOZXdTZWxlY3Rpb24oKXt9LHRva2VuQ2xvc2VDb21wb25lbnQ6X19XRUJQQUNLX0lNUE9SVEVEX01PRFVMRV8wX3JlYWN0X19fZGVmYXVsdC5hLmNyZWF0ZUVsZW1lbnQoJ2RpdicsbnVsbCwnWCcpLHRva2VuQ2xvc2VWaXNpYmxlOnRydWUsdG9rZW5zOltdLHRva2Vuc1NlbGVjdGVkOltdfSk7VG9rZW5pemVkSW5wdXQuaW50ZXJuYWxLZXlzPU9iamVjdC5rZXlzKFRva2VuaXplZElucHV0LmRlZmF1bHRQcm9wcyk7LyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IFRva2VuaXplZElucHV0O1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGluZGV4LmpzIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbiBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gNSk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgYTkxYzEzMTNjMmNiN2I0ZWM5ZDEiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtdHlwZWFoZWFkXCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwiYm91bmRsZXNzLXR5cGVhaGVhZFwifVxuLy8gbW9kdWxlIGlkID0gMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJib3VuZGxlc3MtdXRpbHMtb2JqZWN0LWludGVyc2VjdGlvblwiKTtcblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyBleHRlcm5hbCB7XCJjb21tb25qczJcIjpcImJvdW5kbGVzcy11dGlscy1vYmplY3QtaW50ZXJzZWN0aW9uXCJ9XG4vLyBtb2R1bGUgaWQgPSAxXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJvdW5kbGVzcy11dGlscy1vbWl0LWtleXNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzXCJ9XG4vLyBtb2R1bGUgaWQgPSAyXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNsYXNzbmFtZXNcIik7XG5cblxuLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBXRUJQQUNLIEZPT1RFUlxuLy8gZXh0ZXJuYWwge1wiY29tbW9uanMyXCI6XCJjbGFzc25hbWVzXCJ9XG4vLyBtb2R1bGUgaWQgPSAzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpO1xuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIGV4dGVybmFsIHtcImNvbW1vbmpzMlwiOlwicmVhY3RcIn1cbi8vIG1vZHVsZSBpZCA9IDRcbi8vIG1vZHVsZSBjaHVua3MgPSAwIiwiaW1wb3J0IFJlYWN0LCB7UHJvcFR5cGVzfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY3ggZnJvbSAnY2xhc3NuYW1lcyc7XG5cbmltcG9ydCBUeXBlYWhlYWQgZnJvbSAnYm91bmRsZXNzLXR5cGVhaGVhZCc7XG5pbXBvcnQgZXh0cmFjdENoaWxkUHJvcHMgZnJvbSAnYm91bmRsZXNzLXV0aWxzLW9iamVjdC1pbnRlcnNlY3Rpb24nO1xuaW1wb3J0IG9taXQgZnJvbSAnYm91bmRsZXNzLXV0aWxzLW9taXQta2V5cyc7XG5cbmNvbnN0IGZpcnN0ID0gKGFycmF5KSA9PiBhcnJheVswXTtcbmNvbnN0IGxhc3QgPSAoYXJyYXkpID0+IGFycmF5W2FycmF5Lmxlbmd0aCAtIDFdO1xuY29uc3QgaXNGdW5jdGlvbiA9ICh4KSA9PiB0eXBlb2YgeCA9PT0gJ2Z1bmN0aW9uJztcblxuLyoqXG5fX0Rpc3RpbGwgcmljaCBlbnRpdHkgZGF0YSBtYXRjaGVkIHZpYSB0eXBlYWhlYWQgaW5wdXQgaW50byBzaW1wbGUgdmlzdWFsIGFic3RyYWN0aW9ucy5fX1xuXG5CYXNpYyB1c2FnZSBvZiB0aGlzIGNvbXBvbmVudCBpcyBpZGVudGljYWwgdG8gdGhhdCBvZiBbVHlwZWFoZWFkXShodHRwczovL2dpdGh1Yi5jb20vZW5pZ21hLWlvL2JvdW5kbGVzcy9tYXN0ZXIvcGFja2FnZXMvYm91bmRsZXNzLXR5cGVhaGVhZCkuIEFkZGl0aW9uYWwgcHJvcHMgYXJlIGF2YWlsYWJsZSB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgdG9rZW5pemF0aW9uIGZ1bmN0aW9uYWxpdHkuXG5cbiMjIENvbXBvbmVudCBJbnN0YW5jZSBNZXRob2RzXG5cbldoZW4gdXNpbmcgYFRva2VuaXplZElucHV0YCBpbiB5b3VyIHByb2plY3QsIHlvdSBtYXkgY2FsbCB0aGUgZm9sbG93aW5nIG1ldGhvZHMgb24gYSByZW5kZXJlZCBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50LiBVc2UgW2ByZWZzYF0oaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy9yZWZzLWFuZC10aGUtZG9tLmh0bWwpIHRvIGdldCB0aGUgaW5zdGFuY2UuXG5cbi0gX19gYWRkKGluZGV4OiBudW1iZXIpYF9fXG4gIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlcyBhIHRva2VuIGZvciBgcHJvcHMuZW50aXRpZXNbaW5kZXhdYDsgYHByb3BzLmhhbmRsZUFkZFRva2VuYCB3aWxsIGJlIGNhbGxlZCBhcyBhIGhpbnQgdG8gcGVyc2lzdCB0aGUgY2hhbmdlIGluIHlvdXIgY29udHJvbGxlciB2aWV3IG9yIG90aGVyIGFwcGxpY2F0aW9uIHN0YXRlXG5cbi0gX19gZm9jdXMoKWBfX1xuICBmb2N1c2VzIHRoZSBicm93c2VyIG9vbiB0aGUgdW5kZXJseWluZyB0ZXh0dWFsIGlucHV0IGZvciBpbW1lZGlhdGUgdGV4dCBlbnRyeVxuXG4tIF9fYGdldElucHV0Tm9kZSgpYF9fXG4gIHJldHVybnMgdGhlIHJhdyB1bmRlcmx5aW5nIHRleHR1YWwgaW5wdXQgRE9NIG5vZGVcblxuLSBfX2BnZXRTZWxlY3RlZEVudGl0eVRleHQoKWBfX1xuICByZXR1cm5zIHRoZSBgdGV4dGAgcHJvcGVydHkgb2YgdGhlIGN1cnJlbnRseSBoaWdobGlnaHRlZCBlbnRpdHkgKGZyb20gYHByb3BzLmVudGl0aWVzYCksIG9yIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nXG5cbi0gX19gZ2V0VmFsdWUoKWBfX1xuICByZXRyaWV2ZXMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHVuZGVybHlpbmcgdGV4dHVhbCBpbnB1dFxuXG4tIF9fYHJlbW92ZShpbmRleDogbnVtYmVyKWBfX1xuICBwcm9ncmFtbWF0aWNhbGx5IHJlbW92ZXMgdGhlIHRva2VuIGZvciBgcHJvcHMuZW50aXRpZXNbaW5kZXhdYDsgYHByb3BzLmhhbmRsZVJlbW92ZVRva2Vuc2Agd2lsbCBiZSBjYWxsZWQgYXMgYSBoaW50IHRvIHBlcnNpc3QgdGhlIGNoYW5nZSBpbiB5b3VyIGNvbnRyb2xsZXIgdmlldyBvciBvdGhlciBhcHBsaWNhdGlvbiBzdGF0ZVxuXG4tIF9fYHNlbGVjdCgpYF9fXG4gIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlcyBhIGZ1bGwgc2VsZWN0aW9uIG9uIHRoZSB1bmRlcmx5aW5nIHRleHR1YWwgaW5wdXQgc3VjaCB0aGF0IGEgcHJlc3Mgb2YgdGhlIEJhY2tzcGFjZSBrZXkgd291bGQgZnVsbHkgY2xlYXIgdGhlIGlucHV0XG5cbi0gX19gc2V0VmFsdWUodmFsdWU6IHN0cmluZylgX19cbiAgc2V0cyB0aGUgdW5kZXJseWluZyB0ZXh0dWFsIGlucHV0IHRvIHRoZSBzcGVjaWZpZWQgdGV4dCBhbmQgdXBkYXRlcyBpbnRlcm5hbCBzdGF0ZTsgZG8gbm90IHVzZSB0aGlzIG1ldGhvZCB3aGVuIHVzaW5nIGBUeXBlYWhlYWRgIGFzIGEgXCJjb250cm9sbGVkIGlucHV0XCJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVG9rZW5pemVkSW5wdXQgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcbiAgICBzdGF0aWMgcHJvcFR5cGVzID0ge1xuICAgICAgICAuLi5UeXBlYWhlYWQucHJvcFR5cGVzLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBmdW5jdGlvbiBoYW5kbGVyIHRoYXQgaXMgY2FsbGVkIHdoZW4gYW4gZW50aXR5IGlzIHNlbGVjdGVkIGJ5IHRoZSB1c2VyIGFuZCBhIHRva2VuIHNob3VsZCBiZSBjcmVhdGVkXG4gICAgICAgICAqL1xuICAgICAgICBoYW5kbGVBZGRUb2tlbjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGZ1bmN0aW9uIGhhbmRsZXIgdGhhdCBpcyBjYWxsZWQgd2hlbiBvbmUgb3IgbW9yZSB0b2tlbnMgYXJlIHJlbW92ZWQgYnkgdGhlIHVzZXIgdmlhIGNsaWNraW5nIHRoZSBcImNsb3NlXCIgYnV0dG9uIG9yIHByZXNzaW5nIHRoZSBgQmFja3NwYWNlYCBrZXkgd2hpbGUgdG9rZW5zIGFyZSBzZWxlY3RlZFxuICAgICAgICAgKi9cbiAgICAgICAgaGFuZGxlUmVtb3ZlVG9rZW5zOiBQcm9wVHlwZXMuZnVuYyxcblxuICAgICAgICAvKipcbiAgICAgICAgICogZnVuY3Rpb24gaGFuZGxlciB0aGF0IGlzIGNhbGxlZCB3aGVuIG9uZSBvciBtb3JlIHRva2VucyBhcmUgc2VsZWN0ZWQgYnkgdGhlIHVzZXIgdmlhIGNsaWNrIG9yIGtleWJvYXJkIGFjdGlvbnM7IGNhbGxlZCB3aXRoIHdoYXQgdGhlIG5ldyBzZWxlY3Rpb24gc2hvdWxkIGJlXG4gICAgICAgICAqL1xuICAgICAgICBoYW5kbGVOZXdTZWxlY3Rpb246IFByb3BUeXBlcy5mdW5jLFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0aGUgSlNYIHVzZWQgZm9yIHRoZSBjbG9zZSBidXR0b24gaXRzZWxmXG4gICAgICAgICAqL1xuICAgICAgICB0b2tlbkNsb3NlQ29tcG9uZW50OiBQcm9wVHlwZXMuZWxlbWVudCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogZGV0ZXJtaW5lcyBpZiB0aGUgYC5iLXRva2VuZmllbGQtdG9rZW4tY2xvc2VgIGVsZW1lbnQgc2hvdWxkIGJlIHJlbmRlcmVkIGZvciBlYWNoIHRva2VuXG4gICAgICAgICAqL1xuICAgICAgICB0b2tlbkNsb3NlVmlzaWJsZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRoZSBpbmRleGVzIG9mIGVudGl0aWVzIHRoYXQgc2hvdWxkIGJlIHJlbmRlcmVkIGFzIFwidG9rZW5zXCIgaW4gdGhlIGNvbXBvbmVudCBVSVxuICAgICAgICAgKi9cbiAgICAgICAgdG9rZW5zOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMubnVtYmVyKSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogdGhlIGluZGV4ZXMgb2YgdG9rZW5pemVkIGVudGl0aWVzIHRoYXQgYXJlIHBhcnQgb2YgYW4gYWN0aXZlIHNlbGVjdGlvbjsgdGhlIHVzZXIgY2FuIHByZXNzIGBCYWNrc3BhY2VgIHRvIHRyaWdnZXIgYGhhbmRsZVJlbW92ZVRva2Vuc2BcbiAgICAgICAgICovXG4gICAgICAgIHRva2Vuc1NlbGVjdGVkOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMubnVtYmVyKSxcbiAgICB9XG5cbiAgICBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgICAuLi5UeXBlYWhlYWQuZGVmYXVsdFByb3BzLFxuICAgICAgICBoYW5kbGVBZGRUb2tlbjogKCkgPT4ge30sXG4gICAgICAgIGhhbmRsZVJlbW92ZVRva2VuczogKCkgPT4ge30sXG4gICAgICAgIGhhbmRsZU5ld1NlbGVjdGlvbjogKCkgPT4ge30sXG4gICAgICAgIHRva2VuQ2xvc2VDb21wb25lbnQ6ICg8ZGl2Plg8L2Rpdj4pLFxuICAgICAgICB0b2tlbkNsb3NlVmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgdG9rZW5zOiBbXSxcbiAgICAgICAgdG9rZW5zU2VsZWN0ZWQ6IFtdLFxuICAgIH1cblxuICAgIHN0YXRpYyBpbnRlcm5hbEtleXMgPSBPYmplY3Qua2V5cyhUb2tlbml6ZWRJbnB1dC5kZWZhdWx0UHJvcHMpXG5cbiAgICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzU2VsZWN0ZWRJbmRleGVzID0gcHJldlByb3BzLnRva2Vuc1NlbGVjdGVkO1xuICAgICAgICBjb25zdCBjdXJyZW50U2VsZWN0ZWRJbmRleGVzID0gdGhpcy5wcm9wcy50b2tlbnNTZWxlY3RlZDtcblxuICAgICAgICBpZiAodGhpcy5wcm9wcy50b2tlbnMubGVuZ3RoID4gcHJldlByb3BzLnRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUoJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3N1cHByZXNzTmV4dFRva2VuU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9zdXBwcmVzc05leHRUb2tlblNlbGVjdGlvbiA9IGZhbHNlO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoICAgcHJldmlvdXNTZWxlY3RlZEluZGV4ZXMgIT09IGN1cnJlbnRTZWxlY3RlZEluZGV4ZXNcbiAgICAgICAgICAgICYmIGN1cnJlbnRTZWxlY3RlZEluZGV4ZXMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBpZiAoICAgY3VycmVudFNlbGVjdGVkSW5kZXhlcy5sZW5ndGggPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgfHwgY3VycmVudFNlbGVjdGVkSW5kZXhlc1swXSAhPT0gcHJldmlvdXNTZWxlY3RlZEluZGV4ZXNbMF0gLyogbXVsdGkgc2VsZWN0aW9uLCBsZWZ0d2FyZCAqLykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlZnNbYHRva2VuXyR7Y3VycmVudFNlbGVjdGVkSW5kZXhlc1swXX1gXS5mb2N1cygpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0KGN1cnJlbnRTZWxlY3RlZEluZGV4ZXMpICE9PSBsYXN0KHByZXZpb3VzU2VsZWN0ZWRJbmRleGVzKSAvKiBtdWx0aSBzZWxlY3Rpb24sIHJpZ2h0d2FyZCAqLykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlZnNbYHRva2VuXyR7bGFzdChjdXJyZW50U2VsZWN0ZWRJbmRleGVzKX1gXS5mb2N1cygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJlZnNbYHRva2VuXyR7Y3VycmVudFNlbGVjdGVkSW5kZXhlc1swXX1gXS5mb2N1cygpO1xuICAgICAgICB9IC8vIG1vdmUgZm9jdXNcbiAgICB9XG5cbiAgICAvLyBwYXNzdGhyb3VnaHMgdG8gVHlwZWFoZWFkIGluc3RhbmNlIG1ldGhvZHNcbiAgICBmb2N1cyA9ICgpID0+IHRoaXMucmVmcy50eXBlYWhlYWQuZm9jdXMoKVxuICAgIGdldElucHV0Tm9kZSA9ICgpID0+IHRoaXMucmVmcy50eXBlYWhlYWQuZ2V0SW5wdXROb2RlKClcbiAgICBnZXRTZWxlY3RlZEVudGl0eVRleHQgPSAoKSA9PiB0aGlzLnJlZnMudHlwZWFoZWFkLmdldFNlbGVjdGVkRW50aXR5VGV4dCgpXG4gICAgZ2V0VmFsdWUgPSAoKSA9PiB0aGlzLnJlZnMudHlwZWFoZWFkLmdldFZhbHVlKClcbiAgICBzZWxlY3QgPSAoKSA9PiB0aGlzLnJlZnMudHlwZWFoZWFkLnNlbGVjdCgpXG4gICAgc2V0VmFsdWUgPSAodmFsdWUpID0+IHRoaXMucmVmcy50eXBlYWhlYWQuc2V0VmFsdWUodmFsdWUpXG5cbiAgICBhZGQgPSAoaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMudG9rZW5zLmluZGV4T2YoaW5kZXgpID09PSAtMSkgeyB0aGlzLnByb3BzLmhhbmRsZUFkZFRva2VuKGluZGV4KTsgfVxuICAgIH1cblxuICAgIHJlbW92ZShpbmRleCkge1xuICAgICAgICBjb25zdCBpbmRleGVzID0gKEFycmF5LmlzQXJyYXkoaW5kZXgpID8gaW5kZXggOiBbaW5kZXhdKS5maWx0ZXIoKGlkeCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMudG9rZW5zLmluZGV4T2YoaWR4KSAhPT0gLTE7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChpbmRleGVzLmxlbmd0aCkgeyB0aGlzLnByb3BzLmhhbmRsZVJlbW92ZVRva2VucyhpbmRleGVzKTsgfVxuICAgIH1cblxuICAgIHNlbGVjdFRva2VuKGluZGV4KSB7XG4gICAgICAgIHRoaXMucHJvcHMuaGFuZGxlTmV3U2VsZWN0aW9uKFtpbmRleF0pO1xuICAgIH1cblxuICAgIHNlbGVjdFRva2VucyhpbmRleGVzKSB7XG4gICAgICAgIHRoaXMucHJvcHMuaGFuZGxlTmV3U2VsZWN0aW9uKGluZGV4ZXMpO1xuICAgIH1cblxuICAgIHNlbGVjdFByZXZpb3VzVG9rZW4oYXBwZW5kKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5wcm9wcy50b2tlbnNTZWxlY3RlZDtcbiAgICAgICAgY29uc3QgaW5kZXhlcyA9IHRoaXMucHJvcHMudG9rZW5zO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPT09IDEgJiYgZmlyc3Qoc2VsZWN0ZWQpID09PSBmaXJzdChpbmRleGVzKSkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBhbHJlYWR5IGF0IGxlZnRtb3N0IGJvdW5kXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID09PSAwKSB7IC8vIHBpY2sgdGhlIHJpZ2h0bW9zdFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RUb2tlbihsYXN0KGluZGV4ZXMpKTtcbiAgICAgICAgfSBlbHNlIHsgLy8gYWRkIHRoZSBuZXh0IGxlZnRtb3N0IHRvIGEgcmVjb25zdHJ1Y3RlZCBcInNlbGVjdGVkXCIgYXJyYXlcbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzVG9rZW4gPSBpbmRleGVzW2luZGV4ZXMuaW5kZXhPZihmaXJzdChzZWxlY3RlZCkpIC0gMV07XG5cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0VG9rZW5zKGFwcGVuZCA/IFtwcmV2aW91c1Rva2VuXS5jb25jYXQoc2VsZWN0ZWQpIDogW3ByZXZpb3VzVG9rZW5dKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlbGVjdE5leHRUb2tlbihhcHBlbmQpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnByb3BzLnRva2Vuc1NlbGVjdGVkO1xuICAgICAgICBjb25zdCBpbmRleGVzID0gdGhpcy5wcm9wcy50b2tlbnM7XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxhc3Qoc2VsZWN0ZWQpID09PSBsYXN0KGluZGV4ZXMpKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0VG9rZW4gPSBpbmRleGVzW2luZGV4ZXMuaW5kZXhPZihsYXN0KHNlbGVjdGVkKSkgKyAxXTtcblxuICAgICAgICAgICAgdGhpcy5zZWxlY3RUb2tlbnMoYXBwZW5kID8gc2VsZWN0ZWQuY29uY2F0KG5leHRUb2tlbikgOiBbbmV4dFRva2VuXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbGVhclNlbGVjdGlvbigpIHtcbiAgICAgICAgdGhpcy5wcm9wcy5oYW5kbGVOZXdTZWxlY3Rpb24oW10pO1xuICAgIH1cblxuICAgIGhhbmRsZUlucHV0Q2xpY2sgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuXG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHRoaXMucHJvcHMuaW5wdXRQcm9wcy5vbkNsaWNrKSkge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uQ2xpY2soZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlSW5wdXRGb2N1cyA9IChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG5cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpcy5wcm9wcy5pbnB1dFByb3BzLm9uRm9jdXMpKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLmlucHV0UHJvcHMub25Gb2N1cyhldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYW5kbGVLZXlEb3duID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIHN3aXRjaCAoZXZlbnQud2hpY2gpIHtcbiAgICAgICAgY2FzZSAzNzogICAgLy8gbGVmdCBhcnJvd1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RQcmV2aW91c1Rva2VuKGV2ZW50LnNoaWZ0S2V5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMzk6ICAgIC8vIHJpZ2h0IGFycm93XG4gICAgICAgICAgICB0aGlzLnNlbGVjdE5leHRUb2tlbihldmVudC5zaGlmdEtleSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDg6ICAgICAvLyBiYWNrc3BhY2VcbiAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLnRva2Vuc1NlbGVjdGVkLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKHRoaXMucHJvcHMudG9rZW5zU2VsZWN0ZWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSA2NTogICAgLy8gbGV0dGVyIFwiYVwiXG4gICAgICAgICAgICBpZiAoZXZlbnQubWV0YUtleSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3QoKTtcblxuICAgICAgICAgICAgICAgIC8vIGhhY2t5LCBidXQgdGhlIG9ubHkgd2F5IHVubGVzcyB3ZSBtb3ZlIHNlbGVjdGlvbiBtYW5hZ2VtZW50IGludGVybmFsIGFnYWluXG4gICAgICAgICAgICAgICAgdGhpcy5fc3VwcHJlc3NOZXh0VG9rZW5TZWxlY3Rpb24gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5oYW5kbGVOZXdTZWxlY3Rpb24odGhpcy5wcm9wcy50b2tlbnMpO1xuICAgICAgICAgICAgfSAvLyBcImNtZFwiXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNGdW5jdGlvbih0aGlzLnByb3BzLm9uS2V5RG93bikpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25LZXlEb3duKGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZVRva2VuQ2xvc2VDbGljayhpbmRleCwgZXZlbnQpIHtcbiAgICAgICAgLy8gaWYgd2UgZG9uJ3Qgc3RvcCBwcm9wYWdhdGlvbiwgdGhlIGV2ZW50IGJ1YmJsZXMgYW5kIHJlc3VsdHMgaW4gYSBmYWlsZWQgdG9rZW4gc2VsZWN0aW9uXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIHRoaXMucmVtb3ZlKGluZGV4KTtcbiAgICAgICAgdGhpcy5mb2N1cygpO1xuXG4gICAgICAgIGlmICh0aGlzLnByb3BzLnRva2VuQ2xvc2VDb21wb25lbnQucHJvcHMub25DbGljaykge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy50b2tlbkNsb3NlQ29tcG9uZW50LnByb3BzLm9uQ2xpY2soZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyVG9rZW5DbG9zZShpbmRleCkge1xuICAgICAgICBpZiAodGhpcy5wcm9wcy50b2tlbkNsb3NlVmlzaWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudCh0aGlzLnByb3BzLnRva2VuQ2xvc2VDb21wb25lbnQsIHtcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IGN4KCdiLXRva2VuZmllbGQtdG9rZW4tY2xvc2UnLCB0aGlzLnByb3BzLnRva2VuQ2xvc2VDb21wb25lbnQucHJvcHMuY2xhc3NOYW1lKSxcbiAgICAgICAgICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZVRva2VuQ2xvc2VDbGljay5iaW5kKHRoaXMsIGluZGV4KSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlVG9rZW5LZXlEb3duKGluZGV4LCBldmVudCkge1xuICAgICAgICBzd2l0Y2ggKGV2ZW50LndoaWNoKSB7XG4gICAgICAgIGNhc2UgMTM6IC8vIGVudGVyXG4gICAgICAgIGNhc2UgMzI6IC8vIHNwYWNlXG4gICAgICAgICAgICB0aGlzLnNlbGVjdFRva2VuKGluZGV4KTtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDg6IC8vIGJhY2tzcGFjZVxuICAgICAgICAgICAgdGhpcy5yZW1vdmUoaW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyVG9rZW5zKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2ItdG9rZW5maWVsZC10b2tlbnMnPlxuICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLnRva2Vucy5tYXAoKGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPXtgdG9rZW5fJHtpbmRleH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjeCgnYi10b2tlbmZpZWxkLXRva2VuJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiLXRva2VuZmllbGQtdG9rZW4tc2VsZWN0ZWQnOiB0aGlzLnByb3BzLnRva2Vuc1NlbGVjdGVkLmluZGV4T2YoaW5kZXgpICE9PSAtMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLnNlbGVjdFRva2VuLmJpbmQodGhpcywgaW5kZXgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uS2V5RG93bj17dGhpcy5oYW5kbGVUb2tlbktleURvd24uYmluZCh0aGlzLCBpbmRleCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiSW5kZXg9JzAnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLmVudGl0aWVzW2luZGV4XS50ZXh0fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0aGlzLnJlbmRlclRva2VuQ2xvc2UoaW5kZXgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgey4uLm9taXQodGhpcy5wcm9wcywgVG9rZW5pemVkSW5wdXQuaW50ZXJuYWxLZXlzKX1cbiAgICAgICAgICAgICAgICByZWY9J3dyYXBwZXInXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjeCgnYi10b2tlbmZpZWxkLXdyYXBwZXInLCB0aGlzLnByb3BzLmNsYXNzTmFtZSl9XG4gICAgICAgICAgICAgICAgb25LZXlEb3duPXt0aGlzLmhhbmRsZUtleURvd259PlxuICAgICAgICAgICAgICAgIHt0aGlzLnJlbmRlclRva2VucygpfVxuXG4gICAgICAgICAgICAgICAgPFR5cGVhaGVhZFxuICAgICAgICAgICAgICAgICAgICB7Li4uZXh0cmFjdENoaWxkUHJvcHModGhpcy5wcm9wcywgVHlwZWFoZWFkLmRlZmF1bHRQcm9wcyl9XG4gICAgICAgICAgICAgICAgICAgIHJlZj0ndHlwZWFoZWFkJ1xuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9J2ItdG9rZW5maWVsZCdcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJPblNlbGVjdGlvbj17dHJ1ZX1cbiAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm9wcz17e1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5wcm9wcy5pbnB1dFByb3BzLFxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljazogdGhpcy5oYW5kbGVJbnB1dENsaWNrLFxuICAgICAgICAgICAgICAgICAgICAgICAgb25Gb2N1czogdGhpcy5oYW5kbGVJbnB1dEZvY3VzLFxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICBvbkVudGl0eVNlbGVjdGVkPXt0aGlzLmFkZH0gLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL2JvdW5kbGVzcy10b2tlbml6ZWQtaW5wdXQvaW5kZXguanMiXSwic291cmNlUm9vdCI6IiJ9 |
@@ -11,6 +11,4 @@ import React, {PropTypes} from 'react'; | ||
const isFunction = (x) => typeof x === 'function'; | ||
const noop = () => {}; | ||
/** | ||
# TokenizedInput | ||
__Distill rich entity data matched via typeahead input into simple visual abstractions.__ | ||
@@ -50,3 +48,2 @@ | ||
static propTypes = { | ||
/** TokenizedInput accepts all [`Typeahead`](/Typeahead#props) and [`Input`](/Input#props) props */ | ||
...Typeahead.propTypes, | ||
@@ -92,5 +89,5 @@ | ||
...Typeahead.defaultProps, | ||
handleAddToken: noop, | ||
handleRemoveTokens: noop, | ||
handleNewSelection: noop, | ||
handleAddToken: () => {}, | ||
handleRemoveTokens: () => {}, | ||
handleNewSelection: () => {}, | ||
tokenCloseComponent: (<div>X</div>), | ||
@@ -163,4 +160,3 @@ tokenCloseVisible: true, | ||
if ( selected.length === 1 | ||
&& first(selected) === first(indexes)) { | ||
if (selected.length === 1 && first(selected) === first(indexes)) { | ||
return; // already at leftmost bound | ||
@@ -167,0 +163,0 @@ } |
{ | ||
"name": "boundless-tokenized-input", | ||
"version": "1.0.0-beta.5", | ||
"version": "1.0.0-beta.7", | ||
"description": "Distill rich entity data matched via typeahead input into simple visual abstractions.", | ||
@@ -30,5 +30,5 @@ "main": "build/index.js", | ||
"dependencies": { | ||
"boundless-typeahead": "^1.0.0-beta.5", | ||
"boundless-utils-object-intersection": "^1.0.0-beta.5", | ||
"boundless-utils-omit-keys": "^1.0.0-beta.5", | ||
"boundless-typeahead": "^1.0.0-beta.7", | ||
"boundless-utils-object-intersection": "^1.0.0-beta.7", | ||
"boundless-utils-omit-keys": "^1.0.0-beta.7", | ||
"classnames": "^2.1.5" | ||
@@ -35,0 +35,0 @@ }, |
@@ -0,4 +1,6 @@ | ||
<!--- | ||
THIS IS AN AUTOGENERATED FILE. EDIT INDEX.JS INSTEAD. | ||
--> | ||
# TokenizedInput | ||
# TokenizedInput | ||
__Distill rich entity data matched via typeahead input into simple visual abstractions.__ | ||
@@ -36,5 +38,305 @@ | ||
## Example Usage | ||
```jsx | ||
import React from 'react'; | ||
import TokenizedInput from '../index'; | ||
import Typeahead from '../../boundless-typeahead/index'; | ||
import {without} from 'lodash'; | ||
export default class TokenizedInputDemo extends React.PureComponent { | ||
state = { | ||
countries: [ | ||
{text: 'Afghanistan'}, | ||
{text: 'Albania'}, | ||
{text: 'Algeria'}, | ||
{text: 'American Samoa'}, | ||
{text: 'Andorra'}, | ||
{text: 'Angola'}, | ||
{text: 'Anguilla'}, | ||
{text: 'Antarctica'}, | ||
{text: 'Antigua and Barbuda'}, | ||
{text: 'Argentina'}, | ||
{text: 'Armenia'}, | ||
{text: 'Aruba'}, | ||
{text: 'Australia'}, | ||
{text: 'Austria'}, | ||
{text: 'Azerbaijan'}, | ||
{text: 'Bahamas'}, | ||
{text: 'Bahrain'}, | ||
{text: 'Bangladesh'}, | ||
{text: 'Barbados'}, | ||
{text: 'Belarus'}, | ||
{text: 'Belgium'}, | ||
{text: 'Belize'}, | ||
{text: 'Benin'}, | ||
{text: 'Bermuda'}, | ||
{text: 'Bhutan'}, | ||
{text: 'Bolivia'}, | ||
{text: 'Bosnia and Herzegovina'}, | ||
{text: 'Botswana'}, | ||
{text: 'Bouvet Island'}, | ||
{text: 'Brazil'}, | ||
{text: 'British Indian Ocean Territory'}, | ||
{text: 'Brunei Darussalam'}, | ||
{text: 'Bulgaria'}, | ||
{text: 'Burkina Faso'}, | ||
{text: 'Burundi'}, | ||
{text: 'Cambodia'}, | ||
{text: 'Cameroon'}, | ||
{text: 'Canada'}, | ||
{text: 'Cape Verde'}, | ||
{text: 'Caribbean Netherlands'}, | ||
{text: 'Cayman Islands'}, | ||
{text: 'Central African Republic'}, | ||
{text: 'Chad'}, | ||
{text: 'Chile'}, | ||
{text: 'China'}, | ||
{text: 'Christmas Island'}, | ||
{text: 'Cocos (Keeling) Islands'}, | ||
{text: 'Colombia'}, | ||
{text: 'Comoros'}, | ||
{text: 'Congo'}, | ||
{text: 'Congo, Democratic Republic of'}, | ||
{text: 'Cook Islands'}, | ||
{text: 'Costa Rica'}, | ||
{text: 'Croatia'}, | ||
{text: 'Cuba'}, | ||
{text: 'Curaçao'}, | ||
{text: 'Cyprus'}, | ||
{text: 'Czech Republic'}, | ||
{text: 'Côte d\'Ivoire'}, | ||
{text: 'Denmark'}, | ||
{text: 'Djibouti'}, | ||
{text: 'Dominica'}, | ||
{text: 'Dominican Republic'}, | ||
{text: 'Ecuador'}, | ||
{text: 'Egypt'}, | ||
{text: 'El Salvador'}, | ||
{text: 'Equatorial Guinea'}, | ||
{text: 'Eritrea'}, | ||
{text: 'Estonia'}, | ||
{text: 'Ethiopia'}, | ||
{text: 'Falkland Islands'}, | ||
{text: 'Faroe Islands'}, | ||
{text: 'Fiji'}, | ||
{text: 'Finland'}, | ||
{text: 'France'}, | ||
{text: 'French Guiana'}, | ||
{text: 'French Polynesia'}, | ||
{text: 'French Southern Territories'}, | ||
{text: 'Gabon'}, | ||
{text: 'Gambia'}, | ||
{text: 'Georgia'}, | ||
{text: 'Germany'}, | ||
{text: 'Ghana'}, | ||
{text: 'Gibraltar'}, | ||
{text: 'Greece'}, | ||
{text: 'Greenland'}, | ||
{text: 'Grenada'}, | ||
{text: 'Guadeloupe'}, | ||
{text: 'Guam'}, | ||
{text: 'Guatemala'}, | ||
{text: 'Guernsey'}, | ||
{text: 'Guinea'}, | ||
{text: 'Guinea-Bissau'}, | ||
{text: 'Guyana'}, | ||
{text: 'Haiti'}, | ||
{text: 'Heard and McDonald Islands'}, | ||
{text: 'Honduras'}, | ||
{text: 'Hong Kong'}, | ||
{text: 'Hungary'}, | ||
{text: 'Iceland'}, | ||
{text: 'India'}, | ||
{text: 'Indonesia'}, | ||
{text: 'Iran'}, | ||
{text: 'Iraq'}, | ||
{text: 'Ireland'}, | ||
{text: 'Isle of Man'}, | ||
{text: 'Israel'}, | ||
{text: 'Italy'}, | ||
{text: 'Jamaica'}, | ||
{text: 'Japan'}, | ||
{text: 'Jersey'}, | ||
{text: 'Jordan'}, | ||
{text: 'Kazakhstan'}, | ||
{text: 'Kenya'}, | ||
{text: 'Kiribati'}, | ||
{text: 'Kuwait'}, | ||
{text: 'Kyrgyzstan'}, | ||
{text: 'Lao People\'s Democratic Republic'}, | ||
{text: 'Latvia'}, | ||
{text: 'Lebanon'}, | ||
{text: 'Lesotho'}, | ||
{text: 'Liberia'}, | ||
{text: 'Libya'}, | ||
{text: 'Liechtenstein'}, | ||
{text: 'Lithuania'}, | ||
{text: 'Luxembourg'}, | ||
{text: 'Macau'}, | ||
{text: 'Macedonia'}, | ||
{text: 'Madagascar'}, | ||
{text: 'Malawi'}, | ||
{text: 'Malaysia'}, | ||
{text: 'Maldives'}, | ||
{text: 'Mali'}, | ||
{text: 'Malta'}, | ||
{text: 'Marshall Islands'}, | ||
{text: 'Martinique'}, | ||
{text: 'Mauritania'}, | ||
{text: 'Mauritius'}, | ||
{text: 'Mayotte'}, | ||
{text: 'Mexico'}, | ||
{text: 'Micronesia, Federated States of'}, | ||
{text: 'Moldova'}, | ||
{text: 'Monaco'}, | ||
{text: 'Mongolia'}, | ||
{text: 'Montenegro'}, | ||
{text: 'Montserrat'}, | ||
{text: 'Morocco'}, | ||
{text: 'Mozambique'}, | ||
{text: 'Myanmar'}, | ||
{text: 'Namibia'}, | ||
{text: 'Nauru'}, | ||
{text: 'Nepal'}, | ||
{text: 'New Caledonia'}, | ||
{text: 'New Zealand'}, | ||
{text: 'Nicaragua'}, | ||
{text: 'Niger'}, | ||
{text: 'Nigeria'}, | ||
{text: 'Niue'}, | ||
{text: 'Norfolk Island'}, | ||
{text: 'North Korea'}, | ||
{text: 'Northern Mariana Islands'}, | ||
{text: 'Norway'}, | ||
{text: 'Oman'}, | ||
{text: 'Pakistan'}, | ||
{text: 'Palau'}, | ||
{text: 'Palestine, State of'}, | ||
{text: 'Panama'}, | ||
{text: 'Papua New Guinea'}, | ||
{text: 'Paraguay'}, | ||
{text: 'Peru'}, | ||
{text: 'Philippines'}, | ||
{text: 'Pitcairn'}, | ||
{text: 'Poland'}, | ||
{text: 'Portugal'}, | ||
{text: 'Puerto Rico'}, | ||
{text: 'Qatar'}, | ||
{text: 'Romania'}, | ||
{text: 'Russian Federation'}, | ||
{text: 'Rwanda'}, | ||
{text: 'Réunion'}, | ||
{text: 'Saint Barthélemy'}, | ||
{text: 'Saint Helena'}, | ||
{text: 'Saint Kitts and Nevis'}, | ||
{text: 'Saint Lucia'}, | ||
{text: 'Saint Vincent and the Grenadines'}, | ||
{text: 'Saint-Martin (France)'}, | ||
{text: 'Samoa'}, | ||
{text: 'San Marino'}, | ||
{text: 'Sao Tome and Principe'}, | ||
{text: 'Saudi Arabia'}, | ||
{text: 'Senegal'}, | ||
{text: 'Serbia'}, | ||
{text: 'Seychelles'}, | ||
{text: 'Sierra Leone'}, | ||
{text: 'Singapore'}, | ||
{text: 'Sint Maarten (Dutch part)'}, | ||
{text: 'Slovakia'}, | ||
{text: 'Slovenia'}, | ||
{text: 'Solomon Islands'}, | ||
{text: 'Somalia'}, | ||
{text: 'South Africa'}, | ||
{text: 'South Georgia and the South Sandwich Islands'}, | ||
{text: 'South Korea'}, | ||
{text: 'South Sudan'}, | ||
{text: 'Spain'}, | ||
{text: 'Sri Lanka'}, | ||
{text: 'St. Pierre and Miquelon'}, | ||
{text: 'Sudan'}, | ||
{text: 'Suriname'}, | ||
{text: 'Svalbard and Jan Mayen Islands'}, | ||
{text: 'Swaziland'}, | ||
{text: 'Sweden'}, | ||
{text: 'Switzerland'}, | ||
{text: 'Syria'}, | ||
{text: 'Taiwan'}, | ||
{text: 'Tajikistan'}, | ||
{text: 'Tanzania'}, | ||
{text: 'Thailand'}, | ||
{text: 'The Netherlands'}, | ||
{text: 'Timor-Leste'}, | ||
{text: 'Togo'}, | ||
{text: 'Tokelau'}, | ||
{text: 'Tonga'}, | ||
{text: 'Trinidad and Tobago'}, | ||
{text: 'Tunisia'}, | ||
{text: 'Turkey'}, | ||
{text: 'Turkmenistan'}, | ||
{text: 'Turks and Caicos Islands'}, | ||
{text: 'Tuvalu'}, | ||
{text: 'Uganda'}, | ||
{text: 'Ukraine'}, | ||
{text: 'United Arab Emirates'}, | ||
{text: 'United Kingdom'}, | ||
{text: 'United States'}, | ||
{text: 'United States Minor Outlying Islands'}, | ||
{text: 'Uruguay'}, | ||
{text: 'Uzbekistan'}, | ||
{text: 'Vanuatu'}, | ||
{text: 'Vatican'}, | ||
{text: 'Venezuela'}, | ||
{text: 'Vietnam'}, | ||
{text: 'Virgin Islands (British)'}, | ||
{text: 'Virgin Islands (U.S.)'}, | ||
{text: 'Wallis and Futuna Islands'}, | ||
{text: 'Western Sahara'}, | ||
{text: 'Yemen'}, | ||
{text: 'Zambia'}, | ||
{text: 'Zimbabwe'}, | ||
], | ||
tokens: [11, 55, 211], | ||
tokensSelected: [], | ||
} | ||
addTokenByEntityIndex = (index) => { | ||
this.setState({tokens: this.state.tokens.concat(index)}); | ||
} | ||
removeTokensByEntityIndexes = (indexes) => { | ||
this.setState({ | ||
tokens: without(this.state.tokens, ...indexes), | ||
tokensSelected: without(this.state.tokensSelected, ...indexes), | ||
}); | ||
} | ||
handleSelectionByEntityIndexes = (indexes) => { | ||
this.setState({tokensSelected: indexes}); | ||
} | ||
render() { | ||
return ( | ||
<div> | ||
<p>Enter a country you'd like to visit:</p> | ||
<TokenizedInput | ||
algorithm={Typeahead.mode.FUZZY} | ||
entities={this.state.countries} | ||
handleAddToken={this.addTokenByEntityIndex} | ||
handleRemoveTokens={this.removeTokensByEntityIndexes} | ||
handleNewSelection={this.handleSelectionByEntityIndexes} | ||
hint={true} | ||
tokenCloseComponent={<span>ⓧ</span>} | ||
tokens={this.state.tokens} | ||
tokensSelected={this.state.tokensSelected} /> | ||
</div> | ||
); | ||
} | ||
} | ||
``` | ||
## Props | ||
_Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/TokenizedInput#props)._ | ||
> Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/TokenizedInput#props). | ||
@@ -48,148 +350,146 @@ ### Required Props | ||
<table> | ||
<tr> | ||
<th>Name</th> | ||
<th>Type</th> | ||
<th>Default Value</th> | ||
<th>Description</th> | ||
</tr> | ||
- __`*`__ ・ any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
<tr> | ||
<td>algorithm</td> | ||
<td><pre><code>Typeahead.mode.STARTS_WITH or | ||
Typeahead.mode.FUZZY or object</code></pre></td> | ||
<td><pre><code class="language-js">Typeahead.mode.FUZZY</code></pre></td> | ||
<td>the mechanism used to identify and mark matching substrings; a custom set can be provided as an object (see the properties below)</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any` | `n/a` | ||
<tr> | ||
<td>clearOnSelection</td> | ||
<td><pre><code>bool</code></pre></td> | ||
<td><pre><code class="language-js">false</code></pre></td> | ||
<td>if `true`, clears the input text when a (partial) match is selected</td> | ||
</tr> | ||
- __`algorithm`__ ・ the mechanism used to identify and mark matching substrings; a custom set can be provided as an object (see the properties below) | ||
<tr> | ||
<td>entities</td> | ||
<td><pre><code>arrayOf(object)</code></pre></td> | ||
<td><pre><code class="language-js">[]</code></pre></td> | ||
<td>an array of objects that user input is filtered against; at a minimum, each object must have a `text` property and any other supplied property is passed through to the resulting DOM element</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`Typeahead.mode.STARTS_WITH or Typeahead.mode.FUZZY or object` | `Typeahead.mode.FUZZY` | ||
<tr> | ||
<td>handleAddToken</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">() => {}</code></pre></td> | ||
<td>function handler that is called when an entity is selected by the user and a token should be created</td> | ||
</tr> | ||
- __`clearOnSelection`__ ・ if `true`, clears the input text when a (partial) match is selected | ||
<tr> | ||
<td>handleNewSelection</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">() => {}</code></pre></td> | ||
<td>function handler that is called when one or more tokens are selected by the user via click or keyboard actions; called with what the new selection should be</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`bool` | `false` | ||
<tr> | ||
<td>handleRemoveTokens</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">() => {}</code></pre></td> | ||
<td>function handler that is called when one or more tokens are removed by the user via clicking the "close" button or pressing the `Backspace` key while tokens are selected</td> | ||
</tr> | ||
- __`component`__ ・ overrides the HTML container tag | ||
<tr> | ||
<td>hidePlaceholderOnFocus</td> | ||
<td><pre><code>bool</code></pre></td> | ||
<td><pre><code class="language-js">true</code></pre></td> | ||
<td>triggers the placeholder to disappear when the input field is focused, reappears when the user has tabbed away or focus is moved</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`string` | `'div'` | ||
<tr> | ||
<td>hint</td> | ||
<td><pre><code>bool</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>renders a disabled textfield with the full text of the currently selected input hint; will remain blank if the matched substring is not at the beginning of the user input</td> | ||
</tr> | ||
- __`entities`__ ・ an array of objects that user input is filtered against; at a minimum, each object must have a `text` property and any other supplied property is passed through to the resulting DOM element | ||
<tr> | ||
<td>hintProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-typeahead-hint` HTML element</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`arrayOf(object)` | `[]` | ||
<tr> | ||
<td>inputProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{ | ||
- __`handleAddToken`__ ・ function handler that is called when an entity is selected by the user and a token should be created | ||
Expects | Default Value | ||
- | - | ||
`function` | `() => {}` | ||
- __`handleNewSelection`__ ・ function handler that is called when one or more tokens are selected by the user via click or keyboard actions; called with what the new selection should be | ||
Expects | Default Value | ||
- | - | ||
`function` | `() => {}` | ||
- __`handleRemoveTokens`__ ・ function handler that is called when one or more tokens are removed by the user via clicking the "close" button or pressing the `Backspace` key while tokens are selected | ||
Expects | Default Value | ||
- | - | ||
`function` | `() => {}` | ||
- __`hidePlaceholderOnFocus`__ ・ triggers the placeholder to disappear when the input field is focused, reappears when the user has tabbed away or focus is moved | ||
Expects | Default Value | ||
- | - | ||
`bool` | `true` | ||
- __`hint`__ ・ renders a disabled textfield with the full text of the currently selected input hint; will remain blank if the matched substring is not at the beginning of the user input | ||
Expects | Default Value | ||
- | - | ||
`bool` | `null` | ||
- __`hintProps`__ | ||
Expects | Default Value | ||
- | - | ||
`object` | `{}` | ||
- __`inputProps`__ | ||
Expects | Default Value | ||
- | - | ||
`object` | `{ | ||
type: 'text', | ||
}</code></pre></td> | ||
<td>props to be passed through to the input node, `.b-textual-input`; this includes the standard set of React input props like `defaultValue`, `value`, `name`, `placeholder`, `autoFocus`, etc.</td> | ||
</tr> | ||
}` | ||
<tr> | ||
<td>matchWrapperProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-typeahead-match-wrapper` HTML element</td> | ||
</tr> | ||
- __`matchWrapperProps`__ | ||
<tr> | ||
<td>offscreenClass</td> | ||
<td><pre><code>string</code></pre></td> | ||
<td><pre><code class="language-js">'b-offscreen'</code></pre></td> | ||
<td>the "offscreen" class used by your application; specifically to retain [ARIA navigability](http://snook.ca/archives/html_and_css/hiding-content-for-accessibility) as `display: none` excludes the element from consideration</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`object` | `{}` | ||
<tr> | ||
<td>onComplete</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">() => {}</code></pre></td> | ||
<td>called when the user presses `Enter` with no autosuggest hint available, indicating that input is complete</td> | ||
</tr> | ||
- __`offscreenClass`__ ・ the "offscreen" class used by your application; specifically to retain [ARIA navigability](http://snook.ca/archives/html_and_css/hiding-content-for-accessibility) as `display: none` excludes the element from consideration | ||
<tr> | ||
<td>onEntityHighlighted</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">() => {}</code></pre></td> | ||
<td>called with the index of the highlighted entity due to keyboard selection</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`string` | `'b-offscreen'` | ||
<tr> | ||
<td>onEntitySelected</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">() => {}</code></pre></td> | ||
<td>called with the index of the entity selected by the user</td> | ||
</tr> | ||
- __`onComplete`__ ・ called when the user presses `Enter` with no autosuggest hint available, indicating that input is complete | ||
<tr> | ||
<td>tokenCloseComponent</td> | ||
<td><pre><code>ReactElement</code></pre></td> | ||
<td><pre><code class="language-js"><div>X</div></code></pre></td> | ||
<td>the JSX used for the close button itself</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`function` | `() => {}` | ||
<tr> | ||
<td>tokenCloseVisible</td> | ||
<td><pre><code>bool</code></pre></td> | ||
<td><pre><code class="language-js">true</code></pre></td> | ||
<td>determines if the `.b-tokenfield-token-close` element should be rendered for each token</td> | ||
</tr> | ||
- __`onEntityHighlighted`__ ・ called with the index of the highlighted entity due to keyboard selection | ||
<tr> | ||
<td>tokens</td> | ||
<td><pre><code>arrayOf(number)</code></pre></td> | ||
<td><pre><code class="language-js">[]</code></pre></td> | ||
<td>the indexes of entities that should be rendered as "tokens" in the component UI</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`function` | `() => {}` | ||
<tr> | ||
<td>tokensSelected</td> | ||
<td><pre><code>arrayOf(number)</code></pre></td> | ||
<td><pre><code class="language-js">[]</code></pre></td> | ||
<td>the indexes of tokenized entities that are part of an active selection; the user can press `Backspace` to trigger `handleRemoveTokens`</td> | ||
</tr> | ||
- __`onEntitySelected`__ ・ called with the index of the entity selected by the user | ||
</table> | ||
Expects | Default Value | ||
- | - | ||
`function` | `() => {}` | ||
- __`tokenCloseComponent`__ ・ the JSX used for the close button itself | ||
Expects | Default Value | ||
- | - | ||
`ReactElement` | `<div>X</div>` | ||
- __`tokenCloseVisible`__ ・ determines if the `.b-tokenfield-token-close` element should be rendered for each token | ||
Expects | Default Value | ||
- | - | ||
`bool` | `true` | ||
- __`tokens`__ ・ the indexes of entities that should be rendered as "tokens" in the component UI | ||
Expects | Default Value | ||
- | - | ||
`arrayOf(number)` | `[]` | ||
- __`tokensSelected`__ ・ the indexes of tokenized entities that are part of an active selection; the user can press `Backspace` to trigger `handleRemoveTokens` | ||
Expects | Default Value | ||
- | - | ||
`arrayOf(number)` | `[]` | ||
## Reference Styles | ||
### Stylus | ||
```stylus | ||
// Bring in Boundless's base Stylus variables | ||
@require "node_modules/boundless-tokenized-input/variables" | ||
// Redefine any variables as desired, e.g. | ||
color-accent = royalblue | ||
// Bring in the component styles; they will be autoconfigured based on the above | ||
@require "node_modules/boundless-tokenized-input/style" | ||
``` | ||
### CSS | ||
If desired, a precompiled plain CSS stylesheet is available for customization at `/build/style.css`, based on Boundless's [default variables](https://github.com/enigma-io/boundless/blob/master/variables.styl). | ||
@@ -15,3 +15,2 @@ import React, {PropTypes} from 'react'; | ||
/** | ||
# Typeahead | ||
__Intelligently recommend entities via customizable, fuzzy recognition.__ | ||
@@ -185,11 +184,15 @@ | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-typeahead-hint` HTML element | ||
*/ | ||
hintProps: PropTypes.object, | ||
hintProps: PropTypes.shape({ | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
'*': PropTypes.any, | ||
}), | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-typeahead-match-wrapper` HTML element | ||
*/ | ||
matchWrapperProps: PropTypes.object, | ||
matchWrapperProps: PropTypes.shape({ | ||
/** | ||
* any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
*/ | ||
'*': PropTypes.any, | ||
}), | ||
@@ -196,0 +199,0 @@ /** |
{ | ||
"name": "boundless-typeahead", | ||
"version": "1.0.0-beta.5", | ||
"version": "1.0.0-beta.7", | ||
"description": "Intelligently recommend entities via customizable, fuzzy recognition.", | ||
@@ -28,6 +28,6 @@ "main": "build/index.js", | ||
"dependencies": { | ||
"boundless-input": "^1.0.0-beta.5", | ||
"boundless-utils-object-intersection": "^1.0.0-beta.5", | ||
"boundless-utils-omit-keys": "^1.0.0-beta.5", | ||
"boundless-utils-uuid": "^1.0.0-beta.5", | ||
"boundless-input": "^1.0.0-beta.7", | ||
"boundless-utils-object-intersection": "^1.0.0-beta.7", | ||
"boundless-utils-omit-keys": "^1.0.0-beta.7", | ||
"boundless-utils-uuid": "^1.0.0-beta.7", | ||
"classnames": "^2.1.5", | ||
@@ -34,0 +34,0 @@ "escape-string-regexp": "^1.0.3" |
@@ -0,4 +1,6 @@ | ||
<!--- | ||
THIS IS AN AUTOGENERATED FILE. EDIT INDEX.JS INSTEAD. | ||
--> | ||
# Typeahead | ||
# Typeahead | ||
__Intelligently recommend entities via customizable, fuzzy recognition.__ | ||
@@ -74,5 +76,306 @@ | ||
## Example Usage | ||
```jsx | ||
import React from 'react'; | ||
import Typeahead from '../index'; | ||
export default class TypeaheadDemo extends React.PureComponent { | ||
state = { | ||
countries: [ | ||
{text: 'Afghanistan'}, | ||
{text: 'Albania'}, | ||
{text: 'Algeria'}, | ||
{text: 'American Samoa'}, | ||
{text: 'Andorra'}, | ||
{text: 'Angola'}, | ||
{text: 'Anguilla'}, | ||
{text: 'Antarctica'}, | ||
{text: 'Antigua and Barbuda'}, | ||
{text: 'Argentina'}, | ||
{text: 'Armenia'}, | ||
{text: 'Aruba'}, | ||
{text: 'Australia'}, | ||
{text: 'Austria'}, | ||
{text: 'Azerbaijan'}, | ||
{text: 'Bahamas'}, | ||
{text: 'Bahrain'}, | ||
{text: 'Bangladesh'}, | ||
{text: 'Barbados'}, | ||
{text: 'Belarus'}, | ||
{text: 'Belgium'}, | ||
{text: 'Belize'}, | ||
{text: 'Benin'}, | ||
{text: 'Bermuda'}, | ||
{text: 'Bhutan'}, | ||
{text: 'Bolivia'}, | ||
{text: 'Bosnia and Herzegovina'}, | ||
{text: 'Botswana'}, | ||
{text: 'Bouvet Island'}, | ||
{text: 'Brazil'}, | ||
{text: 'British Indian Ocean Territory'}, | ||
{text: 'Brunei Darussalam'}, | ||
{text: 'Bulgaria'}, | ||
{text: 'Burkina Faso'}, | ||
{text: 'Burundi'}, | ||
{text: 'Cambodia'}, | ||
{text: 'Cameroon'}, | ||
{text: 'Canada'}, | ||
{text: 'Cape Verde'}, | ||
{text: 'Caribbean Netherlands'}, | ||
{text: 'Cayman Islands'}, | ||
{text: 'Central African Republic'}, | ||
{text: 'Chad'}, | ||
{text: 'Chile'}, | ||
{text: 'China'}, | ||
{text: 'Christmas Island'}, | ||
{text: 'Cocos (Keeling) Islands'}, | ||
{text: 'Colombia'}, | ||
{text: 'Comoros'}, | ||
{text: 'Congo'}, | ||
{text: 'Congo, Democratic Republic of'}, | ||
{text: 'Cook Islands'}, | ||
{text: 'Costa Rica'}, | ||
{text: 'Croatia'}, | ||
{text: 'Cuba'}, | ||
{text: 'Curaçao'}, | ||
{text: 'Cyprus'}, | ||
{text: 'Czech Republic'}, | ||
{text: 'Côte d\'Ivoire'}, | ||
{text: 'Denmark'}, | ||
{text: 'Djibouti'}, | ||
{text: 'Dominica'}, | ||
{text: 'Dominican Republic'}, | ||
{text: 'Ecuador'}, | ||
{text: 'Egypt'}, | ||
{text: 'El Salvador'}, | ||
{text: 'Equatorial Guinea'}, | ||
{text: 'Eritrea'}, | ||
{text: 'Estonia'}, | ||
{text: 'Ethiopia'}, | ||
{text: 'Falkland Islands'}, | ||
{text: 'Faroe Islands'}, | ||
{text: 'Fiji'}, | ||
{text: 'Finland'}, | ||
{text: 'France'}, | ||
{text: 'French Guiana'}, | ||
{text: 'French Polynesia'}, | ||
{text: 'French Southern Territories'}, | ||
{text: 'Gabon'}, | ||
{text: 'Gambia'}, | ||
{text: 'Georgia'}, | ||
{text: 'Germany'}, | ||
{text: 'Ghana'}, | ||
{text: 'Gibraltar'}, | ||
{text: 'Greece'}, | ||
{text: 'Greenland'}, | ||
{text: 'Grenada'}, | ||
{text: 'Guadeloupe'}, | ||
{text: 'Guam'}, | ||
{text: 'Guatemala'}, | ||
{text: 'Guernsey'}, | ||
{text: 'Guinea'}, | ||
{text: 'Guinea-Bissau'}, | ||
{text: 'Guyana'}, | ||
{text: 'Haiti'}, | ||
{text: 'Heard and McDonald Islands'}, | ||
{text: 'Honduras'}, | ||
{text: 'Hong Kong'}, | ||
{text: 'Hungary'}, | ||
{text: 'Iceland'}, | ||
{text: 'India'}, | ||
{text: 'Indonesia'}, | ||
{text: 'Iran'}, | ||
{text: 'Iraq'}, | ||
{text: 'Ireland'}, | ||
{text: 'Isle of Man'}, | ||
{text: 'Israel'}, | ||
{text: 'Italy'}, | ||
{text: 'Jamaica'}, | ||
{text: 'Japan'}, | ||
{text: 'Jersey'}, | ||
{text: 'Jordan'}, | ||
{text: 'Kazakhstan'}, | ||
{text: 'Kenya'}, | ||
{text: 'Kiribati'}, | ||
{text: 'Kuwait'}, | ||
{text: 'Kyrgyzstan'}, | ||
{text: 'Lao People\'s Democratic Republic'}, | ||
{text: 'Latvia'}, | ||
{text: 'Lebanon'}, | ||
{text: 'Lesotho'}, | ||
{text: 'Liberia'}, | ||
{text: 'Libya'}, | ||
{text: 'Liechtenstein'}, | ||
{text: 'Lithuania'}, | ||
{text: 'Luxembourg'}, | ||
{text: 'Macau'}, | ||
{text: 'Macedonia'}, | ||
{text: 'Madagascar'}, | ||
{text: 'Malawi'}, | ||
{text: 'Malaysia'}, | ||
{text: 'Maldives'}, | ||
{text: 'Mali'}, | ||
{text: 'Malta'}, | ||
{text: 'Marshall Islands'}, | ||
{text: 'Martinique'}, | ||
{text: 'Mauritania'}, | ||
{text: 'Mauritius'}, | ||
{text: 'Mayotte'}, | ||
{text: 'Mexico'}, | ||
{text: 'Micronesia, Federated States of'}, | ||
{text: 'Moldova'}, | ||
{text: 'Monaco'}, | ||
{text: 'Mongolia'}, | ||
{text: 'Montenegro'}, | ||
{text: 'Montserrat'}, | ||
{text: 'Morocco'}, | ||
{text: 'Mozambique'}, | ||
{text: 'Myanmar'}, | ||
{text: 'Namibia'}, | ||
{text: 'Nauru'}, | ||
{text: 'Nepal'}, | ||
{text: 'New Caledonia'}, | ||
{text: 'New Zealand'}, | ||
{text: 'Nicaragua'}, | ||
{text: 'Niger'}, | ||
{text: 'Nigeria'}, | ||
{text: 'Niue'}, | ||
{text: 'Norfolk Island'}, | ||
{text: 'North Korea'}, | ||
{text: 'Northern Mariana Islands'}, | ||
{text: 'Norway'}, | ||
{text: 'Oman'}, | ||
{text: 'Pakistan'}, | ||
{text: 'Palau'}, | ||
{text: 'Palestine, State of'}, | ||
{text: 'Panama'}, | ||
{text: 'Papua New Guinea'}, | ||
{text: 'Paraguay'}, | ||
{text: 'Peru'}, | ||
{text: 'Philippines'}, | ||
{text: 'Pitcairn'}, | ||
{text: 'Poland'}, | ||
{text: 'Portugal'}, | ||
{text: 'Puerto Rico'}, | ||
{text: 'Qatar'}, | ||
{text: 'Romania'}, | ||
{text: 'Russian Federation'}, | ||
{text: 'Rwanda'}, | ||
{text: 'Réunion'}, | ||
{text: 'Saint Barthélemy'}, | ||
{text: 'Saint Helena'}, | ||
{text: 'Saint Kitts and Nevis'}, | ||
{text: 'Saint Lucia'}, | ||
{text: 'Saint Vincent and the Grenadines'}, | ||
{text: 'Saint-Martin (France)'}, | ||
{text: 'Samoa'}, | ||
{text: 'San Marino'}, | ||
{text: 'Sao Tome and Principe'}, | ||
{text: 'Saudi Arabia'}, | ||
{text: 'Senegal'}, | ||
{text: 'Serbia'}, | ||
{text: 'Seychelles'}, | ||
{text: 'Sierra Leone'}, | ||
{text: 'Singapore'}, | ||
{text: 'Sint Maarten (Dutch part)'}, | ||
{text: 'Slovakia'}, | ||
{text: 'Slovenia'}, | ||
{text: 'Solomon Islands'}, | ||
{text: 'Somalia'}, | ||
{text: 'South Africa'}, | ||
{text: 'South Georgia and the South Sandwich Islands'}, | ||
{text: 'South Korea'}, | ||
{text: 'South Sudan'}, | ||
{text: 'Spain'}, | ||
{text: 'Sri Lanka'}, | ||
{text: 'St. Pierre and Miquelon'}, | ||
{text: 'Sudan'}, | ||
{text: 'Suriname'}, | ||
{text: 'Svalbard and Jan Mayen Islands'}, | ||
{text: 'Swaziland'}, | ||
{text: 'Sweden'}, | ||
{text: 'Switzerland'}, | ||
{text: 'Syria'}, | ||
{text: 'Taiwan'}, | ||
{text: 'Tajikistan'}, | ||
{text: 'Tanzania'}, | ||
{text: 'Thailand'}, | ||
{text: 'The Netherlands'}, | ||
{text: 'Timor-Leste'}, | ||
{text: 'Togo'}, | ||
{text: 'Tokelau'}, | ||
{text: 'Tonga'}, | ||
{text: 'Trinidad and Tobago'}, | ||
{text: 'Tunisia'}, | ||
{text: 'Turkey'}, | ||
{text: 'Turkmenistan'}, | ||
{text: 'Turks and Caicos Islands'}, | ||
{text: 'Tuvalu'}, | ||
{text: 'Uganda'}, | ||
{text: 'Ukraine'}, | ||
{text: 'United Arab Emirates'}, | ||
{text: 'United Kingdom'}, | ||
{text: 'United States'}, | ||
{text: 'United States Minor Outlying Islands'}, | ||
{text: 'Uruguay'}, | ||
{text: 'Uzbekistan'}, | ||
{text: 'Vanuatu'}, | ||
{text: 'Vatican'}, | ||
{text: 'Venezuela'}, | ||
{text: 'Vietnam'}, | ||
{text: 'Virgin Islands (British)'}, | ||
{text: 'Virgin Islands (U.S.)'}, | ||
{text: 'Wallis and Futuna Islands'}, | ||
{text: 'Western Sahara'}, | ||
{text: 'Yemen'}, | ||
{text: 'Zambia'}, | ||
{text: 'Zimbabwe'}, | ||
], | ||
firstInputValue: '', | ||
secondInputValue: '', | ||
} | ||
handleFirstInputChange = (e) => this.setState({firstInputValue: e.target.value}) | ||
handleSecondInputChange = (e) => this.setState({secondInputValue: e.target.value}) | ||
render() { | ||
return ( | ||
<div className='spread'> | ||
<div> | ||
<h5>Starts-with matching</h5> | ||
<Typeahead | ||
algorithm={Typeahead.mode.STARTS_WITH} | ||
entities={this.state.countries} | ||
hint={true} | ||
inputProps={{ | ||
onChange: this.handleFirstInputChange, | ||
placeholder: 'Please enter your country of origin...', | ||
value: this.state.firstInputValue, | ||
}} /> | ||
</div> | ||
<div style={{marginLeft: '1em'}}> | ||
<h5>Fuzzy matching</h5> | ||
<Typeahead | ||
algorithm={Typeahead.mode.FUZZY} | ||
entities={this.state.countries} | ||
hint={true} | ||
inputProps={{ | ||
onChange: this.handleSecondInputChange, | ||
placeholder: 'Please enter your country of origin...', | ||
value: this.state.secondInputValue, | ||
}} /> | ||
</div> | ||
</div> | ||
); | ||
} | ||
} | ||
``` | ||
## Props | ||
_Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/Typeahead#props)._ | ||
> Note: only top-level props are in the README, for the full list check out the [website](http://boundless.js.org/Typeahead#props). | ||
@@ -86,99 +389,104 @@ ### Required Props | ||
<table> | ||
<tr> | ||
<th>Name</th> | ||
<th>Type</th> | ||
<th>Default Value</th> | ||
<th>Description</th> | ||
</tr> | ||
- __`*`__ ・ any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes) | ||
<tr> | ||
<td>algorithm</td> | ||
<td><pre><code>Typeahead.mode.STARTS_WITH or | ||
Typeahead.mode.FUZZY or object</code></pre></td> | ||
<td><pre><code class="language-js">Typeahead.mode.FUZZY</code></pre></td> | ||
<td>the mechanism used to identify and mark matching substrings; a custom set can be provided as an object (see the properties below)</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`any` | `n/a` | ||
<tr> | ||
<td>clearOnSelection</td> | ||
<td><pre><code>bool</code></pre></td> | ||
<td><pre><code class="language-js">false</code></pre></td> | ||
<td>if `true`, clears the input text when a (partial) match is selected</td> | ||
</tr> | ||
- __`algorithm`__ ・ the mechanism used to identify and mark matching substrings; a custom set can be provided as an object (see the properties below) | ||
<tr> | ||
<td>entities</td> | ||
<td><pre><code>arrayOf(object)</code></pre></td> | ||
<td><pre><code class="language-js">[]</code></pre></td> | ||
<td>an array of objects that user input is filtered against; at a minimum, each object must have a `text` property and any other supplied property is passed through to the resulting DOM element</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`Typeahead.mode.STARTS_WITH or Typeahead.mode.FUZZY or object` | `Typeahead.mode.FUZZY` | ||
<tr> | ||
<td>hidePlaceholderOnFocus</td> | ||
<td><pre><code>bool</code></pre></td> | ||
<td><pre><code class="language-js">true</code></pre></td> | ||
<td>triggers the placeholder to disappear when the input field is focused, reappears when the user has tabbed away or focus is moved</td> | ||
</tr> | ||
- __`clearOnSelection`__ ・ if `true`, clears the input text when a (partial) match is selected | ||
<tr> | ||
<td>hint</td> | ||
<td><pre><code>bool</code></pre></td> | ||
<td><pre><code class="language-js">null</code></pre></td> | ||
<td>renders a disabled textfield with the full text of the currently selected input hint; will remain blank if the matched substring is not at the beginning of the user input</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`bool` | `false` | ||
<tr> | ||
<td>hintProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-typeahead-hint` HTML element</td> | ||
</tr> | ||
- __`component`__ ・ overrides the HTML container tag | ||
<tr> | ||
<td>inputProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{ | ||
Expects | Default Value | ||
- | - | ||
`string` | `'div'` | ||
- __`entities`__ ・ an array of objects that user input is filtered against; at a minimum, each object must have a `text` property and any other supplied property is passed through to the resulting DOM element | ||
Expects | Default Value | ||
- | - | ||
`arrayOf(object)` | `[]` | ||
- __`hidePlaceholderOnFocus`__ ・ triggers the placeholder to disappear when the input field is focused, reappears when the user has tabbed away or focus is moved | ||
Expects | Default Value | ||
- | - | ||
`bool` | `true` | ||
- __`hint`__ ・ renders a disabled textfield with the full text of the currently selected input hint; will remain blank if the matched substring is not at the beginning of the user input | ||
Expects | Default Value | ||
- | - | ||
`bool` | `null` | ||
- __`hintProps`__ | ||
Expects | Default Value | ||
- | - | ||
`object` | `{}` | ||
- __`inputProps`__ | ||
Expects | Default Value | ||
- | - | ||
`object` | `{ | ||
type: 'text', | ||
}</code></pre></td> | ||
<td>props to be passed through to the input node, `.b-textual-input`; this includes the standard set of React input props like `defaultValue`, `value`, `name`, `placeholder`, `autoFocus`, etc.</td> | ||
</tr> | ||
}` | ||
<tr> | ||
<td>matchWrapperProps</td> | ||
<td><pre><code>object</code></pre></td> | ||
<td><pre><code class="language-js">{}</code></pre></td> | ||
<td>any [React-supported attribute](https://facebook.github.io/react/docs/tags-and-attributes.html#html-attributes); applied to the `.b-typeahead-match-wrapper` HTML element</td> | ||
</tr> | ||
- __`matchWrapperProps`__ | ||
<tr> | ||
<td>offscreenClass</td> | ||
<td><pre><code>string</code></pre></td> | ||
<td><pre><code class="language-js">'b-offscreen'</code></pre></td> | ||
<td>the "offscreen" class used by your application; specifically to retain [ARIA navigability](http://snook.ca/archives/html_and_css/hiding-content-for-accessibility) as `display: none` excludes the element from consideration</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`object` | `{}` | ||
<tr> | ||
<td>onComplete</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">() => {}</code></pre></td> | ||
<td>called when the user presses `Enter` with no autosuggest hint available, indicating that input is complete</td> | ||
</tr> | ||
- __`offscreenClass`__ ・ the "offscreen" class used by your application; specifically to retain [ARIA navigability](http://snook.ca/archives/html_and_css/hiding-content-for-accessibility) as `display: none` excludes the element from consideration | ||
<tr> | ||
<td>onEntityHighlighted</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">() => {}</code></pre></td> | ||
<td>called with the index of the highlighted entity due to keyboard selection</td> | ||
</tr> | ||
Expects | Default Value | ||
- | - | ||
`string` | `'b-offscreen'` | ||
<tr> | ||
<td>onEntitySelected</td> | ||
<td><pre><code>function</code></pre></td> | ||
<td><pre><code class="language-js">() => {}</code></pre></td> | ||
<td>called with the index of the entity selected by the user</td> | ||
</tr> | ||
- __`onComplete`__ ・ called when the user presses `Enter` with no autosuggest hint available, indicating that input is complete | ||
</table> | ||
Expects | Default Value | ||
- | - | ||
`function` | `() => {}` | ||
- __`onEntityHighlighted`__ ・ called with the index of the highlighted entity due to keyboard selection | ||
Expects | Default Value | ||
- | - | ||
`function` | `() => {}` | ||
- __`onEntitySelected`__ ・ called with the index of the entity selected by the user | ||
Expects | Default Value | ||
- | - | ||
`function` | `() => {}` | ||
## Reference Styles | ||
### Stylus | ||
```stylus | ||
// Bring in Boundless's base Stylus variables | ||
@require "node_modules/boundless-typeahead/variables" | ||
// Redefine any variables as desired, e.g. | ||
color-accent = royalblue | ||
// Bring in the component styles; they will be autoconfigured based on the above | ||
@require "node_modules/boundless-typeahead/style" | ||
``` | ||
### CSS | ||
If desired, a precompiled plain CSS stylesheet is available for customization at `/build/style.css`, based on Boundless's [default variables](https://github.com/enigma-io/boundless/blob/master/variables.styl). | ||
module.exports=function(e){function t(n){if(r[n])return r[n].exports;var u=r[n]={i:n,l:!1,exports:{}};return e[n].call(u.exports,u,u.exports,t),u.l=!0,u.exports}var r={};return t.m=e,t.c=r,t.i=function(e){return e},t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=0)}([function(e,t,r){"use strict";function n(e,t){return Object.keys(t).reduce(function(t,r){return r in e&&(t[r]=e[r]),t},{})}Object.defineProperty(t,"__esModule",{value:!0}),t.default=n}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIDkwZTY3YzY5NGMzYmY4MmVkYWVkIiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vYmplY3QtaW50ZXJzZWN0aW9uL2luZGV4LmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJtb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiaW5zdGFsbGVkTW9kdWxlcyIsImkiLCJsIiwiY2FsbCIsIm0iLCJjIiwidmFsdWUiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJnZXQiLCJuIiwiX19lc01vZHVsZSIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsIl9fd2VicGFja19leHBvcnRzX18iLCJnZXRJbnRlcnNlY3Rpb24iLCJvYmoxIiwib2JqMiIsImtleXMiLCJyZWR1Y2UiLCJjaGlsZFByb3BzIiwia2V5Il0sIm1hcHBpbmdzIjoiQUFBQUEsT0FBT0MsUUFDRSxTQUFVQyxHQ0duQixRQUFBQyxHQUFBQyxHQUdBLEdBQUFDLEVBQUFELEdBQ0EsTUFBQUMsR0FBQUQsR0FBQUgsT0FHQSxJQUFBRCxHQUFBSyxFQUFBRCxJQUNBRSxFQUFBRixFQUNBRyxHQUFBLEVBQ0FOLFdBVUEsT0FOQUMsR0FBQUUsR0FBQUksS0FBQVIsRUFBQUMsUUFBQUQsSUFBQUMsUUFBQUUsR0FHQUgsRUFBQU8sR0FBQSxFQUdBUCxFQUFBQyxRQXZCQSxHQUFBSSxLQStEQSxPQW5DQUYsR0FBQU0sRUFBQVAsRUFHQUMsRUFBQU8sRUFBQUwsRUFHQUYsRUFBQUcsRUFBQSxTQUFBSyxHQUEyQyxNQUFBQSxJQUczQ1IsRUFBQVMsRUFBQSxTQUFBWCxFQUFBWSxFQUFBQyxHQUNBWCxFQUFBWSxFQUFBZCxFQUFBWSxJQUNBRyxPQUFBQyxlQUFBaEIsRUFBQVksR0FDQUssY0FBQSxFQUNBQyxZQUFBLEVBQ0FDLElBQUFOLEtBTUFYLEVBQUFrQixFQUFBLFNBQUFyQixHQUNBLEdBQUFjLEdBQUFkLEtBQUFzQixXQUNBLFdBQTJCLE1BQUF0QixHQUFBLFNBQzNCLFdBQWlDLE1BQUFBLEdBRWpDLE9BREFHLEdBQUFTLEVBQUFFLEVBQUEsSUFBQUEsR0FDQUEsR0FJQVgsRUFBQVksRUFBQSxTQUFBUSxFQUFBQyxHQUFzRCxNQUFBUixRQUFBUyxVQUFBQyxlQUFBbEIsS0FBQWUsRUFBQUMsSUFHdERyQixFQUFBd0IsRUFBQSxHQUdBeEIsSUFBQXlCLEVBQUEsS0RPTSxTQUFVNUIsRUFBUTZCLEVBQXFCMUIsR0FFN0MsWUUvRGUsU0FBUzJCLEdBQWdCQyxFQUFNQyxHQUMxQyxNQUFPaEIsUUFBT2lCLEtBQUtELEdBQU1FLE9BQU8sU0FBQ0MsRUFBWUMsR0FLekMsTUFKSUEsS0FBT0wsS0FDUEksRUFBV0MsR0FBT0wsRUFBS0ssSUFHcEJELE9GMERmbkIsT0FBT0MsZUFBZVksRUFBcUIsY0FBZ0JsQixPQUFPLElBQ2pDa0IsRUFBNkIsUUFBSUMiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9XG4vKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRpOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGw6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4vKioqKioqLyBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4vKioqKioqLyBcdFx0XHRcdGdldDogZ2V0dGVyXG4vKioqKioqLyBcdFx0XHR9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KF9fd2VicGFja19leHBvcnRzX18sIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGltbXV0YWJsZSkgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSBnZXRJbnRlcnNlY3Rpb247XG5mdW5jdGlvbiBnZXRJbnRlcnNlY3Rpb24ob2JqMSxvYmoyKXtyZXR1cm4gT2JqZWN0LmtleXMob2JqMikucmVkdWNlKGZ1bmN0aW9uKGNoaWxkUHJvcHMsa2V5KXtpZihrZXkgaW4gb2JqMSl7Y2hpbGRQcm9wc1trZXldPW9iajFba2V5XTt9cmV0dXJuIGNoaWxkUHJvcHM7fSx7fSk7fVxuXG4vKioqLyB9KVxuLyoqKioqKi8gXSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGluZGV4LmpzIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbiBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgOTBlNjdjNjk0YzNiZjgyZWRhZWQiLCIvKipcbiAqIFJldHVybnMgYW4gaW50ZXJzZWN0aW9uIG9mIHRoZSBmaXJzdCBhcmd1bWVudCBhZ2FpbnN0IHRoZSBzZWNvbmQgYXJndW1lbnQncyBrZXlzLlxuICogZS5nLiB1c2VkIGluIFR5cGVhaGVhZCB0byBpZGVudGlmeSB3aGljaCBwcm9wcyBhcmUgbWVhbnQgZm9yIElucHV0XG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSBvYmoxXG4gKiBAcGFyYW0gIHtPYmplY3R9IG9iajJcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9IGtleTogdmFsdWVzIGluIG9iajEgbWF0Y2hpbmcgdGhlIGtleXMgc3VwcGxpZWQgaW4gb2JqMlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEludGVyc2VjdGlvbihvYmoxLCBvYmoyKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iajIpLnJlZHVjZSgoY2hpbGRQcm9wcywga2V5KSA9PiB7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqMSkge1xuICAgICAgICAgICAgY2hpbGRQcm9wc1trZXldID0gb2JqMVtrZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNoaWxkUHJvcHM7XG5cbiAgICB9LCB7fSk7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9wYWNrYWdlcy9ib3VuZGxlc3MtdXRpbHMtb2JqZWN0LWludGVyc2VjdGlvbi9pbmRleC5qcyJdLCJzb3VyY2VSb290IjoiIn0= | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIDkwZTY3YzY5NGMzYmY4MmVkYWVkIiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vYmplY3QtaW50ZXJzZWN0aW9uL2luZGV4LmpzIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJtb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiaW5zdGFsbGVkTW9kdWxlcyIsImkiLCJsIiwiY2FsbCIsIm0iLCJjIiwidmFsdWUiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJnZXQiLCJuIiwiX19lc01vZHVsZSIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsIl9fd2VicGFja19leHBvcnRzX18iLCJnZXRJbnRlcnNlY3Rpb24iLCJvYmoxIiwib2JqMiIsImtleXMiLCJyZWR1Y2UiLCJjaGlsZFByb3BzIiwia2V5Il0sIm1hcHBpbmdzIjoiQUFBQUEsT0FBT0MsUUFDRSxTQUFVQyxHQ0duQixRQUFBQyxHQUFBQyxHQUdBLEdBQUFDLEVBQUFELEdBQ0EsTUFBQUMsR0FBQUQsR0FBQUgsT0FHQSxJQUFBRCxHQUFBSyxFQUFBRCxJQUNBRSxFQUFBRixFQUNBRyxHQUFBLEVBQ0FOLFdBVUEsT0FOQUMsR0FBQUUsR0FBQUksS0FBQVIsRUFBQUMsUUFBQUQsSUFBQUMsUUFBQUUsR0FHQUgsRUFBQU8sR0FBQSxFQUdBUCxFQUFBQyxRQXZCQSxHQUFBSSxLQStEQSxPQW5DQUYsR0FBQU0sRUFBQVAsRUFHQUMsRUFBQU8sRUFBQUwsRUFHQUYsRUFBQUcsRUFBQSxTQUFBSyxHQUEyQyxNQUFBQSxJQUczQ1IsRUFBQVMsRUFBQSxTQUFBWCxFQUFBWSxFQUFBQyxHQUNBWCxFQUFBWSxFQUFBZCxFQUFBWSxJQUNBRyxPQUFBQyxlQUFBaEIsRUFBQVksR0FDQUssY0FBQSxFQUNBQyxZQUFBLEVBQ0FDLElBQUFOLEtBTUFYLEVBQUFrQixFQUFBLFNBQUFyQixHQUNBLEdBQUFjLEdBQUFkLEtBQUFzQixXQUNBLFdBQTJCLE1BQUF0QixHQUFBLFNBQzNCLFdBQWlDLE1BQUFBLEdBRWpDLE9BREFHLEdBQUFTLEVBQUFFLEVBQUEsSUFBQUEsR0FDQUEsR0FJQVgsRUFBQVksRUFBQSxTQUFBUSxFQUFBQyxHQUFzRCxNQUFBUixRQUFBUyxVQUFBQyxlQUFBbEIsS0FBQWUsRUFBQUMsSUFHdERyQixFQUFBd0IsRUFBQSxHQUdBeEIsSUFBQXlCLEVBQUEsS0RPTSxTQUFVNUIsRUFBUTZCLEVBQXFCMUIsR0FFN0MsWUUzRGUsU0FBUzJCLEdBQWdCQyxFQUFNQyxHQUMxQyxNQUFPaEIsUUFBT2lCLEtBQUtELEdBQU1FLE9BQU8sU0FBQ0MsRUFBWUMsR0FLekMsTUFKSUEsS0FBT0wsS0FDUEksRUFBV0MsR0FBT0wsRUFBS0ssSUFHcEJELE9Gc0RmbkIsT0FBT0MsZUFBZVksRUFBcUIsY0FBZ0JsQixPQUFPLElBQ2pDa0IsRUFBNkIsUUFBSUMiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9XG4vKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRpOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGw6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4vKioqKioqLyBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4vKioqKioqLyBcdFx0XHRcdGdldDogZ2V0dGVyXG4vKioqKioqLyBcdFx0XHR9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KF9fd2VicGFja19leHBvcnRzX18sIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGltbXV0YWJsZSkgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSBnZXRJbnRlcnNlY3Rpb247XG5mdW5jdGlvbiBnZXRJbnRlcnNlY3Rpb24ob2JqMSxvYmoyKXtyZXR1cm4gT2JqZWN0LmtleXMob2JqMikucmVkdWNlKGZ1bmN0aW9uKGNoaWxkUHJvcHMsa2V5KXtpZihrZXkgaW4gb2JqMSl7Y2hpbGRQcm9wc1trZXldPW9iajFba2V5XTt9cmV0dXJuIGNoaWxkUHJvcHM7fSx7fSk7fVxuXG4vKioqLyB9KVxuLyoqKioqKi8gXSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGluZGV4LmpzIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbiBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgOTBlNjdjNjk0YzNiZjgyZWRhZWQiLCIvKipcbiAqIFJldHVybnMgYSBuZXcgb2JqZWN0IHRoYXQgaXMgYW4gaW50ZXJzZWN0aW9uIG9mIHRoZSBrZXlzIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBzZWNvbmQgb2JqZWN0IGFyZ3VtZW50cy5cbiAqXG4gKiAjIyBFeGFtcGxlIFVzYWdlXG4gKlxuICogYGBganNcbiAqIGltcG9ydCBpbnRlcnNlY3QgZnJvbSAnYm91bmRsZXNzLXV0aWxzLW9iamVjdC1pbnRlcnNlY3Rpb24nO1xuICpcbiAqIGNvbnN0IG9iajEgPSB7Zm9vOiAnYmFyJywgYmFyOiAnYmF6JywgYmF6OiAnZml6eid9O1xuICogY29uc3Qgb2JqMiA9IHtiYXI6ICd4J307XG4gKlxuICogaW50ZXJzZWN0KG9iajEsIG9iajIpOyAvLyByZXR1cm5zIGB7YmFyOiAnYmF6J31gXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0SW50ZXJzZWN0aW9uKG9iajEsIG9iajIpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqMikucmVkdWNlKChjaGlsZFByb3BzLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKGtleSBpbiBvYmoxKSB7XG4gICAgICAgICAgICBjaGlsZFByb3BzW2tleV0gPSBvYmoxW2tleV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2hpbGRQcm9wcztcblxuICAgIH0sIHt9KTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vYmplY3QtaW50ZXJzZWN0aW9uL2luZGV4LmpzIl0sInNvdXJjZVJvb3QiOiIifQ== |
/** | ||
* Returns an intersection of the first argument against the second argument's keys. | ||
* e.g. used in Typeahead to identify which props are meant for Input | ||
* Returns a new object that is an intersection of the keys between the first and second object arguments. | ||
* | ||
* @param {Object} obj1 | ||
* @param {Object} obj2 | ||
* ## Example Usage | ||
* | ||
* @return {Object} key: values in obj1 matching the keys supplied in obj2 | ||
* ```js | ||
* import intersect from 'boundless-utils-object-intersection'; | ||
* | ||
* const obj1 = {foo: 'bar', bar: 'baz', baz: 'fizz'}; | ||
* const obj2 = {bar: 'x'}; | ||
* | ||
* intersect(obj1, obj2); // returns `{bar: 'baz'}` | ||
* ``` | ||
*/ | ||
export default function getIntersection(obj1, obj2) { | ||
@@ -12,0 +16,0 @@ return Object.keys(obj2).reduce((childProps, key) => { |
{ | ||
"name": "boundless-utils-object-intersection", | ||
"version": "1.0.0-beta.5", | ||
"version": "1.0.0-beta.7", | ||
"description": "Returns an intersection of the first argument against the second argument's keys.", | ||
@@ -5,0 +5,0 @@ "main": "build/index.js", |
@@ -0,4 +1,20 @@ | ||
<!--- | ||
THIS IS AN AUTOGENERATED FILE. EDIT INDEX.JS INSTEAD. | ||
--> | ||
# objectIntersection | ||
Returns an intersection of the first argument against the second argument's keys. | ||
Returns a new object that is an intersection of the keys between the first and second object arguments. | ||
## Example Usage | ||
```js | ||
import intersect from 'boundless-utils-object-intersection'; | ||
const obj1 = {foo: 'bar', bar: 'baz', baz: 'fizz'}; | ||
const obj2 = {bar: 'x'}; | ||
intersect(obj1, obj2); // returns `{bar: 'baz'}` | ||
``` | ||
module.exports=function(e){function t(n){if(r[n])return r[n].exports;var u=r[n]={i:n,l:!1,exports:{}};return e[n].call(u.exports,u,u.exports,t),u.l=!0,u.exports}var r={};return t.m=e,t.c=r,t.i=function(e){return e},t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=0)}([function(e,t,r){"use strict";function n(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Object.keys(e).reduce(function(r,n){return t.indexOf(n)===-1&&(r[n]=e[n]),r},{})}Object.defineProperty(t,"__esModule",{value:!0}),t.default=n}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIDFhYWYxZDBhYzczMzE5ZWQzNmIwIiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMvaW5kZXguanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJ2YWx1ZSIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiX193ZWJwYWNrX2V4cG9ydHNfXyIsIm9taXRLZXlzRnJvbVNvdXJjZU9iamVjdCIsInNvdXJjZSIsIm9taXR0ZWRLZXlzIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwia2V5cyIsInJlZHVjZSIsImhhc2giLCJrZXkiLCJpbmRleE9mIl0sIm1hcHBpbmdzIjoiQUFBQUEsT0FBT0MsUUFDRSxTQUFVQyxHQ0duQixRQUFBQyxHQUFBQyxHQUdBLEdBQUFDLEVBQUFELEdBQ0EsTUFBQUMsR0FBQUQsR0FBQUgsT0FHQSxJQUFBRCxHQUFBSyxFQUFBRCxJQUNBRSxFQUFBRixFQUNBRyxHQUFBLEVBQ0FOLFdBVUEsT0FOQUMsR0FBQUUsR0FBQUksS0FBQVIsRUFBQUMsUUFBQUQsSUFBQUMsUUFBQUUsR0FHQUgsRUFBQU8sR0FBQSxFQUdBUCxFQUFBQyxRQXZCQSxHQUFBSSxLQStEQSxPQW5DQUYsR0FBQU0sRUFBQVAsRUFHQUMsRUFBQU8sRUFBQUwsRUFHQUYsRUFBQUcsRUFBQSxTQUFBSyxHQUEyQyxNQUFBQSxJQUczQ1IsRUFBQVMsRUFBQSxTQUFBWCxFQUFBWSxFQUFBQyxHQUNBWCxFQUFBWSxFQUFBZCxFQUFBWSxJQUNBRyxPQUFBQyxlQUFBaEIsRUFBQVksR0FDQUssY0FBQSxFQUNBQyxZQUFBLEVBQ0FDLElBQUFOLEtBTUFYLEVBQUFrQixFQUFBLFNBQUFyQixHQUNBLEdBQUFjLEdBQUFkLEtBQUFzQixXQUNBLFdBQTJCLE1BQUF0QixHQUFBLFNBQzNCLFdBQWlDLE1BQUFBLEdBRWpDLE9BREFHLEdBQUFTLEVBQUFFLEVBQUEsSUFBQUEsR0FDQUEsR0FJQVgsRUFBQVksRUFBQSxTQUFBUSxFQUFBQyxHQUFzRCxNQUFBUixRQUFBUyxVQUFBQyxlQUFBbEIsS0FBQWUsRUFBQUMsSUFHdERyQixFQUFBd0IsRUFBQSxHQUdBeEIsSUFBQXlCLEVBQUEsS0RPTSxTQUFVNUIsRUFBUTZCLEVBQXFCMUIsR0FFN0MsWUV0RWUsU0FBUzJCLEdBQXlCQyxHQUEwQixHQUFsQkMsR0FBa0JDLFVBQUFDLE9BQUEsR0FBQUMsU0FBQUYsVUFBQSxHQUFBQSxVQUFBLEtBQ3ZFLE9BQU9qQixRQUFPb0IsS0FBS0wsR0FBUU0sT0FBTyxTQUE4QkMsRUFBTUMsR0FLbEUsTUFKSVAsR0FBWVEsUUFBUUQsTUFBUyxJQUM3QkQsRUFBS0MsR0FBT1IsRUFBT1EsSUFHaEJELE9GaUVmdEIsT0FBT0MsZUFBZVksRUFBcUIsY0FBZ0JsQixPQUFPLElBQ2pDa0IsRUFBNkIsUUFBSUMiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9XG4vKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRpOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGw6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4vKioqKioqLyBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4vKioqKioqLyBcdFx0XHRcdGdldDogZ2V0dGVyXG4vKioqKioqLyBcdFx0XHR9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KF9fd2VicGFja19leHBvcnRzX18sIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGltbXV0YWJsZSkgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSBvbWl0S2V5c0Zyb21Tb3VyY2VPYmplY3Q7XG5mdW5jdGlvbiBvbWl0S2V5c0Zyb21Tb3VyY2VPYmplY3Qoc291cmNlKXt2YXIgb21pdHRlZEtleXM9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOltdO3JldHVybiBPYmplY3Qua2V5cyhzb3VyY2UpLnJlZHVjZShmdW5jdGlvbiByZWxvY2F0ZUFjY2VwdGVkS2V5cyhoYXNoLGtleSl7aWYob21pdHRlZEtleXMuaW5kZXhPZihrZXkpPT09LTEpe2hhc2hba2V5XT1zb3VyY2Vba2V5XTt9cmV0dXJuIGhhc2g7fSx7fSk7fVxuXG4vKioqLyB9KVxuLyoqKioqKi8gXSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGluZGV4LmpzIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbiBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgMWFhZjFkMGFjNzMzMTllZDM2YjAiLCIvKipcbiAqIFJldHVybnMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBzdXBwbGllZCBvYmplY3Qgd2l0aG91dCB0aGUgZ2l2ZW4ga2V5cy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb21pdEtleXNGcm9tU291cmNlT2JqZWN0KHNvdXJjZSwgb21pdHRlZEtleXMgPSBbXSkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhzb3VyY2UpLnJlZHVjZShmdW5jdGlvbiByZWxvY2F0ZUFjY2VwdGVkS2V5cyhoYXNoLCBrZXkpIHtcbiAgICAgICAgaWYgKG9taXR0ZWRLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpIHtcbiAgICAgICAgICAgIGhhc2hba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhc2g7XG4gICAgfSwge30pO1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvYm91bmRsZXNzLXV0aWxzLW9taXQta2V5cy9pbmRleC5qcyJdLCJzb3VyY2VSb290IjoiIn0= | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIDFhYWYxZDBhYzczMzE5ZWQzNmIwIiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMvaW5kZXguanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJ2YWx1ZSIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiX193ZWJwYWNrX2V4cG9ydHNfXyIsIm9taXRLZXlzRnJvbVNvdXJjZU9iamVjdCIsInNvdXJjZSIsIm9taXR0ZWRLZXlzIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwia2V5cyIsInJlZHVjZSIsImhhc2giLCJrZXkiLCJpbmRleE9mIl0sIm1hcHBpbmdzIjoiQUFBQUEsT0FBT0MsUUFDRSxTQUFVQyxHQ0duQixRQUFBQyxHQUFBQyxHQUdBLEdBQUFDLEVBQUFELEdBQ0EsTUFBQUMsR0FBQUQsR0FBQUgsT0FHQSxJQUFBRCxHQUFBSyxFQUFBRCxJQUNBRSxFQUFBRixFQUNBRyxHQUFBLEVBQ0FOLFdBVUEsT0FOQUMsR0FBQUUsR0FBQUksS0FBQVIsRUFBQUMsUUFBQUQsSUFBQUMsUUFBQUUsR0FHQUgsRUFBQU8sR0FBQSxFQUdBUCxFQUFBQyxRQXZCQSxHQUFBSSxLQStEQSxPQW5DQUYsR0FBQU0sRUFBQVAsRUFHQUMsRUFBQU8sRUFBQUwsRUFHQUYsRUFBQUcsRUFBQSxTQUFBSyxHQUEyQyxNQUFBQSxJQUczQ1IsRUFBQVMsRUFBQSxTQUFBWCxFQUFBWSxFQUFBQyxHQUNBWCxFQUFBWSxFQUFBZCxFQUFBWSxJQUNBRyxPQUFBQyxlQUFBaEIsRUFBQVksR0FDQUssY0FBQSxFQUNBQyxZQUFBLEVBQ0FDLElBQUFOLEtBTUFYLEVBQUFrQixFQUFBLFNBQUFyQixHQUNBLEdBQUFjLEdBQUFkLEtBQUFzQixXQUNBLFdBQTJCLE1BQUF0QixHQUFBLFNBQzNCLFdBQWlDLE1BQUFBLEdBRWpDLE9BREFHLEdBQUFTLEVBQUFFLEVBQUEsSUFBQUEsR0FDQUEsR0FJQVgsRUFBQVksRUFBQSxTQUFBUSxFQUFBQyxHQUFzRCxNQUFBUixRQUFBUyxVQUFBQyxlQUFBbEIsS0FBQWUsRUFBQUMsSUFHdERyQixFQUFBd0IsRUFBQSxHQUdBeEIsSUFBQXlCLEVBQUEsS0RPTSxTQUFVNUIsRUFBUTZCLEVBQXFCMUIsR0FFN0MsWUU1RGUsU0FBUzJCLEdBQXlCQyxHQUEwQixHQUFsQkMsR0FBa0JDLFVBQUFDLE9BQUEsR0FBQUMsU0FBQUYsVUFBQSxHQUFBQSxVQUFBLEtBQ3ZFLE9BQU9qQixRQUFPb0IsS0FBS0wsR0FBUU0sT0FBTyxTQUE4QkMsRUFBTUMsR0FLbEUsTUFKSVAsR0FBWVEsUUFBUUQsTUFBUyxJQUM3QkQsRUFBS0MsR0FBT1IsRUFBT1EsSUFHaEJELE9GdURmdEIsT0FBT0MsZUFBZVksRUFBcUIsY0FBZ0JsQixPQUFPLElBQ2pDa0IsRUFBNkIsUUFBSUMiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9XG4vKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRpOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGw6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4vKioqKioqLyBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4vKioqKioqLyBcdFx0XHRcdGdldDogZ2V0dGVyXG4vKioqKioqLyBcdFx0XHR9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KF9fd2VicGFja19leHBvcnRzX18sIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyogaGFybW9ueSBleHBvcnQgKGltbXV0YWJsZSkgKi8gX193ZWJwYWNrX2V4cG9ydHNfX1tcImRlZmF1bHRcIl0gPSBvbWl0S2V5c0Zyb21Tb3VyY2VPYmplY3Q7XG5mdW5jdGlvbiBvbWl0S2V5c0Zyb21Tb3VyY2VPYmplY3Qoc291cmNlKXt2YXIgb21pdHRlZEtleXM9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT11bmRlZmluZWQ/YXJndW1lbnRzWzFdOltdO3JldHVybiBPYmplY3Qua2V5cyhzb3VyY2UpLnJlZHVjZShmdW5jdGlvbiByZWxvY2F0ZUFjY2VwdGVkS2V5cyhoYXNoLGtleSl7aWYob21pdHRlZEtleXMuaW5kZXhPZihrZXkpPT09LTEpe2hhc2hba2V5XT1zb3VyY2Vba2V5XTt9cmV0dXJuIGhhc2g7fSx7fSk7fVxuXG4vKioqLyB9KVxuLyoqKioqKi8gXSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGluZGV4LmpzIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbiBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgMWFhZjFkMGFjNzMzMTllZDM2YjAiLCIvKipcbiAqIFJldHVybnMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBzdXBwbGllZCBvYmplY3Qgd2l0aG91dCB0aGUgZ2l2ZW4ga2V5cy5cbiAqXG4gKiAjIyBFeGFtcGxlIFVzYWdlXG4gKlxuICogYGBganNcbiAqIGltcG9ydCBvbWl0S2V5cyBmcm9tICdib3VuZGxlc3MtdXRpbHMtb21pdC1rZXlzJztcbiAqXG4gKiBjb25zdCBvYmogPSB7Zm9vOiAnYmFyJywgYmFyOiAnYmF6J307XG4gKlxuICogb21pdEtleXMob2JqLCBbJ2JhciddKTsgLy8gcmV0dXJucyBge2ZvbzogJ2Jhcid9YFxuICogYGBgXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG9taXRLZXlzRnJvbVNvdXJjZU9iamVjdChzb3VyY2UsIG9taXR0ZWRLZXlzID0gW10pIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc291cmNlKS5yZWR1Y2UoZnVuY3Rpb24gcmVsb2NhdGVBY2NlcHRlZEtleXMoaGFzaCwga2V5KSB7XG4gICAgICAgIGlmIChvbWl0dGVkS2V5cy5pbmRleE9mKGtleSkgPT09IC0xKSB7XG4gICAgICAgICAgICBoYXNoW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYXNoO1xuICAgIH0sIHt9KTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy1vbWl0LWtleXMvaW5kZXguanMiXSwic291cmNlUm9vdCI6IiJ9 |
/** | ||
* Returns a modified version of the supplied object without the given keys. | ||
* | ||
* ## Example Usage | ||
* | ||
* ```js | ||
* import omitKeys from 'boundless-utils-omit-keys'; | ||
* | ||
* const obj = {foo: 'bar', bar: 'baz'}; | ||
* | ||
* omitKeys(obj, ['bar']); // returns `{foo: 'bar'}` | ||
* ``` | ||
*/ | ||
@@ -4,0 +14,0 @@ export default function omitKeysFromSourceObject(source, omittedKeys = []) { |
{ | ||
"name": "boundless-utils-omit-keys", | ||
"version": "1.0.0-beta.5", | ||
"version": "1.0.0-beta.7", | ||
"description": "Returns a modified version of the supplied object without the given keys.", | ||
@@ -5,0 +5,0 @@ "main": "build/index.js", |
@@ -0,4 +1,19 @@ | ||
<!--- | ||
THIS IS AN AUTOGENERATED FILE. EDIT INDEX.JS INSTEAD. | ||
--> | ||
# omitKeys | ||
Returns a modified version of the supplied object without the given keys. | ||
## Example Usage | ||
```js | ||
import omitKeys from 'boundless-utils-omit-keys'; | ||
const obj = {foo: 'bar', bar: 'baz'}; | ||
omitKeys(obj, ['bar']); // returns `{foo: 'bar'}` | ||
``` | ||
module.exports=function(r){function e(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return r[n].call(o.exports,o,o.exports,e),o.l=!0,o.exports}var t={};return e.m=r,e.c=t,e.i=function(r){return r},e.d=function(r,t,n){e.o(r,t)||Object.defineProperty(r,t,{configurable:!1,enumerable:!0,get:n})},e.n=function(r){var t=r&&r.__esModule?function(){return r.default}:function(){return r};return e.d(t,"a",t),t},e.o=function(r,e){return Object.prototype.hasOwnProperty.call(r,e)},e.p="",e(e.s=0)}([function(r,e,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){for(var r=["transform","WebkitTransform","MozTransform","OTransform","msTransform","webkit-transform"],e=0,t=r.length;e<t;e++)if(r[e]in document.documentElement.style)return r[e];return!1}()}]); | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIGRiZTg2YjljZGJmNDMzZDU2ZWM2Iiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy10cmFuc2Zvcm0tcHJvcGVydHkvaW5kZXguanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJ2YWx1ZSIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiX193ZWJwYWNrX2V4cG9ydHNfXyIsInByb3BzIiwibGVuIiwibGVuZ3RoIiwiZG9jdW1lbnQiLCJkb2N1bWVudEVsZW1lbnQiLCJzdHlsZSJdLCJtYXBwaW5ncyI6IkFBQUFBLE9BQU9DLFFBQ0UsU0FBVUMsR0NHbkIsUUFBQUMsR0FBQUMsR0FHQSxHQUFBQyxFQUFBRCxHQUNBLE1BQUFDLEdBQUFELEdBQUFILE9BR0EsSUFBQUQsR0FBQUssRUFBQUQsSUFDQUUsRUFBQUYsRUFDQUcsR0FBQSxFQUNBTixXQVVBLE9BTkFDLEdBQUFFLEdBQUFJLEtBQUFSLEVBQUFDLFFBQUFELElBQUFDLFFBQUFFLEdBR0FILEVBQUFPLEdBQUEsRUFHQVAsRUFBQUMsUUF2QkEsR0FBQUksS0ErREEsT0FuQ0FGLEdBQUFNLEVBQUFQLEVBR0FDLEVBQUFPLEVBQUFMLEVBR0FGLEVBQUFHLEVBQUEsU0FBQUssR0FBMkMsTUFBQUEsSUFHM0NSLEVBQUFTLEVBQUEsU0FBQVgsRUFBQVksRUFBQUMsR0FDQVgsRUFBQVksRUFBQWQsRUFBQVksSUFDQUcsT0FBQUMsZUFBQWhCLEVBQUFZLEdBQ0FLLGNBQUEsRUFDQUMsWUFBQSxFQUNBQyxJQUFBTixLQU1BWCxFQUFBa0IsRUFBQSxTQUFBckIsR0FDQSxHQUFBYyxHQUFBZCxLQUFBc0IsV0FDQSxXQUEyQixNQUFBdEIsR0FBQSxTQUMzQixXQUFpQyxNQUFBQSxHQUVqQyxPQURBRyxHQUFBUyxFQUFBRSxFQUFBLElBQUFBLEdBQ0FBLEdBSUFYLEVBQUFZLEVBQUEsU0FBQVEsRUFBQUMsR0FBc0QsTUFBQVIsUUFBQVMsVUFBQUMsZUFBQWxCLEtBQUFlLEVBQUFDLElBR3REckIsRUFBQXdCLEVBQUEsR0FHQXhCLElBQUF5QixFQUFBLEtET00sU0FBVTVCLEVBQVE2QixFQUFxQjFCLEdBRTdDLFlBQ0FhLFFBQU9DLGVBQWVZLEVBQXFCLGNBQWdCbEIsT0FBTyxJRXRFbEVrQixFQUFBLFFBQWUsV0FVWCxJQUFLLEdBVENDLElBQ0YsWUFDQSxrQkFDQSxlQUNBLGFBQ0EsY0FDQSxvQkFHS3hCLEVBQUksRUFBR3lCLEVBQU1ELEVBQU1FLE9BQVExQixFQUFJeUIsRUFBS3pCLElBQ3pDLEdBQUl3QixFQUFNeEIsSUFBTTJCLFVBQVNDLGdCQUFnQkMsTUFDckMsTUFBT0wsR0FBTXhCLEVBSXJCLFFBQU8iLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9XG4vKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRpOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGw6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4vKioqKioqLyBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4vKioqKioqLyBcdFx0XHRcdGdldDogZ2V0dGVyXG4vKioqKioqLyBcdFx0XHR9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KF9fd2VicGFja19leHBvcnRzX18sIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IChmdW5jdGlvbiBkZXRlY3RUcmFuc2Zvcm1Qcm9wZXJ0eSgpe3ZhciBwcm9wcz1bJ3RyYW5zZm9ybScsJ1dlYmtpdFRyYW5zZm9ybScsJ01velRyYW5zZm9ybScsJ09UcmFuc2Zvcm0nLCdtc1RyYW5zZm9ybScsJ3dlYmtpdC10cmFuc2Zvcm0nXTtmb3IodmFyIGk9MCxsZW49cHJvcHMubGVuZ3RoO2k8bGVuO2krKyl7aWYocHJvcHNbaV1pbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUpe3JldHVybiBwcm9wc1tpXTt9fXJldHVybiBmYWxzZTt9KSgpO1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGluZGV4LmpzIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbiBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgZGJlODZiOWNkYmY0MzNkNTZlYzYiLCIvKipcbiAqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIHZlbmRvci1wcmVmaXhlZCBwcm9wZXJ0eSBmb3IgdXNlIGluIHByb2dyYW1tYXRpYyB0cmFuc2Zvcm0gc3R5bGUgbWFuaXB1bGF0aW9uLlxuICogQHJldHVybiB7U3RyaW5nfSB0aGUgcHJvcGVydHkga2V5IChlLmcuIGBXZWJraXRUcmFuc2Zvcm1gLCBgbXNUcmFuc2Zvcm1gKVxuICovXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gZGV0ZWN0VHJhbnNmb3JtUHJvcGVydHkoKSB7XG4gICAgY29uc3QgcHJvcHMgPSBbXG4gICAgICAgICd0cmFuc2Zvcm0nLFxuICAgICAgICAnV2Via2l0VHJhbnNmb3JtJyxcbiAgICAgICAgJ01velRyYW5zZm9ybScsXG4gICAgICAgICdPVHJhbnNmb3JtJyxcbiAgICAgICAgJ21zVHJhbnNmb3JtJyxcbiAgICAgICAgJ3dlYmtpdC10cmFuc2Zvcm0nLCAvLyB1c2VkIGluIEpTRE9NXG4gICAgXTtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBwcm9wcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAocHJvcHNbaV0gaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcHNbaV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59KSgpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcGFja2FnZXMvYm91bmRsZXNzLXV0aWxzLXRyYW5zZm9ybS1wcm9wZXJ0eS9pbmRleC5qcyJdLCJzb3VyY2VSb290IjoiIn0= | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vaW5kZXguanMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIGRiZTg2YjljZGJmNDMzZDU2ZWM2Iiwid2VicGFjazovLy8uL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy10cmFuc2Zvcm0tcHJvcGVydHkvaW5kZXguanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpbnN0YWxsZWRNb2R1bGVzIiwiaSIsImwiLCJjYWxsIiwibSIsImMiLCJ2YWx1ZSIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImdldCIsIm4iLCJfX2VzTW9kdWxlIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiX193ZWJwYWNrX2V4cG9ydHNfXyIsInByb3BzIiwibGVuIiwibGVuZ3RoIiwiZG9jdW1lbnQiLCJkb2N1bWVudEVsZW1lbnQiLCJzdHlsZSJdLCJtYXBwaW5ncyI6IkFBQUFBLE9BQU9DLFFBQ0UsU0FBVUMsR0NHbkIsUUFBQUMsR0FBQUMsR0FHQSxHQUFBQyxFQUFBRCxHQUNBLE1BQUFDLEdBQUFELEdBQUFILE9BR0EsSUFBQUQsR0FBQUssRUFBQUQsSUFDQUUsRUFBQUYsRUFDQUcsR0FBQSxFQUNBTixXQVVBLE9BTkFDLEdBQUFFLEdBQUFJLEtBQUFSLEVBQUFDLFFBQUFELElBQUFDLFFBQUFFLEdBR0FILEVBQUFPLEdBQUEsRUFHQVAsRUFBQUMsUUF2QkEsR0FBQUksS0ErREEsT0FuQ0FGLEdBQUFNLEVBQUFQLEVBR0FDLEVBQUFPLEVBQUFMLEVBR0FGLEVBQUFHLEVBQUEsU0FBQUssR0FBMkMsTUFBQUEsSUFHM0NSLEVBQUFTLEVBQUEsU0FBQVgsRUFBQVksRUFBQUMsR0FDQVgsRUFBQVksRUFBQWQsRUFBQVksSUFDQUcsT0FBQUMsZUFBQWhCLEVBQUFZLEdBQ0FLLGNBQUEsRUFDQUMsWUFBQSxFQUNBQyxJQUFBTixLQU1BWCxFQUFBa0IsRUFBQSxTQUFBckIsR0FDQSxHQUFBYyxHQUFBZCxLQUFBc0IsV0FDQSxXQUEyQixNQUFBdEIsR0FBQSxTQUMzQixXQUFpQyxNQUFBQSxHQUVqQyxPQURBRyxHQUFBUyxFQUFBRSxFQUFBLElBQUFBLEdBQ0FBLEdBSUFYLEVBQUFZLEVBQUEsU0FBQVEsRUFBQUMsR0FBc0QsTUFBQVIsUUFBQVMsVUFBQUMsZUFBQWxCLEtBQUFlLEVBQUFDLElBR3REckIsRUFBQXdCLEVBQUEsR0FHQXhCLElBQUF5QixFQUFBLEtET00sU0FBVTVCLEVBQVE2QixFQUFxQjFCLEdBRTdDLFlBQ0FhLFFBQU9DLGVBQWVZLEVBQXFCLGNBQWdCbEIsT0FBTyxJRS9EbEVrQixFQUFBLFFBQWUsV0FVWCxJQUFLLEdBVENDLElBQ0YsWUFDQSxrQkFDQSxlQUNBLGFBQ0EsY0FDQSxvQkFHS3hCLEVBQUksRUFBR3lCLEVBQU1ELEVBQU1FLE9BQVExQixFQUFJeUIsRUFBS3pCLElBQ3pDLEdBQUl3QixFQUFNeEIsSUFBTTJCLFVBQVNDLGdCQUFnQkMsTUFDckMsTUFBT0wsR0FBTXhCLEVBSXJCLFFBQU8iLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9XG4vKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRpOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGw6IGZhbHNlLFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4vKioqKioqLyBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4vKioqKioqLyBcdFx0XHRcdGdldDogZ2V0dGVyXG4vKioqKioqLyBcdFx0XHR9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBfX3dlYnBhY2tfZXhwb3J0c19fLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KF9fd2VicGFja19leHBvcnRzX18sIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyogaGFybW9ueSBkZWZhdWx0IGV4cG9ydCAqLyBfX3dlYnBhY2tfZXhwb3J0c19fW1wiZGVmYXVsdFwiXSA9IChmdW5jdGlvbiBkZXRlY3RUcmFuc2Zvcm1Qcm9wZXJ0eSgpe3ZhciBwcm9wcz1bJ3RyYW5zZm9ybScsJ1dlYmtpdFRyYW5zZm9ybScsJ01velRyYW5zZm9ybScsJ09UcmFuc2Zvcm0nLCdtc1RyYW5zZm9ybScsJ3dlYmtpdC10cmFuc2Zvcm0nXTtmb3IodmFyIGk9MCxsZW49cHJvcHMubGVuZ3RoO2k8bGVuO2krKyl7aWYocHJvcHNbaV1pbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUpe3JldHVybiBwcm9wc1tpXTt9fXJldHVybiBmYWxzZTt9KSgpO1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSk7XG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGluZGV4LmpzIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbiBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgZGJlODZiOWNkYmY0MzNkNTZlYzYiLCIvKipcbiAqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIHZlbmRvci1wcmVmaXhlZCBwcm9wZXJ0eSBmb3IgdXNlIGluIHByb2dyYW1tYXRpYyB0cmFuc2Zvcm0gc3R5bGUgbWFuaXB1bGF0aW9uLlxuICpcbiAqICMjIEV4YW1wbGUgVXNhZ2VcbiAqXG4gKiBgYGBqc1xuICogaW1wb3J0IHRyYW5zZm9ybVByb3BlcnR5IGZyb20gJ2JvdW5kbGVzcy11dGlscy10cmFuc2Zvcm0tcHJvcGVydHknO1xuICpcbiAqIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5mb28nKS5zdHlsZVt0cmFuc2Zvcm1Qcm9wZXJ0eV0gPSAndHJhbnNsYXRlWSgwKSc7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIGRldGVjdFRyYW5zZm9ybVByb3BlcnR5KCkge1xuICAgIGNvbnN0IHByb3BzID0gW1xuICAgICAgICAndHJhbnNmb3JtJyxcbiAgICAgICAgJ1dlYmtpdFRyYW5zZm9ybScsXG4gICAgICAgICdNb3pUcmFuc2Zvcm0nLFxuICAgICAgICAnT1RyYW5zZm9ybScsXG4gICAgICAgICdtc1RyYW5zZm9ybScsXG4gICAgICAgICd3ZWJraXQtdHJhbnNmb3JtJywgLy8gdXNlZCBpbiBKU0RPTVxuICAgIF07XG5cbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gcHJvcHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgaWYgKHByb3BzW2ldIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHByb3BzW2ldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufSkoKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3BhY2thZ2VzL2JvdW5kbGVzcy11dGlscy10cmFuc2Zvcm0tcHJvcGVydHkvaW5kZXguanMiXSwic291cmNlUm9vdCI6IiJ9 |
/** | ||
* Returns the appropriate vendor-prefixed property for use in programmatic transform style manipulation. | ||
* @return {String} the property key (e.g. `WebkitTransform`, `msTransform`) | ||
* | ||
* ## Example Usage | ||
* | ||
* ```js | ||
* import transformProperty from 'boundless-utils-transform-property'; | ||
* | ||
* document.querySelector('.foo').style[transformProperty] = 'translateY(0)'; | ||
* ``` | ||
*/ | ||
@@ -5,0 +12,0 @@ export default (function detectTransformProperty() { |
{ | ||
"name": "boundless-utils-transform-property", | ||
"version": "1.0.0-beta.5", | ||
"version": "1.0.0-beta.7", | ||
"description": "Returns the appropriate vendor-prefixed property for use in programmatic transform style manipulation.", | ||
@@ -5,0 +5,0 @@ "main": "build/index.js", |
@@ -0,4 +1,17 @@ | ||
<!--- | ||
THIS IS AN AUTOGENERATED FILE. EDIT INDEX.JS INSTEAD. | ||
--> | ||
# transformProperty | ||
Returns the appropriate vendor-prefixed property for use in programmatic transform style manipulation. | ||
## Example Usage | ||
```js | ||
import transformProperty from 'boundless-utils-transform-property'; | ||
document.querySelector('.foo').style[transformProperty] = 'translateY(0)'; | ||
``` | ||
/** | ||
* Generates a unique ID. Adds a prefix so it is suitable for use as an HTML ID. | ||
* Based on {@link https://gist.github.com/jed/982883 this implementation}. | ||
* Generates a unique ID, based on [this algorithm](https://gist.github.com/jed/982883). Adds a prefix (`b-`) so it is | ||
* suitable for use as an HTML ID. | ||
* | ||
* @return {string} a unique identifier | ||
* ## Example Usage | ||
* | ||
* @example | ||
* ```js | ||
* import uuid from 'boundless-utils-uuid'; | ||
* | ||
* uuid(); // b-1f2cd27f-0754-4344-9d20-436a201b2f80 | ||
* ``` | ||
*/ | ||
@@ -10,0 +13,0 @@ export default function uuid() { |
{ | ||
"name": "boundless-utils-uuid", | ||
"private": true, | ||
"version": "1.0.0-beta.5", | ||
"version": "1.0.0-beta.7", | ||
"description": "Generates a unique ID. Adds a prefix so it is suitable for use as an HTML ID.", | ||
@@ -6,0 +5,0 @@ "main": "build/index.js", |
export const errors = { | ||
DISABLED: 'UIUtils/notify: web notifications are currently disabled by user settings.', | ||
NOT_AVAILABLE: 'UIUtils/notify: web notifications are not supported on this platform.', | ||
CONFIG_TYPE: 'UIUtils/notify: passed a non-object as configuration.', | ||
CONFIG_MISSING: 'UIUtils/notify: no configuration was passed.', | ||
BODY_TYPE: 'UIUtils/notify: `body` must be a string.', | ||
BODY_MISSING: 'UIUtils/notify: `body` was omitted from the configuration object.', | ||
HEADER_TYPE: 'UIUtils/notify: `header` must be a string.', | ||
HEADER_MISSING: 'UIUtils/notify: `header` was omitted from the configuration object.', | ||
ICON_TYPE: 'UIUtils/notify: `icon` must be a URL string.', | ||
ONCLICK_TYPE: 'UIUtils/notify: `onClick` must be a function.', | ||
DISABLED: 'webNotification: web notifications are currently disabled by user settings.', | ||
NOT_AVAILABLE: 'webNotification: web notifications are not supported on this platform.', | ||
CONFIG_TYPE: 'webNotification: passed a non-object as configuration.', | ||
CONFIG_MISSING: 'webNotification: no configuration was passed.', | ||
BODY_TYPE: 'webNotification: `body` must be a string.', | ||
BODY_MISSING: 'webNotification: `body` was omitted from the configuration object.', | ||
HEADER_TYPE: 'webNotification: `header` must be a string.', | ||
HEADER_MISSING: 'webNotification: `header` was omitted from the configuration object.', | ||
ICON_TYPE: 'webNotification: `icon` must be a URL string.', | ||
ONCLICK_TYPE: 'webNotification: `onClick` must be a function.', | ||
}; | ||
@@ -20,6 +20,2 @@ | ||
return window.Notification; | ||
} else if (window.webkitNotifications) { | ||
return window.webkitNotifications; | ||
} else if (navigator.mozNotification) { | ||
return navigator.mozNotification; | ||
} | ||
@@ -33,3 +29,3 @@ | ||
NotificationAPI.requestPermission(function requestReceiver(status) { | ||
if (status === 'granted' || status === 0) { | ||
if (status === 'granted') { | ||
resolve(); | ||
@@ -60,14 +56,2 @@ } | ||
} else if ('checkPermission' in NotificationAPI) { | ||
switch (NotificationAPI.checkPermission()) { | ||
case 0: | ||
return resolve(); | ||
case 1: | ||
requestPermission().then(resolve, reject); | ||
break; | ||
default: | ||
return reject(errors.DISABLED); | ||
} | ||
} | ||
@@ -78,5 +62,34 @@ }); | ||
/** | ||
* Trigger native toasts in supporting browsers. | ||
* __Trigger native toasts in supporting browsers.__ | ||
* | ||
* > Support for web notifications is [available in all major desktop browsers](http://caniuse.com/#feat=notifications), | ||
* except IE (February 2017). | ||
* | ||
* This module is not a React component, but a utility. The "close" functionality of web notifications was removed in a platform | ||
* spec update, so it's no longer possible to have a true lifecycle. | ||
* | ||
* ```js | ||
* import webNotification from 'boundless-utils-web-notification'; | ||
* | ||
* webNotification({body: 'Some text to be displayed...'}); | ||
* ``` | ||
* | ||
* The utility works by providing an object with the following properties: | ||
* | ||
* - __body__ `String` | ||
* up to two lines are displayed in the notification (based on the current browser implementations) | ||
* | ||
* - __header__ `String` | ||
* the bolded title displayed at the top of the notification | ||
* | ||
* - __icon__ `HTMLString` | ||
* (optional) the URL of a picture or icon to be displayed with the notification (looks best if square) | ||
* | ||
* - __onClick__ `Function` | ||
* (optional) add arbitrary functionality when the notification is clicked | ||
* | ||
* This will return a `Promise`. Resolution means the notification was created correctly (returns the `Notification`, | ||
* and rejection will return a relevant error description string. | ||
*/ | ||
export default function notify(config) { | ||
export default function webNotification(config) { | ||
return new Promise((resolve, reject) => { | ||
@@ -83,0 +96,0 @@ if (config === undefined) { |
{ | ||
"name": "boundless-utils-web-notification", | ||
"version": "1.0.0-beta.5", | ||
"version": "1.0.0-beta.7", | ||
"description": "Trigger native toasts in supporting browsers.", | ||
"private": true, | ||
"repository": { | ||
@@ -7,0 +6,0 @@ "type": "git", |
@@ -1,10 +0,22 @@ | ||
# Boundless Web Notification | ||
<!--- | ||
THIS IS AN AUTOGENERATED FILE. EDIT INDEX.JS INSTEAD. | ||
--> | ||
# webNotification | ||
__Trigger native toasts in supporting browsers.__ | ||
> Support for web notifications is [available in all major browsers](http://caniuse.com/#feat=notifications), except IE 11 and lower (November 2016). | ||
> Support for web notifications is [available in all major desktop browsers](http://caniuse.com/#feat=notifications), | ||
except IE (February 2017). | ||
This module is not a React component, but a utility. The "close" functionality of web notifications was removed in a platform spec update, so it's no longer possible to have a true lifecycle | ||
This module is not a React component, but a utility. The "close" functionality of web notifications was removed in a platform | ||
spec update, so it's no longer possible to have a true lifecycle. | ||
`UIUtils.notify(object)` works by providing an object with the following properties: | ||
```js | ||
import webNotification from 'boundless-utils-web-notification'; | ||
webNotification({body: 'Some text to be displayed...'}); | ||
``` | ||
The utility works by providing an object with the following properties: | ||
- __body__ `String` | ||
@@ -22,2 +34,45 @@ up to two lines are displayed in the notification (based on the current browser implementations) | ||
This will return a `Promise`. Resolution means the notification was created correctly (returns the `Notification`, and rejection will return a relevant error description string. | ||
This will return a `Promise`. Resolution means the notification was created correctly (returns the `Notification`, | ||
and rejection will return a relevant error description string. | ||
## Example Usage | ||
```jsx | ||
import React from 'react'; | ||
import notify from '../index'; | ||
import Button from '../../boundless-button/index'; | ||
export default class NotifyDemo extends React.PureComponent { | ||
state = { | ||
n: 0, | ||
} | ||
spawnNotification = () => { | ||
notify(this.template(this.state.n + 1)).catch((error) => console.warn(error)); | ||
this.setState({n: this.state.n + 1}); | ||
} | ||
template(index) { | ||
return { | ||
header: `Notification #${index}`, | ||
body: 'I can support up to two lines of text.', | ||
icon: 'http://icons.iconarchive.com/icons/icons8/ios7/128/Astrology-Winter-icon.png', | ||
onClick: () => window.open('http://www.epa.gov/'), | ||
}; | ||
} | ||
render() { | ||
return ( | ||
<div> | ||
<Button ref='trigger' onClick={this.spawnNotification}> | ||
Spawn Notification | ||
</Button> | ||
</div> | ||
); | ||
} | ||
} | ||
``` | ||
# Boundless | ||
[](https://travis-ci.com/enigma-io/boundless) [](https://codecov.io/gh/enigma-io/boundless) | ||
[](https://www.npmjs.com/package/boundless) [](https://travis-ci.com/enigma-io/boundless) [](https://codecov.io/gh/enigma-io/boundless) | ||
@@ -9,5 +9,19 @@ | ||
```bash | ||
npm i boundless@beta | ||
# the whole library | ||
npm i boundless --save | ||
# or just a part of it | ||
npm i boundless-button --save | ||
``` | ||
## Philosophy | ||
Boundless is a UI toolkit that was conceived to abstract away difficult interface patterns. It follows three main guidelines: | ||
1. Performance is mandatory, not a nice-to-have. | ||
2. Components should be as customizable as possible. | ||
3. Components should be as accessible as possible (falling back to WAI-ARIA attributes when necessary.) | ||
The general idea of this library is to provide ready-to-go solutions for things you really wouldn't want to build yourself, not because they're hard... but because they're hard to design _right_. We are always open to suggestions and strive to keep Boundless as concise and useful as possible. | ||
## Reference styles | ||
@@ -25,8 +39,13 @@ | ||
In your own project's `.styl` file, define any variable overrides (see [style.styl](https://github.com/enigma-io/boundless/blob/master/style.styl) for what variables can be overridden), then import Boundless's master styl file: | ||
In your own project's `.styl` file, define any variable overrides (see [variables.styl](https://github.com/enigma-io/boundless/blob/master/variables.styl) for what variables can be overridden), then import Boundless's master styl file: | ||
```stylus | ||
// first, pull in the variables | ||
@require "node_modules/boundless/variables"; | ||
// do overrides as desired... | ||
color-accent = red; | ||
@import "node_modules/boundless/style"; | ||
// then pull in the rest of the styles | ||
@require "node_modules/boundless/style"; | ||
``` | ||
@@ -33,0 +52,0 @@ |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
4226738
104.28%242
93.6%8502
55.2%64
42.22%38
5.56%1
Infinity%