@vonage/ml-transformers 2.0.1 → 2.0.2

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.
@@ -2168,6 +2168,8 @@ class VonageMediaProcessorWorker extends emittery {
2168
2168
  this.mediapipeHelper_.close().finally(() => {
2169
2169
  if (this.worker_) {
2170
2170
  this.worker_.terminate();
2171
+ this.workerInited_ = false;
2172
+ this.worker_ = void 0;
2171
2173
  }
2172
2174
  });
2173
2175
  }
@@ -2177,6 +2179,10 @@ class VonageMediaProcessorWorker extends emittery {
2177
2179
  }
2178
2180
  init(config) {
2179
2181
  return new Promise((resolve, reject) => {
2182
+ if (!this.worker_) {
2183
+ reject("worker is off");
2184
+ return;
2185
+ }
2180
2186
  let modelOptions = {
2181
2187
  modelSelection: 1,
2182
2188
  selfieMode: false
@@ -2189,7 +2195,9 @@ class VonageMediaProcessorWorker extends emittery {
2189
2195
  options: modelOptions,
2190
2196
  listener: (results) => {
2191
2197
  let result = results;
2192
- this.worker_.postMessage(result.segmentationMask, [result.segmentationMask]);
2198
+ if (this.worker_) {
2199
+ this.worker_.postMessage(result.segmentationMask, [result.segmentationMask]);
2200
+ }
2193
2201
  }
2194
2202
  }
2195
2203
  ]
@@ -2198,6 +2206,10 @@ class VonageMediaProcessorWorker extends emittery {
2198
2206
  if (typeof metaDataStr != "string") {
2199
2207
  metaDataStr = JSON.stringify({});
2200
2208
  }
2209
+ if (!this.worker_) {
2210
+ reject("worker is off");
2211
+ return;
2212
+ }
2201
2213
  this.worker_.postMessage({
2202
2214
  operation: "init",
2203
2215
  metaData: metaDataStr
@@ -2227,6 +2239,10 @@ class VonageMediaProcessorWorker extends emittery {
2227
2239
  }
2228
2240
  transform(readable, writable) {
2229
2241
  return new Promise(async (resolve, reject) => {
2242
+ if (!this.worker_) {
2243
+ reject("worker is off");
2244
+ return;
2245
+ }
2230
2246
  this.worker_.postMessage({
2231
2247
  operation: "transform",
2232
2248
  readable,
@@ -2246,6 +2262,10 @@ class VonageMediaProcessorWorker extends emittery {
2246
2262
  }
2247
2263
  destroy() {
2248
2264
  return new Promise(async (resolve, reject) => {
2265
+ if (!this.worker_) {
2266
+ resolve();
2267
+ return;
2268
+ }
2249
2269
  this.worker_.postMessage({
2250
2270
  operation: "destroy"
2251
2271
  });
@@ -2279,6 +2299,10 @@ class VonageMediaProcessorWorker extends emittery {
2279
2299
  }
2280
2300
  setBackgroundOptions(backgroundOptions) {
2281
2301
  return new Promise((resolve, reject) => {
2302
+ if (!this.worker_) {
2303
+ reject("worker is off");
2304
+ return;
2305
+ }
2282
2306
  this.worker_.postMessage({
2283
2307
  operation: "setBackgroundOptions",
2284
2308
  backgroundOptions: JSON.stringify(backgroundOptions)
@@ -2288,6 +2312,10 @@ class VonageMediaProcessorWorker extends emittery {
2288
2312
  if (inputData.callbackType === "success") {
2289
2313
  if (backgroundOptions.transformerType === "VideoBackground") {
2290
2314
  VonageAssetsLoaderHelper.createVideoReadable(backgroundOptions.backgroundAssetUri).then((res) => {
2315
+ if (!this.worker_) {
2316
+ reject("worker is off");
2317
+ return;
2318
+ }
2291
2319
  this.worker_.postMessage({
2292
2320
  operation: "setVideoBGReadable",
2293
2321
  readable: res
@@ -2307,6 +2335,10 @@ class VonageMediaProcessorWorker extends emittery {
2307
2335
  });
2308
2336
  } else if (backgroundOptions.transformerType === "VirtualBackground") {
2309
2337
  VonageAssetsLoaderHelper.createImageCanvas(backgroundOptions.backgroundAssetUri).then((res) => {
2338
+ if (!this.worker_) {
2339
+ reject("worker is off");
2340
+ return;
2341
+ }
2310
2342
  this.worker_.postMessage({
2311
2343
  operation: "setVirtualBGImage",
2312
2344
  image: res
@@ -1,4 +1,4 @@
1
- (function(m,K){typeof exports=="object"&&typeof module!="undefined"?K(exports,require("@mediapipe/face_detection"),require("@mediapipe/face_mesh"),require("@mediapipe/hands"),require("@mediapipe/holistic"),require("@mediapipe/objectron"),require("@mediapipe/selfie_segmentation"),require("@mediapipe/pose")):typeof define=="function"&&define.amd?define(["exports","@mediapipe/face_detection","@mediapipe/face_mesh","@mediapipe/hands","@mediapipe/holistic","@mediapipe/objectron","@mediapipe/selfie_segmentation","@mediapipe/pose"],K):(m=typeof globalThis!="undefined"?globalThis:m||self,K(m["ml-transformers"]={},m.face_detection,m.face_mesh,m.hands,m.holistic,m.objectron,m.selfie_segmentation,m.pose))})(this,function(m,K,Ye,Ie,Ke,Se,He,Le){"use strict";function Xl(){return new Promise((c,e)=>{typeof MediaStreamTrackProcessor=="undefined"||typeof MediaStreamTrackGenerator=="undefined"?e("Your browser does not support the MediaStreamTrack API for Insertable Streams of Media."):c()})}var Ne={exports:{}},ze=function(e,l){return function(){for(var i=new Array(arguments.length),d=0;d<i.length;d++)i[d]=arguments[d];return e.apply(l,i)}},yl=ze,V=Object.prototype.toString;function de(c){return Array.isArray(c)}function se(c){return typeof c=="undefined"}function Gl(c){return c!==null&&!se(c)&&c.constructor!==null&&!se(c.constructor)&&typeof c.constructor.isBuffer=="function"&&c.constructor.isBuffer(c)}function Fe(c){return V.call(c)==="[object ArrayBuffer]"}function Wl(c){return V.call(c)==="[object FormData]"}function Vl(c){var e;return typeof ArrayBuffer!="undefined"&&ArrayBuffer.isView?e=ArrayBuffer.isView(c):e=c&&c.buffer&&Fe(c.buffer),e}function Rl(c){return typeof c=="string"}function fl(c){return typeof c=="number"}function ge(c){return c!==null&&typeof c=="object"}function w(c){if(V.call(c)!=="[object Object]")return!1;var e=Object.getPrototypeOf(c);return e===null||e===Object.prototype}function Jl(c){return V.call(c)==="[object Date]"}function Yl(c){return V.call(c)==="[object File]"}function Il(c){return V.call(c)==="[object Blob]"}function ve(c){return V.call(c)==="[object Function]"}function Kl(c){return ge(c)&&ve(c.pipe)}function Sl(c){return V.call(c)==="[object URLSearchParams]"}function Hl(c){return c.trim?c.trim():c.replace(/^\s+|\s+$/g,"")}function Ll(){return typeof navigator!="undefined"&&(navigator.product==="ReactNative"||navigator.product==="NativeScript"||navigator.product==="NS")?!1:typeof window!="undefined"&&typeof document!="undefined"}function ae(c,e){if(!(c===null||typeof c=="undefined"))if(typeof c!="object"&&(c=[c]),de(c))for(var l=0,t=c.length;l<t;l++)e.call(null,c[l],l,c);else for(var i in c)Object.prototype.hasOwnProperty.call(c,i)&&e.call(null,c[i],i,c)}function oe(){var c={};function e(i,d){w(c[d])&&w(i)?c[d]=oe(c[d],i):w(i)?c[d]=oe({},i):de(i)?c[d]=i.slice():c[d]=i}for(var l=0,t=arguments.length;l<t;l++)ae(arguments[l],e);return c}function Nl(c,e,l){return ae(e,function(i,d){l&&typeof i=="function"?c[d]=yl(i,l):c[d]=i}),c}function zl(c){return c.charCodeAt(0)===65279&&(c=c.slice(1)),c}var b={isArray:de,isArrayBuffer:Fe,isBuffer:Gl,isFormData:Wl,isArrayBufferView:Vl,isString:Rl,isNumber:fl,isObject:ge,isPlainObject:w,isUndefined:se,isDate:Jl,isFile:Yl,isBlob:Il,isFunction:ve,isStream:Kl,isURLSearchParams:Sl,isStandardBrowserEnv:Ll,forEach:ae,merge:oe,extend:Nl,trim:Hl,stripBOM:zl},S=b;function Ue(c){return encodeURIComponent(c).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}var ke=function(e,l,t){if(!l)return e;var i;if(t)i=t(l);else if(S.isURLSearchParams(l))i=l.toString();else{var d=[];S.forEach(l,function(o,h){o===null||typeof o=="undefined"||(S.isArray(o)?h=h+"[]":o=[o],S.forEach(o,function(Z){S.isDate(Z)?Z=Z.toISOString():S.isObject(Z)&&(Z=JSON.stringify(Z)),d.push(Ue(h)+"="+Ue(Z))}))}),i=d.join("&")}if(i){var n=e.indexOf("#");n!==-1&&(e=e.slice(0,n)),e+=(e.indexOf("?")===-1?"?":"&")+i}return e},Fl=b;function P(){this.handlers=[]}P.prototype.use=function(e,l,t){return this.handlers.push({fulfilled:e,rejected:l,synchronous:t?t.synchronous:!1,runWhen:t?t.runWhen:null}),this.handlers.length-1},P.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},P.prototype.forEach=function(e){Fl.forEach(this.handlers,function(t){t!==null&&e(t)})};var gl=P,vl=b,Ul=function(e,l){vl.forEach(e,function(i,d){d!==l&&d.toUpperCase()===l.toUpperCase()&&(e[l]=i,delete e[d])})},xe=function(e,l,t,i,d){return e.config=l,t&&(e.code=t),e.request=i,e.response=d,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code,status:this.response&&this.response.status?this.response.status:null}},e},kl=xe,Ce=function(e,l,t,i,d){var n=new Error(e);return kl(n,l,t,i,d)},xl=Ce,Cl=function(e,l,t){var i=t.config.validateStatus;!t.status||!i||i(t.status)?e(t):l(xl("Request failed with status code "+t.status,t.config,null,t.request,t))},Q=b,Tl=Q.isStandardBrowserEnv()?function(){return{write:function(l,t,i,d,n,s){var o=[];o.push(l+"="+encodeURIComponent(t)),Q.isNumber(i)&&o.push("expires="+new Date(i).toGMTString()),Q.isString(d)&&o.push("path="+d),Q.isString(n)&&o.push("domain="+n),s===!0&&o.push("secure"),document.cookie=o.join("; ")},read:function(l){var t=document.cookie.match(new RegExp("(^|;\\s*)("+l+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(l){this.write(l,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}(),Bl=function(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)},wl=function(e,l){return l?e.replace(/\/+$/,"")+"/"+l.replace(/^\/+/,""):e},Pl=Bl,Ql=wl,Ml=function(e,l){return e&&!Pl(l)?Ql(e,l):l},Ze=b,jl=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"],El=function(e){var l={},t,i,d;return e&&Ze.forEach(e.split(`
2
- `),function(s){if(d=s.indexOf(":"),t=Ze.trim(s.substr(0,d)).toLowerCase(),i=Ze.trim(s.substr(d+1)),t){if(l[t]&&jl.indexOf(t)>=0)return;t==="set-cookie"?l[t]=(l[t]?l[t]:[]).concat([i]):l[t]=l[t]?l[t]+", "+i:i}}),l},Te=b,Ol=Te.isStandardBrowserEnv()?function(){var e=/(msie|trident)/i.test(navigator.userAgent),l=document.createElement("a"),t;function i(d){var n=d;return e&&(l.setAttribute("href",n),n=l.href),l.setAttribute("href",n),{href:l.href,protocol:l.protocol?l.protocol.replace(/:$/,""):"",host:l.host,search:l.search?l.search.replace(/^\?/,""):"",hash:l.hash?l.hash.replace(/^#/,""):"",hostname:l.hostname,port:l.port,pathname:l.pathname.charAt(0)==="/"?l.pathname:"/"+l.pathname}}return t=i(window.location.href),function(n){var s=Te.isString(n)?i(n):n;return s.protocol===t.protocol&&s.host===t.host}}():function(){return function(){return!0}}();function me(c){this.message=c}me.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},me.prototype.__CANCEL__=!0;var M=me,j=b,Dl=Cl,Al=Tl,_l=ke,$l=Ml,ql=El,et=Ol,re=Ce,lt=O,tt=M,Be=function(e){return new Promise(function(t,i){var d=e.data,n=e.headers,s=e.responseType,o;function h(){e.cancelToken&&e.cancelToken.unsubscribe(o),e.signal&&e.signal.removeEventListener("abort",o)}j.isFormData(d)&&delete n["Content-Type"];var a=new XMLHttpRequest;if(e.auth){var Z=e.auth.username||"",G=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";n.Authorization="Basic "+btoa(Z+":"+G)}var u=$l(e.baseURL,e.url);a.open(e.method.toUpperCase(),_l(u,e.params,e.paramsSerializer),!0),a.timeout=e.timeout;function pl(){if(!!a){var X="getAllResponseHeaders"in a?ql(a.getAllResponseHeaders()):null,U=!s||s==="text"||s==="json"?a.responseText:a.response,I={data:U,status:a.status,statusText:a.statusText,headers:X,config:e,request:a};Dl(function(Je){t(Je),h()},function(Je){i(Je),h()},I),a=null}}if("onloadend"in a?a.onloadend=pl:a.onreadystatechange=function(){!a||a.readyState!==4||a.status===0&&!(a.responseURL&&a.responseURL.indexOf("file:")===0)||setTimeout(pl)},a.onabort=function(){!a||(i(re("Request aborted",e,"ECONNABORTED",a)),a=null)},a.onerror=function(){i(re("Network Error",e,null,a)),a=null},a.ontimeout=function(){var U=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded",I=e.transitional||lt.transitional;e.timeoutErrorMessage&&(U=e.timeoutErrorMessage),i(re(U,e,I.clarifyTimeoutError?"ETIMEDOUT":"ECONNABORTED",a)),a=null},j.isStandardBrowserEnv()){var hl=(e.withCredentials||et(u))&&e.xsrfCookieName?Al.read(e.xsrfCookieName):void 0;hl&&(n[e.xsrfHeaderName]=hl)}"setRequestHeader"in a&&j.forEach(n,function(U,I){typeof d=="undefined"&&I.toLowerCase()==="content-type"?delete n[I]:a.setRequestHeader(I,U)}),j.isUndefined(e.withCredentials)||(a.withCredentials=!!e.withCredentials),s&&s!=="json"&&(a.responseType=e.responseType),typeof e.onDownloadProgress=="function"&&a.addEventListener("progress",e.onDownloadProgress),typeof e.onUploadProgress=="function"&&a.upload&&a.upload.addEventListener("progress",e.onUploadProgress),(e.cancelToken||e.signal)&&(o=function(X){!a||(i(!X||X&&X.type?new tt("canceled"):X),a.abort(),a=null)},e.cancelToken&&e.cancelToken.subscribe(o),e.signal&&(e.signal.aborted?o():e.signal.addEventListener("abort",o))),d||(d=null),a.send(d)})},r=b,we=Ul,ct=xe,it={"Content-Type":"application/x-www-form-urlencoded"};function Pe(c,e){!r.isUndefined(c)&&r.isUndefined(c["Content-Type"])&&(c["Content-Type"]=e)}function nt(){var c;return(typeof XMLHttpRequest!="undefined"||typeof process!="undefined"&&Object.prototype.toString.call(process)==="[object process]")&&(c=Be),c}function dt(c,e,l){if(r.isString(c))try{return(e||JSON.parse)(c),r.trim(c)}catch(t){if(t.name!=="SyntaxError")throw t}return(l||JSON.stringify)(c)}var E={transitional:{silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},adapter:nt(),transformRequest:[function(e,l){return we(l,"Accept"),we(l,"Content-Type"),r.isFormData(e)||r.isArrayBuffer(e)||r.isBuffer(e)||r.isStream(e)||r.isFile(e)||r.isBlob(e)?e:r.isArrayBufferView(e)?e.buffer:r.isURLSearchParams(e)?(Pe(l,"application/x-www-form-urlencoded;charset=utf-8"),e.toString()):r.isObject(e)||l&&l["Content-Type"]==="application/json"?(Pe(l,"application/json"),dt(e)):e}],transformResponse:[function(e){var l=this.transitional||E.transitional,t=l&&l.silentJSONParsing,i=l&&l.forcedJSONParsing,d=!t&&this.responseType==="json";if(d||i&&r.isString(e)&&e.length)try{return JSON.parse(e)}catch(n){if(d)throw n.name==="SyntaxError"?ct(n,this,"E_JSON_PARSE"):n}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};r.forEach(["delete","get","head"],function(e){E.headers[e]={}}),r.forEach(["post","put","patch"],function(e){E.headers[e]=r.merge(it)});var O=E,st=b,at=O,ot=function(e,l,t){var i=this||at;return st.forEach(t,function(n){e=n.call(i,e,l)}),e},Qe=function(e){return!!(e&&e.__CANCEL__)},Me=b,be=ot,Zt=Qe,mt=O,rt=M;function ue(c){if(c.cancelToken&&c.cancelToken.throwIfRequested(),c.signal&&c.signal.aborted)throw new rt("canceled")}var bt=function(e){ue(e),e.headers=e.headers||{},e.data=be.call(e,e.data,e.headers,e.transformRequest),e.headers=Me.merge(e.headers.common||{},e.headers[e.method]||{},e.headers),Me.forEach(["delete","get","head","post","put","patch","common"],function(i){delete e.headers[i]});var l=e.adapter||mt.adapter;return l(e).then(function(i){return ue(e),i.data=be.call(e,i.data,i.headers,e.transformResponse),i},function(i){return Zt(i)||(ue(e),i&&i.response&&(i.response.data=be.call(e,i.response.data,i.response.headers,e.transformResponse))),Promise.reject(i)})},p=b,je=function(e,l){l=l||{};var t={};function i(a,Z){return p.isPlainObject(a)&&p.isPlainObject(Z)?p.merge(a,Z):p.isPlainObject(Z)?p.merge({},Z):p.isArray(Z)?Z.slice():Z}function d(a){if(p.isUndefined(l[a])){if(!p.isUndefined(e[a]))return i(void 0,e[a])}else return i(e[a],l[a])}function n(a){if(!p.isUndefined(l[a]))return i(void 0,l[a])}function s(a){if(p.isUndefined(l[a])){if(!p.isUndefined(e[a]))return i(void 0,e[a])}else return i(void 0,l[a])}function o(a){if(a in l)return i(e[a],l[a]);if(a in e)return i(void 0,e[a])}var h={url:n,method:n,data:n,baseURL:s,transformRequest:s,transformResponse:s,paramsSerializer:s,timeout:s,timeoutMessage:s,withCredentials:s,adapter:s,responseType:s,xsrfCookieName:s,xsrfHeaderName:s,onUploadProgress:s,onDownloadProgress:s,decompress:s,maxContentLength:s,maxBodyLength:s,transport:s,httpAgent:s,httpsAgent:s,cancelToken:s,socketPath:s,responseEncoding:s,validateStatus:o};return p.forEach(Object.keys(e).concat(Object.keys(l)),function(Z){var G=h[Z]||d,u=G(Z);p.isUndefined(u)&&G!==o||(t[Z]=u)}),t},Ee={version:"0.25.0"},ut=Ee.version,pe={};["object","boolean","number","function","string","symbol"].forEach(function(c,e){pe[c]=function(t){return typeof t===c||"a"+(e<1?"n ":" ")+c}});var Oe={};pe.transitional=function(e,l,t){function i(d,n){return"[Axios v"+ut+"] Transitional option '"+d+"'"+n+(t?". "+t:"")}return function(d,n,s){if(e===!1)throw new Error(i(n," has been removed"+(l?" in "+l:"")));return l&&!Oe[n]&&(Oe[n]=!0,console.warn(i(n," has been deprecated since v"+l+" and will be removed in the near future"))),e?e(d,n,s):!0}};function pt(c,e,l){if(typeof c!="object")throw new TypeError("options must be an object");for(var t=Object.keys(c),i=t.length;i-- >0;){var d=t[i],n=e[d];if(n){var s=c[d],o=s===void 0||n(s,d,c);if(o!==!0)throw new TypeError("option "+d+" must be "+o);continue}if(l!==!0)throw Error("Unknown option "+d)}}var ht={assertOptions:pt,validators:pe},De=b,Xt=ke,Ae=gl,_e=bt,D=je,$e=ht,H=$e.validators;function k(c){this.defaults=c,this.interceptors={request:new Ae,response:new Ae}}k.prototype.request=function(e,l){if(typeof e=="string"?(l=l||{},l.url=e):l=e||{},!l.url)throw new Error("Provided config url is not valid");l=D(this.defaults,l),l.method?l.method=l.method.toLowerCase():this.defaults.method?l.method=this.defaults.method.toLowerCase():l.method="get";var t=l.transitional;t!==void 0&&$e.assertOptions(t,{silentJSONParsing:H.transitional(H.boolean),forcedJSONParsing:H.transitional(H.boolean),clarifyTimeoutError:H.transitional(H.boolean)},!1);var i=[],d=!0;this.interceptors.request.forEach(function(u){typeof u.runWhen=="function"&&u.runWhen(l)===!1||(d=d&&u.synchronous,i.unshift(u.fulfilled,u.rejected))});var n=[];this.interceptors.response.forEach(function(u){n.push(u.fulfilled,u.rejected)});var s;if(!d){var o=[_e,void 0];for(Array.prototype.unshift.apply(o,i),o=o.concat(n),s=Promise.resolve(l);o.length;)s=s.then(o.shift(),o.shift());return s}for(var h=l;i.length;){var a=i.shift(),Z=i.shift();try{h=a(h)}catch(G){Z(G);break}}try{s=_e(h)}catch(G){return Promise.reject(G)}for(;n.length;)s=s.then(n.shift(),n.shift());return s},k.prototype.getUri=function(e){if(!e.url)throw new Error("Provided config url is not valid");return e=D(this.defaults,e),Xt(e.url,e.params,e.paramsSerializer).replace(/^\?/,"")},De.forEach(["delete","get","head","options"],function(e){k.prototype[e]=function(l,t){return this.request(D(t||{},{method:e,url:l,data:(t||{}).data}))}}),De.forEach(["post","put","patch"],function(e){k.prototype[e]=function(l,t,i){return this.request(D(i||{},{method:e,url:l,data:t}))}});var yt=k,Gt=M;function L(c){if(typeof c!="function")throw new TypeError("executor must be a function.");var e;this.promise=new Promise(function(i){e=i});var l=this;this.promise.then(function(t){if(!!l._listeners){var i,d=l._listeners.length;for(i=0;i<d;i++)l._listeners[i](t);l._listeners=null}}),this.promise.then=function(t){var i,d=new Promise(function(n){l.subscribe(n),i=n}).then(t);return d.cancel=function(){l.unsubscribe(i)},d},c(function(i){l.reason||(l.reason=new Gt(i),e(l.reason))})}L.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},L.prototype.subscribe=function(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]},L.prototype.unsubscribe=function(e){if(!!this._listeners){var l=this._listeners.indexOf(e);l!==-1&&this._listeners.splice(l,1)}},L.source=function(){var e,l=new L(function(i){e=i});return{token:l,cancel:e}};var Wt=L,Vt=function(e){return function(t){return e.apply(null,t)}},Rt=b,ft=function(e){return Rt.isObject(e)&&e.isAxiosError===!0},qe=b,Jt=ze,A=yt,Yt=je,It=O;function el(c){var e=new A(c),l=Jt(A.prototype.request,e);return qe.extend(l,A.prototype,e),qe.extend(l,e),l.create=function(i){return el(Yt(c,i))},l}var y=el(It);y.Axios=A,y.Cancel=M,y.CancelToken=Wt,y.isCancel=Qe,y.VERSION=Ee.version,y.all=function(e){return Promise.all(e)},y.spread=Vt,y.isAxiosError=ft,Ne.exports=y,Ne.exports.default=y;function Kt(){return globalThis._vonageMediaProcessorMetadata}for(var St=[],he=0;he<256;++he)St.push((he+256).toString(16).substr(1));const R=new WeakMap,_=new WeakMap,x=new WeakMap,Xe=Symbol("anyProducer"),ll=Promise.resolve(),$=Symbol("listenerAdded"),q=Symbol("listenerRemoved");let ye=!1;function N(c){if(typeof c!="string"&&typeof c!="symbol")throw new TypeError("eventName must be a string or a symbol")}function ee(c){if(typeof c!="function")throw new TypeError("listener must be a function")}function z(c,e){const l=_.get(c);return l.has(e)||l.set(e,new Set),l.get(e)}function C(c,e){const l=typeof e=="string"||typeof e=="symbol"?e:Xe,t=x.get(c);return t.has(l)||t.set(l,new Set),t.get(l)}function Ht(c,e,l){const t=x.get(c);if(t.has(e))for(const i of t.get(e))i.enqueue(l);if(t.has(Xe)){const i=Promise.all([e,l]);for(const d of t.get(Xe))d.enqueue(i)}}function tl(c,e){e=Array.isArray(e)?e:[e];let l=!1,t=()=>{},i=[];const d={enqueue(n){i.push(n),t()},finish(){l=!0,t()}};for(const n of e)C(c,n).add(d);return{async next(){return i?i.length===0?l?(i=void 0,this.next()):(await new Promise(n=>{t=n}),this.next()):{done:!1,value:await i.shift()}:{done:!0}},async return(n){i=void 0;for(const s of e)C(c,s).delete(d);return t(),arguments.length>0?{done:!0,value:await n}:{done:!0}},[Symbol.asyncIterator](){return this}}}function cl(c){if(c===void 0)return il;if(!Array.isArray(c))throw new TypeError("`methodNames` must be an array of strings");for(const e of c)if(!il.includes(e))throw typeof e!="string"?new TypeError("`methodNames` element must be a string"):new Error(`${e} is not Emittery method`);return c}const Ge=c=>c===$||c===q;class F{static mixin(e,l){return l=cl(l),t=>{if(typeof t!="function")throw new TypeError("`target` must be function");for(const n of l)if(t.prototype[n]!==void 0)throw new Error(`The property \`${n}\` already exists on \`target\``);function i(){return Object.defineProperty(this,e,{enumerable:!1,value:new F}),this[e]}Object.defineProperty(t.prototype,e,{enumerable:!1,get:i});const d=n=>function(...s){return this[e][n](...s)};for(const n of l)Object.defineProperty(t.prototype,n,{enumerable:!1,value:d(n)});return t}}static get isDebugEnabled(){if(typeof process!="object")return ye;const{env:e}=process||{env:{}};return e.DEBUG==="emittery"||e.DEBUG==="*"||ye}static set isDebugEnabled(e){ye=e}constructor(e={}){R.set(this,new Set),_.set(this,new Map),x.set(this,new Map),this.debug=e.debug||{},this.debug.enabled===void 0&&(this.debug.enabled=!1),this.debug.logger||(this.debug.logger=(l,t,i,d)=>{d=JSON.stringify(d),typeof i=="symbol"&&(i=i.toString());const n=new Date,s=`${n.getHours()}:${n.getMinutes()}:${n.getSeconds()}.${n.getMilliseconds()}`;console.log(`[${s}][emittery:${l}][${t}] Event Name: ${i}
3
- data: ${d}`)})}logIfDebugEnabled(e,l,t){(F.isDebugEnabled||this.debug.enabled)&&this.debug.logger(e,this.debug.name,l,t)}on(e,l){ee(l),e=Array.isArray(e)?e:[e];for(const t of e)N(t),z(this,t).add(l),this.logIfDebugEnabled("subscribe",t,void 0),Ge(t)||this.emit($,{eventName:t,listener:l});return this.off.bind(this,e,l)}off(e,l){ee(l),e=Array.isArray(e)?e:[e];for(const t of e)N(t),z(this,t).delete(l),this.logIfDebugEnabled("unsubscribe",t,void 0),Ge(t)||this.emit(q,{eventName:t,listener:l})}once(e){return new Promise(l=>{const t=this.on(e,i=>{t(),l(i)})})}events(e){e=Array.isArray(e)?e:[e];for(const l of e)N(l);return tl(this,e)}async emit(e,l){N(e),this.logIfDebugEnabled("emit",e,l),Ht(this,e,l);const t=z(this,e),i=R.get(this),d=[...t],n=Ge(e)?[]:[...i];await ll,await Promise.all([...d.map(async s=>{if(t.has(s))return s(l)}),...n.map(async s=>{if(i.has(s))return s(e,l)})])}async emitSerial(e,l){N(e),this.logIfDebugEnabled("emitSerial",e,l);const t=z(this,e),i=R.get(this),d=[...t],n=[...i];await ll;for(const s of d)t.has(s)&&await s(l);for(const s of n)i.has(s)&&await s(e,l)}onAny(e){return ee(e),this.logIfDebugEnabled("subscribeAny",void 0,void 0),R.get(this).add(e),this.emit($,{listener:e}),this.offAny.bind(this,e)}anyEvent(){return tl(this)}offAny(e){ee(e),this.logIfDebugEnabled("unsubscribeAny",void 0,void 0),this.emit(q,{listener:e}),R.get(this).delete(e)}clearListeners(e){e=Array.isArray(e)?e:[e];for(const l of e)if(this.logIfDebugEnabled("clear",l,void 0),typeof l=="string"||typeof l=="symbol"){z(this,l).clear();const t=C(this,l);for(const i of t)i.finish();t.clear()}else{R.get(this).clear();for(const t of _.get(this).values())t.clear();for(const t of x.get(this).values()){for(const i of t)i.finish();t.clear()}}}listenerCount(e){e=Array.isArray(e)?e:[e];let l=0;for(const t of e){if(typeof t=="string"){l+=R.get(this).size+z(this,t).size+C(this,t).size+C(this).size;continue}typeof t!="undefined"&&N(t),l+=R.get(this).size;for(const i of _.get(this).values())l+=i.size;for(const i of x.get(this).values())l+=i.size}return l}bindMethods(e,l){if(typeof e!="object"||e===null)throw new TypeError("`target` must be an object");l=cl(l);for(const t of l){if(e[t]!==void 0)throw new Error(`The property \`${t}\` already exists on \`target\``);Object.defineProperty(e,t,{enumerable:!1,value:this[t].bind(this)})}}}const il=Object.getOwnPropertyNames(F.prototype).filter(c=>c!=="constructor");Object.defineProperty(F,"listenerAdded",{value:$,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(F,"listenerRemoved",{value:q,writable:!1,enumerable:!0,configurable:!1});var nl;(function(c){c.FPS_DROP="fps_drop"})(nl||(nl={}));class Lt{constructor(){this.processor_=null,this.generator_=null}init(e){return new Promise((l,t)=>{try{this.processor_=new MediaStreamTrackProcessor(e)}catch(i){console.log(`[InsertableStreamHelper] MediaStreamTrackProcessor failed: ${i}`),t(i)}try{e.kind==="audio"?this.generator_=new MediaStreamTrackGenerator({kind:"audio"}):e.kind==="video"?this.generator_=new MediaStreamTrackGenerator({kind:"video"}):t("kind not supported")}catch(i){console.log(`[InsertableStreamHelper] MediaStreamTrackGenerator failed: ${i}`),t(i)}l()})}getReadable(){return this.processor_.readable}getWriteable(){return this.generator_.writable}getProccesorTrack(){return this.generator_}}class Nt{constructor(e){this.insertableStreamHelper_=new Lt,this.mediaProcessor_=e}setTrack(e){return new Promise((l,t)=>{this.insertableStreamHelper_.init(e).then(()=>{this.mediaProcessor_.transform(this.insertableStreamHelper_.getReadable(),this.insertableStreamHelper_.getWriteable()).then(()=>{l(this.insertableStreamHelper_.getProccesorTrack())}).catch(i=>{t(i)})}).catch(i=>{t(i)})})}destroy(){return new Promise((e,l)=>{this.mediaProcessor_?this.mediaProcessor_.destroy().then(()=>{e()}).catch(t=>{l(t)}):l("no processor")})}}const dl="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NsYXNzIFB7fVAudXBkYXRlcz17dHJhbnNmb3JtZXJfbmV3OiJOZXcgdHJhbnNmb3JtZXIiLHRyYW5zZm9ybWVyX251bGw6Ik51bGwgdHJhbnNmb3JtZXIifSxQLmVycm9ycz17dHJhbnNmb3JtZXJfbm9uZToiTm8gdHJhbnNmb3JtZXJzIHByb3ZpZGVkIix0cmFuc2Zvcm1lcl9zdGFydDoiQ2Fubm90IHN0YXJ0IHRyYW5zZm9ybWVyIix0cmFuc2Zvcm1lcl90cmFuc2Zvcm06IkNhbm5vdCB0cmFuc2Zvcm0gZnJhbWUiLHRyYW5zZm9ybWVyX2ZsdXNoOiJDYW5ub3QgZmx1c2ggdHJhbnNmb3JtZXIiLHJlYWRhYmxlX251bGw6IlJlYWRhYmxlIGlzIG51bGwiLHdyaXRhYmxlX251bGw6IldyaXRhYmxlIGlzIG51bGwifTt2YXIgZWU9e2V4cG9ydHM6e319LEVlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBuPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSxvPTA7bzxuLmxlbmd0aDtvKyspbltvXT1hcmd1bWVudHNbb107cmV0dXJuIGUuYXBwbHkodCxuKX19LHJ0PUVlLFI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiB0ZShyKXtyZXR1cm4gQXJyYXkuaXNBcnJheShyKX1mdW5jdGlvbiByZShyKXtyZXR1cm4gdHlwZW9mIHI9PSJ1bmRlZmluZWQifWZ1bmN0aW9uIHN0KHIpe3JldHVybiByIT09bnVsbCYmIXJlKHIpJiZyLmNvbnN0cnVjdG9yIT09bnVsbCYmIXJlKHIuY29uc3RydWN0b3IpJiZ0eXBlb2Ygci5jb25zdHJ1Y3Rvci5pc0J1ZmZlcj09ImZ1bmN0aW9uIiYmci5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihyKX1mdW5jdGlvbiBUZShyKXtyZXR1cm4gUi5jYWxsKHIpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIn1mdW5jdGlvbiBudChyKXtyZXR1cm4gUi5jYWxsKHIpPT09IltvYmplY3QgRm9ybURhdGFdIn1mdW5jdGlvbiBpdChyKXt2YXIgZTtyZXR1cm4gdHlwZW9mIEFycmF5QnVmZmVyIT0idW5kZWZpbmVkIiYmQXJyYXlCdWZmZXIuaXNWaWV3P2U9QXJyYXlCdWZmZXIuaXNWaWV3KHIpOmU9ciYmci5idWZmZXImJlRlKHIuYnVmZmVyKSxlfWZ1bmN0aW9uIG90KHIpe3JldHVybiB0eXBlb2Ygcj09InN0cmluZyJ9ZnVuY3Rpb24gYXQocil7cmV0dXJuIHR5cGVvZiByPT0ibnVtYmVyIn1mdW5jdGlvbiBQZShyKXtyZXR1cm4gciE9PW51bGwmJnR5cGVvZiByPT0ib2JqZWN0In1mdW5jdGlvbiBEKHIpe2lmKFIuY2FsbChyKSE9PSJbb2JqZWN0IE9iamVjdF0iKXJldHVybiExO3ZhciBlPU9iamVjdC5nZXRQcm90b3R5cGVPZihyKTtyZXR1cm4gZT09PW51bGx8fGU9PT1PYmplY3QucHJvdG90eXBlfWZ1bmN0aW9uIHV0KHIpe3JldHVybiBSLmNhbGwocik9PT0iW29iamVjdCBEYXRlXSJ9ZnVuY3Rpb24gbHQocil7cmV0dXJuIFIuY2FsbChyKT09PSJbb2JqZWN0IEZpbGVdIn1mdW5jdGlvbiBjdChyKXtyZXR1cm4gUi5jYWxsKHIpPT09IltvYmplY3QgQmxvYl0ifWZ1bmN0aW9uIFJlKHIpe3JldHVybiBSLmNhbGwocik9PT0iW29iamVjdCBGdW5jdGlvbl0ifWZ1bmN0aW9uIGZ0KHIpe3JldHVybiBQZShyKSYmUmUoci5waXBlKX1mdW5jdGlvbiBodChyKXtyZXR1cm4gUi5jYWxsKHIpPT09IltvYmplY3QgVVJMU2VhcmNoUGFyYW1zXSJ9ZnVuY3Rpb24gZHQocil7cmV0dXJuIHIudHJpbT9yLnRyaW0oKTpyLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX1mdW5jdGlvbiBwdCgpe3JldHVybiB0eXBlb2YgbmF2aWdhdG9yIT0idW5kZWZpbmVkIiYmKG5hdmlnYXRvci5wcm9kdWN0PT09IlJlYWN0TmF0aXZlInx8bmF2aWdhdG9yLnByb2R1Y3Q9PT0iTmF0aXZlU2NyaXB0Inx8bmF2aWdhdG9yLnByb2R1Y3Q9PT0iTlMiKT8hMTp0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmdHlwZW9mIGRvY3VtZW50IT0idW5kZWZpbmVkIn1mdW5jdGlvbiBzZShyLGUpe2lmKCEocj09PW51bGx8fHR5cGVvZiByPT0idW5kZWZpbmVkIikpaWYodHlwZW9mIHIhPSJvYmplY3QiJiYocj1bcl0pLHRlKHIpKWZvcih2YXIgdD0wLHM9ci5sZW5ndGg7dDxzO3QrKyllLmNhbGwobnVsbCxyW3RdLHQscik7ZWxzZSBmb3IodmFyIG4gaW4gcilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocixuKSYmZS5jYWxsKG51bGwscltuXSxuLHIpfWZ1bmN0aW9uIG5lKCl7dmFyIHI9e307ZnVuY3Rpb24gZShuLG8pe0QocltvXSkmJkQobik/cltvXT1uZShyW29dLG4pOkQobik/cltvXT1uZSh7fSxuKTp0ZShuKT9yW29dPW4uc2xpY2UoKTpyW29dPW59Zm9yKHZhciB0PTAscz1hcmd1bWVudHMubGVuZ3RoO3Q8czt0Kyspc2UoYXJndW1lbnRzW3RdLGUpO3JldHVybiByfWZ1bmN0aW9uIG10KHIsZSx0KXtyZXR1cm4gc2UoZSxmdW5jdGlvbihuLG8pe3QmJnR5cGVvZiBuPT0iZnVuY3Rpb24iP3Jbb109cnQobix0KTpyW29dPW59KSxyfWZ1bmN0aW9uIGd0KHIpe3JldHVybiByLmNoYXJDb2RlQXQoMCk9PT02NTI3OSYmKHI9ci5zbGljZSgxKSkscn12YXIgcD17aXNBcnJheTp0ZSxpc0FycmF5QnVmZmVyOlRlLGlzQnVmZmVyOnN0LGlzRm9ybURhdGE6bnQsaXNBcnJheUJ1ZmZlclZpZXc6aXQsaXNTdHJpbmc6b3QsaXNOdW1iZXI6YXQsaXNPYmplY3Q6UGUsaXNQbGFpbk9iamVjdDpELGlzVW5kZWZpbmVkOnJlLGlzRGF0ZTp1dCxpc0ZpbGU6bHQsaXNCbG9iOmN0LGlzRnVuY3Rpb246UmUsaXNTdHJlYW06ZnQsaXNVUkxTZWFyY2hQYXJhbXM6aHQsaXNTdGFuZGFyZEJyb3dzZXJFbnY6cHQsZm9yRWFjaDpzZSxtZXJnZTpuZSxleHRlbmQ6bXQsdHJpbTpkdCxzdHJpcEJPTTpndH0sST1wO2Z1bmN0aW9uIFNlKHIpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQocikucmVwbGFjZSgvJTNBL2dpLCI6IikucmVwbGFjZSgvJTI0L2csIiQiKS5yZXBsYWNlKC8lMkMvZ2ksIiwiKS5yZXBsYWNlKC8lMjAvZywiKyIpLnJlcGxhY2UoLyU1Qi9naSwiWyIpLnJlcGxhY2UoLyU1RC9naSwiXSIpfXZhciBDZT1mdW5jdGlvbihlLHQscyl7aWYoIXQpcmV0dXJuIGU7dmFyIG47aWYocyluPXModCk7ZWxzZSBpZihJLmlzVVJMU2VhcmNoUGFyYW1zKHQpKW49dC50b1N0cmluZygpO2Vsc2V7dmFyIG89W107SS5mb3JFYWNoKHQsZnVuY3Rpb24obCxtKXtsPT09bnVsbHx8dHlwZW9mIGw9PSJ1bmRlZmluZWQifHwoSS5pc0FycmF5KGwpP209bSsiW10iOmw9W2xdLEkuZm9yRWFjaChsLGZ1bmN0aW9uKGYpe0kuaXNEYXRlKGYpP2Y9Zi50b0lTT1N0cmluZygpOkkuaXNPYmplY3QoZikmJihmPUpTT04uc3RyaW5naWZ5KGYpKSxvLnB1c2goU2UobSkrIj0iK1NlKGYpKX0pKX0pLG49by5qb2luKCImIil9aWYobil7dmFyIGk9ZS5pbmRleE9mKCIjIik7aSE9PS0xJiYoZT1lLnNsaWNlKDAsaSkpLGUrPShlLmluZGV4T2YoIj8iKT09PS0xPyI/IjoiJiIpK259cmV0dXJuIGV9LHl0PXA7ZnVuY3Rpb24gcSgpe3RoaXMuaGFuZGxlcnM9W119cS5wcm90b3R5cGUudXNlPWZ1bmN0aW9uKGUsdCxzKXtyZXR1cm4gdGhpcy5oYW5kbGVycy5wdXNoKHtmdWxmaWxsZWQ6ZSxyZWplY3RlZDp0LHN5bmNocm9ub3VzOnM/cy5zeW5jaHJvbm91czohMSxydW5XaGVuOnM/cy5ydW5XaGVuOm51bGx9KSx0aGlzLmhhbmRsZXJzLmxlbmd0aC0xfSxxLnByb3RvdHlwZS5lamVjdD1mdW5jdGlvbihlKXt0aGlzLmhhbmRsZXJzW2VdJiYodGhpcy5oYW5kbGVyc1tlXT1udWxsKX0scS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihlKXt5dC5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsZnVuY3Rpb24ocyl7cyE9PW51bGwmJmUocyl9KX07dmFyIF90PXEsYnQ9cCx3dD1mdW5jdGlvbihlLHQpe2J0LmZvckVhY2goZSxmdW5jdGlvbihuLG8pe28hPT10JiZvLnRvVXBwZXJDYXNlKCk9PT10LnRvVXBwZXJDYXNlKCkmJihlW3RdPW4sZGVsZXRlIGVbb10pfSl9LE9lPWZ1bmN0aW9uKGUsdCxzLG4sbyl7cmV0dXJuIGUuY29uZmlnPXQscyYmKGUuY29kZT1zKSxlLnJlcXVlc3Q9bixlLnJlc3BvbnNlPW8sZS5pc0F4aW9zRXJyb3I9ITAsZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57bWVzc2FnZTp0aGlzLm1lc3NhZ2UsbmFtZTp0aGlzLm5hbWUsZGVzY3JpcHRpb246dGhpcy5kZXNjcmlwdGlvbixudW1iZXI6dGhpcy5udW1iZXIsZmlsZU5hbWU6dGhpcy5maWxlTmFtZSxsaW5lTnVtYmVyOnRoaXMubGluZU51bWJlcixjb2x1bW5OdW1iZXI6dGhpcy5jb2x1bW5OdW1iZXIsc3RhY2s6dGhpcy5zdGFjayxjb25maWc6dGhpcy5jb25maWcsY29kZTp0aGlzLmNvZGUsc3RhdHVzOnRoaXMucmVzcG9uc2UmJnRoaXMucmVzcG9uc2Uuc3RhdHVzP3RoaXMucmVzcG9uc2Uuc3RhdHVzOm51bGx9fSxlfSx2dD1PZSxJZT1mdW5jdGlvbihlLHQscyxuLG8pe3ZhciBpPW5ldyBFcnJvcihlKTtyZXR1cm4gdnQoaSx0LHMsbixvKX0sRXQ9SWUsVHQ9ZnVuY3Rpb24oZSx0LHMpe3ZhciBuPXMuY29uZmlnLnZhbGlkYXRlU3RhdHVzOyFzLnN0YXR1c3x8IW58fG4ocy5zdGF0dXMpP2Uocyk6dChFdCgiUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAiK3Muc3RhdHVzLHMuY29uZmlnLG51bGwscy5yZXF1ZXN0LHMpKX0sSD1wLFB0PUguaXNTdGFuZGFyZEJyb3dzZXJFbnYoKT9mdW5jdGlvbigpe3JldHVybnt3cml0ZTpmdW5jdGlvbih0LHMsbixvLGksYSl7dmFyIGw9W107bC5wdXNoKHQrIj0iK2VuY29kZVVSSUNvbXBvbmVudChzKSksSC5pc051bWJlcihuKSYmbC5wdXNoKCJleHBpcmVzPSIrbmV3IERhdGUobikudG9HTVRTdHJpbmcoKSksSC5pc1N0cmluZyhvKSYmbC5wdXNoKCJwYXRoPSIrbyksSC5pc1N0cmluZyhpKSYmbC5wdXNoKCJkb21haW49IitpKSxhPT09ITAmJmwucHVzaCgic2VjdXJlIiksZG9jdW1lbnQuY29va2llPWwuam9pbigiOyAiKX0scmVhZDpmdW5jdGlvbih0KXt2YXIgcz1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58O1xccyopKCIrdCsiKT0oW147XSopIikpO3JldHVybiBzP2RlY29kZVVSSUNvbXBvbmVudChzWzNdKTpudWxsfSxyZW1vdmU6ZnVuY3Rpb24odCl7dGhpcy53cml0ZSh0LCIiLERhdGUubm93KCktODY0ZTUpfX19KCk6ZnVuY3Rpb24oKXtyZXR1cm57d3JpdGU6ZnVuY3Rpb24oKXt9LHJlYWQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0scmVtb3ZlOmZ1bmN0aW9uKCl7fX19KCksUnQ9ZnVuY3Rpb24oZSl7cmV0dXJuL14oW2Etel1bYS16XGQrXC0uXSo6KT9cL1wvL2kudGVzdChlKX0sU3Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD9lLnJlcGxhY2UoL1wvKyQvLCIiKSsiLyIrdC5yZXBsYWNlKC9eXC8rLywiIik6ZX0sQ3Q9UnQsT3Q9U3QsSXQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmIUN0KHQpP090KGUsdCk6dH0saWU9cCx4dD1bImFnZSIsImF1dGhvcml6YXRpb24iLCJjb250ZW50LWxlbmd0aCIsImNvbnRlbnQtdHlwZSIsImV0YWciLCJleHBpcmVzIiwiZnJvbSIsImhvc3QiLCJpZi1tb2RpZmllZC1zaW5jZSIsImlmLXVubW9kaWZpZWQtc2luY2UiLCJsYXN0LW1vZGlmaWVkIiwibG9jYXRpb24iLCJtYXgtZm9yd2FyZHMiLCJwcm94eS1hdXRob3JpemF0aW9uIiwicmVmZXJlciIsInJldHJ5LWFmdGVyIiwidXNlci1hZ2VudCJdLE10PWZ1bmN0aW9uKGUpe3ZhciB0PXt9LHMsbixvO3JldHVybiBlJiZpZS5mb3JFYWNoKGUuc3BsaXQoYApgKSxmdW5jdGlvbihhKXtpZihvPWEuaW5kZXhPZigiOiIpLHM9aWUudHJpbShhLnN1YnN0cigwLG8pKS50b0xvd2VyQ2FzZSgpLG49aWUudHJpbShhLnN1YnN0cihvKzEpKSxzKXtpZih0W3NdJiZ4dC5pbmRleE9mKHMpPj0wKXJldHVybjtzPT09InNldC1jb29raWUiP3Rbc109KHRbc10/dFtzXTpbXSkuY29uY2F0KFtuXSk6dFtzXT10W3NdP3Rbc10rIiwgIituOm59fSksdH0seGU9cCxBdD14ZS5pc1N0YW5kYXJkQnJvd3NlckVudigpP2Z1bmN0aW9uKCl7dmFyIGU9Lyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSxzO2Z1bmN0aW9uIG4obyl7dmFyIGk9bztyZXR1cm4gZSYmKHQuc2V0QXR0cmlidXRlKCJocmVmIixpKSxpPXQuaHJlZiksdC5zZXRBdHRyaWJ1dGUoImhyZWYiLGkpLHtocmVmOnQuaHJlZixwcm90b2NvbDp0LnByb3RvY29sP3QucHJvdG9jb2wucmVwbGFjZSgvOiQvLCIiKToiIixob3N0OnQuaG9zdCxzZWFyY2g6dC5zZWFyY2g/dC5zZWFyY2gucmVwbGFjZSgvXlw/LywiIik6IiIsaGFzaDp0Lmhhc2g/dC5oYXNoLnJlcGxhY2UoL14jLywiIik6IiIsaG9zdG5hbWU6dC5ob3N0bmFtZSxwb3J0OnQucG9ydCxwYXRobmFtZTp0LnBhdGhuYW1lLmNoYXJBdCgwKT09PSIvIj90LnBhdGhuYW1lOiIvIit0LnBhdGhuYW1lfX1yZXR1cm4gcz1uKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxmdW5jdGlvbihpKXt2YXIgYT14ZS5pc1N0cmluZyhpKT9uKGkpOmk7cmV0dXJuIGEucHJvdG9jb2w9PT1zLnByb3RvY29sJiZhLmhvc3Q9PT1zLmhvc3R9fSgpOmZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuITB9fSgpO2Z1bmN0aW9uIG9lKHIpe3RoaXMubWVzc2FnZT1yfW9lLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJDYW5jZWwiKyh0aGlzLm1lc3NhZ2U/IjogIit0aGlzLm1lc3NhZ2U6IiIpfSxvZS5wcm90b3R5cGUuX19DQU5DRUxfXz0hMDt2YXIgaj1vZSxKPXAsa3Q9VHQsTnQ9UHQsVXQ9Q2UsQnQ9SXQsJHQ9TXQsTHQ9QXQsYWU9SWUsRnQ9VyxEdD1qLE1lPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihzLG4pe3ZhciBvPWUuZGF0YSxpPWUuaGVhZGVycyxhPWUucmVzcG9uc2VUeXBlLGw7ZnVuY3Rpb24gbSgpe2UuY2FuY2VsVG9rZW4mJmUuY2FuY2VsVG9rZW4udW5zdWJzY3JpYmUobCksZS5zaWduYWwmJmUuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixsKX1KLmlzRm9ybURhdGEobykmJmRlbGV0ZSBpWyJDb250ZW50LVR5cGUiXTt2YXIgdT1uZXcgWE1MSHR0cFJlcXVlc3Q7aWYoZS5hdXRoKXt2YXIgZj1lLmF1dGgudXNlcm5hbWV8fCIiLFQ9ZS5hdXRoLnBhc3N3b3JkP3VuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlLmF1dGgucGFzc3dvcmQpKToiIjtpLkF1dGhvcml6YXRpb249IkJhc2ljICIrYnRvYShmKyI6IitUKX12YXIgZz1CdChlLmJhc2VVUkwsZS51cmwpO3Uub3BlbihlLm1ldGhvZC50b1VwcGVyQ2FzZSgpLFV0KGcsZS5wYXJhbXMsZS5wYXJhbXNTZXJpYWxpemVyKSwhMCksdS50aW1lb3V0PWUudGltZW91dDtmdW5jdGlvbiBldCgpe2lmKCEhdSl7dmFyIHY9ImdldEFsbFJlc3BvbnNlSGVhZGVycyJpbiB1PyR0KHUuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpOm51bGwsQj0hYXx8YT09PSJ0ZXh0Inx8YT09PSJqc29uIj91LnJlc3BvbnNlVGV4dDp1LnJlc3BvbnNlLE89e2RhdGE6QixzdGF0dXM6dS5zdGF0dXMsc3RhdHVzVGV4dDp1LnN0YXR1c1RleHQsaGVhZGVyczp2LGNvbmZpZzplLHJlcXVlc3Q6dX07a3QoZnVuY3Rpb24odmUpe3ModmUpLG0oKX0sZnVuY3Rpb24odmUpe24odmUpLG0oKX0sTyksdT1udWxsfX1pZigib25sb2FkZW5kImluIHU/dS5vbmxvYWRlbmQ9ZXQ6dS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshdXx8dS5yZWFkeVN0YXRlIT09NHx8dS5zdGF0dXM9PT0wJiYhKHUucmVzcG9uc2VVUkwmJnUucmVzcG9uc2VVUkwuaW5kZXhPZigiZmlsZToiKT09PTApfHxzZXRUaW1lb3V0KGV0KX0sdS5vbmFib3J0PWZ1bmN0aW9uKCl7IXV8fChuKGFlKCJSZXF1ZXN0IGFib3J0ZWQiLGUsIkVDT05OQUJPUlRFRCIsdSkpLHU9bnVsbCl9LHUub25lcnJvcj1mdW5jdGlvbigpe24oYWUoIk5ldHdvcmsgRXJyb3IiLGUsbnVsbCx1KSksdT1udWxsfSx1Lm9udGltZW91dD1mdW5jdGlvbigpe3ZhciBCPWUudGltZW91dD8idGltZW91dCBvZiAiK2UudGltZW91dCsibXMgZXhjZWVkZWQiOiJ0aW1lb3V0IGV4Y2VlZGVkIixPPWUudHJhbnNpdGlvbmFsfHxGdC50cmFuc2l0aW9uYWw7ZS50aW1lb3V0RXJyb3JNZXNzYWdlJiYoQj1lLnRpbWVvdXRFcnJvck1lc3NhZ2UpLG4oYWUoQixlLE8uY2xhcmlmeVRpbWVvdXRFcnJvcj8iRVRJTUVET1VUIjoiRUNPTk5BQk9SVEVEIix1KSksdT1udWxsfSxKLmlzU3RhbmRhcmRCcm93c2VyRW52KCkpe3ZhciB0dD0oZS53aXRoQ3JlZGVudGlhbHN8fEx0KGcpKSYmZS54c3JmQ29va2llTmFtZT9OdC5yZWFkKGUueHNyZkNvb2tpZU5hbWUpOnZvaWQgMDt0dCYmKGlbZS54c3JmSGVhZGVyTmFtZV09dHQpfSJzZXRSZXF1ZXN0SGVhZGVyImluIHUmJkouZm9yRWFjaChpLGZ1bmN0aW9uKEIsTyl7dHlwZW9mIG89PSJ1bmRlZmluZWQiJiZPLnRvTG93ZXJDYXNlKCk9PT0iY29udGVudC10eXBlIj9kZWxldGUgaVtPXTp1LnNldFJlcXVlc3RIZWFkZXIoTyxCKX0pLEouaXNVbmRlZmluZWQoZS53aXRoQ3JlZGVudGlhbHMpfHwodS53aXRoQ3JlZGVudGlhbHM9ISFlLndpdGhDcmVkZW50aWFscyksYSYmYSE9PSJqc29uIiYmKHUucmVzcG9uc2VUeXBlPWUucmVzcG9uc2VUeXBlKSx0eXBlb2YgZS5vbkRvd25sb2FkUHJvZ3Jlc3M9PSJmdW5jdGlvbiImJnUuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGUub25Eb3dubG9hZFByb2dyZXNzKSx0eXBlb2YgZS5vblVwbG9hZFByb2dyZXNzPT0iZnVuY3Rpb24iJiZ1LnVwbG9hZCYmdS51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGUub25VcGxvYWRQcm9ncmVzcyksKGUuY2FuY2VsVG9rZW58fGUuc2lnbmFsKSYmKGw9ZnVuY3Rpb24odil7IXV8fChuKCF2fHx2JiZ2LnR5cGU/bmV3IER0KCJjYW5jZWxlZCIpOnYpLHUuYWJvcnQoKSx1PW51bGwpfSxlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnN1YnNjcmliZShsKSxlLnNpZ25hbCYmKGUuc2lnbmFsLmFib3J0ZWQ/bCgpOmUuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IixsKSkpLG98fChvPW51bGwpLHUuc2VuZChvKX0pfSxoPXAsQWU9d3QscXQ9T2UsSHQ9eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifTtmdW5jdGlvbiBrZShyLGUpeyFoLmlzVW5kZWZpbmVkKHIpJiZoLmlzVW5kZWZpbmVkKHJbIkNvbnRlbnQtVHlwZSJdKSYmKHJbIkNvbnRlbnQtVHlwZSJdPWUpfWZ1bmN0aW9uIGp0KCl7dmFyIHI7cmV0dXJuKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCE9InVuZGVmaW5lZCJ8fHR5cGVvZiBwcm9jZXNzIT0idW5kZWZpbmVkIiYmT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHByb2Nlc3MpPT09IltvYmplY3QgcHJvY2Vzc10iKSYmKHI9TWUpLHJ9ZnVuY3Rpb24gSnQocixlLHQpe2lmKGguaXNTdHJpbmcocikpdHJ5e3JldHVybihlfHxKU09OLnBhcnNlKShyKSxoLnRyaW0ocil9Y2F0Y2gocyl7aWYocy5uYW1lIT09IlN5bnRheEVycm9yIil0aHJvdyBzfXJldHVybih0fHxKU09OLnN0cmluZ2lmeSkocil9dmFyIFY9e3RyYW5zaXRpb25hbDp7c2lsZW50SlNPTlBhcnNpbmc6ITAsZm9yY2VkSlNPTlBhcnNpbmc6ITAsY2xhcmlmeVRpbWVvdXRFcnJvcjohMX0sYWRhcHRlcjpqdCgpLHRyYW5zZm9ybVJlcXVlc3Q6W2Z1bmN0aW9uKGUsdCl7cmV0dXJuIEFlKHQsIkFjY2VwdCIpLEFlKHQsIkNvbnRlbnQtVHlwZSIpLGguaXNGb3JtRGF0YShlKXx8aC5pc0FycmF5QnVmZmVyKGUpfHxoLmlzQnVmZmVyKGUpfHxoLmlzU3RyZWFtKGUpfHxoLmlzRmlsZShlKXx8aC5pc0Jsb2IoZSk/ZTpoLmlzQXJyYXlCdWZmZXJWaWV3KGUpP2UuYnVmZmVyOmguaXNVUkxTZWFyY2hQYXJhbXMoZSk/KGtlKHQsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04IiksZS50b1N0cmluZygpKTpoLmlzT2JqZWN0KGUpfHx0JiZ0WyJDb250ZW50LVR5cGUiXT09PSJhcHBsaWNhdGlvbi9qc29uIj8oa2UodCwiYXBwbGljYXRpb24vanNvbiIpLEp0KGUpKTplfV0sdHJhbnNmb3JtUmVzcG9uc2U6W2Z1bmN0aW9uKGUpe3ZhciB0PXRoaXMudHJhbnNpdGlvbmFsfHxWLnRyYW5zaXRpb25hbCxzPXQmJnQuc2lsZW50SlNPTlBhcnNpbmcsbj10JiZ0LmZvcmNlZEpTT05QYXJzaW5nLG89IXMmJnRoaXMucmVzcG9uc2VUeXBlPT09Impzb24iO2lmKG98fG4mJmguaXNTdHJpbmcoZSkmJmUubGVuZ3RoKXRyeXtyZXR1cm4gSlNPTi5wYXJzZShlKX1jYXRjaChpKXtpZihvKXRocm93IGkubmFtZT09PSJTeW50YXhFcnJvciI/cXQoaSx0aGlzLCJFX0pTT05fUEFSU0UiKTppfXJldHVybiBlfV0sdGltZW91dDowLHhzcmZDb29raWVOYW1lOiJYU1JGLVRPS0VOIix4c3JmSGVhZGVyTmFtZToiWC1YU1JGLVRPS0VOIixtYXhDb250ZW50TGVuZ3RoOi0xLG1heEJvZHlMZW5ndGg6LTEsdmFsaWRhdGVTdGF0dXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PTIwMCYmZTwzMDB9LGhlYWRlcnM6e2NvbW1vbjp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoifX19O2guZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiXSxmdW5jdGlvbihlKXtWLmhlYWRlcnNbZV09e319KSxoLmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSxmdW5jdGlvbihlKXtWLmhlYWRlcnNbZV09aC5tZXJnZShIdCl9KTt2YXIgVz1WLFZ0PXAsV3Q9VyxHdD1mdW5jdGlvbihlLHQscyl7dmFyIG49dGhpc3x8V3Q7cmV0dXJuIFZ0LmZvckVhY2gocyxmdW5jdGlvbihpKXtlPWkuY2FsbChuLGUsdCl9KSxlfSxOZT1mdW5jdGlvbihlKXtyZXR1cm4hIShlJiZlLl9fQ0FOQ0VMX18pfSxVZT1wLHVlPUd0LHp0PU5lLFF0PVcsWHQ9ajtmdW5jdGlvbiBsZShyKXtpZihyLmNhbmNlbFRva2VuJiZyLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKSxyLnNpZ25hbCYmci5zaWduYWwuYWJvcnRlZCl0aHJvdyBuZXcgWHQoImNhbmNlbGVkIil9dmFyIEt0PWZ1bmN0aW9uKGUpe2xlKGUpLGUuaGVhZGVycz1lLmhlYWRlcnN8fHt9LGUuZGF0YT11ZS5jYWxsKGUsZS5kYXRhLGUuaGVhZGVycyxlLnRyYW5zZm9ybVJlcXVlc3QpLGUuaGVhZGVycz1VZS5tZXJnZShlLmhlYWRlcnMuY29tbW9ufHx7fSxlLmhlYWRlcnNbZS5tZXRob2RdfHx7fSxlLmhlYWRlcnMpLFVlLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwicG9zdCIsInB1dCIsInBhdGNoIiwiY29tbW9uIl0sZnVuY3Rpb24obil7ZGVsZXRlIGUuaGVhZGVyc1tuXX0pO3ZhciB0PWUuYWRhcHRlcnx8UXQuYWRhcHRlcjtyZXR1cm4gdChlKS50aGVuKGZ1bmN0aW9uKG4pe3JldHVybiBsZShlKSxuLmRhdGE9dWUuY2FsbChlLG4uZGF0YSxuLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXNwb25zZSksbn0sZnVuY3Rpb24obil7cmV0dXJuIHp0KG4pfHwobGUoZSksbiYmbi5yZXNwb25zZSYmKG4ucmVzcG9uc2UuZGF0YT11ZS5jYWxsKGUsbi5yZXNwb25zZS5kYXRhLG4ucmVzcG9uc2UuaGVhZGVycyxlLnRyYW5zZm9ybVJlc3BvbnNlKSkpLFByb21pc2UucmVqZWN0KG4pfSl9LHk9cCxCZT1mdW5jdGlvbihlLHQpe3Q9dHx8e307dmFyIHM9e307ZnVuY3Rpb24gbih1LGYpe3JldHVybiB5LmlzUGxhaW5PYmplY3QodSkmJnkuaXNQbGFpbk9iamVjdChmKT95Lm1lcmdlKHUsZik6eS5pc1BsYWluT2JqZWN0KGYpP3kubWVyZ2Uoe30sZik6eS5pc0FycmF5KGYpP2Yuc2xpY2UoKTpmfWZ1bmN0aW9uIG8odSl7aWYoeS5pc1VuZGVmaW5lZCh0W3VdKSl7aWYoIXkuaXNVbmRlZmluZWQoZVt1XSkpcmV0dXJuIG4odm9pZCAwLGVbdV0pfWVsc2UgcmV0dXJuIG4oZVt1XSx0W3VdKX1mdW5jdGlvbiBpKHUpe2lmKCF5LmlzVW5kZWZpbmVkKHRbdV0pKXJldHVybiBuKHZvaWQgMCx0W3VdKX1mdW5jdGlvbiBhKHUpe2lmKHkuaXNVbmRlZmluZWQodFt1XSkpe2lmKCF5LmlzVW5kZWZpbmVkKGVbdV0pKXJldHVybiBuKHZvaWQgMCxlW3VdKX1lbHNlIHJldHVybiBuKHZvaWQgMCx0W3VdKX1mdW5jdGlvbiBsKHUpe2lmKHUgaW4gdClyZXR1cm4gbihlW3VdLHRbdV0pO2lmKHUgaW4gZSlyZXR1cm4gbih2b2lkIDAsZVt1XSl9dmFyIG09e3VybDppLG1ldGhvZDppLGRhdGE6aSxiYXNlVVJMOmEsdHJhbnNmb3JtUmVxdWVzdDphLHRyYW5zZm9ybVJlc3BvbnNlOmEscGFyYW1zU2VyaWFsaXplcjphLHRpbWVvdXQ6YSx0aW1lb3V0TWVzc2FnZTphLHdpdGhDcmVkZW50aWFsczphLGFkYXB0ZXI6YSxyZXNwb25zZVR5cGU6YSx4c3JmQ29va2llTmFtZTphLHhzcmZIZWFkZXJOYW1lOmEsb25VcGxvYWRQcm9ncmVzczphLG9uRG93bmxvYWRQcm9ncmVzczphLGRlY29tcHJlc3M6YSxtYXhDb250ZW50TGVuZ3RoOmEsbWF4Qm9keUxlbmd0aDphLHRyYW5zcG9ydDphLGh0dHBBZ2VudDphLGh0dHBzQWdlbnQ6YSxjYW5jZWxUb2tlbjphLHNvY2tldFBhdGg6YSxyZXNwb25zZUVuY29kaW5nOmEsdmFsaWRhdGVTdGF0dXM6bH07cmV0dXJuIHkuZm9yRWFjaChPYmplY3Qua2V5cyhlKS5jb25jYXQoT2JqZWN0LmtleXModCkpLGZ1bmN0aW9uKGYpe3ZhciBUPW1bZl18fG8sZz1UKGYpO3kuaXNVbmRlZmluZWQoZykmJlQhPT1sfHwoc1tmXT1nKX0pLHN9LCRlPXt2ZXJzaW9uOiIwLjI1LjAifSxZdD0kZS52ZXJzaW9uLGNlPXt9O1sib2JqZWN0IiwiYm9vbGVhbiIsIm51bWJlciIsImZ1bmN0aW9uIiwic3RyaW5nIiwic3ltYm9sIl0uZm9yRWFjaChmdW5jdGlvbihyLGUpe2NlW3JdPWZ1bmN0aW9uKHMpe3JldHVybiB0eXBlb2Ygcz09PXJ8fCJhIisoZTwxPyJuICI6IiAiKStyfX0pO3ZhciBMZT17fTtjZS50cmFuc2l0aW9uYWw9ZnVuY3Rpb24oZSx0LHMpe2Z1bmN0aW9uIG4obyxpKXtyZXR1cm4iW0F4aW9zIHYiK1l0KyJdIFRyYW5zaXRpb25hbCBvcHRpb24gJyIrbysiJyIraSsocz8iLiAiK3M6IiIpfXJldHVybiBmdW5jdGlvbihvLGksYSl7aWYoZT09PSExKXRocm93IG5ldyBFcnJvcihuKGksIiBoYXMgYmVlbiByZW1vdmVkIisodD8iIGluICIrdDoiIikpKTtyZXR1cm4gdCYmIUxlW2ldJiYoTGVbaV09ITAsY29uc29sZS53YXJuKG4oaSwiIGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgdiIrdCsiIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlIikpKSxlP2UobyxpLGEpOiEwfX07ZnVuY3Rpb24gWnQocixlLHQpe2lmKHR5cGVvZiByIT0ib2JqZWN0Iil0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Zm9yKHZhciBzPU9iamVjdC5rZXlzKHIpLG49cy5sZW5ndGg7bi0tID4wOyl7dmFyIG89c1tuXSxpPWVbb107aWYoaSl7dmFyIGE9cltvXSxsPWE9PT12b2lkIDB8fGkoYSxvLHIpO2lmKGwhPT0hMCl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb24gIitvKyIgbXVzdCBiZSAiK2wpO2NvbnRpbnVlfWlmKHQhPT0hMCl0aHJvdyBFcnJvcigiVW5rbm93biBvcHRpb24gIitvKX19dmFyIGVyPXthc3NlcnRPcHRpb25zOlp0LHZhbGlkYXRvcnM6Y2V9LEZlPXAsdHI9Q2UsRGU9X3QscWU9S3QsRz1CZSxIZT1lcix4PUhlLnZhbGlkYXRvcnM7ZnVuY3Rpb24gJChyKXt0aGlzLmRlZmF1bHRzPXIsdGhpcy5pbnRlcmNlcHRvcnM9e3JlcXVlc3Q6bmV3IERlLHJlc3BvbnNlOm5ldyBEZX19JC5wcm90b3R5cGUucmVxdWVzdD1mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiBlPT0ic3RyaW5nIj8odD10fHx7fSx0LnVybD1lKTp0PWV8fHt9LCF0LnVybCl0aHJvdyBuZXcgRXJyb3IoIlByb3ZpZGVkIGNvbmZpZyB1cmwgaXMgbm90IHZhbGlkIik7dD1HKHRoaXMuZGVmYXVsdHMsdCksdC5tZXRob2Q/dC5tZXRob2Q9dC5tZXRob2QudG9Mb3dlckNhc2UoKTp0aGlzLmRlZmF1bHRzLm1ldGhvZD90Lm1ldGhvZD10aGlzLmRlZmF1bHRzLm1ldGhvZC50b0xvd2VyQ2FzZSgpOnQubWV0aG9kPSJnZXQiO3ZhciBzPXQudHJhbnNpdGlvbmFsO3MhPT12b2lkIDAmJkhlLmFzc2VydE9wdGlvbnMocyx7c2lsZW50SlNPTlBhcnNpbmc6eC50cmFuc2l0aW9uYWwoeC5ib29sZWFuKSxmb3JjZWRKU09OUGFyc2luZzp4LnRyYW5zaXRpb25hbCh4LmJvb2xlYW4pLGNsYXJpZnlUaW1lb3V0RXJyb3I6eC50cmFuc2l0aW9uYWwoeC5ib29sZWFuKX0sITEpO3ZhciBuPVtdLG89ITA7dGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uKGcpe3R5cGVvZiBnLnJ1bldoZW49PSJmdW5jdGlvbiImJmcucnVuV2hlbih0KT09PSExfHwobz1vJiZnLnN5bmNocm9ub3VzLG4udW5zaGlmdChnLmZ1bGZpbGxlZCxnLnJlamVjdGVkKSl9KTt2YXIgaT1bXTt0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKGZ1bmN0aW9uKGcpe2kucHVzaChnLmZ1bGZpbGxlZCxnLnJlamVjdGVkKX0pO3ZhciBhO2lmKCFvKXt2YXIgbD1bcWUsdm9pZCAwXTtmb3IoQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuYXBwbHkobCxuKSxsPWwuY29uY2F0KGkpLGE9UHJvbWlzZS5yZXNvbHZlKHQpO2wubGVuZ3RoOylhPWEudGhlbihsLnNoaWZ0KCksbC5zaGlmdCgpKTtyZXR1cm4gYX1mb3IodmFyIG09dDtuLmxlbmd0aDspe3ZhciB1PW4uc2hpZnQoKSxmPW4uc2hpZnQoKTt0cnl7bT11KG0pfWNhdGNoKFQpe2YoVCk7YnJlYWt9fXRyeXthPXFlKG0pfWNhdGNoKFQpe3JldHVybiBQcm9taXNlLnJlamVjdChUKX1mb3IoO2kubGVuZ3RoOylhPWEudGhlbihpLnNoaWZ0KCksaS5zaGlmdCgpKTtyZXR1cm4gYX0sJC5wcm90b3R5cGUuZ2V0VXJpPWZ1bmN0aW9uKGUpe2lmKCFlLnVybCl0aHJvdyBuZXcgRXJyb3IoIlByb3ZpZGVkIGNvbmZpZyB1cmwgaXMgbm90IHZhbGlkIik7cmV0dXJuIGU9Ryh0aGlzLmRlZmF1bHRzLGUpLHRyKGUudXJsLGUucGFyYW1zLGUucGFyYW1zU2VyaWFsaXplcikucmVwbGFjZSgvXlw/LywiIil9LEZlLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwib3B0aW9ucyJdLGZ1bmN0aW9uKGUpeyQucHJvdG90eXBlW2VdPWZ1bmN0aW9uKHQscyl7cmV0dXJuIHRoaXMucmVxdWVzdChHKHN8fHt9LHttZXRob2Q6ZSx1cmw6dCxkYXRhOihzfHx7fSkuZGF0YX0pKX19KSxGZS5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sZnVuY3Rpb24oZSl7JC5wcm90b3R5cGVbZV09ZnVuY3Rpb24odCxzLG4pe3JldHVybiB0aGlzLnJlcXVlc3QoRyhufHx7fSx7bWV0aG9kOmUsdXJsOnQsZGF0YTpzfSkpfX0pO3ZhciBycj0kLHNyPWo7ZnVuY3Rpb24gTShyKXtpZih0eXBlb2YgciE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJleGVjdXRvciBtdXN0IGJlIGEgZnVuY3Rpb24uIik7dmFyIGU7dGhpcy5wcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKG4pe2U9bn0pO3ZhciB0PXRoaXM7dGhpcy5wcm9taXNlLnRoZW4oZnVuY3Rpb24ocyl7aWYoISF0Ll9saXN0ZW5lcnMpe3ZhciBuLG89dC5fbGlzdGVuZXJzLmxlbmd0aDtmb3Iobj0wO248bztuKyspdC5fbGlzdGVuZXJzW25dKHMpO3QuX2xpc3RlbmVycz1udWxsfX0pLHRoaXMucHJvbWlzZS50aGVuPWZ1bmN0aW9uKHMpe3ZhciBuLG89bmV3IFByb21pc2UoZnVuY3Rpb24oaSl7dC5zdWJzY3JpYmUoaSksbj1pfSkudGhlbihzKTtyZXR1cm4gby5jYW5jZWw9ZnVuY3Rpb24oKXt0LnVuc3Vic2NyaWJlKG4pfSxvfSxyKGZ1bmN0aW9uKG4pe3QucmVhc29ufHwodC5yZWFzb249bmV3IHNyKG4pLGUodC5yZWFzb24pKX0pfU0ucHJvdG90eXBlLnRocm93SWZSZXF1ZXN0ZWQ9ZnVuY3Rpb24oKXtpZih0aGlzLnJlYXNvbil0aHJvdyB0aGlzLnJlYXNvbn0sTS5wcm90b3R5cGUuc3Vic2NyaWJlPWZ1bmN0aW9uKGUpe2lmKHRoaXMucmVhc29uKXtlKHRoaXMucmVhc29uKTtyZXR1cm59dGhpcy5fbGlzdGVuZXJzP3RoaXMuX2xpc3RlbmVycy5wdXNoKGUpOnRoaXMuX2xpc3RlbmVycz1bZV19LE0ucHJvdG90eXBlLnVuc3Vic2NyaWJlPWZ1bmN0aW9uKGUpe2lmKCEhdGhpcy5fbGlzdGVuZXJzKXt2YXIgdD10aGlzLl9saXN0ZW5lcnMuaW5kZXhPZihlKTt0IT09LTEmJnRoaXMuX2xpc3RlbmVycy5zcGxpY2UodCwxKX19LE0uc291cmNlPWZ1bmN0aW9uKCl7dmFyIGUsdD1uZXcgTShmdW5jdGlvbihuKXtlPW59KTtyZXR1cm57dG9rZW46dCxjYW5jZWw6ZX19O3ZhciBucj1NLGlyPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihzKXtyZXR1cm4gZS5hcHBseShudWxsLHMpfX0sb3I9cCxhcj1mdW5jdGlvbihlKXtyZXR1cm4gb3IuaXNPYmplY3QoZSkmJmUuaXNBeGlvc0Vycm9yPT09ITB9LGplPXAsdXI9RWUsej1ycixscj1CZSxjcj1XO2Z1bmN0aW9uIEplKHIpe3ZhciBlPW5ldyB6KHIpLHQ9dXIoei5wcm90b3R5cGUucmVxdWVzdCxlKTtyZXR1cm4gamUuZXh0ZW5kKHQsei5wcm90b3R5cGUsZSksamUuZXh0ZW5kKHQsZSksdC5jcmVhdGU9ZnVuY3Rpb24obil7cmV0dXJuIEplKGxyKHIsbikpfSx0fXZhciBFPUplKGNyKTtFLkF4aW9zPXosRS5DYW5jZWw9aixFLkNhbmNlbFRva2VuPW5yLEUuaXNDYW5jZWw9TmUsRS5WRVJTSU9OPSRlLnZlcnNpb24sRS5hbGw9ZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UuYWxsKGUpfSxFLnNwcmVhZD1pcixFLmlzQXhpb3NFcnJvcj1hcixlZS5leHBvcnRzPUUsZWUuZXhwb3J0cy5kZWZhdWx0PUU7dmFyIGZyPWVlLmV4cG9ydHM7Y2xhc3MgY3tpc0VtcHR5KCl7cmV0dXJuIXRoaXMuaXNQcmVzZW50KCl9c3RhdGljIG9mKGUpe2lmKGUhPW51bGwpcmV0dXJuIG5ldyBWZShlKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgcGFzc2VkIHZhbHVlIHdhcyBudWxsIG9yIHVuZGVmaW5lZC4iKX1zdGF0aWMgb2ZOb25OdWxsKGUpe3JldHVybiBjLm9mKGUpfXN0YXRpYyBvZk51bGxhYmxlKGUpe3JldHVybiBlIT1udWxsP25ldyBWZShlKTpuZXcgV2V9c3RhdGljIGVtcHR5KCl7cmV0dXJuIG5ldyBXZX1zdGF0aWMgZnJvbShlKXtzd2l0Y2goZS5raW5kKXtjYXNlInByZXNlbnQiOnJldHVybiBjLm9mKGUudmFsdWUpO2Nhc2UiZW1wdHkiOnJldHVybiBjLmVtcHR5KCk7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgcGFzc2VkIHZhbHVlIHdhcyBub3QgYW4gT3B0aW9uIHR5cGUuIil9fX1jbGFzcyBWZSBleHRlbmRzIGN7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLnBheWxvYWQ9ZX1pc1ByZXNlbnQoKXtyZXR1cm4hMH1nZXQoKXtyZXR1cm4gdGhpcy5wYXlsb2FkfWlmUHJlc2VudChlKXtlKHRoaXMucGF5bG9hZCl9aWZQcmVzZW50T3JFbHNlKGUsdCl7ZSh0aGlzLnBheWxvYWQpfWZpbHRlcihlKXtyZXR1cm4gZSh0aGlzLnBheWxvYWQpP3RoaXM6Yy5lbXB0eSgpfW1hcChlKXtjb25zdCB0PWUodGhpcy5wYXlsb2FkKTtyZXR1cm4gYy5vZk51bGxhYmxlKHQpfWZsYXRNYXAoZSl7cmV0dXJuIGUodGhpcy5wYXlsb2FkKX1vcihlKXtyZXR1cm4gdGhpc31vckVsc2UoZSl7cmV0dXJuIHRoaXMucGF5bG9hZH1vckVsc2VHZXQoZSl7cmV0dXJuIHRoaXMucGF5bG9hZH1vckVsc2VUaHJvdyhlKXtyZXR1cm4gdGhpcy5wYXlsb2FkfW9yTnVsbCgpe3JldHVybiB0aGlzLnBheWxvYWR9b3JVbmRlZmluZWQoKXtyZXR1cm4gdGhpcy5wYXlsb2FkfXRvT3B0aW9uKCl7cmV0dXJue2tpbmQ6InByZXNlbnQiLHZhbHVlOnRoaXMucGF5bG9hZH19bWF0Y2hlcyhlKXtyZXR1cm4gZS5wcmVzZW50KHRoaXMucGF5bG9hZCl9dG9KU09OKGUpe3JldHVybiB0aGlzLnBheWxvYWR9fWNsYXNzIFdlIGV4dGVuZHMgY3tpc1ByZXNlbnQoKXtyZXR1cm4hMX1jb25zdHJ1Y3Rvcigpe3N1cGVyKCl9Z2V0KCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIG9wdGlvbmFsIGlzIG5vdCBwcmVzZW50LiIpfWlmUHJlc2VudChlKXt9aWZQcmVzZW50T3JFbHNlKGUsdCl7dCgpfWZpbHRlcihlKXtyZXR1cm4gdGhpc31tYXAoZSl7cmV0dXJuIGMuZW1wdHkoKX1mbGF0TWFwKGUpe3JldHVybiBjLmVtcHR5KCl9b3IoZSl7cmV0dXJuIGUoKX1vckVsc2UoZSl7cmV0dXJuIGV9b3JFbHNlR2V0KGUpe3JldHVybiB0aGlzLm9yRWxzZShlKCkpfW9yRWxzZVRocm93KGUpe3Rocm93IGUoKX1vck51bGwoKXtyZXR1cm4gbnVsbH1vclVuZGVmaW5lZCgpe310b09wdGlvbigpe3JldHVybntraW5kOiJlbXB0eSJ9fW1hdGNoZXMoZSl7cmV0dXJuIGUuZW1wdHkoKX10b0pTT04oZSl7cmV0dXJuIG51bGx9fWNvbnN0IGhyPSIxLjIuNyI7ZnVuY3Rpb24gZHIocil7Z2xvYmFsVGhpcy5fdm9uYWdlTWVkaWFQcm9jZXNzb3JNZXRhZGF0YT1yfWZ1bmN0aW9uIHByKCl7cmV0dXJuIGdsb2JhbFRoaXMuX3ZvbmFnZU1lZGlhUHJvY2Vzc29yTWV0YWRhdGF9Y2xhc3MgX3tjb25zdHJ1Y3Rvcigpe2NvbnN0IGU9cHIoKTt0aGlzLl9yZXBvcnQ9e2FjdGlvbjpjLmVtcHR5KCksYXBwbGljYXRpb25JZDpjLm9mTnVsbGFibGUoZSE9PXZvaWQgMCYmZSE9bnVsbD9lLmFwcElkOm51bGwpLHRpbWVzdGFtcDpEYXRlLm5vdygpLGZwczpjLmVtcHR5KCksZnJhbWVzVHJhbnNmb3JtZWQ6Yy5lbXB0eSgpLGd1aWQ6Yy5lbXB0eSgpLGhpZ2hlc3RGcmFtZVRyYW5zZm9ybUNwdTpjLmVtcHR5KCksbWVzc2FnZTpjLmVtcHR5KCksc291cmNlOmMub2ZOdWxsYWJsZShlIT09dm9pZCAwJiZlIT1udWxsP2Uuc291cmNlVHlwZTpudWxsKSx0cmFuc2Zvcm1lZEZwczpjLmVtcHR5KCksdHJhbnNmb3JtZXJUeXBlOmMuZW1wdHkoKSx2YXJpYXRpb246Yy5lbXB0eSgpLHZpZGVvSGVpZ2h0OmMuZW1wdHkoKSx2aWRlb1dpZHRoOmMuZW1wdHkoKSx2ZXJzaW9uOmhyLGVycm9yOmMuZW1wdHkoKSxwcm94eVVybDpjLm9mTnVsbGFibGUoZSE9PXZvaWQgMCYmZSE9bnVsbD9lLnByb3h5VXJsOm51bGwpfX1hY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5hY3Rpb249Yy5vZk51bGxhYmxlKGUpLHRoaXN9ZnJhbWVzVHJhbnNmb3JtZWQoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5mcmFtZXNUcmFuc2Zvcm1lZD1jLm9mTnVsbGFibGUoZSksdGhpc31mcHMoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5mcHM9Yy5vZk51bGxhYmxlKGUpLHRoaXN9Z3VpZChlKXtyZXR1cm4gdGhpcy5fcmVwb3J0Lmd1aWQ9Yy5vZk51bGxhYmxlKGUpLHRoaXN9bWVzc2FnZShlKXtyZXR1cm4gdGhpcy5fcmVwb3J0Lm1lc3NhZ2U9Yy5vZk51bGxhYmxlKGUpLHRoaXN9dHJhbnNmb3JtZWRGcHMoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC50cmFuc2Zvcm1lZEZwcz1jLm9mTnVsbGFibGUoZSksdGhpc310cmFuc2Zvcm1lclR5cGUoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC50cmFuc2Zvcm1lclR5cGU9Yy5vZk51bGxhYmxlKGUpLHRoaXN9dmFyaWF0aW9uKGUpe3JldHVybiB0aGlzLl9yZXBvcnQudmFyaWF0aW9uPWMub2ZOdWxsYWJsZShlKSx0aGlzfXZpZGVvSGVpZ2h0KGUpe3JldHVybiB0aGlzLl9yZXBvcnQudmlkZW9IZWlnaHQ9Yy5vZk51bGxhYmxlKGUpLHRoaXN9dmlkZW9XaWR0aChlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LnZpZGVvV2lkdGg9Yy5vZk51bGxhYmxlKGUpLHRoaXN9ZXJyb3IoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5lcnJvcj1jLm9mTnVsbGFibGUoZSksdGhpc31idWlsZCgpe3JldHVybiB0aGlzLl9yZXBvcnR9fWNvbnN0IG1yPXI9PkpTT04uc3RyaW5naWZ5KHIsKGUsdCk9PntpZih0IT09bnVsbClyZXR1cm4gdH0pO2NsYXNzIGJ7c3RhdGljIHJlcG9ydChlKXtyZXR1cm4gbmV3IFByb21pc2UoKHQscyk9PntpZihlLmFwcGxpY2F0aW9uSWQuaXNFbXB0eSgpfHxlLnNvdXJjZS5pc0VtcHR5KCkpe3QoInN1Y2Nlc3MiKTtyZXR1cm59bGV0IG49ZnIuY3JlYXRlKCksbz17dGltZW91dDoxZTQsdGltZW91dEVycm9yTWVzc2FnZToiUmVxdWVzdCB0aW1lb3V0IixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9fSxpPSJobGcudG9rYm94LmNvbS9wcm9kL2xvZ2dpbmcvdmNwX3dlYnJ0YyI7aWYoZS5wcm94eVVybC5pc0VtcHR5KCkpaT0iaHR0cHM6Ly8iK2k7ZWxzZXtsZXQgYTtlLnByb3h5VXJsLmdldCgpLnNsaWNlKGUucHJveHlVcmwuZ2V0KCkubGVuZ3RoLTEpIT09Ii8iP2E9ZS5wcm94eVVybC5nZXQoKSsiLyI6YT1lLnByb3h5VXJsLmdldCgpLGk9YStpfW4ucG9zdChpLG1yKGUpLG8pLnRoZW4oYT0+e2NvbnNvbGUubG9nKGEpLHQoInN1Y2Nlc3MiKX0pLmNhdGNoKGE9Pntjb25zb2xlLmxvZyhhKSxzKGEpfSl9KX19dmFyIFEsZ3I9bmV3IFVpbnQ4QXJyYXkoMTYpO2Z1bmN0aW9uIHlyKCl7aWYoIVEmJihRPXR5cGVvZiBjcnlwdG8hPSJ1bmRlZmluZWQiJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKXx8dHlwZW9mIG1zQ3J5cHRvIT0idW5kZWZpbmVkIiYmdHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcz09ImZ1bmN0aW9uIiYmbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQobXNDcnlwdG8pLCFRKSl0aHJvdyBuZXcgRXJyb3IoImNyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkIik7cmV0dXJuIFEoZ3IpfXZhciBfcj0vXig/OlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLTVdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCkkL2k7ZnVuY3Rpb24gYnIocil7cmV0dXJuIHR5cGVvZiByPT0ic3RyaW5nIiYmX3IudGVzdChyKX1mb3IodmFyIGQ9W10sZmU9MDtmZTwyNTY7KytmZSlkLnB1c2goKGZlKzI1NikudG9TdHJpbmcoMTYpLnN1YnN0cigxKSk7ZnVuY3Rpb24gd3Iocil7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOjAsdD0oZFtyW2UrMF1dK2RbcltlKzFdXStkW3JbZSsyXV0rZFtyW2UrM11dKyItIitkW3JbZSs0XV0rZFtyW2UrNV1dKyItIitkW3JbZSs2XV0rZFtyW2UrN11dKyItIitkW3JbZSs4XV0rZFtyW2UrOV1dKyItIitkW3JbZSsxMF1dK2RbcltlKzExXV0rZFtyW2UrMTJdXStkW3JbZSsxM11dK2RbcltlKzE0XV0rZFtyW2UrMTVdXSkudG9Mb3dlckNhc2UoKTtpZighYnIodCkpdGhyb3cgVHlwZUVycm9yKCJTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWQiKTtyZXR1cm4gdH1mdW5jdGlvbiBHZShyLGUsdCl7cj1yfHx7fTt2YXIgcz1yLnJhbmRvbXx8KHIucm5nfHx5cikoKTtpZihzWzZdPXNbNl0mMTV8NjQsc1s4XT1zWzhdJjYzfDEyOCxlKXt0PXR8fDA7Zm9yKHZhciBuPTA7bjwxNjsrK24pZVt0K25dPXNbbl07cmV0dXJuIGV9cmV0dXJuIHdyKHMpfWNvbnN0IFM9bmV3IFdlYWtNYXAsWD1uZXcgV2Vha01hcCxMPW5ldyBXZWFrTWFwLGhlPVN5bWJvbCgiYW55UHJvZHVjZXIiKSx6ZT1Qcm9taXNlLnJlc29sdmUoKSxLPVN5bWJvbCgibGlzdGVuZXJBZGRlZCIpLFk9U3ltYm9sKCJsaXN0ZW5lclJlbW92ZWQiKTtsZXQgZGU9ITE7ZnVuY3Rpb24gQShyKXtpZih0eXBlb2YgciE9InN0cmluZyImJnR5cGVvZiByIT0ic3ltYm9sIil0aHJvdyBuZXcgVHlwZUVycm9yKCJldmVudE5hbWUgbXVzdCBiZSBhIHN0cmluZyBvciBhIHN5bWJvbCIpfWZ1bmN0aW9uIFoocil7aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gayhyLGUpe2NvbnN0IHQ9WC5nZXQocik7cmV0dXJuIHQuaGFzKGUpfHx0LnNldChlLG5ldyBTZXQpLHQuZ2V0KGUpfWZ1bmN0aW9uIEYocixlKXtjb25zdCB0PXR5cGVvZiBlPT0ic3RyaW5nInx8dHlwZW9mIGU9PSJzeW1ib2wiP2U6aGUscz1MLmdldChyKTtyZXR1cm4gcy5oYXModCl8fHMuc2V0KHQsbmV3IFNldCkscy5nZXQodCl9ZnVuY3Rpb24gdnIocixlLHQpe2NvbnN0IHM9TC5nZXQocik7aWYocy5oYXMoZSkpZm9yKGNvbnN0IG4gb2Ygcy5nZXQoZSkpbi5lbnF1ZXVlKHQpO2lmKHMuaGFzKGhlKSl7Y29uc3Qgbj1Qcm9taXNlLmFsbChbZSx0XSk7Zm9yKGNvbnN0IG8gb2Ygcy5nZXQoaGUpKW8uZW5xdWV1ZShuKX19ZnVuY3Rpb24gUWUocixlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07bGV0IHQ9ITEscz0oKT0+e30sbj1bXTtjb25zdCBvPXtlbnF1ZXVlKGkpe24ucHVzaChpKSxzKCl9LGZpbmlzaCgpe3Q9ITAscygpfX07Zm9yKGNvbnN0IGkgb2YgZSlGKHIsaSkuYWRkKG8pO3JldHVybnthc3luYyBuZXh0KCl7cmV0dXJuIG4/bi5sZW5ndGg9PT0wP3Q/KG49dm9pZCAwLHRoaXMubmV4dCgpKTooYXdhaXQgbmV3IFByb21pc2UoaT0+e3M9aX0pLHRoaXMubmV4dCgpKTp7ZG9uZTohMSx2YWx1ZTphd2FpdCBuLnNoaWZ0KCl9Ontkb25lOiEwfX0sYXN5bmMgcmV0dXJuKGkpe249dm9pZCAwO2Zvcihjb25zdCBhIG9mIGUpRihyLGEpLmRlbGV0ZShvKTtyZXR1cm4gcygpLGFyZ3VtZW50cy5sZW5ndGg+MD97ZG9uZTohMCx2YWx1ZTphd2FpdCBpfTp7ZG9uZTohMH19LFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKXtyZXR1cm4gdGhpc319fWZ1bmN0aW9uIFhlKHIpe2lmKHI9PT12b2lkIDApcmV0dXJuIEtlO2lmKCFBcnJheS5pc0FycmF5KHIpKXRocm93IG5ldyBUeXBlRXJyb3IoImBtZXRob2ROYW1lc2AgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIik7Zm9yKGNvbnN0IGUgb2YgcilpZighS2UuaW5jbHVkZXMoZSkpdGhyb3cgdHlwZW9mIGUhPSJzdHJpbmciP25ldyBUeXBlRXJyb3IoImBtZXRob2ROYW1lc2AgZWxlbWVudCBtdXN0IGJlIGEgc3RyaW5nIik6bmV3IEVycm9yKGAke2V9IGlzIG5vdCBFbWl0dGVyeSBtZXRob2RgKTtyZXR1cm4gcn1jb25zdCBwZT1yPT5yPT09S3x8cj09PVk7Y2xhc3MgQ3tzdGF0aWMgbWl4aW4oZSx0KXtyZXR1cm4gdD1YZSh0KSxzPT57aWYodHlwZW9mIHMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiYHRhcmdldGAgbXVzdCBiZSBmdW5jdGlvbiIpO2Zvcihjb25zdCBpIG9mIHQpaWYocy5wcm90b3R5cGVbaV0hPT12b2lkIDApdGhyb3cgbmV3IEVycm9yKGBUaGUgcHJvcGVydHkgXGAke2l9XGAgYWxyZWFkeSBleGlzdHMgb24gXGB0YXJnZXRcYGApO2Z1bmN0aW9uIG4oKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsZSx7ZW51bWVyYWJsZTohMSx2YWx1ZTpuZXcgQ30pLHRoaXNbZV19T2JqZWN0LmRlZmluZVByb3BlcnR5KHMucHJvdG90eXBlLGUse2VudW1lcmFibGU6ITEsZ2V0Om59KTtjb25zdCBvPWk9PmZ1bmN0aW9uKC4uLmEpe3JldHVybiB0aGlzW2VdW2ldKC4uLmEpfTtmb3IoY29uc3QgaSBvZiB0KU9iamVjdC5kZWZpbmVQcm9wZXJ0eShzLnByb3RvdHlwZSxpLHtlbnVtZXJhYmxlOiExLHZhbHVlOm8oaSl9KTtyZXR1cm4gc319c3RhdGljIGdldCBpc0RlYnVnRW5hYmxlZCgpe2lmKHR5cGVvZiBwcm9jZXNzIT0ib2JqZWN0IilyZXR1cm4gZGU7Y29uc3R7ZW52OmV9PXByb2Nlc3N8fHtlbnY6e319O3JldHVybiBlLkRFQlVHPT09ImVtaXR0ZXJ5Inx8ZS5ERUJVRz09PSIqInx8ZGV9c3RhdGljIHNldCBpc0RlYnVnRW5hYmxlZChlKXtkZT1lfWNvbnN0cnVjdG9yKGU9e30pe1Muc2V0KHRoaXMsbmV3IFNldCksWC5zZXQodGhpcyxuZXcgTWFwKSxMLnNldCh0aGlzLG5ldyBNYXApLHRoaXMuZGVidWc9ZS5kZWJ1Z3x8e30sdGhpcy5kZWJ1Zy5lbmFibGVkPT09dm9pZCAwJiYodGhpcy5kZWJ1Zy5lbmFibGVkPSExKSx0aGlzLmRlYnVnLmxvZ2dlcnx8KHRoaXMuZGVidWcubG9nZ2VyPSh0LHMsbixvKT0+e289SlNPTi5zdHJpbmdpZnkobyksdHlwZW9mIG49PSJzeW1ib2wiJiYobj1uLnRvU3RyaW5nKCkpO2NvbnN0IGk9bmV3IERhdGUsYT1gJHtpLmdldEhvdXJzKCl9OiR7aS5nZXRNaW51dGVzKCl9OiR7aS5nZXRTZWNvbmRzKCl9LiR7aS5nZXRNaWxsaXNlY29uZHMoKX1gO2NvbnNvbGUubG9nKGBbJHthfV1bZW1pdHRlcnk6JHt0fV1bJHtzfV0gRXZlbnQgTmFtZTogJHtufQoJZGF0YTogJHtvfWApfSl9bG9nSWZEZWJ1Z0VuYWJsZWQoZSx0LHMpeyhDLmlzRGVidWdFbmFibGVkfHx0aGlzLmRlYnVnLmVuYWJsZWQpJiZ0aGlzLmRlYnVnLmxvZ2dlcihlLHRoaXMuZGVidWcubmFtZSx0LHMpfW9uKGUsdCl7Wih0KSxlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07Zm9yKGNvbnN0IHMgb2YgZSlBKHMpLGsodGhpcyxzKS5hZGQodCksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgic3Vic2NyaWJlIixzLHZvaWQgMCkscGUocyl8fHRoaXMuZW1pdChLLHtldmVudE5hbWU6cyxsaXN0ZW5lcjp0fSk7cmV0dXJuIHRoaXMub2ZmLmJpbmQodGhpcyxlLHQpfW9mZihlLHQpe1oodCksZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCBzIG9mIGUpQShzKSxrKHRoaXMscykuZGVsZXRlKHQpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInVuc3Vic2NyaWJlIixzLHZvaWQgMCkscGUocyl8fHRoaXMuZW1pdChZLHtldmVudE5hbWU6cyxsaXN0ZW5lcjp0fSl9b25jZShlKXtyZXR1cm4gbmV3IFByb21pc2UodD0+e2NvbnN0IHM9dGhpcy5vbihlLG49PntzKCksdChuKX0pfSl9ZXZlbnRzKGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgdCBvZiBlKUEodCk7cmV0dXJuIFFlKHRoaXMsZSl9YXN5bmMgZW1pdChlLHQpe0EoZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgiZW1pdCIsZSx0KSx2cih0aGlzLGUsdCk7Y29uc3Qgcz1rKHRoaXMsZSksbj1TLmdldCh0aGlzKSxvPVsuLi5zXSxpPXBlKGUpP1tdOlsuLi5uXTthd2FpdCB6ZSxhd2FpdCBQcm9taXNlLmFsbChbLi4uby5tYXAoYXN5bmMgYT0+e2lmKHMuaGFzKGEpKXJldHVybiBhKHQpfSksLi4uaS5tYXAoYXN5bmMgYT0+e2lmKG4uaGFzKGEpKXJldHVybiBhKGUsdCl9KV0pfWFzeW5jIGVtaXRTZXJpYWwoZSx0KXtBKGUpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoImVtaXRTZXJpYWwiLGUsdCk7Y29uc3Qgcz1rKHRoaXMsZSksbj1TLmdldCh0aGlzKSxvPVsuLi5zXSxpPVsuLi5uXTthd2FpdCB6ZTtmb3IoY29uc3QgYSBvZiBvKXMuaGFzKGEpJiZhd2FpdCBhKHQpO2Zvcihjb25zdCBhIG9mIGkpbi5oYXMoYSkmJmF3YWl0IGEoZSx0KX1vbkFueShlKXtyZXR1cm4gWihlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJzdWJzY3JpYmVBbnkiLHZvaWQgMCx2b2lkIDApLFMuZ2V0KHRoaXMpLmFkZChlKSx0aGlzLmVtaXQoSyx7bGlzdGVuZXI6ZX0pLHRoaXMub2ZmQW55LmJpbmQodGhpcyxlKX1hbnlFdmVudCgpe3JldHVybiBRZSh0aGlzKX1vZmZBbnkoZSl7WihlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJ1bnN1YnNjcmliZUFueSIsdm9pZCAwLHZvaWQgMCksdGhpcy5lbWl0KFkse2xpc3RlbmVyOmV9KSxTLmdldCh0aGlzKS5kZWxldGUoZSl9Y2xlYXJMaXN0ZW5lcnMoZSl7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCB0IG9mIGUpaWYodGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgiY2xlYXIiLHQsdm9pZCAwKSx0eXBlb2YgdD09InN0cmluZyJ8fHR5cGVvZiB0PT0ic3ltYm9sIil7ayh0aGlzLHQpLmNsZWFyKCk7Y29uc3Qgcz1GKHRoaXMsdCk7Zm9yKGNvbnN0IG4gb2YgcyluLmZpbmlzaCgpO3MuY2xlYXIoKX1lbHNle1MuZ2V0KHRoaXMpLmNsZWFyKCk7Zm9yKGNvbnN0IHMgb2YgWC5nZXQodGhpcykudmFsdWVzKCkpcy5jbGVhcigpO2Zvcihjb25zdCBzIG9mIEwuZ2V0KHRoaXMpLnZhbHVlcygpKXtmb3IoY29uc3QgbiBvZiBzKW4uZmluaXNoKCk7cy5jbGVhcigpfX19bGlzdGVuZXJDb3VudChlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07bGV0IHQ9MDtmb3IoY29uc3QgcyBvZiBlKXtpZih0eXBlb2Ygcz09InN0cmluZyIpe3QrPVMuZ2V0KHRoaXMpLnNpemUrayh0aGlzLHMpLnNpemUrRih0aGlzLHMpLnNpemUrRih0aGlzKS5zaXplO2NvbnRpbnVlfXR5cGVvZiBzIT0idW5kZWZpbmVkIiYmQShzKSx0Kz1TLmdldCh0aGlzKS5zaXplO2Zvcihjb25zdCBuIG9mIFguZ2V0KHRoaXMpLnZhbHVlcygpKXQrPW4uc2l6ZTtmb3IoY29uc3QgbiBvZiBMLmdldCh0aGlzKS52YWx1ZXMoKSl0Kz1uLnNpemV9cmV0dXJuIHR9YmluZE1ldGhvZHMoZSx0KXtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fGU9PT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoImB0YXJnZXRgIG11c3QgYmUgYW4gb2JqZWN0Iik7dD1YZSh0KTtmb3IoY29uc3QgcyBvZiB0KXtpZihlW3NdIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgVGhlIHByb3BlcnR5IFxgJHtzfVxgIGFscmVhZHkgZXhpc3RzIG9uIFxgdGFyZ2V0XGBgKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxzLHtlbnVtZXJhYmxlOiExLHZhbHVlOnRoaXNbc10uYmluZCh0aGlzKX0pfX19Y29uc3QgS2U9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoQy5wcm90b3R5cGUpLmZpbHRlcihyPT5yIT09ImNvbnN0cnVjdG9yIik7T2JqZWN0LmRlZmluZVByb3BlcnR5KEMsImxpc3RlbmVyQWRkZWQiLHt2YWx1ZTpLLHdyaXRhYmxlOiExLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsImxpc3RlbmVyUmVtb3ZlZCIse3ZhbHVlOlksd3JpdGFibGU6ITEsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITF9KTt2YXIgbWU9QztmdW5jdGlvbiBFcihyKXtyZXR1cm4gdHlwZW9mIHI9PSJvYmplY3QiJiZyIT09bnVsbCYmIm1lc3NhZ2UiaW4gciYmdHlwZW9mIHIubWVzc2FnZT09InN0cmluZyJ9ZnVuY3Rpb24gVHIocil7aWYoRXIocikpcmV0dXJuIHI7dHJ5e3JldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkocikpfWNhdGNoe3JldHVybiBuZXcgRXJyb3IoU3RyaW5nKHIpKX19ZnVuY3Rpb24gZ2Uocil7cmV0dXJuIFRyKHIpLm1lc3NhZ2V9dmFyIHllOyhmdW5jdGlvbihyKXtyLkZQU19EUk9QPSJmcHNfZHJvcCJ9KSh5ZXx8KHllPXt9KSk7Y29uc3QgUHI9NTAwLFJyPS44O2NsYXNzIFNyIGV4dGVuZHMgbWV7Y29uc3RydWN0b3IoZSx0KXtzdXBlcigpLHRoaXMuaW5kZXhfPXQsdGhpcy51dWlkXz1HZSgpLHRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfPTAsdGhpcy50cmFuc2Zvcm1lcl89ZSx0aGlzLnNob3VsZFN0b3BfPSExLHRoaXMuaXNGbGFzaGVkXz0hMSx0aGlzLmZyYW1lc0Zyb21Tb3VyY2VfPTAsdGhpcy5mcHNfPTAsdGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfPTAsdGhpcy52aWRlb0hlaWdodF89MCx0aGlzLnZpZGVvV2lkdGhfPTAsdGhpcy50cmFja0V4cGVjdGVkUmF0ZV89LTEsdGhpcy50cmFuc2Zvcm1lclR5cGVfPSJDdXN0b20iLCJnZXRUcmFuc2Zvcm1lclR5cGUiaW4gZSYmKHRoaXMudHJhbnNmb3JtZXJUeXBlXz1lLmdldFRyYW5zZm9ybWVyVHlwZSgpKTtjb25zdCBzPW5ldyBfKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkNyZWF0ZSIpLmJ1aWxkKCk7Yi5yZXBvcnQocyl9c2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl7dGhpcy50cmFja0V4cGVjdGVkUmF0ZV89ZX1hc3luYyBzdGFydChlKXtpZih0aGlzLmNvbnRyb2xsZXJfPWUsdGhpcy50cmFuc2Zvcm1lcl8mJnR5cGVvZiB0aGlzLnRyYW5zZm9ybWVyXy5zdGFydD09ImZ1bmN0aW9uIil0cnl7YXdhaXQgdGhpcy50cmFuc2Zvcm1lcl8uc3RhcnQoZSl9Y2F0Y2godCl7Y29uc3Qgcz1uZXcgXygpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShQLmVycm9ycy50cmFuc2Zvcm1lcl9zdGFydCkudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmFyaWF0aW9uKCJFcnJvciIpLmVycm9yKGdlKHQpKS5idWlsZCgpO2IucmVwb3J0KHMpO2NvbnN0IG49e2V2ZW50TWV0YURhdGE6e3RyYW5zZm9ybWVySW5kZXg6dGhpcy5pbmRleF99LGVycm9yOnQsZnVuY3Rpb246InN0YXJ0In07dGhpcy5lbWl0KCJlcnJvciIsbil9fWFzeW5jIHRyYW5zZm9ybShlLHQpe3ZhciBzLG4sbyxpO2lmKHRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXz09PTAmJih0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF89RGF0ZS5ub3coKSksZSBpbnN0YW5jZW9mIFZpZGVvRnJhbWUmJih0aGlzLnZpZGVvSGVpZ2h0Xz0ocz1lPT1udWxsP3ZvaWQgMDplLmRpc3BsYXlIZWlnaHQpIT1udWxsP3M6MCx0aGlzLnZpZGVvV2lkdGhfPShuPWU9PW51bGw/dm9pZCAwOmUuZGlzcGxheVdpZHRoKSE9bnVsbD9uOjApLCsrdGhpcy5mcmFtZXNGcm9tU291cmNlXyx0aGlzLnRyYW5zZm9ybWVyXylpZih0aGlzLnNob3VsZFN0b3BfKWNvbnNvbGUud2FybigiW1BpcGVsaW5lXSBmbHVzaCBmcm9tIHRyYW5zZm9ybSIpLGUuY2xvc2UoKSx0aGlzLmZsdXNoKHQpLHQudGVybWluYXRlKCk7ZWxzZSB0cnl7YXdhaXQoKGk9KG89dGhpcy50cmFuc2Zvcm1lcl8pLnRyYW5zZm9ybSk9PW51bGw/dm9pZCAwOmkuY2FsbChvLGUsdCkpLCsrdGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF8sdGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF89PT1QciYmdGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0KCl9Y2F0Y2goYSl7Y29uc3QgbD1uZXcgXygpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShQLmVycm9ycy50cmFuc2Zvcm1lcl90cmFuc2Zvcm0pLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiRXJyb3IiKS5lcnJvcihnZShhKSkuYnVpbGQoKTtiLnJlcG9ydChsKTtjb25zdCBtPXtldmVudE1ldGFEYXRhOnt0cmFuc2Zvcm1lckluZGV4OnRoaXMuaW5kZXhffSxlcnJvcjphLGZ1bmN0aW9uOiJ0cmFuc2Zvcm0ifTt0aGlzLmVtaXQoImVycm9yIixtKX19YXN5bmMgZmx1c2goZSl7aWYodGhpcy50cmFuc2Zvcm1lcl8mJnR5cGVvZiB0aGlzLnRyYW5zZm9ybWVyXy5mbHVzaD09ImZ1bmN0aW9uIiYmIXRoaXMuaXNGbGFzaGVkXyl7dGhpcy5pc0ZsYXNoZWRfPSEwO3RyeXthd2FpdCB0aGlzLnRyYW5zZm9ybWVyXy5mbHVzaChlKX1jYXRjaChzKXtjb25zdCBuPW5ldyBfKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKFAuZXJyb3JzLnRyYW5zZm9ybWVyX2ZsdXNoKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkVycm9yIikuZXJyb3IoZ2UocykpLmJ1aWxkKCk7Yi5yZXBvcnQobik7Y29uc3Qgbz17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sZXJyb3I6cyxmdW5jdGlvbjoiZmx1c2gifTt0aGlzLmVtaXQoImVycm9yIixvKX19dGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0KCk7Y29uc3QgdD1uZXcgXygpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmd1aWQodGhpcy51dWlkXykudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmFyaWF0aW9uKCJEZWxldGUiKS5idWlsZCgpO2IucmVwb3J0KHQpfXN0b3AoKXtjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBTdG9wIHN0cmVhbS4iKSx0aGlzLmNvbnRyb2xsZXJfJiYodGhpcy5mbHVzaCh0aGlzLmNvbnRyb2xsZXJfKSx0aGlzLmNvbnRyb2xsZXJfLnRlcm1pbmF0ZSgpKSx0aGlzLnNob3VsZFN0b3BfPSEwfW1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnQoKXtsZXQgZT0oRGF0ZS5ub3coKS10aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF8pLzFlMyx0PXRoaXMuZnJhbWVzRnJvbVNvdXJjZV8vZSxzPXRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfL2U7aWYodGhpcy50cmFja0V4cGVjdGVkUmF0ZV8hPS0xJiZ0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXypScj50KXtjb25zdCBvPXtldmVudE1ldGFEYXRhOnt0cmFuc2Zvcm1lckluZGV4OnRoaXMuaW5kZXhffSx3YXJuaW5nVHlwZTp5ZS5GUFNfRFJPUCxkcm9wSW5mbzp7cmVxdWVzdGVkOnRoaXMudHJhY2tFeHBlY3RlZFJhdGVfLGN1cnJlbnQ6dH19O3RoaXMuZW1pdCgid2FybiIsbyl9Y29uc3Qgbj1uZXcgXygpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmZwcyh0KS50cmFuc2Zvcm1lZEZwcyhzKS5mcmFtZXNUcmFuc2Zvcm1lZCh0aGlzLmZyYW1lc1RyYW5zZm9ybWVkXykuZ3VpZCh0aGlzLnV1aWRfKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52aWRlb0hlaWdodCh0aGlzLnZpZGVvSGVpZ2h0XykudmlkZW9XaWR0aCh0aGlzLnZpZGVvV2lkdGhfKS52YXJpYXRpb24oIlFvUyIpLmJ1aWxkKCk7Yi5yZXBvcnQobiksdGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfPTAsdGhpcy5mcmFtZXNGcm9tU291cmNlXz0wLHRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfPTB9fWNsYXNzIENyIGV4dGVuZHMgbWV7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLnRyYW5zZm9ybWVyc189W10sdGhpcy50cmFja0V4cGVjdGVkUmF0ZV89LTE7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2xldCBzPW5ldyBTcihlW3RdLHQpO3Mub24oImVycm9yIixuPT57dGhpcy5lbWl0KCJlcnJvciIsbil9KSxzLm9uKCJ3YXJuIixuPT57dGhpcy5lbWl0KCJ3YXJuIixuKX0pLHRoaXMudHJhbnNmb3JtZXJzXy5wdXNoKHMpfX1zZXRUcmFja0V4cGVjdGVkUmF0ZShlKXt0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz1lO2ZvcihsZXQgdCBvZiB0aGlzLnRyYW5zZm9ybWVyc18pdC5zZXRUcmFja0V4cGVjdGVkUmF0ZSh0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyl9YXN5bmMgc3RhcnQoZSx0KXtpZighdGhpcy50cmFuc2Zvcm1lcnNffHx0aGlzLnRyYW5zZm9ybWVyc18ubGVuZ3RoPT09MCl7Y29uc29sZS5sb2coIltQaXBlbGluZV0gTm8gdHJhbnNmb3JtZXJzLiIpO3JldHVybn10cnl7bGV0IHM9ZTtmb3IobGV0IG4gb2YgdGhpcy50cmFuc2Zvcm1lcnNfKWU9ZS5waXBlVGhyb3VnaChuZXcgVHJhbnNmb3JtU3RyZWFtKG4pKTtlLnBpcGVUbyh0KS50aGVuKGFzeW5jKCk9Pntjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBTZXR1cC4iKSxhd2FpdCB0LmFib3J0KCksYXdhaXQgcy5jYW5jZWwoKSx0aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIse21lc3NhZ2U6InBpcGVsaW5lX2VuZGVkIn0pfSkuY2F0Y2goYXN5bmMgbj0+e2UuY2FuY2VsKCkudGhlbigoKT0+e2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIFNodXR0aW5nIGRvd24gc3RyZWFtcyBhZnRlciBhYm9ydC4iKX0pLmNhdGNoKG89Pntjb25zb2xlLmVycm9yKCJbUGlwZWxpbmVdIEVycm9yIGZyb20gc3RyZWFtIHRyYW5zZm9ybToiLG8pfSksYXdhaXQgdC5hYm9ydChuKSxhd2FpdCBzLmNhbmNlbChuKSx0aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIse21lc3NhZ2U6InBpcGVsaW5lX2VuZGVkX3dpdGhfZXJyb3IifSl9KX1jYXRjaHt0aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIse21lc3NhZ2U6InBpcGVsaW5lX3N0YXJ0ZWRfd2l0aF9lcnJvciJ9KSx0aGlzLmRlc3Ryb3koKTtyZXR1cm59dGhpcy5lbWl0KCJwaXBlbGluZUluZm8iLHttZXNzYWdlOiJwaXBlbGluZV9zdGFydGVkIn0pLGNvbnNvbGUubG9nKCJbUGlwZWxpbmVdIFBpcGVsaW5lIHN0YXJ0ZWQuIil9YXN5bmMgZGVzdHJveSgpe2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIERlc3Ryb3lpbmcgUGlwZWxpbmUuIik7Zm9yKGxldCBlIG9mIHRoaXMudHJhbnNmb3JtZXJzXyllLnN0b3AoKX19Y2xhc3MgT3IgZXh0ZW5kcyBtZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy51dWlkXz1HZSgpLHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfPS0xO2NvbnN0IGU9bmV3IF8oKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS52YXJpYXRpb24oIkNyZWF0ZSIpLmJ1aWxkKCk7Yi5yZXBvcnQoZSl9c2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl7dGhpcy50cmFja0V4cGVjdGVkUmF0ZV89ZSx0aGlzLnBpcGVsaW5lXyYmdGhpcy5waXBlbGluZV8uc2V0VHJhY2tFeHBlY3RlZFJhdGUodGhpcy50cmFja0V4cGVjdGVkUmF0ZV8pfXRyYW5zZm9ybShlLHQpe3JldHVybiB0aGlzLnJlYWRhYmxlXz1lLHRoaXMud3JpdGFibGVfPXQsdGhpcy50cmFuc2Zvcm1JbnRlcm5hbCgpfXRyYW5zZm9ybUludGVybmFsKCl7cmV0dXJuIG5ldyBQcm9taXNlKChlLHQpPT57aWYoIXRoaXMudHJhbnNmb3JtZXJzX3x8dGhpcy50cmFuc2Zvcm1lcnNfLmxlbmd0aD09PTApe2NvbnN0IG49bmV3IF8oKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKFAuZXJyb3JzLnRyYW5zZm9ybWVyX25vbmUpLnZhcmlhdGlvbigiRXJyb3IiKS5idWlsZCgpO2IucmVwb3J0KG4pLHQoIltNZWRpYVByb2Nlc3Nvcl0gTmVlZCB0byBzZXQgdHJhbnNmb3JtZXJzLiIpO3JldHVybn1pZighdGhpcy5yZWFkYWJsZV8pe2NvbnN0IG49bmV3IF8oKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKFAuZXJyb3JzLnJlYWRhYmxlX251bGwpLnZhcmlhdGlvbigiRXJyb3IiKS5idWlsZCgpO2IucmVwb3J0KG4pLHQoIltNZWRpYVByb2Nlc3Nvcl0gUmVhZGFibGUgaXMgbnVsbC4iKTtyZXR1cm59aWYoIXRoaXMud3JpdGFibGVfKXtjb25zdCBuPW5ldyBfKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShQLmVycm9ycy53cml0YWJsZV9udWxsKS52YXJpYXRpb24oIkVycm9yIikuYnVpbGQoKTtiLnJlcG9ydChuKSx0KCJbTWVkaWFQcm9jZXNzb3JdIFdyaXRhYmxlIGlzIG51bGwuIik7cmV0dXJufWxldCBzPSExO3RoaXMucGlwZWxpbmVfJiYocz0hMCx0aGlzLnBpcGVsaW5lXy5jbGVhckxpc3RlbmVycygpLHRoaXMucGlwZWxpbmVfLmRlc3Ryb3koKSksdGhpcy5waXBlbGluZV89bmV3IENyKHRoaXMudHJhbnNmb3JtZXJzXyksdGhpcy5waXBlbGluZV8ub24oIndhcm4iLG49Pnt0aGlzLmVtaXQoIndhcm4iLG4pfSksdGhpcy5waXBlbGluZV8ub24oImVycm9yIixuPT57dGhpcy5lbWl0KCJlcnJvciIsbil9KSx0aGlzLnBpcGVsaW5lXy5vbigicGlwZWxpbmVJbmZvIixuPT57cyYmKG4ubWVzc2FnZT09PSJwaXBlbGluZV9zdGFydGVkIj9uLm1lc3NhZ2U9InBpcGVsaW5lX3Jlc3RhcnRlZCI6bi5tZXNzYWdlPT09InBpcGVsaW5lX3N0YXJ0ZWRfd2l0aF9lcnJvciImJihuLm1lc3NhZ2U9InBpcGVsaW5lX3Jlc3RhcnRlZF93aXRoX2Vycm9yIikpLHRoaXMuZW1pdCgicGlwZWxpbmVJbmZvIixuKX0pLHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfIT0tMSYmdGhpcy5waXBlbGluZV8uc2V0VHJhY2tFeHBlY3RlZFJhdGUodGhpcy50cmFja0V4cGVjdGVkUmF0ZV8pLHRoaXMucGlwZWxpbmVfLnN0YXJ0KHRoaXMucmVhZGFibGVfLHRoaXMud3JpdGFibGVfKS50aGVuKCgpPT57ZSgpfSkuY2F0Y2gobj0+e3Qobil9KX0pfXNldFRyYW5zZm9ybWVycyhlKXtjb25zdCB0PW5ldyBfKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShQLnVwZGF0ZXMudHJhbnNmb3JtZXJfbmV3KS52YXJpYXRpb24oIlVwZGF0ZSIpLmJ1aWxkKCk7cmV0dXJuIGIucmVwb3J0KHQpLHRoaXMudHJhbnNmb3JtZXJzXz1lLHRoaXMucmVhZGFibGVfJiZ0aGlzLndyaXRhYmxlXz90aGlzLnRyYW5zZm9ybUludGVybmFsKCk6UHJvbWlzZS5yZXNvbHZlKCl9ZGVzdHJveSgpe3JldHVybiBuZXcgUHJvbWlzZShlPT57dGhpcy5waXBlbGluZV8mJnRoaXMucGlwZWxpbmVfLmRlc3Ryb3koKTtjb25zdCB0PW5ldyBfKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykudmFyaWF0aW9uKCJEZWxldGUiKS5idWlsZCgpO2IucmVwb3J0KHQpLGUoKX0pfX12YXIgX2U9KHI9PihyLkxvdz0iTG93IixyLkhpZ2g9IkhpZ2giLHIpKShfZXx8e30pO2NsYXNzIFlle2NvbnN0cnVjdG9yKGUpe3RoaXMuYmx1ckZpbHRlcl89ZT09PV9lLkhpZ2g/ImJsdXIoMTVweCkiOiJibHVyKDVweCkifWRlc3Ryb3koKXtyZXR1cm4gbmV3IFByb21pc2UoZT0+e2UoKX0pfXJ1blBvc3RQcm9jZXNzaW5nKGUsdCl7dHJ5e2UuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdmVyIixlLmZpbHRlcj10aGlzLmJsdXJGaWx0ZXJfLGUuZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpfWNhdGNoKHMpe2NvbnNvbGUubG9nKCJbQmx1clBvc3RQcm9jZXNzXSBGYWlsZWQgdG8gZHJhdyBjYW52YXMiLHMpfX19Y2xhc3MgWmV7Y29uc3RydWN0b3IoKXt9ZGVzdHJveSgpe3JldHVybiBuZXcgUHJvbWlzZShlPT57dGhpcy5iZ0ltYWdlXyYmdGhpcy5iZ0ltYWdlXy5jbG9zZSgpLGUoKX0pfXNldFZpcnR1YWxCR0ltYWdlKGUpe3RoaXMuYmdJbWFnZV8mJnRoaXMuYmdJbWFnZV8uY2xvc2UoKSx0aGlzLmJnSW1hZ2VfPWV9YXN5bmMgcnVuUG9zdFByb2Nlc3NpbmcoZSx0KXtpZih0aGlzLmJnSW1hZ2VfKXtpZih0aGlzLmJnSW1hZ2VfLndpZHRoIT10LndpZHRofHx0aGlzLmJnSW1hZ2VfLmhlaWdodCE9dC5oZWlnaHQpe2NvbnN0IHM9ImhpZ2giLG49e3Jlc2l6ZVdpZHRoOnQud2lkdGgscmVzaXplSGVpZ2h0OnQuaGVpZ2h0LHJlc2l6ZVF1YWxpdHk6c307dHJ5e3RoaXMuYmdJbWFnZV89YXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAodGhpcy5iZ0ltYWdlXyxuKX1jYXRjaChvKXt0aHJvdyBvfX1lLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iZGVzdGluYXRpb24tb3ZlciIsZS5kcmF3SW1hZ2UodGhpcy5iZ0ltYWdlXywwLDAsdGhpcy5iZ0ltYWdlXy53aWR0aCx0aGlzLmJnSW1hZ2VfLmhlaWdodCl9fX1jbGFzcyBJcntjb25zdHJ1Y3RvcihlPTEvMCl7dGhpcy5jYXBhY2l0eT1lLHRoaXMuc3RvcmFnZT1bXX1lbnF1ZXVlKGUpe2lmKHRoaXMuc2l6ZSgpPT09dGhpcy5jYXBhY2l0eSl0aHJvdyBFcnJvcigiUXVldWUgaGFzIHJlYWNoZWQgbWF4IGNhcGFjaXR5LCB5b3UgY2Fubm90IGFkZCBtb3JlIGl0ZW1zIik7dGhpcy5zdG9yYWdlLnB1c2goZSl9ZGVxdWV1ZSgpe3JldHVybiB0aGlzLnN0b3JhZ2Uuc2hpZnQoKX1zaXplKCl7cmV0dXJuIHRoaXMuc3RvcmFnZS5sZW5ndGh9fWNvbnN0IGJlPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5xdWV1ZV89bmV3IElyfWNsZWFyUXVldWUocil7Zm9yKDt0aGlzLnF1ZXVlXy5zaXplKCk+MDspdGhpcy5xdWV1ZV8uZGVxdWV1ZSgpLmNsb3NlKCl9c2V0VmlkZW9SZWFkYWJsZShyKXtyZXR1cm4gbmV3IFByb21pc2UoKGUsdCk9Pnt0aGlzLmZyYW1lUmVhZGVyXz1yLmdldFJlYWRlcigpLHRoaXMuZnJhbWVSZWFkZXJfLnJlYWQoKS50aGVuKHM9Pnt0aGlzLnByb2Nlc3NGcmFtZShzKX0pLmNhdGNoKHM9Pnt0KHMpfSksZSgpfSl9ZGVzdHJveSgpe3JldHVybiBuZXcgUHJvbWlzZShhc3luYyhyLGUpPT57dmFyIHQ7dGhpcy5jbGVhclF1ZXVlKCEwKSx0aGlzLmZyYW1lUmVhZGVyXz8odD10aGlzLmZyYW1lUmVhZGVyXyk9PW51bGx8fHQuY2FuY2VsKCkudGhlbigoKT0+e3IoKX0pLmNhdGNoKHM9PntlKHMpfSk6cigpfSl9cHJvY2Vzc0ZyYW1lKHIpe2lmKCFyLmRvbmUpe2lmKCF0aGlzLmZyYW1lUmVhZGVyXyl7ci52YWx1ZS5jbG9zZSgpO3JldHVybn1mb3IoO3RoaXMucXVldWVfLnNpemUoKT49YmUuTlVNQkVSX09GX0ZSQU1FU19UT19DTEVBUjspe2xldCBlPXRoaXMucXVldWVfLmRlcXVldWUoKTtlJiZlLmNsb3NlKCl9dGhpcy5xdWV1ZV8uZW5xdWV1ZShyLnZhbHVlKSx0aGlzLmZyYW1lUmVhZGVyXy5yZWFkKCkudGhlbihlPT57dGhpcy5wcm9jZXNzRnJhbWUoZSl9KS5jYXRjaChlPT57Y29uc29sZS5lcnJvcihlKX0pfX1ydW5Qb3N0UHJvY2Vzc2luZyhyLGUpe3RyeXtpZihyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iZGVzdGluYXRpb24tb3ZlciIsdGhpcy5xdWV1ZV8uc2l6ZSgpPmJlLk5VTUJFUl9PRl9GUkFNRVNfVE9fQ0xFQVImJnRoaXMuY2xlYXJRdWV1ZSghMSksdGhpcy5xdWV1ZV8uc2l6ZSgpPjApe2NvbnN0IHQ9dGhpcy5xdWV1ZV8uZGVxdWV1ZSgpO3IuZHJhd0ltYWdlKHQsMCwwLGUud2lkdGgsZS5oZWlnaHQpLHQuY2xvc2UoKX19Y2F0Y2godCl7Y29uc29sZS5lcnJvcigiW1ZpZGVvUG9zdFByb2Nlc3NdIEZhaWxlZCB0byBkcmF3IGNhbnZhcyIsdCl9fX07bGV0IHdlPWJlO3dlLk5VTUJFUl9PRl9GUkFNRVNfVE9fQ0xFQVI9NTtjbGFzcyB4cntjb25zdHJ1Y3RvcihlKXt0aGlzLmJsdXJGaWx0ZXJfPWU9PT1fZS5IaWdoPyJibHVyKDE1cHgpIjoiYmx1cig1cHgpIn1kZXN0cm95KCl7cmV0dXJuIG5ldyBQcm9taXNlKGU9PntlKCl9KX1ydW5Qb3N0UHJvY2Vzc2luZyhlLHQpe3RyeXtlLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0ic291cmNlLWluIixlLmZpbHRlcj10aGlzLmJsdXJGaWx0ZXJfLGUuZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpLGUuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdmVyIixlLmZpbHRlcj0iYmx1cigwcHgpIixlLmRyYXdJbWFnZSh0LDAsMCx0LndpZHRoLHQuaGVpZ2h0KX1jYXRjaChzKXtjb25zb2xlLmxvZygiW0JsdXJQb3N0UHJvY2Vzc10gRmFpbGVkIHRvIGRyYXcgY2FudmFzIixzKX19fWNvbnN0IHc9Y2xhc3N7Y29uc3RydWN0b3IoKXtpZih0aGlzLmxhc3RQcm9jZXNzZWRUaW1lc3RhbXBfPTAsdGhpcy5uZXdJbnB1dENvdW50ZXI9MCx0aGlzLnRpbWVyR2FwXz13LkJMVVJfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05ELHRoaXMucmVzdWx0Q2FudmFzXz1uZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSksdGhpcy5yZXN1bHRDdHhfPXRoaXMucmVzdWx0Q2FudmFzXy5nZXRDb250ZXh0KCIyZCIse2FscGhhOiExLGRlc3luY2hyb25pemVkOiEwfSksIXRoaXMucmVzdWx0Q3R4Xyl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIik7aWYodGhpcy5zZWdtZW50YXRpb25NYXNrQ2FudmFzXz1uZXcgT2Zmc2NyZWVuQ2FudmFzKHcuU0VMRklFX1dJRFRILHcuU0VMRklFX0hJR0hUKSx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfPXRoaXMuc2VnbWVudGF0aW9uTWFza0NhbnZhc18uZ2V0Q29udGV4dCgiMmQiLHthbHBoYTohMSxkZXN5bmNocm9uaXplZDohMH0pLCF0aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfKXRocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQiKX1pbml0KHIpe3RoaXMucHJvY2Vzc0ZyYW1lQ2I9cn1hc3luYyBzZXRCYWNrZ3JvdW5kT3B0aW9ucyhyKXtpZih0eXBlb2YgdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV8hPSJ1bmRlZmluZWQiKXRyeXthd2FpdCB0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXy5kZXN0cm95KCl9Y2F0Y2goZSl7dGhyb3cgZX1pZihyLnRyYW5zZm9ybWVyVHlwZT09PSJWaXJ0dWFsQmFja2dyb3VuZCIpdGhpcy50aW1lckdhcF89dy5WSVJUVUFMX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORCx0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXz1uZXcgWmU7ZWxzZSBpZihyLnRyYW5zZm9ybWVyVHlwZT09PSJCYWNrZ3JvdW5kQmx1ciIpe2xldCBlPXI7dGhpcy50aW1lckdhcF89dy5CTFVSX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORCx0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXz1uZXcgWWUoZS5yYWRpdXMpfWVsc2UgaWYoci50cmFuc2Zvcm1lclR5cGU9PT0iVmlkZW9CYWNrZ3JvdW5kIil0aGlzLnRpbWVyR2FwXz13LkJMVVJfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05ELHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfPW5ldyB3ZTtlbHNlIGlmKHIudHJhbnNmb3JtZXJUeXBlPT09IlNpbHVldGVCbHVyIil7bGV0IGU9cjt0aGlzLnRpbWVyR2FwXz13LkJMVVJfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05ELHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfPW5ldyB4cihlLnJhZGl1cyl9ZWxzZSB0aGlzLnRpbWVyR2FwXz13LkJMVVJfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05ELHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfPW5ldyBZZX1jbG9zZSgpe3JldHVybiBuZXcgUHJvbWlzZSgocixlKT0+e3RoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfP3RoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfLmRlc3Ryb3koKS50aGVuKCgpPT57cigpfSkuY2F0Y2godD0+e2UodCl9KTpyKCl9KX1zdGFydCgpe31hc3luYyB0cmFuc2Zvcm0ocixlKXsodGhpcy5yZXN1bHRDYW52YXNfLndpZHRoIT1yLmRpc3BsYXlXaWR0aHx8dGhpcy5yZXN1bHRDYW52YXNfLmhlaWdodCE9ci5kaXNwbGF5SGVpZ2h0KSYmKHRoaXMucmVzdWx0Q2FudmFzXy53aWR0aD1yLmRpc3BsYXlXaWR0aCx0aGlzLnJlc3VsdENhbnZhc18uaGVpZ2h0PXIuZGlzcGxheUhlaWdodCk7Y29uc3QgdD1yLnRpbWVzdGFtcDtjcmVhdGVJbWFnZUJpdG1hcChyKS50aGVuKHM9PntyLmNsb3NlKCksdGhpcy5wcm9jZXNzRnJhbWUoZSxzLHQpfSkuY2F0Y2gocz0+e2UuZW5xdWV1ZShyKX0pfXByb2Nlc3NGcmFtZShyLGUsdCl7KHRoaXMubmV3SW5wdXRDb3VudGVyPHcuTkVXX0lOUFVUX05VTUJFUl9PRl9SVU5TfHx0LXRoaXMubGFzdFByb2Nlc3NlZFRpbWVzdGFtcF8+PXRoaXMudGltZXJHYXBfKSYmKHRoaXMubGFzdFByb2Nlc3NlZFRpbWVzdGFtcF89dCx0aGlzLnByb2Nlc3NTb3VyY2UoZSksdGhpcy5uZXdJbnB1dENvdW50ZXI8dy5ORVdfSU5QVVRfTlVNQkVSX09GX1JVTlMmJnRoaXMubmV3SW5wdXRDb3VudGVyKyspLHRoaXMucmVzdWx0Q3R4Xy5zYXZlKCksdGhpcy5yZXN1bHRDdHhfLmNsZWFyUmVjdCgwLDAsdGhpcy5yZXN1bHRDYW52YXNfLndpZHRoLHRoaXMucmVzdWx0Q2FudmFzXy5oZWlnaHQpLHRoaXMuc2VnbWVudGF0aW9uTWFza0ltYWdlXyYmKHRoaXMucmVzdWx0Q3R4Xy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImNvcHkiLHRoaXMucmVzdWx0Q3R4Xy5kcmF3SW1hZ2UodGhpcy5zZWdtZW50YXRpb25NYXNrSW1hZ2VfLDAsMCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tJbWFnZV8ud2lkdGgsdGhpcy5zZWdtZW50YXRpb25NYXNrSW1hZ2VfLmhlaWdodCwwLDAsdGhpcy5yZXN1bHRDYW52YXNfLndpZHRoLHRoaXMucmVzdWx0Q2FudmFzXy5oZWlnaHQpKSx0aGlzLnJlc3VsdEN0eF8uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJzb3VyY2UtYXRvcCIsdGhpcy5yZXN1bHRDdHhfLmZpbHRlcj0ibm9uZSIsdGhpcy5yZXN1bHRDdHhfLmRyYXdJbWFnZShlLDAsMCxlLndpZHRoLGUuaGVpZ2h0KSx0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXyYmdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV8ucnVuUG9zdFByb2Nlc3NpbmcodGhpcy5yZXN1bHRDdHhfLGUpLHRoaXMucmVzdWx0Q3R4Xy5yZXN0b3JlKCksci5lbnF1ZXVlKG5ldyBWaWRlb0ZyYW1lKHRoaXMucmVzdWx0Q2FudmFzXyx7dGltZXN0YW1wOnQsYWxwaGE6ImRpc2NhcmQifSkpLGUuY2xvc2UoKX1wcm9jZXNzU291cmNlKHIpe2lmKHRoaXMuc2VnbWVudGF0aW9uTWFza0N0eF8uY2xlYXJSZWN0KDAsMCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLndpZHRoLHRoaXMuc2VnbWVudGF0aW9uTWFza0NhbnZhc18uaGVpZ2h0KSx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfLmRyYXdJbWFnZShyLDAsMCxyLndpZHRoLHIuaGVpZ2h0LDAsMCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLndpZHRoLHRoaXMuc2VnbWVudGF0aW9uTWFza0NhbnZhc18uaGVpZ2h0KSx0aGlzLnByb2Nlc3NGcmFtZUNiKXtsZXQgZT10aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpO3RoaXMucHJvY2Vzc0ZyYW1lQ2IoZSl9fWZsdXNoKCl7fWdldFRyYW5zZm9ybWVyVHlwZSgpe3JldHVybiJCYWNrZ3JvdW5kVHJhbnNmb3JtZXIifXJlc2V0TmV3SW5wdXRDb3VuZXIoKXt0aGlzLm5ld0lucHV0Q291bnRlcj0wfXNldFZpZGVvQkdSZWFkYWJsZShyKXtyZXR1cm4gbmV3IFByb21pc2UoKGUsdCk9Pnt0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXyBpbnN0YW5jZW9mIHdlP3RoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfLnNldFZpZGVvUmVhZGFibGUocikudGhlbigoKT0+e2UoKX0pLmNhdGNoKHM9Pnt0KHMpfSk6dCgicG9zdCBwcm9jZXNzIGlzIG5vdCB2aWRlbyIpfSl9c2V0VmlydHVhbEJHSW1hZ2Uocil7cmV0dXJuIG5ldyBQcm9taXNlKChlLHQpPT57dGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV8gaW5zdGFuY2VvZiBaZT8odGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV8uc2V0VmlydHVhbEJHSW1hZ2UociksZSgpKTp0KCJwb3N0IHByb2Nlc3MgaXMgbm90IHZpZGVvIil9KX1zZXRTZWdtZW50YXRpb25NYXNrSW1hZ2Uocil7dGhpcy5zZWdtZW50YXRpb25NYXNrSW1hZ2VfJiZ0aGlzLnNlZ21lbnRhdGlvbk1hc2tJbWFnZV8uY2xvc2UoKSx0aGlzLnNlZ21lbnRhdGlvbk1hc2tJbWFnZV89cn19O2xldCBOPXc7Ti5CTFVSX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORD0yZTUsTi5WSVJUVUFMX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORD0xNWU0LE4uTkVXX0lOUFVUX05VTUJFUl9PRl9SVU5TPTMwLE4uU0VMRklFX1dJRFRIPTI1NixOLlNFTEZJRV9ISUdIVD0xNDQ7ZnVuY3Rpb24gTXIocil7cmV0dXJuIHR5cGVvZiByPT0ib2JqZWN0IiYmciE9PW51bGwmJiJtZXNzYWdlImluIHImJnR5cGVvZiByLm1lc3NhZ2U9PSJzdHJpbmcifWZ1bmN0aW9uIEFyKHIpe2lmKE1yKHIpKXJldHVybiByO3RyeXtyZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHIpKX1jYXRjaHtyZXR1cm4gbmV3IEVycm9yKFN0cmluZyhyKSl9fWZ1bmN0aW9uIFUocil7cmV0dXJuIHR5cGVvZiByPT0idW5kZWZpbmVkIj8iIjpBcihyKS5tZXNzYWdlfWlmKHR5cGVvZiBpbXBvcnRTY3JpcHRzPT0iZnVuY3Rpb24iKXtsZXQgcj1mdW5jdGlvbigpe3JldHVybiBuZXcgUHJvbWlzZSgocyxuKT0+e2U9bmV3IE9yLGUub24oImVycm9yIixpPT57Y29uc3QgYT17Y2FsbGJhY2tUeXBlOiJtZWRpYV9wcm9jZXNzb3JfZXJyb3JfZXZlbnQiLG1lc3NhZ2U6aX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSksZS5vbigid2FybiIsaT0+e2NvbnN0IGE9e2NhbGxiYWNrVHlwZToibWVkaWFfcHJvY2Vzc29yX3dhcm5fZXZlbnQiLG1lc3NhZ2U6aX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSksZS5vbigicGlwZWxpbmVJbmZvIixpPT57Y29uc3QgYT17Y2FsbGJhY2tUeXBlOiJtZWRpYV9wcm9jZXNzb3JfcGlwZWxpbmVfZXZlbnQiLG1lc3NhZ2U6aX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSksdD1uZXcgTix0LmluaXQoaT0+e3Bvc3RNZXNzYWdlKGksW2ldKX0pO2xldCBvPVtdO28ucHVzaCh0KSxlLnNldFRyYW5zZm9ybWVycyhvKS50aGVuKCgpPT57cygpfSkuY2F0Y2goaT0+e24oaSl9KX0pfSxlLHQ7b25tZXNzYWdlPWFzeW5jIHM9PntpZihzLmRhdGEgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCl7dCYmdC5zZXRTZWdtZW50YXRpb25NYXNrSW1hZ2Uocy5kYXRhKTtyZXR1cm59Y29uc3R7b3BlcmF0aW9uOm59PXMuZGF0YTtpZihuPT09ImluaXQiKXtjb25zdHttZXRhRGF0YTpvfT1zLmRhdGE7dHlwZW9mIG89PSJzdHJpbmciJiZkcihKU09OLnBhcnNlKG8pKSxyKCkudGhlbigoKT0+e2NvbnN0IGk9e2NhbGxiYWNrVHlwZToic3VjY2VzcyIsbWVzc2FnZTpufTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShpKSl9KS5jYXRjaChpPT57Y29uc3QgYT17Y2FsbGJhY2tUeXBlOiJlcnJvciIsbWVzc2FnZTpuLGVycm9yOlUoaSl9O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGEpKX0pfWVsc2UgaWYobj09PSJ0cmFuc2Zvcm0iKXtjb25zdHtyZWFkYWJsZTpvLHdyaXRhYmxlOml9PXMuZGF0YTt0LnJlc2V0TmV3SW5wdXRDb3VuZXIoKSxlLnRyYW5zZm9ybShvLGkpLnRoZW4oKCk9Pntjb25zdCBhPXtjYWxsYmFja1R5cGU6InN1Y2Nlc3MiLG1lc3NhZ2U6bn07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSkuY2F0Y2goYT0+e2NvbnN0IGw9e2NhbGxiYWNrVHlwZToiZXJyb3IiLG1lc3NhZ2U6bixlcnJvcjpVKGEpfTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShsKSl9KX1lbHNlIGlmKG49PT0iZGVzdHJveSIpdC5jbG9zZSgpLmZpbmFsbHkoKCk9PntlLmRlc3Ryb3koKS50aGVuKCgpPT57Y29uc3Qgbz17Y2FsbGJhY2tUeXBlOiJzdWNjZXNzIixtZXNzYWdlOm59O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KG8pKX0pLmNhdGNoKG89Pntjb25zdCBpPXtjYWxsYmFja1R5cGU6ImVycm9yIixtZXNzYWdlOm4sZXJyb3I6VShvKX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoaSkpfSl9KTtlbHNlIGlmKG49PT0ic2V0VHJhY2tFeHBlY3RlZFJhdGUiKXtlLnNldFRyYWNrRXhwZWN0ZWRSYXRlKHMuZGF0YS5yYXRlKTtjb25zdCBvPXtjYWxsYmFja1R5cGU6InN1Y2Nlc3MiLG1lc3NhZ2U6bn07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkobykpfWVsc2UgaWYobj09PSJzZXRCYWNrZ3JvdW5kT3B0aW9ucyIpe2NvbnN0e2JhY2tncm91bmRPcHRpb25zOm99PXMuZGF0YTt0LnNldEJhY2tncm91bmRPcHRpb25zKEpTT04ucGFyc2UobykpLnRoZW4oKCk9Pntjb25zdCBpPXtjYWxsYmFja1R5cGU6InN1Y2Nlc3MiLG1lc3NhZ2U6bn07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoaSkpfSkuY2F0Y2goaT0+e2NvbnN0IGE9e2NhbGxiYWNrVHlwZToiZXJyb3IiLG1lc3NhZ2U6bixlcnJvcjpVKGkpfTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShhKSl9KX1lbHNlIGlmKG49PT0ic2V0VmlkZW9CR1JlYWRhYmxlIil7Y29uc3R7cmVhZGFibGU6b309cy5kYXRhO3Quc2V0VmlkZW9CR1JlYWRhYmxlKG8pLnRoZW4oKCk9Pntjb25zdCBpPXtjYWxsYmFja1R5cGU6InN1Y2Nlc3MiLG1lc3NhZ2U6bn07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoaSkpfSkuY2F0Y2goaT0+e2NvbnN0IGE9e2NhbGxiYWNrVHlwZToiZXJyb3IiLG1lc3NhZ2U6bixlcnJvcjpVKGkpfTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShhKSl9KX1lbHNlIGlmKG49PT0ic2V0VmlydHVhbEJHSW1hZ2UiKXtjb25zdHtpbWFnZTpvfT1zLmRhdGE7dC5zZXRWaXJ0dWFsQkdJbWFnZShvKS50aGVuKCgpPT57Y29uc3QgaT17Y2FsbGJhY2tUeXBlOiJzdWNjZXNzIixtZXNzYWdlOm59O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGkpKX0pLmNhdGNoKGk9Pntjb25zdCBhPXtjYWxsYmFja1R5cGU6ImVycm9yIixtZXNzYWdlOm4sZXJyb3I6VShpKX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSl9fX19KSgpOwo=",sl=typeof window!="undefined"&&window.Blob&&new Blob([atob(dl)],{type:"text/javascript;charset=utf-8"});function zt(){const c=sl&&(window.URL||window.webkitURL).createObjectURL(sl);try{return c?new Worker(c,{}):new Worker("data:application/javascript;base64,"+dl,{type:"module"})}finally{c&&(window.URL||window.webkitURL).revokeObjectURL(c)}}const f=new WeakMap,le=new WeakMap,T=new WeakMap,We=Symbol("anyProducer"),al=Promise.resolve(),te=Symbol("listenerAdded"),ce=Symbol("listenerRemoved");let Ve=!1;function g(c){if(typeof c!="string"&&typeof c!="symbol")throw new TypeError("eventName must be a string or a symbol")}function ie(c){if(typeof c!="function")throw new TypeError("listener must be a function")}function v(c,e){const l=le.get(c);return l.has(e)||l.set(e,new Set),l.get(e)}function B(c,e){const l=typeof e=="string"||typeof e=="symbol"?e:We,t=T.get(c);return t.has(l)||t.set(l,new Set),t.get(l)}function Ft(c,e,l){const t=T.get(c);if(t.has(e))for(const i of t.get(e))i.enqueue(l);if(t.has(We)){const i=Promise.all([e,l]);for(const d of t.get(We))d.enqueue(i)}}function ol(c,e){e=Array.isArray(e)?e:[e];let l=!1,t=()=>{},i=[];const d={enqueue(n){i.push(n),t()},finish(){l=!0,t()}};for(const n of e)B(c,n).add(d);return{async next(){return i?i.length===0?l?(i=void 0,this.next()):(await new Promise(n=>{t=n}),this.next()):{done:!1,value:await i.shift()}:{done:!0}},async return(n){i=void 0;for(const s of e)B(c,s).delete(d);return t(),arguments.length>0?{done:!0,value:await n}:{done:!0}},[Symbol.asyncIterator](){return this}}}function Zl(c){if(c===void 0)return ml;if(!Array.isArray(c))throw new TypeError("`methodNames` must be an array of strings");for(const e of c)if(!ml.includes(e))throw typeof e!="string"?new TypeError("`methodNames` element must be a string"):new Error(`${e} is not Emittery method`);return c}const Re=c=>c===te||c===ce;class Y{static mixin(e,l){return l=Zl(l),t=>{if(typeof t!="function")throw new TypeError("`target` must be function");for(const n of l)if(t.prototype[n]!==void 0)throw new Error(`The property \`${n}\` already exists on \`target\``);function i(){return Object.defineProperty(this,e,{enumerable:!1,value:new Y}),this[e]}Object.defineProperty(t.prototype,e,{enumerable:!1,get:i});const d=n=>function(...s){return this[e][n](...s)};for(const n of l)Object.defineProperty(t.prototype,n,{enumerable:!1,value:d(n)});return t}}static get isDebugEnabled(){if(typeof process!="object")return Ve;const{env:e}=process||{env:{}};return e.DEBUG==="emittery"||e.DEBUG==="*"||Ve}static set isDebugEnabled(e){Ve=e}constructor(e={}){f.set(this,new Set),le.set(this,new Map),T.set(this,new Map),this.debug=e.debug||{},this.debug.enabled===void 0&&(this.debug.enabled=!1),this.debug.logger||(this.debug.logger=(l,t,i,d)=>{try{d=JSON.stringify(d)}catch{d=`Object with the following keys failed to stringify: ${Object.keys(d).join(",")}`}typeof i=="symbol"&&(i=i.toString());const n=new Date,s=`${n.getHours()}:${n.getMinutes()}:${n.getSeconds()}.${n.getMilliseconds()}`;console.log(`[${s}][emittery:${l}][${t}] Event Name: ${i}
4
- data: ${d}`)})}logIfDebugEnabled(e,l,t){(Y.isDebugEnabled||this.debug.enabled)&&this.debug.logger(e,this.debug.name,l,t)}on(e,l){ie(l),e=Array.isArray(e)?e:[e];for(const t of e)g(t),v(this,t).add(l),this.logIfDebugEnabled("subscribe",t,void 0),Re(t)||this.emit(te,{eventName:t,listener:l});return this.off.bind(this,e,l)}off(e,l){ie(l),e=Array.isArray(e)?e:[e];for(const t of e)g(t),v(this,t).delete(l),this.logIfDebugEnabled("unsubscribe",t,void 0),Re(t)||this.emit(ce,{eventName:t,listener:l})}once(e){return new Promise(l=>{const t=this.on(e,i=>{t(),l(i)})})}events(e){e=Array.isArray(e)?e:[e];for(const l of e)g(l);return ol(this,e)}async emit(e,l){g(e),this.logIfDebugEnabled("emit",e,l),Ft(this,e,l);const t=v(this,e),i=f.get(this),d=[...t],n=Re(e)?[]:[...i];await al,await Promise.all([...d.map(async s=>{if(t.has(s))return s(l)}),...n.map(async s=>{if(i.has(s))return s(e,l)})])}async emitSerial(e,l){g(e),this.logIfDebugEnabled("emitSerial",e,l);const t=v(this,e),i=f.get(this),d=[...t],n=[...i];await al;for(const s of d)t.has(s)&&await s(l);for(const s of n)i.has(s)&&await s(e,l)}onAny(e){return ie(e),this.logIfDebugEnabled("subscribeAny",void 0,void 0),f.get(this).add(e),this.emit(te,{listener:e}),this.offAny.bind(this,e)}anyEvent(){return ol(this)}offAny(e){ie(e),this.logIfDebugEnabled("unsubscribeAny",void 0,void 0),this.emit(ce,{listener:e}),f.get(this).delete(e)}clearListeners(e){e=Array.isArray(e)?e:[e];for(const l of e)if(this.logIfDebugEnabled("clear",l,void 0),typeof l=="string"||typeof l=="symbol"){v(this,l).clear();const t=B(this,l);for(const i of t)i.finish();t.clear()}else{f.get(this).clear();for(const t of le.get(this).values())t.clear();for(const t of T.get(this).values()){for(const i of t)i.finish();t.clear()}}}listenerCount(e){e=Array.isArray(e)?e:[e];let l=0;for(const t of e){if(typeof t=="string"){l+=f.get(this).size+v(this,t).size+B(this,t).size+B(this).size;continue}typeof t!="undefined"&&g(t),l+=f.get(this).size;for(const i of le.get(this).values())l+=i.size;for(const i of T.get(this).values())l+=i.size}return l}bindMethods(e,l){if(typeof e!="object"||e===null)throw new TypeError("`target` must be an object");l=Zl(l);for(const t of l){if(e[t]!==void 0)throw new Error(`The property \`${t}\` already exists on \`target\``);Object.defineProperty(e,t,{enumerable:!1,value:this[t].bind(this)})}}}const ml=Object.getOwnPropertyNames(Y.prototype).filter(c=>c!=="constructor");Object.defineProperty(Y,"listenerAdded",{value:te,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(Y,"listenerRemoved",{value:ce,writable:!1,enumerable:!0,configurable:!1});var rl=Y;const J=class{constructor(){this.mediapipeMap_=new Map}getVersion(c){switch(c){case"face_detection":return K.VERSION;case"face_mesh":return Ye.VERSION;case"hands":return Ie.VERSION;case"holistic":return Ke.VERSION;case"objectron":return Se.VERSION;case"selfie_segmentation":return He.VERSION;case"pose":return Le.VERSION;default:return""}}initialize(c){return new Promise(async(e,l)=>{if(c.mediaPipeModelConfigArray.length==0){l("no model was selected");return}for(let t=0;t<c.mediaPipeModelConfigArray.length;t++){const i=c.mediaPipeModelConfigArray[t];if(this.mediapipeMap_.has(i.modelType)){l("setting same type is not supported");return}if(typeof i.listener!="function"){l(`[${i.modelType}] ResultsListener must be provided`);return}let d;switch(i.modelType){case"face_mesh":d=new Ye.FaceMesh({locateFile:(n,s)=>(i.assetsUri||J.defaultAssetsBaseUrl+"face_mesh/"+this.getVersion("face_mesh"))+"/"+n});break;case"face_detection":d=new K.FaceDetection({locateFile:(n,s)=>(i.assetsUri||J.defaultAssetsBaseUrl+"face_detection/"+this.getVersion("face_detection"))+"/"+n});break;case"hands":if(d=new Ie.Hands({locateFile:(n,s)=>(i.assetsUri||J.defaultAssetsBaseUrl+"hands/"+this.getVersion("hands"))+"/"+n}),i.options){let n=i.options;n.modelComplexity||(console.warn("hands model require modelComplexity setting to 0"),n.modelComplexity=0)}else{console.warn("hands model require modelComplexity setting to 0");let n={modelComplexity:0};i.options=n}break;case"holistic":d=new Ke.Holistic({locateFile:(n,s)=>(i.assetsUri||J.defaultAssetsBaseUrl+"holistic/"+this.getVersion("holistic"))+"/"+n});break;case"objectron":d=new Se.Objectron({locateFile:(n,s)=>(i.assetsUri||J.defaultAssetsBaseUrl+"objectron/"+this.getVersion("objectron"))+"/"+n});break;case"selfie_segmentation":d=new He.SelfieSegmentation({locateFile:(n,s)=>(i.assetsUri||J.defaultAssetsBaseUrl+"selfie_segmentation/"+this.getVersion("selfie_segmentation"))+"/"+n});break;case"pose":d=new Le.Pose({locateFile:(n,s)=>(i.assetsUri||J.defaultAssetsBaseUrl+"pose/"+this.getVersion("pose"))+"/"+n});break;default:l("unknown model type");return}d.onResults(i.listener),i.options&&d.setOptions(i.options);try{await d.initialize(),this.mediapipeMap_.set(i.modelType,d)}catch(n){l(n);return}}e()})}close(c){return new Promise((e,l)=>{let t=[];if(c){let i=this.mediapipeMap_.get(c);if(i)this.mediapipeMap_.delete(c),t.push(i.close());else{l("model not exit");return}}else{for(const[i,d]of this.mediapipeMap_.entries())t.push(d.close());this.mediapipeMap_.clear()}Promise.all(t).then(()=>{e()}).catch(i=>{l(i)})})}send(c,e){return new Promise((l,t)=>{let i=[];if(e){let d=this.mediapipeMap_.get(e);if(d)i.push(d.send({image:c}));else{t("model not exit");return}}else for(const[d,n]of this.mediapipeMap_.entries())i.push(n.send({image:c}));Promise.all(i).then(()=>{l()}).catch(d=>{t(d)})})}reset(c){if(c){let e=this.mediapipeMap_.get(c);e&&typeof e.reset=="function"&&e.reset()}else for(const[e,l]of this.mediapipeMap_.entries())l&&typeof l.reset=="function"&&l.reset()}};let fe=J;fe.defaultAssetsBaseUrl="https://d3opqjmqzxf057.cloudfront.net/ml/mediapipe/";class bl{static createVideoReadable(e){return new Promise((l,t)=>{const i=document.createElement("video");let d=new AbortController,n=new AbortController;i.addEventListener("canplay",()=>{d.abort(),i.muted=!0,i.loop=!0,i.play().then(()=>{try{const s=i.captureStream(),o=new MediaStreamTrackProcessor(s.getVideoTracks()[0]);l(o.readable)}catch(s){t(s)}})},{once:!0,signal:n.signal}),i.addEventListener("error",s=>{n.abort(),t("loading error:"+s)},{once:!0,signal:d.signal}),i.src=e})}static createImageCanvas(e){return new Promise((l,t)=>{var i=new Image;i.onload=function(){createImageBitmap(i).then(d=>{i.remove(),l(d)}).catch(d=>{t(d)})},i.onerror=function(d){t(d)},i.src=e})}}class gt extends rl{constructor(){super(),this.worker_=new zt,this.trackExpectedRate_=-1,this.workerInited_=!1,this.mediapipeHelper_=new fe,this.innerEmitty_=new rl,this.worker_.addEventListener("message",e=>{if(e.data instanceof ImageBitmap)this.mediapipeHelper_.send(e.data).then(()=>{e.data.close()}).catch(l=>{let t={error:l,eventMetaData:{transformerIndex:-1},function:"transform"};this.emit("error",t)});else{let l=JSON.parse(e.data);if(l.callbackType==="success"||l.callbackType==="error")l.message==="init"?this.innerEmitty_.emit("initResults",e.data):l.message==="transform"?this.innerEmitty_.emit("transformResults",e.data):l.message==="destroy"?this.innerEmitty_.emit("destroyResults",e.data):l.message==="setBackgroundOptions"?this.innerEmitty_.emit("setBackgroundOptionsResults",e.data):l.message==="setVideoBGReadable"?this.innerEmitty_.emit("setVideoBGReadableResults",e.data):l.message==="setVirtualBGImage"&&this.innerEmitty_.emit("setVirtualBGImageResults",e.data);else if(l.callbackType==="media_processor_error_event")this.emit("error",l.message);else if(l.callbackType==="media_processor_warn_event")this.emit("warn",l.message);else if(l.callbackType==="media_processor_pipeline_event"){this.emit("pipelineInfo",l.message);let t=l.message;(t.message==="pipeline_ended"||t.message==="pipeline_ended_with_error")&&this.mediapipeHelper_.close().finally(()=>{this.worker_&&this.worker_.terminate()})}}})}init(e){return new Promise((l,t)=>{let i={modelSelection:1,selfieMode:!1};this.mediapipeHelper_.initialize({mediaPipeModelConfigArray:[{assetsUri:e.mediapipeBaseAssetsUri,modelType:"selfie_segmentation",options:i,listener:d=>{let n=d;this.worker_.postMessage(n.segmentationMask,[n.segmentationMask])}}]}).then(()=>{let d=JSON.stringify(Kt());typeof d!="string"&&(d=JSON.stringify({})),this.worker_.postMessage({operation:"init",metaData:d}),this.innerEmitty_.once("initResults").then(n=>{let s=JSON.parse(n);s.callbackType==="success"?(this.workerInited_=!0,this.trackExpectedRate_!=-1&&this.postTrackExpectedRate(),this.setBackgroundOptions(e).then(()=>{l()}).catch(o=>{t(o)})):t(s.error)}).catch(n=>{t(n)})}).catch(d=>{t(d)})})}transform(e,l){return new Promise(async(t,i)=>{this.worker_.postMessage({operation:"transform",readable:e,writable:l},[e,l]),this.innerEmitty_.once("transformResults").then(d=>{let n=JSON.parse(d);n.callbackType==="success"?t():i(n.error)}).catch(d=>{i(d)})})}destroy(){return new Promise(async(e,l)=>{this.worker_.postMessage({operation:"destroy"}),this.innerEmitty_.once("destroyResults").then(t=>{let i=JSON.parse(t);i.callbackType==="success"?this.mediapipeHelper_.close().then(()=>{e()}).catch(d=>{l(d)}):l(i.error)}).catch(t=>{l(t)})})}setTrackExpectedRate(e){this.trackExpectedRate_=e,this.postTrackExpectedRate()}postTrackExpectedRate(){this.workerInited_&&this.worker_.postMessage({operation:"setTrackExpectedRate",rate:this.trackExpectedRate_})}setBackgroundOptions(e){return new Promise((l,t)=>{this.worker_.postMessage({operation:"setBackgroundOptions",backgroundOptions:JSON.stringify(e)}),this.innerEmitty_.once("setBackgroundOptionsResults").then(i=>{let d=JSON.parse(i);d.callbackType==="success"?e.transformerType==="VideoBackground"?bl.createVideoReadable(e.backgroundAssetUri).then(n=>{this.worker_.postMessage({operation:"setVideoBGReadable",readable:n},[n]),this.innerEmitty_.once("setVideoBGReadableResults").then(s=>{let o=JSON.parse(s);o.callbackType==="success"?l():t(o.error)}).catch(s=>{t(s)})}).catch(n=>{t(n)}):e.transformerType==="VirtualBackground"?bl.createImageCanvas(e.backgroundAssetUri).then(n=>{this.worker_.postMessage({operation:"setVirtualBGImage",image:n},[n]),this.innerEmitty_.once("setVirtualBGImageResults").then(s=>{let o=JSON.parse(s);o.callbackType==="success"?l():t(o.error)}).catch(s=>{t(s)})}).catch(n=>{t(n)}):l():t(d.error)}).catch(i=>{t(i)})})}}var ul=(c=>(c.Low="Low",c.High="High",c))(ul||{});const vt=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11]));function Ut(){return new Promise(async(c,e)=>{try{await Xl()}catch(l){e(l);return}vt().then(l=>{if(l===!1){e("Your browser does not support WebAssembly features.");return}c()}).catch(l=>{e(l)})})}let W,ne=-1;function kt(){return W}function xt(c){ne=c,typeof W!="undefined"&&W.setTrackExpectedRate(ne)}function Ct(c){return new Promise(async(e,l)=>{W=new gt,ne!=-1&&W.setTrackExpectedRate(ne),W.init(c).then(()=>{const t=new Nt(W);e(t)}).catch(t=>{l(t)})})}function Tt(c){return new Promise((e,l)=>{W?W.setBackgroundOptions(c).then(()=>{e()}).catch(t=>{l(t)}):l("media processor is not set")})}m.BlurRadius=ul,m.MediapipeHelper=fe,m.createVonageMediaProcessorConnector=Ct,m.getVonageEventEmitter=kt,m.isSupported=Ut,m.setBackgroundOptions=Tt,m.setTrackExpectedRate=xt,Object.defineProperties(m,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
1
+ (function(Z,K){typeof exports=="object"&&typeof module!="undefined"?K(exports,require("@mediapipe/face_detection"),require("@mediapipe/face_mesh"),require("@mediapipe/hands"),require("@mediapipe/holistic"),require("@mediapipe/objectron"),require("@mediapipe/selfie_segmentation"),require("@mediapipe/pose")):typeof define=="function"&&define.amd?define(["exports","@mediapipe/face_detection","@mediapipe/face_mesh","@mediapipe/hands","@mediapipe/holistic","@mediapipe/objectron","@mediapipe/selfie_segmentation","@mediapipe/pose"],K):(Z=typeof globalThis!="undefined"?globalThis:Z||self,K(Z["ml-transformers"]={},Z.face_detection,Z.face_mesh,Z.hands,Z.holistic,Z.objectron,Z.selfie_segmentation,Z.pose))})(this,function(Z,K,Ye,Ie,Ke,Se,He,Le){"use strict";function Xl(){return new Promise((c,e)=>{typeof MediaStreamTrackProcessor=="undefined"||typeof MediaStreamTrackGenerator=="undefined"?e("Your browser does not support the MediaStreamTrack API for Insertable Streams of Media."):c()})}var Ne={exports:{}},ze=function(e,l){return function(){for(var i=new Array(arguments.length),d=0;d<i.length;d++)i[d]=arguments[d];return e.apply(l,i)}},yl=ze,V=Object.prototype.toString;function de(c){return Array.isArray(c)}function se(c){return typeof c=="undefined"}function Gl(c){return c!==null&&!se(c)&&c.constructor!==null&&!se(c.constructor)&&typeof c.constructor.isBuffer=="function"&&c.constructor.isBuffer(c)}function Fe(c){return V.call(c)==="[object ArrayBuffer]"}function Wl(c){return V.call(c)==="[object FormData]"}function Vl(c){var e;return typeof ArrayBuffer!="undefined"&&ArrayBuffer.isView?e=ArrayBuffer.isView(c):e=c&&c.buffer&&Fe(c.buffer),e}function Rl(c){return typeof c=="string"}function fl(c){return typeof c=="number"}function ge(c){return c!==null&&typeof c=="object"}function w(c){if(V.call(c)!=="[object Object]")return!1;var e=Object.getPrototypeOf(c);return e===null||e===Object.prototype}function Jl(c){return V.call(c)==="[object Date]"}function Yl(c){return V.call(c)==="[object File]"}function Il(c){return V.call(c)==="[object Blob]"}function ve(c){return V.call(c)==="[object Function]"}function Kl(c){return ge(c)&&ve(c.pipe)}function Sl(c){return V.call(c)==="[object URLSearchParams]"}function Hl(c){return c.trim?c.trim():c.replace(/^\s+|\s+$/g,"")}function Ll(){return typeof navigator!="undefined"&&(navigator.product==="ReactNative"||navigator.product==="NativeScript"||navigator.product==="NS")?!1:typeof window!="undefined"&&typeof document!="undefined"}function ae(c,e){if(!(c===null||typeof c=="undefined"))if(typeof c!="object"&&(c=[c]),de(c))for(var l=0,t=c.length;l<t;l++)e.call(null,c[l],l,c);else for(var i in c)Object.prototype.hasOwnProperty.call(c,i)&&e.call(null,c[i],i,c)}function oe(){var c={};function e(i,d){w(c[d])&&w(i)?c[d]=oe(c[d],i):w(i)?c[d]=oe({},i):de(i)?c[d]=i.slice():c[d]=i}for(var l=0,t=arguments.length;l<t;l++)ae(arguments[l],e);return c}function Nl(c,e,l){return ae(e,function(i,d){l&&typeof i=="function"?c[d]=yl(i,l):c[d]=i}),c}function zl(c){return c.charCodeAt(0)===65279&&(c=c.slice(1)),c}var b={isArray:de,isArrayBuffer:Fe,isBuffer:Gl,isFormData:Wl,isArrayBufferView:Vl,isString:Rl,isNumber:fl,isObject:ge,isPlainObject:w,isUndefined:se,isDate:Jl,isFile:Yl,isBlob:Il,isFunction:ve,isStream:Kl,isURLSearchParams:Sl,isStandardBrowserEnv:Ll,forEach:ae,merge:oe,extend:Nl,trim:Hl,stripBOM:zl},S=b;function Ue(c){return encodeURIComponent(c).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}var ke=function(e,l,t){if(!l)return e;var i;if(t)i=t(l);else if(S.isURLSearchParams(l))i=l.toString();else{var d=[];S.forEach(l,function(o,h){o===null||typeof o=="undefined"||(S.isArray(o)?h=h+"[]":o=[o],S.forEach(o,function(r){S.isDate(r)?r=r.toISOString():S.isObject(r)&&(r=JSON.stringify(r)),d.push(Ue(h)+"="+Ue(r))}))}),i=d.join("&")}if(i){var n=e.indexOf("#");n!==-1&&(e=e.slice(0,n)),e+=(e.indexOf("?")===-1?"?":"&")+i}return e},Fl=b;function P(){this.handlers=[]}P.prototype.use=function(e,l,t){return this.handlers.push({fulfilled:e,rejected:l,synchronous:t?t.synchronous:!1,runWhen:t?t.runWhen:null}),this.handlers.length-1},P.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},P.prototype.forEach=function(e){Fl.forEach(this.handlers,function(t){t!==null&&e(t)})};var gl=P,vl=b,Ul=function(e,l){vl.forEach(e,function(i,d){d!==l&&d.toUpperCase()===l.toUpperCase()&&(e[l]=i,delete e[d])})},xe=function(e,l,t,i,d){return e.config=l,t&&(e.code=t),e.request=i,e.response=d,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code,status:this.response&&this.response.status?this.response.status:null}},e},kl=xe,Ce=function(e,l,t,i,d){var n=new Error(e);return kl(n,l,t,i,d)},xl=Ce,Cl=function(e,l,t){var i=t.config.validateStatus;!t.status||!i||i(t.status)?e(t):l(xl("Request failed with status code "+t.status,t.config,null,t.request,t))},Q=b,Tl=Q.isStandardBrowserEnv()?function(){return{write:function(l,t,i,d,n,s){var o=[];o.push(l+"="+encodeURIComponent(t)),Q.isNumber(i)&&o.push("expires="+new Date(i).toGMTString()),Q.isString(d)&&o.push("path="+d),Q.isString(n)&&o.push("domain="+n),s===!0&&o.push("secure"),document.cookie=o.join("; ")},read:function(l){var t=document.cookie.match(new RegExp("(^|;\\s*)("+l+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(l){this.write(l,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}(),Bl=function(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)},wl=function(e,l){return l?e.replace(/\/+$/,"")+"/"+l.replace(/^\/+/,""):e},Pl=Bl,Ql=wl,Ml=function(e,l){return e&&!Pl(l)?Ql(e,l):l},re=b,jl=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"],El=function(e){var l={},t,i,d;return e&&re.forEach(e.split(`
2
+ `),function(s){if(d=s.indexOf(":"),t=re.trim(s.substr(0,d)).toLowerCase(),i=re.trim(s.substr(d+1)),t){if(l[t]&&jl.indexOf(t)>=0)return;t==="set-cookie"?l[t]=(l[t]?l[t]:[]).concat([i]):l[t]=l[t]?l[t]+", "+i:i}}),l},Te=b,Ol=Te.isStandardBrowserEnv()?function(){var e=/(msie|trident)/i.test(navigator.userAgent),l=document.createElement("a"),t;function i(d){var n=d;return e&&(l.setAttribute("href",n),n=l.href),l.setAttribute("href",n),{href:l.href,protocol:l.protocol?l.protocol.replace(/:$/,""):"",host:l.host,search:l.search?l.search.replace(/^\?/,""):"",hash:l.hash?l.hash.replace(/^#/,""):"",hostname:l.hostname,port:l.port,pathname:l.pathname.charAt(0)==="/"?l.pathname:"/"+l.pathname}}return t=i(window.location.href),function(n){var s=Te.isString(n)?i(n):n;return s.protocol===t.protocol&&s.host===t.host}}():function(){return function(){return!0}}();function Ze(c){this.message=c}Ze.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},Ze.prototype.__CANCEL__=!0;var M=Ze,j=b,Dl=Cl,Al=Tl,_l=ke,$l=Ml,ql=El,et=Ol,me=Ce,lt=O,tt=M,Be=function(e){return new Promise(function(t,i){var d=e.data,n=e.headers,s=e.responseType,o;function h(){e.cancelToken&&e.cancelToken.unsubscribe(o),e.signal&&e.signal.removeEventListener("abort",o)}j.isFormData(d)&&delete n["Content-Type"];var a=new XMLHttpRequest;if(e.auth){var r=e.auth.username||"",G=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";n.Authorization="Basic "+btoa(r+":"+G)}var u=$l(e.baseURL,e.url);a.open(e.method.toUpperCase(),_l(u,e.params,e.paramsSerializer),!0),a.timeout=e.timeout;function pl(){if(!!a){var X="getAllResponseHeaders"in a?ql(a.getAllResponseHeaders()):null,U=!s||s==="text"||s==="json"?a.responseText:a.response,I={data:U,status:a.status,statusText:a.statusText,headers:X,config:e,request:a};Dl(function(Je){t(Je),h()},function(Je){i(Je),h()},I),a=null}}if("onloadend"in a?a.onloadend=pl:a.onreadystatechange=function(){!a||a.readyState!==4||a.status===0&&!(a.responseURL&&a.responseURL.indexOf("file:")===0)||setTimeout(pl)},a.onabort=function(){!a||(i(me("Request aborted",e,"ECONNABORTED",a)),a=null)},a.onerror=function(){i(me("Network Error",e,null,a)),a=null},a.ontimeout=function(){var U=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded",I=e.transitional||lt.transitional;e.timeoutErrorMessage&&(U=e.timeoutErrorMessage),i(me(U,e,I.clarifyTimeoutError?"ETIMEDOUT":"ECONNABORTED",a)),a=null},j.isStandardBrowserEnv()){var hl=(e.withCredentials||et(u))&&e.xsrfCookieName?Al.read(e.xsrfCookieName):void 0;hl&&(n[e.xsrfHeaderName]=hl)}"setRequestHeader"in a&&j.forEach(n,function(U,I){typeof d=="undefined"&&I.toLowerCase()==="content-type"?delete n[I]:a.setRequestHeader(I,U)}),j.isUndefined(e.withCredentials)||(a.withCredentials=!!e.withCredentials),s&&s!=="json"&&(a.responseType=e.responseType),typeof e.onDownloadProgress=="function"&&a.addEventListener("progress",e.onDownloadProgress),typeof e.onUploadProgress=="function"&&a.upload&&a.upload.addEventListener("progress",e.onUploadProgress),(e.cancelToken||e.signal)&&(o=function(X){!a||(i(!X||X&&X.type?new tt("canceled"):X),a.abort(),a=null)},e.cancelToken&&e.cancelToken.subscribe(o),e.signal&&(e.signal.aborted?o():e.signal.addEventListener("abort",o))),d||(d=null),a.send(d)})},m=b,we=Ul,ct=xe,it={"Content-Type":"application/x-www-form-urlencoded"};function Pe(c,e){!m.isUndefined(c)&&m.isUndefined(c["Content-Type"])&&(c["Content-Type"]=e)}function nt(){var c;return(typeof XMLHttpRequest!="undefined"||typeof process!="undefined"&&Object.prototype.toString.call(process)==="[object process]")&&(c=Be),c}function dt(c,e,l){if(m.isString(c))try{return(e||JSON.parse)(c),m.trim(c)}catch(t){if(t.name!=="SyntaxError")throw t}return(l||JSON.stringify)(c)}var E={transitional:{silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},adapter:nt(),transformRequest:[function(e,l){return we(l,"Accept"),we(l,"Content-Type"),m.isFormData(e)||m.isArrayBuffer(e)||m.isBuffer(e)||m.isStream(e)||m.isFile(e)||m.isBlob(e)?e:m.isArrayBufferView(e)?e.buffer:m.isURLSearchParams(e)?(Pe(l,"application/x-www-form-urlencoded;charset=utf-8"),e.toString()):m.isObject(e)||l&&l["Content-Type"]==="application/json"?(Pe(l,"application/json"),dt(e)):e}],transformResponse:[function(e){var l=this.transitional||E.transitional,t=l&&l.silentJSONParsing,i=l&&l.forcedJSONParsing,d=!t&&this.responseType==="json";if(d||i&&m.isString(e)&&e.length)try{return JSON.parse(e)}catch(n){if(d)throw n.name==="SyntaxError"?ct(n,this,"E_JSON_PARSE"):n}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};m.forEach(["delete","get","head"],function(e){E.headers[e]={}}),m.forEach(["post","put","patch"],function(e){E.headers[e]=m.merge(it)});var O=E,st=b,at=O,ot=function(e,l,t){var i=this||at;return st.forEach(t,function(n){e=n.call(i,e,l)}),e},Qe=function(e){return!!(e&&e.__CANCEL__)},Me=b,be=ot,rt=Qe,Zt=O,mt=M;function ue(c){if(c.cancelToken&&c.cancelToken.throwIfRequested(),c.signal&&c.signal.aborted)throw new mt("canceled")}var bt=function(e){ue(e),e.headers=e.headers||{},e.data=be.call(e,e.data,e.headers,e.transformRequest),e.headers=Me.merge(e.headers.common||{},e.headers[e.method]||{},e.headers),Me.forEach(["delete","get","head","post","put","patch","common"],function(i){delete e.headers[i]});var l=e.adapter||Zt.adapter;return l(e).then(function(i){return ue(e),i.data=be.call(e,i.data,i.headers,e.transformResponse),i},function(i){return rt(i)||(ue(e),i&&i.response&&(i.response.data=be.call(e,i.response.data,i.response.headers,e.transformResponse))),Promise.reject(i)})},p=b,je=function(e,l){l=l||{};var t={};function i(a,r){return p.isPlainObject(a)&&p.isPlainObject(r)?p.merge(a,r):p.isPlainObject(r)?p.merge({},r):p.isArray(r)?r.slice():r}function d(a){if(p.isUndefined(l[a])){if(!p.isUndefined(e[a]))return i(void 0,e[a])}else return i(e[a],l[a])}function n(a){if(!p.isUndefined(l[a]))return i(void 0,l[a])}function s(a){if(p.isUndefined(l[a])){if(!p.isUndefined(e[a]))return i(void 0,e[a])}else return i(void 0,l[a])}function o(a){if(a in l)return i(e[a],l[a]);if(a in e)return i(void 0,e[a])}var h={url:n,method:n,data:n,baseURL:s,transformRequest:s,transformResponse:s,paramsSerializer:s,timeout:s,timeoutMessage:s,withCredentials:s,adapter:s,responseType:s,xsrfCookieName:s,xsrfHeaderName:s,onUploadProgress:s,onDownloadProgress:s,decompress:s,maxContentLength:s,maxBodyLength:s,transport:s,httpAgent:s,httpsAgent:s,cancelToken:s,socketPath:s,responseEncoding:s,validateStatus:o};return p.forEach(Object.keys(e).concat(Object.keys(l)),function(r){var G=h[r]||d,u=G(r);p.isUndefined(u)&&G!==o||(t[r]=u)}),t},Ee={version:"0.25.0"},ut=Ee.version,pe={};["object","boolean","number","function","string","symbol"].forEach(function(c,e){pe[c]=function(t){return typeof t===c||"a"+(e<1?"n ":" ")+c}});var Oe={};pe.transitional=function(e,l,t){function i(d,n){return"[Axios v"+ut+"] Transitional option '"+d+"'"+n+(t?". "+t:"")}return function(d,n,s){if(e===!1)throw new Error(i(n," has been removed"+(l?" in "+l:"")));return l&&!Oe[n]&&(Oe[n]=!0,console.warn(i(n," has been deprecated since v"+l+" and will be removed in the near future"))),e?e(d,n,s):!0}};function pt(c,e,l){if(typeof c!="object")throw new TypeError("options must be an object");for(var t=Object.keys(c),i=t.length;i-- >0;){var d=t[i],n=e[d];if(n){var s=c[d],o=s===void 0||n(s,d,c);if(o!==!0)throw new TypeError("option "+d+" must be "+o);continue}if(l!==!0)throw Error("Unknown option "+d)}}var ht={assertOptions:pt,validators:pe},De=b,Xt=ke,Ae=gl,_e=bt,D=je,$e=ht,H=$e.validators;function k(c){this.defaults=c,this.interceptors={request:new Ae,response:new Ae}}k.prototype.request=function(e,l){if(typeof e=="string"?(l=l||{},l.url=e):l=e||{},!l.url)throw new Error("Provided config url is not valid");l=D(this.defaults,l),l.method?l.method=l.method.toLowerCase():this.defaults.method?l.method=this.defaults.method.toLowerCase():l.method="get";var t=l.transitional;t!==void 0&&$e.assertOptions(t,{silentJSONParsing:H.transitional(H.boolean),forcedJSONParsing:H.transitional(H.boolean),clarifyTimeoutError:H.transitional(H.boolean)},!1);var i=[],d=!0;this.interceptors.request.forEach(function(u){typeof u.runWhen=="function"&&u.runWhen(l)===!1||(d=d&&u.synchronous,i.unshift(u.fulfilled,u.rejected))});var n=[];this.interceptors.response.forEach(function(u){n.push(u.fulfilled,u.rejected)});var s;if(!d){var o=[_e,void 0];for(Array.prototype.unshift.apply(o,i),o=o.concat(n),s=Promise.resolve(l);o.length;)s=s.then(o.shift(),o.shift());return s}for(var h=l;i.length;){var a=i.shift(),r=i.shift();try{h=a(h)}catch(G){r(G);break}}try{s=_e(h)}catch(G){return Promise.reject(G)}for(;n.length;)s=s.then(n.shift(),n.shift());return s},k.prototype.getUri=function(e){if(!e.url)throw new Error("Provided config url is not valid");return e=D(this.defaults,e),Xt(e.url,e.params,e.paramsSerializer).replace(/^\?/,"")},De.forEach(["delete","get","head","options"],function(e){k.prototype[e]=function(l,t){return this.request(D(t||{},{method:e,url:l,data:(t||{}).data}))}}),De.forEach(["post","put","patch"],function(e){k.prototype[e]=function(l,t,i){return this.request(D(i||{},{method:e,url:l,data:t}))}});var yt=k,Gt=M;function L(c){if(typeof c!="function")throw new TypeError("executor must be a function.");var e;this.promise=new Promise(function(i){e=i});var l=this;this.promise.then(function(t){if(!!l._listeners){var i,d=l._listeners.length;for(i=0;i<d;i++)l._listeners[i](t);l._listeners=null}}),this.promise.then=function(t){var i,d=new Promise(function(n){l.subscribe(n),i=n}).then(t);return d.cancel=function(){l.unsubscribe(i)},d},c(function(i){l.reason||(l.reason=new Gt(i),e(l.reason))})}L.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},L.prototype.subscribe=function(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]},L.prototype.unsubscribe=function(e){if(!!this._listeners){var l=this._listeners.indexOf(e);l!==-1&&this._listeners.splice(l,1)}},L.source=function(){var e,l=new L(function(i){e=i});return{token:l,cancel:e}};var Wt=L,Vt=function(e){return function(t){return e.apply(null,t)}},Rt=b,ft=function(e){return Rt.isObject(e)&&e.isAxiosError===!0},qe=b,Jt=ze,A=yt,Yt=je,It=O;function el(c){var e=new A(c),l=Jt(A.prototype.request,e);return qe.extend(l,A.prototype,e),qe.extend(l,e),l.create=function(i){return el(Yt(c,i))},l}var y=el(It);y.Axios=A,y.Cancel=M,y.CancelToken=Wt,y.isCancel=Qe,y.VERSION=Ee.version,y.all=function(e){return Promise.all(e)},y.spread=Vt,y.isAxiosError=ft,Ne.exports=y,Ne.exports.default=y;function Kt(){return globalThis._vonageMediaProcessorMetadata}for(var St=[],he=0;he<256;++he)St.push((he+256).toString(16).substr(1));const R=new WeakMap,_=new WeakMap,x=new WeakMap,Xe=Symbol("anyProducer"),ll=Promise.resolve(),$=Symbol("listenerAdded"),q=Symbol("listenerRemoved");let ye=!1;function N(c){if(typeof c!="string"&&typeof c!="symbol")throw new TypeError("eventName must be a string or a symbol")}function ee(c){if(typeof c!="function")throw new TypeError("listener must be a function")}function z(c,e){const l=_.get(c);return l.has(e)||l.set(e,new Set),l.get(e)}function C(c,e){const l=typeof e=="string"||typeof e=="symbol"?e:Xe,t=x.get(c);return t.has(l)||t.set(l,new Set),t.get(l)}function Ht(c,e,l){const t=x.get(c);if(t.has(e))for(const i of t.get(e))i.enqueue(l);if(t.has(Xe)){const i=Promise.all([e,l]);for(const d of t.get(Xe))d.enqueue(i)}}function tl(c,e){e=Array.isArray(e)?e:[e];let l=!1,t=()=>{},i=[];const d={enqueue(n){i.push(n),t()},finish(){l=!0,t()}};for(const n of e)C(c,n).add(d);return{async next(){return i?i.length===0?l?(i=void 0,this.next()):(await new Promise(n=>{t=n}),this.next()):{done:!1,value:await i.shift()}:{done:!0}},async return(n){i=void 0;for(const s of e)C(c,s).delete(d);return t(),arguments.length>0?{done:!0,value:await n}:{done:!0}},[Symbol.asyncIterator](){return this}}}function cl(c){if(c===void 0)return il;if(!Array.isArray(c))throw new TypeError("`methodNames` must be an array of strings");for(const e of c)if(!il.includes(e))throw typeof e!="string"?new TypeError("`methodNames` element must be a string"):new Error(`${e} is not Emittery method`);return c}const Ge=c=>c===$||c===q;class F{static mixin(e,l){return l=cl(l),t=>{if(typeof t!="function")throw new TypeError("`target` must be function");for(const n of l)if(t.prototype[n]!==void 0)throw new Error(`The property \`${n}\` already exists on \`target\``);function i(){return Object.defineProperty(this,e,{enumerable:!1,value:new F}),this[e]}Object.defineProperty(t.prototype,e,{enumerable:!1,get:i});const d=n=>function(...s){return this[e][n](...s)};for(const n of l)Object.defineProperty(t.prototype,n,{enumerable:!1,value:d(n)});return t}}static get isDebugEnabled(){if(typeof process!="object")return ye;const{env:e}=process||{env:{}};return e.DEBUG==="emittery"||e.DEBUG==="*"||ye}static set isDebugEnabled(e){ye=e}constructor(e={}){R.set(this,new Set),_.set(this,new Map),x.set(this,new Map),this.debug=e.debug||{},this.debug.enabled===void 0&&(this.debug.enabled=!1),this.debug.logger||(this.debug.logger=(l,t,i,d)=>{d=JSON.stringify(d),typeof i=="symbol"&&(i=i.toString());const n=new Date,s=`${n.getHours()}:${n.getMinutes()}:${n.getSeconds()}.${n.getMilliseconds()}`;console.log(`[${s}][emittery:${l}][${t}] Event Name: ${i}
3
+ data: ${d}`)})}logIfDebugEnabled(e,l,t){(F.isDebugEnabled||this.debug.enabled)&&this.debug.logger(e,this.debug.name,l,t)}on(e,l){ee(l),e=Array.isArray(e)?e:[e];for(const t of e)N(t),z(this,t).add(l),this.logIfDebugEnabled("subscribe",t,void 0),Ge(t)||this.emit($,{eventName:t,listener:l});return this.off.bind(this,e,l)}off(e,l){ee(l),e=Array.isArray(e)?e:[e];for(const t of e)N(t),z(this,t).delete(l),this.logIfDebugEnabled("unsubscribe",t,void 0),Ge(t)||this.emit(q,{eventName:t,listener:l})}once(e){return new Promise(l=>{const t=this.on(e,i=>{t(),l(i)})})}events(e){e=Array.isArray(e)?e:[e];for(const l of e)N(l);return tl(this,e)}async emit(e,l){N(e),this.logIfDebugEnabled("emit",e,l),Ht(this,e,l);const t=z(this,e),i=R.get(this),d=[...t],n=Ge(e)?[]:[...i];await ll,await Promise.all([...d.map(async s=>{if(t.has(s))return s(l)}),...n.map(async s=>{if(i.has(s))return s(e,l)})])}async emitSerial(e,l){N(e),this.logIfDebugEnabled("emitSerial",e,l);const t=z(this,e),i=R.get(this),d=[...t],n=[...i];await ll;for(const s of d)t.has(s)&&await s(l);for(const s of n)i.has(s)&&await s(e,l)}onAny(e){return ee(e),this.logIfDebugEnabled("subscribeAny",void 0,void 0),R.get(this).add(e),this.emit($,{listener:e}),this.offAny.bind(this,e)}anyEvent(){return tl(this)}offAny(e){ee(e),this.logIfDebugEnabled("unsubscribeAny",void 0,void 0),this.emit(q,{listener:e}),R.get(this).delete(e)}clearListeners(e){e=Array.isArray(e)?e:[e];for(const l of e)if(this.logIfDebugEnabled("clear",l,void 0),typeof l=="string"||typeof l=="symbol"){z(this,l).clear();const t=C(this,l);for(const i of t)i.finish();t.clear()}else{R.get(this).clear();for(const t of _.get(this).values())t.clear();for(const t of x.get(this).values()){for(const i of t)i.finish();t.clear()}}}listenerCount(e){e=Array.isArray(e)?e:[e];let l=0;for(const t of e){if(typeof t=="string"){l+=R.get(this).size+z(this,t).size+C(this,t).size+C(this).size;continue}typeof t!="undefined"&&N(t),l+=R.get(this).size;for(const i of _.get(this).values())l+=i.size;for(const i of x.get(this).values())l+=i.size}return l}bindMethods(e,l){if(typeof e!="object"||e===null)throw new TypeError("`target` must be an object");l=cl(l);for(const t of l){if(e[t]!==void 0)throw new Error(`The property \`${t}\` already exists on \`target\``);Object.defineProperty(e,t,{enumerable:!1,value:this[t].bind(this)})}}}const il=Object.getOwnPropertyNames(F.prototype).filter(c=>c!=="constructor");Object.defineProperty(F,"listenerAdded",{value:$,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(F,"listenerRemoved",{value:q,writable:!1,enumerable:!0,configurable:!1});var nl;(function(c){c.FPS_DROP="fps_drop"})(nl||(nl={}));class Lt{constructor(){this.processor_=null,this.generator_=null}init(e){return new Promise((l,t)=>{try{this.processor_=new MediaStreamTrackProcessor(e)}catch(i){console.log(`[InsertableStreamHelper] MediaStreamTrackProcessor failed: ${i}`),t(i)}try{e.kind==="audio"?this.generator_=new MediaStreamTrackGenerator({kind:"audio"}):e.kind==="video"?this.generator_=new MediaStreamTrackGenerator({kind:"video"}):t("kind not supported")}catch(i){console.log(`[InsertableStreamHelper] MediaStreamTrackGenerator failed: ${i}`),t(i)}l()})}getReadable(){return this.processor_.readable}getWriteable(){return this.generator_.writable}getProccesorTrack(){return this.generator_}}class Nt{constructor(e){this.insertableStreamHelper_=new Lt,this.mediaProcessor_=e}setTrack(e){return new Promise((l,t)=>{this.insertableStreamHelper_.init(e).then(()=>{this.mediaProcessor_.transform(this.insertableStreamHelper_.getReadable(),this.insertableStreamHelper_.getWriteable()).then(()=>{l(this.insertableStreamHelper_.getProccesorTrack())}).catch(i=>{t(i)})}).catch(i=>{t(i)})})}destroy(){return new Promise((e,l)=>{this.mediaProcessor_?this.mediaProcessor_.destroy().then(()=>{e()}).catch(t=>{l(t)}):l("no processor")})}}const dl="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NsYXNzIFB7fVAudXBkYXRlcz17dHJhbnNmb3JtZXJfbmV3OiJOZXcgdHJhbnNmb3JtZXIiLHRyYW5zZm9ybWVyX251bGw6Ik51bGwgdHJhbnNmb3JtZXIifSxQLmVycm9ycz17dHJhbnNmb3JtZXJfbm9uZToiTm8gdHJhbnNmb3JtZXJzIHByb3ZpZGVkIix0cmFuc2Zvcm1lcl9zdGFydDoiQ2Fubm90IHN0YXJ0IHRyYW5zZm9ybWVyIix0cmFuc2Zvcm1lcl90cmFuc2Zvcm06IkNhbm5vdCB0cmFuc2Zvcm0gZnJhbWUiLHRyYW5zZm9ybWVyX2ZsdXNoOiJDYW5ub3QgZmx1c2ggdHJhbnNmb3JtZXIiLHJlYWRhYmxlX251bGw6IlJlYWRhYmxlIGlzIG51bGwiLHdyaXRhYmxlX251bGw6IldyaXRhYmxlIGlzIG51bGwifTt2YXIgZWU9e2V4cG9ydHM6e319LEVlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBuPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSxvPTA7bzxuLmxlbmd0aDtvKyspbltvXT1hcmd1bWVudHNbb107cmV0dXJuIGUuYXBwbHkodCxuKX19LHJ0PUVlLFI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiB0ZShyKXtyZXR1cm4gQXJyYXkuaXNBcnJheShyKX1mdW5jdGlvbiByZShyKXtyZXR1cm4gdHlwZW9mIHI9PSJ1bmRlZmluZWQifWZ1bmN0aW9uIHN0KHIpe3JldHVybiByIT09bnVsbCYmIXJlKHIpJiZyLmNvbnN0cnVjdG9yIT09bnVsbCYmIXJlKHIuY29uc3RydWN0b3IpJiZ0eXBlb2Ygci5jb25zdHJ1Y3Rvci5pc0J1ZmZlcj09ImZ1bmN0aW9uIiYmci5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihyKX1mdW5jdGlvbiBUZShyKXtyZXR1cm4gUi5jYWxsKHIpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIn1mdW5jdGlvbiBudChyKXtyZXR1cm4gUi5jYWxsKHIpPT09IltvYmplY3QgRm9ybURhdGFdIn1mdW5jdGlvbiBpdChyKXt2YXIgZTtyZXR1cm4gdHlwZW9mIEFycmF5QnVmZmVyIT0idW5kZWZpbmVkIiYmQXJyYXlCdWZmZXIuaXNWaWV3P2U9QXJyYXlCdWZmZXIuaXNWaWV3KHIpOmU9ciYmci5idWZmZXImJlRlKHIuYnVmZmVyKSxlfWZ1bmN0aW9uIG90KHIpe3JldHVybiB0eXBlb2Ygcj09InN0cmluZyJ9ZnVuY3Rpb24gYXQocil7cmV0dXJuIHR5cGVvZiByPT0ibnVtYmVyIn1mdW5jdGlvbiBQZShyKXtyZXR1cm4gciE9PW51bGwmJnR5cGVvZiByPT0ib2JqZWN0In1mdW5jdGlvbiBEKHIpe2lmKFIuY2FsbChyKSE9PSJbb2JqZWN0IE9iamVjdF0iKXJldHVybiExO3ZhciBlPU9iamVjdC5nZXRQcm90b3R5cGVPZihyKTtyZXR1cm4gZT09PW51bGx8fGU9PT1PYmplY3QucHJvdG90eXBlfWZ1bmN0aW9uIHV0KHIpe3JldHVybiBSLmNhbGwocik9PT0iW29iamVjdCBEYXRlXSJ9ZnVuY3Rpb24gbHQocil7cmV0dXJuIFIuY2FsbChyKT09PSJbb2JqZWN0IEZpbGVdIn1mdW5jdGlvbiBjdChyKXtyZXR1cm4gUi5jYWxsKHIpPT09IltvYmplY3QgQmxvYl0ifWZ1bmN0aW9uIFJlKHIpe3JldHVybiBSLmNhbGwocik9PT0iW29iamVjdCBGdW5jdGlvbl0ifWZ1bmN0aW9uIGZ0KHIpe3JldHVybiBQZShyKSYmUmUoci5waXBlKX1mdW5jdGlvbiBodChyKXtyZXR1cm4gUi5jYWxsKHIpPT09IltvYmplY3QgVVJMU2VhcmNoUGFyYW1zXSJ9ZnVuY3Rpb24gZHQocil7cmV0dXJuIHIudHJpbT9yLnRyaW0oKTpyLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX1mdW5jdGlvbiBwdCgpe3JldHVybiB0eXBlb2YgbmF2aWdhdG9yIT0idW5kZWZpbmVkIiYmKG5hdmlnYXRvci5wcm9kdWN0PT09IlJlYWN0TmF0aXZlInx8bmF2aWdhdG9yLnByb2R1Y3Q9PT0iTmF0aXZlU2NyaXB0Inx8bmF2aWdhdG9yLnByb2R1Y3Q9PT0iTlMiKT8hMTp0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmdHlwZW9mIGRvY3VtZW50IT0idW5kZWZpbmVkIn1mdW5jdGlvbiBzZShyLGUpe2lmKCEocj09PW51bGx8fHR5cGVvZiByPT0idW5kZWZpbmVkIikpaWYodHlwZW9mIHIhPSJvYmplY3QiJiYocj1bcl0pLHRlKHIpKWZvcih2YXIgdD0wLHM9ci5sZW5ndGg7dDxzO3QrKyllLmNhbGwobnVsbCxyW3RdLHQscik7ZWxzZSBmb3IodmFyIG4gaW4gcilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocixuKSYmZS5jYWxsKG51bGwscltuXSxuLHIpfWZ1bmN0aW9uIG5lKCl7dmFyIHI9e307ZnVuY3Rpb24gZShuLG8pe0QocltvXSkmJkQobik/cltvXT1uZShyW29dLG4pOkQobik/cltvXT1uZSh7fSxuKTp0ZShuKT9yW29dPW4uc2xpY2UoKTpyW29dPW59Zm9yKHZhciB0PTAscz1hcmd1bWVudHMubGVuZ3RoO3Q8czt0Kyspc2UoYXJndW1lbnRzW3RdLGUpO3JldHVybiByfWZ1bmN0aW9uIG10KHIsZSx0KXtyZXR1cm4gc2UoZSxmdW5jdGlvbihuLG8pe3QmJnR5cGVvZiBuPT0iZnVuY3Rpb24iP3Jbb109cnQobix0KTpyW29dPW59KSxyfWZ1bmN0aW9uIGd0KHIpe3JldHVybiByLmNoYXJDb2RlQXQoMCk9PT02NTI3OSYmKHI9ci5zbGljZSgxKSkscn12YXIgcD17aXNBcnJheTp0ZSxpc0FycmF5QnVmZmVyOlRlLGlzQnVmZmVyOnN0LGlzRm9ybURhdGE6bnQsaXNBcnJheUJ1ZmZlclZpZXc6aXQsaXNTdHJpbmc6b3QsaXNOdW1iZXI6YXQsaXNPYmplY3Q6UGUsaXNQbGFpbk9iamVjdDpELGlzVW5kZWZpbmVkOnJlLGlzRGF0ZTp1dCxpc0ZpbGU6bHQsaXNCbG9iOmN0LGlzRnVuY3Rpb246UmUsaXNTdHJlYW06ZnQsaXNVUkxTZWFyY2hQYXJhbXM6aHQsaXNTdGFuZGFyZEJyb3dzZXJFbnY6cHQsZm9yRWFjaDpzZSxtZXJnZTpuZSxleHRlbmQ6bXQsdHJpbTpkdCxzdHJpcEJPTTpndH0sST1wO2Z1bmN0aW9uIFNlKHIpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQocikucmVwbGFjZSgvJTNBL2dpLCI6IikucmVwbGFjZSgvJTI0L2csIiQiKS5yZXBsYWNlKC8lMkMvZ2ksIiwiKS5yZXBsYWNlKC8lMjAvZywiKyIpLnJlcGxhY2UoLyU1Qi9naSwiWyIpLnJlcGxhY2UoLyU1RC9naSwiXSIpfXZhciBDZT1mdW5jdGlvbihlLHQscyl7aWYoIXQpcmV0dXJuIGU7dmFyIG47aWYocyluPXModCk7ZWxzZSBpZihJLmlzVVJMU2VhcmNoUGFyYW1zKHQpKW49dC50b1N0cmluZygpO2Vsc2V7dmFyIG89W107SS5mb3JFYWNoKHQsZnVuY3Rpb24obCxtKXtsPT09bnVsbHx8dHlwZW9mIGw9PSJ1bmRlZmluZWQifHwoSS5pc0FycmF5KGwpP209bSsiW10iOmw9W2xdLEkuZm9yRWFjaChsLGZ1bmN0aW9uKGYpe0kuaXNEYXRlKGYpP2Y9Zi50b0lTT1N0cmluZygpOkkuaXNPYmplY3QoZikmJihmPUpTT04uc3RyaW5naWZ5KGYpKSxvLnB1c2goU2UobSkrIj0iK1NlKGYpKX0pKX0pLG49by5qb2luKCImIil9aWYobil7dmFyIGk9ZS5pbmRleE9mKCIjIik7aSE9PS0xJiYoZT1lLnNsaWNlKDAsaSkpLGUrPShlLmluZGV4T2YoIj8iKT09PS0xPyI/IjoiJiIpK259cmV0dXJuIGV9LHl0PXA7ZnVuY3Rpb24gcSgpe3RoaXMuaGFuZGxlcnM9W119cS5wcm90b3R5cGUudXNlPWZ1bmN0aW9uKGUsdCxzKXtyZXR1cm4gdGhpcy5oYW5kbGVycy5wdXNoKHtmdWxmaWxsZWQ6ZSxyZWplY3RlZDp0LHN5bmNocm9ub3VzOnM/cy5zeW5jaHJvbm91czohMSxydW5XaGVuOnM/cy5ydW5XaGVuOm51bGx9KSx0aGlzLmhhbmRsZXJzLmxlbmd0aC0xfSxxLnByb3RvdHlwZS5lamVjdD1mdW5jdGlvbihlKXt0aGlzLmhhbmRsZXJzW2VdJiYodGhpcy5oYW5kbGVyc1tlXT1udWxsKX0scS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihlKXt5dC5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsZnVuY3Rpb24ocyl7cyE9PW51bGwmJmUocyl9KX07dmFyIF90PXEsYnQ9cCx3dD1mdW5jdGlvbihlLHQpe2J0LmZvckVhY2goZSxmdW5jdGlvbihuLG8pe28hPT10JiZvLnRvVXBwZXJDYXNlKCk9PT10LnRvVXBwZXJDYXNlKCkmJihlW3RdPW4sZGVsZXRlIGVbb10pfSl9LE9lPWZ1bmN0aW9uKGUsdCxzLG4sbyl7cmV0dXJuIGUuY29uZmlnPXQscyYmKGUuY29kZT1zKSxlLnJlcXVlc3Q9bixlLnJlc3BvbnNlPW8sZS5pc0F4aW9zRXJyb3I9ITAsZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57bWVzc2FnZTp0aGlzLm1lc3NhZ2UsbmFtZTp0aGlzLm5hbWUsZGVzY3JpcHRpb246dGhpcy5kZXNjcmlwdGlvbixudW1iZXI6dGhpcy5udW1iZXIsZmlsZU5hbWU6dGhpcy5maWxlTmFtZSxsaW5lTnVtYmVyOnRoaXMubGluZU51bWJlcixjb2x1bW5OdW1iZXI6dGhpcy5jb2x1bW5OdW1iZXIsc3RhY2s6dGhpcy5zdGFjayxjb25maWc6dGhpcy5jb25maWcsY29kZTp0aGlzLmNvZGUsc3RhdHVzOnRoaXMucmVzcG9uc2UmJnRoaXMucmVzcG9uc2Uuc3RhdHVzP3RoaXMucmVzcG9uc2Uuc3RhdHVzOm51bGx9fSxlfSx2dD1PZSxJZT1mdW5jdGlvbihlLHQscyxuLG8pe3ZhciBpPW5ldyBFcnJvcihlKTtyZXR1cm4gdnQoaSx0LHMsbixvKX0sRXQ9SWUsVHQ9ZnVuY3Rpb24oZSx0LHMpe3ZhciBuPXMuY29uZmlnLnZhbGlkYXRlU3RhdHVzOyFzLnN0YXR1c3x8IW58fG4ocy5zdGF0dXMpP2Uocyk6dChFdCgiUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAiK3Muc3RhdHVzLHMuY29uZmlnLG51bGwscy5yZXF1ZXN0LHMpKX0sSD1wLFB0PUguaXNTdGFuZGFyZEJyb3dzZXJFbnYoKT9mdW5jdGlvbigpe3JldHVybnt3cml0ZTpmdW5jdGlvbih0LHMsbixvLGksYSl7dmFyIGw9W107bC5wdXNoKHQrIj0iK2VuY29kZVVSSUNvbXBvbmVudChzKSksSC5pc051bWJlcihuKSYmbC5wdXNoKCJleHBpcmVzPSIrbmV3IERhdGUobikudG9HTVRTdHJpbmcoKSksSC5pc1N0cmluZyhvKSYmbC5wdXNoKCJwYXRoPSIrbyksSC5pc1N0cmluZyhpKSYmbC5wdXNoKCJkb21haW49IitpKSxhPT09ITAmJmwucHVzaCgic2VjdXJlIiksZG9jdW1lbnQuY29va2llPWwuam9pbigiOyAiKX0scmVhZDpmdW5jdGlvbih0KXt2YXIgcz1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58O1xccyopKCIrdCsiKT0oW147XSopIikpO3JldHVybiBzP2RlY29kZVVSSUNvbXBvbmVudChzWzNdKTpudWxsfSxyZW1vdmU6ZnVuY3Rpb24odCl7dGhpcy53cml0ZSh0LCIiLERhdGUubm93KCktODY0ZTUpfX19KCk6ZnVuY3Rpb24oKXtyZXR1cm57d3JpdGU6ZnVuY3Rpb24oKXt9LHJlYWQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0scmVtb3ZlOmZ1bmN0aW9uKCl7fX19KCksUnQ9ZnVuY3Rpb24oZSl7cmV0dXJuL14oW2Etel1bYS16XGQrXC0uXSo6KT9cL1wvL2kudGVzdChlKX0sU3Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD9lLnJlcGxhY2UoL1wvKyQvLCIiKSsiLyIrdC5yZXBsYWNlKC9eXC8rLywiIik6ZX0sQ3Q9UnQsT3Q9U3QsSXQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmIUN0KHQpP090KGUsdCk6dH0saWU9cCx4dD1bImFnZSIsImF1dGhvcml6YXRpb24iLCJjb250ZW50LWxlbmd0aCIsImNvbnRlbnQtdHlwZSIsImV0YWciLCJleHBpcmVzIiwiZnJvbSIsImhvc3QiLCJpZi1tb2RpZmllZC1zaW5jZSIsImlmLXVubW9kaWZpZWQtc2luY2UiLCJsYXN0LW1vZGlmaWVkIiwibG9jYXRpb24iLCJtYXgtZm9yd2FyZHMiLCJwcm94eS1hdXRob3JpemF0aW9uIiwicmVmZXJlciIsInJldHJ5LWFmdGVyIiwidXNlci1hZ2VudCJdLE10PWZ1bmN0aW9uKGUpe3ZhciB0PXt9LHMsbixvO3JldHVybiBlJiZpZS5mb3JFYWNoKGUuc3BsaXQoYApgKSxmdW5jdGlvbihhKXtpZihvPWEuaW5kZXhPZigiOiIpLHM9aWUudHJpbShhLnN1YnN0cigwLG8pKS50b0xvd2VyQ2FzZSgpLG49aWUudHJpbShhLnN1YnN0cihvKzEpKSxzKXtpZih0W3NdJiZ4dC5pbmRleE9mKHMpPj0wKXJldHVybjtzPT09InNldC1jb29raWUiP3Rbc109KHRbc10/dFtzXTpbXSkuY29uY2F0KFtuXSk6dFtzXT10W3NdP3Rbc10rIiwgIituOm59fSksdH0seGU9cCxBdD14ZS5pc1N0YW5kYXJkQnJvd3NlckVudigpP2Z1bmN0aW9uKCl7dmFyIGU9Lyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSxzO2Z1bmN0aW9uIG4obyl7dmFyIGk9bztyZXR1cm4gZSYmKHQuc2V0QXR0cmlidXRlKCJocmVmIixpKSxpPXQuaHJlZiksdC5zZXRBdHRyaWJ1dGUoImhyZWYiLGkpLHtocmVmOnQuaHJlZixwcm90b2NvbDp0LnByb3RvY29sP3QucHJvdG9jb2wucmVwbGFjZSgvOiQvLCIiKToiIixob3N0OnQuaG9zdCxzZWFyY2g6dC5zZWFyY2g/dC5zZWFyY2gucmVwbGFjZSgvXlw/LywiIik6IiIsaGFzaDp0Lmhhc2g/dC5oYXNoLnJlcGxhY2UoL14jLywiIik6IiIsaG9zdG5hbWU6dC5ob3N0bmFtZSxwb3J0OnQucG9ydCxwYXRobmFtZTp0LnBhdGhuYW1lLmNoYXJBdCgwKT09PSIvIj90LnBhdGhuYW1lOiIvIit0LnBhdGhuYW1lfX1yZXR1cm4gcz1uKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxmdW5jdGlvbihpKXt2YXIgYT14ZS5pc1N0cmluZyhpKT9uKGkpOmk7cmV0dXJuIGEucHJvdG9jb2w9PT1zLnByb3RvY29sJiZhLmhvc3Q9PT1zLmhvc3R9fSgpOmZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuITB9fSgpO2Z1bmN0aW9uIG9lKHIpe3RoaXMubWVzc2FnZT1yfW9lLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJDYW5jZWwiKyh0aGlzLm1lc3NhZ2U/IjogIit0aGlzLm1lc3NhZ2U6IiIpfSxvZS5wcm90b3R5cGUuX19DQU5DRUxfXz0hMDt2YXIgaj1vZSxKPXAsa3Q9VHQsTnQ9UHQsVXQ9Q2UsQnQ9SXQsJHQ9TXQsTHQ9QXQsYWU9SWUsRnQ9VyxEdD1qLE1lPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihzLG4pe3ZhciBvPWUuZGF0YSxpPWUuaGVhZGVycyxhPWUucmVzcG9uc2VUeXBlLGw7ZnVuY3Rpb24gbSgpe2UuY2FuY2VsVG9rZW4mJmUuY2FuY2VsVG9rZW4udW5zdWJzY3JpYmUobCksZS5zaWduYWwmJmUuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixsKX1KLmlzRm9ybURhdGEobykmJmRlbGV0ZSBpWyJDb250ZW50LVR5cGUiXTt2YXIgdT1uZXcgWE1MSHR0cFJlcXVlc3Q7aWYoZS5hdXRoKXt2YXIgZj1lLmF1dGgudXNlcm5hbWV8fCIiLFQ9ZS5hdXRoLnBhc3N3b3JkP3VuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlLmF1dGgucGFzc3dvcmQpKToiIjtpLkF1dGhvcml6YXRpb249IkJhc2ljICIrYnRvYShmKyI6IitUKX12YXIgZz1CdChlLmJhc2VVUkwsZS51cmwpO3Uub3BlbihlLm1ldGhvZC50b1VwcGVyQ2FzZSgpLFV0KGcsZS5wYXJhbXMsZS5wYXJhbXNTZXJpYWxpemVyKSwhMCksdS50aW1lb3V0PWUudGltZW91dDtmdW5jdGlvbiBldCgpe2lmKCEhdSl7dmFyIHY9ImdldEFsbFJlc3BvbnNlSGVhZGVycyJpbiB1PyR0KHUuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpOm51bGwsQj0hYXx8YT09PSJ0ZXh0Inx8YT09PSJqc29uIj91LnJlc3BvbnNlVGV4dDp1LnJlc3BvbnNlLE89e2RhdGE6QixzdGF0dXM6dS5zdGF0dXMsc3RhdHVzVGV4dDp1LnN0YXR1c1RleHQsaGVhZGVyczp2LGNvbmZpZzplLHJlcXVlc3Q6dX07a3QoZnVuY3Rpb24odmUpe3ModmUpLG0oKX0sZnVuY3Rpb24odmUpe24odmUpLG0oKX0sTyksdT1udWxsfX1pZigib25sb2FkZW5kImluIHU/dS5vbmxvYWRlbmQ9ZXQ6dS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshdXx8dS5yZWFkeVN0YXRlIT09NHx8dS5zdGF0dXM9PT0wJiYhKHUucmVzcG9uc2VVUkwmJnUucmVzcG9uc2VVUkwuaW5kZXhPZigiZmlsZToiKT09PTApfHxzZXRUaW1lb3V0KGV0KX0sdS5vbmFib3J0PWZ1bmN0aW9uKCl7IXV8fChuKGFlKCJSZXF1ZXN0IGFib3J0ZWQiLGUsIkVDT05OQUJPUlRFRCIsdSkpLHU9bnVsbCl9LHUub25lcnJvcj1mdW5jdGlvbigpe24oYWUoIk5ldHdvcmsgRXJyb3IiLGUsbnVsbCx1KSksdT1udWxsfSx1Lm9udGltZW91dD1mdW5jdGlvbigpe3ZhciBCPWUudGltZW91dD8idGltZW91dCBvZiAiK2UudGltZW91dCsibXMgZXhjZWVkZWQiOiJ0aW1lb3V0IGV4Y2VlZGVkIixPPWUudHJhbnNpdGlvbmFsfHxGdC50cmFuc2l0aW9uYWw7ZS50aW1lb3V0RXJyb3JNZXNzYWdlJiYoQj1lLnRpbWVvdXRFcnJvck1lc3NhZ2UpLG4oYWUoQixlLE8uY2xhcmlmeVRpbWVvdXRFcnJvcj8iRVRJTUVET1VUIjoiRUNPTk5BQk9SVEVEIix1KSksdT1udWxsfSxKLmlzU3RhbmRhcmRCcm93c2VyRW52KCkpe3ZhciB0dD0oZS53aXRoQ3JlZGVudGlhbHN8fEx0KGcpKSYmZS54c3JmQ29va2llTmFtZT9OdC5yZWFkKGUueHNyZkNvb2tpZU5hbWUpOnZvaWQgMDt0dCYmKGlbZS54c3JmSGVhZGVyTmFtZV09dHQpfSJzZXRSZXF1ZXN0SGVhZGVyImluIHUmJkouZm9yRWFjaChpLGZ1bmN0aW9uKEIsTyl7dHlwZW9mIG89PSJ1bmRlZmluZWQiJiZPLnRvTG93ZXJDYXNlKCk9PT0iY29udGVudC10eXBlIj9kZWxldGUgaVtPXTp1LnNldFJlcXVlc3RIZWFkZXIoTyxCKX0pLEouaXNVbmRlZmluZWQoZS53aXRoQ3JlZGVudGlhbHMpfHwodS53aXRoQ3JlZGVudGlhbHM9ISFlLndpdGhDcmVkZW50aWFscyksYSYmYSE9PSJqc29uIiYmKHUucmVzcG9uc2VUeXBlPWUucmVzcG9uc2VUeXBlKSx0eXBlb2YgZS5vbkRvd25sb2FkUHJvZ3Jlc3M9PSJmdW5jdGlvbiImJnUuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGUub25Eb3dubG9hZFByb2dyZXNzKSx0eXBlb2YgZS5vblVwbG9hZFByb2dyZXNzPT0iZnVuY3Rpb24iJiZ1LnVwbG9hZCYmdS51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGUub25VcGxvYWRQcm9ncmVzcyksKGUuY2FuY2VsVG9rZW58fGUuc2lnbmFsKSYmKGw9ZnVuY3Rpb24odil7IXV8fChuKCF2fHx2JiZ2LnR5cGU/bmV3IER0KCJjYW5jZWxlZCIpOnYpLHUuYWJvcnQoKSx1PW51bGwpfSxlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnN1YnNjcmliZShsKSxlLnNpZ25hbCYmKGUuc2lnbmFsLmFib3J0ZWQ/bCgpOmUuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IixsKSkpLG98fChvPW51bGwpLHUuc2VuZChvKX0pfSxoPXAsQWU9d3QscXQ9T2UsSHQ9eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifTtmdW5jdGlvbiBrZShyLGUpeyFoLmlzVW5kZWZpbmVkKHIpJiZoLmlzVW5kZWZpbmVkKHJbIkNvbnRlbnQtVHlwZSJdKSYmKHJbIkNvbnRlbnQtVHlwZSJdPWUpfWZ1bmN0aW9uIGp0KCl7dmFyIHI7cmV0dXJuKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCE9InVuZGVmaW5lZCJ8fHR5cGVvZiBwcm9jZXNzIT0idW5kZWZpbmVkIiYmT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHByb2Nlc3MpPT09IltvYmplY3QgcHJvY2Vzc10iKSYmKHI9TWUpLHJ9ZnVuY3Rpb24gSnQocixlLHQpe2lmKGguaXNTdHJpbmcocikpdHJ5e3JldHVybihlfHxKU09OLnBhcnNlKShyKSxoLnRyaW0ocil9Y2F0Y2gocyl7aWYocy5uYW1lIT09IlN5bnRheEVycm9yIil0aHJvdyBzfXJldHVybih0fHxKU09OLnN0cmluZ2lmeSkocil9dmFyIFY9e3RyYW5zaXRpb25hbDp7c2lsZW50SlNPTlBhcnNpbmc6ITAsZm9yY2VkSlNPTlBhcnNpbmc6ITAsY2xhcmlmeVRpbWVvdXRFcnJvcjohMX0sYWRhcHRlcjpqdCgpLHRyYW5zZm9ybVJlcXVlc3Q6W2Z1bmN0aW9uKGUsdCl7cmV0dXJuIEFlKHQsIkFjY2VwdCIpLEFlKHQsIkNvbnRlbnQtVHlwZSIpLGguaXNGb3JtRGF0YShlKXx8aC5pc0FycmF5QnVmZmVyKGUpfHxoLmlzQnVmZmVyKGUpfHxoLmlzU3RyZWFtKGUpfHxoLmlzRmlsZShlKXx8aC5pc0Jsb2IoZSk/ZTpoLmlzQXJyYXlCdWZmZXJWaWV3KGUpP2UuYnVmZmVyOmguaXNVUkxTZWFyY2hQYXJhbXMoZSk/KGtlKHQsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04IiksZS50b1N0cmluZygpKTpoLmlzT2JqZWN0KGUpfHx0JiZ0WyJDb250ZW50LVR5cGUiXT09PSJhcHBsaWNhdGlvbi9qc29uIj8oa2UodCwiYXBwbGljYXRpb24vanNvbiIpLEp0KGUpKTplfV0sdHJhbnNmb3JtUmVzcG9uc2U6W2Z1bmN0aW9uKGUpe3ZhciB0PXRoaXMudHJhbnNpdGlvbmFsfHxWLnRyYW5zaXRpb25hbCxzPXQmJnQuc2lsZW50SlNPTlBhcnNpbmcsbj10JiZ0LmZvcmNlZEpTT05QYXJzaW5nLG89IXMmJnRoaXMucmVzcG9uc2VUeXBlPT09Impzb24iO2lmKG98fG4mJmguaXNTdHJpbmcoZSkmJmUubGVuZ3RoKXRyeXtyZXR1cm4gSlNPTi5wYXJzZShlKX1jYXRjaChpKXtpZihvKXRocm93IGkubmFtZT09PSJTeW50YXhFcnJvciI/cXQoaSx0aGlzLCJFX0pTT05fUEFSU0UiKTppfXJldHVybiBlfV0sdGltZW91dDowLHhzcmZDb29raWVOYW1lOiJYU1JGLVRPS0VOIix4c3JmSGVhZGVyTmFtZToiWC1YU1JGLVRPS0VOIixtYXhDb250ZW50TGVuZ3RoOi0xLG1heEJvZHlMZW5ndGg6LTEsdmFsaWRhdGVTdGF0dXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PTIwMCYmZTwzMDB9LGhlYWRlcnM6e2NvbW1vbjp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoifX19O2guZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiXSxmdW5jdGlvbihlKXtWLmhlYWRlcnNbZV09e319KSxoLmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSxmdW5jdGlvbihlKXtWLmhlYWRlcnNbZV09aC5tZXJnZShIdCl9KTt2YXIgVz1WLFZ0PXAsV3Q9VyxHdD1mdW5jdGlvbihlLHQscyl7dmFyIG49dGhpc3x8V3Q7cmV0dXJuIFZ0LmZvckVhY2gocyxmdW5jdGlvbihpKXtlPWkuY2FsbChuLGUsdCl9KSxlfSxOZT1mdW5jdGlvbihlKXtyZXR1cm4hIShlJiZlLl9fQ0FOQ0VMX18pfSxVZT1wLHVlPUd0LHp0PU5lLFF0PVcsWHQ9ajtmdW5jdGlvbiBsZShyKXtpZihyLmNhbmNlbFRva2VuJiZyLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKSxyLnNpZ25hbCYmci5zaWduYWwuYWJvcnRlZCl0aHJvdyBuZXcgWHQoImNhbmNlbGVkIil9dmFyIEt0PWZ1bmN0aW9uKGUpe2xlKGUpLGUuaGVhZGVycz1lLmhlYWRlcnN8fHt9LGUuZGF0YT11ZS5jYWxsKGUsZS5kYXRhLGUuaGVhZGVycyxlLnRyYW5zZm9ybVJlcXVlc3QpLGUuaGVhZGVycz1VZS5tZXJnZShlLmhlYWRlcnMuY29tbW9ufHx7fSxlLmhlYWRlcnNbZS5tZXRob2RdfHx7fSxlLmhlYWRlcnMpLFVlLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwicG9zdCIsInB1dCIsInBhdGNoIiwiY29tbW9uIl0sZnVuY3Rpb24obil7ZGVsZXRlIGUuaGVhZGVyc1tuXX0pO3ZhciB0PWUuYWRhcHRlcnx8UXQuYWRhcHRlcjtyZXR1cm4gdChlKS50aGVuKGZ1bmN0aW9uKG4pe3JldHVybiBsZShlKSxuLmRhdGE9dWUuY2FsbChlLG4uZGF0YSxuLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXNwb25zZSksbn0sZnVuY3Rpb24obil7cmV0dXJuIHp0KG4pfHwobGUoZSksbiYmbi5yZXNwb25zZSYmKG4ucmVzcG9uc2UuZGF0YT11ZS5jYWxsKGUsbi5yZXNwb25zZS5kYXRhLG4ucmVzcG9uc2UuaGVhZGVycyxlLnRyYW5zZm9ybVJlc3BvbnNlKSkpLFByb21pc2UucmVqZWN0KG4pfSl9LHk9cCxCZT1mdW5jdGlvbihlLHQpe3Q9dHx8e307dmFyIHM9e307ZnVuY3Rpb24gbih1LGYpe3JldHVybiB5LmlzUGxhaW5PYmplY3QodSkmJnkuaXNQbGFpbk9iamVjdChmKT95Lm1lcmdlKHUsZik6eS5pc1BsYWluT2JqZWN0KGYpP3kubWVyZ2Uoe30sZik6eS5pc0FycmF5KGYpP2Yuc2xpY2UoKTpmfWZ1bmN0aW9uIG8odSl7aWYoeS5pc1VuZGVmaW5lZCh0W3VdKSl7aWYoIXkuaXNVbmRlZmluZWQoZVt1XSkpcmV0dXJuIG4odm9pZCAwLGVbdV0pfWVsc2UgcmV0dXJuIG4oZVt1XSx0W3VdKX1mdW5jdGlvbiBpKHUpe2lmKCF5LmlzVW5kZWZpbmVkKHRbdV0pKXJldHVybiBuKHZvaWQgMCx0W3VdKX1mdW5jdGlvbiBhKHUpe2lmKHkuaXNVbmRlZmluZWQodFt1XSkpe2lmKCF5LmlzVW5kZWZpbmVkKGVbdV0pKXJldHVybiBuKHZvaWQgMCxlW3VdKX1lbHNlIHJldHVybiBuKHZvaWQgMCx0W3VdKX1mdW5jdGlvbiBsKHUpe2lmKHUgaW4gdClyZXR1cm4gbihlW3VdLHRbdV0pO2lmKHUgaW4gZSlyZXR1cm4gbih2b2lkIDAsZVt1XSl9dmFyIG09e3VybDppLG1ldGhvZDppLGRhdGE6aSxiYXNlVVJMOmEsdHJhbnNmb3JtUmVxdWVzdDphLHRyYW5zZm9ybVJlc3BvbnNlOmEscGFyYW1zU2VyaWFsaXplcjphLHRpbWVvdXQ6YSx0aW1lb3V0TWVzc2FnZTphLHdpdGhDcmVkZW50aWFsczphLGFkYXB0ZXI6YSxyZXNwb25zZVR5cGU6YSx4c3JmQ29va2llTmFtZTphLHhzcmZIZWFkZXJOYW1lOmEsb25VcGxvYWRQcm9ncmVzczphLG9uRG93bmxvYWRQcm9ncmVzczphLGRlY29tcHJlc3M6YSxtYXhDb250ZW50TGVuZ3RoOmEsbWF4Qm9keUxlbmd0aDphLHRyYW5zcG9ydDphLGh0dHBBZ2VudDphLGh0dHBzQWdlbnQ6YSxjYW5jZWxUb2tlbjphLHNvY2tldFBhdGg6YSxyZXNwb25zZUVuY29kaW5nOmEsdmFsaWRhdGVTdGF0dXM6bH07cmV0dXJuIHkuZm9yRWFjaChPYmplY3Qua2V5cyhlKS5jb25jYXQoT2JqZWN0LmtleXModCkpLGZ1bmN0aW9uKGYpe3ZhciBUPW1bZl18fG8sZz1UKGYpO3kuaXNVbmRlZmluZWQoZykmJlQhPT1sfHwoc1tmXT1nKX0pLHN9LCRlPXt2ZXJzaW9uOiIwLjI1LjAifSxZdD0kZS52ZXJzaW9uLGNlPXt9O1sib2JqZWN0IiwiYm9vbGVhbiIsIm51bWJlciIsImZ1bmN0aW9uIiwic3RyaW5nIiwic3ltYm9sIl0uZm9yRWFjaChmdW5jdGlvbihyLGUpe2NlW3JdPWZ1bmN0aW9uKHMpe3JldHVybiB0eXBlb2Ygcz09PXJ8fCJhIisoZTwxPyJuICI6IiAiKStyfX0pO3ZhciBMZT17fTtjZS50cmFuc2l0aW9uYWw9ZnVuY3Rpb24oZSx0LHMpe2Z1bmN0aW9uIG4obyxpKXtyZXR1cm4iW0F4aW9zIHYiK1l0KyJdIFRyYW5zaXRpb25hbCBvcHRpb24gJyIrbysiJyIraSsocz8iLiAiK3M6IiIpfXJldHVybiBmdW5jdGlvbihvLGksYSl7aWYoZT09PSExKXRocm93IG5ldyBFcnJvcihuKGksIiBoYXMgYmVlbiByZW1vdmVkIisodD8iIGluICIrdDoiIikpKTtyZXR1cm4gdCYmIUxlW2ldJiYoTGVbaV09ITAsY29uc29sZS53YXJuKG4oaSwiIGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgdiIrdCsiIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlIikpKSxlP2UobyxpLGEpOiEwfX07ZnVuY3Rpb24gWnQocixlLHQpe2lmKHR5cGVvZiByIT0ib2JqZWN0Iil0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Zm9yKHZhciBzPU9iamVjdC5rZXlzKHIpLG49cy5sZW5ndGg7bi0tID4wOyl7dmFyIG89c1tuXSxpPWVbb107aWYoaSl7dmFyIGE9cltvXSxsPWE9PT12b2lkIDB8fGkoYSxvLHIpO2lmKGwhPT0hMCl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb24gIitvKyIgbXVzdCBiZSAiK2wpO2NvbnRpbnVlfWlmKHQhPT0hMCl0aHJvdyBFcnJvcigiVW5rbm93biBvcHRpb24gIitvKX19dmFyIGVyPXthc3NlcnRPcHRpb25zOlp0LHZhbGlkYXRvcnM6Y2V9LEZlPXAsdHI9Q2UsRGU9X3QscWU9S3QsRz1CZSxIZT1lcix4PUhlLnZhbGlkYXRvcnM7ZnVuY3Rpb24gJChyKXt0aGlzLmRlZmF1bHRzPXIsdGhpcy5pbnRlcmNlcHRvcnM9e3JlcXVlc3Q6bmV3IERlLHJlc3BvbnNlOm5ldyBEZX19JC5wcm90b3R5cGUucmVxdWVzdD1mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiBlPT0ic3RyaW5nIj8odD10fHx7fSx0LnVybD1lKTp0PWV8fHt9LCF0LnVybCl0aHJvdyBuZXcgRXJyb3IoIlByb3ZpZGVkIGNvbmZpZyB1cmwgaXMgbm90IHZhbGlkIik7dD1HKHRoaXMuZGVmYXVsdHMsdCksdC5tZXRob2Q/dC5tZXRob2Q9dC5tZXRob2QudG9Mb3dlckNhc2UoKTp0aGlzLmRlZmF1bHRzLm1ldGhvZD90Lm1ldGhvZD10aGlzLmRlZmF1bHRzLm1ldGhvZC50b0xvd2VyQ2FzZSgpOnQubWV0aG9kPSJnZXQiO3ZhciBzPXQudHJhbnNpdGlvbmFsO3MhPT12b2lkIDAmJkhlLmFzc2VydE9wdGlvbnMocyx7c2lsZW50SlNPTlBhcnNpbmc6eC50cmFuc2l0aW9uYWwoeC5ib29sZWFuKSxmb3JjZWRKU09OUGFyc2luZzp4LnRyYW5zaXRpb25hbCh4LmJvb2xlYW4pLGNsYXJpZnlUaW1lb3V0RXJyb3I6eC50cmFuc2l0aW9uYWwoeC5ib29sZWFuKX0sITEpO3ZhciBuPVtdLG89ITA7dGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uKGcpe3R5cGVvZiBnLnJ1bldoZW49PSJmdW5jdGlvbiImJmcucnVuV2hlbih0KT09PSExfHwobz1vJiZnLnN5bmNocm9ub3VzLG4udW5zaGlmdChnLmZ1bGZpbGxlZCxnLnJlamVjdGVkKSl9KTt2YXIgaT1bXTt0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKGZ1bmN0aW9uKGcpe2kucHVzaChnLmZ1bGZpbGxlZCxnLnJlamVjdGVkKX0pO3ZhciBhO2lmKCFvKXt2YXIgbD1bcWUsdm9pZCAwXTtmb3IoQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuYXBwbHkobCxuKSxsPWwuY29uY2F0KGkpLGE9UHJvbWlzZS5yZXNvbHZlKHQpO2wubGVuZ3RoOylhPWEudGhlbihsLnNoaWZ0KCksbC5zaGlmdCgpKTtyZXR1cm4gYX1mb3IodmFyIG09dDtuLmxlbmd0aDspe3ZhciB1PW4uc2hpZnQoKSxmPW4uc2hpZnQoKTt0cnl7bT11KG0pfWNhdGNoKFQpe2YoVCk7YnJlYWt9fXRyeXthPXFlKG0pfWNhdGNoKFQpe3JldHVybiBQcm9taXNlLnJlamVjdChUKX1mb3IoO2kubGVuZ3RoOylhPWEudGhlbihpLnNoaWZ0KCksaS5zaGlmdCgpKTtyZXR1cm4gYX0sJC5wcm90b3R5cGUuZ2V0VXJpPWZ1bmN0aW9uKGUpe2lmKCFlLnVybCl0aHJvdyBuZXcgRXJyb3IoIlByb3ZpZGVkIGNvbmZpZyB1cmwgaXMgbm90IHZhbGlkIik7cmV0dXJuIGU9Ryh0aGlzLmRlZmF1bHRzLGUpLHRyKGUudXJsLGUucGFyYW1zLGUucGFyYW1zU2VyaWFsaXplcikucmVwbGFjZSgvXlw/LywiIil9LEZlLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwib3B0aW9ucyJdLGZ1bmN0aW9uKGUpeyQucHJvdG90eXBlW2VdPWZ1bmN0aW9uKHQscyl7cmV0dXJuIHRoaXMucmVxdWVzdChHKHN8fHt9LHttZXRob2Q6ZSx1cmw6dCxkYXRhOihzfHx7fSkuZGF0YX0pKX19KSxGZS5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sZnVuY3Rpb24oZSl7JC5wcm90b3R5cGVbZV09ZnVuY3Rpb24odCxzLG4pe3JldHVybiB0aGlzLnJlcXVlc3QoRyhufHx7fSx7bWV0aG9kOmUsdXJsOnQsZGF0YTpzfSkpfX0pO3ZhciBycj0kLHNyPWo7ZnVuY3Rpb24gTShyKXtpZih0eXBlb2YgciE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJleGVjdXRvciBtdXN0IGJlIGEgZnVuY3Rpb24uIik7dmFyIGU7dGhpcy5wcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKG4pe2U9bn0pO3ZhciB0PXRoaXM7dGhpcy5wcm9taXNlLnRoZW4oZnVuY3Rpb24ocyl7aWYoISF0Ll9saXN0ZW5lcnMpe3ZhciBuLG89dC5fbGlzdGVuZXJzLmxlbmd0aDtmb3Iobj0wO248bztuKyspdC5fbGlzdGVuZXJzW25dKHMpO3QuX2xpc3RlbmVycz1udWxsfX0pLHRoaXMucHJvbWlzZS50aGVuPWZ1bmN0aW9uKHMpe3ZhciBuLG89bmV3IFByb21pc2UoZnVuY3Rpb24oaSl7dC5zdWJzY3JpYmUoaSksbj1pfSkudGhlbihzKTtyZXR1cm4gby5jYW5jZWw9ZnVuY3Rpb24oKXt0LnVuc3Vic2NyaWJlKG4pfSxvfSxyKGZ1bmN0aW9uKG4pe3QucmVhc29ufHwodC5yZWFzb249bmV3IHNyKG4pLGUodC5yZWFzb24pKX0pfU0ucHJvdG90eXBlLnRocm93SWZSZXF1ZXN0ZWQ9ZnVuY3Rpb24oKXtpZih0aGlzLnJlYXNvbil0aHJvdyB0aGlzLnJlYXNvbn0sTS5wcm90b3R5cGUuc3Vic2NyaWJlPWZ1bmN0aW9uKGUpe2lmKHRoaXMucmVhc29uKXtlKHRoaXMucmVhc29uKTtyZXR1cm59dGhpcy5fbGlzdGVuZXJzP3RoaXMuX2xpc3RlbmVycy5wdXNoKGUpOnRoaXMuX2xpc3RlbmVycz1bZV19LE0ucHJvdG90eXBlLnVuc3Vic2NyaWJlPWZ1bmN0aW9uKGUpe2lmKCEhdGhpcy5fbGlzdGVuZXJzKXt2YXIgdD10aGlzLl9saXN0ZW5lcnMuaW5kZXhPZihlKTt0IT09LTEmJnRoaXMuX2xpc3RlbmVycy5zcGxpY2UodCwxKX19LE0uc291cmNlPWZ1bmN0aW9uKCl7dmFyIGUsdD1uZXcgTShmdW5jdGlvbihuKXtlPW59KTtyZXR1cm57dG9rZW46dCxjYW5jZWw6ZX19O3ZhciBucj1NLGlyPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihzKXtyZXR1cm4gZS5hcHBseShudWxsLHMpfX0sb3I9cCxhcj1mdW5jdGlvbihlKXtyZXR1cm4gb3IuaXNPYmplY3QoZSkmJmUuaXNBeGlvc0Vycm9yPT09ITB9LGplPXAsdXI9RWUsej1ycixscj1CZSxjcj1XO2Z1bmN0aW9uIEplKHIpe3ZhciBlPW5ldyB6KHIpLHQ9dXIoei5wcm90b3R5cGUucmVxdWVzdCxlKTtyZXR1cm4gamUuZXh0ZW5kKHQsei5wcm90b3R5cGUsZSksamUuZXh0ZW5kKHQsZSksdC5jcmVhdGU9ZnVuY3Rpb24obil7cmV0dXJuIEplKGxyKHIsbikpfSx0fXZhciBFPUplKGNyKTtFLkF4aW9zPXosRS5DYW5jZWw9aixFLkNhbmNlbFRva2VuPW5yLEUuaXNDYW5jZWw9TmUsRS5WRVJTSU9OPSRlLnZlcnNpb24sRS5hbGw9ZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UuYWxsKGUpfSxFLnNwcmVhZD1pcixFLmlzQXhpb3NFcnJvcj1hcixlZS5leHBvcnRzPUUsZWUuZXhwb3J0cy5kZWZhdWx0PUU7dmFyIGZyPWVlLmV4cG9ydHM7Y2xhc3MgY3tpc0VtcHR5KCl7cmV0dXJuIXRoaXMuaXNQcmVzZW50KCl9c3RhdGljIG9mKGUpe2lmKGUhPW51bGwpcmV0dXJuIG5ldyBWZShlKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgcGFzc2VkIHZhbHVlIHdhcyBudWxsIG9yIHVuZGVmaW5lZC4iKX1zdGF0aWMgb2ZOb25OdWxsKGUpe3JldHVybiBjLm9mKGUpfXN0YXRpYyBvZk51bGxhYmxlKGUpe3JldHVybiBlIT1udWxsP25ldyBWZShlKTpuZXcgV2V9c3RhdGljIGVtcHR5KCl7cmV0dXJuIG5ldyBXZX1zdGF0aWMgZnJvbShlKXtzd2l0Y2goZS5raW5kKXtjYXNlInByZXNlbnQiOnJldHVybiBjLm9mKGUudmFsdWUpO2Nhc2UiZW1wdHkiOnJldHVybiBjLmVtcHR5KCk7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgcGFzc2VkIHZhbHVlIHdhcyBub3QgYW4gT3B0aW9uIHR5cGUuIil9fX1jbGFzcyBWZSBleHRlbmRzIGN7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLnBheWxvYWQ9ZX1pc1ByZXNlbnQoKXtyZXR1cm4hMH1nZXQoKXtyZXR1cm4gdGhpcy5wYXlsb2FkfWlmUHJlc2VudChlKXtlKHRoaXMucGF5bG9hZCl9aWZQcmVzZW50T3JFbHNlKGUsdCl7ZSh0aGlzLnBheWxvYWQpfWZpbHRlcihlKXtyZXR1cm4gZSh0aGlzLnBheWxvYWQpP3RoaXM6Yy5lbXB0eSgpfW1hcChlKXtjb25zdCB0PWUodGhpcy5wYXlsb2FkKTtyZXR1cm4gYy5vZk51bGxhYmxlKHQpfWZsYXRNYXAoZSl7cmV0dXJuIGUodGhpcy5wYXlsb2FkKX1vcihlKXtyZXR1cm4gdGhpc31vckVsc2UoZSl7cmV0dXJuIHRoaXMucGF5bG9hZH1vckVsc2VHZXQoZSl7cmV0dXJuIHRoaXMucGF5bG9hZH1vckVsc2VUaHJvdyhlKXtyZXR1cm4gdGhpcy5wYXlsb2FkfW9yTnVsbCgpe3JldHVybiB0aGlzLnBheWxvYWR9b3JVbmRlZmluZWQoKXtyZXR1cm4gdGhpcy5wYXlsb2FkfXRvT3B0aW9uKCl7cmV0dXJue2tpbmQ6InByZXNlbnQiLHZhbHVlOnRoaXMucGF5bG9hZH19bWF0Y2hlcyhlKXtyZXR1cm4gZS5wcmVzZW50KHRoaXMucGF5bG9hZCl9dG9KU09OKGUpe3JldHVybiB0aGlzLnBheWxvYWR9fWNsYXNzIFdlIGV4dGVuZHMgY3tpc1ByZXNlbnQoKXtyZXR1cm4hMX1jb25zdHJ1Y3Rvcigpe3N1cGVyKCl9Z2V0KCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIG9wdGlvbmFsIGlzIG5vdCBwcmVzZW50LiIpfWlmUHJlc2VudChlKXt9aWZQcmVzZW50T3JFbHNlKGUsdCl7dCgpfWZpbHRlcihlKXtyZXR1cm4gdGhpc31tYXAoZSl7cmV0dXJuIGMuZW1wdHkoKX1mbGF0TWFwKGUpe3JldHVybiBjLmVtcHR5KCl9b3IoZSl7cmV0dXJuIGUoKX1vckVsc2UoZSl7cmV0dXJuIGV9b3JFbHNlR2V0KGUpe3JldHVybiB0aGlzLm9yRWxzZShlKCkpfW9yRWxzZVRocm93KGUpe3Rocm93IGUoKX1vck51bGwoKXtyZXR1cm4gbnVsbH1vclVuZGVmaW5lZCgpe310b09wdGlvbigpe3JldHVybntraW5kOiJlbXB0eSJ9fW1hdGNoZXMoZSl7cmV0dXJuIGUuZW1wdHkoKX10b0pTT04oZSl7cmV0dXJuIG51bGx9fWNvbnN0IGhyPSIxLjIuNyI7ZnVuY3Rpb24gZHIocil7Z2xvYmFsVGhpcy5fdm9uYWdlTWVkaWFQcm9jZXNzb3JNZXRhZGF0YT1yfWZ1bmN0aW9uIHByKCl7cmV0dXJuIGdsb2JhbFRoaXMuX3ZvbmFnZU1lZGlhUHJvY2Vzc29yTWV0YWRhdGF9Y2xhc3MgX3tjb25zdHJ1Y3Rvcigpe2NvbnN0IGU9cHIoKTt0aGlzLl9yZXBvcnQ9e2FjdGlvbjpjLmVtcHR5KCksYXBwbGljYXRpb25JZDpjLm9mTnVsbGFibGUoZSE9PXZvaWQgMCYmZSE9bnVsbD9lLmFwcElkOm51bGwpLHRpbWVzdGFtcDpEYXRlLm5vdygpLGZwczpjLmVtcHR5KCksZnJhbWVzVHJhbnNmb3JtZWQ6Yy5lbXB0eSgpLGd1aWQ6Yy5lbXB0eSgpLGhpZ2hlc3RGcmFtZVRyYW5zZm9ybUNwdTpjLmVtcHR5KCksbWVzc2FnZTpjLmVtcHR5KCksc291cmNlOmMub2ZOdWxsYWJsZShlIT09dm9pZCAwJiZlIT1udWxsP2Uuc291cmNlVHlwZTpudWxsKSx0cmFuc2Zvcm1lZEZwczpjLmVtcHR5KCksdHJhbnNmb3JtZXJUeXBlOmMuZW1wdHkoKSx2YXJpYXRpb246Yy5lbXB0eSgpLHZpZGVvSGVpZ2h0OmMuZW1wdHkoKSx2aWRlb1dpZHRoOmMuZW1wdHkoKSx2ZXJzaW9uOmhyLGVycm9yOmMuZW1wdHkoKSxwcm94eVVybDpjLm9mTnVsbGFibGUoZSE9PXZvaWQgMCYmZSE9bnVsbD9lLnByb3h5VXJsOm51bGwpfX1hY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5hY3Rpb249Yy5vZk51bGxhYmxlKGUpLHRoaXN9ZnJhbWVzVHJhbnNmb3JtZWQoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5mcmFtZXNUcmFuc2Zvcm1lZD1jLm9mTnVsbGFibGUoZSksdGhpc31mcHMoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5mcHM9Yy5vZk51bGxhYmxlKGUpLHRoaXN9Z3VpZChlKXtyZXR1cm4gdGhpcy5fcmVwb3J0Lmd1aWQ9Yy5vZk51bGxhYmxlKGUpLHRoaXN9bWVzc2FnZShlKXtyZXR1cm4gdGhpcy5fcmVwb3J0Lm1lc3NhZ2U9Yy5vZk51bGxhYmxlKGUpLHRoaXN9dHJhbnNmb3JtZWRGcHMoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC50cmFuc2Zvcm1lZEZwcz1jLm9mTnVsbGFibGUoZSksdGhpc310cmFuc2Zvcm1lclR5cGUoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC50cmFuc2Zvcm1lclR5cGU9Yy5vZk51bGxhYmxlKGUpLHRoaXN9dmFyaWF0aW9uKGUpe3JldHVybiB0aGlzLl9yZXBvcnQudmFyaWF0aW9uPWMub2ZOdWxsYWJsZShlKSx0aGlzfXZpZGVvSGVpZ2h0KGUpe3JldHVybiB0aGlzLl9yZXBvcnQudmlkZW9IZWlnaHQ9Yy5vZk51bGxhYmxlKGUpLHRoaXN9dmlkZW9XaWR0aChlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LnZpZGVvV2lkdGg9Yy5vZk51bGxhYmxlKGUpLHRoaXN9ZXJyb3IoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5lcnJvcj1jLm9mTnVsbGFibGUoZSksdGhpc31idWlsZCgpe3JldHVybiB0aGlzLl9yZXBvcnR9fWNvbnN0IG1yPXI9PkpTT04uc3RyaW5naWZ5KHIsKGUsdCk9PntpZih0IT09bnVsbClyZXR1cm4gdH0pO2NsYXNzIGJ7c3RhdGljIHJlcG9ydChlKXtyZXR1cm4gbmV3IFByb21pc2UoKHQscyk9PntpZihlLmFwcGxpY2F0aW9uSWQuaXNFbXB0eSgpfHxlLnNvdXJjZS5pc0VtcHR5KCkpe3QoInN1Y2Nlc3MiKTtyZXR1cm59bGV0IG49ZnIuY3JlYXRlKCksbz17dGltZW91dDoxZTQsdGltZW91dEVycm9yTWVzc2FnZToiUmVxdWVzdCB0aW1lb3V0IixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9fSxpPSJobGcudG9rYm94LmNvbS9wcm9kL2xvZ2dpbmcvdmNwX3dlYnJ0YyI7aWYoZS5wcm94eVVybC5pc0VtcHR5KCkpaT0iaHR0cHM6Ly8iK2k7ZWxzZXtsZXQgYTtlLnByb3h5VXJsLmdldCgpLnNsaWNlKGUucHJveHlVcmwuZ2V0KCkubGVuZ3RoLTEpIT09Ii8iP2E9ZS5wcm94eVVybC5nZXQoKSsiLyI6YT1lLnByb3h5VXJsLmdldCgpLGk9YStpfW4ucG9zdChpLG1yKGUpLG8pLnRoZW4oYT0+e2NvbnNvbGUubG9nKGEpLHQoInN1Y2Nlc3MiKX0pLmNhdGNoKGE9Pntjb25zb2xlLmxvZyhhKSxzKGEpfSl9KX19dmFyIFEsZ3I9bmV3IFVpbnQ4QXJyYXkoMTYpO2Z1bmN0aW9uIHlyKCl7aWYoIVEmJihRPXR5cGVvZiBjcnlwdG8hPSJ1bmRlZmluZWQiJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKXx8dHlwZW9mIG1zQ3J5cHRvIT0idW5kZWZpbmVkIiYmdHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcz09ImZ1bmN0aW9uIiYmbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQobXNDcnlwdG8pLCFRKSl0aHJvdyBuZXcgRXJyb3IoImNyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkIik7cmV0dXJuIFEoZ3IpfXZhciBfcj0vXig/OlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLTVdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCkkL2k7ZnVuY3Rpb24gYnIocil7cmV0dXJuIHR5cGVvZiByPT0ic3RyaW5nIiYmX3IudGVzdChyKX1mb3IodmFyIGQ9W10sZmU9MDtmZTwyNTY7KytmZSlkLnB1c2goKGZlKzI1NikudG9TdHJpbmcoMTYpLnN1YnN0cigxKSk7ZnVuY3Rpb24gd3Iocil7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOjAsdD0oZFtyW2UrMF1dK2RbcltlKzFdXStkW3JbZSsyXV0rZFtyW2UrM11dKyItIitkW3JbZSs0XV0rZFtyW2UrNV1dKyItIitkW3JbZSs2XV0rZFtyW2UrN11dKyItIitkW3JbZSs4XV0rZFtyW2UrOV1dKyItIitkW3JbZSsxMF1dK2RbcltlKzExXV0rZFtyW2UrMTJdXStkW3JbZSsxM11dK2RbcltlKzE0XV0rZFtyW2UrMTVdXSkudG9Mb3dlckNhc2UoKTtpZighYnIodCkpdGhyb3cgVHlwZUVycm9yKCJTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWQiKTtyZXR1cm4gdH1mdW5jdGlvbiBHZShyLGUsdCl7cj1yfHx7fTt2YXIgcz1yLnJhbmRvbXx8KHIucm5nfHx5cikoKTtpZihzWzZdPXNbNl0mMTV8NjQsc1s4XT1zWzhdJjYzfDEyOCxlKXt0PXR8fDA7Zm9yKHZhciBuPTA7bjwxNjsrK24pZVt0K25dPXNbbl07cmV0dXJuIGV9cmV0dXJuIHdyKHMpfWNvbnN0IFM9bmV3IFdlYWtNYXAsWD1uZXcgV2Vha01hcCxMPW5ldyBXZWFrTWFwLGhlPVN5bWJvbCgiYW55UHJvZHVjZXIiKSx6ZT1Qcm9taXNlLnJlc29sdmUoKSxLPVN5bWJvbCgibGlzdGVuZXJBZGRlZCIpLFk9U3ltYm9sKCJsaXN0ZW5lclJlbW92ZWQiKTtsZXQgZGU9ITE7ZnVuY3Rpb24gQShyKXtpZih0eXBlb2YgciE9InN0cmluZyImJnR5cGVvZiByIT0ic3ltYm9sIil0aHJvdyBuZXcgVHlwZUVycm9yKCJldmVudE5hbWUgbXVzdCBiZSBhIHN0cmluZyBvciBhIHN5bWJvbCIpfWZ1bmN0aW9uIFoocil7aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gayhyLGUpe2NvbnN0IHQ9WC5nZXQocik7cmV0dXJuIHQuaGFzKGUpfHx0LnNldChlLG5ldyBTZXQpLHQuZ2V0KGUpfWZ1bmN0aW9uIEYocixlKXtjb25zdCB0PXR5cGVvZiBlPT0ic3RyaW5nInx8dHlwZW9mIGU9PSJzeW1ib2wiP2U6aGUscz1MLmdldChyKTtyZXR1cm4gcy5oYXModCl8fHMuc2V0KHQsbmV3IFNldCkscy5nZXQodCl9ZnVuY3Rpb24gdnIocixlLHQpe2NvbnN0IHM9TC5nZXQocik7aWYocy5oYXMoZSkpZm9yKGNvbnN0IG4gb2Ygcy5nZXQoZSkpbi5lbnF1ZXVlKHQpO2lmKHMuaGFzKGhlKSl7Y29uc3Qgbj1Qcm9taXNlLmFsbChbZSx0XSk7Zm9yKGNvbnN0IG8gb2Ygcy5nZXQoaGUpKW8uZW5xdWV1ZShuKX19ZnVuY3Rpb24gUWUocixlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07bGV0IHQ9ITEscz0oKT0+e30sbj1bXTtjb25zdCBvPXtlbnF1ZXVlKGkpe24ucHVzaChpKSxzKCl9LGZpbmlzaCgpe3Q9ITAscygpfX07Zm9yKGNvbnN0IGkgb2YgZSlGKHIsaSkuYWRkKG8pO3JldHVybnthc3luYyBuZXh0KCl7cmV0dXJuIG4/bi5sZW5ndGg9PT0wP3Q/KG49dm9pZCAwLHRoaXMubmV4dCgpKTooYXdhaXQgbmV3IFByb21pc2UoaT0+e3M9aX0pLHRoaXMubmV4dCgpKTp7ZG9uZTohMSx2YWx1ZTphd2FpdCBuLnNoaWZ0KCl9Ontkb25lOiEwfX0sYXN5bmMgcmV0dXJuKGkpe249dm9pZCAwO2Zvcihjb25zdCBhIG9mIGUpRihyLGEpLmRlbGV0ZShvKTtyZXR1cm4gcygpLGFyZ3VtZW50cy5sZW5ndGg+MD97ZG9uZTohMCx2YWx1ZTphd2FpdCBpfTp7ZG9uZTohMH19LFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKXtyZXR1cm4gdGhpc319fWZ1bmN0aW9uIFhlKHIpe2lmKHI9PT12b2lkIDApcmV0dXJuIEtlO2lmKCFBcnJheS5pc0FycmF5KHIpKXRocm93IG5ldyBUeXBlRXJyb3IoImBtZXRob2ROYW1lc2AgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIik7Zm9yKGNvbnN0IGUgb2YgcilpZighS2UuaW5jbHVkZXMoZSkpdGhyb3cgdHlwZW9mIGUhPSJzdHJpbmciP25ldyBUeXBlRXJyb3IoImBtZXRob2ROYW1lc2AgZWxlbWVudCBtdXN0IGJlIGEgc3RyaW5nIik6bmV3IEVycm9yKGAke2V9IGlzIG5vdCBFbWl0dGVyeSBtZXRob2RgKTtyZXR1cm4gcn1jb25zdCBwZT1yPT5yPT09S3x8cj09PVk7Y2xhc3MgQ3tzdGF0aWMgbWl4aW4oZSx0KXtyZXR1cm4gdD1YZSh0KSxzPT57aWYodHlwZW9mIHMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiYHRhcmdldGAgbXVzdCBiZSBmdW5jdGlvbiIpO2Zvcihjb25zdCBpIG9mIHQpaWYocy5wcm90b3R5cGVbaV0hPT12b2lkIDApdGhyb3cgbmV3IEVycm9yKGBUaGUgcHJvcGVydHkgXGAke2l9XGAgYWxyZWFkeSBleGlzdHMgb24gXGB0YXJnZXRcYGApO2Z1bmN0aW9uIG4oKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsZSx7ZW51bWVyYWJsZTohMSx2YWx1ZTpuZXcgQ30pLHRoaXNbZV19T2JqZWN0LmRlZmluZVByb3BlcnR5KHMucHJvdG90eXBlLGUse2VudW1lcmFibGU6ITEsZ2V0Om59KTtjb25zdCBvPWk9PmZ1bmN0aW9uKC4uLmEpe3JldHVybiB0aGlzW2VdW2ldKC4uLmEpfTtmb3IoY29uc3QgaSBvZiB0KU9iamVjdC5kZWZpbmVQcm9wZXJ0eShzLnByb3RvdHlwZSxpLHtlbnVtZXJhYmxlOiExLHZhbHVlOm8oaSl9KTtyZXR1cm4gc319c3RhdGljIGdldCBpc0RlYnVnRW5hYmxlZCgpe2lmKHR5cGVvZiBwcm9jZXNzIT0ib2JqZWN0IilyZXR1cm4gZGU7Y29uc3R7ZW52OmV9PXByb2Nlc3N8fHtlbnY6e319O3JldHVybiBlLkRFQlVHPT09ImVtaXR0ZXJ5Inx8ZS5ERUJVRz09PSIqInx8ZGV9c3RhdGljIHNldCBpc0RlYnVnRW5hYmxlZChlKXtkZT1lfWNvbnN0cnVjdG9yKGU9e30pe1Muc2V0KHRoaXMsbmV3IFNldCksWC5zZXQodGhpcyxuZXcgTWFwKSxMLnNldCh0aGlzLG5ldyBNYXApLHRoaXMuZGVidWc9ZS5kZWJ1Z3x8e30sdGhpcy5kZWJ1Zy5lbmFibGVkPT09dm9pZCAwJiYodGhpcy5kZWJ1Zy5lbmFibGVkPSExKSx0aGlzLmRlYnVnLmxvZ2dlcnx8KHRoaXMuZGVidWcubG9nZ2VyPSh0LHMsbixvKT0+e289SlNPTi5zdHJpbmdpZnkobyksdHlwZW9mIG49PSJzeW1ib2wiJiYobj1uLnRvU3RyaW5nKCkpO2NvbnN0IGk9bmV3IERhdGUsYT1gJHtpLmdldEhvdXJzKCl9OiR7aS5nZXRNaW51dGVzKCl9OiR7aS5nZXRTZWNvbmRzKCl9LiR7aS5nZXRNaWxsaXNlY29uZHMoKX1gO2NvbnNvbGUubG9nKGBbJHthfV1bZW1pdHRlcnk6JHt0fV1bJHtzfV0gRXZlbnQgTmFtZTogJHtufQoJZGF0YTogJHtvfWApfSl9bG9nSWZEZWJ1Z0VuYWJsZWQoZSx0LHMpeyhDLmlzRGVidWdFbmFibGVkfHx0aGlzLmRlYnVnLmVuYWJsZWQpJiZ0aGlzLmRlYnVnLmxvZ2dlcihlLHRoaXMuZGVidWcubmFtZSx0LHMpfW9uKGUsdCl7Wih0KSxlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07Zm9yKGNvbnN0IHMgb2YgZSlBKHMpLGsodGhpcyxzKS5hZGQodCksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgic3Vic2NyaWJlIixzLHZvaWQgMCkscGUocyl8fHRoaXMuZW1pdChLLHtldmVudE5hbWU6cyxsaXN0ZW5lcjp0fSk7cmV0dXJuIHRoaXMub2ZmLmJpbmQodGhpcyxlLHQpfW9mZihlLHQpe1oodCksZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCBzIG9mIGUpQShzKSxrKHRoaXMscykuZGVsZXRlKHQpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInVuc3Vic2NyaWJlIixzLHZvaWQgMCkscGUocyl8fHRoaXMuZW1pdChZLHtldmVudE5hbWU6cyxsaXN0ZW5lcjp0fSl9b25jZShlKXtyZXR1cm4gbmV3IFByb21pc2UodD0+e2NvbnN0IHM9dGhpcy5vbihlLG49PntzKCksdChuKX0pfSl9ZXZlbnRzKGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgdCBvZiBlKUEodCk7cmV0dXJuIFFlKHRoaXMsZSl9YXN5bmMgZW1pdChlLHQpe0EoZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgiZW1pdCIsZSx0KSx2cih0aGlzLGUsdCk7Y29uc3Qgcz1rKHRoaXMsZSksbj1TLmdldCh0aGlzKSxvPVsuLi5zXSxpPXBlKGUpP1tdOlsuLi5uXTthd2FpdCB6ZSxhd2FpdCBQcm9taXNlLmFsbChbLi4uby5tYXAoYXN5bmMgYT0+e2lmKHMuaGFzKGEpKXJldHVybiBhKHQpfSksLi4uaS5tYXAoYXN5bmMgYT0+e2lmKG4uaGFzKGEpKXJldHVybiBhKGUsdCl9KV0pfWFzeW5jIGVtaXRTZXJpYWwoZSx0KXtBKGUpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoImVtaXRTZXJpYWwiLGUsdCk7Y29uc3Qgcz1rKHRoaXMsZSksbj1TLmdldCh0aGlzKSxvPVsuLi5zXSxpPVsuLi5uXTthd2FpdCB6ZTtmb3IoY29uc3QgYSBvZiBvKXMuaGFzKGEpJiZhd2FpdCBhKHQpO2Zvcihjb25zdCBhIG9mIGkpbi5oYXMoYSkmJmF3YWl0IGEoZSx0KX1vbkFueShlKXtyZXR1cm4gWihlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJzdWJzY3JpYmVBbnkiLHZvaWQgMCx2b2lkIDApLFMuZ2V0KHRoaXMpLmFkZChlKSx0aGlzLmVtaXQoSyx7bGlzdGVuZXI6ZX0pLHRoaXMub2ZmQW55LmJpbmQodGhpcyxlKX1hbnlFdmVudCgpe3JldHVybiBRZSh0aGlzKX1vZmZBbnkoZSl7WihlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJ1bnN1YnNjcmliZUFueSIsdm9pZCAwLHZvaWQgMCksdGhpcy5lbWl0KFkse2xpc3RlbmVyOmV9KSxTLmdldCh0aGlzKS5kZWxldGUoZSl9Y2xlYXJMaXN0ZW5lcnMoZSl7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCB0IG9mIGUpaWYodGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgiY2xlYXIiLHQsdm9pZCAwKSx0eXBlb2YgdD09InN0cmluZyJ8fHR5cGVvZiB0PT0ic3ltYm9sIil7ayh0aGlzLHQpLmNsZWFyKCk7Y29uc3Qgcz1GKHRoaXMsdCk7Zm9yKGNvbnN0IG4gb2YgcyluLmZpbmlzaCgpO3MuY2xlYXIoKX1lbHNle1MuZ2V0KHRoaXMpLmNsZWFyKCk7Zm9yKGNvbnN0IHMgb2YgWC5nZXQodGhpcykudmFsdWVzKCkpcy5jbGVhcigpO2Zvcihjb25zdCBzIG9mIEwuZ2V0KHRoaXMpLnZhbHVlcygpKXtmb3IoY29uc3QgbiBvZiBzKW4uZmluaXNoKCk7cy5jbGVhcigpfX19bGlzdGVuZXJDb3VudChlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07bGV0IHQ9MDtmb3IoY29uc3QgcyBvZiBlKXtpZih0eXBlb2Ygcz09InN0cmluZyIpe3QrPVMuZ2V0KHRoaXMpLnNpemUrayh0aGlzLHMpLnNpemUrRih0aGlzLHMpLnNpemUrRih0aGlzKS5zaXplO2NvbnRpbnVlfXR5cGVvZiBzIT0idW5kZWZpbmVkIiYmQShzKSx0Kz1TLmdldCh0aGlzKS5zaXplO2Zvcihjb25zdCBuIG9mIFguZ2V0KHRoaXMpLnZhbHVlcygpKXQrPW4uc2l6ZTtmb3IoY29uc3QgbiBvZiBMLmdldCh0aGlzKS52YWx1ZXMoKSl0Kz1uLnNpemV9cmV0dXJuIHR9YmluZE1ldGhvZHMoZSx0KXtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fGU9PT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoImB0YXJnZXRgIG11c3QgYmUgYW4gb2JqZWN0Iik7dD1YZSh0KTtmb3IoY29uc3QgcyBvZiB0KXtpZihlW3NdIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgVGhlIHByb3BlcnR5IFxgJHtzfVxgIGFscmVhZHkgZXhpc3RzIG9uIFxgdGFyZ2V0XGBgKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxzLHtlbnVtZXJhYmxlOiExLHZhbHVlOnRoaXNbc10uYmluZCh0aGlzKX0pfX19Y29uc3QgS2U9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoQy5wcm90b3R5cGUpLmZpbHRlcihyPT5yIT09ImNvbnN0cnVjdG9yIik7T2JqZWN0LmRlZmluZVByb3BlcnR5KEMsImxpc3RlbmVyQWRkZWQiLHt2YWx1ZTpLLHdyaXRhYmxlOiExLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsImxpc3RlbmVyUmVtb3ZlZCIse3ZhbHVlOlksd3JpdGFibGU6ITEsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITF9KTt2YXIgbWU9QztmdW5jdGlvbiBFcihyKXtyZXR1cm4gdHlwZW9mIHI9PSJvYmplY3QiJiZyIT09bnVsbCYmIm1lc3NhZ2UiaW4gciYmdHlwZW9mIHIubWVzc2FnZT09InN0cmluZyJ9ZnVuY3Rpb24gVHIocil7aWYoRXIocikpcmV0dXJuIHI7dHJ5e3JldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkocikpfWNhdGNoe3JldHVybiBuZXcgRXJyb3IoU3RyaW5nKHIpKX19ZnVuY3Rpb24gZ2Uocil7cmV0dXJuIFRyKHIpLm1lc3NhZ2V9dmFyIHllOyhmdW5jdGlvbihyKXtyLkZQU19EUk9QPSJmcHNfZHJvcCJ9KSh5ZXx8KHllPXt9KSk7Y29uc3QgUHI9NTAwLFJyPS44O2NsYXNzIFNyIGV4dGVuZHMgbWV7Y29uc3RydWN0b3IoZSx0KXtzdXBlcigpLHRoaXMuaW5kZXhfPXQsdGhpcy51dWlkXz1HZSgpLHRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfPTAsdGhpcy50cmFuc2Zvcm1lcl89ZSx0aGlzLnNob3VsZFN0b3BfPSExLHRoaXMuaXNGbGFzaGVkXz0hMSx0aGlzLmZyYW1lc0Zyb21Tb3VyY2VfPTAsdGhpcy5mcHNfPTAsdGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfPTAsdGhpcy52aWRlb0hlaWdodF89MCx0aGlzLnZpZGVvV2lkdGhfPTAsdGhpcy50cmFja0V4cGVjdGVkUmF0ZV89LTEsdGhpcy50cmFuc2Zvcm1lclR5cGVfPSJDdXN0b20iLCJnZXRUcmFuc2Zvcm1lclR5cGUiaW4gZSYmKHRoaXMudHJhbnNmb3JtZXJUeXBlXz1lLmdldFRyYW5zZm9ybWVyVHlwZSgpKTtjb25zdCBzPW5ldyBfKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkNyZWF0ZSIpLmJ1aWxkKCk7Yi5yZXBvcnQocyl9c2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl7dGhpcy50cmFja0V4cGVjdGVkUmF0ZV89ZX1hc3luYyBzdGFydChlKXtpZih0aGlzLmNvbnRyb2xsZXJfPWUsdGhpcy50cmFuc2Zvcm1lcl8mJnR5cGVvZiB0aGlzLnRyYW5zZm9ybWVyXy5zdGFydD09ImZ1bmN0aW9uIil0cnl7YXdhaXQgdGhpcy50cmFuc2Zvcm1lcl8uc3RhcnQoZSl9Y2F0Y2godCl7Y29uc3Qgcz1uZXcgXygpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShQLmVycm9ycy50cmFuc2Zvcm1lcl9zdGFydCkudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmFyaWF0aW9uKCJFcnJvciIpLmVycm9yKGdlKHQpKS5idWlsZCgpO2IucmVwb3J0KHMpO2NvbnN0IG49e2V2ZW50TWV0YURhdGE6e3RyYW5zZm9ybWVySW5kZXg6dGhpcy5pbmRleF99LGVycm9yOnQsZnVuY3Rpb246InN0YXJ0In07dGhpcy5lbWl0KCJlcnJvciIsbil9fWFzeW5jIHRyYW5zZm9ybShlLHQpe3ZhciBzLG4sbyxpO2lmKHRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXz09PTAmJih0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF89RGF0ZS5ub3coKSksZSBpbnN0YW5jZW9mIFZpZGVvRnJhbWUmJih0aGlzLnZpZGVvSGVpZ2h0Xz0ocz1lPT1udWxsP3ZvaWQgMDplLmRpc3BsYXlIZWlnaHQpIT1udWxsP3M6MCx0aGlzLnZpZGVvV2lkdGhfPShuPWU9PW51bGw/dm9pZCAwOmUuZGlzcGxheVdpZHRoKSE9bnVsbD9uOjApLCsrdGhpcy5mcmFtZXNGcm9tU291cmNlXyx0aGlzLnRyYW5zZm9ybWVyXylpZih0aGlzLnNob3VsZFN0b3BfKWNvbnNvbGUud2FybigiW1BpcGVsaW5lXSBmbHVzaCBmcm9tIHRyYW5zZm9ybSIpLGUuY2xvc2UoKSx0aGlzLmZsdXNoKHQpLHQudGVybWluYXRlKCk7ZWxzZSB0cnl7YXdhaXQoKGk9KG89dGhpcy50cmFuc2Zvcm1lcl8pLnRyYW5zZm9ybSk9PW51bGw/dm9pZCAwOmkuY2FsbChvLGUsdCkpLCsrdGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF8sdGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF89PT1QciYmdGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0KCl9Y2F0Y2goYSl7Y29uc3QgbD1uZXcgXygpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShQLmVycm9ycy50cmFuc2Zvcm1lcl90cmFuc2Zvcm0pLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiRXJyb3IiKS5lcnJvcihnZShhKSkuYnVpbGQoKTtiLnJlcG9ydChsKTtjb25zdCBtPXtldmVudE1ldGFEYXRhOnt0cmFuc2Zvcm1lckluZGV4OnRoaXMuaW5kZXhffSxlcnJvcjphLGZ1bmN0aW9uOiJ0cmFuc2Zvcm0ifTt0aGlzLmVtaXQoImVycm9yIixtKX19YXN5bmMgZmx1c2goZSl7aWYodGhpcy50cmFuc2Zvcm1lcl8mJnR5cGVvZiB0aGlzLnRyYW5zZm9ybWVyXy5mbHVzaD09ImZ1bmN0aW9uIiYmIXRoaXMuaXNGbGFzaGVkXyl7dGhpcy5pc0ZsYXNoZWRfPSEwO3RyeXthd2FpdCB0aGlzLnRyYW5zZm9ybWVyXy5mbHVzaChlKX1jYXRjaChzKXtjb25zdCBuPW5ldyBfKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKFAuZXJyb3JzLnRyYW5zZm9ybWVyX2ZsdXNoKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkVycm9yIikuZXJyb3IoZ2UocykpLmJ1aWxkKCk7Yi5yZXBvcnQobik7Y29uc3Qgbz17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sZXJyb3I6cyxmdW5jdGlvbjoiZmx1c2gifTt0aGlzLmVtaXQoImVycm9yIixvKX19dGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0KCk7Y29uc3QgdD1uZXcgXygpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmd1aWQodGhpcy51dWlkXykudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmFyaWF0aW9uKCJEZWxldGUiKS5idWlsZCgpO2IucmVwb3J0KHQpfXN0b3AoKXtjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBTdG9wIHN0cmVhbS4iKSx0aGlzLmNvbnRyb2xsZXJfJiYodGhpcy5mbHVzaCh0aGlzLmNvbnRyb2xsZXJfKSx0aGlzLmNvbnRyb2xsZXJfLnRlcm1pbmF0ZSgpKSx0aGlzLnNob3VsZFN0b3BfPSEwfW1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnQoKXtsZXQgZT0oRGF0ZS5ub3coKS10aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF8pLzFlMyx0PXRoaXMuZnJhbWVzRnJvbVNvdXJjZV8vZSxzPXRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfL2U7aWYodGhpcy50cmFja0V4cGVjdGVkUmF0ZV8hPS0xJiZ0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXypScj50KXtjb25zdCBvPXtldmVudE1ldGFEYXRhOnt0cmFuc2Zvcm1lckluZGV4OnRoaXMuaW5kZXhffSx3YXJuaW5nVHlwZTp5ZS5GUFNfRFJPUCxkcm9wSW5mbzp7cmVxdWVzdGVkOnRoaXMudHJhY2tFeHBlY3RlZFJhdGVfLGN1cnJlbnQ6dH19O3RoaXMuZW1pdCgid2FybiIsbyl9Y29uc3Qgbj1uZXcgXygpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmZwcyh0KS50cmFuc2Zvcm1lZEZwcyhzKS5mcmFtZXNUcmFuc2Zvcm1lZCh0aGlzLmZyYW1lc1RyYW5zZm9ybWVkXykuZ3VpZCh0aGlzLnV1aWRfKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52aWRlb0hlaWdodCh0aGlzLnZpZGVvSGVpZ2h0XykudmlkZW9XaWR0aCh0aGlzLnZpZGVvV2lkdGhfKS52YXJpYXRpb24oIlFvUyIpLmJ1aWxkKCk7Yi5yZXBvcnQobiksdGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfPTAsdGhpcy5mcmFtZXNGcm9tU291cmNlXz0wLHRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfPTB9fWNsYXNzIENyIGV4dGVuZHMgbWV7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLnRyYW5zZm9ybWVyc189W10sdGhpcy50cmFja0V4cGVjdGVkUmF0ZV89LTE7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2xldCBzPW5ldyBTcihlW3RdLHQpO3Mub24oImVycm9yIixuPT57dGhpcy5lbWl0KCJlcnJvciIsbil9KSxzLm9uKCJ3YXJuIixuPT57dGhpcy5lbWl0KCJ3YXJuIixuKX0pLHRoaXMudHJhbnNmb3JtZXJzXy5wdXNoKHMpfX1zZXRUcmFja0V4cGVjdGVkUmF0ZShlKXt0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz1lO2ZvcihsZXQgdCBvZiB0aGlzLnRyYW5zZm9ybWVyc18pdC5zZXRUcmFja0V4cGVjdGVkUmF0ZSh0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyl9YXN5bmMgc3RhcnQoZSx0KXtpZighdGhpcy50cmFuc2Zvcm1lcnNffHx0aGlzLnRyYW5zZm9ybWVyc18ubGVuZ3RoPT09MCl7Y29uc29sZS5sb2coIltQaXBlbGluZV0gTm8gdHJhbnNmb3JtZXJzLiIpO3JldHVybn10cnl7bGV0IHM9ZTtmb3IobGV0IG4gb2YgdGhpcy50cmFuc2Zvcm1lcnNfKWU9ZS5waXBlVGhyb3VnaChuZXcgVHJhbnNmb3JtU3RyZWFtKG4pKTtlLnBpcGVUbyh0KS50aGVuKGFzeW5jKCk9Pntjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBTZXR1cC4iKSxhd2FpdCB0LmFib3J0KCksYXdhaXQgcy5jYW5jZWwoKSx0aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIse21lc3NhZ2U6InBpcGVsaW5lX2VuZGVkIn0pfSkuY2F0Y2goYXN5bmMgbj0+e2UuY2FuY2VsKCkudGhlbigoKT0+e2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIFNodXR0aW5nIGRvd24gc3RyZWFtcyBhZnRlciBhYm9ydC4iKX0pLmNhdGNoKG89Pntjb25zb2xlLmVycm9yKCJbUGlwZWxpbmVdIEVycm9yIGZyb20gc3RyZWFtIHRyYW5zZm9ybToiLG8pfSksYXdhaXQgdC5hYm9ydChuKSxhd2FpdCBzLmNhbmNlbChuKSx0aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIse21lc3NhZ2U6InBpcGVsaW5lX2VuZGVkX3dpdGhfZXJyb3IifSl9KX1jYXRjaHt0aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIse21lc3NhZ2U6InBpcGVsaW5lX3N0YXJ0ZWRfd2l0aF9lcnJvciJ9KSx0aGlzLmRlc3Ryb3koKTtyZXR1cm59dGhpcy5lbWl0KCJwaXBlbGluZUluZm8iLHttZXNzYWdlOiJwaXBlbGluZV9zdGFydGVkIn0pLGNvbnNvbGUubG9nKCJbUGlwZWxpbmVdIFBpcGVsaW5lIHN0YXJ0ZWQuIil9YXN5bmMgZGVzdHJveSgpe2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIERlc3Ryb3lpbmcgUGlwZWxpbmUuIik7Zm9yKGxldCBlIG9mIHRoaXMudHJhbnNmb3JtZXJzXyllLnN0b3AoKX19Y2xhc3MgT3IgZXh0ZW5kcyBtZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy51dWlkXz1HZSgpLHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfPS0xO2NvbnN0IGU9bmV3IF8oKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS52YXJpYXRpb24oIkNyZWF0ZSIpLmJ1aWxkKCk7Yi5yZXBvcnQoZSl9c2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl7dGhpcy50cmFja0V4cGVjdGVkUmF0ZV89ZSx0aGlzLnBpcGVsaW5lXyYmdGhpcy5waXBlbGluZV8uc2V0VHJhY2tFeHBlY3RlZFJhdGUodGhpcy50cmFja0V4cGVjdGVkUmF0ZV8pfXRyYW5zZm9ybShlLHQpe3JldHVybiB0aGlzLnJlYWRhYmxlXz1lLHRoaXMud3JpdGFibGVfPXQsdGhpcy50cmFuc2Zvcm1JbnRlcm5hbCgpfXRyYW5zZm9ybUludGVybmFsKCl7cmV0dXJuIG5ldyBQcm9taXNlKChlLHQpPT57aWYoIXRoaXMudHJhbnNmb3JtZXJzX3x8dGhpcy50cmFuc2Zvcm1lcnNfLmxlbmd0aD09PTApe2NvbnN0IG49bmV3IF8oKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKFAuZXJyb3JzLnRyYW5zZm9ybWVyX25vbmUpLnZhcmlhdGlvbigiRXJyb3IiKS5idWlsZCgpO2IucmVwb3J0KG4pLHQoIltNZWRpYVByb2Nlc3Nvcl0gTmVlZCB0byBzZXQgdHJhbnNmb3JtZXJzLiIpO3JldHVybn1pZighdGhpcy5yZWFkYWJsZV8pe2NvbnN0IG49bmV3IF8oKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKFAuZXJyb3JzLnJlYWRhYmxlX251bGwpLnZhcmlhdGlvbigiRXJyb3IiKS5idWlsZCgpO2IucmVwb3J0KG4pLHQoIltNZWRpYVByb2Nlc3Nvcl0gUmVhZGFibGUgaXMgbnVsbC4iKTtyZXR1cm59aWYoIXRoaXMud3JpdGFibGVfKXtjb25zdCBuPW5ldyBfKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShQLmVycm9ycy53cml0YWJsZV9udWxsKS52YXJpYXRpb24oIkVycm9yIikuYnVpbGQoKTtiLnJlcG9ydChuKSx0KCJbTWVkaWFQcm9jZXNzb3JdIFdyaXRhYmxlIGlzIG51bGwuIik7cmV0dXJufWxldCBzPSExO3RoaXMucGlwZWxpbmVfJiYocz0hMCx0aGlzLnBpcGVsaW5lXy5jbGVhckxpc3RlbmVycygpLHRoaXMucGlwZWxpbmVfLmRlc3Ryb3koKSksdGhpcy5waXBlbGluZV89bmV3IENyKHRoaXMudHJhbnNmb3JtZXJzXyksdGhpcy5waXBlbGluZV8ub24oIndhcm4iLG49Pnt0aGlzLmVtaXQoIndhcm4iLG4pfSksdGhpcy5waXBlbGluZV8ub24oImVycm9yIixuPT57dGhpcy5lbWl0KCJlcnJvciIsbil9KSx0aGlzLnBpcGVsaW5lXy5vbigicGlwZWxpbmVJbmZvIixuPT57cyYmKG4ubWVzc2FnZT09PSJwaXBlbGluZV9zdGFydGVkIj9uLm1lc3NhZ2U9InBpcGVsaW5lX3Jlc3RhcnRlZCI6bi5tZXNzYWdlPT09InBpcGVsaW5lX3N0YXJ0ZWRfd2l0aF9lcnJvciImJihuLm1lc3NhZ2U9InBpcGVsaW5lX3Jlc3RhcnRlZF93aXRoX2Vycm9yIikpLHRoaXMuZW1pdCgicGlwZWxpbmVJbmZvIixuKX0pLHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfIT0tMSYmdGhpcy5waXBlbGluZV8uc2V0VHJhY2tFeHBlY3RlZFJhdGUodGhpcy50cmFja0V4cGVjdGVkUmF0ZV8pLHRoaXMucGlwZWxpbmVfLnN0YXJ0KHRoaXMucmVhZGFibGVfLHRoaXMud3JpdGFibGVfKS50aGVuKCgpPT57ZSgpfSkuY2F0Y2gobj0+e3Qobil9KX0pfXNldFRyYW5zZm9ybWVycyhlKXtjb25zdCB0PW5ldyBfKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShQLnVwZGF0ZXMudHJhbnNmb3JtZXJfbmV3KS52YXJpYXRpb24oIlVwZGF0ZSIpLmJ1aWxkKCk7cmV0dXJuIGIucmVwb3J0KHQpLHRoaXMudHJhbnNmb3JtZXJzXz1lLHRoaXMucmVhZGFibGVfJiZ0aGlzLndyaXRhYmxlXz90aGlzLnRyYW5zZm9ybUludGVybmFsKCk6UHJvbWlzZS5yZXNvbHZlKCl9ZGVzdHJveSgpe3JldHVybiBuZXcgUHJvbWlzZShlPT57dGhpcy5waXBlbGluZV8mJnRoaXMucGlwZWxpbmVfLmRlc3Ryb3koKTtjb25zdCB0PW5ldyBfKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykudmFyaWF0aW9uKCJEZWxldGUiKS5idWlsZCgpO2IucmVwb3J0KHQpLGUoKX0pfX12YXIgX2U9KHI9PihyLkxvdz0iTG93IixyLkhpZ2g9IkhpZ2giLHIpKShfZXx8e30pO2NsYXNzIFlle2NvbnN0cnVjdG9yKGUpe3RoaXMuYmx1ckZpbHRlcl89ZT09PV9lLkhpZ2g/ImJsdXIoMTVweCkiOiJibHVyKDVweCkifWRlc3Ryb3koKXtyZXR1cm4gbmV3IFByb21pc2UoZT0+e2UoKX0pfXJ1blBvc3RQcm9jZXNzaW5nKGUsdCl7dHJ5e2UuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdmVyIixlLmZpbHRlcj10aGlzLmJsdXJGaWx0ZXJfLGUuZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpfWNhdGNoKHMpe2NvbnNvbGUubG9nKCJbQmx1clBvc3RQcm9jZXNzXSBGYWlsZWQgdG8gZHJhdyBjYW52YXMiLHMpfX19Y2xhc3MgWmV7Y29uc3RydWN0b3IoKXt9ZGVzdHJveSgpe3JldHVybiBuZXcgUHJvbWlzZShlPT57dGhpcy5iZ0ltYWdlXyYmdGhpcy5iZ0ltYWdlXy5jbG9zZSgpLGUoKX0pfXNldFZpcnR1YWxCR0ltYWdlKGUpe3RoaXMuYmdJbWFnZV8mJnRoaXMuYmdJbWFnZV8uY2xvc2UoKSx0aGlzLmJnSW1hZ2VfPWV9YXN5bmMgcnVuUG9zdFByb2Nlc3NpbmcoZSx0KXtpZih0aGlzLmJnSW1hZ2VfKXtpZih0aGlzLmJnSW1hZ2VfLndpZHRoIT10LndpZHRofHx0aGlzLmJnSW1hZ2VfLmhlaWdodCE9dC5oZWlnaHQpe2NvbnN0IHM9ImhpZ2giLG49e3Jlc2l6ZVdpZHRoOnQud2lkdGgscmVzaXplSGVpZ2h0OnQuaGVpZ2h0LHJlc2l6ZVF1YWxpdHk6c307dHJ5e3RoaXMuYmdJbWFnZV89YXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAodGhpcy5iZ0ltYWdlXyxuKX1jYXRjaChvKXt0aHJvdyBvfX1lLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iZGVzdGluYXRpb24tb3ZlciIsZS5kcmF3SW1hZ2UodGhpcy5iZ0ltYWdlXywwLDAsdGhpcy5iZ0ltYWdlXy53aWR0aCx0aGlzLmJnSW1hZ2VfLmhlaWdodCl9fX1jbGFzcyBJcntjb25zdHJ1Y3RvcihlPTEvMCl7dGhpcy5jYXBhY2l0eT1lLHRoaXMuc3RvcmFnZT1bXX1lbnF1ZXVlKGUpe2lmKHRoaXMuc2l6ZSgpPT09dGhpcy5jYXBhY2l0eSl0aHJvdyBFcnJvcigiUXVldWUgaGFzIHJlYWNoZWQgbWF4IGNhcGFjaXR5LCB5b3UgY2Fubm90IGFkZCBtb3JlIGl0ZW1zIik7dGhpcy5zdG9yYWdlLnB1c2goZSl9ZGVxdWV1ZSgpe3JldHVybiB0aGlzLnN0b3JhZ2Uuc2hpZnQoKX1zaXplKCl7cmV0dXJuIHRoaXMuc3RvcmFnZS5sZW5ndGh9fWNvbnN0IGJlPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5xdWV1ZV89bmV3IElyfWNsZWFyUXVldWUocil7Zm9yKDt0aGlzLnF1ZXVlXy5zaXplKCk+MDspdGhpcy5xdWV1ZV8uZGVxdWV1ZSgpLmNsb3NlKCl9c2V0VmlkZW9SZWFkYWJsZShyKXtyZXR1cm4gbmV3IFByb21pc2UoKGUsdCk9Pnt0aGlzLmZyYW1lUmVhZGVyXz1yLmdldFJlYWRlcigpLHRoaXMuZnJhbWVSZWFkZXJfLnJlYWQoKS50aGVuKHM9Pnt0aGlzLnByb2Nlc3NGcmFtZShzKX0pLmNhdGNoKHM9Pnt0KHMpfSksZSgpfSl9ZGVzdHJveSgpe3JldHVybiBuZXcgUHJvbWlzZShhc3luYyhyLGUpPT57dmFyIHQ7dGhpcy5jbGVhclF1ZXVlKCEwKSx0aGlzLmZyYW1lUmVhZGVyXz8odD10aGlzLmZyYW1lUmVhZGVyXyk9PW51bGx8fHQuY2FuY2VsKCkudGhlbigoKT0+e3IoKX0pLmNhdGNoKHM9PntlKHMpfSk6cigpfSl9cHJvY2Vzc0ZyYW1lKHIpe2lmKCFyLmRvbmUpe2lmKCF0aGlzLmZyYW1lUmVhZGVyXyl7ci52YWx1ZS5jbG9zZSgpO3JldHVybn1mb3IoO3RoaXMucXVldWVfLnNpemUoKT49YmUuTlVNQkVSX09GX0ZSQU1FU19UT19DTEVBUjspe2xldCBlPXRoaXMucXVldWVfLmRlcXVldWUoKTtlJiZlLmNsb3NlKCl9dGhpcy5xdWV1ZV8uZW5xdWV1ZShyLnZhbHVlKSx0aGlzLmZyYW1lUmVhZGVyXy5yZWFkKCkudGhlbihlPT57dGhpcy5wcm9jZXNzRnJhbWUoZSl9KS5jYXRjaChlPT57Y29uc29sZS5lcnJvcihlKX0pfX1ydW5Qb3N0UHJvY2Vzc2luZyhyLGUpe3RyeXtpZihyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iZGVzdGluYXRpb24tb3ZlciIsdGhpcy5xdWV1ZV8uc2l6ZSgpPmJlLk5VTUJFUl9PRl9GUkFNRVNfVE9fQ0xFQVImJnRoaXMuY2xlYXJRdWV1ZSghMSksdGhpcy5xdWV1ZV8uc2l6ZSgpPjApe2NvbnN0IHQ9dGhpcy5xdWV1ZV8uZGVxdWV1ZSgpO3IuZHJhd0ltYWdlKHQsMCwwLGUud2lkdGgsZS5oZWlnaHQpLHQuY2xvc2UoKX19Y2F0Y2godCl7Y29uc29sZS5lcnJvcigiW1ZpZGVvUG9zdFByb2Nlc3NdIEZhaWxlZCB0byBkcmF3IGNhbnZhcyIsdCl9fX07bGV0IHdlPWJlO3dlLk5VTUJFUl9PRl9GUkFNRVNfVE9fQ0xFQVI9NTtjbGFzcyB4cntjb25zdHJ1Y3RvcihlKXt0aGlzLmJsdXJGaWx0ZXJfPWU9PT1fZS5IaWdoPyJibHVyKDE1cHgpIjoiYmx1cig1cHgpIn1kZXN0cm95KCl7cmV0dXJuIG5ldyBQcm9taXNlKGU9PntlKCl9KX1ydW5Qb3N0UHJvY2Vzc2luZyhlLHQpe3RyeXtlLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0ic291cmNlLWluIixlLmZpbHRlcj10aGlzLmJsdXJGaWx0ZXJfLGUuZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpLGUuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdmVyIixlLmZpbHRlcj0iYmx1cigwcHgpIixlLmRyYXdJbWFnZSh0LDAsMCx0LndpZHRoLHQuaGVpZ2h0KX1jYXRjaChzKXtjb25zb2xlLmxvZygiW0JsdXJQb3N0UHJvY2Vzc10gRmFpbGVkIHRvIGRyYXcgY2FudmFzIixzKX19fWNvbnN0IHc9Y2xhc3N7Y29uc3RydWN0b3IoKXtpZih0aGlzLmxhc3RQcm9jZXNzZWRUaW1lc3RhbXBfPTAsdGhpcy5uZXdJbnB1dENvdW50ZXI9MCx0aGlzLnRpbWVyR2FwXz13LkJMVVJfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05ELHRoaXMucmVzdWx0Q2FudmFzXz1uZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSksdGhpcy5yZXN1bHRDdHhfPXRoaXMucmVzdWx0Q2FudmFzXy5nZXRDb250ZXh0KCIyZCIse2FscGhhOiExLGRlc3luY2hyb25pemVkOiEwfSksIXRoaXMucmVzdWx0Q3R4Xyl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIik7aWYodGhpcy5zZWdtZW50YXRpb25NYXNrQ2FudmFzXz1uZXcgT2Zmc2NyZWVuQ2FudmFzKHcuU0VMRklFX1dJRFRILHcuU0VMRklFX0hJR0hUKSx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfPXRoaXMuc2VnbWVudGF0aW9uTWFza0NhbnZhc18uZ2V0Q29udGV4dCgiMmQiLHthbHBoYTohMSxkZXN5bmNocm9uaXplZDohMH0pLCF0aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfKXRocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQiKX1pbml0KHIpe3RoaXMucHJvY2Vzc0ZyYW1lQ2I9cn1hc3luYyBzZXRCYWNrZ3JvdW5kT3B0aW9ucyhyKXtpZih0eXBlb2YgdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV8hPSJ1bmRlZmluZWQiKXRyeXthd2FpdCB0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXy5kZXN0cm95KCl9Y2F0Y2goZSl7dGhyb3cgZX1pZihyLnRyYW5zZm9ybWVyVHlwZT09PSJWaXJ0dWFsQmFja2dyb3VuZCIpdGhpcy50aW1lckdhcF89dy5WSVJUVUFMX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORCx0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXz1uZXcgWmU7ZWxzZSBpZihyLnRyYW5zZm9ybWVyVHlwZT09PSJCYWNrZ3JvdW5kQmx1ciIpe2xldCBlPXI7dGhpcy50aW1lckdhcF89dy5CTFVSX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORCx0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXz1uZXcgWWUoZS5yYWRpdXMpfWVsc2UgaWYoci50cmFuc2Zvcm1lclR5cGU9PT0iVmlkZW9CYWNrZ3JvdW5kIil0aGlzLnRpbWVyR2FwXz13LkJMVVJfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05ELHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfPW5ldyB3ZTtlbHNlIGlmKHIudHJhbnNmb3JtZXJUeXBlPT09IlNpbHVldGVCbHVyIil7bGV0IGU9cjt0aGlzLnRpbWVyR2FwXz13LkJMVVJfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05ELHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfPW5ldyB4cihlLnJhZGl1cyl9ZWxzZSB0aGlzLnRpbWVyR2FwXz13LkJMVVJfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05ELHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfPW5ldyBZZX1jbG9zZSgpe3JldHVybiBuZXcgUHJvbWlzZSgocixlKT0+e3RoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfP3RoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfLmRlc3Ryb3koKS50aGVuKCgpPT57cigpfSkuY2F0Y2godD0+e2UodCl9KTpyKCl9KX1zdGFydCgpe31hc3luYyB0cmFuc2Zvcm0ocixlKXsodGhpcy5yZXN1bHRDYW52YXNfLndpZHRoIT1yLmRpc3BsYXlXaWR0aHx8dGhpcy5yZXN1bHRDYW52YXNfLmhlaWdodCE9ci5kaXNwbGF5SGVpZ2h0KSYmKHRoaXMucmVzdWx0Q2FudmFzXy53aWR0aD1yLmRpc3BsYXlXaWR0aCx0aGlzLnJlc3VsdENhbnZhc18uaGVpZ2h0PXIuZGlzcGxheUhlaWdodCk7Y29uc3QgdD1yLnRpbWVzdGFtcDtjcmVhdGVJbWFnZUJpdG1hcChyKS50aGVuKHM9PntyLmNsb3NlKCksdGhpcy5wcm9jZXNzRnJhbWUoZSxzLHQpfSkuY2F0Y2gocz0+e2UuZW5xdWV1ZShyKX0pfXByb2Nlc3NGcmFtZShyLGUsdCl7KHRoaXMubmV3SW5wdXRDb3VudGVyPHcuTkVXX0lOUFVUX05VTUJFUl9PRl9SVU5TfHx0LXRoaXMubGFzdFByb2Nlc3NlZFRpbWVzdGFtcF8+PXRoaXMudGltZXJHYXBfKSYmKHRoaXMubGFzdFByb2Nlc3NlZFRpbWVzdGFtcF89dCx0aGlzLnByb2Nlc3NTb3VyY2UoZSksdGhpcy5uZXdJbnB1dENvdW50ZXI8dy5ORVdfSU5QVVRfTlVNQkVSX09GX1JVTlMmJnRoaXMubmV3SW5wdXRDb3VudGVyKyspLHRoaXMucmVzdWx0Q3R4Xy5zYXZlKCksdGhpcy5yZXN1bHRDdHhfLmNsZWFyUmVjdCgwLDAsdGhpcy5yZXN1bHRDYW52YXNfLndpZHRoLHRoaXMucmVzdWx0Q2FudmFzXy5oZWlnaHQpLHRoaXMuc2VnbWVudGF0aW9uTWFza0ltYWdlXyYmKHRoaXMucmVzdWx0Q3R4Xy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImNvcHkiLHRoaXMucmVzdWx0Q3R4Xy5kcmF3SW1hZ2UodGhpcy5zZWdtZW50YXRpb25NYXNrSW1hZ2VfLDAsMCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tJbWFnZV8ud2lkdGgsdGhpcy5zZWdtZW50YXRpb25NYXNrSW1hZ2VfLmhlaWdodCwwLDAsdGhpcy5yZXN1bHRDYW52YXNfLndpZHRoLHRoaXMucmVzdWx0Q2FudmFzXy5oZWlnaHQpKSx0aGlzLnJlc3VsdEN0eF8uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJzb3VyY2UtYXRvcCIsdGhpcy5yZXN1bHRDdHhfLmZpbHRlcj0ibm9uZSIsdGhpcy5yZXN1bHRDdHhfLmRyYXdJbWFnZShlLDAsMCxlLndpZHRoLGUuaGVpZ2h0KSx0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXyYmdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV8ucnVuUG9zdFByb2Nlc3NpbmcodGhpcy5yZXN1bHRDdHhfLGUpLHRoaXMucmVzdWx0Q3R4Xy5yZXN0b3JlKCksci5lbnF1ZXVlKG5ldyBWaWRlb0ZyYW1lKHRoaXMucmVzdWx0Q2FudmFzXyx7dGltZXN0YW1wOnQsYWxwaGE6ImRpc2NhcmQifSkpLGUuY2xvc2UoKX1wcm9jZXNzU291cmNlKHIpe2lmKHRoaXMuc2VnbWVudGF0aW9uTWFza0N0eF8uY2xlYXJSZWN0KDAsMCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLndpZHRoLHRoaXMuc2VnbWVudGF0aW9uTWFza0NhbnZhc18uaGVpZ2h0KSx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfLmRyYXdJbWFnZShyLDAsMCxyLndpZHRoLHIuaGVpZ2h0LDAsMCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLndpZHRoLHRoaXMuc2VnbWVudGF0aW9uTWFza0NhbnZhc18uaGVpZ2h0KSx0aGlzLnByb2Nlc3NGcmFtZUNiKXtsZXQgZT10aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpO3RoaXMucHJvY2Vzc0ZyYW1lQ2IoZSl9fWZsdXNoKCl7fWdldFRyYW5zZm9ybWVyVHlwZSgpe3JldHVybiJCYWNrZ3JvdW5kVHJhbnNmb3JtZXIifXJlc2V0TmV3SW5wdXRDb3VuZXIoKXt0aGlzLm5ld0lucHV0Q291bnRlcj0wfXNldFZpZGVvQkdSZWFkYWJsZShyKXtyZXR1cm4gbmV3IFByb21pc2UoKGUsdCk9Pnt0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXyBpbnN0YW5jZW9mIHdlP3RoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfLnNldFZpZGVvUmVhZGFibGUocikudGhlbigoKT0+e2UoKX0pLmNhdGNoKHM9Pnt0KHMpfSk6dCgicG9zdCBwcm9jZXNzIGlzIG5vdCB2aWRlbyIpfSl9c2V0VmlydHVhbEJHSW1hZ2Uocil7cmV0dXJuIG5ldyBQcm9taXNlKChlLHQpPT57dGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV8gaW5zdGFuY2VvZiBaZT8odGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV8uc2V0VmlydHVhbEJHSW1hZ2UociksZSgpKTp0KCJwb3N0IHByb2Nlc3MgaXMgbm90IHZpZGVvIil9KX1zZXRTZWdtZW50YXRpb25NYXNrSW1hZ2Uocil7dGhpcy5zZWdtZW50YXRpb25NYXNrSW1hZ2VfJiZ0aGlzLnNlZ21lbnRhdGlvbk1hc2tJbWFnZV8uY2xvc2UoKSx0aGlzLnNlZ21lbnRhdGlvbk1hc2tJbWFnZV89cn19O2xldCBOPXc7Ti5CTFVSX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORD0yZTUsTi5WSVJUVUFMX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORD0xNWU0LE4uTkVXX0lOUFVUX05VTUJFUl9PRl9SVU5TPTMwLE4uU0VMRklFX1dJRFRIPTI1NixOLlNFTEZJRV9ISUdIVD0xNDQ7ZnVuY3Rpb24gTXIocil7cmV0dXJuIHR5cGVvZiByPT0ib2JqZWN0IiYmciE9PW51bGwmJiJtZXNzYWdlImluIHImJnR5cGVvZiByLm1lc3NhZ2U9PSJzdHJpbmcifWZ1bmN0aW9uIEFyKHIpe2lmKE1yKHIpKXJldHVybiByO3RyeXtyZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHIpKX1jYXRjaHtyZXR1cm4gbmV3IEVycm9yKFN0cmluZyhyKSl9fWZ1bmN0aW9uIFUocil7cmV0dXJuIHR5cGVvZiByPT0idW5kZWZpbmVkIj8iIjpBcihyKS5tZXNzYWdlfWlmKHR5cGVvZiBpbXBvcnRTY3JpcHRzPT0iZnVuY3Rpb24iKXtsZXQgcj1mdW5jdGlvbigpe3JldHVybiBuZXcgUHJvbWlzZSgocyxuKT0+e2U9bmV3IE9yLGUub24oImVycm9yIixpPT57Y29uc3QgYT17Y2FsbGJhY2tUeXBlOiJtZWRpYV9wcm9jZXNzb3JfZXJyb3JfZXZlbnQiLG1lc3NhZ2U6aX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSksZS5vbigid2FybiIsaT0+e2NvbnN0IGE9e2NhbGxiYWNrVHlwZToibWVkaWFfcHJvY2Vzc29yX3dhcm5fZXZlbnQiLG1lc3NhZ2U6aX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSksZS5vbigicGlwZWxpbmVJbmZvIixpPT57Y29uc3QgYT17Y2FsbGJhY2tUeXBlOiJtZWRpYV9wcm9jZXNzb3JfcGlwZWxpbmVfZXZlbnQiLG1lc3NhZ2U6aX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSksdD1uZXcgTix0LmluaXQoaT0+e3Bvc3RNZXNzYWdlKGksW2ldKX0pO2xldCBvPVtdO28ucHVzaCh0KSxlLnNldFRyYW5zZm9ybWVycyhvKS50aGVuKCgpPT57cygpfSkuY2F0Y2goaT0+e24oaSl9KX0pfSxlLHQ7b25tZXNzYWdlPWFzeW5jIHM9PntpZihzLmRhdGEgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCl7dCYmdC5zZXRTZWdtZW50YXRpb25NYXNrSW1hZ2Uocy5kYXRhKTtyZXR1cm59Y29uc3R7b3BlcmF0aW9uOm59PXMuZGF0YTtpZihuPT09ImluaXQiKXtjb25zdHttZXRhRGF0YTpvfT1zLmRhdGE7dHlwZW9mIG89PSJzdHJpbmciJiZkcihKU09OLnBhcnNlKG8pKSxyKCkudGhlbigoKT0+e2NvbnN0IGk9e2NhbGxiYWNrVHlwZToic3VjY2VzcyIsbWVzc2FnZTpufTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShpKSl9KS5jYXRjaChpPT57Y29uc3QgYT17Y2FsbGJhY2tUeXBlOiJlcnJvciIsbWVzc2FnZTpuLGVycm9yOlUoaSl9O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGEpKX0pfWVsc2UgaWYobj09PSJ0cmFuc2Zvcm0iKXtjb25zdHtyZWFkYWJsZTpvLHdyaXRhYmxlOml9PXMuZGF0YTt0LnJlc2V0TmV3SW5wdXRDb3VuZXIoKSxlLnRyYW5zZm9ybShvLGkpLnRoZW4oKCk9Pntjb25zdCBhPXtjYWxsYmFja1R5cGU6InN1Y2Nlc3MiLG1lc3NhZ2U6bn07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSkuY2F0Y2goYT0+e2NvbnN0IGw9e2NhbGxiYWNrVHlwZToiZXJyb3IiLG1lc3NhZ2U6bixlcnJvcjpVKGEpfTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShsKSl9KX1lbHNlIGlmKG49PT0iZGVzdHJveSIpdC5jbG9zZSgpLmZpbmFsbHkoKCk9PntlLmRlc3Ryb3koKS50aGVuKCgpPT57Y29uc3Qgbz17Y2FsbGJhY2tUeXBlOiJzdWNjZXNzIixtZXNzYWdlOm59O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KG8pKX0pLmNhdGNoKG89Pntjb25zdCBpPXtjYWxsYmFja1R5cGU6ImVycm9yIixtZXNzYWdlOm4sZXJyb3I6VShvKX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoaSkpfSl9KTtlbHNlIGlmKG49PT0ic2V0VHJhY2tFeHBlY3RlZFJhdGUiKXtlLnNldFRyYWNrRXhwZWN0ZWRSYXRlKHMuZGF0YS5yYXRlKTtjb25zdCBvPXtjYWxsYmFja1R5cGU6InN1Y2Nlc3MiLG1lc3NhZ2U6bn07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkobykpfWVsc2UgaWYobj09PSJzZXRCYWNrZ3JvdW5kT3B0aW9ucyIpe2NvbnN0e2JhY2tncm91bmRPcHRpb25zOm99PXMuZGF0YTt0LnNldEJhY2tncm91bmRPcHRpb25zKEpTT04ucGFyc2UobykpLnRoZW4oKCk9Pntjb25zdCBpPXtjYWxsYmFja1R5cGU6InN1Y2Nlc3MiLG1lc3NhZ2U6bn07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoaSkpfSkuY2F0Y2goaT0+e2NvbnN0IGE9e2NhbGxiYWNrVHlwZToiZXJyb3IiLG1lc3NhZ2U6bixlcnJvcjpVKGkpfTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShhKSl9KX1lbHNlIGlmKG49PT0ic2V0VmlkZW9CR1JlYWRhYmxlIil7Y29uc3R7cmVhZGFibGU6b309cy5kYXRhO3Quc2V0VmlkZW9CR1JlYWRhYmxlKG8pLnRoZW4oKCk9Pntjb25zdCBpPXtjYWxsYmFja1R5cGU6InN1Y2Nlc3MiLG1lc3NhZ2U6bn07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoaSkpfSkuY2F0Y2goaT0+e2NvbnN0IGE9e2NhbGxiYWNrVHlwZToiZXJyb3IiLG1lc3NhZ2U6bixlcnJvcjpVKGkpfTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShhKSl9KX1lbHNlIGlmKG49PT0ic2V0VmlydHVhbEJHSW1hZ2UiKXtjb25zdHtpbWFnZTpvfT1zLmRhdGE7dC5zZXRWaXJ0dWFsQkdJbWFnZShvKS50aGVuKCgpPT57Y29uc3QgaT17Y2FsbGJhY2tUeXBlOiJzdWNjZXNzIixtZXNzYWdlOm59O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGkpKX0pLmNhdGNoKGk9Pntjb25zdCBhPXtjYWxsYmFja1R5cGU6ImVycm9yIixtZXNzYWdlOm4sZXJyb3I6VShpKX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSl9fX19KSgpOwo=",sl=typeof window!="undefined"&&window.Blob&&new Blob([atob(dl)],{type:"text/javascript;charset=utf-8"});function zt(){const c=sl&&(window.URL||window.webkitURL).createObjectURL(sl);try{return c?new Worker(c,{}):new Worker("data:application/javascript;base64,"+dl,{type:"module"})}finally{c&&(window.URL||window.webkitURL).revokeObjectURL(c)}}const f=new WeakMap,le=new WeakMap,T=new WeakMap,We=Symbol("anyProducer"),al=Promise.resolve(),te=Symbol("listenerAdded"),ce=Symbol("listenerRemoved");let Ve=!1;function g(c){if(typeof c!="string"&&typeof c!="symbol")throw new TypeError("eventName must be a string or a symbol")}function ie(c){if(typeof c!="function")throw new TypeError("listener must be a function")}function v(c,e){const l=le.get(c);return l.has(e)||l.set(e,new Set),l.get(e)}function B(c,e){const l=typeof e=="string"||typeof e=="symbol"?e:We,t=T.get(c);return t.has(l)||t.set(l,new Set),t.get(l)}function Ft(c,e,l){const t=T.get(c);if(t.has(e))for(const i of t.get(e))i.enqueue(l);if(t.has(We)){const i=Promise.all([e,l]);for(const d of t.get(We))d.enqueue(i)}}function ol(c,e){e=Array.isArray(e)?e:[e];let l=!1,t=()=>{},i=[];const d={enqueue(n){i.push(n),t()},finish(){l=!0,t()}};for(const n of e)B(c,n).add(d);return{async next(){return i?i.length===0?l?(i=void 0,this.next()):(await new Promise(n=>{t=n}),this.next()):{done:!1,value:await i.shift()}:{done:!0}},async return(n){i=void 0;for(const s of e)B(c,s).delete(d);return t(),arguments.length>0?{done:!0,value:await n}:{done:!0}},[Symbol.asyncIterator](){return this}}}function rl(c){if(c===void 0)return Zl;if(!Array.isArray(c))throw new TypeError("`methodNames` must be an array of strings");for(const e of c)if(!Zl.includes(e))throw typeof e!="string"?new TypeError("`methodNames` element must be a string"):new Error(`${e} is not Emittery method`);return c}const Re=c=>c===te||c===ce;class Y{static mixin(e,l){return l=rl(l),t=>{if(typeof t!="function")throw new TypeError("`target` must be function");for(const n of l)if(t.prototype[n]!==void 0)throw new Error(`The property \`${n}\` already exists on \`target\``);function i(){return Object.defineProperty(this,e,{enumerable:!1,value:new Y}),this[e]}Object.defineProperty(t.prototype,e,{enumerable:!1,get:i});const d=n=>function(...s){return this[e][n](...s)};for(const n of l)Object.defineProperty(t.prototype,n,{enumerable:!1,value:d(n)});return t}}static get isDebugEnabled(){if(typeof process!="object")return Ve;const{env:e}=process||{env:{}};return e.DEBUG==="emittery"||e.DEBUG==="*"||Ve}static set isDebugEnabled(e){Ve=e}constructor(e={}){f.set(this,new Set),le.set(this,new Map),T.set(this,new Map),this.debug=e.debug||{},this.debug.enabled===void 0&&(this.debug.enabled=!1),this.debug.logger||(this.debug.logger=(l,t,i,d)=>{try{d=JSON.stringify(d)}catch{d=`Object with the following keys failed to stringify: ${Object.keys(d).join(",")}`}typeof i=="symbol"&&(i=i.toString());const n=new Date,s=`${n.getHours()}:${n.getMinutes()}:${n.getSeconds()}.${n.getMilliseconds()}`;console.log(`[${s}][emittery:${l}][${t}] Event Name: ${i}
4
+ data: ${d}`)})}logIfDebugEnabled(e,l,t){(Y.isDebugEnabled||this.debug.enabled)&&this.debug.logger(e,this.debug.name,l,t)}on(e,l){ie(l),e=Array.isArray(e)?e:[e];for(const t of e)g(t),v(this,t).add(l),this.logIfDebugEnabled("subscribe",t,void 0),Re(t)||this.emit(te,{eventName:t,listener:l});return this.off.bind(this,e,l)}off(e,l){ie(l),e=Array.isArray(e)?e:[e];for(const t of e)g(t),v(this,t).delete(l),this.logIfDebugEnabled("unsubscribe",t,void 0),Re(t)||this.emit(ce,{eventName:t,listener:l})}once(e){return new Promise(l=>{const t=this.on(e,i=>{t(),l(i)})})}events(e){e=Array.isArray(e)?e:[e];for(const l of e)g(l);return ol(this,e)}async emit(e,l){g(e),this.logIfDebugEnabled("emit",e,l),Ft(this,e,l);const t=v(this,e),i=f.get(this),d=[...t],n=Re(e)?[]:[...i];await al,await Promise.all([...d.map(async s=>{if(t.has(s))return s(l)}),...n.map(async s=>{if(i.has(s))return s(e,l)})])}async emitSerial(e,l){g(e),this.logIfDebugEnabled("emitSerial",e,l);const t=v(this,e),i=f.get(this),d=[...t],n=[...i];await al;for(const s of d)t.has(s)&&await s(l);for(const s of n)i.has(s)&&await s(e,l)}onAny(e){return ie(e),this.logIfDebugEnabled("subscribeAny",void 0,void 0),f.get(this).add(e),this.emit(te,{listener:e}),this.offAny.bind(this,e)}anyEvent(){return ol(this)}offAny(e){ie(e),this.logIfDebugEnabled("unsubscribeAny",void 0,void 0),this.emit(ce,{listener:e}),f.get(this).delete(e)}clearListeners(e){e=Array.isArray(e)?e:[e];for(const l of e)if(this.logIfDebugEnabled("clear",l,void 0),typeof l=="string"||typeof l=="symbol"){v(this,l).clear();const t=B(this,l);for(const i of t)i.finish();t.clear()}else{f.get(this).clear();for(const t of le.get(this).values())t.clear();for(const t of T.get(this).values()){for(const i of t)i.finish();t.clear()}}}listenerCount(e){e=Array.isArray(e)?e:[e];let l=0;for(const t of e){if(typeof t=="string"){l+=f.get(this).size+v(this,t).size+B(this,t).size+B(this).size;continue}typeof t!="undefined"&&g(t),l+=f.get(this).size;for(const i of le.get(this).values())l+=i.size;for(const i of T.get(this).values())l+=i.size}return l}bindMethods(e,l){if(typeof e!="object"||e===null)throw new TypeError("`target` must be an object");l=rl(l);for(const t of l){if(e[t]!==void 0)throw new Error(`The property \`${t}\` already exists on \`target\``);Object.defineProperty(e,t,{enumerable:!1,value:this[t].bind(this)})}}}const Zl=Object.getOwnPropertyNames(Y.prototype).filter(c=>c!=="constructor");Object.defineProperty(Y,"listenerAdded",{value:te,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(Y,"listenerRemoved",{value:ce,writable:!1,enumerable:!0,configurable:!1});var ml=Y;const J=class{constructor(){this.mediapipeMap_=new Map}getVersion(c){switch(c){case"face_detection":return K.VERSION;case"face_mesh":return Ye.VERSION;case"hands":return Ie.VERSION;case"holistic":return Ke.VERSION;case"objectron":return Se.VERSION;case"selfie_segmentation":return He.VERSION;case"pose":return Le.VERSION;default:return""}}initialize(c){return new Promise(async(e,l)=>{if(c.mediaPipeModelConfigArray.length==0){l("no model was selected");return}for(let t=0;t<c.mediaPipeModelConfigArray.length;t++){const i=c.mediaPipeModelConfigArray[t];if(this.mediapipeMap_.has(i.modelType)){l("setting same type is not supported");return}if(typeof i.listener!="function"){l(`[${i.modelType}] ResultsListener must be provided`);return}let d;switch(i.modelType){case"face_mesh":d=new Ye.FaceMesh({locateFile:(n,s)=>(i.assetsUri||J.defaultAssetsBaseUrl+"face_mesh/"+this.getVersion("face_mesh"))+"/"+n});break;case"face_detection":d=new K.FaceDetection({locateFile:(n,s)=>(i.assetsUri||J.defaultAssetsBaseUrl+"face_detection/"+this.getVersion("face_detection"))+"/"+n});break;case"hands":if(d=new Ie.Hands({locateFile:(n,s)=>(i.assetsUri||J.defaultAssetsBaseUrl+"hands/"+this.getVersion("hands"))+"/"+n}),i.options){let n=i.options;n.modelComplexity||(console.warn("hands model require modelComplexity setting to 0"),n.modelComplexity=0)}else{console.warn("hands model require modelComplexity setting to 0");let n={modelComplexity:0};i.options=n}break;case"holistic":d=new Ke.Holistic({locateFile:(n,s)=>(i.assetsUri||J.defaultAssetsBaseUrl+"holistic/"+this.getVersion("holistic"))+"/"+n});break;case"objectron":d=new Se.Objectron({locateFile:(n,s)=>(i.assetsUri||J.defaultAssetsBaseUrl+"objectron/"+this.getVersion("objectron"))+"/"+n});break;case"selfie_segmentation":d=new He.SelfieSegmentation({locateFile:(n,s)=>(i.assetsUri||J.defaultAssetsBaseUrl+"selfie_segmentation/"+this.getVersion("selfie_segmentation"))+"/"+n});break;case"pose":d=new Le.Pose({locateFile:(n,s)=>(i.assetsUri||J.defaultAssetsBaseUrl+"pose/"+this.getVersion("pose"))+"/"+n});break;default:l("unknown model type");return}d.onResults(i.listener),i.options&&d.setOptions(i.options);try{await d.initialize(),this.mediapipeMap_.set(i.modelType,d)}catch(n){l(n);return}}e()})}close(c){return new Promise((e,l)=>{let t=[];if(c){let i=this.mediapipeMap_.get(c);if(i)this.mediapipeMap_.delete(c),t.push(i.close());else{l("model not exit");return}}else{for(const[i,d]of this.mediapipeMap_.entries())t.push(d.close());this.mediapipeMap_.clear()}Promise.all(t).then(()=>{e()}).catch(i=>{l(i)})})}send(c,e){return new Promise((l,t)=>{let i=[];if(e){let d=this.mediapipeMap_.get(e);if(d)i.push(d.send({image:c}));else{t("model not exit");return}}else for(const[d,n]of this.mediapipeMap_.entries())i.push(n.send({image:c}));Promise.all(i).then(()=>{l()}).catch(d=>{t(d)})})}reset(c){if(c){let e=this.mediapipeMap_.get(c);e&&typeof e.reset=="function"&&e.reset()}else for(const[e,l]of this.mediapipeMap_.entries())l&&typeof l.reset=="function"&&l.reset()}};let fe=J;fe.defaultAssetsBaseUrl="https://d3opqjmqzxf057.cloudfront.net/ml/mediapipe/";class bl{static createVideoReadable(e){return new Promise((l,t)=>{const i=document.createElement("video");let d=new AbortController,n=new AbortController;i.addEventListener("canplay",()=>{d.abort(),i.muted=!0,i.loop=!0,i.play().then(()=>{try{const s=i.captureStream(),o=new MediaStreamTrackProcessor(s.getVideoTracks()[0]);l(o.readable)}catch(s){t(s)}})},{once:!0,signal:n.signal}),i.addEventListener("error",s=>{n.abort(),t("loading error:"+s)},{once:!0,signal:d.signal}),i.src=e})}static createImageCanvas(e){return new Promise((l,t)=>{var i=new Image;i.onload=function(){createImageBitmap(i).then(d=>{i.remove(),l(d)}).catch(d=>{t(d)})},i.onerror=function(d){t(d)},i.src=e})}}class gt extends ml{constructor(){super(),this.worker_=new zt,this.trackExpectedRate_=-1,this.workerInited_=!1,this.mediapipeHelper_=new fe,this.innerEmitty_=new ml,this.worker_.addEventListener("message",e=>{if(e.data instanceof ImageBitmap)this.mediapipeHelper_.send(e.data).then(()=>{e.data.close()}).catch(l=>{let t={error:l,eventMetaData:{transformerIndex:-1},function:"transform"};this.emit("error",t)});else{let l=JSON.parse(e.data);if(l.callbackType==="success"||l.callbackType==="error")l.message==="init"?this.innerEmitty_.emit("initResults",e.data):l.message==="transform"?this.innerEmitty_.emit("transformResults",e.data):l.message==="destroy"?this.innerEmitty_.emit("destroyResults",e.data):l.message==="setBackgroundOptions"?this.innerEmitty_.emit("setBackgroundOptionsResults",e.data):l.message==="setVideoBGReadable"?this.innerEmitty_.emit("setVideoBGReadableResults",e.data):l.message==="setVirtualBGImage"&&this.innerEmitty_.emit("setVirtualBGImageResults",e.data);else if(l.callbackType==="media_processor_error_event")this.emit("error",l.message);else if(l.callbackType==="media_processor_warn_event")this.emit("warn",l.message);else if(l.callbackType==="media_processor_pipeline_event"){this.emit("pipelineInfo",l.message);let t=l.message;(t.message==="pipeline_ended"||t.message==="pipeline_ended_with_error")&&this.mediapipeHelper_.close().finally(()=>{this.worker_&&(this.worker_.terminate(),this.workerInited_=!1,this.worker_=void 0)})}}})}init(e){return new Promise((l,t)=>{if(!this.worker_){t("worker is off");return}let i={modelSelection:1,selfieMode:!1};this.mediapipeHelper_.initialize({mediaPipeModelConfigArray:[{assetsUri:e.mediapipeBaseAssetsUri,modelType:"selfie_segmentation",options:i,listener:d=>{let n=d;this.worker_&&this.worker_.postMessage(n.segmentationMask,[n.segmentationMask])}}]}).then(()=>{let d=JSON.stringify(Kt());if(typeof d!="string"&&(d=JSON.stringify({})),!this.worker_){t("worker is off");return}this.worker_.postMessage({operation:"init",metaData:d}),this.innerEmitty_.once("initResults").then(n=>{let s=JSON.parse(n);s.callbackType==="success"?(this.workerInited_=!0,this.trackExpectedRate_!=-1&&this.postTrackExpectedRate(),this.setBackgroundOptions(e).then(()=>{l()}).catch(o=>{t(o)})):t(s.error)}).catch(n=>{t(n)})}).catch(d=>{t(d)})})}transform(e,l){return new Promise(async(t,i)=>{if(!this.worker_){i("worker is off");return}this.worker_.postMessage({operation:"transform",readable:e,writable:l},[e,l]),this.innerEmitty_.once("transformResults").then(d=>{let n=JSON.parse(d);n.callbackType==="success"?t():i(n.error)}).catch(d=>{i(d)})})}destroy(){return new Promise(async(e,l)=>{if(!this.worker_){e();return}this.worker_.postMessage({operation:"destroy"}),this.innerEmitty_.once("destroyResults").then(t=>{let i=JSON.parse(t);i.callbackType==="success"?this.mediapipeHelper_.close().then(()=>{e()}).catch(d=>{l(d)}):l(i.error)}).catch(t=>{l(t)})})}setTrackExpectedRate(e){this.trackExpectedRate_=e,this.postTrackExpectedRate()}postTrackExpectedRate(){this.workerInited_&&this.worker_.postMessage({operation:"setTrackExpectedRate",rate:this.trackExpectedRate_})}setBackgroundOptions(e){return new Promise((l,t)=>{if(!this.worker_){t("worker is off");return}this.worker_.postMessage({operation:"setBackgroundOptions",backgroundOptions:JSON.stringify(e)}),this.innerEmitty_.once("setBackgroundOptionsResults").then(i=>{let d=JSON.parse(i);d.callbackType==="success"?e.transformerType==="VideoBackground"?bl.createVideoReadable(e.backgroundAssetUri).then(n=>{if(!this.worker_){t("worker is off");return}this.worker_.postMessage({operation:"setVideoBGReadable",readable:n},[n]),this.innerEmitty_.once("setVideoBGReadableResults").then(s=>{let o=JSON.parse(s);o.callbackType==="success"?l():t(o.error)}).catch(s=>{t(s)})}).catch(n=>{t(n)}):e.transformerType==="VirtualBackground"?bl.createImageCanvas(e.backgroundAssetUri).then(n=>{if(!this.worker_){t("worker is off");return}this.worker_.postMessage({operation:"setVirtualBGImage",image:n},[n]),this.innerEmitty_.once("setVirtualBGImageResults").then(s=>{let o=JSON.parse(s);o.callbackType==="success"?l():t(o.error)}).catch(s=>{t(s)})}).catch(n=>{t(n)}):l():t(d.error)}).catch(i=>{t(i)})})}}var ul=(c=>(c.Low="Low",c.High="High",c))(ul||{});const vt=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11]));function Ut(){return new Promise(async(c,e)=>{try{await Xl()}catch(l){e(l);return}vt().then(l=>{if(l===!1){e("Your browser does not support WebAssembly features.");return}c()}).catch(l=>{e(l)})})}let W,ne=-1;function kt(){return W}function xt(c){ne=c,typeof W!="undefined"&&W.setTrackExpectedRate(ne)}function Ct(c){return new Promise(async(e,l)=>{W=new gt,ne!=-1&&W.setTrackExpectedRate(ne),W.init(c).then(()=>{const t=new Nt(W);e(t)}).catch(t=>{l(t)})})}function Tt(c){return new Promise((e,l)=>{W?W.setBackgroundOptions(c).then(()=>{e()}).catch(t=>{l(t)}):l("media processor is not set")})}Z.BlurRadius=ul,Z.MediapipeHelper=fe,Z.createVonageMediaProcessorConnector=Ct,Z.getVonageEventEmitter=kt,Z.isSupported=Ut,Z.setBackgroundOptions=Tt,Z.setTrackExpectedRate=xt,Object.defineProperties(Z,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vonage/ml-transformers",
3
- "version": "2.0.1",
3
+ "version": "2.0.2",
4
4
  "author": "Guy Mininberg <guy.mininberg@vonage.com>",
5
5
  "contributors": [
6
6
  "Guy Mininberg <guy.mininberg@vonage.com>",