@untemps/react-vocal 2.0.0-beta.5 → 2.0.0-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/README.md +4 -1
- package/dist/index.es.js +99 -78
- package/dist/index.js +2 -2
- package/dist/index.umd.js +2 -2
- package/package.json +7 -1
- package/.github/workflows/publish.yml +0 -32
- package/.husky/commit-msg +0 -1
- package/.husky/pre-commit +0 -1
- package/.prettierignore +0 -3
- package/.prettierrc +0 -29
- package/CLAUDE.md +0 -59
- package/assets/icon-idle.png +0 -0
- package/assets/icon-listening.png +0 -0
- package/assets/microphone.png +0 -0
- package/assets/react-vocal.png +0 -0
- package/commitlint.config.js +0 -7
- package/dev/index.html +0 -24
- package/dev/package.json +0 -18
- package/dev/public/index.html +0 -24
- package/dev/src/index.jsx +0 -58
- package/dev/vite.config.js +0 -10
- package/dev/yarn.lock +0 -325
- package/dist/index.es.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/index.umd.js.map +0 -1
- package/src/components/Icon.jsx +0 -24
- package/src/components/Vocal.jsx +0 -233
- package/src/components/__tests__/Icon.test.jsx +0 -38
- package/src/components/__tests__/Vocal.test.jsx +0 -611
- package/src/components/__tests__/VocalWithMockedUseVocal.test.jsx +0 -38
- package/src/components/__tests__/__snapshots__/Icon.test.jsx.snap +0 -21
- package/src/components/__tests__/__snapshots__/Vocal.test.jsx.snap +0 -28
- package/src/hooks/__tests__/useCommands.test.js +0 -115
- package/src/hooks/__tests__/useTimeout.test.js +0 -69
- package/src/hooks/__tests__/useVocal.test.js +0 -202
- package/src/hooks/useCommands.js +0 -75
- package/src/hooks/useTimeout.js +0 -21
- package/src/hooks/useVocal.js +0 -56
- package/src/index.js +0 -7
- package/vite.config.js +0 -36
- package/vitest.setup.js +0 -77
package/dist/index.umd.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.js","names":["e"],"sources":["../node_modules/@untemps/vocal/dist/index.es.js","../node_modules/@untemps/utils/dist/function/isFunction.js","../src/hooks/useVocal.js","../src/hooks/useTimeout.js","../src/hooks/useCommands.js","../node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/react/jsx-runtime.js","../src/components/Icon.jsx","../src/components/Vocal.jsx","../src/index.js"],"sourcesContent":["var t=function(t,e,r){return t(r={path:e,exports:{},require:function(t,e){return function(){throw new Error(\"Dynamic requires are not currently supported by @rollup/plugin-commonjs\")}(null==e&&r.path)}},r.exports),r.exports}((function(t){var e=function(t){var e=Object.prototype,r=e.hasOwnProperty,n=\"function\"==typeof Symbol?Symbol:{},o=n.iterator||\"@@iterator\",i=n.asyncIterator||\"@@asyncIterator\",a=n.toStringTag||\"@@toStringTag\";function c(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{c({},\"\")}catch(t){c=function(t,e,r){return t[e]=r}}function u(t,e,r,n){var o=e&&e.prototype instanceof f?e:f,i=Object.create(o.prototype),a=new _(n||[]);return i._invoke=function(t,e,r){var n=\"suspendedStart\";return function(o,i){if(\"executing\"===n)throw new Error(\"Generator is already running\");if(\"completed\"===n){if(\"throw\"===o)throw i;return S()}for(r.method=o,r.arg=i;;){var a=r.delegate;if(a){var c=b(a,r);if(c){if(c===l)continue;return c}}if(\"next\"===r.method)r.sent=r._sent=r.arg;else if(\"throw\"===r.method){if(\"suspendedStart\"===n)throw n=\"completed\",r.arg;r.dispatchException(r.arg)}else\"return\"===r.method&&r.abrupt(\"return\",r.arg);n=\"executing\";var u=s(t,e,r);if(\"normal\"===u.type){if(n=r.done?\"completed\":\"suspendedYield\",u.arg===l)continue;return{value:u.arg,done:r.done}}\"throw\"===u.type&&(n=\"completed\",r.method=\"throw\",r.arg=u.arg)}}}(t,r,a),i}function s(t,e,r){try{return{type:\"normal\",arg:t.call(e,r)}}catch(t){return{type:\"throw\",arg:t}}}t.wrap=u;var l={};function f(){}function h(){}function p(){}var v={};v[o]=function(){return this};var y=Object.getPrototypeOf,d=y&&y(y(x([])));d&&d!==e&&r.call(d,o)&&(v=d);var m=p.prototype=f.prototype=Object.create(v);function g(t){[\"next\",\"throw\",\"return\"].forEach((function(e){c(t,e,(function(t){return this._invoke(e,t)}))}))}function w(t,e){var n;this._invoke=function(o,i){function a(){return new e((function(n,a){!function n(o,i,a,c){var u=s(t[o],t,i);if(\"throw\"!==u.type){var l=u.arg,f=l.value;return f&&\"object\"==typeof f&&r.call(f,\"__await\")?e.resolve(f.__await).then((function(t){n(\"next\",t,a,c)}),(function(t){n(\"throw\",t,a,c)})):e.resolve(f).then((function(t){l.value=t,a(l)}),(function(t){return n(\"throw\",t,a,c)}))}c(u.arg)}(o,i,n,a)}))}return n=n?n.then(a,a):a()}}function b(t,e){var r=t.iterator[e.method];if(void 0===r){if(e.delegate=null,\"throw\"===e.method){if(t.iterator.return&&(e.method=\"return\",e.arg=void 0,b(t,e),\"throw\"===e.method))return l;e.method=\"throw\",e.arg=new TypeError(\"The iterator does not provide a 'throw' method\")}return l}var n=s(r,t.iterator,e.arg);if(\"throw\"===n.type)return e.method=\"throw\",e.arg=n.arg,e.delegate=null,l;var o=n.arg;return o?o.done?(e[t.resultName]=o.value,e.next=t.nextLoc,\"return\"!==e.method&&(e.method=\"next\",e.arg=void 0),e.delegate=null,l):o:(e.method=\"throw\",e.arg=new TypeError(\"iterator result is not an object\"),e.delegate=null,l)}function E(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function O(t){var e=t.completion||{};e.type=\"normal\",delete e.arg,t.completion=e}function _(t){this.tryEntries=[{tryLoc:\"root\"}],t.forEach(E,this),this.reset(!0)}function x(t){if(t){var e=t[o];if(e)return e.call(t);if(\"function\"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,i=function e(){for(;++n<t.length;)if(r.call(t,n))return e.value=t[n],e.done=!1,e;return e.value=void 0,e.done=!0,e};return i.next=i}}return{next:S}}function S(){return{value:void 0,done:!0}}return h.prototype=m.constructor=p,p.constructor=h,h.displayName=c(p,a,\"GeneratorFunction\"),t.isGeneratorFunction=function(t){var e=\"function\"==typeof t&&t.constructor;return!!e&&(e===h||\"GeneratorFunction\"===(e.displayName||e.name))},t.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,p):(t.__proto__=p,c(t,a,\"GeneratorFunction\")),t.prototype=Object.create(m),t},t.awrap=function(t){return{__await:t}},g(w.prototype),w.prototype[i]=function(){return this},t.AsyncIterator=w,t.async=function(e,r,n,o,i){void 0===i&&(i=Promise);var a=new w(u(e,r,n,o),i);return t.isGeneratorFunction(r)?a:a.next().then((function(t){return t.done?t.value:a.next()}))},g(m),c(m,a,\"Generator\"),m[o]=function(){return this},m.toString=function(){return\"[object Generator]\"},t.keys=function(t){var e=[];for(var r in t)e.push(r);return e.reverse(),function r(){for(;e.length;){var n=e.pop();if(n in t)return r.value=n,r.done=!1,r}return r.done=!0,r}},t.values=x,_.prototype={constructor:_,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method=\"next\",this.arg=void 0,this.tryEntries.forEach(O),!t)for(var e in this)\"t\"===e.charAt(0)&&r.call(this,e)&&!isNaN(+e.slice(1))&&(this[e]=void 0)},stop:function(){this.done=!0;var t=this.tryEntries[0].completion;if(\"throw\"===t.type)throw t.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var e=this;function n(r,n){return a.type=\"throw\",a.arg=t,e.next=r,n&&(e.method=\"next\",e.arg=void 0),!!n}for(var o=this.tryEntries.length-1;o>=0;--o){var i=this.tryEntries[o],a=i.completion;if(\"root\"===i.tryLoc)return n(\"end\");if(i.tryLoc<=this.prev){var c=r.call(i,\"catchLoc\"),u=r.call(i,\"finallyLoc\");if(c&&u){if(this.prev<i.catchLoc)return n(i.catchLoc,!0);if(this.prev<i.finallyLoc)return n(i.finallyLoc)}else if(c){if(this.prev<i.catchLoc)return n(i.catchLoc,!0)}else{if(!u)throw new Error(\"try statement without catch or finally\");if(this.prev<i.finallyLoc)return n(i.finallyLoc)}}}},abrupt:function(t,e){for(var n=this.tryEntries.length-1;n>=0;--n){var o=this.tryEntries[n];if(o.tryLoc<=this.prev&&r.call(o,\"finallyLoc\")&&this.prev<o.finallyLoc){var i=o;break}}i&&(\"break\"===t||\"continue\"===t)&&i.tryLoc<=e&&e<=i.finallyLoc&&(i=null);var a=i?i.completion:{};return a.type=t,a.arg=e,i?(this.method=\"next\",this.next=i.finallyLoc,l):this.complete(a)},complete:function(t,e){if(\"throw\"===t.type)throw t.arg;return\"break\"===t.type||\"continue\"===t.type?this.next=t.arg:\"return\"===t.type?(this.rval=this.arg=t.arg,this.method=\"return\",this.next=\"end\"):\"normal\"===t.type&&e&&(this.next=e),l},finish:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),O(r),l}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if(\"throw\"===n.type){var o=n.arg;O(r)}return o}}throw new Error(\"illegal catch attempt\")},delegateYield:function(t,e,r){return this.delegate={iterator:x(t),resultName:e,nextLoc:r},\"next\"===this.method&&(this.arg=void 0),l}},t}(t.exports);try{regeneratorRuntime=e}catch(t){Function(\"r\",\"regeneratorRuntime = r\")(e)}}));function e(t,e,r,n,o,i,a){try{var c=t[i](a),u=c.value}catch(t){return void r(t)}c.done?e(u):Promise.resolve(u).then(n,o)}var r=function(t){return function(){var r=this,n=arguments;return new Promise((function(o,i){var a=t.apply(r,n);function c(t){e(a,o,i,c,u,\"next\",t)}function u(t){e(a,o,i,c,u,\"throw\",t)}c(void 0)}))}};var n=function(t){if(Array.isArray(t))return t};var o=function(t,e){if(\"undefined\"!=typeof Symbol&&Symbol.iterator in Object(t)){var r=[],n=!0,o=!1,i=void 0;try{for(var a,c=t[Symbol.iterator]();!(n=(a=c.next()).done)&&(r.push(a.value),!e||r.length!==e);n=!0);}catch(t){o=!0,i=t}finally{try{n||null==c.return||c.return()}finally{if(o)throw i}}return r}};var i=function(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r<e;r++)n[r]=t[r];return n};var a=function(t,e){if(t){if(\"string\"==typeof t)return i(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);return\"Object\"===r&&t.constructor&&(r=t.constructor.name),\"Map\"===r||\"Set\"===r?Array.from(t):\"Arguments\"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?i(t,e):void 0}};var c=function(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")};var u=function(t,e){return n(t)||o(t,e)||a(t,e)||c()};var s=function(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")};function l(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)}}var f=function(t,e,r){return e&&l(t.prototype,e),r&&l(t,r),t};var h=function(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t},p=function(){return!!navigator.permissions},v=function(){return!!navigator.mediaDevices};function y(t,e,r,n,o,i,a){try{var c=t[i](a),u=c.value}catch(t){return void r(t)}c.done?e(u):Promise.resolve(u).then(n,o)}function d(t){return function(){var e=this,r=arguments;return new Promise((function(n,o){var i=t.apply(e,r);function a(t){y(i,n,o,a,c,\"next\",t)}function c(t){y(i,n,o,a,c,\"throw\",t)}a(void 0)}))}}function m(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){if(\"undefined\"!=typeof Symbol&&Symbol.iterator in Object(t)){var r=[],n=!0,o=!1,i=void 0;try{for(var a,c=t[Symbol.iterator]();!(n=(a=c.next()).done)&&(r.push(a.value),!e||r.length!==e);n=!0);}catch(t){o=!0,i=t}finally{try{n||null==c.return||c.return()}finally{if(o)throw i}}return r}}(t,e)||function(t,e){if(t){if(\"string\"==typeof t)return g(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);return\"Object\"===r&&t.constructor&&(r=t.constructor.name),\"Map\"===r||\"Set\"===r?Array.from(t):\"Arguments\"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?g(t,e):void 0}}(t,e)||function(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}()}function g(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r<e;r++)n[r]=t[r];return n}var w=function(){var t=d(regeneratorRuntime.mark((function t(e){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt(\"return\",new Promise(function(){var t=d(regeneratorRuntime.mark((function t(r,n){var o,i;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return p()||n(new DOMException(\"Navigator API: permissions not supported\",\"NOT_SUPPORTED_ERR\")),t.prev=1,t.next=4,navigator.permissions.query({name:e});case 4:o=t.sent,i=function t(e){o.removeEventListener(\"change\",t),b(e.target.state,r,n)},o.addEventListener(\"change\",i),b(o.state,r,n),t.next=13;break;case 10:t.prev=10,t.t0=t.catch(1),n(t.t0);case 13:case\"end\":return t.stop()}}),t,null,[[1,10]])})));return function(e,r){return t.apply(this,arguments)}}()));case 1:case\"end\":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}(),b=function(t,e,r){switch(t){case\"denied\":r(new DOMException(\"Permission denied\",\"NOT_ALLOWED_ERR\"));break;default:e(t)}},E=function(){var t=d(regeneratorRuntime.mark((function t(e,r){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt(\"return\",new Promise(function(){var t=d(regeneratorRuntime.mark((function t(n,o){var i,a,c;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return p()&&v()||o(new DOMException(\"Navigator API: permissions or Navigator API: mediaDevices not supported\",\"NOT_SUPPORTED_ERR\")),t.prev=1,t.t0=Promise,t.next=5,w(e);case 5:return t.t1=t.sent,t.next=8,navigator.mediaDevices.getUserMedia(r);case 8:return t.t2=t.sent,t.t3=[t.t1,t.t2],t.next=12,t.t0.all.call(t.t0,t.t3);case 12:i=t.sent,a=m(i,2),c=a[1],n(c),t.next=21;break;case 18:t.prev=18,t.t4=t.catch(1),o(t.t4);case 21:case\"end\":return t.stop()}}),t,null,[[1,18]])})));return function(e,r){return t.apply(this,arguments)}}()));case 1:case\"end\":return t.stop()}}),t)})));return function(e,r){return t.apply(this,arguments)}}();function O(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function _(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?O(Object(r),!0).forEach((function(e){h(t,e,r[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):O(Object(r)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}))}return t}var x=function(){function e(t){var r=this;s(this,e),h(this,\"_instance\",null),h(this,\"_listeners\",null);var n=e._resolveSpeechRecognition();if(!n)throw new DOMException(\"SpeechRecognition not supported\",\"NOT_SUPPORTED_ERR\");this._instance=new n,this._listeners={},Object.entries(_(_({},e.defaultOptions),t||{})).forEach((function(t){var n=u(t,2),o=n[0],i=n[1];if(\"grammars\"===o&&!i){var a=e._resolveSpeechGrammarList();a&&(i=new a)}r._instance[o]=i}))}var n;return f(e,null,[{key:\"isSupported\",get:function(){return!!e._resolveSpeechRecognition()&&!!p()&&!!v()},set:function(t){throw new Error(\"You cannot set isSupported directly.\")}}]),f(e,[{key:\"start\",value:(n=r(t.mark((function e(){var r;return t.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!this._instance){t.next=14;break}return t.prev=1,t.next=4,E(\"microphone\",{audio:!0});case 4:if(t.sent){t.next=7;break}throw new Error(\"Unable to retrieve the stream from media device\");case 7:this._instance.start(),t.next=14;break;case 10:t.prev=10,t.t0=t.catch(1),(r=this._listeners.error)&&r(t.t0);case 14:return t.abrupt(\"return\",this);case 15:case\"end\":return t.stop()}}),e,this,[[1,10]])}))),function(){return n.apply(this,arguments)})},{key:\"stop\",value:function(){return this._instance&&this._instance.stop(),this}},{key:\"abort\",value:function(){return this._instance&&this._instance.abort(),this}},{key:\"addEventListener\",value:function(t,r){var n=this;if(this._instance&&this._includesEventType(t)){this._listeners[t]&&this.removeEventListener(t);var o=function(o){var i=[];t===e.eventTypes.RESULT&&o.results&&o.results.length>0&&i.push(o.results[0][0].transcript),r&&r.apply(n,[o].concat(i))};this._instance.addEventListener(t,o),this._listeners[t]=o}return this}},{key:\"removeEventListener\",value:function(t){var e=this._listeners[t];return this._instance.removeEventListener(t,e),delete this._listeners[t],this}},{key:\"cleanup\",value:function(){var t=this;return this.stop(),Object.keys(this._listeners).forEach((function(e){return t.removeEventListener(e)})),this._instance=null,this}},{key:\"_includesEventType\",value:function(t){return!!Object.values(e.eventTypes).find((function(e){return e===t}))}},{key:\"instance\",get:function(){return this._instance},set:function(t){throw new Error(\"You cannot set instance directly.\")}}],[{key:\"_resolveSpeechRecognition\",value:function(){return window.SpeechRecognition||window.webkitSpeechRecognition||window.mozSpeechRecognition||window.msSpeechRecognition}},{key:\"_resolveSpeechGrammarList\",value:function(){return window.SpeechGrammarList||window.webkitSpeechGrammarList||window.mozSpeechGrammarList||window.msSpeechGrammarList}}]),e}();h(x,\"defaultOptions\",{grammars:null,lang:\"en-US\",continuous:!1,interimResults:!1,maxAlternatives:1,serviceURI:null}),h(x,\"eventTypes\",{AUDIO_END:\"audioend\",AUDIO_START:\"audiostart\",END:\"end\",ERROR:\"error\",NO_MATCH:\"nomatch\",RESULT:\"result\",SOUND_END:\"soundend\",SOUND_START:\"soundstart\",SPEECH_END:\"speechend\",SPEECH_START:\"speechstart\",START:\"start\"});export{x as Vocal};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXMuanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy9yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXJyYXlXaXRoSG9sZXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5TGlrZVRvQXJyYXkuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL25vbkl0ZXJhYmxlUmVzdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXkuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjay5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkuanMiLCIuLi9ub2RlX21vZHVsZXMvQHVudGVtcHMvdXNlci1wZXJtaXNzaW9ucy11dGlscy9kaXN0L2luZGV4LmVzLmpzIiwiLi4vc3JjL1ZvY2FsLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxudmFyIHJ1bnRpbWUgPSAoZnVuY3Rpb24gKGV4cG9ydHMpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgdmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xuICB2YXIgdW5kZWZpbmVkOyAvLyBNb3JlIGNvbXByZXNzaWJsZSB0aGFuIHZvaWQgMC5cbiAgdmFyICRTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgPyBTeW1ib2wgOiB7fTtcbiAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIjtcbiAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIjtcbiAgdmFyIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcblxuICBmdW5jdGlvbiBkZWZpbmUob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gb2JqW2tleV07XG4gIH1cbiAgdHJ5IHtcbiAgICAvLyBJRSA4IGhhcyBhIGJyb2tlbiBPYmplY3QuZGVmaW5lUHJvcGVydHkgdGhhdCBvbmx5IHdvcmtzIG9uIERPTSBvYmplY3RzLlxuICAgIGRlZmluZSh7fSwgXCJcIik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGRlZmluZSA9IGZ1bmN0aW9uKG9iaiwga2V5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG9ialtrZXldID0gdmFsdWU7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkIGFuZCBvdXRlckZuLnByb3RvdHlwZSBpcyBhIEdlbmVyYXRvciwgdGhlbiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvci5cbiAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjtcbiAgICB2YXIgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuXG4gICAgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcy5cbiAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG4gIGV4cG9ydHMud3JhcCA9IHdyYXA7XG5cbiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uXG4gIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmVcbiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmdcbiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWVcbiAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2hcbiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLlxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9IFwic3VzcGVuZGVkWWllbGRcIjtcbiAgdmFyIEdlblN0YXRlRXhlY3V0aW5nID0gXCJleGVjdXRpbmdcIjtcbiAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcblxuICAvLyBSZXR1cm5pbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgaW5uZXJGbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzXG4gIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICAvLyBEdW1teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmRcbiAgLy8gLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gR2VuZXJhdG9yXG4gIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuXG4gIC8vIFRoaXMgaXMgYSBwb2x5ZmlsbCBmb3IgJUl0ZXJhdG9yUHJvdG90eXBlJSBmb3IgZW52aXJvbm1lbnRzIHRoYXRcbiAgLy8gZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdC5cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIEl0ZXJhdG9yUHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICB2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4gIHZhciBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTtcbiAgaWYgKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmXG4gICAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiZcbiAgICAgIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkpIHtcbiAgICAvLyBUaGlzIGVudmlyb25tZW50IGhhcyBhIG5hdGl2ZSAlSXRlcmF0b3JQcm90b3R5cGUlOyB1c2UgaXQgaW5zdGVhZFxuICAgIC8vIG9mIHRoZSBwb2x5ZmlsbC5cbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG5cbiAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID1cbiAgICBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdwLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb247XG4gIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gZGVmaW5lKFxuICAgIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLFxuICAgIHRvU3RyaW5nVGFnU3ltYm9sLFxuICAgIFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICApO1xuXG4gIC8vIEhlbHBlciBmb3IgZGVmaW5pbmcgdGhlIC5uZXh0LCAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMgb2YgdGhlXG4gIC8vIEl0ZXJhdG9yIGludGVyZmFjZSBpbiB0ZXJtcyBvZiBhIHNpbmdsZSAuX2ludm9rZSBtZXRob2QuXG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgIGRlZmluZShwcm90b3R5cGUsIG1ldGhvZCwgZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3JcbiAgICAgID8gY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHxcbiAgICAgICAgLy8gRm9yIHRoZSBuYXRpdmUgR2VuZXJhdG9yRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuXG4gICAgICAgIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgPT09IFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICAgICAgOiBmYWxzZTtcbiAgfTtcblxuICBleHBvcnRzLm1hcmsgPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgICAgIGRlZmluZShnZW5GdW4sIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvckZ1bmN0aW9uXCIpO1xuICAgIH1cbiAgICBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCk7XG4gICAgcmV0dXJuIGdlbkZ1bjtcbiAgfTtcblxuICAvLyBXaXRoaW4gdGhlIGJvZHkgb2YgYW55IGFzeW5jIGZ1bmN0aW9uLCBgYXdhaXQgeGAgaXMgdHJhbnNmb3JtZWQgdG9cbiAgLy8gYHlpZWxkIHJlZ2VuZXJhdG9yUnVudGltZS5hd3JhcCh4KWAsIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIHRlc3RcbiAgLy8gYGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIilgIHRvIGRldGVybWluZSBpZiB0aGUgeWllbGRlZCB2YWx1ZSBpc1xuICAvLyBtZWFudCB0byBiZSBhd2FpdGVkLlxuICBleHBvcnRzLmF3cmFwID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHsgX19hd2FpdDogYXJnIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7XG4gICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpO1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmc7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIikpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZS5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJuZXh0XCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24odW53cmFwcGVkKSB7XG4gICAgICAgICAgLy8gV2hlbiBhIHlpZWxkZWQgUHJvbWlzZSBpcyByZXNvbHZlZCwgaXRzIGZpbmFsIHZhbHVlIGJlY29tZXNcbiAgICAgICAgICAvLyB0aGUgLnZhbHVlIG9mIHRoZSBQcm9taXNlPHt2YWx1ZSxkb25lfT4gcmVzdWx0IGZvciB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IGl0ZXJhdGlvbi5cbiAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQ7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgIC8vIElmIGEgcmVqZWN0ZWQgUHJvbWlzZSB3YXMgeWllbGRlZCwgdGhyb3cgdGhlIHJlamVjdGlvbiBiYWNrXG4gICAgICAgICAgLy8gaW50byB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIHNvIGl0IGNhbiBiZSBoYW5kbGVkIHRoZXJlLlxuICAgICAgICAgIHJldHVybiBpbnZva2UoXCJ0aHJvd1wiLCBlcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzUHJvbWlzZTtcblxuICAgIGZ1bmN0aW9uIGVucXVldWUobWV0aG9kLCBhcmcpIHtcbiAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2VJbXBsKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPVxuICAgICAgICAvLyBJZiBlbnF1ZXVlIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byB3YWl0IHVudGlsXG4gICAgICAgIC8vIGFsbCBwcmV2aW91cyBQcm9taXNlcyBoYXZlIGJlZW4gcmVzb2x2ZWQgYmVmb3JlIGNhbGxpbmcgaW52b2tlLFxuICAgICAgICAvLyBzbyB0aGF0IHJlc3VsdHMgYXJlIGFsd2F5cyBkZWxpdmVyZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIElmXG4gICAgICAgIC8vIGVucXVldWUgaGFzIG5vdCBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRvXG4gICAgICAgIC8vIGNhbGwgaW52b2tlIGltbWVkaWF0ZWx5LCB3aXRob3V0IHdhaXRpbmcgb24gYSBjYWxsYmFjayB0byBmaXJlLFxuICAgICAgICAvLyBzbyB0aGF0IHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gaGFzIHRoZSBvcHBvcnR1bml0eSB0byBkb1xuICAgICAgICAvLyBhbnkgbmVjZXNzYXJ5IHNldHVwIGluIGEgcHJlZGljdGFibGUgd2F5LiBUaGlzIHByZWRpY3RhYmlsaXR5XG4gICAgICAgIC8vIGlzIHdoeSB0aGUgUHJvbWlzZSBjb25zdHJ1Y3RvciBzeW5jaHJvbm91c2x5IGludm9rZXMgaXRzXG4gICAgICAgIC8vIGV4ZWN1dG9yIGNhbGxiYWNrLCBhbmQgd2h5IGFzeW5jIGZ1bmN0aW9ucyBzeW5jaHJvbm91c2x5XG4gICAgICAgIC8vIGV4ZWN1dGUgY29kZSBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0LiBTaW5jZSB3ZSBpbXBsZW1lbnQgc2ltcGxlXG4gICAgICAgIC8vIGFzeW5jIGZ1bmN0aW9ucyBpbiB0ZXJtcyBvZiBhc3luYyBnZW5lcmF0b3JzLCBpdCBpcyBlc3BlY2lhbGx5XG4gICAgICAgIC8vIGltcG9ydGFudCB0byBnZXQgdGhpcyByaWdodCwgZXZlbiB0aG91Z2ggaXQgcmVxdWlyZXMgY2FyZS5cbiAgICAgICAgcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsXG4gICAgICAgICAgLy8gQXZvaWQgcHJvcGFnYXRpbmcgZmFpbHVyZXMgdG8gUHJvbWlzZXMgcmV0dXJuZWQgYnkgbGF0ZXJcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBvZiB0aGUgaXRlcmF0b3IuXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmdcbiAgICAgICAgKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7XG4gICAgfVxuXG4gICAgLy8gRGVmaW5lIHRoZSB1bmlmaWVkIGhlbHBlciBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGltcGxlbWVudCAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIChzZWUgZGVmaW5lSXRlcmF0b3JNZXRob2RzKS5cbiAgICB0aGlzLl9pbnZva2UgPSBlbnF1ZXVlO1xuICB9XG5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKTtcbiAgQXN5bmNJdGVyYXRvci5wcm90b3R5cGVbYXN5bmNJdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIGV4cG9ydHMuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3I7XG5cbiAgLy8gTm90ZSB0aGF0IHNpbXBsZSBhc3luYyBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZlxuICAvLyBBc3luY0l0ZXJhdG9yIG9iamVjdHM7IHRoZXkganVzdCByZXR1cm4gYSBQcm9taXNlIGZvciB0aGUgdmFsdWUgb2ZcbiAgLy8gdGhlIGZpbmFsIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgaXRlcmF0b3IuXG4gIGV4cG9ydHMuYXN5bmMgPSBmdW5jdGlvbihpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCwgUHJvbWlzZUltcGwpIHtcbiAgICBpZiAoUHJvbWlzZUltcGwgPT09IHZvaWQgMCkgUHJvbWlzZUltcGwgPSBQcm9taXNlO1xuXG4gICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcihcbiAgICAgIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpLFxuICAgICAgUHJvbWlzZUltcGxcbiAgICApO1xuXG4gICAgcmV0dXJuIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kO1xuICAgICAgY29udGV4dC5hcmcgPSBhcmc7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgICAgdGhyb3cgY29udGV4dC5hcmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG5cbiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09XG4gICAgICAgICAgLy8gR2VuU3RhdGVFeGVjdXRpbmcgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhlciBpbnZvY2F0aW9uLlxuICAgICAgICAgIHN0YXRlID0gY29udGV4dC5kb25lXG4gICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkXG4gICAgICAgICAgICA6IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lXG4gICAgICAgICAgfTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBleGNlcHRpb24gYnkgbG9vcGluZyBiYWNrIGFyb3VuZCB0byB0aGVcbiAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGVcbiAgLy8gcmVzdWx0LCBlaXRoZXIgYnkgcmV0dXJuaW5nIGEgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCBmcm9tIHRoZVxuICAvLyBkZWxlZ2F0ZSBpdGVyYXRvciwgb3IgYnkgbW9kaWZ5aW5nIGNvbnRleHQubWV0aG9kIGFuZCBjb250ZXh0LmFyZyxcbiAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuXG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdO1xuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQSAudGhyb3cgb3IgLnJldHVybiB3aGVuIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgbm8gLnRocm93XG4gICAgICAvLyBtZXRob2QgYWx3YXlzIHRlcm1pbmF0ZXMgdGhlIHlpZWxkKiBsb29wLlxuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIC8vIE5vdGU6IFtcInJldHVyblwiXSBtdXN0IGJlIHVzZWQgZm9yIEVTMyBwYXJzaW5nIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvcltcInJldHVyblwiXSkge1xuICAgICAgICAgIC8vIElmIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgYSByZXR1cm4gbWV0aG9kLCBnaXZlIGl0IGFcbiAgICAgICAgICAvLyBjaGFuY2UgdG8gY2xlYW4gdXAuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuXG4gICAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIC8vIElmIG1heWJlSW52b2tlRGVsZWdhdGUoY29udGV4dCkgY2hhbmdlZCBjb250ZXh0Lm1ldGhvZCBmcm9tXG4gICAgICAgICAgICAvLyBcInJldHVyblwiIHRvIFwidGhyb3dcIiwgbGV0IHRoYXQgb3ZlcnJpZGUgdGhlIFR5cGVFcnJvciBiZWxvdy5cbiAgICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpO1xuXG4gICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7XG5cbiAgICBpZiAoISBpbmZvKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAvLyBBc3NpZ24gdGhlIHJlc3VsdCBvZiB0aGUgZmluaXNoZWQgZGVsZWdhdGUgdG8gdGhlIHRlbXBvcmFyeVxuICAgICAgLy8gdmFyaWFibGUgc3BlY2lmaWVkIGJ5IGRlbGVnYXRlLnJlc3VsdE5hbWUgKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlO1xuXG4gICAgICAvLyBSZXN1bWUgZXhlY3V0aW9uIGF0IHRoZSBkZXNpcmVkIGxvY2F0aW9uIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jO1xuXG4gICAgICAvLyBJZiBjb250ZXh0Lm1ldGhvZCB3YXMgXCJ0aHJvd1wiIGJ1dCB0aGUgZGVsZWdhdGUgaGFuZGxlZCB0aGVcbiAgICAgIC8vIGV4Y2VwdGlvbiwgbGV0IHRoZSBvdXRlciBnZW5lcmF0b3IgcHJvY2VlZCBub3JtYWxseS4gSWZcbiAgICAgIC8vIGNvbnRleHQubWV0aG9kIHdhcyBcIm5leHRcIiwgZm9yZ2V0IGNvbnRleHQuYXJnIHNpbmNlIGl0IGhhcyBiZWVuXG4gICAgICAvLyBcImNvbnN1bWVkXCIgYnkgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yLiBJZiBjb250ZXh0Lm1ldGhvZCB3YXNcbiAgICAgIC8vIFwicmV0dXJuXCIsIGFsbG93IHRoZSBvcmlnaW5hbCAucmV0dXJuIGNhbGwgdG8gY29udGludWUgaW4gdGhlXG4gICAgICAvLyBvdXRlciBnZW5lcmF0b3IuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgIT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmUteWllbGQgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgZGVsZWdhdGUgbWV0aG9kLlxuICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgLy8gVGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGlzIGZpbmlzaGVkLCBzbyBmb3JnZXQgaXQgYW5kIGNvbnRpbnVlIHdpdGhcbiAgICAvLyB0aGUgb3V0ZXIgZ2VuZXJhdG9yLlxuICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICB9XG5cbiAgLy8gRGVmaW5lIEdlbmVyYXRvci5wcm90b3R5cGUue25leHQsdGhyb3cscmV0dXJufSBpbiB0ZXJtcyBvZiB0aGVcbiAgLy8gdW5pZmllZCAuX2ludm9rZSBoZWxwZXIgbWV0aG9kLlxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApO1xuXG4gIGRlZmluZShHcCwgdG9TdHJpbmdUYWdTeW1ib2wsIFwiR2VuZXJhdG9yXCIpO1xuXG4gIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlXG4gIC8vIEBAaXRlcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGl0LiBTb21lIGJyb3dzZXJzJyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlXG4gIC8vIGl0ZXJhdG9yIHByb3RvdHlwZSBjaGFpbiBpbmNvcnJlY3RseSBpbXBsZW1lbnQgdGhpcywgY2F1c2luZyB0aGUgR2VuZXJhdG9yXG4gIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2lzc3Vlcy8yNzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgR3BbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfTtcblxuICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykge1xuICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07XG5cbiAgICBpZiAoMSBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgfVxuXG4gICAgaWYgKDIgaW4gbG9jcykge1xuICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM107XG4gICAgfVxuXG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgIHJlY29yZC50eXBlID0gXCJub3JtYWxcIjtcbiAgICBkZWxldGUgcmVjb3JkLmFyZztcbiAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb21cbiAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuXG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XTtcbiAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgdGhpcy5yZXNldCh0cnVlKTtcbiAgfVxuXG4gIGV4cG9ydHMua2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMucmV2ZXJzZSgpO1xuXG4gICAgLy8gUmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIG9iamVjdCB3aXRoIGEgbmV4dCBtZXRob2QsIHdlIGtlZXBcbiAgICAvLyB0aGluZ3Mgc2ltcGxlIGFuZCByZXR1cm4gdGhlIG5leHQgZnVuY3Rpb24gaXRzZWxmLlxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgd2hpbGUgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7XG4gICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVG8gYXZvaWQgY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBvYmplY3QsIHdlIGp1c3QgaGFuZyB0aGUgLnZhbHVlXG4gICAgICAvLyBhbmQgLmRvbmUgcHJvcGVydGllcyBvZmYgdGhlIG5leHQgZnVuY3Rpb24gb2JqZWN0IGl0c2VsZi4gVGhpc1xuICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uXG4gICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHtcbiAgICAgICAgICAgICAgbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV4dC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLlxuICAgIHJldHVybiB7IG5leHQ6IGRvbmVSZXN1bHQgfTtcbiAgfVxuICBleHBvcnRzLnZhbHVlcyA9IHZhbHVlcztcblxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKHNraXBUZW1wUmVzZXQpIHtcbiAgICAgIHRoaXMucHJldiA9IDA7XG4gICAgICB0aGlzLm5leHQgPSAwO1xuICAgICAgLy8gUmVzZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICB0aGlzLmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG5cbiAgICAgICAgaWYgKGNhdWdodCkge1xuICAgICAgICAgIC8vIElmIHRoZSBkaXNwYXRjaGVkIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IGJ5IGEgY2F0Y2ggYmxvY2ssXG4gICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhIGNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgIHRoaXMubmV4dCA9IFwiZW5kXCI7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiICYmIGFmdGVyTG9jKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGFmdGVyTG9jO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbihmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKTtcbiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb250ZXh0LmNhdGNoIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYSBsb2NhdGlvblxuICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG5cbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZvcmdldCB0aGUgbGFzdCBzZW50IHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3RcbiAgICAgICAgLy8gYWNjaWRlbnRhbGx5IHBhc3MgaXQgb24gdG8gdGhlIGRlbGVnYXRlLlxuICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuICB9O1xuXG4gIC8vIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGlzIHNjcmlwdCBpcyBleGVjdXRpbmcgYXMgYSBDb21tb25KUyBtb2R1bGVcbiAgLy8gb3Igbm90LCByZXR1cm4gdGhlIHJ1bnRpbWUgb2JqZWN0IHNvIHRoYXQgd2UgY2FuIGRlY2xhcmUgdGhlIHZhcmlhYmxlXG4gIC8vIHJlZ2VuZXJhdG9yUnVudGltZSBpbiB0aGUgb3V0ZXIgc2NvcGUsIHdoaWNoIGFsbG93cyB0aGlzIG1vZHVsZSB0byBiZVxuICAvLyBpbmplY3RlZCBlYXNpbHkgYnkgYGJpbi9yZWdlbmVyYXRvciAtLWluY2x1ZGUtcnVudGltZSBzY3JpcHQuanNgLlxuICByZXR1cm4gZXhwb3J0cztcblxufShcbiAgLy8gSWYgdGhpcyBzY3JpcHQgaXMgZXhlY3V0aW5nIGFzIGEgQ29tbW9uSlMgbW9kdWxlLCB1c2UgbW9kdWxlLmV4cG9ydHNcbiAgLy8gYXMgdGhlIHJlZ2VuZXJhdG9yUnVudGltZSBuYW1lc3BhY2UuIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcgZW1wdHlcbiAgLy8gb2JqZWN0LiBFaXRoZXIgd2F5LCB0aGUgcmVzdWx0aW5nIG9iamVjdCB3aWxsIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZVxuICAvLyB0aGUgcmVnZW5lcmF0b3JSdW50aW1lIHZhcmlhYmxlIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlLlxuICB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiID8gbW9kdWxlLmV4cG9ydHMgOiB7fVxuKSk7XG5cbnRyeSB7XG4gIHJlZ2VuZXJhdG9yUnVudGltZSA9IHJ1bnRpbWU7XG59IGNhdGNoIChhY2NpZGVudGFsU3RyaWN0TW9kZSkge1xuICAvLyBUaGlzIG1vZHVsZSBzaG91bGQgbm90IGJlIHJ1bm5pbmcgaW4gc3RyaWN0IG1vZGUsIHNvIHRoZSBhYm92ZVxuICAvLyBhc3NpZ25tZW50IHNob3VsZCBhbHdheXMgd29yayB1bmxlc3Mgc29tZXRoaW5nIGlzIG1pc2NvbmZpZ3VyZWQuIEp1c3RcbiAgLy8gaW4gY2FzZSBydW50aW1lLmpzIGFjY2lkZW50YWxseSBydW5zIGluIHN0cmljdCBtb2RlLCB3ZSBjYW4gZXNjYXBlXG4gIC8vIHN0cmljdCBtb2RlIHVzaW5nIGEgZ2xvYmFsIEZ1bmN0aW9uIGNhbGwuIFRoaXMgY291bGQgY29uY2VpdmFibHkgZmFpbFxuICAvLyBpZiBhIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IGZvcmJpZHMgdXNpbmcgRnVuY3Rpb24sIGJ1dCBpbiB0aGF0IGNhc2VcbiAgLy8gdGhlIHByb3BlciBzb2x1dGlvbiBpcyB0byBmaXggdGhlIGFjY2lkZW50YWwgc3RyaWN0IG1vZGUgcHJvYmxlbS4gSWZcbiAgLy8geW91J3ZlIG1pc2NvbmZpZ3VyZWQgeW91ciBidW5kbGVyIHRvIGZvcmNlIHN0cmljdCBtb2RlIGFuZCBhcHBsaWVkIGFcbiAgLy8gQ1NQIHRvIGZvcmJpZCBGdW5jdGlvbiwgYW5kIHlvdSdyZSBub3Qgd2lsbGluZyB0byBmaXggZWl0aGVyIG9mIHRob3NlXG4gIC8vIHByb2JsZW1zLCBwbGVhc2UgZGV0YWlsIHlvdXIgdW5pcXVlIHByZWRpY2FtZW50IGluIGEgR2l0SHViIGlzc3VlLlxuICBGdW5jdGlvbihcInJcIiwgXCJyZWdlbmVyYXRvclJ1bnRpbWUgPSByXCIpKHJ1bnRpbWUpO1xufVxuIiwiZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykge1xuICB0cnkge1xuICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTtcbiAgICB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlamVjdChlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGluZm8uZG9uZSkge1xuICAgIHJlc29sdmUodmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihfbmV4dCwgX3Rocm93KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXG4gICAgICBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkge1xuICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwibmV4dFwiLCB2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIF90aHJvdyhlcnIpIHtcbiAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcInRocm93XCIsIGVycik7XG4gICAgICB9XG5cbiAgICAgIF9uZXh0KHVuZGVmaW5lZCk7XG4gICAgfSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2FzeW5jVG9HZW5lcmF0b3I7IiwiZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hcnJheVdpdGhIb2xlczsiLCJmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8ICEoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChhcnIpKSkgcmV0dXJuO1xuICB2YXIgX2FyciA9IFtdO1xuICB2YXIgX24gPSB0cnVlO1xuICB2YXIgX2QgPSBmYWxzZTtcbiAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkge1xuICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2QgPSB0cnVlO1xuICAgIF9lID0gZXJyO1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIF9hcnI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2l0ZXJhYmxlVG9BcnJheUxpbWl0OyIsImZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykge1xuICAgIGFycjJbaV0gPSBhcnJbaV07XG4gIH1cblxuICByZXR1cm4gYXJyMjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlMaWtlVG9BcnJheTsiLCJ2YXIgYXJyYXlMaWtlVG9BcnJheSA9IHJlcXVpcmUoXCIuL2FycmF5TGlrZVRvQXJyYXlcIik7XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5OyIsImZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX25vbkl0ZXJhYmxlUmVzdDsiLCJ2YXIgYXJyYXlXaXRoSG9sZXMgPSByZXF1aXJlKFwiLi9hcnJheVdpdGhIb2xlc1wiKTtcblxudmFyIGl0ZXJhYmxlVG9BcnJheUxpbWl0ID0gcmVxdWlyZShcIi4vaXRlcmFibGVUb0FycmF5TGltaXRcIik7XG5cbnZhciB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSA9IHJlcXVpcmUoXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5XCIpO1xuXG52YXIgbm9uSXRlcmFibGVSZXN0ID0gcmVxdWlyZShcIi4vbm9uSXRlcmFibGVSZXN0XCIpO1xuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHtcbiAgcmV0dXJuIGFycmF5V2l0aEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IG5vbkl0ZXJhYmxlUmVzdCgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9zbGljZWRUb0FycmF5OyIsImZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2NsYXNzQ2FsbENoZWNrOyIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfY3JlYXRlQ2xhc3M7IiwiZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2RlZmluZVByb3BlcnR5OyIsInZhciBlPWZ1bmN0aW9uKCl7cmV0dXJuISFuYXZpZ2F0b3IucGVybWlzc2lvbnN9LHI9ZnVuY3Rpb24oKXtyZXR1cm4hIW5hdmlnYXRvci5tZWRpYURldmljZXN9O2Z1bmN0aW9uIHQoZSxyLHQsbixhLGksbyl7dHJ5e3ZhciB1PWVbaV0obyksYz11LnZhbHVlfWNhdGNoKGUpe3JldHVybiB2b2lkIHQoZSl9dS5kb25lP3IoYyk6UHJvbWlzZS5yZXNvbHZlKGMpLnRoZW4obixhKX1mdW5jdGlvbiBuKGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciByPXRoaXMsbj1hcmd1bWVudHM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihhLGkpe3ZhciBvPWUuYXBwbHkocixuKTtmdW5jdGlvbiB1KGUpe3QobyxhLGksdSxjLFwibmV4dFwiLGUpfWZ1bmN0aW9uIGMoZSl7dChvLGEsaSx1LGMsXCJ0aHJvd1wiLGUpfXUodm9pZCAwKX0pKX19ZnVuY3Rpb24gYShlLHIpe3JldHVybiBmdW5jdGlvbihlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlfShlKXx8ZnVuY3Rpb24oZSxyKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgU3ltYm9sfHwhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpKXJldHVybjt2YXIgdD1bXSxuPSEwLGE9ITEsaT12b2lkIDA7dHJ5e2Zvcih2YXIgbyx1PWVbU3ltYm9sLml0ZXJhdG9yXSgpOyEobj0obz11Lm5leHQoKSkuZG9uZSkmJih0LnB1c2goby52YWx1ZSksIXJ8fHQubGVuZ3RoIT09cik7bj0hMCk7fWNhdGNoKGUpe2E9ITAsaT1lfWZpbmFsbHl7dHJ5e258fG51bGw9PXUucmV0dXJufHx1LnJldHVybigpfWZpbmFsbHl7aWYoYSl0aHJvdyBpfX1yZXR1cm4gdH0oZSxyKXx8ZnVuY3Rpb24oZSxyKXtpZighZSlyZXR1cm47aWYoXCJzdHJpbmdcIj09dHlwZW9mIGUpcmV0dXJuIGkoZSxyKTt2YXIgdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkuc2xpY2UoOCwtMSk7XCJPYmplY3RcIj09PXQmJmUuY29uc3RydWN0b3ImJih0PWUuY29uc3RydWN0b3IubmFtZSk7aWYoXCJNYXBcIj09PXR8fFwiU2V0XCI9PT10KXJldHVybiBBcnJheS5mcm9tKGUpO2lmKFwiQXJndW1lbnRzXCI9PT10fHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdCh0KSlyZXR1cm4gaShlLHIpfShlLHIpfHxmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIil9KCl9ZnVuY3Rpb24gaShlLHIpeyhudWxsPT1yfHxyPmUubGVuZ3RoKSYmKHI9ZS5sZW5ndGgpO2Zvcih2YXIgdD0wLG49bmV3IEFycmF5KHIpO3Q8cjt0Kyspblt0XT1lW3RdO3JldHVybiBufXZhciBvPWZ1bmN0aW9uKCl7dmFyIHI9bihyZWdlbmVyYXRvclJ1bnRpbWUubWFyaygoZnVuY3Rpb24gcih0KXtyZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoKGZ1bmN0aW9uKHIpe2Zvcig7Oylzd2l0Y2goci5wcmV2PXIubmV4dCl7Y2FzZSAwOnJldHVybiByLmFicnVwdChcInJldHVyblwiLG5ldyBQcm9taXNlKGZ1bmN0aW9uKCl7dmFyIHI9bihyZWdlbmVyYXRvclJ1bnRpbWUubWFyaygoZnVuY3Rpb24gcihuLGEpe3ZhciBpLG87cmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gZSgpfHxhKG5ldyBET01FeGNlcHRpb24oXCJOYXZpZ2F0b3IgQVBJOiBwZXJtaXNzaW9ucyBub3Qgc3VwcG9ydGVkXCIsXCJOT1RfU1VQUE9SVEVEX0VSUlwiKSksci5wcmV2PTEsci5uZXh0PTQsbmF2aWdhdG9yLnBlcm1pc3Npb25zLnF1ZXJ5KHtuYW1lOnR9KTtjYXNlIDQ6aT1yLnNlbnQsbz1mdW5jdGlvbiBlKHIpe2kucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLGUpLHUoci50YXJnZXQuc3RhdGUsbixhKX0saS5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsbyksdShpLnN0YXRlLG4sYSksci5uZXh0PTEzO2JyZWFrO2Nhc2UgMTA6ci5wcmV2PTEwLHIudDA9ci5jYXRjaCgxKSxhKHIudDApO2Nhc2UgMTM6Y2FzZVwiZW5kXCI6cmV0dXJuIHIuc3RvcCgpfX0pLHIsbnVsbCxbWzEsMTBdXSl9KSkpO3JldHVybiBmdW5jdGlvbihlLHQpe3JldHVybiByLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCkpKTtjYXNlIDE6Y2FzZVwiZW5kXCI6cmV0dXJuIHIuc3RvcCgpfX0pLHIpfSkpKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKSx1PWZ1bmN0aW9uKGUscix0KXtzd2l0Y2goZSl7Y2FzZVwiZGVuaWVkXCI6dChuZXcgRE9NRXhjZXB0aW9uKFwiUGVybWlzc2lvbiBkZW5pZWRcIixcIk5PVF9BTExPV0VEX0VSUlwiKSk7YnJlYWs7ZGVmYXVsdDpyKGUpfX0sYz1mdW5jdGlvbigpe3ZhciB0PW4ocmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoKGZ1bmN0aW9uIHQoaSx1KXtyZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0LmFicnVwdChcInJldHVyblwiLG5ldyBQcm9taXNlKGZ1bmN0aW9uKCl7dmFyIHQ9bihyZWdlbmVyYXRvclJ1bnRpbWUubWFyaygoZnVuY3Rpb24gdChuLGMpe3ZhciBzLGYscDtyZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiBlKCkmJnIoKXx8YyhuZXcgRE9NRXhjZXB0aW9uKFwiTmF2aWdhdG9yIEFQSTogcGVybWlzc2lvbnMgb3IgTmF2aWdhdG9yIEFQSTogbWVkaWFEZXZpY2VzIG5vdCBzdXBwb3J0ZWRcIixcIk5PVF9TVVBQT1JURURfRVJSXCIpKSx0LnByZXY9MSx0LnQwPVByb21pc2UsdC5uZXh0PTUsbyhpKTtjYXNlIDU6cmV0dXJuIHQudDE9dC5zZW50LHQubmV4dD04LG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHUpO2Nhc2UgODpyZXR1cm4gdC50Mj10LnNlbnQsdC50Mz1bdC50MSx0LnQyXSx0Lm5leHQ9MTIsdC50MC5hbGwuY2FsbCh0LnQwLHQudDMpO2Nhc2UgMTI6cz10LnNlbnQsZj1hKHMsMikscD1mWzFdLG4ocCksdC5uZXh0PTIxO2JyZWFrO2Nhc2UgMTg6dC5wcmV2PTE4LHQudDQ9dC5jYXRjaCgxKSxjKHQudDQpO2Nhc2UgMjE6Y2FzZVwiZW5kXCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsbnVsbCxbWzEsMThdXSl9KSkpO3JldHVybiBmdW5jdGlvbihlLHIpe3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCkpKTtjYXNlIDE6Y2FzZVwiZW5kXCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQpfSkpKTtyZXR1cm4gZnVuY3Rpb24oZSxyKXtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpO2V4cG9ydHtvIGFzIGdldFBlcm1pc3Npb24sYyBhcyBnZXRVc2VyTWVkaWFTdHJlYW0sciBhcyBpc05hdmlnYXRvck1lZGlhRGV2aWNlc1N1cHBvcnRlZCxlIGFzIGlzTmF2aWdhdG9yUGVybWlzc2lvbnNTdXBwb3J0ZWR9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2lhVzVrWlhndVpYTXVhbk1pTENKemIzVnlZMlZ6SWpwYklpNHVMM055WXk5cGMwNWhkbWxuWVhSdmNsQmxjbTFwYzNOcGIyNXpVM1Z3Y0c5eWRHVmtMbXB6SWl3aUxpNHZjM0pqTDJselRtRjJhV2RoZEc5eVRXVmthV0ZFWlhacFkyVnpVM1Z3Y0c5eWRHVmtMbXB6SWl3aUxpNHZjM0pqTDJkbGRGQmxjbTFwYzNOcGIyNHVhbk1pTENJdUxpOXpjbU12WjJWMFZYTmxjazFsWkdsaFUzUnlaV0Z0TG1weklsMHNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJaThxS2x4dUlDb2dRMmhsWTJzZ2QyaGxkR2hsY2lCT1lYWnBaMkYwYjNJZ1FWQkpPaUJ3WlhKdGFYTnphVzl1Y3lCcGN5QnpkWEJ3YjNKMFpXUWdZbmtnZEdobElHTjFjbkpsYm5RZ1luSnZkM05sY2x4dUlDb2dRSEpsZEhWeWJuTWdlMkp2YjJ4bFlXNTlYRzRnS2k5Y2JtVjRjRzl5ZENCa1pXWmhkV3gwSUNncElEMCtJQ0VoYm1GMmFXZGhkRzl5TG5CbGNtMXBjM05wYjI1elhHNGlMQ0l2S2lwY2JpQXFJRU5vWldOcklIZG9aWFJvWlhJZ1RtRjJhV2RoZEc5eUlFRlFTVG9nYldWa2FXRkVaWFpwWTJWeklHbHpJSE4xY0hCdmNuUmxaQ0JpZVNCMGFHVWdZM1Z5Y21WdWRDQmljbTkzYzJWeVhHNGdLaUJBY21WMGRYSnVjeUI3WW05dmJHVmhibjFjYmlBcUwxeHVaWGh3YjNKMElHUmxabUYxYkhRZ0tDa2dQVDRnSVNGdVlYWnBaMkYwYjNJdWJXVmthV0ZFWlhacFkyVnpYRzRpTENKcGJYQnZjblFnYVhOT1lYWnBaMkYwYjNKUVpYSnRhWE56YVc5dWMxTjFjSEJ2Y25SbFpDQm1jbTl0SUNjdUwybHpUbUYyYVdkaGRHOXlVR1Z5YldsemMybHZibk5UZFhCd2IzSjBaV1FuWEc1Y2JpOHFLbHh1SUNvZ1VtVjBkWEp1Y3lCaElIQnliMjFwYzJVZ2NtVnpiMngyWldRZ2QyaGxiaUIwYUdVZ2NHVnliV2x6YzJsdmJpQnBjeUJuY21GdWRHVmtJR0o1SUhSb1pTQjFjMlZ5WEc0Z0tpQkFjR0Z5WVcwZ2NHVnliV2x6YzJsdmJrNWhiV1VnSUNBZ0lDQWdJQ0FnSUNCT1lXMWxJRzltSUhSb1pTQndaWEp0YVhOemFXOXVMaUJBYzJWbElHaDBkSEJ6T2k4dmR6TmpMbWRwZEdoMVlpNXBieTl3WlhKdGFYTnphVzl1Y3k4alpXNTFiV1JsWmkxd1pYSnRhWE56YVc5dWJtRnRaVnh1SUNvZ1FISmxkSFZ5Ym5NZ2UxQnliMjFwYzJWOVhHNGdLaTljYm1WNGNHOXlkQ0JrWldaaGRXeDBJR0Z6ZVc1aklDaHdaWEp0YVhOemFXOXVUbUZ0WlNrZ1BUNGdlMXh1WEhSeVpYUjFjbTRnYm1WM0lGQnliMjFwYzJVb1lYTjVibU1nS0hKbGMyOXNkbVVzSUhKbGFtVmpkQ2tnUFQ0Z2UxeHVYSFJjZEdsbUlDZ2hhWE5PWVhacFoyRjBiM0pRWlhKdGFYTnphVzl1YzFOMWNIQnZjblJsWkNncEtTQjdYRzVjZEZ4MFhIUnlaV3BsWTNRb2JtVjNJRVJQVFVWNFkyVndkR2x2YmlnblRtRjJhV2RoZEc5eUlFRlFTVG9nY0dWeWJXbHpjMmx2Ym5NZ2JtOTBJSE4xY0hCdmNuUmxaQ2NzSUNkT1QxUmZVMVZRVUU5U1ZFVkVYMFZTVWljcEtWeHVYSFJjZEgxY2JseHVYSFJjZEhSeWVTQjdYRzVjZEZ4MFhIUmpiMjV6ZENCd1pYSnRhWE56YVc5dVUzUmhkSFZ6SUQwZ1lYZGhhWFFnYm1GMmFXZGhkRzl5TG5CbGNtMXBjM05wYjI1ekxuRjFaWEo1S0hzZ2JtRnRaVG9nY0dWeWJXbHpjMmx2Yms1aGJXVWdmU2xjYmx4MFhIUmNkR052Ym5OMElHOXVRMmhoYm1kbElEMGdLR1YyWlc1MEtTQTlQaUI3WEc1Y2RGeDBYSFJjZEhCbGNtMXBjM05wYjI1VGRHRjBkWE11Y21WdGIzWmxSWFpsYm5STWFYTjBaVzVsY2lnblkyaGhibWRsSnl3Z2IyNURhR0Z1WjJVcFhHNWNkRngwWEhSY2RISmxjMjlzZG1WUGNsSmxhbVZqZEVKaGMyVmtUMjVUZEdGMFpTaGxkbVZ1ZEM1MFlYSm5aWFF1YzNSaGRHVXNJSEpsYzI5c2RtVXNJSEpsYW1WamRDbGNibHgwWEhSY2RIMWNibHgwWEhSY2RIQmxjbTFwYzNOcGIyNVRkR0YwZFhNdVlXUmtSWFpsYm5STWFYTjBaVzVsY2lnblkyaGhibWRsSnl3Z2IyNURhR0Z1WjJVcFhHNWNkRngwWEhSeVpYTnZiSFpsVDNKU1pXcGxZM1JDWVhObFpFOXVVM1JoZEdVb2NHVnliV2x6YzJsdmJsTjBZWFIxY3k1emRHRjBaU3dnY21WemIyeDJaU3dnY21WcVpXTjBLVnh1WEhSY2RIMGdZMkYwWTJnZ0tHVnljbTl5S1NCN1hHNWNkRngwWEhSeVpXcGxZM1FvWlhKeWIzSXBYRzVjZEZ4MGZWeHVYSFI5S1Z4dWZWeHVYRzVqYjI1emRDQnlaWE52YkhabFQzSlNaV3BsWTNSQ1lYTmxaRTl1VTNSaGRHVWdQU0FvYzNSaGRHVXNJSEpsYzI5c2RtVXNJSEpsYW1WamRDa2dQVDRnZTF4dVhIUnpkMmwwWTJnZ0tITjBZWFJsS1NCN1hHNWNkRngwWTJGelpTQW5aR1Z1YVdWa0p6cGNibHgwWEhSY2RISmxhbVZqZENodVpYY2dSRTlOUlhoalpYQjBhVzl1S0NkUVpYSnRhWE56YVc5dUlHUmxibWxsWkNjc0lDZE9UMVJmUVV4TVQxZEZSRjlGVWxJbktTbGNibHgwWEhSY2RHSnlaV0ZyWEc1Y2RGeDBaR1ZtWVhWc2REcGNibHgwWEhSY2RISmxjMjlzZG1Vb2MzUmhkR1VwWEc1Y2RIMWNibjFjYmlJc0ltbHRjRzl5ZENCcGMwNWhkbWxuWVhSdmNsQmxjbTFwYzNOcGIyNXpVM1Z3Y0c5eWRHVmtJR1p5YjIwZ0p5NHZhWE5PWVhacFoyRjBiM0pRWlhKdGFYTnphVzl1YzFOMWNIQnZjblJsWkNkY2JtbHRjRzl5ZENCcGMwNWhkbWxuWVhSdmNrMWxaR2xoUkdWMmFXTmxjMU4xY0hCdmNuUmxaQ0JtY205dElDY3VMMmx6VG1GMmFXZGhkRzl5VFdWa2FXRkVaWFpwWTJWelUzVndjRzl5ZEdWa0oxeHVhVzF3YjNKMElHZGxkRkJsY20xcGMzTnBiMjRnWm5KdmJTQW5MaTluWlhSUVpYSnRhWE56YVc5dUoxeHVYRzR2S2lwY2JpQXFJRkpsZEhWeWJuTWdZU0J3Y205dGFYTmxJSEpsYzI5c2RtVmtJSGRvWlc0Z2RHaGxJSEJsY20xcGMzTnBiMjRnYVhNZ1ozSmhiblJsWkNCaWVTQjBhR1VnZFhObGNpQmhibVFnZEdobElITjBjbVZoYlNCcGN5QnlaWFJ5YVdWMlpXUmNiaUFxSUVCd1lYSmhiU0J3WlhKdGFYTnphVzl1VG1GdFpTQWdJQ0FnSUNBZ0lDQWdJRTVoYldVZ2IyWWdkR2hsSUhCbGNtMXBjM05wYjI0dUlFQnpaV1VnYUhSMGNITTZMeTkzTTJNdVoybDBhSFZpTG1sdkwzQmxjbTFwYzNOcGIyNXpMeU5sYm5WdFpHVm1MWEJsY20xcGMzTnBiMjV1WVcxbFhHNGdLaUJBY0dGeVlXMGdiV1ZrYVdGVGRISmxZVzFEYjI1emRISmhhVzUwY3lBZ0lDQkRiMjV6ZEhKaGFXNTBjeUJ2WW1wbFkzUXVJRUJ6WldVZ2FIUjBjSE02THk5a1pYWmxiRzl3WlhJdWJXOTZhV3hzWVM1dmNtY3ZaVzR0VlZNdlpHOWpjeTlYWldJdlFWQkpMMDFsWkdsaFUzUnlaV0Z0UTI5dWMzUnlZV2x1ZEhOY2JpQXFJRUJ5WlhSMWNtNXpJSHRRY205dGFYTmxmVnh1SUNvdlhHNWxlSEJ2Y25RZ1pHVm1ZWFZzZENCaGMzbHVZeUFvY0dWeWJXbHpjMmx2Yms1aGJXVXNJRzFsWkdsaFUzUnlaV0Z0UTI5dWMzUnlZV2x1ZEhNcElEMCtJSHRjYmx4MGNtVjBkWEp1SUc1bGR5QlFjbTl0YVhObEtHRnplVzVqSUNoeVpYTnZiSFpsTENCeVpXcGxZM1FwSUQwK0lIdGNibHgwWEhScFppQW9JV2x6VG1GMmFXZGhkRzl5VUdWeWJXbHpjMmx2Ym5OVGRYQndiM0owWldRb0tTQjhmQ0FoYVhOT1lYWnBaMkYwYjNKTlpXUnBZVVJsZG1salpYTlRkWEJ3YjNKMFpXUW9LU2tnZTF4dVhIUmNkRngwY21WcVpXTjBLRzVsZHlCRVQwMUZlR05sY0hScGIyNG9KMDVoZG1sbllYUnZjaUJCVUVrNklIQmxjbTFwYzNOcGIyNXpJRzl5SUU1aGRtbG5ZWFJ2Y2lCQlVFazZJRzFsWkdsaFJHVjJhV05sY3lCdWIzUWdjM1Z3Y0c5eWRHVmtKeXdnSjA1UFZGOVRWVkJRVDFKVVJVUmZSVkpTSnlrcFhHNWNkRngwZlZ4dVhHNWNkRngwZEhKNUlIdGNibHgwWEhSY2RHTnZibk4wSUZzc0lITjBjbVZoYlYwZ1BTQmhkMkZwZENCUWNtOXRhWE5sTG1Gc2JDaGJYRzVjZEZ4MFhIUmNkR0YzWVdsMElHZGxkRkJsY20xcGMzTnBiMjRvY0dWeWJXbHpjMmx2Yms1aGJXVXBMRnh1WEhSY2RGeDBYSFJoZDJGcGRDQnVZWFpwWjJGMGIzSXViV1ZrYVdGRVpYWnBZMlZ6TG1kbGRGVnpaWEpOWldScFlTaHRaV1JwWVZOMGNtVmhiVU52Ym5OMGNtRnBiblJ6S1N4Y2JseDBYSFJjZEYwcFhHNWNkRngwWEhSeVpYTnZiSFpsS0hOMGNtVmhiU2xjYmx4MFhIUjlJR05oZEdOb0lDaGxjbkp2Y2lrZ2UxeHVYSFJjZEZ4MGNtVnFaV04wS0dWeWNtOXlLVnh1WEhSY2RIMWNibHgwZlNsY2JuMWNiaUpkTENKdVlXMWxjeUk2V3lKdVlYWnBaMkYwYjNJaUxDSndaWEp0YVhOemFXOXVjeUlzSW0xbFpHbGhSR1YyYVdObGN5SXNJbkJsY20xcGMzTnBiMjVPWVcxbElpd2lVSEp2YldselpTSXNJbkpsYzI5c2RtVWlMQ0p5WldwbFkzUWlMQ0pwYzA1aGRtbG5ZWFJ2Y2xCbGNtMXBjM05wYjI1elUzVndjRzl5ZEdWa0lpd2lSRTlOUlhoalpYQjBhVzl1SWl3aWNYVmxjbmtpTENKdVlXMWxJaXdpY0dWeWJXbHpjMmx2YmxOMFlYUjFjeUlzSW05dVEyaGhibWRsSWl3aVpYWmxiblFpTENKeVpXMXZkbVZGZG1WdWRFeHBjM1JsYm1WeUlpd2ljbVZ6YjJ4MlpVOXlVbVZxWldOMFFtRnpaV1JQYmxOMFlYUmxJaXdpZEdGeVoyVjBJaXdpYzNSaGRHVWlMQ0poWkdSRmRtVnVkRXhwYzNSbGJtVnlJaXdpYldWa2FXRlRkSEpsWVcxRGIyNXpkSEpoYVc1MGN5SXNJbWx6VG1GMmFXZGhkRzl5VFdWa2FXRkVaWFpwWTJWelUzVndjRzl5ZEdWa0lpd2laMlYwVUdWeWJXbHpjMmx2YmlJc0ltZGxkRlZ6WlhKTlpXUnBZU0lzSW1Gc2JDSXNJbk4wY21WaGJTSmRMQ0p0WVhCd2FXNW5jeUk2SWtGQlNVRXNlVUpCUVhWQ1FTeFZRVUZWUXl4clEwTkJWa1FzVlVGQlZVVXNhWGhEUTBkcVF5eHJSRUZCWlN4WFFVRlBReXcwUjBGRFpDeEpRVUZKUXl4dlJFRkJVU3hYUVVGUFF5eEZRVUZUUXl4clIwRkROMEpETEV0QlEwcEVMRVZCUVU4c1NVRkJTVVVzWVVGQllTd3lRMEZCTkVNc2QwTkJTWEpEVWl4VlFVRlZReXhaUVVGWlVTeE5RVUZOTEVOQlFVVkRMRXRCUVUxUUxGZEJRVGRFVVN4VFFVTkJReXhGUVVGWExGTkJRVmhCTEVWQlFWbERMRWRCUTJwQ1JpeEZRVUZwUWtjc2IwSkJRVzlDTEZOQlFWVkdMRWRCUXk5RFJ5eEZRVUUwUWtZc1JVRkJUVWNzVDBGQlQwTXNUVUZCVDFvc1JVRkJVME1zU1VGRk1VUkxMRVZCUVdsQ1R5eHBRa0ZCYVVJc1UwRkJWVTRzUjBGRE5VTkhMRVZCUVRSQ1NpeEZRVUZwUWswc1RVRkJUMW9zUlVGQlUwTXNjVVJCUlRkRVFTdzJUa0ZMUjFNc1JVRkJPRUlzVTBGQlEwVXNSVUZCVDFvc1JVRkJVME1zVlVGRE5VTlhMRTlCUTBZc1UwRkRTbGdzUlVGQlR5eEpRVUZKUlN4aFFVRmhMRzlDUVVGeFFpeHJRMEZITjBOSUxFVkJRVkZaTEcxRVEzWkNTU3hYUVVGUFpDeEZRVUZuUW1kQ0xEUkhRVU01UWl4SlFVRkpaaXh2UkVGQlVTeFhRVUZQUXl4RlFVRlRReXh2UjBGRE4wSkRMRXRCUVhORFlTeExRVU14UTJRc1JVRkJUeXhKUVVGSlJTeGhRVUZoTERCRlFVRXlSU3h2UTBGSk1VVktMR2xDUVVOc1FtbENMRVZCUVdOc1FpeHpRMEZEWkVnc1ZVRkJWVVVzWVVGQllXOUNMR0ZCUVdGSUxEWkVRVVpXU1N3NFEwRkJlRUpETEU5QlNWUnVRaXhGUVVGUmJVSXNjVVJCUlZKc1FpSjlcbiIsImltcG9ydCB7IGlzTmF2aWdhdG9yUGVybWlzc2lvbnNTdXBwb3J0ZWQsIGlzTmF2aWdhdG9yTWVkaWFEZXZpY2VzU3VwcG9ydGVkLCBnZXRVc2VyTWVkaWFTdHJlYW0gfSBmcm9tICdAdW50ZW1wcy91c2VyLXBlcm1pc3Npb25zLXV0aWxzJ1xuXG5jbGFzcyBWb2NhbCB7XG5cdHN0YXRpYyBkZWZhdWx0T3B0aW9ucyA9IHtcblx0XHRncmFtbWFyczogbnVsbCxcblx0XHRsYW5nOiAnZW4tVVMnLFxuXHRcdGNvbnRpbnVvdXM6IGZhbHNlLFxuXHRcdGludGVyaW1SZXN1bHRzOiBmYWxzZSxcblx0XHRtYXhBbHRlcm5hdGl2ZXM6IDEsXG5cdFx0c2VydmljZVVSSTogbnVsbCxcblx0fVxuXG5cdHN0YXRpYyBldmVudFR5cGVzID0ge1xuXHRcdEFVRElPX0VORDogJ2F1ZGlvZW5kJyxcblx0XHRBVURJT19TVEFSVDogJ2F1ZGlvc3RhcnQnLFxuXHRcdEVORDogJ2VuZCcsXG5cdFx0RVJST1I6ICdlcnJvcicsXG5cdFx0Tk9fTUFUQ0g6ICdub21hdGNoJyxcblx0XHRSRVNVTFQ6ICdyZXN1bHQnLFxuXHRcdFNPVU5EX0VORDogJ3NvdW5kZW5kJyxcblx0XHRTT1VORF9TVEFSVDogJ3NvdW5kc3RhcnQnLFxuXHRcdFNQRUVDSF9FTkQ6ICdzcGVlY2hlbmQnLFxuXHRcdFNQRUVDSF9TVEFSVDogJ3NwZWVjaHN0YXJ0Jyxcblx0XHRTVEFSVDogJ3N0YXJ0Jyxcblx0fVxuXG5cdHN0YXRpYyBnZXQgaXNTdXBwb3J0ZWQoKSB7XG5cdFx0cmV0dXJuICEhVm9jYWwuX3Jlc29sdmVTcGVlY2hSZWNvZ25pdGlvbigpICYmICEhaXNOYXZpZ2F0b3JQZXJtaXNzaW9uc1N1cHBvcnRlZCgpICYmICEhaXNOYXZpZ2F0b3JNZWRpYURldmljZXNTdXBwb3J0ZWQoKVxuXHR9XG5cblx0c3RhdGljIHNldCBpc1N1cHBvcnRlZChfKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdZb3UgY2Fubm90IHNldCBpc1N1cHBvcnRlZCBkaXJlY3RseS4nKVxuXHR9XG5cblx0X2luc3RhbmNlID0gbnVsbFxuXHRfbGlzdGVuZXJzID0gbnVsbFxuXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcblx0XHRjb25zdCBTcGVlY2hSZWNvZ25pdGlvbiA9IFZvY2FsLl9yZXNvbHZlU3BlZWNoUmVjb2duaXRpb24oKVxuXHRcdGlmICghU3BlZWNoUmVjb2duaXRpb24pIHtcblx0XHRcdHRocm93IG5ldyBET01FeGNlcHRpb24oJ1NwZWVjaFJlY29nbml0aW9uIG5vdCBzdXBwb3J0ZWQnLCAnTk9UX1NVUFBPUlRFRF9FUlInKVxuXHRcdH1cblxuXHRcdHRoaXMuX2luc3RhbmNlID0gbmV3IFNwZWVjaFJlY29nbml0aW9uKClcblx0XHR0aGlzLl9saXN0ZW5lcnMgPSB7fVxuXG5cdFx0T2JqZWN0LmVudHJpZXMoe1xuXHRcdFx0Li4uVm9jYWwuZGVmYXVsdE9wdGlvbnMsXG5cdFx0XHQuLi4ob3B0aW9ucyB8fCB7fSksXG5cdFx0fSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG5cdFx0XHRpZiAoa2V5ID09PSAnZ3JhbW1hcnMnICYmICF2YWx1ZSkge1xuXHRcdFx0XHRjb25zdCBTcGVlY2hHcmFtbWFyTGlzdCA9IFZvY2FsLl9yZXNvbHZlU3BlZWNoR3JhbW1hckxpc3QoKVxuXHRcdFx0XHRpZiAoISFTcGVlY2hHcmFtbWFyTGlzdCkge1xuXHRcdFx0XHRcdHZhbHVlID0gbmV3IFNwZWVjaEdyYW1tYXJMaXN0KClcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5faW5zdGFuY2Vba2V5XSA9IHZhbHVlXG5cdFx0fSlcblx0fVxuXG5cdGdldCBpbnN0YW5jZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5faW5zdGFuY2Vcblx0fVxuXG5cdHNldCBpbnN0YW5jZShfKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdZb3UgY2Fubm90IHNldCBpbnN0YW5jZSBkaXJlY3RseS4nKVxuXHR9XG5cblx0YXN5bmMgc3RhcnQoKSB7XG5cdFx0aWYgKCEhdGhpcy5faW5zdGFuY2UpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IHN0cmVhbSA9IGF3YWl0IGdldFVzZXJNZWRpYVN0cmVhbSgnbWljcm9waG9uZScsIHsgYXVkaW86IHRydWUgfSlcblx0XHRcdFx0aWYgKCFzdHJlYW0pIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byByZXRyaWV2ZSB0aGUgc3RyZWFtIGZyb20gbWVkaWEgZGV2aWNlJylcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9pbnN0YW5jZS5zdGFydCgpXG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRjb25zdCBlcnJvckhhbmRsZXIgPSB0aGlzLl9saXN0ZW5lcnMuZXJyb3Jcblx0XHRcdFx0aWYgKCEhZXJyb3JIYW5kbGVyKSB7XG5cdFx0XHRcdFx0ZXJyb3JIYW5kbGVyKGVycm9yKVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXNcblx0fVxuXG5cdHN0b3AoKSB7XG5cdFx0aWYgKCEhdGhpcy5faW5zdGFuY2UpIHtcblx0XHRcdHRoaXMuX2luc3RhbmNlLnN0b3AoKVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzXG5cdH1cblxuXHRhYm9ydCgpIHtcblx0XHRpZiAoISF0aGlzLl9pbnN0YW5jZSkge1xuXHRcdFx0dGhpcy5faW5zdGFuY2UuYWJvcnQoKVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzXG5cdH1cblxuXHRhZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgY2FsbGJhY2spIHtcblx0XHRpZiAoISF0aGlzLl9pbnN0YW5jZSAmJiB0aGlzLl9pbmNsdWRlc0V2ZW50VHlwZShldmVudFR5cGUpKSB7XG5cdFx0XHRpZiAoISF0aGlzLl9saXN0ZW5lcnNbZXZlbnRUeXBlXSkge1xuXHRcdFx0XHR0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlKVxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBoYW5kbGVyID0gKGV2ZW50KSA9PiB7XG5cdFx0XHRcdGxldCBhZGRpdGlvbmFsQXJncyA9IFtdXG5cdFx0XHRcdGlmIChldmVudFR5cGUgPT09IFZvY2FsLmV2ZW50VHlwZXMuUkVTVUxUKSB7XG5cdFx0XHRcdFx0aWYgKCEhZXZlbnQucmVzdWx0cyAmJiBldmVudC5yZXN1bHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdGFkZGl0aW9uYWxBcmdzLnB1c2goZXZlbnQucmVzdWx0c1swXVswXS50cmFuc2NyaXB0KVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdCEhY2FsbGJhY2sgJiYgY2FsbGJhY2suYXBwbHkodGhpcywgW2V2ZW50LCAuLi5hZGRpdGlvbmFsQXJnc10pXG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9pbnN0YW5jZS5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlcilcblxuXHRcdFx0dGhpcy5fbGlzdGVuZXJzW2V2ZW50VHlwZV0gPSBoYW5kbGVyXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXNcblx0fVxuXG5cdHJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlKSB7XG5cdFx0Y29uc3QgaGFuZGxlciA9IHRoaXMuX2xpc3RlbmVyc1tldmVudFR5cGVdXG5cdFx0dGhpcy5faW5zdGFuY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGhhbmRsZXIpXG5cblx0XHRkZWxldGUgdGhpcy5fbGlzdGVuZXJzW2V2ZW50VHlwZV1cblxuXHRcdHJldHVybiB0aGlzXG5cdH1cblxuXHRjbGVhbnVwKCkge1xuXHRcdHRoaXMuc3RvcCgpXG5cblx0XHRPYmplY3Qua2V5cyh0aGlzLl9saXN0ZW5lcnMpLmZvckVhY2goKGtleSkgPT4gdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGtleSkpXG5cdFx0dGhpcy5faW5zdGFuY2UgPSBudWxsXG5cblx0XHRyZXR1cm4gdGhpc1xuXHR9XG5cblx0X2luY2x1ZGVzRXZlbnRUeXBlKGV2ZW50VHlwZSkge1xuXHRcdHJldHVybiAhIU9iamVjdC52YWx1ZXMoVm9jYWwuZXZlbnRUeXBlcykuZmluZCgodHlwZSkgPT4gdHlwZSA9PT0gZXZlbnRUeXBlKVxuXHR9XG5cblx0c3RhdGljIF9yZXNvbHZlU3BlZWNoUmVjb2duaXRpb24oKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdHdpbmRvdy5TcGVlY2hSZWNvZ25pdGlvbiB8fFxuXHRcdFx0d2luZG93LndlYmtpdFNwZWVjaFJlY29nbml0aW9uIHx8XG5cdFx0XHR3aW5kb3cubW96U3BlZWNoUmVjb2duaXRpb24gfHxcblx0XHRcdHdpbmRvdy5tc1NwZWVjaFJlY29nbml0aW9uXG5cdFx0KVxuXHR9XG5cblx0c3RhdGljIF9yZXNvbHZlU3BlZWNoR3JhbW1hckxpc3QoKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdHdpbmRvdy5TcGVlY2hHcmFtbWFyTGlzdCB8fFxuXHRcdFx0d2luZG93LndlYmtpdFNwZWVjaEdyYW1tYXJMaXN0IHx8XG5cdFx0XHR3aW5kb3cubW96U3BlZWNoR3JhbW1hckxpc3QgfHxcblx0XHRcdHdpbmRvdy5tc1NwZWVjaEdyYW1tYXJMaXN0XG5cdFx0KVxuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFZvY2FsXG4iXSwibmFtZXMiOlsicnVudGltZSIsImV4cG9ydHMiLCJPcCIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093biIsImhhc093blByb3BlcnR5IiwiJFN5bWJvbCIsIlN5bWJvbCIsIml0ZXJhdG9yU3ltYm9sIiwiaXRlcmF0b3IiLCJhc3luY0l0ZXJhdG9yU3ltYm9sIiwiYXN5bmNJdGVyYXRvciIsInRvU3RyaW5nVGFnU3ltYm9sIiwidG9TdHJpbmdUYWciLCJkZWZpbmUiLCJvYmoiLCJrZXkiLCJ2YWx1ZSIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiZXJyIiwid3JhcCIsImlubmVyRm4iLCJvdXRlckZuIiwic2VsZiIsInRyeUxvY3NMaXN0IiwicHJvdG9HZW5lcmF0b3IiLCJHZW5lcmF0b3IiLCJnZW5lcmF0b3IiLCJjcmVhdGUiLCJjb250ZXh0IiwiQ29udGV4dCIsIl9pbnZva2UiLCJzdGF0ZSIsIm1ldGhvZCIsImFyZyIsIkVycm9yIiwiZG9uZVJlc3VsdCIsImRlbGVnYXRlIiwiZGVsZWdhdGVSZXN1bHQiLCJtYXliZUludm9rZURlbGVnYXRlIiwiQ29udGludWVTZW50aW5lbCIsInNlbnQiLCJfc2VudCIsImRpc3BhdGNoRXhjZXB0aW9uIiwiYWJydXB0IiwicmVjb3JkIiwidHJ5Q2F0Y2giLCJ0eXBlIiwiZG9uZSIsIm1ha2VJbnZva2VNZXRob2QiLCJmbiIsImNhbGwiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiSXRlcmF0b3JQcm90b3R5cGUiLCJ0aGlzIiwiZ2V0UHJvdG8iLCJnZXRQcm90b3R5cGVPZiIsIk5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlIiwidmFsdWVzIiwiR3AiLCJkZWZpbmVJdGVyYXRvck1ldGhvZHMiLCJmb3JFYWNoIiwiQXN5bmNJdGVyYXRvciIsIlByb21pc2VJbXBsIiwicHJldmlvdXNQcm9taXNlIiwiY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmciLCJyZXNvbHZlIiwicmVqZWN0IiwiaW52b2tlIiwicmVzdWx0IiwiX19hd2FpdCIsInRoZW4iLCJ1bndyYXBwZWQiLCJlcnJvciIsInVuZGVmaW5lZCIsIlR5cGVFcnJvciIsImluZm8iLCJyZXN1bHROYW1lIiwibmV4dCIsIm5leHRMb2MiLCJwdXNoVHJ5RW50cnkiLCJsb2NzIiwiZW50cnkiLCJ0cnlMb2MiLCJjYXRjaExvYyIsImZpbmFsbHlMb2MiLCJhZnRlckxvYyIsInRyeUVudHJpZXMiLCJwdXNoIiwicmVzZXRUcnlFbnRyeSIsImNvbXBsZXRpb24iLCJyZXNldCIsIml0ZXJhYmxlIiwiaXRlcmF0b3JNZXRob2QiLCJpc05hTiIsImxlbmd0aCIsImkiLCJjb25zdHJ1Y3RvciIsImRpc3BsYXlOYW1lIiwiaXNHZW5lcmF0b3JGdW5jdGlvbiIsImdlbkZ1biIsImN0b3IiLCJuYW1lIiwibWFyayIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiYXdyYXAiLCJhc3luYyIsIlByb21pc2UiLCJpdGVyIiwidG9TdHJpbmciLCJrZXlzIiwib2JqZWN0IiwicmV2ZXJzZSIsInBvcCIsInNraXBUZW1wUmVzZXQiLCJwcmV2IiwiY2hhckF0Iiwic2xpY2UiLCJzdG9wIiwicm9vdFJlY29yZCIsInJ2YWwiLCJleGNlcHRpb24iLCJoYW5kbGUiLCJsb2MiLCJjYXVnaHQiLCJoYXNDYXRjaCIsImhhc0ZpbmFsbHkiLCJmaW5hbGx5RW50cnkiLCJjb21wbGV0ZSIsImZpbmlzaCIsImNhdGNoIiwidGhyb3duIiwiZGVsZWdhdGVZaWVsZCIsIm1vZHVsZSIsInJlZ2VuZXJhdG9yUnVudGltZSIsImFjY2lkZW50YWxTdHJpY3RNb2RlIiwiRnVuY3Rpb24iLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJnZW4iLCJfbmV4dCIsIl90aHJvdyIsImFyZ3MiLCJhcmd1bWVudHMiLCJhcHBseSIsImFyciIsIkFycmF5IiwiaXNBcnJheSIsIl9hcnIiLCJfbiIsIl9kIiwiX2UiLCJfcyIsIl9pIiwibGVuIiwiYXJyMiIsIm8iLCJtaW5MZW4iLCJhcnJheUxpa2VUb0FycmF5IiwibiIsImZyb20iLCJ0ZXN0IiwiYXJyYXlXaXRoSG9sZXMiLCJpdGVyYWJsZVRvQXJyYXlMaW1pdCIsInVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5Iiwibm9uSXRlcmFibGVSZXN0IiwiaW5zdGFuY2UiLCJDb25zdHJ1Y3RvciIsIl9kZWZpbmVQcm9wZXJ0aWVzIiwidGFyZ2V0IiwicHJvcHMiLCJkZXNjcmlwdG9yIiwicHJvdG9Qcm9wcyIsInN0YXRpY1Byb3BzIiwiZSIsIm5hdmlnYXRvciIsInBlcm1pc3Npb25zIiwiciIsIm1lZGlhRGV2aWNlcyIsInQiLCJhIiwidSIsImMiLCJyZXR1cm4iLCJET01FeGNlcHRpb24iLCJxdWVyeSIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJhZGRFdmVudExpc3RlbmVyIiwidDAiLCJzIiwiZiIsInAiLCJ0MSIsImdldFVzZXJNZWRpYSIsInQyIiwidDMiLCJhbGwiLCJ0NCIsIlZvY2FsIiwib3B0aW9ucyIsIlNwZWVjaFJlY29nbml0aW9uIiwiX3Jlc29sdmVTcGVlY2hSZWNvZ25pdGlvbiIsIl9pbnN0YW5jZSIsIl9saXN0ZW5lcnMiLCJlbnRyaWVzIiwiZGVmYXVsdE9wdGlvbnMiLCJTcGVlY2hHcmFtbWFyTGlzdCIsIl9yZXNvbHZlU3BlZWNoR3JhbW1hckxpc3QiLCJfdGhpcyIsImlzTmF2aWdhdG9yUGVybWlzc2lvbnNTdXBwb3J0ZWQiLCJpc05hdmlnYXRvck1lZGlhRGV2aWNlc1N1cHBvcnRlZCIsIl8iLCJnZXRVc2VyTWVkaWFTdHJlYW0iLCJhdWRpbyIsInN0YXJ0IiwiZXJyb3JIYW5kbGVyIiwiYWJvcnQiLCJldmVudFR5cGUiLCJjYWxsYmFjayIsIl9pbmNsdWRlc0V2ZW50VHlwZSIsImhhbmRsZXIiLCJldmVudCIsImFkZGl0aW9uYWxBcmdzIiwiZXZlbnRUeXBlcyIsIlJFU1VMVCIsInJlc3VsdHMiLCJ0cmFuc2NyaXB0IiwiX3RoaXMyIiwiX3RoaXMzIiwiZmluZCIsIndpbmRvdyIsIndlYmtpdFNwZWVjaFJlY29nbml0aW9uIiwibW96U3BlZWNoUmVjb2duaXRpb24iLCJtc1NwZWVjaFJlY29nbml0aW9uIiwid2Via2l0U3BlZWNoR3JhbW1hckxpc3QiLCJtb3pTcGVlY2hHcmFtbWFyTGlzdCIsIm1zU3BlZWNoR3JhbW1hckxpc3QiLCJncmFtbWFycyIsImxhbmciLCJjb250aW51b3VzIiwiaW50ZXJpbVJlc3VsdHMiLCJtYXhBbHRlcm5hdGl2ZXMiLCJzZXJ2aWNlVVJJIiwiQVVESU9fRU5EIiwiQVVESU9fU1RBUlQiLCJFTkQiLCJFUlJPUiIsIk5PX01BVENIIiwiU09VTkRfRU5EIiwiU09VTkRfU1RBUlQiLCJTUEVFQ0hfRU5EIiwiU1BFRUNIX1NUQVJUIiwiU1RBUlQiXSwibWFwcGluZ3MiOiI4T0FPQSxJQUFJQSxFQUFXLFNBQVVDLEdBR3ZCLElBQUlDLEVBQUtDLE9BQU9DLFVBQ1pDLEVBQVNILEVBQUdJLGVBRVpDLEVBQTRCLG1CQUFYQyxPQUF3QkEsT0FBUyxHQUNsREMs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\n","//#region src/function/isFunction.ts\nvar e = (e) => typeof e == \"function\";\n//#endregion\nexport { e as isFunction };\n","import { useCallback, useEffect, useRef } from 'react'\nimport { Vocal as SpeechRecognitionWrapper } from '@untemps/vocal'\n\nconst useVocal = (lang = 'en-US', grammars = null, maxAlternatives = 1, __rsInstance = null) => {\n\tconst ref = useRef(null)\n\n\tuseEffect(() => {\n\t\tif (SpeechRecognitionWrapper.isSupported) {\n\t\t\tref.current = __rsInstance || new SpeechRecognitionWrapper({ lang, grammars, maxAlternatives })\n\t\t\treturn () => {\n\t\t\t\tref.current.abort()\n\t\t\t\tref.current.cleanup()\n\t\t\t}\n\t\t}\n\t}, [lang, grammars, maxAlternatives, __rsInstance])\n\n\tconst start = useCallback(() => {\n\t\tif (ref.current) {\n\t\t\tref.current.start()\n\t\t}\n\t}, [])\n\n\tconst stop = useCallback(() => {\n\t\tif (ref.current) {\n\t\t\tref.current.stop()\n\t\t}\n\t}, [])\n\n\tconst abort = useCallback(() => {\n\t\tif (ref.current) {\n\t\t\tref.current.abort()\n\t\t}\n\t}, [])\n\n\tconst subscribe = useCallback((eventType, handler) => {\n\t\tif (ref.current) {\n\t\t\tref.current.addEventListener(eventType, handler)\n\t\t}\n\t}, [])\n\n\tconst unsubscribe = useCallback((eventType, handler) => {\n\t\tif (ref.current) {\n\t\t\tref.current.removeEventListener(eventType, handler)\n\t\t}\n\t}, [])\n\n\tconst clean = useCallback(() => {\n\t\tif (ref.current) {\n\t\t\tref.current.cleanup()\n\t\t}\n\t}, [])\n\n\treturn [ref, { start, stop, abort, subscribe, unsubscribe, clean }]\n}\n\nexport default useVocal\n","import { useCallback, useEffect, useRef } from 'react'\n\nconst useTimeout = (handler, timeout = 0) => {\n\tconst ref = useRef(-1)\n\n\tconst stop = useCallback(() => {\n\t\tclearTimeout(ref.current)\n\t\tref.current = -1\n\t}, [])\n\n\tconst start = useCallback(() => {\n\t\tstop()\n\t\tref.current = setTimeout(handler, timeout)\n\t}, [handler, timeout, stop])\n\n\tuseEffect(() => stop, [stop])\n\n\treturn [start, stop]\n}\n\nexport default useTimeout\n","import { useEffect, useMemo, useRef } from 'react'\n\nconst useCommands = (commands, precision = 0.4) => {\n\tconst normalized = useMemo(\n\t\t() =>\n\t\t\t!!commands\n\t\t\t\t? Object.entries(commands).reduce((acc, [key, value]) => ({ ...acc, [key.toLowerCase()]: value }), {})\n\t\t\t\t: {},\n\t\t[commands]\n\t)\n\n\tconst keys = useMemo(() => Object.keys(normalized), [normalized])\n\n\t// Fuzzy matching is only needed for phrase command keys.\n\t// Single-word keys use exact case-insensitive lookup — simpler and no false positives.\n\tconst hasPhraseKeys = useMemo(() => keys.some((k) => k.includes(' ')), [keys])\n\n\t// Lazy-loaded so consumers using only single-word commands incur no bundle cost.\n\tconst fuseRef = useRef(null)\n\n\tuseEffect(() => {\n\t\tif (!hasPhraseKeys) {\n\t\t\tfuseRef.current = null\n\t\t\treturn\n\t\t}\n\t\timport('fuse.js')\n\t\t\t.then((module) => {\n\t\t\t\tconst Fuse = module.default ?? module\n\t\t\t\tfuseRef.current = new Fuse(keys, { includeScore: true, ignoreLocation: true })\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\tif (process.env.NODE_ENV !== 'production') {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t'[react-vocal] fuse.js is not installed. Phrase command keys will fall back to exact matching. ' +\n\t\t\t\t\t\t\t'Install fuse.js to enable fuzzy matching: npm install fuse.js'\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t})\n\t}, [hasPhraseKeys, keys])\n\n\tconst triggerCommand = (input) => {\n\t\tif (!keys.length) return null\n\n\t\tif (!hasPhraseKeys) {\n\t\t\tconst words = input.trim().split(/\\s+/)\n\t\t\tconst targets = words.length > 1 ? words : [input.trim()]\n\t\t\tfor (const w of targets) {\n\t\t\t\tconst key = w.toLowerCase()\n\t\t\t\tif (key in normalized) return normalized[key]?.(w)\n\t\t\t}\n\t\t\treturn null\n\t\t}\n\n\t\tconst fuse = fuseRef.current\n\t\tif (fuse) {\n\t\t\tconst result = fuse.search(input).filter((r) => r.score < precision)\n\t\t\tif (result?.length) {\n\t\t\t\tconst key = result[0].item.toLowerCase()\n\t\t\t\treturn normalized[key]?.(input)\n\t\t\t}\n\t\t} else {\n\t\t\t// `k.includes(lInput)` can produce false positives when input is short\n\t\t\t// (e.g. \"rouge\" matches \"change en rouge\"). Accepted tradeoff: this branch\n\t\t\t// only runs when fuse.js is absent, so degraded precision is expected.\n\t\t\tconst lInput = input.toLowerCase()\n\t\t\tconst match = keys.find((k) => lInput.includes(k) || k.includes(lInput))\n\t\t\tif (match) return normalized[match]?.(input)\n\t\t}\n\t\treturn null\n\t}\n\n\treturn triggerCommand\n}\n\nexport default useCommands\n","/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import React from 'react'\n\nconst Icon = ({ color = 'black', activeColor = 'red', isActive = false }) => {\n\treturn (\n\t\t<svg\n\t\t\tdata-testid=\"__icon-root__\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\twidth=\"100%\"\n\t\t\theight=\"100%\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t>\n\t\t\t<g>\n\t\t\t\t<path\n\t\t\t\t\tdata-testid=\"__icon-path__\"\n\t\t\t\t\tfill={color}\n\t\t\t\t\td=\"M12 14c1.66 0 2.99-1.34 2.99-3L15 5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3zm5.3-3c0 3-2.54 5.1-5.3 5.1S6.7 14 6.7 11H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c3.28-.48 6-3.3 6-6.72h-1.7z\"\n\t\t\t\t/>\n\t\t\t\t{isActive && <circle data-testid=\"__icon-active__\" fill={activeColor} cx=\"16\" cy=\"4\" r=\"4\" />}\n\t\t\t</g>\n\t\t</svg>\n\t)\n}\n\nexport default Icon\n","import React, { cloneElement, isValidElement, useCallback, useMemo, useRef, useState } from 'react'\nimport { Vocal as SpeechRecognitionWrapper } from '@untemps/vocal'\nimport { isFunction } from '@untemps/utils/function/isFunction'\n\nimport useVocal from '../hooks/useVocal'\nimport useTimeout from '../hooks/useTimeout'\nimport useCommands from '../hooks/useCommands'\n\nimport Icon from './Icon'\n\nconst tryMatchCommand = (segmentData, trigger) => {\n\tfor (const { alternatives } of segmentData) {\n\t\tfor (const a of alternatives) {\n\t\t\tif (trigger(a) !== null) return\n\t\t}\n\t}\n}\n\nconst Vocal = ({\n\tchildren,\n\tcommands = null,\n\tlang = 'en-US',\n\tgrammars = null,\n\ttimeout = 3000,\n\tprecision = 0.4, // Fuse.js score threshold for phrase commands only; single-word commands always use exact lookup\n\tmaxAlternatives = 1,\n\tariaLabel = 'start recognition',\n\tstyle = null,\n\tclassName = null,\n\toutlineStyle = '2px solid',\n\tonStart = null,\n\tonEnd = null,\n\tonSpeechStart = null,\n\tonSpeechEnd = null,\n\tonResult = null,\n\tonError = null,\n\tonNoMatch = null,\n\t__rsInstance,\n}) => {\n\tconst buttonRef = useRef(null)\n\tconst [isListening, setIsListening] = useState(false)\n\n\tconst [, { start, stop, subscribe, unsubscribe }] = useVocal(lang, grammars, maxAlternatives, __rsInstance)\n\tconst triggerCommand = useCommands(commands, precision)\n\n\tconst propsRef = useRef({})\n\tpropsRef.current = { onStart, onEnd, onSpeechStart, onSpeechEnd, onResult, onError, onNoMatch }\n\n\tconst triggerCommandRef = useRef(triggerCommand)\n\ttriggerCommandRef.current = triggerCommand\n\n\tconst unsubscribeAllRef = useRef(null)\n\tconst onEndRef = useRef(null)\n\n\t// Breaks the circular dep: _onEnd → useTimeout(handler) → startTimer captures _onEnd\n\tconst stableTimerCb = useCallback(() => onEndRef.current?.(), [])\n\tconst [startTimer, stopTimer] = useTimeout(stableTimerCb, timeout)\n\n\tconst stopRecognition = useCallback(() => {\n\t\ttry {\n\t\t\tsetIsListening(false)\n\t\t\tstop()\n\t\t} catch (error) {\n\t\t\tpropsRef.current.onError?.(error)\n\t\t\tunsubscribeAllRef.current?.()\n\t\t}\n\t}, [stop])\n\n\tconst _onStart = useCallback(\n\t\t(e) => {\n\t\t\tstartTimer()\n\t\t\tpropsRef.current.onStart?.(e)\n\t\t},\n\t\t[startTimer]\n\t)\n\n\tconst _onSpeechStart = useCallback(\n\t\t(e) => {\n\t\t\tstopTimer()\n\t\t\tpropsRef.current.onSpeechStart?.(e)\n\t\t},\n\t\t[stopTimer]\n\t)\n\n\tconst _onSpeechEnd = useCallback(\n\t\t(e) => {\n\t\t\tstartTimer()\n\t\t\tpropsRef.current.onSpeechEnd?.(e)\n\t\t},\n\t\t[startTimer]\n\t)\n\n\tconst _onResult = useCallback(\n\t\t(event) => {\n\t\t\tconst segmentData = Array.from(event?.results ?? [], (segment) => {\n\t\t\t\tlet best = { confidence: -Infinity, transcript: '' }\n\t\t\t\tconst alternatives = []\n\t\t\t\tfor (let j = 0; j < segment.length; j++) {\n\t\t\t\t\tconst alt = segment[j]\n\t\t\t\t\talternatives.push(alt.transcript ?? '')\n\t\t\t\t\tif (alt.confidence === undefined || alt.confidence > best.confidence) {\n\t\t\t\t\t\tbest = alt\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn { best: best.transcript ?? '', alternatives }\n\t\t\t})\n\t\t\tconst transcript = segmentData.map((s) => s.best).join('')\n\n\t\t\tstopTimer()\n\t\t\tstopRecognition()\n\t\t\ttryMatchCommand(segmentData, triggerCommandRef.current)\n\t\t\tpropsRef.current.onResult?.(transcript, event)\n\t\t},\n\t\t[stopTimer, stopRecognition]\n\t)\n\n\tconst _onError = useCallback(\n\t\t(error) => {\n\t\t\tstopRecognition()\n\t\t\tpropsRef.current.onError?.(error)\n\t\t},\n\t\t[stopRecognition]\n\t)\n\n\tconst _onNoMatch = useCallback(\n\t\t(e) => {\n\t\t\tstopTimer()\n\t\t\tstopRecognition()\n\t\t\tpropsRef.current.onNoMatch?.(e)\n\t\t},\n\t\t[stopTimer, stopRecognition]\n\t)\n\n\tconst _onEnd = useCallback(\n\t\t(e) => {\n\t\t\tstopTimer()\n\t\t\ttry {\n\t\t\t\tstopRecognition()\n\t\t\t\tunsubscribeAllRef.current?.()\n\t\t\t} finally {\n\t\t\t\tpropsRef.current.onEnd?.(e)\n\t\t\t}\n\t\t},\n\t\t[stopTimer, stopRecognition]\n\t)\n\n\tonEndRef.current = _onEnd\n\n\tconst HANDLERS = useMemo(\n\t\t() => ({\n\t\t\tstart: _onStart,\n\t\t\tend: _onEnd,\n\t\t\tspeechstart: _onSpeechStart,\n\t\t\tspeechend: _onSpeechEnd,\n\t\t\tresult: _onResult,\n\t\t\terror: _onError,\n\t\t\tnomatch: _onNoMatch,\n\t\t}),\n\t\t[_onStart, _onEnd, _onSpeechStart, _onSpeechEnd, _onResult, _onError, _onNoMatch]\n\t)\n\n\t// Assigned inline (not in useEffect) so it's ready before any event fires\n\tunsubscribeAllRef.current = () => Object.entries(HANDLERS).forEach(([event, fn]) => unsubscribe?.(event, fn))\n\n\tconst startRecognition = useCallback(() => {\n\t\ttry {\n\t\t\tsetIsListening(true)\n\t\t\tObject.entries(HANDLERS).forEach(([event, fn]) => subscribe(event, fn))\n\t\t\tstart()\n\t\t} catch (error) {\n\t\t\t_onError(error)\n\t\t}\n\t}, [HANDLERS, subscribe, start, _onError])\n\n\tconst _onFocus = () => {\n\t\tif (!className && outlineStyle) {\n\t\t\tbuttonRef.current.style.outline = outlineStyle\n\t\t}\n\t}\n\n\tconst _onBlur = () => {\n\t\tif (!className && outlineStyle) {\n\t\t\tbuttonRef.current.style.outline = 'none'\n\t\t}\n\t}\n\n\tconst _renderDefault = () => (\n\t\t<button\n\t\t\tdata-testid=\"__vocal-root__\"\n\t\t\tref={buttonRef}\n\t\t\trole=\"button\"\n\t\t\taria-label={ariaLabel}\n\t\t\tstyle={\n\t\t\t\tclassName\n\t\t\t\t\t? null\n\t\t\t\t\t: {\n\t\t\t\t\t\t\twidth: 24,\n\t\t\t\t\t\t\theight: 24,\n\t\t\t\t\t\t\tbackgroundColor: 'transparent', // `background: none` shorthand resets all sub-properties; jsdom 29 + jest-dom v6 don't reflect that correctly via getComputedStyle\n\t\t\t\t\t\t\tborder: 'none',\n\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\tcursor: !isListening ? 'pointer' : 'default',\n\t\t\t\t\t\t\t...style,\n\t\t\t\t\t }\n\t\t\t}\n\t\t\tclassName={className}\n\t\t\tonFocus={_onFocus}\n\t\t\tonBlur={_onBlur}\n\t\t\tonClick={startRecognition}\n\t\t>\n\t\t\t<Icon isActive={isListening} color=\"#aaa\" />\n\t\t</button>\n\t)\n\n\tconst _renderChildren = () => {\n\t\tif (SpeechRecognitionWrapper.isSupported) {\n\t\t\tif (isFunction(children)) {\n\t\t\t\treturn children(startRecognition, stopRecognition, isListening)\n\t\t\t} else if (isValidElement(children)) {\n\t\t\t\treturn cloneElement(children, {\n\t\t\t\t\t...(!isListening && { onClick: startRecognition }),\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\treturn _renderDefault()\n\t\t\t}\n\t\t}\n\t\treturn null\n\t}\n\n\treturn _renderChildren()\n}\n\nexport default Vocal\n","import Vocal from './components/Vocal'\nimport { Vocal as SpeechRecognitionWrapper } from '@untemps/vocal'\n\nexport { default as useVocal } from './hooks/useVocal'\nexport const isSupported = SpeechRecognitionWrapper.isSupported\n\nexport default Vocal\n"],"x_google_ignoreList":[0,1,5,6,7],"mappings":"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"}
|
package/src/components/Icon.jsx
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
|
|
3
|
-
const Icon = ({ color = 'black', activeColor = 'red', isActive = false }) => {
|
|
4
|
-
return (
|
|
5
|
-
<svg
|
|
6
|
-
data-testid="__icon-root__"
|
|
7
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
8
|
-
width="100%"
|
|
9
|
-
height="100%"
|
|
10
|
-
viewBox="0 0 24 24"
|
|
11
|
-
>
|
|
12
|
-
<g>
|
|
13
|
-
<path
|
|
14
|
-
data-testid="__icon-path__"
|
|
15
|
-
fill={color}
|
|
16
|
-
d="M12 14c1.66 0 2.99-1.34 2.99-3L15 5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3zm5.3-3c0 3-2.54 5.1-5.3 5.1S6.7 14 6.7 11H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c3.28-.48 6-3.3 6-6.72h-1.7z"
|
|
17
|
-
/>
|
|
18
|
-
{isActive && <circle data-testid="__icon-active__" fill={activeColor} cx="16" cy="4" r="4" />}
|
|
19
|
-
</g>
|
|
20
|
-
</svg>
|
|
21
|
-
)
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export default Icon
|
package/src/components/Vocal.jsx
DELETED
|
@@ -1,233 +0,0 @@
|
|
|
1
|
-
import React, { cloneElement, isValidElement, useCallback, useMemo, useRef, useState } from 'react'
|
|
2
|
-
import { Vocal as SpeechRecognitionWrapper } from '@untemps/vocal'
|
|
3
|
-
import { isFunction } from '@untemps/utils/function/isFunction'
|
|
4
|
-
|
|
5
|
-
import useVocal from '../hooks/useVocal'
|
|
6
|
-
import useTimeout from '../hooks/useTimeout'
|
|
7
|
-
import useCommands from '../hooks/useCommands'
|
|
8
|
-
|
|
9
|
-
import Icon from './Icon'
|
|
10
|
-
|
|
11
|
-
const tryMatchCommand = (segmentData, trigger) => {
|
|
12
|
-
for (const { alternatives } of segmentData) {
|
|
13
|
-
for (const a of alternatives) {
|
|
14
|
-
if (trigger(a) !== null) return
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const Vocal = ({
|
|
20
|
-
children,
|
|
21
|
-
commands = null,
|
|
22
|
-
lang = 'en-US',
|
|
23
|
-
grammars = null,
|
|
24
|
-
timeout = 3000,
|
|
25
|
-
precision = 0.4, // Fuse.js score threshold for phrase commands only; single-word commands always use exact lookup
|
|
26
|
-
maxAlternatives = 1,
|
|
27
|
-
ariaLabel = 'start recognition',
|
|
28
|
-
style = null,
|
|
29
|
-
className = null,
|
|
30
|
-
outlineStyle = '2px solid',
|
|
31
|
-
onStart = null,
|
|
32
|
-
onEnd = null,
|
|
33
|
-
onSpeechStart = null,
|
|
34
|
-
onSpeechEnd = null,
|
|
35
|
-
onResult = null,
|
|
36
|
-
onError = null,
|
|
37
|
-
onNoMatch = null,
|
|
38
|
-
__rsInstance,
|
|
39
|
-
}) => {
|
|
40
|
-
const buttonRef = useRef(null)
|
|
41
|
-
const [isListening, setIsListening] = useState(false)
|
|
42
|
-
|
|
43
|
-
const [, { start, stop, subscribe, unsubscribe }] = useVocal(lang, grammars, maxAlternatives, __rsInstance)
|
|
44
|
-
const triggerCommand = useCommands(commands, precision)
|
|
45
|
-
|
|
46
|
-
const propsRef = useRef({})
|
|
47
|
-
propsRef.current = { onStart, onEnd, onSpeechStart, onSpeechEnd, onResult, onError, onNoMatch }
|
|
48
|
-
|
|
49
|
-
const triggerCommandRef = useRef(triggerCommand)
|
|
50
|
-
triggerCommandRef.current = triggerCommand
|
|
51
|
-
|
|
52
|
-
const unsubscribeAllRef = useRef(null)
|
|
53
|
-
const onEndRef = useRef(null)
|
|
54
|
-
|
|
55
|
-
// Breaks the circular dep: _onEnd → useTimeout(handler) → startTimer captures _onEnd
|
|
56
|
-
const stableTimerCb = useCallback(() => onEndRef.current?.(), [])
|
|
57
|
-
const [startTimer, stopTimer] = useTimeout(stableTimerCb, timeout)
|
|
58
|
-
|
|
59
|
-
const stopRecognition = useCallback(() => {
|
|
60
|
-
try {
|
|
61
|
-
setIsListening(false)
|
|
62
|
-
stop()
|
|
63
|
-
} catch (error) {
|
|
64
|
-
propsRef.current.onError?.(error)
|
|
65
|
-
unsubscribeAllRef.current?.()
|
|
66
|
-
}
|
|
67
|
-
}, [stop])
|
|
68
|
-
|
|
69
|
-
const _onStart = useCallback(
|
|
70
|
-
(e) => {
|
|
71
|
-
startTimer()
|
|
72
|
-
propsRef.current.onStart?.(e)
|
|
73
|
-
},
|
|
74
|
-
[startTimer]
|
|
75
|
-
)
|
|
76
|
-
|
|
77
|
-
const _onSpeechStart = useCallback(
|
|
78
|
-
(e) => {
|
|
79
|
-
stopTimer()
|
|
80
|
-
propsRef.current.onSpeechStart?.(e)
|
|
81
|
-
},
|
|
82
|
-
[stopTimer]
|
|
83
|
-
)
|
|
84
|
-
|
|
85
|
-
const _onSpeechEnd = useCallback(
|
|
86
|
-
(e) => {
|
|
87
|
-
startTimer()
|
|
88
|
-
propsRef.current.onSpeechEnd?.(e)
|
|
89
|
-
},
|
|
90
|
-
[startTimer]
|
|
91
|
-
)
|
|
92
|
-
|
|
93
|
-
const _onResult = useCallback(
|
|
94
|
-
(event) => {
|
|
95
|
-
const segmentData = Array.from(event?.results ?? [], (segment) => {
|
|
96
|
-
let best = { confidence: -Infinity, transcript: '' }
|
|
97
|
-
const alternatives = []
|
|
98
|
-
for (let j = 0; j < segment.length; j++) {
|
|
99
|
-
const alt = segment[j]
|
|
100
|
-
alternatives.push(alt.transcript ?? '')
|
|
101
|
-
if (alt.confidence === undefined || alt.confidence > best.confidence) {
|
|
102
|
-
best = alt
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
return { best: best.transcript ?? '', alternatives }
|
|
106
|
-
})
|
|
107
|
-
const transcript = segmentData.map((s) => s.best).join('')
|
|
108
|
-
|
|
109
|
-
stopTimer()
|
|
110
|
-
stopRecognition()
|
|
111
|
-
tryMatchCommand(segmentData, triggerCommandRef.current)
|
|
112
|
-
propsRef.current.onResult?.(transcript, event)
|
|
113
|
-
},
|
|
114
|
-
[stopTimer, stopRecognition]
|
|
115
|
-
)
|
|
116
|
-
|
|
117
|
-
const _onError = useCallback(
|
|
118
|
-
(error) => {
|
|
119
|
-
stopRecognition()
|
|
120
|
-
propsRef.current.onError?.(error)
|
|
121
|
-
},
|
|
122
|
-
[stopRecognition]
|
|
123
|
-
)
|
|
124
|
-
|
|
125
|
-
const _onNoMatch = useCallback(
|
|
126
|
-
(e) => {
|
|
127
|
-
stopTimer()
|
|
128
|
-
stopRecognition()
|
|
129
|
-
propsRef.current.onNoMatch?.(e)
|
|
130
|
-
},
|
|
131
|
-
[stopTimer, stopRecognition]
|
|
132
|
-
)
|
|
133
|
-
|
|
134
|
-
const _onEnd = useCallback(
|
|
135
|
-
(e) => {
|
|
136
|
-
stopTimer()
|
|
137
|
-
try {
|
|
138
|
-
stopRecognition()
|
|
139
|
-
unsubscribeAllRef.current?.()
|
|
140
|
-
} finally {
|
|
141
|
-
propsRef.current.onEnd?.(e)
|
|
142
|
-
}
|
|
143
|
-
},
|
|
144
|
-
[stopTimer, stopRecognition]
|
|
145
|
-
)
|
|
146
|
-
|
|
147
|
-
onEndRef.current = _onEnd
|
|
148
|
-
|
|
149
|
-
const HANDLERS = useMemo(
|
|
150
|
-
() => ({
|
|
151
|
-
start: _onStart,
|
|
152
|
-
end: _onEnd,
|
|
153
|
-
speechstart: _onSpeechStart,
|
|
154
|
-
speechend: _onSpeechEnd,
|
|
155
|
-
result: _onResult,
|
|
156
|
-
error: _onError,
|
|
157
|
-
nomatch: _onNoMatch,
|
|
158
|
-
}),
|
|
159
|
-
[_onStart, _onEnd, _onSpeechStart, _onSpeechEnd, _onResult, _onError, _onNoMatch]
|
|
160
|
-
)
|
|
161
|
-
|
|
162
|
-
// Assigned inline (not in useEffect) so it's ready before any event fires
|
|
163
|
-
unsubscribeAllRef.current = () => Object.entries(HANDLERS).forEach(([event, fn]) => unsubscribe?.(event, fn))
|
|
164
|
-
|
|
165
|
-
const startRecognition = useCallback(() => {
|
|
166
|
-
try {
|
|
167
|
-
setIsListening(true)
|
|
168
|
-
Object.entries(HANDLERS).forEach(([event, fn]) => subscribe(event, fn))
|
|
169
|
-
start()
|
|
170
|
-
} catch (error) {
|
|
171
|
-
_onError(error)
|
|
172
|
-
}
|
|
173
|
-
}, [HANDLERS, subscribe, start, _onError])
|
|
174
|
-
|
|
175
|
-
const _onFocus = () => {
|
|
176
|
-
if (!className && outlineStyle) {
|
|
177
|
-
buttonRef.current.style.outline = outlineStyle
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
const _onBlur = () => {
|
|
182
|
-
if (!className && outlineStyle) {
|
|
183
|
-
buttonRef.current.style.outline = 'none'
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
const _renderDefault = () => (
|
|
188
|
-
<button
|
|
189
|
-
data-testid="__vocal-root__"
|
|
190
|
-
ref={buttonRef}
|
|
191
|
-
role="button"
|
|
192
|
-
aria-label={ariaLabel}
|
|
193
|
-
style={
|
|
194
|
-
className
|
|
195
|
-
? null
|
|
196
|
-
: {
|
|
197
|
-
width: 24,
|
|
198
|
-
height: 24,
|
|
199
|
-
backgroundColor: 'transparent', // `background: none` shorthand resets all sub-properties; jsdom 29 + jest-dom v6 don't reflect that correctly via getComputedStyle
|
|
200
|
-
border: 'none',
|
|
201
|
-
padding: 0,
|
|
202
|
-
cursor: !isListening ? 'pointer' : 'default',
|
|
203
|
-
...style,
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
className={className}
|
|
207
|
-
onFocus={_onFocus}
|
|
208
|
-
onBlur={_onBlur}
|
|
209
|
-
onClick={startRecognition}
|
|
210
|
-
>
|
|
211
|
-
<Icon isActive={isListening} color="#aaa" />
|
|
212
|
-
</button>
|
|
213
|
-
)
|
|
214
|
-
|
|
215
|
-
const _renderChildren = () => {
|
|
216
|
-
if (SpeechRecognitionWrapper.isSupported) {
|
|
217
|
-
if (isFunction(children)) {
|
|
218
|
-
return children(startRecognition, stopRecognition, isListening)
|
|
219
|
-
} else if (isValidElement(children)) {
|
|
220
|
-
return cloneElement(children, {
|
|
221
|
-
...(!isListening && { onClick: startRecognition }),
|
|
222
|
-
})
|
|
223
|
-
} else {
|
|
224
|
-
return _renderDefault()
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
return null
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
return _renderChildren()
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
export default Vocal
|