@untemps/vocal 1.2.1 → 1.3.1

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 CHANGED
@@ -1,3 +1,12 @@
1
+ ## [1.3.1](https://github.com/untemps/vocal/compare/v1.3.0...v1.3.1) (2026-05-15)
2
+
3
+ # [1.3.0](https://github.com/untemps/vocal/compare/v1.2.1...v1.3.0) (2021-05-24)
4
+
5
+
6
+ ### Features
7
+
8
+ * Improve isSupported getter by checking navigator.permissions and navigator.mediaDevices support ([#11](https://github.com/untemps/vocal/issues/11)) ([ddb67ac](https://github.com/untemps/vocal/commit/ddb67ac039743f0c658bb68a787bf6c4b21ae0f2))
9
+
1
10
  ## [1.2.1](https://github.com/untemps/vocal/compare/v1.2.0...v1.2.1) (2021-05-23)
2
11
 
3
12
  # [1.2.0](https://github.com/untemps/vocal/compare/v1.1.1...v1.2.0) (2021-05-23)
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  Class wrapped around the SpeechRecognition Web API
4
4
 
5
5
  ![npm](https://img.shields.io/npm/v/@untemps/vocal?style=for-the-badge)
6
- ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/untemps/vocal/deploy?style=for-the-badge)
6
+ ![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/untemps/vocal/publish.yml?style=for-the-badge)
7
7
  ![Codecov](https://img.shields.io/codecov/c/github/untemps/vocal?style=for-the-badge)
8
8
 
9
9
  ## Installation
@@ -12,10 +12,73 @@ Class wrapped around the SpeechRecognition Web API
12
12
  yarn add @untemps/vocal
13
13
  ```
14
14
 
15
- ## Usage
15
+ ## Basic Usage
16
16
 
17
- Import `Vocal`:
17
+ Import `Vocal` to a file.
18
18
 
19
19
  ```javascript
20
20
  import { Vocal } from '@untemps/vocal'
21
+
22
+ // Check whether SpeechRecognition, Permissions and MediaDevices interfaces are supported
23
+ if (!Vocal.isSupported()) {
24
+ throw "Vocal is not supported"
25
+ return;
26
+ }
27
+
28
+ // Create a Vocal instance (see below for all available option properties)
29
+ const options = {
30
+ lang: 'fr-FR',
31
+ }
32
+ const vocal = new Vocal(options)
33
+
34
+ // Subscribe to Vocal instance events (see below for all available events)
35
+ vocal.addEventListener('speechstart', (event) => console.log('Vocal starts recording'))
36
+ vocal.addEventListener('speechend', (event) => console.log('Vocal stops recording'))
37
+ vocal.addEventListener('result', (event, result) => console.log('Vocal catches a result'))
38
+ vocal.addEventListener('error', (error) => throw error)
39
+
40
+ // Start recording
41
+ vocal.start()
42
+
43
+ // Stop/Pause recording
44
+ vocal.stop()
45
+
46
+ // Abort recording entirely
47
+ vocal.abort()
48
+
49
+ // Remove all attached listeners and delete the Vocal instance
50
+ vocal.cleanup()
21
51
  ```
52
+
53
+ ## Options
54
+
55
+ Options described below are those from the `SpeechRecognition` Web API.
56
+ Please this [this section](https://developer.mozilla.org/en-US/docs/Web/API/SpeechRecognition#properties) for more information.
57
+
58
+ | Option | Type | Default | Description |
59
+ | ---------------- | ----------------- | ---------- | ----------------------------------------------------------------------------------------------------------------- |
60
+ | grammars | SpeechGrammarList | null | Grammars understood by the recognition [JSpeech Grammar Format](https://www.w3.org/TR/jsgf/) |
61
+ | lang | string | 'en-US' | Language understood by the recognition [BCP 47 language tag](https://tools.ietf.org/html/bcp47) |
62
+ | continuous | boolean | false | Whether continuous results are returned for each recognition, or only a single result |
63
+ | interimResults | boolean | false | Whether interim results should be returned or not. Interim results are results that are not yet final |
64
+ | maxAlternatives | number | 1 | Maximum number of SpeechRecognitionAlternatives provided per result |
65
+ | serviceURI | string | null | Location of the speech recognition service used by the current SpeechRecognition to handle the actual recognition |
66
+
67
+ ## Events
68
+
69
+ Events described below are those from the `SpeechRecognition` Web API.
70
+ Please this [this section](https://developer.mozilla.org/en-US/docs/Web/API/SpeechRecognition#events) for more information.
71
+
72
+ | Event | Description |
73
+ | ----------- | ----------------------------------------------------------------------------------------- |
74
+ | audioend | Fired when the user agent has finished capturing audio for recognition |
75
+ | audiostart | Fired when the user agent has started to capture audio for recognition |
76
+ | end | Fired when the recognition service has disconnected |
77
+ | error | Fired when a recognition error occurs |
78
+ | nomatch | Fired when the recognition service returns a final result with no significant recognition |
79
+ | result | Fired when the recognition service returns a result |
80
+ | soundend | Fired when any sound — recognisable or not — has stopped being detected |
81
+ | soundstart | Fired when any sound — recognisable or not — has been detected |
82
+ | speechend | Fired when speech recognized by the recognition service has stopped being detected |
83
+ | speechstart | Fired when sound recognized by the recognition service as speech has been detected |
84
+ | start | fired when the recognition service has begun listening to incoming audio |
package/dist/index.es.js CHANGED
@@ -1,2 +1,100 @@
1
- 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 x(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(_([])));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 x(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(E,this),this.reset(!0)}function _(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:x,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:_(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};function p(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 v(t){return function(){var e=this,r=arguments;return new Promise((function(n,o){var i=t.apply(e,r);function a(t){p(i,n,o,a,c,"next",t)}function c(t){p(i,n,o,a,c,"throw",t)}a(void 0)}))}}function y(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 d(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)?d(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 d(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 m=function(){var t=v(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=v(regeneratorRuntime.mark((function t(r,n){var o,i;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(navigator.permissions){t.next=4;break}n(new DOMException("Permissions not supported","NOT_SUPPORTED_ERR")),t.next=16;break;case 4:return t.prev=4,t.next=7,navigator.permissions.query({name:e});case 7:o=t.sent,i=function t(e){o.removeEventListener("change",t),g(e.target.state,r,n)},o.addEventListener("change",i),g(o.state,r,n),t.next=16;break;case 13:t.prev=13,t.t0=t.catch(4),n(t.t0);case 16:case"end":return t.stop()}}),t,null,[[4,13]])})));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)}}(),g=function(t,e,r){switch(t){case"denied":r(new DOMException("Permission denied","NOT_ALLOWED_ERR"));break;default:e(t)}},w=function(){var t=v(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=v(regeneratorRuntime.mark((function t(n,o){var i,a,c;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(navigator.mediaDevices){t.next=4;break}o(new DOMException("MediaDevices not supported","NOT_FOUND_ERR")),t.next=24;break;case 4:return t.prev=4,t.t0=Promise,t.next=8,m(e);case 8:return t.t1=t.sent,t.next=11,navigator.mediaDevices.getUserMedia(r);case 11:return t.t2=t.sent,t.t3=[t.t1,t.t2],t.next=15,t.t0.all.call(t.t0,t.t3);case 15:i=t.sent,a=y(i,2),c=a[1],n(c),t.next=24;break;case 21:t.prev=21,t.t4=t.catch(4),o(t.t4);case 24:case"end":return t.stop()}}),t,null,[[4,21]])})));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 b(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 E(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?b(Object(r),!0).forEach((function(e){h(t,e,r[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):b(Object(r)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}))}return t}var O=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(E({},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()},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,w("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(O,"defaultOptions",{grammars:null,lang:"en-US",continuous:!1,interimResults:!1,maxAlternatives:1,serviceURI:null}),h(O,"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{O as Vocal};
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXMuanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy9yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXJyYXlXaXRoSG9sZXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5TGlrZVRvQXJyYXkuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL25vbkl0ZXJhYmxlUmVzdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXkuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjay5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkuanMiLCIuLi9ub2RlX21vZHVsZXMvQHVudGVtcHMvdXNlci1wZXJtaXNzaW9ucy11dGlscy9kaXN0L2luZGV4LmVzLmpzIiwiLi4vc3JjL1ZvY2FsLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxudmFyIHJ1bnRpbWUgPSAoZnVuY3Rpb24gKGV4cG9ydHMpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgdmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xuICB2YXIgdW5kZWZpbmVkOyAvLyBNb3JlIGNvbXByZXNzaWJsZSB0aGFuIHZvaWQgMC5cbiAgdmFyICRTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgPyBTeW1ib2wgOiB7fTtcbiAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIjtcbiAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIjtcbiAgdmFyIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcblxuICBmdW5jdGlvbiBkZWZpbmUob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gb2JqW2tleV07XG4gIH1cbiAgdHJ5IHtcbiAgICAvLyBJRSA4IGhhcyBhIGJyb2tlbiBPYmplY3QuZGVmaW5lUHJvcGVydHkgdGhhdCBvbmx5IHdvcmtzIG9uIERPTSBvYmplY3RzLlxuICAgIGRlZmluZSh7fSwgXCJcIik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGRlZmluZSA9IGZ1bmN0aW9uKG9iaiwga2V5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG9ialtrZXldID0gdmFsdWU7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkIGFuZCBvdXRlckZuLnByb3RvdHlwZSBpcyBhIEdlbmVyYXRvciwgdGhlbiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvci5cbiAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjtcbiAgICB2YXIgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuXG4gICAgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcy5cbiAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG4gIGV4cG9ydHMud3JhcCA9IHdyYXA7XG5cbiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uXG4gIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmVcbiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmdcbiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWVcbiAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2hcbiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLlxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9IFwic3VzcGVuZGVkWWllbGRcIjtcbiAgdmFyIEdlblN0YXRlRXhlY3V0aW5nID0gXCJleGVjdXRpbmdcIjtcbiAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcblxuICAvLyBSZXR1cm5pbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgaW5uZXJGbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzXG4gIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICAvLyBEdW1teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmRcbiAgLy8gLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gR2VuZXJhdG9yXG4gIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuXG4gIC8vIFRoaXMgaXMgYSBwb2x5ZmlsbCBmb3IgJUl0ZXJhdG9yUHJvdG90eXBlJSBmb3IgZW52aXJvbm1lbnRzIHRoYXRcbiAgLy8gZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdC5cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIEl0ZXJhdG9yUHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICB2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4gIHZhciBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTtcbiAgaWYgKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmXG4gICAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiZcbiAgICAgIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkpIHtcbiAgICAvLyBUaGlzIGVudmlyb25tZW50IGhhcyBhIG5hdGl2ZSAlSXRlcmF0b3JQcm90b3R5cGUlOyB1c2UgaXQgaW5zdGVhZFxuICAgIC8vIG9mIHRoZSBwb2x5ZmlsbC5cbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG5cbiAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID1cbiAgICBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdwLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb247XG4gIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gZGVmaW5lKFxuICAgIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLFxuICAgIHRvU3RyaW5nVGFnU3ltYm9sLFxuICAgIFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICApO1xuXG4gIC8vIEhlbHBlciBmb3IgZGVmaW5pbmcgdGhlIC5uZXh0LCAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMgb2YgdGhlXG4gIC8vIEl0ZXJhdG9yIGludGVyZmFjZSBpbiB0ZXJtcyBvZiBhIHNpbmdsZSAuX2ludm9rZSBtZXRob2QuXG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgIGRlZmluZShwcm90b3R5cGUsIG1ldGhvZCwgZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3JcbiAgICAgID8gY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHxcbiAgICAgICAgLy8gRm9yIHRoZSBuYXRpdmUgR2VuZXJhdG9yRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuXG4gICAgICAgIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgPT09IFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICAgICAgOiBmYWxzZTtcbiAgfTtcblxuICBleHBvcnRzLm1hcmsgPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgICAgIGRlZmluZShnZW5GdW4sIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvckZ1bmN0aW9uXCIpO1xuICAgIH1cbiAgICBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCk7XG4gICAgcmV0dXJuIGdlbkZ1bjtcbiAgfTtcblxuICAvLyBXaXRoaW4gdGhlIGJvZHkgb2YgYW55IGFzeW5jIGZ1bmN0aW9uLCBgYXdhaXQgeGAgaXMgdHJhbnNmb3JtZWQgdG9cbiAgLy8gYHlpZWxkIHJlZ2VuZXJhdG9yUnVudGltZS5hd3JhcCh4KWAsIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIHRlc3RcbiAgLy8gYGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIilgIHRvIGRldGVybWluZSBpZiB0aGUgeWllbGRlZCB2YWx1ZSBpc1xuICAvLyBtZWFudCB0byBiZSBhd2FpdGVkLlxuICBleHBvcnRzLmF3cmFwID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHsgX19hd2FpdDogYXJnIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7XG4gICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpO1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmc7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIikpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZS5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJuZXh0XCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24odW53cmFwcGVkKSB7XG4gICAgICAgICAgLy8gV2hlbiBhIHlpZWxkZWQgUHJvbWlzZSBpcyByZXNvbHZlZCwgaXRzIGZpbmFsIHZhbHVlIGJlY29tZXNcbiAgICAgICAgICAvLyB0aGUgLnZhbHVlIG9mIHRoZSBQcm9taXNlPHt2YWx1ZSxkb25lfT4gcmVzdWx0IGZvciB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IGl0ZXJhdGlvbi5cbiAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQ7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgIC8vIElmIGEgcmVqZWN0ZWQgUHJvbWlzZSB3YXMgeWllbGRlZCwgdGhyb3cgdGhlIHJlamVjdGlvbiBiYWNrXG4gICAgICAgICAgLy8gaW50byB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIHNvIGl0IGNhbiBiZSBoYW5kbGVkIHRoZXJlLlxuICAgICAgICAgIHJldHVybiBpbnZva2UoXCJ0aHJvd1wiLCBlcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzUHJvbWlzZTtcblxuICAgIGZ1bmN0aW9uIGVucXVldWUobWV0aG9kLCBhcmcpIHtcbiAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2VJbXBsKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPVxuICAgICAgICAvLyBJZiBlbnF1ZXVlIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byB3YWl0IHVudGlsXG4gICAgICAgIC8vIGFsbCBwcmV2aW91cyBQcm9taXNlcyBoYXZlIGJlZW4gcmVzb2x2ZWQgYmVmb3JlIGNhbGxpbmcgaW52b2tlLFxuICAgICAgICAvLyBzbyB0aGF0IHJlc3VsdHMgYXJlIGFsd2F5cyBkZWxpdmVyZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIElmXG4gICAgICAgIC8vIGVucXVldWUgaGFzIG5vdCBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRvXG4gICAgICAgIC8vIGNhbGwgaW52b2tlIGltbWVkaWF0ZWx5LCB3aXRob3V0IHdhaXRpbmcgb24gYSBjYWxsYmFjayB0byBmaXJlLFxuICAgICAgICAvLyBzbyB0aGF0IHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gaGFzIHRoZSBvcHBvcnR1bml0eSB0byBkb1xuICAgICAgICAvLyBhbnkgbmVjZXNzYXJ5IHNldHVwIGluIGEgcHJlZGljdGFibGUgd2F5LiBUaGlzIHByZWRpY3RhYmlsaXR5XG4gICAgICAgIC8vIGlzIHdoeSB0aGUgUHJvbWlzZSBjb25zdHJ1Y3RvciBzeW5jaHJvbm91c2x5IGludm9rZXMgaXRzXG4gICAgICAgIC8vIGV4ZWN1dG9yIGNhbGxiYWNrLCBhbmQgd2h5IGFzeW5jIGZ1bmN0aW9ucyBzeW5jaHJvbm91c2x5XG4gICAgICAgIC8vIGV4ZWN1dGUgY29kZSBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0LiBTaW5jZSB3ZSBpbXBsZW1lbnQgc2ltcGxlXG4gICAgICAgIC8vIGFzeW5jIGZ1bmN0aW9ucyBpbiB0ZXJtcyBvZiBhc3luYyBnZW5lcmF0b3JzLCBpdCBpcyBlc3BlY2lhbGx5XG4gICAgICAgIC8vIGltcG9ydGFudCB0byBnZXQgdGhpcyByaWdodCwgZXZlbiB0aG91Z2ggaXQgcmVxdWlyZXMgY2FyZS5cbiAgICAgICAgcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsXG4gICAgICAgICAgLy8gQXZvaWQgcHJvcGFnYXRpbmcgZmFpbHVyZXMgdG8gUHJvbWlzZXMgcmV0dXJuZWQgYnkgbGF0ZXJcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBvZiB0aGUgaXRlcmF0b3IuXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmdcbiAgICAgICAgKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7XG4gICAgfVxuXG4gICAgLy8gRGVmaW5lIHRoZSB1bmlmaWVkIGhlbHBlciBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGltcGxlbWVudCAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIChzZWUgZGVmaW5lSXRlcmF0b3JNZXRob2RzKS5cbiAgICB0aGlzLl9pbnZva2UgPSBlbnF1ZXVlO1xuICB9XG5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKTtcbiAgQXN5bmNJdGVyYXRvci5wcm90b3R5cGVbYXN5bmNJdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIGV4cG9ydHMuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3I7XG5cbiAgLy8gTm90ZSB0aGF0IHNpbXBsZSBhc3luYyBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZlxuICAvLyBBc3luY0l0ZXJhdG9yIG9iamVjdHM7IHRoZXkganVzdCByZXR1cm4gYSBQcm9taXNlIGZvciB0aGUgdmFsdWUgb2ZcbiAgLy8gdGhlIGZpbmFsIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgaXRlcmF0b3IuXG4gIGV4cG9ydHMuYXN5bmMgPSBmdW5jdGlvbihpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCwgUHJvbWlzZUltcGwpIHtcbiAgICBpZiAoUHJvbWlzZUltcGwgPT09IHZvaWQgMCkgUHJvbWlzZUltcGwgPSBQcm9taXNlO1xuXG4gICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcihcbiAgICAgIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpLFxuICAgICAgUHJvbWlzZUltcGxcbiAgICApO1xuXG4gICAgcmV0dXJuIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kO1xuICAgICAgY29udGV4dC5hcmcgPSBhcmc7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgICAgdGhyb3cgY29udGV4dC5hcmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG5cbiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09XG4gICAgICAgICAgLy8gR2VuU3RhdGVFeGVjdXRpbmcgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhlciBpbnZvY2F0aW9uLlxuICAgICAgICAgIHN0YXRlID0gY29udGV4dC5kb25lXG4gICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkXG4gICAgICAgICAgICA6IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lXG4gICAgICAgICAgfTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBleGNlcHRpb24gYnkgbG9vcGluZyBiYWNrIGFyb3VuZCB0byB0aGVcbiAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGVcbiAgLy8gcmVzdWx0LCBlaXRoZXIgYnkgcmV0dXJuaW5nIGEgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCBmcm9tIHRoZVxuICAvLyBkZWxlZ2F0ZSBpdGVyYXRvciwgb3IgYnkgbW9kaWZ5aW5nIGNvbnRleHQubWV0aG9kIGFuZCBjb250ZXh0LmFyZyxcbiAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuXG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdO1xuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQSAudGhyb3cgb3IgLnJldHVybiB3aGVuIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgbm8gLnRocm93XG4gICAgICAvLyBtZXRob2QgYWx3YXlzIHRlcm1pbmF0ZXMgdGhlIHlpZWxkKiBsb29wLlxuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIC8vIE5vdGU6IFtcInJldHVyblwiXSBtdXN0IGJlIHVzZWQgZm9yIEVTMyBwYXJzaW5nIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvcltcInJldHVyblwiXSkge1xuICAgICAgICAgIC8vIElmIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgYSByZXR1cm4gbWV0aG9kLCBnaXZlIGl0IGFcbiAgICAgICAgICAvLyBjaGFuY2UgdG8gY2xlYW4gdXAuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuXG4gICAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIC8vIElmIG1heWJlSW52b2tlRGVsZWdhdGUoY29udGV4dCkgY2hhbmdlZCBjb250ZXh0Lm1ldGhvZCBmcm9tXG4gICAgICAgICAgICAvLyBcInJldHVyblwiIHRvIFwidGhyb3dcIiwgbGV0IHRoYXQgb3ZlcnJpZGUgdGhlIFR5cGVFcnJvciBiZWxvdy5cbiAgICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpO1xuXG4gICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7XG5cbiAgICBpZiAoISBpbmZvKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAvLyBBc3NpZ24gdGhlIHJlc3VsdCBvZiB0aGUgZmluaXNoZWQgZGVsZWdhdGUgdG8gdGhlIHRlbXBvcmFyeVxuICAgICAgLy8gdmFyaWFibGUgc3BlY2lmaWVkIGJ5IGRlbGVnYXRlLnJlc3VsdE5hbWUgKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlO1xuXG4gICAgICAvLyBSZXN1bWUgZXhlY3V0aW9uIGF0IHRoZSBkZXNpcmVkIGxvY2F0aW9uIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jO1xuXG4gICAgICAvLyBJZiBjb250ZXh0Lm1ldGhvZCB3YXMgXCJ0aHJvd1wiIGJ1dCB0aGUgZGVsZWdhdGUgaGFuZGxlZCB0aGVcbiAgICAgIC8vIGV4Y2VwdGlvbiwgbGV0IHRoZSBvdXRlciBnZW5lcmF0b3IgcHJvY2VlZCBub3JtYWxseS4gSWZcbiAgICAgIC8vIGNvbnRleHQubWV0aG9kIHdhcyBcIm5leHRcIiwgZm9yZ2V0IGNvbnRleHQuYXJnIHNpbmNlIGl0IGhhcyBiZWVuXG4gICAgICAvLyBcImNvbnN1bWVkXCIgYnkgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yLiBJZiBjb250ZXh0Lm1ldGhvZCB3YXNcbiAgICAgIC8vIFwicmV0dXJuXCIsIGFsbG93IHRoZSBvcmlnaW5hbCAucmV0dXJuIGNhbGwgdG8gY29udGludWUgaW4gdGhlXG4gICAgICAvLyBvdXRlciBnZW5lcmF0b3IuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgIT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmUteWllbGQgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgZGVsZWdhdGUgbWV0aG9kLlxuICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgLy8gVGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGlzIGZpbmlzaGVkLCBzbyBmb3JnZXQgaXQgYW5kIGNvbnRpbnVlIHdpdGhcbiAgICAvLyB0aGUgb3V0ZXIgZ2VuZXJhdG9yLlxuICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICB9XG5cbiAgLy8gRGVmaW5lIEdlbmVyYXRvci5wcm90b3R5cGUue25leHQsdGhyb3cscmV0dXJufSBpbiB0ZXJtcyBvZiB0aGVcbiAgLy8gdW5pZmllZCAuX2ludm9rZSBoZWxwZXIgbWV0aG9kLlxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApO1xuXG4gIGRlZmluZShHcCwgdG9TdHJpbmdUYWdTeW1ib2wsIFwiR2VuZXJhdG9yXCIpO1xuXG4gIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlXG4gIC8vIEBAaXRlcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGl0LiBTb21lIGJyb3dzZXJzJyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlXG4gIC8vIGl0ZXJhdG9yIHByb3RvdHlwZSBjaGFpbiBpbmNvcnJlY3RseSBpbXBsZW1lbnQgdGhpcywgY2F1c2luZyB0aGUgR2VuZXJhdG9yXG4gIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2lzc3Vlcy8yNzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgR3BbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfTtcblxuICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykge1xuICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07XG5cbiAgICBpZiAoMSBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgfVxuXG4gICAgaWYgKDIgaW4gbG9jcykge1xuICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM107XG4gICAgfVxuXG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgIHJlY29yZC50eXBlID0gXCJub3JtYWxcIjtcbiAgICBkZWxldGUgcmVjb3JkLmFyZztcbiAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb21cbiAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuXG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XTtcbiAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgdGhpcy5yZXNldCh0cnVlKTtcbiAgfVxuXG4gIGV4cG9ydHMua2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMucmV2ZXJzZSgpO1xuXG4gICAgLy8gUmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIG9iamVjdCB3aXRoIGEgbmV4dCBtZXRob2QsIHdlIGtlZXBcbiAgICAvLyB0aGluZ3Mgc2ltcGxlIGFuZCByZXR1cm4gdGhlIG5leHQgZnVuY3Rpb24gaXRzZWxmLlxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgd2hpbGUgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7XG4gICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVG8gYXZvaWQgY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBvYmplY3QsIHdlIGp1c3QgaGFuZyB0aGUgLnZhbHVlXG4gICAgICAvLyBhbmQgLmRvbmUgcHJvcGVydGllcyBvZmYgdGhlIG5leHQgZnVuY3Rpb24gb2JqZWN0IGl0c2VsZi4gVGhpc1xuICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uXG4gICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHtcbiAgICAgICAgICAgICAgbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV4dC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLlxuICAgIHJldHVybiB7IG5leHQ6IGRvbmVSZXN1bHQgfTtcbiAgfVxuICBleHBvcnRzLnZhbHVlcyA9IHZhbHVlcztcblxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKHNraXBUZW1wUmVzZXQpIHtcbiAgICAgIHRoaXMucHJldiA9IDA7XG4gICAgICB0aGlzLm5leHQgPSAwO1xuICAgICAgLy8gUmVzZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICB0aGlzLmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG5cbiAgICAgICAgaWYgKGNhdWdodCkge1xuICAgICAgICAgIC8vIElmIHRoZSBkaXNwYXRjaGVkIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IGJ5IGEgY2F0Y2ggYmxvY2ssXG4gICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhIGNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgIHRoaXMubmV4dCA9IFwiZW5kXCI7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiICYmIGFmdGVyTG9jKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGFmdGVyTG9jO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbihmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKTtcbiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb250ZXh0LmNhdGNoIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYSBsb2NhdGlvblxuICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG5cbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZvcmdldCB0aGUgbGFzdCBzZW50IHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3RcbiAgICAgICAgLy8gYWNjaWRlbnRhbGx5IHBhc3MgaXQgb24gdG8gdGhlIGRlbGVnYXRlLlxuICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuICB9O1xuXG4gIC8vIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGlzIHNjcmlwdCBpcyBleGVjdXRpbmcgYXMgYSBDb21tb25KUyBtb2R1bGVcbiAgLy8gb3Igbm90LCByZXR1cm4gdGhlIHJ1bnRpbWUgb2JqZWN0IHNvIHRoYXQgd2UgY2FuIGRlY2xhcmUgdGhlIHZhcmlhYmxlXG4gIC8vIHJlZ2VuZXJhdG9yUnVudGltZSBpbiB0aGUgb3V0ZXIgc2NvcGUsIHdoaWNoIGFsbG93cyB0aGlzIG1vZHVsZSB0byBiZVxuICAvLyBpbmplY3RlZCBlYXNpbHkgYnkgYGJpbi9yZWdlbmVyYXRvciAtLWluY2x1ZGUtcnVudGltZSBzY3JpcHQuanNgLlxuICByZXR1cm4gZXhwb3J0cztcblxufShcbiAgLy8gSWYgdGhpcyBzY3JpcHQgaXMgZXhlY3V0aW5nIGFzIGEgQ29tbW9uSlMgbW9kdWxlLCB1c2UgbW9kdWxlLmV4cG9ydHNcbiAgLy8gYXMgdGhlIHJlZ2VuZXJhdG9yUnVudGltZSBuYW1lc3BhY2UuIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcgZW1wdHlcbiAgLy8gb2JqZWN0LiBFaXRoZXIgd2F5LCB0aGUgcmVzdWx0aW5nIG9iamVjdCB3aWxsIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZVxuICAvLyB0aGUgcmVnZW5lcmF0b3JSdW50aW1lIHZhcmlhYmxlIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlLlxuICB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiID8gbW9kdWxlLmV4cG9ydHMgOiB7fVxuKSk7XG5cbnRyeSB7XG4gIHJlZ2VuZXJhdG9yUnVudGltZSA9IHJ1bnRpbWU7XG59IGNhdGNoIChhY2NpZGVudGFsU3RyaWN0TW9kZSkge1xuICAvLyBUaGlzIG1vZHVsZSBzaG91bGQgbm90IGJlIHJ1bm5pbmcgaW4gc3RyaWN0IG1vZGUsIHNvIHRoZSBhYm92ZVxuICAvLyBhc3NpZ25tZW50IHNob3VsZCBhbHdheXMgd29yayB1bmxlc3Mgc29tZXRoaW5nIGlzIG1pc2NvbmZpZ3VyZWQuIEp1c3RcbiAgLy8gaW4gY2FzZSBydW50aW1lLmpzIGFjY2lkZW50YWxseSBydW5zIGluIHN0cmljdCBtb2RlLCB3ZSBjYW4gZXNjYXBlXG4gIC8vIHN0cmljdCBtb2RlIHVzaW5nIGEgZ2xvYmFsIEZ1bmN0aW9uIGNhbGwuIFRoaXMgY291bGQgY29uY2VpdmFibHkgZmFpbFxuICAvLyBpZiBhIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IGZvcmJpZHMgdXNpbmcgRnVuY3Rpb24sIGJ1dCBpbiB0aGF0IGNhc2VcbiAgLy8gdGhlIHByb3BlciBzb2x1dGlvbiBpcyB0byBmaXggdGhlIGFjY2lkZW50YWwgc3RyaWN0IG1vZGUgcHJvYmxlbS4gSWZcbiAgLy8geW91J3ZlIG1pc2NvbmZpZ3VyZWQgeW91ciBidW5kbGVyIHRvIGZvcmNlIHN0cmljdCBtb2RlIGFuZCBhcHBsaWVkIGFcbiAgLy8gQ1NQIHRvIGZvcmJpZCBGdW5jdGlvbiwgYW5kIHlvdSdyZSBub3Qgd2lsbGluZyB0byBmaXggZWl0aGVyIG9mIHRob3NlXG4gIC8vIHByb2JsZW1zLCBwbGVhc2UgZGV0YWlsIHlvdXIgdW5pcXVlIHByZWRpY2FtZW50IGluIGEgR2l0SHViIGlzc3VlLlxuICBGdW5jdGlvbihcInJcIiwgXCJyZWdlbmVyYXRvclJ1bnRpbWUgPSByXCIpKHJ1bnRpbWUpO1xufVxuIiwiZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykge1xuICB0cnkge1xuICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTtcbiAgICB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlamVjdChlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGluZm8uZG9uZSkge1xuICAgIHJlc29sdmUodmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihfbmV4dCwgX3Rocm93KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXG4gICAgICBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkge1xuICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwibmV4dFwiLCB2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIF90aHJvdyhlcnIpIHtcbiAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcInRocm93XCIsIGVycik7XG4gICAgICB9XG5cbiAgICAgIF9uZXh0KHVuZGVmaW5lZCk7XG4gICAgfSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2FzeW5jVG9HZW5lcmF0b3I7IiwiZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hcnJheVdpdGhIb2xlczsiLCJmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8ICEoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChhcnIpKSkgcmV0dXJuO1xuICB2YXIgX2FyciA9IFtdO1xuICB2YXIgX24gPSB0cnVlO1xuICB2YXIgX2QgPSBmYWxzZTtcbiAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkge1xuICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2QgPSB0cnVlO1xuICAgIF9lID0gZXJyO1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIF9hcnI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2l0ZXJhYmxlVG9BcnJheUxpbWl0OyIsImZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykge1xuICAgIGFycjJbaV0gPSBhcnJbaV07XG4gIH1cblxuICByZXR1cm4gYXJyMjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlMaWtlVG9BcnJheTsiLCJ2YXIgYXJyYXlMaWtlVG9BcnJheSA9IHJlcXVpcmUoXCIuL2FycmF5TGlrZVRvQXJyYXlcIik7XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5OyIsImZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX25vbkl0ZXJhYmxlUmVzdDsiLCJ2YXIgYXJyYXlXaXRoSG9sZXMgPSByZXF1aXJlKFwiLi9hcnJheVdpdGhIb2xlc1wiKTtcblxudmFyIGl0ZXJhYmxlVG9BcnJheUxpbWl0ID0gcmVxdWlyZShcIi4vaXRlcmFibGVUb0FycmF5TGltaXRcIik7XG5cbnZhciB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSA9IHJlcXVpcmUoXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5XCIpO1xuXG52YXIgbm9uSXRlcmFibGVSZXN0ID0gcmVxdWlyZShcIi4vbm9uSXRlcmFibGVSZXN0XCIpO1xuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHtcbiAgcmV0dXJuIGFycmF5V2l0aEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IG5vbkl0ZXJhYmxlUmVzdCgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9zbGljZWRUb0FycmF5OyIsImZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2NsYXNzQ2FsbENoZWNrOyIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfY3JlYXRlQ2xhc3M7IiwiZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2RlZmluZVByb3BlcnR5OyIsImZ1bmN0aW9uIGUoZSxyLHQsbixhLGksbyl7dHJ5e3ZhciB1PWVbaV0obyksYz11LnZhbHVlfWNhdGNoKGUpe3JldHVybiB2b2lkIHQoZSl9dS5kb25lP3IoYyk6UHJvbWlzZS5yZXNvbHZlKGMpLnRoZW4obixhKX1mdW5jdGlvbiByKHIpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PXRoaXMsbj1hcmd1bWVudHM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihhLGkpe3ZhciBvPXIuYXBwbHkodCxuKTtmdW5jdGlvbiB1KHIpe2UobyxhLGksdSxjLFwibmV4dFwiLHIpfWZ1bmN0aW9uIGMocil7ZShvLGEsaSx1LGMsXCJ0aHJvd1wiLHIpfXUodm9pZCAwKX0pKX19ZnVuY3Rpb24gdChlLHIpe3JldHVybiBmdW5jdGlvbihlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlfShlKXx8ZnVuY3Rpb24oZSxyKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgU3ltYm9sfHwhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpKXJldHVybjt2YXIgdD1bXSxuPSEwLGE9ITEsaT12b2lkIDA7dHJ5e2Zvcih2YXIgbyx1PWVbU3ltYm9sLml0ZXJhdG9yXSgpOyEobj0obz11Lm5leHQoKSkuZG9uZSkmJih0LnB1c2goby52YWx1ZSksIXJ8fHQubGVuZ3RoIT09cik7bj0hMCk7fWNhdGNoKGUpe2E9ITAsaT1lfWZpbmFsbHl7dHJ5e258fG51bGw9PXUucmV0dXJufHx1LnJldHVybigpfWZpbmFsbHl7aWYoYSl0aHJvdyBpfX1yZXR1cm4gdH0oZSxyKXx8ZnVuY3Rpb24oZSxyKXtpZighZSlyZXR1cm47aWYoXCJzdHJpbmdcIj09dHlwZW9mIGUpcmV0dXJuIG4oZSxyKTt2YXIgdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkuc2xpY2UoOCwtMSk7XCJPYmplY3RcIj09PXQmJmUuY29uc3RydWN0b3ImJih0PWUuY29uc3RydWN0b3IubmFtZSk7aWYoXCJNYXBcIj09PXR8fFwiU2V0XCI9PT10KXJldHVybiBBcnJheS5mcm9tKGUpO2lmKFwiQXJndW1lbnRzXCI9PT10fHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdCh0KSlyZXR1cm4gbihlLHIpfShlLHIpfHxmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIil9KCl9ZnVuY3Rpb24gbihlLHIpeyhudWxsPT1yfHxyPmUubGVuZ3RoKSYmKHI9ZS5sZW5ndGgpO2Zvcih2YXIgdD0wLG49bmV3IEFycmF5KHIpO3Q8cjt0Kyspblt0XT1lW3RdO3JldHVybiBufXZhciBhPWZ1bmN0aW9uKCl7dmFyIGU9cihyZWdlbmVyYXRvclJ1bnRpbWUubWFyaygoZnVuY3Rpb24gZSh0KXtyZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLmFicnVwdChcInJldHVyblwiLG5ldyBQcm9taXNlKGZ1bmN0aW9uKCl7dmFyIGU9cihyZWdlbmVyYXRvclJ1bnRpbWUubWFyaygoZnVuY3Rpb24gZShyLG4pe3ZhciBhLG87cmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDppZihuYXZpZ2F0b3IucGVybWlzc2lvbnMpe2UubmV4dD00O2JyZWFrfW4obmV3IERPTUV4Y2VwdGlvbihcIlBlcm1pc3Npb25zIG5vdCBzdXBwb3J0ZWRcIixcIk5PVF9TVVBQT1JURURfRVJSXCIpKSxlLm5leHQ9MTY7YnJlYWs7Y2FzZSA0OnJldHVybiBlLnByZXY9NCxlLm5leHQ9NyxuYXZpZ2F0b3IucGVybWlzc2lvbnMucXVlcnkoe25hbWU6dH0pO2Nhc2UgNzphPWUuc2VudCxvPWZ1bmN0aW9uIGUodCl7YS5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsZSksaSh0LnRhcmdldC5zdGF0ZSxyLG4pfSxhLmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIixvKSxpKGEuc3RhdGUscixuKSxlLm5leHQ9MTY7YnJlYWs7Y2FzZSAxMzplLnByZXY9MTMsZS50MD1lLmNhdGNoKDQpLG4oZS50MCk7Y2FzZSAxNjpjYXNlXCJlbmRcIjpyZXR1cm4gZS5zdG9wKCl9fSksZSxudWxsLFtbNCwxM11dKX0pKSk7cmV0dXJuIGZ1bmN0aW9uKHIsdCl7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKSkpO2Nhc2UgMTpjYXNlXCJlbmRcIjpyZXR1cm4gZS5zdG9wKCl9fSksZSl9KSkpO3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpLGk9ZnVuY3Rpb24oZSxyLHQpe3N3aXRjaChlKXtjYXNlXCJkZW5pZWRcIjp0KG5ldyBET01FeGNlcHRpb24oXCJQZXJtaXNzaW9uIGRlbmllZFwiLFwiTk9UX0FMTE9XRURfRVJSXCIpKTticmVhaztkZWZhdWx0OnIoZSl9fSxvPWZ1bmN0aW9uKCl7dmFyIGU9cihyZWdlbmVyYXRvclJ1bnRpbWUubWFyaygoZnVuY3Rpb24gZShuLGkpe3JldHVybiByZWdlbmVyYXRvclJ1bnRpbWUud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIGUuYWJydXB0KFwicmV0dXJuXCIsbmV3IFByb21pc2UoZnVuY3Rpb24oKXt2YXIgZT1yKHJlZ2VuZXJhdG9yUnVudGltZS5tYXJrKChmdW5jdGlvbiBlKHIsbyl7dmFyIHUsYyxzO3JldHVybiByZWdlbmVyYXRvclJ1bnRpbWUud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6aWYobmF2aWdhdG9yLm1lZGlhRGV2aWNlcyl7ZS5uZXh0PTQ7YnJlYWt9byhuZXcgRE9NRXhjZXB0aW9uKFwiTWVkaWFEZXZpY2VzIG5vdCBzdXBwb3J0ZWRcIixcIk5PVF9GT1VORF9FUlJcIikpLGUubmV4dD0yNDticmVhaztjYXNlIDQ6cmV0dXJuIGUucHJldj00LGUudDA9UHJvbWlzZSxlLm5leHQ9OCxhKG4pO2Nhc2UgODpyZXR1cm4gZS50MT1lLnNlbnQsZS5uZXh0PTExLG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKGkpO2Nhc2UgMTE6cmV0dXJuIGUudDI9ZS5zZW50LGUudDM9W2UudDEsZS50Ml0sZS5uZXh0PTE1LGUudDAuYWxsLmNhbGwoZS50MCxlLnQzKTtjYXNlIDE1OnU9ZS5zZW50LGM9dCh1LDIpLHM9Y1sxXSxyKHMpLGUubmV4dD0yNDticmVhaztjYXNlIDIxOmUucHJldj0yMSxlLnQ0PWUuY2F0Y2goNCksbyhlLnQ0KTtjYXNlIDI0OmNhc2VcImVuZFwiOnJldHVybiBlLnN0b3AoKX19KSxlLG51bGwsW1s0LDIxXV0pfSkpKTtyZXR1cm4gZnVuY3Rpb24ocix0KXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpKSk7Y2FzZSAxOmNhc2VcImVuZFwiOnJldHVybiBlLnN0b3AoKX19KSxlKX0pKSk7cmV0dXJuIGZ1bmN0aW9uKHIsdCl7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKTtleHBvcnR7YSBhcyBnZXRQZXJtaXNzaW9uLG8gYXMgZ2V0VXNlck1lZGlhU3RyZWFtfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pYVc1a1pYZ3VaWE11YW5NaUxDSnpiM1Z5WTJWeklqcGJJaTR1TDNOeVl5OW5aWFJRWlhKdGFYTnphVzl1TG1weklpd2lMaTR2YzNKakwyZGxkRlZ6WlhKTlpXUnBZVk4wY21WaGJTNXFjeUpkTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lJdktpcGNiaUFxSUZKbGRIVnlibk1nWVNCd2NtOXRhWE5sSUhKbGMyOXNkbVZrSUhkb1pXNGdkR2hsSUhCbGNtMXBjM05wYjI0Z2FYTWdaM0poYm5SbFpDQmllU0IwYUdVZ2RYTmxjbHh1SUNvZ1FIQmhjbUZ0SUhCbGNtMXBjM05wYjI1T1lXMWxJQ0FnSUNBZ0lDQWdJQ0FnVG1GdFpTQnZaaUIwYUdVZ2NHVnliV2x6YzJsdmJpNGdRSE5sWlNCb2RIUndjem92TDNjell5NW5hWFJvZFdJdWFXOHZjR1Z5YldsemMybHZibk12STJWdWRXMWtaV1l0Y0dWeWJXbHpjMmx2Ym01aGJXVmNiaUFxSUVCeVpYUjFjbTV6SUh0UWNtOXRhWE5sZlZ4dUlDb3ZYRzVsZUhCdmNuUWdaR1ZtWVhWc2RDQmhjM2x1WXlBb2NHVnliV2x6YzJsdmJrNWhiV1VwSUQwK0lIdGNibHgwY21WMGRYSnVJRzVsZHlCUWNtOXRhWE5sS0dGemVXNWpJQ2h5WlhOdmJIWmxMQ0J5WldwbFkzUXBJRDArSUh0Y2JseDBYSFJwWmlBb0lXNWhkbWxuWVhSdmNpNXdaWEp0YVhOemFXOXVjeWtnZTF4dVhIUmNkRngwY21WcVpXTjBLRzVsZHlCRVQwMUZlR05sY0hScGIyNG9KMUJsY20xcGMzTnBiMjV6SUc1dmRDQnpkWEJ3YjNKMFpXUW5MQ0FuVGs5VVgxTlZVRkJQVWxSRlJGOUZVbEluS1NsY2JseDBYSFI5SUdWc2MyVWdlMXh1WEhSY2RGeDBkSEo1SUh0Y2JseDBYSFJjZEZ4MFkyOXVjM1FnY0dWeWJXbHpjMmx2YmxOMFlYUjFjeUE5SUdGM1lXbDBJRzVoZG1sbllYUnZjaTV3WlhKdGFYTnphVzl1Y3k1eGRXVnllU2g3SUc1aGJXVTZJSEJsY20xcGMzTnBiMjVPWVcxbElIMHBYRzVjZEZ4MFhIUmNkR052Ym5OMElHOXVRMmhoYm1kbElEMGdLR1YyWlc1MEtTQTlQaUI3WEc1Y2RGeDBYSFJjZEZ4MGNHVnliV2x6YzJsdmJsTjBZWFIxY3k1eVpXMXZkbVZGZG1WdWRFeHBjM1JsYm1WeUtDZGphR0Z1WjJVbkxDQnZia05vWVc1blpTbGNibHgwWEhSY2RGeDBYSFJ5WlhOdmJIWmxUM0pTWldwbFkzUkNZWE5sWkU5dVUzUmhkR1VvWlhabGJuUXVkR0Z5WjJWMExuTjBZWFJsTENCeVpYTnZiSFpsTENCeVpXcGxZM1FwWEc1Y2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MGNHVnliV2x6YzJsdmJsTjBZWFIxY3k1aFpHUkZkbVZ1ZEV4cGMzUmxibVZ5S0NkamFHRnVaMlVuTENCdmJrTm9ZVzVuWlNsY2JseDBYSFJjZEZ4MGNtVnpiMngyWlU5eVVtVnFaV04wUW1GelpXUlBibE4wWVhSbEtIQmxjbTFwYzNOcGIyNVRkR0YwZFhNdWMzUmhkR1VzSUhKbGMyOXNkbVVzSUhKbGFtVmpkQ2xjYmx4MFhIUmNkSDBnWTJGMFkyZ2dLR1Z5Y205eUtTQjdYRzVjZEZ4MFhIUmNkSEpsYW1WamRDaGxjbkp2Y2lsY2JseDBYSFJjZEgxY2JseDBYSFI5WEc1Y2RIMHBYRzU5WEc1Y2JtTnZibk4wSUhKbGMyOXNkbVZQY2xKbGFtVmpkRUpoYzJWa1QyNVRkR0YwWlNBOUlDaHpkR0YwWlN3Z2NtVnpiMngyWlN3Z2NtVnFaV04wS1NBOVBpQjdYRzVjZEhOM2FYUmphQ0FvYzNSaGRHVXBJSHRjYmx4MFhIUmpZWE5sSUNka1pXNXBaV1FuT2x4dVhIUmNkRngwY21WcVpXTjBLRzVsZHlCRVQwMUZlR05sY0hScGIyNG9KMUJsY20xcGMzTnBiMjRnWkdWdWFXVmtKeXdnSjA1UFZGOUJURXhQVjBWRVgwVlNVaWNwS1Z4dVhIUmNkRngwWW5KbFlXdGNibHgwWEhSa1pXWmhkV3gwT2x4dVhIUmNkRngwY21WemIyeDJaU2h6ZEdGMFpTbGNibHgwZlZ4dWZWeHVJaXdpYVcxd2IzSjBJR2RsZEZCbGNtMXBjM05wYjI0Z1puSnZiU0FuTGk5blpYUlFaWEp0YVhOemFXOXVKMXh1WEc0dktpcGNiaUFxSUZKbGRIVnlibk1nWVNCd2NtOXRhWE5sSUhKbGMyOXNkbVZrSUhkb1pXNGdkR2hsSUhCbGNtMXBjM05wYjI0Z2FYTWdaM0poYm5SbFpDQmllU0IwYUdVZ2RYTmxjaUJoYm1RZ2RHaGxJSE4wY21WaGJTQnBjeUJ5WlhSeWFXVjJaV1JjYmlBcUlFQndZWEpoYlNCd1pYSnRhWE56YVc5dVRtRnRaU0FnSUNBZ0lDQWdJQ0FnSUU1aGJXVWdiMllnZEdobElIQmxjbTFwYzNOcGIyNHVJRUJ6WldVZ2FIUjBjSE02THk5M00yTXVaMmwwYUhWaUxtbHZMM0JsY20xcGMzTnBiMjV6THlObGJuVnRaR1ZtTFhCbGNtMXBjM05wYjI1dVlXMWxYRzRnS2lCQWNHRnlZVzBnYldWa2FXRlRkSEpsWVcxRGIyNXpkSEpoYVc1MGN5QWdJQ0JEYjI1emRISmhhVzUwY3lCdlltcGxZM1F1SUVCelpXVWdhSFIwY0hNNkx5OWtaWFpsYkc5d1pYSXViVzk2YVd4c1lTNXZjbWN2Wlc0dFZWTXZaRzlqY3k5WFpXSXZRVkJKTDAxbFpHbGhVM1J5WldGdFEyOXVjM1J5WVdsdWRITmNiaUFxSUVCeVpYUjFjbTV6SUh0UWNtOXRhWE5sZlZ4dUlDb3ZYRzVsZUhCdmNuUWdaR1ZtWVhWc2RDQmhjM2x1WXlBb2NHVnliV2x6YzJsdmJrNWhiV1VzSUcxbFpHbGhVM1J5WldGdFEyOXVjM1J5WVdsdWRITXBJRDArSUh0Y2JseDBjbVYwZFhKdUlHNWxkeUJRY205dGFYTmxLR0Z6ZVc1aklDaHlaWE52YkhabExDQnlaV3BsWTNRcElEMCtJSHRjYmx4MFhIUnBaaUFvSVc1aGRtbG5ZWFJ2Y2k1dFpXUnBZVVJsZG1salpYTXBJSHRjYmx4MFhIUmNkSEpsYW1WamRDaHVaWGNnUkU5TlJYaGpaWEIwYVc5dUtDZE5aV1JwWVVSbGRtbGpaWE1nYm05MElITjFjSEJ2Y25SbFpDY3NJQ2RPVDFSZlJrOVZUa1JmUlZKU0p5a3BYRzVjZEZ4MGZTQmxiSE5sSUh0Y2JseDBYSFJjZEhSeWVTQjdYRzVjZEZ4MFhIUmNkR052Ym5OMElGc3NJSE4wY21WaGJWMGdQU0JoZDJGcGRDQlFjbTl0YVhObExtRnNiQ2hiWEc1Y2RGeDBYSFJjZEZ4MFlYZGhhWFFnWjJWMFVHVnliV2x6YzJsdmJpaHdaWEp0YVhOemFXOXVUbUZ0WlNrc1hHNWNkRngwWEhSY2RGeDBZWGRoYVhRZ2JtRjJhV2RoZEc5eUxtMWxaR2xoUkdWMmFXTmxjeTVuWlhSVmMyVnlUV1ZrYVdFb2JXVmthV0ZUZEhKbFlXMURiMjV6ZEhKaGFXNTBjeWtzWEc1Y2RGeDBYSFJjZEYwcFhHNWNkRngwWEhSY2RISmxjMjlzZG1Vb2MzUnlaV0Z0S1Z4dVhIUmNkRngwZlNCallYUmphQ0FvWlhKeWIzSXBJSHRjYmx4MFhIUmNkRngwY21WcVpXTjBLR1Z5Y205eUtWeHVYSFJjZEZ4MGZWeHVYSFJjZEgxY2JseDBmU2xjYm4xY2JpSmRMQ0p1WVcxbGN5STZXeUp3WlhKdGFYTnphVzl1VG1GdFpTSXNJbEJ5YjIxcGMyVWlMQ0p5WlhOdmJIWmxJaXdpY21WcVpXTjBJaXdpYm1GMmFXZGhkRzl5SWl3aWNHVnliV2x6YzJsdmJuTWlMQ0pFVDAxRmVHTmxjSFJwYjI0aUxDSnhkV1Z5ZVNJc0ltNWhiV1VpTENKd1pYSnRhWE56YVc5dVUzUmhkSFZ6SWl3aWIyNURhR0Z1WjJVaUxDSmxkbVZ1ZENJc0luSmxiVzkyWlVWMlpXNTBUR2x6ZEdWdVpYSWlMQ0p5WlhOdmJIWmxUM0pTWldwbFkzUkNZWE5sWkU5dVUzUmhkR1VpTENKMFlYSm5aWFFpTENKemRHRjBaU0lzSW1Ga1pFVjJaVzUwVEdsemRHVnVaWElpTENKdFpXUnBZVk4wY21WaGJVTnZibk4wY21GcGJuUnpJaXdpYldWa2FXRkVaWFpwWTJWeklpd2laMlYwVUdWeWJXbHpjMmx2YmlJc0ltZGxkRlZ6WlhKTlpXUnBZU0lzSW1Gc2JDSXNJbk4wY21WaGJTSmRMQ0p0WVhCd2FXNW5jeUk2SW0xM1EwRkxRU3hyUkVGQlpTeFhRVUZQUVN3MFIwRkRaQ3hKUVVGSlF5eHZSRUZCVVN4WFFVRlBReXhGUVVGVFF5dzRSa0ZETjBKRExGVkJRVlZETERSQ1FVTmtSaXhGUVVGUExFbEJRVWxITEdGQlFXRXNORUpCUVRaQ0xITkZRVWR5UWtZc1ZVRkJWVU1zV1VGQldVVXNUVUZCVFN4RFFVRkZReXhMUVVGTlVpeFhRVUUzUkZNc1UwRkRRVU1zUlVGQlZ5eFRRVUZZUVN4RlFVRlpReXhIUVVOcVFrWXNSVUZCYVVKSExHOUNRVUZ2UWl4VFFVRlZSaXhIUVVNdlEwY3NSVUZCTkVKR0xFVkJRVTFITEU5QlFVOURMRTFCUVU5aUxFVkJRVk5ETEVsQlJURkVUU3hGUVVGcFFrOHNhVUpCUVdsQ0xGTkJRVlZPTEVkQlF6VkRSeXhGUVVFMFFrb3NSVUZCYVVKTkxFMUJRVTlpTEVWQlFWTkRMSEZFUVVVM1JFRXNOazVCVFVWVkxFVkJRVGhDTEZOQlFVTkZMRVZCUVU5aUxFVkJRVk5ETEZWQlF6VkRXU3hQUVVOR0xGTkJRMHBhTEVWQlFVOHNTVUZCU1Vjc1lVRkJZU3h2UWtGQmNVSXNhME5CUnpkRFNpeEZRVUZSWVN4dFJFTjJRa2tzVjBGQlQyWXNSVUZCWjBKcFFpdzBSMEZET1VJc1NVRkJTV2hDTEc5RVFVRlJMRmRCUVU5RExFVkJRVk5ETEdkSFFVTTNRa01zVlVGQlZXTXNOa0pCUTJSbUxFVkJRVThzU1VGQlNVY3NZVUZCWVN3MlFrRkJPRUlzT0VSQlJ6VkNUQ3hwUWtGRGJFSnJRaXhGUVVGamJrSXNkVU5CUTJSSkxGVkJRVlZqTEdGQlFXRkZMR0ZCUVdGSUxEaEVRVVpXU1N3NFEwRkJlRUpETEU5QlNWUndRaXhGUVVGUmIwSXNjVVJCUlZKdVFpSjlcbiIsImltcG9ydCB7IGdldFVzZXJNZWRpYVN0cmVhbSB9IGZyb20gJ0B1bnRlbXBzL3VzZXItcGVybWlzc2lvbnMtdXRpbHMnXG5cbmNsYXNzIFZvY2FsIHtcblx0c3RhdGljIGRlZmF1bHRPcHRpb25zID0ge1xuXHRcdGdyYW1tYXJzOiBudWxsLFxuXHRcdGxhbmc6ICdlbi1VUycsXG5cdFx0Y29udGludW91czogZmFsc2UsXG5cdFx0aW50ZXJpbVJlc3VsdHM6IGZhbHNlLFxuXHRcdG1heEFsdGVybmF0aXZlczogMSxcblx0XHRzZXJ2aWNlVVJJOiBudWxsLFxuXHR9XG5cblx0c3RhdGljIGV2ZW50VHlwZXMgPSB7XG5cdFx0QVVESU9fRU5EOiAnYXVkaW9lbmQnLFxuXHRcdEFVRElPX1NUQVJUOiAnYXVkaW9zdGFydCcsXG5cdFx0RU5EOiAnZW5kJyxcblx0XHRFUlJPUjogJ2Vycm9yJyxcblx0XHROT19NQVRDSDogJ25vbWF0Y2gnLFxuXHRcdFJFU1VMVDogJ3Jlc3VsdCcsXG5cdFx0U09VTkRfRU5EOiAnc291bmRlbmQnLFxuXHRcdFNPVU5EX1NUQVJUOiAnc291bmRzdGFydCcsXG5cdFx0U1BFRUNIX0VORDogJ3NwZWVjaGVuZCcsXG5cdFx0U1BFRUNIX1NUQVJUOiAnc3BlZWNoc3RhcnQnLFxuXHRcdFNUQVJUOiAnc3RhcnQnLFxuXHR9XG5cblx0c3RhdGljIGdldCBpc1N1cHBvcnRlZCgpIHtcblx0XHRyZXR1cm4gISFWb2NhbC5fcmVzb2x2ZVNwZWVjaFJlY29nbml0aW9uKClcblx0fVxuXG5cdHN0YXRpYyBzZXQgaXNTdXBwb3J0ZWQoXykge1xuXHRcdHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBzZXQgaXNTdXBwb3J0ZWQgZGlyZWN0bHkuJylcblx0fVxuXG5cdF9pbnN0YW5jZSA9IG51bGxcblx0X2xpc3RlbmVycyA9IG51bGxcblxuXHRjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG5cdFx0Y29uc3QgU3BlZWNoUmVjb2duaXRpb24gPSBWb2NhbC5fcmVzb2x2ZVNwZWVjaFJlY29nbml0aW9uKClcblx0XHRpZiAoIVNwZWVjaFJlY29nbml0aW9uKSB7XG5cdFx0XHR0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdTcGVlY2hSZWNvZ25pdGlvbiBub3Qgc3VwcG9ydGVkJywgJ05PVF9TVVBQT1JURURfRVJSJylcblx0XHR9XG5cblx0XHR0aGlzLl9pbnN0YW5jZSA9IG5ldyBTcGVlY2hSZWNvZ25pdGlvbigpXG5cdFx0dGhpcy5fbGlzdGVuZXJzID0ge31cblxuXHRcdE9iamVjdC5lbnRyaWVzKHtcblx0XHRcdC4uLlZvY2FsLmRlZmF1bHRPcHRpb25zLFxuXHRcdFx0Li4uKG9wdGlvbnMgfHwge30pLFxuXHRcdH0pLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuXHRcdFx0aWYgKGtleSA9PT0gJ2dyYW1tYXJzJyAmJiAhdmFsdWUpIHtcblx0XHRcdFx0Y29uc3QgU3BlZWNoR3JhbW1hckxpc3QgPSBWb2NhbC5fcmVzb2x2ZVNwZWVjaEdyYW1tYXJMaXN0KClcblx0XHRcdFx0aWYgKCEhU3BlZWNoR3JhbW1hckxpc3QpIHtcblx0XHRcdFx0XHR2YWx1ZSA9IG5ldyBTcGVlY2hHcmFtbWFyTGlzdCgpXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMuX2luc3RhbmNlW2tleV0gPSB2YWx1ZVxuXHRcdH0pXG5cdH1cblxuXHRnZXQgaW5zdGFuY2UoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2luc3RhbmNlXG5cdH1cblxuXHRzZXQgaW5zdGFuY2UoXykge1xuXHRcdHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBzZXQgaW5zdGFuY2UgZGlyZWN0bHkuJylcblx0fVxuXG5cdGFzeW5jIHN0YXJ0KCkge1xuXHRcdGlmICghIXRoaXMuX2luc3RhbmNlKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBzdHJlYW0gPSBhd2FpdCBnZXRVc2VyTWVkaWFTdHJlYW0oJ21pY3JvcGhvbmUnLCB7IGF1ZGlvOiB0cnVlIH0pXG5cdFx0XHRcdGlmICghc3RyZWFtKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gcmV0cmlldmUgdGhlIHN0cmVhbSBmcm9tIG1lZGlhIGRldmljZScpXG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5faW5zdGFuY2Uuc3RhcnQoKVxuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0Y29uc3QgZXJyb3JIYW5kbGVyID0gdGhpcy5fbGlzdGVuZXJzLmVycm9yXG5cdFx0XHRcdGlmICghIWVycm9ySGFuZGxlcikge1xuXHRcdFx0XHRcdGVycm9ySGFuZGxlcihlcnJvcilcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzXG5cdH1cblxuXHRzdG9wKCkge1xuXHRcdGlmICghIXRoaXMuX2luc3RhbmNlKSB7XG5cdFx0XHR0aGlzLl9pbnN0YW5jZS5zdG9wKClcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpc1xuXHR9XG5cblx0YWJvcnQoKSB7XG5cdFx0aWYgKCEhdGhpcy5faW5zdGFuY2UpIHtcblx0XHRcdHRoaXMuX2luc3RhbmNlLmFib3J0KClcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpc1xuXHR9XG5cblx0YWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGNhbGxiYWNrKSB7XG5cdFx0aWYgKCEhdGhpcy5faW5zdGFuY2UgJiYgdGhpcy5faW5jbHVkZXNFdmVudFR5cGUoZXZlbnRUeXBlKSkge1xuXHRcdFx0aWYgKCEhdGhpcy5fbGlzdGVuZXJzW2V2ZW50VHlwZV0pIHtcblx0XHRcdFx0dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSlcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgaGFuZGxlciA9IChldmVudCkgPT4ge1xuXHRcdFx0XHRsZXQgYWRkaXRpb25hbEFyZ3MgPSBbXVxuXHRcdFx0XHRpZiAoZXZlbnRUeXBlID09PSBWb2NhbC5ldmVudFR5cGVzLlJFU1VMVCkge1xuXHRcdFx0XHRcdGlmICghIWV2ZW50LnJlc3VsdHMgJiYgZXZlbnQucmVzdWx0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRhZGRpdGlvbmFsQXJncy5wdXNoKGV2ZW50LnJlc3VsdHNbMF1bMF0udHJhbnNjcmlwdClcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQhIWNhbGxiYWNrICYmIGNhbGxiYWNrLmFwcGx5KHRoaXMsIFtldmVudCwgLi4uYWRkaXRpb25hbEFyZ3NdKVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5faW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGhhbmRsZXIpXG5cblx0XHRcdHRoaXMuX2xpc3RlbmVyc1tldmVudFR5cGVdID0gaGFuZGxlclxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzXG5cdH1cblxuXHRyZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSkge1xuXHRcdGNvbnN0IGhhbmRsZXIgPSB0aGlzLl9saXN0ZW5lcnNbZXZlbnRUeXBlXVxuXHRcdHRoaXMuX2luc3RhbmNlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBoYW5kbGVyKVxuXG5cdFx0ZGVsZXRlIHRoaXMuX2xpc3RlbmVyc1tldmVudFR5cGVdXG5cblx0XHRyZXR1cm4gdGhpc1xuXHR9XG5cblx0Y2xlYW51cCgpIHtcblx0XHR0aGlzLnN0b3AoKVxuXG5cdFx0T2JqZWN0LmtleXModGhpcy5fbGlzdGVuZXJzKS5mb3JFYWNoKChrZXkpID0+IHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihrZXkpKVxuXHRcdHRoaXMuX2luc3RhbmNlID0gbnVsbFxuXG5cdFx0cmV0dXJuIHRoaXNcblx0fVxuXG5cdF9pbmNsdWRlc0V2ZW50VHlwZShldmVudFR5cGUpIHtcblx0XHRyZXR1cm4gISFPYmplY3QudmFsdWVzKFZvY2FsLmV2ZW50VHlwZXMpLmZpbmQoKHR5cGUpID0+IHR5cGUgPT09IGV2ZW50VHlwZSlcblx0fVxuXG5cdHN0YXRpYyBfcmVzb2x2ZVNwZWVjaFJlY29nbml0aW9uKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHR3aW5kb3cuU3BlZWNoUmVjb2duaXRpb24gfHxcblx0XHRcdHdpbmRvdy53ZWJraXRTcGVlY2hSZWNvZ25pdGlvbiB8fFxuXHRcdFx0d2luZG93Lm1velNwZWVjaFJlY29nbml0aW9uIHx8XG5cdFx0XHR3aW5kb3cubXNTcGVlY2hSZWNvZ25pdGlvblxuXHRcdClcblx0fVxuXG5cdHN0YXRpYyBfcmVzb2x2ZVNwZWVjaEdyYW1tYXJMaXN0KCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHR3aW5kb3cuU3BlZWNoR3JhbW1hckxpc3QgfHxcblx0XHRcdHdpbmRvdy53ZWJraXRTcGVlY2hHcmFtbWFyTGlzdCB8fFxuXHRcdFx0d2luZG93Lm1velNwZWVjaEdyYW1tYXJMaXN0IHx8XG5cdFx0XHR3aW5kb3cubXNTcGVlY2hHcmFtbWFyTGlzdFxuXHRcdClcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBWb2NhbFxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJleHBvcnRzIiwiT3AiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd24iLCJoYXNPd25Qcm9wZXJ0eSIsIiRTeW1ib2wiLCJTeW1ib2wiLCJpdGVyYXRvclN5bWJvbCIsIml0ZXJhdG9yIiwiYXN5bmNJdGVyYXRvclN5bWJvbCIsImFzeW5jSXRlcmF0b3IiLCJ0b1N0cmluZ1RhZ1N5bWJvbCIsInRvU3RyaW5nVGFnIiwiZGVmaW5lIiwib2JqIiwia2V5IiwidmFsdWUiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImVyciIsIndyYXAiLCJpbm5lckZuIiwib3V0ZXJGbiIsInNlbGYiLCJ0cnlMb2NzTGlzdCIsInByb3RvR2VuZXJhdG9yIiwiR2VuZXJhdG9yIiwiZ2VuZXJhdG9yIiwiY3JlYXRlIiwiY29udGV4dCIsIkNvbnRleHQiLCJfaW52b2tlIiwic3RhdGUiLCJtZXRob2QiLCJhcmciLCJFcnJvciIsImRvbmVSZXN1bHQiLCJkZWxlZ2F0ZSIsImRlbGVnYXRlUmVzdWx0IiwibWF5YmVJbnZva2VEZWxlZ2F0ZSIsIkNvbnRpbnVlU2VudGluZWwiLCJzZW50IiwiX3NlbnQiLCJkaXNwYXRjaEV4Y2VwdGlvbiIsImFicnVwdCIsInJlY29yZCIsInRyeUNhdGNoIiwidHlwZSIsImRvbmUiLCJtYWtlSW52b2tlTWV0aG9kIiwiZm4iLCJjYWxsIiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsIkl0ZXJhdG9yUHJvdG90eXBlIiwidGhpcyIsImdldFByb3RvIiwiZ2V0UHJvdG90eXBlT2YiLCJOYXRpdmVJdGVyYXRvclByb3RvdHlwZSIsInZhbHVlcyIsIkdwIiwiZGVmaW5lSXRlcmF0b3JNZXRob2RzIiwiZm9yRWFjaCIsIkFzeW5jSXRlcmF0b3IiLCJQcm9taXNlSW1wbCIsInByZXZpb3VzUHJvbWlzZSIsImNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnIiwicmVzb2x2ZSIsInJlamVjdCIsImludm9rZSIsInJlc3VsdCIsIl9fYXdhaXQiLCJ0aGVuIiwidW53cmFwcGVkIiwiZXJyb3IiLCJ1bmRlZmluZWQiLCJUeXBlRXJyb3IiLCJpbmZvIiwicmVzdWx0TmFtZSIsIm5leHQiLCJuZXh0TG9jIiwicHVzaFRyeUVudHJ5IiwibG9jcyIsImVudHJ5IiwidHJ5TG9jIiwiY2F0Y2hMb2MiLCJmaW5hbGx5TG9jIiwiYWZ0ZXJMb2MiLCJ0cnlFbnRyaWVzIiwicHVzaCIsInJlc2V0VHJ5RW50cnkiLCJjb21wbGV0aW9uIiwicmVzZXQiLCJpdGVyYWJsZSIsIml0ZXJhdG9yTWV0aG9kIiwiaXNOYU4iLCJsZW5ndGgiLCJpIiwiY29uc3RydWN0b3IiLCJkaXNwbGF5TmFtZSIsImlzR2VuZXJhdG9yRnVuY3Rpb24iLCJnZW5GdW4iLCJjdG9yIiwibmFtZSIsIm1hcmsiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImF3cmFwIiwiYXN5bmMiLCJQcm9taXNlIiwiaXRlciIsInRvU3RyaW5nIiwia2V5cyIsIm9iamVjdCIsInJldmVyc2UiLCJwb3AiLCJza2lwVGVtcFJlc2V0IiwicHJldiIsImNoYXJBdCIsInNsaWNlIiwic3RvcCIsInJvb3RSZWNvcmQiLCJydmFsIiwiZXhjZXB0aW9uIiwiaGFuZGxlIiwibG9jIiwiY2F1Z2h0IiwiaGFzQ2F0Y2giLCJoYXNGaW5hbGx5IiwiZmluYWxseUVudHJ5IiwiY29tcGxldGUiLCJmaW5pc2giLCJjYXRjaCIsInRocm93biIsImRlbGVnYXRlWWllbGQiLCJtb2R1bGUiLCJyZWdlbmVyYXRvclJ1bnRpbWUiLCJhY2NpZGVudGFsU3RyaWN0TW9kZSIsIkZ1bmN0aW9uIiwiYXN5bmNHZW5lcmF0b3JTdGVwIiwiZ2VuIiwiX25leHQiLCJfdGhyb3ciLCJhcmdzIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJhcnIiLCJBcnJheSIsImlzQXJyYXkiLCJfYXJyIiwiX24iLCJfZCIsIl9lIiwiX3MiLCJfaSIsImxlbiIsImFycjIiLCJvIiwibWluTGVuIiwiYXJyYXlMaWtlVG9BcnJheSIsIm4iLCJmcm9tIiwidGVzdCIsImFycmF5V2l0aEhvbGVzIiwiaXRlcmFibGVUb0FycmF5TGltaXQiLCJ1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsIm5vbkl0ZXJhYmxlUmVzdCIsImluc3RhbmNlIiwiQ29uc3RydWN0b3IiLCJfZGVmaW5lUHJvcGVydGllcyIsInRhcmdldCIsInByb3BzIiwiZGVzY3JpcHRvciIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsImUiLCJyIiwidCIsImEiLCJ1IiwiYyIsInJldHVybiIsIm5hdmlnYXRvciIsInBlcm1pc3Npb25zIiwiRE9NRXhjZXB0aW9uIiwicXVlcnkiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiYWRkRXZlbnRMaXN0ZW5lciIsInQwIiwicyIsIm1lZGlhRGV2aWNlcyIsInQxIiwiZ2V0VXNlck1lZGlhIiwidDIiLCJ0MyIsImFsbCIsInQ0IiwiVm9jYWwiLCJvcHRpb25zIiwiU3BlZWNoUmVjb2duaXRpb24iLCJfcmVzb2x2ZVNwZWVjaFJlY29nbml0aW9uIiwiX2luc3RhbmNlIiwiX2xpc3RlbmVycyIsImVudHJpZXMiLCJkZWZhdWx0T3B0aW9ucyIsIlNwZWVjaEdyYW1tYXJMaXN0IiwiX3Jlc29sdmVTcGVlY2hHcmFtbWFyTGlzdCIsIl90aGlzIiwiXyIsImdldFVzZXJNZWRpYVN0cmVhbSIsImF1ZGlvIiwic3RhcnQiLCJlcnJvckhhbmRsZXIiLCJhYm9ydCIsImV2ZW50VHlwZSIsImNhbGxiYWNrIiwiX2luY2x1ZGVzRXZlbnRUeXBlIiwiaGFuZGxlciIsImV2ZW50IiwiYWRkaXRpb25hbEFyZ3MiLCJldmVudFR5cGVzIiwiUkVTVUxUIiwicmVzdWx0cyIsInRyYW5zY3JpcHQiLCJfdGhpczIiLCJfdGhpczMiLCJmaW5kIiwid2luZG93Iiwid2Via2l0U3BlZWNoUmVjb2duaXRpb24iLCJtb3pTcGVlY2hSZWNvZ25pdGlvbiIsIm1zU3BlZWNoUmVjb2duaXRpb24iLCJ3ZWJraXRTcGVlY2hHcmFtbWFyTGlzdCIsIm1velNwZWVjaEdyYW1tYXJMaXN0IiwibXNTcGVlY2hHcmFtbWFyTGlzdCIsImdyYW1tYXJzIiwibGFuZyIsImNvbnRpbnVvdXMiLCJpbnRlcmltUmVzdWx0cyIsIm1heEFsdGVybmF0aXZlcyIsInNlcnZpY2VVUkkiLCJBVURJT19FTkQiLCJBVURJT19TVEFSVCIsIkVORCIsIkVSUk9SIiwiTk9fTUFUQ0giLCJTT1VORF9FTkQiLCJTT1VORF9TVEFSVCIsIlNQRUVDSF9FTkQiLCJTUEVFQ0hfU1RBUlQiLCJTVEFSVCJdLCJtYXBwaW5ncyI6IjhPQU9BLElBQUlBLEVBQVcsU0FBVUMsR0FHdkIsSUFBSUMsRUFBS0MsT0FBT0MsVUFDWkMsRUFBU0gsRUFBR0ksZUFFWkMsRUFBNEIsbUJBQVhDLE9BQXdCQSxPQUFTLEdBQ2xEQyxFQUFpQkYsRUFBUUcsVUFBWSxhQUNyQ0MsRUFBc0JKLEVBQVFLLGVBQWlCLGtCQUMvQ0MsRUFBb0JOLEVBQVFPLGFBQWUsZ0JBRS9DLFNBQVNDLEVBQU9DLEVBQUtDLEVBQUtDLEdBT3hCLE9BTkFmLE9BQU9nQixlQUFlSCxFQUFLQyxFQUFLLENBQzlCQyxNQUFPQSxFQUNQRSxZQUFZLEVBQ1pDLGNBQWMsRUFDZEMsVUFBVSxJQUVMTixFQUFJQyxHQUViLElBRUVGLEVBQU8sR0FBSSxJQUNYLE1BQU9RLEdBQ1BSLEVBQVMsU0FBU0MsRUFBS0MsRUFBS0MsR0FDMUIsT0FBT0YsRUFBSUMsR0FBT0MsR0FJdEIsU0FBU00sRUFBS0MsRUFBU0MsRUFBU0MsRUFBTUMsR0FFcEMsSUFBSUMsRUFBaUJILEdBQVdBLEVBQVF0QixxQkFBcUIwQixFQUFZSixFQUFVSSxFQUMvRUMsRUFBWTVCLE9BQU82QixPQUFPSCxFQUFlekIsV0FDekM2QixFQUFVLElBQUlDLEVBQVFOLEdBQWUsSUFNekMsT0FGQUcsRUFBVUksUUFzTVosU0FBMEJWLEVBQVNFLEVBQU1NLEdBQ3ZDLElBQUlHLEVBL0t1QixpQkFpTDNCLE9BQU8sU0FBZ0JDLEVBQVFDLEdBQzdCLEdBaExvQixj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
1
+ import { getUserMediaStream as e, isNavigatorMediaDevicesSupported as t, isNavigatorPermissionsSupported as n } from "@untemps/user-permissions-utils";
2
+ //#region src/Vocal.js
3
+ var r = class r {
4
+ static defaultOptions = {
5
+ grammars: null,
6
+ lang: "en-US",
7
+ continuous: !1,
8
+ interimResults: !1,
9
+ maxAlternatives: 1,
10
+ serviceURI: null
11
+ };
12
+ static eventTypes = {
13
+ AUDIO_END: "audioend",
14
+ AUDIO_START: "audiostart",
15
+ END: "end",
16
+ ERROR: "error",
17
+ NO_MATCH: "nomatch",
18
+ RESULT: "result",
19
+ SOUND_END: "soundend",
20
+ SOUND_START: "soundstart",
21
+ SPEECH_END: "speechend",
22
+ SPEECH_START: "speechstart",
23
+ START: "start"
24
+ };
25
+ static get isSupported() {
26
+ return !!r._resolveSpeechRecognition() && !!n() && !!t();
27
+ }
28
+ static set isSupported(e) {
29
+ throw Error("You cannot set isSupported directly.");
30
+ }
31
+ _instance = null;
32
+ _listeners = null;
33
+ constructor(e) {
34
+ let t = r._resolveSpeechRecognition();
35
+ if (!t) throw new DOMException("SpeechRecognition not supported", "NOT_SUPPORTED_ERR");
36
+ this._instance = new t(), this._listeners = {}, Object.entries({
37
+ ...r.defaultOptions,
38
+ ...e || {}
39
+ }).forEach(([e, t]) => {
40
+ if (e === "grammars" && !t) {
41
+ let e = r._resolveSpeechGrammarList();
42
+ e && (t = new e());
43
+ }
44
+ this._instance[e] = t;
45
+ });
46
+ }
47
+ get instance() {
48
+ return this._instance;
49
+ }
50
+ set instance(e) {
51
+ throw Error("You cannot set instance directly.");
52
+ }
53
+ async start() {
54
+ if (this._instance) try {
55
+ if (!await e("microphone", { audio: !0 })) throw Error("Unable to retrieve the stream from media device");
56
+ this._instance.start();
57
+ } catch (e) {
58
+ let t = this._listeners.error;
59
+ t && t(e);
60
+ }
61
+ return this;
62
+ }
63
+ stop() {
64
+ return this._instance && this._instance.stop(), this;
65
+ }
66
+ abort() {
67
+ return this._instance && this._instance.abort(), this;
68
+ }
69
+ addEventListener(e, t) {
70
+ if (this._instance && this._includesEventType(e)) {
71
+ this._listeners[e] && this.removeEventListener(e);
72
+ let n = (n) => {
73
+ let i = [];
74
+ e === r.eventTypes.RESULT && n.results && n.results.length > 0 && i.push(n.results[0][0].transcript), t && t.apply(this, [n, ...i]);
75
+ };
76
+ this._instance.addEventListener(e, n), this._listeners[e] = n;
77
+ }
78
+ return this;
79
+ }
80
+ removeEventListener(e) {
81
+ let t = this._listeners[e];
82
+ return this._instance.removeEventListener(e, t), delete this._listeners[e], this;
83
+ }
84
+ cleanup() {
85
+ return this.stop(), Object.keys(this._listeners).forEach((e) => this.removeEventListener(e)), this._instance = null, this;
86
+ }
87
+ _includesEventType(e) {
88
+ return !!Object.values(r.eventTypes).find((t) => t === e);
89
+ }
90
+ static _resolveSpeechRecognition() {
91
+ return window.SpeechRecognition || window.webkitSpeechRecognition || window.mozSpeechRecognition || window.msSpeechRecognition;
92
+ }
93
+ static _resolveSpeechGrammarList() {
94
+ return window.SpeechGrammarList || window.webkitSpeechGrammarList || window.mozSpeechGrammarList || window.msSpeechGrammarList;
95
+ }
96
+ };
97
+ //#endregion
98
+ export { r as Vocal };
99
+
100
+ //# sourceMappingURL=index.es.js.map