UNPKG

voice-control-library

Version:

Library to customize control over web via W3C Speech API

2 lines 64.8 kB
!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){"use strict";function r(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}n.r(t);var o=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e)}var t,n,o;return t=e,(n=[{key:"dictate",value:function(){}},{key:"result",value:function(){}}])&&r(t.prototype,n),o&&r(t,o),e}();function i(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}var u=function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this._recognition=null,this._initialize(t)}var t,n,r;return t=e,(n=[{key:"_initialize",value:function(e){window.SpeechRecognition=window.webkitSpeechRecognition||window.SpeechRecognition,this._recognition=new SpeechRecognition,this._recognition.language=e.lang?e.lang:void 0,this._recognition.maxAlternatives=e.maxAlternatives?e.maxAlternatives:1}},{key:"dictate",value:function(){this._recognition.start()}},{key:"result",value:function(){var e=this;return new Promise(function(t){e._recognition.onresult=function(e){var n=e.results[0][0].transcript;e.results[0].isFinal&&t(n)}})}},{key:"stop",value:function(){this._recognition.stop()}}])&&i(t.prototype,n),r&&i(t,r),e}();function a(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}var c=function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this._speechApi=null,this._setApi(t)}var t,n,r;return t=e,(n=[{key:"_setApi",value:function(e){if(e.W3C)this._speechApi=new u(e.W3C);else{if(!e.GoogleCloudApi)throw new Error("Is not set any global.speechApi configuration");this._speechApi=new o(e.GoogleCloudApi)}}},{key:"dictate",value:function(){this._speechApi.dictate()}},{key:"result",value:function(){return this._speechApi.result()}},{key:"stop",value:function(){this._speechApi.stop()}}])&&a(t.prototype,n),r&&a(t,r),e}();function l(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}var s=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{key:"",node:null},n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),!(n||t.key&&"string"==typeof t.key))throw new Error("Parent key cannot be null, empty or not type of string!");if(!(n||t.node&&t.node instanceof e))throw new Error("Parent node cannot be null, empty or not class of TrieNode");this._parent=t,this._children={},this.data=null,this.isEndOfWord=!1,this.word=null}var t,n,r;return t=e,(n=[{key:"update",value:function(e){this.isEndOfWord=!!e,this.data=e,this.isEndOfWord||(this.word=null)}},{key:"unlink",value:function(){this._parent={key:"",node:null}}},{key:"hasChildren",value:function(){return Object.keys(this._children).length>0}},{key:"deleteChild",value:function(e){this._children[e]&&(this._children[e].update(null),this._children[e].unlink(),this._children[e].word=null,delete this._children[e])}},{key:"addChild",value:function(e,t){if(!e||!t)return null;var n=this._children[e];return this._children[e]=t,n}},{key:"hasChild",value:function(e){return!!this._children[e]}},{key:"parent",get:function(){return this._parent}},{key:"children",get:function(){return this._children}}])&&l(t.prototype,n),r&&l(t,r),e}();function f(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}var h=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this._root=new s(null,!0),this._lastIndex=1}var t,n,r;return t=e,(n=[{key:"insert",value:function(e,t){return this._insertWord(e,t,this._root,0)}},{key:"_insertWord",value:function(e,t,n,r){if(r===e.length)return n.word=e,n.update(t||this._getNextIndex()),!0;var o=e.charAt(r);return n.hasChild(o)||n.addChild(o,new s({key:o,node:n})),this._insertWord(e,t,n.children[o],r+1)}},{key:"search",value:function(e){var t=this._searchNode(e,this._root,0);return t?t.data:null}},{key:"_searchNode",value:function(e,t,n){if(n===e.length)return t.isEndOfWord?t:null;var r=e.charAt(n);return t.hasChild(r)?this._searchNode(e,t.children[r],n+1):null}},{key:"delete",value:function(e){var t=this._searchNode(e,this._root,0);return!!t&&(t.hasChildren()?(t.update(null),!0):(this._deleteWord(t),!0))}},{key:"_deleteWord",value:function(e){if(e!==this._root){var t=e.parent;t.node.deleteChild(t.key),t.node.hasChildren()||this._deleteWord(t.node)}}},{key:"update",value:function(e,t){var n=this._searchNode(e,this._root,0);return!!n&&(n.update(t),!0)}},{key:"getDataNode",value:function(e){return this._searchNode(e,this._root,0)}},{key:"getPath",value:function(e){var t=[];t.push(this._root);for(var n=1;n<=e.length;n++)t.push(this._searchNode(e.substring(0,n),this._root,0));return t}},{key:"_getNextIndex",value:function(){return this._lastIndex++}},{key:"root",get:function(){return this._root}}])&&f(t.prototype,n),r&&f(t,r),e}();function p(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}var y=function(){function e(t,n){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.querySelector=t,this.domElement=this._setDomElement(t),this.phrases=this._setPhrases(n),this.event=n.actions,this.listener=n.listener}var t,n,r;return t=e,(n=[{key:"_setDomElement",value:function(e){var t=document.querySelector(e);if(t)return t;throw new Error("VCL >> Element "+e+" not found on the page.")}},{key:"_setPhrases",value:function(e){if(e.phrases instanceof Array)return this._simplify(e.phrases);throw new Error("VCL >> phrases for "+this.querySelector+" is not configured.")}},{key:"_simplify",value:function(e){var t=e.map(function(e){return e.normalize("NFD").replace(/[\u0300-\u036f]/g,"").toLowerCase()});return Array.prototype.push.apply(e,t),e}}])&&p(t.prototype,n),r&&p(t,r),e}();function v(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function d(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function b(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}var g=function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this._controlObjects={},this._trie=new h,this.divideControlObjects(t)}var t,n,r;return t=e,(n=[{key:"_unsetGlobalConfig",value:function(e){return e.global?function(e){e.global;return function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{},r=Object.keys(n);"function"==typeof Object.getOwnPropertySymbols&&(r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))),r.forEach(function(t){v(e,t,n[t])})}return e}({},d(e,["global"]))}(e):e}},{key:"divideControlObjects",value:function(e){var t=this;Object.keys(this._unsetGlobalConfig(e)).forEach(function(n){t._controlObjects[n]=new y(n,e[n]),t._controlObjects[n].phrases.forEach(function(e){return t._trie.insert(e,n)})})}},{key:"trie",get:function(){return this._trie}},{key:"controlObjects",get:function(){return this._controlObjects}}])&&b(t.prototype,n),r&&b(t,r),e}();function _(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}var w=function(){function e(t,n){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this._recognizeResult=t,this._controlObject=n}var t,n,r;return t=e,(n=[{key:"actions",get:function(){return this._controlObject.event}},{key:"phrases",get:function(){return this._controlObject.phrases}},{key:"element",get:function(){return this._controlObject.domElement}},{key:"result",get:function(){return this._recognizeResult}},{key:"listener",get:function(){return this._controlObject.listener}}])&&_(t.prototype,n),r&&_(t,r),e}();function k(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}var m=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e)}var t,n,r;return t=e,(n=[{key:"run",value:function(e,t){var n=new w(e,t);this.executeListener(n),this.executeEvents(n)}},{key:"_invoke",value:function(e,t){if(!("on"+e in t.element))throw new Error("VCL >> actions."+e+" event is not supported on element.");t.element.dispatchEvent(new Event(e,{bubbles:!0,cancelable:!1}))}},{key:"_performFunction",value:function(e,t,n){if("boolean"==typeof t)return t;if("function"==typeof t)return t(n);throw new Error("VCL >> actions."+e+" type of value is not recognized.")}},{key:"executeEvents",value:function(e){var t=this;Object.keys(e.actions).forEach(function(n){var r=t._performFunction(n,e.actions[n],e);if(r)t._invoke(n,e);else if("undefined"===r)throw new Error("VCL >> actions."+n+" value must return true or false.")})}},{key:"executeListener",value:function(e){if(e.listener){if("function"!=typeof e.listener)throw new Error("VCL >> type of listener value must be a function.");e.listener(e)}}}])&&k(t.prototype,n),r&&k(t,r),e}();function O(e){return(O="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function j(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}var C=function(){function e(t){var n=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this._speechApi=new c(this._setApiConfig(t)),this._serviceObjects=new g(this._setServiceObjectsConfig(t)),this._runner=new m,this._logging=t.global.speechApi.debug,window.addEventListener("keydown",function(e){e.ctrlKey&&e.shiftKey&&"V"===e.key&&n.execute()})}var t,n,r;return t=e,(n=[{key:"_setApiConfig",value:function(e){if("object"===O(e)&&e.global&&e.global.speechApi)return e.global.speechApi;throw new Error("VCL >> global.speechApi is not configured.")}},{key:"_setServiceObjectsConfig",value:function(e){if("object"===O(e))return e;throw new Error("VCL >> No element configured for voice control.")}},{key:"execute",value:function(){var e=this;this._speechApi.dictate(),this._speechApi.result().then(function(t){e._logging&&console.log("VCL >> Recognize result : "+t);var n=e._searchSelector(t);if(!n)throw new Error("VCL >> Voice command does not match any phrase for the voice control element");e._runner.run(t,e._serviceObjects.controlObjects[n]),e._speechApi.stop()})}},{key:"_searchSelector",value:function(e){var t=this,n=void 0;if([function(e){return e},function(e){return e.toLowerCase()},function(e){return e.normalize("NFD").replace(/[\u0300-\u036f]/g,"").toLowerCase()}].some(function(r){var o=t._serviceObjects.trie.search(r(e));return!!o&&(n=o,!0)}),null!=n)return n}}])&&j(t.prototype,n),r&&j(t,r),e}();n.d(t,"VCL",function(){return C})}]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vc3JjL2FwaS9Hb29nbGVDbG91ZEFwaS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBpL1czQ0FwaS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvYXBpL1NwZWVjaEFwaS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvaW5kZXhlcy90cmllL1RyaWVOb2RlLmpzIiwid2VicGFjazovLy8uL3NyYy9pbmRleGVzL3RyaWUvVHJpZS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY29udHJvbC9Db250cm9sT2JqZWN0LmpzIiwid2VicGFjazovLy8uL3NyYy9jb250cm9sL1NlcnZpY2VPYmplY3RzLmpzIiwid2VicGFjazovLy8uL3NyYy9jb250cm9sL1ZDTEV2ZW50LmpzIiwid2VicGFjazovLy8uL3NyYy9jb250cm9sL1J1bm5lci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvVkNMLmpzIiwid2VicGFjazovLy8uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJpbnN0YWxsZWRNb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiZXhwb3J0cyIsIm1vZHVsZSIsImkiLCJsIiwibW9kdWxlcyIsImNhbGwiLCJtIiwiYyIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsInIiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsInZhbHVlIiwidCIsIm1vZGUiLCJfX2VzTW9kdWxlIiwibnMiLCJjcmVhdGUiLCJrZXkiLCJiaW5kIiwibiIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsIkdvb2dsZUNsb3VkQXBpIiwiX2NsYXNzQ2FsbENoZWNrIiwidGhpcyIsIlczQ0FwaSIsImNvbmZpZyIsIlczQ0FwaV9jbGFzc0NhbGxDaGVjayIsIl9yZWNvZ25pdGlvbiIsIl9pbml0aWFsaXplIiwid2luZG93IiwiU3BlZWNoUmVjb2duaXRpb24iLCJ3ZWJraXRTcGVlY2hSZWNvZ25pdGlvbiIsImxhbmd1YWdlIiwibGFuZyIsInVuZGVmaW5lZCIsIm1heEFsdGVybmF0aXZlcyIsInN0YXJ0IiwiX3RoaXMiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm9ucmVzdWx0IiwiZXZlbnQiLCJzcGVlY2hUb1RleHQiLCJyZXN1bHRzIiwidHJhbnNjcmlwdCIsImlzRmluYWwiLCJzdG9wIiwiU3BlZWNoQXBpIiwiU3BlZWNoQXBpX2NsYXNzQ2FsbENoZWNrIiwiX3NwZWVjaEFwaSIsIl9zZXRBcGkiLCJXM0MiLCJFcnJvciIsImRpY3RhdGUiLCJyZXN1bHQiLCJUcmllTm9kZSIsInBhcmVudCIsImFyZ3VtZW50cyIsImxlbmd0aCIsIm5vZGUiLCJpc1Jvb3QiLCJUcmllTm9kZV9jbGFzc0NhbGxDaGVjayIsIl9wYXJlbnQiLCJfY2hpbGRyZW4iLCJkYXRhIiwiaXNFbmRPZldvcmQiLCJ3b3JkIiwia2V5cyIsImNoYXIiLCJ1cGRhdGUiLCJ1bmxpbmsiLCJvbGQiLCJUcmllIiwiVHJpZV9jbGFzc0NhbGxDaGVjayIsIl9yb290IiwiX2xhc3RJbmRleCIsIl9pbnNlcnRXb3JkIiwiY3VycmVudE5vZGUiLCJ3b3JkSW5kZXgiLCJfZ2V0TmV4dEluZGV4IiwiY2hhckF0IiwiaGFzQ2hpbGQiLCJhZGRDaGlsZCIsImNoaWxkcmVuIiwiX3NlYXJjaE5vZGUiLCJoYXNDaGlsZHJlbiIsIl9kZWxldGVXb3JkIiwiZGVsZXRlQ2hpbGQiLCJwYXRoIiwicHVzaCIsInN1YnN0cmluZyIsIkNvbnRyb2xPYmplY3QiLCJxdWVyeVNlbGVjdG9yIiwiY29udHJvbEVsZW1lbnRWYWx1ZSIsIkNvbnRyb2xPYmplY3RfY2xhc3NDYWxsQ2hlY2siLCJkb21FbGVtZW50IiwiX3NldERvbUVsZW1lbnQiLCJwaHJhc2VzIiwiX3NldFBocmFzZXMiLCJhY3Rpb25zIiwibGlzdGVuZXIiLCJkb2N1bWVudCIsIkFycmF5IiwiX3NpbXBsaWZ5IiwicGhyYXNlc1dpdGhvdXRBY2NlbnQiLCJtYXAiLCJwaHJhc2UiLCJub3JtYWxpemUiLCJyZXBsYWNlIiwidG9Mb3dlckNhc2UiLCJhcHBseSIsIlNlcnZpY2VPYmplY3RzIiwiU2VydmljZU9iamVjdHNfY2xhc3NDYWxsQ2hlY2siLCJfY29udHJvbE9iamVjdHMiLCJfdHJpZSIsImRpdmlkZUNvbnRyb2xPYmplY3RzIiwiZ2xvYmFsIiwiX3JlZiIsIl9vYmplY3RTcHJlYWQiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMiLCJfdW5zZXRHbG9iYWxDb25maWciLCJmb3JFYWNoIiwiaW5zZXJ0IiwiVkNMRXZlbnQiLCJyZWNvZ25pemVSZXN1bHQiLCJjb250cm9sT2JqZWN0IiwiVkNMRXZlbnRfY2xhc3NDYWxsQ2hlY2siLCJfcmVjb2duaXplUmVzdWx0IiwiX2NvbnRyb2xPYmplY3QiLCJSdW5uZXIiLCJSdW5uZXJfY2xhc3NDYWxsQ2hlY2siLCJ2Y2xFdmVudCIsImV4ZWN1dGVMaXN0ZW5lciIsImV4ZWN1dGVFdmVudHMiLCJlbGVtZW50IiwiZGlzcGF0Y2hFdmVudCIsIkV2ZW50IiwiYnViYmxlcyIsImNhbmNlbGFibGUiLCJuYW1lRXZlbnQiLCJmdW5jIiwiZnVuY3Rpb25QZXJmb3JtZWQiLCJfcGVyZm9ybUZ1bmN0aW9uIiwiX2ludm9rZSIsIlZDTCIsIlZDTF9jbGFzc0NhbGxDaGVjayIsIl9zZXRBcGlDb25maWciLCJfc2VydmljZU9iamVjdHMiLCJfc2V0U2VydmljZU9iamVjdHNDb25maWciLCJfcnVubmVyIiwiX2xvZ2dpbmciLCJzcGVlY2hBcGkiLCJkZWJ1ZyIsImFkZEV2ZW50TGlzdGVuZXIiLCJjdHJsS2V5Iiwic2hpZnRLZXkiLCJleGVjdXRlIiwiX3R5cGVvZiIsIl90aGlzMiIsInRoZW4iLCJjb25zb2xlIiwibG9nIiwicmVjb2duaXplU2VsZWN0b3IiLCJfc2VhcmNoU2VsZWN0b3IiLCJydW4iLCJjb250cm9sT2JqZWN0cyIsIl90aGlzMyIsInNvbWUiLCJtb2RpZmllciIsImZpbmQiLCJ0cmllIiwic2VhcmNoIiwiX193ZWJwYWNrX2V4cG9ydHNfXyIsIlZDTF9WQ0wiXSwibWFwcGluZ3MiOiJhQUNBLElBQUFBLEVBQUEsR0FHQSxTQUFBQyxFQUFBQyxHQUdBLEdBQUFGLEVBQUFFLEdBQ0EsT0FBQUYsRUFBQUUsR0FBQUMsUUFHQSxJQUFBQyxFQUFBSixFQUFBRSxHQUFBLENBQ0FHLEVBQUFILEVBQ0FJLEdBQUEsRUFDQUgsUUFBQSxJQVVBLE9BTkFJLEVBQUFMLEdBQUFNLEtBQUFKLEVBQUFELFFBQUFDLElBQUFELFFBQUFGLEdBR0FHLEVBQUFFLEdBQUEsRUFHQUYsRUFBQUQsUUFLQUYsRUFBQVEsRUFBQUYsRUFHQU4sRUFBQVMsRUFBQVYsRUFHQUMsRUFBQVUsRUFBQSxTQUFBUixFQUFBUyxFQUFBQyxHQUNBWixFQUFBYSxFQUFBWCxFQUFBUyxJQUNBRyxPQUFBQyxlQUFBYixFQUFBUyxFQUFBLENBQTBDSyxZQUFBLEVBQUFDLElBQUFMLEtBSzFDWixFQUFBa0IsRUFBQSxTQUFBaEIsR0FDQSxvQkFBQWlCLGVBQUFDLGFBQ0FOLE9BQUFDLGVBQUFiLEVBQUFpQixPQUFBQyxZQUFBLENBQXdEQyxNQUFBLFdBRXhEUCxPQUFBQyxlQUFBYixFQUFBLGNBQWlEbUIsT0FBQSxLQVFqRHJCLEVBQUFzQixFQUFBLFNBQUFELEVBQUFFLEdBRUEsR0FEQSxFQUFBQSxJQUFBRixFQUFBckIsRUFBQXFCLElBQ0EsRUFBQUUsRUFBQSxPQUFBRixFQUNBLEtBQUFFLEdBQUEsaUJBQUFGLFFBQUFHLFdBQUEsT0FBQUgsRUFDQSxJQUFBSSxFQUFBWCxPQUFBWSxPQUFBLE1BR0EsR0FGQTFCLEVBQUFrQixFQUFBTyxHQUNBWCxPQUFBQyxlQUFBVSxFQUFBLFdBQXlDVCxZQUFBLEVBQUFLLFVBQ3pDLEVBQUFFLEdBQUEsaUJBQUFGLEVBQUEsUUFBQU0sS0FBQU4sRUFBQXJCLEVBQUFVLEVBQUFlLEVBQUFFLEVBQUEsU0FBQUEsR0FBZ0gsT0FBQU4sRUFBQU0sSUFBcUJDLEtB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LFVBQVUsT0FBT0MsUUFBUSxtQkFBb0IsSUFBSUMsZ0JBRTdIMEQsS0FBSyxTQUFBQyxHQUNYLElBQU1DLEVBQU9ILEVBQUtuQixnQkFBZ0J1QixLQUFLQyxPQUFPSCxFQUFTNUMsSUFDdkQsUUFBRzZDLElBQ0NQLEVBQW9CTyxHQUNiLEtBSVUsTUFBckJQLEVBQ0EsT0FBT0EsdUNDMUduQmpMLEVBQUFVLEVBQUFpTCxFQUFBLHdCQUFBQyIsImZpbGUiOiJ2Y2wuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBHb29nbGVDbG91ZEFwaSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHt9XHJcblxyXG4gICAgZGljdGF0ZSgpIHt9XHJcblxyXG4gICAgcmVzdWx0KCkge31cclxufSIsIi8qKlxyXG4gKiBXM0MgU3BlZWNoIEFQSVxyXG4gKiBJdCBlbmFibGVzIGRldmVsb3BlcnMgdG8gdXNlIHNjcmlwdGluZyB0byBnZW5lcmF0ZSB0ZXh0LXRvLXNwZWVjaCBvdXRwdXRcclxuICogYW5kIHRvIHVzZSBzcGVlY2ggcmVjb2duaXRpb24gYXMgYW4gaW5wdXQgZm9yIGZvcm1zLCBjb250aW51b3VzIGRpY3RhdGlvbiBhbmQgY29udHJvbC5cclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFczQ0FwaSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXphdGlvbiBzcGVlY2ggcmVjb2duaXRpb24gYW5kIHNldCBoaXMgYXR0cmlidXRlcyBsaWtlIGxhbmd1YWdlLCBjb250aW51b3VzIGFuZCBtYXhpbWFsIGFsdGVybmF0aXZlcy5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0IHwgbnVsbH0gY29uZmlnIFczQyBTcGVlY2ggQVBJIGNvbmZpZ3VyYXRpb25cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XHJcbiAgICAgICAgdGhpcy5fcmVjb2duaXRpb24gPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2luaXRpYWxpemUoY29uZmlnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBfaW5pdGlhbGl6ZShjb25maWcpIHtcclxuICAgICAgICB3aW5kb3cuU3BlZWNoUmVjb2duaXRpb24gPSB3aW5kb3cud2Via2l0U3BlZWNoUmVjb2duaXRpb24gfHwgd2luZG93LlNwZWVjaFJlY29nbml0aW9uO1xyXG4gICAgICAgIHRoaXMuX3JlY29nbml0aW9uID0gbmV3IFNwZWVjaFJlY29nbml0aW9uKCk7XHJcbiAgICAgICAgdGhpcy5fcmVjb2duaXRpb24ubGFuZ3VhZ2UgPSBjb25maWcubGFuZyA/IGNvbmZpZy5sYW5nIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIC8vIHRoaXMuX3JlY29nbml0aW9uLmNvbnRpbnVvdXMgPSBjb25maWcuY29udGludW91cyA/IGNvbmZpZy5jb250aW51b3VzIDogZmFsc2U7XHJcbiAgICAgICAgLy8gdGhpcy5fcmVjb2duaXRpb24uaW50ZXJpbVJlc3VsdHMgPSBjb25maWcuaW50ZXJpbVJlc3VsdHMgPyBjb25maWcuaW50ZXJpbVJlc3VsdHMgOiB0cnVlO1xyXG4gICAgICAgIHRoaXMuX3JlY29nbml0aW9uLm1heEFsdGVybmF0aXZlcyA9IGNvbmZpZy5tYXhBbHRlcm5hdGl2ZXMgPyBjb25maWcubWF4QWx0ZXJuYXRpdmVzIDogMTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEJlZ2luIHRvIGxpc3RlbiB0byB0aGUgYXVkaW8uXHJcbiAgICAgKi9cclxuICAgIGRpY3RhdGUoKSB7XHJcbiAgICAgICAgdGhpcy5fcmVjb2duaXRpb24uc3RhcnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFzeW5jaHJvbm91cyBmdW5jdGlvbiB0aGF0IHJldHVybiB0cmFuc2NyaXB0IHJlc3VsdCBpbiB0ZXh0IGZvcm0uXHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fVxyXG4gICAgICovXHJcbiAgICByZXN1bHQoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlY29nbml0aW9uLm9ucmVzdWx0ID0gKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzcGVlY2hUb1RleHQgPSBldmVudC5yZXN1bHRzWzBdWzBdLnRyYW5zY3JpcHQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQucmVzdWx0c1swXS5pc0ZpbmFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShzcGVlY2hUb1RleHQpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqICBTdG9wIGxpc3RlbmluZyB0byBtb3JlIGF1ZGlvLlxyXG4gICAgICovXHJcbiAgICBzdG9wKCkge1xyXG4gICAgICAgIHRoaXMuX3JlY29nbml0aW9uLnN0b3AoKTtcclxuICAgIH1cclxuXHJcbn0iLCJpbXBvcnQgR29vZ2xlQ2xvdWRBcGkgZnJvbSBcIi4vR29vZ2xlQ2xvdWRBcGlcIjtcclxuaW1wb3J0IFczQ0FwaSBmcm9tIFwiLi9XM0NBcGlcIjtcclxuXHJcbi8qKlxyXG4gKiBGYWNhZGUgdGhhdCBzZXBhcmF0ZXMgQVBJIGZ1bmN0aW9uYWxpdHkgZm9yIHNwZWVjaCByZWNvZ25pdGlvbiBmcm9tIGNvbnRyb2wgYW5kIG90aGVycyBWQ0wgc2VydmljZXMuXHJcbiAqIFByb3ZpZGVzIHRoZSBpc29sYXRpb24gb2Ygd2hhdCBhIGxpYnJhcnkgdXNlciBjYW4gYW5kIHdoZXJlIHRoZXkgc2hvdWxkIG5vdCBiZSBhY2Nlc3NlZC5cclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNwZWVjaEFwaSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgc3BlZWNoQXBpIG9uIFczQ0FwaSBvciBHb29nbGVDbG91ZEFwaSBieSBjb25maWd1cmF0aW9uLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBTcGVlY2hBcGkgY29uZmlndXJhdGlvbi5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XHJcbiAgICAgICAgdGhpcy5fc3BlZWNoQXBpID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9zZXRBcGkoY29uZmlnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBfc2V0QXBpKGNvbmZpZykge1xyXG4gICAgICAgIGlmIChjb25maWcuVzNDKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NwZWVjaEFwaSA9IG5ldyBXM0NBcGkoY29uZmlnLlczQyk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChjb25maWcuR29vZ2xlQ2xvdWRBcGkpIHtcclxuICAgICAgICAgICAgdGhpcy5fc3BlZWNoQXBpID0gbmV3IEdvb2dsZUNsb3VkQXBpKGNvbmZpZy5Hb29nbGVDbG91ZEFwaSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJcyBub3Qgc2V0IGFueSBnbG9iYWwuc3BlZWNoQXBpIGNvbmZpZ3VyYXRpb24nKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxscyB0aGUgY29uZmlndXJlZCBmdW5jdGlvblxyXG4gICAgICovXHJcbiAgICBkaWN0YXRlKCkge1xyXG4gICAgICAgIHRoaXMuX3NwZWVjaEFwaS5kaWN0YXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XHJcbiAgICAgKi9cclxuICAgIHJlc3VsdCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc3BlZWNoQXBpLnJlc3VsdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbHMgdGhlIGNvbmZpZ3VyZWQgZnVuY3Rpb25cclxuICAgICAqL1xyXG4gICAgc3RvcCgpIHtcclxuICAgICAgICB0aGlzLl9zcGVlY2hBcGkuc3RvcCgpO1xyXG4gICAgfVxyXG59IiwiLyoqXHJcbiAqIE5vZGUgb2YgYSB0cmllIGRhdGEgc3RydWN0dXJlLlxyXG4gKiBUaGUgbm9kZSBjYW4gYmUgcm9vdCBvciBhbnkgb3RoZXIgbm9kZSBpbiBUcmllIGRhdGEgc3RydWN0dXJlLlxyXG4gKiBUaGUgaGFzIGFjY2VzcyB0byBpdHMgcGFyZW50IGFuZCBhbGwgb2YgaXRzIGNoaWxkcmVuLlxyXG4gKiBJZiB0aGUgbm9kZSBpcyBpbmRleCBvZiB0aGUgd29yZCBpbnNlcnRlZCBpbnRvIHRoZSBUcmllIGl0IGhhcyBmbGFnIGlzRW5kT2ZXb3JsZCBzZXQgdG8gdHJ1ZSBhbmQgd29yZCBpcyBzZXQgdG8gdGhlIGluZGV4ZWQgd29yZC5cclxuICogSWYgdGhlIG5vZGUgaXMgdGhlIGVuZCBvZiBhIHdvcmQgaXQgY2FuIGNvbnRhaW4gc29tZSBhZGRpdGlvbmFsIGluZGV4IGRhdGEuXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUcmllTm9kZSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25zdHJ1Y3RvciBvZiBhIG5ldyBub2RlIG9mIFRyaWUgZGF0YSBzdHJ1Y3R1cmVcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJlbnQgUGFyZW50IGNvbmZpZyBvYmplY3RcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJlbnQua2V5IEluZGV4IGZvciB0aGlzIG5vZGUgaW4gaXRzIHBhcmVudCBub2RlXHJcbiAgICAgKiBAcGFyYW0ge1RyaWVOb2RlfSBwYXJlbnQubm9kZSBSZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBub2RlXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1Jvb3RdIEJvb2xlYW4gZmxhZyBvZiByb290IG5vZGUuIElmIHRoZSBub2RlIGlzIHJvb3QgaXQgaXMgbm90IGNoZWNrIGZvciBwYXJlbnRcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IocGFyZW50ID0ge2tleTogXCJcIiwgbm9kZTogbnVsbH0sIGlzUm9vdCA9IGZhbHNlKSB7XHJcbiAgICAgICAgaWYgKCFpc1Jvb3QgJiYgKCFwYXJlbnQua2V5IHx8ICEodHlwZW9mIHBhcmVudC5rZXkgPT09ICdzdHJpbmcnKSkpXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhcmVudCBrZXkgY2Fubm90IGJlIG51bGwsIGVtcHR5IG9yIG5vdCB0eXBlIG9mIHN0cmluZyFcIik7XHJcbiAgICAgICAgaWYgKCFpc1Jvb3QgJiYgKCFwYXJlbnQubm9kZSB8fCAhKHBhcmVudC5ub2RlIGluc3RhbmNlb2YgVHJpZU5vZGUpKSlcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGFyZW50IG5vZGUgY2Fubm90IGJlIG51bGwsIGVtcHR5IG9yIG5vdCBjbGFzcyBvZiBUcmllTm9kZVwiKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xyXG4gICAgICAgIHRoaXMuX2NoaWxkcmVuID0ge307XHJcbiAgICAgICAgdGhpcy5kYXRhID0gbnVsbDtcclxuICAgICAgICB0aGlzLmlzRW5kT2ZXb3JkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy53b3JkID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCBwYXJlbnQgb2JqZWN0IGNvbnNpc3Rpbmcgb2YgdGhlIGNoaWxkIGluZGV4IGFuZCBwYXJlbnQgbm9kZS5cclxuICAgICAqIEByZXR1cm5zIHt7a2V5OiBzdHJpbmcsIG5vZGU6IFRyaWVOb2RlfX1cclxuICAgICAqL1xyXG4gICAgZ2V0IHBhcmVudCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IG1hcCBvZiBhbGwgbm9kZSdzIGNoaWxkcmVuLlxyXG4gICAgICogQHJldHVybnMge3t9fHtUcmllTm9kZX19IENoaWxkIGluZGV4IGlzIG9uZSBjaGFyYWN0ZXIgb2YgYSBpbnNlcnRlZCB3b3JkIGFuZCB2YWx1ZSBpcyBjaGlsZCdzIG5vZGUgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBnZXQgY2hpbGRyZW4oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlIGluZGV4ZWQgZGF0YSBvZiB0aGUgbm9kZS5cclxuICAgICAqIEBwYXJhbSB7Kn0gZGF0YSBJZiBkYXRhIGlzIHNldCB0byBzb21lIHZhbHVlIHRoZSBub2RlIGlzIGF1dG9tYXRpY2FsbHkgc2V0IGFzIHRoZSBlbmQgb2YgYSB3b3JkLiBJZiBkYXRhIGhhcyBmYWxzZSB2YWx1ZSBpbmRleGVkIHdvcmQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBub2RlLlxyXG4gICAgICovXHJcbiAgICB1cGRhdGUoZGF0YSkge1xyXG4gICAgICAgIHRoaXMuaXNFbmRPZldvcmQgPSAhIWRhdGE7XHJcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmlzRW5kT2ZXb3JkKVxyXG4gICAgICAgICAgICB0aGlzLndvcmQgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlIHBhcmVudCBvYmplY3QgZnJvbSB0aGlzIG5vZGUuXHJcbiAgICAgKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGZpbmlzaGVkIGFsbCByZWZlcmVuY2UgdG8gdGhpcyBub2RlIGZyb20gdGhlIFRyaWUgcm9vdCBpcyBsb3N0LlxyXG4gICAgICovXHJcbiAgICB1bmxpbmsoKSB7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50ID0ge1xyXG4gICAgICAgICAgICBrZXk6IFwiXCIsXHJcbiAgICAgICAgICAgIG5vZGU6IG51bGxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2sgaWYgdGhlIG5vZGUgaGFzIGFueSBjaGlsZCBub2RlcyBhdHRhY2hlZCB0byBpdC5cclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGhhcyBhbnkgY2hpbGRyZW4sIG90aGVyd2lzZSBmYWxzZS5cclxuICAgICAqL1xyXG4gICAgaGFzQ2hpbGRyZW4oKSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX2NoaWxkcmVuKS5sZW5ndGggPiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVsZXRlIGNoaWxkIGluZGV4ZWQgYnkgdGhlIHByb3ZpZGVkIGNoYXJhY3Rlci5cclxuICAgICAqIElmIHRoZSBjaGlsZCBkb2VzIG5vdCBleGlzdHMgbm90aGluZyBoYXBwZW5zLlxyXG4gICAgICogSWYgdGhlIGNoaWxkIGRvZXMgZXhpc3RzLCB0aGUgY2hpbGQgbm9kZSBvYmplY3QgaXMgZGVsZXRlZC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjaGFyXHJcbiAgICAgKi9cclxuICAgIGRlbGV0ZUNoaWxkKGNoYXIpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2NoaWxkcmVuW2NoYXJdKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgdGhpcy5fY2hpbGRyZW5bY2hhcl0udXBkYXRlKG51bGwpO1xyXG4gICAgICAgIHRoaXMuX2NoaWxkcmVuW2NoYXJdLnVubGluaygpO1xyXG4gICAgICAgIHRoaXMuX2NoaWxkcmVuW2NoYXJdLndvcmQgPSBudWxsO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLl9jaGlsZHJlbltjaGFyXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhIGNoaWxkIHRvIHRoZSBub2RlLlxyXG4gICAgICogSWYgYSBjaGlsZCBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgaW5kZXggaXQgaXMgb3ZlcnJpZGRlbiBieSB0aGUgbmV3IGNoaWxkLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNoYXJcclxuICAgICAqIEBwYXJhbSB7VHJpZU5vZGV9IG5vZGVcclxuICAgICAqIEByZXR1cm5zIHtUcmllTm9kZXxudWxsfSBJZiBhIGNoaWxkIGlzIG92ZXJyaWRkZW4gdGhlIG9sZCBjaGlsZCBub2RlIGlzIHJldHVybiwgb3RoZXJ3aXNlIGZhbHNlLlxyXG4gICAgICovXHJcbiAgICBhZGRDaGlsZChjaGFyLCBub2RlKSB7XHJcbiAgICAgICAgaWYgKCFjaGFyIHx8ICFub2RlKVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgY29uc3Qgb2xkID0gdGhpcy5fY2hpbGRyZW5bY2hhcl07XHJcbiAgICAgICAgdGhpcy5fY2hpbGRyZW5bY2hhcl0gPSBub2RlO1xyXG5cclxuICAgICAgICByZXR1cm4gb2xkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2sgaXMgdGhlIG5vZGUgaGFzIGEgY2hpbGQgaW5kZXhlZCBieSB0aGUgcHJvdmlkZWQgY2hhcmFjdGVyLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNoYXJcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGEgY2hpbGQgZXhpc3RzLCBvdGhlcndpc2UgZmFsc2UuXHJcbiAgICAgKi9cclxuICAgIGhhc0NoaWxkKGNoYXIpIHtcclxuICAgICAgICByZXR1cm4gISF0aGlzLl9jaGlsZHJlbltjaGFyXTtcclxuICAgIH1cclxufSIsImltcG9ydCBUcmllTm9kZSBmcm9tIFwiLi9UcmllTm9kZS5qc1wiO1xyXG5cclxuLyoqXHJcbiAqIFRyaWUgZGF0YSBzdHJ1Y3R1cmUuXHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUcmllIHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBjb25zdHJ1Y3RvclxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLl9yb290ID0gbmV3IFRyaWVOb2RlKG51bGwsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuX2xhc3RJbmRleCA9IDE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgcm9vdCBub2RlIG9mIHRoZSBUcmllXHJcbiAgICAgKiBAcmV0dXJucyB7VHJpZU5vZGV9XHJcbiAgICAgKi9cclxuICAgIGdldCByb290KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9yb290O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5zZXJ0IHdvcmQgdG8gdGhlIFRyaWUgYW5kIG1hcCBkYXRhIG9uIHRoZSB3b3JkLlxyXG4gICAgICogSWYgZGF0YSBpcyBub3QgcHJvdmlkZWQgaXQgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYXMgYW4gaW5jcmVhc2luZyBudW1iZXIuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ313b3JkXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH1bZGF0YV1cclxuICAgICAqL1xyXG4gICAgaW5zZXJ0KHdvcmQsIGRhdGEpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0V29yZCh3b3JkLCBkYXRhLCB0aGlzLl9yb290LCAwKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ313b3JkXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH1kYXRhXHJcbiAgICAgKiBAcGFyYW0ge1RyaWVOb2RlfWN1cnJlbnROb2RlXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn13b3JkSW5kZXhcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIF9pbnNlcnRXb3JkKHdvcmQsIGRhdGEsIGN1cnJlbnROb2RlLCB3b3JkSW5kZXgpIHtcclxuICAgICAgICBpZiAod29yZEluZGV4ID09PSB3b3JkLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBjdXJyZW50Tm9kZS53b3JkID0gd29yZDtcclxuICAgICAgICAgICAgY3VycmVudE5vZGUudXBkYXRlKGRhdGEgfHwgdGhpcy5fZ2V0TmV4dEluZGV4KCkpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBjID0gd29yZC5jaGFyQXQod29yZEluZGV4KTtcclxuICAgICAgICBpZiAoIWN1cnJlbnROb2RlLmhhc0NoaWxkKGMpKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLmFkZENoaWxkKGMsIG5ldyBUcmllTm9kZSh7a2V5OiBjLCBub2RlOiBjdXJyZW50Tm9kZX0pKVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0V29yZCh3b3JkLCBkYXRhLCBjdXJyZW50Tm9kZS5jaGlsZHJlbltjXSwgd29yZEluZGV4ICsgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZWFyY2hpbmcgVHJpZSBmb3IgZGF0YSBpbmRleGVkIGJ5IHRoZSBwcm92aWRlZCB3b3JkLlxyXG4gICAgICogSWYgdGhlIHdvcmQgaXMgaW4gdGhlIFRyaWUgYSBkYXRhIG9iamVjdCBpcyByZXR1cm5lZC5cclxuICAgICAqIElmIHRoZSB3b3JkIGlzIG5vdCBmb3VuZCBpbiB0aGUgVHJpZSBudWxsIGlzIHJldHVybmVkLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9d29yZFxyXG4gICAgICogQHJldHVybnMge09iamVjdCB8IG51bGx9XHJcbiAgICAgKi9cclxuICAgIHNlYXJjaCh3b3JkKSB7XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX3NlYXJjaE5vZGUod29yZCwgdGhpcy5fcm9vdCwgMCk7XHJcbiAgICAgICAgcmV0dXJuICFub2RlID8gbnVsbCA6IG5vZGUuZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCBpbmRleCBub2RlIGZvciB0aGUgd29yZC5cclxuICAgICAqIElmIHRoZSB3b3JkIGlzIG5vdCBpbiB0aGUgVHJpZSBudWxsIGlzIHJldHVybmVkLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9d29yZFxyXG4gICAgICogQHBhcmFtIHtUcmllTm9kZX1jdXJyZW50Tm9kZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9d29yZEluZGV4XHJcbiAgICAgKiBAcmV0dXJucyB7VHJpZU5vZGUgfCBudWxsfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgX3NlYXJjaE5vZGUod29yZCwgY3VycmVudE5vZGUsIHdvcmRJbmRleCkge1xyXG4gICAgICAgIGlmICh3b3JkSW5kZXggPT09IHdvcmQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50Tm9kZS5pc0VuZE9mV29yZCA/IGN1cnJlbnROb2RlIDogbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBjID0gd29yZC5jaGFyQXQod29yZEluZGV4KTtcclxuICAgICAgICByZXR1cm4gY3VycmVudE5vZGUuaGFzQ2hpbGQoYykgPyB0aGlzLl9zZWFyY2hOb2RlKHdvcmQsIGN1cnJlbnROb2RlLmNoaWxkcmVuW2NdLCB3b3JkSW5kZXggKyAxKSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWxldGUgd29yZCBmcm9tIHRoZSBUcmllLlxyXG4gICAgICogSWYgdGhlIHdvcmQgaXMgbm90IGluIHRoZSBUcmllIGZhbHNlIGlzIHJldHVybmVkIG90aGVyd2lzZSB0cnVlLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9d29yZFxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgKi9cclxuICAgIGRlbGV0ZSh3b3JkKSB7XHJcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX3NlYXJjaE5vZGUod29yZCwgdGhpcy5fcm9vdCwgMCk7XHJcbiAgICAgICAgaWYgKCFub2RlKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmIChub2RlLmhhc0NoaWxkcmVuKCkpIHtcclxuICAgICAgICAgICAgbm9kZS51cGRhdGUobnVsbCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZGVsZXRlV29yZChub2RlKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1RyaWVOb2RlfSBjdXJyZW50Tm9kZVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgX2RlbGV0ZVdvcmQoY3VycmVudE5vZGUpIHtcclxuICAgICAgICBpZiAoY3VycmVudE5vZGUgPT09IHRoaXMuX3Jvb3QpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBjb25zdCBwYXJlbnQgPSBjdXJyZW50Tm9kZS5wYXJlbnQ7XHJcblxyXG4gICAgICAgIC8vIGlmKGN1cnJlbnROb2RlLnBhcmVudEtleSA9PT0gd29yZC5jaGFyQXQod29yZEluZGV4KSlcclxuXHJcbiAgICAgICAgcGFyZW50Lm5vZGUuZGVsZXRlQ2hpbGQocGFyZW50LmtleSk7XHJcbiAgICAgICAgaWYgKHBhcmVudC5ub2RlLmhhc0NoaWxkcmVuKCkpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB0aGlzLl9kZWxldGVXb3JkKHBhcmVudC5ub2RlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gd29yZFxyXG4gICAgICogQHBhcmFtIHsqfSBkYXRhXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgICAqL1xyXG4gICAgdXBkYXRlKHdvcmQsIGRhdGEpIHtcclxuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5fc2VhcmNoTm9kZSh3b3JkLCB0aGlzLl9yb290LCAwKTtcclxuICAgICAgICBpZiAoIW5vZGUpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgbm9kZS51cGRhdGUoZGF0YSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHdvcmRcclxuICAgICAqIEByZXR1cm5zIHtUcmllTm9kZX1cclxuICAgICAqL1xyXG4gICAgZ2V0RGF0YU5vZGUod29yZCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zZWFyY2hOb2RlKHdvcmQsIHRoaXMuX3Jvb3QsIDApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB3b3JkXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8VHJpZU5vZGU+fVxyXG4gICAgICovXHJcbiAgICBnZXRQYXRoKHdvcmQpIHtcclxuICAgICAgICBjb25zdCBwYXRoID0gW107XHJcbiAgICAgICAgcGF0aC5wdXNoKHRoaXMuX3Jvb3QpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSB3b3JkLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHBhdGgucHVzaCh0aGlzLl9zZWFyY2hOb2RlKHdvcmQuc3Vic3RyaW5nKDAsIGkpLCB0aGlzLl9yb290LCAwKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcGF0aDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgX2dldE5leHRJbmRleCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdEluZGV4Kys7XHJcbiAgICB9XHJcbn0iLCIvKipcclxuICogS2VlcHMgZGF0YSBjb25maWd1cmVkIGJ5IHVzZXIuXHJcbiAqIEZpbmQgSFRNTEVsZW1lbnQgaWYgZXhpc3RzIG9uIHBhZ2UuXHJcbiAqIFNpbXBsaWZ5IHBocmFzZXMgYnkgcHV0dGluZyBhbGwgdGhlIGxldHRlcnMgaW4gdGhlIGxvd2VyY2FzZSBhbmQgcmVtb3ZlcyBhY2NlbnQgZnJvbSB0aGVtLlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29udHJvbE9iamVjdCB7XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSBkYXRhIHN0cnVjdHVyZSB3aXRoIGFsbCBwcm9wZXJ0aWVzIHRoYXQgVkNMIGFsbG93LlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5U2VsZWN0b3JcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb250cm9sRWxlbWVudFZhbHVlXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKHF1ZXJ5U2VsZWN0b3IsIGNvbnRyb2xFbGVtZW50VmFsdWUpIHtcclxuICAgICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3IgPSBxdWVyeVNlbGVjdG9yO1xyXG4gICAgICAgIHRoaXMuZG9tRWxlbWVudCA9IHRoaXMuX3NldERvbUVsZW1lbnQocXVlcnlTZWxlY3Rvcik7XHJcbiAgICAgICAgdGhpcy5waHJhc2VzID0gdGhpcy5fc2V0UGhyYXNlcyhjb250cm9sRWxlbWVudFZhbHVlKTtcclxuICAgICAgICB0aGlzLmV2ZW50ID0gY29udHJvbEVsZW1lbnRWYWx1ZS5hY3Rpb25zO1xyXG4gICAgICAgIHRoaXMubGlzdGVuZXIgPSBjb250cm9sRWxlbWVudFZhbHVlLmxpc3RlbmVyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeVNlbGVjdG9yXHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIF9zZXREb21FbGVtZW50KHF1ZXJ5U2VsZWN0b3IpIHtcclxuICAgICAgICBjb25zdCBkb21FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihxdWVyeVNlbGVjdG9yKTtcclxuICAgICAgICBpZiAoZG9tRWxlbWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZG9tRWxlbWVudDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZDTCA+PiBFbGVtZW50ICcgKyBxdWVyeVNlbGVjdG9yICsgJyBub3QgZm91bmQgb24gdGhlIHBhZ2UuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb250cm9sRWxlbWVudFZhbHVlXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cclxuICAgIF9zZXRQaHJhc2VzKGNvbnRyb2xFbGVtZW50VmFsdWUpIHtcclxuICAgICAgICBpZiAoY29udHJvbEVsZW1lbnRWYWx1ZS5waHJhc2VzIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NpbXBsaWZ5KGNvbnRyb2xFbGVtZW50VmFsdWUucGhyYXNlcyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWQ0wgPj4gcGhyYXNlcyBmb3IgJyArIHRoaXMucXVlcnlTZWxlY3RvciArICcgaXMgbm90IGNvbmZpZ3VyZWQuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gcGhyYXNlc1xyXG4gICAgICogQHJldHVybnMge0FycmF5PHN0cmluZz59XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBfc2ltcGxpZnkocGhyYXNlcykge1xyXG4gICAgICAgIGNvbnN0IHBocmFzZXNXaXRob3V0QWNjZW50ID0gcGhyYXNlcy5tYXAocGhyYXNlID0+IHBocmFzZS5ub3JtYWxpemUoJ05GRCcpLnJlcGxhY2UoL1tcXHUwMzAwLVxcdTAzNmZdL2csIFwiXCIpLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHBocmFzZXMsIHBocmFzZXNXaXRob3V0QWNjZW50KTtcclxuICAgICAgICByZXR1cm4gcGhyYXNlcztcclxuICAgIH1cclxufSIsImltcG9ydCBUcmllIGZyb20gXCIuLi9pbmRleGVzL3RyaWUvVHJpZVwiO1xyXG5pbXBvcnQgQ29udHJvbE9iamVjdCBmcm9tIFwiLi9Db250cm9sT2JqZWN0XCI7XHJcblxyXG4vKipcclxuICogU2VydmljZXMgaW5wdXQgY29uZmlndXJhdGlvbiBzZXR0aW5ncyByZWxhdGVkIHRvIHBhZ2UgZWxlbWVudHMgYW5kIHRoZWlyIHByb3BlcnRpZXMuXHJcbiAqIFBocmFzZXMgYXJlIGluZGV4ZWQgdG8gdGhlIGFzc29jaWF0ZWQgc2VsZWN0b3IgdXNpbmcgdGhlIFRyaWUg