UNPKG

@ipscape/webconnect

Version:
2 lines 65.6 kB
!function(e){var t={};function n(r){if(t[r])return t[r].exports;var s=t[r]={i:r,l:!1,exports:{}};return e[r].call(s.exports,s,s.exports,n),s.l=!0,s.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 s in e)n.d(r,s,function(t){return e[t]}.bind(null,s));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="/app/connect/",n(n.s=87)}({15:function(e,t,n){"use strict";var r,s="object"==typeof Reflect?Reflect:null,i=s&&"function"==typeof s.apply?s.apply:function(e,t,n){return Function.prototype.apply.call(e,t,n)};r=s&&"function"==typeof s.ownKeys?s.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var o=Number.isNaN||function(e){return e!=e};function c(){c.init.call(this)}e.exports=c,e.exports.once=function(e,t){return new Promise((function(n,r){function s(){void 0!==i&&e.removeListener("error",i),n([].slice.call(arguments))}var i;"error"!==t&&(i=function(n){e.removeListener(t,s),r(n)},e.once("error",i)),e.once(t,s)}))},c.EventEmitter=c,c.prototype._events=void 0,c.prototype._eventsCount=0,c.prototype._maxListeners=void 0;var a=10;function l(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function u(e){return void 0===e._maxListeners?c.defaultMaxListeners:e._maxListeners}function f(e,t,n,r){var s,i,o,c;if(l(n),void 0===(i=e._events)?(i=e._events=Object.create(null),e._eventsCount=0):(void 0!==i.newListener&&(e.emit("newListener",t,n.listener?n.listener:n),i=e._events),o=i[t]),void 0===o)o=i[t]=n,++e._eventsCount;else if("function"==typeof o?o=i[t]=r?[n,o]:[o,n]:r?o.unshift(n):o.push(n),(s=u(e))>0&&o.length>s&&!o.warned){o.warned=!0;var a=new Error("Possible EventEmitter memory leak detected. "+o.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");a.name="MaxListenersExceededWarning",a.emitter=e,a.type=t,a.count=o.length,c=a,console&&console.warn&&console.warn(c)}return e}function h(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function d(e,t,n){var r={fired:!1,wrapFn:void 0,target:e,type:t,listener:n},s=h.bind(r);return s.listener=n,r.wrapFn=s,s}function p(e,t,n){var r=e._events;if(void 0===r)return[];var s=r[t];return void 0===s?[]:"function"==typeof s?n?[s.listener||s]:[s]:n?function(e){for(var t=new Array(e.length),n=0;n<t.length;++n)t[n]=e[n].listener||e[n];return t}(s):v(s,s.length)}function m(e){var t=this._events;if(void 0!==t){var n=t[e];if("function"==typeof n)return 1;if(void 0!==n)return n.length}return 0}function v(e,t){for(var n=new Array(t),r=0;r<t;++r)n[r]=e[r];return n}Object.defineProperty(c,"defaultMaxListeners",{enumerable:!0,get:function(){return a},set:function(e){if("number"!=typeof e||e<0||o(e))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+e+".");a=e}}),c.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},c.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||o(e))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+e+".");return this._maxListeners=e,this},c.prototype.getMaxListeners=function(){return u(this)},c.prototype.emit=function(e){for(var t=[],n=1;n<arguments.length;n++)t.push(arguments[n]);var r="error"===e,s=this._events;if(void 0!==s)r=r&&void 0===s.error;else if(!r)return!1;if(r){var o;if(t.length>0&&(o=t[0]),o instanceof Error)throw o;var c=new Error("Unhandled error."+(o?" ("+o.message+")":""));throw c.context=o,c}var a=s[e];if(void 0===a)return!1;if("function"==typeof a)i(a,this,t);else{var l=a.length,u=v(a,l);for(n=0;n<l;++n)i(u[n],this,t)}return!0},c.prototype.addListener=function(e,t){return f(this,e,t,!1)},c.prototype.on=c.prototype.addListener,c.prototype.prependListener=function(e,t){return f(this,e,t,!0)},c.prototype.once=function(e,t){return l(t),this.on(e,d(this,e,t)),this},c.prototype.prependOnceListener=function(e,t){return l(t),this.prependListener(e,d(this,e,t)),this},c.prototype.removeListener=function(e,t){var n,r,s,i,o;if(l(t),void 0===(r=this._events))return this;if(void 0===(n=r[e]))return this;if(n===t||n.listener===t)0==--this._eventsCount?this._events=Object.create(null):(delete r[e],r.removeListener&&this.emit("removeListener",e,n.listener||t));else if("function"!=typeof n){for(s=-1,i=n.length-1;i>=0;i--)if(n[i]===t||n[i].listener===t){o=n[i].listener,s=i;break}if(s<0)return this;0===s?n.shift():function(e,t){for(;t+1<e.length;t++)e[t]=e[t+1];e.pop()}(n,s),1===n.length&&(r[e]=n[0]),void 0!==r.removeListener&&this.emit("removeListener",e,o||t)}return this},c.prototype.off=c.prototype.removeListener,c.prototype.removeAllListeners=function(e){var t,n,r;if(void 0===(n=this._events))return this;if(void 0===n.removeListener)return 0===arguments.length?(this._events=Object.create(null),this._eventsCount=0):void 0!==n[e]&&(0==--this._eventsCount?this._events=Object.create(null):delete n[e]),this;if(0===arguments.length){var s,i=Object.keys(n);for(r=0;r<i.length;++r)"removeListener"!==(s=i[r])&&this.removeAllListeners(s);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if("function"==typeof(t=n[e]))this.removeListener(e,t);else if(void 0!==t)for(r=t.length-1;r>=0;r--)this.removeListener(e,t[r]);return this},c.prototype.listeners=function(e){return p(this,e,!0)},c.prototype.rawListeners=function(e){return p(this,e,!1)},c.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):m.call(e,t)},c.prototype.listenerCount=m,c.prototype.eventNames=function(){return this._eventsCount>0?r(this._events):[]}},5:function(e,t,n){"use strict";const r=document.getElementById("toastr");function s(e,t){return e.classList?e.classList.contains(t):!!e.className.match(new RegExp("(\\s|^)"+t+"(\\s|$)"))}t.a={hasItem:function(e){return null!==window.sessionStorage.getItem(e)},setItem:function(e,t){window.sessionStorage.setItem(e,t)},getItem:function(e,t){const n=window.sessionStorage.getItem(e);if(!n)return null;switch(t){case"number":return parseInt(n,10);case"object":return JSON.parse(n);case"boolean":return!1;case"string":default:return n}},removeItem:function(e){window.sessionStorage.removeItem(e)},encodeString:function(e){return window.btoa(e)},findInArray:function(e,t){return e.filter(t)},findFirstInArray:function(e,t){return e.filter(t)[0]},hasKeyInObject:function(e,t){const n=Object.prototype.hasOwnProperty;return!(!e||!n.call(e,t))},validateJson:function(e){try{JSON.parse(e)}catch(e){return!1}return!0},showToastr:function({message:e="",callback:t=null,sticky:n=null}){r.className="show",r.innerHTML=e,n||setTimeout((function(){r.innerHTML=r.innerHTML="",r.className=r.className.replace("show","hidden")}),5e3),r.onclick=function(){r.innerHTML=r.innerHTML="",r.className=r.className.replace("show","hidden"),t&&t()}},clearToastr:function(){r.className=r.className.replace("show","hidden"),r.innerHTML=""},hasClass:s,addClass:function(e,t){e.classList?e.classList.add(t):s(e,t)||(e.className+=" "+t)},removeClass:function(e,t){if(e.classList)e.classList.remove(t);else if(s(e,t)){const n=new RegExp("(\\s|^)"+t+"(\\s|$)");e.className=e.className.replace(n," ")}}}},87:function(e,t,n){"use strict";n.r(t),n.d(t,"default",(function(){return l}));var r=n(5);const s=n(15),i="reconnect",o="disconnect",c="new_dtmf",a="answer_call";class l extends s{constructor(){super();const e=this;"BroadcastChannel"in self?e.channel=new BroadcastChannel("ipscape-webrtc"):r.a.showToastr({message:"This browser is not supported by Web Connect. Please make sure to use the latest version of Chrome or Firefox.",sticky:!0}),this.listeners=[],this.post=e=>{try{this.channel.postMessage(e)}catch(e){console.warn("[CONNECT] ",e)}return this},this.done=e=>(this.listeners.push(e),this),this.fire=e=>{this.listeners.forEach(t=>{t(e)}),this.listeners=[]},this.channel.onmessage=function(t){const n=t.data;let s;r.a.hasKeyInObject(n,"message")&&r.a.hasKeyInObject(n.message,"name")&&"ready"===n.message.name&&r.a.showToastr({message:"Another instance of this app has been detected. Please close this window.",sticky:!0});try{if("string"==typeof n){if(-1===n.search("cmd"))return void console.log("[web-connect]: Unexpected string.");s=JSON.parse(n)}else"object"==typeof n&&(s=n)}catch(e){return void console.warn("[web-connect]: %s",e)}if(r.a.hasKeyInObject(s,"cmd"))switch(s.cmd){case"init":e.initialise(s);break;case"disconnect":e.disconnect(s);break;case"reconnect":e.reconnect(s);break;case"sendDTMF":e.handleDtmf(s);break;case"answerCall":e.answerCall(s);break;case"rejectCall":e.rejectCall(s);break;default:console.log("[web-connect]: Not a valid command: ",s.cmd)}else console.log("[web-connect] No command")}}initialise(e){let t;try{t=r.a.getItem("config","object")}catch(e){t={error:e}}this.post({result:t,type:"callback",cid:e.cid})}disconnect(e){let t;try{this.emit(o,{detail:{message:"disconnect",time:new Date}}),t={result:"success"}}catch(e){t={error:e}}this.post({result:t,type:"callback",cid:e.cid})}reconnect(e){let t=null;try{if(this.emit(i,{detail:{message:"reconnect",time:new Date}}),window.CustomEvent){const e=new CustomEvent("onReconnectCommand",{detail:{message:"reconnect",time:new Date},bubbles:!0,cancelable:!0});document.dispatchEvent(e),t={result:"success"}}}catch(e){t={error:e}}this.post({result:t,type:"callback",cid:e.cid})}handleDtmf(e){let t;const n=e.data;console.log("[web-connect]: new DTMF",e);try{this.emit(c,{detail:{message:n,time:new Date}}),t={result:"success"}}catch(e){t={error:e}}}answerCall(e){let t=null;try{this.emit(a,{detail:{time:new Date}}),t={result:"success"}}catch(e){console.log("Answer Call: ",e),t={error:e}}this.post({result:t,type:"callback",cid:e.cid})}rejectCall(e){let t=null;try{if(window.CustomEvent){const e=new CustomEvent("rejectCall",{detail:{time:new Date},bubbles:!0,cancelable:!0});document.dispatchEvent(e),t={result:"success"}}}catch(e){console.log("Reject Call: ",e),t={error:e}}this.post({result:t,type:"callback",cid:e.cid})}}}}); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL2Zucy51dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvY2xhc3MudXRpbHMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL2luZGV4LmpzIiwid2VicGFjazovLy8uL3NyYy91dGlscy9zZXNzaW9uLnN0b3JhZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL21vZHVsZXMvY29udHJvbGxlci5qcyJdLCJuYW1lcyI6WyJpbnN0YWxsZWRNb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiZXhwb3J0cyIsIm1vZHVsZSIsImkiLCJsIiwibW9kdWxlcyIsImNhbGwiLCJtIiwiYyIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsInIiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsInZhbHVlIiwidCIsIm1vZGUiLCJfX2VzTW9kdWxlIiwibnMiLCJjcmVhdGUiLCJrZXkiLCJiaW5kIiwibiIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsIlJlZmxlY3RPd25LZXlzIiwiUiIsIlJlZmxlY3QiLCJSZWZsZWN0QXBwbHkiLCJhcHBseSIsInRhcmdldCIsInJlY2VpdmVyIiwiYXJncyIsIkZ1bmN0aW9uIiwib3duS2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImdldE93blByb3BlcnR5TmFtZXMiLCJjb25jYXQiLCJOdW1iZXJJc05hTiIsIk51bWJlciIsImlzTmFOIiwiRXZlbnRFbWl0dGVyIiwiaW5pdCIsInRoaXMiLCJvbmNlIiwiZW1pdHRlciIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZXZlbnRMaXN0ZW5lciIsInVuZGVmaW5lZCIsImVycm9yTGlzdGVuZXIiLCJyZW1vdmVMaXN0ZW5lciIsInNsaWNlIiwiYXJndW1lbnRzIiwiZXJyIiwiX2V2ZW50cyIsIl9ldmVudHNDb3VudCIsIl9tYXhMaXN0ZW5lcnMiLCJkZWZhdWx0TWF4TGlzdGVuZXJzIiwiY2hlY2tMaXN0ZW5lciIsImxpc3RlbmVyIiwiVHlwZUVycm9yIiwiX2dldE1heExpc3RlbmVycyIsInRoYXQiLCJfYWRkTGlzdGVuZXIiLCJ0eXBlIiwicHJlcGVuZCIsImV2ZW50cyIsImV4aXN0aW5nIiwid2FybmluZyIsIm5ld0xpc3RlbmVyIiwiZW1pdCIsInVuc2hpZnQiLCJwdXNoIiwibGVuZ3RoIiwid2FybmVkIiwidyIsIkVycm9yIiwiU3RyaW5nIiwiY291bnQiLCJjb25zb2xlIiwid2FybiIsIm9uY2VXcmFwcGVyIiwiZmlyZWQiLCJ3cmFwRm4iLCJfb25jZVdyYXAiLCJzdGF0ZSIsIndyYXBwZWQiLCJfbGlzdGVuZXJzIiwidW53cmFwIiwiZXZsaXN0ZW5lciIsImFyciIsInJldCIsIkFycmF5IiwidW53cmFwTGlzdGVuZXJzIiwiYXJyYXlDbG9uZSIsImxpc3RlbmVyQ291bnQiLCJjb3B5Iiwic2V0IiwiYXJnIiwiUmFuZ2VFcnJvciIsImdldFByb3RvdHlwZU9mIiwic2V0TWF4TGlzdGVuZXJzIiwiZ2V0TWF4TGlzdGVuZXJzIiwiZG9FcnJvciIsImVycm9yIiwiZXIiLCJtZXNzYWdlIiwiY29udGV4dCIsImhhbmRsZXIiLCJsZW4iLCJsaXN0ZW5lcnMiLCJhZGRMaXN0ZW5lciIsIm9uIiwicHJlcGVuZExpc3RlbmVyIiwicHJlcGVuZE9uY2VMaXN0ZW5lciIsImxpc3QiLCJwb3NpdGlvbiIsIm9yaWdpbmFsTGlzdGVuZXIiLCJzaGlmdCIsImluZGV4IiwicG9wIiwic3BsaWNlT25lIiwib2ZmIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwia2V5cyIsInJhd0xpc3RlbmVycyIsImV2ZW50TmFtZXMiLCJkb2N1bWVudCIsImdldEVsZW1lbnRCeUlkIiwiaGFzQ2xhc3MiLCJlbCIsImNsYXNzTmFtZSIsImNsYXNzTGlzdCIsImNvbnRhaW5zIiwibWF0Y2giLCJSZWdFeHAiLCJoYXNJdGVtIiwid2luZG93Iiwic2Vzc2lvblN0b3JhZ2UiLCJnZXRJdGVtIiwic2V0SXRlbSIsInN0cmluZyIsIml0ZW0iLCJwYXJzZUludCIsIkpTT04iLCJwYXJzZSIsInJlbW92ZUl0ZW0iLCJlbmNvZGVTdHJpbmciLCJwYXJhbSIsImJ0b2EiLCJmaW5kSW5BcnJheSIsImZuIiwiZmlsdGVyIiwiZmluZEZpcnN0SW5BcnJheSIsImhhc0tleUluT2JqZWN0Iiwib2JqIiwidmFsaWRhdGVKc29uIiwic3RyIiwiZSIsInNob3dUb2FzdHIiLCJjYWxsYmFjayIsInN0aWNreSIsImlubmVySFRNTCIsInNldFRpbWVvdXQiLCJyZXBsYWNlIiwib25jbGljayIsImNsZWFyVG9hc3RyIiwiYWRkQ2xhc3MiLCJhZGQiLCJyZW1vdmVDbGFzcyIsInJlbW92ZSIsInJlZyIsIkV2ZW50cyIsIkNvbnRyb2xsZXIiLCJzdXBlciIsIl9zZWxmIiwic2VsZiIsImNoYW5uZWwiLCJCcm9hZGNhc3RDaGFubmVsIiwicG9zdCIsImRhdGEiLCJwb3N0TWVzc2FnZSIsImRvbmUiLCJmdW5jIiwiZmlyZSIsImZvckVhY2giLCJvbm1lc3NhZ2UiLCJldmVudCIsImNvbW1hbmQiLCJzZWFyY2giLCJsb2ciLCJjbWQiLCJpbml0aWFsaXNlIiwiZGlzY29ubmVjdCIsInJlY29ubmVjdCIsImhhbmRsZUR0bWYiLCJhbnN3ZXJDYWxsIiwicmVqZWN0Q2FsbCIsImNvbmZpZyIsInJlc3VsdCIsImNpZCIsImRldGFpbCIsInRpbWUiLCJEYXRlIiwiQ3VzdG9tRXZlbnQiLCJidWJibGVzIiwiY2FuY2VsYWJsZSIsImRpc3BhdGNoRXZlbnQiLCJ0b25lIl0sIm1hcHBpbmdzIjoiYUFDRSxJQUFJQSxFQUFtQixHQUd2QixTQUFTQyxFQUFvQkMsR0FHNUIsR0FBR0YsRUFBaUJFLEdBQ25CLE9BQU9GLEVB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QUUvRixNQUFPQSxHQUVwQi9ELEtBQUswSSxLQUFLLENBQ1JvQixTQUNBdkksS0FBTSxXQUNOd0ksSUFBSzdDLEVBQUk2QyIsImZpbGUiOiJjb250cm9sbGVyLmE0MDE1NmZkNDYzOTAxOTkyNTQ5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCIvYXBwL2Nvbm5lY3QvXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA4Nyk7XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUiA9IHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyA/IFJlZmxlY3QgOiBudWxsXG52YXIgUmVmbGVjdEFwcGx5ID0gUiAmJiB0eXBlb2YgUi5hcHBseSA9PT0gJ2Z1bmN0aW9uJ1xuICA/IFIuYXBwbHlcbiAgOiBmdW5jdGlvbiBSZWZsZWN0QXBwbHkodGFyZ2V0LCByZWNlaXZlciwgYXJncykge1xuICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbCh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKTtcbiAgfVxuXG52YXIgUmVmbGVjdE93bktleXNcbmlmIChSICYmIHR5cGVvZiBSLm93bktleXMgPT09ICdmdW5jdGlvbicpIHtcbiAgUmVmbGVjdE93bktleXMgPSBSLm93bktleXNcbn0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICBSZWZsZWN0T3duS2V5cyA9IGZ1bmN0aW9uIFJlZmxlY3RPd25LZXlzKHRhcmdldCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQpXG4gICAgICAuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModGFyZ2V0KSk7XG4gIH07XG59IGVsc2Uge1xuICBSZWZsZWN0T3duS2V5cyA9IGZ1bmN0aW9uIFJlZmxlY3RPd25LZXlzKHRhcmdldCkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBQcm9jZXNzRW1pdFdhcm5pbmcod2FybmluZykge1xuICBpZiAoY29uc29sZSAmJiBjb25zb2xlLndhcm4pIGNvbnNvbGUud2Fybih3YXJuaW5nKTtcbn1cblxudmFyIE51bWJlcklzTmFOID0gTnVtYmVyLmlzTmFOIHx8IGZ1bmN0aW9uIE51bWJlcklzTmFOKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgRXZlbnRFbWl0dGVyLmluaXQuY2FsbCh0aGlzKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xubW9kdWxlLmV4cG9ydHMub25jZSA9IG9uY2U7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuMTAueFxuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzQ291bnQgPSAwO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuXG4vLyBCeSBkZWZhdWx0IEV2ZW50RW1pdHRlcnMgd2lsbCBwcmludCBhIHdhcm5pbmcgaWYgbW9yZSB0aGFuIDEwIGxpc3RlbmVycyBhcmVcbi8vIGFkZGVkIHRvIGl0LiBUaGlzIGlzIGEgdXNlZnVsIGRlZmF1bHQgd2hpY2ggaGVscHMgZmluZGluZyBtZW1vcnkgbGVha3MuXG52YXIgZGVmYXVsdE1heExpc3RlbmVycyA9IDEwO1xuXG5mdW5jdGlvbiBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKSB7XG4gIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbi4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGxpc3RlbmVyKTtcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoRXZlbnRFbWl0dGVyLCAnZGVmYXVsdE1heExpc3RlbmVycycsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGVmYXVsdE1heExpc3RlbmVycztcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbihhcmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZyAhPT0gJ251bWJlcicgfHwgYXJnIDwgMCB8fCBOdW1iZXJJc05hTihhcmcpKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiZGVmYXVsdE1heExpc3RlbmVyc1wiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBhcmcgKyAnLicpO1xuICAgIH1cbiAgICBkZWZhdWx0TWF4TGlzdGVuZXJzID0gYXJnO1xuICB9XG59KTtcblxuRXZlbnRFbWl0dGVyLmluaXQgPSBmdW5jdGlvbigpIHtcblxuICBpZiAodGhpcy5fZXZlbnRzID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMuX2V2ZW50cyA9PT0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHMpIHtcbiAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuX2V2ZW50c0NvdW50ID0gMDtcbiAgfVxuXG4gIHRoaXMuX21heExpc3RlbmVycyA9IHRoaXMuX21heExpc3RlbmVycyB8fCB1bmRlZmluZWQ7XG59O1xuXG4vLyBPYnZpb3VzbHkgbm90IGFsbCBFbWl0dGVycyBzaG91bGQgYmUgbGltaXRlZCB0byAxMC4gVGhpcyBmdW5jdGlvbiBhbGxvd3Ncbi8vIHRoYXQgdG8gYmUgaW5jcmVhc2VkLiBTZXQgdG8gemVybyBmb3IgdW5saW1pdGVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBzZXRNYXhMaXN0ZW5lcnMobikge1xuICBpZiAodHlwZW9mIG4gIT09ICdudW1iZXInIHx8IG4gPCAwIHx8IE51bWJlcklzTmFOKG4pKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiBcIm5cIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnICsgbiArICcuJyk7XG4gIH1cbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5mdW5jdGlvbiBfZ2V0TWF4TGlzdGVuZXJzKHRoYXQpIHtcbiAgaWYgKHRoYXQuX21heExpc3RlbmVycyA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBFdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycztcbiAgcmV0dXJuIHRoYXQuX21heExpc3RlbmVycztcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBnZXRNYXhMaXN0ZW5lcnMoKSB7XG4gIHJldHVybiBfZ2V0TWF4TGlzdGVuZXJzKHRoaXMpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gZW1pdCh0eXBlKSB7XG4gIHZhciBhcmdzID0gW107XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSBhcmdzLnB1c2goYXJndW1lbnRzW2ldKTtcbiAgdmFyIGRvRXJyb3IgPSAodHlwZSA9PT0gJ2Vycm9yJyk7XG5cbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgaWYgKGV2ZW50cyAhPT0gdW5kZWZpbmVkKVxuICAgIGRvRXJyb3IgPSAoZG9FcnJvciAmJiBldmVudHMuZXJyb3IgPT09IHVuZGVmaW5lZCk7XG4gIGVsc2UgaWYgKCFkb0Vycm9yKVxuICAgIHJldHVybiBmYWxzZTtcblxuICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuXG4gIGlmIChkb0Vycm9yKSB7XG4gICAgdmFyIGVyO1xuICAgIGlmIChhcmdzLmxlbmd0aCA+IDApXG4gICAgICBlciA9IGFyZ3NbMF07XG4gICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIC8vIE5vdGU6IFRoZSBjb21tZW50cyBvbiB0aGUgYHRocm93YCBsaW5lcyBhcmUgaW50ZW50aW9uYWwsIHRoZXkgc2hvd1xuICAgICAgLy8gdXAgaW4gTm9kZSdzIG91dHB1dCBpZiB0aGlzIHJlc3VsdHMgaW4gYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbi5cbiAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICAgIH1cbiAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyXG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5oYW5kbGVkIGVycm9yLicgKyAoZXIgPyAnICgnICsgZXIubWVzc2FnZSArICcpJyA6ICcnKSk7XG4gICAgZXJyLmNvbnRleHQgPSBlcjtcbiAgICB0aHJvdyBlcnI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gIH1cblxuICB2YXIgaGFuZGxlciA9IGV2ZW50c1t0eXBlXTtcblxuICBpZiAoaGFuZGxlciA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICBSZWZsZWN0QXBwbHkoaGFuZGxlciwgdGhpcywgYXJncyk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGxlbiA9IGhhbmRsZXIubGVuZ3RoO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBhcnJheUNsb25lKGhhbmRsZXIsIGxlbik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSlcbiAgICAgIFJlZmxlY3RBcHBseShsaXN0ZW5lcnNbaV0sIHRoaXMsIGFyZ3MpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5mdW5jdGlvbiBfYWRkTGlzdGVuZXIodGFyZ2V0LCB0eXBlLCBsaXN0ZW5lciwgcHJlcGVuZCkge1xuICB2YXIgbTtcbiAgdmFyIGV2ZW50cztcbiAgdmFyIGV4aXN0aW5nO1xuXG4gIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuXG4gIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzO1xuICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGFyZ2V0Ll9ldmVudHNDb3VudCA9IDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gVG8gYXZvaWQgcmVjdXJzaW9uIGluIHRoZSBjYXNlIHRoYXQgdHlwZSA9PT0gXCJuZXdMaXN0ZW5lclwiISBCZWZvcmVcbiAgICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCBcIm5ld0xpc3RlbmVyXCIuXG4gICAgaWYgKGV2ZW50cy5uZXdMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0YXJnZXQuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLFxuICAgICAgICAgICAgICAgICAgbGlzdGVuZXIubGlzdGVuZXIgPyBsaXN0ZW5lci5saXN0ZW5lciA6IGxpc3RlbmVyKTtcblxuICAgICAgLy8gUmUtYXNzaWduIGBldmVudHNgIGJlY2F1c2UgYSBuZXdMaXN0ZW5lciBoYW5kbGVyIGNvdWxkIGhhdmUgY2F1c2VkIHRoZVxuICAgICAgLy8gdGhpcy5fZXZlbnRzIHRvIGJlIGFzc2lnbmVkIHRvIGEgbmV3IG9iamVjdFxuICAgICAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gICAgfVxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdO1xuICB9XG5cbiAgaWYgKGV4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPcHRpbWl6ZSB0aGUgY2FzZSBvZiBvbmUgbGlzdGVuZXIuIERvbid0IG5lZWQgdGhlIGV4dHJhIGFycmF5IG9iamVjdC5cbiAgICBleGlzdGluZyA9IGV2ZW50c1t0eXBlXSA9IGxpc3RlbmVyO1xuICAgICsrdGFyZ2V0Ll9ldmVudHNDb3VudDtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIGV4aXN0aW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBBZGRpbmcgdGhlIHNlY29uZCBlbGVtZW50LCBuZWVkIHRvIGNoYW5nZSB0byBhcnJheS5cbiAgICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID1cbiAgICAgICAgcHJlcGVuZCA/IFtsaXN0ZW5lciwgZXhpc3RpbmddIDogW2V4aXN0aW5nLCBsaXN0ZW5lcl07XG4gICAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBhcnJheSwganVzdCBhcHBlbmQuXG4gICAgfSBlbHNlIGlmIChwcmVwZW5kKSB7XG4gICAgICBleGlzdGluZy51bnNoaWZ0KGxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhpc3RpbmcucHVzaChsaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGxpc3RlbmVyIGxlYWtcbiAgICBtID0gX2dldE1heExpc3RlbmVycyh0YXJnZXQpO1xuICAgIGlmIChtID4gMCAmJiBleGlzdGluZy5sZW5ndGggPiBtICYmICFleGlzdGluZy53YXJuZWQpIHtcbiAgICAgIGV4aXN0aW5nLndhcm5lZCA9IHRydWU7XG4gICAgICAvLyBObyBlcnJvciBjb2RlIGZvciB0aGlzIHNpbmNlIGl0IGlzIGEgV2FybmluZ1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgICB2YXIgdyA9IG5ldyBFcnJvcignUG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcubGVuZ3RoICsgJyAnICsgU3RyaW5nKHR5cGUpICsgJyBsaXN0ZW5lcnMgJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNyZWFzZSBsaW1pdCcpO1xuICAgICAgdy5uYW1lID0gJ01heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyc7XG4gICAgICB3LmVtaXR0ZXIgPSB0YXJnZXQ7XG4gICAgICB3LnR5cGUgPSB0eXBlO1xuICAgICAgdy5jb3VudCA9IGV4aXN0aW5nLmxlbmd0aDtcbiAgICAgIFByb2Nlc3NFbWl0V2FybmluZyh3KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gZnVuY3Rpb24gYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgcmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lciwgZmFsc2UpO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyID1cbiAgICBmdW5jdGlvbiBwcmVwZW5kTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIHJldHVybiBfYWRkTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIsIHRydWUpO1xuICAgIH07XG5cbmZ1bmN0aW9uIG9uY2VXcmFwcGVyKCkge1xuICBpZiAoIXRoaXMuZmlyZWQpIHtcbiAgICB0aGlzLnRhcmdldC5yZW1vdmVMaXN0ZW5lcih0aGlzLnR5cGUsIHRoaXMud3JhcEZuKTtcbiAgICB0aGlzLmZpcmVkID0gdHJ1ZTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMClcbiAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyLmNhbGwodGhpcy50YXJnZXQpO1xuICAgIHJldHVybiB0aGlzLmxpc3RlbmVyLmFwcGx5KHRoaXMudGFyZ2V0LCBhcmd1bWVudHMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9vbmNlV3JhcCh0YXJnZXQsIHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBzdGF0ZSA9IHsgZmlyZWQ6IGZhbHNlLCB3cmFwRm46IHVuZGVmaW5lZCwgdGFyZ2V0OiB0YXJnZXQsIHR5cGU6IHR5cGUsIGxpc3RlbmVyOiBsaXN0ZW5lciB9O1xuICB2YXIgd3JhcHBlZCA9IG9uY2VXcmFwcGVyLmJpbmQoc3RhdGUpO1xuICB3cmFwcGVkLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gIHN0YXRlLndyYXBGbiA9IHdyYXBwZWQ7XG4gIHJldHVybiB3cmFwcGVkO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuICB0aGlzLm9uKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lciA9XG4gICAgZnVuY3Rpb24gcHJlcGVuZE9uY2VMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgICB0aGlzLnByZXBlbmRMaXN0ZW5lcih0eXBlLCBfb25jZVdyYXAodGhpcywgdHlwZSwgbGlzdGVuZXIpKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbi8vIEVtaXRzIGEgJ3JlbW92ZUxpc3RlbmVyJyBldmVudCBpZiBhbmQgb25seSBpZiB0aGUgbGlzdGVuZXIgd2FzIHJlbW92ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID1cbiAgICBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgdmFyIGxpc3QsIGV2ZW50cywgcG9zaXRpb24sIGksIG9yaWdpbmFsTGlzdGVuZXI7XG5cbiAgICAgIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpO1xuXG4gICAgICBldmVudHMgPSB0aGlzLl9ldmVudHM7XG4gICAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICBsaXN0ID0gZXZlbnRzW3R5cGVdO1xuICAgICAgaWYgKGxpc3QgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fCBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMClcbiAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgZXZlbnRzW3R5cGVdO1xuICAgICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdC5saXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGxpc3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcG9zaXRpb24gPSAtMTtcblxuICAgICAgICBmb3IgKGkgPSBsaXN0Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgaWYgKGxpc3RbaV0gPT09IGxpc3RlbmVyIHx8IGxpc3RbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICBvcmlnaW5hbExpc3RlbmVyID0gbGlzdFtpXS5saXN0ZW5lcjtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwb3NpdGlvbiA8IDApXG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSAwKVxuICAgICAgICAgIGxpc3Quc2hpZnQoKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgc3BsaWNlT25lKGxpc3QsIHBvc2l0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICBldmVudHNbdHlwZV0gPSBsaXN0WzBdO1xuXG4gICAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgb3JpZ2luYWxMaXN0ZW5lciB8fCBsaXN0ZW5lcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub2ZmID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPVxuICAgIGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycyh0eXBlKSB7XG4gICAgICB2YXIgbGlzdGVuZXJzLCBldmVudHMsIGk7XG5cbiAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIC8vIG5vdCBsaXN0ZW5pbmcgZm9yIHJlbW92ZUxpc3RlbmVyLCBubyBuZWVkIHRvIGVtaXRcbiAgICAgIGlmIChldmVudHMucmVtb3ZlTGlzdGVuZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50c1t0eXBlXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKC0tdGhpcy5fZXZlbnRzQ291bnQgPT09IDApXG4gICAgICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIGRlbGV0ZSBldmVudHNbdHlwZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIC8vIGVtaXQgcmVtb3ZlTGlzdGVuZXIgZm9yIGFsbCBsaXN0ZW5lcnMgb24gYWxsIGV2ZW50c1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhldmVudHMpO1xuICAgICAgICB2YXIga2V5O1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgaWYgKGtleSA9PT0gJ3JlbW92ZUxpc3RlbmVyJykgY29udGludWU7XG4gICAgICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncmVtb3ZlTGlzdGVuZXInKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgbGlzdGVuZXJzID0gZXZlbnRzW3R5cGVdO1xuXG4gICAgICBpZiAodHlwZW9mIGxpc3RlbmVycyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc