Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Latest commit

 

History

History
History
2 lines (2 loc) · 405 KB

File metadata and controls

2 lines (2 loc) · 405 KB
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function e(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var t={};t.RandomOrgBadHTTPResponseError=class extends Error{constructor(e){super(e)}},t.RandomOrgInsufficientBitsError=class extends Error{#e=-1;constructor(e,t){super(e),this.#e=t}getBitsLeft(){return this.#e}},t.RandomOrgInsufficientRequestsError=class extends Error{constructor(e){super(e)}},t.RandomOrgJSONRPCError=class extends Error{constructor(e){super(e)}},t.RandomOrgKeyNotRunningError=class extends Error{constructor(e){super(e)}},t.RandomOrgRANDOMORGError=class extends Error{#t=-1;constructor(e,t=-1){super(e),this.#t=t}getCode(){return this.#t}},t.RandomOrgSendTimeoutError=class extends Error{constructor(e){super(e)}},t.RandomOrgCacheEmptyError=class extends Error{#a=!1;constructor(e,t=!1){super(e),this.#a=t}wasPaused(){return this.#a}};const{RandomOrgInsufficientBitsError:a,RandomOrgCacheEmptyError:r}=t;var n=class{#r=null;#n=null;#s=0;#i=0;#o=-1;#c=[];#l=10;#a=!1;#d=0;#u=0;#g=!1;#h=null;constructor(e,t,a,r,n,s){this.#r=e,this.#n=t,this.#l=a,this.#s=r,this.#i=n,this.#o=s,this.#f()}#f=async()=>{if(!this.#g&&!this.#a){this.#g=!0;let e=null;for(;null==this.#h;)if(this.#s>0)if(this.#c.length<=this.#l-this.#s)try{e=await this.#r(this.#n),this.#m(e,!0)}catch(t){if(t instanceof a){let a=t.getBitsLeft();if(a>this.#o){let t=Math.floor(a/this.#o);this.#n.params.n=t*this.#i,e=await this.#r(this.#n),this.#m(e,!0),this.#n.params.n=this.#s*this.#i}else this.#h=t}else this.#h=t}else break;else if(this.#c.length<this.#l)try{e=await this.#r(this.#n),this.#m(e,!1)}catch(e){this.#h=e}else break;this.#g=!1}};stop(){this.#a=!0}resume(){this.#a=!1,this.#p()}isPaused(){return this.#a}get(){if(null!=this.#h)throw this.#h;if(this.#c&&0==this.#c.length)if(this.#a)throw new r("The RandomOrgCache stack is empty and the cache is paused. Please call resume() to restart populating the cache.",!0);else throw new r("The RandomOrgCache stack is empty, please wait for it to repopulate itself.");else{let e=this.#c.pop();return this.#p(),e}}async getOrWait(){try{return this.get()}catch(e){if(e instanceof r){if(this.#a)throw e;if(0==await this.#f())await new Promise((e=>setTimeout(e,50)));return this.getOrWait()}}}getCachedValues(){return this.#c.length}getBitsUsed(){return this.#d}getRequestsUsed(){return this.#u}#p=()=>{if(this.#s>0&&this.#c.length<=this.#l-this.#s)this.#f();else if(this.#s<=0&&this.#c.length<this.#l)this.#f()};#m=(e,t)=>{if(this.#u++,this.#d+=e.result.bitsUsed,t){let t=e.result.random.data;for(let e=0;e<t.length;e+=this.#i)this.#c.push(t.slice(e,e+this.#i))}else this.#c.push(e.result.random.data)}};const{RandomOrgBadHTTPResponseError:s,RandomOrgInsufficientBitsError:i,RandomOrgInsufficientRequestsError:o,RandomOrgJSONRPCError:c,RandomOrgKeyNotRunningError:l,RandomOrgRANDOMORGError:d,RandomOrgSendTimeoutError:u}=t,g=n;var h=class e{static#E="generateIntegers";static#R="generateIntegerSequences";static#y="generateDecimalFractions";static#w="generateGaussians";static#S="generateStrings";static#b="generateUUIDs";static#O="generateBlobs";static#q="getUsage";static#I="generateSignedIntegers";static#D="generateSignedIntegerSequences";static#T="generateSignedDecimalFractions";static#v="generateSignedGaussians";static#U="generateSignedStrings";static#k="generateSignedUUIDs";static#A="generateSignedBlobs";static#_="getResult";static#z="createTickets";static#B="listTickets";static#M="revealTickets";static#N="getTicket";static#C="verifySignature";static BLOB_FORMAT_BASE64="base64";static BLOB_FORMAT_HEX="hex";static DEFAULT_REPLACEMENT=!0;static DEFAULT_BASE=10;static DEFAULT_USER_DATA=null;static DEFAULT_TICKET_ID=null;static DEFAULT_PREGENERATED_RANDOMIZATION=null;static DEFAULT_LICENSE_DATA=null;static UUID_SIZE=122;static DEFAULT_BLOCKING_TIMEOUT=864e5;static DEFAULT_HTTP_TIMEOUT=12e4;static MAX_URL_LENGTH=2046;static#L=1e3;static#x=36e5;#G=-1;#H=-1;#P=-1;#F="";#K="";#V=e.DEFAULT_BLOCKING_TIMEOUT;#j=e.DEFAULT_HTTP_TIMEOUT;#J=0;#Z=0;static#Y={};static#X=[100,101,200,201,202,203,204,300,301,302,303,304,305,306,307,400,401,402,403,404,405,420,421,422,423,424,425,426,500,32e3];constructor(t,a={}){if(e.#Y&&e.#Y[t])return e.#Y[t];else this.#K=t,this.#V=a.blockingTimeout||864e5,this.#j=a.httpTimeout||12e4,e.#Y[t]=this}async generateIntegers(e,t,a,r={}){let n=this.#W(e,t,a,r);return this.#$(this.#Q(n))}async generateIntegerSequences(e,t,a,r,n={}){let s=this.#ee(e,t,a,r,n);return this.#$(this.#Q(s))}async generateDecimalFractions(e,t,a={}){let r=this.#te(e,t,a);return this.#$(this.#Q(r))}async generateGaussians(e,t,a,r,n={}){let s=this.#ae(e,t,a,r,n);return this.#$(this.#Q(s))}async generateStrings(e,t,a,r={}){let n=this.#re(e,t,a,r);return this.#$(this.#Q(n))}async generateUUIDs(e,t={}){let a=this.#ne(e,t);return this.#$(this.#Q(a))}async generateBlobs(e,t,a={}){let r=this.#se(e,t,a);return this.#$(this.#Q(r))}async generateSignedIntegers(e,t,a,r={}){let n=this.#W(e,t,a,r,!0);return this.#ie(this.#Q(n))}async generateSignedIntegerSequences(e,t,a,r,n={}){let s=this.#ee(e,t,a,r,n,!0);return this.#ie(this.#Q(s))}async generateSignedDecimalFractions(e,t,a={}){let r=this.#te(e,t,a,!0);return this.#ie(this.#Q(r))}async generateSignedGaussians(e,t,a,r,n={}){let s=this.#ae(e,t,a,r,n,!0);return this.#ie(this.#Q(s))}async generateSignedStrings(e,t,a,r={}){let n=this.#re(e,t,a,r,!0);return this.#ie(this.#Q(n))}async generateSignedUUIDs(e,t={}){let a=this.#ne(e,t,!0);return this.#ie(this.#Q(a))}async generateSignedBlobs(e,t,a={}){let r=this.#se(e,t,a,!0);return this.#ie(this.#Q(r))}async verifySignature(t,a){let r={random:t,signature:a},n=this.#oe(e.#C,r);return this.#ce(this.#Q(n))}async getBitsLeft(){let t=Date.now()>this.#Z+e.#x;if(this.#G<0||t)await this.#le();return this.#G}async getRequestsLeft(){let t=Date.now()>this.#Z+e.#x;if(this.#H<0||t)await this.#le();return this.#H}async getResult(t){let a={serialNumber:t},r=this.#de(e.#_,a);return this.#ie(this.#Q(r))}async createTickets(t,a){let r={n:t,showResult:a},n=this.#de(e.#z,r);return this.#ue(this.#Q(n))}async revealTickets(t){let a={ticketId:t},r=this.#de(e.#M,a);return this.#ue(this.#Q(r))}async listTickets(t){let a={ticketType:t},r=this.#de(e.#B,a);return this.#ue(this.#Q(r))}async getTicket(t){let a={ticketId:t},r=this.#oe(e.#N,a);return this.#ue(this.#Q(r))}createUrl(t,a){let r="https://api.random.org/signatures/form?format=json";if(r+="&random="+this.#ge(JSON.stringify(t)),r+="&signature="+this.#ge(a),r.length>e.MAX_URL_LENGTH)throw new d("Error: URL exceeds maximum length("+e.MAX_URL_LENGTH+" characters).");return r}createHtml(e,t){let a="<form action='https://api.random.org/signatures/form' method='post'>\n";return a+=" "+this.#he("hidden","format","json")+"\n",a+=" "+this.#he("hidden","random",JSON.stringify(e))+"\n",a+=" "+this.#he("hidden","signature",t)+"\n",a+=" <input type='submit' value='Validate' />\n</form>",a}createIntegerCache(e,t,a,r={}){let n=r.cacheSize||20;if(n<2)n=2;let s=this.#W(e,t,a,r),i=Math.ceil(Math.log(a-t+1)/Math.log(2)*e),o=0;if(!("replacement"in r)||!0===r.replacement)o=n/2,s.params.n=e*o;return new g(this.#Q.bind(this),s,n,o,e,i)}createIntegerSequenceCache(e,t,a,r,n={}){let s=n.cacheSize||20;if(s<2)s=2;let i,o=Math.ceil(Math.log(this.#fe(r)-this.#me(a),1)/Math.log(2)*e*this.#fe(t)),c=0;if(n.replacement&&Array.isArray(n.replacement))i=n.replacement.every((e=>!0===e));else i=n.replacement||!0;if(i){if(c=s/2,Array.isArray(t))t=this.#pe(t,c);if(Array.isArray(a))a=this.#pe(a,c);if(Array.isArray(r))r=this.#pe(r,c);if(n.replacement&&Array.isArray(n.replacement))n.replacement=this.#pe(n.replacement,c);if(n.base&&Array.isArray(n.base))n.base=this.#pe(n.base,c)}let l=this.#ee(e,t,a,r,n);if(i)l.params.n=c*e;return new g(this.#Q.bind(this),l,s,c,e,o)}createDecimalFractionCache(e,t,a={}){let r=a.cacheSize||20;if(r<2)r=2;let n=this.#te(e,t,a),s=0;if(!("replacement"in a)||!0===a.replacement)s=r/2,n.params.n=e*s;let i=Math.ceil(Math.log(10)/Math.log(2)*t*e);return new g(this.#Q.bind(this),n,r,s,e,i)}createGaussianCache(e,t,a,r,n={}){let s=n.cacheSize||20;if(s<2)s=2;let i=Math.ceil(Math.log(Math.pow(10,r))/Math.log(2)*e),o=s/2,c=this.#ae(e*o,t,a,r);return new g(this.#Q.bind(this),c,s,o,e,i)}createStringCache(e,t,a,r={}){let n=r.cacheSize||20;if(n<2)n=2;let s=this.#re(e,t,a,r),i=Math.ceil(Math.log(a.length)/Math.log(2)*t*e),o=0;if(!("replacement"in r)||!0===r.replacement)o=n/2,s.params.n=e*o;return new g(this.#Q.bind(this),s,n,o,e,i)}createUUIDCache(t,a={}){let r=a.cacheSize||10;if(r<2)r=2;let n=t*e.UUID_SIZE,s=r/2,i=this.#ne(t*s);return new g(this.#Q.bind(this),i,r,s,t,n)}createBlobCache(e,t,a={}){let r=a.cacheSize||10;if(r<2)r=2;let n=e*t,s=r/2,i=this.#se(e*s,t,a);return new g(this.#Q.bind(this),i,r,s,e,n)}#Q=async function(t){if(-1!=this.#P)if(Date.now()<this.#P)throw new o(this.#F);else this.#P=-1,this.#F=null;let a=this.#J-(Date.now()-this.#Z);if(-1!=this.#V&&a>this.#V)throw new u("The server advisory delay of "+a+"millis is greater than the defined maximum allowed blocking time of "+this.#V+"millis.");if(a>0)await new Promise((e=>setTimeout(e,a)));let r=this.#j;return new Promise((function(e){let a=new XMLHttpRequest;a.open("POST","https://api.random.org/json-rpc/4/invoke"),a.setRequestHeader("Content-Type","application/json"),a.ontimeout=function(){throw new u("The maximum allowed blocking time of "+r+"millis has been exceeded while waiting for the server to respond.")},a.onload=function(){if(this.status>=200&&this.status<300)e(a.responseText);else throw new s("Error: "+a.status)},a.onerror=function(e){if(e instanceof Error)throw e;else throw console.info("** An error occurred during the transaction."),new Error(a.responseText)},a.timeout=r,a.send(JSON.stringify(t))})).then((a=>{if((a=JSON.parse(a)).error){let t=a.error.code,r=a.error.message,n=a.error.data;if(401==t)throw new l("Error "+t+": "+r);else if(402==t){let e=(new Date).setUTCHours(0,0,0,0);throw this.#P=+e,this.#F="Error "+t+": "+r,this.#H=n[1],new o(this.#F)}else if(403==t)throw this.#G=n[1],new i("Error"+t+": "+r,this.#G);else if(e.#X.includes(t))throw new d("Error "+t+": "+r,t);else throw new c("Error "+t+": "+r)}if(![e.#C,e.#_,e.#z,e.#B,e.#N].includes(t.method))if(this.#H=a.result.requestsLeft,this.#G=a.result.bitsLeft,a.result.advisoryDelay)this.#J=a.result.advisoryDelay;else this.#J=e.#L;else this.#J=e.#L;return this.#Z=Date.now(),a}))};#le=async()=>{let t=this.#de(e.#q,{});return this.#ue(this.#Q(t))};#oe=(e,t)=>({jsonrpc:"2.0",method:e,params:t,id:this.#Ee()});#de=(e,t)=>(t.apiKey=this.#K,this.#oe(e,t));#$=async e=>e.then((e=>e.result.random.data));#ie=async e=>e.then((e=>({data:e.result.random.data,random:e.result.random,signature:e.result.signature})));#ce=async e=>e.then((e=>e.result.authenticity));#ue=async e=>e.then((e=>e.result));#W=(t,a,r,{replacement:n=!0,base:s=10,pregeneratedRandomization:i=null,licenseData:o=null,userData:c=null,ticketId:l=null}={},d=!1)=>{let u={n:t,min:a,max:r,replacement:n,base:s};u=this.#Re(u,i,o,c,l,d);let g=d?e.#I:e.#E;return this.#de(g,u)};#ee=(t,a,r,n,{replacement:s=!0,base:i=10,pregeneratedRandomization:o=null,licenseData:c=null,userData:l=null,ticketId:d=null}={},u=!1)=>{let g={n:t,length:a,min:r,max:n,replacement:s,base:i};g=this.#Re(g,o,c,l,d,u);let h=u?e.#D:e.#R;return this.#de(h,g)};#te=(t,a,{replacement:r=!0,pregeneratedRandomization:n=null,licenseData:s=null,userData:i=null,ticketId:o=null}={},c=!1)=>{let l={n:t,decimalPlaces:a,replacement:r};l=this.#Re(l,n,s,i,o,c);let d=c?e.#T:e.#y;return this.#de(d,l)};#ae=(t,a,r,n,{pregeneratedRandomization:s=null,licenseData:i=null,userData:o=null,ticketId:c=null}={},l=!1)=>{let d={n:t,mean:a,standardDeviation:r,significantDigits:n};d=this.#Re(d,s,i,o,c,l);let u=l?e.#v:e.#w;return this.#de(u,d)};#re=(t,a,r,{replacement:n=!0,pregeneratedRandomization:s=null,licenseData:i=null,userData:o=null,ticketId:c=null}={},l=!1)=>{let d={n:t,length:a,characters:r,replacement:n};d=this.#Re(d,s,i,o,c,l);let u=l?e.#U:e.#S;return this.#de(u,d)};#ne=(t,{pregeneratedRandomization:a=null,licenseData:r=null,userData:n=null,ticketId:s=null}={},i=!1)=>{let o={n:t};o=this.#Re(o,a,r,n,s,i);let c=i?e.#k:e.#b;return this.#de(c,o)};#se=(t,a,{format:r=this.BASE64,pregeneratedRandomization:n=null,licenseData:s=null,userData:i=null,ticketId:o=null},c=!1)=>{let l={n:t,size:a,format:r};l=this.#Re(l,n,s,i,o,c);let d=c?e.#A:e.#O;return this.#de(d,l)};#Re=(e,t,a,r,n,s=!1)=>{if(e.pregeneratedRandomization=t,s)e.licenseData=a,e.userData=r,e.ticketId=n;return e};#pe=(e,t)=>Array.from({length:t},(()=>e)).flat();#fe=e=>{if(Array.isArray(e))return e.reduce((function(e,t){return Math.max(e,t)}));else return e};#me=e=>{if(Array.isArray(e))return e.reduce((function(e,t){return Math.min(e,t)}));else return e};#ge=e=>{if(!/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/.test(e))try{if(window)e=btoa(e)}catch(t){if(t instanceof ReferenceError)e=Buffer.from(e).toString("base64")}return e=(e=(e=e.replace(/=/g,"%3D")).replace(/\+/g,"%2B")).replace(/\//g,"%2F")};#he=(e,t,a)=>"<input type='"+e+"' name='"+t+"' value='"+a+"' />";#Ee=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(function(e){var t=16*Math.random()|0;return("x"==e?t:3&t|8).toString(16)}))},f=e(h);let m=t.RandomOrgRANDOMORGError,p=(t.RandomOrgBadHTTPResponseError,t.RandomOrgInsufficientBitsError,t.RandomOrgInsufficientRequestsError,t.RandomOrgJSONRPCError,t.RandomOrgKeyNotRunningError,t.RandomOrgSendTimeoutError,t.RandomOrgCacheEmptyError);const E="YOUR_API_KEY_HERE",R=new f(E),y=!0,w=[3,4,5,6],S=[0,10,20,30],b=[40,50,60,70],O=[!1,!0,!1,!0],q=[2,8,10,16],I="abcdefghijklmnopqrstuvwxyz",D={date:"2010-12-31"},T={id:"foo"},v={foo:"bar"},U=f.BLOB_FORMAT_BASE64,k=f.BLOB_FORMAT_HEX;let A=0,_=0;!async function(){A=await R.getRequestsLeft(),_=await R.getBitsLeft()}(),describe("Errors",(function(){it("RandomOrgRANDOMORGError 202: parameter out of range",(async function(){try{await R.generateIntegers(1e5,0,10);assert.fail("Should have thrown RandomOrgRANDOMORGError 202.")}catch(e){if(y)console.log(e.message);assert(e instanceof m&&202==e.getCode(),"Should have thrown RandomOrgRANDOMORGError 202, instead threw "+e.message)}})),it("RandomOrgRANDOMORGError 203: parameter is too long",(async function(){try{await R.generateIntegerSequences(3,w,S,b);assert.fail("Should have thrown RandomOrgRANDOMORGError 203.")}catch(e){if(y)console.log(e.message);assert(e instanceof m&&203==e.getCode(),"Should have thrown RandomOrgRANDOMORGError 203, instead threw "+e.message)}})),it("RandomOrgRANDOMORGError 204: parameter is too short",(async function(){try{await R.generateIntegerSequences(4,[1],S,b);assert.fail("Should have thrown RandomOrgRANDOMORGError 204.")}catch(e){if(y)console.log(e.message);assert(e instanceof m&&204==e.getCode(),"Should have thrown RandomOrgRANDOMORGError 204, instead threw "+e.message)}})),it("RandomOrgRANDOMORGError 300: parameter must be less than another",(async function(){try{await R.generateIntegers(10,10,0);assert.fail("Should have thrown RandomOrgRANDOMORGError 300.")}catch(e){if(y)console.log(e.message);assert(e instanceof m&&300==e.getCode(),"Should have thrown RandomOrgRANDOMORGError 300, instead threw "+e.message)}})),it("RandomOrgRANDOMORGError 301: replacement/domain error",(async function(){try{await R.generateIntegers(20,0,9,{replacement:!1});assert.fail("Should have thrown RandomOrgRANDOMORGError 301.")}catch(e){if(y)console.log(e.message);assert(e instanceof m&&301==e.getCode(),"Should have thrown RandomOrgRANDOMORGError 301, instead threw "+e.message)}})),it("RandomOrgRANDOMORGError 400: API key does not exist",(async function(){let e=new f("ffffffff-ffff-ffff-ffff-ffffffffffff");try{await e.generateIntegers(5,0,10);assert.fail("Should have thrown RandomOrgRANDOMORGError 400.")}catch(e){if(y)console.log(e.message);assert(e instanceof m&&400==e.getCode(),"Should have thrown RandomOrgRANDOMORGError 400, instead threw "+e.message)}})),it("RandomOrgRANDOMORGError 420: ticket does not exist",(async function(){try{await R.generateSignedUUIDs(1,{ticketId:"ffffffffffffffff"});assert.fail("Should have thrown RandomOrgRANDOMORGError 420.")}catch(e){if(y)console.log(e.message);assert(e instanceof m&&420==e.getCode(),"Should have thrown RandomOrgRANDOMORGError 420, instead threw "+e.message)}})),it("RandomOrgRANDOMORGError 421: ticket exists, but not for specified API key",(async function(){try{await R.generateSignedUUIDs(1,{ticketId:"d5b8f6d03f99a134"});assert.fail("Should have thrown RandomOrgRANDOMORGError 421.")}catch(e){if(y)console.log(e.message);assert(e instanceof m&&421==e.getCode(),"Should have thrown RandomOrgRANDOMORGError 421, instead threw "+e.message)}})),it("RandomOrgRANDOMORGError 422: ticket has already been used",(async function(){try{let e=(await R.createTickets(1,!0))[0].ticketId;if(y)console.log("ticket id: "+e);await R.generateSignedUUIDs(1,{ticketId:e}),await R.generateSignedUUIDs(1,{ticketId:e});assert.fail("Should have thrown RandomOrgRANDOMORGError 422.")}catch(e){if(y)console.log(e.message);assert(e instanceof m&&422==e.getCode())}})),it("RandomOrgRANDOMORGError 426: ticket has not yet been used",(async function(){let e=await R.createTickets(1,!1);try{await R.revealTickets(e[0].ticketId);assert.fail("Should have thrown RandomOrgRANDOMORGError 426.")}catch(e){if(y)console.log(e.message);assert(e instanceof m&&426==e.getCode(),"Should have thrown RandomOrgRANDOMORGError 426, instead threw "+e.message)}}))})),describe("General",(function(){it("reusing an API key returns a previously created instance",(function(){let e=new f(E);assert(R==e,"Error: did not return the same instance.")})),it("a different API key returns a new instance",(function(){let e=new f("ffffffff-ffff-ffff-ffff-ffffffffffff");assert(R!=e,"Error: returned the same instance.")})),it("getRequestsLeft()",(async function(){let e=await R.getRequestsLeft();if(assert(e>=0,"Error: should have returned a number >= 0, instead retuned "+e),y)console.log("requests remaining: "+e)})),it("getBitsLeft()",(async function(){let e=await R.getBitsLeft();if(assert(e>=0,"Error: should have returned a number >= 0, instead retuned "+e),y)console.log("bits remaining: "+e)}))})),describe("Basic",(function(){describe("Integers",(function(){it("decimal integers",(async function(){let e=await R.generateIntegers(5,0,10);if(assert(e.every((e=>"number"==typeof e)),"Error: should have returned an array of numbers."),y)console.log("decimal integers: "+e)})),it("pregenerated decimal integers (date)",(async function(){let e=await R.generateIntegers(5,0,10,{pregeneratedRandomization:D}),t=await R.generateIntegers(5,0,10,{pregeneratedRandomization:D});if(assert.deepEqual(e,t),y)console.log("pregenerated decimal integers (date): "+e+" / "+t)})),it("pregenerated decimal integers (id)",(async function(){let e=await R.generateIntegers(5,0,10,{pregeneratedRandomization:T}),t=await R.generateIntegers(5,0,10,{pregeneratedRandomization:T});if(assert.deepEqual(e,t),y)console.log("pregenerated decimal integers (id): "+e+" / "+t)})),it("non-decimal integers",(async function(){let e=await R.generateIntegers(5,0,10,{replacement:!1,base:2});if(assert(e.every((e=>"string"==typeof e)),"Error: should have returned an array of strings."),y)console.log("non-decimal integers: "+e)})),it("pregenerated non-decimal integers (date)",(async function(){let e=await R.generateIntegers(5,0,10,{replacement:!1,base:2,pregeneratedRandomization:D}),t=await R.generateIntegers(5,0,10,{replacement:!1,base:2,pregeneratedRandomization:D});if(assert.deepEqual(e,t),y)console.log("pregenerated non-decimal integers (date): "+e+" / "+t)})),it("pregenerated non-decimal integers (id)",(async function(){let e=await R.generateIntegers(5,0,10,{replacement:!1,base:2,pregeneratedRandomization:T}),t=await R.generateIntegers(5,0,10,{replacement:!1,base:2,pregeneratedRandomization:T});if(assert.deepEqual(e,t),y)console.log("pregenerated non-decimal integers (id): "+e+" / "+t)}))})),describe("Integer Sequences",(function(){it("uniform decimal integer sequences",(async function(){let e=await R.generateIntegerSequences(3,5,0,10);if(assert(e.every((e=>e.every((e=>"number"==typeof e)))),"Error: should have returned a 2D array of numbers."),y)console.log("uniform decimal integer sequences: "),console.table(e)})),it("uniform pregenerated decimal integer sequences (date)",(async function(){let e=await R.generateIntegerSequences(3,5,0,10,{pregeneratedRandomization:D}),t=await R.generateIntegerSequences(3,5,0,10,{pregeneratedRandomization:D});if(assert.deepEqual(e,t),y)console.log("uniform pregenerated decimal integers sequences (date): "),console.table(e),console.table(t)})),it("uniform pregenerated decimal integer sequences (id)",(async function(){let e=await R.generateIntegerSequences(3,5,0,10,{pregeneratedRandomization:T}),t=await R.generateIntegerSequences(3,5,0,10,{pregeneratedRandomization:T});if(assert.deepEqual(e,t),y)console.log("uniform pregenerated decimal integers sequences (id): "),console.table(e),console.table(t)})),it("uniform non-decimal integers",(async function(){let e=await R.generateIntegerSequences(3,5,0,10,{base:2});if(assert(e.every((e=>e.every((e=>"string"==typeof e)))),"Error: should have returned a 2D array of strings."),y)console.log("uniform non-decimal integer sequences: "),console.table(e)})),it("uniform pregenerated non-decimal integer sequences (date)",(async function(){let e=await R.generateIntegerSequences(3,5,0,10,{base:2,pregeneratedRandomization:D}),t=await R.generateIntegerSequences(3,5,0,10,{base:2,pregeneratedRandomization:D});if(assert.deepEqual(e,t),y)console.log("uniform pregenerated non-decimal integers sequences (date): "),console.table(e),console.table(t)})),it("uniform pregenerated non-decimal integer sequences (id)",(async function(){let e=await R.generateIntegerSequences(3,5,0,10,{base:2,pregeneratedRandomization:T}),t=await R.generateIntegerSequences(3,5,0,10,{base:2,pregeneratedRandomization:T});if(assert.deepEqual(e,t),y)console.log("uniform pregenerated non-decimal integers sequences (id): "),console.table(e),console.table(t)})),it("multiform integer sequences",(async function(){let e=await R.generateIntegerSequences(4,w,S,b,{replacement:O,base:q});if(assert(e.every(((e,t)=>e.every((e=>typeof e===(10==q[t]?"number":"string"))))),"Error: the type of the values in the 2D array was not as expected."),y)console.log("multiform integer sequences: "),console.table(e)})),it("multiform pregenerated integer sequences (date)",(async function(){let e=await R.generateIntegerSequences(4,w,S,b,{replacement:O,base:q,pregeneratedRandomization:D}),t=await R.generateIntegerSequences(4,w,S,b,{replacement:O,base:q,pregeneratedRandomization:D});if(assert.deepEqual(e,t),y)console.log("multiform pregenerated integers sequences (date): "),console.table(e),console.table(t)})),it("multiform pregenerated integer sequences (id)",(async function(){let e=await R.generateIntegerSequences(4,w,S,b,{replacement:O,base:q,pregeneratedRandomization:T}),t=await R.generateIntegerSequences(4,w,S,b,{replacement:O,base:q,pregeneratedRandomization:T});if(assert.deepEqual(e,t),y)console.log("multiform pregenerated integers sequences (id): "),console.table(e),console.table(t)}))})),describe("Decimal Fractions",(function(){it("decimal fractions",(async function(){let e=await R.generateDecimalFractions(5,4,{replacement:!1});if(assert(e.every((e=>"number"==typeof e)),"Error: should have returned an array of numbers."),y)console.log("decimal fractions: "+e)})),it("pregenerated decimal fractions (date)",(async function(){let e=await R.generateDecimalFractions(5,4,{pregeneratedRandomization:D}),t=await R.generateDecimalFractions(5,4,{pregeneratedRandomization:D});if(assert.deepEqual(e,t),y)console.log("pregenerated decimal fractions (date): "+e+" / "+t)})),it("pregenerated decimal fractions (id)",(async function(){let e=await R.generateDecimalFractions(5,4,{pregeneratedRandomization:T}),t=await R.generateDecimalFractions(5,4,{pregeneratedRandomization:T});if(assert.deepEqual(e,t),y)console.log("pregenerated decimal fractions (id): "+e+" / "+t)}))})),describe("Gaussians",(function(){it("gaussians",(async function(){let e=await R.generateGaussians(5,3.41,2.1,4);if(assert(e.every((e=>"number"==typeof e)),"Error: should have returned an array of numbers."),y)console.log("gaussians: "+e)})),it("pregenerated gaussians (date)",(async function(){let e=await R.generateGaussians(5,3.41,2.1,4,{pregeneratedRandomization:D}),t=await R.generateGaussians(5,3.41,2.1,4,{pregeneratedRandomization:D});if(assert.deepEqual(e,t),y)console.log("pregenerated gaussians (date): "+e+" / "+t)})),it("pregenerated gaussians (id)",(async function(){let e=await R.generateGaussians(5,3.41,2.1,4,{pregeneratedRandomization:T}),t=await R.generateGaussians(5,3.41,2.1,4,{pregeneratedRandomization:T});if(assert.deepEqual(e,t),y)console.log("pregenerated gaussians (id): "+e+" / "+t)}))})),describe("Strings",(function(){it("strings, lowercase English alphabet",(async function(){let e=await R.generateStrings(3,5,I);if(assert(e.every((e=>"string"==typeof e)),"Error: should have returned an array of strings."),y)console.log("strings, lowercase English alphabet: "+e)})),it("pregenerated strings, lowercase English alphabet (date)",(async function(){let e=await R.generateStrings(3,5,I,{replacement:!1,pregeneratedRandomization:D}),t=await R.generateStrings(3,5,I,{replacement:!1,pregeneratedRandomization:D});if(assert.deepEqual(e,t),y)console.log("pregenerated strings, lowercase English alphabet (date): "+e+" / "+t)})),it("pregenerated strings, lowercase English alphabet (id)",(async function(){let e=await R.generateStrings(3,5,I,{replacement:!1,pregeneratedRandomization:T}),t=await R.generateStrings(3,5,I,{replacement:!1,pregeneratedRandomization:T});if(assert.deepEqual(e,t),y)console.log("pregenerated strings, lowercase English alphabet (id): "+e+" / "+t)}))})),describe("UUIDs",(function(){it("UUIDs",(async function(){let e=await R.generateUUIDs(3);if(assert(e.every((e=>B(e))),"Error: should have returned an array of UUIDs."),y)console.log("UUIDs: "+e)})),it("pregenerated UUIDs (date)",(async function(){let e=await R.generateUUIDs(3,{pregeneratedRandomization:D}),t=await R.generateUUIDs(3,{pregeneratedRandomization:D});if(assert.deepEqual(e,t),y)console.log("pregenerated UUIDs (date): "+e+" / "+t)})),it("pregenerated UUIDs (id)",(async function(){let e=await R.generateUUIDs(3,{pregeneratedRandomization:T}),t=await R.generateUUIDs(3,{pregeneratedRandomization:T});if(assert.deepEqual(e,t),y)console.log("pregenerated UUIDs (id): "+e+" / "+t)}))})),describe("BLOBs",(function(){it("BLOBs, 128-bit, base64",(async function(){let e=await R.generateBlobs(3,128);if(assert(e.every((e=>M(e))),"Error: should have returned an array of base64 BLOBs."),y)console.log("BLOBs, 128-bit, base64: "+e)})),it("BLOBs, 128-bit, hex",(async function(){let e=await R.generateBlobs(3,128,{format:k});if(assert(e.every((e=>N(e,128))),"Error: should have returned an array of hex BLOBs."),y)console.log("BLOBs, 128-bit, hex: "+e)})),it("pregenerated BLOBs (date)",(async function(){let e=await R.generateBlobs(3,64,{format:k,pregeneratedRandomization:D}),t=await R.generateBlobs(3,64,{format:k,pregeneratedRandomization:D});if(assert.deepEqual(e,t),assert(e.every((e=>N(e,64))),"Error: should have returned an array of hex BLOBs."),y)console.log("pregenerated BLOBs (date): "+e+" / "+t)})),it("pregenerated BLOBs (id)",(async function(){let e=await R.generateBlobs(3,64,{format:k,pregeneratedRandomization:T}),t=await R.generateBlobs(3,64,{format:k,pregeneratedRandomization:T});if(assert.deepEqual(e,t),assert(e.every((e=>N(e,64))),"Error: should have returned an array of hex BLOBs."),y)console.log("pregenerated BLOBs (id): "+e+" / "+t)}))}))})),describe("Signed",(function(){describe("Integers",(function(){it("decimal integers",(async function(){let e=await R.generateSignedIntegers(5,0,10,{userData:v});return z(e,"number",!0,"decimal integers")})),it("pregenerated decimal integers (date)",(async function(){let e=await R.generateSignedIntegers(5,0,10,{pregeneratedRandomization:D}),t=await R.generateSignedIntegers(5,0,10,{pregeneratedRandomization:D});if(assert.deepEqual(e.data,t.data),y)console.log("pregenerated decimal integers (date): "+e.data+" / "+t.data)})),it("pregenerated decimal integers (id)",(async function(){let e=await R.generateSignedIntegers(5,0,10,{pregeneratedRandomization:T}),t=await R.generateSignedIntegers(5,0,10,{pregeneratedRandomization:T});if(assert.deepEqual(e.data,t.data),y)console.log("pregenerated decimal integers (id): "+e.data+" / "+t.data)})),it("non-decimal integers",(async function(){let e=await R.generateSignedIntegers(5,0,10,{base:2,userData:v});return z(e,"string",!0,"non-decimal integers")})),it("pregenerated non-decimal integers (date)",(async function(){let e=await R.generateSignedIntegers(5,0,10,{base:2,pregeneratedRandomization:D}),t=await R.generateSignedIntegers(5,0,10,{base:2,pregeneratedRandomization:D});if(assert.deepEqual(e.data,t.data),y)console.log("pregenerated non-decimal integers (date): "+e.data+" / "+t.data)})),it("pregenerated non-decimal integers (id)",(async function(){let e=await R.generateSignedIntegers(5,0,10,{base:2,pregeneratedRandomization:T}),t=await R.generateSignedIntegers(5,0,10,{base:2,pregeneratedRandomization:T});if(assert.deepEqual(e.data,t.data),y)console.log("pregenerated non-decimal integers (id): "+e.data+" / "+t.data)}))})),describe("Integer Sequences",(function(){it("uniform decimal integer sequences",(async function(){let e=await R.generateSignedIntegerSequences(3,5,0,10,{userData:v});return z(e,Array(3).fill("number"),!0,"uniform decimal integer sequences")})),it("uniform pregenerated decimal integer sequences (date)",(async function(){let e=await R.generateSignedIntegerSequences(3,5,0,10,{pregeneratedRandomization:D}),t=await R.generateSignedIntegerSequences(3,5,0,10,{pregeneratedRandomization:D});if(assert.deepEqual(e.data,t.data),y)console.log("uniform pregenerated decimal integer sequences (date): "),console.table(e.data),console.table(t.data)})),it("uniform pregenerated decimal integer sequences (id)",(async function(){let e=await R.generateSignedIntegerSequences(3,5,0,10,{pregeneratedRandomization:T}),t=await R.generateSignedIntegerSequences(3,5,0,10,{pregeneratedRandomization:T});if(assert.deepEqual(e.data,t.data),y)console.log("uniform pregenerated decimal integer sequences (id): "),console.table(e.data),console.table(t.data)})),it("uniform non-decimal integer sequences",(async function(){let e=await R.generateSignedIntegerSequences(3,5,0,10,{base:2,userData:v});return z(e,Array(3).fill("string"),!0,"uniform non-decimal integer sequences")})),it("uniform pregenerated non-decimal integer sequences (date)",(async function(){let e=await R.generateSignedIntegerSequences(3,5,0,10,{base:2,pregeneratedRandomization:D}),t=await R.generateSignedIntegerSequences(3,5,0,10,{base:2,pregeneratedRandomization:D});if(assert.deepEqual(e.data,t.data),y)console.log("uniform pregenerated non-decimal integer sequences (date): "),console.table(e.data),console.table(t.data)})),it("uniform pregenerated non-decimal integer sequences (id)",(async function(){let e=await R.generateSignedIntegerSequences(3,5,0,10,{base:2,pregeneratedRandomization:T}),t=await R.generateSignedIntegerSequences(3,5,0,10,{base:2,pregeneratedRandomization:T});if(assert.deepEqual(e.data,t.data),y)console.log("uniform pregenerated non-decimal integer sequences (id): "),console.table(e.data),console.table(t.data)})),it("multiform integer sequences",(async function(){let e=await R.generateSignedIntegerSequences(4,w,S,b,{replacement:O,base:q,userData:v}),t=[];return q.every((e=>t.push(10==e?"number":"string"))),z(e,t,!0,"multiform integer sequences")})),it("multiform pregenerated integer sequences (date)",(async function(){let e=await R.generateSignedIntegerSequences(4,w,S,b,{replacement:O,base:q,pregeneratedRandomization:D}),t=await R.generateSignedIntegerSequences(4,w,S,b,{replacement:O,base:q,pregeneratedRandomization:D});if(assert.deepEqual(e.data,t.data),y)console.log("multiform pregenerated integer sequences (date): "),console.table(e.data),console.table(t.data)})),it("multiform pregenerated integer sequences (id)",(async function(){let e=await R.generateSignedIntegerSequences(4,w,S,b,{replacement:O,base:q,pregeneratedRandomization:T}),t=await R.generateSignedIntegerSequences(4,w,S,b,{replacement:O,base:q,pregeneratedRandomization:T});if(assert.deepEqual(e.data,t.data),y)console.log("multiform pregenerated integer sequences (id): "),console.table(e.data),console.table(t.data)}))})),describe("Decimal Fractions",(function(){it("decimal fractions",(async function(){let e=await R.generateSignedDecimalFractions(5,4,{replacement:!1,userData:v});return z(e,"number",!0,"decimal fractions")})),it("pregenerated decimal fractions (date)",(async function(){let e=await R.generateSignedDecimalFractions(5,4,{replacement:!1,pregeneratedRandomization:D}),t=await R.generateSignedDecimalFractions(5,4,{replacement:!1,pregeneratedRandomization:D});if(assert.deepEqual(e.data,t.data),y)console.log("pregenerated decimal fractions (date): "+e.data+" / "+t.data)})),it("pregenerated decimal fractions (id)",(async function(){let e=await R.generateSignedDecimalFractions(5,4,{replacement:!1,pregeneratedRandomization:T}),t=await R.generateSignedDecimalFractions(5,4,{replacement:!1,pregeneratedRandomization:T});if(assert.deepEqual(e.data,t.data),y)console.log("pregenerated decimal fractions (id): "+e.data+" / "+t.data)}))})),describe("Gaussians",(function(){it("gaussians",(async function(){let e=await R.generateSignedGaussians(5,3.41,2.1,4,{userData:v});return z(e,"number",!0,"gaussians")})),it("pregenerated gaussians (date)",(async function(){let e=await R.generateSignedGaussians(5,3.41,2.1,4,{pregeneratedRandomization:D}),t=await R.generateSignedGaussians(5,3.41,2.1,4,{pregeneratedRandomization:D});if(assert.deepEqual(e.data,t.data),y)console.log("pregenerated gaussians (date): "+e.data+" / "+t.data)})),it("pregenerated gaussians (id)",(async function(){let e=await R.generateSignedGaussians(5,3.41,2.1,4,{pregeneratedRandomization:T}),t=await R.generateSignedGaussians(5,3.41,2.1,4,{pregeneratedRandomization:T});if(assert.deepEqual(e.data,t.data),y)console.log("pregenerated gaussians (id): "+e.data+" / "+t.data)}))})),describe("Strings",(function(){it("strings, lowercase English alphabet",(async function(){let e=await R.generateSignedStrings(3,5,I,{userData:v});return z(e,"string",!0,"strings, lowercase English alphabet")})),it("pregenerated strings, lowercase English alphabet (date)",(async function(){let e=await R.generateSignedStrings(3,5,I,{pregeneratedRandomization:D}),t=await R.generateSignedStrings(3,5,I,{pregeneratedRandomization:D});if(assert.deepEqual(e.data,t.data),y)console.log("pregenerated strings, lowercase English alphabet (date): "+e.data+" / "+t.data)})),it("pregenerated strings, lowercase English alphabet (id)",(async function(){let e=await R.generateSignedStrings(3,5,I,{pregeneratedRandomization:T}),t=await R.generateSignedStrings(3,5,I,{pregeneratedRandomization:T});if(assert.deepEqual(e.data,t.data),y)console.log("pregenerated strings, lowercase English alphabet (id): "+e.data+" / "+t.data)}))})),describe("UUIDs",(function(){it("UUIDs",(async function(){let e=await R.generateSignedUUIDs(3,{userData:v});return z(e,"UUID",!0,"UUIDs")})),it("pregenerated UUIDs (date)",(async function(){let e=await R.generateSignedUUIDs(3,{pregeneratedRandomization:D}),t=await R.generateSignedUUIDs(3,{pregeneratedRandomization:D});if(assert.deepEqual(e.data,t.data),y)console.log("pregenerated UUIDs (date): "+e.data+" / "+t.data)})),it("pregenerated UUIDs (id)",(async function(){let e=await R.generateSignedUUIDs(3,{pregeneratedRandomization:T}),t=await R.generateSignedUUIDs(3,{pregeneratedRandomization:T});if(assert.deepEqual(e.data,t.data),y)console.log("pregenerated UUIDs (id): "+e.data+" / "+t.data)}))})),describe("BLOBs",(function(){it("BLOBs, 128-bit, base64",(async function(){let e=await R.generateSignedBlobs(3,128,{format:U,userData:v});return z(e,"base64",!0,"BLOBs, 128-bit, base64")})),it("BLOBs, 128-bit, hex",(async function(){let e=await R.generateSignedBlobs(3,128,{format:k,userData:v});return z(e,"128-hex",!0,"BLOBs, 128-bit, hex")})),it("pregenerated BLOBs (date)",(async function(){let e=await R.generateSignedBlobs(3,64,{format:U,pregeneratedRandomization:D}),t=await R.generateSignedBlobs(3,64,{format:U,pregeneratedRandomization:D});if(assert.deepEqual(e.data,t.data),assert(e.data.every((e=>M(e))),"Error: should have returned an array of base64 BLOBs."),y)console.log("pregenerated BLOBs (date): "+e.data+" / "+t.data)})),it("pregenerated BLOBs (id)",(async function(){let e=await R.generateSignedBlobs(3,64,{format:U,pregeneratedRandomization:T}),t=await R.generateSignedBlobs(3,64,{format:U,pregeneratedRandomization:T});if(assert.deepEqual(e.data,t.data),assert(e.data.every((e=>M(e))),"Error: should have returned an array of base64 BLOBs."),y)console.log("pregenerated BLOBs (id): "+e.data+" / "+t.data)}))})),describe("Tickets",(function(){it("create a single ticket",(async function(){let e=(await R.createTickets(1,!0))[0].ticketId;if(assert("string"==typeof e,"Error: should have returned a string, instead returned "+e),y)console.log("ticket id: "+e)})),it("revealTickets(), single reveal",(async function(){let e=(await R.createTickets(1,!1))[0].ticketId,t=await R.generateSignedIntegers(5,0,10,{ticketId:e}),a=await R.getTicket(e);assert(!a.result,"Result should not be shown pre-reveal.");let r=await R.revealTickets(e);assert(1==r.ticketCount,"A single ticket should be revealed."),a=await R.getTicket(e),assert(a.result,"Result should be available post-reveal."),assert.deepEqual(t.data,a.result.random.data,"Result should be the same as was generated initially.")})),it("revealTickets(), multiple reveals",(async function(){let e=(await R.createTickets(1,!1))[0].ticketId,t=[],a=[];for(var r=0;r<2;r++){t.push(e),a.push(await R.generateSignedIntegers(5,0,10,{ticketId:e}));var n=await R.getTicket(e);assert(!n.result,"Result should not be shown pre-reveal."),e=n.nextTicketId,assert(null!=e,"Next ticket ID should not be null.")}let s=await R.revealTickets(t[1]);assert(2==s.ticketCount,`2 tickets should be revealed,\n instead ticketCount was ${s.ticketCount}.`);for(r=0;r<2;r++)n=await R.getTicket(t[r]),assert(n.result,"Result should be available post-reveal."),assert.deepEqual(a[r].data,n.result.random.data,"Result should be the same as was generated initially.")})),it("listTickets(), singleton",(async function(){let e=await R.listTickets("singleton");if(Array.isArray(e))if(assert(e.every((e=>null==e.nextTicketId&&null==e.previousTicketId)),"Error: tickets returned were not of the correct type."),y)console.log("first ticket, singleton: "+JSON.stringify(e[0]))})),it("listTickets(), head",(async function(){let e=await R.listTickets("head");if(Array.isArray(e))if(assert(e.every((e=>null!=e.nextTicketId&&null==e.previousTicketId)),"Error: tickets returned were not of the correct type."),y)console.log("first ticket, head: "+JSON.stringify(e[0]))})),it("listTickets(), tail",(async function(){let e=await R.listTickets("tail");if(Array.isArray(e))if(assert(e.every((e=>null==e.nextTicketId&&null!=e.previousTicketId)),"Error: tickets returned were not of the correct type."),y)console.log("first ticket, tail: "+JSON.stringify(e[0]))})),it("getTicket()",(async function(){let e=(await R.createTickets(1,!0))[0].ticketId,t=await R.generateSignedUUIDs(1,{ticketId:e}),a=await R.getTicket(e);if(assert.deepEqual(t.data,a.result.random.data),y)console.log("original: "+t.data+" getTicket: "+a.result.data+" ticketId: "+e)}))})),describe("Other",(function(){it("verifySignature(random, signature)",(async function(){let e=await R.generateSignedIntegers(5,0,10),t=await R.verifySignature(e.random,e.signature);assert(t,"Error: should have been verified successfully."),t=await R.verifySignature(e.random,C(e.signature)),assert(!t,"Error: should not have been verified successfully.")})),it("getResult(serialNumber)",(async function(){let e=await R.generateSignedIntegers(5,0,10),t=e.random.serialNumber,a=await R.getResult(t);if(assert.deepEqual(e.data,a.random.data,"Error: the responses should have been the same."),y)console.log("original: "+e.data+" getResult: "+a.data+" serialNumber: "+t)}))}))})),describe("Caches",(function(){it("decimal integers without replacement (individual requests)",(async function(){let e=R.createIntegerCache(5,0,10,{replacement:!1,cacheSize:4});e.stop();try{e.get(),assert.fail("Should have thrown RandomOrgCacheEmptyError.")}catch(e){assert(e instanceof p,"Should have thrown RandomOrgCacheEmptyError, instead threw "+e.message)}assert(e.isPaused(),"Error: cache should have been paused.");let t=null;try{t=e.get()}catch(e){if(e instanceof p)assert(!0===e.wasPaused(),"Should have been paused.");else assert.fail("Should have thrown RandomOrgCacheEmptyError, , instead threw "+e.message)}for(e.resume();null==t;)try{t=e.get()}catch(e){if(e instanceof p)assert(!1===e.wasPaused(),"Should not have been paused."),await new Promise((e=>setTimeout(e,50)));else assert.fail("Should have thrown RandomOrgCacheEmptyError, , instead threw "+e.message)}if(assert(t.every((e=>"number"==typeof e)),"Error: should have returned an array of integers."),y)console.log("decimal integer cache, get(): "+t);let a=e.getCachedValues();assert(a>=0);let r=e.getBitsUsed();assert(r>=0);let n=e.getRequestsUsed();if(assert(n>=0),y)console.log("size of cache: "+a+" bits used: "+r+" requests used: "+n)})),it("non-decimal integer with replacement (bulk requests)",(async function(){let e=R.createIntegerCache(5,0,10,{base:16,cacheSize:4});e.stop();try{e.get(),assert.fail("Should have thrown RandomOrgCacheEmptyError.")}catch(e){assert(e instanceof p)}assert(e.isPaused()),e.resume();let t=null;for(;null==t;)try{t=e.get()}catch(e){if(e instanceof p)await new Promise((e=>setTimeout(e,50)));else assert.fail("Should have thrown RandomOrgCacheEmptyError, , instead threw "+e.message)}if(assert(t.every((e=>"string"==typeof e)),"Error: should have returned an array of strings."),y)console.log("non-decimal integer cache, get(): "+t)})),it("uniform decimal integer sequences with replacement (bulk requests)",(async function(){let e=R.createIntegerSequenceCache(3,5,0,10,{cacheSize:4});e.stop();try{e.get(),assert.fail("Should have thrown RandomOrgCacheEmptyError.")}catch(e){assert(e instanceof p)}assert(e.isPaused()),e.resume();let t=null;for(;null==t;)try{t=e.get()}catch(e){if(e instanceof p)await new Promise((e=>setTimeout(e,50)));else assert.fail("Should have thrown RandomOrgCacheEmptyError, , instead threw "+e.message)}if(assert(t.every((e=>e.every((e=>"number"==typeof e)))),"Error: should have returned a 2D array of integers."),y)console.log("uniform decimal integer sequence cache, get(): "),console.table(t)})),it("uniform non-decimal integer sequences with replacement (bulk requests)",(async function(){let e=R.createIntegerSequenceCache(3,5,0,10,{base:16,cacheSize:4});e.stop();try{e.get(),assert.fail("Should have thrown RandomOrgCacheEmptyError.")}catch(e){assert(e instanceof p)}assert(e.isPaused()),e.resume();let t=null;for(;null==t;)try{t=e.get()}catch(e){if(e instanceof p)await new Promise((e=>setTimeout(e,50)));else assert.fail("Should have thrown RandomOrgCacheEmptyError, , instead threw "+e.message)}if(assert(t.every((e=>e.every((e=>"string"==typeof e)))),"Error: should have returned a 2D array of strings."),y)console.log("uniform non-decimal integer sequence cache, get(): "),console.table(t)})),it("multiform decimal integer sequences with replacement (bulk requests)",(async function(){let e=R.createIntegerSequenceCache(4,w,S,b,{cacheSize:4});e.stop();try{e.get(),assert.fail("Should have thrown RandomOrgCacheEmptyError.")}catch(e){assert(e instanceof p)}assert(e.isPaused()),e.resume();let t=null;for(;null==t;)try{t=e.get()}catch(e){if(e instanceof p)await new Promise((e=>setTimeout(e,50)));else assert.fail("Should have thrown RandomOrgCacheEmptyError, , instead threw "+e.message)}if(assert(t.every((e=>e.every((e=>"number"==typeof e)))),"Error: should have returned a 2D array of integers."),y)console.log("multiform decimal integer sequence cache, get(): "),console.table(t)})),it("multiform mixed-base integer sequences with replacement (bulk requests)",(async function(){let e=R.createIntegerSequenceCache(4,w,S,b,{base:q,cacheSize:4});e.stop();try{e.get(),assert.fail("Should have thrown RandomOrgCacheEmptyError.")}catch(e){assert(e instanceof p)}assert(e.isPaused()),e.resume();let t=null;for(;null==t;)try{t=e.get()}catch(e){if(e instanceof p)await new Promise((e=>setTimeout(e,50)));else assert.fail("Should have thrown RandomOrgCacheEmptyError, , instead threw "+e.message)}if(assert(t.every(((e,t)=>e.every((e=>typeof e===(10==q[t]?"number":"string"))))),"Error: the type of the values in the 2D array was not as expected."),y)console.log("multiform mixed-base integer sequence cache, get(): "),console.table(t)})),it("decimal fractions without replacement (individual requests)",(async function(){let e=R.createDecimalFractionCache(5,4,{replacement:!1,cacheSize:4});e.stop();try{e.get(),assert.fail("Should have thrown RandomOrgCacheEmptyError.")}catch(e){assert(e instanceof p)}assert(e.isPaused()),e.resume();let t=null;for(;null==t;)try{t=e.get()}catch(e){if(e instanceof p)await new Promise((e=>setTimeout(e,50)));else assert.fail("Should have thrown RandomOrgCacheEmptyError, , instead threw "+e.message)}if(assert(t.every((e=>"number"==typeof e)),"Error: should have returned an array of numbers."),y)console.log("decimal fraction cache, get(): "+t)})),it("decimal fractions with replacement (bulk requests)",(async function(){let e=R.createDecimalFractionCache(5,4,{cacheSize:4});e.stop();try{e.get(),assert.fail("Should have thrown RandomOrgCacheEmptyError.")}catch(e){assert(e instanceof p)}assert(e.isPaused()),e.resume();let t=null;for(;null==t;)try{t=e.get()}catch(e){if(e instanceof p)await new Promise((e=>setTimeout(e,50)));else assert.fail("Should have thrown RandomOrgCacheEmptyError, , instead threw "+e.message)}if(assert(t.every((e=>"number"==typeof e)),"Error: should have returned an array of numbers."),y)console.log("decimal fraction cache, get(): "+t)})),it("gaussians (bulk requests as gaussians are always chosen with replacement)",(async function(){let e=R.createGaussianCache(10,3.41,2.1,4,{cacheSize:4});e.stop();try{e.get(),assert.fail("Should have thrown RandomOrgCacheEmptyError.")}catch(e){assert(e instanceof p)}assert(e.isPaused()),e.resume();let t=null;for(;null==t;)try{t=e.get()}catch(e){if(e instanceof p)await new Promise((e=>setTimeout(e,50)));else assert.fail("Should have thrown RandomOrgCacheEmptyError, , instead threw "+e.message)}if(assert(t.every((e=>"number"==typeof e)),"Error: should have returned an array of numbers."),y)console.log("gaussian cache, get(): "+t)})),it("strings with replacement (bulk requests)",(async function(){let e=R.createStringCache(5,5,I,{cacheSize:4});e.stop();try{e.get(),assert.fail("Should have thrown RandomOrgCacheEmptyError.")}catch(e){assert(e instanceof p)}assert(e.isPaused()),e.resume();let t=null;for(;null==t;)try{t=e.get()}catch(e){if(e instanceof p)await new Promise((e=>setTimeout(e,50)));else assert.fail("Should have thrown RandomOrgCacheEmptyError, , instead threw "+e.message)}if(assert(t.every((e=>"string"==typeof e)),"Error: should have returned an array of strings."),y)console.log("string cache, get(): "+t)})),it("UUIDs (bulk requests, always)",(async function(){let e=R.createUUIDCache(1,{cacheSize:4});e.stop();try{e.get(),assert.fail("Should have thrown RandomOrgCacheEmptyError.")}catch(e){assert(e instanceof p)}assert(e.isPaused()),e.resume();let t=null;for(;null==t;)try{t=e.get()}catch(e){if(e instanceof p)await new Promise((e=>setTimeout(e,50)));else assert.fail("Should have thrown RandomOrgCacheEmptyError, , instead threw "+e.message)}if(assert(t.every((e=>B(e))),"Error: should have returned an array of UUIDs."),y)console.log("UUID cache, get(): "+t)})),it("BLOBs, 128-bit, base64 (bulk requests, always)",(async function(){let e=R.createBlobCache(3,128,{format:U,cacheSize:4});e.stop();try{e.get(),assert.fail("Should have thrown RandomOrgCacheEmptyError.")}catch(e){assert(e instanceof p)}assert(e.isPaused()),e.resume();let t=null;for(;null==t;)try{t=e.get()}catch(e){if(e instanceof p)await new Promise((e=>setTimeout(e,50)));else assert.fail("Should have thrown RandomOrgCacheEmptyError, , instead threw "+e.message)}if(assert(t.every((e=>M(e))),"Error: should have returned an array of base64 BLOBs."),y)console.log("base64-encoded blob cache, get(): "+t)})),it("BLOBs, 128-bit, hex (bulk requests, always)",(async function(){let e=R.createBlobCache(3,128,{format:k,cacheSize:4});e.stop();try{e.get(),assert.fail("Should have thrown RandomOrgCacheEmptyError.")}catch(e){assert(e instanceof p)}assert(e.isPaused()),e.resume();let t=null;for(;null==t;)try{t=e.get()}catch(e){if(e instanceof p)await new Promise((e=>setTimeout(e,50)));else assert.fail("Should have thrown RandomOrgCacheEmptyError, , instead threw "+e.message)}if(assert(t.every((e=>N(e,128))),"Error: should have returned an array of hex BLOBs."),y)console.log("hex-encoded blob cache, get(): "+t)}))})),describe("Final Usage",(function(){it("requests used",(async function(){let e=await R.getRequestsLeft();console.log(A-e)})),it("bits used",(async function(){let e=await R.getBitsLeft();console.log(_-e)}))}));let z=async function(e,t,a=!1,r=null){let n=await R.verifySignature(e.random,e.signature);if(assert(n),y)console.log(r+": "+e.data);if(Array.isArray(t))for(let a=0;a<e.data.length;a++)assert(e.data[a].every((e=>typeof e==t[a])));else if("UUID"===t)assert(e.data.every((e=>B(e))));else if("base64"===t)assert(e.data.every((e=>M(e))));else if("128-hex"===t){let t=e.random.size;assert(e.data.every((e=>N(e,t))))}else assert(e.data.every((e=>typeof e===t)));if(a)assert.deepEqual(e.random.userData,v)},B=function(e){return/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(e)},M=function(e){return/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/.test(e)},N=function(e,t){return new RegExp("^([0-9a-f]{"+t/4+"})?$").test(e)},C=function(e){let t=e.split("");for(let e=1;e<t.length;e++)if(t[e]!=t[e-1]){let a=t[e];t[e]=t[e-1],t[e-1]=a;break}return t.join("")};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5idW5kbGUuanMiLCJzb3VyY2VzIjpbIi4uL2xpYi9SYW5kb21PcmdFcnJvcnMuanMiLCIuLi9saWIvUmFuZG9tT3JnQ2FjaGUuanMiLCIuLi9saWIvUmFuZG9tT3JnQ2xpZW50LmpzIiwiLi4vbGliL2VzbS9pbmRleC5qcyIsInRlc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xyXG5cclxuLyoqXHJcbiAqIEVycm9yIHRocm93biBieSB0aGUgUmFuZG9tT3JnQ2xpZW50IGNsYXNzIHdoZW4gdGhlIGNvbm5lY3Rpb24gZG9lc24ndCByZXR1cm5cclxuICogYSBIVFRQIDIwMCBPSyByZXNwb25zZS5cclxuICovXHJcbmV4cG9ydHMuUmFuZG9tT3JnQmFkSFRUUFJlc3BvbnNlRXJyb3IgPSBjbGFzcyBSYW5kb21PcmdCYWRIVFRQUmVzcG9uc2VFcnJvciBleHRlbmRzIEVycm9yXHJcbntcclxuICAgIC8qKlxyXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgVGhlIGRldGFpbCBtZXNzYWdlLlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XHJcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFcnJvciB0aHJvd24gYnkgdGhlIFJhbmRvbU9yZ0NsaWVudCBjbGFzcyB3aGVuIGl0cyBBUEkga2V5J3MgcmVxdWVzdCBoYXNcclxuICogZXhjZWVkZWQgaXRzIHJlbWFpbmluZyBzZXJ2ZXIgYml0cyBhbGxvd2FuY2UuXHJcbiAqIFxyXG4gKiBJZiB0aGUgY2xpZW50IGlzIGN1cnJlbnRseSBpc3N1aW5nIGxhcmdlIHJlcXVlc3RzIGl0IG1heSBiZSBwb3NzaWJsZSBzdWNjZWVkXHJcbiAqIHdpdGggc21hbGxlciByZXF1ZXN0cy4gVXNlIHRoZSBnZXRCaXRzTGVmdCgpIGNhbGwgaW4gdGhpcyBjbGFzcyB0byBoZWxwXHJcbiAqIGRldGVybWluZSBpZiBhbiBhbHRlcm5hdGl2ZSByZXF1ZXN0IHNpemUgaXMgYXBwcm9wcmlhdGUuXHJcbiAqL1xyXG4gZXhwb3J0cy5SYW5kb21PcmdJbnN1ZmZpY2llbnRCaXRzRXJyb3IgPSBjbGFzcyBSYW5kb21PcmdJbnN1ZmZpY2llbnRCaXRzRXJyb3IgZXh0ZW5kcyBFcnJvclxyXG57XHJcbiAgICAvLyBTdG9yZXMgdGhlIG51bWJlciBvZiBiaXRzIHJlbWFpbmluZ1xyXG4gICAgI2JpdHMgPSAtMTtcclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UuXHJcbiAgICAgKiBAY29uc3RydWN0b3JcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIFRoZSBkZXRhaWwgbWVzc2FnZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRzIEJpdHMgcmVtYWluaW5nIGp1c3QgYmVmb3JlIHRoZSBlcnJvciB3YXMgdGhyb3duLlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBiaXRzKSB7XHJcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XHJcbiAgICAgICAgdGhpcy4jYml0cyA9IGJpdHM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgYml0cyByZW1haW5pbmcuXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGJpdHMgbGVmdC5cclxuICAgICAqL1xyXG4gICAgZ2V0Qml0c0xlZnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuI2JpdHM7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFcnJvciB0aHJvd24gYnkgdGhlIFJhbmRvbU9yZ0NsaWVudCBjbGFzcyB3aGVuIGl0cyBBUEkga2V5J3Mgc2VydmVyIHJlcXVlc3RzXHJcbiAqIGFsbG93YW5jZSBoYXMgYmVlbiBleGNlZWRlZC5cclxuICogXHJcbiAqIFRoaXMgaW5kaWNhdGVzIHRoYXQgYSBiYWNrLW9mZiB1bnRpbCBtaWRuaWdodCBVVEMgaXMgaW4gZWZmZWN0LCBiZWZvcmUgd2hpY2hcclxuICogbm8gcmVxdWVzdHMgd2lsbCBiZSBzZW50IGJ5IHRoZSBjbGllbnQgYXMgbm8gbWVhbmluZ2Z1bCBzZXJ2ZXIgcmVzcG9uc2VzIHdpbGxcclxuICogYmUgcmV0dXJuZWQuXHJcbiAqL1xyXG5leHBvcnRzLlJhbmRvbU9yZ0luc3VmZmljaWVudFJlcXVlc3RzRXJyb3IgPSBjbGFzcyBSYW5kb21PcmdJbnN1ZmZpY2llbnRSZXF1ZXN0c0Vycm9yIGV4dGVuZHMgRXJyb3Jcclxue1xyXG4gICAgLyoqXHJcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UuXHJcbiAgICAgKiBAY29uc3RydWN0b3JcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIFRoZSBkZXRhaWwgbWVzc2FnZS5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xyXG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogRXJyb3IgdGhyb3duIGJ5IHRoZSBSYW5kb21PcmdDbGllbnQgY2xhc3Mgd2hlbiB0aGUgc2VydmVyIHJldHVybnMgYSBKU09OLVJQQ1xyXG4gKiBFcnJvci4gU2VlIGh0dHBzOi8vYXBpLnJhbmRvbS5vcmcvanNvbi1ycGMvNC9lcnJvci1jb2Rlc1xyXG4gKi9cclxuZXhwb3J0cy5SYW5kb21PcmdKU09OUlBDRXJyb3IgPSBjbGFzcyBSYW5kb21PcmdKU09OUlBDRXJyb3IgZXh0ZW5kcyBFcnJvclxyXG57XHJcbiAgICAvKipcclxuICAgICAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZS5cclxuICAgICAqIEBjb25zdHJ1Y3RvclxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgVGhlIGRldGFpbCBtZXNzYWdlLlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XHJcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFcnJvciB0aHJvd24gYnkgdGhlIFJhbmRvbU9yZ0NsaWVudCBjbGFzcyB3aGVuIGl0cyBBUEkga2V5IGhhcyBiZWVuIHN0b3BwZWQuXHJcbiAqIFJlcXVlc3RzIHdpbGwgbm90IGNvbXBsZXRlIHdoaWxlIEFQSSBrZXkgaXMgaW4gdGhlIHN0b3BwZWQgc3RhdGUuXHJcbiAqL1xyXG5leHBvcnRzLlJhbmRvbU9yZ0tleU5vdFJ1bm5pbmdFcnJvciA9IGNsYXNzIFJhbmRvbU9yZ0tleU5vdFJ1bm5pbmdFcnJvciBleHRlbmRzIEVycm9yXHJcbntcclxuICAgIC8qKlxyXG4gICAgICogRXJyb3IgdGhyb3duIGJ5IHRoZSBSYW5kb21PcmdDbGllbnQgY2xhc3Mgd2hlbiBpdHMgQVBJIGtleSBoYXMgYmVlbiBzdG9wcGVkLlxyXG4gICAgICogUmVxdWVzdHMgd2lsbCBub3QgY29tcGxldGUgd2hpbGUgQVBJIGtleSBpcyBpbiB0aGUgc3RvcHBlZCBzdGF0ZS5cclxuICAgICAqIEBjb25zdHJ1Y3RvclxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgVGhlIGRldGFpbCBtZXNzYWdlLlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XHJcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFcnJvciB0aHJvd24gYnkgdGhlIFJhbmRvbU9yZ0NsaWVudCBjbGFzcyB3aGVuIHRoZSBzZXJ2ZXIgcmV0dXJucyBhXHJcbiAqIFJBTkRPTS5PUkcgRXJyb3IuIFNlZSBodHRwczovL2FwaS5yYW5kb20ub3JnL2pzb24tcnBjLzQvZXJyb3ItY29kZXNcclxuICovXHJcbmV4cG9ydHMuUmFuZG9tT3JnUkFORE9NT1JHRXJyb3IgPSBjbGFzcyBSYW5kb21PcmdSQU5ET01PUkdFcnJvciBleHRlbmRzIEVycm9yXHJcbntcclxuICAgIC8vIFN0b3JlcyB0aGUgY29kZSBvZiB0aGUgUkFORE9NLk9SRyBlcnJvclxyXG4gICAgI2NvZGUgPSAtMTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEVycm9yIHRocm93biBieSB0aGUgUmFuZG9tT3JnQ2xpZW50IGNsYXNzIHdoZW4gdGhlIHNlcnZlciByZXR1cm5zIGFcclxuICAgICAqIFJBTkRPTS5PUkcgRXJyb3IuIFNlZSBodHRwczovL2FwaS5yYW5kb20ub3JnL2pzb24tcnBjLzQvZXJyb3ItY29kZXNcclxuICAgICAqIEBjb25zdHJ1Y3RvclxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgVGhlIGRldGFpbCBtZXNzYWdlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXI9fSBbY29kZT0tMV0gVGhlIGVycm9yIGNvZGUuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIGNvZGUgPSAtMSkge1xyXG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpOyAgICBcclxuICAgICAgICB0aGlzLiNjb2RlID0gY29kZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIFJBTkRPTS5PUkcgZXJyb3IgY29kZSwgc2VlXHJcbiAgICAgKiBodHRwczovL2FwaS5yYW5kb20ub3JnL2pzb24tcnBjLzQvZXJyb3ItY29kZXNcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBlcnJvciBjb2RlLlxyXG4gICAgICovXHJcbiAgICBnZXRDb2RlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLiNjb2RlO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogRXJyb3IgdGhyb3duIGJ5IHRoZSBSYW5kb21PcmdDbGllbnQgY2xhc3Mgd2hlbiBpdHMgc2V0IGJsb2NraW5nIHRpbWVvdXQgaXNcclxuICogZXhjZWVkZWQgYmVmb3JlIHRoZSByZXF1ZXN0IGNhbiBiZSBzZW50LlxyXG4gKi9cclxuZXhwb3J0cy5SYW5kb21PcmdTZW5kVGltZW91dEVycm9yID0gY2xhc3MgUmFuZG9tT3JnU2VuZFRpbWVvdXRFcnJvciBleHRlbmRzIEVycm9yXHJcbntcclxuICAgIC8qKlxyXG4gICAgICogRXJyb3IgdGhyb3duIGJ5IHRoZSBSYW5kb21PcmdDbGllbnQgY2xhc3Mgd2hlbiBpdHMgc2V0IGJsb2NraW5nIHRpbWVvdXQgaXNcclxuICAgICAqIGV4Y2VlZGVkIGJlZm9yZSB0aGUgcmVxdWVzdCBjYW4gYmUgc2VudC5cclxuICAgICAqIEBjb25zdHJ1Y3RvclxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgVGhlIGRldGFpbCBtZXNzYWdlLlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XHJcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFcnJvciB0aHJvd24gd2hlbiBkYXRhIHJldHJpZXZhbCBmcm9tIGFuIGVtdHB5IFJhbmRvbU9yZ0NhY2hlIGlzIGF0dGVtcHRlZC5cclxuICovXHJcbmV4cG9ydHMuUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yID0gY2xhc3MgUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yIGV4dGVuZHMgRXJyb3Jcclxue1xyXG4gICAgI3BhdXNlZCA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXJyb3IgdGhyb3duIHdoZW4gZGF0YSByZXRyaWV2YWwgZnJvbSBhbiBlbXRweSBSYW5kb21PcmdDYWNoZSBpcyBhdHRlbXB0ZWQuXHJcbiAgICAgKiBAY29uc3RydWN0b3JcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIFRoZSBkZXRhaWwgbWVzc2FnZS5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcGF1c2VkIFJlZmxlY3RzIHdoZXRoZXIgdGhlIFJhbmRvbU9yZ0NhY2hlIGluc3RhbmNlIHdhc1xyXG4gICAgICogICAgIHBhdXNlZCB3aGVuIHRoaXMgZXJyb3Igd2FzIHRocm93bi5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgcGF1c2VkID0gZmFsc2UpIHtcclxuICAgICAgICBzdXBlcihtZXNzYWdlKTtcclxuICAgICAgICB0aGlzLiNwYXVzZWQgPSBwYXVzZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNhY2hlIHdhcyBwYXVzZWQgYXQgdGhlIHRpbWUgd2hlbiB0aGVcclxuICAgICAqIGVycm9yIHdhcyB0aHJvd24uXHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBwYXVzZWQsIGZhbHNlIG90aGVyd2lzZS5cclxuICAgICAqL1xyXG4gICAgd2FzUGF1c2VkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLiNwYXVzZWQ7XHJcbiAgICB9XHJcbn0iLCIndXNlIHN0cmljdCc7XHJcbmNvbnN0IHtcclxuICAgIFJhbmRvbU9yZ0luc3VmZmljaWVudEJpdHNFcnJvcixcclxuICAgIFJhbmRvbU9yZ0NhY2hlRW1wdHlFcnJvclxyXG59ID0gcmVxdWlyZSgnLi9SYW5kb21PcmdFcnJvcnMuanMnKTtcclxuLyoqXHJcbiAqIFByZWNhY2hlIGNsYXNzIGZvciBmcmVxdWVudGx5IHVzZWQgcmVxdWVzdHMuXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIFJhbmRvbU9yZ0NhY2hlIHtcclxuICAgIC8vIGZ1bmN0aW9uIHVzZWQgdG8gc2VuZCBhIHJlcXVlc3RcclxuICAgICNyZXF1ZXN0RnVuY3Rpb24gPSBudWxsO1xyXG5cclxuICAgIC8vIHJlcXVlc3QgdG8gYmUgc2VudFxyXG4gICAgI3JlcXVlc3QgPSBudWxsO1xyXG5cclxuICAgIC8vIG4gZm9yIGJ1bGsgcmVxdWVzdHNcclxuICAgICNidWxrUmVxdWVzdE51bWJlciA9IDA7XHJcbiAgICAvLyBuIGZvciBhIHNpbmdsZSByZXF1ZXN0XHJcbiAgICAjcmVxdWVzdE51bWJlciA9IDA7XHJcbiAgICAvLyBzaXplIG9mIGEgc2luZ2xlIHJlcXVlc3QgaW4gYml0c1xyXG4gICAgI3JlcXVlc3RTaXplID0gLTE7XHJcblxyXG4gICAgLy8gc3RvcmVzIGNhY2hlZCBhcnJheXMgb2YgdmFsdWVzXHJcbiAgICAjc3RhY2sgPSBbXTtcclxuICAgIC8vIG51bWJlciBvZiBhcnJheXMgdG8gdHJ5IHRvIG1haW50YWluIGluICNzdGFja1xyXG4gICAgI2NhY2hlU2l6ZSA9IDEwO1xyXG5cclxuICAgIC8vIHN0YXR1cyBvZiB0aGUgY2FjaGVcclxuICAgICNwYXVzZWQgPSBmYWxzZTtcclxuICAgIC8vIGJpdHMgdXNlZCBieSB0aGlzIGNhY2hlXHJcbiAgICAjYml0c1VzZWQgPSAwO1xyXG4gICAgLy8gcmVxdWVzdHMgdXNlZCBieSB0aGlzIGNhY2hlXHJcbiAgICAjcmVxdWVzdHNVc2VkID0gMDtcclxuICAgIC8vIGVuc3VyZXMgI3BvcHVsYXRlKCkgZG9lcyBub3QgaXNzdWUgcGFyYWxsZWwgcmVxdWVzdHNcclxuICAgICNjdXJyZW50bHlQb3B1bGF0aW5nID0gZmFsc2U7XHJcblxyXG4gICAgLy8gYW4gZXJyb3Igd2hpY2ggd2lsbCBiZSB0aHJvd24gb24gdGhlIG5leHQgY2FsbCB0byBnZXQoKSBvciBnZXRPcldhaXQoKVxyXG4gICAgI2Vycm9yID0gbnVsbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEluaXRpYWxpemUgY2xhc3MgYW5kIHN0YXJ0IHN0YWNrIHBvcHVsYXRpb25cclxuICAgICAqIFxyXG4gICAgICogKiogV0FSTklORyoqIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSBSYW5kb21PcmdDbGllbnQncyBjcmVhdGVDYWNoZSgpXHJcbiAgICAgKiBtZXRob2RzLlxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbihPYmplY3QpIDogT2JqZWN0fSByZXF1ZXN0RnVuY3Rpb24gRnVuY3Rpb24gdXNlZCB0byBzZW5kXHJcbiAgICAgKiAgICAgc3VwcGxpZWQgcmVxdWVzdCB0byBzZXJ2ZXIuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVxdWVzdCBSZXF1ZXN0IHRvIHNlbmQgdG8gc2VydmVyIHZpYSByZXF1ZXN0RnVuY3Rpb24uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY2FjaGVTaXplIE51bWJlciBvZiByZXF1ZXN0IHJlc3BvbnNlcyB0byB0cnkgbWFpbnRhaW4uXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYnVsa1JlcXVlc3ROdW1iZXIgSWYgcmVxdWVzdCBpcyBzZXQgdG8gYmUgaXNzdWVkIGluIGJ1bGssXHJcbiAgICAgKiAgICAgbnVtYmVyIG9mIHJlc3VsdCBzZXRzIGluIGEgYnVsayByZXF1ZXN0LCBlbHNlIDAuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcmVxdWVzdE51bWJlciBJZiByZXF1ZXN0IGlzIHNldCB0byBiZSBpc3N1ZWQgaW4gYnVsayxcclxuICAgICAqICAgICBudW1iZXIgb2YgcmVzdWx0cyBpbiBhIHNpbmdsZSByZXF1ZXN0LCBlbHNlIDAuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2luZ2xlUmVxdWVzdFNpemUgU2l6ZSBvZiBhIHNpbmdsZSByZXF1ZXN0IGluIGJpdHMgZm9yXHJcbiAgICAgKiAgICAgYWRqdXN0aW5nIGJ1bGsgcmVxdWVzdHMgaWYgYml0cyBhcmUgaW4gc2hvcnQgc3VwcGx5IG9uIHRoZSBzZXJ2ZXIuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKHJlcXVlc3RGdW5jdGlvbiwgcmVxdWVzdCwgY2FjaGVTaXplLCBidWxrUmVxdWVzdE51bWJlciwgcmVxdWVzdE51bWJlciwgc2luZ2xlUmVxdWVzdFNpemUpIHtcclxuICAgICAgICB0aGlzLiNyZXF1ZXN0RnVuY3Rpb24gPSByZXF1ZXN0RnVuY3Rpb247XHJcblxyXG4gICAgICAgIHRoaXMuI3JlcXVlc3QgPSByZXF1ZXN0O1xyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuI2NhY2hlU2l6ZSA9IGNhY2hlU2l6ZTtcclxuXHJcbiAgICAgICAgdGhpcy4jYnVsa1JlcXVlc3ROdW1iZXIgPSBidWxrUmVxdWVzdE51bWJlcjtcclxuICAgICAgICB0aGlzLiNyZXF1ZXN0TnVtYmVyID0gcmVxdWVzdE51bWJlcjtcclxuICAgICAgICB0aGlzLiNyZXF1ZXN0U2l6ZSA9IHNpbmdsZVJlcXVlc3RTaXplO1xyXG5cclxuICAgICAgICB0aGlzLiNwb3B1bGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRnVuY3Rpb24gdG8gY29udGludWUgaXNzdWluZyByZXF1ZXN0cyB1bnRpbCB0aGUgc3RhY2sgaXMgZnVsbC5cclxuICAgICAqIFxyXG4gICAgICogS2VlcCBpc3N1aW5nIHJlcXVlc3RzIHRvIHNlcnZlciB1bnRpbCBzdGFjayBpcyBmdWxsLiBXaGVuIHN0YWNrIGlzIGZ1bGxcclxuICAgICAqIGlmIHJlcXVlc3RzIGFyZSBiZWluZyBpc3N1ZWQgaW4gYnVsaywgd2FpdCB1bnRpbCBzdGFjayBoYXMgZW5vdWdoIHNwYWNlXHJcbiAgICAgKiB0byBhY2NvbW1vZGF0ZSBhbGwgb2YgYSBidWxrIHJlcXVlc3QgYmVmb3JlIGlzc3VpbmcgYSBuZXcgcmVxdWVzdCwgb3RoZXJ3aXNlXHJcbiAgICAgKiBpc3N1ZSBhIG5ldyByZXF1ZXN0IGV2ZXJ5IHRpbWUgYW4gaXRlbSBpbiB0aGUgc3RhY2sgaGFzIGJlZW4gY29uc3VtZWQuIE5vdGVcclxuICAgICAqIHRoYXQgcmVxdWVzdHMgYXJlIGJsb2NraW5nICgnYXdhaXQnIGlzIHVzZWQgd2hlbiBjYWxsaW5nIHRoZSByZXF1ZXN0RnVuY3Rpb24pLFxyXG4gICAgICogaS5lLiwgb25seSBvbmUgcmVxdWVzdCB3aWxsIGJlIGlzc3VlZCBieSB0aGUgY2FjaGUgYXQgYW55IGdpdmVuIHRpbWUuXHJcbiAgICAgKi9cclxuICAgICNwb3B1bGF0ZSA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMuI2N1cnJlbnRseVBvcHVsYXRpbmcgJiYgIXRoaXMuI3BhdXNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLiNjdXJyZW50bHlQb3B1bGF0aW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuI2Vycm9yICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLiNidWxrUmVxdWVzdE51bWJlciA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBJcyB0aGVyZSBzcGFjZSBmb3IgYSBidWxrIHJlc3BvbnNlIGluIHRoZSBzdGFjaz9cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4jc3RhY2subGVuZ3RoIDw9ICh0aGlzLiNjYWNoZVNpemUgLSB0aGlzLiNidWxrUmVxdWVzdE51bWJlcikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy4jcmVxdWVzdEZ1bmN0aW9uKHRoaXMuI3JlcXVlc3QpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jYWRkUmVzcG9uc2UocmVzcG9uc2UsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgZW5vdWdoIGJpdHMgcmVtYWluaW5nIGZvciBhIGJ1bGsgcmVxdWVzdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSYW5kb21PcmdJbnN1ZmZpY2llbnRCaXRzRXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYml0c0xlZnQgPSBlLmdldEJpdHNMZWZ0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJpdHNMZWZ0ID4gdGhpcy4jcmVxdWVzdFNpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgcG9zc2libGUsIGFkanVzdCByZXF1ZXN0IGZvciB0aGUgbGFyZ2VzdCBwb3NzaWJsZSBzaXplXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZGp1c3RlZEJ1bGsgPSBNYXRoLmZsb29yKGJpdHNMZWZ0L3RoaXMuI3JlcXVlc3RTaXplKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jcmVxdWVzdC5wYXJhbXMubiA9IGFkanVzdGVkQnVsayAqIHRoaXMuI3JlcXVlc3ROdW1iZXI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuI3JlcXVlc3RGdW5jdGlvbih0aGlzLiNyZXF1ZXN0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jYWRkUmVzcG9uc2UocmVzcG9uc2UsIHRydWUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgdG8gb3JpZ2luYWwgYnVsayByZXF1ZXN0IHNpemVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jcmVxdWVzdC5wYXJhbXMubiA9IHRoaXMuI2J1bGtSZXF1ZXN0TnVtYmVyICogdGhpcy4jcmVxdWVzdE51bWJlcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0IHNpemUgY2Fubm90IGJlIGFkanVzdGVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2Vycm9yID0gZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW55IG90aGVyIGVycm9yIHRocm93biBkdXJpbmcgaW4gdGhlIHJlcXVlc3QgZnVuY3Rpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNlcnJvciA9IGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBzcGFjZSBmb3IgYSBidWxrIHJlcXVlc3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLiNzdGFjay5sZW5ndGggPCB0aGlzLiNjYWNoZVNpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpbmRpdmlkdWFsIHJlcXVlc3RzXHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLiNyZXF1ZXN0RnVuY3Rpb24odGhpcy4jcmVxdWVzdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2FkZFJlc3BvbnNlKHJlc3BvbnNlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuI2Vycm9yID0gZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFjayBpcyBmdWxsXHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gICAgICAgICAgICAgICBcclxuXHJcbiAgICAgICAgICAgIHRoaXMuI2N1cnJlbnRseVBvcHVsYXRpbmcgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY2FjaGUgd2lsbCBubyBsb25nZXIgY29udGludWUgdG8gcG9wdWxhdGUgaXRzZWxmLlxyXG4gICAgICovXHJcbiAgICBzdG9wKCkge1xyXG4gICAgICAgIHRoaXMuI3BhdXNlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY2FjaGUgd2lsbCByZXN1bWUgcG9wdWxhdGluZyBpdHNlbGYgaWYgc3RvcHBlZC5cclxuICAgICAqL1xyXG4gICAgcmVzdW1lKCkge1xyXG4gICAgICAgIHRoaXMuI3BhdXNlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBjaGVjayBpZiBpdCBuZWVkcyB0byBiZSByZXBvcHVsYXRlZFxyXG4gICAgICAgIHRoaXMuI3JlZnJlc2goKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBpZiB0aGUgY2FjaGUgaXMgY3VycmVudGx5IG5vdCByZS1wb3B1bGF0aW5nIGl0c2VsZi5cclxuICAgICAqIFxyXG4gICAgICogVmFsdWVzIGN1cnJlbnRseSBjYWNoZWQgbWF5IHN0aWxsIGJlIHJldHJpZXZlZCB3aXRoIGdldCgpIGJ1dCBubyBuZXdcclxuICAgICAqIHZhbHVlcyBhcmUgYmVpbmcgZmV0Y2hlZCBmcm9tIHRoZSBzZXJ2ZXIuIFRoaXMgc3RhdGUgY2FuIGJlIGNoYW5nZWQgd2l0aFxyXG4gICAgICogc3RvcCgpIGFuZCByZXN1bWUoKS5cclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIGNhY2hlIGlzIGN1cnJlbnRseSBub3QgcmUtcG9wdWxhdGluZyBpdHNlbGYsXHJcbiAgICAgKiAgICAgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAgICovXHJcbiAgICBpc1BhdXNlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy4jcGF1c2VkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgbmV4dCByZXNwb25zZS5cclxuICAgICAqIE5vdGUgdGhhdCBpZiB0aGUgY2FjaGUgaXMgZW1wdHksIGlmIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIHVuc3VpdGFibGUgcGFyYW1ldGVyXHJcbiAgICAgKiB2YWx1ZXMgb3IgaWYgdGhlIGRhaWx5IGFsbG93YW5jZSBvZiBiaXRzL3JlcXVlc3RzIGhhcyBiZWVuIHJlYWNoZWQsIHRoZSBhcHByb3ByaWF0ZVxyXG4gICAgICogZXJyb3Igd2lsbCBiZSB0aHJvd24uXHJcbiAgICAgKiBAcmV0dXJucyB7YW55W119IFRoZSBuZXh0IGFwcHJvcHJpYXRlIHJlc3BvbnNlIGZvciB0aGUgcmVxdWVzdCB0aGlzIFJhbmRvbU9yZ0NhY2hlXHJcbiAgICAgKiAgICAgcmVwcmVzZW50cyBvciwgaWYgc3RhY2sgaXMgZW1wdHkgdGhyb3dzIGFuIGVycm9yLlxyXG4gICAgICogQHRocm93cyBSYW5kb21PcmdDYWNoZUVtcHR5RXJyb3IgaWYgdGhlIGNhY2hlIGlzIGVtcHR5LlxyXG4gICAgICovXHJcbiAgICBnZXQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuI2Vycm9yICE9IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgdGhpcy4jZXJyb3I7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLiNzdGFjayAmJiB0aGlzLiNzdGFjay5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy4jcGF1c2VkKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yKCdUaGUgUmFuZG9tT3JnQ2FjaGUgc3RhY2sgJ1xyXG4gICAgICAgICAgICAgICAgICAgICsgJ2lzIGVtcHR5IGFuZCB0aGUgY2FjaGUgaXMgcGF1c2VkLiBQbGVhc2UgY2FsbCByZXN1bWUoKSB0byAnXHJcbiAgICAgICAgICAgICAgICAgICAgKyAncmVzdGFydCBwb3B1bGF0aW5nIHRoZSBjYWNoZS4nLCB0cnVlKTsgICAgICAgICAgICBcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5kb21PcmdDYWNoZUVtcHR5RXJyb3IoJ1RoZSBSYW5kb21PcmdDYWNoZSBzdGFjayAnXHJcbiAgICAgICAgICAgICAgICAgICAgKyAnaXMgZW1wdHksIHBsZWFzZSB3YWl0IGZvciBpdCB0byByZXBvcHVsYXRlIGl0c2VsZi4nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBkYXRhID0gdGhpcy4jc3RhY2sucG9wKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiBpdCBuZWVkcyB0byBiZSByZXBvcHVsYXRlZFxyXG4gICAgICAgICAgICB0aGlzLiNyZWZyZXNoKCk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgbmV4dCByZXNwb25zZSBvciB3YWl0IHVudGlsIHRoZSBuZXh0IHZhbHVlIGlzIGF2YWlsYWJsZS4gVGhpcyBtZXRob2RcclxuICAgICAqIHdpbGwgYmxvY2sgdW50aWwgYSB2YWx1ZSBpcyBhdmFpbGFibGUuIE5vdGU6IHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXJyb3JcclxuICAgICAqIGlmIHRoZSBjYWNoZSBpcyBlbXB0eSBhbmQgaGFzIGJlZW4gcGF1c2VkLCBpLmUuIGlzIG5vdCBiZWluZyBwb3B1bGF0ZWQuIElmXHJcbiAgICAgKiB0aGUgY2FjaGUgd2FzIGNvbnN0cnVjdGVkIHdpdGggdW5zdWl0YWJsZSBwYXJhbWV0ZXIgdmFsdWVzIG9yIHRoZSBkYWlseSBhbGxvd2FuY2VcclxuICAgICAqIG9mIGJpdHMvcmVxdWVzdHMgaGFzIGJlZW4gcmVhY2hlZCwgdGhlIGFwcHJvcHJpYXRlIGVycm9yIHdpbGwgYWxzbyBiZSB0aHJvd24uXHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnlbXT59IFRoZSBuZXh0IGFwcHJvcHJpYXRlIHJlc3BvbnNlIGZvciB0aGUgcmVxdWVzdCB0aGlzXHJcbiAgICAgKiBSYW5kb21PcmdDYWNoZSByZXByZXNlbnRzLlxyXG4gICAgICogQHRocm93cyBSYW5kb21PcmdDYWNoZUVtcHR5RXJyb3IgaWYgdGhlIGNhY2hlIGlzIGVtcHR5IGFuZCBpcyBwYXVzZWQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdldE9yV2FpdCgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgdmFsdWVzID0gdGhpcy5nZXQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlcztcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4jcGF1c2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNhY2hlIGlzIHBhdXNlZCBhbmQgd2lsbCBub3QgcmV0dXJuIGFueSB2YWx1ZXNcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IGNhY2hlZFZhbHVlcyA9IGF3YWl0IHRoaXMuI3BvcHVsYXRlKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkVmFsdWVzID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY2FjaGUgaGFzIG5vdCB5ZXQgcmVwb3B1bGF0ZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIDUwKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRPcldhaXQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIG51bWJlciBvZiByZXN1bHQgc2V0cyByZW1haW5pbmcgaW4gdGhlIGNhY2hlLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGlzIGVzc2VudGlhbGx5IHJldHVybnMgaG93IG9mdGVuIGdldCgpIG1heSBiZSBjYWxsZWQgd2l0aG91dFxyXG4gICAgICogYSBjYWNoZSByZWZpbGwuXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBDdXJyZW50IG51bWJlciBvZiBjYWNoZWQgcmVzdWx0cy5cclxuICAgICAqL1xyXG4gICAgZ2V0Q2FjaGVkVmFsdWVzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLiNzdGFjay5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgYml0cyB1c2VkIGJ5IHRoaXMgY2FjaGUuXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBOdW1iZXIgb2YgYml0cyB1c2VkLlxyXG4gICAgICovXHJcbiAgICBnZXRCaXRzVXNlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy4jYml0c1VzZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIG51bWJlciBvZiByZXF1ZXN0cyB1c2VkIGJ5IHRoaXMgY2FjaGUuXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBOdW1iZXIgb2YgcmVxdWVzdHMgdXNlZC5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVxdWVzdHNVc2VkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLiNyZXF1ZXN0c1VzZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIGNhY2hlIG5lZWRzIHRvIGJlIHJlcG9wdWxhdGVkLlxyXG4gICAgICovXHJcbiAgICAjcmVmcmVzaCA9ICgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy4jYnVsa1JlcXVlc3ROdW1iZXIgPiAwICYmIHRoaXMuI3N0YWNrLmxlbmd0aCA8PSAodGhpcy4jY2FjaGVTaXplIC0gdGhpcy4jYnVsa1JlcXVlc3ROdW1iZXIpKSB7XHJcbiAgICAgICAgICAgIC8vIGJ1bGsgcmVxdWVzdHNcclxuICAgICAgICAgICAgdGhpcy4jcG9wdWxhdGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy4jYnVsa1JlcXVlc3ROdW1iZXIgPD0gMCAmJiB0aGlzLiNzdGFjay5sZW5ndGggPCB0aGlzLiNjYWNoZVNpemUpIHtcclxuICAgICAgICAgICAgLy8gaW5kaXZpZHVhbCByZXF1ZXN0c1xyXG4gICAgICAgICAgICB0aGlzLiNwb3B1bGF0ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byBhZGQgYSByZXNwb25zZSB0byB0aGUgc3RhY2suXHJcbiAgICAgKiBAcGFyYW0ge2FueVtdfSByZXNwb25zZSBUaGUgcmVzcG9uc2UgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBidWxrIFRydWUgaWYgdGhlIGNhY2hlIGlzc3VlcyBidWxrIHJlcXVlc3RzLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICAgKi9cclxuICAgICNhZGRSZXNwb25zZSA9IChyZXNwb25zZSwgYnVsaykgPT4ge1xyXG4gICAgICAgIHRoaXMuI3JlcXVlc3RzVXNlZCsrO1xyXG4gICAgICAgIHRoaXMuI2JpdHNVc2VkICs9IHJlc3BvbnNlLnJlc3VsdC5iaXRzVXNlZDtcclxuXHJcbiAgICAgICAgaWYgKGJ1bGspIHtcclxuICAgICAgICAgICAgbGV0IGRhdGEgPSByZXNwb25zZS5yZXN1bHQucmFuZG9tLmRhdGE7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gdGhpcy4jcmVxdWVzdE51bWJlcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy4jc3RhY2sucHVzaChkYXRhLnNsaWNlKGksIGkgKyB0aGlzLiNyZXF1ZXN0TnVtYmVyKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLiNzdGFjay5wdXNoKHJlc3BvbnNlLnJlc3VsdC5yYW5kb20uZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxuY29uc3Qge1xyXG4gICAgUmFuZG9tT3JnQmFkSFRUUFJlc3BvbnNlRXJyb3IsXHJcbiAgICBSYW5kb21PcmdJbnN1ZmZpY2llbnRCaXRzRXJyb3IsXHJcbiAgICBSYW5kb21PcmdJbnN1ZmZpY2llbnRSZXF1ZXN0c0Vycm9yLFxyXG4gICAgUmFuZG9tT3JnSlNPTlJQQ0Vycm9yLFxyXG4gICAgUmFuZG9tT3JnS2V5Tm90UnVubmluZ0Vycm9yLFxyXG4gICAgUmFuZG9tT3JnUkFORE9NT1JHRXJyb3IsXHJcbiAgICBSYW5kb21PcmdTZW5kVGltZW91dEVycm9yXHJcbn0gPSByZXF1aXJlKCcuL1JhbmRvbU9yZ0Vycm9ycy5qcycpO1xyXG5jb25zdCBSYW5kb21PcmdDYWNoZSA9IHJlcXVpcmUoJy4vUmFuZG9tT3JnQ2FjaGUuanMnKTtcclxuLyogbm9kZS1pbXBvcnQgKi9cclxuY29uc3QgWE1MSHR0cFJlcXVlc3QgPSByZXF1aXJlKCd4bWxodHRwcmVxdWVzdCcpLlhNTEh0dHBSZXF1ZXN0O1xyXG4vKiBlbmQtbm9kZS1pbXBvcnQgKi9cclxuXHJcbi8qKlxyXG4gKiBSYW5kb21PcmdDbGllbnQgbWFpbiBjbGFzcyB0aHJvdWdoIHdoaWNoIEFQSSBmdW5jdGlvbnMgYXJlIGFjY2Vzc2VkLlxyXG4gKiBcclxuICogVGhpcyBjbGFzcyBwcm92aWRlcyBhY2Nlc3MgdG8gYm90aCB0aGUgc2lnbmVkIGFuZCB1bnNpZ25lZCBtZXRob2RzIG9mIHRoZVxyXG4gKiBSQU5ET00uT1JHIEFQSS5cclxuICogXHJcbiAqIFRoZSBjbGFzcyBhbHNvIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgY3JlYXRpb24gb2YgYSBjb252ZW5pZW5jZSBjbGFzcywgUmFuZG9tT3JnQ2FjaGUsXHJcbiAqIGZvciBwcmVjYWNoaW5nIEFQSSByZXNwb25zZXMgd2hlbiB0aGUgcmVxdWVzdCBpcyBrbm93biBpbiBhZHZhbmNlLlxyXG4gKiBcclxuICogVGhpcyBjbGFzcyB3aWxsIG9ubHkgYWxsb3cgdGhlIGNyZWF0aW9uIG9mIG9uZSBpbnN0YW5jZSBwZXIgQVBJIGtleS4gSWYgYW5cclxuICogaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBhbHJlYWR5IGV4aXN0cyBmb3IgYSBnaXZlbiBrZXksIHRoYXQgaW5zdGFuY2Ugd2lsbCBiZVxyXG4gKiByZXR1cm5lZCBpbnN0ZWFkIG9mIGEgbmV3IGluc3RhbmNlLlxyXG4gKiBcclxuICogVGhpcyBjbGFzcyBvYmV5cyBtb3N0IG9mIHRoZSBndWlkZWxpbmVzIHNldCBmb3J0aCBpbiBodHRwczovL2FwaS5yYW5kb20ub3JnL2pzb24tcnBjLzRcclxuICogQWxsIHJlcXVlc3RzIHJlc3BlY3QgdGhlIHNlcnZlcidzIGFkdmlzb3J5RGVsYXkgcmV0dXJuZWQgaW4gYW55IHJlc3BvbnNlcywgb3IgdXNlXHJcbiAqIERFRkFVTFRfREVMQVkgaWYgbm8gYWR2aXNvcnlEZWxheSBpcyByZXR1cm5lZC4gSWYgdGhlIHN1cHBsaWVkIEFQSSBrZXkgaXMgcGF1c2VkLCBpLmUuLFxyXG4gKiBoYXMgZXhjZWVkZWQgaXRzIGRhaWx5IGJpdC9yZXF1ZXN0IGFsbG93YW5jZSwgdGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIGJhY2sgb2ZmIHVudGlsXHJcbiAqIG1pZG5pZ2h0IFVUQy5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gY2xhc3MgUmFuZG9tT3JnQ2xpZW50IHtcclxuICAgIC8vIEJhc2ljIEFQSVxyXG4gICAgc3RhdGljICNJTlRFR0VSX01FVEhPRCA9ICdnZW5lcmF0ZUludGVnZXJzJztcclxuICAgIHN0YXRpYyAjSU5URUdFUl9TRVFVRU5DRV9NRVRIT0QgPSAnZ2VuZXJhdGVJbnRlZ2VyU2VxdWVuY2VzJztcclxuICAgIHN0YXRpYyAjREVDSU1BTF9GUkFDVElPTl9NRVRIT0QgPSAnZ2VuZXJhdGVEZWNpbWFsRnJhY3Rpb25zJztcclxuICAgIHN0YXRpYyAjR0FVU1NJQU5fTUVUSE9EID0gJ2dlbmVyYXRlR2F1c3NpYW5zJztcclxuICAgIHN0YXRpYyAjU1RSSU5HX01FVEhPRCA9ICdnZW5lcmF0ZVN0cmluZ3MnO1xyXG4gICAgc3RhdGljICNVVUlEX01FVEhPRCA9ICdnZW5lcmF0ZVVVSURzJztcclxuICAgIHN0YXRpYyAjQkxPQl9NRVRIT0QgPSAnZ2VuZXJhdGVCbG9icyc7XHJcbiAgICBzdGF0aWMgI0dFVF9VU0FHRV9NRVRIT0QgPSAnZ2V0VXNhZ2UnO1xyXG5cclxuICAgIC8vIFNpZ25lZCBBUElcclxuICAgIHN0YXRpYyAjU0lHTkVEX0lOVEVHRVJfTUVUSE9EID0gJ2dlbmVyYXRlU2lnbmVkSW50ZWdlcnMnO1xyXG4gICAgc3RhdGljICNTSUdORURfSU5URUdFUl9TRVFVRU5DRV9NRVRIT0QgPSAnZ2VuZXJhdGVTaWduZWRJbnRlZ2VyU2VxdWVuY2VzJztcclxuICAgIHN0YXRpYyAjU0lHTkVEX0RFQ0lNQUxfRlJBQ1RJT05fTUVUSE9EID0gJ2dlbmVyYXRlU2lnbmVkRGVjaW1hbEZyYWN0aW9ucyc7XHJcbiAgICBzdGF0aWMgI1NJR05FRF9HQVVTU0lBTl9NRVRIT0QgPSAnZ2VuZXJhdGVTaWduZWRHYXVzc2lhbnMnO1xyXG4gICAgc3RhdGljICNTSUdORURfU1RSSU5HX01FVEhPRCA9ICdnZW5lcmF0ZVNpZ25lZFN0cmluZ3MnO1xyXG4gICAgc3RhdGljICNTSUdORURfVVVJRF9NRVRIT0QgPSAnZ2VuZXJhdGVTaWduZWRVVUlEcyc7XHJcbiAgICBzdGF0aWMgI1NJR05FRF9CTE9CX01FVEhPRCA9ICdnZW5lcmF0ZVNpZ25lZEJsb2JzJztcclxuICAgIHN0YXRpYyAjR0VUX1JFU1VMVF9NRVRIT0QgPSAnZ2V0UmVzdWx0JztcclxuICAgIHN0YXRpYyAjQ1JFQVRFX1RJQ0tFVF9NRVRIT0QgPSAnY3JlYXRlVGlja2V0cyc7XHJcbiAgICBzdGF0aWMgI0xJU1RfVElDS0VUX01FVEhPRCA9ICdsaXN0VGlja2V0cyc7XHJcbiAgICBzdGF0aWMgI1JFVkVBTF9USUNLRVRfTUVUSE9EID0gJ3JldmVhbFRpY2tldHMnO1xyXG4gICAgc3RhdGljICNHRVRfVElDS0VUX01FVEhPRCA9ICdnZXRUaWNrZXQnO1xyXG4gICAgc3RhdGljICNWRVJJRllfU0lHTkFUVVJFX01FVEhPRCA9ICd2ZXJpZnlTaWduYXR1cmUnO1xyXG5cclxuICAgIC8vIEJsb2IgZm9ybWF0IGxpdGVyYWxzXHJcbiAgICAvKiogQmxvYiBmb3JtYXQgbGl0ZXJhbCwgYmFzZTY0IGVuY29kaW5nIChkZWZhdWx0KS4gKi9cclxuICAgIHN0YXRpYyBCTE9CX0ZPUk1BVF9CQVNFNjQgPSAnYmFzZTY0JztcclxuICAgIC8qKiBCbG9iIGZvcm1hdCBsaXRlcmFsLCBoZXggZW5jb2RpbmcuICovXHJcbiAgICBzdGF0aWMgQkxPQl9GT1JNQVRfSEVYID0gJ2hleCc7XHJcblxyXG4gICAgLy8gRGVmYXVsdCB2YWx1ZXNcclxuICAgIC8qKiBEZWZhdWx0IHZhbHVlIGZvciB0aGUgcmVwbGFjZW1lbnQgcGFyYW1ldGVyICh0cnVlKS4gKi9cclxuICAgIHN0YXRpYyBERUZBVUxUX1JFUExBQ0VNRU5UID0gdHJ1ZTtcclxuICAgIC8qKiBEZWZhdWx0IHZhbHVlIGZvciB0aGUgYmFzZSBwYXJhbWV0ZXIgKDEwKS4gKi9cclxuICAgIHN0YXRpYyBERUZBVUxUX0JBU0UgPSAxMDtcclxuICAgIC8qKiBEZWZhdWx0IHZhbHVlIGZvciB0aGUgdXNlckRhdGEgcGFyYW1ldGVyIChudWxsKS4gKi9cclxuICAgIHN0YXRpYyBERUZBVUxUX1VTRVJfREFUQSA9IG51bGw7XHJcbiAgICAvKiogRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHRpY2tldElkIHBhcmFtZXRlciAobnVsbCkuICovXHJcbiAgICBzdGF0aWMgREVGQVVMVF9USUNLRVRfSUQgPSBudWxsO1xyXG4gICAgLyoqIERlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uIHBhcmFtZXRlciAobnVsbCkuICovXHJcbiAgICBzdGF0aWMgREVGQVVMVF9QUkVHRU5FUkFURURfUkFORE9NSVpBVElPTiA9IG51bGw7XHJcbiAgICAvKiogRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGxpY2Vuc2VEYXRhIHBhcmFtZXRlciAobnVsbCkuICovXHJcbiAgICBzdGF0aWMgREVGQVVMVF9MSUNFTlNFX0RBVEEgPSBudWxsO1xyXG5cclxuICAgIC8qKiBTaXplIG9mIGEgc2luZ2xlIFVVSUQgaW4gYml0cy4gKi9cclxuICAgIHN0YXRpYyBVVUlEX1NJWkUgPSAxMjI7XHJcbiAgICAvKiogRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGJsb2NraW5nVGltZW91dCBwYXJhbWV0ZXIgKDEgZGF5KS4gKi9cclxuICAgIHN0YXRpYyBERUZBVUxUX0JMT0NLSU5HX1RJTUVPVVQgPSAyNCAqIDYwICogNjAgKiAxMDAwO1xyXG4gICAgLyoqIERlZmF1bHQgdmFsdWUgZm9yIHRoZSBodHRwVGltZW91dCBwYXJhbWV0ZXIgKDIgbWludXRlcykuICovXHJcbiAgICBzdGF0aWMgREVGQVVMVF9IVFRQX1RJTUVPVVQgPSAxMjAgKiAxMDAwO1xyXG4gICAgLyoqIE1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWxsb3dlZCBpbiBhIHNpZ25hdHVyZSB2ZXJmaWNpYXRpb24gVVJMLiAqL1xyXG4gICAgc3RhdGljIE1BWF9VUkxfTEVOR1RIID0gMjA0NjtcclxuXHJcbiAgICAvLyBEZWZhdWx0IGJhY2stb2ZmIHRvIHVzZSBpZiBubyBhZHZpc29yeURlbGF5IGJhY2stb2ZmIHN1cHBsaWVkIGJ5IHNlcnZlciAoMSBzZWNvbmQpXHJcbiAgICBzdGF0aWMgI0RFRkFVTFRfREVMQVkgPSAxKjEwMDA7XHJcblxyXG4gICAgLy8gT24gcmVxdWVzdCBmZXRjaCBmcmVzaCBhbGxvd2FuY2Ugc3RhdGUgaWYgY3VycmVudCBzdGF0ZSBkYXRhIGlzIG9sZGVyIHRoYW5cclxuICAgIC8vIHRoaXMgdmFsdWUgKDEgaG91cikuXHJcbiAgICBzdGF0aWMgI0FMTE9XQU5DRV9TVEFURV9SRUZSRVNIX1NFQ09ORFMgPSAzNjAwICogMTAwMDtcclxuXHJcbiAgICAvLyBNYWludGFpbnMgdXNhZ2Ugc3RhdGlzdGljcyBmcm9tIHNlcnZlci5cclxuICAgICNiaXRzTGVmdCA9IC0xO1xyXG4gICAgI3JlcXVlc3RzTGVmdCA9IC0xO1xyXG5cclxuICAgIC8vIEJhY2stb2ZmIGluZm8gZm9yIHdoZW4gdGhlIEFQSSBrZXkgaXMgZGV0ZWN0ZWQgYXMgbm90IHJ1bm5pbmcsIHByb2JhYmx5XHJcbiAgICAvLyBiZWNhdXNlIHRoZSBrZXkgaGFzIGV4Y2VlZGVkIGl0cyBkYWlseSB1c2FnZSBsaW1pdC4gQmFjay1vZmYgcnVucyB1bnRpbFxyXG4gICAgLy8gbWlkbmlnaHQgVVRDLlxyXG4gICAgI2JhY2tvZmYgPSAtMTtcclxuICAgICNiYWNrb2ZmRXJyb3IgPSAnJztcclxuXHJcbiAgICAjYXBpS2V5ID0gJyc7XHJcbiAgICAjYmxvY2tpbmdUaW1lb3V0ID0gUmFuZG9tT3JnQ2xpZW50LkRFRkFVTFRfQkxPQ0tJTkdfVElNRU9VVDtcclxuICAgICNodHRwVGltZW91dCA9IFJhbmRvbU9yZ0NsaWVudC5ERUZBVUxUX0hUVFBfVElNRU9VVDtcclxuXHJcbiAgICAvLyBNYWludGFpbiBpbmZvIHRvIG9iZXkgc2VydmVyIGFkdmlzb3J5IGRlbGF5XHJcbiAgICAjYWR2aXNvcnlEZWxheSA9IDA7XHJcbiAgICAjbGFzdFJlc3BvbnNlUmVjZWl2ZWRUaW1lID0gMDtcclxuXHJcbiAgICAvLyBNYWludGFpbnMgYSBkaWN0aW9uYXJ5IG9mIEFQSSBrZXlzIGFuZCB0aGVpciBpbnN0YW5jZXMuXHJcbiAgICBzdGF0aWMgI2tleUluZGV4ZWRJbnN0YW5jZXMgPSB7fTtcclxuXHJcbiAgICBzdGF0aWMgI0VSUk9SX0NPREVTID0gWyAxMDAsIDEwMSwgMjAwLCAyMDEsIDIwMiwgMjAzLCAyMDQsIDMwMCxcclxuICAgICAgICAzMDEsIDMwMiwgMzAzLCAzMDQsIDMwNSwgMzA2LCAzMDcsIDQwMCwgNDAxLCA0MDIsIDQwMywgNDA0LFxyXG4gICAgICAgIDQwNSwgNDIwLCA0MjEsIDQyMiwgNDIzLCA0MjQsIDQyNSwgNDI2LCA1MDAsIDMyMDAwIF07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25zdHJ1Y3Rvci4gRW5zdXJlcyBvbmx5IG9uZSBpbnN0YW5jZSBvZiBSYW5kb21PcmdDbGllbnQgZXhpc3RzIHBlciBBUElcclxuICAgICAqIGtleS4gQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBpZiB0aGUgc3VwcGxpZWQga2V5IGlzbid0IGFscmVhZHkga25vd24sXHJcbiAgICAgKiBvdGhlcndpc2UgcmV0dXJucyB0aGUgcHJldmlvdXNseSBpbnN0YW50aWF0ZWQgb25lLlxyXG4gICAgICogQGNvbnN0cnVjdG9yXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXBpS2V5IEFQSSBrZXkgb2YgaW5zdGFuY2UgdG8gY3JlYXRlL2ZpbmQsIG9idGFpbmVkIGZyb21cclxuICAgICAqICAgICBSQU5ET00uT1JHLCBzZWUgaHR0cHM6Ly9hcGkucmFuZG9tLm9yZy9hcGkta2V5c1xyXG4gICAgICogQHBhcmFtIHt7YmxvY2tpbmdUaW1lb3V0PzogbnVtYmVyLCBodHRwVGltZW91dD86IG51bWJlcn19IG9wdGlvbnMgQW4gb2JqZWN0XHJcbiAgICAgKiAgICAgd2hpY2ggbWF5IGNvbnRhaW5zIGFueSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbmFsIHBhcmFtZXRlcnM6XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuYmxvY2tpbmdUaW1lb3V0ID0gMjQgKiA2MCAqIDYwICogMTAwMF0gTWF4aW11bVxyXG4gICAgICogICAgIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGJlaW5nIGFsbG93ZWQgdG8gc2VuZCBhIHJlcXVlc3QuXHJcbiAgICAgKiAgICAgTm90ZSB0aGlzIGlzIGEgaGludCBub3QgYSBndWFyYW50ZWUuIFRoZSBhZHZpc29yeSBkZWxheSBmcm9tIHNlcnZlclxyXG4gICAgICogICAgIG11c3QgYWx3YXlzIGJlIG9iZXllZC4gU3VwcGx5IGEgdmFsdWUgb2YgLTEgdG8gYWxsb3cgYmxvY2tpbmcgZm9yZXZlclxyXG4gICAgICogICAgIChkZWZhdWx0IDI0ICogNjAgKiA2MCAqIDEwMDAsIGkuZS4sIDEgZGF5KS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5odHRwVGltZW91dCA9IDEyMCAqIDEwMDBdIE1heGltdW0gdGltZSBpblxyXG4gICAgICogICAgIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciB0aGUgc2VydmVyIHJlc3BvbnNlIHRvIGEgcmVxdWVzdCAoZGVmYXVsdFxyXG4gICAgICogICAgIDEyMCoxMDAwKS5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoYXBpS2V5LCBvcHRpb25zID0ge30pIHtcclxuICAgICAgICBpZiAoUmFuZG9tT3JnQ2xpZW50LiNrZXlJbmRleGVkSW5zdGFuY2VzICYmIFJhbmRvbU9yZ0NsaWVudC4ja2V5SW5kZXhlZEluc3RhbmNlc1thcGlLZXldKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSYW5kb21PcmdDbGllbnQuI2tleUluZGV4ZWRJbnN0YW5jZXNbYXBpS2V5XTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLiNhcGlLZXkgPSBhcGlLZXk7XHJcbiAgICAgICAgICAgIHRoaXMuI2Jsb2NraW5nVGltZW91dCA9IG9wdGlvbnMuYmxvY2tpbmdUaW1lb3V0IHx8IDI0ICogNjAgKiA2MCAqIDEwMDA7XHJcbiAgICAgICAgICAgIHRoaXMuI2h0dHBUaW1lb3V0ID0gb3B0aW9ucy5odHRwVGltZW91dCB8fCAxMjAgKiAxMDAwO1xyXG5cclxuICAgICAgICAgICAgUmFuZG9tT3JnQ2xpZW50LiNrZXlJbmRleGVkSW5zdGFuY2VzW2FwaUtleV0gPSB0aGlzO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBCYXNpYyBBUElcclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlcXVlc3RzIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHRydWUgcmFuZG9tIGludGVnZXJzIHdpdGhpbiBhIHVzZXItZGVmaW5lZFxyXG4gICAgICogcmFuZ2UgZnJvbSB0aGUgc2VydmVyLlxyXG4gICAgICogXHJcbiAgICAgKiBTZWU6IGh0dHBzOi8vYXBpLnJhbmRvbS5vcmcvanNvbi1ycGMvNC9iYXNpYyNnZW5lcmF0ZUludGVnZXJzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHJhbmRvbSBpbnRlZ2VycyB5b3UgbmVlZC4gTXVzdCBiZSB3aXRoaW5cclxuICAgICAqICAgICB0aGUgWzEsMWU0XSByYW5nZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaW4gVGhlIGxvd2VyIGJvdW5kYXJ5IGZvciB0aGUgcmFuZ2UgZnJvbSB3aGljaCB0aGUgcmFuZG9tXHJcbiAgICAgKiAgICAgbnVtYmVycyB3aWxsIGJlIHBpY2tlZC4gTXVzdCBiZSB3aXRoaW4gdGhlIFstMWU5LDFlOV0gcmFuZ2UuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWF4IFRoZSB1cHBlciBib3VuZGFyeSBmb3IgdGhlIHJhbmdlIGZyb20gd2hpY2ggdGhlIHJhbmRvbVxyXG4gICAgICogICAgIG51bWJlcnMgd2lsbCBiZSBwaWNrZWQuIE11c3QgYmUgd2l0aGluIHRoZSBbLTFlOSwxZTldIHJhbmdlLlxyXG4gICAgICogQHBhcmFtIHt7cmVwbGFjZW1lbnQ/OiBib29sZWFuLCBiYXNlPzogbnVtYmVyLCBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uPzpcclxuICAgICAqICAgICBPYmplY3R9fSBvcHRpb25zIEFuIG9iamVjdCB3aGljaCBtYXkgY29udGFpbnMgYW55IG9mIHRoZSBmb2xsb3dpbmdcclxuICAgICAqICAgICBvcHRpb25hbCBwYXJhbWV0ZXJzOlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5yZXBsYWNlbWVudD10cnVlXSBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmFuZG9tXHJcbiAgICAgKiAgICAgbnVtYmVycyBzaG91bGQgYmUgcGlja2VkIHdpdGggcmVwbGFjZW1lbnQuIElmIHRydWUsIHRoZSByZXN1bHRpbmcgbnVtYmVyc1xyXG4gICAgICogICAgIG1heSBjb250YWluIGR1cGxpY2F0ZSB2YWx1ZXMsIG90aGVyd2lzZSB0aGUgbnVtYmVycyB3aWxsIGFsbCBiZSB1bmlxdWVcclxuICAgICAqICAgICAoZGVmYXVsdCB0cnVlKS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5iYXNlPTEwXSBUaGUgYmFzZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBkaXNwbGF5XHJcbiAgICAgKiAgICAgdGhlIG51bWJlcnMuIFZhbHVlcyBhbGxvd2VkIGFyZSAyLCA4LCAxMCBhbmQgMTYgKGRlZmF1bHQgMTApLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb249bnVsbF0gQSBkaWN0aW9uYXJ5IG9iamVjdFxyXG4gICAgICogICAgIHdoaWNoIGFsbG93cyB0aGUgY2xpZW50IHRvIHNwZWNpZnkgdGhhdCB0aGUgcmFuZG9tIHZhbHVlcyBzaG91bGQgYmVcclxuICAgICAqICAgICBnZW5lcmF0ZWQgZnJvbSBhIHByZWdlbmVyYXRlZCwgaGlzdG9yaWNhbCByYW5kb21pemF0aW9uIGluc3RlYWQgb2YgYVxyXG4gICAgICogICAgIG9uZS10aW1lIG9uLXRoZS1mbHkgcmFuZG9taXphdGlvbi4gVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIGNhc2VzOlxyXG4gICAgICogKiAqKm51bGwqKjogVGhlIHN0YW5kYXJkIHdheSBvZiBjYWxsaW5nIGZvciByYW5kb20gdmFsdWVzLCBpLmUudHJ1ZVxyXG4gICAgICogICAgICAgcmFuZG9tbmVzcyBpcyBnZW5lcmF0ZWQgYW5kIGRpc2NhcmRlZCBhZnRlcndhcmRzLlxyXG4gICAgICogKiAqKmRhdGUqKjogUkFORE9NLk9SRyB1c2VzIGhpc3RvcmljYWwgdHJ1ZSByYW5kb21uZXNzIGdlbmVyYXRlZCBvbiB0aGVcclxuICAgICAqICAgICAgIGNvcnJlc3BvbmRpbmcgZGF0ZSAocGFzdCBvciBwcmVzZW50LCBmb3JtYXQ6IHsgJ2RhdGUnLCAnWVlZWS1NTS1ERCcgfSkuXHJcbiAgICAgKiAqICoqaWQqKjogUkFORE9NLk9SRyB1c2VzIGhpc3RvcmljYWwgdHJ1ZSByYW5kb21uZXNzIGRlcml2ZWQgZnJvbSB0aGVcclxuICAgICAqICAgICAgIGNvcnJlc3BvbmRpbmcgaWRlbnRpZmllciBpbiBhIGRldGVybWluaXN0aWMgbWFubmVyLiBGb3JtYXQ6IHsgJ2lkJyxcclxuICAgICAqICAgICAgICdQRVJTSVNURU5ULUlERU5USUZJRVInIH0gd2hlcmUgJ1BFUlNJU1RFTlQtSURFTlRJRklFUicgaXMgYSBzdHJpbmdcclxuICAgICAqICAgICAgIHdpdGggbGVuZ3RoIGluIHRoZSBbMSwgNjRdIHJhbmdlLlxyXG4gICAgICogQHJldHVybnMgeyhQcm9taXNlPG51bWJlcltdPnxQcm9taXNlPHN0cmluZ1tdPil9IEEgUHJvbWlzZSB3aGljaCwgaWZcclxuICAgICAqICAgICByZXNvbHZlZCBzdWNjZXNzZnVsbHksIHJlcHJlc2VudHMgYW4gYXJyYXkgb2YgdHJ1ZSByYW5kb20gaW50ZWdlcnMuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdTZW5kVGltZW91dEVycm9yfSBUaHJvd24gd2hlbiBibG9ja2luZyB0aW1lb3V0IGlzIGV4Y2VlZGVkXHJcbiAgICAgKiAgICAgYmVmb3JlIHRoZSByZXF1ZXN0IGNhbiBiZSBzZW50LlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnS2V5Tm90UnVubmluZ0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgQVBJIGtleSBoYXMgYmVlblxyXG4gICAgICogICAgIHN0b3BwZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdJbnN1ZmZpY2llbnRSZXF1ZXN0c0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgQVBJIGtleSdzIHNlcnZlclxyXG4gICAgICogICAgIHJlcXVlc3RzIGFsbG93YW5jZSBoYXMgYmVlbiBleGNlZWRlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0luc3VmZmljaWVudEJpdHNFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkncyBzZXJ2ZXJcclxuICAgICAqICAgICBiaXRzIGFsbG93YW5jZSBoYXMgYmVlbiBleGNlZWRlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0JhZEhUVFBSZXNwb25zZUVycm9yfSBUaHJvd24gd2hlbiBhIEhUVFAgMjAwIE9LIHJlc3BvbnNlXHJcbiAgICAgKiAgICAgaXMgbm90IHJlY2VpdmVkLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnUkFORE9NT1JHRXJyb3J9IFRocm93biB3aGVuIHRoZSBzZXJ2ZXIgcmV0dXJucyBhIFJBTkRPTS5PUkdcclxuICAgICAqICAgICBFcnJvci5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0pTT05SUENFcnJvcn0gVGhyb3duIHdoZW4gdGhlIHNlcnZlciByZXR1cm5zIGEgSlNPTi1SUEMgRXJyb3IuXHJcbiAgICAgKiAqL1xyXG4gICAgYXN5bmMgZ2VuZXJhdGVJbnRlZ2VycyhuLCBtaW4sIG1heCwgb3B0aW9ucyA9IHt9KSB7XHJcbiAgICAgICAgbGV0IHJlcXVlc3QgPSB0aGlzLiNpbnRlZ2VyUmVxdWVzdChuLCBtaW4sIG1heCwgb3B0aW9ucyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuI2V4dHJhY3RCYXNpYyh0aGlzLiNzZW5kUmVxdWVzdChyZXF1ZXN0KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXF1ZXN0cyBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiB0cnVlIHJhbmRvbSBpbnRlZ2VyIHNlcXVlbmNlcyB3aXRoaW4gYVxyXG4gICAgICogdXNlci1kZWZpbmVkIHJhbmdlIGZyb20gdGhlIHNlcnZlci5cclxuICAgICAqIFxyXG4gICAgICogU2VlOiBodHRwczovL2FwaS5yYW5kb20ub3JnL2pzb24tcnBjLzQvYmFzaWMjZ2VuZXJhdGVJbnRlZ2VyU2VxdWVuY2VzXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBIb3cgbWFueSBhcnJheXMgb2YgcmFuZG9tIGludGVnZXJzIHlvdSBuZWVkLiBNdXN0IGJlXHJcbiAgICAgKiAgICAgd2l0aGluIHRoZSBbMSwxZTNdIHJhbmdlLlxyXG4gICAgICogQHBhcmFtIHsobnVtYmVyfG51bWJlcltdKX0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgZWFjaCBhcnJheSBvZiByYW5kb21cclxuICAgICAqICAgICBpbnRlZ2VycyByZXF1ZXN0ZWQuIEZvciB1bmlmb3JtIHNlcXVlbmNlcywgbGVuZ3RoIG11c3QgYmUgYW4gaW50ZWdlclxyXG4gICAgICogICAgIGluIHRoZSBbMSwgMWU0XSByYW5nZS4gRm9yIG11bHRpZm9ybSBzZXF1ZW5jZXMsIGxlbmd0aCBjYW4gYmUgYW4gYXJyYXlcclxuICAgICAqICAgICB3aXRoIG4gaW50ZWdlcnMsIGVhY2ggc3BlY2lmeWluZyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSBpZGVudGlmaWVkXHJcbiAgICAgKiAgICAgYnkgaXRzIGluZGV4LiBJbiB0aGlzIGNhc2UsIGVhY2ggdmFsdWUgaW4gbGVuZ3RoIG11c3QgYmUgd2l0aGluIHRoZVxyXG4gICAgICogICAgIFsxLCAxZTRdIHJhbmdlIGFuZCB0aGUgdG90YWwgc3VtIG9mIGFsbCB0aGUgbGVuZ3RocyBtdXN0IGJlIGluIHRoZVxyXG4gICAgICogICAgIFsxLCAxZTRdIHJhbmdlLlxyXG4gICAgICogQHBhcmFtIHsobnVtYmVyfG51bWJlcltdKX0gbWluIFRoZSBsb3dlciBib3VuZGFyeSBmb3IgdGhlIHJhbmdlIGZyb20gd2hpY2hcclxuICAgICAqICAgICB0aGUgcmFuZG9tIG51bWJlcnMgd2lsbCBiZSBwaWNrZWQuIEZvciB1bmlmb3JtIHNlcXVlbmNlcywgbWluIG11c3QgYmVcclxuICAgICAqICAgICBhbiBpbnRlZ2VyIGluIHRoZSBbLTFlOSwgMWU5XSByYW5nZS4gRm9yIG11bHRpZm9ybSBzZXF1ZW5jZXMsIG1pbiBjYW5cclxuICAgICAqICAgICBiZSBhbiBhcnJheSB3aXRoIG4gaW50ZWdlcnMsIGVhY2ggc3BlY2lmeWluZyB0aGUgbG93ZXIgYm91bmRhcnkgb2YgdGhlXHJcbiAgICAgKiAgICAgc2VxdWVuY2UgaWRlbnRpZmllZCBieSBpdHMgaW5kZXguIEluIHRoaXMgY2FzZSwgZWFjaCB2YWx1ZSBpbiBtaW4gbXVzdFxyXG4gICAgICogICAgIGJlIHdpdGhpbiB0aGUgWy0xZTksIDFlOV0gcmFuZ2UuXHJcbiAgICAgKiBAcGFyYW0geyhudW1iZXJ8bnVtYmVyW10pfSBtYXggVGhlIHVwcGVyIGJvdW5kYXJ5IGZvciB0aGUgcmFuZ2UgZnJvbSB3aGljaFxyXG4gICAgICogICAgIHRoZSByYW5kb20gbnVtYmVycyB3aWxsIGJlIHBpY2tlZC4gRm9yIHVuaWZvcm0gc2VxdWVuY2VzLCBtYXggbXVzdCBiZVxyXG4gICAgICogICAgIGFuIGludGVnZXIgaW4gdGhlIFstMWU5LCAxZTldIHJhbmdlLiBGb3IgbXVsdGlmb3JtIHNlcXVlbmNlcywgbWF4IGNhblxyXG4gICAgICogICAgIGJlIGFuIGFycmF5IHdpdGggbiBpbnRlZ2VycywgZWFjaCBzcGVjaWZ5aW5nIHRoZSB1cHBlciBib3VuZGFyeSBvZiB0aGVcclxuICAgICAqICAgICBzZXF1ZW5jZSBpZGVudGlmaWVkIGJ5IGl0cyBpbmRleC4gSW4gdGhpcyBjYXNlLCBlYWNoIHZhbHVlIGluIG1heCBtdXN0XHJcbiAgICAgKiAgICAgYmUgd2l0aGluIHRoZSBbLTFlOSwgMWU5XSByYW5nZS5cclxuICAgICAqIEBwYXJhbSB7e3JlcGxhY2VtZW50PzogYm9vbGVhbnxib29sZWFuW10sIGJhc2U/OiBudW1iZXJ8bnVtYmVyW10sXHJcbiAgICAgKiAgICAgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbj86IE9iamVjdH19IG9wdGlvbnMgQW4gb2JqZWN0IHdoaWNoIG1heSBjb250YWluc1xyXG4gICAgICogICAgIGFueSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbmFsIHBhcmFtZXRlcnM6XHJcbiAgICAgKiBAcGFyYW0geyhib29sZWFufGJvb2xlYW5bXSl9IFtvcHRpb25zLnJlcGxhY2VtZW50PXRydWVdIFNwZWNpZmllcyB3aGV0aGVyXHJcbiAgICAgKiAgICAgdGhlIHJhbmRvbSBudW1iZXJzIHNob3VsZCBiZSBwaWNrZWQgd2l0aCByZXBsYWNlbWVudC4gSWYgdHJ1ZSwgdGhlXHJcbiAgICAgKiAgICAgcmVzdWx0aW5nIG51bWJlcnMgbWF5IGNvbnRhaW4gZHVwbGljYXRlIHZhbHVlcywgb3RoZXJ3aXNlIHRoZSBudW1iZXJzXHJcbiAgICAgKiAgICAgd2lsbCBhbGwgYmUgdW5pcXVlLiBGb3IgbXVsdGlmb3JtIHNlcXVlbmNlcywgcmVwbGFjZW1lbnQgY2FuIGJlIGFuIGFycmF5XHJcbiAgICAgKiAgICAgd2l0aCBuIGJvb2xlYW4gdmFsdWVzLCBlYWNoIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgc2VxdWVuY2UgaWRlbnRpZmllZFxyXG4gICAgICogICAgIGJ5IGl0cyBpbmRleCB3aWxsIGJlIGNyZWF0ZWQgd2l0aCAodHJ1ZSkgb3Igd2l0aG91dCAoZmFsc2UpIHJlcGxhY2VtZW50XHJcbiAgICAgKiAgICAgKGRlZmF1bHQgdHJ1ZSkuXHJcbiAgICAgKiBAcGFyYW0geyhudW1iZXJ8bnVtYmVyW10pfSBbb3B0aW9ucy5iYXNlPTEwXSBUaGUgYmFzZSB0aGF0IHdpbGwgYmUgdXNlZFxyXG4gICAgICogICAgIHRvIGRpc3BsYXkgdGhlIG51bWJlcnMuIFZhbHVlcyBhbGxvd2VkIGFyZSAyLCA4LCAxMCBhbmQgMTYuIEZvciBtdWx0aWZvcm1cclxuICAgICAqICAgICBzZXF1ZW5jZXMsIGJhc2UgY2FuIGJlIGFuIGFycmF5IHdpdGggbiBpbnRlZ2VyIHZhbHVlcyB0YWtlbiBmcm9tIHRoZVxyXG4gICAgICogICAgIHNhbWUgc2V0LCBlYWNoIHNwZWNpZnlpbmcgdGhlIGJhc2UgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZGlzcGxheSB0aGVcclxuICAgICAqICAgICBzZXF1ZW5jZSBpZGVudGlmaWVkIGJ5IGl0cyBpbmRleCAoZGVmYXVsdCAxMCkuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMucHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbj1udWxsXSBBIGRpY3Rpb25hcnkgb2JqZWN0XHJcbiAgICAgKiAgICAgd2hpY2ggYWxsb3dzIHRoZSBjbGllbnQgdG8gc3BlY2lmeSB0aGF0IHRoZSByYW5kb20gdmFsdWVzIHNob3VsZCBiZVxyXG4gICAgICogICAgIGdlbmVyYXRlZCBmcm9tIGEgcHJlZ2VuZXJhdGVkLCBoaXN0b3JpY2FsIHJhbmRvbWl6YXRpb24gaW5zdGVhZCBvZiBhXHJcbiAgICAgKiAgICAgb25lLXRpbWUgb24tdGhlLWZseSByYW5kb21pemF0aW9uLiBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgY2FzZXM6XHJcbiAgICAgKiAqICoqbnVsbCoqOiBUaGUgc3RhbmRhcmQgd2F5IG9mIGNhbGxpbmcgZm9yIHJhbmRvbSB2YWx1ZXMsIGkuZS50cnVlXHJcbiAgICAgKiAgICAgICByYW5kb21uZXNzIGlzIGdlbmVyYXRlZCBhbmQgZGlzY2FyZGVkIGFmdGVyd2FyZHMuXHJcbiAgICAgKiAqICoqZGF0ZSoqOiBSQU5ET00uT1JHIHVzZXMgaGlzdG9yaWNhbCB0cnVlIHJhbmRvbW5lc3MgZ2VuZXJhdGVkIG9uIHRoZVxyXG4gICAgICogICAgICAgY29ycmVzcG9uZGluZyBkYXRlIChwYXN0IG9yIHByZXNlbnQsIGZvcm1hdDogeyAnZGF0ZScsICdZWVlZLU1NLUREJyB9KS5cclxuICAgICAqICogKippZCoqOiBSQU5ET00uT1JHIHVzZXMgaGlzdG9yaWNhbCB0cnVlIHJhbmRvbW5lc3MgZGVyaXZlZCBmcm9tIHRoZVxyXG4gICAgICogICAgICAgY29ycmVzcG9uZGluZyBpZGVudGlmaWVyIGluIGEgZGV0ZXJtaW5pc3RpYyBtYW5uZXIuIEZvcm1hdDogeyAnaWQnLFxyXG4gICAgICogICAgICAgJ1BFUlNJU1RFTlQtSURFTlRJRklFUicgfSB3aGVyZSAnUEVSU0lTVEVOVC1JREVOVElGSUVSJyBpcyBhIHN0cmluZ1xyXG4gICAgICogICAgICAgd2l0aCBsZW5ndGggaW4gdGhlIFsxLCA2NF0gcmFuZ2UuXHJcbiAgICAgKiBAcmV0dXJucyB7KFByb21pc2U8bnVtYmVyW11bXT58UHJvbWlzZTxzdHJpbmdbXVtdPil9IEEgUHJvbWlzZSB3aGljaCwgaWZcclxuICAgICAqICAgICByZXNvbHZlZCBzdWNjZXNzZnVsbHksIHJlcHJlc2VudHMgYW4gYXJyYXkgb2YgdHJ1ZSByYW5kb20gaW50ZWdlclxyXG4gICAgICogICAgIHNlcXVlbmNlcy5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ1NlbmRUaW1lb3V0RXJyb3J9IFRocm93biB3aGVuIGJsb2NraW5nIHRpbWVvdXQgaXMgZXhjZWVkZWRcclxuICAgICAqICAgICBiZWZvcmUgdGhlIHJlcXVlc3QgY2FuIGJlIHNlbnQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdLZXlOb3RSdW5uaW5nRXJyb3J9IFRocm93biB3aGVuIHRoZSBBUEkga2V5IGhhcyBiZWVuXHJcbiAgICAgKiAgICAgc3RvcHBlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0luc3VmZmljaWVudFJlcXVlc3RzRXJyb3J9IFRocm93biB3aGVuIHRoZSBBUEkga2V5J3Mgc2VydmVyXHJcbiAgICAgKiAgICAgcmVxdWVzdHMgYWxsb3dhbmNlIGhhcyBiZWVuIGV4Y2VlZGVkLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnSW5zdWZmaWNpZW50Qml0c0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgQVBJIGtleSdzIHNlcnZlclxyXG4gICAgICogICAgIGJpdHMgYWxsb3dhbmNlIGhhcyBiZWVuIGV4Y2VlZGVkLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnQmFkSFRUUFJlc3BvbnNlRXJyb3J9IFRocm93biB3aGVuIGEgSFRUUCAyMDAgT0sgcmVzcG9uc2VcclxuICAgICAqICAgICBpcyBub3QgcmVjZWl2ZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdSQU5ET01PUkdFcnJvcn0gVGhyb3duIHdoZW4gdGhlIHNlcnZlciByZXR1cm5zIGEgUkFORE9NLk9SR1xyXG4gICAgICogICAgIEVycm9yLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnSlNPTlJQQ0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgc2VydmVyIHJldHVybnMgYSBKU09OLVJQQyBFcnJvci5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgZ2VuZXJhdGVJbnRlZ2VyU2VxdWVuY2VzKG4sIGxlbmd0aCwgbWluLCBtYXgsIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgICAgIGxldCByZXF1ZXN0ID0gdGhpcy4jaW50ZWdlclNlcXVlbmNlUmVxdWVzdChuLCBsZW5ndGgsIG1pbiwgbWF4LCBvcHRpb25zKTtcclxuICAgICAgICByZXR1cm4gdGhpcy4jZXh0cmFjdEJhc2ljKHRoaXMuI3NlbmRSZXF1ZXN0KHJlcXVlc3QpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlcXVlc3RzIGFuZCByZXR1cm5zIGEgbGlzdCAoc2l6ZSBuKSBvZiB0cnVlIHJhbmRvbSBkZWNpbWFsIGZyYWN0aW9ucyxcclxuICAgICAqIGZyb20gYSB1bmlmb3JtIGRpc3RyaWJ1dGlvbiBhY3Jvc3MgdGhlIFswLDFdIGludGVydmFsIHdpdGggYSB1c2VyLWRlZmluZWRcclxuICAgICAqIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyBmcm9tIHRoZSBzZXJ2ZXIuXHJcbiAgICAgKiBcclxuICAgICAqIFNlZTogaHR0cHM6Ly9hcGkucmFuZG9tLm9yZy9qc29uLXJwYy80L2Jhc2ljI2dlbmVyYXRlRGVjaW1hbEZyYWN0aW9uc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gSG93IG1hbnkgcmFuZG9tIGRlY2ltYWwgZnJhY3Rpb25zIHlvdSBuZWVkLiBNdXN0IGJlXHJcbiAgICAgKiAgICAgd2l0aGluIHRoZSBbMSwxZTRdIHJhbmdlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlY2ltYWxQbGFjZXMgVGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0byB1c2UuIE11c3QgYmVcclxuICAgICAqICAgICB3aXRoaW4gdGhlIFsxLDIwXSByYW5nZS5cclxuICAgICAqIEBwYXJhbSB7e3JlcGxhY2VtZW50PzogYm9vbGVhbiwgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbj86IE9iamVjdH19IG9wdGlvbnNcclxuICAgICAqICAgICBBbiBvYmplY3Qgd2hpY2ggbWF5IGNvbnRhaW5zIGFueSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbmFsIHBhcmFtZXRlcnM6XHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnJlcGxhY2VtZW50PXRydWVdIFNwZWNpZmllcyB3aGV0aGVyIHRoZSByYW5kb21cclxuICAgICAqICAgICBudW1iZXJzIHNob3VsZCBiZSBwaWNrZWQgd2l0aCByZXBsYWNlbWVudC4gSWYgdHJ1ZSwgdGhlIHJlc3VsdGluZyBudW1iZXJzXHJcbiAgICAgKiAgICAgbWF5IGNvbnRhaW4gZHVwbGljYXRlIHZhbHVlcywgb3RoZXJ3aXNlIHRoZSBudW1iZXJzIHdpbGwgYWxsIGJlIHVuaXF1ZVxyXG4gICAgICogICAgIChkZWZhdWx0IHRydWUpLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb249bnVsbF0gQSBkaWN0aW9uYXJ5IG9iamVjdFxyXG4gICAgICogICAgIHdoaWNoIGFsbG93cyB0aGUgY2xpZW50IHRvIHNwZWNpZnkgdGhhdCB0aGUgcmFuZG9tIHZhbHVlcyBzaG91bGQgYmVcclxuICAgICAqICAgICBnZW5lcmF0ZWQgZnJvbSBhIHByZWdlbmVyYXRlZCwgaGlzdG9yaWNhbCByYW5kb21pemF0aW9uIGluc3RlYWQgb2YgYVxyXG4gICAgICogICAgIG9uZS10aW1lIG9uLXRoZS1mbHkgcmFuZG9taXphdGlvbi4gVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIGNhc2VzOlxyXG4gICAgICogKiAqKm51bGwqKjogVGhlIHN0YW5kYXJkIHdheSBvZiBjYWxsaW5nIGZvciByYW5kb20gdmFsdWVzLCBpLmUudHJ1ZVxyXG4gICAgICogICAgICAgcmFuZG9tbmVzcyBpcyBnZW5lcmF0ZWQgYW5kIGRpc2NhcmRlZCBhZnRlcndhcmRzLlxyXG4gICAgICogKiAqKmRhdGUqKjogUkFORE9NLk9SRyB1c2VzIGhpc3RvcmljYWwgdHJ1ZSByYW5kb21uZXNzIGdlbmVyYXRlZCBvbiB0aGVcclxuICAgICAqICAgICAgIGNvcnJlc3BvbmRpbmcgZGF0ZSAocGFzdCBvciBwcmVzZW50LCBmb3JtYXQ6IHsgJ2RhdGUnLCAnWVlZWS1NTS1ERCcgfSkuXHJcbiAgICAgKiAqICoqaWQqKjogUkFORE9NLk9SRyB1c2VzIGhpc3RvcmljYWwgdHJ1ZSByYW5kb21uZXNzIGRlcml2ZWQgZnJvbSB0aGVcclxuICAgICAqICAgICAgIGNvcnJlc3BvbmRpbmcgaWRlbnRpZmllciBpbiBhIGRldGVybWluaXN0aWMgbWFubmVyLiBGb3JtYXQ6IHsgJ2lkJyxcclxuICAgICAqICAgICAgICdQRVJTSVNURU5ULUlERU5USUZJRVInIH0gd2hlcmUgJ1BFUlNJU1RFTlQtSURFTlRJRklFUicgaXMgYSBzdHJpbmdcclxuICAgICAqICAgICAgIHdpdGggbGVuZ3RoIGluIHRoZSBbMSwgNjRdIHJhbmdlLlxyXG4gICAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyW10+fSBBIFByb21pc2Ugd2hpY2gsIGlmIHJlc29sdmVkIHN1Y2Nlc3NmdWxseSxcclxuICAgICAqICAgICByZXByZXNlbnRzIGFuIGFycmF5IG9mIHRydWUgcmFuZG9tIGRlY2ltYWwgZnJhY3Rpb25zLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnU2VuZFRpbWVvdXRFcnJvcn0gVGhyb3duIHdoZW4gYmxvY2tpbmcgdGltZW91dCBpcyBleGNlZWRlZFxyXG4gICAgICogICAgIGJlZm9yZSB0aGUgcmVxdWVzdCBjYW4gYmUgc2VudC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0tleU5vdFJ1bm5pbmdFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkgaGFzIGJlZW5cclxuICAgICAqICAgICBzdG9wcGVkLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnSW5zdWZmaWNpZW50UmVxdWVzdHNFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkncyBzZXJ2ZXJcclxuICAgICAqICAgICByZXF1ZXN0cyBhbGxvd2FuY2UgaGFzIGJlZW4gZXhjZWVkZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdJbnN1ZmZpY2llbnRCaXRzRXJyb3J9IFRocm93biB3aGVuIHRoZSBBUEkga2V5J3Mgc2VydmVyXHJcbiAgICAgKiAgICAgYml0cyBhbGxvd2FuY2UgaGFzIGJlZW4gZXhjZWVkZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdCYWRIVFRQUmVzcG9uc2VFcnJvcn0gVGhyb3duIHdoZW4gYSBIVFRQIDIwMCBPSyByZXNwb25zZVxyXG4gICAgICogICAgIGlzIG5vdCByZWNlaXZlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ1JBTkRPTU9SR0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgc2VydmVyIHJldHVybnMgYSBSQU5ET00uT1JHXHJcbiAgICAgKiAgICAgRXJyb3IuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdKU09OUlBDRXJyb3J9IFRocm93biB3aGVuIHRoZSBzZXJ2ZXIgcmV0dXJucyBhIEpTT04tUlBDIEVycm9yLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBnZW5lcmF0ZURlY2ltYWxGcmFjdGlvbnMobiwgZGVjaW1hbFBsYWNlcywgb3B0aW9ucyA9IHt9KSB7XHJcbiAgICAgICAgbGV0IHJlcXVlc3QgPSB0aGlzLiNkZWNpbWFsRnJhY3Rpb25SZXF1ZXN0KG4sIGRlY2ltYWxQbGFjZXMsIG9wdGlvbnMpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLiNleHRyYWN0QmFzaWModGhpcy4jc2VuZFJlcXVlc3QocmVxdWVzdCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVxdWVzdHMgYW5kIHJldHVybnMgYSBsaXN0IChzaXplIG4pIG9mIHRydWUgcmFuZG9tIG51bWJlcnMgZnJvbSBhXHJcbiAgICAgKiBHYXVzc2lhbiBkaXN0cmlidXRpb24gKGFsc28ga25vd24gYXMgYSBub3JtYWwgZGlzdHJpYnV0aW9uKS5cclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvcm0gdXNlcyBhIEJveC1NdWxsZXIgVHJhbnNmb3JtIHRvIGdlbmVyYXRlIHRoZSBHYXVzc2lhbiBkaXN0cmlidXRpb25cclxuICAgICAqIGZyb20gdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIG51bWJlcnMuXHJcbiAgICAgKiBTZWU6IGh0dHBzOi8vYXBpLnJhbmRvbS5vcmcvanNvbi1ycGMvNC9iYXNpYyNnZW5lcmF0ZUdhdXNzaWFuc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gSG93IG1hbnkgcmFuZG9tIG51bWJlcnMgeW91IG5lZWQuIE11c3QgYmUgd2l0aGluIHRoZVxyXG4gICAgICogICAgIFsxLDFlNF0gcmFuZ2UuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWVhbiBUaGUgZGlzdHJpYnV0aW9uJ3MgbWVhbi4gTXVzdCBiZSB3aXRoaW4gdGhlXHJcbiAgICAgKiAgICAgWy0xZTYsMWU2XSByYW5nZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFuZGFyZERldmlhdGlvbiBUaGUgZGlzdHJpYnV0aW9uJ3Mgc3RhbmRhcmQgZGV2aWF0aW9uLlxyXG4gICAgICogICAgIE11c3QgYmUgd2l0aGluIHRoZSBbLTFlNiwxZTZdIHJhbmdlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpZ25pZmljYW50RGlnaXRzIFRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgZGlnaXRzIHRvIHVzZS5cclxuICAgICAqICAgICBNdXN0IGJlIHdpdGhpbiB0aGUgWzIsMjBdIHJhbmdlLlxyXG4gICAgICogQHBhcmFtIHt7cHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbj86IE9iamVjdH19IG9wdGlvbnMgQW4gb2JqZWN0IHdoaWNoIG1heVxyXG4gICAgICogICAgIGNvbnRhaW5zIGFueSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbmFsIHBhcmFtZXRlcnM6XHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMucHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbj1udWxsXSBBIGRpY3Rpb25hcnkgb2JqZWN0XHJcbiAgICAgKiAgICAgd2hpY2ggYWxsb3dzIHRoZSBjbGllbnQgdG8gc3BlY2lmeSB0aGF0IHRoZSByYW5kb20gdmFsdWVzIHNob3VsZCBiZVxyXG4gICAgICogICAgIGdlbmVyYXRlZCBmcm9tIGEgcHJlZ2VuZXJhdGVkLCBoaXN0b3JpY2FsIHJhbmRvbWl6YXRpb24gaW5zdGVhZCBvZiBhXHJcbiAgICAgKiAgICAgb25lLXRpbWUgb24tdGhlLWZseSByYW5kb21pemF0aW9uLiBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgY2FzZXM6XHJcbiAgICAgKiAqICoqbnVsbCoqOiBUaGUgc3RhbmRhcmQgd2F5IG9mIGNhbGxpbmcgZm9yIHJhbmRvbSB2YWx1ZXMsIGkuZS50cnVlXHJcbiAgICAgKiAgICAgICByYW5kb21uZXNzIGlzIGdlbmVyYXRlZCBhbmQgZGlzY2FyZGVkIGFmdGVyd2FyZHMuXHJcbiAgICAgKiAqICoqZGF0ZSoqOiBSQU5ET00uT1JHIHVzZXMgaGlzdG9yaWNhbCB0cnVlIHJhbmRvbW5lc3MgZ2VuZXJhdGVkIG9uIHRoZVxyXG4gICAgICogICAgICAgY29ycmVzcG9uZGluZyBkYXRlIChwYXN0IG9yIHByZXNlbnQsIGZvcm1hdDogeyAnZGF0ZScsICdZWVlZLU1NLUREJyB9KS5cclxuICAgICAqICogKippZCoqOiBSQU5ET00uT1JHIHVzZXMgaGlzdG9yaWNhbCB0cnVlIHJhbmRvbW5lc3MgZGVyaXZlZCBmcm9tIHRoZVxyXG4gICAgICogICAgICAgY29ycmVzcG9uZGluZyBpZGVudGlmaWVyIGluIGEgZGV0ZXJtaW5pc3RpYyBtYW5uZXIuIEZvcm1hdDogeyAnaWQnLFxyXG4gICAgICogICAgICAgJ1BFUlNJU1RFTlQtSURFTlRJRklFUicgfSB3aGVyZSAnUEVSU0lTVEVOVC1JREVOVElGSUVSJyBpcyBhIHN0cmluZ1xyXG4gICAgICogICAgICAgd2l0aCBsZW5ndGggaW4gdGhlIFsxLCA2NF0gcmFuZ2UuXHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXJbXT59IEEgUHJvbWlzZSB3aGljaCwgaWYgcmVzb2x2ZWQgc3VjY2Vzc2Z1bGx5LFxyXG4gICAgICogICAgIHJlcHJlc2VudHMgYW4gYXJyYXkgb2YgdHJ1ZSByYW5kb20gbnVtYmVycyBmcm9tIGEgR2F1c3NpYW4gZGlzdHJpYnV0aW9uLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnU2VuZFRpbWVvdXRFcnJvcn0gVGhyb3duIHdoZW4gYmxvY2tpbmcgdGltZW91dCBpcyBleGNlZWRlZFxyXG4gICAgICogICAgIGJlZm9yZSB0aGUgcmVxdWVzdCBjYW4gYmUgc2VudC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0tleU5vdFJ1bm5pbmdFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkgaGFzIGJlZW5cclxuICAgICAqICAgICBzdG9wcGVkLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnSW5zdWZmaWNpZW50UmVxdWVzdHNFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkncyBzZXJ2ZXJcclxuICAgICAqICAgICByZXF1ZXN0cyBhbGxvd2FuY2UgaGFzIGJlZW4gZXhjZWVkZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdJbnN1ZmZpY2llbnRCaXRzRXJyb3J9IFRocm93biB3aGVuIHRoZSBBUEkga2V5J3Mgc2VydmVyXHJcbiAgICAgKiAgICAgYml0cyBhbGxvd2FuY2UgaGFzIGJlZW4gZXhjZWVkZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdCYWRIVFRQUmVzcG9uc2VFcnJvcn0gVGhyb3duIHdoZW4gYSBIVFRQIDIwMCBPSyByZXNwb25zZVxyXG4gICAgICogICAgIGlzIG5vdCByZWNlaXZlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ1JBTkRPTU9SR0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgc2VydmVyIHJldHVybnMgYSBSQU5ET00uT1JHXHJcbiAgICAgKiAgICAgRXJyb3IuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdKU09OUlBDRXJyb3J9IFRocm93biB3aGVuIHRoZSBzZXJ2ZXIgcmV0dXJucyBhIEpTT04tUlBDIEVycm9yLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBnZW5lcmF0ZUdhdXNzaWFucyhuLCBtZWFuLCBzdGFuZGFyZERldmlhdGlvbiwgc2lnbmlmaWNhbnREaWdpdHMsIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgICAgIGxldCByZXF1ZXN0ID0gdGhpcy4jZ2F1c3NpYW5SZXF1ZXN0KG4sIG1lYW4sIHN0YW5kYXJkRGV2aWF0aW9uLFxyXG4gICAgICAgICAgICBzaWduaWZpY2FudERpZ2l0cywgb3B0aW9ucyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuI2V4dHJhY3RCYXNpYyh0aGlzLiNzZW5kUmVxdWVzdChyZXF1ZXN0KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXF1ZXN0cyBhbmQgcmV0dXJucyBhIGxpc3QgKHNpemUgbikgb2YgdHJ1ZSByYW5kb20gdW5pY29kZSBzdHJpbmdzIGZyb21cclxuICAgICAqIHRoZSBzZXJ2ZXIuIFNlZTogaHR0cHM6Ly9hcGkucmFuZG9tLm9yZy9qc29uLXJwYy80L2Jhc2ljI2dlbmVyYXRlU3RyaW5nc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gSG93IG1hbnkgcmFuZG9tIHN0cmluZ3MgeW91IG5lZWQuIE11c3QgYmUgd2l0aGluIHRoZVxyXG4gICAgICogICAgIFsxLDFlNF0gcmFuZ2UuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgZWFjaCBzdHJpbmcuIE11c3QgYmUgd2l0aGluIHRoZVxyXG4gICAgICogICAgIFsxLDIwXSByYW5nZS4gQWxsIHN0cmluZ3Mgd2lsbCBiZSBvZiB0aGUgc2FtZSBsZW5ndGguXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhcmFjdGVycyBBIHN0cmluZyB0aGF0IGNvbnRhaW5zIHRoZSBzZXQgb2YgY2hhcmFjdGVyc1xyXG4gICAgICogICAgIHRoYXQgYXJlIGFsbG93ZWQgdG8gb2NjdXIgaW4gdGhlIHJhbmRvbSBzdHJpbmdzLiBUaGUgbWF4aW11bSBudW1iZXJcclxuICAgICAqICAgICBvZiBjaGFyYWN0ZXJzIGlzIDgwLlxyXG4gICAgICogQHBhcmFtIHt7cmVwbGFjZW1lbnQ/OiBib29sZWFuLCBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uPzogT2JqZWN0fX0gb3B0aW9uc1xyXG4gICAgICogICAgIEFuIG9iamVjdCB3aGljaCBtYXkgY29udGFpbnMgYW55IG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uYWwgcGFyYW1ldGVyczpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucmVwbGFjZW1lbnQ9dHJ1ZV0gU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJhbmRvbVxyXG4gICAgICogICAgIHN0cmluZ3Mgc2hvdWxkIGJlIHBpY2tlZCB3aXRoIHJlcGxhY2VtZW50LiBJZiB0cnVlLCB0aGUgcmVzdWx0aW5nIGxpc3RcclxuICAgICAqICAgICBvZiBzdHJpbmdzIG1heSBjb250YWluIGR1cGxpY2F0ZXMsIG90aGVyd2lzZSB0aGUgc3RyaW5ncyB3aWxsIGFsbCBiZVxyXG4gICAgICogICAgIHVuaXF1ZSAoZGVmYXVsdCB0cnVlKS5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5wcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uPW51bGxdIEEgZGljdGlvbmFyeSBvYmplY3RcclxuICAgICAqICAgICB3aGljaCBhbGxvd3MgdGhlIGNsaWVudCB0byBzcGVjaWZ5IHRoYXQgdGhlIHJhbmRvbSB2YWx1ZXMgc2hvdWxkIGJlXHJcbiAgICAgKiAgICAgZ2VuZXJhdGVkIGZyb20gYSBwcmVnZW5lcmF0ZWQsIGhpc3RvcmljYWwgcmFuZG9taXphdGlvbiBpbnN0ZWFkIG9mIGFcclxuICAgICAqICAgICBvbmUtdGltZSBvbi10aGUtZmx5IHJhbmRvbWl6YXRpb24uIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBjYXNlczpcclxuICAgICAqICogKipudWxsKio6IFRoZSBzdGFuZGFyZCB3YXkgb2YgY2FsbGluZyBmb3IgcmFuZG9tIHZhbHVlcywgaS5lLnRydWVcclxuICAgICAqICAgICAgIHJhbmRvbW5lc3MgaXMgZ2VuZXJhdGVkIGFuZCBkaXNjYXJkZWQgYWZ0ZXJ3YXJkcy5cclxuICAgICAqICogKipkYXRlKio6IFJBTkRPTS5PUkcgdXNlcyBoaXN0b3JpY2FsIHRydWUgcmFuZG9tbmVzcyBnZW5lcmF0ZWQgb24gdGhlXHJcbiAgICAgKiAgICAgICBjb3JyZXNwb25kaW5nIGRhdGUgKHBhc3Qgb3IgcHJlc2VudCwgZm9ybWF0OiB7ICdkYXRlJywgJ1lZWVktTU0tREQnIH0pLlxyXG4gICAgICogKiAqKmlkKio6IFJBTkRPTS5PUkcgdXNlcyBoaXN0b3JpY2FsIHRydWUgcmFuZG9tbmVzcyBkZXJpdmVkIGZyb20gdGhlXHJcbiAgICAgKiAgICAgICBjb3JyZXNwb25kaW5nIGlkZW50aWZpZXIgaW4gYSBkZXRlcm1pbmlzdGljIG1hbm5lci4gRm9ybWF0OiB7ICdpZCcsXHJcbiAgICAgKiAgICAgICAnUEVSU0lTVEVOVC1JREVOVElGSUVSJyB9IHdoZXJlICdQRVJTSVNURU5ULUlERU5USUZJRVInIGlzIGEgc3RyaW5nXHJcbiAgICAgKiAgICAgICB3aXRoIGxlbmd0aCBpbiB0aGUgWzEsIDY0XSByYW5nZS5cclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gQSBQcm9taXNlIHdoaWNoLCBpZiByZXNvbHZlZCBzdWNjZXNzZnVsbHksXHJcbiAgICAgKiAgICAgcmVwcmVzZW50cyBhbiBhcnJheSBvZiB0cnVlIHJhbmRvbSBzdHJpbmdzLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnU2VuZFRpbWVvdXRFcnJvcn0gVGhyb3duIHdoZW4gYmxvY2tpbmcgdGltZW91dCBpcyBleGNlZWRlZFxyXG4gICAgICogICAgIGJlZm9yZSB0aGUgcmVxdWVzdCBjYW4gYmUgc2VudC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0tleU5vdFJ1bm5pbmdFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkgaGFzIGJlZW5cclxuICAgICAqICAgICBzdG9wcGVkLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnSW5zdWZmaWNpZW50UmVxdWVzdHNFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkncyBzZXJ2ZXJcclxuICAgICAqICAgICByZXF1ZXN0cyBhbGxvd2FuY2UgaGFzIGJlZW4gZXhjZWVkZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdJbnN1ZmZpY2llbnRCaXRzRXJyb3J9IFRocm93biB3aGVuIHRoZSBBUEkga2V5J3Mgc2VydmVyXHJcbiAgICAgKiAgICAgYml0cyBhbGxvd2FuY2UgaGFzIGJlZW4gZXhjZWVkZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdCYWRIVFRQUmVzcG9uc2VFcnJvcn0gVGhyb3duIHdoZW4gYSBIVFRQIDIwMCBPSyByZXNwb25zZVxyXG4gICAgICogICAgIGlzIG5vdCByZWNlaXZlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ1JBTkRPTU9SR0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgc2VydmVyIHJldHVybnMgYSBSQU5ET00uT1JHXHJcbiAgICAgKiAgICAgRXJyb3IuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdKU09OUlBDRXJyb3J9IFRocm93biB3aGVuIHRoZSBzZXJ2ZXIgcmV0dXJucyBhIEpTT04tUlBDIEVycm9yLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBnZW5lcmF0ZVN0cmluZ3MobiwgbGVuZ3RoLCBjaGFyYWN0ZXJzLCBvcHRpb25zID0ge30pIHtcclxuICAgICAgICBsZXQgcmVxdWVzdCA9IHRoaXMuI3N0cmluZ1JlcXVlc3QobiwgbGVuZ3RoLCBjaGFyYWN0ZXJzLCBvcHRpb25zKTtcclxuICAgICAgICByZXR1cm4gdGhpcy4jZXh0cmFjdEJhc2ljKHRoaXMuI3NlbmRSZXF1ZXN0KHJlcXVlc3QpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlcXVlc3RzIGFuZCByZXR1cm5zIGEgbGlzdCAoc2l6ZSBuKSBvZiB2ZXJzaW9uIDQgdHJ1ZSByYW5kb20gVW5pdmVyc2FsbHlcclxuICAgICAqIFVuaXF1ZSBJRGVudGlmaWVycyAoVVVJRHMpIGluIGFjY29yZGFuY2Ugd2l0aCBzZWN0aW9uIDQuNCBvZiBSRkMgNDEyMixcclxuICAgICAqIGZyb20gdGhlIHNlcnZlci5cclxuICAgICAqIFxyXG4gICAgICogU2VlOiBodHRwczovL2FwaS5yYW5kb20ub3JnL2pzb24tcnBjLzQvYmFzaWMjZ2VuZXJhdGVVVUlEc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gSG93IG1hbnkgcmFuZG9tIFVVSURzIHlvdSBuZWVkLiBNdXN0IGJlIHdpdGhpbiB0aGVcclxuICAgICAqICAgICBbMSwxZTNdIHJhbmdlLlxyXG4gICAgICogQHBhcmFtIHt7cHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbj86IE9iamVjdH19IG9wdGlvbnMgQW4gb2JqZWN0IHdoaWNoIG1heVxyXG4gICAgICogICAgIGNvbnRhaW5zIGFueSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbmFsIHBhcmFtZXRlcnM6XHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMucHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbj1udWxsXSBBIGRpY3Rpb25hcnkgb2JqZWN0XHJcbiAgICAgKiAgICAgd2hpY2ggYWxsb3dzIHRoZSBjbGllbnQgdG8gc3BlY2lmeSB0aGF0IHRoZSByYW5kb20gdmFsdWVzIHNob3VsZCBiZVxyXG4gICAgICogICAgIGdlbmVyYXRlZCBmcm9tIGEgcHJlZ2VuZXJhdGVkLCBoaXN0b3JpY2FsIHJhbmRvbWl6YXRpb24gaW5zdGVhZCBvZiBhXHJcbiAgICAgKiAgICAgb25lLXRpbWUgb24tdGhlLWZseSByYW5kb21pemF0aW9uLiBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgY2FzZXM6XHJcbiAgICAgKiAqICoqbnVsbCoqOiBUaGUgc3RhbmRhcmQgd2F5IG9mIGNhbGxpbmcgZm9yIHJhbmRvbSB2YWx1ZXMsIGkuZS50cnVlXHJcbiAgICAgKiAgICAgICByYW5kb21uZXNzIGlzIGdlbmVyYXRlZCBhbmQgZGlzY2FyZGVkIGFmdGVyd2FyZHMuXHJcbiAgICAgKiAqICoqZGF0ZSoqOiBSQU5ET00uT1JHIHVzZXMgaGlzdG9yaWNhbCB0cnVlIHJhbmRvbW5lc3MgZ2VuZXJhdGVkIG9uIHRoZVxyXG4gICAgICogICAgICAgY29ycmVzcG9uZGluZyBkYXRlIChwYXN0IG9yIHByZXNlbnQsIGZvcm1hdDogeyAnZGF0ZScsICdZWVlZLU1NLUREJyB9KS5cclxuICAgICAqICogKippZCoqOiBSQU5ET00uT1JHIHVzZXMgaGlzdG9yaWNhbCB0cnVlIHJhbmRvbW5lc3MgZGVyaXZlZCBmcm9tIHRoZVxyXG4gICAgICogICAgICAgY29ycmVzcG9uZGluZyBpZGVudGlmaWVyIGluIGEgZGV0ZXJtaW5pc3RpYyBtYW5uZXIuIEZvcm1hdDogeyAnaWQnLFxyXG4gICAgICogICAgICAgJ1BFUlNJU1RFTlQtSURFTlRJRklFUicgfSB3aGVyZSAnUEVSU0lTVEVOVC1JREVOVElGSUVSJyBpcyBhIHN0cmluZ1xyXG4gICAgICogICAgICAgd2l0aCBsZW5ndGggaW4gdGhlIFsxLCA2NF0gcmFuZ2UuXHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IEEgUHJvbWlzZSB3aGljaCwgaWYgcmVzb2x2ZWQgc3VjY2Vzc2Z1bGx5LFxyXG4gICAgICogICAgIHJlcHJlc2VudHMgYW4gYXJyYXkgb2YgdHJ1ZSByYW5kb20gVVVJRHMuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdTZW5kVGltZW91dEVycm9yfSBUaHJvd24gd2hlbiBibG9ja2luZyB0aW1lb3V0IGlzIGV4Y2VlZGVkXHJcbiAgICAgKiAgICAgYmVmb3JlIHRoZSByZXF1ZXN0IGNhbiBiZSBzZW50LlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnS2V5Tm90UnVubmluZ0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgQVBJIGtleSBoYXMgYmVlblxyXG4gICAgICogICAgIHN0b3BwZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdJbnN1ZmZpY2llbnRSZXF1ZXN0c0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgQVBJIGtleSdzIHNlcnZlclxyXG4gICAgICogICAgIHJlcXVlc3RzIGFsbG93YW5jZSBoYXMgYmVlbiBleGNlZWRlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0luc3VmZmljaWVudEJpdHNFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkncyBzZXJ2ZXJcclxuICAgICAqICAgICBiaXRzIGFsbG93YW5jZSBoYXMgYmVlbiBleGNlZWRlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0JhZEhUVFBSZXNwb25zZUVycm9yfSBUaHJvd24gd2hlbiBhIEhUVFAgMjAwIE9LIHJlc3BvbnNlXHJcbiAgICAgKiAgICAgaXMgbm90IHJlY2VpdmVkLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnUkFORE9NT1JHRXJyb3J9IFRocm93biB3aGVuIHRoZSBzZXJ2ZXIgcmV0dXJucyBhIFJBTkRPTS5PUkdcclxuICAgICAqICAgICBFcnJvci5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0pTT05SUENFcnJvcn0gVGhyb3duIHdoZW4gdGhlIHNlcnZlciByZXR1cm5zIGEgSlNPTi1SUEMgRXJyb3IuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdlbmVyYXRlVVVJRHMobiwgb3B0aW9ucyA9IHt9KSB7XHJcbiAgICAgICAgbGV0IHJlcXVlc3QgPSB0aGlzLiNVVUlEUmVxdWVzdChuLCBvcHRpb25zKTtcclxuICAgICAgICByZXR1cm4gdGhpcy4jZXh0cmFjdEJhc2ljKHRoaXMuI3NlbmRSZXF1ZXN0KHJlcXVlc3QpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlcXVlc3RzIGFuZCByZXR1cm5zIGEgbGlzdCAoc2l6ZSBuKSBvZiBCaW5hcnkgTGFyZ2UgT0JqZWN0cyAoQkxPQnMpXHJcbiAgICAgKiBhcyB1bmljb2RlIHN0cmluZ3MgY29udGFpbmluZyB0cnVlIHJhbmRvbSBkYXRhIGZyb20gdGhlIHNlcnZlci5cclxuICAgICAqIFxyXG4gICAgICogU2VlOiBodHRwczovL2FwaS5yYW5kb20ub3JnL2pzb24tcnBjLzQvYmFzaWMjZ2VuZXJhdGVCbG9ic1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gSG93IG1hbnkgcmFuZG9tIGJsb2JzIHlvdSBuZWVkLiBNdXN0IGJlIHdpdGhpbiB0aGVcclxuICAgICAqICAgICBbMSwxMDBdIHJhbmdlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgVGhlIHNpemUgb2YgZWFjaCBibG9iLCBtZWFzdXJlZCBpbiBiaXRzLiBNdXN0IGJlXHJcbiAgICAgKiAgICAgd2l0aGluIHRoZSBbMSwxMDQ4NTc2XSByYW5nZSBhbmQgbXVzdCBiZSBkaXZpc2libGUgYnkgOC5cclxuICAgICAqIEBwYXJhbSB7e2Zvcm1hdD86IHN0cmluZywgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbj86IE9iamVjdH19IG9wdGlvbnNcclxuICAgICAqICAgICBBbiBvYmplY3Qgd2hpY2ggbWF5IGNvbnRhaW5zIGFueSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbmFsIHBhcmFtZXRlcnM6XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuZm9ybWF0PSdiYXNlNjQnXSBTcGVjaWZpZXMgdGhlIGZvcm1hdCBpbiB3aGljaFxyXG4gICAgICogICAgIHRoZSBibG9icyB3aWxsIGJlIHJldHVybmVkLiBWYWx1ZXMgYWxsb3dlZCBhcmUgJ2Jhc2U2NCcgYW5kICdoZXgnXHJcbiAgICAgKiAgICAgKGRlZmF1bHQgJ2Jhc2U2NCcpLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb249bnVsbF0gQSBkaWN0aW9uYXJ5IG9iamVjdFxyXG4gICAgICogICAgIHdoaWNoIGFsbG93cyB0aGUgY2xpZW50IHRvIHNwZWNpZnkgdGhhdCB0aGUgcmFuZG9tIHZhbHVlcyBzaG91bGQgYmVcclxuICAgICAqICAgICBnZW5lcmF0ZWQgZnJvbSBhIHByZWdlbmVyYXRlZCwgaGlzdG9yaWNhbCByYW5kb21pemF0aW9uIGluc3RlYWQgb2YgYVxyXG4gICAgICogICAgIG9uZS10aW1lIG9uLXRoZS1mbHkgcmFuZG9taXphdGlvbi4gVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIGNhc2VzOlxyXG4gICAgICogKiAqKm51bGwqKjogVGhlIHN0YW5kYXJkIHdheSBvZiBjYWxsaW5nIGZvciByYW5kb20gdmFsdWVzLCBpLmUudHJ1ZVxyXG4gICAgICogICAgICAgcmFuZG9tbmVzcyBpcyBnZW5lcmF0ZWQgYW5kIGRpc2NhcmRlZCBhZnRlcndhcmRzLlxyXG4gICAgICogKiAqKmRhdGUqKjogUkFORE9NLk9SRyB1c2VzIGhpc3RvcmljYWwgdHJ1ZSByYW5kb21uZXNzIGdlbmVyYXRlZCBvbiB0aGVcclxuICAgICAqICAgICAgIGNvcnJlc3BvbmRpbmcgZGF0ZSAocGFzdCBvciBwcmVzZW50LCBmb3JtYXQ6IHsgJ2RhdGUnLCAnWVlZWS1NTS1ERCcgfSkuXHJcbiAgICAgKiAqICoqaWQqKjogUkFORE9NLk9SRyB1c2VzIGhpc3RvcmljYWwgdHJ1ZSByYW5kb21uZXNzIGRlcml2ZWQgZnJvbSB0aGVcclxuICAgICAqICAgICAgIGNvcnJlc3BvbmRpbmcgaWRlbnRpZmllciBpbiBhIGRldGVybWluaXN0aWMgbWFubmVyLiBGb3JtYXQ6IHsgJ2lkJyxcclxuICAgICAqICAgICAgICdQRVJTSVNURU5ULUlERU5USUZJRVInIH0gd2hlcmUgJ1BFUlNJU1RFTlQtSURFTlRJRklFUicgaXMgYSBzdHJpbmdcclxuICAgICAqICAgICAgIHdpdGggbGVuZ3RoIGluIHRoZSBbMSwgNjRdIHJhbmdlLlxyXG4gICAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyW10+fSBBIFByb21pc2Ugd2hpY2gsIGlmIHJlc29sdmVkIHN1Y2Nlc3NmdWxseSxcclxuICAgICAqICAgICByZXByZXNlbnRzIGFuIGFycmF5IG9mIHRydWUgcmFuZG9tIGJsb2JzIGFzIHN0cmluZ3MuXHJcbiAgICAgKiBAc2VlIHtAbGluayBSYW5kb21PcmdDbGllbnQjQkxPQl9GT1JNQVRfQkFTRTY0fSBmb3IgJ2Jhc2U2NCcgKGRlZmF1bHQpLlxyXG4gICAgICogQHNlZSB7QGxpbmsgUmFuZG9tT3JnQ2xpZW50I0JMT0JfRk9STUFUX0hFWH0gZm9yICdoZXgnLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnU2VuZFRpbWVvdXRFcnJvcn0gVGhyb3duIHdoZW4gYmxvY2tpbmcgdGltZW91dCBpcyBleGNlZWRlZFxyXG4gICAgICogICAgIGJlZm9yZSB0aGUgcmVxdWVzdCBjYW4gYmUgc2VudC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0tleU5vdFJ1bm5pbmdFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkgaGFzIGJlZW5cclxuICAgICAqICAgICBzdG9wcGVkLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnSW5zdWZmaWNpZW50UmVxdWVzdHNFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkncyBzZXJ2ZXJcclxuICAgICAqICAgICByZXF1ZXN0cyBhbGxvd2FuY2UgaGFzIGJlZW4gZXhjZWVkZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdJbnN1ZmZpY2llbnRCaXRzRXJyb3J9IFRocm93biB3aGVuIHRoZSBBUEkga2V5J3Mgc2VydmVyXHJcbiAgICAgKiAgICAgYml0cyBhbGxvd2FuY2UgaGFzIGJlZW4gZXhjZWVkZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdCYWRIVFRQUmVzcG9uc2VFcnJvcn0gVGhyb3duIHdoZW4gYSBIVFRQIDIwMCBPSyByZXNwb25zZVxyXG4gICAgICogICAgIGlzIG5vdCByZWNlaXZlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ1JBTkRPTU9SR0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgc2VydmVyIHJldHVybnMgYSBSQU5ET00uT1JHXHJcbiAgICAgKiAgICAgRXJyb3IuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdKU09OUlBDRXJyb3J9IFRocm93biB3aGVuIHRoZSBzZXJ2ZXIgcmV0dXJucyBhIEpTT04tUlBDIEVycm9yLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBnZW5lcmF0ZUJsb2JzKG4sIHNpemUsIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgICAgIGxldCByZXF1ZXN0ID0gdGhpcy4jYmxvYlJlcXVlc3Qobiwgc2l6ZSwgb3B0aW9ucyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuI2V4dHJhY3RCYXNpYyh0aGlzLiNzZW5kUmVxdWVzdChyZXF1ZXN0KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU0lHTkVEIEFQSVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVxdWVzdHMgYSBsaXN0IChzaXplIG4pIG9mIHRydWUgcmFuZG9tIGludGVnZXJzIHdpdGhpbiBhIHVzZXItZGVmaW5lZFxyXG4gICAgICogcmFuZ2UgZnJvbSB0aGUgc2VydmVyLlxyXG4gICAgICogXHJcbiAgICAgKiBSZXR1cm5zIGEgUHJvbWlzZSB3aGljaCwgaWYgcmVzb2x2ZWQgc3VjY2Vzc2Z1bGx5LCByZXNwcmVzZW50cyBhbiBvYmplY3RcclxuICAgICAqIHdpdGggdGhlIHBhcnNlZCBpbnRlZ2VyIGxpc3QgbWFwcGVkIHRvICdkYXRhJywgdGhlIG9yaWdpbmFsIHJlc3BvbnNlIG1hcHBlZFxyXG4gICAgICogdG8gJ3JhbmRvbScsIGFuZCB0aGUgcmVzcG9uc2UncyBzaWduYXR1cmUgbWFwcGVkIHRvICdzaWduYXR1cmUnLlxyXG4gICAgICogU2VlOiBodHRwczovL2FwaS5yYW5kb20ub3JnL2pzb24tcnBjLzQvc2lnbmVkI2dlbmVyYXRlU2lnbmVkSW50ZWdlcnNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIEhvdyBtYW55IHJhbmRvbSBpbnRlZ2VycyB5b3UgbmVlZC4gTXVzdCBiZSB3aXRoaW4gdGhlXHJcbiAgICAgKiAgICAgWzEsMWU0XSByYW5nZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaW4gVGhlIGxvd2VyIGJvdW5kYXJ5IGZvciB0aGUgcmFuZ2UgZnJvbSB3aGljaCB0aGVcclxuICAgICAqICAgICByYW5kb20gbnVtYmVycyB3aWxsIGJlIHBpY2tlZC4gTXVzdCBiZSB3aXRoaW4gdGhlIFstMWU5LDFlOV0gcmFuZ2UuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWF4IFRoZSB1cHBlciBib3VuZGFyeSBmb3IgdGhlIHJhbmdlIGZyb20gd2hpY2ggdGhlXHJcbiAgICAgKiAgICAgcmFuZG9tIG51bWJlcnMgd2lsbCBiZSBwaWNrZWQuIE11c3QgYmUgd2l0aGluIHRoZSBbLTFlOSwxZTldIHJhbmdlLlxyXG4gICAgICogQHBhcmFtIHt7cmVwbGFjZW1lbnQ/OiBib29sZWFuLCBiYXNlPzogbnVtYmVyLCBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uPzpcclxuICAgICAqICAgICBPYmplY3QsIGxpY2Vuc2VEYXRhPzogT2JqZWN0LCB1c2VyRGF0YT86IE9iamVjdHxudW1iZXJ8c3RyaW5nLCB0aWNrZXRJZD86XHJcbiAgICAgKiAgICAgc3RyaW5nfX0gb3B0aW9ucyBBbiBvYmplY3Qgd2hpY2ggbWF5IGNvbnRhaW5zIGFueSBvZiB0aGUgZm9sbG93aW5nXHJcbiAgICAgKiAgICAgb3B0aW9uYWwgcGFyYW1ldGVyczpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucmVwbGFjZW1lbnQ9dHJ1ZV0gU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJhbmRvbVxyXG4gICAgICogICAgIG51bWJlcnMgc2hvdWxkIGJlIHBpY2tlZCB3aXRoIHJlcGxhY2VtZW50LiBJZiB0cnVlLCB0aGUgcmVzdWx0aW5nIG51bWJlcnNcclxuICAgICAqICAgICBtYXkgY29udGFpbiBkdXBsaWNhdGUgdmFsdWVzLCBvdGhlcndpc2UgdGhlIG51bWJlcnMgd2lsbCBhbGwgYmUgdW5pcXVlXHJcbiAgICAgKiAgICAgKGRlZmF1bHQgdHJ1ZSkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuYmFzZT0xMF0gVGhlIGJhc2UgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZGlzcGxheVxyXG4gICAgICogICAgIHRoZSBudW1iZXJzLiBWYWx1ZXMgYWxsb3dlZCBhcmUgMiwgOCwgMTAgYW5kIDE2IChkZWZhdWx0IDEwKS5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5wcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uPW51bGxdIEEgZGljdGlvbmFyeSBvYmplY3RcclxuICAgICAqICAgICB3aGljaCBhbGxvd3MgdGhlIGNsaWVudCB0byBzcGVjaWZ5IHRoYXQgdGhlIHJhbmRvbSB2YWx1ZXMgc2hvdWxkIGJlXHJcbiAgICAgKiAgICAgZ2VuZXJhdGVkIGZyb20gYSBwcmVnZW5lcmF0ZWQsIGhpc3RvcmljYWwgcmFuZG9taXphdGlvbiBpbnN0ZWFkIG9mIGFcclxuICAgICAqICAgICBvbmUtdGltZSBvbi10aGUtZmx5IHJhbmRvbWl6YXRpb24uIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBjYXNlczpcclxuICAgICAqICogKipudWxsKio6IFRoZSBzdGFuZGFyZCB3YXkgb2YgY2FsbGluZyBmb3IgcmFuZG9tIHZhbHVlcywgaS5lLnRydWVcclxuICAgICAqICAgICAgIHJhbmRvbW5lc3MgaXMgZ2VuZXJhdGVkIGFuZCBkaXNjYXJkZWQgYWZ0ZXJ3YXJkcy5cclxuICAgICAqICogKipkYXRlKio6IFJBTkRPTS5PUkcgdXNlcyBoaXN0b3JpY2FsIHRydWUgcmFuZG9tbmVzcyBnZW5lcmF0ZWQgb24gdGhlXHJcbiAgICAgKiAgICAgICBjb3JyZXNwb25kaW5nIGRhdGUgKHBhc3Qgb3IgcHJlc2VudCwgZm9ybWF0OiB7ICdkYXRlJywgJ1lZWVktTU0tREQnIH0pLlxyXG4gICAgICogKiAqKmlkKio6IFJBTkRPTS5PUkcgdXNlcyBoaXN0b3JpY2FsIHRydWUgcmFuZG9tbmVzcyBkZXJpdmVkIGZyb20gdGhlXHJcbiAgICAgKiAgICAgICBjb3JyZXNwb25kaW5nIGlkZW50aWZpZXIgaW4gYSBkZXRlcm1pbmlzdGljIG1hbm5lci4gRm9ybWF0OiB7ICdpZCcsXHJcbiAgICAgKiAgICAgICAnUEVSU0lTVEVOVC1JREVOVElGSUVSJyB9IHdoZXJlICdQRVJTSVNURU5ULUlERU5USUZJRVInIGlzIGEgc3RyaW5nXHJcbiAgICAgKiAgICAgICB3aXRoIGxlbmd0aCBpbiB0aGUgWzEsIDY0XSByYW5nZS5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5saWNlbnNlRGF0YT1udWxsXSBBIGRpY3Rpb25hcnkgb2JqZWN0IHdoaWNoIGFsbG93c1xyXG4gICAgICogICAgIHRoZSBjYWxsZXIgdG8gaW5jbHVkZSBkYXRhIG9mIHJlbGV2YW5jZSB0byB0aGUgbGljZW5zZSB0aGF0IGlzIGFzc29jaWF0ZWRcclxuICAgICAqICAgICB3aXRoIHRoZSBBUEkgS2V5LiBUaGlzIGlzIG1hbmRhdG9yeSBmb3IgQVBJIEtleXMgd2l0aCB0aGUgbGljZW5zZSB0eXBlXHJcbiAgICAgKiAgICAgJ0ZsZXhpYmxlIEdhbWJsaW5nJyBhbmQgZm9sbG93cyB0aGUgZm9ybWF0IHsgJ21heFBheW91dCc6IHsgJ2N1cnJlbmN5JzpcclxuICAgICAqICAgICAnWFRTJywgJ2Ftb3VudCc6IDAuMCB9fS4gVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGluIGxpY2Vuc2luZ1xyXG4gICAgICogICAgIHJlcXVlc3RlZCByYW5kb20gdmFsdWVzIGFuZCBpbiBiaWxsaW5nLiBUaGUgY3VycmVudGx5IHN1cHBvcnRlZFxyXG4gICAgICogICAgIGN1cnJlbmNpZXMgYXJlOiAnVVNEJywgJ0VVUicsICdHQlAnLCAnQlRDJywgJ0VUSCcuIFRoZSBtb3N0IHVwLXRvLWRhdGVcclxuICAgICAqICAgICBpbmZvcm1hdGlvbiBvbiB0aGUgY3VycmVuY2llcyBjYW4gYmUgZm91bmQgaW4gdGhlIFNpZ25lZCBBUElcclxuICAgICAqICAgICBkb2N1bWVudGF0aW9uLCBoZXJlOiBodHRwczovL2FwaS5yYW5kb20ub3JnL2pzb24tcnBjLzQvc2lnbmVkXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyfE9iamVjdCl9IFtvcHRpb25zLnVzZXJEYXRhPW51bGxdIE9iamVjdCB0aGF0IHdpbGwgYmVcclxuICAgICAqICAgICBpbmNsdWRlZCBpbiB1bm1vZGlmaWVkIGZvcm0uIEl0cyBtYXhpbXVtIHNpemUgaW4gZW5jb2RlZCAoc3RyaW5nKSBmb3JtIGlzXHJcbiAgICAgKiAgICAgMSwwMDAgY2hhcmFjdGVycyAoZGVmYXVsdCBudWxsKS5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy50aWNrZXRJZD1udWxsXSBBIHN0cmluZyB3aXRoIHRpY2tldCBpZGVudGlmaWVyIG9idGFpbmVkXHJcbiAgICAgKiAgICAgdmlhIHRoZSB7QGxpbmsgUmFuZG9tT3JnQ2xpZW50I2NyZWF0ZVRpY2tldHN9IG1ldGhvZC4gU3BlY2lmeWluZyBhIHZhbHVlXHJcbiAgICAgKiAgICAgZm9yIHRpY2tldElkIHdpbGwgY2F1c2UgUkFORE9NLk9SRyB0byByZWNvcmQgdGhhdCB0aGUgdGlja2V0IHdhcyB1c2VkXHJcbiAgICAgKiAgICAgdG8gZ2VuZXJhdGUgdGhlIHJlcXVlc3RlZCByYW5kb20gdmFsdWVzLiBFYWNoIHRpY2tldCBjYW4gb25seSBiZSB1c2VkXHJcbiAgICAgKiAgICAgb25jZSAoZGVmYXVsdCBudWxsKS5cclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHtkYXRhOiBudW1iZXJbXXxzdHJpbmdbXSwgcmFuZG9tOiBPYmplY3QsIHNpZ25hdHVyZTogc3RyaW5nfT59XHJcbiAgICAgKiAgICAgQSBQcm9taXNlIHdoaWNoLCBpZiByZXNvbHZlZCBzdWNjZXNzZnVsbHksIHJlcHJlc2VudHMgYW4gb2JqZWN0IHdpdGggdGhlXHJcbiAgICAgKiAgICAgZm9sbG93aW5nIHN0cnVjdHVyZTpcclxuICAgICAqICogKipkYXRhKio6IGFycmF5IG9mIHRydWUgcmFuZG9tIGludGVnZXJzXHJcbiAgICAgKiAqICoqcmFuZG9tKio6IHJhbmRvbSBmaWVsZCBhcyByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXJcclxuICAgICAqICogKipzaWduYXR1cmUqKjogc2lnbmF0dXJlIHN0cmluZ1xyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnU2VuZFRpbWVvdXRFcnJvcn0gVGhyb3duIHdoZW4gYmxvY2tpbmcgdGltZW91dCBpcyBleGNlZWRlZFxyXG4gICAgICogICAgIGJlZm9yZSB0aGUgcmVxdWVzdCBjYW4gYmUgc2VudC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0tleU5vdFJ1bm5pbmdFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkgaGFzIGJlZW5cclxuICAgICAqICAgICBzdG9wcGVkLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnSW5zdWZmaWNpZW50UmVxdWVzdHNFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkncyBzZXJ2ZXJcclxuICAgICAqICAgICByZXF1ZXN0cyBhbGxvd2FuY2UgaGFzIGJlZW4gZXhjZWVkZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdJbnN1ZmZpY2llbnRCaXRzRXJyb3J9IFRocm93biB3aGVuIHRoZSBBUEkga2V5J3Mgc2VydmVyXHJcbiAgICAgKiAgICAgYml0cyBhbGxvd2FuY2UgaGFzIGJlZW4gZXhjZWVkZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdCYWRIVFRQUmVzcG9uc2VFcnJvcn0gVGhyb3duIHdoZW4gYSBIVFRQIDIwMCBPSyByZXNwb25zZVxyXG4gICAgICogICAgIGlzIG5vdCByZWNlaXZlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ1JBTkRPTU9SR0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgc2VydmVyIHJldHVybnMgYSBSQU5ET00uT1JHXHJcbiAgICAgKiAgICAgRXJyb3IuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdKU09OUlBDRXJyb3J9IFRocm93biB3aGVuIHRoZSBzZXJ2ZXIgcmV0dXJucyBhIEpTT04tUlBDIEVycm9yLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBnZW5lcmF0ZVNpZ25lZEludGVnZXJzKG4sIG1pbiwgbWF4LCBvcHRpb25zID0ge30pIHtcclxuICAgICAgICBsZXQgcmVxdWVzdCA9IHRoaXMuI2ludGVnZXJSZXF1ZXN0KG4sIG1pbiwgbWF4LCBvcHRpb25zLCB0cnVlKTtcclxuICAgICAgICByZXR1cm4gdGhpcy4jZXh0cmFjdFNpZ25lZCh0aGlzLiNzZW5kUmVxdWVzdChyZXF1ZXN0KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXF1ZXN0cyBhbmQgcmV0dXJucyB1bmlmb3JtIG9yIG11bHRpZm9ybSBzZXF1ZW5jZXMgb2YgdHJ1ZSByYW5kb20gaW50ZWdlcnNcclxuICAgICAqIHdpdGhpbiB1c2VyLWRlZmluZWQgcmFuZ2VzIGZyb20gdGhlIHNlcnZlci5cclxuICAgICAqIFxyXG4gICAgICogUmV0dXJucyBhIFByb21pc2Ugd2hpY2gsIGlmIHJlc29sdmVkIHN1Y2Nlc3NmdWxseSwgcmVzcHJlc2VudHMgYW4gb2JqZWN0XHJcbiAgICAgKiB3aXRoIHRoZSBwYXJzZWQgYXJyYXkgb2YgaW50ZWdlciBzZXF1ZW5jZXMgbWFwcGVkIHRvICdkYXRhJywgdGhlIG9yaWdpbmFsXHJcbiAgICAgKiByZXNwb25zZSBtYXBwZWQgdG8gJ3JhbmRvbScsIGFuZCB0aGUgcmVzcG9uc2UncyBzaWduYXR1cmUgbWFwcGVkIHRvXHJcbiAgICAgKiAnc2lnbmF0dXJlJy5cclxuICAgICAqIFNlZTogaHR0cHM6Ly9hcGkucmFuZG9tLm9yZy9qc29uLXJwYy80L3NpZ25lZCNnZW5lcmF0ZUludGVnZXJTZXF1ZW5jZXNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIEhvdyBtYW55IGFycmF5cyBvZiByYW5kb20gaW50ZWdlcnMgeW91IG5lZWQuIE11c3QgYmVcclxuICAgICAqICAgICB3aXRoaW4gdGhlIFsxLDFlM10gcmFuZ2UuXHJcbiAgICAgKiBAcGFyYW0geyhudW1iZXJ8bnVtYmVyW10pfSBsZW5ndGggVGhlIGxlbmd0aCBvZiBlYWNoIGFycmF5IG9mIHJhbmRvbVxyXG4gICAgICogICAgIGludGVnZXJzIHJlcXVlc3RlZC4gRm9yIHVuaWZvcm0gc2VxdWVuY2VzLCBsZW5ndGggbXVzdCBiZSBhbiBpbnRlZ2VyXHJcbiAgICAgKiAgICAgaW4gdGhlIFsxLCAxZTRdIHJhbmdlLiBGb3IgbXVsdGlmb3JtIHNlcXVlbmNlcywgbGVuZ3RoIGNhbiBiZSBhbiBhcnJheVxyXG4gICAgICogICAgIHdpdGggbiBpbnRlZ2VycywgZWFjaCBzcGVjaWZ5aW5nIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlIGlkZW50aWZpZWRcclxuICAgICAqICAgICBieSBpdHMgaW5kZXguIEluIHRoaXMgY2FzZSwgZWFjaCB2YWx1ZSBpbiBsZW5ndGggbXVzdCBiZSB3aXRoaW4gdGhlXHJcbiAgICAgKiAgICAgWzEsIDFlNF0gcmFuZ2UgYW5kIHRoZSB0b3RhbCBzdW0gb2YgYWxsIHRoZSBsZW5ndGhzIG11c3QgYmUgaW4gdGhlXHJcbiAgICAgKiAgICAgWzEsIDFlNF0gcmFuZ2UuXHJcbiAgICAgKiBAcGFyYW0geyhudW1iZXJ8bnVtYmVyW10pfSBtaW4gVGhlIGxvd2VyIGJvdW5kYXJ5IGZvciB0aGUgcmFuZ2UgZnJvbSB3aGljaFxyXG4gICAgICogICAgIHRoZSByYW5kb20gbnVtYmVycyB3aWxsIGJlIHBpY2tlZC4gRm9yIHVuaWZvcm0gc2VxdWVuY2VzLCBtaW4gbXVzdCBiZVxyXG4gICAgICogICAgIGFuIGludGVnZXIgaW4gdGhlIFstMWU5LCAxZTldIHJhbmdlLiBGb3IgbXVsdGlmb3JtIHNlcXVlbmNlcywgbWluIGNhblxyXG4gICAgICogICAgIGJlIGFuIGFycmF5IHdpdGggbiBpbnRlZ2VycywgZWFjaCBzcGVjaWZ5aW5nIHRoZSBsb3dlciBib3VuZGFyeSBvZiB0aGVcclxuICAgICAqICAgICBzZXF1ZW5jZSBpZGVudGlmaWVkIGJ5IGl0cyBpbmRleC4gSW4gdGhpcyBjYXNlLCBlYWNoIHZhbHVlIGluIG1pbiBtdXN0XHJcbiAgICAgKiAgICAgYmUgd2l0aGluIHRoZSBbLTFlOSwgMWU5XSByYW5nZS5cclxuICAgICAqIEBwYXJhbSB7KG51bWJlcnxudW1iZXJbXSl9IG1heCBUaGUgdXBwZXIgYm91bmRhcnkgZm9yIHRoZSByYW5nZSBmcm9tIHdoaWNoXHJcbiAgICAgKiAgICAgdGhlIHJhbmRvbSBudW1iZXJzIHdpbGwgYmUgcGlja2VkLiBGb3IgdW5pZm9ybSBzZXF1ZW5jZXMsIG1heCBtdXN0IGJlXHJcbiAgICAgKiAgICAgYW4gaW50ZWdlciBpbiB0aGUgWy0xZTksIDFlOV0gcmFuZ2UuIEZvciBtdWx0aWZvcm0gc2VxdWVuY2VzLCBtYXggY2FuXHJcbiAgICAgKiAgICAgYmUgYW4gYXJyYXkgd2l0aCBuIGludGVnZXJzLCBlYWNoIHNwZWNpZnlpbmcgdGhlIHVwcGVyIGJvdW5kYXJ5IG9mIHRoZVxyXG4gICAgICogICAgIHNlcXVlbmNlIGlkZW50aWZpZWQgYnkgaXRzIGluZGV4LiBJbiB0aGlzIGNhc2UsIGVhY2ggdmFsdWUgaW4gbWF4IG11c3RcclxuICAgICAqICAgICBiZSB3aXRoaW4gdGhlIFstMWU5LCAxZTldIHJhbmdlLlxyXG4gICAgICogQHBhcmFtIHt7cmVwbGFjZW1lbnQ/OiBib29sZWFufGJvb2xlYW5bXSwgYmFzZT86IG51bWJlcnxudW1iZXJbXSxcclxuICAgICAqICAgICBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uPzogT2JqZWN0LCBsaWNlbnNlRGF0YT86IE9iamVjdCwgdXNlckRhdGE/OlxyXG4gICAgICogICAgIE9iamVjdHxudW1iZXJ8c3RyaW5nLCB0aWNrZXRJZD86IHN0cmluZ319IG9wdGlvbnMgQW4gb2JqZWN0IHdoaWNoIG1heVxyXG4gICAgICogICAgIGNvbnRhaW5zIGFueSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbmFsIHBhcmFtZXRlcnM6XHJcbiAgICAgKiBAcGFyYW0geyhib29sZWFufGJvb2xlYW5bXSl9IFtvcHRpb25zLnJlcGxhY2VtZW50PXRydWVdIFNwZWNpZmllcyB3aGV0aGVyXHJcbiAgICAgKiAgICAgdGhlIHJhbmRvbSBudW1iZXJzIHNob3VsZCBiZSBwaWNrZWQgd2l0aCByZXBsYWNlbWVudC4gSWYgdHJ1ZSwgdGhlXHJcbiAgICAgKiAgICAgcmVzdWx0aW5nIG51bWJlcnMgbWF5IGNvbnRhaW4gZHVwbGljYXRlIHZhbHVlcywgb3RoZXJ3aXNlIHRoZSBudW1iZXJzXHJcbiAgICAgKiAgICAgd2lsbCBhbGwgYmUgdW5pcXVlLiBGb3IgbXVsdGlmb3JtIHNlcXVlbmNlcywgcmVwbGFjZW1lbnQgY2FuIGJlIGFuIGFycmF5XHJcbiAgICAgKiAgICAgd2l0aCBuIGJvb2xlYW4gdmFsdWVzLCBlYWNoIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgc2VxdWVuY2UgaWRlbnRpZmllZCBieVxyXG4gICAgICogICAgIGl0cyBpbmRleCB3aWxsIGJlIGNyZWF0ZWQgd2l0aCAodHJ1ZSkgb3Igd2l0aG91dCAoZmFsc2UpIHJlcGxhY2VtZW50XHJcbiAgICAgKiAgICAgKGRlZmF1bHQgdHJ1ZSkuXHJcbiAgICAgKiBAcGFyYW0geyhudW1iZXJ8bnVtYmVyW10pfSBbb3B0aW9ucy5iYXNlPTEwXSBUaGUgYmFzZSB0aGF0IHdpbGwgYmUgdXNlZCB0b1xyXG4gICAgICogICAgIGRpc3BsYXkgdGhlIG51bWJlcnMuIFZhbHVlcyBhbGxvd2VkIGFyZSAyLCA4LCAxMCBhbmQgMTYuIEZvciBtdWx0aWZvcm1cclxuICAgICAqICAgICBzZXF1ZW5jZXMsIGJhc2UgY2FuIGJlIGFuIGFycmF5IHdpdGggbiBpbnRlZ2VyIHZhbHVlcyB0YWtlbiBmcm9tIHRoZSBzYW1lXHJcbiAgICAgKiAgICAgc2V0LCBlYWNoIHNwZWNpZnlpbmcgdGhlIGJhc2UgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZGlzcGxheSB0aGUgc2VxdWVuY2VcclxuICAgICAqICAgICBpZGVudGlmaWVkIGJ5IGl0cyBpbmRleCAoZGVmYXVsdCAxMCkuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMucHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbj1udWxsXSBBIGRpY3Rpb25hcnkgb2JqZWN0XHJcbiAgICAgKiAgICAgd2hpY2ggYWxsb3dzIHRoZSBjbGllbnQgdG8gc3BlY2lmeSB0aGF0IHRoZSByYW5kb20gdmFsdWVzIHNob3VsZCBiZVxyXG4gICAgICogICAgIGdlbmVyYXRlZCBmcm9tIGEgcHJlZ2VuZXJhdGVkLCBoaXN0b3JpY2FsIHJhbmRvbWl6YXRpb24gaW5zdGVhZCBvZiBhXHJcbiAgICAgKiAgICAgb25lLXRpbWUgb24tdGhlLWZseSByYW5kb21pemF0aW9uLiBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgY2FzZXM6XHJcbiAgICAgKiAqICoqbnVsbCoqOiBUaGUgc3RhbmRhcmQgd2F5IG9mIGNhbGxpbmcgZm9yIHJhbmRvbSB2YWx1ZXMsIGkuZS50cnVlXHJcbiAgICAgKiAgICAgICByYW5kb21uZXNzIGlzIGdlbmVyYXRlZCBhbmQgZGlzY2FyZGVkIGFmdGVyd2FyZHMuXHJcbiAgICAgKiAqICoqZGF0ZSoqOiBSQU5ET00uT1JHIHVzZXMgaGlzdG9yaWNhbCB0cnVlIHJhbmRvbW5lc3MgZ2VuZXJhdGVkIG9uIHRoZVxyXG4gICAgICogICAgICAgY29ycmVzcG9uZGluZyBkYXRlIChwYXN0IG9yIHByZXNlbnQsIGZvcm1hdDogeyAnZGF0ZScsICdZWVlZLU1NLUREJyB9KS5cclxuICAgICAqICogKippZCoqOiBSQU5ET00uT1JHIHVzZXMgaGlzdG9yaWNhbCB0cnVlIHJhbmRvbW5lc3MgZGVyaXZlZCBmcm9tIHRoZVxyXG4gICAgICogICAgICAgY29ycmVzcG9uZGluZyBpZGVudGlmaWVyIGluIGEgZGV0ZXJtaW5pc3RpYyBtYW5uZXIuIEZvcm1hdDogeyAnaWQnLFxyXG4gICAgICogICAgICAgJ1BFUlNJU1RFTlQtSURFTlRJRklFUicgfSB3aGVyZSAnUEVSU0lTVEVOVC1JREVOVElGSUVSJyBpcyBhIHN0cmluZ1xyXG4gICAgICogICAgICAgd2l0aCBsZW5ndGggaW4gdGhlIFsxLCA2NF0gcmFuZ2UuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMubGljZW5zZURhdGE9bnVsbF0gQSBkaWN0aW9uYXJ5IG9iamVjdCB3aGljaCBhbGxvd3NcclxuICAgICAqICAgICB0aGUgY2FsbGVyIHRvIGluY2x1ZGUgZGF0YSBvZiByZWxldmFuY2UgdG8gdGhlIGxpY2Vuc2UgdGhhdCBpcyBhc3NvY2lhdGVkXHJcbiAgICAgKiAgICAgd2l0aCB0aGUgQVBJIEtleS4gVGhpcyBpcyBtYW5kYXRvcnkgZm9yIEFQSSBLZXlzIHdpdGggdGhlIGxpY2Vuc2UgdHlwZVxyXG4gICAgICogICAgICdGbGV4aWJsZSBHYW1ibGluZycgYW5kIGZvbGxvd3MgdGhlIGZvcm1hdCB7ICdtYXhQYXlvdXQnOiB7ICdjdXJyZW5jeSc6XHJcbiAgICAgKiAgICAgJ1hUUycsICdhbW91bnQnOiAwLjAgfX0uIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCBpbiBsaWNlbnNpbmdcclxuICAgICAqICAgICByZXF1ZXN0ZWQgcmFuZG9tIHZhbHVlcyBhbmQgaW4gYmlsbGluZy4gVGhlIGN1cnJlbnRseSBzdXBwb3J0ZWRcclxuICAgICAqICAgICBjdXJyZW5jaWVzIGFyZTogJ1VTRCcsICdFVVInLCAnR0JQJywgJ0JUQycsICdFVEgnLiBUaGUgbW9zdCB1cC10by1kYXRlXHJcbiAgICAgKiAgICAgaW5mb3JtYXRpb24gb24gdGhlIGN1cnJlbmNpZXMgY2FuIGJlIGZvdW5kIGluIHRoZSBTaWduZWQgQVBJXHJcbiAgICAgKiAgICAgZG9jdW1lbnRhdGlvbiwgaGVyZTogaHR0cHM6Ly9hcGkucmFuZG9tLm9yZy9qc29uLXJwYy80L3NpZ25lZFxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfG51bWJlcnxPYmplY3QpfSBbb3B0aW9ucy51c2VyRGF0YT1udWxsXSBPYmplY3QgdGhhdCB3aWxsIGJlXHJcbiAgICAgKiAgICAgaW5jbHVkZWQgaW4gdW5tb2RpZmllZCBmb3JtLiBJdHMgbWF4aW11bSBzaXplIGluIGVuY29kZWQgKFN0cmluZykgZm9ybVxyXG4gICAgICogICAgIGlzIDEsMDAwIGNoYXJhY3RlcnMgKGRlZmF1bHQgbnVsbCkuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudGlja2V0SWQ9bnVsbF0gQSBzdHJpbmcgd2l0aCB0aWNrZXQgaWRlbnRpZmllclxyXG4gICAgICogICAgIG9idGFpbmVkIHZpYSB0aGUge0BsaW5rIFJhbmRvbU9yZ0NsaWVudCNjcmVhdGVUaWNrZXRzfSBtZXRob2QuIFNwZWNpZnlpbmdcclxuICAgICAqICAgICBhIHZhbHVlIGZvciB0aWNrZXRJZCB3aWxsIGNhdXNlIFJBTkRPTS5PUkcgdG8gcmVjb3JkIHRoYXQgdGhlIHRpY2tldCB3YXNcclxuICAgICAqICAgICB1c2VkIHRvIGdlbmVyYXRlIHRoZSByZXF1ZXN0ZWQgcmFuZG9tIHZhbHVlcy4gRWFjaCB0aWNrZXQgY2FuIG9ubHkgYmUgdXNlZFxyXG4gICAgICogICAgIG9uY2UgKGRlZmF1bHQgbnVsbCkuXHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7ZGF0YTogbnVtYmVyW11bXXxzdHJpbmdbXVtdLCByYW5kb206IE9iamVjdCwgc2lnbmF0dXJlOiBzdHJpbmd9Pn1cclxuICAgICAqICAgICBBIFByb21pc2Ugd2hpY2gsIGlmIHJlc29sdmVkIHN1Y2Nlc3NmdWxseSwgcmVwcmVzZW50cyBhbiBvYmplY3Qgd2l0aCB0aGVcclxuICAgICAqICAgICBmb2xsb3dpbmcgc3RydWN0dXJlOlxyXG4gICAgICogKiAqKmRhdGEqKjogYXJyYXkgb2YgdHJ1ZSByYW5kb20gaW50ZWdlciBzZXF1ZW5jZXNcclxuICAgICAqICogKipyYW5kb20qKjogcmFuZG9tIGZpZWxkIGFzIHJldHVybmVkIGZyb20gdGhlIHNlcnZlclxyXG4gICAgICogKiAqKnNpZ25hdHVyZSoqOiBzaWduYXR1cmUgc3RyaW5nXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdTZW5kVGltZW91dEVycm9yfSBUaHJvd24gd2hlbiBibG9ja2luZyB0aW1lb3V0IGlzIGV4Y2VlZGVkXHJcbiAgICAgKiAgICAgYmVmb3JlIHRoZSByZXF1ZXN0IGNhbiBiZSBzZW50LlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnS2V5Tm90UnVubmluZ0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgQVBJIGtleSBoYXMgYmVlblxyXG4gICAgICogICAgIHN0b3BwZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdJbnN1ZmZpY2llbnRSZXF1ZXN0c0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgQVBJIGtleSdzIHNlcnZlclxyXG4gICAgICogICAgIHJlcXVlc3RzIGFsbG93YW5jZSBoYXMgYmVlbiBleGNlZWRlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0luc3VmZmljaWVudEJpdHNFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkncyBzZXJ2ZXJcclxuICAgICAqICAgICBiaXRzIGFsbG93YW5jZSBoYXMgYmVlbiBleGNlZWRlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0JhZEhUVFBSZXNwb25zZUVycm9yfSBUaHJvd24gd2hlbiBhIEhUVFAgMjAwIE9LIHJlc3BvbnNlXHJcbiAgICAgKiAgICAgaXMgbm90IHJlY2VpdmVkLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnUkFORE9NT1JHRXJyb3J9IFRocm93biB3aGVuIHRoZSBzZXJ2ZXIgcmV0dXJucyBhIFJBTkRPTS5PUkdcclxuICAgICAqICAgICBFcnJvci5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0pTT05SUENFcnJvcn0gVGhyb3duIHdoZW4gdGhlIHNlcnZlciByZXR1cm5zIGEgSlNPTi1SUEMgRXJyb3IuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdlbmVyYXRlU2lnbmVkSW50ZWdlclNlcXVlbmNlcyhuLCBsZW5ndGgsIG1pbiwgbWF4LCBvcHRpb25zID0ge30pIHtcclxuICAgICAgICBsZXQgcmVxdWVzdCA9IHRoaXMuI2ludGVnZXJTZXF1ZW5jZVJlcXVlc3QobiwgbGVuZ3RoLCBtaW4sIG1heCwgb3B0aW9ucywgdHJ1ZSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuI2V4dHJhY3RTaWduZWQodGhpcy4jc2VuZFJlcXVlc3QocmVxdWVzdCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVxdWVzdCBhIGxpc3QgKHNpemUgbikgb2YgdHJ1ZSByYW5kb20gZGVjaW1hbCBmcmFjdGlvbnMsIGZyb20gYSB1bmlmb3JtXHJcbiAgICAgKiBkaXN0cmlidXRpb24gYWNyb3NzIHRoZSBbMCwxXSBpbnRlcnZhbCB3aXRoIGEgdXNlci1kZWZpbmVkIG51bWJlciBvZlxyXG4gICAgICogZGVjaW1hbCBwbGFjZXMgZnJvbSB0aGUgc2VydmVyLlxyXG4gICAgICogXHJcbiAgICAgKiBSZXR1cm5zIGEgUHJvbWlzZSB3aGljaCwgaWYgcmVzb2x2ZWQgc3VjY2Vzc2Z1bGx5LCByZXNwcmVzZW50cyBhbiBvYmplY3RcclxuICAgICAqIHdpdGggdGhlIHBhcnNlZCBkZWNpbWFsIGZyYWN0aW9ucyBtYXBwZWQgdG8gJ2RhdGEnLCB0aGUgb3JpZ2luYWwgcmVzcG9uc2VcclxuICAgICAqIG1hcHBlZCB0byAncmFuZG9tJywgYW5kIHRoZSByZXNwb25zZSdzIHNpZ25hdHVyZSBtYXBwZWQgdG8gJ3NpZ25hdHVyZScuIFNlZTpcclxuICAgICAqIGh0dHBzOi8vYXBpLnJhbmRvbS5vcmcvanNvbi1ycGMvNC9zaWduZWQjZ2VuZXJhdGVTaWduZWREZWNpbWFsRnJhY3Rpb25zXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBIb3cgbWFueSByYW5kb20gZGVjaW1hbCBmcmFjdGlvbnMgeW91IG5lZWQuIE11c3QgYmVcclxuICAgICAqICAgICB3aXRoaW4gdGhlIFsxLDFlNF0gcmFuZ2UuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVjaW1hbFBsYWNlcyBUaGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRvIHVzZS4gTXVzdFxyXG4gICAgICogICAgIGJlIHdpdGhpbiB0aGUgWzEsMjBdIHJhbmdlLlxyXG4gICAgICogQHBhcmFtIHt7cmVwbGFjZW1lbnQ/OiBib29sZWFuLCBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uPzogT2JqZWN0LCBsaWNlbnNlRGF0YT86XHJcbiAgICAgKiAgICAgT2JqZWN0LCB1c2VyRGF0YT86IE9iamVjdHxudW1iZXJ8c3RyaW5nLCB0aWNrZXRJZD86IHN0cmluZ319IG9wdGlvbnMgQW5cclxuICAgICAqICAgICBvYmplY3Qgd2hpY2ggbWF5IGNvbnRhaW5zIGFueSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbmFsIHBhcmFtZXRlcnM6XHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnJlcGxhY2VtZW50PXRydWVdIFNwZWNpZmllcyB3aGV0aGVyIHRoZSByYW5kb21cclxuICAgICAqICAgICBudW1iZXJzIHNob3VsZCBiZSBwaWNrZWQgd2l0aCByZXBsYWNlbWVudC4gSWYgdHJ1ZSwgdGhlIHJlc3VsdGluZyBudW1iZXJzXHJcbiAgICAgKiAgICAgbWF5IGNvbnRhaW4gZHVwbGljYXRlIHZhbHVlcywgb3RoZXJ3aXNlIHRoZSBudW1iZXJzIHdpbGwgYWxsIGJlIHVuaXF1ZVxyXG4gICAgICogICAgIChkZWZhdWx0IHRydWUpLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb249bnVsbF0gQSBkaWN0aW9uYXJ5IG9iamVjdFxyXG4gICAgICogICAgIHdoaWNoIGFsbG93cyB0aGUgY2xpZW50IHRvIHNwZWNpZnkgdGhhdCB0aGUgcmFuZG9tIHZhbHVlcyBzaG91bGQgYmVcclxuICAgICAqICAgICBnZW5lcmF0ZWQgZnJvbSBhIHByZWdlbmVyYXRlZCwgaGlzdG9yaWNhbCByYW5kb21pemF0aW9uIGluc3RlYWQgb2YgYVxyXG4gICAgICogICAgIG9uZS10aW1lIG9uLXRoZS1mbHkgcmFuZG9taXphdGlvbi4gVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIGNhc2VzOlxyXG4gICAgICogKiAqKm51bGwqKjogVGhlIHN0YW5kYXJkIHdheSBvZiBjYWxsaW5nIGZvciByYW5kb20gdmFsdWVzLCBpLmUudHJ1ZVxyXG4gICAgICogICAgICAgcmFuZG9tbmVzcyBpcyBnZW5lcmF0ZWQgYW5kIGRpc2NhcmRlZCBhZnRlcndhcmRzLlxyXG4gICAgICogKiAqKmRhdGUqKjogUkFORE9NLk9SRyB1c2VzIGhpc3RvcmljYWwgdHJ1ZSByYW5kb21uZXNzIGdlbmVyYXRlZCBvbiB0aGVcclxuICAgICAqICAgICAgIGNvcnJlc3BvbmRpbmcgZGF0ZSAocGFzdCBvciBwcmVzZW50LCBmb3JtYXQ6IHsgJ2RhdGUnLCAnWVlZWS1NTS1ERCcgfSkuXHJcbiAgICAgKiAqICoqaWQqKjogUkFORE9NLk9SRyB1c2VzIGhpc3RvcmljYWwgdHJ1ZSByYW5kb21uZXNzIGRlcml2ZWQgZnJvbSB0aGVcclxuICAgICAqICAgICAgIGNvcnJlc3BvbmRpbmcgaWRlbnRpZmllciBpbiBhIGRldGVybWluaXN0aWMgbWFubmVyLiBGb3JtYXQ6IHsgJ2lkJyxcclxuICAgICAqICAgICAgICdQRVJTSVNURU5ULUlERU5USUZJRVInIH0gd2hlcmUgJ1BFUlNJU1RFTlQtSURFTlRJRklFUicgaXMgYSBzdHJpbmdcclxuICAgICAqICAgICAgIHdpdGggbGVuZ3RoIGluIHRoZSBbMSwgNjRdIHJhbmdlLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmxpY2Vuc2VEYXRhPW51bGxdIEEgZGljdGlvbmFyeSBvYmplY3Qgd2hpY2ggYWxsb3dzXHJcbiAgICAgKiAgICAgdGhlIGNhbGxlciB0byBpbmNsdWRlIGRhdGEgb2YgcmVsZXZhbmNlIHRvIHRoZSBsaWNlbnNlIHRoYXQgaXMgYXNzb2NpYXRlZFxyXG4gICAgICogICAgIHdpdGggdGhlIEFQSSBLZXkuIFRoaXMgaXMgbWFuZGF0b3J5IGZvciBBUEkgS2V5cyB3aXRoIHRoZSBsaWNlbnNlIHR5cGVcclxuICAgICAqICAgICAnRmxleGlibGUgR2FtYmxpbmcnIGFuZCBmb2xsb3dzIHRoZSBmb3JtYXQgeyAnbWF4UGF5b3V0JzogeyAnY3VycmVuY3knOlxyXG4gICAgICogICAgICdYVFMnLCAnYW1vdW50JzogMC4wIH19LiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgaW4gbGljZW5zaW5nXHJcbiAgICAgKiAgICAgcmVxdWVzdGVkIHJhbmRvbSB2YWx1ZXMgYW5kIGluIGJpbGxpbmcuIFRoZSBjdXJyZW50bHkgc3VwcG9ydGVkXHJcbiAgICAgKiAgICAgY3VycmVuY2llcyBhcmU6ICdVU0QnLCAnRVVSJywgJ0dCUCcsICdCVEMnLCAnRVRIJy4gVGhlIG1vc3QgdXAtdG8tZGF0ZVxyXG4gICAgICogICAgIGluZm9ybWF0aW9uIG9uIHRoZSBjdXJyZW5jaWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgU2lnbmVkIEFQSVxyXG4gICAgICogICAgIGRvY3VtZW50YXRpb24sIGhlcmU6IGh0dHBzOi8vYXBpLnJhbmRvbS5vcmcvanNvbi1ycGMvNC9zaWduZWRcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXJ8T2JqZWN0KX0gW29wdGlvbnMudXNlckRhdGE9bnVsbF0gT2JqZWN0IHRoYXQgd2lsbCBiZVxyXG4gICAgICogICAgIGluY2x1ZGVkIGluIHVubW9kaWZpZWQgZm9ybS4gSXRzIG1heGltdW0gc2l6ZSBpbiBlbmNvZGVkIChTdHJpbmcpIGZvcm1cclxuICAgICAqICAgICBpcyAxLDAwMCBjaGFyYWN0ZXJzIChkZWZhdWx0IG51bGwpLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnRpY2tldElkPW51bGxdIEEgc3RyaW5nIHdpdGggdGlja2V0IGlkZW50aWZpZXJcclxuICAgICAqICAgICBvYnRhaW5lZCB2aWEgdGhlIHtAbGluayBSYW5kb21PcmdDbGllbnQjY3JlYXRlVGlja2V0c30gbWV0aG9kLiBTcGVjaWZ5aW5nXHJcbiAgICAgKiAgICAgYSB2YWx1ZSBmb3IgdGlja2V0SWQgd2lsbCBjYXVzZSBSQU5ET00uT1JHIHRvIHJlY29yZCB0aGF0IHRoZSB0aWNrZXQgd2FzXHJcbiAgICAgKiAgICAgdXNlZCB0byBnZW5lcmF0ZSB0aGUgcmVxdWVzdGVkIHJhbmRvbSB2YWx1ZXMuIEVhY2ggdGlja2V0IGNhbiBvbmx5IGJlIHVzZWRcclxuICAgICAqICAgICBvbmNlIChkZWZhdWx0IG51bGwpLlxyXG4gICAgICogQHJldHVybnMge1Byb21pc2U8e2RhdGE6IG51bWJlcltdLCByYW5kb206IE9iamVjdCwgc2lnbmF0dXJlOiBzdHJpbmd9Pn0gQVxyXG4gICAgICogICAgIFByb21pc2Ugd2hpY2gsIGlmIHJlc29sdmVkIHN1Y2Nlc3NmdWxseSwgcmVwcmVzZW50cyBhbiBvYmplY3Qgd2l0aCB0aGVcclxuICAgICAqICAgICBmb2xsb3dpbmcgc3RydWN0dXJlOlxyXG4gICAgICogKiAqKmRhdGEqKjogYXJyYXkgb2YgdHJ1ZSByYW5kb20gZGVjaW1hbCBmcmFjdGlvbnNcclxuICAgICAqICogKipyYW5kb20qKjogcmFuZG9tIGZpZWxkIGFzIHJldHVybmVkIGZyb20gdGhlIHNlcnZlclxyXG4gICAgICogKiAqKnNpZ25hdHVyZSoqOiBzaWduYXR1cmUgc3RyaW5nXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdTZW5kVGltZW91dEVycm9yfSBUaHJvd24gd2hlbiBibG9ja2luZyB0aW1lb3V0IGlzIGV4Y2VlZGVkXHJcbiAgICAgKiAgICAgYmVmb3JlIHRoZSByZXF1ZXN0IGNhbiBiZSBzZW50LlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnS2V5Tm90UnVubmluZ0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgQVBJIGtleSBoYXMgYmVlblxyXG4gICAgICogICAgIHN0b3BwZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdJbnN1ZmZpY2llbnRSZXF1ZXN0c0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgQVBJIGtleSdzIHNlcnZlclxyXG4gICAgICogICAgIHJlcXVlc3RzIGFsbG93YW5jZSBoYXMgYmVlbiBleGNlZWRlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0luc3VmZmljaWVudEJpdHNFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkncyBzZXJ2ZXJcclxuICAgICAqICAgICBiaXRzIGFsbG93YW5jZSBoYXMgYmVlbiBleGNlZWRlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0JhZEhUVFBSZXNwb25zZUVycm9yfSBUaHJvd24gd2hlbiBhIEhUVFAgMjAwIE9LIHJlc3BvbnNlXHJcbiAgICAgKiAgICAgaXMgbm90IHJlY2VpdmVkLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnUkFORE9NT1JHRXJyb3J9IFRocm93biB3aGVuIHRoZSBzZXJ2ZXIgcmV0dXJucyBhIFJBTkRPTS5PUkdcclxuICAgICAqICAgICBFcnJvci5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0pTT05SUENFcnJvcn0gVGhyb3duIHdoZW4gdGhlIHNlcnZlciByZXR1cm5zIGEgSlNPTi1SUEMgRXJyb3IuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdlbmVyYXRlU2lnbmVkRGVjaW1hbEZyYWN0aW9ucyhuLCBkZWNpbWFsUGxhY2VzLCBvcHRpb25zID0ge30pIHtcclxuICAgICAgICBsZXQgcmVxdWVzdCA9IHRoaXMuI2RlY2ltYWxGcmFjdGlvblJlcXVlc3QobiwgZGVjaW1hbFBsYWNlcywgb3B0aW9ucywgdHJ1ZSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuI2V4dHJhY3RTaWduZWQodGhpcy4jc2VuZFJlcXVlc3QocmVxdWVzdCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVxdWVzdCBhIGxpc3QgKHNpemUgbikgb2YgdHJ1ZSByYW5kb20gbnVtYmVycyBmcm9tIGEgR2F1c3NpYW4gZGlzdHJpYnV0aW9uXHJcbiAgICAgKiAoYWxzbyBrbm93biBhcyBhIG5vcm1hbCBkaXN0cmlidXRpb24pLlxyXG4gICAgICogXHJcbiAgICAgKiBSZXR1cm5zIGEgUHJvbWlzZSB3aGljaCwgaWYgcmVzb2x2ZWQgc3VjY2Vzc2Z1bGx5LCByZXNwcmVzZW50cyBhbiBvYmplY3RcclxuICAgICAqIHdpdGggdGhlIHBhcnNlZCBudW1iZXJzIG1hcHBlZCB0byAnZGF0YScsIHRoZSBvcmlnaW5hbCByZXNwb25zZSBtYXBwZWQgdG9cclxuICAgICAqICdyYW5kb20nLCBhbmQgdGhlIHJlc3BvbnNlJ3Mgc2lnbmF0dXJlIG1hcHBlZCB0byAnc2lnbmF0dXJlJy4gU2VlOlxyXG4gICAgICogaHR0cHM6Ly9hcGkucmFuZG9tLm9yZy9qc29uLXJwYy80L3NpZ25lZCNnZW5lcmF0ZVNpZ25lZEdhdXNzaWFuc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gSG93IG1hbnkgcmFuZG9tIG51bWJlcnMgeW91IG5lZWQuIE11c3QgYmUgd2l0aGluIHRoZVxyXG4gICAgICogICAgIFsxLDFlNF0gcmFuZ2UuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWVhbiBUaGUgZGlzdHJpYnV0aW9uJ3MgbWVhbi4gTXVzdCBiZSB3aXRoaW4gdGhlIFstMWU2LDFlNl1cclxuICAgICAqICAgICByYW5nZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFuZGFyZERldmlhdGlvbiBUaGUgZGlzdHJpYnV0aW9uJ3Mgc3RhbmRhcmQgZGV2aWF0aW9uLlxyXG4gICAgICogICAgIE11c3QgYmUgd2l0aGluIHRoZSBbLTFlNiwxZTZdIHJhbmdlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpZ25pZmljYW50RGlnaXRzIFRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgZGlnaXRzIHRvIHVzZS5cclxuICAgICAqICAgICBNdXN0IGJlIHdpdGhpbiB0aGUgWzIsMjBdIHJhbmdlLlxyXG4gICAgICogQHBhcmFtIHt7cHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbj86IE9iamVjdCwgbGljZW5zZURhdGE/OiBPYmplY3QsIHVzZXJEYXRhPzpcclxuICAgICAqICAgICBPYmplY3R8bnVtYmVyfHN0cmluZywgdGlja2V0SWQ/OiBzdHJpbmd9fSBvcHRpb25zIEFuIG9iamVjdCB3aGljaCBtYXlcclxuICAgICAqICAgICBjb250YWlucyBhbnkgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25hbCBwYXJhbWV0ZXJzOlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb249bnVsbF0gQSBkaWN0aW9uYXJ5IG9iamVjdFxyXG4gICAgICogICAgIHdoaWNoIGFsbG93cyB0aGUgY2xpZW50IHRvIHNwZWNpZnkgdGhhdCB0aGUgcmFuZG9tIHZhbHVlcyBzaG91bGQgYmVcclxuICAgICAqICAgICBnZW5lcmF0ZWQgZnJvbSBhIHByZWdlbmVyYXRlZCwgaGlzdG9yaWNhbCByYW5kb21pemF0aW9uIGluc3RlYWQgb2YgYVxyXG4gICAgICogICAgIG9uZS10aW1lIG9uLXRoZS1mbHkgcmFuZG9taXphdGlvbi4gVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIGNhc2VzOlxyXG4gICAgICogKiAqKm51bGwqKjogVGhlIHN0YW5kYXJkIHdheSBvZiBjYWxsaW5nIGZvciByYW5kb20gdmFsdWVzLCBpLmUudHJ1ZVxyXG4gICAgICogICAgICAgcmFuZG9tbmVzcyBpcyBnZW5lcmF0ZWQgYW5kIGRpc2NhcmRlZCBhZnRlcndhcmRzLlxyXG4gICAgICogKiAqKmRhdGUqKjogUkFORE9NLk9SRyB1c2VzIGhpc3RvcmljYWwgdHJ1ZSByYW5kb21uZXNzIGdlbmVyYXRlZCBvbiB0aGVcclxuICAgICAqICAgICAgIGNvcnJlc3BvbmRpbmcgZGF0ZSAocGFzdCBvciBwcmVzZW50LCBmb3JtYXQ6IHsgJ2RhdGUnLCAnWVlZWS1NTS1ERCcgfSkuXHJcbiAgICAgKiAqICoqaWQqKjogUkFORE9NLk9SRyB1c2VzIGhpc3RvcmljYWwgdHJ1ZSByYW5kb21uZXNzIGRlcml2ZWQgZnJvbSB0aGVcclxuICAgICAqICAgICAgIGNvcnJlc3BvbmRpbmcgaWRlbnRpZmllciBpbiBhIGRldGVybWluaXN0aWMgbWFubmVyLiBGb3JtYXQ6IHsgJ2lkJyxcclxuICAgICAqICAgICAgICdQRVJTSVNURU5ULUlERU5USUZJRVInIH0gd2hlcmUgJ1BFUlNJU1RFTlQtSURFTlRJRklFUicgaXMgYSBzdHJpbmdcclxuICAgICAqICAgICAgIHdpdGggbGVuZ3RoIGluIHRoZSBbMSwgNjRdIHJhbmdlLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmxpY2Vuc2VEYXRhPW51bGxdIEEgZGljdGlvbmFyeSBvYmplY3Qgd2hpY2ggYWxsb3dzXHJcbiAgICAgKiAgICAgdGhlIGNhbGxlciB0byBpbmNsdWRlIGRhdGEgb2YgcmVsZXZhbmNlIHRvIHRoZSBsaWNlbnNlIHRoYXQgaXMgYXNzb2NpYXRlZFxyXG4gICAgICogICAgIHdpdGggdGhlIEFQSSBLZXkuIFRoaXMgaXMgbWFuZGF0b3J5IGZvciBBUEkgS2V5cyB3aXRoIHRoZSBsaWNlbnNlIHR5cGVcclxuICAgICAqICAgICAnRmxleGlibGUgR2FtYmxpbmcnIGFuZCBmb2xsb3dzIHRoZSBmb3JtYXQgeyAnbWF4UGF5b3V0JzogeyAnY3VycmVuY3knOlxyXG4gICAgICogICAgICdYVFMnLCAnYW1vdW50JzogMC4wIH19LiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgaW4gbGljZW5zaW5nXHJcbiAgICAgKiAgICAgcmVxdWVzdGVkIHJhbmRvbSB2YWx1ZXMgYW5kIGluIGJpbGxpbmcuIFRoZSBjdXJyZW50bHkgc3VwcG9ydGVkXHJcbiAgICAgKiAgICAgY3VycmVuY2llcyBhcmU6ICdVU0QnLCAnRVVSJywgJ0dCUCcsICdCVEMnLCAnRVRIJy4gVGhlIG1vc3QgdXAtdG8tZGF0ZVxyXG4gICAgICogICAgIGluZm9ybWF0aW9uIG9uIHRoZSBjdXJyZW5jaWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgU2lnbmVkIEFQSVxyXG4gICAgICogICAgIGRvY3VtZW50YXRpb24sIGhlcmU6IGh0dHBzOi8vYXBpLnJhbmRvbS5vcmcvanNvbi1ycGMvNC9zaWduZWRcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXJ8T2JqZWN0KX0gW29wdGlvbnMudXNlckRhdGE9bnVsbF0gT2JqZWN0IHRoYXQgd2lsbCBiZVxyXG4gICAgICogICAgIGluY2x1ZGVkIGluIHVubW9kaWZpZWQgZm9ybS4gSXRzIG1heGltdW0gc2l6ZSBpbiBlbmNvZGVkIChTdHJpbmcpIGZvcm1cclxuICAgICAqICAgICBpcyAxLDAwMCBjaGFyYWN0ZXJzIChkZWZhdWx0IG51bGwpLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnRpY2tldElkPW51bGxdIEEgc3RyaW5nIHdpdGggdGlja2V0IGlkZW50aWZpZXJcclxuICAgICAqICAgICBvYnRhaW5lZCB2aWEgdGhlIHtAbGluayBSYW5kb21PcmdDbGllbnQjY3JlYXRlVGlja2V0c30gbWV0aG9kLiBTcGVjaWZ5aW5nXHJcbiAgICAgKiAgICAgYSB2YWx1ZSBmb3IgdGlja2V0SWQgd2lsbCBjYXVzZSBSQU5ET00uT1JHIHRvIHJlY29yZCB0aGF0IHRoZSB0aWNrZXQgd2FzXHJcbiAgICAgKiAgICAgdXNlZCB0byBnZW5lcmF0ZSB0aGUgcmVxdWVzdGVkIHJhbmRvbSB2YWx1ZXMuIEVhY2ggdGlja2V0IGNhbiBvbmx5IGJlIHVzZWRcclxuICAgICAqICAgICBvbmNlIChkZWZhdWx0IG51bGwpLlxyXG4gICAgICogQHJldHVybnMge1Byb21pc2U8e2RhdGE6IG51bWJlcltdLCByYW5kb206IE9iamVjdCwgc2lnbmF0dXJlOiBzdHJpbmd9Pn0gQVxyXG4gICAgICogICAgIFByb21pc2Ugd2hpY2gsIGlmIHJlc29sdmVkIHN1Y2Nlc3NmdWxseSwgcmVwcmVzZW50cyBhbiBvYmplY3Qgd2l0aCB0aGVcclxuICAgICAqICAgICBmb2xsb3dpbmcgc3RydWN0dXJlOlxyXG4gICAgICogKiAqKmRhdGEqKjogYXJyYXkgb2YgdHJ1ZSByYW5kb20gbnVtYmVycyBmcm9tIGEgR2F1c3NpYW4gZGlzdHJpYnV0aW9uXHJcbiAgICAgKiAqICoqcmFuZG9tKio6IHJhbmRvbSBmaWVsZCBhcyByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXJcclxuICAgICAqICogKipzaWduYXR1cmUqKjogc2lnbmF0dXJlIHN0cmluZ1xyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnU2VuZFRpbWVvdXRFcnJvcn0gVGhyb3duIHdoZW4gYmxvY2tpbmcgdGltZW91dCBpcyBleGNlZWRlZFxyXG4gICAgICogICAgIGJlZm9yZSB0aGUgcmVxdWVzdCBjYW4gYmUgc2VudC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0tleU5vdFJ1bm5pbmdFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkgaGFzIGJlZW5cclxuICAgICAqICAgICBzdG9wcGVkLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnSW5zdWZmaWNpZW50UmVxdWVzdHNFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkncyBzZXJ2ZXJcclxuICAgICAqICAgICByZXF1ZXN0cyBhbGxvd2FuY2UgaGFzIGJlZW4gZXhjZWVkZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdJbnN1ZmZpY2llbnRCaXRzRXJyb3J9IFRocm93biB3aGVuIHRoZSBBUEkga2V5J3Mgc2VydmVyXHJcbiAgICAgKiAgICAgYml0cyBhbGxvd2FuY2UgaGFzIGJlZW4gZXhjZWVkZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdCYWRIVFRQUmVzcG9uc2VFcnJvcn0gVGhyb3duIHdoZW4gYSBIVFRQIDIwMCBPSyByZXNwb25zZVxyXG4gICAgICogICAgIGlzIG5vdCByZWNlaXZlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ1JBTkRPTU9SR0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgc2VydmVyIHJldHVybnMgYSBSQU5ET00uT1JHXHJcbiAgICAgKiAgICAgRXJyb3IuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdKU09OUlBDRXJyb3J9IFRocm93biB3aGVuIHRoZSBzZXJ2ZXIgcmV0dXJucyBhIEpTT04tUlBDIEVycm9yLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBnZW5lcmF0ZVNpZ25lZEdhdXNzaWFucyhuLCBtZWFuLCBzdGFuZGFyZERldmlhdGlvbiwgc2lnbmlmaWNhbnREaWdpdHMsIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgICAgIGxldCByZXF1ZXN0ID0gdGhpcy4jZ2F1c3NpYW5SZXF1ZXN0KG4sIG1lYW4sIHN0YW5kYXJkRGV2aWF0aW9uLCBzaWduaWZpY2FudERpZ2l0cyxcclxuICAgICAgICAgICAgb3B0aW9ucywgdHJ1ZSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuI2V4dHJhY3RTaWduZWQodGhpcy4jc2VuZFJlcXVlc3QocmVxdWVzdCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVxdWVzdCBhIGxpc3QgKHNpemUgbikgb2YgdHJ1ZSByYW5kb20gc3RyaW5ncyBmcm9tIHRoZSBzZXJ2ZXIuXHJcbiAgICAgKiBcclxuICAgICAqIFJldHVybnMgYSBQcm9taXNlIHdoaWNoLCBpZiByZXNvbHZlZCBzdWNjZXNzZnVsbHksIHJlc3ByZXNlbnRzIGFuIG9iamVjdFxyXG4gICAgICogd2l0aCB0aGUgcGFyc2VkIHN0cmluZ3MgbWFwcGVkIHRvICdkYXRhJywgdGhlIG9yaWdpbmFsIHJlc3BvbnNlIG1hcHBlZCB0b1xyXG4gICAgICogJ3JhbmRvbScsIGFuZCB0aGUgcmVzcG9uc2UncyBzaWduYXR1cmUgbWFwcGVkIHRvICdzaWduYXR1cmUnLiBTZWU6XHJcbiAgICAgKiBodHRwczovL2FwaS5yYW5kb20ub3JnL2pzb24tcnBjLzQvc2lnbmVkI2dlbmVyYXRlU2lnbmVkU3RyaW5nc1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gSG93IG1hbnkgcmFuZG9tIHN0cmluZ3MgeW91IG5lZWQuIE11c3QgYmUgd2l0aGluIHRoZVxyXG4gICAgICogICAgIFsxLDFlNF0gcmFuZ2UuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgZWFjaCBzdHJpbmcuIE11c3QgYmUgd2l0aGluIHRoZSBbMSwyMF1cclxuICAgICAqICAgICByYW5nZS4gQWxsIHN0cmluZ3Mgd2lsbCBiZSBvZiB0aGUgc2FtZSBsZW5ndGguXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhcmFjdGVycyBBIHN0cmluZyB0aGF0IGNvbnRhaW5zIHRoZSBzZXQgb2YgY2hhcmFjdGVyc1xyXG4gICAgICogICAgIHRoYXQgYXJlIGFsbG93ZWQgdG8gb2NjdXIgaW4gdGhlIHJhbmRvbSBzdHJpbmdzLiBUaGUgbWF4aW11bSBudW1iZXJcclxuICAgICAqICAgICBvZiBjaGFyYWN0ZXJzIGlzIDgwLlxyXG4gICAgICogQHBhcmFtIHt7cmVwbGFjZW1lbnQ/OiBib29sZWFuLCBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uPzogT2JqZWN0LCBsaWNlbnNlRGF0YT86XHJcbiAgICAgKiAgICAgT2JqZWN0LCB1c2VyRGF0YT86IE9iamVjdHxudW1iZXJ8c3RyaW5nLCB0aWNrZXRJZD86IHN0cmluZ319IG9wdGlvbnMgQW5cclxuICAgICAqICAgICBvYmplY3Qgd2hpY2ggbWF5IGNvbnRhaW5zIGFueSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbmFsIHBhcmFtZXRlcnM6XHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnJlcGxhY2VtZW50PW51bGxdIFNwZWNpZmllcyB3aGV0aGVyIHRoZSByYW5kb21cclxuICAgICAqICAgICBzdHJpbmdzIHNob3VsZCBiZSBwaWNrZWQgd2l0aCByZXBsYWNlbWVudC4gSWYgdHJ1ZSwgdGhlIHJlc3VsdGluZyBsaXN0XHJcbiAgICAgKiAgICAgb2Ygc3RyaW5ncyBtYXkgY29udGFpbiBkdXBsaWNhdGVzLCBvdGhlcndpc2UgdGhlIHN0cmluZ3Mgd2lsbCBhbGwgYmVcclxuICAgICAqICAgICB1bmlxdWUgKGRlZmF1bHQgdHJ1ZSkuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMucHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbj1udWxsXSBBIGRpY3Rpb25hcnkgb2JqZWN0XHJcbiAgICAgKiAgICAgd2hpY2ggYWxsb3dzIHRoZSBjbGllbnQgdG8gc3BlY2lmeSB0aGF0IHRoZSByYW5kb20gdmFsdWVzIHNob3VsZCBiZVxyXG4gICAgICogICAgIGdlbmVyYXRlZCBmcm9tIGEgcHJlZ2VuZXJhdGVkLCBoaXN0b3JpY2FsIHJhbmRvbWl6YXRpb24gaW5zdGVhZCBvZiBhXHJcbiAgICAgKiAgICAgb25lLXRpbWUgb24tdGhlLWZseSByYW5kb21pemF0aW9uLiBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgY2FzZXM6XHJcbiAgICAgKiAqICoqbnVsbCoqOiBUaGUgc3RhbmRhcmQgd2F5IG9mIGNhbGxpbmcgZm9yIHJhbmRvbSB2YWx1ZXMsIGkuZS50cnVlXHJcbiAgICAgKiAgICAgICByYW5kb21uZXNzIGlzIGdlbmVyYXRlZCBhbmQgZGlzY2FyZGVkIGFmdGVyd2FyZHMuXHJcbiAgICAgKiAqICoqZGF0ZSoqOiBSQU5ET00uT1JHIHVzZXMgaGlzdG9yaWNhbCB0cnVlIHJhbmRvbW5lc3MgZ2VuZXJhdGVkIG9uIHRoZVxyXG4gICAgICogICAgICAgY29ycmVzcG9uZGluZyBkYXRlIChwYXN0IG9yIHByZXNlbnQsIGZvcm1hdDogeyAnZGF0ZScsICdZWVlZLU1NLUREJyB9KS5cclxuICAgICAqICogKippZCoqOiBSQU5ET00uT1JHIHVzZXMgaGlzdG9yaWNhbCB0cnVlIHJhbmRvbW5lc3MgZGVyaXZlZCBmcm9tIHRoZVxyXG4gICAgICogICAgICAgY29ycmVzcG9uZGluZyBpZGVudGlmaWVyIGluIGEgZGV0ZXJtaW5pc3RpYyBtYW5uZXIuIEZvcm1hdDogeyAnaWQnLFxyXG4gICAgICogICAgICAgJ1BFUlNJU1RFTlQtSURFTlRJRklFUicgfSB3aGVyZSAnUEVSU0lTVEVOVC1JREVOVElGSUVSJyBpcyBhIHN0cmluZ1xyXG4gICAgICogICAgICAgd2l0aCBsZW5ndGggaW4gdGhlIFsxLCA2NF0gcmFuZ2UuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMubGljZW5zZURhdGE9bnVsbF0gQSBkaWN0aW9uYXJ5IG9iamVjdCB3aGljaCBhbGxvd3NcclxuICAgICAqICAgICB0aGUgY2FsbGVyIHRvIGluY2x1ZGUgZGF0YSBvZiByZWxldmFuY2UgdG8gdGhlIGxpY2Vuc2UgdGhhdCBpcyBhc3NvY2lhdGVkXHJcbiAgICAgKiAgICAgd2l0aCB0aGUgQVBJIEtleS4gVGhpcyBpcyBtYW5kYXRvcnkgZm9yIEFQSSBLZXlzIHdpdGggdGhlIGxpY2Vuc2UgdHlwZVxyXG4gICAgICogICAgICdGbGV4aWJsZSBHYW1ibGluZycgYW5kIGZvbGxvd3MgdGhlIGZvcm1hdCB7ICdtYXhQYXlvdXQnOiB7ICdjdXJyZW5jeSc6XHJcbiAgICAgKiAgICAgJ1hUUycsICdhbW91bnQnOiAwLjAgfX0uIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCBpbiBsaWNlbnNpbmdcclxuICAgICAqICAgICByZXF1ZXN0ZWQgcmFuZG9tIHZhbHVlcyBhbmQgaW4gYmlsbGluZy4gVGhlIGN1cnJlbnRseSBzdXBwb3J0ZWRcclxuICAgICAqICAgICBjdXJyZW5jaWVzIGFyZTogJ1VTRCcsICdFVVInLCAnR0JQJywgJ0JUQycsICdFVEgnLiBUaGUgbW9zdCB1cC10by1kYXRlXHJcbiAgICAgKiAgICAgaW5mb3JtYXRpb24gb24gdGhlIGN1cnJlbmNpZXMgY2FuIGJlIGZvdW5kIGluIHRoZSBTaWduZWQgQVBJXHJcbiAgICAgKiAgICAgZG9jdW1lbnRhdGlvbiwgaGVyZTogaHR0cHM6Ly9hcGkucmFuZG9tLm9yZy9qc29uLXJwYy80L3NpZ25lZFxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfG51bWJlcnxPYmplY3QpfSBbb3B0aW9ucy51c2VyRGF0YT1udWxsXSBPYmplY3QgdGhhdCB3aWxsIGJlXHJcbiAgICAgKiAgICAgaW5jbHVkZWQgaW4gdW5tb2RpZmllZCBmb3JtLiBJdHMgbWF4aW11bSBzaXplIGluIGVuY29kZWQgKFN0cmluZykgZm9ybVxyXG4gICAgICogICAgIGlzIDEsMDAwIGNoYXJhY3RlcnMgKGRlZmF1bHQgbnVsbCkuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudGlja2V0SWQ9bnVsbF0gQSBzdHJpbmcgd2l0aCB0aWNrZXQgaWRlbnRpZmllclxyXG4gICAgICogICAgIG9idGFpbmVkIHZpYSB0aGUge0BsaW5rIFJhbmRvbU9yZ0NsaWVudCNjcmVhdGVUaWNrZXRzfSBtZXRob2QuIFNwZWNpZnlpbmdcclxuICAgICAqICAgICBhIHZhbHVlIGZvciB0aWNrZXRJZCB3aWxsIGNhdXNlIFJBTkRPTS5PUkcgdG8gcmVjb3JkIHRoYXQgdGhlIHRpY2tldCB3YXNcclxuICAgICAqICAgICB1c2VkIHRvIGdlbmVyYXRlIHRoZSByZXF1ZXN0ZWQgcmFuZG9tIHZhbHVlcy4gRWFjaCB0aWNrZXQgY2FuIG9ubHkgYmUgdXNlZFxyXG4gICAgICogICAgIG9uY2UgKGRlZmF1bHQgbnVsbCkuXHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7ZGF0YTogc3RyaW5nW10sIHJhbmRvbTogT2JqZWN0LCBzaWduYXR1cmU6IHN0cmluZ30+fSBBXHJcbiAgICAgKiAgICAgUHJvbWlzZSB3aGljaCwgaWYgcmVzb2x2ZWQgc3VjY2Vzc2Z1bGx5LCByZXByZXNlbnRzIGFuIG9iamVjdCB3aXRoIHRoZVxyXG4gICAgICogICAgIGZvbGxvd2luZyBzdHJ1Y3R1cmU6XHJcbiAgICAgKiAqICoqZGF0YSoqOiBhcnJheSBvZiB0cnVlIHJhbmRvbSBzdHJpbmdzXHJcbiAgICAgKiAqICoqcmFuZG9tKio6IHJhbmRvbSBmaWVsZCBhcyByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXJcclxuICAgICAqICogKipzaWduYXR1cmUqKjogc2lnbmF0dXJlIHN0cmluZ1xyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnU2VuZFRpbWVvdXRFcnJvcn0gVGhyb3duIHdoZW4gYmxvY2tpbmcgdGltZW91dCBpcyBleGNlZWRlZFxyXG4gICAgICogICAgIGJlZm9yZSB0aGUgcmVxdWVzdCBjYW4gYmUgc2VudC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0tleU5vdFJ1bm5pbmdFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkgaGFzIGJlZW5cclxuICAgICAqICAgICBzdG9wcGVkLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnSW5zdWZmaWNpZW50UmVxdWVzdHNFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkncyBzZXJ2ZXJcclxuICAgICAqICAgICByZXF1ZXN0cyBhbGxvd2FuY2UgaGFzIGJlZW4gZXhjZWVkZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdJbnN1ZmZpY2llbnRCaXRzRXJyb3J9IFRocm93biB3aGVuIHRoZSBBUEkga2V5J3Mgc2VydmVyXHJcbiAgICAgKiAgICAgYml0cyBhbGxvd2FuY2UgaGFzIGJlZW4gZXhjZWVkZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdCYWRIVFRQUmVzcG9uc2VFcnJvcn0gVGhyb3duIHdoZW4gYSBIVFRQIDIwMCBPSyByZXNwb25zZVxyXG4gICAgICogICAgIGlzIG5vdCByZWNlaXZlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ1JBTkRPTU9SR0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgc2VydmVyIHJldHVybnMgYSBSQU5ET00uT1JHXHJcbiAgICAgKiAgICAgRXJyb3IuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdKU09OUlBDRXJyb3J9IFRocm93biB3aGVuIHRoZSBzZXJ2ZXIgcmV0dXJucyBhIEpTT04tUlBDIEVycm9yLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBnZW5lcmF0ZVNpZ25lZFN0cmluZ3MobiwgbGVuZ3RoLCBjaGFyYWN0ZXJzLCBvcHRpb25zID0ge30pIHtcclxuICAgICAgICBsZXQgcmVxdWVzdCA9IHRoaXMuI3N0cmluZ1JlcXVlc3QobiwgbGVuZ3RoLCBjaGFyYWN0ZXJzLCBvcHRpb25zLCB0cnVlKTtcclxuICAgICAgICByZXR1cm4gdGhpcy4jZXh0cmFjdFNpZ25lZCh0aGlzLiNzZW5kUmVxdWVzdChyZXF1ZXN0KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXF1ZXN0IGEgbGlzdCAoc2l6ZSBuKSBvZiB2ZXJzaW9uIDQgdHJ1ZSByYW5kb20gVW5pdmVyc2FsbHkgVW5pcXVlXHJcbiAgICAgKiBJRGVudGlmaWVycyAoVVVJRHMpIGluIGFjY29yZGFuY2Ugd2l0aCBzZWN0aW9uIDQuNCBvZiBSRkMgNDEyMiwgZnJvbVxyXG4gICAgICogdGhlIHNlcnZlci5cclxuICAgICAqIFxyXG4gICAgICogUmV0dXJucyBhIFByb21pc2Ugd2hpY2gsIGlmIHJlc29sdmVkIHN1Y2Nlc3NmdWxseSwgcmVzcHJlc2VudHMgYW4gb2JqZWN0XHJcbiAgICAgKiB3aXRoIHRoZSBwYXJzZWQgVVVJRHMgbWFwcGVkIHRvICdkYXRhJywgdGhlIG9yaWdpbmFsIHJlc3BvbnNlIG1hcHBlZCB0b1xyXG4gICAgICogJ3JhbmRvbScsIGFuZCB0aGUgcmVzcG9uc2UncyBzaWduYXR1cmUgbWFwcGVkIHRvICdzaWduYXR1cmUnLiBTZWU6XHJcbiAgICAgKiBodHRwczovL2FwaS5yYW5kb20ub3JnL2pzb24tcnBjLzQvc2lnbmVkI2dlbmVyYXRlU2lnbmVkVVVJRHNcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIEhvdyBtYW55IHJhbmRvbSBVVUlEcyB5b3UgbmVlZC4gTXVzdCBiZSB3aXRoaW4gdGhlXHJcbiAgICAgKiAgICAgWzEsMWUzXSByYW5nZS5cclxuICAgICAqIEBwYXJhbSB7e3ByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb24/OiBPYmplY3QsIGxpY2Vuc2VEYXRhPzogT2JqZWN0LCB1c2VyRGF0YT86XHJcbiAgICAgKiAgICAgT2JqZWN0fHN0cmluZ3xudW1iZXIsIHRpY2tldElkPzogc3RyaW5nfX0gb3B0aW9ucyBBbiBvYmplY3Qgd2hpY2ggbWF5XHJcbiAgICAgKiAgICAgY29udGFpbiBhbnkgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25hbCBwYXJhbWV0ZXJzOlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb249bnVsbF0gQSBkaWN0aW9uYXJ5IG9iamVjdFxyXG4gICAgICogICAgIHdoaWNoIGFsbG93cyB0aGUgY2xpZW50IHRvIHNwZWNpZnkgdGhhdCB0aGUgcmFuZG9tIHZhbHVlcyBzaG91bGQgYmVcclxuICAgICAqICAgICBnZW5lcmF0ZWQgZnJvbSBhIHByZWdlbmVyYXRlZCwgaGlzdG9yaWNhbCByYW5kb21pemF0aW9uIGluc3RlYWQgb2YgYVxyXG4gICAgICogICAgIG9uZS10aW1lIG9uLXRoZS1mbHkgcmFuZG9taXphdGlvbi4gVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIGNhc2VzOlxyXG4gICAgICogKiAqKm51bGwqKjogVGhlIHN0YW5kYXJkIHdheSBvZiBjYWxsaW5nIGZvciByYW5kb20gdmFsdWVzLCBpLmUudHJ1ZVxyXG4gICAgICogICAgICAgcmFuZG9tbmVzcyBpcyBnZW5lcmF0ZWQgYW5kIGRpc2NhcmRlZCBhZnRlcndhcmRzLlxyXG4gICAgICogKiAqKmRhdGUqKjogUkFORE9NLk9SRyB1c2VzIGhpc3RvcmljYWwgdHJ1ZSByYW5kb21uZXNzIGdlbmVyYXRlZCBvbiB0aGVcclxuICAgICAqICAgICAgIGNvcnJlc3BvbmRpbmcgZGF0ZSAocGFzdCBvciBwcmVzZW50LCBmb3JtYXQ6IHsgJ2RhdGUnLCAnWVlZWS1NTS1ERCcgfSkuXHJcbiAgICAgKiAqICoqaWQqKjogUkFORE9NLk9SRyB1c2VzIGhpc3RvcmljYWwgdHJ1ZSByYW5kb21uZXNzIGRlcml2ZWQgZnJvbSB0aGVcclxuICAgICAqICAgICAgIGNvcnJlc3BvbmRpbmcgaWRlbnRpZmllciBpbiBhIGRldGVybWluaXN0aWMgbWFubmVyLiBGb3JtYXQ6IHsgJ2lkJyxcclxuICAgICAqICAgICAgICdQRVJTSVNURU5ULUlERU5USUZJRVInIH0gd2hlcmUgJ1BFUlNJU1RFTlQtSURFTlRJRklFUicgaXMgYSBzdHJpbmdcclxuICAgICAqICAgICAgIHdpdGggbGVuZ3RoIGluIHRoZSBbMSwgNjRdIHJhbmdlLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmxpY2Vuc2VEYXRhPW51bGxdIEEgZGljdGlvbmFyeSBvYmplY3Qgd2hpY2ggYWxsb3dzXHJcbiAgICAgKiAgICAgdGhlIGNhbGxlciB0byBpbmNsdWRlIGRhdGEgb2YgcmVsZXZhbmNlIHRvIHRoZSBsaWNlbnNlIHRoYXQgaXMgYXNzb2NpYXRlZFxyXG4gICAgICogICAgIHdpdGggdGhlIEFQSSBLZXkuIFRoaXMgaXMgbWFuZGF0b3J5IGZvciBBUEkgS2V5cyB3aXRoIHRoZSBsaWNlbnNlIHR5cGVcclxuICAgICAqICAgICAnRmxleGlibGUgR2FtYmxpbmcnIGFuZCBmb2xsb3dzIHRoZSBmb3JtYXQgeyAnbWF4UGF5b3V0JzogeyAnY3VycmVuY3knOlxyXG4gICAgICogICAgICdYVFMnLCAnYW1vdW50JzogMC4wIH19LiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgaW4gbGljZW5zaW5nXHJcbiAgICAgKiAgICAgcmVxdWVzdGVkIHJhbmRvbSB2YWx1ZXMgYW5kIGluIGJpbGxpbmcuIFRoZSBjdXJyZW50bHkgc3VwcG9ydGVkXHJcbiAgICAgKiAgICAgY3VycmVuY2llcyBhcmU6ICdVU0QnLCAnRVVSJywgJ0dCUCcsICdCVEMnLCAnRVRIJy4gVGhlIG1vc3QgdXAtdG8tZGF0ZVxyXG4gICAgICogICAgIGluZm9ybWF0aW9uIG9uIHRoZSBjdXJyZW5jaWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgU2lnbmVkIEFQSVxyXG4gICAgICogICAgIGRvY3VtZW50YXRpb24sIGhlcmU6IGh0dHBzOi8vYXBpLnJhbmRvbS5vcmcvanNvbi1ycGMvNC9zaWduZWRcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXJ8T2JqZWN0KX0gW29wdGlvbnMudXNlckRhdGE9bnVsbF0gT2JqZWN0IHRoYXQgd2lsbCBiZVxyXG4gICAgICogICAgIGluY2x1ZGVkIGluIHVubW9kaWZpZWQgZm9ybS4gSXRzIG1heGltdW0gc2l6ZSBpbiBlbmNvZGVkIChTdHJpbmcpIGZvcm1cclxuICAgICAqICAgICBpcyAxLDAwMCBjaGFyYWN0ZXJzIChkZWZhdWx0IG51bGwpLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnRpY2tldElkPW51bGxdIEEgc3RyaW5nIHdpdGggdGlja2V0IGlkZW50aWZpZXJcclxuICAgICAqICAgICBvYnRhaW5lZCB2aWEgdGhlIHtAbGluayBSYW5kb21PcmdDbGllbnQjY3JlYXRlVGlja2V0c30gbWV0aG9kLiBTcGVjaWZ5aW5nXHJcbiAgICAgKiAgICAgYSB2YWx1ZSBmb3IgdGlja2V0SWQgd2lsbCBjYXVzZSBSQU5ET00uT1JHIHRvIHJlY29yZCB0aGF0IHRoZSB0aWNrZXQgd2FzXHJcbiAgICAgKiAgICAgdXNlZCB0byBnZW5lcmF0ZSB0aGUgcmVxdWVzdGVkIHJhbmRvbSB2YWx1ZXMuIEVhY2ggdGlja2V0IGNhbiBvbmx5IGJlIHVzZWRcclxuICAgICAqICAgICBvbmNlIChkZWZhdWx0IG51bGwpLlxyXG4gICAgICogQHJldHVybnMge1Byb21pc2U8e2RhdGE6IHN0cmluZ1tdLCByYW5kb206IE9iamVjdCwgc2lnbmF0dXJlOiBzdHJpbmd9Pn0gQVxyXG4gICAgICogICAgIFByb21pc2Ugd2hpY2gsIGlmIHJlc29sdmVkIHN1Y2Nlc3NmdWxseSwgcmVwcmVzZW50cyBhbiBvYmplY3Qgd2l0aCB0aGVcclxuICAgICAqICAgICBmb2xsb3dpbmcgc3RydWN0dXJlOlxyXG4gICAgICogKiAqKmRhdGEqKjogYXJyYXkgb2YgdHJ1ZSByYW5kb20gVVVJRHNcclxuICAgICAqICogKipyYW5kb20qKjogcmFuZG9tIGZpZWxkIGFzIHJldHVybmVkIGZyb20gdGhlIHNlcnZlclxyXG4gICAgICogKiAqKnNpZ25hdHVyZSoqOiBzaWduYXR1cmUgc3RyaW5nXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdTZW5kVGltZW91dEVycm9yfSBUaHJvd24gd2hlbiBibG9ja2luZyB0aW1lb3V0IGlzIGV4Y2VlZGVkXHJcbiAgICAgKiAgICAgYmVmb3JlIHRoZSByZXF1ZXN0IGNhbiBiZSBzZW50LlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnS2V5Tm90UnVubmluZ0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgQVBJIGtleSBoYXMgYmVlblxyXG4gICAgICogICAgIHN0b3BwZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdJbnN1ZmZpY2llbnRSZXF1ZXN0c0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgQVBJIGtleSdzIHNlcnZlclxyXG4gICAgICogICAgIHJlcXVlc3RzIGFsbG93YW5jZSBoYXMgYmVlbiBleGNlZWRlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0luc3VmZmljaWVudEJpdHNFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkncyBzZXJ2ZXJcclxuICAgICAqICAgICBiaXRzIGFsbG93YW5jZSBoYXMgYmVlbiBleGNlZWRlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0JhZEhUVFBSZXNwb25zZUVycm9yfSBUaHJvd24gd2hlbiBhIEhUVFAgMjAwIE9LIHJlc3BvbnNlXHJcbiAgICAgKiAgICAgaXMgbm90IHJlY2VpdmVkLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnUkFORE9NT1JHRXJyb3J9IFRocm93biB3aGVuIHRoZSBzZXJ2ZXIgcmV0dXJucyBhIFJBTkRPTS5PUkdcclxuICAgICAqICAgICBFcnJvci5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0pTT05SUENFcnJvcn0gVGhyb3duIHdoZW4gdGhlIHNlcnZlciByZXR1cm5zIGEgSlNPTi1SUEMgRXJyb3IuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdlbmVyYXRlU2lnbmVkVVVJRHMobiwgb3B0aW9ucyA9IHt9KSB7XHJcbiAgICAgICAgbGV0IHJlcXVlc3QgPSB0aGlzLiNVVUlEUmVxdWVzdChuLCBvcHRpb25zLCB0cnVlKTtcclxuICAgICAgICByZXR1cm4gdGhpcy4jZXh0cmFjdFNpZ25lZCh0aGlzLiNzZW5kUmVxdWVzdChyZXF1ZXN0KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXF1ZXN0IGEgbGlzdCAoc2l6ZSBuKSBvZiBCaW5hcnkgTGFyZ2UgT0JqZWN0cyAoQkxPQnMpIGNvbnRhaW5pbmcgdHJ1ZVxyXG4gICAgICogcmFuZG9tIGRhdGEgZnJvbSB0aGUgc2VydmVyLlxyXG4gICAgICogXHJcbiAgICAgKiBSZXR1cm5zIGEgUHJvbWlzZSB3aGljaCwgaWYgcmVzb2x2ZWQgc3VjY2Vzc2Z1bGx5LCByZXNwcmVzZW50cyBhbiBvYmplY3RcclxuICAgICAqIHdpdGggdGhlIHBhcnNlZCBCTE9CcyBtYXBwZWQgdG8gJ2RhdGEnLCB0aGUgb3JpZ2luYWwgcmVzcG9uc2UgbWFwcGVkIHRvXHJcbiAgICAgKiAncmFuZG9tJywgYW5kIHRoZSByZXNwb25zZSdzIHNpZ25hdHVyZSBtYXBwZWQgdG8gJ3NpZ25hdHVyZScuIFNlZTpcclxuICAgICAqIGh0dHBzOi8vYXBpLnJhbmRvbS5vcmcvanNvbi1ycGMvNC9zaWduZWQjZ2VuZXJhdGVTaWduZWRCbG9ic1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gSG93IG1hbnkgcmFuZG9tIGJsb2JzIHlvdSBuZWVkLiBNdXN0IGJlIHdpdGhpbiB0aGVcclxuICAgICAqICAgICBbMSwxMDBdIHJhbmdlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgVGhlIHNpemUgb2YgZWFjaCBibG9iLCBtZWFzdXJlZCBpbiBiaXRzLiBNdXN0IGJlXHJcbiAgICAgKiAgICAgd2l0aGluIHRoZSBbMSwxMDQ4NTc2XSByYW5nZSBhbmQgbXVzdCBiZSBkaXZpc2libGUgYnkgOC5cclxuICAgICAqIEBwYXJhbSB7e2Zvcm1hdD86IHN0cmluZywgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbj86IE9iamVjdCwgbGljZW5zZURhdGE/OlxyXG4gICAgICogICAgIE9iamVjdCwgdXNlckRhdGE/OiBPYmplY3R8bnVtYmVyfHN0cmluZywgdGlja2V0SWQ/OiBzdHJpbmd9fSBvcHRpb25zIEFuXHJcbiAgICAgKiAgICAgb2JqZWN0IHdoaWNoIG1heSBjb250YWluIGFueSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbmFsIHBhcmFtZXRlcnM6XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuZm9ybWF0PSdiYXNlNjQnXSBTcGVjaWZpZXMgdGhlIGZvcm1hdCBpbiB3aGljaCB0aGVcclxuICAgICAqICAgICBibG9icyB3aWxsIGJlIHJldHVybmVkLiBWYWx1ZXMgYWxsb3dlZCBhcmUgJ2Jhc2U2NCcgYW5kICdoZXgnIChkZWZhdWx0XHJcbiAgICAgKiAgICAgJ2Jhc2U2NCcpLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb249bnVsbF0gQSBkaWN0aW9uYXJ5IG9iamVjdFxyXG4gICAgICogICAgIHdoaWNoIGFsbG93cyB0aGUgY2xpZW50IHRvIHNwZWNpZnkgdGhhdCB0aGUgcmFuZG9tIHZhbHVlcyBzaG91bGQgYmVcclxuICAgICAqICAgICBnZW5lcmF0ZWQgZnJvbSBhIHByZWdlbmVyYXRlZCwgaGlzdG9yaWNhbCByYW5kb21pemF0aW9uIGluc3RlYWQgb2YgYVxyXG4gICAgICogICAgIG9uZS10aW1lIG9uLXRoZS1mbHkgcmFuZG9taXphdGlvbi4gVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIGNhc2VzOlxyXG4gICAgICogKiAqKm51bGwqKjogVGhlIHN0YW5kYXJkIHdheSBvZiBjYWxsaW5nIGZvciByYW5kb20gdmFsdWVzLCBpLmUudHJ1ZVxyXG4gICAgICogICAgICAgcmFuZG9tbmVzcyBpcyBnZW5lcmF0ZWQgYW5kIGRpc2NhcmRlZCBhZnRlcndhcmRzLlxyXG4gICAgICogKiAqKmRhdGUqKjogUkFORE9NLk9SRyB1c2VzIGhpc3RvcmljYWwgdHJ1ZSByYW5kb21uZXNzIGdlbmVyYXRlZCBvbiB0aGVcclxuICAgICAqICAgICAgIGNvcnJlc3BvbmRpbmcgZGF0ZSAocGFzdCBvciBwcmVzZW50LCBmb3JtYXQ6IHsgJ2RhdGUnLCAnWVlZWS1NTS1ERCcgfSkuXHJcbiAgICAgKiAqICoqaWQqKjogUkFORE9NLk9SRyB1c2VzIGhpc3RvcmljYWwgdHJ1ZSByYW5kb21uZXNzIGRlcml2ZWQgZnJvbSB0aGVcclxuICAgICAqICAgICAgIGNvcnJlc3BvbmRpbmcgaWRlbnRpZmllciBpbiBhIGRldGVybWluaXN0aWMgbWFubmVyLiBGb3JtYXQ6IHsgJ2lkJyxcclxuICAgICAqICAgICAgICdQRVJTSVNURU5ULUlERU5USUZJRVInIH0gd2hlcmUgJ1BFUlNJU1RFTlQtSURFTlRJRklFUicgaXMgYSBzdHJpbmdcclxuICAgICAqICAgICAgIHdpdGggbGVuZ3RoIGluIHRoZSBbMSwgNjRdIHJhbmdlLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmxpY2Vuc2VEYXRhPW51bGxdIEEgZGljdGlvbmFyeSBvYmplY3Qgd2hpY2ggYWxsb3dzXHJcbiAgICAgKiAgICAgdGhlIGNhbGxlciB0byBpbmNsdWRlIGRhdGEgb2YgcmVsZXZhbmNlIHRvIHRoZSBsaWNlbnNlIHRoYXQgaXMgYXNzb2NpYXRlZFxyXG4gICAgICogICAgIHdpdGggdGhlIEFQSSBLZXkuIFRoaXMgaXMgbWFuZGF0b3J5IGZvciBBUEkgS2V5cyB3aXRoIHRoZSBsaWNlbnNlIHR5cGVcclxuICAgICAqICAgICAnRmxleGlibGUgR2FtYmxpbmcnIGFuZCBmb2xsb3dzIHRoZSBmb3JtYXQgeyAnbWF4UGF5b3V0JzogeyAnY3VycmVuY3knOlxyXG4gICAgICogICAgICdYVFMnLCAnYW1vdW50JzogMC4wIH19LiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgaW4gbGljZW5zaW5nXHJcbiAgICAgKiAgICAgcmVxdWVzdGVkIHJhbmRvbSB2YWx1ZXMgYW5kIGluIGJpbGxpbmcuIFRoZSBjdXJyZW50bHkgc3VwcG9ydGVkXHJcbiAgICAgKiAgICAgY3VycmVuY2llcyBhcmU6ICdVU0QnLCAnRVVSJywgJ0dCUCcsICdCVEMnLCAnRVRIJy4gVGhlIG1vc3QgdXAtdG8tZGF0ZVxyXG4gICAgICogICAgIGluZm9ybWF0aW9uIG9uIHRoZSBjdXJyZW5jaWVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgU2lnbmVkIEFQSVxyXG4gICAgICogICAgIGRvY3VtZW50YXRpb24sIGhlcmU6IGh0dHBzOi8vYXBpLnJhbmRvbS5vcmcvanNvbi1ycGMvNC9zaWduZWRcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXJ8T2JqZWN0KX0gW29wdGlvbnMudXNlckRhdGE9bnVsbF0gT2JqZWN0IHRoYXQgd2lsbCBiZVxyXG4gICAgICogICAgIGluY2x1ZGVkIGluIHVubW9kaWZpZWQgZm9ybS4gSXRzIG1heGltdW0gc2l6ZSBpbiBlbmNvZGVkIChTdHJpbmcpIGZvcm0gaXNcclxuICAgICAqICAgICAxLDAwMCBjaGFyYWN0ZXJzIChkZWZhdWx0IG51bGwpLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnRpY2tldElkPW51bGxdIEEgc3RyaW5nIHdpdGggdGlja2V0IGlkZW50aWZpZXJcclxuICAgICAqICAgICBvYnRhaW5lZCB2aWEgdGhlIHtAbGluayBSYW5kb21PcmdDbGllbnQjY3JlYXRlVGlja2V0c30gbWV0aG9kLiBTcGVjaWZ5aW5nXHJcbiAgICAgKiAgICAgYSB2YWx1ZSBmb3IgdGlja2V0SWQgd2lsbCBjYXVzZSBSQU5ET00uT1JHIHRvIHJlY29yZCB0aGF0IHRoZSB0aWNrZXQgd2FzXHJcbiAgICAgKiAgICAgdXNlZCB0byBnZW5lcmF0ZSB0aGUgcmVxdWVzdGVkIHJhbmRvbSB2YWx1ZXMuIEVhY2ggdGlja2V0IGNhbiBvbmx5IGJlIHVzZWRcclxuICAgICAqICAgICBvbmNlIChkZWZhdWx0IG51bGwpLlxyXG4gICAgICogQHJldHVybnMge1Byb21pc2U8e2RhdGE6IHN0cmluZ1tdLCByYW5kb206IE9iamVjdCwgc2lnbmF0dXJlOiBzdHJpbmd9Pn0gQVxyXG4gICAgICogICAgIFByb21pc2Ugd2hpY2gsIGlmIHJlc29sdmVkIHN1Y2Nlc3NmdWxseSwgcmVwcmVzZW50cyBhbiBvYmplY3Qgd2l0aCB0aGVcclxuICAgICAqICAgICBmb2xsb3dpbmcgc3RydWN0dXJlOlxyXG4gICAgICogKiAqKmRhdGEqKjogYXJyYXkgb2YgdHJ1ZSByYW5kb20gYmxvYnMgYXMgc3RyaW5nc1xyXG4gICAgICogKiAqKnJhbmRvbSoqOiByYW5kb20gZmllbGQgYXMgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyXHJcbiAgICAgKiAqICoqc2lnbmF0dXJlKio6IHNpZ25hdHVyZSBzdHJpbmdcclxuICAgICAqIEBzZWUge0BsaW5rIFJhbmRvbU9yZ0NsaWVudCNCTE9CX0ZPUk1BVF9CQVNFNjR9IGZvciAnYmFzZTY0JyAoZGVmYXVsdCkuXHJcbiAgICAgKiBAc2VlIHtAbGluayBSYW5kb21PcmdDbGllbnQjQkxPQl9GT1JNQVRfSEVYfSBmb3IgJ2hleCcuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdTZW5kVGltZW91dEVycm9yfSBUaHJvd24gd2hlbiBibG9ja2luZyB0aW1lb3V0IGlzIGV4Y2VlZGVkXHJcbiAgICAgKiAgICAgYmVmb3JlIHRoZSByZXF1ZXN0IGNhbiBiZSBzZW50LlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnS2V5Tm90UnVubmluZ0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgQVBJIGtleSBoYXMgYmVlblxyXG4gICAgICogICAgIHN0b3BwZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdJbnN1ZmZpY2llbnRSZXF1ZXN0c0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgQVBJIGtleSdzIHNlcnZlclxyXG4gICAgICogICAgIHJlcXVlc3RzIGFsbG93YW5jZSBoYXMgYmVlbiBleGNlZWRlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0luc3VmZmljaWVudEJpdHNFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkncyBzZXJ2ZXJcclxuICAgICAqICAgICBiaXRzIGFsbG93YW5jZSBoYXMgYmVlbiBleGNlZWRlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0JhZEhUVFBSZXNwb25zZUVycm9yfSBUaHJvd24gd2hlbiBhIEhUVFAgMjAwIE9LIHJlc3BvbnNlXHJcbiAgICAgKiAgICAgaXMgbm90IHJlY2VpdmVkLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnUkFORE9NT1JHRXJyb3J9IFRocm93biB3aGVuIHRoZSBzZXJ2ZXIgcmV0dXJucyBhIFJBTkRPTS5PUkdcclxuICAgICAqICAgICBFcnJvci5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0pTT05SUENFcnJvcn0gVGhyb3duIHdoZW4gdGhlIHNlcnZlciByZXR1cm5zIGEgSlNPTi1SUEMgRXJyb3IuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdlbmVyYXRlU2lnbmVkQmxvYnMobiwgc2l6ZSwgb3B0aW9ucyA9IHt9KSB7XHJcbiAgICAgICAgbGV0IHJlcXVlc3QgPSB0aGlzLiNibG9iUmVxdWVzdChuLCBzaXplLCBvcHRpb25zLCB0cnVlKTtcclxuICAgICAgICByZXR1cm4gdGhpcy4jZXh0cmFjdFNpZ25lZCh0aGlzLiNzZW5kUmVxdWVzdChyZXF1ZXN0KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gT1RIRVIgTUVUSE9EU1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmVyaWZpZXMgdGhlIHNpZ25hdHVyZSBvZiBhIHJlc3BvbnNlIHByZXZpb3VzbHkgcmVjZWl2ZWQgZnJvbSBvbmUgb2YgdGhlXHJcbiAgICAgKiBtZXRob2RzIGluIHRoZSBTaWduZWQgQVBJIHdpdGggdGhlIHNlcnZlci5cclxuICAgICAqIFxyXG4gICAgICogVGhpcyBpcyB1c2VkIHRvIGV4YW1pbmUgdGhlIGF1dGhlbnRpY2l0eSBvZiBudW1iZXJzLiBSZXR1cm5zIFRydWUgb25cclxuICAgICAqIHZlcmlmaWNhdGlvbiBzdWNjZXNzLiBTZWU6XHJcbiAgICAgKiBodHRwczovL2FwaS5yYW5kb20ub3JnL2pzb24tcnBjLzQvc2lnbmVkI3ZlcmlmeVNpZ25hdHVyZVxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHJhbmRvbSBUaGUgcmFuZG9tIGZpZWxkIGZyb20gYSByZXNwb25zZSByZXR1cm5lZCBieSBSQU5ET00uT1JHXHJcbiAgICAgKiAgICAgdGhyb3VnaCBvbmUgb2YgdGhlIFNpZ25lZCBBUEkgbWV0aG9kcy5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzaWduYXR1cmUgVGhlIHNpZ25hdHVyZSBmaWVsZCBmcm9tIHRoZSBzYW1lIHJlc3BvbnNlIHRoYXRcclxuICAgICAqICAgICB0aGUgcmFuZG9tIGZpZWxkIG9yaWdpbmF0ZXMgZnJvbS5cclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBBIFByb21pc2Ugd2hpY2gsIGlmIHJlc29sdmVkIHN1Y2Nlc3NmdWxseSxcclxuICAgICAqICAgICByZXByZXNlbnRzIHdoZXRoZXIgdGhlIHJlc3VsdCBjb3VsZCBiZSB2ZXJpZmllZCAodHJ1ZSkgb3Igbm90IChmYWxzZSkuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdTZW5kVGltZW91dEVycm9yfSBUaHJvd24gd2hlbiBibG9ja2luZyB0aW1lb3V0IGlzIGV4Y2VlZGVkXHJcbiAgICAgKiAgICAgYmVmb3JlIHRoZSByZXF1ZXN0IGNhbiBiZSBzZW50LlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnS2V5Tm90UnVubmluZ0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgQVBJIGtleSBoYXMgYmVlblxyXG4gICAgICogICAgIHN0b3BwZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdJbnN1ZmZpY2llbnRSZXF1ZXN0c0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgQVBJIGtleSdzIHNlcnZlclxyXG4gICAgICogICAgIHJlcXVlc3RzIGFsbG93YW5jZSBoYXMgYmVlbiBleGNlZWRlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0luc3VmZmljaWVudEJpdHNFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkncyBzZXJ2ZXJcclxuICAgICAqICAgICBiaXRzIGFsbG93YW5jZSBoYXMgYmVlbiBleGNlZWRlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0JhZEhUVFBSZXNwb25zZUVycm9yfSBUaHJvd24gd2hlbiBhIEhUVFAgMjAwIE9LIHJlc3BvbnNlXHJcbiAgICAgKiAgICAgaXMgbm90IHJlY2VpdmVkLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnUkFORE9NT1JHRXJyb3J9IFRocm93biB3aGVuIHRoZSBzZXJ2ZXIgcmV0dXJucyBhIFJBTkRPTS5PUkdcclxuICAgICAqICAgICBFcnJvci5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0pTT05SUENFcnJvcn0gVGhyb3duIHdoZW4gdGhlIHNlcnZlciByZXR1cm5zIGEgSlNPTi1SUEMgRXJyb3IuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHZlcmlmeVNpZ25hdHVyZShyYW5kb20sIHNpZ25hdHVyZSkge1xyXG4gICAgICAgIGxldCBwYXJhbXMgPSB7XHJcbiAgICAgICAgICAgIHJhbmRvbTogcmFuZG9tLFxyXG4gICAgICAgICAgICBzaWduYXR1cmU6IHNpZ25hdHVyZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgbGV0IHJlcXVlc3QgPSB0aGlzLiNnZW5lcmF0ZVJlcXVlc3QoUmFuZG9tT3JnQ2xpZW50LiNWRVJJRllfU0lHTkFUVVJFX01FVEhPRCwgcGFyYW1zKTtcclxuICAgICAgICByZXR1cm4gdGhpcy4jZXh0cmFjdFZlcmlmaWNhdGlvbih0aGlzLiNzZW5kUmVxdWVzdChyZXF1ZXN0KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSAoZXN0aW1hdGVkKSBudW1iZXIgb2YgcmVtYWluaW5nIHRydWUgcmFuZG9tIGJpdHMgYXZhaWxhYmxlIHRvXHJcbiAgICAgKiB0aGUgY2xpZW50LiBJZiBjYWNoZWQgdXNhZ2UgaW5mbyBpcyBvbGRlciB0aGFuIGFuIGhvdXIsIGZyZXNoIGluZm8gaXNcclxuICAgICAqIG9idGFpbmVkIGZyb20gdGhlIHNlcnZlci5cclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcj59IEEgUHJvbWlzZSB3aGljaCwgaWYgcmVzb2x2ZWQgc3VjY2Vzc2Z1bGx5LFxyXG4gICAgICogICAgIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBiaXRzIHJlbWFpbmluZy5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ1NlbmRUaW1lb3V0RXJyb3J9IFRocm93biB3aGVuIGJsb2NraW5nIHRpbWVvdXQgaXMgZXhjZWVkZWRcclxuICAgICAqICAgICBiZWZvcmUgdGhlIHJlcXVlc3QgY2FuIGJlIHNlbnQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdLZXlOb3RSdW5uaW5nRXJyb3J9IFRocm93biB3aGVuIHRoZSBBUEkga2V5IGhhcyBiZWVuXHJcbiAgICAgKiAgICAgc3RvcHBlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0luc3VmZmljaWVudFJlcXVlc3RzRXJyb3J9IFRocm93biB3aGVuIHRoZSBBUEkga2V5J3Mgc2VydmVyXHJcbiAgICAgKiAgICAgcmVxdWVzdHMgYWxsb3dhbmNlIGhhcyBiZWVuIGV4Y2VlZGVkLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnSW5zdWZmaWNpZW50Qml0c0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgQVBJIGtleSdzIHNlcnZlclxyXG4gICAgICogICAgIGJpdHMgYWxsb3dhbmNlIGhhcyBiZWVuIGV4Y2VlZGVkLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnQmFkSFRUUFJlc3BvbnNlRXJyb3J9IFRocm93biB3aGVuIGEgSFRUUCAyMDAgT0sgcmVzcG9uc2VcclxuICAgICAqICAgICBpcyBub3QgcmVjZWl2ZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdSQU5ET01PUkdFcnJvcn0gVGhyb3duIHdoZW4gdGhlIHNlcnZlciByZXR1cm5zIGEgUkFORE9NLk9SR1xyXG4gICAgICogICAgIEVycm9yLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnSlNPTlJQQ0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgc2VydmVyIHJldHVybnMgYSBKU09OLVJQQyBFcnJvci5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgZ2V0Qml0c0xlZnQoKSB7XHJcbiAgICAgICAgbGV0IHVwZGF0ZSA9IERhdGUubm93KCkgPiAodGhpcy4jbGFzdFJlc3BvbnNlUmVjZWl2ZWRUaW1lICsgUmFuZG9tT3JnQ2xpZW50LiNBTExPV0FOQ0VfU1RBVEVfUkVGUkVTSF9TRUNPTkRTKTtcclxuICAgICAgICBpZiAodGhpcy4jYml0c0xlZnQgPCAwIHx8IHVwZGF0ZSkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLiNnZXRVc2FnZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy4jYml0c0xlZnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSAoZXN0aW1hdGVkKSBudW1iZXIgb2YgcmVtYWluaW5nIEFQSSByZXF1ZXN0cyBhdmFpbGFibGUgdG8gdGhlXHJcbiAgICAgKiBjbGllbnQuIElmIGNhY2hlZCB1c2FnZSBpbmZvIGlzIG9sZGVyIHRoYW4gYW4gaG91ciwgZnJlc2ggaW5mbyBpc1xyXG4gICAgICogb2J0YWluZWQgZnJvbSB0aGUgc2VydmVyLlxyXG4gICAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyPn0gQSBQcm9taXNlIHdoaWNoLCBpZiByZXNvbHZlZCBzdWNjZXNzZnVsbHksXHJcbiAgICAgKiAgICAgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIHJlcXVlc3RzIHJlbWFpbmluZy5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ1NlbmRUaW1lb3V0RXJyb3J9IFRocm93biB3aGVuIGJsb2NraW5nIHRpbWVvdXQgaXMgZXhjZWVkZWRcclxuICAgICAqICAgICBiZWZvcmUgdGhlIHJlcXVlc3QgY2FuIGJlIHNlbnQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdLZXlOb3RSdW5uaW5nRXJyb3J9IFRocm93biB3aGVuIHRoZSBBUEkga2V5IGhhcyBiZWVuXHJcbiAgICAgKiAgICAgc3RvcHBlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0luc3VmZmljaWVudFJlcXVlc3RzRXJyb3J9IFRocm93biB3aGVuIHRoZSBBUEkga2V5J3Mgc2VydmVyXHJcbiAgICAgKiAgICAgcmVxdWVzdHMgYWxsb3dhbmNlIGhhcyBiZWVuIGV4Y2VlZGVkLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnSW5zdWZmaWNpZW50Qml0c0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgQVBJIGtleSdzIHNlcnZlclxyXG4gICAgICogICAgIGJpdHMgYWxsb3dhbmNlIGhhcyBiZWVuIGV4Y2VlZGVkLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnQmFkSFRUUFJlc3BvbnNlRXJyb3J9IFRocm93biB3aGVuIGEgSFRUUCAyMDAgT0sgcmVzcG9uc2VcclxuICAgICAqICAgICBpcyBub3QgcmVjZWl2ZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdSQU5ET01PUkdFcnJvcn0gVGhyb3duIHdoZW4gdGhlIHNlcnZlciByZXR1cm5zIGEgUkFORE9NLk9SR1xyXG4gICAgICogICAgIEVycm9yLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnSlNPTlJQQ0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgc2VydmVyIHJldHVybnMgYSBKU09OLVJQQyBFcnJvci5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgZ2V0UmVxdWVzdHNMZWZ0KCkge1xyXG4gICAgICAgIGxldCB1cGRhdGUgPSBEYXRlLm5vdygpID4gKHRoaXMuI2xhc3RSZXNwb25zZVJlY2VpdmVkVGltZSArIFJhbmRvbU9yZ0NsaWVudC4jQUxMT1dBTkNFX1NUQVRFX1JFRlJFU0hfU0VDT05EUyk7XHJcbiAgICAgICAgaWYgKHRoaXMuI3JlcXVlc3RzTGVmdCA8IDAgfHwgdXBkYXRlKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI2dldFVzYWdlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLiNyZXF1ZXN0c0xlZnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZXMgc2lnbmVkIHJhbmRvbSB2YWx1ZXMgZ2VuZXJhdGVkIHdpdGhpbiB0aGUgbGFzdCAyNGgsIHVzaW5nIGFcclxuICAgICAqIHNlcmlhbCBudW1iZXIuXHJcbiAgICAgKiBcclxuICAgICAqIElmIHRoZSBoaXN0b3JpY2FsIHJlc3BvbnNlIHdhcyBmb3VuZCwgdGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiB0aGUgc2FtZVxyXG4gICAgICogdmFsdWVzIHRoYXQgd2VyZSByZXR1cm5lZCBieSB0aGUgbWV0aG9kIHRoYXQgd2FzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHZhbHVlc1xyXG4gICAgICogaW5pdGlhbGx5LiBTZWU6IGh0dHBzOi8vYXBpLnJhbmRvbS5vcmcvanNvbi1ycGMvNC9zaWduZWQjZ2V0UmVzdWx0XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2VyaWFsTnVtYmVyIEFuIGludGVnZXIgY29udGFpbmluZyB0aGUgc2VyaWFsIG51bWJlclxyXG4gICAgICogICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzcG9uc2UgeW91IHdpc2ggdG8gcmV0cmlldmUuXHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBBIFByb21pc2Ugd2hpY2gsIGlmIHJlc29sdmVkIHN1Y2Nlc3NmdWxseSxcclxuICAgICAqICAgICByZXByZXNlbnRzIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlLCBpZGVudGljYWwgdG8gdGhhdFxyXG4gICAgICogICAgIHJldHVybmVkIGJ5IHRoZSBvcmlnaW5hbCByZXF1ZXN0OlxyXG4gICAgICogKiAqKmRhdGEqKjogYXJyYXkgb2YgdHJ1ZSByYW5kb20gdmFsdWVzXHJcbiAgICAgKiAqICoqcmFuZG9tKio6IHJhbmRvbSBmaWVsZCBhcyByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXJcclxuICAgICAqICogKipzaWduYXR1cmUqKjogc2lnbmF0dXJlIHN0cmluZ1xyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnU2VuZFRpbWVvdXRFcnJvcn0gVGhyb3duIHdoZW4gYmxvY2tpbmcgdGltZW91dCBpcyBleGNlZWRlZFxyXG4gICAgICogICAgIGJlZm9yZSB0aGUgcmVxdWVzdCBjYW4gYmUgc2VudC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0tleU5vdFJ1bm5pbmdFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkgaGFzIGJlZW5cclxuICAgICAqICAgICBzdG9wcGVkLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnSW5zdWZmaWNpZW50UmVxdWVzdHNFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkncyBzZXJ2ZXJcclxuICAgICAqICAgICByZXF1ZXN0cyBhbGxvd2FuY2UgaGFzIGJlZW4gZXhjZWVkZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdJbnN1ZmZpY2llbnRCaXRzRXJyb3J9IFRocm93biB3aGVuIHRoZSBBUEkga2V5J3Mgc2VydmVyXHJcbiAgICAgKiAgICAgYml0cyBhbGxvd2FuY2UgaGFzIGJlZW4gZXhjZWVkZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdCYWRIVFRQUmVzcG9uc2VFcnJvcn0gVGhyb3duIHdoZW4gYSBIVFRQIDIwMCBPSyByZXNwb25zZVxyXG4gICAgICogICAgIGlzIG5vdCByZWNlaXZlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ1JBTkRPTU9SR0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgc2VydmVyIHJldHVybnMgYSBSQU5ET00uT1JHXHJcbiAgICAgKiAgICAgRXJyb3IuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdKU09OUlBDRXJyb3J9IFRocm93biB3aGVuIHRoZSBzZXJ2ZXIgcmV0dXJucyBhIEpTT04tUlBDIEVycm9yLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBnZXRSZXN1bHQoc2VyaWFsTnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IHBhcmFtcyA9IHtcclxuICAgICAgICAgICAgc2VyaWFsTnVtYmVyOiBzZXJpYWxOdW1iZXJcclxuICAgICAgICB9O1xyXG4gICAgICAgIGxldCByZXF1ZXN0ID0gdGhpcy4jZ2VuZXJhdGVLZXllZFJlcXVlc3QoUmFuZG9tT3JnQ2xpZW50LiNHRVRfUkVTVUxUX01FVEhPRCwgcGFyYW1zKTtcclxuICAgICAgICByZXR1cm4gdGhpcy4jZXh0cmFjdFNpZ25lZCh0aGlzLiNzZW5kUmVxdWVzdChyZXF1ZXN0KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBOZXdUaWNrZXQgQSB0aWNrZXQgYXMgaXQgaXMgcmV0dXJuZWQgYnkgdGhlIGNyZWF0ZVRpY2tldHMoKSBtZXRob2QuXHJcbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gdGlja2V0SWQgQSBzdHJpbmcgdmFsdWUgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSB0aWNrZXQuXHJcbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gY3JlYXRpb25UaW1lIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHRpbWVzdGFtcCBpbiBJU08gODYwMVxyXG4gICAgICogICAgIGZvcm1hdCBhdCB3aGljaCB0aGUgdGlja2V0IHdhcyBjcmVhdGVkLlxyXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IHByZXZpb3VzVGlja2V0SWQgVGhlIHByZXZpb3VzIHRpY2tldCBpbiB0aGUgY2hhaW4gdG8gd2hpY2ggdGhpc1xyXG4gICAgICogICAgIHRpY2tldCBiZWxvbmdzLiBTaW5jZSBhIG5ldyBjaGFpbiBvbmx5IGNvbnRhaW5zIG9uZSB0aWNrZXQsIHByZXZpb3VzVGlja2V0SWQgd2lsbFxyXG4gICAgICogICAgIGJlIG51bGwuXHJcbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gbmV4dFRpY2tldElkIEEgc3RyaW5nIHZhbHVlIHRoYXQgaWRlbnRpZmllcyB0aGUgbmV4dCB0aWNrZXQgaW5cclxuICAgICAqICAgICB0aGUgY2hhaW4uIFNpbmNlIGEgbmV3IGNoYWluIG9ubHkgY29udGFpbnMgb25lIHRpY2tldCwgbmV4dFRpY2tldElkIHdpbGwgYmUgbnVsbC5cclxuICAgICAqL1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGVkZWYge09iamVjdH0gVGlja2V0IEEgdGlja2V0IGFzIGl0IGlzIHJldHVybmVkIGJ5IHRoZSBsaXN0VGlja2V0cygpIGFuZFxyXG4gICAgICogICAgIGdldFRpY2tldCgpIG1ldGhvZHMuXHJcbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gdGlja2V0SWQgQSBzdHJpbmcgdmFsdWUgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSB0aWNrZXQuXHJcbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gaGFzaGVkQXBpS2V5IFRoZSBoYXNoZWQgQVBJIGtleSBmb3Igd2hpY2ggdGhlIHRpY2tldCBpcyB2YWxpZC5cclxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc2hvd1Jlc3VsdCBJZiBmYWxzZSwgZ2V0VGlja2V0KCkgd2lsbCByZXR1cm4gb25seSB0aGUgYmFzaWNcclxuICAgICAqICAgICB0aWNrZXQgaW5mb3JtYXRpb24uIElmIHRydWUsIHRoZSBmdWxsIHJhbmRvbSBhbmQgc2lnbmF0dXJlIG9iamVjdHMgZnJvbSB0aGVcclxuICAgICAqICAgICByZXNwb25zZSB0aGF0IHdhcyB1c2VkIHRvIHNhdGlzZnkgdGhlIHRpY2tldCBpcyByZXR1cm5lZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sXHJcbiAgICAgKiAgICAgcGxlYXNlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgZ2V0VGlja2V0LlxyXG4gICAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNyZWF0aW9uVGltZSBUaGUgdGltZXN0YW1wIGluIElTTyA4NjAxIGZvcm1hdCBhdCB3aGljaCB0aGUgdGlja2V0XHJcbiAgICAgKiAgICAgd2FzIGNyZWF0ZWQuXHJcbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gdXNlZFRpbWUgVGhlIHRpbWVzdGFtcCBpbiBJU08gODYwMSBmb3JtYXQgYXQgd2hpY2ggdGhlIHRpY2tldCB3YXNcclxuICAgICAqICAgICB1c2VkLiBJZiB0aGUgdGlja2V0IGhhcyBub3QgYmVlbiB1c2VkIHlldCwgdGhpcyB2YWx1ZSBpcyBudWxsLlxyXG4gICAgICogQHByb3BlcnR5IHtudW1iZXJ9IHNlcmlhbE51bWJlciBBIG51bWVyaWMgdmFsdWUgaW5kaWNhdGluZyB3aGljaCBzZXJpYWwgbnVtYmVyXHJcbiAgICAgKiAgICAgKHdpdGhpbiB0aGUgQVBJIGtleSB1c2VkIHRvIHNlcnZlIHRoZSB0aWNrZXQpIHdhcyB1c2VkIGZvciB0aGUgdGlja2V0LiBJZiB0aGVcclxuICAgICAqICAgICBjYWxsZXIgaGFzIHRoZSB1bmhhc2hlZCBBUEkga2V5LCB0aGV5IGNhbiB1c2UgdGhlIHNlcmlhbE51bWJlciByZXR1cm5lZCB0byBvYnRhaW5cclxuICAgICAqICAgICB0aGUgZnVsbCByZXN1bHQgdmlhIHRoZSBnZXRSZXN1bHQgbWV0aG9kLiBJZiB0aGUgdGlja2V0IGhhcyBub3QgYmVlbiB1c2VkIHlldCxcclxuICAgICAqICAgICB0aGlzIHZhbHVlIGlzIG51bGwuXHJcbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gZXhwaXJhdGlvblRpbWUgVGhlIHRpbWVzdGFtcCBpbiBJU08gODYwMSBmb3JtYXQgYXQgd2hpY2ggdGhlIHRpY2tldFxyXG4gICAgICogICAgIGV4cGlyZXMuIElmIHRoZSB0aWNrZXQgaGFzIG5vdCBiZWVuIHVzZWQgeWV0LCB0aGlzIHZhbHVlIGlzIG51bGwuXHJcbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gcHJldmlvdXNUaWNrZXRJZCBUaGUgcHJldmlvdXMgdGlja2V0IGluIHRoZSBjaGFpbiB0byB3aGljaCB0aGlzXHJcbiAgICAgKiAgICAgdGlja2V0IGJlbG9uZ3MuIElmIHRoZSB0aWNrZXQgaXMgdGhlIGZpcnN0IGluIGl0cyBjaGFpbiwgdGhlbiBwcmV2aW91c1RpY2tldElkIGlzXHJcbiAgICAgKiAgICAgbnVsbC5cclxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuZXh0VGlja2V0SWQgQSBzdHJpbmcgdmFsdWUgdGhhdCBpZGVudGlmaWVzIHRoZSBuZXh0XHJcbiAgICAgKiAgICAgdGlja2V0IGluIHRoZSBjaGFpbi5cclxuICAgICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBbcmVzdWx0XSBUaGUgc2FtZSBvYmplY3QgdGhhdCB3YXMgcmV0dXJuZWQgYnkgdGhlIG1ldGhvZCB0aGF0IHdhc1xyXG4gICAgICogICAgIG9yaWdpbmFsbHkgdXNlZCB0byBnZW5lcmF0ZSB0aGUgdmFsdWVzLlxyXG4gICAgICovXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIG4gdGlja2V0cyB0byBiZSB1c2VkIGluIHNpZ25lZCB2YWx1ZS1nZW5lcmF0aW5nIG1ldGhvZHMuXHJcbiAgICAgKiAgXHJcbiAgICAgKiBTZWU6IGh0dHBzOi8vYXBpLnJhbmRvbS5vcmcvanNvbi1ycGMvNC9zaWduZWQjY3JlYXRlVGlja2V0c1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aWNrZXRzIHJlcXVlc3RlZC4gVGhpcyBtdXN0IGJlIGEgbnVtYmVyXHJcbiAgICAgKiAgICAgaW4gdGhlIFsxLCA1MF0gcmFuZ2UuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3dSZXN1bHQgQSBib29sZWFuIHZhbHVlIHRoYXQgZGV0ZXJtaW5lcyBob3cgbXVjaFxyXG4gICAgICogICAgIGluZm9ybWF0aW9uIGNhbGxzIHRvIHtAbGluayBnZXRUaWNrZXR9IHdpbGwgcmV0dXJuLlxyXG4gICAgICogKiAqKmZhbHNlKio6IGdldFRpY2tldCB3aWxsIHJldHVybiBvbmx5IHRoZSBiYXNpYyB0aWNrZXQgaW5mb3JtYXRpb24uXHJcbiAgICAgKiAqICoqdHJ1ZSoqOiB0aGUgZnVsbCByYW5kb20gYW5kIHNpZ25hdHVyZSBvYmplY3RzIGZyb20gdGhlIHJlc3BvbnNlIHRoYXRcclxuICAgICAqICAgICB3YXMgdXNlZCB0byBzYXRpc2Z5IHRoZSB0aWNrZXQgaXMgcmV0dXJuZWQuIFxyXG4gICAgICogQHJldHVybnMge1Byb21pc2U8TmV3VGlja2V0W10+fSBBIFByb21pc2Ugd2hpY2gsIGlmIHJlc29sdmVkIHN1Y2Nlc3NmdWxseSxcclxuICAgICAqICAgICByZXByZXNlbnRzIGFuIGFycmF5IG9mIHRpY2tldCBvYmplY3RzIHdpdGggdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6XHJcbiAgICAgKiAqICoqdGlja2V0SWQqKjogQSBzdHJpbmcgdmFsdWUgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSB0aWNrZXQuXHJcbiAgICAgKiAqICoqY3JlYXRpb25UaW1lKio6IFRoZSB0aW1lIHdoZW4gdGhlIHRpY2tldCB3YXMgY3JlYXRlZCAoSVNPIDg2MDEgZm9ybWF0KS5cclxuICAgICAqICogKipuZXh0VGlja2V0SWQqKjogQSBzdHJpbmcgcG9pbnRpbmcgdG8gdGhlIG5leHQgdGlja2V0IGluIHRoZSBjaGFpbi5cclxuICAgICAqICAgICBUaGlzIHdpbGwgYmUgbnVsbCwgYXMgdGhlIHRpY2tldHMgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZCBhcmUgdGhlXHJcbiAgICAgKiAgICAgZmlyc3QgaW4gdGhlaXIgcmVzcGVjdGl2ZSBjaGFpbnMuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdTZW5kVGltZW91dEVycm9yfSBUaHJvd24gd2hlbiBibG9ja2luZyB0aW1lb3V0IGlzIGV4Y2VlZGVkXHJcbiAgICAgKiAgICAgYmVmb3JlIHRoZSByZXF1ZXN0IGNhbiBiZSBzZW50LlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnS2V5Tm90UnVubmluZ0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgQVBJIGtleSBoYXMgYmVlblxyXG4gICAgICogICAgIHN0b3BwZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdJbnN1ZmZpY2llbnRSZXF1ZXN0c0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgQVBJIGtleSdzIHNlcnZlclxyXG4gICAgICogICAgIHJlcXVlc3RzIGFsbG93YW5jZSBoYXMgYmVlbiBleGNlZWRlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0luc3VmZmljaWVudEJpdHNFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkncyBzZXJ2ZXJcclxuICAgICAqICAgICBiaXRzIGFsbG93YW5jZSBoYXMgYmVlbiBleGNlZWRlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0JhZEhUVFBSZXNwb25zZUVycm9yfSBUaHJvd24gd2hlbiBhIEhUVFAgMjAwIE9LIHJlc3BvbnNlXHJcbiAgICAgKiAgICAgaXMgbm90IHJlY2VpdmVkLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnUkFORE9NT1JHRXJyb3J9IFRocm93biB3aGVuIHRoZSBzZXJ2ZXIgcmV0dXJucyBhIFJBTkRPTS5PUkdcclxuICAgICAqICAgICBFcnJvci5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0pTT05SUENFcnJvcn0gVGhyb3duIHdoZW4gdGhlIHNlcnZlciByZXR1cm5zIGEgSlNPTi1SUEMgRXJyb3IuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGNyZWF0ZVRpY2tldHMobiwgc2hvd1Jlc3VsdCkge1xyXG4gICAgICAgIGxldCBwYXJhbXMgPSB7XHJcbiAgICAgICAgICAgIG46IG4sXHJcbiAgICAgICAgICAgIHNob3dSZXN1bHQ6IHNob3dSZXN1bHRcclxuICAgICAgICB9O1xyXG4gICAgICAgIGxldCByZXF1ZXN0ID0gdGhpcy4jZ2VuZXJhdGVLZXllZFJlcXVlc3QoUmFuZG9tT3JnQ2xpZW50LiNDUkVBVEVfVElDS0VUX01FVEhPRCwgcGFyYW1zKTtcclxuICAgICAgICByZXR1cm4gdGhpcy4jZXh0cmFjdFJlc3VsdCh0aGlzLiNzZW5kUmVxdWVzdChyZXF1ZXN0KSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBtZXRob2QgbWFya3MgYSBzcGVjaWZpYyB0aWNrZXQgYW5kIGFsbCBpdHMgcHJlZGVjZXNzb3JzIGluIGl0cyBjaGFpblxyXG4gICAgICogYXMgYmVpbmcgcmV2ZWFsZWQsIG1lYW5pbmcgdGhhdCBzdWJzZXF1ZW50IGNhbGxzIHRvIHtAbGluayBnZXRUaWNrZXR9IHdpbGxcclxuICAgICAqIHJldHVybiB0aGUgZnVsbCBkZXRhaWxzIG9mIHRoZSB0aWNrZXRzLCBpbmNsdWRpbmcgdGhlIHJhbmRvbSB2YWx1ZXMgcHJvZHVjZWRcclxuICAgICAqIHdoZW4gdGhlIHRpY2tldHMgd2VyZSB1c2VkLiBVc2luZyB0aGlzIG1ldGhvZCBlZmZlY3RpdmVseSBjaGFuZ2VzIHRoZSB2YWx1ZVxyXG4gICAgICogb2YgKipzaG93UmVzdWx0KiogKHdoaWNoIHdhcyBzcGVjaWZpZWQgd2hlbiB0aGUgZmlyc3QgdGlja2V0IGluIHRoZSBjaGFpblxyXG4gICAgICogd2FzIGNyZWF0ZWQgdXNpbmcge0BsaW5rIGNyZWF0ZVRpY2tldHN9KSBmcm9tICpmYWxzZSogdG8gKnRydWUqLiBUaGUgcmVhc29uXHJcbiAgICAgKiB0aGF0IG5vdCBvbmx5IHRoZSB0aWNrZXQgc3BlY2lmaWVkIChidXQgYWxzbyBpdHMgcHJlZGVjZXNzb3JzIGluIGl0cyBjaGFpbilcclxuICAgICAqIGFyZSByZXZlYWxlZCBpcyB0byBlbnN1cmUgbWF4aW11bSB0cmFuc3BhcmVuY3kuIFRoZSBtZXRob2QgZG9lcyBub3QgYWZmZWN0XHJcbiAgICAgKiBhbnkgc3VjY2Vzc29ycyB0byB0aGUgdGlja2V0IGluIHRoZSBjaGFpbi5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhpcyBtZXRob2QgaXMgdXNlZCBvbiBhIHRpY2tldCB0aGF0IGhhcyBub3QgeWV0IGJlZW4gdXNlZCwgYVxyXG4gICAgICogUmFuZG9tT3JnUkFORE9NT1JHRXJyb3IgKDQyNikgd2lsbCBiZSB0aHJvd24uXHJcbiAgICAgKiBcclxuICAgICAqIFNlZTogaHR0cHM6Ly9hcGkucmFuZG9tLm9yZy9qc29uLXJwYy80L3NpZ25lZCNyZXZlYWxUaWNrZXRzXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGlja2V0SWQgQSBzdHJpbmcgdmFsdWUgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSB0aWNrZXQuXHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7dGlja2V0Q291bnQ6IGludH0+fSBBIFByb21pc2Ugd2hpY2gsIGlmIHJlc29sdmVkIHN1Y2Nlc3NmdWxseSxcclxuICAgICAqICAgICByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgdGlja2V0cyByZXZlYWxlZC4gVGhpcyB3aWxsIGluY2x1ZGUgdGhlIHRpY2tldCBzcGVjaWZpZWRcclxuICAgICAqICAgICBhcyB3ZWxsIGFzIGFsbCBpdHMgcHJlZGVjZXNzb3JzLiBJZiB0aGlzIG1ldGhvZCBpcyBpbnZva2VkIG9uIGEgdGlja2V0IHRoYXQgaXNcclxuICAgICAqICAgICBhbHJlYWR5IHJldmVhbGVkIChvciB3aGljaCB3YXMgY3JlYXRlZCB3aXRoICoqc2hvd1Jlc3VsdCoqIHNldCB0byAqdHJ1ZSopLFxyXG4gICAgICogICAgIHRoZW4gdGhlIHZhbHVlIHJldHVybmVkIHdpbGwgYmUgemVyby5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ1NlbmRUaW1lb3V0RXJyb3J9IFRocm93biB3aGVuIGJsb2NraW5nIHRpbWVvdXQgaXMgZXhjZWVkZWRcclxuICAgICAqICAgICBiZWZvcmUgdGhlIHJlcXVlc3QgY2FuIGJlIHNlbnQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdLZXlOb3RSdW5uaW5nRXJyb3J9IFRocm93biB3aGVuIHRoZSBBUEkga2V5IGhhcyBiZWVuXHJcbiAgICAgKiAgICAgc3RvcHBlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0luc3VmZmljaWVudFJlcXVlc3RzRXJyb3J9IFRocm93biB3aGVuIHRoZSBBUEkga2V5J3Mgc2VydmVyXHJcbiAgICAgKiAgICAgcmVxdWVzdHMgYWxsb3dhbmNlIGhhcyBiZWVuIGV4Y2VlZGVkLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnSW5zdWZmaWNpZW50Qml0c0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgQVBJIGtleSdzIHNlcnZlclxyXG4gICAgICogICAgIGJpdHMgYWxsb3dhbmNlIGhhcyBiZWVuIGV4Y2VlZGVkLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnQmFkSFRUUFJlc3BvbnNlRXJyb3J9IFRocm93biB3aGVuIGEgSFRUUCAyMDAgT0sgcmVzcG9uc2VcclxuICAgICAqICAgICBpcyBub3QgcmVjZWl2ZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdSQU5ET01PUkdFcnJvcn0gVGhyb3duIHdoZW4gdGhlIHNlcnZlciByZXR1cm5zIGEgUkFORE9NLk9SR1xyXG4gICAgICogICAgIEVycm9yLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnSlNPTlJQQ0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgc2VydmVyIHJldHVybnMgYSBKU09OLVJQQyBFcnJvci5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgcmV2ZWFsVGlja2V0cyh0aWNrZXRJZCkge1xyXG4gICAgICAgIGxldCBwYXJhbXMgPSB7XHJcbiAgICAgICAgICAgIHRpY2tldElkOiB0aWNrZXRJZCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGxldCByZXF1ZXN0ID0gdGhpcy4jZ2VuZXJhdGVLZXllZFJlcXVlc3QoUmFuZG9tT3JnQ2xpZW50LiNSRVZFQUxfVElDS0VUX01FVEhPRCwgcGFyYW1zKTtcclxuICAgICAgICByZXR1cm4gdGhpcy4jZXh0cmFjdFJlc3VsdCh0aGlzLiNzZW5kUmVxdWVzdChyZXF1ZXN0KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRpY2tldHMgbGlua2VkIHdpdGggeW91ciBBUEkga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGlja2V0cyB0aGF0IGNhbiBiZSByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBpcyAyMDAwLlxyXG4gICAgICogU2VlOiBodHRwczovL2FwaS5yYW5kb20ub3JnL2pzb24tcnBjLzQvc2lnbmVkI2xpc3RUaWNrZXRzXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGlja2V0VHlwZSBBIHN0cmluZyBkZXNjcmliaW5nIHRoZSB0eXBlIG9mIHRpY2tldHMgeW91IHdhbnRcclxuICAgICAqICAgICB0byBvYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQuIFBvc3NpYmxlIHZhbHVlcyBhcmUgJ3NpbmdsZXRvbicsICdoZWFkJ1xyXG4gICAgICogICAgIGFuZCAndGFpbCcuXHJcbiAgICAgKiAqICoqJ3NpbmdsZXRvbicqKiByZXR1cm5zIHRpY2tldHMgdGhhdCBoYXZlIG5vIHByZXZpb3VzIG9yIG5leHQgdGlja2V0cy5cclxuICAgICAqICogKionaGVhZCcqKiByZXR1cm5zIHRpY2tldHMgaGF0IGRvIG5vdCBoYXZlIGEgcHJldmlvdXMgdGlja2V0IGJ1dCB0aGF0IGRvXHJcbiAgICAgKiAgICAgaGF2ZSBhIG5leHQgdGlja2V0LlxyXG4gICAgICogKiAqKid0YWlsJyoqIHJldHVybnMgdGlja2V0cyB0aGF0IGhhdmUgYSBwcmV2aW91cyB0aWNrZXQgYnV0IGRvIG5vdCBoYXZlIGFcclxuICAgICAqICAgICAgIG5leHQgdGlja2V0LlxyXG4gICAgICogQHJldHVybnMge1Byb21pc2U8VGlja2V0W10+fSBBIFByb21pc2Ugd2hpY2gsIGlmIHJlc29sdmVkIHN1Y2Nlc3NmdWxseSxcclxuICAgICAqICAgICByZXByZXNlbnRzIGFuIGFycmF5IG9mIHRpY2tldCBvYmplY3RzLCBhcyByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIuXHJcbiAgICAgKiAgICAgKipOT1RFOioqIFRoZSBvYmplY3RzIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2QgZG8gbm90IGNvbnRhaW4gXCJyZXN1bHRcIlxyXG4gICAgICogICAgIGZpZWxkcywgZXZlbiBpZiB0aWNrZXRzIHdlcmUgY3JlYXRlZCB3aXRoIFwic2hvd1Jlc3VsdFwiIHNldCB0byB0cnVlLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnU2VuZFRpbWVvdXRFcnJvcn0gVGhyb3duIHdoZW4gYmxvY2tpbmcgdGltZW91dCBpcyBleGNlZWRlZFxyXG4gICAgICogICAgIGJlZm9yZSB0aGUgcmVxdWVzdCBjYW4gYmUgc2VudC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0tleU5vdFJ1bm5pbmdFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkgaGFzIGJlZW5cclxuICAgICAqICAgICBzdG9wcGVkLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnSW5zdWZmaWNpZW50UmVxdWVzdHNFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkncyBzZXJ2ZXJcclxuICAgICAqICAgICByZXF1ZXN0cyBhbGxvd2FuY2UgaGFzIGJlZW4gZXhjZWVkZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdJbnN1ZmZpY2llbnRCaXRzRXJyb3J9IFRocm93biB3aGVuIHRoZSBBUEkga2V5J3Mgc2VydmVyXHJcbiAgICAgKiAgICAgYml0cyBhbGxvd2FuY2UgaGFzIGJlZW4gZXhjZWVkZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdCYWRIVFRQUmVzcG9uc2VFcnJvcn0gVGhyb3duIHdoZW4gYSBIVFRQIDIwMCBPSyByZXNwb25zZVxyXG4gICAgICogICAgIGlzIG5vdCByZWNlaXZlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ1JBTkRPTU9SR0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgc2VydmVyIHJldHVybnMgYSBSQU5ET00uT1JHXHJcbiAgICAgKiAgICAgRXJyb3IuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdKU09OUlBDRXJyb3J9IFRocm93biB3aGVuIHRoZSBzZXJ2ZXIgcmV0dXJucyBhIEpTT04tUlBDIEVycm9yLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBsaXN0VGlja2V0cyh0aWNrZXRUeXBlKSB7XHJcbiAgICAgICAgbGV0IHBhcmFtcyA9IHtcclxuICAgICAgICAgICAgdGlja2V0VHlwZTogdGlja2V0VHlwZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgbGV0IHJlcXVlc3QgPSB0aGlzLiNnZW5lcmF0ZUtleWVkUmVxdWVzdChSYW5kb21PcmdDbGllbnQuI0xJU1RfVElDS0VUX01FVEhPRCwgcGFyYW1zKTtcclxuICAgICAgICByZXR1cm4gdGhpcy4jZXh0cmFjdFJlc3VsdCh0aGlzLiNzZW5kUmVxdWVzdChyZXF1ZXN0KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIHRpY2tldCB1c2luZyB0aGUgdGlja2V0SWQgYXNzb2NpYXRlZFxyXG4gICAgICogd2l0aCBpdC5cclxuICAgICAqICBcclxuICAgICAqIElmIHRoZSB0aWNrZXQgaGFzIHNob3dSZXN1bHQgc2V0IHRvIHRydWUgYW5kIGhhcyBiZWVuIHVzZWQsIHRoaXMgbWV0aG9kXHJcbiAgICAgKiB3aWxsIHJldHVybiB0aGUgdmFsdWVzIGdlbmVyYXRlZC5cclxuICAgICAqIFNlZTogaHR0cHM6Ly9hcGkucmFuZG9tLm9yZy9qc29uLXJwYy80L3NpZ25lZCNnZXRUaWNrZXRcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0aWNrZXRJZCBBIHN0cmluZyBjb250YWluaW5nIGEgdGlja2V0IGlkZW50aWZpZXIgcmV0dXJuZWRcclxuICAgICAqICAgICBieSBhIHByaW9yIGNhbGwgdG8gdGhlIHtAbGluayBjcmVhdGVUaWNrZXRzfSBtZXRob2QuIFxyXG4gICAgICogQHJldHVybnMge1Byb21pc2U8VGlja2V0Pn0gQSBQcm9taXNlIHdoaWNoLCBpZiByZXNvbHZlZCBzdWNjZXNzZnVsbHksXHJcbiAgICAgKiAgICAgcmVwcmVzZW50cyBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOlxyXG4gICAgICogKiAqKnRpY2tldElkKio6IEEgc3RyaW5nIHZhbHVlIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgdGlja2V0LlxyXG4gICAgICogKiAqKmhhc2hlZEFwaUtleSoqOiBUaGUgaGFzaGVkIEFQSSBrZXkgZm9yIHdoaWNoIHRoZSB0aWNrZXQgaXMgdmFsaWQuXHJcbiAgICAgKiAqICoqc2hvd1Jlc3VsdCoqOiBJZiBmYWxzZSwgZ2V0VGlja2V0KCkgd2lsbCByZXR1cm4gb25seSB0aGUgYmFzaWNcclxuICAgICAqICAgICB0aWNrZXQgaW5mb3JtYXRpb24uIElmIHRydWUsIHRoZSBmdWxsIHJhbmRvbSBhbmQgc2lnbmF0dXJlIG9iamVjdHNcclxuICAgICAqICAgICBmcm9tIHRoZSByZXNwb25zZSB0aGF0IHdhcyB1c2VkIHRvIHNhdGlzZnkgdGhlIHRpY2tldCBpcyByZXR1cm5lZC5cclxuICAgICAqICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgZ2V0VGlja2V0LlxyXG4gICAgICogKiAqKmNyZWF0aW9uVGltZSoqOiBUaGUgdGltZXN0YW1wIGluIElTTyA4NjAxIGZvcm1hdCBhdCB3aGljaCB0aGUgdGlja2V0XHJcbiAgICAgKiAgICAgd2FzIGNyZWF0ZWQuXHJcbiAgICAgKiAqICoqdXNlZFRpbWUqKiBUaGUgdGltZXN0YW1wIGluIElTTyA4NjAxIGZvcm1hdCBhdCB3aGljaCB0aGUgdGlja2V0IHdhc1xyXG4gICAgICogICAgIHVzZWQuIElmIHRoZSB0aWNrZXQgaGFzIG5vdCBiZWVuIHVzZWQgeWV0LCB0aGlzIHZhbHVlIGlzIG51bGwuXHJcbiAgICAgKiAqICoqc2VyaWFsTnVtYmVyKio6IEEgbnVtZXJpYyB2YWx1ZSBpbmRpY2F0aW5nIHdoaWNoIHNlcmlhbCBudW1iZXIgKHdpdGhpblxyXG4gICAgICogICAgIHRoZSBBUEkga2V5IHVzZWQgdG8gc2VydmUgdGhlIHRpY2tldCkgd2FzIHVzZWQgZm9yIHRoZSB0aWNrZXQuIElmIHRoZVxyXG4gICAgICogICAgIGNhbGxlciBoYXMgdGhlIHVuaGFzaGVkIEFQSSBrZXksIHRoZXkgY2FuIHVzZSB0aGUgc2VyaWFsTnVtYmVyIHJldHVybmVkXHJcbiAgICAgKiAgICAgdG8gb2J0YWluIHRoZSBmdWxsIHJlc3VsdCB2aWEgdGhlIGdldFJlc3VsdCBtZXRob2QuIElmIHRoZSB0aWNrZXQgaGFzXHJcbiAgICAgKiAgICAgbm90IGJlZW4gdXNlZCB5ZXQsIHRoaXMgdmFsdWUgaXMgbnVsbC5cclxuICAgICAqICogKipleHBpcmF0aW9uVGltZSoqOiBUaGUgdGltZXN0YW1wIGluIElTTyA4NjAxIGZvcm1hdCBhdCB3aGljaCB0aGUgdGlja2V0XHJcbiAgICAgKiAgICAgZXhwaXJlcy4gSWYgdGhlIHRpY2tldCBoYXMgbm90IGJlZW4gdXNlZCB5ZXQsIHRoaXMgdmFsdWUgaXMgbnVsbC5cclxuICAgICAqICogKipwcmV2aW91c1RpY2tldElkKio6IFRoZSBwcmV2aW91cyB0aWNrZXQgaW4gdGhlIGNoYWluIHRvIHdoaWNoIHRoaXMgdGlja2V0XHJcbiAgICAgKiAgICAgYmVsb25ncy4gSWYgdGhlIHRpY2tldCBpcyB0aGUgZmlyc3QgaW4gaXRzIGNoYWluLCB0aGVuIHByZXZpb3VzVGlja2V0SWQgaXNcclxuICAgICAqICAgICBudWxsLlxyXG4gICAgICogKiAqKm5leHRUaWNrZXRJZCoqIEEgc3RyaW5nIHZhbHVlIHRoYXQgaWRlbnRpZmllcyB0aGUgbmV4dFxyXG4gICAgICogICAgIHRpY2tldCBpbiB0aGUgY2hhaW4uXHJcbiAgICAgKiBcclxuICAgICAqICAgICBJZiBzaG93UmVzdWx0IHdhcyBzZXQgdG8gdHJ1ZSB3aGVuIHRoZSB0aWNrZXQgd2FzIGNyZWF0ZWQsXHJcbiAgICAgKiAgICAgdGhlIGZvbGxvd2luZyBmaWVsZCB3aWxsIGFsc28gYmUgYWRkZWQ6XHJcbiAgICAgKiAqICoqcmVzdWx0KiogVGhlIHNhbWUgb2JqZWN0IHRoYXQgd2FzIHJldHVybmVkIGJ5IHRoZSBtZXRob2QgdGhhdCB3YXMgb3JpZ2luYWxseVxyXG4gICAgICogICAgIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHZhbHVlcy4gVGhpcyBpbmNsdWRlcyB0aGUgcmFuZG9tIGZpZWxkIHdoaWNoIGNvbnRhaW5zIHRoZVxyXG4gICAgICogICAgIGRhdGEgcHJvcGVydHksIGFuZCBhIHNpZ25hdHVyZSBmaWVsZCwgcmVxdWlyZWQgdG8gdmVyaWZ5IHRoZSByZXN1bHQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdTZW5kVGltZW91dEVycm9yfSBUaHJvd24gd2hlbiBibG9ja2luZyB0aW1lb3V0IGlzIGV4Y2VlZGVkXHJcbiAgICAgKiAgICAgYmVmb3JlIHRoZSByZXF1ZXN0IGNhbiBiZSBzZW50LlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnS2V5Tm90UnVubmluZ0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgQVBJIGtleSBoYXMgYmVlblxyXG4gICAgICogICAgIHN0b3BwZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdJbnN1ZmZpY2llbnRSZXF1ZXN0c0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgQVBJIGtleSdzIHNlcnZlclxyXG4gICAgICogICAgIHJlcXVlc3RzIGFsbG93YW5jZSBoYXMgYmVlbiBleGNlZWRlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0luc3VmZmljaWVudEJpdHNFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkncyBzZXJ2ZXJcclxuICAgICAqICAgICBiaXRzIGFsbG93YW5jZSBoYXMgYmVlbiBleGNlZWRlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0JhZEhUVFBSZXNwb25zZUVycm9yfSBUaHJvd24gd2hlbiBhIEhUVFAgMjAwIE9LIHJlc3BvbnNlXHJcbiAgICAgKiAgICAgaXMgbm90IHJlY2VpdmVkLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnUkFORE9NT1JHRXJyb3J9IFRocm93biB3aGVuIHRoZSBzZXJ2ZXIgcmV0dXJucyBhIFJBTkRPTS5PUkdcclxuICAgICAqICAgICBFcnJvci5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0pTT05SUENFcnJvcn0gVGhyb3duIHdoZW4gdGhlIHNlcnZlciByZXR1cm5zIGEgSlNPTi1SUEMgRXJyb3IuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdldFRpY2tldCh0aWNrZXRJZCkge1xyXG4gICAgICAgIGxldCBwYXJhbXMgPSB7XHJcbiAgICAgICAgICAgIHRpY2tldElkOiB0aWNrZXRJZFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgbGV0IHJlcXVlc3QgPSB0aGlzLiNnZW5lcmF0ZVJlcXVlc3QoUmFuZG9tT3JnQ2xpZW50LiNHRVRfVElDS0VUX01FVEhPRCwgcGFyYW1zKTtcclxuICAgICAgICByZXR1cm4gdGhpcy4jZXh0cmFjdFJlc3VsdCh0aGlzLiNzZW5kUmVxdWVzdChyZXF1ZXN0KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgdGhlIFVSTCBmb3IgdGhlIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gcGFnZSBvZiBhIHJlc3BvbnNlIHByZXZpb3VzbHlcclxuICAgICAqIHJlY2VpdmVkIGZyb20gb25lIG9mIHRoZSBtZXRob2RzIGluIHRoZSBTaWduZWQgQVBJIHdpdGggdGhlIHNlcnZlci4gVGhlXHJcbiAgICAgKiB3ZWItcGFnZSBhY2Nlc3NpYmxlIGZyb20gdGhpcyBVUkwgd2lsbCBjb250YWluIHRoZSBkZXRhaWxzIG9mIHRoZSByZXNwb25zZVxyXG4gICAgICogdXNlZCBpbiB0aGlzIG1ldGhvZCwgcHJvdmlkZWQgdGhhdCB0aGUgc2lnbmF0dXJlIGNhbiBiZSB2ZXJpZmllZC4gVGhpc1xyXG4gICAgICogVVJMIGlzIGFsc28gc2hvd24gdW5kZXIgXCJTaG93IFRlY2huaWNhbCBEZXRhaWxzXCIgd2hlbiB0aGUgb25saW5lIFNpZ25hdHVyZVxyXG4gICAgICogVmVyaWZpY2F0aW9uIEZvcm0gaXMgdXNlZCB0byB2YWxpZGF0ZSBhIHNpZ25hdHVyZS4gU2VlOlxyXG4gICAgICogaHR0cHM6Ly9hcGkucmFuZG9tLm9yZy9zaWduYXR1cmVzL2Zvcm1cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSByYW5kb20gVGhlIHJhbmRvbSBmaWVsZCBmcm9tIGEgcmVzcG9uc2UgcmV0dXJuZWQgYnlcclxuICAgICAqICAgICBSQU5ET00uT1JHIHRocm91Z2ggb25lIG9mIHRoZSBTaWduZWQgQVBJIG1ldGhvZHMuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2lnbmF0dXJlIFRoZSBzaWduYXR1cmUgZmllbGQgZnJvbSB0aGUgc2FtZSByZXNwb25zZVxyXG4gICAgICogICAgIHRoYXQgdGhlIHJhbmRvbSBmaWVsZCBvcmlnaW5hdGVzIGZyb20uXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBBIHN0cmluZyBjb250YWluaW5nIHRoZSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIFVSTC5cclxuICAgICAqIEB0aHJvd3MgUmFuZG9tT3JnUkFORE9NT1JHRXJyb3Igd2hlbiB0aGUgVVJMIGlzIHRvbyBsb25nIChtYXguIDIsMDQ2XHJcbiAgICAgKiAgICAgY2hhcmFjdGVycykuXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZVVybChyYW5kb20sIHNpZ25hdHVyZSkge1xyXG4gICAgICAgIGxldCBmb3JtYXR0ZWRSYW5kb20gPSB0aGlzLiNmb3JtYXRVcmwoSlNPTi5zdHJpbmdpZnkocmFuZG9tKSk7XHJcbiAgICAgICAgbGV0IGZvcm1hdHRlZFNpZ25hdHVyZSA9IHRoaXMuI2Zvcm1hdFVybChzaWduYXR1cmUpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCB1cmwgPSAnaHR0cHM6Ly9hcGkucmFuZG9tLm9yZy9zaWduYXR1cmVzL2Zvcm0/Zm9ybWF0PWpzb24nOyAgICBcclxuICAgICAgICB1cmwgKz0gJyZyYW5kb209JyArIGZvcm1hdHRlZFJhbmRvbTtcclxuICAgICAgICB1cmwgKz0gJyZzaWduYXR1cmU9JyArIGZvcm1hdHRlZFNpZ25hdHVyZTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAodXJsLmxlbmd0aCA+IFJhbmRvbU9yZ0NsaWVudC5NQVhfVVJMX0xFTkdUSCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZG9tT3JnUkFORE9NT1JHRXJyb3IoJ0Vycm9yOiBVUkwgZXhjZWVkcyBtYXhpbXVtIGxlbmd0aCdcclxuICAgICAgICAgICAgICAgICsgJygnICsgUmFuZG9tT3JnQ2xpZW50Lk1BWF9VUkxfTEVOR1RIICsgJyBjaGFyYWN0ZXJzKS4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHVybDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSB0aGUgSFRNTCBmb3JtIGZvciB0aGUgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBwYWdlIG9mIGEgcmVzcG9uc2VcclxuICAgICAqIHByZXZpb3VzbHkgcmVjZWl2ZWQgZnJvbSBvbmUgb2YgdGhlIG1ldGhvZHMgaW4gdGhlIFNpZ25lZCBBUEkgd2l0aCB0aGVcclxuICAgICAqIHNlcnZlci4gVGhlIHdlYi1wYWdlIGFjY2Vzc2libGUgZnJvbSB0aGUgXCJWYWxpZGF0ZVwiIGJ1dHRvbiBjcmVhdGVkIHdpbGxcclxuICAgICAqIGNvbnRhaW4gdGhlIGRldGFpbHMgb2YgdGhlIHJlc3BvbnNlIHVzZWQgaW4gdGhpcyBtZXRob2QsIHByb3ZpZGVkIHRoYXRcclxuICAgICAqIHRoZSBzaWduYXR1cmUgY2FuIGJlIHZlcmlmaWVkLiBUaGUgc2FtZSBIVE1MIGZvcm0gaXMgYWxzbyBzaG93biB1bmRlclxyXG4gICAgICogXCJTaG93IFRlY2huaWNhbCBEZXRhaWxzXCIgd2hlbiB0aGUgb25saW5lIFNpZ25hdHVyZSBWZXJpZmljYXRpb24gRm9ybSBpc1xyXG4gICAgICogdXNlZCB0byB2YWxpZGF0ZSBhIHNpZ25hdHVyZS4gU2VlOiBodHRwczovL2FwaS5yYW5kb20ub3JnL3NpZ25hdHVyZXMvZm9ybVxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHJhbmRvbSBUaGUgcmFuZG9tIGZpZWxkIGZyb20gYSByZXNwb25zZSByZXR1cm5lZCBieVxyXG4gICAgICogICAgIFJBTkRPTS5PUkcgdGhyb3VnaCBvbmUgb2YgdGhlIFNpZ25lZCBBUEkgbWV0aG9kcy5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzaWduYXR1cmUgVGhlIHNpZ25hdHVyZSBmaWVsZCBmcm9tIHRoZSBzYW1lIHJlc3BvbnNlXHJcbiAgICAgKiAgICAgdGhhdCB0aGUgcmFuZG9tIGZpZWxkIG9yaWdpbmF0ZXMgZnJvbS5cclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvZGUgZm9yIHRoZSBIVE1MIGZvcm0uXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZUh0bWwocmFuZG9tLCBzaWduYXR1cmUpIHtcclxuICAgICAgICBsZXQgcyA9ICc8Zm9ybSBhY3Rpb249XFwnaHR0cHM6Ly9hcGkucmFuZG9tLm9yZy9zaWduYXR1cmVzL2Zvcm1cXCcgbWV0aG9kPVxcJ3Bvc3RcXCc+XFxuJztcclxuICAgICAgICBzICs9ICcgICcgKyB0aGlzLiNpbnB1dEhUTUwoJ2hpZGRlbicsICdmb3JtYXQnLCAnanNvbicpICsgJ1xcbic7XHJcbiAgICAgICAgcyArPSAnICAnICsgdGhpcy4jaW5wdXRIVE1MKCdoaWRkZW4nLCAncmFuZG9tJywgSlNPTi5zdHJpbmdpZnkocmFuZG9tKSkgKyAnXFxuJztcclxuICAgICAgICBzICs9ICcgICcgKyB0aGlzLiNpbnB1dEhUTUwoJ2hpZGRlbicsICdzaWduYXR1cmUnLCBzaWduYXR1cmUpICsgJ1xcbic7XHJcbiAgICAgICAgcyArPSAnICA8aW5wdXQgdHlwZT1cXCdzdWJtaXRcXCcgdmFsdWU9XFwnVmFsaWRhdGVcXCcgLz5cXG48L2Zvcm0+JztcclxuICAgICAgICByZXR1cm4gcztcclxuICAgIH1cclxuXHJcbiAgICAvLyBDUkVBVElORyBDQUNIRVNcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYSBSYW5kb21PcmdDYWNoZSB0byBvYnRhaW4gcmFuZG9tIGludGVnZXJzLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgUmFuZG9tT3JnQ2FjaGUgY2FuIGJlIHBvbGxlZCBmb3IgbmV3IHJlc3VsdHMgY29uZm9ybWluZyB0byB0aGUgb3V0cHV0XHJcbiAgICAgKiBmb3JtYXQgb2YgdGhlIGlucHV0IHJlcXVlc3QuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBIb3cgbWFueSByYW5kb20gaW50ZWdlcnMgeW91IG5lZWQuIE11c3QgYmUgd2l0aGluIHRoZVxyXG4gICAgICogICAgIFsxLDFlNF0gcmFuZ2UuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWluIFRoZSBsb3dlciBib3VuZGFyeSBmb3IgdGhlIHJhbmdlIGZyb20gd2hpY2ggdGhlIHJhbmRvbVxyXG4gICAgICogICAgIG51bWJlcnMgd2lsbCBiZSBwaWNrZWQuIE11c3QgYmUgd2l0aGluIHRoZSBbLTFlOSwxZTldIHJhbmdlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1heCBUaGUgdXBwZXIgYm91bmRhcnkgZm9yIHRoZSByYW5nZSBmcm9tIHdoaWNoIHRoZSByYW5kb21cclxuICAgICAqICAgICBudW1iZXJzIHdpbGwgYmUgcGlja2VkLiBNdXN0IGJlIHdpdGhpbiB0aGUgWy0xZTksMWU5XSByYW5nZS5cclxuICAgICAqIEBwYXJhbSB7e3JlcGxhY2VtZW50PzogYm9vbGVhbiwgYmFzZT86IG51bWJlciwgY2FjaGVTaXplPzogbnVtYmVyfX0gb3B0aW9uc1xyXG4gICAgICogICAgIEFuIG9iamVjdCB3aGljaCBtYXkgY29udGFpbiBhbnkgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25hbCBwYXJhbWV0ZXJzOlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5yZXBsYWNlbWVudD10cnVlXSBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmFuZG9tXHJcbiAgICAgKiAgICAgbnVtYmVycyBzaG91bGQgYmUgcGlja2VkIHdpdGggcmVwbGFjZW1lbnQuIElmIHRydWUsIHRoZSByZXN1bHRpbmcgbnVtYmVyc1xyXG4gICAgICogICAgIG1heSBjb250YWluIGR1cGxpY2F0ZSB2YWx1ZXMsIG90aGVyd2lzZSB0aGUgbnVtYmVycyB3aWxsIGFsbCBiZSB1bmlxdWVcclxuICAgICAqICAgICAoZGVmYXVsdCB0cnVlKS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5iYXNlPTEwXSBUaGUgYmFzZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBkaXNwbGF5IHRoZVxyXG4gICAgICogICAgIG51bWJlcnMuIFZhbHVlcyBhbGxvd2VkIGFyZSAyLCA4LCAxMCBhbmQgMTYgKGRlZmF1bHQgMTApLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmNhY2hlU2l6ZT0yMF0gVGhlIG51bWJlciBvZiByZXN1bHQtc2V0cyBmb3IgdGhlXHJcbiAgICAgKiAgICAgY2FjaGUgdG8gdHJ5IHRvIG1haW50YWluIGF0IGFueSBnaXZlbiB0aW1lIChkZWZhdWx0IDIwLCBtaW5pbXVtIDIpLlxyXG4gICAgICogQHJldHVybnMge1JhbmRvbU9yZ0NhY2hlfSBBbiBpbnN0YW5jZSBvZiB0aGUgUmFuZG9tT3JnQ2FjaGUgY2xhc3Mgd2hpY2hcclxuICAgICAqICAgICBjYW4gYmUgcG9sbGVkIGZvciBhcnJheXMgb2YgdHJ1ZSByYW5kb20gaW50ZWdlcnMuXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZUludGVnZXJDYWNoZShuLCBtaW4sIG1heCwgb3B0aW9ucyA9IHt9KSB7XHJcbiAgICAgICAgbGV0IGNhY2hlU2l6ZSA9IG9wdGlvbnMuY2FjaGVTaXplIHx8IDIwO1xyXG4gICAgICAgIGlmIChjYWNoZVNpemUgPCAyKSB7XHJcbiAgICAgICAgICAgIGNhY2hlU2l6ZSA9IDI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgcmVxdWVzdCA9IHRoaXMuI2ludGVnZXJSZXF1ZXN0KG4sIG1pbiwgbWF4LCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgLy8gbWF4IHNpbmdsZSByZXF1ZXN0IHNpemUsIGluIGJpdHMsIGZvciBhZGp1c3RpbmcgYnVsayByZXF1ZXN0cyBsYXRlclxyXG4gICAgICAgIGxldCBtYXhSZXF1ZXN0U2l6ZSA9IE1hdGguY2VpbChNYXRoLmxvZyhtYXggLSBtaW4gKyAxKSAvIE1hdGgubG9nKDIpICogbik7XHJcbiAgICAgICAgbGV0IGJ1bGtOID0gMDtcclxuICAgICAgICBcclxuICAgICAgICAvLyBJZiBwb3NzaWJsZSwgbWFrZSByZXF1ZXN0cyBtb3JlIGVmZmljaWVudCBieSBidWxrLW9yZGVyaW5nIGZyb20gdGhlXHJcbiAgICAgICAgLy8gc2VydmVyLiBJbml0aWFsbHkgc2V0IGF0IGNhY2hlU2l6ZS8yLCBidXQgY2FjaGUgd2lsbCBhdXRvLXNocmluayBidWxrXHJcbiAgICAgICAgLy8gcmVxdWVzdCBzaXplIGlmIHJlcXVlc3RzIGNhbid0IGJlIGZ1bGZpbGxlZC5cclxuICAgICAgICBpZiAoISgncmVwbGFjZW1lbnQnIGluIG9wdGlvbnMpIHx8IG9wdGlvbnMucmVwbGFjZW1lbnQgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgYnVsa04gPSBjYWNoZVNpemUgLyAyO1xyXG4gICAgICAgICAgICByZXF1ZXN0LnBhcmFtcy5uID0gbiAqIGJ1bGtOO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBSYW5kb21PcmdDYWNoZSh0aGlzLiNzZW5kUmVxdWVzdC5iaW5kKHRoaXMpLCByZXF1ZXN0LCBjYWNoZVNpemUsXHJcbiAgICAgICAgICAgIGJ1bGtOLCBuLCBtYXhSZXF1ZXN0U2l6ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGEgUmFuZG9tT3JnQ2FjaGUgdG8gb2J0YWluIHJhbmRvbSBpbnRlZ2VyIHNlcXVlbmNlcy5cclxuICAgICAqIFxyXG4gICAgICogVGhlIFJhbmRvbU9yZ0NhY2hlIGNhbiBiZSBwb2xsZWQgZm9yIG5ldyByZXN1bHRzIGNvbmZvcm1pbmcgdG8gdGhlIG91dHB1dFxyXG4gICAgICogZm9ybWF0IG9mIHRoZSBpbnB1dCByZXF1ZXN0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gSG93IG1hbnkgcmFuZG9tIGludGVnZXIgc2VxdWVuY2VzIHlvdSBuZWVkLiBNdXN0IGJlIHdpdGhpblxyXG4gICAgICogICAgIHRoZSBbMSwxZTRdIHJhbmdlLlxyXG4gICAgICogQHBhcmFtIHsobnVtYmVyfG51bWJlcltdKX0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgZWFjaCBhcnJheSBvZiByYW5kb21cclxuICAgICAqICAgICBpbnRlZ2VycyByZXF1ZXN0ZWQuIEZvciB1bmlmb3JtIHNlcXVlbmNlcywgbGVuZ3RoIG11c3QgYmUgYW4gaW50ZWdlclxyXG4gICAgICogICAgIGluIHRoZSBbMSwgMWU0XSByYW5nZS4gRm9yIG11bHRpZm9ybSBzZXF1ZW5jZXMsIGxlbmd0aCBjYW4gYmUgYW4gYXJyYXlcclxuICAgICAqICAgICB3aXRoIG4gaW50ZWdlcnMsIGVhY2ggc3BlY2lmeWluZyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSBpZGVudGlmaWVkXHJcbiAgICAgKiAgICAgYnkgaXRzIGluZGV4LiBJbiB0aGlzIGNhc2UsIGVhY2ggdmFsdWUgaW4gbGVuZ3RoIG11c3QgYmUgd2l0aGluIHRoZVxyXG4gICAgICogICAgIFsxLCAxZTRdIHJhbmdlIGFuZCB0aGUgdG90YWwgc3VtIG9mIGFsbCB0aGUgbGVuZ3RocyBtdXN0IGJlIGluIHRoZVxyXG4gICAgICogICAgIFsxLCAxZTRdIHJhbmdlLlxyXG4gICAgICogQHBhcmFtIHsobnVtYmVyfG51bWJlcltdKX0gbWluIFRoZSBsb3dlciBib3VuZGFyeSBmb3IgdGhlIHJhbmdlIGZyb20gd2hpY2hcclxuICAgICAqICAgICB0aGUgcmFuZG9tIG51bWJlcnMgd2lsbCBiZSBwaWNrZWQuIEZvciB1bmlmb3JtIHNlcXVlbmNlcywgbWluIG11c3QgYmVcclxuICAgICAqICAgICBhbiBpbnRlZ2VyIGluIHRoZSBbLTFlOSwgMWU5XSByYW5nZS4gRm9yIG11bHRpZm9ybSBzZXF1ZW5jZXMsIG1pbiBjYW5cclxuICAgICAqICAgICBiZSBhbiBhcnJheSB3aXRoIG4gaW50ZWdlcnMsIGVhY2ggc3BlY2lmeWluZyB0aGUgbG93ZXIgYm91bmRhcnkgb2YgdGhlXHJcbiAgICAgKiAgICAgc2VxdWVuY2UgaWRlbnRpZmllZCBieSBpdHMgaW5kZXguIEluIHRoaXMgY2FzZSwgZWFjaCB2YWx1ZSBpbiBtaW4gbXVzdFxyXG4gICAgICogICAgIGJlIHdpdGhpbiB0aGUgWy0xZTksIDFlOV0gcmFuZ2UuXHJcbiAgICAgKiBAcGFyYW0geyhudW1iZXJ8bnVtYmVyW10pfSBtYXggVGhlIHVwcGVyIGJvdW5kYXJ5IGZvciB0aGUgcmFuZ2UgZnJvbSB3aGljaFxyXG4gICAgICogICAgIHRoZSByYW5kb20gbnVtYmVycyB3aWxsIGJlIHBpY2tlZC4gRm9yIHVuaWZvcm0gc2VxdWVuY2VzLCBtYXggbXVzdCBiZVxyXG4gICAgICogICAgIGFuIGludGVnZXIgaW4gdGhlIFstMWU5LCAxZTldIHJhbmdlLiBGb3IgbXVsdGlmb3JtIHNlcXVlbmNlcywgbWF4IGNhblxyXG4gICAgICogICAgIGJlIGFuIGFycmF5IHdpdGggbiBpbnRlZ2VycywgZWFjaCBzcGVjaWZ5aW5nIHRoZSB1cHBlciBib3VuZGFyeSBvZiB0aGVcclxuICAgICAqICAgICBzZXF1ZW5jZSBpZGVudGlmaWVkIGJ5IGl0cyBpbmRleC4gSW4gdGhpcyBjYXNlLCBlYWNoIHZhbHVlIGluIG1heCBtdXN0XHJcbiAgICAgKiAgICAgYmUgd2l0aGluIHRoZSBbLTFlOSwgMWU5XSByYW5nZS5cclxuICAgICAqIEBwYXJhbSB7e3JlcGxhY2VtZW50PzogYm9vbGVhbnxib29sZWFuW10sIGJhc2U/OiBudW1iZXJ8bnVtYmVyW10sXHJcbiAgICAgKiAgICAgY2FjaGVTaXplPzogbnVtYmVyfX0gb3B0aW9ucyBBbiBvYmplY3Qgd2hpY2ggbWF5IGNvbnRhaW4gYW55IG9mIHRoZVxyXG4gICAgICogICAgIGZvbGxvd2luZyBvcHRpb25hbCBwYXJhbWV0ZXJzOlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufGJvb2xlYW5bXX0gcmVwbGFjZW1lbnQgU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJhbmRvbSBudW1iZXJzXHJcbiAgICAgKiAgICAgc2hvdWxkIGJlIHBpY2tlZCB3aXRoIHJlcGxhY2VtZW50LiBJZiB0cnVlLCB0aGUgcmVzdWx0aW5nIG51bWJlcnMgbWF5XHJcbiAgICAgKiAgICAgY29udGFpbiBkdXBsaWNhdGUgdmFsdWVzLCBvdGhlcndpc2UgdGhlIG51bWJlcnMgd2lsbCBhbGwgYmUgdW5pcXVlLiBGb3JcclxuICAgICAqICAgICBtdWx0aWZvcm0gc2VxdWVuY2VzLCByZXBsYWNlbWVudCBjYW4gYmUgYW4gYXJyYXkgd2l0aCBuIGJvb2xlYW4gdmFsdWVzLFxyXG4gICAgICogICAgIGVhY2ggc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBzZXF1ZW5jZSBpZGVudGlmaWVkIGJ5IGl0cyBpbmRleCB3aWxsIGJlXHJcbiAgICAgKiAgICAgY3JlYXRlZCB3aXRoICh0cnVlKSBvciB3aXRob3V0IChmYWxzZSkgcmVwbGFjZW1lbnQgKGRlZmF1bHQgdHJ1ZSkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcnxudW1iZXJbXX0gYmFzZSBUaGUgYmFzZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBkaXNwbGF5IHRoZSBudW1iZXJzLlxyXG4gICAgICogICAgIFZhbHVlcyBhbGxvd2VkIGFyZSAyLCA4LCAxMCBhbmQgMTYuIEZvciBtdWx0aWZvcm0gc2VxdWVuY2VzLCBiYXNlIGNhblxyXG4gICAgICogICAgIGJlIGFuIGFycmF5IHdpdGggbiBpbnRlZ2VyIHZhbHVlcyB0YWtlbiBmcm9tIHRoZSBzYW1lIHNldCwgZWFjaFxyXG4gICAgICogICAgIHNwZWNpZnlpbmcgdGhlIGJhc2UgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZGlzcGxheSB0aGUgc2VxdWVuY2UgaWRlbnRpZmllZFxyXG4gICAgICogICAgIGJ5IGl0cyBpbmRleCAoZGVmYXVsdCAxMCkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY2FjaGVTaXplIFRoZSBudW1iZXIgb2YgcmVzdWx0LXNldHMgZm9yIHRoZSBjYWNoZSB0byB0cnlcclxuICAgICAqICAgICB0byBtYWludGFpbiBhdCBhbnkgZ2l2ZW4gdGltZSAoZGVmYXVsdCAyMCwgbWluaW11bSAyKS5cclxuICAgICAqIEByZXR1cm5zIHtSYW5kb21PcmdDYWNoZX0gQW4gaW5zdGFuY2Ugb2YgdGhlIFJhbmRvbU9yZ0NhY2hlIGNsYXNzIHdoaWNoXHJcbiAgICAgKiAgICAgY2FuIGJlIHBvbGxlZCBmb3IgYXJyYXlzIG9mIHRydWUgcmFuZG9tIGludGVnZXIgc2VxdWVuY2VzLlxyXG4gICAgICovXHJcbiAgICBjcmVhdGVJbnRlZ2VyU2VxdWVuY2VDYWNoZShuLCBsZW5ndGgsIG1pbiwgbWF4LCBvcHRpb25zID0ge30pIHtcclxuICAgICAgICBsZXQgY2FjaGVTaXplID0gb3B0aW9ucy5jYWNoZVNpemUgfHwgMjA7XHJcbiAgICAgICAgaWYgKGNhY2hlU2l6ZSA8IDIpIHtcclxuICAgICAgICAgICAgY2FjaGVTaXplID0gMjtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IG1heFJlcXVlc3RTaXplID0gTWF0aC5jZWlsKE1hdGgubG9nKHRoaXMuI21heFZhbHVlKG1heCkgLSB0aGlzLiNtaW5WYWx1ZShtaW4pLCArIDEpXHJcbiAgICAgICAgICAgIC8gTWF0aC5sb2coMikgKiBuICogdGhpcy4jbWF4VmFsdWUobGVuZ3RoKSk7XHJcblxyXG4gICAgICAgIC8vIElmIHBvc3NpYmxlLCBtYWtlIHJlcXVlc3RzIG1vcmUgZWZmaWNpZW50IGJ5IGJ1bGstb3JkZXJpbmcgZnJvbSB0aGVcclxuICAgICAgICAvLyBzZXJ2ZXIuIEluaXRpYWxseSBzZXQgYXQgY2FjaGVTaXplLzIsIGJ1dCBjYWNoZSB3aWxsIGF1dG8tc2hyaW5rIGJ1bGtcclxuICAgICAgICAvLyByZXF1ZXN0IHNpemUgaWYgcmVxdWVzdHMgY2FuJ3QgYmUgZnVsZmlsbGVkLlxyXG4gICAgICAgIGxldCBidWxrTiA9IDA7XHJcblxyXG4gICAgICAgIC8vIGlmIHJlcGxhY2VtZW50IGlzIGFuIGFycmF5LCBjaGVjayBpZiBhbGwgdmFsdWVzIGFyZSBzZXQgdG8gdHJ1ZVxyXG4gICAgICAgIGxldCByZXBsO1xyXG4gICAgICAgIGlmIChvcHRpb25zLnJlcGxhY2VtZW50ICYmIEFycmF5LmlzQXJyYXkob3B0aW9ucy5yZXBsYWNlbWVudCkpIHtcclxuICAgICAgICAgICAgcmVwbCA9IG9wdGlvbnMucmVwbGFjZW1lbnQuZXZlcnkoeCA9PiB4ID09PSB0cnVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXBsID0gb3B0aW9ucy5yZXBsYWNlbWVudCB8fCB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaWYgYnVsayByZXF1ZXN0cyBjYW4gYmUgdXNlZCwgbWFrZSBhZGp1c3RtZW50cyB0byBhcnJheS10eXBlIHBhcmFtZXRlcnNcclxuICAgICAgICBpZiAocmVwbCkge1xyXG4gICAgICAgICAgICBidWxrTiA9IGNhY2hlU2l6ZSAvIDI7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShsZW5ndGgpKSB7XHJcbiAgICAgICAgICAgICAgICBsZW5ndGggPSB0aGlzLiNhZGp1c3QobGVuZ3RoLCBidWxrTik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG1pbikpIHtcclxuICAgICAgICAgICAgICAgIG1pbiA9IHRoaXMuI2FkanVzdChtaW4sIGJ1bGtOKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWF4KSkge1xyXG4gICAgICAgICAgICAgICAgbWF4ID0gdGhpcy4jYWRqdXN0KG1heCwgYnVsa04pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yZXBsYWNlbWVudCAmJiBBcnJheS5pc0FycmF5KG9wdGlvbnMucmVwbGFjZW1lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICBvcHRpb25zLnJlcGxhY2VtZW50ID0gdGhpcy4jYWRqdXN0KG9wdGlvbnMucmVwbGFjZW1lbnQsIGJ1bGtOKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmFzZSAmJiBBcnJheS5pc0FycmF5KG9wdGlvbnMuYmFzZSkpIHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMuYmFzZSA9IHRoaXMuI2FkanVzdChvcHRpb25zLmJhc2UsIGJ1bGtOKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHJlcXVlc3QgPSB0aGlzLiNpbnRlZ2VyU2VxdWVuY2VSZXF1ZXN0KG4sIGxlbmd0aCwgbWluLCBtYXgsXHJcbiAgICAgICAgICAgIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICBpZiAocmVwbCkge1xyXG4gICAgICAgICAgICByZXF1ZXN0LnBhcmFtcy5uID0gYnVsa04gKiBuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBSYW5kb21PcmdDYWNoZSh0aGlzLiNzZW5kUmVxdWVzdC5iaW5kKHRoaXMpLCByZXF1ZXN0LCBjYWNoZVNpemUsIGJ1bGtOLCBuLCBtYXhSZXF1ZXN0U2l6ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGEgUmFuZG9tT3JnQ2FjaGUgdG8gb2J0YWluIHJhbmRvbSBkZWNpbWFsIGZyYWN0aW9ucy5cclxuICAgICAqIFxyXG4gICAgICogVGhlIFJhbmRvbU9yZ0NhY2hlIGNhbiBiZSBwb2xsZWQgZm9yIG5ldyByZXN1bHRzIGNvbmZvcm1pbmcgdG8gdGhlIG91dHB1dFxyXG4gICAgICogZm9ybWF0IG9mIHRoZSBpbnB1dCByZXF1ZXN0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gSG93IG1hbnkgcmFuZG9tIGRlY2ltYWwgZnJhY3Rpb25zIHlvdSBuZWVkLiBNdXN0IGJlXHJcbiAgICAgKiAgICAgd2l0aGluIHRoZSBbMSwxZTRdIHJhbmdlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGRlY2ltYWxQbGFjZXMgVGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0byB1c2UuIE11c3RcclxuICAgICAqICAgICBiZSB3aXRoaW4gdGhlIFsxLDIwXSByYW5nZS5cclxuICAgICAqIEBwYXJhbSB7e3JlcGxhY2VtZW50PzogYm9vbGVhbiwgY2FjaGVTaXplPzogbnVtYmVyfX0gb3B0aW9ucyBBbiBvYmplY3Qgd2hpY2hcclxuICAgICAqICAgICBtYXkgY29udGFpbiBhbnkgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25hbCBwYXJhbWV0ZXJzOlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5yZXBsYWNlbWVudD10cnVlXSBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmFuZG9tXHJcbiAgICAgKiAgICAgbnVtYmVycyBzaG91bGQgYmUgcGlja2VkIHdpdGggcmVwbGFjZW1lbnQuIElmIHRydWUsIHRoZSByZXN1bHRpbmcgbnVtYmVyc1xyXG4gICAgICogICAgIG1heSBjb250YWluIGR1cGxpY2F0ZSB2YWx1ZXMsIG90aGVyd2lzZSB0aGUgbnVtYmVycyB3aWxsIGFsbCBiZSB1bmlxdWVcclxuICAgICAqICAgICAoZGVmYXVsdCB0cnVlKS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5jYWNoZVNpemU9MjBdIFRoZSBudW1iZXIgb2YgcmVzdWx0LXNldHMgZm9yIHRoZSBjYWNoZVxyXG4gICAgICogICAgIHRvIHRyeSB0byBtYWludGFpbiBhdCBhbnkgZ2l2ZW4gdGltZSAoZGVmYXVsdCAyMCwgbWluaW11bSAyKS5cclxuICAgICAqIEByZXR1cm5zIHtSYW5kb21PcmdDYWNoZX0gQW4gaW5zdGFuY2Ugb2YgdGhlIFJhbmRvbU9yZ0NhY2hlIGNsYXNzIHdoaWNoXHJcbiAgICAgKiAgICAgY2FuIGJlIHBvbGxlZCBmb3IgYXJyYXlzIG9mIHRydWUgcmFuZG9tIGRlY2ltYWwgZnJhY3Rpb25zLlxyXG4gICAgICovXHJcbiAgICBjcmVhdGVEZWNpbWFsRnJhY3Rpb25DYWNoZShuLCBkZWNpbWFsUGxhY2VzLCBvcHRpb25zID0ge30pIHtcclxuICAgICAgICBsZXQgY2FjaGVTaXplID0gb3B0aW9ucy5jYWNoZVNpemUgfHwgMjA7XHJcbiAgICAgICAgaWYgKGNhY2hlU2l6ZSA8IDIpIHtcclxuICAgICAgICAgICAgY2FjaGVTaXplID0gMjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCByZXF1ZXN0ID0gdGhpcy4jZGVjaW1hbEZyYWN0aW9uUmVxdWVzdChuLCBkZWNpbWFsUGxhY2VzLCBvcHRpb25zKTtcclxuXHJcbiAgICAgICAgbGV0IGJ1bGtOID0gMDtcclxuICAgICAgICBcclxuICAgICAgICAvLyBJZiBwb3NzaWJsZSwgbWFrZSByZXF1ZXN0cyBtb3JlIGVmZmljaWVudCBieSBidWxrLW9yZGVyaW5nIGZyb20gdGhlXHJcbiAgICAgICAgLy8gc2VydmVyLiBJbml0aWFsbHkgc2V0IGF0IGNhY2hlU2l6ZS8yLCBidXQgY2FjaGUgd2lsbCBhdXRvLXNocmluayBidWxrXHJcbiAgICAgICAgLy8gcmVxdWVzdCBzaXplIGlmIHJlcXVlc3RzIGNhbid0IGJlIGZ1bGZpbGxlZC5cclxuICAgICAgICBpZiAoISgncmVwbGFjZW1lbnQnIGluIG9wdGlvbnMpIHx8IG9wdGlvbnMucmVwbGFjZW1lbnQgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgYnVsa04gPSBjYWNoZVNpemUgLyAyO1xyXG4gICAgICAgICAgICByZXF1ZXN0LnBhcmFtcy5uID0gbiAqIGJ1bGtOO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gbWF4IHNpbmdsZSByZXF1ZXN0IHNpemUsIGluIGJpdHMsIGZvciBhZGp1c3RpbmcgYnVsayByZXF1ZXN0cyBsYXRlclxyXG4gICAgICAgIGxldCBtYXhSZXF1ZXN0U2l6ZSA9IE1hdGguY2VpbChNYXRoLmxvZygxMCkgLyBNYXRoLmxvZygyKSAqIGRlY2ltYWxQbGFjZXMgKiBuKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBSYW5kb21PcmdDYWNoZSh0aGlzLiNzZW5kUmVxdWVzdC5iaW5kKHRoaXMpLCByZXF1ZXN0LCBjYWNoZVNpemUsIGJ1bGtOLFxyXG4gICAgICAgICAgICBuLCBtYXhSZXF1ZXN0U2l6ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGEgUmFuZG9tT3JnQ2FjaGUgdG8gb2J0YWluIHJhbmRvbSBudW1iZXJzIGZyb20gYSBHYXVzc2lhbiBkaXN0cmlidXRpb24uXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBSYW5kb21PcmdDYWNoZSBjYW4gYmUgcG9sbGVkIGZvciBuZXcgcmVzdWx0cyBjb25mb3JtaW5nIHRvIHRoZSBvdXRwdXRcclxuICAgICAqIGZvcm1hdCBvZiB0aGUgaW5wdXQgcmVxdWVzdC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIEhvdyBtYW55IHJhbmRvbSBudW1iZXJzIHlvdSBuZWVkLiBNdXN0IGJlIHdpdGhpbiB0aGVcclxuICAgICAqICAgICBbMSwxZTRdIHJhbmdlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1lYW4gVGhlIGRpc3RyaWJ1dGlvbidzIG1lYW4uIE11c3QgYmUgd2l0aGluIHRoZVxyXG4gICAgICogICAgIFstMWU2LDFlNl0gcmFuZ2UuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhbmRhcmREZXZpYXRpb24gVGhlIGRpc3RyaWJ1dGlvbidzIHN0YW5kYXJkIGRldmlhdGlvbi5cclxuICAgICAqICAgICBNdXN0IGJlIHdpdGhpbiB0aGUgWy0xZTYsMWU2XSByYW5nZS5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaWduaWZpY2FudERpZ2l0cyBUaGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGRpZ2l0cyB0byB1c2UuXHJcbiAgICAgKiAgICAgTXVzdCBiZSB3aXRoaW4gdGhlIFsyLDIwXSByYW5nZS5cclxuICAgICAqIEBwYXJhbSB7e2NhY2hlU2l6ZT86IG51bWJlcn19IG9wdGlvbnMgQW4gb2JqZWN0IHdoaWNoIG1heSBjb250YWluIHRoZSBmb2xsb3dpbmdcclxuICAgICAqICAgICBvcHRpb25hbCBwYXJhbWV0ZXI6XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuY2FjaGVTaXplPTIwXSBUaGUgbnVtYmVyIG9mIHJlc3VsdC1zZXRzIGZvciB0aGUgY2FjaGVcclxuICAgICAqICAgICB0byB0cnkgdG8gbWFpbnRhaW4gYXQgYW55IGdpdmVuIHRpbWUgKGRlZmF1bHQgMjAsIG1pbmltdW0gMikuXHJcbiAgICAgKiBAcmV0dXJucyB7UmFuZG9tT3JnQ2FjaGV9IEFuIGluc3RhbmNlIG9mIHRoZSBSYW5kb21PcmdDYWNoZSBjbGFzcyB3aGljaFxyXG4gICAgICogICAgIGNhbiBiZSBwb2xsZWQgZm9yIGFycmF5cyBvZiB0cnVlIHJhbmRvbSBudW1iZXJzIGZyb20gYSBHYXVzc2lhblxyXG4gICAgICogICAgIGRpc3RyaWJ1dGlvbi5cclxuICAgICAqL1xyXG4gICAgY3JlYXRlR2F1c3NpYW5DYWNoZShuLCBtZWFuLCBzdGFuZGFyZERldmlhdGlvbiwgc2lnbmlmaWNhbnREaWdpdHMsIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgICAgIGxldCBjYWNoZVNpemUgPSBvcHRpb25zLmNhY2hlU2l6ZSB8fCAyMDtcclxuICAgICAgICBpZiAoY2FjaGVTaXplIDwgMikge1xyXG4gICAgICAgICAgICBjYWNoZVNpemUgPSAyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gbWF4IHNpbmdsZSByZXF1ZXN0IHNpemUsIGluIGJpdHMsIGZvciBhZGp1c3RpbmcgYnVsayByZXF1ZXN0cyBsYXRlclxyXG4gICAgICAgIGxldCBtYXhSZXF1ZXN0U2l6ZSA9IE1hdGguY2VpbChNYXRoLmxvZyhNYXRoLnBvdygxMCwgc2lnbmlmaWNhbnREaWdpdHMpKSAvIE1hdGgubG9nKDIpICogbik7XHJcblxyXG4gICAgICAgIC8vIG1ha2UgcmVxdWVzdHMgbW9yZSBlZmZpY2llbnQgYnkgYnVsay1vcmRlcmluZyBmcm9tIHRoZSBzZXJ2ZXIuXHJcbiAgICAgICAgLy8gSW5pdGlhbGx5IHNldCBhdCBjYWNoZVNpemUvMiwgYnV0IGNhY2hlIHdpbGwgYXV0by1zaHJpbmsgYnVsayByZXF1ZXN0XHJcbiAgICAgICAgLy8gc2l6ZSBpZiByZXF1ZXN0cyBjYW4ndCBiZSBmdWxmaWxsZWQuXHJcbiAgICAgICAgbGV0IGJ1bGtOID0gY2FjaGVTaXplIC8gMjtcclxuICAgICAgICBsZXQgcmVxdWVzdCA9IHRoaXMuI2dhdXNzaWFuUmVxdWVzdChuICogYnVsa04sIG1lYW4sIHN0YW5kYXJkRGV2aWF0aW9uLFxyXG4gICAgICAgICAgICBzaWduaWZpY2FudERpZ2l0cyk7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgUmFuZG9tT3JnQ2FjaGUodGhpcy4jc2VuZFJlcXVlc3QuYmluZCh0aGlzKSwgcmVxdWVzdCwgY2FjaGVTaXplLCBidWxrTixcclxuICAgICAgICAgICAgbiwgbWF4UmVxdWVzdFNpemUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhIFJhbmRvbU9yZ0NhY2hlIHRvIG9idGFpbiByYW5kb20gc3RyaW5ncy5cclxuICAgICAqIFxyXG4gICAgICogVGhlIFJhbmRvbU9yZ0NhY2hlIGNhbiBiZSBwb2xsZWQgZm9yIG5ldyByZXN1bHRzIGNvbmZvcm1pbmcgdG8gdGhlIG91dHB1dFxyXG4gICAgICogZm9ybWF0IG9mIHRoZSBpbnB1dCByZXF1ZXN0LlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gSG93IG1hbnkgcmFuZG9tIHN0cmluZ3MgeW91IG5lZWQuIE11c3QgYmUgd2l0aGluIHRoZVxyXG4gICAgICogICAgIFsxLDFlNF0gcmFuZ2UuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgZWFjaCBzdHJpbmcuIE11c3QgYmUgd2l0aGluIHRoZSBbMSwyMF1cclxuICAgICAqICAgICByYW5nZS4gQWxsIHN0cmluZ3Mgd2lsbCBiZSBvZiB0aGUgc2FtZSBsZW5ndGguXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhcmFjdGVycyBBIHN0cmluZyB0aGF0IGNvbnRhaW5zIHRoZSBzZXQgb2YgY2hhcmFjdGVyc1xyXG4gICAgICogICAgIHRoYXQgYXJlIGFsbG93ZWQgdG8gb2NjdXIgaW4gdGhlIHJhbmRvbSBzdHJpbmdzLiBUaGUgbWF4aW11bSBudW1iZXJcclxuICAgICAqICAgICBvZiBjaGFyYWN0ZXJzIGlzIDgwLlxyXG4gICAgICogQHBhcmFtIHt7cmVwbGFjZW1lbnQ/OiBib29sZWFuLCBjYWNoZVNpemU/OiBudW1iZXJ9fSBvcHRpb25zIEFuIG9iamVjdCB3aGljaFxyXG4gICAgICogICAgIG1heSBjb250YWluIGFueSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbmFsIHBhcmFtZXRlcnM6XHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnJlcGxhY2VtZW50PXRydWVdIFNwZWNpZmllcyB3aGV0aGVyIHRoZSByYW5kb21cclxuICAgICAqICAgICBzdHJpbmdzIHNob3VsZCBiZSBwaWNrZWQgd2l0aCByZXBsYWNlbWVudC4gSWYgdHJ1ZSwgdGhlIHJlc3VsdGluZyBsaXN0XHJcbiAgICAgKiAgICAgb2Ygc3RyaW5ncyBtYXkgY29udGFpbiBkdXBsaWNhdGVzLCBvdGhlcndpc2UgdGhlIHN0cmluZ3Mgd2lsbCBhbGwgYmVcclxuICAgICAqICAgICB1bmlxdWUgKGRlZmF1bHQgdHJ1ZSkuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuY2FjaGVTaXplPTIwXSBUaGUgbnVtYmVyIG9mIHJlc3VsdC1zZXRzIGZvciB0aGVcclxuICAgICAqICAgICBjYWNoZSB0byB0cnkgdG8gbWFpbnRhaW4gYXQgYW55IGdpdmVuIHRpbWUgKGRlZmF1bHQgMjAsIG1pbmltdW0gMikuXHJcbiAgICAgKiBAcmV0dXJucyB7UmFuZG9tT3JnQ2FjaGV9IEFuIGluc3RhbmNlIG9mIHRoZSBSYW5kb21PcmdDYWNoZSBjbGFzcyB3aGljaFxyXG4gICAgICogICAgIGNhbiBiZSBwb2xsZWQgZm9yIGFycmF5cyBvZiB0cnVlIHJhbmRvbSBzdHJpbmdzLlxyXG4gICAgICovXHJcbiAgICBjcmVhdGVTdHJpbmdDYWNoZShuLCBsZW5ndGgsIGNoYXJhY3RlcnMsIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgICAgIGxldCBjYWNoZVNpemUgPSBvcHRpb25zLmNhY2hlU2l6ZSB8fCAyMDtcclxuICAgICAgICBpZiAoY2FjaGVTaXplIDwgMikge1xyXG4gICAgICAgICAgICBjYWNoZVNpemUgPSAyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHJlcXVlc3QgPSB0aGlzLiNzdHJpbmdSZXF1ZXN0KG4sIGxlbmd0aCwgY2hhcmFjdGVycywgb3B0aW9ucyk7XHJcblxyXG4gICAgICAgIC8vIG1heCBzaW5nbGUgcmVxdWVzdCBzaXplLCBpbiBiaXRzLCBmb3IgYWRqdXN0aW5nIGJ1bGsgcmVxdWVzdHMgbGF0ZXJcclxuICAgICAgICBsZXQgbWF4UmVxdWVzdFNpemUgPSBNYXRoLmNlaWwoTWF0aC5sb2coY2hhcmFjdGVycy5sZW5ndGgpIC8gTWF0aC5sb2coMikgKiBsZW5ndGggKiBuKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBJZiBwb3NzaWJsZSwgbWFrZSByZXF1ZXN0cyBtb3JlIGVmZmljaWVudCBieSBidWxrLW9yZGVyaW5nIGZyb20gdGhlXHJcbiAgICAgICAgLy8gc2VydmVyLiBJbml0aWFsbHkgc2V0IGF0IGNhY2hlX3NpemUvMiwgYnV0IGNhY2hlIHdpbGwgYXV0by1zaHJpbmsgYnVsa1xyXG4gICAgICAgIC8vIHJlcXVlc3Qgc2l6ZSBpZiByZXF1ZXN0cyBjYW4ndCBiZSBmdWxmaWxsZWQuXHJcbiAgICAgICAgbGV0IGJ1bGtOID0gMDtcclxuICAgICAgICBpZiAoISgncmVwbGFjZW1lbnQnIGluIG9wdGlvbnMpIHx8IG9wdGlvbnMucmVwbGFjZW1lbnQgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgYnVsa04gPSBjYWNoZVNpemUgLyAyO1xyXG4gICAgICAgICAgICByZXF1ZXN0LnBhcmFtcy5uID0gbiAqIGJ1bGtOO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gbmV3IFJhbmRvbU9yZ0NhY2hlKHRoaXMuI3NlbmRSZXF1ZXN0LmJpbmQodGhpcyksIHJlcXVlc3QsIGNhY2hlU2l6ZSwgYnVsa04sXHJcbiAgICAgICAgICAgIG4sIG1heFJlcXVlc3RTaXplKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYSBSYW5kb21PcmdDYWNoZSB0byBvYnRhaW4gVVVJRHMuXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBSYW5kb21PcmdDYWNoZSBjYW4gYmUgcG9sbGVkIGZvciBuZXcgcmVzdWx0cyBjb25mb3JtaW5nIHRvIHRoZSBvdXRwdXRcclxuICAgICAqIGZvcm1hdCBvZiB0aGUgaW5wdXQgcmVxdWVzdC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIEhvdyBtYW55IHJhbmRvbSBVVUlEcyB5b3UgbmVlZC4gTXVzdCBiZSB3aXRoaW4gdGhlXHJcbiAgICAgKiAgICAgWzEsMWUzXSByYW5nZS5cclxuICAgICAqIEBwYXJhbSB7e2NhY2hlU2l6ZT86IG51bWJlcn19IG9wdGlvbnMgQW4gb2JqZWN0IHdoaWNoIG1heSBjb250YWluIHRoZSBmb2xsb3dpbmdcclxuICAgICAqICAgICBvcHRpb25hbCBwYXJhbWV0ZXI6XHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuY2FjaGVTaXplPTEwXSBUaGUgbnVtYmVyIG9mIHJlc3VsdC1zZXRzIGZvciB0aGUgY2FjaGVcclxuICAgICAqICAgICB0byB0cnkgdG8gbWFpbnRhaW4gYXQgYW55IGdpdmVuIHRpbWUgKGRlZmF1bHQgMTAsIG1pbmltdW0gMikuXHJcbiAgICAgKiBAcmV0dXJucyB7UmFuZG9tT3JnQ2FjaGV9IEFuIGluc3RhbmNlIG9mIHRoZSBSYW5kb21PcmdDYWNoZSBjbGFzcyB3aGljaFxyXG4gICAgICogICAgIGNhbiBiZSBwb2xsZWQgZm9yIGFycmF5cyBvZiB0cnVlIHJhbmRvbSBVVUlEcy5cclxuICAgICAqL1xyXG4gICAgY3JlYXRlVVVJRENhY2hlKG4sIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgICAgIGxldCBjYWNoZVNpemUgPSBvcHRpb25zLmNhY2hlU2l6ZSB8fCAxMDtcclxuICAgICAgICBpZiAoY2FjaGVTaXplIDwgMikge1xyXG4gICAgICAgICAgICBjYWNoZVNpemUgPSAyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gbWF4IHNpbmdsZSByZXF1ZXN0IHNpemUsIGluIGJpdHMsIGZvciBhZGp1c3RpbmcgYnVsayByZXF1ZXN0cyBsYXRlclxyXG4gICAgICAgIGxldCBtYXhSZXF1ZXN0U2l6ZSA9IG4gKiBSYW5kb21PcmdDbGllbnQuVVVJRF9TSVpFO1xyXG5cclxuICAgICAgICAvLyBtYWtlIHJlcXVlc3RzIG1vcmUgZWZmaWNpZW50IGJ5IGJ1bGstb3JkZXJpbmcgZnJvbSB0aGUgc2VydmVyLiBJbml0aWFsbHlcclxuICAgICAgICAvLyBzZXQgYXQgY2FjaGVTaXplLzIsIGJ1dCBjYWNoZSB3aWxsIGF1dG8tc2hyaW5rIGJ1bGsgcmVxdWVzdCBzaXplIGlmXHJcbiAgICAgICAgLy8gcmVxdWVzdHMgY2FuJ3QgYmUgZnVsZmlsbGVkLlxyXG4gICAgICAgIGxldCBidWxrTiA9IGNhY2hlU2l6ZSAvIDI7XHJcbiAgICAgICAgbGV0IHJlcXVlc3QgPSB0aGlzLiNVVUlEUmVxdWVzdChuICogYnVsa04pO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3IFJhbmRvbU9yZ0NhY2hlKHRoaXMuI3NlbmRSZXF1ZXN0LmJpbmQodGhpcyksIHJlcXVlc3QsIGNhY2hlU2l6ZSwgYnVsa04sXHJcbiAgICAgICAgICAgIG4sIG1heFJlcXVlc3RTaXplKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYSBSYW5kb21PcmdDYWNoZSB0byBvYnRhaW4gcmFuZG9tIGJsb2JzLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgUmFuZG9tT3JnQ2FjaGUgY2FuIGJlIHBvbGxlZCBmb3IgbmV3IHJlc3VsdHMgY29uZm9ybWluZyB0byB0aGUgb3V0cHV0XHJcbiAgICAgKiBmb3JtYXQgb2YgdGhlIGlucHV0IHJlcXVlc3QuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBIb3cgbWFueSByYW5kb20gYmxvYnMgeW91IG5lZWQuIG4qKGNhY2hlU2l6ZS8yKSBtdXN0IGJlXHJcbiAgICAgKiAgICAgd2l0aGluIHRoZSBbMSwxMDBdIHJhbmdlLlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgVGhlIHNpemUgb2YgZWFjaCBibG9iLCBtZWFzdXJlZCBpbiBiaXRzLiBNdXN0IGJlXHJcbiAgICAgKiAgICAgd2l0aGluIHRoZSBbMSwxMDQ4NTc2XSByYW5nZSBhbmQgbXVzdCBiZSBkaXZpc2libGUgYnkgOC5cclxuICAgICAqIEBwYXJhbSB7e2Zvcm1hdD86IHN0cmluZywgY2FjaGVTaXplPzogbnVtYmVyfX0gb3B0aW9ucyBBbiBvYmplY3Qgd2hpY2ggbWF5XHJcbiAgICAgKiAgICAgY29udGFpbiBhbnkgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25hbCBwYXJhbWV0ZXJzOlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmZvcm1hdD1iYXNlNjRdIFNwZWNpZmllcyB0aGUgZm9ybWF0IGluIHdoaWNoIHRoZVxyXG4gICAgICogICAgIGJsb2JzIHdpbGwgYmUgcmV0dXJuZWQuIFZhbHVlcyBhbGxvd2VkIGFyZSAnYmFzZTY0JyBhbmQgJ2hleCcgKGRlZmF1bHRcclxuICAgICAqICAgICAnYmFzZTY0JykuXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuY2FjaGVTaXplPTEwXSBUaGUgbnVtYmVyIG9mIHJlc3VsdC1zZXRzIGZvciB0aGUgY2FjaGVcclxuICAgICAqICAgICB0byB0cnkgdG8gbWFpbnRhaW4gYXQgYW55IGdpdmVuIHRpbWUgKGRlZmF1bHQgMTAsIG1pbmltdW0gMikuXHJcbiAgICAgKiBAcmV0dXJucyB7UmFuZG9tT3JnQ2FjaGV9IEFuIGluc3RhbmNlIG9mIHRoZSBSYW5kb21PcmdDYWNoZSBjbGFzcyB3aGljaFxyXG4gICAgICogICAgIGNhbiBiZSBwb2xsZWQgZm9yIGFycmF5cyBvZiB0cnVlIHJhbmRvbSBibG9icyBhcyBzdHJpbmdzLlxyXG4gICAgICogQHNlZSB7QGxpbmsgUmFuZG9tT3JnQ2xpZW50I0JMT0JfRk9STUFUX0JBU0U2NH0gZm9yICdiYXNlNjQnIChkZWZhdWx0KS5cclxuICAgICAqIEBzZWUge0BsaW5rIFJhbmRvbU9yZ0NsaWVudCNCTE9CX0ZPUk1BVF9IRVh9IGZvciAnaGV4Jy5cclxuICAgICAqL1xyXG4gICAgY3JlYXRlQmxvYkNhY2hlKG4sIHNpemUsIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgICAgIGxldCBjYWNoZVNpemUgPSBvcHRpb25zLmNhY2hlU2l6ZSB8fCAxMDtcclxuICAgICAgICBpZiAoY2FjaGVTaXplIDwgMikge1xyXG4gICAgICAgICAgICBjYWNoZVNpemUgPSAyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gbWF4IHNpbmdsZSByZXF1ZXN0IHNpemUsIGluIGJpdHMsIGZvciBhZGp1c3RpbmcgYnVsayByZXF1ZXN0cyBsYXRlclxyXG4gICAgICAgIGxldCBtYXhSZXF1ZXN0U2l6ZSA9IG4gKiBzaXplO1xyXG5cclxuICAgICAgICAvLyBtYWtlIHJlcXVlc3RzIG1vcmUgZWZmaWNpZW50IGJ5IGJ1bGstb3JkZXJpbmcgZnJvbSB0aGUgc2VydmVyLiBJbml0aWFsbHlcclxuICAgICAgICAvLyBzZXQgYXQgY2FjaGVTaXplLzIsIGJ1dCBjYWNoZSB3aWxsIGF1dG8tc2hyaW5rIGJ1bGsgcmVxdWVzdCBzaXplIGlmXHJcbiAgICAgICAgLy8gcmVxdWVzdHMgY2FuJ3QgYmUgZnVsZmlsbGVkLlxyXG4gICAgICAgIGxldCBidWxrTiA9IGNhY2hlU2l6ZSAvIDI7XHJcbiAgICAgICAgbGV0IHJlcXVlc3QgPSB0aGlzLiNibG9iUmVxdWVzdChuICogYnVsa04sIHNpemUsIG9wdGlvbnMpO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3IFJhbmRvbU9yZ0NhY2hlKHRoaXMuI3NlbmRSZXF1ZXN0LmJpbmQodGhpcyksIHJlcXVlc3QsIGNhY2hlU2l6ZSwgYnVsa04sXHJcbiAgICAgICAgICAgIG4sIG1heFJlcXVlc3RTaXplKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvcmUgc2VuZCByZXF1ZXN0IGZ1bmN0aW9uLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHJlcXVlc3QgUmVxdWVzdCBvYmplY3QgdG8gc2VuZC5cclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IEEgUHJvbWlzZSB3aGljaCwgaWYgcmVzb2x2ZWQgc3VjY2Vzc2Z1bGx5LFxyXG4gICAgICogICAgIHJlcHJlc2VudHMgdGhlIHJlc3BvbnNlIHByb3ZpZGVkIGJ5IHRoZSBzZXJ2ZXIuIEVsc2UsIGl0IG1heSBiZSByZWplY3RlZFxyXG4gICAgICogICAgIHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgZXJyb3JzOlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnU2VuZFRpbWVvdXRFcnJvcn0gVGhyb3duIHdoZW4gYmxvY2tpbmcgdGltZW91dCBpcyBleGNlZWRlZFxyXG4gICAgICogICAgIGJlZm9yZSB0aGUgcmVxdWVzdCBjYW4gYmUgc2VudC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ0tleU5vdFJ1bm5pbmdFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkgaGFzIGJlZW5cclxuICAgICAqICAgICBzdG9wcGVkLlxyXG4gICAgICogQHRocm93cyB7UmFuZG9tT3JnSW5zdWZmaWNpZW50UmVxdWVzdHNFcnJvcn0gVGhyb3duIHdoZW4gdGhlIEFQSSBrZXkncyBzZXJ2ZXJcclxuICAgICAqICAgICByZXF1ZXN0cyBhbGxvd2FuY2UgaGFzIGJlZW4gZXhjZWVkZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdJbnN1ZmZpY2llbnRCaXRzRXJyb3J9IFRocm93biB3aGVuIHRoZSBBUEkga2V5J3Mgc2VydmVyXHJcbiAgICAgKiAgICAgYml0cyBhbGxvd2FuY2UgaGFzIGJlZW4gZXhjZWVkZWQuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdCYWRIVFRQUmVzcG9uc2VFcnJvcn0gVGhyb3duIHdoZW4gYSBIVFRQIDIwMCBPSyByZXNwb25zZVxyXG4gICAgICogICAgIGlzIG5vdCByZWNlaXZlZC5cclxuICAgICAqIEB0aHJvd3Mge1JhbmRvbU9yZ1JBTkRPTU9SR0Vycm9yfSBUaHJvd24gd2hlbiB0aGUgc2VydmVyIHJldHVybnMgYSBSQU5ET00uT1JHXHJcbiAgICAgKiAgICAgRXJyb3IuXHJcbiAgICAgKiBAdGhyb3dzIHtSYW5kb21PcmdKU09OUlBDRXJyb3J9IFRocm93biB3aGVuIHRoZSBzZXJ2ZXIgcmV0dXJucyBhIEpTT04tUlBDIEVycm9yLlxyXG4gICAgICovXHJcbiAgICAjc2VuZFJlcXVlc3QgPSBhc3luYyBmdW5jdGlvbiAocmVxdWVzdCkge1xyXG4gICAgICAgIC8vIElmIGEgYmFjay1vZmYgaXMgc2V0LCBubyBtb3JlIHJlcXVlc3RzIGNhbiBiZSBpc3N1ZWQgdW50aWwgdGhlIHJlcXVpcmVkIFxyXG4gICAgICAgIC8vIGJhY2stb2ZmIHRpbWUgaXMgdXAuXHJcbiAgICAgICAgaWYgKHRoaXMuI2JhY2tvZmYgIT0gLTEpIHsgICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gVGltZSBub3QgeWV0IHVwLCB0aHJvdyBlcnJvci5cclxuICAgICAgICAgICAgaWYgKERhdGUubm93KCkgPCB0aGlzLiNiYWNrb2ZmKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZG9tT3JnSW5zdWZmaWNpZW50UmVxdWVzdHNFcnJvcih0aGlzLiNiYWNrb2ZmRXJyb3IpO1xyXG4gICAgICAgICAgICAvLyBUaW1lIGlzIHVwLCBjbGVhciBiYWNrLW9mZi5cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuI2JhY2tvZmYgPSAtMTtcclxuICAgICAgICAgICAgICAgIHRoaXMuI2JhY2tvZmZFcnJvciA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB3YWl0ID0gdGhpcy4jYWR2aXNvcnlEZWxheSAtIChEYXRlLm5vdygpIC0gdGhpcy4jbGFzdFJlc3BvbnNlUmVjZWl2ZWRUaW1lKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuI2Jsb2NraW5nVGltZW91dCAhPSAtMSAmJiB3YWl0ID4gdGhpcy4jYmxvY2tpbmdUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5kb21PcmdTZW5kVGltZW91dEVycm9yKCdUaGUgc2VydmVyIGFkdmlzb3J5IGRlbGF5IG9mICcgXHJcbiAgICAgICAgICAgICAgICArIHdhaXQgKyAnbWlsbGlzIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZGVmaW5lZCBtYXhpbXVtIGFsbG93ZWQgJ1xyXG4gICAgICAgICAgICAgICAgKyAnYmxvY2tpbmcgdGltZSBvZiAnICsgdGhpcy4jYmxvY2tpbmdUaW1lb3V0ICsgJ21pbGxpcy4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh3YWl0ID4gMCkgeyBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgd2FpdCkpOyB9XHJcblxyXG4gICAgICAgIGxldCBodHRwVGltZW91dCA9IHRoaXMuI2h0dHBUaW1lb3V0O1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSkge1xyXG4gICAgICAgICAgICBsZXQgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XHJcbiAgICAgICAgICAgIHhoci5vcGVuKCdQT1NUJywgJ2h0dHBzOi8vYXBpLnJhbmRvbS5vcmcvanNvbi1ycGMvNC9pbnZva2UnKTtcclxuICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XHJcbiAgICAgICAgICAgIHhoci5vbnRpbWVvdXQgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5kb21PcmdTZW5kVGltZW91dEVycm9yKCdUaGUgbWF4aW11bSAnXHJcbiAgICAgICAgICAgICAgICAgICAgKyAnYWxsb3dlZCBibG9ja2luZyB0aW1lIG9mICcgKyBodHRwVGltZW91dCArICdtaWxsaXMgaGFzICdcclxuICAgICAgICAgICAgICAgICAgICArICdiZWVuIGV4Y2VlZGVkIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBzZXJ2ZXIgdG8gcmVzcG9uZC4nKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDMwMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoeGhyLnJlc3BvbnNlVGV4dCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5kb21PcmdCYWRIVFRQUmVzcG9uc2VFcnJvcignRXJyb3I6ICdcclxuICAgICAgICAgICAgICAgICAgICAgICAgKyB4aHIuc3RhdHVzKTtcclxuICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIHVuZG9jdW1lbnRlZCBlcnJvci5cclxuICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oJyoqIEFuIGVycm9yIG9jY3VycmVkIGR1cmluZyB0aGUgdHJhbnNhY3Rpb24uJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHhoci5yZXNwb25zZVRleHQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB4aHIudGltZW91dCA9IGh0dHBUaW1lb3V0O1xyXG4gICAgICAgICAgICB4aHIuc2VuZChKU09OLnN0cmluZ2lmeShyZXF1ZXN0KSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIC8vIHBhcnNlIHJlc3BvbnNlIHRvIGdldCBhbiBvYmplY3RcclxuICAgICAgICAgICAgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGNoZWNrIGZvciBlcnJvcnNcclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY29kZSA9IHJlc3BvbnNlLmVycm9yLmNvZGU7XHJcbiAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IHJlc3BvbnNlLmVycm9yLm1lc3NhZ2U7XHJcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHJlc3BvbnNlLmVycm9yLmRhdGE7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gNDAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmRvbU9yZ0tleU5vdFJ1bm5pbmdFcnJvcignRXJyb3IgJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICArIGNvZGUgKyAnOiAnICsgbWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gNDAyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1pZG5pZ2h0VVRDID0gbmV3IERhdGUoKS5zZXRVVENIb3VycygwLDAsMCwwKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNiYWNrb2ZmID0gK21pZG5pZ2h0VVRDO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2JhY2tvZmZFcnJvciA9ICdFcnJvciAnICsgY29kZSArICc6ICcgKyBtZXNzYWdlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNyZXF1ZXN0c0xlZnQgPSBkYXRhWzFdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZG9tT3JnSW5zdWZmaWNpZW50UmVxdWVzdHNFcnJvcih0aGlzLiNiYWNrb2ZmRXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlID09IDQwMykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2JpdHNMZWZ0ID0gZGF0YVsxXTtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZG9tT3JnSW5zdWZmaWNpZW50Qml0c0Vycm9yKCdFcnJvcidcclxuICAgICAgICAgICAgICAgICAgICAgICAgKyBjb2RlICsgJzogJyArIG1lc3NhZ2UsIHRoaXMuI2JpdHNMZWZ0KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoUmFuZG9tT3JnQ2xpZW50LiNFUlJPUl9DT0RFUy5pbmNsdWRlcyhjb2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFJhbmRvbU9yZ1JBTkRPTU9SR0Vycm9yIGZyb20gUkFORE9NLk9SRyBFcnJvcnM6IFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vYXBpLnJhbmRvbS5vcmcvanNvbi1ycGMvNC9lcnJvci1jb2Rlc1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5kb21PcmdSQU5ET01PUkdFcnJvcignRXJyb3IgJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICArIGNvZGUgKyAnOiAnICsgbWVzc2FnZSwgY29kZSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFJhbmRvbU9yZ0pTT05SUENFcnJvciBmcm9tIEpTT04tUlBDIEVycm9yczogXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9hcGkucmFuZG9tLm9yZy9qc29uLXJwYy80L2Vycm9yLWNvZGVzXHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmRvbU9yZ0pTT05SUENFcnJvcignRXJyb3IgJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICArIGNvZGUgKyAnOiAnICsgbWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIE1ldGhvZHMgd2hpY2ggZG8gbm90IHVwZGF0ZSBmaWVsZHMgc3VjaCBhcyByZXF1ZXN0c0xlZnQsIGJpdHNMZWZ0IG9yXHJcbiAgICAgICAgICAgIC8vIGFkdmlzb3J5RGVsYXkuXHJcbiAgICAgICAgICAgIGxldCBpbmRlcGVuZGVudF9tZXRob2RzID0gW1xyXG4gICAgICAgICAgICAgICAgUmFuZG9tT3JnQ2xpZW50LiNWRVJJRllfU0lHTkFUVVJFX01FVEhPRCxcclxuICAgICAgICAgICAgICAgIFJhbmRvbU9yZ0NsaWVudC4jR0VUX1JFU1VMVF9NRVRIT0QsXHJcbiAgICAgICAgICAgICAgICBSYW5kb21PcmdDbGllbnQuI0NSRUFURV9USUNLRVRfTUVUSE9ELFxyXG4gICAgICAgICAgICAgICAgUmFuZG9tT3JnQ2xpZW50LiNMSVNUX1RJQ0tFVF9NRVRIT0QsXHJcbiAgICAgICAgICAgICAgICBSYW5kb21PcmdDbGllbnQuI0dFVF9USUNLRVRfTUVUSE9EXHJcbiAgICAgICAgICAgIF07XHJcblxyXG4gICAgICAgICAgICAvLyBVcGRhdGUgaW5mb3JtYXRpb25cclxuICAgICAgICAgICAgaWYgKCFpbmRlcGVuZGVudF9tZXRob2RzLmluY2x1ZGVzKHJlcXVlc3QubWV0aG9kKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy4jcmVxdWVzdHNMZWZ0ID0gcmVzcG9uc2UucmVzdWx0LnJlcXVlc3RzTGVmdDtcclxuICAgICAgICAgICAgICAgIHRoaXMuI2JpdHNMZWZ0ID0gcmVzcG9uc2UucmVzdWx0LmJpdHNMZWZ0O1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnJlc3VsdC5hZHZpc29yeURlbGF5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jYWR2aXNvcnlEZWxheSA9IHJlc3BvbnNlLnJlc3VsdC5hZHZpc29yeURlbGF5O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBVc2UgZGVmYXVsdCBpZiBub25lIGZyb20gc2VydmVyLlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2Fkdmlzb3J5RGVsYXkgPSBSYW5kb21PcmdDbGllbnQuI0RFRkFVTFRfREVMQVk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBVc2UgZGVmYXVsdCBhZHZpc29yeURlbGF5LlxyXG4gICAgICAgICAgICAgICAgdGhpcy4jYWR2aXNvcnlEZWxheSA9IFJhbmRvbU9yZ0NsaWVudC4jREVGQVVMVF9ERUxBWTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLiNsYXN0UmVzcG9uc2VSZWNlaXZlZFRpbWUgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIElzc3VlcyBhIGdldFVzYWdlIHJlcXVlc3QgYW5kIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIG9uIHRoZSB1c2FnZVxyXG4gICAgICogb2YgdGhlIEFQSSBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2xpZW50LCBhcyBpdCBpcyByZXR1cm5lZCBieSB0aGVcclxuICAgICAqIHNlcnZlci4gQ2FuIGFsc28gYmUgdXNlZCB0byB1cGRhdGUgYml0cyBhbmQgcmVxdWVzdHMgbGVmdC5cclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBBIFByb21pc2UsIHdoaWNoIGlmIHJlc29sdmVkIHN1Y2Nlc3NmdWxseSwgcmVwcmVzZW50c1xyXG4gICAgICogICAgIHRoZSByZXN1bHQgZmllbGQgYXMgcmV0dXJuZWQgYnkgdGhlIHNlcnZlci5cclxuICAgICAqL1xyXG4gICAgI2dldFVzYWdlID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGxldCByZXF1ZXN0ID0gdGhpcy4jZ2VuZXJhdGVLZXllZFJlcXVlc3QoUmFuZG9tT3JnQ2xpZW50LiNHRVRfVVNBR0VfTUVUSE9ELCB7fSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuI2V4dHJhY3RSZXN1bHQodGhpcy4jc2VuZFJlcXVlc3QocmVxdWVzdCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBnZW5lcmljIHJlcXVlc3QgcGFyYW1ldGVycyB0byBjdXN0b20gcmVxdWVzdC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2QgTWV0aG9kIHRvIHNlbmQgcmVxdWVzdCB0by5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ3VzdG9tIHBhcmFtZXRlcnMgdG8gZ2VuZXJhdGUgcmVxdWVzdCBhcm91bmQuXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBGbGVzaGVkIG91dCByZXF1ZXN0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgI2dlbmVyYXRlUmVxdWVzdCA9IChtZXRob2QsIHBhcmFtcykgPT4ge1xyXG4gICAgICAgIGxldCBpZCA9IHRoaXMuI3V1aWR2NCgpO1xyXG4gICAgICAgIGxldCByZXF1ZXN0ID0ge1xyXG4gICAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcclxuICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXHJcbiAgICAgICAgICAgIHBhcmFtczogcGFyYW1zLFxyXG4gICAgICAgICAgICBpZDogaWRcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXF1ZXN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBnZW5lcmljIHJlcXVlc3QgcGFyYW1ldGVycyBhbmQgQVBJIGtleSB0byBjdXN0b20gcmVxdWVzdC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2QgTWV0aG9kIHRvIHNlbmQgcmVxdWVzdCB0by5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ3VzdG9tIHBhcmFtZXRlcnMgdG8gZ2VuZXJhdGUgcmVxdWVzdCBhcm91bmQuXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBGbGVzaGVkIG91dCByZXF1ZXN0IG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgI2dlbmVyYXRlS2V5ZWRSZXF1ZXN0ID0gKG1ldGhvZCwgcGFyYW1zKSA9PiB7XHJcbiAgICAgICAgcGFyYW1zWydhcGlLZXknXSA9IHRoaXMuI2FwaUtleTtcclxuICAgICAgICByZXR1cm4gdGhpcy4jZ2VuZXJhdGVSZXF1ZXN0KG1ldGhvZCwgcGFyYW1zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEV4dHJhY3RzIGJhc2ljIGRhdGEgZnJvbSByZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzcG9uc2UgT2JqZWN0IGZyb20gd2hpY2ggdG8gZXh0cmFjdCBkYXRhLlxyXG4gICAgICogQHJldHVybnMge2FueVtdfSBFeHRyYWN0ZWQgZGF0YSBhcyBhbiBhcnJheS5cclxuICAgICAqL1xyXG4gICAgI2V4dHJhY3RCYXNpYyA9IGFzeW5jIHJlc3BvbnNlID0+IHtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2UudGhlbihkYXRhID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGEucmVzdWx0LnJhbmRvbS5kYXRhO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBkYXRhLCByYW5kb20gZmllbGQgYW5kIHNpZ25hdHVyZSBmcm9tIHJlc3BvbnNlIGFuZCByZXR1cm5zIHRoZXNlIGFzXHJcbiAgICAgKiBhIG5ldyBvYmplY3QuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzcG9uc2UgT2JqZWN0IGZyb20gd2hpY2ggdG8gZXh0cmFjdCB0aGUgaW5mb3JtYXRpb24uXHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7ZGF0YTogbnVtYmVyW118bnVtYmVyW11bXXxzdHJpbmdbXXxzdHJpbmdbXVtdLCByYW5kb206IE9iamVjdCxcclxuICAgICAqICAgICBzaWduYXR1cmU6IHN0cmluZ30+fSBUaGUgcmVzcG9uc2Ugc3BsaXQgaW50byBkYXRhLCByYW5kb20gYW5kIHNpZ25hdHVyZSBmaWVsZHMuXHJcbiAgICAgKi9cclxuICAgICNleHRyYWN0U2lnbmVkID0gYXN5bmMgcmVzcG9uc2UgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXNwb25zZS50aGVuKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgZGF0YTogZGF0YS5yZXN1bHQucmFuZG9tLmRhdGEsXHJcbiAgICAgICAgICAgICAgICByYW5kb206IGRhdGEucmVzdWx0LnJhbmRvbSxcclxuICAgICAgICAgICAgICAgIHNpZ25hdHVyZTogZGF0YS5yZXN1bHQuc2lnbmF0dXJlXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHZlcmlmaWNhdGlvbiByZXNwb25zZSBhcyBzZXBhcmF0ZSBmcm9tIHJlc3BvbnNlIG9iamVjdC5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZXNwb25zZSBSZXNwb25zZSBvYmplY3QgZnJvbSB3aGljaCB0byBleHRyYWN0XHJcbiAgICAgKiAgICAgdmVyaWZpY2F0aW9uIHJlc3BvbnNlLlxyXG4gICAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFZlcmlmaWNhdGlvbiBzdWNjZXNzLlxyXG4gICAgICovXHJcbiAgICAjZXh0cmFjdFZlcmlmaWNhdGlvbiA9IGFzeW5jIHJlc3BvbnNlID0+IHtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2UudGhlbihkYXRhID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGEucmVzdWx0LmF1dGhlbnRpY2l0eTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEV4dHJhY3RzIHRoZSBpbmZvcm1hdGlvbiByZXR1cm5lZCB1bmRlciB0aGUgJ3Jlc3VsdCcgZmllbGQuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcmVzcG9uc2UgUmVzcG9uc2Ugb2JqZWN0IHJldHVybmVkIGZyb20gdGhlIHNlcnZlci5cclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IEFsbCBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgJ3Jlc3VsdCcgZmllbGQuXHJcbiAgICAgKi9cclxuICAgICNleHRyYWN0UmVzdWx0ID0gYXN5bmMgcmVzcG9uc2UgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXNwb25zZS50aGVuKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YS5yZXN1bHQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgcmVxdWVzdHMgZm9yIGludGVnZXJzLlxyXG4gICAgICovXHJcbiAgICAjaW50ZWdlclJlcXVlc3QgPSAobiwgbWluLCBtYXgsIHsgcmVwbGFjZW1lbnQgPSB0cnVlLCBiYXNlID0gMTAsIHByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb24gPSBudWxsLCBsaWNlbnNlRGF0YSA9IG51bGwsIHVzZXJEYXRhID0gbnVsbCwgdGlja2V0SWQgPSBudWxsIH0gPSB7fSwgc2lnbmVkID0gZmFsc2UpID0+IHtcclxuICAgICAgICBsZXQgcGFyYW1zID0ge1xyXG4gICAgICAgICAgICBuOiBuLFxyXG4gICAgICAgICAgICBtaW46IG1pbixcclxuICAgICAgICAgICAgbWF4OiBtYXgsXHJcbiAgICAgICAgICAgIHJlcGxhY2VtZW50OiByZXBsYWNlbWVudCxcclxuICAgICAgICAgICAgYmFzZTogYmFzZVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHBhcmFtcyA9IHRoaXMuI2FkZE9wdGlvbmFsUGFyYW1zKHBhcmFtcywgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbixcclxuICAgICAgICAgICAgbGljZW5zZURhdGEsIHVzZXJEYXRhLCB0aWNrZXRJZCwgc2lnbmVkKTtcclxuXHJcbiAgICAgICAgbGV0IG1ldGhvZCA9IHNpZ25lZCA/IFJhbmRvbU9yZ0NsaWVudC4jU0lHTkVEX0lOVEVHRVJfTUVUSE9EIDogUmFuZG9tT3JnQ2xpZW50LiNJTlRFR0VSX01FVEhPRDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuI2dlbmVyYXRlS2V5ZWRSZXF1ZXN0KG1ldGhvZCwgcGFyYW1zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byBnZW5lcmF0ZSByZXF1ZXN0cyBmb3IgaW50ZWdlciBzZXF1ZW5jZXMuXHJcbiAgICAgKi9cclxuICAgICNpbnRlZ2VyU2VxdWVuY2VSZXF1ZXN0ID0gKG4sIGxlbmd0aCwgbWluLCBtYXgsIHsgcmVwbGFjZW1lbnQgPSB0cnVlLCBiYXNlID0gMTAsIHByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb24gPSBudWxsLCBsaWNlbnNlRGF0YSA9IG51bGwsIHVzZXJEYXRhID0gbnVsbCwgdGlja2V0SWQgPSBudWxsIH0gPSB7fSwgc2lnbmVkID0gZmFsc2UpID0+IHtcclxuICAgICAgICBsZXQgcGFyYW1zID0ge1xyXG4gICAgICAgICAgICBuOiBuLFxyXG4gICAgICAgICAgICBsZW5ndGg6IGxlbmd0aCxcclxuICAgICAgICAgICAgbWluOiBtaW4sXHJcbiAgICAgICAgICAgIG1heDogbWF4LFxyXG4gICAgICAgICAgICByZXBsYWNlbWVudDogcmVwbGFjZW1lbnQsXHJcbiAgICAgICAgICAgIGJhc2U6IGJhc2VcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBwYXJhbXMgPSB0aGlzLiNhZGRPcHRpb25hbFBhcmFtcyhwYXJhbXMsIHByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb24sXHJcbiAgICAgICAgICAgIGxpY2Vuc2VEYXRhLCB1c2VyRGF0YSwgdGlja2V0SWQsIHNpZ25lZCk7XHJcblxyXG4gICAgICAgIGxldCBtZXRob2QgPSBzaWduZWQgPyBSYW5kb21PcmdDbGllbnQuI1NJR05FRF9JTlRFR0VSX1NFUVVFTkNFX01FVEhPRCA6IFJhbmRvbU9yZ0NsaWVudC4jSU5URUdFUl9TRVFVRU5DRV9NRVRIT0Q7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLiNnZW5lcmF0ZUtleWVkUmVxdWVzdChtZXRob2QsIHBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgcmVxdWVzdHMgZm9yIGRlY2ltYWwgZnJhY3Rpb25zLlxyXG4gICAgICovXHJcbiAgICAjZGVjaW1hbEZyYWN0aW9uUmVxdWVzdCA9IChuLCBkZWNpbWFsUGxhY2VzLCB7IHJlcGxhY2VtZW50ID0gdHJ1ZSwgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbiA9IG51bGwsIGxpY2Vuc2VEYXRhID0gbnVsbCwgdXNlckRhdGEgPSBudWxsLCB0aWNrZXRJZCA9IG51bGwgfSA9IHt9LCBzaWduZWQgPSBmYWxzZSkgPT4ge1xyXG4gICAgICAgIGxldCBwYXJhbXMgPSB7XHJcbiAgICAgICAgICAgIG46IG4sXHJcbiAgICAgICAgICAgIGRlY2ltYWxQbGFjZXM6IGRlY2ltYWxQbGFjZXMsXHJcbiAgICAgICAgICAgIHJlcGxhY2VtZW50OiByZXBsYWNlbWVudFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHBhcmFtcyA9IHRoaXMuI2FkZE9wdGlvbmFsUGFyYW1zKHBhcmFtcywgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbixcclxuICAgICAgICAgICAgbGljZW5zZURhdGEsIHVzZXJEYXRhLCB0aWNrZXRJZCwgc2lnbmVkKTtcclxuICAgICAgICBcclxuICAgICAgICBsZXQgbWV0aG9kID0gc2lnbmVkID8gUmFuZG9tT3JnQ2xpZW50LiNTSUdORURfREVDSU1BTF9GUkFDVElPTl9NRVRIT0QgOiBSYW5kb21PcmdDbGllbnQuI0RFQ0lNQUxfRlJBQ1RJT05fTUVUSE9EO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy4jZ2VuZXJhdGVLZXllZFJlcXVlc3QobWV0aG9kLCBwYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIHJlcXVlc3RzIGZvciBHYXVzc2lhbnMuXHJcbiAgICAgKi9cclxuICAgICNnYXVzc2lhblJlcXVlc3QgPSAobiwgbWVhbiwgc3RhbmRhcmREZXZpYXRpb24sIHNpZ25pZmljYW50RGlnaXRzLCB7IHByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb24gPSBudWxsLCBsaWNlbnNlRGF0YSA9IG51bGwsIHVzZXJEYXRhID0gbnVsbCwgdGlja2V0SWQgPSBudWxsIH0gPSB7fSwgc2lnbmVkID0gZmFsc2UpID0+IHtcclxuICAgICAgICBsZXQgcGFyYW1zID0ge1xyXG4gICAgICAgICAgICBuOiBuLFxyXG4gICAgICAgICAgICBtZWFuOiBtZWFuLFxyXG4gICAgICAgICAgICBzdGFuZGFyZERldmlhdGlvbjogc3RhbmRhcmREZXZpYXRpb24sXHJcbiAgICAgICAgICAgIHNpZ25pZmljYW50RGlnaXRzOiBzaWduaWZpY2FudERpZ2l0c1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHBhcmFtcyA9IHRoaXMuI2FkZE9wdGlvbmFsUGFyYW1zKHBhcmFtcywgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbixcclxuICAgICAgICAgICAgbGljZW5zZURhdGEsIHVzZXJEYXRhLCB0aWNrZXRJZCwgc2lnbmVkKTtcclxuXHJcbiAgICAgICAgbGV0IG1ldGhvZCA9IHNpZ25lZCA/IFJhbmRvbU9yZ0NsaWVudC4jU0lHTkVEX0dBVVNTSUFOX01FVEhPRCA6IFJhbmRvbU9yZ0NsaWVudC4jR0FVU1NJQU5fTUVUSE9EO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy4jZ2VuZXJhdGVLZXllZFJlcXVlc3QobWV0aG9kLCBwYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIHJlcXVlc3RzIGZvciBzdHJpbmdzLlxyXG4gICAgICovXHJcbiAgICAjc3RyaW5nUmVxdWVzdCA9IChuLCBsZW5ndGgsIGNoYXJhY3RlcnMsIHsgcmVwbGFjZW1lbnQgPSB0cnVlLCBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uID0gbnVsbCwgbGljZW5zZURhdGEgPSBudWxsLCB1c2VyRGF0YSA9IG51bGwsIHRpY2tldElkID0gbnVsbCB9ID0ge30sIHNpZ25lZCA9IGZhbHNlKSA9PiB7XHJcbiAgICAgICAgbGV0IHBhcmFtcyA9IHtcclxuICAgICAgICAgICAgbjogbixcclxuICAgICAgICAgICAgbGVuZ3RoOiBsZW5ndGgsXHJcbiAgICAgICAgICAgIGNoYXJhY3RlcnM6IGNoYXJhY3RlcnMsXHJcbiAgICAgICAgICAgIHJlcGxhY2VtZW50OiByZXBsYWNlbWVudFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHBhcmFtcyA9IHRoaXMuI2FkZE9wdGlvbmFsUGFyYW1zKHBhcmFtcywgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbixcclxuICAgICAgICAgICAgbGljZW5zZURhdGEsIHVzZXJEYXRhLCB0aWNrZXRJZCwgc2lnbmVkKTtcclxuXHJcbiAgICAgICAgbGV0IG1ldGhvZCA9IHNpZ25lZCA/IFJhbmRvbU9yZ0NsaWVudC4jU0lHTkVEX1NUUklOR19NRVRIT0QgOiBSYW5kb21PcmdDbGllbnQuI1NUUklOR19NRVRIT0Q7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLiNnZW5lcmF0ZUtleWVkUmVxdWVzdChtZXRob2QsIHBhcmFtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgcmVxdWVzdHMgZm9yIFVVSURzLlxyXG4gICAgICovXHJcbiAgICAjVVVJRFJlcXVlc3QgPSAobiwgeyBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uID0gbnVsbCwgbGljZW5zZURhdGEgPSBudWxsLCB1c2VyRGF0YSA9IG51bGwsIHRpY2tldElkID0gbnVsbCB9ID0ge30sIHNpZ25lZCA9IGZhbHNlKSA9PiB7XHJcbiAgICAgICAgbGV0IHBhcmFtcyA9IHtcclxuICAgICAgICAgICAgbjogblxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHBhcmFtcyA9IHRoaXMuI2FkZE9wdGlvbmFsUGFyYW1zKHBhcmFtcywgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbixcclxuICAgICAgICAgICAgbGljZW5zZURhdGEsIHVzZXJEYXRhLCB0aWNrZXRJZCwgc2lnbmVkKTtcclxuXHJcbiAgICAgICAgbGV0IG1ldGhvZCA9IHNpZ25lZCA/IFJhbmRvbU9yZ0NsaWVudC4jU0lHTkVEX1VVSURfTUVUSE9EIDogUmFuZG9tT3JnQ2xpZW50LiNVVUlEX01FVEhPRDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuI2dlbmVyYXRlS2V5ZWRSZXF1ZXN0KG1ldGhvZCwgcGFyYW1zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byBnZW5lcmF0ZSByZXF1ZXN0cyBmb3IgYmxvYnMuXHJcbiAgICAgKi9cclxuICAgICNibG9iUmVxdWVzdCA9IChuLCBzaXplLCB7IGZvcm1hdCA9IHRoaXMuQkFTRTY0LCBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uID0gbnVsbCwgbGljZW5zZURhdGEgPSBudWxsLCB1c2VyRGF0YSA9IG51bGwsIHRpY2tldElkID0gbnVsbCB9LCBzaWduZWQgPSBmYWxzZSkgPT4ge1xyXG4gICAgICAgIGxldCBwYXJhbXMgPSB7XHJcbiAgICAgICAgICAgIG46IG4sXHJcbiAgICAgICAgICAgIHNpemU6IHNpemUsXHJcbiAgICAgICAgICAgIGZvcm1hdDogZm9ybWF0XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcGFyYW1zID0gdGhpcy4jYWRkT3B0aW9uYWxQYXJhbXMocGFyYW1zLCBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uLFxyXG4gICAgICAgICAgICBsaWNlbnNlRGF0YSwgdXNlckRhdGEsIHRpY2tldElkLCBzaWduZWQpO1xyXG5cclxuICAgICAgICBsZXQgbWV0aG9kID0gc2lnbmVkID8gUmFuZG9tT3JnQ2xpZW50LiNTSUdORURfQkxPQl9NRVRIT0QgOiBSYW5kb21PcmdDbGllbnQuI0JMT0JfTUVUSE9EO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy4jZ2VuZXJhdGVLZXllZFJlcXVlc3QobWV0aG9kLCBwYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGFkZCBvcHRpb25hbCBwYXJhbWV0ZXJzIHdoaWNoIGFyZSBjb21tb24gYWNyb3NzXHJcbiAgICAgKiB2YWx1ZS1nZW5lcmF0aW5nIG1ldGhvZHMuXHJcbiAgICAgKi9cclxuICAgICNhZGRPcHRpb25hbFBhcmFtcyA9IChwYXJhbXMsIHByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb24sIGxpY2Vuc2VEYXRhLCB1c2VyRGF0YSwgdGlja2V0SWQsIHNpZ25lZCA9IGZhbHNlKSA9PiB7XHJcbiAgICAgICAgLy8gYXZhaWxhYmxlIGZvciBib3RoIEJhc2ljIGFuZCBTaWduZWQgQVBJIG1ldGhvZHNcclxuICAgICAgICBwYXJhbXMucHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbiA9IHByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb247XHJcblxyXG4gICAgICAgIC8vIG9wdGlvbmFsIHBhcmFtZXRlcnMgdXNlZCBleGNsdXNpdmVseSBmb3IgU2lnbmVkIEFQSSBtZXRob2RzXHJcbiAgICAgICAgaWYgKHNpZ25lZCkge1xyXG4gICAgICAgICAgICBwYXJhbXMubGljZW5zZURhdGEgPSBsaWNlbnNlRGF0YTtcclxuICAgICAgICAgICAgcGFyYW1zLnVzZXJEYXRhID0gdXNlckRhdGE7XHJcbiAgICAgICAgICAgIHBhcmFtcy50aWNrZXRJZCA9IHRpY2tldElkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gcGFyYW1zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhbiBpbnRlZ2VyIHNlcXVlbmNlIGNhY2hlLiBcclxuICAgICAqIEBwYXJhbSB7YW55W119IG9yaWdpbmFsIFRoZSBhcnJheSB0byBiZSByZXBlYXRlZC5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIG9yaWdpbmFsIGFycmF5IGlzIHRvIGJlXHJcbiAgICAgKiAgICAgcmVwZWF0ZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7YW55W119IEEgbmV3IGFycmF5IHdoaWNoIGNvbnRhaW5zIHRoZSBvcmlnaW5hbCBhcnJheSByZXBlYXRlZFxyXG4gICAgICogICAgIG4gdGltZXMuXHJcbiAgICAgKi9cclxuICAgICNhZGp1c3QgPSAob3JpZ2luYWwsIG4pID0+IHtcclxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogbiB9LCAoKSA9PiBvcmlnaW5hbCkuZmxhdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhbiBpbnRlZ2VyIHNlcXVlbmNlIGNhY2hlLlxyXG4gICAgICogQHBhcmFtIHsobnVtYmVyfG51bWJlcltdKX0gYSBBbiBhcnJheSBvZiBpbnRlZ2VycyAob3IgYSBzaW5nbGUgdmFsdWUpLlxyXG4gICAgICogQHJldHVybnMge251bWJlcn0gTGFyZ2VzdCB2YWx1ZSBpbiB0aGUgYXJyYXkgKG9yIGEsIHVuY2hhbmdlZCwgaWYgaXRcclxuICAgICAqICAgICBpcyBub3QgYW4gYXJyYXkpLlxyXG4gICAgICovXHJcbiAgICAjbWF4VmFsdWUgPSBhID0+IHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gYS5yZWR1Y2UoZnVuY3Rpb24oeCwgeSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KHgsIHkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gYTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGFuIGludGVnZXIgc2VxdWVuY2UgY2FjaGUuXHJcbiAgICAgKiBAcGFyYW0geyhudW1iZXJ8bnVtYmVyW10pfSBhIEFuIGFycmF5IG9mIGludGVnZXJzIChvciBhIHNpbmdsZSB2YWx1ZSkuXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBTbWFsbGVzdCB2YWx1ZSBpbiB0aGUgYXJyYXkgKG9yIGEsIHVuY2hhbmdlZCwgaWYgaXRcclxuICAgICAqICAgICBpcyBub3QgYW4gYXJyYXkpLlxyXG4gICAgICovXHJcbiAgICAjbWluVmFsdWUgPSBhID0+IHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gYS5yZWR1Y2UoZnVuY3Rpb24oeCwgeSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKHgsIHkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gYTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEhlbHBlciBmdW5jdGlvbiB0byBtYWtlIGEgc3RyaW5nIFVSTC1zYWZlIChiYXNlNjQgYW5kIHBlcmNlbnQtZW5jb2RpbmcpICovXHJcbiAgICAjZm9ybWF0VXJsID0gcyA9PiB7XHJcbiAgICAgICAgbGV0IHBhdHRlcm4gPSAvXihbMC05YS16QS1aKy9dezR9KSooKFswLTlhLXpBLVorL117Mn09PSl8KFswLTlhLXpBLVorL117M309KSk/JC87XHJcbiAgICAgICAgbGV0IGlzQmFzZTY0ID0gcGF0dGVybi50ZXN0KHMpO1xyXG5cclxuICAgICAgICBpZiAoIWlzQmFzZTY0KSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAod2luZG93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gYnJvd3NlclxyXG4gICAgICAgICAgICAgICAgICAgIHMgPSBidG9hKHMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBOb2RlSlNcclxuICAgICAgICAgICAgICAgICAgICBzID0gQnVmZmVyLmZyb20ocykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBQZXJjZW50LUVuY29kaW5nIGFzIGRlc2NyaWJlZCBpbiBSRkMgMzk4NiBmb3IgUEhQXHJcbiAgICAgICAgcyA9IHMucmVwbGFjZSgvPS9nLCAnJTNEJyk7XHJcbiAgICAgICAgcyA9IHMucmVwbGFjZSgvXFwrL2csICclMkInKTtcclxuICAgICAgICBzID0gcy5yZXBsYWNlKC9cXC8vZywgJyUyRicpO1xyXG5cclxuICAgICAgICByZXR1cm4gc1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgSFRNTCBpbnB1dCB0YWcgKi9cclxuICAgICNpbnB1dEhUTUwgPSAodHlwZSwgbmFtZSwgdmFsdWUpID0+IHtcclxuICAgICAgICByZXR1cm4gJzxpbnB1dCB0eXBlPVxcJycgKyB0eXBlICsgJ1xcJyBuYW1lPVxcJycgKyBuYW1lICsgJ1xcJyB2YWx1ZT1cXCcnICsgdmFsdWUgKyAnXFwnIC8+JztcclxuICAgIH1cclxuXHJcbiAgICAvKiogSGVscGVyIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIFVVSURzIHRvIGJlIHVzZWQgYXMgXCJpZFwiIGluIHJlcXVlc3RzIHRvIHRoZSBzZXJ2ZXIuICovXHJcbiAgICAjdXVpZHY0ID0gKCkgPT4ge1xyXG4gICAgICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uKGMpIHtcclxuICAgICAgICAgICAgdmFyIHIgPSBNYXRoLnJhbmRvbSgpKjE2IHwgMDtcclxuICAgICAgICAgICAgcmV0dXJuIChjID09ICd4JyA/IHIgOiAociYweDN8MHg4KSkudG9TdHJpbmcoMTYpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwiLyoqIFxyXG4gKiBFUyBNb2R1bGUgd3JhcHBlciwgYWxsb3dpbmcgdGhpcyBsaWJyYXJ5IHRvIGJlIGltcG9ydGVkIHVzaW5nXHJcbiAqIEVTNisgc3ludGF4LiBUaGUgUmFuZG9tT3JnQ2xpZW50IGNsYXNzIGlzIGJvdGggdGhlIGRlZmF1bHQgYW5kXHJcbiAqIGEgbmFtZWQgZXhwb3J0LiBBbGwgZXJyb3IgY2xhc3NlcywgYXJlIGF2YWlsYWJsZSBvbmx5IGFzIG5hbWVkXHJcbiAqIGV4cG9ydHMuXHJcbiAqICovXHJcbmltcG9ydCBSYW5kb21PcmdDbGllbnQgZnJvbSAnLi4vUmFuZG9tT3JnQ2xpZW50LmpzJztcclxuaW1wb3J0IFJhbmRvbU9yZ0NhY2hlIGZyb20gJy4uL1JhbmRvbU9yZ0NhY2hlLmpzJztcclxuaW1wb3J0ICogYXMgRXJyb3JzIGZyb20gJy4uL1JhbmRvbU9yZ0Vycm9ycy5qcyc7XHJcblxyXG5sZXQgUmFuZG9tT3JnUkFORE9NT1JHRXJyb3IgPSBFcnJvcnMuZGVmYXVsdC5SYW5kb21PcmdSQU5ET01PUkdFcnJvcjtcclxubGV0IFJhbmRvbU9yZ0JhZEhUVFBSZXNwb25zZUVycm9yID0gRXJyb3JzLmRlZmF1bHQuUmFuZG9tT3JnQmFkSFRUUFJlc3BvbnNlRXJyb3I7XHJcbmxldCBSYW5kb21PcmdJbnN1ZmZpY2llbnRCaXRzRXJyb3IgPSBFcnJvcnMuZGVmYXVsdC5SYW5kb21PcmdJbnN1ZmZpY2llbnRCaXRzRXJyb3I7XHJcbmxldCBSYW5kb21PcmdJbnN1ZmZpY2llbnRSZXF1ZXN0c0Vycm9yID0gRXJyb3JzLmRlZmF1bHQuUmFuZG9tT3JnSW5zdWZmaWNpZW50UmVxdWVzdHNFcnJvcjtcclxubGV0IFJhbmRvbU9yZ0pTT05SUENFcnJvciA9IEVycm9ycy5kZWZhdWx0LlJhbmRvbU9yZ0pTT05SUENFcnJvcjtcclxubGV0IFJhbmRvbU9yZ0tleU5vdFJ1bm5pbmdFcnJvciA9IEVycm9ycy5kZWZhdWx0LlJhbmRvbU9yZ0tleU5vdFJ1bm5pbmdFcnJvcjtcclxubGV0IFJhbmRvbU9yZ1NlbmRUaW1lb3V0RXJyb3IgPSBFcnJvcnMuZGVmYXVsdC5SYW5kb21PcmdTZW5kVGltZW91dEVycm9yO1xyXG5sZXQgUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yID0gRXJyb3JzLmRlZmF1bHQuUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yO1xyXG5cclxuZXhwb3J0IHtcclxuICAgIFJhbmRvbU9yZ0NsaWVudCBhcyBkZWZhdWx0LFxyXG4gICAgUmFuZG9tT3JnQ2xpZW50LFxyXG4gICAgUmFuZG9tT3JnQ2FjaGUsXHJcbiAgICBSYW5kb21PcmdCYWRIVFRQUmVzcG9uc2VFcnJvcixcclxuICAgIFJhbmRvbU9yZ0luc3VmZmljaWVudEJpdHNFcnJvcixcclxuICAgIFJhbmRvbU9yZ0luc3VmZmljaWVudFJlcXVlc3RzRXJyb3IsXHJcbiAgICBSYW5kb21PcmdKU09OUlBDRXJyb3IsXHJcbiAgICBSYW5kb21PcmdLZXlOb3RSdW5uaW5nRXJyb3IsXHJcbiAgICBSYW5kb21PcmdSQU5ET01PUkdFcnJvcixcclxuICAgIFJhbmRvbU9yZ1NlbmRUaW1lb3V0RXJyb3IsXHJcbiAgICBSYW5kb21PcmdDYWNoZUVtcHR5RXJyb3JcclxufTsiLCIndXNlIHN0cmljdCc7XHJcbmltcG9ydCBSYW5kb21PcmdDbGllbnQsICogYXMgZXJyb3JzIGZyb20gJy4uL2xpYi9lc20vaW5kZXguanMnO1xyXG4vKiBub2RlLWltcG9ydCAqL1xyXG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICdjaGFpJztcclxuLyogZW5kLW5vZGUtaW1wb3J0ICovXHJcblxyXG4vLyBBZGQgdGhlIEFQSSBrZXkgdG8gYmUgdXNlZCBmb3IgdGVzdGluZyBoZXJlOlxyXG5jb25zdCBhcGlLZXkgPSAnWU9VUl9BUElfS0VZX0hFUkUnO1xyXG5jb25zdCByb2MgPSBuZXcgUmFuZG9tT3JnQ2xpZW50KGFwaUtleSk7XHJcblxyXG4vLyBJZiB0aGlzIGlzIHNldCB0byB0cnVlLCBvdXRwdXQgZnJvbSBlYWNoIHRlc3Qgd2lsbCBiZSBsb2dnZWRcclxuLy8gdG8gdGhlIGNvbnNvbGUsIGUuZy4gdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHNlcnZlciBvciB0aGVcclxuLy8gbWVzc2FnZSBvZiBhbiBlcnJvciB0aGF0IHdhcyB0aHJvd24uXHJcbmNvbnN0IGxvZ1Jlc3BvbnNlcyA9IHRydWU7XHJcblxyXG4vLyBQYXJhbWV0ZXIgdmFsdWVzIHdoaWNoIGFyZSB1c2VkIGFjcm9zcyBtdWx0aXBsZSB0ZXN0c1xyXG5jb25zdCBsZW5ndGggPSBbIDMsIDQsIDUsIDYgXTtcclxuY29uc3QgbWluID0gWyAwLCAxMCwgMjAsIDMwIF07XHJcbmNvbnN0IG1heCA9IFsgNDAsIDUwLCA2MCwgNzAgXTtcclxuY29uc3QgcmVwbGFjZW1lbnQgPSBbIGZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZSBdO1xyXG5jb25zdCBiYXNlID0gWyAyLCA4LCAxMCwgMTYgXTtcclxuY29uc3QgY2hhcmFjdGVycyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eic7XHJcbmNvbnN0IGRhdGUgPSB7ICdkYXRlJzogJzIwMTAtMTItMzEnfTtcclxuY29uc3QgaWQgPSB7ICdpZCc6ICdmb28nfTtcclxuY29uc3QgdXNlckRhdGEgPSB7ICdmb28nOiAnYmFyJ307XHJcbmNvbnN0IGJhc2U2NCA9IFJhbmRvbU9yZ0NsaWVudC5CTE9CX0ZPUk1BVF9CQVNFNjQ7XHJcbmNvbnN0IGhleCA9IFJhbmRvbU9yZ0NsaWVudC5CTE9CX0ZPUk1BVF9IRVg7XHJcbmNvbnN0IGNhY2hlU2l6ZSA9IDQ7XHJcblxyXG4vLyBNb25pdG9yIHJlcXVlc3RzL2JpdHMgdXNlZCBieSB0aGUgdGVzdHNcclxubGV0IHJlcXVlc3RzID0gMDtcclxubGV0IGJpdHMgPSAwO1xyXG5cclxuKGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgcmVxdWVzdHMgPSBhd2FpdCByb2MuZ2V0UmVxdWVzdHNMZWZ0KCk7XHJcbiAgICBiaXRzID0gYXdhaXQgcm9jLmdldEJpdHNMZWZ0KCk7XHJcbn0pKCk7XHJcblxyXG4vLyAnbW9jaGEnIHRlc3Qgc3VpdGVzOiBFcnJvcnMsIEdlbmVyYWwsIEJhc2ljLCBTaWduZWQgYW5kIENhY2hlXHJcbmRlc2NyaWJlKCdFcnJvcnMnLCBmdW5jdGlvbigpIHtcclxuICAgIGl0KCdSYW5kb21PcmdSQU5ET01PUkdFcnJvciAyMDI6IHBhcmFtZXRlciBvdXQgb2YgcmFuZ2UnLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCByb2MuZ2VuZXJhdGVJbnRlZ2VycygxMDAwMDAsIDAsIDEwKTtcclxuICAgICAgICAgICAgYXNzZXJ0LmZhaWwoJ1Nob3VsZCBoYXZlIHRocm93biBSYW5kb21PcmdSQU5ET01PUkdFcnJvciAyMDIuJyk7XHJcbiAgICAgICAgfSBjYXRjaChlKSB7XHJcbiAgICAgICAgICAgIGlmIChsb2dSZXNwb25zZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXNzZXJ0KGUgaW5zdGFuY2VvZiBlcnJvcnMuUmFuZG9tT3JnUkFORE9NT1JHRXJyb3JcclxuICAgICAgICAgICAgICAgICYmIGUuZ2V0Q29kZSgpID09IDIwMiwgJ1Nob3VsZCBoYXZlIHRocm93biBSYW5kb21PcmdSQU5ET01PUkdFcnJvciAnXHJcbiAgICAgICAgICAgICAgICArICcyMDIsIGluc3RlYWQgdGhyZXcgJyArIGUubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ1JhbmRvbU9yZ1JBTkRPTU9SR0Vycm9yIDIwMzogcGFyYW1ldGVyIGlzIHRvbyBsb25nJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmdlbmVyYXRlSW50ZWdlclNlcXVlbmNlcygzLCBsZW5ndGgsIG1pbiwgbWF4KTtcclxuICAgICAgICAgICAgYXNzZXJ0LmZhaWwoJ1Nob3VsZCBoYXZlIHRocm93biBSYW5kb21PcmdSQU5ET01PUkdFcnJvciAyMDMuJyk7XHJcbiAgICAgICAgfSBjYXRjaChlKSB7XHJcbiAgICAgICAgICAgIGlmIChsb2dSZXNwb25zZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXNzZXJ0KGUgaW5zdGFuY2VvZiBlcnJvcnMuUmFuZG9tT3JnUkFORE9NT1JHRXJyb3JcclxuICAgICAgICAgICAgICAgICYmIGUuZ2V0Q29kZSgpID09IDIwMywgJ1Nob3VsZCBoYXZlIHRocm93biBSYW5kb21PcmdSQU5ET01PUkdFcnJvciAnXHJcbiAgICAgICAgICAgICAgICArICcyMDMsIGluc3RlYWQgdGhyZXcgJyArIGUubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ1JhbmRvbU9yZ1JBTkRPTU9SR0Vycm9yIDIwNDogcGFyYW1ldGVyIGlzIHRvbyBzaG9ydCcsIGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5nZW5lcmF0ZUludGVnZXJTZXF1ZW5jZXMoNCwgWzFdLCBtaW4sIG1heCk7XHJcbiAgICAgICAgICAgIGFzc2VydC5mYWlsKCdTaG91bGQgaGF2ZSB0aHJvd24gUmFuZG9tT3JnUkFORE9NT1JHRXJyb3IgMjA0LicpO1xyXG4gICAgICAgIH0gY2F0Y2goZSkge1xyXG4gICAgICAgICAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGFzc2VydChlIGluc3RhbmNlb2YgZXJyb3JzLlJhbmRvbU9yZ1JBTkRPTU9SR0Vycm9yXHJcbiAgICAgICAgICAgICAgICAmJiBlLmdldENvZGUoKSA9PSAyMDQsICdTaG91bGQgaGF2ZSB0aHJvd24gUmFuZG9tT3JnUkFORE9NT1JHRXJyb3IgJ1xyXG4gICAgICAgICAgICAgICAgKyAnMjA0LCBpbnN0ZWFkIHRocmV3ICcgKyBlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdSYW5kb21PcmdSQU5ET01PUkdFcnJvciAzMDA6IHBhcmFtZXRlciBtdXN0IGJlIGxlc3MgdGhhbiBhbm90aGVyJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmdlbmVyYXRlSW50ZWdlcnMoMTAsIDEwLCAwKTtcclxuICAgICAgICAgICAgYXNzZXJ0LmZhaWwoJ1Nob3VsZCBoYXZlIHRocm93biBSYW5kb21PcmdSQU5ET01PUkdFcnJvciAzMDAuJyk7XHJcblxyXG4gICAgICAgIH0gY2F0Y2goZSkge1xyXG4gICAgICAgICAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGFzc2VydChlIGluc3RhbmNlb2YgZXJyb3JzLlJhbmRvbU9yZ1JBTkRPTU9SR0Vycm9yXHJcbiAgICAgICAgICAgICAgICAmJiBlLmdldENvZGUoKSA9PSAzMDAsICdTaG91bGQgaGF2ZSB0aHJvd24gUmFuZG9tT3JnUkFORE9NT1JHRXJyb3IgJ1xyXG4gICAgICAgICAgICAgICAgKyAnMzAwLCBpbnN0ZWFkIHRocmV3ICcgKyBlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdSYW5kb21PcmdSQU5ET01PUkdFcnJvciAzMDE6IHJlcGxhY2VtZW50L2RvbWFpbiBlcnJvcicsIGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5nZW5lcmF0ZUludGVnZXJzKDIwLCAwLCA5LCB7cmVwbGFjZW1lbnQ6IGZhbHNlfSk7XHJcbiAgICAgICAgICAgIGFzc2VydC5mYWlsKCdTaG91bGQgaGF2ZSB0aHJvd24gUmFuZG9tT3JnUkFORE9NT1JHRXJyb3IgMzAxLicpO1xyXG4gICAgICAgIH0gY2F0Y2goZSkge1xyXG4gICAgICAgICAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGFzc2VydChlIGluc3RhbmNlb2YgZXJyb3JzLlJhbmRvbU9yZ1JBTkRPTU9SR0Vycm9yXHJcbiAgICAgICAgICAgICAgICAmJiBlLmdldENvZGUoKSA9PSAzMDEsICdTaG91bGQgaGF2ZSB0aHJvd24gUmFuZG9tT3JnUkFORE9NT1JHRXJyb3IgJ1xyXG4gICAgICAgICAgICAgICAgKyAnMzAxLCBpbnN0ZWFkIHRocmV3ICcgKyBlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdSYW5kb21PcmdSQU5ET01PUkdFcnJvciA0MDA6IEFQSSBrZXkgZG9lcyBub3QgZXhpc3QnLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICBsZXQgcm9jMiA9IG5ldyBSYW5kb21PcmdDbGllbnQoJ2ZmZmZmZmZmLWZmZmYtZmZmZi1mZmZmLWZmZmZmZmZmZmZmZicpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCByb2MyLmdlbmVyYXRlSW50ZWdlcnMoNSwgMCwgMTApO1xyXG4gICAgICAgICAgICBhc3NlcnQuZmFpbCgnU2hvdWxkIGhhdmUgdGhyb3duIFJhbmRvbU9yZ1JBTkRPTU9SR0Vycm9yIDQwMC4nKTtcclxuICAgICAgICB9IGNhdGNoKGUpIHtcclxuICAgICAgICAgICAgaWYgKGxvZ1Jlc3BvbnNlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhc3NlcnQoZSBpbnN0YW5jZW9mIGVycm9ycy5SYW5kb21PcmdSQU5ET01PUkdFcnJvclxyXG4gICAgICAgICAgICAgICAgJiYgZS5nZXRDb2RlKCkgPT0gNDAwLCAnU2hvdWxkIGhhdmUgdGhyb3duIFJhbmRvbU9yZ1JBTkRPTU9SR0Vycm9yICdcclxuICAgICAgICAgICAgICAgICsgJzQwMCwgaW5zdGVhZCB0aHJldyAnICsgZS5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnUmFuZG9tT3JnUkFORE9NT1JHRXJyb3IgNDIwOiB0aWNrZXQgZG9lcyBub3QgZXhpc3QnLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCByb2MuZ2VuZXJhdGVTaWduZWRVVUlEcygxLCB7IHRpY2tldElkOiAnZmZmZmZmZmZmZmZmZmZmZicgfSk7XHJcbiAgICAgICAgICAgIGFzc2VydC5mYWlsKCdTaG91bGQgaGF2ZSB0aHJvd24gUmFuZG9tT3JnUkFORE9NT1JHRXJyb3IgNDIwLicpO1xyXG4gICAgICAgIH0gY2F0Y2goZSkge1xyXG4gICAgICAgICAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGFzc2VydChlIGluc3RhbmNlb2YgZXJyb3JzLlJhbmRvbU9yZ1JBTkRPTU9SR0Vycm9yXHJcbiAgICAgICAgICAgICAgICAmJiBlLmdldENvZGUoKSA9PSA0MjAsICdTaG91bGQgaGF2ZSB0aHJvd24gUmFuZG9tT3JnUkFORE9NT1JHRXJyb3IgJ1xyXG4gICAgICAgICAgICAgICAgKyAnNDIwLCBpbnN0ZWFkIHRocmV3ICcgKyBlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdSYW5kb21PcmdSQU5ET01PUkdFcnJvciA0MjE6IHRpY2tldCBleGlzdHMsIGJ1dCBub3QgZm9yIHNwZWNpZmllZCBBUEkga2V5JywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmdlbmVyYXRlU2lnbmVkVVVJRHMoMSwgeyB0aWNrZXRJZDogJ2Q1YjhmNmQwM2Y5OWExMzQnIH0pO1xyXG4gICAgICAgICAgICBhc3NlcnQuZmFpbCgnU2hvdWxkIGhhdmUgdGhyb3duIFJhbmRvbU9yZ1JBTkRPTU9SR0Vycm9yIDQyMS4nKTtcclxuICAgICAgICB9IGNhdGNoKGUpIHtcclxuICAgICAgICAgICAgaWYgKGxvZ1Jlc3BvbnNlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhc3NlcnQoZSBpbnN0YW5jZW9mIGVycm9ycy5SYW5kb21PcmdSQU5ET01PUkdFcnJvclxyXG4gICAgICAgICAgICAgICAgJiYgZS5nZXRDb2RlKCkgPT0gNDIxLCAnU2hvdWxkIGhhdmUgdGhyb3duIFJhbmRvbU9yZ1JBTkRPTU9SR0Vycm9yICdcclxuICAgICAgICAgICAgICAgICsgJzQyMSwgaW5zdGVhZCB0aHJldyAnICsgZS5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnUmFuZG9tT3JnUkFORE9NT1JHRXJyb3IgNDIyOiB0aWNrZXQgaGFzIGFscmVhZHkgYmVlbiB1c2VkJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IHRpY2tldHMgPSBhd2FpdCByb2MuY3JlYXRlVGlja2V0cygxLCB0cnVlKTtcclxuICAgICAgICAgICAgbGV0IHRpY2tldElkID0gdGlja2V0c1swXS50aWNrZXRJZDtcclxuICAgICAgICAgICAgaWYgKGxvZ1Jlc3BvbnNlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3RpY2tldCBpZDogJyArIHRpY2tldElkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyB1c2UgdGlja2V0IGFuZCB0aGVuIGF0dGVtcHQgdG8gcmV1c2UgaXRcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmdlbmVyYXRlU2lnbmVkVVVJRHMoMSwgeyB0aWNrZXRJZDogdGlja2V0SWQgfSk7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZTIgPSBhd2FpdCByb2MuZ2VuZXJhdGVTaWduZWRVVUlEcygxLCB7IHRpY2tldElkOiB0aWNrZXRJZCB9KTtcclxuXHJcbiAgICAgICAgICAgIGFzc2VydC5mYWlsKCdTaG91bGQgaGF2ZSB0aHJvd24gUmFuZG9tT3JnUkFORE9NT1JHRXJyb3IgNDIyLicpO1xyXG4gICAgICAgIH0gY2F0Y2goZSkge1xyXG4gICAgICAgICAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGFzc2VydChlIGluc3RhbmNlb2YgZXJyb3JzLlJhbmRvbU9yZ1JBTkRPTU9SR0Vycm9yXHJcbiAgICAgICAgICAgICAgICAmJiBlLmdldENvZGUoKSA9PSA0MjIpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdSYW5kb21PcmdSQU5ET01PUkdFcnJvciA0MjY6IHRpY2tldCBoYXMgbm90IHlldCBiZWVuIHVzZWQnLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICBsZXQgdGlja2V0ID0gYXdhaXQgcm9jLmNyZWF0ZVRpY2tldHMoMSwgZmFsc2UpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgcm9jLnJldmVhbFRpY2tldHModGlja2V0WzBdLnRpY2tldElkKTtcclxuICAgICAgICAgICAgYXNzZXJ0LmZhaWwoJ1Nob3VsZCBoYXZlIHRocm93biBSYW5kb21PcmdSQU5ET01PUkdFcnJvciA0MjYuJyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBhc3NlcnQoZSBpbnN0YW5jZW9mIGVycm9ycy5SYW5kb21PcmdSQU5ET01PUkdFcnJvclxyXG4gICAgICAgICAgICAgICAgJiYgZS5nZXRDb2RlKCkgPT0gNDI2LCAnU2hvdWxkIGhhdmUgdGhyb3duIFJhbmRvbU9yZ1JBTkRPTU9SR0Vycm9yICdcclxuICAgICAgICAgICAgICAgICsgJzQyNiwgaW5zdGVhZCB0aHJldyAnICsgZS5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufSk7XHJcblxyXG5kZXNjcmliZSgnR2VuZXJhbCcsIGZ1bmN0aW9uKCkge1xyXG4gICAgaXQoJ3JldXNpbmcgYW4gQVBJIGtleSByZXR1cm5zIGEgcHJldmlvdXNseSBjcmVhdGVkIGluc3RhbmNlJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgbGV0IHJvYzIgPSBuZXcgUmFuZG9tT3JnQ2xpZW50KGFwaUtleSk7XHJcbiAgICAgICAgYXNzZXJ0KHJvYyA9PSByb2MyLCAnRXJyb3I6IGRpZCBub3QgcmV0dXJuIHRoZSBzYW1lIGluc3RhbmNlLicpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ2EgZGlmZmVyZW50IEFQSSBrZXkgcmV0dXJucyBhIG5ldyBpbnN0YW5jZScsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGxldCByb2MyID0gbmV3IFJhbmRvbU9yZ0NsaWVudCgnZmZmZmZmZmYtZmZmZi1mZmZmLWZmZmYtZmZmZmZmZmZmZmZmJyk7XHJcbiAgICAgICAgYXNzZXJ0KHJvYyAhPSByb2MyLCAnRXJyb3I6IHJldHVybmVkIHRoZSBzYW1lIGluc3RhbmNlLicpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ2dldFJlcXVlc3RzTGVmdCgpJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmdldFJlcXVlc3RzTGVmdCgpO1xyXG4gICAgICAgIGFzc2VydChyZXNwb25zZSA+PSAwLCAnRXJyb3I6IHNob3VsZCBoYXZlIHJldHVybmVkIGEgbnVtYmVyICdcclxuICAgICAgICAgICAgKyAnID49IDAsIGluc3RlYWQgcmV0dW5lZCAnICsgcmVzcG9uc2UpO1xyXG4gICAgICAgIGlmIChsb2dSZXNwb25zZXMpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ3JlcXVlc3RzIHJlbWFpbmluZzogJyArIHJlc3BvbnNlKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnZ2V0Qml0c0xlZnQoKScsIGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5nZXRCaXRzTGVmdCgpO1xyXG4gICAgICAgIGFzc2VydChyZXNwb25zZSA+PSAwLCAnRXJyb3I6IHNob3VsZCBoYXZlIHJldHVybmVkIGEgbnVtYmVyICdcclxuICAgICAgICAgICAgKyAnID49IDAsIGluc3RlYWQgcmV0dW5lZCAnICsgcmVzcG9uc2UpO1xyXG4gICAgICAgIGlmIChsb2dSZXNwb25zZXMpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ2JpdHMgcmVtYWluaW5nOiAnICsgcmVzcG9uc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59KVxyXG5cclxuZGVzY3JpYmUoJ0Jhc2ljJywgZnVuY3Rpb24oKSB7XHJcbiAgICBkZXNjcmliZSgnSW50ZWdlcnMnLCBmdW5jdGlvbigpIHtcclxuICAgICAgICBpdCgnZGVjaW1hbCBpbnRlZ2VycycsIGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCByb2MuZ2VuZXJhdGVJbnRlZ2Vycyg1LCAwLCAxMCk7XHJcblxyXG4gICAgICAgICAgICBhc3NlcnQocmVzcG9uc2UuZXZlcnkodmFsID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJztcclxuICAgICAgICAgICAgfSksICdFcnJvcjogc2hvdWxkIGhhdmUgcmV0dXJuZWQgYW4gYXJyYXkgb2YgbnVtYmVycy4nKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChsb2dSZXNwb25zZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdkZWNpbWFsIGludGVnZXJzOiAnICsgcmVzcG9uc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGl0KCdwcmVnZW5lcmF0ZWQgZGVjaW1hbCBpbnRlZ2VycyAoZGF0ZSknLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmdlbmVyYXRlSW50ZWdlcnMoNSwgMCwgMTAsIHsgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbjogZGF0ZSB9KVxyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UyID0gYXdhaXQgcm9jLmdlbmVyYXRlSW50ZWdlcnMoNSwgMCwgMTAsIHsgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbjogZGF0ZSB9KTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGFzc2VydC5kZWVwRXF1YWwocmVzcG9uc2UsIHJlc3BvbnNlMik7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygncHJlZ2VuZXJhdGVkIGRlY2ltYWwgaW50ZWdlcnMgKGRhdGUpOiAnXHJcbiAgICAgICAgICAgICAgICAgICAgKyByZXNwb25zZSArICcgLyAnICsgcmVzcG9uc2UyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpdCgncHJlZ2VuZXJhdGVkIGRlY2ltYWwgaW50ZWdlcnMgKGlkKScsIGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCByb2MuZ2VuZXJhdGVJbnRlZ2Vycyg1LCAwLCAxMCwgeyBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBpZCB9KTtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlMiA9IGF3YWl0IHJvYy5nZW5lcmF0ZUludGVnZXJzKDUsIDAsIDEwLCB7IHByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb246IGlkIH0pO1xyXG5cclxuICAgICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXNwb25zZSwgcmVzcG9uc2UyKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChsb2dSZXNwb25zZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdwcmVnZW5lcmF0ZWQgZGVjaW1hbCBpbnRlZ2VycyAoaWQpOiAnICsgcmVzcG9uc2VcclxuICAgICAgICAgICAgICAgICAgICArICcgLyAnICsgcmVzcG9uc2UyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpdCgnbm9uLWRlY2ltYWwgaW50ZWdlcnMnLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmdlbmVyYXRlSW50ZWdlcnMoNSwgMCwgMTAsIHsgcmVwbGFjZW1lbnQ6IGZhbHNlLCBiYXNlOiAyIH0pO1xyXG5cclxuICAgICAgICAgICAgYXNzZXJ0KHJlc3BvbnNlLmV2ZXJ5KHZhbCA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZyc7XHJcbiAgICAgICAgICAgIH0pLCAnRXJyb3I6IHNob3VsZCBoYXZlIHJldHVybmVkIGFuIGFycmF5IG9mIHN0cmluZ3MuJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnbm9uLWRlY2ltYWwgaW50ZWdlcnM6ICcgKyByZXNwb25zZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaXQoJ3ByZWdlbmVyYXRlZCBub24tZGVjaW1hbCBpbnRlZ2VycyAoZGF0ZSknLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmdlbmVyYXRlSW50ZWdlcnMoNSwgMCwgMTAsIHsgcmVwbGFjZW1lbnQ6IGZhbHNlLCBiYXNlOiAyLCBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBkYXRlIH0pO1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UyID0gYXdhaXQgcm9jLmdlbmVyYXRlSW50ZWdlcnMoNSwgMCwgMTAsIHsgcmVwbGFjZW1lbnQ6IGZhbHNlLCBiYXNlOiAyLCBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBkYXRlIH0pO1xyXG5cclxuICAgICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXNwb25zZSwgcmVzcG9uc2UyKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChsb2dSZXNwb25zZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdwcmVnZW5lcmF0ZWQgbm9uLWRlY2ltYWwgaW50ZWdlcnMgKGRhdGUpOiAnXHJcbiAgICAgICAgICAgICAgICAgICAgKyByZXNwb25zZSArICcgLyAnICsgcmVzcG9uc2UyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpdCgncHJlZ2VuZXJhdGVkIG5vbi1kZWNpbWFsIGludGVnZXJzIChpZCknLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmdlbmVyYXRlSW50ZWdlcnMoNSwgMCwgMTAsIHsgcmVwbGFjZW1lbnQ6IGZhbHNlLCBiYXNlOiAyLCBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBpZCB9KTtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlMiA9IGF3YWl0IHJvYy5nZW5lcmF0ZUludGVnZXJzKDUsIDAsIDEwLCB7IHJlcGxhY2VtZW50OiBmYWxzZSwgYmFzZTogMiwgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbjogaWQgfSk7XHJcblxyXG4gICAgICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3BvbnNlLCByZXNwb25zZTIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGxvZ1Jlc3BvbnNlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3ByZWdlbmVyYXRlZCBub24tZGVjaW1hbCBpbnRlZ2VycyAoaWQpOiAnXHJcbiAgICAgICAgICAgICAgICAgICAgKyByZXNwb25zZSArICcgLyAnICsgcmVzcG9uc2UyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZGVzY3JpYmUoJ0ludGVnZXIgU2VxdWVuY2VzJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaXQoJ3VuaWZvcm0gZGVjaW1hbCBpbnRlZ2VyIHNlcXVlbmNlcycsIGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCByb2MuZ2VuZXJhdGVJbnRlZ2VyU2VxdWVuY2VzKDMsIDUsIDAsIDEwKTtcclxuXHJcbiAgICAgICAgICAgIGFzc2VydChyZXNwb25zZS5ldmVyeShzZXF1ZW5jZSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VxdWVuY2UuZXZlcnkoaW50ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGludCA9PT0gJ251bWJlcic7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSksICdFcnJvcjogc2hvdWxkIGhhdmUgcmV0dXJuZWQgYSAyRCBhcnJheSBvZiBudW1iZXJzLicpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGxvZ1Jlc3BvbnNlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3VuaWZvcm0gZGVjaW1hbCBpbnRlZ2VyIHNlcXVlbmNlczogJyk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLnRhYmxlKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpdCgndW5pZm9ybSBwcmVnZW5lcmF0ZWQgZGVjaW1hbCBpbnRlZ2VyIHNlcXVlbmNlcyAoZGF0ZSknLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmdlbmVyYXRlSW50ZWdlclNlcXVlbmNlcygzLCA1LCAwLCAxMCwgeyBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBkYXRlIH0pO1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UyID0gYXdhaXQgcm9jLmdlbmVyYXRlSW50ZWdlclNlcXVlbmNlcygzLCA1LCAwLCAxMCwgeyBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBkYXRlIH0pO1xyXG5cclxuICAgICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXNwb25zZSwgcmVzcG9uc2UyKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChsb2dSZXNwb25zZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd1bmlmb3JtIHByZWdlbmVyYXRlZCBkZWNpbWFsIGludGVnZXJzIHNlcXVlbmNlcyAoZGF0ZSk6ICcpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS50YWJsZShyZXNwb25zZSk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLnRhYmxlKHJlc3BvbnNlMilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpdCgndW5pZm9ybSBwcmVnZW5lcmF0ZWQgZGVjaW1hbCBpbnRlZ2VyIHNlcXVlbmNlcyAoaWQpJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5nZW5lcmF0ZUludGVnZXJTZXF1ZW5jZXMoMywgNSwgMCwgMTAsIHsgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbjogaWQgfSk7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZTIgPSBhd2FpdCByb2MuZ2VuZXJhdGVJbnRlZ2VyU2VxdWVuY2VzKDMsIDUsIDAsIDEwLCB7IHByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb246IGlkIH0pO1xyXG5cclxuICAgICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXNwb25zZSwgcmVzcG9uc2UyKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChsb2dSZXNwb25zZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd1bmlmb3JtIHByZWdlbmVyYXRlZCBkZWNpbWFsIGludGVnZXJzIHNlcXVlbmNlcyAoaWQpOiAnKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUudGFibGUocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS50YWJsZShyZXNwb25zZTIpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaXQoJ3VuaWZvcm0gbm9uLWRlY2ltYWwgaW50ZWdlcnMnLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmdlbmVyYXRlSW50ZWdlclNlcXVlbmNlcygzLCA1LCAwLCAxMCwgeyBiYXNlOiAyIH0pO1xyXG5cclxuICAgICAgICAgICAgYXNzZXJ0KHJlc3BvbnNlLmV2ZXJ5KHNlcXVlbmNlID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBzZXF1ZW5jZS5ldmVyeShpbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgaW50ID09PSAnc3RyaW5nJztcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KSwgJ0Vycm9yOiBzaG91bGQgaGF2ZSByZXR1cm5lZCBhIDJEIGFycmF5IG9mIHN0cmluZ3MuJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndW5pZm9ybSBub24tZGVjaW1hbCBpbnRlZ2VyIHNlcXVlbmNlczogJyk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLnRhYmxlKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpdCgndW5pZm9ybSBwcmVnZW5lcmF0ZWQgbm9uLWRlY2ltYWwgaW50ZWdlciBzZXF1ZW5jZXMgKGRhdGUpJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5nZW5lcmF0ZUludGVnZXJTZXF1ZW5jZXMoMywgNSwgMCwgMTAsIHsgYmFzZTogMiwgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbjogZGF0ZSB9KTtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlMiA9IGF3YWl0IHJvYy5nZW5lcmF0ZUludGVnZXJTZXF1ZW5jZXMoMywgNSwgMCwgMTAsIHsgYmFzZTogMiwgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbjogZGF0ZSB9KTtcclxuXHJcbiAgICAgICAgICAgIGFzc2VydC5kZWVwRXF1YWwocmVzcG9uc2UsIHJlc3BvbnNlMik7XHJcblxyXG4gICAgICAgICAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndW5pZm9ybSBwcmVnZW5lcmF0ZWQgbm9uLWRlY2ltYWwgaW50ZWdlcnMgc2VxdWVuY2VzIChkYXRlKTogJyk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLnRhYmxlKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUudGFibGUocmVzcG9uc2UyKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGl0KCd1bmlmb3JtIHByZWdlbmVyYXRlZCBub24tZGVjaW1hbCBpbnRlZ2VyIHNlcXVlbmNlcyAoaWQpJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5nZW5lcmF0ZUludGVnZXJTZXF1ZW5jZXMoMywgNSwgMCwgMTAsIHsgYmFzZTogMiwgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbjogaWQgfSk7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZTIgPSBhd2FpdCByb2MuZ2VuZXJhdGVJbnRlZ2VyU2VxdWVuY2VzKDMsIDUsIDAsIDEwLCB7IGJhc2U6IDIsIHByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb246IGlkIH0pO1xyXG5cclxuICAgICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXNwb25zZSwgcmVzcG9uc2UyKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChsb2dSZXNwb25zZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd1bmlmb3JtIHByZWdlbmVyYXRlZCBub24tZGVjaW1hbCBpbnRlZ2VycyBzZXF1ZW5jZXMgKGlkKTogJyk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLnRhYmxlKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUudGFibGUocmVzcG9uc2UyKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGl0KCdtdWx0aWZvcm0gaW50ZWdlciBzZXF1ZW5jZXMnLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmdlbmVyYXRlSW50ZWdlclNlcXVlbmNlcyg0LCBsZW5ndGgsIG1pbiwgbWF4LCB7IHJlcGxhY2VtZW50OiByZXBsYWNlbWVudCwgYmFzZTogYmFzZSB9KTtcclxuXHJcbiAgICAgICAgICAgIGFzc2VydChyZXNwb25zZS5ldmVyeSgoc2VxdWVuY2UsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VxdWVuY2UuZXZlcnkodmFsID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IGJhc2VbaW5kZXhdID09IDEwID8gJ251bWJlcicgOiAnc3RyaW5nJztcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gdHlwZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KSwgJ0Vycm9yOiB0aGUgdHlwZSBvZiB0aGUgdmFsdWVzIGluIHRoZSAyRCBhcnJheSB3YXMgbm90IGFzIGV4cGVjdGVkLicpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGxvZ1Jlc3BvbnNlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ211bHRpZm9ybSBpbnRlZ2VyIHNlcXVlbmNlczogJyk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLnRhYmxlKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpdCgnbXVsdGlmb3JtIHByZWdlbmVyYXRlZCBpbnRlZ2VyIHNlcXVlbmNlcyAoZGF0ZSknLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmdlbmVyYXRlSW50ZWdlclNlcXVlbmNlcyg0LCBsZW5ndGgsIG1pbiwgbWF4LCB7IHJlcGxhY2VtZW50OiByZXBsYWNlbWVudCwgYmFzZTogYmFzZSwgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbjogZGF0ZSB9KTtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlMiA9IGF3YWl0IHJvYy5nZW5lcmF0ZUludGVnZXJTZXF1ZW5jZXMoNCwgbGVuZ3RoLCBtaW4sIG1heCwgeyByZXBsYWNlbWVudDogcmVwbGFjZW1lbnQsIGJhc2U6IGJhc2UsIHByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb246IGRhdGUgfSk7XHJcblxyXG4gICAgICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3BvbnNlLCByZXNwb25zZTIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGxvZ1Jlc3BvbnNlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ211bHRpZm9ybSBwcmVnZW5lcmF0ZWQgaW50ZWdlcnMgc2VxdWVuY2VzIChkYXRlKTogJyk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLnRhYmxlKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUudGFibGUocmVzcG9uc2UyKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGl0KCdtdWx0aWZvcm0gcHJlZ2VuZXJhdGVkIGludGVnZXIgc2VxdWVuY2VzIChpZCknLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmdlbmVyYXRlSW50ZWdlclNlcXVlbmNlcyg0LCBsZW5ndGgsIG1pbiwgbWF4LCB7IHJlcGxhY2VtZW50OiByZXBsYWNlbWVudCwgYmFzZTogYmFzZSwgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbjogaWQgfSk7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZTIgPSBhd2FpdCByb2MuZ2VuZXJhdGVJbnRlZ2VyU2VxdWVuY2VzKDQsIGxlbmd0aCwgbWluLCBtYXgsIHsgcmVwbGFjZW1lbnQ6IHJlcGxhY2VtZW50LCBiYXNlOiBiYXNlLCBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBpZCB9KTtcclxuXHJcbiAgICAgICAgICAgIGFzc2VydC5kZWVwRXF1YWwocmVzcG9uc2UsIHJlc3BvbnNlMik7XHJcblxyXG4gICAgICAgICAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnbXVsdGlmb3JtIHByZWdlbmVyYXRlZCBpbnRlZ2VycyBzZXF1ZW5jZXMgKGlkKTogJyk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLnRhYmxlKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUudGFibGUocmVzcG9uc2UyKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBkZXNjcmliZSgnRGVjaW1hbCBGcmFjdGlvbnMnLCBmdW5jdGlvbigpIHtcclxuICAgICAgICBpdCgnZGVjaW1hbCBmcmFjdGlvbnMnLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmdlbmVyYXRlRGVjaW1hbEZyYWN0aW9ucyg1LCA0LCB7IHJlcGxhY2VtZW50OiBmYWxzZSB9KTtcclxuXHJcbiAgICAgICAgICAgIGFzc2VydChyZXNwb25zZS5ldmVyeSh2YWwgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdudW1iZXInO1xyXG4gICAgICAgICAgICB9KSwgJ0Vycm9yOiBzaG91bGQgaGF2ZSByZXR1cm5lZCBhbiBhcnJheSBvZiBudW1iZXJzLicpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGxvZ1Jlc3BvbnNlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2RlY2ltYWwgZnJhY3Rpb25zOiAnICsgcmVzcG9uc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGl0KCdwcmVnZW5lcmF0ZWQgZGVjaW1hbCBmcmFjdGlvbnMgKGRhdGUpJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5nZW5lcmF0ZURlY2ltYWxGcmFjdGlvbnMoNSwgNCwgeyBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBkYXRlIH0pO1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UyID0gYXdhaXQgcm9jLmdlbmVyYXRlRGVjaW1hbEZyYWN0aW9ucyg1LCA0LCB7IHByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb246IGRhdGUgfSk7XHJcblxyXG4gICAgICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3BvbnNlLCByZXNwb25zZTIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGxvZ1Jlc3BvbnNlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3ByZWdlbmVyYXRlZCBkZWNpbWFsIGZyYWN0aW9ucyAoZGF0ZSk6ICdcclxuICAgICAgICAgICAgICAgICAgICArIHJlc3BvbnNlICsgJyAvICcgKyByZXNwb25zZTIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGl0KCdwcmVnZW5lcmF0ZWQgZGVjaW1hbCBmcmFjdGlvbnMgKGlkKScsIGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCByb2MuZ2VuZXJhdGVEZWNpbWFsRnJhY3Rpb25zKDUsIDQsIHsgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbjogaWQgfSk7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZTIgPSBhd2FpdCByb2MuZ2VuZXJhdGVEZWNpbWFsRnJhY3Rpb25zKDUsIDQsIHsgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbjogaWQgfSk7XHJcblxyXG4gICAgICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3BvbnNlLCByZXNwb25zZTIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGxvZ1Jlc3BvbnNlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3ByZWdlbmVyYXRlZCBkZWNpbWFsIGZyYWN0aW9ucyAoaWQpOiAnXHJcbiAgICAgICAgICAgICAgICAgICAgKyByZXNwb25zZSArICcgLyAnICsgcmVzcG9uc2UyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZGVzY3JpYmUoJ0dhdXNzaWFucycsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGl0KCdnYXVzc2lhbnMnLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmdlbmVyYXRlR2F1c3NpYW5zKDUsIDMuNDEsIDIuMSwgNCk7XHJcblxyXG4gICAgICAgICAgICBhc3NlcnQocmVzcG9uc2UuZXZlcnkodmFsID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJztcclxuICAgICAgICAgICAgfSksICdFcnJvcjogc2hvdWxkIGhhdmUgcmV0dXJuZWQgYW4gYXJyYXkgb2YgbnVtYmVycy4nKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChsb2dSZXNwb25zZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdnYXVzc2lhbnM6ICcgKyByZXNwb25zZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaXQoJ3ByZWdlbmVyYXRlZCBnYXVzc2lhbnMgKGRhdGUpJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5nZW5lcmF0ZUdhdXNzaWFucyg1LCAzLjQxLCAyLjEsIDQsIHsgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbjogZGF0ZSB9KTtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlMiA9IGF3YWl0IHJvYy5nZW5lcmF0ZUdhdXNzaWFucyg1LCAzLjQxLCAyLjEsIDQsIHsgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbjogZGF0ZSB9KTtcclxuXHJcbiAgICAgICAgICAgIGFzc2VydC5kZWVwRXF1YWwocmVzcG9uc2UsIHJlc3BvbnNlMik7XHJcblxyXG4gICAgICAgICAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygncHJlZ2VuZXJhdGVkIGdhdXNzaWFucyAoZGF0ZSk6ICdcclxuICAgICAgICAgICAgICAgICAgICArIHJlc3BvbnNlICsgJyAvICcgKyByZXNwb25zZTIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGl0KCdwcmVnZW5lcmF0ZWQgZ2F1c3NpYW5zIChpZCknLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmdlbmVyYXRlR2F1c3NpYW5zKDUsIDMuNDEsIDIuMSwgNCwgeyBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBpZCB9KTtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlMiA9IGF3YWl0IHJvYy5nZW5lcmF0ZUdhdXNzaWFucyg1LCAzLjQxLCAyLjEsIDQsIHsgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbjogaWQgfSk7XHJcblxyXG4gICAgICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3BvbnNlLCByZXNwb25zZTIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGxvZ1Jlc3BvbnNlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3ByZWdlbmVyYXRlZCBnYXVzc2lhbnMgKGlkKTogJ1xyXG4gICAgICAgICAgICAgICAgICAgICsgcmVzcG9uc2UgKyAnIC8gJyArIHJlc3BvbnNlMik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGRlc2NyaWJlKCdTdHJpbmdzJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaXQoJ3N0cmluZ3MsIGxvd2VyY2FzZSBFbmdsaXNoIGFscGhhYmV0JywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5nZW5lcmF0ZVN0cmluZ3MoMywgNSwgY2hhcmFjdGVycyk7XHJcblxyXG4gICAgICAgICAgICBhc3NlcnQocmVzcG9uc2UuZXZlcnkodmFsID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJztcclxuICAgICAgICAgICAgfSksICdFcnJvcjogc2hvdWxkIGhhdmUgcmV0dXJuZWQgYW4gYXJyYXkgb2Ygc3RyaW5ncy4nKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChsb2dSZXNwb25zZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzdHJpbmdzLCBsb3dlcmNhc2UgRW5nbGlzaCBhbHBoYWJldDogJyArIHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpdCgncHJlZ2VuZXJhdGVkIHN0cmluZ3MsIGxvd2VyY2FzZSBFbmdsaXNoIGFscGhhYmV0IChkYXRlKScsIGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCByb2MuZ2VuZXJhdGVTdHJpbmdzKDMsIDUsIGNoYXJhY3RlcnMsIHsgcmVwbGFjZW1lbnQ6IGZhbHNlLCBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBkYXRlIH0pO1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UyID0gYXdhaXQgcm9jLmdlbmVyYXRlU3RyaW5ncygzLCA1LCBjaGFyYWN0ZXJzLCB7IHJlcGxhY2VtZW50OiBmYWxzZSwgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbjogZGF0ZSB9KTtcclxuXHJcbiAgICAgICAgICAgIGFzc2VydC5kZWVwRXF1YWwocmVzcG9uc2UsIHJlc3BvbnNlMik7XHJcblxyXG4gICAgICAgICAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygncHJlZ2VuZXJhdGVkIHN0cmluZ3MsIGxvd2VyY2FzZSBFbmdsaXNoIGFscGhhYmV0IChkYXRlKTogJ1xyXG4gICAgICAgICAgICAgICAgICAgICsgcmVzcG9uc2UgKyAnIC8gJyArIHJlc3BvbnNlMik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaXQoJ3ByZWdlbmVyYXRlZCBzdHJpbmdzLCBsb3dlcmNhc2UgRW5nbGlzaCBhbHBoYWJldCAoaWQpJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5nZW5lcmF0ZVN0cmluZ3MoMywgNSwgY2hhcmFjdGVycywgeyByZXBsYWNlbWVudDogZmFsc2UsIHByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb246IGlkIH0pO1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UyID0gYXdhaXQgcm9jLmdlbmVyYXRlU3RyaW5ncygzLCA1LCBjaGFyYWN0ZXJzLCB7IHJlcGxhY2VtZW50OiBmYWxzZSwgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbjogaWQgfSk7XHJcblxyXG4gICAgICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3BvbnNlLCByZXNwb25zZTIpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGxvZ1Jlc3BvbnNlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3ByZWdlbmVyYXRlZCBzdHJpbmdzLCBsb3dlcmNhc2UgRW5nbGlzaCBhbHBoYWJldCAoaWQpOiAnXHJcbiAgICAgICAgICAgICAgICAgICAgKyByZXNwb25zZSArICcgLyAnICsgcmVzcG9uc2UyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZGVzY3JpYmUoJ1VVSURzJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaXQoJ1VVSURzJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5nZW5lcmF0ZVVVSURzKDMpO1xyXG5cclxuICAgICAgICAgICAgYXNzZXJ0KHJlc3BvbnNlLmV2ZXJ5KHZhbCA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNVVUlEKHZhbCk7XHJcbiAgICAgICAgICAgIH0pLCAnRXJyb3I6IHNob3VsZCBoYXZlIHJldHVybmVkIGFuIGFycmF5IG9mIFVVSURzLicpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGxvZ1Jlc3BvbnNlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1VVSURzOiAnICsgcmVzcG9uc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGl0KCdwcmVnZW5lcmF0ZWQgVVVJRHMgKGRhdGUpJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5nZW5lcmF0ZVVVSURzKDMsIHsgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbjogZGF0ZSB9KTtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlMiA9IGF3YWl0IHJvYy5nZW5lcmF0ZVVVSURzKDMsIHsgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbjogZGF0ZSB9KTtcclxuXHJcbiAgICAgICAgICAgIGFzc2VydC5kZWVwRXF1YWwocmVzcG9uc2UsIHJlc3BvbnNlMik7XHJcblxyXG4gICAgICAgICAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygncHJlZ2VuZXJhdGVkIFVVSURzIChkYXRlKTogJ1xyXG4gICAgICAgICAgICAgICAgICAgICsgcmVzcG9uc2UgKyAnIC8gJyArIHJlc3BvbnNlMik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaXQoJ3ByZWdlbmVyYXRlZCBVVUlEcyAoaWQpJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5nZW5lcmF0ZVVVSURzKDMsIHsgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbjogaWQgfSk7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZTIgPSBhd2FpdCByb2MuZ2VuZXJhdGVVVUlEcygzLCB7IHByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb246IGlkIH0pO1xyXG5cclxuICAgICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXNwb25zZSwgcmVzcG9uc2UyKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChsb2dSZXNwb25zZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdwcmVnZW5lcmF0ZWQgVVVJRHMgKGlkKTogJ1xyXG4gICAgICAgICAgICAgICAgICAgICsgcmVzcG9uc2UgKyAnIC8gJyArIHJlc3BvbnNlMik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGRlc2NyaWJlKCdCTE9CcycsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGl0KCdCTE9CcywgMTI4LWJpdCwgYmFzZTY0JywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5nZW5lcmF0ZUJsb2JzKDMsIDEyOCk7XHJcblxyXG4gICAgICAgICAgICBhc3NlcnQocmVzcG9uc2UuZXZlcnkodmFsID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpc0Jhc2U2NCh2YWwpO1xyXG4gICAgICAgICAgICB9KSwgJ0Vycm9yOiBzaG91bGQgaGF2ZSByZXR1cm5lZCBhbiBhcnJheSBvZiBiYXNlNjQgQkxPQnMuJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQkxPQnMsIDEyOC1iaXQsIGJhc2U2NDogJyArIHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpdCgnQkxPQnMsIDEyOC1iaXQsIGhleCcsIGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCByb2MuZ2VuZXJhdGVCbG9icygzLCAxMjgsIHsgZm9ybWF0OiBoZXggfSk7XHJcblxyXG4gICAgICAgICAgICBhc3NlcnQocmVzcG9uc2UuZXZlcnkodmFsID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpc0hleCh2YWwsIDEyOCk7XHJcbiAgICAgICAgICAgIH0pLCAnRXJyb3I6IHNob3VsZCBoYXZlIHJldHVybmVkIGFuIGFycmF5IG9mIGhleCBCTE9Ccy4nKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChsb2dSZXNwb25zZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdCTE9CcywgMTI4LWJpdCwgaGV4OiAnICsgcmVzcG9uc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGl0KCdwcmVnZW5lcmF0ZWQgQkxPQnMgKGRhdGUpJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5nZW5lcmF0ZUJsb2JzKDMsIDY0LCB7IGZvcm1hdDogaGV4LCBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBkYXRlIH0pO1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UyID0gYXdhaXQgcm9jLmdlbmVyYXRlQmxvYnMoMywgNjQsIHsgZm9ybWF0OiBoZXgsIHByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb246IGRhdGUgfSk7XHJcblxyXG4gICAgICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3BvbnNlLCByZXNwb25zZTIpO1xyXG5cclxuICAgICAgICAgICAgYXNzZXJ0KHJlc3BvbnNlLmV2ZXJ5KHZhbCA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNIZXgodmFsLCA2NCk7XHJcbiAgICAgICAgICAgIH0pLCAnRXJyb3I6IHNob3VsZCBoYXZlIHJldHVybmVkIGFuIGFycmF5IG9mIGhleCBCTE9Ccy4nKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChsb2dSZXNwb25zZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdwcmVnZW5lcmF0ZWQgQkxPQnMgKGRhdGUpOiAnXHJcbiAgICAgICAgICAgICAgICAgICAgKyByZXNwb25zZSArICcgLyAnICsgcmVzcG9uc2UyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpdCgncHJlZ2VuZXJhdGVkIEJMT0JzIChpZCknLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmdlbmVyYXRlQmxvYnMoMywgNjQsIHsgZm9ybWF0OiBoZXgsIHByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb246IGlkIH0pO1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UyID0gYXdhaXQgcm9jLmdlbmVyYXRlQmxvYnMoMywgNjQsIHsgZm9ybWF0OiBoZXgsIHByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb246IGlkIH0pO1xyXG5cclxuICAgICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXNwb25zZSwgcmVzcG9uc2UyKTtcclxuXHJcbiAgICAgICAgICAgIGFzc2VydChyZXNwb25zZS5ldmVyeSh2YWwgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzSGV4KHZhbCwgNjQpO1xyXG4gICAgICAgICAgICB9KSwgJ0Vycm9yOiBzaG91bGQgaGF2ZSByZXR1cm5lZCBhbiBhcnJheSBvZiBoZXggQkxPQnMuJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygncHJlZ2VuZXJhdGVkIEJMT0JzIChpZCk6ICcgKyByZXNwb25zZVxyXG4gICAgICAgICAgICAgICAgICAgICsgJyAvICcgKyByZXNwb25zZTIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxufSk7XHJcblxyXG5kZXNjcmliZSgnU2lnbmVkJywgZnVuY3Rpb24oKSB7XHJcbiAgICBkZXNjcmliZSgnSW50ZWdlcnMnLCBmdW5jdGlvbigpIHtcclxuICAgICAgICBpdCgnZGVjaW1hbCBpbnRlZ2VycycsIGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UgID0gYXdhaXQgcm9jLmdlbmVyYXRlU2lnbmVkSW50ZWdlcnMoNSwgMCwgMTAsIHsgdXNlckRhdGE6IHVzZXJEYXRhIH0pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHNpZ25lZFRlc3RIZWxwZXIocmVzcG9uc2UsICdudW1iZXInLCB0cnVlLCAnZGVjaW1hbCBpbnRlZ2VycycpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpdCgncHJlZ2VuZXJhdGVkIGRlY2ltYWwgaW50ZWdlcnMgKGRhdGUpJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5nZW5lcmF0ZVNpZ25lZEludGVnZXJzKDUsIDAsIDEwLCB7IHByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb246IGRhdGUgfSk7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZTIgPSBhd2FpdCByb2MuZ2VuZXJhdGVTaWduZWRJbnRlZ2Vycyg1LCAwLCAxMCwgeyBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBkYXRlIH0pO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXNwb25zZS5kYXRhLCByZXNwb25zZTIuZGF0YSk7XHJcblxyXG4gICAgICAgICAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygncHJlZ2VuZXJhdGVkIGRlY2ltYWwgaW50ZWdlcnMgKGRhdGUpOiAnXHJcbiAgICAgICAgICAgICAgICAgICAgKyByZXNwb25zZS5kYXRhICsgJyAvICcgKyByZXNwb25zZTIuZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaXQoJ3ByZWdlbmVyYXRlZCBkZWNpbWFsIGludGVnZXJzIChpZCknLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmdlbmVyYXRlU2lnbmVkSW50ZWdlcnMoNSwgMCwgMTAsIHsgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbjogaWQgfSk7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZTIgPSBhd2FpdCByb2MuZ2VuZXJhdGVTaWduZWRJbnRlZ2Vycyg1LCAwLCAxMCwgeyBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBpZCB9KTtcclxuXHJcbiAgICAgICAgICAgIGFzc2VydC5kZWVwRXF1YWwocmVzcG9uc2UuZGF0YSwgcmVzcG9uc2UyLmRhdGEpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGxvZ1Jlc3BvbnNlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3ByZWdlbmVyYXRlZCBkZWNpbWFsIGludGVnZXJzIChpZCk6ICdcclxuICAgICAgICAgICAgICAgICAgICArIHJlc3BvbnNlLmRhdGEgKyAnIC8gJyArIHJlc3BvbnNlMi5kYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpdCgnbm9uLWRlY2ltYWwgaW50ZWdlcnMnLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmdlbmVyYXRlU2lnbmVkSW50ZWdlcnMoNSwgMCwgMTAsIHsgYmFzZTogMiwgdXNlckRhdGE6IHVzZXJEYXRhIH0pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHNpZ25lZFRlc3RIZWxwZXIocmVzcG9uc2UsICdzdHJpbmcnLCB0cnVlLCAnbm9uLWRlY2ltYWwgaW50ZWdlcnMnKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaXQoJ3ByZWdlbmVyYXRlZCBub24tZGVjaW1hbCBpbnRlZ2VycyAoZGF0ZSknLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmdlbmVyYXRlU2lnbmVkSW50ZWdlcnMoNSwgMCwgMTAsIHsgYmFzZTogMiwgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbjogZGF0ZSB9KTtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlMiA9IGF3YWl0IHJvYy5nZW5lcmF0ZVNpZ25lZEludGVnZXJzKDUsIDAsIDEwLCB7IGJhc2U6IDIsIHByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb246IGRhdGUgfSk7XHJcblxyXG4gICAgICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3BvbnNlLmRhdGEsIHJlc3BvbnNlMi5kYXRhKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChsb2dSZXNwb25zZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdwcmVnZW5lcmF0ZWQgbm9uLWRlY2ltYWwgaW50ZWdlcnMgKGRhdGUpOiAnXHJcbiAgICAgICAgICAgICAgICAgICAgKyByZXNwb25zZS5kYXRhICsgJyAvICcgKyByZXNwb25zZTIuZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaXQoJ3ByZWdlbmVyYXRlZCBub24tZGVjaW1hbCBpbnRlZ2VycyAoaWQpJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5nZW5lcmF0ZVNpZ25lZEludGVnZXJzKDUsIDAsIDEwLCB7IGJhc2U6IDIsIHByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb246IGlkIH0pO1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UyID0gYXdhaXQgcm9jLmdlbmVyYXRlU2lnbmVkSW50ZWdlcnMoNSwgMCwgMTAsIHsgYmFzZTogMiwgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbjogaWQgfSk7XHJcblxyXG4gICAgICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3BvbnNlLmRhdGEsIHJlc3BvbnNlMi5kYXRhKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChsb2dSZXNwb25zZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdwcmVnZW5lcmF0ZWQgbm9uLWRlY2ltYWwgaW50ZWdlcnMgKGlkKTogJ1xyXG4gICAgICAgICAgICAgICAgICAgICsgcmVzcG9uc2UuZGF0YSArICcgLyAnICsgcmVzcG9uc2UyLmRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBkZXNjcmliZSgnSW50ZWdlciBTZXF1ZW5jZXMnLCBmdW5jdGlvbigpIHtcclxuICAgICAgICBpdCgndW5pZm9ybSBkZWNpbWFsIGludGVnZXIgc2VxdWVuY2VzJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5nZW5lcmF0ZVNpZ25lZEludGVnZXJTZXF1ZW5jZXMoMywgNSwgMCwgMTAsIHsgdXNlckRhdGE6IHVzZXJEYXRhIH0pO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgcmV0dXJuIHNpZ25lZFRlc3RIZWxwZXIocmVzcG9uc2UsIEFycmF5KDMpLmZpbGwoJ251bWJlcicpLCB0cnVlLFxyXG4gICAgICAgICAgICAgICAgJ3VuaWZvcm0gZGVjaW1hbCBpbnRlZ2VyIHNlcXVlbmNlcycpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpdCgndW5pZm9ybSBwcmVnZW5lcmF0ZWQgZGVjaW1hbCBpbnRlZ2VyIHNlcXVlbmNlcyAoZGF0ZSknLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmdlbmVyYXRlU2lnbmVkSW50ZWdlclNlcXVlbmNlcygzLCA1LCAwLCAxMCwgeyBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBkYXRlIH0pO1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UyID0gYXdhaXQgcm9jLmdlbmVyYXRlU2lnbmVkSW50ZWdlclNlcXVlbmNlcygzLCA1LCAwLCAxMCwgeyBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBkYXRlIH0pO1xyXG5cclxuICAgICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXNwb25zZS5kYXRhLCByZXNwb25zZTIuZGF0YSk7XHJcblxyXG4gICAgICAgICAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndW5pZm9ybSBwcmVnZW5lcmF0ZWQgZGVjaW1hbCBpbnRlZ2VyIHNlcXVlbmNlcyAoZGF0ZSk6ICcpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS50YWJsZShyZXNwb25zZS5kYXRhKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUudGFibGUocmVzcG9uc2UyLmRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGl0KCd1bmlmb3JtIHByZWdlbmVyYXRlZCBkZWNpbWFsIGludGVnZXIgc2VxdWVuY2VzIChpZCknLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmdlbmVyYXRlU2lnbmVkSW50ZWdlclNlcXVlbmNlcygzLCA1LCAwLCAxMCwgeyBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBpZCB9KTtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlMiA9IGF3YWl0IHJvYy5nZW5lcmF0ZVNpZ25lZEludGVnZXJTZXF1ZW5jZXMoMywgNSwgMCwgMTAsIHsgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbjogaWQgfSk7XHJcblxyXG4gICAgICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3BvbnNlLmRhdGEsIHJlc3BvbnNlMi5kYXRhKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChsb2dSZXNwb25zZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd1bmlmb3JtIHByZWdlbmVyYXRlZCBkZWNpbWFsIGludGVnZXIgc2VxdWVuY2VzIChpZCk6ICcpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS50YWJsZShyZXNwb25zZS5kYXRhKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUudGFibGUocmVzcG9uc2UyLmRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGl0KCd1bmlmb3JtIG5vbi1kZWNpbWFsIGludGVnZXIgc2VxdWVuY2VzJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5nZW5lcmF0ZVNpZ25lZEludGVnZXJTZXF1ZW5jZXMoMywgNSwgMCwgMTAsIHsgYmFzZTogMiwgdXNlckRhdGE6IHVzZXJEYXRhIH0pO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgcmV0dXJuIHNpZ25lZFRlc3RIZWxwZXIocmVzcG9uc2UsIEFycmF5KDMpLmZpbGwoJ3N0cmluZycpLCB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICd1bmlmb3JtIG5vbi1kZWNpbWFsIGludGVnZXIgc2VxdWVuY2VzJyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGl0KCd1bmlmb3JtIHByZWdlbmVyYXRlZCBub24tZGVjaW1hbCBpbnRlZ2VyIHNlcXVlbmNlcyAoZGF0ZSknLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmdlbmVyYXRlU2lnbmVkSW50ZWdlclNlcXVlbmNlcygzLCA1LCAwLCAxMCwgeyBiYXNlOiAyLCBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBkYXRlIH0pO1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UyID0gYXdhaXQgcm9jLmdlbmVyYXRlU2lnbmVkSW50ZWdlclNlcXVlbmNlcygzLCA1LCAwLCAxMCwgeyBiYXNlOiAyLCBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBkYXRlIH0pO1xyXG5cclxuICAgICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXNwb25zZS5kYXRhLCByZXNwb25zZTIuZGF0YSk7XHJcblxyXG4gICAgICAgICAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndW5pZm9ybSBwcmVnZW5lcmF0ZWQgbm9uLWRlY2ltYWwgaW50ZWdlciBzZXF1ZW5jZXMgKGRhdGUpOiAnKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUudGFibGUocmVzcG9uc2UuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLnRhYmxlKHJlc3BvbnNlMi5kYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpdCgndW5pZm9ybSBwcmVnZW5lcmF0ZWQgbm9uLWRlY2ltYWwgaW50ZWdlciBzZXF1ZW5jZXMgKGlkKScsIGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCByb2MuZ2VuZXJhdGVTaWduZWRJbnRlZ2VyU2VxdWVuY2VzKDMsIDUsIDAsIDEwLCB7IGJhc2U6IDIsIHByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb246IGlkIH0pO1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UyID0gYXdhaXQgcm9jLmdlbmVyYXRlU2lnbmVkSW50ZWdlclNlcXVlbmNlcygzLCA1LCAwLCAxMCwgeyBiYXNlOiAyLCBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBpZCB9KTtcclxuXHJcbiAgICAgICAgICAgIGFzc2VydC5kZWVwRXF1YWwocmVzcG9uc2UuZGF0YSwgcmVzcG9uc2UyLmRhdGEpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGxvZ1Jlc3BvbnNlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3VuaWZvcm0gcHJlZ2VuZXJhdGVkIG5vbi1kZWNpbWFsIGludGVnZXIgc2VxdWVuY2VzIChpZCk6ICcpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS50YWJsZShyZXNwb25zZS5kYXRhKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUudGFibGUocmVzcG9uc2UyLmRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGl0KCdtdWx0aWZvcm0gaW50ZWdlciBzZXF1ZW5jZXMnLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmdlbmVyYXRlU2lnbmVkSW50ZWdlclNlcXVlbmNlcyg0LCBsZW5ndGgsIG1pbiwgbWF4LFxyXG4gICAgICAgICAgICAgICAgeyByZXBsYWNlbWVudDogcmVwbGFjZW1lbnQsIGJhc2U6IGJhc2UsIHVzZXJEYXRhOiB1c2VyRGF0YSB9KTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGxldCB0eXBlcyA9IFtdO1xyXG4gICAgICAgICAgICBiYXNlLmV2ZXJ5KHZhbCA9PiB0eXBlcy5wdXNoKHZhbCA9PSAxMCA/ICdudW1iZXInIDogJ3N0cmluZycpKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBzaWduZWRUZXN0SGVscGVyKHJlc3BvbnNlLCB0eXBlcywgdHJ1ZSwgJ211bHRpZm9ybSBpbnRlZ2VyIHNlcXVlbmNlcycpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpdCgnbXVsdGlmb3JtIHByZWdlbmVyYXRlZCBpbnRlZ2VyIHNlcXVlbmNlcyAoZGF0ZSknLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmdlbmVyYXRlU2lnbmVkSW50ZWdlclNlcXVlbmNlcyg0LCBsZW5ndGgsIG1pbiwgbWF4LFxyXG4gICAgICAgICAgICAgICAgeyByZXBsYWNlbWVudDogcmVwbGFjZW1lbnQsIGJhc2U6IGJhc2UsIHByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb246IGRhdGUgfSk7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZTIgPSBhd2FpdCByb2MuZ2VuZXJhdGVTaWduZWRJbnRlZ2VyU2VxdWVuY2VzKDQsIGxlbmd0aCwgbWluLCBtYXgsXHJcbiAgICAgICAgICAgICAgICB7IHJlcGxhY2VtZW50OiByZXBsYWNlbWVudCwgYmFzZTogYmFzZSwgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbjogZGF0ZSB9KTtcclxuXHJcbiAgICAgICAgICAgIGFzc2VydC5kZWVwRXF1YWwocmVzcG9uc2UuZGF0YSwgcmVzcG9uc2UyLmRhdGEpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGxvZ1Jlc3BvbnNlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ211bHRpZm9ybSBwcmVnZW5lcmF0ZWQgaW50ZWdlciBzZXF1ZW5jZXMgKGRhdGUpOiAnKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUudGFibGUocmVzcG9uc2UuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLnRhYmxlKHJlc3BvbnNlMi5kYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpdCgnbXVsdGlmb3JtIHByZWdlbmVyYXRlZCBpbnRlZ2VyIHNlcXVlbmNlcyAoaWQpJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5nZW5lcmF0ZVNpZ25lZEludGVnZXJTZXF1ZW5jZXMoNCwgbGVuZ3RoLCBtaW4sIG1heCxcclxuICAgICAgICAgICAgICAgIHsgcmVwbGFjZW1lbnQ6IHJlcGxhY2VtZW50LCBiYXNlOiBiYXNlLCBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBpZCB9KTtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlMiA9IGF3YWl0IHJvYy5nZW5lcmF0ZVNpZ25lZEludGVnZXJTZXF1ZW5jZXMoNCwgbGVuZ3RoLCBtaW4sIG1heCxcclxuICAgICAgICAgICAgICAgIHsgcmVwbGFjZW1lbnQ6IHJlcGxhY2VtZW50LCBiYXNlOiBiYXNlLCBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBpZCB9KTtcclxuXHJcbiAgICAgICAgICAgIGFzc2VydC5kZWVwRXF1YWwocmVzcG9uc2UuZGF0YSwgcmVzcG9uc2UyLmRhdGEpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGxvZ1Jlc3BvbnNlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ211bHRpZm9ybSBwcmVnZW5lcmF0ZWQgaW50ZWdlciBzZXF1ZW5jZXMgKGlkKTogJyk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLnRhYmxlKHJlc3BvbnNlLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS50YWJsZShyZXNwb25zZTIuZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGRlc2NyaWJlKCdEZWNpbWFsIEZyYWN0aW9ucycsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGl0KCdkZWNpbWFsIGZyYWN0aW9ucycsIGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCByb2MuZ2VuZXJhdGVTaWduZWREZWNpbWFsRnJhY3Rpb25zKDUsIDQsIHsgcmVwbGFjZW1lbnQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdXNlckRhdGE6IHVzZXJEYXRhIH0pO1xyXG4gICAgICAgICAgIFxyXG4gICAgICAgICAgICByZXR1cm4gc2lnbmVkVGVzdEhlbHBlcihyZXNwb25zZSwgJ251bWJlcicsIHRydWUsICdkZWNpbWFsIGZyYWN0aW9ucycpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpdCgncHJlZ2VuZXJhdGVkIGRlY2ltYWwgZnJhY3Rpb25zIChkYXRlKScsIGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCByb2MuZ2VuZXJhdGVTaWduZWREZWNpbWFsRnJhY3Rpb25zKDUsIDQsIHsgcmVwbGFjZW1lbnQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbjogZGF0ZSB9KTtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlMiA9IGF3YWl0IHJvYy5nZW5lcmF0ZVNpZ25lZERlY2ltYWxGcmFjdGlvbnMoNSwgNCwgeyByZXBsYWNlbWVudDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBkYXRlIH0pO1xyXG5cclxuICAgICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXNwb25zZS5kYXRhLCByZXNwb25zZTIuZGF0YSk7XHJcblxyXG4gICAgICAgICAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygncHJlZ2VuZXJhdGVkIGRlY2ltYWwgZnJhY3Rpb25zIChkYXRlKTogJ1xyXG4gICAgICAgICAgICAgICAgICAgICsgcmVzcG9uc2UuZGF0YSArICcgLyAnICsgcmVzcG9uc2UyLmRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGl0KCdwcmVnZW5lcmF0ZWQgZGVjaW1hbCBmcmFjdGlvbnMgKGlkKScsIGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCByb2MuZ2VuZXJhdGVTaWduZWREZWNpbWFsRnJhY3Rpb25zKDUsIDQsIHsgcmVwbGFjZW1lbnQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbjogaWQgfSk7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZTIgPSBhd2FpdCByb2MuZ2VuZXJhdGVTaWduZWREZWNpbWFsRnJhY3Rpb25zKDUsIDQsIHsgcmVwbGFjZW1lbnQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbjogaWQgfSk7XHJcblxyXG4gICAgICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3BvbnNlLmRhdGEsIHJlc3BvbnNlMi5kYXRhKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChsb2dSZXNwb25zZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdwcmVnZW5lcmF0ZWQgZGVjaW1hbCBmcmFjdGlvbnMgKGlkKTogJ1xyXG4gICAgICAgICAgICAgICAgICAgICsgcmVzcG9uc2UuZGF0YSArICcgLyAnICsgcmVzcG9uc2UyLmRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBkZXNjcmliZSgnR2F1c3NpYW5zJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaXQoJ2dhdXNzaWFucycsIGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCByb2MuZ2VuZXJhdGVTaWduZWRHYXVzc2lhbnMoNSwgMy40MSwgMi4xLCA0LFxyXG4gICAgICAgICAgICAgICAgeyB1c2VyRGF0YTogdXNlckRhdGEgfSk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICByZXR1cm4gc2lnbmVkVGVzdEhlbHBlcihyZXNwb25zZSwgJ251bWJlcicsIHRydWUsICdnYXVzc2lhbnMnKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaXQoJ3ByZWdlbmVyYXRlZCBnYXVzc2lhbnMgKGRhdGUpJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5nZW5lcmF0ZVNpZ25lZEdhdXNzaWFucyg1LCAzLjQxLCAyLjEsIDQsIHsgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbjogZGF0ZSB9KTtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlMiA9IGF3YWl0IHJvYy5nZW5lcmF0ZVNpZ25lZEdhdXNzaWFucyg1LCAzLjQxLCAyLjEsIDQsIHsgcHJlZ2VuZXJhdGVkUmFuZG9taXphdGlvbjogZGF0ZSB9KTtcclxuXHJcbiAgICAgICAgICAgIGFzc2VydC5kZWVwRXF1YWwocmVzcG9uc2UuZGF0YSwgcmVzcG9uc2UyLmRhdGEpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGxvZ1Jlc3BvbnNlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3ByZWdlbmVyYXRlZCBnYXVzc2lhbnMgKGRhdGUpOiAnXHJcbiAgICAgICAgICAgICAgICAgICAgKyByZXNwb25zZS5kYXRhICsgJyAvICcgKyByZXNwb25zZTIuZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaXQoJ3ByZWdlbmVyYXRlZCBnYXVzc2lhbnMgKGlkKScsIGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCByb2MuZ2VuZXJhdGVTaWduZWRHYXVzc2lhbnMoNSwgMy40MSwgMi4xLCA0LCB7IHByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb246IGlkIH0pO1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UyID0gYXdhaXQgcm9jLmdlbmVyYXRlU2lnbmVkR2F1c3NpYW5zKDUsIDMuNDEsIDIuMSwgNCwgeyBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBpZCB9KTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGFzc2VydC5kZWVwRXF1YWwocmVzcG9uc2UuZGF0YSwgcmVzcG9uc2UyLmRhdGEpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGxvZ1Jlc3BvbnNlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3ByZWdlbmVyYXRlZCBnYXVzc2lhbnMgKGlkKTogJ1xyXG4gICAgICAgICAgICAgICAgICAgICsgcmVzcG9uc2UuZGF0YSArICcgLyAnICsgcmVzcG9uc2UyLmRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBkZXNjcmliZSgnU3RyaW5ncycsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGl0KCdzdHJpbmdzLCBsb3dlcmNhc2UgRW5nbGlzaCBhbHBoYWJldCcsIGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCByb2MuZ2VuZXJhdGVTaWduZWRTdHJpbmdzKDMsIDUsIGNoYXJhY3RlcnMsIHsgdXNlckRhdGE6IHVzZXJEYXRhIH0pO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgcmV0dXJuIHNpZ25lZFRlc3RIZWxwZXIocmVzcG9uc2UsICdzdHJpbmcnLCB0cnVlLFxyXG4gICAgICAgICAgICAgICAgJ3N0cmluZ3MsIGxvd2VyY2FzZSBFbmdsaXNoIGFscGhhYmV0Jyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGl0KCdwcmVnZW5lcmF0ZWQgc3RyaW5ncywgbG93ZXJjYXNlIEVuZ2xpc2ggYWxwaGFiZXQgKGRhdGUpJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5nZW5lcmF0ZVNpZ25lZFN0cmluZ3MoMywgNSwgY2hhcmFjdGVycywgeyBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBkYXRlIH0pO1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UyID0gYXdhaXQgcm9jLmdlbmVyYXRlU2lnbmVkU3RyaW5ncygzLCA1LCBjaGFyYWN0ZXJzLCB7IHByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb246IGRhdGUgfSk7XHJcblxyXG4gICAgICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3BvbnNlLmRhdGEsIHJlc3BvbnNlMi5kYXRhKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChsb2dSZXNwb25zZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdwcmVnZW5lcmF0ZWQgc3RyaW5ncywgbG93ZXJjYXNlIEVuZ2xpc2ggYWxwaGFiZXQgJ1xyXG4gICAgICAgICAgICAgICAgICAgICsgJyhkYXRlKTogJyArIHJlc3BvbnNlLmRhdGEgKyAnIC8gJyArIHJlc3BvbnNlMi5kYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpdCgncHJlZ2VuZXJhdGVkIHN0cmluZ3MsIGxvd2VyY2FzZSBFbmdsaXNoIGFscGhhYmV0IChpZCknLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmdlbmVyYXRlU2lnbmVkU3RyaW5ncygzLCA1LCBjaGFyYWN0ZXJzLCB7IHByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb246IGlkIH0pO1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UyID0gYXdhaXQgcm9jLmdlbmVyYXRlU2lnbmVkU3RyaW5ncygzLCA1LCBjaGFyYWN0ZXJzLCB7IHByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb246IGlkIH0pO1xyXG5cclxuICAgICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXNwb25zZS5kYXRhLCByZXNwb25zZTIuZGF0YSk7XHJcblxyXG4gICAgICAgICAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygncHJlZ2VuZXJhdGVkIHN0cmluZ3MsIGxvd2VyY2FzZSBFbmdsaXNoIGFscGhhYmV0ICdcclxuICAgICAgICAgICAgICAgICAgICArICcoaWQpOiAnICsgcmVzcG9uc2UuZGF0YSArICcgLyAnICsgcmVzcG9uc2UyLmRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBkZXNjcmliZSgnVVVJRHMnLCBmdW5jdGlvbigpIHtcclxuICAgICAgICBpdCgnVVVJRHMnLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmdlbmVyYXRlU2lnbmVkVVVJRHMoMywgeyB1c2VyRGF0YTogdXNlckRhdGEgfSk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICByZXR1cm4gc2lnbmVkVGVzdEhlbHBlcihyZXNwb25zZSwgJ1VVSUQnLCB0cnVlLCAnVVVJRHMnKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaXQoJ3ByZWdlbmVyYXRlZCBVVUlEcyAoZGF0ZSknLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmdlbmVyYXRlU2lnbmVkVVVJRHMoMywgeyBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBkYXRlIH0pO1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UyID0gYXdhaXQgcm9jLmdlbmVyYXRlU2lnbmVkVVVJRHMoMywgeyBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBkYXRlIH0pO1xyXG5cclxuICAgICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXNwb25zZS5kYXRhLCByZXNwb25zZTIuZGF0YSk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygncHJlZ2VuZXJhdGVkIFVVSURzIChkYXRlKTogJ1xyXG4gICAgICAgICAgICAgICAgICAgICsgcmVzcG9uc2UuZGF0YSArICcgLyAnICsgcmVzcG9uc2UyLmRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGl0KCdwcmVnZW5lcmF0ZWQgVVVJRHMgKGlkKScsIGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCByb2MuZ2VuZXJhdGVTaWduZWRVVUlEcygzLCB7IHByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb246IGlkIH0pO1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UyID0gYXdhaXQgcm9jLmdlbmVyYXRlU2lnbmVkVVVJRHMoMywgeyBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBpZCB9KTtcclxuXHJcbiAgICAgICAgICAgIGFzc2VydC5kZWVwRXF1YWwocmVzcG9uc2UuZGF0YSwgcmVzcG9uc2UyLmRhdGEpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGxvZ1Jlc3BvbnNlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3ByZWdlbmVyYXRlZCBVVUlEcyAoaWQpOiAnXHJcbiAgICAgICAgICAgICAgICAgICAgKyByZXNwb25zZS5kYXRhICsgJyAvICcgKyByZXNwb25zZTIuZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGRlc2NyaWJlKCdCTE9CcycsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGl0KCdCTE9CcywgMTI4LWJpdCwgYmFzZTY0JywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5nZW5lcmF0ZVNpZ25lZEJsb2JzKDMsIDEyOCwgeyBmb3JtYXQ6IGJhc2U2NCwgdXNlckRhdGE6IHVzZXJEYXRhIH0pO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgcmV0dXJuIHNpZ25lZFRlc3RIZWxwZXIocmVzcG9uc2UsICdiYXNlNjQnLCB0cnVlLCAnQkxPQnMsIDEyOC1iaXQsIGJhc2U2NCcpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpdCgnQkxPQnMsIDEyOC1iaXQsIGhleCcsIGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCByb2MuZ2VuZXJhdGVTaWduZWRCbG9icygzLCAxMjgsIHsgZm9ybWF0OiBoZXgsIHVzZXJEYXRhOiB1c2VyRGF0YSB9KTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHJldHVybiBzaWduZWRUZXN0SGVscGVyKHJlc3BvbnNlLCAnMTI4LWhleCcsIHRydWUsICdCTE9CcywgMTI4LWJpdCwgaGV4Jyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGl0KCdwcmVnZW5lcmF0ZWQgQkxPQnMgKGRhdGUpJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5nZW5lcmF0ZVNpZ25lZEJsb2JzKDMsIDY0LCB7IGZvcm1hdDogYmFzZTY0LCBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBkYXRlIH0pO1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UyID0gYXdhaXQgcm9jLmdlbmVyYXRlU2lnbmVkQmxvYnMoMywgNjQsIHsgZm9ybWF0OiBiYXNlNjQsIHByZWdlbmVyYXRlZFJhbmRvbWl6YXRpb246IGRhdGUgfSk7XHJcblxyXG4gICAgICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3BvbnNlLmRhdGEsIHJlc3BvbnNlMi5kYXRhKTtcclxuXHJcbiAgICAgICAgICAgIGFzc2VydChyZXNwb25zZS5kYXRhLmV2ZXJ5KHZhbCA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNCYXNlNjQodmFsKTtcclxuICAgICAgICAgICAgfSksICdFcnJvcjogc2hvdWxkIGhhdmUgcmV0dXJuZWQgYW4gYXJyYXkgb2YgYmFzZTY0IEJMT0JzLicpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGxvZ1Jlc3BvbnNlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3ByZWdlbmVyYXRlZCBCTE9CcyAoZGF0ZSk6ICcgKyByZXNwb25zZS5kYXRhICsgJyAvICcgKyByZXNwb25zZTIuZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaXQoJ3ByZWdlbmVyYXRlZCBCTE9CcyAoaWQpJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5nZW5lcmF0ZVNpZ25lZEJsb2JzKDMsIDY0LCB7IGZvcm1hdDogYmFzZTY0LCBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBpZCB9KTtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlMiA9IGF3YWl0IHJvYy5nZW5lcmF0ZVNpZ25lZEJsb2JzKDMsIDY0LCB7IGZvcm1hdDogYmFzZTY0LCBwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uOiBpZCB9KTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGFzc2VydC5kZWVwRXF1YWwocmVzcG9uc2UuZGF0YSwgcmVzcG9uc2UyLmRhdGEpO1xyXG5cclxuICAgICAgICAgICAgYXNzZXJ0KHJlc3BvbnNlLmRhdGEuZXZlcnkodmFsID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpc0Jhc2U2NCh2YWwpO1xyXG4gICAgICAgICAgICB9KSwgJ0Vycm9yOiBzaG91bGQgaGF2ZSByZXR1cm5lZCBhbiBhcnJheSBvZiBiYXNlNjQgQkxPQnMuJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygncHJlZ2VuZXJhdGVkIEJMT0JzIChpZCk6ICcgKyByZXNwb25zZS5kYXRhICsgJyAvICcgKyByZXNwb25zZTIuZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGRlc2NyaWJlKCdUaWNrZXRzJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaXQoJ2NyZWF0ZSBhIHNpbmdsZSB0aWNrZXQnLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmNyZWF0ZVRpY2tldHMoMSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGxldCB0aWNrZXQgPSByZXNwb25zZVswXS50aWNrZXRJZDtcclxuXHJcbiAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgdGlja2V0ICA9PT0gJ3N0cmluZycsICdFcnJvcjogc2hvdWxkIGhhdmUgJ1xyXG4gICAgICAgICAgICAgICAgKyAncmV0dXJuZWQgYSBzdHJpbmcsIGluc3RlYWQgcmV0dXJuZWQgJyArIHRpY2tldCk7XHJcblxyXG4gICAgICAgICAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndGlja2V0IGlkOiAnICsgdGlja2V0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpdCgncmV2ZWFsVGlja2V0cygpLCBzaW5nbGUgcmV2ZWFsJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5jcmVhdGVUaWNrZXRzKDEsIGZhbHNlKTtcclxuICAgICAgICAgICAgbGV0IHRpY2tldCA9IHJlc3BvbnNlWzBdLnRpY2tldElkO1xyXG5cclxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHJvYy5nZW5lcmF0ZVNpZ25lZEludGVnZXJzKDUsIDAsIDEwLCB7dGlja2V0SWQ6IHRpY2tldH0pO1xyXG5cclxuICAgICAgICAgICAgbGV0IGdldFRpY2tldCA9IGF3YWl0IHJvYy5nZXRUaWNrZXQodGlja2V0KTtcclxuXHJcbiAgICAgICAgICAgIGFzc2VydCghZ2V0VGlja2V0LnJlc3VsdCwgJ1Jlc3VsdCBzaG91bGQgbm90IGJlIHNob3duIHByZS1yZXZlYWwuJyk7XHJcblxyXG4gICAgICAgICAgICBsZXQgcmV2ZWFsID0gYXdhaXQgcm9jLnJldmVhbFRpY2tldHModGlja2V0KTtcclxuXHJcbiAgICAgICAgICAgIGFzc2VydChyZXZlYWwudGlja2V0Q291bnQgPT0gMSwgJ0Egc2luZ2xlIHRpY2tldCBzaG91bGQgYmUgcmV2ZWFsZWQuJyk7XHJcblxyXG4gICAgICAgICAgICBnZXRUaWNrZXQgPSBhd2FpdCByb2MuZ2V0VGlja2V0KHRpY2tldCk7XHJcblxyXG4gICAgICAgICAgICBhc3NlcnQoZ2V0VGlja2V0LnJlc3VsdCwgJ1Jlc3VsdCBzaG91bGQgYmUgYXZhaWxhYmxlIHBvc3QtcmV2ZWFsLicpO1xyXG5cclxuICAgICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXN1bHQuZGF0YSwgZ2V0VGlja2V0LnJlc3VsdC5yYW5kb20uZGF0YSxcclxuICAgICAgICAgICAgICAgICdSZXN1bHQgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHdhcyBnZW5lcmF0ZWQgaW5pdGlhbGx5LicpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpdCgncmV2ZWFsVGlja2V0cygpLCBtdWx0aXBsZSByZXZlYWxzJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGxldCBuID0gMjtcclxuXHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5jcmVhdGVUaWNrZXRzKDEsIGZhbHNlKTtcclxuICAgICAgICAgICAgbGV0IHRpY2tldCA9IHJlc3BvbnNlWzBdLnRpY2tldElkO1xyXG5cclxuICAgICAgICAgICAgbGV0IHRpY2tldHMgPSBbXTtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdHMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB0aWNrZXRzLnB1c2godGlja2V0KTtcclxuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChhd2FpdCByb2MuZ2VuZXJhdGVTaWduZWRJbnRlZ2Vycyg1LCAwLCAxMCwge3RpY2tldElkOiB0aWNrZXR9KSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIGdldFRpY2tldCA9IGF3YWl0IHJvYy5nZXRUaWNrZXQodGlja2V0KTtcclxuXHJcbiAgICAgICAgICAgICAgICBhc3NlcnQoIWdldFRpY2tldC5yZXN1bHQsICdSZXN1bHQgc2hvdWxkIG5vdCBiZSBzaG93biBwcmUtcmV2ZWFsLicpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRpY2tldCA9IGdldFRpY2tldC5uZXh0VGlja2V0SWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgYXNzZXJ0KHRpY2tldCAhPSBudWxsLCAnTmV4dCB0aWNrZXQgSUQgc2hvdWxkIG5vdCBiZSBudWxsLicpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgcmV2ZWFsID0gYXdhaXQgcm9jLnJldmVhbFRpY2tldHModGlja2V0c1tuIC0gMV0pO1xyXG5cclxuICAgICAgICAgICAgYXNzZXJ0KHJldmVhbC50aWNrZXRDb3VudCA9PSBuLCBgJHtufSB0aWNrZXRzIHNob3VsZCBiZSByZXZlYWxlZCxcclxuICAgICAgICAgICAgICAgIGluc3RlYWQgdGlja2V0Q291bnQgd2FzICR7cmV2ZWFsLnRpY2tldENvdW50fS5gKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBnZXRUaWNrZXQgPSBhd2FpdCByb2MuZ2V0VGlja2V0KHRpY2tldHNbaV0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGFzc2VydChnZXRUaWNrZXQucmVzdWx0LCAnUmVzdWx0IHNob3VsZCBiZSBhdmFpbGFibGUgcG9zdC1yZXZlYWwuJyk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3VsdHNbaV0uZGF0YSwgZ2V0VGlja2V0LnJlc3VsdC5yYW5kb20uZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICAnUmVzdWx0IHNob3VsZCBiZSB0aGUgc2FtZSBhcyB3YXMgZ2VuZXJhdGVkIGluaXRpYWxseS4nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpdCgnbGlzdFRpY2tldHMoKSwgc2luZ2xldG9uJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5saXN0VGlja2V0cygnc2luZ2xldG9uJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXNwb25zZSkpIHtcclxuICAgICAgICAgICAgICAgIGFzc2VydChyZXNwb25zZS5ldmVyeSh2YWwgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAodmFsLm5leHRUaWNrZXRJZCA9PSBudWxsICYmIHZhbC5wcmV2aW91c1RpY2tldElkID09IG51bGwpO1xyXG4gICAgICAgICAgICAgICAgfSksICdFcnJvcjogdGlja2V0cyByZXR1cm5lZCB3ZXJlIG5vdCBvZiB0aGUgY29ycmVjdCB0eXBlLicpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxvZ1Jlc3BvbnNlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdmaXJzdCB0aWNrZXQsIHNpbmdsZXRvbjogJyArIEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlWzBdKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaXQoJ2xpc3RUaWNrZXRzKCksIGhlYWQnLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgcm9jLmxpc3RUaWNrZXRzKCdoZWFkJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXNwb25zZSkpIHtcclxuICAgICAgICAgICAgICAgIGFzc2VydChyZXNwb25zZS5ldmVyeSh2YWwgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAodmFsLm5leHRUaWNrZXRJZCAhPSBudWxsICYmIHZhbC5wcmV2aW91c1RpY2tldElkID09IG51bGwpO1xyXG4gICAgICAgICAgICAgICAgfSksICdFcnJvcjogdGlja2V0cyByZXR1cm5lZCB3ZXJlIG5vdCBvZiB0aGUgY29ycmVjdCB0eXBlLicpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxvZ1Jlc3BvbnNlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdmaXJzdCB0aWNrZXQsIGhlYWQ6ICcgKyBKU09OLnN0cmluZ2lmeShyZXNwb25zZVswXSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGl0KCdsaXN0VGlja2V0cygpLCB0YWlsJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5saXN0VGlja2V0cygndGFpbCcpO1xyXG5cclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzcG9uc2UpKSB7XHJcbiAgICAgICAgICAgICAgICBhc3NlcnQocmVzcG9uc2UuZXZlcnkodmFsID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHZhbC5uZXh0VGlja2V0SWQgPT0gbnVsbCAmJiB2YWwucHJldmlvdXNUaWNrZXRJZCAhPSBudWxsKTtcclxuICAgICAgICAgICAgICAgIH0pLCAnRXJyb3I6IHRpY2tldHMgcmV0dXJuZWQgd2VyZSBub3Qgb2YgdGhlIGNvcnJlY3QgdHlwZS4nKTtcclxuICAgICAgICAgICAgICAgIGlmIChsb2dSZXNwb25zZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZmlyc3QgdGlja2V0LCB0YWlsOiAnICsgSlNPTi5zdHJpbmdpZnkocmVzcG9uc2VbMF0pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpdCgnZ2V0VGlja2V0KCknLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbGV0IHRpY2tldHMgPSBhd2FpdCByb2MuY3JlYXRlVGlja2V0cygxLCB0cnVlKTtcclxuICAgICAgICAgICAgbGV0IHRpY2tldElkID0gdGlja2V0c1swXS50aWNrZXRJZDtcclxuXHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5nZW5lcmF0ZVNpZ25lZFVVSURzKDEsIHsgdGlja2V0SWQ6IHRpY2tldElkIH0pO1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UyID0gYXdhaXQgcm9jLmdldFRpY2tldCh0aWNrZXRJZCk7XHJcblxyXG4gICAgICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3BvbnNlLmRhdGEsIHJlc3BvbnNlMi5yZXN1bHQucmFuZG9tLmRhdGEpO1xyXG4gICAgICAgICAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnb3JpZ2luYWw6ICcgKyByZXNwb25zZS5kYXRhICsgJyBnZXRUaWNrZXQ6ICdcclxuICAgICAgICAgICAgICAgICAgICArIHJlc3BvbnNlMi5yZXN1bHQuZGF0YSArICcgdGlja2V0SWQ6ICcgKyB0aWNrZXRJZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIGRlc2NyaWJlKCdPdGhlcicsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGl0KCd2ZXJpZnlTaWduYXR1cmUocmFuZG9tLCBzaWduYXR1cmUpJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5nZW5lcmF0ZVNpZ25lZEludGVnZXJzKDUsIDAsIDEwKTtcclxuXHJcbiAgICAgICAgICAgIGxldCB2ZXJpZmljYXRpb24gPSBhd2FpdCByb2MudmVyaWZ5U2lnbmF0dXJlKHJlc3BvbnNlLnJhbmRvbSwgcmVzcG9uc2Uuc2lnbmF0dXJlKTtcclxuICAgICAgICAgICAgYXNzZXJ0KHZlcmlmaWNhdGlvbiwgJ0Vycm9yOiBzaG91bGQgaGF2ZSBiZWVuIHZlcmlmaWVkIHN1Y2Nlc3NmdWxseS4nKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHZlcmlmaWNhdGlvbiA9IGF3YWl0IHJvYy52ZXJpZnlTaWduYXR1cmUocmVzcG9uc2UucmFuZG9tLCBtb2RpZnlTaWduYXR1cmUocmVzcG9uc2Uuc2lnbmF0dXJlKSk7XHJcbiAgICAgICAgICAgIGFzc2VydCghdmVyaWZpY2F0aW9uLCAnRXJyb3I6IHNob3VsZCBub3QgaGF2ZSBiZWVuIHZlcmlmaWVkIHN1Y2Nlc3NmdWxseS4nKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaXQoJ2dldFJlc3VsdChzZXJpYWxOdW1iZXIpJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IHJvYy5nZW5lcmF0ZVNpZ25lZEludGVnZXJzKDUsIDAsIDEwKTtcclxuICAgICAgICAgICAgbGV0IHNlcmlhbE51bWJlciA9IHJlc3BvbnNlLnJhbmRvbS5zZXJpYWxOdW1iZXI7XHJcblxyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2UyID0gYXdhaXQgcm9jLmdldFJlc3VsdChzZXJpYWxOdW1iZXIpO1xyXG5cclxuICAgICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXNwb25zZS5kYXRhLCByZXNwb25zZTIucmFuZG9tLmRhdGEsXHJcbiAgICAgICAgICAgICAgICAnRXJyb3I6IHRoZSByZXNwb25zZXMgc2hvdWxkIGhhdmUgYmVlbiB0aGUgc2FtZS4nKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChsb2dSZXNwb25zZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdvcmlnaW5hbDogJyArIHJlc3BvbnNlLmRhdGEgKyAnIGdldFJlc3VsdDogJ1xyXG4gICAgICAgICAgICAgICAgICAgICsgcmVzcG9uc2UyLmRhdGEgKyAnIHNlcmlhbE51bWJlcjogJyArIHNlcmlhbE51bWJlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG59KTtcclxuXHJcbmRlc2NyaWJlKCdDYWNoZXMnLCBmdW5jdGlvbigpIHtcclxuICAgIGl0KCdkZWNpbWFsIGludGVnZXJzIHdpdGhvdXQgcmVwbGFjZW1lbnQgKGluZGl2aWR1YWwgcmVxdWVzdHMpJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgbGV0IGNhY2hlID0gcm9jLmNyZWF0ZUludGVnZXJDYWNoZSg1LCAwLCAxMCwgeyByZXBsYWNlbWVudDogZmFsc2UsIGNhY2hlU2l6ZTogY2FjaGVTaXplIH0pO1xyXG4gICAgICAgIGNhY2hlLnN0b3AoKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY2FjaGUuZ2V0KCk7XHJcbiAgICAgICAgICAgIGFzc2VydC5mYWlsKCdTaG91bGQgaGF2ZSB0aHJvd24gUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yLicpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgYXNzZXJ0KGUgaW5zdGFuY2VvZiBlcnJvcnMuUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yLCAnU2hvdWxkIGhhdmUgdGhyb3duICdcclxuICAgICAgICAgICAgICAgICsgJ1JhbmRvbU9yZ0NhY2hlRW1wdHlFcnJvciwgaW5zdGVhZCB0aHJldyAnICsgZS5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGFzc2VydChjYWNoZS5pc1BhdXNlZCgpLCAnRXJyb3I6IGNhY2hlIHNob3VsZCBoYXZlIGJlZW4gcGF1c2VkLicpO1xyXG5cclxuICAgICAgICBsZXQgZ290ID0gbnVsbDtcclxuXHJcbiAgICAgICAgLy8gVGVzdGluZyBSYW5kb21PcmdDYWNoZUVtcHR5RXJyb3IuaXNQYXVzZWQoKSBmdW5jdGlvblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGdvdCA9IGNhY2hlLmdldCgpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBlcnJvcnMuUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICBhc3NlcnQoZS53YXNQYXVzZWQoKSA9PT0gdHJ1ZSwgJ1Nob3VsZCBoYXZlIGJlZW4gcGF1c2VkLicpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXNzZXJ0LmZhaWwoJ1Nob3VsZCBoYXZlIHRocm93biBSYW5kb21PcmdDYWNoZUVtcHR5RXJyb3IsICdcclxuICAgICAgICAgICAgICAgICsgJywgaW5zdGVhZCB0aHJldyAnICsgZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY2FjaGUucmVzdW1lKCk7XHJcblxyXG4gICAgICAgIC8vIFRlc3RpbmcgUmFuZG9tT3JnQ2FjaGUgZnVuY3Rpb24gZ2V0KClcclxuICAgICAgICB3aGlsZSAoZ290ID09IG51bGwpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGdvdCA9IGNhY2hlLmdldCgpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIGVycm9ycy5SYW5kb21PcmdDYWNoZUVtcHR5RXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZS53YXNQYXVzZWQoKSA9PT0gZmFsc2UsICdTaG91bGQgbm90IGhhdmUgYmVlbiBwYXVzZWQuJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIDUwKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGFzc2VydC5mYWlsKCdTaG91bGQgaGF2ZSB0aHJvd24gUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yLCAnXHJcbiAgICAgICAgICAgICAgICAgICAgKyAnLCBpbnN0ZWFkIHRocmV3ICcgKyBlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhc3NlcnQoZ290LmV2ZXJ5KHZhbCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJztcclxuICAgICAgICB9KSwgJ0Vycm9yOiBzaG91bGQgaGF2ZSByZXR1cm5lZCBhbiBhcnJheSBvZiBpbnRlZ2Vycy4nKTtcclxuXHJcbiAgICAgICAgaWYgKGxvZ1Jlc3BvbnNlcykge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnZGVjaW1hbCBpbnRlZ2VyIGNhY2hlLCBnZXQoKTogJyArIGdvdCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBHZW5lcmFsIGZ1bmN0aW9uc1xyXG4gICAgICAgIGxldCBzaXplID0gY2FjaGUuZ2V0Q2FjaGVkVmFsdWVzKCk7XHJcbiAgICAgICAgYXNzZXJ0KHNpemUgPj0gMCk7XHJcblxyXG4gICAgICAgIGxldCBiaXRzVXNlZCA9IGNhY2hlLmdldEJpdHNVc2VkKCk7XHJcbiAgICAgICAgYXNzZXJ0KGJpdHNVc2VkID49IDApO1xyXG5cclxuICAgICAgICBsZXQgcmVxdWVzdHNVc2VkID0gY2FjaGUuZ2V0UmVxdWVzdHNVc2VkKCk7XHJcbiAgICAgICAgYXNzZXJ0KHJlcXVlc3RzVXNlZCA+PSAwKTtcclxuXHJcbiAgICAgICAgaWYgKGxvZ1Jlc3BvbnNlcykge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnc2l6ZSBvZiBjYWNoZTogJyArIHNpemUgKyAnIGJpdHMgdXNlZDogJyArIGJpdHNVc2VkXHJcbiAgICAgICAgICAgICAgICArICcgcmVxdWVzdHMgdXNlZDogJyArIHJlcXVlc3RzVXNlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ25vbi1kZWNpbWFsIGludGVnZXIgd2l0aCByZXBsYWNlbWVudCAoYnVsayByZXF1ZXN0cyknLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICBsZXQgY2FjaGUgPSByb2MuY3JlYXRlSW50ZWdlckNhY2hlKDUsIDAsIDEwLCB7IGJhc2U6IDE2LCBjYWNoZVNpemU6IGNhY2hlU2l6ZSB9KTtcclxuICAgICAgICBjYWNoZS5zdG9wKCk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNhY2hlLmdldCgpO1xyXG4gICAgICAgICAgICBhc3NlcnQuZmFpbCgnU2hvdWxkIGhhdmUgdGhyb3duIFJhbmRvbU9yZ0NhY2hlRW1wdHlFcnJvci4nKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGFzc2VydChlIGluc3RhbmNlb2YgZXJyb3JzLlJhbmRvbU9yZ0NhY2hlRW1wdHlFcnJvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhc3NlcnQoY2FjaGUuaXNQYXVzZWQoKSk7XHJcbiAgICAgICAgY2FjaGUucmVzdW1lKCk7XHJcblxyXG4gICAgICAgIGxldCBnb3QgPSBudWxsO1xyXG5cclxuICAgICAgICAvLyBUZXN0aW5nIFJhbmRvbU9yZ0NhY2hlIGZ1bmN0aW9uIGdldCgpXHJcbiAgICAgICAgd2hpbGUgKGdvdCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBnb3QgPSBjYWNoZS5nZXQoKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBlcnJvcnMuUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIDUwKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGFzc2VydC5mYWlsKCdTaG91bGQgaGF2ZSB0aHJvd24gUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yLCAnXHJcbiAgICAgICAgICAgICAgICAgICAgKyAnLCBpbnN0ZWFkIHRocmV3ICcgKyBlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhc3NlcnQoZ290LmV2ZXJ5KHZhbCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJztcclxuICAgICAgICB9KSwgJ0Vycm9yOiBzaG91bGQgaGF2ZSByZXR1cm5lZCBhbiBhcnJheSBvZiBzdHJpbmdzLicpO1xyXG5cclxuICAgICAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdub24tZGVjaW1hbCBpbnRlZ2VyIGNhY2hlLCBnZXQoKTogJyArIGdvdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ3VuaWZvcm0gZGVjaW1hbCBpbnRlZ2VyIHNlcXVlbmNlcyB3aXRoIHJlcGxhY2VtZW50IChidWxrIHJlcXVlc3RzKScsIGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGxldCBjYWNoZSA9IHJvYy5jcmVhdGVJbnRlZ2VyU2VxdWVuY2VDYWNoZSgzLCA1LCAwLCAxMCwgeyBjYWNoZVNpemU6IGNhY2hlU2l6ZSB9KTtcclxuICAgICAgICBjYWNoZS5zdG9wKCk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNhY2hlLmdldCgpO1xyXG4gICAgICAgICAgICBhc3NlcnQuZmFpbCgnU2hvdWxkIGhhdmUgdGhyb3duIFJhbmRvbU9yZ0NhY2hlRW1wdHlFcnJvci4nKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGFzc2VydChlIGluc3RhbmNlb2YgZXJyb3JzLlJhbmRvbU9yZ0NhY2hlRW1wdHlFcnJvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhc3NlcnQoY2FjaGUuaXNQYXVzZWQoKSk7XHJcbiAgICAgICAgY2FjaGUucmVzdW1lKCk7XHJcblxyXG4gICAgICAgIGxldCBnb3QgPSBudWxsO1xyXG5cclxuICAgICAgICAvLyBUZXN0aW5nIFJhbmRvbU9yZ0NhY2hlIGZ1bmN0aW9uIGdldCgpXHJcbiAgICAgICAgd2hpbGUgKGdvdCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBnb3QgPSBjYWNoZS5nZXQoKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBlcnJvcnMuUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIDUwKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGFzc2VydC5mYWlsKCdTaG91bGQgaGF2ZSB0aHJvd24gUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yLCAnXHJcbiAgICAgICAgICAgICAgICAgICAgKyAnLCBpbnN0ZWFkIHRocmV3ICcgKyBlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhc3NlcnQoZ290LmV2ZXJ5KHNlcXVlbmNlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHNlcXVlbmNlLmV2ZXJ5KHZhbCA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ251bWJlcic7XHJcbiAgICAgICAgICAgIH0pOyAgICAgICAgICAgIFxyXG4gICAgICAgIH0pLCAnRXJyb3I6IHNob3VsZCBoYXZlIHJldHVybmVkIGEgMkQgYXJyYXkgb2YgaW50ZWdlcnMuJyk7XHJcblxyXG4gICAgICAgIGlmIChsb2dSZXNwb25zZXMpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ3VuaWZvcm0gZGVjaW1hbCBpbnRlZ2VyIHNlcXVlbmNlIGNhY2hlLCBnZXQoKTogJyk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUudGFibGUoZ290KTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgndW5pZm9ybSBub24tZGVjaW1hbCBpbnRlZ2VyIHNlcXVlbmNlcyB3aXRoIHJlcGxhY2VtZW50IChidWxrIHJlcXVlc3RzKScsIGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGxldCBjYWNoZSA9IHJvYy5jcmVhdGVJbnRlZ2VyU2VxdWVuY2VDYWNoZSgzLCA1LCAwLCAxMCwgeyBiYXNlOiAxNiwgY2FjaGVTaXplOiBjYWNoZVNpemUgfSk7XHJcbiAgICAgICAgY2FjaGUuc3RvcCgpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjYWNoZS5nZXQoKTtcclxuICAgICAgICAgICAgYXNzZXJ0LmZhaWwoJ1Nob3VsZCBoYXZlIHRocm93biBSYW5kb21PcmdDYWNoZUVtcHR5RXJyb3IuJyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBhc3NlcnQoZSBpbnN0YW5jZW9mIGVycm9ycy5SYW5kb21PcmdDYWNoZUVtcHR5RXJyb3IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXNzZXJ0KGNhY2hlLmlzUGF1c2VkKCkpO1xyXG4gICAgICAgIGNhY2hlLnJlc3VtZSgpO1xyXG5cclxuICAgICAgICBsZXQgZ290ID0gbnVsbDtcclxuXHJcbiAgICAgICAgLy8gVGVzdGluZyBSYW5kb21PcmdDYWNoZSBmdW5jdGlvbiBnZXQoKVxyXG4gICAgICAgIHdoaWxlIChnb3QgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgZ290ID0gY2FjaGUuZ2V0KCk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgZXJyb3JzLlJhbmRvbU9yZ0NhY2hlRW1wdHlFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCA1MCkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBhc3NlcnQuZmFpbCgnU2hvdWxkIGhhdmUgdGhyb3duIFJhbmRvbU9yZ0NhY2hlRW1wdHlFcnJvciwgJ1xyXG4gICAgICAgICAgICAgICAgICAgICsgJywgaW5zdGVhZCB0aHJldyAnICsgZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXNzZXJ0KGdvdC5ldmVyeShzZXF1ZW5jZSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBzZXF1ZW5jZS5ldmVyeSh2YWwgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnO1xyXG4gICAgICAgICAgICB9KTsgICAgICAgICAgICBcclxuICAgICAgICB9KSwgJ0Vycm9yOiBzaG91bGQgaGF2ZSByZXR1cm5lZCBhIDJEIGFycmF5IG9mIHN0cmluZ3MuJyk7XHJcblxyXG4gICAgICAgIGlmIChsb2dSZXNwb25zZXMpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ3VuaWZvcm0gbm9uLWRlY2ltYWwgaW50ZWdlciBzZXF1ZW5jZSBjYWNoZSwgZ2V0KCk6ICcpO1xyXG4gICAgICAgICAgICBjb25zb2xlLnRhYmxlKGdvdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ211bHRpZm9ybSBkZWNpbWFsIGludGVnZXIgc2VxdWVuY2VzIHdpdGggcmVwbGFjZW1lbnQgKGJ1bGsgcmVxdWVzdHMpJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgbGV0IGNhY2hlID0gcm9jLmNyZWF0ZUludGVnZXJTZXF1ZW5jZUNhY2hlKDQsIGxlbmd0aCwgbWluLCBtYXgsIHsgY2FjaGVTaXplOiBjYWNoZVNpemUgfSk7XHJcbiAgICAgICAgY2FjaGUuc3RvcCgpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjYWNoZS5nZXQoKTtcclxuICAgICAgICAgICAgYXNzZXJ0LmZhaWwoJ1Nob3VsZCBoYXZlIHRocm93biBSYW5kb21PcmdDYWNoZUVtcHR5RXJyb3IuJyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBhc3NlcnQoZSBpbnN0YW5jZW9mIGVycm9ycy5SYW5kb21PcmdDYWNoZUVtcHR5RXJyb3IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXNzZXJ0KGNhY2hlLmlzUGF1c2VkKCkpO1xyXG4gICAgICAgIGNhY2hlLnJlc3VtZSgpO1xyXG5cclxuICAgICAgICBsZXQgZ290ID0gbnVsbDtcclxuXHJcbiAgICAgICAgLy8gVGVzdGluZyBSYW5kb21PcmdDYWNoZSBmdW5jdGlvbiBnZXQoKVxyXG4gICAgICAgIHdoaWxlIChnb3QgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgZ290ID0gY2FjaGUuZ2V0KCk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgZXJyb3JzLlJhbmRvbU9yZ0NhY2hlRW1wdHlFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCA1MCkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBhc3NlcnQuZmFpbCgnU2hvdWxkIGhhdmUgdGhyb3duIFJhbmRvbU9yZ0NhY2hlRW1wdHlFcnJvciwgJ1xyXG4gICAgICAgICAgICAgICAgICAgICsgJywgaW5zdGVhZCB0aHJldyAnICsgZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXNzZXJ0KGdvdC5ldmVyeShzZXF1ZW5jZSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBzZXF1ZW5jZS5ldmVyeSh2YWwgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdudW1iZXInO1xyXG4gICAgICAgICAgICB9KTsgICAgICAgICAgICBcclxuICAgICAgICB9KSwgJ0Vycm9yOiBzaG91bGQgaGF2ZSByZXR1cm5lZCBhIDJEIGFycmF5IG9mIGludGVnZXJzLicpO1xyXG5cclxuICAgICAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdtdWx0aWZvcm0gZGVjaW1hbCBpbnRlZ2VyIHNlcXVlbmNlIGNhY2hlLCBnZXQoKTogJyk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUudGFibGUoZ290KTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnbXVsdGlmb3JtIG1peGVkLWJhc2UgaW50ZWdlciBzZXF1ZW5jZXMgd2l0aCByZXBsYWNlbWVudCAoYnVsayByZXF1ZXN0cyknLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICBsZXQgY2FjaGUgPSByb2MuY3JlYXRlSW50ZWdlclNlcXVlbmNlQ2FjaGUoNCwgbGVuZ3RoLCBtaW4sIG1heCwgeyBiYXNlOiBiYXNlLCBjYWNoZVNpemU6IGNhY2hlU2l6ZSB9KTtcclxuICAgICAgICBjYWNoZS5zdG9wKCk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNhY2hlLmdldCgpO1xyXG4gICAgICAgICAgICBhc3NlcnQuZmFpbCgnU2hvdWxkIGhhdmUgdGhyb3duIFJhbmRvbU9yZ0NhY2hlRW1wdHlFcnJvci4nKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGFzc2VydChlIGluc3RhbmNlb2YgZXJyb3JzLlJhbmRvbU9yZ0NhY2hlRW1wdHlFcnJvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhc3NlcnQoY2FjaGUuaXNQYXVzZWQoKSk7XHJcbiAgICAgICAgY2FjaGUucmVzdW1lKCk7XHJcblxyXG4gICAgICAgIGxldCBnb3QgPSBudWxsO1xyXG5cclxuICAgICAgICAvLyBUZXN0aW5nIFJhbmRvbU9yZ0NhY2hlIGZ1bmN0aW9uIGdldCgpXHJcbiAgICAgICAgd2hpbGUgKGdvdCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBnb3QgPSBjYWNoZS5nZXQoKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBlcnJvcnMuUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIDUwKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGFzc2VydC5mYWlsKCdTaG91bGQgaGF2ZSB0aHJvd24gUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yLCAnXHJcbiAgICAgICAgICAgICAgICAgICAgKyAnLCBpbnN0ZWFkIHRocmV3ICcgKyBlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhc3NlcnQoZ290LmV2ZXJ5KChzZXF1ZW5jZSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHNlcXVlbmNlLmV2ZXJ5KHZhbCA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IGJhc2VbaW5kZXhdID09IDEwID8gJ251bWJlcicgOiAnc3RyaW5nJztcclxuICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgdmFsID09PSB0eXBlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KSwgJ0Vycm9yOiB0aGUgdHlwZSBvZiB0aGUgdmFsdWVzIGluIHRoZSAyRCBhcnJheSB3YXMgbm90IGFzIGV4cGVjdGVkLicpO1xyXG5cclxuICAgICAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdtdWx0aWZvcm0gbWl4ZWQtYmFzZSBpbnRlZ2VyIHNlcXVlbmNlIGNhY2hlLCBnZXQoKTogJyk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUudGFibGUoZ290KTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnZGVjaW1hbCBmcmFjdGlvbnMgd2l0aG91dCByZXBsYWNlbWVudCAoaW5kaXZpZHVhbCByZXF1ZXN0cyknLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICBsZXQgY2FjaGUgPSByb2MuY3JlYXRlRGVjaW1hbEZyYWN0aW9uQ2FjaGUoNSwgNCwgeyByZXBsYWNlbWVudDogZmFsc2UsIGNhY2hlU2l6ZTogY2FjaGVTaXplIH0pO1xyXG4gICAgICAgIGNhY2hlLnN0b3AoKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY2FjaGUuZ2V0KCk7XHJcbiAgICAgICAgICAgIGFzc2VydC5mYWlsKCdTaG91bGQgaGF2ZSB0aHJvd24gUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yLicpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgYXNzZXJ0KGUgaW5zdGFuY2VvZiBlcnJvcnMuUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGFzc2VydChjYWNoZS5pc1BhdXNlZCgpKTtcclxuICAgICAgICBjYWNoZS5yZXN1bWUoKTtcclxuXHJcbiAgICAgICAgbGV0IGdvdCA9IG51bGw7XHJcblxyXG4gICAgICAgIC8vIFRlc3RpbmcgUmFuZG9tT3JnQ2FjaGUgZnVuY3Rpb24gZ2V0KClcclxuICAgICAgICB3aGlsZSAoZ290ID09IG51bGwpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGdvdCA9IGNhY2hlLmdldCgpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIGVycm9ycy5SYW5kb21PcmdDYWNoZUVtcHR5RXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgNTApKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0LmZhaWwoJ1Nob3VsZCBoYXZlIHRocm93biBSYW5kb21PcmdDYWNoZUVtcHR5RXJyb3IsICdcclxuICAgICAgICAgICAgICAgICAgICArICcsIGluc3RlYWQgdGhyZXcgJyArIGUubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgYXNzZXJ0KGdvdC5ldmVyeSh2YWwgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ251bWJlcic7XHJcbiAgICAgICAgfSksICdFcnJvcjogc2hvdWxkIGhhdmUgcmV0dXJuZWQgYW4gYXJyYXkgb2YgbnVtYmVycy4nKTtcclxuXHJcbiAgICAgICAgaWYgKGxvZ1Jlc3BvbnNlcykge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnZGVjaW1hbCBmcmFjdGlvbiBjYWNoZSwgZ2V0KCk6ICcgKyBnb3QpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdkZWNpbWFsIGZyYWN0aW9ucyB3aXRoIHJlcGxhY2VtZW50IChidWxrIHJlcXVlc3RzKScsIGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGxldCBjYWNoZSA9IHJvYy5jcmVhdGVEZWNpbWFsRnJhY3Rpb25DYWNoZSg1LCA0LCB7IGNhY2hlU2l6ZTogY2FjaGVTaXplIH0pO1xyXG4gICAgICAgIGNhY2hlLnN0b3AoKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY2FjaGUuZ2V0KCk7XHJcbiAgICAgICAgICAgIGFzc2VydC5mYWlsKCdTaG91bGQgaGF2ZSB0aHJvd24gUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yLicpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgYXNzZXJ0KGUgaW5zdGFuY2VvZiBlcnJvcnMuUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGFzc2VydChjYWNoZS5pc1BhdXNlZCgpKTtcclxuICAgICAgICBjYWNoZS5yZXN1bWUoKTtcclxuXHJcbiAgICAgICAgbGV0IGdvdCA9IG51bGw7XHJcblxyXG4gICAgICAgIC8vIFRlc3RpbmcgUmFuZG9tT3JnQ2FjaGUgZnVuY3Rpb24gZ2V0KClcclxuICAgICAgICB3aGlsZSAoZ290ID09IG51bGwpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGdvdCA9IGNhY2hlLmdldCgpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIGVycm9ycy5SYW5kb21PcmdDYWNoZUVtcHR5RXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgNTApKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0LmZhaWwoJ1Nob3VsZCBoYXZlIHRocm93biBSYW5kb21PcmdDYWNoZUVtcHR5RXJyb3IsICdcclxuICAgICAgICAgICAgICAgICAgICArICcsIGluc3RlYWQgdGhyZXcgJyArIGUubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGFzc2VydChnb3QuZXZlcnkodmFsID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdudW1iZXInO1xyXG4gICAgICAgIH0pLCAnRXJyb3I6IHNob3VsZCBoYXZlIHJldHVybmVkIGFuIGFycmF5IG9mIG51bWJlcnMuJyk7XHJcblxyXG4gICAgICAgIGlmIChsb2dSZXNwb25zZXMpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ2RlY2ltYWwgZnJhY3Rpb24gY2FjaGUsIGdldCgpOiAnICsgZ290KTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnZ2F1c3NpYW5zIChidWxrIHJlcXVlc3RzIGFzIGdhdXNzaWFucyBhcmUgYWx3YXlzIGNob3NlbiB3aXRoIHJlcGxhY2VtZW50KScsIGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGxldCBjYWNoZSA9IHJvYy5jcmVhdGVHYXVzc2lhbkNhY2hlKDEwLCAzLjQxLCAyLjEsIDQsIHsgY2FjaGVTaXplOiBjYWNoZVNpemUgfSk7XHJcbiAgICAgICAgY2FjaGUuc3RvcCgpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjYWNoZS5nZXQoKTtcclxuICAgICAgICAgICAgYXNzZXJ0LmZhaWwoJ1Nob3VsZCBoYXZlIHRocm93biBSYW5kb21PcmdDYWNoZUVtcHR5RXJyb3IuJyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBhc3NlcnQoZSBpbnN0YW5jZW9mIGVycm9ycy5SYW5kb21PcmdDYWNoZUVtcHR5RXJyb3IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXNzZXJ0KGNhY2hlLmlzUGF1c2VkKCkpO1xyXG4gICAgICAgIGNhY2hlLnJlc3VtZSgpO1xyXG5cclxuICAgICAgICBsZXQgZ290ID0gbnVsbDtcclxuXHJcbiAgICAgICAgLy8gVGVzdGluZyBSYW5kb21PcmdDYWNoZSBmdW5jdGlvbiBnZXQoKVxyXG4gICAgICAgIHdoaWxlIChnb3QgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgZ290ID0gY2FjaGUuZ2V0KCk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgZXJyb3JzLlJhbmRvbU9yZ0NhY2hlRW1wdHlFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCA1MCkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBhc3NlcnQuZmFpbCgnU2hvdWxkIGhhdmUgdGhyb3duIFJhbmRvbU9yZ0NhY2hlRW1wdHlFcnJvciwgJ1xyXG4gICAgICAgICAgICAgICAgICAgICsgJywgaW5zdGVhZCB0aHJldyAnICsgZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXNzZXJ0KGdvdC5ldmVyeSh2YWwgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ251bWJlcic7XHJcbiAgICAgICAgfSksICdFcnJvcjogc2hvdWxkIGhhdmUgcmV0dXJuZWQgYW4gYXJyYXkgb2YgbnVtYmVycy4nKTtcclxuXHJcbiAgICAgICAgaWYgKGxvZ1Jlc3BvbnNlcykge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnZ2F1c3NpYW4gY2FjaGUsIGdldCgpOiAnICsgZ290KTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdCgnc3RyaW5ncyB3aXRoIHJlcGxhY2VtZW50IChidWxrIHJlcXVlc3RzKScsIGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGxldCBjYWNoZSA9IHJvYy5jcmVhdGVTdHJpbmdDYWNoZSg1LCA1LCBjaGFyYWN0ZXJzLCB7IGNhY2hlU2l6ZTogY2FjaGVTaXplIH0pO1xyXG4gICAgICAgIGNhY2hlLnN0b3AoKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY2FjaGUuZ2V0KCk7XHJcbiAgICAgICAgICAgIGFzc2VydC5mYWlsKCdTaG91bGQgaGF2ZSB0aHJvd24gUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yLicpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgYXNzZXJ0KGUgaW5zdGFuY2VvZiBlcnJvcnMuUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGFzc2VydChjYWNoZS5pc1BhdXNlZCgpKTtcclxuICAgICAgICBjYWNoZS5yZXN1bWUoKTtcclxuXHJcbiAgICAgICAgbGV0IGdvdCA9IG51bGw7XHJcblxyXG4gICAgICAgIC8vIFRlc3RpbmcgUmFuZG9tT3JnQ2FjaGUgZnVuY3Rpb24gZ2V0KClcclxuICAgICAgICB3aGlsZSAoZ290ID09IG51bGwpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGdvdCA9IGNhY2hlLmdldCgpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIGVycm9ycy5SYW5kb21PcmdDYWNoZUVtcHR5RXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgNTApKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0LmZhaWwoJ1Nob3VsZCBoYXZlIHRocm93biBSYW5kb21PcmdDYWNoZUVtcHR5RXJyb3IsICdcclxuICAgICAgICAgICAgICAgICAgICArICcsIGluc3RlYWQgdGhyZXcgJyArIGUubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGFzc2VydChnb3QuZXZlcnkodmFsID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnO1xyXG4gICAgICAgIH0pLCAnRXJyb3I6IHNob3VsZCBoYXZlIHJldHVybmVkIGFuIGFycmF5IG9mIHN0cmluZ3MuJyk7XHJcblxyXG4gICAgICAgIGlmIChsb2dSZXNwb25zZXMpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ3N0cmluZyBjYWNoZSwgZ2V0KCk6ICcgKyBnb3QpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdVVUlEcyAoYnVsayByZXF1ZXN0cywgYWx3YXlzKScsIGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGxldCBjYWNoZSA9IHJvYy5jcmVhdGVVVUlEQ2FjaGUoMSwgeyBjYWNoZVNpemU6IGNhY2hlU2l6ZSB9KTtcclxuICAgICAgICBjYWNoZS5zdG9wKCk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNhY2hlLmdldCgpO1xyXG4gICAgICAgICAgICBhc3NlcnQuZmFpbCgnU2hvdWxkIGhhdmUgdGhyb3duIFJhbmRvbU9yZ0NhY2hlRW1wdHlFcnJvci4nKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGFzc2VydChlIGluc3RhbmNlb2YgZXJyb3JzLlJhbmRvbU9yZ0NhY2hlRW1wdHlFcnJvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhc3NlcnQoY2FjaGUuaXNQYXVzZWQoKSk7XHJcbiAgICAgICAgY2FjaGUucmVzdW1lKCk7XHJcblxyXG4gICAgICAgIGxldCBnb3QgPSBudWxsO1xyXG5cclxuICAgICAgICAvLyBUZXN0aW5nIFJhbmRvbU9yZ0NhY2hlIGZ1bmN0aW9uIGdldCgpXHJcbiAgICAgICAgd2hpbGUgKGdvdCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBnb3QgPSBjYWNoZS5nZXQoKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBlcnJvcnMuUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIDUwKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGFzc2VydC5mYWlsKCdTaG91bGQgaGF2ZSB0aHJvd24gUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yLCAnXHJcbiAgICAgICAgICAgICAgICAgICAgKyAnLCBpbnN0ZWFkIHRocmV3ICcgKyBlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhc3NlcnQoZ290LmV2ZXJ5KHZhbCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBpc1VVSUQodmFsKTtcclxuICAgICAgICB9KSwgJ0Vycm9yOiBzaG91bGQgaGF2ZSByZXR1cm5lZCBhbiBhcnJheSBvZiBVVUlEcy4nKTtcclxuXHJcbiAgICAgICAgaWYgKGxvZ1Jlc3BvbnNlcykge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnVVVJRCBjYWNoZSwgZ2V0KCk6ICcgKyBnb3QpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdCTE9CcywgMTI4LWJpdCwgYmFzZTY0IChidWxrIHJlcXVlc3RzLCBhbHdheXMpJywgYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgbGV0IGNhY2hlID0gcm9jLmNyZWF0ZUJsb2JDYWNoZSgzLCAxMjgsIHsgZm9ybWF0OiBiYXNlNjQsIGNhY2hlU2l6ZTogY2FjaGVTaXplIH0pO1xyXG4gICAgICAgIGNhY2hlLnN0b3AoKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY2FjaGUuZ2V0KCk7XHJcbiAgICAgICAgICAgIGFzc2VydC5mYWlsKCdTaG91bGQgaGF2ZSB0aHJvd24gUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yLicpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgYXNzZXJ0KGUgaW5zdGFuY2VvZiBlcnJvcnMuUmFuZG9tT3JnQ2FjaGVFbXB0eUVycm9yKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGFzc2VydChjYWNoZS5pc1BhdXNlZCgpKTtcclxuICAgICAgICBjYWNoZS5yZXN1bWUoKTtcclxuXHJcbiAgICAgICAgbGV0IGdvdCA9IG51bGw7XHJcblxyXG4gICAgICAgIC8vIFRlc3RpbmcgUmFuZG9tT3JnQ2FjaGUgZnVuY3Rpb24gZ2V0KClcclxuICAgICAgICB3aGlsZSAoZ290ID09IG51bGwpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGdvdCA9IGNhY2hlLmdldCgpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIGVycm9ycy5SYW5kb21PcmdDYWNoZUVtcHR5RXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgNTApKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0LmZhaWwoJ1Nob3VsZCBoYXZlIHRocm93biBSYW5kb21PcmdDYWNoZUVtcHR5RXJyb3IsICdcclxuICAgICAgICAgICAgICAgICAgICArICcsIGluc3RlYWQgdGhyZXcgJyArIGUubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGFzc2VydChnb3QuZXZlcnkodmFsID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGlzQmFzZTY0KHZhbCk7XHJcbiAgICAgICAgfSksICdFcnJvcjogc2hvdWxkIGhhdmUgcmV0dXJuZWQgYW4gYXJyYXkgb2YgYmFzZTY0IEJMT0JzLicpO1xyXG5cclxuICAgICAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdiYXNlNjQtZW5jb2RlZCBibG9iIGNhY2hlLCBnZXQoKTogJyArIGdvdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaXQoJ0JMT0JzLCAxMjgtYml0LCBoZXggKGJ1bGsgcmVxdWVzdHMsIGFsd2F5cyknLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICBsZXQgY2FjaGUgPSByb2MuY3JlYXRlQmxvYkNhY2hlKDMsIDEyOCwgeyBmb3JtYXQ6IGhleCwgY2FjaGVTaXplOiBjYWNoZVNpemUgfSk7XHJcbiAgICAgICAgY2FjaGUuc3RvcCgpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjYWNoZS5nZXQoKTtcclxuICAgICAgICAgICAgYXNzZXJ0LmZhaWwoJ1Nob3VsZCBoYXZlIHRocm93biBSYW5kb21PcmdDYWNoZUVtcHR5RXJyb3IuJyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBhc3NlcnQoZSBpbnN0YW5jZW9mIGVycm9ycy5SYW5kb21PcmdDYWNoZUVtcHR5RXJyb3IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXNzZXJ0KGNhY2hlLmlzUGF1c2VkKCkpO1xyXG4gICAgICAgIGNhY2hlLnJlc3VtZSgpO1xyXG5cclxuICAgICAgICBsZXQgZ290ID0gbnVsbDtcclxuXHJcbiAgICAgICAgLy8gVGVzdGluZyBSYW5kb21PcmdDYWNoZSBmdW5jdGlvbiBnZXQoKVxyXG4gICAgICAgIHdoaWxlIChnb3QgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgZ290ID0gY2FjaGUuZ2V0KCk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgZXJyb3JzLlJhbmRvbU9yZ0NhY2hlRW1wdHlFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCA1MCkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBhc3NlcnQuZmFpbCgnU2hvdWxkIGhhdmUgdGhyb3duIFJhbmRvbU9yZ0NhY2hlRW1wdHlFcnJvciwgJ1xyXG4gICAgICAgICAgICAgICAgICAgICsgJywgaW5zdGVhZCB0aHJldyAnICsgZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXNzZXJ0KGdvdC5ldmVyeSh2YWwgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gaXNIZXgodmFsLCAxMjgpO1xyXG4gICAgICAgIH0pLCAnRXJyb3I6IHNob3VsZCBoYXZlIHJldHVybmVkIGFuIGFycmF5IG9mIGhleCBCTE9Ccy4nKTtcclxuXHJcbiAgICAgICAgaWYgKGxvZ1Jlc3BvbnNlcykge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnaGV4LWVuY29kZWQgYmxvYiBjYWNoZSwgZ2V0KCk6ICcgKyBnb3QpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59KTtcclxuXHJcbmRlc2NyaWJlKCdGaW5hbCBVc2FnZScsIGZ1bmN0aW9uKCkge1xyXG4gICAgaXQoJ3JlcXVlc3RzIHVzZWQnLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICBsZXQgdXBkYXRlZFJlcXVlc3RzID0gYXdhaXQgcm9jLmdldFJlcXVlc3RzTGVmdCgpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHJlcXVlc3RzIC0gdXBkYXRlZFJlcXVlc3RzKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGl0KCdiaXRzIHVzZWQnLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgICAgICBsZXQgdXBkYXRlZEJpdHMgPSBhd2FpdCByb2MuZ2V0Qml0c0xlZnQoKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhiaXRzIC0gdXBkYXRlZEJpdHMpO1xyXG4gICAgfSk7XHJcbn0pO1xyXG5cclxuXHJcblxyXG5sZXQgc2lnbmVkVGVzdEhlbHBlciA9IGFzeW5jIGZ1bmN0aW9uKHJlc3BvbnNlLCB0eXBlLCBoYXNVc2VyRGF0YSA9IGZhbHNlLCBtZXNzYWdlID0gbnVsbCkge1xyXG4gICAgbGV0IHZlcmlmaWVkID0gYXdhaXQgcm9jLnZlcmlmeVNpZ25hdHVyZShyZXNwb25zZS5yYW5kb20sIHJlc3BvbnNlLnNpZ25hdHVyZSk7XHJcblxyXG4gICAgLy8gY2hlY2sgdGhhdCB0aGUgcmVzdWx0IGNhbiBiZSB2ZXJpZmllZFxyXG4gICAgYXNzZXJ0KHZlcmlmaWVkKTtcclxuXHJcbiAgICBpZiAobG9nUmVzcG9uc2VzKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2cobWVzc2FnZSArICc6ICcgKyByZXNwb25zZS5kYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjaGVjayB0aGF0IHRoZSBkYXRhIHJldHVybmVkIGlzIG9mIHRoZSBjb3JyZWN0IHR5cGVcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHR5cGUpKSB7XHJcbiAgICAgICAgLy8gbXVsdGlmb3JtIGludGVnZXIgc2VxdWVuY2VzIHdpdGggbWl4ZWQgdmFsdWVzIGZvciB0aGUgYmFzZSBwYXJhbWV0ZXJcclxuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgcmVzcG9uc2UuZGF0YS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBhc3NlcnQocmVzcG9uc2UuZGF0YVtpXS5ldmVyeSh2YWwgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWwgPT0gdHlwZVtpXTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1VVSUQnKSB7XHJcbiAgICAgICAgYXNzZXJ0KHJlc3BvbnNlLmRhdGEuZXZlcnkodmFsID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGlzVVVJRCh2YWwpO1xyXG4gICAgICAgIH0pKTtcclxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2Jhc2U2NCcpIHtcclxuICAgICAgICBhc3NlcnQocmVzcG9uc2UuZGF0YS5ldmVyeSh2YWwgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gaXNCYXNlNjQodmFsKTtcclxuICAgICAgICB9KSk7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICcxMjgtaGV4Jykge1xyXG4gICAgICAgIGxldCBzaXplID0gcmVzcG9uc2UucmFuZG9tLnNpemU7XHJcbiAgICAgICAgYXNzZXJ0KHJlc3BvbnNlLmRhdGEuZXZlcnkodmFsID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGlzSGV4KHZhbCwgc2l6ZSk7XHJcbiAgICAgICAgfSkpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIGFueSBvdGhlciBtZXRob2RcclxuICAgICAgICBhc3NlcnQocmVzcG9uc2UuZGF0YS5ldmVyeSh2YWwgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gdHlwZTtcclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY2hlY2sgdXNlckRhdGEgaXMgcmV0dXJuZWQgY29ycmVjdGx5XHJcbiAgICBpZiAoaGFzVXNlckRhdGEpIHtcclxuICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3BvbnNlLnJhbmRvbS51c2VyRGF0YSwgdXNlckRhdGEpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hldGhlciBhIHN0cmluZyBpcyBhIHZhbGlkIFVVSUQuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWwgVGhlIHN0cmluZyB0byBiZSB0ZXN0ZWQuXHJcbiAqIEByZXR1cm5zIFRydWUsIGlmIGl0IGlzIGEgVVVJRCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cclxubGV0IGlzVVVJRCA9IGZ1bmN0aW9uKHZhbCkge1xyXG4gICAgbGV0IHBhdHRlcm4gPSAvXlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLTVdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9JC9pO1xyXG4gICAgcmV0dXJuIHBhdHRlcm4udGVzdCh2YWwpO1xyXG59XHJcblxyXG4vKipcclxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIGEgc3RyaW5nIGlzIGJhc2U2NC1lbmNvZGVkLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsIFRoZSBzdHJpbmcgdG8gYmUgdGVzdGVkLlxyXG4gKiBAcmV0dXJucyBUcnVlLCBpZiBpdCBpcyBiYXNlNjQgZW5jb2RlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cclxubGV0IGlzQmFzZTY0ID0gZnVuY3Rpb24odmFsKSB7XHJcbiAgICBsZXQgcGF0dGVybiA9IC9eKFswLTlhLXpBLVorL117NH0pKigoWzAtOWEtekEtWisvXXsyfT09KXwoWzAtOWEtekEtWisvXXszfT0pKT8kLztcclxuICAgIHJldHVybiBwYXR0ZXJuLnRlc3QodmFsKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hldGhlciBhIEJMT0IgaXMgaGV4LWVuY29kZWQuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWwgVGhlIEJMT0IgdG8gYmUgdGVzdGVkIChhcyBhIHN0cmluZykuXHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIFRoZSBzaXplIG9mIHRoZSBCTE9CLlxyXG4gKiBAcmV0dXJucyBUcnVlLCBpZiBpdCBpcyBoZXggZW5jb2RlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cclxubGV0IGlzSGV4ID0gZnVuY3Rpb24odmFsLCBzaXplKSB7XHJcbiAgICBsZXQgbGVuZ3RoID0gc2l6ZSAvIDQ7XHJcbiAgICBsZXQgcGF0dGVybiA9IG5ldyBSZWdFeHAoJ14oWzAtOWEtZl17JyArIGxlbmd0aCArICd9KT8kJyk7XHJcbiAgICByZXR1cm4gcGF0dGVybi50ZXN0KHZhbCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBNb2RpZmllcyB0aGUgc2lnbmF0dXJlIGJ5IHN3YXBwaW5nIHRoZSBmaXJzdCB0d28gbm9uLWlkZW50aWNhbCBjaGFyYWN0ZXJzLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gc2lnbmF0dXJlIFNpZ25hdHVyZSByZXR1cm5lZCBieSBvbmUgb2YgdGhlIFNpZ25lZCBtZXRob2RzLlxyXG4gKiBAcmV0dXJucyBUaGUgbW9kaWZpZWQgc2lnbmF0dXJlLlxyXG4gKi9cclxubGV0IG1vZGlmeVNpZ25hdHVyZSA9IGZ1bmN0aW9uKHNpZ25hdHVyZSkge1xyXG4gICAgbGV0IHMgPSBzaWduYXR1cmUuc3BsaXQoJycpO1xyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHNbaV0gIT0gc1tpLTFdKSB7XHJcbiAgICAgICAgICAgIGxldCB0ZW1wID0gc1tpXTtcclxuICAgICAgICAgICAgc1tpXSA9IHNbaS0xXTtcclxuICAgICAgICAgICAgc1tpLTFdID0gdGVtcDtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHMuam9pbignJyk7XHJcbn0iXSwibmFtZXMiOlsiUmFuZG9tT3JnRXJyb3JzIiwiUmFuZG9tT3JnQmFkSFRUUFJlc3BvbnNlRXJyb3IiLCJFcnJvciIsImNvbnN0cnVjdG9yIiwibWVzc2FnZSIsInN1cGVyIiwiUmFuZG9tT3JnSW5zdWZmaWNpZW50Qml0c0Vycm9yIiwiYml0cyIsInRoaXMiLCJnZXRCaXRzTGVmdCIsIlJhbmRvbU9yZ0luc3VmZmljaWVudFJlcXVlc3RzRXJyb3IiLCJSYW5kb21PcmdKU09OUlBDRXJyb3IiLCJSYW5kb21PcmdLZXlOb3RSdW5uaW5nRXJyb3IiLCJSYW5kb21PcmdSQU5ET01PUkdFcnJvciIsImNvZGUiLCJnZXRDb2RlIiwiUmFuZG9tT3JnU2VuZFRpbWVvdXRFcnJvciIsIlJhbmRvbU9yZ0NhY2hlRW1wdHlFcnJvciIsInBhdXNlZCIsIndhc1BhdXNlZCIsInJlcXVpcmUkJDAiLCJSYW5kb21PcmdDYWNoZV8xIiwicmVxdWVzdEZ1bmN0aW9uIiwicmVxdWVzdCIsImJ1bGtSZXF1ZXN0TnVtYmVyIiwicmVxdWVzdE51bWJlciIsInJlcXVlc3RTaXplIiwic3RhY2siLCJjYWNoZVNpemUiLCJiaXRzVXNlZCIsInJlcXVlc3RzVXNlZCIsImN1cnJlbnRseVBvcHVsYXRpbmciLCJlcnJvciIsInNpbmdsZVJlcXVlc3RTaXplIiwicG9wdWxhdGUiLCJhc3luYyIsInJlc3BvbnNlIiwibGVuZ3RoIiwiYWRkUmVzcG9uc2UiLCJlIiwiYml0c0xlZnQiLCJhZGp1c3RlZEJ1bGsiLCJNYXRoIiwiZmxvb3IiLCJwYXJhbXMiLCJuIiwic3RvcCIsInJlc3VtZSIsInJlZnJlc2giLCJpc1BhdXNlZCIsImdldCIsImRhdGEiLCJwb3AiLCJnZXRPcldhaXQiLCJQcm9taXNlIiwiciIsInNldFRpbWVvdXQiLCJnZXRDYWNoZWRWYWx1ZXMiLCJnZXRCaXRzVXNlZCIsImdldFJlcXVlc3RzVXNlZCIsImJ1bGsiLCJyZXN1bHQiLCJyYW5kb20iLCJpIiwicHVzaCIsInNsaWNlIiwiUmFuZG9tT3JnQ2FjaGUiLCJyZXF1aXJlJCQxIiwiUmFuZG9tT3JnQ2xpZW50XzEiLCJSYW5kb21PcmdDbGllbnQiLCJzdGF0aWMiLCJyZXF1ZXN0c0xlZnQiLCJiYWNrb2ZmIiwiYmFja29mZkVycm9yIiwiYXBpS2V5IiwiYmxvY2tpbmdUaW1lb3V0IiwiREVGQVVMVF9CTE9DS0lOR19USU1FT1VUIiwiaHR0cFRpbWVvdXQiLCJERUZBVUxUX0hUVFBfVElNRU9VVCIsImFkdmlzb3J5RGVsYXkiLCJsYXN0UmVzcG9uc2VSZWNlaXZlZFRpbWUiLCJvcHRpb25zIiwia2V5SW5kZXhlZEluc3RhbmNlcyIsImdlbmVyYXRlSW50ZWdlcnMiLCJtaW4iLCJtYXgiLCJpbnRlZ2VyUmVxdWVzdCIsImV4dHJhY3RCYXNpYyIsInNlbmRSZXF1ZXN0IiwiZ2VuZXJhdGVJbnRlZ2VyU2VxdWVuY2VzIiwiaW50ZWdlclNlcXVlbmNlUmVxdWVzdCIsImdlbmVyYXRlRGVjaW1hbEZyYWN0aW9ucyIsImRlY2ltYWxQbGFjZXMiLCJkZWNpbWFsRnJhY3Rpb25SZXF1ZXN0IiwiZ2VuZXJhdGVHYXVzc2lhbnMiLCJtZWFuIiwic3RhbmRhcmREZXZpYXRpb24iLCJzaWduaWZpY2FudERpZ2l0cyIsImdhdXNzaWFuUmVxdWVzdCIsImdlbmVyYXRlU3RyaW5ncyIsImNoYXJhY3RlcnMiLCJzdHJpbmdSZXF1ZXN0IiwiZ2VuZXJhdGVVVUlEcyIsIlVVSURSZXF1ZXN0IiwiZ2VuZXJhdGVCbG9icyIsInNpemUiLCJibG9iUmVxdWVzdCIsImdlbmVyYXRlU2lnbmVkSW50ZWdlcnMiLCJleHRyYWN0U2lnbmVkIiwiZ2VuZXJhdGVTaWduZWRJbnRlZ2VyU2VxdWVuY2VzIiwiZ2VuZXJhdGVTaWduZWREZWNpbWFsRnJhY3Rpb25zIiwiZ2VuZXJhdGVTaWduZWRHYXVzc2lhbnMiLCJnZW5lcmF0ZVNpZ25lZFN0cmluZ3MiLCJnZW5lcmF0ZVNpZ25lZFVVSURzIiwiZ2VuZXJhdGVTaWduZWRCbG9icyIsInZlcmlmeVNpZ25hdHVyZSIsInNpZ25hdHVyZSIsImdlbmVyYXRlUmVxdWVzdCIsIlZFUklGWV9TSUdOQVRVUkVfTUVUSE9EIiwiZXh0cmFjdFZlcmlmaWNhdGlvbiIsInVwZGF0ZSIsIkRhdGUiLCJub3ciLCJBTExPV0FOQ0VfU1RBVEVfUkVGUkVTSF9TRUNPTkRTIiwiZ2V0VXNhZ2UiLCJnZXRSZXF1ZXN0c0xlZnQiLCJnZXRSZXN1bHQiLCJzZXJpYWxOdW1iZXIiLCJnZW5lcmF0ZUtleWVkUmVxdWVzdCIsIkdFVF9SRVNVTFRfTUVUSE9EIiwiY3JlYXRlVGlja2V0cyIsInNob3dSZXN1bHQiLCJDUkVBVEVfVElDS0VUX01FVEhPRCIsImV4dHJhY3RSZXN1bHQiLCJyZXZlYWxUaWNrZXRzIiwidGlja2V0SWQiLCJSRVZFQUxfVElDS0VUX01FVEhPRCIsImxpc3RUaWNrZXRzIiwidGlja2V0VHlwZSIsIkxJU1RfVElDS0VUX01FVEhPRCIsImdldFRpY2tldCIsIkdFVF9USUNLRVRfTUVUSE9EIiwiY3JlYXRlVXJsIiwidXJsIiwiZm9ybWF0VXJsIiwiSlNPTiIsInN0cmluZ2lmeSIsIk1BWF9VUkxfTEVOR1RIIiwiY3JlYXRlSHRtbCIsInMiLCJpbnB1dEhUTUwiLCJjcmVhdGVJbnRlZ2VyQ2FjaGUiLCJtYXhSZXF1ZXN0U2l6ZSIsImNlaWwiLCJsb2ciLCJidWxrTiIsInJlcGxhY2VtZW50IiwiYmluZCIsImNyZWF0ZUludGVnZXJTZXF1ZW5jZUNhY2hlIiwicmVwbCIsIm1heFZhbHVlIiwibWluVmFsdWUiLCJBcnJheSIsImlzQXJyYXkiLCJldmVyeSIsIngiLCJhZGp1c3QiLCJiYXNlIiwiY3JlYXRlRGVjaW1hbEZyYWN0aW9uQ2FjaGUiLCJjcmVhdGVHYXVzc2lhbkNhY2hlIiwicG93IiwiY3JlYXRlU3RyaW5nQ2FjaGUiLCJjcmVhdGVVVUlEQ2FjaGUiLCJVVUlEX1NJWkUiLCJjcmVhdGVCbG9iQ2FjaGUiLCJ3YWl0IiwicmVzb2x2ZSIsInhociIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsInNldFJlcXVlc3RIZWFkZXIiLCJvbnRpbWVvdXQiLCJvbmxvYWQiLCJzdGF0dXMiLCJyZXNwb25zZVRleHQiLCJvbmVycm9yIiwiY29uc29sZSIsImluZm8iLCJ0aW1lb3V0Iiwic2VuZCIsInRoZW4iLCJwYXJzZSIsIm1pZG5pZ2h0VVRDIiwic2V0VVRDSG91cnMiLCJFUlJPUl9DT0RFUyIsImluY2x1ZGVzIiwibWV0aG9kIiwiREVGQVVMVF9ERUxBWSIsIkdFVF9VU0FHRV9NRVRIT0QiLCJqc29ucnBjIiwiaWQiLCJ1dWlkdjQiLCJhdXRoZW50aWNpdHkiLCJwcmVnZW5lcmF0ZWRSYW5kb21pemF0aW9uIiwibGljZW5zZURhdGEiLCJ1c2VyRGF0YSIsInNpZ25lZCIsImFkZE9wdGlvbmFsUGFyYW1zIiwiU0lHTkVEX0lOVEVHRVJfTUVUSE9EIiwiSU5URUdFUl9NRVRIT0QiLCJTSUdORURfSU5URUdFUl9TRVFVRU5DRV9NRVRIT0QiLCJJTlRFR0VSX1NFUVVFTkNFX01FVEhPRCIsIlNJR05FRF9ERUNJTUFMX0ZSQUNUSU9OX01FVEhPRCIsIkRFQ0lNQUxfRlJBQ1RJT05fTUVUSE9EIiwiU0lHTkVEX0dBVVNTSUFOX01FVEhPRCIsIkdBVVNTSUFOX01FVEhPRCIsIlNJR05FRF9TVFJJTkdfTUVUSE9EIiwiU1RSSU5HX01FVEhPRCIsIlNJR05FRF9VVUlEX01FVEhPRCIsIlVVSURfTUVUSE9EIiwiZm9ybWF0IiwiQkFTRTY0IiwiU0lHTkVEX0JMT0JfTUVUSE9EIiwiQkxPQl9NRVRIT0QiLCJvcmlnaW5hbCIsImZyb20iLCJmbGF0IiwiYSIsInJlZHVjZSIsInkiLCJ0ZXN0Iiwid2luZG93IiwiYnRvYSIsIlJlZmVyZW5jZUVycm9yIiwiQnVmZmVyIiwidG9TdHJpbmciLCJyZXBsYWNlIiwidHlwZSIsIm5hbWUiLCJ2YWx1ZSIsImMiLCJFcnJvcnMuZGVmYXVsdCIsInJvYyIsImxvZ1Jlc3BvbnNlcyIsImRhdGUiLCJmb28iLCJiYXNlNjQiLCJCTE9CX0ZPUk1BVF9CQVNFNjQiLCJoZXgiLCJCTE9CX0ZPUk1BVF9IRVgiLCJyZXF1ZXN0cyIsImRlc2NyaWJlIiwiaXQiLCJhc3NlcnQiLCJmYWlsIiwiZXJyb3JzLlJhbmRvbU9yZ1JBTkRPTU9SR0Vycm9yIiwicm9jMiIsInRpY2tldCIsInZhbCIsInJlc3BvbnNlMiIsImRlZXBFcXVhbCIsInNlcXVlbmNlIiwiaW50IiwidGFibGUiLCJpbmRleCIsImlzVVVJRCIsImlzQmFzZTY0IiwiaXNIZXgiLCJzaWduZWRUZXN0SGVscGVyIiwiZmlsbCIsInR5cGVzIiwicmV2ZWFsIiwidGlja2V0Q291bnQiLCJ0aWNrZXRzIiwicmVzdWx0cyIsIm5leHRUaWNrZXRJZCIsInByZXZpb3VzVGlja2V0SWQiLCJ2ZXJpZmljYXRpb24iLCJtb2RpZnlTaWduYXR1cmUiLCJjYWNoZSIsImVycm9ycy5SYW5kb21PcmdDYWNoZUVtcHR5RXJyb3IiLCJnb3QiLCJ1cGRhdGVkUmVxdWVzdHMiLCJ1cGRhdGVkQml0cyIsImhhc1VzZXJEYXRhIiwidmVyaWZpZWQiLCJSZWdFeHAiLCJzcGxpdCIsInRlbXAiLCJqb2luIl0sIm1hcHBpbmdzIjoiMFBBTUFBLEVBQUFDLDhCQUF3QyxjQUE0Q0MsTUFNaEYsV0FB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
Morty Proxy This is a proxified and sanitized view of the page, visit original site.