@vonage/ml-transformers 4.2.1 → 4.3.0

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.
@@ -1,6 +1,6 @@
1
- (function(ze,qn){typeof exports=="object"&&typeof module<"u"?qn(exports):typeof define=="function"&&define.amd?define(["exports"],qn):(ze=typeof globalThis<"u"?globalThis:ze||self,qn(ze["ml-transformers"]={}))})(this,function(ze){"use strict";var P3=Object.defineProperty;var O3=(ze,qn,Pn)=>qn in ze?P3(ze,qn,{enumerable:!0,configurable:!0,writable:!0,value:Pn}):ze[qn]=Pn;var Ht=(ze,qn,Pn)=>(O3(ze,typeof qn!="symbol"?qn+"":qn,Pn),Pn);function qn(){return new Promise((o,n)=>{typeof MediaStreamTrackProcessor>"u"||typeof MediaStreamTrackGenerator>"u"?n("Your browser does not support the MediaStreamTrack API for Insertable Streams of Media."):o()})}class Pn{}Pn.updates={transformer_new:"New transformer",transformer_null:"Null transformer"},Pn.errors={transformer_none:"No transformers provided",transformer_start:"Cannot start transformer",transformer_transform:"Cannot transform frame",transformer_flush:"Cannot flush transformer",readable_null:"Readable is null",writable_null:"Writable is null"};var Oi={exports:{}},ns=function(n,r){return function(){for(var Z=new Array(arguments.length),I=0;I<Z.length;I++)Z[I]=arguments[I];return n.apply(r,Z)}},fu=ns,ur=Object.prototype.toString;function _i(o){return Array.isArray(o)}function Qi(o){return typeof o>"u"}function mu(o){return o!==null&&!Qi(o)&&o.constructor!==null&&!Qi(o.constructor)&&typeof o.constructor.isBuffer=="function"&&o.constructor.isBuffer(o)}function rs(o){return ur.call(o)==="[object ArrayBuffer]"}function pu(o){return ur.call(o)==="[object FormData]"}function bu(o){var n;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?n=ArrayBuffer.isView(o):n=o&&o.buffer&&rs(o.buffer),n}function yu(o){return typeof o=="string"}function gu(o){return typeof o=="number"}function is(o){return o!==null&&typeof o=="object"}function qr(o){if(ur.call(o)!=="[object Object]")return!1;var n=Object.getPrototypeOf(o);return n===null||n===Object.prototype}function Zu(o){return ur.call(o)==="[object Date]"}function vu(o){return ur.call(o)==="[object File]"}function Gu(o){return ur.call(o)==="[object Blob]"}function os(o){return ur.call(o)==="[object Function]"}function Xu(o){return is(o)&&os(o.pipe)}function Wu(o){return ur.call(o)==="[object URLSearchParams]"}function Vu(o){return o.trim?o.trim():o.replace(/^\s+|\s+$/g,"")}function Ru(){return typeof navigator<"u"&&(navigator.product==="ReactNative"||navigator.product==="NativeScript"||navigator.product==="NS")?!1:typeof window<"u"&&typeof document<"u"}function Di(o,n){if(!(o===null||typeof o>"u"))if(typeof o!="object"&&(o=[o]),_i(o))for(var r=0,m=o.length;r<m;r++)n.call(null,o[r],r,o);else for(var Z in o)Object.prototype.hasOwnProperty.call(o,Z)&&n.call(null,o[Z],Z,o)}function $i(){var o={};function n(Z,I){qr(o[I])&&qr(Z)?o[I]=$i(o[I],Z):qr(Z)?o[I]=$i({},Z):_i(Z)?o[I]=Z.slice():o[I]=Z}for(var r=0,m=arguments.length;r<m;r++)Di(arguments[r],n);return o}function xu(o,n,r){return Di(n,function(Z,I){r&&typeof Z=="function"?o[I]=fu(Z,r):o[I]=Z}),o}function Iu(o){return o.charCodeAt(0)===65279&&(o=o.slice(1)),o}var Qn={isArray:_i,isArrayBuffer:rs,isBuffer:mu,isFormData:pu,isArrayBufferView:bu,isString:yu,isNumber:gu,isObject:is,isPlainObject:qr,isUndefined:Qi,isDate:Zu,isFile:vu,isBlob:Gu,isFunction:os,isStream:Xu,isURLSearchParams:Wu,isStandardBrowserEnv:Ru,forEach:Di,merge:$i,extend:xu,trim:Vu,stripBOM:Iu},Ir=Qn;function ss(o){return encodeURIComponent(o).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}var ls=function(n,r,m){if(!r)return n;var Z;if(m)Z=m(r);else if(Ir.isURLSearchParams(r))Z=r.toString();else{var I=[];Ir.forEach(r,function(E,rt){E===null||typeof E>"u"||(Ir.isArray(E)?rt=rt+"[]":E=[E],Ir.forEach(E,function(lt){Ir.isDate(lt)?lt=lt.toISOString():Ir.isObject(lt)&&(lt=JSON.stringify(lt)),I.push(ss(rt)+"="+ss(lt))}))}),Z=I.join("&")}if(Z){var F=n.indexOf("#");F!==-1&&(n=n.slice(0,F)),n+=(n.indexOf("?")===-1?"?":"&")+Z}return n},Su=Qn;function ti(){this.handlers=[]}ti.prototype.use=function(n,r,m){return this.handlers.push({fulfilled:n,rejected:r,synchronous:m?m.synchronous:!1,runWhen:m?m.runWhen:null}),this.handlers.length-1},ti.prototype.eject=function(n){this.handlers[n]&&(this.handlers[n]=null)},ti.prototype.forEach=function(n){Su.forEach(this.handlers,function(m){m!==null&&n(m)})};var Lu=ti,Yu=Qn,Tu=function(n,r){Yu.forEach(n,function(Z,I){I!==r&&I.toUpperCase()===r.toUpperCase()&&(n[r]=Z,delete n[I])})},us=function(n,r,m,Z,I){return n.config=r,m&&(n.code=m),n.request=Z,n.response=I,n.isAxiosError=!0,n.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}},n},wu=us,cs=function(n,r,m,Z,I){var F=new Error(n);return wu(F,r,m,Z,I)},Fu=cs,Hu=function(n,r,m){var Z=m.config.validateStatus;!m.status||!Z||Z(m.status)?n(m):r(Fu("Request failed with status code "+m.status,m.config,null,m.request,m))},ei=Qn,Cu=ei.isStandardBrowserEnv()?function(){return{write:function(r,m,Z,I,F,L){var E=[];E.push(r+"="+encodeURIComponent(m)),ei.isNumber(Z)&&E.push("expires="+new Date(Z).toGMTString()),ei.isString(I)&&E.push("path="+I),ei.isString(F)&&E.push("domain="+F),L===!0&&E.push("secure"),document.cookie=E.join("; ")},read:function(r){var m=document.cookie.match(new RegExp("(^|;\\s*)("+r+")=([^;]*)"));return m?decodeURIComponent(m[3]):null},remove:function(r){this.write(r,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}(),Ju=function(n){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(n)},Nu=function(n,r){return r?n.replace(/\/+$/,"")+"/"+r.replace(/^\/+/,""):n},ku=Ju,Eu=Nu,Uu=function(n,r){return n&&!ku(r)?Eu(n,r):r},qi=Qn,Ku=["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"],Mu=function(n){var r={},m,Z,I;return n&&qi.forEach(n.split(`
1
+ (function(ze,qn){typeof exports=="object"&&typeof module<"u"?qn(exports):typeof define=="function"&&define.amd?define(["exports"],qn):(ze=typeof globalThis<"u"?globalThis:ze||self,qn(ze["ml-transformers"]={}))})(this,function(ze){"use strict";var O3=Object.defineProperty;var _3=(ze,qn,Pn)=>qn in ze?O3(ze,qn,{enumerable:!0,configurable:!0,writable:!0,value:Pn}):ze[qn]=Pn;var Ht=(ze,qn,Pn)=>(_3(ze,typeof qn!="symbol"?qn+"":qn,Pn),Pn);function qn(){return new Promise((o,n)=>{typeof MediaStreamTrackProcessor>"u"||typeof MediaStreamTrackGenerator>"u"?n("Your browser does not support the MediaStreamTrack API for Insertable Streams of Media."):o()})}class Pn{}Pn.updates={transformer_new:"New transformer",transformer_null:"Null transformer"},Pn.errors={transformer_none:"No transformers provided",transformer_start:"Cannot start transformer",transformer_transform:"Cannot transform frame",transformer_flush:"Cannot flush transformer",readable_null:"Readable is null",writable_null:"Writable is null"};var Oi={exports:{}},ns=function(n,r){return function(){for(var Z=new Array(arguments.length),I=0;I<Z.length;I++)Z[I]=arguments[I];return n.apply(r,Z)}},fu=ns,ur=Object.prototype.toString;function _i(o){return Array.isArray(o)}function Qi(o){return typeof o>"u"}function mu(o){return o!==null&&!Qi(o)&&o.constructor!==null&&!Qi(o.constructor)&&typeof o.constructor.isBuffer=="function"&&o.constructor.isBuffer(o)}function rs(o){return ur.call(o)==="[object ArrayBuffer]"}function pu(o){return ur.call(o)==="[object FormData]"}function bu(o){var n;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?n=ArrayBuffer.isView(o):n=o&&o.buffer&&rs(o.buffer),n}function yu(o){return typeof o=="string"}function gu(o){return typeof o=="number"}function is(o){return o!==null&&typeof o=="object"}function qr(o){if(ur.call(o)!=="[object Object]")return!1;var n=Object.getPrototypeOf(o);return n===null||n===Object.prototype}function Zu(o){return ur.call(o)==="[object Date]"}function vu(o){return ur.call(o)==="[object File]"}function Gu(o){return ur.call(o)==="[object Blob]"}function os(o){return ur.call(o)==="[object Function]"}function Xu(o){return is(o)&&os(o.pipe)}function Wu(o){return ur.call(o)==="[object URLSearchParams]"}function Vu(o){return o.trim?o.trim():o.replace(/^\s+|\s+$/g,"")}function Ru(){return typeof navigator<"u"&&(navigator.product==="ReactNative"||navigator.product==="NativeScript"||navigator.product==="NS")?!1:typeof window<"u"&&typeof document<"u"}function Di(o,n){if(!(o===null||typeof o>"u"))if(typeof o!="object"&&(o=[o]),_i(o))for(var r=0,m=o.length;r<m;r++)n.call(null,o[r],r,o);else for(var Z in o)Object.prototype.hasOwnProperty.call(o,Z)&&n.call(null,o[Z],Z,o)}function $i(){var o={};function n(Z,I){qr(o[I])&&qr(Z)?o[I]=$i(o[I],Z):qr(Z)?o[I]=$i({},Z):_i(Z)?o[I]=Z.slice():o[I]=Z}for(var r=0,m=arguments.length;r<m;r++)Di(arguments[r],n);return o}function xu(o,n,r){return Di(n,function(Z,I){r&&typeof Z=="function"?o[I]=fu(Z,r):o[I]=Z}),o}function Iu(o){return o.charCodeAt(0)===65279&&(o=o.slice(1)),o}var Qn={isArray:_i,isArrayBuffer:rs,isBuffer:mu,isFormData:pu,isArrayBufferView:bu,isString:yu,isNumber:gu,isObject:is,isPlainObject:qr,isUndefined:Qi,isDate:Zu,isFile:vu,isBlob:Gu,isFunction:os,isStream:Xu,isURLSearchParams:Wu,isStandardBrowserEnv:Ru,forEach:Di,merge:$i,extend:xu,trim:Vu,stripBOM:Iu},Ir=Qn;function ss(o){return encodeURIComponent(o).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}var ls=function(n,r,m){if(!r)return n;var Z;if(m)Z=m(r);else if(Ir.isURLSearchParams(r))Z=r.toString();else{var I=[];Ir.forEach(r,function(E,rt){E===null||typeof E>"u"||(Ir.isArray(E)?rt=rt+"[]":E=[E],Ir.forEach(E,function(lt){Ir.isDate(lt)?lt=lt.toISOString():Ir.isObject(lt)&&(lt=JSON.stringify(lt)),I.push(ss(rt)+"="+ss(lt))}))}),Z=I.join("&")}if(Z){var F=n.indexOf("#");F!==-1&&(n=n.slice(0,F)),n+=(n.indexOf("?")===-1?"?":"&")+Z}return n},Su=Qn;function ti(){this.handlers=[]}ti.prototype.use=function(n,r,m){return this.handlers.push({fulfilled:n,rejected:r,synchronous:m?m.synchronous:!1,runWhen:m?m.runWhen:null}),this.handlers.length-1},ti.prototype.eject=function(n){this.handlers[n]&&(this.handlers[n]=null)},ti.prototype.forEach=function(n){Su.forEach(this.handlers,function(m){m!==null&&n(m)})};var Lu=ti,Yu=Qn,Tu=function(n,r){Yu.forEach(n,function(Z,I){I!==r&&I.toUpperCase()===r.toUpperCase()&&(n[r]=Z,delete n[I])})},us=function(n,r,m,Z,I){return n.config=r,m&&(n.code=m),n.request=Z,n.response=I,n.isAxiosError=!0,n.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}},n},wu=us,cs=function(n,r,m,Z,I){var F=new Error(n);return wu(F,r,m,Z,I)},Fu=cs,Hu=function(n,r,m){var Z=m.config.validateStatus;!m.status||!Z||Z(m.status)?n(m):r(Fu("Request failed with status code "+m.status,m.config,null,m.request,m))},ei=Qn,Cu=ei.isStandardBrowserEnv()?function(){return{write:function(r,m,Z,I,F,L){var E=[];E.push(r+"="+encodeURIComponent(m)),ei.isNumber(Z)&&E.push("expires="+new Date(Z).toGMTString()),ei.isString(I)&&E.push("path="+I),ei.isString(F)&&E.push("domain="+F),L===!0&&E.push("secure"),document.cookie=E.join("; ")},read:function(r){var m=document.cookie.match(new RegExp("(^|;\\s*)("+r+")=([^;]*)"));return m?decodeURIComponent(m[3]):null},remove:function(r){this.write(r,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}(),Ju=function(n){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(n)},Nu=function(n,r){return r?n.replace(/\/+$/,"")+"/"+r.replace(/^\/+/,""):n},ku=Ju,Eu=Nu,Uu=function(n,r){return n&&!ku(r)?Eu(n,r):r},qi=Qn,Ku=["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"],Mu=function(n){var r={},m,Z,I;return n&&qi.forEach(n.split(`
2
2
  `),function(L){if(I=L.indexOf(":"),m=qi.trim(L.substr(0,I)).toLowerCase(),Z=qi.trim(L.substr(I+1)),m){if(r[m]&&Ku.indexOf(m)>=0)return;m==="set-cookie"?r[m]=(r[m]?r[m]:[]).concat([Z]):r[m]=r[m]?r[m]+", "+Z:Z}}),r},as=Qn,Bu=as.isStandardBrowserEnv()?function(){var n=/(msie|trident)/i.test(navigator.userAgent),r=document.createElement("a"),m;function Z(I){var F=I;return n&&(r.setAttribute("href",F),F=r.href),r.setAttribute("href",F),{href:r.href,protocol:r.protocol?r.protocol.replace(/:$/,""):"",host:r.host,search:r.search?r.search.replace(/^\?/,""):"",hash:r.hash?r.hash.replace(/^#/,""):"",hostname:r.hostname,port:r.port,pathname:r.pathname.charAt(0)==="/"?r.pathname:"/"+r.pathname}}return m=Z(window.location.href),function(F){var L=as.isString(F)?Z(F):F;return L.protocol===m.protocol&&L.host===m.host}}():function(){return function(){return!0}}();function to(o){this.message=o}to.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},to.prototype.__CANCEL__=!0;var ni=to,ri=Qn,Au=Hu,ju=Cu,zu=ls,Pu=Uu,Ou=Mu,_u=Bu,eo=cs,Qu=oi,Du=ni,ds=function(n){return new Promise(function(m,Z){var I=n.data,F=n.headers,L=n.responseType,E;function rt(){n.cancelToken&&n.cancelToken.unsubscribe(E),n.signal&&n.signal.removeEventListener("abort",E)}ri.isFormData(I)&&delete F["Content-Type"];var O=new XMLHttpRequest;if(n.auth){var lt=n.auth.username||"",Rt=n.auth.password?unescape(encodeURIComponent(n.auth.password)):"";F.Authorization="Basic "+btoa(lt+":"+Rt)}var Wt=Pu(n.baseURL,n.url);O.open(n.method.toUpperCase(),zu(Wt,n.params,n.paramsSerializer),!0),O.timeout=n.timeout;function dt(){if(!!O){var Ft="getAllResponseHeaders"in O?Ou(O.getAllResponseHeaders()):null,Tt=!L||L==="text"||L==="json"?O.responseText:O.response,At={data:Tt,status:O.status,statusText:O.statusText,headers:Ft,config:n,request:O};Au(function(Ee){m(Ee),rt()},function(Ee){Z(Ee),rt()},At),O=null}}if("onloadend"in O?O.onloadend=dt:O.onreadystatechange=function(){!O||O.readyState!==4||O.status===0&&!(O.responseURL&&O.responseURL.indexOf("file:")===0)||setTimeout(dt)},O.onabort=function(){!O||(Z(eo("Request aborted",n,"ECONNABORTED",O)),O=null)},O.onerror=function(){Z(eo("Network Error",n,null,O)),O=null},O.ontimeout=function(){var Tt=n.timeout?"timeout of "+n.timeout+"ms exceeded":"timeout exceeded",At=n.transitional||Qu.transitional;n.timeoutErrorMessage&&(Tt=n.timeoutErrorMessage),Z(eo(Tt,n,At.clarifyTimeoutError?"ETIMEDOUT":"ECONNABORTED",O)),O=null},ri.isStandardBrowserEnv()){var ht=(n.withCredentials||_u(Wt))&&n.xsrfCookieName?ju.read(n.xsrfCookieName):void 0;ht&&(F[n.xsrfHeaderName]=ht)}"setRequestHeader"in O&&ri.forEach(F,function(Tt,At){typeof I>"u"&&At.toLowerCase()==="content-type"?delete F[At]:O.setRequestHeader(At,Tt)}),ri.isUndefined(n.withCredentials)||(O.withCredentials=!!n.withCredentials),L&&L!=="json"&&(O.responseType=n.responseType),typeof n.onDownloadProgress=="function"&&O.addEventListener("progress",n.onDownloadProgress),typeof n.onUploadProgress=="function"&&O.upload&&O.upload.addEventListener("progress",n.onUploadProgress),(n.cancelToken||n.signal)&&(E=function(Ft){!O||(Z(!Ft||Ft&&Ft.type?new Du("canceled"):Ft),O.abort(),O=null)},n.cancelToken&&n.cancelToken.subscribe(E),n.signal&&(n.signal.aborted?E():n.signal.addEventListener("abort",E))),I||(I=null),O.send(I)})},Un=Qn,hs=Tu,$u=us,qu={"Content-Type":"application/x-www-form-urlencoded"};function fs(o,n){!Un.isUndefined(o)&&Un.isUndefined(o["Content-Type"])&&(o["Content-Type"]=n)}function t2(){var o;return(typeof XMLHttpRequest<"u"||typeof process<"u"&&Object.prototype.toString.call(process)==="[object process]")&&(o=ds),o}function e2(o,n,r){if(Un.isString(o))try{return(n||JSON.parse)(o),Un.trim(o)}catch(m){if(m.name!=="SyntaxError")throw m}return(r||JSON.stringify)(o)}var ii={transitional:{silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},adapter:t2(),transformRequest:[function(n,r){return hs(r,"Accept"),hs(r,"Content-Type"),Un.isFormData(n)||Un.isArrayBuffer(n)||Un.isBuffer(n)||Un.isStream(n)||Un.isFile(n)||Un.isBlob(n)?n:Un.isArrayBufferView(n)?n.buffer:Un.isURLSearchParams(n)?(fs(r,"application/x-www-form-urlencoded;charset=utf-8"),n.toString()):Un.isObject(n)||r&&r["Content-Type"]==="application/json"?(fs(r,"application/json"),e2(n)):n}],transformResponse:[function(n){var r=this.transitional||ii.transitional,m=r&&r.silentJSONParsing,Z=r&&r.forcedJSONParsing,I=!m&&this.responseType==="json";if(I||Z&&Un.isString(n)&&n.length)try{return JSON.parse(n)}catch(F){if(I)throw F.name==="SyntaxError"?$u(F,this,"E_JSON_PARSE"):F}return n}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(n){return n>=200&&n<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};Un.forEach(["delete","get","head"],function(n){ii.headers[n]={}}),Un.forEach(["post","put","patch"],function(n){ii.headers[n]=Un.merge(qu)});var oi=ii,n2=Qn,r2=oi,i2=function(n,r,m){var Z=this||r2;return n2.forEach(m,function(F){n=F.call(Z,n,r)}),n},ms=function(n){return!!(n&&n.__CANCEL__)},ps=Qn,no=i2,o2=ms,s2=oi,l2=ni;function ro(o){if(o.cancelToken&&o.cancelToken.throwIfRequested(),o.signal&&o.signal.aborted)throw new l2("canceled")}var u2=function(n){ro(n),n.headers=n.headers||{},n.data=no.call(n,n.data,n.headers,n.transformRequest),n.headers=ps.merge(n.headers.common||{},n.headers[n.method]||{},n.headers),ps.forEach(["delete","get","head","post","put","patch","common"],function(Z){delete n.headers[Z]});var r=n.adapter||s2.adapter;return r(n).then(function(Z){return ro(n),Z.data=no.call(n,Z.data,Z.headers,n.transformResponse),Z},function(Z){return o2(Z)||(ro(n),Z&&Z.response&&(Z.response.data=no.call(n,Z.response.data,Z.response.headers,n.transformResponse))),Promise.reject(Z)})},tr=Qn,bs=function(n,r){r=r||{};var m={};function Z(O,lt){return tr.isPlainObject(O)&&tr.isPlainObject(lt)?tr.merge(O,lt):tr.isPlainObject(lt)?tr.merge({},lt):tr.isArray(lt)?lt.slice():lt}function I(O){if(tr.isUndefined(r[O])){if(!tr.isUndefined(n[O]))return Z(void 0,n[O])}else return Z(n[O],r[O])}function F(O){if(!tr.isUndefined(r[O]))return Z(void 0,r[O])}function L(O){if(tr.isUndefined(r[O])){if(!tr.isUndefined(n[O]))return Z(void 0,n[O])}else return Z(void 0,r[O])}function E(O){if(O in r)return Z(n[O],r[O]);if(O in n)return Z(void 0,n[O])}var rt={url:F,method:F,data:F,baseURL:L,transformRequest:L,transformResponse:L,paramsSerializer:L,timeout:L,timeoutMessage:L,withCredentials:L,adapter:L,responseType:L,xsrfCookieName:L,xsrfHeaderName:L,onUploadProgress:L,onDownloadProgress:L,decompress:L,maxContentLength:L,maxBodyLength:L,transport:L,httpAgent:L,httpsAgent:L,cancelToken:L,socketPath:L,responseEncoding:L,validateStatus:E};return tr.forEach(Object.keys(n).concat(Object.keys(r)),function(lt){var Rt=rt[lt]||I,Wt=Rt(lt);tr.isUndefined(Wt)&&Rt!==E||(m[lt]=Wt)}),m},ys={version:"0.25.0"},c2=ys.version,io={};["object","boolean","number","function","string","symbol"].forEach(function(o,n){io[o]=function(m){return typeof m===o||"a"+(n<1?"n ":" ")+o}});var gs={};io.transitional=function(n,r,m){function Z(I,F){return"[Axios v"+c2+"] Transitional option '"+I+"'"+F+(m?". "+m:"")}return function(I,F,L){if(n===!1)throw new Error(Z(F," has been removed"+(r?" in "+r:"")));return r&&!gs[F]&&(gs[F]=!0,console.warn(Z(F," has been deprecated since v"+r+" and will be removed in the near future"))),n?n(I,F,L):!0}};function a2(o,n,r){if(typeof o!="object")throw new TypeError("options must be an object");for(var m=Object.keys(o),Z=m.length;Z-- >0;){var I=m[Z],F=n[I];if(F){var L=o[I],E=L===void 0||F(L,I,o);if(E!==!0)throw new TypeError("option "+I+" must be "+E);continue}if(r!==!0)throw Error("Unknown option "+I)}}var d2={assertOptions:a2,validators:io},Zs=Qn,h2=ls,vs=Lu,Gs=u2,si=bs,Xs=d2,Sr=Xs.validators;function Er(o){this.defaults=o,this.interceptors={request:new vs,response:new vs}}Er.prototype.request=function(n,r){if(typeof n=="string"?(r=r||{},r.url=n):r=n||{},!r.url)throw new Error("Provided config url is not valid");r=si(this.defaults,r),r.method?r.method=r.method.toLowerCase():this.defaults.method?r.method=this.defaults.method.toLowerCase():r.method="get";var m=r.transitional;m!==void 0&&Xs.assertOptions(m,{silentJSONParsing:Sr.transitional(Sr.boolean),forcedJSONParsing:Sr.transitional(Sr.boolean),clarifyTimeoutError:Sr.transitional(Sr.boolean)},!1);var Z=[],I=!0;this.interceptors.request.forEach(function(Wt){typeof Wt.runWhen=="function"&&Wt.runWhen(r)===!1||(I=I&&Wt.synchronous,Z.unshift(Wt.fulfilled,Wt.rejected))});var F=[];this.interceptors.response.forEach(function(Wt){F.push(Wt.fulfilled,Wt.rejected)});var L;if(!I){var E=[Gs,void 0];for(Array.prototype.unshift.apply(E,Z),E=E.concat(F),L=Promise.resolve(r);E.length;)L=L.then(E.shift(),E.shift());return L}for(var rt=r;Z.length;){var O=Z.shift(),lt=Z.shift();try{rt=O(rt)}catch(Rt){lt(Rt);break}}try{L=Gs(rt)}catch(Rt){return Promise.reject(Rt)}for(;F.length;)L=L.then(F.shift(),F.shift());return L},Er.prototype.getUri=function(n){if(!n.url)throw new Error("Provided config url is not valid");return n=si(this.defaults,n),h2(n.url,n.params,n.paramsSerializer).replace(/^\?/,"")},Zs.forEach(["delete","get","head","options"],function(n){Er.prototype[n]=function(r,m){return this.request(si(m||{},{method:n,url:r,data:(m||{}).data}))}}),Zs.forEach(["post","put","patch"],function(n){Er.prototype[n]=function(r,m,Z){return this.request(si(Z||{},{method:n,url:r,data:m}))}});var f2=Er,m2=ni;function Lr(o){if(typeof o!="function")throw new TypeError("executor must be a function.");var n;this.promise=new Promise(function(Z){n=Z});var r=this;this.promise.then(function(m){if(!!r._listeners){var Z,I=r._listeners.length;for(Z=0;Z<I;Z++)r._listeners[Z](m);r._listeners=null}}),this.promise.then=function(m){var Z,I=new Promise(function(F){r.subscribe(F),Z=F}).then(m);return I.cancel=function(){r.unsubscribe(Z)},I},o(function(Z){r.reason||(r.reason=new m2(Z),n(r.reason))})}Lr.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},Lr.prototype.subscribe=function(n){if(this.reason){n(this.reason);return}this._listeners?this._listeners.push(n):this._listeners=[n]},Lr.prototype.unsubscribe=function(n){if(!!this._listeners){var r=this._listeners.indexOf(n);r!==-1&&this._listeners.splice(r,1)}},Lr.source=function(){var n,r=new Lr(function(Z){n=Z});return{token:r,cancel:n}};var p2=Lr,b2=function(n){return function(m){return n.apply(null,m)}},y2=Qn,g2=function(n){return y2.isObject(n)&&n.isAxiosError===!0},Ws=Qn,Z2=ns,li=f2,v2=bs,G2=oi;function Vs(o){var n=new li(o),r=Z2(li.prototype.request,n);return Ws.extend(r,li.prototype,n),Ws.extend(r,n),r.create=function(Z){return Vs(v2(o,Z))},r}var or=Vs(G2);or.Axios=li,or.Cancel=ni,or.CancelToken=p2,or.isCancel=ms,or.VERSION=ys.version,or.all=function(n){return Promise.all(n)},or.spread=b2,or.isAxiosError=g2,Oi.exports=or,Oi.exports.default=or;var X2=Oi.exports;class xe{isEmpty(){return!this.isPresent()}static of(n){if(n!=null)return new Rs(n);throw new TypeError("The passed value was null or undefined.")}static ofNonNull(n){return xe.of(n)}static ofNullable(n){return n!=null?new Rs(n):new xs}static empty(){return new xs}static from(n){switch(n.kind){case"present":return xe.of(n.value);case"empty":return xe.empty();default:throw new TypeError("The passed value was not an Option type.")}}}class Rs extends xe{constructor(n){super(),this.payload=n}isPresent(){return!0}get(){return this.payload}ifPresent(n){n(this.payload)}ifPresentOrElse(n,r){n(this.payload)}filter(n){return n(this.payload)?this:xe.empty()}map(n){const r=n(this.payload);return xe.ofNullable(r)}flatMap(n){return n(this.payload)}or(n){return this}orElse(n){return this.payload}orElseGet(n){return this.payload}orElseThrow(n){return this.payload}orNull(){return this.payload}orUndefined(){return this.payload}toOption(){return{kind:"present",value:this.payload}}matches(n){return n.present(this.payload)}toJSON(n){return this.payload}}class xs extends xe{isPresent(){return!1}constructor(){super()}get(){throw new TypeError("The optional is not present.")}ifPresent(n){}ifPresentOrElse(n,r){r()}filter(n){return this}map(n){return xe.empty()}flatMap(n){return xe.empty()}or(n){return n()}orElse(n){return n}orElseGet(n){return this.orElse(n())}orElseThrow(n){throw n()}orNull(){return null}orUndefined(){}toOption(){return{kind:"empty"}}matches(n){return n.empty()}toJSON(n){return null}}const W2="2.0.0";function V2(o){globalThis._vonageMediaProcessorMetadata=o}function Is(){return globalThis._vonageMediaProcessorMetadata}class er{constructor(){const n=Is();this._report={action:xe.empty(),applicationId:xe.ofNullable(n!==void 0&&n!=null?n.appId:null),timestamp:Date.now(),fps:xe.empty(),framesTransformed:xe.empty(),guid:xe.empty(),highestFrameTransformCpu:xe.empty(),message:xe.empty(),source:xe.ofNullable(n!==void 0&&n!=null?n.sourceType:null),transformedFps:xe.empty(),transformerType:xe.empty(),variation:xe.empty(),videoHeight:xe.empty(),videoWidth:xe.empty(),version:W2,error:xe.empty(),proxyUrl:xe.ofNullable(n!==void 0&&n!=null?n.proxyUrl:null)}}action(n){return this._report.action=xe.ofNullable(n),this}framesTransformed(n){return this._report.framesTransformed=xe.ofNullable(n),this}fps(n){return this._report.fps=xe.ofNullable(n),this}guid(n){return this._report.guid=xe.ofNullable(n),this}message(n){return this._report.message=xe.ofNullable(n),this}transformedFps(n){return this._report.transformedFps=xe.ofNullable(n),this}transformerType(n){return this._report.transformerType=xe.ofNullable(n),this}variation(n){return this._report.variation=xe.ofNullable(n),this}videoHeight(n){return this._report.videoHeight=xe.ofNullable(n),this}videoWidth(n){return this._report.videoWidth=xe.ofNullable(n),this}error(n){return this._report.error=xe.ofNullable(n),this}build(){return this._report}}const R2=o=>JSON.stringify(o,(n,r)=>{if(r!==null)return r});class nr{static report(n){return new Promise((r,m)=>{if(n.applicationId.isEmpty()||n.source.isEmpty()){r("success");return}let Z=X2.create(),I={timeout:1e4,timeoutErrorMessage:"Request timeout",headers:{"Content-Type":"application/json"}},F="hlg.tokbox.com/prod/logging/vcp_webrtc";if(n.proxyUrl.isEmpty())F="https://"+F;else{let L;n.proxyUrl.get().slice(n.proxyUrl.get().length-1)!=="/"?L=n.proxyUrl.get()+"/":L=n.proxyUrl.get(),F=L+F}Z.post(F,R2(n),I).then(L=>{console.log(L),r("success")}).catch(L=>{console.log(L),m(L)})})}}var ui,x2=new Uint8Array(16);function I2(){if(!ui&&(ui=typeof crypto<"u"&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||typeof msCrypto<"u"&&typeof msCrypto.getRandomValues=="function"&&msCrypto.getRandomValues.bind(msCrypto),!ui))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return ui(x2)}var S2=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function L2(o){return typeof o=="string"&&S2.test(o)}for(var Kn=[],oo=0;oo<256;++oo)Kn.push((oo+256).toString(16).substr(1));function Y2(o){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,r=(Kn[o[n+0]]+Kn[o[n+1]]+Kn[o[n+2]]+Kn[o[n+3]]+"-"+Kn[o[n+4]]+Kn[o[n+5]]+"-"+Kn[o[n+6]]+Kn[o[n+7]]+"-"+Kn[o[n+8]]+Kn[o[n+9]]+"-"+Kn[o[n+10]]+Kn[o[n+11]]+Kn[o[n+12]]+Kn[o[n+13]]+Kn[o[n+14]]+Kn[o[n+15]]).toLowerCase();if(!L2(r))throw TypeError("Stringified UUID is invalid");return r}function Ss(o,n,r){o=o||{};var m=o.random||(o.rng||I2)();if(m[6]=m[6]&15|64,m[8]=m[8]&63|128,n){r=r||0;for(var Z=0;Z<16;++Z)n[r+Z]=m[Z];return n}return Y2(m)}const cr=new WeakMap,ci=new WeakMap,Ur=new WeakMap,so=Symbol("anyProducer"),Ls=Promise.resolve(),ai=Symbol("listenerAdded"),di=Symbol("listenerRemoved");let lo=!1;function Yr(o){if(typeof o!="string"&&typeof o!="symbol")throw new TypeError("eventName must be a string or a symbol")}function hi(o){if(typeof o!="function")throw new TypeError("listener must be a function")}function Tr(o,n){const r=ci.get(o);return r.has(n)||r.set(n,new Set),r.get(n)}function Kr(o,n){const r=typeof n=="string"||typeof n=="symbol"?n:so,m=Ur.get(o);return m.has(r)||m.set(r,new Set),m.get(r)}function T2(o,n,r){const m=Ur.get(o);if(m.has(n))for(const Z of m.get(n))Z.enqueue(r);if(m.has(so)){const Z=Promise.all([n,r]);for(const I of m.get(so))I.enqueue(Z)}}function Ys(o,n){n=Array.isArray(n)?n:[n];let r=!1,m=()=>{},Z=[];const I={enqueue(F){Z.push(F),m()},finish(){r=!0,m()}};for(const F of n)Kr(o,F).add(I);return{async next(){return Z?Z.length===0?r?(Z=void 0,this.next()):(await new Promise(F=>{m=F}),this.next()):{done:!1,value:await Z.shift()}:{done:!0}},async return(F){Z=void 0;for(const L of n)Kr(o,L).delete(I);return m(),arguments.length>0?{done:!0,value:await F}:{done:!0}},[Symbol.asyncIterator](){return this}}}function Ts(o){if(o===void 0)return ws;if(!Array.isArray(o))throw new TypeError("`methodNames` must be an array of strings");for(const n of o)if(!ws.includes(n))throw typeof n!="string"?new TypeError("`methodNames` element must be a string"):new Error(`${n} is not Emittery method`);return o}const uo=o=>o===ai||o===di;class gr{static mixin(n,r){return r=Ts(r),m=>{if(typeof m!="function")throw new TypeError("`target` must be function");for(const F of r)if(m.prototype[F]!==void 0)throw new Error(`The property \`${F}\` already exists on \`target\``);function Z(){return Object.defineProperty(this,n,{enumerable:!1,value:new gr}),this[n]}Object.defineProperty(m.prototype,n,{enumerable:!1,get:Z});const I=F=>function(...L){return this[n][F](...L)};for(const F of r)Object.defineProperty(m.prototype,F,{enumerable:!1,value:I(F)});return m}}static get isDebugEnabled(){if(typeof process!="object")return lo;const{env:n}=process||{env:{}};return n.DEBUG==="emittery"||n.DEBUG==="*"||lo}static set isDebugEnabled(n){lo=n}constructor(n={}){cr.set(this,new Set),ci.set(this,new Map),Ur.set(this,new Map),this.debug=n.debug||{},this.debug.enabled===void 0&&(this.debug.enabled=!1),this.debug.logger||(this.debug.logger=(r,m,Z,I)=>{I=JSON.stringify(I),typeof Z=="symbol"&&(Z=Z.toString());const F=new Date,L=`${F.getHours()}:${F.getMinutes()}:${F.getSeconds()}.${F.getMilliseconds()}`;console.log(`[${L}][emittery:${r}][${m}] Event Name: ${Z}
3
- data: ${I}`)})}logIfDebugEnabled(n,r,m){(gr.isDebugEnabled||this.debug.enabled)&&this.debug.logger(n,this.debug.name,r,m)}on(n,r){hi(r),n=Array.isArray(n)?n:[n];for(const m of n)Yr(m),Tr(this,m).add(r),this.logIfDebugEnabled("subscribe",m,void 0),uo(m)||this.emit(ai,{eventName:m,listener:r});return this.off.bind(this,n,r)}off(n,r){hi(r),n=Array.isArray(n)?n:[n];for(const m of n)Yr(m),Tr(this,m).delete(r),this.logIfDebugEnabled("unsubscribe",m,void 0),uo(m)||this.emit(di,{eventName:m,listener:r})}once(n){return new Promise(r=>{const m=this.on(n,Z=>{m(),r(Z)})})}events(n){n=Array.isArray(n)?n:[n];for(const r of n)Yr(r);return Ys(this,n)}async emit(n,r){Yr(n),this.logIfDebugEnabled("emit",n,r),T2(this,n,r);const m=Tr(this,n),Z=cr.get(this),I=[...m],F=uo(n)?[]:[...Z];await Ls,await Promise.all([...I.map(async L=>{if(m.has(L))return L(r)}),...F.map(async L=>{if(Z.has(L))return L(n,r)})])}async emitSerial(n,r){Yr(n),this.logIfDebugEnabled("emitSerial",n,r);const m=Tr(this,n),Z=cr.get(this),I=[...m],F=[...Z];await Ls;for(const L of I)m.has(L)&&await L(r);for(const L of F)Z.has(L)&&await L(n,r)}onAny(n){return hi(n),this.logIfDebugEnabled("subscribeAny",void 0,void 0),cr.get(this).add(n),this.emit(ai,{listener:n}),this.offAny.bind(this,n)}anyEvent(){return Ys(this)}offAny(n){hi(n),this.logIfDebugEnabled("unsubscribeAny",void 0,void 0),this.emit(di,{listener:n}),cr.get(this).delete(n)}clearListeners(n){n=Array.isArray(n)?n:[n];for(const r of n)if(this.logIfDebugEnabled("clear",r,void 0),typeof r=="string"||typeof r=="symbol"){Tr(this,r).clear();const m=Kr(this,r);for(const Z of m)Z.finish();m.clear()}else{cr.get(this).clear();for(const m of ci.get(this).values())m.clear();for(const m of Ur.get(this).values()){for(const Z of m)Z.finish();m.clear()}}}listenerCount(n){n=Array.isArray(n)?n:[n];let r=0;for(const m of n){if(typeof m=="string"){r+=cr.get(this).size+Tr(this,m).size+Kr(this,m).size+Kr(this).size;continue}typeof m<"u"&&Yr(m),r+=cr.get(this).size;for(const Z of ci.get(this).values())r+=Z.size;for(const Z of Ur.get(this).values())r+=Z.size}return r}bindMethods(n,r){if(typeof n!="object"||n===null)throw new TypeError("`target` must be an object");r=Ts(r);for(const m of r){if(n[m]!==void 0)throw new Error(`The property \`${m}\` already exists on \`target\``);Object.defineProperty(n,m,{enumerable:!1,value:this[m].bind(this)})}}}const ws=Object.getOwnPropertyNames(gr.prototype).filter(o=>o!=="constructor");Object.defineProperty(gr,"listenerAdded",{value:ai,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(gr,"listenerRemoved",{value:di,writable:!1,enumerable:!0,configurable:!1});var co=gr;function w2(o){return typeof o=="object"&&o!==null&&"message"in o&&typeof o.message=="string"}function F2(o){if(w2(o))return o;try{return new Error(JSON.stringify(o))}catch{return new Error(String(o))}}function ao(o){return F2(o).message}var Fs=(o=>(o.FPS_DROP="fps_drop",o))(Fs||{}),Hs=(o=>(o.start="start",o.transform="transform",o.flush="flush",o))(Hs||{}),fi=(o=>(o.pipeline_ended="pipeline_ended",o.pipeline_ended_with_error="pipeline_ended_with_error",o.pipeline_started="pipeline_started",o.pipeline_started_with_error="pipeline_started_with_error",o.pipeline_restarted="pipeline_restarted",o.pipeline_restarted_with_error="pipeline_restarted_with_error",o))(fi||{});const H2=500,C2=.8;class J2 extends co{constructor(n,r){super(),this.index_=r,this.uuid_=Ss(),this.framesTransformed_=0,this.transformer_=n,this.shouldStop_=!1,this.isFlashed_=!1,this.framesFromSource_=0,this.fps_=0,this.mediaTransformerQosReportStartTimestamp_=0,this.videoHeight_=0,this.videoWidth_=0,this.trackExpectedRate_=-1,this.transformerType_="Custom","getTransformerType"in n&&(this.transformerType_=n.getTransformerType());const m=new er().action("MediaTransformer").guid(this.uuid_).transformerType(this.transformerType_).variation("Create").build();nr.report(m)}setTrackExpectedRate(n){this.trackExpectedRate_=n}async start(n){if(this.controller_=n,this.transformer_&&typeof this.transformer_.start=="function")try{await this.transformer_.start(n)}catch(r){const m=new er().action("MediaTransformer").guid(this.uuid_).message(Pn.errors.transformer_start).transformerType(this.transformerType_).variation("Error").error(ao(r)).build();nr.report(m);const Z={eventMetaData:{transformerIndex:this.index_},error:r,function:"start"};this.emit("error",Z)}}async transform(n,r){var m,Z,I,F;if(this.mediaTransformerQosReportStartTimestamp_===0&&(this.mediaTransformerQosReportStartTimestamp_=Date.now()),n instanceof VideoFrame&&(this.videoHeight_=(m=n==null?void 0:n.displayHeight)!=null?m:0,this.videoWidth_=(Z=n==null?void 0:n.displayWidth)!=null?Z:0),++this.framesFromSource_,this.transformer_)if(this.shouldStop_)console.warn("[Pipeline] flush from transform"),n.close(),this.flush(r),r.terminate();else try{await((F=(I=this.transformer_).transform)==null?void 0:F.call(I,n,r)),++this.framesTransformed_,this.framesTransformed_===H2&&this.mediaTransformerQosReport()}catch(L){const E=new er().action("MediaTransformer").guid(this.uuid_).message(Pn.errors.transformer_transform).transformerType(this.transformerType_).variation("Error").error(ao(L)).build();nr.report(E);const rt={eventMetaData:{transformerIndex:this.index_},error:L,function:"transform"};this.emit("error",rt)}}async flush(n){if(this.transformer_&&typeof this.transformer_.flush=="function"&&!this.isFlashed_){this.isFlashed_=!0;try{await this.transformer_.flush(n)}catch(m){const Z=new er().action("MediaTransformer").guid(this.uuid_).message(Pn.errors.transformer_flush).transformerType(this.transformerType_).variation("Error").error(ao(m)).build();nr.report(Z);const I={eventMetaData:{transformerIndex:this.index_},error:m,function:"flush"};this.emit("error",I)}}this.mediaTransformerQosReport();const r=new er().action("MediaTransformer").guid(this.uuid_).transformerType(this.transformerType_).variation("Delete").build();nr.report(r)}stop(){console.log("[Pipeline] Stop stream."),this.controller_&&(this.flush(this.controller_),this.controller_.terminate()),this.shouldStop_=!0}mediaTransformerQosReport(){let n=(Date.now()-this.mediaTransformerQosReportStartTimestamp_)/1e3,r=this.framesFromSource_/n,m=this.framesTransformed_/n;if(this.trackExpectedRate_!=-1&&this.trackExpectedRate_*C2>r){const I={eventMetaData:{transformerIndex:this.index_},warningType:"fps_drop",dropInfo:{requested:this.trackExpectedRate_,current:r}};this.emit("warn",I)}const Z=new er().action("MediaTransformer").fps(r).transformedFps(m).framesTransformed(this.framesTransformed_).guid(this.uuid_).transformerType(this.transformerType_).videoHeight(this.videoHeight_).videoWidth(this.videoWidth_).variation("QoS").build();nr.report(Z),this.mediaTransformerQosReportStartTimestamp_=0,this.framesFromSource_=0,this.framesTransformed_=0}}class N2 extends co{constructor(n){super(),this.transformers_=[],this.trackExpectedRate_=-1;for(let r=0;r<n.length;r++){let m=new J2(n[r],r);m.on("error",Z=>{this.emit("error",Z)}),m.on("warn",Z=>{this.emit("warn",Z)}),this.transformers_.push(m)}}setTrackExpectedRate(n){this.trackExpectedRate_=n;for(let r of this.transformers_)r.setTrackExpectedRate(this.trackExpectedRate_)}async start(n,r){if(!this.transformers_||this.transformers_.length===0){console.log("[Pipeline] No transformers.");return}try{let m=n;for(let Z of this.transformers_)n=n.pipeThrough(new TransformStream(Z));n.pipeTo(r).then(async()=>{console.log("[Pipeline] Setup."),await r.abort(),await m.cancel(),this.emit("pipelineInfo","pipeline_ended")}).catch(async Z=>{n.cancel().then(()=>{console.log("[Pipeline] Shutting down streams after abort.")}).catch(I=>{console.error("[Pipeline] Error from stream transform:",I)}),await r.abort(Z),await m.cancel(Z),this.emit("pipelineInfo","pipeline_ended_with_error")})}catch{this.emit("pipelineInfo","pipeline_started_with_error"),this.destroy();return}this.emit("pipelineInfo","pipeline_started"),console.log("[Pipeline] Pipeline started.")}async destroy(){console.log("[Pipeline] Destroying Pipeline.");for(let n of this.transformers_)n.stop()}}class k2 extends co{constructor(){super(),this.uuid_=Ss(),this.trackExpectedRate_=-1;const n=new er().action("MediaProcessor").guid(this.uuid_).variation("Create").build();nr.report(n)}setTrackExpectedRate(n){this.trackExpectedRate_=n,this.pipeline_&&this.pipeline_.setTrackExpectedRate(this.trackExpectedRate_)}transform(n,r){return this.readable_=n,this.writable_=r,this.transformInternal()}transformInternal(){return new Promise((n,r)=>{if(!this.transformers_||this.transformers_.length===0){const Z=new er().action("MediaProcessor").guid(this.uuid_).message(Pn.errors.transformer_none).variation("Error").build();nr.report(Z),r("[MediaProcessor] Need to set transformers.");return}if(!this.readable_){const Z=new er().action("MediaProcessor").guid(this.uuid_).message(Pn.errors.readable_null).variation("Error").build();nr.report(Z),r("[MediaProcessor] Readable is null.");return}if(!this.writable_){const Z=new er().action("MediaProcessor").guid(this.uuid_).message(Pn.errors.writable_null).variation("Error").build();nr.report(Z),r("[MediaProcessor] Writable is null.");return}let m=!1;this.pipeline_&&(m=!0,this.pipeline_.clearListeners(),this.pipeline_.destroy()),this.pipeline_=new N2(this.transformers_),this.pipeline_.on("warn",Z=>{this.emit("warn",Z)}),this.pipeline_.on("error",Z=>{this.emit("error",Z)}),this.pipeline_.on("pipelineInfo",Z=>{m&&(Z==="pipeline_started"?Z=fi.pipeline_restarted:Z==="pipeline_started_with_error"&&(Z=fi.pipeline_restarted_with_error)),this.emit("pipelineInfo",Z)}),this.trackExpectedRate_!=-1&&this.pipeline_.setTrackExpectedRate(this.trackExpectedRate_),this.pipeline_.start(this.readable_,this.writable_).then(()=>{n()}).catch(Z=>{r(Z)})})}setTransformers(n){const r=new er().action("MediaProcessor").guid(this.uuid_).message(Pn.updates.transformer_new).variation("Update").build();return nr.report(r),this.transformers_=n,this.readable_&&this.writable_?this.transformInternal():Promise.resolve()}destroy(){return new Promise(n=>{this.pipeline_&&this.pipeline_.destroy();const r=new er().action("MediaProcessor").guid(this.uuid_).variation("Delete").build();nr.report(r),n()})}}class E2{constructor(){this.processor_=null,this.generator_=null}init(n){return new Promise((r,m)=>{try{this.processor_=new MediaStreamTrackProcessor(n)}catch(Z){console.log(`[InsertableStreamHelper] MediaStreamTrackProcessor failed: ${Z}`),m(Z)}try{n.kind==="audio"?this.generator_=new MediaStreamTrackGenerator({kind:"audio"}):n.kind==="video"?this.generator_=new MediaStreamTrackGenerator({kind:"video"}):m("kind not supported")}catch(Z){console.log(`[InsertableStreamHelper] MediaStreamTrackGenerator failed: ${Z}`),m(Z)}r()})}getReadable(){return this.processor_.readable}getWriteable(){return this.generator_.writable}getProccesorTrack(){return this.generator_}}class U2{constructor(n){this.insertableStreamHelper_=new E2,this.mediaProcessor_=n}setTrack(n){return new Promise((r,m)=>{this.insertableStreamHelper_.init(n).then(()=>{this.mediaProcessor_.transform(this.insertableStreamHelper_.getReadable(),this.insertableStreamHelper_.getWriteable()).then(()=>{r(this.insertableStreamHelper_.getProccesorTrack())}).catch(Z=>{m(Z)})}).catch(Z=>{m(Z)})})}destroy(){return new Promise((n,r)=>{this.mediaProcessor_?this.mediaProcessor_.destroy().then(()=>{n()}).catch(m=>{r(m)}):r("no processor")})}}var Mr=(o=>(o.Low="Low",o.High="High",o))(Mr||{});const K2=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]));var M2=function(){var o=typeof document<"u"&&document.currentScript?document.currentScript.src:void 0;return function(n){n=n||{};var r=typeof n<"u"?n:{},m,Z;r.ready=new Promise(function(et,ot){m=et,Z=ot});var I={},F;for(F in r)r.hasOwnProperty(F)&&(I[F]=r[F]);var L="./this.program",E=function(et,ot){throw ot},rt=!0,O="";function lt(et){return r.locateFile?r.locateFile(et,O):O+et}var Rt;typeof document<"u"&&document.currentScript&&(O=document.currentScript.src),o&&(O=o),O.indexOf("blob:")!==0?O=O.substr(0,O.replace(/[?#].*/,"").lastIndexOf("/")+1):O="";var Wt=r.print||console.log.bind(console),dt=r.printErr||console.warn.bind(console);for(F in I)I.hasOwnProperty(F)&&(r[F]=I[F]);I=null,r.arguments&&r.arguments,r.thisProgram&&(L=r.thisProgram),r.quit&&(E=r.quit);var ht;r.wasmBinary&&(ht=r.wasmBinary);var Ft=r.noExitRuntime||!0;typeof WebAssembly!="object"&&he("no native wasm support detected");var Tt,At=!1,_=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0;function Ee(et,ot,at){for(var _t=ot+at,ae=ot;et[ae]&&!(ae>=_t);)++ae;if(ae-ot>16&&et.subarray&&_)return _.decode(et.subarray(ot,ae));for(var ue="";ot<ae;){var Lt=et[ot++];if(!(Lt&128)){ue+=String.fromCharCode(Lt);continue}var me=et[ot++]&63;if((Lt&224)==192){ue+=String.fromCharCode((Lt&31)<<6|me);continue}var Je=et[ot++]&63;if((Lt&240)==224?Lt=(Lt&15)<<12|me<<6|Je:Lt=(Lt&7)<<18|me<<12|Je<<6|et[ot++]&63,Lt<65536)ue+=String.fromCharCode(Lt);else{var qe=Lt-65536;ue+=String.fromCharCode(55296|qe>>10,56320|qe&1023)}}return ue}function an(et,ot){return et?Ee(gt,et,ot):""}function Ve(et,ot,at){for(var _t=0;_t<et.length;++_t)de[ot++>>0]=et.charCodeAt(_t);at||(de[ot>>0]=0)}function $t(et,ot){return et%ot>0&&(et+=ot-et%ot),et}var An,de,gt,pn;function jn(et){An=et,r.HEAP8=de=new Int8Array(et),r.HEAP16=new Int16Array(et),r.HEAP32=pn=new Int32Array(et),r.HEAPU8=gt=new Uint8Array(et),r.HEAPU16=new Uint16Array(et),r.HEAPU32=new Uint32Array(et),r.HEAPF32=new Float32Array(et),r.HEAPF64=new Float64Array(et)}r.INITIAL_MEMORY;var Re,Nt=[],Ye=[],on=[],Xn=0;function Fn(){return Ft||Xn>0}function xn(){if(r.preRun)for(typeof r.preRun=="function"&&(r.preRun=[r.preRun]);r.preRun.length;)bn(r.preRun.shift());Qt(Nt)}function Jn(){Qt(Ye)}function dn(){if(r.postRun)for(typeof r.postRun=="function"&&(r.postRun=[r.postRun]);r.postRun.length;)Hn(r.postRun.shift());Qt(on)}function bn(et){Nt.unshift(et)}function kn(et){Ye.unshift(et)}function Hn(et){on.unshift(et)}var Pe=0,Ae=null;function In(et){Pe++,r.monitorRunDependencies&&r.monitorRunDependencies(Pe)}function Wn(et){if(Pe--,r.monitorRunDependencies&&r.monitorRunDependencies(Pe),Pe==0&&Ae){var ot=Ae;Ae=null,ot()}}r.preloadedImages={},r.preloadedAudios={};function he(et){r.onAbort&&r.onAbort(et),et="Aborted("+et+")",dt(et),At=!0,et+=". Build with -s ASSERTIONS=1 for more info.";var ot=new WebAssembly.RuntimeError(et);throw Z(ot),ot}var Le="data:application/octet-stream;base64,";function Oe(et){return et.startsWith(Le)}var ne;ne="tflite-simd.wasm",Oe(ne)||(ne=lt(ne));function We(et){try{if(et==ne&&ht)return new Uint8Array(ht);if(!Rt)throw"both async and sync fetching of the wasm failed"}catch(ot){he(ot)}}function sn(){return!ht&&rt&&typeof fetch=="function"?fetch(ne,{credentials:"same-origin"}).then(function(et){if(!et.ok)throw"failed to load wasm binary file at '"+ne+"'";return et.arrayBuffer()}).catch(function(){return We(ne)}):Promise.resolve().then(function(){return We(ne)})}function Me(){var et={a:fe};function ot(Lt,me){var Je=Lt.exports;r.asm=Je,Tt=r.asm.q,jn(Tt.buffer),Re=r.asm.E,kn(r.asm.r),Wn()}In();function at(Lt){ot(Lt.instance)}function _t(Lt){return sn().then(function(me){return WebAssembly.instantiate(me,et)}).then(function(me){return me}).then(Lt,function(me){dt("failed to asynchronously prepare wasm: "+me),he(me)})}function ae(){return!ht&&typeof WebAssembly.instantiateStreaming=="function"&&!Oe(ne)&&typeof fetch=="function"?fetch(ne,{credentials:"same-origin"}).then(function(Lt){var me=WebAssembly.instantiateStreaming(Lt,et);return me.then(at,function(Je){return dt("wasm streaming compile failed: "+Je),dt("falling back to ArrayBuffer instantiation"),_t(at)})}):_t(at)}if(r.instantiateWasm)try{var ue=r.instantiateWasm(et,ot);return ue}catch(Lt){return dt("Module.instantiateWasm callback failed with error: "+Lt),!1}return ae().catch(Z),{}}function Qt(et){for(;et.length>0;){var ot=et.shift();if(typeof ot=="function"){ot(r);continue}var at=ot.func;typeof at=="number"?ot.arg===void 0?Re.get(at)():Re.get(at)(ot.arg):at(ot.arg===void 0?null:ot.arg)}}function Ze(et,ot,at,_t){he("Assertion failed: "+an(et)+", at: "+[ot?an(ot):"unknown filename",at,_t?an(_t):"unknown function"])}function Ce(et,ot){he("To use dlopen, you need to use Emscripten's linking support, see https://github.com/emscripten-core/emscripten/wiki/Linking")}function Bt(et,ot){he("To use dlopen, you need to use Emscripten's linking support, see https://github.com/emscripten-core/emscripten/wiki/Linking")}function Ie(){he("")}var zt;zt=function(){return performance.now()};var ye=!0;function Te(et){return pn[Jt()>>2]=et,et}function $e(et,ot){var at;if(et===0)at=Date.now();else if((et===1||et===4)&&ye)at=zt();else return Te(28),-1;return pn[ot>>2]=at/1e3|0,pn[ot+4>>2]=at%1e3*1e3*1e3|0,0}function Xe(){return 2147483648}function Pt(et,ot,at){gt.copyWithin(et,ot,ot+at)}function je(et){try{return Tt.grow(et-An.byteLength+65535>>>16),jn(Tt.buffer),1}catch{}}function _e(et){var ot=gt.length;et=et>>>0;var at=2147483648;if(et>at)return!1;for(var _t=1;_t<=4;_t*=2){var ae=ot*(1+.2/_t);ae=Math.min(ae,et+100663296);var ue=Math.min(at,$t(Math.max(et,ae),65536)),Lt=je(ue);if(Lt)return!0}return!1}function Se(et){for(var ot=zt();zt()-ot<et;);}var Vn={};function ln(){return L||"./this.program"}function Qe(){if(!Qe.strings){var et=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",ot={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:et,_:ln()};for(var at in Vn)Vn[at]===void 0?delete ot[at]:ot[at]=Vn[at];var _t=[];for(var at in ot)_t.push(at+"="+ot[at]);Qe.strings=_t}return Qe.strings}var un={mappings:{},buffers:[null,[],[]],printChar:function(et,ot){var at=un.buffers[et];ot===0||ot===10?((et===1?Wt:dt)(Ee(at,0)),at.length=0):at.push(ot)},varargs:void 0,get:function(){un.varargs+=4;var et=pn[un.varargs-4>>2];return et},getStr:function(et){var ot=an(et);return ot},get64:function(et,ot){return et}};function ve(et,ot){var at=0;return Qe().forEach(function(_t,ae){var ue=ot+at;pn[et+ae*4>>2]=ue,Ve(_t,ue),at+=_t.length+1}),0}function we(et,ot){var at=Qe();pn[et>>2]=at.length;var _t=0;return at.forEach(function(ae){_t+=ae.length+1}),pn[ot>>2]=_t,0}function Ge(et){ee(et)}function re(et){return 0}function De(et,ot,at,_t,ae){}function te(et,ot,at,_t){for(var ae=0,ue=0;ue<at;ue++){for(var Lt=pn[ot+ue*8>>2],me=pn[ot+(ue*8+4)>>2],Je=0;Je<me;Je++)un.printChar(et,gt[Lt+Je]);ae+=me}return pn[_t>>2]=ae,0}function Ot(){if(typeof crypto=="object"&&typeof crypto.getRandomValues=="function"){var et=new Uint8Array(1);return function(){return crypto.getRandomValues(et),et[0]}}else return function(){he("randomDevice")}}function hn(et,ot){hn.randomDevice||(hn.randomDevice=Ot());for(var at=0;at<ot;at++)de[et+at>>0]=hn.randomDevice();return 0}var fe={a:Ze,e:Ce,d:Bt,b:Ie,n:$e,h:Xe,l:Pt,m:_e,p:Se,f:ve,g:we,j:Ge,i:re,k:De,c:te,o:hn};Me(),r.___wasm_call_ctors=function(){return(r.___wasm_call_ctors=r.asm.r).apply(null,arguments)},r._getModelBufferMemoryOffset=function(){return(r._getModelBufferMemoryOffset=r.asm.s).apply(null,arguments)},r._getInputMemoryOffset=function(){return(r._getInputMemoryOffset=r.asm.t).apply(null,arguments)},r._getInputHeight=function(){return(r._getInputHeight=r.asm.u).apply(null,arguments)},r._getInputWidth=function(){return(r._getInputWidth=r.asm.v).apply(null,arguments)},r._getInputChannelCount=function(){return(r._getInputChannelCount=r.asm.w).apply(null,arguments)},r._getOutputMemoryOffset=function(){return(r._getOutputMemoryOffset=r.asm.x).apply(null,arguments)},r._getOutputHeight=function(){return(r._getOutputHeight=r.asm.y).apply(null,arguments)},r._getOutputWidth=function(){return(r._getOutputWidth=r.asm.z).apply(null,arguments)},r._getOutputChannelCount=function(){return(r._getOutputChannelCount=r.asm.A).apply(null,arguments)},r._loadModel=function(){return(r._loadModel=r.asm.B).apply(null,arguments)},r._runInference=function(){return(r._runInference=r.asm.C).apply(null,arguments)},r._isGPUEnabled=function(){return(r._isGPUEnabled=r.asm.D).apply(null,arguments)};var Jt=r.___errno_location=function(){return(Jt=r.___errno_location=r.asm.F).apply(null,arguments)},Vt;function ie(et){this.name="ExitStatus",this.message="Program terminated with exit("+et+")",this.status=et}Ae=function et(){Vt||Fe(),Vt||(Ae=et)};function Fe(et){if(Pe>0||(xn(),Pe>0))return;function ot(){Vt||(Vt=!0,r.calledRun=!0,!At&&(Jn(),m(r),r.onRuntimeInitialized&&r.onRuntimeInitialized(),dn()))}r.setStatus?(r.setStatus("Running..."),setTimeout(function(){setTimeout(function(){r.setStatus("")},1),ot()},1)):ot()}r.run=Fe;function ee(et,ot){oe(et)}function oe(et){Fn()||(r.onExit&&r.onExit(et),At=!0),E(et,new ie(et))}if(r.preInit)for(typeof r.preInit=="function"&&(r.preInit=[r.preInit]);r.preInit.length>0;)r.preInit.pop()();return Fe(),n.ready}}();class B2{constructor(){Ht(this,"selectedTFLite");Ht(this,"isSIMDSupported",!1);Ht(this,"isThreadsSupported",!1);Ht(this,"inputWidth",0);Ht(this,"inputHeight",0);Ht(this,"inputChannelCount",0);Ht(this,"inputMemoryOffset",0);Ht(this,"outputWidth",0);Ht(this,"outputHeight",0);Ht(this,"outputChannelCount",0);Ht(this,"outputMemoryOffset",0)}}const A2="https://d3opqjmqzxf057.cloudfront.net/vonage-tensorflow-wasm/tflite-simd-wasm/1.1.3/",j2="https://d3opqjmqzxf057.cloudfront.net/ml/selfie_segmentation/4.0.0/";async function z2(o=A2,n=j2){let r=new B2;var m=new Promise(function(Z,I){async function F(){return M2({locateFile:function(rt){return o+rt}})}async function L(E){return new Promise(async(rt,O)=>{const lt=E;if(typeof lt>"u")return O("TFLite backend unavailable: wasmSimd");const Rt="selfie_segmentation_landscape";console.log("Loading tflite model:",Rt);let Wt=n+`${Rt}.tflite`;console.log("TFLite modelUrl: "+Wt);try{const ht=await(await fetch(Wt)).arrayBuffer();console.log("Model buffer size:",ht.byteLength);const Ft=lt._getModelBufferMemoryOffset();console.log("Model buffer memory offset:",Ft),console.log("Loading model buffer..."),lt.HEAPU8.set(new Uint8Array(ht),Ft);const Tt=lt._loadModel(ht.byteLength);if(console.log("Load model result:",Tt),Tt!==0){O("Cannot load model");return}r.inputWidth=lt._getInputWidth(),r.inputHeight=lt._getInputHeight(),r.inputChannelCount=lt._getInputChannelCount(),r.inputMemoryOffset=lt._getInputMemoryOffset(),console.log("Input memory offset:",r.inputMemoryOffset),console.log("Input height:",r.inputHeight),console.log("Input width:",r.inputWidth),console.log("Input channels:",r.inputChannelCount),r.outputMemoryOffset=lt._getOutputMemoryOffset(),r.outputWidth=lt._getOutputWidth(),r.outputHeight=lt._getOutputHeight(),r.outputChannelCount=lt._getOutputChannelCount(),console.log("Output memory offset:",r.outputMemoryOffset),console.log("Output height:",r.outputHeight),console.log("Output width:",r.outputWidth),console.log("Output channels:",r.outputChannelCount),r.selectedTFLite=lt}catch(dt){O(dt);return}rt()})}F().then(E=>{if(E===null)throw console.error("loadTFLite null"),"loadTFLite null";L(E).then(rt=>{Z(r)}).catch(rt=>{console.error("loadTFLiteModel error"),I("loadTFLiteModel error")})}).catch(E=>{console.error("loadTFLite error:",E),I("loadTFLite error:"+E)})});return m}class Cs{constructor(){Ht(this,"canvas",new OffscreenCanvas(0,0));Ht(this,"context",this.canvas.getContext("2d",{willReadFrequently:!0}));Ht(this,"pixelCount",0);Ht(this,"inputOffset",0);Ht(this,"outputOffset",0);Ht(this,"infos");Ht(this,"mask")}async init(n,r){await this.initWasm(n,r),this.infos&&(this.canvas.width=this.infos.inputWidth,this.canvas.height=this.infos.inputHeight,this.pixelCount=this.infos.inputWidth*this.infos.inputHeight,this.mask=new ImageData(this.infos.inputWidth,this.infos.inputHeight),this.inputOffset=this.infos.inputMemoryOffset/4,this.outputOffset=this.infos.outputMemoryOffset/4)}async initWasm(n,r){this.infos=await z2(n,r)}getOutputDimensions(){var n,r,m,Z;return{width:(r=(n=this.infos)==null?void 0:n.outputWidth)!=null?r:0,height:(Z=(m=this.infos)==null?void 0:m.outputHeight)!=null?Z:0}}async process(n){if(!this.mask||!this.infos)return;const r=this.infos.inputWidth,m=this.infos.inputHeight;this.context.drawImage(n,0,0,n.width,n.height,0,0,r,m);const Z=this.context.getImageData(0,0,r,m),I=this.infos.selectedTFLite.HEAPF32;for(let F=0;F<this.pixelCount;F++){const L=this.inputOffset+F*3;I[L]=Z.data[F*4]/255,I[L+1]=Z.data[F*4+1]/255,I[L+2]=Z.data[F*4+2]/255}this.infos.selectedTFLite._runInference();for(let F=0;F<this.pixelCount;F++){const L=this.infos.selectedTFLite.HEAPF32[this.outputOffset+F];this.mask.data[F*4]=this.mask.data[F*4+3]=255*L}return createImageBitmap(this.mask)}isGpuSupported(){var n,r,m;return(m=(r=(n=this.infos)==null?void 0:n.selectedTFLite)==null?void 0:r._isGPUEnabled())!=null?m:!1}}async function P2(o,n){const{wasm:r,insertableStreams:m,simd:Z}=await Js(o,n);if(!r.supported)throw r.message;if(!m.supported)throw m.message;if(!Z.supported)throw Z.message}async function Js(o,n){const r=new Cs;await r.initWasm(o,n);const m={wasm:{supported:typeof WebAssembly=="object"&&typeof WebAssembly.instantiate=="function",message:"Your browser does not support WebAssembly features."},simd:{supported:await K2(),message:"Your browser does not support simd features."},insertableStreams:{supported:!0},gpu:{supported:r.isGpuSupported(),message:"Your browser does not support gpu features."}};try{await qn()}catch(Z){m.insertableStreams.supported=!1,m.insertableStreams.message=Z}return m}const mi={};(function(){var o;function n(p){var W=0;return function(){return W<p.length?{done:!1,value:p[W++]}:{done:!0}}}var r=typeof Object.defineProperties=="function"?Object.defineProperty:function(p,W,V){return p==Array.prototype||p==Object.prototype||(p[W]=V.value),p};function m(p){p=[typeof globalThis=="object"&&globalThis,p,typeof window=="object"&&window,typeof self=="object"&&self,typeof global=="object"&&global];for(var W=0;W<p.length;++W){var V=p[W];if(V&&V.Math==Math)return V}throw Error("Cannot find global object")}var Z=m(this);function I(p,W){if(W)t:{var V=Z;p=p.split(".");for(var k=0;k<p.length-1;k++){var P=p[k];if(!(P in V))break t;V=V[P]}p=p[p.length-1],k=V[p],W=W(k),W!=k&&W!=null&&r(V,p,{configurable:!0,writable:!0,value:W})}}I("Symbol",function(p){function W(st){if(this instanceof W)throw new TypeError("Symbol is not a constructor");return new V(k+(st||"")+"_"+P++,st)}function V(st,z){this.g=st,r(this,"description",{configurable:!0,writable:!0,value:z})}if(p)return p;V.prototype.toString=function(){return this.g};var k="jscomp_symbol_"+(1e9*Math.random()>>>0)+"_",P=0;return W}),I("Symbol.iterator",function(p){if(p)return p;p=Symbol("Symbol.iterator");for(var W="Array Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array".split(" "),V=0;V<W.length;V++){var k=Z[W[V]];typeof k=="function"&&typeof k.prototype[p]!="function"&&r(k.prototype,p,{configurable:!0,writable:!0,value:function(){return F(n(this))}})}return p});function F(p){return p={next:p},p[Symbol.iterator]=function(){return this},p}function L(p){var W=typeof Symbol<"u"&&Symbol.iterator&&p[Symbol.iterator];return W?W.call(p):{next:n(p)}}function E(p){if(!(p instanceof Array)){p=L(p);for(var W,V=[];!(W=p.next()).done;)V.push(W.value);p=V}return p}var rt=typeof Object.create=="function"?Object.create:function(p){function W(){}return W.prototype=p,new W},O;if(typeof Object.setPrototypeOf=="function")O=Object.setPrototypeOf;else{var lt;t:{var Rt={a:!0},Wt={};try{Wt.__proto__=Rt,lt=Wt.a;break t}catch{}lt=!1}O=lt?function(p,W){if(p.__proto__=W,p.__proto__!==W)throw new TypeError(p+" is not extensible");return p}:null}var dt=O;function ht(p,W){if(p.prototype=rt(W.prototype),p.prototype.constructor=p,dt)dt(p,W);else for(var V in W)if(V!="prototype")if(Object.defineProperties){var k=Object.getOwnPropertyDescriptor(W,V);k&&Object.defineProperty(p,V,k)}else p[V]=W[V];p.ea=W.prototype}function Ft(){this.l=!1,this.i=null,this.h=void 0,this.g=1,this.s=this.m=0,this.j=null}function Tt(p){if(p.l)throw new TypeError("Generator is already running");p.l=!0}Ft.prototype.o=function(p){this.h=p};function At(p,W){p.j={U:W,V:!0},p.g=p.m||p.s}Ft.prototype.return=function(p){this.j={return:p},this.g=this.s};function _(p,W,V){return p.g=V,{value:W}}function Ee(p){this.g=new Ft,this.h=p}function an(p,W){Tt(p.g);var V=p.g.i;return V?Ve(p,"return"in V?V.return:function(k){return{value:k,done:!0}},W,p.g.return):(p.g.return(W),$t(p))}function Ve(p,W,V,k){try{var P=W.call(p.g.i,V);if(!(P instanceof Object))throw new TypeError("Iterator result "+P+" is not an object");if(!P.done)return p.g.l=!1,P;var st=P.value}catch(z){return p.g.i=null,At(p.g,z),$t(p)}return p.g.i=null,k.call(p.g,st),$t(p)}function $t(p){for(;p.g.g;)try{var W=p.h(p.g);if(W)return p.g.l=!1,{value:W.value,done:!1}}catch(V){p.g.h=void 0,At(p.g,V)}if(p.g.l=!1,p.g.j){if(W=p.g.j,p.g.j=null,W.V)throw W.U;return{value:W.return,done:!0}}return{value:void 0,done:!0}}function An(p){this.next=function(W){return Tt(p.g),p.g.i?W=Ve(p,p.g.i.next,W,p.g.o):(p.g.o(W),W=$t(p)),W},this.throw=function(W){return Tt(p.g),p.g.i?W=Ve(p,p.g.i.throw,W,p.g.o):(At(p.g,W),W=$t(p)),W},this.return=function(W){return an(p,W)},this[Symbol.iterator]=function(){return this}}function de(p,W){return W=new An(new Ee(W)),dt&&p.prototype&&dt(W,p.prototype),W}function gt(p,W){p instanceof String&&(p+="");var V=0,k=!1,P={next:function(){if(!k&&V<p.length){var st=V++;return{value:W(st,p[st]),done:!1}}return k=!0,{done:!0,value:void 0}}};return P[Symbol.iterator]=function(){return P},P}var pn=typeof Object.assign=="function"?Object.assign:function(p,W){for(var V=1;V<arguments.length;V++){var k=arguments[V];if(k)for(var P in k)Object.prototype.hasOwnProperty.call(k,P)&&(p[P]=k[P])}return p};I("Object.assign",function(p){return p||pn}),I("Promise",function(p){function W(z){this.h=0,this.i=void 0,this.g=[],this.o=!1;var it=this.j();try{z(it.resolve,it.reject)}catch(bt){it.reject(bt)}}function V(){this.g=null}function k(z){return z instanceof W?z:new W(function(it){it(z)})}if(p)return p;V.prototype.h=function(z){if(this.g==null){this.g=[];var it=this;this.i(function(){it.l()})}this.g.push(z)};var P=Z.setTimeout;V.prototype.i=function(z){P(z,0)},V.prototype.l=function(){for(;this.g&&this.g.length;){var z=this.g;this.g=[];for(var it=0;it<z.length;++it){var bt=z[it];z[it]=null;try{bt()}catch(xt){this.j(xt)}}}this.g=null},V.prototype.j=function(z){this.i(function(){throw z})},W.prototype.j=function(){function z(xt){return function(Kt){bt||(bt=!0,xt.call(it,Kt))}}var it=this,bt=!1;return{resolve:z(this.C),reject:z(this.l)}},W.prototype.C=function(z){if(z===this)this.l(new TypeError("A Promise cannot resolve to itself"));else if(z instanceof W)this.F(z);else{t:switch(typeof z){case"object":var it=z!=null;break t;case"function":it=!0;break t;default:it=!1}it?this.u(z):this.m(z)}},W.prototype.u=function(z){var it=void 0;try{it=z.then}catch(bt){this.l(bt);return}typeof it=="function"?this.G(it,z):this.m(z)},W.prototype.l=function(z){this.s(2,z)},W.prototype.m=function(z){this.s(1,z)},W.prototype.s=function(z,it){if(this.h!=0)throw Error("Cannot settle("+z+", "+it+"): Promise already settled in state"+this.h);this.h=z,this.i=it,this.h===2&&this.D(),this.A()},W.prototype.D=function(){var z=this;P(function(){if(z.B()){var it=Z.console;typeof it<"u"&&it.error(z.i)}},1)},W.prototype.B=function(){if(this.o)return!1;var z=Z.CustomEvent,it=Z.Event,bt=Z.dispatchEvent;return typeof bt>"u"?!0:(typeof z=="function"?z=new z("unhandledrejection",{cancelable:!0}):typeof it=="function"?z=new it("unhandledrejection",{cancelable:!0}):(z=Z.document.createEvent("CustomEvent"),z.initCustomEvent("unhandledrejection",!1,!0,z)),z.promise=this,z.reason=this.i,bt(z))},W.prototype.A=function(){if(this.g!=null){for(var z=0;z<this.g.length;++z)st.h(this.g[z]);this.g=null}};var st=new V;return W.prototype.F=function(z){var it=this.j();z.J(it.resolve,it.reject)},W.prototype.G=function(z,it){var bt=this.j();try{z.call(it,bt.resolve,bt.reject)}catch(xt){bt.reject(xt)}},W.prototype.then=function(z,it){function bt(qt,Et){return typeof qt=="function"?function(Yt){try{xt(qt(Yt))}catch(Ut){Kt(Ut)}}:Et}var xt,Kt,kt=new W(function(qt,Et){xt=qt,Kt=Et});return this.J(bt(z,xt),bt(it,Kt)),kt},W.prototype.catch=function(z){return this.then(void 0,z)},W.prototype.J=function(z,it){function bt(){switch(xt.h){case 1:z(xt.i);break;case 2:it(xt.i);break;default:throw Error("Unexpected state: "+xt.h)}}var xt=this;this.g==null?st.h(bt):this.g.push(bt),this.o=!0},W.resolve=k,W.reject=function(z){return new W(function(it,bt){bt(z)})},W.race=function(z){return new W(function(it,bt){for(var xt=L(z),Kt=xt.next();!Kt.done;Kt=xt.next())k(Kt.value).J(it,bt)})},W.all=function(z){var it=L(z),bt=it.next();return bt.done?k([]):new W(function(xt,Kt){function kt(Yt){return function(Ut){qt[Yt]=Ut,Et--,Et==0&&xt(qt)}}var qt=[],Et=0;do qt.push(void 0),Et++,k(bt.value).J(kt(qt.length-1),Kt),bt=it.next();while(!bt.done)})},W}),I("Object.is",function(p){return p||function(W,V){return W===V?W!==0||1/W===1/V:W!==W&&V!==V}}),I("Array.prototype.includes",function(p){return p||function(W,V){var k=this;k instanceof String&&(k=String(k));var P=k.length;for(V=V||0,0>V&&(V=Math.max(V+P,0));V<P;V++){var st=k[V];if(st===W||Object.is(st,W))return!0}return!1}}),I("String.prototype.includes",function(p){return p||function(W,V){if(this==null)throw new TypeError("The 'this' value for String.prototype.includes must not be null or undefined");if(W instanceof RegExp)throw new TypeError("First argument to String.prototype.includes must not be a regular expression");return this.indexOf(W,V||0)!==-1}}),I("Array.prototype.keys",function(p){return p||function(){return gt(this,function(W){return W})}});var jn=this||self;function Re(p,W){p=p.split(".");var V=jn;p[0]in V||typeof V.execScript>"u"||V.execScript("var "+p[0]);for(var k;p.length&&(k=p.shift());)p.length||W===void 0?V[k]&&V[k]!==Object.prototype[k]?V=V[k]:V=V[k]={}:V[k]=W}function Nt(p,W){return W=String.fromCharCode.apply(null,W),p==null?W:p+W}var Ye,on=typeof TextDecoder<"u",Xn,Fn=typeof TextEncoder<"u";function xn(p){if(Fn)p=(Xn||(Xn=new TextEncoder)).encode(p);else{var W=void 0;W=W===void 0?!1:W;for(var V=0,k=new Uint8Array(3*p.length),P=0;P<p.length;P++){var st=p.charCodeAt(P);if(128>st)k[V++]=st;else{if(2048>st)k[V++]=st>>6|192;else{if(55296<=st&&57343>=st){if(56319>=st&&P<p.length){var z=p.charCodeAt(++P);if(56320<=z&&57343>=z){st=1024*(st-55296)+z-56320+65536,k[V++]=st>>18|240,k[V++]=st>>12&63|128,k[V++]=st>>6&63|128,k[V++]=st&63|128;continue}else P--}if(W)throw Error("Found an unpaired surrogate");st=65533}k[V++]=st>>12|224,k[V++]=st>>6&63|128}k[V++]=st&63|128}}p=k.subarray(0,V)}return p}var Jn={},dn=null;function bn(p,W){W===void 0&&(W=0),Pe(),W=Jn[W];for(var V=Array(Math.floor(p.length/3)),k=W[64]||"",P=0,st=0;P<p.length-2;P+=3){var z=p[P],it=p[P+1],bt=p[P+2],xt=W[z>>2];z=W[(z&3)<<4|it>>4],it=W[(it&15)<<2|bt>>6],bt=W[bt&63],V[st++]=xt+z+it+bt}switch(xt=0,bt=k,p.length-P){case 2:xt=p[P+1],bt=W[(xt&15)<<2]||k;case 1:p=p[P],V[st]=W[p>>2]+W[(p&3)<<4|xt>>4]+bt+k}return V.join("")}function kn(p){var W=p.length,V=3*W/4;V%3?V=Math.floor(V):"=.".indexOf(p[W-1])!=-1&&(V="=.".indexOf(p[W-2])!=-1?V-2:V-1);var k=new Uint8Array(V),P=0;return Hn(p,function(st){k[P++]=st}),k.subarray(0,P)}function Hn(p,W){function V(bt){for(;k<p.length;){var xt=p.charAt(k++),Kt=dn[xt];if(Kt!=null)return Kt;if(!/^[\s\xa0]*$/.test(xt))throw Error("Unknown base64 encoding at char: "+xt)}return bt}Pe();for(var k=0;;){var P=V(-1),st=V(0),z=V(64),it=V(64);if(it===64&&P===-1)break;W(P<<2|st>>4),z!=64&&(W(st<<4&240|z>>2),it!=64&&W(z<<6&192|it))}}function Pe(){if(!dn){dn={};for(var p="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(""),W=["+/=","+/","-_=","-_.","-_"],V=0;5>V;V++){var k=p.concat(W[V].split(""));Jn[V]=k;for(var P=0;P<k.length;P++){var st=k[P];dn[st]===void 0&&(dn[st]=P)}}}}var Ae=typeof Uint8Array.prototype.slice=="function",In;function Wn(p,W,V){return W===V?In||(In=new Uint8Array(0)):Ae?p.slice(W,V):new Uint8Array(p.subarray(W,V))}var he=0,Le=0;function Oe(p,W){W=W===void 0?{}:W,W=W.v===void 0?!1:W.v,this.h=null,this.g=this.i=this.j=0,this.l=!1,this.v=W,p&&ne(this,p)}function ne(p,W){W=W.constructor===Uint8Array?W:W.constructor===ArrayBuffer?new Uint8Array(W):W.constructor===Array?new Uint8Array(W):W.constructor===String?kn(W):W instanceof Uint8Array?new Uint8Array(W.buffer,W.byteOffset,W.byteLength):new Uint8Array(0),p.h=W,p.j=0,p.i=p.h.length,p.g=p.j}Oe.prototype.reset=function(){this.g=this.j};function We(p){var W=p.h,V=W[p.g],k=V&127;return 128>V?(p.g+=1,k):(V=W[p.g+1],k|=(V&127)<<7,128>V?(p.g+=2,k):(V=W[p.g+2],k|=(V&127)<<14,128>V?(p.g+=3,k):(V=W[p.g+3],k|=(V&127)<<21,128>V?(p.g+=4,k):(V=W[p.g+4],k|=(V&15)<<28,128>V?(p.g+=5,k>>>0):(p.g+=5,128<=W[p.g++]&&128<=W[p.g++]&&128<=W[p.g++]&&128<=W[p.g++]&&p.g++,k)))))}function sn(p){var W=p.h[p.g],V=p.h[p.g+1],k=p.h[p.g+2],P=p.h[p.g+3];return p.g+=4,V=(W<<0|V<<8|k<<16|P<<24)>>>0,p=2*(V>>31)+1,W=V>>>23&255,V&=8388607,W==255?V?NaN:1/0*p:W==0?p*Math.pow(2,-149)*V:p*Math.pow(2,W-150)*(V+Math.pow(2,23))}var Me=[];function Qt(){this.g=new Uint8Array(64),this.h=0}Qt.prototype.push=function(p){if(!(this.h+1<this.g.length)){var W=this.g;this.g=new Uint8Array(Math.ceil(1+2*this.g.length)),this.g.set(W)}this.g[this.h++]=p},Qt.prototype.length=function(){return this.h},Qt.prototype.end=function(){var p=this.g,W=this.h;return this.h=0,Wn(p,0,W)};function Ze(p,W){for(;127<W;)p.push(W&127|128),W>>>=7;p.push(W)}function Ce(p){var W={},V=W.N===void 0?!1:W.N;this.o={v:W.v===void 0?!1:W.v},this.N=V,W=this.o,Me.length?(V=Me.pop(),W&&(V.v=W.v),p&&ne(V,p),p=V):p=new Oe(p,W),this.g=p,this.m=this.g.g,this.h=this.i=this.l=-1,this.j=!1}Ce.prototype.reset=function(){this.g.reset(),this.h=this.l=-1};function Bt(p){var W=p.g;if((W=W.g==W.i)||(W=p.j)||(W=p.g,W=W.l||0>W.g||W.g>W.i),W)return!1;p.m=p.g.g,W=We(p.g);var V=W&7;return V!=0&&V!=5&&V!=1&&V!=2&&V!=3&&V!=4?(p.j=!0,!1):(p.i=W,p.l=W>>>3,p.h=V,!0)}function Ie(p){switch(p.h){case 0:if(p.h!=0)Ie(p);else{for(p=p.g;p.h[p.g]&128;)p.g++;p.g++}break;case 1:p.h!=1?Ie(p):(p=p.g,p.g+=8);break;case 2:if(p.h!=2)Ie(p);else{var W=We(p.g);p=p.g,p.g+=W}break;case 5:p.h!=5?Ie(p):(p=p.g,p.g+=4);break;case 3:W=p.l;do{if(!Bt(p)){p.j=!0;break}if(p.h==4){p.l!=W&&(p.j=!0);break}Ie(p)}while(1);break;default:p.j=!0}}function zt(p,W,V){var k=p.g.i,P=We(p.g);return P=p.g.g+P,p.g.i=P,V(W,p),p.g.g=P,p.g.i=k,W}function ye(p){var W=We(p.g);p=p.g;var V=p.g;p.g+=W,p=p.h;var k;if(on)(k=Ye)||(k=Ye=new TextDecoder("utf-8",{fatal:!1})),k=k.decode(p.subarray(V,V+W));else{W=V+W;for(var P=[],st=null,z,it,bt;V<W;)z=p[V++],128>z?P.push(z):224>z?V>=W?P.push(65533):(it=p[V++],194>z||(it&192)!==128?(V--,P.push(65533)):P.push((z&31)<<6|it&63)):240>z?V>=W-1?P.push(65533):(it=p[V++],(it&192)!==128||z===224&&160>it||z===237&&160<=it||((k=p[V++])&192)!==128?(V--,P.push(65533)):P.push((z&15)<<12|(it&63)<<6|k&63)):244>=z?V>=W-2?P.push(65533):(it=p[V++],(it&192)!==128||(z<<28)+(it-144)>>30!==0||((k=p[V++])&192)!==128||((bt=p[V++])&192)!==128?(V--,P.push(65533)):(z=(z&7)<<18|(it&63)<<12|(k&63)<<6|bt&63,z-=65536,P.push((z>>10&1023)+55296,(z&1023)+56320))):P.push(65533),8192<=P.length&&(st=Nt(st,P),P.length=0);k=Nt(st,P)}return k}function Te(){this.h=[],this.i=0,this.g=new Qt}function $e(p,W){W.length!==0&&(p.h.push(W),p.i+=W.length)}function Xe(p){var W=p.i+p.g.length();if(W===0)return new Uint8Array(0);W=new Uint8Array(W);for(var V=p.h,k=V.length,P=0,st=0;st<k;st++){var z=V[st];z.length!==0&&(W.set(z,P),P+=z.length)}return V=p.g,k=V.h,k!==0&&(W.set(V.g.subarray(0,k),P),V.h=0),p.h=[W],W}function Pt(p,W,V){if(V!=null){Ze(p.g,8*W+5),p=p.g;var k=V;k=(V=0>k?1:0)?-k:k,k===0?0<1/k?he=Le=0:(Le=0,he=2147483648):isNaN(k)?(Le=0,he=2147483647):34028234663852886e22<k?(Le=0,he=(V<<31|2139095040)>>>0):11754943508222875e-54>k?(k=Math.round(k/Math.pow(2,-149)),Le=0,he=(V<<31|k)>>>0):(W=Math.floor(Math.log(k)/Math.LN2),k*=Math.pow(2,-W),k=Math.round(8388608*k)&8388607,Le=0,he=(V<<31|W+127<<23|k)>>>0),V=he,p.push(V>>>0&255),p.push(V>>>8&255),p.push(V>>>16&255),p.push(V>>>24&255)}}var je=typeof Uint8Array=="function";function _e(p,W,V){if(p!=null)return typeof p=="object"?je&&p instanceof Uint8Array?V(p):Se(p,W,V):W(p)}function Se(p,W,V){if(Array.isArray(p)){for(var k=Array(p.length),P=0;P<p.length;P++)k[P]=_e(p[P],W,V);return Array.isArray(p)&&p.W&&Qe(k),k}k={};for(P in p)k[P]=_e(p[P],W,V);return k}function Vn(p){return typeof p=="number"?isFinite(p)?p:String(p):p}var ln={W:{value:!0,configurable:!0}};function Qe(p){return Array.isArray(p)&&!Object.isFrozen(p)&&Object.defineProperties(p,ln),p}var un;function ve(p,W,V){var k=un;un=null,p||(p=k),k=this.constructor.ca,p||(p=k?[k]:[]),this.j=k?0:-1,this.i=null,this.g=p;t:{if(k=this.g.length,p=k-1,k&&(k=this.g[p],k!==null&&typeof k=="object"&&k.constructor===Object)){this.l=p-this.j,this.h=k;break t}W!==void 0&&-1<W?(this.l=Math.max(W,p+1-this.j),this.h=null):this.l=Number.MAX_VALUE}if(V)for(W=0;W<V.length;W++)p=V[W],p<this.l?(p+=this.j,(k=this.g[p])?Qe(k):this.g[p]=we):(Ge(this),(k=this.h[p])?Qe(k):this.h[p]=we)}var we=Object.freeze(Qe([]));function Ge(p){var W=p.l+p.j;p.g[W]||(p.h=p.g[W]={})}function re(p,W,V){return W===-1?null:(V===void 0?0:V)||W>=p.l?p.h?p.h[W]:void 0:p.g[W+p.j]}function De(p){var W=W===void 0?!1:W,V=re(p,1,W);return V==null&&(V=we),V===we&&(V=Qe([]),Ot(p,1,V,W)),V}function te(p,W,V){return p=re(p,W),p=p==null?p:+p,p==null?V===void 0?0:V:p}function Ot(p,W,V,k){(k===void 0?0:k)||W>=p.l?(Ge(p),p.h[W]=V):p.g[W+p.j]=V}function hn(p,W){p.i||(p.i={});var V=p.i[1];if(!V){var k=De(p);V=[];for(var P=0;P<k.length;P++)V[P]=new W(k[P]);p.i[1]=V}return V}function fe(p,W,V,k){var P=hn(p,V);W=W||new V,p=De(p),k!=null?(P.splice(k,0,W),p.splice(k,0,Jt(W))):(P.push(W),p.push(Jt(W)))}ve.prototype.toJSON=function(){var p=Jt(this);return Se(p,Vn,bn)};function Jt(p,W){if(p.i)for(var V in p.i){var k=p.i[V];if(Array.isArray(k))for(var P=0;P<k.length;P++)k[P]&&Jt(k[P]);else k&&Jt(k)}return p.g}ve.prototype.toString=function(){return Jt(this).toString()};function Vt(p,W){return p=re(p,W),p==null?0:p}function ie(p,W){return p=re(p,W),p==null?"":p}function Fe(p,W){if(p=p.m){$e(W,W.g.end());for(var V=0;V<p.length;V++)$e(W,p[V])}}function ee(p,W){if(W.h==4)return!1;var V=W.m;return Ie(W),W.N||(W=Wn(W.g.h,V,W.g.g),(V=p.m)?V.push(W):p.m=[W]),!0}function oe(p,W){var V=void 0;return new(V||(V=Promise))(function(k,P){function st(bt){try{it(W.next(bt))}catch(xt){P(xt)}}function z(bt){try{it(W.throw(bt))}catch(xt){P(xt)}}function it(bt){bt.done?k(bt.value):new V(function(xt){xt(bt.value)}).then(st,z)}it((W=W.apply(p,void 0)).next())})}function et(p){ve.call(this,p)}ht(et,ve);function ot(p,W){for(;Bt(W);)switch(W.i){case 8:var V=We(W.g);Ot(p,1,V);break;case 21:V=sn(W.g),Ot(p,2,V);break;case 26:V=ye(W),Ot(p,3,V);break;case 34:V=ye(W),Ot(p,4,V);break;default:if(!ee(p,W))return p}return p}function at(p){ve.call(this,p,-1,_t)}ht(at,ve),at.prototype.addClassification=function(p,W){fe(this,p,et,W)};var _t=[1];function ae(p){ve.call(this,p)}ht(ae,ve);function ue(p,W){for(;Bt(W);)switch(W.i){case 13:var V=sn(W.g);Ot(p,1,V);break;case 21:V=sn(W.g),Ot(p,2,V);break;case 29:V=sn(W.g),Ot(p,3,V);break;case 37:V=sn(W.g),Ot(p,4,V);break;case 45:V=sn(W.g),Ot(p,5,V);break;default:if(!ee(p,W))return p}return p}function Lt(p){ve.call(this,p,-1,me)}ht(Lt,ve);var me=[1];function Je(p){ve.call(this,p)}ht(Je,ve);function qe(p,W,V){if(V=p.createShader(V===0?p.VERTEX_SHADER:p.FRAGMENT_SHADER),p.shaderSource(V,W),p.compileShader(V),!p.getShaderParameter(V,p.COMPILE_STATUS))throw Error(`Could not compile WebGL shader.
3
+ data: ${I}`)})}logIfDebugEnabled(n,r,m){(gr.isDebugEnabled||this.debug.enabled)&&this.debug.logger(n,this.debug.name,r,m)}on(n,r){hi(r),n=Array.isArray(n)?n:[n];for(const m of n)Yr(m),Tr(this,m).add(r),this.logIfDebugEnabled("subscribe",m,void 0),uo(m)||this.emit(ai,{eventName:m,listener:r});return this.off.bind(this,n,r)}off(n,r){hi(r),n=Array.isArray(n)?n:[n];for(const m of n)Yr(m),Tr(this,m).delete(r),this.logIfDebugEnabled("unsubscribe",m,void 0),uo(m)||this.emit(di,{eventName:m,listener:r})}once(n){return new Promise(r=>{const m=this.on(n,Z=>{m(),r(Z)})})}events(n){n=Array.isArray(n)?n:[n];for(const r of n)Yr(r);return Ys(this,n)}async emit(n,r){Yr(n),this.logIfDebugEnabled("emit",n,r),T2(this,n,r);const m=Tr(this,n),Z=cr.get(this),I=[...m],F=uo(n)?[]:[...Z];await Ls,await Promise.all([...I.map(async L=>{if(m.has(L))return L(r)}),...F.map(async L=>{if(Z.has(L))return L(n,r)})])}async emitSerial(n,r){Yr(n),this.logIfDebugEnabled("emitSerial",n,r);const m=Tr(this,n),Z=cr.get(this),I=[...m],F=[...Z];await Ls;for(const L of I)m.has(L)&&await L(r);for(const L of F)Z.has(L)&&await L(n,r)}onAny(n){return hi(n),this.logIfDebugEnabled("subscribeAny",void 0,void 0),cr.get(this).add(n),this.emit(ai,{listener:n}),this.offAny.bind(this,n)}anyEvent(){return Ys(this)}offAny(n){hi(n),this.logIfDebugEnabled("unsubscribeAny",void 0,void 0),this.emit(di,{listener:n}),cr.get(this).delete(n)}clearListeners(n){n=Array.isArray(n)?n:[n];for(const r of n)if(this.logIfDebugEnabled("clear",r,void 0),typeof r=="string"||typeof r=="symbol"){Tr(this,r).clear();const m=Kr(this,r);for(const Z of m)Z.finish();m.clear()}else{cr.get(this).clear();for(const m of ci.get(this).values())m.clear();for(const m of Ur.get(this).values()){for(const Z of m)Z.finish();m.clear()}}}listenerCount(n){n=Array.isArray(n)?n:[n];let r=0;for(const m of n){if(typeof m=="string"){r+=cr.get(this).size+Tr(this,m).size+Kr(this,m).size+Kr(this).size;continue}typeof m<"u"&&Yr(m),r+=cr.get(this).size;for(const Z of ci.get(this).values())r+=Z.size;for(const Z of Ur.get(this).values())r+=Z.size}return r}bindMethods(n,r){if(typeof n!="object"||n===null)throw new TypeError("`target` must be an object");r=Ts(r);for(const m of r){if(n[m]!==void 0)throw new Error(`The property \`${m}\` already exists on \`target\``);Object.defineProperty(n,m,{enumerable:!1,value:this[m].bind(this)})}}}const ws=Object.getOwnPropertyNames(gr.prototype).filter(o=>o!=="constructor");Object.defineProperty(gr,"listenerAdded",{value:ai,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(gr,"listenerRemoved",{value:di,writable:!1,enumerable:!0,configurable:!1});var co=gr;function w2(o){return typeof o=="object"&&o!==null&&"message"in o&&typeof o.message=="string"}function F2(o){if(w2(o))return o;try{return new Error(JSON.stringify(o))}catch{return new Error(String(o))}}function ao(o){return F2(o).message}var Fs=(o=>(o.FPS_DROP="fps_drop",o))(Fs||{}),Hs=(o=>(o.start="start",o.transform="transform",o.flush="flush",o))(Hs||{}),fi=(o=>(o.pipeline_ended="pipeline_ended",o.pipeline_ended_with_error="pipeline_ended_with_error",o.pipeline_started="pipeline_started",o.pipeline_started_with_error="pipeline_started_with_error",o.pipeline_restarted="pipeline_restarted",o.pipeline_restarted_with_error="pipeline_restarted_with_error",o))(fi||{});const H2=500,C2=.8;class J2 extends co{constructor(n,r){super(),this.index_=r,this.uuid_=Ss(),this.framesTransformed_=0,this.transformer_=n,this.shouldStop_=!1,this.isFlashed_=!1,this.framesFromSource_=0,this.fps_=0,this.mediaTransformerQosReportStartTimestamp_=0,this.videoHeight_=0,this.videoWidth_=0,this.trackExpectedRate_=-1,this.transformerType_="Custom","getTransformerType"in n&&(this.transformerType_=n.getTransformerType());const m=new er().action("MediaTransformer").guid(this.uuid_).transformerType(this.transformerType_).variation("Create").build();nr.report(m)}setTrackExpectedRate(n){this.trackExpectedRate_=n}async start(n){if(this.controller_=n,this.transformer_&&typeof this.transformer_.start=="function")try{await this.transformer_.start(n)}catch(r){const m=new er().action("MediaTransformer").guid(this.uuid_).message(Pn.errors.transformer_start).transformerType(this.transformerType_).variation("Error").error(ao(r)).build();nr.report(m);const Z={eventMetaData:{transformerIndex:this.index_},error:r,function:"start"};this.emit("error",Z)}}async transform(n,r){var m,Z,I,F;if(this.mediaTransformerQosReportStartTimestamp_===0&&(this.mediaTransformerQosReportStartTimestamp_=Date.now()),n instanceof VideoFrame&&(this.videoHeight_=(m=n==null?void 0:n.displayHeight)!=null?m:0,this.videoWidth_=(Z=n==null?void 0:n.displayWidth)!=null?Z:0),++this.framesFromSource_,this.transformer_)if(this.shouldStop_)console.warn("[Pipeline] flush from transform"),n.close(),this.flush(r),r.terminate();else try{await((F=(I=this.transformer_).transform)==null?void 0:F.call(I,n,r)),++this.framesTransformed_,this.framesTransformed_===H2&&this.mediaTransformerQosReport()}catch(L){const E=new er().action("MediaTransformer").guid(this.uuid_).message(Pn.errors.transformer_transform).transformerType(this.transformerType_).variation("Error").error(ao(L)).build();nr.report(E);const rt={eventMetaData:{transformerIndex:this.index_},error:L,function:"transform"};this.emit("error",rt)}}async flush(n){if(this.transformer_&&typeof this.transformer_.flush=="function"&&!this.isFlashed_){this.isFlashed_=!0;try{await this.transformer_.flush(n)}catch(m){const Z=new er().action("MediaTransformer").guid(this.uuid_).message(Pn.errors.transformer_flush).transformerType(this.transformerType_).variation("Error").error(ao(m)).build();nr.report(Z);const I={eventMetaData:{transformerIndex:this.index_},error:m,function:"flush"};this.emit("error",I)}}this.mediaTransformerQosReport();const r=new er().action("MediaTransformer").guid(this.uuid_).transformerType(this.transformerType_).variation("Delete").build();nr.report(r)}stop(){console.log("[Pipeline] Stop stream."),this.controller_&&(this.flush(this.controller_),this.controller_.terminate()),this.shouldStop_=!0}mediaTransformerQosReport(){let n=(Date.now()-this.mediaTransformerQosReportStartTimestamp_)/1e3,r=this.framesFromSource_/n,m=this.framesTransformed_/n;if(this.trackExpectedRate_!=-1&&this.trackExpectedRate_*C2>r){const I={eventMetaData:{transformerIndex:this.index_},warningType:"fps_drop",dropInfo:{requested:this.trackExpectedRate_,current:r}};this.emit("warn",I)}const Z=new er().action("MediaTransformer").fps(r).transformedFps(m).framesTransformed(this.framesTransformed_).guid(this.uuid_).transformerType(this.transformerType_).videoHeight(this.videoHeight_).videoWidth(this.videoWidth_).variation("QoS").build();nr.report(Z),this.mediaTransformerQosReportStartTimestamp_=0,this.framesFromSource_=0,this.framesTransformed_=0}}class N2 extends co{constructor(n){super(),this.transformers_=[],this.trackExpectedRate_=-1;for(let r=0;r<n.length;r++){let m=new J2(n[r],r);m.on("error",Z=>{this.emit("error",Z)}),m.on("warn",Z=>{this.emit("warn",Z)}),this.transformers_.push(m)}}setTrackExpectedRate(n){this.trackExpectedRate_=n;for(let r of this.transformers_)r.setTrackExpectedRate(this.trackExpectedRate_)}async start(n,r){if(!this.transformers_||this.transformers_.length===0){console.log("[Pipeline] No transformers.");return}try{let m=n;for(let Z of this.transformers_)n=n.pipeThrough(new TransformStream(Z));n.pipeTo(r).then(async()=>{console.log("[Pipeline] Setup."),await r.abort(),await m.cancel(),this.emit("pipelineInfo","pipeline_ended")}).catch(async Z=>{n.cancel().then(()=>{console.log("[Pipeline] Shutting down streams after abort.")}).catch(I=>{console.error("[Pipeline] Error from stream transform:",I)}),await r.abort(Z),await m.cancel(Z),this.emit("pipelineInfo","pipeline_ended_with_error")})}catch{this.emit("pipelineInfo","pipeline_started_with_error"),this.destroy();return}this.emit("pipelineInfo","pipeline_started"),console.log("[Pipeline] Pipeline started.")}async destroy(){console.log("[Pipeline] Destroying Pipeline.");for(let n of this.transformers_)n.stop()}}class k2 extends co{constructor(){super(),this.uuid_=Ss(),this.trackExpectedRate_=-1;const n=new er().action("MediaProcessor").guid(this.uuid_).variation("Create").build();nr.report(n)}setTrackExpectedRate(n){this.trackExpectedRate_=n,this.pipeline_&&this.pipeline_.setTrackExpectedRate(this.trackExpectedRate_)}transform(n,r){return this.readable_=n,this.writable_=r,this.transformInternal()}transformInternal(){return new Promise((n,r)=>{if(!this.transformers_||this.transformers_.length===0){const Z=new er().action("MediaProcessor").guid(this.uuid_).message(Pn.errors.transformer_none).variation("Error").build();nr.report(Z),r("[MediaProcessor] Need to set transformers.");return}if(!this.readable_){const Z=new er().action("MediaProcessor").guid(this.uuid_).message(Pn.errors.readable_null).variation("Error").build();nr.report(Z),r("[MediaProcessor] Readable is null.");return}if(!this.writable_){const Z=new er().action("MediaProcessor").guid(this.uuid_).message(Pn.errors.writable_null).variation("Error").build();nr.report(Z),r("[MediaProcessor] Writable is null.");return}let m=!1;this.pipeline_&&(m=!0,this.pipeline_.clearListeners(),this.pipeline_.destroy()),this.pipeline_=new N2(this.transformers_),this.pipeline_.on("warn",Z=>{this.emit("warn",Z)}),this.pipeline_.on("error",Z=>{this.emit("error",Z)}),this.pipeline_.on("pipelineInfo",Z=>{m&&(Z==="pipeline_started"?Z=fi.pipeline_restarted:Z==="pipeline_started_with_error"&&(Z=fi.pipeline_restarted_with_error)),this.emit("pipelineInfo",Z)}),this.trackExpectedRate_!=-1&&this.pipeline_.setTrackExpectedRate(this.trackExpectedRate_),this.pipeline_.start(this.readable_,this.writable_).then(()=>{n()}).catch(Z=>{r(Z)})})}setTransformers(n){const r=new er().action("MediaProcessor").guid(this.uuid_).message(Pn.updates.transformer_new).variation("Update").build();return nr.report(r),this.transformers_=n,this.readable_&&this.writable_?this.transformInternal():Promise.resolve()}destroy(){return new Promise(n=>{this.pipeline_&&this.pipeline_.destroy();const r=new er().action("MediaProcessor").guid(this.uuid_).variation("Delete").build();nr.report(r),n()})}}class E2{constructor(){this.processor_=null,this.generator_=null}init(n){return new Promise((r,m)=>{try{this.processor_=new MediaStreamTrackProcessor(n)}catch(Z){console.log(`[InsertableStreamHelper] MediaStreamTrackProcessor failed: ${Z}`),m(Z)}try{n.kind==="audio"?this.generator_=new MediaStreamTrackGenerator({kind:"audio"}):n.kind==="video"?this.generator_=new MediaStreamTrackGenerator({kind:"video"}):m("kind not supported")}catch(Z){console.log(`[InsertableStreamHelper] MediaStreamTrackGenerator failed: ${Z}`),m(Z)}r()})}getReadable(){return this.processor_.readable}getWriteable(){return this.generator_.writable}getProccesorTrack(){return this.generator_}}class U2{constructor(n){this.insertableStreamHelper_=new E2,this.mediaProcessor_=n}setTrack(n){return new Promise((r,m)=>{this.insertableStreamHelper_.init(n).then(()=>{this.mediaProcessor_.transform(this.insertableStreamHelper_.getReadable(),this.insertableStreamHelper_.getWriteable()).then(()=>{r(this.insertableStreamHelper_.getProccesorTrack())}).catch(Z=>{m(Z)})}).catch(Z=>{m(Z)})})}destroy(){return new Promise((n,r)=>{this.mediaProcessor_?this.mediaProcessor_.destroy().then(()=>{n()}).catch(m=>{r(m)}):r("no processor")})}}var Mr=(o=>(o.Low="Low",o.High="High",o))(Mr||{});const K2=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]));var M2=function(){var o=typeof document<"u"&&document.currentScript?document.currentScript.src:void 0;return function(n){n=n||{};var r=typeof n<"u"?n:{},m,Z;r.ready=new Promise(function(et,ot){m=et,Z=ot});var I={},F;for(F in r)r.hasOwnProperty(F)&&(I[F]=r[F]);var L="./this.program",E=function(et,ot){throw ot},rt=!0,O="";function lt(et){return r.locateFile?r.locateFile(et,O):O+et}var Rt;typeof document<"u"&&document.currentScript&&(O=document.currentScript.src),o&&(O=o),O.indexOf("blob:")!==0?O=O.substr(0,O.replace(/[?#].*/,"").lastIndexOf("/")+1):O="";var Wt=r.print||console.log.bind(console),dt=r.printErr||console.warn.bind(console);for(F in I)I.hasOwnProperty(F)&&(r[F]=I[F]);I=null,r.arguments&&r.arguments,r.thisProgram&&(L=r.thisProgram),r.quit&&(E=r.quit);var ht;r.wasmBinary&&(ht=r.wasmBinary);var Ft=r.noExitRuntime||!0;typeof WebAssembly!="object"&&he("no native wasm support detected");var Tt,At=!1,_=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0;function Ee(et,ot,at){for(var _t=ot+at,ae=ot;et[ae]&&!(ae>=_t);)++ae;if(ae-ot>16&&et.subarray&&_)return _.decode(et.subarray(ot,ae));for(var ue="";ot<ae;){var Lt=et[ot++];if(!(Lt&128)){ue+=String.fromCharCode(Lt);continue}var me=et[ot++]&63;if((Lt&224)==192){ue+=String.fromCharCode((Lt&31)<<6|me);continue}var Je=et[ot++]&63;if((Lt&240)==224?Lt=(Lt&15)<<12|me<<6|Je:Lt=(Lt&7)<<18|me<<12|Je<<6|et[ot++]&63,Lt<65536)ue+=String.fromCharCode(Lt);else{var qe=Lt-65536;ue+=String.fromCharCode(55296|qe>>10,56320|qe&1023)}}return ue}function an(et,ot){return et?Ee(gt,et,ot):""}function Ve(et,ot,at){for(var _t=0;_t<et.length;++_t)de[ot++>>0]=et.charCodeAt(_t);at||(de[ot>>0]=0)}function $t(et,ot){return et%ot>0&&(et+=ot-et%ot),et}var An,de,gt,pn;function jn(et){An=et,r.HEAP8=de=new Int8Array(et),r.HEAP16=new Int16Array(et),r.HEAP32=pn=new Int32Array(et),r.HEAPU8=gt=new Uint8Array(et),r.HEAPU16=new Uint16Array(et),r.HEAPU32=new Uint32Array(et),r.HEAPF32=new Float32Array(et),r.HEAPF64=new Float64Array(et)}r.INITIAL_MEMORY;var Re,Nt=[],Ye=[],on=[],Xn=0;function Fn(){return Ft||Xn>0}function xn(){if(r.preRun)for(typeof r.preRun=="function"&&(r.preRun=[r.preRun]);r.preRun.length;)bn(r.preRun.shift());Qt(Nt)}function Jn(){Qt(Ye)}function dn(){if(r.postRun)for(typeof r.postRun=="function"&&(r.postRun=[r.postRun]);r.postRun.length;)Hn(r.postRun.shift());Qt(on)}function bn(et){Nt.unshift(et)}function kn(et){Ye.unshift(et)}function Hn(et){on.unshift(et)}var Pe=0,Ae=null;function In(et){Pe++,r.monitorRunDependencies&&r.monitorRunDependencies(Pe)}function Wn(et){if(Pe--,r.monitorRunDependencies&&r.monitorRunDependencies(Pe),Pe==0&&Ae){var ot=Ae;Ae=null,ot()}}r.preloadedImages={},r.preloadedAudios={};function he(et){r.onAbort&&r.onAbort(et),et="Aborted("+et+")",dt(et),At=!0,et+=". Build with -s ASSERTIONS=1 for more info.";var ot=new WebAssembly.RuntimeError(et);throw Z(ot),ot}var Le="data:application/octet-stream;base64,";function Oe(et){return et.startsWith(Le)}var ne;ne="tflite-simd.wasm",Oe(ne)||(ne=lt(ne));function We(et){try{if(et==ne&&ht)return new Uint8Array(ht);if(!Rt)throw"both async and sync fetching of the wasm failed"}catch(ot){he(ot)}}function sn(){return!ht&&rt&&typeof fetch=="function"?fetch(ne,{credentials:"same-origin"}).then(function(et){if(!et.ok)throw"failed to load wasm binary file at '"+ne+"'";return et.arrayBuffer()}).catch(function(){return We(ne)}):Promise.resolve().then(function(){return We(ne)})}function Me(){var et={a:fe};function ot(Lt,me){var Je=Lt.exports;r.asm=Je,Tt=r.asm.q,jn(Tt.buffer),Re=r.asm.E,kn(r.asm.r),Wn()}In();function at(Lt){ot(Lt.instance)}function _t(Lt){return sn().then(function(me){return WebAssembly.instantiate(me,et)}).then(function(me){return me}).then(Lt,function(me){dt("failed to asynchronously prepare wasm: "+me),he(me)})}function ae(){return!ht&&typeof WebAssembly.instantiateStreaming=="function"&&!Oe(ne)&&typeof fetch=="function"?fetch(ne,{credentials:"same-origin"}).then(function(Lt){var me=WebAssembly.instantiateStreaming(Lt,et);return me.then(at,function(Je){return dt("wasm streaming compile failed: "+Je),dt("falling back to ArrayBuffer instantiation"),_t(at)})}):_t(at)}if(r.instantiateWasm)try{var ue=r.instantiateWasm(et,ot);return ue}catch(Lt){return dt("Module.instantiateWasm callback failed with error: "+Lt),!1}return ae().catch(Z),{}}function Qt(et){for(;et.length>0;){var ot=et.shift();if(typeof ot=="function"){ot(r);continue}var at=ot.func;typeof at=="number"?ot.arg===void 0?Re.get(at)():Re.get(at)(ot.arg):at(ot.arg===void 0?null:ot.arg)}}function Ze(et,ot,at,_t){he("Assertion failed: "+an(et)+", at: "+[ot?an(ot):"unknown filename",at,_t?an(_t):"unknown function"])}function Ce(et,ot){he("To use dlopen, you need to use Emscripten's linking support, see https://github.com/emscripten-core/emscripten/wiki/Linking")}function Bt(et,ot){he("To use dlopen, you need to use Emscripten's linking support, see https://github.com/emscripten-core/emscripten/wiki/Linking")}function Ie(){he("")}var zt;zt=function(){return performance.now()};var ye=!0;function Te(et){return pn[Jt()>>2]=et,et}function $e(et,ot){var at;if(et===0)at=Date.now();else if((et===1||et===4)&&ye)at=zt();else return Te(28),-1;return pn[ot>>2]=at/1e3|0,pn[ot+4>>2]=at%1e3*1e3*1e3|0,0}function Xe(){return 2147483648}function Pt(et,ot,at){gt.copyWithin(et,ot,ot+at)}function je(et){try{return Tt.grow(et-An.byteLength+65535>>>16),jn(Tt.buffer),1}catch{}}function _e(et){var ot=gt.length;et=et>>>0;var at=2147483648;if(et>at)return!1;for(var _t=1;_t<=4;_t*=2){var ae=ot*(1+.2/_t);ae=Math.min(ae,et+100663296);var ue=Math.min(at,$t(Math.max(et,ae),65536)),Lt=je(ue);if(Lt)return!0}return!1}function Se(et){for(var ot=zt();zt()-ot<et;);}var Vn={};function ln(){return L||"./this.program"}function Qe(){if(!Qe.strings){var et=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",ot={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:et,_:ln()};for(var at in Vn)Vn[at]===void 0?delete ot[at]:ot[at]=Vn[at];var _t=[];for(var at in ot)_t.push(at+"="+ot[at]);Qe.strings=_t}return Qe.strings}var un={mappings:{},buffers:[null,[],[]],printChar:function(et,ot){var at=un.buffers[et];ot===0||ot===10?((et===1?Wt:dt)(Ee(at,0)),at.length=0):at.push(ot)},varargs:void 0,get:function(){un.varargs+=4;var et=pn[un.varargs-4>>2];return et},getStr:function(et){var ot=an(et);return ot},get64:function(et,ot){return et}};function ve(et,ot){var at=0;return Qe().forEach(function(_t,ae){var ue=ot+at;pn[et+ae*4>>2]=ue,Ve(_t,ue),at+=_t.length+1}),0}function we(et,ot){var at=Qe();pn[et>>2]=at.length;var _t=0;return at.forEach(function(ae){_t+=ae.length+1}),pn[ot>>2]=_t,0}function Ge(et){ee(et)}function re(et){return 0}function De(et,ot,at,_t,ae){}function te(et,ot,at,_t){for(var ae=0,ue=0;ue<at;ue++){for(var Lt=pn[ot+ue*8>>2],me=pn[ot+(ue*8+4)>>2],Je=0;Je<me;Je++)un.printChar(et,gt[Lt+Je]);ae+=me}return pn[_t>>2]=ae,0}function Ot(){if(typeof crypto=="object"&&typeof crypto.getRandomValues=="function"){var et=new Uint8Array(1);return function(){return crypto.getRandomValues(et),et[0]}}else return function(){he("randomDevice")}}function hn(et,ot){hn.randomDevice||(hn.randomDevice=Ot());for(var at=0;at<ot;at++)de[et+at>>0]=hn.randomDevice();return 0}var fe={a:Ze,e:Ce,d:Bt,b:Ie,n:$e,h:Xe,l:Pt,m:_e,p:Se,f:ve,g:we,j:Ge,i:re,k:De,c:te,o:hn};Me(),r.___wasm_call_ctors=function(){return(r.___wasm_call_ctors=r.asm.r).apply(null,arguments)},r._getModelBufferMemoryOffset=function(){return(r._getModelBufferMemoryOffset=r.asm.s).apply(null,arguments)},r._getInputMemoryOffset=function(){return(r._getInputMemoryOffset=r.asm.t).apply(null,arguments)},r._getInputHeight=function(){return(r._getInputHeight=r.asm.u).apply(null,arguments)},r._getInputWidth=function(){return(r._getInputWidth=r.asm.v).apply(null,arguments)},r._getInputChannelCount=function(){return(r._getInputChannelCount=r.asm.w).apply(null,arguments)},r._getOutputMemoryOffset=function(){return(r._getOutputMemoryOffset=r.asm.x).apply(null,arguments)},r._getOutputHeight=function(){return(r._getOutputHeight=r.asm.y).apply(null,arguments)},r._getOutputWidth=function(){return(r._getOutputWidth=r.asm.z).apply(null,arguments)},r._getOutputChannelCount=function(){return(r._getOutputChannelCount=r.asm.A).apply(null,arguments)},r._loadModel=function(){return(r._loadModel=r.asm.B).apply(null,arguments)},r._runInference=function(){return(r._runInference=r.asm.C).apply(null,arguments)},r._isGPUEnabled=function(){return(r._isGPUEnabled=r.asm.D).apply(null,arguments)};var Jt=r.___errno_location=function(){return(Jt=r.___errno_location=r.asm.F).apply(null,arguments)},Vt;function ie(et){this.name="ExitStatus",this.message="Program terminated with exit("+et+")",this.status=et}Ae=function et(){Vt||Fe(),Vt||(Ae=et)};function Fe(et){if(Pe>0||(xn(),Pe>0))return;function ot(){Vt||(Vt=!0,r.calledRun=!0,!At&&(Jn(),m(r),r.onRuntimeInitialized&&r.onRuntimeInitialized(),dn()))}r.setStatus?(r.setStatus("Running..."),setTimeout(function(){setTimeout(function(){r.setStatus("")},1),ot()},1)):ot()}r.run=Fe;function ee(et,ot){oe(et)}function oe(et){Fn()||(r.onExit&&r.onExit(et),At=!0),E(et,new ie(et))}if(r.preInit)for(typeof r.preInit=="function"&&(r.preInit=[r.preInit]);r.preInit.length>0;)r.preInit.pop()();return Fe(),n.ready}}();class B2{constructor(){Ht(this,"selectedTFLite");Ht(this,"isSIMDSupported",!1);Ht(this,"isThreadsSupported",!1);Ht(this,"inputWidth",0);Ht(this,"inputHeight",0);Ht(this,"inputChannelCount",0);Ht(this,"inputMemoryOffset",0);Ht(this,"outputWidth",0);Ht(this,"outputHeight",0);Ht(this,"outputChannelCount",0);Ht(this,"outputMemoryOffset",0)}}const A2="https://d3opqjmqzxf057.cloudfront.net/vonage-tensorflow-wasm/tflite-simd-wasm/1.1.3/",j2="https://d3opqjmqzxf057.cloudfront.net/ml/selfie_segmentation/4.0.0/";async function z2(o=A2,n=j2){let r=new B2;var m=new Promise(function(Z,I){async function F(){return M2({locateFile:function(rt){return o+rt}})}async function L(E){return new Promise(async(rt,O)=>{const lt=E;if(typeof lt>"u")return O("TFLite backend unavailable: wasmSimd");const Rt="selfie_segmentation_landscape";console.log("Loading tflite model:",Rt);let Wt=n+`${Rt}.tflite`;console.log("TFLite modelUrl: "+Wt);try{const ht=await(await fetch(Wt)).arrayBuffer();console.log("Model buffer size:",ht.byteLength);const Ft=lt._getModelBufferMemoryOffset();console.log("Model buffer memory offset:",Ft),console.log("Loading model buffer..."),lt.HEAPU8.set(new Uint8Array(ht),Ft);const Tt=lt._loadModel(ht.byteLength);if(console.log("Load model result:",Tt),Tt!==0){O("Cannot load model");return}r.inputWidth=lt._getInputWidth(),r.inputHeight=lt._getInputHeight(),r.inputChannelCount=lt._getInputChannelCount(),r.inputMemoryOffset=lt._getInputMemoryOffset(),console.log("Input memory offset:",r.inputMemoryOffset),console.log("Input height:",r.inputHeight),console.log("Input width:",r.inputWidth),console.log("Input channels:",r.inputChannelCount),r.outputMemoryOffset=lt._getOutputMemoryOffset(),r.outputWidth=lt._getOutputWidth(),r.outputHeight=lt._getOutputHeight(),r.outputChannelCount=lt._getOutputChannelCount(),console.log("Output memory offset:",r.outputMemoryOffset),console.log("Output height:",r.outputHeight),console.log("Output width:",r.outputWidth),console.log("Output channels:",r.outputChannelCount),r.selectedTFLite=lt}catch(dt){O(dt);return}rt()})}F().then(E=>{if(E===null)throw console.error("loadTFLite null"),"loadTFLite null";L(E).then(rt=>{Z(r)}).catch(rt=>{console.error("loadTFLiteModel error"),I("loadTFLiteModel error")})}).catch(E=>{console.error("loadTFLite error:",E),I("loadTFLite error:"+E)})});return m}class Cs{constructor(){Ht(this,"canvas",new OffscreenCanvas(0,0));Ht(this,"context",this.canvas.getContext("2d",{willReadFrequently:!0}));Ht(this,"pixelCount",0);Ht(this,"inputOffset",0);Ht(this,"outputOffset",0);Ht(this,"infos");Ht(this,"mask")}async init(n,r){await this.initWasm(n,r),this.infos&&(this.canvas.width=this.infos.inputWidth,this.canvas.height=this.infos.inputHeight,this.pixelCount=this.infos.inputWidth*this.infos.inputHeight,this.mask=new ImageData(this.infos.inputWidth,this.infos.inputHeight),this.inputOffset=this.infos.inputMemoryOffset/4,this.outputOffset=this.infos.outputMemoryOffset/4)}async initWasm(n,r){this.infos=await z2(n,r)}getOutputDimensions(){var n,r,m,Z;return{width:(r=(n=this.infos)==null?void 0:n.outputWidth)!=null?r:0,height:(Z=(m=this.infos)==null?void 0:m.outputHeight)!=null?Z:0}}async process(n){if(!this.mask||!this.infos)return;const r=this.infos.inputWidth,m=this.infos.inputHeight;this.context.drawImage(n,0,0,n.width,n.height,0,0,r,m);const Z=this.context.getImageData(0,0,r,m),I=this.infos.selectedTFLite.HEAPF32;for(let F=0;F<this.pixelCount;F++){const L=this.inputOffset+F*3;I[L]=Z.data[F*4]/255,I[L+1]=Z.data[F*4+1]/255,I[L+2]=Z.data[F*4+2]/255}this.infos.selectedTFLite._runInference();for(let F=0;F<this.pixelCount;F++){const L=this.infos.selectedTFLite.HEAPF32[this.outputOffset+F];this.mask.data[F*4]=this.mask.data[F*4+3]=255*L}return createImageBitmap(this.mask)}isGpuSupported(){var n,r,m;return(m=(r=(n=this.infos)==null?void 0:n.selectedTFLite)==null?void 0:r._isGPUEnabled())!=null?m:!1}}async function P2(o,n){const{wasm:r,insertableStreams:m,simd:Z,webgl:I}=await Js(o,n);if(!r.supported)throw r.message;if(!m.supported)throw m.message;if(!Z.supported)throw Z.message;if(!I.supported)throw I.message}async function Js(o,n){const r=new Cs;await r.initWasm(o,n);const m={wasm:{supported:typeof WebAssembly=="object"&&typeof WebAssembly.instantiate=="function",message:"Your browser does not support WebAssembly features."},simd:{supported:await K2(),message:"Your browser does not support simd features."},insertableStreams:{supported:!0},gpu:{supported:r.isGpuSupported(),message:"Your browser does not support gpu features."},webgl:O2()};try{await qn()}catch(Z){m.insertableStreams.supported=!1,m.insertableStreams.message=Z}return m}function O2(){return OffscreenCanvas?new OffscreenCanvas(0,0).getContext("webgl2")?{supported:!0}:{supported:!1,message:"Your browser does not support webgl 2"}:{supported:!1,message:"Your browser does not support offscreen canvas"}}const mi={};(function(){var o;function n(p){var W=0;return function(){return W<p.length?{done:!1,value:p[W++]}:{done:!0}}}var r=typeof Object.defineProperties=="function"?Object.defineProperty:function(p,W,V){return p==Array.prototype||p==Object.prototype||(p[W]=V.value),p};function m(p){p=[typeof globalThis=="object"&&globalThis,p,typeof window=="object"&&window,typeof self=="object"&&self,typeof global=="object"&&global];for(var W=0;W<p.length;++W){var V=p[W];if(V&&V.Math==Math)return V}throw Error("Cannot find global object")}var Z=m(this);function I(p,W){if(W)t:{var V=Z;p=p.split(".");for(var k=0;k<p.length-1;k++){var P=p[k];if(!(P in V))break t;V=V[P]}p=p[p.length-1],k=V[p],W=W(k),W!=k&&W!=null&&r(V,p,{configurable:!0,writable:!0,value:W})}}I("Symbol",function(p){function W(st){if(this instanceof W)throw new TypeError("Symbol is not a constructor");return new V(k+(st||"")+"_"+P++,st)}function V(st,z){this.g=st,r(this,"description",{configurable:!0,writable:!0,value:z})}if(p)return p;V.prototype.toString=function(){return this.g};var k="jscomp_symbol_"+(1e9*Math.random()>>>0)+"_",P=0;return W}),I("Symbol.iterator",function(p){if(p)return p;p=Symbol("Symbol.iterator");for(var W="Array Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array".split(" "),V=0;V<W.length;V++){var k=Z[W[V]];typeof k=="function"&&typeof k.prototype[p]!="function"&&r(k.prototype,p,{configurable:!0,writable:!0,value:function(){return F(n(this))}})}return p});function F(p){return p={next:p},p[Symbol.iterator]=function(){return this},p}function L(p){var W=typeof Symbol<"u"&&Symbol.iterator&&p[Symbol.iterator];return W?W.call(p):{next:n(p)}}function E(p){if(!(p instanceof Array)){p=L(p);for(var W,V=[];!(W=p.next()).done;)V.push(W.value);p=V}return p}var rt=typeof Object.create=="function"?Object.create:function(p){function W(){}return W.prototype=p,new W},O;if(typeof Object.setPrototypeOf=="function")O=Object.setPrototypeOf;else{var lt;t:{var Rt={a:!0},Wt={};try{Wt.__proto__=Rt,lt=Wt.a;break t}catch{}lt=!1}O=lt?function(p,W){if(p.__proto__=W,p.__proto__!==W)throw new TypeError(p+" is not extensible");return p}:null}var dt=O;function ht(p,W){if(p.prototype=rt(W.prototype),p.prototype.constructor=p,dt)dt(p,W);else for(var V in W)if(V!="prototype")if(Object.defineProperties){var k=Object.getOwnPropertyDescriptor(W,V);k&&Object.defineProperty(p,V,k)}else p[V]=W[V];p.ea=W.prototype}function Ft(){this.l=!1,this.i=null,this.h=void 0,this.g=1,this.s=this.m=0,this.j=null}function Tt(p){if(p.l)throw new TypeError("Generator is already running");p.l=!0}Ft.prototype.o=function(p){this.h=p};function At(p,W){p.j={U:W,V:!0},p.g=p.m||p.s}Ft.prototype.return=function(p){this.j={return:p},this.g=this.s};function _(p,W,V){return p.g=V,{value:W}}function Ee(p){this.g=new Ft,this.h=p}function an(p,W){Tt(p.g);var V=p.g.i;return V?Ve(p,"return"in V?V.return:function(k){return{value:k,done:!0}},W,p.g.return):(p.g.return(W),$t(p))}function Ve(p,W,V,k){try{var P=W.call(p.g.i,V);if(!(P instanceof Object))throw new TypeError("Iterator result "+P+" is not an object");if(!P.done)return p.g.l=!1,P;var st=P.value}catch(z){return p.g.i=null,At(p.g,z),$t(p)}return p.g.i=null,k.call(p.g,st),$t(p)}function $t(p){for(;p.g.g;)try{var W=p.h(p.g);if(W)return p.g.l=!1,{value:W.value,done:!1}}catch(V){p.g.h=void 0,At(p.g,V)}if(p.g.l=!1,p.g.j){if(W=p.g.j,p.g.j=null,W.V)throw W.U;return{value:W.return,done:!0}}return{value:void 0,done:!0}}function An(p){this.next=function(W){return Tt(p.g),p.g.i?W=Ve(p,p.g.i.next,W,p.g.o):(p.g.o(W),W=$t(p)),W},this.throw=function(W){return Tt(p.g),p.g.i?W=Ve(p,p.g.i.throw,W,p.g.o):(At(p.g,W),W=$t(p)),W},this.return=function(W){return an(p,W)},this[Symbol.iterator]=function(){return this}}function de(p,W){return W=new An(new Ee(W)),dt&&p.prototype&&dt(W,p.prototype),W}function gt(p,W){p instanceof String&&(p+="");var V=0,k=!1,P={next:function(){if(!k&&V<p.length){var st=V++;return{value:W(st,p[st]),done:!1}}return k=!0,{done:!0,value:void 0}}};return P[Symbol.iterator]=function(){return P},P}var pn=typeof Object.assign=="function"?Object.assign:function(p,W){for(var V=1;V<arguments.length;V++){var k=arguments[V];if(k)for(var P in k)Object.prototype.hasOwnProperty.call(k,P)&&(p[P]=k[P])}return p};I("Object.assign",function(p){return p||pn}),I("Promise",function(p){function W(z){this.h=0,this.i=void 0,this.g=[],this.o=!1;var it=this.j();try{z(it.resolve,it.reject)}catch(bt){it.reject(bt)}}function V(){this.g=null}function k(z){return z instanceof W?z:new W(function(it){it(z)})}if(p)return p;V.prototype.h=function(z){if(this.g==null){this.g=[];var it=this;this.i(function(){it.l()})}this.g.push(z)};var P=Z.setTimeout;V.prototype.i=function(z){P(z,0)},V.prototype.l=function(){for(;this.g&&this.g.length;){var z=this.g;this.g=[];for(var it=0;it<z.length;++it){var bt=z[it];z[it]=null;try{bt()}catch(xt){this.j(xt)}}}this.g=null},V.prototype.j=function(z){this.i(function(){throw z})},W.prototype.j=function(){function z(xt){return function(Kt){bt||(bt=!0,xt.call(it,Kt))}}var it=this,bt=!1;return{resolve:z(this.C),reject:z(this.l)}},W.prototype.C=function(z){if(z===this)this.l(new TypeError("A Promise cannot resolve to itself"));else if(z instanceof W)this.F(z);else{t:switch(typeof z){case"object":var it=z!=null;break t;case"function":it=!0;break t;default:it=!1}it?this.u(z):this.m(z)}},W.prototype.u=function(z){var it=void 0;try{it=z.then}catch(bt){this.l(bt);return}typeof it=="function"?this.G(it,z):this.m(z)},W.prototype.l=function(z){this.s(2,z)},W.prototype.m=function(z){this.s(1,z)},W.prototype.s=function(z,it){if(this.h!=0)throw Error("Cannot settle("+z+", "+it+"): Promise already settled in state"+this.h);this.h=z,this.i=it,this.h===2&&this.D(),this.A()},W.prototype.D=function(){var z=this;P(function(){if(z.B()){var it=Z.console;typeof it<"u"&&it.error(z.i)}},1)},W.prototype.B=function(){if(this.o)return!1;var z=Z.CustomEvent,it=Z.Event,bt=Z.dispatchEvent;return typeof bt>"u"?!0:(typeof z=="function"?z=new z("unhandledrejection",{cancelable:!0}):typeof it=="function"?z=new it("unhandledrejection",{cancelable:!0}):(z=Z.document.createEvent("CustomEvent"),z.initCustomEvent("unhandledrejection",!1,!0,z)),z.promise=this,z.reason=this.i,bt(z))},W.prototype.A=function(){if(this.g!=null){for(var z=0;z<this.g.length;++z)st.h(this.g[z]);this.g=null}};var st=new V;return W.prototype.F=function(z){var it=this.j();z.J(it.resolve,it.reject)},W.prototype.G=function(z,it){var bt=this.j();try{z.call(it,bt.resolve,bt.reject)}catch(xt){bt.reject(xt)}},W.prototype.then=function(z,it){function bt(qt,Et){return typeof qt=="function"?function(Yt){try{xt(qt(Yt))}catch(Ut){Kt(Ut)}}:Et}var xt,Kt,kt=new W(function(qt,Et){xt=qt,Kt=Et});return this.J(bt(z,xt),bt(it,Kt)),kt},W.prototype.catch=function(z){return this.then(void 0,z)},W.prototype.J=function(z,it){function bt(){switch(xt.h){case 1:z(xt.i);break;case 2:it(xt.i);break;default:throw Error("Unexpected state: "+xt.h)}}var xt=this;this.g==null?st.h(bt):this.g.push(bt),this.o=!0},W.resolve=k,W.reject=function(z){return new W(function(it,bt){bt(z)})},W.race=function(z){return new W(function(it,bt){for(var xt=L(z),Kt=xt.next();!Kt.done;Kt=xt.next())k(Kt.value).J(it,bt)})},W.all=function(z){var it=L(z),bt=it.next();return bt.done?k([]):new W(function(xt,Kt){function kt(Yt){return function(Ut){qt[Yt]=Ut,Et--,Et==0&&xt(qt)}}var qt=[],Et=0;do qt.push(void 0),Et++,k(bt.value).J(kt(qt.length-1),Kt),bt=it.next();while(!bt.done)})},W}),I("Object.is",function(p){return p||function(W,V){return W===V?W!==0||1/W===1/V:W!==W&&V!==V}}),I("Array.prototype.includes",function(p){return p||function(W,V){var k=this;k instanceof String&&(k=String(k));var P=k.length;for(V=V||0,0>V&&(V=Math.max(V+P,0));V<P;V++){var st=k[V];if(st===W||Object.is(st,W))return!0}return!1}}),I("String.prototype.includes",function(p){return p||function(W,V){if(this==null)throw new TypeError("The 'this' value for String.prototype.includes must not be null or undefined");if(W instanceof RegExp)throw new TypeError("First argument to String.prototype.includes must not be a regular expression");return this.indexOf(W,V||0)!==-1}}),I("Array.prototype.keys",function(p){return p||function(){return gt(this,function(W){return W})}});var jn=this||self;function Re(p,W){p=p.split(".");var V=jn;p[0]in V||typeof V.execScript>"u"||V.execScript("var "+p[0]);for(var k;p.length&&(k=p.shift());)p.length||W===void 0?V[k]&&V[k]!==Object.prototype[k]?V=V[k]:V=V[k]={}:V[k]=W}function Nt(p,W){return W=String.fromCharCode.apply(null,W),p==null?W:p+W}var Ye,on=typeof TextDecoder<"u",Xn,Fn=typeof TextEncoder<"u";function xn(p){if(Fn)p=(Xn||(Xn=new TextEncoder)).encode(p);else{var W=void 0;W=W===void 0?!1:W;for(var V=0,k=new Uint8Array(3*p.length),P=0;P<p.length;P++){var st=p.charCodeAt(P);if(128>st)k[V++]=st;else{if(2048>st)k[V++]=st>>6|192;else{if(55296<=st&&57343>=st){if(56319>=st&&P<p.length){var z=p.charCodeAt(++P);if(56320<=z&&57343>=z){st=1024*(st-55296)+z-56320+65536,k[V++]=st>>18|240,k[V++]=st>>12&63|128,k[V++]=st>>6&63|128,k[V++]=st&63|128;continue}else P--}if(W)throw Error("Found an unpaired surrogate");st=65533}k[V++]=st>>12|224,k[V++]=st>>6&63|128}k[V++]=st&63|128}}p=k.subarray(0,V)}return p}var Jn={},dn=null;function bn(p,W){W===void 0&&(W=0),Pe(),W=Jn[W];for(var V=Array(Math.floor(p.length/3)),k=W[64]||"",P=0,st=0;P<p.length-2;P+=3){var z=p[P],it=p[P+1],bt=p[P+2],xt=W[z>>2];z=W[(z&3)<<4|it>>4],it=W[(it&15)<<2|bt>>6],bt=W[bt&63],V[st++]=xt+z+it+bt}switch(xt=0,bt=k,p.length-P){case 2:xt=p[P+1],bt=W[(xt&15)<<2]||k;case 1:p=p[P],V[st]=W[p>>2]+W[(p&3)<<4|xt>>4]+bt+k}return V.join("")}function kn(p){var W=p.length,V=3*W/4;V%3?V=Math.floor(V):"=.".indexOf(p[W-1])!=-1&&(V="=.".indexOf(p[W-2])!=-1?V-2:V-1);var k=new Uint8Array(V),P=0;return Hn(p,function(st){k[P++]=st}),k.subarray(0,P)}function Hn(p,W){function V(bt){for(;k<p.length;){var xt=p.charAt(k++),Kt=dn[xt];if(Kt!=null)return Kt;if(!/^[\s\xa0]*$/.test(xt))throw Error("Unknown base64 encoding at char: "+xt)}return bt}Pe();for(var k=0;;){var P=V(-1),st=V(0),z=V(64),it=V(64);if(it===64&&P===-1)break;W(P<<2|st>>4),z!=64&&(W(st<<4&240|z>>2),it!=64&&W(z<<6&192|it))}}function Pe(){if(!dn){dn={};for(var p="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".split(""),W=["+/=","+/","-_=","-_.","-_"],V=0;5>V;V++){var k=p.concat(W[V].split(""));Jn[V]=k;for(var P=0;P<k.length;P++){var st=k[P];dn[st]===void 0&&(dn[st]=P)}}}}var Ae=typeof Uint8Array.prototype.slice=="function",In;function Wn(p,W,V){return W===V?In||(In=new Uint8Array(0)):Ae?p.slice(W,V):new Uint8Array(p.subarray(W,V))}var he=0,Le=0;function Oe(p,W){W=W===void 0?{}:W,W=W.v===void 0?!1:W.v,this.h=null,this.g=this.i=this.j=0,this.l=!1,this.v=W,p&&ne(this,p)}function ne(p,W){W=W.constructor===Uint8Array?W:W.constructor===ArrayBuffer?new Uint8Array(W):W.constructor===Array?new Uint8Array(W):W.constructor===String?kn(W):W instanceof Uint8Array?new Uint8Array(W.buffer,W.byteOffset,W.byteLength):new Uint8Array(0),p.h=W,p.j=0,p.i=p.h.length,p.g=p.j}Oe.prototype.reset=function(){this.g=this.j};function We(p){var W=p.h,V=W[p.g],k=V&127;return 128>V?(p.g+=1,k):(V=W[p.g+1],k|=(V&127)<<7,128>V?(p.g+=2,k):(V=W[p.g+2],k|=(V&127)<<14,128>V?(p.g+=3,k):(V=W[p.g+3],k|=(V&127)<<21,128>V?(p.g+=4,k):(V=W[p.g+4],k|=(V&15)<<28,128>V?(p.g+=5,k>>>0):(p.g+=5,128<=W[p.g++]&&128<=W[p.g++]&&128<=W[p.g++]&&128<=W[p.g++]&&p.g++,k)))))}function sn(p){var W=p.h[p.g],V=p.h[p.g+1],k=p.h[p.g+2],P=p.h[p.g+3];return p.g+=4,V=(W<<0|V<<8|k<<16|P<<24)>>>0,p=2*(V>>31)+1,W=V>>>23&255,V&=8388607,W==255?V?NaN:1/0*p:W==0?p*Math.pow(2,-149)*V:p*Math.pow(2,W-150)*(V+Math.pow(2,23))}var Me=[];function Qt(){this.g=new Uint8Array(64),this.h=0}Qt.prototype.push=function(p){if(!(this.h+1<this.g.length)){var W=this.g;this.g=new Uint8Array(Math.ceil(1+2*this.g.length)),this.g.set(W)}this.g[this.h++]=p},Qt.prototype.length=function(){return this.h},Qt.prototype.end=function(){var p=this.g,W=this.h;return this.h=0,Wn(p,0,W)};function Ze(p,W){for(;127<W;)p.push(W&127|128),W>>>=7;p.push(W)}function Ce(p){var W={},V=W.N===void 0?!1:W.N;this.o={v:W.v===void 0?!1:W.v},this.N=V,W=this.o,Me.length?(V=Me.pop(),W&&(V.v=W.v),p&&ne(V,p),p=V):p=new Oe(p,W),this.g=p,this.m=this.g.g,this.h=this.i=this.l=-1,this.j=!1}Ce.prototype.reset=function(){this.g.reset(),this.h=this.l=-1};function Bt(p){var W=p.g;if((W=W.g==W.i)||(W=p.j)||(W=p.g,W=W.l||0>W.g||W.g>W.i),W)return!1;p.m=p.g.g,W=We(p.g);var V=W&7;return V!=0&&V!=5&&V!=1&&V!=2&&V!=3&&V!=4?(p.j=!0,!1):(p.i=W,p.l=W>>>3,p.h=V,!0)}function Ie(p){switch(p.h){case 0:if(p.h!=0)Ie(p);else{for(p=p.g;p.h[p.g]&128;)p.g++;p.g++}break;case 1:p.h!=1?Ie(p):(p=p.g,p.g+=8);break;case 2:if(p.h!=2)Ie(p);else{var W=We(p.g);p=p.g,p.g+=W}break;case 5:p.h!=5?Ie(p):(p=p.g,p.g+=4);break;case 3:W=p.l;do{if(!Bt(p)){p.j=!0;break}if(p.h==4){p.l!=W&&(p.j=!0);break}Ie(p)}while(1);break;default:p.j=!0}}function zt(p,W,V){var k=p.g.i,P=We(p.g);return P=p.g.g+P,p.g.i=P,V(W,p),p.g.g=P,p.g.i=k,W}function ye(p){var W=We(p.g);p=p.g;var V=p.g;p.g+=W,p=p.h;var k;if(on)(k=Ye)||(k=Ye=new TextDecoder("utf-8",{fatal:!1})),k=k.decode(p.subarray(V,V+W));else{W=V+W;for(var P=[],st=null,z,it,bt;V<W;)z=p[V++],128>z?P.push(z):224>z?V>=W?P.push(65533):(it=p[V++],194>z||(it&192)!==128?(V--,P.push(65533)):P.push((z&31)<<6|it&63)):240>z?V>=W-1?P.push(65533):(it=p[V++],(it&192)!==128||z===224&&160>it||z===237&&160<=it||((k=p[V++])&192)!==128?(V--,P.push(65533)):P.push((z&15)<<12|(it&63)<<6|k&63)):244>=z?V>=W-2?P.push(65533):(it=p[V++],(it&192)!==128||(z<<28)+(it-144)>>30!==0||((k=p[V++])&192)!==128||((bt=p[V++])&192)!==128?(V--,P.push(65533)):(z=(z&7)<<18|(it&63)<<12|(k&63)<<6|bt&63,z-=65536,P.push((z>>10&1023)+55296,(z&1023)+56320))):P.push(65533),8192<=P.length&&(st=Nt(st,P),P.length=0);k=Nt(st,P)}return k}function Te(){this.h=[],this.i=0,this.g=new Qt}function $e(p,W){W.length!==0&&(p.h.push(W),p.i+=W.length)}function Xe(p){var W=p.i+p.g.length();if(W===0)return new Uint8Array(0);W=new Uint8Array(W);for(var V=p.h,k=V.length,P=0,st=0;st<k;st++){var z=V[st];z.length!==0&&(W.set(z,P),P+=z.length)}return V=p.g,k=V.h,k!==0&&(W.set(V.g.subarray(0,k),P),V.h=0),p.h=[W],W}function Pt(p,W,V){if(V!=null){Ze(p.g,8*W+5),p=p.g;var k=V;k=(V=0>k?1:0)?-k:k,k===0?0<1/k?he=Le=0:(Le=0,he=2147483648):isNaN(k)?(Le=0,he=2147483647):34028234663852886e22<k?(Le=0,he=(V<<31|2139095040)>>>0):11754943508222875e-54>k?(k=Math.round(k/Math.pow(2,-149)),Le=0,he=(V<<31|k)>>>0):(W=Math.floor(Math.log(k)/Math.LN2),k*=Math.pow(2,-W),k=Math.round(8388608*k)&8388607,Le=0,he=(V<<31|W+127<<23|k)>>>0),V=he,p.push(V>>>0&255),p.push(V>>>8&255),p.push(V>>>16&255),p.push(V>>>24&255)}}var je=typeof Uint8Array=="function";function _e(p,W,V){if(p!=null)return typeof p=="object"?je&&p instanceof Uint8Array?V(p):Se(p,W,V):W(p)}function Se(p,W,V){if(Array.isArray(p)){for(var k=Array(p.length),P=0;P<p.length;P++)k[P]=_e(p[P],W,V);return Array.isArray(p)&&p.W&&Qe(k),k}k={};for(P in p)k[P]=_e(p[P],W,V);return k}function Vn(p){return typeof p=="number"?isFinite(p)?p:String(p):p}var ln={W:{value:!0,configurable:!0}};function Qe(p){return Array.isArray(p)&&!Object.isFrozen(p)&&Object.defineProperties(p,ln),p}var un;function ve(p,W,V){var k=un;un=null,p||(p=k),k=this.constructor.ca,p||(p=k?[k]:[]),this.j=k?0:-1,this.i=null,this.g=p;t:{if(k=this.g.length,p=k-1,k&&(k=this.g[p],k!==null&&typeof k=="object"&&k.constructor===Object)){this.l=p-this.j,this.h=k;break t}W!==void 0&&-1<W?(this.l=Math.max(W,p+1-this.j),this.h=null):this.l=Number.MAX_VALUE}if(V)for(W=0;W<V.length;W++)p=V[W],p<this.l?(p+=this.j,(k=this.g[p])?Qe(k):this.g[p]=we):(Ge(this),(k=this.h[p])?Qe(k):this.h[p]=we)}var we=Object.freeze(Qe([]));function Ge(p){var W=p.l+p.j;p.g[W]||(p.h=p.g[W]={})}function re(p,W,V){return W===-1?null:(V===void 0?0:V)||W>=p.l?p.h?p.h[W]:void 0:p.g[W+p.j]}function De(p){var W=W===void 0?!1:W,V=re(p,1,W);return V==null&&(V=we),V===we&&(V=Qe([]),Ot(p,1,V,W)),V}function te(p,W,V){return p=re(p,W),p=p==null?p:+p,p==null?V===void 0?0:V:p}function Ot(p,W,V,k){(k===void 0?0:k)||W>=p.l?(Ge(p),p.h[W]=V):p.g[W+p.j]=V}function hn(p,W){p.i||(p.i={});var V=p.i[1];if(!V){var k=De(p);V=[];for(var P=0;P<k.length;P++)V[P]=new W(k[P]);p.i[1]=V}return V}function fe(p,W,V,k){var P=hn(p,V);W=W||new V,p=De(p),k!=null?(P.splice(k,0,W),p.splice(k,0,Jt(W))):(P.push(W),p.push(Jt(W)))}ve.prototype.toJSON=function(){var p=Jt(this);return Se(p,Vn,bn)};function Jt(p,W){if(p.i)for(var V in p.i){var k=p.i[V];if(Array.isArray(k))for(var P=0;P<k.length;P++)k[P]&&Jt(k[P]);else k&&Jt(k)}return p.g}ve.prototype.toString=function(){return Jt(this).toString()};function Vt(p,W){return p=re(p,W),p==null?0:p}function ie(p,W){return p=re(p,W),p==null?"":p}function Fe(p,W){if(p=p.m){$e(W,W.g.end());for(var V=0;V<p.length;V++)$e(W,p[V])}}function ee(p,W){if(W.h==4)return!1;var V=W.m;return Ie(W),W.N||(W=Wn(W.g.h,V,W.g.g),(V=p.m)?V.push(W):p.m=[W]),!0}function oe(p,W){var V=void 0;return new(V||(V=Promise))(function(k,P){function st(bt){try{it(W.next(bt))}catch(xt){P(xt)}}function z(bt){try{it(W.throw(bt))}catch(xt){P(xt)}}function it(bt){bt.done?k(bt.value):new V(function(xt){xt(bt.value)}).then(st,z)}it((W=W.apply(p,void 0)).next())})}function et(p){ve.call(this,p)}ht(et,ve);function ot(p,W){for(;Bt(W);)switch(W.i){case 8:var V=We(W.g);Ot(p,1,V);break;case 21:V=sn(W.g),Ot(p,2,V);break;case 26:V=ye(W),Ot(p,3,V);break;case 34:V=ye(W),Ot(p,4,V);break;default:if(!ee(p,W))return p}return p}function at(p){ve.call(this,p,-1,_t)}ht(at,ve),at.prototype.addClassification=function(p,W){fe(this,p,et,W)};var _t=[1];function ae(p){ve.call(this,p)}ht(ae,ve);function ue(p,W){for(;Bt(W);)switch(W.i){case 13:var V=sn(W.g);Ot(p,1,V);break;case 21:V=sn(W.g),Ot(p,2,V);break;case 29:V=sn(W.g),Ot(p,3,V);break;case 37:V=sn(W.g),Ot(p,4,V);break;case 45:V=sn(W.g),Ot(p,5,V);break;default:if(!ee(p,W))return p}return p}function Lt(p){ve.call(this,p,-1,me)}ht(Lt,ve);var me=[1];function Je(p){ve.call(this,p)}ht(Je,ve);function qe(p,W,V){if(V=p.createShader(V===0?p.VERTEX_SHADER:p.FRAGMENT_SHADER),p.shaderSource(V,W),p.compileShader(V),!p.getShaderParameter(V,p.COMPILE_STATUS))throw Error(`Could not compile WebGL shader.
4
4
 
5
5
  `+p.getShaderInfoLog(V));return V}function tn(p){return hn(p,et).map(function(W){return{index:Vt(W,1),Y:te(W,2),label:re(W,3)!=null?ie(W,3):void 0,displayName:re(W,4)!=null?ie(W,4):void 0}})}function fn(p){return{x:te(p,1),y:te(p,2),z:te(p,3),visibility:re(p,4)!=null?te(p,4):void 0}}function yn(p,W){this.h=p,this.g=W,this.l=0}function He(p,W,V){return en(p,W),typeof p.g.canvas.transferToImageBitmap=="function"?Promise.resolve(p.g.canvas.transferToImageBitmap()):V?Promise.resolve(p.g.canvas):typeof createImageBitmap=="function"?createImageBitmap(p.g.canvas):(p.i===void 0&&(p.i=document.createElement("canvas")),new Promise(function(k){p.i.height=p.g.canvas.height,p.i.width=p.g.canvas.width,p.i.getContext("2d",{}).drawImage(p.g.canvas,0,0,p.g.canvas.width,p.g.canvas.height),k(p.i)}))}function en(p,W){var V=p.g;if(p.m===void 0){var k=qe(V,`
6
6
  attribute vec2 aVertex;
@@ -119,20 +119,20 @@
119
119
  gl_FragColor = texture2D(sampler0, vTex);
120
120
  }`,1),A=R.createProgram();if(R.attachShader(A,T),R.attachShader(A,J),R.linkProgram(A),!R.getProgramParameter(A,R.LINK_STATUS))throw Error(`Could not compile WebGL program.
121
121
 
122
- `+R.getProgramInfoLog(A));T=s.m=A,R.useProgram(T),J=R.getUniformLocation(T,"sampler0"),s.j={I:R.getAttribLocation(T,"aVertex"),H:R.getAttribLocation(T,"aTex"),da:J},s.s=R.createBuffer(),R.bindBuffer(R.ARRAY_BUFFER,s.s),R.enableVertexAttribArray(s.j.I),R.vertexAttribPointer(s.j.I,2,R.FLOAT,!1,0,0),R.bufferData(R.ARRAY_BUFFER,new Float32Array([-1,-1,-1,1,1,1,1,-1]),R.STATIC_DRAW),R.bindBuffer(R.ARRAY_BUFFER,null),s.o=R.createBuffer(),R.bindBuffer(R.ARRAY_BUFFER,s.o),R.enableVertexAttribArray(s.j.H),R.vertexAttribPointer(s.j.H,2,R.FLOAT,!1,0,0),R.bufferData(R.ARRAY_BUFFER,new Float32Array([0,1,0,0,1,0,1,1]),R.STATIC_DRAW),R.bindBuffer(R.ARRAY_BUFFER,null),R.uniform1i(J,0)}T=s.j,R.useProgram(s.m),R.canvas.width=X.width,R.canvas.height=X.height,R.viewport(0,0,X.width,X.height),R.activeTexture(R.TEXTURE0),s.h.bindTexture2d(X.glName),R.enableVertexAttribArray(T.I),R.bindBuffer(R.ARRAY_BUFFER,s.s),R.vertexAttribPointer(T.I,2,R.FLOAT,!1,0,0),R.enableVertexAttribArray(T.H),R.bindBuffer(R.ARRAY_BUFFER,s.o),R.vertexAttribPointer(T.H,2,R.FLOAT,!1,0,0),R.bindFramebuffer(R.DRAW_FRAMEBUFFER?R.DRAW_FRAMEBUFFER:R.FRAMEBUFFER,null),R.clearColor(0,0,0,0),R.clear(R.COLOR_BUFFER_BIT),R.colorMask(!0,!0,!0,!0),R.drawArrays(R.TRIANGLE_FAN,0,4),R.disableVertexAttribArray(T.I),R.disableVertexAttribArray(T.H),R.bindBuffer(R.ARRAY_BUFFER,null),s.h.bindTexture2d(0)}function Yt(s){this.g=s}var Ut=new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,9,1,7,0,65,0,253,15,26,11]);function Dt(s,X){return X+s}function ce(s,X){window[s]=X}function pe(s){var X=document.createElement("script");return X.setAttribute("src",s),X.setAttribute("crossorigin","anonymous"),new Promise(function(R){X.addEventListener("load",function(){R()},!1),X.addEventListener("error",function(){R()},!1),document.body.appendChild(X)})}function ge(){return gt(function(s){switch(s.g){case 1:return s.m=2,_(s,WebAssembly.instantiate(Ut),4);case 4:s.g=3,s.m=0;break;case 2:return s.m=0,s.j=null,s.return(!1);case 3:return s.return(!0)}})}function ke(s){if(this.g=s,this.listeners={},this.j={},this.F={},this.m={},this.s={},this.G=this.o=this.R=!0,this.C=Promise.resolve(),this.P="",this.B={},this.locateFile=s&&s.locateFile||Dt,typeof window=="object")var X=window.location.pathname.toString().substring(0,window.location.pathname.toString().lastIndexOf("/"))+"/";else if(typeof location<"u")X=location.pathname.toString().substring(0,location.pathname.toString().lastIndexOf("/"))+"/";else throw Error("solutions can only be loaded on a web page or in a web worker");if(this.S=X,s.options){X=L(Object.keys(s.options));for(var R=X.next();!R.done;R=X.next()){R=R.value;var T=s.options[R].default;T!==void 0&&(this.j[R]=typeof T=="function"?T():T)}}}o=ke.prototype,o.close=function(){return this.i&&this.i.delete(),Promise.resolve()};function h(s){var X,R,T,J,A,K,nt,q,yt,Gt,Mt;return gt(function(It){switch(It.g){case 1:return s.R?(X=s.g.files===void 0?[]:typeof s.g.files=="function"?s.g.files(s.j):s.g.files,_(It,ge(),2)):It.return();case 2:if(R=It.h,typeof window=="object")return ce("createMediapipeSolutionsWasm",{locateFile:s.locateFile}),ce("createMediapipeSolutionsPackedAssets",{locateFile:s.locateFile}),K=X.filter(function(ft){return ft.data!==void 0}),nt=X.filter(function(ft){return ft.data===void 0}),q=Promise.all(K.map(function(ft){var Xt=C(s,ft.url);if(ft.path!==void 0){var St=ft.path;Xt=Xt.then(function(wt){return s.overrideFile(St,wt),Promise.resolve(wt)})}return Xt})),yt=Promise.all(nt.map(function(ft){return ft.simd===void 0||ft.simd&&R||!ft.simd&&!R?pe(s.locateFile(ft.url,s.S)):Promise.resolve()})).then(function(){var ft,Xt,St;return gt(function(wt){if(wt.g==1)return ft=window.createMediapipeSolutionsWasm,Xt=window.createMediapipeSolutionsPackedAssets,St=s,_(wt,ft(Xt),2);St.h=wt.h,wt.g=0})}),Gt=function(){return gt(function(ft){return s.g.graph&&s.g.graph.url?ft=_(ft,C(s,s.g.graph.url),0):(ft.g=0,ft=void 0),ft})}(),_(It,Promise.all([yt,q,Gt]),7);if(typeof importScripts!="function")throw Error("solutions can only be loaded on a web page or in a web worker");return T=X.filter(function(ft){return ft.simd===void 0||ft.simd&&R||!ft.simd&&!R}).map(function(ft){return s.locateFile(ft.url,s.S)}),importScripts.apply(null,E(T)),J=s,_(It,createMediapipeSolutionsWasm(Module),6);case 6:J.h=It.h,s.l=new OffscreenCanvas(1,1),s.h.canvas=s.l,A=s.h.GL.createContext(s.l,{antialias:!1,alpha:!1,ba:typeof WebGL2RenderingContext<"u"?2:1}),s.h.GL.makeContextCurrent(A),It.g=4;break;case 7:if(s.l=document.createElement("canvas"),Mt=s.l.getContext("webgl2",{}),!Mt&&(Mt=s.l.getContext("webgl",{}),!Mt))return alert("Failed to create WebGL canvas context when passing video frame."),It.return();s.D=Mt,s.h.canvas=s.l,s.h.createContext(s.l,!0,!0,{});case 4:s.i=new s.h.SolutionWasm,s.R=!1,It.g=0}})}function y(s){var X,R,T,J,A,K,nt,q;return gt(function(yt){if(yt.g==1){if(s.g.graph&&s.g.graph.url&&s.P===s.g.graph.url)return yt.return();if(s.o=!0,!s.g.graph||!s.g.graph.url){yt.g=2;return}return s.P=s.g.graph.url,_(yt,C(s,s.g.graph.url),3)}for(yt.g!=2&&(X=yt.h,s.i.loadGraph(X)),R=L(Object.keys(s.B)),T=R.next();!T.done;T=R.next())J=T.value,s.i.overrideFile(J,s.B[J]);if(s.B={},s.g.listeners)for(A=L(s.g.listeners),K=A.next();!K.done;K=A.next())nt=K.value,B(s,nt);q=s.j,s.j={},s.setOptions(q),yt.g=0})}o.reset=function(){var s=this;return gt(function(X){s.i&&(s.i.reset(),s.m={},s.s={}),X.g=0})},o.setOptions=function(s,X){var R=this;if(X=X||this.g.options){for(var T=[],J=[],A={},K=L(Object.keys(s)),nt=K.next();!nt.done;A={K:A.K,L:A.L},nt=K.next()){var q=nt.value;q in this.j&&this.j[q]===s[q]||(this.j[q]=s[q],nt=X[q],nt!==void 0&&(nt.onChange&&(A.K=nt.onChange,A.L=s[q],T.push(function(yt){return function(){var Gt;return gt(function(Mt){if(Mt.g==1)return _(Mt,yt.K(yt.L),2);Gt=Mt.h,Gt===!0&&(R.o=!0),Mt.g=0})}}(A))),nt.graphOptionXref&&(q={valueNumber:nt.type===1?s[q]:0,valueBoolean:nt.type===0?s[q]:!1,valueString:nt.type===2?s[q]:""},nt=Object.assign(Object.assign(Object.assign({},{calculatorName:"",calculatorIndex:0}),nt.graphOptionXref),q),J.push(nt))))}(T.length!==0||J.length!==0)&&(this.o=!0,this.A=(this.A===void 0?[]:this.A).concat(J),this.v=(this.v===void 0?[]:this.v).concat(T))}};function G(s){var X,R,T,J,A,K,nt;return gt(function(q){switch(q.g){case 1:if(!s.o)return q.return();if(!s.v){q.g=2;break}X=L(s.v),R=X.next();case 3:if(R.done){q.g=5;break}return T=R.value,_(q,T(),4);case 4:R=X.next(),q.g=3;break;case 5:s.v=void 0;case 2:if(s.A){for(J=new s.h.GraphOptionChangeRequestList,A=L(s.A),K=A.next();!K.done;K=A.next())nt=K.value,J.push_back(nt);s.i.changeOptions(J),J.delete(),s.A=void 0}s.o=!1,q.g=0}})}o.initialize=function(){var s=this;return gt(function(X){return X.g==1?_(X,h(s),2):X.g!=3?_(X,y(s),3):_(X,G(s),0)})};function C(s,X){var R,T;return gt(function(J){return X in s.F?J.return(s.F[X]):(R=s.locateFile(X,""),T=fetch(R).then(function(A){return A.arrayBuffer()}),s.F[X]=T,J.return(T))})}o.overrideFile=function(s,X){this.i?this.i.overrideFile(s,X):this.B[s]=X},o.clearOverriddenFiles=function(){this.B={},this.i&&this.i.clearOverriddenFiles()},o.send=function(s,X){var R=this,T,J,A,K,nt,q,yt,Gt,Mt;return gt(function(It){switch(It.g){case 1:return R.g.inputs?(T=1e3*(X==null?performance.now():X),_(It,R.C,2)):It.return();case 2:return _(It,R.initialize(),3);case 3:for(J=new R.h.PacketDataList,A=L(Object.keys(s)),K=A.next();!K.done;K=A.next())if(nt=K.value,q=R.g.inputs[nt]){t:{var ft=s[nt];switch(q.type){case"video":var Xt=R.m[q.stream];if(Xt||(Xt=new kt(R.h,R.D),R.m[q.stream]=Xt),Xt.l===0&&(Xt.l=Xt.h.createTexture()),typeof HTMLVideoElement<"u"&&ft instanceof HTMLVideoElement)var St=ft.videoWidth,wt=ft.videoHeight;else typeof HTMLImageElement<"u"&&ft instanceof HTMLImageElement?(St=ft.naturalWidth,wt=ft.naturalHeight):(St=ft.width,wt=ft.height);wt={glName:Xt.l,width:St,height:wt},St=Xt.g,St.canvas.width=wt.width,St.canvas.height=wt.height,St.activeTexture(St.TEXTURE0),Xt.h.bindTexture2d(Xt.l),St.texImage2D(St.TEXTURE_2D,0,St.RGBA,St.RGBA,St.UNSIGNED_BYTE,ft),Xt.h.bindTexture2d(0),Xt=wt;break t;case"detections":for(Xt=R.m[q.stream],Xt||(Xt=new Yt(R.h),R.m[q.stream]=Xt),Xt.data||(Xt.data=new Xt.g.DetectionListData),Xt.data.reset(ft.length),wt=0;wt<ft.length;++wt){St=ft[wt];var Ct=Xt.data,l=Ct.setBoundingBox,v=wt,x=St.T,Y=new k;if(at(Y,1,x.Y),at(Y,2,x.Z),at(Y,3,x.height),at(Y,4,x.width),at(Y,5,x.rotation),at(Y,6,x.W),x=fn(Y,st),l.call(Ct,v,x),St.O)for(Ct=0;Ct<St.O.length;++Ct){Y=St.O[Ct];var N=!!Y.visibility;l=Xt.data,v=l.addNormalizedLandmark,x=wt,Y=Object.assign(Object.assign({},Y),{visibility:N?Y.visibility:0}),N=new Yn,at(N,1,Y.x),at(N,2,Y.y),at(N,3,Y.z),Y.visibility&&at(N,4,Y.visibility),Y=fn(N,$n),v.call(l,x,Y)}if(St.M)for(Ct=0;Ct<St.M.length;++Ct)l=Xt.data,v=l.addClassification,x=wt,Y=St.M[Ct],N=new Sn,at(N,2,Y.X),Y.index&&at(N,1,Y.index),Y.label&&at(N,3,Y.label),Y.displayName&&at(N,4,Y.displayName),Y=fn(N,En),v.call(l,x,Y)}Xt=Xt.data;break t;default:Xt={}}}switch(yt=Xt,Gt=q.stream,q.type){case"video":J.pushTexture2d(Object.assign(Object.assign({},yt),{stream:Gt,timestamp:T}));break;case"detections":Mt=yt,Mt.stream=Gt,Mt.timestamp=T,J.pushDetectionList(Mt);break;default:throw Error("Unknown input config type: '"+q.type+"'")}}return R.i.send(J),_(It,R.C,4);case 4:J.delete(),It.g=0}})};function M(s,X,R){var T,J,A,K,nt,q,yt,Gt,Mt,It,ft,Xt,St,wt;return gt(function(Ct){switch(Ct.g){case 1:if(!R)return Ct.return(X);for(T={},J=0,A=L(Object.keys(R)),K=A.next();!K.done;K=A.next())nt=K.value,q=R[nt],typeof q!="string"&&q.type==="texture"&&X[q.stream]!==void 0&&++J;1<J&&(s.G=!1),yt=L(Object.keys(R)),K=yt.next();case 2:if(K.done){Ct.g=4;break}if(Gt=K.value,Mt=R[Gt],typeof Mt=="string")return St=T,wt=Gt,_(Ct,Q(s,Gt,X[Mt]),14);if(It=X[Mt.stream],Mt.type==="detection_list"){if(It){for(var l=It.getRectList(),v=It.getLandmarksList(),x=It.getClassificationsList(),Y=[],N=0;N<l.size();++N){var i=yn(l.get(N),k,z);i={T:{Y:ot(i,1),Z:ot(i,2),height:ot(i,3),width:ot(i,4),rotation:ot(i,5,0),W:Lt(i,6)},O:Kt(v.get(N)),M:bt(yn(x.get(N),vn,Mn))},Y.push(i)}l=Y}else l=[];T[Gt]=l,Ct.g=7;break}if(Mt.type==="proto_list"){if(It){for(l=Array(It.size()),v=0;v<It.size();v++)l[v]=It.get(v);It.delete()}else l=[];T[Gt]=l,Ct.g=7;break}if(It===void 0){Ct.g=3;break}if(Mt.type==="float_list"){T[Gt]=It,Ct.g=7;break}if(Mt.type==="proto"){T[Gt]=It,Ct.g=7;break}if(Mt.type!=="texture")throw Error("Unknown output config type: '"+Mt.type+"'");return ft=s.s[Gt],ft||(ft=new kt(s.h,s.D),s.s[Gt]=ft),_(Ct,qt(ft,It,s.G),13);case 13:Xt=Ct.h,T[Gt]=Xt;case 7:Mt.transform&&T[Gt]&&(T[Gt]=Mt.transform(T[Gt])),Ct.g=3;break;case 14:St[wt]=Ct.h;case 3:K=yt.next(),Ct.g=2;break;case 4:return Ct.return(T)}})}function Q(s,X,R){var T;return gt(function(J){return typeof R=="number"||R instanceof Uint8Array||R instanceof s.h.Uint8BlobList?J.return(R):R instanceof s.h.Texture2dDataOut?(T=s.s[X],T||(T=new kt(s.h,s.D),s.s[X]=T),J.return(qt(T,R,s.G))):J.return(void 0)})}function B(s,X){for(var R=X.name||"$",T=[].concat(E(X.wants)),J=new s.h.StringList,A=L(X.wants),K=A.next();!K.done;K=A.next())J.push_back(K.value);A=s.h.PacketListener.implement({onResults:function(nt){for(var q={},yt=0;yt<X.wants.length;++yt)q[T[yt]]=nt.get(yt);var Gt=s.listeners[R];Gt&&(s.C=M(s,q,X.outs).then(function(Mt){Mt=Gt(Mt);for(var It=0;It<X.wants.length;++It){var ft=q[T[It]];typeof ft=="object"&&ft.hasOwnProperty&&ft.hasOwnProperty("delete")&&ft.delete()}Mt&&(s.C=Mt)}))}}),s.i.attachMultiListener(J,A),J.delete()}o.onResults=function(s,X){this.listeners[X||"$"]=s},Nt("Solution",ke),Nt("OptionType",{BOOL:0,NUMBER:1,$:2,0:"BOOL",1:"NUMBER",2:"STRING"});function tt(s){switch(s===void 0&&(s=0),s){case 1:return"pose_landmark_full.tflite";case 2:return"pose_landmark_heavy.tflite";default:return"pose_landmark_lite.tflite"}}function ct(s){var X=this;s=s||{},this.g=new ke({locateFile:s.locateFile,files:function(R){return[{url:"pose_solution_packed_assets_loader.js"},{simd:!1,url:"pose_solution_wasm_bin.js"},{simd:!0,url:"pose_solution_simd_wasm_bin.js"},{data:!0,url:tt(R.modelComplexity)}]},graph:{url:"pose_web.binarypb"},listeners:[{wants:["pose_landmarks","world_landmarks","segmentation_mask","image_transformed"],outs:{image:{type:"texture",stream:"image_transformed"},poseLandmarks:{type:"proto",stream:"pose_landmarks",transform:Kt},poseWorldLandmarks:{type:"proto",stream:"world_landmarks",transform:Kt},segmentationMask:{type:"texture",stream:"segmentation_mask"}}}],inputs:{image:{type:"video",stream:"input_frames_gpu"}},options:{useCpuInference:{type:0,graphOptionXref:{calculatorType:"InferenceCalculator",fieldName:"use_cpu_inference"},default:"iPad Simulator;iPhone Simulator;iPod Simulator;iPad;iPhone;iPod".split(";").includes(navigator.platform)||navigator.userAgent.includes("Mac")&&"ontouchend"in document},selfieMode:{type:0,graphOptionXref:{calculatorType:"GlScalerCalculator",calculatorIndex:1,fieldName:"flip_horizontal"}},modelComplexity:{type:1,graphOptionXref:{calculatorType:"ConstantSidePacketCalculator",calculatorName:"ConstantSidePacketCalculatorModelComplexity",fieldName:"int_value"},onChange:function(R){var T,J,A;return gt(function(K){return K.g==1?(T=tt(R),J="third_party/mediapipe/modules/pose_landmark/"+T,_(K,C(X.g,T),2)):(A=K.h,X.g.overrideFile(J,A),K.return(!0))})}},smoothLandmarks:{type:0,graphOptionXref:{calculatorType:"ConstantSidePacketCalculator",calculatorName:"ConstantSidePacketCalculatorSmoothLandmarks",fieldName:"bool_value"}},enableSegmentation:{type:0,graphOptionXref:{calculatorType:"ConstantSidePacketCalculator",calculatorName:"ConstantSidePacketCalculatorEnableSegmentation",fieldName:"bool_value"}},smoothSegmentation:{type:0,graphOptionXref:{calculatorType:"ConstantSidePacketCalculator",calculatorName:"ConstantSidePacketCalculatorSmoothSegmentation",fieldName:"bool_value"}},minDetectionConfidence:{type:1,graphOptionXref:{calculatorType:"TensorsToDetectionsCalculator",calculatorName:"poselandmarkgpu__posedetectiongpu__TensorsToDetectionsCalculator",fieldName:"min_score_thresh"}},minTrackingConfidence:{type:1,graphOptionXref:{calculatorType:"ThresholdingCalculator",calculatorName:"poselandmarkgpu__poselandmarkbyroigpu__tensorstoposelandmarksandsegmentation__ThresholdingCalculator",fieldName:"threshold"}}}})}o=ct.prototype,o.reset=function(){this.g.reset()},o.close=function(){return this.g.close(),Promise.resolve()},o.onResults=function(s){this.g.onResults(s)},o.initialize=function(){var s=this;return gt(function(X){return _(X,s.g.initialize(),0)})},o.send=function(s,X){var R=this;return gt(function(T){return _(T,R.g.send(s,X),0)})},o.setOptions=function(s){this.g.setOptions(s)},Nt("Pose",ct),Nt("POSE_CONNECTIONS",[[0,1],[1,2],[2,3],[3,7],[0,4],[4,5],[5,6],[6,8],[9,10],[11,12],[11,13],[13,15],[15,17],[15,19],[15,21],[17,19],[12,14],[14,16],[16,18],[16,20],[16,22],[18,20],[11,23],[12,24],[23,24],[23,25],[24,26],[25,27],[26,28],[27,29],[28,30],[29,31],[30,32],[27,31],[28,32]]),Nt("POSE_LANDMARKS",{NOSE:0,LEFT_EYE_INNER:1,LEFT_EYE:2,LEFT_EYE_OUTER:3,RIGHT_EYE_INNER:4,RIGHT_EYE:5,RIGHT_EYE_OUTER:6,LEFT_EAR:7,RIGHT_EAR:8,LEFT_RIGHT:9,RIGHT_LEFT:10,LEFT_SHOULDER:11,RIGHT_SHOULDER:12,LEFT_ELBOW:13,RIGHT_ELBOW:14,LEFT_WRIST:15,RIGHT_WRIST:16,LEFT_PINKY:17,RIGHT_PINKY:18,LEFT_INDEX:19,RIGHT_INDEX:20,LEFT_THUMB:21,RIGHT_THUMB:22,LEFT_HIP:23,RIGHT_HIP:24,LEFT_KNEE:25,RIGHT_KNEE:26,LEFT_ANKLE:27,RIGHT_ANKLE:28,LEFT_HEEL:29,RIGHT_HEEL:30,LEFT_FOOT_INDEX:31,RIGHT_FOOT_INDEX:32}),Nt("POSE_LANDMARKS_LEFT",{LEFT_EYE_INNER:1,LEFT_EYE:2,LEFT_EYE_OUTER:3,LEFT_EAR:7,LEFT_RIGHT:9,LEFT_SHOULDER:11,LEFT_ELBOW:13,LEFT_WRIST:15,LEFT_PINKY:17,LEFT_INDEX:19,LEFT_THUMB:21,LEFT_HIP:23,LEFT_KNEE:25,LEFT_ANKLE:27,LEFT_HEEL:29,LEFT_FOOT_INDEX:31}),Nt("POSE_LANDMARKS_RIGHT",{RIGHT_EYE_INNER:4,RIGHT_EYE:5,RIGHT_EYE_OUTER:6,RIGHT_EAR:8,RIGHT_LEFT:10,RIGHT_SHOULDER:12,RIGHT_ELBOW:14,RIGHT_WRIST:16,RIGHT_PINKY:18,RIGHT_INDEX:20,RIGHT_THUMB:22,RIGHT_HIP:24,RIGHT_KNEE:26,RIGHT_ANKLE:28,RIGHT_HEEL:30,RIGHT_FOOT_INDEX:32}),Nt("POSE_LANDMARKS_NEUTRAL",{NOSE:0}),Nt("VERSION","0.5.1635988162")}).call(vi);const lr=class{constructor(){Ht(this,"mediapipeMap_",new Map)}getVersion(n){switch(n){case"face_detection":return yi.VERSION;case"face_mesh":return gi.VERSION;case"hands":return pi.VERSION;case"holistic":return bi.VERSION;case"objectron":return Zi.VERSION;case"selfie_segmentation":return mi.VERSION;case"pose":return vi.VERSION;default:return""}}initialize(n){return new Promise(async(r,m)=>{if(n.mediaPipeModelConfigArray.length==0){m("no model was selected");return}for(let Z=0;Z<n.mediaPipeModelConfigArray.length;Z++){const I=n.mediaPipeModelConfigArray[Z];if(this.mediapipeMap_.has(I.modelType)){m("setting same type is not supported");return}if(typeof I.listener!="function"){m(`[${I.modelType}] ResultsListener must be provided`);return}let F;switch(I.modelType){case"face_mesh":F=new gi.FaceMesh({locateFile:(L,E)=>(I.assetsUri||lr.defaultAssetsBaseUrl+"face_mesh/"+this.getVersion("face_mesh"))+"/"+L});break;case"face_detection":F=new yi.FaceDetection({locateFile:(L,E)=>(I.assetsUri||lr.defaultAssetsBaseUrl+"face_detection/"+this.getVersion("face_detection"))+"/"+L});break;case"hands":F=new pi.Hands({locateFile:(L,E)=>(I.assetsUri||lr.defaultAssetsBaseUrl+"hands/"+this.getVersion("hands"))+"/"+L});break;case"holistic":F=new bi.Holistic({locateFile:(L,E)=>(I.assetsUri||lr.defaultAssetsBaseUrl+"holistic/"+this.getVersion("holistic"))+"/"+L});break;case"objectron":F=new Zi.Objectron({locateFile:(L,E)=>(I.assetsUri||lr.defaultAssetsBaseUrl+"objectron/"+this.getVersion("objectron"))+"/"+L});break;case"selfie_segmentation":F=new mi.SelfieSegmentation({locateFile:(L,E)=>(I.assetsUri||lr.defaultAssetsBaseUrl+"selfie_segmentation/"+this.getVersion("selfie_segmentation"))+"/"+L});break;case"pose":F=new vi.Pose({locateFile:(L,E)=>(I.assetsUri||lr.defaultAssetsBaseUrl+"pose/"+this.getVersion("pose"))+"/"+L});break;default:m("unknown model type");return}F.onResults(I.listener),I.options&&F.setOptions(I.options);try{await F.initialize(),this.mediapipeMap_.set(I.modelType,F)}catch(L){m(L);return}}r()})}close(n){return new Promise((r,m)=>{let Z=[];if(n){let I=this.mediapipeMap_.get(n);if(I)this.mediapipeMap_.delete(n),Z.push(I.close());else{m("model not exit");return}}else{for(const[I,F]of this.mediapipeMap_.entries())Z.push(F.close());this.mediapipeMap_.clear()}Promise.all(Z).then(()=>{r()}).catch(I=>{m(I)})})}send(n,r){return new Promise((m,Z)=>{let I=[];if(r){let F=this.mediapipeMap_.get(r);if(F)I.push(F.send({image:n}));else{Z("model not exit");return}}else for(const[F,L]of this.mediapipeMap_.entries())I.push(L.send({image:n}));Promise.all(I).then(()=>{m()}).catch(F=>{Z(F)})})}reset(n){if(n){let r=this.mediapipeMap_.get(n);r&&typeof r.reset=="function"&&r.reset()}else for(const[r,m]of this.mediapipeMap_.entries())m&&typeof m.reset=="function"&&m.reset()}};let Gi=lr;Ht(Gi,"defaultAssetsBaseUrl","https://d3opqjmqzxf057.cloudfront.net/ml/mediapipe/");const ar=new WeakMap,Xi=new WeakMap,Br=new WeakMap,ho=Symbol("anyProducer"),Ns=Promise.resolve(),Wi=Symbol("listenerAdded"),Vi=Symbol("listenerRemoved");let fo=!1;function wr(o){if(typeof o!="string"&&typeof o!="symbol")throw new TypeError("eventName must be a string or a symbol")}function Ri(o){if(typeof o!="function")throw new TypeError("listener must be a function")}function Fr(o,n){const r=Xi.get(o);return r.has(n)||r.set(n,new Set),r.get(n)}function Ar(o,n){const r=typeof n=="string"||typeof n=="symbol"?n:ho,m=Br.get(o);return m.has(r)||m.set(r,new Set),m.get(r)}function O2(o,n,r){const m=Br.get(o);if(m.has(n))for(const Z of m.get(n))Z.enqueue(r);if(m.has(ho)){const Z=Promise.all([n,r]);for(const I of m.get(ho))I.enqueue(Z)}}function ks(o,n){n=Array.isArray(n)?n:[n];let r=!1,m=()=>{},Z=[];const I={enqueue(F){Z.push(F),m()},finish(){r=!0,m()}};for(const F of n)Ar(o,F).add(I);return{async next(){return Z?Z.length===0?r?(Z=void 0,this.next()):(await new Promise(F=>{m=F}),this.next()):{done:!1,value:await Z.shift()}:{done:!0}},async return(F){Z=void 0;for(const L of n)Ar(o,L).delete(I);return m(),arguments.length>0?{done:!0,value:await F}:{done:!0}},[Symbol.asyncIterator](){return this}}}function Es(o){if(o===void 0)return Us;if(!Array.isArray(o))throw new TypeError("`methodNames` must be an array of strings");for(const n of o)if(!Us.includes(n))throw typeof n!="string"?new TypeError("`methodNames` element must be a string"):new Error(`${n} is not Emittery method`);return o}const mo=o=>o===Wi||o===Vi;class Zr{static mixin(n,r){return r=Es(r),m=>{if(typeof m!="function")throw new TypeError("`target` must be function");for(const F of r)if(m.prototype[F]!==void 0)throw new Error(`The property \`${F}\` already exists on \`target\``);function Z(){return Object.defineProperty(this,n,{enumerable:!1,value:new Zr}),this[n]}Object.defineProperty(m.prototype,n,{enumerable:!1,get:Z});const I=F=>function(...L){return this[n][F](...L)};for(const F of r)Object.defineProperty(m.prototype,F,{enumerable:!1,value:I(F)});return m}}static get isDebugEnabled(){if(typeof process!="object")return fo;const{env:n}=process||{env:{}};return n.DEBUG==="emittery"||n.DEBUG==="*"||fo}static set isDebugEnabled(n){fo=n}constructor(n={}){ar.set(this,new Set),Xi.set(this,new Map),Br.set(this,new Map),this.debug=n.debug||{},this.debug.enabled===void 0&&(this.debug.enabled=!1),this.debug.logger||(this.debug.logger=(r,m,Z,I)=>{try{I=JSON.stringify(I)}catch{I=`Object with the following keys failed to stringify: ${Object.keys(I).join(",")}`}typeof Z=="symbol"&&(Z=Z.toString());const F=new Date,L=`${F.getHours()}:${F.getMinutes()}:${F.getSeconds()}.${F.getMilliseconds()}`;console.log(`[${L}][emittery:${r}][${m}] Event Name: ${Z}
123
- data: ${I}`)})}logIfDebugEnabled(n,r,m){(Zr.isDebugEnabled||this.debug.enabled)&&this.debug.logger(n,this.debug.name,r,m)}on(n,r){Ri(r),n=Array.isArray(n)?n:[n];for(const m of n)wr(m),Fr(this,m).add(r),this.logIfDebugEnabled("subscribe",m,void 0),mo(m)||this.emit(Wi,{eventName:m,listener:r});return this.off.bind(this,n,r)}off(n,r){Ri(r),n=Array.isArray(n)?n:[n];for(const m of n)wr(m),Fr(this,m).delete(r),this.logIfDebugEnabled("unsubscribe",m,void 0),mo(m)||this.emit(Vi,{eventName:m,listener:r})}once(n){return new Promise(r=>{const m=this.on(n,Z=>{m(),r(Z)})})}events(n){n=Array.isArray(n)?n:[n];for(const r of n)wr(r);return ks(this,n)}async emit(n,r){wr(n),this.logIfDebugEnabled("emit",n,r),O2(this,n,r);const m=Fr(this,n),Z=ar.get(this),I=[...m],F=mo(n)?[]:[...Z];await Ns,await Promise.all([...I.map(async L=>{if(m.has(L))return L(r)}),...F.map(async L=>{if(Z.has(L))return L(n,r)})])}async emitSerial(n,r){wr(n),this.logIfDebugEnabled("emitSerial",n,r);const m=Fr(this,n),Z=ar.get(this),I=[...m],F=[...Z];await Ns;for(const L of I)m.has(L)&&await L(r);for(const L of F)Z.has(L)&&await L(n,r)}onAny(n){return Ri(n),this.logIfDebugEnabled("subscribeAny",void 0,void 0),ar.get(this).add(n),this.emit(Wi,{listener:n}),this.offAny.bind(this,n)}anyEvent(){return ks(this)}offAny(n){Ri(n),this.logIfDebugEnabled("unsubscribeAny",void 0,void 0),this.emit(Vi,{listener:n}),ar.get(this).delete(n)}clearListeners(n){n=Array.isArray(n)?n:[n];for(const r of n)if(this.logIfDebugEnabled("clear",r,void 0),typeof r=="string"||typeof r=="symbol"){Fr(this,r).clear();const m=Ar(this,r);for(const Z of m)Z.finish();m.clear()}else{ar.get(this).clear();for(const m of Xi.get(this).values())m.clear();for(const m of Br.get(this).values()){for(const Z of m)Z.finish();m.clear()}}}listenerCount(n){n=Array.isArray(n)?n:[n];let r=0;for(const m of n){if(typeof m=="string"){r+=ar.get(this).size+Fr(this,m).size+Ar(this,m).size+Ar(this).size;continue}typeof m<"u"&&wr(m),r+=ar.get(this).size;for(const Z of Xi.get(this).values())r+=Z.size;for(const Z of Br.get(this).values())r+=Z.size}return r}bindMethods(n,r){if(typeof n!="object"||n===null)throw new TypeError("`target` must be an object");r=Es(r);for(const m of r){if(n[m]!==void 0)throw new Error(`The property \`${m}\` already exists on \`target\``);Object.defineProperty(n,m,{enumerable:!1,value:this[m].bind(this)})}}}const Us=Object.getOwnPropertyNames(Zr.prototype).filter(o=>o!=="constructor");Object.defineProperty(Zr,"listenerAdded",{value:Wi,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(Zr,"listenerRemoved",{value:Vi,writable:!1,enumerable:!0,configurable:!1});var Ks=Zr,vr=(o=>(o[o.INIT=0]="INIT",o[o.FORWARD=1]="FORWARD",o[o.TERMINATE=2]="TERMINATE",o))(vr||{});function Ms(o){return[ImageBitmap,ReadableStream,WritableStream].some(n=>o instanceof n)}let _2=0;function po(o,n,r,m,Z){const I=_2++;return o.postMessage({id:I,type:n,functionName:r,args:m},m.filter(F=>Ms(F))),new Promise(F=>{Z.set(I,F)})}async function Q2(o,n,r){const m=new n;if(m.addEventListener("message",({data:Z})=>{var I;(I=r.get(Z.id))==null||I(Z.result),r.delete(Z.id)}),!await po(m,vr.INIT,"",[o.workerId],r))throw"Failed to instantiate workerized class";return m}async function D2(o,n,r){const m={};return Object.getOwnPropertyNames(o.prototype).forEach(Z=>{m[Z]=(...I)=>po(n,vr.FORWARD,Z,I,r)}),m.terminate=async(...Z)=>{const I=await po(n,vr.TERMINATE,"",Z,r);return n.terminate(),m.worker=void 0,I},m.worker=n,m}async function $2(o,n){const r=new Map,m=await Q2(o,n,r);return D2(o,m,r)}function bo(o,n){const{id:r}=o,m=Array.isArray(n)?n:[n];postMessage({id:r,result:n},m.filter(Z=>Ms(Z)))}async function q2(o,n){const{functionName:r,args:m}=o;if(!n.instance)throw"instance not initialized";if(!r)throw"missing function name to call";if(!n.instance[r])throw`undefined function [${r}] in class ${n.instance.constructor.workerId}`;bo(o,await n.instance[r](...m!=null?m:[]))}function Bs(){return typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope}const As={};function tc(o,n){n.workerId=o,Bs()&&(As[n.workerId]=n)}function ec(o,n){if(!o.args)throw"Missing className while initializing worker";const[r]=o.args,m=As[r];if(m)n.instance=new m(o.args.slice(1));else throw`unknown worker class ${r}`;bo(o,typeof n.instance!==void 0)}async function nc(o,n){const{args:r}=o;if(!n.instance)throw"instance not initialized";let m;n.instance.terminate&&(m=await n.instance.terminate(...r!=null?r:[])),bo(o,m)}function rc(){const o={};onmessage=async n=>{const r=n.data;switch(r.type){case vr.INIT:ec(r,o);break;case vr.FORWARD:q2(r,o);break;case vr.TERMINATE:nc(r,o);break}}}Bs()&&rc();class js{static async createVideoReadable(n){return new Promise((r,m)=>{const Z=document.createElement("video");let I=new AbortController,F=new AbortController;Z.addEventListener("canplay",()=>{I.abort(),Z.muted=!0,Z.loop=!0,Z.play().then(()=>{try{const L=Z.captureStream(),E=new MediaStreamTrackProcessor(L.getVideoTracks()[0]);r(E.readable)}catch(L){m(L)}})},{once:!0,signal:F.signal}),Z.addEventListener("error",L=>{F.abort(),m("loading error:"+L)},{once:!0,signal:I.signal}),Z.crossOrigin="anonymous",Z.src=n})}static async createImageCanvas(n){const m=await(await fetch(n)).blob();return await createImageBitmap(m)}}/* @license twgl.js 5.2.0 Copyright (c) 2015, Gregg Tavares All Rights Reserved.
122
+ `+R.getProgramInfoLog(A));T=s.m=A,R.useProgram(T),J=R.getUniformLocation(T,"sampler0"),s.j={I:R.getAttribLocation(T,"aVertex"),H:R.getAttribLocation(T,"aTex"),da:J},s.s=R.createBuffer(),R.bindBuffer(R.ARRAY_BUFFER,s.s),R.enableVertexAttribArray(s.j.I),R.vertexAttribPointer(s.j.I,2,R.FLOAT,!1,0,0),R.bufferData(R.ARRAY_BUFFER,new Float32Array([-1,-1,-1,1,1,1,1,-1]),R.STATIC_DRAW),R.bindBuffer(R.ARRAY_BUFFER,null),s.o=R.createBuffer(),R.bindBuffer(R.ARRAY_BUFFER,s.o),R.enableVertexAttribArray(s.j.H),R.vertexAttribPointer(s.j.H,2,R.FLOAT,!1,0,0),R.bufferData(R.ARRAY_BUFFER,new Float32Array([0,1,0,0,1,0,1,1]),R.STATIC_DRAW),R.bindBuffer(R.ARRAY_BUFFER,null),R.uniform1i(J,0)}T=s.j,R.useProgram(s.m),R.canvas.width=X.width,R.canvas.height=X.height,R.viewport(0,0,X.width,X.height),R.activeTexture(R.TEXTURE0),s.h.bindTexture2d(X.glName),R.enableVertexAttribArray(T.I),R.bindBuffer(R.ARRAY_BUFFER,s.s),R.vertexAttribPointer(T.I,2,R.FLOAT,!1,0,0),R.enableVertexAttribArray(T.H),R.bindBuffer(R.ARRAY_BUFFER,s.o),R.vertexAttribPointer(T.H,2,R.FLOAT,!1,0,0),R.bindFramebuffer(R.DRAW_FRAMEBUFFER?R.DRAW_FRAMEBUFFER:R.FRAMEBUFFER,null),R.clearColor(0,0,0,0),R.clear(R.COLOR_BUFFER_BIT),R.colorMask(!0,!0,!0,!0),R.drawArrays(R.TRIANGLE_FAN,0,4),R.disableVertexAttribArray(T.I),R.disableVertexAttribArray(T.H),R.bindBuffer(R.ARRAY_BUFFER,null),s.h.bindTexture2d(0)}function Yt(s){this.g=s}var Ut=new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,9,1,7,0,65,0,253,15,26,11]);function Dt(s,X){return X+s}function ce(s,X){window[s]=X}function pe(s){var X=document.createElement("script");return X.setAttribute("src",s),X.setAttribute("crossorigin","anonymous"),new Promise(function(R){X.addEventListener("load",function(){R()},!1),X.addEventListener("error",function(){R()},!1),document.body.appendChild(X)})}function ge(){return gt(function(s){switch(s.g){case 1:return s.m=2,_(s,WebAssembly.instantiate(Ut),4);case 4:s.g=3,s.m=0;break;case 2:return s.m=0,s.j=null,s.return(!1);case 3:return s.return(!0)}})}function ke(s){if(this.g=s,this.listeners={},this.j={},this.F={},this.m={},this.s={},this.G=this.o=this.R=!0,this.C=Promise.resolve(),this.P="",this.B={},this.locateFile=s&&s.locateFile||Dt,typeof window=="object")var X=window.location.pathname.toString().substring(0,window.location.pathname.toString().lastIndexOf("/"))+"/";else if(typeof location<"u")X=location.pathname.toString().substring(0,location.pathname.toString().lastIndexOf("/"))+"/";else throw Error("solutions can only be loaded on a web page or in a web worker");if(this.S=X,s.options){X=L(Object.keys(s.options));for(var R=X.next();!R.done;R=X.next()){R=R.value;var T=s.options[R].default;T!==void 0&&(this.j[R]=typeof T=="function"?T():T)}}}o=ke.prototype,o.close=function(){return this.i&&this.i.delete(),Promise.resolve()};function h(s){var X,R,T,J,A,K,nt,q,yt,Gt,Mt;return gt(function(It){switch(It.g){case 1:return s.R?(X=s.g.files===void 0?[]:typeof s.g.files=="function"?s.g.files(s.j):s.g.files,_(It,ge(),2)):It.return();case 2:if(R=It.h,typeof window=="object")return ce("createMediapipeSolutionsWasm",{locateFile:s.locateFile}),ce("createMediapipeSolutionsPackedAssets",{locateFile:s.locateFile}),K=X.filter(function(ft){return ft.data!==void 0}),nt=X.filter(function(ft){return ft.data===void 0}),q=Promise.all(K.map(function(ft){var Xt=C(s,ft.url);if(ft.path!==void 0){var St=ft.path;Xt=Xt.then(function(wt){return s.overrideFile(St,wt),Promise.resolve(wt)})}return Xt})),yt=Promise.all(nt.map(function(ft){return ft.simd===void 0||ft.simd&&R||!ft.simd&&!R?pe(s.locateFile(ft.url,s.S)):Promise.resolve()})).then(function(){var ft,Xt,St;return gt(function(wt){if(wt.g==1)return ft=window.createMediapipeSolutionsWasm,Xt=window.createMediapipeSolutionsPackedAssets,St=s,_(wt,ft(Xt),2);St.h=wt.h,wt.g=0})}),Gt=function(){return gt(function(ft){return s.g.graph&&s.g.graph.url?ft=_(ft,C(s,s.g.graph.url),0):(ft.g=0,ft=void 0),ft})}(),_(It,Promise.all([yt,q,Gt]),7);if(typeof importScripts!="function")throw Error("solutions can only be loaded on a web page or in a web worker");return T=X.filter(function(ft){return ft.simd===void 0||ft.simd&&R||!ft.simd&&!R}).map(function(ft){return s.locateFile(ft.url,s.S)}),importScripts.apply(null,E(T)),J=s,_(It,createMediapipeSolutionsWasm(Module),6);case 6:J.h=It.h,s.l=new OffscreenCanvas(1,1),s.h.canvas=s.l,A=s.h.GL.createContext(s.l,{antialias:!1,alpha:!1,ba:typeof WebGL2RenderingContext<"u"?2:1}),s.h.GL.makeContextCurrent(A),It.g=4;break;case 7:if(s.l=document.createElement("canvas"),Mt=s.l.getContext("webgl2",{}),!Mt&&(Mt=s.l.getContext("webgl",{}),!Mt))return alert("Failed to create WebGL canvas context when passing video frame."),It.return();s.D=Mt,s.h.canvas=s.l,s.h.createContext(s.l,!0,!0,{});case 4:s.i=new s.h.SolutionWasm,s.R=!1,It.g=0}})}function y(s){var X,R,T,J,A,K,nt,q;return gt(function(yt){if(yt.g==1){if(s.g.graph&&s.g.graph.url&&s.P===s.g.graph.url)return yt.return();if(s.o=!0,!s.g.graph||!s.g.graph.url){yt.g=2;return}return s.P=s.g.graph.url,_(yt,C(s,s.g.graph.url),3)}for(yt.g!=2&&(X=yt.h,s.i.loadGraph(X)),R=L(Object.keys(s.B)),T=R.next();!T.done;T=R.next())J=T.value,s.i.overrideFile(J,s.B[J]);if(s.B={},s.g.listeners)for(A=L(s.g.listeners),K=A.next();!K.done;K=A.next())nt=K.value,B(s,nt);q=s.j,s.j={},s.setOptions(q),yt.g=0})}o.reset=function(){var s=this;return gt(function(X){s.i&&(s.i.reset(),s.m={},s.s={}),X.g=0})},o.setOptions=function(s,X){var R=this;if(X=X||this.g.options){for(var T=[],J=[],A={},K=L(Object.keys(s)),nt=K.next();!nt.done;A={K:A.K,L:A.L},nt=K.next()){var q=nt.value;q in this.j&&this.j[q]===s[q]||(this.j[q]=s[q],nt=X[q],nt!==void 0&&(nt.onChange&&(A.K=nt.onChange,A.L=s[q],T.push(function(yt){return function(){var Gt;return gt(function(Mt){if(Mt.g==1)return _(Mt,yt.K(yt.L),2);Gt=Mt.h,Gt===!0&&(R.o=!0),Mt.g=0})}}(A))),nt.graphOptionXref&&(q={valueNumber:nt.type===1?s[q]:0,valueBoolean:nt.type===0?s[q]:!1,valueString:nt.type===2?s[q]:""},nt=Object.assign(Object.assign(Object.assign({},{calculatorName:"",calculatorIndex:0}),nt.graphOptionXref),q),J.push(nt))))}(T.length!==0||J.length!==0)&&(this.o=!0,this.A=(this.A===void 0?[]:this.A).concat(J),this.v=(this.v===void 0?[]:this.v).concat(T))}};function G(s){var X,R,T,J,A,K,nt;return gt(function(q){switch(q.g){case 1:if(!s.o)return q.return();if(!s.v){q.g=2;break}X=L(s.v),R=X.next();case 3:if(R.done){q.g=5;break}return T=R.value,_(q,T(),4);case 4:R=X.next(),q.g=3;break;case 5:s.v=void 0;case 2:if(s.A){for(J=new s.h.GraphOptionChangeRequestList,A=L(s.A),K=A.next();!K.done;K=A.next())nt=K.value,J.push_back(nt);s.i.changeOptions(J),J.delete(),s.A=void 0}s.o=!1,q.g=0}})}o.initialize=function(){var s=this;return gt(function(X){return X.g==1?_(X,h(s),2):X.g!=3?_(X,y(s),3):_(X,G(s),0)})};function C(s,X){var R,T;return gt(function(J){return X in s.F?J.return(s.F[X]):(R=s.locateFile(X,""),T=fetch(R).then(function(A){return A.arrayBuffer()}),s.F[X]=T,J.return(T))})}o.overrideFile=function(s,X){this.i?this.i.overrideFile(s,X):this.B[s]=X},o.clearOverriddenFiles=function(){this.B={},this.i&&this.i.clearOverriddenFiles()},o.send=function(s,X){var R=this,T,J,A,K,nt,q,yt,Gt,Mt;return gt(function(It){switch(It.g){case 1:return R.g.inputs?(T=1e3*(X==null?performance.now():X),_(It,R.C,2)):It.return();case 2:return _(It,R.initialize(),3);case 3:for(J=new R.h.PacketDataList,A=L(Object.keys(s)),K=A.next();!K.done;K=A.next())if(nt=K.value,q=R.g.inputs[nt]){t:{var ft=s[nt];switch(q.type){case"video":var Xt=R.m[q.stream];if(Xt||(Xt=new kt(R.h,R.D),R.m[q.stream]=Xt),Xt.l===0&&(Xt.l=Xt.h.createTexture()),typeof HTMLVideoElement<"u"&&ft instanceof HTMLVideoElement)var St=ft.videoWidth,wt=ft.videoHeight;else typeof HTMLImageElement<"u"&&ft instanceof HTMLImageElement?(St=ft.naturalWidth,wt=ft.naturalHeight):(St=ft.width,wt=ft.height);wt={glName:Xt.l,width:St,height:wt},St=Xt.g,St.canvas.width=wt.width,St.canvas.height=wt.height,St.activeTexture(St.TEXTURE0),Xt.h.bindTexture2d(Xt.l),St.texImage2D(St.TEXTURE_2D,0,St.RGBA,St.RGBA,St.UNSIGNED_BYTE,ft),Xt.h.bindTexture2d(0),Xt=wt;break t;case"detections":for(Xt=R.m[q.stream],Xt||(Xt=new Yt(R.h),R.m[q.stream]=Xt),Xt.data||(Xt.data=new Xt.g.DetectionListData),Xt.data.reset(ft.length),wt=0;wt<ft.length;++wt){St=ft[wt];var Ct=Xt.data,l=Ct.setBoundingBox,v=wt,x=St.T,Y=new k;if(at(Y,1,x.Y),at(Y,2,x.Z),at(Y,3,x.height),at(Y,4,x.width),at(Y,5,x.rotation),at(Y,6,x.W),x=fn(Y,st),l.call(Ct,v,x),St.O)for(Ct=0;Ct<St.O.length;++Ct){Y=St.O[Ct];var N=!!Y.visibility;l=Xt.data,v=l.addNormalizedLandmark,x=wt,Y=Object.assign(Object.assign({},Y),{visibility:N?Y.visibility:0}),N=new Yn,at(N,1,Y.x),at(N,2,Y.y),at(N,3,Y.z),Y.visibility&&at(N,4,Y.visibility),Y=fn(N,$n),v.call(l,x,Y)}if(St.M)for(Ct=0;Ct<St.M.length;++Ct)l=Xt.data,v=l.addClassification,x=wt,Y=St.M[Ct],N=new Sn,at(N,2,Y.X),Y.index&&at(N,1,Y.index),Y.label&&at(N,3,Y.label),Y.displayName&&at(N,4,Y.displayName),Y=fn(N,En),v.call(l,x,Y)}Xt=Xt.data;break t;default:Xt={}}}switch(yt=Xt,Gt=q.stream,q.type){case"video":J.pushTexture2d(Object.assign(Object.assign({},yt),{stream:Gt,timestamp:T}));break;case"detections":Mt=yt,Mt.stream=Gt,Mt.timestamp=T,J.pushDetectionList(Mt);break;default:throw Error("Unknown input config type: '"+q.type+"'")}}return R.i.send(J),_(It,R.C,4);case 4:J.delete(),It.g=0}})};function M(s,X,R){var T,J,A,K,nt,q,yt,Gt,Mt,It,ft,Xt,St,wt;return gt(function(Ct){switch(Ct.g){case 1:if(!R)return Ct.return(X);for(T={},J=0,A=L(Object.keys(R)),K=A.next();!K.done;K=A.next())nt=K.value,q=R[nt],typeof q!="string"&&q.type==="texture"&&X[q.stream]!==void 0&&++J;1<J&&(s.G=!1),yt=L(Object.keys(R)),K=yt.next();case 2:if(K.done){Ct.g=4;break}if(Gt=K.value,Mt=R[Gt],typeof Mt=="string")return St=T,wt=Gt,_(Ct,Q(s,Gt,X[Mt]),14);if(It=X[Mt.stream],Mt.type==="detection_list"){if(It){for(var l=It.getRectList(),v=It.getLandmarksList(),x=It.getClassificationsList(),Y=[],N=0;N<l.size();++N){var i=yn(l.get(N),k,z);i={T:{Y:ot(i,1),Z:ot(i,2),height:ot(i,3),width:ot(i,4),rotation:ot(i,5,0),W:Lt(i,6)},O:Kt(v.get(N)),M:bt(yn(x.get(N),vn,Mn))},Y.push(i)}l=Y}else l=[];T[Gt]=l,Ct.g=7;break}if(Mt.type==="proto_list"){if(It){for(l=Array(It.size()),v=0;v<It.size();v++)l[v]=It.get(v);It.delete()}else l=[];T[Gt]=l,Ct.g=7;break}if(It===void 0){Ct.g=3;break}if(Mt.type==="float_list"){T[Gt]=It,Ct.g=7;break}if(Mt.type==="proto"){T[Gt]=It,Ct.g=7;break}if(Mt.type!=="texture")throw Error("Unknown output config type: '"+Mt.type+"'");return ft=s.s[Gt],ft||(ft=new kt(s.h,s.D),s.s[Gt]=ft),_(Ct,qt(ft,It,s.G),13);case 13:Xt=Ct.h,T[Gt]=Xt;case 7:Mt.transform&&T[Gt]&&(T[Gt]=Mt.transform(T[Gt])),Ct.g=3;break;case 14:St[wt]=Ct.h;case 3:K=yt.next(),Ct.g=2;break;case 4:return Ct.return(T)}})}function Q(s,X,R){var T;return gt(function(J){return typeof R=="number"||R instanceof Uint8Array||R instanceof s.h.Uint8BlobList?J.return(R):R instanceof s.h.Texture2dDataOut?(T=s.s[X],T||(T=new kt(s.h,s.D),s.s[X]=T),J.return(qt(T,R,s.G))):J.return(void 0)})}function B(s,X){for(var R=X.name||"$",T=[].concat(E(X.wants)),J=new s.h.StringList,A=L(X.wants),K=A.next();!K.done;K=A.next())J.push_back(K.value);A=s.h.PacketListener.implement({onResults:function(nt){for(var q={},yt=0;yt<X.wants.length;++yt)q[T[yt]]=nt.get(yt);var Gt=s.listeners[R];Gt&&(s.C=M(s,q,X.outs).then(function(Mt){Mt=Gt(Mt);for(var It=0;It<X.wants.length;++It){var ft=q[T[It]];typeof ft=="object"&&ft.hasOwnProperty&&ft.hasOwnProperty("delete")&&ft.delete()}Mt&&(s.C=Mt)}))}}),s.i.attachMultiListener(J,A),J.delete()}o.onResults=function(s,X){this.listeners[X||"$"]=s},Nt("Solution",ke),Nt("OptionType",{BOOL:0,NUMBER:1,$:2,0:"BOOL",1:"NUMBER",2:"STRING"});function tt(s){switch(s===void 0&&(s=0),s){case 1:return"pose_landmark_full.tflite";case 2:return"pose_landmark_heavy.tflite";default:return"pose_landmark_lite.tflite"}}function ct(s){var X=this;s=s||{},this.g=new ke({locateFile:s.locateFile,files:function(R){return[{url:"pose_solution_packed_assets_loader.js"},{simd:!1,url:"pose_solution_wasm_bin.js"},{simd:!0,url:"pose_solution_simd_wasm_bin.js"},{data:!0,url:tt(R.modelComplexity)}]},graph:{url:"pose_web.binarypb"},listeners:[{wants:["pose_landmarks","world_landmarks","segmentation_mask","image_transformed"],outs:{image:{type:"texture",stream:"image_transformed"},poseLandmarks:{type:"proto",stream:"pose_landmarks",transform:Kt},poseWorldLandmarks:{type:"proto",stream:"world_landmarks",transform:Kt},segmentationMask:{type:"texture",stream:"segmentation_mask"}}}],inputs:{image:{type:"video",stream:"input_frames_gpu"}},options:{useCpuInference:{type:0,graphOptionXref:{calculatorType:"InferenceCalculator",fieldName:"use_cpu_inference"},default:"iPad Simulator;iPhone Simulator;iPod Simulator;iPad;iPhone;iPod".split(";").includes(navigator.platform)||navigator.userAgent.includes("Mac")&&"ontouchend"in document},selfieMode:{type:0,graphOptionXref:{calculatorType:"GlScalerCalculator",calculatorIndex:1,fieldName:"flip_horizontal"}},modelComplexity:{type:1,graphOptionXref:{calculatorType:"ConstantSidePacketCalculator",calculatorName:"ConstantSidePacketCalculatorModelComplexity",fieldName:"int_value"},onChange:function(R){var T,J,A;return gt(function(K){return K.g==1?(T=tt(R),J="third_party/mediapipe/modules/pose_landmark/"+T,_(K,C(X.g,T),2)):(A=K.h,X.g.overrideFile(J,A),K.return(!0))})}},smoothLandmarks:{type:0,graphOptionXref:{calculatorType:"ConstantSidePacketCalculator",calculatorName:"ConstantSidePacketCalculatorSmoothLandmarks",fieldName:"bool_value"}},enableSegmentation:{type:0,graphOptionXref:{calculatorType:"ConstantSidePacketCalculator",calculatorName:"ConstantSidePacketCalculatorEnableSegmentation",fieldName:"bool_value"}},smoothSegmentation:{type:0,graphOptionXref:{calculatorType:"ConstantSidePacketCalculator",calculatorName:"ConstantSidePacketCalculatorSmoothSegmentation",fieldName:"bool_value"}},minDetectionConfidence:{type:1,graphOptionXref:{calculatorType:"TensorsToDetectionsCalculator",calculatorName:"poselandmarkgpu__posedetectiongpu__TensorsToDetectionsCalculator",fieldName:"min_score_thresh"}},minTrackingConfidence:{type:1,graphOptionXref:{calculatorType:"ThresholdingCalculator",calculatorName:"poselandmarkgpu__poselandmarkbyroigpu__tensorstoposelandmarksandsegmentation__ThresholdingCalculator",fieldName:"threshold"}}}})}o=ct.prototype,o.reset=function(){this.g.reset()},o.close=function(){return this.g.close(),Promise.resolve()},o.onResults=function(s){this.g.onResults(s)},o.initialize=function(){var s=this;return gt(function(X){return _(X,s.g.initialize(),0)})},o.send=function(s,X){var R=this;return gt(function(T){return _(T,R.g.send(s,X),0)})},o.setOptions=function(s){this.g.setOptions(s)},Nt("Pose",ct),Nt("POSE_CONNECTIONS",[[0,1],[1,2],[2,3],[3,7],[0,4],[4,5],[5,6],[6,8],[9,10],[11,12],[11,13],[13,15],[15,17],[15,19],[15,21],[17,19],[12,14],[14,16],[16,18],[16,20],[16,22],[18,20],[11,23],[12,24],[23,24],[23,25],[24,26],[25,27],[26,28],[27,29],[28,30],[29,31],[30,32],[27,31],[28,32]]),Nt("POSE_LANDMARKS",{NOSE:0,LEFT_EYE_INNER:1,LEFT_EYE:2,LEFT_EYE_OUTER:3,RIGHT_EYE_INNER:4,RIGHT_EYE:5,RIGHT_EYE_OUTER:6,LEFT_EAR:7,RIGHT_EAR:8,LEFT_RIGHT:9,RIGHT_LEFT:10,LEFT_SHOULDER:11,RIGHT_SHOULDER:12,LEFT_ELBOW:13,RIGHT_ELBOW:14,LEFT_WRIST:15,RIGHT_WRIST:16,LEFT_PINKY:17,RIGHT_PINKY:18,LEFT_INDEX:19,RIGHT_INDEX:20,LEFT_THUMB:21,RIGHT_THUMB:22,LEFT_HIP:23,RIGHT_HIP:24,LEFT_KNEE:25,RIGHT_KNEE:26,LEFT_ANKLE:27,RIGHT_ANKLE:28,LEFT_HEEL:29,RIGHT_HEEL:30,LEFT_FOOT_INDEX:31,RIGHT_FOOT_INDEX:32}),Nt("POSE_LANDMARKS_LEFT",{LEFT_EYE_INNER:1,LEFT_EYE:2,LEFT_EYE_OUTER:3,LEFT_EAR:7,LEFT_RIGHT:9,LEFT_SHOULDER:11,LEFT_ELBOW:13,LEFT_WRIST:15,LEFT_PINKY:17,LEFT_INDEX:19,LEFT_THUMB:21,LEFT_HIP:23,LEFT_KNEE:25,LEFT_ANKLE:27,LEFT_HEEL:29,LEFT_FOOT_INDEX:31}),Nt("POSE_LANDMARKS_RIGHT",{RIGHT_EYE_INNER:4,RIGHT_EYE:5,RIGHT_EYE_OUTER:6,RIGHT_EAR:8,RIGHT_LEFT:10,RIGHT_SHOULDER:12,RIGHT_ELBOW:14,RIGHT_WRIST:16,RIGHT_PINKY:18,RIGHT_INDEX:20,RIGHT_THUMB:22,RIGHT_HIP:24,RIGHT_KNEE:26,RIGHT_ANKLE:28,RIGHT_HEEL:30,RIGHT_FOOT_INDEX:32}),Nt("POSE_LANDMARKS_NEUTRAL",{NOSE:0}),Nt("VERSION","0.5.1635988162")}).call(vi);const lr=class{constructor(){Ht(this,"mediapipeMap_",new Map)}getVersion(n){switch(n){case"face_detection":return yi.VERSION;case"face_mesh":return gi.VERSION;case"hands":return pi.VERSION;case"holistic":return bi.VERSION;case"objectron":return Zi.VERSION;case"selfie_segmentation":return mi.VERSION;case"pose":return vi.VERSION;default:return""}}initialize(n){return new Promise(async(r,m)=>{if(n.mediaPipeModelConfigArray.length==0){m("no model was selected");return}for(let Z=0;Z<n.mediaPipeModelConfigArray.length;Z++){const I=n.mediaPipeModelConfigArray[Z];if(this.mediapipeMap_.has(I.modelType)){m("setting same type is not supported");return}if(typeof I.listener!="function"){m(`[${I.modelType}] ResultsListener must be provided`);return}let F;switch(I.modelType){case"face_mesh":F=new gi.FaceMesh({locateFile:(L,E)=>(I.assetsUri||lr.defaultAssetsBaseUrl+"face_mesh/"+this.getVersion("face_mesh"))+"/"+L});break;case"face_detection":F=new yi.FaceDetection({locateFile:(L,E)=>(I.assetsUri||lr.defaultAssetsBaseUrl+"face_detection/"+this.getVersion("face_detection"))+"/"+L});break;case"hands":F=new pi.Hands({locateFile:(L,E)=>(I.assetsUri||lr.defaultAssetsBaseUrl+"hands/"+this.getVersion("hands"))+"/"+L});break;case"holistic":F=new bi.Holistic({locateFile:(L,E)=>(I.assetsUri||lr.defaultAssetsBaseUrl+"holistic/"+this.getVersion("holistic"))+"/"+L});break;case"objectron":F=new Zi.Objectron({locateFile:(L,E)=>(I.assetsUri||lr.defaultAssetsBaseUrl+"objectron/"+this.getVersion("objectron"))+"/"+L});break;case"selfie_segmentation":F=new mi.SelfieSegmentation({locateFile:(L,E)=>(I.assetsUri||lr.defaultAssetsBaseUrl+"selfie_segmentation/"+this.getVersion("selfie_segmentation"))+"/"+L});break;case"pose":F=new vi.Pose({locateFile:(L,E)=>(I.assetsUri||lr.defaultAssetsBaseUrl+"pose/"+this.getVersion("pose"))+"/"+L});break;default:m("unknown model type");return}F.onResults(I.listener),I.options&&F.setOptions(I.options);try{await F.initialize(),this.mediapipeMap_.set(I.modelType,F)}catch(L){m(L);return}}r()})}close(n){return new Promise((r,m)=>{let Z=[];if(n){let I=this.mediapipeMap_.get(n);if(I)this.mediapipeMap_.delete(n),Z.push(I.close());else{m("model not exit");return}}else{for(const[I,F]of this.mediapipeMap_.entries())Z.push(F.close());this.mediapipeMap_.clear()}Promise.all(Z).then(()=>{r()}).catch(I=>{m(I)})})}send(n,r){return new Promise((m,Z)=>{let I=[];if(r){let F=this.mediapipeMap_.get(r);if(F)I.push(F.send({image:n}));else{Z("model not exit");return}}else for(const[F,L]of this.mediapipeMap_.entries())I.push(L.send({image:n}));Promise.all(I).then(()=>{m()}).catch(F=>{Z(F)})})}reset(n){if(n){let r=this.mediapipeMap_.get(n);r&&typeof r.reset=="function"&&r.reset()}else for(const[r,m]of this.mediapipeMap_.entries())m&&typeof m.reset=="function"&&m.reset()}};let Gi=lr;Ht(Gi,"defaultAssetsBaseUrl","https://d3opqjmqzxf057.cloudfront.net/ml/mediapipe/");const ar=new WeakMap,Xi=new WeakMap,Br=new WeakMap,ho=Symbol("anyProducer"),Ns=Promise.resolve(),Wi=Symbol("listenerAdded"),Vi=Symbol("listenerRemoved");let fo=!1;function wr(o){if(typeof o!="string"&&typeof o!="symbol")throw new TypeError("eventName must be a string or a symbol")}function Ri(o){if(typeof o!="function")throw new TypeError("listener must be a function")}function Fr(o,n){const r=Xi.get(o);return r.has(n)||r.set(n,new Set),r.get(n)}function Ar(o,n){const r=typeof n=="string"||typeof n=="symbol"?n:ho,m=Br.get(o);return m.has(r)||m.set(r,new Set),m.get(r)}function _2(o,n,r){const m=Br.get(o);if(m.has(n))for(const Z of m.get(n))Z.enqueue(r);if(m.has(ho)){const Z=Promise.all([n,r]);for(const I of m.get(ho))I.enqueue(Z)}}function ks(o,n){n=Array.isArray(n)?n:[n];let r=!1,m=()=>{},Z=[];const I={enqueue(F){Z.push(F),m()},finish(){r=!0,m()}};for(const F of n)Ar(o,F).add(I);return{async next(){return Z?Z.length===0?r?(Z=void 0,this.next()):(await new Promise(F=>{m=F}),this.next()):{done:!1,value:await Z.shift()}:{done:!0}},async return(F){Z=void 0;for(const L of n)Ar(o,L).delete(I);return m(),arguments.length>0?{done:!0,value:await F}:{done:!0}},[Symbol.asyncIterator](){return this}}}function Es(o){if(o===void 0)return Us;if(!Array.isArray(o))throw new TypeError("`methodNames` must be an array of strings");for(const n of o)if(!Us.includes(n))throw typeof n!="string"?new TypeError("`methodNames` element must be a string"):new Error(`${n} is not Emittery method`);return o}const mo=o=>o===Wi||o===Vi;class Zr{static mixin(n,r){return r=Es(r),m=>{if(typeof m!="function")throw new TypeError("`target` must be function");for(const F of r)if(m.prototype[F]!==void 0)throw new Error(`The property \`${F}\` already exists on \`target\``);function Z(){return Object.defineProperty(this,n,{enumerable:!1,value:new Zr}),this[n]}Object.defineProperty(m.prototype,n,{enumerable:!1,get:Z});const I=F=>function(...L){return this[n][F](...L)};for(const F of r)Object.defineProperty(m.prototype,F,{enumerable:!1,value:I(F)});return m}}static get isDebugEnabled(){if(typeof process!="object")return fo;const{env:n}=process||{env:{}};return n.DEBUG==="emittery"||n.DEBUG==="*"||fo}static set isDebugEnabled(n){fo=n}constructor(n={}){ar.set(this,new Set),Xi.set(this,new Map),Br.set(this,new Map),this.debug=n.debug||{},this.debug.enabled===void 0&&(this.debug.enabled=!1),this.debug.logger||(this.debug.logger=(r,m,Z,I)=>{try{I=JSON.stringify(I)}catch{I=`Object with the following keys failed to stringify: ${Object.keys(I).join(",")}`}typeof Z=="symbol"&&(Z=Z.toString());const F=new Date,L=`${F.getHours()}:${F.getMinutes()}:${F.getSeconds()}.${F.getMilliseconds()}`;console.log(`[${L}][emittery:${r}][${m}] Event Name: ${Z}
123
+ data: ${I}`)})}logIfDebugEnabled(n,r,m){(Zr.isDebugEnabled||this.debug.enabled)&&this.debug.logger(n,this.debug.name,r,m)}on(n,r){Ri(r),n=Array.isArray(n)?n:[n];for(const m of n)wr(m),Fr(this,m).add(r),this.logIfDebugEnabled("subscribe",m,void 0),mo(m)||this.emit(Wi,{eventName:m,listener:r});return this.off.bind(this,n,r)}off(n,r){Ri(r),n=Array.isArray(n)?n:[n];for(const m of n)wr(m),Fr(this,m).delete(r),this.logIfDebugEnabled("unsubscribe",m,void 0),mo(m)||this.emit(Vi,{eventName:m,listener:r})}once(n){return new Promise(r=>{const m=this.on(n,Z=>{m(),r(Z)})})}events(n){n=Array.isArray(n)?n:[n];for(const r of n)wr(r);return ks(this,n)}async emit(n,r){wr(n),this.logIfDebugEnabled("emit",n,r),_2(this,n,r);const m=Fr(this,n),Z=ar.get(this),I=[...m],F=mo(n)?[]:[...Z];await Ns,await Promise.all([...I.map(async L=>{if(m.has(L))return L(r)}),...F.map(async L=>{if(Z.has(L))return L(n,r)})])}async emitSerial(n,r){wr(n),this.logIfDebugEnabled("emitSerial",n,r);const m=Fr(this,n),Z=ar.get(this),I=[...m],F=[...Z];await Ns;for(const L of I)m.has(L)&&await L(r);for(const L of F)Z.has(L)&&await L(n,r)}onAny(n){return Ri(n),this.logIfDebugEnabled("subscribeAny",void 0,void 0),ar.get(this).add(n),this.emit(Wi,{listener:n}),this.offAny.bind(this,n)}anyEvent(){return ks(this)}offAny(n){Ri(n),this.logIfDebugEnabled("unsubscribeAny",void 0,void 0),this.emit(Vi,{listener:n}),ar.get(this).delete(n)}clearListeners(n){n=Array.isArray(n)?n:[n];for(const r of n)if(this.logIfDebugEnabled("clear",r,void 0),typeof r=="string"||typeof r=="symbol"){Fr(this,r).clear();const m=Ar(this,r);for(const Z of m)Z.finish();m.clear()}else{ar.get(this).clear();for(const m of Xi.get(this).values())m.clear();for(const m of Br.get(this).values()){for(const Z of m)Z.finish();m.clear()}}}listenerCount(n){n=Array.isArray(n)?n:[n];let r=0;for(const m of n){if(typeof m=="string"){r+=ar.get(this).size+Fr(this,m).size+Ar(this,m).size+Ar(this).size;continue}typeof m<"u"&&wr(m),r+=ar.get(this).size;for(const Z of Xi.get(this).values())r+=Z.size;for(const Z of Br.get(this).values())r+=Z.size}return r}bindMethods(n,r){if(typeof n!="object"||n===null)throw new TypeError("`target` must be an object");r=Es(r);for(const m of r){if(n[m]!==void 0)throw new Error(`The property \`${m}\` already exists on \`target\``);Object.defineProperty(n,m,{enumerable:!1,value:this[m].bind(this)})}}}const Us=Object.getOwnPropertyNames(Zr.prototype).filter(o=>o!=="constructor");Object.defineProperty(Zr,"listenerAdded",{value:Wi,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(Zr,"listenerRemoved",{value:Vi,writable:!1,enumerable:!0,configurable:!1});var Ks=Zr,vr=(o=>(o[o.INIT=0]="INIT",o[o.FORWARD=1]="FORWARD",o[o.TERMINATE=2]="TERMINATE",o))(vr||{});function Ms(o){return[ImageBitmap,ReadableStream,WritableStream].some(n=>o instanceof n)}let Q2=0;function po(o,n,r,m,Z){const I=Q2++;return o.postMessage({id:I,type:n,functionName:r,args:m},m.filter(F=>Ms(F))),new Promise(F=>{Z.set(I,F)})}async function D2(o,n,r){const m=new n;if(m.addEventListener("message",({data:Z})=>{var I;(I=r.get(Z.id))==null||I(Z.result),r.delete(Z.id)}),!await po(m,vr.INIT,"",[o.workerId],r))throw"Failed to instantiate workerized class";return m}async function $2(o,n,r){const m={};return Object.getOwnPropertyNames(o.prototype).forEach(Z=>{m[Z]=(...I)=>po(n,vr.FORWARD,Z,I,r)}),m.terminate=async(...Z)=>{const I=await po(n,vr.TERMINATE,"",Z,r);return n.terminate(),m.worker=void 0,I},m.worker=n,m}async function q2(o,n){const r=new Map,m=await D2(o,n,r);return $2(o,m,r)}function bo(o,n){const{id:r}=o,m=Array.isArray(n)?n:[n];postMessage({id:r,result:n},m.filter(Z=>Ms(Z)))}async function tc(o,n){const{functionName:r,args:m}=o;if(!n.instance)throw"instance not initialized";if(!r)throw"missing function name to call";if(!n.instance[r])throw`undefined function [${r}] in class ${n.instance.constructor.workerId}`;bo(o,await n.instance[r](...m!=null?m:[]))}function Bs(){return typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope}const As={};function ec(o,n){n.workerId=o,Bs()&&(As[n.workerId]=n)}function nc(o,n){if(!o.args)throw"Missing className while initializing worker";const[r]=o.args,m=As[r];if(m)n.instance=new m(o.args.slice(1));else throw`unknown worker class ${r}`;bo(o,typeof n.instance!==void 0)}async function rc(o,n){const{args:r}=o;if(!n.instance)throw"instance not initialized";let m;n.instance.terminate&&(m=await n.instance.terminate(...r!=null?r:[])),bo(o,m)}function ic(){const o={};onmessage=async n=>{const r=n.data;switch(r.type){case vr.INIT:nc(r,o);break;case vr.FORWARD:tc(r,o);break;case vr.TERMINATE:rc(r,o);break}}}Bs()&&ic();class js{static async createVideoReadable(n){return new Promise((r,m)=>{const Z=document.createElement("video");let I=new AbortController,F=new AbortController;Z.addEventListener("canplay",()=>{I.abort(),Z.muted=!0,Z.loop=!0,Z.play().then(()=>{try{const L=Z.captureStream(),E=new MediaStreamTrackProcessor(L.getVideoTracks()[0]);r(E.readable)}catch(L){m(L)}})},{once:!0,signal:F.signal}),Z.addEventListener("error",L=>{F.abort(),m("loading error:"+L)},{once:!0,signal:I.signal}),Z.crossOrigin="anonymous",Z.src=n})}static async createImageCanvas(n){const m=await(await fetch(n)).blob();return await createImageBitmap(m)}}/* @license twgl.js 5.2.0 Copyright (c) 2015, Gregg Tavares All Rights Reserved.
124
124
  Available via the MIT license.
125
- see: http://github.com/greggman/twgl.js for details */const yo=5120,jr=5121,go=5122,Zo=5123,vo=5124,Go=5125,Xo=5126,ic=32819,oc=32820,sc=33635,lc=5131,uc=33640,cc=35899,ac=35902,dc=36269,hc=34042,zs={};{const o=zs;o[yo]=Int8Array,o[jr]=Uint8Array,o[go]=Int16Array,o[Zo]=Uint16Array,o[vo]=Int32Array,o[Go]=Uint32Array,o[Xo]=Float32Array,o[ic]=Uint16Array,o[oc]=Uint16Array,o[sc]=Uint16Array,o[lc]=Uint16Array,o[uc]=Uint32Array,o[cc]=Uint32Array,o[ac]=Uint32Array,o[dc]=Uint32Array,o[hc]=Uint32Array}function Wo(o){if(o instanceof Int8Array)return yo;if(o instanceof Uint8Array||o instanceof Uint8ClampedArray)return jr;if(o instanceof Int16Array)return go;if(o instanceof Uint16Array)return Zo;if(o instanceof Int32Array)return vo;if(o instanceof Uint32Array)return Go;if(o instanceof Float32Array)return Xo;throw new Error("unsupported typed array type")}function Ps(o){if(o===Int8Array)return yo;if(o===Uint8Array||o===Uint8ClampedArray)return jr;if(o===Int16Array)return go;if(o===Uint16Array)return Zo;if(o===Int32Array)return vo;if(o===Uint32Array)return Go;if(o===Float32Array)return Xo;throw new Error("unsupported typed array type")}function Os(o){const n=zs[o];if(!n)throw new Error("unknown gl type");return n}const xi=typeof SharedArrayBuffer<"u"?function(n){return n&&n.buffer&&(n.buffer instanceof ArrayBuffer||n.buffer instanceof SharedArrayBuffer)}:function(n){return n&&n.buffer&&n.buffer instanceof ArrayBuffer};function _s(...o){console.error(...o)}const Qs=new Map;function Ii(o,n){if(!o||typeof o!="object")return!1;let r=Qs.get(n);r||(r=new WeakMap,Qs.set(n,r));let m=r.get(o);if(m===void 0){const Z=Object.prototype.toString.call(o);m=Z.substring(8,Z.length-1)===n,r.set(o,m)}return m}function fc(o,n){return typeof WebGLBuffer<"u"&&Ii(n,"WebGLBuffer")}function mc(o,n){return typeof WebGLRenderbuffer<"u"&&Ii(n,"WebGLRenderbuffer")}function Vo(o,n){return typeof WebGLTexture<"u"&&Ii(n,"WebGLTexture")}function pc(o,n){return typeof WebGLSampler<"u"&&Ii(n,"WebGLSampler")}const Ds=35044,Gr=34962,bc=34963,yc=34660,gc=5120,Zc=5121,vc=5122,Gc=5123,Xc=5124,Wc=5125,$s=5126,qs={attribPrefix:""};function Vc(o,n,r,m,Z){o.bindBuffer(n,r),o.bufferData(n,m,Z||Ds)}function tl(o,n,r,m){if(fc(o,n))return n;r=r||Gr;const Z=o.createBuffer();return Vc(o,r,Z,n,m),Z}function el(o){return o==="indices"}function Rc(o){return o===Int8Array||o===Uint8Array}function xc(o){return o.length?o:o.data}const Ic=/coord|texture/i,Sc=/color|colour/i;function Lc(o,n){let r;if(Ic.test(o)?r=2:Sc.test(o)?r=4:r=3,n%r>0)throw new Error(`Can not guess numComponents for attribute '${o}'. Tried ${r} but ${n} values is not evenly divisible by ${r}. You should specify it.`);return r}function Yc(o,n,r){return o.numComponents||o.size||Lc(n,r||xc(o).length)}function nl(o,n){if(xi(o))return o;if(xi(o.data))return o.data;Array.isArray(o)&&(o={data:o});let r=o.type?Ro(o.type):void 0;return r||(el(n)?r=Uint16Array:r=Float32Array),new r(o.data)}function Tc(o){return typeof o=="number"?o:o?Ps(o):$s}function Ro(o){return typeof o=="number"?Os(o):o||Float32Array}function wc(o,n){return{buffer:n.buffer,numValues:2*3*4,type:Tc(n.type),arrayType:Ro(n.type)}}function Fc(o,n){const r=n.data||n,m=Ro(n.type),Z=r*m.BYTES_PER_ELEMENT,I=o.createBuffer();return o.bindBuffer(Gr,I),o.bufferData(Gr,Z,n.drawType||Ds),{buffer:I,numValues:r,type:Ps(m),arrayType:m}}function Hc(o,n,r){const m=nl(n,r);return{arrayType:m.constructor,buffer:tl(o,m,void 0,n.drawType),type:Wo(m),numValues:0}}function Cc(o,n){const r={};return Object.keys(n).forEach(function(m){if(!el(m)){const Z=n[m],I=Z.attrib||Z.name||Z.attribName||qs.attribPrefix+m;if(Z.value){if(!Array.isArray(Z.value)&&!xi(Z.value))throw new Error("array.value is not array or typedarray");r[I]={value:Z.value}}else{let F;Z.buffer&&Z.buffer instanceof WebGLBuffer?F=wc:typeof Z=="number"||typeof Z.data=="number"?F=Fc:F=Hc;const{buffer:L,type:E,numValues:rt,arrayType:O}=F(o,Z,m),lt=Z.normalize!==void 0?Z.normalize:Rc(O),Rt=Yc(Z,m,rt);r[I]={buffer:L,numComponents:Rt,type:E,normalize:lt,stride:Z.stride||0,offset:Z.offset||0,divisor:Z.divisor===void 0?void 0:Z.divisor,drawType:Z.drawType}}}}),o.bindBuffer(Gr,null),r}function Jc(o,n){return n===gc||n===Zc?1:n===vc||n===Gc?2:n===Xc||n===Wc||n===$s?4:0}const xo=["position","positions","a_position"];function Nc(o,n){let r,m;for(m=0;m<xo.length&&(r=xo[m],!(r in n||(r=qs.attribPrefix+r,r in n)));++m);m===xo.length&&(r=Object.keys(n)[0]);const Z=n[r];if(!Z.buffer)return 1;o.bindBuffer(Gr,Z.buffer);const I=o.getBufferParameter(Gr,yc);o.bindBuffer(Gr,null);const F=Jc(o,Z.type),L=I/F,E=Z.numComponents||Z.size,rt=L/E;if(rt%1!==0)throw new Error(`numComponents ${E} not correct for length ${length}`);return rt}function kc(o,n,r){const m=Cc(o,n),Z=Object.assign({},r||{});Z.attribs=Object.assign({},r?r.attribs:{},m);const I=n.indices;if(I){const F=nl(I,"indices");Z.indices=tl(o,F,bc),Z.numElements=F.length,Z.elementType=Wo(F)}else Z.numElements||(Z.numElements=Nc(o,Z.attribs));return Z}function zr(o){return!!o.texStorage2D}const rl=function(){const o={},n={};function r(m){const Z=m.constructor.name;if(!o[Z]){for(const I in m)if(typeof m[I]=="number"){const F=n[m[I]];n[m[I]]=F?`${F} | ${I}`:I}o[Z]=!0}}return function(Z,I){return r(Z),n[I]||(typeof I=="number"?`0x${I.toString(16)}`:I)}}(),dr={textureColor:new Uint8Array([128,192,255,255]),textureOptions:{},crossOrigin:void 0},Pr=xi,il=function(){let o;return function(){return o=o||(typeof document<"u"&&document.createElement?document.createElement("canvas").getContext("2d"):null),o}}(),ol=6406,sr=6407,Gn=6408,sl=6409,ll=6410,Or=6402,ul=34041,Si=33071,Ec=9728,Uc=9729,hr=3553,fr=34067,Xr=32879,Wr=35866,Io=34069,Kc=34070,Mc=34071,Bc=34072,Ac=34073,jc=34074,So=10241,Lo=10240,Li=10242,Yi=10243,cl=32882,zc=33082,Pc=33083,Oc=33084,_c=33085,Yo=3317,al=3314,dl=32878,hl=3316,fl=3315,ml=32877,Qc=37443,Dc=37441,$c=37440,qc=33321,t1=36756,e1=33325,n1=33326,r1=33330,i1=33329,o1=33338,s1=33337,l1=33340,u1=33339,c1=33323,a1=36757,d1=33327,h1=33328,f1=33336,m1=33335,p1=33332,b1=33331,y1=33334,g1=33333,Z1=32849,v1=35905,G1=36194,X1=36758,W1=35898,V1=35901,R1=34843,x1=34837,I1=36221,S1=36239,L1=36215,Y1=36233,T1=36209,w1=36227,F1=32856,H1=35907,C1=36759,J1=32855,N1=32854,k1=32857,E1=34842,U1=34836,K1=36220,M1=36238,B1=36975,A1=36214,j1=36232,z1=36226,P1=36208,O1=33189,_1=33190,Q1=36012,D1=36013,$1=35056,mr=5120,gn=5121,Ti=5122,Hr=5123,wi=5124,Vr=5125,Bn=5126,pl=32819,bl=32820,yl=33635,rr=5131,_r=36193,To=33640,q1=35899,ta=35902,ea=36269,na=34042,Fi=33319,Cr=33320,Hi=6403,Jr=36244,Nr=36248,Rr=36249;let wo;function Ci(o){if(!wo){const n={};n[ol]={textureFormat:ol,colorRenderable:!0,textureFilterable:!0,bytesPerElement:[1,2,2,4],type:[gn,rr,_r,Bn]},n[sl]={textureFormat:sl,colorRenderable:!0,textureFilterable:!0,bytesPerElement:[1,2,2,4],type:[gn,rr,_r,Bn]},n[ll]={textureFormat:ll,colorRenderable:!0,textureFilterable:!0,bytesPerElement:[2,4,4,8],type:[gn,rr,_r,Bn]},n[sr]={textureFormat:sr,colorRenderable:!0,textureFilterable:!0,bytesPerElement:[3,6,6,12,2],type:[gn,rr,_r,Bn,yl]},n[Gn]={textureFormat:Gn,colorRenderable:!0,textureFilterable:!0,bytesPerElement:[4,8,8,16,2,2],type:[gn,rr,_r,Bn,pl,bl]},n[Or]={textureFormat:Or,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[2,4],type:[Vr,Hr]},n[qc]={textureFormat:Hi,colorRenderable:!0,textureFilterable:!0,bytesPerElement:[1],type:[gn]},n[t1]={textureFormat:Hi,colorRenderable:!1,textureFilterable:!0,bytesPerElement:[1],type:[mr]},n[e1]={textureFormat:Hi,colorRenderable:!1,textureFilterable:!0,bytesPerElement:[4,2],type:[Bn,rr]},n[n1]={textureFormat:Hi,colorRenderable:!1,textureFilterable:!1,bytesPerElement:[4],type:[Bn]},n[r1]={textureFormat:Jr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[1],type:[gn]},n[i1]={textureFormat:Jr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[1],type:[mr]},n[p1]={textureFormat:Jr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[2],type:[Hr]},n[b1]={textureFormat:Jr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[2],type:[Ti]},n[y1]={textureFormat:Jr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[4],type:[Vr]},n[g1]={textureFormat:Jr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[4],type:[wi]},n[c1]={textureFormat:Fi,colorRenderable:!0,textureFilterable:!0,bytesPerElement:[2],type:[gn]},n[a1]={textureFormat:Fi,colorRenderable:!1,textureFilterable:!0,bytesPerElement:[2],type:[mr]},n[d1]={textureFormat:Fi,colorRenderable:!1,textureFilterable:!0,bytesPerElement:[8,4],type:[Bn,rr]},n[h1]={textureFormat:Fi,colorRenderable:!1,textureFilterable:!1,bytesPerElement:[8],type:[Bn]},n[f1]={textureFormat:Cr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[2],type:[gn]},n[m1]={textureFormat:Cr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[2],type:[mr]},n[o1]={textureFormat:Cr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[4],type:[Hr]},n[s1]={textureFormat:Cr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[4],type:[Ti]},n[l1]={textureFormat:Cr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[8],type:[Vr]},n[u1]={textureFormat:Cr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[8],type:[wi]},n[Z1]={textureFormat:sr,colorRenderable:!0,textureFilterable:!0,bytesPerElement:[3],type:[gn]},n[v1]={textureFormat:sr,colorRenderable:!1,textureFilterable:!0,bytesPerElement:[3],type:[gn]},n[G1]={textureFormat:sr,colorRenderable:!0,textureFilterable:!0,bytesPerElement:[3,2],type:[gn,yl]},n[X1]={textureFormat:sr,colorRenderable:!1,textureFilterable:!0,bytesPerElement:[3],type:[mr]},n[W1]={textureFormat:sr,colorRenderable:!1,textureFilterable:!0,bytesPerElement:[12,6,4],type:[Bn,rr,q1]},n[V1]={textureFormat:sr,colorRenderable:!1,textureFilterable:!0,bytesPerElement:[12,6,4],type:[Bn,rr,ta]},n[R1]={textureFormat:sr,colorRenderable:!1,textureFilterable:!0,bytesPerElement:[12,6],type:[Bn,rr]},n[x1]={textureFormat:sr,colorRenderable:!1,textureFilterable:!1,bytesPerElement:[12],type:[Bn]},n[I1]={textureFormat:Nr,colorRenderable:!1,textureFilterable:!1,bytesPerElement:[3],type:[gn]},n[S1]={textureFormat:Nr,colorRenderable:!1,textureFilterable:!1,bytesPerElement:[3],type:[mr]},n[L1]={textureFormat:Nr,colorRenderable:!1,textureFilterable:!1,bytesPerElement:[6],type:[Hr]},n[Y1]={textureFormat:Nr,colorRenderable:!1,textureFilterable:!1,bytesPerElement:[6],type:[Ti]},n[T1]={textureFormat:Nr,colorRenderable:!1,textureFilterable:!1,bytesPerElement:[12],type:[Vr]},n[w1]={textureFormat:Nr,colorRenderable:!1,textureFilterable:!1,bytesPerElement:[12],type:[wi]},n[F1]={textureFormat:Gn,colorRenderable:!0,textureFilterable:!0,bytesPerElement:[4],type:[gn]},n[H1]={textureFormat:Gn,colorRenderable:!0,textureFilterable:!0,bytesPerElement:[4],type:[gn]},n[C1]={textureFormat:Gn,colorRenderable:!1,textureFilterable:!0,bytesPerElement:[4],type:[mr]},n[J1]={textureFormat:Gn,colorRenderable:!0,textureFilterable:!0,bytesPerElement:[4,2,4],type:[gn,bl,To]},n[N1]={textureFormat:Gn,colorRenderable:!0,textureFilterable:!0,bytesPerElement:[4,2],type:[gn,pl]},n[k1]={textureFormat:Gn,colorRenderable:!0,textureFilterable:!0,bytesPerElement:[4],type:[To]},n[E1]={textureFormat:Gn,colorRenderable:!1,textureFilterable:!0,bytesPerElement:[16,8],type:[Bn,rr]},n[U1]={textureFormat:Gn,colorRenderable:!1,textureFilterable:!1,bytesPerElement:[16],type:[Bn]},n[K1]={textureFormat:Rr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[4],type:[gn]},n[M1]={textureFormat:Rr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[4],type:[mr]},n[B1]={textureFormat:Rr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[4],type:[To]},n[A1]={textureFormat:Rr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[8],type:[Hr]},n[j1]={textureFormat:Rr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[8],type:[Ti]},n[z1]={textureFormat:Rr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[16],type:[wi]},n[P1]={textureFormat:Rr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[16],type:[Vr]},n[O1]={textureFormat:Or,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[2,4],type:[Hr,Vr]},n[_1]={textureFormat:Or,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[4],type:[Vr]},n[Q1]={textureFormat:Or,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[4],type:[Bn]},n[$1]={textureFormat:ul,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[4],type:[na]},n[D1]={textureFormat:ul,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[4],type:[ea]},Object.keys(n).forEach(function(r){const m=n[r];m.bytesPerElementMap={},m.bytesPerElement.forEach(function(Z,I){const F=m.type[I];m.bytesPerElementMap[F]=Z})}),wo=n}return wo[o]}function ra(o,n){const r=Ci(o);if(!r)throw"unknown internal format";const m=r.bytesPerElementMap[n];if(m===void 0)throw"unknown internal format";return m}function Qr(o){const n=Ci(o);if(!n)throw"unknown internal format";return{format:n.textureFormat,type:n.type[0]}}function gl(o){return(o&o-1)===0}function ia(o,n,r,m){if(!zr(o))return gl(n)&&gl(r);const Z=Ci(m);if(!Z)throw"unknown internal format";return Z.colorRenderable&&Z.textureFilterable}function oa(o){const n=Ci(o);if(!n)throw"unknown internal format";return n.textureFilterable}function sa(o,n,r){return Pr(n)?Wo(n):r||gn}function Ji(o,n,r,m,Z){if(Z%1!==0)throw"can't guess dimensions";if(!r&&!m){const I=Math.sqrt(Z/(n===fr?6:1));I%1===0?(r=I,m=I):(r=Z,m=1)}else if(m){if(!r&&(r=Z/m,r%1))throw"can't guess dimensions"}else if(m=Z/r,m%1)throw"can't guess dimensions";return{width:r,height:m}}function kr(o,n){n.colorspaceConversion!==void 0&&o.pixelStorei(Qc,n.colorspaceConversion),n.premultiplyAlpha!==void 0&&o.pixelStorei(Dc,n.premultiplyAlpha),n.flipY!==void 0&&o.pixelStorei($c,n.flipY)}function Zl(o){o.pixelStorei(Yo,4),zr(o)&&(o.pixelStorei(al,0),o.pixelStorei(dl,0),o.pixelStorei(hl,0),o.pixelStorei(fl,0),o.pixelStorei(ml,0))}function la(o,n,r,m){m.minMag&&(r.call(o,n,So,m.minMag),r.call(o,n,Lo,m.minMag)),m.min&&r.call(o,n,So,m.min),m.mag&&r.call(o,n,Lo,m.mag),m.wrap&&(r.call(o,n,Li,m.wrap),r.call(o,n,Yi,m.wrap),(n===Xr||pc(o,n))&&r.call(o,n,cl,m.wrap)),m.wrapR&&r.call(o,n,cl,m.wrapR),m.wrapS&&r.call(o,n,Li,m.wrapS),m.wrapT&&r.call(o,n,Yi,m.wrapT),m.minLod&&r.call(o,n,zc,m.minLod),m.maxLod&&r.call(o,n,Pc,m.maxLod),m.baseLevel&&r.call(o,n,Oc,m.baseLevel),m.maxLevel&&r.call(o,n,_c,m.maxLevel)}function vl(o,n,r){const m=r.target||hr;o.bindTexture(m,n),la(o,m,o.texParameteri,r)}function ua(o){return o=o||dr.textureColor,Pr(o)?o:new Uint8Array([o[0]*255,o[1]*255,o[2]*255,o[3]*255])}function Fo(o,n,r,m,Z,I){r=r||dr.textureOptions,I=I||Gn;const F=r.target||hr;if(m=m||r.width,Z=Z||r.height,o.bindTexture(F,n),ia(o,m,Z,I))o.generateMipmap(F);else{const L=oa(I)?Uc:Ec;o.texParameteri(F,So,L),o.texParameteri(F,Lo,L),o.texParameteri(F,Li,Si),o.texParameteri(F,Yi,Si)}}function Dr(o){return o.auto===!0||o.auto===void 0&&o.level===void 0}function Ho(o,n){return n=n||{},n.cubeFaceOrder||[Io,Kc,Mc,Bc,Ac,jc]}function Co(o,n){const m=Ho(o,n).map(function(Z,I){return{face:Z,ndx:I}});return m.sort(function(Z,I){return Z.face-I.face}),m}function Gl(o,n,r,m){m=m||dr.textureOptions;const Z=m.target||hr,I=m.level||0;let F=r.width,L=r.height;const E=m.internalFormat||m.format||Gn,rt=Qr(E),O=m.format||rt.format,lt=m.type||rt.type;if(kr(o,m),o.bindTexture(Z,n),Z===fr){const Rt=r.width,Wt=r.height;let dt,ht;if(Rt/6===Wt)dt=Wt,ht=[0,0,1,0,2,0,3,0,4,0,5,0];else if(Wt/6===Rt)dt=Rt,ht=[0,0,0,1,0,2,0,3,0,4,0,5];else if(Rt/3===Wt/2)dt=Rt/3,ht=[0,0,1,0,2,0,0,1,1,1,2,1];else if(Rt/2===Wt/3)dt=Rt/2,ht=[0,0,1,0,0,1,1,1,0,2,1,2];else throw"can't figure out cube map from element: "+(r.src?r.src:r.nodeName);const Ft=il();Ft?(Ft.canvas.width=dt,Ft.canvas.height=dt,F=dt,L=dt,Co(o,m).forEach(function(Tt){const At=ht[Tt.ndx*2+0]*dt,_=ht[Tt.ndx*2+1]*dt;Ft.drawImage(r,At,_,dt,dt,0,0,dt,dt),o.texImage2D(Tt.face,I,E,O,lt,Ft.canvas)}),Ft.canvas.width=1,Ft.canvas.height=1):typeof createImageBitmap<"u"&&(F=dt,L=dt,Co(o,m).forEach(function(Tt){const At=ht[Tt.ndx*2+0]*dt,_=ht[Tt.ndx*2+1]*dt;o.texImage2D(Tt.face,I,E,dt,dt,0,O,lt,null),createImageBitmap(r,At,_,dt,dt,{premultiplyAlpha:"none",colorSpaceConversion:"none"}).then(function(Ee){kr(o,m),o.bindTexture(Z,n),o.texImage2D(Tt.face,I,E,O,lt,Ee),Dr(m)&&Fo(o,n,m,F,L,E)})}))}else if(Z===Xr||Z===Wr){const Rt=Math.min(r.width,r.height),Wt=Math.max(r.width,r.height),dt=Wt/Rt;if(dt%1!==0)throw"can not compute 3D dimensions of element";const ht=r.width===Wt?1:0,Ft=r.height===Wt?1:0;o.pixelStorei(Yo,1),o.pixelStorei(al,r.width),o.pixelStorei(dl,0),o.pixelStorei(ml,0),o.texImage3D(Z,I,E,Rt,Rt,Rt,0,O,lt,null);for(let Tt=0;Tt<dt;++Tt){const At=Tt*Rt*ht,_=Tt*Rt*Ft;o.pixelStorei(hl,At),o.pixelStorei(fl,_),o.texSubImage3D(Z,I,0,0,Tt,Rt,Rt,1,O,lt,r)}Zl(o)}else o.texImage2D(Z,I,E,O,lt,r);Dr(m)&&Fo(o,n,m,F,L,E),vl(o,n,m)}function $r(){}function ca(o){if(typeof document<"u"){const n=document.createElement("a");return n.href=o,n.hostname===location.hostname&&n.port===location.port&&n.protocol===location.protocol}else{const n=new URL(location.href).origin;return new URL(o,location.href).origin===n}}function aa(o,n){return n===void 0&&!ca(o)?"anonymous":n}function da(o,n,r){r=r||$r;let m;if(n=n!==void 0?n:dr.crossOrigin,n=aa(o,n),typeof Image<"u"){m=new Image,n!==void 0&&(m.crossOrigin=n);const Z=function(){m.removeEventListener("error",I),m.removeEventListener("load",F),m=null},I=function(){const E="couldn't load image: "+o;_s(E),r(E,m),Z()},F=function(){r(null,m),Z()};return m.addEventListener("error",I),m.addEventListener("load",F),m.src=o,m}else if(typeof ImageBitmap<"u"){let Z,I;const F=function(){r(Z,I)},L={};n&&(L.mode="cors"),fetch(o,L).then(function(E){if(!E.ok)throw E;return E.blob()}).then(function(E){return createImageBitmap(E,{premultiplyAlpha:"none",colorSpaceConversion:"none"})}).then(function(E){I=E,setTimeout(F)}).catch(function(E){Z=E,setTimeout(F)}),m=null}return m}function Xl(o){return typeof ImageBitmap<"u"&&o instanceof ImageBitmap||typeof ImageData<"u"&&o instanceof ImageData||typeof HTMLElement<"u"&&o instanceof HTMLElement}function Jo(o,n,r){return Xl(o)?(setTimeout(function(){r(null,o)}),o):da(o,n,r)}function No(o,n,r){r=r||dr.textureOptions;const m=r.target||hr;if(o.bindTexture(m,n),r.color===!1)return;const Z=ua(r.color);if(m===fr)for(let I=0;I<6;++I)o.texImage2D(Io+I,0,Gn,1,1,0,Gn,gn,Z);else m===Xr||m===Wr?o.texImage3D(m,0,Gn,1,1,1,0,Gn,gn,Z):o.texImage2D(m,0,Gn,1,1,0,Gn,gn,Z)}function ha(o,n,r,m){return m=m||$r,r=r||dr.textureOptions,No(o,n,r),r=Object.assign({},r),Jo(r.src,r.crossOrigin,function(I,F){I?m(I,n,F):(Gl(o,n,F,r),m(null,n,F))})}function fa(o,n,r,m){m=m||$r;const Z=r.src;if(Z.length!==6)throw"there must be 6 urls for a cubemap";const I=r.level||0,F=r.internalFormat||r.format||Gn,L=Qr(F),E=r.format||L.format,rt=r.type||gn,O=r.target||hr;if(O!==fr)throw"target must be TEXTURE_CUBE_MAP";No(o,n,r),r=Object.assign({},r);let lt=6;const Rt=[],Wt=Ho(o,r);let dt;function ht(Ft){return function(Tt,At){--lt,Tt?Rt.push(Tt):At.width!==At.height?Rt.push("cubemap face img is not a square: "+At.src):(kr(o,r),o.bindTexture(O,n),lt===5?Ho().forEach(function(_){o.texImage2D(_,I,F,E,rt,At)}):o.texImage2D(Ft,I,F,E,rt,At),Dr(r)&&o.generateMipmap(O)),lt===0&&m(Rt.length?Rt:void 0,n,dt)}}dt=Z.map(function(Ft,Tt){return Jo(Ft,r.crossOrigin,ht(Wt[Tt]))})}function ma(o,n,r,m){m=m||$r;const Z=r.src,I=r.internalFormat||r.format||Gn,F=Qr(I),L=r.format||F.format,E=r.type||gn,rt=r.target||Wr;if(rt!==Xr&&rt!==Wr)throw"target must be TEXTURE_3D or TEXTURE_2D_ARRAY";No(o,n,r),r=Object.assign({},r);let O=Z.length;const lt=[];let Rt;const Wt=r.level||0;let dt=r.width,ht=r.height;const Ft=Z.length;let Tt=!0;function At(_){return function(Ee,an){if(--O,Ee)lt.push(Ee);else{if(kr(o,r),o.bindTexture(rt,n),Tt){Tt=!1,dt=r.width||an.width,ht=r.height||an.height,o.texImage3D(rt,Wt,I,dt,ht,Ft,0,L,E,null);for(let Ve=0;Ve<Ft;++Ve)o.texSubImage3D(rt,Wt,0,0,Ve,dt,ht,1,L,E,an)}else{let Ve=an,$t;(an.width!==dt||an.height!==ht)&&($t=il(),Ve=$t.canvas,$t.canvas.width=dt,$t.canvas.height=ht,$t.drawImage(an,0,0,dt,ht)),o.texSubImage3D(rt,Wt,0,0,_,dt,ht,1,L,E,Ve),$t&&Ve===$t.canvas&&($t.canvas.width=0,$t.canvas.height=0)}Dr(r)&&o.generateMipmap(rt)}O===0&&m(lt.length?lt:void 0,n,Rt)}}Rt=Z.map(function(_,Ee){return Jo(_,r.crossOrigin,At(Ee))})}function pa(o,n,r,m){m=m||dr.textureOptions;const Z=m.target||hr;o.bindTexture(Z,n);let I=m.width,F=m.height,L=m.depth;const E=m.level||0,rt=m.internalFormat||m.format||Gn,O=Qr(rt),lt=m.format||O.format,Rt=m.type||sa(o,r,O.type);if(Pr(r))r instanceof Uint8ClampedArray&&(r=new Uint8Array(r.buffer));else{const Ft=Os(Rt);r=new Ft(r)}const Wt=ra(rt,Rt),dt=r.byteLength/Wt;if(dt%1)throw"length wrong size for format: "+rl(o,lt);let ht;if(Z===Xr||Z===Wr)if(!I&&!F&&!L){const Ft=Math.cbrt(dt);if(Ft%1!==0)throw"can't guess cube size of array of numElements: "+dt;I=Ft,F=Ft,L=Ft}else I&&(!F||!L)?(ht=Ji(o,Z,F,L,dt/I),F=ht.width,L=ht.height):F&&(!I||!L)?(ht=Ji(o,Z,I,L,dt/F),I=ht.width,L=ht.height):(ht=Ji(o,Z,I,F,dt/L),I=ht.width,F=ht.height);else ht=Ji(o,Z,I,F,dt),I=ht.width,F=ht.height;if(Zl(o),o.pixelStorei(Yo,m.unpackAlignment||1),kr(o,m),Z===fr){const Ft=Wt/r.BYTES_PER_ELEMENT,Tt=dt/6*Ft;Co(o,m).forEach(At=>{const _=Tt*At.ndx,Ee=r.subarray(_,_+Tt);o.texImage2D(At.face,E,rt,I,F,0,lt,Rt,Ee)})}else Z===Xr||Z===Wr?o.texImage3D(Z,E,rt,I,F,L,0,lt,Rt,r):o.texImage2D(Z,E,rt,I,F,0,lt,Rt,r);return{width:I,height:F,depth:L,type:Rt}}function ba(o,n,r){const m=r.target||hr;o.bindTexture(m,n);const Z=r.level||0,I=r.internalFormat||r.format||Gn,F=Qr(I),L=r.format||F.format,E=r.type||F.type;if(kr(o,r),m===fr)for(let rt=0;rt<6;++rt)o.texImage2D(Io+rt,Z,I,r.width,r.height,0,L,E,null);else m===Xr||m===Wr?o.texImage3D(m,Z,I,r.width,r.height,r.depth,0,L,E,null):o.texImage2D(m,Z,I,r.width,r.height,0,L,E,null)}function Wl(o,n,r){r=r||$r,n=n||dr.textureOptions;const m=o.createTexture(),Z=n.target||hr;let I=n.width||1,F=n.height||1;const L=n.internalFormat||Gn;o.bindTexture(Z,m),Z===fr&&(o.texParameteri(Z,Li,Si),o.texParameteri(Z,Yi,Si));let E=n.src;if(E)if(typeof E=="function"&&(E=E(o,n)),typeof E=="string")ha(o,m,n,r);else if(Pr(E)||Array.isArray(E)&&(typeof E[0]=="number"||Array.isArray(E[0])||Pr(E[0]))){const rt=pa(o,m,E,n);I=rt.width,F=rt.height}else Array.isArray(E)&&(typeof E[0]=="string"||Xl(E[0]))?Z===fr?fa(o,m,n,r):ma(o,m,n,r):(Gl(o,m,E,n),I=E.width,F=E.height);else ba(o,m,n);return Dr(n)&&Fo(o,m,n,I,F,L),vl(o,m,n),m}const ko=_s;function Vl(o){return typeof document<"u"&&document.getElementById?document.getElementById(o):null}const Ni=33984,ki=34962,ya=34963,ga=35713,Za=35714,va=35632,Ga=35633,Xa=35981,Rl=35718,Wa=35721,Va=35971,Ra=35382,xa=35396,Ia=35398,Sa=35392,La=35395,Ei=5126,xl=35664,Il=35665,Sl=35666,Eo=5124,Ll=35667,Yl=35668,Tl=35669,wl=35670,Fl=35671,Hl=35672,Cl=35673,Jl=35674,Nl=35675,kl=35676,Ya=35678,Ta=35680,wa=35679,Fa=35682,Ha=35685,Ca=35686,Ja=35687,Na=35688,ka=35689,Ea=35690,Ua=36289,Ka=36292,Ma=36293,Uo=5125,El=36294,Ul=36295,Kl=36296,Ba=36298,Aa=36299,ja=36300,za=36303,Pa=36306,Oa=36307,_a=36308,Qa=36311,Ui=3553,Ki=34067,Ko=32879,Mi=35866,be={};function Ml(o,n){return be[n].bindPoint}function Da(o,n){return function(r){o.uniform1f(n,r)}}function $a(o,n){return function(r){o.uniform1fv(n,r)}}function qa(o,n){return function(r){o.uniform2fv(n,r)}}function t0(o,n){return function(r){o.uniform3fv(n,r)}}function e0(o,n){return function(r){o.uniform4fv(n,r)}}function Bl(o,n){return function(r){o.uniform1i(n,r)}}function Al(o,n){return function(r){o.uniform1iv(n,r)}}function jl(o,n){return function(r){o.uniform2iv(n,r)}}function zl(o,n){return function(r){o.uniform3iv(n,r)}}function Pl(o,n){return function(r){o.uniform4iv(n,r)}}function n0(o,n){return function(r){o.uniform1ui(n,r)}}function r0(o,n){return function(r){o.uniform1uiv(n,r)}}function i0(o,n){return function(r){o.uniform2uiv(n,r)}}function o0(o,n){return function(r){o.uniform3uiv(n,r)}}function s0(o,n){return function(r){o.uniform4uiv(n,r)}}function l0(o,n){return function(r){o.uniformMatrix2fv(n,!1,r)}}function u0(o,n){return function(r){o.uniformMatrix3fv(n,!1,r)}}function c0(o,n){return function(r){o.uniformMatrix4fv(n,!1,r)}}function a0(o,n){return function(r){o.uniformMatrix2x3fv(n,!1,r)}}function d0(o,n){return function(r){o.uniformMatrix3x2fv(n,!1,r)}}function h0(o,n){return function(r){o.uniformMatrix2x4fv(n,!1,r)}}function f0(o,n){return function(r){o.uniformMatrix4x2fv(n,!1,r)}}function m0(o,n){return function(r){o.uniformMatrix3x4fv(n,!1,r)}}function p0(o,n){return function(r){o.uniformMatrix4x3fv(n,!1,r)}}function On(o,n,r,m){const Z=Ml(o,n);return zr(o)?function(I){let F,L;Vo(o,I)?(F=I,L=null):(F=I.texture,L=I.sampler),o.uniform1i(m,r),o.activeTexture(Ni+r),o.bindTexture(Z,F),o.bindSampler(r,L)}:function(I){o.uniform1i(m,r),o.activeTexture(Ni+r),o.bindTexture(Z,I)}}function _n(o,n,r,m,Z){const I=Ml(o,n),F=new Int32Array(Z);for(let L=0;L<Z;++L)F[L]=r+L;return zr(o)?function(L){o.uniform1iv(m,F),L.forEach(function(E,rt){o.activeTexture(Ni+F[rt]);let O,lt;Vo(o,E)?(O=E,lt=null):(O=E.texture,lt=E.sampler),o.bindSampler(r,lt),o.bindTexture(I,O)})}:function(L){o.uniform1iv(m,F),L.forEach(function(E,rt){o.activeTexture(Ni+F[rt]),o.bindTexture(I,E)})}}be[Ei]={Type:Float32Array,size:4,setter:Da,arraySetter:$a},be[xl]={Type:Float32Array,size:8,setter:qa,cols:2},be[Il]={Type:Float32Array,size:12,setter:t0,cols:3},be[Sl]={Type:Float32Array,size:16,setter:e0,cols:4},be[Eo]={Type:Int32Array,size:4,setter:Bl,arraySetter:Al},be[Ll]={Type:Int32Array,size:8,setter:jl,cols:2},be[Yl]={Type:Int32Array,size:12,setter:zl,cols:3},be[Tl]={Type:Int32Array,size:16,setter:Pl,cols:4},be[Uo]={Type:Uint32Array,size:4,setter:n0,arraySetter:r0},be[El]={Type:Uint32Array,size:8,setter:i0,cols:2},be[Ul]={Type:Uint32Array,size:12,setter:o0,cols:3},be[Kl]={Type:Uint32Array,size:16,setter:s0,cols:4},be[wl]={Type:Uint32Array,size:4,setter:Bl,arraySetter:Al},be[Fl]={Type:Uint32Array,size:8,setter:jl,cols:2},be[Hl]={Type:Uint32Array,size:12,setter:zl,cols:3},be[Cl]={Type:Uint32Array,size:16,setter:Pl,cols:4},be[Jl]={Type:Float32Array,size:32,setter:l0,rows:2,cols:2},be[Nl]={Type:Float32Array,size:48,setter:u0,rows:3,cols:3},be[kl]={Type:Float32Array,size:64,setter:c0,rows:4,cols:4},be[Ha]={Type:Float32Array,size:32,setter:a0,rows:2,cols:3},be[Ca]={Type:Float32Array,size:32,setter:h0,rows:2,cols:4},be[Ja]={Type:Float32Array,size:48,setter:d0,rows:3,cols:2},be[Na]={Type:Float32Array,size:48,setter:m0,rows:3,cols:4},be[ka]={Type:Float32Array,size:64,setter:f0,rows:4,cols:2},be[Ea]={Type:Float32Array,size:64,setter:p0,rows:4,cols:3},be[Ya]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Ui},be[Ta]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Ki},be[wa]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Ko},be[Fa]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Ui},be[Ua]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Mi},be[Ka]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Mi},be[Ma]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Ki},be[Ba]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Ui},be[Aa]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Ko},be[ja]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Ki},be[za]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Mi},be[Pa]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Ui},be[Oa]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Ko},be[_a]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Ki},be[Qa]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Mi};function Bi(o,n){return function(r){if(r.value)switch(o.disableVertexAttribArray(n),r.value.length){case 4:o.vertexAttrib4fv(n,r.value);break;case 3:o.vertexAttrib3fv(n,r.value);break;case 2:o.vertexAttrib2fv(n,r.value);break;case 1:o.vertexAttrib1fv(n,r.value);break;default:throw new Error("the length of a float constant value must be between 1 and 4!")}else o.bindBuffer(ki,r.buffer),o.enableVertexAttribArray(n),o.vertexAttribPointer(n,r.numComponents||r.size,r.type||Ei,r.normalize||!1,r.stride||0,r.offset||0),o.vertexAttribDivisor&&o.vertexAttribDivisor(n,r.divisor||0)}}function pr(o,n){return function(r){if(r.value)if(o.disableVertexAttribArray(n),r.value.length===4)o.vertexAttrib4iv(n,r.value);else throw new Error("The length of an integer constant value must be 4!");else o.bindBuffer(ki,r.buffer),o.enableVertexAttribArray(n),o.vertexAttribIPointer(n,r.numComponents||r.size,r.type||Eo,r.stride||0,r.offset||0),o.vertexAttribDivisor&&o.vertexAttribDivisor(n,r.divisor||0)}}function Ai(o,n){return function(r){if(r.value)if(o.disableVertexAttribArray(n),r.value.length===4)o.vertexAttrib4uiv(n,r.value);else throw new Error("The length of an unsigned integer constant value must be 4!");else o.bindBuffer(ki,r.buffer),o.enableVertexAttribArray(n),o.vertexAttribIPointer(n,r.numComponents||r.size,r.type||Uo,r.stride||0,r.offset||0),o.vertexAttribDivisor&&o.vertexAttribDivisor(n,r.divisor||0)}}function Mo(o,n,r){const m=r.size,Z=r.count;return function(I){o.bindBuffer(ki,I.buffer);const F=I.size||I.numComponents||m,L=F/Z,E=I.type||Ei,O=be[E].size*F,lt=I.normalize||!1,Rt=I.offset||0,Wt=O/Z;for(let dt=0;dt<Z;++dt)o.enableVertexAttribArray(n+dt),o.vertexAttribPointer(n+dt,L,E,lt,O,Rt+Wt*dt),o.vertexAttribDivisor&&o.vertexAttribDivisor(n+dt,I.divisor||0)}}const wn={};wn[Ei]={size:4,setter:Bi},wn[xl]={size:8,setter:Bi},wn[Il]={size:12,setter:Bi},wn[Sl]={size:16,setter:Bi},wn[Eo]={size:4,setter:pr},wn[Ll]={size:8,setter:pr},wn[Yl]={size:12,setter:pr},wn[Tl]={size:16,setter:pr},wn[Uo]={size:4,setter:Ai},wn[El]={size:8,setter:Ai},wn[Ul]={size:12,setter:Ai},wn[Kl]={size:16,setter:Ai},wn[wl]={size:4,setter:pr},wn[Fl]={size:8,setter:pr},wn[Hl]={size:12,setter:pr},wn[Cl]={size:16,setter:pr},wn[Jl]={size:4,setter:Mo,count:2},wn[Nl]={size:9,setter:Mo,count:3},wn[kl]={size:16,setter:Mo,count:4};const b0=/ERROR:\s*\d+:(\d+)/gi;function y0(o,n="",r=0){const m=[...n.matchAll(b0)],Z=new Map(m.map((I,F)=>{const L=parseInt(I[1]),E=m[F+1],rt=E?E.index:n.length,O=n.substring(I.index,rt);return[L-1,O]}));return o.split(`
125
+ see: http://github.com/greggman/twgl.js for details */const yo=5120,jr=5121,go=5122,Zo=5123,vo=5124,Go=5125,Xo=5126,oc=32819,sc=32820,lc=33635,uc=5131,cc=33640,ac=35899,dc=35902,hc=36269,fc=34042,zs={};{const o=zs;o[yo]=Int8Array,o[jr]=Uint8Array,o[go]=Int16Array,o[Zo]=Uint16Array,o[vo]=Int32Array,o[Go]=Uint32Array,o[Xo]=Float32Array,o[oc]=Uint16Array,o[sc]=Uint16Array,o[lc]=Uint16Array,o[uc]=Uint16Array,o[cc]=Uint32Array,o[ac]=Uint32Array,o[dc]=Uint32Array,o[hc]=Uint32Array,o[fc]=Uint32Array}function Wo(o){if(o instanceof Int8Array)return yo;if(o instanceof Uint8Array||o instanceof Uint8ClampedArray)return jr;if(o instanceof Int16Array)return go;if(o instanceof Uint16Array)return Zo;if(o instanceof Int32Array)return vo;if(o instanceof Uint32Array)return Go;if(o instanceof Float32Array)return Xo;throw new Error("unsupported typed array type")}function Ps(o){if(o===Int8Array)return yo;if(o===Uint8Array||o===Uint8ClampedArray)return jr;if(o===Int16Array)return go;if(o===Uint16Array)return Zo;if(o===Int32Array)return vo;if(o===Uint32Array)return Go;if(o===Float32Array)return Xo;throw new Error("unsupported typed array type")}function Os(o){const n=zs[o];if(!n)throw new Error("unknown gl type");return n}const xi=typeof SharedArrayBuffer<"u"?function(n){return n&&n.buffer&&(n.buffer instanceof ArrayBuffer||n.buffer instanceof SharedArrayBuffer)}:function(n){return n&&n.buffer&&n.buffer instanceof ArrayBuffer};function _s(...o){console.error(...o)}const Qs=new Map;function Ii(o,n){if(!o||typeof o!="object")return!1;let r=Qs.get(n);r||(r=new WeakMap,Qs.set(n,r));let m=r.get(o);if(m===void 0){const Z=Object.prototype.toString.call(o);m=Z.substring(8,Z.length-1)===n,r.set(o,m)}return m}function mc(o,n){return typeof WebGLBuffer<"u"&&Ii(n,"WebGLBuffer")}function pc(o,n){return typeof WebGLRenderbuffer<"u"&&Ii(n,"WebGLRenderbuffer")}function Vo(o,n){return typeof WebGLTexture<"u"&&Ii(n,"WebGLTexture")}function bc(o,n){return typeof WebGLSampler<"u"&&Ii(n,"WebGLSampler")}const Ds=35044,Gr=34962,yc=34963,gc=34660,Zc=5120,vc=5121,Gc=5122,Xc=5123,Wc=5124,Vc=5125,$s=5126,qs={attribPrefix:""};function Rc(o,n,r,m,Z){o.bindBuffer(n,r),o.bufferData(n,m,Z||Ds)}function tl(o,n,r,m){if(mc(o,n))return n;r=r||Gr;const Z=o.createBuffer();return Rc(o,r,Z,n,m),Z}function el(o){return o==="indices"}function xc(o){return o===Int8Array||o===Uint8Array}function Ic(o){return o.length?o:o.data}const Sc=/coord|texture/i,Lc=/color|colour/i;function Yc(o,n){let r;if(Sc.test(o)?r=2:Lc.test(o)?r=4:r=3,n%r>0)throw new Error(`Can not guess numComponents for attribute '${o}'. Tried ${r} but ${n} values is not evenly divisible by ${r}. You should specify it.`);return r}function Tc(o,n,r){return o.numComponents||o.size||Yc(n,r||Ic(o).length)}function nl(o,n){if(xi(o))return o;if(xi(o.data))return o.data;Array.isArray(o)&&(o={data:o});let r=o.type?Ro(o.type):void 0;return r||(el(n)?r=Uint16Array:r=Float32Array),new r(o.data)}function wc(o){return typeof o=="number"?o:o?Ps(o):$s}function Ro(o){return typeof o=="number"?Os(o):o||Float32Array}function Fc(o,n){return{buffer:n.buffer,numValues:2*3*4,type:wc(n.type),arrayType:Ro(n.type)}}function Hc(o,n){const r=n.data||n,m=Ro(n.type),Z=r*m.BYTES_PER_ELEMENT,I=o.createBuffer();return o.bindBuffer(Gr,I),o.bufferData(Gr,Z,n.drawType||Ds),{buffer:I,numValues:r,type:Ps(m),arrayType:m}}function Cc(o,n,r){const m=nl(n,r);return{arrayType:m.constructor,buffer:tl(o,m,void 0,n.drawType),type:Wo(m),numValues:0}}function Jc(o,n){const r={};return Object.keys(n).forEach(function(m){if(!el(m)){const Z=n[m],I=Z.attrib||Z.name||Z.attribName||qs.attribPrefix+m;if(Z.value){if(!Array.isArray(Z.value)&&!xi(Z.value))throw new Error("array.value is not array or typedarray");r[I]={value:Z.value}}else{let F;Z.buffer&&Z.buffer instanceof WebGLBuffer?F=Fc:typeof Z=="number"||typeof Z.data=="number"?F=Hc:F=Cc;const{buffer:L,type:E,numValues:rt,arrayType:O}=F(o,Z,m),lt=Z.normalize!==void 0?Z.normalize:xc(O),Rt=Tc(Z,m,rt);r[I]={buffer:L,numComponents:Rt,type:E,normalize:lt,stride:Z.stride||0,offset:Z.offset||0,divisor:Z.divisor===void 0?void 0:Z.divisor,drawType:Z.drawType}}}}),o.bindBuffer(Gr,null),r}function Nc(o,n){return n===Zc||n===vc?1:n===Gc||n===Xc?2:n===Wc||n===Vc||n===$s?4:0}const xo=["position","positions","a_position"];function kc(o,n){let r,m;for(m=0;m<xo.length&&(r=xo[m],!(r in n||(r=qs.attribPrefix+r,r in n)));++m);m===xo.length&&(r=Object.keys(n)[0]);const Z=n[r];if(!Z.buffer)return 1;o.bindBuffer(Gr,Z.buffer);const I=o.getBufferParameter(Gr,gc);o.bindBuffer(Gr,null);const F=Nc(o,Z.type),L=I/F,E=Z.numComponents||Z.size,rt=L/E;if(rt%1!==0)throw new Error(`numComponents ${E} not correct for length ${length}`);return rt}function Ec(o,n,r){const m=Jc(o,n),Z=Object.assign({},r||{});Z.attribs=Object.assign({},r?r.attribs:{},m);const I=n.indices;if(I){const F=nl(I,"indices");Z.indices=tl(o,F,yc),Z.numElements=F.length,Z.elementType=Wo(F)}else Z.numElements||(Z.numElements=kc(o,Z.attribs));return Z}function zr(o){return!!o.texStorage2D}const rl=function(){const o={},n={};function r(m){const Z=m.constructor.name;if(!o[Z]){for(const I in m)if(typeof m[I]=="number"){const F=n[m[I]];n[m[I]]=F?`${F} | ${I}`:I}o[Z]=!0}}return function(Z,I){return r(Z),n[I]||(typeof I=="number"?`0x${I.toString(16)}`:I)}}(),dr={textureColor:new Uint8Array([128,192,255,255]),textureOptions:{},crossOrigin:void 0},Pr=xi,il=function(){let o;return function(){return o=o||(typeof document<"u"&&document.createElement?document.createElement("canvas").getContext("2d"):null),o}}(),ol=6406,sr=6407,Gn=6408,sl=6409,ll=6410,Or=6402,ul=34041,Si=33071,Uc=9728,Kc=9729,hr=3553,fr=34067,Xr=32879,Wr=35866,Io=34069,Mc=34070,Bc=34071,Ac=34072,jc=34073,zc=34074,So=10241,Lo=10240,Li=10242,Yi=10243,cl=32882,Pc=33082,Oc=33083,_c=33084,Qc=33085,Yo=3317,al=3314,dl=32878,hl=3316,fl=3315,ml=32877,Dc=37443,$c=37441,qc=37440,t1=33321,e1=36756,n1=33325,r1=33326,i1=33330,o1=33329,s1=33338,l1=33337,u1=33340,c1=33339,a1=33323,d1=36757,h1=33327,f1=33328,m1=33336,p1=33335,b1=33332,y1=33331,g1=33334,Z1=33333,v1=32849,G1=35905,X1=36194,W1=36758,V1=35898,R1=35901,x1=34843,I1=34837,S1=36221,L1=36239,Y1=36215,T1=36233,w1=36209,F1=36227,H1=32856,C1=35907,J1=36759,N1=32855,k1=32854,E1=32857,U1=34842,K1=34836,M1=36220,B1=36238,A1=36975,j1=36214,z1=36232,P1=36226,O1=36208,_1=33189,Q1=33190,D1=36012,$1=36013,q1=35056,mr=5120,gn=5121,Ti=5122,Hr=5123,wi=5124,Vr=5125,Bn=5126,pl=32819,bl=32820,yl=33635,rr=5131,_r=36193,To=33640,ta=35899,ea=35902,na=36269,ra=34042,Fi=33319,Cr=33320,Hi=6403,Jr=36244,Nr=36248,Rr=36249;let wo;function Ci(o){if(!wo){const n={};n[ol]={textureFormat:ol,colorRenderable:!0,textureFilterable:!0,bytesPerElement:[1,2,2,4],type:[gn,rr,_r,Bn]},n[sl]={textureFormat:sl,colorRenderable:!0,textureFilterable:!0,bytesPerElement:[1,2,2,4],type:[gn,rr,_r,Bn]},n[ll]={textureFormat:ll,colorRenderable:!0,textureFilterable:!0,bytesPerElement:[2,4,4,8],type:[gn,rr,_r,Bn]},n[sr]={textureFormat:sr,colorRenderable:!0,textureFilterable:!0,bytesPerElement:[3,6,6,12,2],type:[gn,rr,_r,Bn,yl]},n[Gn]={textureFormat:Gn,colorRenderable:!0,textureFilterable:!0,bytesPerElement:[4,8,8,16,2,2],type:[gn,rr,_r,Bn,pl,bl]},n[Or]={textureFormat:Or,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[2,4],type:[Vr,Hr]},n[t1]={textureFormat:Hi,colorRenderable:!0,textureFilterable:!0,bytesPerElement:[1],type:[gn]},n[e1]={textureFormat:Hi,colorRenderable:!1,textureFilterable:!0,bytesPerElement:[1],type:[mr]},n[n1]={textureFormat:Hi,colorRenderable:!1,textureFilterable:!0,bytesPerElement:[4,2],type:[Bn,rr]},n[r1]={textureFormat:Hi,colorRenderable:!1,textureFilterable:!1,bytesPerElement:[4],type:[Bn]},n[i1]={textureFormat:Jr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[1],type:[gn]},n[o1]={textureFormat:Jr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[1],type:[mr]},n[b1]={textureFormat:Jr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[2],type:[Hr]},n[y1]={textureFormat:Jr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[2],type:[Ti]},n[g1]={textureFormat:Jr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[4],type:[Vr]},n[Z1]={textureFormat:Jr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[4],type:[wi]},n[a1]={textureFormat:Fi,colorRenderable:!0,textureFilterable:!0,bytesPerElement:[2],type:[gn]},n[d1]={textureFormat:Fi,colorRenderable:!1,textureFilterable:!0,bytesPerElement:[2],type:[mr]},n[h1]={textureFormat:Fi,colorRenderable:!1,textureFilterable:!0,bytesPerElement:[8,4],type:[Bn,rr]},n[f1]={textureFormat:Fi,colorRenderable:!1,textureFilterable:!1,bytesPerElement:[8],type:[Bn]},n[m1]={textureFormat:Cr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[2],type:[gn]},n[p1]={textureFormat:Cr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[2],type:[mr]},n[s1]={textureFormat:Cr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[4],type:[Hr]},n[l1]={textureFormat:Cr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[4],type:[Ti]},n[u1]={textureFormat:Cr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[8],type:[Vr]},n[c1]={textureFormat:Cr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[8],type:[wi]},n[v1]={textureFormat:sr,colorRenderable:!0,textureFilterable:!0,bytesPerElement:[3],type:[gn]},n[G1]={textureFormat:sr,colorRenderable:!1,textureFilterable:!0,bytesPerElement:[3],type:[gn]},n[X1]={textureFormat:sr,colorRenderable:!0,textureFilterable:!0,bytesPerElement:[3,2],type:[gn,yl]},n[W1]={textureFormat:sr,colorRenderable:!1,textureFilterable:!0,bytesPerElement:[3],type:[mr]},n[V1]={textureFormat:sr,colorRenderable:!1,textureFilterable:!0,bytesPerElement:[12,6,4],type:[Bn,rr,ta]},n[R1]={textureFormat:sr,colorRenderable:!1,textureFilterable:!0,bytesPerElement:[12,6,4],type:[Bn,rr,ea]},n[x1]={textureFormat:sr,colorRenderable:!1,textureFilterable:!0,bytesPerElement:[12,6],type:[Bn,rr]},n[I1]={textureFormat:sr,colorRenderable:!1,textureFilterable:!1,bytesPerElement:[12],type:[Bn]},n[S1]={textureFormat:Nr,colorRenderable:!1,textureFilterable:!1,bytesPerElement:[3],type:[gn]},n[L1]={textureFormat:Nr,colorRenderable:!1,textureFilterable:!1,bytesPerElement:[3],type:[mr]},n[Y1]={textureFormat:Nr,colorRenderable:!1,textureFilterable:!1,bytesPerElement:[6],type:[Hr]},n[T1]={textureFormat:Nr,colorRenderable:!1,textureFilterable:!1,bytesPerElement:[6],type:[Ti]},n[w1]={textureFormat:Nr,colorRenderable:!1,textureFilterable:!1,bytesPerElement:[12],type:[Vr]},n[F1]={textureFormat:Nr,colorRenderable:!1,textureFilterable:!1,bytesPerElement:[12],type:[wi]},n[H1]={textureFormat:Gn,colorRenderable:!0,textureFilterable:!0,bytesPerElement:[4],type:[gn]},n[C1]={textureFormat:Gn,colorRenderable:!0,textureFilterable:!0,bytesPerElement:[4],type:[gn]},n[J1]={textureFormat:Gn,colorRenderable:!1,textureFilterable:!0,bytesPerElement:[4],type:[mr]},n[N1]={textureFormat:Gn,colorRenderable:!0,textureFilterable:!0,bytesPerElement:[4,2,4],type:[gn,bl,To]},n[k1]={textureFormat:Gn,colorRenderable:!0,textureFilterable:!0,bytesPerElement:[4,2],type:[gn,pl]},n[E1]={textureFormat:Gn,colorRenderable:!0,textureFilterable:!0,bytesPerElement:[4],type:[To]},n[U1]={textureFormat:Gn,colorRenderable:!1,textureFilterable:!0,bytesPerElement:[16,8],type:[Bn,rr]},n[K1]={textureFormat:Gn,colorRenderable:!1,textureFilterable:!1,bytesPerElement:[16],type:[Bn]},n[M1]={textureFormat:Rr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[4],type:[gn]},n[B1]={textureFormat:Rr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[4],type:[mr]},n[A1]={textureFormat:Rr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[4],type:[To]},n[j1]={textureFormat:Rr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[8],type:[Hr]},n[z1]={textureFormat:Rr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[8],type:[Ti]},n[P1]={textureFormat:Rr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[16],type:[wi]},n[O1]={textureFormat:Rr,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[16],type:[Vr]},n[_1]={textureFormat:Or,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[2,4],type:[Hr,Vr]},n[Q1]={textureFormat:Or,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[4],type:[Vr]},n[D1]={textureFormat:Or,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[4],type:[Bn]},n[q1]={textureFormat:ul,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[4],type:[ra]},n[$1]={textureFormat:ul,colorRenderable:!0,textureFilterable:!1,bytesPerElement:[4],type:[na]},Object.keys(n).forEach(function(r){const m=n[r];m.bytesPerElementMap={},m.bytesPerElement.forEach(function(Z,I){const F=m.type[I];m.bytesPerElementMap[F]=Z})}),wo=n}return wo[o]}function ia(o,n){const r=Ci(o);if(!r)throw"unknown internal format";const m=r.bytesPerElementMap[n];if(m===void 0)throw"unknown internal format";return m}function Qr(o){const n=Ci(o);if(!n)throw"unknown internal format";return{format:n.textureFormat,type:n.type[0]}}function gl(o){return(o&o-1)===0}function oa(o,n,r,m){if(!zr(o))return gl(n)&&gl(r);const Z=Ci(m);if(!Z)throw"unknown internal format";return Z.colorRenderable&&Z.textureFilterable}function sa(o){const n=Ci(o);if(!n)throw"unknown internal format";return n.textureFilterable}function la(o,n,r){return Pr(n)?Wo(n):r||gn}function Ji(o,n,r,m,Z){if(Z%1!==0)throw"can't guess dimensions";if(!r&&!m){const I=Math.sqrt(Z/(n===fr?6:1));I%1===0?(r=I,m=I):(r=Z,m=1)}else if(m){if(!r&&(r=Z/m,r%1))throw"can't guess dimensions"}else if(m=Z/r,m%1)throw"can't guess dimensions";return{width:r,height:m}}function kr(o,n){n.colorspaceConversion!==void 0&&o.pixelStorei(Dc,n.colorspaceConversion),n.premultiplyAlpha!==void 0&&o.pixelStorei($c,n.premultiplyAlpha),n.flipY!==void 0&&o.pixelStorei(qc,n.flipY)}function Zl(o){o.pixelStorei(Yo,4),zr(o)&&(o.pixelStorei(al,0),o.pixelStorei(dl,0),o.pixelStorei(hl,0),o.pixelStorei(fl,0),o.pixelStorei(ml,0))}function ua(o,n,r,m){m.minMag&&(r.call(o,n,So,m.minMag),r.call(o,n,Lo,m.minMag)),m.min&&r.call(o,n,So,m.min),m.mag&&r.call(o,n,Lo,m.mag),m.wrap&&(r.call(o,n,Li,m.wrap),r.call(o,n,Yi,m.wrap),(n===Xr||bc(o,n))&&r.call(o,n,cl,m.wrap)),m.wrapR&&r.call(o,n,cl,m.wrapR),m.wrapS&&r.call(o,n,Li,m.wrapS),m.wrapT&&r.call(o,n,Yi,m.wrapT),m.minLod&&r.call(o,n,Pc,m.minLod),m.maxLod&&r.call(o,n,Oc,m.maxLod),m.baseLevel&&r.call(o,n,_c,m.baseLevel),m.maxLevel&&r.call(o,n,Qc,m.maxLevel)}function vl(o,n,r){const m=r.target||hr;o.bindTexture(m,n),ua(o,m,o.texParameteri,r)}function ca(o){return o=o||dr.textureColor,Pr(o)?o:new Uint8Array([o[0]*255,o[1]*255,o[2]*255,o[3]*255])}function Fo(o,n,r,m,Z,I){r=r||dr.textureOptions,I=I||Gn;const F=r.target||hr;if(m=m||r.width,Z=Z||r.height,o.bindTexture(F,n),oa(o,m,Z,I))o.generateMipmap(F);else{const L=sa(I)?Kc:Uc;o.texParameteri(F,So,L),o.texParameteri(F,Lo,L),o.texParameteri(F,Li,Si),o.texParameteri(F,Yi,Si)}}function Dr(o){return o.auto===!0||o.auto===void 0&&o.level===void 0}function Ho(o,n){return n=n||{},n.cubeFaceOrder||[Io,Mc,Bc,Ac,jc,zc]}function Co(o,n){const m=Ho(o,n).map(function(Z,I){return{face:Z,ndx:I}});return m.sort(function(Z,I){return Z.face-I.face}),m}function Gl(o,n,r,m){m=m||dr.textureOptions;const Z=m.target||hr,I=m.level||0;let F=r.width,L=r.height;const E=m.internalFormat||m.format||Gn,rt=Qr(E),O=m.format||rt.format,lt=m.type||rt.type;if(kr(o,m),o.bindTexture(Z,n),Z===fr){const Rt=r.width,Wt=r.height;let dt,ht;if(Rt/6===Wt)dt=Wt,ht=[0,0,1,0,2,0,3,0,4,0,5,0];else if(Wt/6===Rt)dt=Rt,ht=[0,0,0,1,0,2,0,3,0,4,0,5];else if(Rt/3===Wt/2)dt=Rt/3,ht=[0,0,1,0,2,0,0,1,1,1,2,1];else if(Rt/2===Wt/3)dt=Rt/2,ht=[0,0,1,0,0,1,1,1,0,2,1,2];else throw"can't figure out cube map from element: "+(r.src?r.src:r.nodeName);const Ft=il();Ft?(Ft.canvas.width=dt,Ft.canvas.height=dt,F=dt,L=dt,Co(o,m).forEach(function(Tt){const At=ht[Tt.ndx*2+0]*dt,_=ht[Tt.ndx*2+1]*dt;Ft.drawImage(r,At,_,dt,dt,0,0,dt,dt),o.texImage2D(Tt.face,I,E,O,lt,Ft.canvas)}),Ft.canvas.width=1,Ft.canvas.height=1):typeof createImageBitmap<"u"&&(F=dt,L=dt,Co(o,m).forEach(function(Tt){const At=ht[Tt.ndx*2+0]*dt,_=ht[Tt.ndx*2+1]*dt;o.texImage2D(Tt.face,I,E,dt,dt,0,O,lt,null),createImageBitmap(r,At,_,dt,dt,{premultiplyAlpha:"none",colorSpaceConversion:"none"}).then(function(Ee){kr(o,m),o.bindTexture(Z,n),o.texImage2D(Tt.face,I,E,O,lt,Ee),Dr(m)&&Fo(o,n,m,F,L,E)})}))}else if(Z===Xr||Z===Wr){const Rt=Math.min(r.width,r.height),Wt=Math.max(r.width,r.height),dt=Wt/Rt;if(dt%1!==0)throw"can not compute 3D dimensions of element";const ht=r.width===Wt?1:0,Ft=r.height===Wt?1:0;o.pixelStorei(Yo,1),o.pixelStorei(al,r.width),o.pixelStorei(dl,0),o.pixelStorei(ml,0),o.texImage3D(Z,I,E,Rt,Rt,Rt,0,O,lt,null);for(let Tt=0;Tt<dt;++Tt){const At=Tt*Rt*ht,_=Tt*Rt*Ft;o.pixelStorei(hl,At),o.pixelStorei(fl,_),o.texSubImage3D(Z,I,0,0,Tt,Rt,Rt,1,O,lt,r)}Zl(o)}else o.texImage2D(Z,I,E,O,lt,r);Dr(m)&&Fo(o,n,m,F,L,E),vl(o,n,m)}function $r(){}function aa(o){if(typeof document<"u"){const n=document.createElement("a");return n.href=o,n.hostname===location.hostname&&n.port===location.port&&n.protocol===location.protocol}else{const n=new URL(location.href).origin;return new URL(o,location.href).origin===n}}function da(o,n){return n===void 0&&!aa(o)?"anonymous":n}function ha(o,n,r){r=r||$r;let m;if(n=n!==void 0?n:dr.crossOrigin,n=da(o,n),typeof Image<"u"){m=new Image,n!==void 0&&(m.crossOrigin=n);const Z=function(){m.removeEventListener("error",I),m.removeEventListener("load",F),m=null},I=function(){const E="couldn't load image: "+o;_s(E),r(E,m),Z()},F=function(){r(null,m),Z()};return m.addEventListener("error",I),m.addEventListener("load",F),m.src=o,m}else if(typeof ImageBitmap<"u"){let Z,I;const F=function(){r(Z,I)},L={};n&&(L.mode="cors"),fetch(o,L).then(function(E){if(!E.ok)throw E;return E.blob()}).then(function(E){return createImageBitmap(E,{premultiplyAlpha:"none",colorSpaceConversion:"none"})}).then(function(E){I=E,setTimeout(F)}).catch(function(E){Z=E,setTimeout(F)}),m=null}return m}function Xl(o){return typeof ImageBitmap<"u"&&o instanceof ImageBitmap||typeof ImageData<"u"&&o instanceof ImageData||typeof HTMLElement<"u"&&o instanceof HTMLElement}function Jo(o,n,r){return Xl(o)?(setTimeout(function(){r(null,o)}),o):ha(o,n,r)}function No(o,n,r){r=r||dr.textureOptions;const m=r.target||hr;if(o.bindTexture(m,n),r.color===!1)return;const Z=ca(r.color);if(m===fr)for(let I=0;I<6;++I)o.texImage2D(Io+I,0,Gn,1,1,0,Gn,gn,Z);else m===Xr||m===Wr?o.texImage3D(m,0,Gn,1,1,1,0,Gn,gn,Z):o.texImage2D(m,0,Gn,1,1,0,Gn,gn,Z)}function fa(o,n,r,m){return m=m||$r,r=r||dr.textureOptions,No(o,n,r),r=Object.assign({},r),Jo(r.src,r.crossOrigin,function(I,F){I?m(I,n,F):(Gl(o,n,F,r),m(null,n,F))})}function ma(o,n,r,m){m=m||$r;const Z=r.src;if(Z.length!==6)throw"there must be 6 urls for a cubemap";const I=r.level||0,F=r.internalFormat||r.format||Gn,L=Qr(F),E=r.format||L.format,rt=r.type||gn,O=r.target||hr;if(O!==fr)throw"target must be TEXTURE_CUBE_MAP";No(o,n,r),r=Object.assign({},r);let lt=6;const Rt=[],Wt=Ho(o,r);let dt;function ht(Ft){return function(Tt,At){--lt,Tt?Rt.push(Tt):At.width!==At.height?Rt.push("cubemap face img is not a square: "+At.src):(kr(o,r),o.bindTexture(O,n),lt===5?Ho().forEach(function(_){o.texImage2D(_,I,F,E,rt,At)}):o.texImage2D(Ft,I,F,E,rt,At),Dr(r)&&o.generateMipmap(O)),lt===0&&m(Rt.length?Rt:void 0,n,dt)}}dt=Z.map(function(Ft,Tt){return Jo(Ft,r.crossOrigin,ht(Wt[Tt]))})}function pa(o,n,r,m){m=m||$r;const Z=r.src,I=r.internalFormat||r.format||Gn,F=Qr(I),L=r.format||F.format,E=r.type||gn,rt=r.target||Wr;if(rt!==Xr&&rt!==Wr)throw"target must be TEXTURE_3D or TEXTURE_2D_ARRAY";No(o,n,r),r=Object.assign({},r);let O=Z.length;const lt=[];let Rt;const Wt=r.level||0;let dt=r.width,ht=r.height;const Ft=Z.length;let Tt=!0;function At(_){return function(Ee,an){if(--O,Ee)lt.push(Ee);else{if(kr(o,r),o.bindTexture(rt,n),Tt){Tt=!1,dt=r.width||an.width,ht=r.height||an.height,o.texImage3D(rt,Wt,I,dt,ht,Ft,0,L,E,null);for(let Ve=0;Ve<Ft;++Ve)o.texSubImage3D(rt,Wt,0,0,Ve,dt,ht,1,L,E,an)}else{let Ve=an,$t;(an.width!==dt||an.height!==ht)&&($t=il(),Ve=$t.canvas,$t.canvas.width=dt,$t.canvas.height=ht,$t.drawImage(an,0,0,dt,ht)),o.texSubImage3D(rt,Wt,0,0,_,dt,ht,1,L,E,Ve),$t&&Ve===$t.canvas&&($t.canvas.width=0,$t.canvas.height=0)}Dr(r)&&o.generateMipmap(rt)}O===0&&m(lt.length?lt:void 0,n,Rt)}}Rt=Z.map(function(_,Ee){return Jo(_,r.crossOrigin,At(Ee))})}function ba(o,n,r,m){m=m||dr.textureOptions;const Z=m.target||hr;o.bindTexture(Z,n);let I=m.width,F=m.height,L=m.depth;const E=m.level||0,rt=m.internalFormat||m.format||Gn,O=Qr(rt),lt=m.format||O.format,Rt=m.type||la(o,r,O.type);if(Pr(r))r instanceof Uint8ClampedArray&&(r=new Uint8Array(r.buffer));else{const Ft=Os(Rt);r=new Ft(r)}const Wt=ia(rt,Rt),dt=r.byteLength/Wt;if(dt%1)throw"length wrong size for format: "+rl(o,lt);let ht;if(Z===Xr||Z===Wr)if(!I&&!F&&!L){const Ft=Math.cbrt(dt);if(Ft%1!==0)throw"can't guess cube size of array of numElements: "+dt;I=Ft,F=Ft,L=Ft}else I&&(!F||!L)?(ht=Ji(o,Z,F,L,dt/I),F=ht.width,L=ht.height):F&&(!I||!L)?(ht=Ji(o,Z,I,L,dt/F),I=ht.width,L=ht.height):(ht=Ji(o,Z,I,F,dt/L),I=ht.width,F=ht.height);else ht=Ji(o,Z,I,F,dt),I=ht.width,F=ht.height;if(Zl(o),o.pixelStorei(Yo,m.unpackAlignment||1),kr(o,m),Z===fr){const Ft=Wt/r.BYTES_PER_ELEMENT,Tt=dt/6*Ft;Co(o,m).forEach(At=>{const _=Tt*At.ndx,Ee=r.subarray(_,_+Tt);o.texImage2D(At.face,E,rt,I,F,0,lt,Rt,Ee)})}else Z===Xr||Z===Wr?o.texImage3D(Z,E,rt,I,F,L,0,lt,Rt,r):o.texImage2D(Z,E,rt,I,F,0,lt,Rt,r);return{width:I,height:F,depth:L,type:Rt}}function ya(o,n,r){const m=r.target||hr;o.bindTexture(m,n);const Z=r.level||0,I=r.internalFormat||r.format||Gn,F=Qr(I),L=r.format||F.format,E=r.type||F.type;if(kr(o,r),m===fr)for(let rt=0;rt<6;++rt)o.texImage2D(Io+rt,Z,I,r.width,r.height,0,L,E,null);else m===Xr||m===Wr?o.texImage3D(m,Z,I,r.width,r.height,r.depth,0,L,E,null):o.texImage2D(m,Z,I,r.width,r.height,0,L,E,null)}function Wl(o,n,r){r=r||$r,n=n||dr.textureOptions;const m=o.createTexture(),Z=n.target||hr;let I=n.width||1,F=n.height||1;const L=n.internalFormat||Gn;o.bindTexture(Z,m),Z===fr&&(o.texParameteri(Z,Li,Si),o.texParameteri(Z,Yi,Si));let E=n.src;if(E)if(typeof E=="function"&&(E=E(o,n)),typeof E=="string")fa(o,m,n,r);else if(Pr(E)||Array.isArray(E)&&(typeof E[0]=="number"||Array.isArray(E[0])||Pr(E[0]))){const rt=ba(o,m,E,n);I=rt.width,F=rt.height}else Array.isArray(E)&&(typeof E[0]=="string"||Xl(E[0]))?Z===fr?ma(o,m,n,r):pa(o,m,n,r):(Gl(o,m,E,n),I=E.width,F=E.height);else ya(o,m,n);return Dr(n)&&Fo(o,m,n,I,F,L),vl(o,m,n),m}const ko=_s;function Vl(o){return typeof document<"u"&&document.getElementById?document.getElementById(o):null}const Ni=33984,ki=34962,ga=34963,Za=35713,va=35714,Ga=35632,Xa=35633,Wa=35981,Rl=35718,Va=35721,Ra=35971,xa=35382,Ia=35396,Sa=35398,La=35392,Ya=35395,Ei=5126,xl=35664,Il=35665,Sl=35666,Eo=5124,Ll=35667,Yl=35668,Tl=35669,wl=35670,Fl=35671,Hl=35672,Cl=35673,Jl=35674,Nl=35675,kl=35676,Ta=35678,wa=35680,Fa=35679,Ha=35682,Ca=35685,Ja=35686,Na=35687,ka=35688,Ea=35689,Ua=35690,Ka=36289,Ma=36292,Ba=36293,Uo=5125,El=36294,Ul=36295,Kl=36296,Aa=36298,ja=36299,za=36300,Pa=36303,Oa=36306,_a=36307,Qa=36308,Da=36311,Ui=3553,Ki=34067,Ko=32879,Mi=35866,be={};function Ml(o,n){return be[n].bindPoint}function $a(o,n){return function(r){o.uniform1f(n,r)}}function qa(o,n){return function(r){o.uniform1fv(n,r)}}function t0(o,n){return function(r){o.uniform2fv(n,r)}}function e0(o,n){return function(r){o.uniform3fv(n,r)}}function n0(o,n){return function(r){o.uniform4fv(n,r)}}function Bl(o,n){return function(r){o.uniform1i(n,r)}}function Al(o,n){return function(r){o.uniform1iv(n,r)}}function jl(o,n){return function(r){o.uniform2iv(n,r)}}function zl(o,n){return function(r){o.uniform3iv(n,r)}}function Pl(o,n){return function(r){o.uniform4iv(n,r)}}function r0(o,n){return function(r){o.uniform1ui(n,r)}}function i0(o,n){return function(r){o.uniform1uiv(n,r)}}function o0(o,n){return function(r){o.uniform2uiv(n,r)}}function s0(o,n){return function(r){o.uniform3uiv(n,r)}}function l0(o,n){return function(r){o.uniform4uiv(n,r)}}function u0(o,n){return function(r){o.uniformMatrix2fv(n,!1,r)}}function c0(o,n){return function(r){o.uniformMatrix3fv(n,!1,r)}}function a0(o,n){return function(r){o.uniformMatrix4fv(n,!1,r)}}function d0(o,n){return function(r){o.uniformMatrix2x3fv(n,!1,r)}}function h0(o,n){return function(r){o.uniformMatrix3x2fv(n,!1,r)}}function f0(o,n){return function(r){o.uniformMatrix2x4fv(n,!1,r)}}function m0(o,n){return function(r){o.uniformMatrix4x2fv(n,!1,r)}}function p0(o,n){return function(r){o.uniformMatrix3x4fv(n,!1,r)}}function b0(o,n){return function(r){o.uniformMatrix4x3fv(n,!1,r)}}function On(o,n,r,m){const Z=Ml(o,n);return zr(o)?function(I){let F,L;Vo(o,I)?(F=I,L=null):(F=I.texture,L=I.sampler),o.uniform1i(m,r),o.activeTexture(Ni+r),o.bindTexture(Z,F),o.bindSampler(r,L)}:function(I){o.uniform1i(m,r),o.activeTexture(Ni+r),o.bindTexture(Z,I)}}function _n(o,n,r,m,Z){const I=Ml(o,n),F=new Int32Array(Z);for(let L=0;L<Z;++L)F[L]=r+L;return zr(o)?function(L){o.uniform1iv(m,F),L.forEach(function(E,rt){o.activeTexture(Ni+F[rt]);let O,lt;Vo(o,E)?(O=E,lt=null):(O=E.texture,lt=E.sampler),o.bindSampler(r,lt),o.bindTexture(I,O)})}:function(L){o.uniform1iv(m,F),L.forEach(function(E,rt){o.activeTexture(Ni+F[rt]),o.bindTexture(I,E)})}}be[Ei]={Type:Float32Array,size:4,setter:$a,arraySetter:qa},be[xl]={Type:Float32Array,size:8,setter:t0,cols:2},be[Il]={Type:Float32Array,size:12,setter:e0,cols:3},be[Sl]={Type:Float32Array,size:16,setter:n0,cols:4},be[Eo]={Type:Int32Array,size:4,setter:Bl,arraySetter:Al},be[Ll]={Type:Int32Array,size:8,setter:jl,cols:2},be[Yl]={Type:Int32Array,size:12,setter:zl,cols:3},be[Tl]={Type:Int32Array,size:16,setter:Pl,cols:4},be[Uo]={Type:Uint32Array,size:4,setter:r0,arraySetter:i0},be[El]={Type:Uint32Array,size:8,setter:o0,cols:2},be[Ul]={Type:Uint32Array,size:12,setter:s0,cols:3},be[Kl]={Type:Uint32Array,size:16,setter:l0,cols:4},be[wl]={Type:Uint32Array,size:4,setter:Bl,arraySetter:Al},be[Fl]={Type:Uint32Array,size:8,setter:jl,cols:2},be[Hl]={Type:Uint32Array,size:12,setter:zl,cols:3},be[Cl]={Type:Uint32Array,size:16,setter:Pl,cols:4},be[Jl]={Type:Float32Array,size:32,setter:u0,rows:2,cols:2},be[Nl]={Type:Float32Array,size:48,setter:c0,rows:3,cols:3},be[kl]={Type:Float32Array,size:64,setter:a0,rows:4,cols:4},be[Ca]={Type:Float32Array,size:32,setter:d0,rows:2,cols:3},be[Ja]={Type:Float32Array,size:32,setter:f0,rows:2,cols:4},be[Na]={Type:Float32Array,size:48,setter:h0,rows:3,cols:2},be[ka]={Type:Float32Array,size:48,setter:p0,rows:3,cols:4},be[Ea]={Type:Float32Array,size:64,setter:m0,rows:4,cols:2},be[Ua]={Type:Float32Array,size:64,setter:b0,rows:4,cols:3},be[Ta]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Ui},be[wa]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Ki},be[Fa]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Ko},be[Ha]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Ui},be[Ka]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Mi},be[Ma]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Mi},be[Ba]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Ki},be[Aa]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Ui},be[ja]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Ko},be[za]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Ki},be[Pa]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Mi},be[Oa]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Ui},be[_a]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Ko},be[Qa]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Ki},be[Da]={Type:null,size:0,setter:On,arraySetter:_n,bindPoint:Mi};function Bi(o,n){return function(r){if(r.value)switch(o.disableVertexAttribArray(n),r.value.length){case 4:o.vertexAttrib4fv(n,r.value);break;case 3:o.vertexAttrib3fv(n,r.value);break;case 2:o.vertexAttrib2fv(n,r.value);break;case 1:o.vertexAttrib1fv(n,r.value);break;default:throw new Error("the length of a float constant value must be between 1 and 4!")}else o.bindBuffer(ki,r.buffer),o.enableVertexAttribArray(n),o.vertexAttribPointer(n,r.numComponents||r.size,r.type||Ei,r.normalize||!1,r.stride||0,r.offset||0),o.vertexAttribDivisor&&o.vertexAttribDivisor(n,r.divisor||0)}}function pr(o,n){return function(r){if(r.value)if(o.disableVertexAttribArray(n),r.value.length===4)o.vertexAttrib4iv(n,r.value);else throw new Error("The length of an integer constant value must be 4!");else o.bindBuffer(ki,r.buffer),o.enableVertexAttribArray(n),o.vertexAttribIPointer(n,r.numComponents||r.size,r.type||Eo,r.stride||0,r.offset||0),o.vertexAttribDivisor&&o.vertexAttribDivisor(n,r.divisor||0)}}function Ai(o,n){return function(r){if(r.value)if(o.disableVertexAttribArray(n),r.value.length===4)o.vertexAttrib4uiv(n,r.value);else throw new Error("The length of an unsigned integer constant value must be 4!");else o.bindBuffer(ki,r.buffer),o.enableVertexAttribArray(n),o.vertexAttribIPointer(n,r.numComponents||r.size,r.type||Uo,r.stride||0,r.offset||0),o.vertexAttribDivisor&&o.vertexAttribDivisor(n,r.divisor||0)}}function Mo(o,n,r){const m=r.size,Z=r.count;return function(I){o.bindBuffer(ki,I.buffer);const F=I.size||I.numComponents||m,L=F/Z,E=I.type||Ei,O=be[E].size*F,lt=I.normalize||!1,Rt=I.offset||0,Wt=O/Z;for(let dt=0;dt<Z;++dt)o.enableVertexAttribArray(n+dt),o.vertexAttribPointer(n+dt,L,E,lt,O,Rt+Wt*dt),o.vertexAttribDivisor&&o.vertexAttribDivisor(n+dt,I.divisor||0)}}const wn={};wn[Ei]={size:4,setter:Bi},wn[xl]={size:8,setter:Bi},wn[Il]={size:12,setter:Bi},wn[Sl]={size:16,setter:Bi},wn[Eo]={size:4,setter:pr},wn[Ll]={size:8,setter:pr},wn[Yl]={size:12,setter:pr},wn[Tl]={size:16,setter:pr},wn[Uo]={size:4,setter:Ai},wn[El]={size:8,setter:Ai},wn[Ul]={size:12,setter:Ai},wn[Kl]={size:16,setter:Ai},wn[wl]={size:4,setter:pr},wn[Fl]={size:8,setter:pr},wn[Hl]={size:12,setter:pr},wn[Cl]={size:16,setter:pr},wn[Jl]={size:4,setter:Mo,count:2},wn[Nl]={size:9,setter:Mo,count:3},wn[kl]={size:16,setter:Mo,count:4};const y0=/ERROR:\s*\d+:(\d+)/gi;function g0(o,n="",r=0){const m=[...n.matchAll(y0)],Z=new Map(m.map((I,F)=>{const L=parseInt(I[1]),E=m[F+1],rt=E?E.index:n.length,O=n.substring(I.index,rt);return[L-1,O]}));return o.split(`
126
126
  `).map((I,F)=>{const L=Z.get(F);return`${F+1+r}: ${I}${L?`
127
127
 
128
128
  ^^^ ${L}`:""}`}).join(`
129
- `)}const Ol=/^[ \t]*\n/;function _l(o){let n=0;return Ol.test(o)&&(n=1,o=o.replace(Ol,"")),{lineOffset:n,shaderSource:o}}function g0(o,n){return o.errorCallback(n),o.callback&&setTimeout(()=>{o.callback(`${n}
129
+ `)}const Ol=/^[ \t]*\n/;function _l(o){let n=0;return Ol.test(o)&&(n=1,o=o.replace(Ol,"")),{lineOffset:n,shaderSource:o}}function Z0(o,n){return o.errorCallback(n),o.callback&&setTimeout(()=>{o.callback(`${n}
130
130
  ${o.errors.join(`
131
- `)}`)}),null}function Z0(o,n,r,m){if(m=m||ko,!o.getShaderParameter(r,ga)){const I=o.getShaderInfoLog(r),{lineOffset:F,shaderSource:L}=_l(o.getShaderSource(r)),E=`${y0(L,I,F)}
132
- Error compiling ${rl(o,n)}: ${I}`;return m(E),E}return""}function Bo(o,n,r){let m,Z,I;if(typeof n=="function"&&(r=n,n=void 0),typeof o=="function")r=o,o=void 0;else if(o&&!Array.isArray(o)){const rt=o;r=rt.errorCallback,o=rt.attribLocations,m=rt.transformFeedbackVaryings,Z=rt.transformFeedbackMode,I=rt.callback}const F=r||ko,L=[],E={errorCallback(rt,...O){L.push(rt),F(rt,...O)},transformFeedbackVaryings:m,transformFeedbackMode:Z,callback:I,errors:L};{let rt={};Array.isArray(o)?o.forEach(function(O,lt){rt[O]=n?n[lt]:lt}):rt=o||{},E.attribLocations=rt}return E}const v0=["VERTEX_SHADER","FRAGMENT_SHADER"];function G0(o,n){if(n.indexOf("frag")>=0)return va;if(n.indexOf("vert")>=0)return Ga}function X0(o,n,r){const m=o.getAttachedShaders(n);for(const Z of m)r.has(Z)&&o.deleteShader(Z);o.deleteProgram(n)}const W0=(o=0)=>new Promise(n=>setTimeout(n,o));function V0(o,n,r){const m=o.createProgram(),{attribLocations:Z,transformFeedbackVaryings:I,transformFeedbackMode:F}=Bo(r);for(let L=0;L<n.length;++L){let E=n[L];if(typeof E=="string"){const rt=Vl(E),O=rt?rt.text:E;let lt=o[v0[L]];rt&&rt.type&&(lt=G0(o,rt.type)||lt),E=o.createShader(lt),o.shaderSource(E,_l(O).shaderSource),o.compileShader(E),o.attachShader(m,E)}}Object.entries(Z).forEach(([L,E])=>o.bindAttribLocation(m,E,L));{let L=I;L&&(L.attribs&&(L=L.attribs),Array.isArray(L)||(L=Object.keys(L)),o.transformFeedbackVaryings(m,L,F||Xa))}return o.linkProgram(m),m}function R0(o,n,r,m,Z){const I=Bo(r,m,Z),F=new Set(n),L=V0(o,n,I);function E(rt,O){const lt=I0(rt,O,I.errorCallback);return lt&&X0(rt,O,F),lt}if(I.callback){x0(o,L).then(()=>{const rt=E(o,L);I.callback(rt,rt?void 0:L)});return}return E(o,L)?void 0:L}async function x0(o,n){const r=o.getExtension("KHR_parallel_shader_compile"),m=r?(I,F)=>I.getProgramParameter(F,r.COMPLETION_STATUS_KHR):()=>!0;let Z=0;do await W0(Z),Z=1e3/60;while(!m(o,n))}function I0(o,n,r){if(r=r||ko,!o.getProgramParameter(n,Za)){const Z=o.getProgramInfoLog(n);r(`Error in program linking: ${Z}`);const F=o.getAttachedShaders(n).map(L=>Z0(o,o.getShaderParameter(L,o.SHADER_TYPE),L,r));return`${Z}
131
+ `)}`)}),null}function v0(o,n,r,m){if(m=m||ko,!o.getShaderParameter(r,Za)){const I=o.getShaderInfoLog(r),{lineOffset:F,shaderSource:L}=_l(o.getShaderSource(r)),E=`${g0(L,I,F)}
132
+ Error compiling ${rl(o,n)}: ${I}`;return m(E),E}return""}function Bo(o,n,r){let m,Z,I;if(typeof n=="function"&&(r=n,n=void 0),typeof o=="function")r=o,o=void 0;else if(o&&!Array.isArray(o)){const rt=o;r=rt.errorCallback,o=rt.attribLocations,m=rt.transformFeedbackVaryings,Z=rt.transformFeedbackMode,I=rt.callback}const F=r||ko,L=[],E={errorCallback(rt,...O){L.push(rt),F(rt,...O)},transformFeedbackVaryings:m,transformFeedbackMode:Z,callback:I,errors:L};{let rt={};Array.isArray(o)?o.forEach(function(O,lt){rt[O]=n?n[lt]:lt}):rt=o||{},E.attribLocations=rt}return E}const G0=["VERTEX_SHADER","FRAGMENT_SHADER"];function X0(o,n){if(n.indexOf("frag")>=0)return Ga;if(n.indexOf("vert")>=0)return Xa}function W0(o,n,r){const m=o.getAttachedShaders(n);for(const Z of m)r.has(Z)&&o.deleteShader(Z);o.deleteProgram(n)}const V0=(o=0)=>new Promise(n=>setTimeout(n,o));function R0(o,n,r){const m=o.createProgram(),{attribLocations:Z,transformFeedbackVaryings:I,transformFeedbackMode:F}=Bo(r);for(let L=0;L<n.length;++L){let E=n[L];if(typeof E=="string"){const rt=Vl(E),O=rt?rt.text:E;let lt=o[G0[L]];rt&&rt.type&&(lt=X0(o,rt.type)||lt),E=o.createShader(lt),o.shaderSource(E,_l(O).shaderSource),o.compileShader(E),o.attachShader(m,E)}}Object.entries(Z).forEach(([L,E])=>o.bindAttribLocation(m,E,L));{let L=I;L&&(L.attribs&&(L=L.attribs),Array.isArray(L)||(L=Object.keys(L)),o.transformFeedbackVaryings(m,L,F||Wa))}return o.linkProgram(m),m}function x0(o,n,r,m,Z){const I=Bo(r,m,Z),F=new Set(n),L=R0(o,n,I);function E(rt,O){const lt=S0(rt,O,I.errorCallback);return lt&&W0(rt,O,F),lt}if(I.callback){I0(o,L).then(()=>{const rt=E(o,L);I.callback(rt,rt?void 0:L)});return}return E(o,L)?void 0:L}async function I0(o,n){const r=o.getExtension("KHR_parallel_shader_compile"),m=r?(I,F)=>I.getProgramParameter(F,r.COMPLETION_STATUS_KHR):()=>!0;let Z=0;do await V0(Z),Z=1e3/60;while(!m(o,n))}function S0(o,n,r){if(r=r||ko,!o.getProgramParameter(n,va)){const Z=o.getProgramInfoLog(n);r(`Error in program linking: ${Z}`);const F=o.getAttachedShaders(n).map(L=>v0(o,o.getShaderParameter(L,o.SHADER_TYPE),L,r));return`${Z}
133
133
  ${F.filter(L=>L).join(`
134
- `)}`}}function S0(o,n,r,m,Z){return R0(o,n,r,m,Z)}function Ql(o){const n=o.name;return n.startsWith("gl_")||n.startsWith("webgl_")}const L0=/(\.|\[|]|\w+)/g,Y0=o=>o>="0"&&o<="9";function T0(o,n,r,m){const Z=o.split(L0).filter(L=>L!=="");let I=0,F="";for(;;){const L=Z[I++];F+=L;const E=Y0(L[0]),rt=E?parseInt(L):L;if(E&&(F+=Z[I++]),I===Z.length){r[rt]=n;break}else{const lt=Z[I++],Rt=lt==="[",Wt=r[rt]||(Rt?[]:{});r[rt]=Wt,r=Wt,m[F]=m[F]||function(dt){return function(ht){Dl(dt,ht)}}(Wt),F+=lt}}}function w0(o,n){let r=0;function m(L,E,rt){const O=E.name.endsWith("[0]"),lt=E.type,Rt=be[lt];if(!Rt)throw new Error(`unknown type: 0x${lt.toString(16)}`);let Wt;if(Rt.bindPoint){const dt=r;r+=E.size,O?Wt=Rt.arraySetter(o,lt,dt,rt,E.size):Wt=Rt.setter(o,lt,dt,rt,E.size)}else Rt.arraySetter&&O?Wt=Rt.arraySetter(o,rt):Wt=Rt.setter(o,rt);return Wt.location=rt,Wt}const Z={},I={},F=o.getProgramParameter(n,Rl);for(let L=0;L<F;++L){const E=o.getActiveUniform(n,L);if(Ql(E))continue;let rt=E.name;rt.endsWith("[0]")&&(rt=rt.substr(0,rt.length-3));const O=o.getUniformLocation(n,E.name);if(O){const lt=m(n,E,O);Z[rt]=lt,T0(rt,lt,I,Z)}}return Z}function F0(o,n){const r={},m=o.getProgramParameter(n,Va);for(let Z=0;Z<m;++Z){const I=o.getTransformFeedbackVarying(n,Z);r[I.name]={index:Z,type:I.type,size:I.size}}return r}function H0(o,n){const r=o.getProgramParameter(n,Rl),m=[],Z=[];for(let L=0;L<r;++L){Z.push(L),m.push({});const E=o.getActiveUniform(n,L);m[L].name=E.name}[["UNIFORM_TYPE","type"],["UNIFORM_SIZE","size"],["UNIFORM_BLOCK_INDEX","blockNdx"],["UNIFORM_OFFSET","offset"]].forEach(function(L){const E=L[0],rt=L[1];o.getActiveUniforms(n,Z,o[E]).forEach(function(O,lt){m[lt][rt]=O})});const I={},F=o.getProgramParameter(n,Ra);for(let L=0;L<F;++L){const E=o.getActiveUniformBlockName(n,L),rt={index:o.getUniformBlockIndex(n,E),usedByVertexShader:o.getActiveUniformBlockParameter(n,L,xa),usedByFragmentShader:o.getActiveUniformBlockParameter(n,L,Ia),size:o.getActiveUniformBlockParameter(n,L,Sa),uniformIndices:o.getActiveUniformBlockParameter(n,L,La)};rt.used=rt.usedByVertexShader||rt.usedByFragmentShader,I[E]=rt}return{blockSpecs:I,uniformData:m}}function Dl(o,n){for(const r in n){const m=o[r];typeof m=="function"?m(n[r]):Dl(o[r],n[r])}}function $l(o,...n){const r=o.uniformSetters||o,m=n.length;for(let Z=0;Z<m;++Z){const I=n[Z];if(Array.isArray(I)){const F=I.length;for(let L=0;L<F;++L)$l(r,I[L])}else for(const F in I){const L=r[F];L&&L(I[F])}}}function C0(o,n){const r={},m=o.getProgramParameter(n,Wa);for(let Z=0;Z<m;++Z){const I=o.getActiveAttrib(n,Z);if(Ql(I))continue;const F=o.getAttribLocation(n,I.name),L=wn[I.type],E=L.setter(o,F,L);E.location=F,r[I.name]=E}return r}function J0(o,n){for(const r in n){const m=o[r];m&&m(n[r])}}function N0(o,n,r){r.vertexArrayObject?o.bindVertexArray(r.vertexArrayObject):(J0(n.attribSetters||n,r.attribs),r.indices&&o.bindBuffer(ya,r.indices))}function ql(o,n){const r=w0(o,n),m=C0(o,n),Z={program:n,uniformSetters:r,attribSetters:m};return zr(o)&&(Z.uniformBlockSpec=H0(o,n),Z.transformFeedbackInfo=F0(o,n)),Z}const k0=/\s|{|}|;/;function E0(o,n,r,m,Z){const I=Bo(r,m,Z),F=[];if(n=n.map(function(rt){if(!k0.test(rt)){const O=Vl(rt);if(O)rt=O.text;else{const lt=`no element with id: ${rt}`;I.errorCallback(lt),F.push(lt)}}return rt}),F.length)return g0(I,"");const L=I.callback;L&&(I.callback=(rt,O)=>{L(rt,rt?void 0:ql(o,O))});const E=S0(o,n,I);return E?ql(o,E):null}const U0=4,tu=5123;function K0(o,n,r,m,Z,I){r=r===void 0?U0:r;const F=n.indices,L=n.elementType,E=m===void 0?n.numElements:m;Z=Z===void 0?0:Z,L||F?I!==void 0?o.drawElementsInstanced(r,E,L===void 0?tu:n.elementType,Z,I):o.drawElements(r,E,L===void 0?tu:n.elementType,Z):I!==void 0?o.drawArraysInstanced(r,Z,E,I):o.drawArrays(r,Z,E)}const eu=36160,ji=36161,M0=3553,B0=5121,A0=6402,j0=6408,z0=33190,P0=36012,O0=35056,_0=36013,Q0=32854,D0=32855,$0=36194,nu=33189,ru=6401,iu=36168,Ao=34041,jo=36064,zi=36096,ou=36128,zo=33306,Po=33071,Oo=9729,q0=[{format:j0,type:B0,min:Oo,wrap:Po},{format:Ao}],ir={};ir[Ao]=zo,ir[ru]=ou,ir[iu]=ou,ir[A0]=zi,ir[nu]=zi,ir[z0]=zi,ir[P0]=zi,ir[O0]=zo,ir[_0]=zo;function t3(o,n){return ir[o]||ir[n]}const br={};br[Q0]=!0,br[D0]=!0,br[$0]=!0,br[Ao]=!0,br[nu]=!0,br[ru]=!0,br[iu]=!0;function e3(o){return br[o]}const n3=32;function r3(o){return o>=jo&&o<jo+n3}function Pi(o,n,r,m){const Z=eu,I=o.createFramebuffer();o.bindFramebuffer(Z,I),r=r||o.drawingBufferWidth,m=m||o.drawingBufferHeight,n=n||q0;const F=[],L={framebuffer:I,attachments:[],width:r,height:m};return n.forEach(function(E,rt){let O=E.attachment;const lt=E.samples,Rt=E.format;let Wt=E.attachmentPoint||t3(Rt,E.internalFormat);if(Wt||(Wt=jo+rt),r3(Wt)&&F.push(Wt),!O)if(lt!==void 0||e3(Rt))O=o.createRenderbuffer(),o.bindRenderbuffer(ji,O),lt>1?o.renderbufferStorageMultisample(ji,lt,Rt,r,m):o.renderbufferStorage(ji,Rt,r,m);else{const dt=Object.assign({},E);dt.width=r,dt.height=m,dt.auto===void 0&&(dt.auto=!1,dt.min=dt.min||dt.minMag||Oo,dt.mag=dt.mag||dt.minMag||Oo,dt.wrapS=dt.wrapS||dt.wrap||Po,dt.wrapT=dt.wrapT||dt.wrap||Po),O=Wl(o,dt)}if(mc(o,O))o.framebufferRenderbuffer(Z,Wt,ji,O);else if(Vo(o,O))E.layer!==void 0?o.framebufferTextureLayer(Z,Wt,O,E.level||0,E.layer):o.framebufferTexture2D(Z,Wt,E.target||M0,O,E.level||0);else throw new Error("unknown attachment type");L.attachments.push(O)}),o.drawBuffers&&o.drawBuffers(F),L}function i3(o,n,r){r=r||eu,n?(o.bindFramebuffer(r,n.framebuffer),o.viewport(0,0,n.width,n.height)):(o.bindFramebuffer(r,null),o.viewport(0,0,o.drawingBufferWidth,o.drawingBufferHeight))}function mn(o,n){return n instanceof WebGLTexture?n:Wl(o,{src:n,wrap:o.CLAMP_TO_EDGE})}class xr{constructor(n){Ht(this,"context");Ht(this,"output");Ht(this,"fbi");Ht(this,"options");Ht(this,"programInfo");Ht(this,"bufferInfo");Ht(this,"lastRun");const{context:r,width:m,height:Z}=n;this.context=r,this.options=n;const I=this.buildDefines();this.programInfo=E0(this.context,[I+this.getVertexShader(),I+this.getFragmentShader()]),this.bufferInfo=kc(this.context,this.getBuffers()),this.fbi=Pi(this.context,[{format:this.context.RGBA,type:this.context.UNSIGNED_BYTE,min:this.context.LINEAR,wrap:this.context.CLAMP_TO_EDGE}],m,Z),this.output=this.fbi.attachments[0]}resizeOutput(n,r){this.fbi=Pi(this.context,[{format:this.context.RGBA,type:this.context.UNSIGNED_BYTE,min:this.context.LINEAR,wrap:this.context.CLAMP_TO_EDGE}],n,r),this.options.width=n,this.options.height=r,this.output=this.fbi.attachments[0]}getDefines(){return{}}getBuffers(){return{position:{numComponents:2,data:[-1,-1,-1,1,1,-1,1,1,-1,1,1,-1]},texture_coord:{numComponents:2,data:[0,0,0,1,1,0,1,1,0,1,1,0]}}}buildDefines(){let n="";const r=this.getDefines();for(let m in r)n+=`#define ${m} ${r[m].toFixed(1)}
135
- `;return n}run(n){const r=Date.now();let m=0;this.lastRun&&(m=(r-this.lastRun)/1e3),this.lastRun=r,this.context.viewport(0,0,this.context.canvas.width,this.context.canvas.height),this.context.useProgram(this.programInfo.program),N0(this.context,this.programInfo,this.bufferInfo),$l(this.programInfo,{delta:m,canvas:[this.context.canvas.width,this.context.canvas.height],...n}),i3(this.context,this.options.disableFramebuffer?null:this.fbi),K0(this.context,this.bufferInfo)}}const o3=`precision mediump float;
134
+ `)}`}}function L0(o,n,r,m,Z){return x0(o,n,r,m,Z)}function Ql(o){const n=o.name;return n.startsWith("gl_")||n.startsWith("webgl_")}const Y0=/(\.|\[|]|\w+)/g,T0=o=>o>="0"&&o<="9";function w0(o,n,r,m){const Z=o.split(Y0).filter(L=>L!=="");let I=0,F="";for(;;){const L=Z[I++];F+=L;const E=T0(L[0]),rt=E?parseInt(L):L;if(E&&(F+=Z[I++]),I===Z.length){r[rt]=n;break}else{const lt=Z[I++],Rt=lt==="[",Wt=r[rt]||(Rt?[]:{});r[rt]=Wt,r=Wt,m[F]=m[F]||function(dt){return function(ht){Dl(dt,ht)}}(Wt),F+=lt}}}function F0(o,n){let r=0;function m(L,E,rt){const O=E.name.endsWith("[0]"),lt=E.type,Rt=be[lt];if(!Rt)throw new Error(`unknown type: 0x${lt.toString(16)}`);let Wt;if(Rt.bindPoint){const dt=r;r+=E.size,O?Wt=Rt.arraySetter(o,lt,dt,rt,E.size):Wt=Rt.setter(o,lt,dt,rt,E.size)}else Rt.arraySetter&&O?Wt=Rt.arraySetter(o,rt):Wt=Rt.setter(o,rt);return Wt.location=rt,Wt}const Z={},I={},F=o.getProgramParameter(n,Rl);for(let L=0;L<F;++L){const E=o.getActiveUniform(n,L);if(Ql(E))continue;let rt=E.name;rt.endsWith("[0]")&&(rt=rt.substr(0,rt.length-3));const O=o.getUniformLocation(n,E.name);if(O){const lt=m(n,E,O);Z[rt]=lt,w0(rt,lt,I,Z)}}return Z}function H0(o,n){const r={},m=o.getProgramParameter(n,Ra);for(let Z=0;Z<m;++Z){const I=o.getTransformFeedbackVarying(n,Z);r[I.name]={index:Z,type:I.type,size:I.size}}return r}function C0(o,n){const r=o.getProgramParameter(n,Rl),m=[],Z=[];for(let L=0;L<r;++L){Z.push(L),m.push({});const E=o.getActiveUniform(n,L);m[L].name=E.name}[["UNIFORM_TYPE","type"],["UNIFORM_SIZE","size"],["UNIFORM_BLOCK_INDEX","blockNdx"],["UNIFORM_OFFSET","offset"]].forEach(function(L){const E=L[0],rt=L[1];o.getActiveUniforms(n,Z,o[E]).forEach(function(O,lt){m[lt][rt]=O})});const I={},F=o.getProgramParameter(n,xa);for(let L=0;L<F;++L){const E=o.getActiveUniformBlockName(n,L),rt={index:o.getUniformBlockIndex(n,E),usedByVertexShader:o.getActiveUniformBlockParameter(n,L,Ia),usedByFragmentShader:o.getActiveUniformBlockParameter(n,L,Sa),size:o.getActiveUniformBlockParameter(n,L,La),uniformIndices:o.getActiveUniformBlockParameter(n,L,Ya)};rt.used=rt.usedByVertexShader||rt.usedByFragmentShader,I[E]=rt}return{blockSpecs:I,uniformData:m}}function Dl(o,n){for(const r in n){const m=o[r];typeof m=="function"?m(n[r]):Dl(o[r],n[r])}}function $l(o,...n){const r=o.uniformSetters||o,m=n.length;for(let Z=0;Z<m;++Z){const I=n[Z];if(Array.isArray(I)){const F=I.length;for(let L=0;L<F;++L)$l(r,I[L])}else for(const F in I){const L=r[F];L&&L(I[F])}}}function J0(o,n){const r={},m=o.getProgramParameter(n,Va);for(let Z=0;Z<m;++Z){const I=o.getActiveAttrib(n,Z);if(Ql(I))continue;const F=o.getAttribLocation(n,I.name),L=wn[I.type],E=L.setter(o,F,L);E.location=F,r[I.name]=E}return r}function N0(o,n){for(const r in n){const m=o[r];m&&m(n[r])}}function k0(o,n,r){r.vertexArrayObject?o.bindVertexArray(r.vertexArrayObject):(N0(n.attribSetters||n,r.attribs),r.indices&&o.bindBuffer(ga,r.indices))}function ql(o,n){const r=F0(o,n),m=J0(o,n),Z={program:n,uniformSetters:r,attribSetters:m};return zr(o)&&(Z.uniformBlockSpec=C0(o,n),Z.transformFeedbackInfo=H0(o,n)),Z}const E0=/\s|{|}|;/;function U0(o,n,r,m,Z){const I=Bo(r,m,Z),F=[];if(n=n.map(function(rt){if(!E0.test(rt)){const O=Vl(rt);if(O)rt=O.text;else{const lt=`no element with id: ${rt}`;I.errorCallback(lt),F.push(lt)}}return rt}),F.length)return Z0(I,"");const L=I.callback;L&&(I.callback=(rt,O)=>{L(rt,rt?void 0:ql(o,O))});const E=L0(o,n,I);return E?ql(o,E):null}const K0=4,tu=5123;function M0(o,n,r,m,Z,I){r=r===void 0?K0:r;const F=n.indices,L=n.elementType,E=m===void 0?n.numElements:m;Z=Z===void 0?0:Z,L||F?I!==void 0?o.drawElementsInstanced(r,E,L===void 0?tu:n.elementType,Z,I):o.drawElements(r,E,L===void 0?tu:n.elementType,Z):I!==void 0?o.drawArraysInstanced(r,Z,E,I):o.drawArrays(r,Z,E)}const eu=36160,ji=36161,B0=3553,A0=5121,j0=6402,z0=6408,P0=33190,O0=36012,_0=35056,Q0=36013,D0=32854,$0=32855,q0=36194,nu=33189,ru=6401,iu=36168,Ao=34041,jo=36064,zi=36096,ou=36128,zo=33306,Po=33071,Oo=9729,t3=[{format:z0,type:A0,min:Oo,wrap:Po},{format:Ao}],ir={};ir[Ao]=zo,ir[ru]=ou,ir[iu]=ou,ir[j0]=zi,ir[nu]=zi,ir[P0]=zi,ir[O0]=zi,ir[_0]=zo,ir[Q0]=zo;function e3(o,n){return ir[o]||ir[n]}const br={};br[D0]=!0,br[$0]=!0,br[q0]=!0,br[Ao]=!0,br[nu]=!0,br[ru]=!0,br[iu]=!0;function n3(o){return br[o]}const r3=32;function i3(o){return o>=jo&&o<jo+r3}function Pi(o,n,r,m){const Z=eu,I=o.createFramebuffer();o.bindFramebuffer(Z,I),r=r||o.drawingBufferWidth,m=m||o.drawingBufferHeight,n=n||t3;const F=[],L={framebuffer:I,attachments:[],width:r,height:m};return n.forEach(function(E,rt){let O=E.attachment;const lt=E.samples,Rt=E.format;let Wt=E.attachmentPoint||e3(Rt,E.internalFormat);if(Wt||(Wt=jo+rt),i3(Wt)&&F.push(Wt),!O)if(lt!==void 0||n3(Rt))O=o.createRenderbuffer(),o.bindRenderbuffer(ji,O),lt>1?o.renderbufferStorageMultisample(ji,lt,Rt,r,m):o.renderbufferStorage(ji,Rt,r,m);else{const dt=Object.assign({},E);dt.width=r,dt.height=m,dt.auto===void 0&&(dt.auto=!1,dt.min=dt.min||dt.minMag||Oo,dt.mag=dt.mag||dt.minMag||Oo,dt.wrapS=dt.wrapS||dt.wrap||Po,dt.wrapT=dt.wrapT||dt.wrap||Po),O=Wl(o,dt)}if(pc(o,O))o.framebufferRenderbuffer(Z,Wt,ji,O);else if(Vo(o,O))E.layer!==void 0?o.framebufferTextureLayer(Z,Wt,O,E.level||0,E.layer):o.framebufferTexture2D(Z,Wt,E.target||B0,O,E.level||0);else throw new Error("unknown attachment type");L.attachments.push(O)}),o.drawBuffers&&o.drawBuffers(F),L}function o3(o,n,r){r=r||eu,n?(o.bindFramebuffer(r,n.framebuffer),o.viewport(0,0,n.width,n.height)):(o.bindFramebuffer(r,null),o.viewport(0,0,o.drawingBufferWidth,o.drawingBufferHeight))}function mn(o,n){return n instanceof WebGLTexture?n:Wl(o,{src:n,wrap:o.CLAMP_TO_EDGE})}class xr{constructor(n){Ht(this,"context");Ht(this,"output");Ht(this,"fbi");Ht(this,"options");Ht(this,"programInfo");Ht(this,"bufferInfo");Ht(this,"lastRun");const{context:r,width:m,height:Z}=n;this.context=r,this.options=n;const I=this.buildDefines();this.programInfo=U0(this.context,[I+this.getVertexShader(),I+this.getFragmentShader()]),this.bufferInfo=Ec(this.context,this.getBuffers()),this.fbi=Pi(this.context,[{format:this.context.RGBA,type:this.context.UNSIGNED_BYTE,min:this.context.LINEAR,wrap:this.context.CLAMP_TO_EDGE}],m,Z),this.output=this.fbi.attachments[0]}resizeOutput(n,r){this.fbi=Pi(this.context,[{format:this.context.RGBA,type:this.context.UNSIGNED_BYTE,min:this.context.LINEAR,wrap:this.context.CLAMP_TO_EDGE}],n,r),this.options.width=n,this.options.height=r,this.output=this.fbi.attachments[0]}getDefines(){return{}}getBuffers(){return{position:{numComponents:2,data:[-1,-1,-1,1,1,-1,1,1,-1,1,1,-1]},texture_coord:{numComponents:2,data:[0,0,0,1,1,0,1,1,0,1,1,0]}}}buildDefines(){let n="";const r=this.getDefines();for(let m in r)n+=`#define ${m} ${r[m].toFixed(1)}
135
+ `;return n}run(n){const r=Date.now();let m=0;this.lastRun&&(m=(r-this.lastRun)/1e3),this.lastRun=r,this.context.viewport(0,0,this.context.canvas.width,this.context.canvas.height),this.context.useProgram(this.programInfo.program),k0(this.context,this.programInfo,this.bufferInfo),$l(this.programInfo,{delta:m,canvas:[this.context.canvas.width,this.context.canvas.height],...n}),o3(this.context,this.options.disableFramebuffer?null:this.fbi),M0(this.context,this.bufferInfo)}}const s3=`precision mediump float;
136
136
 
137
137
  varying vec2 _texture_coord;
138
138
 
@@ -143,7 +143,7 @@ uniform sampler2D mask;
143
143
  vec4 loop();
144
144
 
145
145
  void main() { gl_FragColor = loop(); }
146
- `,s3=`varying vec2 _texture_coord;
146
+ `,l3=`varying vec2 _texture_coord;
147
147
 
148
148
  attribute vec2 position;
149
149
  attribute vec2 texture_coord;
@@ -152,7 +152,7 @@ void main() {
152
152
  gl_Position = vec4(position, 0., 1.);
153
153
  _texture_coord = texture_coord;
154
154
  }
155
- `;class l3 extends xr{getDefines(){var n;return{RADIUS:(n=this.options.radius)!=null?n:1}}getFragmentShader(){return o3+this.createLoopFunction()}getVertexShader(){return s3}createLoopFunction(){var r;let n=(r=this.options.radius)!=null?r:1;return`
155
+ `;class u3 extends xr{getDefines(){var n;return{RADIUS:(n=this.options.radius)!=null?n:1}}getFragmentShader(){return s3+this.createLoopFunction()}getVertexShader(){return l3}createLoopFunction(){var r;let n=(r=this.options.radius)!=null?r:1;return`
156
156
 
157
157
  vec4 loop() {
158
158
  vec4 result = vec4(0,0,0,0);
@@ -174,7 +174,7 @@ void main() {
174
174
  diff.x = normalizedRadius.x;
175
175
  }
176
176
  return result / factorSum;
177
- }`}}const u3=`precision mediump float;
177
+ }`}}const c3=`precision mediump float;
178
178
 
179
179
  varying vec2 _texture_coord;
180
180
 
@@ -189,7 +189,7 @@ void main() {
189
189
  gl_FragColor = foregroundColor * tresholdColor.a +
190
190
  backgroundColor * (1. - tresholdColor.a);
191
191
  }
192
- `,c3=`varying vec2 _texture_coord;
192
+ `,a3=`varying vec2 _texture_coord;
193
193
 
194
194
  attribute vec2 position;
195
195
  attribute vec2 texture_coord;
@@ -199,7 +199,7 @@ void main() {
199
199
  _texture_coord = texture_coord;
200
200
  _texture_coord.y = 1. - texture_coord.y;
201
201
  }
202
- `;class _o extends xr{getFragmentShader(){return u3}getVertexShader(){return c3}}class Qo{constructor(){Ht(this,"steps",[])}addStep(n){this.steps.push(n)}async run(){for(const n of this.steps)n.program.run(n.getUniforms())}resizeOutput(n,r){for(const m of this.steps)m.program.resizeOutput(n,r)}}class Do extends Qo{constructor(){super(...arguments);Ht(this,"preciseMaskEnabled",!1)}}class a3 extends Do{constructor(r,m){super();Ht(this,"inputImage");Ht(this,"inputMask");this.context=r;const Z={context:r,height:r.canvas.height,width:r.canvas.width},I=new l3({...Z,radius:m}),F=new _o({...Z,disableFramebuffer:!0});this.addStep({program:I,getUniforms:()=>({texture:mn(r,this.inputImage),mask:mn(r,this.inputMask)})}),this.addStep({program:F,getUniforms:()=>({background:mn(r,I.output),foreground:mn(r,this.inputImage),threshold:mn(r,this.inputMask)})})}setData(r,m){this.inputImage=r,this.inputMask=m}}class su extends Do{constructor(r){super();Ht(this,"inputImage");Ht(this,"inputBackgroundImage");Ht(this,"inputMask");Ht(this,"preciseMaskEnabled",!0);this.context=r;const m={context:r,height:r.canvas.height,width:r.canvas.width},Z=new _o({...m,disableFramebuffer:!0});this.addStep({program:Z,getUniforms:()=>({background:mn(r,this.inputBackgroundImage),foreground:mn(r,this.inputImage),threshold:mn(r,this.inputMask)})})}setData(r,m){this.inputImage=r,this.inputMask=m}}class d3 extends su{constructor(){super(...arguments);Ht(this,"frameReader");Ht(this,"preciseMaskEnabled",!0)}set inputVideo(r){this.frameReader=r.getReader(),this.readNextVideoFrame()}async run(){this.frameReader&&(await super.run(),this.readNextVideoFrame())}async readNextVideoFrame(){var m;const r=await((m=this.frameReader)==null?void 0:m.read());r!=null&&r.value&&(this.inputBackgroundImage=await createImageBitmap(r.value),r.value.close())}}const h3=`precision mediump float;
202
+ `;class _o extends xr{getFragmentShader(){return c3}getVertexShader(){return a3}}class Qo{constructor(){Ht(this,"steps",[])}addStep(n){this.steps.push(n)}async run(){for(const n of this.steps)n.program.run(n.getUniforms())}resizeOutput(n,r){for(const m of this.steps)m.program.resizeOutput(n,r)}}class Do extends Qo{constructor(){super(...arguments);Ht(this,"preciseMaskEnabled",!1)}}class d3 extends Do{constructor(r,m){super();Ht(this,"inputImage");Ht(this,"inputMask");this.context=r;const Z={context:r,height:r.canvas.height,width:r.canvas.width},I=new u3({...Z,radius:m}),F=new _o({...Z,disableFramebuffer:!0});this.addStep({program:I,getUniforms:()=>({texture:mn(r,this.inputImage),mask:mn(r,this.inputMask)})}),this.addStep({program:F,getUniforms:()=>({background:mn(r,I.output),foreground:mn(r,this.inputImage),threshold:mn(r,this.inputMask)})})}setData(r,m){this.inputImage=r,this.inputMask=m}}class su extends Do{constructor(r){super();Ht(this,"inputImage");Ht(this,"inputBackgroundImage");Ht(this,"inputMask");Ht(this,"preciseMaskEnabled",!0);this.context=r;const m={context:r,height:r.canvas.height,width:r.canvas.width},Z=new _o({...m,disableFramebuffer:!0});this.addStep({program:Z,getUniforms:()=>({background:mn(r,this.inputBackgroundImage),foreground:mn(r,this.inputImage),threshold:mn(r,this.inputMask)})})}setData(r,m){this.inputImage=r,this.inputMask=m}}class h3 extends su{constructor(){super(...arguments);Ht(this,"frameReader");Ht(this,"preciseMaskEnabled",!0)}set inputVideo(r){this.frameReader=r.getReader(),this.readNextVideoFrame()}async run(){this.frameReader&&(await super.run(),this.readNextVideoFrame())}async readNextVideoFrame(){var m;const r=await((m=this.frameReader)==null?void 0:m.read());r!=null&&r.value&&(this.inputBackgroundImage=await createImageBitmap(r.value),r.value.close())}}const f3=`precision mediump float;
203
203
 
204
204
  varying vec2 _texture_coord;
205
205
 
@@ -209,7 +209,7 @@ uniform sampler2D texture;
209
209
  vec4 loop();
210
210
 
211
211
  void main() { gl_FragColor = loop(); }
212
- `,f3=`varying vec2 _texture_coord;
212
+ `,m3=`varying vec2 _texture_coord;
213
213
 
214
214
  attribute vec2 position;
215
215
  attribute vec2 texture_coord;
@@ -218,7 +218,7 @@ void main() {
218
218
  gl_Position = vec4(position, 0., 1.);
219
219
  _texture_coord = texture_coord;
220
220
  }
221
- `;var $o=(o=>(o[o.LINEAR=0]="LINEAR",o[o.GAUSSIAN=1]="GAUSSIAN",o))($o||{});class lu extends xr{getDefines(){var n;return{RADIUS:(n=this.options.radius)!=null?n:1}}getFragmentShader(){return h3+this.createLoopFunction()}getVertexShader(){return f3}createLoopFunction(){var r;let n=(r=this.options.radius)!=null?r:1;return`
221
+ `;var $o=(o=>(o[o.LINEAR=0]="LINEAR",o[o.GAUSSIAN=1]="GAUSSIAN",o))($o||{});class lu extends xr{getDefines(){var n;return{RADIUS:(n=this.options.radius)!=null?n:1}}getFragmentShader(){return f3+this.createLoopFunction()}getVertexShader(){return m3}createLoopFunction(){var r;let n=(r=this.options.radius)!=null?r:1;return`
222
222
 
223
223
  vec4 loop() {
224
224
  vec4 result = vec4(0,0,0,0);
@@ -239,7 +239,7 @@ void main() {
239
239
  diff.x = normalizedRadius.x;
240
240
  }
241
241
  return result / factorSum;
242
- }`}getFactor(n,r){switch(this.options.type){case 1:return this.getLinearFactor(n,r);case 0:default:return this.getLinearFactor(n,r)}}getLinearFactor(n,r){return 1}getGaussianFactor(n,r){var E;const m=Math.PI*2,Z=Math.max((E=this.options.radius)!=null?E:1,1),I=1/(m*Z**2),F=-(n**2+r**2),L=I*F;return I*Math.E**L}}class m3 extends Do{constructor(r,m){super();Ht(this,"inputImage");Ht(this,"inputMask");this.context=r;const Z={context:r,height:r.canvas.height,width:r.canvas.width},I=new lu({...Z,radius:m,type:$o.GAUSSIAN}),F=new _o({...Z,disableFramebuffer:!0});this.addStep({program:I,getUniforms:()=>({texture:mn(r,this.inputImage)})}),this.addStep({program:F,getUniforms:()=>({background:mn(r,this.inputImage),foreground:mn(r,I.output),threshold:mn(r,this.inputMask)})})}setData(r,m){this.inputImage=r,this.inputMask=m}}class qo extends xr{constructor(r){super(r);Ht(this,"fbi2");this.fbi2=Pi(r.context,[{format:r.context.RGBA,type:r.context.UNSIGNED_BYTE,min:r.context.LINEAR,mag:r.context.LINEAR,wrap:r.context.CLAMP_TO_EDGE}],r.width,r.height)}run(r){const m=this.fbi;this.fbi=this.fbi2,this.fbi2=m,this.output=this.fbi.attachments[0],super.run({...r,previous_rendering:this.fbi2.attachments[0]})}resizeOutput(r,m){super.resizeOutput(r,m),this.fbi2=Pi(this.context,[{format:this.context.RGBA,type:this.context.UNSIGNED_BYTE,min:this.context.LINEAR,wrap:this.context.CLAMP_TO_EDGE}],r,m)}}const p3=`precision mediump float;
242
+ }`}getFactor(n,r){switch(this.options.type){case 1:return this.getLinearFactor(n,r);case 0:default:return this.getLinearFactor(n,r)}}getLinearFactor(n,r){return 1}getGaussianFactor(n,r){var E;const m=Math.PI*2,Z=Math.max((E=this.options.radius)!=null?E:1,1),I=1/(m*Z**2),F=-(n**2+r**2),L=I*F;return I*Math.E**L}}class p3 extends Do{constructor(r,m){super();Ht(this,"inputImage");Ht(this,"inputMask");this.context=r;const Z={context:r,height:r.canvas.height,width:r.canvas.width},I=new lu({...Z,radius:m,type:$o.GAUSSIAN}),F=new _o({...Z,disableFramebuffer:!0});this.addStep({program:I,getUniforms:()=>({texture:mn(r,this.inputImage)})}),this.addStep({program:F,getUniforms:()=>({background:mn(r,this.inputImage),foreground:mn(r,I.output),threshold:mn(r,this.inputMask)})})}setData(r,m){this.inputImage=r,this.inputMask=m}}class qo extends xr{constructor(r){super(r);Ht(this,"fbi2");this.fbi2=Pi(r.context,[{format:r.context.RGBA,type:r.context.UNSIGNED_BYTE,min:r.context.LINEAR,mag:r.context.LINEAR,wrap:r.context.CLAMP_TO_EDGE}],r.width,r.height)}run(r){const m=this.fbi;this.fbi=this.fbi2,this.fbi2=m,this.output=this.fbi.attachments[0],super.run({...r,previous_rendering:this.fbi2.attachments[0]})}resizeOutput(r,m){super.resizeOutput(r,m),this.fbi2=Pi(this.context,[{format:this.context.RGBA,type:this.context.UNSIGNED_BYTE,min:this.context.LINEAR,wrap:this.context.CLAMP_TO_EDGE}],r,m)}}const b3=`precision mediump float;
243
243
 
244
244
  varying vec2 _texture_coord;
245
245
 
@@ -292,7 +292,7 @@ void main() {
292
292
  gl_FragColor *= (1. - threshold);
293
293
  }
294
294
  }
295
- `,b3=`varying vec2 _texture_coord;
295
+ `,y3=`varying vec2 _texture_coord;
296
296
 
297
297
  attribute vec2 position;
298
298
  attribute vec2 texture_coord;
@@ -301,7 +301,7 @@ void main() {
301
301
  gl_Position = vec4(position, 0., 1.);
302
302
  _texture_coord = texture_coord;
303
303
  }
304
- `;class y3 extends qo{getFragmentShader(){return p3}getVertexShader(){return b3}}const g3=`#version 300 es
304
+ `;class g3 extends qo{getFragmentShader(){return b3}getVertexShader(){return y3}}const Z3=`#version 300 es
305
305
  // https://github.com/Volcomix/virtual-background/blob/main/src/pipelines/webgl2/jointBilateralFilterStage.ts
306
306
 
307
307
  precision highp float;
@@ -347,14 +347,14 @@ void main() {
347
347
  }
348
348
  newVal /= totalWeight;
349
349
  outColor = vec4(vec3(0.), newVal);
350
- }`,Z3=`#version 300 es
350
+ }`,v3=`#version 300 es
351
351
  in vec2 position;
352
352
  in vec2 texture_coord;
353
353
  out vec2 _texture_coord;
354
354
  void main() {
355
355
  gl_Position = vec4(position, 0.0, 1.0);
356
356
  _texture_coord = texture_coord;
357
- }`;class v3 extends xr{getFragmentShader(){return g3}getVertexShader(){return Z3}}const G3=`precision mediump float;
357
+ }`;class G3 extends xr{getFragmentShader(){return Z3}getVertexShader(){return v3}}const X3=`precision mediump float;
358
358
 
359
359
  varying vec2 _texture_coord;
360
360
 
@@ -376,7 +376,7 @@ void main() {
376
376
  gl_FragColor = texture2D(texture, _texture_coord);
377
377
  }
378
378
  }
379
- `,X3=`varying vec2 _texture_coord;
379
+ `,W3=`varying vec2 _texture_coord;
380
380
 
381
381
  attribute vec2 position;
382
382
  attribute vec2 texture_coord;
@@ -385,7 +385,7 @@ void main() {
385
385
  gl_Position = vec4(position, 0., 1.);
386
386
  _texture_coord = texture_coord;
387
387
  }
388
- `;class W3 extends xr{getFragmentShader(){return G3}getVertexShader(){return X3}}const V3=`precision mediump float;
388
+ `;class V3 extends xr{getFragmentShader(){return X3}getVertexShader(){return W3}}const R3=`precision mediump float;
389
389
 
390
390
  varying vec2 _texture_coord;
391
391
 
@@ -404,7 +404,7 @@ void main() {
404
404
 
405
405
  gl_FragColor = color;
406
406
  }
407
- `,R3=`varying vec2 _texture_coord;
407
+ `,x3=`varying vec2 _texture_coord;
408
408
 
409
409
  attribute vec2 position;
410
410
  attribute vec2 texture_coord;
@@ -413,7 +413,7 @@ void main() {
413
413
  gl_Position = vec4(position, 0., 1.);
414
414
  _texture_coord = texture_coord;
415
415
  }
416
- `;class x3 extends qo{getFragmentShader(){return V3}getVertexShader(){return R3}}const I3=`precision mediump float;
416
+ `;class I3 extends qo{getFragmentShader(){return R3}getVertexShader(){return x3}}const S3=`precision mediump float;
417
417
 
418
418
  varying vec2 _texture_coord;
419
419
 
@@ -427,7 +427,7 @@ void main() {
427
427
  gl_FragColor = inputs_color;
428
428
  }
429
429
  }
430
- `,S3=`varying vec2 _texture_coord;
430
+ `,L3=`varying vec2 _texture_coord;
431
431
 
432
432
  attribute vec2 position;
433
433
  attribute vec2 texture_coord;
@@ -436,13 +436,13 @@ void main() {
436
436
  gl_Position = vec4(position, 0., 1.);
437
437
  _texture_coord = texture_coord;
438
438
  }
439
- `;class L3 extends qo{getFragmentShader(){return I3}getVertexShader(){return S3}}class Y3 extends Qo{constructor(r,m,Z){super();Ht(this,"inputImage");Ht(this,"inputMask");Ht(this,"previousInputImage");Ht(this,"previousInputMask");Ht(this,"output");Ht(this,"options",{currentThresholdMinimum:0,currentThresholdMaximum:1,previousThresholdMinimum:0,previousThresholdMaximum:1,thresholdMinimum:0,thresholdMaximum:1,thresholdFactor:1});this.context=r;const I={context:r,height:Z,width:m},F=new y3(I),L=new lu({...I,radius:1,type:$o.GAUSSIAN}),E=new L3(I),rt=new x3(I),O=new W3(I),lt=new v3({...I}),Rt=.66,Wt=640,dt=480,ht=256,Ft=144;let Tt=1;Tt*=Math.max(Wt/ht,dt/Ft);const At=Math.max(1,Math.sqrt(Tt)*Rt),_=1/Wt,Ee=1/dt;this.addStep({program:F,getUniforms:()=>({image_now:mn(r,this.inputImage),image_before:mn(r,this.previousInputImage),mask_now:mn(r,this.inputMask),mask_before:mn(r,this.previousInputMask),current_threshold_minimum:this.options.currentThresholdMinimum,current_threshold_maximum:this.options.currentThresholdMaximum,previous_threshold_minimum:this.options.previousThresholdMinimum,previous_threshold_maximum:this.options.previousThresholdMaximum,threshold_minimum:this.options.thresholdMinimum,threshold_maximum:this.options.thresholdMaximum,threshold_factor:this.options.thresholdFactor})}),this.addStep({program:E,getUniforms:()=>({inputs:mn(r,this.inputMask),threshold:mn(r,F.output)})}),this.addStep({program:O,getUniforms:()=>({texture:mn(r,E.output)})}),this.addStep({program:rt,getUniforms:()=>({texture:mn(r,O.output)})}),this.addStep({program:L,getUniforms:()=>({texture:mn(r,rt.output)})}),this.addStep({program:lt,getUniforms:()=>({input_frame:mn(r,this.inputImage),segmentation_mask:mn(r,this.inputMask),threshold:mn(r,L.output),texel_size:[_,Ee],step:At,radius:Tt,offset:At>1?At*.5:0,sigma_texel:Math.max(_,Ee)*Tt,sigma_color:.1})}),this.output=lt.output}setData(r,m){this.previousInputImage=this.inputImage?this.inputImage:r,this.previousInputMask=this.inputMask?this.inputMask:m,this.inputImage=r,this.inputMask=m}setOptions(r){this.options=r}}const T3=`precision mediump float;
439
+ `;class Y3 extends qo{getFragmentShader(){return S3}getVertexShader(){return L3}}class T3 extends Qo{constructor(r,m,Z){super();Ht(this,"inputImage");Ht(this,"inputMask");Ht(this,"previousInputImage");Ht(this,"previousInputMask");Ht(this,"output");Ht(this,"options",{currentThresholdMinimum:0,currentThresholdMaximum:1,previousThresholdMinimum:0,previousThresholdMaximum:1,thresholdMinimum:0,thresholdMaximum:1,thresholdFactor:1});this.context=r;const I={context:r,height:Z,width:m},F=new g3(I),L=new lu({...I,radius:1,type:$o.GAUSSIAN}),E=new Y3(I),rt=new I3(I),O=new V3(I),lt=new G3({...I}),Rt=.66,Wt=640,dt=480,ht=256,Ft=144;let Tt=1;Tt*=Math.max(Wt/ht,dt/Ft);const At=Math.max(1,Math.sqrt(Tt)*Rt),_=1/Wt,Ee=1/dt;this.addStep({program:F,getUniforms:()=>({image_now:mn(r,this.inputImage),image_before:mn(r,this.previousInputImage),mask_now:mn(r,this.inputMask),mask_before:mn(r,this.previousInputMask),current_threshold_minimum:this.options.currentThresholdMinimum,current_threshold_maximum:this.options.currentThresholdMaximum,previous_threshold_minimum:this.options.previousThresholdMinimum,previous_threshold_maximum:this.options.previousThresholdMaximum,threshold_minimum:this.options.thresholdMinimum,threshold_maximum:this.options.thresholdMaximum,threshold_factor:this.options.thresholdFactor})}),this.addStep({program:E,getUniforms:()=>({inputs:mn(r,this.inputMask),threshold:mn(r,F.output)})}),this.addStep({program:O,getUniforms:()=>({texture:mn(r,E.output)})}),this.addStep({program:rt,getUniforms:()=>({texture:mn(r,O.output)})}),this.addStep({program:L,getUniforms:()=>({texture:mn(r,rt.output)})}),this.addStep({program:lt,getUniforms:()=>({input_frame:mn(r,this.inputImage),segmentation_mask:mn(r,this.inputMask),threshold:mn(r,L.output),texel_size:[_,Ee],step:At,radius:Tt,offset:At>1?At*.5:0,sigma_texel:Math.max(_,Ee)*Tt,sigma_color:.1})}),this.output=lt.output}setData(r,m){this.previousInputImage=this.inputImage?this.inputImage:r,this.previousInputMask=this.inputMask?this.inputMask:m,this.inputImage=r,this.inputMask=m}setOptions(r){this.options=r}}const w3=`precision mediump float;
440
440
 
441
441
  varying vec2 _texture_coord;
442
442
  uniform sampler2D texture;
443
443
 
444
444
  void main() { gl_FragColor = texture2D(texture, _texture_coord); }
445
- `,w3=`varying vec2 _texture_coord;
445
+ `,F3=`varying vec2 _texture_coord;
446
446
 
447
447
  attribute vec2 position;
448
448
  attribute vec2 texture_coord;
@@ -455,4 +455,4 @@ void main() {
455
455
  _texture_coord.y = 1. - texture_coord.y;
456
456
  }
457
457
  }
458
- `;class F3 extends xr{getFragmentShader(){return T3}getVertexShader(){return w3}}class H3 extends Qo{constructor(r,m,Z){super();Ht(this,"inputImage");this.context=r;const I={context:r,height:Z,width:m};this.addStep({program:new F3({...I,disableFramebuffer:!0}),getUniforms:()=>({texture:mn(r,this.inputImage),invert_y:!0})})}setData(r){this.inputImage=r}}class C3{constructor(n){Ht(this,"resize");Ht(this,"canvas");Ht(this,"context");this.canvas=new OffscreenCanvas(0,0),this.context=this.canvas.getContext("webgl2"),this.canvas.width=n.width,this.canvas.height=n.height,this.resize=new H3(this.context,n.width,n.height)}resizeForeground(n,r){this.canvas.width=n,this.canvas.height=r,this.resize.resizeOutput(n,r)}async process(n){var r,m;return this.canvas.width=this.canvas.width,(r=this.resize)==null||r.setData(n),(m=this.resize)==null||m.run(),this.canvas}}class J3{constructor(n){Ht(this,"improveMaskSegmentation");Ht(this,"backgroundResizer");Ht(this,"backgroundImage");Ht(this,"backgroundVideo");Ht(this,"activePipeline");Ht(this,"canvas");Ht(this,"options");Ht(this,"context");Ht(this,"virtualBGImage");this.canvas=new OffscreenCanvas(0,0),this.context=this.canvas.getContext("webgl2"),this.canvas.width=n.foregroundWidth,this.canvas.height=n.foregroundHeight,this.improveMaskSegmentation=new Y3(this.context,n.maskWidth,n.maskHeight),this.backgroundImage=new su(this.context),this.backgroundVideo=new d3(this.context),this.backgroundResizer=new C3({width:n.foregroundWidth,height:n.foregroundHeight})}setBackgroundOptions(n){switch(n.transformerType){case"BackgroundBlur":this.activePipeline=new a3(this.context,this.getBlurSize(n.radius));break;case"SilhouetteBlur":this.activePipeline=new m3(this.context,this.getBlurSize(n.radius));break;case"VideoBackground":this.activePipeline=this.backgroundVideo;break;case"VirtualBackground":this.activePipeline=this.backgroundImage;break}this.options=n}setFlickeringOptions(n){var r;(r=this.improveMaskSegmentation)==null||r.setOptions(n)}setVideoBGReadable(n){this.backgroundVideo.inputVideo=n}async setVirtualBGImage(n){this.virtualBGImage=n,this.backgroundImage.inputBackgroundImage=await this.backgroundResizer.process(n)}async process(n,r){var m,Z,I,F,L;if(this.activePipeline&&n.width&&(r==null?void 0:r.width)){let E=r;(((m=this.options)==null?void 0:m.selfieSegmentationType)&&((Z=this.options)==null?void 0:Z.selfieSegmentationType)==="PRECISE"||!((I=this.options)!=null&&I.selfieSegmentationType)&&this.activePipeline.preciseMaskEnabled)&&(this.improveMaskSegmentation.setData(n,r),this.improveMaskSegmentation.run(),E=this.improveMaskSegmentation.output),(F=this.activePipeline)==null||F.setData(n,E),(L=this.activePipeline)==null||L.run()}}async resizeForeground(n,r){var m;this.canvas.width=n,this.canvas.height=r,this.backgroundImage.resizeOutput(n,r),this.backgroundVideo.resizeOutput(n,r),this.backgroundResizer.resizeForeground(n,r),(m=this.activePipeline)==null||m.resizeOutput(n,r),this.virtualBGImage&&(this.backgroundImage.inputBackgroundImage=await this.backgroundResizer.process(this.virtualBGImage))}getBlurSize(n=Mr.Low){switch(n){case Mr.Low:return 5;case Mr.High:return 12}return n}}class uu{constructor(){Ht(this,"selfieSegmentation",new Cs);Ht(this,"backgroundFilter");Ht(this,"previousDimensions",{width:0,height:0})}async init(n){await this.selfieSegmentation.init(n.wasmAssetUriPath,n.tfliteAssetUriPath);const{width:r,height:m}=this.selfieSegmentation.getOutputDimensions();this.backgroundFilter=new J3({foregroundWidth:1,foregroundHeight:1,maskWidth:r,maskHeight:m})}async transform(n,r){var I,F,L,E;const m=await createImageBitmap(n),Z=await this.selfieSegmentation.process(m);Z?((m.width!==this.previousDimensions.width||m.height!==this.previousDimensions.height)&&(this.previousDimensions.width=m.width,this.previousDimensions.height=m.height,await((I=this.backgroundFilter)==null?void 0:I.resizeForeground(m.width,m.height))),await((F=this.backgroundFilter)==null?void 0:F.process(m,Z)),n.close(),r.enqueue(new VideoFrame((L=this.backgroundFilter)==null?void 0:L.canvas,{timestamp:(E=n.timestamp)!=null?E:0,alpha:"discard"}))):r.enqueue(n)}async setBackgroundOptions(n){var r;await((r=this.backgroundFilter)==null?void 0:r.setBackgroundOptions(n))}async setVideoBGReadable(n){var r;await((r=this.backgroundFilter)==null?void 0:r.setVideoBGReadable(n))}async setVirtualBGImage(n){var r;await((r=this.backgroundFilter)==null?void 0:r.setVirtualBGImage(n))}setFlickeringOptions(n){var r;(r=this.backgroundFilter)==null||r.setFlickeringOptions(n)}}const es=class{constructor(){Ht(this,"backgroundTransformer",new uu);Ht(this,"mediaProcessor",new k2);Ht(this,"rate",30);Ht(this,"resolveOnMediaProcessor");Ht(this,"eventsQueue",[])}async init(n){await this.backgroundTransformer.init(n),await this.mediaProcessor.setTransformers([this.backgroundTransformer]),this.mediaProcessor.setTrackExpectedRate(this.rate),this.mediaProcessor.onAny((r,m)=>{this.resolveOnMediaProcessor?(this.resolveOnMediaProcessor({name:r,data:m}),this.resolveOnMediaProcessor=void 0):this.eventsQueue.push({name:r,data:m})})}async onMediaProcessorEvent(){return await new Promise(n=>{this.eventsQueue.length>0?n(this.eventsQueue.shift()):this.resolveOnMediaProcessor=n})}async setTrackExpectedRate(n){this.rate=n,this.mediaProcessor.setTrackExpectedRate(n)}async transform(n,r){this.mediaProcessor.transform(n,r)}async setBackgroundOptions(n){var r;await((r=this.backgroundTransformer)==null?void 0:r.setBackgroundOptions(n))}setVideoBGReadable(n){this.backgroundTransformer.setVideoBGReadable(n)}async setVirtualBGImage(n){await this.backgroundTransformer.setVirtualBGImage(n)}async terminate(){await this.mediaProcessor.destroy()}setFlickeringOptions(n){this.backgroundTransformer.setFlickeringOptions(n)}setVonageMetadata(n){V2(n)}};let ts=es;(()=>{tc("ProcessorWorker",es)})();const cu="dmFyIFhsPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgWWw9KEosdGUscmUpPT50ZSBpbiBKP1hsKEosdGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnJlfSk6Slt0ZV09cmU7dmFyIHk9KEosdGUscmUpPT4oWWwoSix0eXBlb2YgdGUhPSJzeW1ib2wiP3RlKyIiOnRlLHJlKSxyZSk7KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBKPShyPT4ocltyLklOSVQ9MF09IklOSVQiLHJbci5GT1JXQVJEPTFdPSJGT1JXQVJEIixyW3IuVEVSTUlOQVRFPTJdPSJURVJNSU5BVEUiLHIpKShKfHx7fSk7ZnVuY3Rpb24gdGUocil7cmV0dXJuW0ltYWdlQml0bWFwLFJlYWRhYmxlU3RyZWFtLFdyaXRhYmxlU3RyZWFtXS5zb21lKGU9PnIgaW5zdGFuY2VvZiBlKX1mdW5jdGlvbiByZShyLGUpe2NvbnN0e2lkOnR9PXIsbj1BcnJheS5pc0FycmF5KGUpP2U6W2VdO3Bvc3RNZXNzYWdlKHtpZDp0LHJlc3VsdDplfSxuLmZpbHRlcihpPT50ZShpKSkpfWFzeW5jIGZ1bmN0aW9uIFdpKHIsZSl7Y29uc3R7ZnVuY3Rpb25OYW1lOnQsYXJnczpufT1yO2lmKCFlLmluc3RhbmNlKXRocm93Imluc3RhbmNlIG5vdCBpbml0aWFsaXplZCI7aWYoIXQpdGhyb3cibWlzc2luZyBmdW5jdGlvbiBuYW1lIHRvIGNhbGwiO2lmKCFlLmluc3RhbmNlW3RdKXRocm93YHVuZGVmaW5lZCBmdW5jdGlvbiBbJHt0fV0gaW4gY2xhc3MgJHtlLmluc3RhbmNlLmNvbnN0cnVjdG9yLndvcmtlcklkfWA7cmUocixhd2FpdCBlLmluc3RhbmNlW3RdKC4uLm4hPW51bGw/bjpbXSkpfWZ1bmN0aW9uICRyKCl7cmV0dXJuIHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZTwidSImJnNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZX1jb25zdCBHcj17fTtmdW5jdGlvbiBqaShyLGUpe2Uud29ya2VySWQ9ciwkcigpJiYoR3JbZS53b3JrZXJJZF09ZSl9ZnVuY3Rpb24gcWkocixlKXtpZighci5hcmdzKXRocm93Ik1pc3NpbmcgY2xhc3NOYW1lIHdoaWxlIGluaXRpYWxpemluZyB3b3JrZXIiO2NvbnN0W3RdPXIuYXJncyxuPUdyW3RdO2lmKG4pZS5pbnN0YW5jZT1uZXcgbihyLmFyZ3Muc2xpY2UoMSkpO2Vsc2UgdGhyb3dgdW5rbm93biB3b3JrZXIgY2xhc3MgJHt0fWA7cmUocix0eXBlb2YgZS5pbnN0YW5jZSE9PXZvaWQgMCl9YXN5bmMgZnVuY3Rpb24gWGkocixlKXtjb25zdHthcmdzOnR9PXI7aWYoIWUuaW5zdGFuY2UpdGhyb3ciaW5zdGFuY2Ugbm90IGluaXRpYWxpemVkIjtsZXQgbjtlLmluc3RhbmNlLnRlcm1pbmF0ZSYmKG49YXdhaXQgZS5pbnN0YW5jZS50ZXJtaW5hdGUoLi4udCE9bnVsbD90OltdKSkscmUocixuKX1mdW5jdGlvbiBZaSgpe2NvbnN0IHI9e307b25tZXNzYWdlPWFzeW5jIGU9Pntjb25zdCB0PWUuZGF0YTtzd2l0Y2godC50eXBlKXtjYXNlIEouSU5JVDpxaSh0LHIpO2JyZWFrO2Nhc2UgSi5GT1JXQVJEOldpKHQscik7YnJlYWs7Y2FzZSBKLlRFUk1JTkFURTpYaSh0LHIpO2JyZWFrfX19JHIoKSYmWWkoKTtjbGFzcyBuZXt9bmUudXBkYXRlcz17dHJhbnNmb3JtZXJfbmV3OiJOZXcgdHJhbnNmb3JtZXIiLHRyYW5zZm9ybWVyX251bGw6Ik51bGwgdHJhbnNmb3JtZXIifSxuZS5lcnJvcnM9e3RyYW5zZm9ybWVyX25vbmU6Ik5vIHRyYW5zZm9ybWVycyBwcm92aWRlZCIsdHJhbnNmb3JtZXJfc3RhcnQ6IkNhbm5vdCBzdGFydCB0cmFuc2Zvcm1lciIsdHJhbnNmb3JtZXJfdHJhbnNmb3JtOiJDYW5ub3QgdHJhbnNmb3JtIGZyYW1lIix0cmFuc2Zvcm1lcl9mbHVzaDoiQ2Fubm90IGZsdXNoIHRyYW5zZm9ybWVyIixyZWFkYWJsZV9udWxsOiJSZWFkYWJsZSBpcyBudWxsIix3cml0YWJsZV9udWxsOiJXcml0YWJsZSBpcyBudWxsIn07dmFyIE90PXtleHBvcnRzOnt9fSx6cj1mdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgaT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCksbz0wO288aS5sZW5ndGg7bysrKWlbb109YXJndW1lbnRzW29dO3JldHVybiBlLmFwcGx5KHQsaSl9fSxLaT16cixvZT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIE50KHIpe3JldHVybiBBcnJheS5pc0FycmF5KHIpfWZ1bmN0aW9uIEJ0KHIpe3JldHVybiB0eXBlb2Ygcj4idSJ9ZnVuY3Rpb24gSmkocil7cmV0dXJuIHIhPT1udWxsJiYhQnQocikmJnIuY29uc3RydWN0b3IhPT1udWxsJiYhQnQoci5jb25zdHJ1Y3RvcikmJnR5cGVvZiByLmNvbnN0cnVjdG9yLmlzQnVmZmVyPT0iZnVuY3Rpb24iJiZyLmNvbnN0cnVjdG9yLmlzQnVmZmVyKHIpfWZ1bmN0aW9uIEhyKHIpe3JldHVybiBvZS5jYWxsKHIpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIn1mdW5jdGlvbiBRaShyKXtyZXR1cm4gb2UuY2FsbChyKT09PSJbb2JqZWN0IEZvcm1EYXRhXSJ9ZnVuY3Rpb24gWmkocil7dmFyIGU7cmV0dXJuIHR5cGVvZiBBcnJheUJ1ZmZlcjwidSImJkFycmF5QnVmZmVyLmlzVmlldz9lPUFycmF5QnVmZmVyLmlzVmlldyhyKTplPXImJnIuYnVmZmVyJiZIcihyLmJ1ZmZlciksZX1mdW5jdGlvbiBlbyhyKXtyZXR1cm4gdHlwZW9mIHI9PSJzdHJpbmcifWZ1bmN0aW9uIHRvKHIpe3JldHVybiB0eXBlb2Ygcj09Im51bWJlciJ9ZnVuY3Rpb24gVnIocil7cmV0dXJuIHIhPT1udWxsJiZ0eXBlb2Ygcj09Im9iamVjdCJ9ZnVuY3Rpb24gamUocil7aWYob2UuY2FsbChyKSE9PSJbb2JqZWN0IE9iamVjdF0iKXJldHVybiExO3ZhciBlPU9iamVjdC5nZXRQcm90b3R5cGVPZihyKTtyZXR1cm4gZT09PW51bGx8fGU9PT1PYmplY3QucHJvdG90eXBlfWZ1bmN0aW9uIHJvKHIpe3JldHVybiBvZS5jYWxsKHIpPT09IltvYmplY3QgRGF0ZV0ifWZ1bmN0aW9uIG5vKHIpe3JldHVybiBvZS5jYWxsKHIpPT09IltvYmplY3QgRmlsZV0ifWZ1bmN0aW9uIGlvKHIpe3JldHVybiBvZS5jYWxsKHIpPT09IltvYmplY3QgQmxvYl0ifWZ1bmN0aW9uIFdyKHIpe3JldHVybiBvZS5jYWxsKHIpPT09IltvYmplY3QgRnVuY3Rpb25dIn1mdW5jdGlvbiBvbyhyKXtyZXR1cm4gVnIocikmJldyKHIucGlwZSl9ZnVuY3Rpb24gc28ocil7cmV0dXJuIG9lLmNhbGwocik9PT0iW29iamVjdCBVUkxTZWFyY2hQYXJhbXNdIn1mdW5jdGlvbiBhbyhyKXtyZXR1cm4gci50cmltP3IudHJpbSgpOnIucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfWZ1bmN0aW9uIHVvKCl7cmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3I8InUiJiYobmF2aWdhdG9yLnByb2R1Y3Q9PT0iUmVhY3ROYXRpdmUifHxuYXZpZ2F0b3IucHJvZHVjdD09PSJOYXRpdmVTY3JpcHQifHxuYXZpZ2F0b3IucHJvZHVjdD09PSJOUyIpPyExOnR5cGVvZiB3aW5kb3c8InUiJiZ0eXBlb2YgZG9jdW1lbnQ8InUifWZ1bmN0aW9uIFV0KHIsZSl7aWYoIShyPT09bnVsbHx8dHlwZW9mIHI+InUiKSlpZih0eXBlb2YgciE9Im9iamVjdCImJihyPVtyXSksTnQocikpZm9yKHZhciB0PTAsbj1yLmxlbmd0aDt0PG47dCsrKWUuY2FsbChudWxsLHJbdF0sdCxyKTtlbHNlIGZvcih2YXIgaSBpbiByKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyLGkpJiZlLmNhbGwobnVsbCxyW2ldLGkscil9ZnVuY3Rpb24ga3QoKXt2YXIgcj17fTtmdW5jdGlvbiBlKGksbyl7amUocltvXSkmJmplKGkpP3Jbb109a3QocltvXSxpKTpqZShpKT9yW29dPWt0KHt9LGkpOk50KGkpP3Jbb109aS5zbGljZSgpOnJbb109aX1mb3IodmFyIHQ9MCxuPWFyZ3VtZW50cy5sZW5ndGg7dDxuO3QrKylVdChhcmd1bWVudHNbdF0sZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gY28ocixlLHQpe3JldHVybiBVdChlLGZ1bmN0aW9uKGksbyl7dCYmdHlwZW9mIGk9PSJmdW5jdGlvbiI/cltvXT1LaShpLHQpOnJbb109aX0pLHJ9ZnVuY3Rpb24gZm8ocil7cmV0dXJuIHIuY2hhckNvZGVBdCgwKT09PTY1Mjc5JiYocj1yLnNsaWNlKDEpKSxyfXZhciBHPXtpc0FycmF5Ok50LGlzQXJyYXlCdWZmZXI6SHIsaXNCdWZmZXI6SmksaXNGb3JtRGF0YTpRaSxpc0FycmF5QnVmZmVyVmlldzpaaSxpc1N0cmluZzplbyxpc051bWJlcjp0byxpc09iamVjdDpWcixpc1BsYWluT2JqZWN0OmplLGlzVW5kZWZpbmVkOkJ0LGlzRGF0ZTpybyxpc0ZpbGU6bm8saXNCbG9iOmlvLGlzRnVuY3Rpb246V3IsaXNTdHJlYW06b28saXNVUkxTZWFyY2hQYXJhbXM6c28saXNTdGFuZGFyZEJyb3dzZXJFbnY6dW8sZm9yRWFjaDpVdCxtZXJnZTprdCxleHRlbmQ6Y28sdHJpbTphbyxzdHJpcEJPTTpmb30sRWU9RztmdW5jdGlvbiBqcihyKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHIpLnJlcGxhY2UoLyUzQS9naSwiOiIpLnJlcGxhY2UoLyUyNC9nLCIkIikucmVwbGFjZSgvJTJDL2dpLCIsIikucmVwbGFjZSgvJTIwL2csIisiKS5yZXBsYWNlKC8lNUIvZ2ksIlsiKS5yZXBsYWNlKC8lNUQvZ2ksIl0iKX12YXIgcXI9ZnVuY3Rpb24oZSx0LG4pe2lmKCF0KXJldHVybiBlO3ZhciBpO2lmKG4paT1uKHQpO2Vsc2UgaWYoRWUuaXNVUkxTZWFyY2hQYXJhbXModCkpaT10LnRvU3RyaW5nKCk7ZWxzZXt2YXIgbz1bXTtFZS5mb3JFYWNoKHQsZnVuY3Rpb24odSxmKXt1PT09bnVsbHx8dHlwZW9mIHU+InUifHwoRWUuaXNBcnJheSh1KT9mPWYrIltdIjp1PVt1XSxFZS5mb3JFYWNoKHUsZnVuY3Rpb24oZCl7RWUuaXNEYXRlKGQpP2Q9ZC50b0lTT1N0cmluZygpOkVlLmlzT2JqZWN0KGQpJiYoZD1KU09OLnN0cmluZ2lmeShkKSksby5wdXNoKGpyKGYpKyI9IitqcihkKSl9KSl9KSxpPW8uam9pbigiJiIpfWlmKGkpe3ZhciBzPWUuaW5kZXhPZigiIyIpO3MhPT0tMSYmKGU9ZS5zbGljZSgwLHMpKSxlKz0oZS5pbmRleE9mKCI/Iik9PT0tMT8iPyI6IiYiKStpfXJldHVybiBlfSxsbz1HO2Z1bmN0aW9uIHFlKCl7dGhpcy5oYW5kbGVycz1bXX1xZS5wcm90b3R5cGUudXNlPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5oYW5kbGVycy5wdXNoKHtmdWxmaWxsZWQ6ZSxyZWplY3RlZDp0LHN5bmNocm9ub3VzOm4/bi5zeW5jaHJvbm91czohMSxydW5XaGVuOm4/bi5ydW5XaGVuOm51bGx9KSx0aGlzLmhhbmRsZXJzLmxlbmd0aC0xfSxxZS5wcm90b3R5cGUuZWplY3Q9ZnVuY3Rpb24oZSl7dGhpcy5oYW5kbGVyc1tlXSYmKHRoaXMuaGFuZGxlcnNbZV09bnVsbCl9LHFlLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKGUpe2xvLmZvckVhY2godGhpcy5oYW5kbGVycyxmdW5jdGlvbihuKXtuIT09bnVsbCYmZShuKX0pfTt2YXIgbW89cWUsaG89Ryxwbz1mdW5jdGlvbihlLHQpe2hvLmZvckVhY2goZSxmdW5jdGlvbihpLG8pe28hPT10JiZvLnRvVXBwZXJDYXNlKCk9PT10LnRvVXBwZXJDYXNlKCkmJihlW3RdPWksZGVsZXRlIGVbb10pfSl9LFhyPWZ1bmN0aW9uKGUsdCxuLGksbyl7cmV0dXJuIGUuY29uZmlnPXQsbiYmKGUuY29kZT1uKSxlLnJlcXVlc3Q9aSxlLnJlc3BvbnNlPW8sZS5pc0F4aW9zRXJyb3I9ITAsZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57bWVzc2FnZTp0aGlzLm1lc3NhZ2UsbmFtZTp0aGlzLm5hbWUsZGVzY3JpcHRpb246dGhpcy5kZXNjcmlwdGlvbixudW1iZXI6dGhpcy5udW1iZXIsZmlsZU5hbWU6dGhpcy5maWxlTmFtZSxsaW5lTnVtYmVyOnRoaXMubGluZU51bWJlcixjb2x1bW5OdW1iZXI6dGhpcy5jb2x1bW5OdW1iZXIsc3RhY2s6dGhpcy5zdGFjayxjb25maWc6dGhpcy5jb25maWcsY29kZTp0aGlzLmNvZGUsc3RhdHVzOnRoaXMucmVzcG9uc2UmJnRoaXMucmVzcG9uc2Uuc3RhdHVzP3RoaXMucmVzcG9uc2Uuc3RhdHVzOm51bGx9fSxlfSx5bz1YcixZcj1mdW5jdGlvbihlLHQsbixpLG8pe3ZhciBzPW5ldyBFcnJvcihlKTtyZXR1cm4geW8ocyx0LG4saSxvKX0sX289WXIseG89ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPW4uY29uZmlnLnZhbGlkYXRlU3RhdHVzOyFuLnN0YXR1c3x8IWl8fGkobi5zdGF0dXMpP2Uobik6dChfbygiUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAiK24uc3RhdHVzLG4uY29uZmlnLG51bGwsbi5yZXF1ZXN0LG4pKX0sWGU9Ryxibz1YZS5pc1N0YW5kYXJkQnJvd3NlckVudigpP2Z1bmN0aW9uKCl7cmV0dXJue3dyaXRlOmZ1bmN0aW9uKHQsbixpLG8scyxhKXt2YXIgdT1bXTt1LnB1c2godCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KG4pKSxYZS5pc051bWJlcihpKSYmdS5wdXNoKCJleHBpcmVzPSIrbmV3IERhdGUoaSkudG9HTVRTdHJpbmcoKSksWGUuaXNTdHJpbmcobykmJnUucHVzaCgicGF0aD0iK28pLFhlLmlzU3RyaW5nKHMpJiZ1LnB1c2goImRvbWFpbj0iK3MpLGE9PT0hMCYmdS5wdXNoKCJzZWN1cmUiKSxkb2N1bWVudC5jb29raWU9dS5qb2luKCI7ICIpfSxyZWFkOmZ1bmN0aW9uKHQpe3ZhciBuPWRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCIoXnw7XFxzKikoIit0KyIpPShbXjtdKikiKSk7cmV0dXJuIG4/ZGVjb2RlVVJJQ29tcG9uZW50KG5bM10pOm51bGx9LHJlbW92ZTpmdW5jdGlvbih0KXt0aGlzLndyaXRlKHQsIiIsRGF0ZS5ub3coKS04NjRlNSl9fX0oKTpmdW5jdGlvbigpe3JldHVybnt3cml0ZTpmdW5jdGlvbigpe30scmVhZDpmdW5jdGlvbigpe3JldHVybiBudWxsfSxyZW1vdmU6ZnVuY3Rpb24oKXt9fX0oKSxnbz1mdW5jdGlvbihlKXtyZXR1cm4vXihbYS16XVthLXpcZCtcLS5dKjopP1wvXC8vaS50ZXN0KGUpfSx2bz1mdW5jdGlvbihlLHQpe3JldHVybiB0P2UucmVwbGFjZSgvXC8rJC8sIiIpKyIvIit0LnJlcGxhY2UoL15cLysvLCIiKTplfSxFbz1nbyxUbz12byxBbz1mdW5jdGlvbihlLHQpe3JldHVybiBlJiYhRW8odCk/VG8oZSx0KTp0fSxMdD1HLHdvPVsiYWdlIiwiYXV0aG9yaXphdGlvbiIsImNvbnRlbnQtbGVuZ3RoIiwiY29udGVudC10eXBlIiwiZXRhZyIsImV4cGlyZXMiLCJmcm9tIiwiaG9zdCIsImlmLW1vZGlmaWVkLXNpbmNlIiwiaWYtdW5tb2RpZmllZC1zaW5jZSIsImxhc3QtbW9kaWZpZWQiLCJsb2NhdGlvbiIsIm1heC1mb3J3YXJkcyIsInByb3h5LWF1dGhvcml6YXRpb24iLCJyZWZlcmVyIiwicmV0cnktYWZ0ZXIiLCJ1c2VyLWFnZW50Il0sUm89ZnVuY3Rpb24oZSl7dmFyIHQ9e30sbixpLG87cmV0dXJuIGUmJkx0LmZvckVhY2goZS5zcGxpdChgCmApLGZ1bmN0aW9uKGEpe2lmKG89YS5pbmRleE9mKCI6Iiksbj1MdC50cmltKGEuc3Vic3RyKDAsbykpLnRvTG93ZXJDYXNlKCksaT1MdC50cmltKGEuc3Vic3RyKG8rMSkpLG4pe2lmKHRbbl0mJndvLmluZGV4T2Yobik+PTApcmV0dXJuO249PT0ic2V0LWNvb2tpZSI/dFtuXT0odFtuXT90W25dOltdKS5jb25jYXQoW2ldKTp0W25dPXRbbl0/dFtuXSsiLCAiK2k6aX19KSx0fSxLcj1HLFNvPUtyLmlzU3RhbmRhcmRCcm93c2VyRW52KCk/ZnVuY3Rpb24oKXt2YXIgZT0vKG1zaWV8dHJpZGVudCkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpLG47ZnVuY3Rpb24gaShvKXt2YXIgcz1vO3JldHVybiBlJiYodC5zZXRBdHRyaWJ1dGUoImhyZWYiLHMpLHM9dC5ocmVmKSx0LnNldEF0dHJpYnV0ZSgiaHJlZiIscykse2hyZWY6dC5ocmVmLHByb3RvY29sOnQucHJvdG9jb2w/dC5wcm90b2NvbC5yZXBsYWNlKC86JC8sIiIpOiIiLGhvc3Q6dC5ob3N0LHNlYXJjaDp0LnNlYXJjaD90LnNlYXJjaC5yZXBsYWNlKC9eXD8vLCIiKToiIixoYXNoOnQuaGFzaD90Lmhhc2gucmVwbGFjZSgvXiMvLCIiKToiIixob3N0bmFtZTp0Lmhvc3RuYW1lLHBvcnQ6dC5wb3J0LHBhdGhuYW1lOnQucGF0aG5hbWUuY2hhckF0KDApPT09Ii8iP3QucGF0aG5hbWU6Ii8iK3QucGF0aG5hbWV9fXJldHVybiBuPWkod2luZG93LmxvY2F0aW9uLmhyZWYpLGZ1bmN0aW9uKHMpe3ZhciBhPUtyLmlzU3RyaW5nKHMpP2kocyk6cztyZXR1cm4gYS5wcm90b2NvbD09PW4ucHJvdG9jb2wmJmEuaG9zdD09PW4uaG9zdH19KCk6ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4hMH19KCk7ZnVuY3Rpb24gJHQocil7dGhpcy5tZXNzYWdlPXJ9JHQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIkNhbmNlbCIrKHRoaXMubWVzc2FnZT8iOiAiK3RoaXMubWVzc2FnZToiIil9LCR0LnByb3RvdHlwZS5fX0NBTkNFTF9fPSEwO3ZhciBZZT0kdCxLZT1HLElvPXhvLEZvPWJvLFBvPXFyLERvPUFvLE1vPVJvLENvPVNvLEd0PVlyLE9vPVFlLE5vPVllLEpyPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihuLGkpe3ZhciBvPWUuZGF0YSxzPWUuaGVhZGVycyxhPWUucmVzcG9uc2VUeXBlLHU7ZnVuY3Rpb24gZigpe2UuY2FuY2VsVG9rZW4mJmUuY2FuY2VsVG9rZW4udW5zdWJzY3JpYmUodSksZS5zaWduYWwmJmUuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0Iix1KX1LZS5pc0Zvcm1EYXRhKG8pJiZkZWxldGUgc1siQ29udGVudC1UeXBlIl07dmFyIGM9bmV3IFhNTEh0dHBSZXF1ZXN0O2lmKGUuYXV0aCl7dmFyIGQ9ZS5hdXRoLnVzZXJuYW1lfHwiIixwPWUuYXV0aC5wYXNzd29yZD91bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZS5hdXRoLnBhc3N3b3JkKSk6IiI7cy5BdXRob3JpemF0aW9uPSJCYXNpYyAiK2J0b2EoZCsiOiIrcCl9dmFyIF89RG8oZS5iYXNlVVJMLGUudXJsKTtjLm9wZW4oZS5tZXRob2QudG9VcHBlckNhc2UoKSxQbyhfLGUucGFyYW1zLGUucGFyYW1zU2VyaWFsaXplciksITApLGMudGltZW91dD1lLnRpbWVvdXQ7ZnVuY3Rpb24gbSgpe2lmKCEhYyl7dmFyIHY9ImdldEFsbFJlc3BvbnNlSGVhZGVycyJpbiBjP01vKGMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpOm51bGwsZz0hYXx8YT09PSJ0ZXh0Inx8YT09PSJqc29uIj9jLnJlc3BvbnNlVGV4dDpjLnJlc3BvbnNlLEE9e2RhdGE6ZyxzdGF0dXM6Yy5zdGF0dXMsc3RhdHVzVGV4dDpjLnN0YXR1c1RleHQsaGVhZGVyczp2LGNvbmZpZzplLHJlcXVlc3Q6Y307SW8oZnVuY3Rpb24oQyl7bihDKSxmKCl9LGZ1bmN0aW9uKEMpe2koQyksZigpfSxBKSxjPW51bGx9fWlmKCJvbmxvYWRlbmQiaW4gYz9jLm9ubG9hZGVuZD1tOmMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWN8fGMucmVhZHlTdGF0ZSE9PTR8fGMuc3RhdHVzPT09MCYmIShjLnJlc3BvbnNlVVJMJiZjLnJlc3BvbnNlVVJMLmluZGV4T2YoImZpbGU6Iik9PT0wKXx8c2V0VGltZW91dChtKX0sYy5vbmFib3J0PWZ1bmN0aW9uKCl7IWN8fChpKEd0KCJSZXF1ZXN0IGFib3J0ZWQiLGUsIkVDT05OQUJPUlRFRCIsYykpLGM9bnVsbCl9LGMub25lcnJvcj1mdW5jdGlvbigpe2koR3QoIk5ldHdvcmsgRXJyb3IiLGUsbnVsbCxjKSksYz1udWxsfSxjLm9udGltZW91dD1mdW5jdGlvbigpe3ZhciBnPWUudGltZW91dD8idGltZW91dCBvZiAiK2UudGltZW91dCsibXMgZXhjZWVkZWQiOiJ0aW1lb3V0IGV4Y2VlZGVkIixBPWUudHJhbnNpdGlvbmFsfHxPby50cmFuc2l0aW9uYWw7ZS50aW1lb3V0RXJyb3JNZXNzYWdlJiYoZz1lLnRpbWVvdXRFcnJvck1lc3NhZ2UpLGkoR3QoZyxlLEEuY2xhcmlmeVRpbWVvdXRFcnJvcj8iRVRJTUVET1VUIjoiRUNPTk5BQk9SVEVEIixjKSksYz1udWxsfSxLZS5pc1N0YW5kYXJkQnJvd3NlckVudigpKXt2YXIgeD0oZS53aXRoQ3JlZGVudGlhbHN8fENvKF8pKSYmZS54c3JmQ29va2llTmFtZT9Gby5yZWFkKGUueHNyZkNvb2tpZU5hbWUpOnZvaWQgMDt4JiYoc1tlLnhzcmZIZWFkZXJOYW1lXT14KX0ic2V0UmVxdWVzdEhlYWRlciJpbiBjJiZLZS5mb3JFYWNoKHMsZnVuY3Rpb24oZyxBKXt0eXBlb2Ygbz4idSImJkEudG9Mb3dlckNhc2UoKT09PSJjb250ZW50LXR5cGUiP2RlbGV0ZSBzW0FdOmMuc2V0UmVxdWVzdEhlYWRlcihBLGcpfSksS2UuaXNVbmRlZmluZWQoZS53aXRoQ3JlZGVudGlhbHMpfHwoYy53aXRoQ3JlZGVudGlhbHM9ISFlLndpdGhDcmVkZW50aWFscyksYSYmYSE9PSJqc29uIiYmKGMucmVzcG9uc2VUeXBlPWUucmVzcG9uc2VUeXBlKSx0eXBlb2YgZS5vbkRvd25sb2FkUHJvZ3Jlc3M9PSJmdW5jdGlvbiImJmMuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGUub25Eb3dubG9hZFByb2dyZXNzKSx0eXBlb2YgZS5vblVwbG9hZFByb2dyZXNzPT0iZnVuY3Rpb24iJiZjLnVwbG9hZCYmYy51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGUub25VcGxvYWRQcm9ncmVzcyksKGUuY2FuY2VsVG9rZW58fGUuc2lnbmFsKSYmKHU9ZnVuY3Rpb24odil7IWN8fChpKCF2fHx2JiZ2LnR5cGU/bmV3IE5vKCJjYW5jZWxlZCIpOnYpLGMuYWJvcnQoKSxjPW51bGwpfSxlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnN1YnNjcmliZSh1KSxlLnNpZ25hbCYmKGUuc2lnbmFsLmFib3J0ZWQ/dSgpOmUuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0Iix1KSkpLG98fChvPW51bGwpLGMuc2VuZChvKX0pfSxPPUcsUXI9cG8sQm89WHIsVW89eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifTtmdW5jdGlvbiBacihyLGUpeyFPLmlzVW5kZWZpbmVkKHIpJiZPLmlzVW5kZWZpbmVkKHJbIkNvbnRlbnQtVHlwZSJdKSYmKHJbIkNvbnRlbnQtVHlwZSJdPWUpfWZ1bmN0aW9uIGtvKCl7dmFyIHI7cmV0dXJuKHR5cGVvZiBYTUxIdHRwUmVxdWVzdDwidSJ8fHR5cGVvZiBwcm9jZXNzPCJ1IiYmT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHByb2Nlc3MpPT09IltvYmplY3QgcHJvY2Vzc10iKSYmKHI9SnIpLHJ9ZnVuY3Rpb24gTG8ocixlLHQpe2lmKE8uaXNTdHJpbmcocikpdHJ5e3JldHVybihlfHxKU09OLnBhcnNlKShyKSxPLnRyaW0ocil9Y2F0Y2gobil7aWYobi5uYW1lIT09IlN5bnRheEVycm9yIil0aHJvdyBufXJldHVybih0fHxKU09OLnN0cmluZ2lmeSkocil9dmFyIEplPXt0cmFuc2l0aW9uYWw6e3NpbGVudEpTT05QYXJzaW5nOiEwLGZvcmNlZEpTT05QYXJzaW5nOiEwLGNsYXJpZnlUaW1lb3V0RXJyb3I6ITF9LGFkYXB0ZXI6a28oKSx0cmFuc2Zvcm1SZXF1ZXN0OltmdW5jdGlvbihlLHQpe3JldHVybiBRcih0LCJBY2NlcHQiKSxRcih0LCJDb250ZW50LVR5cGUiKSxPLmlzRm9ybURhdGEoZSl8fE8uaXNBcnJheUJ1ZmZlcihlKXx8Ty5pc0J1ZmZlcihlKXx8Ty5pc1N0cmVhbShlKXx8Ty5pc0ZpbGUoZSl8fE8uaXNCbG9iKGUpP2U6Ty5pc0FycmF5QnVmZmVyVmlldyhlKT9lLmJ1ZmZlcjpPLmlzVVJMU2VhcmNoUGFyYW1zKGUpPyhacih0LCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCIpLGUudG9TdHJpbmcoKSk6Ty5pc09iamVjdChlKXx8dCYmdFsiQ29udGVudC1UeXBlIl09PT0iYXBwbGljYXRpb24vanNvbiI/KFpyKHQsImFwcGxpY2F0aW9uL2pzb24iKSxMbyhlKSk6ZX1dLHRyYW5zZm9ybVJlc3BvbnNlOltmdW5jdGlvbihlKXt2YXIgdD10aGlzLnRyYW5zaXRpb25hbHx8SmUudHJhbnNpdGlvbmFsLG49dCYmdC5zaWxlbnRKU09OUGFyc2luZyxpPXQmJnQuZm9yY2VkSlNPTlBhcnNpbmcsbz0hbiYmdGhpcy5yZXNwb25zZVR5cGU9PT0ianNvbiI7aWYob3x8aSYmTy5pc1N0cmluZyhlKSYmZS5sZW5ndGgpdHJ5e3JldHVybiBKU09OLnBhcnNlKGUpfWNhdGNoKHMpe2lmKG8pdGhyb3cgcy5uYW1lPT09IlN5bnRheEVycm9yIj9CbyhzLHRoaXMsIkVfSlNPTl9QQVJTRSIpOnN9cmV0dXJuIGV9XSx0aW1lb3V0OjAseHNyZkNvb2tpZU5hbWU6IlhTUkYtVE9LRU4iLHhzcmZIZWFkZXJOYW1lOiJYLVhTUkYtVE9LRU4iLG1heENvbnRlbnRMZW5ndGg6LTEsbWF4Qm9keUxlbmd0aDotMSx2YWxpZGF0ZVN0YXR1czpmdW5jdGlvbihlKXtyZXR1cm4gZT49MjAwJiZlPDMwMH0saGVhZGVyczp7Y29tbW9uOntBY2NlcHQ6ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKiJ9fX07Ty5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCJdLGZ1bmN0aW9uKGUpe0plLmhlYWRlcnNbZV09e319KSxPLmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSxmdW5jdGlvbihlKXtKZS5oZWFkZXJzW2VdPU8ubWVyZ2UoVW8pfSk7dmFyIFFlPUplLCRvPUcsR289UWUsem89ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXRoaXN8fEdvO3JldHVybiAkby5mb3JFYWNoKG4sZnVuY3Rpb24ocyl7ZT1zLmNhbGwoaSxlLHQpfSksZX0sZW49ZnVuY3Rpb24oZSl7cmV0dXJuISEoZSYmZS5fX0NBTkNFTF9fKX0sdG49Ryx6dD16byxIbz1lbixWbz1RZSxXbz1ZZTtmdW5jdGlvbiBIdChyKXtpZihyLmNhbmNlbFRva2VuJiZyLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKSxyLnNpZ25hbCYmci5zaWduYWwuYWJvcnRlZCl0aHJvdyBuZXcgV28oImNhbmNlbGVkIil9dmFyIGpvPWZ1bmN0aW9uKGUpe0h0KGUpLGUuaGVhZGVycz1lLmhlYWRlcnN8fHt9LGUuZGF0YT16dC5jYWxsKGUsZS5kYXRhLGUuaGVhZGVycyxlLnRyYW5zZm9ybVJlcXVlc3QpLGUuaGVhZGVycz10bi5tZXJnZShlLmhlYWRlcnMuY29tbW9ufHx7fSxlLmhlYWRlcnNbZS5tZXRob2RdfHx7fSxlLmhlYWRlcnMpLHRuLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwicG9zdCIsInB1dCIsInBhdGNoIiwiY29tbW9uIl0sZnVuY3Rpb24oaSl7ZGVsZXRlIGUuaGVhZGVyc1tpXX0pO3ZhciB0PWUuYWRhcHRlcnx8Vm8uYWRhcHRlcjtyZXR1cm4gdChlKS50aGVuKGZ1bmN0aW9uKGkpe3JldHVybiBIdChlKSxpLmRhdGE9enQuY2FsbChlLGkuZGF0YSxpLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXNwb25zZSksaX0sZnVuY3Rpb24oaSl7cmV0dXJuIEhvKGkpfHwoSHQoZSksaSYmaS5yZXNwb25zZSYmKGkucmVzcG9uc2UuZGF0YT16dC5jYWxsKGUsaS5yZXNwb25zZS5kYXRhLGkucmVzcG9uc2UuaGVhZGVycyxlLnRyYW5zZm9ybVJlc3BvbnNlKSkpLFByb21pc2UucmVqZWN0KGkpfSl9LHo9Ryxybj1mdW5jdGlvbihlLHQpe3Q9dHx8e307dmFyIG49e307ZnVuY3Rpb24gaShjLGQpe3JldHVybiB6LmlzUGxhaW5PYmplY3QoYykmJnouaXNQbGFpbk9iamVjdChkKT96Lm1lcmdlKGMsZCk6ei5pc1BsYWluT2JqZWN0KGQpP3oubWVyZ2Uoe30sZCk6ei5pc0FycmF5KGQpP2Quc2xpY2UoKTpkfWZ1bmN0aW9uIG8oYyl7aWYoei5pc1VuZGVmaW5lZCh0W2NdKSl7aWYoIXouaXNVbmRlZmluZWQoZVtjXSkpcmV0dXJuIGkodm9pZCAwLGVbY10pfWVsc2UgcmV0dXJuIGkoZVtjXSx0W2NdKX1mdW5jdGlvbiBzKGMpe2lmKCF6LmlzVW5kZWZpbmVkKHRbY10pKXJldHVybiBpKHZvaWQgMCx0W2NdKX1mdW5jdGlvbiBhKGMpe2lmKHouaXNVbmRlZmluZWQodFtjXSkpe2lmKCF6LmlzVW5kZWZpbmVkKGVbY10pKXJldHVybiBpKHZvaWQgMCxlW2NdKX1lbHNlIHJldHVybiBpKHZvaWQgMCx0W2NdKX1mdW5jdGlvbiB1KGMpe2lmKGMgaW4gdClyZXR1cm4gaShlW2NdLHRbY10pO2lmKGMgaW4gZSlyZXR1cm4gaSh2b2lkIDAsZVtjXSl9dmFyIGY9e3VybDpzLG1ldGhvZDpzLGRhdGE6cyxiYXNlVVJMOmEsdHJhbnNmb3JtUmVxdWVzdDphLHRyYW5zZm9ybVJlc3BvbnNlOmEscGFyYW1zU2VyaWFsaXplcjphLHRpbWVvdXQ6YSx0aW1lb3V0TWVzc2FnZTphLHdpdGhDcmVkZW50aWFsczphLGFkYXB0ZXI6YSxyZXNwb25zZVR5cGU6YSx4c3JmQ29va2llTmFtZTphLHhzcmZIZWFkZXJOYW1lOmEsb25VcGxvYWRQcm9ncmVzczphLG9uRG93bmxvYWRQcm9ncmVzczphLGRlY29tcHJlc3M6YSxtYXhDb250ZW50TGVuZ3RoOmEsbWF4Qm9keUxlbmd0aDphLHRyYW5zcG9ydDphLGh0dHBBZ2VudDphLGh0dHBzQWdlbnQ6YSxjYW5jZWxUb2tlbjphLHNvY2tldFBhdGg6YSxyZXNwb25zZUVuY29kaW5nOmEsdmFsaWRhdGVTdGF0dXM6dX07cmV0dXJuIHouZm9yRWFjaChPYmplY3Qua2V5cyhlKS5jb25jYXQoT2JqZWN0LmtleXModCkpLGZ1bmN0aW9uKGQpe3ZhciBwPWZbZF18fG8sXz1wKGQpO3ouaXNVbmRlZmluZWQoXykmJnAhPT11fHwobltkXT1fKX0pLG59LG5uPXt2ZXJzaW9uOiIwLjI1LjAifSxxbz1ubi52ZXJzaW9uLFZ0PXt9O1sib2JqZWN0IiwiYm9vbGVhbiIsIm51bWJlciIsImZ1bmN0aW9uIiwic3RyaW5nIiwic3ltYm9sIl0uZm9yRWFjaChmdW5jdGlvbihyLGUpe1Z0W3JdPWZ1bmN0aW9uKG4pe3JldHVybiB0eXBlb2Ygbj09PXJ8fCJhIisoZTwxPyJuICI6IiAiKStyfX0pO3ZhciBvbj17fTtWdC50cmFuc2l0aW9uYWw9ZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIGkobyxzKXtyZXR1cm4iW0F4aW9zIHYiK3FvKyJdIFRyYW5zaXRpb25hbCBvcHRpb24gJyIrbysiJyIrcysobj8iLiAiK246IiIpfXJldHVybiBmdW5jdGlvbihvLHMsYSl7aWYoZT09PSExKXRocm93IG5ldyBFcnJvcihpKHMsIiBoYXMgYmVlbiByZW1vdmVkIisodD8iIGluICIrdDoiIikpKTtyZXR1cm4gdCYmIW9uW3NdJiYob25bc109ITAsY29uc29sZS53YXJuKGkocywiIGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgdiIrdCsiIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlIikpKSxlP2UobyxzLGEpOiEwfX07ZnVuY3Rpb24gWG8ocixlLHQpe2lmKHR5cGVvZiByIT0ib2JqZWN0Iil0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Zm9yKHZhciBuPU9iamVjdC5rZXlzKHIpLGk9bi5sZW5ndGg7aS0tID4wOyl7dmFyIG89bltpXSxzPWVbb107aWYocyl7dmFyIGE9cltvXSx1PWE9PT12b2lkIDB8fHMoYSxvLHIpO2lmKHUhPT0hMCl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb24gIitvKyIgbXVzdCBiZSAiK3UpO2NvbnRpbnVlfWlmKHQhPT0hMCl0aHJvdyBFcnJvcigiVW5rbm93biBvcHRpb24gIitvKX19dmFyIFlvPXthc3NlcnRPcHRpb25zOlhvLHZhbGlkYXRvcnM6VnR9LHNuPUcsS289cXIsYW49bW8sdW49am8sWmU9cm4sY249WW8sVGU9Y24udmFsaWRhdG9ycztmdW5jdGlvbiBNZShyKXt0aGlzLmRlZmF1bHRzPXIsdGhpcy5pbnRlcmNlcHRvcnM9e3JlcXVlc3Q6bmV3IGFuLHJlc3BvbnNlOm5ldyBhbn19TWUucHJvdG90eXBlLnJlcXVlc3Q9ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgZT09InN0cmluZyI/KHQ9dHx8e30sdC51cmw9ZSk6dD1lfHx7fSwhdC51cmwpdGhyb3cgbmV3IEVycm9yKCJQcm92aWRlZCBjb25maWcgdXJsIGlzIG5vdCB2YWxpZCIpO3Q9WmUodGhpcy5kZWZhdWx0cyx0KSx0Lm1ldGhvZD90Lm1ldGhvZD10Lm1ldGhvZC50b0xvd2VyQ2FzZSgpOnRoaXMuZGVmYXVsdHMubWV0aG9kP3QubWV0aG9kPXRoaXMuZGVmYXVsdHMubWV0aG9kLnRvTG93ZXJDYXNlKCk6dC5tZXRob2Q9ImdldCI7dmFyIG49dC50cmFuc2l0aW9uYWw7biE9PXZvaWQgMCYmY24uYXNzZXJ0T3B0aW9ucyhuLHtzaWxlbnRKU09OUGFyc2luZzpUZS50cmFuc2l0aW9uYWwoVGUuYm9vbGVhbiksZm9yY2VkSlNPTlBhcnNpbmc6VGUudHJhbnNpdGlvbmFsKFRlLmJvb2xlYW4pLGNsYXJpZnlUaW1lb3V0RXJyb3I6VGUudHJhbnNpdGlvbmFsKFRlLmJvb2xlYW4pfSwhMSk7dmFyIGk9W10sbz0hMDt0aGlzLmludGVyY2VwdG9ycy5yZXF1ZXN0LmZvckVhY2goZnVuY3Rpb24oXyl7dHlwZW9mIF8ucnVuV2hlbj09ImZ1bmN0aW9uIiYmXy5ydW5XaGVuKHQpPT09ITF8fChvPW8mJl8uc3luY2hyb25vdXMsaS51bnNoaWZ0KF8uZnVsZmlsbGVkLF8ucmVqZWN0ZWQpKX0pO3ZhciBzPVtdO3RoaXMuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLmZvckVhY2goZnVuY3Rpb24oXyl7cy5wdXNoKF8uZnVsZmlsbGVkLF8ucmVqZWN0ZWQpfSk7dmFyIGE7aWYoIW8pe3ZhciB1PVt1bix2b2lkIDBdO2ZvcihBcnJheS5wcm90b3R5cGUudW5zaGlmdC5hcHBseSh1LGkpLHU9dS5jb25jYXQocyksYT1Qcm9taXNlLnJlc29sdmUodCk7dS5sZW5ndGg7KWE9YS50aGVuKHUuc2hpZnQoKSx1LnNoaWZ0KCkpO3JldHVybiBhfWZvcih2YXIgZj10O2kubGVuZ3RoOyl7dmFyIGM9aS5zaGlmdCgpLGQ9aS5zaGlmdCgpO3RyeXtmPWMoZil9Y2F0Y2gocCl7ZChwKTticmVha319dHJ5e2E9dW4oZil9Y2F0Y2gocCl7cmV0dXJuIFByb21pc2UucmVqZWN0KHApfWZvcig7cy5sZW5ndGg7KWE9YS50aGVuKHMuc2hpZnQoKSxzLnNoaWZ0KCkpO3JldHVybiBhfSxNZS5wcm90b3R5cGUuZ2V0VXJpPWZ1bmN0aW9uKGUpe2lmKCFlLnVybCl0aHJvdyBuZXcgRXJyb3IoIlByb3ZpZGVkIGNvbmZpZyB1cmwgaXMgbm90IHZhbGlkIik7cmV0dXJuIGU9WmUodGhpcy5kZWZhdWx0cyxlKSxLbyhlLnVybCxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLnJlcGxhY2UoL15cPy8sIiIpfSxzbi5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsIm9wdGlvbnMiXSxmdW5jdGlvbihlKXtNZS5wcm90b3R5cGVbZV09ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KFplKG58fHt9LHttZXRob2Q6ZSx1cmw6dCxkYXRhOihufHx7fSkuZGF0YX0pKX19KSxzbi5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sZnVuY3Rpb24oZSl7TWUucHJvdG90eXBlW2VdPWZ1bmN0aW9uKHQsbixpKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KFplKGl8fHt9LHttZXRob2Q6ZSx1cmw6dCxkYXRhOm59KSl9fSk7dmFyIEpvPU1lLFFvPVllO2Z1bmN0aW9uIEFlKHIpe2lmKHR5cGVvZiByIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoImV4ZWN1dG9yIG11c3QgYmUgYSBmdW5jdGlvbi4iKTt2YXIgZTt0aGlzLnByb21pc2U9bmV3IFByb21pc2UoZnVuY3Rpb24oaSl7ZT1pfSk7dmFyIHQ9dGhpczt0aGlzLnByb21pc2UudGhlbihmdW5jdGlvbihuKXtpZighIXQuX2xpc3RlbmVycyl7dmFyIGksbz10Ll9saXN0ZW5lcnMubGVuZ3RoO2ZvcihpPTA7aTxvO2krKyl0Ll9saXN0ZW5lcnNbaV0obik7dC5fbGlzdGVuZXJzPW51bGx9fSksdGhpcy5wcm9taXNlLnRoZW49ZnVuY3Rpb24obil7dmFyIGksbz1uZXcgUHJvbWlzZShmdW5jdGlvbihzKXt0LnN1YnNjcmliZShzKSxpPXN9KS50aGVuKG4pO3JldHVybiBvLmNhbmNlbD1mdW5jdGlvbigpe3QudW5zdWJzY3JpYmUoaSl9LG99LHIoZnVuY3Rpb24oaSl7dC5yZWFzb258fCh0LnJlYXNvbj1uZXcgUW8oaSksZSh0LnJlYXNvbikpfSl9QWUucHJvdG90eXBlLnRocm93SWZSZXF1ZXN0ZWQ9ZnVuY3Rpb24oKXtpZih0aGlzLnJlYXNvbil0aHJvdyB0aGlzLnJlYXNvbn0sQWUucHJvdG90eXBlLnN1YnNjcmliZT1mdW5jdGlvbihlKXtpZih0aGlzLnJlYXNvbil7ZSh0aGlzLnJlYXNvbik7cmV0dXJufXRoaXMuX2xpc3RlbmVycz90aGlzLl9saXN0ZW5lcnMucHVzaChlKTp0aGlzLl9saXN0ZW5lcnM9W2VdfSxBZS5wcm90b3R5cGUudW5zdWJzY3JpYmU9ZnVuY3Rpb24oZSl7aWYoISF0aGlzLl9saXN0ZW5lcnMpe3ZhciB0PXRoaXMuX2xpc3RlbmVycy5pbmRleE9mKGUpO3QhPT0tMSYmdGhpcy5fbGlzdGVuZXJzLnNwbGljZSh0LDEpfX0sQWUuc291cmNlPWZ1bmN0aW9uKCl7dmFyIGUsdD1uZXcgQWUoZnVuY3Rpb24oaSl7ZT1pfSk7cmV0dXJue3Rva2VuOnQsY2FuY2VsOmV9fTt2YXIgWm89QWUsZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBlLmFwcGx5KG51bGwsbil9fSx0cz1HLHJzPWZ1bmN0aW9uKGUpe3JldHVybiB0cy5pc09iamVjdChlKSYmZS5pc0F4aW9zRXJyb3I9PT0hMH0sZm49Ryxucz16cixldD1Kbyxpcz1ybixvcz1RZTtmdW5jdGlvbiBsbihyKXt2YXIgZT1uZXcgZXQociksdD1ucyhldC5wcm90b3R5cGUucmVxdWVzdCxlKTtyZXR1cm4gZm4uZXh0ZW5kKHQsZXQucHJvdG90eXBlLGUpLGZuLmV4dGVuZCh0LGUpLHQuY3JlYXRlPWZ1bmN0aW9uKGkpe3JldHVybiBsbihpcyhyLGkpKX0sdH12YXIgUT1sbihvcyk7US5BeGlvcz1ldCxRLkNhbmNlbD1ZZSxRLkNhbmNlbFRva2VuPVpvLFEuaXNDYW5jZWw9ZW4sUS5WRVJTSU9OPW5uLnZlcnNpb24sUS5hbGw9ZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UuYWxsKGUpfSxRLnNwcmVhZD1lcyxRLmlzQXhpb3NFcnJvcj1ycyxPdC5leHBvcnRzPVEsT3QuZXhwb3J0cy5kZWZhdWx0PVE7dmFyIHNzPU90LmV4cG9ydHM7Y2xhc3MgVHtpc0VtcHR5KCl7cmV0dXJuIXRoaXMuaXNQcmVzZW50KCl9c3RhdGljIG9mKGUpe2lmKGUhPW51bGwpcmV0dXJuIG5ldyBkbihlKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgcGFzc2VkIHZhbHVlIHdhcyBudWxsIG9yIHVuZGVmaW5lZC4iKX1zdGF0aWMgb2ZOb25OdWxsKGUpe3JldHVybiBULm9mKGUpfXN0YXRpYyBvZk51bGxhYmxlKGUpe3JldHVybiBlIT1udWxsP25ldyBkbihlKTpuZXcgbW59c3RhdGljIGVtcHR5KCl7cmV0dXJuIG5ldyBtbn1zdGF0aWMgZnJvbShlKXtzd2l0Y2goZS5raW5kKXtjYXNlInByZXNlbnQiOnJldHVybiBULm9mKGUudmFsdWUpO2Nhc2UiZW1wdHkiOnJldHVybiBULmVtcHR5KCk7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgcGFzc2VkIHZhbHVlIHdhcyBub3QgYW4gT3B0aW9uIHR5cGUuIil9fX1jbGFzcyBkbiBleHRlbmRzIFR7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLnBheWxvYWQ9ZX1pc1ByZXNlbnQoKXtyZXR1cm4hMH1nZXQoKXtyZXR1cm4gdGhpcy5wYXlsb2FkfWlmUHJlc2VudChlKXtlKHRoaXMucGF5bG9hZCl9aWZQcmVzZW50T3JFbHNlKGUsdCl7ZSh0aGlzLnBheWxvYWQpfWZpbHRlcihlKXtyZXR1cm4gZSh0aGlzLnBheWxvYWQpP3RoaXM6VC5lbXB0eSgpfW1hcChlKXtjb25zdCB0PWUodGhpcy5wYXlsb2FkKTtyZXR1cm4gVC5vZk51bGxhYmxlKHQpfWZsYXRNYXAoZSl7cmV0dXJuIGUodGhpcy5wYXlsb2FkKX1vcihlKXtyZXR1cm4gdGhpc31vckVsc2UoZSl7cmV0dXJuIHRoaXMucGF5bG9hZH1vckVsc2VHZXQoZSl7cmV0dXJuIHRoaXMucGF5bG9hZH1vckVsc2VUaHJvdyhlKXtyZXR1cm4gdGhpcy5wYXlsb2FkfW9yTnVsbCgpe3JldHVybiB0aGlzLnBheWxvYWR9b3JVbmRlZmluZWQoKXtyZXR1cm4gdGhpcy5wYXlsb2FkfXRvT3B0aW9uKCl7cmV0dXJue2tpbmQ6InByZXNlbnQiLHZhbHVlOnRoaXMucGF5bG9hZH19bWF0Y2hlcyhlKXtyZXR1cm4gZS5wcmVzZW50KHRoaXMucGF5bG9hZCl9dG9KU09OKGUpe3JldHVybiB0aGlzLnBheWxvYWR9fWNsYXNzIG1uIGV4dGVuZHMgVHtpc1ByZXNlbnQoKXtyZXR1cm4hMX1jb25zdHJ1Y3Rvcigpe3N1cGVyKCl9Z2V0KCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIG9wdGlvbmFsIGlzIG5vdCBwcmVzZW50LiIpfWlmUHJlc2VudChlKXt9aWZQcmVzZW50T3JFbHNlKGUsdCl7dCgpfWZpbHRlcihlKXtyZXR1cm4gdGhpc31tYXAoZSl7cmV0dXJuIFQuZW1wdHkoKX1mbGF0TWFwKGUpe3JldHVybiBULmVtcHR5KCl9b3IoZSl7cmV0dXJuIGUoKX1vckVsc2UoZSl7cmV0dXJuIGV9b3JFbHNlR2V0KGUpe3JldHVybiB0aGlzLm9yRWxzZShlKCkpfW9yRWxzZVRocm93KGUpe3Rocm93IGUoKX1vck51bGwoKXtyZXR1cm4gbnVsbH1vclVuZGVmaW5lZCgpe310b09wdGlvbigpe3JldHVybntraW5kOiJlbXB0eSJ9fW1hdGNoZXMoZSl7cmV0dXJuIGUuZW1wdHkoKX10b0pTT04oZSl7cmV0dXJuIG51bGx9fWNvbnN0IGFzPSIyLjAuMCI7ZnVuY3Rpb24gdXMocil7Z2xvYmFsVGhpcy5fdm9uYWdlTWVkaWFQcm9jZXNzb3JNZXRhZGF0YT1yfWZ1bmN0aW9uIGNzKCl7cmV0dXJuIGdsb2JhbFRoaXMuX3ZvbmFnZU1lZGlhUHJvY2Vzc29yTWV0YWRhdGF9Y2xhc3MgSHtjb25zdHJ1Y3Rvcigpe2NvbnN0IGU9Y3MoKTt0aGlzLl9yZXBvcnQ9e2FjdGlvbjpULmVtcHR5KCksYXBwbGljYXRpb25JZDpULm9mTnVsbGFibGUoZSE9PXZvaWQgMCYmZSE9bnVsbD9lLmFwcElkOm51bGwpLHRpbWVzdGFtcDpEYXRlLm5vdygpLGZwczpULmVtcHR5KCksZnJhbWVzVHJhbnNmb3JtZWQ6VC5lbXB0eSgpLGd1aWQ6VC5lbXB0eSgpLGhpZ2hlc3RGcmFtZVRyYW5zZm9ybUNwdTpULmVtcHR5KCksbWVzc2FnZTpULmVtcHR5KCksc291cmNlOlQub2ZOdWxsYWJsZShlIT09dm9pZCAwJiZlIT1udWxsP2Uuc291cmNlVHlwZTpudWxsKSx0cmFuc2Zvcm1lZEZwczpULmVtcHR5KCksdHJhbnNmb3JtZXJUeXBlOlQuZW1wdHkoKSx2YXJpYXRpb246VC5lbXB0eSgpLHZpZGVvSGVpZ2h0OlQuZW1wdHkoKSx2aWRlb1dpZHRoOlQuZW1wdHkoKSx2ZXJzaW9uOmFzLGVycm9yOlQuZW1wdHkoKSxwcm94eVVybDpULm9mTnVsbGFibGUoZSE9PXZvaWQgMCYmZSE9bnVsbD9lLnByb3h5VXJsOm51bGwpfX1hY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5hY3Rpb249VC5vZk51bGxhYmxlKGUpLHRoaXN9ZnJhbWVzVHJhbnNmb3JtZWQoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5mcmFtZXNUcmFuc2Zvcm1lZD1ULm9mTnVsbGFibGUoZSksdGhpc31mcHMoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5mcHM9VC5vZk51bGxhYmxlKGUpLHRoaXN9Z3VpZChlKXtyZXR1cm4gdGhpcy5fcmVwb3J0Lmd1aWQ9VC5vZk51bGxhYmxlKGUpLHRoaXN9bWVzc2FnZShlKXtyZXR1cm4gdGhpcy5fcmVwb3J0Lm1lc3NhZ2U9VC5vZk51bGxhYmxlKGUpLHRoaXN9dHJhbnNmb3JtZWRGcHMoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC50cmFuc2Zvcm1lZEZwcz1ULm9mTnVsbGFibGUoZSksdGhpc310cmFuc2Zvcm1lclR5cGUoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC50cmFuc2Zvcm1lclR5cGU9VC5vZk51bGxhYmxlKGUpLHRoaXN9dmFyaWF0aW9uKGUpe3JldHVybiB0aGlzLl9yZXBvcnQudmFyaWF0aW9uPVQub2ZOdWxsYWJsZShlKSx0aGlzfXZpZGVvSGVpZ2h0KGUpe3JldHVybiB0aGlzLl9yZXBvcnQudmlkZW9IZWlnaHQ9VC5vZk51bGxhYmxlKGUpLHRoaXN9dmlkZW9XaWR0aChlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LnZpZGVvV2lkdGg9VC5vZk51bGxhYmxlKGUpLHRoaXN9ZXJyb3IoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5lcnJvcj1ULm9mTnVsbGFibGUoZSksdGhpc31idWlsZCgpe3JldHVybiB0aGlzLl9yZXBvcnR9fWNvbnN0IGZzPXI9PkpTT04uc3RyaW5naWZ5KHIsKGUsdCk9PntpZih0IT09bnVsbClyZXR1cm4gdH0pO2NsYXNzIFZ7c3RhdGljIHJlcG9ydChlKXtyZXR1cm4gbmV3IFByb21pc2UoKHQsbik9PntpZihlLmFwcGxpY2F0aW9uSWQuaXNFbXB0eSgpfHxlLnNvdXJjZS5pc0VtcHR5KCkpe3QoInN1Y2Nlc3MiKTtyZXR1cm59bGV0IGk9c3MuY3JlYXRlKCksbz17dGltZW91dDoxZTQsdGltZW91dEVycm9yTWVzc2FnZToiUmVxdWVzdCB0aW1lb3V0IixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9fSxzPSJobGcudG9rYm94LmNvbS9wcm9kL2xvZ2dpbmcvdmNwX3dlYnJ0YyI7aWYoZS5wcm94eVVybC5pc0VtcHR5KCkpcz0iaHR0cHM6Ly8iK3M7ZWxzZXtsZXQgYTtlLnByb3h5VXJsLmdldCgpLnNsaWNlKGUucHJveHlVcmwuZ2V0KCkubGVuZ3RoLTEpIT09Ii8iP2E9ZS5wcm94eVVybC5nZXQoKSsiLyI6YT1lLnByb3h5VXJsLmdldCgpLHM9YStzfWkucG9zdChzLGZzKGUpLG8pLnRoZW4oYT0+e2NvbnNvbGUubG9nKGEpLHQoInN1Y2Nlc3MiKX0pLmNhdGNoKGE9Pntjb25zb2xlLmxvZyhhKSxuKGEpfSl9KX19dmFyIHR0LGxzPW5ldyBVaW50OEFycmF5KDE2KTtmdW5jdGlvbiBkcygpe2lmKCF0dCYmKHR0PXR5cGVvZiBjcnlwdG88InUiJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKXx8dHlwZW9mIG1zQ3J5cHRvPCJ1IiYmdHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcz09ImZ1bmN0aW9uIiYmbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQobXNDcnlwdG8pLCF0dCkpdGhyb3cgbmV3IEVycm9yKCJjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCIpO3JldHVybiB0dChscyl9dmFyIG1zPS9eKD86WzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKSQvaTtmdW5jdGlvbiBocyhyKXtyZXR1cm4gdHlwZW9mIHI9PSJzdHJpbmciJiZtcy50ZXN0KHIpfWZvcih2YXIgTj1bXSxXdD0wO1d0PDI1NjsrK1d0KU4ucHVzaCgoV3QrMjU2KS50b1N0cmluZygxNikuc3Vic3RyKDEpKTtmdW5jdGlvbiBwcyhyKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06MCx0PShOW3JbZSswXV0rTltyW2UrMV1dK05bcltlKzJdXStOW3JbZSszXV0rIi0iK05bcltlKzRdXStOW3JbZSs1XV0rIi0iK05bcltlKzZdXStOW3JbZSs3XV0rIi0iK05bcltlKzhdXStOW3JbZSs5XV0rIi0iK05bcltlKzEwXV0rTltyW2UrMTFdXStOW3JbZSsxMl1dK05bcltlKzEzXV0rTltyW2UrMTRdXStOW3JbZSsxNV1dKS50b0xvd2VyQ2FzZSgpO2lmKCFocyh0KSl0aHJvdyBUeXBlRXJyb3IoIlN0cmluZ2lmaWVkIFVVSUQgaXMgaW52YWxpZCIpO3JldHVybiB0fWZ1bmN0aW9uIGhuKHIsZSx0KXtyPXJ8fHt9O3ZhciBuPXIucmFuZG9tfHwoci5ybmd8fGRzKSgpO2lmKG5bNl09bls2XSYxNXw2NCxuWzhdPW5bOF0mNjN8MTI4LGUpe3Q9dHx8MDtmb3IodmFyIGk9MDtpPDE2OysraSllW3QraV09bltpXTtyZXR1cm4gZX1yZXR1cm4gcHMobil9Y29uc3Qgc2U9bmV3IFdlYWtNYXAscnQ9bmV3IFdlYWtNYXAsQ2U9bmV3IFdlYWtNYXAsanQ9U3ltYm9sKCJhbnlQcm9kdWNlciIpLHBuPVByb21pc2UucmVzb2x2ZSgpLG50PVN5bWJvbCgibGlzdGVuZXJBZGRlZCIpLGl0PVN5bWJvbCgibGlzdGVuZXJSZW1vdmVkIik7bGV0IHF0PSExO2Z1bmN0aW9uIHdlKHIpe2lmKHR5cGVvZiByIT0ic3RyaW5nIiYmdHlwZW9mIHIhPSJzeW1ib2wiKXRocm93IG5ldyBUeXBlRXJyb3IoImV2ZW50TmFtZSBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgc3ltYm9sIil9ZnVuY3Rpb24gb3Qocil7aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gUmUocixlKXtjb25zdCB0PXJ0LmdldChyKTtyZXR1cm4gdC5oYXMoZSl8fHQuc2V0KGUsbmV3IFNldCksdC5nZXQoZSl9ZnVuY3Rpb24gT2UocixlKXtjb25zdCB0PXR5cGVvZiBlPT0ic3RyaW5nInx8dHlwZW9mIGU9PSJzeW1ib2wiP2U6anQsbj1DZS5nZXQocik7cmV0dXJuIG4uaGFzKHQpfHxuLnNldCh0LG5ldyBTZXQpLG4uZ2V0KHQpfWZ1bmN0aW9uIHlzKHIsZSx0KXtjb25zdCBuPUNlLmdldChyKTtpZihuLmhhcyhlKSlmb3IoY29uc3QgaSBvZiBuLmdldChlKSlpLmVucXVldWUodCk7aWYobi5oYXMoanQpKXtjb25zdCBpPVByb21pc2UuYWxsKFtlLHRdKTtmb3IoY29uc3QgbyBvZiBuLmdldChqdCkpby5lbnF1ZXVlKGkpfX1mdW5jdGlvbiB5bihyLGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtsZXQgdD0hMSxuPSgpPT57fSxpPVtdO2NvbnN0IG89e2VucXVldWUocyl7aS5wdXNoKHMpLG4oKX0sZmluaXNoKCl7dD0hMCxuKCl9fTtmb3IoY29uc3QgcyBvZiBlKU9lKHIscykuYWRkKG8pO3JldHVybnthc3luYyBuZXh0KCl7cmV0dXJuIGk/aS5sZW5ndGg9PT0wP3Q/KGk9dm9pZCAwLHRoaXMubmV4dCgpKTooYXdhaXQgbmV3IFByb21pc2Uocz0+e249c30pLHRoaXMubmV4dCgpKTp7ZG9uZTohMSx2YWx1ZTphd2FpdCBpLnNoaWZ0KCl9Ontkb25lOiEwfX0sYXN5bmMgcmV0dXJuKHMpe2k9dm9pZCAwO2Zvcihjb25zdCBhIG9mIGUpT2UocixhKS5kZWxldGUobyk7cmV0dXJuIG4oKSxhcmd1bWVudHMubGVuZ3RoPjA/e2RvbmU6ITAsdmFsdWU6YXdhaXQgc306e2RvbmU6ITB9fSxbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCl7cmV0dXJuIHRoaXN9fX1mdW5jdGlvbiBfbihyKXtpZihyPT09dm9pZCAwKXJldHVybiB4bjtpZighQXJyYXkuaXNBcnJheShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJgbWV0aG9kTmFtZXNgIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncyIpO2Zvcihjb25zdCBlIG9mIHIpaWYoIXhuLmluY2x1ZGVzKGUpKXRocm93IHR5cGVvZiBlIT0ic3RyaW5nIj9uZXcgVHlwZUVycm9yKCJgbWV0aG9kTmFtZXNgIGVsZW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpOm5ldyBFcnJvcihgJHtlfSBpcyBub3QgRW1pdHRlcnkgbWV0aG9kYCk7cmV0dXJuIHJ9Y29uc3QgWHQ9cj0+cj09PW50fHxyPT09aXQ7Y2xhc3MgaGV7c3RhdGljIG1peGluKGUsdCl7cmV0dXJuIHQ9X24odCksbj0+e2lmKHR5cGVvZiBuIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoImB0YXJnZXRgIG11c3QgYmUgZnVuY3Rpb24iKTtmb3IoY29uc3QgcyBvZiB0KWlmKG4ucHJvdG90eXBlW3NdIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgVGhlIHByb3BlcnR5IFxgJHtzfVxgIGFscmVhZHkgZXhpc3RzIG9uIFxgdGFyZ2V0XGBgKTtmdW5jdGlvbiBpKCl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGUse2VudW1lcmFibGU6ITEsdmFsdWU6bmV3IGhlfSksdGhpc1tlXX1PYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUsZSx7ZW51bWVyYWJsZTohMSxnZXQ6aX0pO2NvbnN0IG89cz0+ZnVuY3Rpb24oLi4uYSl7cmV0dXJuIHRoaXNbZV1bc10oLi4uYSl9O2Zvcihjb25zdCBzIG9mIHQpT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLHMse2VudW1lcmFibGU6ITEsdmFsdWU6byhzKX0pO3JldHVybiBufX1zdGF0aWMgZ2V0IGlzRGVidWdFbmFibGVkKCl7aWYodHlwZW9mIHByb2Nlc3MhPSJvYmplY3QiKXJldHVybiBxdDtjb25zdHtlbnY6ZX09cHJvY2Vzc3x8e2Vudjp7fX07cmV0dXJuIGUuREVCVUc9PT0iZW1pdHRlcnkifHxlLkRFQlVHPT09IioifHxxdH1zdGF0aWMgc2V0IGlzRGVidWdFbmFibGVkKGUpe3F0PWV9Y29uc3RydWN0b3IoZT17fSl7c2Uuc2V0KHRoaXMsbmV3IFNldCkscnQuc2V0KHRoaXMsbmV3IE1hcCksQ2Uuc2V0KHRoaXMsbmV3IE1hcCksdGhpcy5kZWJ1Zz1lLmRlYnVnfHx7fSx0aGlzLmRlYnVnLmVuYWJsZWQ9PT12b2lkIDAmJih0aGlzLmRlYnVnLmVuYWJsZWQ9ITEpLHRoaXMuZGVidWcubG9nZ2VyfHwodGhpcy5kZWJ1Zy5sb2dnZXI9KHQsbixpLG8pPT57bz1KU09OLnN0cmluZ2lmeShvKSx0eXBlb2YgaT09InN5bWJvbCImJihpPWkudG9TdHJpbmcoKSk7Y29uc3Qgcz1uZXcgRGF0ZSxhPWAke3MuZ2V0SG91cnMoKX06JHtzLmdldE1pbnV0ZXMoKX06JHtzLmdldFNlY29uZHMoKX0uJHtzLmdldE1pbGxpc2Vjb25kcygpfWA7Y29uc29sZS5sb2coYFske2F9XVtlbWl0dGVyeToke3R9XVske259XSBFdmVudCBOYW1lOiAke2l9CglkYXRhOiAke299YCl9KX1sb2dJZkRlYnVnRW5hYmxlZChlLHQsbil7KGhlLmlzRGVidWdFbmFibGVkfHx0aGlzLmRlYnVnLmVuYWJsZWQpJiZ0aGlzLmRlYnVnLmxvZ2dlcihlLHRoaXMuZGVidWcubmFtZSx0LG4pfW9uKGUsdCl7b3QodCksZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCBuIG9mIGUpd2UobiksUmUodGhpcyxuKS5hZGQodCksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgic3Vic2NyaWJlIixuLHZvaWQgMCksWHQobil8fHRoaXMuZW1pdChudCx7ZXZlbnROYW1lOm4sbGlzdGVuZXI6dH0pO3JldHVybiB0aGlzLm9mZi5iaW5kKHRoaXMsZSx0KX1vZmYoZSx0KXtvdCh0KSxlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07Zm9yKGNvbnN0IG4gb2YgZSl3ZShuKSxSZSh0aGlzLG4pLmRlbGV0ZSh0KSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJ1bnN1YnNjcmliZSIsbix2b2lkIDApLFh0KG4pfHx0aGlzLmVtaXQoaXQse2V2ZW50TmFtZTpuLGxpc3RlbmVyOnR9KX1vbmNlKGUpe3JldHVybiBuZXcgUHJvbWlzZSh0PT57Y29uc3Qgbj10aGlzLm9uKGUsaT0+e24oKSx0KGkpfSl9KX1ldmVudHMoZSl7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCB0IG9mIGUpd2UodCk7cmV0dXJuIHluKHRoaXMsZSl9YXN5bmMgZW1pdChlLHQpe3dlKGUpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoImVtaXQiLGUsdCkseXModGhpcyxlLHQpO2NvbnN0IG49UmUodGhpcyxlKSxpPXNlLmdldCh0aGlzKSxvPVsuLi5uXSxzPVh0KGUpP1tdOlsuLi5pXTthd2FpdCBwbixhd2FpdCBQcm9taXNlLmFsbChbLi4uby5tYXAoYXN5bmMgYT0+e2lmKG4uaGFzKGEpKXJldHVybiBhKHQpfSksLi4ucy5tYXAoYXN5bmMgYT0+e2lmKGkuaGFzKGEpKXJldHVybiBhKGUsdCl9KV0pfWFzeW5jIGVtaXRTZXJpYWwoZSx0KXt3ZShlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJlbWl0U2VyaWFsIixlLHQpO2NvbnN0IG49UmUodGhpcyxlKSxpPXNlLmdldCh0aGlzKSxvPVsuLi5uXSxzPVsuLi5pXTthd2FpdCBwbjtmb3IoY29uc3QgYSBvZiBvKW4uaGFzKGEpJiZhd2FpdCBhKHQpO2Zvcihjb25zdCBhIG9mIHMpaS5oYXMoYSkmJmF3YWl0IGEoZSx0KX1vbkFueShlKXtyZXR1cm4gb3QoZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgic3Vic2NyaWJlQW55Iix2b2lkIDAsdm9pZCAwKSxzZS5nZXQodGhpcykuYWRkKGUpLHRoaXMuZW1pdChudCx7bGlzdGVuZXI6ZX0pLHRoaXMub2ZmQW55LmJpbmQodGhpcyxlKX1hbnlFdmVudCgpe3JldHVybiB5bih0aGlzKX1vZmZBbnkoZSl7b3QoZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgidW5zdWJzY3JpYmVBbnkiLHZvaWQgMCx2b2lkIDApLHRoaXMuZW1pdChpdCx7bGlzdGVuZXI6ZX0pLHNlLmdldCh0aGlzKS5kZWxldGUoZSl9Y2xlYXJMaXN0ZW5lcnMoZSl7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCB0IG9mIGUpaWYodGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgiY2xlYXIiLHQsdm9pZCAwKSx0eXBlb2YgdD09InN0cmluZyJ8fHR5cGVvZiB0PT0ic3ltYm9sIil7UmUodGhpcyx0KS5jbGVhcigpO2NvbnN0IG49T2UodGhpcyx0KTtmb3IoY29uc3QgaSBvZiBuKWkuZmluaXNoKCk7bi5jbGVhcigpfWVsc2V7c2UuZ2V0KHRoaXMpLmNsZWFyKCk7Zm9yKGNvbnN0IG4gb2YgcnQuZ2V0KHRoaXMpLnZhbHVlcygpKW4uY2xlYXIoKTtmb3IoY29uc3QgbiBvZiBDZS5nZXQodGhpcykudmFsdWVzKCkpe2Zvcihjb25zdCBpIG9mIG4paS5maW5pc2goKTtuLmNsZWFyKCl9fX1saXN0ZW5lckNvdW50KGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtsZXQgdD0wO2Zvcihjb25zdCBuIG9mIGUpe2lmKHR5cGVvZiBuPT0ic3RyaW5nIil7dCs9c2UuZ2V0KHRoaXMpLnNpemUrUmUodGhpcyxuKS5zaXplK09lKHRoaXMsbikuc2l6ZStPZSh0aGlzKS5zaXplO2NvbnRpbnVlfXR5cGVvZiBuPCJ1IiYmd2UobiksdCs9c2UuZ2V0KHRoaXMpLnNpemU7Zm9yKGNvbnN0IGkgb2YgcnQuZ2V0KHRoaXMpLnZhbHVlcygpKXQrPWkuc2l6ZTtmb3IoY29uc3QgaSBvZiBDZS5nZXQodGhpcykudmFsdWVzKCkpdCs9aS5zaXplfXJldHVybiB0fWJpbmRNZXRob2RzKGUsdCl7aWYodHlwZW9mIGUhPSJvYmplY3QifHxlPT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJgdGFyZ2V0YCBtdXN0IGJlIGFuIG9iamVjdCIpO3Q9X24odCk7Zm9yKGNvbnN0IG4gb2YgdCl7aWYoZVtuXSE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoYFRoZSBwcm9wZXJ0eSBcYCR7bn1cYCBhbHJlYWR5IGV4aXN0cyBvbiBcYHRhcmdldFxgYCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix7ZW51bWVyYWJsZTohMSx2YWx1ZTp0aGlzW25dLmJpbmQodGhpcyl9KX19fWNvbnN0IHhuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGhlLnByb3RvdHlwZSkuZmlsdGVyKHI9PnIhPT0iY29uc3RydWN0b3IiKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaGUsImxpc3RlbmVyQWRkZWQiLHt2YWx1ZTpudCx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoZSwibGlzdGVuZXJSZW1vdmVkIix7dmFsdWU6aXQsd3JpdGFibGU6ITEsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITF9KTt2YXIgWXQ9aGU7ZnVuY3Rpb24gX3Mocil7cmV0dXJuIHR5cGVvZiByPT0ib2JqZWN0IiYmciE9PW51bGwmJiJtZXNzYWdlImluIHImJnR5cGVvZiByLm1lc3NhZ2U9PSJzdHJpbmcifWZ1bmN0aW9uIHhzKHIpe2lmKF9zKHIpKXJldHVybiByO3RyeXtyZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHIpKX1jYXRjaHtyZXR1cm4gbmV3IEVycm9yKFN0cmluZyhyKSl9fWZ1bmN0aW9uIEt0KHIpe3JldHVybiB4cyhyKS5tZXNzYWdlfXZhciBKdD0ocj0+KHIucGlwZWxpbmVfZW5kZWQ9InBpcGVsaW5lX2VuZGVkIixyLnBpcGVsaW5lX2VuZGVkX3dpdGhfZXJyb3I9InBpcGVsaW5lX2VuZGVkX3dpdGhfZXJyb3IiLHIucGlwZWxpbmVfc3RhcnRlZD0icGlwZWxpbmVfc3RhcnRlZCIsci5waXBlbGluZV9zdGFydGVkX3dpdGhfZXJyb3I9InBpcGVsaW5lX3N0YXJ0ZWRfd2l0aF9lcnJvciIsci5waXBlbGluZV9yZXN0YXJ0ZWQ9InBpcGVsaW5lX3Jlc3RhcnRlZCIsci5waXBlbGluZV9yZXN0YXJ0ZWRfd2l0aF9lcnJvcj0icGlwZWxpbmVfcmVzdGFydGVkX3dpdGhfZXJyb3IiLHIpKShKdHx8e30pO2NvbnN0IGJzPTUwMCxncz0uODtjbGFzcyB2cyBleHRlbmRzIFl0e2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoKSx0aGlzLmluZGV4Xz10LHRoaXMudXVpZF89aG4oKSx0aGlzLmZyYW1lc1RyYW5zZm9ybWVkXz0wLHRoaXMudHJhbnNmb3JtZXJfPWUsdGhpcy5zaG91bGRTdG9wXz0hMSx0aGlzLmlzRmxhc2hlZF89ITEsdGhpcy5mcmFtZXNGcm9tU291cmNlXz0wLHRoaXMuZnBzXz0wLHRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXz0wLHRoaXMudmlkZW9IZWlnaHRfPTAsdGhpcy52aWRlb1dpZHRoXz0wLHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfPS0xLHRoaXMudHJhbnNmb3JtZXJUeXBlXz0iQ3VzdG9tIiwiZ2V0VHJhbnNmb3JtZXJUeXBlImluIGUmJih0aGlzLnRyYW5zZm9ybWVyVHlwZV89ZS5nZXRUcmFuc2Zvcm1lclR5cGUoKSk7Y29uc3Qgbj1uZXcgSCgpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmd1aWQodGhpcy51dWlkXykudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmFyaWF0aW9uKCJDcmVhdGUiKS5idWlsZCgpO1YucmVwb3J0KG4pfXNldFRyYWNrRXhwZWN0ZWRSYXRlKGUpe3RoaXMudHJhY2tFeHBlY3RlZFJhdGVfPWV9YXN5bmMgc3RhcnQoZSl7aWYodGhpcy5jb250cm9sbGVyXz1lLHRoaXMudHJhbnNmb3JtZXJfJiZ0eXBlb2YgdGhpcy50cmFuc2Zvcm1lcl8uc3RhcnQ9PSJmdW5jdGlvbiIpdHJ5e2F3YWl0IHRoaXMudHJhbnNmb3JtZXJfLnN0YXJ0KGUpfWNhdGNoKHQpe2NvbnN0IG49bmV3IEgoKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UobmUuZXJyb3JzLnRyYW5zZm9ybWVyX3N0YXJ0KS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkVycm9yIikuZXJyb3IoS3QodCkpLmJ1aWxkKCk7Vi5yZXBvcnQobik7Y29uc3QgaT17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sZXJyb3I6dCxmdW5jdGlvbjoic3RhcnQifTt0aGlzLmVtaXQoImVycm9yIixpKX19YXN5bmMgdHJhbnNmb3JtKGUsdCl7dmFyIG4saSxvLHM7aWYodGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfPT09MCYmKHRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXz1EYXRlLm5vdygpKSxlIGluc3RhbmNlb2YgVmlkZW9GcmFtZSYmKHRoaXMudmlkZW9IZWlnaHRfPShuPWU9PW51bGw/dm9pZCAwOmUuZGlzcGxheUhlaWdodCkhPW51bGw/bjowLHRoaXMudmlkZW9XaWR0aF89KGk9ZT09bnVsbD92b2lkIDA6ZS5kaXNwbGF5V2lkdGgpIT1udWxsP2k6MCksKyt0aGlzLmZyYW1lc0Zyb21Tb3VyY2VfLHRoaXMudHJhbnNmb3JtZXJfKWlmKHRoaXMuc2hvdWxkU3RvcF8pY29uc29sZS53YXJuKCJbUGlwZWxpbmVdIGZsdXNoIGZyb20gdHJhbnNmb3JtIiksZS5jbG9zZSgpLHRoaXMuZmx1c2godCksdC50ZXJtaW5hdGUoKTtlbHNlIHRyeXthd2FpdCgocz0obz10aGlzLnRyYW5zZm9ybWVyXykudHJhbnNmb3JtKT09bnVsbD92b2lkIDA6cy5jYWxsKG8sZSx0KSksKyt0aGlzLmZyYW1lc1RyYW5zZm9ybWVkXyx0aGlzLmZyYW1lc1RyYW5zZm9ybWVkXz09PWJzJiZ0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnQoKX1jYXRjaChhKXtjb25zdCB1PW5ldyBIKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKG5lLmVycm9ycy50cmFuc2Zvcm1lcl90cmFuc2Zvcm0pLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiRXJyb3IiKS5lcnJvcihLdChhKSkuYnVpbGQoKTtWLnJlcG9ydCh1KTtjb25zdCBmPXtldmVudE1ldGFEYXRhOnt0cmFuc2Zvcm1lckluZGV4OnRoaXMuaW5kZXhffSxlcnJvcjphLGZ1bmN0aW9uOiJ0cmFuc2Zvcm0ifTt0aGlzLmVtaXQoImVycm9yIixmKX19YXN5bmMgZmx1c2goZSl7aWYodGhpcy50cmFuc2Zvcm1lcl8mJnR5cGVvZiB0aGlzLnRyYW5zZm9ybWVyXy5mbHVzaD09ImZ1bmN0aW9uIiYmIXRoaXMuaXNGbGFzaGVkXyl7dGhpcy5pc0ZsYXNoZWRfPSEwO3RyeXthd2FpdCB0aGlzLnRyYW5zZm9ybWVyXy5mbHVzaChlKX1jYXRjaChuKXtjb25zdCBpPW5ldyBIKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKG5lLmVycm9ycy50cmFuc2Zvcm1lcl9mbHVzaCkudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmFyaWF0aW9uKCJFcnJvciIpLmVycm9yKEt0KG4pKS5idWlsZCgpO1YucmVwb3J0KGkpO2NvbnN0IG89e2V2ZW50TWV0YURhdGE6e3RyYW5zZm9ybWVySW5kZXg6dGhpcy5pbmRleF99LGVycm9yOm4sZnVuY3Rpb246ImZsdXNoIn07dGhpcy5lbWl0KCJlcnJvciIsbyl9fXRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydCgpO2NvbnN0IHQ9bmV3IEgoKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5ndWlkKHRoaXMudXVpZF8pLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiRGVsZXRlIikuYnVpbGQoKTtWLnJlcG9ydCh0KX1zdG9wKCl7Y29uc29sZS5sb2coIltQaXBlbGluZV0gU3RvcCBzdHJlYW0uIiksdGhpcy5jb250cm9sbGVyXyYmKHRoaXMuZmx1c2godGhpcy5jb250cm9sbGVyXyksdGhpcy5jb250cm9sbGVyXy50ZXJtaW5hdGUoKSksdGhpcy5zaG91bGRTdG9wXz0hMH1tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0KCl7bGV0IGU9KERhdGUubm93KCktdGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfKS8xZTMsdD10aGlzLmZyYW1lc0Zyb21Tb3VyY2VfL2Usbj10aGlzLmZyYW1lc1RyYW5zZm9ybWVkXy9lO2lmKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfIT0tMSYmdGhpcy50cmFja0V4cGVjdGVkUmF0ZV8qZ3M+dCl7Y29uc3Qgbz17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sd2FybmluZ1R5cGU6ImZwc19kcm9wIixkcm9wSW5mbzp7cmVxdWVzdGVkOnRoaXMudHJhY2tFeHBlY3RlZFJhdGVfLGN1cnJlbnQ6dH19O3RoaXMuZW1pdCgid2FybiIsbyl9Y29uc3QgaT1uZXcgSCgpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmZwcyh0KS50cmFuc2Zvcm1lZEZwcyhuKS5mcmFtZXNUcmFuc2Zvcm1lZCh0aGlzLmZyYW1lc1RyYW5zZm9ybWVkXykuZ3VpZCh0aGlzLnV1aWRfKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52aWRlb0hlaWdodCh0aGlzLnZpZGVvSGVpZ2h0XykudmlkZW9XaWR0aCh0aGlzLnZpZGVvV2lkdGhfKS52YXJpYXRpb24oIlFvUyIpLmJ1aWxkKCk7Vi5yZXBvcnQoaSksdGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfPTAsdGhpcy5mcmFtZXNGcm9tU291cmNlXz0wLHRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfPTB9fWNsYXNzIEVzIGV4dGVuZHMgWXR7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLnRyYW5zZm9ybWVyc189W10sdGhpcy50cmFja0V4cGVjdGVkUmF0ZV89LTE7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2xldCBuPW5ldyB2cyhlW3RdLHQpO24ub24oImVycm9yIixpPT57dGhpcy5lbWl0KCJlcnJvciIsaSl9KSxuLm9uKCJ3YXJuIixpPT57dGhpcy5lbWl0KCJ3YXJuIixpKX0pLHRoaXMudHJhbnNmb3JtZXJzXy5wdXNoKG4pfX1zZXRUcmFja0V4cGVjdGVkUmF0ZShlKXt0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz1lO2ZvcihsZXQgdCBvZiB0aGlzLnRyYW5zZm9ybWVyc18pdC5zZXRUcmFja0V4cGVjdGVkUmF0ZSh0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyl9YXN5bmMgc3RhcnQoZSx0KXtpZighdGhpcy50cmFuc2Zvcm1lcnNffHx0aGlzLnRyYW5zZm9ybWVyc18ubGVuZ3RoPT09MCl7Y29uc29sZS5sb2coIltQaXBlbGluZV0gTm8gdHJhbnNmb3JtZXJzLiIpO3JldHVybn10cnl7bGV0IG49ZTtmb3IobGV0IGkgb2YgdGhpcy50cmFuc2Zvcm1lcnNfKWU9ZS5waXBlVGhyb3VnaChuZXcgVHJhbnNmb3JtU3RyZWFtKGkpKTtlLnBpcGVUbyh0KS50aGVuKGFzeW5jKCk9Pntjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBTZXR1cC4iKSxhd2FpdCB0LmFib3J0KCksYXdhaXQgbi5jYW5jZWwoKSx0aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIsInBpcGVsaW5lX2VuZGVkIil9KS5jYXRjaChhc3luYyBpPT57ZS5jYW5jZWwoKS50aGVuKCgpPT57Y29uc29sZS5sb2coIltQaXBlbGluZV0gU2h1dHRpbmcgZG93biBzdHJlYW1zIGFmdGVyIGFib3J0LiIpfSkuY2F0Y2gobz0+e2NvbnNvbGUuZXJyb3IoIltQaXBlbGluZV0gRXJyb3IgZnJvbSBzdHJlYW0gdHJhbnNmb3JtOiIsbyl9KSxhd2FpdCB0LmFib3J0KGkpLGF3YWl0IG4uY2FuY2VsKGkpLHRoaXMuZW1pdCgicGlwZWxpbmVJbmZvIiwicGlwZWxpbmVfZW5kZWRfd2l0aF9lcnJvciIpfSl9Y2F0Y2h7dGhpcy5lbWl0KCJwaXBlbGluZUluZm8iLCJwaXBlbGluZV9zdGFydGVkX3dpdGhfZXJyb3IiKSx0aGlzLmRlc3Ryb3koKTtyZXR1cm59dGhpcy5lbWl0KCJwaXBlbGluZUluZm8iLCJwaXBlbGluZV9zdGFydGVkIiksY29uc29sZS5sb2coIltQaXBlbGluZV0gUGlwZWxpbmUgc3RhcnRlZC4iKX1hc3luYyBkZXN0cm95KCl7Y29uc29sZS5sb2coIltQaXBlbGluZV0gRGVzdHJveWluZyBQaXBlbGluZS4iKTtmb3IobGV0IGUgb2YgdGhpcy50cmFuc2Zvcm1lcnNfKWUuc3RvcCgpfX1jbGFzcyBUcyBleHRlbmRzIFl0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLnV1aWRfPWhuKCksdGhpcy50cmFja0V4cGVjdGVkUmF0ZV89LTE7Y29uc3QgZT1uZXcgSCgpLmFjdGlvbigiTWVkaWFQcm9jZXNzb3IiKS5ndWlkKHRoaXMudXVpZF8pLnZhcmlhdGlvbigiQ3JlYXRlIikuYnVpbGQoKTtWLnJlcG9ydChlKX1zZXRUcmFja0V4cGVjdGVkUmF0ZShlKXt0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz1lLHRoaXMucGlwZWxpbmVfJiZ0aGlzLnBpcGVsaW5lXy5zZXRUcmFja0V4cGVjdGVkUmF0ZSh0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyl9dHJhbnNmb3JtKGUsdCl7cmV0dXJuIHRoaXMucmVhZGFibGVfPWUsdGhpcy53cml0YWJsZV89dCx0aGlzLnRyYW5zZm9ybUludGVybmFsKCl9dHJhbnNmb3JtSW50ZXJuYWwoKXtyZXR1cm4gbmV3IFByb21pc2UoKGUsdCk9PntpZighdGhpcy50cmFuc2Zvcm1lcnNffHx0aGlzLnRyYW5zZm9ybWVyc18ubGVuZ3RoPT09MCl7Y29uc3QgaT1uZXcgSCgpLmFjdGlvbigiTWVkaWFQcm9jZXNzb3IiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UobmUuZXJyb3JzLnRyYW5zZm9ybWVyX25vbmUpLnZhcmlhdGlvbigiRXJyb3IiKS5idWlsZCgpO1YucmVwb3J0KGkpLHQoIltNZWRpYVByb2Nlc3Nvcl0gTmVlZCB0byBzZXQgdHJhbnNmb3JtZXJzLiIpO3JldHVybn1pZighdGhpcy5yZWFkYWJsZV8pe2NvbnN0IGk9bmV3IEgoKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKG5lLmVycm9ycy5yZWFkYWJsZV9udWxsKS52YXJpYXRpb24oIkVycm9yIikuYnVpbGQoKTtWLnJlcG9ydChpKSx0KCJbTWVkaWFQcm9jZXNzb3JdIFJlYWRhYmxlIGlzIG51bGwuIik7cmV0dXJufWlmKCF0aGlzLndyaXRhYmxlXyl7Y29uc3QgaT1uZXcgSCgpLmFjdGlvbigiTWVkaWFQcm9jZXNzb3IiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UobmUuZXJyb3JzLndyaXRhYmxlX251bGwpLnZhcmlhdGlvbigiRXJyb3IiKS5idWlsZCgpO1YucmVwb3J0KGkpLHQoIltNZWRpYVByb2Nlc3Nvcl0gV3JpdGFibGUgaXMgbnVsbC4iKTtyZXR1cm59bGV0IG49ITE7dGhpcy5waXBlbGluZV8mJihuPSEwLHRoaXMucGlwZWxpbmVfLmNsZWFyTGlzdGVuZXJzKCksdGhpcy5waXBlbGluZV8uZGVzdHJveSgpKSx0aGlzLnBpcGVsaW5lXz1uZXcgRXModGhpcy50cmFuc2Zvcm1lcnNfKSx0aGlzLnBpcGVsaW5lXy5vbigid2FybiIsaT0+e3RoaXMuZW1pdCgid2FybiIsaSl9KSx0aGlzLnBpcGVsaW5lXy5vbigiZXJyb3IiLGk9Pnt0aGlzLmVtaXQoImVycm9yIixpKX0pLHRoaXMucGlwZWxpbmVfLm9uKCJwaXBlbGluZUluZm8iLGk9PntuJiYoaT09PSJwaXBlbGluZV9zdGFydGVkIj9pPUp0LnBpcGVsaW5lX3Jlc3RhcnRlZDppPT09InBpcGVsaW5lX3N0YXJ0ZWRfd2l0aF9lcnJvciImJihpPUp0LnBpcGVsaW5lX3Jlc3RhcnRlZF93aXRoX2Vycm9yKSksdGhpcy5lbWl0KCJwaXBlbGluZUluZm8iLGkpfSksdGhpcy50cmFja0V4cGVjdGVkUmF0ZV8hPS0xJiZ0aGlzLnBpcGVsaW5lXy5zZXRUcmFja0V4cGVjdGVkUmF0ZSh0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyksdGhpcy5waXBlbGluZV8uc3RhcnQodGhpcy5yZWFkYWJsZV8sdGhpcy53cml0YWJsZV8pLnRoZW4oKCk9PntlKCl9KS5jYXRjaChpPT57dChpKX0pfSl9c2V0VHJhbnNmb3JtZXJzKGUpe2NvbnN0IHQ9bmV3IEgoKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKG5lLnVwZGF0ZXMudHJhbnNmb3JtZXJfbmV3KS52YXJpYXRpb24oIlVwZGF0ZSIpLmJ1aWxkKCk7cmV0dXJuIFYucmVwb3J0KHQpLHRoaXMudHJhbnNmb3JtZXJzXz1lLHRoaXMucmVhZGFibGVfJiZ0aGlzLndyaXRhYmxlXz90aGlzLnRyYW5zZm9ybUludGVybmFsKCk6UHJvbWlzZS5yZXNvbHZlKCl9ZGVzdHJveSgpe3JldHVybiBuZXcgUHJvbWlzZShlPT57dGhpcy5waXBlbGluZV8mJnRoaXMucGlwZWxpbmVfLmRlc3Ryb3koKTtjb25zdCB0PW5ldyBIKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykudmFyaWF0aW9uKCJEZWxldGUiKS5idWlsZCgpO1YucmVwb3J0KHQpLGUoKX0pfX12YXIgc3Q9KHI9PihyLkxvdz0iTG93IixyLkhpZ2g9IkhpZ2giLHIpKShzdHx8e30pOy8qIEBsaWNlbnNlIHR3Z2wuanMgNS4yLjAgQ29weXJpZ2h0IChjKSAyMDE1LCBHcmVnZyBUYXZhcmVzIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCkF2YWlsYWJsZSB2aWEgdGhlIE1JVCBsaWNlbnNlLgpzZWU6IGh0dHA6Ly9naXRodWIuY29tL2dyZWdnbWFuL3R3Z2wuanMgZm9yIGRldGFpbHMgKi9jb25zdCBRdD01MTIwLE5lPTUxMjEsWnQ9NTEyMixlcj01MTIzLHRyPTUxMjQscnI9NTEyNSxucj01MTI2LEFzPTMyODE5LHdzPTMyODIwLFJzPTMzNjM1LFNzPTUxMzEsSXM9MzM2NDAsRnM9MzU4OTksUHM9MzU5MDIsRHM9MzYyNjksTXM9MzQwNDIsYm49e307e2NvbnN0IHI9Ym47cltRdF09SW50OEFycmF5LHJbTmVdPVVpbnQ4QXJyYXkscltadF09SW50MTZBcnJheSxyW2VyXT1VaW50MTZBcnJheSxyW3RyXT1JbnQzMkFycmF5LHJbcnJdPVVpbnQzMkFycmF5LHJbbnJdPUZsb2F0MzJBcnJheSxyW0FzXT1VaW50MTZBcnJheSxyW3dzXT1VaW50MTZBcnJheSxyW1JzXT1VaW50MTZBcnJheSxyW1NzXT1VaW50MTZBcnJheSxyW0lzXT1VaW50MzJBcnJheSxyW0ZzXT1VaW50MzJBcnJheSxyW1BzXT1VaW50MzJBcnJheSxyW0RzXT1VaW50MzJBcnJheSxyW01zXT1VaW50MzJBcnJheX1mdW5jdGlvbiBpcihyKXtpZihyIGluc3RhbmNlb2YgSW50OEFycmF5KXJldHVybiBRdDtpZihyIGluc3RhbmNlb2YgVWludDhBcnJheXx8ciBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KXJldHVybiBOZTtpZihyIGluc3RhbmNlb2YgSW50MTZBcnJheSlyZXR1cm4gWnQ7aWYociBpbnN0YW5jZW9mIFVpbnQxNkFycmF5KXJldHVybiBlcjtpZihyIGluc3RhbmNlb2YgSW50MzJBcnJheSlyZXR1cm4gdHI7aWYociBpbnN0YW5jZW9mIFVpbnQzMkFycmF5KXJldHVybiBycjtpZihyIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5KXJldHVybiBucjt0aHJvdyBuZXcgRXJyb3IoInVuc3VwcG9ydGVkIHR5cGVkIGFycmF5IHR5cGUiKX1mdW5jdGlvbiBnbihyKXtpZihyPT09SW50OEFycmF5KXJldHVybiBRdDtpZihyPT09VWludDhBcnJheXx8cj09PVVpbnQ4Q2xhbXBlZEFycmF5KXJldHVybiBOZTtpZihyPT09SW50MTZBcnJheSlyZXR1cm4gWnQ7aWYocj09PVVpbnQxNkFycmF5KXJldHVybiBlcjtpZihyPT09SW50MzJBcnJheSlyZXR1cm4gdHI7aWYocj09PVVpbnQzMkFycmF5KXJldHVybiBycjtpZihyPT09RmxvYXQzMkFycmF5KXJldHVybiBucjt0aHJvdyBuZXcgRXJyb3IoInVuc3VwcG9ydGVkIHR5cGVkIGFycmF5IHR5cGUiKX1mdW5jdGlvbiB2bihyKXtjb25zdCBlPWJuW3JdO2lmKCFlKXRocm93IG5ldyBFcnJvcigidW5rbm93biBnbCB0eXBlIik7cmV0dXJuIGV9Y29uc3QgYXQ9dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyPCJ1Ij9mdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5idWZmZXImJihlLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxlLmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuYnVmZmVyJiZlLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfTtmdW5jdGlvbiBFbiguLi5yKXtjb25zb2xlLmVycm9yKC4uLnIpfWNvbnN0IFRuPW5ldyBNYXA7ZnVuY3Rpb24gdXQocixlKXtpZighcnx8dHlwZW9mIHIhPSJvYmplY3QiKXJldHVybiExO2xldCB0PVRuLmdldChlKTt0fHwodD1uZXcgV2Vha01hcCxUbi5zZXQoZSx0KSk7bGV0IG49dC5nZXQocik7aWYobj09PXZvaWQgMCl7Y29uc3QgaT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocik7bj1pLnN1YnN0cmluZyg4LGkubGVuZ3RoLTEpPT09ZSx0LnNldChyLG4pfXJldHVybiBufWZ1bmN0aW9uIENzKHIsZSl7cmV0dXJuIHR5cGVvZiBXZWJHTEJ1ZmZlcjwidSImJnV0KGUsIldlYkdMQnVmZmVyIil9ZnVuY3Rpb24gT3MocixlKXtyZXR1cm4gdHlwZW9mIFdlYkdMUmVuZGVyYnVmZmVyPCJ1IiYmdXQoZSwiV2ViR0xSZW5kZXJidWZmZXIiKX1mdW5jdGlvbiBvcihyLGUpe3JldHVybiB0eXBlb2YgV2ViR0xUZXh0dXJlPCJ1IiYmdXQoZSwiV2ViR0xUZXh0dXJlIil9ZnVuY3Rpb24gTnMocixlKXtyZXR1cm4gdHlwZW9mIFdlYkdMU2FtcGxlcjwidSImJnV0KGUsIldlYkdMU2FtcGxlciIpfWNvbnN0IEFuPTM1MDQ0LHBlPTM0OTYyLEJzPTM0OTYzLFVzPTM0NjYwLGtzPTUxMjAsTHM9NTEyMSwkcz01MTIyLEdzPTUxMjMsenM9NTEyNCxIcz01MTI1LHduPTUxMjYsUm49e2F0dHJpYlByZWZpeDoiIn07ZnVuY3Rpb24gVnMocixlLHQsbixpKXtyLmJpbmRCdWZmZXIoZSx0KSxyLmJ1ZmZlckRhdGEoZSxuLGl8fEFuKX1mdW5jdGlvbiBTbihyLGUsdCxuKXtpZihDcyhyLGUpKXJldHVybiBlO3Q9dHx8cGU7Y29uc3QgaT1yLmNyZWF0ZUJ1ZmZlcigpO3JldHVybiBWcyhyLHQsaSxlLG4pLGl9ZnVuY3Rpb24gSW4ocil7cmV0dXJuIHI9PT0iaW5kaWNlcyJ9ZnVuY3Rpb24gV3Mocil7cmV0dXJuIHI9PT1JbnQ4QXJyYXl8fHI9PT1VaW50OEFycmF5fWZ1bmN0aW9uIGpzKHIpe3JldHVybiByLmxlbmd0aD9yOnIuZGF0YX1jb25zdCBxcz0vY29vcmR8dGV4dHVyZS9pLFhzPS9jb2xvcnxjb2xvdXIvaTtmdW5jdGlvbiBZcyhyLGUpe2xldCB0O2lmKHFzLnRlc3Qocik/dD0yOlhzLnRlc3Qocik/dD00OnQ9MyxlJXQ+MCl0aHJvdyBuZXcgRXJyb3IoYENhbiBub3QgZ3Vlc3MgbnVtQ29tcG9uZW50cyBmb3IgYXR0cmlidXRlICcke3J9Jy4gVHJpZWQgJHt0fSBidXQgJHtlfSB2YWx1ZXMgaXMgbm90IGV2ZW5seSBkaXZpc2libGUgYnkgJHt0fS4gWW91IHNob3VsZCBzcGVjaWZ5IGl0LmApO3JldHVybiB0fWZ1bmN0aW9uIEtzKHIsZSx0KXtyZXR1cm4gci5udW1Db21wb25lbnRzfHxyLnNpemV8fFlzKGUsdHx8anMocikubGVuZ3RoKX1mdW5jdGlvbiBGbihyLGUpe2lmKGF0KHIpKXJldHVybiByO2lmKGF0KHIuZGF0YSkpcmV0dXJuIHIuZGF0YTtBcnJheS5pc0FycmF5KHIpJiYocj17ZGF0YTpyfSk7bGV0IHQ9ci50eXBlP3NyKHIudHlwZSk6dm9pZCAwO3JldHVybiB0fHwoSW4oZSk/dD1VaW50MTZBcnJheTp0PUZsb2F0MzJBcnJheSksbmV3IHQoci5kYXRhKX1mdW5jdGlvbiBKcyhyKXtyZXR1cm4gdHlwZW9mIHI9PSJudW1iZXIiP3I6cj9nbihyKTp3bn1mdW5jdGlvbiBzcihyKXtyZXR1cm4gdHlwZW9mIHI9PSJudW1iZXIiP3ZuKHIpOnJ8fEZsb2F0MzJBcnJheX1mdW5jdGlvbiBRcyhyLGUpe3JldHVybntidWZmZXI6ZS5idWZmZXIsbnVtVmFsdWVzOjIqMyo0LHR5cGU6SnMoZS50eXBlKSxhcnJheVR5cGU6c3IoZS50eXBlKX19ZnVuY3Rpb24gWnMocixlKXtjb25zdCB0PWUuZGF0YXx8ZSxuPXNyKGUudHlwZSksaT10Km4uQllURVNfUEVSX0VMRU1FTlQsbz1yLmNyZWF0ZUJ1ZmZlcigpO3JldHVybiByLmJpbmRCdWZmZXIocGUsbyksci5idWZmZXJEYXRhKHBlLGksZS5kcmF3VHlwZXx8QW4pLHtidWZmZXI6byxudW1WYWx1ZXM6dCx0eXBlOmduKG4pLGFycmF5VHlwZTpufX1mdW5jdGlvbiBlYShyLGUsdCl7Y29uc3Qgbj1GbihlLHQpO3JldHVybnthcnJheVR5cGU6bi5jb25zdHJ1Y3RvcixidWZmZXI6U24ocixuLHZvaWQgMCxlLmRyYXdUeXBlKSx0eXBlOmlyKG4pLG51bVZhbHVlczowfX1mdW5jdGlvbiB0YShyLGUpe2NvbnN0IHQ9e307cmV0dXJuIE9iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24obil7aWYoIUluKG4pKXtjb25zdCBpPWVbbl0sbz1pLmF0dHJpYnx8aS5uYW1lfHxpLmF0dHJpYk5hbWV8fFJuLmF0dHJpYlByZWZpeCtuO2lmKGkudmFsdWUpe2lmKCFBcnJheS5pc0FycmF5KGkudmFsdWUpJiYhYXQoaS52YWx1ZSkpdGhyb3cgbmV3IEVycm9yKCJhcnJheS52YWx1ZSBpcyBub3QgYXJyYXkgb3IgdHlwZWRhcnJheSIpO3Rbb109e3ZhbHVlOmkudmFsdWV9fWVsc2V7bGV0IHM7aS5idWZmZXImJmkuYnVmZmVyIGluc3RhbmNlb2YgV2ViR0xCdWZmZXI/cz1Rczp0eXBlb2YgaT09Im51bWJlciJ8fHR5cGVvZiBpLmRhdGE9PSJudW1iZXIiP3M9WnM6cz1lYTtjb25zdHtidWZmZXI6YSx0eXBlOnUsbnVtVmFsdWVzOmYsYXJyYXlUeXBlOmN9PXMocixpLG4pLGQ9aS5ub3JtYWxpemUhPT12b2lkIDA/aS5ub3JtYWxpemU6V3MoYykscD1LcyhpLG4sZik7dFtvXT17YnVmZmVyOmEsbnVtQ29tcG9uZW50czpwLHR5cGU6dSxub3JtYWxpemU6ZCxzdHJpZGU6aS5zdHJpZGV8fDAsb2Zmc2V0Omkub2Zmc2V0fHwwLGRpdmlzb3I6aS5kaXZpc29yPT09dm9pZCAwP3ZvaWQgMDppLmRpdmlzb3IsZHJhd1R5cGU6aS5kcmF3VHlwZX19fX0pLHIuYmluZEJ1ZmZlcihwZSxudWxsKSx0fWZ1bmN0aW9uIHJhKHIsZSl7cmV0dXJuIGU9PT1rc3x8ZT09PUxzPzE6ZT09PSRzfHxlPT09R3M/MjplPT09enN8fGU9PT1Ic3x8ZT09PXduPzQ6MH1jb25zdCBhcj1bInBvc2l0aW9uIiwicG9zaXRpb25zIiwiYV9wb3NpdGlvbiJdO2Z1bmN0aW9uIG5hKHIsZSl7bGV0IHQsbjtmb3Iobj0wO248YXIubGVuZ3RoJiYodD1hcltuXSwhKHQgaW4gZXx8KHQ9Um4uYXR0cmliUHJlZml4K3QsdCBpbiBlKSkpOysrbik7bj09PWFyLmxlbmd0aCYmKHQ9T2JqZWN0LmtleXMoZSlbMF0pO2NvbnN0IGk9ZVt0XTtpZighaS5idWZmZXIpcmV0dXJuIDE7ci5iaW5kQnVmZmVyKHBlLGkuYnVmZmVyKTtjb25zdCBvPXIuZ2V0QnVmZmVyUGFyYW1ldGVyKHBlLFVzKTtyLmJpbmRCdWZmZXIocGUsbnVsbCk7Y29uc3Qgcz1yYShyLGkudHlwZSksYT1vL3MsdT1pLm51bUNvbXBvbmVudHN8fGkuc2l6ZSxmPWEvdTtpZihmJTEhPT0wKXRocm93IG5ldyBFcnJvcihgbnVtQ29tcG9uZW50cyAke3V9IG5vdCBjb3JyZWN0IGZvciBsZW5ndGggJHtsZW5ndGh9YCk7cmV0dXJuIGZ9ZnVuY3Rpb24gaWEocixlLHQpe2NvbnN0IG49dGEocixlKSxpPU9iamVjdC5hc3NpZ24oe30sdHx8e30pO2kuYXR0cmlicz1PYmplY3QuYXNzaWduKHt9LHQ/dC5hdHRyaWJzOnt9LG4pO2NvbnN0IG89ZS5pbmRpY2VzO2lmKG8pe2NvbnN0IHM9Rm4obywiaW5kaWNlcyIpO2kuaW5kaWNlcz1TbihyLHMsQnMpLGkubnVtRWxlbWVudHM9cy5sZW5ndGgsaS5lbGVtZW50VHlwZT1pcihzKX1lbHNlIGkubnVtRWxlbWVudHN8fChpLm51bUVsZW1lbnRzPW5hKHIsaS5hdHRyaWJzKSk7cmV0dXJuIGl9ZnVuY3Rpb24gQmUocil7cmV0dXJuISFyLnRleFN0b3JhZ2UyRH1jb25zdCBQbj1mdW5jdGlvbigpe2NvbnN0IHI9e30sZT17fTtmdW5jdGlvbiB0KG4pe2NvbnN0IGk9bi5jb25zdHJ1Y3Rvci5uYW1lO2lmKCFyW2ldKXtmb3IoY29uc3QgbyBpbiBuKWlmKHR5cGVvZiBuW29dPT0ibnVtYmVyIil7Y29uc3Qgcz1lW25bb11dO2VbbltvXV09cz9gJHtzfSB8ICR7b31gOm99cltpXT0hMH19cmV0dXJuIGZ1bmN0aW9uKGksbyl7cmV0dXJuIHQoaSksZVtvXXx8KHR5cGVvZiBvPT0ibnVtYmVyIj9gMHgke28udG9TdHJpbmcoMTYpfWA6byl9fSgpLGFlPXt0ZXh0dXJlQ29sb3I6bmV3IFVpbnQ4QXJyYXkoWzEyOCwxOTIsMjU1LDI1NV0pLHRleHR1cmVPcHRpb25zOnt9LGNyb3NzT3JpZ2luOnZvaWQgMH0sVWU9YXQsRG49ZnVuY3Rpb24oKXtsZXQgcjtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gcj1yfHwodHlwZW9mIGRvY3VtZW50PCJ1IiYmZG9jdW1lbnQuY3JlYXRlRWxlbWVudD9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpOm51bGwpLHJ9fSgpLE1uPTY0MDYsWj02NDA3LEY9NjQwOCxDbj02NDA5LE9uPTY0MTAsa2U9NjQwMixObj0zNDA0MSxjdD0zMzA3MSxvYT05NzI4LHNhPTk3MjksdWU9MzU1MyxjZT0zNDA2Nyx5ZT0zMjg3OSxfZT0zNTg2Nix1cj0zNDA2OSxhYT0zNDA3MCx1YT0zNDA3MSxjYT0zNDA3MixmYT0zNDA3MyxsYT0zNDA3NCxjcj0xMDI0MSxmcj0xMDI0MCxmdD0xMDI0MixsdD0xMDI0MyxCbj0zMjg4MixkYT0zMzA4MixtYT0zMzA4MyxoYT0zMzA4NCxwYT0zMzA4NSxscj0zMzE3LFVuPTMzMTQsa249MzI4NzgsTG49MzMxNiwkbj0zMzE1LEduPTMyODc3LHlhPTM3NDQzLF9hPTM3NDQxLHhhPTM3NDQwLGJhPTMzMzIxLGdhPTM2NzU2LHZhPTMzMzI1LEVhPTMzMzI2LFRhPTMzMzMwLEFhPTMzMzI5LHdhPTMzMzM4LFJhPTMzMzM3LFNhPTMzMzQwLElhPTMzMzM5LEZhPTMzMzIzLFBhPTM2NzU3LERhPTMzMzI3LE1hPTMzMzI4LENhPTMzMzM2LE9hPTMzMzM1LE5hPTMzMzMyLEJhPTMzMzMxLFVhPTMzMzM0LGthPTMzMzMzLExhPTMyODQ5LCRhPTM1OTA1LEdhPTM2MTk0LHphPTM2NzU4LEhhPTM1ODk4LFZhPTM1OTAxLFdhPTM0ODQzLGphPTM0ODM3LHFhPTM2MjIxLFhhPTM2MjM5LFlhPTM2MjE1LEthPTM2MjMzLEphPTM2MjA5LFFhPTM2MjI3LFphPTMyODU2LGV1PTM1OTA3LHR1PTM2NzU5LHJ1PTMyODU1LG51PTMyODU0LGl1PTMyODU3LG91PTM0ODQyLHN1PTM0ODM2LGF1PTM2MjIwLHV1PTM2MjM4LGN1PTM2OTc1LGZ1PTM2MjE0LGx1PTM2MjMyLGR1PTM2MjI2LG11PTM2MjA4LGh1PTMzMTg5LHB1PTMzMTkwLHl1PTM2MDEyLF91PTM2MDEzLHh1PTM1MDU2LGZlPTUxMjAsST01MTIxLGR0PTUxMjIsU2U9NTEyMyxtdD01MTI0LHhlPTUxMjUsVT01MTI2LHpuPTMyODE5LEhuPTMyODIwLFZuPTMzNjM1LGo9NTEzMSxMZT0zNjE5Myxkcj0zMzY0MCxidT0zNTg5OSxndT0zNTkwMix2dT0zNjI2OSxFdT0zNDA0MixodD0zMzMxOSxJZT0zMzMyMCxwdD02NDAzLEZlPTM2MjQ0LFBlPTM2MjQ4LGJlPTM2MjQ5O2xldCBtcjtmdW5jdGlvbiB5dChyKXtpZighbXIpe2NvbnN0IGU9e307ZVtNbl09e3RleHR1cmVGb3JtYXQ6TW4sY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMSwyLDIsNF0sdHlwZTpbSSxqLExlLFVdfSxlW0NuXT17dGV4dHVyZUZvcm1hdDpDbixjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsxLDIsMiw0XSx0eXBlOltJLGosTGUsVV19LGVbT25dPXt0ZXh0dXJlRm9ybWF0Ok9uLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzIsNCw0LDhdLHR5cGU6W0ksaixMZSxVXX0sZVtaXT17dGV4dHVyZUZvcm1hdDpaLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzMsNiw2LDEyLDJdLHR5cGU6W0ksaixMZSxVLFZuXX0sZVtGXT17dGV4dHVyZUZvcm1hdDpGLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzQsOCw4LDE2LDIsMl0sdHlwZTpbSSxqLExlLFUsem4sSG5dfSxlW2tlXT17dGV4dHVyZUZvcm1hdDprZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50OlsyLDRdLHR5cGU6W3hlLFNlXX0sZVtiYV09e3RleHR1cmVGb3JtYXQ6cHQsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMV0sdHlwZTpbSV19LGVbZ2FdPXt0ZXh0dXJlRm9ybWF0OnB0LGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzFdLHR5cGU6W2ZlXX0sZVt2YV09e3RleHR1cmVGb3JtYXQ6cHQsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbNCwyXSx0eXBlOltVLGpdfSxlW0VhXT17dGV4dHVyZUZvcm1hdDpwdCxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols0XSx0eXBlOltVXX0sZVtUYV09e3RleHR1cmVGb3JtYXQ6RmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMV0sdHlwZTpbSV19LGVbQWFdPXt0ZXh0dXJlRm9ybWF0OkZlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzFdLHR5cGU6W2ZlXX0sZVtOYV09e3RleHR1cmVGb3JtYXQ6RmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMl0sdHlwZTpbU2VdfSxlW0JhXT17dGV4dHVyZUZvcm1hdDpGZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50OlsyXSx0eXBlOltkdF19LGVbVWFdPXt0ZXh0dXJlRm9ybWF0OkZlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W3hlXX0sZVtrYV09e3RleHR1cmVGb3JtYXQ6RmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbbXRdfSxlW0ZhXT17dGV4dHVyZUZvcm1hdDpodCxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsyXSx0eXBlOltJXX0sZVtQYV09e3RleHR1cmVGb3JtYXQ6aHQsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMl0sdHlwZTpbZmVdfSxlW0RhXT17dGV4dHVyZUZvcm1hdDpodCxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50Ols4LDRdLHR5cGU6W1Usal19LGVbTWFdPXt0ZXh0dXJlRm9ybWF0Omh0LGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzhdLHR5cGU6W1VdfSxlW0NhXT17dGV4dHVyZUZvcm1hdDpJZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50OlsyXSx0eXBlOltJXX0sZVtPYV09e3RleHR1cmVGb3JtYXQ6SWUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMl0sdHlwZTpbZmVdfSxlW3dhXT17dGV4dHVyZUZvcm1hdDpJZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols0XSx0eXBlOltTZV19LGVbUmFdPXt0ZXh0dXJlRm9ybWF0OkllLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W2R0XX0sZVtTYV09e3RleHR1cmVGb3JtYXQ6SWUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbOF0sdHlwZTpbeGVdfSxlW0lhXT17dGV4dHVyZUZvcm1hdDpJZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols4XSx0eXBlOlttdF19LGVbTGFdPXt0ZXh0dXJlRm9ybWF0OlosY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbM10sdHlwZTpbSV19LGVbJGFdPXt0ZXh0dXJlRm9ybWF0OlosY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbM10sdHlwZTpbSV19LGVbR2FdPXt0ZXh0dXJlRm9ybWF0OlosY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMywyXSx0eXBlOltJLFZuXX0sZVt6YV09e3RleHR1cmVGb3JtYXQ6Wixjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlszXSx0eXBlOltmZV19LGVbSGFdPXt0ZXh0dXJlRm9ybWF0OlosY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMTIsNiw0XSx0eXBlOltVLGosYnVdfSxlW1ZhXT17dGV4dHVyZUZvcm1hdDpaLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzEyLDYsNF0sdHlwZTpbVSxqLGd1XX0sZVtXYV09e3RleHR1cmVGb3JtYXQ6Wixjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsxMiw2XSx0eXBlOltVLGpdfSxlW2phXT17dGV4dHVyZUZvcm1hdDpaLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzEyXSx0eXBlOltVXX0sZVtxYV09e3RleHR1cmVGb3JtYXQ6UGUsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbM10sdHlwZTpbSV19LGVbWGFdPXt0ZXh0dXJlRm9ybWF0OlBlLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzNdLHR5cGU6W2ZlXX0sZVtZYV09e3RleHR1cmVGb3JtYXQ6UGUsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNl0sdHlwZTpbU2VdfSxlW0thXT17dGV4dHVyZUZvcm1hdDpQZSxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols2XSx0eXBlOltkdF19LGVbSmFdPXt0ZXh0dXJlRm9ybWF0OlBlLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzEyXSx0eXBlOlt4ZV19LGVbUWFdPXt0ZXh0dXJlRm9ybWF0OlBlLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzEyXSx0eXBlOlttdF19LGVbWmFdPXt0ZXh0dXJlRm9ybWF0OkYsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbSV19LGVbZXVdPXt0ZXh0dXJlRm9ybWF0OkYsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbSV19LGVbdHVdPXt0ZXh0dXJlRm9ybWF0OkYsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbZmVdfSxlW3J1XT17dGV4dHVyZUZvcm1hdDpGLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzQsMiw0XSx0eXBlOltJLEhuLGRyXX0sZVtudV09e3RleHR1cmVGb3JtYXQ6Rixjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50Ols0LDJdLHR5cGU6W0ksem5dfSxlW2l1XT17dGV4dHVyZUZvcm1hdDpGLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W2RyXX0sZVtvdV09e3RleHR1cmVGb3JtYXQ6Rixjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsxNiw4XSx0eXBlOltVLGpdfSxlW3N1XT17dGV4dHVyZUZvcm1hdDpGLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzE2XSx0eXBlOltVXX0sZVthdV09e3RleHR1cmVGb3JtYXQ6YmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbSV19LGVbdXVdPXt0ZXh0dXJlRm9ybWF0OmJlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W2ZlXX0sZVtjdV09e3RleHR1cmVGb3JtYXQ6YmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbZHJdfSxlW2Z1XT17dGV4dHVyZUZvcm1hdDpiZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols4XSx0eXBlOltTZV19LGVbbHVdPXt0ZXh0dXJlRm9ybWF0OmJlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzhdLHR5cGU6W2R0XX0sZVtkdV09e3RleHR1cmVGb3JtYXQ6YmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMTZdLHR5cGU6W210XX0sZVttdV09e3RleHR1cmVGb3JtYXQ6YmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMTZdLHR5cGU6W3hlXX0sZVtodV09e3RleHR1cmVGb3JtYXQ6a2UsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMiw0XSx0eXBlOltTZSx4ZV19LGVbcHVdPXt0ZXh0dXJlRm9ybWF0OmtlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W3hlXX0sZVt5dV09e3RleHR1cmVGb3JtYXQ6a2UsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbVV19LGVbeHVdPXt0ZXh0dXJlRm9ybWF0Ok5uLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W0V1XX0sZVtfdV09e3RleHR1cmVGb3JtYXQ6Tm4sY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbdnVdfSxPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2NvbnN0IG49ZVt0XTtuLmJ5dGVzUGVyRWxlbWVudE1hcD17fSxuLmJ5dGVzUGVyRWxlbWVudC5mb3JFYWNoKGZ1bmN0aW9uKGksbyl7Y29uc3Qgcz1uLnR5cGVbb107bi5ieXRlc1BlckVsZW1lbnRNYXBbc109aX0pfSksbXI9ZX1yZXR1cm4gbXJbcl19ZnVuY3Rpb24gVHUocixlKXtjb25zdCB0PXl0KHIpO2lmKCF0KXRocm93InVua25vd24gaW50ZXJuYWwgZm9ybWF0Ijtjb25zdCBuPXQuYnl0ZXNQZXJFbGVtZW50TWFwW2VdO2lmKG49PT12b2lkIDApdGhyb3cidW5rbm93biBpbnRlcm5hbCBmb3JtYXQiO3JldHVybiBufWZ1bmN0aW9uICRlKHIpe2NvbnN0IGU9eXQocik7aWYoIWUpdGhyb3cidW5rbm93biBpbnRlcm5hbCBmb3JtYXQiO3JldHVybntmb3JtYXQ6ZS50ZXh0dXJlRm9ybWF0LHR5cGU6ZS50eXBlWzBdfX1mdW5jdGlvbiBXbihyKXtyZXR1cm4ociZyLTEpPT09MH1mdW5jdGlvbiBBdShyLGUsdCxuKXtpZighQmUocikpcmV0dXJuIFduKGUpJiZXbih0KTtjb25zdCBpPXl0KG4pO2lmKCFpKXRocm93InVua25vd24gaW50ZXJuYWwgZm9ybWF0IjtyZXR1cm4gaS5jb2xvclJlbmRlcmFibGUmJmkudGV4dHVyZUZpbHRlcmFibGV9ZnVuY3Rpb24gd3Uocil7Y29uc3QgZT15dChyKTtpZighZSl0aHJvdyJ1bmtub3duIGludGVybmFsIGZvcm1hdCI7cmV0dXJuIGUudGV4dHVyZUZpbHRlcmFibGV9ZnVuY3Rpb24gUnUocixlLHQpe3JldHVybiBVZShlKT9pcihlKTp0fHxJfWZ1bmN0aW9uIF90KHIsZSx0LG4saSl7aWYoaSUxIT09MCl0aHJvdyJjYW4ndCBndWVzcyBkaW1lbnNpb25zIjtpZighdCYmIW4pe2NvbnN0IG89TWF0aC5zcXJ0KGkvKGU9PT1jZT82OjEpKTtvJTE9PT0wPyh0PW8sbj1vKToodD1pLG49MSl9ZWxzZSBpZihuKXtpZighdCYmKHQ9aS9uLHQlMSkpdGhyb3ciY2FuJ3QgZ3Vlc3MgZGltZW5zaW9ucyJ9ZWxzZSBpZihuPWkvdCxuJTEpdGhyb3ciY2FuJ3QgZ3Vlc3MgZGltZW5zaW9ucyI7cmV0dXJue3dpZHRoOnQsaGVpZ2h0Om59fWZ1bmN0aW9uIERlKHIsZSl7ZS5jb2xvcnNwYWNlQ29udmVyc2lvbiE9PXZvaWQgMCYmci5waXhlbFN0b3JlaSh5YSxlLmNvbG9yc3BhY2VDb252ZXJzaW9uKSxlLnByZW11bHRpcGx5QWxwaGEhPT12b2lkIDAmJnIucGl4ZWxTdG9yZWkoX2EsZS5wcmVtdWx0aXBseUFscGhhKSxlLmZsaXBZIT09dm9pZCAwJiZyLnBpeGVsU3RvcmVpKHhhLGUuZmxpcFkpfWZ1bmN0aW9uIGpuKHIpe3IucGl4ZWxTdG9yZWkobHIsNCksQmUocikmJihyLnBpeGVsU3RvcmVpKFVuLDApLHIucGl4ZWxTdG9yZWkoa24sMCksci5waXhlbFN0b3JlaShMbiwwKSxyLnBpeGVsU3RvcmVpKCRuLDApLHIucGl4ZWxTdG9yZWkoR24sMCkpfWZ1bmN0aW9uIFN1KHIsZSx0LG4pe24ubWluTWFnJiYodC5jYWxsKHIsZSxjcixuLm1pbk1hZyksdC5jYWxsKHIsZSxmcixuLm1pbk1hZykpLG4ubWluJiZ0LmNhbGwocixlLGNyLG4ubWluKSxuLm1hZyYmdC5jYWxsKHIsZSxmcixuLm1hZyksbi53cmFwJiYodC5jYWxsKHIsZSxmdCxuLndyYXApLHQuY2FsbChyLGUsbHQsbi53cmFwKSwoZT09PXllfHxOcyhyLGUpKSYmdC5jYWxsKHIsZSxCbixuLndyYXApKSxuLndyYXBSJiZ0LmNhbGwocixlLEJuLG4ud3JhcFIpLG4ud3JhcFMmJnQuY2FsbChyLGUsZnQsbi53cmFwUyksbi53cmFwVCYmdC5jYWxsKHIsZSxsdCxuLndyYXBUKSxuLm1pbkxvZCYmdC5jYWxsKHIsZSxkYSxuLm1pbkxvZCksbi5tYXhMb2QmJnQuY2FsbChyLGUsbWEsbi5tYXhMb2QpLG4uYmFzZUxldmVsJiZ0LmNhbGwocixlLGhhLG4uYmFzZUxldmVsKSxuLm1heExldmVsJiZ0LmNhbGwocixlLHBhLG4ubWF4TGV2ZWwpfWZ1bmN0aW9uIHFuKHIsZSx0KXtjb25zdCBuPXQudGFyZ2V0fHx1ZTtyLmJpbmRUZXh0dXJlKG4sZSksU3UocixuLHIudGV4UGFyYW1ldGVyaSx0KX1mdW5jdGlvbiBJdShyKXtyZXR1cm4gcj1yfHxhZS50ZXh0dXJlQ29sb3IsVWUocik/cjpuZXcgVWludDhBcnJheShbclswXSoyNTUsclsxXSoyNTUsclsyXSoyNTUsclszXSoyNTVdKX1mdW5jdGlvbiBocihyLGUsdCxuLGksbyl7dD10fHxhZS50ZXh0dXJlT3B0aW9ucyxvPW98fEY7Y29uc3Qgcz10LnRhcmdldHx8dWU7aWYobj1ufHx0LndpZHRoLGk9aXx8dC5oZWlnaHQsci5iaW5kVGV4dHVyZShzLGUpLEF1KHIsbixpLG8pKXIuZ2VuZXJhdGVNaXBtYXAocyk7ZWxzZXtjb25zdCBhPXd1KG8pP3NhOm9hO3IudGV4UGFyYW1ldGVyaShzLGNyLGEpLHIudGV4UGFyYW1ldGVyaShzLGZyLGEpLHIudGV4UGFyYW1ldGVyaShzLGZ0LGN0KSxyLnRleFBhcmFtZXRlcmkocyxsdCxjdCl9fWZ1bmN0aW9uIEdlKHIpe3JldHVybiByLmF1dG89PT0hMHx8ci5hdXRvPT09dm9pZCAwJiZyLmxldmVsPT09dm9pZCAwfWZ1bmN0aW9uIHByKHIsZSl7cmV0dXJuIGU9ZXx8e30sZS5jdWJlRmFjZU9yZGVyfHxbdXIsYWEsdWEsY2EsZmEsbGFdfWZ1bmN0aW9uIHlyKHIsZSl7Y29uc3Qgbj1wcihyLGUpLm1hcChmdW5jdGlvbihpLG8pe3JldHVybntmYWNlOmksbmR4Om99fSk7cmV0dXJuIG4uc29ydChmdW5jdGlvbihpLG8pe3JldHVybiBpLmZhY2Utby5mYWNlfSksbn1mdW5jdGlvbiBYbihyLGUsdCxuKXtuPW58fGFlLnRleHR1cmVPcHRpb25zO2NvbnN0IGk9bi50YXJnZXR8fHVlLG89bi5sZXZlbHx8MDtsZXQgcz10LndpZHRoLGE9dC5oZWlnaHQ7Y29uc3QgdT1uLmludGVybmFsRm9ybWF0fHxuLmZvcm1hdHx8RixmPSRlKHUpLGM9bi5mb3JtYXR8fGYuZm9ybWF0LGQ9bi50eXBlfHxmLnR5cGU7aWYoRGUocixuKSxyLmJpbmRUZXh0dXJlKGksZSksaT09PWNlKXtjb25zdCBwPXQud2lkdGgsXz10LmhlaWdodDtsZXQgbSx4O2lmKHAvNj09PV8pbT1fLHg9WzAsMCwxLDAsMiwwLDMsMCw0LDAsNSwwXTtlbHNlIGlmKF8vNj09PXApbT1wLHg9WzAsMCwwLDEsMCwyLDAsMywwLDQsMCw1XTtlbHNlIGlmKHAvMz09PV8vMiltPXAvMyx4PVswLDAsMSwwLDIsMCwwLDEsMSwxLDIsMV07ZWxzZSBpZihwLzI9PT1fLzMpbT1wLzIseD1bMCwwLDEsMCwwLDEsMSwxLDAsMiwxLDJdO2Vsc2UgdGhyb3ciY2FuJ3QgZmlndXJlIG91dCBjdWJlIG1hcCBmcm9tIGVsZW1lbnQ6ICIrKHQuc3JjP3Quc3JjOnQubm9kZU5hbWUpO2NvbnN0IHY9RG4oKTt2Pyh2LmNhbnZhcy53aWR0aD1tLHYuY2FudmFzLmhlaWdodD1tLHM9bSxhPW0seXIocixuKS5mb3JFYWNoKGZ1bmN0aW9uKGcpe2NvbnN0IEE9eFtnLm5keCoyKzBdKm0sUD14W2cubmR4KjIrMV0qbTt2LmRyYXdJbWFnZSh0LEEsUCxtLG0sMCwwLG0sbSksci50ZXhJbWFnZTJEKGcuZmFjZSxvLHUsYyxkLHYuY2FudmFzKX0pLHYuY2FudmFzLndpZHRoPTEsdi5jYW52YXMuaGVpZ2h0PTEpOnR5cGVvZiBjcmVhdGVJbWFnZUJpdG1hcDwidSImJihzPW0sYT1tLHlyKHIsbikuZm9yRWFjaChmdW5jdGlvbihnKXtjb25zdCBBPXhbZy5uZHgqMiswXSptLFA9eFtnLm5keCoyKzFdKm07ci50ZXhJbWFnZTJEKGcuZmFjZSxvLHUsbSxtLDAsYyxkLG51bGwpLGNyZWF0ZUltYWdlQml0bWFwKHQsQSxQLG0sbSx7cHJlbXVsdGlwbHlBbHBoYToibm9uZSIsY29sb3JTcGFjZUNvbnZlcnNpb246Im5vbmUifSkudGhlbihmdW5jdGlvbihDKXtEZShyLG4pLHIuYmluZFRleHR1cmUoaSxlKSxyLnRleEltYWdlMkQoZy5mYWNlLG8sdSxjLGQsQyksR2UobikmJmhyKHIsZSxuLHMsYSx1KX0pfSkpfWVsc2UgaWYoaT09PXllfHxpPT09X2Upe2NvbnN0IHA9TWF0aC5taW4odC53aWR0aCx0LmhlaWdodCksXz1NYXRoLm1heCh0LndpZHRoLHQuaGVpZ2h0KSxtPV8vcDtpZihtJTEhPT0wKXRocm93ImNhbiBub3QgY29tcHV0ZSAzRCBkaW1lbnNpb25zIG9mIGVsZW1lbnQiO2NvbnN0IHg9dC53aWR0aD09PV8/MTowLHY9dC5oZWlnaHQ9PT1fPzE6MDtyLnBpeGVsU3RvcmVpKGxyLDEpLHIucGl4ZWxTdG9yZWkoVW4sdC53aWR0aCksci5waXhlbFN0b3JlaShrbiwwKSxyLnBpeGVsU3RvcmVpKEduLDApLHIudGV4SW1hZ2UzRChpLG8sdSxwLHAscCwwLGMsZCxudWxsKTtmb3IobGV0IGc9MDtnPG07KytnKXtjb25zdCBBPWcqcCp4LFA9ZypwKnY7ci5waXhlbFN0b3JlaShMbixBKSxyLnBpeGVsU3RvcmVpKCRuLFApLHIudGV4U3ViSW1hZ2UzRChpLG8sMCwwLGcscCxwLDEsYyxkLHQpfWpuKHIpfWVsc2Ugci50ZXhJbWFnZTJEKGksbyx1LGMsZCx0KTtHZShuKSYmaHIocixlLG4scyxhLHUpLHFuKHIsZSxuKX1mdW5jdGlvbiB6ZSgpe31mdW5jdGlvbiBGdShyKXtpZih0eXBlb2YgZG9jdW1lbnQ8InUiKXtjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtyZXR1cm4gZS5ocmVmPXIsZS5ob3N0bmFtZT09PWxvY2F0aW9uLmhvc3RuYW1lJiZlLnBvcnQ9PT1sb2NhdGlvbi5wb3J0JiZlLnByb3RvY29sPT09bG9jYXRpb24ucHJvdG9jb2x9ZWxzZXtjb25zdCBlPW5ldyBVUkwobG9jYXRpb24uaHJlZikub3JpZ2luO3JldHVybiBuZXcgVVJMKHIsbG9jYXRpb24uaHJlZikub3JpZ2luPT09ZX19ZnVuY3Rpb24gUHUocixlKXtyZXR1cm4gZT09PXZvaWQgMCYmIUZ1KHIpPyJhbm9ueW1vdXMiOmV9ZnVuY3Rpb24gRHUocixlLHQpe3Q9dHx8emU7bGV0IG47aWYoZT1lIT09dm9pZCAwP2U6YWUuY3Jvc3NPcmlnaW4sZT1QdShyLGUpLHR5cGVvZiBJbWFnZTwidSIpe249bmV3IEltYWdlLGUhPT12b2lkIDAmJihuLmNyb3NzT3JpZ2luPWUpO2NvbnN0IGk9ZnVuY3Rpb24oKXtuLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIixvKSxuLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLHMpLG49bnVsbH0sbz1mdW5jdGlvbigpe2NvbnN0IHU9ImNvdWxkbid0IGxvYWQgaW1hZ2U6ICIrcjtFbih1KSx0KHUsbiksaSgpfSxzPWZ1bmN0aW9uKCl7dChudWxsLG4pLGkoKX07cmV0dXJuIG4uYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLG8pLG4uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIscyksbi5zcmM9cixufWVsc2UgaWYodHlwZW9mIEltYWdlQml0bWFwPCJ1Iil7bGV0IGksbztjb25zdCBzPWZ1bmN0aW9uKCl7dChpLG8pfSxhPXt9O2UmJihhLm1vZGU9ImNvcnMiKSxmZXRjaChyLGEpLnRoZW4oZnVuY3Rpb24odSl7aWYoIXUub2spdGhyb3cgdTtyZXR1cm4gdS5ibG9iKCl9KS50aGVuKGZ1bmN0aW9uKHUpe3JldHVybiBjcmVhdGVJbWFnZUJpdG1hcCh1LHtwcmVtdWx0aXBseUFscGhhOiJub25lIixjb2xvclNwYWNlQ29udmVyc2lvbjoibm9uZSJ9KX0pLnRoZW4oZnVuY3Rpb24odSl7bz11LHNldFRpbWVvdXQocyl9KS5jYXRjaChmdW5jdGlvbih1KXtpPXUsc2V0VGltZW91dChzKX0pLG49bnVsbH1yZXR1cm4gbn1mdW5jdGlvbiBZbihyKXtyZXR1cm4gdHlwZW9mIEltYWdlQml0bWFwPCJ1IiYmciBpbnN0YW5jZW9mIEltYWdlQml0bWFwfHx0eXBlb2YgSW1hZ2VEYXRhPCJ1IiYmciBpbnN0YW5jZW9mIEltYWdlRGF0YXx8dHlwZW9mIEhUTUxFbGVtZW50PCJ1IiYmciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50fWZ1bmN0aW9uIF9yKHIsZSx0KXtyZXR1cm4gWW4ocik/KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KG51bGwscil9KSxyKTpEdShyLGUsdCl9ZnVuY3Rpb24geHIocixlLHQpe3Q9dHx8YWUudGV4dHVyZU9wdGlvbnM7Y29uc3Qgbj10LnRhcmdldHx8dWU7aWYoci5iaW5kVGV4dHVyZShuLGUpLHQuY29sb3I9PT0hMSlyZXR1cm47Y29uc3QgaT1JdSh0LmNvbG9yKTtpZihuPT09Y2UpZm9yKGxldCBvPTA7bzw2OysrbylyLnRleEltYWdlMkQodXIrbywwLEYsMSwxLDAsRixJLGkpO2Vsc2Ugbj09PXllfHxuPT09X2U/ci50ZXhJbWFnZTNEKG4sMCxGLDEsMSwxLDAsRixJLGkpOnIudGV4SW1hZ2UyRChuLDAsRiwxLDEsMCxGLEksaSl9ZnVuY3Rpb24gTXUocixlLHQsbil7cmV0dXJuIG49bnx8emUsdD10fHxhZS50ZXh0dXJlT3B0aW9ucyx4cihyLGUsdCksdD1PYmplY3QuYXNzaWduKHt9LHQpLF9yKHQuc3JjLHQuY3Jvc3NPcmlnaW4sZnVuY3Rpb24obyxzKXtvP24obyxlLHMpOihYbihyLGUscyx0KSxuKG51bGwsZSxzKSl9KX1mdW5jdGlvbiBDdShyLGUsdCxuKXtuPW58fHplO2NvbnN0IGk9dC5zcmM7aWYoaS5sZW5ndGghPT02KXRocm93InRoZXJlIG11c3QgYmUgNiB1cmxzIGZvciBhIGN1YmVtYXAiO2NvbnN0IG89dC5sZXZlbHx8MCxzPXQuaW50ZXJuYWxGb3JtYXR8fHQuZm9ybWF0fHxGLGE9JGUocyksdT10LmZvcm1hdHx8YS5mb3JtYXQsZj10LnR5cGV8fEksYz10LnRhcmdldHx8dWU7aWYoYyE9PWNlKXRocm93InRhcmdldCBtdXN0IGJlIFRFWFRVUkVfQ1VCRV9NQVAiO3hyKHIsZSx0KSx0PU9iamVjdC5hc3NpZ24oe30sdCk7bGV0IGQ9Njtjb25zdCBwPVtdLF89cHIocix0KTtsZXQgbTtmdW5jdGlvbiB4KHYpe3JldHVybiBmdW5jdGlvbihnLEEpey0tZCxnP3AucHVzaChnKTpBLndpZHRoIT09QS5oZWlnaHQ/cC5wdXNoKCJjdWJlbWFwIGZhY2UgaW1nIGlzIG5vdCBhIHNxdWFyZTogIitBLnNyYyk6KERlKHIsdCksci5iaW5kVGV4dHVyZShjLGUpLGQ9PT01P3ByKCkuZm9yRWFjaChmdW5jdGlvbihQKXtyLnRleEltYWdlMkQoUCxvLHMsdSxmLEEpfSk6ci50ZXhJbWFnZTJEKHYsbyxzLHUsZixBKSxHZSh0KSYmci5nZW5lcmF0ZU1pcG1hcChjKSksZD09PTAmJm4ocC5sZW5ndGg/cDp2b2lkIDAsZSxtKX19bT1pLm1hcChmdW5jdGlvbih2LGcpe3JldHVybiBfcih2LHQuY3Jvc3NPcmlnaW4seChfW2ddKSl9KX1mdW5jdGlvbiBPdShyLGUsdCxuKXtuPW58fHplO2NvbnN0IGk9dC5zcmMsbz10LmludGVybmFsRm9ybWF0fHx0LmZvcm1hdHx8RixzPSRlKG8pLGE9dC5mb3JtYXR8fHMuZm9ybWF0LHU9dC50eXBlfHxJLGY9dC50YXJnZXR8fF9lO2lmKGYhPT15ZSYmZiE9PV9lKXRocm93InRhcmdldCBtdXN0IGJlIFRFWFRVUkVfM0Qgb3IgVEVYVFVSRV8yRF9BUlJBWSI7eHIocixlLHQpLHQ9T2JqZWN0LmFzc2lnbih7fSx0KTtsZXQgYz1pLmxlbmd0aDtjb25zdCBkPVtdO2xldCBwO2NvbnN0IF89dC5sZXZlbHx8MDtsZXQgbT10LndpZHRoLHg9dC5oZWlnaHQ7Y29uc3Qgdj1pLmxlbmd0aDtsZXQgZz0hMDtmdW5jdGlvbiBBKFApe3JldHVybiBmdW5jdGlvbihDLFcpe2lmKC0tYyxDKWQucHVzaChDKTtlbHNle2lmKERlKHIsdCksci5iaW5kVGV4dHVyZShmLGUpLGcpe2c9ITEsbT10LndpZHRofHxXLndpZHRoLHg9dC5oZWlnaHR8fFcuaGVpZ2h0LHIudGV4SW1hZ2UzRChmLF8sbyxtLHgsdiwwLGEsdSxudWxsKTtmb3IobGV0IGllPTA7aWU8djsrK2llKXIudGV4U3ViSW1hZ2UzRChmLF8sMCwwLGllLG0seCwxLGEsdSxXKX1lbHNle2xldCBpZT1XLFg7KFcud2lkdGghPT1tfHxXLmhlaWdodCE9PXgpJiYoWD1EbigpLGllPVguY2FudmFzLFguY2FudmFzLndpZHRoPW0sWC5jYW52YXMuaGVpZ2h0PXgsWC5kcmF3SW1hZ2UoVywwLDAsbSx4KSksci50ZXhTdWJJbWFnZTNEKGYsXywwLDAsUCxtLHgsMSxhLHUsaWUpLFgmJmllPT09WC5jYW52YXMmJihYLmNhbnZhcy53aWR0aD0wLFguY2FudmFzLmhlaWdodD0wKX1HZSh0KSYmci5nZW5lcmF0ZU1pcG1hcChmKX1jPT09MCYmbihkLmxlbmd0aD9kOnZvaWQgMCxlLHApfX1wPWkubWFwKGZ1bmN0aW9uKFAsQyl7cmV0dXJuIF9yKFAsdC5jcm9zc09yaWdpbixBKEMpKX0pfWZ1bmN0aW9uIE51KHIsZSx0LG4pe249bnx8YWUudGV4dHVyZU9wdGlvbnM7Y29uc3QgaT1uLnRhcmdldHx8dWU7ci5iaW5kVGV4dHVyZShpLGUpO2xldCBvPW4ud2lkdGgscz1uLmhlaWdodCxhPW4uZGVwdGg7Y29uc3QgdT1uLmxldmVsfHwwLGY9bi5pbnRlcm5hbEZvcm1hdHx8bi5mb3JtYXR8fEYsYz0kZShmKSxkPW4uZm9ybWF0fHxjLmZvcm1hdCxwPW4udHlwZXx8UnUocix0LGMudHlwZSk7aWYoVWUodCkpdCBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5JiYodD1uZXcgVWludDhBcnJheSh0LmJ1ZmZlcikpO2Vsc2V7Y29uc3Qgdj12bihwKTt0PW5ldyB2KHQpfWNvbnN0IF89VHUoZixwKSxtPXQuYnl0ZUxlbmd0aC9fO2lmKG0lMSl0aHJvdyJsZW5ndGggd3Jvbmcgc2l6ZSBmb3IgZm9ybWF0OiAiK1BuKHIsZCk7bGV0IHg7aWYoaT09PXllfHxpPT09X2UpaWYoIW8mJiFzJiYhYSl7Y29uc3Qgdj1NYXRoLmNicnQobSk7aWYodiUxIT09MCl0aHJvdyJjYW4ndCBndWVzcyBjdWJlIHNpemUgb2YgYXJyYXkgb2YgbnVtRWxlbWVudHM6ICIrbTtvPXYscz12LGE9dn1lbHNlIG8mJighc3x8IWEpPyh4PV90KHIsaSxzLGEsbS9vKSxzPXgud2lkdGgsYT14LmhlaWdodCk6cyYmKCFvfHwhYSk/KHg9X3QocixpLG8sYSxtL3MpLG89eC53aWR0aCxhPXguaGVpZ2h0KTooeD1fdChyLGksbyxzLG0vYSksbz14LndpZHRoLHM9eC5oZWlnaHQpO2Vsc2UgeD1fdChyLGksbyxzLG0pLG89eC53aWR0aCxzPXguaGVpZ2h0O2lmKGpuKHIpLHIucGl4ZWxTdG9yZWkobHIsbi51bnBhY2tBbGlnbm1lbnR8fDEpLERlKHIsbiksaT09PWNlKXtjb25zdCB2PV8vdC5CWVRFU19QRVJfRUxFTUVOVCxnPW0vNip2O3lyKHIsbikuZm9yRWFjaChBPT57Y29uc3QgUD1nKkEubmR4LEM9dC5zdWJhcnJheShQLFArZyk7ci50ZXhJbWFnZTJEKEEuZmFjZSx1LGYsbyxzLDAsZCxwLEMpfSl9ZWxzZSBpPT09eWV8fGk9PT1fZT9yLnRleEltYWdlM0QoaSx1LGYsbyxzLGEsMCxkLHAsdCk6ci50ZXhJbWFnZTJEKGksdSxmLG8scywwLGQscCx0KTtyZXR1cm57d2lkdGg6byxoZWlnaHQ6cyxkZXB0aDphLHR5cGU6cH19ZnVuY3Rpb24gQnUocixlLHQpe2NvbnN0IG49dC50YXJnZXR8fHVlO3IuYmluZFRleHR1cmUobixlKTtjb25zdCBpPXQubGV2ZWx8fDAsbz10LmludGVybmFsRm9ybWF0fHx0LmZvcm1hdHx8RixzPSRlKG8pLGE9dC5mb3JtYXR8fHMuZm9ybWF0LHU9dC50eXBlfHxzLnR5cGU7aWYoRGUocix0KSxuPT09Y2UpZm9yKGxldCBmPTA7Zjw2OysrZilyLnRleEltYWdlMkQodXIrZixpLG8sdC53aWR0aCx0LmhlaWdodCwwLGEsdSxudWxsKTtlbHNlIG49PT15ZXx8bj09PV9lP3IudGV4SW1hZ2UzRChuLGksbyx0LndpZHRoLHQuaGVpZ2h0LHQuZGVwdGgsMCxhLHUsbnVsbCk6ci50ZXhJbWFnZTJEKG4saSxvLHQud2lkdGgsdC5oZWlnaHQsMCxhLHUsbnVsbCl9ZnVuY3Rpb24gS24ocixlLHQpe3Q9dHx8emUsZT1lfHxhZS50ZXh0dXJlT3B0aW9ucztjb25zdCBuPXIuY3JlYXRlVGV4dHVyZSgpLGk9ZS50YXJnZXR8fHVlO2xldCBvPWUud2lkdGh8fDEscz1lLmhlaWdodHx8MTtjb25zdCBhPWUuaW50ZXJuYWxGb3JtYXR8fEY7ci5iaW5kVGV4dHVyZShpLG4pLGk9PT1jZSYmKHIudGV4UGFyYW1ldGVyaShpLGZ0LGN0KSxyLnRleFBhcmFtZXRlcmkoaSxsdCxjdCkpO2xldCB1PWUuc3JjO2lmKHUpaWYodHlwZW9mIHU9PSJmdW5jdGlvbiImJih1PXUocixlKSksdHlwZW9mIHU9PSJzdHJpbmciKU11KHIsbixlLHQpO2Vsc2UgaWYoVWUodSl8fEFycmF5LmlzQXJyYXkodSkmJih0eXBlb2YgdVswXT09Im51bWJlciJ8fEFycmF5LmlzQXJyYXkodVswXSl8fFVlKHVbMF0pKSl7Y29uc3QgZj1OdShyLG4sdSxlKTtvPWYud2lkdGgscz1mLmhlaWdodH1lbHNlIEFycmF5LmlzQXJyYXkodSkmJih0eXBlb2YgdVswXT09InN0cmluZyJ8fFluKHVbMF0pKT9pPT09Y2U/Q3UocixuLGUsdCk6T3UocixuLGUsdCk6KFhuKHIsbix1LGUpLG89dS53aWR0aCxzPXUuaGVpZ2h0KTtlbHNlIEJ1KHIsbixlKTtyZXR1cm4gR2UoZSkmJmhyKHIsbixlLG8scyxhKSxxbihyLG4sZSksbn1jb25zdCBicj1FbjtmdW5jdGlvbiBKbihyKXtyZXR1cm4gdHlwZW9mIGRvY3VtZW50PCJ1IiYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocik6bnVsbH1jb25zdCB4dD0zMzk4NCxidD0zNDk2MixVdT0zNDk2MyxrdT0zNTcxMyxMdT0zNTcxNCwkdT0zNTYzMixHdT0zNTYzMyx6dT0zNTk4MSxRbj0zNTcxOCxIdT0zNTcyMSxWdT0zNTk3MSxXdT0zNTM4MixqdT0zNTM5NixxdT0zNTM5OCxYdT0zNTM5MixZdT0zNTM5NSxndD01MTI2LFpuPTM1NjY0LGVpPTM1NjY1LHRpPTM1NjY2LGdyPTUxMjQscmk9MzU2Njcsbmk9MzU2NjgsaWk9MzU2Njksb2k9MzU2NzAsc2k9MzU2NzEsYWk9MzU2NzIsdWk9MzU2NzMsY2k9MzU2NzQsZmk9MzU2NzUsbGk9MzU2NzYsS3U9MzU2NzgsSnU9MzU2ODAsUXU9MzU2NzksWnU9MzU2ODIsZWM9MzU2ODUsdGM9MzU2ODYscmM9MzU2ODcsbmM9MzU2ODgsaWM9MzU2ODksb2M9MzU2OTAsc2M9MzYyODksYWM9MzYyOTIsdWM9MzYyOTMsdnI9NTEyNSxkaT0zNjI5NCxtaT0zNjI5NSxoaT0zNjI5NixjYz0zNjI5OCxmYz0zNjI5OSxsYz0zNjMwMCxkYz0zNjMwMyxtYz0zNjMwNixoYz0zNjMwNyxwYz0zNjMwOCx5Yz0zNjMxMSx2dD0zNTUzLEV0PTM0MDY3LEVyPTMyODc5LFR0PTM1ODY2LEU9e307ZnVuY3Rpb24gcGkocixlKXtyZXR1cm4gRVtlXS5iaW5kUG9pbnR9ZnVuY3Rpb24gX2MocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtMWYoZSx0KX19ZnVuY3Rpb24geGMocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtMWZ2KGUsdCl9fWZ1bmN0aW9uIGJjKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybTJmdihlLHQpfX1mdW5jdGlvbiBnYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm0zZnYoZSx0KX19ZnVuY3Rpb24gdmMocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtNGZ2KGUsdCl9fWZ1bmN0aW9uIHlpKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybTFpKGUsdCl9fWZ1bmN0aW9uIF9pKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybTFpdihlLHQpfX1mdW5jdGlvbiB4aShyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm0yaXYoZSx0KX19ZnVuY3Rpb24gYmkocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtM2l2KGUsdCl9fWZ1bmN0aW9uIGdpKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybTRpdihlLHQpfX1mdW5jdGlvbiBFYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm0xdWkoZSx0KX19ZnVuY3Rpb24gVGMocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtMXVpdihlLHQpfX1mdW5jdGlvbiBBYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm0ydWl2KGUsdCl9fWZ1bmN0aW9uIHdjKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybTN1aXYoZSx0KX19ZnVuY3Rpb24gUmMocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtNHVpdihlLHQpfX1mdW5jdGlvbiBTYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXgyZnYoZSwhMSx0KX19ZnVuY3Rpb24gSWMocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtTWF0cml4M2Z2KGUsITEsdCl9fWZ1bmN0aW9uIEZjKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybU1hdHJpeDRmdihlLCExLHQpfX1mdW5jdGlvbiBQYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXgyeDNmdihlLCExLHQpfX1mdW5jdGlvbiBEYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXgzeDJmdihlLCExLHQpfX1mdW5jdGlvbiBNYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXgyeDRmdihlLCExLHQpfX1mdW5jdGlvbiBDYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXg0eDJmdihlLCExLHQpfX1mdW5jdGlvbiBPYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXgzeDRmdihlLCExLHQpfX1mdW5jdGlvbiBOYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXg0eDNmdihlLCExLHQpfX1mdW5jdGlvbiBMKHIsZSx0LG4pe2NvbnN0IGk9cGkocixlKTtyZXR1cm4gQmUocik/ZnVuY3Rpb24obyl7bGV0IHMsYTtvcihyLG8pPyhzPW8sYT1udWxsKToocz1vLnRleHR1cmUsYT1vLnNhbXBsZXIpLHIudW5pZm9ybTFpKG4sdCksci5hY3RpdmVUZXh0dXJlKHh0K3QpLHIuYmluZFRleHR1cmUoaSxzKSxyLmJpbmRTYW1wbGVyKHQsYSl9OmZ1bmN0aW9uKG8pe3IudW5pZm9ybTFpKG4sdCksci5hY3RpdmVUZXh0dXJlKHh0K3QpLHIuYmluZFRleHR1cmUoaSxvKX19ZnVuY3Rpb24gJChyLGUsdCxuLGkpe2NvbnN0IG89cGkocixlKSxzPW5ldyBJbnQzMkFycmF5KGkpO2ZvcihsZXQgYT0wO2E8aTsrK2Epc1thXT10K2E7cmV0dXJuIEJlKHIpP2Z1bmN0aW9uKGEpe3IudW5pZm9ybTFpdihuLHMpLGEuZm9yRWFjaChmdW5jdGlvbih1LGYpe3IuYWN0aXZlVGV4dHVyZSh4dCtzW2ZdKTtsZXQgYyxkO29yKHIsdSk/KGM9dSxkPW51bGwpOihjPXUudGV4dHVyZSxkPXUuc2FtcGxlciksci5iaW5kU2FtcGxlcih0LGQpLHIuYmluZFRleHR1cmUobyxjKX0pfTpmdW5jdGlvbihhKXtyLnVuaWZvcm0xaXYobixzKSxhLmZvckVhY2goZnVuY3Rpb24odSxmKXtyLmFjdGl2ZVRleHR1cmUoeHQrc1tmXSksci5iaW5kVGV4dHVyZShvLHUpfSl9fUVbZ3RdPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjQsc2V0dGVyOl9jLGFycmF5U2V0dGVyOnhjfSxFW1puXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTo4LHNldHRlcjpiYyxjb2xzOjJ9LEVbZWldPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjEyLHNldHRlcjpnYyxjb2xzOjN9LEVbdGldPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjE2LHNldHRlcjp2Yyxjb2xzOjR9LEVbZ3JdPXtUeXBlOkludDMyQXJyYXksc2l6ZTo0LHNldHRlcjp5aSxhcnJheVNldHRlcjpfaX0sRVtyaV09e1R5cGU6SW50MzJBcnJheSxzaXplOjgsc2V0dGVyOnhpLGNvbHM6Mn0sRVtuaV09e1R5cGU6SW50MzJBcnJheSxzaXplOjEyLHNldHRlcjpiaSxjb2xzOjN9LEVbaWldPXtUeXBlOkludDMyQXJyYXksc2l6ZToxNixzZXR0ZXI6Z2ksY29sczo0fSxFW3ZyXT17VHlwZTpVaW50MzJBcnJheSxzaXplOjQsc2V0dGVyOkVjLGFycmF5U2V0dGVyOlRjfSxFW2RpXT17VHlwZTpVaW50MzJBcnJheSxzaXplOjgsc2V0dGVyOkFjLGNvbHM6Mn0sRVttaV09e1R5cGU6VWludDMyQXJyYXksc2l6ZToxMixzZXR0ZXI6d2MsY29sczozfSxFW2hpXT17VHlwZTpVaW50MzJBcnJheSxzaXplOjE2LHNldHRlcjpSYyxjb2xzOjR9LEVbb2ldPXtUeXBlOlVpbnQzMkFycmF5LHNpemU6NCxzZXR0ZXI6eWksYXJyYXlTZXR0ZXI6X2l9LEVbc2ldPXtUeXBlOlVpbnQzMkFycmF5LHNpemU6OCxzZXR0ZXI6eGksY29sczoyfSxFW2FpXT17VHlwZTpVaW50MzJBcnJheSxzaXplOjEyLHNldHRlcjpiaSxjb2xzOjN9LEVbdWldPXtUeXBlOlVpbnQzMkFycmF5LHNpemU6MTYsc2V0dGVyOmdpLGNvbHM6NH0sRVtjaV09e1R5cGU6RmxvYXQzMkFycmF5LHNpemU6MzIsc2V0dGVyOlNjLHJvd3M6Mixjb2xzOjJ9LEVbZmldPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjQ4LHNldHRlcjpJYyxyb3dzOjMsY29sczozfSxFW2xpXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTo2NCxzZXR0ZXI6RmMscm93czo0LGNvbHM6NH0sRVtlY109e1R5cGU6RmxvYXQzMkFycmF5LHNpemU6MzIsc2V0dGVyOlBjLHJvd3M6Mixjb2xzOjN9LEVbdGNdPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjMyLHNldHRlcjpNYyxyb3dzOjIsY29sczo0fSxFW3JjXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTo0OCxzZXR0ZXI6RGMscm93czozLGNvbHM6Mn0sRVtuY109e1R5cGU6RmxvYXQzMkFycmF5LHNpemU6NDgsc2V0dGVyOk9jLHJvd3M6Myxjb2xzOjR9LEVbaWNdPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjY0LHNldHRlcjpDYyxyb3dzOjQsY29sczoyfSxFW29jXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTo2NCxzZXR0ZXI6TmMscm93czo0LGNvbHM6M30sRVtLdV09e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkwsYXJyYXlTZXR0ZXI6JCxiaW5kUG9pbnQ6dnR9LEVbSnVdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpMLGFycmF5U2V0dGVyOiQsYmluZFBvaW50OkV0fSxFW1F1XT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6TCxhcnJheVNldHRlcjokLGJpbmRQb2ludDpFcn0sRVtadV09e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkwsYXJyYXlTZXR0ZXI6JCxiaW5kUG9pbnQ6dnR9LEVbc2NdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpMLGFycmF5U2V0dGVyOiQsYmluZFBvaW50OlR0fSxFW2FjXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6TCxhcnJheVNldHRlcjokLGJpbmRQb2ludDpUdH0sRVt1Y109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkwsYXJyYXlTZXR0ZXI6JCxiaW5kUG9pbnQ6RXR9LEVbY2NdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpMLGFycmF5U2V0dGVyOiQsYmluZFBvaW50OnZ0fSxFW2ZjXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6TCxhcnJheVNldHRlcjokLGJpbmRQb2ludDpFcn0sRVtsY109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkwsYXJyYXlTZXR0ZXI6JCxiaW5kUG9pbnQ6RXR9LEVbZGNdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpMLGFycmF5U2V0dGVyOiQsYmluZFBvaW50OlR0fSxFW21jXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6TCxhcnJheVNldHRlcjokLGJpbmRQb2ludDp2dH0sRVtoY109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkwsYXJyYXlTZXR0ZXI6JCxiaW5kUG9pbnQ6RXJ9LEVbcGNdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpMLGFycmF5U2V0dGVyOiQsYmluZFBvaW50OkV0fSxFW3ljXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6TCxhcnJheVNldHRlcjokLGJpbmRQb2ludDpUdH07ZnVuY3Rpb24gQXQocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7aWYodC52YWx1ZSlzd2l0Y2goci5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoZSksdC52YWx1ZS5sZW5ndGgpe2Nhc2UgNDpyLnZlcnRleEF0dHJpYjRmdihlLHQudmFsdWUpO2JyZWFrO2Nhc2UgMzpyLnZlcnRleEF0dHJpYjNmdihlLHQudmFsdWUpO2JyZWFrO2Nhc2UgMjpyLnZlcnRleEF0dHJpYjJmdihlLHQudmFsdWUpO2JyZWFrO2Nhc2UgMTpyLnZlcnRleEF0dHJpYjFmdihlLHQudmFsdWUpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJ0aGUgbGVuZ3RoIG9mIGEgZmxvYXQgY29uc3RhbnQgdmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDQhIil9ZWxzZSByLmJpbmRCdWZmZXIoYnQsdC5idWZmZXIpLHIuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoZSksci52ZXJ0ZXhBdHRyaWJQb2ludGVyKGUsdC5udW1Db21wb25lbnRzfHx0LnNpemUsdC50eXBlfHxndCx0Lm5vcm1hbGl6ZXx8ITEsdC5zdHJpZGV8fDAsdC5vZmZzZXR8fDApLHIudmVydGV4QXR0cmliRGl2aXNvciYmci52ZXJ0ZXhBdHRyaWJEaXZpc29yKGUsdC5kaXZpc29yfHwwKX19ZnVuY3Rpb24gbGUocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7aWYodC52YWx1ZSlpZihyLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShlKSx0LnZhbHVlLmxlbmd0aD09PTQpci52ZXJ0ZXhBdHRyaWI0aXYoZSx0LnZhbHVlKTtlbHNlIHRocm93IG5ldyBFcnJvcigiVGhlIGxlbmd0aCBvZiBhbiBpbnRlZ2VyIGNvbnN0YW50IHZhbHVlIG11c3QgYmUgNCEiKTtlbHNlIHIuYmluZEJ1ZmZlcihidCx0LmJ1ZmZlciksci5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShlKSxyLnZlcnRleEF0dHJpYklQb2ludGVyKGUsdC5udW1Db21wb25lbnRzfHx0LnNpemUsdC50eXBlfHxncix0LnN0cmlkZXx8MCx0Lm9mZnNldHx8MCksci52ZXJ0ZXhBdHRyaWJEaXZpc29yJiZyLnZlcnRleEF0dHJpYkRpdmlzb3IoZSx0LmRpdmlzb3J8fDApfX1mdW5jdGlvbiB3dChyLGUpe3JldHVybiBmdW5jdGlvbih0KXtpZih0LnZhbHVlKWlmKHIuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGUpLHQudmFsdWUubGVuZ3RoPT09NClyLnZlcnRleEF0dHJpYjR1aXYoZSx0LnZhbHVlKTtlbHNlIHRocm93IG5ldyBFcnJvcigiVGhlIGxlbmd0aCBvZiBhbiB1bnNpZ25lZCBpbnRlZ2VyIGNvbnN0YW50IHZhbHVlIG11c3QgYmUgNCEiKTtlbHNlIHIuYmluZEJ1ZmZlcihidCx0LmJ1ZmZlciksci5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShlKSxyLnZlcnRleEF0dHJpYklQb2ludGVyKGUsdC5udW1Db21wb25lbnRzfHx0LnNpemUsdC50eXBlfHx2cix0LnN0cmlkZXx8MCx0Lm9mZnNldHx8MCksci52ZXJ0ZXhBdHRyaWJEaXZpc29yJiZyLnZlcnRleEF0dHJpYkRpdmlzb3IoZSx0LmRpdmlzb3J8fDApfX1mdW5jdGlvbiBUcihyLGUsdCl7Y29uc3Qgbj10LnNpemUsaT10LmNvdW50O3JldHVybiBmdW5jdGlvbihvKXtyLmJpbmRCdWZmZXIoYnQsby5idWZmZXIpO2NvbnN0IHM9by5zaXplfHxvLm51bUNvbXBvbmVudHN8fG4sYT1zL2ksdT1vLnR5cGV8fGd0LGM9RVt1XS5zaXplKnMsZD1vLm5vcm1hbGl6ZXx8ITEscD1vLm9mZnNldHx8MCxfPWMvaTtmb3IobGV0IG09MDttPGk7KyttKXIuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoZSttKSxyLnZlcnRleEF0dHJpYlBvaW50ZXIoZSttLGEsdSxkLGMscCtfKm0pLHIudmVydGV4QXR0cmliRGl2aXNvciYmci52ZXJ0ZXhBdHRyaWJEaXZpc29yKGUrbSxvLmRpdmlzb3J8fDApfX1jb25zdCBEPXt9O0RbZ3RdPXtzaXplOjQsc2V0dGVyOkF0fSxEW1puXT17c2l6ZTo4LHNldHRlcjpBdH0sRFtlaV09e3NpemU6MTIsc2V0dGVyOkF0fSxEW3RpXT17c2l6ZToxNixzZXR0ZXI6QXR9LERbZ3JdPXtzaXplOjQsc2V0dGVyOmxlfSxEW3JpXT17c2l6ZTo4LHNldHRlcjpsZX0sRFtuaV09e3NpemU6MTIsc2V0dGVyOmxlfSxEW2lpXT17c2l6ZToxNixzZXR0ZXI6bGV9LERbdnJdPXtzaXplOjQsc2V0dGVyOnd0fSxEW2RpXT17c2l6ZTo4LHNldHRlcjp3dH0sRFttaV09e3NpemU6MTIsc2V0dGVyOnd0fSxEW2hpXT17c2l6ZToxNixzZXR0ZXI6d3R9LERbb2ldPXtzaXplOjQsc2V0dGVyOmxlfSxEW3NpXT17c2l6ZTo4LHNldHRlcjpsZX0sRFthaV09e3NpemU6MTIsc2V0dGVyOmxlfSxEW3VpXT17c2l6ZToxNixzZXR0ZXI6bGV9LERbY2ldPXtzaXplOjQsc2V0dGVyOlRyLGNvdW50OjJ9LERbZmldPXtzaXplOjksc2V0dGVyOlRyLGNvdW50OjN9LERbbGldPXtzaXplOjE2LHNldHRlcjpUcixjb3VudDo0fTtjb25zdCBCYz0vRVJST1I6XHMqXGQrOihcZCspL2dpO2Z1bmN0aW9uIFVjKHIsZT0iIix0PTApe2NvbnN0IG49Wy4uLmUubWF0Y2hBbGwoQmMpXSxpPW5ldyBNYXAobi5tYXAoKG8scyk9Pntjb25zdCBhPXBhcnNlSW50KG9bMV0pLHU9bltzKzFdLGY9dT91LmluZGV4OmUubGVuZ3RoLGM9ZS5zdWJzdHJpbmcoby5pbmRleCxmKTtyZXR1cm5bYS0xLGNdfSkpO3JldHVybiByLnNwbGl0KGAKYCkubWFwKChvLHMpPT57Y29uc3QgYT1pLmdldChzKTtyZXR1cm5gJHtzKzErdH06ICR7b30ke2E/YAoKXl5eICR7YX1gOiIifWB9KS5qb2luKGAKYCl9Y29uc3Qgdmk9L15bIFx0XSpcbi87ZnVuY3Rpb24gRWkocil7bGV0IGU9MDtyZXR1cm4gdmkudGVzdChyKSYmKGU9MSxyPXIucmVwbGFjZSh2aSwiIikpLHtsaW5lT2Zmc2V0OmUsc2hhZGVyU291cmNlOnJ9fWZ1bmN0aW9uIGtjKHIsZSl7cmV0dXJuIHIuZXJyb3JDYWxsYmFjayhlKSxyLmNhbGxiYWNrJiZzZXRUaW1lb3V0KCgpPT57ci5jYWxsYmFjayhgJHtlfQoke3IuZXJyb3JzLmpvaW4oYApgKX1gKX0pLG51bGx9ZnVuY3Rpb24gTGMocixlLHQsbil7aWYobj1ufHxiciwhci5nZXRTaGFkZXJQYXJhbWV0ZXIodCxrdSkpe2NvbnN0IG89ci5nZXRTaGFkZXJJbmZvTG9nKHQpLHtsaW5lT2Zmc2V0OnMsc2hhZGVyU291cmNlOmF9PUVpKHIuZ2V0U2hhZGVyU291cmNlKHQpKSx1PWAke1VjKGEsbyxzKX0KRXJyb3IgY29tcGlsaW5nICR7UG4ocixlKX06ICR7b31gO3JldHVybiBuKHUpLHV9cmV0dXJuIiJ9ZnVuY3Rpb24gQXIocixlLHQpe2xldCBuLGksbztpZih0eXBlb2YgZT09ImZ1bmN0aW9uIiYmKHQ9ZSxlPXZvaWQgMCksdHlwZW9mIHI9PSJmdW5jdGlvbiIpdD1yLHI9dm9pZCAwO2Vsc2UgaWYociYmIUFycmF5LmlzQXJyYXkocikpe2NvbnN0IGY9cjt0PWYuZXJyb3JDYWxsYmFjayxyPWYuYXR0cmliTG9jYXRpb25zLG49Zi50cmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmdzLGk9Zi50cmFuc2Zvcm1GZWVkYmFja01vZGUsbz1mLmNhbGxiYWNrfWNvbnN0IHM9dHx8YnIsYT1bXSx1PXtlcnJvckNhbGxiYWNrKGYsLi4uYyl7YS5wdXNoKGYpLHMoZiwuLi5jKX0sdHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5nczpuLHRyYW5zZm9ybUZlZWRiYWNrTW9kZTppLGNhbGxiYWNrOm8sZXJyb3JzOmF9O3tsZXQgZj17fTtBcnJheS5pc0FycmF5KHIpP3IuZm9yRWFjaChmdW5jdGlvbihjLGQpe2ZbY109ZT9lW2RdOmR9KTpmPXJ8fHt9LHUuYXR0cmliTG9jYXRpb25zPWZ9cmV0dXJuIHV9Y29uc3QgJGM9WyJWRVJURVhfU0hBREVSIiwiRlJBR01FTlRfU0hBREVSIl07ZnVuY3Rpb24gR2MocixlKXtpZihlLmluZGV4T2YoImZyYWciKT49MClyZXR1cm4gJHU7aWYoZS5pbmRleE9mKCJ2ZXJ0Iik+PTApcmV0dXJuIEd1fWZ1bmN0aW9uIHpjKHIsZSx0KXtjb25zdCBuPXIuZ2V0QXR0YWNoZWRTaGFkZXJzKGUpO2Zvcihjb25zdCBpIG9mIG4pdC5oYXMoaSkmJnIuZGVsZXRlU2hhZGVyKGkpO3IuZGVsZXRlUHJvZ3JhbShlKX1jb25zdCBIYz0ocj0wKT0+bmV3IFByb21pc2UoZT0+c2V0VGltZW91dChlLHIpKTtmdW5jdGlvbiBWYyhyLGUsdCl7Y29uc3Qgbj1yLmNyZWF0ZVByb2dyYW0oKSx7YXR0cmliTG9jYXRpb25zOmksdHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5nczpvLHRyYW5zZm9ybUZlZWRiYWNrTW9kZTpzfT1Bcih0KTtmb3IobGV0IGE9MDthPGUubGVuZ3RoOysrYSl7bGV0IHU9ZVthXTtpZih0eXBlb2YgdT09InN0cmluZyIpe2NvbnN0IGY9Sm4odSksYz1mP2YudGV4dDp1O2xldCBkPXJbJGNbYV1dO2YmJmYudHlwZSYmKGQ9R2MocixmLnR5cGUpfHxkKSx1PXIuY3JlYXRlU2hhZGVyKGQpLHIuc2hhZGVyU291cmNlKHUsRWkoYykuc2hhZGVyU291cmNlKSxyLmNvbXBpbGVTaGFkZXIodSksci5hdHRhY2hTaGFkZXIobix1KX19T2JqZWN0LmVudHJpZXMoaSkuZm9yRWFjaCgoW2EsdV0pPT5yLmJpbmRBdHRyaWJMb2NhdGlvbihuLHUsYSkpO3tsZXQgYT1vO2EmJihhLmF0dHJpYnMmJihhPWEuYXR0cmlicyksQXJyYXkuaXNBcnJheShhKXx8KGE9T2JqZWN0LmtleXMoYSkpLHIudHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5ncyhuLGEsc3x8enUpKX1yZXR1cm4gci5saW5rUHJvZ3JhbShuKSxufWZ1bmN0aW9uIFdjKHIsZSx0LG4saSl7Y29uc3Qgbz1Bcih0LG4saSkscz1uZXcgU2V0KGUpLGE9VmMocixlLG8pO2Z1bmN0aW9uIHUoZixjKXtjb25zdCBkPXFjKGYsYyxvLmVycm9yQ2FsbGJhY2spO3JldHVybiBkJiZ6YyhmLGMscyksZH1pZihvLmNhbGxiYWNrKXtqYyhyLGEpLnRoZW4oKCk9Pntjb25zdCBmPXUocixhKTtvLmNhbGxiYWNrKGYsZj92b2lkIDA6YSl9KTtyZXR1cm59cmV0dXJuIHUocixhKT92b2lkIDA6YX1hc3luYyBmdW5jdGlvbiBqYyhyLGUpe2NvbnN0IHQ9ci5nZXRFeHRlbnNpb24oIktIUl9wYXJhbGxlbF9zaGFkZXJfY29tcGlsZSIpLG49dD8obyxzKT0+by5nZXRQcm9ncmFtUGFyYW1ldGVyKHMsdC5DT01QTEVUSU9OX1NUQVRVU19LSFIpOigpPT4hMDtsZXQgaT0wO2RvIGF3YWl0IEhjKGkpLGk9MWUzLzYwO3doaWxlKCFuKHIsZSkpfWZ1bmN0aW9uIHFjKHIsZSx0KXtpZih0PXR8fGJyLCFyLmdldFByb2dyYW1QYXJhbWV0ZXIoZSxMdSkpe2NvbnN0IGk9ci5nZXRQcm9ncmFtSW5mb0xvZyhlKTt0KGBFcnJvciBpbiBwcm9ncmFtIGxpbmtpbmc6ICR7aX1gKTtjb25zdCBzPXIuZ2V0QXR0YWNoZWRTaGFkZXJzKGUpLm1hcChhPT5MYyhyLHIuZ2V0U2hhZGVyUGFyYW1ldGVyKGEsci5TSEFERVJfVFlQRSksYSx0KSk7cmV0dXJuYCR7aX0KJHtzLmZpbHRlcihhPT5hKS5qb2luKGAKYCl9YH19ZnVuY3Rpb24gWGMocixlLHQsbixpKXtyZXR1cm4gV2MocixlLHQsbixpKX1mdW5jdGlvbiBUaShyKXtjb25zdCBlPXIubmFtZTtyZXR1cm4gZS5zdGFydHNXaXRoKCJnbF8iKXx8ZS5zdGFydHNXaXRoKCJ3ZWJnbF8iKX1jb25zdCBZYz0vKFwufFxbfF18XHcrKS9nLEtjPXI9PnI+PSIwIiYmcjw9IjkiO2Z1bmN0aW9uIEpjKHIsZSx0LG4pe2NvbnN0IGk9ci5zcGxpdChZYykuZmlsdGVyKGE9PmEhPT0iIik7bGV0IG89MCxzPSIiO2Zvcig7Oyl7Y29uc3QgYT1pW28rK107cys9YTtjb25zdCB1PUtjKGFbMF0pLGY9dT9wYXJzZUludChhKTphO2lmKHUmJihzKz1pW28rK10pLG89PT1pLmxlbmd0aCl7dFtmXT1lO2JyZWFrfWVsc2V7Y29uc3QgZD1pW28rK10scD1kPT09IlsiLF89dFtmXXx8KHA/W106e30pO3RbZl09Xyx0PV8sbltzXT1uW3NdfHxmdW5jdGlvbihtKXtyZXR1cm4gZnVuY3Rpb24oeCl7QWkobSx4KX19KF8pLHMrPWR9fX1mdW5jdGlvbiBRYyhyLGUpe2xldCB0PTA7ZnVuY3Rpb24gbihhLHUsZil7Y29uc3QgYz11Lm5hbWUuZW5kc1dpdGgoIlswXSIpLGQ9dS50eXBlLHA9RVtkXTtpZighcCl0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gdHlwZTogMHgke2QudG9TdHJpbmcoMTYpfWApO2xldCBfO2lmKHAuYmluZFBvaW50KXtjb25zdCBtPXQ7dCs9dS5zaXplLGM/Xz1wLmFycmF5U2V0dGVyKHIsZCxtLGYsdS5zaXplKTpfPXAuc2V0dGVyKHIsZCxtLGYsdS5zaXplKX1lbHNlIHAuYXJyYXlTZXR0ZXImJmM/Xz1wLmFycmF5U2V0dGVyKHIsZik6Xz1wLnNldHRlcihyLGYpO3JldHVybiBfLmxvY2F0aW9uPWYsX31jb25zdCBpPXt9LG89e30scz1yLmdldFByb2dyYW1QYXJhbWV0ZXIoZSxRbik7Zm9yKGxldCBhPTA7YTxzOysrYSl7Y29uc3QgdT1yLmdldEFjdGl2ZVVuaWZvcm0oZSxhKTtpZihUaSh1KSljb250aW51ZTtsZXQgZj11Lm5hbWU7Zi5lbmRzV2l0aCgiWzBdIikmJihmPWYuc3Vic3RyKDAsZi5sZW5ndGgtMykpO2NvbnN0IGM9ci5nZXRVbmlmb3JtTG9jYXRpb24oZSx1Lm5hbWUpO2lmKGMpe2NvbnN0IGQ9bihlLHUsYyk7aVtmXT1kLEpjKGYsZCxvLGkpfX1yZXR1cm4gaX1mdW5jdGlvbiBaYyhyLGUpe2NvbnN0IHQ9e30sbj1yLmdldFByb2dyYW1QYXJhbWV0ZXIoZSxWdSk7Zm9yKGxldCBpPTA7aTxuOysraSl7Y29uc3Qgbz1yLmdldFRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZyhlLGkpO3Rbby5uYW1lXT17aW5kZXg6aSx0eXBlOm8udHlwZSxzaXplOm8uc2l6ZX19cmV0dXJuIHR9ZnVuY3Rpb24gZWYocixlKXtjb25zdCB0PXIuZ2V0UHJvZ3JhbVBhcmFtZXRlcihlLFFuKSxuPVtdLGk9W107Zm9yKGxldCBhPTA7YTx0OysrYSl7aS5wdXNoKGEpLG4ucHVzaCh7fSk7Y29uc3QgdT1yLmdldEFjdGl2ZVVuaWZvcm0oZSxhKTtuW2FdLm5hbWU9dS5uYW1lfVtbIlVOSUZPUk1fVFlQRSIsInR5cGUiXSxbIlVOSUZPUk1fU0laRSIsInNpemUiXSxbIlVOSUZPUk1fQkxPQ0tfSU5ERVgiLCJibG9ja05keCJdLFsiVU5JRk9STV9PRkZTRVQiLCJvZmZzZXQiXV0uZm9yRWFjaChmdW5jdGlvbihhKXtjb25zdCB1PWFbMF0sZj1hWzFdO3IuZ2V0QWN0aXZlVW5pZm9ybXMoZSxpLHJbdV0pLmZvckVhY2goZnVuY3Rpb24oYyxkKXtuW2RdW2ZdPWN9KX0pO2NvbnN0IG89e30scz1yLmdldFByb2dyYW1QYXJhbWV0ZXIoZSxXdSk7Zm9yKGxldCBhPTA7YTxzOysrYSl7Y29uc3QgdT1yLmdldEFjdGl2ZVVuaWZvcm1CbG9ja05hbWUoZSxhKSxmPXtpbmRleDpyLmdldFVuaWZvcm1CbG9ja0luZGV4KGUsdSksdXNlZEJ5VmVydGV4U2hhZGVyOnIuZ2V0QWN0aXZlVW5pZm9ybUJsb2NrUGFyYW1ldGVyKGUsYSxqdSksdXNlZEJ5RnJhZ21lbnRTaGFkZXI6ci5nZXRBY3RpdmVVbmlmb3JtQmxvY2tQYXJhbWV0ZXIoZSxhLHF1KSxzaXplOnIuZ2V0QWN0aXZlVW5pZm9ybUJsb2NrUGFyYW1ldGVyKGUsYSxYdSksdW5pZm9ybUluZGljZXM6ci5nZXRBY3RpdmVVbmlmb3JtQmxvY2tQYXJhbWV0ZXIoZSxhLFl1KX07Zi51c2VkPWYudXNlZEJ5VmVydGV4U2hhZGVyfHxmLnVzZWRCeUZyYWdtZW50U2hhZGVyLG9bdV09Zn1yZXR1cm57YmxvY2tTcGVjczpvLHVuaWZvcm1EYXRhOm59fWZ1bmN0aW9uIEFpKHIsZSl7Zm9yKGNvbnN0IHQgaW4gZSl7Y29uc3Qgbj1yW3RdO3R5cGVvZiBuPT0iZnVuY3Rpb24iP24oZVt0XSk6QWkoclt0XSxlW3RdKX19ZnVuY3Rpb24gd2kociwuLi5lKXtjb25zdCB0PXIudW5pZm9ybVNldHRlcnN8fHIsbj1lLmxlbmd0aDtmb3IobGV0IGk9MDtpPG47KytpKXtjb25zdCBvPWVbaV07aWYoQXJyYXkuaXNBcnJheShvKSl7Y29uc3Qgcz1vLmxlbmd0aDtmb3IobGV0IGE9MDthPHM7KythKXdpKHQsb1thXSl9ZWxzZSBmb3IoY29uc3QgcyBpbiBvKXtjb25zdCBhPXRbc107YSYmYShvW3NdKX19fWZ1bmN0aW9uIHRmKHIsZSl7Y29uc3QgdD17fSxuPXIuZ2V0UHJvZ3JhbVBhcmFtZXRlcihlLEh1KTtmb3IobGV0IGk9MDtpPG47KytpKXtjb25zdCBvPXIuZ2V0QWN0aXZlQXR0cmliKGUsaSk7aWYoVGkobykpY29udGludWU7Y29uc3Qgcz1yLmdldEF0dHJpYkxvY2F0aW9uKGUsby5uYW1lKSxhPURbby50eXBlXSx1PWEuc2V0dGVyKHIscyxhKTt1LmxvY2F0aW9uPXMsdFtvLm5hbWVdPXV9cmV0dXJuIHR9ZnVuY3Rpb24gcmYocixlKXtmb3IoY29uc3QgdCBpbiBlKXtjb25zdCBuPXJbdF07biYmbihlW3RdKX19ZnVuY3Rpb24gbmYocixlLHQpe3QudmVydGV4QXJyYXlPYmplY3Q/ci5iaW5kVmVydGV4QXJyYXkodC52ZXJ0ZXhBcnJheU9iamVjdCk6KHJmKGUuYXR0cmliU2V0dGVyc3x8ZSx0LmF0dHJpYnMpLHQuaW5kaWNlcyYmci5iaW5kQnVmZmVyKFV1LHQuaW5kaWNlcykpfWZ1bmN0aW9uIFJpKHIsZSl7Y29uc3QgdD1RYyhyLGUpLG49dGYocixlKSxpPXtwcm9ncmFtOmUsdW5pZm9ybVNldHRlcnM6dCxhdHRyaWJTZXR0ZXJzOm59O3JldHVybiBCZShyKSYmKGkudW5pZm9ybUJsb2NrU3BlYz1lZihyLGUpLGkudHJhbnNmb3JtRmVlZGJhY2tJbmZvPVpjKHIsZSkpLGl9Y29uc3Qgb2Y9L1xzfHt8fXw7LztmdW5jdGlvbiBzZihyLGUsdCxuLGkpe2NvbnN0IG89QXIodCxuLGkpLHM9W107aWYoZT1lLm1hcChmdW5jdGlvbihmKXtpZighb2YudGVzdChmKSl7Y29uc3QgYz1KbihmKTtpZihjKWY9Yy50ZXh0O2Vsc2V7Y29uc3QgZD1gbm8gZWxlbWVudCB3aXRoIGlkOiAke2Z9YDtvLmVycm9yQ2FsbGJhY2soZCkscy5wdXNoKGQpfX1yZXR1cm4gZn0pLHMubGVuZ3RoKXJldHVybiBrYyhvLCIiKTtjb25zdCBhPW8uY2FsbGJhY2s7YSYmKG8uY2FsbGJhY2s9KGYsYyk9PnthKGYsZj92b2lkIDA6UmkocixjKSl9KTtjb25zdCB1PVhjKHIsZSxvKTtyZXR1cm4gdT9SaShyLHUpOm51bGx9Y29uc3QgYWY9NCxTaT01MTIzO2Z1bmN0aW9uIHVmKHIsZSx0LG4saSxvKXt0PXQ9PT12b2lkIDA/YWY6dDtjb25zdCBzPWUuaW5kaWNlcyxhPWUuZWxlbWVudFR5cGUsdT1uPT09dm9pZCAwP2UubnVtRWxlbWVudHM6bjtpPWk9PT12b2lkIDA/MDppLGF8fHM/byE9PXZvaWQgMD9yLmRyYXdFbGVtZW50c0luc3RhbmNlZCh0LHUsYT09PXZvaWQgMD9TaTplLmVsZW1lbnRUeXBlLGksbyk6ci5kcmF3RWxlbWVudHModCx1LGE9PT12b2lkIDA/U2k6ZS5lbGVtZW50VHlwZSxpKTpvIT09dm9pZCAwP3IuZHJhd0FycmF5c0luc3RhbmNlZCh0LGksdSxvKTpyLmRyYXdBcnJheXModCxpLHUpfWNvbnN0IElpPTM2MTYwLFJ0PTM2MTYxLGNmPTM1NTMsZmY9NTEyMSxsZj02NDAyLGRmPTY0MDgsbWY9MzMxOTAsaGY9MzYwMTIscGY9MzUwNTYseWY9MzYwMTMsX2Y9MzI4NTQseGY9MzI4NTUsYmY9MzYxOTQsRmk9MzMxODksUGk9NjQwMSxEaT0zNjE2OCx3cj0zNDA0MSxScj0zNjA2NCxTdD0zNjA5NixNaT0zNjEyOCxTcj0zMzMwNixJcj0zMzA3MSxGcj05NzI5LGdmPVt7Zm9ybWF0OmRmLHR5cGU6ZmYsbWluOkZyLHdyYXA6SXJ9LHtmb3JtYXQ6d3J9XSxxPXt9O3Fbd3JdPVNyLHFbUGldPU1pLHFbRGldPU1pLHFbbGZdPVN0LHFbRmldPVN0LHFbbWZdPVN0LHFbaGZdPVN0LHFbcGZdPVNyLHFbeWZdPVNyO2Z1bmN0aW9uIHZmKHIsZSl7cmV0dXJuIHFbcl18fHFbZV19Y29uc3QgZGU9e307ZGVbX2ZdPSEwLGRlW3hmXT0hMCxkZVtiZl09ITAsZGVbd3JdPSEwLGRlW0ZpXT0hMCxkZVtQaV09ITAsZGVbRGldPSEwO2Z1bmN0aW9uIEVmKHIpe3JldHVybiBkZVtyXX1jb25zdCBUZj0zMjtmdW5jdGlvbiBBZihyKXtyZXR1cm4gcj49UnImJnI8UnIrVGZ9ZnVuY3Rpb24gSXQocixlLHQsbil7Y29uc3QgaT1JaSxvPXIuY3JlYXRlRnJhbWVidWZmZXIoKTtyLmJpbmRGcmFtZWJ1ZmZlcihpLG8pLHQ9dHx8ci5kcmF3aW5nQnVmZmVyV2lkdGgsbj1ufHxyLmRyYXdpbmdCdWZmZXJIZWlnaHQsZT1lfHxnZjtjb25zdCBzPVtdLGE9e2ZyYW1lYnVmZmVyOm8sYXR0YWNobWVudHM6W10sd2lkdGg6dCxoZWlnaHQ6bn07cmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbih1LGYpe2xldCBjPXUuYXR0YWNobWVudDtjb25zdCBkPXUuc2FtcGxlcyxwPXUuZm9ybWF0O2xldCBfPXUuYXR0YWNobWVudFBvaW50fHx2ZihwLHUuaW50ZXJuYWxGb3JtYXQpO2lmKF98fChfPVJyK2YpLEFmKF8pJiZzLnB1c2goXyksIWMpaWYoZCE9PXZvaWQgMHx8RWYocCkpYz1yLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLHIuYmluZFJlbmRlcmJ1ZmZlcihSdCxjKSxkPjE/ci5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUoUnQsZCxwLHQsbik6ci5yZW5kZXJidWZmZXJTdG9yYWdlKFJ0LHAsdCxuKTtlbHNle2NvbnN0IG09T2JqZWN0LmFzc2lnbih7fSx1KTttLndpZHRoPXQsbS5oZWlnaHQ9bixtLmF1dG89PT12b2lkIDAmJihtLmF1dG89ITEsbS5taW49bS5taW58fG0ubWluTWFnfHxGcixtLm1hZz1tLm1hZ3x8bS5taW5NYWd8fEZyLG0ud3JhcFM9bS53cmFwU3x8bS53cmFwfHxJcixtLndyYXBUPW0ud3JhcFR8fG0ud3JhcHx8SXIpLGM9S24ocixtKX1pZihPcyhyLGMpKXIuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoaSxfLFJ0LGMpO2Vsc2UgaWYob3IocixjKSl1LmxheWVyIT09dm9pZCAwP3IuZnJhbWVidWZmZXJUZXh0dXJlTGF5ZXIoaSxfLGMsdS5sZXZlbHx8MCx1LmxheWVyKTpyLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGksXyx1LnRhcmdldHx8Y2YsYyx1LmxldmVsfHwwKTtlbHNlIHRocm93IG5ldyBFcnJvcigidW5rbm93biBhdHRhY2htZW50IHR5cGUiKTthLmF0dGFjaG1lbnRzLnB1c2goYyl9KSxyLmRyYXdCdWZmZXJzJiZyLmRyYXdCdWZmZXJzKHMpLGF9ZnVuY3Rpb24gd2YocixlLHQpe3Q9dHx8SWksZT8oci5iaW5kRnJhbWVidWZmZXIodCxlLmZyYW1lYnVmZmVyKSxyLnZpZXdwb3J0KDAsMCxlLndpZHRoLGUuaGVpZ2h0KSk6KHIuYmluZEZyYW1lYnVmZmVyKHQsbnVsbCksci52aWV3cG9ydCgwLDAsci5kcmF3aW5nQnVmZmVyV2lkdGgsci5kcmF3aW5nQnVmZmVySGVpZ2h0KSl9ZnVuY3Rpb24gUyhyLGUpe3JldHVybiBlIGluc3RhbmNlb2YgV2ViR0xUZXh0dXJlP2U6S24ocix7c3JjOmUsd3JhcDpyLkNMQU1QX1RPX0VER0V9KX1jbGFzcyBnZXtjb25zdHJ1Y3RvcihlKXt5KHRoaXMsImNvbnRleHQiKTt5KHRoaXMsIm91dHB1dCIpO3kodGhpcywiZmJpIik7eSh0aGlzLCJvcHRpb25zIik7eSh0aGlzLCJwcm9ncmFtSW5mbyIpO3kodGhpcywiYnVmZmVySW5mbyIpO3kodGhpcywibGFzdFJ1biIpO2NvbnN0e2NvbnRleHQ6dCx3aWR0aDpuLGhlaWdodDppfT1lO3RoaXMuY29udGV4dD10LHRoaXMub3B0aW9ucz1lO2NvbnN0IG89dGhpcy5idWlsZERlZmluZXMoKTt0aGlzLnByb2dyYW1JbmZvPXNmKHRoaXMuY29udGV4dCxbbyt0aGlzLmdldFZlcnRleFNoYWRlcigpLG8rdGhpcy5nZXRGcmFnbWVudFNoYWRlcigpXSksdGhpcy5idWZmZXJJbmZvPWlhKHRoaXMuY29udGV4dCx0aGlzLmdldEJ1ZmZlcnMoKSksdGhpcy5mYmk9SXQodGhpcy5jb250ZXh0LFt7Zm9ybWF0OnRoaXMuY29udGV4dC5SR0JBLHR5cGU6dGhpcy5jb250ZXh0LlVOU0lHTkVEX0JZVEUsbWluOnRoaXMuY29udGV4dC5MSU5FQVIsd3JhcDp0aGlzLmNvbnRleHQuQ0xBTVBfVE9fRURHRX1dLG4saSksdGhpcy5vdXRwdXQ9dGhpcy5mYmkuYXR0YWNobWVudHNbMF19cmVzaXplT3V0cHV0KGUsdCl7dGhpcy5mYmk9SXQodGhpcy5jb250ZXh0LFt7Zm9ybWF0OnRoaXMuY29udGV4dC5SR0JBLHR5cGU6dGhpcy5jb250ZXh0LlVOU0lHTkVEX0JZVEUsbWluOnRoaXMuY29udGV4dC5MSU5FQVIsd3JhcDp0aGlzLmNvbnRleHQuQ0xBTVBfVE9fRURHRX1dLGUsdCksdGhpcy5vcHRpb25zLndpZHRoPWUsdGhpcy5vcHRpb25zLmhlaWdodD10LHRoaXMub3V0cHV0PXRoaXMuZmJpLmF0dGFjaG1lbnRzWzBdfWdldERlZmluZXMoKXtyZXR1cm57fX1nZXRCdWZmZXJzKCl7cmV0dXJue3Bvc2l0aW9uOntudW1Db21wb25lbnRzOjIsZGF0YTpbLTEsLTEsLTEsMSwxLC0xLDEsMSwtMSwxLDEsLTFdfSx0ZXh0dXJlX2Nvb3JkOntudW1Db21wb25lbnRzOjIsZGF0YTpbMCwwLDAsMSwxLDAsMSwxLDAsMSwxLDBdfX19YnVpbGREZWZpbmVzKCl7bGV0IGU9IiI7Y29uc3QgdD10aGlzLmdldERlZmluZXMoKTtmb3IobGV0IG4gaW4gdCllKz1gI2RlZmluZSAke259ICR7dFtuXS50b0ZpeGVkKDEpfQpgO3JldHVybiBlfXJ1bihlKXtjb25zdCB0PURhdGUubm93KCk7bGV0IG49MDt0aGlzLmxhc3RSdW4mJihuPSh0LXRoaXMubGFzdFJ1bikvMWUzKSx0aGlzLmxhc3RSdW49dCx0aGlzLmNvbnRleHQudmlld3BvcnQoMCwwLHRoaXMuY29udGV4dC5jYW52YXMud2lkdGgsdGhpcy5jb250ZXh0LmNhbnZhcy5oZWlnaHQpLHRoaXMuY29udGV4dC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbUluZm8ucHJvZ3JhbSksbmYodGhpcy5jb250ZXh0LHRoaXMucHJvZ3JhbUluZm8sdGhpcy5idWZmZXJJbmZvKSx3aSh0aGlzLnByb2dyYW1JbmZvLHtkZWx0YTpuLGNhbnZhczpbdGhpcy5jb250ZXh0LmNhbnZhcy53aWR0aCx0aGlzLmNvbnRleHQuY2FudmFzLmhlaWdodF0sLi4uZX0pLHdmKHRoaXMuY29udGV4dCx0aGlzLm9wdGlvbnMuZGlzYWJsZUZyYW1lYnVmZmVyP251bGw6dGhpcy5mYmkpLHVmKHRoaXMuY29udGV4dCx0aGlzLmJ1ZmZlckluZm8pfX12YXIgUmY9YHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoKdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKdW5pZm9ybSB2ZWMyIGNhbnZhczsKdW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTsKdW5pZm9ybSBzYW1wbGVyMkQgbWFzazsKCnZlYzQgbG9vcCgpOwoKdm9pZCBtYWluKCkgeyBnbF9GcmFnQ29sb3IgPSBsb29wKCk7IH0KYCxTZj1gdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKYXR0cmlidXRlIHZlYzIgcG9zaXRpb247CmF0dHJpYnV0ZSB2ZWMyIHRleHR1cmVfY29vcmQ7Cgp2b2lkIG1haW4oKSB7CiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLiwgMS4pOwogIF90ZXh0dXJlX2Nvb3JkID0gdGV4dHVyZV9jb29yZDsKfQpgO2NsYXNzIElmIGV4dGVuZHMgZ2V7Z2V0RGVmaW5lcygpe3ZhciBlO3JldHVybntSQURJVVM6KGU9dGhpcy5vcHRpb25zLnJhZGl1cykhPW51bGw/ZToxfX1nZXRGcmFnbWVudFNoYWRlcigpe3JldHVybiBSZit0aGlzLmNyZWF0ZUxvb3BGdW5jdGlvbigpfWdldFZlcnRleFNoYWRlcigpe3JldHVybiBTZn1jcmVhdGVMb29wRnVuY3Rpb24oKXt2YXIgdDtsZXQgZT0odD10aGlzLm9wdGlvbnMucmFkaXVzKSE9bnVsbD90OjE7cmV0dXJuYAoKICAgICAgICB2ZWM0IGxvb3AoKSB7IAogICAgICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMCwwLDAsMCk7CiAgICAgICAgICAgIGZsb2F0IGZhY3RvclN1bSA9IDAuOwoKICAgICAgICAgICAgdmVjMiBub3JtYWxpemVkUmFkaXVzID0gdmVjMigtJHtlfS4pIC8gY2FudmFzOwogICAgICAgICAgICB2ZWMyIG5vcm1hbGl6ZWRJbmNyZW1lbnQgPSB2ZWMyKDEuKSAvIGNhbnZhczsKICAgICAgICAgICAgdmVjMiBkaWZmID0gbm9ybWFsaXplZFJhZGl1czsKICAgICAgICAgICAgZmxvYXQgbWF4TGVuZ3RoID0gbGVuZ3RoKG5vcm1hbGl6ZWRSYWRpdXMpOwoKICAgICAgICAgICAgZm9yKGludCB5PS0ke2V9OyB5PCR7ZSsxfTsgKyt5KSB7CiAgICAgICAgICAgICAgICBmb3IoaW50IHg9LSR7ZX07IHg8JHtlKzF9OyArK3gpIHsKICAgICAgICAgICAgICAgICAgICBmbG9hdCBmYWN0b3IgPSAoMS4tIHRleHR1cmUyRChtYXNrLCBfdGV4dHVyZV9jb29yZCArIGRpZmYpLmEpICogKG1heExlbmd0aCAtIGxlbmd0aChkaWZmKSkgLyBtYXhMZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGZhY3RvciAqIHRleHR1cmUyRCh0ZXh0dXJlLCBfdGV4dHVyZV9jb29yZCArIGRpZmYpOwogICAgICAgICAgICAgICAgICAgIGZhY3RvclN1bSArPSBmYWN0b3I7CiAgICAgICAgICAgICAgICAgICAgZGlmZi54ICs9IG5vcm1hbGl6ZWRJbmNyZW1lbnQueDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRpZmYueSArPSBub3JtYWxpemVkSW5jcmVtZW50Lnk7CiAgICAgICAgICAgICAgICBkaWZmLnggPSBub3JtYWxpemVkUmFkaXVzLng7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAvIGZhY3RvclN1bTsKICAgICAgICB9YH19dmFyIEZmPWBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCnZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCnVuaWZvcm0gc2FtcGxlcjJEIGJhY2tncm91bmQ7CnVuaWZvcm0gc2FtcGxlcjJEIGZvcmVncm91bmQ7CnVuaWZvcm0gc2FtcGxlcjJEIHRocmVzaG9sZDsKCnZvaWQgbWFpbigpIHsKICB2ZWM0IGJhY2tncm91bmRDb2xvciA9IHRleHR1cmUyRChiYWNrZ3JvdW5kLCBfdGV4dHVyZV9jb29yZCk7CiAgdmVjNCBmb3JlZ3JvdW5kQ29sb3IgPSB0ZXh0dXJlMkQoZm9yZWdyb3VuZCwgX3RleHR1cmVfY29vcmQpOwogIHZlYzQgdHJlc2hvbGRDb2xvciA9IHRleHR1cmUyRCh0aHJlc2hvbGQsIF90ZXh0dXJlX2Nvb3JkKTsKICBnbF9GcmFnQ29sb3IgPSBmb3JlZ3JvdW5kQ29sb3IgKiB0cmVzaG9sZENvbG9yLmEgKwogICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvciAqICgxLiAtIHRyZXNob2xkQ29sb3IuYSk7Cn0KYCxQZj1gdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKYXR0cmlidXRlIHZlYzIgcG9zaXRpb247CmF0dHJpYnV0ZSB2ZWMyIHRleHR1cmVfY29vcmQ7Cgp2b2lkIG1haW4oKSB7CiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLiwgMS4pOwogIF90ZXh0dXJlX2Nvb3JkID0gdGV4dHVyZV9jb29yZDsKICBfdGV4dHVyZV9jb29yZC55ID0gMS4gLSB0ZXh0dXJlX2Nvb3JkLnk7Cn0KYDtjbGFzcyBQciBleHRlbmRzIGdle2dldEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIEZmfWdldFZlcnRleFNoYWRlcigpe3JldHVybiBQZn19Y2xhc3MgRHJ7Y29uc3RydWN0b3IoKXt5KHRoaXMsInN0ZXBzIixbXSl9YWRkU3RlcChlKXt0aGlzLnN0ZXBzLnB1c2goZSl9YXN5bmMgcnVuKCl7Zm9yKGNvbnN0IGUgb2YgdGhpcy5zdGVwcyllLnByb2dyYW0ucnVuKGUuZ2V0VW5pZm9ybXMoKSl9cmVzaXplT3V0cHV0KGUsdCl7Zm9yKGNvbnN0IG4gb2YgdGhpcy5zdGVwcyluLnByb2dyYW0ucmVzaXplT3V0cHV0KGUsdCl9fWNsYXNzIE1yIGV4dGVuZHMgRHJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3kodGhpcywicHJlY2lzZU1hc2tFbmFibGVkIiwhMSl9fWNsYXNzIERmIGV4dGVuZHMgTXJ7Y29uc3RydWN0b3IodCxuKXtzdXBlcigpO3kodGhpcywiaW5wdXRJbWFnZSIpO3kodGhpcywiaW5wdXRNYXNrIik7dGhpcy5jb250ZXh0PXQ7Y29uc3QgaT17Y29udGV4dDp0LGhlaWdodDp0LmNhbnZhcy5oZWlnaHQsd2lkdGg6dC5jYW52YXMud2lkdGh9LG89bmV3IElmKHsuLi5pLHJhZGl1czpufSkscz1uZXcgUHIoey4uLmksZGlzYWJsZUZyYW1lYnVmZmVyOiEwfSk7dGhpcy5hZGRTdGVwKHtwcm9ncmFtOm8sZ2V0VW5pZm9ybXM6KCk9Pih7dGV4dHVyZTpTKHQsdGhpcy5pbnB1dEltYWdlKSxtYXNrOlModCx0aGlzLmlucHV0TWFzayl9KX0pLHRoaXMuYWRkU3RlcCh7cHJvZ3JhbTpzLGdldFVuaWZvcm1zOigpPT4oe2JhY2tncm91bmQ6Uyh0LG8ub3V0cHV0KSxmb3JlZ3JvdW5kOlModCx0aGlzLmlucHV0SW1hZ2UpLHRocmVzaG9sZDpTKHQsdGhpcy5pbnB1dE1hc2spfSl9KX1zZXREYXRhKHQsbil7dGhpcy5pbnB1dEltYWdlPXQsdGhpcy5pbnB1dE1hc2s9bn19Y2xhc3MgQ2kgZXh0ZW5kcyBNcntjb25zdHJ1Y3Rvcih0KXtzdXBlcigpO3kodGhpcywiaW5wdXRJbWFnZSIpO3kodGhpcywiaW5wdXRCYWNrZ3JvdW5kSW1hZ2UiKTt5KHRoaXMsImlucHV0TWFzayIpO3kodGhpcywicHJlY2lzZU1hc2tFbmFibGVkIiwhMCk7dGhpcy5jb250ZXh0PXQ7Y29uc3Qgbj17Y29udGV4dDp0LGhlaWdodDp0LmNhbnZhcy5oZWlnaHQsd2lkdGg6dC5jYW52YXMud2lkdGh9LGk9bmV3IFByKHsuLi5uLGRpc2FibGVGcmFtZWJ1ZmZlcjohMH0pO3RoaXMuYWRkU3RlcCh7cHJvZ3JhbTppLGdldFVuaWZvcm1zOigpPT4oe2JhY2tncm91bmQ6Uyh0LHRoaXMuaW5wdXRCYWNrZ3JvdW5kSW1hZ2UpLGZvcmVncm91bmQ6Uyh0LHRoaXMuaW5wdXRJbWFnZSksdGhyZXNob2xkOlModCx0aGlzLmlucHV0TWFzayl9KX0pfXNldERhdGEodCxuKXt0aGlzLmlucHV0SW1hZ2U9dCx0aGlzLmlucHV0TWFzaz1ufX1jbGFzcyBNZiBleHRlbmRzIENpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTt5KHRoaXMsImZyYW1lUmVhZGVyIik7eSh0aGlzLCJwcmVjaXNlTWFza0VuYWJsZWQiLCEwKX1zZXQgaW5wdXRWaWRlbyh0KXt0aGlzLmZyYW1lUmVhZGVyPXQuZ2V0UmVhZGVyKCksdGhpcy5yZWFkTmV4dFZpZGVvRnJhbWUoKX1hc3luYyBydW4oKXt0aGlzLmZyYW1lUmVhZGVyJiYoYXdhaXQgc3VwZXIucnVuKCksdGhpcy5yZWFkTmV4dFZpZGVvRnJhbWUoKSl9YXN5bmMgcmVhZE5leHRWaWRlb0ZyYW1lKCl7dmFyIG47Y29uc3QgdD1hd2FpdCgobj10aGlzLmZyYW1lUmVhZGVyKT09bnVsbD92b2lkIDA6bi5yZWFkKCkpO3QhPW51bGwmJnQudmFsdWUmJih0aGlzLmlucHV0QmFja2dyb3VuZEltYWdlPWF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKHQudmFsdWUpLHQudmFsdWUuY2xvc2UoKSl9fXZhciBDZj1gcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7Cgp2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7Cgp1bmlmb3JtIHZlYzIgY2FudmFzOwp1bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlOwoKdmVjNCBsb29wKCk7Cgp2b2lkIG1haW4oKSB7IGdsX0ZyYWdDb2xvciA9IGxvb3AoKTsgfQpgLE9mPWB2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7CgphdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjsKYXR0cmlidXRlIHZlYzIgdGV4dHVyZV9jb29yZDsKCnZvaWQgbWFpbigpIHsKICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuLCAxLik7CiAgX3RleHR1cmVfY29vcmQgPSB0ZXh0dXJlX2Nvb3JkOwp9CmAsQ3I9KHI9PihyW3IuTElORUFSPTBdPSJMSU5FQVIiLHJbci5HQVVTU0lBTj0xXT0iR0FVU1NJQU4iLHIpKShDcnx8e30pO2NsYXNzIE9pIGV4dGVuZHMgZ2V7Z2V0RGVmaW5lcygpe3ZhciBlO3JldHVybntSQURJVVM6KGU9dGhpcy5vcHRpb25zLnJhZGl1cykhPW51bGw/ZToxfX1nZXRGcmFnbWVudFNoYWRlcigpe3JldHVybiBDZit0aGlzLmNyZWF0ZUxvb3BGdW5jdGlvbigpfWdldFZlcnRleFNoYWRlcigpe3JldHVybiBPZn1jcmVhdGVMb29wRnVuY3Rpb24oKXt2YXIgdDtsZXQgZT0odD10aGlzLm9wdGlvbnMucmFkaXVzKSE9bnVsbD90OjE7cmV0dXJuYAoKICAgICAgICB2ZWM0IGxvb3AoKSB7IAogICAgICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMCwwLDAsMCk7CiAgICAgICAgICAgIGZsb2F0IGZhY3RvclN1bSA9IDAuOwoKICAgICAgICAgICAgdmVjMiBub3JtYWxpemVkUmFkaXVzID0gdmVjMigtJHtlfS4pIC8gY2FudmFzOwogICAgICAgICAgICB2ZWMyIG5vcm1hbGl6ZWRJbmNyZW1lbnQgPSB2ZWMyKDEuKSAvIGNhbnZhczsKICAgICAgICAgICAgdmVjMiBkaWZmID0gbm9ybWFsaXplZFJhZGl1czsKCiAgICAgICAgICAgIGZvcihpbnQgeT0tJHtlfTsgeTwke2UrMX07ICsreSkgewogICAgICAgICAgICAgICAgZm9yKGludCB4PS0ke2V9OyB4PCR7ZSsxfTsgKyt4KSB7CiAgICAgICAgICAgICAgICAgICAgZmxvYXQgZmFjdG9yID0gMS47CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGZhY3RvciAqIHRleHR1cmUyRCh0ZXh0dXJlLCBfdGV4dHVyZV9jb29yZCArIGRpZmYpOwogICAgICAgICAgICAgICAgICAgIGZhY3RvclN1bSArPSBmYWN0b3I7CiAgICAgICAgICAgICAgICAgICAgZGlmZi54ICs9IG5vcm1hbGl6ZWRJbmNyZW1lbnQueDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRpZmYueSArPSBub3JtYWxpemVkSW5jcmVtZW50Lnk7CiAgICAgICAgICAgICAgICBkaWZmLnggPSBub3JtYWxpemVkUmFkaXVzLng7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAvIGZhY3RvclN1bTsKICAgICAgICB9YH1nZXRGYWN0b3IoZSx0KXtzd2l0Y2godGhpcy5vcHRpb25zLnR5cGUpe2Nhc2UgMTpyZXR1cm4gdGhpcy5nZXRMaW5lYXJGYWN0b3IoZSx0KTtjYXNlIDA6ZGVmYXVsdDpyZXR1cm4gdGhpcy5nZXRMaW5lYXJGYWN0b3IoZSx0KX19Z2V0TGluZWFyRmFjdG9yKGUsdCl7cmV0dXJuIDF9Z2V0R2F1c3NpYW5GYWN0b3IoZSx0KXt2YXIgdTtjb25zdCBuPU1hdGguUEkqMixpPU1hdGgubWF4KCh1PXRoaXMub3B0aW9ucy5yYWRpdXMpIT1udWxsP3U6MSwxKSxvPTEvKG4qaSoqMikscz0tKGUqKjIrdCoqMiksYT1vKnM7cmV0dXJuIG8qTWF0aC5FKiphfX1jbGFzcyBOZiBleHRlbmRzIE1ye2NvbnN0cnVjdG9yKHQsbil7c3VwZXIoKTt5KHRoaXMsImlucHV0SW1hZ2UiKTt5KHRoaXMsImlucHV0TWFzayIpO3RoaXMuY29udGV4dD10O2NvbnN0IGk9e2NvbnRleHQ6dCxoZWlnaHQ6dC5jYW52YXMuaGVpZ2h0LHdpZHRoOnQuY2FudmFzLndpZHRofSxvPW5ldyBPaSh7Li4uaSxyYWRpdXM6bix0eXBlOkNyLkdBVVNTSUFOfSkscz1uZXcgUHIoey4uLmksZGlzYWJsZUZyYW1lYnVmZmVyOiEwfSk7dGhpcy5hZGRTdGVwKHtwcm9ncmFtOm8sZ2V0VW5pZm9ybXM6KCk9Pih7dGV4dHVyZTpTKHQsdGhpcy5pbnB1dEltYWdlKX0pfSksdGhpcy5hZGRTdGVwKHtwcm9ncmFtOnMsZ2V0VW5pZm9ybXM6KCk9Pih7YmFja2dyb3VuZDpTKHQsdGhpcy5pbnB1dEltYWdlKSxmb3JlZ3JvdW5kOlModCxvLm91dHB1dCksdGhyZXNob2xkOlModCx0aGlzLmlucHV0TWFzayl9KX0pfXNldERhdGEodCxuKXt0aGlzLmlucHV0SW1hZ2U9dCx0aGlzLmlucHV0TWFzaz1ufX1jbGFzcyBPciBleHRlbmRzIGdle2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO3kodGhpcywiZmJpMiIpO3RoaXMuZmJpMj1JdCh0LmNvbnRleHQsW3tmb3JtYXQ6dC5jb250ZXh0LlJHQkEsdHlwZTp0LmNvbnRleHQuVU5TSUdORURfQllURSxtaW46dC5jb250ZXh0LkxJTkVBUixtYWc6dC5jb250ZXh0LkxJTkVBUix3cmFwOnQuY29udGV4dC5DTEFNUF9UT19FREdFfV0sdC53aWR0aCx0LmhlaWdodCl9cnVuKHQpe2NvbnN0IG49dGhpcy5mYmk7dGhpcy5mYmk9dGhpcy5mYmkyLHRoaXMuZmJpMj1uLHRoaXMub3V0cHV0PXRoaXMuZmJpLmF0dGFjaG1lbnRzWzBdLHN1cGVyLnJ1bih7Li4udCxwcmV2aW91c19yZW5kZXJpbmc6dGhpcy5mYmkyLmF0dGFjaG1lbnRzWzBdfSl9cmVzaXplT3V0cHV0KHQsbil7c3VwZXIucmVzaXplT3V0cHV0KHQsbiksdGhpcy5mYmkyPUl0KHRoaXMuY29udGV4dCxbe2Zvcm1hdDp0aGlzLmNvbnRleHQuUkdCQSx0eXBlOnRoaXMuY29udGV4dC5VTlNJR05FRF9CWVRFLG1pbjp0aGlzLmNvbnRleHQuTElORUFSLHdyYXA6dGhpcy5jb250ZXh0LkNMQU1QX1RPX0VER0V9XSx0LG4pfX12YXIgQmY9YHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoKdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKLy8gdW5pZm9ybSBmbG9hdCB0cmVzaG9sZDsKdW5pZm9ybSBzYW1wbGVyMkQgaW1hZ2Vfbm93Owp1bmlmb3JtIHNhbXBsZXIyRCBpbWFnZV9iZWZvcmU7CnVuaWZvcm0gc2FtcGxlcjJEIG1hc2tfbm93Owp1bmlmb3JtIHNhbXBsZXIyRCBtYXNrX2JlZm9yZTsKdW5pZm9ybSBzYW1wbGVyMkQgcHJldmlvdXNfcmVuZGVyaW5nOwp1bmlmb3JtIHZlYzIgY2FudmFzOwoKdW5pZm9ybSBmbG9hdCBkZWx0YTsKCmZsb2F0IGN1cnJlbnRfZmFjdG9yID0gMC42OTsKZmxvYXQgcHJldmlvdXNfZmFjdG9yID0gMC43NDsKZmxvYXQgdGhyZXNob2xkX2FjdGl2YXRpb24gPSAwLjU0OwoKZmxvYXQgbWFwKGZsb2F0IHZhbHVlLCBmbG9hdCBtaW4xLCBmbG9hdCBtYXgxLCBmbG9hdCBtaW4yLCBmbG9hdCBtYXgyKSB7CiAgcmV0dXJuIG1pbjIgKyAodmFsdWUgLSBtaW4xKSAqIChtYXgyIC0gbWluMikgLyAobWF4MSAtIG1pbjEpOwp9CgpmbG9hdCBnZXRUaHJlc2hvbGQoKSB7CiAgdmVjNCBjb2xvciA9IHZlYzQoMC4pOwogIGZvciAoZmxvYXQgeSA9IC02LjsgeSA8IDcuOyB5ICs9IDEuKSB7CiAgICBmb3IgKGZsb2F0IHggPSAtNi47IHggPCA3LjsgeCArPSAxLikgewogICAgICB2ZWM0IGltYWdlX25vd19jb2xvciA9CiAgICAgICAgICB0ZXh0dXJlMkQoaW1hZ2Vfbm93LCBfdGV4dHVyZV9jb29yZCArIHZlYzIoeCwgeSkgLyBjYW52YXMpOwogICAgICB2ZWM0IGltYWdlX2JlZm9yZV9jb2xvciA9CiAgICAgICAgICB0ZXh0dXJlMkQoaW1hZ2VfYmVmb3JlLCBfdGV4dHVyZV9jb29yZCArIHZlYzIoeCwgeSkgLyBjYW52YXMpOwogICAgICBjb2xvciArPSBhYnMoaW1hZ2VfYmVmb3JlX2NvbG9yIC0gaW1hZ2Vfbm93X2NvbG9yKTsKICAgIH0KICB9CiAgcmV0dXJuIChjb2xvci54ICsgY29sb3IueSArIGNvbG9yLnopIC8gKDMuICogOS4pOwp9Cgp2b2lkIG1haW4oKSB7CiAgZmxvYXQgdHJlc2hvbGRfaW5wdXQgPSAuNDsKICBmbG9hdCB0cmVzaG9sZF9wcmV2aW91c19yZW5kZXJpbmcgPSAuOTg7CgogIHZlYzQgbWFza19ub3dfY29sb3IgPSB0ZXh0dXJlMkQobWFza19ub3csIF90ZXh0dXJlX2Nvb3JkKTsKICB2ZWM0IG1hc2tfYmVmb3JlX2NvbG9yID0gdGV4dHVyZTJEKG1hc2tfYmVmb3JlLCBfdGV4dHVyZV9jb29yZCk7CiAgdmVjNCBwcmV2aW91c19yZW5kZXJpbmdfY29sb3IgPSB0ZXh0dXJlMkQocHJldmlvdXNfcmVuZGVyaW5nLCBfdGV4dHVyZV9jb29yZCk7CgogIHZlYzMgbWFza19kaWZmID0gYWJzKG1hc2tfYmVmb3JlX2NvbG9yLnh5eiAtIG1hc2tfbm93X2NvbG9yLnh5eik7CiAgZmxvYXQgZmxpY2tlcmluZyA9IG1hc2tfZGlmZi54OwogIGZsb2F0IHRocmVzaG9sZCA9IGdldFRocmVzaG9sZCgpOwogIGlmICh0aHJlc2hvbGQgPCB0aHJlc2hvbGRfYWN0aXZhdGlvbikgewogICAgZ2xfRnJhZ0NvbG9yID0gdmVjNChmbGlja2VyaW5nLCAwLiwgMC4sIDEuKSAqIGN1cnJlbnRfZmFjdG9yICsKICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX3JlbmRlcmluZ19jb2xvciAqIHByZXZpb3VzX2ZhY3RvcjsKICAgIGdsX0ZyYWdDb2xvciAqPSAoMS4gLSB0aHJlc2hvbGQpOwogIH0KfQpgLFVmPWB2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7CgphdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjsKYXR0cmlidXRlIHZlYzIgdGV4dHVyZV9jb29yZDsKCnZvaWQgbWFpbigpIHsKICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuLCAxLik7CiAgX3RleHR1cmVfY29vcmQgPSB0ZXh0dXJlX2Nvb3JkOwp9CmA7Y2xhc3Mga2YgZXh0ZW5kcyBPcntnZXRGcmFnbWVudFNoYWRlcigpe3JldHVybiBCZn1nZXRWZXJ0ZXhTaGFkZXIoKXtyZXR1cm4gVWZ9fXZhciBMZj1gI3ZlcnNpb24gMzAwIGVzCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9Wb2xjb21peC92aXJ0dWFsLWJhY2tncm91bmQvYmxvYi9tYWluL3NyYy9waXBlbGluZXMvd2ViZ2wyL2pvaW50QmlsYXRlcmFsRmlsdGVyU3RhZ2UudHMKCnByZWNpc2lvbiBoaWdocCBmbG9hdDsKdW5pZm9ybSBzYW1wbGVyMkQgaW5wdXRfZnJhbWU7CnVuaWZvcm0gc2FtcGxlcjJEIHNlZ21lbnRhdGlvbl9tYXNrOwp1bmlmb3JtIHNhbXBsZXIyRCB0aHJlc2hvbGQ7CnVuaWZvcm0gdmVjMiB0ZXhlbF9zaXplOwp1bmlmb3JtIGZsb2F0IHN0ZXA7CnVuaWZvcm0gZmxvYXQgcmFkaXVzOwp1bmlmb3JtIGZsb2F0IG9mZnNldDsKdW5pZm9ybSBmbG9hdCBzaWdtYV90ZXhlbDsKdW5pZm9ybSBmbG9hdCBzaWdtYV9jb2xvcjsKCmluIHZlYzIgX3RleHR1cmVfY29vcmQ7Cm91dCB2ZWM0IG91dENvbG9yOwoKZmxvYXQgZ2F1c3NpYW4oZmxvYXQgeCwgZmxvYXQgc2lnbWEpIHsKICBmbG9hdCBjb2VmZiA9IC0wLjUgLyAoc2lnbWEgKiBzaWdtYSAqIDQuMCArIDEuMGUtNik7CiAgcmV0dXJuIGV4cCgoeCAqIHgpICogY29lZmYpOwp9Cgp2b2lkIG1haW4oKSB7CiAgdmVjMiBjZW50ZXJDb29yZCA9IF90ZXh0dXJlX2Nvb3JkOwogIHZlYzMgY2VudGVyQ29sb3IgPSB0ZXh0dXJlKGlucHV0X2ZyYW1lLCBjZW50ZXJDb29yZCkucmdiOwogIGZsb2F0IG5ld1ZhbCA9IDAuMDsKICBmbG9hdCBzcGFjZVdlaWdodCA9IDAuMDsKICBmbG9hdCBjb2xvcldlaWdodCA9IDAuMDsKICBmbG9hdCB0b3RhbFdlaWdodCA9IDAuMDsKICAvLyBTdWJzYW1wbGUga2VybmVsIHNwYWNlLgogIGZvciAoZmxvYXQgaSA9IC1yYWRpdXMgKyBvZmZzZXQ7IGkgPD0gcmFkaXVzOyBpICs9IHN0ZXApIHsKICAgIGZvciAoZmxvYXQgaiA9IC1yYWRpdXMgKyBvZmZzZXQ7IGogPD0gcmFkaXVzOyBqICs9IHN0ZXApIHsKICAgICAgdmVjMiBzaGlmdCA9IHZlYzIoaiwgaSkgKiB0ZXhlbF9zaXplOwogICAgICB2ZWMyIGNvb3JkID0gdmVjMihjZW50ZXJDb29yZCArIHNoaWZ0KTsKICAgICAgdmVjMyBmcmFtZUNvbG9yID0gdGV4dHVyZShpbnB1dF9mcmFtZSwgY29vcmQpLnJnYjsKICAgICAgZmxvYXQgdGhyZXNob2xkID0gdGV4dHVyZSh0aHJlc2hvbGQsIGNvb3JkKS5hOwogICAgICBmbG9hdCBvdXRWYWwgPSB0ZXh0dXJlKHNlZ21lbnRhdGlvbl9tYXNrLCBjb29yZCkuYTsKCiAgICAgIHNwYWNlV2VpZ2h0ID0gZ2F1c3NpYW4oZGlzdGFuY2UoY2VudGVyQ29vcmQsIGNvb3JkKSwgc2lnbWFfdGV4ZWwpOwogICAgICBjb2xvcldlaWdodCA9IGdhdXNzaWFuKGRpc3RhbmNlKGNlbnRlckNvbG9yLCBmcmFtZUNvbG9yKSwgc2lnbWFfY29sb3IpOwogICAgICB0b3RhbFdlaWdodCArPSBzcGFjZVdlaWdodCAqIGNvbG9yV2VpZ2h0OwogICAgICBuZXdWYWwgKz0gc3BhY2VXZWlnaHQgKiBjb2xvcldlaWdodCAqIG91dFZhbCAqIHRocmVzaG9sZDsKICAgIH0KICB9CiAgbmV3VmFsIC89IHRvdGFsV2VpZ2h0OwogIG91dENvbG9yID0gdmVjNCh2ZWMzKDAuKSwgbmV3VmFsKTsKfWAsJGY9YCN2ZXJzaW9uIDMwMCBlcwppbiB2ZWMyIHBvc2l0aW9uOwppbiB2ZWMyIHRleHR1cmVfY29vcmQ7Cm91dCB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwp2b2lkIG1haW4oKSB7CiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLjAsIDEuMCk7CiAgX3RleHR1cmVfY29vcmQgPSB0ZXh0dXJlX2Nvb3JkOwp9YDtjbGFzcyBHZiBleHRlbmRzIGdle2dldEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIExmfWdldFZlcnRleFNoYWRlcigpe3JldHVybiAkZn19dmFyIHpmPWBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCnZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCnVuaWZvcm0gdmVjMiBjYW52YXM7CnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU7Cgp2b2lkIG1haW4oKSB7CiAgaW50IGNvdW50ID0gMDsKICBmb3IgKGZsb2F0IHkgPSAtMS47IHkgPCAyLjsgeSArPSAxLikgewogICAgZm9yIChmbG9hdCB4ID0gLTEuOyB4IDwgMi47IHggKz0gMS4pIHsKICAgICAgdmVjMiBjb29yZCA9IF90ZXh0dXJlX2Nvb3JkICsgdmVjMih5LCB4KSAvIGNhbnZhczsKICAgICAgdmVjNCBjb2xvciA9IHRleHR1cmUyRCh0ZXh0dXJlLCBjb29yZCk7CiAgICAgIGlmIChjb2xvci5yID4gLjEpIHsKICAgICAgICBjb3VudCsrOwogICAgICB9CiAgICB9CiAgfQogIGlmIChjb3VudCA+IDUpIHsKICAgIGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCh0ZXh0dXJlLCBfdGV4dHVyZV9jb29yZCk7CiAgfQp9CmAsSGY9YHZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCmF0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uOwphdHRyaWJ1dGUgdmVjMiB0ZXh0dXJlX2Nvb3JkOwoKdm9pZCBtYWluKCkgewogIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4sIDEuKTsKICBfdGV4dHVyZV9jb29yZCA9IHRleHR1cmVfY29vcmQ7Cn0KYDtjbGFzcyBWZiBleHRlbmRzIGdle2dldEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIHpmfWdldFZlcnRleFNoYWRlcigpe3JldHVybiBIZn19dmFyIFdmPWBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCnZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCnVuaWZvcm0gdmVjMiBjYW52YXM7CnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU7Cgp2b2lkIG1haW4oKSB7CiAgdmVjNCBjb2xvciA9IHRleHR1cmUyRCh0ZXh0dXJlLCBfdGV4dHVyZV9jb29yZCk7CiAgZm9yIChmbG9hdCB5ID0gLTIuOyB5IDwgMy47IHkgKz0gMS4pIHsKICAgIGZvciAoZmxvYXQgeCA9IC0yLjsgeCA8IDMuOyB4ICs9IDEuKSB7CiAgICAgIHZlYzIgY29vcmQgPSBfdGV4dHVyZV9jb29yZDsKICAgICAgY29vcmQgKz0gdmVjMih5LCB4KSAvIGNhbnZhczsKICAgICAgY29sb3IgKz0gdGV4dHVyZTJEKHRleHR1cmUsIGNvb3JkKSAqICgxLiAvIDQuKTsKICAgIH0KICB9CgogIGdsX0ZyYWdDb2xvciA9IGNvbG9yOwp9CmAsamY9YHZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCmF0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uOwphdHRyaWJ1dGUgdmVjMiB0ZXh0dXJlX2Nvb3JkOwoKdm9pZCBtYWluKCkgewogIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4sIDEuKTsKICBfdGV4dHVyZV9jb29yZCA9IHRleHR1cmVfY29vcmQ7Cn0KYDtjbGFzcyBxZiBleHRlbmRzIE9ye2dldEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIFdmfWdldFZlcnRleFNoYWRlcigpe3JldHVybiBqZn19dmFyIFhmPWBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCnZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCnVuaWZvcm0gc2FtcGxlcjJEIHRocmVzaG9sZDsKdW5pZm9ybSBzYW1wbGVyMkQgaW5wdXRzOwoKdm9pZCBtYWluKCkgewogIHZlYzQgaW5wdXRzX2NvbG9yID0gdGV4dHVyZTJEKGlucHV0cywgX3RleHR1cmVfY29vcmQpOwogIHZlYzQgdGhyZXNob2xkX2NvbG9yID0gdGV4dHVyZTJEKHRocmVzaG9sZCwgX3RleHR1cmVfY29vcmQpOwogIGlmICh0aHJlc2hvbGRfY29sb3IuciA8IC4xICYmIGlucHV0c19jb2xvci5yID4gLjUpIHsKICAgIGdsX0ZyYWdDb2xvciA9IGlucHV0c19jb2xvcjsKICB9Cn0KYCxZZj1gdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKYXR0cmlidXRlIHZlYzIgcG9zaXRpb247CmF0dHJpYnV0ZSB2ZWMyIHRleHR1cmVfY29vcmQ7Cgp2b2lkIG1haW4oKSB7CiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLiwgMS4pOwogIF90ZXh0dXJlX2Nvb3JkID0gdGV4dHVyZV9jb29yZDsKfQpgO2NsYXNzIEtmIGV4dGVuZHMgT3J7Z2V0RnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4gWGZ9Z2V0VmVydGV4U2hhZGVyKCl7cmV0dXJuIFlmfX1jbGFzcyBKZiBleHRlbmRzIERye2NvbnN0cnVjdG9yKHQsbixpKXtzdXBlcigpO3kodGhpcywiaW5wdXRJbWFnZSIpO3kodGhpcywiaW5wdXRNYXNrIik7eSh0aGlzLCJwcmV2aW91c0lucHV0SW1hZ2UiKTt5KHRoaXMsInByZXZpb3VzSW5wdXRNYXNrIik7eSh0aGlzLCJvdXRwdXQiKTt5KHRoaXMsIm9wdGlvbnMiLHtjdXJyZW50VGhyZXNob2xkTWluaW11bTowLGN1cnJlbnRUaHJlc2hvbGRNYXhpbXVtOjEscHJldmlvdXNUaHJlc2hvbGRNaW5pbXVtOjAscHJldmlvdXNUaHJlc2hvbGRNYXhpbXVtOjEsdGhyZXNob2xkTWluaW11bTowLHRocmVzaG9sZE1heGltdW06MSx0aHJlc2hvbGRGYWN0b3I6MX0pO3RoaXMuY29udGV4dD10O2NvbnN0IG89e2NvbnRleHQ6dCxoZWlnaHQ6aSx3aWR0aDpufSxzPW5ldyBrZihvKSxhPW5ldyBPaSh7Li4ubyxyYWRpdXM6MSx0eXBlOkNyLkdBVVNTSUFOfSksdT1uZXcgS2YobyksZj1uZXcgcWYobyksYz1uZXcgVmYobyksZD1uZXcgR2Yoey4uLm99KSxwPS42NixfPTY0MCxtPTQ4MCx4PTI1Nix2PTE0NDtsZXQgZz0xO2cqPU1hdGgubWF4KF8veCxtL3YpO2NvbnN0IEE9TWF0aC5tYXgoMSxNYXRoLnNxcnQoZykqcCksUD0xL18sQz0xL207dGhpcy5hZGRTdGVwKHtwcm9ncmFtOnMsZ2V0VW5pZm9ybXM6KCk9Pih7aW1hZ2Vfbm93OlModCx0aGlzLmlucHV0SW1hZ2UpLGltYWdlX2JlZm9yZTpTKHQsdGhpcy5wcmV2aW91c0lucHV0SW1hZ2UpLG1hc2tfbm93OlModCx0aGlzLmlucHV0TWFzayksbWFza19iZWZvcmU6Uyh0LHRoaXMucHJldmlvdXNJbnB1dE1hc2spLGN1cnJlbnRfdGhyZXNob2xkX21pbmltdW06dGhpcy5vcHRpb25zLmN1cnJlbnRUaHJlc2hvbGRNaW5pbXVtLGN1cnJlbnRfdGhyZXNob2xkX21heGltdW06dGhpcy5vcHRpb25zLmN1cnJlbnRUaHJlc2hvbGRNYXhpbXVtLHByZXZpb3VzX3RocmVzaG9sZF9taW5pbXVtOnRoaXMub3B0aW9ucy5wcmV2aW91c1RocmVzaG9sZE1pbmltdW0scHJldmlvdXNfdGhyZXNob2xkX21heGltdW06dGhpcy5vcHRpb25zLnByZXZpb3VzVGhyZXNob2xkTWF4aW11bSx0aHJlc2hvbGRfbWluaW11bTp0aGlzLm9wdGlvbnMudGhyZXNob2xkTWluaW11bSx0aHJlc2hvbGRfbWF4aW11bTp0aGlzLm9wdGlvbnMudGhyZXNob2xkTWF4aW11bSx0aHJlc2hvbGRfZmFjdG9yOnRoaXMub3B0aW9ucy50aHJlc2hvbGRGYWN0b3J9KX0pLHRoaXMuYWRkU3RlcCh7cHJvZ3JhbTp1LGdldFVuaWZvcm1zOigpPT4oe2lucHV0czpTKHQsdGhpcy5pbnB1dE1hc2spLHRocmVzaG9sZDpTKHQscy5vdXRwdXQpfSl9KSx0aGlzLmFkZFN0ZXAoe3Byb2dyYW06YyxnZXRVbmlmb3JtczooKT0+KHt0ZXh0dXJlOlModCx1Lm91dHB1dCl9KX0pLHRoaXMuYWRkU3RlcCh7cHJvZ3JhbTpmLGdldFVuaWZvcm1zOigpPT4oe3RleHR1cmU6Uyh0LGMub3V0cHV0KX0pfSksdGhpcy5hZGRTdGVwKHtwcm9ncmFtOmEsZ2V0VW5pZm9ybXM6KCk9Pih7dGV4dHVyZTpTKHQsZi5vdXRwdXQpfSl9KSx0aGlzLmFkZFN0ZXAoe3Byb2dyYW06ZCxnZXRVbmlmb3JtczooKT0+KHtpbnB1dF9mcmFtZTpTKHQsdGhpcy5pbnB1dEltYWdlKSxzZWdtZW50YXRpb25fbWFzazpTKHQsdGhpcy5pbnB1dE1hc2spLHRocmVzaG9sZDpTKHQsYS5vdXRwdXQpLHRleGVsX3NpemU6W1AsQ10sc3RlcDpBLHJhZGl1czpnLG9mZnNldDpBPjE/QSouNTowLHNpZ21hX3RleGVsOk1hdGgubWF4KFAsQykqZyxzaWdtYV9jb2xvcjouMX0pfSksdGhpcy5vdXRwdXQ9ZC5vdXRwdXR9c2V0RGF0YSh0LG4pe3RoaXMucHJldmlvdXNJbnB1dEltYWdlPXRoaXMuaW5wdXRJbWFnZT90aGlzLmlucHV0SW1hZ2U6dCx0aGlzLnByZXZpb3VzSW5wdXRNYXNrPXRoaXMuaW5wdXRNYXNrP3RoaXMuaW5wdXRNYXNrOm4sdGhpcy5pbnB1dEltYWdlPXQsdGhpcy5pbnB1dE1hc2s9bn1zZXRPcHRpb25zKHQpe3RoaXMub3B0aW9ucz10fX12YXIgUWY9YHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoKdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwp1bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlOwoKdm9pZCBtYWluKCkgeyBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodGV4dHVyZSwgX3RleHR1cmVfY29vcmQpOyB9CmAsWmY9YHZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCmF0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uOwphdHRyaWJ1dGUgdmVjMiB0ZXh0dXJlX2Nvb3JkOwp1bmlmb3JtIGJvb2wgaW52ZXJ0X3k7Cgp2b2lkIG1haW4oKSB7CiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLiwgMS4pOwogIF90ZXh0dXJlX2Nvb3JkID0gdGV4dHVyZV9jb29yZDsKICBpZiAoaW52ZXJ0X3kpIHsKICAgIF90ZXh0dXJlX2Nvb3JkLnkgPSAxLiAtIHRleHR1cmVfY29vcmQueTsKICB9Cn0KYDtjbGFzcyBlbCBleHRlbmRzIGdle2dldEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIFFmfWdldFZlcnRleFNoYWRlcigpe3JldHVybiBaZn19Y2xhc3MgdGwgZXh0ZW5kcyBEcntjb25zdHJ1Y3Rvcih0LG4saSl7c3VwZXIoKTt5KHRoaXMsImlucHV0SW1hZ2UiKTt0aGlzLmNvbnRleHQ9dDtjb25zdCBvPXtjb250ZXh0OnQsaGVpZ2h0Omksd2lkdGg6bn07dGhpcy5hZGRTdGVwKHtwcm9ncmFtOm5ldyBlbCh7Li4ubyxkaXNhYmxlRnJhbWVidWZmZXI6ITB9KSxnZXRVbmlmb3JtczooKT0+KHt0ZXh0dXJlOlModCx0aGlzLmlucHV0SW1hZ2UpLGludmVydF95OiEwfSl9KX1zZXREYXRhKHQpe3RoaXMuaW5wdXRJbWFnZT10fX1jbGFzcyBybHtjb25zdHJ1Y3RvcihlKXt5KHRoaXMsInJlc2l6ZSIpO3kodGhpcywiY2FudmFzIik7eSh0aGlzLCJjb250ZXh0Iik7dGhpcy5jYW52YXM9bmV3IE9mZnNjcmVlbkNhbnZhcygwLDApLHRoaXMuY29udGV4dD10aGlzLmNhbnZhcy5nZXRDb250ZXh0KCJ3ZWJnbDIiKSx0aGlzLmNhbnZhcy53aWR0aD1lLndpZHRoLHRoaXMuY2FudmFzLmhlaWdodD1lLmhlaWdodCx0aGlzLnJlc2l6ZT1uZXcgdGwodGhpcy5jb250ZXh0LGUud2lkdGgsZS5oZWlnaHQpfXJlc2l6ZUZvcmVncm91bmQoZSx0KXt0aGlzLmNhbnZhcy53aWR0aD1lLHRoaXMuY2FudmFzLmhlaWdodD10LHRoaXMucmVzaXplLnJlc2l6ZU91dHB1dChlLHQpfWFzeW5jIHByb2Nlc3MoZSl7dmFyIHQsbjtyZXR1cm4gdGhpcy5jYW52YXMud2lkdGg9dGhpcy5jYW52YXMud2lkdGgsKHQ9dGhpcy5yZXNpemUpPT1udWxsfHx0LnNldERhdGEoZSksKG49dGhpcy5yZXNpemUpPT1udWxsfHxuLnJ1bigpLHRoaXMuY2FudmFzfX1jbGFzcyBubHtjb25zdHJ1Y3RvcihlKXt5KHRoaXMsImltcHJvdmVNYXNrU2VnbWVudGF0aW9uIik7eSh0aGlzLCJiYWNrZ3JvdW5kUmVzaXplciIpO3kodGhpcywiYmFja2dyb3VuZEltYWdlIik7eSh0aGlzLCJiYWNrZ3JvdW5kVmlkZW8iKTt5KHRoaXMsImFjdGl2ZVBpcGVsaW5lIik7eSh0aGlzLCJjYW52YXMiKTt5KHRoaXMsIm9wdGlvbnMiKTt5KHRoaXMsImNvbnRleHQiKTt5KHRoaXMsInZpcnR1YWxCR0ltYWdlIik7dGhpcy5jYW52YXM9bmV3IE9mZnNjcmVlbkNhbnZhcygwLDApLHRoaXMuY29udGV4dD10aGlzLmNhbnZhcy5nZXRDb250ZXh0KCJ3ZWJnbDIiKSx0aGlzLmNhbnZhcy53aWR0aD1lLmZvcmVncm91bmRXaWR0aCx0aGlzLmNhbnZhcy5oZWlnaHQ9ZS5mb3JlZ3JvdW5kSGVpZ2h0LHRoaXMuaW1wcm92ZU1hc2tTZWdtZW50YXRpb249bmV3IEpmKHRoaXMuY29udGV4dCxlLm1hc2tXaWR0aCxlLm1hc2tIZWlnaHQpLHRoaXMuYmFja2dyb3VuZEltYWdlPW5ldyBDaSh0aGlzLmNvbnRleHQpLHRoaXMuYmFja2dyb3VuZFZpZGVvPW5ldyBNZih0aGlzLmNvbnRleHQpLHRoaXMuYmFja2dyb3VuZFJlc2l6ZXI9bmV3IHJsKHt3aWR0aDplLmZvcmVncm91bmRXaWR0aCxoZWlnaHQ6ZS5mb3JlZ3JvdW5kSGVpZ2h0fSl9c2V0QmFja2dyb3VuZE9wdGlvbnMoZSl7c3dpdGNoKGUudHJhbnNmb3JtZXJUeXBlKXtjYXNlIkJhY2tncm91bmRCbHVyIjp0aGlzLmFjdGl2ZVBpcGVsaW5lPW5ldyBEZih0aGlzLmNvbnRleHQsdGhpcy5nZXRCbHVyU2l6ZShlLnJhZGl1cykpO2JyZWFrO2Nhc2UiU2lsaG91ZXR0ZUJsdXIiOnRoaXMuYWN0aXZlUGlwZWxpbmU9bmV3IE5mKHRoaXMuY29udGV4dCx0aGlzLmdldEJsdXJTaXplKGUucmFkaXVzKSk7YnJlYWs7Y2FzZSJWaWRlb0JhY2tncm91bmQiOnRoaXMuYWN0aXZlUGlwZWxpbmU9dGhpcy5iYWNrZ3JvdW5kVmlkZW87YnJlYWs7Y2FzZSJWaXJ0dWFsQmFja2dyb3VuZCI6dGhpcy5hY3RpdmVQaXBlbGluZT10aGlzLmJhY2tncm91bmRJbWFnZTticmVha310aGlzLm9wdGlvbnM9ZX1zZXRGbGlja2VyaW5nT3B0aW9ucyhlKXt2YXIgdDsodD10aGlzLmltcHJvdmVNYXNrU2VnbWVudGF0aW9uKT09bnVsbHx8dC5zZXRPcHRpb25zKGUpfXNldFZpZGVvQkdSZWFkYWJsZShlKXt0aGlzLmJhY2tncm91bmRWaWRlby5pbnB1dFZpZGVvPWV9YXN5bmMgc2V0VmlydHVhbEJHSW1hZ2UoZSl7dGhpcy52aXJ0dWFsQkdJbWFnZT1lLHRoaXMuYmFja2dyb3VuZEltYWdlLmlucHV0QmFja2dyb3VuZEltYWdlPWF3YWl0IHRoaXMuYmFja2dyb3VuZFJlc2l6ZXIucHJvY2VzcyhlKX1hc3luYyBwcm9jZXNzKGUsdCl7dmFyIG4saSxvLHMsYTtpZih0aGlzLmFjdGl2ZVBpcGVsaW5lJiZlLndpZHRoJiYodD09bnVsbD92b2lkIDA6dC53aWR0aCkpe2xldCB1PXQ7KCgobj10aGlzLm9wdGlvbnMpPT1udWxsP3ZvaWQgMDpuLnNlbGZpZVNlZ21lbnRhdGlvblR5cGUpJiYoKGk9dGhpcy5vcHRpb25zKT09bnVsbD92b2lkIDA6aS5zZWxmaWVTZWdtZW50YXRpb25UeXBlKT09PSJQUkVDSVNFInx8ISgobz10aGlzLm9wdGlvbnMpIT1udWxsJiZvLnNlbGZpZVNlZ21lbnRhdGlvblR5cGUpJiZ0aGlzLmFjdGl2ZVBpcGVsaW5lLnByZWNpc2VNYXNrRW5hYmxlZCkmJih0aGlzLmltcHJvdmVNYXNrU2VnbWVudGF0aW9uLnNldERhdGEoZSx0KSx0aGlzLmltcHJvdmVNYXNrU2VnbWVudGF0aW9uLnJ1bigpLHU9dGhpcy5pbXByb3ZlTWFza1NlZ21lbnRhdGlvbi5vdXRwdXQpLChzPXRoaXMuYWN0aXZlUGlwZWxpbmUpPT1udWxsfHxzLnNldERhdGEoZSx1KSwoYT10aGlzLmFjdGl2ZVBpcGVsaW5lKT09bnVsbHx8YS5ydW4oKX19YXN5bmMgcmVzaXplRm9yZWdyb3VuZChlLHQpe3ZhciBuO3RoaXMuY2FudmFzLndpZHRoPWUsdGhpcy5jYW52YXMuaGVpZ2h0PXQsdGhpcy5iYWNrZ3JvdW5kSW1hZ2UucmVzaXplT3V0cHV0KGUsdCksdGhpcy5iYWNrZ3JvdW5kVmlkZW8ucmVzaXplT3V0cHV0KGUsdCksdGhpcy5iYWNrZ3JvdW5kUmVzaXplci5yZXNpemVGb3JlZ3JvdW5kKGUsdCksKG49dGhpcy5hY3RpdmVQaXBlbGluZSk9PW51bGx8fG4ucmVzaXplT3V0cHV0KGUsdCksdGhpcy52aXJ0dWFsQkdJbWFnZSYmKHRoaXMuYmFja2dyb3VuZEltYWdlLmlucHV0QmFja2dyb3VuZEltYWdlPWF3YWl0IHRoaXMuYmFja2dyb3VuZFJlc2l6ZXIucHJvY2Vzcyh0aGlzLnZpcnR1YWxCR0ltYWdlKSl9Z2V0Qmx1clNpemUoZT1zdC5Mb3cpe3N3aXRjaChlKXtjYXNlIHN0LkxvdzpyZXR1cm4gNTtjYXNlIHN0LkhpZ2g6cmV0dXJuIDEyfXJldHVybiBlfX12YXIgaWw9ZnVuY3Rpb24oKXt2YXIgcj10eXBlb2YgZG9jdW1lbnQ8InUiJiZkb2N1bWVudC5jdXJyZW50U2NyaXB0P2RvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjOnZvaWQgMDtyZXR1cm4gZnVuY3Rpb24oZSl7ZT1lfHx7fTt2YXIgdD10eXBlb2YgZTwidSI/ZTp7fSxuLGk7dC5yZWFkeT1uZXcgUHJvbWlzZShmdW5jdGlvbihsLGgpe249bCxpPWh9KTt2YXIgbz17fSxzO2ZvcihzIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShzKSYmKG9bc109dFtzXSk7dmFyIGE9Ii4vdGhpcy5wcm9ncmFtIix1PWZ1bmN0aW9uKGwsaCl7dGhyb3cgaH0sZj0hMCxjPSIiO2Z1bmN0aW9uIGQobCl7cmV0dXJuIHQubG9jYXRlRmlsZT90LmxvY2F0ZUZpbGUobCxjKTpjK2x9dmFyIHA7dHlwZW9mIGRvY3VtZW50PCJ1IiYmZG9jdW1lbnQuY3VycmVudFNjcmlwdCYmKGM9ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMpLHImJihjPXIpLGMuaW5kZXhPZigiYmxvYjoiKSE9PTA/Yz1jLnN1YnN0cigwLGMucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKTpjPSIiO3ZhciBfPXQucHJpbnR8fGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksbT10LnByaW50RXJyfHxjb25zb2xlLndhcm4uYmluZChjb25zb2xlKTtmb3IocyBpbiBvKW8uaGFzT3duUHJvcGVydHkocykmJih0W3NdPW9bc10pO289bnVsbCx0LmFyZ3VtZW50cyYmdC5hcmd1bWVudHMsdC50aGlzUHJvZ3JhbSYmKGE9dC50aGlzUHJvZ3JhbSksdC5xdWl0JiYodT10LnF1aXQpO3ZhciB4O3Qud2FzbUJpbmFyeSYmKHg9dC53YXNtQmluYXJ5KTt2YXIgdj10Lm5vRXhpdFJ1bnRpbWV8fCEwO3R5cGVvZiBXZWJBc3NlbWJseSE9Im9iamVjdCImJm1lKCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7dmFyIGcsQT0hMSxQPXR5cGVvZiBUZXh0RGVjb2RlcjwidSI/bmV3IFRleHREZWNvZGVyKCJ1dGY4Iik6dm9pZCAwO2Z1bmN0aW9uIEMobCxoLGIpe2Zvcih2YXIgdz1oK2IsTT1oO2xbTV0mJiEoTT49dyk7KSsrTTtpZihNLWg+MTYmJmwuc3ViYXJyYXkmJlApcmV0dXJuIFAuZGVjb2RlKGwuc3ViYXJyYXkoaCxNKSk7Zm9yKHZhciBCPSIiO2g8TTspe3ZhciBSPWxbaCsrXTtpZighKFImMTI4KSl7Qis9U3RyaW5nLmZyb21DaGFyQ29kZShSKTtjb250aW51ZX12YXIgaz1sW2grK10mNjM7aWYoKFImMjI0KT09MTkyKXtCKz1TdHJpbmcuZnJvbUNoYXJDb2RlKChSJjMxKTw8NnxrKTtjb250aW51ZX12YXIgZWU9bFtoKytdJjYzO2lmKChSJjI0MCk9PTIyND9SPShSJjE1KTw8MTJ8azw8NnxlZTpSPShSJjcpPDwxOHxrPDwxMnxlZTw8NnxsW2grK10mNjMsUjw2NTUzNilCKz1TdHJpbmcuZnJvbUNoYXJDb2RlKFIpO2Vsc2V7dmFyIFZpPVItNjU1MzY7Qis9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxWaT4+MTAsNTYzMjB8VmkmMTAyMyl9fXJldHVybiBCfWZ1bmN0aW9uIFcobCxoKXtyZXR1cm4gbD9DKEhlLGwsaCk6IiJ9ZnVuY3Rpb24gaWUobCxoLGIpe2Zvcih2YXIgdz0wO3c8bC5sZW5ndGg7Kyt3KUZ0W2grKz4+MF09bC5jaGFyQ29kZUF0KHcpO2J8fChGdFtoPj4wXT0wKX1mdW5jdGlvbiBYKGwsaCl7cmV0dXJuIGwlaD4wJiYobCs9aC1sJWgpLGx9dmFyIEJpLEZ0LEhlLFk7ZnVuY3Rpb24gVWkobCl7Qmk9bCx0LkhFQVA4PUZ0PW5ldyBJbnQ4QXJyYXkobCksdC5IRUFQMTY9bmV3IEludDE2QXJyYXkobCksdC5IRUFQMzI9WT1uZXcgSW50MzJBcnJheShsKSx0LkhFQVBVOD1IZT1uZXcgVWludDhBcnJheShsKSx0LkhFQVBVMTY9bmV3IFVpbnQxNkFycmF5KGwpLHQuSEVBUFUzMj1uZXcgVWludDMyQXJyYXkobCksdC5IRUFQRjMyPW5ldyBGbG9hdDMyQXJyYXkobCksdC5IRUFQRjY0PW5ldyBGbG9hdDY0QXJyYXkobCl9dC5JTklUSUFMX01FTU9SWTt2YXIgQnIsa2k9W10sTGk9W10sJGk9W10sbGw9MDtmdW5jdGlvbiBkbCgpe3JldHVybiB2fHxsbD4wfWZ1bmN0aW9uIG1sKCl7aWYodC5wcmVSdW4pZm9yKHR5cGVvZiB0LnByZVJ1bj09ImZ1bmN0aW9uIiYmKHQucHJlUnVuPVt0LnByZVJ1bl0pO3QucHJlUnVuLmxlbmd0aDspeWwodC5wcmVSdW4uc2hpZnQoKSk7VXIoa2kpfWZ1bmN0aW9uIGhsKCl7VXIoTGkpfWZ1bmN0aW9uIHBsKCl7aWYodC5wb3N0UnVuKWZvcih0eXBlb2YgdC5wb3N0UnVuPT0iZnVuY3Rpb24iJiYodC5wb3N0UnVuPVt0LnBvc3RSdW5dKTt0LnBvc3RSdW4ubGVuZ3RoOyl4bCh0LnBvc3RSdW4uc2hpZnQoKSk7VXIoJGkpfWZ1bmN0aW9uIHlsKGwpe2tpLnVuc2hpZnQobCl9ZnVuY3Rpb24gX2wobCl7TGkudW5zaGlmdChsKX1mdW5jdGlvbiB4bChsKXskaS51bnNoaWZ0KGwpfXZhciB2ZT0wLFZlPW51bGw7ZnVuY3Rpb24gYmwobCl7dmUrKyx0Lm1vbml0b3JSdW5EZXBlbmRlbmNpZXMmJnQubW9uaXRvclJ1bkRlcGVuZGVuY2llcyh2ZSl9ZnVuY3Rpb24gZ2wobCl7aWYodmUtLSx0Lm1vbml0b3JSdW5EZXBlbmRlbmNpZXMmJnQubW9uaXRvclJ1bkRlcGVuZGVuY2llcyh2ZSksdmU9PTAmJlZlKXt2YXIgaD1WZTtWZT1udWxsLGgoKX19dC5wcmVsb2FkZWRJbWFnZXM9e30sdC5wcmVsb2FkZWRBdWRpb3M9e307ZnVuY3Rpb24gbWUobCl7dC5vbkFib3J0JiZ0Lm9uQWJvcnQobCksbD0iQWJvcnRlZCgiK2wrIikiLG0obCksQT0hMCxsKz0iLiBCdWlsZCB3aXRoIC1zIEFTU0VSVElPTlM9MSBmb3IgbW9yZSBpbmZvLiI7dmFyIGg9bmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcihsKTt0aHJvdyBpKGgpLGh9dmFyIHZsPSJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIjtmdW5jdGlvbiBHaShsKXtyZXR1cm4gbC5zdGFydHNXaXRoKHZsKX12YXIgSztLPSJ0ZmxpdGUtc2ltZC53YXNtIixHaShLKXx8KEs9ZChLKSk7ZnVuY3Rpb24gemkobCl7dHJ5e2lmKGw9PUsmJngpcmV0dXJuIG5ldyBVaW50OEFycmF5KHgpO2lmKCFwKXRocm93ImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkIn1jYXRjaChoKXttZShoKX19ZnVuY3Rpb24gRWwoKXtyZXR1cm4heCYmZiYmdHlwZW9mIGZldGNoPT0iZnVuY3Rpb24iP2ZldGNoKEsse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKGZ1bmN0aW9uKGwpe2lmKCFsLm9rKXRocm93ImZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgJyIrSysiJyI7cmV0dXJuIGwuYXJyYXlCdWZmZXIoKX0pLmNhdGNoKGZ1bmN0aW9uKCl7cmV0dXJuIHppKEspfSk6UHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe3JldHVybiB6aShLKX0pfWZ1bmN0aW9uIFRsKCl7dmFyIGw9e2E6Vmx9O2Z1bmN0aW9uIGgoUixrKXt2YXIgZWU9Ui5leHBvcnRzO3QuYXNtPWVlLGc9dC5hc20ucSxVaShnLmJ1ZmZlciksQnI9dC5hc20uRSxfbCh0LmFzbS5yKSxnbCgpfWJsKCk7ZnVuY3Rpb24gYihSKXtoKFIuaW5zdGFuY2UpfWZ1bmN0aW9uIHcoUil7cmV0dXJuIEVsKCkudGhlbihmdW5jdGlvbihrKXtyZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoayxsKX0pLnRoZW4oZnVuY3Rpb24oayl7cmV0dXJuIGt9KS50aGVuKFIsZnVuY3Rpb24oayl7bSgiZmFpbGVkIHRvIGFzeW5jaHJvbm91c2x5IHByZXBhcmUgd2FzbTogIitrKSxtZShrKX0pfWZ1bmN0aW9uIE0oKXtyZXR1cm4heCYmdHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nPT0iZnVuY3Rpb24iJiYhR2koSykmJnR5cGVvZiBmZXRjaD09ImZ1bmN0aW9uIj9mZXRjaChLLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbihmdW5jdGlvbihSKXt2YXIgaz1XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhSLGwpO3JldHVybiBrLnRoZW4oYixmdW5jdGlvbihlZSl7cmV0dXJuIG0oIndhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAiK2VlKSxtKCJmYWxsaW5nIGJhY2sgdG8gQXJyYXlCdWZmZXIgaW5zdGFudGlhdGlvbiIpLHcoYil9KX0pOncoYil9aWYodC5pbnN0YW50aWF0ZVdhc20pdHJ5e3ZhciBCPXQuaW5zdGFudGlhdGVXYXNtKGwsaCk7cmV0dXJuIEJ9Y2F0Y2goUil7cmV0dXJuIG0oIk1vZHVsZS5pbnN0YW50aWF0ZVdhc20gY2FsbGJhY2sgZmFpbGVkIHdpdGggZXJyb3I6ICIrUiksITF9cmV0dXJuIE0oKS5jYXRjaChpKSx7fX1mdW5jdGlvbiBVcihsKXtmb3IoO2wubGVuZ3RoPjA7KXt2YXIgaD1sLnNoaWZ0KCk7aWYodHlwZW9mIGg9PSJmdW5jdGlvbiIpe2godCk7Y29udGludWV9dmFyIGI9aC5mdW5jO3R5cGVvZiBiPT0ibnVtYmVyIj9oLmFyZz09PXZvaWQgMD9Cci5nZXQoYikoKTpCci5nZXQoYikoaC5hcmcpOmIoaC5hcmc9PT12b2lkIDA/bnVsbDpoLmFyZyl9fWZ1bmN0aW9uIEFsKGwsaCxiLHcpe21lKCJBc3NlcnRpb24gZmFpbGVkOiAiK1cobCkrIiwgYXQ6ICIrW2g/VyhoKToidW5rbm93biBmaWxlbmFtZSIsYix3P1codyk6InVua25vd24gZnVuY3Rpb24iXSl9ZnVuY3Rpb24gd2wobCxoKXttZSgiVG8gdXNlIGRsb3BlbiwgeW91IG5lZWQgdG8gdXNlIEVtc2NyaXB0ZW4ncyBsaW5raW5nIHN1cHBvcnQsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZW1zY3JpcHRlbi1jb3JlL2Vtc2NyaXB0ZW4vd2lraS9MaW5raW5nIil9ZnVuY3Rpb24gUmwobCxoKXttZSgiVG8gdXNlIGRsb3BlbiwgeW91IG5lZWQgdG8gdXNlIEVtc2NyaXB0ZW4ncyBsaW5raW5nIHN1cHBvcnQsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZW1zY3JpcHRlbi1jb3JlL2Vtc2NyaXB0ZW4vd2lraS9MaW5raW5nIil9ZnVuY3Rpb24gU2woKXttZSgiIil9dmFyIFB0O1B0PWZ1bmN0aW9uKCl7cmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpfTt2YXIgSWw9ITA7ZnVuY3Rpb24gRmwobCl7cmV0dXJuIFlbSGkoKT4+Ml09bCxsfWZ1bmN0aW9uIFBsKGwsaCl7dmFyIGI7aWYobD09PTApYj1EYXRlLm5vdygpO2Vsc2UgaWYoKGw9PT0xfHxsPT09NCkmJklsKWI9UHQoKTtlbHNlIHJldHVybiBGbCgyOCksLTE7cmV0dXJuIFlbaD4+Ml09Yi8xZTN8MCxZW2grND4+Ml09YiUxZTMqMWUzKjFlM3wwLDB9ZnVuY3Rpb24gRGwoKXtyZXR1cm4gMjE0NzQ4MzY0OH1mdW5jdGlvbiBNbChsLGgsYil7SGUuY29weVdpdGhpbihsLGgsaCtiKX1mdW5jdGlvbiBDbChsKXt0cnl7cmV0dXJuIGcuZ3JvdyhsLUJpLmJ5dGVMZW5ndGgrNjU1MzU+Pj4xNiksVWkoZy5idWZmZXIpLDF9Y2F0Y2h7fX1mdW5jdGlvbiBPbChsKXt2YXIgaD1IZS5sZW5ndGg7bD1sPj4+MDt2YXIgYj0yMTQ3NDgzNjQ4O2lmKGw+YilyZXR1cm4hMTtmb3IodmFyIHc9MTt3PD00O3cqPTIpe3ZhciBNPWgqKDErLjIvdyk7TT1NYXRoLm1pbihNLGwrMTAwNjYzMjk2KTt2YXIgQj1NYXRoLm1pbihiLFgoTWF0aC5tYXgobCxNKSw2NTUzNikpLFI9Q2woQik7aWYoUilyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBObChsKXtmb3IodmFyIGg9UHQoKTtQdCgpLWg8bDspO312YXIga3I9e307ZnVuY3Rpb24gQmwoKXtyZXR1cm4gYXx8Ii4vdGhpcy5wcm9ncmFtIn1mdW5jdGlvbiBXZSgpe2lmKCFXZS5zdHJpbmdzKXt2YXIgbD0odHlwZW9mIG5hdmlnYXRvcj09Im9iamVjdCImJm5hdmlnYXRvci5sYW5ndWFnZXMmJm5hdmlnYXRvci5sYW5ndWFnZXNbMF18fCJDIikucmVwbGFjZSgiLSIsIl8iKSsiLlVURi04IixoPXtVU0VSOiJ3ZWJfdXNlciIsTE9HTkFNRToid2ViX3VzZXIiLFBBVEg6Ii8iLFBXRDoiLyIsSE9NRToiL2hvbWUvd2ViX3VzZXIiLExBTkc6bCxfOkJsKCl9O2Zvcih2YXIgYiBpbiBrcilrcltiXT09PXZvaWQgMD9kZWxldGUgaFtiXTpoW2JdPWtyW2JdO3ZhciB3PVtdO2Zvcih2YXIgYiBpbiBoKXcucHVzaChiKyI9IitoW2JdKTtXZS5zdHJpbmdzPXd9cmV0dXJuIFdlLnN0cmluZ3N9dmFyIER0PXttYXBwaW5nczp7fSxidWZmZXJzOltudWxsLFtdLFtdXSxwcmludENoYXI6ZnVuY3Rpb24obCxoKXt2YXIgYj1EdC5idWZmZXJzW2xdO2g9PT0wfHxoPT09MTA/KChsPT09MT9fOm0pKEMoYiwwKSksYi5sZW5ndGg9MCk6Yi5wdXNoKGgpfSx2YXJhcmdzOnZvaWQgMCxnZXQ6ZnVuY3Rpb24oKXtEdC52YXJhcmdzKz00O3ZhciBsPVlbRHQudmFyYXJncy00Pj4yXTtyZXR1cm4gbH0sZ2V0U3RyOmZ1bmN0aW9uKGwpe3ZhciBoPVcobCk7cmV0dXJuIGh9LGdldDY0OmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGx9fTtmdW5jdGlvbiBVbChsLGgpe3ZhciBiPTA7cmV0dXJuIFdlKCkuZm9yRWFjaChmdW5jdGlvbih3LE0pe3ZhciBCPWgrYjtZW2wrTSo0Pj4yXT1CLGllKHcsQiksYis9dy5sZW5ndGgrMX0pLDB9ZnVuY3Rpb24ga2wobCxoKXt2YXIgYj1XZSgpO1lbbD4+Ml09Yi5sZW5ndGg7dmFyIHc9MDtyZXR1cm4gYi5mb3JFYWNoKGZ1bmN0aW9uKE0pe3crPU0ubGVuZ3RoKzF9KSxZW2g+PjJdPXcsMH1mdW5jdGlvbiBMbChsKXtqbChsKX1mdW5jdGlvbiAkbChsKXtyZXR1cm4gMH1mdW5jdGlvbiBHbChsLGgsYix3LE0pe31mdW5jdGlvbiB6bChsLGgsYix3KXtmb3IodmFyIE09MCxCPTA7QjxiO0IrKyl7Zm9yKHZhciBSPVlbaCtCKjg+PjJdLGs9WVtoKyhCKjgrNCk+PjJdLGVlPTA7ZWU8aztlZSsrKUR0LnByaW50Q2hhcihsLEhlW1IrZWVdKTtNKz1rfXJldHVybiBZW3c+PjJdPU0sMH1mdW5jdGlvbiBIbCgpe2lmKHR5cGVvZiBjcnlwdG89PSJvYmplY3QiJiZ0eXBlb2YgY3J5cHRvLmdldFJhbmRvbVZhbHVlcz09ImZ1bmN0aW9uIil7dmFyIGw9bmV3IFVpbnQ4QXJyYXkoMSk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobCksbFswXX19ZWxzZSByZXR1cm4gZnVuY3Rpb24oKXttZSgicmFuZG9tRGV2aWNlIil9fWZ1bmN0aW9uIE10KGwsaCl7TXQucmFuZG9tRGV2aWNlfHwoTXQucmFuZG9tRGV2aWNlPUhsKCkpO2Zvcih2YXIgYj0wO2I8aDtiKyspRnRbbCtiPj4wXT1NdC5yYW5kb21EZXZpY2UoKTtyZXR1cm4gMH12YXIgVmw9e2E6QWwsZTp3bCxkOlJsLGI6U2wsbjpQbCxoOkRsLGw6TWwsbTpPbCxwOk5sLGY6VWwsZzprbCxqOkxsLGk6JGwsazpHbCxjOnpsLG86TXR9O1RsKCksdC5fX193YXNtX2NhbGxfY3RvcnM9ZnVuY3Rpb24oKXtyZXR1cm4odC5fX193YXNtX2NhbGxfY3RvcnM9dC5hc20ucikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldD10LmFzbS5zKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldElucHV0TWVtb3J5T2Zmc2V0PWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldElucHV0TWVtb3J5T2Zmc2V0PXQuYXNtLnQpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0SW5wdXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0SW5wdXRIZWlnaHQ9dC5hc20udSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRJbnB1dFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldElucHV0V2lkdGg9dC5hc20udikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRJbnB1dENoYW5uZWxDb3VudD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRJbnB1dENoYW5uZWxDb3VudD10LmFzbS53KS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldE91dHB1dE1lbW9yeU9mZnNldD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRPdXRwdXRNZW1vcnlPZmZzZXQ9dC5hc20ueCkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRPdXRwdXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0T3V0cHV0SGVpZ2h0PXQuYXNtLnkpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0T3V0cHV0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0T3V0cHV0V2lkdGg9dC5hc20ueikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRPdXRwdXRDaGFubmVsQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0T3V0cHV0Q2hhbm5lbENvdW50PXQuYXNtLkEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fbG9hZE1vZGVsPWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2xvYWRNb2RlbD10LmFzbS5CKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX3J1bkluZmVyZW5jZT1mdW5jdGlvbigpe3JldHVybih0Ll9ydW5JbmZlcmVuY2U9dC5hc20uQykuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9pc0dQVUVuYWJsZWQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5faXNHUFVFbmFibGVkPXQuYXNtLkQpLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIEhpPXQuX19fZXJybm9fbG9jYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4oSGk9dC5fX19lcnJub19sb2NhdGlvbj10LmFzbS5GKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LEN0O2Z1bmN0aW9uIFdsKGwpe3RoaXMubmFtZT0iRXhpdFN0YXR1cyIsdGhpcy5tZXNzYWdlPSJQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCIrbCsiKSIsdGhpcy5zdGF0dXM9bH1WZT1mdW5jdGlvbiBsKCl7Q3R8fExyKCksQ3R8fChWZT1sKX07ZnVuY3Rpb24gTHIobCl7aWYodmU+MHx8KG1sKCksdmU+MCkpcmV0dXJuO2Z1bmN0aW9uIGgoKXtDdHx8KEN0PSEwLHQuY2FsbGVkUnVuPSEwLCFBJiYoaGwoKSxuKHQpLHQub25SdW50aW1lSW5pdGlhbGl6ZWQmJnQub25SdW50aW1lSW5pdGlhbGl6ZWQoKSxwbCgpKSl9dC5zZXRTdGF0dXM/KHQuc2V0U3RhdHVzKCJSdW5uaW5nLi4uIiksc2V0VGltZW91dChmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0LnNldFN0YXR1cygiIil9LDEpLGgoKX0sMSkpOmgoKX10LnJ1bj1McjtmdW5jdGlvbiBqbChsLGgpe3FsKGwpfWZ1bmN0aW9uIHFsKGwpe2RsKCl8fCh0Lm9uRXhpdCYmdC5vbkV4aXQobCksQT0hMCksdShsLG5ldyBXbChsKSl9aWYodC5wcmVJbml0KWZvcih0eXBlb2YgdC5wcmVJbml0PT0iZnVuY3Rpb24iJiYodC5wcmVJbml0PVt0LnByZUluaXRdKTt0LnByZUluaXQubGVuZ3RoPjA7KXQucHJlSW5pdC5wb3AoKSgpO3JldHVybiBMcigpLGUucmVhZHl9fSgpO2NsYXNzIG9se2NvbnN0cnVjdG9yKCl7eSh0aGlzLCJzZWxlY3RlZFRGTGl0ZSIpO3kodGhpcywiaXNTSU1EU3VwcG9ydGVkIiwhMSk7eSh0aGlzLCJpc1RocmVhZHNTdXBwb3J0ZWQiLCExKTt5KHRoaXMsImlucHV0V2lkdGgiLDApO3kodGhpcywiaW5wdXRIZWlnaHQiLDApO3kodGhpcywiaW5wdXRDaGFubmVsQ291bnQiLDApO3kodGhpcywiaW5wdXRNZW1vcnlPZmZzZXQiLDApO3kodGhpcywib3V0cHV0V2lkdGgiLDApO3kodGhpcywib3V0cHV0SGVpZ2h0IiwwKTt5KHRoaXMsIm91dHB1dENoYW5uZWxDb3VudCIsMCk7eSh0aGlzLCJvdXRwdXRNZW1vcnlPZmZzZXQiLDApfX1jb25zdCBzbD0iaHR0cHM6Ly9kM29wcWptcXp4ZjA1Ny5jbG91ZGZyb250Lm5ldC92b25hZ2UtdGVuc29yZmxvdy13YXNtL3RmbGl0ZS1zaW1kLXdhc20vMS4xLjMvIixhbD0iaHR0cHM6Ly9kM29wcWptcXp4ZjA1Ny5jbG91ZGZyb250Lm5ldC9tbC9zZWxmaWVfc2VnbWVudGF0aW9uLzQuMC4wLyI7YXN5bmMgZnVuY3Rpb24gdWwocj1zbCxlPWFsKXtsZXQgdD1uZXcgb2w7dmFyIG49bmV3IFByb21pc2UoZnVuY3Rpb24oaSxvKXthc3luYyBmdW5jdGlvbiBzKCl7cmV0dXJuIGlsKHtsb2NhdGVGaWxlOmZ1bmN0aW9uKGYpe3JldHVybiByK2Z9fSl9YXN5bmMgZnVuY3Rpb24gYSh1KXtyZXR1cm4gbmV3IFByb21pc2UoYXN5bmMoZixjKT0+e2NvbnN0IGQ9dTtpZih0eXBlb2YgZD4idSIpcmV0dXJuIGMoIlRGTGl0ZSBiYWNrZW5kIHVuYXZhaWxhYmxlOiB3YXNtU2ltZCIpO2NvbnN0IHA9InNlbGZpZV9zZWdtZW50YXRpb25fbGFuZHNjYXBlIjtjb25zb2xlLmxvZygiTG9hZGluZyB0ZmxpdGUgbW9kZWw6IixwKTtsZXQgXz1lK2Ake3B9LnRmbGl0ZWA7Y29uc29sZS5sb2coIlRGTGl0ZSBtb2RlbFVybDogIitfKTt0cnl7Y29uc3QgeD1hd2FpdChhd2FpdCBmZXRjaChfKSkuYXJyYXlCdWZmZXIoKTtjb25zb2xlLmxvZygiTW9kZWwgYnVmZmVyIHNpemU6Iix4LmJ5dGVMZW5ndGgpO2NvbnN0IHY9ZC5fZ2V0TW9kZWxCdWZmZXJNZW1vcnlPZmZzZXQoKTtjb25zb2xlLmxvZygiTW9kZWwgYnVmZmVyIG1lbW9yeSBvZmZzZXQ6Iix2KSxjb25zb2xlLmxvZygiTG9hZGluZyBtb2RlbCBidWZmZXIuLi4iKSxkLkhFQVBVOC5zZXQobmV3IFVpbnQ4QXJyYXkoeCksdik7Y29uc3QgZz1kLl9sb2FkTW9kZWwoeC5ieXRlTGVuZ3RoKTtpZihjb25zb2xlLmxvZygiTG9hZCBtb2RlbCByZXN1bHQ6IixnKSxnIT09MCl7YygiQ2Fubm90IGxvYWQgbW9kZWwiKTtyZXR1cm59dC5pbnB1dFdpZHRoPWQuX2dldElucHV0V2lkdGgoKSx0LmlucHV0SGVpZ2h0PWQuX2dldElucHV0SGVpZ2h0KCksdC5pbnB1dENoYW5uZWxDb3VudD1kLl9nZXRJbnB1dENoYW5uZWxDb3VudCgpLHQuaW5wdXRNZW1vcnlPZmZzZXQ9ZC5fZ2V0SW5wdXRNZW1vcnlPZmZzZXQoKSxjb25zb2xlLmxvZygiSW5wdXQgbWVtb3J5IG9mZnNldDoiLHQuaW5wdXRNZW1vcnlPZmZzZXQpLGNvbnNvbGUubG9nKCJJbnB1dCBoZWlnaHQ6Iix0LmlucHV0SGVpZ2h0KSxjb25zb2xlLmxvZygiSW5wdXQgd2lkdGg6Iix0LmlucHV0V2lkdGgpLGNvbnNvbGUubG9nKCJJbnB1dCBjaGFubmVsczoiLHQuaW5wdXRDaGFubmVsQ291bnQpLHQub3V0cHV0TWVtb3J5T2Zmc2V0PWQuX2dldE91dHB1dE1lbW9yeU9mZnNldCgpLHQub3V0cHV0V2lkdGg9ZC5fZ2V0T3V0cHV0V2lkdGgoKSx0Lm91dHB1dEhlaWdodD1kLl9nZXRPdXRwdXRIZWlnaHQoKSx0Lm91dHB1dENoYW5uZWxDb3VudD1kLl9nZXRPdXRwdXRDaGFubmVsQ291bnQoKSxjb25zb2xlLmxvZygiT3V0cHV0IG1lbW9yeSBvZmZzZXQ6Iix0Lm91dHB1dE1lbW9yeU9mZnNldCksY29uc29sZS5sb2coIk91dHB1dCBoZWlnaHQ6Iix0Lm91dHB1dEhlaWdodCksY29uc29sZS5sb2coIk91dHB1dCB3aWR0aDoiLHQub3V0cHV0V2lkdGgpLGNvbnNvbGUubG9nKCJPdXRwdXQgY2hhbm5lbHM6Iix0Lm91dHB1dENoYW5uZWxDb3VudCksdC5zZWxlY3RlZFRGTGl0ZT1kfWNhdGNoKG0pe2MobSk7cmV0dXJufWYoKX0pfXMoKS50aGVuKHU9PntpZih1PT09bnVsbCl0aHJvdyBjb25zb2xlLmVycm9yKCJsb2FkVEZMaXRlIG51bGwiKSwibG9hZFRGTGl0ZSBudWxsIjthKHUpLnRoZW4oZj0+e2kodCl9KS5jYXRjaChmPT57Y29uc29sZS5lcnJvcigibG9hZFRGTGl0ZU1vZGVsIGVycm9yIiksbygibG9hZFRGTGl0ZU1vZGVsIGVycm9yIil9KX0pLmNhdGNoKHU9Pntjb25zb2xlLmVycm9yKCJsb2FkVEZMaXRlIGVycm9yOiIsdSksbygibG9hZFRGTGl0ZSBlcnJvcjoiK3UpfSl9KTtyZXR1cm4gbn1jbGFzcyBjbHtjb25zdHJ1Y3Rvcigpe3kodGhpcywiY2FudmFzIixuZXcgT2Zmc2NyZWVuQ2FudmFzKDAsMCkpO3kodGhpcywiY29udGV4dCIsdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgiMmQiLHt3aWxsUmVhZEZyZXF1ZW50bHk6ITB9KSk7eSh0aGlzLCJwaXhlbENvdW50IiwwKTt5KHRoaXMsImlucHV0T2Zmc2V0IiwwKTt5KHRoaXMsIm91dHB1dE9mZnNldCIsMCk7eSh0aGlzLCJpbmZvcyIpO3kodGhpcywibWFzayIpfWFzeW5jIGluaXQoZSx0KXthd2FpdCB0aGlzLmluaXRXYXNtKGUsdCksdGhpcy5pbmZvcyYmKHRoaXMuY2FudmFzLndpZHRoPXRoaXMuaW5mb3MuaW5wdXRXaWR0aCx0aGlzLmNhbnZhcy5oZWlnaHQ9dGhpcy5pbmZvcy5pbnB1dEhlaWdodCx0aGlzLnBpeGVsQ291bnQ9dGhpcy5pbmZvcy5pbnB1dFdpZHRoKnRoaXMuaW5mb3MuaW5wdXRIZWlnaHQsdGhpcy5tYXNrPW5ldyBJbWFnZURhdGEodGhpcy5pbmZvcy5pbnB1dFdpZHRoLHRoaXMuaW5mb3MuaW5wdXRIZWlnaHQpLHRoaXMuaW5wdXRPZmZzZXQ9dGhpcy5pbmZvcy5pbnB1dE1lbW9yeU9mZnNldC80LHRoaXMub3V0cHV0T2Zmc2V0PXRoaXMuaW5mb3Mub3V0cHV0TWVtb3J5T2Zmc2V0LzQpfWFzeW5jIGluaXRXYXNtKGUsdCl7dGhpcy5pbmZvcz1hd2FpdCB1bChlLHQpfWdldE91dHB1dERpbWVuc2lvbnMoKXt2YXIgZSx0LG4saTtyZXR1cm57d2lkdGg6KHQ9KGU9dGhpcy5pbmZvcyk9PW51bGw/dm9pZCAwOmUub3V0cHV0V2lkdGgpIT1udWxsP3Q6MCxoZWlnaHQ6KGk9KG49dGhpcy5pbmZvcyk9PW51bGw/dm9pZCAwOm4ub3V0cHV0SGVpZ2h0KSE9bnVsbD9pOjB9fWFzeW5jIHByb2Nlc3MoZSl7aWYoIXRoaXMubWFza3x8IXRoaXMuaW5mb3MpcmV0dXJuO2NvbnN0IHQ9dGhpcy5pbmZvcy5pbnB1dFdpZHRoLG49dGhpcy5pbmZvcy5pbnB1dEhlaWdodDt0aGlzLmNvbnRleHQuZHJhd0ltYWdlKGUsMCwwLGUud2lkdGgsZS5oZWlnaHQsMCwwLHQsbik7Y29uc3QgaT10aGlzLmNvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsMCx0LG4pLG89dGhpcy5pbmZvcy5zZWxlY3RlZFRGTGl0ZS5IRUFQRjMyO2ZvcihsZXQgcz0wO3M8dGhpcy5waXhlbENvdW50O3MrKyl7Y29uc3QgYT10aGlzLmlucHV0T2Zmc2V0K3MqMztvW2FdPWkuZGF0YVtzKjRdLzI1NSxvW2ErMV09aS5kYXRhW3MqNCsxXS8yNTUsb1thKzJdPWkuZGF0YVtzKjQrMl0vMjU1fXRoaXMuaW5mb3Muc2VsZWN0ZWRURkxpdGUuX3J1bkluZmVyZW5jZSgpO2ZvcihsZXQgcz0wO3M8dGhpcy5waXhlbENvdW50O3MrKyl7Y29uc3QgYT10aGlzLmluZm9zLnNlbGVjdGVkVEZMaXRlLkhFQVBGMzJbdGhpcy5vdXRwdXRPZmZzZXQrc107dGhpcy5tYXNrLmRhdGFbcyo0XT10aGlzLm1hc2suZGF0YVtzKjQrM109MjU1KmF9cmV0dXJuIGNyZWF0ZUltYWdlQml0bWFwKHRoaXMubWFzayl9aXNHcHVTdXBwb3J0ZWQoKXt2YXIgZSx0LG47cmV0dXJuKG49KHQ9KGU9dGhpcy5pbmZvcyk9PW51bGw/dm9pZCAwOmUuc2VsZWN0ZWRURkxpdGUpPT1udWxsP3ZvaWQgMDp0Ll9pc0dQVUVuYWJsZWQoKSkhPW51bGw/bjohMX19Y2xhc3MgZmx7Y29uc3RydWN0b3IoKXt5KHRoaXMsInNlbGZpZVNlZ21lbnRhdGlvbiIsbmV3IGNsKTt5KHRoaXMsImJhY2tncm91bmRGaWx0ZXIiKTt5KHRoaXMsInByZXZpb3VzRGltZW5zaW9ucyIse3dpZHRoOjAsaGVpZ2h0OjB9KX1hc3luYyBpbml0KGUpe2F3YWl0IHRoaXMuc2VsZmllU2VnbWVudGF0aW9uLmluaXQoZS53YXNtQXNzZXRVcmlQYXRoLGUudGZsaXRlQXNzZXRVcmlQYXRoKTtjb25zdHt3aWR0aDp0LGhlaWdodDpufT10aGlzLnNlbGZpZVNlZ21lbnRhdGlvbi5nZXRPdXRwdXREaW1lbnNpb25zKCk7dGhpcy5iYWNrZ3JvdW5kRmlsdGVyPW5ldyBubCh7Zm9yZWdyb3VuZFdpZHRoOjEsZm9yZWdyb3VuZEhlaWdodDoxLG1hc2tXaWR0aDp0LG1hc2tIZWlnaHQ6bn0pfWFzeW5jIHRyYW5zZm9ybShlLHQpe3ZhciBvLHMsYSx1O2NvbnN0IG49YXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAoZSksaT1hd2FpdCB0aGlzLnNlbGZpZVNlZ21lbnRhdGlvbi5wcm9jZXNzKG4pO2k/KChuLndpZHRoIT09dGhpcy5wcmV2aW91c0RpbWVuc2lvbnMud2lkdGh8fG4uaGVpZ2h0IT09dGhpcy5wcmV2aW91c0RpbWVuc2lvbnMuaGVpZ2h0KSYmKHRoaXMucHJldmlvdXNEaW1lbnNpb25zLndpZHRoPW4ud2lkdGgsdGhpcy5wcmV2aW91c0RpbWVuc2lvbnMuaGVpZ2h0PW4uaGVpZ2h0LGF3YWl0KChvPXRoaXMuYmFja2dyb3VuZEZpbHRlcik9PW51bGw/dm9pZCAwOm8ucmVzaXplRm9yZWdyb3VuZChuLndpZHRoLG4uaGVpZ2h0KSkpLGF3YWl0KChzPXRoaXMuYmFja2dyb3VuZEZpbHRlcik9PW51bGw/dm9pZCAwOnMucHJvY2VzcyhuLGkpKSxlLmNsb3NlKCksdC5lbnF1ZXVlKG5ldyBWaWRlb0ZyYW1lKChhPXRoaXMuYmFja2dyb3VuZEZpbHRlcik9PW51bGw/dm9pZCAwOmEuY2FudmFzLHt0aW1lc3RhbXA6KHU9ZS50aW1lc3RhbXApIT1udWxsP3U6MCxhbHBoYToiZGlzY2FyZCJ9KSkpOnQuZW5xdWV1ZShlKX1hc3luYyBzZXRCYWNrZ3JvdW5kT3B0aW9ucyhlKXt2YXIgdDthd2FpdCgodD10aGlzLmJhY2tncm91bmRGaWx0ZXIpPT1udWxsP3ZvaWQgMDp0LnNldEJhY2tncm91bmRPcHRpb25zKGUpKX1hc3luYyBzZXRWaWRlb0JHUmVhZGFibGUoZSl7dmFyIHQ7YXdhaXQoKHQ9dGhpcy5iYWNrZ3JvdW5kRmlsdGVyKT09bnVsbD92b2lkIDA6dC5zZXRWaWRlb0JHUmVhZGFibGUoZSkpfWFzeW5jIHNldFZpcnR1YWxCR0ltYWdlKGUpe3ZhciB0O2F3YWl0KCh0PXRoaXMuYmFja2dyb3VuZEZpbHRlcik9PW51bGw/dm9pZCAwOnQuc2V0VmlydHVhbEJHSW1hZ2UoZSkpfXNldEZsaWNrZXJpbmdPcHRpb25zKGUpe3ZhciB0Oyh0PXRoaXMuYmFja2dyb3VuZEZpbHRlcik9PW51bGx8fHQuc2V0RmxpY2tlcmluZ09wdGlvbnMoZSl9fWNvbnN0IE5yPWNsYXNze2NvbnN0cnVjdG9yKCl7eSh0aGlzLCJiYWNrZ3JvdW5kVHJhbnNmb3JtZXIiLG5ldyBmbCk7eSh0aGlzLCJtZWRpYVByb2Nlc3NvciIsbmV3IFRzKTt5KHRoaXMsInJhdGUiLDMwKTt5KHRoaXMsInJlc29sdmVPbk1lZGlhUHJvY2Vzc29yIik7eSh0aGlzLCJldmVudHNRdWV1ZSIsW10pfWFzeW5jIGluaXQoZSl7YXdhaXQgdGhpcy5iYWNrZ3JvdW5kVHJhbnNmb3JtZXIuaW5pdChlKSxhd2FpdCB0aGlzLm1lZGlhUHJvY2Vzc29yLnNldFRyYW5zZm9ybWVycyhbdGhpcy5iYWNrZ3JvdW5kVHJhbnNmb3JtZXJdKSx0aGlzLm1lZGlhUHJvY2Vzc29yLnNldFRyYWNrRXhwZWN0ZWRSYXRlKHRoaXMucmF0ZSksdGhpcy5tZWRpYVByb2Nlc3Nvci5vbkFueSgodCxuKT0+e3RoaXMucmVzb2x2ZU9uTWVkaWFQcm9jZXNzb3I/KHRoaXMucmVzb2x2ZU9uTWVkaWFQcm9jZXNzb3Ioe25hbWU6dCxkYXRhOm59KSx0aGlzLnJlc29sdmVPbk1lZGlhUHJvY2Vzc29yPXZvaWQgMCk6dGhpcy5ldmVudHNRdWV1ZS5wdXNoKHtuYW1lOnQsZGF0YTpufSl9KX1hc3luYyBvbk1lZGlhUHJvY2Vzc29yRXZlbnQoKXtyZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoZT0+e3RoaXMuZXZlbnRzUXVldWUubGVuZ3RoPjA/ZSh0aGlzLmV2ZW50c1F1ZXVlLnNoaWZ0KCkpOnRoaXMucmVzb2x2ZU9uTWVkaWFQcm9jZXNzb3I9ZX0pfWFzeW5jIHNldFRyYWNrRXhwZWN0ZWRSYXRlKGUpe3RoaXMucmF0ZT1lLHRoaXMubWVkaWFQcm9jZXNzb3Iuc2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl9YXN5bmMgdHJhbnNmb3JtKGUsdCl7dGhpcy5tZWRpYVByb2Nlc3Nvci50cmFuc2Zvcm0oZSx0KX1hc3luYyBzZXRCYWNrZ3JvdW5kT3B0aW9ucyhlKXt2YXIgdDthd2FpdCgodD10aGlzLmJhY2tncm91bmRUcmFuc2Zvcm1lcik9PW51bGw/dm9pZCAwOnQuc2V0QmFja2dyb3VuZE9wdGlvbnMoZSkpfXNldFZpZGVvQkdSZWFkYWJsZShlKXt0aGlzLmJhY2tncm91bmRUcmFuc2Zvcm1lci5zZXRWaWRlb0JHUmVhZGFibGUoZSl9YXN5bmMgc2V0VmlydHVhbEJHSW1hZ2UoZSl7YXdhaXQgdGhpcy5iYWNrZ3JvdW5kVHJhbnNmb3JtZXIuc2V0VmlydHVhbEJHSW1hZ2UoZSl9YXN5bmMgdGVybWluYXRlKCl7YXdhaXQgdGhpcy5tZWRpYVByb2Nlc3Nvci5kZXN0cm95KCl9c2V0RmxpY2tlcmluZ09wdGlvbnMoZSl7dGhpcy5iYWNrZ3JvdW5kVHJhbnNmb3JtZXIuc2V0RmxpY2tlcmluZ09wdGlvbnMoZSl9c2V0Vm9uYWdlTWV0YWRhdGEoZSl7dXMoZSl9fTtsZXQgTmk9TnI7KCgpPT57amkoIlByb2Nlc3NvcldvcmtlciIsTnIpfSkoKX0pKCk7Cg==",au=typeof window<"u"&&window.Blob&&new Blob([atob(cu)],{type:"text/javascript;charset=utf-8"});function N3(){const o=au&&(window.URL||window.webkitURL).createObjectURL(au);try{return o?new Worker(o):new Worker("data:application/javascript;base64,"+cu)}finally{o&&(window.URL||window.webkitURL).revokeObjectURL(o)}}class k3 extends Ks{constructor(){super(...arguments);Ht(this,"rate",30);Ht(this,"worker")}async init(r){this.worker=await $2(ts,N3),await this.worker.init(r),await this.worker.setVonageMetadata(Is()),await this.setBackgroundOptions(r),this.listenWorker()}async setTrackExpectedRate(r){var m;await((m=this.worker)==null?void 0:m.setTrackExpectedRate(r))}async setBackgroundOptions(r){var Z,I,F;const{transformerType:m}=r;switch(m){case"VideoBackground":await((Z=this.worker)==null?void 0:Z.setVideoBGReadable(await js.createVideoReadable(r.backgroundAssetUri)));break;case"VirtualBackground":await((I=this.worker)==null?void 0:I.setVirtualBGImage(await js.createImageCanvas(r.backgroundAssetUri)));break}await((F=this.worker)==null?void 0:F.setBackgroundOptions(r))}async transform(r,m){var Z;await((Z=this.worker)==null?void 0:Z.transform(r,m))}async destroy(){var r;await((r=this.worker)==null?void 0:r.terminate())}async setFlickeringOptions(r){var m;await((m=this.worker)==null?void 0:m.setFlickeringOptions(r))}async listenWorker(){var r,m,Z;for(;(r=this.worker)!=null&&r.worker;){const{name:I,data:F}=await((m=this.worker)==null?void 0:m.onMediaProcessorEvent());switch(I){case"error":case"warn":this.emit(I,F);break;case"pipelineInfo":switch(this.emit(I,F),F){case"pipeline_ended":case"pipeline_ended_with_error":await((Z=this.worker)==null?void 0:Z.terminate());return}break}}}}class du extends Ks{constructor(){super();Ht(this,"worker",new k3);Ht(this,"connector",new U2(this.worker))}async init(r){await this.worker.init(r),this.worker.onAny((m,Z)=>this.emit(m,Z))}async setBackgroundOptions(r){await this.worker.setBackgroundOptions(r)}setTrackExpectedRate(r){this.worker.setTrackExpectedRate(r)}getConnector(){return this.connector}static async create(r){const m=new this;return await m.init(r),m}}function E3(){return mi}function U3(){return pi}function K3(){return bi}function M3(){return yi}function B3(){return gi}function A3(){return Zi}function j3(){return vi}var hu=(o=>(o.FAST="FAST",o.PRECISE="PRECISE",o))(hu||{});async function z3(o){return await du.create(o)}ze.BackgroundTransformer=uu,ze.BlurRadius=Mr,ze.ErrorFunction=Hs,ze.MediapipeHelper=Gi,ze.PipelineInfoData=fi,ze.SelfieSegmentationType=hu,ze.VonageMediaProcessor=du,ze.WarningType=Fs,ze.createVonageMediaProcessor=z3,ze.getSupportedBrowserFeatures=Js,ze.getVonageFaceDetection=M3,ze.getVonageFaceMash=B3,ze.getVonageHands=U3,ze.getVonageHolistic=K3,ze.getVonageObjectron=A3,ze.getVonagePose=j3,ze.getVonageSelfieSegmentation=E3,ze.isSupported=P2,Object.defineProperties(ze,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
458
+ `;class H3 extends xr{getFragmentShader(){return w3}getVertexShader(){return F3}}class C3 extends Qo{constructor(r,m,Z){super();Ht(this,"inputImage");this.context=r;const I={context:r,height:Z,width:m};this.addStep({program:new H3({...I,disableFramebuffer:!0}),getUniforms:()=>({texture:mn(r,this.inputImage),invert_y:!0})})}setData(r){this.inputImage=r}}class J3{constructor(n){Ht(this,"resize");Ht(this,"canvas");Ht(this,"context");this.canvas=new OffscreenCanvas(0,0),this.context=this.canvas.getContext("webgl2"),this.canvas.width=n.width,this.canvas.height=n.height,this.resize=new C3(this.context,n.width,n.height)}resizeForeground(n,r){this.canvas.width=n,this.canvas.height=r,this.resize.resizeOutput(n,r)}async process(n){var r,m;return this.canvas.width=this.canvas.width,(r=this.resize)==null||r.setData(n),(m=this.resize)==null||m.run(),this.canvas}}class N3{constructor(n){Ht(this,"improveMaskSegmentation");Ht(this,"backgroundResizer");Ht(this,"backgroundImage");Ht(this,"backgroundVideo");Ht(this,"activePipeline");Ht(this,"canvas");Ht(this,"options");Ht(this,"context");Ht(this,"virtualBGImage");this.canvas=new OffscreenCanvas(0,0),this.context=this.canvas.getContext("webgl2"),this.canvas.width=n.foregroundWidth,this.canvas.height=n.foregroundHeight,this.improveMaskSegmentation=new T3(this.context,n.maskWidth,n.maskHeight),this.backgroundImage=new su(this.context),this.backgroundVideo=new h3(this.context),this.backgroundResizer=new J3({width:n.foregroundWidth,height:n.foregroundHeight})}setBackgroundOptions(n){switch(n.transformerType){case"BackgroundBlur":this.activePipeline=new d3(this.context,this.getBlurSize(n.radius));break;case"SilhouetteBlur":this.activePipeline=new p3(this.context,this.getBlurSize(n.radius));break;case"VideoBackground":this.activePipeline=this.backgroundVideo;break;case"VirtualBackground":this.activePipeline=this.backgroundImage;break}this.options=n}setFlickeringOptions(n){var r;(r=this.improveMaskSegmentation)==null||r.setOptions(n)}setVideoBGReadable(n){this.backgroundVideo.inputVideo=n}async setVirtualBGImage(n){this.virtualBGImage=n,this.backgroundImage.inputBackgroundImage=await this.backgroundResizer.process(n)}async process(n,r){var m,Z,I,F,L;if(this.activePipeline&&n.width&&(r==null?void 0:r.width)){let E=r;(((m=this.options)==null?void 0:m.selfieSegmentationType)&&((Z=this.options)==null?void 0:Z.selfieSegmentationType)==="PRECISE"||!((I=this.options)!=null&&I.selfieSegmentationType)&&this.activePipeline.preciseMaskEnabled)&&(this.improveMaskSegmentation.setData(n,r),this.improveMaskSegmentation.run(),E=this.improveMaskSegmentation.output),(F=this.activePipeline)==null||F.setData(n,E),(L=this.activePipeline)==null||L.run()}}async resizeForeground(n,r){var m;this.canvas.width=n,this.canvas.height=r,this.backgroundImage.resizeOutput(n,r),this.backgroundVideo.resizeOutput(n,r),this.backgroundResizer.resizeForeground(n,r),(m=this.activePipeline)==null||m.resizeOutput(n,r),this.virtualBGImage&&(this.backgroundImage.inputBackgroundImage=await this.backgroundResizer.process(this.virtualBGImage))}getBlurSize(n=Mr.Low){switch(n){case Mr.Low:return 5;case Mr.High:return 12}return n}}class uu{constructor(){Ht(this,"selfieSegmentation",new Cs);Ht(this,"backgroundFilter");Ht(this,"previousDimensions",{width:0,height:0})}async init(n){await this.selfieSegmentation.init(n.wasmAssetUriPath,n.tfliteAssetUriPath);const{width:r,height:m}=this.selfieSegmentation.getOutputDimensions();this.backgroundFilter=new N3({foregroundWidth:1,foregroundHeight:1,maskWidth:r,maskHeight:m})}async transform(n,r){var I,F,L,E;const m=await createImageBitmap(n),Z=await this.selfieSegmentation.process(m);Z?((m.width!==this.previousDimensions.width||m.height!==this.previousDimensions.height)&&(this.previousDimensions.width=m.width,this.previousDimensions.height=m.height,await((I=this.backgroundFilter)==null?void 0:I.resizeForeground(m.width,m.height))),await((F=this.backgroundFilter)==null?void 0:F.process(m,Z)),n.close(),r.enqueue(new VideoFrame((L=this.backgroundFilter)==null?void 0:L.canvas,{timestamp:(E=n.timestamp)!=null?E:0,alpha:"discard"}))):r.enqueue(n)}async setBackgroundOptions(n){var r;await((r=this.backgroundFilter)==null?void 0:r.setBackgroundOptions(n))}async setVideoBGReadable(n){var r;await((r=this.backgroundFilter)==null?void 0:r.setVideoBGReadable(n))}async setVirtualBGImage(n){var r;await((r=this.backgroundFilter)==null?void 0:r.setVirtualBGImage(n))}setFlickeringOptions(n){var r;(r=this.backgroundFilter)==null||r.setFlickeringOptions(n)}}const es=class{constructor(){Ht(this,"backgroundTransformer",new uu);Ht(this,"mediaProcessor",new k2);Ht(this,"rate",30);Ht(this,"resolveOnMediaProcessor");Ht(this,"eventsQueue",[])}async init(n){await this.backgroundTransformer.init(n),await this.mediaProcessor.setTransformers([this.backgroundTransformer]),this.mediaProcessor.setTrackExpectedRate(this.rate),this.mediaProcessor.onAny((r,m)=>{this.resolveOnMediaProcessor?(this.resolveOnMediaProcessor({name:r,data:m}),this.resolveOnMediaProcessor=void 0):this.eventsQueue.push({name:r,data:m})})}async onMediaProcessorEvent(){return await new Promise(n=>{this.eventsQueue.length>0?n(this.eventsQueue.shift()):this.resolveOnMediaProcessor=n})}async setTrackExpectedRate(n){this.rate=n,this.mediaProcessor.setTrackExpectedRate(n)}async transform(n,r){this.mediaProcessor.transform(n,r)}async setBackgroundOptions(n){var r;await((r=this.backgroundTransformer)==null?void 0:r.setBackgroundOptions(n))}setVideoBGReadable(n){this.backgroundTransformer.setVideoBGReadable(n)}async setVirtualBGImage(n){await this.backgroundTransformer.setVirtualBGImage(n)}async terminate(){await this.mediaProcessor.destroy()}setFlickeringOptions(n){this.backgroundTransformer.setFlickeringOptions(n)}setVonageMetadata(n){V2(n)}};let ts=es;(()=>{ec("ProcessorWorker",es)})();const cu="dmFyIFhsPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgWWw9KEosdGUscmUpPT50ZSBpbiBKP1hsKEosdGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnJlfSk6Slt0ZV09cmU7dmFyIHk9KEosdGUscmUpPT4oWWwoSix0eXBlb2YgdGUhPSJzeW1ib2wiP3RlKyIiOnRlLHJlKSxyZSk7KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBKPShyPT4ocltyLklOSVQ9MF09IklOSVQiLHJbci5GT1JXQVJEPTFdPSJGT1JXQVJEIixyW3IuVEVSTUlOQVRFPTJdPSJURVJNSU5BVEUiLHIpKShKfHx7fSk7ZnVuY3Rpb24gdGUocil7cmV0dXJuW0ltYWdlQml0bWFwLFJlYWRhYmxlU3RyZWFtLFdyaXRhYmxlU3RyZWFtXS5zb21lKGU9PnIgaW5zdGFuY2VvZiBlKX1mdW5jdGlvbiByZShyLGUpe2NvbnN0e2lkOnR9PXIsbj1BcnJheS5pc0FycmF5KGUpP2U6W2VdO3Bvc3RNZXNzYWdlKHtpZDp0LHJlc3VsdDplfSxuLmZpbHRlcihpPT50ZShpKSkpfWFzeW5jIGZ1bmN0aW9uIFdpKHIsZSl7Y29uc3R7ZnVuY3Rpb25OYW1lOnQsYXJnczpufT1yO2lmKCFlLmluc3RhbmNlKXRocm93Imluc3RhbmNlIG5vdCBpbml0aWFsaXplZCI7aWYoIXQpdGhyb3cibWlzc2luZyBmdW5jdGlvbiBuYW1lIHRvIGNhbGwiO2lmKCFlLmluc3RhbmNlW3RdKXRocm93YHVuZGVmaW5lZCBmdW5jdGlvbiBbJHt0fV0gaW4gY2xhc3MgJHtlLmluc3RhbmNlLmNvbnN0cnVjdG9yLndvcmtlcklkfWA7cmUocixhd2FpdCBlLmluc3RhbmNlW3RdKC4uLm4hPW51bGw/bjpbXSkpfWZ1bmN0aW9uICRyKCl7cmV0dXJuIHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZTwidSImJnNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZX1jb25zdCBHcj17fTtmdW5jdGlvbiBqaShyLGUpe2Uud29ya2VySWQ9ciwkcigpJiYoR3JbZS53b3JrZXJJZF09ZSl9ZnVuY3Rpb24gcWkocixlKXtpZighci5hcmdzKXRocm93Ik1pc3NpbmcgY2xhc3NOYW1lIHdoaWxlIGluaXRpYWxpemluZyB3b3JrZXIiO2NvbnN0W3RdPXIuYXJncyxuPUdyW3RdO2lmKG4pZS5pbnN0YW5jZT1uZXcgbihyLmFyZ3Muc2xpY2UoMSkpO2Vsc2UgdGhyb3dgdW5rbm93biB3b3JrZXIgY2xhc3MgJHt0fWA7cmUocix0eXBlb2YgZS5pbnN0YW5jZSE9PXZvaWQgMCl9YXN5bmMgZnVuY3Rpb24gWGkocixlKXtjb25zdHthcmdzOnR9PXI7aWYoIWUuaW5zdGFuY2UpdGhyb3ciaW5zdGFuY2Ugbm90IGluaXRpYWxpemVkIjtsZXQgbjtlLmluc3RhbmNlLnRlcm1pbmF0ZSYmKG49YXdhaXQgZS5pbnN0YW5jZS50ZXJtaW5hdGUoLi4udCE9bnVsbD90OltdKSkscmUocixuKX1mdW5jdGlvbiBZaSgpe2NvbnN0IHI9e307b25tZXNzYWdlPWFzeW5jIGU9Pntjb25zdCB0PWUuZGF0YTtzd2l0Y2godC50eXBlKXtjYXNlIEouSU5JVDpxaSh0LHIpO2JyZWFrO2Nhc2UgSi5GT1JXQVJEOldpKHQscik7YnJlYWs7Y2FzZSBKLlRFUk1JTkFURTpYaSh0LHIpO2JyZWFrfX19JHIoKSYmWWkoKTtjbGFzcyBuZXt9bmUudXBkYXRlcz17dHJhbnNmb3JtZXJfbmV3OiJOZXcgdHJhbnNmb3JtZXIiLHRyYW5zZm9ybWVyX251bGw6Ik51bGwgdHJhbnNmb3JtZXIifSxuZS5lcnJvcnM9e3RyYW5zZm9ybWVyX25vbmU6Ik5vIHRyYW5zZm9ybWVycyBwcm92aWRlZCIsdHJhbnNmb3JtZXJfc3RhcnQ6IkNhbm5vdCBzdGFydCB0cmFuc2Zvcm1lciIsdHJhbnNmb3JtZXJfdHJhbnNmb3JtOiJDYW5ub3QgdHJhbnNmb3JtIGZyYW1lIix0cmFuc2Zvcm1lcl9mbHVzaDoiQ2Fubm90IGZsdXNoIHRyYW5zZm9ybWVyIixyZWFkYWJsZV9udWxsOiJSZWFkYWJsZSBpcyBudWxsIix3cml0YWJsZV9udWxsOiJXcml0YWJsZSBpcyBudWxsIn07dmFyIE90PXtleHBvcnRzOnt9fSx6cj1mdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgaT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCksbz0wO288aS5sZW5ndGg7bysrKWlbb109YXJndW1lbnRzW29dO3JldHVybiBlLmFwcGx5KHQsaSl9fSxLaT16cixvZT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIE50KHIpe3JldHVybiBBcnJheS5pc0FycmF5KHIpfWZ1bmN0aW9uIEJ0KHIpe3JldHVybiB0eXBlb2Ygcj4idSJ9ZnVuY3Rpb24gSmkocil7cmV0dXJuIHIhPT1udWxsJiYhQnQocikmJnIuY29uc3RydWN0b3IhPT1udWxsJiYhQnQoci5jb25zdHJ1Y3RvcikmJnR5cGVvZiByLmNvbnN0cnVjdG9yLmlzQnVmZmVyPT0iZnVuY3Rpb24iJiZyLmNvbnN0cnVjdG9yLmlzQnVmZmVyKHIpfWZ1bmN0aW9uIEhyKHIpe3JldHVybiBvZS5jYWxsKHIpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIn1mdW5jdGlvbiBRaShyKXtyZXR1cm4gb2UuY2FsbChyKT09PSJbb2JqZWN0IEZvcm1EYXRhXSJ9ZnVuY3Rpb24gWmkocil7dmFyIGU7cmV0dXJuIHR5cGVvZiBBcnJheUJ1ZmZlcjwidSImJkFycmF5QnVmZmVyLmlzVmlldz9lPUFycmF5QnVmZmVyLmlzVmlldyhyKTplPXImJnIuYnVmZmVyJiZIcihyLmJ1ZmZlciksZX1mdW5jdGlvbiBlbyhyKXtyZXR1cm4gdHlwZW9mIHI9PSJzdHJpbmcifWZ1bmN0aW9uIHRvKHIpe3JldHVybiB0eXBlb2Ygcj09Im51bWJlciJ9ZnVuY3Rpb24gVnIocil7cmV0dXJuIHIhPT1udWxsJiZ0eXBlb2Ygcj09Im9iamVjdCJ9ZnVuY3Rpb24gamUocil7aWYob2UuY2FsbChyKSE9PSJbb2JqZWN0IE9iamVjdF0iKXJldHVybiExO3ZhciBlPU9iamVjdC5nZXRQcm90b3R5cGVPZihyKTtyZXR1cm4gZT09PW51bGx8fGU9PT1PYmplY3QucHJvdG90eXBlfWZ1bmN0aW9uIHJvKHIpe3JldHVybiBvZS5jYWxsKHIpPT09IltvYmplY3QgRGF0ZV0ifWZ1bmN0aW9uIG5vKHIpe3JldHVybiBvZS5jYWxsKHIpPT09IltvYmplY3QgRmlsZV0ifWZ1bmN0aW9uIGlvKHIpe3JldHVybiBvZS5jYWxsKHIpPT09IltvYmplY3QgQmxvYl0ifWZ1bmN0aW9uIFdyKHIpe3JldHVybiBvZS5jYWxsKHIpPT09IltvYmplY3QgRnVuY3Rpb25dIn1mdW5jdGlvbiBvbyhyKXtyZXR1cm4gVnIocikmJldyKHIucGlwZSl9ZnVuY3Rpb24gc28ocil7cmV0dXJuIG9lLmNhbGwocik9PT0iW29iamVjdCBVUkxTZWFyY2hQYXJhbXNdIn1mdW5jdGlvbiBhbyhyKXtyZXR1cm4gci50cmltP3IudHJpbSgpOnIucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfWZ1bmN0aW9uIHVvKCl7cmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3I8InUiJiYobmF2aWdhdG9yLnByb2R1Y3Q9PT0iUmVhY3ROYXRpdmUifHxuYXZpZ2F0b3IucHJvZHVjdD09PSJOYXRpdmVTY3JpcHQifHxuYXZpZ2F0b3IucHJvZHVjdD09PSJOUyIpPyExOnR5cGVvZiB3aW5kb3c8InUiJiZ0eXBlb2YgZG9jdW1lbnQ8InUifWZ1bmN0aW9uIFV0KHIsZSl7aWYoIShyPT09bnVsbHx8dHlwZW9mIHI+InUiKSlpZih0eXBlb2YgciE9Im9iamVjdCImJihyPVtyXSksTnQocikpZm9yKHZhciB0PTAsbj1yLmxlbmd0aDt0PG47dCsrKWUuY2FsbChudWxsLHJbdF0sdCxyKTtlbHNlIGZvcih2YXIgaSBpbiByKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyLGkpJiZlLmNhbGwobnVsbCxyW2ldLGkscil9ZnVuY3Rpb24ga3QoKXt2YXIgcj17fTtmdW5jdGlvbiBlKGksbyl7amUocltvXSkmJmplKGkpP3Jbb109a3QocltvXSxpKTpqZShpKT9yW29dPWt0KHt9LGkpOk50KGkpP3Jbb109aS5zbGljZSgpOnJbb109aX1mb3IodmFyIHQ9MCxuPWFyZ3VtZW50cy5sZW5ndGg7dDxuO3QrKylVdChhcmd1bWVudHNbdF0sZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gY28ocixlLHQpe3JldHVybiBVdChlLGZ1bmN0aW9uKGksbyl7dCYmdHlwZW9mIGk9PSJmdW5jdGlvbiI/cltvXT1LaShpLHQpOnJbb109aX0pLHJ9ZnVuY3Rpb24gZm8ocil7cmV0dXJuIHIuY2hhckNvZGVBdCgwKT09PTY1Mjc5JiYocj1yLnNsaWNlKDEpKSxyfXZhciBHPXtpc0FycmF5Ok50LGlzQXJyYXlCdWZmZXI6SHIsaXNCdWZmZXI6SmksaXNGb3JtRGF0YTpRaSxpc0FycmF5QnVmZmVyVmlldzpaaSxpc1N0cmluZzplbyxpc051bWJlcjp0byxpc09iamVjdDpWcixpc1BsYWluT2JqZWN0OmplLGlzVW5kZWZpbmVkOkJ0LGlzRGF0ZTpybyxpc0ZpbGU6bm8saXNCbG9iOmlvLGlzRnVuY3Rpb246V3IsaXNTdHJlYW06b28saXNVUkxTZWFyY2hQYXJhbXM6c28saXNTdGFuZGFyZEJyb3dzZXJFbnY6dW8sZm9yRWFjaDpVdCxtZXJnZTprdCxleHRlbmQ6Y28sdHJpbTphbyxzdHJpcEJPTTpmb30sRWU9RztmdW5jdGlvbiBqcihyKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHIpLnJlcGxhY2UoLyUzQS9naSwiOiIpLnJlcGxhY2UoLyUyNC9nLCIkIikucmVwbGFjZSgvJTJDL2dpLCIsIikucmVwbGFjZSgvJTIwL2csIisiKS5yZXBsYWNlKC8lNUIvZ2ksIlsiKS5yZXBsYWNlKC8lNUQvZ2ksIl0iKX12YXIgcXI9ZnVuY3Rpb24oZSx0LG4pe2lmKCF0KXJldHVybiBlO3ZhciBpO2lmKG4paT1uKHQpO2Vsc2UgaWYoRWUuaXNVUkxTZWFyY2hQYXJhbXModCkpaT10LnRvU3RyaW5nKCk7ZWxzZXt2YXIgbz1bXTtFZS5mb3JFYWNoKHQsZnVuY3Rpb24odSxmKXt1PT09bnVsbHx8dHlwZW9mIHU+InUifHwoRWUuaXNBcnJheSh1KT9mPWYrIltdIjp1PVt1XSxFZS5mb3JFYWNoKHUsZnVuY3Rpb24oZCl7RWUuaXNEYXRlKGQpP2Q9ZC50b0lTT1N0cmluZygpOkVlLmlzT2JqZWN0KGQpJiYoZD1KU09OLnN0cmluZ2lmeShkKSksby5wdXNoKGpyKGYpKyI9IitqcihkKSl9KSl9KSxpPW8uam9pbigiJiIpfWlmKGkpe3ZhciBzPWUuaW5kZXhPZigiIyIpO3MhPT0tMSYmKGU9ZS5zbGljZSgwLHMpKSxlKz0oZS5pbmRleE9mKCI/Iik9PT0tMT8iPyI6IiYiKStpfXJldHVybiBlfSxsbz1HO2Z1bmN0aW9uIHFlKCl7dGhpcy5oYW5kbGVycz1bXX1xZS5wcm90b3R5cGUudXNlPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5oYW5kbGVycy5wdXNoKHtmdWxmaWxsZWQ6ZSxyZWplY3RlZDp0LHN5bmNocm9ub3VzOm4/bi5zeW5jaHJvbm91czohMSxydW5XaGVuOm4/bi5ydW5XaGVuOm51bGx9KSx0aGlzLmhhbmRsZXJzLmxlbmd0aC0xfSxxZS5wcm90b3R5cGUuZWplY3Q9ZnVuY3Rpb24oZSl7dGhpcy5oYW5kbGVyc1tlXSYmKHRoaXMuaGFuZGxlcnNbZV09bnVsbCl9LHFlLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKGUpe2xvLmZvckVhY2godGhpcy5oYW5kbGVycyxmdW5jdGlvbihuKXtuIT09bnVsbCYmZShuKX0pfTt2YXIgbW89cWUsaG89Ryxwbz1mdW5jdGlvbihlLHQpe2hvLmZvckVhY2goZSxmdW5jdGlvbihpLG8pe28hPT10JiZvLnRvVXBwZXJDYXNlKCk9PT10LnRvVXBwZXJDYXNlKCkmJihlW3RdPWksZGVsZXRlIGVbb10pfSl9LFhyPWZ1bmN0aW9uKGUsdCxuLGksbyl7cmV0dXJuIGUuY29uZmlnPXQsbiYmKGUuY29kZT1uKSxlLnJlcXVlc3Q9aSxlLnJlc3BvbnNlPW8sZS5pc0F4aW9zRXJyb3I9ITAsZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57bWVzc2FnZTp0aGlzLm1lc3NhZ2UsbmFtZTp0aGlzLm5hbWUsZGVzY3JpcHRpb246dGhpcy5kZXNjcmlwdGlvbixudW1iZXI6dGhpcy5udW1iZXIsZmlsZU5hbWU6dGhpcy5maWxlTmFtZSxsaW5lTnVtYmVyOnRoaXMubGluZU51bWJlcixjb2x1bW5OdW1iZXI6dGhpcy5jb2x1bW5OdW1iZXIsc3RhY2s6dGhpcy5zdGFjayxjb25maWc6dGhpcy5jb25maWcsY29kZTp0aGlzLmNvZGUsc3RhdHVzOnRoaXMucmVzcG9uc2UmJnRoaXMucmVzcG9uc2Uuc3RhdHVzP3RoaXMucmVzcG9uc2Uuc3RhdHVzOm51bGx9fSxlfSx5bz1YcixZcj1mdW5jdGlvbihlLHQsbixpLG8pe3ZhciBzPW5ldyBFcnJvcihlKTtyZXR1cm4geW8ocyx0LG4saSxvKX0sX289WXIseG89ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPW4uY29uZmlnLnZhbGlkYXRlU3RhdHVzOyFuLnN0YXR1c3x8IWl8fGkobi5zdGF0dXMpP2Uobik6dChfbygiUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAiK24uc3RhdHVzLG4uY29uZmlnLG51bGwsbi5yZXF1ZXN0LG4pKX0sWGU9Ryxibz1YZS5pc1N0YW5kYXJkQnJvd3NlckVudigpP2Z1bmN0aW9uKCl7cmV0dXJue3dyaXRlOmZ1bmN0aW9uKHQsbixpLG8scyxhKXt2YXIgdT1bXTt1LnB1c2godCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KG4pKSxYZS5pc051bWJlcihpKSYmdS5wdXNoKCJleHBpcmVzPSIrbmV3IERhdGUoaSkudG9HTVRTdHJpbmcoKSksWGUuaXNTdHJpbmcobykmJnUucHVzaCgicGF0aD0iK28pLFhlLmlzU3RyaW5nKHMpJiZ1LnB1c2goImRvbWFpbj0iK3MpLGE9PT0hMCYmdS5wdXNoKCJzZWN1cmUiKSxkb2N1bWVudC5jb29raWU9dS5qb2luKCI7ICIpfSxyZWFkOmZ1bmN0aW9uKHQpe3ZhciBuPWRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCIoXnw7XFxzKikoIit0KyIpPShbXjtdKikiKSk7cmV0dXJuIG4/ZGVjb2RlVVJJQ29tcG9uZW50KG5bM10pOm51bGx9LHJlbW92ZTpmdW5jdGlvbih0KXt0aGlzLndyaXRlKHQsIiIsRGF0ZS5ub3coKS04NjRlNSl9fX0oKTpmdW5jdGlvbigpe3JldHVybnt3cml0ZTpmdW5jdGlvbigpe30scmVhZDpmdW5jdGlvbigpe3JldHVybiBudWxsfSxyZW1vdmU6ZnVuY3Rpb24oKXt9fX0oKSxnbz1mdW5jdGlvbihlKXtyZXR1cm4vXihbYS16XVthLXpcZCtcLS5dKjopP1wvXC8vaS50ZXN0KGUpfSx2bz1mdW5jdGlvbihlLHQpe3JldHVybiB0P2UucmVwbGFjZSgvXC8rJC8sIiIpKyIvIit0LnJlcGxhY2UoL15cLysvLCIiKTplfSxFbz1nbyxUbz12byxBbz1mdW5jdGlvbihlLHQpe3JldHVybiBlJiYhRW8odCk/VG8oZSx0KTp0fSxMdD1HLHdvPVsiYWdlIiwiYXV0aG9yaXphdGlvbiIsImNvbnRlbnQtbGVuZ3RoIiwiY29udGVudC10eXBlIiwiZXRhZyIsImV4cGlyZXMiLCJmcm9tIiwiaG9zdCIsImlmLW1vZGlmaWVkLXNpbmNlIiwiaWYtdW5tb2RpZmllZC1zaW5jZSIsImxhc3QtbW9kaWZpZWQiLCJsb2NhdGlvbiIsIm1heC1mb3J3YXJkcyIsInByb3h5LWF1dGhvcml6YXRpb24iLCJyZWZlcmVyIiwicmV0cnktYWZ0ZXIiLCJ1c2VyLWFnZW50Il0sUm89ZnVuY3Rpb24oZSl7dmFyIHQ9e30sbixpLG87cmV0dXJuIGUmJkx0LmZvckVhY2goZS5zcGxpdChgCmApLGZ1bmN0aW9uKGEpe2lmKG89YS5pbmRleE9mKCI6Iiksbj1MdC50cmltKGEuc3Vic3RyKDAsbykpLnRvTG93ZXJDYXNlKCksaT1MdC50cmltKGEuc3Vic3RyKG8rMSkpLG4pe2lmKHRbbl0mJndvLmluZGV4T2Yobik+PTApcmV0dXJuO249PT0ic2V0LWNvb2tpZSI/dFtuXT0odFtuXT90W25dOltdKS5jb25jYXQoW2ldKTp0W25dPXRbbl0/dFtuXSsiLCAiK2k6aX19KSx0fSxLcj1HLFNvPUtyLmlzU3RhbmRhcmRCcm93c2VyRW52KCk/ZnVuY3Rpb24oKXt2YXIgZT0vKG1zaWV8dHJpZGVudCkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpLG47ZnVuY3Rpb24gaShvKXt2YXIgcz1vO3JldHVybiBlJiYodC5zZXRBdHRyaWJ1dGUoImhyZWYiLHMpLHM9dC5ocmVmKSx0LnNldEF0dHJpYnV0ZSgiaHJlZiIscykse2hyZWY6dC5ocmVmLHByb3RvY29sOnQucHJvdG9jb2w/dC5wcm90b2NvbC5yZXBsYWNlKC86JC8sIiIpOiIiLGhvc3Q6dC5ob3N0LHNlYXJjaDp0LnNlYXJjaD90LnNlYXJjaC5yZXBsYWNlKC9eXD8vLCIiKToiIixoYXNoOnQuaGFzaD90Lmhhc2gucmVwbGFjZSgvXiMvLCIiKToiIixob3N0bmFtZTp0Lmhvc3RuYW1lLHBvcnQ6dC5wb3J0LHBhdGhuYW1lOnQucGF0aG5hbWUuY2hhckF0KDApPT09Ii8iP3QucGF0aG5hbWU6Ii8iK3QucGF0aG5hbWV9fXJldHVybiBuPWkod2luZG93LmxvY2F0aW9uLmhyZWYpLGZ1bmN0aW9uKHMpe3ZhciBhPUtyLmlzU3RyaW5nKHMpP2kocyk6cztyZXR1cm4gYS5wcm90b2NvbD09PW4ucHJvdG9jb2wmJmEuaG9zdD09PW4uaG9zdH19KCk6ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4hMH19KCk7ZnVuY3Rpb24gJHQocil7dGhpcy5tZXNzYWdlPXJ9JHQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIkNhbmNlbCIrKHRoaXMubWVzc2FnZT8iOiAiK3RoaXMubWVzc2FnZToiIil9LCR0LnByb3RvdHlwZS5fX0NBTkNFTF9fPSEwO3ZhciBZZT0kdCxLZT1HLElvPXhvLEZvPWJvLFBvPXFyLERvPUFvLE1vPVJvLENvPVNvLEd0PVlyLE9vPVFlLE5vPVllLEpyPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihuLGkpe3ZhciBvPWUuZGF0YSxzPWUuaGVhZGVycyxhPWUucmVzcG9uc2VUeXBlLHU7ZnVuY3Rpb24gZigpe2UuY2FuY2VsVG9rZW4mJmUuY2FuY2VsVG9rZW4udW5zdWJzY3JpYmUodSksZS5zaWduYWwmJmUuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0Iix1KX1LZS5pc0Zvcm1EYXRhKG8pJiZkZWxldGUgc1siQ29udGVudC1UeXBlIl07dmFyIGM9bmV3IFhNTEh0dHBSZXF1ZXN0O2lmKGUuYXV0aCl7dmFyIGQ9ZS5hdXRoLnVzZXJuYW1lfHwiIixwPWUuYXV0aC5wYXNzd29yZD91bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZS5hdXRoLnBhc3N3b3JkKSk6IiI7cy5BdXRob3JpemF0aW9uPSJCYXNpYyAiK2J0b2EoZCsiOiIrcCl9dmFyIF89RG8oZS5iYXNlVVJMLGUudXJsKTtjLm9wZW4oZS5tZXRob2QudG9VcHBlckNhc2UoKSxQbyhfLGUucGFyYW1zLGUucGFyYW1zU2VyaWFsaXplciksITApLGMudGltZW91dD1lLnRpbWVvdXQ7ZnVuY3Rpb24gbSgpe2lmKCEhYyl7dmFyIHY9ImdldEFsbFJlc3BvbnNlSGVhZGVycyJpbiBjP01vKGMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpOm51bGwsZz0hYXx8YT09PSJ0ZXh0Inx8YT09PSJqc29uIj9jLnJlc3BvbnNlVGV4dDpjLnJlc3BvbnNlLEE9e2RhdGE6ZyxzdGF0dXM6Yy5zdGF0dXMsc3RhdHVzVGV4dDpjLnN0YXR1c1RleHQsaGVhZGVyczp2LGNvbmZpZzplLHJlcXVlc3Q6Y307SW8oZnVuY3Rpb24oQyl7bihDKSxmKCl9LGZ1bmN0aW9uKEMpe2koQyksZigpfSxBKSxjPW51bGx9fWlmKCJvbmxvYWRlbmQiaW4gYz9jLm9ubG9hZGVuZD1tOmMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWN8fGMucmVhZHlTdGF0ZSE9PTR8fGMuc3RhdHVzPT09MCYmIShjLnJlc3BvbnNlVVJMJiZjLnJlc3BvbnNlVVJMLmluZGV4T2YoImZpbGU6Iik9PT0wKXx8c2V0VGltZW91dChtKX0sYy5vbmFib3J0PWZ1bmN0aW9uKCl7IWN8fChpKEd0KCJSZXF1ZXN0IGFib3J0ZWQiLGUsIkVDT05OQUJPUlRFRCIsYykpLGM9bnVsbCl9LGMub25lcnJvcj1mdW5jdGlvbigpe2koR3QoIk5ldHdvcmsgRXJyb3IiLGUsbnVsbCxjKSksYz1udWxsfSxjLm9udGltZW91dD1mdW5jdGlvbigpe3ZhciBnPWUudGltZW91dD8idGltZW91dCBvZiAiK2UudGltZW91dCsibXMgZXhjZWVkZWQiOiJ0aW1lb3V0IGV4Y2VlZGVkIixBPWUudHJhbnNpdGlvbmFsfHxPby50cmFuc2l0aW9uYWw7ZS50aW1lb3V0RXJyb3JNZXNzYWdlJiYoZz1lLnRpbWVvdXRFcnJvck1lc3NhZ2UpLGkoR3QoZyxlLEEuY2xhcmlmeVRpbWVvdXRFcnJvcj8iRVRJTUVET1VUIjoiRUNPTk5BQk9SVEVEIixjKSksYz1udWxsfSxLZS5pc1N0YW5kYXJkQnJvd3NlckVudigpKXt2YXIgeD0oZS53aXRoQ3JlZGVudGlhbHN8fENvKF8pKSYmZS54c3JmQ29va2llTmFtZT9Gby5yZWFkKGUueHNyZkNvb2tpZU5hbWUpOnZvaWQgMDt4JiYoc1tlLnhzcmZIZWFkZXJOYW1lXT14KX0ic2V0UmVxdWVzdEhlYWRlciJpbiBjJiZLZS5mb3JFYWNoKHMsZnVuY3Rpb24oZyxBKXt0eXBlb2Ygbz4idSImJkEudG9Mb3dlckNhc2UoKT09PSJjb250ZW50LXR5cGUiP2RlbGV0ZSBzW0FdOmMuc2V0UmVxdWVzdEhlYWRlcihBLGcpfSksS2UuaXNVbmRlZmluZWQoZS53aXRoQ3JlZGVudGlhbHMpfHwoYy53aXRoQ3JlZGVudGlhbHM9ISFlLndpdGhDcmVkZW50aWFscyksYSYmYSE9PSJqc29uIiYmKGMucmVzcG9uc2VUeXBlPWUucmVzcG9uc2VUeXBlKSx0eXBlb2YgZS5vbkRvd25sb2FkUHJvZ3Jlc3M9PSJmdW5jdGlvbiImJmMuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGUub25Eb3dubG9hZFByb2dyZXNzKSx0eXBlb2YgZS5vblVwbG9hZFByb2dyZXNzPT0iZnVuY3Rpb24iJiZjLnVwbG9hZCYmYy51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGUub25VcGxvYWRQcm9ncmVzcyksKGUuY2FuY2VsVG9rZW58fGUuc2lnbmFsKSYmKHU9ZnVuY3Rpb24odil7IWN8fChpKCF2fHx2JiZ2LnR5cGU/bmV3IE5vKCJjYW5jZWxlZCIpOnYpLGMuYWJvcnQoKSxjPW51bGwpfSxlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnN1YnNjcmliZSh1KSxlLnNpZ25hbCYmKGUuc2lnbmFsLmFib3J0ZWQ/dSgpOmUuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0Iix1KSkpLG98fChvPW51bGwpLGMuc2VuZChvKX0pfSxPPUcsUXI9cG8sQm89WHIsVW89eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifTtmdW5jdGlvbiBacihyLGUpeyFPLmlzVW5kZWZpbmVkKHIpJiZPLmlzVW5kZWZpbmVkKHJbIkNvbnRlbnQtVHlwZSJdKSYmKHJbIkNvbnRlbnQtVHlwZSJdPWUpfWZ1bmN0aW9uIGtvKCl7dmFyIHI7cmV0dXJuKHR5cGVvZiBYTUxIdHRwUmVxdWVzdDwidSJ8fHR5cGVvZiBwcm9jZXNzPCJ1IiYmT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHByb2Nlc3MpPT09IltvYmplY3QgcHJvY2Vzc10iKSYmKHI9SnIpLHJ9ZnVuY3Rpb24gTG8ocixlLHQpe2lmKE8uaXNTdHJpbmcocikpdHJ5e3JldHVybihlfHxKU09OLnBhcnNlKShyKSxPLnRyaW0ocil9Y2F0Y2gobil7aWYobi5uYW1lIT09IlN5bnRheEVycm9yIil0aHJvdyBufXJldHVybih0fHxKU09OLnN0cmluZ2lmeSkocil9dmFyIEplPXt0cmFuc2l0aW9uYWw6e3NpbGVudEpTT05QYXJzaW5nOiEwLGZvcmNlZEpTT05QYXJzaW5nOiEwLGNsYXJpZnlUaW1lb3V0RXJyb3I6ITF9LGFkYXB0ZXI6a28oKSx0cmFuc2Zvcm1SZXF1ZXN0OltmdW5jdGlvbihlLHQpe3JldHVybiBRcih0LCJBY2NlcHQiKSxRcih0LCJDb250ZW50LVR5cGUiKSxPLmlzRm9ybURhdGEoZSl8fE8uaXNBcnJheUJ1ZmZlcihlKXx8Ty5pc0J1ZmZlcihlKXx8Ty5pc1N0cmVhbShlKXx8Ty5pc0ZpbGUoZSl8fE8uaXNCbG9iKGUpP2U6Ty5pc0FycmF5QnVmZmVyVmlldyhlKT9lLmJ1ZmZlcjpPLmlzVVJMU2VhcmNoUGFyYW1zKGUpPyhacih0LCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCIpLGUudG9TdHJpbmcoKSk6Ty5pc09iamVjdChlKXx8dCYmdFsiQ29udGVudC1UeXBlIl09PT0iYXBwbGljYXRpb24vanNvbiI/KFpyKHQsImFwcGxpY2F0aW9uL2pzb24iKSxMbyhlKSk6ZX1dLHRyYW5zZm9ybVJlc3BvbnNlOltmdW5jdGlvbihlKXt2YXIgdD10aGlzLnRyYW5zaXRpb25hbHx8SmUudHJhbnNpdGlvbmFsLG49dCYmdC5zaWxlbnRKU09OUGFyc2luZyxpPXQmJnQuZm9yY2VkSlNPTlBhcnNpbmcsbz0hbiYmdGhpcy5yZXNwb25zZVR5cGU9PT0ianNvbiI7aWYob3x8aSYmTy5pc1N0cmluZyhlKSYmZS5sZW5ndGgpdHJ5e3JldHVybiBKU09OLnBhcnNlKGUpfWNhdGNoKHMpe2lmKG8pdGhyb3cgcy5uYW1lPT09IlN5bnRheEVycm9yIj9CbyhzLHRoaXMsIkVfSlNPTl9QQVJTRSIpOnN9cmV0dXJuIGV9XSx0aW1lb3V0OjAseHNyZkNvb2tpZU5hbWU6IlhTUkYtVE9LRU4iLHhzcmZIZWFkZXJOYW1lOiJYLVhTUkYtVE9LRU4iLG1heENvbnRlbnRMZW5ndGg6LTEsbWF4Qm9keUxlbmd0aDotMSx2YWxpZGF0ZVN0YXR1czpmdW5jdGlvbihlKXtyZXR1cm4gZT49MjAwJiZlPDMwMH0saGVhZGVyczp7Y29tbW9uOntBY2NlcHQ6ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKiJ9fX07Ty5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCJdLGZ1bmN0aW9uKGUpe0plLmhlYWRlcnNbZV09e319KSxPLmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSxmdW5jdGlvbihlKXtKZS5oZWFkZXJzW2VdPU8ubWVyZ2UoVW8pfSk7dmFyIFFlPUplLCRvPUcsR289UWUsem89ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXRoaXN8fEdvO3JldHVybiAkby5mb3JFYWNoKG4sZnVuY3Rpb24ocyl7ZT1zLmNhbGwoaSxlLHQpfSksZX0sZW49ZnVuY3Rpb24oZSl7cmV0dXJuISEoZSYmZS5fX0NBTkNFTF9fKX0sdG49Ryx6dD16byxIbz1lbixWbz1RZSxXbz1ZZTtmdW5jdGlvbiBIdChyKXtpZihyLmNhbmNlbFRva2VuJiZyLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKSxyLnNpZ25hbCYmci5zaWduYWwuYWJvcnRlZCl0aHJvdyBuZXcgV28oImNhbmNlbGVkIil9dmFyIGpvPWZ1bmN0aW9uKGUpe0h0KGUpLGUuaGVhZGVycz1lLmhlYWRlcnN8fHt9LGUuZGF0YT16dC5jYWxsKGUsZS5kYXRhLGUuaGVhZGVycyxlLnRyYW5zZm9ybVJlcXVlc3QpLGUuaGVhZGVycz10bi5tZXJnZShlLmhlYWRlcnMuY29tbW9ufHx7fSxlLmhlYWRlcnNbZS5tZXRob2RdfHx7fSxlLmhlYWRlcnMpLHRuLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwicG9zdCIsInB1dCIsInBhdGNoIiwiY29tbW9uIl0sZnVuY3Rpb24oaSl7ZGVsZXRlIGUuaGVhZGVyc1tpXX0pO3ZhciB0PWUuYWRhcHRlcnx8Vm8uYWRhcHRlcjtyZXR1cm4gdChlKS50aGVuKGZ1bmN0aW9uKGkpe3JldHVybiBIdChlKSxpLmRhdGE9enQuY2FsbChlLGkuZGF0YSxpLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXNwb25zZSksaX0sZnVuY3Rpb24oaSl7cmV0dXJuIEhvKGkpfHwoSHQoZSksaSYmaS5yZXNwb25zZSYmKGkucmVzcG9uc2UuZGF0YT16dC5jYWxsKGUsaS5yZXNwb25zZS5kYXRhLGkucmVzcG9uc2UuaGVhZGVycyxlLnRyYW5zZm9ybVJlc3BvbnNlKSkpLFByb21pc2UucmVqZWN0KGkpfSl9LHo9Ryxybj1mdW5jdGlvbihlLHQpe3Q9dHx8e307dmFyIG49e307ZnVuY3Rpb24gaShjLGQpe3JldHVybiB6LmlzUGxhaW5PYmplY3QoYykmJnouaXNQbGFpbk9iamVjdChkKT96Lm1lcmdlKGMsZCk6ei5pc1BsYWluT2JqZWN0KGQpP3oubWVyZ2Uoe30sZCk6ei5pc0FycmF5KGQpP2Quc2xpY2UoKTpkfWZ1bmN0aW9uIG8oYyl7aWYoei5pc1VuZGVmaW5lZCh0W2NdKSl7aWYoIXouaXNVbmRlZmluZWQoZVtjXSkpcmV0dXJuIGkodm9pZCAwLGVbY10pfWVsc2UgcmV0dXJuIGkoZVtjXSx0W2NdKX1mdW5jdGlvbiBzKGMpe2lmKCF6LmlzVW5kZWZpbmVkKHRbY10pKXJldHVybiBpKHZvaWQgMCx0W2NdKX1mdW5jdGlvbiBhKGMpe2lmKHouaXNVbmRlZmluZWQodFtjXSkpe2lmKCF6LmlzVW5kZWZpbmVkKGVbY10pKXJldHVybiBpKHZvaWQgMCxlW2NdKX1lbHNlIHJldHVybiBpKHZvaWQgMCx0W2NdKX1mdW5jdGlvbiB1KGMpe2lmKGMgaW4gdClyZXR1cm4gaShlW2NdLHRbY10pO2lmKGMgaW4gZSlyZXR1cm4gaSh2b2lkIDAsZVtjXSl9dmFyIGY9e3VybDpzLG1ldGhvZDpzLGRhdGE6cyxiYXNlVVJMOmEsdHJhbnNmb3JtUmVxdWVzdDphLHRyYW5zZm9ybVJlc3BvbnNlOmEscGFyYW1zU2VyaWFsaXplcjphLHRpbWVvdXQ6YSx0aW1lb3V0TWVzc2FnZTphLHdpdGhDcmVkZW50aWFsczphLGFkYXB0ZXI6YSxyZXNwb25zZVR5cGU6YSx4c3JmQ29va2llTmFtZTphLHhzcmZIZWFkZXJOYW1lOmEsb25VcGxvYWRQcm9ncmVzczphLG9uRG93bmxvYWRQcm9ncmVzczphLGRlY29tcHJlc3M6YSxtYXhDb250ZW50TGVuZ3RoOmEsbWF4Qm9keUxlbmd0aDphLHRyYW5zcG9ydDphLGh0dHBBZ2VudDphLGh0dHBzQWdlbnQ6YSxjYW5jZWxUb2tlbjphLHNvY2tldFBhdGg6YSxyZXNwb25zZUVuY29kaW5nOmEsdmFsaWRhdGVTdGF0dXM6dX07cmV0dXJuIHouZm9yRWFjaChPYmplY3Qua2V5cyhlKS5jb25jYXQoT2JqZWN0LmtleXModCkpLGZ1bmN0aW9uKGQpe3ZhciBwPWZbZF18fG8sXz1wKGQpO3ouaXNVbmRlZmluZWQoXykmJnAhPT11fHwobltkXT1fKX0pLG59LG5uPXt2ZXJzaW9uOiIwLjI1LjAifSxxbz1ubi52ZXJzaW9uLFZ0PXt9O1sib2JqZWN0IiwiYm9vbGVhbiIsIm51bWJlciIsImZ1bmN0aW9uIiwic3RyaW5nIiwic3ltYm9sIl0uZm9yRWFjaChmdW5jdGlvbihyLGUpe1Z0W3JdPWZ1bmN0aW9uKG4pe3JldHVybiB0eXBlb2Ygbj09PXJ8fCJhIisoZTwxPyJuICI6IiAiKStyfX0pO3ZhciBvbj17fTtWdC50cmFuc2l0aW9uYWw9ZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIGkobyxzKXtyZXR1cm4iW0F4aW9zIHYiK3FvKyJdIFRyYW5zaXRpb25hbCBvcHRpb24gJyIrbysiJyIrcysobj8iLiAiK246IiIpfXJldHVybiBmdW5jdGlvbihvLHMsYSl7aWYoZT09PSExKXRocm93IG5ldyBFcnJvcihpKHMsIiBoYXMgYmVlbiByZW1vdmVkIisodD8iIGluICIrdDoiIikpKTtyZXR1cm4gdCYmIW9uW3NdJiYob25bc109ITAsY29uc29sZS53YXJuKGkocywiIGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgdiIrdCsiIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlIikpKSxlP2UobyxzLGEpOiEwfX07ZnVuY3Rpb24gWG8ocixlLHQpe2lmKHR5cGVvZiByIT0ib2JqZWN0Iil0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Zm9yKHZhciBuPU9iamVjdC5rZXlzKHIpLGk9bi5sZW5ndGg7aS0tID4wOyl7dmFyIG89bltpXSxzPWVbb107aWYocyl7dmFyIGE9cltvXSx1PWE9PT12b2lkIDB8fHMoYSxvLHIpO2lmKHUhPT0hMCl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb24gIitvKyIgbXVzdCBiZSAiK3UpO2NvbnRpbnVlfWlmKHQhPT0hMCl0aHJvdyBFcnJvcigiVW5rbm93biBvcHRpb24gIitvKX19dmFyIFlvPXthc3NlcnRPcHRpb25zOlhvLHZhbGlkYXRvcnM6VnR9LHNuPUcsS289cXIsYW49bW8sdW49am8sWmU9cm4sY249WW8sVGU9Y24udmFsaWRhdG9ycztmdW5jdGlvbiBNZShyKXt0aGlzLmRlZmF1bHRzPXIsdGhpcy5pbnRlcmNlcHRvcnM9e3JlcXVlc3Q6bmV3IGFuLHJlc3BvbnNlOm5ldyBhbn19TWUucHJvdG90eXBlLnJlcXVlc3Q9ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgZT09InN0cmluZyI/KHQ9dHx8e30sdC51cmw9ZSk6dD1lfHx7fSwhdC51cmwpdGhyb3cgbmV3IEVycm9yKCJQcm92aWRlZCBjb25maWcgdXJsIGlzIG5vdCB2YWxpZCIpO3Q9WmUodGhpcy5kZWZhdWx0cyx0KSx0Lm1ldGhvZD90Lm1ldGhvZD10Lm1ldGhvZC50b0xvd2VyQ2FzZSgpOnRoaXMuZGVmYXVsdHMubWV0aG9kP3QubWV0aG9kPXRoaXMuZGVmYXVsdHMubWV0aG9kLnRvTG93ZXJDYXNlKCk6dC5tZXRob2Q9ImdldCI7dmFyIG49dC50cmFuc2l0aW9uYWw7biE9PXZvaWQgMCYmY24uYXNzZXJ0T3B0aW9ucyhuLHtzaWxlbnRKU09OUGFyc2luZzpUZS50cmFuc2l0aW9uYWwoVGUuYm9vbGVhbiksZm9yY2VkSlNPTlBhcnNpbmc6VGUudHJhbnNpdGlvbmFsKFRlLmJvb2xlYW4pLGNsYXJpZnlUaW1lb3V0RXJyb3I6VGUudHJhbnNpdGlvbmFsKFRlLmJvb2xlYW4pfSwhMSk7dmFyIGk9W10sbz0hMDt0aGlzLmludGVyY2VwdG9ycy5yZXF1ZXN0LmZvckVhY2goZnVuY3Rpb24oXyl7dHlwZW9mIF8ucnVuV2hlbj09ImZ1bmN0aW9uIiYmXy5ydW5XaGVuKHQpPT09ITF8fChvPW8mJl8uc3luY2hyb25vdXMsaS51bnNoaWZ0KF8uZnVsZmlsbGVkLF8ucmVqZWN0ZWQpKX0pO3ZhciBzPVtdO3RoaXMuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLmZvckVhY2goZnVuY3Rpb24oXyl7cy5wdXNoKF8uZnVsZmlsbGVkLF8ucmVqZWN0ZWQpfSk7dmFyIGE7aWYoIW8pe3ZhciB1PVt1bix2b2lkIDBdO2ZvcihBcnJheS5wcm90b3R5cGUudW5zaGlmdC5hcHBseSh1LGkpLHU9dS5jb25jYXQocyksYT1Qcm9taXNlLnJlc29sdmUodCk7dS5sZW5ndGg7KWE9YS50aGVuKHUuc2hpZnQoKSx1LnNoaWZ0KCkpO3JldHVybiBhfWZvcih2YXIgZj10O2kubGVuZ3RoOyl7dmFyIGM9aS5zaGlmdCgpLGQ9aS5zaGlmdCgpO3RyeXtmPWMoZil9Y2F0Y2gocCl7ZChwKTticmVha319dHJ5e2E9dW4oZil9Y2F0Y2gocCl7cmV0dXJuIFByb21pc2UucmVqZWN0KHApfWZvcig7cy5sZW5ndGg7KWE9YS50aGVuKHMuc2hpZnQoKSxzLnNoaWZ0KCkpO3JldHVybiBhfSxNZS5wcm90b3R5cGUuZ2V0VXJpPWZ1bmN0aW9uKGUpe2lmKCFlLnVybCl0aHJvdyBuZXcgRXJyb3IoIlByb3ZpZGVkIGNvbmZpZyB1cmwgaXMgbm90IHZhbGlkIik7cmV0dXJuIGU9WmUodGhpcy5kZWZhdWx0cyxlKSxLbyhlLnVybCxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLnJlcGxhY2UoL15cPy8sIiIpfSxzbi5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsIm9wdGlvbnMiXSxmdW5jdGlvbihlKXtNZS5wcm90b3R5cGVbZV09ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KFplKG58fHt9LHttZXRob2Q6ZSx1cmw6dCxkYXRhOihufHx7fSkuZGF0YX0pKX19KSxzbi5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sZnVuY3Rpb24oZSl7TWUucHJvdG90eXBlW2VdPWZ1bmN0aW9uKHQsbixpKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KFplKGl8fHt9LHttZXRob2Q6ZSx1cmw6dCxkYXRhOm59KSl9fSk7dmFyIEpvPU1lLFFvPVllO2Z1bmN0aW9uIEFlKHIpe2lmKHR5cGVvZiByIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoImV4ZWN1dG9yIG11c3QgYmUgYSBmdW5jdGlvbi4iKTt2YXIgZTt0aGlzLnByb21pc2U9bmV3IFByb21pc2UoZnVuY3Rpb24oaSl7ZT1pfSk7dmFyIHQ9dGhpczt0aGlzLnByb21pc2UudGhlbihmdW5jdGlvbihuKXtpZighIXQuX2xpc3RlbmVycyl7dmFyIGksbz10Ll9saXN0ZW5lcnMubGVuZ3RoO2ZvcihpPTA7aTxvO2krKyl0Ll9saXN0ZW5lcnNbaV0obik7dC5fbGlzdGVuZXJzPW51bGx9fSksdGhpcy5wcm9taXNlLnRoZW49ZnVuY3Rpb24obil7dmFyIGksbz1uZXcgUHJvbWlzZShmdW5jdGlvbihzKXt0LnN1YnNjcmliZShzKSxpPXN9KS50aGVuKG4pO3JldHVybiBvLmNhbmNlbD1mdW5jdGlvbigpe3QudW5zdWJzY3JpYmUoaSl9LG99LHIoZnVuY3Rpb24oaSl7dC5yZWFzb258fCh0LnJlYXNvbj1uZXcgUW8oaSksZSh0LnJlYXNvbikpfSl9QWUucHJvdG90eXBlLnRocm93SWZSZXF1ZXN0ZWQ9ZnVuY3Rpb24oKXtpZih0aGlzLnJlYXNvbil0aHJvdyB0aGlzLnJlYXNvbn0sQWUucHJvdG90eXBlLnN1YnNjcmliZT1mdW5jdGlvbihlKXtpZih0aGlzLnJlYXNvbil7ZSh0aGlzLnJlYXNvbik7cmV0dXJufXRoaXMuX2xpc3RlbmVycz90aGlzLl9saXN0ZW5lcnMucHVzaChlKTp0aGlzLl9saXN0ZW5lcnM9W2VdfSxBZS5wcm90b3R5cGUudW5zdWJzY3JpYmU9ZnVuY3Rpb24oZSl7aWYoISF0aGlzLl9saXN0ZW5lcnMpe3ZhciB0PXRoaXMuX2xpc3RlbmVycy5pbmRleE9mKGUpO3QhPT0tMSYmdGhpcy5fbGlzdGVuZXJzLnNwbGljZSh0LDEpfX0sQWUuc291cmNlPWZ1bmN0aW9uKCl7dmFyIGUsdD1uZXcgQWUoZnVuY3Rpb24oaSl7ZT1pfSk7cmV0dXJue3Rva2VuOnQsY2FuY2VsOmV9fTt2YXIgWm89QWUsZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBlLmFwcGx5KG51bGwsbil9fSx0cz1HLHJzPWZ1bmN0aW9uKGUpe3JldHVybiB0cy5pc09iamVjdChlKSYmZS5pc0F4aW9zRXJyb3I9PT0hMH0sZm49Ryxucz16cixldD1Kbyxpcz1ybixvcz1RZTtmdW5jdGlvbiBsbihyKXt2YXIgZT1uZXcgZXQociksdD1ucyhldC5wcm90b3R5cGUucmVxdWVzdCxlKTtyZXR1cm4gZm4uZXh0ZW5kKHQsZXQucHJvdG90eXBlLGUpLGZuLmV4dGVuZCh0LGUpLHQuY3JlYXRlPWZ1bmN0aW9uKGkpe3JldHVybiBsbihpcyhyLGkpKX0sdH12YXIgUT1sbihvcyk7US5BeGlvcz1ldCxRLkNhbmNlbD1ZZSxRLkNhbmNlbFRva2VuPVpvLFEuaXNDYW5jZWw9ZW4sUS5WRVJTSU9OPW5uLnZlcnNpb24sUS5hbGw9ZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UuYWxsKGUpfSxRLnNwcmVhZD1lcyxRLmlzQXhpb3NFcnJvcj1ycyxPdC5leHBvcnRzPVEsT3QuZXhwb3J0cy5kZWZhdWx0PVE7dmFyIHNzPU90LmV4cG9ydHM7Y2xhc3MgVHtpc0VtcHR5KCl7cmV0dXJuIXRoaXMuaXNQcmVzZW50KCl9c3RhdGljIG9mKGUpe2lmKGUhPW51bGwpcmV0dXJuIG5ldyBkbihlKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgcGFzc2VkIHZhbHVlIHdhcyBudWxsIG9yIHVuZGVmaW5lZC4iKX1zdGF0aWMgb2ZOb25OdWxsKGUpe3JldHVybiBULm9mKGUpfXN0YXRpYyBvZk51bGxhYmxlKGUpe3JldHVybiBlIT1udWxsP25ldyBkbihlKTpuZXcgbW59c3RhdGljIGVtcHR5KCl7cmV0dXJuIG5ldyBtbn1zdGF0aWMgZnJvbShlKXtzd2l0Y2goZS5raW5kKXtjYXNlInByZXNlbnQiOnJldHVybiBULm9mKGUudmFsdWUpO2Nhc2UiZW1wdHkiOnJldHVybiBULmVtcHR5KCk7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgcGFzc2VkIHZhbHVlIHdhcyBub3QgYW4gT3B0aW9uIHR5cGUuIil9fX1jbGFzcyBkbiBleHRlbmRzIFR7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLnBheWxvYWQ9ZX1pc1ByZXNlbnQoKXtyZXR1cm4hMH1nZXQoKXtyZXR1cm4gdGhpcy5wYXlsb2FkfWlmUHJlc2VudChlKXtlKHRoaXMucGF5bG9hZCl9aWZQcmVzZW50T3JFbHNlKGUsdCl7ZSh0aGlzLnBheWxvYWQpfWZpbHRlcihlKXtyZXR1cm4gZSh0aGlzLnBheWxvYWQpP3RoaXM6VC5lbXB0eSgpfW1hcChlKXtjb25zdCB0PWUodGhpcy5wYXlsb2FkKTtyZXR1cm4gVC5vZk51bGxhYmxlKHQpfWZsYXRNYXAoZSl7cmV0dXJuIGUodGhpcy5wYXlsb2FkKX1vcihlKXtyZXR1cm4gdGhpc31vckVsc2UoZSl7cmV0dXJuIHRoaXMucGF5bG9hZH1vckVsc2VHZXQoZSl7cmV0dXJuIHRoaXMucGF5bG9hZH1vckVsc2VUaHJvdyhlKXtyZXR1cm4gdGhpcy5wYXlsb2FkfW9yTnVsbCgpe3JldHVybiB0aGlzLnBheWxvYWR9b3JVbmRlZmluZWQoKXtyZXR1cm4gdGhpcy5wYXlsb2FkfXRvT3B0aW9uKCl7cmV0dXJue2tpbmQ6InByZXNlbnQiLHZhbHVlOnRoaXMucGF5bG9hZH19bWF0Y2hlcyhlKXtyZXR1cm4gZS5wcmVzZW50KHRoaXMucGF5bG9hZCl9dG9KU09OKGUpe3JldHVybiB0aGlzLnBheWxvYWR9fWNsYXNzIG1uIGV4dGVuZHMgVHtpc1ByZXNlbnQoKXtyZXR1cm4hMX1jb25zdHJ1Y3Rvcigpe3N1cGVyKCl9Z2V0KCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIG9wdGlvbmFsIGlzIG5vdCBwcmVzZW50LiIpfWlmUHJlc2VudChlKXt9aWZQcmVzZW50T3JFbHNlKGUsdCl7dCgpfWZpbHRlcihlKXtyZXR1cm4gdGhpc31tYXAoZSl7cmV0dXJuIFQuZW1wdHkoKX1mbGF0TWFwKGUpe3JldHVybiBULmVtcHR5KCl9b3IoZSl7cmV0dXJuIGUoKX1vckVsc2UoZSl7cmV0dXJuIGV9b3JFbHNlR2V0KGUpe3JldHVybiB0aGlzLm9yRWxzZShlKCkpfW9yRWxzZVRocm93KGUpe3Rocm93IGUoKX1vck51bGwoKXtyZXR1cm4gbnVsbH1vclVuZGVmaW5lZCgpe310b09wdGlvbigpe3JldHVybntraW5kOiJlbXB0eSJ9fW1hdGNoZXMoZSl7cmV0dXJuIGUuZW1wdHkoKX10b0pTT04oZSl7cmV0dXJuIG51bGx9fWNvbnN0IGFzPSIyLjAuMCI7ZnVuY3Rpb24gdXMocil7Z2xvYmFsVGhpcy5fdm9uYWdlTWVkaWFQcm9jZXNzb3JNZXRhZGF0YT1yfWZ1bmN0aW9uIGNzKCl7cmV0dXJuIGdsb2JhbFRoaXMuX3ZvbmFnZU1lZGlhUHJvY2Vzc29yTWV0YWRhdGF9Y2xhc3MgSHtjb25zdHJ1Y3Rvcigpe2NvbnN0IGU9Y3MoKTt0aGlzLl9yZXBvcnQ9e2FjdGlvbjpULmVtcHR5KCksYXBwbGljYXRpb25JZDpULm9mTnVsbGFibGUoZSE9PXZvaWQgMCYmZSE9bnVsbD9lLmFwcElkOm51bGwpLHRpbWVzdGFtcDpEYXRlLm5vdygpLGZwczpULmVtcHR5KCksZnJhbWVzVHJhbnNmb3JtZWQ6VC5lbXB0eSgpLGd1aWQ6VC5lbXB0eSgpLGhpZ2hlc3RGcmFtZVRyYW5zZm9ybUNwdTpULmVtcHR5KCksbWVzc2FnZTpULmVtcHR5KCksc291cmNlOlQub2ZOdWxsYWJsZShlIT09dm9pZCAwJiZlIT1udWxsP2Uuc291cmNlVHlwZTpudWxsKSx0cmFuc2Zvcm1lZEZwczpULmVtcHR5KCksdHJhbnNmb3JtZXJUeXBlOlQuZW1wdHkoKSx2YXJpYXRpb246VC5lbXB0eSgpLHZpZGVvSGVpZ2h0OlQuZW1wdHkoKSx2aWRlb1dpZHRoOlQuZW1wdHkoKSx2ZXJzaW9uOmFzLGVycm9yOlQuZW1wdHkoKSxwcm94eVVybDpULm9mTnVsbGFibGUoZSE9PXZvaWQgMCYmZSE9bnVsbD9lLnByb3h5VXJsOm51bGwpfX1hY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5hY3Rpb249VC5vZk51bGxhYmxlKGUpLHRoaXN9ZnJhbWVzVHJhbnNmb3JtZWQoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5mcmFtZXNUcmFuc2Zvcm1lZD1ULm9mTnVsbGFibGUoZSksdGhpc31mcHMoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5mcHM9VC5vZk51bGxhYmxlKGUpLHRoaXN9Z3VpZChlKXtyZXR1cm4gdGhpcy5fcmVwb3J0Lmd1aWQ9VC5vZk51bGxhYmxlKGUpLHRoaXN9bWVzc2FnZShlKXtyZXR1cm4gdGhpcy5fcmVwb3J0Lm1lc3NhZ2U9VC5vZk51bGxhYmxlKGUpLHRoaXN9dHJhbnNmb3JtZWRGcHMoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC50cmFuc2Zvcm1lZEZwcz1ULm9mTnVsbGFibGUoZSksdGhpc310cmFuc2Zvcm1lclR5cGUoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC50cmFuc2Zvcm1lclR5cGU9VC5vZk51bGxhYmxlKGUpLHRoaXN9dmFyaWF0aW9uKGUpe3JldHVybiB0aGlzLl9yZXBvcnQudmFyaWF0aW9uPVQub2ZOdWxsYWJsZShlKSx0aGlzfXZpZGVvSGVpZ2h0KGUpe3JldHVybiB0aGlzLl9yZXBvcnQudmlkZW9IZWlnaHQ9VC5vZk51bGxhYmxlKGUpLHRoaXN9dmlkZW9XaWR0aChlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LnZpZGVvV2lkdGg9VC5vZk51bGxhYmxlKGUpLHRoaXN9ZXJyb3IoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5lcnJvcj1ULm9mTnVsbGFibGUoZSksdGhpc31idWlsZCgpe3JldHVybiB0aGlzLl9yZXBvcnR9fWNvbnN0IGZzPXI9PkpTT04uc3RyaW5naWZ5KHIsKGUsdCk9PntpZih0IT09bnVsbClyZXR1cm4gdH0pO2NsYXNzIFZ7c3RhdGljIHJlcG9ydChlKXtyZXR1cm4gbmV3IFByb21pc2UoKHQsbik9PntpZihlLmFwcGxpY2F0aW9uSWQuaXNFbXB0eSgpfHxlLnNvdXJjZS5pc0VtcHR5KCkpe3QoInN1Y2Nlc3MiKTtyZXR1cm59bGV0IGk9c3MuY3JlYXRlKCksbz17dGltZW91dDoxZTQsdGltZW91dEVycm9yTWVzc2FnZToiUmVxdWVzdCB0aW1lb3V0IixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9fSxzPSJobGcudG9rYm94LmNvbS9wcm9kL2xvZ2dpbmcvdmNwX3dlYnJ0YyI7aWYoZS5wcm94eVVybC5pc0VtcHR5KCkpcz0iaHR0cHM6Ly8iK3M7ZWxzZXtsZXQgYTtlLnByb3h5VXJsLmdldCgpLnNsaWNlKGUucHJveHlVcmwuZ2V0KCkubGVuZ3RoLTEpIT09Ii8iP2E9ZS5wcm94eVVybC5nZXQoKSsiLyI6YT1lLnByb3h5VXJsLmdldCgpLHM9YStzfWkucG9zdChzLGZzKGUpLG8pLnRoZW4oYT0+e2NvbnNvbGUubG9nKGEpLHQoInN1Y2Nlc3MiKX0pLmNhdGNoKGE9Pntjb25zb2xlLmxvZyhhKSxuKGEpfSl9KX19dmFyIHR0LGxzPW5ldyBVaW50OEFycmF5KDE2KTtmdW5jdGlvbiBkcygpe2lmKCF0dCYmKHR0PXR5cGVvZiBjcnlwdG88InUiJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKXx8dHlwZW9mIG1zQ3J5cHRvPCJ1IiYmdHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcz09ImZ1bmN0aW9uIiYmbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQobXNDcnlwdG8pLCF0dCkpdGhyb3cgbmV3IEVycm9yKCJjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCIpO3JldHVybiB0dChscyl9dmFyIG1zPS9eKD86WzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKSQvaTtmdW5jdGlvbiBocyhyKXtyZXR1cm4gdHlwZW9mIHI9PSJzdHJpbmciJiZtcy50ZXN0KHIpfWZvcih2YXIgTj1bXSxXdD0wO1d0PDI1NjsrK1d0KU4ucHVzaCgoV3QrMjU2KS50b1N0cmluZygxNikuc3Vic3RyKDEpKTtmdW5jdGlvbiBwcyhyKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06MCx0PShOW3JbZSswXV0rTltyW2UrMV1dK05bcltlKzJdXStOW3JbZSszXV0rIi0iK05bcltlKzRdXStOW3JbZSs1XV0rIi0iK05bcltlKzZdXStOW3JbZSs3XV0rIi0iK05bcltlKzhdXStOW3JbZSs5XV0rIi0iK05bcltlKzEwXV0rTltyW2UrMTFdXStOW3JbZSsxMl1dK05bcltlKzEzXV0rTltyW2UrMTRdXStOW3JbZSsxNV1dKS50b0xvd2VyQ2FzZSgpO2lmKCFocyh0KSl0aHJvdyBUeXBlRXJyb3IoIlN0cmluZ2lmaWVkIFVVSUQgaXMgaW52YWxpZCIpO3JldHVybiB0fWZ1bmN0aW9uIGhuKHIsZSx0KXtyPXJ8fHt9O3ZhciBuPXIucmFuZG9tfHwoci5ybmd8fGRzKSgpO2lmKG5bNl09bls2XSYxNXw2NCxuWzhdPW5bOF0mNjN8MTI4LGUpe3Q9dHx8MDtmb3IodmFyIGk9MDtpPDE2OysraSllW3QraV09bltpXTtyZXR1cm4gZX1yZXR1cm4gcHMobil9Y29uc3Qgc2U9bmV3IFdlYWtNYXAscnQ9bmV3IFdlYWtNYXAsQ2U9bmV3IFdlYWtNYXAsanQ9U3ltYm9sKCJhbnlQcm9kdWNlciIpLHBuPVByb21pc2UucmVzb2x2ZSgpLG50PVN5bWJvbCgibGlzdGVuZXJBZGRlZCIpLGl0PVN5bWJvbCgibGlzdGVuZXJSZW1vdmVkIik7bGV0IHF0PSExO2Z1bmN0aW9uIHdlKHIpe2lmKHR5cGVvZiByIT0ic3RyaW5nIiYmdHlwZW9mIHIhPSJzeW1ib2wiKXRocm93IG5ldyBUeXBlRXJyb3IoImV2ZW50TmFtZSBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgc3ltYm9sIil9ZnVuY3Rpb24gb3Qocil7aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gUmUocixlKXtjb25zdCB0PXJ0LmdldChyKTtyZXR1cm4gdC5oYXMoZSl8fHQuc2V0KGUsbmV3IFNldCksdC5nZXQoZSl9ZnVuY3Rpb24gT2UocixlKXtjb25zdCB0PXR5cGVvZiBlPT0ic3RyaW5nInx8dHlwZW9mIGU9PSJzeW1ib2wiP2U6anQsbj1DZS5nZXQocik7cmV0dXJuIG4uaGFzKHQpfHxuLnNldCh0LG5ldyBTZXQpLG4uZ2V0KHQpfWZ1bmN0aW9uIHlzKHIsZSx0KXtjb25zdCBuPUNlLmdldChyKTtpZihuLmhhcyhlKSlmb3IoY29uc3QgaSBvZiBuLmdldChlKSlpLmVucXVldWUodCk7aWYobi5oYXMoanQpKXtjb25zdCBpPVByb21pc2UuYWxsKFtlLHRdKTtmb3IoY29uc3QgbyBvZiBuLmdldChqdCkpby5lbnF1ZXVlKGkpfX1mdW5jdGlvbiB5bihyLGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtsZXQgdD0hMSxuPSgpPT57fSxpPVtdO2NvbnN0IG89e2VucXVldWUocyl7aS5wdXNoKHMpLG4oKX0sZmluaXNoKCl7dD0hMCxuKCl9fTtmb3IoY29uc3QgcyBvZiBlKU9lKHIscykuYWRkKG8pO3JldHVybnthc3luYyBuZXh0KCl7cmV0dXJuIGk/aS5sZW5ndGg9PT0wP3Q/KGk9dm9pZCAwLHRoaXMubmV4dCgpKTooYXdhaXQgbmV3IFByb21pc2Uocz0+e249c30pLHRoaXMubmV4dCgpKTp7ZG9uZTohMSx2YWx1ZTphd2FpdCBpLnNoaWZ0KCl9Ontkb25lOiEwfX0sYXN5bmMgcmV0dXJuKHMpe2k9dm9pZCAwO2Zvcihjb25zdCBhIG9mIGUpT2UocixhKS5kZWxldGUobyk7cmV0dXJuIG4oKSxhcmd1bWVudHMubGVuZ3RoPjA/e2RvbmU6ITAsdmFsdWU6YXdhaXQgc306e2RvbmU6ITB9fSxbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCl7cmV0dXJuIHRoaXN9fX1mdW5jdGlvbiBfbihyKXtpZihyPT09dm9pZCAwKXJldHVybiB4bjtpZighQXJyYXkuaXNBcnJheShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJgbWV0aG9kTmFtZXNgIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncyIpO2Zvcihjb25zdCBlIG9mIHIpaWYoIXhuLmluY2x1ZGVzKGUpKXRocm93IHR5cGVvZiBlIT0ic3RyaW5nIj9uZXcgVHlwZUVycm9yKCJgbWV0aG9kTmFtZXNgIGVsZW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpOm5ldyBFcnJvcihgJHtlfSBpcyBub3QgRW1pdHRlcnkgbWV0aG9kYCk7cmV0dXJuIHJ9Y29uc3QgWHQ9cj0+cj09PW50fHxyPT09aXQ7Y2xhc3MgaGV7c3RhdGljIG1peGluKGUsdCl7cmV0dXJuIHQ9X24odCksbj0+e2lmKHR5cGVvZiBuIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoImB0YXJnZXRgIG11c3QgYmUgZnVuY3Rpb24iKTtmb3IoY29uc3QgcyBvZiB0KWlmKG4ucHJvdG90eXBlW3NdIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgVGhlIHByb3BlcnR5IFxgJHtzfVxgIGFscmVhZHkgZXhpc3RzIG9uIFxgdGFyZ2V0XGBgKTtmdW5jdGlvbiBpKCl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGUse2VudW1lcmFibGU6ITEsdmFsdWU6bmV3IGhlfSksdGhpc1tlXX1PYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUsZSx7ZW51bWVyYWJsZTohMSxnZXQ6aX0pO2NvbnN0IG89cz0+ZnVuY3Rpb24oLi4uYSl7cmV0dXJuIHRoaXNbZV1bc10oLi4uYSl9O2Zvcihjb25zdCBzIG9mIHQpT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLHMse2VudW1lcmFibGU6ITEsdmFsdWU6byhzKX0pO3JldHVybiBufX1zdGF0aWMgZ2V0IGlzRGVidWdFbmFibGVkKCl7aWYodHlwZW9mIHByb2Nlc3MhPSJvYmplY3QiKXJldHVybiBxdDtjb25zdHtlbnY6ZX09cHJvY2Vzc3x8e2Vudjp7fX07cmV0dXJuIGUuREVCVUc9PT0iZW1pdHRlcnkifHxlLkRFQlVHPT09IioifHxxdH1zdGF0aWMgc2V0IGlzRGVidWdFbmFibGVkKGUpe3F0PWV9Y29uc3RydWN0b3IoZT17fSl7c2Uuc2V0KHRoaXMsbmV3IFNldCkscnQuc2V0KHRoaXMsbmV3IE1hcCksQ2Uuc2V0KHRoaXMsbmV3IE1hcCksdGhpcy5kZWJ1Zz1lLmRlYnVnfHx7fSx0aGlzLmRlYnVnLmVuYWJsZWQ9PT12b2lkIDAmJih0aGlzLmRlYnVnLmVuYWJsZWQ9ITEpLHRoaXMuZGVidWcubG9nZ2VyfHwodGhpcy5kZWJ1Zy5sb2dnZXI9KHQsbixpLG8pPT57bz1KU09OLnN0cmluZ2lmeShvKSx0eXBlb2YgaT09InN5bWJvbCImJihpPWkudG9TdHJpbmcoKSk7Y29uc3Qgcz1uZXcgRGF0ZSxhPWAke3MuZ2V0SG91cnMoKX06JHtzLmdldE1pbnV0ZXMoKX06JHtzLmdldFNlY29uZHMoKX0uJHtzLmdldE1pbGxpc2Vjb25kcygpfWA7Y29uc29sZS5sb2coYFske2F9XVtlbWl0dGVyeToke3R9XVske259XSBFdmVudCBOYW1lOiAke2l9CglkYXRhOiAke299YCl9KX1sb2dJZkRlYnVnRW5hYmxlZChlLHQsbil7KGhlLmlzRGVidWdFbmFibGVkfHx0aGlzLmRlYnVnLmVuYWJsZWQpJiZ0aGlzLmRlYnVnLmxvZ2dlcihlLHRoaXMuZGVidWcubmFtZSx0LG4pfW9uKGUsdCl7b3QodCksZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCBuIG9mIGUpd2UobiksUmUodGhpcyxuKS5hZGQodCksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgic3Vic2NyaWJlIixuLHZvaWQgMCksWHQobil8fHRoaXMuZW1pdChudCx7ZXZlbnROYW1lOm4sbGlzdGVuZXI6dH0pO3JldHVybiB0aGlzLm9mZi5iaW5kKHRoaXMsZSx0KX1vZmYoZSx0KXtvdCh0KSxlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07Zm9yKGNvbnN0IG4gb2YgZSl3ZShuKSxSZSh0aGlzLG4pLmRlbGV0ZSh0KSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJ1bnN1YnNjcmliZSIsbix2b2lkIDApLFh0KG4pfHx0aGlzLmVtaXQoaXQse2V2ZW50TmFtZTpuLGxpc3RlbmVyOnR9KX1vbmNlKGUpe3JldHVybiBuZXcgUHJvbWlzZSh0PT57Y29uc3Qgbj10aGlzLm9uKGUsaT0+e24oKSx0KGkpfSl9KX1ldmVudHMoZSl7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCB0IG9mIGUpd2UodCk7cmV0dXJuIHluKHRoaXMsZSl9YXN5bmMgZW1pdChlLHQpe3dlKGUpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoImVtaXQiLGUsdCkseXModGhpcyxlLHQpO2NvbnN0IG49UmUodGhpcyxlKSxpPXNlLmdldCh0aGlzKSxvPVsuLi5uXSxzPVh0KGUpP1tdOlsuLi5pXTthd2FpdCBwbixhd2FpdCBQcm9taXNlLmFsbChbLi4uby5tYXAoYXN5bmMgYT0+e2lmKG4uaGFzKGEpKXJldHVybiBhKHQpfSksLi4ucy5tYXAoYXN5bmMgYT0+e2lmKGkuaGFzKGEpKXJldHVybiBhKGUsdCl9KV0pfWFzeW5jIGVtaXRTZXJpYWwoZSx0KXt3ZShlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJlbWl0U2VyaWFsIixlLHQpO2NvbnN0IG49UmUodGhpcyxlKSxpPXNlLmdldCh0aGlzKSxvPVsuLi5uXSxzPVsuLi5pXTthd2FpdCBwbjtmb3IoY29uc3QgYSBvZiBvKW4uaGFzKGEpJiZhd2FpdCBhKHQpO2Zvcihjb25zdCBhIG9mIHMpaS5oYXMoYSkmJmF3YWl0IGEoZSx0KX1vbkFueShlKXtyZXR1cm4gb3QoZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgic3Vic2NyaWJlQW55Iix2b2lkIDAsdm9pZCAwKSxzZS5nZXQodGhpcykuYWRkKGUpLHRoaXMuZW1pdChudCx7bGlzdGVuZXI6ZX0pLHRoaXMub2ZmQW55LmJpbmQodGhpcyxlKX1hbnlFdmVudCgpe3JldHVybiB5bih0aGlzKX1vZmZBbnkoZSl7b3QoZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgidW5zdWJzY3JpYmVBbnkiLHZvaWQgMCx2b2lkIDApLHRoaXMuZW1pdChpdCx7bGlzdGVuZXI6ZX0pLHNlLmdldCh0aGlzKS5kZWxldGUoZSl9Y2xlYXJMaXN0ZW5lcnMoZSl7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCB0IG9mIGUpaWYodGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgiY2xlYXIiLHQsdm9pZCAwKSx0eXBlb2YgdD09InN0cmluZyJ8fHR5cGVvZiB0PT0ic3ltYm9sIil7UmUodGhpcyx0KS5jbGVhcigpO2NvbnN0IG49T2UodGhpcyx0KTtmb3IoY29uc3QgaSBvZiBuKWkuZmluaXNoKCk7bi5jbGVhcigpfWVsc2V7c2UuZ2V0KHRoaXMpLmNsZWFyKCk7Zm9yKGNvbnN0IG4gb2YgcnQuZ2V0KHRoaXMpLnZhbHVlcygpKW4uY2xlYXIoKTtmb3IoY29uc3QgbiBvZiBDZS5nZXQodGhpcykudmFsdWVzKCkpe2Zvcihjb25zdCBpIG9mIG4paS5maW5pc2goKTtuLmNsZWFyKCl9fX1saXN0ZW5lckNvdW50KGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtsZXQgdD0wO2Zvcihjb25zdCBuIG9mIGUpe2lmKHR5cGVvZiBuPT0ic3RyaW5nIil7dCs9c2UuZ2V0KHRoaXMpLnNpemUrUmUodGhpcyxuKS5zaXplK09lKHRoaXMsbikuc2l6ZStPZSh0aGlzKS5zaXplO2NvbnRpbnVlfXR5cGVvZiBuPCJ1IiYmd2UobiksdCs9c2UuZ2V0KHRoaXMpLnNpemU7Zm9yKGNvbnN0IGkgb2YgcnQuZ2V0KHRoaXMpLnZhbHVlcygpKXQrPWkuc2l6ZTtmb3IoY29uc3QgaSBvZiBDZS5nZXQodGhpcykudmFsdWVzKCkpdCs9aS5zaXplfXJldHVybiB0fWJpbmRNZXRob2RzKGUsdCl7aWYodHlwZW9mIGUhPSJvYmplY3QifHxlPT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJgdGFyZ2V0YCBtdXN0IGJlIGFuIG9iamVjdCIpO3Q9X24odCk7Zm9yKGNvbnN0IG4gb2YgdCl7aWYoZVtuXSE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoYFRoZSBwcm9wZXJ0eSBcYCR7bn1cYCBhbHJlYWR5IGV4aXN0cyBvbiBcYHRhcmdldFxgYCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix7ZW51bWVyYWJsZTohMSx2YWx1ZTp0aGlzW25dLmJpbmQodGhpcyl9KX19fWNvbnN0IHhuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGhlLnByb3RvdHlwZSkuZmlsdGVyKHI9PnIhPT0iY29uc3RydWN0b3IiKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaGUsImxpc3RlbmVyQWRkZWQiLHt2YWx1ZTpudCx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoZSwibGlzdGVuZXJSZW1vdmVkIix7dmFsdWU6aXQsd3JpdGFibGU6ITEsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITF9KTt2YXIgWXQ9aGU7ZnVuY3Rpb24gX3Mocil7cmV0dXJuIHR5cGVvZiByPT0ib2JqZWN0IiYmciE9PW51bGwmJiJtZXNzYWdlImluIHImJnR5cGVvZiByLm1lc3NhZ2U9PSJzdHJpbmcifWZ1bmN0aW9uIHhzKHIpe2lmKF9zKHIpKXJldHVybiByO3RyeXtyZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHIpKX1jYXRjaHtyZXR1cm4gbmV3IEVycm9yKFN0cmluZyhyKSl9fWZ1bmN0aW9uIEt0KHIpe3JldHVybiB4cyhyKS5tZXNzYWdlfXZhciBKdD0ocj0+KHIucGlwZWxpbmVfZW5kZWQ9InBpcGVsaW5lX2VuZGVkIixyLnBpcGVsaW5lX2VuZGVkX3dpdGhfZXJyb3I9InBpcGVsaW5lX2VuZGVkX3dpdGhfZXJyb3IiLHIucGlwZWxpbmVfc3RhcnRlZD0icGlwZWxpbmVfc3RhcnRlZCIsci5waXBlbGluZV9zdGFydGVkX3dpdGhfZXJyb3I9InBpcGVsaW5lX3N0YXJ0ZWRfd2l0aF9lcnJvciIsci5waXBlbGluZV9yZXN0YXJ0ZWQ9InBpcGVsaW5lX3Jlc3RhcnRlZCIsci5waXBlbGluZV9yZXN0YXJ0ZWRfd2l0aF9lcnJvcj0icGlwZWxpbmVfcmVzdGFydGVkX3dpdGhfZXJyb3IiLHIpKShKdHx8e30pO2NvbnN0IGJzPTUwMCxncz0uODtjbGFzcyB2cyBleHRlbmRzIFl0e2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoKSx0aGlzLmluZGV4Xz10LHRoaXMudXVpZF89aG4oKSx0aGlzLmZyYW1lc1RyYW5zZm9ybWVkXz0wLHRoaXMudHJhbnNmb3JtZXJfPWUsdGhpcy5zaG91bGRTdG9wXz0hMSx0aGlzLmlzRmxhc2hlZF89ITEsdGhpcy5mcmFtZXNGcm9tU291cmNlXz0wLHRoaXMuZnBzXz0wLHRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXz0wLHRoaXMudmlkZW9IZWlnaHRfPTAsdGhpcy52aWRlb1dpZHRoXz0wLHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfPS0xLHRoaXMudHJhbnNmb3JtZXJUeXBlXz0iQ3VzdG9tIiwiZ2V0VHJhbnNmb3JtZXJUeXBlImluIGUmJih0aGlzLnRyYW5zZm9ybWVyVHlwZV89ZS5nZXRUcmFuc2Zvcm1lclR5cGUoKSk7Y29uc3Qgbj1uZXcgSCgpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmd1aWQodGhpcy51dWlkXykudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmFyaWF0aW9uKCJDcmVhdGUiKS5idWlsZCgpO1YucmVwb3J0KG4pfXNldFRyYWNrRXhwZWN0ZWRSYXRlKGUpe3RoaXMudHJhY2tFeHBlY3RlZFJhdGVfPWV9YXN5bmMgc3RhcnQoZSl7aWYodGhpcy5jb250cm9sbGVyXz1lLHRoaXMudHJhbnNmb3JtZXJfJiZ0eXBlb2YgdGhpcy50cmFuc2Zvcm1lcl8uc3RhcnQ9PSJmdW5jdGlvbiIpdHJ5e2F3YWl0IHRoaXMudHJhbnNmb3JtZXJfLnN0YXJ0KGUpfWNhdGNoKHQpe2NvbnN0IG49bmV3IEgoKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UobmUuZXJyb3JzLnRyYW5zZm9ybWVyX3N0YXJ0KS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkVycm9yIikuZXJyb3IoS3QodCkpLmJ1aWxkKCk7Vi5yZXBvcnQobik7Y29uc3QgaT17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sZXJyb3I6dCxmdW5jdGlvbjoic3RhcnQifTt0aGlzLmVtaXQoImVycm9yIixpKX19YXN5bmMgdHJhbnNmb3JtKGUsdCl7dmFyIG4saSxvLHM7aWYodGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfPT09MCYmKHRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXz1EYXRlLm5vdygpKSxlIGluc3RhbmNlb2YgVmlkZW9GcmFtZSYmKHRoaXMudmlkZW9IZWlnaHRfPShuPWU9PW51bGw/dm9pZCAwOmUuZGlzcGxheUhlaWdodCkhPW51bGw/bjowLHRoaXMudmlkZW9XaWR0aF89KGk9ZT09bnVsbD92b2lkIDA6ZS5kaXNwbGF5V2lkdGgpIT1udWxsP2k6MCksKyt0aGlzLmZyYW1lc0Zyb21Tb3VyY2VfLHRoaXMudHJhbnNmb3JtZXJfKWlmKHRoaXMuc2hvdWxkU3RvcF8pY29uc29sZS53YXJuKCJbUGlwZWxpbmVdIGZsdXNoIGZyb20gdHJhbnNmb3JtIiksZS5jbG9zZSgpLHRoaXMuZmx1c2godCksdC50ZXJtaW5hdGUoKTtlbHNlIHRyeXthd2FpdCgocz0obz10aGlzLnRyYW5zZm9ybWVyXykudHJhbnNmb3JtKT09bnVsbD92b2lkIDA6cy5jYWxsKG8sZSx0KSksKyt0aGlzLmZyYW1lc1RyYW5zZm9ybWVkXyx0aGlzLmZyYW1lc1RyYW5zZm9ybWVkXz09PWJzJiZ0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnQoKX1jYXRjaChhKXtjb25zdCB1PW5ldyBIKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKG5lLmVycm9ycy50cmFuc2Zvcm1lcl90cmFuc2Zvcm0pLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiRXJyb3IiKS5lcnJvcihLdChhKSkuYnVpbGQoKTtWLnJlcG9ydCh1KTtjb25zdCBmPXtldmVudE1ldGFEYXRhOnt0cmFuc2Zvcm1lckluZGV4OnRoaXMuaW5kZXhffSxlcnJvcjphLGZ1bmN0aW9uOiJ0cmFuc2Zvcm0ifTt0aGlzLmVtaXQoImVycm9yIixmKX19YXN5bmMgZmx1c2goZSl7aWYodGhpcy50cmFuc2Zvcm1lcl8mJnR5cGVvZiB0aGlzLnRyYW5zZm9ybWVyXy5mbHVzaD09ImZ1bmN0aW9uIiYmIXRoaXMuaXNGbGFzaGVkXyl7dGhpcy5pc0ZsYXNoZWRfPSEwO3RyeXthd2FpdCB0aGlzLnRyYW5zZm9ybWVyXy5mbHVzaChlKX1jYXRjaChuKXtjb25zdCBpPW5ldyBIKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKG5lLmVycm9ycy50cmFuc2Zvcm1lcl9mbHVzaCkudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmFyaWF0aW9uKCJFcnJvciIpLmVycm9yKEt0KG4pKS5idWlsZCgpO1YucmVwb3J0KGkpO2NvbnN0IG89e2V2ZW50TWV0YURhdGE6e3RyYW5zZm9ybWVySW5kZXg6dGhpcy5pbmRleF99LGVycm9yOm4sZnVuY3Rpb246ImZsdXNoIn07dGhpcy5lbWl0KCJlcnJvciIsbyl9fXRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydCgpO2NvbnN0IHQ9bmV3IEgoKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5ndWlkKHRoaXMudXVpZF8pLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiRGVsZXRlIikuYnVpbGQoKTtWLnJlcG9ydCh0KX1zdG9wKCl7Y29uc29sZS5sb2coIltQaXBlbGluZV0gU3RvcCBzdHJlYW0uIiksdGhpcy5jb250cm9sbGVyXyYmKHRoaXMuZmx1c2godGhpcy5jb250cm9sbGVyXyksdGhpcy5jb250cm9sbGVyXy50ZXJtaW5hdGUoKSksdGhpcy5zaG91bGRTdG9wXz0hMH1tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0KCl7bGV0IGU9KERhdGUubm93KCktdGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfKS8xZTMsdD10aGlzLmZyYW1lc0Zyb21Tb3VyY2VfL2Usbj10aGlzLmZyYW1lc1RyYW5zZm9ybWVkXy9lO2lmKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfIT0tMSYmdGhpcy50cmFja0V4cGVjdGVkUmF0ZV8qZ3M+dCl7Y29uc3Qgbz17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sd2FybmluZ1R5cGU6ImZwc19kcm9wIixkcm9wSW5mbzp7cmVxdWVzdGVkOnRoaXMudHJhY2tFeHBlY3RlZFJhdGVfLGN1cnJlbnQ6dH19O3RoaXMuZW1pdCgid2FybiIsbyl9Y29uc3QgaT1uZXcgSCgpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmZwcyh0KS50cmFuc2Zvcm1lZEZwcyhuKS5mcmFtZXNUcmFuc2Zvcm1lZCh0aGlzLmZyYW1lc1RyYW5zZm9ybWVkXykuZ3VpZCh0aGlzLnV1aWRfKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52aWRlb0hlaWdodCh0aGlzLnZpZGVvSGVpZ2h0XykudmlkZW9XaWR0aCh0aGlzLnZpZGVvV2lkdGhfKS52YXJpYXRpb24oIlFvUyIpLmJ1aWxkKCk7Vi5yZXBvcnQoaSksdGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfPTAsdGhpcy5mcmFtZXNGcm9tU291cmNlXz0wLHRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfPTB9fWNsYXNzIEVzIGV4dGVuZHMgWXR7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLnRyYW5zZm9ybWVyc189W10sdGhpcy50cmFja0V4cGVjdGVkUmF0ZV89LTE7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2xldCBuPW5ldyB2cyhlW3RdLHQpO24ub24oImVycm9yIixpPT57dGhpcy5lbWl0KCJlcnJvciIsaSl9KSxuLm9uKCJ3YXJuIixpPT57dGhpcy5lbWl0KCJ3YXJuIixpKX0pLHRoaXMudHJhbnNmb3JtZXJzXy5wdXNoKG4pfX1zZXRUcmFja0V4cGVjdGVkUmF0ZShlKXt0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz1lO2ZvcihsZXQgdCBvZiB0aGlzLnRyYW5zZm9ybWVyc18pdC5zZXRUcmFja0V4cGVjdGVkUmF0ZSh0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyl9YXN5bmMgc3RhcnQoZSx0KXtpZighdGhpcy50cmFuc2Zvcm1lcnNffHx0aGlzLnRyYW5zZm9ybWVyc18ubGVuZ3RoPT09MCl7Y29uc29sZS5sb2coIltQaXBlbGluZV0gTm8gdHJhbnNmb3JtZXJzLiIpO3JldHVybn10cnl7bGV0IG49ZTtmb3IobGV0IGkgb2YgdGhpcy50cmFuc2Zvcm1lcnNfKWU9ZS5waXBlVGhyb3VnaChuZXcgVHJhbnNmb3JtU3RyZWFtKGkpKTtlLnBpcGVUbyh0KS50aGVuKGFzeW5jKCk9Pntjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBTZXR1cC4iKSxhd2FpdCB0LmFib3J0KCksYXdhaXQgbi5jYW5jZWwoKSx0aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIsInBpcGVsaW5lX2VuZGVkIil9KS5jYXRjaChhc3luYyBpPT57ZS5jYW5jZWwoKS50aGVuKCgpPT57Y29uc29sZS5sb2coIltQaXBlbGluZV0gU2h1dHRpbmcgZG93biBzdHJlYW1zIGFmdGVyIGFib3J0LiIpfSkuY2F0Y2gobz0+e2NvbnNvbGUuZXJyb3IoIltQaXBlbGluZV0gRXJyb3IgZnJvbSBzdHJlYW0gdHJhbnNmb3JtOiIsbyl9KSxhd2FpdCB0LmFib3J0KGkpLGF3YWl0IG4uY2FuY2VsKGkpLHRoaXMuZW1pdCgicGlwZWxpbmVJbmZvIiwicGlwZWxpbmVfZW5kZWRfd2l0aF9lcnJvciIpfSl9Y2F0Y2h7dGhpcy5lbWl0KCJwaXBlbGluZUluZm8iLCJwaXBlbGluZV9zdGFydGVkX3dpdGhfZXJyb3IiKSx0aGlzLmRlc3Ryb3koKTtyZXR1cm59dGhpcy5lbWl0KCJwaXBlbGluZUluZm8iLCJwaXBlbGluZV9zdGFydGVkIiksY29uc29sZS5sb2coIltQaXBlbGluZV0gUGlwZWxpbmUgc3RhcnRlZC4iKX1hc3luYyBkZXN0cm95KCl7Y29uc29sZS5sb2coIltQaXBlbGluZV0gRGVzdHJveWluZyBQaXBlbGluZS4iKTtmb3IobGV0IGUgb2YgdGhpcy50cmFuc2Zvcm1lcnNfKWUuc3RvcCgpfX1jbGFzcyBUcyBleHRlbmRzIFl0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLnV1aWRfPWhuKCksdGhpcy50cmFja0V4cGVjdGVkUmF0ZV89LTE7Y29uc3QgZT1uZXcgSCgpLmFjdGlvbigiTWVkaWFQcm9jZXNzb3IiKS5ndWlkKHRoaXMudXVpZF8pLnZhcmlhdGlvbigiQ3JlYXRlIikuYnVpbGQoKTtWLnJlcG9ydChlKX1zZXRUcmFja0V4cGVjdGVkUmF0ZShlKXt0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz1lLHRoaXMucGlwZWxpbmVfJiZ0aGlzLnBpcGVsaW5lXy5zZXRUcmFja0V4cGVjdGVkUmF0ZSh0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyl9dHJhbnNmb3JtKGUsdCl7cmV0dXJuIHRoaXMucmVhZGFibGVfPWUsdGhpcy53cml0YWJsZV89dCx0aGlzLnRyYW5zZm9ybUludGVybmFsKCl9dHJhbnNmb3JtSW50ZXJuYWwoKXtyZXR1cm4gbmV3IFByb21pc2UoKGUsdCk9PntpZighdGhpcy50cmFuc2Zvcm1lcnNffHx0aGlzLnRyYW5zZm9ybWVyc18ubGVuZ3RoPT09MCl7Y29uc3QgaT1uZXcgSCgpLmFjdGlvbigiTWVkaWFQcm9jZXNzb3IiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UobmUuZXJyb3JzLnRyYW5zZm9ybWVyX25vbmUpLnZhcmlhdGlvbigiRXJyb3IiKS5idWlsZCgpO1YucmVwb3J0KGkpLHQoIltNZWRpYVByb2Nlc3Nvcl0gTmVlZCB0byBzZXQgdHJhbnNmb3JtZXJzLiIpO3JldHVybn1pZighdGhpcy5yZWFkYWJsZV8pe2NvbnN0IGk9bmV3IEgoKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKG5lLmVycm9ycy5yZWFkYWJsZV9udWxsKS52YXJpYXRpb24oIkVycm9yIikuYnVpbGQoKTtWLnJlcG9ydChpKSx0KCJbTWVkaWFQcm9jZXNzb3JdIFJlYWRhYmxlIGlzIG51bGwuIik7cmV0dXJufWlmKCF0aGlzLndyaXRhYmxlXyl7Y29uc3QgaT1uZXcgSCgpLmFjdGlvbigiTWVkaWFQcm9jZXNzb3IiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UobmUuZXJyb3JzLndyaXRhYmxlX251bGwpLnZhcmlhdGlvbigiRXJyb3IiKS5idWlsZCgpO1YucmVwb3J0KGkpLHQoIltNZWRpYVByb2Nlc3Nvcl0gV3JpdGFibGUgaXMgbnVsbC4iKTtyZXR1cm59bGV0IG49ITE7dGhpcy5waXBlbGluZV8mJihuPSEwLHRoaXMucGlwZWxpbmVfLmNsZWFyTGlzdGVuZXJzKCksdGhpcy5waXBlbGluZV8uZGVzdHJveSgpKSx0aGlzLnBpcGVsaW5lXz1uZXcgRXModGhpcy50cmFuc2Zvcm1lcnNfKSx0aGlzLnBpcGVsaW5lXy5vbigid2FybiIsaT0+e3RoaXMuZW1pdCgid2FybiIsaSl9KSx0aGlzLnBpcGVsaW5lXy5vbigiZXJyb3IiLGk9Pnt0aGlzLmVtaXQoImVycm9yIixpKX0pLHRoaXMucGlwZWxpbmVfLm9uKCJwaXBlbGluZUluZm8iLGk9PntuJiYoaT09PSJwaXBlbGluZV9zdGFydGVkIj9pPUp0LnBpcGVsaW5lX3Jlc3RhcnRlZDppPT09InBpcGVsaW5lX3N0YXJ0ZWRfd2l0aF9lcnJvciImJihpPUp0LnBpcGVsaW5lX3Jlc3RhcnRlZF93aXRoX2Vycm9yKSksdGhpcy5lbWl0KCJwaXBlbGluZUluZm8iLGkpfSksdGhpcy50cmFja0V4cGVjdGVkUmF0ZV8hPS0xJiZ0aGlzLnBpcGVsaW5lXy5zZXRUcmFja0V4cGVjdGVkUmF0ZSh0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyksdGhpcy5waXBlbGluZV8uc3RhcnQodGhpcy5yZWFkYWJsZV8sdGhpcy53cml0YWJsZV8pLnRoZW4oKCk9PntlKCl9KS5jYXRjaChpPT57dChpKX0pfSl9c2V0VHJhbnNmb3JtZXJzKGUpe2NvbnN0IHQ9bmV3IEgoKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKG5lLnVwZGF0ZXMudHJhbnNmb3JtZXJfbmV3KS52YXJpYXRpb24oIlVwZGF0ZSIpLmJ1aWxkKCk7cmV0dXJuIFYucmVwb3J0KHQpLHRoaXMudHJhbnNmb3JtZXJzXz1lLHRoaXMucmVhZGFibGVfJiZ0aGlzLndyaXRhYmxlXz90aGlzLnRyYW5zZm9ybUludGVybmFsKCk6UHJvbWlzZS5yZXNvbHZlKCl9ZGVzdHJveSgpe3JldHVybiBuZXcgUHJvbWlzZShlPT57dGhpcy5waXBlbGluZV8mJnRoaXMucGlwZWxpbmVfLmRlc3Ryb3koKTtjb25zdCB0PW5ldyBIKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykudmFyaWF0aW9uKCJEZWxldGUiKS5idWlsZCgpO1YucmVwb3J0KHQpLGUoKX0pfX12YXIgc3Q9KHI9PihyLkxvdz0iTG93IixyLkhpZ2g9IkhpZ2giLHIpKShzdHx8e30pOy8qIEBsaWNlbnNlIHR3Z2wuanMgNS4yLjAgQ29weXJpZ2h0IChjKSAyMDE1LCBHcmVnZyBUYXZhcmVzIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCkF2YWlsYWJsZSB2aWEgdGhlIE1JVCBsaWNlbnNlLgpzZWU6IGh0dHA6Ly9naXRodWIuY29tL2dyZWdnbWFuL3R3Z2wuanMgZm9yIGRldGFpbHMgKi9jb25zdCBRdD01MTIwLE5lPTUxMjEsWnQ9NTEyMixlcj01MTIzLHRyPTUxMjQscnI9NTEyNSxucj01MTI2LEFzPTMyODE5LHdzPTMyODIwLFJzPTMzNjM1LFNzPTUxMzEsSXM9MzM2NDAsRnM9MzU4OTksUHM9MzU5MDIsRHM9MzYyNjksTXM9MzQwNDIsYm49e307e2NvbnN0IHI9Ym47cltRdF09SW50OEFycmF5LHJbTmVdPVVpbnQ4QXJyYXkscltadF09SW50MTZBcnJheSxyW2VyXT1VaW50MTZBcnJheSxyW3RyXT1JbnQzMkFycmF5LHJbcnJdPVVpbnQzMkFycmF5LHJbbnJdPUZsb2F0MzJBcnJheSxyW0FzXT1VaW50MTZBcnJheSxyW3dzXT1VaW50MTZBcnJheSxyW1JzXT1VaW50MTZBcnJheSxyW1NzXT1VaW50MTZBcnJheSxyW0lzXT1VaW50MzJBcnJheSxyW0ZzXT1VaW50MzJBcnJheSxyW1BzXT1VaW50MzJBcnJheSxyW0RzXT1VaW50MzJBcnJheSxyW01zXT1VaW50MzJBcnJheX1mdW5jdGlvbiBpcihyKXtpZihyIGluc3RhbmNlb2YgSW50OEFycmF5KXJldHVybiBRdDtpZihyIGluc3RhbmNlb2YgVWludDhBcnJheXx8ciBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KXJldHVybiBOZTtpZihyIGluc3RhbmNlb2YgSW50MTZBcnJheSlyZXR1cm4gWnQ7aWYociBpbnN0YW5jZW9mIFVpbnQxNkFycmF5KXJldHVybiBlcjtpZihyIGluc3RhbmNlb2YgSW50MzJBcnJheSlyZXR1cm4gdHI7aWYociBpbnN0YW5jZW9mIFVpbnQzMkFycmF5KXJldHVybiBycjtpZihyIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5KXJldHVybiBucjt0aHJvdyBuZXcgRXJyb3IoInVuc3VwcG9ydGVkIHR5cGVkIGFycmF5IHR5cGUiKX1mdW5jdGlvbiBnbihyKXtpZihyPT09SW50OEFycmF5KXJldHVybiBRdDtpZihyPT09VWludDhBcnJheXx8cj09PVVpbnQ4Q2xhbXBlZEFycmF5KXJldHVybiBOZTtpZihyPT09SW50MTZBcnJheSlyZXR1cm4gWnQ7aWYocj09PVVpbnQxNkFycmF5KXJldHVybiBlcjtpZihyPT09SW50MzJBcnJheSlyZXR1cm4gdHI7aWYocj09PVVpbnQzMkFycmF5KXJldHVybiBycjtpZihyPT09RmxvYXQzMkFycmF5KXJldHVybiBucjt0aHJvdyBuZXcgRXJyb3IoInVuc3VwcG9ydGVkIHR5cGVkIGFycmF5IHR5cGUiKX1mdW5jdGlvbiB2bihyKXtjb25zdCBlPWJuW3JdO2lmKCFlKXRocm93IG5ldyBFcnJvcigidW5rbm93biBnbCB0eXBlIik7cmV0dXJuIGV9Y29uc3QgYXQ9dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyPCJ1Ij9mdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5idWZmZXImJihlLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxlLmJ1ZmZlciBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuYnVmZmVyJiZlLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfTtmdW5jdGlvbiBFbiguLi5yKXtjb25zb2xlLmVycm9yKC4uLnIpfWNvbnN0IFRuPW5ldyBNYXA7ZnVuY3Rpb24gdXQocixlKXtpZighcnx8dHlwZW9mIHIhPSJvYmplY3QiKXJldHVybiExO2xldCB0PVRuLmdldChlKTt0fHwodD1uZXcgV2Vha01hcCxUbi5zZXQoZSx0KSk7bGV0IG49dC5nZXQocik7aWYobj09PXZvaWQgMCl7Y29uc3QgaT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocik7bj1pLnN1YnN0cmluZyg4LGkubGVuZ3RoLTEpPT09ZSx0LnNldChyLG4pfXJldHVybiBufWZ1bmN0aW9uIENzKHIsZSl7cmV0dXJuIHR5cGVvZiBXZWJHTEJ1ZmZlcjwidSImJnV0KGUsIldlYkdMQnVmZmVyIil9ZnVuY3Rpb24gT3MocixlKXtyZXR1cm4gdHlwZW9mIFdlYkdMUmVuZGVyYnVmZmVyPCJ1IiYmdXQoZSwiV2ViR0xSZW5kZXJidWZmZXIiKX1mdW5jdGlvbiBvcihyLGUpe3JldHVybiB0eXBlb2YgV2ViR0xUZXh0dXJlPCJ1IiYmdXQoZSwiV2ViR0xUZXh0dXJlIil9ZnVuY3Rpb24gTnMocixlKXtyZXR1cm4gdHlwZW9mIFdlYkdMU2FtcGxlcjwidSImJnV0KGUsIldlYkdMU2FtcGxlciIpfWNvbnN0IEFuPTM1MDQ0LHBlPTM0OTYyLEJzPTM0OTYzLFVzPTM0NjYwLGtzPTUxMjAsTHM9NTEyMSwkcz01MTIyLEdzPTUxMjMsenM9NTEyNCxIcz01MTI1LHduPTUxMjYsUm49e2F0dHJpYlByZWZpeDoiIn07ZnVuY3Rpb24gVnMocixlLHQsbixpKXtyLmJpbmRCdWZmZXIoZSx0KSxyLmJ1ZmZlckRhdGEoZSxuLGl8fEFuKX1mdW5jdGlvbiBTbihyLGUsdCxuKXtpZihDcyhyLGUpKXJldHVybiBlO3Q9dHx8cGU7Y29uc3QgaT1yLmNyZWF0ZUJ1ZmZlcigpO3JldHVybiBWcyhyLHQsaSxlLG4pLGl9ZnVuY3Rpb24gSW4ocil7cmV0dXJuIHI9PT0iaW5kaWNlcyJ9ZnVuY3Rpb24gV3Mocil7cmV0dXJuIHI9PT1JbnQ4QXJyYXl8fHI9PT1VaW50OEFycmF5fWZ1bmN0aW9uIGpzKHIpe3JldHVybiByLmxlbmd0aD9yOnIuZGF0YX1jb25zdCBxcz0vY29vcmR8dGV4dHVyZS9pLFhzPS9jb2xvcnxjb2xvdXIvaTtmdW5jdGlvbiBZcyhyLGUpe2xldCB0O2lmKHFzLnRlc3Qocik/dD0yOlhzLnRlc3Qocik/dD00OnQ9MyxlJXQ+MCl0aHJvdyBuZXcgRXJyb3IoYENhbiBub3QgZ3Vlc3MgbnVtQ29tcG9uZW50cyBmb3IgYXR0cmlidXRlICcke3J9Jy4gVHJpZWQgJHt0fSBidXQgJHtlfSB2YWx1ZXMgaXMgbm90IGV2ZW5seSBkaXZpc2libGUgYnkgJHt0fS4gWW91IHNob3VsZCBzcGVjaWZ5IGl0LmApO3JldHVybiB0fWZ1bmN0aW9uIEtzKHIsZSx0KXtyZXR1cm4gci5udW1Db21wb25lbnRzfHxyLnNpemV8fFlzKGUsdHx8anMocikubGVuZ3RoKX1mdW5jdGlvbiBGbihyLGUpe2lmKGF0KHIpKXJldHVybiByO2lmKGF0KHIuZGF0YSkpcmV0dXJuIHIuZGF0YTtBcnJheS5pc0FycmF5KHIpJiYocj17ZGF0YTpyfSk7bGV0IHQ9ci50eXBlP3NyKHIudHlwZSk6dm9pZCAwO3JldHVybiB0fHwoSW4oZSk/dD1VaW50MTZBcnJheTp0PUZsb2F0MzJBcnJheSksbmV3IHQoci5kYXRhKX1mdW5jdGlvbiBKcyhyKXtyZXR1cm4gdHlwZW9mIHI9PSJudW1iZXIiP3I6cj9nbihyKTp3bn1mdW5jdGlvbiBzcihyKXtyZXR1cm4gdHlwZW9mIHI9PSJudW1iZXIiP3ZuKHIpOnJ8fEZsb2F0MzJBcnJheX1mdW5jdGlvbiBRcyhyLGUpe3JldHVybntidWZmZXI6ZS5idWZmZXIsbnVtVmFsdWVzOjIqMyo0LHR5cGU6SnMoZS50eXBlKSxhcnJheVR5cGU6c3IoZS50eXBlKX19ZnVuY3Rpb24gWnMocixlKXtjb25zdCB0PWUuZGF0YXx8ZSxuPXNyKGUudHlwZSksaT10Km4uQllURVNfUEVSX0VMRU1FTlQsbz1yLmNyZWF0ZUJ1ZmZlcigpO3JldHVybiByLmJpbmRCdWZmZXIocGUsbyksci5idWZmZXJEYXRhKHBlLGksZS5kcmF3VHlwZXx8QW4pLHtidWZmZXI6byxudW1WYWx1ZXM6dCx0eXBlOmduKG4pLGFycmF5VHlwZTpufX1mdW5jdGlvbiBlYShyLGUsdCl7Y29uc3Qgbj1GbihlLHQpO3JldHVybnthcnJheVR5cGU6bi5jb25zdHJ1Y3RvcixidWZmZXI6U24ocixuLHZvaWQgMCxlLmRyYXdUeXBlKSx0eXBlOmlyKG4pLG51bVZhbHVlczowfX1mdW5jdGlvbiB0YShyLGUpe2NvbnN0IHQ9e307cmV0dXJuIE9iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24obil7aWYoIUluKG4pKXtjb25zdCBpPWVbbl0sbz1pLmF0dHJpYnx8aS5uYW1lfHxpLmF0dHJpYk5hbWV8fFJuLmF0dHJpYlByZWZpeCtuO2lmKGkudmFsdWUpe2lmKCFBcnJheS5pc0FycmF5KGkudmFsdWUpJiYhYXQoaS52YWx1ZSkpdGhyb3cgbmV3IEVycm9yKCJhcnJheS52YWx1ZSBpcyBub3QgYXJyYXkgb3IgdHlwZWRhcnJheSIpO3Rbb109e3ZhbHVlOmkudmFsdWV9fWVsc2V7bGV0IHM7aS5idWZmZXImJmkuYnVmZmVyIGluc3RhbmNlb2YgV2ViR0xCdWZmZXI/cz1Rczp0eXBlb2YgaT09Im51bWJlciJ8fHR5cGVvZiBpLmRhdGE9PSJudW1iZXIiP3M9WnM6cz1lYTtjb25zdHtidWZmZXI6YSx0eXBlOnUsbnVtVmFsdWVzOmYsYXJyYXlUeXBlOmN9PXMocixpLG4pLGQ9aS5ub3JtYWxpemUhPT12b2lkIDA/aS5ub3JtYWxpemU6V3MoYykscD1LcyhpLG4sZik7dFtvXT17YnVmZmVyOmEsbnVtQ29tcG9uZW50czpwLHR5cGU6dSxub3JtYWxpemU6ZCxzdHJpZGU6aS5zdHJpZGV8fDAsb2Zmc2V0Omkub2Zmc2V0fHwwLGRpdmlzb3I6aS5kaXZpc29yPT09dm9pZCAwP3ZvaWQgMDppLmRpdmlzb3IsZHJhd1R5cGU6aS5kcmF3VHlwZX19fX0pLHIuYmluZEJ1ZmZlcihwZSxudWxsKSx0fWZ1bmN0aW9uIHJhKHIsZSl7cmV0dXJuIGU9PT1rc3x8ZT09PUxzPzE6ZT09PSRzfHxlPT09R3M/MjplPT09enN8fGU9PT1Ic3x8ZT09PXduPzQ6MH1jb25zdCBhcj1bInBvc2l0aW9uIiwicG9zaXRpb25zIiwiYV9wb3NpdGlvbiJdO2Z1bmN0aW9uIG5hKHIsZSl7bGV0IHQsbjtmb3Iobj0wO248YXIubGVuZ3RoJiYodD1hcltuXSwhKHQgaW4gZXx8KHQ9Um4uYXR0cmliUHJlZml4K3QsdCBpbiBlKSkpOysrbik7bj09PWFyLmxlbmd0aCYmKHQ9T2JqZWN0LmtleXMoZSlbMF0pO2NvbnN0IGk9ZVt0XTtpZighaS5idWZmZXIpcmV0dXJuIDE7ci5iaW5kQnVmZmVyKHBlLGkuYnVmZmVyKTtjb25zdCBvPXIuZ2V0QnVmZmVyUGFyYW1ldGVyKHBlLFVzKTtyLmJpbmRCdWZmZXIocGUsbnVsbCk7Y29uc3Qgcz1yYShyLGkudHlwZSksYT1vL3MsdT1pLm51bUNvbXBvbmVudHN8fGkuc2l6ZSxmPWEvdTtpZihmJTEhPT0wKXRocm93IG5ldyBFcnJvcihgbnVtQ29tcG9uZW50cyAke3V9IG5vdCBjb3JyZWN0IGZvciBsZW5ndGggJHtsZW5ndGh9YCk7cmV0dXJuIGZ9ZnVuY3Rpb24gaWEocixlLHQpe2NvbnN0IG49dGEocixlKSxpPU9iamVjdC5hc3NpZ24oe30sdHx8e30pO2kuYXR0cmlicz1PYmplY3QuYXNzaWduKHt9LHQ/dC5hdHRyaWJzOnt9LG4pO2NvbnN0IG89ZS5pbmRpY2VzO2lmKG8pe2NvbnN0IHM9Rm4obywiaW5kaWNlcyIpO2kuaW5kaWNlcz1TbihyLHMsQnMpLGkubnVtRWxlbWVudHM9cy5sZW5ndGgsaS5lbGVtZW50VHlwZT1pcihzKX1lbHNlIGkubnVtRWxlbWVudHN8fChpLm51bUVsZW1lbnRzPW5hKHIsaS5hdHRyaWJzKSk7cmV0dXJuIGl9ZnVuY3Rpb24gQmUocil7cmV0dXJuISFyLnRleFN0b3JhZ2UyRH1jb25zdCBQbj1mdW5jdGlvbigpe2NvbnN0IHI9e30sZT17fTtmdW5jdGlvbiB0KG4pe2NvbnN0IGk9bi5jb25zdHJ1Y3Rvci5uYW1lO2lmKCFyW2ldKXtmb3IoY29uc3QgbyBpbiBuKWlmKHR5cGVvZiBuW29dPT0ibnVtYmVyIil7Y29uc3Qgcz1lW25bb11dO2VbbltvXV09cz9gJHtzfSB8ICR7b31gOm99cltpXT0hMH19cmV0dXJuIGZ1bmN0aW9uKGksbyl7cmV0dXJuIHQoaSksZVtvXXx8KHR5cGVvZiBvPT0ibnVtYmVyIj9gMHgke28udG9TdHJpbmcoMTYpfWA6byl9fSgpLGFlPXt0ZXh0dXJlQ29sb3I6bmV3IFVpbnQ4QXJyYXkoWzEyOCwxOTIsMjU1LDI1NV0pLHRleHR1cmVPcHRpb25zOnt9LGNyb3NzT3JpZ2luOnZvaWQgMH0sVWU9YXQsRG49ZnVuY3Rpb24oKXtsZXQgcjtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gcj1yfHwodHlwZW9mIGRvY3VtZW50PCJ1IiYmZG9jdW1lbnQuY3JlYXRlRWxlbWVudD9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpOm51bGwpLHJ9fSgpLE1uPTY0MDYsWj02NDA3LEY9NjQwOCxDbj02NDA5LE9uPTY0MTAsa2U9NjQwMixObj0zNDA0MSxjdD0zMzA3MSxvYT05NzI4LHNhPTk3MjksdWU9MzU1MyxjZT0zNDA2Nyx5ZT0zMjg3OSxfZT0zNTg2Nix1cj0zNDA2OSxhYT0zNDA3MCx1YT0zNDA3MSxjYT0zNDA3MixmYT0zNDA3MyxsYT0zNDA3NCxjcj0xMDI0MSxmcj0xMDI0MCxmdD0xMDI0MixsdD0xMDI0MyxCbj0zMjg4MixkYT0zMzA4MixtYT0zMzA4MyxoYT0zMzA4NCxwYT0zMzA4NSxscj0zMzE3LFVuPTMzMTQsa249MzI4NzgsTG49MzMxNiwkbj0zMzE1LEduPTMyODc3LHlhPTM3NDQzLF9hPTM3NDQxLHhhPTM3NDQwLGJhPTMzMzIxLGdhPTM2NzU2LHZhPTMzMzI1LEVhPTMzMzI2LFRhPTMzMzMwLEFhPTMzMzI5LHdhPTMzMzM4LFJhPTMzMzM3LFNhPTMzMzQwLElhPTMzMzM5LEZhPTMzMzIzLFBhPTM2NzU3LERhPTMzMzI3LE1hPTMzMzI4LENhPTMzMzM2LE9hPTMzMzM1LE5hPTMzMzMyLEJhPTMzMzMxLFVhPTMzMzM0LGthPTMzMzMzLExhPTMyODQ5LCRhPTM1OTA1LEdhPTM2MTk0LHphPTM2NzU4LEhhPTM1ODk4LFZhPTM1OTAxLFdhPTM0ODQzLGphPTM0ODM3LHFhPTM2MjIxLFhhPTM2MjM5LFlhPTM2MjE1LEthPTM2MjMzLEphPTM2MjA5LFFhPTM2MjI3LFphPTMyODU2LGV1PTM1OTA3LHR1PTM2NzU5LHJ1PTMyODU1LG51PTMyODU0LGl1PTMyODU3LG91PTM0ODQyLHN1PTM0ODM2LGF1PTM2MjIwLHV1PTM2MjM4LGN1PTM2OTc1LGZ1PTM2MjE0LGx1PTM2MjMyLGR1PTM2MjI2LG11PTM2MjA4LGh1PTMzMTg5LHB1PTMzMTkwLHl1PTM2MDEyLF91PTM2MDEzLHh1PTM1MDU2LGZlPTUxMjAsST01MTIxLGR0PTUxMjIsU2U9NTEyMyxtdD01MTI0LHhlPTUxMjUsVT01MTI2LHpuPTMyODE5LEhuPTMyODIwLFZuPTMzNjM1LGo9NTEzMSxMZT0zNjE5Myxkcj0zMzY0MCxidT0zNTg5OSxndT0zNTkwMix2dT0zNjI2OSxFdT0zNDA0MixodD0zMzMxOSxJZT0zMzMyMCxwdD02NDAzLEZlPTM2MjQ0LFBlPTM2MjQ4LGJlPTM2MjQ5O2xldCBtcjtmdW5jdGlvbiB5dChyKXtpZighbXIpe2NvbnN0IGU9e307ZVtNbl09e3RleHR1cmVGb3JtYXQ6TW4sY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMSwyLDIsNF0sdHlwZTpbSSxqLExlLFVdfSxlW0NuXT17dGV4dHVyZUZvcm1hdDpDbixjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsxLDIsMiw0XSx0eXBlOltJLGosTGUsVV19LGVbT25dPXt0ZXh0dXJlRm9ybWF0Ok9uLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzIsNCw0LDhdLHR5cGU6W0ksaixMZSxVXX0sZVtaXT17dGV4dHVyZUZvcm1hdDpaLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzMsNiw2LDEyLDJdLHR5cGU6W0ksaixMZSxVLFZuXX0sZVtGXT17dGV4dHVyZUZvcm1hdDpGLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzQsOCw4LDE2LDIsMl0sdHlwZTpbSSxqLExlLFUsem4sSG5dfSxlW2tlXT17dGV4dHVyZUZvcm1hdDprZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50OlsyLDRdLHR5cGU6W3hlLFNlXX0sZVtiYV09e3RleHR1cmVGb3JtYXQ6cHQsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMV0sdHlwZTpbSV19LGVbZ2FdPXt0ZXh0dXJlRm9ybWF0OnB0LGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzFdLHR5cGU6W2ZlXX0sZVt2YV09e3RleHR1cmVGb3JtYXQ6cHQsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbNCwyXSx0eXBlOltVLGpdfSxlW0VhXT17dGV4dHVyZUZvcm1hdDpwdCxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols0XSx0eXBlOltVXX0sZVtUYV09e3RleHR1cmVGb3JtYXQ6RmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMV0sdHlwZTpbSV19LGVbQWFdPXt0ZXh0dXJlRm9ybWF0OkZlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzFdLHR5cGU6W2ZlXX0sZVtOYV09e3RleHR1cmVGb3JtYXQ6RmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMl0sdHlwZTpbU2VdfSxlW0JhXT17dGV4dHVyZUZvcm1hdDpGZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50OlsyXSx0eXBlOltkdF19LGVbVWFdPXt0ZXh0dXJlRm9ybWF0OkZlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W3hlXX0sZVtrYV09e3RleHR1cmVGb3JtYXQ6RmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbbXRdfSxlW0ZhXT17dGV4dHVyZUZvcm1hdDpodCxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsyXSx0eXBlOltJXX0sZVtQYV09e3RleHR1cmVGb3JtYXQ6aHQsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMl0sdHlwZTpbZmVdfSxlW0RhXT17dGV4dHVyZUZvcm1hdDpodCxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50Ols4LDRdLHR5cGU6W1Usal19LGVbTWFdPXt0ZXh0dXJlRm9ybWF0Omh0LGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzhdLHR5cGU6W1VdfSxlW0NhXT17dGV4dHVyZUZvcm1hdDpJZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50OlsyXSx0eXBlOltJXX0sZVtPYV09e3RleHR1cmVGb3JtYXQ6SWUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMl0sdHlwZTpbZmVdfSxlW3dhXT17dGV4dHVyZUZvcm1hdDpJZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols0XSx0eXBlOltTZV19LGVbUmFdPXt0ZXh0dXJlRm9ybWF0OkllLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W2R0XX0sZVtTYV09e3RleHR1cmVGb3JtYXQ6SWUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbOF0sdHlwZTpbeGVdfSxlW0lhXT17dGV4dHVyZUZvcm1hdDpJZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols4XSx0eXBlOlttdF19LGVbTGFdPXt0ZXh0dXJlRm9ybWF0OlosY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbM10sdHlwZTpbSV19LGVbJGFdPXt0ZXh0dXJlRm9ybWF0OlosY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbM10sdHlwZTpbSV19LGVbR2FdPXt0ZXh0dXJlRm9ybWF0OlosY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMywyXSx0eXBlOltJLFZuXX0sZVt6YV09e3RleHR1cmVGb3JtYXQ6Wixjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlszXSx0eXBlOltmZV19LGVbSGFdPXt0ZXh0dXJlRm9ybWF0OlosY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbMTIsNiw0XSx0eXBlOltVLGosYnVdfSxlW1ZhXT17dGV4dHVyZUZvcm1hdDpaLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzEyLDYsNF0sdHlwZTpbVSxqLGd1XX0sZVtXYV09e3RleHR1cmVGb3JtYXQ6Wixjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsxMiw2XSx0eXBlOltVLGpdfSxlW2phXT17dGV4dHVyZUZvcm1hdDpaLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzEyXSx0eXBlOltVXX0sZVtxYV09e3RleHR1cmVGb3JtYXQ6UGUsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbM10sdHlwZTpbSV19LGVbWGFdPXt0ZXh0dXJlRm9ybWF0OlBlLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzNdLHR5cGU6W2ZlXX0sZVtZYV09e3RleHR1cmVGb3JtYXQ6UGUsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNl0sdHlwZTpbU2VdfSxlW0thXT17dGV4dHVyZUZvcm1hdDpQZSxjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols2XSx0eXBlOltkdF19LGVbSmFdPXt0ZXh0dXJlRm9ybWF0OlBlLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzEyXSx0eXBlOlt4ZV19LGVbUWFdPXt0ZXh0dXJlRm9ybWF0OlBlLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzEyXSx0eXBlOlttdF19LGVbWmFdPXt0ZXh0dXJlRm9ybWF0OkYsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbSV19LGVbZXVdPXt0ZXh0dXJlRm9ybWF0OkYsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbSV19LGVbdHVdPXt0ZXh0dXJlRm9ybWF0OkYsY29sb3JSZW5kZXJhYmxlOiExLHRleHR1cmVGaWx0ZXJhYmxlOiEwLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbZmVdfSxlW3J1XT17dGV4dHVyZUZvcm1hdDpGLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzQsMiw0XSx0eXBlOltJLEhuLGRyXX0sZVtudV09e3RleHR1cmVGb3JtYXQ6Rixjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50Ols0LDJdLHR5cGU6W0ksem5dfSxlW2l1XT17dGV4dHVyZUZvcm1hdDpGLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMCxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W2RyXX0sZVtvdV09e3RleHR1cmVGb3JtYXQ6Rixjb2xvclJlbmRlcmFibGU6ITEsdGV4dHVyZUZpbHRlcmFibGU6ITAsYnl0ZXNQZXJFbGVtZW50OlsxNiw4XSx0eXBlOltVLGpdfSxlW3N1XT17dGV4dHVyZUZvcm1hdDpGLGNvbG9yUmVuZGVyYWJsZTohMSx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzE2XSx0eXBlOltVXX0sZVthdV09e3RleHR1cmVGb3JtYXQ6YmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbSV19LGVbdXVdPXt0ZXh0dXJlRm9ybWF0OmJlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W2ZlXX0sZVtjdV09e3RleHR1cmVGb3JtYXQ6YmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbZHJdfSxlW2Z1XT17dGV4dHVyZUZvcm1hdDpiZSxjb2xvclJlbmRlcmFibGU6ITAsdGV4dHVyZUZpbHRlcmFibGU6ITEsYnl0ZXNQZXJFbGVtZW50Ols4XSx0eXBlOltTZV19LGVbbHVdPXt0ZXh0dXJlRm9ybWF0OmJlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzhdLHR5cGU6W2R0XX0sZVtkdV09e3RleHR1cmVGb3JtYXQ6YmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMTZdLHR5cGU6W210XX0sZVttdV09e3RleHR1cmVGb3JtYXQ6YmUsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMTZdLHR5cGU6W3hlXX0sZVtodV09e3RleHR1cmVGb3JtYXQ6a2UsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbMiw0XSx0eXBlOltTZSx4ZV19LGVbcHVdPXt0ZXh0dXJlRm9ybWF0OmtlLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W3hlXX0sZVt5dV09e3RleHR1cmVGb3JtYXQ6a2UsY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbVV19LGVbeHVdPXt0ZXh0dXJlRm9ybWF0Ok5uLGNvbG9yUmVuZGVyYWJsZTohMCx0ZXh0dXJlRmlsdGVyYWJsZTohMSxieXRlc1BlckVsZW1lbnQ6WzRdLHR5cGU6W0V1XX0sZVtfdV09e3RleHR1cmVGb3JtYXQ6Tm4sY29sb3JSZW5kZXJhYmxlOiEwLHRleHR1cmVGaWx0ZXJhYmxlOiExLGJ5dGVzUGVyRWxlbWVudDpbNF0sdHlwZTpbdnVdfSxPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2NvbnN0IG49ZVt0XTtuLmJ5dGVzUGVyRWxlbWVudE1hcD17fSxuLmJ5dGVzUGVyRWxlbWVudC5mb3JFYWNoKGZ1bmN0aW9uKGksbyl7Y29uc3Qgcz1uLnR5cGVbb107bi5ieXRlc1BlckVsZW1lbnRNYXBbc109aX0pfSksbXI9ZX1yZXR1cm4gbXJbcl19ZnVuY3Rpb24gVHUocixlKXtjb25zdCB0PXl0KHIpO2lmKCF0KXRocm93InVua25vd24gaW50ZXJuYWwgZm9ybWF0Ijtjb25zdCBuPXQuYnl0ZXNQZXJFbGVtZW50TWFwW2VdO2lmKG49PT12b2lkIDApdGhyb3cidW5rbm93biBpbnRlcm5hbCBmb3JtYXQiO3JldHVybiBufWZ1bmN0aW9uICRlKHIpe2NvbnN0IGU9eXQocik7aWYoIWUpdGhyb3cidW5rbm93biBpbnRlcm5hbCBmb3JtYXQiO3JldHVybntmb3JtYXQ6ZS50ZXh0dXJlRm9ybWF0LHR5cGU6ZS50eXBlWzBdfX1mdW5jdGlvbiBXbihyKXtyZXR1cm4ociZyLTEpPT09MH1mdW5jdGlvbiBBdShyLGUsdCxuKXtpZighQmUocikpcmV0dXJuIFduKGUpJiZXbih0KTtjb25zdCBpPXl0KG4pO2lmKCFpKXRocm93InVua25vd24gaW50ZXJuYWwgZm9ybWF0IjtyZXR1cm4gaS5jb2xvclJlbmRlcmFibGUmJmkudGV4dHVyZUZpbHRlcmFibGV9ZnVuY3Rpb24gd3Uocil7Y29uc3QgZT15dChyKTtpZighZSl0aHJvdyJ1bmtub3duIGludGVybmFsIGZvcm1hdCI7cmV0dXJuIGUudGV4dHVyZUZpbHRlcmFibGV9ZnVuY3Rpb24gUnUocixlLHQpe3JldHVybiBVZShlKT9pcihlKTp0fHxJfWZ1bmN0aW9uIF90KHIsZSx0LG4saSl7aWYoaSUxIT09MCl0aHJvdyJjYW4ndCBndWVzcyBkaW1lbnNpb25zIjtpZighdCYmIW4pe2NvbnN0IG89TWF0aC5zcXJ0KGkvKGU9PT1jZT82OjEpKTtvJTE9PT0wPyh0PW8sbj1vKToodD1pLG49MSl9ZWxzZSBpZihuKXtpZighdCYmKHQ9aS9uLHQlMSkpdGhyb3ciY2FuJ3QgZ3Vlc3MgZGltZW5zaW9ucyJ9ZWxzZSBpZihuPWkvdCxuJTEpdGhyb3ciY2FuJ3QgZ3Vlc3MgZGltZW5zaW9ucyI7cmV0dXJue3dpZHRoOnQsaGVpZ2h0Om59fWZ1bmN0aW9uIERlKHIsZSl7ZS5jb2xvcnNwYWNlQ29udmVyc2lvbiE9PXZvaWQgMCYmci5waXhlbFN0b3JlaSh5YSxlLmNvbG9yc3BhY2VDb252ZXJzaW9uKSxlLnByZW11bHRpcGx5QWxwaGEhPT12b2lkIDAmJnIucGl4ZWxTdG9yZWkoX2EsZS5wcmVtdWx0aXBseUFscGhhKSxlLmZsaXBZIT09dm9pZCAwJiZyLnBpeGVsU3RvcmVpKHhhLGUuZmxpcFkpfWZ1bmN0aW9uIGpuKHIpe3IucGl4ZWxTdG9yZWkobHIsNCksQmUocikmJihyLnBpeGVsU3RvcmVpKFVuLDApLHIucGl4ZWxTdG9yZWkoa24sMCksci5waXhlbFN0b3JlaShMbiwwKSxyLnBpeGVsU3RvcmVpKCRuLDApLHIucGl4ZWxTdG9yZWkoR24sMCkpfWZ1bmN0aW9uIFN1KHIsZSx0LG4pe24ubWluTWFnJiYodC5jYWxsKHIsZSxjcixuLm1pbk1hZyksdC5jYWxsKHIsZSxmcixuLm1pbk1hZykpLG4ubWluJiZ0LmNhbGwocixlLGNyLG4ubWluKSxuLm1hZyYmdC5jYWxsKHIsZSxmcixuLm1hZyksbi53cmFwJiYodC5jYWxsKHIsZSxmdCxuLndyYXApLHQuY2FsbChyLGUsbHQsbi53cmFwKSwoZT09PXllfHxOcyhyLGUpKSYmdC5jYWxsKHIsZSxCbixuLndyYXApKSxuLndyYXBSJiZ0LmNhbGwocixlLEJuLG4ud3JhcFIpLG4ud3JhcFMmJnQuY2FsbChyLGUsZnQsbi53cmFwUyksbi53cmFwVCYmdC5jYWxsKHIsZSxsdCxuLndyYXBUKSxuLm1pbkxvZCYmdC5jYWxsKHIsZSxkYSxuLm1pbkxvZCksbi5tYXhMb2QmJnQuY2FsbChyLGUsbWEsbi5tYXhMb2QpLG4uYmFzZUxldmVsJiZ0LmNhbGwocixlLGhhLG4uYmFzZUxldmVsKSxuLm1heExldmVsJiZ0LmNhbGwocixlLHBhLG4ubWF4TGV2ZWwpfWZ1bmN0aW9uIHFuKHIsZSx0KXtjb25zdCBuPXQudGFyZ2V0fHx1ZTtyLmJpbmRUZXh0dXJlKG4sZSksU3UocixuLHIudGV4UGFyYW1ldGVyaSx0KX1mdW5jdGlvbiBJdShyKXtyZXR1cm4gcj1yfHxhZS50ZXh0dXJlQ29sb3IsVWUocik/cjpuZXcgVWludDhBcnJheShbclswXSoyNTUsclsxXSoyNTUsclsyXSoyNTUsclszXSoyNTVdKX1mdW5jdGlvbiBocihyLGUsdCxuLGksbyl7dD10fHxhZS50ZXh0dXJlT3B0aW9ucyxvPW98fEY7Y29uc3Qgcz10LnRhcmdldHx8dWU7aWYobj1ufHx0LndpZHRoLGk9aXx8dC5oZWlnaHQsci5iaW5kVGV4dHVyZShzLGUpLEF1KHIsbixpLG8pKXIuZ2VuZXJhdGVNaXBtYXAocyk7ZWxzZXtjb25zdCBhPXd1KG8pP3NhOm9hO3IudGV4UGFyYW1ldGVyaShzLGNyLGEpLHIudGV4UGFyYW1ldGVyaShzLGZyLGEpLHIudGV4UGFyYW1ldGVyaShzLGZ0LGN0KSxyLnRleFBhcmFtZXRlcmkocyxsdCxjdCl9fWZ1bmN0aW9uIEdlKHIpe3JldHVybiByLmF1dG89PT0hMHx8ci5hdXRvPT09dm9pZCAwJiZyLmxldmVsPT09dm9pZCAwfWZ1bmN0aW9uIHByKHIsZSl7cmV0dXJuIGU9ZXx8e30sZS5jdWJlRmFjZU9yZGVyfHxbdXIsYWEsdWEsY2EsZmEsbGFdfWZ1bmN0aW9uIHlyKHIsZSl7Y29uc3Qgbj1wcihyLGUpLm1hcChmdW5jdGlvbihpLG8pe3JldHVybntmYWNlOmksbmR4Om99fSk7cmV0dXJuIG4uc29ydChmdW5jdGlvbihpLG8pe3JldHVybiBpLmZhY2Utby5mYWNlfSksbn1mdW5jdGlvbiBYbihyLGUsdCxuKXtuPW58fGFlLnRleHR1cmVPcHRpb25zO2NvbnN0IGk9bi50YXJnZXR8fHVlLG89bi5sZXZlbHx8MDtsZXQgcz10LndpZHRoLGE9dC5oZWlnaHQ7Y29uc3QgdT1uLmludGVybmFsRm9ybWF0fHxuLmZvcm1hdHx8RixmPSRlKHUpLGM9bi5mb3JtYXR8fGYuZm9ybWF0LGQ9bi50eXBlfHxmLnR5cGU7aWYoRGUocixuKSxyLmJpbmRUZXh0dXJlKGksZSksaT09PWNlKXtjb25zdCBwPXQud2lkdGgsXz10LmhlaWdodDtsZXQgbSx4O2lmKHAvNj09PV8pbT1fLHg9WzAsMCwxLDAsMiwwLDMsMCw0LDAsNSwwXTtlbHNlIGlmKF8vNj09PXApbT1wLHg9WzAsMCwwLDEsMCwyLDAsMywwLDQsMCw1XTtlbHNlIGlmKHAvMz09PV8vMiltPXAvMyx4PVswLDAsMSwwLDIsMCwwLDEsMSwxLDIsMV07ZWxzZSBpZihwLzI9PT1fLzMpbT1wLzIseD1bMCwwLDEsMCwwLDEsMSwxLDAsMiwxLDJdO2Vsc2UgdGhyb3ciY2FuJ3QgZmlndXJlIG91dCBjdWJlIG1hcCBmcm9tIGVsZW1lbnQ6ICIrKHQuc3JjP3Quc3JjOnQubm9kZU5hbWUpO2NvbnN0IHY9RG4oKTt2Pyh2LmNhbnZhcy53aWR0aD1tLHYuY2FudmFzLmhlaWdodD1tLHM9bSxhPW0seXIocixuKS5mb3JFYWNoKGZ1bmN0aW9uKGcpe2NvbnN0IEE9eFtnLm5keCoyKzBdKm0sUD14W2cubmR4KjIrMV0qbTt2LmRyYXdJbWFnZSh0LEEsUCxtLG0sMCwwLG0sbSksci50ZXhJbWFnZTJEKGcuZmFjZSxvLHUsYyxkLHYuY2FudmFzKX0pLHYuY2FudmFzLndpZHRoPTEsdi5jYW52YXMuaGVpZ2h0PTEpOnR5cGVvZiBjcmVhdGVJbWFnZUJpdG1hcDwidSImJihzPW0sYT1tLHlyKHIsbikuZm9yRWFjaChmdW5jdGlvbihnKXtjb25zdCBBPXhbZy5uZHgqMiswXSptLFA9eFtnLm5keCoyKzFdKm07ci50ZXhJbWFnZTJEKGcuZmFjZSxvLHUsbSxtLDAsYyxkLG51bGwpLGNyZWF0ZUltYWdlQml0bWFwKHQsQSxQLG0sbSx7cHJlbXVsdGlwbHlBbHBoYToibm9uZSIsY29sb3JTcGFjZUNvbnZlcnNpb246Im5vbmUifSkudGhlbihmdW5jdGlvbihDKXtEZShyLG4pLHIuYmluZFRleHR1cmUoaSxlKSxyLnRleEltYWdlMkQoZy5mYWNlLG8sdSxjLGQsQyksR2UobikmJmhyKHIsZSxuLHMsYSx1KX0pfSkpfWVsc2UgaWYoaT09PXllfHxpPT09X2Upe2NvbnN0IHA9TWF0aC5taW4odC53aWR0aCx0LmhlaWdodCksXz1NYXRoLm1heCh0LndpZHRoLHQuaGVpZ2h0KSxtPV8vcDtpZihtJTEhPT0wKXRocm93ImNhbiBub3QgY29tcHV0ZSAzRCBkaW1lbnNpb25zIG9mIGVsZW1lbnQiO2NvbnN0IHg9dC53aWR0aD09PV8/MTowLHY9dC5oZWlnaHQ9PT1fPzE6MDtyLnBpeGVsU3RvcmVpKGxyLDEpLHIucGl4ZWxTdG9yZWkoVW4sdC53aWR0aCksci5waXhlbFN0b3JlaShrbiwwKSxyLnBpeGVsU3RvcmVpKEduLDApLHIudGV4SW1hZ2UzRChpLG8sdSxwLHAscCwwLGMsZCxudWxsKTtmb3IobGV0IGc9MDtnPG07KytnKXtjb25zdCBBPWcqcCp4LFA9ZypwKnY7ci5waXhlbFN0b3JlaShMbixBKSxyLnBpeGVsU3RvcmVpKCRuLFApLHIudGV4U3ViSW1hZ2UzRChpLG8sMCwwLGcscCxwLDEsYyxkLHQpfWpuKHIpfWVsc2Ugci50ZXhJbWFnZTJEKGksbyx1LGMsZCx0KTtHZShuKSYmaHIocixlLG4scyxhLHUpLHFuKHIsZSxuKX1mdW5jdGlvbiB6ZSgpe31mdW5jdGlvbiBGdShyKXtpZih0eXBlb2YgZG9jdW1lbnQ8InUiKXtjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtyZXR1cm4gZS5ocmVmPXIsZS5ob3N0bmFtZT09PWxvY2F0aW9uLmhvc3RuYW1lJiZlLnBvcnQ9PT1sb2NhdGlvbi5wb3J0JiZlLnByb3RvY29sPT09bG9jYXRpb24ucHJvdG9jb2x9ZWxzZXtjb25zdCBlPW5ldyBVUkwobG9jYXRpb24uaHJlZikub3JpZ2luO3JldHVybiBuZXcgVVJMKHIsbG9jYXRpb24uaHJlZikub3JpZ2luPT09ZX19ZnVuY3Rpb24gUHUocixlKXtyZXR1cm4gZT09PXZvaWQgMCYmIUZ1KHIpPyJhbm9ueW1vdXMiOmV9ZnVuY3Rpb24gRHUocixlLHQpe3Q9dHx8emU7bGV0IG47aWYoZT1lIT09dm9pZCAwP2U6YWUuY3Jvc3NPcmlnaW4sZT1QdShyLGUpLHR5cGVvZiBJbWFnZTwidSIpe249bmV3IEltYWdlLGUhPT12b2lkIDAmJihuLmNyb3NzT3JpZ2luPWUpO2NvbnN0IGk9ZnVuY3Rpb24oKXtuLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIixvKSxuLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLHMpLG49bnVsbH0sbz1mdW5jdGlvbigpe2NvbnN0IHU9ImNvdWxkbid0IGxvYWQgaW1hZ2U6ICIrcjtFbih1KSx0KHUsbiksaSgpfSxzPWZ1bmN0aW9uKCl7dChudWxsLG4pLGkoKX07cmV0dXJuIG4uYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLG8pLG4uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIscyksbi5zcmM9cixufWVsc2UgaWYodHlwZW9mIEltYWdlQml0bWFwPCJ1Iil7bGV0IGksbztjb25zdCBzPWZ1bmN0aW9uKCl7dChpLG8pfSxhPXt9O2UmJihhLm1vZGU9ImNvcnMiKSxmZXRjaChyLGEpLnRoZW4oZnVuY3Rpb24odSl7aWYoIXUub2spdGhyb3cgdTtyZXR1cm4gdS5ibG9iKCl9KS50aGVuKGZ1bmN0aW9uKHUpe3JldHVybiBjcmVhdGVJbWFnZUJpdG1hcCh1LHtwcmVtdWx0aXBseUFscGhhOiJub25lIixjb2xvclNwYWNlQ29udmVyc2lvbjoibm9uZSJ9KX0pLnRoZW4oZnVuY3Rpb24odSl7bz11LHNldFRpbWVvdXQocyl9KS5jYXRjaChmdW5jdGlvbih1KXtpPXUsc2V0VGltZW91dChzKX0pLG49bnVsbH1yZXR1cm4gbn1mdW5jdGlvbiBZbihyKXtyZXR1cm4gdHlwZW9mIEltYWdlQml0bWFwPCJ1IiYmciBpbnN0YW5jZW9mIEltYWdlQml0bWFwfHx0eXBlb2YgSW1hZ2VEYXRhPCJ1IiYmciBpbnN0YW5jZW9mIEltYWdlRGF0YXx8dHlwZW9mIEhUTUxFbGVtZW50PCJ1IiYmciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50fWZ1bmN0aW9uIF9yKHIsZSx0KXtyZXR1cm4gWW4ocik/KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KG51bGwscil9KSxyKTpEdShyLGUsdCl9ZnVuY3Rpb24geHIocixlLHQpe3Q9dHx8YWUudGV4dHVyZU9wdGlvbnM7Y29uc3Qgbj10LnRhcmdldHx8dWU7aWYoci5iaW5kVGV4dHVyZShuLGUpLHQuY29sb3I9PT0hMSlyZXR1cm47Y29uc3QgaT1JdSh0LmNvbG9yKTtpZihuPT09Y2UpZm9yKGxldCBvPTA7bzw2OysrbylyLnRleEltYWdlMkQodXIrbywwLEYsMSwxLDAsRixJLGkpO2Vsc2Ugbj09PXllfHxuPT09X2U/ci50ZXhJbWFnZTNEKG4sMCxGLDEsMSwxLDAsRixJLGkpOnIudGV4SW1hZ2UyRChuLDAsRiwxLDEsMCxGLEksaSl9ZnVuY3Rpb24gTXUocixlLHQsbil7cmV0dXJuIG49bnx8emUsdD10fHxhZS50ZXh0dXJlT3B0aW9ucyx4cihyLGUsdCksdD1PYmplY3QuYXNzaWduKHt9LHQpLF9yKHQuc3JjLHQuY3Jvc3NPcmlnaW4sZnVuY3Rpb24obyxzKXtvP24obyxlLHMpOihYbihyLGUscyx0KSxuKG51bGwsZSxzKSl9KX1mdW5jdGlvbiBDdShyLGUsdCxuKXtuPW58fHplO2NvbnN0IGk9dC5zcmM7aWYoaS5sZW5ndGghPT02KXRocm93InRoZXJlIG11c3QgYmUgNiB1cmxzIGZvciBhIGN1YmVtYXAiO2NvbnN0IG89dC5sZXZlbHx8MCxzPXQuaW50ZXJuYWxGb3JtYXR8fHQuZm9ybWF0fHxGLGE9JGUocyksdT10LmZvcm1hdHx8YS5mb3JtYXQsZj10LnR5cGV8fEksYz10LnRhcmdldHx8dWU7aWYoYyE9PWNlKXRocm93InRhcmdldCBtdXN0IGJlIFRFWFRVUkVfQ1VCRV9NQVAiO3hyKHIsZSx0KSx0PU9iamVjdC5hc3NpZ24oe30sdCk7bGV0IGQ9Njtjb25zdCBwPVtdLF89cHIocix0KTtsZXQgbTtmdW5jdGlvbiB4KHYpe3JldHVybiBmdW5jdGlvbihnLEEpey0tZCxnP3AucHVzaChnKTpBLndpZHRoIT09QS5oZWlnaHQ/cC5wdXNoKCJjdWJlbWFwIGZhY2UgaW1nIGlzIG5vdCBhIHNxdWFyZTogIitBLnNyYyk6KERlKHIsdCksci5iaW5kVGV4dHVyZShjLGUpLGQ9PT01P3ByKCkuZm9yRWFjaChmdW5jdGlvbihQKXtyLnRleEltYWdlMkQoUCxvLHMsdSxmLEEpfSk6ci50ZXhJbWFnZTJEKHYsbyxzLHUsZixBKSxHZSh0KSYmci5nZW5lcmF0ZU1pcG1hcChjKSksZD09PTAmJm4ocC5sZW5ndGg/cDp2b2lkIDAsZSxtKX19bT1pLm1hcChmdW5jdGlvbih2LGcpe3JldHVybiBfcih2LHQuY3Jvc3NPcmlnaW4seChfW2ddKSl9KX1mdW5jdGlvbiBPdShyLGUsdCxuKXtuPW58fHplO2NvbnN0IGk9dC5zcmMsbz10LmludGVybmFsRm9ybWF0fHx0LmZvcm1hdHx8RixzPSRlKG8pLGE9dC5mb3JtYXR8fHMuZm9ybWF0LHU9dC50eXBlfHxJLGY9dC50YXJnZXR8fF9lO2lmKGYhPT15ZSYmZiE9PV9lKXRocm93InRhcmdldCBtdXN0IGJlIFRFWFRVUkVfM0Qgb3IgVEVYVFVSRV8yRF9BUlJBWSI7eHIocixlLHQpLHQ9T2JqZWN0LmFzc2lnbih7fSx0KTtsZXQgYz1pLmxlbmd0aDtjb25zdCBkPVtdO2xldCBwO2NvbnN0IF89dC5sZXZlbHx8MDtsZXQgbT10LndpZHRoLHg9dC5oZWlnaHQ7Y29uc3Qgdj1pLmxlbmd0aDtsZXQgZz0hMDtmdW5jdGlvbiBBKFApe3JldHVybiBmdW5jdGlvbihDLFcpe2lmKC0tYyxDKWQucHVzaChDKTtlbHNle2lmKERlKHIsdCksci5iaW5kVGV4dHVyZShmLGUpLGcpe2c9ITEsbT10LndpZHRofHxXLndpZHRoLHg9dC5oZWlnaHR8fFcuaGVpZ2h0LHIudGV4SW1hZ2UzRChmLF8sbyxtLHgsdiwwLGEsdSxudWxsKTtmb3IobGV0IGllPTA7aWU8djsrK2llKXIudGV4U3ViSW1hZ2UzRChmLF8sMCwwLGllLG0seCwxLGEsdSxXKX1lbHNle2xldCBpZT1XLFg7KFcud2lkdGghPT1tfHxXLmhlaWdodCE9PXgpJiYoWD1EbigpLGllPVguY2FudmFzLFguY2FudmFzLndpZHRoPW0sWC5jYW52YXMuaGVpZ2h0PXgsWC5kcmF3SW1hZ2UoVywwLDAsbSx4KSksci50ZXhTdWJJbWFnZTNEKGYsXywwLDAsUCxtLHgsMSxhLHUsaWUpLFgmJmllPT09WC5jYW52YXMmJihYLmNhbnZhcy53aWR0aD0wLFguY2FudmFzLmhlaWdodD0wKX1HZSh0KSYmci5nZW5lcmF0ZU1pcG1hcChmKX1jPT09MCYmbihkLmxlbmd0aD9kOnZvaWQgMCxlLHApfX1wPWkubWFwKGZ1bmN0aW9uKFAsQyl7cmV0dXJuIF9yKFAsdC5jcm9zc09yaWdpbixBKEMpKX0pfWZ1bmN0aW9uIE51KHIsZSx0LG4pe249bnx8YWUudGV4dHVyZU9wdGlvbnM7Y29uc3QgaT1uLnRhcmdldHx8dWU7ci5iaW5kVGV4dHVyZShpLGUpO2xldCBvPW4ud2lkdGgscz1uLmhlaWdodCxhPW4uZGVwdGg7Y29uc3QgdT1uLmxldmVsfHwwLGY9bi5pbnRlcm5hbEZvcm1hdHx8bi5mb3JtYXR8fEYsYz0kZShmKSxkPW4uZm9ybWF0fHxjLmZvcm1hdCxwPW4udHlwZXx8UnUocix0LGMudHlwZSk7aWYoVWUodCkpdCBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5JiYodD1uZXcgVWludDhBcnJheSh0LmJ1ZmZlcikpO2Vsc2V7Y29uc3Qgdj12bihwKTt0PW5ldyB2KHQpfWNvbnN0IF89VHUoZixwKSxtPXQuYnl0ZUxlbmd0aC9fO2lmKG0lMSl0aHJvdyJsZW5ndGggd3Jvbmcgc2l6ZSBmb3IgZm9ybWF0OiAiK1BuKHIsZCk7bGV0IHg7aWYoaT09PXllfHxpPT09X2UpaWYoIW8mJiFzJiYhYSl7Y29uc3Qgdj1NYXRoLmNicnQobSk7aWYodiUxIT09MCl0aHJvdyJjYW4ndCBndWVzcyBjdWJlIHNpemUgb2YgYXJyYXkgb2YgbnVtRWxlbWVudHM6ICIrbTtvPXYscz12LGE9dn1lbHNlIG8mJighc3x8IWEpPyh4PV90KHIsaSxzLGEsbS9vKSxzPXgud2lkdGgsYT14LmhlaWdodCk6cyYmKCFvfHwhYSk/KHg9X3QocixpLG8sYSxtL3MpLG89eC53aWR0aCxhPXguaGVpZ2h0KTooeD1fdChyLGksbyxzLG0vYSksbz14LndpZHRoLHM9eC5oZWlnaHQpO2Vsc2UgeD1fdChyLGksbyxzLG0pLG89eC53aWR0aCxzPXguaGVpZ2h0O2lmKGpuKHIpLHIucGl4ZWxTdG9yZWkobHIsbi51bnBhY2tBbGlnbm1lbnR8fDEpLERlKHIsbiksaT09PWNlKXtjb25zdCB2PV8vdC5CWVRFU19QRVJfRUxFTUVOVCxnPW0vNip2O3lyKHIsbikuZm9yRWFjaChBPT57Y29uc3QgUD1nKkEubmR4LEM9dC5zdWJhcnJheShQLFArZyk7ci50ZXhJbWFnZTJEKEEuZmFjZSx1LGYsbyxzLDAsZCxwLEMpfSl9ZWxzZSBpPT09eWV8fGk9PT1fZT9yLnRleEltYWdlM0QoaSx1LGYsbyxzLGEsMCxkLHAsdCk6ci50ZXhJbWFnZTJEKGksdSxmLG8scywwLGQscCx0KTtyZXR1cm57d2lkdGg6byxoZWlnaHQ6cyxkZXB0aDphLHR5cGU6cH19ZnVuY3Rpb24gQnUocixlLHQpe2NvbnN0IG49dC50YXJnZXR8fHVlO3IuYmluZFRleHR1cmUobixlKTtjb25zdCBpPXQubGV2ZWx8fDAsbz10LmludGVybmFsRm9ybWF0fHx0LmZvcm1hdHx8RixzPSRlKG8pLGE9dC5mb3JtYXR8fHMuZm9ybWF0LHU9dC50eXBlfHxzLnR5cGU7aWYoRGUocix0KSxuPT09Y2UpZm9yKGxldCBmPTA7Zjw2OysrZilyLnRleEltYWdlMkQodXIrZixpLG8sdC53aWR0aCx0LmhlaWdodCwwLGEsdSxudWxsKTtlbHNlIG49PT15ZXx8bj09PV9lP3IudGV4SW1hZ2UzRChuLGksbyx0LndpZHRoLHQuaGVpZ2h0LHQuZGVwdGgsMCxhLHUsbnVsbCk6ci50ZXhJbWFnZTJEKG4saSxvLHQud2lkdGgsdC5oZWlnaHQsMCxhLHUsbnVsbCl9ZnVuY3Rpb24gS24ocixlLHQpe3Q9dHx8emUsZT1lfHxhZS50ZXh0dXJlT3B0aW9ucztjb25zdCBuPXIuY3JlYXRlVGV4dHVyZSgpLGk9ZS50YXJnZXR8fHVlO2xldCBvPWUud2lkdGh8fDEscz1lLmhlaWdodHx8MTtjb25zdCBhPWUuaW50ZXJuYWxGb3JtYXR8fEY7ci5iaW5kVGV4dHVyZShpLG4pLGk9PT1jZSYmKHIudGV4UGFyYW1ldGVyaShpLGZ0LGN0KSxyLnRleFBhcmFtZXRlcmkoaSxsdCxjdCkpO2xldCB1PWUuc3JjO2lmKHUpaWYodHlwZW9mIHU9PSJmdW5jdGlvbiImJih1PXUocixlKSksdHlwZW9mIHU9PSJzdHJpbmciKU11KHIsbixlLHQpO2Vsc2UgaWYoVWUodSl8fEFycmF5LmlzQXJyYXkodSkmJih0eXBlb2YgdVswXT09Im51bWJlciJ8fEFycmF5LmlzQXJyYXkodVswXSl8fFVlKHVbMF0pKSl7Y29uc3QgZj1OdShyLG4sdSxlKTtvPWYud2lkdGgscz1mLmhlaWdodH1lbHNlIEFycmF5LmlzQXJyYXkodSkmJih0eXBlb2YgdVswXT09InN0cmluZyJ8fFluKHVbMF0pKT9pPT09Y2U/Q3UocixuLGUsdCk6T3UocixuLGUsdCk6KFhuKHIsbix1LGUpLG89dS53aWR0aCxzPXUuaGVpZ2h0KTtlbHNlIEJ1KHIsbixlKTtyZXR1cm4gR2UoZSkmJmhyKHIsbixlLG8scyxhKSxxbihyLG4sZSksbn1jb25zdCBicj1FbjtmdW5jdGlvbiBKbihyKXtyZXR1cm4gdHlwZW9mIGRvY3VtZW50PCJ1IiYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocik6bnVsbH1jb25zdCB4dD0zMzk4NCxidD0zNDk2MixVdT0zNDk2MyxrdT0zNTcxMyxMdT0zNTcxNCwkdT0zNTYzMixHdT0zNTYzMyx6dT0zNTk4MSxRbj0zNTcxOCxIdT0zNTcyMSxWdT0zNTk3MSxXdT0zNTM4MixqdT0zNTM5NixxdT0zNTM5OCxYdT0zNTM5MixZdT0zNTM5NSxndD01MTI2LFpuPTM1NjY0LGVpPTM1NjY1LHRpPTM1NjY2LGdyPTUxMjQscmk9MzU2Njcsbmk9MzU2NjgsaWk9MzU2Njksb2k9MzU2NzAsc2k9MzU2NzEsYWk9MzU2NzIsdWk9MzU2NzMsY2k9MzU2NzQsZmk9MzU2NzUsbGk9MzU2NzYsS3U9MzU2NzgsSnU9MzU2ODAsUXU9MzU2NzksWnU9MzU2ODIsZWM9MzU2ODUsdGM9MzU2ODYscmM9MzU2ODcsbmM9MzU2ODgsaWM9MzU2ODksb2M9MzU2OTAsc2M9MzYyODksYWM9MzYyOTIsdWM9MzYyOTMsdnI9NTEyNSxkaT0zNjI5NCxtaT0zNjI5NSxoaT0zNjI5NixjYz0zNjI5OCxmYz0zNjI5OSxsYz0zNjMwMCxkYz0zNjMwMyxtYz0zNjMwNixoYz0zNjMwNyxwYz0zNjMwOCx5Yz0zNjMxMSx2dD0zNTUzLEV0PTM0MDY3LEVyPTMyODc5LFR0PTM1ODY2LEU9e307ZnVuY3Rpb24gcGkocixlKXtyZXR1cm4gRVtlXS5iaW5kUG9pbnR9ZnVuY3Rpb24gX2MocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtMWYoZSx0KX19ZnVuY3Rpb24geGMocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtMWZ2KGUsdCl9fWZ1bmN0aW9uIGJjKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybTJmdihlLHQpfX1mdW5jdGlvbiBnYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm0zZnYoZSx0KX19ZnVuY3Rpb24gdmMocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtNGZ2KGUsdCl9fWZ1bmN0aW9uIHlpKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybTFpKGUsdCl9fWZ1bmN0aW9uIF9pKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybTFpdihlLHQpfX1mdW5jdGlvbiB4aShyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm0yaXYoZSx0KX19ZnVuY3Rpb24gYmkocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtM2l2KGUsdCl9fWZ1bmN0aW9uIGdpKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybTRpdihlLHQpfX1mdW5jdGlvbiBFYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm0xdWkoZSx0KX19ZnVuY3Rpb24gVGMocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtMXVpdihlLHQpfX1mdW5jdGlvbiBBYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm0ydWl2KGUsdCl9fWZ1bmN0aW9uIHdjKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybTN1aXYoZSx0KX19ZnVuY3Rpb24gUmMocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtNHVpdihlLHQpfX1mdW5jdGlvbiBTYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXgyZnYoZSwhMSx0KX19ZnVuY3Rpb24gSWMocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7ci51bmlmb3JtTWF0cml4M2Z2KGUsITEsdCl9fWZ1bmN0aW9uIEZjKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3IudW5pZm9ybU1hdHJpeDRmdihlLCExLHQpfX1mdW5jdGlvbiBQYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXgyeDNmdihlLCExLHQpfX1mdW5jdGlvbiBEYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXgzeDJmdihlLCExLHQpfX1mdW5jdGlvbiBNYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXgyeDRmdihlLCExLHQpfX1mdW5jdGlvbiBDYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXg0eDJmdihlLCExLHQpfX1mdW5jdGlvbiBPYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXgzeDRmdihlLCExLHQpfX1mdW5jdGlvbiBOYyhyLGUpe3JldHVybiBmdW5jdGlvbih0KXtyLnVuaWZvcm1NYXRyaXg0eDNmdihlLCExLHQpfX1mdW5jdGlvbiBMKHIsZSx0LG4pe2NvbnN0IGk9cGkocixlKTtyZXR1cm4gQmUocik/ZnVuY3Rpb24obyl7bGV0IHMsYTtvcihyLG8pPyhzPW8sYT1udWxsKToocz1vLnRleHR1cmUsYT1vLnNhbXBsZXIpLHIudW5pZm9ybTFpKG4sdCksci5hY3RpdmVUZXh0dXJlKHh0K3QpLHIuYmluZFRleHR1cmUoaSxzKSxyLmJpbmRTYW1wbGVyKHQsYSl9OmZ1bmN0aW9uKG8pe3IudW5pZm9ybTFpKG4sdCksci5hY3RpdmVUZXh0dXJlKHh0K3QpLHIuYmluZFRleHR1cmUoaSxvKX19ZnVuY3Rpb24gJChyLGUsdCxuLGkpe2NvbnN0IG89cGkocixlKSxzPW5ldyBJbnQzMkFycmF5KGkpO2ZvcihsZXQgYT0wO2E8aTsrK2Epc1thXT10K2E7cmV0dXJuIEJlKHIpP2Z1bmN0aW9uKGEpe3IudW5pZm9ybTFpdihuLHMpLGEuZm9yRWFjaChmdW5jdGlvbih1LGYpe3IuYWN0aXZlVGV4dHVyZSh4dCtzW2ZdKTtsZXQgYyxkO29yKHIsdSk/KGM9dSxkPW51bGwpOihjPXUudGV4dHVyZSxkPXUuc2FtcGxlciksci5iaW5kU2FtcGxlcih0LGQpLHIuYmluZFRleHR1cmUobyxjKX0pfTpmdW5jdGlvbihhKXtyLnVuaWZvcm0xaXYobixzKSxhLmZvckVhY2goZnVuY3Rpb24odSxmKXtyLmFjdGl2ZVRleHR1cmUoeHQrc1tmXSksci5iaW5kVGV4dHVyZShvLHUpfSl9fUVbZ3RdPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjQsc2V0dGVyOl9jLGFycmF5U2V0dGVyOnhjfSxFW1puXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTo4LHNldHRlcjpiYyxjb2xzOjJ9LEVbZWldPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjEyLHNldHRlcjpnYyxjb2xzOjN9LEVbdGldPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjE2LHNldHRlcjp2Yyxjb2xzOjR9LEVbZ3JdPXtUeXBlOkludDMyQXJyYXksc2l6ZTo0LHNldHRlcjp5aSxhcnJheVNldHRlcjpfaX0sRVtyaV09e1R5cGU6SW50MzJBcnJheSxzaXplOjgsc2V0dGVyOnhpLGNvbHM6Mn0sRVtuaV09e1R5cGU6SW50MzJBcnJheSxzaXplOjEyLHNldHRlcjpiaSxjb2xzOjN9LEVbaWldPXtUeXBlOkludDMyQXJyYXksc2l6ZToxNixzZXR0ZXI6Z2ksY29sczo0fSxFW3ZyXT17VHlwZTpVaW50MzJBcnJheSxzaXplOjQsc2V0dGVyOkVjLGFycmF5U2V0dGVyOlRjfSxFW2RpXT17VHlwZTpVaW50MzJBcnJheSxzaXplOjgsc2V0dGVyOkFjLGNvbHM6Mn0sRVttaV09e1R5cGU6VWludDMyQXJyYXksc2l6ZToxMixzZXR0ZXI6d2MsY29sczozfSxFW2hpXT17VHlwZTpVaW50MzJBcnJheSxzaXplOjE2LHNldHRlcjpSYyxjb2xzOjR9LEVbb2ldPXtUeXBlOlVpbnQzMkFycmF5LHNpemU6NCxzZXR0ZXI6eWksYXJyYXlTZXR0ZXI6X2l9LEVbc2ldPXtUeXBlOlVpbnQzMkFycmF5LHNpemU6OCxzZXR0ZXI6eGksY29sczoyfSxFW2FpXT17VHlwZTpVaW50MzJBcnJheSxzaXplOjEyLHNldHRlcjpiaSxjb2xzOjN9LEVbdWldPXtUeXBlOlVpbnQzMkFycmF5LHNpemU6MTYsc2V0dGVyOmdpLGNvbHM6NH0sRVtjaV09e1R5cGU6RmxvYXQzMkFycmF5LHNpemU6MzIsc2V0dGVyOlNjLHJvd3M6Mixjb2xzOjJ9LEVbZmldPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjQ4LHNldHRlcjpJYyxyb3dzOjMsY29sczozfSxFW2xpXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTo2NCxzZXR0ZXI6RmMscm93czo0LGNvbHM6NH0sRVtlY109e1R5cGU6RmxvYXQzMkFycmF5LHNpemU6MzIsc2V0dGVyOlBjLHJvd3M6Mixjb2xzOjN9LEVbdGNdPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjMyLHNldHRlcjpNYyxyb3dzOjIsY29sczo0fSxFW3JjXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTo0OCxzZXR0ZXI6RGMscm93czozLGNvbHM6Mn0sRVtuY109e1R5cGU6RmxvYXQzMkFycmF5LHNpemU6NDgsc2V0dGVyOk9jLHJvd3M6Myxjb2xzOjR9LEVbaWNdPXtUeXBlOkZsb2F0MzJBcnJheSxzaXplOjY0LHNldHRlcjpDYyxyb3dzOjQsY29sczoyfSxFW29jXT17VHlwZTpGbG9hdDMyQXJyYXksc2l6ZTo2NCxzZXR0ZXI6TmMscm93czo0LGNvbHM6M30sRVtLdV09e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkwsYXJyYXlTZXR0ZXI6JCxiaW5kUG9pbnQ6dnR9LEVbSnVdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpMLGFycmF5U2V0dGVyOiQsYmluZFBvaW50OkV0fSxFW1F1XT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6TCxhcnJheVNldHRlcjokLGJpbmRQb2ludDpFcn0sRVtadV09e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkwsYXJyYXlTZXR0ZXI6JCxiaW5kUG9pbnQ6dnR9LEVbc2NdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpMLGFycmF5U2V0dGVyOiQsYmluZFBvaW50OlR0fSxFW2FjXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6TCxhcnJheVNldHRlcjokLGJpbmRQb2ludDpUdH0sRVt1Y109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkwsYXJyYXlTZXR0ZXI6JCxiaW5kUG9pbnQ6RXR9LEVbY2NdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpMLGFycmF5U2V0dGVyOiQsYmluZFBvaW50OnZ0fSxFW2ZjXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6TCxhcnJheVNldHRlcjokLGJpbmRQb2ludDpFcn0sRVtsY109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkwsYXJyYXlTZXR0ZXI6JCxiaW5kUG9pbnQ6RXR9LEVbZGNdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpMLGFycmF5U2V0dGVyOiQsYmluZFBvaW50OlR0fSxFW21jXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6TCxhcnJheVNldHRlcjokLGJpbmRQb2ludDp2dH0sRVtoY109e1R5cGU6bnVsbCxzaXplOjAsc2V0dGVyOkwsYXJyYXlTZXR0ZXI6JCxiaW5kUG9pbnQ6RXJ9LEVbcGNdPXtUeXBlOm51bGwsc2l6ZTowLHNldHRlcjpMLGFycmF5U2V0dGVyOiQsYmluZFBvaW50OkV0fSxFW3ljXT17VHlwZTpudWxsLHNpemU6MCxzZXR0ZXI6TCxhcnJheVNldHRlcjokLGJpbmRQb2ludDpUdH07ZnVuY3Rpb24gQXQocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7aWYodC52YWx1ZSlzd2l0Y2goci5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoZSksdC52YWx1ZS5sZW5ndGgpe2Nhc2UgNDpyLnZlcnRleEF0dHJpYjRmdihlLHQudmFsdWUpO2JyZWFrO2Nhc2UgMzpyLnZlcnRleEF0dHJpYjNmdihlLHQudmFsdWUpO2JyZWFrO2Nhc2UgMjpyLnZlcnRleEF0dHJpYjJmdihlLHQudmFsdWUpO2JyZWFrO2Nhc2UgMTpyLnZlcnRleEF0dHJpYjFmdihlLHQudmFsdWUpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJ0aGUgbGVuZ3RoIG9mIGEgZmxvYXQgY29uc3RhbnQgdmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDQhIil9ZWxzZSByLmJpbmRCdWZmZXIoYnQsdC5idWZmZXIpLHIuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoZSksci52ZXJ0ZXhBdHRyaWJQb2ludGVyKGUsdC5udW1Db21wb25lbnRzfHx0LnNpemUsdC50eXBlfHxndCx0Lm5vcm1hbGl6ZXx8ITEsdC5zdHJpZGV8fDAsdC5vZmZzZXR8fDApLHIudmVydGV4QXR0cmliRGl2aXNvciYmci52ZXJ0ZXhBdHRyaWJEaXZpc29yKGUsdC5kaXZpc29yfHwwKX19ZnVuY3Rpb24gbGUocixlKXtyZXR1cm4gZnVuY3Rpb24odCl7aWYodC52YWx1ZSlpZihyLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShlKSx0LnZhbHVlLmxlbmd0aD09PTQpci52ZXJ0ZXhBdHRyaWI0aXYoZSx0LnZhbHVlKTtlbHNlIHRocm93IG5ldyBFcnJvcigiVGhlIGxlbmd0aCBvZiBhbiBpbnRlZ2VyIGNvbnN0YW50IHZhbHVlIG11c3QgYmUgNCEiKTtlbHNlIHIuYmluZEJ1ZmZlcihidCx0LmJ1ZmZlciksci5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShlKSxyLnZlcnRleEF0dHJpYklQb2ludGVyKGUsdC5udW1Db21wb25lbnRzfHx0LnNpemUsdC50eXBlfHxncix0LnN0cmlkZXx8MCx0Lm9mZnNldHx8MCksci52ZXJ0ZXhBdHRyaWJEaXZpc29yJiZyLnZlcnRleEF0dHJpYkRpdmlzb3IoZSx0LmRpdmlzb3J8fDApfX1mdW5jdGlvbiB3dChyLGUpe3JldHVybiBmdW5jdGlvbih0KXtpZih0LnZhbHVlKWlmKHIuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGUpLHQudmFsdWUubGVuZ3RoPT09NClyLnZlcnRleEF0dHJpYjR1aXYoZSx0LnZhbHVlKTtlbHNlIHRocm93IG5ldyBFcnJvcigiVGhlIGxlbmd0aCBvZiBhbiB1bnNpZ25lZCBpbnRlZ2VyIGNvbnN0YW50IHZhbHVlIG11c3QgYmUgNCEiKTtlbHNlIHIuYmluZEJ1ZmZlcihidCx0LmJ1ZmZlciksci5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShlKSxyLnZlcnRleEF0dHJpYklQb2ludGVyKGUsdC5udW1Db21wb25lbnRzfHx0LnNpemUsdC50eXBlfHx2cix0LnN0cmlkZXx8MCx0Lm9mZnNldHx8MCksci52ZXJ0ZXhBdHRyaWJEaXZpc29yJiZyLnZlcnRleEF0dHJpYkRpdmlzb3IoZSx0LmRpdmlzb3J8fDApfX1mdW5jdGlvbiBUcihyLGUsdCl7Y29uc3Qgbj10LnNpemUsaT10LmNvdW50O3JldHVybiBmdW5jdGlvbihvKXtyLmJpbmRCdWZmZXIoYnQsby5idWZmZXIpO2NvbnN0IHM9by5zaXplfHxvLm51bUNvbXBvbmVudHN8fG4sYT1zL2ksdT1vLnR5cGV8fGd0LGM9RVt1XS5zaXplKnMsZD1vLm5vcm1hbGl6ZXx8ITEscD1vLm9mZnNldHx8MCxfPWMvaTtmb3IobGV0IG09MDttPGk7KyttKXIuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoZSttKSxyLnZlcnRleEF0dHJpYlBvaW50ZXIoZSttLGEsdSxkLGMscCtfKm0pLHIudmVydGV4QXR0cmliRGl2aXNvciYmci52ZXJ0ZXhBdHRyaWJEaXZpc29yKGUrbSxvLmRpdmlzb3J8fDApfX1jb25zdCBEPXt9O0RbZ3RdPXtzaXplOjQsc2V0dGVyOkF0fSxEW1puXT17c2l6ZTo4LHNldHRlcjpBdH0sRFtlaV09e3NpemU6MTIsc2V0dGVyOkF0fSxEW3RpXT17c2l6ZToxNixzZXR0ZXI6QXR9LERbZ3JdPXtzaXplOjQsc2V0dGVyOmxlfSxEW3JpXT17c2l6ZTo4LHNldHRlcjpsZX0sRFtuaV09e3NpemU6MTIsc2V0dGVyOmxlfSxEW2lpXT17c2l6ZToxNixzZXR0ZXI6bGV9LERbdnJdPXtzaXplOjQsc2V0dGVyOnd0fSxEW2RpXT17c2l6ZTo4LHNldHRlcjp3dH0sRFttaV09e3NpemU6MTIsc2V0dGVyOnd0fSxEW2hpXT17c2l6ZToxNixzZXR0ZXI6d3R9LERbb2ldPXtzaXplOjQsc2V0dGVyOmxlfSxEW3NpXT17c2l6ZTo4LHNldHRlcjpsZX0sRFthaV09e3NpemU6MTIsc2V0dGVyOmxlfSxEW3VpXT17c2l6ZToxNixzZXR0ZXI6bGV9LERbY2ldPXtzaXplOjQsc2V0dGVyOlRyLGNvdW50OjJ9LERbZmldPXtzaXplOjksc2V0dGVyOlRyLGNvdW50OjN9LERbbGldPXtzaXplOjE2LHNldHRlcjpUcixjb3VudDo0fTtjb25zdCBCYz0vRVJST1I6XHMqXGQrOihcZCspL2dpO2Z1bmN0aW9uIFVjKHIsZT0iIix0PTApe2NvbnN0IG49Wy4uLmUubWF0Y2hBbGwoQmMpXSxpPW5ldyBNYXAobi5tYXAoKG8scyk9Pntjb25zdCBhPXBhcnNlSW50KG9bMV0pLHU9bltzKzFdLGY9dT91LmluZGV4OmUubGVuZ3RoLGM9ZS5zdWJzdHJpbmcoby5pbmRleCxmKTtyZXR1cm5bYS0xLGNdfSkpO3JldHVybiByLnNwbGl0KGAKYCkubWFwKChvLHMpPT57Y29uc3QgYT1pLmdldChzKTtyZXR1cm5gJHtzKzErdH06ICR7b30ke2E/YAoKXl5eICR7YX1gOiIifWB9KS5qb2luKGAKYCl9Y29uc3Qgdmk9L15bIFx0XSpcbi87ZnVuY3Rpb24gRWkocil7bGV0IGU9MDtyZXR1cm4gdmkudGVzdChyKSYmKGU9MSxyPXIucmVwbGFjZSh2aSwiIikpLHtsaW5lT2Zmc2V0OmUsc2hhZGVyU291cmNlOnJ9fWZ1bmN0aW9uIGtjKHIsZSl7cmV0dXJuIHIuZXJyb3JDYWxsYmFjayhlKSxyLmNhbGxiYWNrJiZzZXRUaW1lb3V0KCgpPT57ci5jYWxsYmFjayhgJHtlfQoke3IuZXJyb3JzLmpvaW4oYApgKX1gKX0pLG51bGx9ZnVuY3Rpb24gTGMocixlLHQsbil7aWYobj1ufHxiciwhci5nZXRTaGFkZXJQYXJhbWV0ZXIodCxrdSkpe2NvbnN0IG89ci5nZXRTaGFkZXJJbmZvTG9nKHQpLHtsaW5lT2Zmc2V0OnMsc2hhZGVyU291cmNlOmF9PUVpKHIuZ2V0U2hhZGVyU291cmNlKHQpKSx1PWAke1VjKGEsbyxzKX0KRXJyb3IgY29tcGlsaW5nICR7UG4ocixlKX06ICR7b31gO3JldHVybiBuKHUpLHV9cmV0dXJuIiJ9ZnVuY3Rpb24gQXIocixlLHQpe2xldCBuLGksbztpZih0eXBlb2YgZT09ImZ1bmN0aW9uIiYmKHQ9ZSxlPXZvaWQgMCksdHlwZW9mIHI9PSJmdW5jdGlvbiIpdD1yLHI9dm9pZCAwO2Vsc2UgaWYociYmIUFycmF5LmlzQXJyYXkocikpe2NvbnN0IGY9cjt0PWYuZXJyb3JDYWxsYmFjayxyPWYuYXR0cmliTG9jYXRpb25zLG49Zi50cmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmdzLGk9Zi50cmFuc2Zvcm1GZWVkYmFja01vZGUsbz1mLmNhbGxiYWNrfWNvbnN0IHM9dHx8YnIsYT1bXSx1PXtlcnJvckNhbGxiYWNrKGYsLi4uYyl7YS5wdXNoKGYpLHMoZiwuLi5jKX0sdHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5nczpuLHRyYW5zZm9ybUZlZWRiYWNrTW9kZTppLGNhbGxiYWNrOm8sZXJyb3JzOmF9O3tsZXQgZj17fTtBcnJheS5pc0FycmF5KHIpP3IuZm9yRWFjaChmdW5jdGlvbihjLGQpe2ZbY109ZT9lW2RdOmR9KTpmPXJ8fHt9LHUuYXR0cmliTG9jYXRpb25zPWZ9cmV0dXJuIHV9Y29uc3QgJGM9WyJWRVJURVhfU0hBREVSIiwiRlJBR01FTlRfU0hBREVSIl07ZnVuY3Rpb24gR2MocixlKXtpZihlLmluZGV4T2YoImZyYWciKT49MClyZXR1cm4gJHU7aWYoZS5pbmRleE9mKCJ2ZXJ0Iik+PTApcmV0dXJuIEd1fWZ1bmN0aW9uIHpjKHIsZSx0KXtjb25zdCBuPXIuZ2V0QXR0YWNoZWRTaGFkZXJzKGUpO2Zvcihjb25zdCBpIG9mIG4pdC5oYXMoaSkmJnIuZGVsZXRlU2hhZGVyKGkpO3IuZGVsZXRlUHJvZ3JhbShlKX1jb25zdCBIYz0ocj0wKT0+bmV3IFByb21pc2UoZT0+c2V0VGltZW91dChlLHIpKTtmdW5jdGlvbiBWYyhyLGUsdCl7Y29uc3Qgbj1yLmNyZWF0ZVByb2dyYW0oKSx7YXR0cmliTG9jYXRpb25zOmksdHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5nczpvLHRyYW5zZm9ybUZlZWRiYWNrTW9kZTpzfT1Bcih0KTtmb3IobGV0IGE9MDthPGUubGVuZ3RoOysrYSl7bGV0IHU9ZVthXTtpZih0eXBlb2YgdT09InN0cmluZyIpe2NvbnN0IGY9Sm4odSksYz1mP2YudGV4dDp1O2xldCBkPXJbJGNbYV1dO2YmJmYudHlwZSYmKGQ9R2MocixmLnR5cGUpfHxkKSx1PXIuY3JlYXRlU2hhZGVyKGQpLHIuc2hhZGVyU291cmNlKHUsRWkoYykuc2hhZGVyU291cmNlKSxyLmNvbXBpbGVTaGFkZXIodSksci5hdHRhY2hTaGFkZXIobix1KX19T2JqZWN0LmVudHJpZXMoaSkuZm9yRWFjaCgoW2EsdV0pPT5yLmJpbmRBdHRyaWJMb2NhdGlvbihuLHUsYSkpO3tsZXQgYT1vO2EmJihhLmF0dHJpYnMmJihhPWEuYXR0cmlicyksQXJyYXkuaXNBcnJheShhKXx8KGE9T2JqZWN0LmtleXMoYSkpLHIudHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5ncyhuLGEsc3x8enUpKX1yZXR1cm4gci5saW5rUHJvZ3JhbShuKSxufWZ1bmN0aW9uIFdjKHIsZSx0LG4saSl7Y29uc3Qgbz1Bcih0LG4saSkscz1uZXcgU2V0KGUpLGE9VmMocixlLG8pO2Z1bmN0aW9uIHUoZixjKXtjb25zdCBkPXFjKGYsYyxvLmVycm9yQ2FsbGJhY2spO3JldHVybiBkJiZ6YyhmLGMscyksZH1pZihvLmNhbGxiYWNrKXtqYyhyLGEpLnRoZW4oKCk9Pntjb25zdCBmPXUocixhKTtvLmNhbGxiYWNrKGYsZj92b2lkIDA6YSl9KTtyZXR1cm59cmV0dXJuIHUocixhKT92b2lkIDA6YX1hc3luYyBmdW5jdGlvbiBqYyhyLGUpe2NvbnN0IHQ9ci5nZXRFeHRlbnNpb24oIktIUl9wYXJhbGxlbF9zaGFkZXJfY29tcGlsZSIpLG49dD8obyxzKT0+by5nZXRQcm9ncmFtUGFyYW1ldGVyKHMsdC5DT01QTEVUSU9OX1NUQVRVU19LSFIpOigpPT4hMDtsZXQgaT0wO2RvIGF3YWl0IEhjKGkpLGk9MWUzLzYwO3doaWxlKCFuKHIsZSkpfWZ1bmN0aW9uIHFjKHIsZSx0KXtpZih0PXR8fGJyLCFyLmdldFByb2dyYW1QYXJhbWV0ZXIoZSxMdSkpe2NvbnN0IGk9ci5nZXRQcm9ncmFtSW5mb0xvZyhlKTt0KGBFcnJvciBpbiBwcm9ncmFtIGxpbmtpbmc6ICR7aX1gKTtjb25zdCBzPXIuZ2V0QXR0YWNoZWRTaGFkZXJzKGUpLm1hcChhPT5MYyhyLHIuZ2V0U2hhZGVyUGFyYW1ldGVyKGEsci5TSEFERVJfVFlQRSksYSx0KSk7cmV0dXJuYCR7aX0KJHtzLmZpbHRlcihhPT5hKS5qb2luKGAKYCl9YH19ZnVuY3Rpb24gWGMocixlLHQsbixpKXtyZXR1cm4gV2MocixlLHQsbixpKX1mdW5jdGlvbiBUaShyKXtjb25zdCBlPXIubmFtZTtyZXR1cm4gZS5zdGFydHNXaXRoKCJnbF8iKXx8ZS5zdGFydHNXaXRoKCJ3ZWJnbF8iKX1jb25zdCBZYz0vKFwufFxbfF18XHcrKS9nLEtjPXI9PnI+PSIwIiYmcjw9IjkiO2Z1bmN0aW9uIEpjKHIsZSx0LG4pe2NvbnN0IGk9ci5zcGxpdChZYykuZmlsdGVyKGE9PmEhPT0iIik7bGV0IG89MCxzPSIiO2Zvcig7Oyl7Y29uc3QgYT1pW28rK107cys9YTtjb25zdCB1PUtjKGFbMF0pLGY9dT9wYXJzZUludChhKTphO2lmKHUmJihzKz1pW28rK10pLG89PT1pLmxlbmd0aCl7dFtmXT1lO2JyZWFrfWVsc2V7Y29uc3QgZD1pW28rK10scD1kPT09IlsiLF89dFtmXXx8KHA/W106e30pO3RbZl09Xyx0PV8sbltzXT1uW3NdfHxmdW5jdGlvbihtKXtyZXR1cm4gZnVuY3Rpb24oeCl7QWkobSx4KX19KF8pLHMrPWR9fX1mdW5jdGlvbiBRYyhyLGUpe2xldCB0PTA7ZnVuY3Rpb24gbihhLHUsZil7Y29uc3QgYz11Lm5hbWUuZW5kc1dpdGgoIlswXSIpLGQ9dS50eXBlLHA9RVtkXTtpZighcCl0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gdHlwZTogMHgke2QudG9TdHJpbmcoMTYpfWApO2xldCBfO2lmKHAuYmluZFBvaW50KXtjb25zdCBtPXQ7dCs9dS5zaXplLGM/Xz1wLmFycmF5U2V0dGVyKHIsZCxtLGYsdS5zaXplKTpfPXAuc2V0dGVyKHIsZCxtLGYsdS5zaXplKX1lbHNlIHAuYXJyYXlTZXR0ZXImJmM/Xz1wLmFycmF5U2V0dGVyKHIsZik6Xz1wLnNldHRlcihyLGYpO3JldHVybiBfLmxvY2F0aW9uPWYsX31jb25zdCBpPXt9LG89e30scz1yLmdldFByb2dyYW1QYXJhbWV0ZXIoZSxRbik7Zm9yKGxldCBhPTA7YTxzOysrYSl7Y29uc3QgdT1yLmdldEFjdGl2ZVVuaWZvcm0oZSxhKTtpZihUaSh1KSljb250aW51ZTtsZXQgZj11Lm5hbWU7Zi5lbmRzV2l0aCgiWzBdIikmJihmPWYuc3Vic3RyKDAsZi5sZW5ndGgtMykpO2NvbnN0IGM9ci5nZXRVbmlmb3JtTG9jYXRpb24oZSx1Lm5hbWUpO2lmKGMpe2NvbnN0IGQ9bihlLHUsYyk7aVtmXT1kLEpjKGYsZCxvLGkpfX1yZXR1cm4gaX1mdW5jdGlvbiBaYyhyLGUpe2NvbnN0IHQ9e30sbj1yLmdldFByb2dyYW1QYXJhbWV0ZXIoZSxWdSk7Zm9yKGxldCBpPTA7aTxuOysraSl7Y29uc3Qgbz1yLmdldFRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZyhlLGkpO3Rbby5uYW1lXT17aW5kZXg6aSx0eXBlOm8udHlwZSxzaXplOm8uc2l6ZX19cmV0dXJuIHR9ZnVuY3Rpb24gZWYocixlKXtjb25zdCB0PXIuZ2V0UHJvZ3JhbVBhcmFtZXRlcihlLFFuKSxuPVtdLGk9W107Zm9yKGxldCBhPTA7YTx0OysrYSl7aS5wdXNoKGEpLG4ucHVzaCh7fSk7Y29uc3QgdT1yLmdldEFjdGl2ZVVuaWZvcm0oZSxhKTtuW2FdLm5hbWU9dS5uYW1lfVtbIlVOSUZPUk1fVFlQRSIsInR5cGUiXSxbIlVOSUZPUk1fU0laRSIsInNpemUiXSxbIlVOSUZPUk1fQkxPQ0tfSU5ERVgiLCJibG9ja05keCJdLFsiVU5JRk9STV9PRkZTRVQiLCJvZmZzZXQiXV0uZm9yRWFjaChmdW5jdGlvbihhKXtjb25zdCB1PWFbMF0sZj1hWzFdO3IuZ2V0QWN0aXZlVW5pZm9ybXMoZSxpLHJbdV0pLmZvckVhY2goZnVuY3Rpb24oYyxkKXtuW2RdW2ZdPWN9KX0pO2NvbnN0IG89e30scz1yLmdldFByb2dyYW1QYXJhbWV0ZXIoZSxXdSk7Zm9yKGxldCBhPTA7YTxzOysrYSl7Y29uc3QgdT1yLmdldEFjdGl2ZVVuaWZvcm1CbG9ja05hbWUoZSxhKSxmPXtpbmRleDpyLmdldFVuaWZvcm1CbG9ja0luZGV4KGUsdSksdXNlZEJ5VmVydGV4U2hhZGVyOnIuZ2V0QWN0aXZlVW5pZm9ybUJsb2NrUGFyYW1ldGVyKGUsYSxqdSksdXNlZEJ5RnJhZ21lbnRTaGFkZXI6ci5nZXRBY3RpdmVVbmlmb3JtQmxvY2tQYXJhbWV0ZXIoZSxhLHF1KSxzaXplOnIuZ2V0QWN0aXZlVW5pZm9ybUJsb2NrUGFyYW1ldGVyKGUsYSxYdSksdW5pZm9ybUluZGljZXM6ci5nZXRBY3RpdmVVbmlmb3JtQmxvY2tQYXJhbWV0ZXIoZSxhLFl1KX07Zi51c2VkPWYudXNlZEJ5VmVydGV4U2hhZGVyfHxmLnVzZWRCeUZyYWdtZW50U2hhZGVyLG9bdV09Zn1yZXR1cm57YmxvY2tTcGVjczpvLHVuaWZvcm1EYXRhOm59fWZ1bmN0aW9uIEFpKHIsZSl7Zm9yKGNvbnN0IHQgaW4gZSl7Y29uc3Qgbj1yW3RdO3R5cGVvZiBuPT0iZnVuY3Rpb24iP24oZVt0XSk6QWkoclt0XSxlW3RdKX19ZnVuY3Rpb24gd2kociwuLi5lKXtjb25zdCB0PXIudW5pZm9ybVNldHRlcnN8fHIsbj1lLmxlbmd0aDtmb3IobGV0IGk9MDtpPG47KytpKXtjb25zdCBvPWVbaV07aWYoQXJyYXkuaXNBcnJheShvKSl7Y29uc3Qgcz1vLmxlbmd0aDtmb3IobGV0IGE9MDthPHM7KythKXdpKHQsb1thXSl9ZWxzZSBmb3IoY29uc3QgcyBpbiBvKXtjb25zdCBhPXRbc107YSYmYShvW3NdKX19fWZ1bmN0aW9uIHRmKHIsZSl7Y29uc3QgdD17fSxuPXIuZ2V0UHJvZ3JhbVBhcmFtZXRlcihlLEh1KTtmb3IobGV0IGk9MDtpPG47KytpKXtjb25zdCBvPXIuZ2V0QWN0aXZlQXR0cmliKGUsaSk7aWYoVGkobykpY29udGludWU7Y29uc3Qgcz1yLmdldEF0dHJpYkxvY2F0aW9uKGUsby5uYW1lKSxhPURbby50eXBlXSx1PWEuc2V0dGVyKHIscyxhKTt1LmxvY2F0aW9uPXMsdFtvLm5hbWVdPXV9cmV0dXJuIHR9ZnVuY3Rpb24gcmYocixlKXtmb3IoY29uc3QgdCBpbiBlKXtjb25zdCBuPXJbdF07biYmbihlW3RdKX19ZnVuY3Rpb24gbmYocixlLHQpe3QudmVydGV4QXJyYXlPYmplY3Q/ci5iaW5kVmVydGV4QXJyYXkodC52ZXJ0ZXhBcnJheU9iamVjdCk6KHJmKGUuYXR0cmliU2V0dGVyc3x8ZSx0LmF0dHJpYnMpLHQuaW5kaWNlcyYmci5iaW5kQnVmZmVyKFV1LHQuaW5kaWNlcykpfWZ1bmN0aW9uIFJpKHIsZSl7Y29uc3QgdD1RYyhyLGUpLG49dGYocixlKSxpPXtwcm9ncmFtOmUsdW5pZm9ybVNldHRlcnM6dCxhdHRyaWJTZXR0ZXJzOm59O3JldHVybiBCZShyKSYmKGkudW5pZm9ybUJsb2NrU3BlYz1lZihyLGUpLGkudHJhbnNmb3JtRmVlZGJhY2tJbmZvPVpjKHIsZSkpLGl9Y29uc3Qgb2Y9L1xzfHt8fXw7LztmdW5jdGlvbiBzZihyLGUsdCxuLGkpe2NvbnN0IG89QXIodCxuLGkpLHM9W107aWYoZT1lLm1hcChmdW5jdGlvbihmKXtpZighb2YudGVzdChmKSl7Y29uc3QgYz1KbihmKTtpZihjKWY9Yy50ZXh0O2Vsc2V7Y29uc3QgZD1gbm8gZWxlbWVudCB3aXRoIGlkOiAke2Z9YDtvLmVycm9yQ2FsbGJhY2soZCkscy5wdXNoKGQpfX1yZXR1cm4gZn0pLHMubGVuZ3RoKXJldHVybiBrYyhvLCIiKTtjb25zdCBhPW8uY2FsbGJhY2s7YSYmKG8uY2FsbGJhY2s9KGYsYyk9PnthKGYsZj92b2lkIDA6UmkocixjKSl9KTtjb25zdCB1PVhjKHIsZSxvKTtyZXR1cm4gdT9SaShyLHUpOm51bGx9Y29uc3QgYWY9NCxTaT01MTIzO2Z1bmN0aW9uIHVmKHIsZSx0LG4saSxvKXt0PXQ9PT12b2lkIDA/YWY6dDtjb25zdCBzPWUuaW5kaWNlcyxhPWUuZWxlbWVudFR5cGUsdT1uPT09dm9pZCAwP2UubnVtRWxlbWVudHM6bjtpPWk9PT12b2lkIDA/MDppLGF8fHM/byE9PXZvaWQgMD9yLmRyYXdFbGVtZW50c0luc3RhbmNlZCh0LHUsYT09PXZvaWQgMD9TaTplLmVsZW1lbnRUeXBlLGksbyk6ci5kcmF3RWxlbWVudHModCx1LGE9PT12b2lkIDA/U2k6ZS5lbGVtZW50VHlwZSxpKTpvIT09dm9pZCAwP3IuZHJhd0FycmF5c0luc3RhbmNlZCh0LGksdSxvKTpyLmRyYXdBcnJheXModCxpLHUpfWNvbnN0IElpPTM2MTYwLFJ0PTM2MTYxLGNmPTM1NTMsZmY9NTEyMSxsZj02NDAyLGRmPTY0MDgsbWY9MzMxOTAsaGY9MzYwMTIscGY9MzUwNTYseWY9MzYwMTMsX2Y9MzI4NTQseGY9MzI4NTUsYmY9MzYxOTQsRmk9MzMxODksUGk9NjQwMSxEaT0zNjE2OCx3cj0zNDA0MSxScj0zNjA2NCxTdD0zNjA5NixNaT0zNjEyOCxTcj0zMzMwNixJcj0zMzA3MSxGcj05NzI5LGdmPVt7Zm9ybWF0OmRmLHR5cGU6ZmYsbWluOkZyLHdyYXA6SXJ9LHtmb3JtYXQ6d3J9XSxxPXt9O3Fbd3JdPVNyLHFbUGldPU1pLHFbRGldPU1pLHFbbGZdPVN0LHFbRmldPVN0LHFbbWZdPVN0LHFbaGZdPVN0LHFbcGZdPVNyLHFbeWZdPVNyO2Z1bmN0aW9uIHZmKHIsZSl7cmV0dXJuIHFbcl18fHFbZV19Y29uc3QgZGU9e307ZGVbX2ZdPSEwLGRlW3hmXT0hMCxkZVtiZl09ITAsZGVbd3JdPSEwLGRlW0ZpXT0hMCxkZVtQaV09ITAsZGVbRGldPSEwO2Z1bmN0aW9uIEVmKHIpe3JldHVybiBkZVtyXX1jb25zdCBUZj0zMjtmdW5jdGlvbiBBZihyKXtyZXR1cm4gcj49UnImJnI8UnIrVGZ9ZnVuY3Rpb24gSXQocixlLHQsbil7Y29uc3QgaT1JaSxvPXIuY3JlYXRlRnJhbWVidWZmZXIoKTtyLmJpbmRGcmFtZWJ1ZmZlcihpLG8pLHQ9dHx8ci5kcmF3aW5nQnVmZmVyV2lkdGgsbj1ufHxyLmRyYXdpbmdCdWZmZXJIZWlnaHQsZT1lfHxnZjtjb25zdCBzPVtdLGE9e2ZyYW1lYnVmZmVyOm8sYXR0YWNobWVudHM6W10sd2lkdGg6dCxoZWlnaHQ6bn07cmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbih1LGYpe2xldCBjPXUuYXR0YWNobWVudDtjb25zdCBkPXUuc2FtcGxlcyxwPXUuZm9ybWF0O2xldCBfPXUuYXR0YWNobWVudFBvaW50fHx2ZihwLHUuaW50ZXJuYWxGb3JtYXQpO2lmKF98fChfPVJyK2YpLEFmKF8pJiZzLnB1c2goXyksIWMpaWYoZCE9PXZvaWQgMHx8RWYocCkpYz1yLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLHIuYmluZFJlbmRlcmJ1ZmZlcihSdCxjKSxkPjE/ci5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUoUnQsZCxwLHQsbik6ci5yZW5kZXJidWZmZXJTdG9yYWdlKFJ0LHAsdCxuKTtlbHNle2NvbnN0IG09T2JqZWN0LmFzc2lnbih7fSx1KTttLndpZHRoPXQsbS5oZWlnaHQ9bixtLmF1dG89PT12b2lkIDAmJihtLmF1dG89ITEsbS5taW49bS5taW58fG0ubWluTWFnfHxGcixtLm1hZz1tLm1hZ3x8bS5taW5NYWd8fEZyLG0ud3JhcFM9bS53cmFwU3x8bS53cmFwfHxJcixtLndyYXBUPW0ud3JhcFR8fG0ud3JhcHx8SXIpLGM9S24ocixtKX1pZihPcyhyLGMpKXIuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoaSxfLFJ0LGMpO2Vsc2UgaWYob3IocixjKSl1LmxheWVyIT09dm9pZCAwP3IuZnJhbWVidWZmZXJUZXh0dXJlTGF5ZXIoaSxfLGMsdS5sZXZlbHx8MCx1LmxheWVyKTpyLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGksXyx1LnRhcmdldHx8Y2YsYyx1LmxldmVsfHwwKTtlbHNlIHRocm93IG5ldyBFcnJvcigidW5rbm93biBhdHRhY2htZW50IHR5cGUiKTthLmF0dGFjaG1lbnRzLnB1c2goYyl9KSxyLmRyYXdCdWZmZXJzJiZyLmRyYXdCdWZmZXJzKHMpLGF9ZnVuY3Rpb24gd2YocixlLHQpe3Q9dHx8SWksZT8oci5iaW5kRnJhbWVidWZmZXIodCxlLmZyYW1lYnVmZmVyKSxyLnZpZXdwb3J0KDAsMCxlLndpZHRoLGUuaGVpZ2h0KSk6KHIuYmluZEZyYW1lYnVmZmVyKHQsbnVsbCksci52aWV3cG9ydCgwLDAsci5kcmF3aW5nQnVmZmVyV2lkdGgsci5kcmF3aW5nQnVmZmVySGVpZ2h0KSl9ZnVuY3Rpb24gUyhyLGUpe3JldHVybiBlIGluc3RhbmNlb2YgV2ViR0xUZXh0dXJlP2U6S24ocix7c3JjOmUsd3JhcDpyLkNMQU1QX1RPX0VER0V9KX1jbGFzcyBnZXtjb25zdHJ1Y3RvcihlKXt5KHRoaXMsImNvbnRleHQiKTt5KHRoaXMsIm91dHB1dCIpO3kodGhpcywiZmJpIik7eSh0aGlzLCJvcHRpb25zIik7eSh0aGlzLCJwcm9ncmFtSW5mbyIpO3kodGhpcywiYnVmZmVySW5mbyIpO3kodGhpcywibGFzdFJ1biIpO2NvbnN0e2NvbnRleHQ6dCx3aWR0aDpuLGhlaWdodDppfT1lO3RoaXMuY29udGV4dD10LHRoaXMub3B0aW9ucz1lO2NvbnN0IG89dGhpcy5idWlsZERlZmluZXMoKTt0aGlzLnByb2dyYW1JbmZvPXNmKHRoaXMuY29udGV4dCxbbyt0aGlzLmdldFZlcnRleFNoYWRlcigpLG8rdGhpcy5nZXRGcmFnbWVudFNoYWRlcigpXSksdGhpcy5idWZmZXJJbmZvPWlhKHRoaXMuY29udGV4dCx0aGlzLmdldEJ1ZmZlcnMoKSksdGhpcy5mYmk9SXQodGhpcy5jb250ZXh0LFt7Zm9ybWF0OnRoaXMuY29udGV4dC5SR0JBLHR5cGU6dGhpcy5jb250ZXh0LlVOU0lHTkVEX0JZVEUsbWluOnRoaXMuY29udGV4dC5MSU5FQVIsd3JhcDp0aGlzLmNvbnRleHQuQ0xBTVBfVE9fRURHRX1dLG4saSksdGhpcy5vdXRwdXQ9dGhpcy5mYmkuYXR0YWNobWVudHNbMF19cmVzaXplT3V0cHV0KGUsdCl7dGhpcy5mYmk9SXQodGhpcy5jb250ZXh0LFt7Zm9ybWF0OnRoaXMuY29udGV4dC5SR0JBLHR5cGU6dGhpcy5jb250ZXh0LlVOU0lHTkVEX0JZVEUsbWluOnRoaXMuY29udGV4dC5MSU5FQVIsd3JhcDp0aGlzLmNvbnRleHQuQ0xBTVBfVE9fRURHRX1dLGUsdCksdGhpcy5vcHRpb25zLndpZHRoPWUsdGhpcy5vcHRpb25zLmhlaWdodD10LHRoaXMub3V0cHV0PXRoaXMuZmJpLmF0dGFjaG1lbnRzWzBdfWdldERlZmluZXMoKXtyZXR1cm57fX1nZXRCdWZmZXJzKCl7cmV0dXJue3Bvc2l0aW9uOntudW1Db21wb25lbnRzOjIsZGF0YTpbLTEsLTEsLTEsMSwxLC0xLDEsMSwtMSwxLDEsLTFdfSx0ZXh0dXJlX2Nvb3JkOntudW1Db21wb25lbnRzOjIsZGF0YTpbMCwwLDAsMSwxLDAsMSwxLDAsMSwxLDBdfX19YnVpbGREZWZpbmVzKCl7bGV0IGU9IiI7Y29uc3QgdD10aGlzLmdldERlZmluZXMoKTtmb3IobGV0IG4gaW4gdCllKz1gI2RlZmluZSAke259ICR7dFtuXS50b0ZpeGVkKDEpfQpgO3JldHVybiBlfXJ1bihlKXtjb25zdCB0PURhdGUubm93KCk7bGV0IG49MDt0aGlzLmxhc3RSdW4mJihuPSh0LXRoaXMubGFzdFJ1bikvMWUzKSx0aGlzLmxhc3RSdW49dCx0aGlzLmNvbnRleHQudmlld3BvcnQoMCwwLHRoaXMuY29udGV4dC5jYW52YXMud2lkdGgsdGhpcy5jb250ZXh0LmNhbnZhcy5oZWlnaHQpLHRoaXMuY29udGV4dC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbUluZm8ucHJvZ3JhbSksbmYodGhpcy5jb250ZXh0LHRoaXMucHJvZ3JhbUluZm8sdGhpcy5idWZmZXJJbmZvKSx3aSh0aGlzLnByb2dyYW1JbmZvLHtkZWx0YTpuLGNhbnZhczpbdGhpcy5jb250ZXh0LmNhbnZhcy53aWR0aCx0aGlzLmNvbnRleHQuY2FudmFzLmhlaWdodF0sLi4uZX0pLHdmKHRoaXMuY29udGV4dCx0aGlzLm9wdGlvbnMuZGlzYWJsZUZyYW1lYnVmZmVyP251bGw6dGhpcy5mYmkpLHVmKHRoaXMuY29udGV4dCx0aGlzLmJ1ZmZlckluZm8pfX12YXIgUmY9YHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoKdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKdW5pZm9ybSB2ZWMyIGNhbnZhczsKdW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTsKdW5pZm9ybSBzYW1wbGVyMkQgbWFzazsKCnZlYzQgbG9vcCgpOwoKdm9pZCBtYWluKCkgeyBnbF9GcmFnQ29sb3IgPSBsb29wKCk7IH0KYCxTZj1gdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKYXR0cmlidXRlIHZlYzIgcG9zaXRpb247CmF0dHJpYnV0ZSB2ZWMyIHRleHR1cmVfY29vcmQ7Cgp2b2lkIG1haW4oKSB7CiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLiwgMS4pOwogIF90ZXh0dXJlX2Nvb3JkID0gdGV4dHVyZV9jb29yZDsKfQpgO2NsYXNzIElmIGV4dGVuZHMgZ2V7Z2V0RGVmaW5lcygpe3ZhciBlO3JldHVybntSQURJVVM6KGU9dGhpcy5vcHRpb25zLnJhZGl1cykhPW51bGw/ZToxfX1nZXRGcmFnbWVudFNoYWRlcigpe3JldHVybiBSZit0aGlzLmNyZWF0ZUxvb3BGdW5jdGlvbigpfWdldFZlcnRleFNoYWRlcigpe3JldHVybiBTZn1jcmVhdGVMb29wRnVuY3Rpb24oKXt2YXIgdDtsZXQgZT0odD10aGlzLm9wdGlvbnMucmFkaXVzKSE9bnVsbD90OjE7cmV0dXJuYAoKICAgICAgICB2ZWM0IGxvb3AoKSB7IAogICAgICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMCwwLDAsMCk7CiAgICAgICAgICAgIGZsb2F0IGZhY3RvclN1bSA9IDAuOwoKICAgICAgICAgICAgdmVjMiBub3JtYWxpemVkUmFkaXVzID0gdmVjMigtJHtlfS4pIC8gY2FudmFzOwogICAgICAgICAgICB2ZWMyIG5vcm1hbGl6ZWRJbmNyZW1lbnQgPSB2ZWMyKDEuKSAvIGNhbnZhczsKICAgICAgICAgICAgdmVjMiBkaWZmID0gbm9ybWFsaXplZFJhZGl1czsKICAgICAgICAgICAgZmxvYXQgbWF4TGVuZ3RoID0gbGVuZ3RoKG5vcm1hbGl6ZWRSYWRpdXMpOwoKICAgICAgICAgICAgZm9yKGludCB5PS0ke2V9OyB5PCR7ZSsxfTsgKyt5KSB7CiAgICAgICAgICAgICAgICBmb3IoaW50IHg9LSR7ZX07IHg8JHtlKzF9OyArK3gpIHsKICAgICAgICAgICAgICAgICAgICBmbG9hdCBmYWN0b3IgPSAoMS4tIHRleHR1cmUyRChtYXNrLCBfdGV4dHVyZV9jb29yZCArIGRpZmYpLmEpICogKG1heExlbmd0aCAtIGxlbmd0aChkaWZmKSkgLyBtYXhMZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGZhY3RvciAqIHRleHR1cmUyRCh0ZXh0dXJlLCBfdGV4dHVyZV9jb29yZCArIGRpZmYpOwogICAgICAgICAgICAgICAgICAgIGZhY3RvclN1bSArPSBmYWN0b3I7CiAgICAgICAgICAgICAgICAgICAgZGlmZi54ICs9IG5vcm1hbGl6ZWRJbmNyZW1lbnQueDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRpZmYueSArPSBub3JtYWxpemVkSW5jcmVtZW50Lnk7CiAgICAgICAgICAgICAgICBkaWZmLnggPSBub3JtYWxpemVkUmFkaXVzLng7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAvIGZhY3RvclN1bTsKICAgICAgICB9YH19dmFyIEZmPWBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCnZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCnVuaWZvcm0gc2FtcGxlcjJEIGJhY2tncm91bmQ7CnVuaWZvcm0gc2FtcGxlcjJEIGZvcmVncm91bmQ7CnVuaWZvcm0gc2FtcGxlcjJEIHRocmVzaG9sZDsKCnZvaWQgbWFpbigpIHsKICB2ZWM0IGJhY2tncm91bmRDb2xvciA9IHRleHR1cmUyRChiYWNrZ3JvdW5kLCBfdGV4dHVyZV9jb29yZCk7CiAgdmVjNCBmb3JlZ3JvdW5kQ29sb3IgPSB0ZXh0dXJlMkQoZm9yZWdyb3VuZCwgX3RleHR1cmVfY29vcmQpOwogIHZlYzQgdHJlc2hvbGRDb2xvciA9IHRleHR1cmUyRCh0aHJlc2hvbGQsIF90ZXh0dXJlX2Nvb3JkKTsKICBnbF9GcmFnQ29sb3IgPSBmb3JlZ3JvdW5kQ29sb3IgKiB0cmVzaG9sZENvbG9yLmEgKwogICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvciAqICgxLiAtIHRyZXNob2xkQ29sb3IuYSk7Cn0KYCxQZj1gdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKYXR0cmlidXRlIHZlYzIgcG9zaXRpb247CmF0dHJpYnV0ZSB2ZWMyIHRleHR1cmVfY29vcmQ7Cgp2b2lkIG1haW4oKSB7CiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLiwgMS4pOwogIF90ZXh0dXJlX2Nvb3JkID0gdGV4dHVyZV9jb29yZDsKICBfdGV4dHVyZV9jb29yZC55ID0gMS4gLSB0ZXh0dXJlX2Nvb3JkLnk7Cn0KYDtjbGFzcyBQciBleHRlbmRzIGdle2dldEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIEZmfWdldFZlcnRleFNoYWRlcigpe3JldHVybiBQZn19Y2xhc3MgRHJ7Y29uc3RydWN0b3IoKXt5KHRoaXMsInN0ZXBzIixbXSl9YWRkU3RlcChlKXt0aGlzLnN0ZXBzLnB1c2goZSl9YXN5bmMgcnVuKCl7Zm9yKGNvbnN0IGUgb2YgdGhpcy5zdGVwcyllLnByb2dyYW0ucnVuKGUuZ2V0VW5pZm9ybXMoKSl9cmVzaXplT3V0cHV0KGUsdCl7Zm9yKGNvbnN0IG4gb2YgdGhpcy5zdGVwcyluLnByb2dyYW0ucmVzaXplT3V0cHV0KGUsdCl9fWNsYXNzIE1yIGV4dGVuZHMgRHJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3kodGhpcywicHJlY2lzZU1hc2tFbmFibGVkIiwhMSl9fWNsYXNzIERmIGV4dGVuZHMgTXJ7Y29uc3RydWN0b3IodCxuKXtzdXBlcigpO3kodGhpcywiaW5wdXRJbWFnZSIpO3kodGhpcywiaW5wdXRNYXNrIik7dGhpcy5jb250ZXh0PXQ7Y29uc3QgaT17Y29udGV4dDp0LGhlaWdodDp0LmNhbnZhcy5oZWlnaHQsd2lkdGg6dC5jYW52YXMud2lkdGh9LG89bmV3IElmKHsuLi5pLHJhZGl1czpufSkscz1uZXcgUHIoey4uLmksZGlzYWJsZUZyYW1lYnVmZmVyOiEwfSk7dGhpcy5hZGRTdGVwKHtwcm9ncmFtOm8sZ2V0VW5pZm9ybXM6KCk9Pih7dGV4dHVyZTpTKHQsdGhpcy5pbnB1dEltYWdlKSxtYXNrOlModCx0aGlzLmlucHV0TWFzayl9KX0pLHRoaXMuYWRkU3RlcCh7cHJvZ3JhbTpzLGdldFVuaWZvcm1zOigpPT4oe2JhY2tncm91bmQ6Uyh0LG8ub3V0cHV0KSxmb3JlZ3JvdW5kOlModCx0aGlzLmlucHV0SW1hZ2UpLHRocmVzaG9sZDpTKHQsdGhpcy5pbnB1dE1hc2spfSl9KX1zZXREYXRhKHQsbil7dGhpcy5pbnB1dEltYWdlPXQsdGhpcy5pbnB1dE1hc2s9bn19Y2xhc3MgQ2kgZXh0ZW5kcyBNcntjb25zdHJ1Y3Rvcih0KXtzdXBlcigpO3kodGhpcywiaW5wdXRJbWFnZSIpO3kodGhpcywiaW5wdXRCYWNrZ3JvdW5kSW1hZ2UiKTt5KHRoaXMsImlucHV0TWFzayIpO3kodGhpcywicHJlY2lzZU1hc2tFbmFibGVkIiwhMCk7dGhpcy5jb250ZXh0PXQ7Y29uc3Qgbj17Y29udGV4dDp0LGhlaWdodDp0LmNhbnZhcy5oZWlnaHQsd2lkdGg6dC5jYW52YXMud2lkdGh9LGk9bmV3IFByKHsuLi5uLGRpc2FibGVGcmFtZWJ1ZmZlcjohMH0pO3RoaXMuYWRkU3RlcCh7cHJvZ3JhbTppLGdldFVuaWZvcm1zOigpPT4oe2JhY2tncm91bmQ6Uyh0LHRoaXMuaW5wdXRCYWNrZ3JvdW5kSW1hZ2UpLGZvcmVncm91bmQ6Uyh0LHRoaXMuaW5wdXRJbWFnZSksdGhyZXNob2xkOlModCx0aGlzLmlucHV0TWFzayl9KX0pfXNldERhdGEodCxuKXt0aGlzLmlucHV0SW1hZ2U9dCx0aGlzLmlucHV0TWFzaz1ufX1jbGFzcyBNZiBleHRlbmRzIENpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTt5KHRoaXMsImZyYW1lUmVhZGVyIik7eSh0aGlzLCJwcmVjaXNlTWFza0VuYWJsZWQiLCEwKX1zZXQgaW5wdXRWaWRlbyh0KXt0aGlzLmZyYW1lUmVhZGVyPXQuZ2V0UmVhZGVyKCksdGhpcy5yZWFkTmV4dFZpZGVvRnJhbWUoKX1hc3luYyBydW4oKXt0aGlzLmZyYW1lUmVhZGVyJiYoYXdhaXQgc3VwZXIucnVuKCksdGhpcy5yZWFkTmV4dFZpZGVvRnJhbWUoKSl9YXN5bmMgcmVhZE5leHRWaWRlb0ZyYW1lKCl7dmFyIG47Y29uc3QgdD1hd2FpdCgobj10aGlzLmZyYW1lUmVhZGVyKT09bnVsbD92b2lkIDA6bi5yZWFkKCkpO3QhPW51bGwmJnQudmFsdWUmJih0aGlzLmlucHV0QmFja2dyb3VuZEltYWdlPWF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKHQudmFsdWUpLHQudmFsdWUuY2xvc2UoKSl9fXZhciBDZj1gcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7Cgp2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7Cgp1bmlmb3JtIHZlYzIgY2FudmFzOwp1bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlOwoKdmVjNCBsb29wKCk7Cgp2b2lkIG1haW4oKSB7IGdsX0ZyYWdDb2xvciA9IGxvb3AoKTsgfQpgLE9mPWB2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7CgphdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjsKYXR0cmlidXRlIHZlYzIgdGV4dHVyZV9jb29yZDsKCnZvaWQgbWFpbigpIHsKICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuLCAxLik7CiAgX3RleHR1cmVfY29vcmQgPSB0ZXh0dXJlX2Nvb3JkOwp9CmAsQ3I9KHI9PihyW3IuTElORUFSPTBdPSJMSU5FQVIiLHJbci5HQVVTU0lBTj0xXT0iR0FVU1NJQU4iLHIpKShDcnx8e30pO2NsYXNzIE9pIGV4dGVuZHMgZ2V7Z2V0RGVmaW5lcygpe3ZhciBlO3JldHVybntSQURJVVM6KGU9dGhpcy5vcHRpb25zLnJhZGl1cykhPW51bGw/ZToxfX1nZXRGcmFnbWVudFNoYWRlcigpe3JldHVybiBDZit0aGlzLmNyZWF0ZUxvb3BGdW5jdGlvbigpfWdldFZlcnRleFNoYWRlcigpe3JldHVybiBPZn1jcmVhdGVMb29wRnVuY3Rpb24oKXt2YXIgdDtsZXQgZT0odD10aGlzLm9wdGlvbnMucmFkaXVzKSE9bnVsbD90OjE7cmV0dXJuYAoKICAgICAgICB2ZWM0IGxvb3AoKSB7IAogICAgICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMCwwLDAsMCk7CiAgICAgICAgICAgIGZsb2F0IGZhY3RvclN1bSA9IDAuOwoKICAgICAgICAgICAgdmVjMiBub3JtYWxpemVkUmFkaXVzID0gdmVjMigtJHtlfS4pIC8gY2FudmFzOwogICAgICAgICAgICB2ZWMyIG5vcm1hbGl6ZWRJbmNyZW1lbnQgPSB2ZWMyKDEuKSAvIGNhbnZhczsKICAgICAgICAgICAgdmVjMiBkaWZmID0gbm9ybWFsaXplZFJhZGl1czsKCiAgICAgICAgICAgIGZvcihpbnQgeT0tJHtlfTsgeTwke2UrMX07ICsreSkgewogICAgICAgICAgICAgICAgZm9yKGludCB4PS0ke2V9OyB4PCR7ZSsxfTsgKyt4KSB7CiAgICAgICAgICAgICAgICAgICAgZmxvYXQgZmFjdG9yID0gMS47CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGZhY3RvciAqIHRleHR1cmUyRCh0ZXh0dXJlLCBfdGV4dHVyZV9jb29yZCArIGRpZmYpOwogICAgICAgICAgICAgICAgICAgIGZhY3RvclN1bSArPSBmYWN0b3I7CiAgICAgICAgICAgICAgICAgICAgZGlmZi54ICs9IG5vcm1hbGl6ZWRJbmNyZW1lbnQueDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRpZmYueSArPSBub3JtYWxpemVkSW5jcmVtZW50Lnk7CiAgICAgICAgICAgICAgICBkaWZmLnggPSBub3JtYWxpemVkUmFkaXVzLng7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAvIGZhY3RvclN1bTsKICAgICAgICB9YH1nZXRGYWN0b3IoZSx0KXtzd2l0Y2godGhpcy5vcHRpb25zLnR5cGUpe2Nhc2UgMTpyZXR1cm4gdGhpcy5nZXRMaW5lYXJGYWN0b3IoZSx0KTtjYXNlIDA6ZGVmYXVsdDpyZXR1cm4gdGhpcy5nZXRMaW5lYXJGYWN0b3IoZSx0KX19Z2V0TGluZWFyRmFjdG9yKGUsdCl7cmV0dXJuIDF9Z2V0R2F1c3NpYW5GYWN0b3IoZSx0KXt2YXIgdTtjb25zdCBuPU1hdGguUEkqMixpPU1hdGgubWF4KCh1PXRoaXMub3B0aW9ucy5yYWRpdXMpIT1udWxsP3U6MSwxKSxvPTEvKG4qaSoqMikscz0tKGUqKjIrdCoqMiksYT1vKnM7cmV0dXJuIG8qTWF0aC5FKiphfX1jbGFzcyBOZiBleHRlbmRzIE1ye2NvbnN0cnVjdG9yKHQsbil7c3VwZXIoKTt5KHRoaXMsImlucHV0SW1hZ2UiKTt5KHRoaXMsImlucHV0TWFzayIpO3RoaXMuY29udGV4dD10O2NvbnN0IGk9e2NvbnRleHQ6dCxoZWlnaHQ6dC5jYW52YXMuaGVpZ2h0LHdpZHRoOnQuY2FudmFzLndpZHRofSxvPW5ldyBPaSh7Li4uaSxyYWRpdXM6bix0eXBlOkNyLkdBVVNTSUFOfSkscz1uZXcgUHIoey4uLmksZGlzYWJsZUZyYW1lYnVmZmVyOiEwfSk7dGhpcy5hZGRTdGVwKHtwcm9ncmFtOm8sZ2V0VW5pZm9ybXM6KCk9Pih7dGV4dHVyZTpTKHQsdGhpcy5pbnB1dEltYWdlKX0pfSksdGhpcy5hZGRTdGVwKHtwcm9ncmFtOnMsZ2V0VW5pZm9ybXM6KCk9Pih7YmFja2dyb3VuZDpTKHQsdGhpcy5pbnB1dEltYWdlKSxmb3JlZ3JvdW5kOlModCxvLm91dHB1dCksdGhyZXNob2xkOlModCx0aGlzLmlucHV0TWFzayl9KX0pfXNldERhdGEodCxuKXt0aGlzLmlucHV0SW1hZ2U9dCx0aGlzLmlucHV0TWFzaz1ufX1jbGFzcyBPciBleHRlbmRzIGdle2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO3kodGhpcywiZmJpMiIpO3RoaXMuZmJpMj1JdCh0LmNvbnRleHQsW3tmb3JtYXQ6dC5jb250ZXh0LlJHQkEsdHlwZTp0LmNvbnRleHQuVU5TSUdORURfQllURSxtaW46dC5jb250ZXh0LkxJTkVBUixtYWc6dC5jb250ZXh0LkxJTkVBUix3cmFwOnQuY29udGV4dC5DTEFNUF9UT19FREdFfV0sdC53aWR0aCx0LmhlaWdodCl9cnVuKHQpe2NvbnN0IG49dGhpcy5mYmk7dGhpcy5mYmk9dGhpcy5mYmkyLHRoaXMuZmJpMj1uLHRoaXMub3V0cHV0PXRoaXMuZmJpLmF0dGFjaG1lbnRzWzBdLHN1cGVyLnJ1bih7Li4udCxwcmV2aW91c19yZW5kZXJpbmc6dGhpcy5mYmkyLmF0dGFjaG1lbnRzWzBdfSl9cmVzaXplT3V0cHV0KHQsbil7c3VwZXIucmVzaXplT3V0cHV0KHQsbiksdGhpcy5mYmkyPUl0KHRoaXMuY29udGV4dCxbe2Zvcm1hdDp0aGlzLmNvbnRleHQuUkdCQSx0eXBlOnRoaXMuY29udGV4dC5VTlNJR05FRF9CWVRFLG1pbjp0aGlzLmNvbnRleHQuTElORUFSLHdyYXA6dGhpcy5jb250ZXh0LkNMQU1QX1RPX0VER0V9XSx0LG4pfX12YXIgQmY9YHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoKdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKLy8gdW5pZm9ybSBmbG9hdCB0cmVzaG9sZDsKdW5pZm9ybSBzYW1wbGVyMkQgaW1hZ2Vfbm93Owp1bmlmb3JtIHNhbXBsZXIyRCBpbWFnZV9iZWZvcmU7CnVuaWZvcm0gc2FtcGxlcjJEIG1hc2tfbm93Owp1bmlmb3JtIHNhbXBsZXIyRCBtYXNrX2JlZm9yZTsKdW5pZm9ybSBzYW1wbGVyMkQgcHJldmlvdXNfcmVuZGVyaW5nOwp1bmlmb3JtIHZlYzIgY2FudmFzOwoKdW5pZm9ybSBmbG9hdCBkZWx0YTsKCmZsb2F0IGN1cnJlbnRfZmFjdG9yID0gMC42OTsKZmxvYXQgcHJldmlvdXNfZmFjdG9yID0gMC43NDsKZmxvYXQgdGhyZXNob2xkX2FjdGl2YXRpb24gPSAwLjU0OwoKZmxvYXQgbWFwKGZsb2F0IHZhbHVlLCBmbG9hdCBtaW4xLCBmbG9hdCBtYXgxLCBmbG9hdCBtaW4yLCBmbG9hdCBtYXgyKSB7CiAgcmV0dXJuIG1pbjIgKyAodmFsdWUgLSBtaW4xKSAqIChtYXgyIC0gbWluMikgLyAobWF4MSAtIG1pbjEpOwp9CgpmbG9hdCBnZXRUaHJlc2hvbGQoKSB7CiAgdmVjNCBjb2xvciA9IHZlYzQoMC4pOwogIGZvciAoZmxvYXQgeSA9IC02LjsgeSA8IDcuOyB5ICs9IDEuKSB7CiAgICBmb3IgKGZsb2F0IHggPSAtNi47IHggPCA3LjsgeCArPSAxLikgewogICAgICB2ZWM0IGltYWdlX25vd19jb2xvciA9CiAgICAgICAgICB0ZXh0dXJlMkQoaW1hZ2Vfbm93LCBfdGV4dHVyZV9jb29yZCArIHZlYzIoeCwgeSkgLyBjYW52YXMpOwogICAgICB2ZWM0IGltYWdlX2JlZm9yZV9jb2xvciA9CiAgICAgICAgICB0ZXh0dXJlMkQoaW1hZ2VfYmVmb3JlLCBfdGV4dHVyZV9jb29yZCArIHZlYzIoeCwgeSkgLyBjYW52YXMpOwogICAgICBjb2xvciArPSBhYnMoaW1hZ2VfYmVmb3JlX2NvbG9yIC0gaW1hZ2Vfbm93X2NvbG9yKTsKICAgIH0KICB9CiAgcmV0dXJuIChjb2xvci54ICsgY29sb3IueSArIGNvbG9yLnopIC8gKDMuICogOS4pOwp9Cgp2b2lkIG1haW4oKSB7CiAgZmxvYXQgdHJlc2hvbGRfaW5wdXQgPSAuNDsKICBmbG9hdCB0cmVzaG9sZF9wcmV2aW91c19yZW5kZXJpbmcgPSAuOTg7CgogIHZlYzQgbWFza19ub3dfY29sb3IgPSB0ZXh0dXJlMkQobWFza19ub3csIF90ZXh0dXJlX2Nvb3JkKTsKICB2ZWM0IG1hc2tfYmVmb3JlX2NvbG9yID0gdGV4dHVyZTJEKG1hc2tfYmVmb3JlLCBfdGV4dHVyZV9jb29yZCk7CiAgdmVjNCBwcmV2aW91c19yZW5kZXJpbmdfY29sb3IgPSB0ZXh0dXJlMkQocHJldmlvdXNfcmVuZGVyaW5nLCBfdGV4dHVyZV9jb29yZCk7CgogIHZlYzMgbWFza19kaWZmID0gYWJzKG1hc2tfYmVmb3JlX2NvbG9yLnh5eiAtIG1hc2tfbm93X2NvbG9yLnh5eik7CiAgZmxvYXQgZmxpY2tlcmluZyA9IG1hc2tfZGlmZi54OwogIGZsb2F0IHRocmVzaG9sZCA9IGdldFRocmVzaG9sZCgpOwogIGlmICh0aHJlc2hvbGQgPCB0aHJlc2hvbGRfYWN0aXZhdGlvbikgewogICAgZ2xfRnJhZ0NvbG9yID0gdmVjNChmbGlja2VyaW5nLCAwLiwgMC4sIDEuKSAqIGN1cnJlbnRfZmFjdG9yICsKICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX3JlbmRlcmluZ19jb2xvciAqIHByZXZpb3VzX2ZhY3RvcjsKICAgIGdsX0ZyYWdDb2xvciAqPSAoMS4gLSB0aHJlc2hvbGQpOwogIH0KfQpgLFVmPWB2YXJ5aW5nIHZlYzIgX3RleHR1cmVfY29vcmQ7CgphdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjsKYXR0cmlidXRlIHZlYzIgdGV4dHVyZV9jb29yZDsKCnZvaWQgbWFpbigpIHsKICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24sIDAuLCAxLik7CiAgX3RleHR1cmVfY29vcmQgPSB0ZXh0dXJlX2Nvb3JkOwp9CmA7Y2xhc3Mga2YgZXh0ZW5kcyBPcntnZXRGcmFnbWVudFNoYWRlcigpe3JldHVybiBCZn1nZXRWZXJ0ZXhTaGFkZXIoKXtyZXR1cm4gVWZ9fXZhciBMZj1gI3ZlcnNpb24gMzAwIGVzCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9Wb2xjb21peC92aXJ0dWFsLWJhY2tncm91bmQvYmxvYi9tYWluL3NyYy9waXBlbGluZXMvd2ViZ2wyL2pvaW50QmlsYXRlcmFsRmlsdGVyU3RhZ2UudHMKCnByZWNpc2lvbiBoaWdocCBmbG9hdDsKdW5pZm9ybSBzYW1wbGVyMkQgaW5wdXRfZnJhbWU7CnVuaWZvcm0gc2FtcGxlcjJEIHNlZ21lbnRhdGlvbl9tYXNrOwp1bmlmb3JtIHNhbXBsZXIyRCB0aHJlc2hvbGQ7CnVuaWZvcm0gdmVjMiB0ZXhlbF9zaXplOwp1bmlmb3JtIGZsb2F0IHN0ZXA7CnVuaWZvcm0gZmxvYXQgcmFkaXVzOwp1bmlmb3JtIGZsb2F0IG9mZnNldDsKdW5pZm9ybSBmbG9hdCBzaWdtYV90ZXhlbDsKdW5pZm9ybSBmbG9hdCBzaWdtYV9jb2xvcjsKCmluIHZlYzIgX3RleHR1cmVfY29vcmQ7Cm91dCB2ZWM0IG91dENvbG9yOwoKZmxvYXQgZ2F1c3NpYW4oZmxvYXQgeCwgZmxvYXQgc2lnbWEpIHsKICBmbG9hdCBjb2VmZiA9IC0wLjUgLyAoc2lnbWEgKiBzaWdtYSAqIDQuMCArIDEuMGUtNik7CiAgcmV0dXJuIGV4cCgoeCAqIHgpICogY29lZmYpOwp9Cgp2b2lkIG1haW4oKSB7CiAgdmVjMiBjZW50ZXJDb29yZCA9IF90ZXh0dXJlX2Nvb3JkOwogIHZlYzMgY2VudGVyQ29sb3IgPSB0ZXh0dXJlKGlucHV0X2ZyYW1lLCBjZW50ZXJDb29yZCkucmdiOwogIGZsb2F0IG5ld1ZhbCA9IDAuMDsKICBmbG9hdCBzcGFjZVdlaWdodCA9IDAuMDsKICBmbG9hdCBjb2xvcldlaWdodCA9IDAuMDsKICBmbG9hdCB0b3RhbFdlaWdodCA9IDAuMDsKICAvLyBTdWJzYW1wbGUga2VybmVsIHNwYWNlLgogIGZvciAoZmxvYXQgaSA9IC1yYWRpdXMgKyBvZmZzZXQ7IGkgPD0gcmFkaXVzOyBpICs9IHN0ZXApIHsKICAgIGZvciAoZmxvYXQgaiA9IC1yYWRpdXMgKyBvZmZzZXQ7IGogPD0gcmFkaXVzOyBqICs9IHN0ZXApIHsKICAgICAgdmVjMiBzaGlmdCA9IHZlYzIoaiwgaSkgKiB0ZXhlbF9zaXplOwogICAgICB2ZWMyIGNvb3JkID0gdmVjMihjZW50ZXJDb29yZCArIHNoaWZ0KTsKICAgICAgdmVjMyBmcmFtZUNvbG9yID0gdGV4dHVyZShpbnB1dF9mcmFtZSwgY29vcmQpLnJnYjsKICAgICAgZmxvYXQgdGhyZXNob2xkID0gdGV4dHVyZSh0aHJlc2hvbGQsIGNvb3JkKS5hOwogICAgICBmbG9hdCBvdXRWYWwgPSB0ZXh0dXJlKHNlZ21lbnRhdGlvbl9tYXNrLCBjb29yZCkuYTsKCiAgICAgIHNwYWNlV2VpZ2h0ID0gZ2F1c3NpYW4oZGlzdGFuY2UoY2VudGVyQ29vcmQsIGNvb3JkKSwgc2lnbWFfdGV4ZWwpOwogICAgICBjb2xvcldlaWdodCA9IGdhdXNzaWFuKGRpc3RhbmNlKGNlbnRlckNvbG9yLCBmcmFtZUNvbG9yKSwgc2lnbWFfY29sb3IpOwogICAgICB0b3RhbFdlaWdodCArPSBzcGFjZVdlaWdodCAqIGNvbG9yV2VpZ2h0OwogICAgICBuZXdWYWwgKz0gc3BhY2VXZWlnaHQgKiBjb2xvcldlaWdodCAqIG91dFZhbCAqIHRocmVzaG9sZDsKICAgIH0KICB9CiAgbmV3VmFsIC89IHRvdGFsV2VpZ2h0OwogIG91dENvbG9yID0gdmVjNCh2ZWMzKDAuKSwgbmV3VmFsKTsKfWAsJGY9YCN2ZXJzaW9uIDMwMCBlcwppbiB2ZWMyIHBvc2l0aW9uOwppbiB2ZWMyIHRleHR1cmVfY29vcmQ7Cm91dCB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwp2b2lkIG1haW4oKSB7CiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLjAsIDEuMCk7CiAgX3RleHR1cmVfY29vcmQgPSB0ZXh0dXJlX2Nvb3JkOwp9YDtjbGFzcyBHZiBleHRlbmRzIGdle2dldEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIExmfWdldFZlcnRleFNoYWRlcigpe3JldHVybiAkZn19dmFyIHpmPWBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCnZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCnVuaWZvcm0gdmVjMiBjYW52YXM7CnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU7Cgp2b2lkIG1haW4oKSB7CiAgaW50IGNvdW50ID0gMDsKICBmb3IgKGZsb2F0IHkgPSAtMS47IHkgPCAyLjsgeSArPSAxLikgewogICAgZm9yIChmbG9hdCB4ID0gLTEuOyB4IDwgMi47IHggKz0gMS4pIHsKICAgICAgdmVjMiBjb29yZCA9IF90ZXh0dXJlX2Nvb3JkICsgdmVjMih5LCB4KSAvIGNhbnZhczsKICAgICAgdmVjNCBjb2xvciA9IHRleHR1cmUyRCh0ZXh0dXJlLCBjb29yZCk7CiAgICAgIGlmIChjb2xvci5yID4gLjEpIHsKICAgICAgICBjb3VudCsrOwogICAgICB9CiAgICB9CiAgfQogIGlmIChjb3VudCA+IDUpIHsKICAgIGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCh0ZXh0dXJlLCBfdGV4dHVyZV9jb29yZCk7CiAgfQp9CmAsSGY9YHZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCmF0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uOwphdHRyaWJ1dGUgdmVjMiB0ZXh0dXJlX2Nvb3JkOwoKdm9pZCBtYWluKCkgewogIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4sIDEuKTsKICBfdGV4dHVyZV9jb29yZCA9IHRleHR1cmVfY29vcmQ7Cn0KYDtjbGFzcyBWZiBleHRlbmRzIGdle2dldEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIHpmfWdldFZlcnRleFNoYWRlcigpe3JldHVybiBIZn19dmFyIFdmPWBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCnZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCnVuaWZvcm0gdmVjMiBjYW52YXM7CnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU7Cgp2b2lkIG1haW4oKSB7CiAgdmVjNCBjb2xvciA9IHRleHR1cmUyRCh0ZXh0dXJlLCBfdGV4dHVyZV9jb29yZCk7CiAgZm9yIChmbG9hdCB5ID0gLTIuOyB5IDwgMy47IHkgKz0gMS4pIHsKICAgIGZvciAoZmxvYXQgeCA9IC0yLjsgeCA8IDMuOyB4ICs9IDEuKSB7CiAgICAgIHZlYzIgY29vcmQgPSBfdGV4dHVyZV9jb29yZDsKICAgICAgY29vcmQgKz0gdmVjMih5LCB4KSAvIGNhbnZhczsKICAgICAgY29sb3IgKz0gdGV4dHVyZTJEKHRleHR1cmUsIGNvb3JkKSAqICgxLiAvIDQuKTsKICAgIH0KICB9CgogIGdsX0ZyYWdDb2xvciA9IGNvbG9yOwp9CmAsamY9YHZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCmF0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uOwphdHRyaWJ1dGUgdmVjMiB0ZXh0dXJlX2Nvb3JkOwoKdm9pZCBtYWluKCkgewogIGdsX1Bvc2l0aW9uID0gdmVjNChwb3NpdGlvbiwgMC4sIDEuKTsKICBfdGV4dHVyZV9jb29yZCA9IHRleHR1cmVfY29vcmQ7Cn0KYDtjbGFzcyBxZiBleHRlbmRzIE9ye2dldEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIFdmfWdldFZlcnRleFNoYWRlcigpe3JldHVybiBqZn19dmFyIFhmPWBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCnZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCnVuaWZvcm0gc2FtcGxlcjJEIHRocmVzaG9sZDsKdW5pZm9ybSBzYW1wbGVyMkQgaW5wdXRzOwoKdm9pZCBtYWluKCkgewogIHZlYzQgaW5wdXRzX2NvbG9yID0gdGV4dHVyZTJEKGlucHV0cywgX3RleHR1cmVfY29vcmQpOwogIHZlYzQgdGhyZXNob2xkX2NvbG9yID0gdGV4dHVyZTJEKHRocmVzaG9sZCwgX3RleHR1cmVfY29vcmQpOwogIGlmICh0aHJlc2hvbGRfY29sb3IuciA8IC4xICYmIGlucHV0c19jb2xvci5yID4gLjUpIHsKICAgIGdsX0ZyYWdDb2xvciA9IGlucHV0c19jb2xvcjsKICB9Cn0KYCxZZj1gdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwoKYXR0cmlidXRlIHZlYzIgcG9zaXRpb247CmF0dHJpYnV0ZSB2ZWMyIHRleHR1cmVfY29vcmQ7Cgp2b2lkIG1haW4oKSB7CiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLiwgMS4pOwogIF90ZXh0dXJlX2Nvb3JkID0gdGV4dHVyZV9jb29yZDsKfQpgO2NsYXNzIEtmIGV4dGVuZHMgT3J7Z2V0RnJhZ21lbnRTaGFkZXIoKXtyZXR1cm4gWGZ9Z2V0VmVydGV4U2hhZGVyKCl7cmV0dXJuIFlmfX1jbGFzcyBKZiBleHRlbmRzIERye2NvbnN0cnVjdG9yKHQsbixpKXtzdXBlcigpO3kodGhpcywiaW5wdXRJbWFnZSIpO3kodGhpcywiaW5wdXRNYXNrIik7eSh0aGlzLCJwcmV2aW91c0lucHV0SW1hZ2UiKTt5KHRoaXMsInByZXZpb3VzSW5wdXRNYXNrIik7eSh0aGlzLCJvdXRwdXQiKTt5KHRoaXMsIm9wdGlvbnMiLHtjdXJyZW50VGhyZXNob2xkTWluaW11bTowLGN1cnJlbnRUaHJlc2hvbGRNYXhpbXVtOjEscHJldmlvdXNUaHJlc2hvbGRNaW5pbXVtOjAscHJldmlvdXNUaHJlc2hvbGRNYXhpbXVtOjEsdGhyZXNob2xkTWluaW11bTowLHRocmVzaG9sZE1heGltdW06MSx0aHJlc2hvbGRGYWN0b3I6MX0pO3RoaXMuY29udGV4dD10O2NvbnN0IG89e2NvbnRleHQ6dCxoZWlnaHQ6aSx3aWR0aDpufSxzPW5ldyBrZihvKSxhPW5ldyBPaSh7Li4ubyxyYWRpdXM6MSx0eXBlOkNyLkdBVVNTSUFOfSksdT1uZXcgS2YobyksZj1uZXcgcWYobyksYz1uZXcgVmYobyksZD1uZXcgR2Yoey4uLm99KSxwPS42NixfPTY0MCxtPTQ4MCx4PTI1Nix2PTE0NDtsZXQgZz0xO2cqPU1hdGgubWF4KF8veCxtL3YpO2NvbnN0IEE9TWF0aC5tYXgoMSxNYXRoLnNxcnQoZykqcCksUD0xL18sQz0xL207dGhpcy5hZGRTdGVwKHtwcm9ncmFtOnMsZ2V0VW5pZm9ybXM6KCk9Pih7aW1hZ2Vfbm93OlModCx0aGlzLmlucHV0SW1hZ2UpLGltYWdlX2JlZm9yZTpTKHQsdGhpcy5wcmV2aW91c0lucHV0SW1hZ2UpLG1hc2tfbm93OlModCx0aGlzLmlucHV0TWFzayksbWFza19iZWZvcmU6Uyh0LHRoaXMucHJldmlvdXNJbnB1dE1hc2spLGN1cnJlbnRfdGhyZXNob2xkX21pbmltdW06dGhpcy5vcHRpb25zLmN1cnJlbnRUaHJlc2hvbGRNaW5pbXVtLGN1cnJlbnRfdGhyZXNob2xkX21heGltdW06dGhpcy5vcHRpb25zLmN1cnJlbnRUaHJlc2hvbGRNYXhpbXVtLHByZXZpb3VzX3RocmVzaG9sZF9taW5pbXVtOnRoaXMub3B0aW9ucy5wcmV2aW91c1RocmVzaG9sZE1pbmltdW0scHJldmlvdXNfdGhyZXNob2xkX21heGltdW06dGhpcy5vcHRpb25zLnByZXZpb3VzVGhyZXNob2xkTWF4aW11bSx0aHJlc2hvbGRfbWluaW11bTp0aGlzLm9wdGlvbnMudGhyZXNob2xkTWluaW11bSx0aHJlc2hvbGRfbWF4aW11bTp0aGlzLm9wdGlvbnMudGhyZXNob2xkTWF4aW11bSx0aHJlc2hvbGRfZmFjdG9yOnRoaXMub3B0aW9ucy50aHJlc2hvbGRGYWN0b3J9KX0pLHRoaXMuYWRkU3RlcCh7cHJvZ3JhbTp1LGdldFVuaWZvcm1zOigpPT4oe2lucHV0czpTKHQsdGhpcy5pbnB1dE1hc2spLHRocmVzaG9sZDpTKHQscy5vdXRwdXQpfSl9KSx0aGlzLmFkZFN0ZXAoe3Byb2dyYW06YyxnZXRVbmlmb3JtczooKT0+KHt0ZXh0dXJlOlModCx1Lm91dHB1dCl9KX0pLHRoaXMuYWRkU3RlcCh7cHJvZ3JhbTpmLGdldFVuaWZvcm1zOigpPT4oe3RleHR1cmU6Uyh0LGMub3V0cHV0KX0pfSksdGhpcy5hZGRTdGVwKHtwcm9ncmFtOmEsZ2V0VW5pZm9ybXM6KCk9Pih7dGV4dHVyZTpTKHQsZi5vdXRwdXQpfSl9KSx0aGlzLmFkZFN0ZXAoe3Byb2dyYW06ZCxnZXRVbmlmb3JtczooKT0+KHtpbnB1dF9mcmFtZTpTKHQsdGhpcy5pbnB1dEltYWdlKSxzZWdtZW50YXRpb25fbWFzazpTKHQsdGhpcy5pbnB1dE1hc2spLHRocmVzaG9sZDpTKHQsYS5vdXRwdXQpLHRleGVsX3NpemU6W1AsQ10sc3RlcDpBLHJhZGl1czpnLG9mZnNldDpBPjE/QSouNTowLHNpZ21hX3RleGVsOk1hdGgubWF4KFAsQykqZyxzaWdtYV9jb2xvcjouMX0pfSksdGhpcy5vdXRwdXQ9ZC5vdXRwdXR9c2V0RGF0YSh0LG4pe3RoaXMucHJldmlvdXNJbnB1dEltYWdlPXRoaXMuaW5wdXRJbWFnZT90aGlzLmlucHV0SW1hZ2U6dCx0aGlzLnByZXZpb3VzSW5wdXRNYXNrPXRoaXMuaW5wdXRNYXNrP3RoaXMuaW5wdXRNYXNrOm4sdGhpcy5pbnB1dEltYWdlPXQsdGhpcy5pbnB1dE1hc2s9bn1zZXRPcHRpb25zKHQpe3RoaXMub3B0aW9ucz10fX12YXIgUWY9YHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoKdmFyeWluZyB2ZWMyIF90ZXh0dXJlX2Nvb3JkOwp1bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlOwoKdm9pZCBtYWluKCkgeyBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodGV4dHVyZSwgX3RleHR1cmVfY29vcmQpOyB9CmAsWmY9YHZhcnlpbmcgdmVjMiBfdGV4dHVyZV9jb29yZDsKCmF0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uOwphdHRyaWJ1dGUgdmVjMiB0ZXh0dXJlX2Nvb3JkOwp1bmlmb3JtIGJvb2wgaW52ZXJ0X3k7Cgp2b2lkIG1haW4oKSB7CiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLiwgMS4pOwogIF90ZXh0dXJlX2Nvb3JkID0gdGV4dHVyZV9jb29yZDsKICBpZiAoaW52ZXJ0X3kpIHsKICAgIF90ZXh0dXJlX2Nvb3JkLnkgPSAxLiAtIHRleHR1cmVfY29vcmQueTsKICB9Cn0KYDtjbGFzcyBlbCBleHRlbmRzIGdle2dldEZyYWdtZW50U2hhZGVyKCl7cmV0dXJuIFFmfWdldFZlcnRleFNoYWRlcigpe3JldHVybiBaZn19Y2xhc3MgdGwgZXh0ZW5kcyBEcntjb25zdHJ1Y3Rvcih0LG4saSl7c3VwZXIoKTt5KHRoaXMsImlucHV0SW1hZ2UiKTt0aGlzLmNvbnRleHQ9dDtjb25zdCBvPXtjb250ZXh0OnQsaGVpZ2h0Omksd2lkdGg6bn07dGhpcy5hZGRTdGVwKHtwcm9ncmFtOm5ldyBlbCh7Li4ubyxkaXNhYmxlRnJhbWVidWZmZXI6ITB9KSxnZXRVbmlmb3JtczooKT0+KHt0ZXh0dXJlOlModCx0aGlzLmlucHV0SW1hZ2UpLGludmVydF95OiEwfSl9KX1zZXREYXRhKHQpe3RoaXMuaW5wdXRJbWFnZT10fX1jbGFzcyBybHtjb25zdHJ1Y3RvcihlKXt5KHRoaXMsInJlc2l6ZSIpO3kodGhpcywiY2FudmFzIik7eSh0aGlzLCJjb250ZXh0Iik7dGhpcy5jYW52YXM9bmV3IE9mZnNjcmVlbkNhbnZhcygwLDApLHRoaXMuY29udGV4dD10aGlzLmNhbnZhcy5nZXRDb250ZXh0KCJ3ZWJnbDIiKSx0aGlzLmNhbnZhcy53aWR0aD1lLndpZHRoLHRoaXMuY2FudmFzLmhlaWdodD1lLmhlaWdodCx0aGlzLnJlc2l6ZT1uZXcgdGwodGhpcy5jb250ZXh0LGUud2lkdGgsZS5oZWlnaHQpfXJlc2l6ZUZvcmVncm91bmQoZSx0KXt0aGlzLmNhbnZhcy53aWR0aD1lLHRoaXMuY2FudmFzLmhlaWdodD10LHRoaXMucmVzaXplLnJlc2l6ZU91dHB1dChlLHQpfWFzeW5jIHByb2Nlc3MoZSl7dmFyIHQsbjtyZXR1cm4gdGhpcy5jYW52YXMud2lkdGg9dGhpcy5jYW52YXMud2lkdGgsKHQ9dGhpcy5yZXNpemUpPT1udWxsfHx0LnNldERhdGEoZSksKG49dGhpcy5yZXNpemUpPT1udWxsfHxuLnJ1bigpLHRoaXMuY2FudmFzfX1jbGFzcyBubHtjb25zdHJ1Y3RvcihlKXt5KHRoaXMsImltcHJvdmVNYXNrU2VnbWVudGF0aW9uIik7eSh0aGlzLCJiYWNrZ3JvdW5kUmVzaXplciIpO3kodGhpcywiYmFja2dyb3VuZEltYWdlIik7eSh0aGlzLCJiYWNrZ3JvdW5kVmlkZW8iKTt5KHRoaXMsImFjdGl2ZVBpcGVsaW5lIik7eSh0aGlzLCJjYW52YXMiKTt5KHRoaXMsIm9wdGlvbnMiKTt5KHRoaXMsImNvbnRleHQiKTt5KHRoaXMsInZpcnR1YWxCR0ltYWdlIik7dGhpcy5jYW52YXM9bmV3IE9mZnNjcmVlbkNhbnZhcygwLDApLHRoaXMuY29udGV4dD10aGlzLmNhbnZhcy5nZXRDb250ZXh0KCJ3ZWJnbDIiKSx0aGlzLmNhbnZhcy53aWR0aD1lLmZvcmVncm91bmRXaWR0aCx0aGlzLmNhbnZhcy5oZWlnaHQ9ZS5mb3JlZ3JvdW5kSGVpZ2h0LHRoaXMuaW1wcm92ZU1hc2tTZWdtZW50YXRpb249bmV3IEpmKHRoaXMuY29udGV4dCxlLm1hc2tXaWR0aCxlLm1hc2tIZWlnaHQpLHRoaXMuYmFja2dyb3VuZEltYWdlPW5ldyBDaSh0aGlzLmNvbnRleHQpLHRoaXMuYmFja2dyb3VuZFZpZGVvPW5ldyBNZih0aGlzLmNvbnRleHQpLHRoaXMuYmFja2dyb3VuZFJlc2l6ZXI9bmV3IHJsKHt3aWR0aDplLmZvcmVncm91bmRXaWR0aCxoZWlnaHQ6ZS5mb3JlZ3JvdW5kSGVpZ2h0fSl9c2V0QmFja2dyb3VuZE9wdGlvbnMoZSl7c3dpdGNoKGUudHJhbnNmb3JtZXJUeXBlKXtjYXNlIkJhY2tncm91bmRCbHVyIjp0aGlzLmFjdGl2ZVBpcGVsaW5lPW5ldyBEZih0aGlzLmNvbnRleHQsdGhpcy5nZXRCbHVyU2l6ZShlLnJhZGl1cykpO2JyZWFrO2Nhc2UiU2lsaG91ZXR0ZUJsdXIiOnRoaXMuYWN0aXZlUGlwZWxpbmU9bmV3IE5mKHRoaXMuY29udGV4dCx0aGlzLmdldEJsdXJTaXplKGUucmFkaXVzKSk7YnJlYWs7Y2FzZSJWaWRlb0JhY2tncm91bmQiOnRoaXMuYWN0aXZlUGlwZWxpbmU9dGhpcy5iYWNrZ3JvdW5kVmlkZW87YnJlYWs7Y2FzZSJWaXJ0dWFsQmFja2dyb3VuZCI6dGhpcy5hY3RpdmVQaXBlbGluZT10aGlzLmJhY2tncm91bmRJbWFnZTticmVha310aGlzLm9wdGlvbnM9ZX1zZXRGbGlja2VyaW5nT3B0aW9ucyhlKXt2YXIgdDsodD10aGlzLmltcHJvdmVNYXNrU2VnbWVudGF0aW9uKT09bnVsbHx8dC5zZXRPcHRpb25zKGUpfXNldFZpZGVvQkdSZWFkYWJsZShlKXt0aGlzLmJhY2tncm91bmRWaWRlby5pbnB1dFZpZGVvPWV9YXN5bmMgc2V0VmlydHVhbEJHSW1hZ2UoZSl7dGhpcy52aXJ0dWFsQkdJbWFnZT1lLHRoaXMuYmFja2dyb3VuZEltYWdlLmlucHV0QmFja2dyb3VuZEltYWdlPWF3YWl0IHRoaXMuYmFja2dyb3VuZFJlc2l6ZXIucHJvY2VzcyhlKX1hc3luYyBwcm9jZXNzKGUsdCl7dmFyIG4saSxvLHMsYTtpZih0aGlzLmFjdGl2ZVBpcGVsaW5lJiZlLndpZHRoJiYodD09bnVsbD92b2lkIDA6dC53aWR0aCkpe2xldCB1PXQ7KCgobj10aGlzLm9wdGlvbnMpPT1udWxsP3ZvaWQgMDpuLnNlbGZpZVNlZ21lbnRhdGlvblR5cGUpJiYoKGk9dGhpcy5vcHRpb25zKT09bnVsbD92b2lkIDA6aS5zZWxmaWVTZWdtZW50YXRpb25UeXBlKT09PSJQUkVDSVNFInx8ISgobz10aGlzLm9wdGlvbnMpIT1udWxsJiZvLnNlbGZpZVNlZ21lbnRhdGlvblR5cGUpJiZ0aGlzLmFjdGl2ZVBpcGVsaW5lLnByZWNpc2VNYXNrRW5hYmxlZCkmJih0aGlzLmltcHJvdmVNYXNrU2VnbWVudGF0aW9uLnNldERhdGEoZSx0KSx0aGlzLmltcHJvdmVNYXNrU2VnbWVudGF0aW9uLnJ1bigpLHU9dGhpcy5pbXByb3ZlTWFza1NlZ21lbnRhdGlvbi5vdXRwdXQpLChzPXRoaXMuYWN0aXZlUGlwZWxpbmUpPT1udWxsfHxzLnNldERhdGEoZSx1KSwoYT10aGlzLmFjdGl2ZVBpcGVsaW5lKT09bnVsbHx8YS5ydW4oKX19YXN5bmMgcmVzaXplRm9yZWdyb3VuZChlLHQpe3ZhciBuO3RoaXMuY2FudmFzLndpZHRoPWUsdGhpcy5jYW52YXMuaGVpZ2h0PXQsdGhpcy5iYWNrZ3JvdW5kSW1hZ2UucmVzaXplT3V0cHV0KGUsdCksdGhpcy5iYWNrZ3JvdW5kVmlkZW8ucmVzaXplT3V0cHV0KGUsdCksdGhpcy5iYWNrZ3JvdW5kUmVzaXplci5yZXNpemVGb3JlZ3JvdW5kKGUsdCksKG49dGhpcy5hY3RpdmVQaXBlbGluZSk9PW51bGx8fG4ucmVzaXplT3V0cHV0KGUsdCksdGhpcy52aXJ0dWFsQkdJbWFnZSYmKHRoaXMuYmFja2dyb3VuZEltYWdlLmlucHV0QmFja2dyb3VuZEltYWdlPWF3YWl0IHRoaXMuYmFja2dyb3VuZFJlc2l6ZXIucHJvY2Vzcyh0aGlzLnZpcnR1YWxCR0ltYWdlKSl9Z2V0Qmx1clNpemUoZT1zdC5Mb3cpe3N3aXRjaChlKXtjYXNlIHN0LkxvdzpyZXR1cm4gNTtjYXNlIHN0LkhpZ2g6cmV0dXJuIDEyfXJldHVybiBlfX12YXIgaWw9ZnVuY3Rpb24oKXt2YXIgcj10eXBlb2YgZG9jdW1lbnQ8InUiJiZkb2N1bWVudC5jdXJyZW50U2NyaXB0P2RvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjOnZvaWQgMDtyZXR1cm4gZnVuY3Rpb24oZSl7ZT1lfHx7fTt2YXIgdD10eXBlb2YgZTwidSI/ZTp7fSxuLGk7dC5yZWFkeT1uZXcgUHJvbWlzZShmdW5jdGlvbihsLGgpe249bCxpPWh9KTt2YXIgbz17fSxzO2ZvcihzIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShzKSYmKG9bc109dFtzXSk7dmFyIGE9Ii4vdGhpcy5wcm9ncmFtIix1PWZ1bmN0aW9uKGwsaCl7dGhyb3cgaH0sZj0hMCxjPSIiO2Z1bmN0aW9uIGQobCl7cmV0dXJuIHQubG9jYXRlRmlsZT90LmxvY2F0ZUZpbGUobCxjKTpjK2x9dmFyIHA7dHlwZW9mIGRvY3VtZW50PCJ1IiYmZG9jdW1lbnQuY3VycmVudFNjcmlwdCYmKGM9ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMpLHImJihjPXIpLGMuaW5kZXhPZigiYmxvYjoiKSE9PTA/Yz1jLnN1YnN0cigwLGMucmVwbGFjZSgvWz8jXS4qLywiIikubGFzdEluZGV4T2YoIi8iKSsxKTpjPSIiO3ZhciBfPXQucHJpbnR8fGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSksbT10LnByaW50RXJyfHxjb25zb2xlLndhcm4uYmluZChjb25zb2xlKTtmb3IocyBpbiBvKW8uaGFzT3duUHJvcGVydHkocykmJih0W3NdPW9bc10pO289bnVsbCx0LmFyZ3VtZW50cyYmdC5hcmd1bWVudHMsdC50aGlzUHJvZ3JhbSYmKGE9dC50aGlzUHJvZ3JhbSksdC5xdWl0JiYodT10LnF1aXQpO3ZhciB4O3Qud2FzbUJpbmFyeSYmKHg9dC53YXNtQmluYXJ5KTt2YXIgdj10Lm5vRXhpdFJ1bnRpbWV8fCEwO3R5cGVvZiBXZWJBc3NlbWJseSE9Im9iamVjdCImJm1lKCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7dmFyIGcsQT0hMSxQPXR5cGVvZiBUZXh0RGVjb2RlcjwidSI/bmV3IFRleHREZWNvZGVyKCJ1dGY4Iik6dm9pZCAwO2Z1bmN0aW9uIEMobCxoLGIpe2Zvcih2YXIgdz1oK2IsTT1oO2xbTV0mJiEoTT49dyk7KSsrTTtpZihNLWg+MTYmJmwuc3ViYXJyYXkmJlApcmV0dXJuIFAuZGVjb2RlKGwuc3ViYXJyYXkoaCxNKSk7Zm9yKHZhciBCPSIiO2g8TTspe3ZhciBSPWxbaCsrXTtpZighKFImMTI4KSl7Qis9U3RyaW5nLmZyb21DaGFyQ29kZShSKTtjb250aW51ZX12YXIgaz1sW2grK10mNjM7aWYoKFImMjI0KT09MTkyKXtCKz1TdHJpbmcuZnJvbUNoYXJDb2RlKChSJjMxKTw8NnxrKTtjb250aW51ZX12YXIgZWU9bFtoKytdJjYzO2lmKChSJjI0MCk9PTIyND9SPShSJjE1KTw8MTJ8azw8NnxlZTpSPShSJjcpPDwxOHxrPDwxMnxlZTw8NnxsW2grK10mNjMsUjw2NTUzNilCKz1TdHJpbmcuZnJvbUNoYXJDb2RlKFIpO2Vsc2V7dmFyIFZpPVItNjU1MzY7Qis9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxWaT4+MTAsNTYzMjB8VmkmMTAyMyl9fXJldHVybiBCfWZ1bmN0aW9uIFcobCxoKXtyZXR1cm4gbD9DKEhlLGwsaCk6IiJ9ZnVuY3Rpb24gaWUobCxoLGIpe2Zvcih2YXIgdz0wO3c8bC5sZW5ndGg7Kyt3KUZ0W2grKz4+MF09bC5jaGFyQ29kZUF0KHcpO2J8fChGdFtoPj4wXT0wKX1mdW5jdGlvbiBYKGwsaCl7cmV0dXJuIGwlaD4wJiYobCs9aC1sJWgpLGx9dmFyIEJpLEZ0LEhlLFk7ZnVuY3Rpb24gVWkobCl7Qmk9bCx0LkhFQVA4PUZ0PW5ldyBJbnQ4QXJyYXkobCksdC5IRUFQMTY9bmV3IEludDE2QXJyYXkobCksdC5IRUFQMzI9WT1uZXcgSW50MzJBcnJheShsKSx0LkhFQVBVOD1IZT1uZXcgVWludDhBcnJheShsKSx0LkhFQVBVMTY9bmV3IFVpbnQxNkFycmF5KGwpLHQuSEVBUFUzMj1uZXcgVWludDMyQXJyYXkobCksdC5IRUFQRjMyPW5ldyBGbG9hdDMyQXJyYXkobCksdC5IRUFQRjY0PW5ldyBGbG9hdDY0QXJyYXkobCl9dC5JTklUSUFMX01FTU9SWTt2YXIgQnIsa2k9W10sTGk9W10sJGk9W10sbGw9MDtmdW5jdGlvbiBkbCgpe3JldHVybiB2fHxsbD4wfWZ1bmN0aW9uIG1sKCl7aWYodC5wcmVSdW4pZm9yKHR5cGVvZiB0LnByZVJ1bj09ImZ1bmN0aW9uIiYmKHQucHJlUnVuPVt0LnByZVJ1bl0pO3QucHJlUnVuLmxlbmd0aDspeWwodC5wcmVSdW4uc2hpZnQoKSk7VXIoa2kpfWZ1bmN0aW9uIGhsKCl7VXIoTGkpfWZ1bmN0aW9uIHBsKCl7aWYodC5wb3N0UnVuKWZvcih0eXBlb2YgdC5wb3N0UnVuPT0iZnVuY3Rpb24iJiYodC5wb3N0UnVuPVt0LnBvc3RSdW5dKTt0LnBvc3RSdW4ubGVuZ3RoOyl4bCh0LnBvc3RSdW4uc2hpZnQoKSk7VXIoJGkpfWZ1bmN0aW9uIHlsKGwpe2tpLnVuc2hpZnQobCl9ZnVuY3Rpb24gX2wobCl7TGkudW5zaGlmdChsKX1mdW5jdGlvbiB4bChsKXskaS51bnNoaWZ0KGwpfXZhciB2ZT0wLFZlPW51bGw7ZnVuY3Rpb24gYmwobCl7dmUrKyx0Lm1vbml0b3JSdW5EZXBlbmRlbmNpZXMmJnQubW9uaXRvclJ1bkRlcGVuZGVuY2llcyh2ZSl9ZnVuY3Rpb24gZ2wobCl7aWYodmUtLSx0Lm1vbml0b3JSdW5EZXBlbmRlbmNpZXMmJnQubW9uaXRvclJ1bkRlcGVuZGVuY2llcyh2ZSksdmU9PTAmJlZlKXt2YXIgaD1WZTtWZT1udWxsLGgoKX19dC5wcmVsb2FkZWRJbWFnZXM9e30sdC5wcmVsb2FkZWRBdWRpb3M9e307ZnVuY3Rpb24gbWUobCl7dC5vbkFib3J0JiZ0Lm9uQWJvcnQobCksbD0iQWJvcnRlZCgiK2wrIikiLG0obCksQT0hMCxsKz0iLiBCdWlsZCB3aXRoIC1zIEFTU0VSVElPTlM9MSBmb3IgbW9yZSBpbmZvLiI7dmFyIGg9bmV3IFdlYkFzc2VtYmx5LlJ1bnRpbWVFcnJvcihsKTt0aHJvdyBpKGgpLGh9dmFyIHZsPSJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsIjtmdW5jdGlvbiBHaShsKXtyZXR1cm4gbC5zdGFydHNXaXRoKHZsKX12YXIgSztLPSJ0ZmxpdGUtc2ltZC53YXNtIixHaShLKXx8KEs9ZChLKSk7ZnVuY3Rpb24gemkobCl7dHJ5e2lmKGw9PUsmJngpcmV0dXJuIG5ldyBVaW50OEFycmF5KHgpO2lmKCFwKXRocm93ImJvdGggYXN5bmMgYW5kIHN5bmMgZmV0Y2hpbmcgb2YgdGhlIHdhc20gZmFpbGVkIn1jYXRjaChoKXttZShoKX19ZnVuY3Rpb24gRWwoKXtyZXR1cm4heCYmZiYmdHlwZW9mIGZldGNoPT0iZnVuY3Rpb24iP2ZldGNoKEsse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKGZ1bmN0aW9uKGwpe2lmKCFsLm9rKXRocm93ImZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgJyIrSysiJyI7cmV0dXJuIGwuYXJyYXlCdWZmZXIoKX0pLmNhdGNoKGZ1bmN0aW9uKCl7cmV0dXJuIHppKEspfSk6UHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe3JldHVybiB6aShLKX0pfWZ1bmN0aW9uIFRsKCl7dmFyIGw9e2E6Vmx9O2Z1bmN0aW9uIGgoUixrKXt2YXIgZWU9Ui5leHBvcnRzO3QuYXNtPWVlLGc9dC5hc20ucSxVaShnLmJ1ZmZlciksQnI9dC5hc20uRSxfbCh0LmFzbS5yKSxnbCgpfWJsKCk7ZnVuY3Rpb24gYihSKXtoKFIuaW5zdGFuY2UpfWZ1bmN0aW9uIHcoUil7cmV0dXJuIEVsKCkudGhlbihmdW5jdGlvbihrKXtyZXR1cm4gV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoayxsKX0pLnRoZW4oZnVuY3Rpb24oayl7cmV0dXJuIGt9KS50aGVuKFIsZnVuY3Rpb24oayl7bSgiZmFpbGVkIHRvIGFzeW5jaHJvbm91c2x5IHByZXBhcmUgd2FzbTogIitrKSxtZShrKX0pfWZ1bmN0aW9uIE0oKXtyZXR1cm4heCYmdHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nPT0iZnVuY3Rpb24iJiYhR2koSykmJnR5cGVvZiBmZXRjaD09ImZ1bmN0aW9uIj9mZXRjaChLLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbihmdW5jdGlvbihSKXt2YXIgaz1XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhSLGwpO3JldHVybiBrLnRoZW4oYixmdW5jdGlvbihlZSl7cmV0dXJuIG0oIndhc20gc3RyZWFtaW5nIGNvbXBpbGUgZmFpbGVkOiAiK2VlKSxtKCJmYWxsaW5nIGJhY2sgdG8gQXJyYXlCdWZmZXIgaW5zdGFudGlhdGlvbiIpLHcoYil9KX0pOncoYil9aWYodC5pbnN0YW50aWF0ZVdhc20pdHJ5e3ZhciBCPXQuaW5zdGFudGlhdGVXYXNtKGwsaCk7cmV0dXJuIEJ9Y2F0Y2goUil7cmV0dXJuIG0oIk1vZHVsZS5pbnN0YW50aWF0ZVdhc20gY2FsbGJhY2sgZmFpbGVkIHdpdGggZXJyb3I6ICIrUiksITF9cmV0dXJuIE0oKS5jYXRjaChpKSx7fX1mdW5jdGlvbiBVcihsKXtmb3IoO2wubGVuZ3RoPjA7KXt2YXIgaD1sLnNoaWZ0KCk7aWYodHlwZW9mIGg9PSJmdW5jdGlvbiIpe2godCk7Y29udGludWV9dmFyIGI9aC5mdW5jO3R5cGVvZiBiPT0ibnVtYmVyIj9oLmFyZz09PXZvaWQgMD9Cci5nZXQoYikoKTpCci5nZXQoYikoaC5hcmcpOmIoaC5hcmc9PT12b2lkIDA/bnVsbDpoLmFyZyl9fWZ1bmN0aW9uIEFsKGwsaCxiLHcpe21lKCJBc3NlcnRpb24gZmFpbGVkOiAiK1cobCkrIiwgYXQ6ICIrW2g/VyhoKToidW5rbm93biBmaWxlbmFtZSIsYix3P1codyk6InVua25vd24gZnVuY3Rpb24iXSl9ZnVuY3Rpb24gd2wobCxoKXttZSgiVG8gdXNlIGRsb3BlbiwgeW91IG5lZWQgdG8gdXNlIEVtc2NyaXB0ZW4ncyBsaW5raW5nIHN1cHBvcnQsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZW1zY3JpcHRlbi1jb3JlL2Vtc2NyaXB0ZW4vd2lraS9MaW5raW5nIil9ZnVuY3Rpb24gUmwobCxoKXttZSgiVG8gdXNlIGRsb3BlbiwgeW91IG5lZWQgdG8gdXNlIEVtc2NyaXB0ZW4ncyBsaW5raW5nIHN1cHBvcnQsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZW1zY3JpcHRlbi1jb3JlL2Vtc2NyaXB0ZW4vd2lraS9MaW5raW5nIil9ZnVuY3Rpb24gU2woKXttZSgiIil9dmFyIFB0O1B0PWZ1bmN0aW9uKCl7cmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpfTt2YXIgSWw9ITA7ZnVuY3Rpb24gRmwobCl7cmV0dXJuIFlbSGkoKT4+Ml09bCxsfWZ1bmN0aW9uIFBsKGwsaCl7dmFyIGI7aWYobD09PTApYj1EYXRlLm5vdygpO2Vsc2UgaWYoKGw9PT0xfHxsPT09NCkmJklsKWI9UHQoKTtlbHNlIHJldHVybiBGbCgyOCksLTE7cmV0dXJuIFlbaD4+Ml09Yi8xZTN8MCxZW2grND4+Ml09YiUxZTMqMWUzKjFlM3wwLDB9ZnVuY3Rpb24gRGwoKXtyZXR1cm4gMjE0NzQ4MzY0OH1mdW5jdGlvbiBNbChsLGgsYil7SGUuY29weVdpdGhpbihsLGgsaCtiKX1mdW5jdGlvbiBDbChsKXt0cnl7cmV0dXJuIGcuZ3JvdyhsLUJpLmJ5dGVMZW5ndGgrNjU1MzU+Pj4xNiksVWkoZy5idWZmZXIpLDF9Y2F0Y2h7fX1mdW5jdGlvbiBPbChsKXt2YXIgaD1IZS5sZW5ndGg7bD1sPj4+MDt2YXIgYj0yMTQ3NDgzNjQ4O2lmKGw+YilyZXR1cm4hMTtmb3IodmFyIHc9MTt3PD00O3cqPTIpe3ZhciBNPWgqKDErLjIvdyk7TT1NYXRoLm1pbihNLGwrMTAwNjYzMjk2KTt2YXIgQj1NYXRoLm1pbihiLFgoTWF0aC5tYXgobCxNKSw2NTUzNikpLFI9Q2woQik7aWYoUilyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBObChsKXtmb3IodmFyIGg9UHQoKTtQdCgpLWg8bDspO312YXIga3I9e307ZnVuY3Rpb24gQmwoKXtyZXR1cm4gYXx8Ii4vdGhpcy5wcm9ncmFtIn1mdW5jdGlvbiBXZSgpe2lmKCFXZS5zdHJpbmdzKXt2YXIgbD0odHlwZW9mIG5hdmlnYXRvcj09Im9iamVjdCImJm5hdmlnYXRvci5sYW5ndWFnZXMmJm5hdmlnYXRvci5sYW5ndWFnZXNbMF18fCJDIikucmVwbGFjZSgiLSIsIl8iKSsiLlVURi04IixoPXtVU0VSOiJ3ZWJfdXNlciIsTE9HTkFNRToid2ViX3VzZXIiLFBBVEg6Ii8iLFBXRDoiLyIsSE9NRToiL2hvbWUvd2ViX3VzZXIiLExBTkc6bCxfOkJsKCl9O2Zvcih2YXIgYiBpbiBrcilrcltiXT09PXZvaWQgMD9kZWxldGUgaFtiXTpoW2JdPWtyW2JdO3ZhciB3PVtdO2Zvcih2YXIgYiBpbiBoKXcucHVzaChiKyI9IitoW2JdKTtXZS5zdHJpbmdzPXd9cmV0dXJuIFdlLnN0cmluZ3N9dmFyIER0PXttYXBwaW5nczp7fSxidWZmZXJzOltudWxsLFtdLFtdXSxwcmludENoYXI6ZnVuY3Rpb24obCxoKXt2YXIgYj1EdC5idWZmZXJzW2xdO2g9PT0wfHxoPT09MTA/KChsPT09MT9fOm0pKEMoYiwwKSksYi5sZW5ndGg9MCk6Yi5wdXNoKGgpfSx2YXJhcmdzOnZvaWQgMCxnZXQ6ZnVuY3Rpb24oKXtEdC52YXJhcmdzKz00O3ZhciBsPVlbRHQudmFyYXJncy00Pj4yXTtyZXR1cm4gbH0sZ2V0U3RyOmZ1bmN0aW9uKGwpe3ZhciBoPVcobCk7cmV0dXJuIGh9LGdldDY0OmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGx9fTtmdW5jdGlvbiBVbChsLGgpe3ZhciBiPTA7cmV0dXJuIFdlKCkuZm9yRWFjaChmdW5jdGlvbih3LE0pe3ZhciBCPWgrYjtZW2wrTSo0Pj4yXT1CLGllKHcsQiksYis9dy5sZW5ndGgrMX0pLDB9ZnVuY3Rpb24ga2wobCxoKXt2YXIgYj1XZSgpO1lbbD4+Ml09Yi5sZW5ndGg7dmFyIHc9MDtyZXR1cm4gYi5mb3JFYWNoKGZ1bmN0aW9uKE0pe3crPU0ubGVuZ3RoKzF9KSxZW2g+PjJdPXcsMH1mdW5jdGlvbiBMbChsKXtqbChsKX1mdW5jdGlvbiAkbChsKXtyZXR1cm4gMH1mdW5jdGlvbiBHbChsLGgsYix3LE0pe31mdW5jdGlvbiB6bChsLGgsYix3KXtmb3IodmFyIE09MCxCPTA7QjxiO0IrKyl7Zm9yKHZhciBSPVlbaCtCKjg+PjJdLGs9WVtoKyhCKjgrNCk+PjJdLGVlPTA7ZWU8aztlZSsrKUR0LnByaW50Q2hhcihsLEhlW1IrZWVdKTtNKz1rfXJldHVybiBZW3c+PjJdPU0sMH1mdW5jdGlvbiBIbCgpe2lmKHR5cGVvZiBjcnlwdG89PSJvYmplY3QiJiZ0eXBlb2YgY3J5cHRvLmdldFJhbmRvbVZhbHVlcz09ImZ1bmN0aW9uIil7dmFyIGw9bmV3IFVpbnQ4QXJyYXkoMSk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobCksbFswXX19ZWxzZSByZXR1cm4gZnVuY3Rpb24oKXttZSgicmFuZG9tRGV2aWNlIil9fWZ1bmN0aW9uIE10KGwsaCl7TXQucmFuZG9tRGV2aWNlfHwoTXQucmFuZG9tRGV2aWNlPUhsKCkpO2Zvcih2YXIgYj0wO2I8aDtiKyspRnRbbCtiPj4wXT1NdC5yYW5kb21EZXZpY2UoKTtyZXR1cm4gMH12YXIgVmw9e2E6QWwsZTp3bCxkOlJsLGI6U2wsbjpQbCxoOkRsLGw6TWwsbTpPbCxwOk5sLGY6VWwsZzprbCxqOkxsLGk6JGwsazpHbCxjOnpsLG86TXR9O1RsKCksdC5fX193YXNtX2NhbGxfY3RvcnM9ZnVuY3Rpb24oKXtyZXR1cm4odC5fX193YXNtX2NhbGxfY3RvcnM9dC5hc20ucikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldD10LmFzbS5zKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldElucHV0TWVtb3J5T2Zmc2V0PWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldElucHV0TWVtb3J5T2Zmc2V0PXQuYXNtLnQpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0SW5wdXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0SW5wdXRIZWlnaHQ9dC5hc20udSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRJbnB1dFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldElucHV0V2lkdGg9dC5hc20udikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRJbnB1dENoYW5uZWxDb3VudD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRJbnB1dENoYW5uZWxDb3VudD10LmFzbS53KS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldE91dHB1dE1lbW9yeU9mZnNldD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRPdXRwdXRNZW1vcnlPZmZzZXQ9dC5hc20ueCkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRPdXRwdXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0T3V0cHV0SGVpZ2h0PXQuYXNtLnkpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0T3V0cHV0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0T3V0cHV0V2lkdGg9dC5hc20ueikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRPdXRwdXRDaGFubmVsQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0T3V0cHV0Q2hhbm5lbENvdW50PXQuYXNtLkEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fbG9hZE1vZGVsPWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2xvYWRNb2RlbD10LmFzbS5CKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX3J1bkluZmVyZW5jZT1mdW5jdGlvbigpe3JldHVybih0Ll9ydW5JbmZlcmVuY2U9dC5hc20uQykuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9pc0dQVUVuYWJsZWQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5faXNHUFVFbmFibGVkPXQuYXNtLkQpLmFwcGx5KG51bGwsYXJndW1lbnRzKX07dmFyIEhpPXQuX19fZXJybm9fbG9jYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4oSGk9dC5fX19lcnJub19sb2NhdGlvbj10LmFzbS5GKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LEN0O2Z1bmN0aW9uIFdsKGwpe3RoaXMubmFtZT0iRXhpdFN0YXR1cyIsdGhpcy5tZXNzYWdlPSJQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBleGl0KCIrbCsiKSIsdGhpcy5zdGF0dXM9bH1WZT1mdW5jdGlvbiBsKCl7Q3R8fExyKCksQ3R8fChWZT1sKX07ZnVuY3Rpb24gTHIobCl7aWYodmU+MHx8KG1sKCksdmU+MCkpcmV0dXJuO2Z1bmN0aW9uIGgoKXtDdHx8KEN0PSEwLHQuY2FsbGVkUnVuPSEwLCFBJiYoaGwoKSxuKHQpLHQub25SdW50aW1lSW5pdGlhbGl6ZWQmJnQub25SdW50aW1lSW5pdGlhbGl6ZWQoKSxwbCgpKSl9dC5zZXRTdGF0dXM/KHQuc2V0U3RhdHVzKCJSdW5uaW5nLi4uIiksc2V0VGltZW91dChmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0LnNldFN0YXR1cygiIil9LDEpLGgoKX0sMSkpOmgoKX10LnJ1bj1McjtmdW5jdGlvbiBqbChsLGgpe3FsKGwpfWZ1bmN0aW9uIHFsKGwpe2RsKCl8fCh0Lm9uRXhpdCYmdC5vbkV4aXQobCksQT0hMCksdShsLG5ldyBXbChsKSl9aWYodC5wcmVJbml0KWZvcih0eXBlb2YgdC5wcmVJbml0PT0iZnVuY3Rpb24iJiYodC5wcmVJbml0PVt0LnByZUluaXRdKTt0LnByZUluaXQubGVuZ3RoPjA7KXQucHJlSW5pdC5wb3AoKSgpO3JldHVybiBMcigpLGUucmVhZHl9fSgpO2NsYXNzIG9se2NvbnN0cnVjdG9yKCl7eSh0aGlzLCJzZWxlY3RlZFRGTGl0ZSIpO3kodGhpcywiaXNTSU1EU3VwcG9ydGVkIiwhMSk7eSh0aGlzLCJpc1RocmVhZHNTdXBwb3J0ZWQiLCExKTt5KHRoaXMsImlucHV0V2lkdGgiLDApO3kodGhpcywiaW5wdXRIZWlnaHQiLDApO3kodGhpcywiaW5wdXRDaGFubmVsQ291bnQiLDApO3kodGhpcywiaW5wdXRNZW1vcnlPZmZzZXQiLDApO3kodGhpcywib3V0cHV0V2lkdGgiLDApO3kodGhpcywib3V0cHV0SGVpZ2h0IiwwKTt5KHRoaXMsIm91dHB1dENoYW5uZWxDb3VudCIsMCk7eSh0aGlzLCJvdXRwdXRNZW1vcnlPZmZzZXQiLDApfX1jb25zdCBzbD0iaHR0cHM6Ly9kM29wcWptcXp4ZjA1Ny5jbG91ZGZyb250Lm5ldC92b25hZ2UtdGVuc29yZmxvdy13YXNtL3RmbGl0ZS1zaW1kLXdhc20vMS4xLjMvIixhbD0iaHR0cHM6Ly9kM29wcWptcXp4ZjA1Ny5jbG91ZGZyb250Lm5ldC9tbC9zZWxmaWVfc2VnbWVudGF0aW9uLzQuMC4wLyI7YXN5bmMgZnVuY3Rpb24gdWwocj1zbCxlPWFsKXtsZXQgdD1uZXcgb2w7dmFyIG49bmV3IFByb21pc2UoZnVuY3Rpb24oaSxvKXthc3luYyBmdW5jdGlvbiBzKCl7cmV0dXJuIGlsKHtsb2NhdGVGaWxlOmZ1bmN0aW9uKGYpe3JldHVybiByK2Z9fSl9YXN5bmMgZnVuY3Rpb24gYSh1KXtyZXR1cm4gbmV3IFByb21pc2UoYXN5bmMoZixjKT0+e2NvbnN0IGQ9dTtpZih0eXBlb2YgZD4idSIpcmV0dXJuIGMoIlRGTGl0ZSBiYWNrZW5kIHVuYXZhaWxhYmxlOiB3YXNtU2ltZCIpO2NvbnN0IHA9InNlbGZpZV9zZWdtZW50YXRpb25fbGFuZHNjYXBlIjtjb25zb2xlLmxvZygiTG9hZGluZyB0ZmxpdGUgbW9kZWw6IixwKTtsZXQgXz1lK2Ake3B9LnRmbGl0ZWA7Y29uc29sZS5sb2coIlRGTGl0ZSBtb2RlbFVybDogIitfKTt0cnl7Y29uc3QgeD1hd2FpdChhd2FpdCBmZXRjaChfKSkuYXJyYXlCdWZmZXIoKTtjb25zb2xlLmxvZygiTW9kZWwgYnVmZmVyIHNpemU6Iix4LmJ5dGVMZW5ndGgpO2NvbnN0IHY9ZC5fZ2V0TW9kZWxCdWZmZXJNZW1vcnlPZmZzZXQoKTtjb25zb2xlLmxvZygiTW9kZWwgYnVmZmVyIG1lbW9yeSBvZmZzZXQ6Iix2KSxjb25zb2xlLmxvZygiTG9hZGluZyBtb2RlbCBidWZmZXIuLi4iKSxkLkhFQVBVOC5zZXQobmV3IFVpbnQ4QXJyYXkoeCksdik7Y29uc3QgZz1kLl9sb2FkTW9kZWwoeC5ieXRlTGVuZ3RoKTtpZihjb25zb2xlLmxvZygiTG9hZCBtb2RlbCByZXN1bHQ6IixnKSxnIT09MCl7YygiQ2Fubm90IGxvYWQgbW9kZWwiKTtyZXR1cm59dC5pbnB1dFdpZHRoPWQuX2dldElucHV0V2lkdGgoKSx0LmlucHV0SGVpZ2h0PWQuX2dldElucHV0SGVpZ2h0KCksdC5pbnB1dENoYW5uZWxDb3VudD1kLl9nZXRJbnB1dENoYW5uZWxDb3VudCgpLHQuaW5wdXRNZW1vcnlPZmZzZXQ9ZC5fZ2V0SW5wdXRNZW1vcnlPZmZzZXQoKSxjb25zb2xlLmxvZygiSW5wdXQgbWVtb3J5IG9mZnNldDoiLHQuaW5wdXRNZW1vcnlPZmZzZXQpLGNvbnNvbGUubG9nKCJJbnB1dCBoZWlnaHQ6Iix0LmlucHV0SGVpZ2h0KSxjb25zb2xlLmxvZygiSW5wdXQgd2lkdGg6Iix0LmlucHV0V2lkdGgpLGNvbnNvbGUubG9nKCJJbnB1dCBjaGFubmVsczoiLHQuaW5wdXRDaGFubmVsQ291bnQpLHQub3V0cHV0TWVtb3J5T2Zmc2V0PWQuX2dldE91dHB1dE1lbW9yeU9mZnNldCgpLHQub3V0cHV0V2lkdGg9ZC5fZ2V0T3V0cHV0V2lkdGgoKSx0Lm91dHB1dEhlaWdodD1kLl9nZXRPdXRwdXRIZWlnaHQoKSx0Lm91dHB1dENoYW5uZWxDb3VudD1kLl9nZXRPdXRwdXRDaGFubmVsQ291bnQoKSxjb25zb2xlLmxvZygiT3V0cHV0IG1lbW9yeSBvZmZzZXQ6Iix0Lm91dHB1dE1lbW9yeU9mZnNldCksY29uc29sZS5sb2coIk91dHB1dCBoZWlnaHQ6Iix0Lm91dHB1dEhlaWdodCksY29uc29sZS5sb2coIk91dHB1dCB3aWR0aDoiLHQub3V0cHV0V2lkdGgpLGNvbnNvbGUubG9nKCJPdXRwdXQgY2hhbm5lbHM6Iix0Lm91dHB1dENoYW5uZWxDb3VudCksdC5zZWxlY3RlZFRGTGl0ZT1kfWNhdGNoKG0pe2MobSk7cmV0dXJufWYoKX0pfXMoKS50aGVuKHU9PntpZih1PT09bnVsbCl0aHJvdyBjb25zb2xlLmVycm9yKCJsb2FkVEZMaXRlIG51bGwiKSwibG9hZFRGTGl0ZSBudWxsIjthKHUpLnRoZW4oZj0+e2kodCl9KS5jYXRjaChmPT57Y29uc29sZS5lcnJvcigibG9hZFRGTGl0ZU1vZGVsIGVycm9yIiksbygibG9hZFRGTGl0ZU1vZGVsIGVycm9yIil9KX0pLmNhdGNoKHU9Pntjb25zb2xlLmVycm9yKCJsb2FkVEZMaXRlIGVycm9yOiIsdSksbygibG9hZFRGTGl0ZSBlcnJvcjoiK3UpfSl9KTtyZXR1cm4gbn1jbGFzcyBjbHtjb25zdHJ1Y3Rvcigpe3kodGhpcywiY2FudmFzIixuZXcgT2Zmc2NyZWVuQ2FudmFzKDAsMCkpO3kodGhpcywiY29udGV4dCIsdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgiMmQiLHt3aWxsUmVhZEZyZXF1ZW50bHk6ITB9KSk7eSh0aGlzLCJwaXhlbENvdW50IiwwKTt5KHRoaXMsImlucHV0T2Zmc2V0IiwwKTt5KHRoaXMsIm91dHB1dE9mZnNldCIsMCk7eSh0aGlzLCJpbmZvcyIpO3kodGhpcywibWFzayIpfWFzeW5jIGluaXQoZSx0KXthd2FpdCB0aGlzLmluaXRXYXNtKGUsdCksdGhpcy5pbmZvcyYmKHRoaXMuY2FudmFzLndpZHRoPXRoaXMuaW5mb3MuaW5wdXRXaWR0aCx0aGlzLmNhbnZhcy5oZWlnaHQ9dGhpcy5pbmZvcy5pbnB1dEhlaWdodCx0aGlzLnBpeGVsQ291bnQ9dGhpcy5pbmZvcy5pbnB1dFdpZHRoKnRoaXMuaW5mb3MuaW5wdXRIZWlnaHQsdGhpcy5tYXNrPW5ldyBJbWFnZURhdGEodGhpcy5pbmZvcy5pbnB1dFdpZHRoLHRoaXMuaW5mb3MuaW5wdXRIZWlnaHQpLHRoaXMuaW5wdXRPZmZzZXQ9dGhpcy5pbmZvcy5pbnB1dE1lbW9yeU9mZnNldC80LHRoaXMub3V0cHV0T2Zmc2V0PXRoaXMuaW5mb3Mub3V0cHV0TWVtb3J5T2Zmc2V0LzQpfWFzeW5jIGluaXRXYXNtKGUsdCl7dGhpcy5pbmZvcz1hd2FpdCB1bChlLHQpfWdldE91dHB1dERpbWVuc2lvbnMoKXt2YXIgZSx0LG4saTtyZXR1cm57d2lkdGg6KHQ9KGU9dGhpcy5pbmZvcyk9PW51bGw/dm9pZCAwOmUub3V0cHV0V2lkdGgpIT1udWxsP3Q6MCxoZWlnaHQ6KGk9KG49dGhpcy5pbmZvcyk9PW51bGw/dm9pZCAwOm4ub3V0cHV0SGVpZ2h0KSE9bnVsbD9pOjB9fWFzeW5jIHByb2Nlc3MoZSl7aWYoIXRoaXMubWFza3x8IXRoaXMuaW5mb3MpcmV0dXJuO2NvbnN0IHQ9dGhpcy5pbmZvcy5pbnB1dFdpZHRoLG49dGhpcy5pbmZvcy5pbnB1dEhlaWdodDt0aGlzLmNvbnRleHQuZHJhd0ltYWdlKGUsMCwwLGUud2lkdGgsZS5oZWlnaHQsMCwwLHQsbik7Y29uc3QgaT10aGlzLmNvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsMCx0LG4pLG89dGhpcy5pbmZvcy5zZWxlY3RlZFRGTGl0ZS5IRUFQRjMyO2ZvcihsZXQgcz0wO3M8dGhpcy5waXhlbENvdW50O3MrKyl7Y29uc3QgYT10aGlzLmlucHV0T2Zmc2V0K3MqMztvW2FdPWkuZGF0YVtzKjRdLzI1NSxvW2ErMV09aS5kYXRhW3MqNCsxXS8yNTUsb1thKzJdPWkuZGF0YVtzKjQrMl0vMjU1fXRoaXMuaW5mb3Muc2VsZWN0ZWRURkxpdGUuX3J1bkluZmVyZW5jZSgpO2ZvcihsZXQgcz0wO3M8dGhpcy5waXhlbENvdW50O3MrKyl7Y29uc3QgYT10aGlzLmluZm9zLnNlbGVjdGVkVEZMaXRlLkhFQVBGMzJbdGhpcy5vdXRwdXRPZmZzZXQrc107dGhpcy5tYXNrLmRhdGFbcyo0XT10aGlzLm1hc2suZGF0YVtzKjQrM109MjU1KmF9cmV0dXJuIGNyZWF0ZUltYWdlQml0bWFwKHRoaXMubWFzayl9aXNHcHVTdXBwb3J0ZWQoKXt2YXIgZSx0LG47cmV0dXJuKG49KHQ9KGU9dGhpcy5pbmZvcyk9PW51bGw/dm9pZCAwOmUuc2VsZWN0ZWRURkxpdGUpPT1udWxsP3ZvaWQgMDp0Ll9pc0dQVUVuYWJsZWQoKSkhPW51bGw/bjohMX19Y2xhc3MgZmx7Y29uc3RydWN0b3IoKXt5KHRoaXMsInNlbGZpZVNlZ21lbnRhdGlvbiIsbmV3IGNsKTt5KHRoaXMsImJhY2tncm91bmRGaWx0ZXIiKTt5KHRoaXMsInByZXZpb3VzRGltZW5zaW9ucyIse3dpZHRoOjAsaGVpZ2h0OjB9KX1hc3luYyBpbml0KGUpe2F3YWl0IHRoaXMuc2VsZmllU2VnbWVudGF0aW9uLmluaXQoZS53YXNtQXNzZXRVcmlQYXRoLGUudGZsaXRlQXNzZXRVcmlQYXRoKTtjb25zdHt3aWR0aDp0LGhlaWdodDpufT10aGlzLnNlbGZpZVNlZ21lbnRhdGlvbi5nZXRPdXRwdXREaW1lbnNpb25zKCk7dGhpcy5iYWNrZ3JvdW5kRmlsdGVyPW5ldyBubCh7Zm9yZWdyb3VuZFdpZHRoOjEsZm9yZWdyb3VuZEhlaWdodDoxLG1hc2tXaWR0aDp0LG1hc2tIZWlnaHQ6bn0pfWFzeW5jIHRyYW5zZm9ybShlLHQpe3ZhciBvLHMsYSx1O2NvbnN0IG49YXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAoZSksaT1hd2FpdCB0aGlzLnNlbGZpZVNlZ21lbnRhdGlvbi5wcm9jZXNzKG4pO2k/KChuLndpZHRoIT09dGhpcy5wcmV2aW91c0RpbWVuc2lvbnMud2lkdGh8fG4uaGVpZ2h0IT09dGhpcy5wcmV2aW91c0RpbWVuc2lvbnMuaGVpZ2h0KSYmKHRoaXMucHJldmlvdXNEaW1lbnNpb25zLndpZHRoPW4ud2lkdGgsdGhpcy5wcmV2aW91c0RpbWVuc2lvbnMuaGVpZ2h0PW4uaGVpZ2h0LGF3YWl0KChvPXRoaXMuYmFja2dyb3VuZEZpbHRlcik9PW51bGw/dm9pZCAwOm8ucmVzaXplRm9yZWdyb3VuZChuLndpZHRoLG4uaGVpZ2h0KSkpLGF3YWl0KChzPXRoaXMuYmFja2dyb3VuZEZpbHRlcik9PW51bGw/dm9pZCAwOnMucHJvY2VzcyhuLGkpKSxlLmNsb3NlKCksdC5lbnF1ZXVlKG5ldyBWaWRlb0ZyYW1lKChhPXRoaXMuYmFja2dyb3VuZEZpbHRlcik9PW51bGw/dm9pZCAwOmEuY2FudmFzLHt0aW1lc3RhbXA6KHU9ZS50aW1lc3RhbXApIT1udWxsP3U6MCxhbHBoYToiZGlzY2FyZCJ9KSkpOnQuZW5xdWV1ZShlKX1hc3luYyBzZXRCYWNrZ3JvdW5kT3B0aW9ucyhlKXt2YXIgdDthd2FpdCgodD10aGlzLmJhY2tncm91bmRGaWx0ZXIpPT1udWxsP3ZvaWQgMDp0LnNldEJhY2tncm91bmRPcHRpb25zKGUpKX1hc3luYyBzZXRWaWRlb0JHUmVhZGFibGUoZSl7dmFyIHQ7YXdhaXQoKHQ9dGhpcy5iYWNrZ3JvdW5kRmlsdGVyKT09bnVsbD92b2lkIDA6dC5zZXRWaWRlb0JHUmVhZGFibGUoZSkpfWFzeW5jIHNldFZpcnR1YWxCR0ltYWdlKGUpe3ZhciB0O2F3YWl0KCh0PXRoaXMuYmFja2dyb3VuZEZpbHRlcik9PW51bGw/dm9pZCAwOnQuc2V0VmlydHVhbEJHSW1hZ2UoZSkpfXNldEZsaWNrZXJpbmdPcHRpb25zKGUpe3ZhciB0Oyh0PXRoaXMuYmFja2dyb3VuZEZpbHRlcik9PW51bGx8fHQuc2V0RmxpY2tlcmluZ09wdGlvbnMoZSl9fWNvbnN0IE5yPWNsYXNze2NvbnN0cnVjdG9yKCl7eSh0aGlzLCJiYWNrZ3JvdW5kVHJhbnNmb3JtZXIiLG5ldyBmbCk7eSh0aGlzLCJtZWRpYVByb2Nlc3NvciIsbmV3IFRzKTt5KHRoaXMsInJhdGUiLDMwKTt5KHRoaXMsInJlc29sdmVPbk1lZGlhUHJvY2Vzc29yIik7eSh0aGlzLCJldmVudHNRdWV1ZSIsW10pfWFzeW5jIGluaXQoZSl7YXdhaXQgdGhpcy5iYWNrZ3JvdW5kVHJhbnNmb3JtZXIuaW5pdChlKSxhd2FpdCB0aGlzLm1lZGlhUHJvY2Vzc29yLnNldFRyYW5zZm9ybWVycyhbdGhpcy5iYWNrZ3JvdW5kVHJhbnNmb3JtZXJdKSx0aGlzLm1lZGlhUHJvY2Vzc29yLnNldFRyYWNrRXhwZWN0ZWRSYXRlKHRoaXMucmF0ZSksdGhpcy5tZWRpYVByb2Nlc3Nvci5vbkFueSgodCxuKT0+e3RoaXMucmVzb2x2ZU9uTWVkaWFQcm9jZXNzb3I/KHRoaXMucmVzb2x2ZU9uTWVkaWFQcm9jZXNzb3Ioe25hbWU6dCxkYXRhOm59KSx0aGlzLnJlc29sdmVPbk1lZGlhUHJvY2Vzc29yPXZvaWQgMCk6dGhpcy5ldmVudHNRdWV1ZS5wdXNoKHtuYW1lOnQsZGF0YTpufSl9KX1hc3luYyBvbk1lZGlhUHJvY2Vzc29yRXZlbnQoKXtyZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoZT0+e3RoaXMuZXZlbnRzUXVldWUubGVuZ3RoPjA/ZSh0aGlzLmV2ZW50c1F1ZXVlLnNoaWZ0KCkpOnRoaXMucmVzb2x2ZU9uTWVkaWFQcm9jZXNzb3I9ZX0pfWFzeW5jIHNldFRyYWNrRXhwZWN0ZWRSYXRlKGUpe3RoaXMucmF0ZT1lLHRoaXMubWVkaWFQcm9jZXNzb3Iuc2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl9YXN5bmMgdHJhbnNmb3JtKGUsdCl7dGhpcy5tZWRpYVByb2Nlc3Nvci50cmFuc2Zvcm0oZSx0KX1hc3luYyBzZXRCYWNrZ3JvdW5kT3B0aW9ucyhlKXt2YXIgdDthd2FpdCgodD10aGlzLmJhY2tncm91bmRUcmFuc2Zvcm1lcik9PW51bGw/dm9pZCAwOnQuc2V0QmFja2dyb3VuZE9wdGlvbnMoZSkpfXNldFZpZGVvQkdSZWFkYWJsZShlKXt0aGlzLmJhY2tncm91bmRUcmFuc2Zvcm1lci5zZXRWaWRlb0JHUmVhZGFibGUoZSl9YXN5bmMgc2V0VmlydHVhbEJHSW1hZ2UoZSl7YXdhaXQgdGhpcy5iYWNrZ3JvdW5kVHJhbnNmb3JtZXIuc2V0VmlydHVhbEJHSW1hZ2UoZSl9YXN5bmMgdGVybWluYXRlKCl7YXdhaXQgdGhpcy5tZWRpYVByb2Nlc3Nvci5kZXN0cm95KCl9c2V0RmxpY2tlcmluZ09wdGlvbnMoZSl7dGhpcy5iYWNrZ3JvdW5kVHJhbnNmb3JtZXIuc2V0RmxpY2tlcmluZ09wdGlvbnMoZSl9c2V0Vm9uYWdlTWV0YWRhdGEoZSl7dXMoZSl9fTtsZXQgTmk9TnI7KCgpPT57amkoIlByb2Nlc3NvcldvcmtlciIsTnIpfSkoKX0pKCk7Cg==",au=typeof window<"u"&&window.Blob&&new Blob([atob(cu)],{type:"text/javascript;charset=utf-8"});function k3(){const o=au&&(window.URL||window.webkitURL).createObjectURL(au);try{return o?new Worker(o):new Worker("data:application/javascript;base64,"+cu)}finally{o&&(window.URL||window.webkitURL).revokeObjectURL(o)}}class E3 extends Ks{constructor(){super(...arguments);Ht(this,"rate",30);Ht(this,"worker")}async init(r){this.worker=await q2(ts,k3),await this.worker.init(r),await this.worker.setVonageMetadata(Is()),await this.setBackgroundOptions(r),this.listenWorker()}async setTrackExpectedRate(r){var m;await((m=this.worker)==null?void 0:m.setTrackExpectedRate(r))}async setBackgroundOptions(r){var Z,I,F;const{transformerType:m}=r;switch(m){case"VideoBackground":await((Z=this.worker)==null?void 0:Z.setVideoBGReadable(await js.createVideoReadable(r.backgroundAssetUri)));break;case"VirtualBackground":await((I=this.worker)==null?void 0:I.setVirtualBGImage(await js.createImageCanvas(r.backgroundAssetUri)));break}await((F=this.worker)==null?void 0:F.setBackgroundOptions(r))}async transform(r,m){var Z;await((Z=this.worker)==null?void 0:Z.transform(r,m))}async destroy(){var r;await((r=this.worker)==null?void 0:r.terminate())}async setFlickeringOptions(r){var m;await((m=this.worker)==null?void 0:m.setFlickeringOptions(r))}async listenWorker(){var r,m,Z;for(;(r=this.worker)!=null&&r.worker;){const{name:I,data:F}=await((m=this.worker)==null?void 0:m.onMediaProcessorEvent());switch(I){case"error":case"warn":this.emit(I,F);break;case"pipelineInfo":switch(this.emit(I,F),F){case"pipeline_ended":case"pipeline_ended_with_error":await((Z=this.worker)==null?void 0:Z.terminate());return}break}}}}class du extends Ks{constructor(){super();Ht(this,"worker",new E3);Ht(this,"connector",new U2(this.worker))}async init(r){await this.worker.init(r),this.worker.onAny((m,Z)=>this.emit(m,Z))}async setBackgroundOptions(r){await this.worker.setBackgroundOptions(r)}setTrackExpectedRate(r){this.worker.setTrackExpectedRate(r)}getConnector(){return this.connector}static async create(r){const m=new this;return await m.init(r),m}}function U3(){return mi}function K3(){return pi}function M3(){return bi}function B3(){return yi}function A3(){return gi}function j3(){return Zi}function z3(){return vi}var hu=(o=>(o.FAST="FAST",o.PRECISE="PRECISE",o))(hu||{});async function P3(o){return await du.create(o)}ze.BackgroundTransformer=uu,ze.BlurRadius=Mr,ze.ErrorFunction=Hs,ze.MediapipeHelper=Gi,ze.PipelineInfoData=fi,ze.SelfieSegmentationType=hu,ze.VonageMediaProcessor=du,ze.WarningType=Fs,ze.createVonageMediaProcessor=P3,ze.getSupportedBrowserFeatures=Js,ze.getVonageFaceDetection=B3,ze.getVonageFaceMash=A3,ze.getVonageHands=K3,ze.getVonageHolistic=M3,ze.getVonageObjectron=j3,ze.getVonagePose=z3,ze.getVonageSelfieSegmentation=U3,ze.isSupported=P2,Object.defineProperties(ze,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});