@decidables/discountable-elements 0.5.1 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,23 +3,23 @@
3
3
  * @license
4
4
  * Copyright 2019 Google LLC
5
5
  * SPDX-License-Identifier: BSD-3-Clause
6
- */const Q=globalThis,F=Q.ShadowRoot&&(void 0===Q.ShadyCSS||Q.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,U=Symbol(),t=new WeakMap;let s=class{constructor(B,Q,F){if(this._$cssResult$=!0,F!==U)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=B,this.t=Q}get styleSheet(){let B=this.o;const Q=this.t;if(F&&void 0===B){const F=void 0!==Q&&1===Q.length;F&&(B=t.get(Q)),void 0===B&&((this.o=B=new CSSStyleSheet).replaceSync(this.cssText),F&&t.set(Q,B))}return B}toString(){return this.cssText}};const I=B=>new s("string"==typeof B?B:B+"",void 0,U),g=(B,...Q)=>{const F=1===B.length?B[0]:Q.reduce((Q,F,U)=>Q+(B=>{if(!0===B._$cssResult$)return B.cssText;if("number"==typeof B)return B;throw Error("Value passed to 'css' function must be a 'css' function result: "+B+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(F)+B[U+1],B[0]);return new s(F,B,U)},i=F?B=>B:B=>B instanceof CSSStyleSheet?(B=>{let Q="";for(const F of B.cssRules)Q+=F.cssText;return I(Q)})(B):B,{is:l,defineProperty:c,getOwnPropertyDescriptor:e,getOwnPropertyNames:n,getOwnPropertySymbols:d,getPrototypeOf:C}=Object,a=globalThis,b=a.trustedTypes,o=b?b.emptyScript:"",u=a.reactiveElementPolyfillSupport,G=(B,Q)=>B,r={toAttribute(B,Q){switch(Q){case Boolean:B=B?o:null;break;case Object:case Array:B=null==B?B:JSON.stringify(B)}return B},fromAttribute(B,Q){let F=B;switch(Q){case Boolean:F=null!==B;break;case Number:F=null===B?null:Number(B);break;case Object:case Array:try{F=JSON.parse(B)}catch(B){F=null}}return F}},x=(B,Q)=>!l(B,Q),A={attribute:!0,type:String,converter:r,reflect:!1,useDefault:!1,hasChanged:x};
6
+ */const Q=globalThis,F=Q.ShadowRoot&&(void 0===Q.ShadyCSS||Q.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,U=Symbol(),t=new WeakMap;let s=class{constructor(B,Q,F){if(this._$cssResult$=!0,F!==U)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=B,this.t=Q}get styleSheet(){let B=this.o;const Q=this.t;if(F&&void 0===B){const F=void 0!==Q&&1===Q.length;F&&(B=t.get(Q)),void 0===B&&((this.o=B=new CSSStyleSheet).replaceSync(this.cssText),F&&t.set(Q,B))}return B}toString(){return this.cssText}};const I=B=>new s("string"==typeof B?B:B+"",void 0,U),g=(B,...Q)=>{const F=1===B.length?B[0]:Q.reduce((Q,F,U)=>Q+(B=>{if(!0===B._$cssResult$)return B.cssText;if("number"==typeof B)return B;throw Error("Value passed to 'css' function must be a 'css' function result: "+B+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(F)+B[U+1],B[0]);return new s(F,B,U)},i=F?B=>B:B=>B instanceof CSSStyleSheet?(B=>{let Q="";for(const F of B.cssRules)Q+=F.cssText;return I(Q)})(B):B,{is:l,defineProperty:c,getOwnPropertyDescriptor:e,getOwnPropertyNames:n,getOwnPropertySymbols:d,getPrototypeOf:C}=Object,a=globalThis,b=a.trustedTypes,o=b?b.emptyScript:"",G=a.reactiveElementPolyfillSupport,u=(B,Q)=>B,r={toAttribute(B,Q){switch(Q){case Boolean:B=B?o:null;break;case Object:case Array:B=null==B?B:JSON.stringify(B)}return B},fromAttribute(B,Q){let F=B;switch(Q){case Boolean:F=null!==B;break;case Number:F=null===B?null:Number(B);break;case Object:case Array:try{F=JSON.parse(B)}catch(B){F=null}}return F}},x=(B,Q)=>!l(B,Q),L={attribute:!0,type:String,converter:r,reflect:!1,useDefault:!1,hasChanged:x};
7
7
  /**
8
8
  * @license
9
9
  * Copyright 2017 Google LLC
10
10
  * SPDX-License-Identifier: BSD-3-Clause
11
- */Symbol.metadata??=Symbol("metadata"),a.litPropertyMetadata??=new WeakMap;let L=class extends HTMLElement{static addInitializer(B){this._$Ei(),(this.l??=[]).push(B)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(B,Q=A){if(Q.state&&(Q.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(B)&&((Q=Object.create(Q)).wrapped=!0),this.elementProperties.set(B,Q),!Q.noAccessor){const F=Symbol(),U=this.getPropertyDescriptor(B,F,Q);void 0!==U&&c(this.prototype,B,U)}}static getPropertyDescriptor(B,Q,F){const{get:U,set:t}=e(this.prototype,B)??{get(){return this[Q]},set(B){this[Q]=B}};return{get:U,set(Q){const s=U?.call(this);t?.call(this,Q),this.requestUpdate(B,s,F)},configurable:!0,enumerable:!0}}static getPropertyOptions(B){return this.elementProperties.get(B)??A}static _$Ei(){if(this.hasOwnProperty(G("elementProperties")))return;const B=C(this);B.finalize(),void 0!==B.l&&(this.l=[...B.l]),this.elementProperties=new Map(B.elementProperties)}static finalize(){if(this.hasOwnProperty(G("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(G("properties"))){const B=this.properties,Q=[...n(B),...d(B)];for(const F of Q)this.createProperty(F,B[F])}const B=this[Symbol.metadata];if(null!==B){const Q=litPropertyMetadata.get(B);if(void 0!==Q)for(const[B,F]of Q)this.elementProperties.set(B,F)}this._$Eh=new Map;for(const[B,Q]of this.elementProperties){const F=this._$Eu(B,Q);void 0!==F&&this._$Eh.set(F,B)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(B){const Q=[];if(Array.isArray(B)){const F=new Set(B.flat(1/0).reverse());for(const B of F)Q.unshift(i(B))}else void 0!==B&&Q.push(i(B));return Q}static _$Eu(B,Q){const F=Q.attribute;return!1===F?void 0:"string"==typeof F?F:"string"==typeof B?B.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(B=>this.enableUpdating=B),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(B=>B(this))}addController(B){(this._$EO??=new Set).add(B),void 0!==this.renderRoot&&this.isConnected&&B.hostConnected?.()}removeController(B){this._$EO?.delete(B)}_$E_(){const B=new Map,Q=this.constructor.elementProperties;for(const F of Q.keys())this.hasOwnProperty(F)&&(B.set(F,this[F]),delete this[F]);B.size>0&&(this._$Ep=B)}createRenderRoot(){const B=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return((B,U)=>{if(F)B.adoptedStyleSheets=U.map(B=>B instanceof CSSStyleSheet?B:B.styleSheet);else for(const F of U){const U=document.createElement("style"),t=Q.litNonce;void 0!==t&&U.setAttribute("nonce",t),U.textContent=F.cssText,B.appendChild(U)}})(B,this.constructor.elementStyles),B}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(B=>B.hostConnected?.())}enableUpdating(B){}disconnectedCallback(){this._$EO?.forEach(B=>B.hostDisconnected?.())}attributeChangedCallback(B,Q,F){this._$AK(B,F)}_$ET(B,Q){const F=this.constructor.elementProperties.get(B),U=this.constructor._$Eu(B,F);if(void 0!==U&&!0===F.reflect){const t=(void 0!==F.converter?.toAttribute?F.converter:r).toAttribute(Q,F.type);this._$Em=B,null==t?this.removeAttribute(U):this.setAttribute(U,t),this._$Em=null}}_$AK(B,Q){const F=this.constructor,U=F._$Eh.get(B);if(void 0!==U&&this._$Em!==U){const B=F.getPropertyOptions(U),t="function"==typeof B.converter?{fromAttribute:B.converter}:void 0!==B.converter?.fromAttribute?B.converter:r;this._$Em=U;const s=t.fromAttribute(Q,B.type);this[U]=s??this._$Ej?.get(U)??s,this._$Em=null}}requestUpdate(B,Q,F){if(void 0!==B){const U=this.constructor,t=this[B];if(F??=U.getPropertyOptions(B),!((F.hasChanged??x)(t,Q)||F.useDefault&&F.reflect&&t===this._$Ej?.get(B)&&!this.hasAttribute(U._$Eu(B,F))))return;this.C(B,Q,F)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(B,Q,{useDefault:F,reflect:U,wrapped:t},s){F&&!(this._$Ej??=new Map).has(B)&&(this._$Ej.set(B,s??Q??this[B]),!0!==t||void 0!==s)||(this._$AL.has(B)||(this.hasUpdated||F||(Q=void 0),this._$AL.set(B,Q)),!0===U&&this._$Em!==B&&(this._$Eq??=new Set).add(B))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(B){Promise.reject(B)}const B=this.scheduleUpdate();return null!=B&&await B,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[B,Q]of this._$Ep)this[B]=Q;this._$Ep=void 0}const B=this.constructor.elementProperties;if(B.size>0)for(const[Q,F]of B){const{wrapped:B}=F,U=this[Q];!0!==B||this._$AL.has(Q)||void 0===U||this.C(Q,void 0,F,U)}}let B=!1;const Q=this._$AL;try{B=this.shouldUpdate(Q),B?(this.willUpdate(Q),this._$EO?.forEach(B=>B.hostUpdate?.()),this.update(Q)):this._$EM()}catch(Q){throw B=!1,this._$EM(),Q}B&&this._$AE(Q)}willUpdate(B){}_$AE(B){this._$EO?.forEach(B=>B.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(B)),this.updated(B)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(B){return!0}update(B){this._$Eq&&=this._$Eq.forEach(B=>this._$ET(B,this[B])),this._$EM()}updated(B){}firstUpdated(B){}};L.elementStyles=[],L.shadowRootOptions={mode:"open"},L[G("elementProperties")]=new Map,L[G("finalized")]=new Map,u?.({ReactiveElement:L}),(a.reactiveElementVersions??=[]).push("2.1.1");
11
+ */Symbol.metadata??=Symbol("metadata"),a.litPropertyMetadata??=new WeakMap;let A=class extends HTMLElement{static addInitializer(B){this._$Ei(),(this.l??=[]).push(B)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(B,Q=L){if(Q.state&&(Q.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(B)&&((Q=Object.create(Q)).wrapped=!0),this.elementProperties.set(B,Q),!Q.noAccessor){const F=Symbol(),U=this.getPropertyDescriptor(B,F,Q);void 0!==U&&c(this.prototype,B,U)}}static getPropertyDescriptor(B,Q,F){const{get:U,set:t}=e(this.prototype,B)??{get(){return this[Q]},set(B){this[Q]=B}};return{get:U,set(Q){const s=U?.call(this);t?.call(this,Q),this.requestUpdate(B,s,F)},configurable:!0,enumerable:!0}}static getPropertyOptions(B){return this.elementProperties.get(B)??L}static _$Ei(){if(this.hasOwnProperty(u("elementProperties")))return;const B=C(this);B.finalize(),void 0!==B.l&&(this.l=[...B.l]),this.elementProperties=new Map(B.elementProperties)}static finalize(){if(this.hasOwnProperty(u("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(u("properties"))){const B=this.properties,Q=[...n(B),...d(B)];for(const F of Q)this.createProperty(F,B[F])}const B=this[Symbol.metadata];if(null!==B){const Q=litPropertyMetadata.get(B);if(void 0!==Q)for(const[B,F]of Q)this.elementProperties.set(B,F)}this._$Eh=new Map;for(const[B,Q]of this.elementProperties){const F=this._$Eu(B,Q);void 0!==F&&this._$Eh.set(F,B)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(B){const Q=[];if(Array.isArray(B)){const F=new Set(B.flat(1/0).reverse());for(const B of F)Q.unshift(i(B))}else void 0!==B&&Q.push(i(B));return Q}static _$Eu(B,Q){const F=Q.attribute;return!1===F?void 0:"string"==typeof F?F:"string"==typeof B?B.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(B=>this.enableUpdating=B),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(B=>B(this))}addController(B){(this._$EO??=new Set).add(B),void 0!==this.renderRoot&&this.isConnected&&B.hostConnected?.()}removeController(B){this._$EO?.delete(B)}_$E_(){const B=new Map,Q=this.constructor.elementProperties;for(const F of Q.keys())this.hasOwnProperty(F)&&(B.set(F,this[F]),delete this[F]);B.size>0&&(this._$Ep=B)}createRenderRoot(){const B=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return((B,U)=>{if(F)B.adoptedStyleSheets=U.map(B=>B instanceof CSSStyleSheet?B:B.styleSheet);else for(const F of U){const U=document.createElement("style"),t=Q.litNonce;void 0!==t&&U.setAttribute("nonce",t),U.textContent=F.cssText,B.appendChild(U)}})(B,this.constructor.elementStyles),B}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(B=>B.hostConnected?.())}enableUpdating(B){}disconnectedCallback(){this._$EO?.forEach(B=>B.hostDisconnected?.())}attributeChangedCallback(B,Q,F){this._$AK(B,F)}_$ET(B,Q){const F=this.constructor.elementProperties.get(B),U=this.constructor._$Eu(B,F);if(void 0!==U&&!0===F.reflect){const t=(void 0!==F.converter?.toAttribute?F.converter:r).toAttribute(Q,F.type);this._$Em=B,null==t?this.removeAttribute(U):this.setAttribute(U,t),this._$Em=null}}_$AK(B,Q){const F=this.constructor,U=F._$Eh.get(B);if(void 0!==U&&this._$Em!==U){const B=F.getPropertyOptions(U),t="function"==typeof B.converter?{fromAttribute:B.converter}:void 0!==B.converter?.fromAttribute?B.converter:r;this._$Em=U;const s=t.fromAttribute(Q,B.type);this[U]=s??this._$Ej?.get(U)??s,this._$Em=null}}requestUpdate(B,Q,F){if(void 0!==B){const U=this.constructor,t=this[B];if(F??=U.getPropertyOptions(B),!((F.hasChanged??x)(t,Q)||F.useDefault&&F.reflect&&t===this._$Ej?.get(B)&&!this.hasAttribute(U._$Eu(B,F))))return;this.C(B,Q,F)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(B,Q,{useDefault:F,reflect:U,wrapped:t},s){F&&!(this._$Ej??=new Map).has(B)&&(this._$Ej.set(B,s??Q??this[B]),!0!==t||void 0!==s)||(this._$AL.has(B)||(this.hasUpdated||F||(Q=void 0),this._$AL.set(B,Q)),!0===U&&this._$Em!==B&&(this._$Eq??=new Set).add(B))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(B){Promise.reject(B)}const B=this.scheduleUpdate();return null!=B&&await B,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[B,Q]of this._$Ep)this[B]=Q;this._$Ep=void 0}const B=this.constructor.elementProperties;if(B.size>0)for(const[Q,F]of B){const{wrapped:B}=F,U=this[Q];!0!==B||this._$AL.has(Q)||void 0===U||this.C(Q,void 0,F,U)}}let B=!1;const Q=this._$AL;try{B=this.shouldUpdate(Q),B?(this.willUpdate(Q),this._$EO?.forEach(B=>B.hostUpdate?.()),this.update(Q)):this._$EM()}catch(Q){throw B=!1,this._$EM(),Q}B&&this._$AE(Q)}willUpdate(B){}_$AE(B){this._$EO?.forEach(B=>B.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(B)),this.updated(B)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(B){return!0}update(B){this._$Eq&&=this._$Eq.forEach(B=>this._$ET(B,this[B])),this._$EM()}updated(B){}firstUpdated(B){}};A.elementStyles=[],A.shadowRootOptions={mode:"open"},A[u("elementProperties")]=new Map,A[u("finalized")]=new Map,G?.({ReactiveElement:A}),(a.reactiveElementVersions??=[]).push("2.1.1");
12
12
  /**
13
13
  * @license
14
14
  * Copyright 2017 Google LLC
15
15
  * SPDX-License-Identifier: BSD-3-Clause
16
16
  */
17
- const h=globalThis,R=h.trustedTypes,y=R?R.createPolicy("lit-html",{createHTML:B=>B}):void 0,V="$lit$",Z=`lit$${Math.random().toFixed(9).slice(2)}$`,S="?"+Z,m=`<${S}>`,E=document,N=()=>E.createComment(""),X=B=>null===B||"object"!=typeof B&&"function"!=typeof B,p=Array.isArray,W="[ \t\n\f\r]",H=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,D=/-->/g,f=/>/g,Y=RegExp(`>|${W}(?:([^\\s"'>=/]+)(${W}*=${W}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),w=/'/g,v=/"/g,J=/^(?:script|style|textarea|title)$/i,k=B=>(Q,...F)=>({_$litType$:B,strings:Q,values:F}),M=k(1),T=k(2),z=Symbol.for("lit-noChange"),K=Symbol.for("lit-nothing"),O=new WeakMap,j=E.createTreeWalker(E,129);function P(B,Q){if(!p(B)||!B.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==y?y.createHTML(Q):Q}let _=class B{constructor({strings:Q,_$litType$:F},U){let t;this.parts=[];let s=0,I=0;const g=Q.length-1,i=this.parts,[l,c]=((B,Q)=>{const F=B.length-1,U=[];let t,s=2===Q?"<svg>":3===Q?"<math>":"",I=H;for(let Q=0;Q<F;Q++){const F=B[Q];let g,i,l=-1,c=0;for(;c<F.length&&(I.lastIndex=c,i=I.exec(F),null!==i);)c=I.lastIndex,I===H?"!--"===i[1]?I=D:void 0!==i[1]?I=f:void 0!==i[2]?(J.test(i[2])&&(t=RegExp("</"+i[2],"g")),I=Y):void 0!==i[3]&&(I=Y):I===Y?">"===i[0]?(I=t??H,l=-1):void 0===i[1]?l=-2:(l=I.lastIndex-i[2].length,g=i[1],I=void 0===i[3]?Y:'"'===i[3]?v:w):I===v||I===w?I=Y:I===D||I===f?I=H:(I=Y,t=void 0);const e=I===Y&&B[Q+1].startsWith("/>")?" ":"";s+=I===H?F+m:l>=0?(U.push(g),F.slice(0,l)+V+F.slice(l)+Z+e):F+Z+(-2===l?Q:e)}return[P(B,s+(B[F]||"<?>")+(2===Q?"</svg>":3===Q?"</math>":"")),U]})(Q,F);if(this.el=B.createElement(l,U),j.currentNode=this.el.content,2===F||3===F){const B=this.el.content.firstChild;B.replaceWith(...B.childNodes)}for(;null!==(t=j.nextNode())&&i.length<g;){if(1===t.nodeType){if(t.hasAttributes())for(const B of t.getAttributeNames())if(B.endsWith(V)){const Q=c[I++],F=t.getAttribute(B).split(Z),U=/([.?@])?(.*)/.exec(Q);i.push({type:1,index:s,name:U[2],strings:F,ctor:"."===U[1]?FB:"?"===U[1]?UB:"@"===U[1]?tB:QB}),t.removeAttribute(B)}else B.startsWith(Z)&&(i.push({type:6,index:s}),t.removeAttribute(B));if(J.test(t.tagName)){const B=t.textContent.split(Z),Q=B.length-1;if(Q>0){t.textContent=R?R.emptyScript:"";for(let F=0;F<Q;F++)t.append(B[F],N()),j.nextNode(),i.push({type:2,index:++s});t.append(B[Q],N())}}}else if(8===t.nodeType)if(t.data===S)i.push({type:2,index:s});else{let B=-1;for(;-1!==(B=t.data.indexOf(Z,B+1));)i.push({type:7,index:s}),B+=Z.length-1}s++}}static createElement(B,Q){const F=E.createElement("template");return F.innerHTML=B,F}};function $(B,Q,F=B,U){if(Q===z)return Q;let t=void 0!==U?F._$Co?.[U]:F._$Cl;const s=X(Q)?void 0:Q._$litDirective$;return t?.constructor!==s&&(t?._$AO?.(!1),void 0===s?t=void 0:(t=new s(B),t._$AT(B,F,U)),void 0!==U?(F._$Co??=[])[U]=t:F._$Cl=t),void 0!==t&&(Q=$(B,t._$AS(B,Q.values),t,U)),Q}let q=class{constructor(B,Q){this._$AV=[],this._$AN=void 0,this._$AD=B,this._$AM=Q}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(B){const{el:{content:Q},parts:F}=this._$AD,U=(B?.creationScope??E).importNode(Q,!0);j.currentNode=U;let t=j.nextNode(),s=0,I=0,g=F[0];for(;void 0!==g;){if(s===g.index){let Q;2===g.type?Q=new BB(t,t.nextSibling,this,B):1===g.type?Q=new g.ctor(t,g.name,g.strings,this,B):6===g.type&&(Q=new sB(t,this,B)),this._$AV.push(Q),g=F[++I]}s!==g?.index&&(t=j.nextNode(),s++)}return j.currentNode=E,U}p(B){let Q=0;for(const F of this._$AV)void 0!==F&&(void 0!==F.strings?(F._$AI(B,F,Q),Q+=F.strings.length-2):F._$AI(B[Q])),Q++}};class BB{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(B,Q,F,U){this.type=2,this._$AH=K,this._$AN=void 0,this._$AA=B,this._$AB=Q,this._$AM=F,this.options=U,this._$Cv=U?.isConnected??!0}get parentNode(){let B=this._$AA.parentNode;const Q=this._$AM;return void 0!==Q&&11===B?.nodeType&&(B=Q.parentNode),B}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(B,Q=this){B=$(this,B,Q),X(B)?B===K||null==B||""===B?(this._$AH!==K&&this._$AR(),this._$AH=K):B!==this._$AH&&B!==z&&this._(B):void 0!==B._$litType$?this.$(B):void 0!==B.nodeType?this.T(B):(B=>p(B)||"function"==typeof B?.[Symbol.iterator])(B)?this.k(B):this._(B)}O(B){return this._$AA.parentNode.insertBefore(B,this._$AB)}T(B){this._$AH!==B&&(this._$AR(),this._$AH=this.O(B))}_(B){this._$AH!==K&&X(this._$AH)?this._$AA.nextSibling.data=B:this.T(E.createTextNode(B)),this._$AH=B}$(B){const{values:Q,_$litType$:F}=B,U="number"==typeof F?this._$AC(B):(void 0===F.el&&(F.el=_.createElement(P(F.h,F.h[0]),this.options)),F);if(this._$AH?._$AD===U)this._$AH.p(Q);else{const B=new q(U,this),F=B.u(this.options);B.p(Q),this.T(F),this._$AH=B}}_$AC(B){let Q=O.get(B.strings);return void 0===Q&&O.set(B.strings,Q=new _(B)),Q}k(B){p(this._$AH)||(this._$AH=[],this._$AR());const Q=this._$AH;let F,U=0;for(const t of B)U===Q.length?Q.push(F=new BB(this.O(N()),this.O(N()),this,this.options)):F=Q[U],F._$AI(t),U++;U<Q.length&&(this._$AR(F&&F._$AB.nextSibling,U),Q.length=U)}_$AR(B=this._$AA.nextSibling,Q){for(this._$AP?.(!1,!0,Q);B!==this._$AB;){const Q=B.nextSibling;B.remove(),B=Q}}setConnected(B){void 0===this._$AM&&(this._$Cv=B,this._$AP?.(B))}}let QB=class{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(B,Q,F,U,t){this.type=1,this._$AH=K,this._$AN=void 0,this.element=B,this.name=Q,this._$AM=U,this.options=t,F.length>2||""!==F[0]||""!==F[1]?(this._$AH=Array(F.length-1).fill(new String),this.strings=F):this._$AH=K}_$AI(B,Q=this,F,U){const t=this.strings;let s=!1;if(void 0===t)B=$(this,B,Q,0),s=!X(B)||B!==this._$AH&&B!==z,s&&(this._$AH=B);else{const U=B;let I,g;for(B=t[0],I=0;I<t.length-1;I++)g=$(this,U[F+I],Q,I),g===z&&(g=this._$AH[I]),s||=!X(g)||g!==this._$AH[I],g===K?B=K:B!==K&&(B+=(g??"")+t[I+1]),this._$AH[I]=g}s&&!U&&this.j(B)}j(B){B===K?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,B??"")}};class FB extends QB{constructor(){super(...arguments),this.type=3}j(B){this.element[this.name]=B===K?void 0:B}}class UB extends QB{constructor(){super(...arguments),this.type=4}j(B){this.element.toggleAttribute(this.name,!!B&&B!==K)}}class tB extends QB{constructor(B,Q,F,U,t){super(B,Q,F,U,t),this.type=5}_$AI(B,Q=this){if((B=$(this,B,Q,0)??K)===z)return;const F=this._$AH,U=B===K&&F!==K||B.capture!==F.capture||B.once!==F.once||B.passive!==F.passive,t=B!==K&&(F===K||U);U&&this.element.removeEventListener(this.name,this,F),t&&this.element.addEventListener(this.name,this,B),this._$AH=B}handleEvent(B){"function"==typeof this._$AH?this._$AH.call(this.options?.host??this.element,B):this._$AH.handleEvent(B)}}class sB{constructor(B,Q,F){this.element=B,this.type=6,this._$AN=void 0,this._$AM=Q,this.options=F}get _$AU(){return this._$AM._$AU}_$AI(B){$(this,B)}}const IB=h.litHtmlPolyfillSupport;IB?.(_,BB),(h.litHtmlVersions??=[]).push("3.3.1");const gB=globalThis;
17
+ const h=globalThis,R=h.trustedTypes,y=R?R.createPolicy("lit-html",{createHTML:B=>B}):void 0,V="$lit$",Z=`lit$${Math.random().toFixed(9).slice(2)}$`,S="?"+Z,m=`<${S}>`,E=document,N=()=>E.createComment(""),X=B=>null===B||"object"!=typeof B&&"function"!=typeof B,p=Array.isArray,W="[ \t\n\f\r]",H=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,D=/-->/g,Y=/>/g,f=RegExp(`>|${W}(?:([^\\s"'>=/]+)(${W}*=${W}*(?:[^ \t\n\f\r"'\`<>=]|("|')|))|$)`,"g"),w=/'/g,J=/"/g,v=/^(?:script|style|textarea|title)$/i,k=B=>(Q,...F)=>({_$litType$:B,strings:Q,values:F}),M=k(1),T=k(2),z=Symbol.for("lit-noChange"),K=Symbol.for("lit-nothing"),O=new WeakMap,P=E.createTreeWalker(E,129);function j(B,Q){if(!p(B)||!B.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==y?y.createHTML(Q):Q}let _=class B{constructor({strings:Q,_$litType$:F},U){let t;this.parts=[];let s=0,I=0;const g=Q.length-1,i=this.parts,[l,c]=((B,Q)=>{const F=B.length-1,U=[];let t,s=2===Q?"<svg>":3===Q?"<math>":"",I=H;for(let Q=0;Q<F;Q++){const F=B[Q];let g,i,l=-1,c=0;for(;c<F.length&&(I.lastIndex=c,i=I.exec(F),null!==i);)c=I.lastIndex,I===H?"!--"===i[1]?I=D:void 0!==i[1]?I=Y:void 0!==i[2]?(v.test(i[2])&&(t=RegExp("</"+i[2],"g")),I=f):void 0!==i[3]&&(I=f):I===f?">"===i[0]?(I=t??H,l=-1):void 0===i[1]?l=-2:(l=I.lastIndex-i[2].length,g=i[1],I=void 0===i[3]?f:'"'===i[3]?J:w):I===J||I===w?I=f:I===D||I===Y?I=H:(I=f,t=void 0);const e=I===f&&B[Q+1].startsWith("/>")?" ":"";s+=I===H?F+m:l>=0?(U.push(g),F.slice(0,l)+V+F.slice(l)+Z+e):F+Z+(-2===l?Q:e)}return[j(B,s+(B[F]||"<?>")+(2===Q?"</svg>":3===Q?"</math>":"")),U]})(Q,F);if(this.el=B.createElement(l,U),P.currentNode=this.el.content,2===F||3===F){const B=this.el.content.firstChild;B.replaceWith(...B.childNodes)}for(;null!==(t=P.nextNode())&&i.length<g;){if(1===t.nodeType){if(t.hasAttributes())for(const B of t.getAttributeNames())if(B.endsWith(V)){const Q=c[I++],F=t.getAttribute(B).split(Z),U=/([.?@])?(.*)/.exec(Q);i.push({type:1,index:s,name:U[2],strings:F,ctor:"."===U[1]?FB:"?"===U[1]?UB:"@"===U[1]?tB:QB}),t.removeAttribute(B)}else B.startsWith(Z)&&(i.push({type:6,index:s}),t.removeAttribute(B));if(v.test(t.tagName)){const B=t.textContent.split(Z),Q=B.length-1;if(Q>0){t.textContent=R?R.emptyScript:"";for(let F=0;F<Q;F++)t.append(B[F],N()),P.nextNode(),i.push({type:2,index:++s});t.append(B[Q],N())}}}else if(8===t.nodeType)if(t.data===S)i.push({type:2,index:s});else{let B=-1;for(;-1!==(B=t.data.indexOf(Z,B+1));)i.push({type:7,index:s}),B+=Z.length-1}s++}}static createElement(B,Q){const F=E.createElement("template");return F.innerHTML=B,F}};function $(B,Q,F=B,U){if(Q===z)return Q;let t=void 0!==U?F._$Co?.[U]:F._$Cl;const s=X(Q)?void 0:Q._$litDirective$;return t?.constructor!==s&&(t?._$AO?.(!1),void 0===s?t=void 0:(t=new s(B),t._$AT(B,F,U)),void 0!==U?(F._$Co??=[])[U]=t:F._$Cl=t),void 0!==t&&(Q=$(B,t._$AS(B,Q.values),t,U)),Q}let q=class{constructor(B,Q){this._$AV=[],this._$AN=void 0,this._$AD=B,this._$AM=Q}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(B){const{el:{content:Q},parts:F}=this._$AD,U=(B?.creationScope??E).importNode(Q,!0);P.currentNode=U;let t=P.nextNode(),s=0,I=0,g=F[0];for(;void 0!==g;){if(s===g.index){let Q;2===g.type?Q=new BB(t,t.nextSibling,this,B):1===g.type?Q=new g.ctor(t,g.name,g.strings,this,B):6===g.type&&(Q=new sB(t,this,B)),this._$AV.push(Q),g=F[++I]}s!==g?.index&&(t=P.nextNode(),s++)}return P.currentNode=E,U}p(B){let Q=0;for(const F of this._$AV)void 0!==F&&(void 0!==F.strings?(F._$AI(B,F,Q),Q+=F.strings.length-2):F._$AI(B[Q])),Q++}};class BB{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(B,Q,F,U){this.type=2,this._$AH=K,this._$AN=void 0,this._$AA=B,this._$AB=Q,this._$AM=F,this.options=U,this._$Cv=U?.isConnected??!0}get parentNode(){let B=this._$AA.parentNode;const Q=this._$AM;return void 0!==Q&&11===B?.nodeType&&(B=Q.parentNode),B}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(B,Q=this){B=$(this,B,Q),X(B)?B===K||null==B||""===B?(this._$AH!==K&&this._$AR(),this._$AH=K):B!==this._$AH&&B!==z&&this._(B):void 0!==B._$litType$?this.$(B):void 0!==B.nodeType?this.T(B):(B=>p(B)||"function"==typeof B?.[Symbol.iterator])(B)?this.k(B):this._(B)}O(B){return this._$AA.parentNode.insertBefore(B,this._$AB)}T(B){this._$AH!==B&&(this._$AR(),this._$AH=this.O(B))}_(B){this._$AH!==K&&X(this._$AH)?this._$AA.nextSibling.data=B:this.T(E.createTextNode(B)),this._$AH=B}$(B){const{values:Q,_$litType$:F}=B,U="number"==typeof F?this._$AC(B):(void 0===F.el&&(F.el=_.createElement(j(F.h,F.h[0]),this.options)),F);if(this._$AH?._$AD===U)this._$AH.p(Q);else{const B=new q(U,this),F=B.u(this.options);B.p(Q),this.T(F),this._$AH=B}}_$AC(B){let Q=O.get(B.strings);return void 0===Q&&O.set(B.strings,Q=new _(B)),Q}k(B){p(this._$AH)||(this._$AH=[],this._$AR());const Q=this._$AH;let F,U=0;for(const t of B)U===Q.length?Q.push(F=new BB(this.O(N()),this.O(N()),this,this.options)):F=Q[U],F._$AI(t),U++;U<Q.length&&(this._$AR(F&&F._$AB.nextSibling,U),Q.length=U)}_$AR(B=this._$AA.nextSibling,Q){for(this._$AP?.(!1,!0,Q);B!==this._$AB;){const Q=B.nextSibling;B.remove(),B=Q}}setConnected(B){void 0===this._$AM&&(this._$Cv=B,this._$AP?.(B))}}let QB=class{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(B,Q,F,U,t){this.type=1,this._$AH=K,this._$AN=void 0,this.element=B,this.name=Q,this._$AM=U,this.options=t,F.length>2||""!==F[0]||""!==F[1]?(this._$AH=Array(F.length-1).fill(new String),this.strings=F):this._$AH=K}_$AI(B,Q=this,F,U){const t=this.strings;let s=!1;if(void 0===t)B=$(this,B,Q,0),s=!X(B)||B!==this._$AH&&B!==z,s&&(this._$AH=B);else{const U=B;let I,g;for(B=t[0],I=0;I<t.length-1;I++)g=$(this,U[F+I],Q,I),g===z&&(g=this._$AH[I]),s||=!X(g)||g!==this._$AH[I],g===K?B=K:B!==K&&(B+=(g??"")+t[I+1]),this._$AH[I]=g}s&&!U&&this.j(B)}j(B){B===K?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,B??"")}};class FB extends QB{constructor(){super(...arguments),this.type=3}j(B){this.element[this.name]=B===K?void 0:B}}class UB extends QB{constructor(){super(...arguments),this.type=4}j(B){this.element.toggleAttribute(this.name,!!B&&B!==K)}}class tB extends QB{constructor(B,Q,F,U,t){super(B,Q,F,U,t),this.type=5}_$AI(B,Q=this){if((B=$(this,B,Q,0)??K)===z)return;const F=this._$AH,U=B===K&&F!==K||B.capture!==F.capture||B.once!==F.once||B.passive!==F.passive,t=B!==K&&(F===K||U);U&&this.element.removeEventListener(this.name,this,F),t&&this.element.addEventListener(this.name,this,B),this._$AH=B}handleEvent(B){"function"==typeof this._$AH?this._$AH.call(this.options?.host??this.element,B):this._$AH.handleEvent(B)}}class sB{constructor(B,Q,F){this.element=B,this.type=6,this._$AN=void 0,this._$AM=Q,this.options=F}get _$AU(){return this._$AM._$AU}_$AI(B){$(this,B)}}const IB=h.litHtmlPolyfillSupport;IB?.(_,BB),(h.litHtmlVersions??=[]).push("3.3.1");const gB=globalThis;
18
18
  /**
19
19
  * @license
20
20
  * Copyright 2017 Google LLC
21
21
  * SPDX-License-Identifier: BSD-3-Clause
22
- */let iB=class extends L{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const B=super.createRenderRoot();return this.renderOptions.renderBefore??=B.firstChild,B}update(B){const Q=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(B),this._$Do=((B,Q,F)=>{const U=F?.renderBefore??Q;let t=U._$litPart$;if(void 0===t){const B=F?.renderBefore??null;U._$litPart$=t=new BB(Q.insertBefore(N(),B),B,void 0,F??{})}return t._$AI(B),t})(Q,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return z}};iB._$litElement$=!0,iB.finalized=!0,gB.litElementHydrateSupport?.({LitElement:iB});const lB=gB.litElementPolyfillSupport;function cB(B,Q){return null==B||null==Q?NaN:B<Q?-1:B>Q?1:B>=Q?0:NaN}function eB(B,Q){return null==B||null==Q?NaN:Q<B?-1:Q>B?1:Q>=B?0:NaN}function nB(B){let Q,F,U;function t(B,U,t=0,s=B.length){if(t<s){if(0!==Q(U,U))return s;do{const Q=t+s>>>1;F(B[Q],U)<0?t=Q+1:s=Q}while(t<s)}return t}return 2!==B.length?(Q=cB,F=(Q,F)=>cB(B(Q),F),U=(Q,F)=>B(Q)-F):(Q=B===cB||B===eB?B:dB,F=B,U=B),{left:t,center:function(B,Q,F=0,s=B.length){const I=t(B,Q,F,s-1);return I>F&&U(B[I-1],Q)>-U(B[I],Q)?I-1:I},right:function(B,U,t=0,s=B.length){if(t<s){if(0!==Q(U,U))return s;do{const Q=t+s>>>1;F(B[Q],U)<=0?t=Q+1:s=Q}while(t<s)}return t}}}function dB(){return 0}function CB(B){return null===B?NaN:+B}lB?.({LitElement:iB}),(gB.litElementVersions??=[]).push("4.2.1");const aB=nB(cB).right;function bB(B,Q){let F=0;for(let Q of B)null!=Q&&(Q=+Q)>=Q&&++F;return F}function oB(B){return 0|B.length}function uB(B){return!(B>0)}function GB(B){return"object"!=typeof B||"length"in B?B:Array.from(B)}function rB(B,Q){var F=0;return Float64Array.from(B,B=>F+=+B||0)}function xB(B,Q){let F,U=0,t=0,s=0;if(void 0===Q)for(let Q of B)null!=Q&&(Q=+Q)>=Q&&(F=Q-t,t+=F/++U,s+=F*(Q-t));else{let I=-1;for(let g of B)null!=(g=Q(g,++I,B))&&(g=+g)>=g&&(F=g-t,t+=F/++U,s+=F*(g-t))}if(U>1)return s/(U-1)}function AB(B,Q){const F=xB(B,Q);return F?Math.sqrt(F):F}function LB(B,Q){let F,U;if(void 0===Q)for(const Q of B)null!=Q&&(void 0===F?Q>=Q&&(F=U=Q):(F>Q&&(F=Q),U<Q&&(U=Q)));else{let t=-1;for(let s of B)null!=(s=Q(s,++t,B))&&(void 0===F?s>=s&&(F=U=s):(F>s&&(F=s),U<s&&(U=s)))}return[F,U]}nB(CB).center;class hB{constructor(){this._partials=new Float64Array(32),this._n=0}add(B){const Q=this._partials;let F=0;for(let U=0;U<this._n&&U<32;U++){const t=Q[U],s=B+t,I=Math.abs(B)<Math.abs(t)?B-(s-t):t-(s-B);I&&(Q[F++]=I),B=s}return Q[F]=B,this._n=F+1,this}valueOf(){const B=this._partials;let Q,F,U,t=this._n,s=0;if(t>0){for(s=B[--t];t>0&&(Q=s,F=B[--t],s=Q+F,U=F-(s-Q),!U););t>0&&(U<0&&B[t-1]<0||U>0&&B[t-1]>0)&&(F=2*U,Q=s+F,F==Q-s&&(s=Q))}return s}}class RB extends Map{constructor(B,Q=mB){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:Q}}),null!=B)for(const[Q,F]of B)this.set(Q,F)}get(B){return super.get(VB(this,B))}has(B){return super.has(VB(this,B))}set(B,Q){return super.set(ZB(this,B),Q)}delete(B){return super.delete(SB(this,B))}}class yB extends Set{constructor(B,Q=mB){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:Q}}),null!=B)for(const Q of B)this.add(Q)}has(B){return super.has(VB(this,B))}add(B){return super.add(ZB(this,B))}delete(B){return super.delete(SB(this,B))}}function VB({_intern:B,_key:Q},F){const U=Q(F);return B.has(U)?B.get(U):F}function ZB({_intern:B,_key:Q},F){const U=Q(F);return B.has(U)?B.get(U):(B.set(U,F),F)}function SB({_intern:B,_key:Q},F){const U=Q(F);return B.has(U)&&(F=B.get(U),B.delete(U)),F}function mB(B){return null!==B&&"object"==typeof B?B.valueOf():B}function EB(B){return B}function NB(B,...Q){return WB(B,EB,EB,Q)}function XB(B,Q,...F){return WB(B,EB,Q,F)}function pB(B,Q,...F){return WB(B,Array.from,Q,F)}function WB(B,Q,F,U){return function B(t,s){if(s>=U.length)return F(t);const I=new RB,g=U[s++];let i=-1;for(const B of t){const Q=g(B,++i,t),F=I.get(Q);F?F.push(B):I.set(Q,[B])}for(const[Q,F]of I)I.set(Q,B(F,s));return Q(I)}(B,0)}function HB(B,...Q){if("function"!=typeof B[Symbol.iterator])throw new TypeError("values is not iterable");B=Array.from(B);let[F]=Q;if(F&&2!==F.length||Q.length>1){const s=Uint32Array.from(B,(B,Q)=>Q);return Q.length>1?(Q=Q.map(Q=>B.map(Q)),s.sort((B,F)=>{for(const U of Q){const Q=fB(U[B],U[F]);if(Q)return Q}})):(F=B.map(F),s.sort((B,Q)=>fB(F[B],F[Q]))),U=B,t=s,Array.from(t,B=>U[B])}var U,t;return B.sort(DB(F))}function DB(B=cB){if(B===cB)return fB;if("function"!=typeof B)throw new TypeError("compare is not a function");return(Q,F)=>{const U=B(Q,F);return U||0===U?U:(0===B(F,F))-(0===B(Q,Q))}}function fB(B,Q){return(null==B||!(B>=B))-(null==Q||!(Q>=Q))||(B<Q?-1:B>Q?1:0)}function YB(B,Q,F){return(2!==Q.length?HB(XB(B,Q,F),([B,Q],[F,U])=>cB(Q,U)||cB(B,F)):HB(NB(B,F),([B,F],[U,t])=>Q(F,t)||cB(B,U))).map(([B])=>B)}const wB=Math.sqrt(50),vB=Math.sqrt(10),JB=Math.sqrt(2);function kB(B,Q,F){const U=(Q-B)/Math.max(0,F),t=Math.floor(Math.log10(U)),s=U/Math.pow(10,t),I=s>=wB?10:s>=vB?5:s>=JB?2:1;let g,i,l;return t<0?(l=Math.pow(10,-t)/I,g=Math.round(B*l),i=Math.round(Q*l),g/l<B&&++g,i/l>Q&&--i,l=-l):(l=Math.pow(10,t)*I,g=Math.round(B/l),i=Math.round(Q/l),g*l<B&&++g,i*l>Q&&--i),i<g&&.5<=F&&F<2?kB(B,Q,2*F):[g,i,l]}function MB(B,Q,F){if(!((F=+F)>0))return[];if((B=+B)===(Q=+Q))return[B];const U=Q<B,[t,s,I]=U?kB(Q,B,F):kB(B,Q,F);if(!(s>=t))return[];const g=s-t+1,i=new Array(g);if(U)if(I<0)for(let B=0;B<g;++B)i[B]=(s-B)/-I;else for(let B=0;B<g;++B)i[B]=(s-B)*I;else if(I<0)for(let B=0;B<g;++B)i[B]=(t+B)/-I;else for(let B=0;B<g;++B)i[B]=(t+B)*I;return i}function TB(B,Q,F){return kB(B=+B,Q=+Q,F=+F)[2]}function zB(B,Q,F){F=+F;const U=(Q=+Q)<(B=+B),t=U?TB(Q,B,F):TB(B,Q,F);return(U?-1:1)*(t<0?1/-t:t)}function KB(B){return Math.max(1,Math.ceil(Math.log(bB(B))/Math.LN2)+1)}function OB(B,Q){let F;if(void 0===Q)for(const Q of B)null!=Q&&(F<Q||void 0===F&&Q>=Q)&&(F=Q);else{let U=-1;for(let t of B)null!=(t=Q(t,++U,B))&&(F<t||void 0===F&&t>=t)&&(F=t)}return F}function jB(B,Q){let F,U=-1,t=-1;if(void 0===Q)for(const Q of B)++t,null!=Q&&(F<Q||void 0===F&&Q>=Q)&&(F=Q,U=t);else for(let s of B)null!=(s=Q(s,++t,B))&&(F<s||void 0===F&&s>=s)&&(F=s,U=t);return U}function PB(B,Q){let F;if(void 0===Q)for(const Q of B)null!=Q&&(F>Q||void 0===F&&Q>=Q)&&(F=Q);else{let U=-1;for(let t of B)null!=(t=Q(t,++U,B))&&(F>t||void 0===F&&t>=t)&&(F=t)}return F}function _B(B,Q){let F,U=-1,t=-1;if(void 0===Q)for(const Q of B)++t,null!=Q&&(F>Q||void 0===F&&Q>=Q)&&(F=Q,U=t);else for(let s of B)null!=(s=Q(s,++t,B))&&(F>s||void 0===F&&s>=s)&&(F=s,U=t);return U}function $B(B,Q,F=0,U=1/0,t){if(Q=Math.floor(Q),F=Math.floor(Math.max(0,F)),U=Math.floor(Math.min(B.length-1,U)),!(F<=Q&&Q<=U))return B;for(t=void 0===t?fB:DB(t);U>F;){if(U-F>600){const s=U-F+1,I=Q-F+1,g=Math.log(s),i=.5*Math.exp(2*g/3),l=.5*Math.sqrt(g*i*(s-i)/s)*(I-s/2<0?-1:1);$B(B,Q,Math.max(F,Math.floor(Q-I*i/s+l)),Math.min(U,Math.floor(Q+(s-I)*i/s+l)),t)}const s=B[Q];let I=F,g=U;for(qB(B,F,Q),t(B[U],s)>0&&qB(B,F,U);I<g;){for(qB(B,I,g),++I,--g;t(B[I],s)<0;)++I;for(;t(B[g],s)>0;)--g}0===t(B[F],s)?qB(B,F,g):(++g,qB(B,g,U)),g<=Q&&(F=g+1),Q<=g&&(U=g-1)}return B}function qB(B,Q,F){const U=B[Q];B[Q]=B[F],B[F]=U}function BQ(B,Q=cB){let F,U=!1;if(1===Q.length){let t;for(const s of B){const B=Q(s);(U?cB(B,t)>0:0===cB(B,B))&&(F=s,t=B,U=!0)}}else for(const t of B)(U?Q(t,F)>0:0===Q(t,t))&&(F=t,U=!0);return F}function QQ(B,Q,F){if(B=Float64Array.from(function*(B,Q){if(void 0===Q)for(let Q of B)null!=Q&&(Q=+Q)>=Q&&(yield Q);else{let F=-1;for(let U of B)null!=(U=Q(U,++F,B))&&(U=+U)>=U&&(yield U)}}(B,F)),(U=B.length)&&!isNaN(Q=+Q)){if(Q<=0||U<2)return PB(B);if(Q>=1)return OB(B);var U,t=(U-1)*Q,s=Math.floor(t),I=OB($B(B,s).subarray(0,s+1));return I+(PB(B.subarray(s+1))-I)*(t-s)}}function FQ(B,Q,F=CB){if((U=B.length)&&!isNaN(Q=+Q)){if(Q<=0||U<2)return+F(B[0],0,B);if(Q>=1)return+F(B[U-1],U-1,B);var U,t=(U-1)*Q,s=Math.floor(t),I=+F(B[s],s,B);return I+(+F(B[s+1],s+1,B)-I)*(t-s)}}function UQ(B,Q,F){const U=bB(B),t=QQ(B,.75)-QQ(B,.25);return U&&t?Math.ceil((F-Q)/(2*t*Math.pow(U,-1/3))):1}function tQ(B,Q,F){const U=bB(B),t=AB(B);return U&&t?Math.ceil((F-Q)*Math.cbrt(U)/(3.49*t)):1}function sQ(B,Q){let F=0,U=0;if(void 0===Q)for(let Q of B)null!=Q&&(Q=+Q)>=Q&&(++F,U+=Q);else{let t=-1;for(let s of B)null!=(s=Q(s,++t,B))&&(s=+s)>=s&&(++F,U+=s)}if(F)return U/F}function IQ(B,Q){return QQ(B,.5,Q)}function gQ(B){return Array.from(function*(B){for(const Q of B)yield*Q}(B))}function iQ(B,Q){const F=new RB;if(void 0===Q)for(let Q of B)null!=Q&&Q>=Q&&F.set(Q,(F.get(Q)||0)+1);else{let U=-1;for(let t of B)null!=(t=Q(t,++U,B))&&t>=t&&F.set(t,(F.get(t)||0)+1)}let U,t=0;for(const[B,Q]of F)Q>t&&(t=Q,U=B);return U}function lQ(B,Q){return[B,Q]}function cQ(B,Q,F){B=+B,Q=+Q,F=(t=arguments.length)<2?(Q=B,B=0,1):t<3?1:+F;for(var U=-1,t=0|Math.max(0,Math.ceil((Q-B)/F)),s=new Array(t);++U<t;)s[U]=B+U*F;return s}function eQ(B,Q){let F=0;if(void 0===Q)for(let Q of B)(Q=+Q)&&(F+=Q);else{let U=-1;for(let t of B)(t=+Q(t,++U,B))&&(F+=t)}return F}function nQ(B){if("function"!=typeof B[Symbol.iterator])throw new TypeError("values is not iterable");return Array.from(B).reverse()}function dQ(B){return B}var CQ=1e-6;function aQ(B){return"translate("+B+",0)"}function bQ(B){return"translate(0,"+B+")"}function oQ(B){return Q=>+B(Q)}function uQ(B,Q){return Q=Math.max(0,B.bandwidth()-2*Q)/2,B.round()&&(Q=Math.round(Q)),F=>+B(F)+Q}function GQ(){return!this.__axis}function rQ(B,Q){var F=[],U=null,t=null,s=6,I=6,g=3,i="undefined"!=typeof window&&window.devicePixelRatio>1?0:.5,l=1===B||4===B?-1:1,c=4===B||2===B?"x":"y",e=1===B||3===B?aQ:bQ;function n(n){var d=null==U?Q.ticks?Q.ticks.apply(Q,F):Q.domain():U,C=null==t?Q.tickFormat?Q.tickFormat.apply(Q,F):dQ:t,a=Math.max(s,0)+g,b=Q.range(),o=+b[0]+i,u=+b[b.length-1]+i,G=(Q.bandwidth?uQ:oQ)(Q.copy(),i),r=n.selection?n.selection():n,x=r.selectAll(".domain").data([null]),A=r.selectAll(".tick").data(d,Q).order(),L=A.exit(),h=A.enter().append("g").attr("class","tick"),R=A.select("line"),y=A.select("text");x=x.merge(x.enter().insert("path",".tick").attr("class","domain").attr("stroke","currentColor")),A=A.merge(h),R=R.merge(h.append("line").attr("stroke","currentColor").attr(c+"2",l*s)),y=y.merge(h.append("text").attr("fill","currentColor").attr(c,l*a).attr("dy",1===B?"0em":3===B?"0.71em":"0.32em")),n!==r&&(x=x.transition(n),A=A.transition(n),R=R.transition(n),y=y.transition(n),L=L.transition(n).attr("opacity",CQ).attr("transform",function(B){return isFinite(B=G(B))?e(B+i):this.getAttribute("transform")}),h.attr("opacity",CQ).attr("transform",function(B){var Q=this.parentNode.__axis;return e((Q&&isFinite(Q=Q(B))?Q:G(B))+i)})),L.remove(),x.attr("d",4===B||2===B?I?"M"+l*I+","+o+"H"+i+"V"+u+"H"+l*I:"M"+i+","+o+"V"+u:I?"M"+o+","+l*I+"V"+i+"H"+u+"V"+l*I:"M"+o+","+i+"H"+u),A.attr("opacity",1).attr("transform",function(B){return e(G(B)+i)}),R.attr(c+"2",l*s),y.attr(c,l*a).text(C),r.filter(GQ).attr("fill","none").attr("font-size",10).attr("font-family","sans-serif").attr("text-anchor",2===B?"start":4===B?"end":"middle"),r.each(function(){this.__axis=G})}return n.scale=function(B){return arguments.length?(Q=B,n):Q},n.ticks=function(){return F=Array.from(arguments),n},n.tickArguments=function(B){return arguments.length?(F=null==B?[]:Array.from(B),n):F.slice()},n.tickValues=function(B){return arguments.length?(U=null==B?null:Array.from(B),n):U&&U.slice()},n.tickFormat=function(B){return arguments.length?(t=B,n):t},n.tickSize=function(B){return arguments.length?(s=I=+B,n):s},n.tickSizeInner=function(B){return arguments.length?(s=+B,n):s},n.tickSizeOuter=function(B){return arguments.length?(I=+B,n):I},n.tickPadding=function(B){return arguments.length?(g=+B,n):g},n.offset=function(B){return arguments.length?(i=+B,n):i},n}function xQ(B){return rQ(3,B)}var AQ={value:()=>{}};function LQ(){for(var B,Q=0,F=arguments.length,U={};Q<F;++Q){if(!(B=arguments[Q]+"")||B in U||/[\s.]/.test(B))throw new Error("illegal type: "+B);U[B]=[]}return new hQ(U)}function hQ(B){this._=B}function RQ(B,Q){for(var F,U=0,t=B.length;U<t;++U)if((F=B[U]).name===Q)return F.value}function yQ(B,Q,F){for(var U=0,t=B.length;U<t;++U)if(B[U].name===Q){B[U]=AQ,B=B.slice(0,U).concat(B.slice(U+1));break}return null!=F&&B.push({name:Q,value:F}),B}hQ.prototype=LQ.prototype={constructor:hQ,on:function(B,Q){var F,U,t=this._,s=(U=t,(B+"").trim().split(/^|\s+/).map(function(B){var Q="",F=B.indexOf(".");if(F>=0&&(Q=B.slice(F+1),B=B.slice(0,F)),B&&!U.hasOwnProperty(B))throw new Error("unknown type: "+B);return{type:B,name:Q}})),I=-1,g=s.length;if(!(arguments.length<2)){if(null!=Q&&"function"!=typeof Q)throw new Error("invalid callback: "+Q);for(;++I<g;)if(F=(B=s[I]).type)t[F]=yQ(t[F],B.name,Q);else if(null==Q)for(F in t)t[F]=yQ(t[F],B.name,null);return this}for(;++I<g;)if((F=(B=s[I]).type)&&(F=RQ(t[F],B.name)))return F},copy:function(){var B={},Q=this._;for(var F in Q)B[F]=Q[F].slice();return new hQ(B)},call:function(B,Q){if((F=arguments.length-2)>0)for(var F,U,t=new Array(F),s=0;s<F;++s)t[s]=arguments[s+2];if(!this._.hasOwnProperty(B))throw new Error("unknown type: "+B);for(s=0,F=(U=this._[B]).length;s<F;++s)U[s].value.apply(Q,t)},apply:function(B,Q,F){if(!this._.hasOwnProperty(B))throw new Error("unknown type: "+B);for(var U=this._[B],t=0,s=U.length;t<s;++t)U[t].value.apply(Q,F)}};var VQ="http://www.w3.org/1999/xhtml",ZQ={svg:"http://www.w3.org/2000/svg",xhtml:VQ,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function SQ(B){var Q=B+="",F=Q.indexOf(":");return F>=0&&"xmlns"!==(Q=B.slice(0,F))&&(B=B.slice(F+1)),ZQ.hasOwnProperty(Q)?{space:ZQ[Q],local:B}:B}function mQ(B){return function(){var Q=this.ownerDocument,F=this.namespaceURI;return F===VQ&&Q.documentElement.namespaceURI===VQ?Q.createElement(B):Q.createElementNS(F,B)}}function EQ(B){return function(){return this.ownerDocument.createElementNS(B.space,B.local)}}function NQ(B){var Q=SQ(B);return(Q.local?EQ:mQ)(Q)}function XQ(){}function pQ(B){return null==B?XQ:function(){return this.querySelector(B)}}function WQ(){return[]}function HQ(B){return null==B?WQ:function(){return this.querySelectorAll(B)}}function DQ(B){return function(){return function(B){return null==B?[]:Array.isArray(B)?B:Array.from(B)}(B.apply(this,arguments))}}function fQ(B){return function(){return this.matches(B)}}function YQ(B){return function(Q){return Q.matches(B)}}var wQ=Array.prototype.find;function vQ(){return this.firstElementChild}var JQ=Array.prototype.filter;function kQ(){return Array.from(this.children)}function MQ(B){return new Array(B.length)}function TQ(B,Q){this.ownerDocument=B.ownerDocument,this.namespaceURI=B.namespaceURI,this._next=null,this._parent=B,this.__data__=Q}function zQ(B,Q,F,U,t,s){for(var I,g=0,i=Q.length,l=s.length;g<l;++g)(I=Q[g])?(I.__data__=s[g],U[g]=I):F[g]=new TQ(B,s[g]);for(;g<i;++g)(I=Q[g])&&(t[g]=I)}function KQ(B,Q,F,U,t,s,I){var g,i,l,c=new Map,e=Q.length,n=s.length,d=new Array(e);for(g=0;g<e;++g)(i=Q[g])&&(d[g]=l=I.call(i,i.__data__,g,Q)+"",c.has(l)?t[g]=i:c.set(l,i));for(g=0;g<n;++g)l=I.call(B,s[g],g,s)+"",(i=c.get(l))?(U[g]=i,i.__data__=s[g],c.delete(l)):F[g]=new TQ(B,s[g]);for(g=0;g<e;++g)(i=Q[g])&&c.get(d[g])===i&&(t[g]=i)}function OQ(B){return B.__data__}function jQ(B){return"object"==typeof B&&"length"in B?B:Array.from(B)}function PQ(B,Q){return B<Q?-1:B>Q?1:B>=Q?0:NaN}function _Q(B){return function(){this.removeAttribute(B)}}function $Q(B){return function(){this.removeAttributeNS(B.space,B.local)}}function qQ(B,Q){return function(){this.setAttribute(B,Q)}}function BF(B,Q){return function(){this.setAttributeNS(B.space,B.local,Q)}}function QF(B,Q){return function(){var F=Q.apply(this,arguments);null==F?this.removeAttribute(B):this.setAttribute(B,F)}}function FF(B,Q){return function(){var F=Q.apply(this,arguments);null==F?this.removeAttributeNS(B.space,B.local):this.setAttributeNS(B.space,B.local,F)}}function UF(B){return B.ownerDocument&&B.ownerDocument.defaultView||B.document&&B||B.defaultView}function tF(B){return function(){this.style.removeProperty(B)}}function sF(B,Q,F){return function(){this.style.setProperty(B,Q,F)}}function IF(B,Q,F){return function(){var U=Q.apply(this,arguments);null==U?this.style.removeProperty(B):this.style.setProperty(B,U,F)}}function gF(B,Q){return B.style.getPropertyValue(Q)||UF(B).getComputedStyle(B,null).getPropertyValue(Q)}function iF(B){return function(){delete this[B]}}function lF(B,Q){return function(){this[B]=Q}}function cF(B,Q){return function(){var F=Q.apply(this,arguments);null==F?delete this[B]:this[B]=F}}function eF(B){return B.trim().split(/^|\s+/)}function nF(B){return B.classList||new dF(B)}function dF(B){this._node=B,this._names=eF(B.getAttribute("class")||"")}function CF(B,Q){for(var F=nF(B),U=-1,t=Q.length;++U<t;)F.add(Q[U])}function aF(B,Q){for(var F=nF(B),U=-1,t=Q.length;++U<t;)F.remove(Q[U])}function bF(B){return function(){CF(this,B)}}function oF(B){return function(){aF(this,B)}}function uF(B,Q){return function(){(Q.apply(this,arguments)?CF:aF)(this,B)}}function GF(){this.textContent=""}function rF(B){return function(){this.textContent=B}}function xF(B){return function(){var Q=B.apply(this,arguments);this.textContent=null==Q?"":Q}}function AF(){this.innerHTML=""}function LF(B){return function(){this.innerHTML=B}}function hF(B){return function(){var Q=B.apply(this,arguments);this.innerHTML=null==Q?"":Q}}function RF(){this.nextSibling&&this.parentNode.appendChild(this)}function yF(){this.previousSibling&&this.parentNode.insertBefore(this,this.parentNode.firstChild)}function VF(){return null}function ZF(){var B=this.parentNode;B&&B.removeChild(this)}function SF(){var B=this.cloneNode(!1),Q=this.parentNode;return Q?Q.insertBefore(B,this.nextSibling):B}function mF(){var B=this.cloneNode(!0),Q=this.parentNode;return Q?Q.insertBefore(B,this.nextSibling):B}function EF(B){return function(){var Q=this.__on;if(Q){for(var F,U=0,t=-1,s=Q.length;U<s;++U)F=Q[U],B.type&&F.type!==B.type||F.name!==B.name?Q[++t]=F:this.removeEventListener(F.type,F.listener,F.options);++t?Q.length=t:delete this.__on}}}function NF(B,Q,F){return function(){var U,t=this.__on,s=function(B){return function(Q){B.call(this,Q,this.__data__)}}(Q);if(t)for(var I=0,g=t.length;I<g;++I)if((U=t[I]).type===B.type&&U.name===B.name)return this.removeEventListener(U.type,U.listener,U.options),this.addEventListener(U.type,U.listener=s,U.options=F),void(U.value=Q);this.addEventListener(B.type,s,F),U={type:B.type,name:B.name,value:Q,listener:s,options:F},t?t.push(U):this.__on=[U]}}function XF(B,Q,F){var U=UF(B),t=U.CustomEvent;"function"==typeof t?t=new t(Q,F):(t=U.document.createEvent("Event"),F?(t.initEvent(Q,F.bubbles,F.cancelable),t.detail=F.detail):t.initEvent(Q,!1,!1)),B.dispatchEvent(t)}function pF(B,Q){return function(){return XF(this,B,Q)}}function WF(B,Q){return function(){return XF(this,B,Q.apply(this,arguments))}}TQ.prototype={constructor:TQ,appendChild:function(B){return this._parent.insertBefore(B,this._next)},insertBefore:function(B,Q){return this._parent.insertBefore(B,Q)},querySelector:function(B){return this._parent.querySelector(B)},querySelectorAll:function(B){return this._parent.querySelectorAll(B)}},dF.prototype={add:function(B){this._names.indexOf(B)<0&&(this._names.push(B),this._node.setAttribute("class",this._names.join(" ")))},remove:function(B){var Q=this._names.indexOf(B);Q>=0&&(this._names.splice(Q,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(B){return this._names.indexOf(B)>=0}};var HF=[null];function DF(B,Q){this._groups=B,this._parents=Q}function fF(){return new DF([[document.documentElement]],HF)}function YF(B){return"string"==typeof B?new DF([[document.querySelector(B)]],[document.documentElement]):new DF([[B]],HF)}function wF(B,Q){if(B=function(B){let Q;for(;Q=B.sourceEvent;)B=Q;return B}(B),void 0===Q&&(Q=B.currentTarget),Q){var F=Q.ownerSVGElement||Q;if(F.createSVGPoint){var U=F.createSVGPoint();return U.x=B.clientX,U.y=B.clientY,[(U=U.matrixTransform(Q.getScreenCTM().inverse())).x,U.y]}if(Q.getBoundingClientRect){var t=Q.getBoundingClientRect();return[B.clientX-t.left-Q.clientLeft,B.clientY-t.top-Q.clientTop]}}return[B.pageX,B.pageY]}DF.prototype=fF.prototype={constructor:DF,select:function(B){"function"!=typeof B&&(B=pQ(B));for(var Q=this._groups,F=Q.length,U=new Array(F),t=0;t<F;++t)for(var s,I,g=Q[t],i=g.length,l=U[t]=new Array(i),c=0;c<i;++c)(s=g[c])&&(I=B.call(s,s.__data__,c,g))&&("__data__"in s&&(I.__data__=s.__data__),l[c]=I);return new DF(U,this._parents)},selectAll:function(B){B="function"==typeof B?DQ(B):HQ(B);for(var Q=this._groups,F=Q.length,U=[],t=[],s=0;s<F;++s)for(var I,g=Q[s],i=g.length,l=0;l<i;++l)(I=g[l])&&(U.push(B.call(I,I.__data__,l,g)),t.push(I));return new DF(U,t)},selectChild:function(B){return this.select(null==B?vQ:function(B){return function(){return wQ.call(this.children,B)}}("function"==typeof B?B:YQ(B)))},selectChildren:function(B){return this.selectAll(null==B?kQ:function(B){return function(){return JQ.call(this.children,B)}}("function"==typeof B?B:YQ(B)))},filter:function(B){"function"!=typeof B&&(B=fQ(B));for(var Q=this._groups,F=Q.length,U=new Array(F),t=0;t<F;++t)for(var s,I=Q[t],g=I.length,i=U[t]=[],l=0;l<g;++l)(s=I[l])&&B.call(s,s.__data__,l,I)&&i.push(s);return new DF(U,this._parents)},data:function(B,Q){if(!arguments.length)return Array.from(this,OQ);var F=Q?KQ:zQ,U=this._parents,t=this._groups;"function"!=typeof B&&(B=function(B){return function(){return B}}(B));for(var s=t.length,I=new Array(s),g=new Array(s),i=new Array(s),l=0;l<s;++l){var c=U[l],e=t[l],n=e.length,d=jQ(B.call(c,c&&c.__data__,l,U)),C=d.length,a=g[l]=new Array(C),b=I[l]=new Array(C);F(c,e,a,b,i[l]=new Array(n),d,Q);for(var o,u,G=0,r=0;G<C;++G)if(o=a[G]){for(G>=r&&(r=G+1);!(u=b[r])&&++r<C;);o._next=u||null}}return(I=new DF(I,U))._enter=g,I._exit=i,I},enter:function(){return new DF(this._enter||this._groups.map(MQ),this._parents)},exit:function(){return new DF(this._exit||this._groups.map(MQ),this._parents)},join:function(B,Q,F){var U=this.enter(),t=this,s=this.exit();return"function"==typeof B?(U=B(U))&&(U=U.selection()):U=U.append(B+""),null!=Q&&(t=Q(t))&&(t=t.selection()),null==F?s.remove():F(s),U&&t?U.merge(t).order():t},merge:function(B){for(var Q=B.selection?B.selection():B,F=this._groups,U=Q._groups,t=F.length,s=U.length,I=Math.min(t,s),g=new Array(t),i=0;i<I;++i)for(var l,c=F[i],e=U[i],n=c.length,d=g[i]=new Array(n),C=0;C<n;++C)(l=c[C]||e[C])&&(d[C]=l);for(;i<t;++i)g[i]=F[i];return new DF(g,this._parents)},selection:function(){return this},order:function(){for(var B=this._groups,Q=-1,F=B.length;++Q<F;)for(var U,t=B[Q],s=t.length-1,I=t[s];--s>=0;)(U=t[s])&&(I&&4^U.compareDocumentPosition(I)&&I.parentNode.insertBefore(U,I),I=U);return this},sort:function(B){function Q(Q,F){return Q&&F?B(Q.__data__,F.__data__):!Q-!F}B||(B=PQ);for(var F=this._groups,U=F.length,t=new Array(U),s=0;s<U;++s){for(var I,g=F[s],i=g.length,l=t[s]=new Array(i),c=0;c<i;++c)(I=g[c])&&(l[c]=I);l.sort(Q)}return new DF(t,this._parents).order()},call:function(){var B=arguments[0];return arguments[0]=this,B.apply(null,arguments),this},nodes:function(){return Array.from(this)},node:function(){for(var B=this._groups,Q=0,F=B.length;Q<F;++Q)for(var U=B[Q],t=0,s=U.length;t<s;++t){var I=U[t];if(I)return I}return null},size:function(){let B=0;for(const Q of this)++B;return B},empty:function(){return!this.node()},each:function(B){for(var Q=this._groups,F=0,U=Q.length;F<U;++F)for(var t,s=Q[F],I=0,g=s.length;I<g;++I)(t=s[I])&&B.call(t,t.__data__,I,s);return this},attr:function(B,Q){var F=SQ(B);if(arguments.length<2){var U=this.node();return F.local?U.getAttributeNS(F.space,F.local):U.getAttribute(F)}return this.each((null==Q?F.local?$Q:_Q:"function"==typeof Q?F.local?FF:QF:F.local?BF:qQ)(F,Q))},style:function(B,Q,F){return arguments.length>1?this.each((null==Q?tF:"function"==typeof Q?IF:sF)(B,Q,null==F?"":F)):gF(this.node(),B)},property:function(B,Q){return arguments.length>1?this.each((null==Q?iF:"function"==typeof Q?cF:lF)(B,Q)):this.node()[B]},classed:function(B,Q){var F=eF(B+"");if(arguments.length<2){for(var U=nF(this.node()),t=-1,s=F.length;++t<s;)if(!U.contains(F[t]))return!1;return!0}return this.each(("function"==typeof Q?uF:Q?bF:oF)(F,Q))},text:function(B){return arguments.length?this.each(null==B?GF:("function"==typeof B?xF:rF)(B)):this.node().textContent},html:function(B){return arguments.length?this.each(null==B?AF:("function"==typeof B?hF:LF)(B)):this.node().innerHTML},raise:function(){return this.each(RF)},lower:function(){return this.each(yF)},append:function(B){var Q="function"==typeof B?B:NQ(B);return this.select(function(){return this.appendChild(Q.apply(this,arguments))})},insert:function(B,Q){var F="function"==typeof B?B:NQ(B),U=null==Q?VF:"function"==typeof Q?Q:pQ(Q);return this.select(function(){return this.insertBefore(F.apply(this,arguments),U.apply(this,arguments)||null)})},remove:function(){return this.each(ZF)},clone:function(B){return this.select(B?mF:SF)},datum:function(B){return arguments.length?this.property("__data__",B):this.node().__data__},on:function(B,Q,F){var U,t,s=function(B){return B.trim().split(/^|\s+/).map(function(B){var Q="",F=B.indexOf(".");return F>=0&&(Q=B.slice(F+1),B=B.slice(0,F)),{type:B,name:Q}})}(B+""),I=s.length;if(!(arguments.length<2)){for(g=Q?NF:EF,U=0;U<I;++U)this.each(g(s[U],Q,F));return this}var g=this.node().__on;if(g)for(var i,l=0,c=g.length;l<c;++l)for(U=0,i=g[l];U<I;++U)if((t=s[U]).type===i.type&&t.name===i.name)return i.value},dispatch:function(B,Q){return this.each(("function"==typeof Q?WF:pF)(B,Q))},[Symbol.iterator]:function*(){for(var B=this._groups,Q=0,F=B.length;Q<F;++Q)for(var U,t=B[Q],s=0,I=t.length;s<I;++s)(U=t[s])&&(yield U)}};const vF={passive:!1},JF={capture:!0,passive:!1};function kF(B){B.stopImmediatePropagation()}function MF(B){B.preventDefault(),B.stopImmediatePropagation()}var TF=B=>()=>B;function zF(B,{sourceEvent:Q,subject:F,target:U,identifier:t,active:s,x:I,y:g,dx:i,dy:l,dispatch:c}){Object.defineProperties(this,{type:{value:B,enumerable:!0,configurable:!0},sourceEvent:{value:Q,enumerable:!0,configurable:!0},subject:{value:F,enumerable:!0,configurable:!0},target:{value:U,enumerable:!0,configurable:!0},identifier:{value:t,enumerable:!0,configurable:!0},active:{value:s,enumerable:!0,configurable:!0},x:{value:I,enumerable:!0,configurable:!0},y:{value:g,enumerable:!0,configurable:!0},dx:{value:i,enumerable:!0,configurable:!0},dy:{value:l,enumerable:!0,configurable:!0},_:{value:c}})}function KF(B){return!B.ctrlKey&&!B.button}function OF(){return this.parentNode}function jF(B,Q){return null==Q?{x:B.x,y:B.y}:Q}function PF(){return navigator.maxTouchPoints||"ontouchstart"in this}function _F(){var B,Q,F,U,t=KF,s=OF,I=jF,g=PF,i={},l=LQ("start","drag","end"),c=0,e=0;function n(B){B.on("mousedown.drag",d).filter(g).on("touchstart.drag",b).on("touchmove.drag",o,vF).on("touchend.drag touchcancel.drag",u).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function d(I,g){if(!U&&t.call(this,I,g)){var i=G(this,s.call(this,I,g),I,g,"mouse");i&&(YF(I.view).on("mousemove.drag",C,JF).on("mouseup.drag",a,JF),function(B){var Q=B.document.documentElement,F=YF(B).on("dragstart.drag",MF,JF);"onselectstart"in Q?F.on("selectstart.drag",MF,JF):(Q.__noselect=Q.style.MozUserSelect,Q.style.MozUserSelect="none")}(I.view),kF(I),F=!1,B=I.clientX,Q=I.clientY,i("start",I))}}function C(U){if(MF(U),!F){var t=U.clientX-B,s=U.clientY-Q;F=t*t+s*s>e}i.mouse("drag",U)}function a(B){YF(B.view).on("mousemove.drag mouseup.drag",null),function(B,Q){var F=B.document.documentElement,U=YF(B).on("dragstart.drag",null);Q&&(U.on("click.drag",MF,JF),setTimeout(function(){U.on("click.drag",null)},0)),"onselectstart"in F?U.on("selectstart.drag",null):(F.style.MozUserSelect=F.__noselect,delete F.__noselect)}(B.view,F),MF(B),i.mouse("end",B)}function b(B,Q){if(t.call(this,B,Q)){var F,U,I=B.changedTouches,g=s.call(this,B,Q),i=I.length;for(F=0;F<i;++F)(U=G(this,g,B,Q,I[F].identifier,I[F]))&&(kF(B),U("start",B,I[F]))}}function o(B){var Q,F,U=B.changedTouches,t=U.length;for(Q=0;Q<t;++Q)(F=i[U[Q].identifier])&&(MF(B),F("drag",B,U[Q]))}function u(B){var Q,F,t=B.changedTouches,s=t.length;for(U&&clearTimeout(U),U=setTimeout(function(){U=null},500),Q=0;Q<s;++Q)(F=i[t[Q].identifier])&&(kF(B),F("end",B,t[Q]))}function G(B,Q,F,U,t,s){var g,e,d,C=l.copy(),a=wF(s||F,Q);if(null!=(d=I.call(B,new zF("beforestart",{sourceEvent:F,target:n,identifier:t,active:c,x:a[0],y:a[1],dx:0,dy:0,dispatch:C}),U)))return g=d.x-a[0]||0,e=d.y-a[1]||0,function F(s,I,l){var b,o=a;switch(s){case"start":i[t]=F,b=c++;break;case"end":delete i[t],--c;case"drag":a=wF(l||I,Q),b=c}C.call(s,B,new zF(s,{sourceEvent:I,subject:d,target:n,identifier:t,active:b,x:a[0]+g,y:a[1]+e,dx:a[0]-o[0],dy:a[1]-o[1],dispatch:C}),U)}}return n.filter=function(B){return arguments.length?(t="function"==typeof B?B:TF(!!B),n):t},n.container=function(B){return arguments.length?(s="function"==typeof B?B:TF(B),n):s},n.subject=function(B){return arguments.length?(I="function"==typeof B?B:TF(B),n):I},n.touchable=function(B){return arguments.length?(g="function"==typeof B?B:TF(!!B),n):g},n.on=function(){var B=l.on.apply(l,arguments);return B===l?n:B},n.clickDistance=function(B){return arguments.length?(e=(B=+B)*B,n):Math.sqrt(e)},n}function $F(B,Q,F){B.prototype=Q.prototype=F,F.constructor=B}function qF(B,Q){var F=Object.create(B.prototype);for(var U in Q)F[U]=Q[U];return F}function BU(){}zF.prototype.on=function(){var B=this._.on.apply(this._,arguments);return B===this._?this:B};var QU=.7,FU=1/QU,UU="\\s*([+-]?\\d+)\\s*",tU="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*",sU="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*",IU=/^#([0-9a-f]{3,8})$/,gU=new RegExp(`^rgb\\(${UU},${UU},${UU}\\)$`),iU=new RegExp(`^rgb\\(${sU},${sU},${sU}\\)$`),lU=new RegExp(`^rgba\\(${UU},${UU},${UU},${tU}\\)$`),cU=new RegExp(`^rgba\\(${sU},${sU},${sU},${tU}\\)$`),eU=new RegExp(`^hsl\\(${tU},${sU},${sU}\\)$`),nU=new RegExp(`^hsla\\(${tU},${sU},${sU},${tU}\\)$`),dU={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};function CU(){return this.rgb().formatHex()}function aU(){return this.rgb().formatRgb()}function bU(B){var Q,F;return B=(B+"").trim().toLowerCase(),(Q=IU.exec(B))?(F=Q[1].length,Q=parseInt(Q[1],16),6===F?oU(Q):3===F?new xU(Q>>8&15|Q>>4&240,Q>>4&15|240&Q,(15&Q)<<4|15&Q,1):8===F?uU(Q>>24&255,Q>>16&255,Q>>8&255,(255&Q)/255):4===F?uU(Q>>12&15|Q>>8&240,Q>>8&15|Q>>4&240,Q>>4&15|240&Q,((15&Q)<<4|15&Q)/255):null):(Q=gU.exec(B))?new xU(Q[1],Q[2],Q[3],1):(Q=iU.exec(B))?new xU(255*Q[1]/100,255*Q[2]/100,255*Q[3]/100,1):(Q=lU.exec(B))?uU(Q[1],Q[2],Q[3],Q[4]):(Q=cU.exec(B))?uU(255*Q[1]/100,255*Q[2]/100,255*Q[3]/100,Q[4]):(Q=eU.exec(B))?VU(Q[1],Q[2]/100,Q[3]/100,1):(Q=nU.exec(B))?VU(Q[1],Q[2]/100,Q[3]/100,Q[4]):dU.hasOwnProperty(B)?oU(dU[B]):"transparent"===B?new xU(NaN,NaN,NaN,0):null}function oU(B){return new xU(B>>16&255,B>>8&255,255&B,1)}function uU(B,Q,F,U){return U<=0&&(B=Q=F=NaN),new xU(B,Q,F,U)}function GU(B){return B instanceof BU||(B=bU(B)),B?new xU((B=B.rgb()).r,B.g,B.b,B.opacity):new xU}function rU(B,Q,F,U){return 1===arguments.length?GU(B):new xU(B,Q,F,null==U?1:U)}function xU(B,Q,F,U){this.r=+B,this.g=+Q,this.b=+F,this.opacity=+U}function AU(){return`#${yU(this.r)}${yU(this.g)}${yU(this.b)}`}function LU(){const B=hU(this.opacity);return`${1===B?"rgb(":"rgba("}${RU(this.r)}, ${RU(this.g)}, ${RU(this.b)}${1===B?")":`, ${B})`}`}function hU(B){return isNaN(B)?1:Math.max(0,Math.min(1,B))}function RU(B){return Math.max(0,Math.min(255,Math.round(B)||0))}function yU(B){return((B=RU(B))<16?"0":"")+B.toString(16)}function VU(B,Q,F,U){return U<=0?B=Q=F=NaN:F<=0||F>=1?B=Q=NaN:Q<=0&&(B=NaN),new mU(B,Q,F,U)}function ZU(B){if(B instanceof mU)return new mU(B.h,B.s,B.l,B.opacity);if(B instanceof BU||(B=bU(B)),!B)return new mU;if(B instanceof mU)return B;var Q=(B=B.rgb()).r/255,F=B.g/255,U=B.b/255,t=Math.min(Q,F,U),s=Math.max(Q,F,U),I=NaN,g=s-t,i=(s+t)/2;return g?(I=Q===s?(F-U)/g+6*(F<U):F===s?(U-Q)/g+2:(Q-F)/g+4,g/=i<.5?s+t:2-s-t,I*=60):g=i>0&&i<1?0:I,new mU(I,g,i,B.opacity)}function SU(B,Q,F,U){return 1===arguments.length?ZU(B):new mU(B,Q,F,null==U?1:U)}function mU(B,Q,F,U){this.h=+B,this.s=+Q,this.l=+F,this.opacity=+U}function EU(B){return(B=(B||0)%360)<0?B+360:B}function NU(B){return Math.max(0,Math.min(1,B||0))}function XU(B,Q,F){return 255*(B<60?Q+(F-Q)*B/60:B<180?F:B<240?Q+(F-Q)*(240-B)/60:Q)}$F(BU,bU,{copy(B){return Object.assign(new this.constructor,this,B)},displayable(){return this.rgb().displayable()},hex:CU,formatHex:CU,formatHex8:function(){return this.rgb().formatHex8()},formatHsl:function(){return ZU(this).formatHsl()},formatRgb:aU,toString:aU}),$F(xU,rU,qF(BU,{brighter(B){return B=null==B?FU:Math.pow(FU,B),new xU(this.r*B,this.g*B,this.b*B,this.opacity)},darker(B){return B=null==B?QU:Math.pow(QU,B),new xU(this.r*B,this.g*B,this.b*B,this.opacity)},rgb(){return this},clamp(){return new xU(RU(this.r),RU(this.g),RU(this.b),hU(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:AU,formatHex:AU,formatHex8:function(){return`#${yU(this.r)}${yU(this.g)}${yU(this.b)}${yU(255*(isNaN(this.opacity)?1:this.opacity))}`},formatRgb:LU,toString:LU})),$F(mU,SU,qF(BU,{brighter(B){return B=null==B?FU:Math.pow(FU,B),new mU(this.h,this.s,this.l*B,this.opacity)},darker(B){return B=null==B?QU:Math.pow(QU,B),new mU(this.h,this.s,this.l*B,this.opacity)},rgb(){var B=this.h%360+360*(this.h<0),Q=isNaN(B)||isNaN(this.s)?0:this.s,F=this.l,U=F+(F<.5?F:1-F)*Q,t=2*F-U;return new xU(XU(B>=240?B-240:B+120,t,U),XU(B,t,U),XU(B<120?B+240:B-120,t,U),this.opacity)},clamp(){return new mU(EU(this.h),NU(this.s),NU(this.l),hU(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const B=hU(this.opacity);return`${1===B?"hsl(":"hsla("}${EU(this.h)}, ${100*NU(this.s)}%, ${100*NU(this.l)}%${1===B?")":`, ${B})`}`}}));const pU=Math.PI/180,WU=180/Math.PI,HU=.96422,DU=.82521,fU=4/29,YU=6/29,wU=3*YU*YU,vU=YU*YU*YU;function JU(B){if(B instanceof MU)return new MU(B.l,B.a,B.b,B.opacity);if(B instanceof PU)return _U(B);B instanceof xU||(B=GU(B));var Q,F,U=OU(B.r),t=OU(B.g),s=OU(B.b),I=TU((.2225045*U+.7168786*t+.0606169*s)/1);return U===t&&t===s?Q=F=I:(Q=TU((.4360747*U+.3850649*t+.1430804*s)/HU),F=TU((.0139322*U+.0971045*t+.7141733*s)/DU)),new MU(116*I-16,500*(Q-I),200*(I-F),B.opacity)}function kU(B,Q,F,U){return 1===arguments.length?JU(B):new MU(B,Q,F,null==U?1:U)}function MU(B,Q,F,U){this.l=+B,this.a=+Q,this.b=+F,this.opacity=+U}function TU(B){return B>vU?Math.pow(B,1/3):B/wU+fU}function zU(B){return B>YU?B*B*B:wU*(B-fU)}function KU(B){return 255*(B<=.0031308?12.92*B:1.055*Math.pow(B,1/2.4)-.055)}function OU(B){return(B/=255)<=.04045?B/12.92:Math.pow((B+.055)/1.055,2.4)}function jU(B,Q,F,U){return 1===arguments.length?function(B){if(B instanceof PU)return new PU(B.h,B.c,B.l,B.opacity);if(B instanceof MU||(B=JU(B)),0===B.a&&0===B.b)return new PU(NaN,0<B.l&&B.l<100?0:NaN,B.l,B.opacity);var Q=Math.atan2(B.b,B.a)*WU;return new PU(Q<0?Q+360:Q,Math.sqrt(B.a*B.a+B.b*B.b),B.l,B.opacity)}(B):new PU(B,Q,F,null==U?1:U)}function PU(B,Q,F,U){this.h=+B,this.c=+Q,this.l=+F,this.opacity=+U}function _U(B){if(isNaN(B.h))return new MU(B.l,0,0,B.opacity);var Q=B.h*pU;return new MU(B.l,Math.cos(Q)*B.c,Math.sin(Q)*B.c,B.opacity)}$F(MU,kU,qF(BU,{brighter(B){return new MU(this.l+18*(null==B?1:B),this.a,this.b,this.opacity)},darker(B){return new MU(this.l-18*(null==B?1:B),this.a,this.b,this.opacity)},rgb(){var B=(this.l+16)/116,Q=isNaN(this.a)?B:B+this.a/500,F=isNaN(this.b)?B:B-this.b/200;return new xU(KU(3.1338561*(Q=HU*zU(Q))-1.6168667*(B=1*zU(B))-.4906146*(F=DU*zU(F))),KU(-.9787684*Q+1.9161415*B+.033454*F),KU(.0719453*Q-.2289914*B+1.4052427*F),this.opacity)}})),$F(PU,jU,qF(BU,{brighter(B){return new PU(this.h,this.c,this.l+18*(null==B?1:B),this.opacity)},darker(B){return new PU(this.h,this.c,this.l-18*(null==B?1:B),this.opacity)},rgb(){return _U(this).rgb()}}));var $U=-.14861,qU=1.78277,Bt=-.29227,Qt=-.90649,Ft=1.97294,Ut=Ft*Qt,tt=Ft*qU,st=qU*Bt-Qt*$U;function It(B,Q,F,U){return 1===arguments.length?function(B){if(B instanceof gt)return new gt(B.h,B.s,B.l,B.opacity);B instanceof xU||(B=GU(B));var Q=B.r/255,F=B.g/255,U=B.b/255,t=(st*U+Ut*Q-tt*F)/(st+Ut-tt),s=U-t,I=(Ft*(F-t)-Bt*s)/Qt,g=Math.sqrt(I*I+s*s)/(Ft*t*(1-t)),i=g?Math.atan2(I,s)*WU-120:NaN;return new gt(i<0?i+360:i,g,t,B.opacity)}(B):new gt(B,Q,F,null==U?1:U)}function gt(B,Q,F,U){this.h=+B,this.s=+Q,this.l=+F,this.opacity=+U}$F(gt,It,qF(BU,{brighter(B){return B=null==B?FU:Math.pow(FU,B),new gt(this.h,this.s,this.l*B,this.opacity)},darker(B){return B=null==B?QU:Math.pow(QU,B),new gt(this.h,this.s,this.l*B,this.opacity)},rgb(){var B=isNaN(this.h)?0:(this.h+120)*pU,Q=+this.l,F=isNaN(this.s)?0:this.s*Q*(1-Q),U=Math.cos(B),t=Math.sin(B);return new xU(255*(Q+F*($U*U+qU*t)),255*(Q+F*(Bt*U+Qt*t)),255*(Q+F*(Ft*U)),this.opacity)}}));var lt=B=>()=>B;function ct(B,Q){return function(F){return B+F*Q}}function et(B,Q){var F=Q-B;return F?ct(B,F>180||F<-180?F-360*Math.round(F/360):F):lt(isNaN(B)?Q:B)}function nt(B){return 1===(B=+B)?dt:function(Q,F){return F-Q?function(B,Q,F){return B=Math.pow(B,F),Q=Math.pow(Q,F)-B,F=1/F,function(U){return Math.pow(B+U*Q,F)}}(Q,F,B):lt(isNaN(Q)?F:Q)}}function dt(B,Q){var F=Q-B;return F?ct(B,F):lt(isNaN(B)?Q:B)}var Ct=function B(Q){var F=nt(Q);function U(B,Q){var U=F((B=rU(B)).r,(Q=rU(Q)).r),t=F(B.g,Q.g),s=F(B.b,Q.b),I=dt(B.opacity,Q.opacity);return function(Q){return B.r=U(Q),B.g=t(Q),B.b=s(Q),B.opacity=I(Q),B+""}}return U.gamma=B,U}(1);var at,bt=(at=function(B){var Q=B.length-1;return function(F){var U=F<=0?F=0:F>=1?(F=1,Q-1):Math.floor(F*Q),t=B[U],s=B[U+1],I=U>0?B[U-1]:2*t-s,g=U<Q-1?B[U+2]:2*s-t;return function(B,Q,F,U,t){var s=B*B,I=s*B;return((1-3*B+3*s-I)*Q+(4-6*s+3*I)*F+(1+3*B+3*s-3*I)*U+I*t)/6}((F-U/Q)*Q,I,t,s,g)}},function(B){var Q,F,U=B.length,t=new Array(U),s=new Array(U),I=new Array(U);for(Q=0;Q<U;++Q)F=rU(B[Q]),t[Q]=F.r||0,s[Q]=F.g||0,I[Q]=F.b||0;return t=at(t),s=at(s),I=at(I),F.opacity=1,function(B){return F.r=t(B),F.g=s(B),F.b=I(B),F+""}});function ot(B,Q){Q||(Q=[]);var F,U=B?Math.min(Q.length,B.length):0,t=Q.slice();return function(s){for(F=0;F<U;++F)t[F]=B[F]*(1-s)+Q[F]*s;return t}}function ut(B,Q){var F,U=Q?Q.length:0,t=B?Math.min(U,B.length):0,s=new Array(t),I=new Array(U);for(F=0;F<t;++F)s[F]=Rt(B[F],Q[F]);for(;F<U;++F)I[F]=Q[F];return function(B){for(F=0;F<t;++F)I[F]=s[F](B);return I}}function Gt(B,Q){var F=new Date;return B=+B,Q=+Q,function(U){return F.setTime(B*(1-U)+Q*U),F}}function rt(B,Q){return B=+B,Q=+Q,function(F){return B*(1-F)+Q*F}}function xt(B,Q){var F,U={},t={};for(F in null!==B&&"object"==typeof B||(B={}),null!==Q&&"object"==typeof Q||(Q={}),Q)F in B?U[F]=Rt(B[F],Q[F]):t[F]=Q[F];return function(B){for(F in U)t[F]=U[F](B);return t}}var At=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,Lt=new RegExp(At.source,"g");function ht(B,Q){var F,U,t,s=At.lastIndex=Lt.lastIndex=0,I=-1,g=[],i=[];for(B+="",Q+="";(F=At.exec(B))&&(U=Lt.exec(Q));)(t=U.index)>s&&(t=Q.slice(s,t),g[I]?g[I]+=t:g[++I]=t),(F=F[0])===(U=U[0])?g[I]?g[I]+=U:g[++I]=U:(g[++I]=null,i.push({i:I,x:rt(F,U)})),s=Lt.lastIndex;return s<Q.length&&(t=Q.slice(s),g[I]?g[I]+=t:g[++I]=t),g.length<2?i[0]?function(B){return function(Q){return B(Q)+""}}(i[0].x):function(B){return function(){return B}}(Q):(Q=i.length,function(B){for(var F,U=0;U<Q;++U)g[(F=i[U]).i]=F.x(B);return g.join("")})}function Rt(B,Q){var F,U=typeof Q;return null==Q||"boolean"===U?lt(Q):("number"===U?rt:"string"===U?(F=bU(Q))?(Q=F,Ct):ht:Q instanceof bU?Ct:Q instanceof Date?Gt:function(B){return ArrayBuffer.isView(B)&&!(B instanceof DataView)}(Q)?ot:Array.isArray(Q)?ut:"function"!=typeof Q.valueOf&&"function"!=typeof Q.toString||isNaN(Q)?xt:rt)(B,Q)}function yt(B,Q){return B=+B,Q=+Q,function(F){return Math.round(B*(1-F)+Q*F)}}var Vt,Zt=180/Math.PI,St={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1};function mt(B,Q,F,U,t,s){var I,g,i;return(I=Math.sqrt(B*B+Q*Q))&&(B/=I,Q/=I),(i=B*F+Q*U)&&(F-=B*i,U-=Q*i),(g=Math.sqrt(F*F+U*U))&&(F/=g,U/=g,i/=g),B*U<Q*F&&(B=-B,Q=-Q,i=-i,I=-I),{translateX:t,translateY:s,rotate:Math.atan2(Q,B)*Zt,skewX:Math.atan(i)*Zt,scaleX:I,scaleY:g}}function Et(B,Q,F,U){function t(B){return B.length?B.pop()+" ":""}return function(s,I){var g=[],i=[];return s=B(s),I=B(I),function(B,U,t,s,I,g){if(B!==t||U!==s){var i=I.push("translate(",null,Q,null,F);g.push({i:i-4,x:rt(B,t)},{i:i-2,x:rt(U,s)})}else(t||s)&&I.push("translate("+t+Q+s+F)}(s.translateX,s.translateY,I.translateX,I.translateY,g,i),function(B,Q,F,s){B!==Q?(B-Q>180?Q+=360:Q-B>180&&(B+=360),s.push({i:F.push(t(F)+"rotate(",null,U)-2,x:rt(B,Q)})):Q&&F.push(t(F)+"rotate("+Q+U)}(s.rotate,I.rotate,g,i),function(B,Q,F,s){B!==Q?s.push({i:F.push(t(F)+"skewX(",null,U)-2,x:rt(B,Q)}):Q&&F.push(t(F)+"skewX("+Q+U)}(s.skewX,I.skewX,g,i),function(B,Q,F,U,s,I){if(B!==F||Q!==U){var g=s.push(t(s)+"scale(",null,",",null,")");I.push({i:g-4,x:rt(B,F)},{i:g-2,x:rt(Q,U)})}else 1===F&&1===U||s.push(t(s)+"scale("+F+","+U+")")}(s.scaleX,s.scaleY,I.scaleX,I.scaleY,g,i),s=I=null,function(B){for(var Q,F=-1,U=i.length;++F<U;)g[(Q=i[F]).i]=Q.x(B);return g.join("")}}}var Nt=Et(function(B){const Q=new("function"==typeof DOMMatrix?DOMMatrix:WebKitCSSMatrix)(B+"");return Q.isIdentity?St:mt(Q.a,Q.b,Q.c,Q.d,Q.e,Q.f)},"px, ","px)","deg)"),Xt=Et(function(B){return null==B?St:(Vt||(Vt=document.createElementNS("http://www.w3.org/2000/svg","g")),Vt.setAttribute("transform",B),(B=Vt.transform.baseVal.consolidate())?mt((B=B.matrix).a,B.b,B.c,B.d,B.e,B.f):St)},", ",")",")");var pt=function(B){return function(Q,F){var U=B((Q=SU(Q)).h,(F=SU(F)).h),t=dt(Q.s,F.s),s=dt(Q.l,F.l),I=dt(Q.opacity,F.opacity);return function(B){return Q.h=U(B),Q.s=t(B),Q.l=s(B),Q.opacity=I(B),Q+""}}}(et);var Wt=function(B){return function(Q,F){var U=B((Q=jU(Q)).h,(F=jU(F)).h),t=dt(Q.c,F.c),s=dt(Q.l,F.l),I=dt(Q.opacity,F.opacity);return function(B){return Q.h=U(B),Q.c=t(B),Q.l=s(B),Q.opacity=I(B),Q+""}}}(et);function Ht(B){return function Q(F){function U(Q,U){var t=B((Q=It(Q)).h,(U=It(U)).h),s=dt(Q.s,U.s),I=dt(Q.l,U.l),g=dt(Q.opacity,U.opacity);return function(B){return Q.h=t(B),Q.s=s(B),Q.l=I(Math.pow(B,F)),Q.opacity=g(B),Q+""}}return F=+F,U.gamma=Q,U}(1)}Ht(et);var Dt=Ht(dt);function ft(B,Q){void 0===Q&&(Q=B,B=Rt);for(var F=0,U=Q.length-1,t=Q[0],s=new Array(U<0?0:U);F<U;)s[F]=B(t,t=Q[++F]);return function(B){var Q=Math.max(0,Math.min(U-1,Math.floor(B*=U)));return s[Q](B-Q)}}function Yt(B,Q){for(var F=new Array(Q),U=0;U<Q;++U)F[U]=B(U/(Q-1));return F}var wt,vt,Jt=0,kt=0,Mt=0,Tt=0,zt=0,Kt=0,Ot="object"==typeof performance&&performance.now?performance:Date,jt="object"==typeof window&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(B){setTimeout(B,17)};function Pt(){return zt||(jt(_t),zt=Ot.now()+Kt)}function _t(){zt=0}function $t(){this._call=this._time=this._next=null}function qt(B,Q,F){var U=new $t;return U.restart(B,Q,F),U}function Bs(){zt=(Tt=Ot.now())+Kt,Jt=kt=0;try{!function(){Pt(),++Jt;for(var B,Q=wt;Q;)(B=zt-Q._time)>=0&&Q._call.call(void 0,B),Q=Q._next;--Jt}()}finally{Jt=0,function(){var B,Q,F=wt,U=1/0;for(;F;)F._call?(U>F._time&&(U=F._time),B=F,F=F._next):(Q=F._next,F._next=null,F=B?B._next=Q:wt=Q);vt=B,Fs(U)}(),zt=0}}function Qs(){var B=Ot.now(),Q=B-Tt;Q>1e3&&(Kt-=Q,Tt=B)}function Fs(B){Jt||(kt&&(kt=clearTimeout(kt)),B-zt>24?(B<1/0&&(kt=setTimeout(Bs,B-Ot.now()-Kt)),Mt&&(Mt=clearInterval(Mt))):(Mt||(Tt=Ot.now(),Mt=setInterval(Qs,1e3)),Jt=1,jt(Bs)))}function Us(B,Q,F){var U=new $t;return Q=null==Q?0:+Q,U.restart(F=>{U.stop(),B(F+Q)},Q,F),U}$t.prototype=qt.prototype={constructor:$t,restart:function(B,Q,F){if("function"!=typeof B)throw new TypeError("callback is not a function");F=(null==F?Pt():+F)+(null==Q?0:+Q),this._next||vt===this||(vt?vt._next=this:wt=this,vt=this),this._call=B,this._time=F,Fs()},stop:function(){this._call&&(this._call=null,this._time=1/0,Fs())}};var ts=LQ("start","end","cancel","interrupt"),ss=[];function Is(B,Q,F,U,t,s){var I=B.__transition;if(I){if(F in I)return}else B.__transition={};!function(B,Q,F){var U,t=B.__transition;function s(B){F.state=1,F.timer.restart(I,F.delay,F.time),F.delay<=B&&I(B-F.delay)}function I(s){var l,c,e,n;if(1!==F.state)return i();for(l in t)if((n=t[l]).name===F.name){if(3===n.state)return Us(I);4===n.state?(n.state=6,n.timer.stop(),n.on.call("interrupt",B,B.__data__,n.index,n.group),delete t[l]):+l<Q&&(n.state=6,n.timer.stop(),n.on.call("cancel",B,B.__data__,n.index,n.group),delete t[l])}if(Us(function(){3===F.state&&(F.state=4,F.timer.restart(g,F.delay,F.time),g(s))}),F.state=2,F.on.call("start",B,B.__data__,F.index,F.group),2===F.state){for(F.state=3,U=new Array(e=F.tween.length),l=0,c=-1;l<e;++l)(n=F.tween[l].value.call(B,B.__data__,F.index,F.group))&&(U[++c]=n);U.length=c+1}}function g(Q){for(var t=Q<F.duration?F.ease.call(null,Q/F.duration):(F.timer.restart(i),F.state=5,1),s=-1,I=U.length;++s<I;)U[s].call(B,t);5===F.state&&(F.on.call("end",B,B.__data__,F.index,F.group),i())}function i(){for(var U in F.state=6,F.timer.stop(),delete t[Q],t)return;delete B.__transition}t[Q]=F,F.timer=qt(s,0,F.time)}(B,F,{name:Q,index:U,group:t,on:ts,tween:ss,time:s.time,delay:s.delay,duration:s.duration,ease:s.ease,timer:null,state:0})}function gs(B,Q){var F=ls(B,Q);if(F.state>0)throw new Error("too late; already scheduled");return F}function is(B,Q){var F=ls(B,Q);if(F.state>3)throw new Error("too late; already running");return F}function ls(B,Q){var F=B.__transition;if(!F||!(F=F[Q]))throw new Error("transition not found");return F}function cs(B,Q){var F,U;return function(){var t=is(this,B),s=t.tween;if(s!==F)for(var I=0,g=(U=F=s).length;I<g;++I)if(U[I].name===Q){(U=U.slice()).splice(I,1);break}t.tween=U}}function es(B,Q,F){var U,t;if("function"!=typeof F)throw new Error;return function(){var s=is(this,B),I=s.tween;if(I!==U){t=(U=I).slice();for(var g={name:Q,value:F},i=0,l=t.length;i<l;++i)if(t[i].name===Q){t[i]=g;break}i===l&&t.push(g)}s.tween=t}}function ns(B,Q,F){var U=B._id;return B.each(function(){var B=is(this,U);(B.value||(B.value={}))[Q]=F.apply(this,arguments)}),function(B){return ls(B,U).value[Q]}}function ds(B,Q){var F;return("number"==typeof Q?rt:Q instanceof bU?Ct:(F=bU(Q))?(Q=F,Ct):ht)(B,Q)}function Cs(B){return function(){this.removeAttribute(B)}}function as(B){return function(){this.removeAttributeNS(B.space,B.local)}}function bs(B,Q,F){var U,t,s=F+"";return function(){var I=this.getAttribute(B);return I===s?null:I===U?t:t=Q(U=I,F)}}function os(B,Q,F){var U,t,s=F+"";return function(){var I=this.getAttributeNS(B.space,B.local);return I===s?null:I===U?t:t=Q(U=I,F)}}function us(B,Q,F){var U,t,s;return function(){var I,g,i=F(this);if(null!=i)return(I=this.getAttribute(B))===(g=i+"")?null:I===U&&g===t?s:(t=g,s=Q(U=I,i));this.removeAttribute(B)}}function Gs(B,Q,F){var U,t,s;return function(){var I,g,i=F(this);if(null!=i)return(I=this.getAttributeNS(B.space,B.local))===(g=i+"")?null:I===U&&g===t?s:(t=g,s=Q(U=I,i));this.removeAttributeNS(B.space,B.local)}}function rs(B,Q){var F,U;function t(){var t=Q.apply(this,arguments);return t!==U&&(F=(U=t)&&function(B,Q){return function(F){this.setAttributeNS(B.space,B.local,Q.call(this,F))}}(B,t)),F}return t._value=Q,t}function xs(B,Q){var F,U;function t(){var t=Q.apply(this,arguments);return t!==U&&(F=(U=t)&&function(B,Q){return function(F){this.setAttribute(B,Q.call(this,F))}}(B,t)),F}return t._value=Q,t}function As(B,Q){return function(){gs(this,B).delay=+Q.apply(this,arguments)}}function Ls(B,Q){return Q=+Q,function(){gs(this,B).delay=Q}}function hs(B,Q){return function(){is(this,B).duration=+Q.apply(this,arguments)}}function Rs(B,Q){return Q=+Q,function(){is(this,B).duration=Q}}var ys=fF.prototype.constructor;function Vs(B){return function(){this.style.removeProperty(B)}}var Zs=0;function Ss(B,Q,F,U){this._groups=B,this._parents=Q,this._name=F,this._id=U}function ms(){return++Zs}var Es=fF.prototype;Ss.prototype={constructor:Ss,select:function(B){var Q=this._name,F=this._id;"function"!=typeof B&&(B=pQ(B));for(var U=this._groups,t=U.length,s=new Array(t),I=0;I<t;++I)for(var g,i,l=U[I],c=l.length,e=s[I]=new Array(c),n=0;n<c;++n)(g=l[n])&&(i=B.call(g,g.__data__,n,l))&&("__data__"in g&&(i.__data__=g.__data__),e[n]=i,Is(e[n],Q,F,n,e,ls(g,F)));return new Ss(s,this._parents,Q,F)},selectAll:function(B){var Q=this._name,F=this._id;"function"!=typeof B&&(B=HQ(B));for(var U=this._groups,t=U.length,s=[],I=[],g=0;g<t;++g)for(var i,l=U[g],c=l.length,e=0;e<c;++e)if(i=l[e]){for(var n,d=B.call(i,i.__data__,e,l),C=ls(i,F),a=0,b=d.length;a<b;++a)(n=d[a])&&Is(n,Q,F,a,d,C);s.push(d),I.push(i)}return new Ss(s,I,Q,F)},selectChild:Es.selectChild,selectChildren:Es.selectChildren,filter:function(B){"function"!=typeof B&&(B=fQ(B));for(var Q=this._groups,F=Q.length,U=new Array(F),t=0;t<F;++t)for(var s,I=Q[t],g=I.length,i=U[t]=[],l=0;l<g;++l)(s=I[l])&&B.call(s,s.__data__,l,I)&&i.push(s);return new Ss(U,this._parents,this._name,this._id)},merge:function(B){if(B._id!==this._id)throw new Error;for(var Q=this._groups,F=B._groups,U=Q.length,t=F.length,s=Math.min(U,t),I=new Array(U),g=0;g<s;++g)for(var i,l=Q[g],c=F[g],e=l.length,n=I[g]=new Array(e),d=0;d<e;++d)(i=l[d]||c[d])&&(n[d]=i);for(;g<U;++g)I[g]=Q[g];return new Ss(I,this._parents,this._name,this._id)},selection:function(){return new ys(this._groups,this._parents)},transition:function(){for(var B=this._name,Q=this._id,F=ms(),U=this._groups,t=U.length,s=0;s<t;++s)for(var I,g=U[s],i=g.length,l=0;l<i;++l)if(I=g[l]){var c=ls(I,Q);Is(I,B,F,l,g,{time:c.time+c.delay+c.duration,delay:0,duration:c.duration,ease:c.ease})}return new Ss(U,this._parents,B,F)},call:Es.call,nodes:Es.nodes,node:Es.node,size:Es.size,empty:Es.empty,each:Es.each,on:function(B,Q){var F=this._id;return arguments.length<2?ls(this.node(),F).on.on(B):this.each(function(B,Q,F){var U,t,s=function(B){return(B+"").trim().split(/^|\s+/).every(function(B){var Q=B.indexOf(".");return Q>=0&&(B=B.slice(0,Q)),!B||"start"===B})}(Q)?gs:is;return function(){var I=s(this,B),g=I.on;g!==U&&(t=(U=g).copy()).on(Q,F),I.on=t}}(F,B,Q))},attr:function(B,Q){var F=SQ(B),U="transform"===F?Xt:ds;return this.attrTween(B,"function"==typeof Q?(F.local?Gs:us)(F,U,ns(this,"attr."+B,Q)):null==Q?(F.local?as:Cs)(F):(F.local?os:bs)(F,U,Q))},attrTween:function(B,Q){var F="attr."+B;if(arguments.length<2)return(F=this.tween(F))&&F._value;if(null==Q)return this.tween(F,null);if("function"!=typeof Q)throw new Error;var U=SQ(B);return this.tween(F,(U.local?rs:xs)(U,Q))},style:function(B,Q,F){var U="transform"==(B+="")?Nt:ds;return null==Q?this.styleTween(B,function(B,Q){var F,U,t;return function(){var s=gF(this,B),I=(this.style.removeProperty(B),gF(this,B));return s===I?null:s===F&&I===U?t:t=Q(F=s,U=I)}}(B,U)).on("end.style."+B,Vs(B)):"function"==typeof Q?this.styleTween(B,function(B,Q,F){var U,t,s;return function(){var I=gF(this,B),g=F(this),i=g+"";return null==g&&(this.style.removeProperty(B),i=g=gF(this,B)),I===i?null:I===U&&i===t?s:(t=i,s=Q(U=I,g))}}(B,U,ns(this,"style."+B,Q))).each(function(B,Q){var F,U,t,s,I="style."+Q,g="end."+I;return function(){var i=is(this,B),l=i.on,c=null==i.value[I]?s||(s=Vs(Q)):void 0;l===F&&t===c||(U=(F=l).copy()).on(g,t=c),i.on=U}}(this._id,B)):this.styleTween(B,function(B,Q,F){var U,t,s=F+"";return function(){var I=gF(this,B);return I===s?null:I===U?t:t=Q(U=I,F)}}(B,U,Q),F).on("end.style."+B,null)},styleTween:function(B,Q,F){var U="style."+(B+="");if(arguments.length<2)return(U=this.tween(U))&&U._value;if(null==Q)return this.tween(U,null);if("function"!=typeof Q)throw new Error;return this.tween(U,function(B,Q,F){var U,t;function s(){var s=Q.apply(this,arguments);return s!==t&&(U=(t=s)&&function(B,Q,F){return function(U){this.style.setProperty(B,Q.call(this,U),F)}}(B,s,F)),U}return s._value=Q,s}(B,Q,null==F?"":F))},text:function(B){return this.tween("text","function"==typeof B?function(B){return function(){var Q=B(this);this.textContent=null==Q?"":Q}}(ns(this,"text",B)):function(B){return function(){this.textContent=B}}(null==B?"":B+""))},textTween:function(B){var Q="text";if(arguments.length<1)return(Q=this.tween(Q))&&Q._value;if(null==B)return this.tween(Q,null);if("function"!=typeof B)throw new Error;return this.tween(Q,function(B){var Q,F;function U(){var U=B.apply(this,arguments);return U!==F&&(Q=(F=U)&&function(B){return function(Q){this.textContent=B.call(this,Q)}}(U)),Q}return U._value=B,U}(B))},remove:function(){return this.on("end.remove",function(B){return function(){var Q=this.parentNode;for(var F in this.__transition)if(+F!==B)return;Q&&Q.removeChild(this)}}(this._id))},tween:function(B,Q){var F=this._id;if(B+="",arguments.length<2){for(var U,t=ls(this.node(),F).tween,s=0,I=t.length;s<I;++s)if((U=t[s]).name===B)return U.value;return null}return this.each((null==Q?cs:es)(F,B,Q))},delay:function(B){var Q=this._id;return arguments.length?this.each(("function"==typeof B?As:Ls)(Q,B)):ls(this.node(),Q).delay},duration:function(B){var Q=this._id;return arguments.length?this.each(("function"==typeof B?hs:Rs)(Q,B)):ls(this.node(),Q).duration},ease:function(B){var Q=this._id;return arguments.length?this.each(function(B,Q){if("function"!=typeof Q)throw new Error;return function(){is(this,B).ease=Q}}(Q,B)):ls(this.node(),Q).ease},easeVarying:function(B){if("function"!=typeof B)throw new Error;return this.each(function(B,Q){return function(){var F=Q.apply(this,arguments);if("function"!=typeof F)throw new Error;is(this,B).ease=F}}(this._id,B))},end:function(){var B,Q,F=this,U=F._id,t=F.size();return new Promise(function(s,I){var g={value:I},i={value:function(){0===--t&&s()}};F.each(function(){var F=is(this,U),t=F.on;t!==B&&((Q=(B=t).copy())._.cancel.push(g),Q._.interrupt.push(g),Q._.end.push(i)),F.on=Q}),0===t&&s()})},[Symbol.iterator]:Es[Symbol.iterator]};const Ns=B=>+B;function Xs(B){return--B*B*B+1}var ps={time:null,delay:0,duration:250,ease:function(B){return((B*=2)<=1?B*B*B:(B-=2)*B*B+2)/2}};function Ws(B,Q){for(var F;!(F=B.__transition)||!(F=F[Q]);)if(!(B=B.parentNode))throw new Error(`transition ${Q} not found`);return F}fF.prototype.interrupt=function(B){return this.each(function(){!function(B,Q){var F,U,t,s=B.__transition,I=!0;if(s){for(t in Q=null==Q?null:Q+"",s)(F=s[t]).name===Q?(U=F.state>2&&F.state<5,F.state=6,F.timer.stop(),F.on.call(U?"interrupt":"cancel",B,B.__data__,F.index,F.group),delete s[t]):I=!1;I&&delete B.__transition}}(this,B)})},fF.prototype.transition=function(B){var Q,F;B instanceof Ss?(Q=B._id,B=B._name):(Q=ms(),(F=ps).time=Pt(),B=null==B?null:B+"");for(var U=this._groups,t=U.length,s=0;s<t;++s)for(var I,g=U[s],i=g.length,l=0;l<i;++l)(I=g[l])&&Is(I,B,Q,l,g,F||Ws(I,Q));return new Ss(U,this._parents,B,Q)};const Hs=Math.PI,Ds=2*Hs,fs=1e-6,Ys=Ds-fs;function ws(B){this._+=B[0];for(let Q=1,F=B.length;Q<F;++Q)this._+=arguments[Q]+B[Q]}class vs{constructor(B){this._x0=this._y0=this._x1=this._y1=null,this._="",this._append=null==B?ws:function(B){let Q=Math.floor(B);if(!(Q>=0))throw new Error(`invalid digits: ${B}`);if(Q>15)return ws;const F=10**Q;return function(B){this._+=B[0];for(let Q=1,U=B.length;Q<U;++Q)this._+=Math.round(arguments[Q]*F)/F+B[Q]}}(B)}moveTo(B,Q){this._append`M${this._x0=this._x1=+B},${this._y0=this._y1=+Q}`}closePath(){null!==this._x1&&(this._x1=this._x0,this._y1=this._y0,this._append`Z`)}lineTo(B,Q){this._append`L${this._x1=+B},${this._y1=+Q}`}quadraticCurveTo(B,Q,F,U){this._append`Q${+B},${+Q},${this._x1=+F},${this._y1=+U}`}bezierCurveTo(B,Q,F,U,t,s){this._append`C${+B},${+Q},${+F},${+U},${this._x1=+t},${this._y1=+s}`}arcTo(B,Q,F,U,t){if(B=+B,Q=+Q,F=+F,U=+U,(t=+t)<0)throw new Error(`negative radius: ${t}`);let s=this._x1,I=this._y1,g=F-B,i=U-Q,l=s-B,c=I-Q,e=l*l+c*c;if(null===this._x1)this._append`M${this._x1=B},${this._y1=Q}`;else if(e>fs)if(Math.abs(c*g-i*l)>fs&&t){let n=F-s,d=U-I,C=g*g+i*i,a=n*n+d*d,b=Math.sqrt(C),o=Math.sqrt(e),u=t*Math.tan((Hs-Math.acos((C+e-a)/(2*b*o)))/2),G=u/o,r=u/b;Math.abs(G-1)>fs&&this._append`L${B+G*l},${Q+G*c}`,this._append`A${t},${t},0,0,${+(c*n>l*d)},${this._x1=B+r*g},${this._y1=Q+r*i}`}else this._append`L${this._x1=B},${this._y1=Q}`;else;}arc(B,Q,F,U,t,s){if(B=+B,Q=+Q,s=!!s,(F=+F)<0)throw new Error(`negative radius: ${F}`);let I=F*Math.cos(U),g=F*Math.sin(U),i=B+I,l=Q+g,c=1^s,e=s?U-t:t-U;null===this._x1?this._append`M${i},${l}`:(Math.abs(this._x1-i)>fs||Math.abs(this._y1-l)>fs)&&this._append`L${i},${l}`,F&&(e<0&&(e=e%Ds+Ds),e>Ys?this._append`A${F},${F},0,1,${c},${B-I},${Q-g}A${F},${F},0,1,${c},${this._x1=i},${this._y1=l}`:e>fs&&this._append`A${F},${F},0,${+(e>=Hs)},${c},${this._x1=B+F*Math.cos(t)},${this._y1=Q+F*Math.sin(t)}`)}rect(B,Q,F,U){this._append`M${this._x0=this._x1=+B},${this._y0=this._y1=+Q}h${F=+F}v${+U}h${-F}Z`}toString(){return this._}}function Js(B=3){return new vs(+B)}function ks(B,Q){if((F=(B=Q?B.toExponential(Q-1):B.toExponential()).indexOf("e"))<0)return null;var F,U=B.slice(0,F);return[U.length>1?U[0]+U.slice(2):U,+B.slice(F+1)]}function Ms(B){return(B=ks(Math.abs(B)))?B[1]:NaN}var Ts,zs=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function Ks(B){if(!(Q=zs.exec(B)))throw new Error("invalid format: "+B);var Q;return new Os({fill:Q[1],align:Q[2],sign:Q[3],symbol:Q[4],zero:Q[5],width:Q[6],comma:Q[7],precision:Q[8]&&Q[8].slice(1),trim:Q[9],type:Q[10]})}function Os(B){this.fill=void 0===B.fill?" ":B.fill+"",this.align=void 0===B.align?">":B.align+"",this.sign=void 0===B.sign?"-":B.sign+"",this.symbol=void 0===B.symbol?"":B.symbol+"",this.zero=!!B.zero,this.width=void 0===B.width?void 0:+B.width,this.comma=!!B.comma,this.precision=void 0===B.precision?void 0:+B.precision,this.trim=!!B.trim,this.type=void 0===B.type?"":B.type+""}function js(B,Q){var F=ks(B,Q);if(!F)return B+"";var U=F[0],t=F[1];return t<0?"0."+new Array(-t).join("0")+U:U.length>t+1?U.slice(0,t+1)+"."+U.slice(t+1):U+new Array(t-U.length+2).join("0")}Ks.prototype=Os.prototype,Os.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};var Ps={"%":(B,Q)=>(100*B).toFixed(Q),b:B=>Math.round(B).toString(2),c:B=>B+"",d:function(B){return Math.abs(B=Math.round(B))>=1e21?B.toLocaleString("en").replace(/,/g,""):B.toString(10)},e:(B,Q)=>B.toExponential(Q),f:(B,Q)=>B.toFixed(Q),g:(B,Q)=>B.toPrecision(Q),o:B=>Math.round(B).toString(8),p:(B,Q)=>js(100*B,Q),r:js,s:function(B,Q){var F=ks(B,Q);if(!F)return B+"";var U=F[0],t=F[1],s=t-(Ts=3*Math.max(-8,Math.min(8,Math.floor(t/3))))+1,I=U.length;return s===I?U:s>I?U+new Array(s-I+1).join("0"):s>0?U.slice(0,s)+"."+U.slice(s):"0."+new Array(1-s).join("0")+ks(B,Math.max(0,Q+s-1))[0]},X:B=>Math.round(B).toString(16).toUpperCase(),x:B=>Math.round(B).toString(16)};function _s(B){return B}var $s,qs,BI,QI=Array.prototype.map,FI=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function UI(B){var Q,F,U=void 0===B.grouping||void 0===B.thousands?_s:(Q=QI.call(B.grouping,Number),F=B.thousands+"",function(B,U){for(var t=B.length,s=[],I=0,g=Q[0],i=0;t>0&&g>0&&(i+g+1>U&&(g=Math.max(1,U-i)),s.push(B.substring(t-=g,t+g)),!((i+=g+1)>U));)g=Q[I=(I+1)%Q.length];return s.reverse().join(F)}),t=void 0===B.currency?"":B.currency[0]+"",s=void 0===B.currency?"":B.currency[1]+"",I=void 0===B.decimal?".":B.decimal+"",g=void 0===B.numerals?_s:function(B){return function(Q){return Q.replace(/[0-9]/g,function(Q){return B[+Q]})}}(QI.call(B.numerals,String)),i=void 0===B.percent?"%":B.percent+"",l=void 0===B.minus?"−":B.minus+"",c=void 0===B.nan?"NaN":B.nan+"";function e(B){var Q=(B=Ks(B)).fill,F=B.align,e=B.sign,n=B.symbol,d=B.zero,C=B.width,a=B.comma,b=B.precision,o=B.trim,u=B.type;"n"===u?(a=!0,u="g"):Ps[u]||(void 0===b&&(b=12),o=!0,u="g"),(d||"0"===Q&&"="===F)&&(d=!0,Q="0",F="=");var G="$"===n?t:"#"===n&&/[boxX]/.test(u)?"0"+u.toLowerCase():"",r="$"===n?s:/[%p]/.test(u)?i:"",x=Ps[u],A=/[defgprs%]/.test(u);function L(B){var t,s,i,n=G,L=r;if("c"===u)L=x(B)+L,B="";else{var h=(B=+B)<0||1/B<0;if(B=isNaN(B)?c:x(Math.abs(B),b),o&&(B=function(B){B:for(var Q,F=B.length,U=1,t=-1;U<F;++U)switch(B[U]){case".":t=Q=U;break;case"0":0===t&&(t=U),Q=U;break;default:if(!+B[U])break B;t>0&&(t=0)}return t>0?B.slice(0,t)+B.slice(Q+1):B}(B)),h&&0===+B&&"+"!==e&&(h=!1),n=(h?"("===e?e:l:"-"===e||"("===e?"":e)+n,L=("s"===u?FI[8+Ts/3]:"")+L+(h&&"("===e?")":""),A)for(t=-1,s=B.length;++t<s;)if(48>(i=B.charCodeAt(t))||i>57){L=(46===i?I+B.slice(t+1):B.slice(t))+L,B=B.slice(0,t);break}}a&&!d&&(B=U(B,1/0));var R=n.length+B.length+L.length,y=R<C?new Array(C-R+1).join(Q):"";switch(a&&d&&(B=U(y+B,y.length?C-L.length:1/0),y=""),F){case"<":B=n+B+L+y;break;case"=":B=n+y+B+L;break;case"^":B=y.slice(0,R=y.length>>1)+n+B+L+y.slice(R);break;default:B=y+n+B+L}return g(B)}return b=void 0===b?6:/[gprs]/.test(u)?Math.max(1,Math.min(21,b)):Math.max(0,Math.min(20,b)),L.toString=function(){return B+""},L}return{format:e,formatPrefix:function(B,Q){var F=e(((B=Ks(B)).type="f",B)),U=3*Math.max(-8,Math.min(8,Math.floor(Ms(Q)/3))),t=Math.pow(10,-U),s=FI[8+U/3];return function(B){return F(t*B)+s}}}}$s=UI({thousands:",",grouping:[3],currency:["$",""]}),qs=$s.format,BI=$s.formatPrefix;var tI=1e-6,sI=Math.PI,II=sI/2,gI=sI/4,iI=2*sI,lI=180/sI,cI=sI/180,eI=Math.abs,nI=Math.atan,dI=Math.atan2,CI=Math.cos,aI=Math.exp,bI=Math.log,oI=Math.pow,uI=Math.sin,GI=Math.sign||function(B){return B>0?1:B<0?-1:0},rI=Math.sqrt,xI=Math.tan;function AI(B){return B>1?0:B<-1?sI:Math.acos(B)}function LI(B){return B>1?II:B<-1?-II:Math.asin(B)}function hI(){}function RI(B,Q){B&&VI.hasOwnProperty(B.type)&&VI[B.type](B,Q)}var yI={Feature:function(B,Q){RI(B.geometry,Q)},FeatureCollection:function(B,Q){for(var F=B.features,U=-1,t=F.length;++U<t;)RI(F[U].geometry,Q)}},VI={Sphere:function(B,Q){Q.sphere()},Point:function(B,Q){B=B.coordinates,Q.point(B[0],B[1],B[2])},MultiPoint:function(B,Q){for(var F=B.coordinates,U=-1,t=F.length;++U<t;)B=F[U],Q.point(B[0],B[1],B[2])},LineString:function(B,Q){ZI(B.coordinates,Q,0)},MultiLineString:function(B,Q){for(var F=B.coordinates,U=-1,t=F.length;++U<t;)ZI(F[U],Q,0)},Polygon:function(B,Q){SI(B.coordinates,Q)},MultiPolygon:function(B,Q){for(var F=B.coordinates,U=-1,t=F.length;++U<t;)SI(F[U],Q)},GeometryCollection:function(B,Q){for(var F=B.geometries,U=-1,t=F.length;++U<t;)RI(F[U],Q)}};function ZI(B,Q,F){var U,t=-1,s=B.length-F;for(Q.lineStart();++t<s;)U=B[t],Q.point(U[0],U[1],U[2]);Q.lineEnd()}function SI(B,Q){var F=-1,U=B.length;for(Q.polygonStart();++F<U;)ZI(B[F],Q,1);Q.polygonEnd()}function mI(B,Q){B&&yI.hasOwnProperty(B.type)?yI[B.type](B,Q):RI(B,Q)}function EI(B){return[dI(B[1],B[0]),LI(B[2])]}function NI(B){var Q=B[0],F=B[1],U=CI(F);return[U*CI(Q),U*uI(Q),uI(F)]}function XI(B,Q){return B[0]*Q[0]+B[1]*Q[1]+B[2]*Q[2]}function pI(B,Q){return[B[1]*Q[2]-B[2]*Q[1],B[2]*Q[0]-B[0]*Q[2],B[0]*Q[1]-B[1]*Q[0]]}function WI(B,Q){B[0]+=Q[0],B[1]+=Q[1],B[2]+=Q[2]}function HI(B,Q){return[B[0]*Q,B[1]*Q,B[2]*Q]}function DI(B){var Q=rI(B[0]*B[0]+B[1]*B[1]+B[2]*B[2]);B[0]/=Q,B[1]/=Q,B[2]/=Q}function fI(B,Q){function F(F,U){return F=B(F,U),Q(F[0],F[1])}return B.invert&&Q.invert&&(F.invert=function(F,U){return(F=Q.invert(F,U))&&B.invert(F[0],F[1])}),F}function YI(B,Q){return eI(B)>sI&&(B-=Math.round(B/iI)*iI),[B,Q]}function wI(B,Q,F){return(B%=iI)?Q||F?fI(JI(B),kI(Q,F)):JI(B):Q||F?kI(Q,F):YI}function vI(B){return function(Q,F){return eI(Q+=B)>sI&&(Q-=Math.round(Q/iI)*iI),[Q,F]}}function JI(B){var Q=vI(B);return Q.invert=vI(-B),Q}function kI(B,Q){var F=CI(B),U=uI(B),t=CI(Q),s=uI(Q);function I(B,Q){var I=CI(Q),g=CI(B)*I,i=uI(B)*I,l=uI(Q),c=l*F+g*U;return[dI(i*t-c*s,g*F-l*U),LI(c*t+i*s)]}return I.invert=function(B,Q){var I=CI(Q),g=CI(B)*I,i=uI(B)*I,l=uI(Q),c=l*t-i*s;return[dI(i*t+l*s,g*F+c*U),LI(c*F-g*U)]},I}function MI(B,Q){(Q=NI(Q))[0]-=B,DI(Q);var F=AI(-Q[1]);return((-Q[2]<0?-F:F)+iI-tI)%iI}function TI(){var B,Q=[];return{point:function(Q,F,U){B.push([Q,F,U])},lineStart:function(){Q.push(B=[])},lineEnd:hI,rejoin:function(){Q.length>1&&Q.push(Q.pop().concat(Q.shift()))},result:function(){var F=Q;return Q=[],B=null,F}}}function zI(B,Q){return eI(B[0]-Q[0])<tI&&eI(B[1]-Q[1])<tI}function KI(B,Q,F,U){this.x=B,this.z=Q,this.o=F,this.e=U,this.v=!1,this.n=this.p=null}function OI(B,Q,F,U,t){var s,I,g=[],i=[];if(B.forEach(function(B){if(!((Q=B.length-1)<=0)){var Q,F,U=B[0],I=B[Q];if(zI(U,I)){if(!U[2]&&!I[2]){for(t.lineStart(),s=0;s<Q;++s)t.point((U=B[s])[0],U[1]);return void t.lineEnd()}I[0]+=2e-6}g.push(F=new KI(U,B,null,!0)),i.push(F.o=new KI(U,null,F,!1)),g.push(F=new KI(I,B,null,!1)),i.push(F.o=new KI(I,null,F,!0))}}),g.length){for(i.sort(Q),jI(g),jI(i),s=0,I=i.length;s<I;++s)i[s].e=F=!F;for(var l,c,e=g[0];;){for(var n=e,d=!0;n.v;)if((n=n.n)===e)return;l=n.z,t.lineStart();do{if(n.v=n.o.v=!0,n.e){if(d)for(s=0,I=l.length;s<I;++s)t.point((c=l[s])[0],c[1]);else U(n.x,n.n.x,1,t);n=n.n}else{if(d)for(l=n.p.z,s=l.length-1;s>=0;--s)t.point((c=l[s])[0],c[1]);else U(n.x,n.p.x,-1,t);n=n.p}l=(n=n.o).z,d=!d}while(!n.v);t.lineEnd()}}}function jI(B){if(Q=B.length){for(var Q,F,U=0,t=B[0];++U<Q;)t.n=F=B[U],F.p=t,t=F;t.n=F=B[0],F.p=t}}function PI(B){return eI(B[0])<=sI?B[0]:GI(B[0])*((eI(B[0])+sI)%iI-sI)}function _I(B,Q,F,U){return function(t){var s,I,g,i=Q(t),l=TI(),c=Q(l),e=!1,n={point:d,lineStart:a,lineEnd:b,polygonStart:function(){n.point=o,n.lineStart=u,n.lineEnd=G,I=[],s=[]},polygonEnd:function(){n.point=d,n.lineStart=a,n.lineEnd=b,I=gQ(I);var B=function(B,Q){var F=PI(Q),U=Q[1],t=uI(U),s=[uI(F),-CI(F),0],I=0,g=0,i=new hB;1===t?U=II+tI:-1===t&&(U=-II-tI);for(var l=0,c=B.length;l<c;++l)if(n=(e=B[l]).length)for(var e,n,d=e[n-1],C=PI(d),a=d[1]/2+gI,b=uI(a),o=CI(a),u=0;u<n;++u,C=r,b=A,o=L,d=G){var G=e[u],r=PI(G),x=G[1]/2+gI,A=uI(x),L=CI(x),h=r-C,R=h>=0?1:-1,y=R*h,V=y>sI,Z=b*A;if(i.add(dI(Z*R*uI(y),o*L+Z*CI(y))),I+=V?h+R*iI:h,V^C>=F^r>=F){var S=pI(NI(d),NI(G));DI(S);var m=pI(s,S);DI(m);var E=(V^h>=0?-1:1)*LI(m[2]);(U>E||U===E&&(S[0]||S[1]))&&(g+=V^h>=0?1:-1)}}return(I<-1e-6||I<tI&&i<-1e-12)^1&g}(s,U);I.length?(e||(t.polygonStart(),e=!0),OI(I,qI,B,F,t)):B&&(e||(t.polygonStart(),e=!0),t.lineStart(),F(null,null,1,t),t.lineEnd()),e&&(t.polygonEnd(),e=!1),I=s=null},sphere:function(){t.polygonStart(),t.lineStart(),F(null,null,1,t),t.lineEnd(),t.polygonEnd()}};function d(Q,F){B(Q,F)&&t.point(Q,F)}function C(B,Q){i.point(B,Q)}function a(){n.point=C,i.lineStart()}function b(){n.point=d,i.lineEnd()}function o(B,Q){g.push([B,Q]),c.point(B,Q)}function u(){c.lineStart(),g=[]}function G(){o(g[0][0],g[0][1]),c.lineEnd();var B,Q,F,U,i=c.clean(),n=l.result(),d=n.length;if(g.pop(),s.push(g),g=null,d)if(1&i){if((Q=(F=n[0]).length-1)>0){for(e||(t.polygonStart(),e=!0),t.lineStart(),B=0;B<Q;++B)t.point((U=F[B])[0],U[1]);t.lineEnd()}}else d>1&&2&i&&n.push(n.pop().concat(n.shift())),I.push(n.filter($I))}return n}}function $I(B){return B.length>1}function qI(B,Q){return((B=B.x)[0]<0?B[1]-II-tI:II-B[1])-((Q=Q.x)[0]<0?Q[1]-II-tI:II-Q[1])}YI.invert=YI;var Bg=_I(function(){return!0},function(B){var Q,F=NaN,U=NaN,t=NaN;return{lineStart:function(){B.lineStart(),Q=1},point:function(s,I){var g=s>0?sI:-sI,i=eI(s-F);eI(i-sI)<tI?(B.point(F,U=(U+I)/2>0?II:-II),B.point(t,U),B.lineEnd(),B.lineStart(),B.point(g,U),B.point(s,U),Q=0):t!==g&&i>=sI&&(eI(F-t)<tI&&(F-=t*tI),eI(s-g)<tI&&(s-=g*tI),U=function(B,Q,F,U){var t,s,I=uI(B-F);return eI(I)>tI?nI((uI(Q)*(s=CI(U))*uI(F)-uI(U)*(t=CI(Q))*uI(B))/(t*s*I)):(Q+U)/2}(F,U,s,I),B.point(t,U),B.lineEnd(),B.lineStart(),B.point(g,U),Q=0),B.point(F=s,U=I),t=g},lineEnd:function(){B.lineEnd(),F=U=NaN},clean:function(){return 2-Q}}},function(B,Q,F,U){var t;if(null==B)t=F*II,U.point(-sI,t),U.point(0,t),U.point(sI,t),U.point(sI,0),U.point(sI,-t),U.point(0,-t),U.point(-sI,-t),U.point(-sI,0),U.point(-sI,t);else if(eI(B[0]-Q[0])>tI){var s=B[0]<Q[0]?sI:-sI;t=F*s/2,U.point(-s,t),U.point(0,t),U.point(s,t)}else U.point(Q[0],Q[1])},[-sI,-II]);function Qg(B){var Q=CI(B),F=2*cI,U=Q>0,t=eI(Q)>tI;function s(B,F){return CI(B)*CI(F)>Q}function I(B,F,U){var t=[1,0,0],s=pI(NI(B),NI(F)),I=XI(s,s),g=s[0],i=I-g*g;if(!i)return!U&&B;var l=Q*I/i,c=-Q*g/i,e=pI(t,s),n=HI(t,l);WI(n,HI(s,c));var d=e,C=XI(n,d),a=XI(d,d),b=C*C-a*(XI(n,n)-1);if(!(b<0)){var o=rI(b),u=HI(d,(-C-o)/a);if(WI(u,n),u=EI(u),!U)return u;var G,r=B[0],x=F[0],A=B[1],L=F[1];x<r&&(G=r,r=x,x=G);var h=x-r,R=eI(h-sI)<tI;if(!R&&L<A&&(G=A,A=L,L=G),R||h<tI?R?A+L>0^u[1]<(eI(u[0]-r)<tI?A:L):A<=u[1]&&u[1]<=L:h>sI^(r<=u[0]&&u[0]<=x)){var y=HI(d,(-C+o)/a);return WI(y,n),[u,EI(y)]}}}function g(Q,F){var t=U?B:sI-B,s=0;return Q<-t?s|=1:Q>t&&(s|=2),F<-t?s|=4:F>t&&(s|=8),s}return _I(s,function(B){var Q,F,i,l,c;return{lineStart:function(){l=i=!1,c=1},point:function(e,n){var d,C=[e,n],a=s(e,n),b=U?a?0:g(e,n):a?g(e+(e<0?sI:-sI),n):0;if(!Q&&(l=i=a)&&B.lineStart(),a!==i&&(!(d=I(Q,C))||zI(Q,d)||zI(C,d))&&(C[2]=1),a!==i)c=0,a?(B.lineStart(),d=I(C,Q),B.point(d[0],d[1])):(d=I(Q,C),B.point(d[0],d[1],2),B.lineEnd()),Q=d;else if(t&&Q&&U^a){var o;b&F||!(o=I(C,Q,!0))||(c=0,U?(B.lineStart(),B.point(o[0][0],o[0][1]),B.point(o[1][0],o[1][1]),B.lineEnd()):(B.point(o[1][0],o[1][1]),B.lineEnd(),B.lineStart(),B.point(o[0][0],o[0][1],3)))}!a||Q&&zI(Q,C)||B.point(C[0],C[1]),Q=C,i=a,F=b},lineEnd:function(){i&&B.lineEnd(),Q=null},clean:function(){return c|(l&&i)<<1}}},function(Q,U,t,s){!function(B,Q,F,U,t,s){if(F){var I=CI(Q),g=uI(Q),i=U*F;null==t?(t=Q+U*iI,s=Q-i/2):(t=MI(I,t),s=MI(I,s),(U>0?t<s:t>s)&&(t+=U*iI));for(var l,c=t;U>0?c>s:c<s;c-=i)l=EI([I,-g*CI(c),-g*uI(c)]),B.point(l[0],l[1])}}(s,B,F,t,Q,U)},U?[0,-B]:[-sI,B-sI])}var Fg=1e9,Ug=-Fg;function tg(B,Q,F,U){function t(t,s){return B<=t&&t<=F&&Q<=s&&s<=U}function s(t,s,g,l){var c=0,e=0;if(null==t||(c=I(t,g))!==(e=I(s,g))||i(t,s)<0^g>0)do{l.point(0===c||3===c?B:F,c>1?U:Q)}while((c=(c+g+4)%4)!==e);else l.point(s[0],s[1])}function I(U,t){return eI(U[0]-B)<tI?t>0?0:3:eI(U[0]-F)<tI?t>0?2:1:eI(U[1]-Q)<tI?t>0?1:0:t>0?3:2}function g(B,Q){return i(B.x,Q.x)}function i(B,Q){var F=I(B,1),U=I(Q,1);return F!==U?F-U:0===F?Q[1]-B[1]:1===F?B[0]-Q[0]:2===F?B[1]-Q[1]:Q[0]-B[0]}return function(I){var i,l,c,e,n,d,C,a,b,o,u,G=I,r=TI(),x={point:A,lineStart:function(){x.point=L,l&&l.push(c=[]);o=!0,b=!1,C=a=NaN},lineEnd:function(){i&&(L(e,n),d&&b&&r.rejoin(),i.push(r.result()));x.point=A,b&&G.lineEnd()},polygonStart:function(){G=r,i=[],l=[],u=!0},polygonEnd:function(){var Q=function(){for(var Q=0,F=0,t=l.length;F<t;++F)for(var s,I,g=l[F],i=1,c=g.length,e=g[0],n=e[0],d=e[1];i<c;++i)s=n,I=d,n=(e=g[i])[0],d=e[1],I<=U?d>U&&(n-s)*(U-I)>(d-I)*(B-s)&&++Q:d<=U&&(n-s)*(U-I)<(d-I)*(B-s)&&--Q;return Q}(),F=u&&Q,t=(i=gQ(i)).length;(F||t)&&(I.polygonStart(),F&&(I.lineStart(),s(null,null,1,I),I.lineEnd()),t&&OI(i,g,Q,s,I),I.polygonEnd());G=I,i=l=c=null}};function A(B,Q){t(B,Q)&&G.point(B,Q)}function L(s,I){var g=t(s,I);if(l&&c.push([s,I]),o)e=s,n=I,d=g,o=!1,g&&(G.lineStart(),G.point(s,I));else if(g&&b)G.point(s,I);else{var i=[C=Math.max(Ug,Math.min(Fg,C)),a=Math.max(Ug,Math.min(Fg,a))],r=[s=Math.max(Ug,Math.min(Fg,s)),I=Math.max(Ug,Math.min(Fg,I))];!function(B,Q,F,U,t,s){var I,g=B[0],i=B[1],l=0,c=1,e=Q[0]-g,n=Q[1]-i;if(I=F-g,e||!(I>0)){if(I/=e,e<0){if(I<l)return;I<c&&(c=I)}else if(e>0){if(I>c)return;I>l&&(l=I)}if(I=t-g,e||!(I<0)){if(I/=e,e<0){if(I>c)return;I>l&&(l=I)}else if(e>0){if(I<l)return;I<c&&(c=I)}if(I=U-i,n||!(I>0)){if(I/=n,n<0){if(I<l)return;I<c&&(c=I)}else if(n>0){if(I>c)return;I>l&&(l=I)}if(I=s-i,n||!(I<0)){if(I/=n,n<0){if(I>c)return;I>l&&(l=I)}else if(n>0){if(I<l)return;I<c&&(c=I)}return l>0&&(B[0]=g+l*e,B[1]=i+l*n),c<1&&(Q[0]=g+c*e,Q[1]=i+c*n),!0}}}}}(i,r,B,Q,F,U)?g&&(G.lineStart(),G.point(s,I),u=!1):(b||(G.lineStart(),G.point(i[0],i[1])),G.point(r[0],r[1]),g||G.lineEnd(),u=!1)}C=s,a=I,b=g}return x}}var sg,Ig,gg,ig,lg=B=>B,cg=new hB,eg=new hB,ng={point:hI,lineStart:hI,lineEnd:hI,polygonStart:function(){ng.lineStart=dg,ng.lineEnd=bg},polygonEnd:function(){ng.lineStart=ng.lineEnd=ng.point=hI,cg.add(eI(eg)),eg=new hB},result:function(){var B=cg/2;return cg=new hB,B}};function dg(){ng.point=Cg}function Cg(B,Q){ng.point=ag,sg=gg=B,Ig=ig=Q}function ag(B,Q){eg.add(ig*B-gg*Q),gg=B,ig=Q}function bg(){ag(sg,Ig)}var og=1/0,ug=og,Gg=-og,rg=Gg,xg={point:function(B,Q){B<og&&(og=B);B>Gg&&(Gg=B);Q<ug&&(ug=Q);Q>rg&&(rg=Q)},lineStart:hI,lineEnd:hI,polygonStart:hI,polygonEnd:hI,result:function(){var B=[[og,ug],[Gg,rg]];return Gg=rg=-(ug=og=1/0),B}};var Ag,Lg,hg,Rg,yg=0,Vg=0,Zg=0,Sg=0,mg=0,Eg=0,Ng=0,Xg=0,pg=0,Wg={point:Hg,lineStart:Dg,lineEnd:wg,polygonStart:function(){Wg.lineStart=vg,Wg.lineEnd=Jg},polygonEnd:function(){Wg.point=Hg,Wg.lineStart=Dg,Wg.lineEnd=wg},result:function(){var B=pg?[Ng/pg,Xg/pg]:Eg?[Sg/Eg,mg/Eg]:Zg?[yg/Zg,Vg/Zg]:[NaN,NaN];return yg=Vg=Zg=Sg=mg=Eg=Ng=Xg=pg=0,B}};function Hg(B,Q){yg+=B,Vg+=Q,++Zg}function Dg(){Wg.point=fg}function fg(B,Q){Wg.point=Yg,Hg(hg=B,Rg=Q)}function Yg(B,Q){var F=B-hg,U=Q-Rg,t=rI(F*F+U*U);Sg+=t*(hg+B)/2,mg+=t*(Rg+Q)/2,Eg+=t,Hg(hg=B,Rg=Q)}function wg(){Wg.point=Hg}function vg(){Wg.point=kg}function Jg(){Mg(Ag,Lg)}function kg(B,Q){Wg.point=Mg,Hg(Ag=hg=B,Lg=Rg=Q)}function Mg(B,Q){var F=B-hg,U=Q-Rg,t=rI(F*F+U*U);Sg+=t*(hg+B)/2,mg+=t*(Rg+Q)/2,Eg+=t,Ng+=(t=Rg*B-hg*Q)*(hg+B),Xg+=t*(Rg+Q),pg+=3*t,Hg(hg=B,Rg=Q)}function Tg(B){this._context=B}Tg.prototype={_radius:4.5,pointRadius:function(B){return this._radius=B,this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._context.closePath(),this._point=NaN},point:function(B,Q){switch(this._point){case 0:this._context.moveTo(B,Q),this._point=1;break;case 1:this._context.lineTo(B,Q);break;default:this._context.moveTo(B+this._radius,Q),this._context.arc(B,Q,this._radius,0,iI)}},result:hI};var zg,Kg,Og,jg,Pg,_g=new hB,$g={point:hI,lineStart:function(){$g.point=qg},lineEnd:function(){zg&&Bi(Kg,Og),$g.point=hI},polygonStart:function(){zg=!0},polygonEnd:function(){zg=null},result:function(){var B=+_g;return _g=new hB,B}};function qg(B,Q){$g.point=Bi,Kg=jg=B,Og=Pg=Q}function Bi(B,Q){jg-=B,Pg-=Q,_g.add(rI(jg*jg+Pg*Pg)),jg=B,Pg=Q}let Qi,Fi,Ui,ti;class si{constructor(B){this._append=null==B?Ii:function(B){const Q=Math.floor(B);if(!(Q>=0))throw new RangeError(`invalid digits: ${B}`);if(Q>15)return Ii;if(Q!==Qi){const B=10**Q;Qi=Q,Fi=function(Q){let F=1;this._+=Q[0];for(const U=Q.length;F<U;++F)this._+=Math.round(arguments[F]*B)/B+Q[F]}}return Fi}(B),this._radius=4.5,this._=""}pointRadius(B){return this._radius=+B,this}polygonStart(){this._line=0}polygonEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){0===this._line&&(this._+="Z"),this._point=NaN}point(B,Q){switch(this._point){case 0:this._append`M${B},${Q}`,this._point=1;break;case 1:this._append`L${B},${Q}`;break;default:if(this._append`M${B},${Q}`,this._radius!==Ui||this._append!==Fi){const B=this._radius,Q=this._;this._="",this._append`m0,${B}a${B},${B} 0 1,1 0,${-2*B}a${B},${B} 0 1,1 0,${2*B}z`,Ui=B,Fi=this._append,ti=this._,this._=Q}this._+=ti}}result(){const B=this._;return this._="",B.length?B:null}}function Ii(B){let Q=1;this._+=B[0];for(const F=B.length;Q<F;++Q)this._+=arguments[Q]+B[Q]}function gi(B,Q){let F,U,t=3,s=4.5;function I(B){return B&&("function"==typeof s&&U.pointRadius(+s.apply(this,arguments)),mI(B,F(U))),U.result()}return I.area=function(B){return mI(B,F(ng)),ng.result()},I.measure=function(B){return mI(B,F($g)),$g.result()},I.bounds=function(B){return mI(B,F(xg)),xg.result()},I.centroid=function(B){return mI(B,F(Wg)),Wg.result()},I.projection=function(Q){return arguments.length?(F=null==Q?(B=null,lg):(B=Q).stream,I):B},I.context=function(B){return arguments.length?(U=null==B?(Q=null,new si(t)):new Tg(Q=B),"function"!=typeof s&&U.pointRadius(s),I):Q},I.pointRadius=function(B){return arguments.length?(s="function"==typeof B?B:(U.pointRadius(+B),+B),I):s},I.digits=function(B){if(!arguments.length)return t;if(null==B)t=null;else{const Q=Math.floor(B);if(!(Q>=0))throw new RangeError(`invalid digits: ${B}`);t=Q}return null===Q&&(U=new si(t)),I},I.projection(B).digits(t).context(Q)}function ii(B){return{stream:li(B)}}function li(B){return function(Q){var F=new ci;for(var U in B)F[U]=B[U];return F.stream=Q,F}}function ci(){}function ei(B,Q,F){var U=B.clipExtent&&B.clipExtent();return B.scale(150).translate([0,0]),null!=U&&B.clipExtent(null),mI(F,B.stream(xg)),Q(xg.result()),null!=U&&B.clipExtent(U),B}function ni(B,Q,F){return ei(B,function(F){var U=Q[1][0]-Q[0][0],t=Q[1][1]-Q[0][1],s=Math.min(U/(F[1][0]-F[0][0]),t/(F[1][1]-F[0][1])),I=+Q[0][0]+(U-s*(F[1][0]+F[0][0]))/2,g=+Q[0][1]+(t-s*(F[1][1]+F[0][1]))/2;B.scale(150*s).translate([I,g])},F)}function di(B,Q,F){return ni(B,[[0,0],Q],F)}function Ci(B,Q,F){return ei(B,function(F){var U=+Q,t=U/(F[1][0]-F[0][0]),s=(U-t*(F[1][0]+F[0][0]))/2,I=-t*F[0][1];B.scale(150*t).translate([s,I])},F)}function ai(B,Q,F){return ei(B,function(F){var U=+Q,t=U/(F[1][1]-F[0][1]),s=-t*F[0][0],I=(U-t*(F[1][1]+F[0][1]))/2;B.scale(150*t).translate([s,I])},F)}ci.prototype={constructor:ci,point:function(B,Q){this.stream.point(B,Q)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}};var bi=CI(30*cI);function oi(B,Q){return+Q?function(B,Q){function F(U,t,s,I,g,i,l,c,e,n,d,C,a,b){var o=l-U,u=c-t,G=o*o+u*u;if(G>4*Q&&a--){var r=I+n,x=g+d,A=i+C,L=rI(r*r+x*x+A*A),h=LI(A/=L),R=eI(eI(A)-1)<tI||eI(s-e)<tI?(s+e)/2:dI(x,r),y=B(R,h),V=y[0],Z=y[1],S=V-U,m=Z-t,E=u*S-o*m;(E*E/G>Q||eI((o*S+u*m)/G-.5)>.3||I*n+g*d+i*C<bi)&&(F(U,t,s,I,g,i,V,Z,R,r/=L,x/=L,A,a,b),b.point(V,Z),F(V,Z,R,r,x,A,l,c,e,n,d,C,a,b))}}return function(Q){var U,t,s,I,g,i,l,c,e,n,d,C,a={point:b,lineStart:o,lineEnd:G,polygonStart:function(){Q.polygonStart(),a.lineStart=r},polygonEnd:function(){Q.polygonEnd(),a.lineStart=o}};function b(F,U){F=B(F,U),Q.point(F[0],F[1])}function o(){c=NaN,a.point=u,Q.lineStart()}function u(U,t){var s=NI([U,t]),I=B(U,t);F(c,e,l,n,d,C,c=I[0],e=I[1],l=U,n=s[0],d=s[1],C=s[2],16,Q),Q.point(c,e)}function G(){a.point=b,Q.lineEnd()}function r(){o(),a.point=x,a.lineEnd=A}function x(B,Q){u(U=B,Q),t=c,s=e,I=n,g=d,i=C,a.point=u}function A(){F(c,e,l,n,d,C,t,s,U,I,g,i,16,Q),a.lineEnd=G,G()}return a}}(B,Q):function(B){return li({point:function(Q,F){Q=B(Q,F),this.stream.point(Q[0],Q[1])}})}(B)}var ui=li({point:function(B,Q){this.stream.point(B*cI,Q*cI)}});function Gi(B,Q,F,U,t,s){if(!s)return function(B,Q,F,U,t){function s(s,I){return[Q+B*(s*=U),F-B*(I*=t)]}return s.invert=function(s,I){return[(s-Q)/B*U,(F-I)/B*t]},s}(B,Q,F,U,t);var I=CI(s),g=uI(s),i=I*B,l=g*B,c=I/B,e=g/B,n=(g*F-I*Q)/B,d=(g*Q+I*F)/B;function C(B,s){return[i*(B*=U)-l*(s*=t)+Q,F-l*B-i*s]}return C.invert=function(B,Q){return[U*(c*B-e*Q+n),t*(d-e*B-c*Q)]},C}function ri(B){return xi(function(){return B})()}function xi(B){var Q,F,U,t,s,I,g,i,l,c,e=150,n=480,d=250,C=0,a=0,b=0,o=0,u=0,G=0,r=1,x=1,A=null,L=Bg,h=null,R=lg,y=.5;function V(B){return i(B[0]*cI,B[1]*cI)}function Z(B){return(B=i.invert(B[0],B[1]))&&[B[0]*lI,B[1]*lI]}function S(){var B=Gi(e,0,0,r,x,G).apply(null,Q(C,a)),U=Gi(e,n-B[0],d-B[1],r,x,G);return F=wI(b,o,u),g=fI(Q,U),i=fI(F,g),I=oi(g,y),m()}function m(){return l=c=null,V}return V.stream=function(B){return l&&c===B?l:l=ui(function(B){return li({point:function(Q,F){var U=B(Q,F);return this.stream.point(U[0],U[1])}})}(F)(L(I(R(c=B)))))},V.preclip=function(B){return arguments.length?(L=B,A=void 0,m()):L},V.postclip=function(B){return arguments.length?(R=B,h=U=t=s=null,m()):R},V.clipAngle=function(B){return arguments.length?(L=+B?Qg(A=B*cI):(A=null,Bg),m()):A*lI},V.clipExtent=function(B){return arguments.length?(R=null==B?(h=U=t=s=null,lg):tg(h=+B[0][0],U=+B[0][1],t=+B[1][0],s=+B[1][1]),m()):null==h?null:[[h,U],[t,s]]},V.scale=function(B){return arguments.length?(e=+B,S()):e},V.translate=function(B){return arguments.length?(n=+B[0],d=+B[1],S()):[n,d]},V.center=function(B){return arguments.length?(C=B[0]%360*cI,a=B[1]%360*cI,S()):[C*lI,a*lI]},V.rotate=function(B){return arguments.length?(b=B[0]%360*cI,o=B[1]%360*cI,u=B.length>2?B[2]%360*cI:0,S()):[b*lI,o*lI,u*lI]},V.angle=function(B){return arguments.length?(G=B%360*cI,S()):G*lI},V.reflectX=function(B){return arguments.length?(r=B?-1:1,S()):r<0},V.reflectY=function(B){return arguments.length?(x=B?-1:1,S()):x<0},V.precision=function(B){return arguments.length?(I=oi(g,y=B*B),m()):rI(y)},V.fitExtent=function(B,Q){return ni(V,B,Q)},V.fitSize=function(B,Q){return di(V,B,Q)},V.fitWidth=function(B,Q){return Ci(V,B,Q)},V.fitHeight=function(B,Q){return ai(V,B,Q)},function(){return Q=B.apply(this,arguments),V.invert=Q.invert&&Z,S()}}function Ai(B){var Q=0,F=sI/3,U=xi(B),t=U(Q,F);return t.parallels=function(B){return arguments.length?U(Q=B[0]*cI,F=B[1]*cI):[Q*lI,F*lI]},t}function Li(B,Q){var F=uI(B),U=(F+uI(Q))/2;if(eI(U)<tI)return function(B){var Q=CI(B);function F(B,F){return[B*Q,uI(F)/Q]}return F.invert=function(B,F){return[B/Q,LI(F*Q)]},F}(B);var t=1+F*(2*U-F),s=rI(t)/U;function I(B,Q){var F=rI(t-2*U*uI(Q))/U;return[F*uI(B*=U),s-F*CI(B)]}return I.invert=function(B,Q){var F=s-Q,I=dI(B,eI(F))*GI(F);return F*U<0&&(I-=sI*GI(B)*GI(F)),[I/U,LI((t-(B*B+F*F)*U*U)/(2*U))]},I}function hi(){return Ai(Li).scale(155.424).center([0,33.6442])}function Ri(){return hi().parallels([29.5,45.5]).scale(1070).translate([480,250]).rotate([96,0]).center([-.6,38.7])}function yi(){var B,Q,F,U,t,s,I=Ri(),g=hi().rotate([154,0]).center([-2,58.5]).parallels([55,65]),i=hi().rotate([157,0]).center([-3,19.9]).parallels([8,18]),l={point:function(B,Q){s=[B,Q]}};function c(B){var Q=B[0],I=B[1];return s=null,F.point(Q,I),s||(U.point(Q,I),s)||(t.point(Q,I),s)}function e(){return B=Q=null,c}return c.invert=function(B){var Q=I.scale(),F=I.translate(),U=(B[0]-F[0])/Q,t=(B[1]-F[1])/Q;return(t>=.12&&t<.234&&U>=-.425&&U<-.214?g:t>=.166&&t<.234&&U>=-.214&&U<-.115?i:I).invert(B)},c.stream=function(F){return B&&Q===F?B:B=function(B){var Q=B.length;return{point:function(F,U){for(var t=-1;++t<Q;)B[t].point(F,U)},sphere:function(){for(var F=-1;++F<Q;)B[F].sphere()},lineStart:function(){for(var F=-1;++F<Q;)B[F].lineStart()},lineEnd:function(){for(var F=-1;++F<Q;)B[F].lineEnd()},polygonStart:function(){for(var F=-1;++F<Q;)B[F].polygonStart()},polygonEnd:function(){for(var F=-1;++F<Q;)B[F].polygonEnd()}}}([I.stream(Q=F),g.stream(F),i.stream(F)])},c.precision=function(B){return arguments.length?(I.precision(B),g.precision(B),i.precision(B),e()):I.precision()},c.scale=function(B){return arguments.length?(I.scale(B),g.scale(.35*B),i.scale(B),c.translate(I.translate())):I.scale()},c.translate=function(B){if(!arguments.length)return I.translate();var Q=I.scale(),s=+B[0],c=+B[1];return F=I.translate(B).clipExtent([[s-.455*Q,c-.238*Q],[s+.455*Q,c+.238*Q]]).stream(l),U=g.translate([s-.307*Q,c+.201*Q]).clipExtent([[s-.425*Q+tI,c+.12*Q+tI],[s-.214*Q-tI,c+.234*Q-tI]]).stream(l),t=i.translate([s-.205*Q,c+.212*Q]).clipExtent([[s-.214*Q+tI,c+.166*Q+tI],[s-.115*Q-tI,c+.234*Q-tI]]).stream(l),e()},c.fitExtent=function(B,Q){return ni(c,B,Q)},c.fitSize=function(B,Q){return di(c,B,Q)},c.fitWidth=function(B,Q){return Ci(c,B,Q)},c.fitHeight=function(B,Q){return ai(c,B,Q)},c.scale(1070)}function Vi(B){return function(Q,F){var U=CI(Q),t=CI(F),s=B(U*t);return s===1/0?[2,0]:[s*t*uI(Q),s*uI(F)]}}function Zi(B){return function(Q,F){var U=rI(Q*Q+F*F),t=B(U),s=uI(t),I=CI(t);return[dI(Q*s,U*I),LI(U&&F*s/U)]}}var Si=Vi(function(B){return rI(2/(1+B))});function mi(){return ri(Si).scale(124.75).clipAngle(179.999)}Si.invert=Zi(function(B){return 2*LI(B/2)});var Ei=Vi(function(B){return(B=AI(B))&&B/uI(B)});function Ni(){return ri(Ei).scale(79.4188).clipAngle(179.999)}function Xi(B,Q){return[B,bI(xI((II+Q)/2))]}function pi(){return Wi(Xi).scale(961/iI)}function Wi(B){var Q,F,U,t=ri(B),s=t.center,I=t.scale,g=t.translate,i=t.clipExtent,l=null;function c(){var s=sI*I(),g=t(function(B){function Q(Q){return(Q=B(Q[0]*cI,Q[1]*cI))[0]*=lI,Q[1]*=lI,Q}return B=wI(B[0]*cI,B[1]*cI,B.length>2?B[2]*cI:0),Q.invert=function(Q){return(Q=B.invert(Q[0]*cI,Q[1]*cI))[0]*=lI,Q[1]*=lI,Q},Q}(t.rotate()).invert([0,0]));return i(null==l?[[g[0]-s,g[1]-s],[g[0]+s,g[1]+s]]:B===Xi?[[Math.max(g[0]-s,l),Q],[Math.min(g[0]+s,F),U]]:[[l,Math.max(g[1]-s,Q)],[F,Math.min(g[1]+s,U)]])}return t.scale=function(B){return arguments.length?(I(B),c()):I()},t.translate=function(B){return arguments.length?(g(B),c()):g()},t.center=function(B){return arguments.length?(s(B),c()):s()},t.clipExtent=function(B){return arguments.length?(null==B?l=Q=F=U=null:(l=+B[0][0],Q=+B[0][1],F=+B[1][0],U=+B[1][1]),c()):null==l?null:[[l,Q],[F,U]]},c()}function Hi(B){return xI((II+B)/2)}function Di(B,Q){var F=CI(B),U=B===Q?uI(B):bI(F/CI(Q))/bI(Hi(Q)/Hi(B)),t=F*oI(Hi(B),U)/U;if(!U)return Xi;function s(B,Q){t>0?Q<-II+tI&&(Q=-II+tI):Q>II-tI&&(Q=II-tI);var F=t/oI(Hi(Q),U);return[F*uI(U*B),t-F*CI(U*B)]}return s.invert=function(B,Q){var F=t-Q,s=GI(U)*rI(B*B+F*F),I=dI(B,eI(F))*GI(F);return F*U<0&&(I-=sI*GI(B)*GI(F)),[I/U,2*nI(oI(t/s,1/U))-II]},s}function fi(){return Ai(Di).scale(109.5).parallels([30,30])}function Yi(B,Q){return[B,Q]}function wi(){return ri(Yi).scale(152.63)}function vi(B,Q){var F=CI(B),U=B===Q?uI(B):(F-CI(Q))/(Q-B),t=F/U+B;if(eI(U)<tI)return Yi;function s(B,Q){var F=t-Q,s=U*B;return[F*uI(s),t-F*CI(s)]}return s.invert=function(B,Q){var F=t-Q,s=dI(B,eI(F))*GI(F);return F*U<0&&(s-=sI*GI(B)*GI(F)),[s/U,t-GI(U)*rI(B*B+F*F)]},s}function Ji(){return Ai(vi).scale(131.154).center([0,13.9389])}Ei.invert=Zi(function(B){return B}),Xi.invert=function(B,Q){return[B,2*nI(aI(Q))-II]},Yi.invert=Yi;var ki=1.340264,Mi=-.081106,Ti=893e-6,zi=.003796,Ki=rI(3)/2;function Oi(B,Q){var F=LI(Ki*uI(Q)),U=F*F,t=U*U*U;return[B*CI(F)/(Ki*(ki+3*Mi*U+t*(7*Ti+9*zi*U))),F*(ki+Mi*U+t*(Ti+zi*U))]}function ji(){return ri(Oi).scale(177.158)}function Pi(B,Q){var F=CI(Q),U=CI(B)*F;return[F*uI(B)/U,uI(Q)/U]}function _i(){return ri(Pi).scale(144.049).clipAngle(60)}function $i(B,Q){return[CI(Q)*uI(B),uI(Q)]}function qi(){return ri($i).scale(249.5).clipAngle(90.000001)}function Bl(B,Q){var F=CI(Q),U=1+CI(B)*F;return[F*uI(B)/U,uI(Q)/U]}function Ql(){return ri(Bl).scale(250).clipAngle(142)}function Fl(B,Q){return[bI(xI((II+Q)/2)),-B]}function Ul(){var B=Wi(Fl),Q=B.center,F=B.rotate;return B.center=function(B){return arguments.length?Q([-B[1],B[0]]):[(B=Q())[1],-B[0]]},B.rotate=function(B){return arguments.length?F([B[0],B[1],B.length>2?B[2]+90:90]):[(B=F())[0],B[1],B[2]-90]},F([0,0,90]).scale(159.155)}function tl(B,Q){switch(arguments.length){case 0:break;case 1:this.range(B);break;default:this.range(Q).domain(B)}return this}function sl(B,Q){switch(arguments.length){case 0:break;case 1:"function"==typeof B?this.interpolator(B):this.range(B);break;default:this.domain(B),"function"==typeof Q?this.interpolator(Q):this.range(Q)}return this}Oi.invert=function(B,Q){for(var F,U=Q,t=U*U,s=t*t*t,I=0;I<12&&(s=(t=(U-=F=(U*(ki+Mi*t+s*(Ti+zi*t))-Q)/(ki+3*Mi*t+s*(7*Ti+9*zi*t)))*U)*t*t,!(eI(F)<1e-12));++I);return[Ki*B*(ki+3*Mi*t+s*(7*Ti+9*zi*t))/CI(U),LI(uI(U)/Ki)]},Pi.invert=Zi(nI),$i.invert=Zi(LI),Bl.invert=Zi(function(B){return 2*nI(B)}),Fl.invert=function(B,Q){return[-Q,2*nI(aI(B))-II]};const Il=Symbol("implicit");function gl(){var B=new RB,Q=[],F=[],U=Il;function t(t){let s=B.get(t);if(void 0===s){if(U!==Il)return U;B.set(t,s=Q.push(t)-1)}return F[s%F.length]}return t.domain=function(F){if(!arguments.length)return Q.slice();Q=[],B=new RB;for(const U of F)B.has(U)||B.set(U,Q.push(U)-1);return t},t.range=function(B){return arguments.length?(F=Array.from(B),t):F.slice()},t.unknown=function(B){return arguments.length?(U=B,t):U},t.copy=function(){return gl(Q,F).unknown(U)},tl.apply(t,arguments),t}function il(){var B,Q,F=gl().unknown(void 0),U=F.domain,t=F.range,s=0,I=1,g=!1,i=0,l=0,c=.5;function e(){var F=U().length,e=I<s,n=e?I:s,d=e?s:I;B=(d-n)/Math.max(1,F-i+2*l),g&&(B=Math.floor(B)),n+=(d-n-B*(F-i))*c,Q=B*(1-i),g&&(n=Math.round(n),Q=Math.round(Q));var C=cQ(F).map(function(Q){return n+B*Q});return t(e?C.reverse():C)}return delete F.unknown,F.domain=function(B){return arguments.length?(U(B),e()):U()},F.range=function(B){return arguments.length?([s,I]=B,s=+s,I=+I,e()):[s,I]},F.rangeRound=function(B){return[s,I]=B,s=+s,I=+I,g=!0,e()},F.bandwidth=function(){return Q},F.step=function(){return B},F.round=function(B){return arguments.length?(g=!!B,e()):g},F.padding=function(B){return arguments.length?(i=Math.min(1,l=+B),e()):i},F.paddingInner=function(B){return arguments.length?(i=Math.min(1,B),e()):i},F.paddingOuter=function(B){return arguments.length?(l=+B,e()):l},F.align=function(B){return arguments.length?(c=Math.max(0,Math.min(1,B)),e()):c},F.copy=function(){return il(U(),[s,I]).round(g).paddingInner(i).paddingOuter(l).align(c)},tl.apply(e(),arguments)}function ll(B){var Q=B.copy;return B.padding=B.paddingOuter,delete B.paddingInner,delete B.paddingOuter,B.copy=function(){return ll(Q())},B}function cl(){return ll(il.apply(null,arguments).paddingInner(1))}function el(B){return+B}var nl=[0,1];function dl(B){return B}function Cl(B,Q){return(Q-=B=+B)?function(F){return(F-B)/Q}:function(B){return function(){return B}}(isNaN(Q)?NaN:.5)}function al(B,Q,F){var U=B[0],t=B[1],s=Q[0],I=Q[1];return t<U?(U=Cl(t,U),s=F(I,s)):(U=Cl(U,t),s=F(s,I)),function(B){return s(U(B))}}function bl(B,Q,F){var U=Math.min(B.length,Q.length)-1,t=new Array(U),s=new Array(U),I=-1;for(B[U]<B[0]&&(B=B.slice().reverse(),Q=Q.slice().reverse());++I<U;)t[I]=Cl(B[I],B[I+1]),s[I]=F(Q[I],Q[I+1]);return function(Q){var F=aB(B,Q,1,U)-1;return s[F](t[F](Q))}}function ol(B,Q){return Q.domain(B.domain()).range(B.range()).interpolate(B.interpolate()).clamp(B.clamp()).unknown(B.unknown())}function ul(){var B,Q,F,U,t,s,I=nl,g=nl,i=Rt,l=dl;function c(){var B=Math.min(I.length,g.length);return l!==dl&&(l=function(B,Q){var F;return B>Q&&(F=B,B=Q,Q=F),function(F){return Math.max(B,Math.min(Q,F))}}(I[0],I[B-1])),U=B>2?bl:al,t=s=null,e}function e(Q){return null==Q||isNaN(Q=+Q)?F:(t||(t=U(I.map(B),g,i)))(B(l(Q)))}return e.invert=function(F){return l(Q((s||(s=U(g,I.map(B),rt)))(F)))},e.domain=function(B){return arguments.length?(I=Array.from(B,el),c()):I.slice()},e.range=function(B){return arguments.length?(g=Array.from(B),c()):g.slice()},e.rangeRound=function(B){return g=Array.from(B),i=yt,c()},e.clamp=function(B){return arguments.length?(l=!!B||dl,c()):l!==dl},e.interpolate=function(B){return arguments.length?(i=B,c()):i},e.unknown=function(B){return arguments.length?(F=B,e):F},function(F,U){return B=F,Q=U,c()}}function Gl(){return ul()(dl,dl)}function rl(B,Q,F,U){var t,s=zB(B,Q,F);switch((U=Ks(null==U?",f":U)).type){case"s":var I=Math.max(Math.abs(B),Math.abs(Q));return null!=U.precision||isNaN(t=function(B,Q){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(Ms(Q)/3)))-Ms(Math.abs(B)))}(s,I))||(U.precision=t),BI(U,I);case"":case"e":case"g":case"p":case"r":null!=U.precision||isNaN(t=function(B,Q){return B=Math.abs(B),Q=Math.abs(Q)-B,Math.max(0,Ms(Q)-Ms(B))+1}(s,Math.max(Math.abs(B),Math.abs(Q))))||(U.precision=t-("e"===U.type));break;case"f":case"%":null!=U.precision||isNaN(t=function(B){return Math.max(0,-Ms(Math.abs(B)))}(s))||(U.precision=t-2*("%"===U.type))}return qs(U)}function xl(B){var Q=B.domain;return B.ticks=function(B){var F=Q();return MB(F[0],F[F.length-1],null==B?10:B)},B.tickFormat=function(B,F){var U=Q();return rl(U[0],U[U.length-1],null==B?10:B,F)},B.nice=function(F){null==F&&(F=10);var U,t,s=Q(),I=0,g=s.length-1,i=s[I],l=s[g],c=10;for(l<i&&(t=i,i=l,l=t,t=I,I=g,g=t);c-- >0;){if((t=TB(i,l,F))===U)return s[I]=i,s[g]=l,Q(s);if(t>0)i=Math.floor(i/t)*t,l=Math.ceil(l/t)*t;else{if(!(t<0))break;i=Math.ceil(i*t)/t,l=Math.floor(l*t)/t}U=t}return B},B}function Al(){var B=Gl();return B.copy=function(){return ol(B,Al())},tl.apply(B,arguments),xl(B)}function Ll(B){var Q;function F(B){return null==B||isNaN(B=+B)?Q:B}return F.invert=F,F.domain=F.range=function(Q){return arguments.length?(B=Array.from(Q,el),F):B.slice()},F.unknown=function(B){return arguments.length?(Q=B,F):Q},F.copy=function(){return Ll(B).unknown(Q)},B=arguments.length?Array.from(B,el):[0,1],xl(F)}function hl(B,Q){var F,U=0,t=(B=B.slice()).length-1,s=B[U],I=B[t];return I<s&&(F=U,U=t,t=F,F=s,s=I,I=F),B[U]=Q.floor(s),B[t]=Q.ceil(I),B}function Rl(B){return Math.log(B)}function yl(B){return Math.exp(B)}function Vl(B){return-Math.log(-B)}function Zl(B){return-Math.exp(-B)}function Sl(B){return isFinite(B)?+("1e"+B):B<0?0:B}function ml(B){return(Q,F)=>-B(-Q,F)}function El(B){const Q=B(Rl,yl),F=Q.domain;let U,t,s=10;function I(){return U=function(B){return B===Math.E?Math.log:10===B&&Math.log10||2===B&&Math.log2||(B=Math.log(B),Q=>Math.log(Q)/B)}(s),t=function(B){return 10===B?Sl:B===Math.E?Math.exp:Q=>Math.pow(B,Q)}(s),F()[0]<0?(U=ml(U),t=ml(t),B(Vl,Zl)):B(Rl,yl),Q}return Q.base=function(B){return arguments.length?(s=+B,I()):s},Q.domain=function(B){return arguments.length?(F(B),I()):F()},Q.ticks=B=>{const Q=F();let I=Q[0],g=Q[Q.length-1];const i=g<I;i&&([I,g]=[g,I]);let l,c,e=U(I),n=U(g);const d=null==B?10:+B;let C=[];if(!(s%1)&&n-e<d){if(e=Math.floor(e),n=Math.ceil(n),I>0){for(;e<=n;++e)for(l=1;l<s;++l)if(c=e<0?l/t(-e):l*t(e),!(c<I)){if(c>g)break;C.push(c)}}else for(;e<=n;++e)for(l=s-1;l>=1;--l)if(c=e>0?l/t(-e):l*t(e),!(c<I)){if(c>g)break;C.push(c)}2*C.length<d&&(C=MB(I,g,d))}else C=MB(e,n,Math.min(n-e,d)).map(t);return i?C.reverse():C},Q.tickFormat=(B,F)=>{if(null==B&&(B=10),null==F&&(F=10===s?"s":","),"function"!=typeof F&&(s%1||null!=(F=Ks(F)).precision||(F.trim=!0),F=qs(F)),B===1/0)return F;const I=Math.max(1,s*B/Q.ticks().length);return B=>{let Q=B/t(Math.round(U(B)));return Q*s<s-.5&&(Q*=s),Q<=I?F(B):""}},Q.nice=()=>F(hl(F(),{floor:B=>t(Math.floor(U(B))),ceil:B=>t(Math.ceil(U(B)))})),Q}function Nl(){const B=El(ul()).domain([1,10]);return B.copy=()=>ol(B,Nl()).base(B.base()),tl.apply(B,arguments),B}function Xl(B){return function(Q){return Math.sign(Q)*Math.log1p(Math.abs(Q/B))}}function pl(B){return function(Q){return Math.sign(Q)*Math.expm1(Math.abs(Q))*B}}function Wl(B){var Q=1,F=B(Xl(Q),pl(Q));return F.constant=function(F){return arguments.length?B(Xl(Q=+F),pl(Q)):Q},xl(F)}function Hl(){var B=Wl(ul());return B.copy=function(){return ol(B,Hl()).constant(B.constant())},tl.apply(B,arguments)}function Dl(B){return function(Q){return Q<0?-Math.pow(-Q,B):Math.pow(Q,B)}}function fl(B){return B<0?-Math.sqrt(-B):Math.sqrt(B)}function Yl(B){return B<0?-B*B:B*B}function wl(B){var Q=B(dl,dl),F=1;return Q.exponent=function(Q){return arguments.length?1===(F=+Q)?B(dl,dl):.5===F?B(fl,Yl):B(Dl(F),Dl(1/F)):F},xl(Q)}function vl(){var B=wl(ul());return B.copy=function(){return ol(B,vl()).exponent(B.exponent())},tl.apply(B,arguments),B}function Jl(){var B,Q=[],F=[],U=[];function t(){var B=0,t=Math.max(1,F.length);for(U=new Array(t-1);++B<t;)U[B-1]=FQ(Q,B/t);return s}function s(Q){return null==Q||isNaN(Q=+Q)?B:F[aB(U,Q)]}return s.invertExtent=function(B){var t=F.indexOf(B);return t<0?[NaN,NaN]:[t>0?U[t-1]:Q[0],t<U.length?U[t]:Q[Q.length-1]]},s.domain=function(B){if(!arguments.length)return Q.slice();Q=[];for(let F of B)null==F||isNaN(F=+F)||Q.push(F);return Q.sort(cB),t()},s.range=function(B){return arguments.length?(F=Array.from(B),t()):F.slice()},s.unknown=function(Q){return arguments.length?(B=Q,s):B},s.quantiles=function(){return U.slice()},s.copy=function(){return Jl().domain(Q).range(F).unknown(B)},tl.apply(s,arguments)}function kl(){var B,Q=[.5],F=[0,1],U=1;function t(t){return null!=t&&t<=t?F[aB(Q,t,0,U)]:B}return t.domain=function(B){return arguments.length?(Q=Array.from(B),U=Math.min(Q.length,F.length-1),t):Q.slice()},t.range=function(B){return arguments.length?(F=Array.from(B),U=Math.min(Q.length,F.length-1),t):F.slice()},t.invertExtent=function(B){var U=F.indexOf(B);return[Q[U-1],Q[U]]},t.unknown=function(Q){return arguments.length?(B=Q,t):B},t.copy=function(){return kl().domain(Q).range(F).unknown(B)},tl.apply(t,arguments)}const Ml=new Date,Tl=new Date;function zl(B,Q,F,U){function t(Q){return B(Q=0===arguments.length?new Date:new Date(+Q)),Q}return t.floor=Q=>(B(Q=new Date(+Q)),Q),t.ceil=F=>(B(F=new Date(F-1)),Q(F,1),B(F),F),t.round=B=>{const Q=t(B),F=t.ceil(B);return B-Q<F-B?Q:F},t.offset=(B,F)=>(Q(B=new Date(+B),null==F?1:Math.floor(F)),B),t.range=(F,U,s)=>{const I=[];if(F=t.ceil(F),s=null==s?1:Math.floor(s),!(F<U&&s>0))return I;let g;do{I.push(g=new Date(+F)),Q(F,s),B(F)}while(g<F&&F<U);return I},t.filter=F=>zl(Q=>{if(Q>=Q)for(;B(Q),!F(Q);)Q.setTime(Q-1)},(B,U)=>{if(B>=B)if(U<0)for(;++U<=0;)for(;Q(B,-1),!F(B););else for(;--U>=0;)for(;Q(B,1),!F(B););}),F&&(t.count=(Q,U)=>(Ml.setTime(+Q),Tl.setTime(+U),B(Ml),B(Tl),Math.floor(F(Ml,Tl))),t.every=B=>(B=Math.floor(B),isFinite(B)&&B>0?B>1?t.filter(U?Q=>U(Q)%B===0:Q=>t.count(0,Q)%B===0):t:null)),t}const Kl=zl(()=>{},(B,Q)=>{B.setTime(+B+Q)},(B,Q)=>Q-B);Kl.every=B=>(B=Math.floor(B),isFinite(B)&&B>0?B>1?zl(Q=>{Q.setTime(Math.floor(Q/B)*B)},(Q,F)=>{Q.setTime(+Q+F*B)},(Q,F)=>(F-Q)/B):Kl:null),Kl.range;const Ol=1e3,jl=6e4,Pl=36e5,_l=864e5,$l=6048e5,ql=2592e6,Bc=31536e6,Qc=zl(B=>{B.setTime(B-B.getMilliseconds())},(B,Q)=>{B.setTime(+B+Q*Ol)},(B,Q)=>(Q-B)/Ol,B=>B.getUTCSeconds());Qc.range;const Fc=zl(B=>{B.setTime(B-B.getMilliseconds()-B.getSeconds()*Ol)},(B,Q)=>{B.setTime(+B+Q*jl)},(B,Q)=>(Q-B)/jl,B=>B.getMinutes());Fc.range;const Uc=zl(B=>{B.setUTCSeconds(0,0)},(B,Q)=>{B.setTime(+B+Q*jl)},(B,Q)=>(Q-B)/jl,B=>B.getUTCMinutes());Uc.range;const tc=zl(B=>{B.setTime(B-B.getMilliseconds()-B.getSeconds()*Ol-B.getMinutes()*jl)},(B,Q)=>{B.setTime(+B+Q*Pl)},(B,Q)=>(Q-B)/Pl,B=>B.getHours());tc.range;const sc=zl(B=>{B.setUTCMinutes(0,0,0)},(B,Q)=>{B.setTime(+B+Q*Pl)},(B,Q)=>(Q-B)/Pl,B=>B.getUTCHours());sc.range;const Ic=zl(B=>B.setHours(0,0,0,0),(B,Q)=>B.setDate(B.getDate()+Q),(B,Q)=>(Q-B-(Q.getTimezoneOffset()-B.getTimezoneOffset())*jl)/_l,B=>B.getDate()-1);Ic.range;const gc=zl(B=>{B.setUTCHours(0,0,0,0)},(B,Q)=>{B.setUTCDate(B.getUTCDate()+Q)},(B,Q)=>(Q-B)/_l,B=>B.getUTCDate()-1);gc.range;const ic=zl(B=>{B.setUTCHours(0,0,0,0)},(B,Q)=>{B.setUTCDate(B.getUTCDate()+Q)},(B,Q)=>(Q-B)/_l,B=>Math.floor(B/_l));function lc(B){return zl(Q=>{Q.setDate(Q.getDate()-(Q.getDay()+7-B)%7),Q.setHours(0,0,0,0)},(B,Q)=>{B.setDate(B.getDate()+7*Q)},(B,Q)=>(Q-B-(Q.getTimezoneOffset()-B.getTimezoneOffset())*jl)/$l)}ic.range;const cc=lc(0),ec=lc(1),nc=lc(2),dc=lc(3),Cc=lc(4),ac=lc(5),bc=lc(6);function oc(B){return zl(Q=>{Q.setUTCDate(Q.getUTCDate()-(Q.getUTCDay()+7-B)%7),Q.setUTCHours(0,0,0,0)},(B,Q)=>{B.setUTCDate(B.getUTCDate()+7*Q)},(B,Q)=>(Q-B)/$l)}cc.range,ec.range,nc.range,dc.range,Cc.range,ac.range,bc.range;const uc=oc(0),Gc=oc(1),rc=oc(2),xc=oc(3),Ac=oc(4),Lc=oc(5),hc=oc(6);uc.range,Gc.range,rc.range,xc.range,Ac.range,Lc.range,hc.range;const Rc=zl(B=>{B.setDate(1),B.setHours(0,0,0,0)},(B,Q)=>{B.setMonth(B.getMonth()+Q)},(B,Q)=>Q.getMonth()-B.getMonth()+12*(Q.getFullYear()-B.getFullYear()),B=>B.getMonth());Rc.range;const yc=zl(B=>{B.setUTCDate(1),B.setUTCHours(0,0,0,0)},(B,Q)=>{B.setUTCMonth(B.getUTCMonth()+Q)},(B,Q)=>Q.getUTCMonth()-B.getUTCMonth()+12*(Q.getUTCFullYear()-B.getUTCFullYear()),B=>B.getUTCMonth());yc.range;const Vc=zl(B=>{B.setMonth(0,1),B.setHours(0,0,0,0)},(B,Q)=>{B.setFullYear(B.getFullYear()+Q)},(B,Q)=>Q.getFullYear()-B.getFullYear(),B=>B.getFullYear());Vc.every=B=>isFinite(B=Math.floor(B))&&B>0?zl(Q=>{Q.setFullYear(Math.floor(Q.getFullYear()/B)*B),Q.setMonth(0,1),Q.setHours(0,0,0,0)},(Q,F)=>{Q.setFullYear(Q.getFullYear()+F*B)}):null,Vc.range;const Zc=zl(B=>{B.setUTCMonth(0,1),B.setUTCHours(0,0,0,0)},(B,Q)=>{B.setUTCFullYear(B.getUTCFullYear()+Q)},(B,Q)=>Q.getUTCFullYear()-B.getUTCFullYear(),B=>B.getUTCFullYear());function Sc(B,Q,F,U,t,s){const I=[[Qc,1,Ol],[Qc,5,5e3],[Qc,15,15e3],[Qc,30,3e4],[s,1,jl],[s,5,3e5],[s,15,9e5],[s,30,18e5],[t,1,Pl],[t,3,108e5],[t,6,216e5],[t,12,432e5],[U,1,_l],[U,2,1728e5],[F,1,$l],[Q,1,ql],[Q,3,7776e6],[B,1,Bc]];function g(Q,F,U){const t=Math.abs(F-Q)/U,s=nB(([,,B])=>B).right(I,t);if(s===I.length)return B.every(zB(Q/Bc,F/Bc,U));if(0===s)return Kl.every(Math.max(zB(Q,F,U),1));const[g,i]=I[t/I[s-1][2]<I[s][2]/t?s-1:s];return g.every(i)}return[function(B,Q,F){const U=Q<B;U&&([B,Q]=[Q,B]);const t=F&&"function"==typeof F.range?F:g(B,Q,F),s=t?t.range(B,+Q+1):[];return U?s.reverse():s},g]}Zc.every=B=>isFinite(B=Math.floor(B))&&B>0?zl(Q=>{Q.setUTCFullYear(Math.floor(Q.getUTCFullYear()/B)*B),Q.setUTCMonth(0,1),Q.setUTCHours(0,0,0,0)},(Q,F)=>{Q.setUTCFullYear(Q.getUTCFullYear()+F*B)}):null,Zc.range;const[mc,Ec]=Sc(Zc,yc,uc,ic,sc,Uc),[Nc,Xc]=Sc(Vc,Rc,cc,Ic,tc,Fc);function pc(B){if(0<=B.y&&B.y<100){var Q=new Date(-1,B.m,B.d,B.H,B.M,B.S,B.L);return Q.setFullYear(B.y),Q}return new Date(B.y,B.m,B.d,B.H,B.M,B.S,B.L)}function Wc(B){if(0<=B.y&&B.y<100){var Q=new Date(Date.UTC(-1,B.m,B.d,B.H,B.M,B.S,B.L));return Q.setUTCFullYear(B.y),Q}return new Date(Date.UTC(B.y,B.m,B.d,B.H,B.M,B.S,B.L))}function Hc(B,Q,F){return{y:B,m:Q,d:F,H:0,M:0,S:0,L:0}}var Dc,fc,Yc,wc={"-":"",_:" ",0:"0"},vc=/^\s*\d+/,Jc=/^%/,kc=/[\\^$*+?|[\]().{}]/g;function Mc(B,Q,F){var U=B<0?"-":"",t=(U?-B:B)+"",s=t.length;return U+(s<F?new Array(F-s+1).join(Q)+t:t)}function Tc(B){return B.replace(kc,"\\$&")}function zc(B){return new RegExp("^(?:"+B.map(Tc).join("|")+")","i")}function Kc(B){return new Map(B.map((B,Q)=>[B.toLowerCase(),Q]))}function Oc(B,Q,F){var U=vc.exec(Q.slice(F,F+1));return U?(B.w=+U[0],F+U[0].length):-1}function jc(B,Q,F){var U=vc.exec(Q.slice(F,F+1));return U?(B.u=+U[0],F+U[0].length):-1}function Pc(B,Q,F){var U=vc.exec(Q.slice(F,F+2));return U?(B.U=+U[0],F+U[0].length):-1}function _c(B,Q,F){var U=vc.exec(Q.slice(F,F+2));return U?(B.V=+U[0],F+U[0].length):-1}function $c(B,Q,F){var U=vc.exec(Q.slice(F,F+2));return U?(B.W=+U[0],F+U[0].length):-1}function qc(B,Q,F){var U=vc.exec(Q.slice(F,F+4));return U?(B.y=+U[0],F+U[0].length):-1}function Be(B,Q,F){var U=vc.exec(Q.slice(F,F+2));return U?(B.y=+U[0]+(+U[0]>68?1900:2e3),F+U[0].length):-1}function Qe(B,Q,F){var U=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(Q.slice(F,F+6));return U?(B.Z=U[1]?0:-(U[2]+(U[3]||"00")),F+U[0].length):-1}function Fe(B,Q,F){var U=vc.exec(Q.slice(F,F+1));return U?(B.q=3*U[0]-3,F+U[0].length):-1}function Ue(B,Q,F){var U=vc.exec(Q.slice(F,F+2));return U?(B.m=U[0]-1,F+U[0].length):-1}function te(B,Q,F){var U=vc.exec(Q.slice(F,F+2));return U?(B.d=+U[0],F+U[0].length):-1}function se(B,Q,F){var U=vc.exec(Q.slice(F,F+3));return U?(B.m=0,B.d=+U[0],F+U[0].length):-1}function Ie(B,Q,F){var U=vc.exec(Q.slice(F,F+2));return U?(B.H=+U[0],F+U[0].length):-1}function ge(B,Q,F){var U=vc.exec(Q.slice(F,F+2));return U?(B.M=+U[0],F+U[0].length):-1}function ie(B,Q,F){var U=vc.exec(Q.slice(F,F+2));return U?(B.S=+U[0],F+U[0].length):-1}function le(B,Q,F){var U=vc.exec(Q.slice(F,F+3));return U?(B.L=+U[0],F+U[0].length):-1}function ce(B,Q,F){var U=vc.exec(Q.slice(F,F+6));return U?(B.L=Math.floor(U[0]/1e3),F+U[0].length):-1}function ee(B,Q,F){var U=Jc.exec(Q.slice(F,F+1));return U?F+U[0].length:-1}function ne(B,Q,F){var U=vc.exec(Q.slice(F));return U?(B.Q=+U[0],F+U[0].length):-1}function de(B,Q,F){var U=vc.exec(Q.slice(F));return U?(B.s=+U[0],F+U[0].length):-1}function Ce(B,Q){return Mc(B.getDate(),Q,2)}function ae(B,Q){return Mc(B.getHours(),Q,2)}function be(B,Q){return Mc(B.getHours()%12||12,Q,2)}function oe(B,Q){return Mc(1+Ic.count(Vc(B),B),Q,3)}function ue(B,Q){return Mc(B.getMilliseconds(),Q,3)}function Ge(B,Q){return ue(B,Q)+"000"}function re(B,Q){return Mc(B.getMonth()+1,Q,2)}function xe(B,Q){return Mc(B.getMinutes(),Q,2)}function Ae(B,Q){return Mc(B.getSeconds(),Q,2)}function Le(B){var Q=B.getDay();return 0===Q?7:Q}function he(B,Q){return Mc(cc.count(Vc(B)-1,B),Q,2)}function Re(B){var Q=B.getDay();return Q>=4||0===Q?Cc(B):Cc.ceil(B)}function ye(B,Q){return B=Re(B),Mc(Cc.count(Vc(B),B)+(4===Vc(B).getDay()),Q,2)}function Ve(B){return B.getDay()}function Ze(B,Q){return Mc(ec.count(Vc(B)-1,B),Q,2)}function Se(B,Q){return Mc(B.getFullYear()%100,Q,2)}function me(B,Q){return Mc((B=Re(B)).getFullYear()%100,Q,2)}function Ee(B,Q){return Mc(B.getFullYear()%1e4,Q,4)}function Ne(B,Q){var F=B.getDay();return Mc((B=F>=4||0===F?Cc(B):Cc.ceil(B)).getFullYear()%1e4,Q,4)}function Xe(B){var Q=B.getTimezoneOffset();return(Q>0?"-":(Q*=-1,"+"))+Mc(Q/60|0,"0",2)+Mc(Q%60,"0",2)}function pe(B,Q){return Mc(B.getUTCDate(),Q,2)}function We(B,Q){return Mc(B.getUTCHours(),Q,2)}function He(B,Q){return Mc(B.getUTCHours()%12||12,Q,2)}function De(B,Q){return Mc(1+gc.count(Zc(B),B),Q,3)}function fe(B,Q){return Mc(B.getUTCMilliseconds(),Q,3)}function Ye(B,Q){return fe(B,Q)+"000"}function we(B,Q){return Mc(B.getUTCMonth()+1,Q,2)}function ve(B,Q){return Mc(B.getUTCMinutes(),Q,2)}function Je(B,Q){return Mc(B.getUTCSeconds(),Q,2)}function ke(B){var Q=B.getUTCDay();return 0===Q?7:Q}function Me(B,Q){return Mc(uc.count(Zc(B)-1,B),Q,2)}function Te(B){var Q=B.getUTCDay();return Q>=4||0===Q?Ac(B):Ac.ceil(B)}function ze(B,Q){return B=Te(B),Mc(Ac.count(Zc(B),B)+(4===Zc(B).getUTCDay()),Q,2)}function Ke(B){return B.getUTCDay()}function Oe(B,Q){return Mc(Gc.count(Zc(B)-1,B),Q,2)}function je(B,Q){return Mc(B.getUTCFullYear()%100,Q,2)}function Pe(B,Q){return Mc((B=Te(B)).getUTCFullYear()%100,Q,2)}function _e(B,Q){return Mc(B.getUTCFullYear()%1e4,Q,4)}function $e(B,Q){var F=B.getUTCDay();return Mc((B=F>=4||0===F?Ac(B):Ac.ceil(B)).getUTCFullYear()%1e4,Q,4)}function qe(){return"+0000"}function Bn(){return"%"}function Qn(B){return+B}function Fn(B){return Math.floor(+B/1e3)}function Un(B){return new Date(B)}function tn(B){return B instanceof Date?+B:+new Date(+B)}function sn(B,Q,F,U,t,s,I,g,i,l){var c=Gl(),e=c.invert,n=c.domain,d=l(".%L"),C=l(":%S"),a=l("%I:%M"),b=l("%I %p"),o=l("%a %d"),u=l("%b %d"),G=l("%B"),r=l("%Y");function x(B){return(i(B)<B?d:g(B)<B?C:I(B)<B?a:s(B)<B?b:U(B)<B?t(B)<B?o:u:F(B)<B?G:r)(B)}return c.invert=function(B){return new Date(e(B))},c.domain=function(B){return arguments.length?n(Array.from(B,tn)):n().map(Un)},c.ticks=function(Q){var F=n();return B(F[0],F[F.length-1],null==Q?10:Q)},c.tickFormat=function(B,Q){return null==Q?x:l(Q)},c.nice=function(B){var F=n();return B&&"function"==typeof B.range||(B=Q(F[0],F[F.length-1],null==B?10:B)),B?n(hl(F,B)):c},c.copy=function(){return ol(c,sn(B,Q,F,U,t,s,I,g,i,l))},c}function In(B,Q){return Q.domain(B.domain()).interpolator(B.interpolator()).clamp(B.clamp()).unknown(B.unknown())}function gn(){var B,Q,F,U,t,s,I,g=0,i=.5,l=1,c=1,e=dl,n=!1;function d(B){return isNaN(B=+B)?I:(B=.5+((B=+s(B))-Q)*(c*B<c*Q?U:t),e(n?Math.max(0,Math.min(1,B)):B))}function C(B){return function(Q){var F,U,t;return arguments.length?([F,U,t]=Q,e=ft(B,[F,U,t]),d):[e(0),e(.5),e(1)]}}return d.domain=function(I){return arguments.length?([g,i,l]=I,B=s(g=+g),Q=s(i=+i),F=s(l=+l),U=B===Q?0:.5/(Q-B),t=Q===F?0:.5/(F-Q),c=Q<B?-1:1,d):[g,i,l]},d.clamp=function(B){return arguments.length?(n=!!B,d):n},d.interpolator=function(B){return arguments.length?(e=B,d):e},d.range=C(Rt),d.rangeRound=C(yt),d.unknown=function(B){return arguments.length?(I=B,d):I},function(I){return s=I,B=I(g),Q=I(i),F=I(l),U=B===Q?0:.5/(Q-B),t=Q===F?0:.5/(F-Q),c=Q<B?-1:1,d}}function ln(){var B=xl(gn()(dl));return B.copy=function(){return In(B,ln())},sl.apply(B,arguments)}function cn(){var B=El(gn()).domain([.1,1,10]);return B.copy=function(){return In(B,cn()).base(B.base())},sl.apply(B,arguments)}function en(){var B=Wl(gn());return B.copy=function(){return In(B,en()).constant(B.constant())},sl.apply(B,arguments)}function nn(){var B=wl(gn());return B.copy=function(){return In(B,nn()).exponent(B.exponent())},sl.apply(B,arguments)}function dn(B){for(var Q=B.length/6|0,F=new Array(Q),U=0;U<Q;)F[U]="#"+B.slice(6*U,6*++U);return F}!function(B){Dc=function(B){var Q=B.dateTime,F=B.date,U=B.time,t=B.periods,s=B.days,I=B.shortDays,g=B.months,i=B.shortMonths,l=zc(t),c=Kc(t),e=zc(s),n=Kc(s),d=zc(I),C=Kc(I),a=zc(g),b=Kc(g),o=zc(i),u=Kc(i),G={a:function(B){return I[B.getDay()]},A:function(B){return s[B.getDay()]},b:function(B){return i[B.getMonth()]},B:function(B){return g[B.getMonth()]},c:null,d:Ce,e:Ce,f:Ge,g:me,G:Ne,H:ae,I:be,j:oe,L:ue,m:re,M:xe,p:function(B){return t[+(B.getHours()>=12)]},q:function(B){return 1+~~(B.getMonth()/3)},Q:Qn,s:Fn,S:Ae,u:Le,U:he,V:ye,w:Ve,W:Ze,x:null,X:null,y:Se,Y:Ee,Z:Xe,"%":Bn},r={a:function(B){return I[B.getUTCDay()]},A:function(B){return s[B.getUTCDay()]},b:function(B){return i[B.getUTCMonth()]},B:function(B){return g[B.getUTCMonth()]},c:null,d:pe,e:pe,f:Ye,g:Pe,G:$e,H:We,I:He,j:De,L:fe,m:we,M:ve,p:function(B){return t[+(B.getUTCHours()>=12)]},q:function(B){return 1+~~(B.getUTCMonth()/3)},Q:Qn,s:Fn,S:Je,u:ke,U:Me,V:ze,w:Ke,W:Oe,x:null,X:null,y:je,Y:_e,Z:qe,"%":Bn},x={a:function(B,Q,F){var U=d.exec(Q.slice(F));return U?(B.w=C.get(U[0].toLowerCase()),F+U[0].length):-1},A:function(B,Q,F){var U=e.exec(Q.slice(F));return U?(B.w=n.get(U[0].toLowerCase()),F+U[0].length):-1},b:function(B,Q,F){var U=o.exec(Q.slice(F));return U?(B.m=u.get(U[0].toLowerCase()),F+U[0].length):-1},B:function(B,Q,F){var U=a.exec(Q.slice(F));return U?(B.m=b.get(U[0].toLowerCase()),F+U[0].length):-1},c:function(B,F,U){return h(B,Q,F,U)},d:te,e:te,f:ce,g:Be,G:qc,H:Ie,I:Ie,j:se,L:le,m:Ue,M:ge,p:function(B,Q,F){var U=l.exec(Q.slice(F));return U?(B.p=c.get(U[0].toLowerCase()),F+U[0].length):-1},q:Fe,Q:ne,s:de,S:ie,u:jc,U:Pc,V:_c,w:Oc,W:$c,x:function(B,Q,U){return h(B,F,Q,U)},X:function(B,Q,F){return h(B,U,Q,F)},y:Be,Y:qc,Z:Qe,"%":ee};function A(B,Q){return function(F){var U,t,s,I=[],g=-1,i=0,l=B.length;for(F instanceof Date||(F=new Date(+F));++g<l;)37===B.charCodeAt(g)&&(I.push(B.slice(i,g)),null!=(t=wc[U=B.charAt(++g)])?U=B.charAt(++g):t="e"===U?" ":"0",(s=Q[U])&&(U=s(F,t)),I.push(U),i=g+1);return I.push(B.slice(i,g)),I.join("")}}function L(B,Q){return function(F){var U,t,s=Hc(1900,void 0,1);if(h(s,B,F+="",0)!=F.length)return null;if("Q"in s)return new Date(s.Q);if("s"in s)return new Date(1e3*s.s+("L"in s?s.L:0));if(Q&&!("Z"in s)&&(s.Z=0),"p"in s&&(s.H=s.H%12+12*s.p),void 0===s.m&&(s.m="q"in s?s.q:0),"V"in s){if(s.V<1||s.V>53)return null;"w"in s||(s.w=1),"Z"in s?(t=(U=Wc(Hc(s.y,0,1))).getUTCDay(),U=t>4||0===t?Gc.ceil(U):Gc(U),U=gc.offset(U,7*(s.V-1)),s.y=U.getUTCFullYear(),s.m=U.getUTCMonth(),s.d=U.getUTCDate()+(s.w+6)%7):(t=(U=pc(Hc(s.y,0,1))).getDay(),U=t>4||0===t?ec.ceil(U):ec(U),U=Ic.offset(U,7*(s.V-1)),s.y=U.getFullYear(),s.m=U.getMonth(),s.d=U.getDate()+(s.w+6)%7)}else("W"in s||"U"in s)&&("w"in s||(s.w="u"in s?s.u%7:"W"in s?1:0),t="Z"in s?Wc(Hc(s.y,0,1)).getUTCDay():pc(Hc(s.y,0,1)).getDay(),s.m=0,s.d="W"in s?(s.w+6)%7+7*s.W-(t+5)%7:s.w+7*s.U-(t+6)%7);return"Z"in s?(s.H+=s.Z/100|0,s.M+=s.Z%100,Wc(s)):pc(s)}}function h(B,Q,F,U){for(var t,s,I=0,g=Q.length,i=F.length;I<g;){if(U>=i)return-1;if(37===(t=Q.charCodeAt(I++))){if(t=Q.charAt(I++),!(s=x[t in wc?Q.charAt(I++):t])||(U=s(B,F,U))<0)return-1}else if(t!=F.charCodeAt(U++))return-1}return U}return G.x=A(F,G),G.X=A(U,G),G.c=A(Q,G),r.x=A(F,r),r.X=A(U,r),r.c=A(Q,r),{format:function(B){var Q=A(B+="",G);return Q.toString=function(){return B},Q},parse:function(B){var Q=L(B+="",!1);return Q.toString=function(){return B},Q},utcFormat:function(B){var Q=A(B+="",r);return Q.toString=function(){return B},Q},utcParse:function(B){var Q=L(B+="",!0);return Q.toString=function(){return B},Q}}}(B),fc=Dc.format,Dc.parse,Yc=Dc.utcFormat,Dc.utcParse}({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});var Cn=dn("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"),an=dn("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666"),bn=dn("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666"),on=dn("4269d0efb118ff725c6cc5b03ca951ff8ab7a463f297bbf59c6b4e9498a0"),un=dn("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928"),Gn=dn("fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2"),rn=dn("b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc"),xn=dn("e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999"),An=dn("66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3"),Ln=dn("8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f"),hn=dn("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab"),Rn=B=>bt(B[B.length-1]),yn=new Array(3).concat("d8b365f5f5f55ab4ac","a6611adfc27d80cdc1018571","a6611adfc27df5f5f580cdc1018571","8c510ad8b365f6e8c3c7eae55ab4ac01665e","8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e","8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e","8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e","5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30","5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30").map(dn),Vn=Rn(yn),Zn=new Array(3).concat("af8dc3f7f7f77fbf7b","7b3294c2a5cfa6dba0008837","7b3294c2a5cff7f7f7a6dba0008837","762a83af8dc3e7d4e8d9f0d37fbf7b1b7837","762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837","762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837","762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837","40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b","40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b").map(dn),Sn=Rn(Zn),mn=new Array(3).concat("e9a3c9f7f7f7a1d76a","d01c8bf1b6dab8e1864dac26","d01c8bf1b6daf7f7f7b8e1864dac26","c51b7de9a3c9fde0efe6f5d0a1d76a4d9221","c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221","c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221","c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221","8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419","8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419").map(dn),En=Rn(mn),Nn=new Array(3).concat("998ec3f7f7f7f1a340","5e3c99b2abd2fdb863e66101","5e3c99b2abd2f7f7f7fdb863e66101","542788998ec3d8daebfee0b6f1a340b35806","542788998ec3d8daebf7f7f7fee0b6f1a340b35806","5427888073acb2abd2d8daebfee0b6fdb863e08214b35806","5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806","2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08","2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08").map(dn),Xn=Rn(Nn),pn=new Array(3).concat("ef8a62f7f7f767a9cf","ca0020f4a58292c5de0571b0","ca0020f4a582f7f7f792c5de0571b0","b2182bef8a62fddbc7d1e5f067a9cf2166ac","b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac","b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac","b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac","67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061","67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061").map(dn),Wn=Rn(pn),Hn=new Array(3).concat("ef8a62ffffff999999","ca0020f4a582bababa404040","ca0020f4a582ffffffbababa404040","b2182bef8a62fddbc7e0e0e09999994d4d4d","b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d","b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d","b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d","67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a","67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a").map(dn),Dn=Rn(Hn),fn=new Array(3).concat("fc8d59ffffbf91bfdb","d7191cfdae61abd9e92c7bb6","d7191cfdae61ffffbfabd9e92c7bb6","d73027fc8d59fee090e0f3f891bfdb4575b4","d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4","d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4","d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4","a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695","a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695").map(dn),Yn=Rn(fn),wn=new Array(3).concat("fc8d59ffffbf91cf60","d7191cfdae61a6d96a1a9641","d7191cfdae61ffffbfa6d96a1a9641","d73027fc8d59fee08bd9ef8b91cf601a9850","d73027fc8d59fee08bffffbfd9ef8b91cf601a9850","d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850","d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850","a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837","a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837").map(dn),vn=Rn(wn),Jn=new Array(3).concat("fc8d59ffffbf99d594","d7191cfdae61abdda42b83ba","d7191cfdae61ffffbfabdda42b83ba","d53e4ffc8d59fee08be6f59899d5943288bd","d53e4ffc8d59fee08bffffbfe6f59899d5943288bd","d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd","d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd","9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2","9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2").map(dn),kn=Rn(Jn),Mn=new Array(3).concat("e5f5f999d8c92ca25f","edf8fbb2e2e266c2a4238b45","edf8fbb2e2e266c2a42ca25f006d2c","edf8fbccece699d8c966c2a42ca25f006d2c","edf8fbccece699d8c966c2a441ae76238b45005824","f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824","f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b").map(dn),Tn=Rn(Mn),zn=new Array(3).concat("e0ecf49ebcda8856a7","edf8fbb3cde38c96c688419d","edf8fbb3cde38c96c68856a7810f7c","edf8fbbfd3e69ebcda8c96c68856a7810f7c","edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b","f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b","f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b").map(dn),Kn=Rn(zn),On=new Array(3).concat("e0f3dba8ddb543a2ca","f0f9e8bae4bc7bccc42b8cbe","f0f9e8bae4bc7bccc443a2ca0868ac","f0f9e8ccebc5a8ddb57bccc443a2ca0868ac","f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e","f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e","f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081").map(dn),jn=Rn(On),Pn=new Array(3).concat("fee8c8fdbb84e34a33","fef0d9fdcc8afc8d59d7301f","fef0d9fdcc8afc8d59e34a33b30000","fef0d9fdd49efdbb84fc8d59e34a33b30000","fef0d9fdd49efdbb84fc8d59ef6548d7301f990000","fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000","fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000").map(dn),_n=Rn(Pn),$n=new Array(3).concat("ece2f0a6bddb1c9099","f6eff7bdc9e167a9cf02818a","f6eff7bdc9e167a9cf1c9099016c59","f6eff7d0d1e6a6bddb67a9cf1c9099016c59","f6eff7d0d1e6a6bddb67a9cf3690c002818a016450","fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450","fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636").map(dn),qn=Rn($n),Bd=new Array(3).concat("ece7f2a6bddb2b8cbe","f1eef6bdc9e174a9cf0570b0","f1eef6bdc9e174a9cf2b8cbe045a8d","f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d","f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b","fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b","fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858").map(dn),Qd=Rn(Bd),Fd=new Array(3).concat("e7e1efc994c7dd1c77","f1eef6d7b5d8df65b0ce1256","f1eef6d7b5d8df65b0dd1c77980043","f1eef6d4b9dac994c7df65b0dd1c77980043","f1eef6d4b9dac994c7df65b0e7298ace125691003f","f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f","f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f").map(dn),Ud=Rn(Fd),td=new Array(3).concat("fde0ddfa9fb5c51b8a","feebe2fbb4b9f768a1ae017e","feebe2fbb4b9f768a1c51b8a7a0177","feebe2fcc5c0fa9fb5f768a1c51b8a7a0177","feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177","fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177","fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a").map(dn),sd=Rn(td),Id=new Array(3).concat("edf8b17fcdbb2c7fb8","ffffcca1dab441b6c4225ea8","ffffcca1dab441b6c42c7fb8253494","ffffccc7e9b47fcdbb41b6c42c7fb8253494","ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84","ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84","ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58").map(dn),gd=Rn(Id),id=new Array(3).concat("f7fcb9addd8e31a354","ffffccc2e69978c679238443","ffffccc2e69978c67931a354006837","ffffccd9f0a3addd8e78c67931a354006837","ffffccd9f0a3addd8e78c67941ab5d238443005a32","ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32","ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529").map(dn),ld=Rn(id),cd=new Array(3).concat("fff7bcfec44fd95f0e","ffffd4fed98efe9929cc4c02","ffffd4fed98efe9929d95f0e993404","ffffd4fee391fec44ffe9929d95f0e993404","ffffd4fee391fec44ffe9929ec7014cc4c028c2d04","ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04","ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506").map(dn),ed=Rn(cd),nd=new Array(3).concat("ffeda0feb24cf03b20","ffffb2fecc5cfd8d3ce31a1c","ffffb2fecc5cfd8d3cf03b20bd0026","ffffb2fed976feb24cfd8d3cf03b20bd0026","ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026","ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026","ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026").map(dn),dd=Rn(nd),Cd=new Array(3).concat("deebf79ecae13182bd","eff3ffbdd7e76baed62171b5","eff3ffbdd7e76baed63182bd08519c","eff3ffc6dbef9ecae16baed63182bd08519c","eff3ffc6dbef9ecae16baed64292c62171b5084594","f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594","f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b").map(dn),ad=Rn(Cd),bd=new Array(3).concat("e5f5e0a1d99b31a354","edf8e9bae4b374c476238b45","edf8e9bae4b374c47631a354006d2c","edf8e9c7e9c0a1d99b74c47631a354006d2c","edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32","f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32","f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b").map(dn),od=Rn(bd),ud=new Array(3).concat("f0f0f0bdbdbd636363","f7f7f7cccccc969696525252","f7f7f7cccccc969696636363252525","f7f7f7d9d9d9bdbdbd969696636363252525","f7f7f7d9d9d9bdbdbd969696737373525252252525","fffffff0f0f0d9d9d9bdbdbd969696737373525252252525","fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000").map(dn),Gd=Rn(ud),rd=new Array(3).concat("efedf5bcbddc756bb1","f2f0f7cbc9e29e9ac86a51a3","f2f0f7cbc9e29e9ac8756bb154278f","f2f0f7dadaebbcbddc9e9ac8756bb154278f","f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486","fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486","fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d").map(dn),xd=Rn(rd),Ad=new Array(3).concat("fee0d2fc9272de2d26","fee5d9fcae91fb6a4acb181d","fee5d9fcae91fb6a4ade2d26a50f15","fee5d9fcbba1fc9272fb6a4ade2d26a50f15","fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d","fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d","fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d").map(dn),Ld=Rn(Ad),hd=new Array(3).concat("fee6cefdae6be6550d","feeddefdbe85fd8d3cd94701","feeddefdbe85fd8d3ce6550da63603","feeddefdd0a2fdae6bfd8d3ce6550da63603","feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04","fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04","fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704").map(dn),Rd=Rn(hd);function yd(B){return B=Math.max(0,Math.min(1,B)),"rgb("+Math.max(0,Math.min(255,Math.round(-4.54-B*(35.34-B*(2381.73-B*(6402.7-B*(7024.72-2710.57*B)))))))+", "+Math.max(0,Math.min(255,Math.round(32.49+B*(170.73+B*(52.82-B*(131.46-B*(176.58-67.37*B)))))))+", "+Math.max(0,Math.min(255,Math.round(81.24+B*(442.36-B*(2482.43-B*(6167.24-B*(6614.94-2475.67*B)))))))+")"}var Vd=Dt(It(300,.5,0),It(-240,.5,1)),Zd=Dt(It(-100,.75,.35),It(80,1.5,.8)),Sd=Dt(It(260,.75,.35),It(80,1.5,.8)),md=It();function Ed(B){(B<0||B>1)&&(B-=Math.floor(B));var Q=Math.abs(B-.5);return md.h=360*B-100,md.s=1.5-1.5*Q,md.l=.8-.9*Q,md+""}var Nd=rU(),Xd=Math.PI/3,pd=2*Math.PI/3;function Wd(B){var Q;return B=(.5-B)*Math.PI,Nd.r=255*(Q=Math.sin(B))*Q,Nd.g=255*(Q=Math.sin(B+Xd))*Q,Nd.b=255*(Q=Math.sin(B+pd))*Q,Nd+""}function Hd(B){return B=Math.max(0,Math.min(1,B)),"rgb("+Math.max(0,Math.min(255,Math.round(34.61+B*(1172.33-B*(10793.56-B*(33300.12-B*(38394.49-14825.05*B)))))))+", "+Math.max(0,Math.min(255,Math.round(23.31+B*(557.33+B*(1225.33-B*(3574.96-B*(1073.77+707.56*B)))))))+", "+Math.max(0,Math.min(255,Math.round(27.2+B*(3211.1-B*(15327.97-B*(27814-B*(22569.18-6838.66*B)))))))+")"}function Dd(B){var Q=B.length;return function(F){return B[Math.max(0,Math.min(Q-1,Math.floor(F*Q)))]}}var fd=Dd(dn("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")),Yd=Dd(dn("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")),wd=Dd(dn("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")),vd=Dd(dn("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));function Jd(B){return function(){return B}}const kd=Math.cos,Md=Math.min,Td=Math.sin,zd=Math.sqrt,Kd=Math.PI,Od=2*Kd;function jd(B){this._context=B}function Pd(B){return new jd(B)}function _d(B){return B[0]}function $d(B){return B[1]}function qd(B,Q){var F=Jd(!0),U=null,t=Pd,s=null,I=function(B){let Q=3;return B.digits=function(F){if(!arguments.length)return Q;if(null==F)Q=null;else{const B=Math.floor(F);if(!(B>=0))throw new RangeError(`invalid digits: ${F}`);Q=B}return B},()=>new vs(Q)}(g);function g(g){var i,l,c,e=(g=function(B){return"object"==typeof B&&"length"in B?B:Array.from(B)}(g)).length,n=!1;for(null==U&&(s=t(c=I())),i=0;i<=e;++i)!(i<e&&F(l=g[i],i,g))===n&&((n=!n)?s.lineStart():s.lineEnd()),n&&s.point(+B(l,i,g),+Q(l,i,g));if(c)return s=null,c+""||null}return B="function"==typeof B?B:void 0===B?_d:Jd(B),Q="function"==typeof Q?Q:void 0===Q?$d:Jd(Q),g.x=function(Q){return arguments.length?(B="function"==typeof Q?Q:Jd(+Q),g):B},g.y=function(B){return arguments.length?(Q="function"==typeof B?B:Jd(+B),g):Q},g.defined=function(B){return arguments.length?(F="function"==typeof B?B:Jd(!!B),g):F},g.curve=function(B){return arguments.length?(t=B,null!=U&&(s=t(U)),g):t},g.context=function(B){return arguments.length?(null==B?U=s=null:s=t(U=B),g):U},g}jd.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(B,Q){switch(B=+B,Q=+Q,this._point){case 0:this._point=1,this._line?this._context.lineTo(B,Q):this._context.moveTo(B,Q);break;case 1:this._point=2;default:this._context.lineTo(B,Q)}}};class BC{constructor(B,Q){this._context=B,this._x=Q}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line}point(B,Q){switch(B=+B,Q=+Q,this._point){case 0:this._point=1,this._line?this._context.lineTo(B,Q):this._context.moveTo(B,Q);break;case 1:this._point=2;default:this._x?this._context.bezierCurveTo(this._x0=(this._x0+B)/2,this._y0,this._x0,Q,B,Q):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+Q)/2,B,this._y0,B,Q)}this._x0=B,this._y0=Q}}const QC=zd(3);var FC={draw(B,Q){const F=.59436*zd(Q+Md(Q/28,.75)),U=F/2,t=U*QC;B.moveTo(0,F),B.lineTo(0,-F),B.moveTo(-t,-U),B.lineTo(t,U),B.moveTo(-t,U),B.lineTo(t,-U)}},UC={draw(B,Q){const F=zd(Q/Kd);B.moveTo(F,0),B.arc(0,0,F,0,Od)}},tC={draw(B,Q){const F=zd(Q/5)/2;B.moveTo(-3*F,-F),B.lineTo(-F,-F),B.lineTo(-F,-3*F),B.lineTo(F,-3*F),B.lineTo(F,-F),B.lineTo(3*F,-F),B.lineTo(3*F,F),B.lineTo(F,F),B.lineTo(F,3*F),B.lineTo(-F,3*F),B.lineTo(-F,F),B.lineTo(-3*F,F),B.closePath()}};const sC=zd(1/3),IC=2*sC;var gC={draw(B,Q){const F=zd(Q/IC),U=F*sC;B.moveTo(0,-F),B.lineTo(U,0),B.lineTo(0,F),B.lineTo(-U,0),B.closePath()}},iC={draw(B,Q){const F=.62625*zd(Q);B.moveTo(0,-F),B.lineTo(F,0),B.lineTo(0,F),B.lineTo(-F,0),B.closePath()}},lC={draw(B,Q){const F=.87559*zd(Q-Md(Q/7,2));B.moveTo(-F,0),B.lineTo(F,0),B.moveTo(0,F),B.lineTo(0,-F)}},cC={draw(B,Q){const F=zd(Q),U=-F/2;B.rect(U,U,F,F)}},eC={draw(B,Q){const F=.4431*zd(Q);B.moveTo(F,F),B.lineTo(F,-F),B.lineTo(-F,-F),B.lineTo(-F,F),B.closePath()}};const nC=Td(Kd/10)/Td(7*Kd/10),dC=Td(Od/10)*nC,CC=-kd(Od/10)*nC;var aC={draw(B,Q){const F=zd(.8908130915292852*Q),U=dC*F,t=CC*F;B.moveTo(0,-F),B.lineTo(U,t);for(let Q=1;Q<5;++Q){const s=Od*Q/5,I=kd(s),g=Td(s);B.lineTo(g*F,-I*F),B.lineTo(I*U-g*t,g*U+I*t)}B.closePath()}};const bC=zd(3);var oC={draw(B,Q){const F=-zd(Q/(3*bC));B.moveTo(0,2*F),B.lineTo(-bC*F,-F),B.lineTo(bC*F,-F),B.closePath()}};const uC=zd(3);var GC={draw(B,Q){const F=.6824*zd(Q),U=F/2,t=F*uC/2;B.moveTo(0,-F),B.lineTo(t,U),B.lineTo(-t,U),B.closePath()}};const rC=-.5,xC=zd(3)/2,AC=1/zd(12),LC=3*(AC/2+1);var hC={draw(B,Q){const F=zd(Q/LC),U=F/2,t=F*AC,s=U,I=F*AC+F,g=-s,i=I;B.moveTo(U,t),B.lineTo(s,I),B.lineTo(g,i),B.lineTo(rC*U-xC*t,xC*U+rC*t),B.lineTo(rC*s-xC*I,xC*s+rC*I),B.lineTo(rC*g-xC*i,xC*g+rC*i),B.lineTo(rC*U+xC*t,rC*t-xC*U),B.lineTo(rC*s+xC*I,rC*I-xC*s),B.lineTo(rC*g+xC*i,rC*i-xC*g),B.closePath()}},RC={draw(B,Q){const F=.6189*zd(Q-Md(Q/6,1.7));B.moveTo(-F,-F),B.lineTo(F,F),B.moveTo(-F,F),B.lineTo(F,-F)}};const yC=[UC,tC,gC,cC,aC,oC,hC],VC=[UC,lC,RC,GC,FC,eC,iC];function ZC(){}function SC(B,Q,F){B._context.bezierCurveTo((2*B._x0+B._x1)/3,(2*B._y0+B._y1)/3,(B._x0+2*B._x1)/3,(B._y0+2*B._y1)/3,(B._x0+4*B._x1+Q)/6,(B._y0+4*B._y1+F)/6)}function mC(B){this._context=B}function EC(B){this._context=B}function NC(B){this._context=B}function XC(B,Q){this._basis=new mC(B),this._beta=Q}mC.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:SC(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(B,Q){switch(B=+B,Q=+Q,this._point){case 0:this._point=1,this._line?this._context.lineTo(B,Q):this._context.moveTo(B,Q);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:SC(this,B,Q)}this._x0=this._x1,this._x1=B,this._y0=this._y1,this._y1=Q}},EC.prototype={areaStart:ZC,areaEnd:ZC,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x2,this._y2),this._context.closePath();break;case 2:this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break;case 3:this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4)}},point:function(B,Q){switch(B=+B,Q=+Q,this._point){case 0:this._point=1,this._x2=B,this._y2=Q;break;case 1:this._point=2,this._x3=B,this._y3=Q;break;case 2:this._point=3,this._x4=B,this._y4=Q,this._context.moveTo((this._x0+4*this._x1+B)/6,(this._y0+4*this._y1+Q)/6);break;default:SC(this,B,Q)}this._x0=this._x1,this._x1=B,this._y0=this._y1,this._y1=Q}},NC.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(B,Q){switch(B=+B,Q=+Q,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var F=(this._x0+4*this._x1+B)/6,U=(this._y0+4*this._y1+Q)/6;this._line?this._context.lineTo(F,U):this._context.moveTo(F,U);break;case 3:this._point=4;default:SC(this,B,Q)}this._x0=this._x1,this._x1=B,this._y0=this._y1,this._y1=Q}},XC.prototype={lineStart:function(){this._x=[],this._y=[],this._basis.lineStart()},lineEnd:function(){var B=this._x,Q=this._y,F=B.length-1;if(F>0)for(var U,t=B[0],s=Q[0],I=B[F]-t,g=Q[F]-s,i=-1;++i<=F;)U=i/F,this._basis.point(this._beta*B[i]+(1-this._beta)*(t+U*I),this._beta*Q[i]+(1-this._beta)*(s+U*g));this._x=this._y=null,this._basis.lineEnd()},point:function(B,Q){this._x.push(+B),this._y.push(+Q)}};var pC=function B(Q){function F(B){return 1===Q?new mC(B):new XC(B,Q)}return F.beta=function(Q){return B(+Q)},F}(.85);function WC(B,Q,F){B._context.bezierCurveTo(B._x1+B._k*(B._x2-B._x0),B._y1+B._k*(B._y2-B._y0),B._x2+B._k*(B._x1-Q),B._y2+B._k*(B._y1-F),B._x2,B._y2)}function HC(B,Q){this._context=B,this._k=(1-Q)/6}HC.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:WC(this,this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(B,Q){switch(B=+B,Q=+Q,this._point){case 0:this._point=1,this._line?this._context.lineTo(B,Q):this._context.moveTo(B,Q);break;case 1:this._point=2,this._x1=B,this._y1=Q;break;case 2:this._point=3;default:WC(this,B,Q)}this._x0=this._x1,this._x1=this._x2,this._x2=B,this._y0=this._y1,this._y1=this._y2,this._y2=Q}};var DC=function B(Q){function F(B){return new HC(B,Q)}return F.tension=function(Q){return B(+Q)},F}(0);function fC(B,Q){this._context=B,this._k=(1-Q)/6}fC.prototype={areaStart:ZC,areaEnd:ZC,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(B,Q){switch(B=+B,Q=+Q,this._point){case 0:this._point=1,this._x3=B,this._y3=Q;break;case 1:this._point=2,this._context.moveTo(this._x4=B,this._y4=Q);break;case 2:this._point=3,this._x5=B,this._y5=Q;break;default:WC(this,B,Q)}this._x0=this._x1,this._x1=this._x2,this._x2=B,this._y0=this._y1,this._y1=this._y2,this._y2=Q}};var YC=function B(Q){function F(B){return new fC(B,Q)}return F.tension=function(Q){return B(+Q)},F}(0);function wC(B,Q){this._context=B,this._k=(1-Q)/6}wC.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(B,Q){switch(B=+B,Q=+Q,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:WC(this,B,Q)}this._x0=this._x1,this._x1=this._x2,this._x2=B,this._y0=this._y1,this._y1=this._y2,this._y2=Q}};var vC=function B(Q){function F(B){return new wC(B,Q)}return F.tension=function(Q){return B(+Q)},F}(0);function JC(B,Q,F){var U=B._x1,t=B._y1,s=B._x2,I=B._y2;if(B._l01_a>1e-12){var g=2*B._l01_2a+3*B._l01_a*B._l12_a+B._l12_2a,i=3*B._l01_a*(B._l01_a+B._l12_a);U=(U*g-B._x0*B._l12_2a+B._x2*B._l01_2a)/i,t=(t*g-B._y0*B._l12_2a+B._y2*B._l01_2a)/i}if(B._l23_a>1e-12){var l=2*B._l23_2a+3*B._l23_a*B._l12_a+B._l12_2a,c=3*B._l23_a*(B._l23_a+B._l12_a);s=(s*l+B._x1*B._l23_2a-Q*B._l12_2a)/c,I=(I*l+B._y1*B._l23_2a-F*B._l12_2a)/c}B._context.bezierCurveTo(U,t,s,I,B._x2,B._y2)}function kC(B,Q){this._context=B,this._alpha=Q}kC.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(B,Q){if(B=+B,Q=+Q,this._point){var F=this._x2-B,U=this._y2-Q;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(F*F+U*U,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(B,Q):this._context.moveTo(B,Q);break;case 1:this._point=2;break;case 2:this._point=3;default:JC(this,B,Q)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=B,this._y0=this._y1,this._y1=this._y2,this._y2=Q}};var MC=function B(Q){function F(B){return Q?new kC(B,Q):new HC(B,0)}return F.alpha=function(Q){return B(+Q)},F}(.5);function TC(B,Q){this._context=B,this._alpha=Q}TC.prototype={areaStart:ZC,areaEnd:ZC,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(B,Q){if(B=+B,Q=+Q,this._point){var F=this._x2-B,U=this._y2-Q;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(F*F+U*U,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=B,this._y3=Q;break;case 1:this._point=2,this._context.moveTo(this._x4=B,this._y4=Q);break;case 2:this._point=3,this._x5=B,this._y5=Q;break;default:JC(this,B,Q)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=B,this._y0=this._y1,this._y1=this._y2,this._y2=Q}};var zC=function B(Q){function F(B){return Q?new TC(B,Q):new fC(B,0)}return F.alpha=function(Q){return B(+Q)},F}(.5);function KC(B,Q){this._context=B,this._alpha=Q}KC.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(B,Q){if(B=+B,Q=+Q,this._point){var F=this._x2-B,U=this._y2-Q;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(F*F+U*U,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:JC(this,B,Q)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=B,this._y0=this._y1,this._y1=this._y2,this._y2=Q}};var OC=function B(Q){function F(B){return Q?new KC(B,Q):new wC(B,0)}return F.alpha=function(Q){return B(+Q)},F}(.5);function jC(B){this._context=B}function PC(B){return B<0?-1:1}function _C(B,Q,F){var U=B._x1-B._x0,t=Q-B._x1,s=(B._y1-B._y0)/(U||t<0&&-0),I=(F-B._y1)/(t||U<0&&-0),g=(s*t+I*U)/(U+t);return(PC(s)+PC(I))*Math.min(Math.abs(s),Math.abs(I),.5*Math.abs(g))||0}function $C(B,Q){var F=B._x1-B._x0;return F?(3*(B._y1-B._y0)/F-Q)/2:Q}function qC(B,Q,F){var U=B._x0,t=B._y0,s=B._x1,I=B._y1,g=(s-U)/3;B._context.bezierCurveTo(U+g,t+g*Q,s-g,I-g*F,s,I)}function Ba(B){this._context=B}function Qa(B){this._context=new Fa(B)}function Fa(B){this._context=B}function Ua(B){this._context=B}function ta(B){var Q,F,U=B.length-1,t=new Array(U),s=new Array(U),I=new Array(U);for(t[0]=0,s[0]=2,I[0]=B[0]+2*B[1],Q=1;Q<U-1;++Q)t[Q]=1,s[Q]=4,I[Q]=4*B[Q]+2*B[Q+1];for(t[U-1]=2,s[U-1]=7,I[U-1]=8*B[U-1]+B[U],Q=1;Q<U;++Q)F=t[Q]/s[Q-1],s[Q]-=F,I[Q]-=F*I[Q-1];for(t[U-1]=I[U-1]/s[U-1],Q=U-2;Q>=0;--Q)t[Q]=(I[Q]-t[Q+1])/s[Q];for(s[U-1]=(B[U]+t[U-1])/2,Q=0;Q<U-1;++Q)s[Q]=2*B[Q+1]-t[Q+1];return[t,s]}function sa(B,Q){this._context=B,this._t=Q}function Ia(B,Q,F){this.k=B,this.x=Q,this.y=F}jC.prototype={areaStart:ZC,areaEnd:ZC,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(B,Q){B=+B,Q=+Q,this._point?this._context.lineTo(B,Q):(this._point=1,this._context.moveTo(B,Q))}},Ba.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:qC(this,this._t0,$C(this,this._t0))}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(B,Q){var F=NaN;if(Q=+Q,(B=+B)!==this._x1||Q!==this._y1){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(B,Q):this._context.moveTo(B,Q);break;case 1:this._point=2;break;case 2:this._point=3,qC(this,$C(this,F=_C(this,B,Q)),F);break;default:qC(this,this._t0,F=_C(this,B,Q))}this._x0=this._x1,this._x1=B,this._y0=this._y1,this._y1=Q,this._t0=F}}},(Qa.prototype=Object.create(Ba.prototype)).point=function(B,Q){Ba.prototype.point.call(this,Q,B)},Fa.prototype={moveTo:function(B,Q){this._context.moveTo(Q,B)},closePath:function(){this._context.closePath()},lineTo:function(B,Q){this._context.lineTo(Q,B)},bezierCurveTo:function(B,Q,F,U,t,s){this._context.bezierCurveTo(Q,B,U,F,s,t)}},Ua.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var B=this._x,Q=this._y,F=B.length;if(F)if(this._line?this._context.lineTo(B[0],Q[0]):this._context.moveTo(B[0],Q[0]),2===F)this._context.lineTo(B[1],Q[1]);else for(var U=ta(B),t=ta(Q),s=0,I=1;I<F;++s,++I)this._context.bezierCurveTo(U[0][s],t[0][s],U[1][s],t[1][s],B[I],Q[I]);(this._line||0!==this._line&&1===F)&&this._context.closePath(),this._line=1-this._line,this._x=this._y=null},point:function(B,Q){this._x.push(+B),this._y.push(+Q)}},sa.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=this._y=NaN,this._point=0},lineEnd:function(){0<this._t&&this._t<1&&2===this._point&&this._context.lineTo(this._x,this._y),(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line>=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(B,Q){switch(B=+B,Q=+Q,this._point){case 0:this._point=1,this._line?this._context.lineTo(B,Q):this._context.moveTo(B,Q);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,Q),this._context.lineTo(B,Q);else{var F=this._x*(1-this._t)+B*this._t;this._context.lineTo(F,this._y),this._context.lineTo(F,Q)}}this._x=B,this._y=Q}},Ia.prototype={constructor:Ia,scale:function(B){return 1===B?this:new Ia(this.k*B,this.x,this.y)},translate:function(B,Q){return 0===B&0===Q?this:new Ia(this.k,this.x+this.k*B,this.y+this.k*Q)},apply:function(B){return[B[0]*this.k+this.x,B[1]*this.k+this.y]},applyX:function(B){return B*this.k+this.x},applyY:function(B){return B*this.k+this.y},invert:function(B){return[(B[0]-this.x)/this.k,(B[1]-this.y)/this.k]},invertX:function(B){return(B-this.x)/this.k},invertY:function(B){return(B-this.y)/this.k},rescaleX:function(B){return B.copy().domain(B.range().map(this.invertX,this).map(B.invert,B))},rescaleY:function(B){return B.copy().domain(B.range().map(this.invertY,this).map(B.invert,B))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}},Ia.prototype;class ga extends iB{getComputedStyleValue(B){return getComputedStyle(this).getPropertyValue(B).trim()}firstUpdated(B){super.firstUpdated(B),YF(this.renderRoot.host).classed("keyboard",!0).on("mousemove.keyboard touchstart.keyboard",B=>{YF(B.currentTarget.renderRoot.host).classed("keyboard",!1).on("mousemove.keyboard touchstart.keyboard",null)}).on("keydown.keyboard",B=>{YF(B.currentTarget.renderRoot.host).classed("keyboard",!0).on("keydown.keyboard mousemove.keyboard touchstart.keyboard",null)})}static get greys(){const B="#999999",Q={white:"#ffffff"};return Q.light75=Ct(B,"#ffffff")(.75),Q.light50=Ct(B,"#ffffff")(.5),Q.light25=Ct(B,"#ffffff")(.25),Q.grey=B,Q.dark25=Ct(B,"#000000")(.25),Q.dark50=Ct(B,"#000000")(.5),Q.dark75=Ct(B,"#000000")(.75),Q.black="#000000",Q}static get shadows(){return{elevations:[0,2,4,8,16],baselineColor:"#000000",baselineColorString:"0, 0, 0",inverseBaselineColor:"#FFFFFF",inverseBaselineColorString:"255, 255, 255",opacityUmbra:.2,opacityPenumbra:.14,opacityAmbient:.12,opacityBoost:.2,mapUmbra:{0:{x:0,y:0,b:0,s:0},2:{x:0,y:3,b:1,s:-2},4:{x:0,y:2,b:4,s:-1},8:{x:0,y:5,b:5,s:-3},16:{x:0,y:8,b:10,s:-5}},mapPenumbra:{0:{x:0,y:0,b:0,s:0},2:{x:0,y:2,b:2,s:0},4:{x:0,y:4,b:5,s:0},8:{x:0,y:8,b:10,s:1},16:{x:0,y:16,b:24,s:2}},mapAmbient:{0:{x:0,y:0,b:0,s:0},2:{x:0,y:1,b:5,s:0},4:{x:0,y:1,b:10,s:0},8:{x:0,y:3,b:14,s:2},16:{x:0,y:6,b:30,s:5}}}}static cssBoxShadow(B,Q=!1,F=!1){const U=this.shadows.opacityUmbra+this.shadows.opacityBoost,t=this.shadows.opacityPenumbra+this.shadows.opacityBoost,s=this.shadows.opacityAmbient+this.shadows.opacityBoost,I=F?`rgba(${this.shadows.inverseBaselineColorString}, ${U})`:`rgba(${this.shadows.baselineColorString}, ${U})`,g=F?`rgba(${this.shadows.inverseBaselineColorString}, ${t})`:`rgba(${this.shadows.baselineColorString}, ${t})`,i=F?`rgba(${this.shadows.inverseBaselineColorString}, ${s})`:`rgba(${this.shadows.baselineColorString}, ${s})`,l=this.shadows.mapUmbra[B],c=this.shadows.mapPenumbra[B],e=this.shadows.mapAmbient[B];return`${Q?`${-l.y}px ${l.y/2}px ${l.b}px ${l.s}px`:`${l.y/2}px ${l.y}px ${l.b}px ${l.s}px`} ${I}, ${Q?`${-c.y}px ${c.y/2}px ${c.b}px ${c.s}px`:`${c.y/2}px ${c.y}px ${c.b}px ${c.s}px`} ${g}, ${Q?`${-e.y}px ${e.y/2}px ${e.b}px ${e.s}px`:`${e.y/2}px ${e.y}px ${e.b}px ${e.s}px`} ${i}`}static get svgDefs(){const B=ga.shadows,Q=B.elevations.map(Q=>`\n <filter id=shadow-${Q} filterUnits="userSpaceOnUse" x="-100%" y="-100%" width="200%" height="200%">\n <feComponentTransfer in="SourceAlpha" result="solid">\n <feFuncA type="table" tableValues="0 1 1"/>\n </feComponentTransfer>\n <feOffset in="solid" result="offU" dx=${B.mapUmbra[Q].y/2} dy=${B.mapUmbra[Q].y} />\n <feOffset in="solid" result="offP" dx=${B.mapPenumbra[Q].y/2} dy=${B.mapPenumbra[Q].y} />\n <feOffset in="solid" result="offA" dx=${B.mapAmbient[Q].y/2} dy=${B.mapAmbient[Q].y} />\n ${0===B.mapUmbra[Q].s?"":`<feMorphology in="offU" result="spreadU" operator=${B.mapUmbra[Q].s>0?"dilate":"erode"} radius=${Math.abs(B.mapUmbra[Q].s)} />`}\n ${0===B.mapPenumbra[Q].s?"":`<feMorphology in="offP" result="spreadP" operator=${B.mapPenumbra[Q].s>0?"dilate":"erode"} radius=${Math.abs(B.mapPenumbra[Q].s)} />`}\n ${0===B.mapAmbient[Q].s?"":`<feMorphology in="offA" result="spreadA" operator=${B.mapAmbient[Q].s>0?"dilate":"erode"} radius=${Math.abs(B.mapAmbient[Q].s)} />`}\n <feGaussianBlur in=${0===B.mapUmbra[Q].s?"offU":"spreadU"} result="blurU" stdDeviation=${B.mapUmbra[Q].b/2} />\n <feGaussianBlur in=${0===B.mapPenumbra[Q].s?"offP":"spreadP"} result="blurP" stdDeviation=${B.mapPenumbra[Q].b/2} />\n <feGaussianBlur in=${0===B.mapAmbient[Q].s?"offA":"spreadA"} result="blurA" stdDeviation=${B.mapAmbient[Q].b/2} />\n <feFlood in="SourceGraphic" result="opU" flood-color=${B.baselineColor} flood-opacity=${B.opacityUmbra+B.opacityBoost} />\n <feFlood in="SourceGraphic" result="opP" flood-color=${B.baselineColor} flood-opacity=${B.opacityPenumbra+B.opacityBoost} />\n <feFlood in="SourceGraphic" result="opA" flood-color=${B.baselineColor} flood-opacity=${B.opacityAmbient+B.opacityBoost} />\n <feComposite in="opU" in2="blurU" result="shU" operator="in" />\n <feComposite in="opP" in2="blurP" result="shP" operator="in" />\n <feComposite in="opA" in2="blurA" result="shA" operator="in" />\n <feMorphology in="solid" result="smaller" operator="erode" radius="1" />\n <feComposite in="shU" in2="smaller" result="finalU" operator="out" />\n <feComposite in="shP" in2="smaller" result="finalP" operator="out" />\n <feComposite in="shA" in2="smaller" result="finalA" operator="out" />\n <feMerge>\n <feMergeNode in="finalU" />\n <feMergeNode in="finalP" />\n <feMergeNode in="finalA" />\n <feMergeNode in="SourceGraphic" />\n </feMerge>\n </filter>`);return`\n <defs>\n ${Q}\n </defs>\n `}static get svgFilters(){const B=ga.shadows,Q=B.elevations.map(Q=>T`
22
+ */let iB=class extends A{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const B=super.createRenderRoot();return this.renderOptions.renderBefore??=B.firstChild,B}update(B){const Q=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(B),this._$Do=((B,Q,F)=>{const U=F?.renderBefore??Q;let t=U._$litPart$;if(void 0===t){const B=F?.renderBefore??null;U._$litPart$=t=new BB(Q.insertBefore(N(),B),B,void 0,F??{})}return t._$AI(B),t})(Q,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return z}};iB._$litElement$=!0,iB.finalized=!0,gB.litElementHydrateSupport?.({LitElement:iB});const lB=gB.litElementPolyfillSupport;function cB(B,Q){return null==B||null==Q?NaN:B<Q?-1:B>Q?1:B>=Q?0:NaN}function eB(B,Q){return null==B||null==Q?NaN:Q<B?-1:Q>B?1:Q>=B?0:NaN}function nB(B){let Q,F,U;function t(B,U,t=0,s=B.length){if(t<s){if(0!==Q(U,U))return s;do{const Q=t+s>>>1;F(B[Q],U)<0?t=Q+1:s=Q}while(t<s)}return t}return 2!==B.length?(Q=cB,F=(Q,F)=>cB(B(Q),F),U=(Q,F)=>B(Q)-F):(Q=B===cB||B===eB?B:dB,F=B,U=B),{left:t,center:function(B,Q,F=0,s=B.length){const I=t(B,Q,F,s-1);return I>F&&U(B[I-1],Q)>-U(B[I],Q)?I-1:I},right:function(B,U,t=0,s=B.length){if(t<s){if(0!==Q(U,U))return s;do{const Q=t+s>>>1;F(B[Q],U)<=0?t=Q+1:s=Q}while(t<s)}return t}}}function dB(){return 0}function CB(B){return null===B?NaN:+B}lB?.({LitElement:iB}),(gB.litElementVersions??=[]).push("4.2.1");const aB=nB(cB).right;function bB(B,Q){let F=0;for(let Q of B)null!=Q&&(Q=+Q)>=Q&&++F;return F}function oB(B){return 0|B.length}function GB(B){return!(B>0)}function uB(B){return"object"!=typeof B||"length"in B?B:Array.from(B)}function rB(B,Q){var F=0;return Float64Array.from(B,B=>F+=+B||0)}function xB(B,Q){let F,U=0,t=0,s=0;if(void 0===Q)for(let Q of B)null!=Q&&(Q=+Q)>=Q&&(F=Q-t,t+=F/++U,s+=F*(Q-t));else{let I=-1;for(let g of B)null!=(g=Q(g,++I,B))&&(g=+g)>=g&&(F=g-t,t+=F/++U,s+=F*(g-t))}if(U>1)return s/(U-1)}function LB(B,Q){const F=xB(B,Q);return F?Math.sqrt(F):F}function AB(B,Q){let F,U;if(void 0===Q)for(const Q of B)null!=Q&&(void 0===F?Q>=Q&&(F=U=Q):(F>Q&&(F=Q),U<Q&&(U=Q)));else{let t=-1;for(let s of B)null!=(s=Q(s,++t,B))&&(void 0===F?s>=s&&(F=U=s):(F>s&&(F=s),U<s&&(U=s)))}return[F,U]}nB(CB).center;class hB{constructor(){this._partials=new Float64Array(32),this._n=0}add(B){const Q=this._partials;let F=0;for(let U=0;U<this._n&&U<32;U++){const t=Q[U],s=B+t,I=Math.abs(B)<Math.abs(t)?B-(s-t):t-(s-B);I&&(Q[F++]=I),B=s}return Q[F]=B,this._n=F+1,this}valueOf(){const B=this._partials;let Q,F,U,t=this._n,s=0;if(t>0){for(s=B[--t];t>0&&(Q=s,F=B[--t],s=Q+F,U=F-(s-Q),!U););t>0&&(U<0&&B[t-1]<0||U>0&&B[t-1]>0)&&(F=2*U,Q=s+F,F==Q-s&&(s=Q))}return s}}class RB extends Map{constructor(B,Q=mB){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:Q}}),null!=B)for(const[Q,F]of B)this.set(Q,F)}get(B){return super.get(VB(this,B))}has(B){return super.has(VB(this,B))}set(B,Q){return super.set(ZB(this,B),Q)}delete(B){return super.delete(SB(this,B))}}class yB extends Set{constructor(B,Q=mB){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:Q}}),null!=B)for(const Q of B)this.add(Q)}has(B){return super.has(VB(this,B))}add(B){return super.add(ZB(this,B))}delete(B){return super.delete(SB(this,B))}}function VB({_intern:B,_key:Q},F){const U=Q(F);return B.has(U)?B.get(U):F}function ZB({_intern:B,_key:Q},F){const U=Q(F);return B.has(U)?B.get(U):(B.set(U,F),F)}function SB({_intern:B,_key:Q},F){const U=Q(F);return B.has(U)&&(F=B.get(U),B.delete(U)),F}function mB(B){return null!==B&&"object"==typeof B?B.valueOf():B}function EB(B){return B}function NB(B,...Q){return WB(B,EB,EB,Q)}function XB(B,Q,...F){return WB(B,EB,Q,F)}function pB(B,Q,...F){return WB(B,Array.from,Q,F)}function WB(B,Q,F,U){return function B(t,s){if(s>=U.length)return F(t);const I=new RB,g=U[s++];let i=-1;for(const B of t){const Q=g(B,++i,t),F=I.get(Q);F?F.push(B):I.set(Q,[B])}for(const[Q,F]of I)I.set(Q,B(F,s));return Q(I)}(B,0)}function HB(B,...Q){if("function"!=typeof B[Symbol.iterator])throw new TypeError("values is not iterable");B=Array.from(B);let[F]=Q;if(F&&2!==F.length||Q.length>1){const s=Uint32Array.from(B,(B,Q)=>Q);return Q.length>1?(Q=Q.map(Q=>B.map(Q)),s.sort((B,F)=>{for(const U of Q){const Q=YB(U[B],U[F]);if(Q)return Q}})):(F=B.map(F),s.sort((B,Q)=>YB(F[B],F[Q]))),U=B,t=s,Array.from(t,B=>U[B])}var U,t;return B.sort(DB(F))}function DB(B=cB){if(B===cB)return YB;if("function"!=typeof B)throw new TypeError("compare is not a function");return(Q,F)=>{const U=B(Q,F);return U||0===U?U:(0===B(F,F))-(0===B(Q,Q))}}function YB(B,Q){return(null==B||!(B>=B))-(null==Q||!(Q>=Q))||(B<Q?-1:B>Q?1:0)}function fB(B,Q,F){return(2!==Q.length?HB(XB(B,Q,F),([B,Q],[F,U])=>cB(Q,U)||cB(B,F)):HB(NB(B,F),([B,F],[U,t])=>Q(F,t)||cB(B,U))).map(([B])=>B)}const wB=Math.sqrt(50),JB=Math.sqrt(10),vB=Math.sqrt(2);function kB(B,Q,F){const U=(Q-B)/Math.max(0,F),t=Math.floor(Math.log10(U)),s=U/Math.pow(10,t),I=s>=wB?10:s>=JB?5:s>=vB?2:1;let g,i,l;return t<0?(l=Math.pow(10,-t)/I,g=Math.round(B*l),i=Math.round(Q*l),g/l<B&&++g,i/l>Q&&--i,l=-l):(l=Math.pow(10,t)*I,g=Math.round(B/l),i=Math.round(Q/l),g*l<B&&++g,i*l>Q&&--i),i<g&&.5<=F&&F<2?kB(B,Q,2*F):[g,i,l]}function MB(B,Q,F){if(!((F=+F)>0))return[];if((B=+B)===(Q=+Q))return[B];const U=Q<B,[t,s,I]=U?kB(Q,B,F):kB(B,Q,F);if(!(s>=t))return[];const g=s-t+1,i=new Array(g);if(U)if(I<0)for(let B=0;B<g;++B)i[B]=(s-B)/-I;else for(let B=0;B<g;++B)i[B]=(s-B)*I;else if(I<0)for(let B=0;B<g;++B)i[B]=(t+B)/-I;else for(let B=0;B<g;++B)i[B]=(t+B)*I;return i}function TB(B,Q,F){return kB(B=+B,Q=+Q,F=+F)[2]}function zB(B,Q,F){F=+F;const U=(Q=+Q)<(B=+B),t=U?TB(Q,B,F):TB(B,Q,F);return(U?-1:1)*(t<0?1/-t:t)}function KB(B){return Math.max(1,Math.ceil(Math.log(bB(B))/Math.LN2)+1)}function OB(B,Q){let F;if(void 0===Q)for(const Q of B)null!=Q&&(F<Q||void 0===F&&Q>=Q)&&(F=Q);else{let U=-1;for(let t of B)null!=(t=Q(t,++U,B))&&(F<t||void 0===F&&t>=t)&&(F=t)}return F}function PB(B,Q){let F,U=-1,t=-1;if(void 0===Q)for(const Q of B)++t,null!=Q&&(F<Q||void 0===F&&Q>=Q)&&(F=Q,U=t);else for(let s of B)null!=(s=Q(s,++t,B))&&(F<s||void 0===F&&s>=s)&&(F=s,U=t);return U}function jB(B,Q){let F;if(void 0===Q)for(const Q of B)null!=Q&&(F>Q||void 0===F&&Q>=Q)&&(F=Q);else{let U=-1;for(let t of B)null!=(t=Q(t,++U,B))&&(F>t||void 0===F&&t>=t)&&(F=t)}return F}function _B(B,Q){let F,U=-1,t=-1;if(void 0===Q)for(const Q of B)++t,null!=Q&&(F>Q||void 0===F&&Q>=Q)&&(F=Q,U=t);else for(let s of B)null!=(s=Q(s,++t,B))&&(F>s||void 0===F&&s>=s)&&(F=s,U=t);return U}function $B(B,Q,F=0,U=1/0,t){if(Q=Math.floor(Q),F=Math.floor(Math.max(0,F)),U=Math.floor(Math.min(B.length-1,U)),!(F<=Q&&Q<=U))return B;for(t=void 0===t?YB:DB(t);U>F;){if(U-F>600){const s=U-F+1,I=Q-F+1,g=Math.log(s),i=.5*Math.exp(2*g/3),l=.5*Math.sqrt(g*i*(s-i)/s)*(I-s/2<0?-1:1);$B(B,Q,Math.max(F,Math.floor(Q-I*i/s+l)),Math.min(U,Math.floor(Q+(s-I)*i/s+l)),t)}const s=B[Q];let I=F,g=U;for(qB(B,F,Q),t(B[U],s)>0&&qB(B,F,U);I<g;){for(qB(B,I,g),++I,--g;t(B[I],s)<0;)++I;for(;t(B[g],s)>0;)--g}0===t(B[F],s)?qB(B,F,g):(++g,qB(B,g,U)),g<=Q&&(F=g+1),Q<=g&&(U=g-1)}return B}function qB(B,Q,F){const U=B[Q];B[Q]=B[F],B[F]=U}function BQ(B,Q=cB){let F,U=!1;if(1===Q.length){let t;for(const s of B){const B=Q(s);(U?cB(B,t)>0:0===cB(B,B))&&(F=s,t=B,U=!0)}}else for(const t of B)(U?Q(t,F)>0:0===Q(t,t))&&(F=t,U=!0);return F}function QQ(B,Q,F){if(B=Float64Array.from(function*(B,Q){if(void 0===Q)for(let Q of B)null!=Q&&(Q=+Q)>=Q&&(yield Q);else{let F=-1;for(let U of B)null!=(U=Q(U,++F,B))&&(U=+U)>=U&&(yield U)}}(B,F)),(U=B.length)&&!isNaN(Q=+Q)){if(Q<=0||U<2)return jB(B);if(Q>=1)return OB(B);var U,t=(U-1)*Q,s=Math.floor(t),I=OB($B(B,s).subarray(0,s+1));return I+(jB(B.subarray(s+1))-I)*(t-s)}}function FQ(B,Q,F=CB){if((U=B.length)&&!isNaN(Q=+Q)){if(Q<=0||U<2)return+F(B[0],0,B);if(Q>=1)return+F(B[U-1],U-1,B);var U,t=(U-1)*Q,s=Math.floor(t),I=+F(B[s],s,B);return I+(+F(B[s+1],s+1,B)-I)*(t-s)}}function UQ(B,Q,F){const U=bB(B),t=QQ(B,.75)-QQ(B,.25);return U&&t?Math.ceil((F-Q)/(2*t*Math.pow(U,-1/3))):1}function tQ(B,Q,F){const U=bB(B),t=LB(B);return U&&t?Math.ceil((F-Q)*Math.cbrt(U)/(3.49*t)):1}function sQ(B,Q){let F=0,U=0;if(void 0===Q)for(let Q of B)null!=Q&&(Q=+Q)>=Q&&(++F,U+=Q);else{let t=-1;for(let s of B)null!=(s=Q(s,++t,B))&&(s=+s)>=s&&(++F,U+=s)}if(F)return U/F}function IQ(B,Q){return QQ(B,.5,Q)}function gQ(B){return Array.from(function*(B){for(const Q of B)yield*Q}(B))}function iQ(B,Q){const F=new RB;if(void 0===Q)for(let Q of B)null!=Q&&Q>=Q&&F.set(Q,(F.get(Q)||0)+1);else{let U=-1;for(let t of B)null!=(t=Q(t,++U,B))&&t>=t&&F.set(t,(F.get(t)||0)+1)}let U,t=0;for(const[B,Q]of F)Q>t&&(t=Q,U=B);return U}function lQ(B,Q){return[B,Q]}function cQ(B,Q,F){B=+B,Q=+Q,F=(t=arguments.length)<2?(Q=B,B=0,1):t<3?1:+F;for(var U=-1,t=0|Math.max(0,Math.ceil((Q-B)/F)),s=new Array(t);++U<t;)s[U]=B+U*F;return s}function eQ(B,Q){let F=0;if(void 0===Q)for(let Q of B)(Q=+Q)&&(F+=Q);else{let U=-1;for(let t of B)(t=+Q(t,++U,B))&&(F+=t)}return F}function nQ(B){if("function"!=typeof B[Symbol.iterator])throw new TypeError("values is not iterable");return Array.from(B).reverse()}function dQ(B){return B}var CQ=1e-6;function aQ(B){return"translate("+B+",0)"}function bQ(B){return"translate(0,"+B+")"}function oQ(B){return Q=>+B(Q)}function GQ(B,Q){return Q=Math.max(0,B.bandwidth()-2*Q)/2,B.round()&&(Q=Math.round(Q)),F=>+B(F)+Q}function uQ(){return!this.__axis}function rQ(B,Q){var F=[],U=null,t=null,s=6,I=6,g=3,i="undefined"!=typeof window&&window.devicePixelRatio>1?0:.5,l=1===B||4===B?-1:1,c=4===B||2===B?"x":"y",e=1===B||3===B?aQ:bQ;function n(n){var d=null==U?Q.ticks?Q.ticks.apply(Q,F):Q.domain():U,C=null==t?Q.tickFormat?Q.tickFormat.apply(Q,F):dQ:t,a=Math.max(s,0)+g,b=Q.range(),o=+b[0]+i,G=+b[b.length-1]+i,u=(Q.bandwidth?GQ:oQ)(Q.copy(),i),r=n.selection?n.selection():n,x=r.selectAll(".domain").data([null]),L=r.selectAll(".tick").data(d,Q).order(),A=L.exit(),h=L.enter().append("g").attr("class","tick"),R=L.select("line"),y=L.select("text");x=x.merge(x.enter().insert("path",".tick").attr("class","domain").attr("stroke","currentColor")),L=L.merge(h),R=R.merge(h.append("line").attr("stroke","currentColor").attr(c+"2",l*s)),y=y.merge(h.append("text").attr("fill","currentColor").attr(c,l*a).attr("dy",1===B?"0em":3===B?"0.71em":"0.32em")),n!==r&&(x=x.transition(n),L=L.transition(n),R=R.transition(n),y=y.transition(n),A=A.transition(n).attr("opacity",CQ).attr("transform",function(B){return isFinite(B=u(B))?e(B+i):this.getAttribute("transform")}),h.attr("opacity",CQ).attr("transform",function(B){var Q=this.parentNode.__axis;return e((Q&&isFinite(Q=Q(B))?Q:u(B))+i)})),A.remove(),x.attr("d",4===B||2===B?I?"M"+l*I+","+o+"H"+i+"V"+G+"H"+l*I:"M"+i+","+o+"V"+G:I?"M"+o+","+l*I+"V"+i+"H"+G+"V"+l*I:"M"+o+","+i+"H"+G),L.attr("opacity",1).attr("transform",function(B){return e(u(B)+i)}),R.attr(c+"2",l*s),y.attr(c,l*a).text(C),r.filter(uQ).attr("fill","none").attr("font-size",10).attr("font-family","sans-serif").attr("text-anchor",2===B?"start":4===B?"end":"middle"),r.each(function(){this.__axis=u})}return n.scale=function(B){return arguments.length?(Q=B,n):Q},n.ticks=function(){return F=Array.from(arguments),n},n.tickArguments=function(B){return arguments.length?(F=null==B?[]:Array.from(B),n):F.slice()},n.tickValues=function(B){return arguments.length?(U=null==B?null:Array.from(B),n):U&&U.slice()},n.tickFormat=function(B){return arguments.length?(t=B,n):t},n.tickSize=function(B){return arguments.length?(s=I=+B,n):s},n.tickSizeInner=function(B){return arguments.length?(s=+B,n):s},n.tickSizeOuter=function(B){return arguments.length?(I=+B,n):I},n.tickPadding=function(B){return arguments.length?(g=+B,n):g},n.offset=function(B){return arguments.length?(i=+B,n):i},n}function xQ(B){return rQ(3,B)}var LQ={value:()=>{}};function AQ(){for(var B,Q=0,F=arguments.length,U={};Q<F;++Q){if(!(B=arguments[Q]+"")||B in U||/[\s.]/.test(B))throw new Error("illegal type: "+B);U[B]=[]}return new hQ(U)}function hQ(B){this._=B}function RQ(B,Q){for(var F,U=0,t=B.length;U<t;++U)if((F=B[U]).name===Q)return F.value}function yQ(B,Q,F){for(var U=0,t=B.length;U<t;++U)if(B[U].name===Q){B[U]=LQ,B=B.slice(0,U).concat(B.slice(U+1));break}return null!=F&&B.push({name:Q,value:F}),B}hQ.prototype=AQ.prototype={constructor:hQ,on:function(B,Q){var F,U,t=this._,s=(U=t,(B+"").trim().split(/^|\s+/).map(function(B){var Q="",F=B.indexOf(".");if(F>=0&&(Q=B.slice(F+1),B=B.slice(0,F)),B&&!U.hasOwnProperty(B))throw new Error("unknown type: "+B);return{type:B,name:Q}})),I=-1,g=s.length;if(!(arguments.length<2)){if(null!=Q&&"function"!=typeof Q)throw new Error("invalid callback: "+Q);for(;++I<g;)if(F=(B=s[I]).type)t[F]=yQ(t[F],B.name,Q);else if(null==Q)for(F in t)t[F]=yQ(t[F],B.name,null);return this}for(;++I<g;)if((F=(B=s[I]).type)&&(F=RQ(t[F],B.name)))return F},copy:function(){var B={},Q=this._;for(var F in Q)B[F]=Q[F].slice();return new hQ(B)},call:function(B,Q){if((F=arguments.length-2)>0)for(var F,U,t=new Array(F),s=0;s<F;++s)t[s]=arguments[s+2];if(!this._.hasOwnProperty(B))throw new Error("unknown type: "+B);for(s=0,F=(U=this._[B]).length;s<F;++s)U[s].value.apply(Q,t)},apply:function(B,Q,F){if(!this._.hasOwnProperty(B))throw new Error("unknown type: "+B);for(var U=this._[B],t=0,s=U.length;t<s;++t)U[t].value.apply(Q,F)}};var VQ="http://www.w3.org/1999/xhtml",ZQ={svg:"http://www.w3.org/2000/svg",xhtml:VQ,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function SQ(B){var Q=B+="",F=Q.indexOf(":");return F>=0&&"xmlns"!==(Q=B.slice(0,F))&&(B=B.slice(F+1)),ZQ.hasOwnProperty(Q)?{space:ZQ[Q],local:B}:B}function mQ(B){return function(){var Q=this.ownerDocument,F=this.namespaceURI;return F===VQ&&Q.documentElement.namespaceURI===VQ?Q.createElement(B):Q.createElementNS(F,B)}}function EQ(B){return function(){return this.ownerDocument.createElementNS(B.space,B.local)}}function NQ(B){var Q=SQ(B);return(Q.local?EQ:mQ)(Q)}function XQ(){}function pQ(B){return null==B?XQ:function(){return this.querySelector(B)}}function WQ(){return[]}function HQ(B){return null==B?WQ:function(){return this.querySelectorAll(B)}}function DQ(B){return function(){return function(B){return null==B?[]:Array.isArray(B)?B:Array.from(B)}(B.apply(this,arguments))}}function YQ(B){return function(){return this.matches(B)}}function fQ(B){return function(Q){return Q.matches(B)}}var wQ=Array.prototype.find;function JQ(){return this.firstElementChild}var vQ=Array.prototype.filter;function kQ(){return Array.from(this.children)}function MQ(B){return new Array(B.length)}function TQ(B,Q){this.ownerDocument=B.ownerDocument,this.namespaceURI=B.namespaceURI,this._next=null,this._parent=B,this.__data__=Q}function zQ(B,Q,F,U,t,s){for(var I,g=0,i=Q.length,l=s.length;g<l;++g)(I=Q[g])?(I.__data__=s[g],U[g]=I):F[g]=new TQ(B,s[g]);for(;g<i;++g)(I=Q[g])&&(t[g]=I)}function KQ(B,Q,F,U,t,s,I){var g,i,l,c=new Map,e=Q.length,n=s.length,d=new Array(e);for(g=0;g<e;++g)(i=Q[g])&&(d[g]=l=I.call(i,i.__data__,g,Q)+"",c.has(l)?t[g]=i:c.set(l,i));for(g=0;g<n;++g)l=I.call(B,s[g],g,s)+"",(i=c.get(l))?(U[g]=i,i.__data__=s[g],c.delete(l)):F[g]=new TQ(B,s[g]);for(g=0;g<e;++g)(i=Q[g])&&c.get(d[g])===i&&(t[g]=i)}function OQ(B){return B.__data__}function PQ(B){return"object"==typeof B&&"length"in B?B:Array.from(B)}function jQ(B,Q){return B<Q?-1:B>Q?1:B>=Q?0:NaN}function _Q(B){return function(){this.removeAttribute(B)}}function $Q(B){return function(){this.removeAttributeNS(B.space,B.local)}}function qQ(B,Q){return function(){this.setAttribute(B,Q)}}function BF(B,Q){return function(){this.setAttributeNS(B.space,B.local,Q)}}function QF(B,Q){return function(){var F=Q.apply(this,arguments);null==F?this.removeAttribute(B):this.setAttribute(B,F)}}function FF(B,Q){return function(){var F=Q.apply(this,arguments);null==F?this.removeAttributeNS(B.space,B.local):this.setAttributeNS(B.space,B.local,F)}}function UF(B){return B.ownerDocument&&B.ownerDocument.defaultView||B.document&&B||B.defaultView}function tF(B){return function(){this.style.removeProperty(B)}}function sF(B,Q,F){return function(){this.style.setProperty(B,Q,F)}}function IF(B,Q,F){return function(){var U=Q.apply(this,arguments);null==U?this.style.removeProperty(B):this.style.setProperty(B,U,F)}}function gF(B,Q){return B.style.getPropertyValue(Q)||UF(B).getComputedStyle(B,null).getPropertyValue(Q)}function iF(B){return function(){delete this[B]}}function lF(B,Q){return function(){this[B]=Q}}function cF(B,Q){return function(){var F=Q.apply(this,arguments);null==F?delete this[B]:this[B]=F}}function eF(B){return B.trim().split(/^|\s+/)}function nF(B){return B.classList||new dF(B)}function dF(B){this._node=B,this._names=eF(B.getAttribute("class")||"")}function CF(B,Q){for(var F=nF(B),U=-1,t=Q.length;++U<t;)F.add(Q[U])}function aF(B,Q){for(var F=nF(B),U=-1,t=Q.length;++U<t;)F.remove(Q[U])}function bF(B){return function(){CF(this,B)}}function oF(B){return function(){aF(this,B)}}function GF(B,Q){return function(){(Q.apply(this,arguments)?CF:aF)(this,B)}}function uF(){this.textContent=""}function rF(B){return function(){this.textContent=B}}function xF(B){return function(){var Q=B.apply(this,arguments);this.textContent=null==Q?"":Q}}function LF(){this.innerHTML=""}function AF(B){return function(){this.innerHTML=B}}function hF(B){return function(){var Q=B.apply(this,arguments);this.innerHTML=null==Q?"":Q}}function RF(){this.nextSibling&&this.parentNode.appendChild(this)}function yF(){this.previousSibling&&this.parentNode.insertBefore(this,this.parentNode.firstChild)}function VF(){return null}function ZF(){var B=this.parentNode;B&&B.removeChild(this)}function SF(){var B=this.cloneNode(!1),Q=this.parentNode;return Q?Q.insertBefore(B,this.nextSibling):B}function mF(){var B=this.cloneNode(!0),Q=this.parentNode;return Q?Q.insertBefore(B,this.nextSibling):B}function EF(B){return function(){var Q=this.__on;if(Q){for(var F,U=0,t=-1,s=Q.length;U<s;++U)F=Q[U],B.type&&F.type!==B.type||F.name!==B.name?Q[++t]=F:this.removeEventListener(F.type,F.listener,F.options);++t?Q.length=t:delete this.__on}}}function NF(B,Q,F){return function(){var U,t=this.__on,s=function(B){return function(Q){B.call(this,Q,this.__data__)}}(Q);if(t)for(var I=0,g=t.length;I<g;++I)if((U=t[I]).type===B.type&&U.name===B.name)return this.removeEventListener(U.type,U.listener,U.options),this.addEventListener(U.type,U.listener=s,U.options=F),void(U.value=Q);this.addEventListener(B.type,s,F),U={type:B.type,name:B.name,value:Q,listener:s,options:F},t?t.push(U):this.__on=[U]}}function XF(B,Q,F){var U=UF(B),t=U.CustomEvent;"function"==typeof t?t=new t(Q,F):(t=U.document.createEvent("Event"),F?(t.initEvent(Q,F.bubbles,F.cancelable),t.detail=F.detail):t.initEvent(Q,!1,!1)),B.dispatchEvent(t)}function pF(B,Q){return function(){return XF(this,B,Q)}}function WF(B,Q){return function(){return XF(this,B,Q.apply(this,arguments))}}TQ.prototype={constructor:TQ,appendChild:function(B){return this._parent.insertBefore(B,this._next)},insertBefore:function(B,Q){return this._parent.insertBefore(B,Q)},querySelector:function(B){return this._parent.querySelector(B)},querySelectorAll:function(B){return this._parent.querySelectorAll(B)}},dF.prototype={add:function(B){this._names.indexOf(B)<0&&(this._names.push(B),this._node.setAttribute("class",this._names.join(" ")))},remove:function(B){var Q=this._names.indexOf(B);Q>=0&&(this._names.splice(Q,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(B){return this._names.indexOf(B)>=0}};var HF=[null];function DF(B,Q){this._groups=B,this._parents=Q}function YF(){return new DF([[document.documentElement]],HF)}function fF(B){return"string"==typeof B?new DF([[document.querySelector(B)]],[document.documentElement]):new DF([[B]],HF)}function wF(B,Q){if(B=function(B){let Q;for(;Q=B.sourceEvent;)B=Q;return B}(B),void 0===Q&&(Q=B.currentTarget),Q){var F=Q.ownerSVGElement||Q;if(F.createSVGPoint){var U=F.createSVGPoint();return U.x=B.clientX,U.y=B.clientY,[(U=U.matrixTransform(Q.getScreenCTM().inverse())).x,U.y]}if(Q.getBoundingClientRect){var t=Q.getBoundingClientRect();return[B.clientX-t.left-Q.clientLeft,B.clientY-t.top-Q.clientTop]}}return[B.pageX,B.pageY]}DF.prototype=YF.prototype={constructor:DF,select:function(B){"function"!=typeof B&&(B=pQ(B));for(var Q=this._groups,F=Q.length,U=new Array(F),t=0;t<F;++t)for(var s,I,g=Q[t],i=g.length,l=U[t]=new Array(i),c=0;c<i;++c)(s=g[c])&&(I=B.call(s,s.__data__,c,g))&&("__data__"in s&&(I.__data__=s.__data__),l[c]=I);return new DF(U,this._parents)},selectAll:function(B){B="function"==typeof B?DQ(B):HQ(B);for(var Q=this._groups,F=Q.length,U=[],t=[],s=0;s<F;++s)for(var I,g=Q[s],i=g.length,l=0;l<i;++l)(I=g[l])&&(U.push(B.call(I,I.__data__,l,g)),t.push(I));return new DF(U,t)},selectChild:function(B){return this.select(null==B?JQ:function(B){return function(){return wQ.call(this.children,B)}}("function"==typeof B?B:fQ(B)))},selectChildren:function(B){return this.selectAll(null==B?kQ:function(B){return function(){return vQ.call(this.children,B)}}("function"==typeof B?B:fQ(B)))},filter:function(B){"function"!=typeof B&&(B=YQ(B));for(var Q=this._groups,F=Q.length,U=new Array(F),t=0;t<F;++t)for(var s,I=Q[t],g=I.length,i=U[t]=[],l=0;l<g;++l)(s=I[l])&&B.call(s,s.__data__,l,I)&&i.push(s);return new DF(U,this._parents)},data:function(B,Q){if(!arguments.length)return Array.from(this,OQ);var F=Q?KQ:zQ,U=this._parents,t=this._groups;"function"!=typeof B&&(B=function(B){return function(){return B}}(B));for(var s=t.length,I=new Array(s),g=new Array(s),i=new Array(s),l=0;l<s;++l){var c=U[l],e=t[l],n=e.length,d=PQ(B.call(c,c&&c.__data__,l,U)),C=d.length,a=g[l]=new Array(C),b=I[l]=new Array(C);F(c,e,a,b,i[l]=new Array(n),d,Q);for(var o,G,u=0,r=0;u<C;++u)if(o=a[u]){for(u>=r&&(r=u+1);!(G=b[r])&&++r<C;);o._next=G||null}}return(I=new DF(I,U))._enter=g,I._exit=i,I},enter:function(){return new DF(this._enter||this._groups.map(MQ),this._parents)},exit:function(){return new DF(this._exit||this._groups.map(MQ),this._parents)},join:function(B,Q,F){var U=this.enter(),t=this,s=this.exit();return"function"==typeof B?(U=B(U))&&(U=U.selection()):U=U.append(B+""),null!=Q&&(t=Q(t))&&(t=t.selection()),null==F?s.remove():F(s),U&&t?U.merge(t).order():t},merge:function(B){for(var Q=B.selection?B.selection():B,F=this._groups,U=Q._groups,t=F.length,s=U.length,I=Math.min(t,s),g=new Array(t),i=0;i<I;++i)for(var l,c=F[i],e=U[i],n=c.length,d=g[i]=new Array(n),C=0;C<n;++C)(l=c[C]||e[C])&&(d[C]=l);for(;i<t;++i)g[i]=F[i];return new DF(g,this._parents)},selection:function(){return this},order:function(){for(var B=this._groups,Q=-1,F=B.length;++Q<F;)for(var U,t=B[Q],s=t.length-1,I=t[s];--s>=0;)(U=t[s])&&(I&&4^U.compareDocumentPosition(I)&&I.parentNode.insertBefore(U,I),I=U);return this},sort:function(B){function Q(Q,F){return Q&&F?B(Q.__data__,F.__data__):!Q-!F}B||(B=jQ);for(var F=this._groups,U=F.length,t=new Array(U),s=0;s<U;++s){for(var I,g=F[s],i=g.length,l=t[s]=new Array(i),c=0;c<i;++c)(I=g[c])&&(l[c]=I);l.sort(Q)}return new DF(t,this._parents).order()},call:function(){var B=arguments[0];return arguments[0]=this,B.apply(null,arguments),this},nodes:function(){return Array.from(this)},node:function(){for(var B=this._groups,Q=0,F=B.length;Q<F;++Q)for(var U=B[Q],t=0,s=U.length;t<s;++t){var I=U[t];if(I)return I}return null},size:function(){let B=0;for(const Q of this)++B;return B},empty:function(){return!this.node()},each:function(B){for(var Q=this._groups,F=0,U=Q.length;F<U;++F)for(var t,s=Q[F],I=0,g=s.length;I<g;++I)(t=s[I])&&B.call(t,t.__data__,I,s);return this},attr:function(B,Q){var F=SQ(B);if(arguments.length<2){var U=this.node();return F.local?U.getAttributeNS(F.space,F.local):U.getAttribute(F)}return this.each((null==Q?F.local?$Q:_Q:"function"==typeof Q?F.local?FF:QF:F.local?BF:qQ)(F,Q))},style:function(B,Q,F){return arguments.length>1?this.each((null==Q?tF:"function"==typeof Q?IF:sF)(B,Q,null==F?"":F)):gF(this.node(),B)},property:function(B,Q){return arguments.length>1?this.each((null==Q?iF:"function"==typeof Q?cF:lF)(B,Q)):this.node()[B]},classed:function(B,Q){var F=eF(B+"");if(arguments.length<2){for(var U=nF(this.node()),t=-1,s=F.length;++t<s;)if(!U.contains(F[t]))return!1;return!0}return this.each(("function"==typeof Q?GF:Q?bF:oF)(F,Q))},text:function(B){return arguments.length?this.each(null==B?uF:("function"==typeof B?xF:rF)(B)):this.node().textContent},html:function(B){return arguments.length?this.each(null==B?LF:("function"==typeof B?hF:AF)(B)):this.node().innerHTML},raise:function(){return this.each(RF)},lower:function(){return this.each(yF)},append:function(B){var Q="function"==typeof B?B:NQ(B);return this.select(function(){return this.appendChild(Q.apply(this,arguments))})},insert:function(B,Q){var F="function"==typeof B?B:NQ(B),U=null==Q?VF:"function"==typeof Q?Q:pQ(Q);return this.select(function(){return this.insertBefore(F.apply(this,arguments),U.apply(this,arguments)||null)})},remove:function(){return this.each(ZF)},clone:function(B){return this.select(B?mF:SF)},datum:function(B){return arguments.length?this.property("__data__",B):this.node().__data__},on:function(B,Q,F){var U,t,s=function(B){return B.trim().split(/^|\s+/).map(function(B){var Q="",F=B.indexOf(".");return F>=0&&(Q=B.slice(F+1),B=B.slice(0,F)),{type:B,name:Q}})}(B+""),I=s.length;if(!(arguments.length<2)){for(g=Q?NF:EF,U=0;U<I;++U)this.each(g(s[U],Q,F));return this}var g=this.node().__on;if(g)for(var i,l=0,c=g.length;l<c;++l)for(U=0,i=g[l];U<I;++U)if((t=s[U]).type===i.type&&t.name===i.name)return i.value},dispatch:function(B,Q){return this.each(("function"==typeof Q?WF:pF)(B,Q))},[Symbol.iterator]:function*(){for(var B=this._groups,Q=0,F=B.length;Q<F;++Q)for(var U,t=B[Q],s=0,I=t.length;s<I;++s)(U=t[s])&&(yield U)}};const JF={passive:!1},vF={capture:!0,passive:!1};function kF(B){B.stopImmediatePropagation()}function MF(B){B.preventDefault(),B.stopImmediatePropagation()}var TF=B=>()=>B;function zF(B,{sourceEvent:Q,subject:F,target:U,identifier:t,active:s,x:I,y:g,dx:i,dy:l,dispatch:c}){Object.defineProperties(this,{type:{value:B,enumerable:!0,configurable:!0},sourceEvent:{value:Q,enumerable:!0,configurable:!0},subject:{value:F,enumerable:!0,configurable:!0},target:{value:U,enumerable:!0,configurable:!0},identifier:{value:t,enumerable:!0,configurable:!0},active:{value:s,enumerable:!0,configurable:!0},x:{value:I,enumerable:!0,configurable:!0},y:{value:g,enumerable:!0,configurable:!0},dx:{value:i,enumerable:!0,configurable:!0},dy:{value:l,enumerable:!0,configurable:!0},_:{value:c}})}function KF(B){return!B.ctrlKey&&!B.button}function OF(){return this.parentNode}function PF(B,Q){return null==Q?{x:B.x,y:B.y}:Q}function jF(){return navigator.maxTouchPoints||"ontouchstart"in this}function _F(){var B,Q,F,U,t=KF,s=OF,I=PF,g=jF,i={},l=AQ("start","drag","end"),c=0,e=0;function n(B){B.on("mousedown.drag",d).filter(g).on("touchstart.drag",b).on("touchmove.drag",o,JF).on("touchend.drag touchcancel.drag",G).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function d(I,g){if(!U&&t.call(this,I,g)){var i=u(this,s.call(this,I,g),I,g,"mouse");i&&(fF(I.view).on("mousemove.drag",C,vF).on("mouseup.drag",a,vF),function(B){var Q=B.document.documentElement,F=fF(B).on("dragstart.drag",MF,vF);"onselectstart"in Q?F.on("selectstart.drag",MF,vF):(Q.__noselect=Q.style.MozUserSelect,Q.style.MozUserSelect="none")}(I.view),kF(I),F=!1,B=I.clientX,Q=I.clientY,i("start",I))}}function C(U){if(MF(U),!F){var t=U.clientX-B,s=U.clientY-Q;F=t*t+s*s>e}i.mouse("drag",U)}function a(B){fF(B.view).on("mousemove.drag mouseup.drag",null),function(B,Q){var F=B.document.documentElement,U=fF(B).on("dragstart.drag",null);Q&&(U.on("click.drag",MF,vF),setTimeout(function(){U.on("click.drag",null)},0)),"onselectstart"in F?U.on("selectstart.drag",null):(F.style.MozUserSelect=F.__noselect,delete F.__noselect)}(B.view,F),MF(B),i.mouse("end",B)}function b(B,Q){if(t.call(this,B,Q)){var F,U,I=B.changedTouches,g=s.call(this,B,Q),i=I.length;for(F=0;F<i;++F)(U=u(this,g,B,Q,I[F].identifier,I[F]))&&(kF(B),U("start",B,I[F]))}}function o(B){var Q,F,U=B.changedTouches,t=U.length;for(Q=0;Q<t;++Q)(F=i[U[Q].identifier])&&(MF(B),F("drag",B,U[Q]))}function G(B){var Q,F,t=B.changedTouches,s=t.length;for(U&&clearTimeout(U),U=setTimeout(function(){U=null},500),Q=0;Q<s;++Q)(F=i[t[Q].identifier])&&(kF(B),F("end",B,t[Q]))}function u(B,Q,F,U,t,s){var g,e,d,C=l.copy(),a=wF(s||F,Q);if(null!=(d=I.call(B,new zF("beforestart",{sourceEvent:F,target:n,identifier:t,active:c,x:a[0],y:a[1],dx:0,dy:0,dispatch:C}),U)))return g=d.x-a[0]||0,e=d.y-a[1]||0,function F(s,I,l){var b,o=a;switch(s){case"start":i[t]=F,b=c++;break;case"end":delete i[t],--c;case"drag":a=wF(l||I,Q),b=c}C.call(s,B,new zF(s,{sourceEvent:I,subject:d,target:n,identifier:t,active:b,x:a[0]+g,y:a[1]+e,dx:a[0]-o[0],dy:a[1]-o[1],dispatch:C}),U)}}return n.filter=function(B){return arguments.length?(t="function"==typeof B?B:TF(!!B),n):t},n.container=function(B){return arguments.length?(s="function"==typeof B?B:TF(B),n):s},n.subject=function(B){return arguments.length?(I="function"==typeof B?B:TF(B),n):I},n.touchable=function(B){return arguments.length?(g="function"==typeof B?B:TF(!!B),n):g},n.on=function(){var B=l.on.apply(l,arguments);return B===l?n:B},n.clickDistance=function(B){return arguments.length?(e=(B=+B)*B,n):Math.sqrt(e)},n}function $F(B,Q,F){B.prototype=Q.prototype=F,F.constructor=B}function qF(B,Q){var F=Object.create(B.prototype);for(var U in Q)F[U]=Q[U];return F}function BU(){}zF.prototype.on=function(){var B=this._.on.apply(this._,arguments);return B===this._?this:B};var QU=.7,FU=1/QU,UU="\\s*([+-]?\\d+)\\s*",tU="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*",sU="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*",IU=/^#([0-9a-f]{3,8})$/,gU=new RegExp(`^rgb\\(${UU},${UU},${UU}\\)$`),iU=new RegExp(`^rgb\\(${sU},${sU},${sU}\\)$`),lU=new RegExp(`^rgba\\(${UU},${UU},${UU},${tU}\\)$`),cU=new RegExp(`^rgba\\(${sU},${sU},${sU},${tU}\\)$`),eU=new RegExp(`^hsl\\(${tU},${sU},${sU}\\)$`),nU=new RegExp(`^hsla\\(${tU},${sU},${sU},${tU}\\)$`),dU={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};function CU(){return this.rgb().formatHex()}function aU(){return this.rgb().formatRgb()}function bU(B){var Q,F;return B=(B+"").trim().toLowerCase(),(Q=IU.exec(B))?(F=Q[1].length,Q=parseInt(Q[1],16),6===F?oU(Q):3===F?new xU(Q>>8&15|Q>>4&240,Q>>4&15|240&Q,(15&Q)<<4|15&Q,1):8===F?GU(Q>>24&255,Q>>16&255,Q>>8&255,(255&Q)/255):4===F?GU(Q>>12&15|Q>>8&240,Q>>8&15|Q>>4&240,Q>>4&15|240&Q,((15&Q)<<4|15&Q)/255):null):(Q=gU.exec(B))?new xU(Q[1],Q[2],Q[3],1):(Q=iU.exec(B))?new xU(255*Q[1]/100,255*Q[2]/100,255*Q[3]/100,1):(Q=lU.exec(B))?GU(Q[1],Q[2],Q[3],Q[4]):(Q=cU.exec(B))?GU(255*Q[1]/100,255*Q[2]/100,255*Q[3]/100,Q[4]):(Q=eU.exec(B))?VU(Q[1],Q[2]/100,Q[3]/100,1):(Q=nU.exec(B))?VU(Q[1],Q[2]/100,Q[3]/100,Q[4]):dU.hasOwnProperty(B)?oU(dU[B]):"transparent"===B?new xU(NaN,NaN,NaN,0):null}function oU(B){return new xU(B>>16&255,B>>8&255,255&B,1)}function GU(B,Q,F,U){return U<=0&&(B=Q=F=NaN),new xU(B,Q,F,U)}function uU(B){return B instanceof BU||(B=bU(B)),B?new xU((B=B.rgb()).r,B.g,B.b,B.opacity):new xU}function rU(B,Q,F,U){return 1===arguments.length?uU(B):new xU(B,Q,F,null==U?1:U)}function xU(B,Q,F,U){this.r=+B,this.g=+Q,this.b=+F,this.opacity=+U}function LU(){return`#${yU(this.r)}${yU(this.g)}${yU(this.b)}`}function AU(){const B=hU(this.opacity);return`${1===B?"rgb(":"rgba("}${RU(this.r)}, ${RU(this.g)}, ${RU(this.b)}${1===B?")":`, ${B})`}`}function hU(B){return isNaN(B)?1:Math.max(0,Math.min(1,B))}function RU(B){return Math.max(0,Math.min(255,Math.round(B)||0))}function yU(B){return((B=RU(B))<16?"0":"")+B.toString(16)}function VU(B,Q,F,U){return U<=0?B=Q=F=NaN:F<=0||F>=1?B=Q=NaN:Q<=0&&(B=NaN),new mU(B,Q,F,U)}function ZU(B){if(B instanceof mU)return new mU(B.h,B.s,B.l,B.opacity);if(B instanceof BU||(B=bU(B)),!B)return new mU;if(B instanceof mU)return B;var Q=(B=B.rgb()).r/255,F=B.g/255,U=B.b/255,t=Math.min(Q,F,U),s=Math.max(Q,F,U),I=NaN,g=s-t,i=(s+t)/2;return g?(I=Q===s?(F-U)/g+6*(F<U):F===s?(U-Q)/g+2:(Q-F)/g+4,g/=i<.5?s+t:2-s-t,I*=60):g=i>0&&i<1?0:I,new mU(I,g,i,B.opacity)}function SU(B,Q,F,U){return 1===arguments.length?ZU(B):new mU(B,Q,F,null==U?1:U)}function mU(B,Q,F,U){this.h=+B,this.s=+Q,this.l=+F,this.opacity=+U}function EU(B){return(B=(B||0)%360)<0?B+360:B}function NU(B){return Math.max(0,Math.min(1,B||0))}function XU(B,Q,F){return 255*(B<60?Q+(F-Q)*B/60:B<180?F:B<240?Q+(F-Q)*(240-B)/60:Q)}$F(BU,bU,{copy(B){return Object.assign(new this.constructor,this,B)},displayable(){return this.rgb().displayable()},hex:CU,formatHex:CU,formatHex8:function(){return this.rgb().formatHex8()},formatHsl:function(){return ZU(this).formatHsl()},formatRgb:aU,toString:aU}),$F(xU,rU,qF(BU,{brighter(B){return B=null==B?FU:Math.pow(FU,B),new xU(this.r*B,this.g*B,this.b*B,this.opacity)},darker(B){return B=null==B?QU:Math.pow(QU,B),new xU(this.r*B,this.g*B,this.b*B,this.opacity)},rgb(){return this},clamp(){return new xU(RU(this.r),RU(this.g),RU(this.b),hU(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:LU,formatHex:LU,formatHex8:function(){return`#${yU(this.r)}${yU(this.g)}${yU(this.b)}${yU(255*(isNaN(this.opacity)?1:this.opacity))}`},formatRgb:AU,toString:AU})),$F(mU,SU,qF(BU,{brighter(B){return B=null==B?FU:Math.pow(FU,B),new mU(this.h,this.s,this.l*B,this.opacity)},darker(B){return B=null==B?QU:Math.pow(QU,B),new mU(this.h,this.s,this.l*B,this.opacity)},rgb(){var B=this.h%360+360*(this.h<0),Q=isNaN(B)||isNaN(this.s)?0:this.s,F=this.l,U=F+(F<.5?F:1-F)*Q,t=2*F-U;return new xU(XU(B>=240?B-240:B+120,t,U),XU(B,t,U),XU(B<120?B+240:B-120,t,U),this.opacity)},clamp(){return new mU(EU(this.h),NU(this.s),NU(this.l),hU(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const B=hU(this.opacity);return`${1===B?"hsl(":"hsla("}${EU(this.h)}, ${100*NU(this.s)}%, ${100*NU(this.l)}%${1===B?")":`, ${B})`}`}}));const pU=Math.PI/180,WU=180/Math.PI,HU=.96422,DU=.82521,YU=4/29,fU=6/29,wU=3*fU*fU,JU=fU*fU*fU;function vU(B){if(B instanceof MU)return new MU(B.l,B.a,B.b,B.opacity);if(B instanceof jU)return _U(B);B instanceof xU||(B=uU(B));var Q,F,U=OU(B.r),t=OU(B.g),s=OU(B.b),I=TU((.2225045*U+.7168786*t+.0606169*s)/1);return U===t&&t===s?Q=F=I:(Q=TU((.4360747*U+.3850649*t+.1430804*s)/HU),F=TU((.0139322*U+.0971045*t+.7141733*s)/DU)),new MU(116*I-16,500*(Q-I),200*(I-F),B.opacity)}function kU(B,Q,F,U){return 1===arguments.length?vU(B):new MU(B,Q,F,null==U?1:U)}function MU(B,Q,F,U){this.l=+B,this.a=+Q,this.b=+F,this.opacity=+U}function TU(B){return B>JU?Math.pow(B,1/3):B/wU+YU}function zU(B){return B>fU?B*B*B:wU*(B-YU)}function KU(B){return 255*(B<=.0031308?12.92*B:1.055*Math.pow(B,1/2.4)-.055)}function OU(B){return(B/=255)<=.04045?B/12.92:Math.pow((B+.055)/1.055,2.4)}function PU(B,Q,F,U){return 1===arguments.length?function(B){if(B instanceof jU)return new jU(B.h,B.c,B.l,B.opacity);if(B instanceof MU||(B=vU(B)),0===B.a&&0===B.b)return new jU(NaN,0<B.l&&B.l<100?0:NaN,B.l,B.opacity);var Q=Math.atan2(B.b,B.a)*WU;return new jU(Q<0?Q+360:Q,Math.sqrt(B.a*B.a+B.b*B.b),B.l,B.opacity)}(B):new jU(B,Q,F,null==U?1:U)}function jU(B,Q,F,U){this.h=+B,this.c=+Q,this.l=+F,this.opacity=+U}function _U(B){if(isNaN(B.h))return new MU(B.l,0,0,B.opacity);var Q=B.h*pU;return new MU(B.l,Math.cos(Q)*B.c,Math.sin(Q)*B.c,B.opacity)}$F(MU,kU,qF(BU,{brighter(B){return new MU(this.l+18*(null==B?1:B),this.a,this.b,this.opacity)},darker(B){return new MU(this.l-18*(null==B?1:B),this.a,this.b,this.opacity)},rgb(){var B=(this.l+16)/116,Q=isNaN(this.a)?B:B+this.a/500,F=isNaN(this.b)?B:B-this.b/200;return new xU(KU(3.1338561*(Q=HU*zU(Q))-1.6168667*(B=1*zU(B))-.4906146*(F=DU*zU(F))),KU(-.9787684*Q+1.9161415*B+.033454*F),KU(.0719453*Q-.2289914*B+1.4052427*F),this.opacity)}})),$F(jU,PU,qF(BU,{brighter(B){return new jU(this.h,this.c,this.l+18*(null==B?1:B),this.opacity)},darker(B){return new jU(this.h,this.c,this.l-18*(null==B?1:B),this.opacity)},rgb(){return _U(this).rgb()}}));var $U=-.14861,qU=1.78277,Bt=-.29227,Qt=-.90649,Ft=1.97294,Ut=Ft*Qt,tt=Ft*qU,st=qU*Bt-Qt*$U;function It(B,Q,F,U){return 1===arguments.length?function(B){if(B instanceof gt)return new gt(B.h,B.s,B.l,B.opacity);B instanceof xU||(B=uU(B));var Q=B.r/255,F=B.g/255,U=B.b/255,t=(st*U+Ut*Q-tt*F)/(st+Ut-tt),s=U-t,I=(Ft*(F-t)-Bt*s)/Qt,g=Math.sqrt(I*I+s*s)/(Ft*t*(1-t)),i=g?Math.atan2(I,s)*WU-120:NaN;return new gt(i<0?i+360:i,g,t,B.opacity)}(B):new gt(B,Q,F,null==U?1:U)}function gt(B,Q,F,U){this.h=+B,this.s=+Q,this.l=+F,this.opacity=+U}$F(gt,It,qF(BU,{brighter(B){return B=null==B?FU:Math.pow(FU,B),new gt(this.h,this.s,this.l*B,this.opacity)},darker(B){return B=null==B?QU:Math.pow(QU,B),new gt(this.h,this.s,this.l*B,this.opacity)},rgb(){var B=isNaN(this.h)?0:(this.h+120)*pU,Q=+this.l,F=isNaN(this.s)?0:this.s*Q*(1-Q),U=Math.cos(B),t=Math.sin(B);return new xU(255*(Q+F*($U*U+qU*t)),255*(Q+F*(Bt*U+Qt*t)),255*(Q+F*(Ft*U)),this.opacity)}}));var lt=B=>()=>B;function ct(B,Q){return function(F){return B+F*Q}}function et(B,Q){var F=Q-B;return F?ct(B,F>180||F<-180?F-360*Math.round(F/360):F):lt(isNaN(B)?Q:B)}function nt(B){return 1===(B=+B)?dt:function(Q,F){return F-Q?function(B,Q,F){return B=Math.pow(B,F),Q=Math.pow(Q,F)-B,F=1/F,function(U){return Math.pow(B+U*Q,F)}}(Q,F,B):lt(isNaN(Q)?F:Q)}}function dt(B,Q){var F=Q-B;return F?ct(B,F):lt(isNaN(B)?Q:B)}var Ct=function B(Q){var F=nt(Q);function U(B,Q){var U=F((B=rU(B)).r,(Q=rU(Q)).r),t=F(B.g,Q.g),s=F(B.b,Q.b),I=dt(B.opacity,Q.opacity);return function(Q){return B.r=U(Q),B.g=t(Q),B.b=s(Q),B.opacity=I(Q),B+""}}return U.gamma=B,U}(1);var at,bt=(at=function(B){var Q=B.length-1;return function(F){var U=F<=0?F=0:F>=1?(F=1,Q-1):Math.floor(F*Q),t=B[U],s=B[U+1],I=U>0?B[U-1]:2*t-s,g=U<Q-1?B[U+2]:2*s-t;return function(B,Q,F,U,t){var s=B*B,I=s*B;return((1-3*B+3*s-I)*Q+(4-6*s+3*I)*F+(1+3*B+3*s-3*I)*U+I*t)/6}((F-U/Q)*Q,I,t,s,g)}},function(B){var Q,F,U=B.length,t=new Array(U),s=new Array(U),I=new Array(U);for(Q=0;Q<U;++Q)F=rU(B[Q]),t[Q]=F.r||0,s[Q]=F.g||0,I[Q]=F.b||0;return t=at(t),s=at(s),I=at(I),F.opacity=1,function(B){return F.r=t(B),F.g=s(B),F.b=I(B),F+""}});function ot(B,Q){Q||(Q=[]);var F,U=B?Math.min(Q.length,B.length):0,t=Q.slice();return function(s){for(F=0;F<U;++F)t[F]=B[F]*(1-s)+Q[F]*s;return t}}function Gt(B,Q){var F,U=Q?Q.length:0,t=B?Math.min(U,B.length):0,s=new Array(t),I=new Array(U);for(F=0;F<t;++F)s[F]=Rt(B[F],Q[F]);for(;F<U;++F)I[F]=Q[F];return function(B){for(F=0;F<t;++F)I[F]=s[F](B);return I}}function ut(B,Q){var F=new Date;return B=+B,Q=+Q,function(U){return F.setTime(B*(1-U)+Q*U),F}}function rt(B,Q){return B=+B,Q=+Q,function(F){return B*(1-F)+Q*F}}function xt(B,Q){var F,U={},t={};for(F in null!==B&&"object"==typeof B||(B={}),null!==Q&&"object"==typeof Q||(Q={}),Q)F in B?U[F]=Rt(B[F],Q[F]):t[F]=Q[F];return function(B){for(F in U)t[F]=U[F](B);return t}}var Lt=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,At=new RegExp(Lt.source,"g");function ht(B,Q){var F,U,t,s=Lt.lastIndex=At.lastIndex=0,I=-1,g=[],i=[];for(B+="",Q+="";(F=Lt.exec(B))&&(U=At.exec(Q));)(t=U.index)>s&&(t=Q.slice(s,t),g[I]?g[I]+=t:g[++I]=t),(F=F[0])===(U=U[0])?g[I]?g[I]+=U:g[++I]=U:(g[++I]=null,i.push({i:I,x:rt(F,U)})),s=At.lastIndex;return s<Q.length&&(t=Q.slice(s),g[I]?g[I]+=t:g[++I]=t),g.length<2?i[0]?function(B){return function(Q){return B(Q)+""}}(i[0].x):function(B){return function(){return B}}(Q):(Q=i.length,function(B){for(var F,U=0;U<Q;++U)g[(F=i[U]).i]=F.x(B);return g.join("")})}function Rt(B,Q){var F,U=typeof Q;return null==Q||"boolean"===U?lt(Q):("number"===U?rt:"string"===U?(F=bU(Q))?(Q=F,Ct):ht:Q instanceof bU?Ct:Q instanceof Date?ut:function(B){return ArrayBuffer.isView(B)&&!(B instanceof DataView)}(Q)?ot:Array.isArray(Q)?Gt:"function"!=typeof Q.valueOf&&"function"!=typeof Q.toString||isNaN(Q)?xt:rt)(B,Q)}function yt(B,Q){return B=+B,Q=+Q,function(F){return Math.round(B*(1-F)+Q*F)}}var Vt,Zt=180/Math.PI,St={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1};function mt(B,Q,F,U,t,s){var I,g,i;return(I=Math.sqrt(B*B+Q*Q))&&(B/=I,Q/=I),(i=B*F+Q*U)&&(F-=B*i,U-=Q*i),(g=Math.sqrt(F*F+U*U))&&(F/=g,U/=g,i/=g),B*U<Q*F&&(B=-B,Q=-Q,i=-i,I=-I),{translateX:t,translateY:s,rotate:Math.atan2(Q,B)*Zt,skewX:Math.atan(i)*Zt,scaleX:I,scaleY:g}}function Et(B,Q,F,U){function t(B){return B.length?B.pop()+" ":""}return function(s,I){var g=[],i=[];return s=B(s),I=B(I),function(B,U,t,s,I,g){if(B!==t||U!==s){var i=I.push("translate(",null,Q,null,F);g.push({i:i-4,x:rt(B,t)},{i:i-2,x:rt(U,s)})}else(t||s)&&I.push("translate("+t+Q+s+F)}(s.translateX,s.translateY,I.translateX,I.translateY,g,i),function(B,Q,F,s){B!==Q?(B-Q>180?Q+=360:Q-B>180&&(B+=360),s.push({i:F.push(t(F)+"rotate(",null,U)-2,x:rt(B,Q)})):Q&&F.push(t(F)+"rotate("+Q+U)}(s.rotate,I.rotate,g,i),function(B,Q,F,s){B!==Q?s.push({i:F.push(t(F)+"skewX(",null,U)-2,x:rt(B,Q)}):Q&&F.push(t(F)+"skewX("+Q+U)}(s.skewX,I.skewX,g,i),function(B,Q,F,U,s,I){if(B!==F||Q!==U){var g=s.push(t(s)+"scale(",null,",",null,")");I.push({i:g-4,x:rt(B,F)},{i:g-2,x:rt(Q,U)})}else 1===F&&1===U||s.push(t(s)+"scale("+F+","+U+")")}(s.scaleX,s.scaleY,I.scaleX,I.scaleY,g,i),s=I=null,function(B){for(var Q,F=-1,U=i.length;++F<U;)g[(Q=i[F]).i]=Q.x(B);return g.join("")}}}var Nt=Et(function(B){const Q=new("function"==typeof DOMMatrix?DOMMatrix:WebKitCSSMatrix)(B+"");return Q.isIdentity?St:mt(Q.a,Q.b,Q.c,Q.d,Q.e,Q.f)},"px, ","px)","deg)"),Xt=Et(function(B){return null==B?St:(Vt||(Vt=document.createElementNS("http://www.w3.org/2000/svg","g")),Vt.setAttribute("transform",B),(B=Vt.transform.baseVal.consolidate())?mt((B=B.matrix).a,B.b,B.c,B.d,B.e,B.f):St)},", ",")",")");var pt=function(B){return function(Q,F){var U=B((Q=SU(Q)).h,(F=SU(F)).h),t=dt(Q.s,F.s),s=dt(Q.l,F.l),I=dt(Q.opacity,F.opacity);return function(B){return Q.h=U(B),Q.s=t(B),Q.l=s(B),Q.opacity=I(B),Q+""}}}(et);var Wt=function(B){return function(Q,F){var U=B((Q=PU(Q)).h,(F=PU(F)).h),t=dt(Q.c,F.c),s=dt(Q.l,F.l),I=dt(Q.opacity,F.opacity);return function(B){return Q.h=U(B),Q.c=t(B),Q.l=s(B),Q.opacity=I(B),Q+""}}}(et);function Ht(B){return function Q(F){function U(Q,U){var t=B((Q=It(Q)).h,(U=It(U)).h),s=dt(Q.s,U.s),I=dt(Q.l,U.l),g=dt(Q.opacity,U.opacity);return function(B){return Q.h=t(B),Q.s=s(B),Q.l=I(Math.pow(B,F)),Q.opacity=g(B),Q+""}}return F=+F,U.gamma=Q,U}(1)}Ht(et);var Dt=Ht(dt);function Yt(B,Q){void 0===Q&&(Q=B,B=Rt);for(var F=0,U=Q.length-1,t=Q[0],s=new Array(U<0?0:U);F<U;)s[F]=B(t,t=Q[++F]);return function(B){var Q=Math.max(0,Math.min(U-1,Math.floor(B*=U)));return s[Q](B-Q)}}function ft(B,Q){for(var F=new Array(Q),U=0;U<Q;++U)F[U]=B(U/(Q-1));return F}var wt,Jt,vt=0,kt=0,Mt=0,Tt=0,zt=0,Kt=0,Ot="object"==typeof performance&&performance.now?performance:Date,Pt="object"==typeof window&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(B){setTimeout(B,17)};function jt(){return zt||(Pt(_t),zt=Ot.now()+Kt)}function _t(){zt=0}function $t(){this._call=this._time=this._next=null}function qt(B,Q,F){var U=new $t;return U.restart(B,Q,F),U}function Bs(){zt=(Tt=Ot.now())+Kt,vt=kt=0;try{!function(){jt(),++vt;for(var B,Q=wt;Q;)(B=zt-Q._time)>=0&&Q._call.call(void 0,B),Q=Q._next;--vt}()}finally{vt=0,function(){var B,Q,F=wt,U=1/0;for(;F;)F._call?(U>F._time&&(U=F._time),B=F,F=F._next):(Q=F._next,F._next=null,F=B?B._next=Q:wt=Q);Jt=B,Fs(U)}(),zt=0}}function Qs(){var B=Ot.now(),Q=B-Tt;Q>1e3&&(Kt-=Q,Tt=B)}function Fs(B){vt||(kt&&(kt=clearTimeout(kt)),B-zt>24?(B<1/0&&(kt=setTimeout(Bs,B-Ot.now()-Kt)),Mt&&(Mt=clearInterval(Mt))):(Mt||(Tt=Ot.now(),Mt=setInterval(Qs,1e3)),vt=1,Pt(Bs)))}function Us(B,Q,F){var U=new $t;return Q=null==Q?0:+Q,U.restart(F=>{U.stop(),B(F+Q)},Q,F),U}$t.prototype=qt.prototype={constructor:$t,restart:function(B,Q,F){if("function"!=typeof B)throw new TypeError("callback is not a function");F=(null==F?jt():+F)+(null==Q?0:+Q),this._next||Jt===this||(Jt?Jt._next=this:wt=this,Jt=this),this._call=B,this._time=F,Fs()},stop:function(){this._call&&(this._call=null,this._time=1/0,Fs())}};var ts=AQ("start","end","cancel","interrupt"),ss=[];function Is(B,Q,F,U,t,s){var I=B.__transition;if(I){if(F in I)return}else B.__transition={};!function(B,Q,F){var U,t=B.__transition;function s(B){F.state=1,F.timer.restart(I,F.delay,F.time),F.delay<=B&&I(B-F.delay)}function I(s){var l,c,e,n;if(1!==F.state)return i();for(l in t)if((n=t[l]).name===F.name){if(3===n.state)return Us(I);4===n.state?(n.state=6,n.timer.stop(),n.on.call("interrupt",B,B.__data__,n.index,n.group),delete t[l]):+l<Q&&(n.state=6,n.timer.stop(),n.on.call("cancel",B,B.__data__,n.index,n.group),delete t[l])}if(Us(function(){3===F.state&&(F.state=4,F.timer.restart(g,F.delay,F.time),g(s))}),F.state=2,F.on.call("start",B,B.__data__,F.index,F.group),2===F.state){for(F.state=3,U=new Array(e=F.tween.length),l=0,c=-1;l<e;++l)(n=F.tween[l].value.call(B,B.__data__,F.index,F.group))&&(U[++c]=n);U.length=c+1}}function g(Q){for(var t=Q<F.duration?F.ease.call(null,Q/F.duration):(F.timer.restart(i),F.state=5,1),s=-1,I=U.length;++s<I;)U[s].call(B,t);5===F.state&&(F.on.call("end",B,B.__data__,F.index,F.group),i())}function i(){for(var U in F.state=6,F.timer.stop(),delete t[Q],t)return;delete B.__transition}t[Q]=F,F.timer=qt(s,0,F.time)}(B,F,{name:Q,index:U,group:t,on:ts,tween:ss,time:s.time,delay:s.delay,duration:s.duration,ease:s.ease,timer:null,state:0})}function gs(B,Q){var F=ls(B,Q);if(F.state>0)throw new Error("too late; already scheduled");return F}function is(B,Q){var F=ls(B,Q);if(F.state>3)throw new Error("too late; already running");return F}function ls(B,Q){var F=B.__transition;if(!F||!(F=F[Q]))throw new Error("transition not found");return F}function cs(B,Q){var F,U;return function(){var t=is(this,B),s=t.tween;if(s!==F)for(var I=0,g=(U=F=s).length;I<g;++I)if(U[I].name===Q){(U=U.slice()).splice(I,1);break}t.tween=U}}function es(B,Q,F){var U,t;if("function"!=typeof F)throw new Error;return function(){var s=is(this,B),I=s.tween;if(I!==U){t=(U=I).slice();for(var g={name:Q,value:F},i=0,l=t.length;i<l;++i)if(t[i].name===Q){t[i]=g;break}i===l&&t.push(g)}s.tween=t}}function ns(B,Q,F){var U=B._id;return B.each(function(){var B=is(this,U);(B.value||(B.value={}))[Q]=F.apply(this,arguments)}),function(B){return ls(B,U).value[Q]}}function ds(B,Q){var F;return("number"==typeof Q?rt:Q instanceof bU?Ct:(F=bU(Q))?(Q=F,Ct):ht)(B,Q)}function Cs(B){return function(){this.removeAttribute(B)}}function as(B){return function(){this.removeAttributeNS(B.space,B.local)}}function bs(B,Q,F){var U,t,s=F+"";return function(){var I=this.getAttribute(B);return I===s?null:I===U?t:t=Q(U=I,F)}}function os(B,Q,F){var U,t,s=F+"";return function(){var I=this.getAttributeNS(B.space,B.local);return I===s?null:I===U?t:t=Q(U=I,F)}}function Gs(B,Q,F){var U,t,s;return function(){var I,g,i=F(this);if(null!=i)return(I=this.getAttribute(B))===(g=i+"")?null:I===U&&g===t?s:(t=g,s=Q(U=I,i));this.removeAttribute(B)}}function us(B,Q,F){var U,t,s;return function(){var I,g,i=F(this);if(null!=i)return(I=this.getAttributeNS(B.space,B.local))===(g=i+"")?null:I===U&&g===t?s:(t=g,s=Q(U=I,i));this.removeAttributeNS(B.space,B.local)}}function rs(B,Q){var F,U;function t(){var t=Q.apply(this,arguments);return t!==U&&(F=(U=t)&&function(B,Q){return function(F){this.setAttributeNS(B.space,B.local,Q.call(this,F))}}(B,t)),F}return t._value=Q,t}function xs(B,Q){var F,U;function t(){var t=Q.apply(this,arguments);return t!==U&&(F=(U=t)&&function(B,Q){return function(F){this.setAttribute(B,Q.call(this,F))}}(B,t)),F}return t._value=Q,t}function Ls(B,Q){return function(){gs(this,B).delay=+Q.apply(this,arguments)}}function As(B,Q){return Q=+Q,function(){gs(this,B).delay=Q}}function hs(B,Q){return function(){is(this,B).duration=+Q.apply(this,arguments)}}function Rs(B,Q){return Q=+Q,function(){is(this,B).duration=Q}}var ys=YF.prototype.constructor;function Vs(B){return function(){this.style.removeProperty(B)}}var Zs=0;function Ss(B,Q,F,U){this._groups=B,this._parents=Q,this._name=F,this._id=U}function ms(){return++Zs}var Es=YF.prototype;Ss.prototype={constructor:Ss,select:function(B){var Q=this._name,F=this._id;"function"!=typeof B&&(B=pQ(B));for(var U=this._groups,t=U.length,s=new Array(t),I=0;I<t;++I)for(var g,i,l=U[I],c=l.length,e=s[I]=new Array(c),n=0;n<c;++n)(g=l[n])&&(i=B.call(g,g.__data__,n,l))&&("__data__"in g&&(i.__data__=g.__data__),e[n]=i,Is(e[n],Q,F,n,e,ls(g,F)));return new Ss(s,this._parents,Q,F)},selectAll:function(B){var Q=this._name,F=this._id;"function"!=typeof B&&(B=HQ(B));for(var U=this._groups,t=U.length,s=[],I=[],g=0;g<t;++g)for(var i,l=U[g],c=l.length,e=0;e<c;++e)if(i=l[e]){for(var n,d=B.call(i,i.__data__,e,l),C=ls(i,F),a=0,b=d.length;a<b;++a)(n=d[a])&&Is(n,Q,F,a,d,C);s.push(d),I.push(i)}return new Ss(s,I,Q,F)},selectChild:Es.selectChild,selectChildren:Es.selectChildren,filter:function(B){"function"!=typeof B&&(B=YQ(B));for(var Q=this._groups,F=Q.length,U=new Array(F),t=0;t<F;++t)for(var s,I=Q[t],g=I.length,i=U[t]=[],l=0;l<g;++l)(s=I[l])&&B.call(s,s.__data__,l,I)&&i.push(s);return new Ss(U,this._parents,this._name,this._id)},merge:function(B){if(B._id!==this._id)throw new Error;for(var Q=this._groups,F=B._groups,U=Q.length,t=F.length,s=Math.min(U,t),I=new Array(U),g=0;g<s;++g)for(var i,l=Q[g],c=F[g],e=l.length,n=I[g]=new Array(e),d=0;d<e;++d)(i=l[d]||c[d])&&(n[d]=i);for(;g<U;++g)I[g]=Q[g];return new Ss(I,this._parents,this._name,this._id)},selection:function(){return new ys(this._groups,this._parents)},transition:function(){for(var B=this._name,Q=this._id,F=ms(),U=this._groups,t=U.length,s=0;s<t;++s)for(var I,g=U[s],i=g.length,l=0;l<i;++l)if(I=g[l]){var c=ls(I,Q);Is(I,B,F,l,g,{time:c.time+c.delay+c.duration,delay:0,duration:c.duration,ease:c.ease})}return new Ss(U,this._parents,B,F)},call:Es.call,nodes:Es.nodes,node:Es.node,size:Es.size,empty:Es.empty,each:Es.each,on:function(B,Q){var F=this._id;return arguments.length<2?ls(this.node(),F).on.on(B):this.each(function(B,Q,F){var U,t,s=function(B){return(B+"").trim().split(/^|\s+/).every(function(B){var Q=B.indexOf(".");return Q>=0&&(B=B.slice(0,Q)),!B||"start"===B})}(Q)?gs:is;return function(){var I=s(this,B),g=I.on;g!==U&&(t=(U=g).copy()).on(Q,F),I.on=t}}(F,B,Q))},attr:function(B,Q){var F=SQ(B),U="transform"===F?Xt:ds;return this.attrTween(B,"function"==typeof Q?(F.local?us:Gs)(F,U,ns(this,"attr."+B,Q)):null==Q?(F.local?as:Cs)(F):(F.local?os:bs)(F,U,Q))},attrTween:function(B,Q){var F="attr."+B;if(arguments.length<2)return(F=this.tween(F))&&F._value;if(null==Q)return this.tween(F,null);if("function"!=typeof Q)throw new Error;var U=SQ(B);return this.tween(F,(U.local?rs:xs)(U,Q))},style:function(B,Q,F){var U="transform"==(B+="")?Nt:ds;return null==Q?this.styleTween(B,function(B,Q){var F,U,t;return function(){var s=gF(this,B),I=(this.style.removeProperty(B),gF(this,B));return s===I?null:s===F&&I===U?t:t=Q(F=s,U=I)}}(B,U)).on("end.style."+B,Vs(B)):"function"==typeof Q?this.styleTween(B,function(B,Q,F){var U,t,s;return function(){var I=gF(this,B),g=F(this),i=g+"";return null==g&&(this.style.removeProperty(B),i=g=gF(this,B)),I===i?null:I===U&&i===t?s:(t=i,s=Q(U=I,g))}}(B,U,ns(this,"style."+B,Q))).each(function(B,Q){var F,U,t,s,I="style."+Q,g="end."+I;return function(){var i=is(this,B),l=i.on,c=null==i.value[I]?s||(s=Vs(Q)):void 0;l===F&&t===c||(U=(F=l).copy()).on(g,t=c),i.on=U}}(this._id,B)):this.styleTween(B,function(B,Q,F){var U,t,s=F+"";return function(){var I=gF(this,B);return I===s?null:I===U?t:t=Q(U=I,F)}}(B,U,Q),F).on("end.style."+B,null)},styleTween:function(B,Q,F){var U="style."+(B+="");if(arguments.length<2)return(U=this.tween(U))&&U._value;if(null==Q)return this.tween(U,null);if("function"!=typeof Q)throw new Error;return this.tween(U,function(B,Q,F){var U,t;function s(){var s=Q.apply(this,arguments);return s!==t&&(U=(t=s)&&function(B,Q,F){return function(U){this.style.setProperty(B,Q.call(this,U),F)}}(B,s,F)),U}return s._value=Q,s}(B,Q,null==F?"":F))},text:function(B){return this.tween("text","function"==typeof B?function(B){return function(){var Q=B(this);this.textContent=null==Q?"":Q}}(ns(this,"text",B)):function(B){return function(){this.textContent=B}}(null==B?"":B+""))},textTween:function(B){var Q="text";if(arguments.length<1)return(Q=this.tween(Q))&&Q._value;if(null==B)return this.tween(Q,null);if("function"!=typeof B)throw new Error;return this.tween(Q,function(B){var Q,F;function U(){var U=B.apply(this,arguments);return U!==F&&(Q=(F=U)&&function(B){return function(Q){this.textContent=B.call(this,Q)}}(U)),Q}return U._value=B,U}(B))},remove:function(){return this.on("end.remove",function(B){return function(){var Q=this.parentNode;for(var F in this.__transition)if(+F!==B)return;Q&&Q.removeChild(this)}}(this._id))},tween:function(B,Q){var F=this._id;if(B+="",arguments.length<2){for(var U,t=ls(this.node(),F).tween,s=0,I=t.length;s<I;++s)if((U=t[s]).name===B)return U.value;return null}return this.each((null==Q?cs:es)(F,B,Q))},delay:function(B){var Q=this._id;return arguments.length?this.each(("function"==typeof B?Ls:As)(Q,B)):ls(this.node(),Q).delay},duration:function(B){var Q=this._id;return arguments.length?this.each(("function"==typeof B?hs:Rs)(Q,B)):ls(this.node(),Q).duration},ease:function(B){var Q=this._id;return arguments.length?this.each(function(B,Q){if("function"!=typeof Q)throw new Error;return function(){is(this,B).ease=Q}}(Q,B)):ls(this.node(),Q).ease},easeVarying:function(B){if("function"!=typeof B)throw new Error;return this.each(function(B,Q){return function(){var F=Q.apply(this,arguments);if("function"!=typeof F)throw new Error;is(this,B).ease=F}}(this._id,B))},end:function(){var B,Q,F=this,U=F._id,t=F.size();return new Promise(function(s,I){var g={value:I},i={value:function(){0===--t&&s()}};F.each(function(){var F=is(this,U),t=F.on;t!==B&&((Q=(B=t).copy())._.cancel.push(g),Q._.interrupt.push(g),Q._.end.push(i)),F.on=Q}),0===t&&s()})},[Symbol.iterator]:Es[Symbol.iterator]};const Ns=B=>+B;function Xs(B){return--B*B*B+1}var ps={time:null,delay:0,duration:250,ease:function(B){return((B*=2)<=1?B*B*B:(B-=2)*B*B+2)/2}};function Ws(B,Q){for(var F;!(F=B.__transition)||!(F=F[Q]);)if(!(B=B.parentNode))throw new Error(`transition ${Q} not found`);return F}YF.prototype.interrupt=function(B){return this.each(function(){!function(B,Q){var F,U,t,s=B.__transition,I=!0;if(s){for(t in Q=null==Q?null:Q+"",s)(F=s[t]).name===Q?(U=F.state>2&&F.state<5,F.state=6,F.timer.stop(),F.on.call(U?"interrupt":"cancel",B,B.__data__,F.index,F.group),delete s[t]):I=!1;I&&delete B.__transition}}(this,B)})},YF.prototype.transition=function(B){var Q,F;B instanceof Ss?(Q=B._id,B=B._name):(Q=ms(),(F=ps).time=jt(),B=null==B?null:B+"");for(var U=this._groups,t=U.length,s=0;s<t;++s)for(var I,g=U[s],i=g.length,l=0;l<i;++l)(I=g[l])&&Is(I,B,Q,l,g,F||Ws(I,Q));return new Ss(U,this._parents,B,Q)};const Hs=Math.PI,Ds=2*Hs,Ys=1e-6,fs=Ds-Ys;function ws(B){this._+=B[0];for(let Q=1,F=B.length;Q<F;++Q)this._+=arguments[Q]+B[Q]}class Js{constructor(B){this._x0=this._y0=this._x1=this._y1=null,this._="",this._append=null==B?ws:function(B){let Q=Math.floor(B);if(!(Q>=0))throw new Error(`invalid digits: ${B}`);if(Q>15)return ws;const F=10**Q;return function(B){this._+=B[0];for(let Q=1,U=B.length;Q<U;++Q)this._+=Math.round(arguments[Q]*F)/F+B[Q]}}(B)}moveTo(B,Q){this._append`M${this._x0=this._x1=+B},${this._y0=this._y1=+Q}`}closePath(){null!==this._x1&&(this._x1=this._x0,this._y1=this._y0,this._append`Z`)}lineTo(B,Q){this._append`L${this._x1=+B},${this._y1=+Q}`}quadraticCurveTo(B,Q,F,U){this._append`Q${+B},${+Q},${this._x1=+F},${this._y1=+U}`}bezierCurveTo(B,Q,F,U,t,s){this._append`C${+B},${+Q},${+F},${+U},${this._x1=+t},${this._y1=+s}`}arcTo(B,Q,F,U,t){if(B=+B,Q=+Q,F=+F,U=+U,(t=+t)<0)throw new Error(`negative radius: ${t}`);let s=this._x1,I=this._y1,g=F-B,i=U-Q,l=s-B,c=I-Q,e=l*l+c*c;if(null===this._x1)this._append`M${this._x1=B},${this._y1=Q}`;else if(e>Ys)if(Math.abs(c*g-i*l)>Ys&&t){let n=F-s,d=U-I,C=g*g+i*i,a=n*n+d*d,b=Math.sqrt(C),o=Math.sqrt(e),G=t*Math.tan((Hs-Math.acos((C+e-a)/(2*b*o)))/2),u=G/o,r=G/b;Math.abs(u-1)>Ys&&this._append`L${B+u*l},${Q+u*c}`,this._append`A${t},${t},0,0,${+(c*n>l*d)},${this._x1=B+r*g},${this._y1=Q+r*i}`}else this._append`L${this._x1=B},${this._y1=Q}`;else;}arc(B,Q,F,U,t,s){if(B=+B,Q=+Q,s=!!s,(F=+F)<0)throw new Error(`negative radius: ${F}`);let I=F*Math.cos(U),g=F*Math.sin(U),i=B+I,l=Q+g,c=1^s,e=s?U-t:t-U;null===this._x1?this._append`M${i},${l}`:(Math.abs(this._x1-i)>Ys||Math.abs(this._y1-l)>Ys)&&this._append`L${i},${l}`,F&&(e<0&&(e=e%Ds+Ds),e>fs?this._append`A${F},${F},0,1,${c},${B-I},${Q-g}A${F},${F},0,1,${c},${this._x1=i},${this._y1=l}`:e>Ys&&this._append`A${F},${F},0,${+(e>=Hs)},${c},${this._x1=B+F*Math.cos(t)},${this._y1=Q+F*Math.sin(t)}`)}rect(B,Q,F,U){this._append`M${this._x0=this._x1=+B},${this._y0=this._y1=+Q}h${F=+F}v${+U}h${-F}Z`}toString(){return this._}}function vs(B=3){return new Js(+B)}function ks(B,Q){if((F=(B=Q?B.toExponential(Q-1):B.toExponential()).indexOf("e"))<0)return null;var F,U=B.slice(0,F);return[U.length>1?U[0]+U.slice(2):U,+B.slice(F+1)]}function Ms(B){return(B=ks(Math.abs(B)))?B[1]:NaN}var Ts,zs=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function Ks(B){if(!(Q=zs.exec(B)))throw new Error("invalid format: "+B);var Q;return new Os({fill:Q[1],align:Q[2],sign:Q[3],symbol:Q[4],zero:Q[5],width:Q[6],comma:Q[7],precision:Q[8]&&Q[8].slice(1),trim:Q[9],type:Q[10]})}function Os(B){this.fill=void 0===B.fill?" ":B.fill+"",this.align=void 0===B.align?">":B.align+"",this.sign=void 0===B.sign?"-":B.sign+"",this.symbol=void 0===B.symbol?"":B.symbol+"",this.zero=!!B.zero,this.width=void 0===B.width?void 0:+B.width,this.comma=!!B.comma,this.precision=void 0===B.precision?void 0:+B.precision,this.trim=!!B.trim,this.type=void 0===B.type?"":B.type+""}function Ps(B,Q){var F=ks(B,Q);if(!F)return B+"";var U=F[0],t=F[1];return t<0?"0."+new Array(-t).join("0")+U:U.length>t+1?U.slice(0,t+1)+"."+U.slice(t+1):U+new Array(t-U.length+2).join("0")}Ks.prototype=Os.prototype,Os.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};var js={"%":(B,Q)=>(100*B).toFixed(Q),b:B=>Math.round(B).toString(2),c:B=>B+"",d:function(B){return Math.abs(B=Math.round(B))>=1e21?B.toLocaleString("en").replace(/,/g,""):B.toString(10)},e:(B,Q)=>B.toExponential(Q),f:(B,Q)=>B.toFixed(Q),g:(B,Q)=>B.toPrecision(Q),o:B=>Math.round(B).toString(8),p:(B,Q)=>Ps(100*B,Q),r:Ps,s:function(B,Q){var F=ks(B,Q);if(!F)return B+"";var U=F[0],t=F[1],s=t-(Ts=3*Math.max(-8,Math.min(8,Math.floor(t/3))))+1,I=U.length;return s===I?U:s>I?U+new Array(s-I+1).join("0"):s>0?U.slice(0,s)+"."+U.slice(s):"0."+new Array(1-s).join("0")+ks(B,Math.max(0,Q+s-1))[0]},X:B=>Math.round(B).toString(16).toUpperCase(),x:B=>Math.round(B).toString(16)};function _s(B){return B}var $s,qs,BI,QI=Array.prototype.map,FI=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function UI(B){var Q,F,U=void 0===B.grouping||void 0===B.thousands?_s:(Q=QI.call(B.grouping,Number),F=B.thousands+"",function(B,U){for(var t=B.length,s=[],I=0,g=Q[0],i=0;t>0&&g>0&&(i+g+1>U&&(g=Math.max(1,U-i)),s.push(B.substring(t-=g,t+g)),!((i+=g+1)>U));)g=Q[I=(I+1)%Q.length];return s.reverse().join(F)}),t=void 0===B.currency?"":B.currency[0]+"",s=void 0===B.currency?"":B.currency[1]+"",I=void 0===B.decimal?".":B.decimal+"",g=void 0===B.numerals?_s:function(B){return function(Q){return Q.replace(/[0-9]/g,function(Q){return B[+Q]})}}(QI.call(B.numerals,String)),i=void 0===B.percent?"%":B.percent+"",l=void 0===B.minus?"−":B.minus+"",c=void 0===B.nan?"NaN":B.nan+"";function e(B){var Q=(B=Ks(B)).fill,F=B.align,e=B.sign,n=B.symbol,d=B.zero,C=B.width,a=B.comma,b=B.precision,o=B.trim,G=B.type;"n"===G?(a=!0,G="g"):js[G]||(void 0===b&&(b=12),o=!0,G="g"),(d||"0"===Q&&"="===F)&&(d=!0,Q="0",F="=");var u="$"===n?t:"#"===n&&/[boxX]/.test(G)?"0"+G.toLowerCase():"",r="$"===n?s:/[%p]/.test(G)?i:"",x=js[G],L=/[defgprs%]/.test(G);function A(B){var t,s,i,n=u,A=r;if("c"===G)A=x(B)+A,B="";else{var h=(B=+B)<0||1/B<0;if(B=isNaN(B)?c:x(Math.abs(B),b),o&&(B=function(B){B:for(var Q,F=B.length,U=1,t=-1;U<F;++U)switch(B[U]){case".":t=Q=U;break;case"0":0===t&&(t=U),Q=U;break;default:if(!+B[U])break B;t>0&&(t=0)}return t>0?B.slice(0,t)+B.slice(Q+1):B}(B)),h&&0===+B&&"+"!==e&&(h=!1),n=(h?"("===e?e:l:"-"===e||"("===e?"":e)+n,A=("s"===G?FI[8+Ts/3]:"")+A+(h&&"("===e?")":""),L)for(t=-1,s=B.length;++t<s;)if(48>(i=B.charCodeAt(t))||i>57){A=(46===i?I+B.slice(t+1):B.slice(t))+A,B=B.slice(0,t);break}}a&&!d&&(B=U(B,1/0));var R=n.length+B.length+A.length,y=R<C?new Array(C-R+1).join(Q):"";switch(a&&d&&(B=U(y+B,y.length?C-A.length:1/0),y=""),F){case"<":B=n+B+A+y;break;case"=":B=n+y+B+A;break;case"^":B=y.slice(0,R=y.length>>1)+n+B+A+y.slice(R);break;default:B=y+n+B+A}return g(B)}return b=void 0===b?6:/[gprs]/.test(G)?Math.max(1,Math.min(21,b)):Math.max(0,Math.min(20,b)),A.toString=function(){return B+""},A}return{format:e,formatPrefix:function(B,Q){var F=e(((B=Ks(B)).type="f",B)),U=3*Math.max(-8,Math.min(8,Math.floor(Ms(Q)/3))),t=Math.pow(10,-U),s=FI[8+U/3];return function(B){return F(t*B)+s}}}}$s=UI({thousands:",",grouping:[3],currency:["$",""]}),qs=$s.format,BI=$s.formatPrefix;var tI=1e-6,sI=Math.PI,II=sI/2,gI=sI/4,iI=2*sI,lI=180/sI,cI=sI/180,eI=Math.abs,nI=Math.atan,dI=Math.atan2,CI=Math.cos,aI=Math.exp,bI=Math.log,oI=Math.pow,GI=Math.sin,uI=Math.sign||function(B){return B>0?1:B<0?-1:0},rI=Math.sqrt,xI=Math.tan;function LI(B){return B>1?0:B<-1?sI:Math.acos(B)}function AI(B){return B>1?II:B<-1?-II:Math.asin(B)}function hI(){}function RI(B,Q){B&&VI.hasOwnProperty(B.type)&&VI[B.type](B,Q)}var yI={Feature:function(B,Q){RI(B.geometry,Q)},FeatureCollection:function(B,Q){for(var F=B.features,U=-1,t=F.length;++U<t;)RI(F[U].geometry,Q)}},VI={Sphere:function(B,Q){Q.sphere()},Point:function(B,Q){B=B.coordinates,Q.point(B[0],B[1],B[2])},MultiPoint:function(B,Q){for(var F=B.coordinates,U=-1,t=F.length;++U<t;)B=F[U],Q.point(B[0],B[1],B[2])},LineString:function(B,Q){ZI(B.coordinates,Q,0)},MultiLineString:function(B,Q){for(var F=B.coordinates,U=-1,t=F.length;++U<t;)ZI(F[U],Q,0)},Polygon:function(B,Q){SI(B.coordinates,Q)},MultiPolygon:function(B,Q){for(var F=B.coordinates,U=-1,t=F.length;++U<t;)SI(F[U],Q)},GeometryCollection:function(B,Q){for(var F=B.geometries,U=-1,t=F.length;++U<t;)RI(F[U],Q)}};function ZI(B,Q,F){var U,t=-1,s=B.length-F;for(Q.lineStart();++t<s;)U=B[t],Q.point(U[0],U[1],U[2]);Q.lineEnd()}function SI(B,Q){var F=-1,U=B.length;for(Q.polygonStart();++F<U;)ZI(B[F],Q,1);Q.polygonEnd()}function mI(B,Q){B&&yI.hasOwnProperty(B.type)?yI[B.type](B,Q):RI(B,Q)}function EI(B){return[dI(B[1],B[0]),AI(B[2])]}function NI(B){var Q=B[0],F=B[1],U=CI(F);return[U*CI(Q),U*GI(Q),GI(F)]}function XI(B,Q){return B[0]*Q[0]+B[1]*Q[1]+B[2]*Q[2]}function pI(B,Q){return[B[1]*Q[2]-B[2]*Q[1],B[2]*Q[0]-B[0]*Q[2],B[0]*Q[1]-B[1]*Q[0]]}function WI(B,Q){B[0]+=Q[0],B[1]+=Q[1],B[2]+=Q[2]}function HI(B,Q){return[B[0]*Q,B[1]*Q,B[2]*Q]}function DI(B){var Q=rI(B[0]*B[0]+B[1]*B[1]+B[2]*B[2]);B[0]/=Q,B[1]/=Q,B[2]/=Q}function YI(B,Q){function F(F,U){return F=B(F,U),Q(F[0],F[1])}return B.invert&&Q.invert&&(F.invert=function(F,U){return(F=Q.invert(F,U))&&B.invert(F[0],F[1])}),F}function fI(B,Q){return eI(B)>sI&&(B-=Math.round(B/iI)*iI),[B,Q]}function wI(B,Q,F){return(B%=iI)?Q||F?YI(vI(B),kI(Q,F)):vI(B):Q||F?kI(Q,F):fI}function JI(B){return function(Q,F){return eI(Q+=B)>sI&&(Q-=Math.round(Q/iI)*iI),[Q,F]}}function vI(B){var Q=JI(B);return Q.invert=JI(-B),Q}function kI(B,Q){var F=CI(B),U=GI(B),t=CI(Q),s=GI(Q);function I(B,Q){var I=CI(Q),g=CI(B)*I,i=GI(B)*I,l=GI(Q),c=l*F+g*U;return[dI(i*t-c*s,g*F-l*U),AI(c*t+i*s)]}return I.invert=function(B,Q){var I=CI(Q),g=CI(B)*I,i=GI(B)*I,l=GI(Q),c=l*t-i*s;return[dI(i*t+l*s,g*F+c*U),AI(c*F-g*U)]},I}function MI(B,Q){(Q=NI(Q))[0]-=B,DI(Q);var F=LI(-Q[1]);return((-Q[2]<0?-F:F)+iI-tI)%iI}function TI(){var B,Q=[];return{point:function(Q,F,U){B.push([Q,F,U])},lineStart:function(){Q.push(B=[])},lineEnd:hI,rejoin:function(){Q.length>1&&Q.push(Q.pop().concat(Q.shift()))},result:function(){var F=Q;return Q=[],B=null,F}}}function zI(B,Q){return eI(B[0]-Q[0])<tI&&eI(B[1]-Q[1])<tI}function KI(B,Q,F,U){this.x=B,this.z=Q,this.o=F,this.e=U,this.v=!1,this.n=this.p=null}function OI(B,Q,F,U,t){var s,I,g=[],i=[];if(B.forEach(function(B){if(!((Q=B.length-1)<=0)){var Q,F,U=B[0],I=B[Q];if(zI(U,I)){if(!U[2]&&!I[2]){for(t.lineStart(),s=0;s<Q;++s)t.point((U=B[s])[0],U[1]);return void t.lineEnd()}I[0]+=2e-6}g.push(F=new KI(U,B,null,!0)),i.push(F.o=new KI(U,null,F,!1)),g.push(F=new KI(I,B,null,!1)),i.push(F.o=new KI(I,null,F,!0))}}),g.length){for(i.sort(Q),PI(g),PI(i),s=0,I=i.length;s<I;++s)i[s].e=F=!F;for(var l,c,e=g[0];;){for(var n=e,d=!0;n.v;)if((n=n.n)===e)return;l=n.z,t.lineStart();do{if(n.v=n.o.v=!0,n.e){if(d)for(s=0,I=l.length;s<I;++s)t.point((c=l[s])[0],c[1]);else U(n.x,n.n.x,1,t);n=n.n}else{if(d)for(l=n.p.z,s=l.length-1;s>=0;--s)t.point((c=l[s])[0],c[1]);else U(n.x,n.p.x,-1,t);n=n.p}l=(n=n.o).z,d=!d}while(!n.v);t.lineEnd()}}}function PI(B){if(Q=B.length){for(var Q,F,U=0,t=B[0];++U<Q;)t.n=F=B[U],F.p=t,t=F;t.n=F=B[0],F.p=t}}function jI(B){return eI(B[0])<=sI?B[0]:uI(B[0])*((eI(B[0])+sI)%iI-sI)}function _I(B,Q,F,U){return function(t){var s,I,g,i=Q(t),l=TI(),c=Q(l),e=!1,n={point:d,lineStart:a,lineEnd:b,polygonStart:function(){n.point=o,n.lineStart=G,n.lineEnd=u,I=[],s=[]},polygonEnd:function(){n.point=d,n.lineStart=a,n.lineEnd=b,I=gQ(I);var B=function(B,Q){var F=jI(Q),U=Q[1],t=GI(U),s=[GI(F),-CI(F),0],I=0,g=0,i=new hB;1===t?U=II+tI:-1===t&&(U=-II-tI);for(var l=0,c=B.length;l<c;++l)if(n=(e=B[l]).length)for(var e,n,d=e[n-1],C=jI(d),a=d[1]/2+gI,b=GI(a),o=CI(a),G=0;G<n;++G,C=r,b=L,o=A,d=u){var u=e[G],r=jI(u),x=u[1]/2+gI,L=GI(x),A=CI(x),h=r-C,R=h>=0?1:-1,y=R*h,V=y>sI,Z=b*L;if(i.add(dI(Z*R*GI(y),o*A+Z*CI(y))),I+=V?h+R*iI:h,V^C>=F^r>=F){var S=pI(NI(d),NI(u));DI(S);var m=pI(s,S);DI(m);var E=(V^h>=0?-1:1)*AI(m[2]);(U>E||U===E&&(S[0]||S[1]))&&(g+=V^h>=0?1:-1)}}return(I<-1e-6||I<tI&&i<-1e-12)^1&g}(s,U);I.length?(e||(t.polygonStart(),e=!0),OI(I,qI,B,F,t)):B&&(e||(t.polygonStart(),e=!0),t.lineStart(),F(null,null,1,t),t.lineEnd()),e&&(t.polygonEnd(),e=!1),I=s=null},sphere:function(){t.polygonStart(),t.lineStart(),F(null,null,1,t),t.lineEnd(),t.polygonEnd()}};function d(Q,F){B(Q,F)&&t.point(Q,F)}function C(B,Q){i.point(B,Q)}function a(){n.point=C,i.lineStart()}function b(){n.point=d,i.lineEnd()}function o(B,Q){g.push([B,Q]),c.point(B,Q)}function G(){c.lineStart(),g=[]}function u(){o(g[0][0],g[0][1]),c.lineEnd();var B,Q,F,U,i=c.clean(),n=l.result(),d=n.length;if(g.pop(),s.push(g),g=null,d)if(1&i){if((Q=(F=n[0]).length-1)>0){for(e||(t.polygonStart(),e=!0),t.lineStart(),B=0;B<Q;++B)t.point((U=F[B])[0],U[1]);t.lineEnd()}}else d>1&&2&i&&n.push(n.pop().concat(n.shift())),I.push(n.filter($I))}return n}}function $I(B){return B.length>1}function qI(B,Q){return((B=B.x)[0]<0?B[1]-II-tI:II-B[1])-((Q=Q.x)[0]<0?Q[1]-II-tI:II-Q[1])}fI.invert=fI;var Bg=_I(function(){return!0},function(B){var Q,F=NaN,U=NaN,t=NaN;return{lineStart:function(){B.lineStart(),Q=1},point:function(s,I){var g=s>0?sI:-sI,i=eI(s-F);eI(i-sI)<tI?(B.point(F,U=(U+I)/2>0?II:-II),B.point(t,U),B.lineEnd(),B.lineStart(),B.point(g,U),B.point(s,U),Q=0):t!==g&&i>=sI&&(eI(F-t)<tI&&(F-=t*tI),eI(s-g)<tI&&(s-=g*tI),U=function(B,Q,F,U){var t,s,I=GI(B-F);return eI(I)>tI?nI((GI(Q)*(s=CI(U))*GI(F)-GI(U)*(t=CI(Q))*GI(B))/(t*s*I)):(Q+U)/2}(F,U,s,I),B.point(t,U),B.lineEnd(),B.lineStart(),B.point(g,U),Q=0),B.point(F=s,U=I),t=g},lineEnd:function(){B.lineEnd(),F=U=NaN},clean:function(){return 2-Q}}},function(B,Q,F,U){var t;if(null==B)t=F*II,U.point(-sI,t),U.point(0,t),U.point(sI,t),U.point(sI,0),U.point(sI,-t),U.point(0,-t),U.point(-sI,-t),U.point(-sI,0),U.point(-sI,t);else if(eI(B[0]-Q[0])>tI){var s=B[0]<Q[0]?sI:-sI;t=F*s/2,U.point(-s,t),U.point(0,t),U.point(s,t)}else U.point(Q[0],Q[1])},[-sI,-II]);function Qg(B){var Q=CI(B),F=2*cI,U=Q>0,t=eI(Q)>tI;function s(B,F){return CI(B)*CI(F)>Q}function I(B,F,U){var t=[1,0,0],s=pI(NI(B),NI(F)),I=XI(s,s),g=s[0],i=I-g*g;if(!i)return!U&&B;var l=Q*I/i,c=-Q*g/i,e=pI(t,s),n=HI(t,l);WI(n,HI(s,c));var d=e,C=XI(n,d),a=XI(d,d),b=C*C-a*(XI(n,n)-1);if(!(b<0)){var o=rI(b),G=HI(d,(-C-o)/a);if(WI(G,n),G=EI(G),!U)return G;var u,r=B[0],x=F[0],L=B[1],A=F[1];x<r&&(u=r,r=x,x=u);var h=x-r,R=eI(h-sI)<tI;if(!R&&A<L&&(u=L,L=A,A=u),R||h<tI?R?L+A>0^G[1]<(eI(G[0]-r)<tI?L:A):L<=G[1]&&G[1]<=A:h>sI^(r<=G[0]&&G[0]<=x)){var y=HI(d,(-C+o)/a);return WI(y,n),[G,EI(y)]}}}function g(Q,F){var t=U?B:sI-B,s=0;return Q<-t?s|=1:Q>t&&(s|=2),F<-t?s|=4:F>t&&(s|=8),s}return _I(s,function(B){var Q,F,i,l,c;return{lineStart:function(){l=i=!1,c=1},point:function(e,n){var d,C=[e,n],a=s(e,n),b=U?a?0:g(e,n):a?g(e+(e<0?sI:-sI),n):0;if(!Q&&(l=i=a)&&B.lineStart(),a!==i&&(!(d=I(Q,C))||zI(Q,d)||zI(C,d))&&(C[2]=1),a!==i)c=0,a?(B.lineStart(),d=I(C,Q),B.point(d[0],d[1])):(d=I(Q,C),B.point(d[0],d[1],2),B.lineEnd()),Q=d;else if(t&&Q&&U^a){var o;b&F||!(o=I(C,Q,!0))||(c=0,U?(B.lineStart(),B.point(o[0][0],o[0][1]),B.point(o[1][0],o[1][1]),B.lineEnd()):(B.point(o[1][0],o[1][1]),B.lineEnd(),B.lineStart(),B.point(o[0][0],o[0][1],3)))}!a||Q&&zI(Q,C)||B.point(C[0],C[1]),Q=C,i=a,F=b},lineEnd:function(){i&&B.lineEnd(),Q=null},clean:function(){return c|(l&&i)<<1}}},function(Q,U,t,s){!function(B,Q,F,U,t,s){if(F){var I=CI(Q),g=GI(Q),i=U*F;null==t?(t=Q+U*iI,s=Q-i/2):(t=MI(I,t),s=MI(I,s),(U>0?t<s:t>s)&&(t+=U*iI));for(var l,c=t;U>0?c>s:c<s;c-=i)l=EI([I,-g*CI(c),-g*GI(c)]),B.point(l[0],l[1])}}(s,B,F,t,Q,U)},U?[0,-B]:[-sI,B-sI])}var Fg=1e9,Ug=-Fg;function tg(B,Q,F,U){function t(t,s){return B<=t&&t<=F&&Q<=s&&s<=U}function s(t,s,g,l){var c=0,e=0;if(null==t||(c=I(t,g))!==(e=I(s,g))||i(t,s)<0^g>0)do{l.point(0===c||3===c?B:F,c>1?U:Q)}while((c=(c+g+4)%4)!==e);else l.point(s[0],s[1])}function I(U,t){return eI(U[0]-B)<tI?t>0?0:3:eI(U[0]-F)<tI?t>0?2:1:eI(U[1]-Q)<tI?t>0?1:0:t>0?3:2}function g(B,Q){return i(B.x,Q.x)}function i(B,Q){var F=I(B,1),U=I(Q,1);return F!==U?F-U:0===F?Q[1]-B[1]:1===F?B[0]-Q[0]:2===F?B[1]-Q[1]:Q[0]-B[0]}return function(I){var i,l,c,e,n,d,C,a,b,o,G,u=I,r=TI(),x={point:L,lineStart:function(){x.point=A,l&&l.push(c=[]);o=!0,b=!1,C=a=NaN},lineEnd:function(){i&&(A(e,n),d&&b&&r.rejoin(),i.push(r.result()));x.point=L,b&&u.lineEnd()},polygonStart:function(){u=r,i=[],l=[],G=!0},polygonEnd:function(){var Q=function(){for(var Q=0,F=0,t=l.length;F<t;++F)for(var s,I,g=l[F],i=1,c=g.length,e=g[0],n=e[0],d=e[1];i<c;++i)s=n,I=d,n=(e=g[i])[0],d=e[1],I<=U?d>U&&(n-s)*(U-I)>(d-I)*(B-s)&&++Q:d<=U&&(n-s)*(U-I)<(d-I)*(B-s)&&--Q;return Q}(),F=G&&Q,t=(i=gQ(i)).length;(F||t)&&(I.polygonStart(),F&&(I.lineStart(),s(null,null,1,I),I.lineEnd()),t&&OI(i,g,Q,s,I),I.polygonEnd());u=I,i=l=c=null}};function L(B,Q){t(B,Q)&&u.point(B,Q)}function A(s,I){var g=t(s,I);if(l&&c.push([s,I]),o)e=s,n=I,d=g,o=!1,g&&(u.lineStart(),u.point(s,I));else if(g&&b)u.point(s,I);else{var i=[C=Math.max(Ug,Math.min(Fg,C)),a=Math.max(Ug,Math.min(Fg,a))],r=[s=Math.max(Ug,Math.min(Fg,s)),I=Math.max(Ug,Math.min(Fg,I))];!function(B,Q,F,U,t,s){var I,g=B[0],i=B[1],l=0,c=1,e=Q[0]-g,n=Q[1]-i;if(I=F-g,e||!(I>0)){if(I/=e,e<0){if(I<l)return;I<c&&(c=I)}else if(e>0){if(I>c)return;I>l&&(l=I)}if(I=t-g,e||!(I<0)){if(I/=e,e<0){if(I>c)return;I>l&&(l=I)}else if(e>0){if(I<l)return;I<c&&(c=I)}if(I=U-i,n||!(I>0)){if(I/=n,n<0){if(I<l)return;I<c&&(c=I)}else if(n>0){if(I>c)return;I>l&&(l=I)}if(I=s-i,n||!(I<0)){if(I/=n,n<0){if(I>c)return;I>l&&(l=I)}else if(n>0){if(I<l)return;I<c&&(c=I)}return l>0&&(B[0]=g+l*e,B[1]=i+l*n),c<1&&(Q[0]=g+c*e,Q[1]=i+c*n),!0}}}}}(i,r,B,Q,F,U)?g&&(u.lineStart(),u.point(s,I),G=!1):(b||(u.lineStart(),u.point(i[0],i[1])),u.point(r[0],r[1]),g||u.lineEnd(),G=!1)}C=s,a=I,b=g}return x}}var sg,Ig,gg,ig,lg=B=>B,cg=new hB,eg=new hB,ng={point:hI,lineStart:hI,lineEnd:hI,polygonStart:function(){ng.lineStart=dg,ng.lineEnd=bg},polygonEnd:function(){ng.lineStart=ng.lineEnd=ng.point=hI,cg.add(eI(eg)),eg=new hB},result:function(){var B=cg/2;return cg=new hB,B}};function dg(){ng.point=Cg}function Cg(B,Q){ng.point=ag,sg=gg=B,Ig=ig=Q}function ag(B,Q){eg.add(ig*B-gg*Q),gg=B,ig=Q}function bg(){ag(sg,Ig)}var og=1/0,Gg=og,ug=-og,rg=ug,xg={point:function(B,Q){B<og&&(og=B);B>ug&&(ug=B);Q<Gg&&(Gg=Q);Q>rg&&(rg=Q)},lineStart:hI,lineEnd:hI,polygonStart:hI,polygonEnd:hI,result:function(){var B=[[og,Gg],[ug,rg]];return ug=rg=-(Gg=og=1/0),B}};var Lg,Ag,hg,Rg,yg=0,Vg=0,Zg=0,Sg=0,mg=0,Eg=0,Ng=0,Xg=0,pg=0,Wg={point:Hg,lineStart:Dg,lineEnd:wg,polygonStart:function(){Wg.lineStart=Jg,Wg.lineEnd=vg},polygonEnd:function(){Wg.point=Hg,Wg.lineStart=Dg,Wg.lineEnd=wg},result:function(){var B=pg?[Ng/pg,Xg/pg]:Eg?[Sg/Eg,mg/Eg]:Zg?[yg/Zg,Vg/Zg]:[NaN,NaN];return yg=Vg=Zg=Sg=mg=Eg=Ng=Xg=pg=0,B}};function Hg(B,Q){yg+=B,Vg+=Q,++Zg}function Dg(){Wg.point=Yg}function Yg(B,Q){Wg.point=fg,Hg(hg=B,Rg=Q)}function fg(B,Q){var F=B-hg,U=Q-Rg,t=rI(F*F+U*U);Sg+=t*(hg+B)/2,mg+=t*(Rg+Q)/2,Eg+=t,Hg(hg=B,Rg=Q)}function wg(){Wg.point=Hg}function Jg(){Wg.point=kg}function vg(){Mg(Lg,Ag)}function kg(B,Q){Wg.point=Mg,Hg(Lg=hg=B,Ag=Rg=Q)}function Mg(B,Q){var F=B-hg,U=Q-Rg,t=rI(F*F+U*U);Sg+=t*(hg+B)/2,mg+=t*(Rg+Q)/2,Eg+=t,Ng+=(t=Rg*B-hg*Q)*(hg+B),Xg+=t*(Rg+Q),pg+=3*t,Hg(hg=B,Rg=Q)}function Tg(B){this._context=B}Tg.prototype={_radius:4.5,pointRadius:function(B){return this._radius=B,this},polygonStart:function(){this._line=0},polygonEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){0===this._line&&this._context.closePath(),this._point=NaN},point:function(B,Q){switch(this._point){case 0:this._context.moveTo(B,Q),this._point=1;break;case 1:this._context.lineTo(B,Q);break;default:this._context.moveTo(B+this._radius,Q),this._context.arc(B,Q,this._radius,0,iI)}},result:hI};var zg,Kg,Og,Pg,jg,_g=new hB,$g={point:hI,lineStart:function(){$g.point=qg},lineEnd:function(){zg&&Bi(Kg,Og),$g.point=hI},polygonStart:function(){zg=!0},polygonEnd:function(){zg=null},result:function(){var B=+_g;return _g=new hB,B}};function qg(B,Q){$g.point=Bi,Kg=Pg=B,Og=jg=Q}function Bi(B,Q){Pg-=B,jg-=Q,_g.add(rI(Pg*Pg+jg*jg)),Pg=B,jg=Q}let Qi,Fi,Ui,ti;class si{constructor(B){this._append=null==B?Ii:function(B){const Q=Math.floor(B);if(!(Q>=0))throw new RangeError(`invalid digits: ${B}`);if(Q>15)return Ii;if(Q!==Qi){const B=10**Q;Qi=Q,Fi=function(Q){let F=1;this._+=Q[0];for(const U=Q.length;F<U;++F)this._+=Math.round(arguments[F]*B)/B+Q[F]}}return Fi}(B),this._radius=4.5,this._=""}pointRadius(B){return this._radius=+B,this}polygonStart(){this._line=0}polygonEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){0===this._line&&(this._+="Z"),this._point=NaN}point(B,Q){switch(this._point){case 0:this._append`M${B},${Q}`,this._point=1;break;case 1:this._append`L${B},${Q}`;break;default:if(this._append`M${B},${Q}`,this._radius!==Ui||this._append!==Fi){const B=this._radius,Q=this._;this._="",this._append`m0,${B}a${B},${B} 0 1,1 0,${-2*B}a${B},${B} 0 1,1 0,${2*B}z`,Ui=B,Fi=this._append,ti=this._,this._=Q}this._+=ti}}result(){const B=this._;return this._="",B.length?B:null}}function Ii(B){let Q=1;this._+=B[0];for(const F=B.length;Q<F;++Q)this._+=arguments[Q]+B[Q]}function gi(B,Q){let F,U,t=3,s=4.5;function I(B){return B&&("function"==typeof s&&U.pointRadius(+s.apply(this,arguments)),mI(B,F(U))),U.result()}return I.area=function(B){return mI(B,F(ng)),ng.result()},I.measure=function(B){return mI(B,F($g)),$g.result()},I.bounds=function(B){return mI(B,F(xg)),xg.result()},I.centroid=function(B){return mI(B,F(Wg)),Wg.result()},I.projection=function(Q){return arguments.length?(F=null==Q?(B=null,lg):(B=Q).stream,I):B},I.context=function(B){return arguments.length?(U=null==B?(Q=null,new si(t)):new Tg(Q=B),"function"!=typeof s&&U.pointRadius(s),I):Q},I.pointRadius=function(B){return arguments.length?(s="function"==typeof B?B:(U.pointRadius(+B),+B),I):s},I.digits=function(B){if(!arguments.length)return t;if(null==B)t=null;else{const Q=Math.floor(B);if(!(Q>=0))throw new RangeError(`invalid digits: ${B}`);t=Q}return null===Q&&(U=new si(t)),I},I.projection(B).digits(t).context(Q)}function ii(B){return{stream:li(B)}}function li(B){return function(Q){var F=new ci;for(var U in B)F[U]=B[U];return F.stream=Q,F}}function ci(){}function ei(B,Q,F){var U=B.clipExtent&&B.clipExtent();return B.scale(150).translate([0,0]),null!=U&&B.clipExtent(null),mI(F,B.stream(xg)),Q(xg.result()),null!=U&&B.clipExtent(U),B}function ni(B,Q,F){return ei(B,function(F){var U=Q[1][0]-Q[0][0],t=Q[1][1]-Q[0][1],s=Math.min(U/(F[1][0]-F[0][0]),t/(F[1][1]-F[0][1])),I=+Q[0][0]+(U-s*(F[1][0]+F[0][0]))/2,g=+Q[0][1]+(t-s*(F[1][1]+F[0][1]))/2;B.scale(150*s).translate([I,g])},F)}function di(B,Q,F){return ni(B,[[0,0],Q],F)}function Ci(B,Q,F){return ei(B,function(F){var U=+Q,t=U/(F[1][0]-F[0][0]),s=(U-t*(F[1][0]+F[0][0]))/2,I=-t*F[0][1];B.scale(150*t).translate([s,I])},F)}function ai(B,Q,F){return ei(B,function(F){var U=+Q,t=U/(F[1][1]-F[0][1]),s=-t*F[0][0],I=(U-t*(F[1][1]+F[0][1]))/2;B.scale(150*t).translate([s,I])},F)}ci.prototype={constructor:ci,point:function(B,Q){this.stream.point(B,Q)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}};var bi=CI(30*cI);function oi(B,Q){return+Q?function(B,Q){function F(U,t,s,I,g,i,l,c,e,n,d,C,a,b){var o=l-U,G=c-t,u=o*o+G*G;if(u>4*Q&&a--){var r=I+n,x=g+d,L=i+C,A=rI(r*r+x*x+L*L),h=AI(L/=A),R=eI(eI(L)-1)<tI||eI(s-e)<tI?(s+e)/2:dI(x,r),y=B(R,h),V=y[0],Z=y[1],S=V-U,m=Z-t,E=G*S-o*m;(E*E/u>Q||eI((o*S+G*m)/u-.5)>.3||I*n+g*d+i*C<bi)&&(F(U,t,s,I,g,i,V,Z,R,r/=A,x/=A,L,a,b),b.point(V,Z),F(V,Z,R,r,x,L,l,c,e,n,d,C,a,b))}}return function(Q){var U,t,s,I,g,i,l,c,e,n,d,C,a={point:b,lineStart:o,lineEnd:u,polygonStart:function(){Q.polygonStart(),a.lineStart=r},polygonEnd:function(){Q.polygonEnd(),a.lineStart=o}};function b(F,U){F=B(F,U),Q.point(F[0],F[1])}function o(){c=NaN,a.point=G,Q.lineStart()}function G(U,t){var s=NI([U,t]),I=B(U,t);F(c,e,l,n,d,C,c=I[0],e=I[1],l=U,n=s[0],d=s[1],C=s[2],16,Q),Q.point(c,e)}function u(){a.point=b,Q.lineEnd()}function r(){o(),a.point=x,a.lineEnd=L}function x(B,Q){G(U=B,Q),t=c,s=e,I=n,g=d,i=C,a.point=G}function L(){F(c,e,l,n,d,C,t,s,U,I,g,i,16,Q),a.lineEnd=u,u()}return a}}(B,Q):function(B){return li({point:function(Q,F){Q=B(Q,F),this.stream.point(Q[0],Q[1])}})}(B)}var Gi=li({point:function(B,Q){this.stream.point(B*cI,Q*cI)}});function ui(B,Q,F,U,t,s){if(!s)return function(B,Q,F,U,t){function s(s,I){return[Q+B*(s*=U),F-B*(I*=t)]}return s.invert=function(s,I){return[(s-Q)/B*U,(F-I)/B*t]},s}(B,Q,F,U,t);var I=CI(s),g=GI(s),i=I*B,l=g*B,c=I/B,e=g/B,n=(g*F-I*Q)/B,d=(g*Q+I*F)/B;function C(B,s){return[i*(B*=U)-l*(s*=t)+Q,F-l*B-i*s]}return C.invert=function(B,Q){return[U*(c*B-e*Q+n),t*(d-e*B-c*Q)]},C}function ri(B){return xi(function(){return B})()}function xi(B){var Q,F,U,t,s,I,g,i,l,c,e=150,n=480,d=250,C=0,a=0,b=0,o=0,G=0,u=0,r=1,x=1,L=null,A=Bg,h=null,R=lg,y=.5;function V(B){return i(B[0]*cI,B[1]*cI)}function Z(B){return(B=i.invert(B[0],B[1]))&&[B[0]*lI,B[1]*lI]}function S(){var B=ui(e,0,0,r,x,u).apply(null,Q(C,a)),U=ui(e,n-B[0],d-B[1],r,x,u);return F=wI(b,o,G),g=YI(Q,U),i=YI(F,g),I=oi(g,y),m()}function m(){return l=c=null,V}return V.stream=function(B){return l&&c===B?l:l=Gi(function(B){return li({point:function(Q,F){var U=B(Q,F);return this.stream.point(U[0],U[1])}})}(F)(A(I(R(c=B)))))},V.preclip=function(B){return arguments.length?(A=B,L=void 0,m()):A},V.postclip=function(B){return arguments.length?(R=B,h=U=t=s=null,m()):R},V.clipAngle=function(B){return arguments.length?(A=+B?Qg(L=B*cI):(L=null,Bg),m()):L*lI},V.clipExtent=function(B){return arguments.length?(R=null==B?(h=U=t=s=null,lg):tg(h=+B[0][0],U=+B[0][1],t=+B[1][0],s=+B[1][1]),m()):null==h?null:[[h,U],[t,s]]},V.scale=function(B){return arguments.length?(e=+B,S()):e},V.translate=function(B){return arguments.length?(n=+B[0],d=+B[1],S()):[n,d]},V.center=function(B){return arguments.length?(C=B[0]%360*cI,a=B[1]%360*cI,S()):[C*lI,a*lI]},V.rotate=function(B){return arguments.length?(b=B[0]%360*cI,o=B[1]%360*cI,G=B.length>2?B[2]%360*cI:0,S()):[b*lI,o*lI,G*lI]},V.angle=function(B){return arguments.length?(u=B%360*cI,S()):u*lI},V.reflectX=function(B){return arguments.length?(r=B?-1:1,S()):r<0},V.reflectY=function(B){return arguments.length?(x=B?-1:1,S()):x<0},V.precision=function(B){return arguments.length?(I=oi(g,y=B*B),m()):rI(y)},V.fitExtent=function(B,Q){return ni(V,B,Q)},V.fitSize=function(B,Q){return di(V,B,Q)},V.fitWidth=function(B,Q){return Ci(V,B,Q)},V.fitHeight=function(B,Q){return ai(V,B,Q)},function(){return Q=B.apply(this,arguments),V.invert=Q.invert&&Z,S()}}function Li(B){var Q=0,F=sI/3,U=xi(B),t=U(Q,F);return t.parallels=function(B){return arguments.length?U(Q=B[0]*cI,F=B[1]*cI):[Q*lI,F*lI]},t}function Ai(B,Q){var F=GI(B),U=(F+GI(Q))/2;if(eI(U)<tI)return function(B){var Q=CI(B);function F(B,F){return[B*Q,GI(F)/Q]}return F.invert=function(B,F){return[B/Q,AI(F*Q)]},F}(B);var t=1+F*(2*U-F),s=rI(t)/U;function I(B,Q){var F=rI(t-2*U*GI(Q))/U;return[F*GI(B*=U),s-F*CI(B)]}return I.invert=function(B,Q){var F=s-Q,I=dI(B,eI(F))*uI(F);return F*U<0&&(I-=sI*uI(B)*uI(F)),[I/U,AI((t-(B*B+F*F)*U*U)/(2*U))]},I}function hi(){return Li(Ai).scale(155.424).center([0,33.6442])}function Ri(){return hi().parallels([29.5,45.5]).scale(1070).translate([480,250]).rotate([96,0]).center([-.6,38.7])}function yi(){var B,Q,F,U,t,s,I=Ri(),g=hi().rotate([154,0]).center([-2,58.5]).parallels([55,65]),i=hi().rotate([157,0]).center([-3,19.9]).parallels([8,18]),l={point:function(B,Q){s=[B,Q]}};function c(B){var Q=B[0],I=B[1];return s=null,F.point(Q,I),s||(U.point(Q,I),s)||(t.point(Q,I),s)}function e(){return B=Q=null,c}return c.invert=function(B){var Q=I.scale(),F=I.translate(),U=(B[0]-F[0])/Q,t=(B[1]-F[1])/Q;return(t>=.12&&t<.234&&U>=-.425&&U<-.214?g:t>=.166&&t<.234&&U>=-.214&&U<-.115?i:I).invert(B)},c.stream=function(F){return B&&Q===F?B:B=function(B){var Q=B.length;return{point:function(F,U){for(var t=-1;++t<Q;)B[t].point(F,U)},sphere:function(){for(var F=-1;++F<Q;)B[F].sphere()},lineStart:function(){for(var F=-1;++F<Q;)B[F].lineStart()},lineEnd:function(){for(var F=-1;++F<Q;)B[F].lineEnd()},polygonStart:function(){for(var F=-1;++F<Q;)B[F].polygonStart()},polygonEnd:function(){for(var F=-1;++F<Q;)B[F].polygonEnd()}}}([I.stream(Q=F),g.stream(F),i.stream(F)])},c.precision=function(B){return arguments.length?(I.precision(B),g.precision(B),i.precision(B),e()):I.precision()},c.scale=function(B){return arguments.length?(I.scale(B),g.scale(.35*B),i.scale(B),c.translate(I.translate())):I.scale()},c.translate=function(B){if(!arguments.length)return I.translate();var Q=I.scale(),s=+B[0],c=+B[1];return F=I.translate(B).clipExtent([[s-.455*Q,c-.238*Q],[s+.455*Q,c+.238*Q]]).stream(l),U=g.translate([s-.307*Q,c+.201*Q]).clipExtent([[s-.425*Q+tI,c+.12*Q+tI],[s-.214*Q-tI,c+.234*Q-tI]]).stream(l),t=i.translate([s-.205*Q,c+.212*Q]).clipExtent([[s-.214*Q+tI,c+.166*Q+tI],[s-.115*Q-tI,c+.234*Q-tI]]).stream(l),e()},c.fitExtent=function(B,Q){return ni(c,B,Q)},c.fitSize=function(B,Q){return di(c,B,Q)},c.fitWidth=function(B,Q){return Ci(c,B,Q)},c.fitHeight=function(B,Q){return ai(c,B,Q)},c.scale(1070)}function Vi(B){return function(Q,F){var U=CI(Q),t=CI(F),s=B(U*t);return s===1/0?[2,0]:[s*t*GI(Q),s*GI(F)]}}function Zi(B){return function(Q,F){var U=rI(Q*Q+F*F),t=B(U),s=GI(t),I=CI(t);return[dI(Q*s,U*I),AI(U&&F*s/U)]}}var Si=Vi(function(B){return rI(2/(1+B))});function mi(){return ri(Si).scale(124.75).clipAngle(179.999)}Si.invert=Zi(function(B){return 2*AI(B/2)});var Ei=Vi(function(B){return(B=LI(B))&&B/GI(B)});function Ni(){return ri(Ei).scale(79.4188).clipAngle(179.999)}function Xi(B,Q){return[B,bI(xI((II+Q)/2))]}function pi(){return Wi(Xi).scale(961/iI)}function Wi(B){var Q,F,U,t=ri(B),s=t.center,I=t.scale,g=t.translate,i=t.clipExtent,l=null;function c(){var s=sI*I(),g=t(function(B){function Q(Q){return(Q=B(Q[0]*cI,Q[1]*cI))[0]*=lI,Q[1]*=lI,Q}return B=wI(B[0]*cI,B[1]*cI,B.length>2?B[2]*cI:0),Q.invert=function(Q){return(Q=B.invert(Q[0]*cI,Q[1]*cI))[0]*=lI,Q[1]*=lI,Q},Q}(t.rotate()).invert([0,0]));return i(null==l?[[g[0]-s,g[1]-s],[g[0]+s,g[1]+s]]:B===Xi?[[Math.max(g[0]-s,l),Q],[Math.min(g[0]+s,F),U]]:[[l,Math.max(g[1]-s,Q)],[F,Math.min(g[1]+s,U)]])}return t.scale=function(B){return arguments.length?(I(B),c()):I()},t.translate=function(B){return arguments.length?(g(B),c()):g()},t.center=function(B){return arguments.length?(s(B),c()):s()},t.clipExtent=function(B){return arguments.length?(null==B?l=Q=F=U=null:(l=+B[0][0],Q=+B[0][1],F=+B[1][0],U=+B[1][1]),c()):null==l?null:[[l,Q],[F,U]]},c()}function Hi(B){return xI((II+B)/2)}function Di(B,Q){var F=CI(B),U=B===Q?GI(B):bI(F/CI(Q))/bI(Hi(Q)/Hi(B)),t=F*oI(Hi(B),U)/U;if(!U)return Xi;function s(B,Q){t>0?Q<-II+tI&&(Q=-II+tI):Q>II-tI&&(Q=II-tI);var F=t/oI(Hi(Q),U);return[F*GI(U*B),t-F*CI(U*B)]}return s.invert=function(B,Q){var F=t-Q,s=uI(U)*rI(B*B+F*F),I=dI(B,eI(F))*uI(F);return F*U<0&&(I-=sI*uI(B)*uI(F)),[I/U,2*nI(oI(t/s,1/U))-II]},s}function Yi(){return Li(Di).scale(109.5).parallels([30,30])}function fi(B,Q){return[B,Q]}function wi(){return ri(fi).scale(152.63)}function Ji(B,Q){var F=CI(B),U=B===Q?GI(B):(F-CI(Q))/(Q-B),t=F/U+B;if(eI(U)<tI)return fi;function s(B,Q){var F=t-Q,s=U*B;return[F*GI(s),t-F*CI(s)]}return s.invert=function(B,Q){var F=t-Q,s=dI(B,eI(F))*uI(F);return F*U<0&&(s-=sI*uI(B)*uI(F)),[s/U,t-uI(U)*rI(B*B+F*F)]},s}function vi(){return Li(Ji).scale(131.154).center([0,13.9389])}Ei.invert=Zi(function(B){return B}),Xi.invert=function(B,Q){return[B,2*nI(aI(Q))-II]},fi.invert=fi;var ki=1.340264,Mi=-.081106,Ti=893e-6,zi=.003796,Ki=rI(3)/2;function Oi(B,Q){var F=AI(Ki*GI(Q)),U=F*F,t=U*U*U;return[B*CI(F)/(Ki*(ki+3*Mi*U+t*(7*Ti+9*zi*U))),F*(ki+Mi*U+t*(Ti+zi*U))]}function Pi(){return ri(Oi).scale(177.158)}function ji(B,Q){var F=CI(Q),U=CI(B)*F;return[F*GI(B)/U,GI(Q)/U]}function _i(){return ri(ji).scale(144.049).clipAngle(60)}function $i(B,Q){return[CI(Q)*GI(B),GI(Q)]}function qi(){return ri($i).scale(249.5).clipAngle(90.000001)}function Bl(B,Q){var F=CI(Q),U=1+CI(B)*F;return[F*GI(B)/U,GI(Q)/U]}function Ql(){return ri(Bl).scale(250).clipAngle(142)}function Fl(B,Q){return[bI(xI((II+Q)/2)),-B]}function Ul(){var B=Wi(Fl),Q=B.center,F=B.rotate;return B.center=function(B){return arguments.length?Q([-B[1],B[0]]):[(B=Q())[1],-B[0]]},B.rotate=function(B){return arguments.length?F([B[0],B[1],B.length>2?B[2]+90:90]):[(B=F())[0],B[1],B[2]-90]},F([0,0,90]).scale(159.155)}function tl(B,Q){switch(arguments.length){case 0:break;case 1:this.range(B);break;default:this.range(Q).domain(B)}return this}function sl(B,Q){switch(arguments.length){case 0:break;case 1:"function"==typeof B?this.interpolator(B):this.range(B);break;default:this.domain(B),"function"==typeof Q?this.interpolator(Q):this.range(Q)}return this}Oi.invert=function(B,Q){for(var F,U=Q,t=U*U,s=t*t*t,I=0;I<12&&(s=(t=(U-=F=(U*(ki+Mi*t+s*(Ti+zi*t))-Q)/(ki+3*Mi*t+s*(7*Ti+9*zi*t)))*U)*t*t,!(eI(F)<1e-12));++I);return[Ki*B*(ki+3*Mi*t+s*(7*Ti+9*zi*t))/CI(U),AI(GI(U)/Ki)]},ji.invert=Zi(nI),$i.invert=Zi(AI),Bl.invert=Zi(function(B){return 2*nI(B)}),Fl.invert=function(B,Q){return[-Q,2*nI(aI(B))-II]};const Il=Symbol("implicit");function gl(){var B=new RB,Q=[],F=[],U=Il;function t(t){let s=B.get(t);if(void 0===s){if(U!==Il)return U;B.set(t,s=Q.push(t)-1)}return F[s%F.length]}return t.domain=function(F){if(!arguments.length)return Q.slice();Q=[],B=new RB;for(const U of F)B.has(U)||B.set(U,Q.push(U)-1);return t},t.range=function(B){return arguments.length?(F=Array.from(B),t):F.slice()},t.unknown=function(B){return arguments.length?(U=B,t):U},t.copy=function(){return gl(Q,F).unknown(U)},tl.apply(t,arguments),t}function il(){var B,Q,F=gl().unknown(void 0),U=F.domain,t=F.range,s=0,I=1,g=!1,i=0,l=0,c=.5;function e(){var F=U().length,e=I<s,n=e?I:s,d=e?s:I;B=(d-n)/Math.max(1,F-i+2*l),g&&(B=Math.floor(B)),n+=(d-n-B*(F-i))*c,Q=B*(1-i),g&&(n=Math.round(n),Q=Math.round(Q));var C=cQ(F).map(function(Q){return n+B*Q});return t(e?C.reverse():C)}return delete F.unknown,F.domain=function(B){return arguments.length?(U(B),e()):U()},F.range=function(B){return arguments.length?([s,I]=B,s=+s,I=+I,e()):[s,I]},F.rangeRound=function(B){return[s,I]=B,s=+s,I=+I,g=!0,e()},F.bandwidth=function(){return Q},F.step=function(){return B},F.round=function(B){return arguments.length?(g=!!B,e()):g},F.padding=function(B){return arguments.length?(i=Math.min(1,l=+B),e()):i},F.paddingInner=function(B){return arguments.length?(i=Math.min(1,B),e()):i},F.paddingOuter=function(B){return arguments.length?(l=+B,e()):l},F.align=function(B){return arguments.length?(c=Math.max(0,Math.min(1,B)),e()):c},F.copy=function(){return il(U(),[s,I]).round(g).paddingInner(i).paddingOuter(l).align(c)},tl.apply(e(),arguments)}function ll(B){var Q=B.copy;return B.padding=B.paddingOuter,delete B.paddingInner,delete B.paddingOuter,B.copy=function(){return ll(Q())},B}function cl(){return ll(il.apply(null,arguments).paddingInner(1))}function el(B){return+B}var nl=[0,1];function dl(B){return B}function Cl(B,Q){return(Q-=B=+B)?function(F){return(F-B)/Q}:function(B){return function(){return B}}(isNaN(Q)?NaN:.5)}function al(B,Q,F){var U=B[0],t=B[1],s=Q[0],I=Q[1];return t<U?(U=Cl(t,U),s=F(I,s)):(U=Cl(U,t),s=F(s,I)),function(B){return s(U(B))}}function bl(B,Q,F){var U=Math.min(B.length,Q.length)-1,t=new Array(U),s=new Array(U),I=-1;for(B[U]<B[0]&&(B=B.slice().reverse(),Q=Q.slice().reverse());++I<U;)t[I]=Cl(B[I],B[I+1]),s[I]=F(Q[I],Q[I+1]);return function(Q){var F=aB(B,Q,1,U)-1;return s[F](t[F](Q))}}function ol(B,Q){return Q.domain(B.domain()).range(B.range()).interpolate(B.interpolate()).clamp(B.clamp()).unknown(B.unknown())}function Gl(){var B,Q,F,U,t,s,I=nl,g=nl,i=Rt,l=dl;function c(){var B=Math.min(I.length,g.length);return l!==dl&&(l=function(B,Q){var F;return B>Q&&(F=B,B=Q,Q=F),function(F){return Math.max(B,Math.min(Q,F))}}(I[0],I[B-1])),U=B>2?bl:al,t=s=null,e}function e(Q){return null==Q||isNaN(Q=+Q)?F:(t||(t=U(I.map(B),g,i)))(B(l(Q)))}return e.invert=function(F){return l(Q((s||(s=U(g,I.map(B),rt)))(F)))},e.domain=function(B){return arguments.length?(I=Array.from(B,el),c()):I.slice()},e.range=function(B){return arguments.length?(g=Array.from(B),c()):g.slice()},e.rangeRound=function(B){return g=Array.from(B),i=yt,c()},e.clamp=function(B){return arguments.length?(l=!!B||dl,c()):l!==dl},e.interpolate=function(B){return arguments.length?(i=B,c()):i},e.unknown=function(B){return arguments.length?(F=B,e):F},function(F,U){return B=F,Q=U,c()}}function ul(){return Gl()(dl,dl)}function rl(B,Q,F,U){var t,s=zB(B,Q,F);switch((U=Ks(null==U?",f":U)).type){case"s":var I=Math.max(Math.abs(B),Math.abs(Q));return null!=U.precision||isNaN(t=function(B,Q){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(Ms(Q)/3)))-Ms(Math.abs(B)))}(s,I))||(U.precision=t),BI(U,I);case"":case"e":case"g":case"p":case"r":null!=U.precision||isNaN(t=function(B,Q){return B=Math.abs(B),Q=Math.abs(Q)-B,Math.max(0,Ms(Q)-Ms(B))+1}(s,Math.max(Math.abs(B),Math.abs(Q))))||(U.precision=t-("e"===U.type));break;case"f":case"%":null!=U.precision||isNaN(t=function(B){return Math.max(0,-Ms(Math.abs(B)))}(s))||(U.precision=t-2*("%"===U.type))}return qs(U)}function xl(B){var Q=B.domain;return B.ticks=function(B){var F=Q();return MB(F[0],F[F.length-1],null==B?10:B)},B.tickFormat=function(B,F){var U=Q();return rl(U[0],U[U.length-1],null==B?10:B,F)},B.nice=function(F){null==F&&(F=10);var U,t,s=Q(),I=0,g=s.length-1,i=s[I],l=s[g],c=10;for(l<i&&(t=i,i=l,l=t,t=I,I=g,g=t);c-- >0;){if((t=TB(i,l,F))===U)return s[I]=i,s[g]=l,Q(s);if(t>0)i=Math.floor(i/t)*t,l=Math.ceil(l/t)*t;else{if(!(t<0))break;i=Math.ceil(i*t)/t,l=Math.floor(l*t)/t}U=t}return B},B}function Ll(){var B=ul();return B.copy=function(){return ol(B,Ll())},tl.apply(B,arguments),xl(B)}function Al(B){var Q;function F(B){return null==B||isNaN(B=+B)?Q:B}return F.invert=F,F.domain=F.range=function(Q){return arguments.length?(B=Array.from(Q,el),F):B.slice()},F.unknown=function(B){return arguments.length?(Q=B,F):Q},F.copy=function(){return Al(B).unknown(Q)},B=arguments.length?Array.from(B,el):[0,1],xl(F)}function hl(B,Q){var F,U=0,t=(B=B.slice()).length-1,s=B[U],I=B[t];return I<s&&(F=U,U=t,t=F,F=s,s=I,I=F),B[U]=Q.floor(s),B[t]=Q.ceil(I),B}function Rl(B){return Math.log(B)}function yl(B){return Math.exp(B)}function Vl(B){return-Math.log(-B)}function Zl(B){return-Math.exp(-B)}function Sl(B){return isFinite(B)?+("1e"+B):B<0?0:B}function ml(B){return(Q,F)=>-B(-Q,F)}function El(B){const Q=B(Rl,yl),F=Q.domain;let U,t,s=10;function I(){return U=function(B){return B===Math.E?Math.log:10===B&&Math.log10||2===B&&Math.log2||(B=Math.log(B),Q=>Math.log(Q)/B)}(s),t=function(B){return 10===B?Sl:B===Math.E?Math.exp:Q=>Math.pow(B,Q)}(s),F()[0]<0?(U=ml(U),t=ml(t),B(Vl,Zl)):B(Rl,yl),Q}return Q.base=function(B){return arguments.length?(s=+B,I()):s},Q.domain=function(B){return arguments.length?(F(B),I()):F()},Q.ticks=B=>{const Q=F();let I=Q[0],g=Q[Q.length-1];const i=g<I;i&&([I,g]=[g,I]);let l,c,e=U(I),n=U(g);const d=null==B?10:+B;let C=[];if(!(s%1)&&n-e<d){if(e=Math.floor(e),n=Math.ceil(n),I>0){for(;e<=n;++e)for(l=1;l<s;++l)if(c=e<0?l/t(-e):l*t(e),!(c<I)){if(c>g)break;C.push(c)}}else for(;e<=n;++e)for(l=s-1;l>=1;--l)if(c=e>0?l/t(-e):l*t(e),!(c<I)){if(c>g)break;C.push(c)}2*C.length<d&&(C=MB(I,g,d))}else C=MB(e,n,Math.min(n-e,d)).map(t);return i?C.reverse():C},Q.tickFormat=(B,F)=>{if(null==B&&(B=10),null==F&&(F=10===s?"s":","),"function"!=typeof F&&(s%1||null!=(F=Ks(F)).precision||(F.trim=!0),F=qs(F)),B===1/0)return F;const I=Math.max(1,s*B/Q.ticks().length);return B=>{let Q=B/t(Math.round(U(B)));return Q*s<s-.5&&(Q*=s),Q<=I?F(B):""}},Q.nice=()=>F(hl(F(),{floor:B=>t(Math.floor(U(B))),ceil:B=>t(Math.ceil(U(B)))})),Q}function Nl(){const B=El(Gl()).domain([1,10]);return B.copy=()=>ol(B,Nl()).base(B.base()),tl.apply(B,arguments),B}function Xl(B){return function(Q){return Math.sign(Q)*Math.log1p(Math.abs(Q/B))}}function pl(B){return function(Q){return Math.sign(Q)*Math.expm1(Math.abs(Q))*B}}function Wl(B){var Q=1,F=B(Xl(Q),pl(Q));return F.constant=function(F){return arguments.length?B(Xl(Q=+F),pl(Q)):Q},xl(F)}function Hl(){var B=Wl(Gl());return B.copy=function(){return ol(B,Hl()).constant(B.constant())},tl.apply(B,arguments)}function Dl(B){return function(Q){return Q<0?-Math.pow(-Q,B):Math.pow(Q,B)}}function Yl(B){return B<0?-Math.sqrt(-B):Math.sqrt(B)}function fl(B){return B<0?-B*B:B*B}function wl(B){var Q=B(dl,dl),F=1;return Q.exponent=function(Q){return arguments.length?1===(F=+Q)?B(dl,dl):.5===F?B(Yl,fl):B(Dl(F),Dl(1/F)):F},xl(Q)}function Jl(){var B=wl(Gl());return B.copy=function(){return ol(B,Jl()).exponent(B.exponent())},tl.apply(B,arguments),B}function vl(){var B,Q=[],F=[],U=[];function t(){var B=0,t=Math.max(1,F.length);for(U=new Array(t-1);++B<t;)U[B-1]=FQ(Q,B/t);return s}function s(Q){return null==Q||isNaN(Q=+Q)?B:F[aB(U,Q)]}return s.invertExtent=function(B){var t=F.indexOf(B);return t<0?[NaN,NaN]:[t>0?U[t-1]:Q[0],t<U.length?U[t]:Q[Q.length-1]]},s.domain=function(B){if(!arguments.length)return Q.slice();Q=[];for(let F of B)null==F||isNaN(F=+F)||Q.push(F);return Q.sort(cB),t()},s.range=function(B){return arguments.length?(F=Array.from(B),t()):F.slice()},s.unknown=function(Q){return arguments.length?(B=Q,s):B},s.quantiles=function(){return U.slice()},s.copy=function(){return vl().domain(Q).range(F).unknown(B)},tl.apply(s,arguments)}function kl(){var B,Q=[.5],F=[0,1],U=1;function t(t){return null!=t&&t<=t?F[aB(Q,t,0,U)]:B}return t.domain=function(B){return arguments.length?(Q=Array.from(B),U=Math.min(Q.length,F.length-1),t):Q.slice()},t.range=function(B){return arguments.length?(F=Array.from(B),U=Math.min(Q.length,F.length-1),t):F.slice()},t.invertExtent=function(B){var U=F.indexOf(B);return[Q[U-1],Q[U]]},t.unknown=function(Q){return arguments.length?(B=Q,t):B},t.copy=function(){return kl().domain(Q).range(F).unknown(B)},tl.apply(t,arguments)}const Ml=new Date,Tl=new Date;function zl(B,Q,F,U){function t(Q){return B(Q=0===arguments.length?new Date:new Date(+Q)),Q}return t.floor=Q=>(B(Q=new Date(+Q)),Q),t.ceil=F=>(B(F=new Date(F-1)),Q(F,1),B(F),F),t.round=B=>{const Q=t(B),F=t.ceil(B);return B-Q<F-B?Q:F},t.offset=(B,F)=>(Q(B=new Date(+B),null==F?1:Math.floor(F)),B),t.range=(F,U,s)=>{const I=[];if(F=t.ceil(F),s=null==s?1:Math.floor(s),!(F<U&&s>0))return I;let g;do{I.push(g=new Date(+F)),Q(F,s),B(F)}while(g<F&&F<U);return I},t.filter=F=>zl(Q=>{if(Q>=Q)for(;B(Q),!F(Q);)Q.setTime(Q-1)},(B,U)=>{if(B>=B)if(U<0)for(;++U<=0;)for(;Q(B,-1),!F(B););else for(;--U>=0;)for(;Q(B,1),!F(B););}),F&&(t.count=(Q,U)=>(Ml.setTime(+Q),Tl.setTime(+U),B(Ml),B(Tl),Math.floor(F(Ml,Tl))),t.every=B=>(B=Math.floor(B),isFinite(B)&&B>0?B>1?t.filter(U?Q=>U(Q)%B===0:Q=>t.count(0,Q)%B===0):t:null)),t}const Kl=zl(()=>{},(B,Q)=>{B.setTime(+B+Q)},(B,Q)=>Q-B);Kl.every=B=>(B=Math.floor(B),isFinite(B)&&B>0?B>1?zl(Q=>{Q.setTime(Math.floor(Q/B)*B)},(Q,F)=>{Q.setTime(+Q+F*B)},(Q,F)=>(F-Q)/B):Kl:null),Kl.range;const Ol=1e3,Pl=6e4,jl=36e5,_l=864e5,$l=6048e5,ql=2592e6,Bc=31536e6,Qc=zl(B=>{B.setTime(B-B.getMilliseconds())},(B,Q)=>{B.setTime(+B+Q*Ol)},(B,Q)=>(Q-B)/Ol,B=>B.getUTCSeconds());Qc.range;const Fc=zl(B=>{B.setTime(B-B.getMilliseconds()-B.getSeconds()*Ol)},(B,Q)=>{B.setTime(+B+Q*Pl)},(B,Q)=>(Q-B)/Pl,B=>B.getMinutes());Fc.range;const Uc=zl(B=>{B.setUTCSeconds(0,0)},(B,Q)=>{B.setTime(+B+Q*Pl)},(B,Q)=>(Q-B)/Pl,B=>B.getUTCMinutes());Uc.range;const tc=zl(B=>{B.setTime(B-B.getMilliseconds()-B.getSeconds()*Ol-B.getMinutes()*Pl)},(B,Q)=>{B.setTime(+B+Q*jl)},(B,Q)=>(Q-B)/jl,B=>B.getHours());tc.range;const sc=zl(B=>{B.setUTCMinutes(0,0,0)},(B,Q)=>{B.setTime(+B+Q*jl)},(B,Q)=>(Q-B)/jl,B=>B.getUTCHours());sc.range;const Ic=zl(B=>B.setHours(0,0,0,0),(B,Q)=>B.setDate(B.getDate()+Q),(B,Q)=>(Q-B-(Q.getTimezoneOffset()-B.getTimezoneOffset())*Pl)/_l,B=>B.getDate()-1);Ic.range;const gc=zl(B=>{B.setUTCHours(0,0,0,0)},(B,Q)=>{B.setUTCDate(B.getUTCDate()+Q)},(B,Q)=>(Q-B)/_l,B=>B.getUTCDate()-1);gc.range;const ic=zl(B=>{B.setUTCHours(0,0,0,0)},(B,Q)=>{B.setUTCDate(B.getUTCDate()+Q)},(B,Q)=>(Q-B)/_l,B=>Math.floor(B/_l));function lc(B){return zl(Q=>{Q.setDate(Q.getDate()-(Q.getDay()+7-B)%7),Q.setHours(0,0,0,0)},(B,Q)=>{B.setDate(B.getDate()+7*Q)},(B,Q)=>(Q-B-(Q.getTimezoneOffset()-B.getTimezoneOffset())*Pl)/$l)}ic.range;const cc=lc(0),ec=lc(1),nc=lc(2),dc=lc(3),Cc=lc(4),ac=lc(5),bc=lc(6);function oc(B){return zl(Q=>{Q.setUTCDate(Q.getUTCDate()-(Q.getUTCDay()+7-B)%7),Q.setUTCHours(0,0,0,0)},(B,Q)=>{B.setUTCDate(B.getUTCDate()+7*Q)},(B,Q)=>(Q-B)/$l)}cc.range,ec.range,nc.range,dc.range,Cc.range,ac.range,bc.range;const Gc=oc(0),uc=oc(1),rc=oc(2),xc=oc(3),Lc=oc(4),Ac=oc(5),hc=oc(6);Gc.range,uc.range,rc.range,xc.range,Lc.range,Ac.range,hc.range;const Rc=zl(B=>{B.setDate(1),B.setHours(0,0,0,0)},(B,Q)=>{B.setMonth(B.getMonth()+Q)},(B,Q)=>Q.getMonth()-B.getMonth()+12*(Q.getFullYear()-B.getFullYear()),B=>B.getMonth());Rc.range;const yc=zl(B=>{B.setUTCDate(1),B.setUTCHours(0,0,0,0)},(B,Q)=>{B.setUTCMonth(B.getUTCMonth()+Q)},(B,Q)=>Q.getUTCMonth()-B.getUTCMonth()+12*(Q.getUTCFullYear()-B.getUTCFullYear()),B=>B.getUTCMonth());yc.range;const Vc=zl(B=>{B.setMonth(0,1),B.setHours(0,0,0,0)},(B,Q)=>{B.setFullYear(B.getFullYear()+Q)},(B,Q)=>Q.getFullYear()-B.getFullYear(),B=>B.getFullYear());Vc.every=B=>isFinite(B=Math.floor(B))&&B>0?zl(Q=>{Q.setFullYear(Math.floor(Q.getFullYear()/B)*B),Q.setMonth(0,1),Q.setHours(0,0,0,0)},(Q,F)=>{Q.setFullYear(Q.getFullYear()+F*B)}):null,Vc.range;const Zc=zl(B=>{B.setUTCMonth(0,1),B.setUTCHours(0,0,0,0)},(B,Q)=>{B.setUTCFullYear(B.getUTCFullYear()+Q)},(B,Q)=>Q.getUTCFullYear()-B.getUTCFullYear(),B=>B.getUTCFullYear());function Sc(B,Q,F,U,t,s){const I=[[Qc,1,Ol],[Qc,5,5e3],[Qc,15,15e3],[Qc,30,3e4],[s,1,Pl],[s,5,3e5],[s,15,9e5],[s,30,18e5],[t,1,jl],[t,3,108e5],[t,6,216e5],[t,12,432e5],[U,1,_l],[U,2,1728e5],[F,1,$l],[Q,1,ql],[Q,3,7776e6],[B,1,Bc]];function g(Q,F,U){const t=Math.abs(F-Q)/U,s=nB(([,,B])=>B).right(I,t);if(s===I.length)return B.every(zB(Q/Bc,F/Bc,U));if(0===s)return Kl.every(Math.max(zB(Q,F,U),1));const[g,i]=I[t/I[s-1][2]<I[s][2]/t?s-1:s];return g.every(i)}return[function(B,Q,F){const U=Q<B;U&&([B,Q]=[Q,B]);const t=F&&"function"==typeof F.range?F:g(B,Q,F),s=t?t.range(B,+Q+1):[];return U?s.reverse():s},g]}Zc.every=B=>isFinite(B=Math.floor(B))&&B>0?zl(Q=>{Q.setUTCFullYear(Math.floor(Q.getUTCFullYear()/B)*B),Q.setUTCMonth(0,1),Q.setUTCHours(0,0,0,0)},(Q,F)=>{Q.setUTCFullYear(Q.getUTCFullYear()+F*B)}):null,Zc.range;const[mc,Ec]=Sc(Zc,yc,Gc,ic,sc,Uc),[Nc,Xc]=Sc(Vc,Rc,cc,Ic,tc,Fc);function pc(B){if(0<=B.y&&B.y<100){var Q=new Date(-1,B.m,B.d,B.H,B.M,B.S,B.L);return Q.setFullYear(B.y),Q}return new Date(B.y,B.m,B.d,B.H,B.M,B.S,B.L)}function Wc(B){if(0<=B.y&&B.y<100){var Q=new Date(Date.UTC(-1,B.m,B.d,B.H,B.M,B.S,B.L));return Q.setUTCFullYear(B.y),Q}return new Date(Date.UTC(B.y,B.m,B.d,B.H,B.M,B.S,B.L))}function Hc(B,Q,F){return{y:B,m:Q,d:F,H:0,M:0,S:0,L:0}}var Dc,Yc,fc,wc={"-":"",_:" ",0:"0"},Jc=/^\s*\d+/,vc=/^%/,kc=/[\\^$*+?|[\]().{}]/g;function Mc(B,Q,F){var U=B<0?"-":"",t=(U?-B:B)+"",s=t.length;return U+(s<F?new Array(F-s+1).join(Q)+t:t)}function Tc(B){return B.replace(kc,"\\$&")}function zc(B){return new RegExp("^(?:"+B.map(Tc).join("|")+")","i")}function Kc(B){return new Map(B.map((B,Q)=>[B.toLowerCase(),Q]))}function Oc(B,Q,F){var U=Jc.exec(Q.slice(F,F+1));return U?(B.w=+U[0],F+U[0].length):-1}function Pc(B,Q,F){var U=Jc.exec(Q.slice(F,F+1));return U?(B.u=+U[0],F+U[0].length):-1}function jc(B,Q,F){var U=Jc.exec(Q.slice(F,F+2));return U?(B.U=+U[0],F+U[0].length):-1}function _c(B,Q,F){var U=Jc.exec(Q.slice(F,F+2));return U?(B.V=+U[0],F+U[0].length):-1}function $c(B,Q,F){var U=Jc.exec(Q.slice(F,F+2));return U?(B.W=+U[0],F+U[0].length):-1}function qc(B,Q,F){var U=Jc.exec(Q.slice(F,F+4));return U?(B.y=+U[0],F+U[0].length):-1}function Be(B,Q,F){var U=Jc.exec(Q.slice(F,F+2));return U?(B.y=+U[0]+(+U[0]>68?1900:2e3),F+U[0].length):-1}function Qe(B,Q,F){var U=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(Q.slice(F,F+6));return U?(B.Z=U[1]?0:-(U[2]+(U[3]||"00")),F+U[0].length):-1}function Fe(B,Q,F){var U=Jc.exec(Q.slice(F,F+1));return U?(B.q=3*U[0]-3,F+U[0].length):-1}function Ue(B,Q,F){var U=Jc.exec(Q.slice(F,F+2));return U?(B.m=U[0]-1,F+U[0].length):-1}function te(B,Q,F){var U=Jc.exec(Q.slice(F,F+2));return U?(B.d=+U[0],F+U[0].length):-1}function se(B,Q,F){var U=Jc.exec(Q.slice(F,F+3));return U?(B.m=0,B.d=+U[0],F+U[0].length):-1}function Ie(B,Q,F){var U=Jc.exec(Q.slice(F,F+2));return U?(B.H=+U[0],F+U[0].length):-1}function ge(B,Q,F){var U=Jc.exec(Q.slice(F,F+2));return U?(B.M=+U[0],F+U[0].length):-1}function ie(B,Q,F){var U=Jc.exec(Q.slice(F,F+2));return U?(B.S=+U[0],F+U[0].length):-1}function le(B,Q,F){var U=Jc.exec(Q.slice(F,F+3));return U?(B.L=+U[0],F+U[0].length):-1}function ce(B,Q,F){var U=Jc.exec(Q.slice(F,F+6));return U?(B.L=Math.floor(U[0]/1e3),F+U[0].length):-1}function ee(B,Q,F){var U=vc.exec(Q.slice(F,F+1));return U?F+U[0].length:-1}function ne(B,Q,F){var U=Jc.exec(Q.slice(F));return U?(B.Q=+U[0],F+U[0].length):-1}function de(B,Q,F){var U=Jc.exec(Q.slice(F));return U?(B.s=+U[0],F+U[0].length):-1}function Ce(B,Q){return Mc(B.getDate(),Q,2)}function ae(B,Q){return Mc(B.getHours(),Q,2)}function be(B,Q){return Mc(B.getHours()%12||12,Q,2)}function oe(B,Q){return Mc(1+Ic.count(Vc(B),B),Q,3)}function Ge(B,Q){return Mc(B.getMilliseconds(),Q,3)}function ue(B,Q){return Ge(B,Q)+"000"}function re(B,Q){return Mc(B.getMonth()+1,Q,2)}function xe(B,Q){return Mc(B.getMinutes(),Q,2)}function Le(B,Q){return Mc(B.getSeconds(),Q,2)}function Ae(B){var Q=B.getDay();return 0===Q?7:Q}function he(B,Q){return Mc(cc.count(Vc(B)-1,B),Q,2)}function Re(B){var Q=B.getDay();return Q>=4||0===Q?Cc(B):Cc.ceil(B)}function ye(B,Q){return B=Re(B),Mc(Cc.count(Vc(B),B)+(4===Vc(B).getDay()),Q,2)}function Ve(B){return B.getDay()}function Ze(B,Q){return Mc(ec.count(Vc(B)-1,B),Q,2)}function Se(B,Q){return Mc(B.getFullYear()%100,Q,2)}function me(B,Q){return Mc((B=Re(B)).getFullYear()%100,Q,2)}function Ee(B,Q){return Mc(B.getFullYear()%1e4,Q,4)}function Ne(B,Q){var F=B.getDay();return Mc((B=F>=4||0===F?Cc(B):Cc.ceil(B)).getFullYear()%1e4,Q,4)}function Xe(B){var Q=B.getTimezoneOffset();return(Q>0?"-":(Q*=-1,"+"))+Mc(Q/60|0,"0",2)+Mc(Q%60,"0",2)}function pe(B,Q){return Mc(B.getUTCDate(),Q,2)}function We(B,Q){return Mc(B.getUTCHours(),Q,2)}function He(B,Q){return Mc(B.getUTCHours()%12||12,Q,2)}function De(B,Q){return Mc(1+gc.count(Zc(B),B),Q,3)}function Ye(B,Q){return Mc(B.getUTCMilliseconds(),Q,3)}function fe(B,Q){return Ye(B,Q)+"000"}function we(B,Q){return Mc(B.getUTCMonth()+1,Q,2)}function Je(B,Q){return Mc(B.getUTCMinutes(),Q,2)}function ve(B,Q){return Mc(B.getUTCSeconds(),Q,2)}function ke(B){var Q=B.getUTCDay();return 0===Q?7:Q}function Me(B,Q){return Mc(Gc.count(Zc(B)-1,B),Q,2)}function Te(B){var Q=B.getUTCDay();return Q>=4||0===Q?Lc(B):Lc.ceil(B)}function ze(B,Q){return B=Te(B),Mc(Lc.count(Zc(B),B)+(4===Zc(B).getUTCDay()),Q,2)}function Ke(B){return B.getUTCDay()}function Oe(B,Q){return Mc(uc.count(Zc(B)-1,B),Q,2)}function Pe(B,Q){return Mc(B.getUTCFullYear()%100,Q,2)}function je(B,Q){return Mc((B=Te(B)).getUTCFullYear()%100,Q,2)}function _e(B,Q){return Mc(B.getUTCFullYear()%1e4,Q,4)}function $e(B,Q){var F=B.getUTCDay();return Mc((B=F>=4||0===F?Lc(B):Lc.ceil(B)).getUTCFullYear()%1e4,Q,4)}function qe(){return"+0000"}function Bn(){return"%"}function Qn(B){return+B}function Fn(B){return Math.floor(+B/1e3)}function Un(B){return new Date(B)}function tn(B){return B instanceof Date?+B:+new Date(+B)}function sn(B,Q,F,U,t,s,I,g,i,l){var c=ul(),e=c.invert,n=c.domain,d=l(".%L"),C=l(":%S"),a=l("%I:%M"),b=l("%I %p"),o=l("%a %d"),G=l("%b %d"),u=l("%B"),r=l("%Y");function x(B){return(i(B)<B?d:g(B)<B?C:I(B)<B?a:s(B)<B?b:U(B)<B?t(B)<B?o:G:F(B)<B?u:r)(B)}return c.invert=function(B){return new Date(e(B))},c.domain=function(B){return arguments.length?n(Array.from(B,tn)):n().map(Un)},c.ticks=function(Q){var F=n();return B(F[0],F[F.length-1],null==Q?10:Q)},c.tickFormat=function(B,Q){return null==Q?x:l(Q)},c.nice=function(B){var F=n();return B&&"function"==typeof B.range||(B=Q(F[0],F[F.length-1],null==B?10:B)),B?n(hl(F,B)):c},c.copy=function(){return ol(c,sn(B,Q,F,U,t,s,I,g,i,l))},c}function In(B,Q){return Q.domain(B.domain()).interpolator(B.interpolator()).clamp(B.clamp()).unknown(B.unknown())}function gn(){var B,Q,F,U,t,s,I,g=0,i=.5,l=1,c=1,e=dl,n=!1;function d(B){return isNaN(B=+B)?I:(B=.5+((B=+s(B))-Q)*(c*B<c*Q?U:t),e(n?Math.max(0,Math.min(1,B)):B))}function C(B){return function(Q){var F,U,t;return arguments.length?([F,U,t]=Q,e=Yt(B,[F,U,t]),d):[e(0),e(.5),e(1)]}}return d.domain=function(I){return arguments.length?([g,i,l]=I,B=s(g=+g),Q=s(i=+i),F=s(l=+l),U=B===Q?0:.5/(Q-B),t=Q===F?0:.5/(F-Q),c=Q<B?-1:1,d):[g,i,l]},d.clamp=function(B){return arguments.length?(n=!!B,d):n},d.interpolator=function(B){return arguments.length?(e=B,d):e},d.range=C(Rt),d.rangeRound=C(yt),d.unknown=function(B){return arguments.length?(I=B,d):I},function(I){return s=I,B=I(g),Q=I(i),F=I(l),U=B===Q?0:.5/(Q-B),t=Q===F?0:.5/(F-Q),c=Q<B?-1:1,d}}function ln(){var B=xl(gn()(dl));return B.copy=function(){return In(B,ln())},sl.apply(B,arguments)}function cn(){var B=El(gn()).domain([.1,1,10]);return B.copy=function(){return In(B,cn()).base(B.base())},sl.apply(B,arguments)}function en(){var B=Wl(gn());return B.copy=function(){return In(B,en()).constant(B.constant())},sl.apply(B,arguments)}function nn(){var B=wl(gn());return B.copy=function(){return In(B,nn()).exponent(B.exponent())},sl.apply(B,arguments)}function dn(B){for(var Q=B.length/6|0,F=new Array(Q),U=0;U<Q;)F[U]="#"+B.slice(6*U,6*++U);return F}!function(B){Dc=function(B){var Q=B.dateTime,F=B.date,U=B.time,t=B.periods,s=B.days,I=B.shortDays,g=B.months,i=B.shortMonths,l=zc(t),c=Kc(t),e=zc(s),n=Kc(s),d=zc(I),C=Kc(I),a=zc(g),b=Kc(g),o=zc(i),G=Kc(i),u={a:function(B){return I[B.getDay()]},A:function(B){return s[B.getDay()]},b:function(B){return i[B.getMonth()]},B:function(B){return g[B.getMonth()]},c:null,d:Ce,e:Ce,f:ue,g:me,G:Ne,H:ae,I:be,j:oe,L:Ge,m:re,M:xe,p:function(B){return t[+(B.getHours()>=12)]},q:function(B){return 1+~~(B.getMonth()/3)},Q:Qn,s:Fn,S:Le,u:Ae,U:he,V:ye,w:Ve,W:Ze,x:null,X:null,y:Se,Y:Ee,Z:Xe,"%":Bn},r={a:function(B){return I[B.getUTCDay()]},A:function(B){return s[B.getUTCDay()]},b:function(B){return i[B.getUTCMonth()]},B:function(B){return g[B.getUTCMonth()]},c:null,d:pe,e:pe,f:fe,g:je,G:$e,H:We,I:He,j:De,L:Ye,m:we,M:Je,p:function(B){return t[+(B.getUTCHours()>=12)]},q:function(B){return 1+~~(B.getUTCMonth()/3)},Q:Qn,s:Fn,S:ve,u:ke,U:Me,V:ze,w:Ke,W:Oe,x:null,X:null,y:Pe,Y:_e,Z:qe,"%":Bn},x={a:function(B,Q,F){var U=d.exec(Q.slice(F));return U?(B.w=C.get(U[0].toLowerCase()),F+U[0].length):-1},A:function(B,Q,F){var U=e.exec(Q.slice(F));return U?(B.w=n.get(U[0].toLowerCase()),F+U[0].length):-1},b:function(B,Q,F){var U=o.exec(Q.slice(F));return U?(B.m=G.get(U[0].toLowerCase()),F+U[0].length):-1},B:function(B,Q,F){var U=a.exec(Q.slice(F));return U?(B.m=b.get(U[0].toLowerCase()),F+U[0].length):-1},c:function(B,F,U){return h(B,Q,F,U)},d:te,e:te,f:ce,g:Be,G:qc,H:Ie,I:Ie,j:se,L:le,m:Ue,M:ge,p:function(B,Q,F){var U=l.exec(Q.slice(F));return U?(B.p=c.get(U[0].toLowerCase()),F+U[0].length):-1},q:Fe,Q:ne,s:de,S:ie,u:Pc,U:jc,V:_c,w:Oc,W:$c,x:function(B,Q,U){return h(B,F,Q,U)},X:function(B,Q,F){return h(B,U,Q,F)},y:Be,Y:qc,Z:Qe,"%":ee};function L(B,Q){return function(F){var U,t,s,I=[],g=-1,i=0,l=B.length;for(F instanceof Date||(F=new Date(+F));++g<l;)37===B.charCodeAt(g)&&(I.push(B.slice(i,g)),null!=(t=wc[U=B.charAt(++g)])?U=B.charAt(++g):t="e"===U?" ":"0",(s=Q[U])&&(U=s(F,t)),I.push(U),i=g+1);return I.push(B.slice(i,g)),I.join("")}}function A(B,Q){return function(F){var U,t,s=Hc(1900,void 0,1);if(h(s,B,F+="",0)!=F.length)return null;if("Q"in s)return new Date(s.Q);if("s"in s)return new Date(1e3*s.s+("L"in s?s.L:0));if(Q&&!("Z"in s)&&(s.Z=0),"p"in s&&(s.H=s.H%12+12*s.p),void 0===s.m&&(s.m="q"in s?s.q:0),"V"in s){if(s.V<1||s.V>53)return null;"w"in s||(s.w=1),"Z"in s?(t=(U=Wc(Hc(s.y,0,1))).getUTCDay(),U=t>4||0===t?uc.ceil(U):uc(U),U=gc.offset(U,7*(s.V-1)),s.y=U.getUTCFullYear(),s.m=U.getUTCMonth(),s.d=U.getUTCDate()+(s.w+6)%7):(t=(U=pc(Hc(s.y,0,1))).getDay(),U=t>4||0===t?ec.ceil(U):ec(U),U=Ic.offset(U,7*(s.V-1)),s.y=U.getFullYear(),s.m=U.getMonth(),s.d=U.getDate()+(s.w+6)%7)}else("W"in s||"U"in s)&&("w"in s||(s.w="u"in s?s.u%7:"W"in s?1:0),t="Z"in s?Wc(Hc(s.y,0,1)).getUTCDay():pc(Hc(s.y,0,1)).getDay(),s.m=0,s.d="W"in s?(s.w+6)%7+7*s.W-(t+5)%7:s.w+7*s.U-(t+6)%7);return"Z"in s?(s.H+=s.Z/100|0,s.M+=s.Z%100,Wc(s)):pc(s)}}function h(B,Q,F,U){for(var t,s,I=0,g=Q.length,i=F.length;I<g;){if(U>=i)return-1;if(37===(t=Q.charCodeAt(I++))){if(t=Q.charAt(I++),!(s=x[t in wc?Q.charAt(I++):t])||(U=s(B,F,U))<0)return-1}else if(t!=F.charCodeAt(U++))return-1}return U}return u.x=L(F,u),u.X=L(U,u),u.c=L(Q,u),r.x=L(F,r),r.X=L(U,r),r.c=L(Q,r),{format:function(B){var Q=L(B+="",u);return Q.toString=function(){return B},Q},parse:function(B){var Q=A(B+="",!1);return Q.toString=function(){return B},Q},utcFormat:function(B){var Q=L(B+="",r);return Q.toString=function(){return B},Q},utcParse:function(B){var Q=A(B+="",!0);return Q.toString=function(){return B},Q}}}(B),Yc=Dc.format,Dc.parse,fc=Dc.utcFormat,Dc.utcParse}({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});var Cn=dn("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"),an=dn("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666"),bn=dn("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666"),on=dn("4269d0efb118ff725c6cc5b03ca951ff8ab7a463f297bbf59c6b4e9498a0"),Gn=dn("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928"),un=dn("fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2"),rn=dn("b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc"),xn=dn("e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999"),Ln=dn("66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3"),An=dn("8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f"),hn=dn("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab"),Rn=B=>bt(B[B.length-1]),yn=new Array(3).concat("d8b365f5f5f55ab4ac","a6611adfc27d80cdc1018571","a6611adfc27df5f5f580cdc1018571","8c510ad8b365f6e8c3c7eae55ab4ac01665e","8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e","8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e","8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e","5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30","5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30").map(dn),Vn=Rn(yn),Zn=new Array(3).concat("af8dc3f7f7f77fbf7b","7b3294c2a5cfa6dba0008837","7b3294c2a5cff7f7f7a6dba0008837","762a83af8dc3e7d4e8d9f0d37fbf7b1b7837","762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837","762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837","762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837","40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b","40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b").map(dn),Sn=Rn(Zn),mn=new Array(3).concat("e9a3c9f7f7f7a1d76a","d01c8bf1b6dab8e1864dac26","d01c8bf1b6daf7f7f7b8e1864dac26","c51b7de9a3c9fde0efe6f5d0a1d76a4d9221","c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221","c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221","c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221","8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419","8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419").map(dn),En=Rn(mn),Nn=new Array(3).concat("998ec3f7f7f7f1a340","5e3c99b2abd2fdb863e66101","5e3c99b2abd2f7f7f7fdb863e66101","542788998ec3d8daebfee0b6f1a340b35806","542788998ec3d8daebf7f7f7fee0b6f1a340b35806","5427888073acb2abd2d8daebfee0b6fdb863e08214b35806","5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806","2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08","2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08").map(dn),Xn=Rn(Nn),pn=new Array(3).concat("ef8a62f7f7f767a9cf","ca0020f4a58292c5de0571b0","ca0020f4a582f7f7f792c5de0571b0","b2182bef8a62fddbc7d1e5f067a9cf2166ac","b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac","b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac","b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac","67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061","67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061").map(dn),Wn=Rn(pn),Hn=new Array(3).concat("ef8a62ffffff999999","ca0020f4a582bababa404040","ca0020f4a582ffffffbababa404040","b2182bef8a62fddbc7e0e0e09999994d4d4d","b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d","b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d","b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d","67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a","67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a").map(dn),Dn=Rn(Hn),Yn=new Array(3).concat("fc8d59ffffbf91bfdb","d7191cfdae61abd9e92c7bb6","d7191cfdae61ffffbfabd9e92c7bb6","d73027fc8d59fee090e0f3f891bfdb4575b4","d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4","d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4","d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4","a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695","a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695").map(dn),fn=Rn(Yn),wn=new Array(3).concat("fc8d59ffffbf91cf60","d7191cfdae61a6d96a1a9641","d7191cfdae61ffffbfa6d96a1a9641","d73027fc8d59fee08bd9ef8b91cf601a9850","d73027fc8d59fee08bffffbfd9ef8b91cf601a9850","d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850","d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850","a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837","a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837").map(dn),Jn=Rn(wn),vn=new Array(3).concat("fc8d59ffffbf99d594","d7191cfdae61abdda42b83ba","d7191cfdae61ffffbfabdda42b83ba","d53e4ffc8d59fee08be6f59899d5943288bd","d53e4ffc8d59fee08bffffbfe6f59899d5943288bd","d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd","d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd","9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2","9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2").map(dn),kn=Rn(vn),Mn=new Array(3).concat("e5f5f999d8c92ca25f","edf8fbb2e2e266c2a4238b45","edf8fbb2e2e266c2a42ca25f006d2c","edf8fbccece699d8c966c2a42ca25f006d2c","edf8fbccece699d8c966c2a441ae76238b45005824","f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824","f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b").map(dn),Tn=Rn(Mn),zn=new Array(3).concat("e0ecf49ebcda8856a7","edf8fbb3cde38c96c688419d","edf8fbb3cde38c96c68856a7810f7c","edf8fbbfd3e69ebcda8c96c68856a7810f7c","edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b","f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b","f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b").map(dn),Kn=Rn(zn),On=new Array(3).concat("e0f3dba8ddb543a2ca","f0f9e8bae4bc7bccc42b8cbe","f0f9e8bae4bc7bccc443a2ca0868ac","f0f9e8ccebc5a8ddb57bccc443a2ca0868ac","f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e","f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e","f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081").map(dn),Pn=Rn(On),jn=new Array(3).concat("fee8c8fdbb84e34a33","fef0d9fdcc8afc8d59d7301f","fef0d9fdcc8afc8d59e34a33b30000","fef0d9fdd49efdbb84fc8d59e34a33b30000","fef0d9fdd49efdbb84fc8d59ef6548d7301f990000","fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000","fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000").map(dn),_n=Rn(jn),$n=new Array(3).concat("ece2f0a6bddb1c9099","f6eff7bdc9e167a9cf02818a","f6eff7bdc9e167a9cf1c9099016c59","f6eff7d0d1e6a6bddb67a9cf1c9099016c59","f6eff7d0d1e6a6bddb67a9cf3690c002818a016450","fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450","fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636").map(dn),qn=Rn($n),Bd=new Array(3).concat("ece7f2a6bddb2b8cbe","f1eef6bdc9e174a9cf0570b0","f1eef6bdc9e174a9cf2b8cbe045a8d","f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d","f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b","fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b","fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858").map(dn),Qd=Rn(Bd),Fd=new Array(3).concat("e7e1efc994c7dd1c77","f1eef6d7b5d8df65b0ce1256","f1eef6d7b5d8df65b0dd1c77980043","f1eef6d4b9dac994c7df65b0dd1c77980043","f1eef6d4b9dac994c7df65b0e7298ace125691003f","f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f","f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f").map(dn),Ud=Rn(Fd),td=new Array(3).concat("fde0ddfa9fb5c51b8a","feebe2fbb4b9f768a1ae017e","feebe2fbb4b9f768a1c51b8a7a0177","feebe2fcc5c0fa9fb5f768a1c51b8a7a0177","feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177","fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177","fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a").map(dn),sd=Rn(td),Id=new Array(3).concat("edf8b17fcdbb2c7fb8","ffffcca1dab441b6c4225ea8","ffffcca1dab441b6c42c7fb8253494","ffffccc7e9b47fcdbb41b6c42c7fb8253494","ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84","ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84","ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58").map(dn),gd=Rn(Id),id=new Array(3).concat("f7fcb9addd8e31a354","ffffccc2e69978c679238443","ffffccc2e69978c67931a354006837","ffffccd9f0a3addd8e78c67931a354006837","ffffccd9f0a3addd8e78c67941ab5d238443005a32","ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32","ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529").map(dn),ld=Rn(id),cd=new Array(3).concat("fff7bcfec44fd95f0e","ffffd4fed98efe9929cc4c02","ffffd4fed98efe9929d95f0e993404","ffffd4fee391fec44ffe9929d95f0e993404","ffffd4fee391fec44ffe9929ec7014cc4c028c2d04","ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04","ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506").map(dn),ed=Rn(cd),nd=new Array(3).concat("ffeda0feb24cf03b20","ffffb2fecc5cfd8d3ce31a1c","ffffb2fecc5cfd8d3cf03b20bd0026","ffffb2fed976feb24cfd8d3cf03b20bd0026","ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026","ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026","ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026").map(dn),dd=Rn(nd),Cd=new Array(3).concat("deebf79ecae13182bd","eff3ffbdd7e76baed62171b5","eff3ffbdd7e76baed63182bd08519c","eff3ffc6dbef9ecae16baed63182bd08519c","eff3ffc6dbef9ecae16baed64292c62171b5084594","f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594","f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b").map(dn),ad=Rn(Cd),bd=new Array(3).concat("e5f5e0a1d99b31a354","edf8e9bae4b374c476238b45","edf8e9bae4b374c47631a354006d2c","edf8e9c7e9c0a1d99b74c47631a354006d2c","edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32","f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32","f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b").map(dn),od=Rn(bd),Gd=new Array(3).concat("f0f0f0bdbdbd636363","f7f7f7cccccc969696525252","f7f7f7cccccc969696636363252525","f7f7f7d9d9d9bdbdbd969696636363252525","f7f7f7d9d9d9bdbdbd969696737373525252252525","fffffff0f0f0d9d9d9bdbdbd969696737373525252252525","fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000").map(dn),ud=Rn(Gd),rd=new Array(3).concat("efedf5bcbddc756bb1","f2f0f7cbc9e29e9ac86a51a3","f2f0f7cbc9e29e9ac8756bb154278f","f2f0f7dadaebbcbddc9e9ac8756bb154278f","f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486","fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486","fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d").map(dn),xd=Rn(rd),Ld=new Array(3).concat("fee0d2fc9272de2d26","fee5d9fcae91fb6a4acb181d","fee5d9fcae91fb6a4ade2d26a50f15","fee5d9fcbba1fc9272fb6a4ade2d26a50f15","fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d","fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d","fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d").map(dn),Ad=Rn(Ld),hd=new Array(3).concat("fee6cefdae6be6550d","feeddefdbe85fd8d3cd94701","feeddefdbe85fd8d3ce6550da63603","feeddefdd0a2fdae6bfd8d3ce6550da63603","feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04","fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04","fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704").map(dn),Rd=Rn(hd);function yd(B){return B=Math.max(0,Math.min(1,B)),"rgb("+Math.max(0,Math.min(255,Math.round(-4.54-B*(35.34-B*(2381.73-B*(6402.7-B*(7024.72-2710.57*B)))))))+", "+Math.max(0,Math.min(255,Math.round(32.49+B*(170.73+B*(52.82-B*(131.46-B*(176.58-67.37*B)))))))+", "+Math.max(0,Math.min(255,Math.round(81.24+B*(442.36-B*(2482.43-B*(6167.24-B*(6614.94-2475.67*B)))))))+")"}var Vd=Dt(It(300,.5,0),It(-240,.5,1)),Zd=Dt(It(-100,.75,.35),It(80,1.5,.8)),Sd=Dt(It(260,.75,.35),It(80,1.5,.8)),md=It();function Ed(B){(B<0||B>1)&&(B-=Math.floor(B));var Q=Math.abs(B-.5);return md.h=360*B-100,md.s=1.5-1.5*Q,md.l=.8-.9*Q,md+""}var Nd=rU(),Xd=Math.PI/3,pd=2*Math.PI/3;function Wd(B){var Q;return B=(.5-B)*Math.PI,Nd.r=255*(Q=Math.sin(B))*Q,Nd.g=255*(Q=Math.sin(B+Xd))*Q,Nd.b=255*(Q=Math.sin(B+pd))*Q,Nd+""}function Hd(B){return B=Math.max(0,Math.min(1,B)),"rgb("+Math.max(0,Math.min(255,Math.round(34.61+B*(1172.33-B*(10793.56-B*(33300.12-B*(38394.49-14825.05*B)))))))+", "+Math.max(0,Math.min(255,Math.round(23.31+B*(557.33+B*(1225.33-B*(3574.96-B*(1073.77+707.56*B)))))))+", "+Math.max(0,Math.min(255,Math.round(27.2+B*(3211.1-B*(15327.97-B*(27814-B*(22569.18-6838.66*B)))))))+")"}function Dd(B){var Q=B.length;return function(F){return B[Math.max(0,Math.min(Q-1,Math.floor(F*Q)))]}}var Yd=Dd(dn("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")),fd=Dd(dn("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")),wd=Dd(dn("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")),Jd=Dd(dn("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));function vd(B){return function(){return B}}const kd=Math.cos,Md=Math.min,Td=Math.sin,zd=Math.sqrt,Kd=Math.PI,Od=2*Kd;function Pd(B){this._context=B}function jd(B){return new Pd(B)}function _d(B){return B[0]}function $d(B){return B[1]}function qd(B,Q){var F=vd(!0),U=null,t=jd,s=null,I=function(B){let Q=3;return B.digits=function(F){if(!arguments.length)return Q;if(null==F)Q=null;else{const B=Math.floor(F);if(!(B>=0))throw new RangeError(`invalid digits: ${F}`);Q=B}return B},()=>new Js(Q)}(g);function g(g){var i,l,c,e=(g=function(B){return"object"==typeof B&&"length"in B?B:Array.from(B)}(g)).length,n=!1;for(null==U&&(s=t(c=I())),i=0;i<=e;++i)!(i<e&&F(l=g[i],i,g))===n&&((n=!n)?s.lineStart():s.lineEnd()),n&&s.point(+B(l,i,g),+Q(l,i,g));if(c)return s=null,c+""||null}return B="function"==typeof B?B:void 0===B?_d:vd(B),Q="function"==typeof Q?Q:void 0===Q?$d:vd(Q),g.x=function(Q){return arguments.length?(B="function"==typeof Q?Q:vd(+Q),g):B},g.y=function(B){return arguments.length?(Q="function"==typeof B?B:vd(+B),g):Q},g.defined=function(B){return arguments.length?(F="function"==typeof B?B:vd(!!B),g):F},g.curve=function(B){return arguments.length?(t=B,null!=U&&(s=t(U)),g):t},g.context=function(B){return arguments.length?(null==B?U=s=null:s=t(U=B),g):U},g}Pd.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(B,Q){switch(B=+B,Q=+Q,this._point){case 0:this._point=1,this._line?this._context.lineTo(B,Q):this._context.moveTo(B,Q);break;case 1:this._point=2;default:this._context.lineTo(B,Q)}}};class BC{constructor(B,Q){this._context=B,this._x=Q}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line}point(B,Q){switch(B=+B,Q=+Q,this._point){case 0:this._point=1,this._line?this._context.lineTo(B,Q):this._context.moveTo(B,Q);break;case 1:this._point=2;default:this._x?this._context.bezierCurveTo(this._x0=(this._x0+B)/2,this._y0,this._x0,Q,B,Q):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+Q)/2,B,this._y0,B,Q)}this._x0=B,this._y0=Q}}const QC=zd(3);var FC={draw(B,Q){const F=.59436*zd(Q+Md(Q/28,.75)),U=F/2,t=U*QC;B.moveTo(0,F),B.lineTo(0,-F),B.moveTo(-t,-U),B.lineTo(t,U),B.moveTo(-t,U),B.lineTo(t,-U)}},UC={draw(B,Q){const F=zd(Q/Kd);B.moveTo(F,0),B.arc(0,0,F,0,Od)}},tC={draw(B,Q){const F=zd(Q/5)/2;B.moveTo(-3*F,-F),B.lineTo(-F,-F),B.lineTo(-F,-3*F),B.lineTo(F,-3*F),B.lineTo(F,-F),B.lineTo(3*F,-F),B.lineTo(3*F,F),B.lineTo(F,F),B.lineTo(F,3*F),B.lineTo(-F,3*F),B.lineTo(-F,F),B.lineTo(-3*F,F),B.closePath()}};const sC=zd(1/3),IC=2*sC;var gC={draw(B,Q){const F=zd(Q/IC),U=F*sC;B.moveTo(0,-F),B.lineTo(U,0),B.lineTo(0,F),B.lineTo(-U,0),B.closePath()}},iC={draw(B,Q){const F=.62625*zd(Q);B.moveTo(0,-F),B.lineTo(F,0),B.lineTo(0,F),B.lineTo(-F,0),B.closePath()}},lC={draw(B,Q){const F=.87559*zd(Q-Md(Q/7,2));B.moveTo(-F,0),B.lineTo(F,0),B.moveTo(0,F),B.lineTo(0,-F)}},cC={draw(B,Q){const F=zd(Q),U=-F/2;B.rect(U,U,F,F)}},eC={draw(B,Q){const F=.4431*zd(Q);B.moveTo(F,F),B.lineTo(F,-F),B.lineTo(-F,-F),B.lineTo(-F,F),B.closePath()}};const nC=Td(Kd/10)/Td(7*Kd/10),dC=Td(Od/10)*nC,CC=-kd(Od/10)*nC;var aC={draw(B,Q){const F=zd(.8908130915292852*Q),U=dC*F,t=CC*F;B.moveTo(0,-F),B.lineTo(U,t);for(let Q=1;Q<5;++Q){const s=Od*Q/5,I=kd(s),g=Td(s);B.lineTo(g*F,-I*F),B.lineTo(I*U-g*t,g*U+I*t)}B.closePath()}};const bC=zd(3);var oC={draw(B,Q){const F=-zd(Q/(3*bC));B.moveTo(0,2*F),B.lineTo(-bC*F,-F),B.lineTo(bC*F,-F),B.closePath()}};const GC=zd(3);var uC={draw(B,Q){const F=.6824*zd(Q),U=F/2,t=F*GC/2;B.moveTo(0,-F),B.lineTo(t,U),B.lineTo(-t,U),B.closePath()}};const rC=-.5,xC=zd(3)/2,LC=1/zd(12),AC=3*(LC/2+1);var hC={draw(B,Q){const F=zd(Q/AC),U=F/2,t=F*LC,s=U,I=F*LC+F,g=-s,i=I;B.moveTo(U,t),B.lineTo(s,I),B.lineTo(g,i),B.lineTo(rC*U-xC*t,xC*U+rC*t),B.lineTo(rC*s-xC*I,xC*s+rC*I),B.lineTo(rC*g-xC*i,xC*g+rC*i),B.lineTo(rC*U+xC*t,rC*t-xC*U),B.lineTo(rC*s+xC*I,rC*I-xC*s),B.lineTo(rC*g+xC*i,rC*i-xC*g),B.closePath()}},RC={draw(B,Q){const F=.6189*zd(Q-Md(Q/6,1.7));B.moveTo(-F,-F),B.lineTo(F,F),B.moveTo(-F,F),B.lineTo(F,-F)}};const yC=[UC,tC,gC,cC,aC,oC,hC],VC=[UC,lC,RC,uC,FC,eC,iC];function ZC(){}function SC(B,Q,F){B._context.bezierCurveTo((2*B._x0+B._x1)/3,(2*B._y0+B._y1)/3,(B._x0+2*B._x1)/3,(B._y0+2*B._y1)/3,(B._x0+4*B._x1+Q)/6,(B._y0+4*B._y1+F)/6)}function mC(B){this._context=B}function EC(B){this._context=B}function NC(B){this._context=B}function XC(B,Q){this._basis=new mC(B),this._beta=Q}mC.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:SC(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(B,Q){switch(B=+B,Q=+Q,this._point){case 0:this._point=1,this._line?this._context.lineTo(B,Q):this._context.moveTo(B,Q);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:SC(this,B,Q)}this._x0=this._x1,this._x1=B,this._y0=this._y1,this._y1=Q}},EC.prototype={areaStart:ZC,areaEnd:ZC,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x2,this._y2),this._context.closePath();break;case 2:this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break;case 3:this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4)}},point:function(B,Q){switch(B=+B,Q=+Q,this._point){case 0:this._point=1,this._x2=B,this._y2=Q;break;case 1:this._point=2,this._x3=B,this._y3=Q;break;case 2:this._point=3,this._x4=B,this._y4=Q,this._context.moveTo((this._x0+4*this._x1+B)/6,(this._y0+4*this._y1+Q)/6);break;default:SC(this,B,Q)}this._x0=this._x1,this._x1=B,this._y0=this._y1,this._y1=Q}},NC.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(B,Q){switch(B=+B,Q=+Q,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var F=(this._x0+4*this._x1+B)/6,U=(this._y0+4*this._y1+Q)/6;this._line?this._context.lineTo(F,U):this._context.moveTo(F,U);break;case 3:this._point=4;default:SC(this,B,Q)}this._x0=this._x1,this._x1=B,this._y0=this._y1,this._y1=Q}},XC.prototype={lineStart:function(){this._x=[],this._y=[],this._basis.lineStart()},lineEnd:function(){var B=this._x,Q=this._y,F=B.length-1;if(F>0)for(var U,t=B[0],s=Q[0],I=B[F]-t,g=Q[F]-s,i=-1;++i<=F;)U=i/F,this._basis.point(this._beta*B[i]+(1-this._beta)*(t+U*I),this._beta*Q[i]+(1-this._beta)*(s+U*g));this._x=this._y=null,this._basis.lineEnd()},point:function(B,Q){this._x.push(+B),this._y.push(+Q)}};var pC=function B(Q){function F(B){return 1===Q?new mC(B):new XC(B,Q)}return F.beta=function(Q){return B(+Q)},F}(.85);function WC(B,Q,F){B._context.bezierCurveTo(B._x1+B._k*(B._x2-B._x0),B._y1+B._k*(B._y2-B._y0),B._x2+B._k*(B._x1-Q),B._y2+B._k*(B._y1-F),B._x2,B._y2)}function HC(B,Q){this._context=B,this._k=(1-Q)/6}HC.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:WC(this,this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(B,Q){switch(B=+B,Q=+Q,this._point){case 0:this._point=1,this._line?this._context.lineTo(B,Q):this._context.moveTo(B,Q);break;case 1:this._point=2,this._x1=B,this._y1=Q;break;case 2:this._point=3;default:WC(this,B,Q)}this._x0=this._x1,this._x1=this._x2,this._x2=B,this._y0=this._y1,this._y1=this._y2,this._y2=Q}};var DC=function B(Q){function F(B){return new HC(B,Q)}return F.tension=function(Q){return B(+Q)},F}(0);function YC(B,Q){this._context=B,this._k=(1-Q)/6}YC.prototype={areaStart:ZC,areaEnd:ZC,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(B,Q){switch(B=+B,Q=+Q,this._point){case 0:this._point=1,this._x3=B,this._y3=Q;break;case 1:this._point=2,this._context.moveTo(this._x4=B,this._y4=Q);break;case 2:this._point=3,this._x5=B,this._y5=Q;break;default:WC(this,B,Q)}this._x0=this._x1,this._x1=this._x2,this._x2=B,this._y0=this._y1,this._y1=this._y2,this._y2=Q}};var fC=function B(Q){function F(B){return new YC(B,Q)}return F.tension=function(Q){return B(+Q)},F}(0);function wC(B,Q){this._context=B,this._k=(1-Q)/6}wC.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(B,Q){switch(B=+B,Q=+Q,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:WC(this,B,Q)}this._x0=this._x1,this._x1=this._x2,this._x2=B,this._y0=this._y1,this._y1=this._y2,this._y2=Q}};var JC=function B(Q){function F(B){return new wC(B,Q)}return F.tension=function(Q){return B(+Q)},F}(0);function vC(B,Q,F){var U=B._x1,t=B._y1,s=B._x2,I=B._y2;if(B._l01_a>1e-12){var g=2*B._l01_2a+3*B._l01_a*B._l12_a+B._l12_2a,i=3*B._l01_a*(B._l01_a+B._l12_a);U=(U*g-B._x0*B._l12_2a+B._x2*B._l01_2a)/i,t=(t*g-B._y0*B._l12_2a+B._y2*B._l01_2a)/i}if(B._l23_a>1e-12){var l=2*B._l23_2a+3*B._l23_a*B._l12_a+B._l12_2a,c=3*B._l23_a*(B._l23_a+B._l12_a);s=(s*l+B._x1*B._l23_2a-Q*B._l12_2a)/c,I=(I*l+B._y1*B._l23_2a-F*B._l12_2a)/c}B._context.bezierCurveTo(U,t,s,I,B._x2,B._y2)}function kC(B,Q){this._context=B,this._alpha=Q}kC.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(B,Q){if(B=+B,Q=+Q,this._point){var F=this._x2-B,U=this._y2-Q;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(F*F+U*U,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(B,Q):this._context.moveTo(B,Q);break;case 1:this._point=2;break;case 2:this._point=3;default:vC(this,B,Q)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=B,this._y0=this._y1,this._y1=this._y2,this._y2=Q}};var MC=function B(Q){function F(B){return Q?new kC(B,Q):new HC(B,0)}return F.alpha=function(Q){return B(+Q)},F}(.5);function TC(B,Q){this._context=B,this._alpha=Q}TC.prototype={areaStart:ZC,areaEnd:ZC,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(B,Q){if(B=+B,Q=+Q,this._point){var F=this._x2-B,U=this._y2-Q;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(F*F+U*U,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=B,this._y3=Q;break;case 1:this._point=2,this._context.moveTo(this._x4=B,this._y4=Q);break;case 2:this._point=3,this._x5=B,this._y5=Q;break;default:vC(this,B,Q)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=B,this._y0=this._y1,this._y1=this._y2,this._y2=Q}};var zC=function B(Q){function F(B){return Q?new TC(B,Q):new YC(B,0)}return F.alpha=function(Q){return B(+Q)},F}(.5);function KC(B,Q){this._context=B,this._alpha=Q}KC.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(B,Q){if(B=+B,Q=+Q,this._point){var F=this._x2-B,U=this._y2-Q;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(F*F+U*U,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:vC(this,B,Q)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=B,this._y0=this._y1,this._y1=this._y2,this._y2=Q}};var OC=function B(Q){function F(B){return Q?new KC(B,Q):new wC(B,0)}return F.alpha=function(Q){return B(+Q)},F}(.5);function PC(B){this._context=B}function jC(B){return B<0?-1:1}function _C(B,Q,F){var U=B._x1-B._x0,t=Q-B._x1,s=(B._y1-B._y0)/(U||t<0&&-0),I=(F-B._y1)/(t||U<0&&-0),g=(s*t+I*U)/(U+t);return(jC(s)+jC(I))*Math.min(Math.abs(s),Math.abs(I),.5*Math.abs(g))||0}function $C(B,Q){var F=B._x1-B._x0;return F?(3*(B._y1-B._y0)/F-Q)/2:Q}function qC(B,Q,F){var U=B._x0,t=B._y0,s=B._x1,I=B._y1,g=(s-U)/3;B._context.bezierCurveTo(U+g,t+g*Q,s-g,I-g*F,s,I)}function Ba(B){this._context=B}function Qa(B){this._context=new Fa(B)}function Fa(B){this._context=B}function Ua(B){this._context=B}function ta(B){var Q,F,U=B.length-1,t=new Array(U),s=new Array(U),I=new Array(U);for(t[0]=0,s[0]=2,I[0]=B[0]+2*B[1],Q=1;Q<U-1;++Q)t[Q]=1,s[Q]=4,I[Q]=4*B[Q]+2*B[Q+1];for(t[U-1]=2,s[U-1]=7,I[U-1]=8*B[U-1]+B[U],Q=1;Q<U;++Q)F=t[Q]/s[Q-1],s[Q]-=F,I[Q]-=F*I[Q-1];for(t[U-1]=I[U-1]/s[U-1],Q=U-2;Q>=0;--Q)t[Q]=(I[Q]-t[Q+1])/s[Q];for(s[U-1]=(B[U]+t[U-1])/2,Q=0;Q<U-1;++Q)s[Q]=2*B[Q+1]-t[Q+1];return[t,s]}function sa(B,Q){this._context=B,this._t=Q}function Ia(B,Q,F){this.k=B,this.x=Q,this.y=F}PC.prototype={areaStart:ZC,areaEnd:ZC,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(B,Q){B=+B,Q=+Q,this._point?this._context.lineTo(B,Q):(this._point=1,this._context.moveTo(B,Q))}},Ba.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:qC(this,this._t0,$C(this,this._t0))}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(B,Q){var F=NaN;if(Q=+Q,(B=+B)!==this._x1||Q!==this._y1){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(B,Q):this._context.moveTo(B,Q);break;case 1:this._point=2;break;case 2:this._point=3,qC(this,$C(this,F=_C(this,B,Q)),F);break;default:qC(this,this._t0,F=_C(this,B,Q))}this._x0=this._x1,this._x1=B,this._y0=this._y1,this._y1=Q,this._t0=F}}},(Qa.prototype=Object.create(Ba.prototype)).point=function(B,Q){Ba.prototype.point.call(this,Q,B)},Fa.prototype={moveTo:function(B,Q){this._context.moveTo(Q,B)},closePath:function(){this._context.closePath()},lineTo:function(B,Q){this._context.lineTo(Q,B)},bezierCurveTo:function(B,Q,F,U,t,s){this._context.bezierCurveTo(Q,B,U,F,s,t)}},Ua.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var B=this._x,Q=this._y,F=B.length;if(F)if(this._line?this._context.lineTo(B[0],Q[0]):this._context.moveTo(B[0],Q[0]),2===F)this._context.lineTo(B[1],Q[1]);else for(var U=ta(B),t=ta(Q),s=0,I=1;I<F;++s,++I)this._context.bezierCurveTo(U[0][s],t[0][s],U[1][s],t[1][s],B[I],Q[I]);(this._line||0!==this._line&&1===F)&&this._context.closePath(),this._line=1-this._line,this._x=this._y=null},point:function(B,Q){this._x.push(+B),this._y.push(+Q)}},sa.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=this._y=NaN,this._point=0},lineEnd:function(){0<this._t&&this._t<1&&2===this._point&&this._context.lineTo(this._x,this._y),(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line>=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(B,Q){switch(B=+B,Q=+Q,this._point){case 0:this._point=1,this._line?this._context.lineTo(B,Q):this._context.moveTo(B,Q);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,Q),this._context.lineTo(B,Q);else{var F=this._x*(1-this._t)+B*this._t;this._context.lineTo(F,this._y),this._context.lineTo(F,Q)}}this._x=B,this._y=Q}},Ia.prototype={constructor:Ia,scale:function(B){return 1===B?this:new Ia(this.k*B,this.x,this.y)},translate:function(B,Q){return 0===B&0===Q?this:new Ia(this.k,this.x+this.k*B,this.y+this.k*Q)},apply:function(B){return[B[0]*this.k+this.x,B[1]*this.k+this.y]},applyX:function(B){return B*this.k+this.x},applyY:function(B){return B*this.k+this.y},invert:function(B){return[(B[0]-this.x)/this.k,(B[1]-this.y)/this.k]},invertX:function(B){return(B-this.x)/this.k},invertY:function(B){return(B-this.y)/this.k},rescaleX:function(B){return B.copy().domain(B.range().map(this.invertX,this).map(B.invert,B))},rescaleY:function(B){return B.copy().domain(B.range().map(this.invertY,this).map(B.invert,B))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}},Ia.prototype;class ga extends iB{getComputedStyleValue(B){return getComputedStyle(this).getPropertyValue(B).trim()}firstUpdated(B){super.firstUpdated(B),fF(this.renderRoot.host).classed("keyboard",!0).on("mousemove.keyboard touchstart.keyboard",B=>{fF(B.currentTarget.renderRoot.host).classed("keyboard",!1).on("mousemove.keyboard touchstart.keyboard",null)}).on("keydown.keyboard",B=>{fF(B.currentTarget.renderRoot.host).classed("keyboard",!0).on("keydown.keyboard mousemove.keyboard touchstart.keyboard",null)})}static get greys(){const B="#999999",Q={white:"#ffffff"};return Q.light75=Ct(B,"#ffffff")(.75),Q.light50=Ct(B,"#ffffff")(.5),Q.light25=Ct(B,"#ffffff")(.25),Q.grey=B,Q.dark25=Ct(B,"#000000")(.25),Q.dark50=Ct(B,"#000000")(.5),Q.dark75=Ct(B,"#000000")(.75),Q.black="#000000",Q}static get shadows(){return{elevations:[0,2,4,8,16],baselineColor:"#000000",baselineColorString:"0, 0, 0",inverseBaselineColor:"#FFFFFF",inverseBaselineColorString:"255, 255, 255",opacityUmbra:.2,opacityPenumbra:.14,opacityAmbient:.12,opacityBoost:.2,mapUmbra:{0:{x:0,y:0,b:0,s:0},2:{x:0,y:3,b:1,s:-2},4:{x:0,y:2,b:4,s:-1},8:{x:0,y:5,b:5,s:-3},16:{x:0,y:8,b:10,s:-5}},mapPenumbra:{0:{x:0,y:0,b:0,s:0},2:{x:0,y:2,b:2,s:0},4:{x:0,y:4,b:5,s:0},8:{x:0,y:8,b:10,s:1},16:{x:0,y:16,b:24,s:2}},mapAmbient:{0:{x:0,y:0,b:0,s:0},2:{x:0,y:1,b:5,s:0},4:{x:0,y:1,b:10,s:0},8:{x:0,y:3,b:14,s:2},16:{x:0,y:6,b:30,s:5}}}}static cssBoxShadow(B,Q=!1,F=!1){const U=this.shadows.opacityUmbra+this.shadows.opacityBoost,t=this.shadows.opacityPenumbra+this.shadows.opacityBoost,s=this.shadows.opacityAmbient+this.shadows.opacityBoost,I=F?`rgba(${this.shadows.inverseBaselineColorString}, ${U})`:`rgba(${this.shadows.baselineColorString}, ${U})`,g=F?`rgba(${this.shadows.inverseBaselineColorString}, ${t})`:`rgba(${this.shadows.baselineColorString}, ${t})`,i=F?`rgba(${this.shadows.inverseBaselineColorString}, ${s})`:`rgba(${this.shadows.baselineColorString}, ${s})`,l=this.shadows.mapUmbra[B],c=this.shadows.mapPenumbra[B],e=this.shadows.mapAmbient[B];return`${Q?`${-l.y}px ${l.y/2}px ${l.b}px ${l.s}px`:`${l.y/2}px ${l.y}px ${l.b}px ${l.s}px`} ${I}, ${Q?`${-c.y}px ${c.y/2}px ${c.b}px ${c.s}px`:`${c.y/2}px ${c.y}px ${c.b}px ${c.s}px`} ${g}, ${Q?`${-e.y}px ${e.y/2}px ${e.b}px ${e.s}px`:`${e.y/2}px ${e.y}px ${e.b}px ${e.s}px`} ${i}`}static get svgDefs(){const B=ga.shadows,Q=B.elevations.map(Q=>`\n <filter id=shadow-${Q} filterUnits="userSpaceOnUse" x="-100%" y="-100%" width="200%" height="200%">\n <feComponentTransfer in="SourceAlpha" result="solid">\n <feFuncA type="table" tableValues="0 1 1"/>\n </feComponentTransfer>\n <feOffset in="solid" result="offU" dx=${B.mapUmbra[Q].y/2} dy=${B.mapUmbra[Q].y} />\n <feOffset in="solid" result="offP" dx=${B.mapPenumbra[Q].y/2} dy=${B.mapPenumbra[Q].y} />\n <feOffset in="solid" result="offA" dx=${B.mapAmbient[Q].y/2} dy=${B.mapAmbient[Q].y} />\n ${0===B.mapUmbra[Q].s?"":`<feMorphology in="offU" result="spreadU" operator=${B.mapUmbra[Q].s>0?"dilate":"erode"} radius=${Math.abs(B.mapUmbra[Q].s)} />`}\n ${0===B.mapPenumbra[Q].s?"":`<feMorphology in="offP" result="spreadP" operator=${B.mapPenumbra[Q].s>0?"dilate":"erode"} radius=${Math.abs(B.mapPenumbra[Q].s)} />`}\n ${0===B.mapAmbient[Q].s?"":`<feMorphology in="offA" result="spreadA" operator=${B.mapAmbient[Q].s>0?"dilate":"erode"} radius=${Math.abs(B.mapAmbient[Q].s)} />`}\n <feGaussianBlur in=${0===B.mapUmbra[Q].s?"offU":"spreadU"} result="blurU" stdDeviation=${B.mapUmbra[Q].b/2} />\n <feGaussianBlur in=${0===B.mapPenumbra[Q].s?"offP":"spreadP"} result="blurP" stdDeviation=${B.mapPenumbra[Q].b/2} />\n <feGaussianBlur in=${0===B.mapAmbient[Q].s?"offA":"spreadA"} result="blurA" stdDeviation=${B.mapAmbient[Q].b/2} />\n <feFlood in="SourceGraphic" result="opU" flood-color=${B.baselineColor} flood-opacity=${B.opacityUmbra+B.opacityBoost} />\n <feFlood in="SourceGraphic" result="opP" flood-color=${B.baselineColor} flood-opacity=${B.opacityPenumbra+B.opacityBoost} />\n <feFlood in="SourceGraphic" result="opA" flood-color=${B.baselineColor} flood-opacity=${B.opacityAmbient+B.opacityBoost} />\n <feComposite in="opU" in2="blurU" result="shU" operator="in" />\n <feComposite in="opP" in2="blurP" result="shP" operator="in" />\n <feComposite in="opA" in2="blurA" result="shA" operator="in" />\n <feMorphology in="solid" result="smaller" operator="erode" radius="1" />\n <feComposite in="shU" in2="smaller" result="finalU" operator="out" />\n <feComposite in="shP" in2="smaller" result="finalP" operator="out" />\n <feComposite in="shA" in2="smaller" result="finalA" operator="out" />\n <feMerge>\n <feMergeNode in="finalU" />\n <feMergeNode in="finalP" />\n <feMergeNode in="finalA" />\n <feMergeNode in="SourceGraphic" />\n </feMerge>\n </filter>`);return`\n <defs>\n ${Q}\n </defs>\n `}static get svgFilters(){const B=ga.shadows,Q=B.elevations.map(Q=>T`
23
23
  <filter id=${`shadow-${Q}`} x="-250%" y="-250%" width="600%" height="600%">
24
24
  <feComponentTransfer in="SourceAlpha" result="solid">
25
25
  <feFuncA type="table" tableValues="0 1 1"/>
@@ -1035,7 +1035,7 @@ const da=2;let Ca=class{constructor(B){}get _$AU(){return this._$AM._$AU}_$AT(B,
1035
1035
  * @license
1036
1036
  * Copyright 2017 Google LLC
1037
1037
  * SPDX-License-Identifier: BSD-3-Clause
1038
- */function ua(B){void 0!==this._$AN?(ba(this),this._$AM=B,oa(this)):this._$AM=B}function Ga(B,Q=!1,F=0){const U=this._$AH,t=this._$AN;if(void 0!==t&&0!==t.size)if(Q)if(Array.isArray(U))for(let B=F;B<U.length;B++)aa(U[B],!1),ba(U[B]);else null!=U&&(aa(U,!1),ba(U));else aa(this,B)}const ra=B=>{B.type==da&&(B._$AP??=Ga,B._$AQ??=ua)};class xa extends Ca{constructor(){super(...arguments),this._$AN=void 0}_$AT(B,Q,F){super._$AT(B,Q,F),oa(this),this.isConnected=B._$AU}_$AO(B,Q=!0){B!==this.isConnected&&(this.isConnected=B,B?this.reconnected?.():this.disconnected?.()),Q&&(aa(this,B),ba(this))}setValue(B){if((B=>void 0===B.strings)(this._$Ct))this._$Ct._$AI(B,this);else{const Q=[...this._$Ct._$AH];Q[this._$Ci]=B,this._$Ct._$AI(Q,this,0)}}disconnected(){}reconnected(){}}const Aa=new WeakMap;let La=0;const ha=new Map,Ra=new WeakSet,ya=()=>new Promise(B=>requestAnimationFrame(B)),Va=[{opacity:0},{opacity:1}],Za=(B,Q)=>{const F=B-Q;return 0===F?void 0:F},Sa=(B,Q)=>{const F=B/Q;return 1===F?void 0:F},ma={left:(B,Q)=>{const F=Za(B,Q);return{value:F,transform:null==F||isNaN(F)?void 0:`translateX(${F}px)`}},top:(B,Q)=>{const F=Za(B,Q);return{value:F,transform:null==F||isNaN(F)?void 0:`translateY(${F}px)`}},width:(B,Q)=>{let F;0===Q&&(Q=1,F={width:"1px"});const U=Sa(B,Q);return{value:U,overrideFrom:F,transform:null==U||isNaN(U)?void 0:`scaleX(${U})`}},height:(B,Q)=>{let F;0===Q&&(Q=1,F={height:"1px"});const U=Sa(B,Q);return{value:U,overrideFrom:F,transform:null==U||isNaN(U)?void 0:`scaleY(${U})`}}},Ea={duration:333,easing:"ease-in-out"},Na=["left","top","width","height","opacity","color","background"],Xa=new WeakMap;const pa=(B=>(...Q)=>({_$litDirective$:B,values:Q}))(class extends xa{constructor(B){if(super(B),this.t=!1,this.i=null,this.o=null,this.h=!0,this.shouldLog=!1,B.type===da)throw Error("The `animate` directive must be used in attribute position.");this.createFinished()}createFinished(){this.resolveFinished?.(),this.finished=new Promise(B=>{this.l=B})}async resolveFinished(){this.l?.(),this.l=void 0}render(B){return K}getController(){return Aa.get(this.u)}isDisabled(){return this.options.disabled||this.getController()?.disabled}update(B,[Q]){const F=void 0===this.u;return F&&(this.u=B.options?.host,this.u.addController(this),this.u.updateComplete.then(B=>this.t=!0),this.element=B.element,Xa.set(this.element,this)),this.optionsOrCallback=Q,(F||"function"!=typeof Q)&&this.p(Q),this.render(Q)}p(B){B=B??{};const Q=this.getController();void 0!==Q&&((B={...Q.defaultOptions,...B}).keyframeOptions={...Q.defaultOptions.keyframeOptions,...B.keyframeOptions}),B.properties??=Na,this.options=B}m(){const B={},Q=this.element.getBoundingClientRect(),F=getComputedStyle(this.element);return this.options.properties.forEach(U=>{const t=Q[U]??(ma[U]?void 0:F[U]),s=Number(t);B[U]=isNaN(s)?t+"":s}),B}v(){let B,Q=!0;return this.options.guard&&(B=this.options.guard(),Q=((B,Q)=>{if(Array.isArray(B)){if(Array.isArray(Q)&&Q.length===B.length&&B.every((B,F)=>B===Q[F]))return!1}else if(Q===B)return!1;return!0})(B,this._)),this.h=this.t&&!this.isDisabled()&&!this.isAnimating()&&Q&&this.element.isConnected,this.h&&(this._=Array.isArray(B)?Array.from(B):B),this.h}hostUpdate(){"function"==typeof this.optionsOrCallback&&this.p(this.optionsOrCallback()),this.v()&&(this.A=this.m(),this.i=this.i??this.element.parentNode,this.o=this.element.nextSibling)}async hostUpdated(){if(!this.h||!this.element.isConnected||this.options.skipInitial&&!this.isHostRendered)return;let B;this.prepare(),await ya;const Q=this.O(),F=this.j(this.options.keyframeOptions,Q),U=this.m();if(void 0!==this.A){const{from:F,to:t}=this.N(this.A,U,Q);this.log("measured",[this.A,U,F,t]),B=this.calculateKeyframes(F,t)}else{const F=ha.get(this.options.inId);if(F){ha.delete(this.options.inId);const{from:t,to:s}=this.N(F,U,Q);B=this.calculateKeyframes(t,s),B=this.options.in?[{...this.options.in[0],...B[0]},...this.options.in.slice(1),B[1]]:B,La++,B.forEach(B=>B.zIndex=La)}else this.options.in&&(B=[...this.options.in,{}])}this.animate(B,F)}resetStyles(){void 0!==this.P&&(this.element.setAttribute("style",this.P??""),this.P=void 0)}commitStyles(){this.P=this.element.getAttribute("style"),this.webAnimation?.commitStyles(),this.webAnimation?.cancel()}reconnected(){}async disconnected(){if(!this.h)return;if(void 0!==this.options.id&&ha.set(this.options.id,this.A),void 0===this.options.out)return;if(this.prepare(),await ya(),this.i?.isConnected){const B=this.o&&this.o.parentNode===this.i?this.o:null;if(this.i.insertBefore(this.element,B),this.options.stabilizeOut){const B=this.m();this.log("stabilizing out");const Q=this.A.left-B.left,F=this.A.top-B.top;!("static"===getComputedStyle(this.element).position)||0===Q&&0===F||(this.element.style.position="relative"),0!==Q&&(this.element.style.left=Q+"px"),0!==F&&(this.element.style.top=F+"px")}}const B=this.j(this.options.keyframeOptions);await this.animate(this.options.out,B),this.element.remove()}prepare(){this.createFinished()}start(){this.options.onStart?.(this)}didFinish(B){B&&this.options.onComplete?.(this),this.A=void 0,this.animatingProperties=void 0,this.frames=void 0,this.resolveFinished()}O(){const B=[];for(let Q=this.element.parentNode;Q;Q=Q?.parentNode){const F=Xa.get(Q);F&&!F.isDisabled()&&F&&B.push(F)}return B}get isHostRendered(){const B=Ra.has(this.u);return B||this.u.updateComplete.then(()=>{Ra.add(this.u)}),B}j(B,Q=this.O()){const F={...Ea};return Q.forEach(B=>Object.assign(F,B.options.keyframeOptions)),Object.assign(F,B),F}N(B,Q,F){B={...B},Q={...Q};const U=F.map(B=>B.animatingProperties).filter(B=>void 0!==B);let t=1,s=1;return U.length>0&&(U.forEach(B=>{B.width&&(t/=B.width),B.height&&(s/=B.height)}),void 0!==B.left&&void 0!==Q.left&&(B.left=t*B.left,Q.left=t*Q.left),void 0!==B.top&&void 0!==Q.top&&(B.top=s*B.top,Q.top=s*Q.top)),{from:B,to:Q}}calculateKeyframes(B,Q,F=!1){const U={},t={};let s=!1;const I={};for(const F in Q){const g=B[F],i=Q[F];if(F in ma){const B=ma[F];if(void 0===g||void 0===i)continue;const Q=B(g,i);void 0!==Q.transform&&(I[F]=Q.value,s=!0,U.transform=`${U.transform??""} ${Q.transform}`,void 0!==Q.overrideFrom&&Object.assign(U,Q.overrideFrom))}else g!==i&&void 0!==g&&void 0!==i&&(s=!0,U[F]=g,t[F]=i)}return U.transformOrigin=t.transformOrigin=F?"center center":"top left",this.animatingProperties=I,s?[U,t]:void 0}async animate(B,Q=this.options.keyframeOptions){this.start(),this.frames=B;let F=!1;if(!this.isAnimating()&&!this.isDisabled()&&(this.options.onFrames&&(this.frames=B=this.options.onFrames(this),this.log("modified frames",B)),void 0!==B)){this.log("animate",[B,Q]),F=!0,this.webAnimation=this.element.animate(B,Q);const U=this.getController();U?.add(this);try{await this.webAnimation.finished}catch(B){}U?.remove(this)}return this.didFinish(F),F}isAnimating(){return"running"===this.webAnimation?.playState||this.webAnimation?.pending}log(B,Q){this.shouldLog&&!this.isDisabled()&&console.log(B,this.options.id,Q)}});class Wa{static k={DEFAULT:.05,MIN:0,MAX:100,STEP:.001,JUMP:.01};static adk2v(B,Q,F){return B/(1+F*Q)}static adv2k(B,Q,F){return(B-F)/(F*Q)}}class Ha extends ca{static get properties(){return{numeric:{attribute:"numeric",type:Boolean,reflect:!0}}}constructor(){super(),this.numeric=!1}static get styles(){return[super.styles,g`
1038
+ */function Ga(B){void 0!==this._$AN?(ba(this),this._$AM=B,oa(this)):this._$AM=B}function ua(B,Q=!1,F=0){const U=this._$AH,t=this._$AN;if(void 0!==t&&0!==t.size)if(Q)if(Array.isArray(U))for(let B=F;B<U.length;B++)aa(U[B],!1),ba(U[B]);else null!=U&&(aa(U,!1),ba(U));else aa(this,B)}const ra=B=>{B.type==da&&(B._$AP??=ua,B._$AQ??=Ga)};class xa extends Ca{constructor(){super(...arguments),this._$AN=void 0}_$AT(B,Q,F){super._$AT(B,Q,F),oa(this),this.isConnected=B._$AU}_$AO(B,Q=!0){B!==this.isConnected&&(this.isConnected=B,B?this.reconnected?.():this.disconnected?.()),Q&&(aa(this,B),ba(this))}setValue(B){if((B=>void 0===B.strings)(this._$Ct))this._$Ct._$AI(B,this);else{const Q=[...this._$Ct._$AH];Q[this._$Ci]=B,this._$Ct._$AI(Q,this,0)}}disconnected(){}reconnected(){}}const La=new WeakMap;let Aa=0;const ha=new Map,Ra=new WeakSet,ya=()=>new Promise(B=>requestAnimationFrame(B)),Va=[{opacity:0},{opacity:1}],Za=(B,Q)=>{const F=B-Q;return 0===F?void 0:F},Sa=(B,Q)=>{const F=B/Q;return 1===F?void 0:F},ma={left:(B,Q)=>{const F=Za(B,Q);return{value:F,transform:null==F||isNaN(F)?void 0:`translateX(${F}px)`}},top:(B,Q)=>{const F=Za(B,Q);return{value:F,transform:null==F||isNaN(F)?void 0:`translateY(${F}px)`}},width:(B,Q)=>{let F;0===Q&&(Q=1,F={width:"1px"});const U=Sa(B,Q);return{value:U,overrideFrom:F,transform:null==U||isNaN(U)?void 0:`scaleX(${U})`}},height:(B,Q)=>{let F;0===Q&&(Q=1,F={height:"1px"});const U=Sa(B,Q);return{value:U,overrideFrom:F,transform:null==U||isNaN(U)?void 0:`scaleY(${U})`}}},Ea={duration:333,easing:"ease-in-out"},Na=["left","top","width","height","opacity","color","background"],Xa=new WeakMap;const pa=(B=>(...Q)=>({_$litDirective$:B,values:Q}))(class extends xa{constructor(B){if(super(B),this.t=!1,this.i=null,this.o=null,this.h=!0,this.shouldLog=!1,B.type===da)throw Error("The `animate` directive must be used in attribute position.");this.createFinished()}createFinished(){this.resolveFinished?.(),this.finished=new Promise(B=>{this.l=B})}async resolveFinished(){this.l?.(),this.l=void 0}render(B){return K}getController(){return La.get(this.u)}isDisabled(){return this.options.disabled||this.getController()?.disabled}update(B,[Q]){const F=void 0===this.u;return F&&(this.u=B.options?.host,this.u.addController(this),this.u.updateComplete.then(B=>this.t=!0),this.element=B.element,Xa.set(this.element,this)),this.optionsOrCallback=Q,(F||"function"!=typeof Q)&&this.p(Q),this.render(Q)}p(B){B=B??{};const Q=this.getController();void 0!==Q&&((B={...Q.defaultOptions,...B}).keyframeOptions={...Q.defaultOptions.keyframeOptions,...B.keyframeOptions}),B.properties??=Na,this.options=B}m(){const B={},Q=this.element.getBoundingClientRect(),F=getComputedStyle(this.element);return this.options.properties.forEach(U=>{const t=Q[U]??(ma[U]?void 0:F[U]),s=Number(t);B[U]=isNaN(s)?t+"":s}),B}v(){let B,Q=!0;return this.options.guard&&(B=this.options.guard(),Q=((B,Q)=>{if(Array.isArray(B)){if(Array.isArray(Q)&&Q.length===B.length&&B.every((B,F)=>B===Q[F]))return!1}else if(Q===B)return!1;return!0})(B,this._)),this.h=this.t&&!this.isDisabled()&&!this.isAnimating()&&Q&&this.element.isConnected,this.h&&(this._=Array.isArray(B)?Array.from(B):B),this.h}hostUpdate(){"function"==typeof this.optionsOrCallback&&this.p(this.optionsOrCallback()),this.v()&&(this.A=this.m(),this.i=this.i??this.element.parentNode,this.o=this.element.nextSibling)}async hostUpdated(){if(!this.h||!this.element.isConnected||this.options.skipInitial&&!this.isHostRendered)return;let B;this.prepare(),await ya;const Q=this.O(),F=this.j(this.options.keyframeOptions,Q),U=this.m();if(void 0!==this.A){const{from:F,to:t}=this.N(this.A,U,Q);this.log("measured",[this.A,U,F,t]),B=this.calculateKeyframes(F,t)}else{const F=ha.get(this.options.inId);if(F){ha.delete(this.options.inId);const{from:t,to:s}=this.N(F,U,Q);B=this.calculateKeyframes(t,s),B=this.options.in?[{...this.options.in[0],...B[0]},...this.options.in.slice(1),B[1]]:B,Aa++,B.forEach(B=>B.zIndex=Aa)}else this.options.in&&(B=[...this.options.in,{}])}this.animate(B,F)}resetStyles(){void 0!==this.P&&(this.element.setAttribute("style",this.P??""),this.P=void 0)}commitStyles(){this.P=this.element.getAttribute("style"),this.webAnimation?.commitStyles(),this.webAnimation?.cancel()}reconnected(){}async disconnected(){if(!this.h)return;if(void 0!==this.options.id&&ha.set(this.options.id,this.A),void 0===this.options.out)return;if(this.prepare(),await ya(),this.i?.isConnected){const B=this.o&&this.o.parentNode===this.i?this.o:null;if(this.i.insertBefore(this.element,B),this.options.stabilizeOut){const B=this.m();this.log("stabilizing out");const Q=this.A.left-B.left,F=this.A.top-B.top;!("static"===getComputedStyle(this.element).position)||0===Q&&0===F||(this.element.style.position="relative"),0!==Q&&(this.element.style.left=Q+"px"),0!==F&&(this.element.style.top=F+"px")}}const B=this.j(this.options.keyframeOptions);await this.animate(this.options.out,B),this.element.remove()}prepare(){this.createFinished()}start(){this.options.onStart?.(this)}didFinish(B){B&&this.options.onComplete?.(this),this.A=void 0,this.animatingProperties=void 0,this.frames=void 0,this.resolveFinished()}O(){const B=[];for(let Q=this.element.parentNode;Q;Q=Q?.parentNode){const F=Xa.get(Q);F&&!F.isDisabled()&&F&&B.push(F)}return B}get isHostRendered(){const B=Ra.has(this.u);return B||this.u.updateComplete.then(()=>{Ra.add(this.u)}),B}j(B,Q=this.O()){const F={...Ea};return Q.forEach(B=>Object.assign(F,B.options.keyframeOptions)),Object.assign(F,B),F}N(B,Q,F){B={...B},Q={...Q};const U=F.map(B=>B.animatingProperties).filter(B=>void 0!==B);let t=1,s=1;return U.length>0&&(U.forEach(B=>{B.width&&(t/=B.width),B.height&&(s/=B.height)}),void 0!==B.left&&void 0!==Q.left&&(B.left=t*B.left,Q.left=t*Q.left),void 0!==B.top&&void 0!==Q.top&&(B.top=s*B.top,Q.top=s*Q.top)),{from:B,to:Q}}calculateKeyframes(B,Q,F=!1){const U={},t={};let s=!1;const I={};for(const F in Q){const g=B[F],i=Q[F];if(F in ma){const B=ma[F];if(void 0===g||void 0===i)continue;const Q=B(g,i);void 0!==Q.transform&&(I[F]=Q.value,s=!0,U.transform=`${U.transform??""} ${Q.transform}`,void 0!==Q.overrideFrom&&Object.assign(U,Q.overrideFrom))}else g!==i&&void 0!==g&&void 0!==i&&(s=!0,U[F]=g,t[F]=i)}return U.transformOrigin=t.transformOrigin=F?"center center":"top left",this.animatingProperties=I,s?[U,t]:void 0}async animate(B,Q=this.options.keyframeOptions){this.start(),this.frames=B;let F=!1;if(!this.isAnimating()&&!this.isDisabled()&&(this.options.onFrames&&(this.frames=B=this.options.onFrames(this),this.log("modified frames",B)),void 0!==B)){this.log("animate",[B,Q]),F=!0,this.webAnimation=this.element.animate(B,Q);const U=this.getController();U?.add(this);try{await this.webAnimation.finished}catch(B){}U?.remove(this)}return this.didFinish(F),F}isAnimating(){return"running"===this.webAnimation?.playState||this.webAnimation?.pending}log(B,Q){this.shouldLog&&!this.isDisabled()&&console.log(B,this.options.id,Q)}});class Wa{static k={DEFAULT:.05,MIN:0,MAX:100,STEP:.001,JUMP:.01};static adk2v(B,Q,F){return B/(1+F*Q)}static adv2k(B,Q,F){return(B-F)/(F*Q)}}class Ha extends ca{static get properties(){return{numeric:{attribute:"numeric",type:Boolean,reflect:!0}}}constructor(){super(),this.numeric=!1}static get styles(){return[super.styles,g`
1039
1039
  :host {
1040
1040
  display: block;
1041
1041
 
@@ -1303,7 +1303,7 @@ const da=2;let Ca=class{constructor(B){}get _$AU(){return this._$AM._$AU}_$AT(B,
1303
1303
  ${i}
1304
1304
  </tbody>
1305
1305
  </table>
1306
- </div>`}}customElements.define("htd-calculation",Da);class fa extends(function(B){return class extends B{static get properties(){return{width:{attribute:!1,type:Number,reflect:!1},height:{attribute:!1,type:Number,reflect:!1},rem:{attribute:!1,type:Number,reflect:!1}}}constructor(){super(),this.width=NaN,this.height=NaN,this.rem=NaN}getDimensions(){this.width=parseFloat(this.getComputedStyleValue("width"),10),this.height=parseFloat(this.getComputedStyleValue("height"),10),this.rem=parseFloat(getComputedStyle(document.documentElement).getPropertyValue("font-size"),10)}connectedCallback(){super.connectedCallback(),this.resizeObserver=new ResizeObserver(this.getDimensions.bind(this)),this.resizeObserver.observe(this)}disconnectedCallback(){this.resizeObserver.unobserve(this),super.disconnectedCallback()}}}(ca)){static get properties(){return{a:{attribute:"amount",type:Number,reflect:!0},d:{attribute:"delay",type:Number,reflect:!0},label:{attribute:"label",type:String,reflect:!0},k:{attribute:"k",type:Number,reflect:!0},v:{attribute:!1,type:Number,reflect:!1}}}constructor(){super(),this.firstUpdate=!0,this.drag=!1,this.scale={value:{min:0,max:80,step:1,round:Math.round},time:{min:0,max:100,step:1,round:Math.round}},this.a=null,this.d=null,this.label="",this.k=Wa.k.DEFAULT,this.options=[{name:"default",a:this.a,d:this.d,label:this.label}],this.as=null,this.ds=null,this.al=null,this.dl=null,this.trialCount=null,this.response=null,this.alignState()}alignState(){this.options[0].a=this.a,this.options[0].d=this.d,this.options[0].label=this.label,this.options.forEach(B=>{B.v=Wa.adk2v(B.a,B.d,this.k)}),this.v=this.options[0].v}trial(B,Q,F,U,t,s){this.trialCount&&this.removeOption(`${this.trialCount}-s`),this.trialCount&&this.removeOption(`${this.trialCount}-l`),this.as=B,this.ds=Q,this.al=F,this.dl=U,this.trialCount=t,this.response=s,this.setOption(this.as,this.ds,`${this.trialCount}-s`,"s",!0),this.setOption(this.al,this.dl,`${this.trialCount}-l`,"l",!0)}pauseTrial(){const B=YF(this.renderRoot).selectAll(".lines[data-animating-ease-time-1]");B.interrupt("new-1"),B.interrupt("new-2"),B.datum(B=>(B.paused=!0,B))}resumeTrial(){YF(this.renderRoot).selectAll(".lines[data-animating-ease-time-1]").datum(B=>(B.paused=!1,B)),this.requestUpdate()}clearOptions(){this.options.splice(1),this.requestUpdate()}removeOption(B){this.options=this.options.filter(Q=>Q.name!==B),this.requestUpdate()}getOption(B="default"){return this.options.find(Q=>Q.name===B)}setOption(B,Q,F="default",U="",t=!1){"default"===F&&(this.a=B,this.d=Q,this.label=U);const s=this.options.find(B=>B.name===F);void 0===s?this.options.push({name:F,a:B,d:Q,label:U,trial:t,new:t}):(s.a=B,s.d=Q,s.label=U),this.requestUpdate()}static get styles(){return[super.styles,g`
1306
+ </div>`}}customElements.define("htd-calculation",Da);class Ya extends(function(B){return class extends B{static get properties(){return{width:{attribute:!1,type:Number,reflect:!1},height:{attribute:!1,type:Number,reflect:!1},rem:{attribute:!1,type:Number,reflect:!1}}}constructor(){super(),this.width=NaN,this.height=NaN,this.rem=NaN}getDimensions(){this.width=parseFloat(this.getComputedStyleValue("width"),10),this.height=parseFloat(this.getComputedStyleValue("height"),10),this.rem=parseFloat(getComputedStyle(document.documentElement).getPropertyValue("font-size"),10)}connectedCallback(){super.connectedCallback(),this.resizeObserver=new ResizeObserver(this.getDimensions.bind(this)),this.resizeObserver.observe(this)}disconnectedCallback(){this.resizeObserver.unobserve(this),super.disconnectedCallback()}}}(ca)){static get properties(){return{a:{attribute:"amount",type:Number,reflect:!0},d:{attribute:"delay",type:Number,reflect:!0},label:{attribute:"label",type:String,reflect:!0},k:{attribute:"k",type:Number,reflect:!0},v:{attribute:!1,type:Number,reflect:!1}}}constructor(){super(),this.firstUpdate=!0,this.drag=!1,this.scale={value:{min:0,max:80,step:1,round:Math.round},time:{min:0,max:100,step:1,round:Math.round}},this.a=null,this.d=null,this.label="",this.k=Wa.k.DEFAULT,this.options=[{name:"default",a:this.a,d:this.d,label:this.label}],this.as=null,this.ds=null,this.al=null,this.dl=null,this.trialCount=null,this.response=null,this.alignState()}alignState(){this.options[0].a=this.a,this.options[0].d=this.d,this.options[0].label=this.label,this.options.forEach(B=>{B.v=Wa.adk2v(B.a,B.d,this.k)}),this.v=this.options[0].v}trial(B,Q,F,U,t,s){this.trialCount&&this.removeOption(`${this.trialCount}-s`),this.trialCount&&this.removeOption(`${this.trialCount}-l`),this.as=B,this.ds=Q,this.al=F,this.dl=U,this.trialCount=t,this.response=s,this.setOption(this.as,this.ds,`${this.trialCount}-s`,"s",!0),this.setOption(this.al,this.dl,`${this.trialCount}-l`,"l",!0)}pauseTrial(){const B=fF(this.renderRoot).selectAll(".lines[data-animating-ease-time-1]");B.interrupt("new-1"),B.interrupt("new-2"),B.datum(B=>(B.paused=!0,B))}resumeTrial(){fF(this.renderRoot).selectAll(".lines[data-animating-ease-time-1]").datum(B=>(B.paused=!1,B)),this.requestUpdate()}clearOptions(){this.options.splice(1),this.requestUpdate()}removeOption(B){this.options=this.options.filter(Q=>Q.name!==B),this.requestUpdate()}getOption(B="default"){return this.options.find(Q=>Q.name===B)}setOption(B,Q,F="default",U="",t=!1){"default"===F&&(this.a=B,this.d=Q,this.label=U);const s=this.options.find(B=>B.name===F);void 0===s?this.options.push({name:F,a:B,d:Q,label:U,trial:t,new:t}):(s.a=B,s.d=Q,s.label=U),this.requestUpdate()}static get styles(){return[super.styles,g`
1307
1307
  :host {
1308
1308
  display: inline-block;
1309
1309
 
@@ -1350,54 +1350,91 @@ const da=2;let Ca=class{constructor(B){}get _$AU(){return this._$AM._$AU}_$AT(B,
1350
1350
  /* shape-rendering: crispEdges; */
1351
1351
  }
1352
1352
 
1353
- .curve {
1354
- fill: none;
1355
- stroke: var(---color-element-emphasis);
1356
- stroke-width: 2;
1357
- }
1358
-
1359
- .curve.interactive {
1360
- cursor: nwse-resize;
1361
-
1353
+ .option .interactive {
1362
1354
  filter: url("#shadow-2");
1363
1355
  outline: none;
1364
1356
  }
1365
1357
 
1366
- .curve.interactive:hover {
1358
+ .option .interactive:hover {
1367
1359
  filter: url("#shadow-4");
1368
1360
  }
1369
1361
 
1370
- .curve.interactive:active {
1362
+ .option .interactive:active {
1371
1363
  filter: url("#shadow-8");
1372
1364
  }
1373
1365
 
1374
- :host(.keyboard) .curve.interactive:focus {
1366
+ :host(.keyboard) .option .interactive:focus-within {
1375
1367
  filter: url("#shadow-8");
1376
1368
  }
1377
1369
 
1378
- .bar {
1379
- fill: none;
1380
- stroke: var(---color-element-emphasis);
1381
- stroke-width: 2;
1370
+ .option .body.interactive:has(~ .point:hover) {
1371
+ filter: url("#shadow-4");
1382
1372
  }
1383
1373
 
1384
- .bar.interactive {
1385
- cursor: ew-resize;
1386
-
1387
- filter: url("#shadow-2");
1374
+ .option .body.interactive:has(~ .point:active) {
1375
+ filter: url("#shadow-8");
1376
+ }
1377
+
1378
+ :host(.keyboard) .option .body.interactive:has(~ .point:focus-within) {
1379
+ filter: url("#shadow-8");
1380
+ }
1381
+
1382
+ .gradient.sooner stop {
1383
+ stop-color: var(---color-sooner);
1384
+ }
1385
+
1386
+ .gradient.later stop {
1387
+ stop-color: var(---color-later);
1388
+ }
1389
+
1390
+ .stop-0,
1391
+ .stop-before {
1392
+ stop-opacity: 0;
1393
+ }
1394
+
1395
+ .stop-after,
1396
+ .stop-100 {
1397
+ stop-opacity: 1;
1398
+ }
1399
+
1400
+ .fill {
1401
+ fill: var(---color-element-enabled);
1402
+ fill-opacity: 0.5;
1403
+ stroke: none;
1404
+ }
1405
+
1406
+ .interactive .fill {
1407
+ cursor: move;
1408
+
1388
1409
  outline: none;
1389
1410
  }
1390
1411
 
1391
- .bar.interactive:hover {
1392
- filter: url("#shadow-4");
1412
+ .sooner .fill {
1413
+ fill: var(---color-sooner);
1393
1414
  }
1394
1415
 
1395
- .bar.interactive:active {
1396
- filter: url("#shadow-8");
1416
+ .later .fill {
1417
+ fill: var(---color-later);
1397
1418
  }
1398
1419
 
1399
- :host(.keyboard) .bar.interactive:focus {
1400
- filter: url("#shadow-8");
1420
+ .trial.sooner .fill {
1421
+ fill: url("#sooner-gradient");
1422
+ }
1423
+
1424
+ .trial.later .fill {
1425
+ fill: url("#later-gradient");
1426
+ }
1427
+
1428
+ .bar {
1429
+ fill: none;
1430
+ stroke: var(---color-element-emphasis);
1431
+ stroke-width: 2;
1432
+ }
1433
+
1434
+ .interactive .bar {
1435
+ cursor: ew-resize;
1436
+
1437
+ outline: none;
1401
1438
  }
1402
1439
 
1403
1440
  .point .mark {
@@ -1415,38 +1452,22 @@ const da=2;let Ca=class{constructor(B){}get _$AU(){return this._$AM._$AU}_$AT(B,
1415
1452
  fill: var(---color-text-inverse);
1416
1453
  }
1417
1454
 
1418
- .point.interactive {
1455
+ .point.interact {
1419
1456
  cursor: ns-resize;
1420
1457
 
1421
- filter: url("#shadow-2");
1422
1458
  outline: none;
1423
-
1424
- /* HACK: This gets Safari to correctly apply the filter! */
1425
- /* https://github.com/emilbjorklund/svg-weirdness/issues/27 */
1426
- stroke: #000000;
1427
- stroke-opacity: 0;
1428
- stroke-width: 0;
1429
1459
  }
1430
1460
 
1431
- .point.interactive:hover {
1432
- filter: url("#shadow-4");
1433
-
1434
- /* HACK: This gets Safari to correctly apply the filter! */
1435
- stroke: #ff0000;
1436
- }
1437
-
1438
- .point.interactive:active {
1439
- filter: url("#shadow-8");
1440
-
1441
- /* HACK: This gets Safari to correctly apply the filter! */
1442
- stroke: #00ff00;
1461
+ .curve {
1462
+ fill: none;
1463
+ stroke: var(---color-element-emphasis);
1464
+ stroke-width: 2;
1443
1465
  }
1444
1466
 
1445
- :host(.keyboard) .point.interactive:focus {
1446
- filter: url("#shadow-8");
1467
+ .curve.interactive {
1468
+ cursor: nwse-resize;
1447
1469
 
1448
- /* HACK: This gets Safari to correctly apply the filter! */
1449
- stroke: #0000ff;
1470
+ outline: none;
1450
1471
  }
1451
1472
 
1452
1473
  /* Make larger targets for touch users */
@@ -1461,7 +1482,7 @@ const da=2;let Ca=class{constructor(B){}get _$AU(){return this._$AM._$AU}_$AT(B,
1461
1482
  stroke-width: 12;
1462
1483
  }
1463
1484
  }
1464
- `]}render(){return M``}willUpdate(){this.alignState()}update(B){if(super.update(B),Number.isNaN(this.width)||Number.isNaN(this.height)||Number.isNaN(this.rem))return;const Q=this.width,F=this.height;let U,t;Q/F>1.8?(t=F,U=1.8*t):(U=Q,t=U/1.8);const s=2*this.rem,I=3*this.rem,g=3*this.rem,i=t-(s+I),l=U-(g+2*this.rem),c=parseInt(this.getComputedStyleValue("---transition-duration"),10),e=Al().domain([this.scale.time.min,this.scale.time.max]).range([0,l]),n=Al().domain([this.scale.value.min,this.scale.value.max]).range([i,0]),d=qd().x(B=>e(B.d)).y(B=>n(B.v)),C=YF(this.renderRoot).selectAll(".main").data([{width:this.width,height:this.height,rem:this.rem}]),a=C.enter().append("svg").classed("main",!0);a.html(ca.svgDefs);const b=a.merge(C).attr("viewBox",`0 0 ${U} ${t}`),o=a.append("g").classed("plot",!0),u=b.select(".plot").attr("transform",`translate(${g}, ${s})`);o.append("clipPath").attr("id","clip-htd-curves").append("rect"),u.select("clipPath rect").attr("height",i+1).attr("width",l+1);const G=o.append("g").classed("underlayer",!0),r=u.select(".underlayer");G.append("rect").classed("background",!0),r.select(".background").attr("height",i).attr("width",l),G.append("g").classed("axis-x",!0);r.select(".axis-x").attr("transform",`translate(0, ${n(0)})`).transition().duration(2*c).ease(Xs).call(xQ(e)).attr("font-size",null).attr("font-family",null).selectAll("line, path").attr("stroke",null);const x=G.append("text").classed("title-x",!0).attr("text-anchor","middle");x.append("tspan").classed("name",!0).text("Delay ("),x.append("tspan").classed("math-var d",!0).text("D"),x.append("tspan").classed("name",!0).text(")"),r.select(".title-x").attr("transform",`translate(${l/2}, ${i+2.25*this.rem})`),G.append("g").classed("axis-y",!0);var A;r.select(".axis-y").transition().duration(2*c).ease(Xs).call((A=n,rQ(4,A))).attr("font-size",null).attr("font-family",null).selectAll("line, path").attr("stroke",null);const L=G.append("text").classed("title-y",!0).attr("text-anchor","middle");L.append("tspan").classed("name",!0).text("Value ("),L.append("tspan").classed("math-var v",!0).text("V"),L.append("tspan").classed("name",!0).text(")"),r.select(".title-y").attr("transform",`translate(${-2*this.rem}, ${i/2})rotate(-90)`),o.append("g").classed("content",!0);const h=u.select(".content").selectAll(".option").data(this.options.filter(B=>null!==B.a&&null!==B.d),B=>B.name),R=h.enter().append("g").classed("option",!0),y=R.append("g").classed("curve",!0).attr("clip-path","url(#clip-htd-curves)");y.append("path").classed("path",!0).attr("d",B=>{const Q=cQ(e(B.d),e(0),-1).map(Q=>({d:e.invert(Q),v:Wa.adk2v(B.a,B.d-e.invert(Q),this.k)}));return d(Q)}).attr("stroke-dasharray",(B,Q,F)=>{if(B.trial){return`0,${F[Q].getTotalLength()}`}return"none"}),y.append("path").classed("path touch",!0).attr("d",B=>{const Q=cQ(e(B.d),e(0),-1).map(Q=>({d:e.invert(Q),v:Wa.adk2v(B.a,B.d-e.invert(Q),this.k)}));return d(Q)}).attr("stroke-dasharray",(B,Q,F)=>{if(B.trial){return`0,${F[Q].getTotalLength()}`}return"none"});const V=R.append("g").classed("bar",!0);V.append("line").classed("line",!0).attr("x1",B=>e(B.d)).attr("x2",B=>e(B.d)).attr("y1",n(0)).attr("y2",B=>n(B.a)).attr("stroke-dasharray",(B,Q,F)=>{if(B.trial){return`0,${F[Q].getTotalLength()}`}return"none"}),V.append("line").classed("line touch",!0).attr("x1",B=>e(B.d)).attr("x2",B=>e(B.d)).attr("y1",n(0)).attr("y2",B=>n(B.a)).attr("stroke-dasharray",(B,Q,F)=>{if(B.trial){return`0,${F[Q].getTotalLength()}`}return"none"});const Z=R.append("g").classed("point",!0).attr("transform",B=>`translate(${e(B.d)}, ${n(B.a)})`).attr("opacity",B=>B.trial?0:1);Z.append("circle").classed("mark touch",!0),Z.append("text").classed("label",!0);const S=R.merge(h);S.filter((B,Q,F)=>this.interactive&&!YF(F[Q]).select(".curve").classed("interactive")).select(".curve").classed("interactive",!0).attr("tabindex",0).call(_F().subject(B=>({x:B.x,y:B.y})).on("start",B=>{YF(B.currentTarget).classed("dragging",!0)}).on("drag",(B,Q)=>{this.drag=!0;const F=Q.d-e.invert(B.x),U=F<0?0:F>Q.d?Q.d:F,t=n.invert(B.y),s=t<=0?.001:t>Q.a?Q.a:t,I=Wa.adv2k(Q.a,U,s);this.k=I<Wa.k.MIN?Wa.k.MIN:I>Wa.k.MAX?Wa.k.MAX:I,this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:Q.name,a:Q.a,d:Q.d,k:this.k,label:Q.label},bubbles:!0}))}).on("end",B=>{YF(B.currentTarget).classed("dragging",!1)})).on("keydown",(B,Q)=>{if(["ArrowUp","ArrowDown","ArrowRight","ArrowLeft"].includes(B.key)){let{k:F}=this;switch(B.key){case"ArrowUp":case"ArrowLeft":F*=B.shiftKey?.95:.85;break;case"ArrowDown":case"ArrowRight":F*=B.shiftKey?1/.95:1/.85}F=F<Wa.k.MIN?Wa.k.MIN:F>Wa.k.MAX?Wa.k.MAX:F,F!==this.k&&(this.k=F,this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:Q.name,a:Q.a,d:Q.d,k:this.k,label:Q.label},bubbles:!0}))),B.preventDefault()}}),S.filter((B,Q,F)=>this.interactive&&!B.trial&&!YF(F[Q]).select(".bar").classed("interactive")).select(".bar").classed("interactive",!0).attr("tabindex",0).call(_F().subject((B,Q)=>({x:e(Q.d),y:n(Q.a)})).on("start",B=>{YF(B.currentTarget).classed("dragging",!0)}).on("drag",(B,Q)=>{this.drag=!0;const F=e.invert(B.x);Q.d=F<this.scale.time.min?this.scale.time.min:F>this.scale.time.max?this.scale.time.max:this.scale.time.round(F),"default"===Q.name&&(this.d=Q.d),this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:Q.name,a:Q.a,d:Q.d,k:this.k,label:Q.label},bubbles:!0}))}).on("end",B=>{YF(B.currentTarget).classed("dragging",!1)})).on("keydown",(B,Q)=>{if(["ArrowLeft","ArrowRight"].includes(B.key)){let F=Q.d;switch(B.key){case"ArrowRight":F+=B.shiftKey?1:5;break;case"ArrowLeft":F-=B.shiftKey?1:5}F=F<this.scale.time.min?this.scale.time.min:F>this.scale.time.max?this.scale.time.max:F,F!==Q.d&&(Q.d=F,"default"===Q.name&&(this.d=Q.d),this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:Q.name,a:Q.a,d:Q.d,k:this.k,label:Q.label},bubbles:!0}))),B.preventDefault()}}),S.filter((B,Q,F)=>this.interactive&&!B.trial&&!YF(F[Q]).select(".point").classed("interactive")).select(".point").classed("interactive",!0).attr("tabindex",0).call(_F().subject((B,Q)=>({x:e(Q.d),y:n(Q.a)})).on("start",B=>{YF(B.currentTarget).classed("dragging",!0)}).on("drag",(B,Q)=>{this.drag=!0;const F=n.invert(B.y);Q.a=F<this.scale.value.min?this.scale.value.min:F>this.scale.value.max?this.scale.value.max:this.scale.value.round(F),"default"===Q.name&&(this.a=Q.a),this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:Q.name,a:Q.a,d:Q.d,k:this.k,label:Q.label},bubbles:!0}))}).on("end",B=>{YF(B.currentTarget).classed("dragging",!1)})).on("keydown",(B,Q)=>{if(["ArrowUp","ArrowDown"].includes(B.key)){let F=Q.a;switch(B.key){case"ArrowUp":F+=B.shiftKey?1:5;break;case"ArrowDown":F-=B.shiftKey?1:5}F=F<this.scale.value.min?this.scale.value.min:F>this.scale.value.max?this.scale.value.max:F,F!==Q.a&&(Q.a=F,"default"===Q.name&&(this.a=Q.a),this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:Q.name,a:Q.a,d:Q.d,k:this.k,label:Q.label},bubbles:!0}))),B.preventDefault()}}),S.filter((B,Q,F)=>!this.interactive&&YF(F[Q]).select(".curve").classed("interactive")).select(".curve").classed("interactive",!1).attr("tabindex",null).on("drag",null).on("keydown",null),S.filter((B,Q,F)=>(!this.interactive||B.trial)&&YF(F[Q]).select(".bar").classed("interactive")).select(".bar").classed("interactive",!1).attr("tabindex",null).on("drag",null).on("keydown",null),S.filter((B,Q,F)=>(!this.interactive||B.trial)&&YF(F[Q]).select(".point").classed("interactive")).select(".point").classed("interactive",!1).attr("tabindex",null).on("drag",null).on("keydown",null),S.filter(B=>B.new).select(".curve .path").transition().duration(c).delay(c+c/10).ease(Ns).attrTween("stroke-dasharray",(B,Q,F)=>{const U=F[Q].getTotalLength();return Rt(`0,${U}`,`${U},0`)}).on("end",B=>{B.new=!1,this.dispatchEvent(new CustomEvent("discountable-response",{detail:{trial:this.trialCount,as:this.as,ds:this.ds,al:this.al,dl:this.dl,response:this.response},bubbles:!0}))}),S.filter(B=>B.new).select(".curve .path.touch").transition().duration(c).delay(c+c/10).ease(Ns).attrTween("stroke-dasharray",(B,Q,F)=>{const U=F[Q].getTotalLength();return Rt(`0,${U}`,`${U},0`)}),S.filter(B=>B.new).select(".bar .line").transition().duration(c).ease(Ns).attrTween("stroke-dasharray",(B,Q,F)=>{const U=F[Q].getTotalLength();return Rt(`0,${U}`,`${U},${U}`)}),S.filter(B=>B.new).select(".bar .line.touch").transition().duration(c).ease(Ns).attrTween("stroke-dasharray",(B,Q,F)=>{const U=F[Q].getTotalLength();return Rt(`0,${U}`,`${U},${U}`)}),S.filter(B=>B.new).select(".point").transition().duration(c/10).delay(c).ease(Ns).attrTween("opacity",()=>Rt(0,1)),h.select(".curve .path").transition().duration(this.drag?0:this.firstUpdate?2*c:c).ease(Xs).attrTween("d",(B,Q,F)=>{const U=F[Q],t=Rt(void 0!==U.a?U.a:B.a,B.a),s=Rt(void 0!==U.d?U.d:B.d,B.d);return B=>{U.a=t(B),U.d=s(B);const Q=cQ(e(U.d),e(0),-1).map(B=>({d:e.invert(B),v:Wa.adk2v(U.a,U.d-e.invert(B),this.k)}));return d(Q)}}),h.select(".curve .path.touch").transition().duration(this.drag?0:this.firstUpdate?2*c:c).ease(Xs).attrTween("d",(B,Q,F)=>{const U=F[Q],t=Rt(void 0!==U.a?U.a:B.a,B.a),s=Rt(void 0!==U.d?U.d:B.d,B.d);return B=>{U.a=t(B),U.d=s(B);const Q=cQ(e(U.d),e(0),-1).map(B=>({d:e.invert(B),v:Wa.adk2v(U.a,U.d-e.invert(B),this.k)}));return d(Q)}}),h.select(".bar .line").transition().duration(this.drag?0:this.firstUpdate?2*c:c).ease(Xs).attrTween("x1",(B,Q,F)=>{const U=F[Q],t=Rt(void 0!==U.d?U.d:B.d,B.d);return B=>(U.d=t(B),`${e(U.d)}`)}).attrTween("x2",(B,Q,F)=>{const U=F[Q],t=Rt(void 0!==U.d?U.d:B.d,B.d);return B=>(U.d=t(B),`${e(U.d)}`)}).attrTween("y2",(B,Q,F)=>{const U=F[Q],t=Rt(void 0!==U.a?U.a:B.a,B.a);return B=>(U.a=t(B),`${n(U.a)}`)}),h.select(".bar .line.touch").transition().duration(this.drag?0:this.firstUpdate?2*c:c).ease(Xs).attrTween("x1",(B,Q,F)=>{const U=F[Q],t=Rt(void 0!==U.d?U.d:B.d,B.d);return B=>(U.d=t(B),`${e(U.d)}`)}).attrTween("x2",(B,Q,F)=>{const U=F[Q],t=Rt(void 0!==U.d?U.d:B.d,B.d);return B=>(U.d=t(B),`${e(U.d)}`)}).attrTween("y2",(B,Q,F)=>{const U=F[Q],t=Rt(void 0!==U.a?U.a:B.a,B.a);return B=>(U.a=t(B),`${n(U.a)}`)}),h.select(".point").transition().duration(this.drag?0:this.firstUpdate?2*c:c).ease(Xs).attrTween("transform",(B,Q,F)=>{const U=F[Q],t=Rt(void 0!==U.d?U.d:B.d,B.d),s=Rt(void 0!==U.a?U.a:B.a,B.a);return B=>(U.d=t(B),U.a=s(B),`translate(${e(U.d)}, ${n(U.a)})`)}),S.select(".point .label").text(B=>B.label),h.exit().remove(),this.drag=!1,this.firstUpdate=!1}}function Ya(B){return null!=B&&!Number.isNaN(B)}function wa(B,Q){return+Ya(Q)-+Ya(B)||cB(B,Q)}function va(B,Q){return+Ya(Q)-+Ya(B)||eB(B,Q)}function Ja(B){return null!=B&&""!=`${B}`}function ka(B){return isFinite(B)?B:NaN}function Ma(B){return B>0&&isFinite(B)?B:NaN}function Ta(B){return B<0&&isFinite(B)?B:NaN}function za(B,Q){if(B instanceof Date||(B=new Date(+B)),isNaN(B))return"function"==typeof Q?Q(B):Q;const F=B.getUTCHours(),U=B.getUTCMinutes(),t=B.getUTCSeconds(),s=B.getUTCMilliseconds();return`${I=B.getUTCFullYear(),I<0?`-${Ka(-I,6)}`:I>9999?`+${Ka(I,6)}`:Ka(I,4)}-${Ka(B.getUTCMonth()+1,2)}-${Ka(B.getUTCDate(),2)}${F||U||t||s?`T${Ka(F,2)}:${Ka(U,2)}${t||s?`:${Ka(t,2)}${s?`.${Ka(s,3)}`:""}`:""}Z`:""}`;var I}function Ka(B,Q){return`${B}`.padStart(Q,"0")}customElements.define("htd-curves",fa);const Oa=/^(?:[-+]\d{2})?\d{4}(?:-\d{2}(?:-\d{2})?)?(?:T\d{2}:\d{2}(?::\d{2}(?:\.\d{3})?)?(?:Z|[-+]\d{2}:?\d{2})?)?$/;function ja(B,Q){return Oa.test(B+="")?new Date(B):"function"==typeof Q?Q(B):Q}function Pa(B){if(null==B)return;return eB(B[0],B[B.length-1])}const _a=1e3,$a=6e4,qa=36e5,Bb=864e5,Qb=6048e5,Fb=2592e6,Ub=31536e6,tb=[["millisecond",1],["2 milliseconds",2],["5 milliseconds",5],["10 milliseconds",10],["20 milliseconds",20],["50 milliseconds",50],["100 milliseconds",100],["200 milliseconds",200],["500 milliseconds",500],["second",_a],["5 seconds",5e3],["15 seconds",15e3],["30 seconds",3e4],["minute",$a],["5 minutes",3e5],["15 minutes",9e5],["30 minutes",18e5],["hour",qa],["3 hours",108e5],["6 hours",216e5],["12 hours",432e5],["day",Bb],["2 days",1728e5],["week",Qb],["2 weeks",12096e5],["month",Fb],["3 months",7776e6],["6 months",15552e6],["year",Ub],["2 years",63072e6],["5 years",15768e7],["10 years",31536e7],["20 years",63072e7],["50 years",15768e8],["100 years",31536e8]],sb=new Map([["second",_a],["minute",$a],["hour",qa],["day",Bb],["monday",Qb],["tuesday",Qb],["wednesday",Qb],["thursday",Qb],["friday",Qb],["saturday",Qb],["sunday",Qb],["week",Qb],["month",Fb],["year",Ub]]),Ib=new Map([["second",Qc],["minute",Fc],["hour",tc],["day",Ic],["monday",ec],["tuesday",nc],["wednesday",dc],["thursday",Cc],["friday",ac],["saturday",bc],["sunday",cc],["week",cc],["month",Rc],["year",Vc]]),gb=new Map([["second",Qc],["minute",Uc],["hour",sc],["day",ic],["monday",Gc],["tuesday",rc],["wednesday",xc],["thursday",Ac],["friday",Lc],["saturday",hc],["sunday",uc],["week",uc],["month",yc],["year",Zc]]),ib=Symbol("intervalDuration"),lb=Symbol("intervalType");for(const[B,Q]of Ib)Q[ib]=sb.get(B),Q[lb]="time";for(const[B,Q]of gb)Q[ib]=sb.get(B),Q[lb]="utc";const cb=[["year",Zc,"utc"],["month",yc,"utc"],["day",ic,"utc",15552e6],["hour",sc,"utc",2592e5],["minute",Uc,"utc",216e5],["second",Qc,"utc",18e5]],eb=[["year",Vc,"time"],["month",Rc,"time"],["day",Ic,"time",15552e6],["hour",tc,"time",2592e5],["minute",Fc,"time",216e5],["second",Qc,"time",18e5]],nb=[cb[0],eb[0],cb[1],eb[1],cb[2],eb[2],...cb.slice(3)];function db(B){let Q=`${B}`.toLowerCase();Q.endsWith("s")&&(Q=Q.slice(0,-1));let F=1;const U=/^(?:(\d+)\s+)/.exec(Q);switch(U&&(Q=Q.slice(U[0].length),F=+U[1]),Q){case"quarter":Q="month",F*=3;break;case"half":Q="month",F*=6}let t=gb.get(Q);if(!t)throw new Error(`unknown interval: ${B}`);if(F>1&&!t.every)throw new Error(`non-periodic interval: ${Q}`);return[Q,F]}function Cb(B){return bb(db(B),"time")}function ab(B){return bb(db(B),"utc")}function bb([B,Q],F){let U=("time"===F?Ib:gb).get(B);return Q>1&&(U=U.every(Q),U[ib]=sb.get(B)*Q,U[lb]=F),U}function ob(B,Q){if(!(Q>1))return;const F=B[ib];if(!tb.some(([,B])=>B===F))return;if(F%Bb===0&&Bb<F&&F<Fb)return;const[U]=tb[nB(([,B])=>Math.log(B)).center(tb,Math.log(F*Q))];return("time"===B[lb]?Cb:ab)(U)}function ub(B,Q,F){const U="time"===Q?fc:Yc;if(null==F)return U("year"===B?"%Y":"month"===B?"%Y-%m":"day"===B?"%Y-%m-%d":"hour"===B||"minute"===B?"%Y-%m-%dT%H:%M":"second"===B?"%Y-%m-%dT%H:%M:%S":"%Y-%m-%dT%H:%M:%S.%L");const t=function(B){return"left"===B||"right"===B?(B,Q)=>`\n${B}\n${Q}`:"top"===B?(B,Q)=>`${Q}\n${B}`:(B,Q)=>`${B}\n${Q}`}(F);switch(B){case"millisecond":return rb(U(".%L"),U(":%M:%S"),t);case"second":return rb(U(":%S"),U("%-I:%M"),t);case"minute":return rb(U("%-I:%M"),U("%p"),t);case"hour":return rb(U("%-I %p"),U("%b %-d"),t);case"day":return rb(U("%-d"),U("%b"),t);case"month":return rb(U("%b"),U("%Y"),t);case"year":return U("%Y")}throw new Error("unable to format time ticks")}function Gb(B,Q,F){const U=OB(function(B,Q=lQ){const F=[];let U,t=!1;for(const s of B)t&&F.push(Q(U,s)),U=s,t=!0;return F}(Q,(B,Q)=>Math.abs(Q-B)));if(U<1e3)return ub("millisecond","utc",F);for(const[t,s,I,g]of function(B){return"time"===B?eb:"utc"===B?cb:nb}(B)){if(U>g)break;if("hour"===t&&!U)break;if(Q.every(B=>s.floor(B)>=B))return ub(t,I,F)}}function rb(B,Q,F){return(U,t,s)=>{const I=B(U,t),g=Q(U,t),i=t-Pa(s);return t!==i&&void 0!==s[i]&&g===Q(s[i],i)?I:F(I,g)}}const xb=Object.getPrototypeOf(Uint8Array),Ab=Object.prototype.toString;function Lb(B){return B instanceof Array||B instanceof xb}function hb(B){return B instanceof xb&&!function(B){return B instanceof BigInt64Array||B instanceof BigUint64Array}(B)}function Rb(B){return B?.prototype instanceof xb&&!function(B){return B===BigInt64Array||B===BigUint64Array}(B)}const yb=Symbol("reindex");function Vb(B,Q,F){const U=typeof Q;return"string"===U?vo(B)?mb(B.getChild(Q),F):Zb(B,Xb(Q),F):"function"===U?Zb(B,Q,F):"number"===U||Q instanceof Date||"boolean"===U?Bo(B,Jb(Q),F):"function"==typeof Q?.transform?Sb(Q.transform(B),F):function(B,Q){return null!=B&&Q?eo(B,Q):B}(Sb(Q,F),B?.[yb])}function Zb(B,Q,F){return Bo(B,Rb(F)?(B,F)=>Mb(Q(B,F)):Q,F)}function Sb(B,Q){return void 0===Q?$b(B):Jo(B)?mb(B,Q):B instanceof Q?B:Q.from(B,Rb(Q)&&!hb(B)?Mb:void 0)}function mb(B,Q){return null==B?B:void 0!==Q&&Q!==Array||!function(B){return B&&(8===B.typeId||10===B.typeId)&&1===B.unit}(B.type)?Sb(Eb(B),Q):Tb(Eb(B))}function Eb(B){return B.nullCount?B.toJSON():B.toArray()}const Nb=[null],Xb=B=>Q=>{const F=Q[B];return void 0===F&&"Feature"===Q.type?Q.properties?.[B]:F},pb={transform:co},Wb={transform:B=>B},Hb=()=>1,Db=()=>!0,fb=B=>null==B?B:`${B}`,Yb=B=>null==B?B:+B,wb=B=>B?B[0]:void 0,vb=B=>B?B[1]:void 0,Jb=B=>()=>B;function kb(B){return hb(B)?B:Bo(B,Mb,Float64Array)}function Mb(B){return null==B?NaN:Number(B)}function Tb(B){return Bo(B,zb)}function zb(B){return B instanceof Date&&!isNaN(B)?B:"string"==typeof B?ja(B):null==B||isNaN(B=Number(B))?void 0:new Date(B)}function Kb(B,Q){return void 0===B&&(B=Q),null===B?[void 0,"none"]:Xo(B)?[void 0,B]:[B,void 0]}function Ob(B,Q){return void 0===B&&(B=Q),null===B||"number"==typeof B?[void 0,B]:[B,void 0]}function jb(B,Q,F){if(null!=B)return Pb(B,Q,F)}function Pb(B,Q,F){const U=`${B}`.toLowerCase();if(!F.includes(U))throw new Error(`invalid ${Q}: ${B}`);return U}function _b(B){return vo(B)?B:$b(B)}function $b(B){if(null==B||Lb(B))return B;if(Jo(B))return mb(B);if(qb(B))switch(B.type){case"FeatureCollection":return B.features;case"GeometryCollection":return B.geometries;default:return[B]}return Array.from(B)}function qb(B){switch(B?.type){case"FeatureCollection":case"GeometryCollection":case"Feature":case"LineString":case"MultiLineString":case"MultiPoint":case"MultiPolygon":case"Point":case"Polygon":case"Sphere":return!0;default:return!1}}function Bo(B,Q,F=Array){return null==B?B:B instanceof F?B.map(Q):F.from(B,Q)}function Qo(B,Q=Array){return B instanceof Q?B.slice():Q.from(B)}function Fo({y:B,y1:Q,y2:F}){return void 0!==B||void 0!==Q||void 0!==F}function Uo(B){return B?.toString===Ab}function to(B){return Uo(B)&&(void 0!==B.type||void 0!==B.domain)}function so(B){return Uo(B)&&"function"!=typeof B.transform}function Io(B){return so(B)&&void 0===B.value&&void 0===B.channel}function go(B,Q){return void 0===B&&void 0===Q?[wb,vb]:[B,Q]}function io({z:B,fill:Q,stroke:F}={}){return void 0===B&&([B]=Kb(Q)),void 0===B&&([B]=Kb(F)),B}function lo(B){return Lb(B)?B.length:B?.numRows}function co(B){const Q=lo(B),F=new Uint32Array(Q);for(let B=0;B<Q;++B)F[B]=B;return F}function eo(B,Q){return Lb(B)?Bo(Q,Q=>B[Q],B.constructor):Bo(Q,Q=>B.at(Q))}function no(B,Q,F){return B.subarray?B.subarray(Q,F):B.slice(Q,F)}function Co(B){return null!==B&&"object"==typeof B?B.valueOf():B}function ao(B){let Q;return[{transform:()=>Q,label:oo(B)},B=>Q=B]}function bo(B){return null==B?[B]:ao(B)}function oo(B,Q){return"string"==typeof B?B:B&&void 0!==B.label?B.label:Q}function uo(B,Q){return{transform(F){const U=B.transform(F),t=Q.transform(F);return Zo(U)||Zo(t)?Bo(U,(B,Q)=>new Date((+U[Q]+ +t[Q])/2)):Bo(U,(B,Q)=>(+U[Q]+ +t[Q])/2,Float64Array)},label:B.label}}function Go(B,Q){const F=ro(Q?.interval,Q?.type);return F?Bo(B,F):B}function ro(B,Q){const F=xo(B,Q);return F&&(B=>Ya(B)?F.floor(B):B)}function xo(B,Q){if(null!=B){if("number"==typeof B)return function(B){B=+B,0<B&&B<1&&Number.isInteger(1/B)&&(B=-1/B);const Q=Math.abs(B);return B<0?{floor:B=>Math.floor(B*Q)/Q,offset:(B,F=1)=>(B*Q+Math.floor(F))/Q,range:(B,F)=>cQ(Math.ceil(B*Q),F*Q).map(B=>B/Q)}:{floor:B=>Math.floor(B/Q)*Q,offset:(B,F=1)=>B+Q*Math.floor(F),range:(B,F)=>cQ(Math.ceil(B/Q),F/Q).map(B=>B*Q)}}(B);if("string"==typeof B)return("time"===Q?Cb:ab)(B);if("function"!=typeof B.floor)throw new Error("invalid interval; missing floor method");if("function"!=typeof B.offset)throw new Error("invalid interval; missing offset method");return B}}function Ao(B,Q){if((B=xo(B,Q))&&"function"!=typeof B.range)throw new Error("invalid interval: missing range method");return B}function Lo(B){return"function"==typeof B?.range}function ho(B){return void 0===B||so(B)?B:{value:B}}function Ro(B){return B&&"function"==typeof B[Symbol.iterator]}function yo(B){for(const Q of B)if(null!=Q)return"object"!=typeof Q||Q instanceof Date}function Vo(B){for(const Q of B){if(null==Q)continue;const B=typeof Q;return"string"===B||"boolean"===B}}function Zo(B){for(const Q of B)if(null!=Q)return Q instanceof Date}function So(B){for(const Q of B)if(null!=Q)return"string"==typeof Q&&isNaN(Q)&&ja(Q)}function mo(B){for(const Q of B)if(null!=Q){if("string"!=typeof Q)return!1;if(Q.trim())return!isNaN(Q)}}function Eo(B,Q){let F;for(const U of B)if(null!=U){if(!Q(U))return!1;F=!0}return F}const No=new Set("none,currentcolor,transparent,aliceblue,antiquewhite,aqua,aquamarine,azure,beige,bisque,black,blanchedalmond,blue,blueviolet,brown,burlywood,cadetblue,chartreuse,chocolate,coral,cornflowerblue,cornsilk,crimson,cyan,darkblue,darkcyan,darkgoldenrod,darkgray,darkgreen,darkgrey,darkkhaki,darkmagenta,darkolivegreen,darkorange,darkorchid,darkred,darksalmon,darkseagreen,darkslateblue,darkslategray,darkslategrey,darkturquoise,darkviolet,deeppink,deepskyblue,dimgray,dimgrey,dodgerblue,firebrick,floralwhite,forestgreen,fuchsia,gainsboro,ghostwhite,gold,goldenrod,gray,green,greenyellow,grey,honeydew,hotpink,indianred,indigo,ivory,khaki,lavender,lavenderblush,lawngreen,lemonchiffon,lightblue,lightcoral,lightcyan,lightgoldenrodyellow,lightgray,lightgreen,lightgrey,lightpink,lightsalmon,lightseagreen,lightskyblue,lightslategray,lightslategrey,lightsteelblue,lightyellow,lime,limegreen,linen,magenta,maroon,mediumaquamarine,mediumblue,mediumorchid,mediumpurple,mediumseagreen,mediumslateblue,mediumspringgreen,mediumturquoise,mediumvioletred,midnightblue,mintcream,mistyrose,moccasin,navajowhite,navy,oldlace,olive,olivedrab,orange,orangered,orchid,palegoldenrod,palegreen,paleturquoise,palevioletred,papayawhip,peachpuff,peru,pink,plum,powderblue,purple,rebeccapurple,red,rosybrown,royalblue,saddlebrown,salmon,sandybrown,seagreen,seashell,sienna,silver,skyblue,slateblue,slategray,slategrey,snow,springgreen,steelblue,tan,teal,thistle,tomato,turquoise,violet,wheat,white,whitesmoke,yellow".split(","));function Xo(B){return"string"==typeof B&&(B=B.toLowerCase().trim(),/^#[0-9a-f]{3,8}$/.test(B)||/^(?:url|var|rgb|rgba|hsl|hsla|hwb|lab|lch|oklab|oklch|color|color-mix)\(.*\)$/.test(B)||No.has(B))}function po(B){return"number"==typeof B&&(0<=B&&B<=1||isNaN(B))}function Wo(B){return null==B||Ho(B)}function Ho(B){return/^\s*none\s*$/i.test(B)}function Do(B,Q){return jb(B,Q,["middle","top-left","top","top-right","right","bottom-right","bottom","bottom-left","left"])}function fo(B="middle"){return Do(B,"frameAnchor")}function Yo(B){return Ro(B)?function(B){console.warn("named iterables are deprecated; please use an object instead");const Q=new Set;return Object.fromEntries(Array.from(B,B=>{const{name:F}=B;if(null==F)throw new Error("missing name");const U=`${F}`;if("__proto__"===U)throw new Error(`illegal name: ${U}`);if(Q.has(U))throw new Error(`duplicate name: ${U}`);return Q.add(U),[F,B]}))}(B):B}function wo(B){return!0===B?B="frame":!1===B?B=null:qb(B)||null==B||"sphere"===(B=Pb(B,"clip",["frame","sphere"]))&&(B={type:"Sphere"}),B}function vo(B){return B&&"function"==typeof B.getChild&&"function"==typeof B.toArray&&B.schema&&Array.isArray(B.schema.fields)}function Jo(B){return B&&"function"==typeof B.toArray&&B.type}const ko=Symbol("position"),Mo=Symbol("color"),To=Symbol("radius"),zo=Symbol("length"),Ko=Symbol("opacity"),Oo=Symbol("symbol"),jo=Symbol("projection"),Po=new Map([["x",ko],["y",ko],["fx",ko],["fy",ko],["r",To],["color",Mo],["opacity",Ko],["symbol",Oo],["length",zo],["projection",jo]]);function _o(B){return B===ko||B===jo}const $o=2/Math.sqrt(3),qo=new Map([["asterisk",FC],["circle",UC],["cross",tC],["diamond",gC],["diamond2",iC],["hexagon",{draw(B,Q){const F=Math.sqrt(Q/Math.PI),U=F*$o,t=U/2;B.moveTo(0,U),B.lineTo(F,t),B.lineTo(F,-t),B.lineTo(0,-U),B.lineTo(-F,-t),B.lineTo(-F,t),B.closePath()}}],["plus",lC],["square",cC],["square2",eC],["star",aC],["times",RC],["triangle",oC],["triangle2",GC],["wye",hC]]);function Bu(B){return B&&"function"==typeof B.draw}function Qu(B){return!!Bu(B)||"string"==typeof B&&qo.has(B.toLowerCase())}function Fu(B){if(null==B||Bu(B))return B;const Q=qo.get(`${B}`.toLowerCase());if(Q)return Q;throw new Error(`invalid symbol: ${B}`)}function Uu({filter:B,sort:Q,reverse:F,transform:U,initializer:t,...s}={},I){if(void 0===U&&(null!=B&&(U=iu(B)),null==Q||Io(Q)||(U=su(U,cu(Q))),F&&(U=su(U,lu))),null!=I&&null!=t)throw new Error("transforms cannot be applied after initializers");return{...s,...(null===Q||Io(Q))&&{sort:Q},transform:su(U,I)}}function tu({filter:B,sort:Q,reverse:F,initializer:U,...t}={},s){return void 0===U&&(null!=B&&(U=iu(B)),null==Q||Io(Q)||(U=Iu(U,cu(Q))),F&&(U=Iu(U,lu))),{...t,...(null===Q||Io(Q))&&{sort:Q},initializer:Iu(U,s)}}function su(B,Q){return null==B?null===Q?void 0:Q:null==Q?null===B?void 0:B:function(F,U,t){return({data:F,facets:U}=B.call(this,F,U,t)),Q.call(this,_b(F),U,t)}}function Iu(B,Q){return null==B?null===Q?void 0:Q:null==Q?null===B?void 0:B:function(F,U,t,...s){let I,g,i,l,c,e;return({data:g=F,facets:i=U,channels:I}=B.call(this,F,U,t,...s)),({data:c=g,facets:e=i,channels:l}=Q.call(this,g,i,{...t,...I},...s)),{data:c,facets:e,channels:{...I,...l}}}}function gu(B,Q){return(null!=B.initializer?tu:Uu)(B,Q)}function iu(B){return(Q,F)=>{const U=Vb(Q,B);return{data:Q,facets:F.map(B=>B.filter(B=>U[B]))}}}function lu(B,Q){return{data:B,facets:Q.map(B=>B.slice().reverse())}}function cu(B){return("function"==typeof B&&1!==B.length?eu:nu)(B)}function eu(B){return(Q,F)=>{const U=Lb(Q)?(F,U)=>B(Q[F],Q[U]):(F,U)=>B(Q.get(F),Q.get(U));return{data:Q,facets:F.map(B=>B.slice().sort(U))}}}function nu(B){let Q,F;({channel:Q,value:B,order:F}={...ho(B)});const U=Q?.startsWith("-");if(U&&(Q=Q.slice(1)),void 0===F&&(F=U?va:wa),"function"!=typeof F)switch(`${F}`.toLowerCase()){case"ascending":F=wa;break;case"descending":F=va;break;default:throw new Error(`invalid order: ${F}`)}return(U,t,s)=>{let I;if(void 0===Q)I=Vb(U,B);else{if(void 0===s)throw new Error("channel sort requires an initializer");if(I=s[Q],!I)return{};I=I.value}const g=(B,Q)=>F(I[B],I[Q]);return{data:U,facets:t.map(B=>B.slice().sort(g))}}}function du(B,...Q){for(const{name:F}of B)if(Q.includes(F))return!0;return!1}function Cu(B,Q,F,U=au){let t;Uo(Q)&&"reduce"in Q&&(t=Q.scale,Q=Q.reduce);const s=U(B,Q,F),[I,g]=ao(s.label);let i;return{name:B,output:void 0===t?I:{value:I,scale:t},initialize(B){s.initialize(B),i=g([])},scope(B,Q){s.scope(B,Q)},reduce(B,Q){i.push(s.reduce(B,Q))}}}function au(B,Q,F,U=ou){const t=function(B,Q){if(void 0!==Q[B])return Q[B];switch(B){case"x1":case"x2":B="x";break;case"y1":case"y2":B="y"}return Q[B]}(B,F),s=U(Q,t);let I,g;return{label:oo(s===Ru?null:t,s.label),initialize(B){I=void 0===t?B:Vb(B,t),"data"===s.scope&&(g=s.reduceIndex(co(B),I))},scope(B,Q){s.scope===B&&(g=s.reduceIndex(Q,I))},reduce:(B,Q)=>null==s.scope?s.reduceIndex(B,I,Q):s.reduceIndex(B,I,g,Q)}}function bu(B,Q){return Q?NB(B,B=>Q[B]):[[,B]]}function ou(B,Q,F=uu){if(null==B)return F(B);if("function"==typeof B.reduceIndex)return B;if("function"==typeof B.reduce&&Uo(B))return function(B){return console.warn("deprecated reduce interface; implement reduceIndex instead."),{...B,reduceIndex:B.reduce.bind(B)}}(B);if("function"==typeof B)return function(B){return{reduceIndex:(Q,F,U)=>B(eo(F,Q),U)}}(B);if(/^p\d{2}$/i.test(B))return Gu(function(B){const Q=+`${B}`.slice(1)/100;return(B,F)=>QQ(B,Q,F)}(B));switch(`${B}`.toLowerCase()){case"first":return Au;case"last":return hu;case"identity":return xu;case"count":return Ru;case"distinct":return yu;case"sum":return null==Q?Ru:Vu;case"proportion":return Zu(Q,"data");case"proportion-facet":return Zu(Q,"facet");case"deviation":return Gu(AB);case"min":return Gu(PB);case"min-index":return Gu(_B);case"max":return Gu(OB);case"max-index":return Gu(jB);case"mean":return ru(sQ);case"median":return ru(IQ);case"variance":return Gu(xB);case"mode":return Gu(iQ)}return F(B)}function uu(B){throw new Error(`invalid reduce: ${B}`)}function Gu(B){return{reduceIndex:(Q,F)=>B(Q,B=>F[B])}}function ru(B){return{reduceIndex(Q,F){const U=B(Q,B=>F[B]);return Zo(F)?new Date(U):U}}}const xu={reduceIndex:(B,Q)=>eo(Q,B)},Au={reduceIndex:(B,Q)=>Q[B[0]]},Lu={reduceIndex(B,Q){const F=HB(XB(B,B=>B.length,B=>Q[B]),vb),U=F.slice(-5).reverse();if(U.length<F.length){const B=F.slice(0,-4);U[4]=[`… ${B.length.toLocaleString("en-US")} more`,eQ(B,vb)]}return U.map(([B,Q])=>`${B} (${Q.toLocaleString("en-US")})`).join("\n")}},hu={reduceIndex:(B,Q)=>Q[B[B.length-1]]},Ru={label:"Frequency",reduceIndex:B=>B.length},yu={label:"Distinct",reduceIndex(B,Q){const F=new yB;for(const U of B)F.add(Q[U]);return F.size}},Vu=Gu(eQ);function Zu(B,Q){return null==B?{scope:Q,label:"Frequency",reduceIndex:(B,Q,F=1)=>B.length/F}:{scope:Q,reduceIndex:(B,Q,F=1)=>eQ(B,B=>Q[B])/F}}const Su={reduceIndex:(B,Q,{z:F})=>F};function mu(B,{scale:Q,type:F,value:U,filter:t,hint:s,label:I=oo(U)},g){return void 0===s&&"function"==typeof U?.transform&&(s=U.hint),Eu(g,{scale:Q,type:F,value:Vb(B,U),label:I,filter:t,hint:s})}function Eu(B,Q){const{scale:F,value:U}=Q;if(!0===F||"auto"===F)switch(B){case"fill":case"stroke":case"color":Q.scale=!0!==F&&Eo(U,Xo)?null:"color",Q.defaultScale="color";break;case"fillOpacity":case"strokeOpacity":case"opacity":Q.scale=!0!==F&&Eo(U,po)?null:"opacity",Q.defaultScale="opacity";break;case"symbol":!0!==F&&Eo(U,Qu)?(Q.scale=null,Q.value=Bo(U,Fu)):Q.scale="symbol",Q.defaultScale="symbol";break;default:Q.scale=Po.has(B)?B:null}else if(!1===F)Q.scale=null;else if(null!=F&&!Po.has(F))throw new Error(`unknown scale: ${F}`);return Q}function Nu(B,Q){for(const F in B){const U=B[F];if(U.scale===Q)return U}}function Xu(B,Q){const F=B.original;if(F===B)return Q;const U=Q.value,t=Q.value=[];for(let Q=0;Q<F.length;++Q){const s=U[F[Q][0]];for(const F of B[Q])t[F]=s}return Q}function pu(B,Q,F){const U=Wu(B,Q);return Bo(Wu(B,F),(B,Q)=>Math.abs(B-U[Q]),Float64Array)}function Wu(B,Q,F){let U=B[Q];if(U||void 0===F||(U=B[F]),U)return U.value;throw new Error(`missing channel: ${Q}`)}function Hu(B){if(null==B||"function"==typeof B)return B;switch(`${B}`.toLowerCase()){case"ascending":return Du;case"descending":return fu}throw new Error(`invalid order: ${B}`)}function Du([B,Q],[F,U]){return wa(Q,U)||wa(B,F)}function fu([B,Q],[F,U]){return va(Q,U)||wa(B,F)}function Yu(B,Q){let F=B[Q];if(F){for(;F.source;)F=F.source;return null===F.source?null:F}}const wu=new Map([["accent",an],["category10",Cn],["dark2",bn],["observable10",on],["paired",un],["pastel1",Gn],["pastel2",rn],["set1",xn],["set2",An],["set3",Ln],["tableau10",hn]]);const vu=new Map([...wu,["brbg",ku(yn,Vn)],["prgn",ku(Zn,Sn)],["piyg",ku(mn,En)],["puor",ku(Nn,Xn)],["rdbu",ku(pn,Wn)],["rdgy",ku(Hn,Dn)],["rdylbu",ku(fn,Yn)],["rdylgn",ku(wn,vn)],["spectral",ku(Jn,kn)],["burd",Mu(pn,Wn)],["buylrd",Mu(fn,Yn)],["blues",Ju(Cd,ad)],["greens",Ju(bd,od)],["greys",Ju(ud,Gd)],["oranges",Ju(hd,Rd)],["purples",Ju(rd,xd)],["reds",Ju(Ad,Ld)],["turbo",Tu(Hd)],["viridis",Tu(fd)],["magma",Tu(Yd)],["inferno",Tu(wd)],["plasma",Tu(vd)],["cividis",Tu(yd)],["cubehelix",Tu(Vd)],["warm",Tu(Zd)],["cool",Tu(Sd)],["bugn",Ju(Mn,Tn)],["bupu",Ju(zn,Kn)],["gnbu",Ju(On,jn)],["orrd",Ju(Pn,_n)],["pubu",Ju(Bd,Qd)],["pubugn",Ju($n,qn)],["purd",Ju(Fd,Ud)],["rdpu",Ju(td,sd)],["ylgn",Ju(id,ld)],["ylgnbu",Ju(Id,gd)],["ylorbr",Ju(cd,ed)],["ylorrd",Ju(nd,dd)],["rainbow",zu(Ed)],["sinebow",zu(Wd)]]);function Ju(B,Q){return({length:F})=>1===F?[B[3][1]]:2===F?[B[3][1],B[3][2]]:(F=Math.max(3,Math.floor(F)))>9?Yt(Q,F):B[F]}function ku(B,Q){return({length:F})=>2===F?[B[3][0],B[3][2]]:(F=Math.max(3,Math.floor(F)))>11?Yt(Q,F):B[F]}function Mu(B,Q){return({length:F})=>2===F?[B[3][2],B[3][0]]:(F=Math.max(3,Math.floor(F)))>11?Yt(B=>Q(1-B),F):B[F].slice().reverse()}function Tu(B){return({length:Q})=>Yt(B,Math.max(2,Math.floor(Q)))}function zu(B){return({length:Q})=>Yt(B,Math.floor(Q)+1).slice(0,-1)}function Ku(B){const Q=`${B}`.toLowerCase();if(!vu.has(Q))throw new Error(`unknown ordinal scheme: ${Q}`);return vu.get(Q)}function Ou(B,Q){const F=Ku(B),U="function"==typeof F?F({length:Q}):F;return U.length!==Q?U.slice(0,Q):U}const ju=new Map([["brbg",Vn],["prgn",Sn],["piyg",En],["puor",Xn],["rdbu",Wn],["rdgy",Dn],["rdylbu",Yn],["rdylgn",vn],["spectral",kn],["burd",B=>Wn(1-B)],["buylrd",B=>Yn(1-B)],["blues",ad],["greens",od],["greys",Gd],["purples",xd],["reds",Ld],["oranges",Rd],["turbo",Hd],["viridis",fd],["magma",Yd],["inferno",wd],["plasma",vd],["cividis",yd],["cubehelix",Vd],["warm",Zd],["cool",Sd],["bugn",Tn],["bupu",Kn],["gnbu",jn],["orrd",_n],["pubugn",qn],["pubu",Qd],["purd",Ud],["rdpu",sd],["ylgnbu",gd],["ylgn",ld],["ylorbr",ed],["ylorrd",dd],["rainbow",Ed],["sinebow",Wd]]);function Pu(B){const Q=`${B}`.toLowerCase();if(!ju.has(Q))throw new Error(`unknown quantitative scheme: ${Q}`);return ju.get(Q)}const _u=new Set(["brbg","prgn","piyg","puor","rdbu","rdgy","rdylbu","rdylgn","spectral","burd","buylrd"]);const $u=B=>Q=>B(1-Q),qu=[0,1],BG=new Map([["number",rt],["rgb",Ct],["hsl",pt],["hcl",Wt],["lab",function(B,Q){var F=dt((B=kU(B)).l,(Q=kU(Q)).l),U=dt(B.a,Q.a),t=dt(B.b,Q.b),s=dt(B.opacity,Q.opacity);return function(Q){return B.l=F(Q),B.a=U(Q),B.b=t(Q),B.opacity=s(Q),B+""}}]]);function QG(B){const Q=`${B}`.toLowerCase();if(!BG.has(Q))throw new Error(`unknown interpolator: ${Q}`);return BG.get(Q)}function FG(B,Q,F,{type:U,nice:t,clamp:s,zero:I,domain:g=cG(B,F),unknown:i,round:l,scheme:c,interval:e,range:n=(Po.get(B)===To?nG(F,g):Po.get(B)===zo?dG(F,g):Po.get(B)===Ko?qu:void 0),interpolate:d=(Po.get(B)===Mo?null==c&&void 0!==n?Ct:Pu(void 0!==c?c:"cyclical"===U?"rainbow":"turbo"):l?yt:rt),reverse:C}){if(g=UG(g),e=Ao(e,U),"cyclical"!==U&&"sequential"!==U||(U="linear"),"function"!=typeof d&&(d=QG(d)),C=!!C,void 0!==n){if(g.length!==(n=UG(n)).length){if(1===d.length)throw new Error("invalid piecewise interpolator");d=ft(d,n),n=void 0}}if(1===d.length?(C&&(d=$u(d),C=!1),void 0===n&&(n=Float64Array.from(g,(B,Q)=>Q/(g.length-1)),2===n.length&&(n=qu)),Q.interpolate((n===qu?Jb:bG)(d))):Q.interpolate(d),I){const[B,Q]=LB(g);if(B>0||Q<0){(Pa(g=Qo(g))||1)===Math.sign(B)?g[0]=0:g[g.length-1]=0}}return C&&(g=nQ(g)),Q.domain(g).unknown(i),t&&(Q.nice(function(B,Q){return!0===B?void 0:"number"==typeof B?B:function(B,Q){if((B=Ao(B,Q))&&"function"!=typeof B.ceil)throw new Error("invalid interval: missing ceil method");return B}(B,Q)}(t,U)),g=Q.domain()),void 0!==n&&Q.range(n),s&&Q.clamp(s),{type:U,domain:g,range:n,scale:Q,interpolate:d,interval:e}}function UG(B){return(B=$b(B)).length>=2?B:[B[0],B[0]]}function tG(B,Q,{exponent:F=1,...U}){return FG(B,vl().exponent(F),Q,{...U,type:"pow"})}function sG(B,Q,{base:F=10,domain:U=CG(Q),...t}){return FG(B,Nl().base(F),Q,{...t,domain:U})}function IG(B,Q,{constant:F=1,...U}){return FG(B,Hl().constant(F),Q,U)}function gG(B,Q,{range:F,quantiles:U=(void 0===F?5:(F=[...F]).length),n:t=U,scheme:s="rdylbu",domain:I=aG(Q),unknown:g,interpolate:i,reverse:l}){return void 0===F&&(F=void 0!==i?Yt(i,t):Po.get(B)===Mo?Ou(s,t):void 0),I.length>0&&(I=Jl(I,void 0===F?{length:t}:F).quantiles()),iG(B,Q,{domain:I,range:F,reverse:l,unknown:g})}function iG(B,Q,{domain:F=[0],unknown:U,scheme:t="rdylbu",interpolate:s,range:I=(void 0!==s?Yt(s,F.length+1):Po.get(B)===Mo?Ou(t,F.length+1):void 0),reverse:g}){const i=Pa(F=$b(F));if(!isNaN(i)&&!function(B,Q){for(let F=1,U=B.length,t=B[0];F<U;++F){const U=eB(t,t=B[F]);if(0!==U&&U!==Q)return!1}return!0}(F,i))throw new Error(`the ${B} scale has a non-monotonic domain`);return g&&(I=nQ(I)),{type:"threshold",scale:kl(i<0?nQ(F):F,void 0===I?[]:I).unknown(U),domain:F,range:I}}function lG(B,Q=ka){return B.length?[PB(B,({value:B})=>void 0===B?B:PB(B,Q)),OB(B,({value:B})=>void 0===B?B:OB(B,Q))]:[0,1]}function cG(B,Q){const F=Po.get(B);return(F===To||F===Ko||F===zo?eG:lG)(Q)}function eG(B){return[0,B.length?OB(B,({value:B})=>void 0===B?B:OB(B,ka)):1]}function nG(B,Q){const F=B.find(({radius:B})=>void 0!==B);if(void 0!==F)return[0,F.radius];const U=QQ(B,.5,({value:B})=>void 0===B?NaN:QQ(B,.25,Ma)),t=Q.map(B=>3*Math.sqrt(B/U)),s=30/OB(t);return s<1?t.map(B=>B*s):t}function dG(B,Q){const F=IQ(B,({value:B})=>void 0===B?NaN:IQ(B,Math.abs)),U=Q.map(B=>12*B/F),t=60/OB(U);return t<1?U.map(B=>B*t):U}function CG(B){for(const{value:Q}of B)if(void 0!==Q)for(let F of Q){if(F>0)return lG(B,Ma);if(F<0)return lG(B,Ta)}return[1,10]}function aG(B){const Q=[];for(const{value:F}of B)if(void 0!==F)for(const B of F)Q.push(B);return Q}function bG(B){return(Q,F)=>U=>B(Q+U*(F-Q))}let oG,uG=0;function GG(B){B!==oG&&(oG=B,console.warn(B),++uG)}function rG(B,Q,F,U,{type:t,nice:s,clamp:I,domain:g=lG(U),unknown:i,pivot:l=0,scheme:c,range:e,symmetric:n=!0,interpolate:d=(Po.get(B)===Mo?null==c&&void 0!==e?Ct:Pu(void 0!==c?c:"rdbu"):rt),reverse:C}){l=+l,g=$b(g);let[a,b]=g;if(g.length>2&&GG(`Warning: the diverging ${B} scale domain contains extra elements.`),eB(a,b)<0&&([a,b]=[b,a],C=!C),a=Math.min(a,l),b=Math.max(b,l),"function"!=typeof d&&(d=QG(d)),void 0!==e&&(d=1===d.length?bG(d)(...e):ft(d,e)),C&&(d=$u(d)),n){const B=F.apply(l),Q=B-F.apply(a),U=F.apply(b)-B;Q<U?a=F.invert(B-U):Q>U&&(b=F.invert(B+Q))}return Q.domain([a,l,b]).unknown(i).interpolator(d),I&&Q.clamp(I),s&&Q.nice(s),{type:t,domain:[a,b],pivot:l,interpolate:d,scale:Q}}function xG(B,Q,F){return rG(B,ln(),RG,Q,F)}function AG(B,Q,{exponent:F=1,...U}){return rG(B,nn().exponent(F=+F),function(B){return.5===B?VG:{apply:Q=>Math.sign(Q)*Math.pow(Math.abs(Q),B),invert:Q=>Math.sign(Q)*Math.pow(Math.abs(Q),1/B)}}(F),Q,{...U,type:"diverging-pow"})}function LG(B,Q,{base:F=10,pivot:U=1,domain:t=lG(Q,U<0?Ta:Ma),...s}){return rG(B,cn().base(F=+F),yG,Q,{domain:t,pivot:U,...s})}function hG(B,Q,{constant:F=1,...U}){return rG(B,en().constant(F=+F),function(B){return{apply:Q=>Math.sign(Q)*Math.log1p(Math.abs(Q/B)),invert:Q=>Math.sign(Q)*Math.expm1(Math.abs(Q))*B}}(F),Q,U)}const RG={apply:B=>B,invert:B=>B},yG={apply:Math.log,invert:Math.exp},VG={apply:B=>Math.sign(B)*Math.sqrt(Math.abs(B)),invert:B=>Math.sign(B)*(B*B)};function ZG(B,Q,F,U){return FG(B,Q,F,U)}function SG(B,Q,F){return ZG(B,function(){return tl.apply(sn(Nc,Xc,Vc,Rc,cc,Ic,tc,Fc,Qc,fc).domain([new Date(2e3,0,1),new Date(2e3,0,2)]),arguments)}(),Q,F)}function mG(B,Q,F){return ZG(B,function(){return tl.apply(sn(mc,Ec,Zc,yc,uc,gc,sc,Uc,Qc,Yc).domain([Date.UTC(2e3,0,1),Date.UTC(2e3,0,2)]),arguments)}(),Q,F)}const EG=Symbol("ordinal");function NG(B,Q,F,{type:U,interval:t,domain:s,range:I,reverse:g,hint:i}){return t=Ao(t,U),void 0===s&&(s=WG(F,t,B)),"categorical"!==U&&U!==EG||(U="ordinal"),g&&(s=nQ(s)),s=Q.domain(s).domain(),void 0!==I&&("function"==typeof I&&(I=I(s)),Q.range(I)),{type:U,domain:s,range:I,scale:Q,hint:i,interval:t}}function XG(B,Q,{type:F,interval:U,domain:t,range:s,scheme:I,unknown:g,...i}){let l;if(U=Ao(U,F),void 0===t&&(t=WG(Q,U,B)),Po.get(B)===Oo)l=function(B){return{fill:HG(B,"fill"),stroke:HG(B,"stroke")}}(Q),s=void 0===s?function(B){return Wo(B.fill)?VC:yC}(l):Bo(s,Fu);else if(Po.get(B)===Mo&&(void 0!==s||"ordinal"!==F&&F!==EG||(s=function(B,Q="greys"){const F=new Set,[U,t]=Ou(Q,2);for(const Q of B)if(null!=Q)if(!0===Q)F.add(t);else{if(!1!==Q)return;F.add(U)}return[...F]}(t,I),void 0!==s&&(I=void 0)),void 0===I&&void 0===s&&(I="ordinal"===F?"turbo":"observable10"),void 0!==I))if(void 0!==s){const B=Pu(I),Q=s[0],F=s[1]-s[0];s=({length:U})=>Yt(U=>B(Q+F*U),U)}else s=Ku(I);if(g===Il)throw new Error(`implicit unknown on ${B} scale is not supported`);return NG(B,gl().unknown(g),Q,{...i,type:F,domain:t,range:s,hint:l})}function pG(B,Q,F,U){let{round:t}=F;return void 0!==t&&B.round(t=!!t),(B=NG(U,B,Q,F)).round=t,B}function WG(B,Q,F){const U=new yB;for(const{value:Q,domain:F}of B){if(void 0!==F)return F();if(void 0!==Q)for(const B of Q)U.add(B)}if(void 0!==Q){const[B,F]=LB(U).map(Q.floor,Q);return Q.range(B,Q.offset(F))}if(U.size>1e4&&Po.get(F)===ko)throw new Error(`implicit ordinal domain of ${F} scale has more than 10,000 values`);return HB(U,wa)}function HG(B,Q){let F;for(const{hint:U}of B){const B=U?.[Q];if(void 0!==B)if(void 0===F)F=B;else if(F!==B)return}return F}function DG(B,{label:Q,inset:F=0,insetTop:U=F,insetRight:t=F,insetBottom:s=F,insetLeft:I=F,round:g,nice:i,clamp:l,zero:c,align:e,padding:n,projection:d,facet:{label:C=Q}={},...a}={}){const b={};for(const[F,o]of B){const B=a[F],u=zG(F,o,{round:Po.get(F)===ko?g:void 0,nice:i,clamp:l,zero:c,align:e,padding:n,projection:d,...B});if(u){let{label:g=("fx"===F||"fy"===F?C:Q),percent:i,transform:l,inset:c,insetTop:e=(void 0!==c?c:"y"===F?U:0),insetRight:n=(void 0!==c?c:"x"===F?t:0),insetBottom:d=(void 0!==c?c:"y"===F?s:0),insetLeft:a=(void 0!==c?c:"x"===F?I:0)}=B||{};if(null==l)l=void 0;else if("function"!=typeof l)throw new Error("invalid scale transform; not a function");u.percent=!!i,u.label=void 0===g?YG(o,u):g,u.transform=l,"x"===F||"fx"===F?(u.insetLeft=+a,u.insetRight=+n):"y"!==F&&"fy"!==F||(u.insetTop=+e,u.insetBottom=+d),b[F]=u}}return b}function fG(B){const Q={},F={scales:Q};for(const[U,t]of Object.entries(B)){const{scale:B,type:s,interval:I,label:g}=t;Q[U]=Fr(t),F[U]=B,B.type=s,null!=I&&(B.interval=I),null!=g&&(B.label=g)}return F}function YG(B=[],Q){let F;for(const{label:Q}of B)if(void 0!==Q)if(void 0===F)F=Q;else if(F!==Q)return;if(void 0!==F)return!_G(Q)&&Q.percent&&(F=`${F} (%)`),{inferred:!0,toString:()=>F}}function wG(B){const{marginTop:Q,marginRight:F,marginBottom:U,marginLeft:t,width:s,height:I,facet:{marginTop:g,marginRight:i,marginBottom:l,marginLeft:c}}=B;return{marginTop:Math.max(Q,g),marginRight:Math.max(F,i),marginBottom:Math.max(U,l),marginLeft:Math.max(t,c),width:s,height:I}}function vG({fx:B,fy:Q},F){const{marginTop:U,marginRight:t,marginBottom:s,marginLeft:I,width:g,height:i}=wG(F);return{marginTop:U,marginRight:t,marginBottom:s,marginLeft:I,width:B?B.scale.bandwidth()+I+t:g,height:Q?Q.scale.bandwidth()+U+s:i,facet:{width:g,height:i}}}function JG(B,Q){if(void 0===B.range){const{insetLeft:F,insetRight:U}=B,{width:t,marginLeft:s=0,marginRight:I=0}=Q,g=s+F,i=t-I-U;B.range=[g,Math.max(g,i)],_G(B)||(B.range=TG(B)),B.scale.range(B.range)}MG(B)}function kG(B,Q){if(void 0===B.range){const{insetTop:F,insetBottom:U}=B,{height:t,marginTop:s=0,marginBottom:I=0}=Q,g=s+F,i=t-I-U;B.range=[Math.max(g,i),g],_G(B)?B.range.reverse():B.range=TG(B),B.scale.range(B.range)}MG(B)}function MG(B){void 0===B.round&&function({type:B}){return"point"===B||"band"===B}(B)&&function({scale:B}){const Q=B.domain().length,[F,U]=B.range(),t=B.paddingInner?B.paddingInner():1,s=B.paddingOuter?B.paddingOuter():B.padding(),I=Q-t,g=Math.abs(U-F)/Math.max(1,I+2*s);return(g-Math.floor(g))*I}(B)<=30&&B.scale.round(!0)}function TG(B){const Q=B.scale.domain().length+$G(B);if(!(Q>2))return B.range;const[F,U]=B.range;return Array.from({length:Q},(B,t)=>F+t/(Q-1)*(U-F))}function zG(B,Q=[],F={}){const U=function(B,Q,{type:F,domain:U,range:t,scheme:s,pivot:I,projection:g}){if(F=OG(F),"fx"===B||"fy"===B)return"band";"x"!==B&&"y"!==B||null==g||(F=jG);for(const B of Q){const Q=OG(B.type);if(void 0!==Q)if(void 0===F)F=Q;else if(F!==Q)throw new Error(`scale incompatible with channel: ${F} !== ${Q}`)}if(F===jG)return;if(void 0!==F)return F;if(void 0===U&&!Q.some(({value:B})=>void 0!==B))return;const i=Po.get(B);if(i===To)return"sqrt";if(i===Ko||i===zo)return"linear";if(i===Oo)return"ordinal";const l=(U??t)?.length;if(l<2||l>2)return PG(i);if(void 0!==U){if(Vo(U))return PG(i);if(Zo(U))return"utc"}else{const B=Q.map(({value:B})=>B).filter(B=>void 0!==B);if(B.some(Vo))return PG(i);if(B.some(Zo))return"utc"}if(i===Mo){if(null!=I||function(B){return null!=B&&_u.has(`${B}`.toLowerCase())}(s))return"diverging";if(function(B){return null!=B&&wu.has(`${B}`.toLowerCase())}(s))return"categorical"}return"linear"}(B,Q,F);if(void 0===F.type&&void 0===F.domain&&void 0===F.range&&null==F.interval&&"fx"!==B&&"fy"!==B&&_G({type:U})){const F=Q.map(({value:B})=>B).filter(B=>void 0!==B);F.some(Zo)?GG(`Warning: some data associated with the ${B} scale are dates. Dates are typically associated with a "utc" or "time" scale rather than a "${KG(U)}" scale. If you are using a bar mark, you probably want a rect mark with the interval option instead; if you are using a group transform, you probably want a bin transform instead. If you want to treat this data as ordinal, you can specify the interval of the ${B} scale (e.g., d3.utcDay), or you can suppress this warning by setting the type of the ${B} scale to "${KG(U)}".`):F.some(So)?GG(`Warning: some data associated with the ${B} scale are strings that appear to be dates (e.g., YYYY-MM-DD). If these strings represent dates, you should parse them to Date objects. Dates are typically associated with a "utc" or "time" scale rather than a "${KG(U)}" scale. If you are using a bar mark, you probably want a rect mark with the interval option instead; if you are using a group transform, you probably want a bin transform instead. If you want to treat this data as ordinal, you can suppress this warning by setting the type of the ${B} scale to "${KG(U)}".`):F.some(mo)&&GG(`Warning: some data associated with the ${B} scale are strings that appear to be numbers. If these strings represent numbers, you should parse or coerce them to numbers. Numbers are typically associated with a "linear" scale rather than a "${KG(U)}" scale. If you want to treat this data as ordinal, you can specify the interval of the ${B} scale (e.g., 1 for integers), or you can suppress this warning by setting the type of the ${B} scale to "${KG(U)}".`)}switch(F.type=U,U){case"diverging":case"diverging-sqrt":case"diverging-pow":case"diverging-log":case"diverging-symlog":case"cyclical":case"sequential":case"linear":case"sqrt":case"threshold":case"quantile":case"pow":case"log":case"symlog":F=Br(Q,F,kb);break;case"identity":switch(Po.get(B)){case ko:F=Br(Q,F,kb);break;case Oo:F=Br(Q,F,Qr)}break;case"utc":case"time":F=Br(Q,F,Tb)}switch(U){case"diverging":return xG(B,Q,F);case"diverging-sqrt":return function(B,Q,F){return AG(B,Q,{...F,exponent:.5})}(B,Q,F);case"diverging-pow":return AG(B,Q,F);case"diverging-log":return LG(B,Q,F);case"diverging-symlog":return hG(B,Q,F);case"categorical":case"ordinal":case EG:return XG(B,Q,F);case"cyclical":case"sequential":case"linear":return function(B,Q,F){return FG(B,Al(),Q,F)}(B,Q,F);case"sqrt":return function(B,Q,F){return tG(B,Q,{...F,exponent:.5})}(B,Q,F);case"threshold":return iG(B,0,F);case"quantile":return gG(B,Q,F);case"quantize":return function(B,Q,{range:F,n:U=(void 0===F?5:(F=[...F]).length),scheme:t="rdylbu",domain:s=cG(B,Q),unknown:I,interpolate:g,reverse:i}){const[l,c]=LB(s);let e;return void 0===F?(e=MB(l,c,U),e[0]<=l&&e.splice(0,1),e[e.length-1]>=c&&e.pop(),U=e.length+1,F=void 0!==g?Yt(g,U):Po.get(B)===Mo?Ou(t,U):void 0):(e=Yt(rt(l,c),U+1).slice(1,-1),l instanceof Date&&(e=e.map(B=>new Date(B)))),Pa($b(s))<0&&e.reverse(),iG(B,0,{domain:e,range:F,reverse:i,unknown:I})}(B,Q,F);case"pow":return tG(B,Q,F);case"log":return sG(B,Q,F);case"symlog":return IG(B,Q,F);case"utc":return mG(B,Q,F);case"time":return SG(B,Q,F);case"point":return function(B,Q,{align:F=.5,padding:U=.5,...t}){return pG(cl().align(F).padding(U),Q,t,B)}(B,Q,F);case"band":return function(B,Q,{align:F=.5,padding:U=.1,paddingInner:t=U,paddingOuter:s=("fx"===B||"fy"===B?0:U),...I}){return pG(il().align(F).paddingInner(t).paddingOuter(s),Q,I,B)}(B,Q,F);case"identity":return function(B){return{type:"identity",scale:(Q=Po.get(B),Q===ko||Q===To||Q===zo||Q===Ko?Ll():B=>B)};var Q}(B);case void 0:return;default:throw new Error(`unknown scale type: ${U}`)}}function KG(B){return"symbol"==typeof B?B.description:B}function OG(B){return"string"==typeof B?`${B}`.toLowerCase():B}const jG={toString:()=>"projection"};function PG(B){switch(B){case ko:return"point";case Mo:return EG;default:return"ordinal"}}function _G({type:B}){return"ordinal"===B||"point"===B||"band"===B||B===EG}function $G({type:B}){return"threshold"===B}function qG(B){if(void 0===B)return!0;const Q=B.domain(),F=B(Q[0]);for(let U=1,t=Q.length;U<t;++U)if(B(Q[U])-F)return!1;return!0}function Br(B,{domain:Q,...F},U){for(const F of B)void 0!==F.value&&(void 0===Q&&(Q=F.value?.domain),F.value=U(F.value));return{domain:void 0===Q?Q:U(Q),...F}}function Qr(B){return Bo(B,Fu)}function Fr({scale:B,type:Q,domain:F,range:U,interpolate:t,interval:s,transform:I,percent:g,pivot:i}){if("identity"===Q)return{type:"identity",apply:B=>B,invert:B=>B};const l=B.unknown?B.unknown():void 0;return{type:Q,domain:Qo(F),...void 0!==U&&{range:Qo(U)},...void 0!==I&&{transform:I},...g&&{percent:g},...void 0!==l&&{unknown:l},...void 0!==s&&{interval:s},...void 0!==t&&{interpolate:t},...B.clamp&&{clamp:B.clamp()},...void 0!==i&&{pivot:i,symmetric:!1},...B.base&&{base:B.base()},...B.exponent&&{exponent:B.exponent()},...B.constant&&{constant:B.constant()},...B.align&&{align:B.align(),round:B.round()},...B.padding&&(B.paddingInner?{paddingInner:B.paddingInner(),paddingOuter:B.paddingOuter()}:{padding:B.padding()}),...B.bandwidth&&{bandwidth:B.bandwidth(),step:B.step()},apply:Q=>B(Q),...B.invert&&{invert:Q=>B.invert(Q)}}}function Ur(B,Q){const{fx:F,fy:U}=DG(B,Q),t=F?.scale.domain(),s=U?.scale.domain();return t&&s?function(...B){const Q="function"==typeof B[B.length-1]&&function(B){return Q=>B(...Q)}(B.pop()),F=(B=B.map(GB)).map(oB),U=B.length-1,t=new Array(U+1).fill(0),s=[];if(U<0||F.some(uB))return s;for(;;){s.push(t.map((Q,F)=>B[F][Q]));let I=U;for(;++t[I]===F[I];){if(0===I)return Q?s.map(Q):s;t[I--]=0}}}(t,s).map(([B,Q],F)=>({x:B,y:Q,i:F})):t?t.map((B,Q)=>({x:B,i:Q})):s?s.map((B,Q)=>({y:B,i:Q})):void 0}function tr(B,{fx:Q,fy:F}){const U=co(B),t=Q?.value,s=F?.value;return Q&&F?XB(U,B=>(B.fx=t[B[0]],B.fy=s[B[0]],B),B=>t[B],B=>s[B]):Q?XB(U,B=>(B.fx=t[B[0]],B),B=>t[B]):XB(U,B=>(B.fy=s[B[0]],B),B=>s[B])}function sr(B){const Q=[],F=new Uint32Array(eQ(B,B=>B.length));for(const U of B){let t=0;for(const Q of B)U!==Q&&(F.set(Q,t),t+=Q.length);Q.push(F.slice(0,t))}return Q}const Ir=new Map([["top",er],["right",Cr],["bottom",nr],["left",dr],["top-left",ar(er,dr)],["top-right",ar(er,Cr)],["bottom-left",ar(nr,dr)],["bottom-right",ar(nr,Cr)],["top-empty",function(B,{y:Q},{x:F,y:U,empty:t}){if(t)return!1;if(!Q)return;const s=lr(Q,U);if(s>0)return cr(B,F,Q[s-1])}],["right-empty",function(B,{x:Q},{x:F,y:U,empty:t}){if(t)return!1;if(!Q)return;const s=lr(Q,F);if(s<Q.length-1)return cr(B,Q[s+1],U)}],["bottom-empty",function(B,{y:Q},{x:F,y:U,empty:t}){if(t)return!1;if(!Q)return;const s=lr(Q,U);if(s<Q.length-1)return cr(B,F,Q[s+1])}],["left-empty",function(B,{x:Q},{x:F,y:U,empty:t}){if(t)return!1;if(!Q)return;const s=lr(Q,F);if(s>0)return cr(B,Q[s-1],U)}],["empty",function(B,Q,{empty:F}){return F}]]);const gr=new WeakMap;function ir(B){let Q=gr.get(B);return Q||gr.set(B,Q=new RB(Bo(B,(B,Q)=>[B,Q]))),Q}function lr(B,Q){return ir(B).get(Q)}function cr(B,Q,F){return function(B,Q,F){return Q=Co(Q),F=Co(F),B.find(B=>Object.is(Co(B.x),Q)&&Object.is(Co(B.y),F))}(B,Q,F)?.empty}function er(B,{y:Q},{y:F}){return!Q||0===lr(Q,F)}function nr(B,{y:Q},{y:F}){return!Q||lr(Q,F)===Q.length-1}function dr(B,{x:Q},{x:F}){return!Q||0===lr(Q,F)}function Cr(B,{x:Q},{x:F}){return!Q||lr(Q,F)===Q.length-1}function ar(B,Q){return function(){return B.apply(null,arguments)&&Q.apply(null,arguments)}}function br(B,{channels:{fx:Q,fy:F},groups:U}){return Q&&F?B.map(({x:B,y:Q})=>U.get(B)?.get(Q)??[]):Q?B.map(({x:B})=>U.get(B)??[]):B.map(({y:B})=>U.get(B)??[])}const or=Math.PI,ur=2*or,Gr=.618;function rr({projection:B,inset:Q=0,insetTop:F=Q,insetRight:U=Q,insetBottom:t=Q,insetLeft:s=Q}={},I){if(null==B)return;if("function"==typeof B.stream)return B;let g,i,l="frame";if(Uo(B)){let Q;if(({type:B,domain:i,inset:Q,insetTop:F=(void 0!==Q?Q:F),insetRight:U=(void 0!==Q?Q:U),insetBottom:t=(void 0!==Q?Q:t),insetLeft:s=(void 0!==Q?Q:s),clip:l=l,...g}=B),null==B)return}"function"!=typeof B&&({type:B}=xr(B));const{width:c,height:e,marginLeft:n,marginRight:d,marginTop:C,marginBottom:a}=I,b=c-n-d-s-U,o=e-C-a-F-t;if(B=B?.({width:b,height:o,clip:l,...g}),null==B)return;l=function(B,Q,F,U,t){if(!1===B||null==B||"number"==typeof B)return B=>B;!0===B&&(B="frame");if("frame"===`${B}`.toLowerCase())return tg(Q,F,U,t);throw new Error(`unknown projection clip type: ${B}`)}(l,n,C,c-d,e-a);let u,G=n+s,r=C+F;if(null!=i){const[[Q,F],[U,t]]=gi(B).bounds(i),s=Math.min(b/(U-Q),o/(t-F));s>0?(G-=(s*(Q+U)-b)/2,r-=(s*(F+t)-o)/2,u=ii({point(B,Q){this.stream.point(B*s+G,Q*s+r)}})):GG("Warning: the projection could not be fit to the specified domain; using the default scale.")}return u??=0===G&&0===r?hr():ii({point(B,Q){this.stream.point(B+G,Q+r)}}),{stream:Q=>B.stream(u.stream(l(Q)))}}function xr(B){switch(`${B}`.toLowerCase()){case"albers-usa":return Ar(yi,.7463,.4673);case"albers":return Lr(Ri,.7463,.4673);case"azimuthal-equal-area":return Ar(mi,4,4);case"azimuthal-equidistant":return Ar(Ni,ur,ur);case"conic-conformal":return Lr(fi,ur,ur);case"conic-equal-area":return Lr(hi,6.1702,2.9781);case"conic-equidistant":return Lr(Ji,7.312,3.6282);case"equal-earth":return Ar(ji,5.4133,2.6347);case"equirectangular":return Ar(wi,ur,or);case"gnomonic":return Ar(_i,3.4641,3.4641);case"identity":return{type:hr};case"reflect-y":return{type:Rr};case"mercator":return Ar(pi,ur,ur);case"orthographic":return Ar(qi,2,2);case"stereographic":return Ar(Ql,2,2);case"transverse-mercator":return Ar(Ul,ur,ur);default:throw new Error(`unknown projection type: ${B}`)}}function Ar(B,Q,F){return{type:({width:U,height:t,rotate:s,precision:I=.15,clip:g})=>{const i=B();return null!=I&&i.precision?.(I),null!=s&&i.rotate?.(s),"number"==typeof g&&i.clipAngle?.(g),null!=U&&(i.scale(Math.min(U/Q,t/F)),i.translate([U/2,t/2])),i},aspectRatio:F/Q}}function Lr(B,Q,F){const{type:U,aspectRatio:t}=Ar(B,Q,F);return{type:B=>{const{parallels:Q,domain:F,width:t,height:s}=B,I=U(B);return null!=Q&&(I.parallels(Q),void 0===F&&null!=t&&I.fitSize([t,s],{type:"Sphere"})),I},aspectRatio:t}}const hr=Jb({stream:B=>B}),Rr=Jb(ii({point(B,Q){this.stream.point(B,-Q)}}));function yr(B,Q,F,U){const t=F[B],s=F[Q],I=t.length,g=F[B]=new Float64Array(I).fill(NaN),i=F[Q]=new Float64Array(I).fill(NaN);let l;const c=U.stream({point(B,Q){g[l]=B,i[l]=Q}});for(l=0;l<I;++l)c.point(t[l],s[l])}function Vr({projection:B}={}){return null!=B&&("function"==typeof B.stream||(Uo(B)&&(B=B.type),null!=B))}function Zr(B){const Q=[],F=[],U={scale:"x",value:Q},t={scale:"y",value:F},s={point(B,U){Q.push(B),F.push(U)},lineStart(){},lineEnd(){},polygonStart(){},polygonEnd(){},sphere(){}};for(const Q of B.value)mI(Q,s);return[U,t]}function Sr(B={}){const{document:Q=("undefined"!=typeof window?window.document:void 0),clip:F}=B;return{document:Q,clip:wo(F)}}function mr(B,{document:Q}){return YF(NQ(B).call(Q.documentElement))}const Er=Symbol("unset");function Nr(B){return(1===B.length?Xr:pr)(B)}function Xr(B){let Q,F=Er;return U=>(Object.is(F,U)||(F=U,Q=B(U)),Q)}function pr(B){let Q,F;return(...U)=>((F?.length!==U.length||F.some((B,Q)=>!Object.is(B,U[Q])))&&(F=U,Q=B(...U)),Q)}const Wr=Nr(B=>new Intl.NumberFormat(B));function Hr(B){return za(B,"Invalid Date")}Nr((B,Q)=>new Intl.DateTimeFormat(B,{timeZone:"UTC",...Q&&{month:Q}})),Nr((B,Q)=>new Intl.DateTimeFormat(B,{timeZone:"UTC",...Q&&{weekday:Q}}));const Dr=function(B="en-US"){const Q=function(B="en-US"){const Q=Wr(B);return B=>null==B||isNaN(B)?void 0:Q.format(B)}(B);return B=>(B instanceof Date?Hr:"number"==typeof B?Q:fb)(B)}(),fr=("undefined"!=typeof window?window.devicePixelRatio>1:"undefined"==typeof it)?0:.5;let Yr=0;function wr(){return"plot-clip-"+ ++Yr}function vr(B,{title:Q,href:F,ariaLabel:U,ariaDescription:t,ariaHidden:s,target:I,fill:g,fillOpacity:i,stroke:l,strokeWidth:c,strokeOpacity:e,strokeLinejoin:n,strokeLinecap:d,strokeMiterlimit:C,strokeDasharray:a,strokeDashoffset:b,opacity:o,mixBlendMode:u,imageFilter:G,paintOrder:r,pointerEvents:x,shapeRendering:A,channels:L},{ariaLabel:h,fill:R="currentColor",fillOpacity:y,stroke:V="none",strokeOpacity:Z,strokeWidth:S,strokeLinecap:m,strokeLinejoin:E,strokeMiterlimit:N,paintOrder:X}){null===R&&(g=null,i=null),null===V&&(l=null,e=null),Wo(R)?Wo(V)||Wo(g)&&!L?.fill||(V="none"):!Wo(V)||Wo(l)&&!L?.stroke||(R="none");const[p,W]=Kb(g,R),[H,D]=Ob(i,y),[f,Y]=Kb(l,V),[w,v]=Ob(e,Z),[J,k]=Ob(o);Ho(Y)||(void 0===c&&(c=S),void 0===d&&(d=m),void 0===n&&(n=E),void 0!==C||/^\s*round\s*$/i.test(n)||(C=N),Ho(W)||void 0!==r||(r=X));const[M,T]=Ob(c);return null!==R&&(B.fill=Fx(W,"currentColor"),B.fillOpacity=Ux(D,1)),null!==V&&(B.stroke=Fx(Y,"none"),B.strokeWidth=Ux(T,1),B.strokeOpacity=Ux(v,1),B.strokeLinejoin=Fx(n,"miter"),B.strokeLinecap=Fx(d,"butt"),B.strokeMiterlimit=Ux(C,4),B.strokeDasharray=Fx(a,"none"),B.strokeDashoffset=Fx(b,"0")),B.target=fb(I),B.ariaLabel=fb(h),B.ariaDescription=fb(t),B.ariaHidden=fb(s),B.opacity=Ux(k,1),B.mixBlendMode=Fx(u,"normal"),B.imageFilter=Fx(G,"none"),B.paintOrder=Fx(r,"normal"),B.pointerEvents=Fx(x,"auto"),B.shapeRendering=Fx(A,"auto"),{title:{value:Q,optional:!0,filter:null},href:{value:F,optional:!0,filter:null},ariaLabel:{value:U,optional:!0,filter:null},fill:{value:p,scale:"auto",optional:!0},fillOpacity:{value:H,scale:"auto",optional:!0},stroke:{value:f,scale:"auto",optional:!0},strokeOpacity:{value:w,scale:"auto",optional:!0},strokeWidth:{value:M,optional:!0},opacity:{value:J,scale:"auto",optional:!0}}}function Jr(B,Q){Q&&B.text(B=>Dr(Q[B]))}function kr(B,Q){Q&&B.text(([B])=>Dr(Q[B]))}function Mr(B,{target:Q,tip:F},{ariaLabel:U,title:t,fill:s,fillOpacity:I,stroke:g,strokeOpacity:i,strokeWidth:l,opacity:c,href:e}){U&&Bx(B,"aria-label",B=>U[B]),s&&Bx(B,"fill",B=>s[B]),I&&Bx(B,"fill-opacity",B=>I[B]),g&&Bx(B,"stroke",B=>g[B]),i&&Bx(B,"stroke-opacity",B=>i[B]),l&&Bx(B,"stroke-width",B=>l[B]),c&&Bx(B,"opacity",B=>c[B]),e&&qr(B,B=>e[B],Q),F||function(B,Q){Q&&B.filter(B=>Ja(Q[B])).append("title").call(Jr,Q)}(B,t)}function Tr(B,{target:Q,tip:F},{ariaLabel:U,title:t,fill:s,fillOpacity:I,stroke:g,strokeOpacity:i,strokeWidth:l,opacity:c,href:e}){U&&Bx(B,"aria-label",([B])=>U[B]),s&&Bx(B,"fill",([B])=>s[B]),I&&Bx(B,"fill-opacity",([B])=>I[B]),g&&Bx(B,"stroke",([B])=>g[B]),i&&Bx(B,"stroke-opacity",([B])=>i[B]),l&&Bx(B,"stroke-width",([B])=>l[B]),c&&Bx(B,"opacity",([B])=>c[B]),e&&qr(B,([B])=>e[B],Q),F||function(B,Q){Q&&B.filter(([B])=>Ja(Q[B])).append("title").call(kr,Q)}(B,t)}function*zr(B,Q,F,U){const{z:t}=F,{z:s}=U,I=function({ariaLabel:B,title:Q,fill:F,fillOpacity:U,stroke:t,strokeOpacity:s,strokeWidth:I,opacity:g,href:i},{tip:l}){return[B,l?void 0:Q,F,U,t,s,I,g,i].filter(B=>void 0!==B)}(U,F),g=[...Q,...I];for(const Q of s?function(B,Q,F){const U=NB(B,B=>Q[B]);return void 0===F&&U.size>1+B.length>>1&&GG("Warning: the implicit z channel has high cardinality. This may occur when the fill or stroke channel is associated with quantitative data rather than ordinal or categorical data. You can suppress this warning by setting the z option explicitly; if this data represents a single series, set z to null."),U.values()}(B,s,t):[B]){let B,F;B:for(const U of Q){for(const B of g)if(!Ya(B[U])){F&&F.push(-1);continue B}if(void 0!==B){F.push(U);for(let Q=0;Q<I.length;++Q){if(Co(I[Q][U])!==B[Q]){yield F,B=I.map(B=>Co(B[U])),F=[U];continue B}}}else F&&(yield F),B=I.map(B=>Co(B[U])),F=[U]}F&&(yield F)}}function Kr(B,Q,F,U){let t;const{clip:s=U.clip}=Q;"frame"===s?(B=mr("svg:g",U).each(function(){this.appendChild(B.node()),B.node=()=>this}),t=Or(U,F)):s&&(t=function(B,Q){let F,U;(F=jr.get(Q))||jr.set(Q,F=new WeakMap);"Sphere"===B.type&&(B=Pr);if(!(U=F.get(B))){const t=wr();YF(Q.ownerSVGElement).append("clipPath").attr("id",t).append("path").attr("d",Q.path()(B)),F.set(B,U=`url(#${t})`)}return U}(s,U)),Bx(B,"aria-label",Q.ariaLabel),Bx(B,"aria-description",Q.ariaDescription),Bx(B,"aria-hidden",Q.ariaHidden),Bx(B,"clip-path",t)}const Or=function(B){const Q=new WeakMap;return(F,U)=>{let t=Q.get(F);if(!t){const s=wr();YF(F.ownerSVGElement).append("clipPath").attr("id",s).call(B,F,U),Q.set(F,t=`url(#${s})`)}return t}}((B,Q,F)=>{const{width:U,height:t,marginLeft:s,marginRight:I,marginTop:g,marginBottom:i}=F;B.append("rect").attr("x",s).attr("y",g).attr("width",U-I-s).attr("height",t-g-i)}),jr=new WeakMap,Pr={type:"Sphere"};function _r(B,Q,F,U){Kr(B,Q,F,U),Bx(B,"class",Q.className),Bx(B,"fill",Q.fill),Bx(B,"fill-opacity",Q.fillOpacity),Bx(B,"stroke",Q.stroke),Bx(B,"stroke-width",Q.strokeWidth),Bx(B,"stroke-opacity",Q.strokeOpacity),Bx(B,"stroke-linejoin",Q.strokeLinejoin),Bx(B,"stroke-linecap",Q.strokeLinecap),Bx(B,"stroke-miterlimit",Q.strokeMiterlimit),Bx(B,"stroke-dasharray",Q.strokeDasharray),Bx(B,"stroke-dashoffset",Q.strokeDashoffset),Bx(B,"shape-rendering",Q.shapeRendering),Bx(B,"filter",Q.imageFilter),Bx(B,"paint-order",Q.paintOrder);const{pointerEvents:t=(!1===U.pointerSticky?"none":void 0)}=Q;Bx(B,"pointer-events",t)}function $r(B,Q){!function(B,Q,F){null!=F&&B.style(Q,F)}(B,"mix-blend-mode",Q.mixBlendMode),Bx(B,"opacity",Q.opacity)}function qr(B,Q,F){B.each(function(B){const U=Q(B);if(null!=U){const B=this.ownerDocument.createElementNS(ZQ.svg,"a");B.setAttribute("fill","inherit"),B.setAttributeNS(ZQ.xlink,"href",U),null!=F&&B.setAttribute("target",F),this.parentNode.insertBefore(B,this).appendChild(this)}})}function Bx(B,Q,F){null!=F&&B.attr(Q,F)}function Qx(B,Q,{x:F,y:U},t=fr,s=fr){t+=Q.dx,s+=Q.dy,F?.bandwidth&&(t+=F.bandwidth()/2),U?.bandwidth&&(s+=U.bandwidth()/2),(t||s)&&B.attr("transform",`translate(${t},${s})`)}function Fx(B,Q){if((B=fb(B))!==Q)return B}function Ux(B,Q){if((B=Yb(B))!==Q)return B}const tx=/^-?([_a-z]|[\240-\377]|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])([_a-z0-9-]|[\240-\377]|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])*$/i;function sx(B){if(void 0===B)return"plot-d6a7b5";if(B=`${B}`,!tx.test(B))throw new Error(`invalid class name: ${B}`);return B}function Ix(B,Q){if("string"==typeof Q)B.property("style",Q);else if(null!=Q)for(const F of B)Object.assign(F.style,Q)}function gx({frameAnchor:B},{width:Q,height:F,marginTop:U,marginRight:t,marginBottom:s,marginLeft:I}){return[/left$/.test(B)?I:/right$/.test(B)?Q-t:(I+Q-t)/2,/^top/.test(B)?U:/^bottom/.test(B)?F-s:(U+F-s)/2]}class ix{constructor(B,Q={},F={},U){const{facet:t="auto",facetAnchor:s,fx:I,fy:g,sort:i,dx:l=0,dy:c=0,margin:e=0,marginTop:n=e,marginRight:d=e,marginBottom:C=e,marginLeft:a=e,className:b,clip:o=U?.clip,channels:u,tip:G,render:r}=F;if(this.data=B,this.sort=Io(i)?i:null,this.initializer=tu(F).initializer,this.transform=this.initializer?F.transform:Uu(F).transform,null===t||!1===t?this.facet=null:(this.facet=Pb(!0===t?"include":t,"facet",["auto","include","exclude","super"]),this.fx=B===Nb&&"string"==typeof I?[I]:I,this.fy=B===Nb&&"string"==typeof g?[g]:g),this.facetAnchor=function(B){if(null==B)return null;const Q=Ir.get(`${B}`.toLowerCase());if(Q)return Q;throw new Error(`invalid facet anchor: ${B}`)}(s),Q=Yo(Q),void 0!==u&&(Q={...ex(u),...Q}),void 0!==U&&(Q={...vr(this,F,U),...Q}),this.channels=Object.fromEntries(Object.entries(Q).map(([Q,F])=>{if(so(F.value)){const{value:B,label:Q=F.label,scale:U=F.scale}=F.value;F={...F,label:Q,scale:U,value:B}}if(B===Nb&&"string"==typeof F.value){const{value:B}=F;F={...F,value:[B]}}return[Q,F]}).filter(([B,{value:Q,optional:F}])=>{if(null!=Q)return!0;if(F)return!1;throw new Error(`missing channel value: ${B}`)})),this.dx=+l,this.dy=+c,this.marginTop=+n,this.marginRight=+d,this.marginBottom=+C,this.marginLeft=+a,this.clip=wo(o),this.tip=function(B){return!0===B?"xy":!1===B||null==B?null:"string"==typeof B?Pb(B,"tip",["x","y","xy"]):B}(G),this.className=fb(b),"super"===this.facet){if(I||g)throw new Error("super-faceting cannot use fx or fy");for(const B in this.channels){const{scale:F}=Q[B];if("x"===F||"y"===F)throw new Error("super-faceting cannot use x or y")}}null!=r&&(this.render=cx(r,this.render))}initialize(B,Q,F){let U=_b(this.data);void 0===B&&null!=U&&(B=[co(U)]);const t=B;null!=this.transform&&(({facets:B,data:U}=this.transform(U,B,F)),U=_b(U)),void 0!==B&&(B.original=t);const s=function(B,Q){return Object.fromEntries(Object.entries(B).map(([B,F])=>[B,mu(Q,F,B)]))}(this.channels,U);return null!=this.sort&&function(B,Q,F,U,t){const{order:s,reverse:I,reduce:g=!0,limit:i}=t;for(const l in t){if(!Po.has(l))continue;let{value:c,order:e=s,reverse:n=I,reduce:d=g,limit:C=i}=ho(t[l]);const a=c?.startsWith("-");if(a&&(c=c.slice(1)),e=void 0===e?a!==("width"===c||"height"===c)?fu:Du:Hu(e),null==d||!1===d)continue;const b="fx"===l||"fy"===l?Xu(Q,U[l]):Nu(F,l);if(!b)throw new Error(`missing channel for scale: ${l}`);const o=b.value,[u=0,G=1/0]=Ro(C)?C:C<0?[C]:[0,C];if(null==c)b.domain=()=>{let B=Array.from(new yB(o));return n&&(B=B.reverse()),0===u&&G===1/0||(B=B.slice(u,G)),B};else{const Q="data"===c?B:"height"===c?pu(F,"y1","y2"):"width"===c?pu(F,"x1","x2"):Wu(F,c,"y"===c?"y2":"x"===c?"x2":void 0),U=ou(!0===d?"max":d,Q);b.domain=()=>{let B=pB(co(o),B=>U.reduceIndex(B,Q),B=>o[B]);return e&&B.sort(e),n&&B.reverse(),0===u&&G===1/0||(B=B.slice(u,G)),B.map(wb)}}}}(U,B,s,Q,this.sort),{data:U,facets:B,channels:s}}filter(B,Q,F){for(const U in Q){const{filter:t=Ya}=Q[U];if(null!==t){const Q=F[U];B=B.filter(B=>t(Q[B]))}}return B}project(B,Q,F){for(const U in B)if("x"===B[U].scale&&/^x|x$/.test(U)){const t=U.replace(/^x|x$/,"y");t in B&&"y"===B[t].scale&&yr(U,t,Q,F.projection)}}scale(B,Q,F){const U=function(B,Q){const F=Object.fromEntries(Object.entries(B).map(([B,{scale:F,value:U}])=>{const t=null==F?null:Q[F];return[B,null==t?U:Bo(U,t)]}));return F.channels=B,F}(B,Q);return F.projection&&this.project(B,U,F),U}}function lx(...B){return B.plot=ix.prototype.plot,B}function cx(B,Q){if(null==B)return null===Q?void 0:Q;if(null==Q)return null===B?void 0:B;if("function"!=typeof B)throw new TypeError(`invalid render transform: ${B}`);if("function"!=typeof Q)throw new TypeError(`invalid render transform: ${Q}`);return function(F,U,t,s,I,g){return B.call(this,F,U,t,s,I,(B,F,U,t,s)=>Q.call(this,B,F,U,t,s,g))}}function ex(B){return Object.fromEntries(Object.entries(Yo(B)).map(([B,Q])=>(void 0===(Q="string"==typeof Q?{value:Q,label:B}:ho(Q)).filter&&null==Q.scale&&(Q={...Q,filter:null}),[B,Q])))}function nx(B,Q){return!0===B?.tip?{...B,tip:Q}:Uo(B?.tip)&&void 0===B.tip.pointer?{...B,tip:{...B.tip,pointer:Q}}:B}function dx({x:B,y:Q,fy:F,fx:U},{projection:t,aspectRatio:s},{width:I,marginTopDefault:g,marginRightDefault:i,marginBottomDefault:l,marginLeftDefault:c}){const e=F&&F.scale.domain().length||1,n=function(B){if("function"==typeof B?.stream)return Gr;if(Uo(B)){let Q,F;if(({domain:Q,type:B,...F}=B),null!=Q&&null!=B){const U="string"==typeof B?xr(B).type:B,[[t,s],[I,g]]=gi(U({...F,width:100,height:100})).bounds(Q),i=(g-s)/(I-t);return i&&isFinite(i)?i<.2?.2:i>5?5:i:Gr}}if(null!=B){if("function"!=typeof B){const{aspectRatio:Q}=xr(B);if(Q)return Q}return Gr}}(t);if(n){const B=(1.1*e-.1)/(1.1*(U?U.scale.domain().length:1)-.1)*n,Q=Math.max(.1,Math.min(10,B));return Math.round((I-c-i)*Q+g+l)}const d=Q?_G(Q)?Q.scale.domain().length||1:Math.max(7,17/e):1;if(null!=s){if(s=+s,!(isFinite(s)&&s>0))throw new Error(`invalid aspectRatio: ${s}`);const t=Cx("y",Q)/(Cx("x",B)*s),e=U?U.scale.bandwidth():1,n=F?F.scale.bandwidth():1;return(t*(e*(I-c-i)-B.insetLeft-B.insetRight)+Q.insetTop+Q.insetBottom)/n+g+l}return!(!Q&&!F)*Math.max(1,Math.min(60,d*e))*20+30*!!U+60}function Cx(B,Q){if(!Q)throw new Error(`aspectRatio requires ${B} scale`);const{type:F,domain:U}=Q;let t;switch(F){case"linear":case"utc":case"time":t=Number;break;case"pow":{const B=Q.scale.exponent();t=Q=>Math.pow(Q,B);break}case"log":t=Math.log;break;case"point":case"band":return U.length;default:throw new Error(`unsupported ${B} scale for aspectRatio: ${F}`)}const[s,I]=LB(U);return Math.abs(t(I)-t(s))}const ax=new WeakMap;function bx(B,Q,{x:F,y:U,px:t,py:s,maxRadius:I=40,channels:g,render:i,...l}={}){return I=+I,null!=t&&(F??=null,g={...g,px:{value:t,scale:"x"}}),null!=s&&(U??=null,g={...g,py:{value:s,scale:"y"}}),{x:F,y:U,channels:g,...l,render:cx(function(F,U,t,s,g,i){const l=(g={...g,pointerSticky:!1}).ownerSVGElement,{data:c}=g.getMarkState(this);let e=ax.get(l);e||ax.set(l,e={sticky:!1,roots:[],renders:[]});let n=e.renders.push(N)-1;const{x:d,y:C,fx:a,fy:b}=U;let o=a?a(F.fx)-s.marginLeft:0,u=b?b(F.fy)-s.marginTop:0;d?.bandwidth&&(o+=d.bandwidth()/2),C?.bandwidth&&(u+=C.bandwidth()/2);const G=null!=F.fi;let r;if(G){let B=e.facetStates;B||(e.facetStates=B=new Map),r=B.get(this),r||B.set(this,r=new Map)}const[x,A]=gx(this,s),{px:L,py:h}=t,R=L?B=>L[B]:rx(t,x),y=h?B=>h[B]:xx(t,A);let V,Z,S,m;function E(B,Q){if(G){if(m&&(m=cancelAnimationFrame(m)),null!=B)return r.set(F.fi,Q),void(m=requestAnimationFrame(()=>{m=null;for(const[U,t]of r)if(t<Q||t===Q&&U<F.fi){B=null;break}N(B)}));r.delete(F.fi)}N(B)}function N(B){if(V===B&&S===e.sticky)return;V=B,S=g.pointerSticky=e.sticky;const Q=null==V?[]:[V];G&&(Q.fx=F.fx,Q.fy=F.fy,Q.fi=F.fi);const I=i(Q,U,t,s,g);if(Z){if(G){const B=Z.parentNode,Q=Z.getAttribute("transform"),F=I.getAttribute("transform");Q?I.setAttribute("transform",Q):I.removeAttribute("transform"),F?B.setAttribute("transform",F):B.removeAttribute("transform"),I.removeAttribute("aria-label"),I.removeAttribute("aria-description"),I.removeAttribute("aria-hidden")}Z.replaceWith(I)}if(e.roots[n]=Z=I,!(null==V&&r?.size>1)){const B=null==V?null:Lb(c)?c[V]:c.get(V);g.dispatchValue(B)}return I}function X(U){if(e.sticky||"mouse"===U.pointerType&&1===U.buttons)return;let[t,g]=wF(U);t-=o,g-=u;const i=t<s.marginLeft||t>s.width-s.marginRight?1:B,l=g<s.marginTop||g>s.height-s.marginBottom?1:Q;let c=null,n=I*I;for(const B of F){const Q=i*(R(B)-t),F=l*(y(B)-g),U=Q*Q+F*F;U<=n&&(c=B,n=U)}if(null!=c&&(1!==B||1!==Q)){const B=R(c)-t,Q=y(c)-g;n=B*B+Q*Q}E(c,n)}return l.addEventListener("pointerenter",X),l.addEventListener("pointermove",X),l.addEventListener("pointerdown",function(B){"mouse"===B.pointerType&&null!=V&&(e.sticky&&e.roots.some(Q=>Q?.contains(B.target))||(e.sticky?(e.sticky=!1,e.renders.forEach(B=>B(null))):(e.sticky=!0,N(V)),B.stopImmediatePropagation()))}),l.addEventListener("pointerleave",function(B){"mouse"===B.pointerType&&(e.sticky||E(null))}),N(null)},i)}}function ox(B){return bx(1,1,B)}function ux(B){return bx(1,.01,B)}function Gx(B){return bx(.01,1,B)}function rx({x1:B,x2:Q,x:F=B},U){return B&&Q?F=>(B[F]+Q[F])/2:F?B=>F[B]:()=>U}function xx({y1:B,y2:Q,y:F=B},U){return B&&Q?F=>(B[F]+Q[F])/2:F?B=>F[B]:()=>U}function Ax(B){return _G(B)&&void 0===B.interval?void 0:"tabular-nums"}const Lx=Math.PI/180;function hx(B,{marker:Q,markerStart:F=Q,markerMid:U=Q,markerEnd:t=Q}={}){B.markerStart=Rx(F),B.markerMid=Rx(U),B.markerEnd=Rx(t)}function Rx(B){if(null==B||!1===B)return null;if(!0===B)return Zx;if("function"==typeof B)return B;switch(`${B}`.toLowerCase()){case"none":return null;case"arrow":return yx("auto");case"arrow-reverse":return yx("auto-start-reverse");case"dot":return Vx;case"circle":case"circle-fill":return Zx;case"circle-stroke":return Sx;case"tick":return mx("auto");case"tick-x":return mx(90);case"tick-y":return mx(0)}throw new Error(`invalid marker: ${B}`)}function yx(B){return(Q,F)=>mr("svg:marker",F).attr("viewBox","-5 -5 10 10").attr("markerWidth",6.67).attr("markerHeight",6.67).attr("orient",B).attr("fill","none").attr("stroke",Q).attr("stroke-width",1.5).attr("stroke-linecap","round").attr("stroke-linejoin","round").call(B=>B.append("path").attr("d","M-1.5,-3l3,3l-3,3")).node()}function Vx(B,Q){return mr("svg:marker",Q).attr("viewBox","-5 -5 10 10").attr("markerWidth",6.67).attr("markerHeight",6.67).attr("fill",B).attr("stroke","none").call(B=>B.append("circle").attr("r",2.5)).node()}function Zx(B,Q){return mr("svg:marker",Q).attr("viewBox","-5 -5 10 10").attr("markerWidth",6.67).attr("markerHeight",6.67).attr("fill",B).attr("stroke","var(--plot-background)").attr("stroke-width",1.5).call(B=>B.append("circle").attr("r",3)).node()}function Sx(B,Q){return mr("svg:marker",Q).attr("viewBox","-5 -5 10 10").attr("markerWidth",6.67).attr("markerHeight",6.67).attr("fill","var(--plot-background)").attr("stroke",B).attr("stroke-width",1.5).call(B=>B.append("circle").attr("r",3)).node()}function mx(B){return(Q,F)=>mr("svg:marker",F).attr("viewBox","-3 -3 6 6").attr("markerWidth",6).attr("markerHeight",6).attr("orient",B).attr("stroke",Q).call(B=>B.append("path").attr("d","M0,-3v6")).node()}let Ex=0;function Nx(B,Q,{stroke:F},U){return Hx(B,Q,F&&(B=>F[B]),null,U)}function Xx(B,Q,{stroke:F,z:U},t){return Hx(B,Q,F&&(([B])=>F[B]),U,t)}const px=1,Wx=2;function Hx(B,{markerStart:Q,markerMid:F,markerEnd:U,stroke:t},s=()=>t,I,g){if(!Q&&!F&&!U)return;const i=new Map,l=I&&function(B,Q){const F=new Uint8Array(Q.length),U=B.data().filter(B=>B.length>1),t=U.length;for(let B=0,s=Er;B<t;++B){const t=U[B];if(t.length>1){const B=t[0];s!==(s=Co(Q[B]))&&(F[B]|=px)}}for(let B=t-1,s=Er;B>=0;--B){const t=U[B];if(t.length>1){const B=t[0];s!==(s=Co(Q[B]))&&(F[B]|=Wx)}}return([B])=>F[B]}(B,I);function c(B,Q,F){return function(U){if(F&&!F(U))return;const t=s(U);let I=i.get(Q);I||i.set(Q,I=new Map);let l=I.get(t);if(!l){const B=this.parentNode.insertBefore(Q(t,g),this),F="plot-marker-"+ ++Ex;B.setAttribute("id",F),I.set(t,l=`url(#${F})`)}this.setAttribute(B,l)}}Q&&B.each(c("marker-start",Q,l&&(B=>l(B)&px))),F&&l&&B.each(c("marker-start",F,B=>!(l(B)&px))),F&&B.each(c("marker-mid",F)),U&&B.each(c("marker-end",U,l&&(B=>l(B)&Wx)))}function Dx({inset:B,insetLeft:Q,insetRight:F,...U}={}){return[Q,F]=Yx(B,Q,F),{inset:B,insetLeft:Q,insetRight:F,...U}}function fx({inset:B,insetTop:Q,insetBottom:F,...U}={}){return[Q,F]=Yx(B,Q,F),{inset:B,insetTop:Q,insetBottom:F,...U}}function Yx(B,Q,F){return void 0===B&&void 0===Q&&void 0===F?fr?[1,0]:[.5,.5]:[Q,F]}function wx(B,{interval:Q}){return(B={...ho(B)}).interval=xo(void 0===B.interval?Q:B.interval),B}function vx(B,Q,F,U){const{[B]:t,[`${B}1`]:s,[`${B}2`]:I}=F,{value:g,interval:i}=wx(t,F);if(null==g||null==i&&!U)return F;const l=oo(t);if(null==i){let Q;const t={transform:B=>Q||(Q=Vb(B,g)),label:l};return{...F,[B]:void 0,[`${B}1`]:void 0===s?t:s,[`${B}2`]:void 0!==I||s===I&&U?I:t}}let c,e;function n(B){return void 0!==e&&B===c?e:e=Bo(Vb(c=B,g),B=>i.floor(B))}return Q({...F,[B]:void 0,[`${B}1`]:void 0===s?{transform:n,label:l}:s,[`${B}2`]:void 0===I?{transform:B=>n(B).map(B=>i.offset(B)),label:l}:I})}function Jx(B,Q,F){const{[B]:U}=F,{value:t,interval:s}=wx(U,F);return null==t||null==s?F:Q({...F,[B]:{label:oo(U),transform:B=>{const Q=Bo(Vb(B,t),B=>s.floor(B)),F=Q.map(B=>s.offset(B));return Q.map(Zo(Q)?(B,Q)=>null==B||isNaN(B=+B)||null==(Q=F[Q])||isNaN(Q=+Q)?void 0:new Date((B+Q)/2):(B,Q)=>null==B||null==(Q=F[Q])?NaN:(+B+ +Q)/2)}}})}const kx={ariaLabel:"rule",fill:null,stroke:"currentColor"};class Mx extends ix{constructor(B,Q={}){const{x:F,y1:U,y2:t,inset:s=0,insetTop:I=s,insetBottom:g=s}=Q;super(B,{x:{value:F,scale:"x",optional:!0},y1:{value:U,scale:"y",optional:!0},y2:{value:t,scale:"y",optional:!0}},nx(Q,"x"),kx),this.insetTop=Yb(I),this.insetBottom=Yb(g),hx(this,Q)}render(B,Q,F,U,t){const{x:s,y:I}=Q,{x:g,y1:i,y2:l}=F,{width:c,height:e,marginTop:n,marginRight:d,marginLeft:C,marginBottom:a}=U,{insetTop:b,insetBottom:o}=this;return mr("svg:g",t).call(_r,this,U,t).call(Qx,this,{x:g&&s},fr,0).call(Q=>Q.selectAll().data(B).enter().append("line").call($r,this).attr("x1",g?B=>g[B]:(C+c-d)/2).attr("x2",g?B=>g[B]:(C+c-d)/2).attr("y1",i&&!qG(I)?B=>i[B]+b:n+b).attr("y2",l&&!qG(I)?I.bandwidth?B=>l[B]+I.bandwidth()-o:B=>l[B]-o:e-a-o).call(Mr,this,F).call(Nx,this,F,t)).node()}}class Tx extends ix{constructor(B,Q={}){const{x1:F,x2:U,y:t,inset:s=0,insetRight:I=s,insetLeft:g=s}=Q;super(B,{y:{value:t,scale:"y",optional:!0},x1:{value:F,scale:"x",optional:!0},x2:{value:U,scale:"x",optional:!0}},nx(Q,"y"),kx),this.insetRight=Yb(I),this.insetLeft=Yb(g),hx(this,Q)}render(B,Q,F,U,t){const{x:s,y:I}=Q,{y:g,x1:i,x2:l}=F,{width:c,height:e,marginTop:n,marginRight:d,marginLeft:C,marginBottom:a}=U,{insetLeft:b,insetRight:o}=this;return mr("svg:g",t).call(_r,this,U,t).call(Qx,this,{y:g&&I},0,fr).call(Q=>Q.selectAll().data(B).enter().append("line").call($r,this).attr("x1",i&&!qG(s)?B=>i[B]+b:C+b).attr("x2",l&&!qG(s)?s.bandwidth?B=>l[B]+s.bandwidth()-o:B=>l[B]-o:c-d-o).attr("y1",g?B=>g[B]:(n+e-a)/2).attr("y2",g?B=>g[B]:(n+e-a)/2).call(Mr,this,F).call(Nx,this,F,t)).node()}}function zx(B,Q){let{x:F=Wb,y:U,y1:t,y2:s,...I}=function(B={}){return vx("y",fx,B)}(Q);return[t,s]=Ox(U,t,s),new Mx(B,{...I,x:F,y1:t,y2:s})}function Kx(B,Q){let{y:F=Wb,x:U,x1:t,x2:s,...I}=function(B={}){return vx("x",Dx,B)}(Q);return[t,s]=Ox(U,t,s),new Tx(B,{...I,y:F,x1:t,x2:s})}function Ox(B,Q,F){if(null==B){if(void 0===Q){if(void 0!==F)return[0,F]}else if(void 0===F)return[0,Q]}else{if(void 0===Q)return void 0===F?[0,B]:[B,F];if(void 0===F)return[B,Q]}return[Q,F]}function jx(B,...Q){let F=Q.length;for(let U=0,t=!0;U<F;++U)"function"!=typeof Q[U]&&(t&&(B=B.slice(),t=!1),B.splice(U,2,B[U]+Q[U]+B[U+1]),Q.splice(U,1),--U,--F);return U=>{let t=B[0];for(let s=0;s<F;++s)t+=Q[s](U)+B[s+1];return t}}const Px={ariaLabel:"text",strokeLinejoin:"round",strokeWidth:3,paintOrder:"stroke"};class _x extends ix{constructor(B,Q={}){const{x:F,y:U,text:t=(Ro(B)&&yo(B)?Wb:pb),frameAnchor:s,textAnchor:I=(/right$/i.test(s)?"end":/left$/i.test(s)?"start":"middle"),lineAnchor:g=(/^top/i.test(s)?"top":/^bottom/i.test(s)?"bottom":"middle"),lineHeight:i=1,lineWidth:l=1/0,textOverflow:c,monospace:e,fontFamily:n=(e?"ui-monospace, monospace":void 0),fontSize:d,fontStyle:C,fontVariant:a,fontWeight:b,rotate:o}=Q,[u,G]=Ob(o,0),[r,x]=function(B){return null==B||"number"==typeof B?[void 0,B]:"string"!=typeof B?[B,void 0]:(B=B.trim().toLowerCase(),tA.has(B)||/^[+-]?\d*\.?\d+(e[+-]?\d+)?(\w*|%)$/.test(B)?[void 0,B]:[B,void 0])}(d);var A;if(super(B,{x:{value:F,scale:"x",optional:!0},y:{value:U,scale:"y",optional:!0},fontSize:{value:r,optional:!0},rotate:{value:(A=u,null==A?null:{transform:B=>Vb(B,A,Float64Array),label:oo(A)}),optional:!0},text:{value:t,filter:Ja,optional:!0}},Q,Px),this.rotate=G,this.textAnchor=Fx(I,"middle"),this.lineAnchor=Pb(g,"lineAnchor",["top","middle","bottom"]),this.lineHeight=+i,this.lineWidth=+l,this.textOverflow=$x(c),this.monospace=!!e,this.fontFamily=fb(n),this.fontSize=x,this.fontStyle=fb(C),this.fontVariant=fb(a),this.fontWeight=fb(b),this.frameAnchor=fo(s),!(this.lineWidth>=0))throw new Error(`invalid lineWidth: ${l}`);this.splitLines=lA(this),this.clipLine=cA(this)}render(B,Q,F,U,t){const{x:s,y:I}=Q,{x:g,y:i,rotate:l,text:c,title:e,fontSize:n}=F,{rotate:d}=this,[C,a]=gx(this,U);return mr("svg:g",t).call(_r,this,U,t).call(UA,this,c,U).call(Qx,this,{x:g&&s,y:i&&I}).call(Q=>Q.selectAll().data(B).enter().append("text").call($r,this).call(qx,this,c,e).attr("transform",jx`translate(${g?B=>g[B]:C},${i?B=>i[B]:a})${l?B=>` rotate(${l[B]})`:d?` rotate(${d})`:""}`).call(Bx,"font-size",n&&(B=>n[B])).call(Mr,this,F)).node()}}function $x(B){return null==B?null:Pb(B,"textOverflow",["clip","ellipsis","clip-start","clip-end","ellipsis-start","ellipsis-middle","ellipsis-end"]).replace(/^(clip|ellipsis)$/,"$1-end")}function qx(B,Q,F,U){if(!F)return;const{lineAnchor:t,lineHeight:s,textOverflow:I,splitLines:g,clipLine:i}=Q;B.each(function(B){const Q=g(Dr(F[B])??"").map(i),l=Q.length,c="top"===t?.71:"bottom"===t?1-l:(164-100*l)/200;if(l>1){let B=0;for(let F=0;F<l;++F){if(++B,!Q[F])continue;const U=this.ownerDocument.createElementNS(ZQ.svg,"tspan");U.setAttribute("x",0),F===B-1?U.setAttribute("y",(c+F)*s+"em"):U.setAttribute("dy",B*s+"em"),U.textContent=Q[F],this.appendChild(U),B=0}}else c&&this.setAttribute("y",c*s+"em"),this.textContent=Q[0];if(I&&!U&&Q[0]!==F[B]){const Q=this.ownerDocument.createElementNS(ZQ.svg,"title");Q.textContent=F[B],this.appendChild(Q)}})}function BA(B,{x:Q,y:F,...U}={}){return void 0===U.frameAnchor&&([Q,F]=go(Q,F)),new _x(B,{...U,x:Q,y:F})}function QA(B,{x:Q=Wb,...F}={}){return new _x(B,function(B={}){return Jx("y",fx,B)}({...F,x:Q}))}function FA(B,{y:Q=Wb,...F}={}){return new _x(B,function(B={}){return Jx("x",Dx,B)}({...F,y:Q}))}function UA(B,Q,F){Bx(B,"text-anchor",Q.textAnchor),Bx(B,"font-family",Q.fontFamily),Bx(B,"font-size",Q.fontSize),Bx(B,"font-style",Q.fontStyle),Bx(B,"font-variant",void 0===Q.fontVariant?function(B){return B&&(function(B){for(const Q of B)if(null!=Q)return"number"==typeof Q}(B)||Zo(B))?"tabular-nums":void 0}(F):Q.fontVariant),Bx(B,"font-weight",Q.fontWeight)}const tA=new Set(["inherit","initial","revert","unset","xx-small","x-small","small","medium","large","x-large","xx-large","xxx-large","larger","smaller"]);function sA(B,Q,F){const U=[];let t,s=0;for(const[I,g,i]of function*(B){let Q=0,F=0;const U=B.length;for(;F<U;){let U=1;switch(B[F]){case"­":case"-":++F,yield[Q,F,!1],Q=F;break;case" ":for(yield[Q,F,!1];" "===B[++F];);Q=F;break;case"\r":"\n"===B[F+1]&&++U;case"\n":yield[Q,F,!0],F+=U,Q=F;break;default:++F}}yield[Q,F,!0]}(B))void 0===t&&(t=I),s>t&&F(B,t,g)>Q&&(U.push(B.slice(t,s)+("­"===B[s-1]?"-":"")),t=I),i?(U.push(B.slice(t,g)),t=void 0):s=g;return U}const IA={a:56,b:63,c:57,d:63,e:58,f:37,g:62,h:60,i:26,j:26,k:55,l:26,m:88,n:60,o:60,p:62,q:62,r:39,s:54,t:38,u:60,v:55,w:79,x:54,y:55,z:55,A:69,B:67,C:73,D:74,E:61,F:58,G:76,H:75,I:28,J:55,K:67,L:58,M:89,N:75,O:78,P:65,Q:78,R:67,S:65,T:65,U:75,V:69,W:98,X:69,Y:67,Z:67,0:64,1:48,2:62,3:64,4:66,5:63,6:65,7:58,8:65,9:65," ":29,"!":32,'"':49,"'":31,"(":39,")":39,",":31,"-":48,".":31,"/":32,":":31,";":31,"?":52,"‘":31,"’":31,"“":47,"”":47,"…":82};function gA(B,Q=0,F=B.length){let U=0;for(let t=Q;t<F;t=oA(B,t))U+=IA[B[t]]??(GA(B,t)?120:IA.e);return U}function iA(B,Q=0,F=B.length){let U=0;for(let t=Q;t<F;t=oA(B,t))U+=GA(B,t)?126:63;return U}function lA({monospace:B,lineWidth:Q,textOverflow:F}){if(null!=F||Q==1/0)return B=>B.split(/\r\n?|\n/g);const U=B?iA:gA,t=100*Q;return B=>sA(B,t,U)}function cA({monospace:B,lineWidth:Q,textOverflow:F}){if(null==F||Q==1/0)return B=>B;const U=B?iA:gA,t=100*Q;switch(F){case"clip-start":return B=>CA(B,t,U,"");case"clip-end":return B=>dA(B,t,U,"");case"ellipsis-start":return B=>CA(B,t,U,eA);case"ellipsis-middle":return B=>function(B,Q,F,U){B=B.trim();const t=F(B);if(t<=Q)return B;const s=F(U)/2,[I,g]=nA(B,Q/2,F,s),[i]=nA(B,t-Q/2-g+s,F,-s);return i<0?U:B.slice(0,I).trimEnd()+U+B.slice(oA(B,i)).trimStart()}(B,t,U,eA);case"ellipsis-end":return B=>dA(B,t,U,eA)}}const eA="…";function nA(B,Q,F,U){const t=[];let s=0;for(let I=0,g=0,i=B.length;I<i;I=g){g=oA(B,I);const i=F(B,I,g);if(s+i>Q){for(s+=U;s>Q&&I>0;)g=I,I=t.pop(),s-=F(B,I,g);return[I,Q-s]}s+=i,t.push(I)}return[-1,0]}function dA(B,Q,F,U){B=B.trim();const t=F(U),[s]=nA(B,Q,F,t);return s<0?B:B.slice(0,s).trimEnd()+U}function CA(B,Q,F,U){const t=F(B=B.trim());if(t<=Q)return B;const s=F(U),[I]=nA(B,t-Q+s,F,-s);return I<0?U:U+B.slice(oA(B,I)).trimStart()}const aA=/[\p{Combining_Mark}\p{Emoji_Modifier}]+/uy,bA=/\p{Extended_Pictographic}/uy;function oA(B,Q){return Q+=function(B,Q){const F=B.charCodeAt(Q);if(F>=55296&&F<56320){const F=B.charCodeAt(Q+1);return F>=56320&&F<57344}return!1}(B,Q)?2:1,function(B,Q){return!uA(B,Q)&&(aA.lastIndex=Q,aA.test(B))}(B,Q)&&(Q=aA.lastIndex),function(B,Q){return 8205===B.charCodeAt(Q)}(B,Q)?oA(B,Q+1):Q}function uA(B,Q){return B.charCodeAt(Q)<128}function GA(B,Q){return!uA(B,Q)&&(bA.lastIndex=Q,bA.test(B))}const rA={ariaLabel:"vector",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinejoin:"round",strokeLinecap:"round"},xA=3.5,AA=5*xA,LA={draw(B,Q,F){const U=Q*F/AA;B.moveTo(0,0),B.lineTo(0,-Q),B.moveTo(-U,U-Q),B.lineTo(0,-Q),B.lineTo(U,U-Q)}},hA={draw(B,Q,F){B.moveTo(-F,0),B.lineTo(0,-Q),B.lineTo(F,0)}},RA=new Map([["arrow",LA],["spike",hA]]);class yA extends ix{constructor(B,Q={}){const{x:F,y:U,r:t=xA,length:s,rotate:I,shape:g=LA,anchor:i="middle",frameAnchor:l}=Q,[c,e]=Ob(s,12),[n,d]=Ob(I,0);super(B,{x:{value:F,scale:"x",optional:!0},y:{value:U,scale:"y",optional:!0},length:{value:c,scale:"length",optional:!0},rotate:{value:n,optional:!0}},Q,rA),this.r=+t,this.length=e,this.rotate=d,this.shape=function(B){if(function(B){return B&&"function"==typeof B.draw}(B))return B;const Q=RA.get(`${B}`.toLowerCase());if(Q)return Q;throw new Error(`invalid shape: ${B}`)}(g),this.anchor=Pb(i,"anchor",["start","middle","end"]),this.frameAnchor=fo(l)}render(B,Q,F,U,t){const{x:s,y:I}=Q,{x:g,y:i,length:l,rotate:c}=F,{length:e,rotate:n,anchor:d,shape:C,r:a}=this,[b,o]=gx(this,U);return mr("svg:g",t).call(_r,this,U,t).call(Qx,this,{x:g&&s,y:i&&I}).call(Q=>Q.selectAll().data(B).enter().append("path").call($r,this).attr("transform",jx`translate(${g?B=>g[B]:b},${i?B=>i[B]:o})${c?B=>` rotate(${c[B]})`:n?` rotate(${n})`:""}${"start"===d?"":"end"===d?l?B=>` translate(0,${l[B]})`:` translate(0,${e})`:l?B=>` translate(0,${l[B]/2})`:` translate(0,${e/2})`}`).attr("d",l?B=>{const Q=Js();return C.draw(Q,l[B],a),Q}:(()=>{const B=Js();return C.draw(B,e,a),B})()).call(Mr,this,F)).node()}}function VA(B,Q={}){const{x:F=Wb,...U}=Q;return new yA(B,{...U,x:F})}function ZA(B,Q={}){const{y:F=Wb,...U}=Q;return new yA(B,{...U,y:F})}function SA(B,Q){return arguments.length<2&&!Ro(B)&&(Q=B,B=null),void 0===Q&&(Q={}),[B,Q]}function mA({anchor:B}={},Q){return void 0===B?Q[0]:Pb(B,"anchor",Q)}function EA(B){return mA(B,["left","right"])}function NA(B){return mA(B,["right","left"])}function XA(B){return mA(B,["bottom","top"])}function pA(B){return mA(B,["top","bottom"])}function WA(){const[B,Q]=SA(...arguments);return YA("y",EA(Q),B,Q)}function HA(){const[B,Q]=SA(...arguments);return YA("fy",NA(Q),B,Q)}function DA(){const[B,Q]=SA(...arguments);return wA("x",XA(Q),B,Q)}function fA(){const[B,Q]=SA(...arguments);return wA("fx",pA(Q),B,Q)}function YA(B,Q,F,{color:U="currentColor",opacity:t=1,stroke:s=U,strokeOpacity:I=t,strokeWidth:g=1,fill:i=U,fillOpacity:l=t,textAnchor:c,textStroke:e,textStrokeOpacity:n,textStrokeWidth:d,tickSize:C=("y"===B?6:0),tickPadding:a,tickRotate:b,x:o,margin:u,marginTop:G=(void 0===u?20:u),marginRight:r=(void 0===u?"right"===Q?40:0:u),marginBottom:x=(void 0===u?20:u),marginLeft:A=(void 0===u?"left"===Q?40:0:u),label:L,labelAnchor:h,labelArrow:R,labelOffset:y,ariaLabel:V=`${B}-axis`,...Z}){return C=Yb(C),a=Yb(a),b=Yb(b),void 0!==h&&(h=Pb(h,"labelAnchor",["center","top","bottom"])),R=sL(R),lx(C&&!Wo(s)?function(B,Q,F,{strokeWidth:U=1,strokeLinecap:t=null,strokeLinejoin:s=null,facetAnchor:I=Q+("y"===B?"-empty":""),frameAnchor:g=Q,tickSize:i,inset:l=0,insetLeft:c=l,insetRight:e=l,dx:n=0,y:d=("y"===B?void 0:null),ariaLabel:C,...a}){return jA(ZA,B,F,{ariaLabel:`${C} tick`,ariaHidden:!0},{strokeWidth:U,strokeLinecap:t,strokeLinejoin:s,facetAnchor:I,frameAnchor:g,y:d,...a,dx:"left"===Q?+n-fr+ +c:+n+fr-e,anchor:"start",length:i,shape:"left"===Q?QL:FL})}(B,Q,F,{stroke:s,strokeOpacity:I,strokeWidth:g,tickSize:C,tickPadding:a,tickRotate:b,x:o,ariaLabel:V,...Z}):null,Wo(i)?null:function(B,Q,F,{facetAnchor:U=Q+("y"===B?"-empty":""),frameAnchor:t=Q,tickSize:s,tickRotate:I=0,tickPadding:g=Math.max(3,9-s)+(Math.abs(I)>60?4*Math.cos(I*Lx):0),text:i,textAnchor:l=(Math.abs(I)>60?"middle":"left"===Q?"end":"start"),lineAnchor:c=(I>60?"top":I<-60?"bottom":"middle"),fontVariant:e,inset:n=0,insetLeft:d=n,insetRight:C=n,dx:a=0,ariaLabel:b,y:o=("y"===B?void 0:null),...u}){return jA(FA,B,F,{ariaLabel:`${b} tick label`},{facetAnchor:U,frameAnchor:t,text:i,textAnchor:l,lineAnchor:c,fontVariant:e,rotate:I,y:o,...u,dx:"left"===Q?+a-s-g+ +d:+a+ +s+ +g-C},function(B,F,U,t,s){void 0===e&&(this.fontVariant=UL(B)),void 0===i&&(s.text=PA(B,F,U,t,Q))})}(B,Q,F,{fill:i,fillOpacity:l,stroke:e,strokeOpacity:n,strokeWidth:d,textAnchor:c,tickSize:C,tickPadding:a,tickRotate:b,x:o,marginTop:G,marginRight:r,marginBottom:x,marginLeft:A,ariaLabel:V,...Z}),Wo(i)||null===L?null:BA([],OA({fill:i,fillOpacity:l,...Z},function(F,U,t,s,I){const g=s[B],{marginTop:i,marginRight:l,marginBottom:c,marginLeft:e}="y"===B&&I.inset||I,n=h??(g.bandwidth?"center":"top"),d=y??("right"===Q?l:e)-3;return"center"===n?(this.textAnchor=void 0,this.lineAnchor="right"===Q?"bottom":"top",this.frameAnchor=Q,this.rotate=-90):(this.textAnchor="right"===Q?"end":"start",this.lineAnchor=n,this.frameAnchor=`${n}-${Q}`,this.rotate=0),this.dy="top"===n?3-i:"bottom"===n?c-3:0,this.dx="right"===Q?d:-d,this.ariaLabel=`${V} label`,{facets:[[0]],channels:{text:{value:[tL(B,g,{anchor:Q,label:L,labelAnchor:n,labelArrow:R})]}}}})))}function wA(B,Q,F,{color:U="currentColor",opacity:t=1,stroke:s=U,strokeOpacity:I=t,strokeWidth:g=1,fill:i=U,fillOpacity:l=t,textAnchor:c,textStroke:e,textStrokeOpacity:n,textStrokeWidth:d,tickSize:C=("x"===B?6:0),tickPadding:a,tickRotate:b,y:o,margin:u,marginTop:G=(void 0===u?"top"===Q?30:0:u),marginRight:r=(void 0===u?20:u),marginBottom:x=(void 0===u?"bottom"===Q?30:0:u),marginLeft:A=(void 0===u?20:u),label:L,labelAnchor:h,labelArrow:R,labelOffset:y,ariaLabel:V=`${B}-axis`,...Z}){return C=Yb(C),a=Yb(a),b=Yb(b),void 0!==h&&(h=Pb(h,"labelAnchor",["center","left","right"])),R=sL(R),lx(C&&!Wo(s)?function(B,Q,F,{strokeWidth:U=1,strokeLinecap:t=null,strokeLinejoin:s=null,facetAnchor:I=Q+("x"===B?"-empty":""),frameAnchor:g=Q,tickSize:i,inset:l=0,insetTop:c=l,insetBottom:e=l,dy:n=0,x:d=("x"===B?void 0:null),ariaLabel:C,...a}){return jA(VA,B,F,{ariaLabel:`${C} tick`,ariaHidden:!0},{strokeWidth:U,strokeLinejoin:s,strokeLinecap:t,facetAnchor:I,frameAnchor:g,x:d,...a,dy:"bottom"===Q?+n-fr-e:+n+fr+ +c,anchor:"start",length:i,shape:"bottom"===Q?qA:BL})}(B,Q,F,{stroke:s,strokeOpacity:I,strokeWidth:g,tickSize:C,tickPadding:a,tickRotate:b,y:o,ariaLabel:V,...Z}):null,Wo(i)?null:function(B,Q,F,{facetAnchor:U=Q+("x"===B?"-empty":""),frameAnchor:t=Q,tickSize:s,tickRotate:I=0,tickPadding:g=Math.max(3,9-s)+(Math.abs(I)>=10?4*Math.cos(I*Lx):0),text:i,textAnchor:l=(Math.abs(I)>=10?I<0^"bottom"===Q?"start":"end":"middle"),lineAnchor:c=(Math.abs(I)>=10?"middle":"bottom"===Q?"top":"bottom"),fontVariant:e,inset:n=0,insetTop:d=n,insetBottom:C=n,dy:a=0,x:b=("x"===B?void 0:null),ariaLabel:o,...u}){return jA(QA,B,F,{ariaLabel:`${o} tick label`},{facetAnchor:U,frameAnchor:t,text:void 0===i?null:i,textAnchor:l,lineAnchor:c,fontVariant:e,rotate:I,x:b,...u,dy:"bottom"===Q?+a+ +s+ +g-C:+a-s-g+ +d},function(B,F,U,t,s){void 0===e&&(this.fontVariant=UL(B)),void 0===i&&(s.text=PA(B,F,U,t,Q))})}(B,Q,F,{fill:i,fillOpacity:l,stroke:e,strokeOpacity:n,strokeWidth:d,textAnchor:c,tickSize:C,tickPadding:a,tickRotate:b,y:o,marginTop:G,marginRight:r,marginBottom:x,marginLeft:A,ariaLabel:V,...Z}),Wo(i)||null===L?null:BA([],OA({fill:i,fillOpacity:l,...Z},function(F,U,t,s,I){const g=s[B],{marginTop:i,marginRight:l,marginBottom:c,marginLeft:e}="x"===B&&I.inset||I,n=h??(g.bandwidth?"center":"right"),d=y??("top"===Q?i:c)-3;return"center"===n?(this.frameAnchor=Q,this.textAnchor=void 0):(this.frameAnchor=`${Q}-${n}`,this.textAnchor="right"===n?"end":"start"),this.lineAnchor=Q,this.dy="top"===Q?-d:d,this.dx="right"===n?l-3:"left"===n?3-e:0,this.ariaLabel=`${V} label`,{facets:[[0]],channels:{text:{value:[tL(B,g,{anchor:Q,label:L,labelAnchor:n,labelArrow:R})]}}}})))}function vA(){const[B,Q]=SA(...arguments);return TA("y",EA(Q),B,Q)}function JA(){const[B,Q]=SA(...arguments);return TA("fy",NA(Q),B,Q)}function kA(){const[B,Q]=SA(...arguments);return zA("x",XA(Q),B,Q)}function MA(){const[B,Q]=SA(...arguments);return zA("fx",pA(Q),B,Q)}function TA(B,Q,F,{y:U=("y"===B?void 0:null),x:t=null,x1:s=("left"===Q?t:null),x2:I=("right"===Q?t:null),ariaLabel:g=`${B}-grid`,ariaHidden:i=!0,...l}){return jA(Kx,B,F,{ariaLabel:g,ariaHidden:i},{y:U,x1:s,x2:I,...KA(l)})}function zA(B,Q,F,{x:U=("x"===B?void 0:null),y:t=null,y1:s=("top"===Q?t:null),y2:I=("bottom"===Q?t:null),ariaLabel:g=`${B}-grid`,ariaHidden:i=!0,...l}){return jA(zx,B,F,{ariaLabel:g,ariaHidden:i},{x:U,y1:s,y2:I,...KA(l)})}function KA({color:B="currentColor",opacity:Q=.1,stroke:F=B,strokeOpacity:U=Q,strokeWidth:t=1,...s}){return{stroke:F,strokeOpacity:U,strokeWidth:t,...s}}function OA({fill:B,fillOpacity:Q,fontFamily:F,fontSize:U,fontStyle:t,fontVariant:s,fontWeight:I,monospace:g,pointerEvents:i,shapeRendering:l,clip:c=!1},e){return[,B]=Kb(B),[,Q]=Ob(Q),{facet:"super",x:null,y:null,fill:B,fillOpacity:Q,fontFamily:F,fontSize:U,fontStyle:t,fontVariant:s,fontWeight:I,monospace:g,pointerEvents:i,shapeRendering:l,clip:c,initializer:e}}function jA(B,Q,F,U,t,s){let I;const g=tu(t).initializer,i=B(F,tu({...t,initializer:function(B,F,U,g,i,l){const c=null==B&&("fx"===Q||"fy"===Q),{[Q]:e}=g;if(!e)throw new Error(`missing scale: ${Q}`);const n=e.domain();let{interval:d,ticks:C,tickFormat:a,tickSpacing:b=("x"===Q?80:35)}=t;if("string"==typeof C&&IL(e)&&(d=C,C=void 0),void 0===C&&(C=Ao(d,e.type)??function(B,Q){const[F,U]=LB(B.range());return(U-F)/Q}(e,b)),null==B){if(Ro(C))B=$b(C);else if(Lo(C))B=$A(C,...LB(n));else if(e.interval){let Q=e.interval;if(e.ticks){const[F,U]=LB(n);Q=ob(Q,(U-F)/Q[ib]/C)??Q,B=$A(Q,F,U)}else{Q=ob(Q,(B=n).length/C)??Q,Q!==e.interval&&(B=$A(Q,...LB(B)))}if(Q===e.interval){const Q=Math.round(B.length/C);Q>1&&(B=B.filter((B,F)=>F%Q===0))}}else B=e.ticks?e.ticks(C):n;if(!e.ticks&&B.length&&B!==n){const F=new yB(n);B=B.filter(B=>F.has(B)),B.length||GG(`Warning: the ${Q}-axis ticks appear to not align with the scale domain, resulting in no ticks. Try different ticks?`)}"y"===Q||"x"===Q?F=[co(B)]:I[Q]={scale:Q,value:Wb}}s?.call(this,e,B,C,a,I);const o=Object.fromEntries(Object.entries(I).map(([Q,F])=>[Q,{...F,value:Vb(B,F.value)}]));return c&&(F=l.filterFacets(B,o)),{data:B,facets:F,channels:o}}},g));return null==F?(I=i.channels,i.channels={}):I={},void 0!==U&&Object.assign(i,U),void 0===i.clip&&(i.clip=!1),i}function PA(B,Q,F,U,t){return{value:_A(B,Q,F,U,t)}}function _A(B,Q,F,U,t){return"function"!=typeof U||"log"===B.type&&B.tickFormat?void 0===U&&Q&&Zo(Q)?Gb(B.type,Q,t)??Dr:B.tickFormat?B.tickFormat("number"==typeof F?F:null,U):"string"==typeof U&&B.domain().length>0?(Zo(B.domain())?Yc:qs)(U):void 0===U?Dr:Jb(U):U}function $A(B,Q,F){return B.range(Q,B.offset(B.floor(F)))}const qA={draw(B,Q){B.moveTo(0,0),B.lineTo(0,Q)}},BL={draw(B,Q){B.moveTo(0,0),B.lineTo(0,-Q)}},QL={draw(B,Q){B.moveTo(0,0),B.lineTo(-Q,0)}},FL={draw(B,Q){B.moveTo(0,0),B.lineTo(Q,0)}};function UL(B){return B.bandwidth&&!B.interval?void 0:"tabular-nums"}function tL(B,Q,{anchor:F,label:U=Q.label,labelAnchor:t,labelArrow:s}={}){if(!(null==U||U.inferred&&IL(Q)&&/^(date|time|year)$/i.test(U))){if(U=String(U),"auto"===s&&(s=(!Q.bandwidth||Q.interval)&&!/[↑↓→←]/.test(U)),!s)return U;if(!0===s){const F=function(B){return Math.sign(Pa(B.domain()))*Math.sign(Pa(B.range()))}(Q);F&&(s=/x$/.test(B)||"center"===t?/x$/.test(B)===F<0?"left":"right":F<0?"up":"down")}switch(s){case"left":return`← ${U}`;case"right":return`${U} →`;case"up":return"right"===F?`${U} ↑`:`↑ ${U}`;case"down":return"right"===F?`${U} ↓`:`↓ ${U}`}return U}}function sL(B="auto"){return!Wo(B)&&("boolean"==typeof B?B:Pb(B,"labelArrow",["auto","up","right","down","left"]))}function IL(B){return Zo(B.domain())}function gL(B,Q){if(null==Q)return Q;const F=B(Q);if(!F)throw new Error(`scale not found: ${Q}`);return F}function iL(B,Q={},F){let{columns:U,tickFormat:t,fontVariant:s=Ax(B),swatchSize:I=15,swatchWidth:g=I,swatchHeight:i=I,marginLeft:l=0,className:c,style:e,width:n}=Q;const d=Sr(Q);c=sx(c),t=_A(B.scale,B.domain,void 0,t);const C=mr("div",d).attr("class",`${c}-swatches ${c}-swatches-${null!=U?"columns":"wrap"}`);let a;return null!=U?(a=`:where(.${c}-swatches-columns .${c}-swatch) {\n display: flex;\n align-items: center;\n break-inside: avoid;\n padding-bottom: 1px;\n}\n:where(.${c}-swatches-columns .${c}-swatch::before) {\n flex-shrink: 0;\n}\n:where(.${c}-swatches-columns .${c}-swatch-label) {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}`,C.style("columns",U).selectAll().data(B.domain).enter().append("div").attr("class",`${c}-swatch`).call(F,B,g,i).call(B=>B.append("div").attr("class",`${c}-swatch-label`).attr("title",t).text(t))):(a=`:where(.${c}-swatches-wrap) {\n display: flex;\n align-items: center;\n min-height: 33px;\n flex-wrap: wrap;\n}\n:where(.${c}-swatches-wrap .${c}-swatch) {\n display: inline-flex;\n align-items: center;\n margin-right: 1em;\n}`,C.selectAll().data(B.domain).enter().append("span").attr("class",`${c}-swatch`).call(F,B,g,i).append(function(){return this.ownerDocument.createTextNode(t.apply(this,arguments))})),C.call(B=>B.insert("style","*").text(`:where(.${c}-swatches) {\n font-family: system-ui, sans-serif;\n font-size: 10px;\n margin-bottom: 0.5em;\n}\n:where(.${c}-swatch > svg) {\n margin-right: 0.5em;\n overflow: visible;\n}\n${a}`)).style("margin-left",l?+l+"px":null).style("width",void 0===n?null:+n+"px").style("font-variant",Fx(s,"normal")).call(Ix,e).node()}const lL=new Map([["symbol",function(B,{fill:Q=(void 0!==B.hint?.fill?B.hint.fill:"none"),fillOpacity:F=1,stroke:U=(void 0!==B.hint?.stroke?B.hint.stroke:Wo(Q)?"currentColor":"none"),strokeOpacity:t=1,strokeWidth:s=1.5,r:I=4.5,...g}={},i){const[l,c]=Kb(Q),[e,n]=Kb(U),d=gL(i,l),C=gL(i,e),a=I*I*Math.PI;return F=Ob(F)[1],t=Ob(t)[1],s=Ob(s)[1],iL(B,g,(Q,U,I,g)=>Q.append("svg").attr("viewBox","-8 -8 16 16").attr("width",I).attr("height",g).attr("fill","color"===l?B=>d.scale(B):c).attr("fill-opacity",F).attr("stroke","color"===e?B=>C.scale(B):n).attr("stroke-opacity",t).attr("stroke-width",s).append("path").attr("d",Q=>{const F=Js();return B.scale(Q).draw(F,a),F}))}],["color",eL],["opacity",function({type:B,interpolate:Q,...F},{legend:U=!0,color:t=rU(0,0,0),...s}){if(!Q)throw new Error(`${B} opacity scales are not supported`);!0===U&&(U="ramp");if("ramp"!==`${U}`.toLowerCase())throw new Error(`${U} opacity legends are not supported`);return eL({type:B,...F,interpolate:nL(t)},{legend:U,...s})}]]);function cL({className:B,...Q},{label:F,ticks:U,tickFormat:t}={},s){return function(B={},...Q){let F=B;for(const U of Q)for(const Q in U)if(void 0===F[Q]){const t=U[Q];F===B?F={...F,[Q]:t}:F[Q]=t}return F}(s,{className:B,...Q},{label:F,ticks:U,tickFormat:t})}function eL(B,{legend:Q=!0,...F}){if(!0===Q&&(Q="ordinal"===B.type?"swatches":"ramp"),void 0!==B.domain)switch(`${Q}`.toLowerCase()){case"swatches":return function(B,{opacity:Q,...F}={}){if(!_G(B)&&!$G(B))throw new Error(`swatches legend requires ordinal or threshold color scale (not ${B.type})`);return iL(B,F,(B,F,U,t)=>B.append("svg").attr("width",U).attr("height",t).attr("fill",F.scale).attr("fill-opacity",Ob(Q)[1]).append("rect").attr("width","100%").attr("height","100%"))}(B,F);case"ramp":return function(B,Q){let{label:F=B.label,tickSize:U=6,width:t=240,height:s=44+U,marginTop:I=18,marginRight:g=0,marginBottom:i=16+U,marginLeft:l=0,style:c,ticks:e=(t-l-g)/64,tickFormat:n,fontVariant:d=Ax(B),round:C=!0,opacity:a,className:b}=Q;const o=Sr(Q);b=sx(b),a=Ob(a)[1],null===n&&(n=()=>null);const u=mr("svg",o).attr("class",`${b}-ramp`).attr("font-family","system-ui, sans-serif").attr("font-size",10).attr("width",t).attr("height",s).attr("viewBox",`0 0 ${t} ${s}`).call(B=>B.append("style").text(`:where(.${b}-ramp) {\n display: block;\n height: auto;\n height: intrinsic;\n max-width: 100%;\n overflow: visible;\n}\n:where(.${b}-ramp text) {\n white-space: pre;\n}`)).call(Ix,c);let G,r=B=>B.selectAll(".tick line").attr("y1",I+i-s);const x=C?(B,Q)=>B.rangeRound(Q):(B,Q)=>B.range(Q),{type:A,domain:L,range:h,interpolate:R,scale:y,pivot:V}=B;if(R){const B=void 0===h?R:ft(1===R.length?bG(R):R,h);G=x(y.copy(),Yt(rt(l,t-g),Math.min(L.length+(void 0!==V),void 0===h?1/0:h.length)));const Q=256,F=o.document.createElement("canvas");F.width=Q,F.height=1;const U=F.getContext("2d");for(let F=0,t=Q-1;F<Q;++F)U.fillStyle=B(F/t),U.fillRect(F,0,1,1);u.append("image").attr("opacity",a).attr("x",l).attr("y",I).attr("width",t-l-g).attr("height",s-I-i).attr("preserveAspectRatio","none").attr("xlink:href",F.toDataURL())}else if("threshold"===A){const B=L,Q=void 0===n?B=>B:"string"==typeof n?qs(n):n;G=x(Al().domain([-1,h.length-1]),[l,t-g]),u.append("g").attr("fill-opacity",a).selectAll().data(h).enter().append("rect").attr("x",(B,Q)=>G(Q-1)).attr("y",I).attr("width",(B,Q)=>G(Q)-G(Q-1)).attr("height",s-I-i).attr("fill",B=>B),e=Bo(B,(B,Q)=>Q),n=F=>Q(B[F],F)}else G=x(il().domain(L),[l,t-g]),u.append("g").attr("fill-opacity",a).selectAll().data(L).enter().append("rect").attr("x",G).attr("y",I).attr("width",Math.max(0,G.bandwidth()-1)).attr("height",s-I-i).attr("fill",y),r=()=>{};return u.append("g").attr("transform",`translate(0,${s-i})`).call(xQ(G).ticks(Array.isArray(e)?null:e,"string"==typeof n?n:void 0).tickFormat("function"==typeof n?n:void 0).tickSize(U).tickValues(Array.isArray(e)?e:null)).attr("font-size",null).attr("font-family",null).attr("font-variant",Fx(d,"normal")).call(r).call(B=>B.select(".domain").remove()),void 0!==F&&u.append("text").attr("x",l).attr("y",I-6).attr("fill","currentColor").attr("font-weight","bold").text(F),u.node()}(B,F);default:throw new Error(`unknown legend type: ${Q}`)}}function nL(B){const{r:Q,g:F,b:U}=rU(B)||rU(0,0,0);return B=>`rgba(${Q},${F},${U},${B})`}function dL(B={},Q={}){1===arguments.length&&([B,Q]=function(B){const{offset:Q,order:F,reverse:U,...t}=B;return[{offset:Q,order:F,reverse:U},t]}(B));const{x1:F,x:U=F,y:t,...s}=Q,[I,g,i,l]=function(B,Q=Hb,F,U,{offset:t,order:s,reverse:I},g){if(null===Q)throw new Error(`stack requires ${U}`);const i=io(g),[l,c]=bo(B),[e,n]=ao(Q),[d,C]=ao(Q);return e.hint=d.hint=aL,t=function(B){if(null==B)return;if("function"==typeof B)return B;switch(`${B}`.toLowerCase()){case"expand":case"normalize":return oL;case"center":case"silhouette":return uL;case"wiggle":return GL}throw new Error(`unknown offset: ${B}`)}(t),s=function(B,Q,F){if(void 0===B&&Q===GL)return AL(wa);if(null==B)return;if("string"==typeof B){const Q=B.startsWith("-"),U=Q?va:wa;switch((Q?B.slice(1):B).toLowerCase()){case"value":case F:return function(B){return(Q,F,U)=>(Q,F)=>B(U[Q],U[F])}(U);case"z":return function(B){return(Q,F,U,t)=>(Q,F)=>B(t[Q],t[F])}(U);case"sum":return function(B){return RL(B,(B,Q,F,U)=>YB(co(B),B=>eQ(B,B=>F[B]),B=>U[B]))}(U);case"appearance":return function(B){return RL(B,(B,Q,F,U)=>YB(co(B),B=>Q[BQ(B,B=>F[B])],B=>U[B]))}(U);case"inside-out":return AL(U)}return LL(Xb(B))}if("function"==typeof B)return(1===B.length?LL:hL)(B);if(Lb(B))return U=B,RL(wa,()=>U);var U;throw new Error(`invalid order: ${B}`)}(s,t,U),[Uu(g,(U,g,l)=>{({data:U,facets:g}=function(B,Q){if(1===Q.length)return{data:B,facets:Q};const F=lo(B),U=new Uint8Array(F);let t=0;for(const B of Q)for(const Q of B)U[Q]&&++t,U[Q]=1;if(0===t)return{data:B,facets:Q};const s=(B=Qo(B))[yb]=new Uint32Array(F+t);Q=Q.map(B=>Qo(B,Uint32Array));let I=F;U.fill(0);for(const F of Q)for(let Q=0,t=F.length;Q<t;++Q){const t=F[Q];U[t]?(F[Q]=I,B[I]=B[t],s[I]=t,++I):s[t]=t,U[t]=1}return{data:B,facets:Q}}(U,g));const e=null==B?void 0:c(Go(Vb(U,B),l?.[F])),d=Vb(U,Q,Float64Array),a=Vb(U,i),b=s&&s(U,e,d,a),o=lo(U),u=n(new Float64Array(o)),G=C(new Float64Array(o)),r=[];for(const B of g){const Q=e?Array.from(NB(B,B=>e[B]).values()):[B];if(b)for(const B of Q)B.sort(b);for(const B of Q){let Q=0,F=0;I&&B.reverse();for(const U of B){const B=d[U];B<0?Q=G[U]=(u[U]=Q)+B:B>0?F=G[U]=(u[U]=F)+B:G[U]=u[U]=F}}r.push(Q)}return t&&t(r,u,G,a),{data:U,facets:g}}),l,e,d]}(U,t,"x","y",B,s);return{...I,x1:F,x:g,y1:i,y2:l,y:uo(i,l)}}function CL({y:B,y1:Q,y2:F,...U}={}){return U=nx(U,"x"),void 0===Q&&void 0===F?dL({y:B,...U}):([Q,F]=function(B,Q,F,U=Wb){return void 0===Q&&void 0===F?(Q=0,F=void 0===B?U:B):void 0===Q?Q=void 0===B?0:B:void 0===F&&(F=void 0===B?0:B),[Q,F]}(B,Q,F),{...U,y1:Q,y2:F})}const aL={length:!0};function bL(B,Q){let F=0,U=0;for(const t of B){const B=Q[t];B<F&&(F=B),B>U&&(U=B)}return[F,U]}function oL(B,Q,F){for(const U of B)for(const B of U){const[U,t]=bL(B,F);for(const s of B){const B=1/(t-U||1);Q[s]=B*(Q[s]-U),F[s]=B*(F[s]-U)}}}function uL(B,Q,F){for(const U of B){for(const B of U){const[U,t]=bL(B,F);for(const s of B){const B=(t+U)/2;Q[s]-=B,F[s]-=B}}rL(U,Q,F)}xL(B,Q,F)}function GL(B,Q,F,U){for(const t of B){const B=new RB;let s=0;for(const I of t){let t=-1;const g=I.map(B=>Math.abs(F[B]-Q[B])),i=I.map(s=>{t=U?U[s]:++t;const I=F[s]-Q[s],g=B.has(t)?I-B.get(t):0;return B.set(t,I),g}),l=[0,...rB(i)];for(const B of I)Q[B]+=s,F[B]+=s;const c=eQ(g);c&&(s-=eQ(g,(B,Q)=>(i[Q]/2+l[Q])*B)/c)}rL(t,Q,F)}xL(B,Q,F)}function rL(B,Q,F){const U=PB(B,B=>PB(B,B=>Q[B]));for(const t of B)for(const B of t)Q[B]-=U,F[B]-=U}function xL(B,Q,F){const U=B.length;if(1===U)return;const t=B.map(B=>B.flat()),s=t.map(B=>(PB(B,B=>Q[B])+OB(B,B=>F[B]))/2),I=PB(s);for(let B=0;B<U;B++){const U=I-s[B];for(const s of t[B])Q[s]+=U,F[s]+=U}}function AL(B){return RL(B,(B,Q,F,U)=>{const t=co(B),s=YB(t,B=>Q[BQ(B,B=>F[B])],B=>U[B]),I=XB(t,B=>eQ(B,B=>F[B]),B=>U[B]),g=[],i=[];let l=0;for(const B of s)l<0?(l+=I.get(B),g.push(B)):(l-=I.get(B),i.push(B));return i.reverse().concat(g)})}function LL(B){return Q=>{const F=Vb(Q,B);return(B,Q)=>wa(F[B],F[Q])}}function hL(B){return Q=>Lb(Q)?(F,U)=>B(Q[F],Q[U]):(F,U)=>B(Q.get(F),Q.get(U))}function RL(B,Q){return(F,U,t,s)=>{if(!s)throw new Error("missing channel: z");const I=new RB(Q(F,U,t,s).map((B,Q)=>[B,Q]));return(Q,F)=>B(I.get(s[Q]),I.get(s[F]))}}const yL={ariaLabel:"rect"};class VL extends ix{constructor(B,Q={}){const{x1:F,y1:U,x2:t,y2:s}=Q;super(B,{x1:{value:F,scale:"x",type:null!=F&&null==t?"band":void 0,optional:!0},y1:{value:U,scale:"y",type:null!=U&&null==s?"band":void 0,optional:!0},x2:{value:t,scale:"x",optional:!0},y2:{value:s,scale:"y",optional:!0}},Q,yL),ZL(this,Q),SL(this,Q)}render(B,Q,F,U,t){const{x:s,y:I}=Q;let{x1:g,y1:i,x2:l,y2:c}=F;const{marginTop:e,marginRight:n,marginBottom:d,marginLeft:C,width:a,height:b}=U,{projection:o}=t,{insetTop:u,insetRight:G,insetBottom:r,insetLeft:x}=this,{rx:A,ry:L,rx1y1:h,rx1y2:R,rx2y1:y,rx2y2:V}=this;(g||l)&&!o&&qG(s)&&(g=l=null),(i||c)&&!o&&qG(I)&&(i=c=null);const Z=s?.bandwidth?s.bandwidth():0,S=I?.bandwidth?I.bandwidth():0;return mr("svg:g",t).call(_r,this,U,t).call(Qx,this,{},0,0).call(Q=>Q.selectAll().data(B).enter().call(h||R||y||V?B=>B.append("path").call($r,this).call(mL,g&&l?B=>g[B]+(l[B]<g[B]?-G:x):g?B=>g[B]+x:C+x,i&&c?B=>i[B]+(c[B]<i[B]?-r:u):i?B=>i[B]+u:e+u,g&&l?B=>l[B]-(l[B]<g[B]?-x:G):g?B=>g[B]+Z-G:a-n-G,i&&c?B=>c[B]-(c[B]<i[B]?-u:r):i?B=>i[B]+S-r:b-d-r,this).call(Mr,this,F):B=>B.append("rect").call($r,this).attr("x",g?l?B=>Math.min(g[B],l[B])+x:B=>g[B]+x:C+x).attr("y",i?c?B=>Math.min(i[B],c[B])+u:B=>i[B]+u:e+u).attr("width",g?l?B=>Math.max(0,Math.abs(l[B]-g[B])+Z-x-G):Z-x-G:a-n-C-G-x).attr("height",i?c?B=>Math.max(0,Math.abs(i[B]-c[B])+S-u-r):S-u-r:b-e-d-u-r).call(Bx,"rx",A).call(Bx,"ry",L).call(Mr,this,F))).node()}}function ZL(B,{inset:Q=0,insetTop:F=Q,insetRight:U=Q,insetBottom:t=Q,insetLeft:s=Q}={}){B.insetTop=Yb(F),B.insetRight=Yb(U),B.insetBottom=Yb(t),B.insetLeft=Yb(s)}function SL(B,{r:Q,rx:F,ry:U,rx1:t=Q,ry1:s=Q,rx2:I=Q,ry2:g=Q,rx1y1:i=(void 0!==t?+t:void 0!==s?+s:0),rx1y2:l=(void 0!==t?+t:void 0!==g?+g:0),rx2y1:c=(void 0!==I?+I:void 0!==s?+s:0),rx2y2:e=(void 0!==I?+I:void 0!==g?+g:0)}={}){i||l||c||e?(B.rx1y1=i,B.rx1y2=l,B.rx2y1=c,B.rx2y2=e):(B.rx=Fx(F,"auto"),B.ry=Fx(U,"auto"))}function mL(B,Q,F,U,t,s){const{rx1y1:I,rx1y2:g,rx2y1:i,rx2y2:l}=s;"function"!=typeof Q&&(Q=Jb(Q)),"function"!=typeof F&&(F=Jb(F)),"function"!=typeof U&&(U=Jb(U)),"function"!=typeof t&&(t=Jb(t));const c=Math.max(Math.abs(I+i),Math.abs(g+l)),e=Math.max(Math.abs(I+g),Math.abs(i+l));B.attr("d",B=>{const s=Q(B),n=F(B),d=U(B),C=t(B),a=s>d,b=n>C,o=a?d:s,u=a?s:d,G=b?C:n,r=b?n:C,x=Math.min(1,(u-o)/c,(r-G)/e),A=x*(a?b?l:i:b?g:I),L=x*(a?b?g:I:b?l:i),h=x*(a?b?I:g:b?i:l),R=x*(a?b?i:l:b?I:g);return`M${o},${G+NL(A,R)}A${A},${A} 0 0 ${A<0?0:1} ${o+EL(A,R)},${G}H${u-EL(L,h)}A${L},${L} 0 0 ${L<0?0:1} ${u},${G+NL(L,h)}V${r-NL(h,L)}A${h},${h} 0 0 ${h<0?0:1} ${u-EL(h,L)},${r}H${o+EL(R,A)}A${R},${R} 0 0 ${R<0?0:1} ${o},${r-NL(R,A)}Z`})}function EL(B,Q){return Q<0?B:Math.abs(B)}function NL(B,Q){return Q<0?Math.abs(B):B}function XL(B,Q={}){return function(B){return function({x:B,x1:Q,x2:F}){return void 0!==B||void 0!==Q||void 0!==F}(B)||Fo(B)||void 0!==B.interval}(Q)||(Q={...Q,x:pb,y2:Wb,interval:1}),new VL(B,CL(function(B={}){return vx("x",Dx,B,!0)}(function(B={},Q="y"){return Fo(B)?B:{...B,[Q]:Wb}}(Q))))}const pL={ariaLabel:"frame",fill:"none",stroke:"currentColor",clip:!1},WL={ariaLabel:"frame",fill:null,stroke:"currentColor",strokeLinecap:"square",clip:!1};class HL extends ix{constructor(B={}){const{anchor:Q=null}=B;super(Nb,void 0,B,null==Q?pL:WL),this.anchor=jb(Q,"anchor",["top","right","bottom","left"]),ZL(this,B),Q||SL(this,B)}render(B,Q,F,U,t){const{marginTop:s,marginRight:I,marginBottom:g,marginLeft:i,width:l,height:c}=U,{anchor:e,insetTop:n,insetRight:d,insetBottom:C,insetLeft:a}=this,{rx:b,ry:o,rx1y1:u,rx1y2:G,rx2y1:r,rx2y2:x}=this,A=i+a,L=l-I-d,h=s+n,R=c-g-C;return mr(e?"svg:line":u||G||r||x?"svg:path":"svg:rect",t).datum(0).call(_r,this,U,t).call($r,this).call(Mr,this,F).call(Qx,this,{}).call("left"===e?B=>B.attr("x1",A).attr("x2",A).attr("y1",h).attr("y2",R):"right"===e?B=>B.attr("x1",L).attr("x2",L).attr("y1",h).attr("y2",R):"top"===e?B=>B.attr("x1",A).attr("x2",L).attr("y1",h).attr("y2",h):"bottom"===e?B=>B.attr("x1",A).attr("x2",L).attr("y1",R).attr("y2",R):u||G||r||x?B=>B.call(mL,A,h,L,R,this):B=>B.attr("x",A).attr("y",h).attr("width",L-A).attr("height",R-h).attr("rx",b).attr("ry",o)).node()}}const DL={ariaLabel:"tip",fill:"var(--plot-background)",stroke:"currentColor"},fL=new Set(["geometry","href","src","ariaLabel","scales"]);class YL extends ix{constructor(B,Q={}){Q.tip&&(Q={...Q,tip:!1}),void 0===Q.title&&Ro(B)&&yo(B)&&(Q={...Q,title:Wb});const{x:F,y:U,x1:t,x2:s,y1:I,y2:g,anchor:i,preferredAnchor:l="bottom",monospace:c,fontFamily:e=(c?"ui-monospace, monospace":void 0),fontSize:n,fontStyle:d,fontVariant:C,fontWeight:a,lineHeight:b=1,lineWidth:o=20,frameAnchor:u,format:G,textAnchor:r="start",textOverflow:x,textPadding:A=8,title:L,pointerSize:h=12,pathFilter:R="drop-shadow(0 3px 4px rgba(0,0,0,0.2))"}=Q;super(B,{x:{value:null!=t&&null!=s?null:F,scale:"x",optional:!0},y:{value:null!=I&&null!=g?null:U,scale:"y",optional:!0},x1:{value:t,scale:"x",optional:null==s},y1:{value:I,scale:"y",optional:null==g},x2:{value:s,scale:"x",optional:null==t},y2:{value:g,scale:"y",optional:null==I},title:{value:L,optional:!0}},Q,DL),this.anchor=Do(i,"anchor"),this.preferredAnchor=Do(l,"preferredAnchor"),this.frameAnchor=fo(u),this.textAnchor=Fx(r,"middle"),this.textPadding=+A,this.pointerSize=+h,this.pathFilter=fb(R),this.lineHeight=+b,this.lineWidth=+o,this.textOverflow=$x(x),this.monospace=!!c,this.fontFamily=fb(e),this.fontSize=Yb(n),this.fontStyle=fb(d),this.fontVariant=fb(C),this.fontWeight=fb(a);for(const B in DL)B in this.channels&&(this[B]=DL[B]);this.splitLines=lA(this),this.clipLine=cA(this),this.format="string"==typeof G||"function"==typeof G?{title:G}:{...G}}render(B,Q,F,U,t){const s=this,{x:I,y:g,fx:i,fy:l}=Q,{ownerSVGElement:c,document:e}=t,{anchor:n,monospace:d,lineHeight:C,lineWidth:a}=this,{textPadding:b,pointerSize:o,pathFilter:u}=this,{marginTop:G,marginLeft:r}=U,{x1:x,y1:A,x2:L,y2:h,x:R=x??L,y:y=A??h}=F,V=i?i(B.fx)-r:0,Z=l?l(B.fy)-G:0,[S,m]=gx(this,U),E=rx(F,S),N=xx(F,m),X=d?iA:gA,p=X(eA);let W,H;"title"in F?(W=vL.call(this,{title:F.channels.title},Q),H=kL):(W=vL.call(this,F.channels,Q),H=ML);const D=mr("svg:g",t).call(_r,this,U,t).call(UA,this).call(Qx,this,{x:R&&I,y:y&&g}).call(U=>U.selectAll().data(B).enter().append("g").attr("transform",B=>`translate(${Math.round(E(B))},${Math.round(N(B))})`).call($r,this).call(B=>B.append("path").attr("filter",u)).call(U=>U.append("text").each(function(U){const t=YF(this);this.setAttribute("fill","currentColor"),this.setAttribute("fill-opacity",1),this.setAttribute("stroke","none");const I=H.call(s,U,B,W,Q,F);if("string"==typeof I)for(const B of s.splitLines(I))f(t,{value:s.clipLine(B)});else{const B=new Set;for(const Q of I){const{label:F=""}=Q;F&&B.has(F)||(B.add(F),f(t,Q))}}})));function f(B,{label:Q,value:F,color:U,opacity:t}){Q??="",F??="";const s=null!=U||null!=t;let I,g=100*a;const[i]=nA(Q,g,X,p);if(i>=0)Q=Q.slice(0,i).trimEnd()+eA,I=F.trim(),F="";else{(Q||!F&&!s)&&(F=" "+F);const[B]=nA(F,g-X(Q),X,p);B>=0&&(I=F.trim(),F=F.slice(0,B).trimEnd()+eA)}const l=B.append("tspan").attr("x",0).attr("dy",`${C}em`).text("​");Q&&l.append("tspan").attr("font-weight","bold").text(Q),F&&l.append(()=>e.createTextNode(F)),s&&l.append("tspan").text(" ■").attr("fill",U).attr("fill-opacity",t).style("user-select","none"),I&&l.append("title").text(I)}function Y(){const{width:B,height:Q}=U.facet??U;D.selectChildren().each(function(F){let{x:U,width:t,height:I}=this.getBBox();t=Math.round(t),I=Math.round(I);let g=n;if(void 0===g){const U=E(F)+V,i=N(F)+Z,l=U+t+o+2*b<B,c=U-t-o-2*b>0,e=i+I+o+2*b<Q,n=i-I-o-2*b>0;g=l&&c?e&&n?s.preferredAnchor:n?"bottom":"top":e&&n?l?"left":"right":(l||c)&&(e||n)?`${n?"bottom":"top"}-${l?"left":"right"}`:s.preferredAnchor}const i=this.firstChild,l=this.lastChild;if(i.setAttribute("d",function(B,Q,F,U,t){const s=U+2*F,I=t+2*F;switch(B){case"middle":return`M${-s/2},${-I/2}h${s}v${I}h${-s}z`;case"top-left":return`M0,0l${Q},${Q}h${s-Q}v${I}h${-s}z`;case"top":return`M0,0l${Q/2},${Q/2}h${(s-Q)/2}v${I}h${-s}v${-I}h${(s-Q)/2}z`;case"top-right":return`M0,0l${-Q},${Q}h${Q-s}v${I}h${s}z`;case"right":return`M0,0l${-Q/2},${-Q/2}v${Q/2-I/2}h${-s}v${I}h${s}v${Q/2-I/2}z`;case"bottom-left":return`M0,0l${Q},${-Q}h${s-Q}v${-I}h${-s}z`;case"bottom":return`M0,0l${Q/2},${-Q/2}h${(s-Q)/2}v${-I}h${-s}v${I}h${(s-Q)/2}z`;case"bottom-right":return`M0,0l${-Q},${-Q}h${Q-s}v${-I}h${s}z`;case"left":return`M0,0l${Q/2},${-Q/2}v${Q/2-I/2}h${s}v${I}h${-s}v${Q/2-I/2}z`}}(g,o,b,t,I)),U)for(const B of l.childNodes)B.setAttribute("x",-U);l.setAttribute("y",+function(B,Q,F){return/^top(?:-|$)/.test(B)?.94-F:-.29-Q*F}(g,l.childNodes.length,C).toFixed(6)+"em"),l.setAttribute("transform",`translate(${function(B,Q,F,U,t){switch(B){case"middle":return[-U/2,t/2];case"top-left":return[F,Q+F];case"top":return[-U/2,Q/2+F];case"top-right":return[-U-F,Q+F];case"right":return[-Q/2-U-F,t/2];case"bottom-left":return[F,-Q-F];case"bottom":return[-U/2,-Q/2-F];case"bottom-right":return[-U-F,-Q-F];case"left":return[F+Q/2,t/2]}}(g,o,b,t,I)})`)}),D.attr("visibility",null)}return B.length&&(D.attr("visibility","hidden"),c.isConnected?Promise.resolve().then(Y):"undefined"!=typeof requestAnimationFrame&&requestAnimationFrame(Y)),D.node()}}function wL(B,{x:Q,y:F,...U}={}){return void 0===U.frameAnchor&&([Q,F]=go(Q,F)),new YL(B,{...U,x:Q,y:F})}function vL(B,Q){const F={};let U=this.format;U=JL(U,B,"x"),U=JL(U,B,"y"),this.format=U;for(const Q in U){const t=U[Q];if(null!==t&&!1!==t)if("fx"===Q||"fy"===Q)F[Q]=!0;else{const U=Yu(B,Q);U&&(F[Q]=U)}}for(const Q in B){if(Q in F||Q in U||fL.has(Q))continue;if(("x"===Q||"y"===Q)&&B.geometry)continue;const t=Yu(B,Q);if(t){if(null==t.scale&&"color"===t.defaultScale)continue;F[Q]=t}}this.facet&&(Q.fx&&!("fx"in U)&&(F.fx=!0),Q.fy&&!("fy"in U)&&(F.fy=!0));for(const B in F){const U=this.format[B];if("string"==typeof U){const t=F[B]?.value??Q[B]?.domain()??[];this.format[B]=(Zo(t)?Yc:qs)(U)}else if(void 0===U||!0===U){const F=Q[B];this.format[B]=F?.bandwidth?_A(F,F.domain()):Dr}}return F}function JL(B,Q,F){if(!(F in B))return B;const U=`${F}1`,t=`${F}2`;if(!(!(U in B)&&U in Q||!(t in B)&&t in Q))return B;const s=Object.entries(B),I=B[F];return s.splice(s.findIndex(([B])=>B===F)+1,0,[U,I],[t,I]),Object.fromEntries(s)}function kL(B,Q,{title:F}){return this.format.title(F.value[B],B)}function*ML(B,Q,F,U,t){for(const s in F){if("fx"===s||"fy"===s){yield{label:KL(U,F,s),value:this.format[s](Q[s],B)};continue}if("x1"===s&&"x2"in F)continue;if("y1"===s&&"y2"in F)continue;const I=F[s];if("x2"===s&&"x1"in F)yield{label:zL(U,F,"x"),value:TL(this.format.x2,F.x1,I,B)};else if("y2"===s&&"y1"in F)yield{label:zL(U,F,"y"),value:TL(this.format.y2,F.y1,I,B)};else{const Q=I.value[B],g=I.scale;if(!Ya(Q)&&null==g)continue;yield{label:KL(U,F,s),value:this.format[s](Q,B),color:"color"===g?t[s][B]:null,opacity:"opacity"===g?t[s][B]:null}}}}function TL(B,Q,F,U){return F.hint?.length?`${B(F.value[U]-Q.value[U],U)}`:`${B(Q.value[U],U)}–${B(F.value[U],U)}`}function zL(B,Q,F){const U=KL(B,Q,`${F}1`,F),t=KL(B,Q,`${F}2`,F);return U===t?U:`${U}–${t}`}function KL(B,Q,F,U=F){const t=Q[F],s=B[t?.scale??F];return String(s?.label??t?.label??U)}function OL(B={}){const{facet:Q,style:F,title:U,subtitle:t,caption:s,ariaLabel:I,ariaDescription:g}=B,i=sx(B.className),l=void 0===B.marks?[]:PL(B.marks);l.push(...function(B){const Q=[];for(const F of B){let B=F.tip;if(B){!0===B?B={}:"string"==typeof B&&(B={pointer:B});let{pointer:U,preferredAnchor:t}=B;U=/^x$/i.test(U)?ux:/^y$/i.test(U)?Gx:ox,B=U(sh(F,B)),B.title=null,void 0===t&&(B.preferredAnchor=U===Gx?"left":"bottom");const s=wL(F.data,B);s.facet=F.facet,s.facetAnchor=F.facetAnchor,Q.push(s)}}return Q}(l));const c=function(B,Q){if(null==B)return;const{x:F,y:U}=B;if(null==F&&null==U)return;const t=_b(B.data);if(null==t)throw new Error("missing facet data");const s={};null!=F&&(s.fx=mu(t,{value:F,scale:"fx"}));null!=U&&(s.fy=mu(t,{value:U,scale:"fy"}));qL(s,Q);const I=tr(t,s);return{channels:s,groups:I,data:B.data}}(Q,B),e=new Map;for(const Q of l){const F=th(Q,c,B);F&&e.set(Q,F)}const n=new Map;c&&Fh(n,[c],B),Fh(n,e,B);const d=PL(function(B,Q,F){let{projection:U,x:t={},y:s={},fx:I={},fy:g={},axis:i,grid:l,facet:c={},facet:{axis:e=i,grid:n}=c,x:{axis:d=i,grid:C=(null===d?null:l)}=t,y:{axis:a=i,grid:b=(null===a?null:l)}=s,fx:{axis:o=e,grid:u=(null===o?null:n)}=I,fy:{axis:G=e,grid:r=(null===G?null:n)}=g}=F;(U||!to(t)&&!ch("x",B))&&(d=C=null);(U||!to(s)&&!ch("y",B))&&(a=b=null);Q.has("fx")||(o=u=null);Q.has("fy")||(G=r=null);void 0===d&&(d=!lh(B,"x"));void 0===a&&(a=!lh(B,"y"));void 0===o&&(o=!lh(B,"fx"));void 0===G&&(G=!lh(B,"fy"));!0===d&&(d="bottom");!0===a&&(a="left");!0===o&&(o="top"===d||null===d?"bottom":"top");!0===G&&(G="right"===a||null===a?"left":"right");const x=[];return gh(x,r,JA,g),Ih(x,G,HA,"right","left",c,g),gh(x,u,MA,I),Ih(x,o,fA,"top","bottom",c,I),gh(x,b,vA,s),Ih(x,a,WA,"left","right",F,s),gh(x,C,kA,t),Ih(x,d,DA,"bottom","top",F,t),x}(l,n,B));for(const Q of d){const F=th(Q,c,B);F&&e.set(Q,F)}l.unshift(...d);let C=Ur(n,B);if(void 0!==C){const B=c?br(C,c):void 0;for(const Q of l){if(null===Q.facet||"super"===Q.facet)continue;const F=e.get(Q);void 0!==F&&(F.facetsIndex=null!=Q.fx||null!=Q.fy?br(C,F):B)}const Q=new Set;for(const{facetsIndex:B}of e.values())B?.forEach((B,F)=>{B?.length>0&&Q.add(F)});C.forEach(0<Q.size&&Q.size<C.length?(B,F)=>B.empty=!Q.has(F):B=>B.empty=!1);for(const B of l)if("exclude"===B.facet){const Q=e.get(B);void 0!==Q&&(Q.facetsIndex=sr(Q.facetsIndex))}}for(const Q of Po.keys())to(B[Q])&&"fx"!==Q&&"fy"!==Q&&n.set(Q,[]);const a=new Map;for(const Q of l){if(a.has(Q))throw new Error("duplicate mark; each mark must be unique");const{facetsIndex:F,channels:U}=e.get(Q)??{},{data:t,facets:s,channels:I}=Q.initialize(F,U,B);qL(I,B),a.set(Q,{data:t,facets:s,channels:I})}const b=DG(Fh(n,a,B),B),o=function(B,Q,F={}){let U=.5-fr,t=.5+fr,s=.5+fr,I=.5-fr;for(const{marginTop:B,marginRight:F,marginBottom:g,marginLeft:i}of Q)B>U&&(U=B),F>t&&(t=F),g>s&&(s=g),i>I&&(I=i);let{margin:g,marginTop:i=(void 0!==g?g:U),marginRight:l=(void 0!==g?g:t),marginBottom:c=(void 0!==g?g:s),marginLeft:e=(void 0!==g?g:I)}=F;i=+i,l=+l,c=+c,e=+e;let{width:n=640,height:d=dx(B,F,{width:n,marginTopDefault:U,marginRightDefault:t,marginBottomDefault:s,marginLeftDefault:I})+Math.max(0,i-U+c-s)}=F;n=+n,d=+d;const C={width:n,height:d,marginTop:i,marginRight:l,marginBottom:c,marginLeft:e};if(B.fx||B.fy){let{margin:B,marginTop:Q=(void 0!==B?B:i),marginRight:U=(void 0!==B?B:l),marginBottom:t=(void 0!==B?B:c),marginLeft:s=(void 0!==B?B:e)}=F.facet??{};Q=+Q,U=+U,t=+t,s=+s,C.facet={marginTop:Q,marginRight:U,marginBottom:t,marginLeft:s}}return C}(b,l,B);!function(B,Q){const{x:F,y:U,fx:t,fy:s}=B,I=t||s?wG(Q):Q;t&&JG(t,I),s&&kG(s,I);const g=t||s?vG(B,Q):Q;F&&JG(F,g),U&&kG(U,g)}(b,o);const u=fG(b),{fx:G,fy:r}=u,x=G||r?vG(b,o):o,A=G||r?function({fx:B,fy:Q},F){const{marginTop:U,marginRight:t,marginBottom:s,marginLeft:I,width:g,height:i}=wG(F),l=B&&eh(B),c=Q&&eh(Q);return{marginTop:Q?c[0]:U,marginRight:B?g-l[1]:t,marginBottom:Q?i-c[1]:s,marginLeft:B?l[0]:I,inset:{marginTop:F.marginTop,marginRight:F.marginRight,marginBottom:F.marginBottom,marginLeft:F.marginLeft},width:g,height:i}}(u,o):o,L=Sr(B),h=L.document,R=NQ("svg").call(h.documentElement);let y=R;L.ownerSVGElement=R,L.className=i,L.projection=rr(B,x),L.path=function(){return gi(this.projection??function({x:B,y:Q}){if(B||Q)return B??=B=>B,Q??=B=>B,ii({point(F,U){this.stream.point(B(F),Q(U))}})}(u))},L.filterFacets=(B,Q)=>br(C,{channels:Q,groups:tr(B,Q)}),L.getMarkState=B=>{const Q=a.get(B),F=e.get(B);return{...Q,channels:{...Q.channels,...F?.channels}}},L.dispatchValue=B=>{y.value!==B&&(y.value=B,y.dispatchEvent(new L.document.defaultView.Event("input",{bubbles:!0})))};const V=new Set;for(const[Q,F]of a)if(null!=Q.initializer){const U="super"===Q.facet?A:x,t=Q.initializer(F.data,F.facets,F.channels,u,U,L);if(void 0!==t.data&&(F.data=t.data),void 0!==t.facets&&(F.facets=t.facets),void 0!==t.channels){const{fx:U,fy:s,...I}=t.channels;Qh(I),Object.assign(F.channels,I);for(const Q of Object.values(I)){const{scale:F}=Q;null==F||_o(Po.get(F))||(Bh(Q,B),V.add(F))}null==U&&null==s||e.set(Q,!0)}}if(V.size){const Q=new Map;Fh(Q,a,B,B=>V.has(B)),Fh(n,a,B,B=>V.has(B));const F=function(B,Q){for(const F in B){const U=B[F],t=Q[F];void 0===U.label&&t&&(U.label=t.label)}return B}(DG(Q,B),b),{scales:U,...t}=fG(F);Object.assign(b,F),Object.assign(u,t),Object.assign(u.scales,U)}let Z,S;void 0!==C&&(Z={x:G?.domain(),y:r?.domain()},C=function(B,{x:Q,y:F}){return Q&&=ir(Q),F&&=ir(F),B.filter(Q&&F?B=>Q.has(B.x)&&F.has(B.y):Q?B=>Q.has(B.x):B=>F.has(B.y)).sort(Q&&F?(B,U)=>Q.get(B.x)-Q.get(U.x)||F.get(B.y)-F.get(U.y):Q?(B,F)=>Q.get(B.x)-Q.get(F.x):(B,Q)=>F.get(B.y)-F.get(Q.y))}(C,Z),S=function(B,Q,{marginTop:F,marginLeft:U}){const t=B?({x:Q})=>B(Q)-U:()=>0,s=Q?({y:B})=>Q(B)-F:()=>0;return function(B){"svg"===this.tagName?(this.setAttribute("x",t(B)),this.setAttribute("y",s(B))):this.setAttribute("transform",`translate(${t(B)},${s(B)})`)}}(G,r,o));for(const[B,Q]of a)Q.values=B.scale(Q.channels,u,L);const{width:m,height:E}=o;YF(R).attr("class",i).attr("fill","currentColor").attr("font-family","system-ui, sans-serif").attr("font-size",10).attr("text-anchor","middle").attr("width",m).attr("height",E).attr("viewBox",`0 0 ${m} ${E}`).attr("aria-label",I).attr("aria-description",g).call(B=>B.append("style").text(`:where(.${i}) {\n --plot-background: white;\n display: block;\n height: auto;\n height: intrinsic;\n max-width: 100%;\n}\n:where(.${i} text),\n:where(.${i} tspan) {\n white-space: pre;\n}`)).call(Ix,F);for(const B of l){const{channels:Q,values:F,facets:U}=a.get(B);if(void 0===C||"super"===B.facet){let t=null;if(U&&(t=U[0],t=B.filter(t,Q,F),0===t.length))continue;const s=B.render(t,u,F,A,L);if(null==s)continue;R.appendChild(s)}else{let t;for(const s of C){if(!(B.facetAnchor?.(C,Z,s)??!s.empty))continue;let I=null;if(U){const t=e.has(B);if(I=U[t?s.i:0],I=B.filter(I,Q,F),0===I.length)continue;t||I!==U[0]||(I=no(I)),I.fx=s.x,I.fy=s.y,I.fi=s.i}const g=B.render(I,u,F,x,L);if(null!=g){(t??=YF(R).append("g")).append(()=>g).datum(s);for(const B of["aria-label","aria-description","aria-hidden","transform"])g.hasAttribute(B)&&(t.attr(B,g.getAttribute(B)),g.removeAttribute(B))}}t?.selectChildren().each(S)}}const N=function(B,Q,F){const U=[];for(const[t,s]of lL){const I=F[t];if(I?.legend&&t in B){const F=s(B[t],cL(Q,B[t],I),Q=>B[Q]);null!=F&&U.push(F)}}return U}(b,L,B),{figure:X=null!=U||null!=t||null!=s||N.length>0}=B;X&&(y=h.createElement("figure"),y.className=`${i}-figure`,y.style.maxWidth="initial",null!=U&&y.append(jL(h,U,"h2")),null!=t&&y.append(jL(h,t,"h3")),y.append(...N,R),null!=s&&y.append(function(B,Q){const F=B.createElement("figcaption");return F.append(Q),F}(h,s)),"value"in R&&(y.value=R.value,delete R.value)),y.scale=function(B){return Q=>{if(!Po.has(Q=`${Q}`))throw new Error(`unknown scale: ${Q}`);return B[Q]}}(u.scales),y.legend=function(B,Q,F={}){return(U,t)=>{if(!lL.has(U))throw new Error(`unknown legend type: ${U}`);if(U in B)return lL.get(U)(B[U],cL(Q,F[U],t),Q=>B[Q])}}(b,L,B);const p=function(){const B=uG;return uG=0,oG=void 0,B}();return p>0&&YF(R).append("text").attr("x",m).attr("y",20).attr("dy","-1em").attr("text-anchor","end").attr("font-family","initial").text("⚠️").append("title").text(`${p.toLocaleString("en-US")} warning${1===p?"":"s"}. Please check the console.`),y}function jL(B,Q,F){if(Q.ownerDocument)return Q;const U=B.createElement(F);return U.append(Q),U}function PL(B){return B.flat(1/0).filter(B=>null!=B).map(_L)}function _L(B){return"function"==typeof B.render?B:new $L(B)}class $L extends ix{constructor(B){if("function"!=typeof B)throw new TypeError("invalid mark; missing render function");super(),this.render=B}render(){}}function qL(B,Q){for(const F in B)Bh(B[F],Q);return B}function Bh(B,Q){const{scale:F,transform:U=!0}=B;if(null==F||!U)return;const{type:t,percent:s,interval:I,transform:g=(s?B=>null==B?NaN:100*B:ro(I,t))}=Q[F]??{};null!=g&&(B.value=Bo(B.value,g),B.transform=!1)}function Qh(B){for(const Q in B)Eu(Q,B[Q])}function Fh(B,Q,F,U=Db){for(const{channels:t}of Q.values())for(const Q in t){const s=t[Q],{scale:I}=s;if(null!=I&&U(I))if("projection"===I){if(!Vr(F)){const Q=void 0===F.x?.domain,U=void 0===F.y?.domain;if(Q||U){const[F,t]=Zr(s);Q&&Uh(B,"x",F),U&&Uh(B,"y",t)}}}else Uh(B,I,s)}return B}function Uh(B,Q,F){const U=B.get(Q);void 0!==U?U.push(F):B.set(Q,[F])}function th(B,Q,F){if(null===B.facet||"super"===B.facet)return;const{fx:U,fy:t}=B;if(null!=U||null!=t){const Q=_b(B.data??U??t);if(void 0===Q)throw new Error(`missing facet data in ${B.ariaLabel}`);if(null===Q)return;const s={};return null!=U&&(s.fx=mu(Q,{value:U,scale:"fx"})),null!=t&&(s.fy=mu(Q,{value:t,scale:"fy"})),qL(s,F),{channels:s,groups:tr(Q,s)}}if(void 0===Q)return;const{channels:s,groups:I,data:g}=Q;if("auto"!==B.facet||B.data===g)return{channels:s,groups:I};g.length>0&&(I.size>1||1===I.size&&s.fx&&s.fy&&[...I][0][1].size>1)&&lo(_b(B.data))===lo(g)&&GG(`Warning: the ${B.ariaLabel} mark appears to use faceted data, but isn’t faceted. The mark data has the same length as the facet data and the mark facet option is "auto", but the mark data and facet data are distinct. If this mark should be faceted, set the mark facet option to true; otherwise, suppress this warning by setting the mark facet option to false.`)}function sh(B,Q={}){return tu({...Q,x:null,y:null},(Q,F,U,t,s,I)=>I.getMarkState(B))}function Ih(B,Q,F,U,t,s,I){if(!Q)return;const g=/^\s*both\s*$/i.test(Q);I=function(B,Q,{line:F=Q.line,ticks:U,tickSize:t,tickSpacing:s,tickPadding:I,tickFormat:g,tickRotate:i,fontVariant:l,ariaLabel:c,ariaDescription:e,label:n=Q.label,labelAnchor:d,labelArrow:C=Q.labelArrow,labelOffset:a}){return{anchor:B,line:F,ticks:U,tickSize:t,tickSpacing:s,tickPadding:I,tickFormat:g,tickRotate:i,fontVariant:l,ariaLabel:c,ariaDescription:e,label:n,labelAnchor:d,labelArrow:C,labelOffset:a}}(g?U:Q,s,I);const{line:i}=I;F!==WA&&F!==DA||!i||Ho(i)||B.push(function(B){return new HL(B)}(function(B){const{anchor:Q,line:F}=B;return{anchor:Q,facetAnchor:Q+"-empty",stroke:!0===F?void 0:F}}(I))),B.push(F(I)),g&&B.push(F({...I,anchor:t,label:null}))}function gh(B,Q,F,U){Q&&!Ho(Q)&&B.push(F(function(B,{stroke:Q=(Xo(B)?B:void 0),ticks:F=(ih(B)?B:void 0),tickSpacing:U,ariaLabel:t,ariaDescription:s}){return{stroke:Q,ticks:F,tickSpacing:U,ariaLabel:t,ariaDescription:s}}(Q,U)))}function ih(B){switch(typeof B){case"number":return!0;case"string":return!Xo(B)}return Ro(B)||"function"==typeof B?.range}function lh(B,Q){const F=`${Q}-axis `;return B.some(B=>B.ariaLabel?.startsWith(F))}function ch(B,Q){for(const F of Q)for(const Q in F.channels){const{scale:U}=F.channels[Q];if(U===B||"projection"===U)return!0}return!1}function eh(B){const Q=B.domain();if(0===Q.length)return[0,B.bandwidth()];let F=B(Q[0]),U=B(Q[Q.length-1]);return U<F&&([F,U]=[U,F]),[F,U+B.bandwidth()]}const nh=new Map([["basis",function(B){return new mC(B)}],["basis-closed",function(B){return new EC(B)}],["basis-open",function(B){return new NC(B)}],["bundle",pC],["bump-x",function(B){return new BC(B,!0)}],["bump-y",function(B){return new BC(B,!1)}],["cardinal",DC],["cardinal-closed",YC],["cardinal-open",vC],["catmull-rom",MC],["catmull-rom-closed",zC],["catmull-rom-open",OC],["linear",Pd],["linear-closed",function(B){return new jC(B)}],["monotone-x",function(B){return new Ba(B)}],["monotone-y",function(B){return new Qa(B)}],["natural",function(B){return new Ua(B)}],["step",function(B){return new sa(B,.5)}],["step-after",function(B){return new sa(B,1)}],["step-before",function(B){return new sa(B,0)}]]);function dh(B=Ch,Q){return"function"!=typeof B&&"auto"===`${B}`.toLowerCase()?Ch:function(B=Pd,Q){if("function"==typeof B)return B;const F=nh.get(`${B}`.toLowerCase());if(!F)throw new Error(`unknown curve: ${B}`);if(void 0!==Q){if("beta"in F)return F.beta(Q);if("tension"in F)return F.tension(Q);if("alpha"in F)return F.alpha(Q)}return F}(B,Q)}function Ch(B){return Pd(B)}function ah(B={y:"count"},Q={}){[B,Q]=function({cumulative:B,domain:Q,thresholds:F,interval:U,...t},s){return[t,{cumulative:B,domain:Q,thresholds:F,interval:U,...s}]}(B,Q);const{x:F,y:U}=Q;return function(B,Q,F,U,{data:t=xu,filter:s=Ru,sort:I,reverse:g,...i}={},l={}){B=oh(B),Q=oh(Q),i=function(B,Q){return function(B,Q,F=Cu){const U=Object.entries(B);return null!=Q.title&&void 0===B.title&&U.push(["title",Lu]),null!=Q.href&&void 0===B.href&&U.push(["href",Au]),U.filter(([,B])=>void 0!==B).map(([B,U])=>null===U?function(B){return{name:B,initialize(){},scope(){},reduce(){}}}(B):F(B,U,Q))}(B,Q,uh)}(i,l),t=rh(t,Wb),I=null==I?void 0:uh("sort",I,l),s=null==s?void 0:Gh("filter",s,l),null!=U&&du(i,"y","y1","y2")&&(U=null);const[c,e]=bo(B),[n,d]=bo(B),[C,a]=bo(Q),[b,o]=bo(Q),[u,G]=null!=U?[U,"y"]:[],[r,x]=bo(u),{x:A,y:L,z:h,fill:R,stroke:y,x1:V,x2:Z,y1:S,y2:m,domain:E,cumulative:N,thresholds:X,interval:p,...W}=l,[H,D]=bo(h),[f]=Kb(R),[Y]=Kb(y),[w,v]=bo(f),[J,k]=bo(Y);return{..."z"in l&&{z:H||h},..."fill"in l&&{fill:w||R},..."stroke"in l&&{stroke:J||y},...Uu(W,(F,U,l)=>{const c=Go(Vb(F,u),l?.[G]),n=Vb(F,h),C=Vb(F,f),b=Vb(F,Y),r=function(B,Q){for(const F in Q){const U=Q[F];if(void 0!==U&&!B.some(B=>B.name===F))return U}}(i,{z:n,fill:C,stroke:b}),A=[],L=[],R=c&&x([]),y=n&&D([]),V=C&&v([]),Z=b&&k([]),S=B&&e([]),m=B&&d([]),E=Q&&a([]),N=Q&&o([]),X=function(B,Q,F){const U=B?.(F),t=Q?.(F);return U&&t?function*(B){const Q=U.bin(B);for(const[B,[s,I]]of U.entries()){const U=t.bin(Q[B]);for(const[B,[Q,g]]of t.entries())yield[U[B],{data:F,x1:s,y1:Q,x2:I,y2:g}]}}:U?function*(B){const Q=U.bin(B);for(const[B,[t,s]]of U.entries())yield[Q[B],{data:F,x1:t,x2:s}]}:function*(B){const Q=t.bin(B);for(const[B,[U,s]]of t.entries())yield[Q[B],{data:F,y1:U,y2:s}]}}(B,Q,F);let p=0;for(const B of i)B.initialize(F);I&&I.initialize(F),s&&s.initialize(F);for(const B of U){const Q=[];for(const Q of i)Q.scope("facet",B);I&&I.scope("facet",B),s&&s.scope("facet",B);for(const[U,g]of bu(B,r))for(const[B,l]of bu(g,c))for(const[g,e]of X(l))if(r&&(e.z=U),!s||s.reduce(g,e)){Q.push(p++),L.push(t.reduceIndex(g,F,e)),c&&R.push(B),n&&y.push(r===n?U:n[(g.length>0?g:l)[0]]),C&&V.push(r===C?U:C[(g.length>0?g:l)[0]]),b&&Z.push(r===b?U:b[(g.length>0?g:l)[0]]),S&&(S.push(e.x1),m.push(e.x2)),E&&(E.push(e.y1),N.push(e.y2));for(const B of i)B.reduce(g,e);I&&I.reduce(g,e)}A.push(Q)}return function(B,Q,F){if(Q){const F=Q.output.transform(),U=(B,Q)=>wa(F[B],F[Q]);B.forEach(B=>B.sort(U))}F&&B.forEach(B=>B.reverse())}(A,I,g),{data:L,facets:A}}),...!du(i,"x")&&(c?{x1:c,x2:n,x:uo(c,n)}:{x:A,x1:V,x2:Z}),...!du(i,"y")&&(C?{y1:C,y2:b,y:uo(C,b)}:{y:L,y1:S,y2:m}),...r&&{[G]:r},...Object.fromEntries(i.map(({name:B,output:Q})=>[B,Q]))}}(function(B,{cumulative:Q,domain:F,thresholds:U,interval:t},s){void 0===(B={...ho(B)}).domain&&(B.domain=F);void 0===B.cumulative&&(B.cumulative=Q);void 0===B.thresholds&&(B.thresholds=U);void 0===B.interval&&(B.interval=t);void 0===B.value&&(B.value=s);return B.thresholds=function(B,Q,F=Ah){if(void 0===B)return void 0===Q?F:Ao(Q);if("string"==typeof B){switch(B.toLowerCase()){case"freedman-diaconis":return UQ;case"scott":return tQ;case"sturges":return KB;case"auto":return Ah}return ab(B)}return B}(B.thresholds,B.interval),B}(F,Q,Wb),null,0,U,B,Dx(Q))}function bh(B={}){return function(B,Q,F={}){if(null==F?.interval)return F;const{reduce:U=Au}=F,t={filter:null};return null!=F[Q]&&(t[Q]=U),null!=F[`${Q}1`]&&(t[`${Q}1`]=U),null!=F[`${Q}2`]&&(t[`${Q}2`]=U),B(t,F)}(ah,"y",nx(B,"x"))}function oh(B){if(null==B)return;const{value:Q,cumulative:F,domain:U=LB,thresholds:t}=B,s=B=>{let s,I=Vb(B,Q);if(Zo(I)||function(B){return function(B){return Lo(B)&&"function"==typeof B?.floor&&B.floor()instanceof Date}(B)||Ro(B)&&Zo(B)}(t)){I=Bo(I,zb,Float64Array);let[B,Q]="function"==typeof U?U(I):U,F="function"!=typeof t||Lo(t)?t:t(I,B,Q);"number"==typeof F&&(F=Ec(B,Q,F)),Lo(F)&&(U===LB&&(B=F.floor(B),Q=F.offset(F.floor(Q))),F=F.range(B,F.offset(Q))),s=F}else{I=kb(I);let[B,Q]="function"==typeof U?U(I):U,F="function"!=typeof t||Lo(t)?t:t(I,B,Q);if("number"==typeof F)if(U===LB){let U=TB(B,Q,F);if(isFinite(U))if(U>0){let t=Math.round(B/U),s=Math.round(Q/U);t*U<=B||--t,s*U>Q||++s;let I=s-t+1;F=new Float64Array(I);for(let B=0;B<I;++B)F[B]=(t+B)*U}else if(U<0){U=-U;let t=Math.round(B*U),s=Math.round(Q*U);t/U<=B||--t,s/U>Q||++s;let I=s-t+1;F=new Float64Array(I);for(let B=0;B<I;++B)F[B]=(t+B)/U}else F=[B];else F=[B]}else F=MB(B,Q,F);else Lo(F)&&(U===LB&&(B=F.floor(B),Q=F.offset(F.floor(Q))),F=F.range(B,F.offset(Q)));s=F}const g=[];if(1===s.length)g.push([s[0],s[0]]);else for(let B=1;B<s.length;++B)g.push([s[B-1],s[B]]);return g.bin=(F<0?Rh:F>0?hh:Lh)(g,s,I),g};return s.label=oo(Q),s}function uh(B,Q,F){return Cu(B,Q,F,Gh)}function Gh(B,Q,F){return au(B,Q,F,rh)}function rh(B,Q){return ou(B,Q,xh)}function xh(B){switch(`${B}`.toLowerCase()){case"x":return Vh;case"x1":return Sh;case"x2":return mh;case"y":return Zh;case"y1":return Eh;case"y2":return Nh;case"z":return Su}throw new Error(`invalid bin reduce: ${B}`)}function Ah(B,Q,F){return Math.min(200,tQ(B,Q,F))}function Lh(B,Q,F){return Q=kb(Q),U=>{const t=B.map(()=>[]);for(const B of U)t[aB(Q,F[B])-1]?.push(B);return t}}function hh(B,Q,F){const U=Lh(B,Q,F);return B=>{const Q=U(B);for(let B=1,F=Q.length;B<F;++B){const F=Q[B-1],U=Q[B];for(const B of F)U.push(B)}return Q}}function Rh(B,Q,F){const U=Lh(B,Q,F);return B=>{const Q=U(B);for(let B=Q.length-2;B>=0;--B){const F=Q[B+1],U=Q[B];for(const B of F)U.push(B)}return Q}}function yh(B,Q){const F=(+B+ +Q)/2;return B instanceof Date?new Date(F):F}const Vh={reduceIndex:(B,Q,{x1:F,x2:U})=>yh(F,U)},Zh={reduceIndex:(B,Q,{y1:F,y2:U})=>yh(F,U)},Sh={reduceIndex:(B,Q,{x1:F})=>F},mh={reduceIndex:(B,Q,{x2:F})=>F},Eh={reduceIndex:(B,Q,{y1:F})=>F},Nh={reduceIndex:(B,Q,{y2:F})=>F},Xh={ariaLabel:"dot",fill:"none",stroke:"currentColor",strokeWidth:1.5};function ph(B){return void 0===B.sort&&void 0===B.reverse?function(B,{sort:Q,...F}={}){return{...(so(B)&&void 0!==B.channel?tu:gu)(F,cu(B)),sort:Io(Q)?Q:null}}({channel:"-r"},B):B}class Wh extends ix{constructor(B,Q={}){const{x:F,y:U,r:t,rotate:s,symbol:I=UC,frameAnchor:g}=Q,[i,l]=Ob(s,0),[c,e]=function(B){if(null==B||Bu(B))return[void 0,B];if("string"==typeof B){const Q=qo.get(`${B}`.toLowerCase());if(Q)return[void 0,Q]}return[B,void 0]}(I),[n,d]=Ob(t,null==c?3:4.5);super(B,{x:{value:F,scale:"x",optional:!0},y:{value:U,scale:"y",optional:!0},r:{value:n,scale:"r",filter:Ma,optional:!0},rotate:{value:i,optional:!0},symbol:{value:c,scale:"auto",optional:!0}},ph(Q),Xh),this.r=d,this.rotate=l,this.symbol=e,this.frameAnchor=fo(g);const{channels:C}=this,{symbol:a}=C;if(a){const{fill:B,stroke:Q}=C;a.hint={fill:B?B.value===a.value?"color":"currentColor":this.fill??"currentColor",stroke:Q?Q.value===a.value?"color":"currentColor":this.stroke??"none"}}}render(B,Q,F,U,t){const{x:s,y:I}=Q,{x:g,y:i,r:l,rotate:c,symbol:e}=F,{r:n,rotate:d,symbol:C}=this,[a,b]=gx(this,U),o=C===UC,u=l?void 0:n*n*Math.PI;return Ta(n)&&(B=[]),mr("svg:g",t).call(_r,this,U,t).call(Qx,this,{x:g&&s,y:i&&I}).call(Q=>Q.selectAll().data(B).enter().append(o?"circle":"path").call($r,this).call(o?B=>{B.attr("cx",g?B=>g[B]:a).attr("cy",i?B=>i[B]:b).attr("r",l?B=>l[B]:n)}:B=>{B.attr("transform",jx`translate(${g?B=>g[B]:a},${i?B=>i[B]:b})${c?B=>` rotate(${c[B]})`:d?` rotate(${d})`:""}`).attr("d",l&&e?B=>{const Q=Js();return e[B].draw(Q,l[B]*l[B]*Math.PI),Q}:l?B=>{const Q=Js();return C.draw(Q,l[B]*l[B]*Math.PI),Q}:e?B=>{const Q=Js();return e[B].draw(Q,u),Q}:(()=>{const B=Js();return C.draw(B,u),B})())}).call(Mr,this,F)).node()}}function Hh(B,{x:Q,y:F,...U}={}){return void 0===U.frameAnchor&&([Q,F]=go(Q,F)),new Wh(B,{...U,x:Q,y:F})}const Dh={ariaLabel:"line",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round",strokeMiterlimit:1};class fh extends ix{constructor(B,Q={}){const{x:F,y:U,z:t,curve:s,tension:I}=Q;super(B,{x:{value:F,scale:"x"},y:{value:U,scale:"y"},z:{value:io(Q),optional:!0}},Q,Dh),this.z=t,this.curve=dh(s,I),hx(this,Q)}filter(B){return B}project(B,Q,F){this.curve!==Ch&&super.project(B,Q,F)}render(B,Q,F,U,t){const{x:s,y:I}=F,{curve:g}=this;return mr("svg:g",t).call(_r,this,U,t).call(Qx,this,Q).call(Q=>Q.selectAll().data(zr(B,[s,I],this,F)).enter().append("path").call($r,this).call(Tr,this,F).call(Xx,this,F,t).attr("d",g===Ch&&t.projection?function(B,Q,F){return Q=kb(Q),F=kb(F),U=>{let t=[];const s=[t];for(const B of U)-1===B?(t=[],s.push(t)):t.push([Q[B],F[B]]);return B({type:"MultiLineString",coordinates:s})}}(t.path(),s,I):qd().curve(g).defined(B=>B>=0).x(B=>s[B]).y(B=>I[B]))).node()}}function Yh(B,{x:Q=pb,y:F=Wb,...U}={}){return new fh(B,bh({...U,x:Q,y:F}))}function wh(B,Q,F){var U=Q,t=function(B){return atob(B)}(B),s=t.indexOf("\n",10)+1,I=t.substring(s)+"//# sourceMappingURL="+U,g=new Blob([I],{type:"application/javascript"});return URL.createObjectURL(g)}function vh(B,Q,F){var U;return function(F){return U=U||wh(B,Q),new Worker(U,F)}}ix.prototype.plot=function({marks:B=[],...Q}={}){return OL({...Q,marks:[...B,this]})};var Jh=vh("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgdmFyIGRpc3RyaWJ1dGlvbnMkMSA9IHtleHBvcnRzOiB7fX07CgogIHZhciBkaXN0cmlidXRpb25zID0gZGlzdHJpYnV0aW9ucyQxLmV4cG9ydHM7CiAgKGZ1bmN0aW9uIChtb2R1bGUpIHsKCiAgICAvLyBBIG51bWJlciBvZiBsb2cgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbnMgKFBERikuIE5hbWluZyBhbmQgcGFyYW1ldGVyaXphdGlvbgogICAgLy8gc2hvdWxkIG1hdGNoIFIncywgZXhjZXB0IGZvciB0aGF0IGFsbCBmdW5jdGlvbnMgcmVzaWRlIGluIGFuIGxkIG9iamVjdCAoCiAgICAvLyBhcyBpbiAibG9nIGRlbnNpdHkiKSwgc28gdG8gZ2V0IGEgbm9ybWFsIGxvZyBkZW5zaXR5IHlvdSB3b3VsZCB3cml0ZQogICAgLy8gbGQubm9ybSguLi4pLgogICAgLy8gTW9zdCBvZiB0aGUgY29kZSBiZWxvdyBpcyBkaXJlY3RseSB0YWtlbiBmcm9tIHRoZSBncmVhdCBKc3RhdCBwcm9qZWN0CiAgICAvLyAoaHR0cHM6Ly9naXRodWIuY29tL2pzdGF0Lykgd2hpY2ggaW5jbHVkZXMgUERGIGZvciBtYW55IGNvbW1vbiBwcm9iYWJpbGl0eQogICAgLy8gZGlzdHJpYnV0aW9ucy4gV2hhdCBJIGhhdmUgZG9uZSBpcyBvbmx5IHRvIGNvbnZlcnQgdGhlc2UgdG8gbG9nIFBERnMuCgogICAgLyoKICAgIE9yaWdpbmFsIHdvcmsgQ29weXJpZ2h0IChjKSAyMDEzIGpTdGF0CiAgICBNb2RpZmllZCB3b3JrIENvcHlyaWdodCAoYykgMjAxNSBSYXNtdXMgQsOlw6V0aCAKICAgIAlQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiAgICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAogICAgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwogICAgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAogICAgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCiAgICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogICAgCVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCiAgICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KICAgIAlUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogICAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKICAgIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKICAgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCiAgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCiAgICBUSEUgU09GVFdBUkUuCiAgICAJKi8KCiAgICAvLyBUaGlzIGJvaWxlciBwbGF0ZSBjb2RlIGhlcmUgaXMgdGFrZW4gZnJvbToKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS91bWRqcy91bWQvYmxvYi9tYXN0ZXIvdGVtcGxhdGVzL3JldHVybkV4cG9ydHMuanMKICAgIC8vIEl0IHNob3VsZCBtYWtlIHNodXJlIHRoYXQgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBib3RoIGluIHRoZSBicm93c2VyLAogICAgLy8gTm9kZSwgYW5kIGJ5IHVzaW5nIHRoZSBBc3luY2hyb25vdXMgTW9kdWxlIERlZmluaXRpb24gc3RhbmRhcmQuCiAgICAvLyBJZiB0aGlzIG1vZHVsZSBpcyBsb2FkZWQgaW4gdGhlIGJyb3dzZXIgaXQgd2lsbCBjcmVhdGVkIHRoZSBnbG9iYWwKICAgIC8vIG9iamVjdCBsZCAuCiAgICAoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHsKICAgICAgaWYgKG1vZHVsZS5leHBvcnRzKSB7CiAgICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0CiAgICAgICAgLy8gb25seSBDb21tb25KUy1saWtlIGVudmlyb25tZW50cyB0aGF0IHN1cHBvcnQgbW9kdWxlLmV4cG9ydHMsCiAgICAgICAgLy8gbGlrZSBOb2RlLgogICAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFscyAocm9vdCBpcyB3aW5kb3cpCiAgICAgICAgcm9vdC5sZCA9IGZhY3RvcnkoKTsKICAgICAgfQogICAgfSkoZGlzdHJpYnV0aW9ucywgZnVuY3Rpb24gKCkgewogICAgICAvLyBPYmplY3QgdG8gaG9sZCB0aGUgZnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkLgogICAgICB2YXIgbGQgPSB7fTsKCiAgICAgIC8vLy8vLy8vLy8gSGVscGVyIGZ1bmN0aW9ucyAvLy8vLy8vLy8vCiAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICB2YXIgbGdhbW1hID0gZnVuY3Rpb24gKHgpIHsKICAgICAgICB2YXIgaiA9IDA7CiAgICAgICAgdmFyIGNvZiA9IFs3Ni4xODAwOTE3Mjk0NzE0NiwgLTg2LjUwNTMyMDMyOTQxNjc4LCAyNC4wMTQwOTgyNDA4MzA5MSwgLTEuMjMxNzM5NTcyNDUwMTU1LCAwLjEyMDg2NTA5NzM4NjYxNzllLTIsIC01Mzk1MjM5Mzg0OTUzZS0xOF07CiAgICAgICAgdmFyIHNlciA9IDEuMDAwMDAwMDAwMTkwMDE1OwogICAgICAgIHZhciB4eCwgeSwgdG1wOwogICAgICAgIHRtcCA9ICh5ID0geHggPSB4KSArIDUuNTsKICAgICAgICB0bXAgLT0gKHh4ICsgMC41KSAqIGxvZyh0bXApOwogICAgICAgIGZvciAoOyBqIDwgNjsgaisrKSBzZXIgKz0gY29mW2pdIC8gKyt5OwogICAgICAgIHJldHVybiBsb2coMi41MDY2MjgyNzQ2MzEwMDA1ICogc2VyIC8geHgpIC0gdG1wOwogICAgICB9OwogICAgICBsZC5sZ2FtbWEgPSBsZ2FtbWE7CiAgICAgIHZhciBsZmFjdG9yaWFsID0gZnVuY3Rpb24gKG4pIHsKICAgICAgICByZXR1cm4gbiA8IDAgPyBOYU4gOiBsZ2FtbWEobiArIDEpOwogICAgICB9OwogICAgICBsZC5sZmFjdG9yaWFsID0gbGZhY3RvcmlhbDsKICAgICAgdmFyIGxjaG9vc2UgPSBmdW5jdGlvbiAobiwgaykgewogICAgICAgIHJldHVybiBsZmFjdG9yaWFsKG4pIC0gbGZhY3RvcmlhbChrKSAtIGxmYWN0b3JpYWwobiAtIGspOwogICAgICB9OwogICAgICBsZC5sY2hvb3NlID0gbGNob29zZTsKICAgICAgdmFyIGxiZXRhID0gZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICByZXR1cm4gbGdhbW1hKGEpICsgbGdhbW1hKGIpIC0gbGdhbW1hKGEgKyBiKTsKICAgICAgfTsKICAgICAgbGQubGJldGEgPSBsYmV0YTsKICAgICAgdmFyIGxvZyA9IE1hdGgubG9nOwogICAgICB2YXIgZXhwID0gTWF0aC5leHA7CiAgICAgIHZhciBhYnMgPSBNYXRoLmFiczsKICAgICAgdmFyIHBvdyA9IE1hdGgucG93OwogICAgICB2YXIgc3FydCA9IE1hdGguc3FydDsKICAgICAgdmFyIHBpID0gTWF0aC5QSTsKCiAgICAgIC8vLy8vLy8vLy8gQ29udGlub3VzIGRpc3RyaWJ1dGlvbnMgLy8vLy8vLy8vLwogICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgIGxkLmJldGEgPSBmdW5jdGlvbiAoeCwgc2hhcGUxLCBzaGFwZTIpIHsKICAgICAgICBpZiAoeCA+IDEgfHwgeCA8IDApIHsKICAgICAgICAgIHJldHVybiAtSW5maW5pdHk7CiAgICAgICAgfQogICAgICAgIGlmIChzaGFwZTEgPT09IDEgJiYgc2hhcGUyID09PSAxKSB7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIChzaGFwZTEgLSAxKSAqIGxvZyh4KSArIChzaGFwZTIgLSAxKSAqIGxvZygxIC0geCkgLSBsYmV0YShzaGFwZTEsIHNoYXBlMik7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZC5jYXVjaHkgPSBmdW5jdGlvbiAoeCwgbG9jYXRpb24sIHNjYWxlKSB7CiAgICAgICAgcmV0dXJuIGxvZyhzY2FsZSkgLSBsb2cocG93KHggLSBsb2NhdGlvbiwgMikgKyBwb3coc2NhbGUsIDIpKSAtIGxvZyhwaSk7CiAgICAgIH07CiAgICAgIGxkLm5vcm0gPSBmdW5jdGlvbiAoeCwgbWVhbiwgc2QpIHsKICAgICAgICByZXR1cm4gLTAuNSAqIGxvZygyICogcGkpIC0gbG9nKHNkKSAtIHBvdyh4IC0gbWVhbiwgMikgLyAoMiAqIHNkICogc2QpOwogICAgICB9OwoKICAgICAgLy8gQSBiaXZhcmlhdGUgTm9ybWFsIGRpc3RyaWJ1dGlvbiBwYXJhbWV0ZXJpemVkIGJ5IGFycmF5cyBvZiB0d28gbWVhbnMgYW5kIFNEcywgYW5kIAogICAgICAvLyB0aGUgY29ycmVsYXRpb24uCiAgICAgIGxkLmJpdmFybm9ybSA9IGZ1bmN0aW9uICh4LCBtZWFuLCBzZCwgY29ycikgewogICAgICAgIHZhciB6ID0gcG93KHhbMF0gLSBtZWFuWzBdLCAyKSAvIHBvdyhzZFswXSwgMikgKyBwb3coeFsxXSAtIG1lYW5bMV0sIDIpIC8gcG93KHNkWzFdLCAyKSAtIDIgKiBjb3JyICogKHhbMF0gLSBtZWFuWzBdKSAqICh4WzFdIC0gbWVhblsxXSkgLyAoc2RbMF0gKiBzZFsxXSk7CiAgICAgICAgdmFyIG5vcm1hbGl6aW5nX2ZhY3RvciA9IC0obG9nKDIpICsgbG9nKHBpKSArIGxvZyhzZFswXSkgKyBsb2coc2RbMV0pICsgMC41ICogbG9nKDEgLSBwb3coY29yciwgMikpKTsKICAgICAgICB2YXIgYml2YXJfbG9nX2RlbnMgPSBub3JtYWxpemluZ19mYWN0b3IgLSB6IC8gKDIgKiAoMSAtIHBvdyhjb3JyLCAyKSkpOwogICAgICAgIHJldHVybiBiaXZhcl9sb2dfZGVuczsKICAgICAgfTsKICAgICAgbGQubGFwbGFjZSA9IGZ1bmN0aW9uICh4LCBsb2NhdGlvbiwgc2NhbGUpIHsKICAgICAgICByZXR1cm4gLWFicyh4IC0gbG9jYXRpb24pIC8gc2NhbGUgLSBsb2coMiAqIHNjYWxlKTsKICAgICAgfTsKICAgICAgbGQuZGV4cCA9IGxkLmxhcGxhY2U7CiAgICAgIGxkLmdhbW1hID0gZnVuY3Rpb24gKHgsIHNoYXBlLCByYXRlKSB7CiAgICAgICAgdmFyIHNjYWxlID0gMSAvIHJhdGU7CiAgICAgICAgaWYgKHggPCAwKSB7CiAgICAgICAgICByZXR1cm4gLUluZmluaXR5OwogICAgICAgIH0KICAgICAgICBpZiAoeCA9PT0gMCAmJiBzaGFwZSA9PT0gMSkgewogICAgICAgICAgcmV0dXJuIC1sb2coc2NhbGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gKHNoYXBlIC0gMSkgKiBsb2coeCkgLSB4IC8gc2NhbGUgLSBsZ2FtbWEoc2hhcGUpIC0gc2hhcGUgKiBsb2coc2NhbGUpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgbGQuaW52Z2FtbWEgPSBmdW5jdGlvbiAoeCwgc2hhcGUsIHNjYWxlKSB7CiAgICAgICAgaWYgKHggPD0gMCkgewogICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIC0oc2hhcGUgKyAxKSAqIGxvZyh4KSAtIHNjYWxlIC8geCAtIGxnYW1tYShzaGFwZSkgKyBzaGFwZSAqIGxvZyhzY2FsZSk7CiAgICAgIH07CiAgICAgIGxkLmxub3JtID0gZnVuY3Rpb24gKHgsIG1lYW5sb2csIHNkbG9nKSB7CiAgICAgICAgaWYgKHggPD0gMCkgewogICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIC1sb2coeCkgLSAwLjUgKiBsb2coMiAqIHBpKSAtIGxvZyhzZGxvZykgLSBwb3cobG9nKHgpIC0gbWVhbmxvZywgMikgLyAoMiAqIHNkbG9nICogc2Rsb2cpOwogICAgICB9OwogICAgICBsZC5wYXJldG8gPSBmdW5jdGlvbiAoeCwgc2NhbGUsIHNoYXBlKSB7CiAgICAgICAgaWYgKHggPCBzY2FsZSkgewogICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxvZyhzaGFwZSkgKyBzaGFwZSAqIGxvZyhzY2FsZSkgLSAoc2hhcGUgKyAxKSAqIGxvZyh4KTsKICAgICAgfTsKICAgICAgbGQudCA9IGZ1bmN0aW9uICh4LCBsb2NhdGlvbiwgc2NhbGUsIGRmKSB7CiAgICAgICAgZGYgPSBkZiA+IDFlMTAwID8gMWUxMDAgOiBkZjsKICAgICAgICByZXR1cm4gbGdhbW1hKChkZiArIDEpIC8gMikgLSBsZ2FtbWEoZGYgLyAyKSAtIGxvZyhzcXJ0KHBpICogZGYpICogc2NhbGUpICsgbG9nKHBvdygxICsgMSAvIGRmICogcG93KCh4IC0gbG9jYXRpb24pIC8gc2NhbGUsIDIpLCAtKGRmICsgMSkgLyAyKSk7CiAgICAgIH07CgogICAgICAvLyBUaGlzIGlzIGEgZGlyZWN0IGphdmFzY3JpcHQgdHJhbnNsYXRpb24gb2YgdGhlIFIgY29kZSB1c2VkIHRvIGV2YWx1YXRlCiAgICAgIC8vIHRoZSBsb2cgZGVuc2l0eSBvZiBhIHdlaWJ1bGwgZGlzdHJpYnV0aW9uOiAKICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3djaC9yLXNvdXJjZS9ibG9iL2IxNTZlM2E3MTE5NjdmNTgxMzFlMjNjMWIxZGMxZWE5MGUyZjBjNDMvc3JjL25tYXRoL2R3ZWlidWxsLmMKICAgICAgbGQud2VpYnVsbCA9IGZ1bmN0aW9uICh4LCBzaGFwZSwgc2NhbGUpIHsKICAgICAgICBpZiAoeCA8IDApIHJldHVybiAtSW5maW5pdHk7CiAgICAgICAgaWYgKHggPT09IDAgJiYgc2hhcGUgPCAxKSByZXR1cm4gSW5maW5pdHk7CiAgICAgICAgdmFyIHRtcDEgPSBwb3coeCAvIHNjYWxlLCBzaGFwZSAtIDEpOwogICAgICAgIHZhciB0bXAyID0gdG1wMSAqICh4IC8gc2NhbGUpOwogICAgICAgIHJldHVybiAtdG1wMiArIGxvZyhzaGFwZSAqIHRtcDEgLyBzY2FsZSk7CiAgICAgIH07CgogICAgICAvLyBUaGlzIGlzIGEgZGlyZWN0IGphdmFzY3JpcHQgdHJhbnNsYXRpb24gb2YgdGhlIFIgY29kZSB1c2VkIHRvIGV2YWx1YXRlCiAgICAgIC8vIHRoZSBsb2cgZGVuc2l0eSBvZiBhIGxvZ2lzdGljIGRpc3RyaWJ1dGlvbjogCiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93Y2gvci1zb3VyY2UvYmxvYi9iMTU2ZTNhNzExOTY3ZjU4MTMxZTIzYzFiMWRjMWVhOTBlMmYwYzQzL3NyYy9ubWF0aC9kbG9naXMuYwogICAgICBsZC5sb2dpcyA9IGZ1bmN0aW9uICh4LCBsb2NhdGlvbiwgc2NhbGUpIHsKICAgICAgICB4ID0gYWJzKCh4IC0gbG9jYXRpb24pIC8gc2NhbGUpOwogICAgICAgIHZhciBlID0gZXhwKC14KTsKICAgICAgICB2YXIgZiA9IDEuMCArIGU7CiAgICAgICAgcmV0dXJuIC0oeCArIGxvZyhzY2FsZSAqIGYgKiBmKSk7CiAgICAgIH07CiAgICAgIGxkLmRpcmljaGxldCA9IGZ1bmN0aW9uICh4LCBhbHBoYSkgewogICAgICAgIHZhciBzdW1fYWxwaGEgPSAwOwogICAgICAgIHZhciBzdW1fbGdhbW1hX2FscGhhID0gMDsKICAgICAgICB2YXIgc3VtX2FscGhhX3N1Yl8xX2xvZ194ID0gMDsKICAgICAgICB2YXIgbiA9IGFscGhhLmxlbmd0aDsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgICAgc3VtX2FscGhhICs9IGFscGhhW2ldOwogICAgICAgICAgc3VtX2xnYW1tYV9hbHBoYSArPSBsZ2FtbWEoYWxwaGFbaV0pOwogICAgICAgICAgc3VtX2FscGhhX3N1Yl8xX2xvZ194ICs9IChhbHBoYVtpXSAtIDEpICogbG9nKHhbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGdhbW1hKHN1bV9hbHBoYSkgLSBzdW1fbGdhbW1hX2FscGhhICsgc3VtX2FscGhhX3N1Yl8xX2xvZ194OwogICAgICB9OwogICAgICBsZC5leHAgPSBmdW5jdGlvbiAoeCwgcmF0ZSkgewogICAgICAgIHJldHVybiB4IDwgMCA/IC1JbmZpbml0eSA6IGxvZyhyYXRlKSAtIHJhdGUgKiB4OwogICAgICB9OwogICAgICBsZC51bmlmID0gZnVuY3Rpb24gKHgsIG1pbiwgbWF4KSB7CiAgICAgICAgcmV0dXJuIHggPCBtaW4gfHwgeCA+IG1heCA/IC1JbmZpbml0eSA6IGxvZygxIC8gKG1heCAtIG1pbikpOwogICAgICB9OwoKICAgICAgLy8vLy8vLy8vLyBEaXNjcmV0ZSBkaXN0cmlidXRpb25zIC8vLy8vLy8vLy8KICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgIGxkLmJlcm4gPSBmdW5jdGlvbiAoeCwgcHJvYikgewogICAgICAgIHJldHVybiAhKHggPT09IDAgfHwgeCA9PT0gMSkgPyAtSW5maW5pdHkgOiBsb2coeCAqIHByb2IgKyAoMSAtIHgpICogKDEgLSBwcm9iKSk7CiAgICAgIH07CiAgICAgIGxkLmNhdCA9IGZ1bmN0aW9uICh4LCBwcm9icykgewogICAgICAgIGlmICh4IDwgMSB8fCB4ID4gcHJvYnMubGVuZ3RoKSB7CiAgICAgICAgICByZXR1cm4gLUluZmluaXR5OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gbG9nKHByb2JzW3ggLSAxXSk7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZC5iaW5vbSA9IGZ1bmN0aW9uICh4LCBzaXplLCBwcm9iKSB7CiAgICAgICAgaWYgKHggPiBzaXplIHx8IHggPCAwKSB7CiAgICAgICAgICByZXR1cm4gLUluZmluaXR5OwogICAgICAgIH0KICAgICAgICBpZiAocHJvYiA9PT0gMCB8fCBwcm9iID09PSAxKSB7CiAgICAgICAgICByZXR1cm4gc2l6ZSAqIHByb2IgPT09IHggPyAwIDogLUluZmluaXR5OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGNob29zZShzaXplLCB4KSArIHggKiBsb2cocHJvYikgKyAoc2l6ZSAtIHgpICogbG9nKDEgLSBwcm9iKTsKICAgICAgfTsKICAgICAgbGQubmJpbm9tID0gZnVuY3Rpb24gKHgsIHNpemUsIHByb2IpIHsKICAgICAgICBpZiAoeCA8IDApIHsKICAgICAgICAgIHJldHVybiAtSW5maW5pdHk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsY2hvb3NlKHggKyBzaXplIC0gMSwgc2l6ZSAtIDEpICsgeCAqIGxvZygxIC0gcHJvYikgKyBzaXplICogbG9nKHByb2IpOwogICAgICB9OwogICAgICBsZC5oeXBlciA9IGZ1bmN0aW9uICh4LCBtLCBuLCBrKSB7CiAgICAgICAgaWYgKHggPCAwIHx8IHggPiBrKSB7CiAgICAgICAgICByZXR1cm4gLUluZmluaXR5OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gbGNob29zZShtLCB4KSArIGxjaG9vc2UobiwgayAtIHgpIC0gbGNob29zZShtICsgbiwgayk7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZC5wb2lzID0gZnVuY3Rpb24gKHgsIGxhbWJkYSkgewogICAgICAgIHJldHVybiB4IDwgMCA/IC1JbmZpbml0eSA6IGxvZyhsYW1iZGEpICogeCAtIGxhbWJkYSAtIGxmYWN0b3JpYWwoeCk7CiAgICAgIH07CiAgICAgIHJldHVybiBsZDsKICAgIH0pOwogIH0pKGRpc3RyaWJ1dGlvbnMkMSk7CiAgdmFyIGRpc3RyaWJ1dGlvbnNFeHBvcnRzID0gZGlzdHJpYnV0aW9ucyQxLmV4cG9ydHM7CgogIHZhciBtY21jJDEgPSB7ZXhwb3J0czoge319OwoKICB2YXIgbWNtYyA9IG1jbWMkMS5leHBvcnRzOwogIChmdW5jdGlvbiAobW9kdWxlKSB7CgogICAgLy8gVGhpcyBib2lsZXIgcGxhdGUgY29kZSBoZXJlIGlzIHRha2VuIGZyb206CiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdW1kanMvdW1kL2Jsb2IvbWFzdGVyL3RlbXBsYXRlcy9yZXR1cm5FeHBvcnRzLmpzCiAgICAvLyBJdCBzaG91bGQgbWFrZSBzaHVyZSB0aGF0IG1vZHVsZSBjYW4gYmUgaW1wb3J0ZWQgYm90aCBpbiB0aGUgYnJvd3NlciwKICAgIC8vIE5vZGUsIGFuZCBieSB1c2luZyB0aGUgQXN5bmNocm9ub3VzIE1vZHVsZSBEZWZpbml0aW9uIHN0YW5kYXJkLgogICAgLy8gSWYgdGhpcyBtb2R1bGUgaXMgbG9hZGVkIGluIHRoZSBicm93c2VyIGl0IHdpbGwgY3JlYXRlZCB0aGUgZ2xvYmFsCiAgICAvLyBvYmplY3QgbWNtYyAuCiAgICAoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHsKICAgICAgaWYgKG1vZHVsZS5leHBvcnRzKSB7CiAgICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0CiAgICAgICAgLy8gb25seSBDb21tb25KUy1saWtlIGVudmlyb25tZW50cyB0aGF0IHN1cHBvcnQgbW9kdWxlLmV4cG9ydHMsCiAgICAgICAgLy8gbGlrZSBOb2RlLgogICAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFscyAocm9vdCBpcyB3aW5kb3cpCiAgICAgICAgcm9vdC5tY21jID0gZmFjdG9yeSgpOwogICAgICB9CiAgICB9KShtY21jLCBmdW5jdGlvbiAoKSB7CiAgICAgIC8vLyBUaGUgYWN0dWFsIG1vZHVsZSBjb2RlIHN0YXJ0cyBoZXJlIC8vLwogICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gIAoKICAgICAgLy8vLy8vLy8vLyBIZWxwZXIgRnVuY3Rpb25zIC8vLy8vLy8vLy8KICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgIC8qKiBSZXR1cm5zIGEgcmFuZG9tIHJlYWwgbnVtYmVyIGJldHdlZW4gbWluIGFuZCBtYXggKi8KICAgICAgdmFyIHJ1bmlmID0gZnVuY3Rpb24gKG1pbiwgbWF4KSB7CiAgICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSArIG1pbjsKICAgICAgfTsKCiAgICAgIC8qKiBSZXR1cm5zIGEgcmFuZG9tIGludGVnZXIgYmV0d2VlbiBtaW4gYW5kIG1heCAqLwogICAgICB2YXIgcnVuaWZfZGlzY3JldGUgPSBmdW5jdGlvbiAobWluLCBtYXgpIHsKICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKSArIG1pbjsKICAgICAgfTsKCiAgICAgIC8qKiBSZXR1cm5zIGEgcmFuZG9tIHJlYWwgbnVtYmVyIGZyb20gYSBub3JtYWwgZGlzdHJpYmJ1dGlvbiBkZWZpbmVkCiAgICAgICAqICBieSBtZWFuIGFuZCBzZC4gCiAgICAgICAqICBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2pzdGF0L2pzdGF0L2Jsb2IvbWFzdGVyL3NyYy9zcGVjaWFsLmpzICovCiAgICAgIHZhciBybm9ybSA9IGZ1bmN0aW9uIChtZWFuLCBzZCkgewogICAgICAgIHZhciB1LCB2LCB4LCB5LCBxOwogICAgICAgIGRvIHsKICAgICAgICAgIHUgPSBNYXRoLnJhbmRvbSgpOwogICAgICAgICAgdiA9IDEuNzE1NiAqIChNYXRoLnJhbmRvbSgpIC0gMC41KTsKICAgICAgICAgIHggPSB1IC0gMC40NDk4NzE7CiAgICAgICAgICB5ID0gTWF0aC5hYnModikgKyAwLjM4NjU5NTsKICAgICAgICAgIHEgPSB4ICogeCArIHkgKiAoMC4xOTYwMCAqIHkgLSAwLjI1NDcyICogeCk7CiAgICAgICAgfSB3aGlsZSAocSA+IDAuMjc1OTcgJiYgKHEgPiAwLjI3ODQ2IHx8IHYgKiB2ID4gLTQgKiBNYXRoLmxvZyh1KSAqIHUgKiB1KSk7CiAgICAgICAgcmV0dXJuIHYgLyB1ICogc2QgKyBtZWFuOwogICAgICB9OwoKICAgICAgLyoqIFJldHVybnMgYSBkZWVwIGNsb25lIG9mIHNyYywgc29ydCBvZi4uLiBJdCBvbmx5IGNvcGllcyBhIGxpbWl0ZWQKICAgICAgICogbnVtYmVyIG9mIHR5cGVzIGFuZCwgZm9yIGV4YW1wbGUsIGZ1bmN0aW9uIGFyZSBub3QgY29waWVkLiAKICAgICAgICogRnJvbSBodHRwOi8vZGF2aWR3YWxzaC5uYW1lL2phdmFzY3JpcHQtY2xvbmUKICAgICAgICovCiAgICAgIHZhciBkZWVwX2Nsb25lID0gZnVuY3Rpb24gKHNyYykgewogICAgICAgIGZ1bmN0aW9uIG1peGluKGRlc3QsIHNvdXJjZSwgY29weUZ1bmMpIHsKICAgICAgICAgIHZhciBuYW1lLAogICAgICAgICAgICBzLAogICAgICAgICAgICBlbXB0eSA9IHt9OwogICAgICAgICAgZm9yIChuYW1lIGluIHNvdXJjZSkgewogICAgICAgICAgICAvLyB0aGUgKCEobmFtZSBpbiBlbXB0eSkgfHwgZW1wdHlbbmFtZV0gIT09IHMpIGNvbmRpdGlvbiBhdm9pZHMgY29weWluZyBwcm9wZXJ0aWVzIGluICJzb3VyY2UiCiAgICAgICAgICAgIC8vIGluaGVyaXRlZCBmcm9tIE9iamVjdC5wcm90b3R5cGUuCSBGb3IgZXhhbXBsZSwgaWYgZGVzdCBoYXMgYSBjdXN0b20gdG9TdHJpbmcoKSBtZXRob2QsCiAgICAgICAgICAgIC8vIGRvbid0IG92ZXJ3cml0ZSBpdCB3aXRoIHRoZSB0b1N0cmluZygpIG1ldGhvZCB0aGF0IHNvdXJjZSBpbmhlcml0ZWQgZnJvbSBPYmplY3QucHJvdG90eXBlCiAgICAgICAgICAgIHMgPSBzb3VyY2VbbmFtZV07CiAgICAgICAgICAgIGlmICghKG5hbWUgaW4gZGVzdCkgfHwgZGVzdFtuYW1lXSAhPT0gcyAmJiAoIShuYW1lIGluIGVtcHR5KSB8fCBlbXB0eVtuYW1lXSAhPT0gcykpIHsKICAgICAgICAgICAgICBkZXN0W25hbWVdID0gY29weUZ1bmMgPyBjb3B5RnVuYyhzKSA6IHM7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBkZXN0OwogICAgICAgIH0KICAgICAgICBpZiAoIXNyYyB8fCB0eXBlb2Ygc3JjICE9ICJvYmplY3QiIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzcmMpID09PSAiW29iamVjdCBGdW5jdGlvbl0iKSB7CiAgICAgICAgICAvLyBudWxsLCB1bmRlZmluZWQsIGFueSBub24tb2JqZWN0LCBvciBmdW5jdGlvbgogICAgICAgICAgcmV0dXJuIHNyYzsgLy8gYW55dGhpbmcKICAgICAgICB9CiAgICAgICAgaWYgKHNyYy5ub2RlVHlwZSAmJiAiY2xvbmVOb2RlIiBpbiBzcmMpIHsKICAgICAgICAgIC8vIERPTSBOb2RlCiAgICAgICAgICByZXR1cm4gc3JjLmNsb25lTm9kZSh0cnVlKTsgLy8gTm9kZQogICAgICAgIH0KICAgICAgICBpZiAoc3JjIGluc3RhbmNlb2YgRGF0ZSkgewogICAgICAgICAgLy8gRGF0ZQogICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHNyYy5nZXRUaW1lKCkpOyAvLyBEYXRlCiAgICAgICAgfQogICAgICAgIGlmIChzcmMgaW5zdGFuY2VvZiBSZWdFeHApIHsKICAgICAgICAgIC8vIFJlZ0V4cAogICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoc3JjKTsgLy8gUmVnRXhwCiAgICAgICAgfQogICAgICAgIHZhciByLCBpLCBsOwogICAgICAgIGlmIChzcmMgaW5zdGFuY2VvZiBBcnJheSkgewogICAgICAgICAgLy8gYXJyYXkKICAgICAgICAgIHIgPSBbXTsKICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSBzcmMubGVuZ3RoOyBpIDwgbDsgKytpKSB7CiAgICAgICAgICAgIGlmIChpIGluIHNyYykgewogICAgICAgICAgICAgIHIucHVzaChkZWVwX2Nsb25lKHNyY1tpXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIGdlbmVyaWMgb2JqZWN0cwogICAgICAgICAgciA9IHNyYy5jb25zdHJ1Y3RvciA/IG5ldyBzcmMuY29uc3RydWN0b3IoKSA6IHt9OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWl4aW4ociwgc3JjLCBkZWVwX2Nsb25lKTsKICAgICAgfTsKCiAgICAgIC8qKiBTcGVjaWFsaXplZCBjbG9uZSBmdW5jdGlvbiB0aGF0IG9ubHkgY2xvbmVzIHNjYWxhcnMgYW5kIG5lc3RlZCBhcnJheXMgd2hlcmUKICAgICAgICogZWFjaCBhcnJheSBlaXRoZXIgY29uc2lzdHMgb2YgYWxsIGFycmF5cyBvciBhbGwgbnVtYmVycy4gVGhpcyBmdW5jdGlvbgogICAgICAgKiBpcyBtZWFudCBhcyBhIGZhc3Qgd2F5IG9mIGNsb25pbmcgcGFyYW1ldGVyIGRyYXdzIHdpdGhpbiB0aGUgbWNtYyBzYW1wbGluZwogICAgICAgKiBsb29wLgogICAgICAgKi8KICAgICAgdmFyIGNsb25lX3BhcmFtX2RyYXcgPSBmdW5jdGlvbiAoeCkgewogICAgICAgIGlmIChBcnJheS5pc0FycmF5KHgpKSB7CiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh4WzBdKSkgewogICAgICAgICAgICAvLyB4IGlzIGFuIGFycmF5IG9mIGFycmF5cyBzbyB3ZSBuZWVkIHRvIGNsb25lIGl0IHJlY3Vyc2l2ZWx5CiAgICAgICAgICAgIHZhciB4X2NvcHkgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHgubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICB4X2NvcHkucHVzaChjbG9uZV9wYXJhbV9kcmF3KHhbaV0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geF9jb3B5OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gV2UnbGwgYXNzdW1lIHggaXMgYSBhcnJheXMgb2Ygc2NhbGFycwogICAgICAgICAgICByZXR1cm4geC5zbGljZSgwKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gV2UnbGwgYXNzdW1lIHggaXMgYSBzY2FsYXIKICAgICAgICAgIHJldHVybiB4OwogICAgICAgIH0KICAgICAgfTsKCiAgICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgb2JqZWN0IGlzIGEgbnVtYmVyLgogICAgICAgKi8KICAgICAgdmFyIGlzX251bWJlciA9IGZ1bmN0aW9uIChvYmplY3QpIHsKICAgICAgICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PSAibnVtYmVyIiB8fCB0eXBlb2Ygb2JqZWN0ID09ICJvYmplY3QiICYmIG9iamVjdC5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyOwogICAgICB9OwoKICAgICAgLyoqCiAgICAgICAqIENyZWF0ZXMgYW5kIGluaXRpYWxpemVzIGEgKHBvc3NpYmx5IG11bHRpZGltZW5zaW9uYWwvbmVzdGVkKSBhcnJheS4KICAgICAgICogQHBhcmFtIGRpbSAtIEFuIGFycmF5IGdpdmluZyB0aGUgZGltZW5zaW9uIG9mIHRoZSBhcnJheS4gRm9yIGV4YW1wbGUsCiAgICAgICAqICAgWzVdIHdvdWxkIHlpZWxkIGEgNSBlbGVtZW50IGFycmF5LCBhbmQgWzMsM10gd291bGQgeWllbGQgYSAzIGJ5IDMgbWF0cml4LgogICAgICAgKiBAcGFyYW0gaW5pdCAtIEEgdmFsdWUgb3IgYSBmdW5jdGlvbiB1c2VkIHRvIGZpbGwgaW4gdGhlIGVhY2ggZWxlbWVudCBpbgogICAgICAgKiAgIHRoZSBhcnJheS4gSWYgaXQgaXMgYSBmdW5jdGlvbiBpdCBzaG91bGQgdGFrZSBubyBhcmd1bWVudHMsIGl0IHdpbGwgYmUgCiAgICAgICAqICAgZXZhbHVhdGVkIG9uY2UgZm9yIGVhY2ggZWxlbWVudCwgYW5kIGl0J3MgcmV0dXJuIHZhbHVlIHdpbGwgYmUgdXNlZCB0bwogICAgICAgKiAgIGZpbGwgaW4gZWFjaCBlbGVtZW50LgogICAgICAgKiBAZXhhbXBsZSAKICAgICAgICogLy8gVGhlIGZvbGxvd2luZyB3b3VsZCByZXR1cm4gW1sxLDFdLFsxLDFdLFsxLDFdXQogICAgICAgKiBjcmVhdGVfYXJyYXkoWzIsM10sIDEpCiAgICAgICAqLwogICAgICB2YXIgY3JlYXRlX2FycmF5ID0gZnVuY3Rpb24gKGRpbSwgaW5pdCkgewogICAgICAgIHZhciBhcnIgPSBuZXcgQXJyYXkoZGltWzBdKTsKICAgICAgICB2YXIgaTsKICAgICAgICBpZiAoZGltLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAvLyBGaWxsIGl0IHVwIHdpdGggaW5pdAogICAgICAgICAgaWYgKHR5cGVvZiBpbml0ID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykgewogICAgICAgICAgICAgIGFycltpXSA9IGluaXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7CiAgICAgICAgICAgICAgYXJyW2ldID0gaW5pdDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoZGltLmxlbmd0aCA+IDEpIHsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykgewogICAgICAgICAgICBhcnJbaV0gPSBjcmVhdGVfYXJyYXkoZGltLnNsaWNlKDEpLCBpbml0KTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgImNyZWF0ZV9hcnJheSBjYW4ndCBjcmVhdGUgYSBkaW1lbnNpb25sZXNzIGFycmF5IjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFycjsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm4gdGhlIGRpbWVuc2lvbnMgb2YgYSBwb3NzaWJseSBuZXN0ZWQgYXJyYXkgYXMgYW4gYXJyYXkuIEZvciAKICAgICAgICogZXhhbXBsZSwgYXJyYXlfZGltKCBbWzEsIDJdLCBbMSwgMl1dICkgc2hvdWxkIHJldHVybiBbMiwgMl0KICAgICAgICogQXNzdW1lcyB0aGF0IGFsbCBhcnJheXMgaW5zaWRlIGFub3RoZXIgYXJyYXkgYXJlIG9mIHRoZSBzYW1lIGxlbmd0aC4KICAgICAgICogQGV4YW1wbGUKICAgICAgICogLy8gU2hvdWxkIHJldHVybiBbNCwgMiwgMV0KICAgICAgICogYXJyYXlfZGltKGNyZWF0ZV9hcnJheShbNCwgMiwgMV0sIDApKQogICAgICAgKi8KICAgICAgdmFyIGFycmF5X2RpbSA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYVswXSkpIHsKICAgICAgICAgIHJldHVybiBbYS5sZW5ndGhdLmNvbmNhdChhcnJheV9kaW0oYVswXSkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gW2EubGVuZ3RoXTsKICAgICAgICB9CiAgICAgIH07CgogICAgICAvKioKICAgICAgICogQ2hlY2tzIGlmIHR3byBhcnJheXMgYXJlIGVxdWFsIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgY29udGFpbiB0aGUgc2FtZSBlbGVtZW50cwogICAgICAgKiBhcyBqdWRnZWQgYnkgdGhlICI9PSIgb3BlcmF0b3IuIFJldHVybnMgdHJ1ZSBvciBmYWxzZS4KICAgICAgICogQWRhcHRlZCBmcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE0ODUzOTc0LzEwMDE4NDgKICAgICAgICovCiAgICAgIHZhciBhcnJheV9lcXVhbCA9IGZ1bmN0aW9uIChhMSwgYTIpIHsKICAgICAgICBpZiAoYTEubGVuZ3RoICE9IGEyLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgbmVzdGVkIGFycmF5cwogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYTFbaV0pICYmIEFycmF5LmlzQXJyYXkoYTJbaV0pKSB7CiAgICAgICAgICAgIC8vIHJlY3Vyc2UgaW50byB0aGUgbmVzdGVkIGFycmF5cwogICAgICAgICAgICBpZiAoIWFycmF5X2VxdWFsKGExW2ldLCBhMltpXSkpIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0gZWxzZSBpZiAoYTFbaV0gIT0gYTJbaV0pIHsKICAgICAgICAgICAgLy8gV2FybmluZyAtIHR3byBkaWZmZXJlbnQgb2JqZWN0IGluc3RhbmNlcyB3aWxsIG5ldmVyIGJlIGVxdWFsOiB7eDoyMH0gIT0ge3g6MjB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH07CgogICAgICAvKioKICAgICAgICogVHJhdmVyc2VzIGEgcG9zc2libHkgbmVzdGVkIGFycmF5IGEgYW5kIGFwcGxpZXMgZnVuIHRvIGFsbCAibGVhZiBub2RlcyIsIAogICAgICAgKiB0aGF0IGlzLCB2YWx1ZXMgdGhhdCBhcmUgbm90IGFycmF5cy4gUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgc2FtZSBzaXplIGFzCiAgICAgICAqIGEuCiAgICAgICAqLwogICAgICB2YXIgbmVzdGVkX2FycmF5X2FwcGx5ID0gZnVuY3Rpb24gKGEsIGZ1bikgewogICAgICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7CiAgICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5KGEubGVuZ3RoKTsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICByZXN1bHRbaV0gPSBuZXN0ZWRfYXJyYXlfYXBwbHkoYVtpXSwgZnVuKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBmdW4oYSk7CiAgICAgICAgfQogICAgICB9OwoKICAgICAgLyoqIFJhbmRvbWl6aW5nIHRoZSBhcnJheSBlbGVtZW50IG9yZGVyIGluLXBsYWNlLiBVc2luZyBEdXJzdGVuZmVsZAogICAgICAgKiBzaHVmZmxlIGFsZ29yaXRobS4gQWRhcHRlZCBmcm9tIGhlcmU6IAogICAgICAgKiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xMjY0Njg2NC8xMDAxODQ4CiAgICAgICAqLwogICAgICBmdW5jdGlvbiBzaHVmZmxlX2FycmF5KGFycmF5KSB7CiAgICAgICAgZm9yICh2YXIgaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHsKICAgICAgICAgIHZhciBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGkgKyAxKSk7CiAgICAgICAgICB2YXIgdGVtcCA9IGFycmF5W2ldOwogICAgICAgICAgYXJyYXlbaV0gPSBhcnJheVtqXTsKICAgICAgICAgIGFycmF5W2pdID0gdGVtcDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICB9CgogICAgICAvKioKICAgICAgICogRG9lcyB0aGUgc2FtZSB0aGluZyBhcyBuZXN0ZWRfYXJyYXlfYXBwbHksIHRoYXQgaXMsIHRyYXZlcnNlcyBhIHBvc3NpYmx5CiAgICAgICAqIG5lc3RlZCBhcnJheSBhIGFuZCBhcHBsaWVzIGZ1biB0byBhbGwgImxlYWYgbm9kZXMiIGFuZCByZXR1cm5zIGFuIGFycmF5IAogICAgICAgKiBvZiB0aGUgc2FtZSBzaXplIGFzIGEuIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgbmVzdGVkX2FycmF5X3JhbmRvbV9hcHBseQogICAgICAgKiBicmFuY2hlcyByYW5kb21seS4KICAgICAgICovCiAgICAgIHZhciBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5ID0gZnVuY3Rpb24gKGEsIGZ1bikgewogICAgICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7CiAgICAgICAgICB2YXIgbGVuID0gYS5sZW5ndGg7CiAgICAgICAgICB2YXIgaTsKICAgICAgICAgIHZhciBhcnJheV9pcyA9IFtdOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGFycmF5X2lzW2ldID0gaTsKICAgICAgICAgIH0KICAgICAgICAgIHNodWZmbGVfYXJyYXkoYXJyYXlfaXMpOwogICAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIHZhciBhcnJheV9pID0gYXJyYXlfaXNbaV07CiAgICAgICAgICAgIHJlc3VsdFthcnJheV9pXSA9IG5lc3RlZF9hcnJheV9hcHBseShhW2FycmF5X2ldLCBmdW4pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGZ1bihhKTsKICAgICAgICB9CiAgICAgIH07CgogICAgICAvKioKICAgICAgICogQWxsb3dzIGEgcHJldHR5IHdheSBvZiBzZXR0aW5nIGRlZmF1bHQgb3B0aW9ucyB3aGVyZSB0aGUgZGVmdWx0cyBjYW4gYmUKICAgICAgICogb3ZlcnJpZGRlbiBieSBhbiBvcHRpb25zIG9iamVjdC4KICAgICAgICogIEBwYXJhbSBvcHRpb25fbmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBvcHRpb24gYXMgYSBzdHJpbmcKICAgICAgICogIEBwYXJhbSBteV9vcHRpb25zIC0gYW4gb3B0aW9uIG9iamVjdCB0aGF0IGNvdWxkIGhhdmUgb3B0aW9uX25hbWUgCiAgICAgICAqICAgIGFzIGEgbWVtYmVyLgogICAgICAgKiBAcGFyYW0gZGVmYXVsX3ZhbHVlIC0gZGVmdWx0IHZhbHVlIHRoYXQgaXMgcmV0dXJuZWQgaWYgb3B0aW9uX25hbWUgCiAgICAgICAqICAgaXMgbm90IGRlZmluZWQgaW4gbXlfb3B0aW9ucy4KICAgICAgICogQGV4YW1wbGUKICAgICAgICogdmFyIG15X29wdGlvbnMgPSB7cGk6IDMuMTQxNTl9CiAgICAgICAqIHZhciBwaSA9IGdldF9vcHRpb24oInBpIiwgbXlfb3B0aW9ucywgMy4xNCkKICAgICAgICovCiAgICAgIC8vIFByZXR0eSB3YXkgb2Ygc2V0dGluZyBkZWZhdWx0IG9wdGlvbnMgd2hlcmUgdGhlIGRlZmF1bHRzIGNhbiBiZSBvdmVycmlkZGVuCiAgICAgIC8vIGJ5IGFuIG9wdGlvbnMgb2JqZWN0LiBGb3IgZXhhbXBsZToKICAgICAgLy8gdmFyIHBpID0gZ2V0X29wdGlvbigicGkiLCBteV9vcHRpb25zLCAzLjE0KQogICAgICB2YXIgZ2V0X29wdGlvbiA9IGZ1bmN0aW9uIChvcHRpb25fbmFtZSwgb3B0aW9ucywgZGVmYXVsX3ZhbHVlKSB7CiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICAgICAgcmV0dXJuIG9wdGlvbnMuaGFzT3duUHJvcGVydHkob3B0aW9uX25hbWUpICYmIG9wdGlvbnNbb3B0aW9uX25hbWVdICE9PSB1bmRlZmluZWQgJiYgb3B0aW9uc1tvcHRpb25fbmFtZV0gIT09IG51bGwgPyBvcHRpb25zW29wdGlvbl9uYW1lXSA6IGRlZmF1bF92YWx1ZTsKICAgICAgfTsKCiAgICAgIC8qKiBWZXJzaW9uIG9mIGdldF9vcHRpb24gd2hlcmUgdGhlIG9wdGlvbiBzaG91bGQgYmUgYSBvbmUgb3IgbXVsdGktZGltZW5zaW9uYWwKICAgICAgICogYXJyYXkgYW5kIHdoZXJlIHRoZSBkZWZhdWx0IGNhbiBiZSBvdmVycmlkZGVuIGVpdGhlciBieSBhIHNjYWxhciBvciBieSBhbiBhcnJheS4KICAgICAgICogSWYgaXQncyBhIHNjYWxhciB0aGUgdGhhdCBzY2FsYXIgaXMgdXNlZCB0byBpbml0aWFsaXplIGFuIGFycmF5IHdpdGggCiAgICAgICAqIGRpbSBkaW1lbnNpb25zLgogICAgICAgKiAKICAgICAgICovCiAgICAgIHZhciBnZXRfbXVsdGlkaW1fb3B0aW9uID0gZnVuY3Rpb24gKG9wdGlvbl9uYW1lLCBvcHRpb25zLCBkaW0sIGRlZmF1bF92YWx1ZSkgewogICAgICAgIHZhciB2YWx1ZSA9IGdldF9vcHRpb24ob3B0aW9uX25hbWUsIG9wdGlvbnMsIGRlZmF1bF92YWx1ZSk7CiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgICAgICAgdmFsdWUgPSBjcmVhdGVfYXJyYXkoZGltLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIGlmICghYXJyYXlfZXF1YWwoYXJyYXlfZGltKHZhbHVlKSwgZGltKSkgewogICAgICAgICAgdGhyb3cgIlRoZSBvcHRpb24gIiArIG9wdGlvbl9uYW1lICsgIiBpcyBvZiBkaW1lbnNpb24gWyIgKyBhcnJheV9kaW0odmFsdWUpICsgIl0gYnV0IHNob3VsZCBiZSBbIiArIGRpbSArICJdLiI7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgfTsKCiAgICAgIC8vLy8vLy8vLy8gRnVuY3Rpb25zIGZvciBoYW5kbGluZyBwYXJhbWV0ZXIgb2JqZWN0cyAvLy8vLy8vLy8vCiAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGZpeGVkIChzYW1lIGV2ZXJ5IHRpbWUpIG51bWJlciB0aGF0IGNvdWxkIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZQogICAgICAgKiBhIHBhcmFtZXRlciBvZiBhIGNlcnRhaW4gdHlwZSwgcG9zc2libHkgd2l0aCBsb3dlciBhbmQgdXBwZXIgYm91bmRzLgogICAgICAgKiBUaGUgcG9zc2lsZSB0eXBlcyBhcmUgInJlYWwiLCAiaW50IiwgYW5kICJiaW5hcnkiLgogICAgICAgKi8KICAgICAgdmFyIHBhcmFtX2luaXRfZml4ZWQgPSBmdW5jdGlvbiAodHlwZSwgbG93ZXIsIHVwcGVyKSB7CiAgICAgICAgaWYgKGxvd2VyID4gdXBwZXIpIHsKICAgICAgICAgIHRocm93ICJDYW4gbm90IGluaXRpYWxpemUgcGFyYW1ldGVyIHdoZXJlIGxvd2VyIGJvdW5kID4gdXBwZXIgYm91bmQiOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZSA9PT0gInJlYWwiKSB7CiAgICAgICAgICBpZiAobG93ZXIgPT09IC1JbmZpbml0eSAmJiB1cHBlciA9PT0gSW5maW5pdHkpIHsKICAgICAgICAgICAgcmV0dXJuIDAuNTsKICAgICAgICAgIH0gZWxzZSBpZiAobG93ZXIgPT09IC1JbmZpbml0eSkgewogICAgICAgICAgICByZXR1cm4gdXBwZXIgLSAwLjU7CiAgICAgICAgICB9IGVsc2UgaWYgKHVwcGVyID09PSBJbmZpbml0eSkgewogICAgICAgICAgICByZXR1cm4gbG93ZXIgKyAwLjU7CiAgICAgICAgICB9IGVsc2UgaWYgKGxvd2VyIDw9IHVwcGVyKSB7CiAgICAgICAgICAgIHJldHVybiAobG93ZXIgKyB1cHBlcikgLyAyOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gImludCIpIHsKICAgICAgICAgIGlmIChsb3dlciA9PT0gLUluZmluaXR5ICYmIHVwcGVyID09PSBJbmZpbml0eSkgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgIH0gZWxzZSBpZiAobG93ZXIgPT09IC1JbmZpbml0eSkgewogICAgICAgICAgICByZXR1cm4gdXBwZXIgLSAxOwogICAgICAgICAgfSBlbHNlIGlmICh1cHBlciA9PT0gSW5maW5pdHkpIHsKICAgICAgICAgICAgcmV0dXJuIGxvd2VyICsgMTsKICAgICAgICAgIH0gZWxzZSBpZiAobG93ZXIgPD0gdXBwZXIpIHsKICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoKGxvd2VyICsgdXBwZXIpIC8gMik7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAiYmluYXJ5IikgewogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIHRocm93ICJDb3VsZCBub3QgaW5pdGlhbGl6ZSBwYXJhbWV0ZXIgb2YgdHlwZSAiICsgdHlwZSArICJbIiArIGxvd2VyICsgIiwgIiArIHVwcGVyICsgIl0iOwogICAgICB9OwoKICAgICAgLyoqCiAgICAgICAqIENvbXBsZXRlcyBwYXJhbXNfdG9fY29tcGxldGUsIGFuIG9iamVjdCBjb250YWluaW5nIHBhcmFtZXRlciBkZXNjcmlwdGlvbnMsIAogICAgICAgKiBhbmQgaW5pdGlhbGl6ZXMgbm9uLWluaXRpYWxpemVkIHBhcmFtZXRlcnMuIFRoaXMgbW9kaWZpZWQgdmVyc2lvbiBvZgogICAgICAgKiBwYXJhbXNfdG9fY29tcGxldGUgaXMgcmV0dXJuZWQgYXMgYSBkZWVwIGNvcHkgYW5kIG5vdCBtb2RpZmllZCBpbiBwbGFjZS4KICAgICAgICogSW5pdGlhbGl6YXRpb24gaXMgZG9uZSBieSBzdXBwbHlpbmcgYSBwYXJhbV9pbml0IGZ1bmN0aW9uIHdpdGggc2lnbmF0dXJlCiAgICAgICAqIGZ1bmN0aW9uKHR5cGUsIGxvd2VyLCB1cHBlcikgdGhhdCBzaG91bGQgcmV0dXJuIGEgc2luZ2xlIG51bWJlciAKICAgICAgICogKGxpa2UgcGFyYW1faW5pdF9maXhlZCwgZm9yIGV4YW1wbGUpLgogICAgICAgKiBAZXhhbXBsZQogICAgICAgKiB2YXIgcGFyYW1zID0geyAibXUiOiB7InR5cGUiOiAicmVhbCJ9IH0KICAgICAgICogcGFyYW1zID0gY29tcGxldGVfcGFyYW1zKHBhcmFtcyk7CiAgICAgICAqIC8vIHBhcmFtcyBzaG91bGQgbm93IGJlOgogICAgICAgKiAvLyAgeyJtdSI6IHsgInR5cGUiOiAicmVhbCIsICJkaW0iOiBbMV0sICJ1cHBlciI6IEluZmluaXR5LAogICAgICAgKiAvLyAgICAgICAgICAgImxvd2VyIjogLUluZmluaXR5LCAiaW5pdCI6IDAuNSB9fQogICAgICAgKi8KICAgICAgdmFyIGNvbXBsZXRlX3BhcmFtcyA9IGZ1bmN0aW9uIChwYXJhbXNfdG9fY29tcGxldGUsIHBhcmFtX2luaXQpIHsKICAgICAgICB2YXIgcGFyYW1zID0gZGVlcF9jbG9uZShwYXJhbXNfdG9fY29tcGxldGUpOwogICAgICAgIGZvciAodmFyIHBhcmFtX25hbWUgaW4gcGFyYW1zKSB7CiAgICAgICAgICBpZiAoIXBhcmFtcy5oYXNPd25Qcm9wZXJ0eShwYXJhbV9uYW1lKSkgY29udGludWU7CiAgICAgICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbcGFyYW1fbmFtZV07CiAgICAgICAgICBpZiAoIXBhcmFtLmhhc093blByb3BlcnR5KCJ0eXBlIikpIHsKICAgICAgICAgICAgcGFyYW0udHlwZSA9ICJyZWFsIjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghcGFyYW0uaGFzT3duUHJvcGVydHkoImRpbSIpKSB7CiAgICAgICAgICAgIHBhcmFtLmRpbSA9IFsxXTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpc19udW1iZXIocGFyYW0uZGltKSkgewogICAgICAgICAgICBwYXJhbS5kaW0gPSBbcGFyYW0uZGltXTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChwYXJhbS50eXBlID09ICJiaW5hcnkiKSB7CiAgICAgICAgICAgIHBhcmFtLnVwcGVyID0gMTsKICAgICAgICAgICAgcGFyYW0ubG93ZXIgPSAwOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFwYXJhbS5oYXNPd25Qcm9wZXJ0eSgidXBwZXIiKSkgewogICAgICAgICAgICBwYXJhbS51cHBlciA9IEluZmluaXR5OwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFwYXJhbS5oYXNPd25Qcm9wZXJ0eSgibG93ZXIiKSkgewogICAgICAgICAgICBwYXJhbS5sb3dlciA9IC1JbmZpbml0eTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChwYXJhbS5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpKSB7CiAgICAgICAgICAgIC8vIElmIHRoaXMgaXMganVzdCBhIG51bWJlciBvciBhIG5lc3RlZCBhcnJheSB3ZSBsZWF2ZSBpdCBhbG9uZSwgYnV0IGlmLi4uCiAgICAgICAgICAgIGlmIChhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkgJiYgdHlwZW9mIHBhcmFtLmluaXQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAvLyBwYXJhbS5pbml0IGlzIGEgZnVuY3Rpb24sIHVzZSB0aGF0IHRvIGluaXRpYWxpemUgdGhlIHBhcmFtZXRlci4KICAgICAgICAgICAgICBwYXJhbS5pbml0ID0gcGFyYW0uaW5pdCgpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCFhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0uaW5pdCkpIHsKICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIgd2hlcmUgdGhlIHBhcmFtLmluaXQgZXhpc3QgYnV0CiAgICAgICAgICAgICAgLy8gaXMgbm90IGFuIGFycmF5LiBUaGVuIGFzc3VtZSBpdCBpcyBhIG51bWJlciBvciBhIGZ1bmN0aW9uIGFuZCB1c2UKICAgICAgICAgICAgICAvLyBpdCB0byBpbml0aWFsaXplIHRoZSBwYXJhbWV0ZXIuCiAgICAgICAgICAgICAgcGFyYW0uaW5pdCA9IGNyZWF0ZV9hcnJheShwYXJhbS5kaW0sIHBhcmFtLmluaXQpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBXZSB1c2UgdGhlIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uCiAgICAgICAgICAgIGlmIChhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHsKICAgICAgICAgICAgICBwYXJhbS5pbml0ID0gcGFyYW1faW5pdChwYXJhbS50eXBlLCBwYXJhbS5sb3dlciwgcGFyYW0udXBwZXIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHBhcmFtLmluaXQgPSBjcmVhdGVfYXJyYXkocGFyYW0uZGltLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1faW5pdChwYXJhbS50eXBlLCBwYXJhbS5sb3dlciwgcGFyYW0udXBwZXIpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJhbXM7CiAgICAgIH07CgogICAgICAvLy8vLy8vLy8vIFN0ZXBwZXIgRnVuY3Rpb25zIC8vLy8vLy8vLy8vCiAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgIC8qKgogICAgICAgKiBAaW50ZXJmYWNlCiAgICAgICAqIEEgU3RlcHBlciBpcyBhbiBvYmplY3QgcmVzcG9uc2libGUgZm9yIHB1c2hpbmcgYXJvdW5kIG9uZQogICAgICAgKiBvciBtb3JlIHBhcmFtZXRlciB2YWx1ZXMgaW4gYSBzdGF0ZSBhY2NvcmRpbmcgdG8gdGhlIGRpc3RyaWJ1dGlvbgogICAgICAgKiBkZWZpbmVkIGJ5IHRoZSBsb2cgcG9zdGVyaW9yLiBUaGlzIGRlZmluZXMgdGhlIFN0ZXBwZXIgImludGVyZmFjZSIsCiAgICAgICAqIHdoZXJlICJpbnRlcmZhY2UiIG1lYW5zIHRoYXQgU3RlcHBlciBkZWZpbmVzIGEgY2xhc3MgdGhhdCBpcyBuZXZlcgogICAgICAgKiBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQsIGJ1dCBqdXN0IHRvIGJlIHN1YmNsYXNzZWQgYnkgc3BlY2lhbGl6ZWQKICAgICAgICogc3RlcHBlciBmdW5jdGlvbnMuCiAgICAgICAqIEBpbnRlcmZhY2UKICAgICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIHBhcmFtZXRlciBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGU6CiAgICAgICAqICAgeyJtdSI6IHsgInR5cGUiOiAicmVhbCIsICJkaW0iOiBbMV0sICJ1cHBlciI6IEluZmluaXR5LCAKICAgICAgICogICAibG93ZXIiOiAtSW5maW5pdHksICJpbml0IjogMC41IH19CiAgICAgICAqICAgVGhlIHBhcmFtZXRlciBkZWZpbml0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gYmUgImNvbXBsZXRlIiwgdGhhdCBpcywKICAgICAgICogICBzcGVjaWZ5aW5nIGFsbCByZWxldmFudCBhdHRyaWJ1dGVzIHN1Y2ggYXMgZGltLCBsb3dlciBhbmQgdXBwZXIuCiAgICAgICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycyBpbiBwYXJhbXMKICAgICAgICogICAoYW5kIHBvc3NpYmx5IG1vcmUpLiBUaGUgcGFyYW1ldGVyIG5hbWVzIGFyZSBnaXZlbiBhcyBrZXlzIGFuZCB0aGUgc3RhdGVzCiAgICAgICAqICAgYXMgc2NhbGFycyBvciwgcG9zc2libHkgbmVzdGVkLCBhcnJheXMuIEZvciBleGFtcGxlOgogICAgICAgKiAgIHttdTogMTAsIHNpZ21hOiA1LCBiZXRhOiBbMSwgMi41XX0KICAgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiAqdGFraW5nIG5vIHBhcmFtZXRlcnMqIHRoYXQgcmV0dXJucyB0aGUKICAgICAgICogICBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiBUaGF0IGlzLCB0aGUgdmFsdWUgb2YgbG9nX3Bvc3QKICAgICAgICogICBzaG91bGQgY2hhbmdlIGlmIHRoZSB0aGUgdmFsdWVzIGluIHN0YXRlIGFyZSBjaGFuZ2VkLgogICAgICAKICAgICAgICovCiAgICAgIHZhciBTdGVwcGVyID0gZnVuY3Rpb24gKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0KSB7CiAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOwogICAgICAgIHRoaXMubG9nX3Bvc3QgPSBsb2dfcG9zdDsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAgKiBUYWtlcyBhIHN0ZXAgaW4gdGhlIHBhcmFtZXRlciBzcGFjZS4gU2hvdWxkIHJldHVybiB0aGUgbmV3IHN0YXRlLAogICAgICAgKiBidXQgaXMgbWFpbmx5IGNhbGxlZCBmb3IgaXQncyBzaWRlIGVmZmVjdCBvZiBtYWtpbmcgYSBjaGFuZ2UgaW4gdGhlCiAgICAgICAqIHN0YXRlIG9iamVjdC4KICAgICAgICovCiAgICAgIFN0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdGhyb3cgIkV2ZXJ5IFN0ZXBwZXIgbmVlZCB0byBpbXBsZW1lbnQgc3RlcCgpIjsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAgKiBJZiBpbXBsZW1lbnRlZCwgbWFrZXMgdGhlIHN0ZXBwZXIgYWRhcHQgd2hpbGUgc3RlcHBpbmcuCiAgICAgICAqLwogICAgICBTdGVwcGVyLnByb3RvdHlwZS5zdGFydF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgIC8vIE9wdGlvbmFsLCBzb21lIHN0ZXBwZXJzIG1pZ2h0IG5vdCBiZSBhZGFwdGl2ZS4gKi8gCiAgICAgIH07CgogICAgICAvKioKICAgICAgICogSWYgaW1wbGVtZW50ZWQsIG1ha2VzIHRoZSBzdGVwcGVyIGNlYXNlIGFkYXB0aW5nIHdoaWxlIHN0ZXBwaW5nLgogICAgICAgKi8KICAgICAgU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgIC8vIE9wdGlvbmFsLCBzb21lIHN0ZXBwZXJzIG1pZ2h0IG5vdCBiZSBhZGFwdGl2ZS4gKi8gCiAgICAgIH07CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhbiBvYmplY3QgY29udGFpbmcgaW5mbyByZWdhcmRpbmcgdGhlIHN0ZXBwZXIuCiAgICAgICAqLwogICAgICBTdGVwcGVyLnByb3RvdHlwZS5pbmZvID0gZnVuY3Rpb24gKCkgewogICAgICAgIC8vIFJldHVybnMgYW4gb2JqZWN0IHdpdGggaW5mbyBhYm91dCB0aGUgc3RhdGUgb2YgdGhlIHN0ZXBwZXIuCiAgICAgICAgcmV0dXJuIHt9OwogICAgICB9OwoKICAgICAgLyoqCiAgICAgICAqIEBjbGFzcwogICAgICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn0KICAgICAgICogQ29uc3RydWN0b3IgZm9yIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlIG1ldHJvcG9saXMgc3RlcCBpbgogICAgICAgKiB0aGUgQWRhcHRpdmUgTWV0cm9wb2xpcy1XaXRoaW4tR2liYnMgYWxnb3JpdGhtIGluICJFeGFtcGxlcyBvZiBBZGFwdGl2ZSBNQ01DIgogICAgICAgKiBieSBSb2JlcnRzIGFuZCBSb3NlbnRoYWwgKDIwMDgpLgogICAgICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyIGRlZmluaXRpb24uCiAgICAgICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy4KICAgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIAogICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuCiAgICAgICAqIEBwYXJhbSBnZW5lcmF0ZV9wcm9wb3NhbCAtIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgcHJvcG9zYWwgKGFzIGEgbnVtYmVyKQogICAgICAgKiB3aXRoIHNpZ25hdHVyZSBmdW5jdGlvbihwYXJhbV9zdGF0ZSwgbG9nX3NjYWxlKSB3aGVyZSBwYXJhbV9zdGF0ZSBpcyBhCiAgICAgICAqIG51bWJlciBhbmQgbG9nX3NjYWxlIGRlZmluZXMgdGhlIHNjYWxlIG9mIHRoZSBwcm9wb3NhbCBzb21laG93LgogICAgICAqLwogICAgICB2YXIgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIGdlbmVyYXRlX3Byb3Bvc2FsKSB7CiAgICAgICAgU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0KTsKICAgICAgICB2YXIgcGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7CiAgICAgICAgaWYgKHBhcmFtX25hbWVzLmxlbmd0aCAhPSAxKSB7CiAgICAgICAgICB0aHJvdyAiT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgY2FuIG9ubHkgaGFuZGxlIG9uZSBwYXJhbWV0ZXIuIjsKICAgICAgICB9CiAgICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07CiAgICAgICAgdmFyIHBhcmFtID0gdGhpcy5wYXJhbXNbdGhpcy5wYXJhbV9uYW1lXTsKICAgICAgICBpZiAoIWFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSkgewogICAgICAgICAgdGhyb3cgIk9uZWRpbU1ldHJvcG9saXNTdGVwcGVyIGNhbiBvbmx5IGhhbmRsZSBvbmUgb25lLWRpbWVuc2lvbmFsIHBhcmFtZXRlci4iOwogICAgICAgIH0KICAgICAgICB0aGlzLmxvd2VyID0gcGFyYW0ubG93ZXI7CiAgICAgICAgdGhpcy51cHBlciA9IHBhcmFtLnVwcGVyOwogICAgICAgIHRoaXMucHJvcF9sb2dfc2NhbGUgPSBnZXRfb3B0aW9uKCJwcm9wX2xvZ19zY2FsZSIsIG9wdGlvbnMsIDApOwogICAgICAgIHRoaXMuYmF0Y2hfc2l6ZSA9IGdldF9vcHRpb24oImJhdGNoX3NpemUiLCBvcHRpb25zLCA1MCk7CiAgICAgICAgdGhpcy5tYXhfYWRhcHRhdGlvbiA9IGdldF9vcHRpb24oIm1heF9hZGFwdGF0aW9uIiwgb3B0aW9ucywgMC4zMyk7CiAgICAgICAgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24gPSBnZXRfb3B0aW9uKCJpbml0aWFsX2FkYXB0YXRpb24iLCBvcHRpb25zLCAxLjApOwogICAgICAgIHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlID0gZ2V0X29wdGlvbigidGFyZ2V0X2FjY2VwdF9yYXRlIiwgb3B0aW9ucywgMC40NCk7CiAgICAgICAgdGhpcy5pc19hZGFwdGluZyA9IGdldF9vcHRpb24oImlzX2FkYXB0aW5nIiwgb3B0aW9ucywgdHJ1ZSk7CiAgICAgICAgdGhpcy5nZW5lcmF0ZV9wcm9wb3NhbCA9IGdlbmVyYXRlX3Byb3Bvc2FsOwogICAgICAgIHRoaXMuYWNjZXB0YW5jZV9jb3VudCA9IDA7CiAgICAgICAgdGhpcy5iYXRjaF9jb3VudCA9IDA7CiAgICAgICAgdGhpcy5pdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uID0gMDsKICAgICAgfTsKICAgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdGVwcGVyLnByb3RvdHlwZSk7CiAgICAgIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyOwogICAgICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgcGFyYW1fc3RhdGUgPSB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV07CiAgICAgICAgdmFyIHBhcmFtX3Byb3Bvc2FsID0gdGhpcy5nZW5lcmF0ZV9wcm9wb3NhbChwYXJhbV9zdGF0ZSwgdGhpcy5wcm9wX2xvZ19zY2FsZSk7CiAgICAgICAgaWYgKHBhcmFtX3Byb3Bvc2FsIDwgdGhpcy5sb3dlciB8fCBwYXJhbV9wcm9wb3NhbCA+IHRoaXMudXBwZXIpIDsgZWxzZSB7CiAgICAgICAgICAvLyBtYWtlIGEgTWV0cm9wb2xpcyBzdGVwCiAgICAgICAgICB2YXIgY3Vycl9sb2dfZGVucyA9IHRoaXMubG9nX3Bvc3QoKTsKICAgICAgICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IHBhcmFtX3Byb3Bvc2FsOwogICAgICAgICAgdmFyIHByb3BfbG9nX2RlbnMgPSB0aGlzLmxvZ19wb3N0KCk7CiAgICAgICAgICB2YXIgYWNjZXB0X3Byb2IgPSBNYXRoLmV4cChwcm9wX2xvZ19kZW5zIC0gY3Vycl9sb2dfZGVucyk7CiAgICAgICAgICBpZiAoYWNjZXB0X3Byb2IgPiBNYXRoLnJhbmRvbSgpKSB7CiAgICAgICAgICAgIC8vIFdlIGRvIG5vdGhpbmcgYXMgdGhlIHN0YXRlIG9mIHBhcmFtIGhhcyBhbHJlYWR5IGJlZW4gY2hhbmdlZCB0byB0aGUgcHJvcG9zYWwKICAgICAgICAgICAgaWYgKHRoaXMuaXNfYWRhcHRpbmcpIHRoaXMuYWNjZXB0YW5jZV9jb3VudCsrOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gcmV2ZXJ0IHN0YXRlIGJhY2sgdG8gdGhlIG9sZCBzdGF0ZSBvZiBwYXJhbQogICAgICAgICAgICB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0gPSBwYXJhbV9zdGF0ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuaXNfYWRhcHRpbmcpIHsKICAgICAgICAgIHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbisrOwogICAgICAgICAgaWYgKHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiA+PSB0aGlzLmJhdGNoX3NpemUpIHsKICAgICAgICAgICAgLy8gdGhlbiBhZGFwdAogICAgICAgICAgICB0aGlzLmJhdGNoX2NvdW50Kys7CiAgICAgICAgICAgIHZhciBsb2dfc2RfYWRqdXN0bWVudCA9IE1hdGgubWluKHRoaXMubWF4X2FkYXB0YXRpb24sIHRoaXMuaW5pdGlhbF9hZGFwdGF0aW9uIC8gTWF0aC5zcXJ0KHRoaXMuYmF0Y2hfY291bnQpKTsKICAgICAgICAgICAgaWYgKHRoaXMuYWNjZXB0YW5jZV9jb3VudCAvIHRoaXMuYmF0Y2hfc2l6ZSA+IHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlKSB7CiAgICAgICAgICAgICAgdGhpcy5wcm9wX2xvZ19zY2FsZSArPSBsb2dfc2RfYWRqdXN0bWVudDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aGlzLnByb3BfbG9nX3NjYWxlIC09IGxvZ19zZF9hZGp1c3RtZW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuYWNjZXB0YW5jZV9jb3VudCA9IDA7CiAgICAgICAgICAgIHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiA9IDA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV07CiAgICAgIH07CiAgICAgIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5zdGFydF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMuaXNfYWRhcHRpbmcgPSB0cnVlOwogICAgICB9OwogICAgICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMuaXNfYWRhcHRpbmcgPSBmYWxzZTsKICAgICAgfTsKICAgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHByb3BfbG9nX3NjYWxlOiB0aGlzLnByb3BfbG9nX3NjYWxlLAogICAgICAgICAgaXNfYWRhcHRpbmc6IHRoaXMuaXNfYWRhcHRpbmcsCiAgICAgICAgICBhY2NlcHRhbmNlX2NvdW50OiB0aGlzLmFjY2VwdGFuY2VfY291bnQsCiAgICAgICAgICBpdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uOiB0aGlzLml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24sCiAgICAgICAgICBiYXRjaF9jb3VudDogdGhpcy5iYXRjaF9jb3VudAogICAgICAgIH07CiAgICAgIH07CgogICAgICAvKioKICAgICAgICogRnVuY3Rpb24gcmV0dXJuaW5nIGEgTm9ybWFsIHByb3Bvc2FsLgogICAgICAgKi8KICAgICAgdmFyIG5vcm1hbF9wcm9wb3NhbCA9IGZ1bmN0aW9uIChwYXJhbV9zdGF0ZSwgcHJvcF9sb2dfc2NhbGUpIHsKICAgICAgICByZXR1cm4gcm5vcm0ocGFyYW1fc3RhdGUsIE1hdGguZXhwKHByb3BfbG9nX3NjYWxlKSk7CiAgICAgIH07CgogICAgICAvKioKICAgICAgICogQGNsYXNzCiAgICAgICAqIEBhdWdtZW50cyB7T25lZGltTWV0cm9wb2xpc1N0ZXBwZXJ9CiAgICAgICAqIEEgInN1YmNsYXNzIiBvZiBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciBtYWtpbmcgY29udGlub3VzIE5vcm1hbCBwcm9wb3NhbHMuCiAgICAgICAqLwogICAgICB2YXIgUmVhbE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24gKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKSB7CiAgICAgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgbm9ybWFsX3Byb3Bvc2FsKTsKICAgICAgfTsKICAgICAgUmVhbE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlKTsKICAgICAgUmVhbE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJlYWxNZXRyb3BvbGlzU3RlcHBlcjsKCiAgICAgIC8qKgogICAgICAgKiBGdW5jdGlvbiByZXR1cm5pbmcgYSBkaXNjcmV0aXplZCBOb3JtYWwgcHJvcG9zYWwuCiAgICAgICAqLwogICAgICB2YXIgZGlzY3JldGVfbm9ybWFsX3Byb3Bvc2FsID0gZnVuY3Rpb24gKHBhcmFtX3N0YXRlLCBwcm9wX2xvZ19zY2FsZSkgewogICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHJub3JtKHBhcmFtX3N0YXRlLCBNYXRoLmV4cChwcm9wX2xvZ19zY2FsZSkpKTsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAqIEBjbGFzcwogICAgICAqIEBhdWdtZW50cyB7T25lZGltTWV0cm9wb2xpc1N0ZXBwZXJ9CiAgICAgICogQSAic3ViY2xhc3MiIG9mIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyIG1ha2luZyBkaXNjcmV0aXplZCBOb3JtYWwgcHJvcG9zYWxzLgogICAgICAqLwogICAgICB2YXIgSW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHsKICAgICAgICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zLCBkaXNjcmV0ZV9ub3JtYWxfcHJvcG9zYWwpOwogICAgICB9OwogICAgICBJbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7CiAgICAgIEludE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEludE1ldHJvcG9saXNTdGVwcGVyOwoKICAgICAgLyoqCiAgICAgICAqIEBjbGFzcwogICAgICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn0KICAgICAgICogQ29uc3RydWN0b3IgZm9yIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlIG1ldHJvcG9saXMgc3RlcCBpbgogICAgICAgKiB0aGUgQWRhcHRpdmUgTWV0cm9wb2xpcy1XaXRoaW4tR2liYnMgYWxnb3JpdGhtIGluICJFeGFtcGxlcyBvZiBBZGFwdGl2ZSBNQ01DIgogICAgICAgKiBieSBSb2JlcnRzIGFuZCBSb3NlbnRoYWwgKDIwMDgpIGZvciBwb3NzaWJseSBtdWx0aWRpbWVuc2lvbmFsIGFycmF5cy4gVGhhdAogICAgICAgKiBpcywgaW5zdGVhZCBvZiBqdXN0IHRha2luZyBhIHN0ZXAgZm9yIGEgb25lLWRpbWVuc2lvbmFsIHBhcmFtZXRlciBsaWtlIAogICAgICAgKiBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciwgdGhpcyBTdGVwcGVyIGlzIHJlc3BvbnNpYmxlIGZvciB0YWtpbmcgc3RlcHMgCiAgICAgICAqIGZvciBhIG11bHRpZGltZW5zaW9uYWwgYXJyYXkuIEl0J3Mgc3RpbGwgcHJldHR5IGR1bWIgYW5kIGp1c3QgdGFrZXMKICAgICAgICogb25lLWRpbWVuc2lvbmFsIHN0ZXBzIGZvciBlYWNoIHBhcmFtZXRlciBjb21wb25lbnQsIHRob3VnaC4KICAgICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIGEgc2luZ2xlIHBhcmFtZXRlciBkZWZpbml0aW9uIGZvciBhIAogICAgICAgKiAgIG11bHRpZGltZW5zaW9uYWwgcGFyYW1ldGVyLgogICAgICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuCiAgICAgICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiAKICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zIHRvIHRoZSBzdGVwcGVyLgogICAgICAgKiBAcGFyYW0gU3ViU3RlcHBlciAtIGEgY29uc3RydWN0b3IgZm9yIHRoZSB0eXBlIG9mIG9uZSBkaW1lbnNpb25hbCBTdGVwcGVyIHRvIGFwcGx5IG9uCiAgICAgICAqICAgYWxsIHRoZSBjb21wb25lbnRzIG9mIHRoZSBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlci4KICAgICAgKi8KICAgICAgdmFyIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIFN1YlN0ZXBwZXIpIHsKICAgICAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpOwogICAgICAgIHZhciBwYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTsKICAgICAgICBpZiAocGFyYW1fbmFtZXMubGVuZ3RoICE9IDEpIHsKICAgICAgICAgIHRocm93ICJNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIGNhbid0IGhhbmRsZSBtb3JlIHRoYW4gb25lIHBhcmFtZXRlci4iOwogICAgICAgIH0KICAgICAgICB0aGlzLnBhcmFtX25hbWUgPSBwYXJhbV9uYW1lc1swXTsKICAgICAgICB2YXIgcGFyYW0gPSB0aGlzLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVdOwogICAgICAgIHRoaXMubG93ZXIgPSBwYXJhbS5sb3dlcjsKICAgICAgICB0aGlzLnVwcGVyID0gcGFyYW0udXBwZXI7CiAgICAgICAgdGhpcy5kaW0gPSBwYXJhbS5kaW07CiAgICAgICAgdGhpcy5wcm9wX2xvZ19zY2FsZSA9IGdldF9tdWx0aWRpbV9vcHRpb24oInByb3BfbG9nX3NjYWxlIiwgb3B0aW9ucywgdGhpcy5kaW0sIDApOwogICAgICAgIHRoaXMuYmF0Y2hfc2l6ZSA9IGdldF9tdWx0aWRpbV9vcHRpb24oImJhdGNoX3NpemUiLCBvcHRpb25zLCB0aGlzLmRpbSwgNTApOwogICAgICAgIHRoaXMubWF4X2FkYXB0YXRpb24gPSBnZXRfbXVsdGlkaW1fb3B0aW9uKCJtYXhfYWRhcHRhdGlvbiIsIG9wdGlvbnMsIHRoaXMuZGltLCAwLjMzKTsKICAgICAgICB0aGlzLmluaXRpYWxfYWRhcHRhdGlvbiA9IGdldF9tdWx0aWRpbV9vcHRpb24oImluaXRpYWxfYWRhcHRhdGlvbiIsIG9wdGlvbnMsIHRoaXMuZGltLCAxLjApOwogICAgICAgIHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlID0gZ2V0X211bHRpZGltX29wdGlvbigidGFyZ2V0X2FjY2VwdF9yYXRlIiwgb3B0aW9ucywgdGhpcy5kaW0sIDAuNDQpOwogICAgICAgIHRoaXMuaXNfYWRhcHRpbmcgPSBnZXRfbXVsdGlkaW1fb3B0aW9uKCJpc19hZGFwdGluZyIsIG9wdGlvbnMsIHRoaXMuZGltLCB0cnVlKTsKCiAgICAgICAgLy8gVGhpcyBoYWNrIGJlbG93IGlzIGEgcmVjdXJzaXZlIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhbiBhcnJheSBvZiAKICAgICAgICAvLyBvbmUgZGltZW5zaW9uYWwgc3RlcHBlcnMgYWNjb3JkaW5nIHRvIGRpbS4KICAgICAgICB2YXIgY3JlYXRlX3N1YnN0ZXBwZXJzID0gZnVuY3Rpb24gKGRpbSwgc3Vic3RhdGUsIGxvZ19wb3N0LCBwcm9wX2xvZ19zY2FsZSwgYmF0Y2hfc2l6ZSwgbWF4X2FkYXB0YXRpb24sIGluaXRpYWxfYWRhcHRhdGlvbiwgdGFyZ2V0X2FjY2VwdF9yYXRlLCBpc19hZGFwdGluZykgewogICAgICAgICAgdmFyIHN1YnN0ZXBwZXJzID0gW107CiAgICAgICAgICBpZiAoZGltLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7CiAgICAgICAgICAgICAgdmFyIHN1Ym9wdGlvbnMgPSB7CiAgICAgICAgICAgICAgICBwcm9wX2xvZ19zY2FsZTogcHJvcF9sb2dfc2NhbGVbaV0sCiAgICAgICAgICAgICAgICBiYXRjaF9zaXplOiBiYXRjaF9zaXplW2ldLAogICAgICAgICAgICAgICAgbWF4X2FkYXB0YXRpb246IG1heF9hZGFwdGF0aW9uW2ldLAogICAgICAgICAgICAgICAgaW5pdGlhbF9hZGFwdGF0aW9uOiBpbml0aWFsX2FkYXB0YXRpb25baV0sCiAgICAgICAgICAgICAgICB0YXJnZXRfYWNjZXB0X3JhdGU6IHRhcmdldF9hY2NlcHRfcmF0ZVtpXSwKICAgICAgICAgICAgICAgIGlzX2FkYXB0aW5nOiBpc19hZGFwdGluZ1tpXQogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgdmFyIHN1YnBhcmFtID0ge307CiAgICAgICAgICAgICAgc3VicGFyYW1baV0gPSBkZWVwX2Nsb25lKHBhcmFtKTsKICAgICAgICAgICAgICBzdWJwYXJhbVtpXS5kaW0gPSBbMV07IC8vIEFzIHRoaXMgc2hvdWxkIG5vdyBiZSBhIG9uZS1kaW0gcGFyYW1ldGVyCiAgICAgICAgICAgICAgZGVsZXRlIHN1YnBhcmFtW2ldLmluaXQ7IC8vIEFzIGl0IHNvdWxkIG5vdCBiZSBuZWVkZWQKICAgICAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IG5ldyBTdWJTdGVwcGVyKHN1YnBhcmFtLCBzdWJzdGF0ZSwgbG9nX3Bvc3QsIHN1Ym9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7CiAgICAgICAgICAgICAgc3Vic3RlcHBlcnNbaV0gPSBjcmVhdGVfc3Vic3RlcHBlcnMoZGltLnNsaWNlKDEpLCBzdWJzdGF0ZVtpXSwgbG9nX3Bvc3QsIHByb3BfbG9nX3NjYWxlW2ldLCBiYXRjaF9zaXplW2ldLCBtYXhfYWRhcHRhdGlvbltpXSwgaW5pdGlhbF9hZGFwdGF0aW9uW2ldLCB0YXJnZXRfYWNjZXB0X3JhdGVbaV0sIGlzX2FkYXB0aW5nW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHN1YnN0ZXBwZXJzOwogICAgICAgIH07CiAgICAgICAgdGhpcy5zdWJzdGVwcGVycyA9IGNyZWF0ZV9zdWJzdGVwcGVycyh0aGlzLmRpbSwgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdLCB0aGlzLmxvZ19wb3N0LCB0aGlzLnByb3BfbG9nX3NjYWxlLCB0aGlzLmJhdGNoX3NpemUsIHRoaXMubWF4X2FkYXB0YXRpb24sIHRoaXMuaW5pdGlhbF9hZGFwdGF0aW9uLCB0aGlzLnRhcmdldF9hY2NlcHRfcmF0ZSwgdGhpcy5pc19hZGFwdGluZyk7CiAgICAgIH07CiAgICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdGVwcGVyLnByb3RvdHlwZSk7CiAgICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjsKICAgICAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAvLyBHbyB0aHJvdWdoIHRoZSBzdWJzdGVwcGVycyBpbiBhIHJhbmRvbSBvcmRlciBhbmQgY2FsbCBzdGVwKCkgb24gdGhlbS4KICAgICAgICByZXR1cm4gbmVzdGVkX2FycmF5X3JhbmRvbV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbiAoc3Vic3RlcHBlcikgewogICAgICAgICAgcmV0dXJuIHN1YnN0ZXBwZXIuc3RlcCgpOwogICAgICAgIH0pOwogICAgICB9OwogICAgICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5zdGFydF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgIG5lc3RlZF9hcnJheV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbiAoc3Vic3RlcHBlcikgewogICAgICAgICAgc3Vic3RlcHBlci5zdGFydF9hZGFwdGF0aW9uKCk7CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBuZXN0ZWRfYXJyYXlfYXBwbHkodGhpcy5zdWJzdGVwcGVycywgZnVuY3Rpb24gKHN1YnN0ZXBwZXIpIHsKICAgICAgICAgIHN1YnN0ZXBwZXIuc3RvcF9hZGFwdGF0aW9uKCk7CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIG5lc3RlZF9hcnJheV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbiAoc3Vic3RlcHBlcikgewogICAgICAgICAgcmV0dXJuIHN1YnN0ZXBwZXIuaW5mbygpOwogICAgICAgIH0pOwogICAgICB9OwoKICAgICAgLyoqCiAgICAgICAqIEBjbGFzcwogICAgICAgKiBAYXVnbWVudHMge011bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXJ9CiAgICAgICAqIEEgInN1YmNsYXNzIiBvZiBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIG1ha2luZyBjb250aW5vdXMgTm9ybWFsIHByb3Bvc2Fscy4KICAgICAgICovCiAgICAgIHZhciBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykgewogICAgICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgUmVhbE1ldHJvcG9saXNTdGVwcGVyKTsKICAgICAgfTsKICAgICAgTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7CiAgICAgIE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyOwoKICAgICAgLyoqCiAgICAgICAqIEBjbGFzcwogICAgICAgKiBAYXVnbWVudHMge011bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXJ9CiAgICAgICAqIEEgInN1YmNsYXNzIiBvZiBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIG1ha2luZyBkaXNjcmV0aXplZCBOb3JtYWwgcHJvcG9zYWxzLgogICAgICAgKi8KICAgICAgdmFyIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHsKICAgICAgICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIEludE1ldHJvcG9saXNTdGVwcGVyKTsKICAgICAgfTsKICAgICAgTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlKTsKICAgICAgTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyOwoKICAgICAgLyoqCiAgICAgICAqIEBjbGFzcwogICAgICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn0KICAgICAgICogQ29uc3RydWN0b3IgZm9yIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgYSBzdGVwIGZvciBhIGJpbmFyeSBwYXJhbWV0ZXIuCiAgICAgICAqIFRoaXMgaXMgZG9uZSBieSBldmFsdWF0aW5nIHRoZSBsb2cgcG9zdGVyaW9yIGZvciBib3RoIHN0YXRlcyBvZiB0aGUKICAgICAgICogcGFyYW1ldGVyIGFuZCB0aGVuIHNlbGVjdGluZyBhIHN0YXRlIHJhbmRvbWx5IHdpdGggcHJvYmFiaWxpdHkgcmVsYXRpdmUgCiAgICAgICAqIHRvIHRoZSBwb3N0ZXJpb3Igb2YgZWFjaCBzdGF0ZS4KICAgICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIGEgc2luZ2xlIHBhcmFtZXRlciBkZWZpbml0aW9uLgogICAgICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuCiAgICAgICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiAKICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zIHRvIHRoZSBzdGVwcGVyLgogICAgICAqLwogICAgICB2YXIgQmluYXJ5U3RlcHBlciA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykgewogICAgICAgIFN0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCk7CiAgICAgICAgdmFyIHBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpOwogICAgICAgIGlmIChwYXJhbV9uYW1lcy5sZW5ndGggPT0gMSkgewogICAgICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93ICJCaW5hcnlTdGVwcGVyIGNhbid0IGhhbmRsZSBtb3JlIHRoYW4gb25lIHBhcmFtZXRlci4iOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQmluYXJ5U3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN0ZXBwZXIucHJvdG90eXBlKTsKICAgICAgQmluYXJ5U3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCaW5hcnlTdGVwcGVyOwogICAgICBCaW5hcnlTdGVwcGVyLnByb3RvdHlwZS5zdGVwID0gZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IDA7CiAgICAgICAgdmFyIHplcm9fbG9nX2RlbnMgPSB0aGlzLmxvZ19wb3N0KCk7CiAgICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gMTsKICAgICAgICB2YXIgb25lX2xvZ19kZW5zID0gdGhpcy5sb2dfcG9zdCgpOwogICAgICAgIHZhciBtYXhfbG9nX2RlbnMgPSBNYXRoLm1heCh6ZXJvX2xvZ19kZW5zLCBvbmVfbG9nX2RlbnMpOwogICAgICAgIHplcm9fbG9nX2RlbnMgLT0gbWF4X2xvZ19kZW5zOwogICAgICAgIG9uZV9sb2dfZGVucyAtPSBtYXhfbG9nX2RlbnM7CiAgICAgICAgdmFyIHplcm9fcHJvYiA9IE1hdGguZXhwKHplcm9fbG9nX2RlbnMgLSBNYXRoLmxvZyhNYXRoLmV4cCh6ZXJvX2xvZ19kZW5zKSArIE1hdGguZXhwKG9uZV9sb2dfZGVucykpKTsKICAgICAgICBpZiAoTWF0aC5yYW5kb20oKSA8IHplcm9fcHJvYikgewogICAgICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gMDsKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0gLy8gZWxzZSBrZWVwIHRoZSBwYXJhbSBhdCAxIC4KICAgICAgICByZXR1cm4gMTsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAqIEBjbGFzcwogICAgICAqIEBpbXBsZW1lbnRzIHtTdGVwcGVyfQogICAgICAqIEp1c3QgbGlrZSBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIHRoaXMgU3RlcHBlciB0YWtlcyBhIHN0ZXBzIGZvcgogICAgICAqIGEgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIgYnkgdXBkYXRpbmcgZWFjaCBjb21wb25lbnQgaW4gdHVybi4gVGhlIGRpZmZlcmVuY2UKICAgICAgKiBpcyB0aGF0IHRoaXMgc3RlcHBlciB3b3JrcyBvbiBiaW5hcnkgcGFyYW1ldGVycy4KICAgICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyIGRlZmluaXRpb24gZm9yIGEgCiAgICAgICogICBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlci4KICAgICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuCiAgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIAogICAgICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci4KICAgICAgKi8KICAgICAgdmFyIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHsKICAgICAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpOwogICAgICAgIHZhciBwYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTsKICAgICAgICBpZiAocGFyYW1fbmFtZXMubGVuZ3RoID09IDEpIHsKICAgICAgICAgIHRoaXMucGFyYW1fbmFtZSA9IHBhcmFtX25hbWVzWzBdOwogICAgICAgICAgdmFyIHBhcmFtID0gdGhpcy5wYXJhbXNbdGhpcy5wYXJhbV9uYW1lXTsKICAgICAgICAgIHRoaXMuZGltID0gcGFyYW0uZGltOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyAiQmluYXJ5Q29tcG9uZW50U3RlcHBlciBjYW4ndCBoYW5kbGUgbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIuIjsKICAgICAgICB9CiAgICAgICAgdmFyIGNyZWF0ZV9zdWJzdGVwcGVycyA9IGZ1bmN0aW9uIChkaW0sIHN1YnN0YXRlLCBsb2dfcG9zdCkgewogICAgICAgICAgdmFyIHN1YnN0ZXBwZXJzID0gW107CiAgICAgICAgICB2YXIgaTsKICAgICAgICAgIGlmIChkaW0ubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykgewogICAgICAgICAgICAgIHZhciBzdWJwYXJhbXMgPSB7fTsKICAgICAgICAgICAgICBzdWJwYXJhbXNbaV0gPSBwYXJhbTsKICAgICAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IG5ldyBCaW5hcnlTdGVwcGVyKHN1YnBhcmFtcywgc3Vic3RhdGUsIGxvZ19wb3N0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7CiAgICAgICAgICAgICAgc3Vic3RlcHBlcnNbaV0gPSBjcmVhdGVfc3Vic3RlcHBlcnMoZGltLnNsaWNlKDEpLCBzdWJzdGF0ZVtpXSwgbG9nX3Bvc3QpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gc3Vic3RlcHBlcnM7CiAgICAgICAgfTsKICAgICAgICB0aGlzLnN1YnN0ZXBwZXJzID0gY3JlYXRlX3N1YnN0ZXBwZXJzKHRoaXMuZGltLCB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0sIHRoaXMubG9nX3Bvc3QpOwogICAgICB9OwogICAgICBCaW5hcnlDb21wb25lbnRTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOwogICAgICBCaW5hcnlDb21wb25lbnRTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJpbmFyeUNvbXBvbmVudFN0ZXBwZXI7CiAgICAgIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gR28gdGhyb3VnaCB0aGUgc3Vic3RlcHBlcnMgaW4gYSByYW5kb20gb3JkZXIgYW5kIGNhbGwgc3RlcCgpIG9uIHRoZW0uCiAgICAgICAgcmV0dXJuIG5lc3RlZF9hcnJheV9yYW5kb21fYXBwbHkodGhpcy5zdWJzdGVwcGVycywgZnVuY3Rpb24gKHN1YnN0ZXBwZXIpIHsKICAgICAgICAgIHJldHVybiBzdWJzdGVwcGVyLnN0ZXAoKTsKICAgICAgICB9KTsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAgKiBAY2xhc3MKICAgICAgICogQGltcGxlbWVudHMge1N0ZXBwZXJ9CiAgICAgICAqIFRoaXMgc3RlcHBlciBjYW4gYmUgcmVzcG9uc2libGUgZm9yIHRha2luZyBhIHN0ZXAgZm9yIG9uZSBvciBtb3JlIHBhcmFtZXRlcnMuCiAgICAgICAqIEZvciByZWFsIGFuZCBpbnQgcGFyYW1ldGVycyBpdCB0YWtlcyBNZXRyb3BvbGlzIHdpdGhpbiBHaWJicyBzdGVwcywgYW5kIGZvciAKICAgICAgICogYmluYXJ5IHBhcmFtZXRlcnMgaXQgZG9lcyBldmFsdWF0ZXMgdGhlIHBvc3RlcmlvciBmb3IgYm90aCBwYXJhbXRlciB2YWx1ZXMgYW5kCiAgICAgICAqIHJhbmRvbWx5IGNoYW5nZXMgdG8gYSBjZXJ0YWluIHZhbHVlIHByb3BvcnRpb25hbGx5IHRvIHRoYXQgdmFsdWUncyBwb3N0ZXJpb3IKICAgICAgICogKHRoaXMgaXMgYWxzbyBkb25lIGZvciBlYWNoIHBhcmFtZXRlciwgc28gYWxzbyBhICogd2l0aGluIEdpYmJzIGFwcHJvYWNoKS4KICAgICAgICogVGhpcyBzdGVwcGVyIGlzIGFsc28gYWRhcHRpdmUgYW5kIGNhbiBiZSBlZmZpY2llbnQgd2hlbiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKICAgICAgICogYXJlIG5vdCB0b28gaGlnaCBhbmQgdGhlIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHBhcmFtZXRlcnMgYXJlIGxvdy4KICAgICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIGEgb25lIG9yIG1vcmUgcGFyYW1ldGVyIGRlZmluaXRpb25zCiAgICAgICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy4KICAgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIAogICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuCiAgICAgICovCiAgICAgIHZhciBBbXdnU3RlcHBlciA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykgewogICAgICAgIFN0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCk7CiAgICAgICAgdGhpcy5wYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTsKICAgICAgICB0aGlzLnN1YnN0ZXBwZXJzID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhcmFtX25hbWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbdGhpcy5wYXJhbV9uYW1lc1tpXV07CiAgICAgICAgICB2YXIgU2VsZWN0U3RlcHBlcjsKICAgICAgICAgIHN3aXRjaCAocGFyYW0udHlwZSkgewogICAgICAgICAgICBjYXNlICJyZWFsIjoKICAgICAgICAgICAgICBpZiAoYXJyYXlfZXF1YWwocGFyYW0uZGltLCBbMV0pKSB7CiAgICAgICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gUmVhbE1ldHJvcG9saXNTdGVwcGVyOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJpbnQiOgogICAgICAgICAgICAgIGlmIChhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHsKICAgICAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBJbnRNZXRyb3BvbGlzU3RlcHBlcjsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJiaW5hcnkiOgogICAgICAgICAgICAgIGlmIChhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHsKICAgICAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBCaW5hcnlTdGVwcGVyOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gQmluYXJ5Q29tcG9uZW50U3RlcHBlcjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgdGhyb3cgIkFtd2dTdGVwcGVyIGNhbid0IGhhbmRsZSBwYXJhbWV0ZXIgIiArIHRoaXMucGFyYW1fbmFtZXNbaV0gKyAiIHdpdGggdHlwZSAiICsgcGFyYW0udHlwZTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBwYXJhbV9vYmplY3Rfd3JhcCA9IHt9OwogICAgICAgICAgcGFyYW1fb2JqZWN0X3dyYXBbdGhpcy5wYXJhbV9uYW1lc1tpXV0gPSBwYXJhbTsKICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgICAgICAgdmFyIHBhcmFtX29wdGlvbnMgPSBvcHRpb25zLnBhcmFtcyAmJiBvcHRpb25zLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVzW2ldXSB8fCB7fTsKICAgICAgICAgIHBhcmFtX29wdGlvbnMucHJvcF9sb2dfc2NhbGUgPSBwYXJhbV9vcHRpb25zLnByb3BfbG9nX3NjYWxlIHx8IG9wdGlvbnMucHJvcF9sb2dfc2NhbGU7CiAgICAgICAgICBwYXJhbV9vcHRpb25zLmJhdGNoX3NpemUgPSBwYXJhbV9vcHRpb25zLmJhdGNoX3NpemUgfHwgb3B0aW9ucy5iYXRjaF9zaXplOwogICAgICAgICAgcGFyYW1fb3B0aW9ucy5tYXhfYWRhcHRhdGlvbiA9IHBhcmFtX29wdGlvbnMubWF4X2FkYXB0YXRpb24gfHwgb3B0aW9ucy5tYXhfYWRhcHRhdGlvbjsKICAgICAgICAgIHBhcmFtX29wdGlvbnMuaW5pdGlhbF9hZGFwdGF0aW9uID0gcGFyYW1fb3B0aW9ucy5pbml0aWFsX2FkYXB0YXRpb24gfHwgb3B0aW9ucy5pbml0aWFsX2FkYXB0YXRpb247CiAgICAgICAgICBwYXJhbV9vcHRpb25zLnRhcmdldF9hY2NlcHRfcmF0ZSA9IHBhcmFtX29wdGlvbnMudGFyZ2V0X2FjY2VwdF9yYXRlIHx8IG9wdGlvbnMudGFyZ2V0X2FjY2VwdF9yYXRlOwogICAgICAgICAgcGFyYW1fb3B0aW9ucy5pc19hZGFwdGluZyA9IHBhcmFtX29wdGlvbnMuaXNfYWRhcHRpbmcgfHwgb3B0aW9ucy5pc19hZGFwdGluZzsKICAgICAgICAgIHRoaXMuc3Vic3RlcHBlcnNbaV0gPSBuZXcgU2VsZWN0U3RlcHBlcihwYXJhbV9vYmplY3Rfd3JhcCwgc3RhdGUsIGxvZ19wb3N0LCBwYXJhbV9vcHRpb25zKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIEFtd2dTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOwogICAgICBBbXdnU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBbXdnU3RlcHBlcjsKICAgICAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgc2h1ZmZsZV9hcnJheSh0aGlzLnN1YnN0ZXBwZXJzKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic3RlcHBlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHRoaXMuc3Vic3RlcHBlcnNbaV0uc3RlcCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZTsKICAgICAgfTsKICAgICAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN1YnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB0aGlzLnN1YnN0ZXBwZXJzW2ldLnN0YXJ0X2FkYXB0YXRpb24oKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIEFtd2dTdGVwcGVyLnByb3RvdHlwZS5zdG9wX2FkYXB0YXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN1YnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB0aGlzLnN1YnN0ZXBwZXJzW2ldLnN0b3BfYWRhcHRhdGlvbigpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGluZm8gPSB7fTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic3RlcHBlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGluZm9bdGhpcy5wYXJhbV9uYW1lc1tpXV0gPSB0aGlzLnN1YnN0ZXBwZXJzW2ldLmluZm8oKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGluZm87CiAgICAgIH07CgogICAgICAvLy8vLy8vLy8vLyBTYW1wbGVyIEZ1bmN0aW9ucyAvLy8vLy8vLy8vCiAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgIC8qKgogICAgICAqIEBpbnRlcmZhY2UKICAgICAgKiBXaGlsZSB5b3UgY291bGQgZml0IGEgbW9kZWwgYnkgcGFzdGluZyB0b2dldGhlciBTdGVwcGVycywgYQogICAgICAvLyBTYW1wbGVyIGlzIGhlcmUgaXMgYSBjb252ZW5pZW5jZSBjbGFzcyB3aGVyZSBhbiBpbnN0YW5jZSBvZiBTYW1wbGVyCiAgICAgIC8vIHNldHMgdXAgdGhlIFN0ZXBwZXJzLCBjaGVja3MgdGhlIHBhcmFtZXRlciBkZWZpbml0aW9uLAogICAgICAvLyBhbmQgbWFuYWdlcyB0aGUgc2FtcGxpbmcuIFRoaXMgaGVyZSBkZWZpbmVzIHRoZSBTYW1wbGVyICJpbnRlcmZhY2UiLgogICAgICAqIEBpbnRlcmZhY2UKICAgICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggcGFyYW1ldGVyIGRlZmluaXRpb25zLCBmb3IgZXhhbXBsZToKICAgICAgKiAgIHsibXUiOiB7InR5cGUiOiAicmVhbCJ9LCAic2lnbWEiOiB7InR5cGUiOiAicmVhbCIsICJsb3dlciIgPSAwfX0KICAgICAgKiAgIFRoZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMgZG9lc24ndCBoYXZlIHRvIGJlICJjb21wbGV0ZSIgYW5kIHByb3BlcnRpZXMKICAgICAgKiAgIGxlZnQgb3V0IChsaWtlIGxvd2VyIGFuZCB1cHBlcikgd2lsbCBiZSBmaWxsZWQgaW4gYnkgZGVmYXVsdHMuCiAgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB3aXRoIHNpZ25hdHVyZSBmdW5jdGlvbihzdGF0ZSwgZGF0YSkuIEhlcmUKICAgICAgKiAgIHN0YXRlIHdpbGwgYmUgYW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc3RhdGUgd2l0aCBlYWNoIHBhcmFtZXRlciBhcyBhIAogICAgICAqICAga2V5IGFuZCB0aGUgcGFyYW1ldGVyIHZhbHVlcyBhcyBudW1iZXJzIG9yIGFycmF5cy4gRm9yIGV4YW1wbGU6CiAgICAgICogICB7Im11IjogMywgInNpZ21hIjogMS41fS4gVGhlIGRhdGEgYXJndW1lbnQgd2lsbCBiZSB0aGUgc2FtZSBvYmplY3QgYXMgCiAgICAgICogICB0aGUgZGF0YSBhcmd1bWVudCBnaXZlbiBiZWxvdy4KICAgICAgKiBAcGFyYW0gZGF0YSAtIGFuIG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIG9uIHRvIHRoZSBsb2dfcG9zdCBmdW5jdGlvbgogICAgICAqICAgd2hlbiBzYW1wbGluZy4KICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHNhbXBsZXIuCiAgICAgICovCiAgICAgIHZhciBTYW1wbGVyID0gZnVuY3Rpb24gKHBhcmFtcywgbG9nX3Bvc3QsIGRhdGEsIG9wdGlvbnMpIHsKICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOwogICAgICAgIHRoaXMucGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7CgogICAgICAgIC8vIFNldHRpbmcgZGVmYXVsdCBvcHRpb25zIGlmIG5vdCBwYXNzZWQgdGhyb3VnaCB0aGUgb3B0aW9ucyBvYmplY3QKICAgICAgICB0aGlzLnBhcmFtX2luaXRfZnVuID0gZ2V0X29wdGlvbigicGFyYW1faW5pdF9mdW4iLCBvcHRpb25zLCBwYXJhbV9pbml0X2ZpeGVkKTsKICAgICAgICB2YXIgdGhpbm5pbmdfaW50ZXJ2YWwgPSBnZXRfb3B0aW9uKCJ0aGluIiwgb3B0aW9ucywgMSk7CiAgICAgICAgdmFyIHBhcmFtc190b19tb25pdG9yID0gZ2V0X29wdGlvbigibW9uaXRvciIsIG9wdGlvbnMsIG51bGwpOwogICAgICAgIHRoaXMudGhpbih0aGlubmluZ19pbnRlcnZhbCk7CiAgICAgICAgdGhpcy5tb25pdG9yKHBhcmFtc190b19tb25pdG9yKTsKICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgIC8vIENvbXBsZXRpbmcgdGhlIHBhcmFtcyBhbmQgaW5pdGlhbGl6aW5nIHRoZSBzdGF0ZS4KICAgICAgICB0aGlzLnBhcmFtcyA9IGNvbXBsZXRlX3BhcmFtcyh0aGlzLnBhcmFtcywgdGhpcy5wYXJhbV9pbml0X2Z1bik7CiAgICAgICAgdmFyIHN0YXRlID0ge307CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhcmFtX25hbWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBzdGF0ZVt0aGlzLnBhcmFtX25hbWVzW2ldXSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZXNbaV1dLmluaXQ7CiAgICAgICAgfQogICAgICAgIHRoaXMubG9nX3Bvc3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICByZXR1cm4gbG9nX3Bvc3Qoc3RhdGUsIGRhdGEpOwogICAgICAgIH07CiAgICAgICAgLy8gUnVubmluZyB0aGUgbG9nX3Bvc3QgZnVuY3Rpb24gb25jZSBpbiBjYXNlIGl0IGZ1cnRoZXIgbW9kaWZpZXMgdGhlIHN0YXRlCiAgICAgICAgLy8gZm9yIGV4YW1wbGUgYWRkaW5nIGRlcml2ZWQgcXVhbnRpdGllcy4KICAgICAgICB0aGlzLmxvZ19wb3N0KCk7CiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOwogICAgICAgIHRoaXMuc3RlcHBlcnMgPSB0aGlzLmNyZWF0ZV9zdGVwcGVyX2Vuc2FtYmxlKHRoaXMucGFyYW1zLCB0aGlzLnN0YXRlLCB0aGlzLmxvZ19wb3N0LCB0aGlzLm9wdGlvbnMpOwogICAgICB9OwoKICAgICAgLyoqIFNob3VsZCByZXR1cm4gYSB2ZWN0b3Igb2Ygc3RlcHBlcnMgdGhhdCB3aGVuIGNhbGxlZCAKICAgICAgICogc2hvdWxkIHRha2UgYSBzdGVwIGluIHRoZSBwYXJhbWV0ZXIgc3BhY2UuCiAgICAgICAqLwogICAgICBTYW1wbGVyLnByb3RvdHlwZS5jcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSA9IGZ1bmN0aW9uIChzdGF0ZSwgbG9nX3Bvc3QpIHsKICAgICAgICB0aHJvdyAiRXZlcnkgU2FtcGxlciBuZWVkcyB0byBpbXBsZW1lbnQgY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUoKSI7CiAgICAgIH07CgogICAgICAvKiogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBpbmZvIGFib3V0IHRoZSBzdGF0ZSBvZiB0aGUgU2FtcGxlci4KICAgICAgICovCiAgICAgIFNhbXBsZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHN0YXRlOiB0aGlzLnN0YXRlLAogICAgICAgICAgdGhpbjogdGhpcy50aGluLAogICAgICAgICAgbW9uaXRvcjogdGhpcy5tb25pdG9yLAogICAgICAgICAgc3RlcHBlcnM6IHRoaXMuc3RlcHBlcnMKICAgICAgICB9OwogICAgICB9OwoKICAgICAgLyoqIFRha2VzIGEgc3RlcCBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlLiBSZXR1cm5zIHRoZSBuZXcgc3BhY2UKICAgICAgICogYnV0IGFsc28gbW9kaWZpZXMgdGhlIHN0YXRlIGluIHBsYWNlLgogICAgICAgKi8KICAgICAgU2FtcGxlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBzaHVmZmxlX2FycmF5KHRoaXMuc3RlcHBlcnMpOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zdGVwcGVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgdGhpcy5zdGVwcGVyc1tpXS5zdGVwKCk7CiAgICAgICAgfQogICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnN0YXRlKS5sZW5ndGggPiBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcykubGVuZ3RoKSB7CiAgICAgICAgICAvLyBUaGUgc3RhdGUgY29udGFpbnMgZGV2aXZlZCBxdWFudGl0aWVzIChub3Qgb25seSBwYXJhbWV0ZXJzKSBhbmQgd2UKICAgICAgICAgIC8vIG5lZWQgdG8gcnVuIHRoZSBsb2dfcG9zdCBvbmNlIG1vcmUgaW4gb3JkZXIgdG8gc2V0IHRoZSBkZXJpdmVkIHF1YW50aXRpZXMKICAgICAgICAgIC8vIGZvciB0aGUgZmluYWwgcGFyYW1ldGVyIHN0YXRlCiAgICAgICAgICB0aGlzLmxvZ19wb3N0KCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLnN0YXRlOwogICAgICB9OwoKICAgICAgLyoqCiAgICAgICAqIFRha2VzIG5faXRlcmF0aW9ucyBzdGVwcyBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlIGFuZCByZXR1cm5zIHRoZW0KICAgICAgICogYXMgYW4gb2JqZWN0IG9mIGFycmF5cyB3aXRoIG9uZSBhcnJheSBwZXIgcGFyYW1ldGVyLiBGb3IgZXhhbXBsZToKICAgICAgICoge211OiBbMSwgLTEsIDIsIDMsIC4uLl0sIHNpZ21hOiBbMSwgMiwgMiwgMSwgLi4uXX0uCiAgICAgICAqIElmIHRoaW4gaXMgPiAxIHRoZW4gbl9pdGVyYXRpb25zIC8gdGhpbiBzYW1wbGVzIGFyZSByZXR1cm5lZC4KICAgICAgICovCiAgICAgIFNhbXBsZXIucHJvdG90eXBlLnNhbXBsZSA9IGZ1bmN0aW9uIChuX2l0ZXJhdGlvbnMpIHsKICAgICAgICAvLyBJbml0aWFsaXppbmcgY3Vycl9zYW1wbGUgd2hlcmUgdGhlIHNhbXBsZSBpcyBnb2luZyB0byBiZSBzYXZlZAogICAgICAgIC8vIGFzIGFuIG9iamVjdCBjb250YWluaW5nIG9uZSBhcnJheSBwZXIgcGFyYW1ldGVyIHRvIGJlIG1vbml0b3JlZC4KICAgICAgICB2YXIgaSwgaiwgbW9uaXRvcmVkX3BhcmFtczsKICAgICAgICBpZiAodGhpcy5tb25pdG9yZWRfcGFyYW1zID09PSBudWxsKSB7CiAgICAgICAgICBtb25pdG9yZWRfcGFyYW1zID0gT2JqZWN0LmtleXModGhpcy5zdGF0ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG1vbml0b3JlZF9wYXJhbXMgPSB0aGlzLm1vbml0b3JlZF9wYXJhbXM7CiAgICAgICAgfQogICAgICAgIHZhciBjdXJyX3NhbXBsZSA9IHt9OwogICAgICAgIGZvciAoaiA9IDA7IGogPCBtb25pdG9yZWRfcGFyYW1zLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICBjdXJyX3NhbXBsZVttb25pdG9yZWRfcGFyYW1zW2pdXSA9IFtdOwogICAgICAgIH0KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbl9pdGVyYXRpb25zOyBpKyspIHsKICAgICAgICAgIGlmIChpICUgdGhpcy50aGlubmluZ19pbnRlcnZhbCA9PT0gMCkgewogICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbW9uaXRvcmVkX3BhcmFtcy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgIHZhciBwYXJhbSA9IG1vbml0b3JlZF9wYXJhbXNbal07CiAgICAgICAgICAgICAgY3Vycl9zYW1wbGVbcGFyYW1dLnB1c2goY2xvbmVfcGFyYW1fZHJhdyh0aGlzLnN0YXRlW3BhcmFtXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLnN0ZXAoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGN1cnJfc2FtcGxlOwogICAgICB9OwoKICAgICAgLyoqCiAgICAgICAqIFRha2VzIG5faXRlcmF0aW9uIHN0ZXBzIGluIHBhcmFtZXRlciBzcGFjZSBidXQgcmV0dXJucyBub3RoaW5nLgogICAgICAgKi8KICAgICAgU2FtcGxlci5wcm90b3R5cGUuYnVybiA9IGZ1bmN0aW9uIChuX2l0ZXJhdGlvbnMpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5faXRlcmF0aW9uczsgaSsrKSB7CiAgICAgICAgICB0aGlzLnN0ZXAoKTsKICAgICAgICB9CiAgICAgIH07CgogICAgICAvKioKICAgICAgICogU2V0cyB3aGF0IHBhcmFtZXRlcnMgc2hvdWxkIGJlIG1vbml0b3JlZCBhbmQgcmV0dXJuZWQgd2hlbiBjYWxsaW5nCiAgICAgICAqIHNhbXBsZS4KICAgICAgICovCiAgICAgIFNhbXBsZXIucHJvdG90eXBlLm1vbml0b3IgPSBmdW5jdGlvbiAocGFyYW1zX3RvX21vbml0b3IpIHsKICAgICAgICB0aGlzLm1vbml0b3JlZF9wYXJhbXMgPSBwYXJhbXNfdG9fbW9uaXRvcjsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAgKiBTZXRzIHRoZSB0aGlubmluZy4gRm9yIGV4YW1wbGUgdGhpbiA9PSAxMCBtZWFucyB0aGF0IGV2ZXJ5IDEwdGggcG9zdGVyaW9yCiAgICAgICAqIGRyYXcgd2lsbCBiZSBrZXB0LgogICAgICAgKi8KICAgICAgU2FtcGxlci5wcm90b3R5cGUudGhpbiA9IGZ1bmN0aW9uICh0aGlubmluZ19pbnRlcnZhbCkgewogICAgICAgIHRoaXMudGhpbm5pbmdfaW50ZXJ2YWwgPSB0aGlubmluZ19pbnRlcnZhbDsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAgKiBTZXRzIGFkYXB0YXRpb24gb24sIGlmIGFwcGxpY2FibGUsIGluIGFsbCBzdGVwcGVycy4KICAgICAgICovCiAgICAgIFNhbXBsZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB0aGlzLnN0ZXBwZXJzW2ldLnN0YXJ0X2FkYXB0YXRpb24oKTsKICAgICAgICB9CiAgICAgIH07CgogICAgICAvKioKICAgICAgKiBTZXRzIGFkYXB0YXRpb24gb2ZmLCBpZiBhcHBsaWNhYmxlLCBpbiBhbGwgc3RlcHBlcnMuCiAgICAgICovCiAgICAgIFNhbXBsZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3RlcHBlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHRoaXMuc3RlcHBlcnNbaV0uc3RvcF9hZGFwdGF0aW9uKCk7CiAgICAgICAgfQogICAgICB9OwoKICAgICAgLyoqCiAgICAgICogQGNsYXNzCiAgICAgICogQGltcGxlbWVudHMge1NhbXBsZXJ9CiAgICAgICogVGhpcyBzYW1wbGVyIHVzZXMgdGhlIEFtd2dTdGVwcGVyIGFzIHRoZSBzdGVwcGVyIGZ1bmN0aW9uIHdoaWNoIGltcGxlbWVudHMgdGhlIAogICAgICAqIEFkYXB0aXZlIE1ldHJvcG9saXMtV2l0aGluLUdpYmJzIGFsZ29yaXRobSBpbiAiRXhhbXBsZXMgb2YgQWRhcHRpdmUgTUNNQyIKICAgICAgKiBieSBSb2JlcnRzIGFuZCBSb3NlbnRoYWwgKDIwMDgpLiBBbiBhZGl0aW9uIGlzIHRoYXQgaXQgaGFuZGxlcyBpbnQgcGFyYW1ldGVycwogICAgICAqIGJ5IG1ha2luZyBkaXNjcmV0ZSBOb3JtYWwgcHJvcG9zYWxzIGFuZCBiaW5hcnkgcGFyYW1ldGVycyBieSB0YWtpbmcgb24gYSBuZXcgCiAgICAgICogdmFsdWUgcHJvcG9ydGlvbmFsIHRvIHRoZSBwb3N0ZXJpb3Igb2YgdGhlIHR3byBwb3NzaWJsZSBzdGF0ZXMgb2YgdGhlCiAgICAgICogcGFyYW1ldGVyLiBUaGlzIHNhbXBsZXIgY2FuIGJlIGVmZmljaWVudCB3aGVuIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycwogICAgICAqIGFyZSBub3QgdG9vIGhpZ2ggYW5kIHRoZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBwYXJhbWV0ZXJzIGFyZSBsb3cuCiAgICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIGEgb25lIG9yIG1vcmUgcGFyYW1ldGVyIGRlZmluaXRpb25zCiAgICAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLgogICAgICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiAKICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuCiAgICAgICovCiAgICAgIHZhciBBbXdnU2FtcGxlciA9IGZ1bmN0aW9uIChwYXJhbXMsIGxvZ19wb3N0LCBkYXRhLCBvcHRpb25zKSB7CiAgICAgICAgU2FtcGxlci5jYWxsKHRoaXMsIHBhcmFtcywgbG9nX3Bvc3QsIGRhdGEsIG9wdGlvbnMpOwogICAgICB9OwogICAgICBBbXdnU2FtcGxlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNhbXBsZXIucHJvdG90eXBlKTsKICAgICAgQW13Z1NhbXBsZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQW13Z1NhbXBsZXI7CiAgICAgIEFtd2dTYW1wbGVyLnByb3RvdHlwZS5jcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykgewogICAgICAgIHJldHVybiBbbmV3IEFtd2dTdGVwcGVyKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKV07CiAgICAgIH07CgogICAgICAvLyBSZXR1cm5pbmcgdGhlIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBwdWJsaWNseSBleHBvc2VkIGJ5IHRoaXMgbW9kdWxlCiAgICAgIHJldHVybiB7CiAgICAgICAgcnVuaWY6IHJ1bmlmLAogICAgICAgIHJ1bmlmX2Rpc2NyZXRlOiBydW5pZl9kaXNjcmV0ZSwKICAgICAgICBybm9ybTogcm5vcm0sCiAgICAgICAgcGFyYW1faW5pdF9maXhlZDogcGFyYW1faW5pdF9maXhlZCwKICAgICAgICBjb21wbGV0ZV9wYXJhbXM6IGNvbXBsZXRlX3BhcmFtcywKICAgICAgICBSZWFsTWV0cm9wb2xpc1N0ZXBwZXI6IFJlYWxNZXRyb3BvbGlzU3RlcHBlciwKICAgICAgICBJbnRNZXRyb3BvbGlzU3RlcHBlcjogSW50TWV0cm9wb2xpc1N0ZXBwZXIsCiAgICAgICAgTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI6IE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLAogICAgICAgIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI6IE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIsCiAgICAgICAgQmluYXJ5U3RlcHBlcjogQmluYXJ5U3RlcHBlciwKICAgICAgICBCaW5hcnlDb21wb25lbnRTdGVwcGVyOiBCaW5hcnlDb21wb25lbnRTdGVwcGVyLAogICAgICAgIEFtd2dTdGVwcGVyOiBBbXdnU3RlcHBlciwKICAgICAgICBBbXdnU2FtcGxlcjogQW13Z1NhbXBsZXIKICAgICAgfTsKICAgIH0pOwogIH0pKG1jbWMkMSk7CiAgdmFyIG1jbWNFeHBvcnRzID0gbWNtYyQxLmV4cG9ydHM7CgogIGZ1bmN0aW9uIGFzY2VuZGluZyQxKGEsIGIpIHsKICAgIHJldHVybiBhID09IG51bGwgfHwgYiA9PSBudWxsID8gTmFOIDogYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47CiAgfQoKICBmdW5jdGlvbiogbnVtYmVycyh2YWx1ZXMsIHZhbHVlb2YpIHsKICAgIHsKICAgICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7CiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKHZhbHVlID0gK3ZhbHVlKSA+PSB2YWx1ZSkgewogICAgICAgICAgeWllbGQgdmFsdWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjb21wYXJlRGVmaW5lZChjb21wYXJlID0gYXNjZW5kaW5nJDEpIHsKICAgIGlmIChjb21wYXJlID09PSBhc2NlbmRpbmckMSkgcmV0dXJuIGFzY2VuZGluZ0RlZmluZWQ7CiAgICBpZiAodHlwZW9mIGNvbXBhcmUgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoImNvbXBhcmUgaXMgbm90IGEgZnVuY3Rpb24iKTsKICAgIHJldHVybiAoYSwgYikgPT4gewogICAgICBjb25zdCB4ID0gY29tcGFyZShhLCBiKTsKICAgICAgaWYgKHggfHwgeCA9PT0gMCkgcmV0dXJuIHg7CiAgICAgIHJldHVybiAoY29tcGFyZShiLCBiKSA9PT0gMCkgLSAoY29tcGFyZShhLCBhKSA9PT0gMCk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBhc2NlbmRpbmdEZWZpbmVkKGEsIGIpIHsKICAgIHJldHVybiAoYSA9PSBudWxsIHx8ICEoYSA+PSBhKSkgLSAoYiA9PSBudWxsIHx8ICEoYiA+PSBiKSkgfHwgKGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwKTsKICB9CgogIGZ1bmN0aW9uIG1heCh2YWx1ZXMsIHZhbHVlb2YpIHsKICAgIGxldCBtYXg7CiAgICB7CiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7CiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKG1heCA8IHZhbHVlIHx8IG1heCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkgewogICAgICAgICAgbWF4ID0gdmFsdWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbWF4OwogIH0KCiAgZnVuY3Rpb24gbWluKHZhbHVlcywgdmFsdWVvZikgewogICAgbGV0IG1pbjsKICAgIHsKICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHsKICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAobWluID4gdmFsdWUgfHwgbWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSB7CiAgICAgICAgICBtaW4gPSB2YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBtaW47CiAgfQoKICAvLyBCYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vbW91cm5lci9xdWlja3NlbGVjdAogIC8vIElTQyBsaWNlbnNlLCBDb3B5cmlnaHQgMjAxOCBWbGFkaW1pciBBZ2Fmb25raW4uCiAgZnVuY3Rpb24gcXVpY2tzZWxlY3QoYXJyYXksIGssIGxlZnQgPSAwLCByaWdodCA9IEluZmluaXR5LCBjb21wYXJlKSB7CiAgICBrID0gTWF0aC5mbG9vcihrKTsKICAgIGxlZnQgPSBNYXRoLmZsb29yKE1hdGgubWF4KDAsIGxlZnQpKTsKICAgIHJpZ2h0ID0gTWF0aC5mbG9vcihNYXRoLm1pbihhcnJheS5sZW5ndGggLSAxLCByaWdodCkpOwogICAgaWYgKCEobGVmdCA8PSBrICYmIGsgPD0gcmlnaHQpKSByZXR1cm4gYXJyYXk7CiAgICBjb21wYXJlID0gY29tcGFyZSA9PT0gdW5kZWZpbmVkID8gYXNjZW5kaW5nRGVmaW5lZCA6IGNvbXBhcmVEZWZpbmVkKGNvbXBhcmUpOwogICAgd2hpbGUgKHJpZ2h0ID4gbGVmdCkgewogICAgICBpZiAocmlnaHQgLSBsZWZ0ID4gNjAwKSB7CiAgICAgICAgY29uc3QgbiA9IHJpZ2h0IC0gbGVmdCArIDE7CiAgICAgICAgY29uc3QgbSA9IGsgLSBsZWZ0ICsgMTsKICAgICAgICBjb25zdCB6ID0gTWF0aC5sb2cobik7CiAgICAgICAgY29uc3QgcyA9IDAuNSAqIE1hdGguZXhwKDIgKiB6IC8gMyk7CiAgICAgICAgY29uc3Qgc2QgPSAwLjUgKiBNYXRoLnNxcnQoeiAqIHMgKiAobiAtIHMpIC8gbikgKiAobSAtIG4gLyAyIDwgMCA/IC0xIDogMSk7CiAgICAgICAgY29uc3QgbmV3TGVmdCA9IE1hdGgubWF4KGxlZnQsIE1hdGguZmxvb3IoayAtIG0gKiBzIC8gbiArIHNkKSk7CiAgICAgICAgY29uc3QgbmV3UmlnaHQgPSBNYXRoLm1pbihyaWdodCwgTWF0aC5mbG9vcihrICsgKG4gLSBtKSAqIHMgLyBuICsgc2QpKTsKICAgICAgICBxdWlja3NlbGVjdChhcnJheSwgaywgbmV3TGVmdCwgbmV3UmlnaHQsIGNvbXBhcmUpOwogICAgICB9CiAgICAgIGNvbnN0IHQgPSBhcnJheVtrXTsKICAgICAgbGV0IGkgPSBsZWZ0OwogICAgICBsZXQgaiA9IHJpZ2h0OwogICAgICBzd2FwKGFycmF5LCBsZWZ0LCBrKTsKICAgICAgaWYgKGNvbXBhcmUoYXJyYXlbcmlnaHRdLCB0KSA+IDApIHN3YXAoYXJyYXksIGxlZnQsIHJpZ2h0KTsKICAgICAgd2hpbGUgKGkgPCBqKSB7CiAgICAgICAgc3dhcChhcnJheSwgaSwgaiksICsraSwgLS1qOwogICAgICAgIHdoaWxlIChjb21wYXJlKGFycmF5W2ldLCB0KSA8IDApICsraTsKICAgICAgICB3aGlsZSAoY29tcGFyZShhcnJheVtqXSwgdCkgPiAwKSAtLWo7CiAgICAgIH0KICAgICAgaWYgKGNvbXBhcmUoYXJyYXlbbGVmdF0sIHQpID09PSAwKSBzd2FwKGFycmF5LCBsZWZ0LCBqKTtlbHNlICsraiwgc3dhcChhcnJheSwgaiwgcmlnaHQpOwogICAgICBpZiAoaiA8PSBrKSBsZWZ0ID0gaiArIDE7CiAgICAgIGlmIChrIDw9IGopIHJpZ2h0ID0gaiAtIDE7CiAgICB9CiAgICByZXR1cm4gYXJyYXk7CiAgfQogIGZ1bmN0aW9uIHN3YXAoYXJyYXksIGksIGopIHsKICAgIGNvbnN0IHQgPSBhcnJheVtpXTsKICAgIGFycmF5W2ldID0gYXJyYXlbal07CiAgICBhcnJheVtqXSA9IHQ7CiAgfQoKICBmdW5jdGlvbiBxdWFudGlsZSh2YWx1ZXMsIHAsIHZhbHVlb2YpIHsKICAgIHZhbHVlcyA9IEZsb2F0NjRBcnJheS5mcm9tKG51bWJlcnModmFsdWVzKSk7CiAgICBpZiAoIShuID0gdmFsdWVzLmxlbmd0aCkgfHwgaXNOYU4ocCA9ICtwKSkgcmV0dXJuOwogICAgaWYgKHAgPD0gMCB8fCBuIDwgMikgcmV0dXJuIG1pbih2YWx1ZXMpOwogICAgaWYgKHAgPj0gMSkgcmV0dXJuIG1heCh2YWx1ZXMpOwogICAgdmFyIG4sCiAgICAgIGkgPSAobiAtIDEpICogcCwKICAgICAgaTAgPSBNYXRoLmZsb29yKGkpLAogICAgICB2YWx1ZTAgPSBtYXgocXVpY2tzZWxlY3QodmFsdWVzLCBpMCkuc3ViYXJyYXkoMCwgaTAgKyAxKSksCiAgICAgIHZhbHVlMSA9IG1pbih2YWx1ZXMuc3ViYXJyYXkoaTAgKyAxKSk7CiAgICByZXR1cm4gdmFsdWUwICsgKHZhbHVlMSAtIHZhbHVlMCkgKiAoaSAtIGkwKTsKICB9CgogIGZ1bmN0aW9uIG1lZGlhbih2YWx1ZXMsIHZhbHVlb2YpIHsKICAgIHJldHVybiBxdWFudGlsZSh2YWx1ZXMsIDAuNSk7CiAgfQoKICB2YXIgbm9vcCA9IHsKICAgIHZhbHVlOiAoKSA9PiB7fQogIH07CiAgZnVuY3Rpb24gZGlzcGF0Y2goKSB7CiAgICBmb3IgKHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGgsIF8gPSB7fSwgdDsgaSA8IG47ICsraSkgewogICAgICBpZiAoISh0ID0gYXJndW1lbnRzW2ldICsgIiIpIHx8IHQgaW4gXyB8fCAvW1xzLl0vLnRlc3QodCkpIHRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiICsgdCk7CiAgICAgIF9bdF0gPSBbXTsKICAgIH0KICAgIHJldHVybiBuZXcgRGlzcGF0Y2goXyk7CiAgfQogIGZ1bmN0aW9uIERpc3BhdGNoKF8pIHsKICAgIHRoaXMuXyA9IF87CiAgfQogIGZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzJDEodHlwZW5hbWVzLCB0eXBlcykgewogICAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XHMrLykubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgIHZhciBuYW1lID0gIiIsCiAgICAgICAgaSA9IHQuaW5kZXhPZigiLiIpOwogICAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpOwogICAgICBpZiAodCAmJiAhdHlwZXMuaGFzT3duUHJvcGVydHkodCkpIHRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiICsgdCk7CiAgICAgIHJldHVybiB7CiAgICAgICAgdHlwZTogdCwKICAgICAgICBuYW1lOiBuYW1lCiAgICAgIH07CiAgICB9KTsKICB9CiAgRGlzcGF0Y2gucHJvdG90eXBlID0gZGlzcGF0Y2gucHJvdG90eXBlID0gewogICAgY29uc3RydWN0b3I6IERpc3BhdGNoLAogICAgb246IGZ1bmN0aW9uICh0eXBlbmFtZSwgY2FsbGJhY2spIHsKICAgICAgdmFyIF8gPSB0aGlzLl8sCiAgICAgICAgVCA9IHBhcnNlVHlwZW5hbWVzJDEodHlwZW5hbWUgKyAiIiwgXyksCiAgICAgICAgdCwKICAgICAgICBpID0gLTEsCiAgICAgICAgbiA9IFQubGVuZ3RoOwoKICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBjYWxsYmFjayBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS4KICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgodCA9ICh0eXBlbmFtZSA9IFRbaV0pLnR5cGUpICYmICh0ID0gZ2V0JDEoX1t0XSwgdHlwZW5hbWUubmFtZSkpKSByZXR1cm4gdDsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIC8vIElmIGEgdHlwZSB3YXMgc3BlY2lmaWVkLCBzZXQgdGhlIGNhbGxiYWNrIGZvciB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS4KICAgICAgLy8gT3RoZXJ3aXNlLCBpZiBhIG51bGwgY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmVtb3ZlIGNhbGxiYWNrcyBvZiB0aGUgZ2l2ZW4gbmFtZS4KICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwgJiYgdHlwZW9mIGNhbGxiYWNrICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIgKyBjYWxsYmFjayk7CiAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgaWYgKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSBfW3RdID0gc2V0JDEoX1t0XSwgdHlwZW5hbWUubmFtZSwgY2FsbGJhY2spO2Vsc2UgaWYgKGNhbGxiYWNrID09IG51bGwpIGZvciAodCBpbiBfKSBfW3RdID0gc2V0JDEoX1t0XSwgdHlwZW5hbWUubmFtZSwgbnVsbCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAogICAgY29weTogZnVuY3Rpb24gKCkgewogICAgICB2YXIgY29weSA9IHt9LAogICAgICAgIF8gPSB0aGlzLl87CiAgICAgIGZvciAodmFyIHQgaW4gXykgY29weVt0XSA9IF9bdF0uc2xpY2UoKTsKICAgICAgcmV0dXJuIG5ldyBEaXNwYXRjaChjb3B5KTsKICAgIH0sCiAgICBjYWxsOiBmdW5jdGlvbiAodHlwZSwgdGhhdCkgewogICAgICBpZiAoKG4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMikgPiAwKSBmb3IgKHZhciBhcmdzID0gbmV3IEFycmF5KG4pLCBpID0gMCwgbiwgdDsgaSA8IG47ICsraSkgYXJnc1tpXSA9IGFyZ3VtZW50c1tpICsgMl07CiAgICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIiArIHR5cGUpOwogICAgICBmb3IgKHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7CiAgICB9LAogICAgYXBwbHk6IGZ1bmN0aW9uICh0eXBlLCB0aGF0LCBhcmdzKSB7CiAgICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIiArIHR5cGUpOwogICAgICBmb3IgKHZhciB0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpOwogICAgfQogIH07CiAgZnVuY3Rpb24gZ2V0JDEodHlwZSwgbmFtZSkgewogICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aCwgYzsgaSA8IG47ICsraSkgewogICAgICBpZiAoKGMgPSB0eXBlW2ldKS5uYW1lID09PSBuYW1lKSB7CiAgICAgICAgcmV0dXJuIGMudmFsdWU7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gc2V0JDEodHlwZSwgbmFtZSwgY2FsbGJhY2spIHsKICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHlwZS5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKHR5cGVbaV0ubmFtZSA9PT0gbmFtZSkgewogICAgICAgIHR5cGVbaV0gPSBub29wLCB0eXBlID0gdHlwZS5zbGljZSgwLCBpKS5jb25jYXQodHlwZS5zbGljZShpICsgMSkpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgdHlwZS5wdXNoKHsKICAgICAgbmFtZTogbmFtZSwKICAgICAgdmFsdWU6IGNhbGxiYWNrCiAgICB9KTsKICAgIHJldHVybiB0eXBlOwogIH0KCiAgdmFyIHhodG1sID0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOwogIHZhciBuYW1lc3BhY2VzID0gewogICAgc3ZnOiAiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLAogICAgeGh0bWw6IHhodG1sLAogICAgeGxpbms6ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiwKICAgIHhtbDogImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsCiAgICB4bWxuczogImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIgogIH07CgogIGZ1bmN0aW9uIG5hbWVzcGFjZSAobmFtZSkgewogICAgdmFyIHByZWZpeCA9IG5hbWUgKz0gIiIsCiAgICAgIGkgPSBwcmVmaXguaW5kZXhPZigiOiIpOwogICAgaWYgKGkgPj0gMCAmJiAocHJlZml4ID0gbmFtZS5zbGljZSgwLCBpKSkgIT09ICJ4bWxucyIpIG5hbWUgPSBuYW1lLnNsaWNlKGkgKyAxKTsKICAgIHJldHVybiBuYW1lc3BhY2VzLmhhc093blByb3BlcnR5KHByZWZpeCkgPyB7CiAgICAgIHNwYWNlOiBuYW1lc3BhY2VzW3ByZWZpeF0sCiAgICAgIGxvY2FsOiBuYW1lCiAgICB9IDogbmFtZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnMKICB9CgogIGZ1bmN0aW9uIGNyZWF0b3JJbmhlcml0KG5hbWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBkb2N1bWVudCA9IHRoaXMub3duZXJEb2N1bWVudCwKICAgICAgICB1cmkgPSB0aGlzLm5hbWVzcGFjZVVSSTsKICAgICAgcmV0dXJuIHVyaSA9PT0geGh0bWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0geGh0bWwgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHVyaSwgbmFtZSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBjcmVhdG9yRml4ZWQoZnVsbG5hbWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBjcmVhdG9yIChuYW1lKSB7CiAgICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7CiAgICByZXR1cm4gKGZ1bGxuYW1lLmxvY2FsID8gY3JlYXRvckZpeGVkIDogY3JlYXRvckluaGVyaXQpKGZ1bGxuYW1lKTsKICB9CgogIGZ1bmN0aW9uIG5vbmUoKSB7fQogIGZ1bmN0aW9uIHNlbGVjdG9yIChzZWxlY3RvcikgewogICAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwgPyBub25lIDogZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgIH07CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fc2VsZWN0IChzZWxlY3QpIHsKICAgIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSAiZnVuY3Rpb24iKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpOwogICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkgewogICAgICAgICAgaWYgKCJfX2RhdGFfXyIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187CiAgICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IFNlbGVjdGlvbiQxKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cyk7CiAgfQoKICAvLyBHaXZlbiBzb21ldGhpbmcgYXJyYXkgbGlrZSAob3IgbnVsbCksIHJldHVybnMgc29tZXRoaW5nIHRoYXQgaXMgc3RyaWN0bHkgYW4KICAvLyBhcnJheS4gVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IGFycmF5LWxpa2Ugb2JqZWN0cyBwYXNzZWQgdG8gZDMuc2VsZWN0QWxsCiAgLy8gb3Igc2VsZWN0aW9uLnNlbGVjdEFsbCBhcmUgY29udmVydGVkIGludG8gcHJvcGVyIGFycmF5cyB3aGVuIGNyZWF0aW5nIGEKICAvLyBzZWxlY3Rpb247IHdlIGRvbuKAmXQgZXZlciB3YW50IHRvIGNyZWF0ZSBhIHNlbGVjdGlvbiBiYWNrZWQgYnkgYSBsaXZlCiAgLy8gSFRNTENvbGxlY3Rpb24gb3IgTm9kZUxpc3QuIEhvd2V2ZXIsIG5vdGUgdGhhdCBzZWxlY3Rpb24uc2VsZWN0QWxsIHdpbGwgdXNlIGEKICAvLyBzdGF0aWMgTm9kZUxpc3QgYXMgYSBncm91cCwgc2luY2UgaXQgc2FmZWx5IGRlcml2ZWQgZnJvbSBxdWVyeVNlbGVjdG9yQWxsLgogIGZ1bmN0aW9uIGFycmF5KHgpIHsKICAgIHJldHVybiB4ID09IG51bGwgPyBbXSA6IEFycmF5LmlzQXJyYXkoeCkgPyB4IDogQXJyYXkuZnJvbSh4KTsKICB9CgogIGZ1bmN0aW9uIGVtcHR5KCkgewogICAgcmV0dXJuIFtdOwogIH0KICBmdW5jdGlvbiBzZWxlY3RvckFsbCAoc2VsZWN0b3IpIHsKICAgIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gZW1wdHkgOiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIGFycmF5QWxsKHNlbGVjdCkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIGFycmF5KHNlbGVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9zZWxlY3RBbGwgKHNlbGVjdCkgewogICAgaWYgKHR5cGVvZiBzZWxlY3QgPT09ICJmdW5jdGlvbiIpIHNlbGVjdCA9IGFycmF5QWxsKHNlbGVjdCk7ZWxzZSBzZWxlY3QgPSBzZWxlY3RvckFsbChzZWxlY3QpOwogICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gW10sIHBhcmVudHMgPSBbXSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgICAgc3ViZ3JvdXBzLnB1c2goc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKTsKICAgICAgICAgIHBhcmVudHMucHVzaChub2RlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgU2VsZWN0aW9uJDEoc3ViZ3JvdXBzLCBwYXJlbnRzKTsKICB9CgogIGZ1bmN0aW9uIG1hdGNoZXIgKHNlbGVjdG9yKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gdGhpcy5tYXRjaGVzKHNlbGVjdG9yKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGNoaWxkTWF0Y2hlcihzZWxlY3RvcikgewogICAgcmV0dXJuIGZ1bmN0aW9uIChub2RlKSB7CiAgICAgIHJldHVybiBub2RlLm1hdGNoZXMoc2VsZWN0b3IpOwogICAgfTsKICB9CgogIHZhciBmaW5kID0gQXJyYXkucHJvdG90eXBlLmZpbmQ7CiAgZnVuY3Rpb24gY2hpbGRGaW5kKG1hdGNoKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gZmluZC5jYWxsKHRoaXMuY2hpbGRyZW4sIG1hdGNoKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGNoaWxkRmlyc3QoKSB7CiAgICByZXR1cm4gdGhpcy5maXJzdEVsZW1lbnRDaGlsZDsKICB9CiAgZnVuY3Rpb24gc2VsZWN0aW9uX3NlbGVjdENoaWxkIChtYXRjaCkgewogICAgcmV0dXJuIHRoaXMuc2VsZWN0KG1hdGNoID09IG51bGwgPyBjaGlsZEZpcnN0IDogY2hpbGRGaW5kKHR5cGVvZiBtYXRjaCA9PT0gImZ1bmN0aW9uIiA/IG1hdGNoIDogY2hpbGRNYXRjaGVyKG1hdGNoKSkpOwogIH0KCiAgdmFyIGZpbHRlciA9IEFycmF5LnByb3RvdHlwZS5maWx0ZXI7CiAgZnVuY3Rpb24gY2hpbGRyZW4oKSB7CiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuKTsKICB9CiAgZnVuY3Rpb24gY2hpbGRyZW5GaWx0ZXIobWF0Y2gpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiBmaWx0ZXIuY2FsbCh0aGlzLmNoaWxkcmVuLCBtYXRjaCk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzZWxlY3Rpb25fc2VsZWN0Q2hpbGRyZW4gKG1hdGNoKSB7CiAgICByZXR1cm4gdGhpcy5zZWxlY3RBbGwobWF0Y2ggPT0gbnVsbCA/IGNoaWxkcmVuIDogY2hpbGRyZW5GaWx0ZXIodHlwZW9mIG1hdGNoID09PSAiZnVuY3Rpb24iID8gbWF0Y2ggOiBjaGlsZE1hdGNoZXIobWF0Y2gpKSk7CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fZmlsdGVyIChtYXRjaCkgewogICAgaWYgKHR5cGVvZiBtYXRjaCAhPT0gImZ1bmN0aW9uIikgbWF0Y2ggPSBtYXRjaGVyKG1hdGNoKTsKICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gW10sIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7CiAgICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24kMShzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpOwogIH0KCiAgZnVuY3Rpb24gc3BhcnNlICh1cGRhdGUpIHsKICAgIHJldHVybiBuZXcgQXJyYXkodXBkYXRlLmxlbmd0aCk7CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fZW50ZXIgKCkgewogICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24kMSh0aGlzLl9lbnRlciB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksIHRoaXMuX3BhcmVudHMpOwogIH0KICBmdW5jdGlvbiBFbnRlck5vZGUocGFyZW50LCBkYXR1bSkgewogICAgdGhpcy5vd25lckRvY3VtZW50ID0gcGFyZW50Lm93bmVyRG9jdW1lbnQ7CiAgICB0aGlzLm5hbWVzcGFjZVVSSSA9IHBhcmVudC5uYW1lc3BhY2VVUkk7CiAgICB0aGlzLl9uZXh0ID0gbnVsbDsKICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDsKICAgIHRoaXMuX19kYXRhX18gPSBkYXR1bTsKICB9CiAgRW50ZXJOb2RlLnByb3RvdHlwZSA9IHsKICAgIGNvbnN0cnVjdG9yOiBFbnRlck5vZGUsCiAgICBhcHBlbmRDaGlsZDogZnVuY3Rpb24gKGNoaWxkKSB7CiAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCB0aGlzLl9uZXh0KTsKICAgIH0sCiAgICBpbnNlcnRCZWZvcmU6IGZ1bmN0aW9uIChjaGlsZCwgbmV4dCkgewogICAgICByZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbmV4dCk7CiAgICB9LAogICAgcXVlcnlTZWxlY3RvcjogZnVuY3Rpb24gKHNlbGVjdG9yKSB7CiAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7CiAgICB9LAogICAgcXVlcnlTZWxlY3RvckFsbDogZnVuY3Rpb24gKHNlbGVjdG9yKSB7CiAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gY29uc3RhbnQkMSAoeCkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIHg7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gYmluZEluZGV4KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQsIGRhdGEpIHsKICAgIHZhciBpID0gMCwKICAgICAgbm9kZSwKICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsCiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDsKCiAgICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZml0IGludG8gdXBkYXRlLgogICAgLy8gUHV0IGFueSBudWxsIG5vZGVzIGludG8gZW50ZXIuCiAgICAvLyBQdXQgYW55IHJlbWFpbmluZyBkYXRhIGludG8gZW50ZXIuCiAgICBmb3IgKDsgaSA8IGRhdGFMZW5ndGg7ICsraSkgewogICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgbm9kZS5fX2RhdGFfXyA9IGRhdGFbaV07CiAgICAgICAgdXBkYXRlW2ldID0gbm9kZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBlbnRlcltpXSA9IG5ldyBFbnRlck5vZGUocGFyZW50LCBkYXRhW2ldKTsKICAgICAgfQogICAgfQoKICAgIC8vIFB1dCBhbnkgbm9uLW51bGwgbm9kZXMgdGhhdCBkb27igJl0IGZpdCBpbnRvIGV4aXQuCiAgICBmb3IgKDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHsKICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgIGV4aXRbaV0gPSBub2RlOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIGJpbmRLZXkocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSwga2V5KSB7CiAgICB2YXIgaSwKICAgICAgbm9kZSwKICAgICAgbm9kZUJ5S2V5VmFsdWUgPSBuZXcgTWFwKCksCiAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLAogICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsCiAgICAgIGtleVZhbHVlcyA9IG5ldyBBcnJheShncm91cExlbmd0aCksCiAgICAgIGtleVZhbHVlOwoKICAgIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBub2RlLgogICAgLy8gSWYgbXVsdGlwbGUgbm9kZXMgaGF2ZSB0aGUgc2FtZSBrZXksIHRoZSBkdXBsaWNhdGVzIGFyZSBhZGRlZCB0byBleGl0LgogICAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHsKICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgIGtleVZhbHVlc1tpXSA9IGtleVZhbHVlID0ga2V5LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApICsgIiI7CiAgICAgICAgaWYgKG5vZGVCeUtleVZhbHVlLmhhcyhrZXlWYWx1ZSkpIHsKICAgICAgICAgIGV4aXRbaV0gPSBub2RlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBub2RlQnlLZXlWYWx1ZS5zZXQoa2V5VmFsdWUsIG5vZGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBkYXR1bS4KICAgIC8vIElmIHRoZXJlIGEgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBrZXksIGpvaW4gYW5kIGFkZCBpdCB0byB1cGRhdGUuCiAgICAvLyBJZiB0aGVyZSBpcyBub3QgKG9yIHRoZSBrZXkgaXMgYSBkdXBsaWNhdGUpLCBhZGQgaXQgdG8gZW50ZXIuCiAgICBmb3IgKGkgPSAwOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7CiAgICAgIGtleVZhbHVlID0ga2V5LmNhbGwocGFyZW50LCBkYXRhW2ldLCBpLCBkYXRhKSArICIiOwogICAgICBpZiAobm9kZSA9IG5vZGVCeUtleVZhbHVlLmdldChrZXlWYWx1ZSkpIHsKICAgICAgICB1cGRhdGVbaV0gPSBub2RlOwogICAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldOwogICAgICAgIG5vZGVCeUtleVZhbHVlLmRlbGV0ZShrZXlWYWx1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtpXSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBBZGQgYW55IHJlbWFpbmluZyBub2RlcyB0aGF0IHdlcmUgbm90IGJvdW5kIHRvIGRhdGEgdG8gZXhpdC4KICAgIGZvciAoaSA9IDA7IGkgPCBncm91cExlbmd0aDsgKytpKSB7CiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBub2RlQnlLZXlWYWx1ZS5nZXQoa2V5VmFsdWVzW2ldKSA9PT0gbm9kZSkgewogICAgICAgIGV4aXRbaV0gPSBub2RlOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIGRhdHVtKG5vZGUpIHsKICAgIHJldHVybiBub2RlLl9fZGF0YV9fOwogIH0KICBmdW5jdGlvbiBzZWxlY3Rpb25fZGF0YSAodmFsdWUsIGtleSkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLCBkYXR1bSk7CiAgICB2YXIgYmluZCA9IGtleSA/IGJpbmRLZXkgOiBiaW5kSW5kZXgsCiAgICAgIHBhcmVudHMgPSB0aGlzLl9wYXJlbnRzLAogICAgICBncm91cHMgPSB0aGlzLl9ncm91cHM7CiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB2YWx1ZSA9IGNvbnN0YW50JDEodmFsdWUpOwogICAgZm9yICh2YXIgbSA9IGdyb3Vwcy5sZW5ndGgsIHVwZGF0ZSA9IG5ldyBBcnJheShtKSwgZW50ZXIgPSBuZXcgQXJyYXkobSksIGV4aXQgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgIHZhciBwYXJlbnQgPSBwYXJlbnRzW2pdLAogICAgICAgIGdyb3VwID0gZ3JvdXBzW2pdLAogICAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLAogICAgICAgIGRhdGEgPSBhcnJheWxpa2UodmFsdWUuY2FsbChwYXJlbnQsIHBhcmVudCAmJiBwYXJlbnQuX19kYXRhX18sIGosIHBhcmVudHMpKSwKICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsCiAgICAgICAgZW50ZXJHcm91cCA9IGVudGVyW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLAogICAgICAgIHVwZGF0ZUdyb3VwID0gdXBkYXRlW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLAogICAgICAgIGV4aXRHcm91cCA9IGV4aXRbal0gPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpOwogICAgICBiaW5kKHBhcmVudCwgZ3JvdXAsIGVudGVyR3JvdXAsIHVwZGF0ZUdyb3VwLCBleGl0R3JvdXAsIGRhdGEsIGtleSk7CgogICAgICAvLyBOb3cgY29ubmVjdCB0aGUgZW50ZXIgbm9kZXMgdG8gdGhlaXIgZm9sbG93aW5nIHVwZGF0ZSBub2RlLCBzdWNoIHRoYXQKICAgICAgLy8gYXBwZW5kQ2hpbGQgY2FuIGluc2VydCB0aGUgbWF0ZXJpYWxpemVkIGVudGVyIG5vZGUgYmVmb3JlIHRoaXMgbm9kZSwKICAgICAgLy8gcmF0aGVyIHRoYW4gYXQgdGhlIGVuZCBvZiB0aGUgcGFyZW50IG5vZGUuCiAgICAgIGZvciAodmFyIGkwID0gMCwgaTEgPSAwLCBwcmV2aW91cywgbmV4dDsgaTAgPCBkYXRhTGVuZ3RoOyArK2kwKSB7CiAgICAgICAgaWYgKHByZXZpb3VzID0gZW50ZXJHcm91cFtpMF0pIHsKICAgICAgICAgIGlmIChpMCA+PSBpMSkgaTEgPSBpMCArIDE7CiAgICAgICAgICB3aGlsZSAoIShuZXh0ID0gdXBkYXRlR3JvdXBbaTFdKSAmJiArK2kxIDwgZGF0YUxlbmd0aCk7CiAgICAgICAgICBwcmV2aW91cy5fbmV4dCA9IG5leHQgfHwgbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHVwZGF0ZSA9IG5ldyBTZWxlY3Rpb24kMSh1cGRhdGUsIHBhcmVudHMpOwogICAgdXBkYXRlLl9lbnRlciA9IGVudGVyOwogICAgdXBkYXRlLl9leGl0ID0gZXhpdDsKICAgIHJldHVybiB1cGRhdGU7CiAgfQoKICAvLyBHaXZlbiBzb21lIGRhdGEsIHRoaXMgcmV0dXJucyBhbiBhcnJheS1saWtlIHZpZXcgb2YgaXQ6IGFuIG9iamVjdCB0aGF0CiAgLy8gZXhwb3NlcyBhIGxlbmd0aCBwcm9wZXJ0eSBhbmQgYWxsb3dzIG51bWVyaWMgaW5kZXhpbmcuIE5vdGUgdGhhdCB1bmxpa2UKICAvLyBzZWxlY3RBbGwsIHRoaXMgaXNu4oCZdCB3b3JyaWVkIGFib3V0IOKAnGxpdmXigJ0gY29sbGVjdGlvbnMgYmVjYXVzZSB0aGUgcmVzdWx0aW5nCiAgLy8gYXJyYXkgd2lsbCBvbmx5IGJlIHVzZWQgYnJpZWZseSB3aGlsZSBkYXRhIGlzIGJlaW5nIGJvdW5kLiAoSXQgaXMgcG9zc2libGUgdG8KICAvLyBjYXVzZSB0aGUgZGF0YSB0byBjaGFuZ2Ugd2hpbGUgaXRlcmF0aW5nIGJ5IHVzaW5nIGEga2V5IGZ1bmN0aW9uLCBidXQgcGxlYXNlCiAgLy8gZG9u4oCZdDsgd2XigJlkIHJhdGhlciBhdm9pZCBhIGdyYXR1aXRvdXMgY29weS4pCiAgZnVuY3Rpb24gYXJyYXlsaWtlKGRhdGEpIHsKICAgIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gIm9iamVjdCIgJiYgImxlbmd0aCIgaW4gZGF0YSA/IGRhdGEgLy8gQXJyYXksIFR5cGVkQXJyYXksIE5vZGVMaXN0LCBhcnJheS1saWtlCiAgICA6IEFycmF5LmZyb20oZGF0YSk7IC8vIE1hcCwgU2V0LCBpdGVyYWJsZSwgc3RyaW5nLCBvciBhbnl0aGluZyBlbHNlCiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fZXhpdCAoKSB7CiAgICByZXR1cm4gbmV3IFNlbGVjdGlvbiQxKHRoaXMuX2V4aXQgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UpLCB0aGlzLl9wYXJlbnRzKTsKICB9CgogIGZ1bmN0aW9uIHNlbGVjdGlvbl9qb2luIChvbmVudGVyLCBvbnVwZGF0ZSwgb25leGl0KSB7CiAgICB2YXIgZW50ZXIgPSB0aGlzLmVudGVyKCksCiAgICAgIHVwZGF0ZSA9IHRoaXMsCiAgICAgIGV4aXQgPSB0aGlzLmV4aXQoKTsKICAgIGlmICh0eXBlb2Ygb25lbnRlciA9PT0gImZ1bmN0aW9uIikgewogICAgICBlbnRlciA9IG9uZW50ZXIoZW50ZXIpOwogICAgICBpZiAoZW50ZXIpIGVudGVyID0gZW50ZXIuc2VsZWN0aW9uKCk7CiAgICB9IGVsc2UgewogICAgICBlbnRlciA9IGVudGVyLmFwcGVuZChvbmVudGVyICsgIiIpOwogICAgfQogICAgaWYgKG9udXBkYXRlICE9IG51bGwpIHsKICAgICAgdXBkYXRlID0gb251cGRhdGUodXBkYXRlKTsKICAgICAgaWYgKHVwZGF0ZSkgdXBkYXRlID0gdXBkYXRlLnNlbGVjdGlvbigpOwogICAgfQogICAgaWYgKG9uZXhpdCA9PSBudWxsKSBleGl0LnJlbW92ZSgpO2Vsc2Ugb25leGl0KGV4aXQpOwogICAgcmV0dXJuIGVudGVyICYmIHVwZGF0ZSA/IGVudGVyLm1lcmdlKHVwZGF0ZSkub3JkZXIoKSA6IHVwZGF0ZTsKICB9CgogIGZ1bmN0aW9uIHNlbGVjdGlvbl9tZXJnZSAoY29udGV4dCkgewogICAgdmFyIHNlbGVjdGlvbiA9IGNvbnRleHQuc2VsZWN0aW9uID8gY29udGV4dC5zZWxlY3Rpb24oKSA6IGNvbnRleHQ7CiAgICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gc2VsZWN0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cDBbaV0gfHwgZ3JvdXAxW2ldKSB7CiAgICAgICAgICBtZXJnZVtpXSA9IG5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmb3IgKDsgaiA8IG0wOyArK2opIHsKICAgICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTsKICAgIH0KICAgIHJldHVybiBuZXcgU2VsZWN0aW9uJDEobWVyZ2VzLCB0aGlzLl9wYXJlbnRzKTsKICB9CgogIGZ1bmN0aW9uIHNlbGVjdGlvbl9vcmRlciAoKSB7CiAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAtMSwgbSA9IGdyb3Vwcy5sZW5ndGg7ICsraiA8IG07KSB7CiAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gZ3JvdXAubGVuZ3RoIC0gMSwgbmV4dCA9IGdyb3VwW2ldLCBub2RlOyAtLWkgPj0gMDspIHsKICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICBpZiAobmV4dCAmJiBub2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG5leHQpIF4gNCkgbmV4dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBuZXh0KTsKICAgICAgICAgIG5leHQgPSBub2RlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fc29ydCAoY29tcGFyZSkgewogICAgaWYgKCFjb21wYXJlKSBjb21wYXJlID0gYXNjZW5kaW5nOwogICAgZnVuY3Rpb24gY29tcGFyZU5vZGUoYSwgYikgewogICAgICByZXR1cm4gYSAmJiBiID8gY29tcGFyZShhLl9fZGF0YV9fLCBiLl9fZGF0YV9fKSA6ICFhIC0gIWI7CiAgICB9CiAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzb3J0Z3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc29ydGdyb3VwID0gc29ydGdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICBzb3J0Z3JvdXBbaV0gPSBub2RlOwogICAgICAgIH0KICAgICAgfQogICAgICBzb3J0Z3JvdXAuc29ydChjb21wYXJlTm9kZSk7CiAgICB9CiAgICByZXR1cm4gbmV3IFNlbGVjdGlvbiQxKHNvcnRncm91cHMsIHRoaXMuX3BhcmVudHMpLm9yZGVyKCk7CiAgfQogIGZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKSB7CiAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fY2FsbCAoKSB7CiAgICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbMF07CiAgICBhcmd1bWVudHNbMF0gPSB0aGlzOwogICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgIHJldHVybiB0aGlzOwogIH0KCiAgZnVuY3Rpb24gc2VsZWN0aW9uX25vZGVzICgpIHsKICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMpOwogIH0KCiAgZnVuY3Rpb24gc2VsZWN0aW9uX25vZGUgKCkgewogICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHsKICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgdmFyIG5vZGUgPSBncm91cFtpXTsKICAgICAgICBpZiAobm9kZSkgcmV0dXJuIG5vZGU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgZnVuY3Rpb24gc2VsZWN0aW9uX3NpemUgKCkgewogICAgbGV0IHNpemUgPSAwOwogICAgZm9yIChjb25zdCBub2RlIG9mIHRoaXMpICsrc2l6ZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogICAgcmV0dXJuIHNpemU7CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fZW1wdHkgKCkgewogICAgcmV0dXJuICF0aGlzLm5vZGUoKTsKICB9CgogIGZ1bmN0aW9uIHNlbGVjdGlvbl9lYWNoIChjYWxsYmFjaykgewogICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHsKICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgY2FsbGJhY2suY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0KCiAgZnVuY3Rpb24gYXR0clJlbW92ZSQxKG5hbWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gYXR0clJlbW92ZU5TJDEoZnVsbG5hbWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGF0dHJDb25zdGFudCQxKG5hbWUsIHZhbHVlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBhdHRyQ29uc3RhbnROUyQxKGZ1bGxuYW1lLCB2YWx1ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHZhbHVlKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGF0dHJGdW5jdGlvbiQxKG5hbWUsIHZhbHVlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO2Vsc2UgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdik7CiAgICB9OwogIH0KICBmdW5jdGlvbiBhdHRyRnVuY3Rpb25OUyQxKGZ1bGxuYW1lLCB2YWx1ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICBpZiAodiA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7ZWxzZSB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgdik7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzZWxlY3Rpb25fYXR0ciAobmFtZSwgdmFsdWUpIHsKICAgIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgICB2YXIgbm9kZSA9IHRoaXMubm9kZSgpOwogICAgICByZXR1cm4gZnVsbG5hbWUubG9jYWwgPyBub2RlLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCkgOiBub2RlLmdldEF0dHJpYnV0ZShmdWxsbmFtZSk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsID8gZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMkMSA6IGF0dHJSZW1vdmUkMSA6IHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIiA/IGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMkMSA6IGF0dHJGdW5jdGlvbiQxIDogZnVsbG5hbWUubG9jYWwgPyBhdHRyQ29uc3RhbnROUyQxIDogYXR0ckNvbnN0YW50JDEpKGZ1bGxuYW1lLCB2YWx1ZSkpOwogIH0KCiAgZnVuY3Rpb24gZGVmYXVsdFZpZXcgKG5vZGUpIHsKICAgIHJldHVybiBub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IC8vIG5vZGUgaXMgYSBOb2RlCiAgICB8fCBub2RlLmRvY3VtZW50ICYmIG5vZGUgLy8gbm9kZSBpcyBhIFdpbmRvdwogICAgfHwgbm9kZS5kZWZhdWx0VmlldzsgLy8gbm9kZSBpcyBhIERvY3VtZW50CiAgfQoKICBmdW5jdGlvbiBzdHlsZVJlbW92ZSQxKG5hbWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzdHlsZUNvbnN0YW50JDEobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlLCBwcmlvcml0eSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzdHlsZUZ1bmN0aW9uJDEobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIGlmICh2ID09IG51bGwpIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7ZWxzZSB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHYsIHByaW9yaXR5KTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9zdHlsZSAobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGwgPyBzdHlsZVJlbW92ZSQxIDogdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gc3R5bGVGdW5jdGlvbiQxIDogc3R5bGVDb25zdGFudCQxKShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkgPT0gbnVsbCA/ICIiIDogcHJpb3JpdHkpKSA6IHN0eWxlVmFsdWUodGhpcy5ub2RlKCksIG5hbWUpOwogIH0KICBmdW5jdGlvbiBzdHlsZVZhbHVlKG5vZGUsIG5hbWUpIHsKICAgIHJldHVybiBub2RlLnN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSkgfHwgZGVmYXVsdFZpZXcobm9kZSkuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpOwogIH0KCiAgZnVuY3Rpb24gcHJvcGVydHlSZW1vdmUobmFtZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgZGVsZXRlIHRoaXNbbmFtZV07CiAgICB9OwogIH0KICBmdW5jdGlvbiBwcm9wZXJ0eUNvbnN0YW50KG5hbWUsIHZhbHVlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB0aGlzW25hbWVdID0gdmFsdWU7CiAgICB9OwogIH0KICBmdW5jdGlvbiBwcm9wZXJ0eUZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIGlmICh2ID09IG51bGwpIGRlbGV0ZSB0aGlzW25hbWVdO2Vsc2UgdGhpc1tuYW1lXSA9IHY7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzZWxlY3Rpb25fcHJvcGVydHkgKG5hbWUsIHZhbHVlKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGwgPyBwcm9wZXJ0eVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIiA/IHByb3BlcnR5RnVuY3Rpb24gOiBwcm9wZXJ0eUNvbnN0YW50KShuYW1lLCB2YWx1ZSkpIDogdGhpcy5ub2RlKClbbmFtZV07CiAgfQoKICBmdW5jdGlvbiBjbGFzc0FycmF5KHN0cmluZykgewogICAgcmV0dXJuIHN0cmluZy50cmltKCkuc3BsaXQoL158XHMrLyk7CiAgfQogIGZ1bmN0aW9uIGNsYXNzTGlzdChub2RlKSB7CiAgICByZXR1cm4gbm9kZS5jbGFzc0xpc3QgfHwgbmV3IENsYXNzTGlzdChub2RlKTsKICB9CiAgZnVuY3Rpb24gQ2xhc3NMaXN0KG5vZGUpIHsKICAgIHRoaXMuX25vZGUgPSBub2RlOwogICAgdGhpcy5fbmFtZXMgPSBjbGFzc0FycmF5KG5vZGUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpIHx8ICIiKTsKICB9CiAgQ2xhc3NMaXN0LnByb3RvdHlwZSA9IHsKICAgIGFkZDogZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgdmFyIGkgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpOwogICAgICBpZiAoaSA8IDApIHsKICAgICAgICB0aGlzLl9uYW1lcy5wdXNoKG5hbWUpOwogICAgICAgIHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsIHRoaXMuX25hbWVzLmpvaW4oIiAiKSk7CiAgICAgIH0KICAgIH0sCiAgICByZW1vdmU6IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTsKICAgICAgaWYgKGkgPj0gMCkgewogICAgICAgIHRoaXMuX25hbWVzLnNwbGljZShpLCAxKTsKICAgICAgICB0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCB0aGlzLl9uYW1lcy5qb2luKCIgIikpOwogICAgICB9CiAgICB9LAogICAgY29udGFpbnM6IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgIHJldHVybiB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpID49IDA7CiAgICB9CiAgfTsKICBmdW5jdGlvbiBjbGFzc2VkQWRkKG5vZGUsIG5hbWVzKSB7CiAgICB2YXIgbGlzdCA9IGNsYXNzTGlzdChub2RlKSwKICAgICAgaSA9IC0xLAogICAgICBuID0gbmFtZXMubGVuZ3RoOwogICAgd2hpbGUgKCsraSA8IG4pIGxpc3QuYWRkKG5hbWVzW2ldKTsKICB9CiAgZnVuY3Rpb24gY2xhc3NlZFJlbW92ZShub2RlLCBuYW1lcykgewogICAgdmFyIGxpc3QgPSBjbGFzc0xpc3Qobm9kZSksCiAgICAgIGkgPSAtMSwKICAgICAgbiA9IG5hbWVzLmxlbmd0aDsKICAgIHdoaWxlICgrK2kgPCBuKSBsaXN0LnJlbW92ZShuYW1lc1tpXSk7CiAgfQogIGZ1bmN0aW9uIGNsYXNzZWRUcnVlKG5hbWVzKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICBjbGFzc2VkQWRkKHRoaXMsIG5hbWVzKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGNsYXNzZWRGYWxzZShuYW1lcykgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgY2xhc3NlZFJlbW92ZSh0aGlzLCBuYW1lcyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBjbGFzc2VkRnVuY3Rpb24obmFtZXMsIHZhbHVlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAodmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKSA/IGNsYXNzZWRBZGQgOiBjbGFzc2VkUmVtb3ZlKSh0aGlzLCBuYW1lcyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzZWxlY3Rpb25fY2xhc3NlZCAobmFtZSwgdmFsdWUpIHsKICAgIHZhciBuYW1lcyA9IGNsYXNzQXJyYXkobmFtZSArICIiKTsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgICB2YXIgbGlzdCA9IGNsYXNzTGlzdCh0aGlzLm5vZGUoKSksCiAgICAgICAgaSA9IC0xLAogICAgICAgIG4gPSBuYW1lcy5sZW5ndGg7CiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWxpc3QuY29udGFpbnMobmFtZXNbaV0pKSByZXR1cm4gZmFsc2U7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gY2xhc3NlZEZ1bmN0aW9uIDogdmFsdWUgPyBjbGFzc2VkVHJ1ZSA6IGNsYXNzZWRGYWxzZSkobmFtZXMsIHZhbHVlKSk7CiAgfQoKICBmdW5jdGlvbiB0ZXh0UmVtb3ZlKCkgewogICAgdGhpcy50ZXh0Q29udGVudCA9ICIiOwogIH0KICBmdW5jdGlvbiB0ZXh0Q29uc3RhbnQkMSh2YWx1ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlOwogICAgfTsKICB9CiAgZnVuY3Rpb24gdGV4dEZ1bmN0aW9uJDEodmFsdWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgdGhpcy50ZXh0Q29udGVudCA9IHYgPT0gbnVsbCA/ICIiIDogdjsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl90ZXh0ICh2YWx1ZSkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbCA/IHRleHRSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gdGV4dEZ1bmN0aW9uJDEgOiB0ZXh0Q29uc3RhbnQkMSkodmFsdWUpKSA6IHRoaXMubm9kZSgpLnRleHRDb250ZW50OwogIH0KCiAgZnVuY3Rpb24gaHRtbFJlbW92ZSgpIHsKICAgIHRoaXMuaW5uZXJIVE1MID0gIiI7CiAgfQogIGZ1bmN0aW9uIGh0bWxDb25zdGFudCh2YWx1ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdGhpcy5pbm5lckhUTUwgPSB2YWx1ZTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGh0bWxGdW5jdGlvbih2YWx1ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICB0aGlzLmlubmVySFRNTCA9IHYgPT0gbnVsbCA/ICIiIDogdjsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9odG1sICh2YWx1ZSkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbCA/IGh0bWxSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gaHRtbEZ1bmN0aW9uIDogaHRtbENvbnN0YW50KSh2YWx1ZSkpIDogdGhpcy5ub2RlKCkuaW5uZXJIVE1MOwogIH0KCiAgZnVuY3Rpb24gcmFpc2UoKSB7CiAgICBpZiAodGhpcy5uZXh0U2libGluZykgdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpOwogIH0KICBmdW5jdGlvbiBzZWxlY3Rpb25fcmFpc2UgKCkgewogICAgcmV0dXJuIHRoaXMuZWFjaChyYWlzZSk7CiAgfQoKICBmdW5jdGlvbiBsb3dlcigpIHsKICAgIGlmICh0aGlzLnByZXZpb3VzU2libGluZykgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLCB0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZCk7CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9sb3dlciAoKSB7CiAgICByZXR1cm4gdGhpcy5lYWNoKGxvd2VyKTsKICB9CgogIGZ1bmN0aW9uIHNlbGVjdGlvbl9hcHBlbmQgKG5hbWUpIHsKICAgIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gImZ1bmN0aW9uIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpOwogICAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBjb25zdGFudE51bGwoKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgZnVuY3Rpb24gc2VsZWN0aW9uX2luc2VydCAobmFtZSwgYmVmb3JlKSB7CiAgICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09ICJmdW5jdGlvbiIgPyBuYW1lIDogY3JlYXRvcihuYW1lKSwKICAgICAgc2VsZWN0ID0gYmVmb3JlID09IG51bGwgPyBjb25zdGFudE51bGwgOiB0eXBlb2YgYmVmb3JlID09PSAiZnVuY3Rpb24iID8gYmVmb3JlIDogc2VsZWN0b3IoYmVmb3JlKTsKICAgIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB0aGlzLmluc2VydEJlZm9yZShjcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgc2VsZWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgbnVsbCk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHJlbW92ZSgpIHsKICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CiAgICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9yZW1vdmUgKCkgewogICAgcmV0dXJuIHRoaXMuZWFjaChyZW1vdmUpOwogIH0KCiAgZnVuY3Rpb24gc2VsZWN0aW9uX2Nsb25lU2hhbGxvdygpIHsKICAgIHZhciBjbG9uZSA9IHRoaXMuY2xvbmVOb2RlKGZhbHNlKSwKICAgICAgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwogICAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRoaXMubmV4dFNpYmxpbmcpIDogY2xvbmU7CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZURlZXAoKSB7CiAgICB2YXIgY2xvbmUgPSB0aGlzLmNsb25lTm9kZSh0cnVlKSwKICAgICAgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwogICAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRoaXMubmV4dFNpYmxpbmcpIDogY2xvbmU7CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZSAoZGVlcCkgewogICAgcmV0dXJuIHRoaXMuc2VsZWN0KGRlZXAgPyBzZWxlY3Rpb25fY2xvbmVEZWVwIDogc2VsZWN0aW9uX2Nsb25lU2hhbGxvdyk7CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fZGF0dW0gKHZhbHVlKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHRoaXMucHJvcGVydHkoIl9fZGF0YV9fIiwgdmFsdWUpIDogdGhpcy5ub2RlKCkuX19kYXRhX187CiAgfQoKICBmdW5jdGlvbiBjb250ZXh0TGlzdGVuZXIobGlzdGVuZXIpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBldmVudCwgdGhpcy5fX2RhdGFfXyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMpIHsKICAgIHJldHVybiB0eXBlbmFtZXMudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcChmdW5jdGlvbiAodCkgewogICAgICB2YXIgbmFtZSA9ICIiLAogICAgICAgIGkgPSB0LmluZGV4T2YoIi4iKTsKICAgICAgaWYgKGkgPj0gMCkgbmFtZSA9IHQuc2xpY2UoaSArIDEpLCB0ID0gdC5zbGljZSgwLCBpKTsKICAgICAgcmV0dXJuIHsKICAgICAgICB0eXBlOiB0LAogICAgICAgIG5hbWU6IG5hbWUKICAgICAgfTsKICAgIH0pOwogIH0KICBmdW5jdGlvbiBvblJlbW92ZSh0eXBlbmFtZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIG9uID0gdGhpcy5fX29uOwogICAgICBpZiAoIW9uKSByZXR1cm47CiAgICAgIGZvciAodmFyIGogPSAwLCBpID0gLTEsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHsKICAgICAgICBpZiAobyA9IG9uW2pdLCAoIXR5cGVuYW1lLnR5cGUgfHwgby50eXBlID09PSB0eXBlbmFtZS50eXBlKSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHsKICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIsIG8ub3B0aW9ucyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG9uWysraV0gPSBvOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoKytpKSBvbi5sZW5ndGggPSBpO2Vsc2UgZGVsZXRlIHRoaXMuX19vbjsKICAgIH07CiAgfQogIGZ1bmN0aW9uIG9uQWRkKHR5cGVuYW1lLCB2YWx1ZSwgb3B0aW9ucykgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIG9uID0gdGhpcy5fX29uLAogICAgICAgIG8sCiAgICAgICAgbGlzdGVuZXIgPSBjb250ZXh0TGlzdGVuZXIodmFsdWUpOwogICAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoOyBqIDwgbTsgKytqKSB7CiAgICAgICAgaWYgKChvID0gb25bal0pLnR5cGUgPT09IHR5cGVuYW1lLnR5cGUgJiYgby5uYW1lID09PSB0eXBlbmFtZS5uYW1lKSB7CiAgICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLm9wdGlvbnMpOwogICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciA9IGxpc3RlbmVyLCBvLm9wdGlvbnMgPSBvcHRpb25zKTsKICAgICAgICAgIG8udmFsdWUgPSB2YWx1ZTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKHR5cGVuYW1lLnR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTsKICAgICAgbyA9IHsKICAgICAgICB0eXBlOiB0eXBlbmFtZS50eXBlLAogICAgICAgIG5hbWU6IHR5cGVuYW1lLm5hbWUsCiAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgIGxpc3RlbmVyOiBsaXN0ZW5lciwKICAgICAgICBvcHRpb25zOiBvcHRpb25zCiAgICAgIH07CiAgICAgIGlmICghb24pIHRoaXMuX19vbiA9IFtvXTtlbHNlIG9uLnB1c2gobyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzZWxlY3Rpb25fb24gKHR5cGVuYW1lLCB2YWx1ZSwgb3B0aW9ucykgewogICAgdmFyIHR5cGVuYW1lcyA9IHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lICsgIiIpLAogICAgICBpLAogICAgICBuID0gdHlwZW5hbWVzLmxlbmd0aCwKICAgICAgdDsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgICB2YXIgb24gPSB0aGlzLm5vZGUoKS5fX29uOwogICAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoLCBvOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yIChpID0gMCwgbyA9IG9uW2pdOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAoKHQgPSB0eXBlbmFtZXNbaV0pLnR5cGUgPT09IG8udHlwZSAmJiB0Lm5hbWUgPT09IG8ubmFtZSkgewogICAgICAgICAgICByZXR1cm4gby52YWx1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgb24gPSB2YWx1ZSA/IG9uQWRkIDogb25SZW1vdmU7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB0aGlzLmVhY2gob24odHlwZW5hbWVzW2ldLCB2YWx1ZSwgb3B0aW9ucykpOwogICAgcmV0dXJuIHRoaXM7CiAgfQoKICBmdW5jdGlvbiBkaXNwYXRjaEV2ZW50KG5vZGUsIHR5cGUsIHBhcmFtcykgewogICAgdmFyIHdpbmRvdyA9IGRlZmF1bHRWaWV3KG5vZGUpLAogICAgICBldmVudCA9IHdpbmRvdy5DdXN0b21FdmVudDsKICAgIGlmICh0eXBlb2YgZXZlbnQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgZXZlbnQgPSBuZXcgZXZlbnQodHlwZSwgcGFyYW1zKTsKICAgIH0gZWxzZSB7CiAgICAgIGV2ZW50ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpOwogICAgICBpZiAocGFyYW1zKSBldmVudC5pbml0RXZlbnQodHlwZSwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlKSwgZXZlbnQuZGV0YWlsID0gcGFyYW1zLmRldGFpbDtlbHNlIGV2ZW50LmluaXRFdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UpOwogICAgfQogICAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICB9CiAgZnVuY3Rpb24gZGlzcGF0Y2hDb25zdGFudCh0eXBlLCBwYXJhbXMpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBkaXNwYXRjaEZ1bmN0aW9uKHR5cGUsIHBhcmFtcykgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIGRpc3BhdGNoRXZlbnQodGhpcywgdHlwZSwgcGFyYW1zLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gc2VsZWN0aW9uX2Rpc3BhdGNoICh0eXBlLCBwYXJhbXMpIHsKICAgIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiBwYXJhbXMgPT09ICJmdW5jdGlvbiIgPyBkaXNwYXRjaEZ1bmN0aW9uIDogZGlzcGF0Y2hDb25zdGFudCkodHlwZSwgcGFyYW1zKSk7CiAgfQoKICBmdW5jdGlvbiogc2VsZWN0aW9uX2l0ZXJhdG9yICgpIHsKICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7CiAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZTsgaSA8IG47ICsraSkgewogICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHlpZWxkIG5vZGU7CiAgICAgIH0KICAgIH0KICB9CgogIHZhciByb290ID0gW251bGxdOwogIGZ1bmN0aW9uIFNlbGVjdGlvbiQxKGdyb3VwcywgcGFyZW50cykgewogICAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzOwogICAgdGhpcy5fcGFyZW50cyA9IHBhcmVudHM7CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbigpIHsKICAgIHJldHVybiBuZXcgU2VsZWN0aW9uJDEoW1tkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdXSwgcm9vdCk7CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9zZWxlY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpczsKICB9CiAgU2VsZWN0aW9uJDEucHJvdG90eXBlID0gc2VsZWN0aW9uLnByb3RvdHlwZSA9IHsKICAgIGNvbnN0cnVjdG9yOiBTZWxlY3Rpb24kMSwKICAgIHNlbGVjdDogc2VsZWN0aW9uX3NlbGVjdCwKICAgIHNlbGVjdEFsbDogc2VsZWN0aW9uX3NlbGVjdEFsbCwKICAgIHNlbGVjdENoaWxkOiBzZWxlY3Rpb25fc2VsZWN0Q2hpbGQsCiAgICBzZWxlY3RDaGlsZHJlbjogc2VsZWN0aW9uX3NlbGVjdENoaWxkcmVuLAogICAgZmlsdGVyOiBzZWxlY3Rpb25fZmlsdGVyLAogICAgZGF0YTogc2VsZWN0aW9uX2RhdGEsCiAgICBlbnRlcjogc2VsZWN0aW9uX2VudGVyLAogICAgZXhpdDogc2VsZWN0aW9uX2V4aXQsCiAgICBqb2luOiBzZWxlY3Rpb25fam9pbiwKICAgIG1lcmdlOiBzZWxlY3Rpb25fbWVyZ2UsCiAgICBzZWxlY3Rpb246IHNlbGVjdGlvbl9zZWxlY3Rpb24sCiAgICBvcmRlcjogc2VsZWN0aW9uX29yZGVyLAogICAgc29ydDogc2VsZWN0aW9uX3NvcnQsCiAgICBjYWxsOiBzZWxlY3Rpb25fY2FsbCwKICAgIG5vZGVzOiBzZWxlY3Rpb25fbm9kZXMsCiAgICBub2RlOiBzZWxlY3Rpb25fbm9kZSwKICAgIHNpemU6IHNlbGVjdGlvbl9zaXplLAogICAgZW1wdHk6IHNlbGVjdGlvbl9lbXB0eSwKICAgIGVhY2g6IHNlbGVjdGlvbl9lYWNoLAogICAgYXR0cjogc2VsZWN0aW9uX2F0dHIsCiAgICBzdHlsZTogc2VsZWN0aW9uX3N0eWxlLAogICAgcHJvcGVydHk6IHNlbGVjdGlvbl9wcm9wZXJ0eSwKICAgIGNsYXNzZWQ6IHNlbGVjdGlvbl9jbGFzc2VkLAogICAgdGV4dDogc2VsZWN0aW9uX3RleHQsCiAgICBodG1sOiBzZWxlY3Rpb25faHRtbCwKICAgIHJhaXNlOiBzZWxlY3Rpb25fcmFpc2UsCiAgICBsb3dlcjogc2VsZWN0aW9uX2xvd2VyLAogICAgYXBwZW5kOiBzZWxlY3Rpb25fYXBwZW5kLAogICAgaW5zZXJ0OiBzZWxlY3Rpb25faW5zZXJ0LAogICAgcmVtb3ZlOiBzZWxlY3Rpb25fcmVtb3ZlLAogICAgY2xvbmU6IHNlbGVjdGlvbl9jbG9uZSwKICAgIGRhdHVtOiBzZWxlY3Rpb25fZGF0dW0sCiAgICBvbjogc2VsZWN0aW9uX29uLAogICAgZGlzcGF0Y2g6IHNlbGVjdGlvbl9kaXNwYXRjaCwKICAgIFtTeW1ib2wuaXRlcmF0b3JdOiBzZWxlY3Rpb25faXRlcmF0b3IKICB9OwoKICBmdW5jdGlvbiBkZWZpbmUgKGNvbnN0cnVjdG9yLCBmYWN0b3J5LCBwcm90b3R5cGUpIHsKICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGZhY3RvcnkucHJvdG90eXBlID0gcHJvdG90eXBlOwogICAgcHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0b3I7CiAgfQogIGZ1bmN0aW9uIGV4dGVuZChwYXJlbnQsIGRlZmluaXRpb24pIHsKICAgIHZhciBwcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudC5wcm90b3R5cGUpOwogICAgZm9yICh2YXIga2V5IGluIGRlZmluaXRpb24pIHByb3RvdHlwZVtrZXldID0gZGVmaW5pdGlvbltrZXldOwogICAgcmV0dXJuIHByb3RvdHlwZTsKICB9CgogIGZ1bmN0aW9uIENvbG9yKCkge30KICB2YXIgZGFya2VyID0gMC43OwogIHZhciBicmlnaHRlciA9IDEgLyBkYXJrZXI7CiAgdmFyIHJlSSA9ICJcXHMqKFsrLV0/XFxkKylcXHMqIiwKICAgIHJlTiA9ICJcXHMqKFsrLV0/KD86XFxkKlxcLik/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIiwKICAgIHJlUCA9ICJcXHMqKFsrLV0/KD86XFxkKlxcLik/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiIsCiAgICByZUhleCA9IC9eIyhbMC05YS1mXXszLDh9KSQvLAogICAgcmVSZ2JJbnRlZ2VyID0gbmV3IFJlZ0V4cChgXnJnYlxcKCR7cmVJfSwke3JlSX0sJHtyZUl9XFwpJGApLAogICAgcmVSZ2JQZXJjZW50ID0gbmV3IFJlZ0V4cChgXnJnYlxcKCR7cmVQfSwke3JlUH0sJHtyZVB9XFwpJGApLAogICAgcmVSZ2JhSW50ZWdlciA9IG5ldyBSZWdFeHAoYF5yZ2JhXFwoJHtyZUl9LCR7cmVJfSwke3JlSX0sJHtyZU59XFwpJGApLAogICAgcmVSZ2JhUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5yZ2JhXFwoJHtyZVB9LCR7cmVQfSwke3JlUH0sJHtyZU59XFwpJGApLAogICAgcmVIc2xQZXJjZW50ID0gbmV3IFJlZ0V4cChgXmhzbFxcKCR7cmVOfSwke3JlUH0sJHtyZVB9XFwpJGApLAogICAgcmVIc2xhUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5oc2xhXFwoJHtyZU59LCR7cmVQfSwke3JlUH0sJHtyZU59XFwpJGApOwogIHZhciBuYW1lZCA9IHsKICAgIGFsaWNlYmx1ZTogMHhmMGY4ZmYsCiAgICBhbnRpcXVld2hpdGU6IDB4ZmFlYmQ3LAogICAgYXF1YTogMHgwMGZmZmYsCiAgICBhcXVhbWFyaW5lOiAweDdmZmZkNCwKICAgIGF6dXJlOiAweGYwZmZmZiwKICAgIGJlaWdlOiAweGY1ZjVkYywKICAgIGJpc3F1ZTogMHhmZmU0YzQsCiAgICBibGFjazogMHgwMDAwMDAsCiAgICBibGFuY2hlZGFsbW9uZDogMHhmZmViY2QsCiAgICBibHVlOiAweDAwMDBmZiwKICAgIGJsdWV2aW9sZXQ6IDB4OGEyYmUyLAogICAgYnJvd246IDB4YTUyYTJhLAogICAgYnVybHl3b29kOiAweGRlYjg4NywKICAgIGNhZGV0Ymx1ZTogMHg1ZjllYTAsCiAgICBjaGFydHJldXNlOiAweDdmZmYwMCwKICAgIGNob2NvbGF0ZTogMHhkMjY5MWUsCiAgICBjb3JhbDogMHhmZjdmNTAsCiAgICBjb3JuZmxvd2VyYmx1ZTogMHg2NDk1ZWQsCiAgICBjb3Juc2lsazogMHhmZmY4ZGMsCiAgICBjcmltc29uOiAweGRjMTQzYywKICAgIGN5YW46IDB4MDBmZmZmLAogICAgZGFya2JsdWU6IDB4MDAwMDhiLAogICAgZGFya2N5YW46IDB4MDA4YjhiLAogICAgZGFya2dvbGRlbnJvZDogMHhiODg2MGIsCiAgICBkYXJrZ3JheTogMHhhOWE5YTksCiAgICBkYXJrZ3JlZW46IDB4MDA2NDAwLAogICAgZGFya2dyZXk6IDB4YTlhOWE5LAogICAgZGFya2toYWtpOiAweGJkYjc2YiwKICAgIGRhcmttYWdlbnRhOiAweDhiMDA4YiwKICAgIGRhcmtvbGl2ZWdyZWVuOiAweDU1NmIyZiwKICAgIGRhcmtvcmFuZ2U6IDB4ZmY4YzAwLAogICAgZGFya29yY2hpZDogMHg5OTMyY2MsCiAgICBkYXJrcmVkOiAweDhiMDAwMCwKICAgIGRhcmtzYWxtb246IDB4ZTk5NjdhLAogICAgZGFya3NlYWdyZWVuOiAweDhmYmM4ZiwKICAgIGRhcmtzbGF0ZWJsdWU6IDB4NDgzZDhiLAogICAgZGFya3NsYXRlZ3JheTogMHgyZjRmNGYsCiAgICBkYXJrc2xhdGVncmV5OiAweDJmNGY0ZiwKICAgIGRhcmt0dXJxdW9pc2U6IDB4MDBjZWQxLAogICAgZGFya3Zpb2xldDogMHg5NDAwZDMsCiAgICBkZWVwcGluazogMHhmZjE0OTMsCiAgICBkZWVwc2t5Ymx1ZTogMHgwMGJmZmYsCiAgICBkaW1ncmF5OiAweDY5Njk2OSwKICAgIGRpbWdyZXk6IDB4Njk2OTY5LAogICAgZG9kZ2VyYmx1ZTogMHgxZTkwZmYsCiAgICBmaXJlYnJpY2s6IDB4YjIyMjIyLAogICAgZmxvcmFsd2hpdGU6IDB4ZmZmYWYwLAogICAgZm9yZXN0Z3JlZW46IDB4MjI4YjIyLAogICAgZnVjaHNpYTogMHhmZjAwZmYsCiAgICBnYWluc2Jvcm86IDB4ZGNkY2RjLAogICAgZ2hvc3R3aGl0ZTogMHhmOGY4ZmYsCiAgICBnb2xkOiAweGZmZDcwMCwKICAgIGdvbGRlbnJvZDogMHhkYWE1MjAsCiAgICBncmF5OiAweDgwODA4MCwKICAgIGdyZWVuOiAweDAwODAwMCwKICAgIGdyZWVueWVsbG93OiAweGFkZmYyZiwKICAgIGdyZXk6IDB4ODA4MDgwLAogICAgaG9uZXlkZXc6IDB4ZjBmZmYwLAogICAgaG90cGluazogMHhmZjY5YjQsCiAgICBpbmRpYW5yZWQ6IDB4Y2Q1YzVjLAogICAgaW5kaWdvOiAweDRiMDA4MiwKICAgIGl2b3J5OiAweGZmZmZmMCwKICAgIGtoYWtpOiAweGYwZTY4YywKICAgIGxhdmVuZGVyOiAweGU2ZTZmYSwKICAgIGxhdmVuZGVyYmx1c2g6IDB4ZmZmMGY1LAogICAgbGF3bmdyZWVuOiAweDdjZmMwMCwKICAgIGxlbW9uY2hpZmZvbjogMHhmZmZhY2QsCiAgICBsaWdodGJsdWU6IDB4YWRkOGU2LAogICAgbGlnaHRjb3JhbDogMHhmMDgwODAsCiAgICBsaWdodGN5YW46IDB4ZTBmZmZmLAogICAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IDB4ZmFmYWQyLAogICAgbGlnaHRncmF5OiAweGQzZDNkMywKICAgIGxpZ2h0Z3JlZW46IDB4OTBlZTkwLAogICAgbGlnaHRncmV5OiAweGQzZDNkMywKICAgIGxpZ2h0cGluazogMHhmZmI2YzEsCiAgICBsaWdodHNhbG1vbjogMHhmZmEwN2EsCiAgICBsaWdodHNlYWdyZWVuOiAweDIwYjJhYSwKICAgIGxpZ2h0c2t5Ymx1ZTogMHg4N2NlZmEsCiAgICBsaWdodHNsYXRlZ3JheTogMHg3Nzg4OTksCiAgICBsaWdodHNsYXRlZ3JleTogMHg3Nzg4OTksCiAgICBsaWdodHN0ZWVsYmx1ZTogMHhiMGM0ZGUsCiAgICBsaWdodHllbGxvdzogMHhmZmZmZTAsCiAgICBsaW1lOiAweDAwZmYwMCwKICAgIGxpbWVncmVlbjogMHgzMmNkMzIsCiAgICBsaW5lbjogMHhmYWYwZTYsCiAgICBtYWdlbnRhOiAweGZmMDBmZiwKICAgIG1hcm9vbjogMHg4MDAwMDAsCiAgICBtZWRpdW1hcXVhbWFyaW5lOiAweDY2Y2RhYSwKICAgIG1lZGl1bWJsdWU6IDB4MDAwMGNkLAogICAgbWVkaXVtb3JjaGlkOiAweGJhNTVkMywKICAgIG1lZGl1bXB1cnBsZTogMHg5MzcwZGIsCiAgICBtZWRpdW1zZWFncmVlbjogMHgzY2IzNzEsCiAgICBtZWRpdW1zbGF0ZWJsdWU6IDB4N2I2OGVlLAogICAgbWVkaXVtc3ByaW5nZ3JlZW46IDB4MDBmYTlhLAogICAgbWVkaXVtdHVycXVvaXNlOiAweDQ4ZDFjYywKICAgIG1lZGl1bXZpb2xldHJlZDogMHhjNzE1ODUsCiAgICBtaWRuaWdodGJsdWU6IDB4MTkxOTcwLAogICAgbWludGNyZWFtOiAweGY1ZmZmYSwKICAgIG1pc3R5cm9zZTogMHhmZmU0ZTEsCiAgICBtb2NjYXNpbjogMHhmZmU0YjUsCiAgICBuYXZham93aGl0ZTogMHhmZmRlYWQsCiAgICBuYXZ5OiAweDAwMDA4MCwKICAgIG9sZGxhY2U6IDB4ZmRmNWU2LAogICAgb2xpdmU6IDB4ODA4MDAwLAogICAgb2xpdmVkcmFiOiAweDZiOGUyMywKICAgIG9yYW5nZTogMHhmZmE1MDAsCiAgICBvcmFuZ2VyZWQ6IDB4ZmY0NTAwLAogICAgb3JjaGlkOiAweGRhNzBkNiwKICAgIHBhbGVnb2xkZW5yb2Q6IDB4ZWVlOGFhLAogICAgcGFsZWdyZWVuOiAweDk4ZmI5OCwKICAgIHBhbGV0dXJxdW9pc2U6IDB4YWZlZWVlLAogICAgcGFsZXZpb2xldHJlZDogMHhkYjcwOTMsCiAgICBwYXBheWF3aGlwOiAweGZmZWZkNSwKICAgIHBlYWNocHVmZjogMHhmZmRhYjksCiAgICBwZXJ1OiAweGNkODUzZiwKICAgIHBpbms6IDB4ZmZjMGNiLAogICAgcGx1bTogMHhkZGEwZGQsCiAgICBwb3dkZXJibHVlOiAweGIwZTBlNiwKICAgIHB1cnBsZTogMHg4MDAwODAsCiAgICByZWJlY2NhcHVycGxlOiAweDY2MzM5OSwKICAgIHJlZDogMHhmZjAwMDAsCiAgICByb3N5YnJvd246IDB4YmM4ZjhmLAogICAgcm95YWxibHVlOiAweDQxNjllMSwKICAgIHNhZGRsZWJyb3duOiAweDhiNDUxMywKICAgIHNhbG1vbjogMHhmYTgwNzIsCiAgICBzYW5keWJyb3duOiAweGY0YTQ2MCwKICAgIHNlYWdyZWVuOiAweDJlOGI1NywKICAgIHNlYXNoZWxsOiAweGZmZjVlZSwKICAgIHNpZW5uYTogMHhhMDUyMmQsCiAgICBzaWx2ZXI6IDB4YzBjMGMwLAogICAgc2t5Ymx1ZTogMHg4N2NlZWIsCiAgICBzbGF0ZWJsdWU6IDB4NmE1YWNkLAogICAgc2xhdGVncmF5OiAweDcwODA5MCwKICAgIHNsYXRlZ3JleTogMHg3MDgwOTAsCiAgICBzbm93OiAweGZmZmFmYSwKICAgIHNwcmluZ2dyZWVuOiAweDAwZmY3ZiwKICAgIHN0ZWVsYmx1ZTogMHg0NjgyYjQsCiAgICB0YW46IDB4ZDJiNDhjLAogICAgdGVhbDogMHgwMDgwODAsCiAgICB0aGlzdGxlOiAweGQ4YmZkOCwKICAgIHRvbWF0bzogMHhmZjYzNDcsCiAgICB0dXJxdW9pc2U6IDB4NDBlMGQwLAogICAgdmlvbGV0OiAweGVlODJlZSwKICAgIHdoZWF0OiAweGY1ZGViMywKICAgIHdoaXRlOiAweGZmZmZmZiwKICAgIHdoaXRlc21va2U6IDB4ZjVmNWY1LAogICAgeWVsbG93OiAweGZmZmYwMCwKICAgIHllbGxvd2dyZWVuOiAweDlhY2QzMgogIH07CiAgZGVmaW5lKENvbG9yLCBjb2xvciwgewogICAgY29weShjaGFubmVscykgewogICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLCB0aGlzLCBjaGFubmVscyk7CiAgICB9LAogICAgZGlzcGxheWFibGUoKSB7CiAgICAgIHJldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCk7CiAgICB9LAogICAgaGV4OiBjb2xvcl9mb3JtYXRIZXgsCiAgICAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LgogICAgZm9ybWF0SGV4OiBjb2xvcl9mb3JtYXRIZXgsCiAgICBmb3JtYXRIZXg4OiBjb2xvcl9mb3JtYXRIZXg4LAogICAgZm9ybWF0SHNsOiBjb2xvcl9mb3JtYXRIc2wsCiAgICBmb3JtYXRSZ2I6IGNvbG9yX2Zvcm1hdFJnYiwKICAgIHRvU3RyaW5nOiBjb2xvcl9mb3JtYXRSZ2IKICB9KTsKICBmdW5jdGlvbiBjb2xvcl9mb3JtYXRIZXgoKSB7CiAgICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXgoKTsKICB9CiAgZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4OCgpIHsKICAgIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleDgoKTsKICB9CiAgZnVuY3Rpb24gY29sb3JfZm9ybWF0SHNsKCkgewogICAgcmV0dXJuIGhzbENvbnZlcnQodGhpcykuZm9ybWF0SHNsKCk7CiAgfQogIGZ1bmN0aW9uIGNvbG9yX2Zvcm1hdFJnYigpIHsKICAgIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdFJnYigpOwogIH0KICBmdW5jdGlvbiBjb2xvcihmb3JtYXQpIHsKICAgIHZhciBtLCBsOwogICAgZm9ybWF0ID0gKGZvcm1hdCArICIiKS50cmltKCkudG9Mb3dlckNhc2UoKTsKICAgIHJldHVybiAobSA9IHJlSGV4LmV4ZWMoZm9ybWF0KSkgPyAobCA9IG1bMV0ubGVuZ3RoLCBtID0gcGFyc2VJbnQobVsxXSwgMTYpLCBsID09PSA2ID8gcmdibihtKSAvLyAjZmYwMDAwCiAgICA6IGwgPT09IDMgPyBuZXcgUmdiKG0gPj4gOCAmIDB4ZiB8IG0gPj4gNCAmIDB4ZjAsIG0gPj4gNCAmIDB4ZiB8IG0gJiAweGYwLCAobSAmIDB4ZikgPDwgNCB8IG0gJiAweGYsIDEpIC8vICNmMDAKICAgIDogbCA9PT0gOCA/IHJnYmEobSA+PiAyNCAmIDB4ZmYsIG0gPj4gMTYgJiAweGZmLCBtID4+IDggJiAweGZmLCAobSAmIDB4ZmYpIC8gMHhmZikgLy8gI2ZmMDAwMDAwCiAgICA6IGwgPT09IDQgPyByZ2JhKG0gPj4gMTIgJiAweGYgfCBtID4+IDggJiAweGYwLCBtID4+IDggJiAweGYgfCBtID4+IDQgJiAweGYwLCBtID4+IDQgJiAweGYgfCBtICYgMHhmMCwgKChtICYgMHhmKSA8PCA0IHwgbSAmIDB4ZikgLyAweGZmKSAvLyAjZjAwMAogICAgOiBudWxsIC8vIGludmFsaWQgaGV4CiAgICApIDogKG0gPSByZVJnYkludGVnZXIuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSwgbVsyXSwgbVszXSwgMSkgLy8gcmdiKDI1NSwgMCwgMCkKICAgIDogKG0gPSByZVJnYlBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgMSkgLy8gcmdiKDEwMCUsIDAlLCAwJSkKICAgIDogKG0gPSByZVJnYmFJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkgPyByZ2JhKG1bMV0sIG1bMl0sIG1bM10sIG1bNF0pIC8vIHJnYmEoMjU1LCAwLCAwLCAxKQogICAgOiAobSA9IHJlUmdiYVBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IHJnYmEobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgbVs0XSkgLy8gcmdiKDEwMCUsIDAlLCAwJSwgMSkKICAgIDogKG0gPSByZUhzbFBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IGhzbGEobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgMSkgLy8gaHNsKDEyMCwgNTAlLCA1MCUpCiAgICA6IChtID0gcmVIc2xhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCBtWzRdKSAvLyBoc2xhKDEyMCwgNTAlLCA1MCUsIDEpCiAgICA6IG5hbWVkLmhhc093blByb3BlcnR5KGZvcm1hdCkgPyByZ2JuKG5hbWVkW2Zvcm1hdF0pIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zCiAgICA6IGZvcm1hdCA9PT0gInRyYW5zcGFyZW50IiA/IG5ldyBSZ2IoTmFOLCBOYU4sIE5hTiwgMCkgOiBudWxsOwogIH0KICBmdW5jdGlvbiByZ2JuKG4pIHsKICAgIHJldHVybiBuZXcgUmdiKG4gPj4gMTYgJiAweGZmLCBuID4+IDggJiAweGZmLCBuICYgMHhmZiwgMSk7CiAgfQogIGZ1bmN0aW9uIHJnYmEociwgZywgYiwgYSkgewogICAgaWYgKGEgPD0gMCkgciA9IGcgPSBiID0gTmFOOwogICAgcmV0dXJuIG5ldyBSZ2IociwgZywgYiwgYSk7CiAgfQogIGZ1bmN0aW9uIHJnYkNvbnZlcnQobykgewogICAgaWYgKCEobyBpbnN0YW5jZW9mIENvbG9yKSkgbyA9IGNvbG9yKG8pOwogICAgaWYgKCFvKSByZXR1cm4gbmV3IFJnYigpOwogICAgbyA9IG8ucmdiKCk7CiAgICByZXR1cm4gbmV3IFJnYihvLnIsIG8uZywgby5iLCBvLm9wYWNpdHkpOwogIH0KICBmdW5jdGlvbiByZ2IociwgZywgYiwgb3BhY2l0eSkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyByZ2JDb252ZXJ0KHIpIDogbmV3IFJnYihyLCBnLCBiLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7CiAgfQogIGZ1bmN0aW9uIFJnYihyLCBnLCBiLCBvcGFjaXR5KSB7CiAgICB0aGlzLnIgPSArcjsKICAgIHRoaXMuZyA9ICtnOwogICAgdGhpcy5iID0gK2I7CiAgICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTsKICB9CiAgZGVmaW5lKFJnYiwgcmdiLCBleHRlbmQoQ29sb3IsIHsKICAgIGJyaWdodGVyKGspIHsKICAgICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspOwogICAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpOwogICAgfSwKICAgIGRhcmtlcihrKSB7CiAgICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspOwogICAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpOwogICAgfSwKICAgIHJnYigpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAogICAgY2xhbXAoKSB7CiAgICAgIHJldHVybiBuZXcgUmdiKGNsYW1waSh0aGlzLnIpLCBjbGFtcGkodGhpcy5nKSwgY2xhbXBpKHRoaXMuYiksIGNsYW1wYSh0aGlzLm9wYWNpdHkpKTsKICAgIH0sCiAgICBkaXNwbGF5YWJsZSgpIHsKICAgICAgcmV0dXJuIC0wLjUgPD0gdGhpcy5yICYmIHRoaXMuciA8IDI1NS41ICYmIC0wLjUgPD0gdGhpcy5nICYmIHRoaXMuZyA8IDI1NS41ICYmIC0wLjUgPD0gdGhpcy5iICYmIHRoaXMuYiA8IDI1NS41ICYmIDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxOwogICAgfSwKICAgIGhleDogcmdiX2Zvcm1hdEhleCwKICAgIC8vIERlcHJlY2F0ZWQhIFVzZSBjb2xvci5mb3JtYXRIZXguCiAgICBmb3JtYXRIZXg6IHJnYl9mb3JtYXRIZXgsCiAgICBmb3JtYXRIZXg4OiByZ2JfZm9ybWF0SGV4OCwKICAgIGZvcm1hdFJnYjogcmdiX2Zvcm1hdFJnYiwKICAgIHRvU3RyaW5nOiByZ2JfZm9ybWF0UmdiCiAgfSkpOwogIGZ1bmN0aW9uIHJnYl9mb3JtYXRIZXgoKSB7CiAgICByZXR1cm4gYCMke2hleCh0aGlzLnIpfSR7aGV4KHRoaXMuZyl9JHtoZXgodGhpcy5iKX1gOwogIH0KICBmdW5jdGlvbiByZ2JfZm9ybWF0SGV4OCgpIHsKICAgIHJldHVybiBgIyR7aGV4KHRoaXMucil9JHtoZXgodGhpcy5nKX0ke2hleCh0aGlzLmIpfSR7aGV4KChpc05hTih0aGlzLm9wYWNpdHkpID8gMSA6IHRoaXMub3BhY2l0eSkgKiAyNTUpfWA7CiAgfQogIGZ1bmN0aW9uIHJnYl9mb3JtYXRSZ2IoKSB7CiAgICBjb25zdCBhID0gY2xhbXBhKHRoaXMub3BhY2l0eSk7CiAgICByZXR1cm4gYCR7YSA9PT0gMSA/ICJyZ2IoIiA6ICJyZ2JhKCJ9JHtjbGFtcGkodGhpcy5yKX0sICR7Y2xhbXBpKHRoaXMuZyl9LCAke2NsYW1waSh0aGlzLmIpfSR7YSA9PT0gMSA/ICIpIiA6IGAsICR7YX0pYH1gOwogIH0KICBmdW5jdGlvbiBjbGFtcGEob3BhY2l0eSkgewogICAgcmV0dXJuIGlzTmFOKG9wYWNpdHkpID8gMSA6IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIG9wYWNpdHkpKTsKICB9CiAgZnVuY3Rpb24gY2xhbXBpKHZhbHVlKSB7CiAgICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHZhbHVlKSB8fCAwKSk7CiAgfQogIGZ1bmN0aW9uIGhleCh2YWx1ZSkgewogICAgdmFsdWUgPSBjbGFtcGkodmFsdWUpOwogICAgcmV0dXJuICh2YWx1ZSA8IDE2ID8gIjAiIDogIiIpICsgdmFsdWUudG9TdHJpbmcoMTYpOwogIH0KICBmdW5jdGlvbiBoc2xhKGgsIHMsIGwsIGEpIHsKICAgIGlmIChhIDw9IDApIGggPSBzID0gbCA9IE5hTjtlbHNlIGlmIChsIDw9IDAgfHwgbCA+PSAxKSBoID0gcyA9IE5hTjtlbHNlIGlmIChzIDw9IDApIGggPSBOYU47CiAgICByZXR1cm4gbmV3IEhzbChoLCBzLCBsLCBhKTsKICB9CiAgZnVuY3Rpb24gaHNsQ29udmVydChvKSB7CiAgICBpZiAobyBpbnN0YW5jZW9mIEhzbCkgcmV0dXJuIG5ldyBIc2woby5oLCBvLnMsIG8ubCwgby5vcGFjaXR5KTsKICAgIGlmICghKG8gaW5zdGFuY2VvZiBDb2xvcikpIG8gPSBjb2xvcihvKTsKICAgIGlmICghbykgcmV0dXJuIG5ldyBIc2woKTsKICAgIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbzsKICAgIG8gPSBvLnJnYigpOwogICAgdmFyIHIgPSBvLnIgLyAyNTUsCiAgICAgIGcgPSBvLmcgLyAyNTUsCiAgICAgIGIgPSBvLmIgLyAyNTUsCiAgICAgIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpLAogICAgICBtYXggPSBNYXRoLm1heChyLCBnLCBiKSwKICAgICAgaCA9IE5hTiwKICAgICAgcyA9IG1heCAtIG1pbiwKICAgICAgbCA9IChtYXggKyBtaW4pIC8gMjsKICAgIGlmIChzKSB7CiAgICAgIGlmIChyID09PSBtYXgpIGggPSAoZyAtIGIpIC8gcyArIChnIDwgYikgKiA2O2Vsc2UgaWYgKGcgPT09IG1heCkgaCA9IChiIC0gcikgLyBzICsgMjtlbHNlIGggPSAociAtIGcpIC8gcyArIDQ7CiAgICAgIHMgLz0gbCA8IDAuNSA/IG1heCArIG1pbiA6IDIgLSBtYXggLSBtaW47CiAgICAgIGggKj0gNjA7CiAgICB9IGVsc2UgewogICAgICBzID0gbCA+IDAgJiYgbCA8IDEgPyAwIDogaDsKICAgIH0KICAgIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIG8ub3BhY2l0eSk7CiAgfQogIGZ1bmN0aW9uIGhzbChoLCBzLCBsLCBvcGFjaXR5KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhzbENvbnZlcnQoaCkgOiBuZXcgSHNsKGgsIHMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsKICB9CiAgZnVuY3Rpb24gSHNsKGgsIHMsIGwsIG9wYWNpdHkpIHsKICAgIHRoaXMuaCA9ICtoOwogICAgdGhpcy5zID0gK3M7CiAgICB0aGlzLmwgPSArbDsKICAgIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5OwogIH0KICBkZWZpbmUoSHNsLCBoc2wsIGV4dGVuZChDb2xvciwgewogICAgYnJpZ2h0ZXIoaykgewogICAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7CiAgICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpOwogICAgfSwKICAgIGRhcmtlcihrKSB7CiAgICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspOwogICAgICByZXR1cm4gbmV3IEhzbCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTsKICAgIH0sCiAgICByZ2IoKSB7CiAgICAgIHZhciBoID0gdGhpcy5oICUgMzYwICsgKHRoaXMuaCA8IDApICogMzYwLAogICAgICAgIHMgPSBpc05hTihoKSB8fCBpc05hTih0aGlzLnMpID8gMCA6IHRoaXMucywKICAgICAgICBsID0gdGhpcy5sLAogICAgICAgIG0yID0gbCArIChsIDwgMC41ID8gbCA6IDEgLSBsKSAqIHMsCiAgICAgICAgbTEgPSAyICogbCAtIG0yOwogICAgICByZXR1cm4gbmV3IFJnYihoc2wycmdiKGggPj0gMjQwID8gaCAtIDI0MCA6IGggKyAxMjAsIG0xLCBtMiksIGhzbDJyZ2IoaCwgbTEsIG0yKSwgaHNsMnJnYihoIDwgMTIwID8gaCArIDI0MCA6IGggLSAxMjAsIG0xLCBtMiksIHRoaXMub3BhY2l0eSk7CiAgICB9LAogICAgY2xhbXAoKSB7CiAgICAgIHJldHVybiBuZXcgSHNsKGNsYW1waCh0aGlzLmgpLCBjbGFtcHQodGhpcy5zKSwgY2xhbXB0KHRoaXMubCksIGNsYW1wYSh0aGlzLm9wYWNpdHkpKTsKICAgIH0sCiAgICBkaXNwbGF5YWJsZSgpIHsKICAgICAgcmV0dXJuICgwIDw9IHRoaXMucyAmJiB0aGlzLnMgPD0gMSB8fCBpc05hTih0aGlzLnMpKSAmJiAwIDw9IHRoaXMubCAmJiB0aGlzLmwgPD0gMSAmJiAwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMTsKICAgIH0sCiAgICBmb3JtYXRIc2woKSB7CiAgICAgIGNvbnN0IGEgPSBjbGFtcGEodGhpcy5vcGFjaXR5KTsKICAgICAgcmV0dXJuIGAke2EgPT09IDEgPyAiaHNsKCIgOiAiaHNsYSgifSR7Y2xhbXBoKHRoaXMuaCl9LCAke2NsYW1wdCh0aGlzLnMpICogMTAwfSUsICR7Y2xhbXB0KHRoaXMubCkgKiAxMDB9JSR7YSA9PT0gMSA/ICIpIiA6IGAsICR7YX0pYH1gOwogICAgfQogIH0pKTsKICBmdW5jdGlvbiBjbGFtcGgodmFsdWUpIHsKICAgIHZhbHVlID0gKHZhbHVlIHx8IDApICUgMzYwOwogICAgcmV0dXJuIHZhbHVlIDwgMCA/IHZhbHVlICsgMzYwIDogdmFsdWU7CiAgfQogIGZ1bmN0aW9uIGNsYW1wdCh2YWx1ZSkgewogICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHZhbHVlIHx8IDApKTsKICB9CgogIC8qIEZyb20gRnZEIDEzLjM3LCBDU1MgQ29sb3IgTW9kdWxlIExldmVsIDMgKi8KICBmdW5jdGlvbiBoc2wycmdiKGgsIG0xLCBtMikgewogICAgcmV0dXJuIChoIDwgNjAgPyBtMSArIChtMiAtIG0xKSAqIGggLyA2MCA6IGggPCAxODAgPyBtMiA6IGggPCAyNDAgPyBtMSArIChtMiAtIG0xKSAqICgyNDAgLSBoKSAvIDYwIDogbTEpICogMjU1OwogIH0KCiAgdmFyIGNvbnN0YW50ID0geCA9PiAoKSA9PiB4OwoKICBmdW5jdGlvbiBsaW5lYXIoYSwgZCkgewogICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgIHJldHVybiBhICsgdCAqIGQ7CiAgICB9OwogIH0KICBmdW5jdGlvbiBleHBvbmVudGlhbChhLCBiLCB5KSB7CiAgICByZXR1cm4gYSA9IE1hdGgucG93KGEsIHkpLCBiID0gTWF0aC5wb3coYiwgeSkgLSBhLCB5ID0gMSAvIHksIGZ1bmN0aW9uICh0KSB7CiAgICAgIHJldHVybiBNYXRoLnBvdyhhICsgdCAqIGIsIHkpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gZ2FtbWEoeSkgewogICAgcmV0dXJuICh5ID0gK3kpID09PSAxID8gbm9nYW1tYSA6IGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgIHJldHVybiBiIC0gYSA/IGV4cG9uZW50aWFsKGEsIGIsIHkpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBub2dhbW1hKGEsIGIpIHsKICAgIHZhciBkID0gYiAtIGE7CiAgICByZXR1cm4gZCA/IGxpbmVhcihhLCBkKSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpOwogIH0KCiAgdmFyIGludGVycG9sYXRlUmdiID0gKGZ1bmN0aW9uIHJnYkdhbW1hKHkpIHsKICAgIHZhciBjb2xvciA9IGdhbW1hKHkpOwogICAgZnVuY3Rpb24gcmdiJDEoc3RhcnQsIGVuZCkgewogICAgICB2YXIgciA9IGNvbG9yKChzdGFydCA9IHJnYihzdGFydCkpLnIsIChlbmQgPSByZ2IoZW5kKSkuciksCiAgICAgICAgZyA9IGNvbG9yKHN0YXJ0LmcsIGVuZC5nKSwKICAgICAgICBiID0gY29sb3Ioc3RhcnQuYiwgZW5kLmIpLAogICAgICAgIG9wYWNpdHkgPSBub2dhbW1hKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgc3RhcnQuciA9IHIodCk7CiAgICAgICAgc3RhcnQuZyA9IGcodCk7CiAgICAgICAgc3RhcnQuYiA9IGIodCk7CiAgICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7CiAgICAgICAgcmV0dXJuIHN0YXJ0ICsgIiI7CiAgICAgIH07CiAgICB9CiAgICByZ2IkMS5nYW1tYSA9IHJnYkdhbW1hOwogICAgcmV0dXJuIHJnYiQxOwogIH0pKDEpOwoKICBmdW5jdGlvbiBpbnRlcnBvbGF0ZU51bWJlciAoYSwgYikgewogICAgcmV0dXJuIGEgPSArYSwgYiA9ICtiLCBmdW5jdGlvbiAodCkgewogICAgICByZXR1cm4gYSAqICgxIC0gdCkgKyBiICogdDsKICAgIH07CiAgfQoKICB2YXIgcmVBID0gL1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLAogICAgcmVCID0gbmV3IFJlZ0V4cChyZUEuc291cmNlLCAiZyIpOwogIGZ1bmN0aW9uIHplcm8oYikgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIGI7CiAgICB9OwogIH0KICBmdW5jdGlvbiBvbmUoYikgewogICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgIHJldHVybiBiKHQpICsgIiI7CiAgICB9OwogIH0KICBmdW5jdGlvbiBpbnRlcnBvbGF0ZVN0cmluZyAoYSwgYikgewogICAgdmFyIGJpID0gcmVBLmxhc3RJbmRleCA9IHJlQi5sYXN0SW5kZXggPSAwLAogICAgICAvLyBzY2FuIGluZGV4IGZvciBuZXh0IG51bWJlciBpbiBiCiAgICAgIGFtLAogICAgICAvLyBjdXJyZW50IG1hdGNoIGluIGEKICAgICAgYm0sCiAgICAgIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYgogICAgICBicywKICAgICAgLy8gc3RyaW5nIHByZWNlZGluZyBjdXJyZW50IG51bWJlciBpbiBiLCBpZiBhbnkKICAgICAgaSA9IC0xLAogICAgICAvLyBpbmRleCBpbiBzCiAgICAgIHMgPSBbXSwKICAgICAgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzCiAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnMKCiAgICAvLyBDb2VyY2UgaW5wdXRzIHRvIHN0cmluZ3MuCiAgICBhID0gYSArICIiLCBiID0gYiArICIiOwoKICAgIC8vIEludGVycG9sYXRlIHBhaXJzIG9mIG51bWJlcnMgaW4gYSAmIGIuCiAgICB3aGlsZSAoKGFtID0gcmVBLmV4ZWMoYSkpICYmIChibSA9IHJlQi5leGVjKGIpKSkgewogICAgICBpZiAoKGJzID0gYm0uaW5kZXgpID4gYmkpIHsKICAgICAgICAvLyBhIHN0cmluZyBwcmVjZWRlcyB0aGUgbmV4dCBudW1iZXIgaW4gYgogICAgICAgIGJzID0gYi5zbGljZShiaSwgYnMpOwogICAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJzOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZwogICAgICAgIGVsc2Ugc1srK2ldID0gYnM7CiAgICAgIH0KICAgICAgaWYgKChhbSA9IGFtWzBdKSA9PT0gKGJtID0gYm1bMF0pKSB7CiAgICAgICAgLy8gbnVtYmVycyBpbiBhICYgYiBtYXRjaAogICAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJtOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZwogICAgICAgIGVsc2Ugc1srK2ldID0gYm07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gaW50ZXJwb2xhdGUgbm9uLW1hdGNoaW5nIG51bWJlcnMKICAgICAgICBzWysraV0gPSBudWxsOwogICAgICAgIHEucHVzaCh7CiAgICAgICAgICBpOiBpLAogICAgICAgICAgeDogaW50ZXJwb2xhdGVOdW1iZXIoYW0sIGJtKQogICAgICAgIH0pOwogICAgICB9CiAgICAgIGJpID0gcmVCLmxhc3RJbmRleDsKICAgIH0KCiAgICAvLyBBZGQgcmVtYWlucyBvZiBiLgogICAgaWYgKGJpIDwgYi5sZW5ndGgpIHsKICAgICAgYnMgPSBiLnNsaWNlKGJpKTsKICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nCiAgICAgIGVsc2Ugc1srK2ldID0gYnM7CiAgICB9CgogICAgLy8gU3BlY2lhbCBvcHRpbWl6YXRpb24gZm9yIG9ubHkgYSBzaW5nbGUgbWF0Y2guCiAgICAvLyBPdGhlcndpc2UsIGludGVycG9sYXRlIGVhY2ggb2YgdGhlIG51bWJlcnMgYW5kIHJlam9pbiB0aGUgc3RyaW5nLgogICAgcmV0dXJuIHMubGVuZ3RoIDwgMiA/IHFbMF0gPyBvbmUocVswXS54KSA6IHplcm8oYikgOiAoYiA9IHEubGVuZ3RoLCBmdW5jdGlvbiAodCkgewogICAgICBmb3IgKHZhciBpID0gMCwgbzsgaSA8IGI7ICsraSkgc1sobyA9IHFbaV0pLmldID0gby54KHQpOwogICAgICByZXR1cm4gcy5qb2luKCIiKTsKICAgIH0pOwogIH0KCiAgdmFyIGRlZ3JlZXMgPSAxODAgLyBNYXRoLlBJOwogIHZhciBpZGVudGl0eSA9IHsKICAgIHRyYW5zbGF0ZVg6IDAsCiAgICB0cmFuc2xhdGVZOiAwLAogICAgcm90YXRlOiAwLAogICAgc2tld1g6IDAsCiAgICBzY2FsZVg6IDEsCiAgICBzY2FsZVk6IDEKICB9OwogIGZ1bmN0aW9uIGRlY29tcG9zZSAoYSwgYiwgYywgZCwgZSwgZikgewogICAgdmFyIHNjYWxlWCwgc2NhbGVZLCBza2V3WDsKICAgIGlmIChzY2FsZVggPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYikpIGEgLz0gc2NhbGVYLCBiIC89IHNjYWxlWDsKICAgIGlmIChza2V3WCA9IGEgKiBjICsgYiAqIGQpIGMgLT0gYSAqIHNrZXdYLCBkIC09IGIgKiBza2V3WDsKICAgIGlmIChzY2FsZVkgPSBNYXRoLnNxcnQoYyAqIGMgKyBkICogZCkpIGMgLz0gc2NhbGVZLCBkIC89IHNjYWxlWSwgc2tld1ggLz0gc2NhbGVZOwogICAgaWYgKGEgKiBkIDwgYiAqIGMpIGEgPSAtYSwgYiA9IC1iLCBza2V3WCA9IC1za2V3WCwgc2NhbGVYID0gLXNjYWxlWDsKICAgIHJldHVybiB7CiAgICAgIHRyYW5zbGF0ZVg6IGUsCiAgICAgIHRyYW5zbGF0ZVk6IGYsCiAgICAgIHJvdGF0ZTogTWF0aC5hdGFuMihiLCBhKSAqIGRlZ3JlZXMsCiAgICAgIHNrZXdYOiBNYXRoLmF0YW4oc2tld1gpICogZGVncmVlcywKICAgICAgc2NhbGVYOiBzY2FsZVgsCiAgICAgIHNjYWxlWTogc2NhbGVZCiAgICB9OwogIH0KCiAgdmFyIHN2Z05vZGU7CgogIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovCiAgZnVuY3Rpb24gcGFyc2VDc3ModmFsdWUpIHsKICAgIGNvbnN0IG0gPSBuZXcgKHR5cGVvZiBET01NYXRyaXggPT09ICJmdW5jdGlvbiIgPyBET01NYXRyaXggOiBXZWJLaXRDU1NNYXRyaXgpKHZhbHVlICsgIiIpOwogICAgcmV0dXJuIG0uaXNJZGVudGl0eSA/IGlkZW50aXR5IDogZGVjb21wb3NlKG0uYSwgbS5iLCBtLmMsIG0uZCwgbS5lLCBtLmYpOwogIH0KICBmdW5jdGlvbiBwYXJzZVN2Zyh2YWx1ZSkgewogICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBpZGVudGl0eTsKICAgIGlmICghc3ZnTm9kZSkgc3ZnTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCAiZyIpOwogICAgc3ZnTm9kZS5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsIHZhbHVlKTsKICAgIGlmICghKHZhbHVlID0gc3ZnTm9kZS50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKSkgcmV0dXJuIGlkZW50aXR5OwogICAgdmFsdWUgPSB2YWx1ZS5tYXRyaXg7CiAgICByZXR1cm4gZGVjb21wb3NlKHZhbHVlLmEsIHZhbHVlLmIsIHZhbHVlLmMsIHZhbHVlLmQsIHZhbHVlLmUsIHZhbHVlLmYpOwogIH0KCiAgZnVuY3Rpb24gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2UsIHB4Q29tbWEsIHB4UGFyZW4sIGRlZ1BhcmVuKSB7CiAgICBmdW5jdGlvbiBwb3AocykgewogICAgICByZXR1cm4gcy5sZW5ndGggPyBzLnBvcCgpICsgIiAiIDogIiI7CiAgICB9CiAgICBmdW5jdGlvbiB0cmFuc2xhdGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHsKICAgICAgaWYgKHhhICE9PSB4YiB8fCB5YSAhPT0geWIpIHsKICAgICAgICB2YXIgaSA9IHMucHVzaCgidHJhbnNsYXRlKCIsIG51bGwsIHB4Q29tbWEsIG51bGwsIHB4UGFyZW4pOwogICAgICAgIHEucHVzaCh7CiAgICAgICAgICBpOiBpIC0gNCwKICAgICAgICAgIHg6IGludGVycG9sYXRlTnVtYmVyKHhhLCB4YikKICAgICAgICB9LCB7CiAgICAgICAgICBpOiBpIC0gMiwKICAgICAgICAgIHg6IGludGVycG9sYXRlTnVtYmVyKHlhLCB5YikKICAgICAgICB9KTsKICAgICAgfSBlbHNlIGlmICh4YiB8fCB5YikgewogICAgICAgIHMucHVzaCgidHJhbnNsYXRlKCIgKyB4YiArIHB4Q29tbWEgKyB5YiArIHB4UGFyZW4pOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiByb3RhdGUoYSwgYiwgcywgcSkgewogICAgICBpZiAoYSAhPT0gYikgewogICAgICAgIGlmIChhIC0gYiA+IDE4MCkgYiArPSAzNjA7ZWxzZSBpZiAoYiAtIGEgPiAxODApIGEgKz0gMzYwOyAvLyBzaG9ydGVzdCBwYXRoCiAgICAgICAgcS5wdXNoKHsKICAgICAgICAgIGk6IHMucHVzaChwb3AocykgKyAicm90YXRlKCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsCiAgICAgICAgICB4OiBpbnRlcnBvbGF0ZU51bWJlcihhLCBiKQogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKGIpIHsKICAgICAgICBzLnB1c2gocG9wKHMpICsgInJvdGF0ZSgiICsgYiArIGRlZ1BhcmVuKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gc2tld1goYSwgYiwgcywgcSkgewogICAgICBpZiAoYSAhPT0gYikgewogICAgICAgIHEucHVzaCh7CiAgICAgICAgICBpOiBzLnB1c2gocG9wKHMpICsgInNrZXdYKCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsCiAgICAgICAgICB4OiBpbnRlcnBvbGF0ZU51bWJlcihhLCBiKQogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKGIpIHsKICAgICAgICBzLnB1c2gocG9wKHMpICsgInNrZXdYKCIgKyBiICsgZGVnUGFyZW4pOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBzY2FsZSh4YSwgeWEsIHhiLCB5YiwgcywgcSkgewogICAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5YikgewogICAgICAgIHZhciBpID0gcy5wdXNoKHBvcChzKSArICJzY2FsZSgiLCBudWxsLCAiLCIsIG51bGwsICIpIik7CiAgICAgICAgcS5wdXNoKHsKICAgICAgICAgIGk6IGkgLSA0LAogICAgICAgICAgeDogaW50ZXJwb2xhdGVOdW1iZXIoeGEsIHhiKQogICAgICAgIH0sIHsKICAgICAgICAgIGk6IGkgLSAyLAogICAgICAgICAgeDogaW50ZXJwb2xhdGVOdW1iZXIoeWEsIHliKQogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKHhiICE9PSAxIHx8IHliICE9PSAxKSB7CiAgICAgICAgcy5wdXNoKHBvcChzKSArICJzY2FsZSgiICsgeGIgKyAiLCIgKyB5YiArICIpIik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmdW5jdGlvbiAoYSwgYikgewogICAgICB2YXIgcyA9IFtdLAogICAgICAgIC8vIHN0cmluZyBjb25zdGFudHMgYW5kIHBsYWNlaG9sZGVycwogICAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnMKICAgICAgYSA9IHBhcnNlKGEpLCBiID0gcGFyc2UoYik7CiAgICAgIHRyYW5zbGF0ZShhLnRyYW5zbGF0ZVgsIGEudHJhbnNsYXRlWSwgYi50cmFuc2xhdGVYLCBiLnRyYW5zbGF0ZVksIHMsIHEpOwogICAgICByb3RhdGUoYS5yb3RhdGUsIGIucm90YXRlLCBzLCBxKTsKICAgICAgc2tld1goYS5za2V3WCwgYi5za2V3WCwgcywgcSk7CiAgICAgIHNjYWxlKGEuc2NhbGVYLCBhLnNjYWxlWSwgYi5zY2FsZVgsIGIuc2NhbGVZLCBzLCBxKTsKICAgICAgYSA9IGIgPSBudWxsOyAvLyBnYwogICAgICByZXR1cm4gZnVuY3Rpb24gKHQpIHsKICAgICAgICB2YXIgaSA9IC0xLAogICAgICAgICAgbiA9IHEubGVuZ3RoLAogICAgICAgICAgbzsKICAgICAgICB3aGlsZSAoKytpIDwgbikgc1sobyA9IHFbaV0pLmldID0gby54KHQpOwogICAgICAgIHJldHVybiBzLmpvaW4oIiIpOwogICAgICB9OwogICAgfTsKICB9CiAgdmFyIGludGVycG9sYXRlVHJhbnNmb3JtQ3NzID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VDc3MsICJweCwgIiwgInB4KSIsICJkZWcpIik7CiAgdmFyIGludGVycG9sYXRlVHJhbnNmb3JtU3ZnID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VTdmcsICIsICIsICIpIiwgIikiKTsKCiAgdmFyIGZyYW1lID0gMCwKICAgIC8vIGlzIGFuIGFuaW1hdGlvbiBmcmFtZSBwZW5kaW5nPwogICAgdGltZW91dCQxID0gMCwKICAgIC8vIGlzIGEgdGltZW91dCBwZW5kaW5nPwogICAgaW50ZXJ2YWwgPSAwLAogICAgLy8gYXJlIGFueSB0aW1lcnMgYWN0aXZlPwogICAgcG9rZURlbGF5ID0gMTAwMCwKICAgIC8vIGhvdyBmcmVxdWVudGx5IHdlIGNoZWNrIGZvciBjbG9jayBza2V3CiAgICB0YXNrSGVhZCwKICAgIHRhc2tUYWlsLAogICAgY2xvY2tMYXN0ID0gMCwKICAgIGNsb2NrTm93ID0gMCwKICAgIGNsb2NrU2tldyA9IDAsCiAgICBjbG9jayA9IHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gIm9iamVjdCIgJiYgcGVyZm9ybWFuY2Uubm93ID8gcGVyZm9ybWFuY2UgOiBEYXRlLAogICAgc2V0RnJhbWUgPSB0eXBlb2Ygd2luZG93ID09PSAib2JqZWN0IiAmJiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdykgOiBmdW5jdGlvbiAoZikgewogICAgICBzZXRUaW1lb3V0KGYsIDE3KTsKICAgIH07CiAgZnVuY3Rpb24gbm93KCkgewogICAgcmV0dXJuIGNsb2NrTm93IHx8IChzZXRGcmFtZShjbGVhck5vdyksIGNsb2NrTm93ID0gY2xvY2subm93KCkgKyBjbG9ja1NrZXcpOwogIH0KICBmdW5jdGlvbiBjbGVhck5vdygpIHsKICAgIGNsb2NrTm93ID0gMDsKICB9CiAgZnVuY3Rpb24gVGltZXIoKSB7CiAgICB0aGlzLl9jYWxsID0gdGhpcy5fdGltZSA9IHRoaXMuX25leHQgPSBudWxsOwogIH0KICBUaW1lci5wcm90b3R5cGUgPSB0aW1lci5wcm90b3R5cGUgPSB7CiAgICBjb25zdHJ1Y3RvcjogVGltZXIsCiAgICByZXN0YXJ0OiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7CiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uIik7CiAgICAgIHRpbWUgPSAodGltZSA9PSBudWxsID8gbm93KCkgOiArdGltZSkgKyAoZGVsYXkgPT0gbnVsbCA/IDAgOiArZGVsYXkpOwogICAgICBpZiAoIXRoaXMuX25leHQgJiYgdGFza1RhaWwgIT09IHRoaXMpIHsKICAgICAgICBpZiAodGFza1RhaWwpIHRhc2tUYWlsLl9uZXh0ID0gdGhpcztlbHNlIHRhc2tIZWFkID0gdGhpczsKICAgICAgICB0YXNrVGFpbCA9IHRoaXM7CiAgICAgIH0KICAgICAgdGhpcy5fY2FsbCA9IGNhbGxiYWNrOwogICAgICB0aGlzLl90aW1lID0gdGltZTsKICAgICAgc2xlZXAoKTsKICAgIH0sCiAgICBzdG9wOiBmdW5jdGlvbiAoKSB7CiAgICAgIGlmICh0aGlzLl9jYWxsKSB7CiAgICAgICAgdGhpcy5fY2FsbCA9IG51bGw7CiAgICAgICAgdGhpcy5fdGltZSA9IEluZmluaXR5OwogICAgICAgIHNsZWVwKCk7CiAgICAgIH0KICAgIH0KICB9OwogIGZ1bmN0aW9uIHRpbWVyKGNhbGxiYWNrLCBkZWxheSwgdGltZSkgewogICAgdmFyIHQgPSBuZXcgVGltZXIoKTsKICAgIHQucmVzdGFydChjYWxsYmFjaywgZGVsYXksIHRpbWUpOwogICAgcmV0dXJuIHQ7CiAgfQogIGZ1bmN0aW9uIHRpbWVyRmx1c2goKSB7CiAgICBub3coKTsgLy8gR2V0IHRoZSBjdXJyZW50IHRpbWUsIGlmIG5vdCBhbHJlYWR5IHNldC4KICAgICsrZnJhbWU7IC8vIFByZXRlbmQgd2XigJl2ZSBzZXQgYW4gYWxhcm0sIGlmIHdlIGhhdmVu4oCZdCBhbHJlYWR5LgogICAgdmFyIHQgPSB0YXNrSGVhZCwKICAgICAgZTsKICAgIHdoaWxlICh0KSB7CiAgICAgIGlmICgoZSA9IGNsb2NrTm93IC0gdC5fdGltZSkgPj0gMCkgdC5fY2FsbC5jYWxsKHVuZGVmaW5lZCwgZSk7CiAgICAgIHQgPSB0Ll9uZXh0OwogICAgfQogICAgLS1mcmFtZTsKICB9CiAgZnVuY3Rpb24gd2FrZSgpIHsKICAgIGNsb2NrTm93ID0gKGNsb2NrTGFzdCA9IGNsb2NrLm5vdygpKSArIGNsb2NrU2tldzsKICAgIGZyYW1lID0gdGltZW91dCQxID0gMDsKICAgIHRyeSB7CiAgICAgIHRpbWVyRmx1c2goKTsKICAgIH0gZmluYWxseSB7CiAgICAgIGZyYW1lID0gMDsKICAgICAgbmFwKCk7CiAgICAgIGNsb2NrTm93ID0gMDsKICAgIH0KICB9CiAgZnVuY3Rpb24gcG9rZSgpIHsKICAgIHZhciBub3cgPSBjbG9jay5ub3coKSwKICAgICAgZGVsYXkgPSBub3cgLSBjbG9ja0xhc3Q7CiAgICBpZiAoZGVsYXkgPiBwb2tlRGVsYXkpIGNsb2NrU2tldyAtPSBkZWxheSwgY2xvY2tMYXN0ID0gbm93OwogIH0KICBmdW5jdGlvbiBuYXAoKSB7CiAgICB2YXIgdDAsCiAgICAgIHQxID0gdGFza0hlYWQsCiAgICAgIHQyLAogICAgICB0aW1lID0gSW5maW5pdHk7CiAgICB3aGlsZSAodDEpIHsKICAgICAgaWYgKHQxLl9jYWxsKSB7CiAgICAgICAgaWYgKHRpbWUgPiB0MS5fdGltZSkgdGltZSA9IHQxLl90aW1lOwogICAgICAgIHQwID0gdDEsIHQxID0gdDEuX25leHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdDIgPSB0MS5fbmV4dCwgdDEuX25leHQgPSBudWxsOwogICAgICAgIHQxID0gdDAgPyB0MC5fbmV4dCA9IHQyIDogdGFza0hlYWQgPSB0MjsKICAgICAgfQogICAgfQogICAgdGFza1RhaWwgPSB0MDsKICAgIHNsZWVwKHRpbWUpOwogIH0KICBmdW5jdGlvbiBzbGVlcCh0aW1lKSB7CiAgICBpZiAoZnJhbWUpIHJldHVybjsgLy8gU29vbmVzdCBhbGFybSBhbHJlYWR5IHNldCwgb3Igd2lsbCBiZS4KICAgIGlmICh0aW1lb3V0JDEpIHRpbWVvdXQkMSA9IGNsZWFyVGltZW91dCh0aW1lb3V0JDEpOwogICAgdmFyIGRlbGF5ID0gdGltZSAtIGNsb2NrTm93OyAvLyBTdHJpY3RseSBsZXNzIHRoYW4gaWYgd2UgcmVjb21wdXRlZCBjbG9ja05vdy4KICAgIGlmIChkZWxheSA+IDI0KSB7CiAgICAgIGlmICh0aW1lIDwgSW5maW5pdHkpIHRpbWVvdXQkMSA9IHNldFRpbWVvdXQod2FrZSwgdGltZSAtIGNsb2NrLm5vdygpIC0gY2xvY2tTa2V3KTsKICAgICAgaWYgKGludGVydmFsKSBpbnRlcnZhbCA9IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKCFpbnRlcnZhbCkgY2xvY2tMYXN0ID0gY2xvY2subm93KCksIGludGVydmFsID0gc2V0SW50ZXJ2YWwocG9rZSwgcG9rZURlbGF5KTsKICAgICAgZnJhbWUgPSAxLCBzZXRGcmFtZSh3YWtlKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHRpbWVvdXQgKGNhbGxiYWNrLCBkZWxheSwgdGltZSkgewogICAgdmFyIHQgPSBuZXcgVGltZXIoKTsKICAgIGRlbGF5ID0gZGVsYXkgPT0gbnVsbCA/IDAgOiArZGVsYXk7CiAgICB0LnJlc3RhcnQoZWxhcHNlZCA9PiB7CiAgICAgIHQuc3RvcCgpOwogICAgICBjYWxsYmFjayhlbGFwc2VkICsgZGVsYXkpOwogICAgfSwgZGVsYXksIHRpbWUpOwogICAgcmV0dXJuIHQ7CiAgfQoKICB2YXIgZW1wdHlPbiA9IGRpc3BhdGNoKCJzdGFydCIsICJlbmQiLCAiY2FuY2VsIiwgImludGVycnVwdCIpOwogIHZhciBlbXB0eVR3ZWVuID0gW107CiAgdmFyIENSRUFURUQgPSAwOwogIHZhciBTQ0hFRFVMRUQgPSAxOwogIHZhciBTVEFSVElORyA9IDI7CiAgdmFyIFNUQVJURUQgPSAzOwogIHZhciBSVU5OSU5HID0gNDsKICB2YXIgRU5ESU5HID0gNTsKICB2YXIgRU5ERUQgPSA2OwogIGZ1bmN0aW9uIHNjaGVkdWxlIChub2RlLCBuYW1lLCBpZCwgaW5kZXgsIGdyb3VwLCB0aW1pbmcpIHsKICAgIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbjsKICAgIGlmICghc2NoZWR1bGVzKSBub2RlLl9fdHJhbnNpdGlvbiA9IHt9O2Vsc2UgaWYgKGlkIGluIHNjaGVkdWxlcykgcmV0dXJuOwogICAgY3JlYXRlKG5vZGUsIGlkLCB7CiAgICAgIG5hbWU6IG5hbWUsCiAgICAgIGluZGV4OiBpbmRleCwKICAgICAgLy8gRm9yIGNvbnRleHQgZHVyaW5nIGNhbGxiYWNrLgogICAgICBncm91cDogZ3JvdXAsCiAgICAgIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay4KICAgICAgb246IGVtcHR5T24sCiAgICAgIHR3ZWVuOiBlbXB0eVR3ZWVuLAogICAgICB0aW1lOiB0aW1pbmcudGltZSwKICAgICAgZGVsYXk6IHRpbWluZy5kZWxheSwKICAgICAgZHVyYXRpb246IHRpbWluZy5kdXJhdGlvbiwKICAgICAgZWFzZTogdGltaW5nLmVhc2UsCiAgICAgIHRpbWVyOiBudWxsLAogICAgICBzdGF0ZTogQ1JFQVRFRAogICAgfSk7CiAgfQogIGZ1bmN0aW9uIGluaXQobm9kZSwgaWQpIHsKICAgIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7CiAgICBpZiAoc2NoZWR1bGUuc3RhdGUgPiBDUkVBVEVEKSB0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHNjaGVkdWxlZCIpOwogICAgcmV0dXJuIHNjaGVkdWxlOwogIH0KICBmdW5jdGlvbiBzZXQobm9kZSwgaWQpIHsKICAgIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7CiAgICBpZiAoc2NoZWR1bGUuc3RhdGUgPiBTVEFSVEVEKSB0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHJ1bm5pbmciKTsKICAgIHJldHVybiBzY2hlZHVsZTsKICB9CiAgZnVuY3Rpb24gZ2V0KG5vZGUsIGlkKSB7CiAgICB2YXIgc2NoZWR1bGUgPSBub2RlLl9fdHJhbnNpdGlvbjsKICAgIGlmICghc2NoZWR1bGUgfHwgIShzY2hlZHVsZSA9IHNjaGVkdWxlW2lkXSkpIHRocm93IG5ldyBFcnJvcigidHJhbnNpdGlvbiBub3QgZm91bmQiKTsKICAgIHJldHVybiBzY2hlZHVsZTsKICB9CiAgZnVuY3Rpb24gY3JlYXRlKG5vZGUsIGlkLCBzZWxmKSB7CiAgICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sCiAgICAgIHR3ZWVuOwoKICAgIC8vIEluaXRpYWxpemUgdGhlIHNlbGYgdGltZXIgd2hlbiB0aGUgdHJhbnNpdGlvbiBpcyBjcmVhdGVkLgogICAgLy8gTm90ZSB0aGUgYWN0dWFsIGRlbGF5IGlzIG5vdCBrbm93biB1bnRpbCB0aGUgZmlyc3QgY2FsbGJhY2shCiAgICBzY2hlZHVsZXNbaWRdID0gc2VsZjsKICAgIHNlbGYudGltZXIgPSB0aW1lcihzY2hlZHVsZSwgMCwgc2VsZi50aW1lKTsKICAgIGZ1bmN0aW9uIHNjaGVkdWxlKGVsYXBzZWQpIHsKICAgICAgc2VsZi5zdGF0ZSA9IFNDSEVEVUxFRDsKICAgICAgc2VsZi50aW1lci5yZXN0YXJ0KHN0YXJ0LCBzZWxmLmRlbGF5LCBzZWxmLnRpbWUpOwoKICAgICAgLy8gSWYgdGhlIGVsYXBzZWQgZGVsYXkgaXMgbGVzcyB0aGFuIG91ciBmaXJzdCBzbGVlcCwgc3RhcnQgaW1tZWRpYXRlbHkuCiAgICAgIGlmIChzZWxmLmRlbGF5IDw9IGVsYXBzZWQpIHN0YXJ0KGVsYXBzZWQgLSBzZWxmLmRlbGF5KTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0YXJ0KGVsYXBzZWQpIHsKICAgICAgdmFyIGksIGosIG4sIG87CgogICAgICAvLyBJZiB0aGUgc3RhdGUgaXMgbm90IFNDSEVEVUxFRCwgdGhlbiB3ZSBwcmV2aW91c2x5IGVycm9yZWQgb24gc3RhcnQuCiAgICAgIGlmIChzZWxmLnN0YXRlICE9PSBTQ0hFRFVMRUQpIHJldHVybiBzdG9wKCk7CiAgICAgIGZvciAoaSBpbiBzY2hlZHVsZXMpIHsKICAgICAgICBvID0gc2NoZWR1bGVzW2ldOwogICAgICAgIGlmIChvLm5hbWUgIT09IHNlbGYubmFtZSkgY29udGludWU7CgogICAgICAgIC8vIFdoaWxlIHRoaXMgZWxlbWVudCBhbHJlYWR5IGhhcyBhIHN0YXJ0aW5nIHRyYW5zaXRpb24gZHVyaW5nIHRoaXMgZnJhbWUsCiAgICAgICAgLy8gZGVmZXIgc3RhcnRpbmcgYW4gaW50ZXJydXB0aW5nIHRyYW5zaXRpb24gdW50aWwgdGhhdCB0cmFuc2l0aW9uIGhhcyBhCiAgICAgICAgLy8gY2hhbmNlIHRvIHRpY2sgKGFuZCBwb3NzaWJseSBlbmQpOyBzZWUgZDMvZDMtdHJhbnNpdGlvbiM1NCEKICAgICAgICBpZiAoby5zdGF0ZSA9PT0gU1RBUlRFRCkgcmV0dXJuIHRpbWVvdXQoc3RhcnQpOwoKICAgICAgICAvLyBJbnRlcnJ1cHQgdGhlIGFjdGl2ZSB0cmFuc2l0aW9uLCBpZiBhbnkuCiAgICAgICAgaWYgKG8uc3RhdGUgPT09IFJVTk5JTkcpIHsKICAgICAgICAgIG8uc3RhdGUgPSBFTkRFRDsKICAgICAgICAgIG8udGltZXIuc3RvcCgpOwogICAgICAgICAgby5vbi5jYWxsKCJpbnRlcnJ1cHQiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBvLmluZGV4LCBvLmdyb3VwKTsKICAgICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07CiAgICAgICAgfQoKICAgICAgICAvLyBDYW5jZWwgYW55IHByZS1lbXB0ZWQgdHJhbnNpdGlvbnMuCiAgICAgICAgZWxzZSBpZiAoK2kgPCBpZCkgewogICAgICAgICAgby5zdGF0ZSA9IEVOREVEOwogICAgICAgICAgby50aW1lci5zdG9wKCk7CiAgICAgICAgICBvLm9uLmNhbGwoImNhbmNlbCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIG8uaW5kZXgsIG8uZ3JvdXApOwogICAgICAgICAgZGVsZXRlIHNjaGVkdWxlc1tpXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIERlZmVyIHRoZSBmaXJzdCB0aWNrIHRvIGVuZCBvZiB0aGUgY3VycmVudCBmcmFtZTsgc2VlIGQzL2QzIzE1NzYuCiAgICAgIC8vIE5vdGUgdGhlIHRyYW5zaXRpb24gbWF5IGJlIGNhbmNlbGVkIGFmdGVyIHN0YXJ0IGFuZCBiZWZvcmUgdGhlIGZpcnN0IHRpY2shCiAgICAgIC8vIE5vdGUgdGhpcyBtdXN0IGJlIHNjaGVkdWxlZCBiZWZvcmUgdGhlIHN0YXJ0IGV2ZW50OyBzZWUgZDMvZDMtdHJhbnNpdGlvbiMxNiEKICAgICAgLy8gQXNzdW1pbmcgdGhpcyBpcyBzdWNjZXNzZnVsLCBzdWJzZXF1ZW50IGNhbGxiYWNrcyBnbyBzdHJhaWdodCB0byB0aWNrLgogICAgICB0aW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gU1RBUlRFRCkgewogICAgICAgICAgc2VsZi5zdGF0ZSA9IFJVTk5JTkc7CiAgICAgICAgICBzZWxmLnRpbWVyLnJlc3RhcnQodGljaywgc2VsZi5kZWxheSwgc2VsZi50aW1lKTsKICAgICAgICAgIHRpY2soZWxhcHNlZCk7CiAgICAgICAgfQogICAgICB9KTsKCiAgICAgIC8vIERpc3BhdGNoIHRoZSBzdGFydCBldmVudC4KICAgICAgLy8gTm90ZSB0aGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhlIHR3ZWVuIGFyZSBpbml0aWFsaXplZC4KICAgICAgc2VsZi5zdGF0ZSA9IFNUQVJUSU5HOwogICAgICBzZWxmLm9uLmNhbGwoInN0YXJ0Iiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7CiAgICAgIGlmIChzZWxmLnN0YXRlICE9PSBTVEFSVElORykgcmV0dXJuOyAvLyBpbnRlcnJ1cHRlZAogICAgICBzZWxmLnN0YXRlID0gU1RBUlRFRDsKCiAgICAgIC8vIEluaXRpYWxpemUgdGhlIHR3ZWVuLCBkZWxldGluZyBudWxsIHR3ZWVuLgogICAgICB0d2VlbiA9IG5ldyBBcnJheShuID0gc2VsZi50d2Vlbi5sZW5ndGgpOwogICAgICBmb3IgKGkgPSAwLCBqID0gLTE7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAobyA9IHNlbGYudHdlZW5baV0udmFsdWUuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKSkgewogICAgICAgICAgdHdlZW5bKytqXSA9IG87CiAgICAgICAgfQogICAgICB9CiAgICAgIHR3ZWVuLmxlbmd0aCA9IGogKyAxOwogICAgfQogICAgZnVuY3Rpb24gdGljayhlbGFwc2VkKSB7CiAgICAgIHZhciB0ID0gZWxhcHNlZCA8IHNlbGYuZHVyYXRpb24gPyBzZWxmLmVhc2UuY2FsbChudWxsLCBlbGFwc2VkIC8gc2VsZi5kdXJhdGlvbikgOiAoc2VsZi50aW1lci5yZXN0YXJ0KHN0b3ApLCBzZWxmLnN0YXRlID0gRU5ESU5HLCAxKSwKICAgICAgICBpID0gLTEsCiAgICAgICAgbiA9IHR3ZWVuLmxlbmd0aDsKICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICB0d2VlbltpXS5jYWxsKG5vZGUsIHQpOwogICAgICB9CgogICAgICAvLyBEaXNwYXRjaCB0aGUgZW5kIGV2ZW50LgogICAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gRU5ESU5HKSB7CiAgICAgICAgc2VsZi5vbi5jYWxsKCJlbmQiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKTsKICAgICAgICBzdG9wKCk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHN0b3AoKSB7CiAgICAgIHNlbGYuc3RhdGUgPSBFTkRFRDsKICAgICAgc2VsZi50aW1lci5zdG9wKCk7CiAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaWRdOwogICAgICBmb3IgKHZhciBpIGluIHNjaGVkdWxlcykgcmV0dXJuOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCiAgICAgIGRlbGV0ZSBub2RlLl9fdHJhbnNpdGlvbjsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGludGVycnVwdCAobm9kZSwgbmFtZSkgewogICAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uLAogICAgICBzY2hlZHVsZSwKICAgICAgYWN0aXZlLAogICAgICBlbXB0eSA9IHRydWUsCiAgICAgIGk7CiAgICBpZiAoIXNjaGVkdWxlcykgcmV0dXJuOwogICAgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgIiI7CiAgICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7CiAgICAgIGlmICgoc2NoZWR1bGUgPSBzY2hlZHVsZXNbaV0pLm5hbWUgIT09IG5hbWUpIHsKICAgICAgICBlbXB0eSA9IGZhbHNlOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGFjdGl2ZSA9IHNjaGVkdWxlLnN0YXRlID4gU1RBUlRJTkcgJiYgc2NoZWR1bGUuc3RhdGUgPCBFTkRJTkc7CiAgICAgIHNjaGVkdWxlLnN0YXRlID0gRU5ERUQ7CiAgICAgIHNjaGVkdWxlLnRpbWVyLnN0b3AoKTsKICAgICAgc2NoZWR1bGUub24uY2FsbChhY3RpdmUgPyAiaW50ZXJydXB0IiA6ICJjYW5jZWwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzY2hlZHVsZS5pbmRleCwgc2NoZWR1bGUuZ3JvdXApOwogICAgICBkZWxldGUgc2NoZWR1bGVzW2ldOwogICAgfQogICAgaWYgKGVtcHR5KSBkZWxldGUgbm9kZS5fX3RyYW5zaXRpb247CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25faW50ZXJydXB0IChuYW1lKSB7CiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgaW50ZXJydXB0KHRoaXMsIG5hbWUpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiB0d2VlblJlbW92ZShpZCwgbmFtZSkgewogICAgdmFyIHR3ZWVuMCwgdHdlZW4xOwogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSwKICAgICAgICB0d2VlbiA9IHNjaGVkdWxlLnR3ZWVuOwoKICAgICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCB0d2VlbiB3aXRoIHRoZSBwcmV2aW91cyBub2RlLAogICAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdl4oCZcmUgZG9uZSEKICAgICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLgogICAgICBpZiAodHdlZW4gIT09IHR3ZWVuMCkgewogICAgICAgIHR3ZWVuMSA9IHR3ZWVuMCA9IHR3ZWVuOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHdlZW4xLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKHR3ZWVuMVtpXS5uYW1lID09PSBuYW1lKSB7CiAgICAgICAgICAgIHR3ZWVuMSA9IHR3ZWVuMS5zbGljZSgpOwogICAgICAgICAgICB0d2VlbjEuc3BsaWNlKGksIDEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgc2NoZWR1bGUudHdlZW4gPSB0d2VlbjE7CiAgICB9OwogIH0KICBmdW5jdGlvbiB0d2VlbkZ1bmN0aW9uKGlkLCBuYW1lLCB2YWx1ZSkgewogICAgdmFyIHR3ZWVuMCwgdHdlZW4xOwogICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yKCk7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLAogICAgICAgIHR3ZWVuID0gc2NoZWR1bGUudHdlZW47CgogICAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsCiAgICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCB0d2VlbiBhbmQgd2XigJlyZSBkb25lIQogICAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuCiAgICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7CiAgICAgICAgdHdlZW4xID0gKHR3ZWVuMCA9IHR3ZWVuKS5zbGljZSgpOwogICAgICAgIGZvciAodmFyIHQgPSB7CiAgICAgICAgICAgIG5hbWU6IG5hbWUsCiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZQogICAgICAgICAgfSwgaSA9IDAsIG4gPSB0d2VlbjEubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgICAgdHdlZW4xW2ldID0gdDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChpID09PSBuKSB0d2VlbjEucHVzaCh0KTsKICAgICAgfQogICAgICBzY2hlZHVsZS50d2VlbiA9IHR3ZWVuMTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHRyYW5zaXRpb25fdHdlZW4gKG5hbWUsIHZhbHVlKSB7CiAgICB2YXIgaWQgPSB0aGlzLl9pZDsKICAgIG5hbWUgKz0gIiI7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgICAgdmFyIHR3ZWVuID0gZ2V0KHRoaXMubm9kZSgpLCBpZCkudHdlZW47CiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHdlZW4ubGVuZ3RoLCB0OyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKCh0ID0gdHdlZW5baV0pLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgIHJldHVybiB0LnZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiB0aGlzLmVhY2goKHZhbHVlID09IG51bGwgPyB0d2VlblJlbW92ZSA6IHR3ZWVuRnVuY3Rpb24pKGlkLCBuYW1lLCB2YWx1ZSkpOwogIH0KICBmdW5jdGlvbiB0d2VlblZhbHVlKHRyYW5zaXRpb24sIG5hbWUsIHZhbHVlKSB7CiAgICB2YXIgaWQgPSB0cmFuc2l0aW9uLl9pZDsKICAgIHRyYW5zaXRpb24uZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCk7CiAgICAgIChzY2hlZHVsZS52YWx1ZSB8fCAoc2NoZWR1bGUudmFsdWUgPSB7fSkpW25hbWVdID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH0pOwogICAgcmV0dXJuIGZ1bmN0aW9uIChub2RlKSB7CiAgICAgIHJldHVybiBnZXQobm9kZSwgaWQpLnZhbHVlW25hbWVdOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIGludGVycG9sYXRlIChhLCBiKSB7CiAgICB2YXIgYzsKICAgIHJldHVybiAodHlwZW9mIGIgPT09ICJudW1iZXIiID8gaW50ZXJwb2xhdGVOdW1iZXIgOiBiIGluc3RhbmNlb2YgY29sb3IgPyBpbnRlcnBvbGF0ZVJnYiA6IChjID0gY29sb3IoYikpID8gKGIgPSBjLCBpbnRlcnBvbGF0ZVJnYikgOiBpbnRlcnBvbGF0ZVN0cmluZykoYSwgYik7CiAgfQoKICBmdW5jdGlvbiBhdHRyUmVtb3ZlKG5hbWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gYXR0clJlbW92ZU5TKGZ1bGxuYW1lKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBhdHRyQ29uc3RhbnQobmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkgewogICAgdmFyIHN0cmluZzAwLAogICAgICBzdHJpbmcxID0gdmFsdWUxICsgIiIsCiAgICAgIGludGVycG9sYXRlMDsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7CiAgICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbCA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMoZnVsbG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHsKICAgIHZhciBzdHJpbmcwMCwKICAgICAgc3RyaW5nMSA9IHZhbHVlMSArICIiLAogICAgICBpbnRlcnBvbGF0ZTA7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsKICAgICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBhdHRyRnVuY3Rpb24obmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7CiAgICB2YXIgc3RyaW5nMDAsIHN0cmluZzEwLCBpbnRlcnBvbGF0ZTA7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgc3RyaW5nMCwKICAgICAgICB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSwKICAgICAgICBzdHJpbmcxOwogICAgICBpZiAodmFsdWUxID09IG51bGwpIHJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgICBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7CiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyAiIjsKICAgICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMoZnVsbG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkgewogICAgdmFyIHN0cmluZzAwLCBzdHJpbmcxMCwgaW50ZXJwb2xhdGUwOwogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHN0cmluZzAsCiAgICAgICAgdmFsdWUxID0gdmFsdWUodGhpcyksCiAgICAgICAgc3RyaW5nMTsKICAgICAgaWYgKHZhbHVlMSA9PSBudWxsKSByZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICAgIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyAiIjsKICAgICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gdHJhbnNpdGlvbl9hdHRyIChuYW1lLCB2YWx1ZSkgewogICAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpLAogICAgICBpID0gZnVsbG5hbWUgPT09ICJ0cmFuc2Zvcm0iID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm1TdmcgOiBpbnRlcnBvbGF0ZTsKICAgIHJldHVybiB0aGlzLmF0dHJUd2VlbihuYW1lLCB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyRnVuY3Rpb25OUyA6IGF0dHJGdW5jdGlvbikoZnVsbG5hbWUsIGksIHR3ZWVuVmFsdWUodGhpcywgImF0dHIuIiArIG5hbWUsIHZhbHVlKSkgOiB2YWx1ZSA9PSBudWxsID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0clJlbW92ZU5TIDogYXR0clJlbW92ZSkoZnVsbG5hbWUpIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQpKGZ1bGxuYW1lLCBpLCB2YWx1ZSkpOwogIH0KCiAgZnVuY3Rpb24gYXR0ckludGVycG9sYXRlKG5hbWUsIGkpIHsKICAgIHJldHVybiBmdW5jdGlvbiAodCkgewogICAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCBpLmNhbGwodGhpcywgdCkpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gYXR0ckludGVycG9sYXRlTlMoZnVsbG5hbWUsIGkpIHsKICAgIHJldHVybiBmdW5jdGlvbiAodCkgewogICAgICB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgaS5jYWxsKHRoaXMsIHQpKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGF0dHJUd2Vlbk5TKGZ1bGxuYW1lLCB2YWx1ZSkgewogICAgdmFyIHQwLCBpMDsKICAgIGZ1bmN0aW9uIHR3ZWVuKCkgewogICAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiBhdHRySW50ZXJwb2xhdGVOUyhmdWxsbmFtZSwgaSk7CiAgICAgIHJldHVybiB0MDsKICAgIH0KICAgIHR3ZWVuLl92YWx1ZSA9IHZhbHVlOwogICAgcmV0dXJuIHR3ZWVuOwogIH0KICBmdW5jdGlvbiBhdHRyVHdlZW4obmFtZSwgdmFsdWUpIHsKICAgIHZhciB0MCwgaTA7CiAgICBmdW5jdGlvbiB0d2VlbigpIHsKICAgICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgYXR0ckludGVycG9sYXRlKG5hbWUsIGkpOwogICAgICByZXR1cm4gdDA7CiAgICB9CiAgICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTsKICAgIHJldHVybiB0d2VlbjsKICB9CiAgZnVuY3Rpb24gdHJhbnNpdGlvbl9hdHRyVHdlZW4gKG5hbWUsIHZhbHVlKSB7CiAgICB2YXIga2V5ID0gImF0dHIuIiArIG5hbWU7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlOwogICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgbnVsbCk7CiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3IoKTsKICAgIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTsKICAgIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgKGZ1bGxuYW1lLmxvY2FsID8gYXR0clR3ZWVuTlMgOiBhdHRyVHdlZW4pKGZ1bGxuYW1lLCB2YWx1ZSkpOwogIH0KCiAgZnVuY3Rpb24gZGVsYXlGdW5jdGlvbihpZCwgdmFsdWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIGluaXQodGhpcywgaWQpLmRlbGF5ID0gK3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBkZWxheUNvbnN0YW50KGlkLCB2YWx1ZSkgewogICAgcmV0dXJuIHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbiAoKSB7CiAgICAgIGluaXQodGhpcywgaWQpLmRlbGF5ID0gdmFsdWU7CiAgICB9OwogIH0KICBmdW5jdGlvbiB0cmFuc2l0aW9uX2RlbGF5ICh2YWx1ZSkgewogICAgdmFyIGlkID0gdGhpcy5faWQ7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gZGVsYXlGdW5jdGlvbiA6IGRlbGF5Q29uc3RhbnQpKGlkLCB2YWx1ZSkpIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZGVsYXk7CiAgfQoKICBmdW5jdGlvbiBkdXJhdGlvbkZ1bmN0aW9uKGlkLCB2YWx1ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgc2V0KHRoaXMsIGlkKS5kdXJhdGlvbiA9ICt2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gZHVyYXRpb25Db25zdGFudChpZCwgdmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZSA9ICt2YWx1ZSwgZnVuY3Rpb24gKCkgewogICAgICBzZXQodGhpcywgaWQpLmR1cmF0aW9uID0gdmFsdWU7CiAgICB9OwogIH0KICBmdW5jdGlvbiB0cmFuc2l0aW9uX2R1cmF0aW9uICh2YWx1ZSkgewogICAgdmFyIGlkID0gdGhpcy5faWQ7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gZHVyYXRpb25GdW5jdGlvbiA6IGR1cmF0aW9uQ29uc3RhbnQpKGlkLCB2YWx1ZSkpIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZHVyYXRpb247CiAgfQoKICBmdW5jdGlvbiBlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSB7CiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3IoKTsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHNldCh0aGlzLCBpZCkuZWFzZSA9IHZhbHVlOwogICAgfTsKICB9CiAgZnVuY3Rpb24gdHJhbnNpdGlvbl9lYXNlICh2YWx1ZSkgewogICAgdmFyIGlkID0gdGhpcy5faWQ7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHRoaXMuZWFjaChlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSkgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5lYXNlOwogIH0KCiAgZnVuY3Rpb24gZWFzZVZhcnlpbmcoaWQsIHZhbHVlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIGlmICh0eXBlb2YgdiAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yKCk7CiAgICAgIHNldCh0aGlzLCBpZCkuZWFzZSA9IHY7CiAgICB9OwogIH0KICBmdW5jdGlvbiB0cmFuc2l0aW9uX2Vhc2VWYXJ5aW5nICh2YWx1ZSkgewogICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yKCk7CiAgICByZXR1cm4gdGhpcy5lYWNoKGVhc2VWYXJ5aW5nKHRoaXMuX2lkLCB2YWx1ZSkpOwogIH0KCiAgZnVuY3Rpb24gdHJhbnNpdGlvbl9maWx0ZXIgKG1hdGNoKSB7CiAgICBpZiAodHlwZW9mIG1hdGNoICE9PSAiZnVuY3Rpb24iKSBtYXRjaCA9IG1hdGNoZXIobWF0Y2gpOwogICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgbWF0Y2guY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpIHsKICAgICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCB0aGlzLl9uYW1lLCB0aGlzLl9pZCk7CiAgfQoKICBmdW5jdGlvbiB0cmFuc2l0aW9uX21lcmdlICh0cmFuc2l0aW9uKSB7CiAgICBpZiAodHJhbnNpdGlvbi5faWQgIT09IHRoaXMuX2lkKSB0aHJvdyBuZXcgRXJyb3IoKTsKICAgIGZvciAodmFyIGdyb3VwczAgPSB0aGlzLl9ncm91cHMsIGdyb3VwczEgPSB0cmFuc2l0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cDBbaV0gfHwgZ3JvdXAxW2ldKSB7CiAgICAgICAgICBtZXJnZVtpXSA9IG5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmb3IgKDsgaiA8IG0wOyArK2opIHsKICAgICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTsKICAgIH0KICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbihtZXJnZXMsIHRoaXMuX3BhcmVudHMsIHRoaXMuX25hbWUsIHRoaXMuX2lkKTsKICB9CgogIGZ1bmN0aW9uIHN0YXJ0KG5hbWUpIHsKICAgIHJldHVybiAobmFtZSArICIiKS50cmltKCkuc3BsaXQoL158XHMrLykuZXZlcnkoZnVuY3Rpb24gKHQpIHsKICAgICAgdmFyIGkgPSB0LmluZGV4T2YoIi4iKTsKICAgICAgaWYgKGkgPj0gMCkgdCA9IHQuc2xpY2UoMCwgaSk7CiAgICAgIHJldHVybiAhdCB8fCB0ID09PSAic3RhcnQiOwogICAgfSk7CiAgfQogIGZ1bmN0aW9uIG9uRnVuY3Rpb24oaWQsIG5hbWUsIGxpc3RlbmVyKSB7CiAgICB2YXIgb24wLAogICAgICBvbjEsCiAgICAgIHNpdCA9IHN0YXJ0KG5hbWUpID8gaW5pdCA6IHNldDsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBzY2hlZHVsZSA9IHNpdCh0aGlzLCBpZCksCiAgICAgICAgb24gPSBzY2hlZHVsZS5vbjsKCiAgICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgYSBkaXNwYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBub2RlLAogICAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSEKICAgICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLgogICAgICBpZiAob24gIT09IG9uMCkgKG9uMSA9IChvbjAgPSBvbikuY29weSgpKS5vbihuYW1lLCBsaXN0ZW5lcik7CiAgICAgIHNjaGVkdWxlLm9uID0gb24xOwogICAgfTsKICB9CiAgZnVuY3Rpb24gdHJhbnNpdGlvbl9vbiAobmFtZSwgbGlzdGVuZXIpIHsKICAgIHZhciBpZCA9IHRoaXMuX2lkOwogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyID8gZ2V0KHRoaXMubm9kZSgpLCBpZCkub24ub24obmFtZSkgOiB0aGlzLmVhY2gob25GdW5jdGlvbihpZCwgbmFtZSwgbGlzdGVuZXIpKTsKICB9CgogIGZ1bmN0aW9uIHJlbW92ZUZ1bmN0aW9uKGlkKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwogICAgICBmb3IgKHZhciBpIGluIHRoaXMuX190cmFuc2l0aW9uKSBpZiAoK2kgIT09IGlkKSByZXR1cm47CiAgICAgIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHRyYW5zaXRpb25fcmVtb3ZlICgpIHsKICAgIHJldHVybiB0aGlzLm9uKCJlbmQucmVtb3ZlIiwgcmVtb3ZlRnVuY3Rpb24odGhpcy5faWQpKTsKICB9CgogIGZ1bmN0aW9uIHRyYW5zaXRpb25fc2VsZWN0IChzZWxlY3QpIHsKICAgIHZhciBuYW1lID0gdGhpcy5fbmFtZSwKICAgICAgaWQgPSB0aGlzLl9pZDsKICAgIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSAiZnVuY3Rpb24iKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpOwogICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkgewogICAgICAgICAgaWYgKCJfX2RhdGFfXyIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187CiAgICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7CiAgICAgICAgICBzY2hlZHVsZShzdWJncm91cFtpXSwgbmFtZSwgaWQsIGksIHN1Ymdyb3VwLCBnZXQobm9kZSwgaWQpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTsKICB9CgogIGZ1bmN0aW9uIHRyYW5zaXRpb25fc2VsZWN0QWxsIChzZWxlY3QpIHsKICAgIHZhciBuYW1lID0gdGhpcy5fbmFtZSwKICAgICAgaWQgPSB0aGlzLl9pZDsKICAgIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSAiZnVuY3Rpb24iKSBzZWxlY3QgPSBzZWxlY3RvckFsbChzZWxlY3QpOwogICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gW10sIHBhcmVudHMgPSBbXSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgICAgZm9yICh2YXIgY2hpbGRyZW4gPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCksIGNoaWxkLCBpbmhlcml0ID0gZ2V0KG5vZGUsIGlkKSwgayA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGsgPCBsOyArK2spIHsKICAgICAgICAgICAgaWYgKGNoaWxkID0gY2hpbGRyZW5ba10pIHsKICAgICAgICAgICAgICBzY2hlZHVsZShjaGlsZCwgbmFtZSwgaWQsIGssIGNoaWxkcmVuLCBpbmhlcml0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgc3ViZ3JvdXBzLnB1c2goY2hpbGRyZW4pOwogICAgICAgICAgcGFyZW50cy5wdXNoKG5vZGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgcGFyZW50cywgbmFtZSwgaWQpOwogIH0KCiAgdmFyIFNlbGVjdGlvbiA9IHNlbGVjdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3I7CiAgZnVuY3Rpb24gdHJhbnNpdGlvbl9zZWxlY3Rpb24gKCkgewogICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTsKICB9CgogIGZ1bmN0aW9uIHN0eWxlTnVsbChuYW1lLCBpbnRlcnBvbGF0ZSkgewogICAgdmFyIHN0cmluZzAwLCBzdHJpbmcxMCwgaW50ZXJwb2xhdGUwOwogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHN0cmluZzAgPSBzdHlsZVZhbHVlKHRoaXMsIG5hbWUpLAogICAgICAgIHN0cmluZzEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGVWYWx1ZSh0aGlzLCBuYW1lKSk7CiAgICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbCA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCBzdHJpbmcxMCA9IHN0cmluZzEpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gc3R5bGVSZW1vdmUobmFtZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQobmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkgewogICAgdmFyIHN0cmluZzAwLAogICAgICBzdHJpbmcxID0gdmFsdWUxICsgIiIsCiAgICAgIGludGVycG9sYXRlMDsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBzdHJpbmcwID0gc3R5bGVWYWx1ZSh0aGlzLCBuYW1lKTsKICAgICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzdHlsZUZ1bmN0aW9uKG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkgewogICAgdmFyIHN0cmluZzAwLCBzdHJpbmcxMCwgaW50ZXJwb2xhdGUwOwogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHN0cmluZzAgPSBzdHlsZVZhbHVlKHRoaXMsIG5hbWUpLAogICAgICAgIHZhbHVlMSA9IHZhbHVlKHRoaXMpLAogICAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyAiIjsKICAgICAgaWYgKHZhbHVlMSA9PSBudWxsKSBzdHJpbmcxID0gdmFsdWUxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlVmFsdWUodGhpcywgbmFtZSkpOwogICAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGwgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMCA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzdHlsZU1heWJlUmVtb3ZlKGlkLCBuYW1lKSB7CiAgICB2YXIgb24wLAogICAgICBvbjEsCiAgICAgIGxpc3RlbmVyMCwKICAgICAga2V5ID0gInN0eWxlLiIgKyBuYW1lLAogICAgICBldmVudCA9ICJlbmQuIiArIGtleSwKICAgICAgcmVtb3ZlOwogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSwKICAgICAgICBvbiA9IHNjaGVkdWxlLm9uLAogICAgICAgIGxpc3RlbmVyID0gc2NoZWR1bGUudmFsdWVba2V5XSA9PSBudWxsID8gcmVtb3ZlIHx8IChyZW1vdmUgPSBzdHlsZVJlbW92ZShuYW1lKSkgOiB1bmRlZmluZWQ7CgogICAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSwKICAgICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhCiAgICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS4KICAgICAgaWYgKG9uICE9PSBvbjAgfHwgbGlzdGVuZXIwICE9PSBsaXN0ZW5lcikgKG9uMSA9IChvbjAgPSBvbikuY29weSgpKS5vbihldmVudCwgbGlzdGVuZXIwID0gbGlzdGVuZXIpOwogICAgICBzY2hlZHVsZS5vbiA9IG9uMTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHRyYW5zaXRpb25fc3R5bGUgKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgewogICAgdmFyIGkgPSAobmFtZSArPSAiIikgPT09ICJ0cmFuc2Zvcm0iID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MgOiBpbnRlcnBvbGF0ZTsKICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gdGhpcy5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlTnVsbChuYW1lLCBpKSkub24oImVuZC5zdHlsZS4iICsgbmFtZSwgc3R5bGVSZW1vdmUobmFtZSkpIDogdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gdGhpcy5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlRnVuY3Rpb24obmFtZSwgaSwgdHdlZW5WYWx1ZSh0aGlzLCAic3R5bGUuIiArIG5hbWUsIHZhbHVlKSkpLmVhY2goc3R5bGVNYXliZVJlbW92ZSh0aGlzLl9pZCwgbmFtZSkpIDogdGhpcy5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlQ29uc3RhbnQobmFtZSwgaSwgdmFsdWUpLCBwcmlvcml0eSkub24oImVuZC5zdHlsZS4iICsgbmFtZSwgbnVsbCk7CiAgfQoKICBmdW5jdGlvbiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKHQpIHsKICAgICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCBpLmNhbGwodGhpcywgdCksIHByaW9yaXR5KTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHN0eWxlVHdlZW4obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgICB2YXIgdCwgaTA7CiAgICBmdW5jdGlvbiB0d2VlbigpIHsKICAgICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICBpZiAoaSAhPT0gaTApIHQgPSAoaTAgPSBpKSAmJiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KTsKICAgICAgcmV0dXJuIHQ7CiAgICB9CiAgICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTsKICAgIHJldHVybiB0d2VlbjsKICB9CiAgZnVuY3Rpb24gdHJhbnNpdGlvbl9zdHlsZVR3ZWVuIChuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsKICAgIHZhciBrZXkgPSAic3R5bGUuIiArIChuYW1lICs9ICIiKTsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7CiAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTsKICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBFcnJvcigpOwogICAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBzdHlsZVR3ZWVuKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gIiIgOiBwcmlvcml0eSkpOwogIH0KCiAgZnVuY3Rpb24gdGV4dENvbnN0YW50KHZhbHVlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7CiAgICB9OwogIH0KICBmdW5jdGlvbiB0ZXh0RnVuY3Rpb24odmFsdWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciB2YWx1ZTEgPSB2YWx1ZSh0aGlzKTsKICAgICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlMSA9PSBudWxsID8gIiIgOiB2YWx1ZTE7CiAgICB9OwogIH0KICBmdW5jdGlvbiB0cmFuc2l0aW9uX3RleHQgKHZhbHVlKSB7CiAgICByZXR1cm4gdGhpcy50d2VlbigidGV4dCIsIHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIiA/IHRleHRGdW5jdGlvbih0d2VlblZhbHVlKHRoaXMsICJ0ZXh0IiwgdmFsdWUpKSA6IHRleHRDb25zdGFudCh2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZSArICIiKSk7CiAgfQoKICBmdW5jdGlvbiB0ZXh0SW50ZXJwb2xhdGUoaSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgIHRoaXMudGV4dENvbnRlbnQgPSBpLmNhbGwodGhpcywgdCk7CiAgICB9OwogIH0KICBmdW5jdGlvbiB0ZXh0VHdlZW4odmFsdWUpIHsKICAgIHZhciB0MCwgaTA7CiAgICBmdW5jdGlvbiB0d2VlbigpIHsKICAgICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgdGV4dEludGVycG9sYXRlKGkpOwogICAgICByZXR1cm4gdDA7CiAgICB9CiAgICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTsKICAgIHJldHVybiB0d2VlbjsKICB9CiAgZnVuY3Rpb24gdHJhbnNpdGlvbl90ZXh0VHdlZW4gKHZhbHVlKSB7CiAgICB2YXIga2V5ID0gInRleHQiOwogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTsKICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpOwogICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yKCk7CiAgICByZXR1cm4gdGhpcy50d2VlbihrZXksIHRleHRUd2Vlbih2YWx1ZSkpOwogIH0KCiAgZnVuY3Rpb24gdHJhbnNpdGlvbl90cmFuc2l0aW9uICgpIHsKICAgIHZhciBuYW1lID0gdGhpcy5fbmFtZSwKICAgICAgaWQwID0gdGhpcy5faWQsCiAgICAgIGlkMSA9IG5ld0lkKCk7CiAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICB2YXIgaW5oZXJpdCA9IGdldChub2RlLCBpZDApOwogICAgICAgICAgc2NoZWR1bGUobm9kZSwgbmFtZSwgaWQxLCBpLCBncm91cCwgewogICAgICAgICAgICB0aW1lOiBpbmhlcml0LnRpbWUgKyBpbmhlcml0LmRlbGF5ICsgaW5oZXJpdC5kdXJhdGlvbiwKICAgICAgICAgICAgZGVsYXk6IDAsCiAgICAgICAgICAgIGR1cmF0aW9uOiBpbmhlcml0LmR1cmF0aW9uLAogICAgICAgICAgICBlYXNlOiBpbmhlcml0LmVhc2UKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKGdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQxKTsKICB9CgogIGZ1bmN0aW9uIHRyYW5zaXRpb25fZW5kICgpIHsKICAgIHZhciBvbjAsCiAgICAgIG9uMSwKICAgICAgdGhhdCA9IHRoaXMsCiAgICAgIGlkID0gdGhhdC5faWQsCiAgICAgIHNpemUgPSB0aGF0LnNpemUoKTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHZhciBjYW5jZWwgPSB7CiAgICAgICAgICB2YWx1ZTogcmVqZWN0CiAgICAgICAgfSwKICAgICAgICBlbmQgPSB7CiAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoLS1zaXplID09PSAwKSByZXNvbHZlKCk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgdGhhdC5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLAogICAgICAgICAgb24gPSBzY2hlZHVsZS5vbjsKCiAgICAgICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsCiAgICAgICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhCiAgICAgICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLgogICAgICAgIGlmIChvbiAhPT0gb24wKSB7CiAgICAgICAgICBvbjEgPSAob24wID0gb24pLmNvcHkoKTsKICAgICAgICAgIG9uMS5fLmNhbmNlbC5wdXNoKGNhbmNlbCk7CiAgICAgICAgICBvbjEuXy5pbnRlcnJ1cHQucHVzaChjYW5jZWwpOwogICAgICAgICAgb24xLl8uZW5kLnB1c2goZW5kKTsKICAgICAgICB9CiAgICAgICAgc2NoZWR1bGUub24gPSBvbjE7CiAgICAgIH0pOwoKICAgICAgLy8gVGhlIHNlbGVjdGlvbiB3YXMgZW1wdHksIHJlc29sdmUgZW5kIGltbWVkaWF0ZWx5CiAgICAgIGlmIChzaXplID09PSAwKSByZXNvbHZlKCk7CiAgICB9KTsKICB9CgogIHZhciBpZCA9IDA7CiAgZnVuY3Rpb24gVHJhbnNpdGlvbihncm91cHMsIHBhcmVudHMsIG5hbWUsIGlkKSB7CiAgICB0aGlzLl9ncm91cHMgPSBncm91cHM7CiAgICB0aGlzLl9wYXJlbnRzID0gcGFyZW50czsKICAgIHRoaXMuX25hbWUgPSBuYW1lOwogICAgdGhpcy5faWQgPSBpZDsKICB9CiAgZnVuY3Rpb24gbmV3SWQoKSB7CiAgICByZXR1cm4gKytpZDsKICB9CiAgdmFyIHNlbGVjdGlvbl9wcm90b3R5cGUgPSBzZWxlY3Rpb24ucHJvdG90eXBlOwogIFRyYW5zaXRpb24ucHJvdG90eXBlID0gewogICAgY29uc3RydWN0b3I6IFRyYW5zaXRpb24sCiAgICBzZWxlY3Q6IHRyYW5zaXRpb25fc2VsZWN0LAogICAgc2VsZWN0QWxsOiB0cmFuc2l0aW9uX3NlbGVjdEFsbCwKICAgIHNlbGVjdENoaWxkOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNlbGVjdENoaWxkLAogICAgc2VsZWN0Q2hpbGRyZW46IHNlbGVjdGlvbl9wcm90b3R5cGUuc2VsZWN0Q2hpbGRyZW4sCiAgICBmaWx0ZXI6IHRyYW5zaXRpb25fZmlsdGVyLAogICAgbWVyZ2U6IHRyYW5zaXRpb25fbWVyZ2UsCiAgICBzZWxlY3Rpb246IHRyYW5zaXRpb25fc2VsZWN0aW9uLAogICAgdHJhbnNpdGlvbjogdHJhbnNpdGlvbl90cmFuc2l0aW9uLAogICAgY2FsbDogc2VsZWN0aW9uX3Byb3RvdHlwZS5jYWxsLAogICAgbm9kZXM6IHNlbGVjdGlvbl9wcm90b3R5cGUubm9kZXMsCiAgICBub2RlOiBzZWxlY3Rpb25fcHJvdG90eXBlLm5vZGUsCiAgICBzaXplOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNpemUsCiAgICBlbXB0eTogc2VsZWN0aW9uX3Byb3RvdHlwZS5lbXB0eSwKICAgIGVhY2g6IHNlbGVjdGlvbl9wcm90b3R5cGUuZWFjaCwKICAgIG9uOiB0cmFuc2l0aW9uX29uLAogICAgYXR0cjogdHJhbnNpdGlvbl9hdHRyLAogICAgYXR0clR3ZWVuOiB0cmFuc2l0aW9uX2F0dHJUd2VlbiwKICAgIHN0eWxlOiB0cmFuc2l0aW9uX3N0eWxlLAogICAgc3R5bGVUd2VlbjogdHJhbnNpdGlvbl9zdHlsZVR3ZWVuLAogICAgdGV4dDogdHJhbnNpdGlvbl90ZXh0LAogICAgdGV4dFR3ZWVuOiB0cmFuc2l0aW9uX3RleHRUd2VlbiwKICAgIHJlbW92ZTogdHJhbnNpdGlvbl9yZW1vdmUsCiAgICB0d2VlbjogdHJhbnNpdGlvbl90d2VlbiwKICAgIGRlbGF5OiB0cmFuc2l0aW9uX2RlbGF5LAogICAgZHVyYXRpb246IHRyYW5zaXRpb25fZHVyYXRpb24sCiAgICBlYXNlOiB0cmFuc2l0aW9uX2Vhc2UsCiAgICBlYXNlVmFyeWluZzogdHJhbnNpdGlvbl9lYXNlVmFyeWluZywKICAgIGVuZDogdHJhbnNpdGlvbl9lbmQsCiAgICBbU3ltYm9sLml0ZXJhdG9yXTogc2VsZWN0aW9uX3Byb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdCiAgfTsKCiAgZnVuY3Rpb24gY3ViaWNJbk91dCh0KSB7CiAgICByZXR1cm4gKCh0ICo9IDIpIDw9IDEgPyB0ICogdCAqIHQgOiAodCAtPSAyKSAqIHQgKiB0ICsgMikgLyAyOwogIH0KCiAgdmFyIGRlZmF1bHRUaW1pbmcgPSB7CiAgICB0aW1lOiBudWxsLAogICAgLy8gU2V0IG9uIHVzZS4KICAgIGRlbGF5OiAwLAogICAgZHVyYXRpb246IDI1MCwKICAgIGVhc2U6IGN1YmljSW5PdXQKICB9OwogIGZ1bmN0aW9uIGluaGVyaXQobm9kZSwgaWQpIHsKICAgIHZhciB0aW1pbmc7CiAgICB3aGlsZSAoISh0aW1pbmcgPSBub2RlLl9fdHJhbnNpdGlvbikgfHwgISh0aW1pbmcgPSB0aW1pbmdbaWRdKSkgewogICAgICBpZiAoIShub2RlID0gbm9kZS5wYXJlbnROb2RlKSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgdHJhbnNpdGlvbiAke2lkfSBub3QgZm91bmRgKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRpbWluZzsKICB9CiAgZnVuY3Rpb24gc2VsZWN0aW9uX3RyYW5zaXRpb24gKG5hbWUpIHsKICAgIHZhciBpZCwgdGltaW5nOwogICAgaWYgKG5hbWUgaW5zdGFuY2VvZiBUcmFuc2l0aW9uKSB7CiAgICAgIGlkID0gbmFtZS5faWQsIG5hbWUgPSBuYW1lLl9uYW1lOwogICAgfSBlbHNlIHsKICAgICAgaWQgPSBuZXdJZCgpLCAodGltaW5nID0gZGVmYXVsdFRpbWluZykudGltZSA9IG5vdygpLCBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyAiIjsKICAgIH0KICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkLCBpLCBncm91cCwgdGltaW5nIHx8IGluaGVyaXQobm9kZSwgaWQpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbihncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTsKICB9CgogIHNlbGVjdGlvbi5wcm90b3R5cGUuaW50ZXJydXB0ID0gc2VsZWN0aW9uX2ludGVycnVwdDsKICBzZWxlY3Rpb24ucHJvdG90eXBlLnRyYW5zaXRpb24gPSBzZWxlY3Rpb25fdHJhbnNpdGlvbjsKCiAgZnVuY3Rpb24gVHJhbnNmb3JtKGssIHgsIHkpIHsKICAgIHRoaXMuayA9IGs7CiAgICB0aGlzLnggPSB4OwogICAgdGhpcy55ID0geTsKICB9CiAgVHJhbnNmb3JtLnByb3RvdHlwZSA9IHsKICAgIGNvbnN0cnVjdG9yOiBUcmFuc2Zvcm0sCiAgICBzY2FsZTogZnVuY3Rpb24gKGspIHsKICAgICAgcmV0dXJuIGsgPT09IDEgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmsgKiBrLCB0aGlzLngsIHRoaXMueSk7CiAgICB9LAogICAgdHJhbnNsYXRlOiBmdW5jdGlvbiAoeCwgeSkgewogICAgICByZXR1cm4geCA9PT0gMCAmIHkgPT09IDAgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmssIHRoaXMueCArIHRoaXMuayAqIHgsIHRoaXMueSArIHRoaXMuayAqIHkpOwogICAgfSwKICAgIGFwcGx5OiBmdW5jdGlvbiAocG9pbnQpIHsKICAgICAgcmV0dXJuIFtwb2ludFswXSAqIHRoaXMuayArIHRoaXMueCwgcG9pbnRbMV0gKiB0aGlzLmsgKyB0aGlzLnldOwogICAgfSwKICAgIGFwcGx5WDogZnVuY3Rpb24gKHgpIHsKICAgICAgcmV0dXJuIHggKiB0aGlzLmsgKyB0aGlzLng7CiAgICB9LAogICAgYXBwbHlZOiBmdW5jdGlvbiAoeSkgewogICAgICByZXR1cm4geSAqIHRoaXMuayArIHRoaXMueTsKICAgIH0sCiAgICBpbnZlcnQ6IGZ1bmN0aW9uIChsb2NhdGlvbikgewogICAgICByZXR1cm4gWyhsb2NhdGlvblswXSAtIHRoaXMueCkgLyB0aGlzLmssIChsb2NhdGlvblsxXSAtIHRoaXMueSkgLyB0aGlzLmtdOwogICAgfSwKICAgIGludmVydFg6IGZ1bmN0aW9uICh4KSB7CiAgICAgIHJldHVybiAoeCAtIHRoaXMueCkgLyB0aGlzLms7CiAgICB9LAogICAgaW52ZXJ0WTogZnVuY3Rpb24gKHkpIHsKICAgICAgcmV0dXJuICh5IC0gdGhpcy55KSAvIHRoaXMuazsKICAgIH0sCiAgICByZXNjYWxlWDogZnVuY3Rpb24gKHgpIHsKICAgICAgcmV0dXJuIHguY29weSgpLmRvbWFpbih4LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCwgdGhpcykubWFwKHguaW52ZXJ0LCB4KSk7CiAgICB9LAogICAgcmVzY2FsZVk6IGZ1bmN0aW9uICh5KSB7CiAgICAgIHJldHVybiB5LmNvcHkoKS5kb21haW4oeS5yYW5nZSgpLm1hcCh0aGlzLmludmVydFksIHRoaXMpLm1hcCh5LmludmVydCwgeSkpOwogICAgfSwKICAgIHRvU3RyaW5nOiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiAidHJhbnNsYXRlKCIgKyB0aGlzLnggKyAiLCIgKyB0aGlzLnkgKyAiKSBzY2FsZSgiICsgdGhpcy5rICsgIikiOwogICAgfQogIH07CiAgVHJhbnNmb3JtLnByb3RvdHlwZTsKCiAgLyoKICAgIEhURE1hdGggU3RhdGljIENsYXNzIC0gTm90IGludGVuZGVkIGZvciBpbnN0YW50aWF0aW9uIQoKICAgIE1vZGVsIHBhcmFtZXRlcnM6CiAgICAgIGsgPSBkaXNjb3VudCBmYWN0b3IgKDAsIEluZmluaXR5KQoKICAgIEJlaGF2aW9yYWwgdmFyaWFibGVzOgogICAgICBBID0gYW1vdW50CiAgICAgIEQgPSBkZWxheQogICAgICBWID0gc3ViamVjdGl2ZSB2YWx1ZQoKICAgIEVxdWF0aW9uczoKICAgICAgViA9IEEgLyAoMSArIGtEKQogICAgICBrID0gKEEgLSBWKSAvIChWRCkKICAqLwogIGNsYXNzIEhURE1hdGggewogICAgc3RhdGljIGsgPSB7CiAgICAgIERFRkFVTFQ6IDAuMDUsCiAgICAgIE1JTjogMCwKICAgICAgTUFYOiAxMDAsCiAgICAgIFNURVA6IDAuMDAxLAogICAgICBKVU1QOiAwLjAxCiAgICB9OwogICAgc3RhdGljIGFkazJ2KGEsIGQsIGspIHsKICAgICAgcmV0dXJuIGEgLyAoMSArIGsgKiBkKTsKICAgIH0KICAgIHN0YXRpYyBhZHYyayhhLCBkLCB2KSB7CiAgICAgIHJldHVybiAoYSAtIHYpIC8gKHYgKiBkKTsKICAgIH0KICB9CgogIC8vIEludGVybmFsIGRlcGVuZGVuY2llcwoKICAvKiBlc2xpbnQgbm8tcmVzdHJpY3RlZC1nbG9iYWxzOiBbIm9mZiIsICJzZWxmIl0gKi8KCiAgc2VsZi5vbm1lc3NhZ2UgPSBldmVudCA9PiB7CiAgICBjb25zdCBwYXJhbXMgPSB7CiAgICAgIGs6IHsKICAgICAgICB0eXBlOiAncmVhbCcsCiAgICAgICAgbG93ZXI6IEhURE1hdGguay5NSU4sCiAgICAgICAgdXBwZXI6IEhURE1hdGguay5NQVgKICAgICAgfSwKICAgICAgbHVjZTogewogICAgICAgIHR5cGU6ICdyZWFsJywKICAgICAgICBsb3dlcjogMCwKICAgICAgICB1cHBlcjogMTAwCiAgICAgIH0KICAgIH07CiAgICBjb25zdCBsb2dQb3N0ID0gKHN0YXRlLCBkYXRhKSA9PiB7CiAgICAgIGxldCBscCA9IDA7CgogICAgICAvLyBQcmlvcnMKICAgICAgY29uc3Qga01lYW4gPSAyOwogICAgICBjb25zdCBrU2hhcGUgPSAzOwogICAgICBscCArPSBkaXN0cmlidXRpb25zRXhwb3J0cy5nYW1tYShzdGF0ZS5rLCBrU2hhcGUsIGtTaGFwZSAvIGtNZWFuKTsKICAgICAgLy8gbHAgKz0gQmF5ZXNEaXN0cmlidXRpb25zLnVuaWYoc3RhdGUuaywgMCwgMTAwKTsKCiAgICAgIGNvbnN0IGx1Y2VNZWFuID0gMjsKICAgICAgY29uc3QgbHVjZVNoYXBlID0gMzsKICAgICAgbHAgKz0gZGlzdHJpYnV0aW9uc0V4cG9ydHMuZ2FtbWEoc3RhdGUubHVjZSwgbHVjZVNoYXBlLCBsdWNlU2hhcGUgLyBsdWNlTWVhbik7CiAgICAgIC8vIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy51bmlmKHN0YXRlLmx1Y2UsIDAsIDEwMCk7CgogICAgICAvLyBMaWtlbGlob29kCiAgICAgIGRhdGEuZm9yRWFjaChjaG9pY2UgPT4gewogICAgICAgIC8vIFZhbHVlcwogICAgICAgIGNvbnN0IHZzID0gSFRETWF0aC5hZGsydihjaG9pY2UuYXMsIGNob2ljZS5kcywgc3RhdGUuayk7CiAgICAgICAgY29uc3QgdmwgPSBIVERNYXRoLmFkazJ2KGNob2ljZS5hbCwgY2hvaWNlLmRsLCBzdGF0ZS5rKTsKCiAgICAgICAgLy8gQ2hvaWNlIG9mIHNvb25lciBvciBsYXRlciBpcyBzYW1wbGVkIGZyb20gYSBCZXJub3VsbGkgZGlzdHJpYnV0aW9uCiAgICAgICAgLy8gTHVjZSBjaG9pY2UgcnVsZSBpcyB1c2VkIHRvIGNvbXB1dGUgcHJvYmFiaWxpdHkgb2Ygd2FpdGluZyEgKDAgPSBzb29uZXIsIDEgPSBsYXRlcikKICAgICAgICBjb25zdCBiaW52YWwgPSAxIC8gKDEgKyBNYXRoLmV4cChzdGF0ZS5sdWNlICogKHZzIC0gdmwpKSk7CgogICAgICAgIC8vIEFjdHVhbCByZXNwb25zZQogICAgICAgIGNvbnN0IHJlc3BvbnNlID0gY2hvaWNlLnJlc3BvbnNlID09PSAnZmlyc3QnID8gMCA6IDE7CiAgICAgICAgbHAgKz0gZGlzdHJpYnV0aW9uc0V4cG9ydHMuYmVybihyZXNwb25zZSwgYmludmFsKTsKICAgICAgfSk7CiAgICAgIHJldHVybiBscDsKICAgIH07CgogICAgLy8gSW5pdGlhbGl6aW5nIHRoZSBzYW1wbGVyCiAgICBjb25zdCBzYW1wbGVyID0gbmV3IG1jbWNFeHBvcnRzLkFtd2dTYW1wbGVyKHBhcmFtcywgbG9nUG9zdCwgZXZlbnQuZGF0YSk7CiAgICAvLyBCdXJuaW5nIHNvbWUgc2FtcGxlcyB0byB0aGUgTUNNQyBnb2RzIGFuZCBzYW1wbGluZyA1MDAwIGRyYXdzCiAgICBzYW1wbGVyLmJ1cm4oMTAwMCk7CiAgICBjb25zdCBzYW1wbGVzID0gc2FtcGxlci5zYW1wbGUoNTAwMCk7CgogICAgLy8gRXh0cmFjdCBzdW1tYXJ5IHN0YXRzCiAgICBjb25zdCByZXN1bHRzID0gewogICAgICBrOiBtZWRpYW4oc2FtcGxlcy5rKSwKICAgICAgbHVjZTogbWVkaWFuKHNhbXBsZXMubHVjZSkKICAgIH07CiAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgcmVzdWx0czogcmVzdWx0cywKICAgICAgc2FtcGxlczogc2FtcGxlcwogICAgfSk7CiAgfTsKCn0pKCk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWh0ZC1maXQtd29ya2VyLmpzLm1hcAoK","data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRkLWZpdC13b3JrZXIuanMiLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9iYXllcy5qcy9kaXN0cmlidXRpb25zLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2JheWVzLmpzL21jbWMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2FzY2VuZGluZy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbnVtYmVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9zb3J0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9tYXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL21pbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvcXVpY2tzZWxlY3QuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3F1YW50aWxlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9tZWRpYW4uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtZGlzcGF0Y2gvc3JjL2Rpc3BhdGNoLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvbmFtZXNwYWNlcy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL25hbWVzcGFjZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL2NyZWF0b3IuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rvci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3QuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9hcnJheS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdG9yQWxsLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdEFsbC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL21hdGNoZXIuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0Q2hpbGQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0Q2hpbGRyZW4uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZmlsdGVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NwYXJzZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9lbnRlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL2NvbnN0YW50LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2RhdGEuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZXhpdC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9qb2luLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL21lcmdlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL29yZGVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NvcnQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vY2FsbC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9ub2Rlcy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9ub2RlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NpemUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZW1wdHkuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZWFjaC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9hdHRyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvd2luZG93LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3N0eWxlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3Byb3BlcnR5LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2NsYXNzZWQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vdGV4dC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9odG1sLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3JhaXNlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2xvd2VyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2FwcGVuZC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pbnNlcnQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vcmVtb3ZlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2Nsb25lLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2RhdHVtLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL29uLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2Rpc3BhdGNoLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2l0ZXJhdG9yLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9kZWZpbmUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtY29sb3Ivc3JjL2NvbG9yLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9jb25zdGFudC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvY29sb3IuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3JnYi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvbnVtYmVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9zdHJpbmcuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3RyYW5zZm9ybS9kZWNvbXBvc2UuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3RyYW5zZm9ybS9wYXJzZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRpbWVyL3NyYy90aW1lci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10aW1lci9zcmMvdGltZW91dC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NjaGVkdWxlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL2ludGVycnVwdC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9zZWxlY3Rpb24vaW50ZXJydXB0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdHdlZW4uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9pbnRlcnBvbGF0ZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2F0dHIuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9hdHRyVHdlZW4uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9kZWxheS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2R1cmF0aW9uLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZWFzZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2Vhc2VWYXJ5aW5nLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZmlsdGVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vbWVyZ2UuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9vbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3JlbW92ZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdEFsbC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdGlvbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3N0eWxlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc3R5bGVUd2Vlbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3RleHQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90ZXh0VHdlZW4uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90cmFuc2l0aW9uLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZW5kLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vaW5kZXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtZWFzZS9zcmMvY3ViaWMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL3RyYW5zaXRpb24uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL3RyYW5zZm9ybS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9AZGVjaWRhYmxlcy9kaXNjb3VudGFibGUtbWF0aC9zcmMvaHRkLW1hdGguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvQGRlY2lkYWJsZXMvZGlzY291bnRhYmxlLW1hdGgvc3JjL2luZGV4LmpzIiwic3JjL2NvbXBvbmVudHMvaHRkLWZpdC13b3JrZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cblxuLy8gQSBudW1iZXIgb2YgbG9nIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb25zIChQREYpLiBOYW1pbmcgYW5kIHBhcmFtZXRlcml6YXRpb25cbi8vIHNob3VsZCBtYXRjaCBSJ3MsIGV4Y2VwdCBmb3IgdGhhdCBhbGwgZnVuY3Rpb25zIHJlc2lkZSBpbiBhbiBsZCBvYmplY3QgKFxuLy8gYXMgaW4gXCJsb2cgZGVuc2l0eVwiKSwgc28gdG8gZ2V0IGEgbm9ybWFsIGxvZyBkZW5zaXR5IHlvdSB3b3VsZCB3cml0ZVxuLy8gbGQubm9ybSguLi4pLlxuLy8gTW9zdCBvZiB0aGUgY29kZSBiZWxvdyBpcyBkaXJlY3RseSB0YWtlbiBmcm9tIHRoZSBncmVhdCBKc3RhdCBwcm9qZWN0XG4vLyAoaHR0cHM6Ly9naXRodWIuY29tL2pzdGF0Lykgd2hpY2ggaW5jbHVkZXMgUERGIGZvciBtYW55IGNvbW1vbiBwcm9iYWJpbGl0eVxuLy8gZGlzdHJpYnV0aW9ucy4gV2hhdCBJIGhhdmUgZG9uZSBpcyBvbmx5IHRvIGNvbnZlcnQgdGhlc2UgdG8gbG9nIFBERnMuXG5cbi8qXG5PcmlnaW5hbCB3b3JrIENvcHlyaWdodCAoYykgMjAxMyBqU3RhdFxuTW9kaWZpZWQgd29yayBDb3B5cmlnaHQgKGMpIDIwMTUgUmFzbXVzIELDpcOldGggXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cblRIRSBTT0ZUV0FSRS5cblxuKi9cblxuXG4vLyBUaGlzIGJvaWxlciBwbGF0ZSBjb2RlIGhlcmUgaXMgdGFrZW4gZnJvbTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS91bWRqcy91bWQvYmxvYi9tYXN0ZXIvdGVtcGxhdGVzL3JldHVybkV4cG9ydHMuanNcbi8vIEl0IHNob3VsZCBtYWtlIHNodXJlIHRoYXQgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBib3RoIGluIHRoZSBicm93c2VyLFxuLy8gTm9kZSwgYW5kIGJ5IHVzaW5nIHRoZSBBc3luY2hyb25vdXMgTW9kdWxlIERlZmluaXRpb24gc3RhbmRhcmQuXG4vLyBJZiB0aGlzIG1vZHVsZSBpcyBsb2FkZWQgaW4gdGhlIGJyb3dzZXIgaXQgd2lsbCBjcmVhdGVkIHRoZSBnbG9iYWxcbi8vIG9iamVjdCBsZCAuXG4oZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cbiAgICAgICAgZGVmaW5lKFtdLCBmYWN0b3J5KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIC8vIE5vZGUuIERvZXMgbm90IHdvcmsgd2l0aCBzdHJpY3QgQ29tbW9uSlMsIGJ1dFxuICAgICAgICAvLyBvbmx5IENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cyxcbiAgICAgICAgLy8gbGlrZSBOb2RlLlxuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHMgKHJvb3QgaXMgd2luZG93KVxuICAgICAgICByb290LmxkID0gZmFjdG9yeSgpO1xuICB9XG59KHRoaXMsIGZ1bmN0aW9uKCkge1xuICAvLyBPYmplY3QgdG8gaG9sZCB0aGUgZnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkLlxuICB2YXIgbGQgID0ge307XG4gIFxuICAvLy8vLy8vLy8vIEhlbHBlciBmdW5jdGlvbnMgLy8vLy8vLy8vL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgdmFyIGxnYW1tYSA9IGZ1bmN0aW9uKHgpIHtcbiAgICB2YXIgaiA9IDA7XG4gICAgdmFyIGNvZiA9IFtcbiAgICAgIDc2LjE4MDA5MTcyOTQ3MTQ2LCAtODYuNTA1MzIwMzI5NDE2NzcsIDI0LjAxNDA5ODI0MDgzMDkxLFxuICAgICAgLTEuMjMxNzM5NTcyNDUwMTU1LCAwLjEyMDg2NTA5NzM4NjYxNzllLTIsIC0wLjUzOTUyMzkzODQ5NTNlLTVcbiAgICBdO1xuICAgIHZhciBzZXIgPSAxLjAwMDAwMDAwMDE5MDAxNTtcbiAgICB2YXIgeHgsIHksIHRtcDtcbiAgICB0bXAgPSAoeSA9IHh4ID0geCkgKyA1LjU7XG4gICAgdG1wIC09ICh4eCArIDAuNSkgKiBsb2codG1wKTtcbiAgICBmb3IgKDsgaiA8IDY7IGorKylcbiAgICAgIHNlciArPSBjb2Zbal0gLyArK3k7XG4gICAgcmV0dXJuIGxvZygyLjUwNjYyODI3NDYzMTAwMDUgKiBzZXIgLyB4eCkgLSB0bXA7XG4gIH07XG4gIGxkLmxnYW1tYSA9IGxnYW1tYTtcbiAgXG4gIHZhciBsZmFjdG9yaWFsID0gZnVuY3Rpb24obikge1xuICAgIHJldHVybiBuIDwgMCA/IE5hTiA6IGxnYW1tYShuICsgMSk7XG4gIH07XG4gIGxkLmxmYWN0b3JpYWwgPSBsZmFjdG9yaWFsO1xuICBcbiAgdmFyIGxjaG9vc2UgPSBmdW5jdGlvbihuLCBrKXtcbiAgICByZXR1cm4gbGZhY3RvcmlhbChuKSAtIGxmYWN0b3JpYWwoaykgLSBsZmFjdG9yaWFsKG4gLSBrKTtcbiAgfTtcbiAgbGQubGNob29zZSA9IGxjaG9vc2U7XG4gIFxuICB2YXIgbGJldGEgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGxnYW1tYShhKSArIGxnYW1tYShiKSAtIGxnYW1tYShhICsgYik7XG4gIH07XG4gIGxkLmxiZXRhID0gbGJldGE7XG4gIFxuICB2YXIgbG9nICA9IE1hdGgubG9nO1xuICB2YXIgZXhwICA9IE1hdGguZXhwO1xuICB2YXIgYWJzICA9IE1hdGguYWJzO1xuICB2YXIgcG93ICA9IE1hdGgucG93O1xuICB2YXIgc3FydCA9IE1hdGguc3FydDtcbiAgdmFyIHBpICAgPSBNYXRoLlBJO1xuICBcbiAgLy8vLy8vLy8vLyBDb250aW5vdXMgZGlzdHJpYnV0aW9ucyAvLy8vLy8vLy8vXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgbGQuYmV0YSA9IGZ1bmN0aW9uKHgsIHNoYXBlMSwgc2hhcGUyKSB7XG4gICAgaWYgKHggPiAxIHx8IHggPCAwKSB7XG4gICAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfVxuICAgIGlmKHNoYXBlMSA9PT0gMSAmJiBzaGFwZTIgPT09IDEpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKHNoYXBlMSAtIDEpICogbG9nKHgpICsgKHNoYXBlMiAtIDEpICogbG9nKDEgLSB4KSAtIGxiZXRhKHNoYXBlMSwgc2hhcGUyKTsgIFxuICAgIH1cbiAgfTtcbiAgXG4gIGxkLmNhdWNoeSA9IGZ1bmN0aW9uKHgsIGxvY2F0aW9uLCBzY2FsZSkge1xuICAgIHJldHVybiBsb2coc2NhbGUpIC0gbG9nKHBvdyh4IC0gbG9jYXRpb24sIDIpICsgcG93KHNjYWxlLCAyKSkgIC0gbG9nKHBpKTtcbiAgfTtcbiAgXG4gIGxkLm5vcm0gPSBmdW5jdGlvbih4LCBtZWFuLCBzZCkge1xuICAgICAgcmV0dXJuIC0wLjUgKiBsb2coMiAqIHBpKSAtbG9nKHNkKSAtIHBvdyh4IC0gbWVhbiwgMikgLyAoMiAqIHNkICogc2QpO1xuICB9O1xuXG4gIC8vIEEgYml2YXJpYXRlIE5vcm1hbCBkaXN0cmlidXRpb24gcGFyYW1ldGVyaXplZCBieSBhcnJheXMgb2YgdHdvIG1lYW5zIGFuZCBTRHMsIGFuZCBcbiAgLy8gdGhlIGNvcnJlbGF0aW9uLlxuICBsZC5iaXZhcm5vcm0gPSBmdW5jdGlvbih4LCBtZWFuLCBzZCwgY29ycikge1xuICAgIHZhciB6ID0gcG93KHhbMF0gLSBtZWFuWzBdLCAyKSAvIHBvdyhzZFswXSwgMikgK1xuICAgICAgICAgICAgcG93KHhbMV0gLSBtZWFuWzFdLCAyKSAvIHBvdyhzZFsxXSwgMikgLSBcbiAgICAgICAgICAgICgyICogY29yciAqICh4WzBdIC0gbWVhblswXSkgKiAoeFsxXSAtIG1lYW5bMV0pKSAvIChzZFswXSAqIHNkWzFdKTtcbiAgICB2YXIgbm9ybWFsaXppbmdfZmFjdG9yID0gLSggbG9nKDIpICsgbG9nKHBpKSArIGxvZyhzZFswXSkgKyBsb2coc2RbMV0pICsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNSAqIGxvZygxIC0gcG93KGNvcnIsIDIpKSApOyBcbiAgICB2YXIgYml2YXJfbG9nX2RlbnMgPSBub3JtYWxpemluZ19mYWN0b3IgLSB6IC8gKDIgKiAoMSAtIHBvdyhjb3JyLCAyKSApICk7IFxuICAgIHJldHVybiBiaXZhcl9sb2dfZGVucztcbiAgfTtcbiAgXG5cbiAgbGQubGFwbGFjZSA9IGZ1bmN0aW9uKHgsIGxvY2F0aW9uLCBzY2FsZSkge1xuICAgIHJldHVybiAoLWFicyh4IC0gbG9jYXRpb24pL3NjYWxlKSAtIGxvZygyICogc2NhbGUpO1xuICB9O1xuICBcbiAgbGQuZGV4cCA9IGxkLmxhcGxhY2U7XG4gIFxuICBsZC5nYW1tYSA9IGZ1bmN0aW9uKHgsIHNoYXBlLCByYXRlKSB7XG4gICAgdmFyIHNjYWxlID0gMSAvIHJhdGU7XG4gICAgaWYgKHggPCAwKSB7XG4gICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgIH1cbiAgICBpZigoeCA9PT0gMCAmJiBzaGFwZSA9PT0gMSkgKSB7XG4gICAgICByZXR1cm4gLWxvZyhzY2FsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAoc2hhcGUgLSAxKSAqIGxvZyh4KSAtIHggLyBzY2FsZSAtIGxnYW1tYShzaGFwZSkgLSBzaGFwZSAqIGxvZyhzY2FsZSk7XG4gICAgfVxuICB9O1xuICBcbiAgbGQuaW52Z2FtbWEgPSBmdW5jdGlvbih4LCBzaGFwZSwgc2NhbGUpIHtcbiAgICAgIGlmICh4IDw9IDApIHtcbiAgICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAtKHNoYXBlICsgMSkgKiBsb2coeCkgLSBzY2FsZSAvIHggLSBsZ2FtbWEoc2hhcGUpICsgc2hhcGUgKiBsb2coc2NhbGUpO1xuICAgIH07XG4gIFxuICBsZC5sbm9ybSA9ICBmdW5jdGlvbih4LCBtZWFubG9nLCBzZGxvZykge1xuICAgIGlmICh4IDw9IDApIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfVxuICAgIHJldHVybiAtbG9nKHgpIC0gMC41ICogbG9nKDIgKiBwaSkgLSBsb2coc2Rsb2cpIC0gXG4gICAgICAgICAgICBwb3cobG9nKHgpIC0gbWVhbmxvZywgMikgLyAoMiAqIHNkbG9nICogc2Rsb2cpO1xuICB9O1xuICBcbiAgbGQucGFyZXRvID0gZnVuY3Rpb24oeCwgc2NhbGUsIHNoYXBlKSB7XG4gICAgaWYgKHggPCBzY2FsZSkge1xuICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICB9XG4gICAgcmV0dXJuIGxvZyhzaGFwZSkgKyBzaGFwZSAqIGxvZyhzY2FsZSkgLSAoc2hhcGUgKyAxKSAqIGxvZyh4KTtcbiAgfTtcbiAgXG4gIGxkLnQgID0gIGZ1bmN0aW9uKHgsIGxvY2F0aW9uLCBzY2FsZSwgZGYpIHtcbiAgICBkZiA9IGRmID4gMWUxMDAgPyAxZTEwMCA6IGRmO1xuICAgIHJldHVybiBsZ2FtbWEoKGRmICsgMSkvMikgLSBsZ2FtbWEoZGYvMikgLSBsb2coc3FydChwaSAqIGRmKSAqIHNjYWxlKSArXG4gICAgICAgICAgIGxvZyhwb3coMSArICgxL2RmKSAqIHBvdygoeCAtIGxvY2F0aW9uKS9zY2FsZSwgMiksIC0oZGYgKyAxKS8yKSk7XG4gIH07XG4gIFxuICAvLyBUaGlzIGlzIGEgZGlyZWN0IGphdmFzY3JpcHQgdHJhbnNsYXRpb24gb2YgdGhlIFIgY29kZSB1c2VkIHRvIGV2YWx1YXRlXG4gIC8vIHRoZSBsb2cgZGVuc2l0eSBvZiBhIHdlaWJ1bGwgZGlzdHJpYnV0aW9uOiBcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3djaC9yLXNvdXJjZS9ibG9iL2IxNTZlM2E3MTE5NjdmNTgxMzFlMjNjMWIxZGMxZWE5MGUyZjBjNDMvc3JjL25tYXRoL2R3ZWlidWxsLmNcbiAgbGQud2VpYnVsbCA9IGZ1bmN0aW9uKHgsIHNoYXBlLCBzY2FsZSkge1xuICAgIGlmICh4IDwgMCkgcmV0dXJuIC1JbmZpbml0eTtcbiAgICBpZih4ID09PSAwICYmIHNoYXBlIDwgMSkgcmV0dXJuIEluZmluaXR5O1xuICAgIHZhciB0bXAxID0gcG93KHggLyBzY2FsZSwgc2hhcGUgLSAxKTtcbiAgICB2YXIgdG1wMiA9IHRtcDEgKiAoeCAvIHNjYWxlKTtcblx0ICByZXR1cm4gLXRtcDIgKyBsb2coc2hhcGUgKiB0bXAxIC8gc2NhbGUpO1xuICB9O1xuICBcbiAgLy8gVGhpcyBpcyBhIGRpcmVjdCBqYXZhc2NyaXB0IHRyYW5zbGF0aW9uIG9mIHRoZSBSIGNvZGUgdXNlZCB0byBldmFsdWF0ZVxuICAvLyB0aGUgbG9nIGRlbnNpdHkgb2YgYSBsb2dpc3RpYyBkaXN0cmlidXRpb246IFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vd2NoL3Itc291cmNlL2Jsb2IvYjE1NmUzYTcxMTk2N2Y1ODEzMWUyM2MxYjFkYzFlYTkwZTJmMGM0My9zcmMvbm1hdGgvZGxvZ2lzLmNcbiAgbGQubG9naXMgPSBmdW5jdGlvbih4LCBsb2NhdGlvbiwgc2NhbGUpIHtcbiAgICB4ID0gYWJzKCh4IC0gbG9jYXRpb24pIC8gc2NhbGUpO1xuICAgIHZhciBlID0gZXhwKC14KTtcbiAgICB2YXIgZiA9IDEuMCArIGU7XG4gICAgcmV0dXJuIC0oeCArIGxvZyhzY2FsZSAqIGYgKiBmKSk7ICAgIFxuICB9O1xuXG4gIGxkLmRpcmljaGxldCA9IGZ1bmN0aW9uKHgsIGFscGhhKSB7XG4gICAgdmFyIHN1bV9hbHBoYSA9IDA7XG4gICAgdmFyIHN1bV9sZ2FtbWFfYWxwaGEgPSAwO1xuICAgIHZhciBzdW1fYWxwaGFfc3ViXzFfbG9nX3ggPSAwO1xuICAgIHZhciBuID0gYWxwaGEubGVuZ3RoO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgIHN1bV9hbHBoYSArPSBhbHBoYVtpXTtcbiAgICAgIHN1bV9sZ2FtbWFfYWxwaGEgKz0gbGdhbW1hKGFscGhhW2ldKTtcbiAgICAgIHN1bV9hbHBoYV9zdWJfMV9sb2dfeCArPSAoYWxwaGFbaV0gLSAxKSAqIGxvZyh4W2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIGxnYW1tYShzdW1fYWxwaGEpIC0gc3VtX2xnYW1tYV9hbHBoYSArIHN1bV9hbHBoYV9zdWJfMV9sb2dfeDtcbiAgfTtcbiAgIFxuICAgIFxuICBsZC5leHAgPSBmdW5jdGlvbih4LCByYXRlKSB7XG4gICAgICByZXR1cm4geCA8IDAgPyAtSW5maW5pdHkgOiBsb2cocmF0ZSkgLXJhdGUgKiB4O1xuICB9O1xuICBcbiAgbGQudW5pZiA9IGZ1bmN0aW9uKHgsIG1pbiwgbWF4KSB7XG4gICAgICByZXR1cm4gKHggPCBtaW4gfHwgeCA+IG1heCkgPyAtSW5maW5pdHkgOiBsb2coMSAvIChtYXggLSBtaW4pKTtcbiAgfTtcbiAgXG4gIC8vLy8vLy8vLy8gRGlzY3JldGUgZGlzdHJpYnV0aW9ucyAvLy8vLy8vLy8vXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gIFxuICBsZC5iZXJuID0gZnVuY3Rpb24oeCwgcHJvYikge1xuICAgICAgcmV0dXJuICEoeCA9PT0gMCB8fCB4ID09PSAxKSA/IC1JbmZpbml0eSA6IGxvZyh4ICogcHJvYiArICgxIC0geCkgKiAoMSAtIHByb2IpKTtcbiAgfTtcbiAgXG4gIGxkLmNhdCA9IGZ1bmN0aW9uKHgsIHByb2JzKSB7XG4gICAgaWYoeCA8IDEgfHwgeCA+IHByb2JzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGxvZyggcHJvYnNbeCAtIDFdICk7XG4gICAgfVxuICB9O1xuICBcbiAgbGQuYmlub20gPSBmdW5jdGlvbih4LCBzaXplLCBwcm9iKSB7XG4gICAgaWYoeCA+IHNpemUgfHwgeCA8IDApIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfVxuICAgIGlmKHByb2IgPT09IDAgfHwgcHJvYiA9PT0gMSkge1xuICAgICAgcmV0dXJuIChzaXplICogcHJvYikgPT09IHggPyAwIDogLUluZmluaXR5O1xuICAgIH1cbiAgICByZXR1cm4gbGNob29zZShzaXplLCB4KSArIHggKiBsb2cocHJvYikgKyAoc2l6ZSAtIHgpICogbG9nKDEgLSBwcm9iKTtcbiAgfTtcbiAgXG4gIHZhciBtdWx0aW5vbSA9IGZ1bmN0aW9uKHgsIHByb2JzKSB7XG4gICAgdmFyIG4gPSB4Lmxlbmd0aDtcbiAgICB2YXIgc2l6ZSA9IDA7XG4gICAgdmFyIHRtcF90ZXJtID0gMDtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICBpZihwcm9ic1tpXSA9PT0gMCkge1xuICAgICAgICBpZih4W2ldICE9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTsgIFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaXplICs9IHhbaV07XG4gICAgICAgIHRtcF90ZXJtICs9IHhbaV0gKiBsb2cocHJvYnNbaV0pIC0gbGdhbW1hKHhbaV0gKyAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxnYW1tYShzaXplICsgMSkgKyB0bXBfdGVybSA7XG4gIH07XG4gIFxuICBsZC5uYmlub20gPSBmdW5jdGlvbih4LCBzaXplLCBwcm9iKSB7XG4gICAgaWYoeCA8IDApIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfVxuICAgIHJldHVybiBsY2hvb3NlKHggKyBzaXplIC0gMSwgc2l6ZSAtIDEpICsgeCAqIGxvZygxIC0gcHJvYikgKyBzaXplICogbG9nKHByb2IpO1xuICB9O1xuICBcbiAgbGQuaHlwZXIgPSBmdW5jdGlvbih4LCBtLCBuLCBrKSB7XG4gICAgaWYoeCA8IDAgfHwgeCA+IGspIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfSBlbHNlIHtcbiAgICByZXR1cm4gbGNob29zZShtLCB4KSArIGxjaG9vc2Uobiwgay14KSAtIGxjaG9vc2UobStuLCBrKTtcbiAgICB9XG4gIH07XG4gIFxuICBsZC5wb2lzID0gZnVuY3Rpb24oeCwgbGFtYmRhKSB7XG4gICAgICByZXR1cm4geCA8IDAgPyAtSW5maW5pdHkgOiBsb2cobGFtYmRhKSAqIHggLSBsYW1iZGEgLSBsZmFjdG9yaWFsKHgpO1xuICB9O1xuICBcbiAgcmV0dXJuIGxkO1xufSkpOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vLyBUaGlzIGJvaWxlciBwbGF0ZSBjb2RlIGhlcmUgaXMgdGFrZW4gZnJvbTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS91bWRqcy91bWQvYmxvYi9tYXN0ZXIvdGVtcGxhdGVzL3JldHVybkV4cG9ydHMuanNcbi8vIEl0IHNob3VsZCBtYWtlIHNodXJlIHRoYXQgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBib3RoIGluIHRoZSBicm93c2VyLFxuLy8gTm9kZSwgYW5kIGJ5IHVzaW5nIHRoZSBBc3luY2hyb25vdXMgTW9kdWxlIERlZmluaXRpb24gc3RhbmRhcmQuXG4vLyBJZiB0aGlzIG1vZHVsZSBpcyBsb2FkZWQgaW4gdGhlIGJyb3dzZXIgaXQgd2lsbCBjcmVhdGVkIHRoZSBnbG9iYWxcbi8vIG9iamVjdCBtY21jIC5cbihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgLy8gQU1ELiBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgbW9kdWxlLlxuICAgICAgICBkZWZpbmUoW10sIGZhY3RvcnkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0XG4gICAgICAgIC8vIG9ubHkgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgdGhhdCBzdXBwb3J0IG1vZHVsZS5leHBvcnRzLFxuICAgICAgICAvLyBsaWtlIE5vZGUuXG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFscyAocm9vdCBpcyB3aW5kb3cpXG4gICAgICAgIHJvb3QubWNtYyA9IGZhY3RvcnkoKTtcbiAgfVxufSh0aGlzLCBmdW5jdGlvbigpe1xuXG4vLy8gVGhlIGFjdHVhbCBtb2R1bGUgY29kZSBzdGFydHMgaGVyZSAvLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgXG4gIFxuICAvLy8vLy8vLy8vIEhlbHBlciBGdW5jdGlvbnMgLy8vLy8vLy8vL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgLyoqIFJldHVybnMgYSByYW5kb20gcmVhbCBudW1iZXIgYmV0d2VlbiBtaW4gYW5kIG1heCAqL1xuICB2YXIgcnVuaWYgPSBmdW5jdGlvbihtaW4sIG1heCkge1xuICAgIHJldHVybiBNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbikgKyBtaW47XG4gIH07XG4gIFxuICAvKiogUmV0dXJucyBhIHJhbmRvbSBpbnRlZ2VyIGJldHdlZW4gbWluIGFuZCBtYXggKi9cbiAgdmFyIHJ1bmlmX2Rpc2NyZXRlID0gZnVuY3Rpb24obWluLCBtYXgpIHtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKSArIG1pbjtcbiAgfTtcbiAgXG4gIC8qKiBSZXR1cm5zIGEgcmFuZG9tIHJlYWwgbnVtYmVyIGZyb20gYSBub3JtYWwgZGlzdHJpYmJ1dGlvbiBkZWZpbmVkXG4gICAqICBieSBtZWFuIGFuZCBzZC4gXG4gICAqICBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2pzdGF0L2pzdGF0L2Jsb2IvbWFzdGVyL3NyYy9zcGVjaWFsLmpzICovXG4gIHZhciBybm9ybSA9IGZ1bmN0aW9uKG1lYW4sIHNkKSB7XG4gICAgdmFyIHUsIHYsIHgsIHksIHE7XG4gICAgZG8ge1xuICAgICAgdSA9IE1hdGgucmFuZG9tKCk7XG4gICAgICB2ID0gMS43MTU2ICogKE1hdGgucmFuZG9tKCkgLSAwLjUpO1xuICAgICAgeCA9IHUgLSAwLjQ0OTg3MTtcbiAgICAgIHkgPSBNYXRoLmFicyh2KSArIDAuMzg2NTk1O1xuICAgICAgcSA9IHggKiB4ICsgeSAqICgwLjE5NjAwICogeSAtIDAuMjU0NzIgKiB4KTtcbiAgICB9IHdoaWxlIChxID4gMC4yNzU5NyAmJiAocSA+IDAuMjc4NDYgfHwgdiAqIHYgPiAtNCAqIE1hdGgubG9nKHUpICogdSAqIHUpKTtcbiAgICBcbiAgICByZXR1cm4gKHYgLyB1KSAqIHNkICsgbWVhbjtcbiAgfTtcbiAgXG4gIFxuICAvKiogUmV0dXJucyBhIGRlZXAgY2xvbmUgb2Ygc3JjLCBzb3J0IG9mLi4uIEl0IG9ubHkgY29waWVzIGEgbGltaXRlZFxuICAgKiBudW1iZXIgb2YgdHlwZXMgYW5kLCBmb3IgZXhhbXBsZSwgZnVuY3Rpb24gYXJlIG5vdCBjb3BpZWQuIFxuICAgKiBGcm9tIGh0dHA6Ly9kYXZpZHdhbHNoLm5hbWUvamF2YXNjcmlwdC1jbG9uZVxuICAgKi9cbiAgdmFyIGRlZXBfY2xvbmUgPSBmdW5jdGlvbihzcmMpIHtcbiAgXHRmdW5jdGlvbiBtaXhpbihkZXN0LCBzb3VyY2UsIGNvcHlGdW5jKSB7XG4gIFx0XHR2YXIgbmFtZSwgcywgaSwgZW1wdHkgPSB7fTtcbiAgXHRcdGZvcihuYW1lIGluIHNvdXJjZSl7XG4gIFx0XHRcdC8vIHRoZSAoIShuYW1lIGluIGVtcHR5KSB8fCBlbXB0eVtuYW1lXSAhPT0gcykgY29uZGl0aW9uIGF2b2lkcyBjb3B5aW5nIHByb3BlcnRpZXMgaW4gXCJzb3VyY2VcIlxuICBcdFx0XHQvLyBpbmhlcml0ZWQgZnJvbSBPYmplY3QucHJvdG90eXBlLlx0IEZvciBleGFtcGxlLCBpZiBkZXN0IGhhcyBhIGN1c3RvbSB0b1N0cmluZygpIG1ldGhvZCxcbiAgXHRcdFx0Ly8gZG9uJ3Qgb3ZlcndyaXRlIGl0IHdpdGggdGhlIHRvU3RyaW5nKCkgbWV0aG9kIHRoYXQgc291cmNlIGluaGVyaXRlZCBmcm9tIE9iamVjdC5wcm90b3R5cGVcbiAgXHRcdFx0cyA9IHNvdXJjZVtuYW1lXTtcbiAgXHRcdFx0aWYoIShuYW1lIGluIGRlc3QpIHx8IChkZXN0W25hbWVdICE9PSBzICYmICghKG5hbWUgaW4gZW1wdHkpIHx8IGVtcHR5W25hbWVdICE9PSBzKSkpe1xuICBcdFx0XHRcdGRlc3RbbmFtZV0gPSBjb3B5RnVuYyA/IGNvcHlGdW5jKHMpIDogcztcbiAgXHRcdFx0fVxuICBcdFx0fVxuICBcdFx0cmV0dXJuIGRlc3Q7XG4gIFx0fVxuICBcdGlmKCFzcmMgfHwgdHlwZW9mIHNyYyAhPSBcIm9iamVjdFwiIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzcmMpID09PSBcIltvYmplY3QgRnVuY3Rpb25dXCIpe1xuICBcdFx0Ly8gbnVsbCwgdW5kZWZpbmVkLCBhbnkgbm9uLW9iamVjdCwgb3IgZnVuY3Rpb25cbiAgXHRcdHJldHVybiBzcmM7XHQvLyBhbnl0aGluZ1xuICBcdH1cbiAgXHRpZihzcmMubm9kZVR5cGUgJiYgXCJjbG9uZU5vZGVcIiBpbiBzcmMpe1xuICBcdFx0Ly8gRE9NIE5vZGVcbiAgXHRcdHJldHVybiBzcmMuY2xvbmVOb2RlKHRydWUpOyAvLyBOb2RlXG4gIFx0fVxuICBcdGlmKHNyYyBpbnN0YW5jZW9mIERhdGUpe1xuICBcdFx0Ly8gRGF0ZVxuICBcdFx0cmV0dXJuIG5ldyBEYXRlKHNyYy5nZXRUaW1lKCkpO1x0Ly8gRGF0ZVxuICBcdH1cbiAgXHRpZihzcmMgaW5zdGFuY2VvZiBSZWdFeHApe1xuICBcdFx0Ly8gUmVnRXhwXG4gIFx0XHRyZXR1cm4gbmV3IFJlZ0V4cChzcmMpOyAgIC8vIFJlZ0V4cFxuICBcdH1cbiAgXHR2YXIgciwgaSwgbDtcbiAgXHRpZihzcmMgaW5zdGFuY2VvZiBBcnJheSl7XG4gIFx0XHQvLyBhcnJheVxuICBcdFx0ciA9IFtdO1xuICBcdFx0Zm9yKGkgPSAwLCBsID0gc3JjLmxlbmd0aDsgaSA8IGw7ICsraSl7XG4gIFx0XHRcdGlmKGkgaW4gc3JjKXtcbiAgXHRcdFx0XHRyLnB1c2goZGVlcF9jbG9uZShzcmNbaV0pKTtcbiAgXHRcdFx0fVxuICBcdFx0fVxuICBcdH0gZWxzZSB7XG4gIFx0XHQvLyBnZW5lcmljIG9iamVjdHNcbiAgXHRcdHIgPSBzcmMuY29uc3RydWN0b3IgPyBuZXcgc3JjLmNvbnN0cnVjdG9yKCkgOiB7fTtcbiAgXHR9XG4gIFx0cmV0dXJuIG1peGluKHIsIHNyYywgZGVlcF9jbG9uZSk7XG4gIH07XG4gIFxuICAvKiogU3BlY2lhbGl6ZWQgY2xvbmUgZnVuY3Rpb24gdGhhdCBvbmx5IGNsb25lcyBzY2FsYXJzIGFuZCBuZXN0ZWQgYXJyYXlzIHdoZXJlXG4gICAqIGVhY2ggYXJyYXkgZWl0aGVyIGNvbnNpc3RzIG9mIGFsbCBhcnJheXMgb3IgYWxsIG51bWJlcnMuIFRoaXMgZnVuY3Rpb25cbiAgICogaXMgbWVhbnQgYXMgYSBmYXN0IHdheSBvZiBjbG9uaW5nIHBhcmFtZXRlciBkcmF3cyB3aXRoaW4gdGhlIG1jbWMgc2FtcGxpbmdcbiAgICogbG9vcC5cbiAgICovXG4gIHZhciBjbG9uZV9wYXJhbV9kcmF3ID0gZnVuY3Rpb24oeCkge1xuICAgIGlmKEFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICAgIGlmKEFycmF5LmlzQXJyYXkoeFswXSkpIHtcbiAgICAgICAgLy8geCBpcyBhbiBhcnJheSBvZiBhcnJheXMgc28gd2UgbmVlZCB0byBjbG9uZSBpdCByZWN1cnNpdmVseVxuICAgICAgICB2YXIgeF9jb3B5ID0gW107XG4gICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbmd0aCA9IHgubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB4X2NvcHkucHVzaChjbG9uZV9wYXJhbV9kcmF3KHhbaV0pKTtcbiAgICAgICAgfSBcbiAgICAgICAgcmV0dXJuIHhfY29weTtcbiAgICAgIH0gZWxzZSB7IC8vIFdlJ2xsIGFzc3VtZSB4IGlzIGEgYXJyYXlzIG9mIHNjYWxhcnNcbiAgICAgICAgcmV0dXJuIHguc2xpY2UoMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHsgLy8gV2UnbGwgYXNzdW1lIHggaXMgYSBzY2FsYXJcbiAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfTtcbiAgXG4gIC8qKiBSZXR1cm5zIHRydWUgaWYgb2JqZWN0IGlzIGEgbnVtYmVyLlxuICAgKi9cbiAgdmFyIGlzX251bWJlciA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT0gXCJudW1iZXJcIiB8fCAodHlwZW9mIG9iamVjdCA9PSBcIm9iamVjdFwiICYmIG9iamVjdC5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhIChwb3NzaWJseSBtdWx0aWRpbWVuc2lvbmFsL25lc3RlZCkgYXJyYXkuXG4gICAqIEBwYXJhbSBkaW0gLSBBbiBhcnJheSBnaXZpbmcgdGhlIGRpbWVuc2lvbiBvZiB0aGUgYXJyYXkuIEZvciBleGFtcGxlLFxuICAgKiAgIFs1XSB3b3VsZCB5aWVsZCBhIDUgZWxlbWVudCBhcnJheSwgYW5kIFszLDNdIHdvdWxkIHlpZWxkIGEgMyBieSAzIG1hdHJpeC5cbiAgICogQHBhcmFtIGluaXQgLSBBIHZhbHVlIG9yIGEgZnVuY3Rpb24gdXNlZCB0byBmaWxsIGluIHRoZSBlYWNoIGVsZW1lbnQgaW5cbiAgICogICB0aGUgYXJyYXkuIElmIGl0IGlzIGEgZnVuY3Rpb24gaXQgc2hvdWxkIHRha2Ugbm8gYXJndW1lbnRzLCBpdCB3aWxsIGJlIFxuICAgKiAgIGV2YWx1YXRlZCBvbmNlIGZvciBlYWNoIGVsZW1lbnQsIGFuZCBpdCdzIHJldHVybiB2YWx1ZSB3aWxsIGJlIHVzZWQgdG9cbiAgICogICBmaWxsIGluIGVhY2ggZWxlbWVudC5cbiAgICogQGV4YW1wbGUgXG4gICAqIC8vIFRoZSBmb2xsb3dpbmcgd291bGQgcmV0dXJuIFtbMSwxXSxbMSwxXSxbMSwxXV1cbiAgICogY3JlYXRlX2FycmF5KFsyLDNdLCAxKVxuICAgKi9cbiAgdmFyIGNyZWF0ZV9hcnJheSA9IGZ1bmN0aW9uKGRpbSwgaW5pdCkge1xuICAgIHZhciBhcnIgPSBuZXcgQXJyYXkoZGltWzBdKTtcbiAgICB2YXIgaTtcbiAgICBpZihkaW0ubGVuZ3RoID09IDEpIHsgLy8gRmlsbCBpdCB1cCB3aXRoIGluaXRcbiAgICAgIGlmKHR5cGVvZiBpbml0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgICBhcnJbaV0gPSBpbml0KCk7XG4gICAgICAgIH0gIFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgICBhcnJbaV0gPSBpbml0O1xuICAgICAgICB9IFxuICAgICAgfVxuICAgIH0gZWxzZSBpZihkaW0ubGVuZ3RoID4gMSkge1xuICAgICAgZm9yKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgYXJyW2ldID0gY3JlYXRlX2FycmF5KGRpbS5zbGljZSgxKSwgaW5pdCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IFwiY3JlYXRlX2FycmF5IGNhbid0IGNyZWF0ZSBhIGRpbWVuc2lvbmxlc3MgYXJyYXlcIjtcbiAgICB9XG4gICAgcmV0dXJuIGFycjtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGRpbWVuc2lvbnMgb2YgYSBwb3NzaWJseSBuZXN0ZWQgYXJyYXkgYXMgYW4gYXJyYXkuIEZvciBcbiAgICogZXhhbXBsZSwgYXJyYXlfZGltKCBbWzEsIDJdLCBbMSwgMl1dICkgc2hvdWxkIHJldHVybiBbMiwgMl1cbiAgICogQXNzdW1lcyB0aGF0IGFsbCBhcnJheXMgaW5zaWRlIGFub3RoZXIgYXJyYXkgYXJlIG9mIHRoZSBzYW1lIGxlbmd0aC5cbiAgICogQGV4YW1wbGVcbiAgICogLy8gU2hvdWxkIHJldHVybiBbNCwgMiwgMV1cbiAgICogYXJyYXlfZGltKGNyZWF0ZV9hcnJheShbNCwgMiwgMV0sIDApKVxuICAgKi9cbiAgdmFyIGFycmF5X2RpbSA9IGZ1bmN0aW9uKGEpIHtcbiAgICBpZihBcnJheS5pc0FycmF5KGFbMF0pKSB7XG4gICAgICByZXR1cm4gW2EubGVuZ3RoXS5jb25jYXQoYXJyYXlfZGltKGFbMF0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFthLmxlbmd0aF07XG4gICAgfVxuICB9O1xuICBcbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0d28gYXJyYXlzIGFyZSBlcXVhbCBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5IGNvbnRhaW4gdGhlIHNhbWUgZWxlbWVudHNcbiAgICogYXMganVkZ2VkIGJ5IHRoZSBcIj09XCIgb3BlcmF0b3IuIFJldHVybnMgdHJ1ZSBvciBmYWxzZS5cbiAgICogQWRhcHRlZCBmcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE0ODUzOTc0LzEwMDE4NDhcbiAgICovIFxuICB2YXIgYXJyYXlfZXF1YWwgPSBmdW5jdGlvbiAoYTEsIGEyKSB7XG4gICAgICBpZiAoYTEubGVuZ3RoICE9IGEyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgbmVzdGVkIGFycmF5c1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGExW2ldKSAmJiBBcnJheS5pc0FycmF5KGEyW2ldKSkge1xuICAgICAgICAgICAgICAvLyByZWN1cnNlIGludG8gdGhlIG5lc3RlZCBhcnJheXNcbiAgICAgICAgICAgICAgaWYgKCFhcnJheV9lcXVhbChhMVtpXSwgYTJbaV0pKSByZXR1cm4gZmFsc2U7ICAgICAgIFxuICAgICAgICAgIH0gICAgICAgICAgIFxuICAgICAgICAgIGVsc2UgaWYgKGExW2ldICE9IGEyW2ldKSB7IFxuICAgICAgICAgICAgICAvLyBXYXJuaW5nIC0gdHdvIGRpZmZlcmVudCBvYmplY3QgaW5zdGFuY2VzIHdpbGwgbmV2ZXIgYmUgZXF1YWw6IHt4OjIwfSAhPSB7eDoyMH1cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgIFxuICAgICAgICAgIH0gICAgICAgICAgIFxuICAgICAgfSAgICAgICBcbiAgICAgIHJldHVybiB0cnVlO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFRyYXZlcnNlcyBhIHBvc3NpYmx5IG5lc3RlZCBhcnJheSBhIGFuZCBhcHBsaWVzIGZ1biB0byBhbGwgXCJsZWFmIG5vZGVzXCIsIFxuICAgKiB0aGF0IGlzLCB2YWx1ZXMgdGhhdCBhcmUgbm90IGFycmF5cy4gUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgc2FtZSBzaXplIGFzXG4gICAqIGEuXG4gICAqL1xuICB2YXIgbmVzdGVkX2FycmF5X2FwcGx5ID0gZnVuY3Rpb24oYSwgZnVuKSB7XG4gICAgaWYoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheShhLmxlbmd0aCk7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHRbaV0gPSBuZXN0ZWRfYXJyYXlfYXBwbHkoYVtpXSwgZnVuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmdW4oYSk7XG4gICAgfVxuICB9O1xuICBcbiAgLyoqIFJhbmRvbWl6aW5nIHRoZSBhcnJheSBlbGVtZW50IG9yZGVyIGluLXBsYWNlLiBVc2luZyBEdXJzdGVuZmVsZFxuICAgKiBzaHVmZmxlIGFsZ29yaXRobS4gQWRhcHRlZCBmcm9tIGhlcmU6IFxuICAgKiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xMjY0Njg2NC8xMDAxODQ4XG4gICAqL1xuICBmdW5jdGlvbiBzaHVmZmxlX2FycmF5KGFycmF5KSB7XG4gICAgICBmb3IgKHZhciBpID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgICAgIHZhciBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGkgKyAxKSk7XG4gICAgICAgICAgdmFyIHRlbXAgPSBhcnJheVtpXTtcbiAgICAgICAgICBhcnJheVtpXSA9IGFycmF5W2pdO1xuICAgICAgICAgIGFycmF5W2pdID0gdGVtcDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIERvZXMgdGhlIHNhbWUgdGhpbmcgYXMgbmVzdGVkX2FycmF5X2FwcGx5LCB0aGF0IGlzLCB0cmF2ZXJzZXMgYSBwb3NzaWJseVxuICAgKiBuZXN0ZWQgYXJyYXkgYSBhbmQgYXBwbGllcyBmdW4gdG8gYWxsIFwibGVhZiBub2Rlc1wiIGFuZCByZXR1cm5zIGFuIGFycmF5IFxuICAgKiBvZiB0aGUgc2FtZSBzaXplIGFzIGEuIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgbmVzdGVkX2FycmF5X3JhbmRvbV9hcHBseVxuICAgKiBicmFuY2hlcyByYW5kb21seS5cbiAgICovXG4gIHZhciBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5ID0gZnVuY3Rpb24oYSwgZnVuKSB7XG4gICAgaWYoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgdmFyIGxlbiA9IGEubGVuZ3RoO1xuICAgICAgdmFyIGk7XG4gICAgICB2YXIgYXJyYXlfaXMgPSBbXTtcbiAgICAgIGZvcihpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGFycmF5X2lzW2ldID0gaTtcbiAgICAgIH1cbiAgICAgIHNodWZmbGVfYXJyYXkoYXJyYXlfaXMpO1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgXG4gICAgICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgYXJyYXlfaSA9IGFycmF5X2lzW2ldO1xuICAgICAgICByZXN1bHRbYXJyYXlfaV0gPSBuZXN0ZWRfYXJyYXlfYXBwbHkoYVthcnJheV9pXSwgZnVuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmdW4oYSk7XG4gICAgfVxuICB9O1xuICBcbiAgLyoqXG4gICAqIEFsbG93cyBhIHByZXR0eSB3YXkgb2Ygc2V0dGluZyBkZWZhdWx0IG9wdGlvbnMgd2hlcmUgdGhlIGRlZnVsdHMgY2FuIGJlXG4gICAqIG92ZXJyaWRkZW4gYnkgYW4gb3B0aW9ucyBvYmplY3QuXG4gICAqICBAcGFyYW0gb3B0aW9uX25hbWUgLSB0aGUgbmFtZSBvZiB0aGUgb3B0aW9uIGFzIGEgc3RyaW5nXG4gICAqICBAcGFyYW0gbXlfb3B0aW9ucyAtIGFuIG9wdGlvbiBvYmplY3QgdGhhdCBjb3VsZCBoYXZlIG9wdGlvbl9uYW1lIFxuICAgKiAgICBhcyBhIG1lbWJlci5cbiAgICogQHBhcmFtIGRlZmF1bF92YWx1ZSAtIGRlZnVsdCB2YWx1ZSB0aGF0IGlzIHJldHVybmVkIGlmIG9wdGlvbl9uYW1lIFxuICAgKiAgIGlzIG5vdCBkZWZpbmVkIGluIG15X29wdGlvbnMuXG4gICAqIEBleGFtcGxlXG4gICAqIHZhciBteV9vcHRpb25zID0ge3BpOiAzLjE0MTU5fVxuICAgKiB2YXIgcGkgPSBnZXRfb3B0aW9uKFwicGlcIiwgbXlfb3B0aW9ucywgMy4xNClcbiAgICovXG4gIC8vIFByZXR0eSB3YXkgb2Ygc2V0dGluZyBkZWZhdWx0IG9wdGlvbnMgd2hlcmUgdGhlIGRlZmF1bHRzIGNhbiBiZSBvdmVycmlkZGVuXG4gIC8vIGJ5IGFuIG9wdGlvbnMgb2JqZWN0LiBGb3IgZXhhbXBsZTpcbiAgLy8gdmFyIHBpID0gZ2V0X29wdGlvbihcInBpXCIsIG15X29wdGlvbnMsIDMuMTQpXG4gIHZhciBnZXRfb3B0aW9uID0gZnVuY3Rpb24ob3B0aW9uX25hbWUsIG9wdGlvbnMsIGRlZmF1bF92YWx1ZSkge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBvcHRpb25zLmhhc093blByb3BlcnR5KG9wdGlvbl9uYW1lKSAmJiBcbiAgICAgICAgICAgb3B0aW9uc1tvcHRpb25fbmFtZV0gIT09IHVuZGVmaW5lZCAgJiYgXG4gICAgICAgICAgIG9wdGlvbnNbb3B0aW9uX25hbWVdICE9PSBudWxsID8gb3B0aW9uc1tvcHRpb25fbmFtZV0gOiBkZWZhdWxfdmFsdWU7XG4gIH07XG4gIFxuICAvKiogVmVyc2lvbiBvZiBnZXRfb3B0aW9uIHdoZXJlIHRoZSBvcHRpb24gc2hvdWxkIGJlIGEgb25lIG9yIG11bHRpLWRpbWVuc2lvbmFsXG4gICAqIGFycmF5IGFuZCB3aGVyZSB0aGUgZGVmYXVsdCBjYW4gYmUgb3ZlcnJpZGRlbiBlaXRoZXIgYnkgYSBzY2FsYXIgb3IgYnkgYW4gYXJyYXkuXG4gICAqIElmIGl0J3MgYSBzY2FsYXIgdGhlIHRoYXQgc2NhbGFyIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBhcnJheSB3aXRoIFxuICAgKiBkaW0gZGltZW5zaW9ucy5cbiAgICogXG4gICAqL1xuICB2YXIgZ2V0X211bHRpZGltX29wdGlvbiA9IGZ1bmN0aW9uKG9wdGlvbl9uYW1lLCBvcHRpb25zLCBkaW0sIGRlZmF1bF92YWx1ZSkge1xuICAgIHZhciB2YWx1ZSA9IGdldF9vcHRpb24ob3B0aW9uX25hbWUsIG9wdGlvbnMsIGRlZmF1bF92YWx1ZSk7XG4gICAgIGlmKCEgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICB2YWx1ZSA9IGNyZWF0ZV9hcnJheShkaW0sIHZhbHVlKTtcbiAgICAgfSBcbiAgICAgaWYoISBhcnJheV9lcXVhbCggYXJyYXlfZGltKHZhbHVlKSwgZGltKSkge1xuICAgICAgIHRocm93IFwiVGhlIG9wdGlvbiBcIiArIG9wdGlvbl9uYW1lICsgXCIgaXMgb2YgZGltZW5zaW9uIFtcIiArIFxuICAgICAgICAgICAgIGFycmF5X2RpbSh2YWx1ZSkgKyBcIl0gYnV0IHNob3VsZCBiZSBbXCIgKyBkaW0gKyBcIl0uXCI7XG4gICAgfVxuICAgICByZXR1cm4gdmFsdWU7XG4gIH07XG4gIFxuICAvLy8vLy8vLy8vIEZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgcGFyYW1ldGVyIG9iamVjdHMgLy8vLy8vLy8vL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgLyoqXG4gICAqIFJldHVybnMgYSBmaXhlZCAoc2FtZSBldmVyeSB0aW1lKSBudW1iZXIgdGhhdCBjb3VsZCBiZSB1c2VkIHRvIGluaXRpYWxpemVcbiAgICogYSBwYXJhbWV0ZXIgb2YgYSBjZXJ0YWluIHR5cGUsIHBvc3NpYmx5IHdpdGggbG93ZXIgYW5kIHVwcGVyIGJvdW5kcy5cbiAgICogVGhlIHBvc3NpbGUgdHlwZXMgYXJlIFwicmVhbFwiLCBcImludFwiLCBhbmQgXCJiaW5hcnlcIi5cbiAgICovXG4gIHZhciBwYXJhbV9pbml0X2ZpeGVkID0gZnVuY3Rpb24odHlwZSwgbG93ZXIsIHVwcGVyKSB7XG4gICAgaWYobG93ZXIgPiB1cHBlcikge1xuICAgICAgdGhyb3cgXCJDYW4gbm90IGluaXRpYWxpemUgcGFyYW1ldGVyIHdoZXJlIGxvd2VyIGJvdW5kID4gdXBwZXIgYm91bmRcIjtcbiAgICB9XG4gICAgaWYodHlwZSA9PT0gXCJyZWFsXCIpIHtcbiAgICAgIGlmKGxvd2VyID09PSAtSW5maW5pdHkgJiYgdXBwZXIgPT09IEluZmluaXR5KSB7XG4gICAgICAgIHJldHVybiAwLjU7XG4gICAgICB9IGVsc2UgaWYobG93ZXIgPT09IC1JbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gdXBwZXIgLSAwLjU7XG4gICAgICB9IGVsc2UgaWYodXBwZXIgPT09IEluZmluaXR5KSB7XG4gICAgICAgIHJldHVybiBsb3dlciArIDAuNTtcbiAgICAgIH0gZWxzZSBpZihsb3dlciA8PSB1cHBlcikge1xuICAgICAgICByZXR1cm4gKGxvd2VyICsgdXBwZXIpIC8gMjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYodHlwZSA9PT0gXCJpbnRcIikge1xuICAgICAgaWYobG93ZXIgPT09IC1JbmZpbml0eSAmJiB1cHBlciA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9IGVsc2UgaWYobG93ZXIgPT09IC1JbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gdXBwZXIgLSAxO1xuICAgICAgfSBlbHNlIGlmKHVwcGVyID09PSBJbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gbG93ZXIgKyAxO1xuICAgICAgfSBlbHNlIGlmKGxvd2VyIDw9IHVwcGVyKXtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoKGxvd2VyICsgdXBwZXIpIC8gMik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKHR5cGUgPT09IFwiYmluYXJ5XCIpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICB0aHJvdyBcIkNvdWxkIG5vdCBpbml0aWFsaXplIHBhcmFtZXRlciBvZiB0eXBlIFwiICsgdHlwZSArIFwiW1wiICsgbG93ZXIgKyBcIiwgXCIgKyB1cHBlciArIFwiXVwiO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIENvbXBsZXRlcyBwYXJhbXNfdG9fY29tcGxldGUsIGFuIG9iamVjdCBjb250YWluaW5nIHBhcmFtZXRlciBkZXNjcmlwdGlvbnMsIFxuICAgKiBhbmQgaW5pdGlhbGl6ZXMgbm9uLWluaXRpYWxpemVkIHBhcmFtZXRlcnMuIFRoaXMgbW9kaWZpZWQgdmVyc2lvbiBvZlxuICAgKiBwYXJhbXNfdG9fY29tcGxldGUgaXMgcmV0dXJuZWQgYXMgYSBkZWVwIGNvcHkgYW5kIG5vdCBtb2RpZmllZCBpbiBwbGFjZS5cbiAgICogSW5pdGlhbGl6YXRpb24gaXMgZG9uZSBieSBzdXBwbHlpbmcgYSBwYXJhbV9pbml0IGZ1bmN0aW9uIHdpdGggc2lnbmF0dXJlXG4gICAqIGZ1bmN0aW9uKHR5cGUsIGxvd2VyLCB1cHBlcikgdGhhdCBzaG91bGQgcmV0dXJuIGEgc2luZ2xlIG51bWJlciBcbiAgICogKGxpa2UgcGFyYW1faW5pdF9maXhlZCwgZm9yIGV4YW1wbGUpLlxuICAgKiBAZXhhbXBsZVxuICAgKiB2YXIgcGFyYW1zID0geyBcIm11XCI6IHtcInR5cGVcIjogXCJyZWFsXCJ9IH1cbiAgICogcGFyYW1zID0gY29tcGxldGVfcGFyYW1zKHBhcmFtcyk7XG4gICAqIC8vIHBhcmFtcyBzaG91bGQgbm93IGJlOlxuICAgKiAvLyAge1wibXVcIjogeyBcInR5cGVcIjogXCJyZWFsXCIsIFwiZGltXCI6IFsxXSwgXCJ1cHBlclwiOiBJbmZpbml0eSxcbiAgICogLy8gICAgICAgICAgIFwibG93ZXJcIjogLUluZmluaXR5LCBcImluaXRcIjogMC41IH19XG4gICAqLyBcbiAgdmFyIGNvbXBsZXRlX3BhcmFtcyAgPSBmdW5jdGlvbihwYXJhbXNfdG9fY29tcGxldGUsIHBhcmFtX2luaXQpIHtcbiAgICB2YXIgcGFyYW1zID0gZGVlcF9jbG9uZShwYXJhbXNfdG9fY29tcGxldGUpO1xuICAgIGZvciAodmFyIHBhcmFtX25hbWUgaW4gcGFyYW1zKSB7IGlmICghcGFyYW1zLmhhc093blByb3BlcnR5KHBhcmFtX25hbWUpKSBjb250aW51ZTtcbiAgICAgIHZhciBwYXJhbSA9IHBhcmFtc1twYXJhbV9uYW1lXTtcbiAgICAgIGlmKCAhcGFyYW0uaGFzT3duUHJvcGVydHkoXCJ0eXBlXCIpKSB7XG4gICAgICAgIHBhcmFtLnR5cGUgPSBcInJlYWxcIjtcbiAgICAgIH1cbiAgICAgIGlmKCFwYXJhbS5oYXNPd25Qcm9wZXJ0eShcImRpbVwiKSkge1xuICAgICAgICBwYXJhbS5kaW0gPSBbMV07XG4gICAgICB9XG4gICAgICBpZihpc19udW1iZXIocGFyYW0uZGltKSkge1xuICAgICAgICBwYXJhbS5kaW0gPSBbcGFyYW0uZGltXTtcbiAgICAgIH1cbiAgICAgIGlmKHBhcmFtLnR5cGUgPT0gXCJiaW5hcnlcIikge1xuICAgICAgICBwYXJhbS51cHBlciA9IDE7XG4gICAgICAgIHBhcmFtLmxvd2VyID0gMDtcbiAgICAgIH1cbiAgICAgIGlmKCFwYXJhbS5oYXNPd25Qcm9wZXJ0eShcInVwcGVyXCIpKSB7XG4gICAgICAgIHBhcmFtLnVwcGVyID0gSW5maW5pdHk7XG4gICAgICB9XG4gICAgICBpZighcGFyYW0uaGFzT3duUHJvcGVydHkoXCJsb3dlclwiKSkge1xuICAgICAgICBwYXJhbS5sb3dlciA9IC1JbmZpbml0eTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYocGFyYW0uaGFzT3duUHJvcGVydHkoXCJpbml0XCIpKSB7XG4gICAgICAgIC8vIElmIHRoaXMgaXMganVzdCBhIG51bWJlciBvciBhIG5lc3RlZCBhcnJheSB3ZSBsZWF2ZSBpdCBhbG9uZSwgYnV0IGlmLi4uXG4gICAgICAgIGlmKGFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSAmJiB0eXBlb2YgcGFyYW0uaW5pdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gcGFyYW0uaW5pdCBpcyBhIGZ1bmN0aW9uLCB1c2UgdGhhdCB0byBpbml0aWFsaXplIHRoZSBwYXJhbWV0ZXIuXG4gICAgICAgICAgcGFyYW0uaW5pdCA9IHBhcmFtLmluaXQoKTtcbiAgICAgICAgfSBlbHNlIGlmKCFhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0uaW5pdCkpIHtcbiAgICAgICAgLy8gV2UgaGF2ZSBhIG11bHRpZGltZW5zaW9uYWwgcGFyYW1ldGVyIHdoZXJlIHRoZSBwYXJhbS5pbml0IGV4aXN0IGJ1dFxuICAgICAgICAvLyBpcyBub3QgYW4gYXJyYXkuIFRoZW4gYXNzdW1lIGl0IGlzIGEgbnVtYmVyIG9yIGEgZnVuY3Rpb24gYW5kIHVzZVxuICAgICAgICAvLyBpdCB0byBpbml0aWFsaXplIHRoZSBwYXJhbWV0ZXIuXG4gICAgICAgIHBhcmFtLmluaXQgPSBjcmVhdGVfYXJyYXkocGFyYW0uZGltLCBwYXJhbS5pbml0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHsgLy8gV2UgdXNlIHRoZSBkZWZhdWx0IGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLlxuICAgICAgICBpZihhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHtcbiAgICAgICAgICBwYXJhbS5pbml0ID0gcGFyYW1faW5pdChwYXJhbS50eXBlLCBwYXJhbS5sb3dlciwgcGFyYW0udXBwZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcmFtLmluaXQgPSBjcmVhdGVfYXJyYXkocGFyYW0uZGltLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbV9pbml0KHBhcmFtLnR5cGUsIHBhcmFtLmxvd2VyLCBwYXJhbS51cHBlcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfTtcbiAgXG4gIFxuICAvLy8vLy8vLy8vIFN0ZXBwZXIgRnVuY3Rpb25zIC8vLy8vLy8vLy8vXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgXG4gIFxuICAvKipcbiAgICogQGludGVyZmFjZVxuICAgKiBBIFN0ZXBwZXIgaXMgYW4gb2JqZWN0IHJlc3BvbnNpYmxlIGZvciBwdXNoaW5nIGFyb3VuZCBvbmVcbiAgICogb3IgbW9yZSBwYXJhbWV0ZXIgdmFsdWVzIGluIGEgc3RhdGUgYWNjb3JkaW5nIHRvIHRoZSBkaXN0cmlidXRpb25cbiAgICogZGVmaW5lZCBieSB0aGUgbG9nIHBvc3Rlcmlvci4gVGhpcyBkZWZpbmVzIHRoZSBTdGVwcGVyIFwiaW50ZXJmYWNlXCIsXG4gICAqIHdoZXJlIFwiaW50ZXJmYWNlXCIgbWVhbnMgdGhhdCBTdGVwcGVyIGRlZmluZXMgYSBjbGFzcyB0aGF0IGlzIG5ldmVyXG4gICAqIG1lYW50IHRvIGJlIGluc3RhbnRpYXRlZCwgYnV0IGp1c3QgdG8gYmUgc3ViY2xhc3NlZCBieSBzcGVjaWFsaXplZFxuICAgKiBzdGVwcGVyIGZ1bmN0aW9ucy5cbiAgICogQGludGVyZmFjZVxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggcGFyYW1ldGVyIGRlZmluaXRpb25zLCBmb3IgZXhhbXBsZTpcbiAgICogICB7XCJtdVwiOiB7IFwidHlwZVwiOiBcInJlYWxcIiwgXCJkaW1cIjogWzFdLCBcInVwcGVyXCI6IEluZmluaXR5LCBcbiAgICogICBcImxvd2VyXCI6IC1JbmZpbml0eSwgXCJpbml0XCI6IDAuNSB9fVxuICAgKiAgIFRoZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMgYXJlIGV4cGVjdGVkIHRvIGJlIFwiY29tcGxldGVcIiwgdGhhdCBpcyxcbiAgICogICBzcGVjaWZ5aW5nIGFsbCByZWxldmFudCBhdHRyaWJ1dGVzIHN1Y2ggYXMgZGltLCBsb3dlciBhbmQgdXBwZXIuXG4gICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycyBpbiBwYXJhbXNcbiAgICogICAoYW5kIHBvc3NpYmx5IG1vcmUpLiBUaGUgcGFyYW1ldGVyIG5hbWVzIGFyZSBnaXZlbiBhcyBrZXlzIGFuZCB0aGUgc3RhdGVzXG4gICAqICAgYXMgc2NhbGFycyBvciwgcG9zc2libHkgbmVzdGVkLCBhcnJheXMuIEZvciBleGFtcGxlOlxuICAgKiAgIHttdTogMTAsIHNpZ21hOiA1LCBiZXRhOiBbMSwgMi41XX1cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiAqdGFraW5nIG5vIHBhcmFtZXRlcnMqIHRoYXQgcmV0dXJucyB0aGVcbiAgICogICBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiBUaGF0IGlzLCB0aGUgdmFsdWUgb2YgbG9nX3Bvc3RcbiAgICogICBzaG91bGQgY2hhbmdlIGlmIHRoZSB0aGUgdmFsdWVzIGluIHN0YXRlIGFyZSBjaGFuZ2VkLlxuICBcbiAgICovXG4gIHZhciBTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpIHtcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgdGhpcy5sb2dfcG9zdCA9IGxvZ19wb3N0O1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFRha2VzIGEgc3RlcCBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlLiBTaG91bGQgcmV0dXJuIHRoZSBuZXcgc3RhdGUsXG4gICAqIGJ1dCBpcyBtYWlubHkgY2FsbGVkIGZvciBpdCdzIHNpZGUgZWZmZWN0IG9mIG1ha2luZyBhIGNoYW5nZSBpbiB0aGVcbiAgICogc3RhdGUgb2JqZWN0LlxuICAgKi9cbiAgU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIHRocm93IFwiRXZlcnkgU3RlcHBlciBuZWVkIHRvIGltcGxlbWVudCBzdGVwKClcIjtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBJZiBpbXBsZW1lbnRlZCwgbWFrZXMgdGhlIHN0ZXBwZXIgYWRhcHQgd2hpbGUgc3RlcHBpbmcuXG4gICAqLyBcbiAgU3RlcHBlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIE9wdGlvbmFsLCBzb21lIHN0ZXBwZXJzIG1pZ2h0IG5vdCBiZSBhZGFwdGl2ZS4gKi8gXG4gIH07XG4gIFxuICAvKipcbiAgICogSWYgaW1wbGVtZW50ZWQsIG1ha2VzIHRoZSBzdGVwcGVyIGNlYXNlIGFkYXB0aW5nIHdoaWxlIHN0ZXBwaW5nLlxuICAgKi8gXG4gIFN0ZXBwZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIE9wdGlvbmFsLCBzb21lIHN0ZXBwZXJzIG1pZ2h0IG5vdCBiZSBhZGFwdGl2ZS4gKi8gXG4gIH07XG4gIFxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3QgY29udGFpbmcgaW5mbyByZWdhcmRpbmcgdGhlIHN0ZXBwZXIuXG4gICAqLyBcbiAgU3RlcHBlci5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIFJldHVybnMgYW4gb2JqZWN0IHdpdGggaW5mbyBhYm91dCB0aGUgc3RhdGUgb2YgdGhlIHN0ZXBwZXIuXG4gICAgcmV0dXJuIHt9O1xuICB9O1xuICBcbiAgXG4gIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGltcGxlbWVudHMge1N0ZXBwZXJ9XG4gICAqIENvbnN0cnVjdG9yIGZvciBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoZSBtZXRyb3BvbGlzIHN0ZXAgaW5cbiAgICogdGhlIEFkYXB0aXZlIE1ldHJvcG9saXMtV2l0aGluLUdpYmJzIGFsZ29yaXRobSBpbiBcIkV4YW1wbGVzIG9mIEFkYXB0aXZlIE1DTUNcIlxuICAgKiBieSBSb2JlcnRzIGFuZCBSb3NlbnRoYWwgKDIwMDgpLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyIGRlZmluaXRpb24uXG4gICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuXG4gICAqIEBwYXJhbSBnZW5lcmF0ZV9wcm9wb3NhbCAtIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgcHJvcG9zYWwgKGFzIGEgbnVtYmVyKVxuICAgKiB3aXRoIHNpZ25hdHVyZSBmdW5jdGlvbihwYXJhbV9zdGF0ZSwgbG9nX3NjYWxlKSB3aGVyZSBwYXJhbV9zdGF0ZSBpcyBhXG4gICAqIG51bWJlciBhbmQgbG9nX3NjYWxlIGRlZmluZXMgdGhlIHNjYWxlIG9mIHRoZSBwcm9wb3NhbCBzb21laG93LlxuICAqL1xuICB2YXIgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgZ2VuZXJhdGVfcHJvcG9zYWwpIHtcbiAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpO1xuICAgIFxuICAgIHZhciBwYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTtcbiAgICBpZihwYXJhbV9uYW1lcy5sZW5ndGggICE9IDEpIHtcbiAgICAgIHRocm93IFwiT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgY2FuIG9ubHkgaGFuZGxlIG9uZSBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICAgIHRoaXMucGFyYW1fbmFtZSA9IHBhcmFtX25hbWVzWzBdO1xuICAgIHZhciBwYXJhbSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZV07XG4gICAgaWYoIWFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSkge1xuICAgICAgdGhyb3cgXCJPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciBjYW4gb25seSBoYW5kbGUgb25lIG9uZS1kaW1lbnNpb25hbCBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICAgIHRoaXMubG93ZXIgPSBwYXJhbS5sb3dlcjtcbiAgICB0aGlzLnVwcGVyID0gcGFyYW0udXBwZXI7XG4gICAgXG4gICAgdGhpcy5wcm9wX2xvZ19zY2FsZSAgICAgPSBnZXRfb3B0aW9uKFwicHJvcF9sb2dfc2NhbGVcIiwgb3B0aW9ucywgMCk7XG4gICAgdGhpcy5iYXRjaF9zaXplICAgICAgICAgPSBnZXRfb3B0aW9uKFwiYmF0Y2hfc2l6ZVwiLCBvcHRpb25zLCA1MCk7XG4gICAgdGhpcy5tYXhfYWRhcHRhdGlvbiAgICAgPSBnZXRfb3B0aW9uKFwibWF4X2FkYXB0YXRpb25cIiwgb3B0aW9ucywgMC4zMyk7XG4gICAgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24gPSBnZXRfb3B0aW9uKFwiaW5pdGlhbF9hZGFwdGF0aW9uXCIsIG9wdGlvbnMsIDEuMCk7XG4gICAgdGhpcy50YXJnZXRfYWNjZXB0X3JhdGUgPSBnZXRfb3B0aW9uKFwidGFyZ2V0X2FjY2VwdF9yYXRlXCIsIG9wdGlvbnMsIDAuNDQpO1xuICAgIHRoaXMuaXNfYWRhcHRpbmcgICAgICAgID0gZ2V0X29wdGlvbihcImlzX2FkYXB0aW5nXCIsIG9wdGlvbnMsIHRydWUpO1xuICAgIFxuICAgIHRoaXMuZ2VuZXJhdGVfcHJvcG9zYWwgPSBnZW5lcmF0ZV9wcm9wb3NhbDtcbiAgICBcbiAgICB0aGlzLmFjY2VwdGFuY2VfY291bnQgPSAwO1xuICAgIHRoaXMuYmF0Y2hfY291bnQgPSAwO1xuICAgIHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiA9IDA7ICBcbiAgfTtcbiAgXG4gIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gT25lZGltTWV0cm9wb2xpc1N0ZXBwZXI7XG4gIFxuICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHBhcmFtX3N0YXRlID0gdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdO1xuICAgICAgdmFyIHBhcmFtX3Byb3Bvc2FsID0gdGhpcy5nZW5lcmF0ZV9wcm9wb3NhbChwYXJhbV9zdGF0ZSwgdGhpcy5wcm9wX2xvZ19zY2FsZSk7XG4gICAgICBpZihwYXJhbV9wcm9wb3NhbCA8IHRoaXMubG93ZXIgfHwgcGFyYW1fcHJvcG9zYWwgPiB0aGlzLnVwcGVyKSB7XG4gICAgICAgIC8vIE91dHNpZGUgb2YgbGltaXRzIG9mIHRoZSBwYXJhbWV0ZXIsIHJlamVjdCB0aGUgcHJvcG9zYWwgXG4gICAgICAgIC8vIGFuZCBzdGF5IGF0IHRoZSBjdXJyZW50IHN0YXRlLlxuICAgICAgfSBlbHNlIHsgLy8gbWFrZSBhIE1ldHJvcG9saXMgc3RlcFxuICAgICAgICB2YXIgY3Vycl9sb2dfZGVucyA9IHRoaXMubG9nX3Bvc3QoKTtcbiAgICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gcGFyYW1fcHJvcG9zYWw7XG4gICAgICAgIHZhciBwcm9wX2xvZ19kZW5zID0gdGhpcy5sb2dfcG9zdCgpO1xuICAgICAgICB2YXIgYWNjZXB0X3Byb2IgPSBNYXRoLmV4cChwcm9wX2xvZ19kZW5zIC0gY3Vycl9sb2dfZGVucyk7XG4gICAgICAgIGlmKGFjY2VwdF9wcm9iID4gTWF0aC5yYW5kb20oKSkge1xuICAgICAgICAgIC8vIFdlIGRvIG5vdGhpbmcgYXMgdGhlIHN0YXRlIG9mIHBhcmFtIGhhcyBhbHJlYWR5IGJlZW4gY2hhbmdlZCB0byB0aGUgcHJvcG9zYWxcbiAgICAgICAgICBpZih0aGlzLmlzX2FkYXB0aW5nKSB0aGlzLmFjY2VwdGFuY2VfY291bnQrKyA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gcmV2ZXJ0IHN0YXRlIGJhY2sgdG8gdGhlIG9sZCBzdGF0ZSBvZiBwYXJhbVxuICAgICAgICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IHBhcmFtX3N0YXRlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZih0aGlzLmlzX2FkYXB0aW5nKSB7XG4gICAgICAgIHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiArKztcbiAgICAgICAgaWYodGhpcy5pdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uID49IHRoaXMuYmF0Y2hfc2l6ZSkgeyAvLyB0aGVuIGFkYXB0XG4gICAgICAgICAgdGhpcy5iYXRjaF9jb3VudCArKztcbiAgICAgICAgICB2YXIgbG9nX3NkX2FkanVzdG1lbnQgPSBcbiAgICAgICAgICAgIE1hdGgubWluKHRoaXMubWF4X2FkYXB0YXRpb24sIFxuICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24gLyBNYXRoLnNxcnQodGhpcy5iYXRjaF9jb3VudCkpO1xuICAgICAgICAgIGlmKHRoaXMuYWNjZXB0YW5jZV9jb3VudCAvIHRoaXMuYmF0Y2hfc2l6ZSA+IHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BfbG9nX3NjYWxlICs9IGxvZ19zZF9hZGp1c3RtZW50O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByb3BfbG9nX3NjYWxlIC09IGxvZ19zZF9hZGp1c3RtZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmFjY2VwdGFuY2VfY291bnQgPSAwO1xuICAgICAgICAgIHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV07XG4gIH07XG4gIFxuICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuaXNfYWRhcHRpbmcgPSB0cnVlO1xuICB9O1xuICBcbiAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuaXNfYWRhcHRpbmcgPSBmYWxzZTtcbiAgfTtcbiAgXG4gIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5pbmZvID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByb3BfbG9nX3NjYWxlOiB0aGlzLnByb3BfbG9nX3NjYWxlLFxuICAgICAgaXNfYWRhcHRpbmc6IHRoaXMuaXNfYWRhcHRpbmcsXG4gICAgICBhY2NlcHRhbmNlX2NvdW50OiB0aGlzLmFjY2VwdGFuY2VfY291bnQsXG4gICAgICBpdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uOiB0aGlzLml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24sXG4gICAgICBiYXRjaF9jb3VudDogdGhpcy5iYXRjaF9jb3VudFxuICAgIH07XG4gIH07XG4gIFxuICBcbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHJldHVybmluZyBhIE5vcm1hbCBwcm9wb3NhbC5cbiAgICovXG4gIHZhciBub3JtYWxfcHJvcG9zYWwgPSBmdW5jdGlvbihwYXJhbV9zdGF0ZSwgcHJvcF9sb2dfc2NhbGUpIHtcbiAgICByZXR1cm4gcm5vcm0ocGFyYW1fc3RhdGUgLCBNYXRoLmV4cChwcm9wX2xvZ19zY2FsZSkpO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAYXVnbWVudHMge09uZWRpbU1ldHJvcG9saXNTdGVwcGVyfVxuICAgKiBBIFwic3ViY2xhc3NcIiBvZiBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciBtYWtpbmcgY29udGlub3VzIE5vcm1hbCBwcm9wb3NhbHMuXG4gICAqL1xuICB2YXIgUmVhbE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHtcbiAgICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zLCBub3JtYWxfcHJvcG9zYWwpO1xuICB9O1xuICBcbiAgUmVhbE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlKTsgXG4gIFJlYWxNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSZWFsTWV0cm9wb2xpc1N0ZXBwZXI7XG4gIFxuICAvKipcbiAgICogRnVuY3Rpb24gcmV0dXJuaW5nIGEgZGlzY3JldGl6ZWQgTm9ybWFsIHByb3Bvc2FsLlxuICAgKi9cbiAgdmFyIGRpc2NyZXRlX25vcm1hbF9wcm9wb3NhbCA9IGZ1bmN0aW9uKHBhcmFtX3N0YXRlLCBwcm9wX2xvZ19zY2FsZSkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHJub3JtKHBhcmFtX3N0YXRlICwgTWF0aC5leHAocHJvcF9sb2dfc2NhbGUpKSk7XG4gIH07XG4gIFxuICAgIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGF1Z21lbnRzIHtPbmVkaW1NZXRyb3BvbGlzU3RlcHBlcn1cbiAgICogQSBcInN1YmNsYXNzXCIgb2YgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgbWFraW5nIGRpc2NyZXRpemVkIE5vcm1hbCBwcm9wb3NhbHMuXG4gICAqL1xuICB2YXIgSW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIGRpc2NyZXRlX25vcm1hbF9wcm9wb3NhbCk7XG4gIH07XG4gIFxuICBJbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7IFxuICBJbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbnRNZXRyb3BvbGlzU3RlcHBlcjtcbiAgXG4gIFxuICAvKipcbiAgICogQGNsYXNzXG4gICAqIEBpbXBsZW1lbnRzIHtTdGVwcGVyfVxuICAgKiBDb25zdHJ1Y3RvciBmb3IgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgbWV0cm9wb2xpcyBzdGVwIGluXG4gICAqIHRoZSBBZGFwdGl2ZSBNZXRyb3BvbGlzLVdpdGhpbi1HaWJicyBhbGdvcml0aG0gaW4gXCJFeGFtcGxlcyBvZiBBZGFwdGl2ZSBNQ01DXCJcbiAgICogYnkgUm9iZXJ0cyBhbmQgUm9zZW50aGFsICgyMDA4KSBmb3IgcG9zc2libHkgbXVsdGlkaW1lbnNpb25hbCBhcnJheXMuIFRoYXRcbiAgICogaXMsIGluc3RlYWQgb2YganVzdCB0YWtpbmcgYSBzdGVwIGZvciBhIG9uZS1kaW1lbnNpb25hbCBwYXJhbWV0ZXIgbGlrZSBcbiAgICogT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIsIHRoaXMgU3RlcHBlciBpcyByZXNwb25zaWJsZSBmb3IgdGFraW5nIHN0ZXBzIFxuICAgKiBmb3IgYSBtdWx0aWRpbWVuc2lvbmFsIGFycmF5LiBJdCdzIHN0aWxsIHByZXR0eSBkdW1iIGFuZCBqdXN0IHRha2VzXG4gICAqIG9uZS1kaW1lbnNpb25hbCBzdGVwcyBmb3IgZWFjaCBwYXJhbWV0ZXIgY29tcG9uZW50LCB0aG91Z2guXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBmb3IgYSBcbiAgICogICBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlci5cbiAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gbG9nX3Bvc3QgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci5cbiAgICogQHBhcmFtIFN1YlN0ZXBwZXIgLSBhIGNvbnN0cnVjdG9yIGZvciB0aGUgdHlwZSBvZiBvbmUgZGltZW5zaW9uYWwgU3RlcHBlciB0byBhcHBseSBvblxuICAgKiAgIGFsbCB0aGUgY29tcG9uZW50cyBvZiB0aGUgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIuXG4gICovXG4gIHZhciBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIFN1YlN0ZXBwZXIpIHtcbiAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpO1xuICAgIFxuICAgIHZhciBwYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTtcbiAgICBpZihwYXJhbV9uYW1lcy5sZW5ndGggICE9IDEpIHtcbiAgICAgIHRocm93IFwiTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciBjYW4ndCBoYW5kbGUgbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICAgIHRoaXMucGFyYW1fbmFtZSA9IHBhcmFtX25hbWVzWzBdO1xuICAgIHZhciBwYXJhbSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZV07XG4gICAgdGhpcy5sb3dlciA9IHBhcmFtLmxvd2VyO1xuICAgIHRoaXMudXBwZXIgPSBwYXJhbS51cHBlcjtcbiAgICB0aGlzLmRpbSA9IHBhcmFtLmRpbTtcbiAgXG4gICAgdGhpcy5wcm9wX2xvZ19zY2FsZSAgICAgPSBnZXRfbXVsdGlkaW1fb3B0aW9uKFwicHJvcF9sb2dfc2NhbGVcIiwgb3B0aW9ucywgdGhpcy5kaW0sIDApO1xuICAgIHRoaXMuYmF0Y2hfc2l6ZSAgICAgICAgID0gZ2V0X211bHRpZGltX29wdGlvbihcImJhdGNoX3NpemVcIiwgb3B0aW9ucywgdGhpcy5kaW0sIDUwKTtcbiAgICB0aGlzLm1heF9hZGFwdGF0aW9uICAgICA9IGdldF9tdWx0aWRpbV9vcHRpb24oXCJtYXhfYWRhcHRhdGlvblwiLCBvcHRpb25zLCB0aGlzLmRpbSwgMC4zMyk7XG4gICAgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24gPSBnZXRfbXVsdGlkaW1fb3B0aW9uKFwiaW5pdGlhbF9hZGFwdGF0aW9uXCIsIG9wdGlvbnMsIHRoaXMuZGltLCAxLjApO1xuICAgIHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlID0gZ2V0X211bHRpZGltX29wdGlvbihcInRhcmdldF9hY2NlcHRfcmF0ZVwiLCBvcHRpb25zLCB0aGlzLmRpbSwgMC40NCk7XG4gICAgdGhpcy5pc19hZGFwdGluZyAgICAgICAgPSBnZXRfbXVsdGlkaW1fb3B0aW9uKFwiaXNfYWRhcHRpbmdcIiwgb3B0aW9ucywgdGhpcy5kaW0sIHRydWUpO1xuICAgIFxuICAgIC8vIFRoaXMgaGFjayBiZWxvdyBpcyBhIHJlY3Vyc2l2ZSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW4gYXJyYXkgb2YgXG4gICAgLy8gb25lIGRpbWVuc2lvbmFsIHN0ZXBwZXJzIGFjY29yZGluZyB0byBkaW0uXG4gICAgdmFyIGNyZWF0ZV9zdWJzdGVwcGVycyA9IFxuICAgICAgZnVuY3Rpb24oZGltLCBzdWJzdGF0ZSwgbG9nX3Bvc3QsIHByb3BfbG9nX3NjYWxlLCBiYXRjaF9zaXplLCBtYXhfYWRhcHRhdGlvbiwgaW5pdGlhbF9hZGFwdGF0aW9uLCB0YXJnZXRfYWNjZXB0X3JhdGUsIGlzX2FkYXB0aW5nKSB7XG4gICAgICB2YXIgc3Vic3RlcHBlcnMgPSBbXTtcbiAgICAgIGlmKGRpbS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7XG4gICAgICAgICAgdmFyIHN1Ym9wdGlvbnMgPSB7cHJvcF9sb2dfc2NhbGU6IHByb3BfbG9nX3NjYWxlW2ldLCBiYXRjaF9zaXplOiBiYXRjaF9zaXplW2ldLFxuICAgICAgICAgICAgbWF4X2FkYXB0YXRpb246IG1heF9hZGFwdGF0aW9uW2ldLCBpbml0aWFsX2FkYXB0YXRpb246IGluaXRpYWxfYWRhcHRhdGlvbltpXSxcbiAgICAgICAgICAgIHRhcmdldF9hY2NlcHRfcmF0ZTogdGFyZ2V0X2FjY2VwdF9yYXRlW2ldLCBpc19hZGFwdGluZzogaXNfYWRhcHRpbmdbaV19O1xuICAgICAgICAgICAgdmFyIHN1YnBhcmFtID0ge307XG4gICAgICAgICAgICBzdWJwYXJhbVtpXSA9IGRlZXBfY2xvbmUocGFyYW0pO1xuICAgICAgICAgICAgc3VicGFyYW1baV0uZGltID0gWzFdOyAvLyBBcyB0aGlzIHNob3VsZCBub3cgYmUgYSBvbmUtZGltIHBhcmFtZXRlclxuICAgICAgICAgICAgZGVsZXRlIHN1YnBhcmFtW2ldLmluaXQ7IC8vIEFzIGl0IHNvdWxkIG5vdCBiZSBuZWVkZWRcbiAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IG5ldyBTdWJTdGVwcGVyKHN1YnBhcmFtLCBzdWJzdGF0ZSwgbG9nX3Bvc3QsIHN1Ym9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IGNyZWF0ZV9zdWJzdGVwcGVycyhkaW0uc2xpY2UoMSksIHN1YnN0YXRlW2ldLCBsb2dfcG9zdCwgcHJvcF9sb2dfc2NhbGVbaV0sIFxuICAgICAgICAgICAgYmF0Y2hfc2l6ZVtpXSwgbWF4X2FkYXB0YXRpb25baV0sIGluaXRpYWxfYWRhcHRhdGlvbltpXSwgdGFyZ2V0X2FjY2VwdF9yYXRlW2ldLCBpc19hZGFwdGluZ1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdWJzdGVwcGVycztcbiAgICB9O1xuICAgIFxuICAgIHRoaXMuc3Vic3RlcHBlcnMgPSBjcmVhdGVfc3Vic3RlcHBlcnModGhpcy5kaW0sIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSwgdGhpcy5sb2dfcG9zdCxcbiAgICAgIHRoaXMucHJvcF9sb2dfc2NhbGUsIHRoaXMuYmF0Y2hfc2l6ZSwgdGhpcy5tYXhfYWRhcHRhdGlvbiwgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24sXG4gICAgICB0aGlzLnRhcmdldF9hY2NlcHRfcmF0ZSwgdGhpcy5pc19hZGFwdGluZyk7XG4gICAgXG4gIH07XG4gIFxuICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyO1xuICBcbiAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIEdvIHRocm91Z2ggdGhlIHN1YnN0ZXBwZXJzIGluIGEgcmFuZG9tIG9yZGVyIGFuZCBjYWxsIHN0ZXAoKSBvbiB0aGVtLlxuICAgIHJldHVybiBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uKHN1YnN0ZXBwZXIpIHtyZXR1cm4gc3Vic3RlcHBlci5zdGVwKCk7IH0pO1xuICB9O1xuICBcbiAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIG5lc3RlZF9hcnJheV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbihzdWJzdGVwcGVyKSB7c3Vic3RlcHBlci5zdGFydF9hZGFwdGF0aW9uKCk7IH0pO1xuICB9O1xuICBcbiAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgbmVzdGVkX2FycmF5X2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uKHN1YnN0ZXBwZXIpIHtzdWJzdGVwcGVyLnN0b3BfYWRhcHRhdGlvbigpOyB9KTtcbiAgfTtcbiAgXG4gIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmVzdGVkX2FycmF5X2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uKHN1YnN0ZXBwZXIpIHtcbiAgICAgIHJldHVybiBzdWJzdGVwcGVyLmluZm8oKTsgXG4gICAgfSk7XG4gIH07XG4gIFxuICAvKipcbiAgICogQGNsYXNzXG4gICAqIEBhdWdtZW50cyB7TXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcn1cbiAgICogQSBcInN1YmNsYXNzXCIgb2YgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciBtYWtpbmcgY29udGlub3VzIE5vcm1hbCBwcm9wb3NhbHMuXG4gICAqL1xuICB2YXIgTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgUmVhbE1ldHJvcG9saXNTdGVwcGVyKTtcbiAgfTtcbiAgXG4gIE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI7XG5cbiAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAYXVnbWVudHMge011bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXJ9XG4gICAqIEEgXCJzdWJjbGFzc1wiIG9mIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgbWFraW5nIGRpc2NyZXRpemVkIE5vcm1hbCBwcm9wb3NhbHMuXG4gICAqLyAgICBcbiAgdmFyIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgSW50TWV0cm9wb2xpc1N0ZXBwZXIpO1xuICB9O1xuICBcbiAgTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlKTsgXG4gIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjtcbiAgXG4gIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGltcGxlbWVudHMge1N0ZXBwZXJ9XG4gICAqIENvbnN0cnVjdG9yIGZvciBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIGEgc3RlcCBmb3IgYSBiaW5hcnkgcGFyYW1ldGVyLlxuICAgKiBUaGlzIGlzIGRvbmUgYnkgZXZhbHVhdGluZyB0aGUgbG9nIHBvc3RlcmlvciBmb3IgYm90aCBzdGF0ZXMgb2YgdGhlXG4gICAqIHBhcmFtZXRlciBhbmQgdGhlbiBzZWxlY3RpbmcgYSBzdGF0ZSByYW5kb21seSB3aXRoIHByb2JhYmlsaXR5IHJlbGF0aXZlIFxuICAgKiB0byB0aGUgcG9zdGVyaW9yIG9mIGVhY2ggc3RhdGUuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbi5cbiAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gbG9nX3Bvc3QgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci5cbiAgKi9cbiAgdmFyIEJpbmFyeVN0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIFN0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCk7XG4gICAgdmFyIHBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpO1xuICAgIGlmKHBhcmFtX25hbWVzLmxlbmd0aCAgPT0gMSkge1xuICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IFwiQmluYXJ5U3RlcHBlciBjYW4ndCBoYW5kbGUgbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICB9O1xuICBcbiAgQmluYXJ5U3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN0ZXBwZXIucHJvdG90eXBlKTsgXG4gIEJpbmFyeVN0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQmluYXJ5U3RlcHBlcjtcbiAgXG4gIEJpbmFyeVN0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0gPSAwO1xuICAgIHZhciB6ZXJvX2xvZ19kZW5zID0gdGhpcy5sb2dfcG9zdCgpO1xuICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IDE7XG4gICAgdmFyIG9uZV9sb2dfZGVucyA9IHRoaXMubG9nX3Bvc3QoKTtcbiAgICB2YXIgbWF4X2xvZ19kZW5zID0gTWF0aC5tYXgoemVyb19sb2dfZGVucywgb25lX2xvZ19kZW5zKTtcbiAgICB6ZXJvX2xvZ19kZW5zIC09IG1heF9sb2dfZGVucztcbiAgICBvbmVfbG9nX2RlbnMgLT0gbWF4X2xvZ19kZW5zO1xuICAgIHZhciB6ZXJvX3Byb2IgPSBNYXRoLmV4cCh6ZXJvX2xvZ19kZW5zIC0gTWF0aC5sb2coIE1hdGguZXhwKHplcm9fbG9nX2RlbnMpICsgTWF0aC5leHAob25lX2xvZ19kZW5zKSApICk7XG4gICAgaWYoTWF0aC5yYW5kb20oKSA8IHplcm9fcHJvYikge1xuICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gMDtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gLy8gZWxzZSBrZWVwIHRoZSBwYXJhbSBhdCAxIC5cbiAgICByZXR1cm4gMTtcbiAgfTtcbiAgXG4gICAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn1cbiAgICogSnVzdCBsaWtlIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgdGhpcyBTdGVwcGVyIHRha2VzIGEgc3RlcHMgZm9yXG4gICAqIGEgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIgYnkgdXBkYXRpbmcgZWFjaCBjb21wb25lbnQgaW4gdHVybi4gVGhlIGRpZmZlcmVuY2VcbiAgICogaXMgdGhhdCB0aGlzIHN0ZXBwZXIgd29ya3Mgb24gYmluYXJ5IHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBmb3IgYSBcbiAgICogICBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlci5cbiAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gbG9nX3Bvc3QgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci5cbiAgKi9cbiAgdmFyIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIFN0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCk7XG4gICAgXG4gICAgdmFyIHBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpO1xuICAgIGlmKHBhcmFtX25hbWVzLmxlbmd0aCAgPT0gMSkge1xuICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07XG4gICAgICB2YXIgcGFyYW0gPSB0aGlzLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVdO1xuICAgICAgdGhpcy5kaW0gPSBwYXJhbS5kaW07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IFwiQmluYXJ5Q29tcG9uZW50U3RlcHBlciBjYW4ndCBoYW5kbGUgbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICAgIFxuICAgIHZhciBjcmVhdGVfc3Vic3RlcHBlcnMgPSBcbiAgICAgIGZ1bmN0aW9uKGRpbSwgc3Vic3RhdGUsIGxvZ19wb3N0KSB7XG4gICAgICB2YXIgc3Vic3RlcHBlcnMgPSBbXTtcbiAgICAgIHZhciBpO1xuICAgICAgaWYoZGltLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBmb3IoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykge1xuICAgICAgICAgIHZhciBzdWJwYXJhbXMgPSB7fTtcbiAgICAgICAgICBzdWJwYXJhbXNbaV0gPSBwYXJhbTtcbiAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IG5ldyBCaW5hcnlTdGVwcGVyKHN1YnBhcmFtcywgc3Vic3RhdGUsIGxvZ19wb3N0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IGNyZWF0ZV9zdWJzdGVwcGVycyhkaW0uc2xpY2UoMSksIHN1YnN0YXRlW2ldLCBsb2dfcG9zdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdWJzdGVwcGVycztcbiAgICB9O1xuICAgIFxuICAgIHRoaXMuc3Vic3RlcHBlcnMgPSBjcmVhdGVfc3Vic3RlcHBlcnModGhpcy5kaW0sIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSwgdGhpcy5sb2dfcG9zdCk7XG4gIH07XG4gIFxuICBCaW5hcnlDb21wb25lbnRTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgQmluYXJ5Q29tcG9uZW50U3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCaW5hcnlDb21wb25lbnRTdGVwcGVyO1xuICBcbiAgQmluYXJ5Q29tcG9uZW50U3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIEdvIHRocm91Z2ggdGhlIHN1YnN0ZXBwZXJzIGluIGEgcmFuZG9tIG9yZGVyIGFuZCBjYWxsIHN0ZXAoKSBvbiB0aGVtLlxuICAgIHJldHVybiBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uKHN1YnN0ZXBwZXIpIHtyZXR1cm4gc3Vic3RlcHBlci5zdGVwKCk7IH0pO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn1cbiAgICogVGhpcyBzdGVwcGVyIGNhbiBiZSByZXNwb25zaWJsZSBmb3IgdGFraW5nIGEgc3RlcCBmb3Igb25lIG9yIG1vcmUgcGFyYW1ldGVycy5cbiAgICogRm9yIHJlYWwgYW5kIGludCBwYXJhbWV0ZXJzIGl0IHRha2VzIE1ldHJvcG9saXMgd2l0aGluIEdpYmJzIHN0ZXBzLCBhbmQgZm9yIFxuICAgKiBiaW5hcnkgcGFyYW1ldGVycyBpdCBkb2VzIGV2YWx1YXRlcyB0aGUgcG9zdGVyaW9yIGZvciBib3RoIHBhcmFtdGVyIHZhbHVlcyBhbmRcbiAgICogcmFuZG9tbHkgY2hhbmdlcyB0byBhIGNlcnRhaW4gdmFsdWUgcHJvcG9ydGlvbmFsbHkgdG8gdGhhdCB2YWx1ZSdzIHBvc3RlcmlvclxuICAgKiAodGhpcyBpcyBhbHNvIGRvbmUgZm9yIGVhY2ggcGFyYW1ldGVyLCBzbyBhbHNvIGEgKiB3aXRoaW4gR2liYnMgYXBwcm9hY2gpLlxuICAgKiBUaGlzIHN0ZXBwZXIgaXMgYWxzbyBhZGFwdGl2ZSBhbmQgY2FuIGJlIGVmZmljaWVudCB3aGVuIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVyc1xuICAgKiBhcmUgbm90IHRvbyBoaWdoIGFuZCB0aGUgY29ycmVsYXRpb25zIGJldHdlZW4gcGFyYW1ldGVycyBhcmUgbG93LlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBvbmUgb3IgbW9yZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnNcbiAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gbG9nX3Bvc3QgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci5cbiAgKi9cbiAgdmFyIEFtd2dTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHtcbiAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpO1xuICAgIHRoaXMucGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7XG4gICAgdGhpcy5zdWJzdGVwcGVycyA9IFtdO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnBhcmFtX25hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbdGhpcy5wYXJhbV9uYW1lc1tpXV07XG4gICAgICB2YXIgU2VsZWN0U3RlcHBlcjtcbiAgICAgIHN3aXRjaCAocGFyYW0udHlwZSkge1xuICAgICAgICBjYXNlIFwicmVhbFwiOlxuICAgICAgICAgIGlmKGFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSkge1xuICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IFJlYWxNZXRyb3BvbGlzU3RlcHBlcjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImludFwiOlxuICAgICAgICAgIGlmKGFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSkge1xuICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IEludE1ldHJvcG9saXNTdGVwcGVyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJiaW5hcnlcIjpcbiAgICAgICAgICBpZihhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHtcbiAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBCaW5hcnlTdGVwcGVyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gQmluYXJ5Q29tcG9uZW50U3RlcHBlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgXCJBbXdnU3RlcHBlciBjYW4ndCBoYW5kbGUgcGFyYW1ldGVyIFwiICsgdGhpcy5wYXJhbV9uYW1lc1tpXSAgK1wiIHdpdGggdHlwZSBcIiArIHBhcmFtLnR5cGU7IFxuICAgICAgfVxuICAgICAgdmFyIHBhcmFtX29iamVjdF93cmFwID0ge307XG4gICAgICBwYXJhbV9vYmplY3Rfd3JhcFt0aGlzLnBhcmFtX25hbWVzW2ldXSA9IHBhcmFtO1xuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICB2YXIgcGFyYW1fb3B0aW9ucyA9IG9wdGlvbnMucGFyYW1zICYmIG9wdGlvbnMucGFyYW1zW3RoaXMucGFyYW1fbmFtZXNbaV1dIHx8IHt9O1xuICAgICAgcGFyYW1fb3B0aW9ucy5wcm9wX2xvZ19zY2FsZSAgICAgPSBwYXJhbV9vcHRpb25zLnByb3BfbG9nX3NjYWxlICAgICB8fCBvcHRpb25zLnByb3BfbG9nX3NjYWxlOyBcbiAgICAgIHBhcmFtX29wdGlvbnMuYmF0Y2hfc2l6ZSAgICAgICAgID0gcGFyYW1fb3B0aW9ucy5iYXRjaF9zaXplICAgICAgICAgfHwgb3B0aW9ucy5iYXRjaF9zaXplOyBcbiAgICAgIHBhcmFtX29wdGlvbnMubWF4X2FkYXB0YXRpb24gICAgID0gcGFyYW1fb3B0aW9ucy5tYXhfYWRhcHRhdGlvbiAgICAgfHwgb3B0aW9ucy5tYXhfYWRhcHRhdGlvbjtcbiAgICAgIHBhcmFtX29wdGlvbnMuaW5pdGlhbF9hZGFwdGF0aW9uID0gcGFyYW1fb3B0aW9ucy5pbml0aWFsX2FkYXB0YXRpb24gfHwgb3B0aW9ucy5pbml0aWFsX2FkYXB0YXRpb247XG4gICAgICBwYXJhbV9vcHRpb25zLnRhcmdldF9hY2NlcHRfcmF0ZSA9IHBhcmFtX29wdGlvbnMudGFyZ2V0X2FjY2VwdF9yYXRlIHx8IG9wdGlvbnMudGFyZ2V0X2FjY2VwdF9yYXRlOyBcbiAgICAgIHBhcmFtX29wdGlvbnMuaXNfYWRhcHRpbmcgICAgICAgID0gcGFyYW1fb3B0aW9ucy5pc19hZGFwdGluZyAgICAgICAgfHwgb3B0aW9ucy5pc19hZGFwdGluZzsgXG4gICAgICB0aGlzLnN1YnN0ZXBwZXJzW2ldID0gbmV3IFNlbGVjdFN0ZXBwZXIocGFyYW1fb2JqZWN0X3dyYXAsIHN0YXRlLCBsb2dfcG9zdCwgcGFyYW1fb3B0aW9ucyk7XG4gICAgfVxuICB9O1xuICBcbiAgQW13Z1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdGVwcGVyLnByb3RvdHlwZSk7IFxuICBBbXdnU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBbXdnU3RlcHBlcjtcbiAgXG4gIEFtd2dTdGVwcGVyLnByb3RvdHlwZS5zdGVwID0gZnVuY3Rpb24oKSB7XG4gICAgc2h1ZmZsZV9hcnJheSh0aGlzLnN1YnN0ZXBwZXJzKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5zdWJzdGVwcGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5zdWJzdGVwcGVyc1tpXS5zdGVwKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICB9O1xuICBcbiAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5zdWJzdGVwcGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5zdWJzdGVwcGVyc1tpXS5zdGFydF9hZGFwdGF0aW9uKCk7XG4gICAgfVxuICB9O1xuICBcbiAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnN1YnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnN1YnN0ZXBwZXJzW2ldLnN0b3BfYWRhcHRhdGlvbigpO1xuICAgIH0gXG4gIH07XG4gIFxuICBBbXdnU3RlcHBlci5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpbmZvID0ge307XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic3RlcHBlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGluZm9bdGhpcy5wYXJhbV9uYW1lc1tpXV0gPSB0aGlzLnN1YnN0ZXBwZXJzW2ldLmluZm8oKTtcbiAgICB9XG4gICAgcmV0dXJuIGluZm87XG4gIH07XG4gIFxuICBcbiAgXG4gIC8vLy8vLy8vLy8vIFNhbXBsZXIgRnVuY3Rpb25zIC8vLy8vLy8vLy9cbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgXG4gICAvKipcbiAgICogQGludGVyZmFjZVxuICAgKiBXaGlsZSB5b3UgY291bGQgZml0IGEgbW9kZWwgYnkgcGFzdGluZyB0b2dldGhlciBTdGVwcGVycywgYVxuICAvLyBTYW1wbGVyIGlzIGhlcmUgaXMgYSBjb252ZW5pZW5jZSBjbGFzcyB3aGVyZSBhbiBpbnN0YW5jZSBvZiBTYW1wbGVyXG4gIC8vIHNldHMgdXAgdGhlIFN0ZXBwZXJzLCBjaGVja3MgdGhlIHBhcmFtZXRlciBkZWZpbml0aW9uLFxuICAvLyBhbmQgbWFuYWdlcyB0aGUgc2FtcGxpbmcuIFRoaXMgaGVyZSBkZWZpbmVzIHRoZSBTYW1wbGVyIFwiaW50ZXJmYWNlXCIuXG4gICAqIEBpbnRlcmZhY2VcbiAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIHBhcmFtZXRlciBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGU6XG4gICAqICAge1wibXVcIjoge1widHlwZVwiOiBcInJlYWxcIn0sIFwic2lnbWFcIjoge1widHlwZVwiOiBcInJlYWxcIiwgXCJsb3dlclwiID0gMH19XG4gICAqICAgVGhlIHBhcmFtZXRlciBkZWZpbml0aW9ucyBkb2Vzbid0IGhhdmUgdG8gYmUgXCJjb21wbGV0ZVwiIGFuZCBwcm9wZXJ0aWVzXG4gICAqICAgbGVmdCBvdXQgKGxpa2UgbG93ZXIgYW5kIHVwcGVyKSB3aWxsIGJlIGZpbGxlZCBpbiBieSBkZWZhdWx0cy5cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB3aXRoIHNpZ25hdHVyZSBmdW5jdGlvbihzdGF0ZSwgZGF0YSkuIEhlcmVcbiAgICogICBzdGF0ZSB3aWxsIGJlIGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHN0YXRlIHdpdGggZWFjaCBwYXJhbWV0ZXIgYXMgYSBcbiAgICogICBrZXkgYW5kIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIGFzIG51bWJlcnMgb3IgYXJyYXlzLiBGb3IgZXhhbXBsZTpcbiAgICogICB7XCJtdVwiOiAzLCBcInNpZ21hXCI6IDEuNX0uIFRoZSBkYXRhIGFyZ3VtZW50IHdpbGwgYmUgdGhlIHNhbWUgb2JqZWN0IGFzIFxuICAgKiAgIHRoZSBkYXRhIGFyZ3VtZW50IGdpdmVuIGJlbG93LlxuICAgKiBAcGFyYW0gZGF0YSAtIGFuIG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIG9uIHRvIHRoZSBsb2dfcG9zdCBmdW5jdGlvblxuICAgKiAgIHdoZW4gc2FtcGxpbmcuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc2FtcGxlci5cbiAgICovXG4gIHZhciBTYW1wbGVyID0gZnVuY3Rpb24ocGFyYW1zLCBsb2dfcG9zdCwgZGF0YSwgb3B0aW9ucykge1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5wYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTtcbiAgICBcbiAgICAvLyBTZXR0aW5nIGRlZmF1bHQgb3B0aW9ucyBpZiBub3QgcGFzc2VkIHRocm91Z2ggdGhlIG9wdGlvbnMgb2JqZWN0XG4gICAgdGhpcy5wYXJhbV9pbml0X2Z1biAgID0gZ2V0X29wdGlvbihcInBhcmFtX2luaXRfZnVuXCIsIG9wdGlvbnMsIHBhcmFtX2luaXRfZml4ZWQpO1xuICAgIHZhciB0aGlubmluZ19pbnRlcnZhbCA9IGdldF9vcHRpb24oXCJ0aGluXCIsIG9wdGlvbnMsIDEpO1xuICAgIHZhciBwYXJhbXNfdG9fbW9uaXRvciA9IGdldF9vcHRpb24oXCJtb25pdG9yXCIsIG9wdGlvbnMsIG51bGwpO1xuICAgIHRoaXMudGhpbih0aGlubmluZ19pbnRlcnZhbCk7XG4gICAgdGhpcy5tb25pdG9yKHBhcmFtc190b19tb25pdG9yKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIC8vIENvbXBsZXRpbmcgdGhlIHBhcmFtcyBhbmQgaW5pdGlhbGl6aW5nIHRoZSBzdGF0ZS5cbiAgICB0aGlzLnBhcmFtcyA9IGNvbXBsZXRlX3BhcmFtcyh0aGlzLnBhcmFtcywgdGhpcy5wYXJhbV9pbml0X2Z1bik7XG4gICAgdmFyIHN0YXRlID0ge307XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMucGFyYW1fbmFtZXMubGVuZ3RoOyBpKysgKSB7XG4gICAgICBzdGF0ZVt0aGlzLnBhcmFtX25hbWVzW2ldXSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZXNbaV1dLmluaXQ7XG4gICAgfVxuICAgIHRoaXMubG9nX3Bvc3QgPSBmdW5jdGlvbigpIHsgXG4gICAgICByZXR1cm4gbG9nX3Bvc3Qoc3RhdGUsIGRhdGEpO1xuICAgIH07XG4gICAgLy8gUnVubmluZyB0aGUgbG9nX3Bvc3QgZnVuY3Rpb24gb25jZSBpbiBjYXNlIGl0IGZ1cnRoZXIgbW9kaWZpZXMgdGhlIHN0YXRlXG4gICAgLy8gZm9yIGV4YW1wbGUgYWRkaW5nIGRlcml2ZWQgcXVhbnRpdGllcy5cbiAgICB0aGlzLmxvZ19wb3N0KCk7XG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIHRoaXMuc3RlcHBlcnMgPSB0aGlzLmNyZWF0ZV9zdGVwcGVyX2Vuc2FtYmxlKHRoaXMucGFyYW1zLCB0aGlzLnN0YXRlLCB0aGlzLmxvZ19wb3N0LCB0aGlzLm9wdGlvbnMpO1xuICB9O1xuICBcbiAgLyoqIFNob3VsZCByZXR1cm4gYSB2ZWN0b3Igb2Ygc3RlcHBlcnMgdGhhdCB3aGVuIGNhbGxlZCBcbiAgICogc2hvdWxkIHRha2UgYSBzdGVwIGluIHRoZSBwYXJhbWV0ZXIgc3BhY2UuXG4gICAqL1xuICBTYW1wbGVyLnByb3RvdHlwZS5jcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSA9IGZ1bmN0aW9uKHN0YXRlLCBsb2dfcG9zdCl7XG4gICAgdGhyb3cgXCJFdmVyeSBTYW1wbGVyIG5lZWRzIHRvIGltcGxlbWVudCBjcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSgpXCI7XG4gIH07XG4gIFxuICAvKiogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBpbmZvIGFib3V0IHRoZSBzdGF0ZSBvZiB0aGUgU2FtcGxlci5cbiAgICovIFxuICBTYW1wbGVyLnByb3RvdHlwZS5pbmZvID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtzdGF0ZTogdGhpcy5zdGF0ZSwgdGhpbjogdGhpcy50aGluLCBtb25pdG9yOiB0aGlzLm1vbml0b3IsXG4gICAgICAgICAgICBzdGVwcGVyczogdGhpcy5zdGVwcGVyc307XG4gIH07XG4gIFxuICAvKiogVGFrZXMgYSBzdGVwIGluIHRoZSBwYXJhbWV0ZXIgc3BhY2UuIFJldHVybnMgdGhlIG5ldyBzcGFjZVxuICAgKiBidXQgYWxzbyBtb2RpZmllcyB0aGUgc3RhdGUgaW4gcGxhY2UuXG4gICAqLyBcbiAgU2FtcGxlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIHNodWZmbGVfYXJyYXkodGhpcy5zdGVwcGVycyk7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuc3RlcHBlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuc3RlcHBlcnNbaV0uc3RlcCgpO1xuICAgIH1cbiAgICBpZihPYmplY3Qua2V5cyh0aGlzLnN0YXRlKS5sZW5ndGggPiBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcykubGVuZ3RoKSB7XG4gICAgICAvLyBUaGUgc3RhdGUgY29udGFpbnMgZGV2aXZlZCBxdWFudGl0aWVzIChub3Qgb25seSBwYXJhbWV0ZXJzKSBhbmQgd2VcbiAgICAgIC8vIG5lZWQgdG8gcnVuIHRoZSBsb2dfcG9zdCBvbmNlIG1vcmUgaW4gb3JkZXIgdG8gc2V0IHRoZSBkZXJpdmVkIHF1YW50aXRpZXNcbiAgICAgIC8vIGZvciB0aGUgZmluYWwgcGFyYW1ldGVyIHN0YXRlXG4gICAgICB0aGlzLmxvZ19wb3N0KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFRha2VzIG5faXRlcmF0aW9ucyBzdGVwcyBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlIGFuZCByZXR1cm5zIHRoZW1cbiAgICogYXMgYW4gb2JqZWN0IG9mIGFycmF5cyB3aXRoIG9uZSBhcnJheSBwZXIgcGFyYW1ldGVyLiBGb3IgZXhhbXBsZTpcbiAgICoge211OiBbMSwgLTEsIDIsIDMsIC4uLl0sIHNpZ21hOiBbMSwgMiwgMiwgMSwgLi4uXX0uXG4gICAqIElmIHRoaW4gaXMgPiAxIHRoZW4gbl9pdGVyYXRpb25zIC8gdGhpbiBzYW1wbGVzIGFyZSByZXR1cm5lZC5cbiAgICovIFxuICBTYW1wbGVyLnByb3RvdHlwZS5zYW1wbGUgPSBmdW5jdGlvbihuX2l0ZXJhdGlvbnMpIHtcbiAgICAgIC8vIEluaXRpYWxpemluZyBjdXJyX3NhbXBsZSB3aGVyZSB0aGUgc2FtcGxlIGlzIGdvaW5nIHRvIGJlIHNhdmVkXG4gICAgICAvLyBhcyBhbiBvYmplY3QgY29udGFpbmluZyBvbmUgYXJyYXkgcGVyIHBhcmFtZXRlciB0byBiZSBtb25pdG9yZWQuXG4gICAgICB2YXIgaSwgaiwgbW9uaXRvcmVkX3BhcmFtcztcbiAgICAgIGlmKHRoaXMubW9uaXRvcmVkX3BhcmFtcyA9PT0gbnVsbCkge1xuICAgICAgICBtb25pdG9yZWRfcGFyYW1zID0gT2JqZWN0LmtleXModGhpcy5zdGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtb25pdG9yZWRfcGFyYW1zID0gdGhpcy5tb25pdG9yZWRfcGFyYW1zO1xuICAgICAgfVxuICAgICAgXG4gICAgICB2YXIgY3Vycl9zYW1wbGUgPSB7fTtcbiAgICAgIGZvcihqID0gMDsgaiA8IG1vbml0b3JlZF9wYXJhbXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY3Vycl9zYW1wbGVbbW9uaXRvcmVkX3BhcmFtc1tqXV0gPSBbXTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgZm9yKGkgPSAwOyBpIDwgbl9pdGVyYXRpb25zOyBpKyspIHtcbiAgICAgICAgaWYoaSAlIHRoaXMudGhpbm5pbmdfaW50ZXJ2YWwgPT09IDApIHtcbiAgICAgICAgICBmb3IoaiA9IDA7IGogPCBtb25pdG9yZWRfcGFyYW1zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICB2YXIgcGFyYW0gPSBtb25pdG9yZWRfcGFyYW1zW2pdO1xuICAgICAgICAgICAgY3Vycl9zYW1wbGVbcGFyYW1dLnB1c2goIGNsb25lX3BhcmFtX2RyYXcodGhpcy5zdGF0ZVtwYXJhbV0pICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RlcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGN1cnJfc2FtcGxlO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFRha2VzIG5faXRlcmF0aW9uIHN0ZXBzIGluIHBhcmFtZXRlciBzcGFjZSBidXQgcmV0dXJucyBub3RoaW5nLlxuICAgKi8gXG4gIFNhbXBsZXIucHJvdG90eXBlLmJ1cm4gPSBmdW5jdGlvbihuX2l0ZXJhdGlvbnMpIHtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbl9pdGVyYXRpb25zOyBpKyspIHtcbiAgICAgIHRoaXMuc3RlcCgpO1xuICAgIH1cbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBTZXRzIHdoYXQgcGFyYW1ldGVycyBzaG91bGQgYmUgbW9uaXRvcmVkIGFuZCByZXR1cm5lZCB3aGVuIGNhbGxpbmdcbiAgICogc2FtcGxlLlxuICAgKi8gXG4gIFNhbXBsZXIucHJvdG90eXBlLm1vbml0b3IgPSBmdW5jdGlvbihwYXJhbXNfdG9fbW9uaXRvcikge1xuICAgICAgdGhpcy5tb25pdG9yZWRfcGFyYW1zID0gcGFyYW1zX3RvX21vbml0b3I7XG4gIH07XG4gIFxuICAvKipcbiAgICogU2V0cyB0aGUgdGhpbm5pbmcuIEZvciBleGFtcGxlIHRoaW4gPT0gMTAgbWVhbnMgdGhhdCBldmVyeSAxMHRoIHBvc3RlcmlvclxuICAgKiBkcmF3IHdpbGwgYmUga2VwdC5cbiAgICovIFxuICBTYW1wbGVyLnByb3RvdHlwZS50aGluID0gZnVuY3Rpb24odGhpbm5pbmdfaW50ZXJ2YWwpIHtcbiAgICB0aGlzLnRoaW5uaW5nX2ludGVydmFsID0gdGhpbm5pbmdfaW50ZXJ2YWw7XG4gIH07XG4gIFxuICAvKipcbiAgICogU2V0cyBhZGFwdGF0aW9uIG9uLCBpZiBhcHBsaWNhYmxlLCBpbiBhbGwgc3RlcHBlcnMuXG4gICAqLyBcbiAgU2FtcGxlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnN0ZXBwZXJzW2ldLnN0YXJ0X2FkYXB0YXRpb24oKTtcbiAgICB9XG4gIH07XG4gIFxuICAgIC8qKlxuICAgKiBTZXRzIGFkYXB0YXRpb24gb2ZmLCBpZiBhcHBsaWNhYmxlLCBpbiBhbGwgc3RlcHBlcnMuXG4gICAqLyBcbiAgU2FtcGxlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuc3RlcHBlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuc3RlcHBlcnNbaV0uc3RvcF9hZGFwdGF0aW9uKCk7XG4gICAgfVxuICB9O1xuICBcbiAgIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGltcGxlbWVudHMge1NhbXBsZXJ9XG4gICAqIFRoaXMgc2FtcGxlciB1c2VzIHRoZSBBbXdnU3RlcHBlciBhcyB0aGUgc3RlcHBlciBmdW5jdGlvbiB3aGljaCBpbXBsZW1lbnRzIHRoZSBcbiAgICogQWRhcHRpdmUgTWV0cm9wb2xpcy1XaXRoaW4tR2liYnMgYWxnb3JpdGhtIGluIFwiRXhhbXBsZXMgb2YgQWRhcHRpdmUgTUNNQ1wiXG4gICAqIGJ5IFJvYmVydHMgYW5kIFJvc2VudGhhbCAoMjAwOCkuIEFuIGFkaXRpb24gaXMgdGhhdCBpdCBoYW5kbGVzIGludCBwYXJhbWV0ZXJzXG4gICAqIGJ5IG1ha2luZyBkaXNjcmV0ZSBOb3JtYWwgcHJvcG9zYWxzIGFuZCBiaW5hcnkgcGFyYW1ldGVycyBieSB0YWtpbmcgb24gYSBuZXcgXG4gICAqIHZhbHVlIHByb3BvcnRpb25hbCB0byB0aGUgcG9zdGVyaW9yIG9mIHRoZSB0d28gcG9zc2libGUgc3RhdGVzIG9mIHRoZVxuICAgKiBwYXJhbWV0ZXIuIFRoaXMgc2FtcGxlciBjYW4gYmUgZWZmaWNpZW50IHdoZW4gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzXG4gICAqIGFyZSBub3QgdG9vIGhpZ2ggYW5kIHRoZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBwYXJhbWV0ZXJzIGFyZSBsb3cuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIG9uZSBvciBtb3JlIHBhcmFtZXRlciBkZWZpbml0aW9uc1xuICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiBcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zIHRvIHRoZSBzdGVwcGVyLlxuICAqL1xuICB2YXIgQW13Z1NhbXBsZXIgPSBmdW5jdGlvbihwYXJhbXMsIGxvZ19wb3N0LCBkYXRhLCBvcHRpb25zKSB7XG4gICAgU2FtcGxlci5jYWxsKHRoaXMsIHBhcmFtcywgbG9nX3Bvc3QsIGRhdGEsIG9wdGlvbnMpO1xuICB9O1xuICBcbiAgQW13Z1NhbXBsZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTYW1wbGVyLnByb3RvdHlwZSk7IFxuICBBbXdnU2FtcGxlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBbXdnU2FtcGxlcjtcbiAgXG4gIEFtd2dTYW1wbGVyLnByb3RvdHlwZS5jcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSA9IGZ1bmN0aW9uKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKXtcbiAgICByZXR1cm4gWyBuZXcgQW13Z1N0ZXBwZXIocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIF07XG4gIH07XG4gIFxuICBcbiAgLy8gUmV0dXJuaW5nIHRoZSBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgcHVibGljbHkgZXhwb3NlZCBieSB0aGlzIG1vZHVsZVxuICByZXR1cm4ge1xuICAgIHJ1bmlmOiBydW5pZixcbiAgICBydW5pZl9kaXNjcmV0ZTogcnVuaWZfZGlzY3JldGUsXG4gICAgcm5vcm06IHJub3JtLFxuICAgIHBhcmFtX2luaXRfZml4ZWQ6IHBhcmFtX2luaXRfZml4ZWQsIFxuICAgIGNvbXBsZXRlX3BhcmFtczogY29tcGxldGVfcGFyYW1zLCBcbiAgICBSZWFsTWV0cm9wb2xpc1N0ZXBwZXI6IFJlYWxNZXRyb3BvbGlzU3RlcHBlciwgXG4gICAgSW50TWV0cm9wb2xpc1N0ZXBwZXI6IEludE1ldHJvcG9saXNTdGVwcGVyLCBcbiAgICBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjogTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIsIFxuICAgIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI6IE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIsIFxuICAgIEJpbmFyeVN0ZXBwZXI6IEJpbmFyeVN0ZXBwZXIsIFxuICAgIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXI6IEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIsIFxuICAgIEFtd2dTdGVwcGVyOiBBbXdnU3RlcHBlciwgXG4gICAgQW13Z1NhbXBsZXI6IEFtd2dTYW1wbGVyXG4gIH07XG59KSk7XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhc2NlbmRpbmcoYSwgYikge1xuICByZXR1cm4gYSA9PSBudWxsIHx8IGIgPT0gbnVsbCA/IE5hTiA6IGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiBhID49IGIgPyAwIDogTmFOO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbnVtYmVyKHgpIHtcbiAgcmV0dXJuIHggPT09IG51bGwgPyBOYU4gOiAreDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBudW1iZXJzKHZhbHVlcywgdmFsdWVvZikge1xuICBpZiAodmFsdWVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAodmFsdWUgPSArdmFsdWUpID49IHZhbHVlKSB7XG4gICAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlLCArK2luZGV4LCB2YWx1ZXMpKSAhPSBudWxsICYmICh2YWx1ZSA9ICt2YWx1ZSkgPj0gdmFsdWUpIHtcbiAgICAgICAgeWllbGQgdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgYXNjZW5kaW5nIGZyb20gXCIuL2FzY2VuZGluZy5qc1wiO1xuaW1wb3J0IHBlcm11dGUgZnJvbSBcIi4vcGVybXV0ZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzb3J0KHZhbHVlcywgLi4uRikge1xuICBpZiAodHlwZW9mIHZhbHVlc1tTeW1ib2wuaXRlcmF0b3JdICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJ2YWx1ZXMgaXMgbm90IGl0ZXJhYmxlXCIpO1xuICB2YWx1ZXMgPSBBcnJheS5mcm9tKHZhbHVlcyk7XG4gIGxldCBbZl0gPSBGO1xuICBpZiAoKGYgJiYgZi5sZW5ndGggIT09IDIpIHx8IEYubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IGluZGV4ID0gVWludDMyQXJyYXkuZnJvbSh2YWx1ZXMsIChkLCBpKSA9PiBpKTtcbiAgICBpZiAoRi5sZW5ndGggPiAxKSB7XG4gICAgICBGID0gRi5tYXAoZiA9PiB2YWx1ZXMubWFwKGYpKTtcbiAgICAgIGluZGV4LnNvcnQoKGksIGopID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBmIG9mIEYpIHtcbiAgICAgICAgICBjb25zdCBjID0gYXNjZW5kaW5nRGVmaW5lZChmW2ldLCBmW2pdKTtcbiAgICAgICAgICBpZiAoYykgcmV0dXJuIGM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmID0gdmFsdWVzLm1hcChmKTtcbiAgICAgIGluZGV4LnNvcnQoKGksIGopID0+IGFzY2VuZGluZ0RlZmluZWQoZltpXSwgZltqXSkpO1xuICAgIH1cbiAgICByZXR1cm4gcGVybXV0ZSh2YWx1ZXMsIGluZGV4KTtcbiAgfVxuICByZXR1cm4gdmFsdWVzLnNvcnQoY29tcGFyZURlZmluZWQoZikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZURlZmluZWQoY29tcGFyZSA9IGFzY2VuZGluZykge1xuICBpZiAoY29tcGFyZSA9PT0gYXNjZW5kaW5nKSByZXR1cm4gYXNjZW5kaW5nRGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBjb21wYXJlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjb21wYXJlIGlzIG5vdCBhIGZ1bmN0aW9uXCIpO1xuICByZXR1cm4gKGEsIGIpID0+IHtcbiAgICBjb25zdCB4ID0gY29tcGFyZShhLCBiKTtcbiAgICBpZiAoeCB8fCB4ID09PSAwKSByZXR1cm4geDtcbiAgICByZXR1cm4gKGNvbXBhcmUoYiwgYikgPT09IDApIC0gKGNvbXBhcmUoYSwgYSkgPT09IDApO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNjZW5kaW5nRGVmaW5lZChhLCBiKSB7XG4gIHJldHVybiAoYSA9PSBudWxsIHx8ICEoYSA+PSBhKSkgLSAoYiA9PSBudWxsIHx8ICEoYiA+PSBiKSkgfHwgKGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1heCh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgbGV0IG1heDtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbFxuICAgICAgICAgICYmIChtYXggPCB2YWx1ZSB8fCAobWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbFxuICAgICAgICAgICYmIChtYXggPCB2YWx1ZSB8fCAobWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1heDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1pbih2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgbGV0IG1pbjtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbFxuICAgICAgICAgICYmIChtaW4gPiB2YWx1ZSB8fCAobWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtaW4gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbFxuICAgICAgICAgICYmIChtaW4gPiB2YWx1ZSB8fCAobWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtaW4gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1pbjtcbn1cbiIsImltcG9ydCB7YXNjZW5kaW5nRGVmaW5lZCwgY29tcGFyZURlZmluZWR9IGZyb20gXCIuL3NvcnQuanNcIjtcblxuLy8gQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL21vdXJuZXIvcXVpY2tzZWxlY3Rcbi8vIElTQyBsaWNlbnNlLCBDb3B5cmlnaHQgMjAxOCBWbGFkaW1pciBBZ2Fmb25raW4uXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWlja3NlbGVjdChhcnJheSwgaywgbGVmdCA9IDAsIHJpZ2h0ID0gSW5maW5pdHksIGNvbXBhcmUpIHtcbiAgayA9IE1hdGguZmxvb3Ioayk7XG4gIGxlZnQgPSBNYXRoLmZsb29yKE1hdGgubWF4KDAsIGxlZnQpKTtcbiAgcmlnaHQgPSBNYXRoLmZsb29yKE1hdGgubWluKGFycmF5Lmxlbmd0aCAtIDEsIHJpZ2h0KSk7XG5cbiAgaWYgKCEobGVmdCA8PSBrICYmIGsgPD0gcmlnaHQpKSByZXR1cm4gYXJyYXk7XG5cbiAgY29tcGFyZSA9IGNvbXBhcmUgPT09IHVuZGVmaW5lZCA/IGFzY2VuZGluZ0RlZmluZWQgOiBjb21wYXJlRGVmaW5lZChjb21wYXJlKTtcblxuICB3aGlsZSAocmlnaHQgPiBsZWZ0KSB7XG4gICAgaWYgKHJpZ2h0IC0gbGVmdCA+IDYwMCkge1xuICAgICAgY29uc3QgbiA9IHJpZ2h0IC0gbGVmdCArIDE7XG4gICAgICBjb25zdCBtID0gayAtIGxlZnQgKyAxO1xuICAgICAgY29uc3QgeiA9IE1hdGgubG9nKG4pO1xuICAgICAgY29uc3QgcyA9IDAuNSAqIE1hdGguZXhwKDIgKiB6IC8gMyk7XG4gICAgICBjb25zdCBzZCA9IDAuNSAqIE1hdGguc3FydCh6ICogcyAqIChuIC0gcykgLyBuKSAqIChtIC0gbiAvIDIgPCAwID8gLTEgOiAxKTtcbiAgICAgIGNvbnN0IG5ld0xlZnQgPSBNYXRoLm1heChsZWZ0LCBNYXRoLmZsb29yKGsgLSBtICogcyAvIG4gKyBzZCkpO1xuICAgICAgY29uc3QgbmV3UmlnaHQgPSBNYXRoLm1pbihyaWdodCwgTWF0aC5mbG9vcihrICsgKG4gLSBtKSAqIHMgLyBuICsgc2QpKTtcbiAgICAgIHF1aWNrc2VsZWN0KGFycmF5LCBrLCBuZXdMZWZ0LCBuZXdSaWdodCwgY29tcGFyZSk7XG4gICAgfVxuXG4gICAgY29uc3QgdCA9IGFycmF5W2tdO1xuICAgIGxldCBpID0gbGVmdDtcbiAgICBsZXQgaiA9IHJpZ2h0O1xuXG4gICAgc3dhcChhcnJheSwgbGVmdCwgayk7XG4gICAgaWYgKGNvbXBhcmUoYXJyYXlbcmlnaHRdLCB0KSA+IDApIHN3YXAoYXJyYXksIGxlZnQsIHJpZ2h0KTtcblxuICAgIHdoaWxlIChpIDwgaikge1xuICAgICAgc3dhcChhcnJheSwgaSwgaiksICsraSwgLS1qO1xuICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyYXlbaV0sIHQpIDwgMCkgKytpO1xuICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyYXlbal0sIHQpID4gMCkgLS1qO1xuICAgIH1cblxuICAgIGlmIChjb21wYXJlKGFycmF5W2xlZnRdLCB0KSA9PT0gMCkgc3dhcChhcnJheSwgbGVmdCwgaik7XG4gICAgZWxzZSArK2osIHN3YXAoYXJyYXksIGosIHJpZ2h0KTtcblxuICAgIGlmIChqIDw9IGspIGxlZnQgPSBqICsgMTtcbiAgICBpZiAoayA8PSBqKSByaWdodCA9IGogLSAxO1xuICB9XG5cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5mdW5jdGlvbiBzd2FwKGFycmF5LCBpLCBqKSB7XG4gIGNvbnN0IHQgPSBhcnJheVtpXTtcbiAgYXJyYXlbaV0gPSBhcnJheVtqXTtcbiAgYXJyYXlbal0gPSB0O1xufVxuIiwiaW1wb3J0IG1heCBmcm9tIFwiLi9tYXguanNcIjtcbmltcG9ydCBtYXhJbmRleCBmcm9tIFwiLi9tYXhJbmRleC5qc1wiO1xuaW1wb3J0IG1pbiBmcm9tIFwiLi9taW4uanNcIjtcbmltcG9ydCBtaW5JbmRleCBmcm9tIFwiLi9taW5JbmRleC5qc1wiO1xuaW1wb3J0IHF1aWNrc2VsZWN0IGZyb20gXCIuL3F1aWNrc2VsZWN0LmpzXCI7XG5pbXBvcnQgbnVtYmVyLCB7bnVtYmVyc30gZnJvbSBcIi4vbnVtYmVyLmpzXCI7XG5pbXBvcnQge2FzY2VuZGluZ0RlZmluZWR9IGZyb20gXCIuL3NvcnQuanNcIjtcbmltcG9ydCBncmVhdGVzdCBmcm9tIFwiLi9ncmVhdGVzdC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWFudGlsZSh2YWx1ZXMsIHAsIHZhbHVlb2YpIHtcbiAgdmFsdWVzID0gRmxvYXQ2NEFycmF5LmZyb20obnVtYmVycyh2YWx1ZXMsIHZhbHVlb2YpKTtcbiAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpIHx8IGlzTmFOKHAgPSArcCkpIHJldHVybjtcbiAgaWYgKHAgPD0gMCB8fCBuIDwgMikgcmV0dXJuIG1pbih2YWx1ZXMpO1xuICBpZiAocCA+PSAxKSByZXR1cm4gbWF4KHZhbHVlcyk7XG4gIHZhciBuLFxuICAgICAgaSA9IChuIC0gMSkgKiBwLFxuICAgICAgaTAgPSBNYXRoLmZsb29yKGkpLFxuICAgICAgdmFsdWUwID0gbWF4KHF1aWNrc2VsZWN0KHZhbHVlcywgaTApLnN1YmFycmF5KDAsIGkwICsgMSkpLFxuICAgICAgdmFsdWUxID0gbWluKHZhbHVlcy5zdWJhcnJheShpMCArIDEpKTtcbiAgcmV0dXJuIHZhbHVlMCArICh2YWx1ZTEgLSB2YWx1ZTApICogKGkgLSBpMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWFudGlsZVNvcnRlZCh2YWx1ZXMsIHAsIHZhbHVlb2YgPSBudW1iZXIpIHtcbiAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpIHx8IGlzTmFOKHAgPSArcCkpIHJldHVybjtcbiAgaWYgKHAgPD0gMCB8fCBuIDwgMikgcmV0dXJuICt2YWx1ZW9mKHZhbHVlc1swXSwgMCwgdmFsdWVzKTtcbiAgaWYgKHAgPj0gMSkgcmV0dXJuICt2YWx1ZW9mKHZhbHVlc1tuIC0gMV0sIG4gLSAxLCB2YWx1ZXMpO1xuICB2YXIgbixcbiAgICAgIGkgPSAobiAtIDEpICogcCxcbiAgICAgIGkwID0gTWF0aC5mbG9vcihpKSxcbiAgICAgIHZhbHVlMCA9ICt2YWx1ZW9mKHZhbHVlc1tpMF0sIGkwLCB2YWx1ZXMpLFxuICAgICAgdmFsdWUxID0gK3ZhbHVlb2YodmFsdWVzW2kwICsgMV0sIGkwICsgMSwgdmFsdWVzKTtcbiAgcmV0dXJuIHZhbHVlMCArICh2YWx1ZTEgLSB2YWx1ZTApICogKGkgLSBpMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWFudGlsZUluZGV4KHZhbHVlcywgcCwgdmFsdWVvZiA9IG51bWJlcikge1xuICBpZiAoaXNOYU4ocCA9ICtwKSkgcmV0dXJuO1xuICBudW1iZXJzID0gRmxvYXQ2NEFycmF5LmZyb20odmFsdWVzLCAoXywgaSkgPT4gbnVtYmVyKHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSk7XG4gIGlmIChwIDw9IDApIHJldHVybiBtaW5JbmRleChudW1iZXJzKTtcbiAgaWYgKHAgPj0gMSkgcmV0dXJuIG1heEluZGV4KG51bWJlcnMpO1xuICB2YXIgbnVtYmVycyxcbiAgICAgIGluZGV4ID0gVWludDMyQXJyYXkuZnJvbSh2YWx1ZXMsIChfLCBpKSA9PiBpKSxcbiAgICAgIGogPSBudW1iZXJzLmxlbmd0aCAtIDEsXG4gICAgICBpID0gTWF0aC5mbG9vcihqICogcCk7XG4gIHF1aWNrc2VsZWN0KGluZGV4LCBpLCAwLCBqLCAoaSwgaikgPT4gYXNjZW5kaW5nRGVmaW5lZChudW1iZXJzW2ldLCBudW1iZXJzW2pdKSk7XG4gIGkgPSBncmVhdGVzdChpbmRleC5zdWJhcnJheSgwLCBpICsgMSksIChpKSA9PiBudW1iZXJzW2ldKTtcbiAgcmV0dXJuIGkgPj0gMCA/IGkgOiAtMTtcbn1cbiIsImltcG9ydCBxdWFudGlsZSwge3F1YW50aWxlSW5kZXh9IGZyb20gXCIuL3F1YW50aWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lZGlhbih2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgcmV0dXJuIHF1YW50aWxlKHZhbHVlcywgMC41LCB2YWx1ZW9mKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lZGlhbkluZGV4KHZhbHVlcywgdmFsdWVvZikge1xuICByZXR1cm4gcXVhbnRpbGVJbmRleCh2YWx1ZXMsIDAuNSwgdmFsdWVvZik7XG59XG4iLCJ2YXIgbm9vcCA9IHt2YWx1ZTogKCkgPT4ge319O1xuXG5mdW5jdGlvbiBkaXNwYXRjaCgpIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoLCBfID0ge30sIHQ7IGkgPCBuOyArK2kpIHtcbiAgICBpZiAoISh0ID0gYXJndW1lbnRzW2ldICsgXCJcIikgfHwgKHQgaW4gXykgfHwgL1tcXHMuXS8udGVzdCh0KSkgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCB0eXBlOiBcIiArIHQpO1xuICAgIF9bdF0gPSBbXTtcbiAgfVxuICByZXR1cm4gbmV3IERpc3BhdGNoKF8pO1xufVxuXG5mdW5jdGlvbiBEaXNwYXRjaChfKSB7XG4gIHRoaXMuXyA9IF87XG59XG5cbmZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lcywgdHlwZXMpIHtcbiAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XFxzKy8pLm1hcChmdW5jdGlvbih0KSB7XG4gICAgdmFyIG5hbWUgPSBcIlwiLCBpID0gdC5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIGlmICh0ICYmICF0eXBlcy5oYXNPd25Qcm9wZXJ0eSh0KSkgdGhyb3cgbmV3IEVycm9yKFwidW5rbm93biB0eXBlOiBcIiArIHQpO1xuICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07XG4gIH0pO1xufVxuXG5EaXNwYXRjaC5wcm90b3R5cGUgPSBkaXNwYXRjaC5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBEaXNwYXRjaCxcbiAgb246IGZ1bmN0aW9uKHR5cGVuYW1lLCBjYWxsYmFjaykge1xuICAgIHZhciBfID0gdGhpcy5fLFxuICAgICAgICBUID0gcGFyc2VUeXBlbmFtZXModHlwZW5hbWUgKyBcIlwiLCBfKSxcbiAgICAgICAgdCxcbiAgICAgICAgaSA9IC0xLFxuICAgICAgICBuID0gVC5sZW5ndGg7XG5cbiAgICAvLyBJZiBubyBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZXR1cm4gdGhlIGNhbGxiYWNrIG9mIHRoZSBnaXZlbiB0eXBlIGFuZCBuYW1lLlxuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgodCA9ICh0eXBlbmFtZSA9IFRbaV0pLnR5cGUpICYmICh0ID0gZ2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUpKSkgcmV0dXJuIHQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgYSB0eXBlIHdhcyBzcGVjaWZpZWQsIHNldCB0aGUgY2FsbGJhY2sgZm9yIHRoZSBnaXZlbiB0eXBlIGFuZCBuYW1lLlxuICAgIC8vIE90aGVyd2lzZSwgaWYgYSBudWxsIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIHJlbW92ZSBjYWxsYmFja3Mgb2YgdGhlIGdpdmVuIG5hbWUuXG4gICAgaWYgKGNhbGxiYWNrICE9IG51bGwgJiYgdHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgY2FsbGJhY2s6IFwiICsgY2FsbGJhY2spO1xuICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICBpZiAodCA9ICh0eXBlbmFtZSA9IFRbaV0pLnR5cGUpIF9bdF0gPSBzZXQoX1t0XSwgdHlwZW5hbWUubmFtZSwgY2FsbGJhY2spO1xuICAgICAgZWxzZSBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgZm9yICh0IGluIF8pIF9bdF0gPSBzZXQoX1t0XSwgdHlwZW5hbWUubmFtZSwgbnVsbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG4gIGNvcHk6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBjb3B5ID0ge30sIF8gPSB0aGlzLl87XG4gICAgZm9yICh2YXIgdCBpbiBfKSBjb3B5W3RdID0gX1t0XS5zbGljZSgpO1xuICAgIHJldHVybiBuZXcgRGlzcGF0Y2goY29weSk7XG4gIH0sXG4gIGNhbGw6IGZ1bmN0aW9uKHR5cGUsIHRoYXQpIHtcbiAgICBpZiAoKG4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMikgPiAwKSBmb3IgKHZhciBhcmdzID0gbmV3IEFycmF5KG4pLCBpID0gMCwgbiwgdDsgaSA8IG47ICsraSkgYXJnc1tpXSA9IGFyZ3VtZW50c1tpICsgMl07XG4gICAgaWYgKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodHlwZSkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0eXBlKTtcbiAgICBmb3IgKHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7XG4gIH0sXG4gIGFwcGx5OiBmdW5jdGlvbih0eXBlLCB0aGF0LCBhcmdzKSB7XG4gICAgaWYgKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodHlwZSkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0eXBlKTtcbiAgICBmb3IgKHZhciB0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBnZXQodHlwZSwgbmFtZSkge1xuICBmb3IgKHZhciBpID0gMCwgbiA9IHR5cGUubGVuZ3RoLCBjOyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKChjID0gdHlwZVtpXSkubmFtZSA9PT0gbmFtZSkge1xuICAgICAgcmV0dXJuIGMudmFsdWU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNldCh0eXBlLCBuYW1lLCBjYWxsYmFjaykge1xuICBmb3IgKHZhciBpID0gMCwgbiA9IHR5cGUubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKHR5cGVbaV0ubmFtZSA9PT0gbmFtZSkge1xuICAgICAgdHlwZVtpXSA9IG5vb3AsIHR5cGUgPSB0eXBlLnNsaWNlKDAsIGkpLmNvbmNhdCh0eXBlLnNsaWNlKGkgKyAxKSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHR5cGUucHVzaCh7bmFtZTogbmFtZSwgdmFsdWU6IGNhbGxiYWNrfSk7XG4gIHJldHVybiB0eXBlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBkaXNwYXRjaDtcbiIsImV4cG9ydCB2YXIgeGh0bWwgPSBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBzdmc6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgeGh0bWw6IHhodG1sLFxuICB4bGluazogXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIsXG4gIHhtbDogXCJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2VcIixcbiAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy9cIlxufTtcbiIsImltcG9ydCBuYW1lc3BhY2VzIGZyb20gXCIuL25hbWVzcGFjZXMuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgcHJlZml4ID0gbmFtZSArPSBcIlwiLCBpID0gcHJlZml4LmluZGV4T2YoXCI6XCIpO1xuICBpZiAoaSA+PSAwICYmIChwcmVmaXggPSBuYW1lLnNsaWNlKDAsIGkpKSAhPT0gXCJ4bWxuc1wiKSBuYW1lID0gbmFtZS5zbGljZShpICsgMSk7XG4gIHJldHVybiBuYW1lc3BhY2VzLmhhc093blByb3BlcnR5KHByZWZpeCkgPyB7c3BhY2U6IG5hbWVzcGFjZXNbcHJlZml4XSwgbG9jYWw6IG5hbWV9IDogbmFtZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbn1cbiIsImltcG9ydCBuYW1lc3BhY2UgZnJvbSBcIi4vbmFtZXNwYWNlLmpzXCI7XG5pbXBvcnQge3hodG1sfSBmcm9tIFwiLi9uYW1lc3BhY2VzLmpzXCI7XG5cbmZ1bmN0aW9uIGNyZWF0b3JJbmhlcml0KG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBkb2N1bWVudCA9IHRoaXMub3duZXJEb2N1bWVudCxcbiAgICAgICAgdXJpID0gdGhpcy5uYW1lc3BhY2VVUkk7XG4gICAgcmV0dXJuIHVyaSA9PT0geGh0bWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0geGh0bWxcbiAgICAgICAgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpXG4gICAgICAgIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHVyaSwgbmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0b3JGaXhlZChmdWxsbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG4gIHJldHVybiAoZnVsbG5hbWUubG9jYWxcbiAgICAgID8gY3JlYXRvckZpeGVkXG4gICAgICA6IGNyZWF0b3JJbmhlcml0KShmdWxsbmFtZSk7XG59XG4iLCJmdW5jdGlvbiBub25lKCkge31cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwgPyBub25lIDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gIH07XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzZWxlY3RvciBmcm9tIFwiLi4vc2VsZWN0b3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSBcImZ1bmN0aW9uXCIpIHNlbGVjdCA9IHNlbGVjdG9yKHNlbGVjdCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgc3Vibm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAoc3Vibm9kZSA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkpIHtcbiAgICAgICAgaWYgKFwiX19kYXRhX19cIiBpbiBub2RlKSBzdWJub2RlLl9fZGF0YV9fID0gbm9kZS5fX2RhdGFfXztcbiAgICAgICAgc3ViZ3JvdXBbaV0gPSBzdWJub2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCIvLyBHaXZlbiBzb21ldGhpbmcgYXJyYXkgbGlrZSAob3IgbnVsbCksIHJldHVybnMgc29tZXRoaW5nIHRoYXQgaXMgc3RyaWN0bHkgYW5cbi8vIGFycmF5LiBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgYXJyYXktbGlrZSBvYmplY3RzIHBhc3NlZCB0byBkMy5zZWxlY3RBbGxcbi8vIG9yIHNlbGVjdGlvbi5zZWxlY3RBbGwgYXJlIGNvbnZlcnRlZCBpbnRvIHByb3BlciBhcnJheXMgd2hlbiBjcmVhdGluZyBhXG4vLyBzZWxlY3Rpb247IHdlIGRvbuKAmXQgZXZlciB3YW50IHRvIGNyZWF0ZSBhIHNlbGVjdGlvbiBiYWNrZWQgYnkgYSBsaXZlXG4vLyBIVE1MQ29sbGVjdGlvbiBvciBOb2RlTGlzdC4gSG93ZXZlciwgbm90ZSB0aGF0IHNlbGVjdGlvbi5zZWxlY3RBbGwgd2lsbCB1c2UgYVxuLy8gc3RhdGljIE5vZGVMaXN0IGFzIGEgZ3JvdXAsIHNpbmNlIGl0IHNhZmVseSBkZXJpdmVkIGZyb20gcXVlcnlTZWxlY3RvckFsbC5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFycmF5KHgpIHtcbiAgcmV0dXJuIHggPT0gbnVsbCA/IFtdIDogQXJyYXkuaXNBcnJheSh4KSA/IHggOiBBcnJheS5mcm9tKHgpO1xufVxuIiwiZnVuY3Rpb24gZW1wdHkoKSB7XG4gIHJldHVybiBbXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwgPyBlbXB0eSA6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICB9O1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgYXJyYXkgZnJvbSBcIi4uL2FycmF5LmpzXCI7XG5pbXBvcnQgc2VsZWN0b3JBbGwgZnJvbSBcIi4uL3NlbGVjdG9yQWxsLmpzXCI7XG5cbmZ1bmN0aW9uIGFycmF5QWxsKHNlbGVjdCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGFycmF5KHNlbGVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIGlmICh0eXBlb2Ygc2VsZWN0ID09PSBcImZ1bmN0aW9uXCIpIHNlbGVjdCA9IGFycmF5QWxsKHNlbGVjdCk7XG4gIGVsc2Ugc2VsZWN0ID0gc2VsZWN0b3JBbGwoc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBbXSwgcGFyZW50cyA9IFtdLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBzdWJncm91cHMucHVzaChzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpO1xuICAgICAgICBwYXJlbnRzLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCBwYXJlbnRzKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoaWxkTWF0Y2hlcihzZWxlY3Rvcikge1xuICByZXR1cm4gZnVuY3Rpb24obm9kZSkge1xuICAgIHJldHVybiBub2RlLm1hdGNoZXMoc2VsZWN0b3IpO1xuICB9O1xufVxuXG4iLCJpbXBvcnQge2NoaWxkTWF0Y2hlcn0gZnJvbSBcIi4uL21hdGNoZXIuanNcIjtcblxudmFyIGZpbmQgPSBBcnJheS5wcm90b3R5cGUuZmluZDtcblxuZnVuY3Rpb24gY2hpbGRGaW5kKG1hdGNoKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZmluZC5jYWxsKHRoaXMuY2hpbGRyZW4sIG1hdGNoKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY2hpbGRGaXJzdCgpIHtcbiAgcmV0dXJuIHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hdGNoKSB7XG4gIHJldHVybiB0aGlzLnNlbGVjdChtYXRjaCA9PSBudWxsID8gY2hpbGRGaXJzdFxuICAgICAgOiBjaGlsZEZpbmQodHlwZW9mIG1hdGNoID09PSBcImZ1bmN0aW9uXCIgPyBtYXRjaCA6IGNoaWxkTWF0Y2hlcihtYXRjaCkpKTtcbn1cbiIsImltcG9ydCB7Y2hpbGRNYXRjaGVyfSBmcm9tIFwiLi4vbWF0Y2hlci5qc1wiO1xuXG52YXIgZmlsdGVyID0gQXJyYXkucHJvdG90eXBlLmZpbHRlcjtcblxuZnVuY3Rpb24gY2hpbGRyZW4oKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4pO1xufVxuXG5mdW5jdGlvbiBjaGlsZHJlbkZpbHRlcihtYXRjaCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGZpbHRlci5jYWxsKHRoaXMuY2hpbGRyZW4sIG1hdGNoKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0QWxsKG1hdGNoID09IG51bGwgPyBjaGlsZHJlblxuICAgICAgOiBjaGlsZHJlbkZpbHRlcih0eXBlb2YgbWF0Y2ggPT09IFwiZnVuY3Rpb25cIiA/IG1hdGNoIDogY2hpbGRNYXRjaGVyKG1hdGNoKSkpO1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgbWF0Y2hlciBmcm9tIFwiLi4vbWF0Y2hlci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICBpZiAodHlwZW9mIG1hdGNoICE9PSBcImZ1bmN0aW9uXCIpIG1hdGNoID0gbWF0Y2hlcihtYXRjaCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IFtdLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7XG4gICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHVwZGF0ZSkge1xuICByZXR1cm4gbmV3IEFycmF5KHVwZGF0ZS5sZW5ndGgpO1xufVxuIiwiaW1wb3J0IHNwYXJzZSBmcm9tIFwiLi9zcGFyc2UuanNcIjtcbmltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZW50ZXIgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UpLCB0aGlzLl9wYXJlbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEVudGVyTm9kZShwYXJlbnQsIGRhdHVtKSB7XG4gIHRoaXMub3duZXJEb2N1bWVudCA9IHBhcmVudC5vd25lckRvY3VtZW50O1xuICB0aGlzLm5hbWVzcGFjZVVSSSA9IHBhcmVudC5uYW1lc3BhY2VVUkk7XG4gIHRoaXMuX25leHQgPSBudWxsO1xuICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gIHRoaXMuX19kYXRhX18gPSBkYXR1bTtcbn1cblxuRW50ZXJOb2RlLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IEVudGVyTm9kZSxcbiAgYXBwZW5kQ2hpbGQ6IGZ1bmN0aW9uKGNoaWxkKSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCB0aGlzLl9uZXh0KTsgfSxcbiAgaW5zZXJ0QmVmb3JlOiBmdW5jdGlvbihjaGlsZCwgbmV4dCkgeyByZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbmV4dCk7IH0sXG4gIHF1ZXJ5U2VsZWN0b3I6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7IH0sXG4gIHF1ZXJ5U2VsZWN0b3JBbGw6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7IH1cbn07XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih4KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4geDtcbiAgfTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHtFbnRlck5vZGV9IGZyb20gXCIuL2VudGVyLmpzXCI7XG5pbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4uL2NvbnN0YW50LmpzXCI7XG5cbmZ1bmN0aW9uIGJpbmRJbmRleChwYXJlbnQsIGdyb3VwLCBlbnRlciwgdXBkYXRlLCBleGl0LCBkYXRhKSB7XG4gIHZhciBpID0gMCxcbiAgICAgIG5vZGUsXG4gICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDtcblxuICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZml0IGludG8gdXBkYXRlLlxuICAvLyBQdXQgYW55IG51bGwgbm9kZXMgaW50byBlbnRlci5cbiAgLy8gUHV0IGFueSByZW1haW5pbmcgZGF0YSBpbnRvIGVudGVyLlxuICBmb3IgKDsgaSA8IGRhdGFMZW5ndGg7ICsraSkge1xuICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldO1xuICAgICAgdXBkYXRlW2ldID0gbm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtpXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gUHV0IGFueSBub24tbnVsbCBub2RlcyB0aGF0IGRvbuKAmXQgZml0IGludG8gZXhpdC5cbiAgZm9yICg7IGkgPCBncm91cExlbmd0aDsgKytpKSB7XG4gICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgZXhpdFtpXSA9IG5vZGU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGJpbmRLZXkocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSwga2V5KSB7XG4gIHZhciBpLFxuICAgICAgbm9kZSxcbiAgICAgIG5vZGVCeUtleVZhbHVlID0gbmV3IE1hcCxcbiAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLFxuICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoLFxuICAgICAga2V5VmFsdWVzID0gbmV3IEFycmF5KGdyb3VwTGVuZ3RoKSxcbiAgICAgIGtleVZhbHVlO1xuXG4gIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBub2RlLlxuICAvLyBJZiBtdWx0aXBsZSBub2RlcyBoYXZlIHRoZSBzYW1lIGtleSwgdGhlIGR1cGxpY2F0ZXMgYXJlIGFkZGVkIHRvIGV4aXQuXG4gIGZvciAoaSA9IDA7IGkgPCBncm91cExlbmd0aDsgKytpKSB7XG4gICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAga2V5VmFsdWVzW2ldID0ga2V5VmFsdWUgPSBrZXkuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkgKyBcIlwiO1xuICAgICAgaWYgKG5vZGVCeUtleVZhbHVlLmhhcyhrZXlWYWx1ZSkpIHtcbiAgICAgICAgZXhpdFtpXSA9IG5vZGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlQnlLZXlWYWx1ZS5zZXQoa2V5VmFsdWUsIG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBkYXR1bS5cbiAgLy8gSWYgdGhlcmUgYSBub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGtleSwgam9pbiBhbmQgYWRkIGl0IHRvIHVwZGF0ZS5cbiAgLy8gSWYgdGhlcmUgaXMgbm90IChvciB0aGUga2V5IGlzIGEgZHVwbGljYXRlKSwgYWRkIGl0IHRvIGVudGVyLlxuICBmb3IgKGkgPSAwOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7XG4gICAga2V5VmFsdWUgPSBrZXkuY2FsbChwYXJlbnQsIGRhdGFbaV0sIGksIGRhdGEpICsgXCJcIjtcbiAgICBpZiAobm9kZSA9IG5vZGVCeUtleVZhbHVlLmdldChrZXlWYWx1ZSkpIHtcbiAgICAgIHVwZGF0ZVtpXSA9IG5vZGU7XG4gICAgICBub2RlLl9fZGF0YV9fID0gZGF0YVtpXTtcbiAgICAgIG5vZGVCeUtleVZhbHVlLmRlbGV0ZShrZXlWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudGVyW2ldID0gbmV3IEVudGVyTm9kZShwYXJlbnQsIGRhdGFbaV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCBhbnkgcmVtYWluaW5nIG5vZGVzIHRoYXQgd2VyZSBub3QgYm91bmQgdG8gZGF0YSB0byBleGl0LlxuICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkge1xuICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAobm9kZUJ5S2V5VmFsdWUuZ2V0KGtleVZhbHVlc1tpXSkgPT09IG5vZGUpKSB7XG4gICAgICBleGl0W2ldID0gbm9kZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGF0dW0obm9kZSkge1xuICByZXR1cm4gbm9kZS5fX2RhdGFfXztcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBBcnJheS5mcm9tKHRoaXMsIGRhdHVtKTtcblxuICB2YXIgYmluZCA9IGtleSA/IGJpbmRLZXkgOiBiaW5kSW5kZXgsXG4gICAgICBwYXJlbnRzID0gdGhpcy5fcGFyZW50cyxcbiAgICAgIGdyb3VwcyA9IHRoaXMuX2dyb3VwcztcblxuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHZhbHVlID0gY29uc3RhbnQodmFsdWUpO1xuXG4gIGZvciAodmFyIG0gPSBncm91cHMubGVuZ3RoLCB1cGRhdGUgPSBuZXcgQXJyYXkobSksIGVudGVyID0gbmV3IEFycmF5KG0pLCBleGl0ID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIHZhciBwYXJlbnQgPSBwYXJlbnRzW2pdLFxuICAgICAgICBncm91cCA9IGdyb3Vwc1tqXSxcbiAgICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsXG4gICAgICAgIGRhdGEgPSBhcnJheWxpa2UodmFsdWUuY2FsbChwYXJlbnQsIHBhcmVudCAmJiBwYXJlbnQuX19kYXRhX18sIGosIHBhcmVudHMpKSxcbiAgICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoLFxuICAgICAgICBlbnRlckdyb3VwID0gZW50ZXJbal0gPSBuZXcgQXJyYXkoZGF0YUxlbmd0aCksXG4gICAgICAgIHVwZGF0ZUdyb3VwID0gdXBkYXRlW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLFxuICAgICAgICBleGl0R3JvdXAgPSBleGl0W2pdID0gbmV3IEFycmF5KGdyb3VwTGVuZ3RoKTtcblxuICAgIGJpbmQocGFyZW50LCBncm91cCwgZW50ZXJHcm91cCwgdXBkYXRlR3JvdXAsIGV4aXRHcm91cCwgZGF0YSwga2V5KTtcblxuICAgIC8vIE5vdyBjb25uZWN0IHRoZSBlbnRlciBub2RlcyB0byB0aGVpciBmb2xsb3dpbmcgdXBkYXRlIG5vZGUsIHN1Y2ggdGhhdFxuICAgIC8vIGFwcGVuZENoaWxkIGNhbiBpbnNlcnQgdGhlIG1hdGVyaWFsaXplZCBlbnRlciBub2RlIGJlZm9yZSB0aGlzIG5vZGUsXG4gICAgLy8gcmF0aGVyIHRoYW4gYXQgdGhlIGVuZCBvZiB0aGUgcGFyZW50IG5vZGUuXG4gICAgZm9yICh2YXIgaTAgPSAwLCBpMSA9IDAsIHByZXZpb3VzLCBuZXh0OyBpMCA8IGRhdGFMZW5ndGg7ICsraTApIHtcbiAgICAgIGlmIChwcmV2aW91cyA9IGVudGVyR3JvdXBbaTBdKSB7XG4gICAgICAgIGlmIChpMCA+PSBpMSkgaTEgPSBpMCArIDE7XG4gICAgICAgIHdoaWxlICghKG5leHQgPSB1cGRhdGVHcm91cFtpMV0pICYmICsraTEgPCBkYXRhTGVuZ3RoKTtcbiAgICAgICAgcHJldmlvdXMuX25leHQgPSBuZXh0IHx8IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlID0gbmV3IFNlbGVjdGlvbih1cGRhdGUsIHBhcmVudHMpO1xuICB1cGRhdGUuX2VudGVyID0gZW50ZXI7XG4gIHVwZGF0ZS5fZXhpdCA9IGV4aXQ7XG4gIHJldHVybiB1cGRhdGU7XG59XG5cbi8vIEdpdmVuIHNvbWUgZGF0YSwgdGhpcyByZXR1cm5zIGFuIGFycmF5LWxpa2UgdmlldyBvZiBpdDogYW4gb2JqZWN0IHRoYXRcbi8vIGV4cG9zZXMgYSBsZW5ndGggcHJvcGVydHkgYW5kIGFsbG93cyBudW1lcmljIGluZGV4aW5nLiBOb3RlIHRoYXQgdW5saWtlXG4vLyBzZWxlY3RBbGwsIHRoaXMgaXNu4oCZdCB3b3JyaWVkIGFib3V0IOKAnGxpdmXigJ0gY29sbGVjdGlvbnMgYmVjYXVzZSB0aGUgcmVzdWx0aW5nXG4vLyBhcnJheSB3aWxsIG9ubHkgYmUgdXNlZCBicmllZmx5IHdoaWxlIGRhdGEgaXMgYmVpbmcgYm91bmQuIChJdCBpcyBwb3NzaWJsZSB0b1xuLy8gY2F1c2UgdGhlIGRhdGEgdG8gY2hhbmdlIHdoaWxlIGl0ZXJhdGluZyBieSB1c2luZyBhIGtleSBmdW5jdGlvbiwgYnV0IHBsZWFzZVxuLy8gZG9u4oCZdDsgd2XigJlkIHJhdGhlciBhdm9pZCBhIGdyYXR1aXRvdXMgY29weS4pXG5mdW5jdGlvbiBhcnJheWxpa2UoZGF0YSkge1xuICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgXCJsZW5ndGhcIiBpbiBkYXRhXG4gICAgPyBkYXRhIC8vIEFycmF5LCBUeXBlZEFycmF5LCBOb2RlTGlzdCwgYXJyYXktbGlrZVxuICAgIDogQXJyYXkuZnJvbShkYXRhKTsgLy8gTWFwLCBTZXQsIGl0ZXJhYmxlLCBzdHJpbmcsIG9yIGFueXRoaW5nIGVsc2Vcbn1cbiIsImltcG9ydCBzcGFyc2UgZnJvbSBcIi4vc3BhcnNlLmpzXCI7XG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2V4aXQgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UpLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG9uZW50ZXIsIG9udXBkYXRlLCBvbmV4aXQpIHtcbiAgdmFyIGVudGVyID0gdGhpcy5lbnRlcigpLCB1cGRhdGUgPSB0aGlzLCBleGl0ID0gdGhpcy5leGl0KCk7XG4gIGlmICh0eXBlb2Ygb25lbnRlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZW50ZXIgPSBvbmVudGVyKGVudGVyKTtcbiAgICBpZiAoZW50ZXIpIGVudGVyID0gZW50ZXIuc2VsZWN0aW9uKCk7XG4gIH0gZWxzZSB7XG4gICAgZW50ZXIgPSBlbnRlci5hcHBlbmQob25lbnRlciArIFwiXCIpO1xuICB9XG4gIGlmIChvbnVwZGF0ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlID0gb251cGRhdGUodXBkYXRlKTtcbiAgICBpZiAodXBkYXRlKSB1cGRhdGUgPSB1cGRhdGUuc2VsZWN0aW9uKCk7XG4gIH1cbiAgaWYgKG9uZXhpdCA9PSBudWxsKSBleGl0LnJlbW92ZSgpOyBlbHNlIG9uZXhpdChleGl0KTtcbiAgcmV0dXJuIGVudGVyICYmIHVwZGF0ZSA/IGVudGVyLm1lcmdlKHVwZGF0ZSkub3JkZXIoKSA6IHVwZGF0ZTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb250ZXh0KSB7XG4gIHZhciBzZWxlY3Rpb24gPSBjb250ZXh0LnNlbGVjdGlvbiA/IGNvbnRleHQuc2VsZWN0aW9uKCkgOiBjb250ZXh0O1xuXG4gIGZvciAodmFyIGdyb3VwczAgPSB0aGlzLl9ncm91cHMsIGdyb3VwczEgPSBzZWxlY3Rpb24uX2dyb3VwcywgbTAgPSBncm91cHMwLmxlbmd0aCwgbTEgPSBncm91cHMxLmxlbmd0aCwgbSA9IE1hdGgubWluKG0wLCBtMSksIG1lcmdlcyA9IG5ldyBBcnJheShtMCksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAwID0gZ3JvdXBzMFtqXSwgZ3JvdXAxID0gZ3JvdXBzMVtqXSwgbiA9IGdyb3VwMC5sZW5ndGgsIG1lcmdlID0gbWVyZ2VzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cDBbaV0gfHwgZ3JvdXAxW2ldKSB7XG4gICAgICAgIG1lcmdlW2ldID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKDsgaiA8IG0wOyArK2opIHtcbiAgICBtZXJnZXNbal0gPSBncm91cHMwW2pdO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24obWVyZ2VzLCB0aGlzLl9wYXJlbnRzKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IC0xLCBtID0gZ3JvdXBzLmxlbmd0aDsgKytqIDwgbTspIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IGdyb3VwLmxlbmd0aCAtIDEsIG5leHQgPSBncm91cFtpXSwgbm9kZTsgLS1pID49IDA7KSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIGlmIChuZXh0ICYmIG5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24obmV4dCkgXiA0KSBuZXh0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIG5leHQpO1xuICAgICAgICBuZXh0ID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb21wYXJlKSB7XG4gIGlmICghY29tcGFyZSkgY29tcGFyZSA9IGFzY2VuZGluZztcblxuICBmdW5jdGlvbiBjb21wYXJlTm9kZShhLCBiKSB7XG4gICAgcmV0dXJuIGEgJiYgYiA/IGNvbXBhcmUoYS5fX2RhdGFfXywgYi5fX2RhdGFfXykgOiAhYSAtICFiO1xuICB9XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc29ydGdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc29ydGdyb3VwID0gc29ydGdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgc29ydGdyb3VwW2ldID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgc29ydGdyb3VwLnNvcnQoY29tcGFyZU5vZGUpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc29ydGdyb3VwcywgdGhpcy5fcGFyZW50cykub3JkZXIoKTtcbn1cblxuZnVuY3Rpb24gYXNjZW5kaW5nKGEsIGIpIHtcbiAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiBhID49IGIgPyAwIDogTmFOO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50c1swXTtcbiAgYXJndW1lbnRzWzBdID0gdGhpcztcbiAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgcmV0dXJuIHRoaXM7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIEFycmF5LmZyb20odGhpcyk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAwLCBtID0gZ3JvdXBzLmxlbmd0aDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgdmFyIG5vZGUgPSBncm91cFtpXTtcbiAgICAgIGlmIChub2RlKSByZXR1cm4gbm9kZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICBsZXQgc2l6ZSA9IDA7XG4gIGZvciAoY29uc3Qgbm9kZSBvZiB0aGlzKSArK3NpemU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgcmV0dXJuIHNpemU7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuICF0aGlzLm5vZGUoKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIGNhbGxiYWNrLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufVxuIiwiaW1wb3J0IG5hbWVzcGFjZSBmcm9tIFwiLi4vbmFtZXNwYWNlLmpzXCI7XG5cbmZ1bmN0aW9uIGF0dHJSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJSZW1vdmVOUyhmdWxsbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnQobmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMoZnVsbG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgdmFsdWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyRnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodiA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICBlbHNlIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIHYpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyRnVuY3Rpb25OUyhmdWxsbmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodiA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgdik7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgbm9kZSA9IHRoaXMubm9kZSgpO1xuICAgIHJldHVybiBmdWxsbmFtZS5sb2NhbFxuICAgICAgICA/IG5vZGUuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKVxuICAgICAgICA6IG5vZGUuZ2V0QXR0cmlidXRlKGZ1bGxuYW1lKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLmVhY2goKHZhbHVlID09IG51bGxcbiAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0clJlbW92ZU5TIDogYXR0clJlbW92ZSkgOiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMgOiBhdHRyRnVuY3Rpb24pXG4gICAgICA6IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJDb25zdGFudE5TIDogYXR0ckNvbnN0YW50KSkpKGZ1bGxuYW1lLCB2YWx1ZSkpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSkge1xuICByZXR1cm4gKG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpIC8vIG5vZGUgaXMgYSBOb2RlXG4gICAgICB8fCAobm9kZS5kb2N1bWVudCAmJiBub2RlKSAvLyBub2RlIGlzIGEgV2luZG93XG4gICAgICB8fCBub2RlLmRlZmF1bHRWaWV3OyAvLyBub2RlIGlzIGEgRG9jdW1lbnRcbn1cbiIsImltcG9ydCBkZWZhdWx0VmlldyBmcm9tIFwiLi4vd2luZG93LmpzXCI7XG5cbmZ1bmN0aW9uIHN0eWxlUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlLCBwcmlvcml0eSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgICBlbHNlIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdiwgcHJpb3JpdHkpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxXG4gICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbFxuICAgICAgICAgICAgPyBzdHlsZVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICA/IHN0eWxlRnVuY3Rpb25cbiAgICAgICAgICAgIDogc3R5bGVDb25zdGFudCkobmFtZSwgdmFsdWUsIHByaW9yaXR5ID09IG51bGwgPyBcIlwiIDogcHJpb3JpdHkpKVxuICAgICAgOiBzdHlsZVZhbHVlKHRoaXMubm9kZSgpLCBuYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0eWxlVmFsdWUobm9kZSwgbmFtZSkge1xuICByZXR1cm4gbm9kZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpXG4gICAgICB8fCBkZWZhdWx0Vmlldyhub2RlKS5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpLmdldFByb3BlcnR5VmFsdWUobmFtZSk7XG59XG4iLCJmdW5jdGlvbiBwcm9wZXJ0eVJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBkZWxldGUgdGhpc1tuYW1lXTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcHJvcGVydHlDb25zdGFudChuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpc1tuYW1lXSA9IHZhbHVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eUZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgZGVsZXRlIHRoaXNbbmFtZV07XG4gICAgZWxzZSB0aGlzW25hbWVdID0gdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxXG4gICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbFxuICAgICAgICAgID8gcHJvcGVydHlSZW1vdmUgOiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gcHJvcGVydHlGdW5jdGlvblxuICAgICAgICAgIDogcHJvcGVydHlDb25zdGFudCkobmFtZSwgdmFsdWUpKVxuICAgICAgOiB0aGlzLm5vZGUoKVtuYW1lXTtcbn1cbiIsImZ1bmN0aW9uIGNsYXNzQXJyYXkoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcudHJpbSgpLnNwbGl0KC9efFxccysvKTtcbn1cblxuZnVuY3Rpb24gY2xhc3NMaXN0KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuY2xhc3NMaXN0IHx8IG5ldyBDbGFzc0xpc3Qobm9kZSk7XG59XG5cbmZ1bmN0aW9uIENsYXNzTGlzdChub2RlKSB7XG4gIHRoaXMuX25vZGUgPSBub2RlO1xuICB0aGlzLl9uYW1lcyA9IGNsYXNzQXJyYXkobm9kZS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKSB8fCBcIlwiKTtcbn1cblxuQ2xhc3NMaXN0LnByb3RvdHlwZSA9IHtcbiAgYWRkOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgdmFyIGkgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpO1xuICAgIGlmIChpIDwgMCkge1xuICAgICAgdGhpcy5fbmFtZXMucHVzaChuYW1lKTtcbiAgICAgIHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgdGhpcy5fbmFtZXMuam9pbihcIiBcIikpO1xuICAgIH1cbiAgfSxcbiAgcmVtb3ZlOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgdmFyIGkgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpO1xuICAgIGlmIChpID49IDApIHtcbiAgICAgIHRoaXMuX25hbWVzLnNwbGljZShpLCAxKTtcbiAgICAgIHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgdGhpcy5fbmFtZXMuam9pbihcIiBcIikpO1xuICAgIH1cbiAgfSxcbiAgY29udGFpbnM6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKSA+PSAwO1xuICB9XG59O1xuXG5mdW5jdGlvbiBjbGFzc2VkQWRkKG5vZGUsIG5hbWVzKSB7XG4gIHZhciBsaXN0ID0gY2xhc3NMaXN0KG5vZGUpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7XG4gIHdoaWxlICgrK2kgPCBuKSBsaXN0LmFkZChuYW1lc1tpXSk7XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRSZW1vdmUobm9kZSwgbmFtZXMpIHtcbiAgdmFyIGxpc3QgPSBjbGFzc0xpc3Qobm9kZSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDtcbiAgd2hpbGUgKCsraSA8IG4pIGxpc3QucmVtb3ZlKG5hbWVzW2ldKTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZFRydWUobmFtZXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGNsYXNzZWRBZGQodGhpcywgbmFtZXMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkRmFsc2UobmFtZXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGNsYXNzZWRSZW1vdmUodGhpcywgbmFtZXMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkRnVuY3Rpb24obmFtZXMsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAodmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKSA/IGNsYXNzZWRBZGQgOiBjbGFzc2VkUmVtb3ZlKSh0aGlzLCBuYW1lcyk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBuYW1lcyA9IGNsYXNzQXJyYXkobmFtZSArIFwiXCIpO1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciBsaXN0ID0gY2xhc3NMaXN0KHRoaXMubm9kZSgpKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoO1xuICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWxpc3QuY29udGFpbnMobmFtZXNbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBjbGFzc2VkRnVuY3Rpb24gOiB2YWx1ZVxuICAgICAgPyBjbGFzc2VkVHJ1ZVxuICAgICAgOiBjbGFzc2VkRmFsc2UpKG5hbWVzLCB2YWx1ZSkpO1xufVxuIiwiZnVuY3Rpb24gdGV4dFJlbW92ZSgpIHtcbiAgdGhpcy50ZXh0Q29udGVudCA9IFwiXCI7XG59XG5cbmZ1bmN0aW9uIHRleHRDb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0ZXh0RnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdiA9PSBudWxsID8gXCJcIiA6IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsXG4gICAgICAgICAgPyB0ZXh0UmVtb3ZlIDogKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyB0ZXh0RnVuY3Rpb25cbiAgICAgICAgICA6IHRleHRDb25zdGFudCkodmFsdWUpKVxuICAgICAgOiB0aGlzLm5vZGUoKS50ZXh0Q29udGVudDtcbn1cbiIsImZ1bmN0aW9uIGh0bWxSZW1vdmUoKSB7XG4gIHRoaXMuaW5uZXJIVE1MID0gXCJcIjtcbn1cblxuZnVuY3Rpb24gaHRtbENvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmlubmVySFRNTCA9IHZhbHVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiBodG1sRnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0aGlzLmlubmVySFRNTCA9IHYgPT0gbnVsbCA/IFwiXCIgOiB2O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbFxuICAgICAgICAgID8gaHRtbFJlbW92ZSA6ICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gaHRtbEZ1bmN0aW9uXG4gICAgICAgICAgOiBodG1sQ29uc3RhbnQpKHZhbHVlKSlcbiAgICAgIDogdGhpcy5ub2RlKCkuaW5uZXJIVE1MO1xufVxuIiwiZnVuY3Rpb24gcmFpc2UoKSB7XG4gIGlmICh0aGlzLm5leHRTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5lYWNoKHJhaXNlKTtcbn1cbiIsImZ1bmN0aW9uIGxvd2VyKCkge1xuICBpZiAodGhpcy5wcmV2aW91c1NpYmxpbmcpIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcywgdGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChsb3dlcik7XG59XG4iLCJpbXBvcnQgY3JlYXRvciBmcm9tIFwiLi4vY3JlYXRvci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lKSB7XG4gIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gXCJmdW5jdGlvblwiID8gbmFtZSA6IGNyZWF0b3IobmFtZSk7XG4gIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChjcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IGNyZWF0b3IgZnJvbSBcIi4uL2NyZWF0b3IuanNcIjtcbmltcG9ydCBzZWxlY3RvciBmcm9tIFwiLi4vc2VsZWN0b3IuanNcIjtcblxuZnVuY3Rpb24gY29uc3RhbnROdWxsKCkge1xuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgYmVmb3JlKSB7XG4gIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gXCJmdW5jdGlvblwiID8gbmFtZSA6IGNyZWF0b3IobmFtZSksXG4gICAgICBzZWxlY3QgPSBiZWZvcmUgPT0gbnVsbCA/IGNvbnN0YW50TnVsbCA6IHR5cGVvZiBiZWZvcmUgPT09IFwiZnVuY3Rpb25cIiA/IGJlZm9yZSA6IHNlbGVjdG9yKGJlZm9yZSk7XG4gIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHNlbGVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IG51bGwpO1xuICB9KTtcbn1cbiIsImZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChyZW1vdmUpO1xufVxuIiwiZnVuY3Rpb24gc2VsZWN0aW9uX2Nsb25lU2hhbGxvdygpIHtcbiAgdmFyIGNsb25lID0gdGhpcy5jbG9uZU5vZGUoZmFsc2UpLCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gIHJldHVybiBwYXJlbnQgPyBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNsb25lLCB0aGlzLm5leHRTaWJsaW5nKSA6IGNsb25lO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb25fY2xvbmVEZWVwKCkge1xuICB2YXIgY2xvbmUgPSB0aGlzLmNsb25lTm9kZSh0cnVlKSwgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICByZXR1cm4gcGFyZW50ID8gcGFyZW50Lmluc2VydEJlZm9yZShjbG9uZSwgdGhpcy5uZXh0U2libGluZykgOiBjbG9uZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZGVlcCkge1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZGVlcCA/IHNlbGVjdGlvbl9jbG9uZURlZXAgOiBzZWxlY3Rpb25fY2xvbmVTaGFsbG93KTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMucHJvcGVydHkoXCJfX2RhdGFfX1wiLCB2YWx1ZSlcbiAgICAgIDogdGhpcy5ub2RlKCkuX19kYXRhX187XG59XG4iLCJmdW5jdGlvbiBjb250ZXh0TGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBldmVudCwgdGhpcy5fX2RhdGFfXyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lcykge1xuICByZXR1cm4gdHlwZW5hbWVzLnRyaW0oKS5zcGxpdCgvXnxcXHMrLykubWFwKGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgbmFtZSA9IFwiXCIsIGkgPSB0LmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2UoMCwgaSk7XG4gICAgcmV0dXJuIHt0eXBlOiB0LCBuYW1lOiBuYW1lfTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG9uUmVtb3ZlKHR5cGVuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgb24gPSB0aGlzLl9fb247XG4gICAgaWYgKCFvbikgcmV0dXJuO1xuICAgIGZvciAodmFyIGogPSAwLCBpID0gLTEsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHtcbiAgICAgIGlmIChvID0gb25bal0sICghdHlwZW5hbWUudHlwZSB8fCBvLnR5cGUgPT09IHR5cGVuYW1lLnR5cGUpICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkge1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLm9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25bKytpXSA9IG87XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgrK2kpIG9uLmxlbmd0aCA9IGk7XG4gICAgZWxzZSBkZWxldGUgdGhpcy5fX29uO1xuICB9O1xufVxuXG5mdW5jdGlvbiBvbkFkZCh0eXBlbmFtZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBvbiA9IHRoaXMuX19vbiwgbywgbGlzdGVuZXIgPSBjb250ZXh0TGlzdGVuZXIodmFsdWUpO1xuICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICAgIGlmICgobyA9IG9uW2pdKS50eXBlID09PSB0eXBlbmFtZS50eXBlICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkge1xuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLm9wdGlvbnMpO1xuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyID0gbGlzdGVuZXIsIG8ub3B0aW9ucyA9IG9wdGlvbnMpO1xuICAgICAgICBvLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKHR5cGVuYW1lLnR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICBvID0ge3R5cGU6IHR5cGVuYW1lLnR5cGUsIG5hbWU6IHR5cGVuYW1lLm5hbWUsIHZhbHVlOiB2YWx1ZSwgbGlzdGVuZXI6IGxpc3RlbmVyLCBvcHRpb25zOiBvcHRpb25zfTtcbiAgICBpZiAoIW9uKSB0aGlzLl9fb24gPSBbb107XG4gICAgZWxzZSBvbi5wdXNoKG8pO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih0eXBlbmFtZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgdmFyIHR5cGVuYW1lcyA9IHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lICsgXCJcIiksIGksIG4gPSB0eXBlbmFtZXMubGVuZ3RoLCB0O1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciBvbiA9IHRoaXMubm9kZSgpLl9fb247XG4gICAgaWYgKG9uKSBmb3IgKHZhciBqID0gMCwgbSA9IG9uLmxlbmd0aCwgbzsgaiA8IG07ICsraikge1xuICAgICAgZm9yIChpID0gMCwgbyA9IG9uW2pdOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGlmICgodCA9IHR5cGVuYW1lc1tpXSkudHlwZSA9PT0gby50eXBlICYmIHQubmFtZSA9PT0gby5uYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIG8udmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgb24gPSB2YWx1ZSA/IG9uQWRkIDogb25SZW1vdmU7XG4gIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHRoaXMuZWFjaChvbih0eXBlbmFtZXNbaV0sIHZhbHVlLCBvcHRpb25zKSk7XG4gIHJldHVybiB0aGlzO1xufVxuIiwiaW1wb3J0IGRlZmF1bHRWaWV3IGZyb20gXCIuLi93aW5kb3cuanNcIjtcblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudChub2RlLCB0eXBlLCBwYXJhbXMpIHtcbiAgdmFyIHdpbmRvdyA9IGRlZmF1bHRWaWV3KG5vZGUpLFxuICAgICAgZXZlbnQgPSB3aW5kb3cuQ3VzdG9tRXZlbnQ7XG5cbiAgaWYgKHR5cGVvZiBldmVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgZXZlbnQgPSBuZXcgZXZlbnQodHlwZSwgcGFyYW1zKTtcbiAgfSBlbHNlIHtcbiAgICBldmVudCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFdmVudChcIkV2ZW50XCIpO1xuICAgIGlmIChwYXJhbXMpIGV2ZW50LmluaXRFdmVudCh0eXBlLCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUpLCBldmVudC5kZXRhaWwgPSBwYXJhbXMuZGV0YWlsO1xuICAgIGVsc2UgZXZlbnQuaW5pdEV2ZW50KHR5cGUsIGZhbHNlLCBmYWxzZSk7XG4gIH1cblxuICBub2RlLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaENvbnN0YW50KHR5cGUsIHBhcmFtcykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoRXZlbnQodGhpcywgdHlwZSwgcGFyYW1zKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hGdW5jdGlvbih0eXBlLCBwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odHlwZSwgcGFyYW1zKSB7XG4gIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiBwYXJhbXMgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBkaXNwYXRjaEZ1bmN0aW9uXG4gICAgICA6IGRpc3BhdGNoQ29uc3RhbnQpKHR5cGUsIHBhcmFtcykpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24qKCkge1xuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAwLCBtID0gZ3JvdXBzLmxlbmd0aDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZTsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgeWllbGQgbm9kZTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBzZWxlY3Rpb25fc2VsZWN0IGZyb20gXCIuL3NlbGVjdC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RBbGwgZnJvbSBcIi4vc2VsZWN0QWxsLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NlbGVjdENoaWxkIGZyb20gXCIuL3NlbGVjdENoaWxkLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NlbGVjdENoaWxkcmVuIGZyb20gXCIuL3NlbGVjdENoaWxkcmVuLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2ZpbHRlciBmcm9tIFwiLi9maWx0ZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGF0YSBmcm9tIFwiLi9kYXRhLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VudGVyIGZyb20gXCIuL2VudGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2V4aXQgZnJvbSBcIi4vZXhpdC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9qb2luIGZyb20gXCIuL2pvaW4uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbWVyZ2UgZnJvbSBcIi4vbWVyZ2UuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fb3JkZXIgZnJvbSBcIi4vb3JkZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc29ydCBmcm9tIFwiLi9zb3J0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2NhbGwgZnJvbSBcIi4vY2FsbC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9ub2RlcyBmcm9tIFwiLi9ub2Rlcy5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9ub2RlIGZyb20gXCIuL25vZGUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc2l6ZSBmcm9tIFwiLi9zaXplLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VtcHR5IGZyb20gXCIuL2VtcHR5LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2VhY2ggZnJvbSBcIi4vZWFjaC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9hdHRyIGZyb20gXCIuL2F0dHIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc3R5bGUgZnJvbSBcIi4vc3R5bGUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fcHJvcGVydHkgZnJvbSBcIi4vcHJvcGVydHkuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fY2xhc3NlZCBmcm9tIFwiLi9jbGFzc2VkLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3RleHQgZnJvbSBcIi4vdGV4dC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9odG1sIGZyb20gXCIuL2h0bWwuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fcmFpc2UgZnJvbSBcIi4vcmFpc2UuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbG93ZXIgZnJvbSBcIi4vbG93ZXIuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fYXBwZW5kIGZyb20gXCIuL2FwcGVuZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9pbnNlcnQgZnJvbSBcIi4vaW5zZXJ0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3JlbW92ZSBmcm9tIFwiLi9yZW1vdmUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fY2xvbmUgZnJvbSBcIi4vY2xvbmUuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGF0dW0gZnJvbSBcIi4vZGF0dW0uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fb24gZnJvbSBcIi4vb24uanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fZGlzcGF0Y2ggZnJvbSBcIi4vZGlzcGF0Y2guanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faXRlcmF0b3IgZnJvbSBcIi4vaXRlcmF0b3IuanNcIjtcblxuZXhwb3J0IHZhciByb290ID0gW251bGxdO1xuXG5leHBvcnQgZnVuY3Rpb24gU2VsZWN0aW9uKGdyb3VwcywgcGFyZW50cykge1xuICB0aGlzLl9ncm91cHMgPSBncm91cHM7XG4gIHRoaXMuX3BhcmVudHMgPSBwYXJlbnRzO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKFtbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XV0sIHJvb3QpO1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb25fc2VsZWN0aW9uKCkge1xuICByZXR1cm4gdGhpcztcbn1cblxuU2VsZWN0aW9uLnByb3RvdHlwZSA9IHNlbGVjdGlvbi5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBTZWxlY3Rpb24sXG4gIHNlbGVjdDogc2VsZWN0aW9uX3NlbGVjdCxcbiAgc2VsZWN0QWxsOiBzZWxlY3Rpb25fc2VsZWN0QWxsLFxuICBzZWxlY3RDaGlsZDogc2VsZWN0aW9uX3NlbGVjdENoaWxkLFxuICBzZWxlY3RDaGlsZHJlbjogc2VsZWN0aW9uX3NlbGVjdENoaWxkcmVuLFxuICBmaWx0ZXI6IHNlbGVjdGlvbl9maWx0ZXIsXG4gIGRhdGE6IHNlbGVjdGlvbl9kYXRhLFxuICBlbnRlcjogc2VsZWN0aW9uX2VudGVyLFxuICBleGl0OiBzZWxlY3Rpb25fZXhpdCxcbiAgam9pbjogc2VsZWN0aW9uX2pvaW4sXG4gIG1lcmdlOiBzZWxlY3Rpb25fbWVyZ2UsXG4gIHNlbGVjdGlvbjogc2VsZWN0aW9uX3NlbGVjdGlvbixcbiAgb3JkZXI6IHNlbGVjdGlvbl9vcmRlcixcbiAgc29ydDogc2VsZWN0aW9uX3NvcnQsXG4gIGNhbGw6IHNlbGVjdGlvbl9jYWxsLFxuICBub2Rlczogc2VsZWN0aW9uX25vZGVzLFxuICBub2RlOiBzZWxlY3Rpb25fbm9kZSxcbiAgc2l6ZTogc2VsZWN0aW9uX3NpemUsXG4gIGVtcHR5OiBzZWxlY3Rpb25fZW1wdHksXG4gIGVhY2g6IHNlbGVjdGlvbl9lYWNoLFxuICBhdHRyOiBzZWxlY3Rpb25fYXR0cixcbiAgc3R5bGU6IHNlbGVjdGlvbl9zdHlsZSxcbiAgcHJvcGVydHk6IHNlbGVjdGlvbl9wcm9wZXJ0eSxcbiAgY2xhc3NlZDogc2VsZWN0aW9uX2NsYXNzZWQsXG4gIHRleHQ6IHNlbGVjdGlvbl90ZXh0LFxuICBodG1sOiBzZWxlY3Rpb25faHRtbCxcbiAgcmFpc2U6IHNlbGVjdGlvbl9yYWlzZSxcbiAgbG93ZXI6IHNlbGVjdGlvbl9sb3dlcixcbiAgYXBwZW5kOiBzZWxlY3Rpb25fYXBwZW5kLFxuICBpbnNlcnQ6IHNlbGVjdGlvbl9pbnNlcnQsXG4gIHJlbW92ZTogc2VsZWN0aW9uX3JlbW92ZSxcbiAgY2xvbmU6IHNlbGVjdGlvbl9jbG9uZSxcbiAgZGF0dW06IHNlbGVjdGlvbl9kYXR1bSxcbiAgb246IHNlbGVjdGlvbl9vbixcbiAgZGlzcGF0Y2g6IHNlbGVjdGlvbl9kaXNwYXRjaCxcbiAgW1N5bWJvbC5pdGVyYXRvcl06IHNlbGVjdGlvbl9pdGVyYXRvclxufTtcblxuZXhwb3J0IGRlZmF1bHQgc2VsZWN0aW9uO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29uc3RydWN0b3IsIGZhY3RvcnksIHByb3RvdHlwZSkge1xuICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBmYWN0b3J5LnByb3RvdHlwZSA9IHByb3RvdHlwZTtcbiAgcHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0b3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRlbmQocGFyZW50LCBkZWZpbml0aW9uKSB7XG4gIHZhciBwcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudC5wcm90b3R5cGUpO1xuICBmb3IgKHZhciBrZXkgaW4gZGVmaW5pdGlvbikgcHJvdG90eXBlW2tleV0gPSBkZWZpbml0aW9uW2tleV07XG4gIHJldHVybiBwcm90b3R5cGU7XG59XG4iLCJpbXBvcnQgZGVmaW5lLCB7ZXh0ZW5kfSBmcm9tIFwiLi9kZWZpbmUuanNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIENvbG9yKCkge31cblxuZXhwb3J0IHZhciBkYXJrZXIgPSAwLjc7XG5leHBvcnQgdmFyIGJyaWdodGVyID0gMSAvIGRhcmtlcjtcblxudmFyIHJlSSA9IFwiXFxcXHMqKFsrLV0/XFxcXGQrKVxcXFxzKlwiLFxuICAgIHJlTiA9IFwiXFxcXHMqKFsrLV0/KD86XFxcXGQqXFxcXC4pP1xcXFxkKyg/OltlRV1bKy1dP1xcXFxkKyk/KVxcXFxzKlwiLFxuICAgIHJlUCA9IFwiXFxcXHMqKFsrLV0/KD86XFxcXGQqXFxcXC4pP1xcXFxkKyg/OltlRV1bKy1dP1xcXFxkKyk/KSVcXFxccypcIixcbiAgICByZUhleCA9IC9eIyhbMC05YS1mXXszLDh9KSQvLFxuICAgIHJlUmdiSW50ZWdlciA9IG5ldyBSZWdFeHAoYF5yZ2JcXFxcKCR7cmVJfSwke3JlSX0sJHtyZUl9XFxcXCkkYCksXG4gICAgcmVSZ2JQZXJjZW50ID0gbmV3IFJlZ0V4cChgXnJnYlxcXFwoJHtyZVB9LCR7cmVQfSwke3JlUH1cXFxcKSRgKSxcbiAgICByZVJnYmFJbnRlZ2VyID0gbmV3IFJlZ0V4cChgXnJnYmFcXFxcKCR7cmVJfSwke3JlSX0sJHtyZUl9LCR7cmVOfVxcXFwpJGApLFxuICAgIHJlUmdiYVBlcmNlbnQgPSBuZXcgUmVnRXhwKGBecmdiYVxcXFwoJHtyZVB9LCR7cmVQfSwke3JlUH0sJHtyZU59XFxcXCkkYCksXG4gICAgcmVIc2xQZXJjZW50ID0gbmV3IFJlZ0V4cChgXmhzbFxcXFwoJHtyZU59LCR7cmVQfSwke3JlUH1cXFxcKSRgKSxcbiAgICByZUhzbGFQZXJjZW50ID0gbmV3IFJlZ0V4cChgXmhzbGFcXFxcKCR7cmVOfSwke3JlUH0sJHtyZVB9LCR7cmVOfVxcXFwpJGApO1xuXG52YXIgbmFtZWQgPSB7XG4gIGFsaWNlYmx1ZTogMHhmMGY4ZmYsXG4gIGFudGlxdWV3aGl0ZTogMHhmYWViZDcsXG4gIGFxdWE6IDB4MDBmZmZmLFxuICBhcXVhbWFyaW5lOiAweDdmZmZkNCxcbiAgYXp1cmU6IDB4ZjBmZmZmLFxuICBiZWlnZTogMHhmNWY1ZGMsXG4gIGJpc3F1ZTogMHhmZmU0YzQsXG4gIGJsYWNrOiAweDAwMDAwMCxcbiAgYmxhbmNoZWRhbG1vbmQ6IDB4ZmZlYmNkLFxuICBibHVlOiAweDAwMDBmZixcbiAgYmx1ZXZpb2xldDogMHg4YTJiZTIsXG4gIGJyb3duOiAweGE1MmEyYSxcbiAgYnVybHl3b29kOiAweGRlYjg4NyxcbiAgY2FkZXRibHVlOiAweDVmOWVhMCxcbiAgY2hhcnRyZXVzZTogMHg3ZmZmMDAsXG4gIGNob2NvbGF0ZTogMHhkMjY5MWUsXG4gIGNvcmFsOiAweGZmN2Y1MCxcbiAgY29ybmZsb3dlcmJsdWU6IDB4NjQ5NWVkLFxuICBjb3Juc2lsazogMHhmZmY4ZGMsXG4gIGNyaW1zb246IDB4ZGMxNDNjLFxuICBjeWFuOiAweDAwZmZmZixcbiAgZGFya2JsdWU6IDB4MDAwMDhiLFxuICBkYXJrY3lhbjogMHgwMDhiOGIsXG4gIGRhcmtnb2xkZW5yb2Q6IDB4Yjg4NjBiLFxuICBkYXJrZ3JheTogMHhhOWE5YTksXG4gIGRhcmtncmVlbjogMHgwMDY0MDAsXG4gIGRhcmtncmV5OiAweGE5YTlhOSxcbiAgZGFya2toYWtpOiAweGJkYjc2YixcbiAgZGFya21hZ2VudGE6IDB4OGIwMDhiLFxuICBkYXJrb2xpdmVncmVlbjogMHg1NTZiMmYsXG4gIGRhcmtvcmFuZ2U6IDB4ZmY4YzAwLFxuICBkYXJrb3JjaGlkOiAweDk5MzJjYyxcbiAgZGFya3JlZDogMHg4YjAwMDAsXG4gIGRhcmtzYWxtb246IDB4ZTk5NjdhLFxuICBkYXJrc2VhZ3JlZW46IDB4OGZiYzhmLFxuICBkYXJrc2xhdGVibHVlOiAweDQ4M2Q4YixcbiAgZGFya3NsYXRlZ3JheTogMHgyZjRmNGYsXG4gIGRhcmtzbGF0ZWdyZXk6IDB4MmY0ZjRmLFxuICBkYXJrdHVycXVvaXNlOiAweDAwY2VkMSxcbiAgZGFya3Zpb2xldDogMHg5NDAwZDMsXG4gIGRlZXBwaW5rOiAweGZmMTQ5MyxcbiAgZGVlcHNreWJsdWU6IDB4MDBiZmZmLFxuICBkaW1ncmF5OiAweDY5Njk2OSxcbiAgZGltZ3JleTogMHg2OTY5NjksXG4gIGRvZGdlcmJsdWU6IDB4MWU5MGZmLFxuICBmaXJlYnJpY2s6IDB4YjIyMjIyLFxuICBmbG9yYWx3aGl0ZTogMHhmZmZhZjAsXG4gIGZvcmVzdGdyZWVuOiAweDIyOGIyMixcbiAgZnVjaHNpYTogMHhmZjAwZmYsXG4gIGdhaW5zYm9ybzogMHhkY2RjZGMsXG4gIGdob3N0d2hpdGU6IDB4ZjhmOGZmLFxuICBnb2xkOiAweGZmZDcwMCxcbiAgZ29sZGVucm9kOiAweGRhYTUyMCxcbiAgZ3JheTogMHg4MDgwODAsXG4gIGdyZWVuOiAweDAwODAwMCxcbiAgZ3JlZW55ZWxsb3c6IDB4YWRmZjJmLFxuICBncmV5OiAweDgwODA4MCxcbiAgaG9uZXlkZXc6IDB4ZjBmZmYwLFxuICBob3RwaW5rOiAweGZmNjliNCxcbiAgaW5kaWFucmVkOiAweGNkNWM1YyxcbiAgaW5kaWdvOiAweDRiMDA4MixcbiAgaXZvcnk6IDB4ZmZmZmYwLFxuICBraGFraTogMHhmMGU2OGMsXG4gIGxhdmVuZGVyOiAweGU2ZTZmYSxcbiAgbGF2ZW5kZXJibHVzaDogMHhmZmYwZjUsXG4gIGxhd25ncmVlbjogMHg3Y2ZjMDAsXG4gIGxlbW9uY2hpZmZvbjogMHhmZmZhY2QsXG4gIGxpZ2h0Ymx1ZTogMHhhZGQ4ZTYsXG4gIGxpZ2h0Y29yYWw6IDB4ZjA4MDgwLFxuICBsaWdodGN5YW46IDB4ZTBmZmZmLFxuICBsaWdodGdvbGRlbnJvZHllbGxvdzogMHhmYWZhZDIsXG4gIGxpZ2h0Z3JheTogMHhkM2QzZDMsXG4gIGxpZ2h0Z3JlZW46IDB4OTBlZTkwLFxuICBsaWdodGdyZXk6IDB4ZDNkM2QzLFxuICBsaWdodHBpbms6IDB4ZmZiNmMxLFxuICBsaWdodHNhbG1vbjogMHhmZmEwN2EsXG4gIGxpZ2h0c2VhZ3JlZW46IDB4MjBiMmFhLFxuICBsaWdodHNreWJsdWU6IDB4ODdjZWZhLFxuICBsaWdodHNsYXRlZ3JheTogMHg3Nzg4OTksXG4gIGxpZ2h0c2xhdGVncmV5OiAweDc3ODg5OSxcbiAgbGlnaHRzdGVlbGJsdWU6IDB4YjBjNGRlLFxuICBsaWdodHllbGxvdzogMHhmZmZmZTAsXG4gIGxpbWU6IDB4MDBmZjAwLFxuICBsaW1lZ3JlZW46IDB4MzJjZDMyLFxuICBsaW5lbjogMHhmYWYwZTYsXG4gIG1hZ2VudGE6IDB4ZmYwMGZmLFxuICBtYXJvb246IDB4ODAwMDAwLFxuICBtZWRpdW1hcXVhbWFyaW5lOiAweDY2Y2RhYSxcbiAgbWVkaXVtYmx1ZTogMHgwMDAwY2QsXG4gIG1lZGl1bW9yY2hpZDogMHhiYTU1ZDMsXG4gIG1lZGl1bXB1cnBsZTogMHg5MzcwZGIsXG4gIG1lZGl1bXNlYWdyZWVuOiAweDNjYjM3MSxcbiAgbWVkaXVtc2xhdGVibHVlOiAweDdiNjhlZSxcbiAgbWVkaXVtc3ByaW5nZ3JlZW46IDB4MDBmYTlhLFxuICBtZWRpdW10dXJxdW9pc2U6IDB4NDhkMWNjLFxuICBtZWRpdW12aW9sZXRyZWQ6IDB4YzcxNTg1LFxuICBtaWRuaWdodGJsdWU6IDB4MTkxOTcwLFxuICBtaW50Y3JlYW06IDB4ZjVmZmZhLFxuICBtaXN0eXJvc2U6IDB4ZmZlNGUxLFxuICBtb2NjYXNpbjogMHhmZmU0YjUsXG4gIG5hdmFqb3doaXRlOiAweGZmZGVhZCxcbiAgbmF2eTogMHgwMDAwODAsXG4gIG9sZGxhY2U6IDB4ZmRmNWU2LFxuICBvbGl2ZTogMHg4MDgwMDAsXG4gIG9saXZlZHJhYjogMHg2YjhlMjMsXG4gIG9yYW5nZTogMHhmZmE1MDAsXG4gIG9yYW5nZXJlZDogMHhmZjQ1MDAsXG4gIG9yY2hpZDogMHhkYTcwZDYsXG4gIHBhbGVnb2xkZW5yb2Q6IDB4ZWVlOGFhLFxuICBwYWxlZ3JlZW46IDB4OThmYjk4LFxuICBwYWxldHVycXVvaXNlOiAweGFmZWVlZSxcbiAgcGFsZXZpb2xldHJlZDogMHhkYjcwOTMsXG4gIHBhcGF5YXdoaXA6IDB4ZmZlZmQ1LFxuICBwZWFjaHB1ZmY6IDB4ZmZkYWI5LFxuICBwZXJ1OiAweGNkODUzZixcbiAgcGluazogMHhmZmMwY2IsXG4gIHBsdW06IDB4ZGRhMGRkLFxuICBwb3dkZXJibHVlOiAweGIwZTBlNixcbiAgcHVycGxlOiAweDgwMDA4MCxcbiAgcmViZWNjYXB1cnBsZTogMHg2NjMzOTksXG4gIHJlZDogMHhmZjAwMDAsXG4gIHJvc3licm93bjogMHhiYzhmOGYsXG4gIHJveWFsYmx1ZTogMHg0MTY5ZTEsXG4gIHNhZGRsZWJyb3duOiAweDhiNDUxMyxcbiAgc2FsbW9uOiAweGZhODA3MixcbiAgc2FuZHlicm93bjogMHhmNGE0NjAsXG4gIHNlYWdyZWVuOiAweDJlOGI1NyxcbiAgc2Vhc2hlbGw6IDB4ZmZmNWVlLFxuICBzaWVubmE6IDB4YTA1MjJkLFxuICBzaWx2ZXI6IDB4YzBjMGMwLFxuICBza3libHVlOiAweDg3Y2VlYixcbiAgc2xhdGVibHVlOiAweDZhNWFjZCxcbiAgc2xhdGVncmF5OiAweDcwODA5MCxcbiAgc2xhdGVncmV5OiAweDcwODA5MCxcbiAgc25vdzogMHhmZmZhZmEsXG4gIHNwcmluZ2dyZWVuOiAweDAwZmY3ZixcbiAgc3RlZWxibHVlOiAweDQ2ODJiNCxcbiAgdGFuOiAweGQyYjQ4YyxcbiAgdGVhbDogMHgwMDgwODAsXG4gIHRoaXN0bGU6IDB4ZDhiZmQ4LFxuICB0b21hdG86IDB4ZmY2MzQ3LFxuICB0dXJxdW9pc2U6IDB4NDBlMGQwLFxuICB2aW9sZXQ6IDB4ZWU4MmVlLFxuICB3aGVhdDogMHhmNWRlYjMsXG4gIHdoaXRlOiAweGZmZmZmZixcbiAgd2hpdGVzbW9rZTogMHhmNWY1ZjUsXG4gIHllbGxvdzogMHhmZmZmMDAsXG4gIHllbGxvd2dyZWVuOiAweDlhY2QzMlxufTtcblxuZGVmaW5lKENvbG9yLCBjb2xvciwge1xuICBjb3B5KGNoYW5uZWxzKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IHRoaXMuY29uc3RydWN0b3IsIHRoaXMsIGNoYW5uZWxzKTtcbiAgfSxcbiAgZGlzcGxheWFibGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKTtcbiAgfSxcbiAgaGV4OiBjb2xvcl9mb3JtYXRIZXgsIC8vIERlcHJlY2F0ZWQhIFVzZSBjb2xvci5mb3JtYXRIZXguXG4gIGZvcm1hdEhleDogY29sb3JfZm9ybWF0SGV4LFxuICBmb3JtYXRIZXg4OiBjb2xvcl9mb3JtYXRIZXg4LFxuICBmb3JtYXRIc2w6IGNvbG9yX2Zvcm1hdEhzbCxcbiAgZm9ybWF0UmdiOiBjb2xvcl9mb3JtYXRSZ2IsXG4gIHRvU3RyaW5nOiBjb2xvcl9mb3JtYXRSZ2Jcbn0pO1xuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRIZXgoKSB7XG4gIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleCgpO1xufVxuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRIZXg4KCkge1xuICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXg4KCk7XG59XG5cbmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdEhzbCgpIHtcbiAgcmV0dXJuIGhzbENvbnZlcnQodGhpcykuZm9ybWF0SHNsKCk7XG59XG5cbmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdFJnYigpIHtcbiAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0UmdiKCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbG9yKGZvcm1hdCkge1xuICB2YXIgbSwgbDtcbiAgZm9ybWF0ID0gKGZvcm1hdCArIFwiXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gKG0gPSByZUhleC5leGVjKGZvcm1hdCkpID8gKGwgPSBtWzFdLmxlbmd0aCwgbSA9IHBhcnNlSW50KG1bMV0sIDE2KSwgbCA9PT0gNiA/IHJnYm4obSkgLy8gI2ZmMDAwMFxuICAgICAgOiBsID09PSAzID8gbmV3IFJnYigobSA+PiA4ICYgMHhmKSB8IChtID4+IDQgJiAweGYwKSwgKG0gPj4gNCAmIDB4ZikgfCAobSAmIDB4ZjApLCAoKG0gJiAweGYpIDw8IDQpIHwgKG0gJiAweGYpLCAxKSAvLyAjZjAwXG4gICAgICA6IGwgPT09IDggPyByZ2JhKG0gPj4gMjQgJiAweGZmLCBtID4+IDE2ICYgMHhmZiwgbSA+PiA4ICYgMHhmZiwgKG0gJiAweGZmKSAvIDB4ZmYpIC8vICNmZjAwMDAwMFxuICAgICAgOiBsID09PSA0ID8gcmdiYSgobSA+PiAxMiAmIDB4ZikgfCAobSA+PiA4ICYgMHhmMCksIChtID4+IDggJiAweGYpIHwgKG0gPj4gNCAmIDB4ZjApLCAobSA+PiA0ICYgMHhmKSB8IChtICYgMHhmMCksICgoKG0gJiAweGYpIDw8IDQpIHwgKG0gJiAweGYpKSAvIDB4ZmYpIC8vICNmMDAwXG4gICAgICA6IG51bGwpIC8vIGludmFsaWQgaGV4XG4gICAgICA6IChtID0gcmVSZ2JJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiKG1bMV0sIG1bMl0sIG1bM10sIDEpIC8vIHJnYigyNTUsIDAsIDApXG4gICAgICA6IChtID0gcmVSZ2JQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiKG1bMV0gKiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIDEpIC8vIHJnYigxMDAlLCAwJSwgMCUpXG4gICAgICA6IChtID0gcmVSZ2JhSW50ZWdlci5leGVjKGZvcm1hdCkpID8gcmdiYShtWzFdLCBtWzJdLCBtWzNdLCBtWzRdKSAvLyByZ2JhKDI1NSwgMCwgMCwgMSlcbiAgICAgIDogKG0gPSByZVJnYmFQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyByZ2JhKG1bMV0gKiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIG1bNF0pIC8vIHJnYigxMDAlLCAwJSwgMCUsIDEpXG4gICAgICA6IChtID0gcmVIc2xQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBoc2xhKG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIDEpIC8vIGhzbCgxMjAsIDUwJSwgNTAlKVxuICAgICAgOiAobSA9IHJlSHNsYVBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IGhzbGEobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgbVs0XSkgLy8gaHNsYSgxMjAsIDUwJSwgNTAlLCAxKVxuICAgICAgOiBuYW1lZC5oYXNPd25Qcm9wZXJ0eShmb3JtYXQpID8gcmdibihuYW1lZFtmb3JtYXRdKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgOiBmb3JtYXQgPT09IFwidHJhbnNwYXJlbnRcIiA/IG5ldyBSZ2IoTmFOLCBOYU4sIE5hTiwgMClcbiAgICAgIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gcmdibihuKSB7XG4gIHJldHVybiBuZXcgUmdiKG4gPj4gMTYgJiAweGZmLCBuID4+IDggJiAweGZmLCBuICYgMHhmZiwgMSk7XG59XG5cbmZ1bmN0aW9uIHJnYmEociwgZywgYiwgYSkge1xuICBpZiAoYSA8PSAwKSByID0gZyA9IGIgPSBOYU47XG4gIHJldHVybiBuZXcgUmdiKHIsIGcsIGIsIGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmdiQ29udmVydChvKSB7XG4gIGlmICghKG8gaW5zdGFuY2VvZiBDb2xvcikpIG8gPSBjb2xvcihvKTtcbiAgaWYgKCFvKSByZXR1cm4gbmV3IFJnYjtcbiAgbyA9IG8ucmdiKCk7XG4gIHJldHVybiBuZXcgUmdiKG8uciwgby5nLCBvLmIsIG8ub3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZ2IociwgZywgYiwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IHJnYkNvbnZlcnQocikgOiBuZXcgUmdiKHIsIGcsIGIsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFJnYihyLCBnLCBiLCBvcGFjaXR5KSB7XG4gIHRoaXMuciA9ICtyO1xuICB0aGlzLmcgPSArZztcbiAgdGhpcy5iID0gK2I7XG4gIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5O1xufVxuXG5kZWZpbmUoUmdiLCByZ2IsIGV4dGVuZChDb2xvciwge1xuICBicmlnaHRlcihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspO1xuICAgIHJldHVybiBuZXcgUmdiKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGRhcmtlciA6IE1hdGgucG93KGRhcmtlciwgayk7XG4gICAgcmV0dXJuIG5ldyBSZ2IodGhpcy5yICogaywgdGhpcy5nICogaywgdGhpcy5iICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgcmdiKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBjbGFtcCgpIHtcbiAgICByZXR1cm4gbmV3IFJnYihjbGFtcGkodGhpcy5yKSwgY2xhbXBpKHRoaXMuZyksIGNsYW1waSh0aGlzLmIpLCBjbGFtcGEodGhpcy5vcGFjaXR5KSk7XG4gIH0sXG4gIGRpc3BsYXlhYmxlKCkge1xuICAgIHJldHVybiAoLTAuNSA8PSB0aGlzLnIgJiYgdGhpcy5yIDwgMjU1LjUpXG4gICAgICAgICYmICgtMC41IDw9IHRoaXMuZyAmJiB0aGlzLmcgPCAyNTUuNSlcbiAgICAgICAgJiYgKC0wLjUgPD0gdGhpcy5iICYmIHRoaXMuYiA8IDI1NS41KVxuICAgICAgICAmJiAoMCA8PSB0aGlzLm9wYWNpdHkgJiYgdGhpcy5vcGFjaXR5IDw9IDEpO1xuICB9LFxuICBoZXg6IHJnYl9mb3JtYXRIZXgsIC8vIERlcHJlY2F0ZWQhIFVzZSBjb2xvci5mb3JtYXRIZXguXG4gIGZvcm1hdEhleDogcmdiX2Zvcm1hdEhleCxcbiAgZm9ybWF0SGV4ODogcmdiX2Zvcm1hdEhleDgsXG4gIGZvcm1hdFJnYjogcmdiX2Zvcm1hdFJnYixcbiAgdG9TdHJpbmc6IHJnYl9mb3JtYXRSZ2Jcbn0pKTtcblxuZnVuY3Rpb24gcmdiX2Zvcm1hdEhleCgpIHtcbiAgcmV0dXJuIGAjJHtoZXgodGhpcy5yKX0ke2hleCh0aGlzLmcpfSR7aGV4KHRoaXMuYil9YDtcbn1cblxuZnVuY3Rpb24gcmdiX2Zvcm1hdEhleDgoKSB7XG4gIHJldHVybiBgIyR7aGV4KHRoaXMucil9JHtoZXgodGhpcy5nKX0ke2hleCh0aGlzLmIpfSR7aGV4KChpc05hTih0aGlzLm9wYWNpdHkpID8gMSA6IHRoaXMub3BhY2l0eSkgKiAyNTUpfWA7XG59XG5cbmZ1bmN0aW9uIHJnYl9mb3JtYXRSZ2IoKSB7XG4gIGNvbnN0IGEgPSBjbGFtcGEodGhpcy5vcGFjaXR5KTtcbiAgcmV0dXJuIGAke2EgPT09IDEgPyBcInJnYihcIiA6IFwicmdiYShcIn0ke2NsYW1waSh0aGlzLnIpfSwgJHtjbGFtcGkodGhpcy5nKX0sICR7Y2xhbXBpKHRoaXMuYil9JHthID09PSAxID8gXCIpXCIgOiBgLCAke2F9KWB9YDtcbn1cblxuZnVuY3Rpb24gY2xhbXBhKG9wYWNpdHkpIHtcbiAgcmV0dXJuIGlzTmFOKG9wYWNpdHkpID8gMSA6IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIG9wYWNpdHkpKTtcbn1cblxuZnVuY3Rpb24gY2xhbXBpKHZhbHVlKSB7XG4gIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodmFsdWUpIHx8IDApKTtcbn1cblxuZnVuY3Rpb24gaGV4KHZhbHVlKSB7XG4gIHZhbHVlID0gY2xhbXBpKHZhbHVlKTtcbiAgcmV0dXJuICh2YWx1ZSA8IDE2ID8gXCIwXCIgOiBcIlwiKSArIHZhbHVlLnRvU3RyaW5nKDE2KTtcbn1cblxuZnVuY3Rpb24gaHNsYShoLCBzLCBsLCBhKSB7XG4gIGlmIChhIDw9IDApIGggPSBzID0gbCA9IE5hTjtcbiAgZWxzZSBpZiAobCA8PSAwIHx8IGwgPj0gMSkgaCA9IHMgPSBOYU47XG4gIGVsc2UgaWYgKHMgPD0gMCkgaCA9IE5hTjtcbiAgcmV0dXJuIG5ldyBIc2woaCwgcywgbCwgYSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoc2xDb252ZXJ0KG8pIHtcbiAgaWYgKG8gaW5zdGFuY2VvZiBIc2wpIHJldHVybiBuZXcgSHNsKG8uaCwgby5zLCBvLmwsIG8ub3BhY2l0eSk7XG4gIGlmICghKG8gaW5zdGFuY2VvZiBDb2xvcikpIG8gPSBjb2xvcihvKTtcbiAgaWYgKCFvKSByZXR1cm4gbmV3IEhzbDtcbiAgaWYgKG8gaW5zdGFuY2VvZiBIc2wpIHJldHVybiBvO1xuICBvID0gby5yZ2IoKTtcbiAgdmFyIHIgPSBvLnIgLyAyNTUsXG4gICAgICBnID0gby5nIC8gMjU1LFxuICAgICAgYiA9IG8uYiAvIDI1NSxcbiAgICAgIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpLFxuICAgICAgbWF4ID0gTWF0aC5tYXgociwgZywgYiksXG4gICAgICBoID0gTmFOLFxuICAgICAgcyA9IG1heCAtIG1pbixcbiAgICAgIGwgPSAobWF4ICsgbWluKSAvIDI7XG4gIGlmIChzKSB7XG4gICAgaWYgKHIgPT09IG1heCkgaCA9IChnIC0gYikgLyBzICsgKGcgPCBiKSAqIDY7XG4gICAgZWxzZSBpZiAoZyA9PT0gbWF4KSBoID0gKGIgLSByKSAvIHMgKyAyO1xuICAgIGVsc2UgaCA9IChyIC0gZykgLyBzICsgNDtcbiAgICBzIC89IGwgPCAwLjUgPyBtYXggKyBtaW4gOiAyIC0gbWF4IC0gbWluO1xuICAgIGggKj0gNjA7XG4gIH0gZWxzZSB7XG4gICAgcyA9IGwgPiAwICYmIGwgPCAxID8gMCA6IGg7XG4gIH1cbiAgcmV0dXJuIG5ldyBIc2woaCwgcywgbCwgby5vcGFjaXR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhzbChoLCBzLCBsLCBvcGFjaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gaHNsQ29udmVydChoKSA6IG5ldyBIc2woaCwgcywgbCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpO1xufVxuXG5mdW5jdGlvbiBIc2woaCwgcywgbCwgb3BhY2l0eSkge1xuICB0aGlzLmggPSAraDtcbiAgdGhpcy5zID0gK3M7XG4gIHRoaXMubCA9ICtsO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZGVmaW5lKEhzbCwgaHNsLCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXIoaykge1xuICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciA6IE1hdGgucG93KGJyaWdodGVyLCBrKTtcbiAgICByZXR1cm4gbmV3IEhzbCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgZGFya2VyKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTtcbiAgICByZXR1cm4gbmV3IEhzbCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTtcbiAgfSxcbiAgcmdiKCkge1xuICAgIHZhciBoID0gdGhpcy5oICUgMzYwICsgKHRoaXMuaCA8IDApICogMzYwLFxuICAgICAgICBzID0gaXNOYU4oaCkgfHwgaXNOYU4odGhpcy5zKSA/IDAgOiB0aGlzLnMsXG4gICAgICAgIGwgPSB0aGlzLmwsXG4gICAgICAgIG0yID0gbCArIChsIDwgMC41ID8gbCA6IDEgLSBsKSAqIHMsXG4gICAgICAgIG0xID0gMiAqIGwgLSBtMjtcbiAgICByZXR1cm4gbmV3IFJnYihcbiAgICAgIGhzbDJyZ2IoaCA+PSAyNDAgPyBoIC0gMjQwIDogaCArIDEyMCwgbTEsIG0yKSxcbiAgICAgIGhzbDJyZ2IoaCwgbTEsIG0yKSxcbiAgICAgIGhzbDJyZ2IoaCA8IDEyMCA/IGggKyAyNDAgOiBoIC0gMTIwLCBtMSwgbTIpLFxuICAgICAgdGhpcy5vcGFjaXR5XG4gICAgKTtcbiAgfSxcbiAgY2xhbXAoKSB7XG4gICAgcmV0dXJuIG5ldyBIc2woY2xhbXBoKHRoaXMuaCksIGNsYW1wdCh0aGlzLnMpLCBjbGFtcHQodGhpcy5sKSwgY2xhbXBhKHRoaXMub3BhY2l0eSkpO1xuICB9LFxuICBkaXNwbGF5YWJsZSgpIHtcbiAgICByZXR1cm4gKDAgPD0gdGhpcy5zICYmIHRoaXMucyA8PSAxIHx8IGlzTmFOKHRoaXMucykpXG4gICAgICAgICYmICgwIDw9IHRoaXMubCAmJiB0aGlzLmwgPD0gMSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTtcbiAgfSxcbiAgZm9ybWF0SHNsKCkge1xuICAgIGNvbnN0IGEgPSBjbGFtcGEodGhpcy5vcGFjaXR5KTtcbiAgICByZXR1cm4gYCR7YSA9PT0gMSA/IFwiaHNsKFwiIDogXCJoc2xhKFwifSR7Y2xhbXBoKHRoaXMuaCl9LCAke2NsYW1wdCh0aGlzLnMpICogMTAwfSUsICR7Y2xhbXB0KHRoaXMubCkgKiAxMDB9JSR7YSA9PT0gMSA/IFwiKVwiIDogYCwgJHthfSlgfWA7XG4gIH1cbn0pKTtcblxuZnVuY3Rpb24gY2xhbXBoKHZhbHVlKSB7XG4gIHZhbHVlID0gKHZhbHVlIHx8IDApICUgMzYwO1xuICByZXR1cm4gdmFsdWUgPCAwID8gdmFsdWUgKyAzNjAgOiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gY2xhbXB0KHZhbHVlKSB7XG4gIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB2YWx1ZSB8fCAwKSk7XG59XG5cbi8qIEZyb20gRnZEIDEzLjM3LCBDU1MgQ29sb3IgTW9kdWxlIExldmVsIDMgKi9cbmZ1bmN0aW9uIGhzbDJyZ2IoaCwgbTEsIG0yKSB7XG4gIHJldHVybiAoaCA8IDYwID8gbTEgKyAobTIgLSBtMSkgKiBoIC8gNjBcbiAgICAgIDogaCA8IDE4MCA/IG0yXG4gICAgICA6IGggPCAyNDAgPyBtMSArIChtMiAtIG0xKSAqICgyNDAgLSBoKSAvIDYwXG4gICAgICA6IG0xKSAqIDI1NTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IHggPT4gKCkgPT4geDtcbiIsImltcG9ydCBjb25zdGFudCBmcm9tIFwiLi9jb25zdGFudC5qc1wiO1xuXG5mdW5jdGlvbiBsaW5lYXIoYSwgZCkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBhICsgdCAqIGQ7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGV4cG9uZW50aWFsKGEsIGIsIHkpIHtcbiAgcmV0dXJuIGEgPSBNYXRoLnBvdyhhLCB5KSwgYiA9IE1hdGgucG93KGIsIHkpIC0gYSwgeSA9IDEgLyB5LCBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIE1hdGgucG93KGEgKyB0ICogYiwgeSk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBodWUoYSwgYikge1xuICB2YXIgZCA9IGIgLSBhO1xuICByZXR1cm4gZCA/IGxpbmVhcihhLCBkID4gMTgwIHx8IGQgPCAtMTgwID8gZCAtIDM2MCAqIE1hdGgucm91bmQoZCAvIDM2MCkgOiBkKSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2FtbWEoeSkge1xuICByZXR1cm4gKHkgPSAreSkgPT09IDEgPyBub2dhbW1hIDogZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBiIC0gYSA/IGV4cG9uZW50aWFsKGEsIGIsIHkpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5vZ2FtbWEoYSwgYikge1xuICB2YXIgZCA9IGIgLSBhO1xuICByZXR1cm4gZCA/IGxpbmVhcihhLCBkKSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xufVxuIiwiaW1wb3J0IHtyZ2IgYXMgY29sb3JSZ2J9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IGJhc2lzIGZyb20gXCIuL2Jhc2lzLmpzXCI7XG5pbXBvcnQgYmFzaXNDbG9zZWQgZnJvbSBcIi4vYmFzaXNDbG9zZWQuanNcIjtcbmltcG9ydCBub2dhbW1hLCB7Z2FtbWF9IGZyb20gXCIuL2NvbG9yLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IChmdW5jdGlvbiByZ2JHYW1tYSh5KSB7XG4gIHZhciBjb2xvciA9IGdhbW1hKHkpO1xuXG4gIGZ1bmN0aW9uIHJnYihzdGFydCwgZW5kKSB7XG4gICAgdmFyIHIgPSBjb2xvcigoc3RhcnQgPSBjb2xvclJnYihzdGFydCkpLnIsIChlbmQgPSBjb2xvclJnYihlbmQpKS5yKSxcbiAgICAgICAgZyA9IGNvbG9yKHN0YXJ0LmcsIGVuZC5nKSxcbiAgICAgICAgYiA9IGNvbG9yKHN0YXJ0LmIsIGVuZC5iKSxcbiAgICAgICAgb3BhY2l0eSA9IG5vZ2FtbWEoc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpO1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICBzdGFydC5yID0gcih0KTtcbiAgICAgIHN0YXJ0LmcgPSBnKHQpO1xuICAgICAgc3RhcnQuYiA9IGIodCk7XG4gICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTtcbiAgICAgIHJldHVybiBzdGFydCArIFwiXCI7XG4gICAgfTtcbiAgfVxuXG4gIHJnYi5nYW1tYSA9IHJnYkdhbW1hO1xuXG4gIHJldHVybiByZ2I7XG59KSgxKTtcblxuZnVuY3Rpb24gcmdiU3BsaW5lKHNwbGluZSkge1xuICByZXR1cm4gZnVuY3Rpb24oY29sb3JzKSB7XG4gICAgdmFyIG4gPSBjb2xvcnMubGVuZ3RoLFxuICAgICAgICByID0gbmV3IEFycmF5KG4pLFxuICAgICAgICBnID0gbmV3IEFycmF5KG4pLFxuICAgICAgICBiID0gbmV3IEFycmF5KG4pLFxuICAgICAgICBpLCBjb2xvcjtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBjb2xvciA9IGNvbG9yUmdiKGNvbG9yc1tpXSk7XG4gICAgICByW2ldID0gY29sb3IuciB8fCAwO1xuICAgICAgZ1tpXSA9IGNvbG9yLmcgfHwgMDtcbiAgICAgIGJbaV0gPSBjb2xvci5iIHx8IDA7XG4gICAgfVxuICAgIHIgPSBzcGxpbmUocik7XG4gICAgZyA9IHNwbGluZShnKTtcbiAgICBiID0gc3BsaW5lKGIpO1xuICAgIGNvbG9yLm9wYWNpdHkgPSAxO1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICBjb2xvci5yID0gcih0KTtcbiAgICAgIGNvbG9yLmcgPSBnKHQpO1xuICAgICAgY29sb3IuYiA9IGIodCk7XG4gICAgICByZXR1cm4gY29sb3IgKyBcIlwiO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCB2YXIgcmdiQmFzaXMgPSByZ2JTcGxpbmUoYmFzaXMpO1xuZXhwb3J0IHZhciByZ2JCYXNpc0Nsb3NlZCA9IHJnYlNwbGluZShiYXNpc0Nsb3NlZCk7XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHJldHVybiBhID0gK2EsIGIgPSArYiwgZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBhICogKDEgLSB0KSArIGIgKiB0O1xuICB9O1xufVxuIiwiaW1wb3J0IG51bWJlciBmcm9tIFwiLi9udW1iZXIuanNcIjtcblxudmFyIHJlQSA9IC9bLStdPyg/OlxcZCtcXC4/XFxkKnxcXC4/XFxkKykoPzpbZUVdWy0rXT9cXGQrKT8vZyxcbiAgICByZUIgPSBuZXcgUmVnRXhwKHJlQS5zb3VyY2UsIFwiZ1wiKTtcblxuZnVuY3Rpb24gemVybyhiKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb25lKGIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYih0KSArIFwiXCI7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIpIHtcbiAgdmFyIGJpID0gcmVBLmxhc3RJbmRleCA9IHJlQi5sYXN0SW5kZXggPSAwLCAvLyBzY2FuIGluZGV4IGZvciBuZXh0IG51bWJlciBpbiBiXG4gICAgICBhbSwgLy8gY3VycmVudCBtYXRjaCBpbiBhXG4gICAgICBibSwgLy8gY3VycmVudCBtYXRjaCBpbiBiXG4gICAgICBicywgLy8gc3RyaW5nIHByZWNlZGluZyBjdXJyZW50IG51bWJlciBpbiBiLCBpZiBhbnlcbiAgICAgIGkgPSAtMSwgLy8gaW5kZXggaW4gc1xuICAgICAgcyA9IFtdLCAvLyBzdHJpbmcgY29uc3RhbnRzIGFuZCBwbGFjZWhvbGRlcnNcbiAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnNcblxuICAvLyBDb2VyY2UgaW5wdXRzIHRvIHN0cmluZ3MuXG4gIGEgPSBhICsgXCJcIiwgYiA9IGIgKyBcIlwiO1xuXG4gIC8vIEludGVycG9sYXRlIHBhaXJzIG9mIG51bWJlcnMgaW4gYSAmIGIuXG4gIHdoaWxlICgoYW0gPSByZUEuZXhlYyhhKSlcbiAgICAgICYmIChibSA9IHJlQi5leGVjKGIpKSkge1xuICAgIGlmICgoYnMgPSBibS5pbmRleCkgPiBiaSkgeyAvLyBhIHN0cmluZyBwcmVjZWRlcyB0aGUgbmV4dCBudW1iZXIgaW4gYlxuICAgICAgYnMgPSBiLnNsaWNlKGJpLCBicyk7XG4gICAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICAgIGVsc2Ugc1srK2ldID0gYnM7XG4gICAgfVxuICAgIGlmICgoYW0gPSBhbVswXSkgPT09IChibSA9IGJtWzBdKSkgeyAvLyBudW1iZXJzIGluIGEgJiBiIG1hdGNoXG4gICAgICBpZiAoc1tpXSkgc1tpXSArPSBibTsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICAgIGVsc2Ugc1srK2ldID0gYm07XG4gICAgfSBlbHNlIHsgLy8gaW50ZXJwb2xhdGUgbm9uLW1hdGNoaW5nIG51bWJlcnNcbiAgICAgIHNbKytpXSA9IG51bGw7XG4gICAgICBxLnB1c2goe2k6IGksIHg6IG51bWJlcihhbSwgYm0pfSk7XG4gICAgfVxuICAgIGJpID0gcmVCLmxhc3RJbmRleDtcbiAgfVxuXG4gIC8vIEFkZCByZW1haW5zIG9mIGIuXG4gIGlmIChiaSA8IGIubGVuZ3RoKSB7XG4gICAgYnMgPSBiLnNsaWNlKGJpKTtcbiAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmdcbiAgICBlbHNlIHNbKytpXSA9IGJzO1xuICB9XG5cbiAgLy8gU3BlY2lhbCBvcHRpbWl6YXRpb24gZm9yIG9ubHkgYSBzaW5nbGUgbWF0Y2guXG4gIC8vIE90aGVyd2lzZSwgaW50ZXJwb2xhdGUgZWFjaCBvZiB0aGUgbnVtYmVycyBhbmQgcmVqb2luIHRoZSBzdHJpbmcuXG4gIHJldHVybiBzLmxlbmd0aCA8IDIgPyAocVswXVxuICAgICAgPyBvbmUocVswXS54KVxuICAgICAgOiB6ZXJvKGIpKVxuICAgICAgOiAoYiA9IHEubGVuZ3RoLCBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG87IGkgPCBiOyArK2kpIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTtcbiAgICAgICAgICByZXR1cm4gcy5qb2luKFwiXCIpO1xuICAgICAgICB9KTtcbn1cbiIsInZhciBkZWdyZWVzID0gMTgwIC8gTWF0aC5QSTtcblxuZXhwb3J0IHZhciBpZGVudGl0eSA9IHtcbiAgdHJhbnNsYXRlWDogMCxcbiAgdHJhbnNsYXRlWTogMCxcbiAgcm90YXRlOiAwLFxuICBza2V3WDogMCxcbiAgc2NhbGVYOiAxLFxuICBzY2FsZVk6IDFcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgdmFyIHNjYWxlWCwgc2NhbGVZLCBza2V3WDtcbiAgaWYgKHNjYWxlWCA9IE1hdGguc3FydChhICogYSArIGIgKiBiKSkgYSAvPSBzY2FsZVgsIGIgLz0gc2NhbGVYO1xuICBpZiAoc2tld1ggPSBhICogYyArIGIgKiBkKSBjIC09IGEgKiBza2V3WCwgZCAtPSBiICogc2tld1g7XG4gIGlmIChzY2FsZVkgPSBNYXRoLnNxcnQoYyAqIGMgKyBkICogZCkpIGMgLz0gc2NhbGVZLCBkIC89IHNjYWxlWSwgc2tld1ggLz0gc2NhbGVZO1xuICBpZiAoYSAqIGQgPCBiICogYykgYSA9IC1hLCBiID0gLWIsIHNrZXdYID0gLXNrZXdYLCBzY2FsZVggPSAtc2NhbGVYO1xuICByZXR1cm4ge1xuICAgIHRyYW5zbGF0ZVg6IGUsXG4gICAgdHJhbnNsYXRlWTogZixcbiAgICByb3RhdGU6IE1hdGguYXRhbjIoYiwgYSkgKiBkZWdyZWVzLFxuICAgIHNrZXdYOiBNYXRoLmF0YW4oc2tld1gpICogZGVncmVlcyxcbiAgICBzY2FsZVg6IHNjYWxlWCxcbiAgICBzY2FsZVk6IHNjYWxlWVxuICB9O1xufVxuIiwiaW1wb3J0IGRlY29tcG9zZSwge2lkZW50aXR5fSBmcm9tIFwiLi9kZWNvbXBvc2UuanNcIjtcblxudmFyIHN2Z05vZGU7XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDc3ModmFsdWUpIHtcbiAgY29uc3QgbSA9IG5ldyAodHlwZW9mIERPTU1hdHJpeCA9PT0gXCJmdW5jdGlvblwiID8gRE9NTWF0cml4IDogV2ViS2l0Q1NTTWF0cml4KSh2YWx1ZSArIFwiXCIpO1xuICByZXR1cm4gbS5pc0lkZW50aXR5ID8gaWRlbnRpdHkgOiBkZWNvbXBvc2UobS5hLCBtLmIsIG0uYywgbS5kLCBtLmUsIG0uZik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVN2Zyh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIGlkZW50aXR5O1xuICBpZiAoIXN2Z05vZGUpIHN2Z05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcImdcIik7XG4gIHN2Z05vZGUuc2V0QXR0cmlidXRlKFwidHJhbnNmb3JtXCIsIHZhbHVlKTtcbiAgaWYgKCEodmFsdWUgPSBzdmdOb2RlLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpKSByZXR1cm4gaWRlbnRpdHk7XG4gIHZhbHVlID0gdmFsdWUubWF0cml4O1xuICByZXR1cm4gZGVjb21wb3NlKHZhbHVlLmEsIHZhbHVlLmIsIHZhbHVlLmMsIHZhbHVlLmQsIHZhbHVlLmUsIHZhbHVlLmYpO1xufVxuIiwiaW1wb3J0IG51bWJlciBmcm9tIFwiLi4vbnVtYmVyLmpzXCI7XG5pbXBvcnQge3BhcnNlQ3NzLCBwYXJzZVN2Z30gZnJvbSBcIi4vcGFyc2UuanNcIjtcblxuZnVuY3Rpb24gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2UsIHB4Q29tbWEsIHB4UGFyZW4sIGRlZ1BhcmVuKSB7XG5cbiAgZnVuY3Rpb24gcG9wKHMpIHtcbiAgICByZXR1cm4gcy5sZW5ndGggPyBzLnBvcCgpICsgXCIgXCIgOiBcIlwiO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNsYXRlKHhhLCB5YSwgeGIsIHliLCBzLCBxKSB7XG4gICAgaWYgKHhhICE9PSB4YiB8fCB5YSAhPT0geWIpIHtcbiAgICAgIHZhciBpID0gcy5wdXNoKFwidHJhbnNsYXRlKFwiLCBudWxsLCBweENvbW1hLCBudWxsLCBweFBhcmVuKTtcbiAgICAgIHEucHVzaCh7aTogaSAtIDQsIHg6IG51bWJlcih4YSwgeGIpfSwge2k6IGkgLSAyLCB4OiBudW1iZXIoeWEsIHliKX0pO1xuICAgIH0gZWxzZSBpZiAoeGIgfHwgeWIpIHtcbiAgICAgIHMucHVzaChcInRyYW5zbGF0ZShcIiArIHhiICsgcHhDb21tYSArIHliICsgcHhQYXJlbik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcm90YXRlKGEsIGIsIHMsIHEpIHtcbiAgICBpZiAoYSAhPT0gYikge1xuICAgICAgaWYgKGEgLSBiID4gMTgwKSBiICs9IDM2MDsgZWxzZSBpZiAoYiAtIGEgPiAxODApIGEgKz0gMzYwOyAvLyBzaG9ydGVzdCBwYXRoXG4gICAgICBxLnB1c2goe2k6IHMucHVzaChwb3AocykgKyBcInJvdGF0ZShcIiwgbnVsbCwgZGVnUGFyZW4pIC0gMiwgeDogbnVtYmVyKGEsIGIpfSk7XG4gICAgfSBlbHNlIGlmIChiKSB7XG4gICAgICBzLnB1c2gocG9wKHMpICsgXCJyb3RhdGUoXCIgKyBiICsgZGVnUGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNrZXdYKGEsIGIsIHMsIHEpIHtcbiAgICBpZiAoYSAhPT0gYikge1xuICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgXCJza2V3WChcIiwgbnVsbCwgZGVnUGFyZW4pIC0gMiwgeDogbnVtYmVyKGEsIGIpfSk7XG4gICAgfSBlbHNlIGlmIChiKSB7XG4gICAgICBzLnB1c2gocG9wKHMpICsgXCJza2V3WChcIiArIGIgKyBkZWdQYXJlbik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2NhbGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHtcbiAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5Yikge1xuICAgICAgdmFyIGkgPSBzLnB1c2gocG9wKHMpICsgXCJzY2FsZShcIiwgbnVsbCwgXCIsXCIsIG51bGwsIFwiKVwiKTtcbiAgICAgIHEucHVzaCh7aTogaSAtIDQsIHg6IG51bWJlcih4YSwgeGIpfSwge2k6IGkgLSAyLCB4OiBudW1iZXIoeWEsIHliKX0pO1xuICAgIH0gZWxzZSBpZiAoeGIgIT09IDEgfHwgeWIgIT09IDEpIHtcbiAgICAgIHMucHVzaChwb3AocykgKyBcInNjYWxlKFwiICsgeGIgKyBcIixcIiArIHliICsgXCIpXCIpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbihhLCBiKSB7XG4gICAgdmFyIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzXG4gICAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnNcbiAgICBhID0gcGFyc2UoYSksIGIgPSBwYXJzZShiKTtcbiAgICB0cmFuc2xhdGUoYS50cmFuc2xhdGVYLCBhLnRyYW5zbGF0ZVksIGIudHJhbnNsYXRlWCwgYi50cmFuc2xhdGVZLCBzLCBxKTtcbiAgICByb3RhdGUoYS5yb3RhdGUsIGIucm90YXRlLCBzLCBxKTtcbiAgICBza2V3WChhLnNrZXdYLCBiLnNrZXdYLCBzLCBxKTtcbiAgICBzY2FsZShhLnNjYWxlWCwgYS5zY2FsZVksIGIuc2NhbGVYLCBiLnNjYWxlWSwgcywgcSk7XG4gICAgYSA9IGIgPSBudWxsOyAvLyBnY1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICB2YXIgaSA9IC0xLCBuID0gcS5sZW5ndGgsIG87XG4gICAgICB3aGlsZSAoKytpIDwgbikgc1sobyA9IHFbaV0pLmldID0gby54KHQpO1xuICAgICAgcmV0dXJuIHMuam9pbihcIlwiKTtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgdmFyIGludGVycG9sYXRlVHJhbnNmb3JtQ3NzID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VDc3MsIFwicHgsIFwiLCBcInB4KVwiLCBcImRlZylcIik7XG5leHBvcnQgdmFyIGludGVycG9sYXRlVHJhbnNmb3JtU3ZnID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VTdmcsIFwiLCBcIiwgXCIpXCIsIFwiKVwiKTtcbiIsInZhciBmcmFtZSA9IDAsIC8vIGlzIGFuIGFuaW1hdGlvbiBmcmFtZSBwZW5kaW5nP1xuICAgIHRpbWVvdXQgPSAwLCAvLyBpcyBhIHRpbWVvdXQgcGVuZGluZz9cbiAgICBpbnRlcnZhbCA9IDAsIC8vIGFyZSBhbnkgdGltZXJzIGFjdGl2ZT9cbiAgICBwb2tlRGVsYXkgPSAxMDAwLCAvLyBob3cgZnJlcXVlbnRseSB3ZSBjaGVjayBmb3IgY2xvY2sgc2tld1xuICAgIHRhc2tIZWFkLFxuICAgIHRhc2tUYWlsLFxuICAgIGNsb2NrTGFzdCA9IDAsXG4gICAgY2xvY2tOb3cgPSAwLFxuICAgIGNsb2NrU2tldyA9IDAsXG4gICAgY2xvY2sgPSB0eXBlb2YgcGVyZm9ybWFuY2UgPT09IFwib2JqZWN0XCIgJiYgcGVyZm9ybWFuY2Uubm93ID8gcGVyZm9ybWFuY2UgOiBEYXRlLFxuICAgIHNldEZyYW1lID0gdHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIiAmJiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdykgOiBmdW5jdGlvbihmKSB7IHNldFRpbWVvdXQoZiwgMTcpOyB9O1xuXG5leHBvcnQgZnVuY3Rpb24gbm93KCkge1xuICByZXR1cm4gY2xvY2tOb3cgfHwgKHNldEZyYW1lKGNsZWFyTm93KSwgY2xvY2tOb3cgPSBjbG9jay5ub3coKSArIGNsb2NrU2tldyk7XG59XG5cbmZ1bmN0aW9uIGNsZWFyTm93KCkge1xuICBjbG9ja05vdyA9IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBUaW1lcigpIHtcbiAgdGhpcy5fY2FsbCA9XG4gIHRoaXMuX3RpbWUgPVxuICB0aGlzLl9uZXh0ID0gbnVsbDtcbn1cblxuVGltZXIucHJvdG90eXBlID0gdGltZXIucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVGltZXIsXG4gIHJlc3RhcnQ6IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uXCIpO1xuICAgIHRpbWUgPSAodGltZSA9PSBudWxsID8gbm93KCkgOiArdGltZSkgKyAoZGVsYXkgPT0gbnVsbCA/IDAgOiArZGVsYXkpO1xuICAgIGlmICghdGhpcy5fbmV4dCAmJiB0YXNrVGFpbCAhPT0gdGhpcykge1xuICAgICAgaWYgKHRhc2tUYWlsKSB0YXNrVGFpbC5fbmV4dCA9IHRoaXM7XG4gICAgICBlbHNlIHRhc2tIZWFkID0gdGhpcztcbiAgICAgIHRhc2tUYWlsID0gdGhpcztcbiAgICB9XG4gICAgdGhpcy5fY2FsbCA9IGNhbGxiYWNrO1xuICAgIHRoaXMuX3RpbWUgPSB0aW1lO1xuICAgIHNsZWVwKCk7XG4gIH0sXG4gIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLl9jYWxsKSB7XG4gICAgICB0aGlzLl9jYWxsID0gbnVsbDtcbiAgICAgIHRoaXMuX3RpbWUgPSBJbmZpbml0eTtcbiAgICAgIHNsZWVwKCk7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gdGltZXIoY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7XG4gIHZhciB0ID0gbmV3IFRpbWVyO1xuICB0LnJlc3RhcnQoY2FsbGJhY2ssIGRlbGF5LCB0aW1lKTtcbiAgcmV0dXJuIHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0aW1lckZsdXNoKCkge1xuICBub3coKTsgLy8gR2V0IHRoZSBjdXJyZW50IHRpbWUsIGlmIG5vdCBhbHJlYWR5IHNldC5cbiAgKytmcmFtZTsgLy8gUHJldGVuZCB3ZeKAmXZlIHNldCBhbiBhbGFybSwgaWYgd2UgaGF2ZW7igJl0IGFscmVhZHkuXG4gIHZhciB0ID0gdGFza0hlYWQsIGU7XG4gIHdoaWxlICh0KSB7XG4gICAgaWYgKChlID0gY2xvY2tOb3cgLSB0Ll90aW1lKSA+PSAwKSB0Ll9jYWxsLmNhbGwodW5kZWZpbmVkLCBlKTtcbiAgICB0ID0gdC5fbmV4dDtcbiAgfVxuICAtLWZyYW1lO1xufVxuXG5mdW5jdGlvbiB3YWtlKCkge1xuICBjbG9ja05vdyA9IChjbG9ja0xhc3QgPSBjbG9jay5ub3coKSkgKyBjbG9ja1NrZXc7XG4gIGZyYW1lID0gdGltZW91dCA9IDA7XG4gIHRyeSB7XG4gICAgdGltZXJGbHVzaCgpO1xuICB9IGZpbmFsbHkge1xuICAgIGZyYW1lID0gMDtcbiAgICBuYXAoKTtcbiAgICBjbG9ja05vdyA9IDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9rZSgpIHtcbiAgdmFyIG5vdyA9IGNsb2NrLm5vdygpLCBkZWxheSA9IG5vdyAtIGNsb2NrTGFzdDtcbiAgaWYgKGRlbGF5ID4gcG9rZURlbGF5KSBjbG9ja1NrZXcgLT0gZGVsYXksIGNsb2NrTGFzdCA9IG5vdztcbn1cblxuZnVuY3Rpb24gbmFwKCkge1xuICB2YXIgdDAsIHQxID0gdGFza0hlYWQsIHQyLCB0aW1lID0gSW5maW5pdHk7XG4gIHdoaWxlICh0MSkge1xuICAgIGlmICh0MS5fY2FsbCkge1xuICAgICAgaWYgKHRpbWUgPiB0MS5fdGltZSkgdGltZSA9IHQxLl90aW1lO1xuICAgICAgdDAgPSB0MSwgdDEgPSB0MS5fbmV4dDtcbiAgICB9IGVsc2Uge1xuICAgICAgdDIgPSB0MS5fbmV4dCwgdDEuX25leHQgPSBudWxsO1xuICAgICAgdDEgPSB0MCA/IHQwLl9uZXh0ID0gdDIgOiB0YXNrSGVhZCA9IHQyO1xuICAgIH1cbiAgfVxuICB0YXNrVGFpbCA9IHQwO1xuICBzbGVlcCh0aW1lKTtcbn1cblxuZnVuY3Rpb24gc2xlZXAodGltZSkge1xuICBpZiAoZnJhbWUpIHJldHVybjsgLy8gU29vbmVzdCBhbGFybSBhbHJlYWR5IHNldCwgb3Igd2lsbCBiZS5cbiAgaWYgKHRpbWVvdXQpIHRpbWVvdXQgPSBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gIHZhciBkZWxheSA9IHRpbWUgLSBjbG9ja05vdzsgLy8gU3RyaWN0bHkgbGVzcyB0aGFuIGlmIHdlIHJlY29tcHV0ZWQgY2xvY2tOb3cuXG4gIGlmIChkZWxheSA+IDI0KSB7XG4gICAgaWYgKHRpbWUgPCBJbmZpbml0eSkgdGltZW91dCA9IHNldFRpbWVvdXQod2FrZSwgdGltZSAtIGNsb2NrLm5vdygpIC0gY2xvY2tTa2V3KTtcbiAgICBpZiAoaW50ZXJ2YWwpIGludGVydmFsID0gY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFpbnRlcnZhbCkgY2xvY2tMYXN0ID0gY2xvY2subm93KCksIGludGVydmFsID0gc2V0SW50ZXJ2YWwocG9rZSwgcG9rZURlbGF5KTtcbiAgICBmcmFtZSA9IDEsIHNldEZyYW1lKHdha2UpO1xuICB9XG59XG4iLCJpbXBvcnQge1RpbWVyfSBmcm9tIFwiLi90aW1lci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHtcbiAgdmFyIHQgPSBuZXcgVGltZXI7XG4gIGRlbGF5ID0gZGVsYXkgPT0gbnVsbCA/IDAgOiArZGVsYXk7XG4gIHQucmVzdGFydChlbGFwc2VkID0+IHtcbiAgICB0LnN0b3AoKTtcbiAgICBjYWxsYmFjayhlbGFwc2VkICsgZGVsYXkpO1xuICB9LCBkZWxheSwgdGltZSk7XG4gIHJldHVybiB0O1xufVxuIiwiaW1wb3J0IHtkaXNwYXRjaH0gZnJvbSBcImQzLWRpc3BhdGNoXCI7XG5pbXBvcnQge3RpbWVyLCB0aW1lb3V0fSBmcm9tIFwiZDMtdGltZXJcIjtcblxudmFyIGVtcHR5T24gPSBkaXNwYXRjaChcInN0YXJ0XCIsIFwiZW5kXCIsIFwiY2FuY2VsXCIsIFwiaW50ZXJydXB0XCIpO1xudmFyIGVtcHR5VHdlZW4gPSBbXTtcblxuZXhwb3J0IHZhciBDUkVBVEVEID0gMDtcbmV4cG9ydCB2YXIgU0NIRURVTEVEID0gMTtcbmV4cG9ydCB2YXIgU1RBUlRJTkcgPSAyO1xuZXhwb3J0IHZhciBTVEFSVEVEID0gMztcbmV4cG9ydCB2YXIgUlVOTklORyA9IDQ7XG5leHBvcnQgdmFyIEVORElORyA9IDU7XG5leHBvcnQgdmFyIEVOREVEID0gNjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obm9kZSwgbmFtZSwgaWQsIGluZGV4LCBncm91cCwgdGltaW5nKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbjtcbiAgaWYgKCFzY2hlZHVsZXMpIG5vZGUuX190cmFuc2l0aW9uID0ge307XG4gIGVsc2UgaWYgKGlkIGluIHNjaGVkdWxlcykgcmV0dXJuO1xuICBjcmVhdGUobm9kZSwgaWQsIHtcbiAgICBuYW1lOiBuYW1lLFxuICAgIGluZGV4OiBpbmRleCwgLy8gRm9yIGNvbnRleHQgZHVyaW5nIGNhbGxiYWNrLlxuICAgIGdyb3VwOiBncm91cCwgLy8gRm9yIGNvbnRleHQgZHVyaW5nIGNhbGxiYWNrLlxuICAgIG9uOiBlbXB0eU9uLFxuICAgIHR3ZWVuOiBlbXB0eVR3ZWVuLFxuICAgIHRpbWU6IHRpbWluZy50aW1lLFxuICAgIGRlbGF5OiB0aW1pbmcuZGVsYXksXG4gICAgZHVyYXRpb246IHRpbWluZy5kdXJhdGlvbixcbiAgICBlYXNlOiB0aW1pbmcuZWFzZSxcbiAgICB0aW1lcjogbnVsbCxcbiAgICBzdGF0ZTogQ1JFQVRFRFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXQobm9kZSwgaWQpIHtcbiAgdmFyIHNjaGVkdWxlID0gZ2V0KG5vZGUsIGlkKTtcbiAgaWYgKHNjaGVkdWxlLnN0YXRlID4gQ1JFQVRFRCkgdGhyb3cgbmV3IEVycm9yKFwidG9vIGxhdGU7IGFscmVhZHkgc2NoZWR1bGVkXCIpO1xuICByZXR1cm4gc2NoZWR1bGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXQobm9kZSwgaWQpIHtcbiAgdmFyIHNjaGVkdWxlID0gZ2V0KG5vZGUsIGlkKTtcbiAgaWYgKHNjaGVkdWxlLnN0YXRlID4gU1RBUlRFRCkgdGhyb3cgbmV3IEVycm9yKFwidG9vIGxhdGU7IGFscmVhZHkgcnVubmluZ1wiKTtcbiAgcmV0dXJuIHNjaGVkdWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0KG5vZGUsIGlkKSB7XG4gIHZhciBzY2hlZHVsZSA9IG5vZGUuX190cmFuc2l0aW9uO1xuICBpZiAoIXNjaGVkdWxlIHx8ICEoc2NoZWR1bGUgPSBzY2hlZHVsZVtpZF0pKSB0aHJvdyBuZXcgRXJyb3IoXCJ0cmFuc2l0aW9uIG5vdCBmb3VuZFwiKTtcbiAgcmV0dXJuIHNjaGVkdWxlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGUobm9kZSwgaWQsIHNlbGYpIHtcbiAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uLFxuICAgICAgdHdlZW47XG5cbiAgLy8gSW5pdGlhbGl6ZSB0aGUgc2VsZiB0aW1lciB3aGVuIHRoZSB0cmFuc2l0aW9uIGlzIGNyZWF0ZWQuXG4gIC8vIE5vdGUgdGhlIGFjdHVhbCBkZWxheSBpcyBub3Qga25vd24gdW50aWwgdGhlIGZpcnN0IGNhbGxiYWNrIVxuICBzY2hlZHVsZXNbaWRdID0gc2VsZjtcbiAgc2VsZi50aW1lciA9IHRpbWVyKHNjaGVkdWxlLCAwLCBzZWxmLnRpbWUpO1xuXG4gIGZ1bmN0aW9uIHNjaGVkdWxlKGVsYXBzZWQpIHtcbiAgICBzZWxmLnN0YXRlID0gU0NIRURVTEVEO1xuICAgIHNlbGYudGltZXIucmVzdGFydChzdGFydCwgc2VsZi5kZWxheSwgc2VsZi50aW1lKTtcblxuICAgIC8vIElmIHRoZSBlbGFwc2VkIGRlbGF5IGlzIGxlc3MgdGhhbiBvdXIgZmlyc3Qgc2xlZXAsIHN0YXJ0IGltbWVkaWF0ZWx5LlxuICAgIGlmIChzZWxmLmRlbGF5IDw9IGVsYXBzZWQpIHN0YXJ0KGVsYXBzZWQgLSBzZWxmLmRlbGF5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXJ0KGVsYXBzZWQpIHtcbiAgICB2YXIgaSwgaiwgbiwgbztcblxuICAgIC8vIElmIHRoZSBzdGF0ZSBpcyBub3QgU0NIRURVTEVELCB0aGVuIHdlIHByZXZpb3VzbHkgZXJyb3JlZCBvbiBzdGFydC5cbiAgICBpZiAoc2VsZi5zdGF0ZSAhPT0gU0NIRURVTEVEKSByZXR1cm4gc3RvcCgpO1xuXG4gICAgZm9yIChpIGluIHNjaGVkdWxlcykge1xuICAgICAgbyA9IHNjaGVkdWxlc1tpXTtcbiAgICAgIGlmIChvLm5hbWUgIT09IHNlbGYubmFtZSkgY29udGludWU7XG5cbiAgICAgIC8vIFdoaWxlIHRoaXMgZWxlbWVudCBhbHJlYWR5IGhhcyBhIHN0YXJ0aW5nIHRyYW5zaXRpb24gZHVyaW5nIHRoaXMgZnJhbWUsXG4gICAgICAvLyBkZWZlciBzdGFydGluZyBhbiBpbnRlcnJ1cHRpbmcgdHJhbnNpdGlvbiB1bnRpbCB0aGF0IHRyYW5zaXRpb24gaGFzIGFcbiAgICAgIC8vIGNoYW5jZSB0byB0aWNrIChhbmQgcG9zc2libHkgZW5kKTsgc2VlIGQzL2QzLXRyYW5zaXRpb24jNTQhXG4gICAgICBpZiAoby5zdGF0ZSA9PT0gU1RBUlRFRCkgcmV0dXJuIHRpbWVvdXQoc3RhcnQpO1xuXG4gICAgICAvLyBJbnRlcnJ1cHQgdGhlIGFjdGl2ZSB0cmFuc2l0aW9uLCBpZiBhbnkuXG4gICAgICBpZiAoby5zdGF0ZSA9PT0gUlVOTklORykge1xuICAgICAgICBvLnN0YXRlID0gRU5ERUQ7XG4gICAgICAgIG8udGltZXIuc3RvcCgpO1xuICAgICAgICBvLm9uLmNhbGwoXCJpbnRlcnJ1cHRcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgby5pbmRleCwgby5ncm91cCk7XG4gICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07XG4gICAgICB9XG5cbiAgICAgIC8vIENhbmNlbCBhbnkgcHJlLWVtcHRlZCB0cmFuc2l0aW9ucy5cbiAgICAgIGVsc2UgaWYgKCtpIDwgaWQpIHtcbiAgICAgICAgby5zdGF0ZSA9IEVOREVEO1xuICAgICAgICBvLnRpbWVyLnN0b3AoKTtcbiAgICAgICAgby5vbi5jYWxsKFwiY2FuY2VsXCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIG8uaW5kZXgsIG8uZ3JvdXApO1xuICAgICAgICBkZWxldGUgc2NoZWR1bGVzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERlZmVyIHRoZSBmaXJzdCB0aWNrIHRvIGVuZCBvZiB0aGUgY3VycmVudCBmcmFtZTsgc2VlIGQzL2QzIzE1NzYuXG4gICAgLy8gTm90ZSB0aGUgdHJhbnNpdGlvbiBtYXkgYmUgY2FuY2VsZWQgYWZ0ZXIgc3RhcnQgYW5kIGJlZm9yZSB0aGUgZmlyc3QgdGljayFcbiAgICAvLyBOb3RlIHRoaXMgbXVzdCBiZSBzY2hlZHVsZWQgYmVmb3JlIHRoZSBzdGFydCBldmVudDsgc2VlIGQzL2QzLXRyYW5zaXRpb24jMTYhXG4gICAgLy8gQXNzdW1pbmcgdGhpcyBpcyBzdWNjZXNzZnVsLCBzdWJzZXF1ZW50IGNhbGxiYWNrcyBnbyBzdHJhaWdodCB0byB0aWNrLlxuICAgIHRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gU1RBUlRFRCkge1xuICAgICAgICBzZWxmLnN0YXRlID0gUlVOTklORztcbiAgICAgICAgc2VsZi50aW1lci5yZXN0YXJ0KHRpY2ssIHNlbGYuZGVsYXksIHNlbGYudGltZSk7XG4gICAgICAgIHRpY2soZWxhcHNlZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBEaXNwYXRjaCB0aGUgc3RhcnQgZXZlbnQuXG4gICAgLy8gTm90ZSB0aGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhlIHR3ZWVuIGFyZSBpbml0aWFsaXplZC5cbiAgICBzZWxmLnN0YXRlID0gU1RBUlRJTkc7XG4gICAgc2VsZi5vbi5jYWxsKFwic3RhcnRcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7XG4gICAgaWYgKHNlbGYuc3RhdGUgIT09IFNUQVJUSU5HKSByZXR1cm47IC8vIGludGVycnVwdGVkXG4gICAgc2VsZi5zdGF0ZSA9IFNUQVJURUQ7XG5cbiAgICAvLyBJbml0aWFsaXplIHRoZSB0d2VlbiwgZGVsZXRpbmcgbnVsbCB0d2Vlbi5cbiAgICB0d2VlbiA9IG5ldyBBcnJheShuID0gc2VsZi50d2Vlbi5sZW5ndGgpO1xuICAgIGZvciAoaSA9IDAsIGogPSAtMTsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG8gPSBzZWxmLnR3ZWVuW2ldLnZhbHVlLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCkpIHtcbiAgICAgICAgdHdlZW5bKytqXSA9IG87XG4gICAgICB9XG4gICAgfVxuICAgIHR3ZWVuLmxlbmd0aCA9IGogKyAxO1xuICB9XG5cbiAgZnVuY3Rpb24gdGljayhlbGFwc2VkKSB7XG4gICAgdmFyIHQgPSBlbGFwc2VkIDwgc2VsZi5kdXJhdGlvbiA/IHNlbGYuZWFzZS5jYWxsKG51bGwsIGVsYXBzZWQgLyBzZWxmLmR1cmF0aW9uKSA6IChzZWxmLnRpbWVyLnJlc3RhcnQoc3RvcCksIHNlbGYuc3RhdGUgPSBFTkRJTkcsIDEpLFxuICAgICAgICBpID0gLTEsXG4gICAgICAgIG4gPSB0d2Vlbi5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgdHdlZW5baV0uY2FsbChub2RlLCB0KTtcbiAgICB9XG5cbiAgICAvLyBEaXNwYXRjaCB0aGUgZW5kIGV2ZW50LlxuICAgIGlmIChzZWxmLnN0YXRlID09PSBFTkRJTkcpIHtcbiAgICAgIHNlbGYub24uY2FsbChcImVuZFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKTtcbiAgICAgIHN0b3AoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdG9wKCkge1xuICAgIHNlbGYuc3RhdGUgPSBFTkRFRDtcbiAgICBzZWxmLnRpbWVyLnN0b3AoKTtcbiAgICBkZWxldGUgc2NoZWR1bGVzW2lkXTtcbiAgICBmb3IgKHZhciBpIGluIHNjaGVkdWxlcykgcmV0dXJuOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uO1xuICB9XG59XG4iLCJpbXBvcnQge1NUQVJUSU5HLCBFTkRJTkcsIEVOREVEfSBmcm9tIFwiLi90cmFuc2l0aW9uL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUsIG5hbWUpIHtcbiAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uLFxuICAgICAgc2NoZWR1bGUsXG4gICAgICBhY3RpdmUsXG4gICAgICBlbXB0eSA9IHRydWUsXG4gICAgICBpO1xuXG4gIGlmICghc2NoZWR1bGVzKSByZXR1cm47XG5cbiAgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgXCJcIjtcblxuICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7XG4gICAgaWYgKChzY2hlZHVsZSA9IHNjaGVkdWxlc1tpXSkubmFtZSAhPT0gbmFtZSkgeyBlbXB0eSA9IGZhbHNlOyBjb250aW51ZTsgfVxuICAgIGFjdGl2ZSA9IHNjaGVkdWxlLnN0YXRlID4gU1RBUlRJTkcgJiYgc2NoZWR1bGUuc3RhdGUgPCBFTkRJTkc7XG4gICAgc2NoZWR1bGUuc3RhdGUgPSBFTkRFRDtcbiAgICBzY2hlZHVsZS50aW1lci5zdG9wKCk7XG4gICAgc2NoZWR1bGUub24uY2FsbChhY3RpdmUgPyBcImludGVycnVwdFwiIDogXCJjYW5jZWxcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2NoZWR1bGUuaW5kZXgsIHNjaGVkdWxlLmdyb3VwKTtcbiAgICBkZWxldGUgc2NoZWR1bGVzW2ldO1xuICB9XG5cbiAgaWYgKGVtcHR5KSBkZWxldGUgbm9kZS5fX3RyYW5zaXRpb247XG59XG4iLCJpbXBvcnQgaW50ZXJydXB0IGZyb20gXCIuLi9pbnRlcnJ1cHQuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuICAgIGludGVycnVwdCh0aGlzLCBuYW1lKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQge2dldCwgc2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiB0d2VlblJlbW92ZShpZCwgbmFtZSkge1xuICB2YXIgdHdlZW4wLCB0d2VlbjE7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICB0d2VlbiA9IHNjaGVkdWxlLnR3ZWVuO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCB0d2VlbiB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCB0d2VlbiBhbmQgd2XigJlyZSBkb25lIVxuICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICBpZiAodHdlZW4gIT09IHR3ZWVuMCkge1xuICAgICAgdHdlZW4xID0gdHdlZW4wID0gdHdlZW47XG4gICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR3ZWVuMS5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgaWYgKHR3ZWVuMVtpXS5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgICAgdHdlZW4xID0gdHdlZW4xLnNsaWNlKCk7XG4gICAgICAgICAgdHdlZW4xLnNwbGljZShpLCAxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHNjaGVkdWxlLnR3ZWVuID0gdHdlZW4xO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0d2VlbkZ1bmN0aW9uKGlkLCBuYW1lLCB2YWx1ZSkge1xuICB2YXIgdHdlZW4wLCB0d2VlbjE7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSxcbiAgICAgICAgdHdlZW4gPSBzY2hlZHVsZS50d2VlbjtcblxuICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgdHdlZW4gd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKHR3ZWVuICE9PSB0d2VlbjApIHtcbiAgICAgIHR3ZWVuMSA9ICh0d2VlbjAgPSB0d2Vlbikuc2xpY2UoKTtcbiAgICAgIGZvciAodmFyIHQgPSB7bmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlfSwgaSA9IDAsIG4gPSB0d2VlbjEubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGlmICh0d2VlbjFbaV0ubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICAgIHR3ZWVuMVtpXSA9IHQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpID09PSBuKSB0d2VlbjEucHVzaCh0KTtcbiAgICB9XG5cbiAgICBzY2hlZHVsZS50d2VlbiA9IHR3ZWVuMTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgbmFtZSArPSBcIlwiO1xuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgIHZhciB0d2VlbiA9IGdldCh0aGlzLm5vZGUoKSwgaWQpLnR3ZWVuO1xuICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHdlZW4ubGVuZ3RoLCB0OyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKHQgPSB0d2VlbltpXSkubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICByZXR1cm4gdC52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsID8gdHdlZW5SZW1vdmUgOiB0d2VlbkZ1bmN0aW9uKShpZCwgbmFtZSwgdmFsdWUpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHR3ZWVuVmFsdWUodHJhbnNpdGlvbiwgbmFtZSwgdmFsdWUpIHtcbiAgdmFyIGlkID0gdHJhbnNpdGlvbi5faWQ7XG5cbiAgdHJhbnNpdGlvbi5lYWNoKGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCk7XG4gICAgKHNjaGVkdWxlLnZhbHVlIHx8IChzY2hlZHVsZS52YWx1ZSA9IHt9KSlbbmFtZV0gPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9KTtcblxuICByZXR1cm4gZnVuY3Rpb24obm9kZSkge1xuICAgIHJldHVybiBnZXQobm9kZSwgaWQpLnZhbHVlW25hbWVdO1xuICB9O1xufVxuIiwiaW1wb3J0IHtjb2xvcn0gZnJvbSBcImQzLWNvbG9yXCI7XG5pbXBvcnQge2ludGVycG9sYXRlTnVtYmVyLCBpbnRlcnBvbGF0ZVJnYiwgaW50ZXJwb2xhdGVTdHJpbmd9IGZyb20gXCJkMy1pbnRlcnBvbGF0ZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBjO1xuICByZXR1cm4gKHR5cGVvZiBiID09PSBcIm51bWJlclwiID8gaW50ZXJwb2xhdGVOdW1iZXJcbiAgICAgIDogYiBpbnN0YW5jZW9mIGNvbG9yID8gaW50ZXJwb2xhdGVSZ2JcbiAgICAgIDogKGMgPSBjb2xvcihiKSkgPyAoYiA9IGMsIGludGVycG9sYXRlUmdiKVxuICAgICAgOiBpbnRlcnBvbGF0ZVN0cmluZykoYSwgYik7XG59XG4iLCJpbXBvcnQge2ludGVycG9sYXRlVHJhbnNmb3JtU3ZnIGFzIGludGVycG9sYXRlVHJhbnNmb3JtfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcbmltcG9ydCB7bmFtZXNwYWNlfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge3R3ZWVuVmFsdWV9IGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5pbXBvcnQgaW50ZXJwb2xhdGUgZnJvbSBcIi4vaW50ZXJwb2xhdGUuanNcIjtcblxuZnVuY3Rpb24gYXR0clJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0clJlbW92ZU5TKGZ1bGxuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudChuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMoZnVsbG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCIsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uKG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwLCB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSwgc3RyaW5nMTtcbiAgICBpZiAodmFsdWUxID09IG51bGwpIHJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIjtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TKGZ1bGxuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCwgdmFsdWUxID0gdmFsdWUodGhpcyksIHN0cmluZzE7XG4gICAgaWYgKHZhbHVlMSA9PSBudWxsKSByZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIjtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKSwgaSA9IGZ1bGxuYW1lID09PSBcInRyYW5zZm9ybVwiID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm0gOiBpbnRlcnBvbGF0ZTtcbiAgcmV0dXJuIHRoaXMuYXR0clR3ZWVuKG5hbWUsIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJGdW5jdGlvbk5TIDogYXR0ckZ1bmN0aW9uKShmdWxsbmFtZSwgaSwgdHdlZW5WYWx1ZSh0aGlzLCBcImF0dHIuXCIgKyBuYW1lLCB2YWx1ZSkpXG4gICAgICA6IHZhbHVlID09IG51bGwgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMgOiBhdHRyUmVtb3ZlKShmdWxsbmFtZSlcbiAgICAgIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQpKGZ1bGxuYW1lLCBpLCB2YWx1ZSkpO1xufVxuIiwiaW1wb3J0IHtuYW1lc3BhY2V9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcblxuZnVuY3Rpb24gYXR0ckludGVycG9sYXRlKG5hbWUsIGkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCBpLmNhbGwodGhpcywgdCkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRySW50ZXJwb2xhdGVOUyhmdWxsbmFtZSwgaSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCBpLmNhbGwodGhpcywgdCkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyVHdlZW5OUyhmdWxsbmFtZSwgdmFsdWUpIHtcbiAgdmFyIHQwLCBpMDtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiBhdHRySW50ZXJwb2xhdGVOUyhmdWxsbmFtZSwgaSk7XG4gICAgcmV0dXJuIHQwO1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmZ1bmN0aW9uIGF0dHJUd2VlbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgdDAsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIGF0dHJJbnRlcnBvbGF0ZShuYW1lLCBpKTtcbiAgICByZXR1cm4gdDA7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgdmFyIGtleSA9IFwiYXR0ci5cIiArIG5hbWU7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpO1xuICByZXR1cm4gdGhpcy50d2VlbihrZXksIChmdWxsbmFtZS5sb2NhbCA/IGF0dHJUd2Vlbk5TIDogYXR0clR3ZWVuKShmdWxsbmFtZSwgdmFsdWUpKTtcbn1cbiIsImltcG9ydCB7Z2V0LCBpbml0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBkZWxheUZ1bmN0aW9uKGlkLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgaW5pdCh0aGlzLCBpZCkuZGVsYXkgPSArdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGVsYXlDb25zdGFudChpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbigpIHtcbiAgICBpbml0KHRoaXMsIGlkKS5kZWxheSA9IHZhbHVlO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBkZWxheUZ1bmN0aW9uXG4gICAgICAgICAgOiBkZWxheUNvbnN0YW50KShpZCwgdmFsdWUpKVxuICAgICAgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5kZWxheTtcbn1cbiIsImltcG9ydCB7Z2V0LCBzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGR1cmF0aW9uRnVuY3Rpb24oaWQsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBzZXQodGhpcywgaWQpLmR1cmF0aW9uID0gK3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGR1cmF0aW9uQ29uc3RhbnQoaWQsIHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9ICt2YWx1ZSwgZnVuY3Rpb24oKSB7XG4gICAgc2V0KHRoaXMsIGlkKS5kdXJhdGlvbiA9IHZhbHVlO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIgaWQgPSB0aGlzLl9pZDtcblxuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBkdXJhdGlvbkZ1bmN0aW9uXG4gICAgICAgICAgOiBkdXJhdGlvbkNvbnN0YW50KShpZCwgdmFsdWUpKVxuICAgICAgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5kdXJhdGlvbjtcbn1cbiIsImltcG9ydCB7Z2V0LCBzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGVhc2VDb25zdGFudChpZCwgdmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBzZXQodGhpcywgaWQpLmVhc2UgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKGVhc2VDb25zdGFudChpZCwgdmFsdWUpKVxuICAgICAgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5lYXNlO1xufVxuIiwiaW1wb3J0IHtzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIGVhc2VWYXJ5aW5nKGlkLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh0eXBlb2YgdiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gICAgc2V0KHRoaXMsIGlkKS5lYXNlID0gdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiB0aGlzLmVhY2goZWFzZVZhcnlpbmcodGhpcy5faWQsIHZhbHVlKSk7XG59XG4iLCJpbXBvcnQge21hdGNoZXJ9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgaWYgKHR5cGVvZiBtYXRjaCAhPT0gXCJmdW5jdGlvblwiKSBtYXRjaCA9IG1hdGNoZXIobWF0Y2gpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBtYXRjaC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkge1xuICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMsIHRoaXMuX25hbWUsIHRoaXMuX2lkKTtcbn1cbiIsImltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odHJhbnNpdGlvbikge1xuICBpZiAodHJhbnNpdGlvbi5faWQgIT09IHRoaXMuX2lkKSB0aHJvdyBuZXcgRXJyb3I7XG5cbiAgZm9yICh2YXIgZ3JvdXBzMCA9IHRoaXMuX2dyb3VwcywgZ3JvdXBzMSA9IHRyYW5zaXRpb24uX2dyb3VwcywgbTAgPSBncm91cHMwLmxlbmd0aCwgbTEgPSBncm91cHMxLmxlbmd0aCwgbSA9IE1hdGgubWluKG0wLCBtMSksIG1lcmdlcyA9IG5ldyBBcnJheShtMCksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAwID0gZ3JvdXBzMFtqXSwgZ3JvdXAxID0gZ3JvdXBzMVtqXSwgbiA9IGdyb3VwMC5sZW5ndGgsIG1lcmdlID0gbWVyZ2VzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cDBbaV0gfHwgZ3JvdXAxW2ldKSB7XG4gICAgICAgIG1lcmdlW2ldID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKDsgaiA8IG0wOyArK2opIHtcbiAgICBtZXJnZXNbal0gPSBncm91cHMwW2pdO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKG1lcmdlcywgdGhpcy5fcGFyZW50cywgdGhpcy5fbmFtZSwgdGhpcy5faWQpO1xufVxuIiwiaW1wb3J0IHtnZXQsIHNldCwgaW5pdH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gc3RhcnQobmFtZSkge1xuICByZXR1cm4gKG5hbWUgKyBcIlwiKS50cmltKCkuc3BsaXQoL158XFxzKy8pLmV2ZXJ5KGZ1bmN0aW9uKHQpIHtcbiAgICB2YXIgaSA9IHQuaW5kZXhPZihcIi5cIik7XG4gICAgaWYgKGkgPj0gMCkgdCA9IHQuc2xpY2UoMCwgaSk7XG4gICAgcmV0dXJuICF0IHx8IHQgPT09IFwic3RhcnRcIjtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG9uRnVuY3Rpb24oaWQsIG5hbWUsIGxpc3RlbmVyKSB7XG4gIHZhciBvbjAsIG9uMSwgc2l0ID0gc3RhcnQobmFtZSkgPyBpbml0IDogc2V0O1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2l0KHRoaXMsIGlkKSxcbiAgICAgICAgb24gPSBzY2hlZHVsZS5vbjtcblxuICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgYSBkaXNwYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBub2RlLFxuICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCBkaXNwYXRjaCBhbmQgd2XigJlyZSBkb25lIVxuICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICBpZiAob24gIT09IG9uMCkgKG9uMSA9IChvbjAgPSBvbikuY29weSgpKS5vbihuYW1lLCBsaXN0ZW5lcik7XG5cbiAgICBzY2hlZHVsZS5vbiA9IG9uMTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgbGlzdGVuZXIpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyXG4gICAgICA/IGdldCh0aGlzLm5vZGUoKSwgaWQpLm9uLm9uKG5hbWUpXG4gICAgICA6IHRoaXMuZWFjaChvbkZ1bmN0aW9uKGlkLCBuYW1lLCBsaXN0ZW5lcikpO1xufVxuIiwiZnVuY3Rpb24gcmVtb3ZlRnVuY3Rpb24oaWQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gICAgZm9yICh2YXIgaSBpbiB0aGlzLl9fdHJhbnNpdGlvbikgaWYgKCtpICE9PSBpZCkgcmV0dXJuO1xuICAgIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLm9uKFwiZW5kLnJlbW92ZVwiLCByZW1vdmVGdW5jdGlvbih0aGlzLl9pZCkpO1xufVxuIiwiaW1wb3J0IHtzZWxlY3Rvcn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlLCB7Z2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLFxuICAgICAgaWQgPSB0aGlzLl9pZDtcblxuICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpKSB7XG4gICAgICAgIGlmIChcIl9fZGF0YV9fXCIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187XG4gICAgICAgIHN1Ymdyb3VwW2ldID0gc3Vibm9kZTtcbiAgICAgICAgc2NoZWR1bGUoc3ViZ3JvdXBbaV0sIG5hbWUsIGlkLCBpLCBzdWJncm91cCwgZ2V0KG5vZGUsIGlkKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQpO1xufVxuIiwiaW1wb3J0IHtzZWxlY3RvckFsbH0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHtUcmFuc2l0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlLCB7Z2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3QpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLFxuICAgICAgaWQgPSB0aGlzLl9pZDtcblxuICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBzZWxlY3RvckFsbChzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IFtdLCBwYXJlbnRzID0gW10sIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIGZvciAodmFyIGNoaWxkcmVuID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApLCBjaGlsZCwgaW5oZXJpdCA9IGdldChub2RlLCBpZCksIGsgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBrIDwgbDsgKytrKSB7XG4gICAgICAgICAgaWYgKGNoaWxkID0gY2hpbGRyZW5ba10pIHtcbiAgICAgICAgICAgIHNjaGVkdWxlKGNoaWxkLCBuYW1lLCBpZCwgaywgY2hpbGRyZW4sIGluaGVyaXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdWJncm91cHMucHVzaChjaGlsZHJlbik7XG4gICAgICAgIHBhcmVudHMucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCBwYXJlbnRzLCBuYW1lLCBpZCk7XG59XG4iLCJpbXBvcnQge3NlbGVjdGlvbn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuXG52YXIgU2VsZWN0aW9uID0gc2VsZWN0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvcjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2dyb3VwcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJpbXBvcnQge2ludGVycG9sYXRlVHJhbnNmb3JtQ3NzIGFzIGludGVycG9sYXRlVHJhbnNmb3JtfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcbmltcG9ydCB7c3R5bGV9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7c2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuaW1wb3J0IHt0d2VlblZhbHVlfSBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuaW1wb3J0IGludGVycG9sYXRlIGZyb20gXCIuL2ludGVycG9sYXRlLmpzXCI7XG5cbmZ1bmN0aW9uIHN0eWxlTnVsbChuYW1lLCBpbnRlcnBvbGF0ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gc3R5bGUodGhpcywgbmFtZSksXG4gICAgICAgIHN0cmluZzEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGUodGhpcywgbmFtZSkpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCBzdHJpbmcxMCA9IHN0cmluZzEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZVJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUNvbnN0YW50KG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCIsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHN0eWxlKHRoaXMsIG5hbWUpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUZ1bmN0aW9uKG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxMCxcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gc3R5bGUodGhpcywgbmFtZSksXG4gICAgICAgIHZhbHVlMSA9IHZhbHVlKHRoaXMpLFxuICAgICAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIjtcbiAgICBpZiAodmFsdWUxID09IG51bGwpIHN0cmluZzEgPSB2YWx1ZTEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGUodGhpcywgbmFtZSkpO1xuICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbFxuICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwXG4gICAgICAgIDogKHN0cmluZzEwID0gc3RyaW5nMSwgaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVNYXliZVJlbW92ZShpZCwgbmFtZSkge1xuICB2YXIgb24wLCBvbjEsIGxpc3RlbmVyMCwga2V5ID0gXCJzdHlsZS5cIiArIG5hbWUsIGV2ZW50ID0gXCJlbmQuXCIgKyBrZXksIHJlbW92ZTtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgIG9uID0gc2NoZWR1bGUub24sXG4gICAgICAgIGxpc3RlbmVyID0gc2NoZWR1bGUudmFsdWVba2V5XSA9PSBudWxsID8gcmVtb3ZlIHx8IChyZW1vdmUgPSBzdHlsZVJlbW92ZShuYW1lKSkgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKG9uICE9PSBvbjAgfHwgbGlzdGVuZXIwICE9PSBsaXN0ZW5lcikgKG9uMSA9IChvbjAgPSBvbikuY29weSgpKS5vbihldmVudCwgbGlzdGVuZXIwID0gbGlzdGVuZXIpO1xuXG4gICAgc2NoZWR1bGUub24gPSBvbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICB2YXIgaSA9IChuYW1lICs9IFwiXCIpID09PSBcInRyYW5zZm9ybVwiID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm0gOiBpbnRlcnBvbGF0ZTtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyB0aGlzXG4gICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHlsZU51bGwobmFtZSwgaSkpXG4gICAgICAub24oXCJlbmQuc3R5bGUuXCIgKyBuYW1lLCBzdHlsZVJlbW92ZShuYW1lKSlcbiAgICA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gdGhpc1xuICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVGdW5jdGlvbihuYW1lLCBpLCB0d2VlblZhbHVlKHRoaXMsIFwic3R5bGUuXCIgKyBuYW1lLCB2YWx1ZSkpKVxuICAgICAgLmVhY2goc3R5bGVNYXliZVJlbW92ZSh0aGlzLl9pZCwgbmFtZSkpXG4gICAgOiB0aGlzXG4gICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHlsZUNvbnN0YW50KG5hbWUsIGksIHZhbHVlKSwgcHJpb3JpdHkpXG4gICAgICAub24oXCJlbmQuc3R5bGUuXCIgKyBuYW1lLCBudWxsKTtcbn1cbiIsImZ1bmN0aW9uIHN0eWxlSW50ZXJwb2xhdGUobmFtZSwgaSwgcHJpb3JpdHkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIGkuY2FsbCh0aGlzLCB0KSwgcHJpb3JpdHkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZVR3ZWVuKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICB2YXIgdCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQgPSAoaTAgPSBpKSAmJiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KTtcbiAgICByZXR1cm4gdDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgdmFyIGtleSA9IFwic3R5bGUuXCIgKyAobmFtZSArPSBcIlwiKTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgbnVsbCk7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gdGhpcy50d2VlbihrZXksIHN0eWxlVHdlZW4obmFtZSwgdmFsdWUsIHByaW9yaXR5ID09IG51bGwgPyBcIlwiIDogcHJpb3JpdHkpKTtcbn1cbiIsImltcG9ydCB7dHdlZW5WYWx1ZX0gZnJvbSBcIi4vdHdlZW4uanNcIjtcblxuZnVuY3Rpb24gdGV4dENvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRleHRGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlMSA9IHZhbHVlKHRoaXMpO1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTEgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZTE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiB0aGlzLnR3ZWVuKFwidGV4dFwiLCB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyB0ZXh0RnVuY3Rpb24odHdlZW5WYWx1ZSh0aGlzLCBcInRleHRcIiwgdmFsdWUpKVxuICAgICAgOiB0ZXh0Q29uc3RhbnQodmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZSArIFwiXCIpKTtcbn1cbiIsImZ1bmN0aW9uIHRleHRJbnRlcnBvbGF0ZShpKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IGkuY2FsbCh0aGlzLCB0KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGV4dFR3ZWVuKHZhbHVlKSB7XG4gIHZhciB0MCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgdGV4dEludGVycG9sYXRlKGkpO1xuICAgIHJldHVybiB0MDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICB2YXIga2V5ID0gXCJ0ZXh0XCI7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMSkgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCB0ZXh0VHdlZW4odmFsdWUpKTtcbn1cbiIsImltcG9ydCB7VHJhbnNpdGlvbiwgbmV3SWR9IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgc2NoZWR1bGUsIHtnZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgbmFtZSA9IHRoaXMuX25hbWUsXG4gICAgICBpZDAgPSB0aGlzLl9pZCxcbiAgICAgIGlkMSA9IG5ld0lkKCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgdmFyIGluaGVyaXQgPSBnZXQobm9kZSwgaWQwKTtcbiAgICAgICAgc2NoZWR1bGUobm9kZSwgbmFtZSwgaWQxLCBpLCBncm91cCwge1xuICAgICAgICAgIHRpbWU6IGluaGVyaXQudGltZSArIGluaGVyaXQuZGVsYXkgKyBpbmhlcml0LmR1cmF0aW9uLFxuICAgICAgICAgIGRlbGF5OiAwLFxuICAgICAgICAgIGR1cmF0aW9uOiBpbmhlcml0LmR1cmF0aW9uLFxuICAgICAgICAgIGVhc2U6IGluaGVyaXQuZWFzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZDEpO1xufVxuIiwiaW1wb3J0IHtzZXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgb24wLCBvbjEsIHRoYXQgPSB0aGlzLCBpZCA9IHRoYXQuX2lkLCBzaXplID0gdGhhdC5zaXplKCk7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgY2FuY2VsID0ge3ZhbHVlOiByZWplY3R9LFxuICAgICAgICBlbmQgPSB7dmFsdWU6IGZ1bmN0aW9uKCkgeyBpZiAoLS1zaXplID09PSAwKSByZXNvbHZlKCk7IH19O1xuXG4gICAgdGhhdC5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSxcbiAgICAgICAgICBvbiA9IHNjaGVkdWxlLm9uO1xuXG4gICAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCBkaXNwYXRjaCBhbmQgd2XigJlyZSBkb25lIVxuICAgICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgICAgaWYgKG9uICE9PSBvbjApIHtcbiAgICAgICAgb24xID0gKG9uMCA9IG9uKS5jb3B5KCk7XG4gICAgICAgIG9uMS5fLmNhbmNlbC5wdXNoKGNhbmNlbCk7XG4gICAgICAgIG9uMS5fLmludGVycnVwdC5wdXNoKGNhbmNlbCk7XG4gICAgICAgIG9uMS5fLmVuZC5wdXNoKGVuZCk7XG4gICAgICB9XG5cbiAgICAgIHNjaGVkdWxlLm9uID0gb24xO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIHNlbGVjdGlvbiB3YXMgZW1wdHksIHJlc29sdmUgZW5kIGltbWVkaWF0ZWx5XG4gICAgaWYgKHNpemUgPT09IDApIHJlc29sdmUoKTtcbiAgfSk7XG59XG4iLCJpbXBvcnQge3NlbGVjdGlvbn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHRyYW5zaXRpb25fYXR0ciBmcm9tIFwiLi9hdHRyLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9hdHRyVHdlZW4gZnJvbSBcIi4vYXR0clR3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9kZWxheSBmcm9tIFwiLi9kZWxheS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZHVyYXRpb24gZnJvbSBcIi4vZHVyYXRpb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2Vhc2UgZnJvbSBcIi4vZWFzZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZWFzZVZhcnlpbmcgZnJvbSBcIi4vZWFzZVZhcnlpbmcuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2ZpbHRlciBmcm9tIFwiLi9maWx0ZXIuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX21lcmdlIGZyb20gXCIuL21lcmdlLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9vbiBmcm9tIFwiLi9vbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fcmVtb3ZlIGZyb20gXCIuL3JlbW92ZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0IGZyb20gXCIuL3NlbGVjdC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0QWxsIGZyb20gXCIuL3NlbGVjdEFsbC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc2VsZWN0aW9uIGZyb20gXCIuL3NlbGVjdGlvbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fc3R5bGUgZnJvbSBcIi4vc3R5bGUuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3N0eWxlVHdlZW4gZnJvbSBcIi4vc3R5bGVUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdGV4dCBmcm9tIFwiLi90ZXh0LmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90ZXh0VHdlZW4gZnJvbSBcIi4vdGV4dFR3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90cmFuc2l0aW9uIGZyb20gXCIuL3RyYW5zaXRpb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3R3ZWVuIGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9lbmQgZnJvbSBcIi4vZW5kLmpzXCI7XG5cbnZhciBpZCA9IDA7XG5cbmV4cG9ydCBmdW5jdGlvbiBUcmFuc2l0aW9uKGdyb3VwcywgcGFyZW50cywgbmFtZSwgaWQpIHtcbiAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzO1xuICB0aGlzLl9wYXJlbnRzID0gcGFyZW50cztcbiAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gIHRoaXMuX2lkID0gaWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zaXRpb24obmFtZSkge1xuICByZXR1cm4gc2VsZWN0aW9uKCkudHJhbnNpdGlvbihuYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5ld0lkKCkge1xuICByZXR1cm4gKytpZDtcbn1cblxudmFyIHNlbGVjdGlvbl9wcm90b3R5cGUgPSBzZWxlY3Rpb24ucHJvdG90eXBlO1xuXG5UcmFuc2l0aW9uLnByb3RvdHlwZSA9IHRyYW5zaXRpb24ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVHJhbnNpdGlvbixcbiAgc2VsZWN0OiB0cmFuc2l0aW9uX3NlbGVjdCxcbiAgc2VsZWN0QWxsOiB0cmFuc2l0aW9uX3NlbGVjdEFsbCxcbiAgc2VsZWN0Q2hpbGQ6IHNlbGVjdGlvbl9wcm90b3R5cGUuc2VsZWN0Q2hpbGQsXG4gIHNlbGVjdENoaWxkcmVuOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNlbGVjdENoaWxkcmVuLFxuICBmaWx0ZXI6IHRyYW5zaXRpb25fZmlsdGVyLFxuICBtZXJnZTogdHJhbnNpdGlvbl9tZXJnZSxcbiAgc2VsZWN0aW9uOiB0cmFuc2l0aW9uX3NlbGVjdGlvbixcbiAgdHJhbnNpdGlvbjogdHJhbnNpdGlvbl90cmFuc2l0aW9uLFxuICBjYWxsOiBzZWxlY3Rpb25fcHJvdG90eXBlLmNhbGwsXG4gIG5vZGVzOiBzZWxlY3Rpb25fcHJvdG90eXBlLm5vZGVzLFxuICBub2RlOiBzZWxlY3Rpb25fcHJvdG90eXBlLm5vZGUsXG4gIHNpemU6IHNlbGVjdGlvbl9wcm90b3R5cGUuc2l6ZSxcbiAgZW1wdHk6IHNlbGVjdGlvbl9wcm90b3R5cGUuZW1wdHksXG4gIGVhY2g6IHNlbGVjdGlvbl9wcm90b3R5cGUuZWFjaCxcbiAgb246IHRyYW5zaXRpb25fb24sXG4gIGF0dHI6IHRyYW5zaXRpb25fYXR0cixcbiAgYXR0clR3ZWVuOiB0cmFuc2l0aW9uX2F0dHJUd2VlbixcbiAgc3R5bGU6IHRyYW5zaXRpb25fc3R5bGUsXG4gIHN0eWxlVHdlZW46IHRyYW5zaXRpb25fc3R5bGVUd2VlbixcbiAgdGV4dDogdHJhbnNpdGlvbl90ZXh0LFxuICB0ZXh0VHdlZW46IHRyYW5zaXRpb25fdGV4dFR3ZWVuLFxuICByZW1vdmU6IHRyYW5zaXRpb25fcmVtb3ZlLFxuICB0d2VlbjogdHJhbnNpdGlvbl90d2VlbixcbiAgZGVsYXk6IHRyYW5zaXRpb25fZGVsYXksXG4gIGR1cmF0aW9uOiB0cmFuc2l0aW9uX2R1cmF0aW9uLFxuICBlYXNlOiB0cmFuc2l0aW9uX2Vhc2UsXG4gIGVhc2VWYXJ5aW5nOiB0cmFuc2l0aW9uX2Vhc2VWYXJ5aW5nLFxuICBlbmQ6IHRyYW5zaXRpb25fZW5kLFxuICBbU3ltYm9sLml0ZXJhdG9yXTogc2VsZWN0aW9uX3Byb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdXG59O1xuIiwiZXhwb3J0IGZ1bmN0aW9uIGN1YmljSW4odCkge1xuICByZXR1cm4gdCAqIHQgKiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3ViaWNPdXQodCkge1xuICByZXR1cm4gLS10ICogdCAqIHQgKyAxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3ViaWNJbk91dCh0KSB7XG4gIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IHQgKiB0ICogdCA6ICh0IC09IDIpICogdCAqIHQgKyAyKSAvIDI7XG59XG4iLCJpbXBvcnQge1RyYW5zaXRpb24sIG5ld0lkfSBmcm9tIFwiLi4vdHJhbnNpdGlvbi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlIGZyb20gXCIuLi90cmFuc2l0aW9uL3NjaGVkdWxlLmpzXCI7XG5pbXBvcnQge2Vhc2VDdWJpY0luT3V0fSBmcm9tIFwiZDMtZWFzZVwiO1xuaW1wb3J0IHtub3d9IGZyb20gXCJkMy10aW1lclwiO1xuXG52YXIgZGVmYXVsdFRpbWluZyA9IHtcbiAgdGltZTogbnVsbCwgLy8gU2V0IG9uIHVzZS5cbiAgZGVsYXk6IDAsXG4gIGR1cmF0aW9uOiAyNTAsXG4gIGVhc2U6IGVhc2VDdWJpY0luT3V0XG59O1xuXG5mdW5jdGlvbiBpbmhlcml0KG5vZGUsIGlkKSB7XG4gIHZhciB0aW1pbmc7XG4gIHdoaWxlICghKHRpbWluZyA9IG5vZGUuX190cmFuc2l0aW9uKSB8fCAhKHRpbWluZyA9IHRpbWluZ1tpZF0pKSB7XG4gICAgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdHJhbnNpdGlvbiAke2lkfSBub3QgZm91bmRgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRpbWluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgaWQsXG4gICAgICB0aW1pbmc7XG5cbiAgaWYgKG5hbWUgaW5zdGFuY2VvZiBUcmFuc2l0aW9uKSB7XG4gICAgaWQgPSBuYW1lLl9pZCwgbmFtZSA9IG5hbWUuX25hbWU7XG4gIH0gZWxzZSB7XG4gICAgaWQgPSBuZXdJZCgpLCAodGltaW5nID0gZGVmYXVsdFRpbWluZykudGltZSA9IG5vdygpLCBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyBcIlwiO1xuICB9XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgc2NoZWR1bGUobm9kZSwgbmFtZSwgaWQsIGksIGdyb3VwLCB0aW1pbmcgfHwgaW5oZXJpdChub2RlLCBpZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTtcbn1cbiIsImltcG9ydCB7c2VsZWN0aW9ufSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2ludGVycnVwdCBmcm9tIFwiLi9pbnRlcnJ1cHQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fdHJhbnNpdGlvbiBmcm9tIFwiLi90cmFuc2l0aW9uLmpzXCI7XG5cbnNlbGVjdGlvbi5wcm90b3R5cGUuaW50ZXJydXB0ID0gc2VsZWN0aW9uX2ludGVycnVwdDtcbnNlbGVjdGlvbi5wcm90b3R5cGUudHJhbnNpdGlvbiA9IHNlbGVjdGlvbl90cmFuc2l0aW9uO1xuIiwiZXhwb3J0IGZ1bmN0aW9uIFRyYW5zZm9ybShrLCB4LCB5KSB7XG4gIHRoaXMuayA9IGs7XG4gIHRoaXMueCA9IHg7XG4gIHRoaXMueSA9IHk7XG59XG5cblRyYW5zZm9ybS5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBUcmFuc2Zvcm0sXG4gIHNjYWxlOiBmdW5jdGlvbihrKSB7XG4gICAgcmV0dXJuIGsgPT09IDEgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmsgKiBrLCB0aGlzLngsIHRoaXMueSk7XG4gIH0sXG4gIHRyYW5zbGF0ZTogZnVuY3Rpb24oeCwgeSkge1xuICAgIHJldHVybiB4ID09PSAwICYgeSA9PT0gMCA/IHRoaXMgOiBuZXcgVHJhbnNmb3JtKHRoaXMuaywgdGhpcy54ICsgdGhpcy5rICogeCwgdGhpcy55ICsgdGhpcy5rICogeSk7XG4gIH0sXG4gIGFwcGx5OiBmdW5jdGlvbihwb2ludCkge1xuICAgIHJldHVybiBbcG9pbnRbMF0gKiB0aGlzLmsgKyB0aGlzLngsIHBvaW50WzFdICogdGhpcy5rICsgdGhpcy55XTtcbiAgfSxcbiAgYXBwbHlYOiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIHggKiB0aGlzLmsgKyB0aGlzLng7XG4gIH0sXG4gIGFwcGx5WTogZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiB5ICogdGhpcy5rICsgdGhpcy55O1xuICB9LFxuICBpbnZlcnQ6IGZ1bmN0aW9uKGxvY2F0aW9uKSB7XG4gICAgcmV0dXJuIFsobG9jYXRpb25bMF0gLSB0aGlzLngpIC8gdGhpcy5rLCAobG9jYXRpb25bMV0gLSB0aGlzLnkpIC8gdGhpcy5rXTtcbiAgfSxcbiAgaW52ZXJ0WDogZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiAoeCAtIHRoaXMueCkgLyB0aGlzLms7XG4gIH0sXG4gIGludmVydFk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4gKHkgLSB0aGlzLnkpIC8gdGhpcy5rO1xuICB9LFxuICByZXNjYWxlWDogZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiB4LmNvcHkoKS5kb21haW4oeC5yYW5nZSgpLm1hcCh0aGlzLmludmVydFgsIHRoaXMpLm1hcCh4LmludmVydCwgeCkpO1xuICB9LFxuICByZXNjYWxlWTogZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiB5LmNvcHkoKS5kb21haW4oeS5yYW5nZSgpLm1hcCh0aGlzLmludmVydFksIHRoaXMpLm1hcCh5LmludmVydCwgeSkpO1xuICB9LFxuICB0b1N0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwidHJhbnNsYXRlKFwiICsgdGhpcy54ICsgXCIsXCIgKyB0aGlzLnkgKyBcIikgc2NhbGUoXCIgKyB0aGlzLmsgKyBcIilcIjtcbiAgfVxufTtcblxuZXhwb3J0IHZhciBpZGVudGl0eSA9IG5ldyBUcmFuc2Zvcm0oMSwgMCwgMCk7XG5cbnRyYW5zZm9ybS5wcm90b3R5cGUgPSBUcmFuc2Zvcm0ucHJvdG90eXBlO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmFuc2Zvcm0obm9kZSkge1xuICB3aGlsZSAoIW5vZGUuX196b29tKSBpZiAoIShub2RlID0gbm9kZS5wYXJlbnROb2RlKSkgcmV0dXJuIGlkZW50aXR5O1xuICByZXR1cm4gbm9kZS5fX3pvb207XG59XG4iLCJcbi8qXG4gIEhURE1hdGggU3RhdGljIENsYXNzIC0gTm90IGludGVuZGVkIGZvciBpbnN0YW50aWF0aW9uIVxuXG4gIE1vZGVsIHBhcmFtZXRlcnM6XG4gICAgayA9IGRpc2NvdW50IGZhY3RvciAoMCwgSW5maW5pdHkpXG5cbiAgQmVoYXZpb3JhbCB2YXJpYWJsZXM6XG4gICAgQSA9IGFtb3VudFxuICAgIEQgPSBkZWxheVxuICAgIFYgPSBzdWJqZWN0aXZlIHZhbHVlXG5cbiAgRXF1YXRpb25zOlxuICAgIFYgPSBBIC8gKDEgKyBrRClcbiAgICBrID0gKEEgLSBWKSAvIChWRClcbiovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIVERNYXRoIHtcbiAgc3RhdGljIGsgPSB7XG4gICAgREVGQVVMVDogMC4wNSxcbiAgICBNSU46IDAsXG4gICAgTUFYOiAxMDAsXG4gICAgU1RFUDogMC4wMDEsXG4gICAgSlVNUDogMC4wMSxcbiAgfTtcblxuICBzdGF0aWMgYWRrMnYoYSwgZCwgaykge1xuICAgIHJldHVybiBhIC8gKDEgKyBrICogZCk7XG4gIH1cblxuICBzdGF0aWMgYWR2MmsoYSwgZCwgdikge1xuICAgIHJldHVybiAoYSAtIHYpIC8gKHYgKiBkKTtcbiAgfVxufVxuIiwiXG4vLyBJbnRlcm5hbCBkZXBlbmRlbmNpZXNcbmltcG9ydCBIVERNYXRoIGZyb20gJy4vaHRkLW1hdGgnO1xuXG5leHBvcnQgZGVmYXVsdCBIVERNYXRoO1xuIiwiLyogZXNsaW50IG5vLXJlc3RyaWN0ZWQtZ2xvYmFsczogW1wib2ZmXCIsIFwic2VsZlwiXSAqL1xuXG4vLyBOZWVkZWQgZm9yIGQzIGluIFdlYldvcmtlciFcbmltcG9ydCAncmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lJztcblxuaW1wb3J0ICogYXMgQmF5ZXNEaXN0cmlidXRpb25zIGZyb20gJ2JheWVzLmpzL2Rpc3RyaWJ1dGlvbnMnO1xuaW1wb3J0ICogYXMgQmF5ZXNNY21jIGZyb20gJ2JheWVzLmpzL21jbWMnO1xuaW1wb3J0ICogYXMgZDMgZnJvbSAnZDMnO1xuaW1wb3J0IEhURE1hdGggZnJvbSAnQGRlY2lkYWJsZXMvZGlzY291bnRhYmxlLW1hdGgnO1xuXG5zZWxmLm9ubWVzc2FnZSA9IChldmVudCkgPT4ge1xuICBjb25zdCBwYXJhbXMgPSB7XG4gICAgazoge3R5cGU6ICdyZWFsJywgbG93ZXI6IEhURE1hdGguay5NSU4sIHVwcGVyOiBIVERNYXRoLmsuTUFYfSxcbiAgICBsdWNlOiB7dHlwZTogJ3JlYWwnLCBsb3dlcjogMCwgdXBwZXI6IDEwMH0sXG4gIH07XG5cbiAgY29uc3QgbG9nUG9zdCA9IChzdGF0ZSwgZGF0YSkgPT4ge1xuICAgIGxldCBscCA9IDA7XG5cbiAgICAvLyBQcmlvcnNcbiAgICBjb25zdCBrTWVhbiA9IDI7XG4gICAgY29uc3Qga1NoYXBlID0gMztcbiAgICBscCArPSBCYXllc0Rpc3RyaWJ1dGlvbnMuZ2FtbWEoXG4gICAgICBzdGF0ZS5rLFxuICAgICAga1NoYXBlLFxuICAgICAga1NoYXBlIC8ga01lYW4sXG4gICAgKTtcbiAgICAvLyBscCArPSBCYXllc0Rpc3RyaWJ1dGlvbnMudW5pZihzdGF0ZS5rLCAwLCAxMDApO1xuXG4gICAgY29uc3QgbHVjZU1lYW4gPSAyO1xuICAgIGNvbnN0IGx1Y2VTaGFwZSA9IDM7XG4gICAgbHAgKz0gQmF5ZXNEaXN0cmlidXRpb25zLmdhbW1hKFxuICAgICAgc3RhdGUubHVjZSxcbiAgICAgIGx1Y2VTaGFwZSxcbiAgICAgIGx1Y2VTaGFwZSAvIGx1Y2VNZWFuLFxuICAgICk7XG4gICAgLy8gbHAgKz0gQmF5ZXNEaXN0cmlidXRpb25zLnVuaWYoc3RhdGUubHVjZSwgMCwgMTAwKTtcblxuICAgIC8vIExpa2VsaWhvb2RcbiAgICBkYXRhLmZvckVhY2goKGNob2ljZSkgPT4ge1xuICAgICAgLy8gVmFsdWVzXG4gICAgICBjb25zdCB2cyA9IEhURE1hdGguYWRrMnYoY2hvaWNlLmFzLCBjaG9pY2UuZHMsIHN0YXRlLmspO1xuICAgICAgY29uc3QgdmwgPSBIVERNYXRoLmFkazJ2KGNob2ljZS5hbCwgY2hvaWNlLmRsLCBzdGF0ZS5rKTtcblxuICAgICAgLy8gQ2hvaWNlIG9mIHNvb25lciBvciBsYXRlciBpcyBzYW1wbGVkIGZyb20gYSBCZXJub3VsbGkgZGlzdHJpYnV0aW9uXG4gICAgICAvLyBMdWNlIGNob2ljZSBydWxlIGlzIHVzZWQgdG8gY29tcHV0ZSBwcm9iYWJpbGl0eSBvZiB3YWl0aW5nISAoMCA9IHNvb25lciwgMSA9IGxhdGVyKVxuICAgICAgY29uc3QgYmludmFsID0gMSAvICgxICsgTWF0aC5leHAoc3RhdGUubHVjZSAqICh2cyAtIHZsKSkpO1xuXG4gICAgICAvLyBBY3R1YWwgcmVzcG9uc2VcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gKGNob2ljZS5yZXNwb25zZSA9PT0gJ2ZpcnN0JykgPyAwIDogMTtcblxuICAgICAgbHAgKz0gQmF5ZXNEaXN0cmlidXRpb25zLmJlcm4ocmVzcG9uc2UsIGJpbnZhbCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbHA7XG4gIH07XG5cbiAgLy8gSW5pdGlhbGl6aW5nIHRoZSBzYW1wbGVyXG4gIGNvbnN0IHNhbXBsZXIgPSBuZXcgQmF5ZXNNY21jLkFtd2dTYW1wbGVyKHBhcmFtcywgbG9nUG9zdCwgZXZlbnQuZGF0YSk7XG4gIC8vIEJ1cm5pbmcgc29tZSBzYW1wbGVzIHRvIHRoZSBNQ01DIGdvZHMgYW5kIHNhbXBsaW5nIDUwMDAgZHJhd3NcbiAgc2FtcGxlci5idXJuKDEwMDApO1xuICBjb25zdCBzYW1wbGVzID0gc2FtcGxlci5zYW1wbGUoNTAwMCk7XG5cbiAgLy8gRXh0cmFjdCBzdW1tYXJ5IHN0YXRzXG4gIGNvbnN0IHJlc3VsdHMgPSB7XG4gICAgazogZDMubWVkaWFuKHNhbXBsZXMuayksXG4gICAgbHVjZTogZDMubWVkaWFuKHNhbXBsZXMubHVjZSksXG4gIH07XG5cbiAgc2VsZi5wb3N0TWVzc2FnZSh7cmVzdWx0czogcmVzdWx0cywgc2FtcGxlczogc2FtcGxlc30pO1xufTtcbiJdLCJuYW1lcyI6WyJyb290IiwiZmFjdG9yeSIsIm1vZHVsZSIsImV4cG9ydHMiLCJsZCIsInRoaXMiLCJsZ2FtbWEiLCJ4IiwiaiIsImNvZiIsInNlciIsInh4IiwieSIsInRtcCIsImxvZyIsImxmYWN0b3JpYWwiLCJuIiwiTmFOIiwibGNob29zZSIsImsiLCJsYmV0YSIsImEiLCJiIiwiTWF0aCIsImV4cCIsImFicyIsInBvdyIsInNxcnQiLCJwaSIsIlBJIiwiYmV0YSIsInNoYXBlMSIsInNoYXBlMiIsIkluZmluaXR5IiwiY2F1Y2h5IiwibG9jYXRpb24iLCJzY2FsZSIsIm5vcm0iLCJtZWFuIiwic2QiLCJiaXZhcm5vcm0iLCJjb3JyIiwieiIsIm5vcm1hbGl6aW5nX2ZhY3RvciIsImJpdmFyX2xvZ19kZW5zIiwibGFwbGFjZSIsImRleHAiLCJnYW1tYSIsInNoYXBlIiwicmF0ZSIsImludmdhbW1hIiwibG5vcm0iLCJtZWFubG9nIiwic2Rsb2ciLCJwYXJldG8iLCJ0IiwiZGYiLCJ3ZWlidWxsIiwidG1wMSIsInRtcDIiLCJsb2dpcyIsImUiLCJmIiwiZGlyaWNobGV0IiwiYWxwaGEiLCJzdW1fYWxwaGEiLCJzdW1fbGdhbW1hX2FscGhhIiwic3VtX2FscGhhX3N1Yl8xX2xvZ194IiwibGVuZ3RoIiwiaSIsInVuaWYiLCJtaW4iLCJtYXgiLCJiZXJuIiwicHJvYiIsImNhdCIsInByb2JzIiwiYmlub20iLCJzaXplIiwibmJpbm9tIiwiaHlwZXIiLCJtIiwicG9pcyIsImxhbWJkYSIsIm1jbWMiLCJydW5pZiIsInJhbmRvbSIsInJ1bmlmX2Rpc2NyZXRlIiwiZmxvb3IiLCJybm9ybSIsInUiLCJ2IiwicSIsImRlZXBfY2xvbmUiLCJzcmMiLCJtaXhpbiIsImRlc3QiLCJzb3VyY2UiLCJjb3B5RnVuYyIsIm5hbWUiLCJzIiwiZW1wdHkiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJ0b1N0cmluZyIsImNhbGwiLCJub2RlVHlwZSIsImNsb25lTm9kZSIsIkRhdGUiLCJnZXRUaW1lIiwiUmVnRXhwIiwiciIsImwiLCJBcnJheSIsInB1c2giLCJjb25zdHJ1Y3RvciIsImNsb25lX3BhcmFtX2RyYXciLCJpc0FycmF5IiwieF9jb3B5Iiwic2xpY2UiLCJpc19udW1iZXIiLCJvYmplY3QiLCJOdW1iZXIiLCJjcmVhdGVfYXJyYXkiLCJkaW0iLCJpbml0IiwiYXJyIiwiYXJyYXlfZGltIiwiY29uY2F0IiwiYXJyYXlfZXF1YWwiLCJhMSIsImEyIiwibmVzdGVkX2FycmF5X2FwcGx5IiwiZnVuIiwicmVzdWx0Iiwic2h1ZmZsZV9hcnJheSIsImFycmF5IiwidGVtcCIsIm5lc3RlZF9hcnJheV9yYW5kb21fYXBwbHkiLCJsZW4iLCJhcnJheV9pcyIsImFycmF5X2kiLCJnZXRfb3B0aW9uIiwib3B0aW9uX25hbWUiLCJvcHRpb25zIiwiZGVmYXVsX3ZhbHVlIiwiaGFzT3duUHJvcGVydHkiLCJ1bmRlZmluZWQiLCJnZXRfbXVsdGlkaW1fb3B0aW9uIiwidmFsdWUiLCJwYXJhbV9pbml0X2ZpeGVkIiwidHlwZSIsImxvd2VyIiwidXBwZXIiLCJyb3VuZCIsImNvbXBsZXRlX3BhcmFtcyIsInBhcmFtc190b19jb21wbGV0ZSIsInBhcmFtX2luaXQiLCJwYXJhbXMiLCJwYXJhbV9uYW1lIiwicGFyYW0iLCJTdGVwcGVyIiwic3RhdGUiLCJsb2dfcG9zdCIsInN0ZXAiLCJzdGFydF9hZGFwdGF0aW9uIiwic3RvcF9hZGFwdGF0aW9uIiwiaW5mbyIsIk9uZWRpbU1ldHJvcG9saXNTdGVwcGVyIiwiZ2VuZXJhdGVfcHJvcG9zYWwiLCJwYXJhbV9uYW1lcyIsImtleXMiLCJwcm9wX2xvZ19zY2FsZSIsImJhdGNoX3NpemUiLCJtYXhfYWRhcHRhdGlvbiIsImluaXRpYWxfYWRhcHRhdGlvbiIsInRhcmdldF9hY2NlcHRfcmF0ZSIsImlzX2FkYXB0aW5nIiwiYWNjZXB0YW5jZV9jb3VudCIsImJhdGNoX2NvdW50IiwiaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiIsImNyZWF0ZSIsInBhcmFtX3N0YXRlIiwicGFyYW1fcHJvcG9zYWwiLCJjdXJyX2xvZ19kZW5zIiwicHJvcF9sb2dfZGVucyIsImFjY2VwdF9wcm9iIiwibG9nX3NkX2FkanVzdG1lbnQiLCJub3JtYWxfcHJvcG9zYWwiLCJSZWFsTWV0cm9wb2xpc1N0ZXBwZXIiLCJkaXNjcmV0ZV9ub3JtYWxfcHJvcG9zYWwiLCJJbnRNZXRyb3BvbGlzU3RlcHBlciIsIk11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIiLCJTdWJTdGVwcGVyIiwiY3JlYXRlX3N1YnN0ZXBwZXJzIiwic3Vic3RhdGUiLCJzdWJzdGVwcGVycyIsInN1Ym9wdGlvbnMiLCJzdWJwYXJhbSIsInN1YnN0ZXBwZXIiLCJNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciIsIk11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIiLCJCaW5hcnlTdGVwcGVyIiwiemVyb19sb2dfZGVucyIsIm9uZV9sb2dfZGVucyIsIm1heF9sb2dfZGVucyIsInplcm9fcHJvYiIsIkJpbmFyeUNvbXBvbmVudFN0ZXBwZXIiLCJzdWJwYXJhbXMiLCJBbXdnU3RlcHBlciIsIlNlbGVjdFN0ZXBwZXIiLCJwYXJhbV9vYmplY3Rfd3JhcCIsInBhcmFtX29wdGlvbnMiLCJTYW1wbGVyIiwiZGF0YSIsInBhcmFtX2luaXRfZnVuIiwidGhpbm5pbmdfaW50ZXJ2YWwiLCJwYXJhbXNfdG9fbW9uaXRvciIsInRoaW4iLCJtb25pdG9yIiwic3RlcHBlcnMiLCJjcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSIsInNhbXBsZSIsIm5faXRlcmF0aW9ucyIsIm1vbml0b3JlZF9wYXJhbXMiLCJjdXJyX3NhbXBsZSIsImJ1cm4iLCJBbXdnU2FtcGxlciIsImFzY2VuZGluZyIsIm51bWJlcnMiLCJ2YWx1ZXMiLCJ2YWx1ZW9mIiwiY29tcGFyZURlZmluZWQiLCJjb21wYXJlIiwiYXNjZW5kaW5nRGVmaW5lZCIsIlR5cGVFcnJvciIsInF1aWNrc2VsZWN0IiwibGVmdCIsInJpZ2h0IiwibmV3TGVmdCIsIm5ld1JpZ2h0Iiwic3dhcCIsInF1YW50aWxlIiwicCIsIkZsb2F0NjRBcnJheSIsImZyb20iLCJpc05hTiIsImkwIiwidmFsdWUwIiwic3ViYXJyYXkiLCJ2YWx1ZTEiLCJtZWRpYW4iLCJub29wIiwiZGlzcGF0Y2giLCJhcmd1bWVudHMiLCJfIiwidGVzdCIsIkVycm9yIiwiRGlzcGF0Y2giLCJwYXJzZVR5cGVuYW1lcyIsInR5cGVuYW1lcyIsInR5cGVzIiwidHJpbSIsInNwbGl0IiwibWFwIiwiaW5kZXhPZiIsIm9uIiwidHlwZW5hbWUiLCJjYWxsYmFjayIsIlQiLCJnZXQiLCJzZXQiLCJjb3B5IiwidGhhdCIsImFyZ3MiLCJhcHBseSIsImMiLCJ4aHRtbCIsInN2ZyIsInhsaW5rIiwieG1sIiwieG1sbnMiLCJwcmVmaXgiLCJuYW1lc3BhY2VzIiwic3BhY2UiLCJsb2NhbCIsImNyZWF0b3JJbmhlcml0IiwiZG9jdW1lbnQiLCJvd25lckRvY3VtZW50IiwidXJpIiwibmFtZXNwYWNlVVJJIiwiZG9jdW1lbnRFbGVtZW50IiwiY3JlYXRlRWxlbWVudCIsImNyZWF0ZUVsZW1lbnROUyIsImNyZWF0b3JGaXhlZCIsImZ1bGxuYW1lIiwibmFtZXNwYWNlIiwibm9uZSIsInNlbGVjdG9yIiwicXVlcnlTZWxlY3RvciIsInNlbGVjdCIsImdyb3VwcyIsIl9ncm91cHMiLCJzdWJncm91cHMiLCJncm91cCIsInN1Ymdyb3VwIiwibm9kZSIsInN1Ym5vZGUiLCJfX2RhdGFfXyIsIlNlbGVjdGlvbiIsIl9wYXJlbnRzIiwicXVlcnlTZWxlY3RvckFsbCIsImFycmF5QWxsIiwic2VsZWN0b3JBbGwiLCJwYXJlbnRzIiwibWF0Y2hlcyIsImNoaWxkTWF0Y2hlciIsImZpbmQiLCJjaGlsZEZpbmQiLCJtYXRjaCIsImNoaWxkcmVuIiwiY2hpbGRGaXJzdCIsImZpcnN0RWxlbWVudENoaWxkIiwiZmlsdGVyIiwiY2hpbGRyZW5GaWx0ZXIiLCJzZWxlY3RBbGwiLCJtYXRjaGVyIiwidXBkYXRlIiwiX2VudGVyIiwic3BhcnNlIiwiRW50ZXJOb2RlIiwicGFyZW50IiwiZGF0dW0iLCJfbmV4dCIsIl9wYXJlbnQiLCJhcHBlbmRDaGlsZCIsImNoaWxkIiwiaW5zZXJ0QmVmb3JlIiwibmV4dCIsImJpbmRJbmRleCIsImVudGVyIiwiZXhpdCIsImdyb3VwTGVuZ3RoIiwiZGF0YUxlbmd0aCIsImJpbmRLZXkiLCJrZXkiLCJub2RlQnlLZXlWYWx1ZSIsIk1hcCIsImtleVZhbHVlcyIsImtleVZhbHVlIiwiaGFzIiwiZGVsZXRlIiwiYmluZCIsImNvbnN0YW50IiwiYXJyYXlsaWtlIiwiZW50ZXJHcm91cCIsInVwZGF0ZUdyb3VwIiwiZXhpdEdyb3VwIiwiaTEiLCJwcmV2aW91cyIsIl9leGl0Iiwib25lbnRlciIsIm9udXBkYXRlIiwib25leGl0Iiwic2VsZWN0aW9uIiwiYXBwZW5kIiwicmVtb3ZlIiwibWVyZ2UiLCJvcmRlciIsImNvbnRleHQiLCJncm91cHMwIiwiZ3JvdXBzMSIsIm0wIiwibTEiLCJtZXJnZXMiLCJncm91cDAiLCJncm91cDEiLCJjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiIsInBhcmVudE5vZGUiLCJjb21wYXJlTm9kZSIsInNvcnRncm91cHMiLCJzb3J0Z3JvdXAiLCJzb3J0IiwiYXR0clJlbW92ZSIsInJlbW92ZUF0dHJpYnV0ZSIsImF0dHJSZW1vdmVOUyIsInJlbW92ZUF0dHJpYnV0ZU5TIiwiYXR0ckNvbnN0YW50Iiwic2V0QXR0cmlidXRlIiwiYXR0ckNvbnN0YW50TlMiLCJzZXRBdHRyaWJ1dGVOUyIsImF0dHJGdW5jdGlvbiIsImF0dHJGdW5jdGlvbk5TIiwiZ2V0QXR0cmlidXRlTlMiLCJnZXRBdHRyaWJ1dGUiLCJlYWNoIiwiZGVmYXVsdFZpZXciLCJzdHlsZVJlbW92ZSIsInN0eWxlIiwicmVtb3ZlUHJvcGVydHkiLCJzdHlsZUNvbnN0YW50IiwicHJpb3JpdHkiLCJzZXRQcm9wZXJ0eSIsInN0eWxlRnVuY3Rpb24iLCJzdHlsZVZhbHVlIiwiZ2V0UHJvcGVydHlWYWx1ZSIsImdldENvbXB1dGVkU3R5bGUiLCJwcm9wZXJ0eVJlbW92ZSIsInByb3BlcnR5Q29uc3RhbnQiLCJwcm9wZXJ0eUZ1bmN0aW9uIiwiY2xhc3NBcnJheSIsInN0cmluZyIsImNsYXNzTGlzdCIsIkNsYXNzTGlzdCIsIl9ub2RlIiwiX25hbWVzIiwiYWRkIiwiam9pbiIsInNwbGljZSIsImNvbnRhaW5zIiwiY2xhc3NlZEFkZCIsIm5hbWVzIiwibGlzdCIsImNsYXNzZWRSZW1vdmUiLCJjbGFzc2VkVHJ1ZSIsImNsYXNzZWRGYWxzZSIsImNsYXNzZWRGdW5jdGlvbiIsInRleHRSZW1vdmUiLCJ0ZXh0Q29udGVudCIsInRleHRDb25zdGFudCIsInRleHRGdW5jdGlvbiIsImh0bWxSZW1vdmUiLCJpbm5lckhUTUwiLCJodG1sQ29uc3RhbnQiLCJodG1sRnVuY3Rpb24iLCJyYWlzZSIsIm5leHRTaWJsaW5nIiwicHJldmlvdXNTaWJsaW5nIiwiZmlyc3RDaGlsZCIsImNyZWF0b3IiLCJjb25zdGFudE51bGwiLCJiZWZvcmUiLCJyZW1vdmVDaGlsZCIsInNlbGVjdGlvbl9jbG9uZVNoYWxsb3ciLCJjbG9uZSIsInNlbGVjdGlvbl9jbG9uZURlZXAiLCJkZWVwIiwicHJvcGVydHkiLCJjb250ZXh0TGlzdGVuZXIiLCJsaXN0ZW5lciIsImV2ZW50Iiwib25SZW1vdmUiLCJfX29uIiwibyIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJvbkFkZCIsImFkZEV2ZW50TGlzdGVuZXIiLCJkaXNwYXRjaEV2ZW50Iiwid2luZG93IiwiQ3VzdG9tRXZlbnQiLCJjcmVhdGVFdmVudCIsImluaXRFdmVudCIsImJ1YmJsZXMiLCJjYW5jZWxhYmxlIiwiZGV0YWlsIiwiZGlzcGF0Y2hDb25zdGFudCIsImRpc3BhdGNoRnVuY3Rpb24iLCJzZWxlY3Rpb25fc2VsZWN0aW9uIiwic2VsZWN0aW9uX3NlbGVjdCIsInNlbGVjdGlvbl9zZWxlY3RBbGwiLCJzZWxlY3RDaGlsZCIsInNlbGVjdGlvbl9zZWxlY3RDaGlsZCIsInNlbGVjdENoaWxkcmVuIiwic2VsZWN0aW9uX3NlbGVjdENoaWxkcmVuIiwic2VsZWN0aW9uX2ZpbHRlciIsInNlbGVjdGlvbl9kYXRhIiwic2VsZWN0aW9uX2VudGVyIiwic2VsZWN0aW9uX2V4aXQiLCJzZWxlY3Rpb25fam9pbiIsInNlbGVjdGlvbl9tZXJnZSIsInNlbGVjdGlvbl9vcmRlciIsInNlbGVjdGlvbl9zb3J0Iiwic2VsZWN0aW9uX2NhbGwiLCJub2RlcyIsInNlbGVjdGlvbl9ub2RlcyIsInNlbGVjdGlvbl9ub2RlIiwic2VsZWN0aW9uX3NpemUiLCJzZWxlY3Rpb25fZW1wdHkiLCJzZWxlY3Rpb25fZWFjaCIsImF0dHIiLCJzZWxlY3Rpb25fYXR0ciIsInNlbGVjdGlvbl9zdHlsZSIsInNlbGVjdGlvbl9wcm9wZXJ0eSIsImNsYXNzZWQiLCJzZWxlY3Rpb25fY2xhc3NlZCIsInRleHQiLCJzZWxlY3Rpb25fdGV4dCIsImh0bWwiLCJzZWxlY3Rpb25faHRtbCIsInNlbGVjdGlvbl9yYWlzZSIsInNlbGVjdGlvbl9sb3dlciIsInNlbGVjdGlvbl9hcHBlbmQiLCJpbnNlcnQiLCJzZWxlY3Rpb25faW5zZXJ0Iiwic2VsZWN0aW9uX3JlbW92ZSIsInNlbGVjdGlvbl9jbG9uZSIsInNlbGVjdGlvbl9kYXR1bSIsInNlbGVjdGlvbl9vbiIsInNlbGVjdGlvbl9kaXNwYXRjaCIsIlN5bWJvbCIsIml0ZXJhdG9yIiwic2VsZWN0aW9uX2l0ZXJhdG9yIiwiZXh0ZW5kIiwiZGVmaW5pdGlvbiIsIkNvbG9yIiwiZGFya2VyIiwiYnJpZ2h0ZXIiLCJyZUkiLCJyZU4iLCJyZVAiLCJyZUhleCIsInJlUmdiSW50ZWdlciIsInJlUmdiUGVyY2VudCIsInJlUmdiYUludGVnZXIiLCJyZVJnYmFQZXJjZW50IiwicmVIc2xQZXJjZW50IiwicmVIc2xhUGVyY2VudCIsIm5hbWVkIiwiYWxpY2VibHVlIiwiYW50aXF1ZXdoaXRlIiwiYXF1YSIsImFxdWFtYXJpbmUiLCJhenVyZSIsImJlaWdlIiwiYmlzcXVlIiwiYmxhY2siLCJibGFuY2hlZGFsbW9uZCIsImJsdWUiLCJibHVldmlvbGV0IiwiYnJvd24iLCJidXJseXdvb2QiLCJjYWRldGJsdWUiLCJjaGFydHJldXNlIiwiY2hvY29sYXRlIiwiY29yYWwiLCJjb3JuZmxvd2VyYmx1ZSIsImNvcm5zaWxrIiwiY3JpbXNvbiIsImN5YW4iLCJkYXJrYmx1ZSIsImRhcmtjeWFuIiwiZGFya2dvbGRlbnJvZCIsImRhcmtncmF5IiwiZGFya2dyZWVuIiwiZGFya2dyZXkiLCJkYXJra2hha2kiLCJkYXJrbWFnZW50YSIsImRhcmtvbGl2ZWdyZWVuIiwiZGFya29yYW5nZSIsImRhcmtvcmNoaWQiLCJkYXJrcmVkIiwiZGFya3NhbG1vbiIsImRhcmtzZWFncmVlbiIsImRhcmtzbGF0ZWJsdWUiLCJkYXJrc2xhdGVncmF5IiwiZGFya3NsYXRlZ3JleSIsImRhcmt0dXJxdW9pc2UiLCJkYXJrdmlvbGV0IiwiZGVlcHBpbmsiLCJkZWVwc2t5Ymx1ZSIsImRpbWdyYXkiLCJkaW1ncmV5IiwiZG9kZ2VyYmx1ZSIsImZpcmVicmljayIsImZsb3JhbHdoaXRlIiwiZm9yZXN0Z3JlZW4iLCJmdWNoc2lhIiwiZ2FpbnNib3JvIiwiZ2hvc3R3aGl0ZSIsImdvbGQiLCJnb2xkZW5yb2QiLCJncmF5IiwiZ3JlZW4iLCJncmVlbnllbGxvdyIsImdyZXkiLCJob25leWRldyIsImhvdHBpbmsiLCJpbmRpYW5yZWQiLCJpbmRpZ28iLCJpdm9yeSIsImtoYWtpIiwibGF2ZW5kZXIiLCJsYXZlbmRlcmJsdXNoIiwibGF3bmdyZWVuIiwibGVtb25jaGlmZm9uIiwibGlnaHRibHVlIiwibGlnaHRjb3JhbCIsImxpZ2h0Y3lhbiIsImxpZ2h0Z29sZGVucm9keWVsbG93IiwibGlnaHRncmF5IiwibGlnaHRncmVlbiIsImxpZ2h0Z3JleSIsImxpZ2h0cGluayIsImxpZ2h0c2FsbW9uIiwibGlnaHRzZWFncmVlbiIsImxpZ2h0c2t5Ymx1ZSIsImxpZ2h0c2xhdGVncmF5IiwibGlnaHRzbGF0ZWdyZXkiLCJsaWdodHN0ZWVsYmx1ZSIsImxpZ2h0eWVsbG93IiwibGltZSIsImxpbWVncmVlbiIsImxpbmVuIiwibWFnZW50YSIsIm1hcm9vbiIsIm1lZGl1bWFxdWFtYXJpbmUiLCJtZWRpdW1ibHVlIiwibWVkaXVtb3JjaGlkIiwibWVkaXVtcHVycGxlIiwibWVkaXVtc2VhZ3JlZW4iLCJtZWRpdW1zbGF0ZWJsdWUiLCJtZWRpdW1zcHJpbmdncmVlbiIsIm1lZGl1bXR1cnF1b2lzZSIsIm1lZGl1bXZpb2xldHJlZCIsIm1pZG5pZ2h0Ymx1ZSIsIm1pbnRjcmVhbSIsIm1pc3R5cm9zZSIsIm1vY2Nhc2luIiwibmF2YWpvd2hpdGUiLCJuYXZ5Iiwib2xkbGFjZSIsIm9saXZlIiwib2xpdmVkcmFiIiwib3JhbmdlIiwib3JhbmdlcmVkIiwib3JjaGlkIiwicGFsZWdvbGRlbnJvZCIsInBhbGVncmVlbiIsInBhbGV0dXJxdW9pc2UiLCJwYWxldmlvbGV0cmVkIiwicGFwYXlhd2hpcCIsInBlYWNocHVmZiIsInBlcnUiLCJwaW5rIiwicGx1bSIsInBvd2RlcmJsdWUiLCJwdXJwbGUiLCJyZWJlY2NhcHVycGxlIiwicmVkIiwicm9zeWJyb3duIiwicm95YWxibHVlIiwic2FkZGxlYnJvd24iLCJzYWxtb24iLCJzYW5keWJyb3duIiwic2VhZ3JlZW4iLCJzZWFzaGVsbCIsInNpZW5uYSIsInNpbHZlciIsInNreWJsdWUiLCJzbGF0ZWJsdWUiLCJzbGF0ZWdyYXkiLCJzbGF0ZWdyZXkiLCJzbm93Iiwic3ByaW5nZ3JlZW4iLCJzdGVlbGJsdWUiLCJ0YW4iLCJ0ZWFsIiwidGhpc3RsZSIsInRvbWF0byIsInR1cnF1b2lzZSIsInZpb2xldCIsIndoZWF0Iiwid2hpdGUiLCJ3aGl0ZXNtb2tlIiwieWVsbG93IiwieWVsbG93Z3JlZW4iLCJkZWZpbmUiLCJjb2xvciIsImNoYW5uZWxzIiwiYXNzaWduIiwiZGlzcGxheWFibGUiLCJyZ2IiLCJoZXgiLCJjb2xvcl9mb3JtYXRIZXgiLCJmb3JtYXRIZXgiLCJmb3JtYXRIZXg4IiwiY29sb3JfZm9ybWF0SGV4OCIsImZvcm1hdEhzbCIsImNvbG9yX2Zvcm1hdEhzbCIsImZvcm1hdFJnYiIsImNvbG9yX2Zvcm1hdFJnYiIsImhzbENvbnZlcnQiLCJmb3JtYXQiLCJ0b0xvd2VyQ2FzZSIsImV4ZWMiLCJwYXJzZUludCIsInJnYm4iLCJSZ2IiLCJyZ2JhIiwiaHNsYSIsImciLCJyZ2JDb252ZXJ0Iiwib3BhY2l0eSIsImNsYW1wIiwiY2xhbXBpIiwiY2xhbXBhIiwicmdiX2Zvcm1hdEhleCIsInJnYl9mb3JtYXRIZXg4IiwicmdiX2Zvcm1hdFJnYiIsImgiLCJIc2wiLCJoc2wiLCJtMiIsImhzbDJyZ2IiLCJjbGFtcGgiLCJjbGFtcHQiLCJsaW5lYXIiLCJkIiwiZXhwb25lbnRpYWwiLCJub2dhbW1hIiwicmdiR2FtbWEiLCJzdGFydCIsImVuZCIsImNvbG9yUmdiIiwicmVBIiwicmVCIiwiemVybyIsIm9uZSIsImJpIiwibGFzdEluZGV4IiwiYW0iLCJibSIsImJzIiwiaW5kZXgiLCJudW1iZXIiLCJkZWdyZWVzIiwiaWRlbnRpdHkiLCJ0cmFuc2xhdGVYIiwidHJhbnNsYXRlWSIsInJvdGF0ZSIsInNrZXdYIiwic2NhbGVYIiwic2NhbGVZIiwiYXRhbjIiLCJhdGFuIiwic3ZnTm9kZSIsInBhcnNlQ3NzIiwiRE9NTWF0cml4IiwiV2ViS2l0Q1NTTWF0cml4IiwiaXNJZGVudGl0eSIsImRlY29tcG9zZSIsInBhcnNlU3ZnIiwidHJhbnNmb3JtIiwiYmFzZVZhbCIsImNvbnNvbGlkYXRlIiwibWF0cml4IiwiaW50ZXJwb2xhdGVUcmFuc2Zvcm0iLCJwYXJzZSIsInB4Q29tbWEiLCJweFBhcmVuIiwiZGVnUGFyZW4iLCJwb3AiLCJ0cmFuc2xhdGUiLCJ4YSIsInlhIiwieGIiLCJ5YiIsImludGVycG9sYXRlVHJhbnNmb3JtQ3NzIiwiaW50ZXJwb2xhdGVUcmFuc2Zvcm1TdmciLCJmcmFtZSIsInRpbWVvdXQiLCJpbnRlcnZhbCIsInBva2VEZWxheSIsInRhc2tIZWFkIiwidGFza1RhaWwiLCJjbG9ja0xhc3QiLCJjbG9ja05vdyIsImNsb2NrU2tldyIsImNsb2NrIiwicGVyZm9ybWFuY2UiLCJub3ciLCJzZXRGcmFtZSIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsInNldFRpbWVvdXQiLCJjbGVhck5vdyIsIlRpbWVyIiwiX2NhbGwiLCJfdGltZSIsInRpbWVyIiwicmVzdGFydCIsImRlbGF5IiwidGltZSIsInNsZWVwIiwic3RvcCIsInRpbWVyRmx1c2giLCJ3YWtlIiwibmFwIiwicG9rZSIsInQwIiwidDEiLCJ0MiIsImNsZWFyVGltZW91dCIsImNsZWFySW50ZXJ2YWwiLCJzZXRJbnRlcnZhbCIsImVsYXBzZWQiLCJlbXB0eU9uIiwiZW1wdHlUd2VlbiIsIkNSRUFURUQiLCJTQ0hFRFVMRUQiLCJTVEFSVElORyIsIlNUQVJURUQiLCJSVU5OSU5HIiwiRU5ESU5HIiwiRU5ERUQiLCJpZCIsInRpbWluZyIsInNjaGVkdWxlcyIsIl9fdHJhbnNpdGlvbiIsInR3ZWVuIiwiZHVyYXRpb24iLCJlYXNlIiwic2NoZWR1bGUiLCJzZWxmIiwidGljayIsImFjdGl2ZSIsImludGVycnVwdCIsInR3ZWVuUmVtb3ZlIiwidHdlZW4wIiwidHdlZW4xIiwidHdlZW5GdW5jdGlvbiIsIl9pZCIsInR3ZWVuVmFsdWUiLCJ0cmFuc2l0aW9uIiwiaW50ZXJwb2xhdGVOdW1iZXIiLCJpbnRlcnBvbGF0ZVJnYiIsImludGVycG9sYXRlU3RyaW5nIiwiaW50ZXJwb2xhdGUiLCJzdHJpbmcwMCIsInN0cmluZzEiLCJpbnRlcnBvbGF0ZTAiLCJzdHJpbmcwIiwic3RyaW5nMTAiLCJhdHRyVHdlZW4iLCJhdHRySW50ZXJwb2xhdGUiLCJhdHRySW50ZXJwb2xhdGVOUyIsImF0dHJUd2Vlbk5TIiwiX3ZhbHVlIiwiZGVsYXlGdW5jdGlvbiIsImRlbGF5Q29uc3RhbnQiLCJkdXJhdGlvbkZ1bmN0aW9uIiwiZHVyYXRpb25Db25zdGFudCIsImVhc2VDb25zdGFudCIsImVhc2VWYXJ5aW5nIiwiVHJhbnNpdGlvbiIsIl9uYW1lIiwiZXZlcnkiLCJvbkZ1bmN0aW9uIiwib24wIiwib24xIiwic2l0IiwicmVtb3ZlRnVuY3Rpb24iLCJpbmhlcml0Iiwic3R5bGVOdWxsIiwic3R5bGVNYXliZVJlbW92ZSIsImxpc3RlbmVyMCIsInN0eWxlVHdlZW4iLCJzdHlsZUludGVycG9sYXRlIiwidGV4dEludGVycG9sYXRlIiwidGV4dFR3ZWVuIiwiaWQwIiwiaWQxIiwibmV3SWQiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImNhbmNlbCIsInNlbGVjdGlvbl9wcm90b3R5cGUiLCJ0cmFuc2l0aW9uX3NlbGVjdCIsInRyYW5zaXRpb25fc2VsZWN0QWxsIiwidHJhbnNpdGlvbl9maWx0ZXIiLCJ0cmFuc2l0aW9uX21lcmdlIiwidHJhbnNpdGlvbl9zZWxlY3Rpb24iLCJ0cmFuc2l0aW9uX3RyYW5zaXRpb24iLCJ0cmFuc2l0aW9uX29uIiwidHJhbnNpdGlvbl9hdHRyIiwidHJhbnNpdGlvbl9hdHRyVHdlZW4iLCJ0cmFuc2l0aW9uX3N0eWxlIiwidHJhbnNpdGlvbl9zdHlsZVR3ZWVuIiwidHJhbnNpdGlvbl90ZXh0IiwidHJhbnNpdGlvbl90ZXh0VHdlZW4iLCJ0cmFuc2l0aW9uX3JlbW92ZSIsInRyYW5zaXRpb25fdHdlZW4iLCJ0cmFuc2l0aW9uX2RlbGF5IiwidHJhbnNpdGlvbl9kdXJhdGlvbiIsInRyYW5zaXRpb25fZWFzZSIsInRyYW5zaXRpb25fZWFzZVZhcnlpbmciLCJ0cmFuc2l0aW9uX2VuZCIsImN1YmljSW5PdXQiLCJkZWZhdWx0VGltaW5nIiwiZWFzZUN1YmljSW5PdXQiLCJzZWxlY3Rpb25faW50ZXJydXB0Iiwic2VsZWN0aW9uX3RyYW5zaXRpb24iLCJUcmFuc2Zvcm0iLCJwb2ludCIsImFwcGx5WCIsImFwcGx5WSIsImludmVydCIsImludmVydFgiLCJpbnZlcnRZIiwicmVzY2FsZVgiLCJkb21haW4iLCJyYW5nZSIsInJlc2NhbGVZIiwiSFRETWF0aCIsIkRFRkFVTFQiLCJNSU4iLCJNQVgiLCJTVEVQIiwiSlVNUCIsImFkazJ2IiwiYWR2MmsiLCJvbm1lc3NhZ2UiLCJsdWNlIiwibG9nUG9zdCIsImxwIiwia01lYW4iLCJrU2hhcGUiLCJCYXllc0Rpc3RyaWJ1dGlvbnMiLCJsdWNlTWVhbiIsImx1Y2VTaGFwZSIsImZvckVhY2giLCJjaG9pY2UiLCJ2cyIsImFzIiwiZHMiLCJ2bCIsImFsIiwiZGwiLCJiaW52YWwiLCJyZXNwb25zZSIs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LENBQUM7RUFDakQsSUFBQSxDQUFDLENBQUM7RUFFRixJQUFBLE9BQU9kLEVBQUU7SUFDWCxDQUFDOztFQUVEO0VBQ0EsRUFBQSxNQUFNZ0IsT0FBTyxHQUFHLElBQUlDLHVCQUFxQixDQUFDL3dCLE1BQU0sRUFBRTZ2QixPQUFPLEVBQUV6ZCxLQUFLLENBQUM1TyxJQUFJLENBQUM7RUFDdEU7RUFDQXN0QixFQUFBQSxPQUFPLENBQUMxc0IsSUFBSSxDQUFDLElBQUksQ0FBQztFQUNsQixFQUFBLE1BQU00c0IsT0FBTyxHQUFHRixPQUFPLENBQUM5c0IsTUFBTSxDQUFDLElBQUksQ0FBQzs7RUFFcEM7RUFDQSxFQUFBLE1BQU1pdEIsT0FBTyxHQUFHO01BQ2Q1NUIsQ0FBQyxFQUFFNjVCLE1BQVMsQ0FBQ0YsT0FBTyxDQUFDMzVCLENBQUMsQ0FBQztFQUN2QnU0QixJQUFBQSxJQUFJLEVBQUVzQixNQUFTLENBQUNGLE9BQU8sQ0FBQ3BCLElBQUk7S0FDN0I7SUFFRHBHLElBQUksQ0FBQzJILFdBQVcsQ0FBQztFQUFDRixJQUFBQSxPQUFPLEVBQUVBLE9BQU87RUFBRUQsSUFBQUEsT0FBTyxFQUFFQTtFQUFPLEdBQUMsQ0FBQztFQUN4RCxDQUFDOzs7Ozs7IiwieF9nb29nbGVfaWdub3JlTGlzdCI6WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAsNjEsNjIsNjMsNjQsNjUsNjYsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsNzUsNzYsNzcsNzgsNzksODAsODEsODIsODMsODQsODUsODYsODcsODgsODksOTAsOTEsOTIsOTMsOTQsOTUsOTYsOTcsOThdfQ==");class kh extends ca{static get properties(){return{}}constructor(){super(),this.k=Wa.k.DEFAULT,this.choices=[],this.samples=null,this.working=!1,this.queued=!1,this.worker=new Jh,this.worker.onmessage=B=>{this.working=!1,this.samples=B.data.samples,this.k=B.data.results.k,this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-fit-update",{detail:{k:this.k},bubbles:!0})),this.queued&&this.fit()},this.fit()}fit(){this.working?this.queued=!0:(this.worker.postMessage(this.choices),this.working=!0,this.queued=!1)}clear(){this.choices=[],this.fit()}get(B="default"){const Q=this.choices.find(Q=>Q.name===B);return void 0===Q?null:Q}set(B,Q,F,U,t,s="",I=""){const g=this.choices.find(B=>B.name===s);void 0===g?this.choices.push({as:B,ds:Q,al:F,dl:U,response:t,name:s,label:I}):(g.as=B,g.ds=Q,g.al=F,g.dl=U,g.response=t,g.label=I),this.fit()}static get styles(){return[super.styles,g`
1485
+ `]}render(){return M``}willUpdate(){this.alignState()}update(B){if(super.update(B),Number.isNaN(this.width)||Number.isNaN(this.height)||Number.isNaN(this.rem))return;const Q=this.width,F=this.height;let U,t;Q/F>1.8?(t=F,U=1.8*t):(U=Q,t=U/1.8);const s=2*this.rem,I=3*this.rem,g=3*this.rem,i=t-(s+I),l=U-(g+2*this.rem),c=parseInt(this.getComputedStyleValue("---transition-duration"),10),e=Ll().domain([this.scale.time.min,this.scale.time.max]).range([0,l]),n=Ll().domain([this.scale.value.min,this.scale.value.max]).range([i,0]),d=qd().x(B=>e(B.d)).y(B=>n(B.v)),C=fF(this.renderRoot).selectAll(".main").data([{width:this.width,height:this.height,rem:this.rem}]),a=C.enter().append("svg").classed("main",!0);a.html(ca.svgDefs);const b=a.append("defs"),o=b.append("linearGradient").classed("gradient sooner",!0).attr("id","sooner-gradient");o.append("stop").classed("stop-0",!0).attr("offset","0"),o.append("stop").classed("stop-before animation",!0).attr("offset","1"),o.append("stop").classed("stop-after animation",!0).attr("offset","1"),o.append("stop").classed("stop-100",!0).attr("offset","1");const G=b.append("linearGradient").classed("gradient later",!0).attr("id","later-gradient");G.append("stop").classed("stop-0",!0).attr("offset","0"),G.append("stop").classed("stop-before animation",!0).attr("offset","1"),G.append("stop").classed("stop-after animation",!0).attr("offset","1"),G.append("stop").classed("stop-100",!0).attr("offset","1");const u=a.merge(C).attr("viewBox",`0 0 ${U} ${t}`),r=a.append("g").classed("plot",!0),x=u.select(".plot").attr("transform",`translate(${g}, ${s})`);r.append("clipPath").attr("id","clip-htd-curves").append("rect"),x.select("clipPath rect").attr("height",i+1).attr("width",l+1);const L=r.append("g").classed("underlayer",!0),A=x.select(".underlayer");L.append("rect").classed("background",!0),A.select(".background").attr("height",i).attr("width",l),L.append("g").classed("axis-x",!0);A.select(".axis-x").attr("transform",`translate(0, ${n(0)})`).transition().duration(2*c).ease(Xs).call(xQ(e)).attr("font-size",null).attr("font-family",null).selectAll("line, path").attr("stroke",null);const h=L.append("text").classed("title-x",!0).attr("text-anchor","middle");h.append("tspan").classed("name",!0).text("Delay ("),h.append("tspan").classed("math-var d",!0).text("D"),h.append("tspan").classed("name",!0).text(")"),A.select(".title-x").attr("transform",`translate(${l/2}, ${i+2.25*this.rem})`),L.append("g").classed("axis-y",!0);var R;A.select(".axis-y").transition().duration(2*c).ease(Xs).call((R=n,rQ(4,R))).attr("font-size",null).attr("font-family",null).selectAll("line, path").attr("stroke",null);const y=L.append("text").classed("title-y",!0).attr("text-anchor","middle");y.append("tspan").classed("name",!0).text("Value ("),y.append("tspan").classed("math-var v",!0).text("V"),y.append("tspan").classed("name",!0).text(")"),A.select(".title-y").attr("transform",`translate(${-2*this.rem}, ${i/2})rotate(-90)`),r.append("g").classed("content",!0);const V=x.select(".content").selectAll(".option").data(this.options.filter(B=>null!==B.a&&null!==B.d),B=>B.name),Z=V.enter().append("g").attr("class",B=>`option ${"s"===B.label?"sooner":"l"===B.label?"later":""} ${B.trial?"trial":""}`),S=Z.append("g").classed("body",!0),m=S.append("g").classed("fill",!0).attr("clip-path","url(#clip-htd-curves)").each(B=>{B.trial&&u.selectAll(".gradient .animation").attr("offset",1)});m.append("path").classed("region",!0).attr("d",B=>{const Q=cQ(e(B.d),e(0),-1).map(Q=>({d:e.invert(Q),v:Wa.adk2v(B.a,B.d-e.invert(Q),this.k)}));return d([...Q,{d:0,v:0},{d:B.d,v:0}])});const E=S.append("g").classed("bar",!0);E.append("line").classed("line",!0),E.append("line").classed("line touch",!0),E.selectAll(".line").attr("x1",B=>e(B.d)).attr("x2",B=>e(B.d)).attr("y1",n(0)).attr("y2",B=>n(B.a)).attr("stroke-dasharray",(B,Q,F)=>{if(B.trial){return`0,${F[Q].getTotalLength()}`}return"none"});S.append("g").classed("point",!0).append("circle").classed("mark touch",!0);const N=Z.append("g").classed("curve",!0).attr("clip-path","url(#clip-htd-curves)");N.append("path").classed("path",!0),N.append("path").classed("path touch",!0),N.selectAll(".path").attr("d",B=>{const Q=cQ(e(B.d),e(0),-1).map(Q=>({d:e.invert(Q),v:Wa.adk2v(B.a,B.d-e.invert(Q),this.k)}));return d(Q)}).attr("stroke-dasharray",(B,Q,F)=>{if(B.trial){return`0,${F[Q].getTotalLength()}`}return"none"});const X=Z.append("g").classed("point top-point",!0);X.append("circle").classed("mark touch",!0),X.append("text").classed("label",!0),Z.selectAll(".point").attr("transform",B=>`translate(${e(B.d)}, ${n(B.a)})`).attr("opacity",B=>B.trial?0:1);const p=Z.merge(V),W=p.filter((B,Q,F)=>this.interactive&&!B.trial&&!fF(F[Q]).select(".body").classed("interactive")).select(".body");W.classed("interactive",!0).attr("tabindex",0).on("keydown",(B,Q)=>{if(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"].includes(B.key)){let F=Q.a,U=Q.d;switch(B.key){case"ArrowUp":F+=B.shiftKey?1:5;break;case"ArrowDown":F-=B.shiftKey?1:5;break;case"ArrowRight":U+=B.shiftKey?1:5;break;case"ArrowLeft":U-=B.shiftKey?1:5}U=U<this.scale.time.min?this.scale.time.min:U>this.scale.time.max?this.scale.time.max:U,F=F<this.scale.value.min?this.scale.value.min:F>this.scale.value.max?this.scale.value.max:F,U===Q.d&&F===Q.a||(Q.d=U,Q.a=F,"default"===Q.name&&(this.d=Q.d,this.a=Q.a),this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:Q.name,a:Q.a,d:Q.d,k:this.k,label:Q.label},bubbles:!0}))),B.preventDefault()}}),W.select(".fill").call(_F().subject((B,Q)=>({x:e(Q.d),y:n(Q.a)})).on("start",B=>{fF(B.currentTarget).classed("dragging",!0)}).on("drag",(B,Q)=>{this.drag=!0;const F=e.invert(B.x),U=n.invert(B.y);Q.d=F<this.scale.time.min?this.scale.time.min:F>this.scale.time.max?this.scale.time.max:this.scale.time.round(F),Q.a=U<this.scale.value.min?this.scale.value.min:U>this.scale.value.max?this.scale.value.max:this.scale.value.round(U),"default"===Q.name&&(this.d=Q.d,this.a=Q.a),this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:Q.name,a:Q.a,d:Q.d,k:this.k,label:Q.label},bubbles:!0}))}).on("end",B=>{fF(B.currentTarget).classed("dragging",!1)})),W.select(".bar").call(_F().subject((B,Q)=>({x:e(Q.d),y:n(Q.a)})).on("start",B=>{fF(B.currentTarget).classed("dragging",!0)}).on("drag",(B,Q)=>{this.drag=!0;const F=e.invert(B.x);Q.d=F<this.scale.time.min?this.scale.time.min:F>this.scale.time.max?this.scale.time.max:this.scale.time.round(F),"default"===Q.name&&(this.d=Q.d),this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:Q.name,a:Q.a,d:Q.d,k:this.k,label:Q.label},bubbles:!0}))}).on("end",B=>{fF(B.currentTarget).classed("dragging",!1)})),p.filter((B,Q,F)=>this.interactive&&!B.trial&&!fF(F[Q]).select(".top-point").classed("interact")).select(".top-point").classed("interact",!0).attr("tabindex",-1).call(_F().subject((B,Q)=>({x:e(Q.d),y:n(Q.a)})).on("start",B=>{fF(B.currentTarget).classed("dragging",!0)}).on("drag",(B,Q)=>{this.drag=!0;const F=n.invert(B.y);Q.a=F<this.scale.value.min?this.scale.value.min:F>this.scale.value.max?this.scale.value.max:this.scale.value.round(F),"default"===Q.name&&(this.a=Q.a),this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:Q.name,a:Q.a,d:Q.d,k:this.k,label:Q.label},bubbles:!0}))}).on("end",B=>{fF(B.currentTarget).classed("dragging",!1)})).on("keydown",(B,Q)=>{if(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"].includes(B.key)){let F=Q.a,U=Q.d;switch(B.key){case"ArrowUp":F+=B.shiftKey?1:5;break;case"ArrowDown":F-=B.shiftKey?1:5;break;case"ArrowRight":U+=B.shiftKey?1:5;break;case"ArrowLeft":U-=B.shiftKey?1:5}U=U<this.scale.time.min?this.scale.time.min:U>this.scale.time.max?this.scale.time.max:U,F=F<this.scale.value.min?this.scale.value.min:F>this.scale.value.max?this.scale.value.max:F,U===Q.d&&F===Q.a||(Q.d=U,Q.a=F,"default"===Q.name&&(this.d=Q.d,this.a=Q.a),this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:Q.name,a:Q.a,d:Q.d,k:this.k,label:Q.label},bubbles:!0}))),B.preventDefault()}}),p.filter((B,Q,F)=>this.interactive&&!fF(F[Q]).select(".curve").classed("interactive")).select(".curve").classed("interactive",!0).attr("tabindex",0).call(_F().subject(B=>({x:B.x,y:B.y})).on("start",B=>{fF(B.currentTarget).classed("dragging",!0)}).on("drag",(B,Q)=>{this.drag=!0;const F=Q.d-e.invert(B.x),U=F<0?0:F>Q.d?Q.d:F,t=n.invert(B.y),s=t<=0?.001:t>Q.a?Q.a:t,I=Wa.adv2k(Q.a,U,s);this.k=I<Wa.k.MIN?Wa.k.MIN:I>Wa.k.MAX?Wa.k.MAX:I,this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:Q.name,a:Q.a,d:Q.d,k:this.k,label:Q.label},bubbles:!0}))}).on("end",B=>{fF(B.currentTarget).classed("dragging",!1)})).on("keydown",(B,Q)=>{if(["ArrowUp","ArrowDown","ArrowRight","ArrowLeft"].includes(B.key)){let{k:F}=this;switch(B.key){case"ArrowUp":case"ArrowLeft":F*=B.shiftKey?.95:.85;break;case"ArrowDown":case"ArrowRight":F*=B.shiftKey?1/.95:1/.85}F=F<Wa.k.MIN?Wa.k.MIN:F>Wa.k.MAX?Wa.k.MAX:F,F!==this.k&&(this.k=F,this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:Q.name,a:Q.a,d:Q.d,k:this.k,label:Q.label},bubbles:!0}))),B.preventDefault()}});const H=p.filter((B,Q,F)=>(!this.interactive||B.trial)&&fF(F[Q]).select(".body").classed("interactive"));H.classed("interactive",!1),H.select(".fill").attr("tabindex",null).on("drag",null).on("keydown",null),H.select(".bar").on("drag",null).on("keydown",null),p.filter((B,Q,F)=>(!this.interactive||B.trial)&&fF(F[Q]).select(".top-point").classed("interact")).select(".top-point").classed("interact",!1).on("drag",null).on("keydown",null),p.filter((B,Q,F)=>!this.interactive&&fF(F[Q]).select(".curve").classed("interactive")).select(".curve").classed("interactive",!1).attr("tabindex",null).on("drag",null).on("keydown",null),p.filter(B=>B.new).each(()=>{u.selectAll(".gradient .animation").transition().duration(c).delay(c+c/10).ease(Ns).attrTween("offset",()=>Rt(1,0))}),p.filter(B=>B.new).selectAll(".bar .line").transition().duration(c).ease(Ns).attrTween("stroke-dasharray",(B,Q,F)=>{const U=F[Q].getTotalLength();return Rt(`0,${U}`,`${U},${U}`)}),p.filter(B=>B.new).selectAll(".point").transition().duration(c/10).delay(c).ease(Ns).attrTween("opacity",()=>Rt(0,1)),p.filter(B=>B.new).selectAll(".curve .path").transition().duration(c).delay(c+c/10).ease(Ns).attrTween("stroke-dasharray",(B,Q,F)=>{const U=F[Q].getTotalLength();return Rt(`0,${U}`,`${U},0`)}).on("end",B=>{B.new=!1,this.dispatchEvent(new CustomEvent("discountable-response",{detail:{trial:this.trialCount,as:this.as,ds:this.ds,al:this.al,dl:this.dl,response:this.response},bubbles:!0}))}),p.filter(B=>"s"===B.label).raise(),p.filter(B=>"l"===B.label).lower(),V.select(".fill .region").transition().duration(this.drag?0:this.firstUpdate?2*c:c).ease(Xs).attrTween("d",(B,Q,F)=>{const U=F[Q],t=Rt(void 0!==U.a?U.a:B.a,B.a),s=Rt(void 0!==U.d?U.d:B.d,B.d);return B=>{U.a=t(B),U.d=s(B);const Q=cQ(e(U.d),e(0),-1).map(B=>({d:e.invert(B),v:Wa.adk2v(U.a,U.d-e.invert(B),this.k)}));return d([...Q,{d:0,v:0},{d:U.d,v:0}])}}),V.selectAll(".bar .line").transition().duration(this.drag?0:this.firstUpdate?2*c:c).ease(Xs).attrTween("x1",(B,Q,F)=>{const U=F[Q],t=Rt(void 0!==U.d?U.d:B.d,B.d);return B=>(U.d=t(B),`${e(U.d)}`)}).attrTween("x2",(B,Q,F)=>{const U=F[Q],t=Rt(void 0!==U.d?U.d:B.d,B.d);return B=>(U.d=t(B),`${e(U.d)}`)}).attrTween("y2",(B,Q,F)=>{const U=F[Q],t=Rt(void 0!==U.a?U.a:B.a,B.a);return B=>(U.a=t(B),`${n(U.a)}`)}),V.selectAll(".point").transition().duration(this.drag?0:this.firstUpdate?2*c:c).ease(Xs).attrTween("transform",(B,Q,F)=>{const U=F[Q],t=Rt(void 0!==U.d?U.d:B.d,B.d),s=Rt(void 0!==U.a?U.a:B.a,B.a);return B=>(U.d=t(B),U.a=s(B),`translate(${e(U.d)}, ${n(U.a)})`)}),p.select(".point .label").text(B=>B.label),V.selectAll(".curve .path").transition().duration(this.drag?0:this.firstUpdate?2*c:c).ease(Xs).attrTween("d",(B,Q,F)=>{const U=F[Q],t=Rt(void 0!==U.a?U.a:B.a,B.a),s=Rt(void 0!==U.d?U.d:B.d,B.d);return B=>{U.a=t(B),U.d=s(B);const Q=cQ(e(U.d),e(0),-1).map(B=>({d:e.invert(B),v:Wa.adk2v(U.a,U.d-e.invert(B),this.k)}));return d(Q)}}),V.exit().remove(),this.drag=!1,this.firstUpdate=!1}}function fa(B){return null!=B&&!Number.isNaN(B)}function wa(B,Q){return+fa(Q)-+fa(B)||cB(B,Q)}function Ja(B,Q){return+fa(Q)-+fa(B)||eB(B,Q)}function va(B){return null!=B&&""!=`${B}`}function ka(B){return isFinite(B)?B:NaN}function Ma(B){return B>0&&isFinite(B)?B:NaN}function Ta(B){return B<0&&isFinite(B)?B:NaN}function za(B,Q){if(B instanceof Date||(B=new Date(+B)),isNaN(B))return"function"==typeof Q?Q(B):Q;const F=B.getUTCHours(),U=B.getUTCMinutes(),t=B.getUTCSeconds(),s=B.getUTCMilliseconds();return`${I=B.getUTCFullYear(),I<0?`-${Ka(-I,6)}`:I>9999?`+${Ka(I,6)}`:Ka(I,4)}-${Ka(B.getUTCMonth()+1,2)}-${Ka(B.getUTCDate(),2)}${F||U||t||s?`T${Ka(F,2)}:${Ka(U,2)}${t||s?`:${Ka(t,2)}${s?`.${Ka(s,3)}`:""}`:""}Z`:""}`;var I}function Ka(B,Q){return`${B}`.padStart(Q,"0")}customElements.define("htd-curves",Ya);const Oa=/^(?:[-+]\d{2})?\d{4}(?:-\d{2}(?:-\d{2})?)?(?:T\d{2}:\d{2}(?::\d{2}(?:\.\d{3})?)?(?:Z|[-+]\d{2}:?\d{2})?)?$/;function Pa(B,Q){return Oa.test(B+="")?new Date(B):"function"==typeof Q?Q(B):Q}function ja(B){if(null==B)return;return eB(B[0],B[B.length-1])}const _a=1e3,$a=6e4,qa=36e5,Bb=864e5,Qb=6048e5,Fb=2592e6,Ub=31536e6,tb=[["millisecond",1],["2 milliseconds",2],["5 milliseconds",5],["10 milliseconds",10],["20 milliseconds",20],["50 milliseconds",50],["100 milliseconds",100],["200 milliseconds",200],["500 milliseconds",500],["second",_a],["5 seconds",5e3],["15 seconds",15e3],["30 seconds",3e4],["minute",$a],["5 minutes",3e5],["15 minutes",9e5],["30 minutes",18e5],["hour",qa],["3 hours",108e5],["6 hours",216e5],["12 hours",432e5],["day",Bb],["2 days",1728e5],["week",Qb],["2 weeks",12096e5],["month",Fb],["3 months",7776e6],["6 months",15552e6],["year",Ub],["2 years",63072e6],["5 years",15768e7],["10 years",31536e7],["20 years",63072e7],["50 years",15768e8],["100 years",31536e8]],sb=new Map([["second",_a],["minute",$a],["hour",qa],["day",Bb],["monday",Qb],["tuesday",Qb],["wednesday",Qb],["thursday",Qb],["friday",Qb],["saturday",Qb],["sunday",Qb],["week",Qb],["month",Fb],["year",Ub]]),Ib=new Map([["second",Qc],["minute",Fc],["hour",tc],["day",Ic],["monday",ec],["tuesday",nc],["wednesday",dc],["thursday",Cc],["friday",ac],["saturday",bc],["sunday",cc],["week",cc],["month",Rc],["year",Vc]]),gb=new Map([["second",Qc],["minute",Uc],["hour",sc],["day",ic],["monday",uc],["tuesday",rc],["wednesday",xc],["thursday",Lc],["friday",Ac],["saturday",hc],["sunday",Gc],["week",Gc],["month",yc],["year",Zc]]),ib=Symbol("intervalDuration"),lb=Symbol("intervalType");for(const[B,Q]of Ib)Q[ib]=sb.get(B),Q[lb]="time";for(const[B,Q]of gb)Q[ib]=sb.get(B),Q[lb]="utc";const cb=[["year",Zc,"utc"],["month",yc,"utc"],["day",ic,"utc",15552e6],["hour",sc,"utc",2592e5],["minute",Uc,"utc",216e5],["second",Qc,"utc",18e5]],eb=[["year",Vc,"time"],["month",Rc,"time"],["day",Ic,"time",15552e6],["hour",tc,"time",2592e5],["minute",Fc,"time",216e5],["second",Qc,"time",18e5]],nb=[cb[0],eb[0],cb[1],eb[1],cb[2],eb[2],...cb.slice(3)];function db(B){let Q=`${B}`.toLowerCase();Q.endsWith("s")&&(Q=Q.slice(0,-1));let F=1;const U=/^(?:(\d+)\s+)/.exec(Q);switch(U&&(Q=Q.slice(U[0].length),F=+U[1]),Q){case"quarter":Q="month",F*=3;break;case"half":Q="month",F*=6}let t=gb.get(Q);if(!t)throw new Error(`unknown interval: ${B}`);if(F>1&&!t.every)throw new Error(`non-periodic interval: ${Q}`);return[Q,F]}function Cb(B){return bb(db(B),"time")}function ab(B){return bb(db(B),"utc")}function bb([B,Q],F){let U=("time"===F?Ib:gb).get(B);return Q>1&&(U=U.every(Q),U[ib]=sb.get(B)*Q,U[lb]=F),U}function ob(B,Q){if(!(Q>1))return;const F=B[ib];if(!tb.some(([,B])=>B===F))return;if(F%Bb===0&&Bb<F&&F<Fb)return;const[U]=tb[nB(([,B])=>Math.log(B)).center(tb,Math.log(F*Q))];return("time"===B[lb]?Cb:ab)(U)}function Gb(B,Q,F){const U="time"===Q?Yc:fc;if(null==F)return U("year"===B?"%Y":"month"===B?"%Y-%m":"day"===B?"%Y-%m-%d":"hour"===B||"minute"===B?"%Y-%m-%dT%H:%M":"second"===B?"%Y-%m-%dT%H:%M:%S":"%Y-%m-%dT%H:%M:%S.%L");const t=function(B){return"left"===B||"right"===B?(B,Q)=>`\n${B}\n${Q}`:"top"===B?(B,Q)=>`${Q}\n${B}`:(B,Q)=>`${B}\n${Q}`}(F);switch(B){case"millisecond":return rb(U(".%L"),U(":%M:%S"),t);case"second":return rb(U(":%S"),U("%-I:%M"),t);case"minute":return rb(U("%-I:%M"),U("%p"),t);case"hour":return rb(U("%-I %p"),U("%b %-d"),t);case"day":return rb(U("%-d"),U("%b"),t);case"month":return rb(U("%b"),U("%Y"),t);case"year":return U("%Y")}throw new Error("unable to format time ticks")}function ub(B,Q,F){const U=OB(function(B,Q=lQ){const F=[];let U,t=!1;for(const s of B)t&&F.push(Q(U,s)),U=s,t=!0;return F}(Q,(B,Q)=>Math.abs(Q-B)));if(U<1e3)return Gb("millisecond","utc",F);for(const[t,s,I,g]of function(B){return"time"===B?eb:"utc"===B?cb:nb}(B)){if(U>g)break;if("hour"===t&&!U)break;if(Q.every(B=>s.floor(B)>=B))return Gb(t,I,F)}}function rb(B,Q,F){return(U,t,s)=>{const I=B(U,t),g=Q(U,t),i=t-ja(s);return t!==i&&void 0!==s[i]&&g===Q(s[i],i)?I:F(I,g)}}const xb=Object.getPrototypeOf(Uint8Array),Lb=Object.prototype.toString;function Ab(B){return B instanceof Array||B instanceof xb}function hb(B){return B instanceof xb&&!function(B){return B instanceof BigInt64Array||B instanceof BigUint64Array}(B)}function Rb(B){return B?.prototype instanceof xb&&!function(B){return B===BigInt64Array||B===BigUint64Array}(B)}const yb=Symbol("reindex");function Vb(B,Q,F){const U=typeof Q;return"string"===U?Jo(B)?mb(B.getChild(Q),F):Zb(B,Xb(Q),F):"function"===U?Zb(B,Q,F):"number"===U||Q instanceof Date||"boolean"===U?Bo(B,vb(Q),F):"function"==typeof Q?.transform?Sb(Q.transform(B),F):function(B,Q){return null!=B&&Q?eo(B,Q):B}(Sb(Q,F),B?.[yb])}function Zb(B,Q,F){return Bo(B,Rb(F)?(B,F)=>Mb(Q(B,F)):Q,F)}function Sb(B,Q){return void 0===Q?$b(B):vo(B)?mb(B,Q):B instanceof Q?B:Q.from(B,Rb(Q)&&!hb(B)?Mb:void 0)}function mb(B,Q){return null==B?B:void 0!==Q&&Q!==Array||!function(B){return B&&(8===B.typeId||10===B.typeId)&&1===B.unit}(B.type)?Sb(Eb(B),Q):Tb(Eb(B))}function Eb(B){return B.nullCount?B.toJSON():B.toArray()}const Nb=[null],Xb=B=>Q=>{const F=Q[B];return void 0===F&&"Feature"===Q.type?Q.properties?.[B]:F},pb={transform:co},Wb={transform:B=>B},Hb=()=>1,Db=()=>!0,Yb=B=>null==B?B:`${B}`,fb=B=>null==B?B:+B,wb=B=>B?B[0]:void 0,Jb=B=>B?B[1]:void 0,vb=B=>()=>B;function kb(B){return hb(B)?B:Bo(B,Mb,Float64Array)}function Mb(B){return null==B?NaN:Number(B)}function Tb(B){return Bo(B,zb)}function zb(B){return B instanceof Date&&!isNaN(B)?B:"string"==typeof B?Pa(B):null==B||isNaN(B=Number(B))?void 0:new Date(B)}function Kb(B,Q){return void 0===B&&(B=Q),null===B?[void 0,"none"]:Xo(B)?[void 0,B]:[B,void 0]}function Ob(B,Q){return void 0===B&&(B=Q),null===B||"number"==typeof B?[void 0,B]:[B,void 0]}function Pb(B,Q,F){if(null!=B)return jb(B,Q,F)}function jb(B,Q,F){const U=`${B}`.toLowerCase();if(!F.includes(U))throw new Error(`invalid ${Q}: ${B}`);return U}function _b(B){return Jo(B)?B:$b(B)}function $b(B){if(null==B||Ab(B))return B;if(vo(B))return mb(B);if(qb(B))switch(B.type){case"FeatureCollection":return B.features;case"GeometryCollection":return B.geometries;default:return[B]}return Array.from(B)}function qb(B){switch(B?.type){case"FeatureCollection":case"GeometryCollection":case"Feature":case"LineString":case"MultiLineString":case"MultiPoint":case"MultiPolygon":case"Point":case"Polygon":case"Sphere":return!0;default:return!1}}function Bo(B,Q,F=Array){return null==B?B:B instanceof F?B.map(Q):F.from(B,Q)}function Qo(B,Q=Array){return B instanceof Q?B.slice():Q.from(B)}function Fo({y:B,y1:Q,y2:F}){return void 0!==B||void 0!==Q||void 0!==F}function Uo(B){return B?.toString===Lb}function to(B){return Uo(B)&&(void 0!==B.type||void 0!==B.domain)}function so(B){return Uo(B)&&"function"!=typeof B.transform}function Io(B){return so(B)&&void 0===B.value&&void 0===B.channel}function go(B,Q){return void 0===B&&void 0===Q?[wb,Jb]:[B,Q]}function io({z:B,fill:Q,stroke:F}={}){return void 0===B&&([B]=Kb(Q)),void 0===B&&([B]=Kb(F)),B}function lo(B){return Ab(B)?B.length:B?.numRows}function co(B){const Q=lo(B),F=new Uint32Array(Q);for(let B=0;B<Q;++B)F[B]=B;return F}function eo(B,Q){return Ab(B)?Bo(Q,Q=>B[Q],B.constructor):Bo(Q,Q=>B.at(Q))}function no(B,Q,F){return B.subarray?B.subarray(Q,F):B.slice(Q,F)}function Co(B){return null!==B&&"object"==typeof B?B.valueOf():B}function ao(B){let Q;return[{transform:()=>Q,label:oo(B)},B=>Q=B]}function bo(B){return null==B?[B]:ao(B)}function oo(B,Q){return"string"==typeof B?B:B&&void 0!==B.label?B.label:Q}function Go(B,Q){return{transform(F){const U=B.transform(F),t=Q.transform(F);return Zo(U)||Zo(t)?Bo(U,(B,Q)=>new Date((+U[Q]+ +t[Q])/2)):Bo(U,(B,Q)=>(+U[Q]+ +t[Q])/2,Float64Array)},label:B.label}}function uo(B,Q){const F=ro(Q?.interval,Q?.type);return F?Bo(B,F):B}function ro(B,Q){const F=xo(B,Q);return F&&(B=>fa(B)?F.floor(B):B)}function xo(B,Q){if(null!=B){if("number"==typeof B)return function(B){B=+B,0<B&&B<1&&Number.isInteger(1/B)&&(B=-1/B);const Q=Math.abs(B);return B<0?{floor:B=>Math.floor(B*Q)/Q,offset:(B,F=1)=>(B*Q+Math.floor(F))/Q,range:(B,F)=>cQ(Math.ceil(B*Q),F*Q).map(B=>B/Q)}:{floor:B=>Math.floor(B/Q)*Q,offset:(B,F=1)=>B+Q*Math.floor(F),range:(B,F)=>cQ(Math.ceil(B/Q),F/Q).map(B=>B*Q)}}(B);if("string"==typeof B)return("time"===Q?Cb:ab)(B);if("function"!=typeof B.floor)throw new Error("invalid interval; missing floor method");if("function"!=typeof B.offset)throw new Error("invalid interval; missing offset method");return B}}function Lo(B,Q){if((B=xo(B,Q))&&"function"!=typeof B.range)throw new Error("invalid interval: missing range method");return B}function Ao(B){return"function"==typeof B?.range}function ho(B){return void 0===B||so(B)?B:{value:B}}function Ro(B){return B&&"function"==typeof B[Symbol.iterator]}function yo(B){for(const Q of B)if(null!=Q)return"object"!=typeof Q||Q instanceof Date}function Vo(B){for(const Q of B){if(null==Q)continue;const B=typeof Q;return"string"===B||"boolean"===B}}function Zo(B){for(const Q of B)if(null!=Q)return Q instanceof Date}function So(B){for(const Q of B)if(null!=Q)return"string"==typeof Q&&isNaN(Q)&&Pa(Q)}function mo(B){for(const Q of B)if(null!=Q){if("string"!=typeof Q)return!1;if(Q.trim())return!isNaN(Q)}}function Eo(B,Q){let F;for(const U of B)if(null!=U){if(!Q(U))return!1;F=!0}return F}const No=new Set("none,currentcolor,transparent,aliceblue,antiquewhite,aqua,aquamarine,azure,beige,bisque,black,blanchedalmond,blue,blueviolet,brown,burlywood,cadetblue,chartreuse,chocolate,coral,cornflowerblue,cornsilk,crimson,cyan,darkblue,darkcyan,darkgoldenrod,darkgray,darkgreen,darkgrey,darkkhaki,darkmagenta,darkolivegreen,darkorange,darkorchid,darkred,darksalmon,darkseagreen,darkslateblue,darkslategray,darkslategrey,darkturquoise,darkviolet,deeppink,deepskyblue,dimgray,dimgrey,dodgerblue,firebrick,floralwhite,forestgreen,fuchsia,gainsboro,ghostwhite,gold,goldenrod,gray,green,greenyellow,grey,honeydew,hotpink,indianred,indigo,ivory,khaki,lavender,lavenderblush,lawngreen,lemonchiffon,lightblue,lightcoral,lightcyan,lightgoldenrodyellow,lightgray,lightgreen,lightgrey,lightpink,lightsalmon,lightseagreen,lightskyblue,lightslategray,lightslategrey,lightsteelblue,lightyellow,lime,limegreen,linen,magenta,maroon,mediumaquamarine,mediumblue,mediumorchid,mediumpurple,mediumseagreen,mediumslateblue,mediumspringgreen,mediumturquoise,mediumvioletred,midnightblue,mintcream,mistyrose,moccasin,navajowhite,navy,oldlace,olive,olivedrab,orange,orangered,orchid,palegoldenrod,palegreen,paleturquoise,palevioletred,papayawhip,peachpuff,peru,pink,plum,powderblue,purple,rebeccapurple,red,rosybrown,royalblue,saddlebrown,salmon,sandybrown,seagreen,seashell,sienna,silver,skyblue,slateblue,slategray,slategrey,snow,springgreen,steelblue,tan,teal,thistle,tomato,turquoise,violet,wheat,white,whitesmoke,yellow".split(","));function Xo(B){return"string"==typeof B&&(B=B.toLowerCase().trim(),/^#[0-9a-f]{3,8}$/.test(B)||/^(?:url|var|rgb|rgba|hsl|hsla|hwb|lab|lch|oklab|oklch|color|color-mix)\(.*\)$/.test(B)||No.has(B))}function po(B){return"number"==typeof B&&(0<=B&&B<=1||isNaN(B))}function Wo(B){return null==B||Ho(B)}function Ho(B){return/^\s*none\s*$/i.test(B)}function Do(B,Q){return Pb(B,Q,["middle","top-left","top","top-right","right","bottom-right","bottom","bottom-left","left"])}function Yo(B="middle"){return Do(B,"frameAnchor")}function fo(B){return Ro(B)?function(B){console.warn("named iterables are deprecated; please use an object instead");const Q=new Set;return Object.fromEntries(Array.from(B,B=>{const{name:F}=B;if(null==F)throw new Error("missing name");const U=`${F}`;if("__proto__"===U)throw new Error(`illegal name: ${U}`);if(Q.has(U))throw new Error(`duplicate name: ${U}`);return Q.add(U),[F,B]}))}(B):B}function wo(B){return!0===B?B="frame":!1===B?B=null:qb(B)||null==B||"sphere"===(B=jb(B,"clip",["frame","sphere"]))&&(B={type:"Sphere"}),B}function Jo(B){return B&&"function"==typeof B.getChild&&"function"==typeof B.toArray&&B.schema&&Array.isArray(B.schema.fields)}function vo(B){return B&&"function"==typeof B.toArray&&B.type}const ko=Symbol("position"),Mo=Symbol("color"),To=Symbol("radius"),zo=Symbol("length"),Ko=Symbol("opacity"),Oo=Symbol("symbol"),Po=Symbol("projection"),jo=new Map([["x",ko],["y",ko],["fx",ko],["fy",ko],["r",To],["color",Mo],["opacity",Ko],["symbol",Oo],["length",zo],["projection",Po]]);function _o(B){return B===ko||B===Po}const $o=2/Math.sqrt(3),qo=new Map([["asterisk",FC],["circle",UC],["cross",tC],["diamond",gC],["diamond2",iC],["hexagon",{draw(B,Q){const F=Math.sqrt(Q/Math.PI),U=F*$o,t=U/2;B.moveTo(0,U),B.lineTo(F,t),B.lineTo(F,-t),B.lineTo(0,-U),B.lineTo(-F,-t),B.lineTo(-F,t),B.closePath()}}],["plus",lC],["square",cC],["square2",eC],["star",aC],["times",RC],["triangle",oC],["triangle2",uC],["wye",hC]]);function BG(B){return B&&"function"==typeof B.draw}function QG(B){return!!BG(B)||"string"==typeof B&&qo.has(B.toLowerCase())}function FG(B){if(null==B||BG(B))return B;const Q=qo.get(`${B}`.toLowerCase());if(Q)return Q;throw new Error(`invalid symbol: ${B}`)}function UG({filter:B,sort:Q,reverse:F,transform:U,initializer:t,...s}={},I){if(void 0===U&&(null!=B&&(U=iG(B)),null==Q||Io(Q)||(U=sG(U,cG(Q))),F&&(U=sG(U,lG))),null!=I&&null!=t)throw new Error("transforms cannot be applied after initializers");return{...s,...(null===Q||Io(Q))&&{sort:Q},transform:sG(U,I)}}function tG({filter:B,sort:Q,reverse:F,initializer:U,...t}={},s){return void 0===U&&(null!=B&&(U=iG(B)),null==Q||Io(Q)||(U=IG(U,cG(Q))),F&&(U=IG(U,lG))),{...t,...(null===Q||Io(Q))&&{sort:Q},initializer:IG(U,s)}}function sG(B,Q){return null==B?null===Q?void 0:Q:null==Q?null===B?void 0:B:function(F,U,t){return({data:F,facets:U}=B.call(this,F,U,t)),Q.call(this,_b(F),U,t)}}function IG(B,Q){return null==B?null===Q?void 0:Q:null==Q?null===B?void 0:B:function(F,U,t,...s){let I,g,i,l,c,e;return({data:g=F,facets:i=U,channels:I}=B.call(this,F,U,t,...s)),({data:c=g,facets:e=i,channels:l}=Q.call(this,g,i,{...t,...I},...s)),{data:c,facets:e,channels:{...I,...l}}}}function gG(B,Q){return(null!=B.initializer?tG:UG)(B,Q)}function iG(B){return(Q,F)=>{const U=Vb(Q,B);return{data:Q,facets:F.map(B=>B.filter(B=>U[B]))}}}function lG(B,Q){return{data:B,facets:Q.map(B=>B.slice().reverse())}}function cG(B){return("function"==typeof B&&1!==B.length?eG:nG)(B)}function eG(B){return(Q,F)=>{const U=Ab(Q)?(F,U)=>B(Q[F],Q[U]):(F,U)=>B(Q.get(F),Q.get(U));return{data:Q,facets:F.map(B=>B.slice().sort(U))}}}function nG(B){let Q,F;({channel:Q,value:B,order:F}={...ho(B)});const U=Q?.startsWith("-");if(U&&(Q=Q.slice(1)),void 0===F&&(F=U?Ja:wa),"function"!=typeof F)switch(`${F}`.toLowerCase()){case"ascending":F=wa;break;case"descending":F=Ja;break;default:throw new Error(`invalid order: ${F}`)}return(U,t,s)=>{let I;if(void 0===Q)I=Vb(U,B);else{if(void 0===s)throw new Error("channel sort requires an initializer");if(I=s[Q],!I)return{};I=I.value}const g=(B,Q)=>F(I[B],I[Q]);return{data:U,facets:t.map(B=>B.slice().sort(g))}}}function dG(B,...Q){for(const{name:F}of B)if(Q.includes(F))return!0;return!1}function CG(B,Q,F,U=aG){let t;Uo(Q)&&"reduce"in Q&&(t=Q.scale,Q=Q.reduce);const s=U(B,Q,F),[I,g]=ao(s.label);let i;return{name:B,output:void 0===t?I:{value:I,scale:t},initialize(B){s.initialize(B),i=g([])},scope(B,Q){s.scope(B,Q)},reduce(B,Q){i.push(s.reduce(B,Q))}}}function aG(B,Q,F,U=oG){const t=function(B,Q){if(void 0!==Q[B])return Q[B];switch(B){case"x1":case"x2":B="x";break;case"y1":case"y2":B="y"}return Q[B]}(B,F),s=U(Q,t);let I,g;return{label:oo(s===RG?null:t,s.label),initialize(B){I=void 0===t?B:Vb(B,t),"data"===s.scope&&(g=s.reduceIndex(co(B),I))},scope(B,Q){s.scope===B&&(g=s.reduceIndex(Q,I))},reduce:(B,Q)=>null==s.scope?s.reduceIndex(B,I,Q):s.reduceIndex(B,I,g,Q)}}function bG(B,Q){return Q?NB(B,B=>Q[B]):[[,B]]}function oG(B,Q,F=GG){if(null==B)return F(B);if("function"==typeof B.reduceIndex)return B;if("function"==typeof B.reduce&&Uo(B))return function(B){return console.warn("deprecated reduce interface; implement reduceIndex instead."),{...B,reduceIndex:B.reduce.bind(B)}}(B);if("function"==typeof B)return function(B){return{reduceIndex:(Q,F,U)=>B(eo(F,Q),U)}}(B);if(/^p\d{2}$/i.test(B))return uG(function(B){const Q=+`${B}`.slice(1)/100;return(B,F)=>QQ(B,Q,F)}(B));switch(`${B}`.toLowerCase()){case"first":return LG;case"last":return hG;case"identity":return xG;case"count":return RG;case"distinct":return yG;case"sum":return null==Q?RG:VG;case"proportion":return ZG(Q,"data");case"proportion-facet":return ZG(Q,"facet");case"deviation":return uG(LB);case"min":return uG(jB);case"min-index":return uG(_B);case"max":return uG(OB);case"max-index":return uG(PB);case"mean":return rG(sQ);case"median":return rG(IQ);case"variance":return uG(xB);case"mode":return uG(iQ)}return F(B)}function GG(B){throw new Error(`invalid reduce: ${B}`)}function uG(B){return{reduceIndex:(Q,F)=>B(Q,B=>F[B])}}function rG(B){return{reduceIndex(Q,F){const U=B(Q,B=>F[B]);return Zo(F)?new Date(U):U}}}const xG={reduceIndex:(B,Q)=>eo(Q,B)},LG={reduceIndex:(B,Q)=>Q[B[0]]},AG={reduceIndex(B,Q){const F=HB(XB(B,B=>B.length,B=>Q[B]),Jb),U=F.slice(-5).reverse();if(U.length<F.length){const B=F.slice(0,-4);U[4]=[`… ${B.length.toLocaleString("en-US")} more`,eQ(B,Jb)]}return U.map(([B,Q])=>`${B} (${Q.toLocaleString("en-US")})`).join("\n")}},hG={reduceIndex:(B,Q)=>Q[B[B.length-1]]},RG={label:"Frequency",reduceIndex:B=>B.length},yG={label:"Distinct",reduceIndex(B,Q){const F=new yB;for(const U of B)F.add(Q[U]);return F.size}},VG=uG(eQ);function ZG(B,Q){return null==B?{scope:Q,label:"Frequency",reduceIndex:(B,Q,F=1)=>B.length/F}:{scope:Q,reduceIndex:(B,Q,F=1)=>eQ(B,B=>Q[B])/F}}const SG={reduceIndex:(B,Q,{z:F})=>F};function mG(B,{scale:Q,type:F,value:U,filter:t,hint:s,label:I=oo(U)},g){return void 0===s&&"function"==typeof U?.transform&&(s=U.hint),EG(g,{scale:Q,type:F,value:Vb(B,U),label:I,filter:t,hint:s})}function EG(B,Q){const{scale:F,value:U}=Q;if(!0===F||"auto"===F)switch(B){case"fill":case"stroke":case"color":Q.scale=!0!==F&&Eo(U,Xo)?null:"color",Q.defaultScale="color";break;case"fillOpacity":case"strokeOpacity":case"opacity":Q.scale=!0!==F&&Eo(U,po)?null:"opacity",Q.defaultScale="opacity";break;case"symbol":!0!==F&&Eo(U,QG)?(Q.scale=null,Q.value=Bo(U,FG)):Q.scale="symbol",Q.defaultScale="symbol";break;default:Q.scale=jo.has(B)?B:null}else if(!1===F)Q.scale=null;else if(null!=F&&!jo.has(F))throw new Error(`unknown scale: ${F}`);return Q}function NG(B,Q){for(const F in B){const U=B[F];if(U.scale===Q)return U}}function XG(B,Q){const F=B.original;if(F===B)return Q;const U=Q.value,t=Q.value=[];for(let Q=0;Q<F.length;++Q){const s=U[F[Q][0]];for(const F of B[Q])t[F]=s}return Q}function pG(B,Q,F){const U=WG(B,Q);return Bo(WG(B,F),(B,Q)=>Math.abs(B-U[Q]),Float64Array)}function WG(B,Q,F){let U=B[Q];if(U||void 0===F||(U=B[F]),U)return U.value;throw new Error(`missing channel: ${Q}`)}function HG(B){if(null==B||"function"==typeof B)return B;switch(`${B}`.toLowerCase()){case"ascending":return DG;case"descending":return YG}throw new Error(`invalid order: ${B}`)}function DG([B,Q],[F,U]){return wa(Q,U)||wa(B,F)}function YG([B,Q],[F,U]){return Ja(Q,U)||wa(B,F)}function fG(B,Q){let F=B[Q];if(F){for(;F.source;)F=F.source;return null===F.source?null:F}}const wG=new Map([["accent",an],["category10",Cn],["dark2",bn],["observable10",on],["paired",Gn],["pastel1",un],["pastel2",rn],["set1",xn],["set2",Ln],["set3",An],["tableau10",hn]]);const JG=new Map([...wG,["brbg",kG(yn,Vn)],["prgn",kG(Zn,Sn)],["piyg",kG(mn,En)],["puor",kG(Nn,Xn)],["rdbu",kG(pn,Wn)],["rdgy",kG(Hn,Dn)],["rdylbu",kG(Yn,fn)],["rdylgn",kG(wn,Jn)],["spectral",kG(vn,kn)],["burd",MG(pn,Wn)],["buylrd",MG(Yn,fn)],["blues",vG(Cd,ad)],["greens",vG(bd,od)],["greys",vG(Gd,ud)],["oranges",vG(hd,Rd)],["purples",vG(rd,xd)],["reds",vG(Ld,Ad)],["turbo",TG(Hd)],["viridis",TG(Yd)],["magma",TG(fd)],["inferno",TG(wd)],["plasma",TG(Jd)],["cividis",TG(yd)],["cubehelix",TG(Vd)],["warm",TG(Zd)],["cool",TG(Sd)],["bugn",vG(Mn,Tn)],["bupu",vG(zn,Kn)],["gnbu",vG(On,Pn)],["orrd",vG(jn,_n)],["pubu",vG(Bd,Qd)],["pubugn",vG($n,qn)],["purd",vG(Fd,Ud)],["rdpu",vG(td,sd)],["ylgn",vG(id,ld)],["ylgnbu",vG(Id,gd)],["ylorbr",vG(cd,ed)],["ylorrd",vG(nd,dd)],["rainbow",zG(Ed)],["sinebow",zG(Wd)]]);function vG(B,Q){return({length:F})=>1===F?[B[3][1]]:2===F?[B[3][1],B[3][2]]:(F=Math.max(3,Math.floor(F)))>9?ft(Q,F):B[F]}function kG(B,Q){return({length:F})=>2===F?[B[3][0],B[3][2]]:(F=Math.max(3,Math.floor(F)))>11?ft(Q,F):B[F]}function MG(B,Q){return({length:F})=>2===F?[B[3][2],B[3][0]]:(F=Math.max(3,Math.floor(F)))>11?ft(B=>Q(1-B),F):B[F].slice().reverse()}function TG(B){return({length:Q})=>ft(B,Math.max(2,Math.floor(Q)))}function zG(B){return({length:Q})=>ft(B,Math.floor(Q)+1).slice(0,-1)}function KG(B){const Q=`${B}`.toLowerCase();if(!JG.has(Q))throw new Error(`unknown ordinal scheme: ${Q}`);return JG.get(Q)}function OG(B,Q){const F=KG(B),U="function"==typeof F?F({length:Q}):F;return U.length!==Q?U.slice(0,Q):U}const PG=new Map([["brbg",Vn],["prgn",Sn],["piyg",En],["puor",Xn],["rdbu",Wn],["rdgy",Dn],["rdylbu",fn],["rdylgn",Jn],["spectral",kn],["burd",B=>Wn(1-B)],["buylrd",B=>fn(1-B)],["blues",ad],["greens",od],["greys",ud],["purples",xd],["reds",Ad],["oranges",Rd],["turbo",Hd],["viridis",Yd],["magma",fd],["inferno",wd],["plasma",Jd],["cividis",yd],["cubehelix",Vd],["warm",Zd],["cool",Sd],["bugn",Tn],["bupu",Kn],["gnbu",Pn],["orrd",_n],["pubugn",qn],["pubu",Qd],["purd",Ud],["rdpu",sd],["ylgnbu",gd],["ylgn",ld],["ylorbr",ed],["ylorrd",dd],["rainbow",Ed],["sinebow",Wd]]);function jG(B){const Q=`${B}`.toLowerCase();if(!PG.has(Q))throw new Error(`unknown quantitative scheme: ${Q}`);return PG.get(Q)}const _G=new Set(["brbg","prgn","piyg","puor","rdbu","rdgy","rdylbu","rdylgn","spectral","burd","buylrd"]);const $G=B=>Q=>B(1-Q),qG=[0,1],Bu=new Map([["number",rt],["rgb",Ct],["hsl",pt],["hcl",Wt],["lab",function(B,Q){var F=dt((B=kU(B)).l,(Q=kU(Q)).l),U=dt(B.a,Q.a),t=dt(B.b,Q.b),s=dt(B.opacity,Q.opacity);return function(Q){return B.l=F(Q),B.a=U(Q),B.b=t(Q),B.opacity=s(Q),B+""}}]]);function Qu(B){const Q=`${B}`.toLowerCase();if(!Bu.has(Q))throw new Error(`unknown interpolator: ${Q}`);return Bu.get(Q)}function Fu(B,Q,F,{type:U,nice:t,clamp:s,zero:I,domain:g=cu(B,F),unknown:i,round:l,scheme:c,interval:e,range:n=(jo.get(B)===To?nu(F,g):jo.get(B)===zo?du(F,g):jo.get(B)===Ko?qG:void 0),interpolate:d=(jo.get(B)===Mo?null==c&&void 0!==n?Ct:jG(void 0!==c?c:"cyclical"===U?"rainbow":"turbo"):l?yt:rt),reverse:C}){if(g=Uu(g),e=Lo(e,U),"cyclical"!==U&&"sequential"!==U||(U="linear"),"function"!=typeof d&&(d=Qu(d)),C=!!C,void 0!==n){if(g.length!==(n=Uu(n)).length){if(1===d.length)throw new Error("invalid piecewise interpolator");d=Yt(d,n),n=void 0}}if(1===d.length?(C&&(d=$G(d),C=!1),void 0===n&&(n=Float64Array.from(g,(B,Q)=>Q/(g.length-1)),2===n.length&&(n=qG)),Q.interpolate((n===qG?vb:bu)(d))):Q.interpolate(d),I){const[B,Q]=AB(g);if(B>0||Q<0){(ja(g=Qo(g))||1)===Math.sign(B)?g[0]=0:g[g.length-1]=0}}return C&&(g=nQ(g)),Q.domain(g).unknown(i),t&&(Q.nice(function(B,Q){return!0===B?void 0:"number"==typeof B?B:function(B,Q){if((B=Lo(B,Q))&&"function"!=typeof B.ceil)throw new Error("invalid interval: missing ceil method");return B}(B,Q)}(t,U)),g=Q.domain()),void 0!==n&&Q.range(n),s&&Q.clamp(s),{type:U,domain:g,range:n,scale:Q,interpolate:d,interval:e}}function Uu(B){return(B=$b(B)).length>=2?B:[B[0],B[0]]}function tu(B,Q,{exponent:F=1,...U}){return Fu(B,Jl().exponent(F),Q,{...U,type:"pow"})}function su(B,Q,{base:F=10,domain:U=Cu(Q),...t}){return Fu(B,Nl().base(F),Q,{...t,domain:U})}function Iu(B,Q,{constant:F=1,...U}){return Fu(B,Hl().constant(F),Q,U)}function gu(B,Q,{range:F,quantiles:U=(void 0===F?5:(F=[...F]).length),n:t=U,scheme:s="rdylbu",domain:I=au(Q),unknown:g,interpolate:i,reverse:l}){return void 0===F&&(F=void 0!==i?ft(i,t):jo.get(B)===Mo?OG(s,t):void 0),I.length>0&&(I=vl(I,void 0===F?{length:t}:F).quantiles()),iu(B,Q,{domain:I,range:F,reverse:l,unknown:g})}function iu(B,Q,{domain:F=[0],unknown:U,scheme:t="rdylbu",interpolate:s,range:I=(void 0!==s?ft(s,F.length+1):jo.get(B)===Mo?OG(t,F.length+1):void 0),reverse:g}){const i=ja(F=$b(F));if(!isNaN(i)&&!function(B,Q){for(let F=1,U=B.length,t=B[0];F<U;++F){const U=eB(t,t=B[F]);if(0!==U&&U!==Q)return!1}return!0}(F,i))throw new Error(`the ${B} scale has a non-monotonic domain`);return g&&(I=nQ(I)),{type:"threshold",scale:kl(i<0?nQ(F):F,void 0===I?[]:I).unknown(U),domain:F,range:I}}function lu(B,Q=ka){return B.length?[jB(B,({value:B})=>void 0===B?B:jB(B,Q)),OB(B,({value:B})=>void 0===B?B:OB(B,Q))]:[0,1]}function cu(B,Q){const F=jo.get(B);return(F===To||F===Ko||F===zo?eu:lu)(Q)}function eu(B){return[0,B.length?OB(B,({value:B})=>void 0===B?B:OB(B,ka)):1]}function nu(B,Q){const F=B.find(({radius:B})=>void 0!==B);if(void 0!==F)return[0,F.radius];const U=QQ(B,.5,({value:B})=>void 0===B?NaN:QQ(B,.25,Ma)),t=Q.map(B=>3*Math.sqrt(B/U)),s=30/OB(t);return s<1?t.map(B=>B*s):t}function du(B,Q){const F=IQ(B,({value:B})=>void 0===B?NaN:IQ(B,Math.abs)),U=Q.map(B=>12*B/F),t=60/OB(U);return t<1?U.map(B=>B*t):U}function Cu(B){for(const{value:Q}of B)if(void 0!==Q)for(let F of Q){if(F>0)return lu(B,Ma);if(F<0)return lu(B,Ta)}return[1,10]}function au(B){const Q=[];for(const{value:F}of B)if(void 0!==F)for(const B of F)Q.push(B);return Q}function bu(B){return(Q,F)=>U=>B(Q+U*(F-Q))}let ou,Gu=0;function uu(B){B!==ou&&(ou=B,console.warn(B),++Gu)}function ru(B,Q,F,U,{type:t,nice:s,clamp:I,domain:g=lu(U),unknown:i,pivot:l=0,scheme:c,range:e,symmetric:n=!0,interpolate:d=(jo.get(B)===Mo?null==c&&void 0!==e?Ct:jG(void 0!==c?c:"rdbu"):rt),reverse:C}){l=+l,g=$b(g);let[a,b]=g;if(g.length>2&&uu(`Warning: the diverging ${B} scale domain contains extra elements.`),eB(a,b)<0&&([a,b]=[b,a],C=!C),a=Math.min(a,l),b=Math.max(b,l),"function"!=typeof d&&(d=Qu(d)),void 0!==e&&(d=1===d.length?bu(d)(...e):Yt(d,e)),C&&(d=$G(d)),n){const B=F.apply(l),Q=B-F.apply(a),U=F.apply(b)-B;Q<U?a=F.invert(B-U):Q>U&&(b=F.invert(B+Q))}return Q.domain([a,l,b]).unknown(i).interpolator(d),I&&Q.clamp(I),s&&Q.nice(s),{type:t,domain:[a,b],pivot:l,interpolate:d,scale:Q}}function xu(B,Q,F){return ru(B,ln(),Ru,Q,F)}function Lu(B,Q,{exponent:F=1,...U}){return ru(B,nn().exponent(F=+F),function(B){return.5===B?Vu:{apply:Q=>Math.sign(Q)*Math.pow(Math.abs(Q),B),invert:Q=>Math.sign(Q)*Math.pow(Math.abs(Q),1/B)}}(F),Q,{...U,type:"diverging-pow"})}function Au(B,Q,{base:F=10,pivot:U=1,domain:t=lu(Q,U<0?Ta:Ma),...s}){return ru(B,cn().base(F=+F),yu,Q,{domain:t,pivot:U,...s})}function hu(B,Q,{constant:F=1,...U}){return ru(B,en().constant(F=+F),function(B){return{apply:Q=>Math.sign(Q)*Math.log1p(Math.abs(Q/B)),invert:Q=>Math.sign(Q)*Math.expm1(Math.abs(Q))*B}}(F),Q,U)}const Ru={apply:B=>B,invert:B=>B},yu={apply:Math.log,invert:Math.exp},Vu={apply:B=>Math.sign(B)*Math.sqrt(Math.abs(B)),invert:B=>Math.sign(B)*(B*B)};function Zu(B,Q,F,U){return Fu(B,Q,F,U)}function Su(B,Q,F){return Zu(B,function(){return tl.apply(sn(Nc,Xc,Vc,Rc,cc,Ic,tc,Fc,Qc,Yc).domain([new Date(2e3,0,1),new Date(2e3,0,2)]),arguments)}(),Q,F)}function mu(B,Q,F){return Zu(B,function(){return tl.apply(sn(mc,Ec,Zc,yc,Gc,gc,sc,Uc,Qc,fc).domain([Date.UTC(2e3,0,1),Date.UTC(2e3,0,2)]),arguments)}(),Q,F)}const Eu=Symbol("ordinal");function Nu(B,Q,F,{type:U,interval:t,domain:s,range:I,reverse:g,hint:i}){return t=Lo(t,U),void 0===s&&(s=Wu(F,t,B)),"categorical"!==U&&U!==Eu||(U="ordinal"),g&&(s=nQ(s)),s=Q.domain(s).domain(),void 0!==I&&("function"==typeof I&&(I=I(s)),Q.range(I)),{type:U,domain:s,range:I,scale:Q,hint:i,interval:t}}function Xu(B,Q,{type:F,interval:U,domain:t,range:s,scheme:I,unknown:g,...i}){let l;if(U=Lo(U,F),void 0===t&&(t=Wu(Q,U,B)),jo.get(B)===Oo)l=function(B){return{fill:Hu(B,"fill"),stroke:Hu(B,"stroke")}}(Q),s=void 0===s?function(B){return Wo(B.fill)?VC:yC}(l):Bo(s,FG);else if(jo.get(B)===Mo&&(void 0!==s||"ordinal"!==F&&F!==Eu||(s=function(B,Q="greys"){const F=new Set,[U,t]=OG(Q,2);for(const Q of B)if(null!=Q)if(!0===Q)F.add(t);else{if(!1!==Q)return;F.add(U)}return[...F]}(t,I),void 0!==s&&(I=void 0)),void 0===I&&void 0===s&&(I="ordinal"===F?"turbo":"observable10"),void 0!==I))if(void 0!==s){const B=jG(I),Q=s[0],F=s[1]-s[0];s=({length:U})=>ft(U=>B(Q+F*U),U)}else s=KG(I);if(g===Il)throw new Error(`implicit unknown on ${B} scale is not supported`);return Nu(B,gl().unknown(g),Q,{...i,type:F,domain:t,range:s,hint:l})}function pu(B,Q,F,U){let{round:t}=F;return void 0!==t&&B.round(t=!!t),(B=Nu(U,B,Q,F)).round=t,B}function Wu(B,Q,F){const U=new yB;for(const{value:Q,domain:F}of B){if(void 0!==F)return F();if(void 0!==Q)for(const B of Q)U.add(B)}if(void 0!==Q){const[B,F]=AB(U).map(Q.floor,Q);return Q.range(B,Q.offset(F))}if(U.size>1e4&&jo.get(F)===ko)throw new Error(`implicit ordinal domain of ${F} scale has more than 10,000 values`);return HB(U,wa)}function Hu(B,Q){let F;for(const{hint:U}of B){const B=U?.[Q];if(void 0!==B)if(void 0===F)F=B;else if(F!==B)return}return F}function Du(B,{label:Q,inset:F=0,insetTop:U=F,insetRight:t=F,insetBottom:s=F,insetLeft:I=F,round:g,nice:i,clamp:l,zero:c,align:e,padding:n,projection:d,facet:{label:C=Q}={},...a}={}){const b={};for(const[F,o]of B){const B=a[F],G=zu(F,o,{round:jo.get(F)===ko?g:void 0,nice:i,clamp:l,zero:c,align:e,padding:n,projection:d,...B});if(G){let{label:g=("fx"===F||"fy"===F?C:Q),percent:i,transform:l,inset:c,insetTop:e=(void 0!==c?c:"y"===F?U:0),insetRight:n=(void 0!==c?c:"x"===F?t:0),insetBottom:d=(void 0!==c?c:"y"===F?s:0),insetLeft:a=(void 0!==c?c:"x"===F?I:0)}=B||{};if(null==l)l=void 0;else if("function"!=typeof l)throw new Error("invalid scale transform; not a function");G.percent=!!i,G.label=void 0===g?fu(o,G):g,G.transform=l,"x"===F||"fx"===F?(G.insetLeft=+a,G.insetRight=+n):"y"!==F&&"fy"!==F||(G.insetTop=+e,G.insetBottom=+d),b[F]=G}}return b}function Yu(B){const Q={},F={scales:Q};for(const[U,t]of Object.entries(B)){const{scale:B,type:s,interval:I,label:g}=t;Q[U]=Fr(t),F[U]=B,B.type=s,null!=I&&(B.interval=I),null!=g&&(B.label=g)}return F}function fu(B=[],Q){let F;for(const{label:Q}of B)if(void 0!==Q)if(void 0===F)F=Q;else if(F!==Q)return;if(void 0!==F)return!_u(Q)&&Q.percent&&(F=`${F} (%)`),{inferred:!0,toString:()=>F}}function wu(B){const{marginTop:Q,marginRight:F,marginBottom:U,marginLeft:t,width:s,height:I,facet:{marginTop:g,marginRight:i,marginBottom:l,marginLeft:c}}=B;return{marginTop:Math.max(Q,g),marginRight:Math.max(F,i),marginBottom:Math.max(U,l),marginLeft:Math.max(t,c),width:s,height:I}}function Ju({fx:B,fy:Q},F){const{marginTop:U,marginRight:t,marginBottom:s,marginLeft:I,width:g,height:i}=wu(F);return{marginTop:U,marginRight:t,marginBottom:s,marginLeft:I,width:B?B.scale.bandwidth()+I+t:g,height:Q?Q.scale.bandwidth()+U+s:i,facet:{width:g,height:i}}}function vu(B,Q){if(void 0===B.range){const{insetLeft:F,insetRight:U}=B,{width:t,marginLeft:s=0,marginRight:I=0}=Q,g=s+F,i=t-I-U;B.range=[g,Math.max(g,i)],_u(B)||(B.range=Tu(B)),B.scale.range(B.range)}Mu(B)}function ku(B,Q){if(void 0===B.range){const{insetTop:F,insetBottom:U}=B,{height:t,marginTop:s=0,marginBottom:I=0}=Q,g=s+F,i=t-I-U;B.range=[Math.max(g,i),g],_u(B)?B.range.reverse():B.range=Tu(B),B.scale.range(B.range)}Mu(B)}function Mu(B){void 0===B.round&&function({type:B}){return"point"===B||"band"===B}(B)&&function({scale:B}){const Q=B.domain().length,[F,U]=B.range(),t=B.paddingInner?B.paddingInner():1,s=B.paddingOuter?B.paddingOuter():B.padding(),I=Q-t,g=Math.abs(U-F)/Math.max(1,I+2*s);return(g-Math.floor(g))*I}(B)<=30&&B.scale.round(!0)}function Tu(B){const Q=B.scale.domain().length+$u(B);if(!(Q>2))return B.range;const[F,U]=B.range;return Array.from({length:Q},(B,t)=>F+t/(Q-1)*(U-F))}function zu(B,Q=[],F={}){const U=function(B,Q,{type:F,domain:U,range:t,scheme:s,pivot:I,projection:g}){if(F=Ou(F),"fx"===B||"fy"===B)return"band";"x"!==B&&"y"!==B||null==g||(F=Pu);for(const B of Q){const Q=Ou(B.type);if(void 0!==Q)if(void 0===F)F=Q;else if(F!==Q)throw new Error(`scale incompatible with channel: ${F} !== ${Q}`)}if(F===Pu)return;if(void 0!==F)return F;if(void 0===U&&!Q.some(({value:B})=>void 0!==B))return;const i=jo.get(B);if(i===To)return"sqrt";if(i===Ko||i===zo)return"linear";if(i===Oo)return"ordinal";const l=(U??t)?.length;if(l<2||l>2)return ju(i);if(void 0!==U){if(Vo(U))return ju(i);if(Zo(U))return"utc"}else{const B=Q.map(({value:B})=>B).filter(B=>void 0!==B);if(B.some(Vo))return ju(i);if(B.some(Zo))return"utc"}if(i===Mo){if(null!=I||function(B){return null!=B&&_G.has(`${B}`.toLowerCase())}(s))return"diverging";if(function(B){return null!=B&&wG.has(`${B}`.toLowerCase())}(s))return"categorical"}return"linear"}(B,Q,F);if(void 0===F.type&&void 0===F.domain&&void 0===F.range&&null==F.interval&&"fx"!==B&&"fy"!==B&&_u({type:U})){const F=Q.map(({value:B})=>B).filter(B=>void 0!==B);F.some(Zo)?uu(`Warning: some data associated with the ${B} scale are dates. Dates are typically associated with a "utc" or "time" scale rather than a "${Ku(U)}" scale. If you are using a bar mark, you probably want a rect mark with the interval option instead; if you are using a group transform, you probably want a bin transform instead. If you want to treat this data as ordinal, you can specify the interval of the ${B} scale (e.g., d3.utcDay), or you can suppress this warning by setting the type of the ${B} scale to "${Ku(U)}".`):F.some(So)?uu(`Warning: some data associated with the ${B} scale are strings that appear to be dates (e.g., YYYY-MM-DD). If these strings represent dates, you should parse them to Date objects. Dates are typically associated with a "utc" or "time" scale rather than a "${Ku(U)}" scale. If you are using a bar mark, you probably want a rect mark with the interval option instead; if you are using a group transform, you probably want a bin transform instead. If you want to treat this data as ordinal, you can suppress this warning by setting the type of the ${B} scale to "${Ku(U)}".`):F.some(mo)&&uu(`Warning: some data associated with the ${B} scale are strings that appear to be numbers. If these strings represent numbers, you should parse or coerce them to numbers. Numbers are typically associated with a "linear" scale rather than a "${Ku(U)}" scale. If you want to treat this data as ordinal, you can specify the interval of the ${B} scale (e.g., 1 for integers), or you can suppress this warning by setting the type of the ${B} scale to "${Ku(U)}".`)}switch(F.type=U,U){case"diverging":case"diverging-sqrt":case"diverging-pow":case"diverging-log":case"diverging-symlog":case"cyclical":case"sequential":case"linear":case"sqrt":case"threshold":case"quantile":case"pow":case"log":case"symlog":F=Br(Q,F,kb);break;case"identity":switch(jo.get(B)){case ko:F=Br(Q,F,kb);break;case Oo:F=Br(Q,F,Qr)}break;case"utc":case"time":F=Br(Q,F,Tb)}switch(U){case"diverging":return xu(B,Q,F);case"diverging-sqrt":return function(B,Q,F){return Lu(B,Q,{...F,exponent:.5})}(B,Q,F);case"diverging-pow":return Lu(B,Q,F);case"diverging-log":return Au(B,Q,F);case"diverging-symlog":return hu(B,Q,F);case"categorical":case"ordinal":case Eu:return Xu(B,Q,F);case"cyclical":case"sequential":case"linear":return function(B,Q,F){return Fu(B,Ll(),Q,F)}(B,Q,F);case"sqrt":return function(B,Q,F){return tu(B,Q,{...F,exponent:.5})}(B,Q,F);case"threshold":return iu(B,0,F);case"quantile":return gu(B,Q,F);case"quantize":return function(B,Q,{range:F,n:U=(void 0===F?5:(F=[...F]).length),scheme:t="rdylbu",domain:s=cu(B,Q),unknown:I,interpolate:g,reverse:i}){const[l,c]=AB(s);let e;return void 0===F?(e=MB(l,c,U),e[0]<=l&&e.splice(0,1),e[e.length-1]>=c&&e.pop(),U=e.length+1,F=void 0!==g?ft(g,U):jo.get(B)===Mo?OG(t,U):void 0):(e=ft(rt(l,c),U+1).slice(1,-1),l instanceof Date&&(e=e.map(B=>new Date(B)))),ja($b(s))<0&&e.reverse(),iu(B,0,{domain:e,range:F,reverse:i,unknown:I})}(B,Q,F);case"pow":return tu(B,Q,F);case"log":return su(B,Q,F);case"symlog":return Iu(B,Q,F);case"utc":return mu(B,Q,F);case"time":return Su(B,Q,F);case"point":return function(B,Q,{align:F=.5,padding:U=.5,...t}){return pu(cl().align(F).padding(U),Q,t,B)}(B,Q,F);case"band":return function(B,Q,{align:F=.5,padding:U=.1,paddingInner:t=U,paddingOuter:s=("fx"===B||"fy"===B?0:U),...I}){return pu(il().align(F).paddingInner(t).paddingOuter(s),Q,I,B)}(B,Q,F);case"identity":return function(B){return{type:"identity",scale:(Q=jo.get(B),Q===ko||Q===To||Q===zo||Q===Ko?Al():B=>B)};var Q}(B);case void 0:return;default:throw new Error(`unknown scale type: ${U}`)}}function Ku(B){return"symbol"==typeof B?B.description:B}function Ou(B){return"string"==typeof B?`${B}`.toLowerCase():B}const Pu={toString:()=>"projection"};function ju(B){switch(B){case ko:return"point";case Mo:return Eu;default:return"ordinal"}}function _u({type:B}){return"ordinal"===B||"point"===B||"band"===B||B===Eu}function $u({type:B}){return"threshold"===B}function qu(B){if(void 0===B)return!0;const Q=B.domain(),F=B(Q[0]);for(let U=1,t=Q.length;U<t;++U)if(B(Q[U])-F)return!1;return!0}function Br(B,{domain:Q,...F},U){for(const F of B)void 0!==F.value&&(void 0===Q&&(Q=F.value?.domain),F.value=U(F.value));return{domain:void 0===Q?Q:U(Q),...F}}function Qr(B){return Bo(B,FG)}function Fr({scale:B,type:Q,domain:F,range:U,interpolate:t,interval:s,transform:I,percent:g,pivot:i}){if("identity"===Q)return{type:"identity",apply:B=>B,invert:B=>B};const l=B.unknown?B.unknown():void 0;return{type:Q,domain:Qo(F),...void 0!==U&&{range:Qo(U)},...void 0!==I&&{transform:I},...g&&{percent:g},...void 0!==l&&{unknown:l},...void 0!==s&&{interval:s},...void 0!==t&&{interpolate:t},...B.clamp&&{clamp:B.clamp()},...void 0!==i&&{pivot:i,symmetric:!1},...B.base&&{base:B.base()},...B.exponent&&{exponent:B.exponent()},...B.constant&&{constant:B.constant()},...B.align&&{align:B.align(),round:B.round()},...B.padding&&(B.paddingInner?{paddingInner:B.paddingInner(),paddingOuter:B.paddingOuter()}:{padding:B.padding()}),...B.bandwidth&&{bandwidth:B.bandwidth(),step:B.step()},apply:Q=>B(Q),...B.invert&&{invert:Q=>B.invert(Q)}}}function Ur(B,Q){const{fx:F,fy:U}=Du(B,Q),t=F?.scale.domain(),s=U?.scale.domain();return t&&s?function(...B){const Q="function"==typeof B[B.length-1]&&function(B){return Q=>B(...Q)}(B.pop()),F=(B=B.map(uB)).map(oB),U=B.length-1,t=new Array(U+1).fill(0),s=[];if(U<0||F.some(GB))return s;for(;;){s.push(t.map((Q,F)=>B[F][Q]));let I=U;for(;++t[I]===F[I];){if(0===I)return Q?s.map(Q):s;t[I--]=0}}}(t,s).map(([B,Q],F)=>({x:B,y:Q,i:F})):t?t.map((B,Q)=>({x:B,i:Q})):s?s.map((B,Q)=>({y:B,i:Q})):void 0}function tr(B,{fx:Q,fy:F}){const U=co(B),t=Q?.value,s=F?.value;return Q&&F?XB(U,B=>(B.fx=t[B[0]],B.fy=s[B[0]],B),B=>t[B],B=>s[B]):Q?XB(U,B=>(B.fx=t[B[0]],B),B=>t[B]):XB(U,B=>(B.fy=s[B[0]],B),B=>s[B])}function sr(B){const Q=[],F=new Uint32Array(eQ(B,B=>B.length));for(const U of B){let t=0;for(const Q of B)U!==Q&&(F.set(Q,t),t+=Q.length);Q.push(F.slice(0,t))}return Q}const Ir=new Map([["top",er],["right",Cr],["bottom",nr],["left",dr],["top-left",ar(er,dr)],["top-right",ar(er,Cr)],["bottom-left",ar(nr,dr)],["bottom-right",ar(nr,Cr)],["top-empty",function(B,{y:Q},{x:F,y:U,empty:t}){if(t)return!1;if(!Q)return;const s=lr(Q,U);if(s>0)return cr(B,F,Q[s-1])}],["right-empty",function(B,{x:Q},{x:F,y:U,empty:t}){if(t)return!1;if(!Q)return;const s=lr(Q,F);if(s<Q.length-1)return cr(B,Q[s+1],U)}],["bottom-empty",function(B,{y:Q},{x:F,y:U,empty:t}){if(t)return!1;if(!Q)return;const s=lr(Q,U);if(s<Q.length-1)return cr(B,F,Q[s+1])}],["left-empty",function(B,{x:Q},{x:F,y:U,empty:t}){if(t)return!1;if(!Q)return;const s=lr(Q,F);if(s>0)return cr(B,Q[s-1],U)}],["empty",function(B,Q,{empty:F}){return F}]]);const gr=new WeakMap;function ir(B){let Q=gr.get(B);return Q||gr.set(B,Q=new RB(Bo(B,(B,Q)=>[B,Q]))),Q}function lr(B,Q){return ir(B).get(Q)}function cr(B,Q,F){return function(B,Q,F){return Q=Co(Q),F=Co(F),B.find(B=>Object.is(Co(B.x),Q)&&Object.is(Co(B.y),F))}(B,Q,F)?.empty}function er(B,{y:Q},{y:F}){return!Q||0===lr(Q,F)}function nr(B,{y:Q},{y:F}){return!Q||lr(Q,F)===Q.length-1}function dr(B,{x:Q},{x:F}){return!Q||0===lr(Q,F)}function Cr(B,{x:Q},{x:F}){return!Q||lr(Q,F)===Q.length-1}function ar(B,Q){return function(){return B.apply(null,arguments)&&Q.apply(null,arguments)}}function br(B,{channels:{fx:Q,fy:F},groups:U}){return Q&&F?B.map(({x:B,y:Q})=>U.get(B)?.get(Q)??[]):Q?B.map(({x:B})=>U.get(B)??[]):B.map(({y:B})=>U.get(B)??[])}const or=Math.PI,Gr=2*or,ur=.618;function rr({projection:B,inset:Q=0,insetTop:F=Q,insetRight:U=Q,insetBottom:t=Q,insetLeft:s=Q}={},I){if(null==B)return;if("function"==typeof B.stream)return B;let g,i,l="frame";if(Uo(B)){let Q;if(({type:B,domain:i,inset:Q,insetTop:F=(void 0!==Q?Q:F),insetRight:U=(void 0!==Q?Q:U),insetBottom:t=(void 0!==Q?Q:t),insetLeft:s=(void 0!==Q?Q:s),clip:l=l,...g}=B),null==B)return}"function"!=typeof B&&({type:B}=xr(B));const{width:c,height:e,marginLeft:n,marginRight:d,marginTop:C,marginBottom:a}=I,b=c-n-d-s-U,o=e-C-a-F-t;if(B=B?.({width:b,height:o,clip:l,...g}),null==B)return;l=function(B,Q,F,U,t){if(!1===B||null==B||"number"==typeof B)return B=>B;!0===B&&(B="frame");if("frame"===`${B}`.toLowerCase())return tg(Q,F,U,t);throw new Error(`unknown projection clip type: ${B}`)}(l,n,C,c-d,e-a);let G,u=n+s,r=C+F;if(null!=i){const[[Q,F],[U,t]]=gi(B).bounds(i),s=Math.min(b/(U-Q),o/(t-F));s>0?(u-=(s*(Q+U)-b)/2,r-=(s*(F+t)-o)/2,G=ii({point(B,Q){this.stream.point(B*s+u,Q*s+r)}})):uu("Warning: the projection could not be fit to the specified domain; using the default scale.")}return G??=0===u&&0===r?hr():ii({point(B,Q){this.stream.point(B+u,Q+r)}}),{stream:Q=>B.stream(G.stream(l(Q)))}}function xr(B){switch(`${B}`.toLowerCase()){case"albers-usa":return Lr(yi,.7463,.4673);case"albers":return Ar(Ri,.7463,.4673);case"azimuthal-equal-area":return Lr(mi,4,4);case"azimuthal-equidistant":return Lr(Ni,Gr,Gr);case"conic-conformal":return Ar(Yi,Gr,Gr);case"conic-equal-area":return Ar(hi,6.1702,2.9781);case"conic-equidistant":return Ar(vi,7.312,3.6282);case"equal-earth":return Lr(Pi,5.4133,2.6347);case"equirectangular":return Lr(wi,Gr,or);case"gnomonic":return Lr(_i,3.4641,3.4641);case"identity":return{type:hr};case"reflect-y":return{type:Rr};case"mercator":return Lr(pi,Gr,Gr);case"orthographic":return Lr(qi,2,2);case"stereographic":return Lr(Ql,2,2);case"transverse-mercator":return Lr(Ul,Gr,Gr);default:throw new Error(`unknown projection type: ${B}`)}}function Lr(B,Q,F){return{type:({width:U,height:t,rotate:s,precision:I=.15,clip:g})=>{const i=B();return null!=I&&i.precision?.(I),null!=s&&i.rotate?.(s),"number"==typeof g&&i.clipAngle?.(g),null!=U&&(i.scale(Math.min(U/Q,t/F)),i.translate([U/2,t/2])),i},aspectRatio:F/Q}}function Ar(B,Q,F){const{type:U,aspectRatio:t}=Lr(B,Q,F);return{type:B=>{const{parallels:Q,domain:F,width:t,height:s}=B,I=U(B);return null!=Q&&(I.parallels(Q),void 0===F&&null!=t&&I.fitSize([t,s],{type:"Sphere"})),I},aspectRatio:t}}const hr=vb({stream:B=>B}),Rr=vb(ii({point(B,Q){this.stream.point(B,-Q)}}));function yr(B,Q,F,U){const t=F[B],s=F[Q],I=t.length,g=F[B]=new Float64Array(I).fill(NaN),i=F[Q]=new Float64Array(I).fill(NaN);let l;const c=U.stream({point(B,Q){g[l]=B,i[l]=Q}});for(l=0;l<I;++l)c.point(t[l],s[l])}function Vr({projection:B}={}){return null!=B&&("function"==typeof B.stream||(Uo(B)&&(B=B.type),null!=B))}function Zr(B){const Q=[],F=[],U={scale:"x",value:Q},t={scale:"y",value:F},s={point(B,U){Q.push(B),F.push(U)},lineStart(){},lineEnd(){},polygonStart(){},polygonEnd(){},sphere(){}};for(const Q of B.value)mI(Q,s);return[U,t]}function Sr(B={}){const{document:Q=("undefined"!=typeof window?window.document:void 0),clip:F}=B;return{document:Q,clip:wo(F)}}function mr(B,{document:Q}){return fF(NQ(B).call(Q.documentElement))}const Er=Symbol("unset");function Nr(B){return(1===B.length?Xr:pr)(B)}function Xr(B){let Q,F=Er;return U=>(Object.is(F,U)||(F=U,Q=B(U)),Q)}function pr(B){let Q,F;return(...U)=>((F?.length!==U.length||F.some((B,Q)=>!Object.is(B,U[Q])))&&(F=U,Q=B(...U)),Q)}const Wr=Nr(B=>new Intl.NumberFormat(B));function Hr(B){return za(B,"Invalid Date")}Nr((B,Q)=>new Intl.DateTimeFormat(B,{timeZone:"UTC",...Q&&{month:Q}})),Nr((B,Q)=>new Intl.DateTimeFormat(B,{timeZone:"UTC",...Q&&{weekday:Q}}));const Dr=function(B="en-US"){const Q=function(B="en-US"){const Q=Wr(B);return B=>null==B||isNaN(B)?void 0:Q.format(B)}(B);return B=>(B instanceof Date?Hr:"number"==typeof B?Q:Yb)(B)}(),Yr=("undefined"!=typeof window?window.devicePixelRatio>1:"undefined"==typeof it)?0:.5;let fr=0;function wr(){return"plot-clip-"+ ++fr}function Jr(B,{title:Q,href:F,ariaLabel:U,ariaDescription:t,ariaHidden:s,target:I,fill:g,fillOpacity:i,stroke:l,strokeWidth:c,strokeOpacity:e,strokeLinejoin:n,strokeLinecap:d,strokeMiterlimit:C,strokeDasharray:a,strokeDashoffset:b,opacity:o,mixBlendMode:G,imageFilter:u,paintOrder:r,pointerEvents:x,shapeRendering:L,channels:A},{ariaLabel:h,fill:R="currentColor",fillOpacity:y,stroke:V="none",strokeOpacity:Z,strokeWidth:S,strokeLinecap:m,strokeLinejoin:E,strokeMiterlimit:N,paintOrder:X}){null===R&&(g=null,i=null),null===V&&(l=null,e=null),Wo(R)?Wo(V)||Wo(g)&&!A?.fill||(V="none"):!Wo(V)||Wo(l)&&!A?.stroke||(R="none");const[p,W]=Kb(g,R),[H,D]=Ob(i,y),[Y,f]=Kb(l,V),[w,J]=Ob(e,Z),[v,k]=Ob(o);Ho(f)||(void 0===c&&(c=S),void 0===d&&(d=m),void 0===n&&(n=E),void 0!==C||/^\s*round\s*$/i.test(n)||(C=N),Ho(W)||void 0!==r||(r=X));const[M,T]=Ob(c);return null!==R&&(B.fill=Fx(W,"currentColor"),B.fillOpacity=Ux(D,1)),null!==V&&(B.stroke=Fx(f,"none"),B.strokeWidth=Ux(T,1),B.strokeOpacity=Ux(J,1),B.strokeLinejoin=Fx(n,"miter"),B.strokeLinecap=Fx(d,"butt"),B.strokeMiterlimit=Ux(C,4),B.strokeDasharray=Fx(a,"none"),B.strokeDashoffset=Fx(b,"0")),B.target=Yb(I),B.ariaLabel=Yb(h),B.ariaDescription=Yb(t),B.ariaHidden=Yb(s),B.opacity=Ux(k,1),B.mixBlendMode=Fx(G,"normal"),B.imageFilter=Fx(u,"none"),B.paintOrder=Fx(r,"normal"),B.pointerEvents=Fx(x,"auto"),B.shapeRendering=Fx(L,"auto"),{title:{value:Q,optional:!0,filter:null},href:{value:F,optional:!0,filter:null},ariaLabel:{value:U,optional:!0,filter:null},fill:{value:p,scale:"auto",optional:!0},fillOpacity:{value:H,scale:"auto",optional:!0},stroke:{value:Y,scale:"auto",optional:!0},strokeOpacity:{value:w,scale:"auto",optional:!0},strokeWidth:{value:M,optional:!0},opacity:{value:v,scale:"auto",optional:!0}}}function vr(B,Q){Q&&B.text(B=>Dr(Q[B]))}function kr(B,Q){Q&&B.text(([B])=>Dr(Q[B]))}function Mr(B,{target:Q,tip:F},{ariaLabel:U,title:t,fill:s,fillOpacity:I,stroke:g,strokeOpacity:i,strokeWidth:l,opacity:c,href:e}){U&&Bx(B,"aria-label",B=>U[B]),s&&Bx(B,"fill",B=>s[B]),I&&Bx(B,"fill-opacity",B=>I[B]),g&&Bx(B,"stroke",B=>g[B]),i&&Bx(B,"stroke-opacity",B=>i[B]),l&&Bx(B,"stroke-width",B=>l[B]),c&&Bx(B,"opacity",B=>c[B]),e&&qr(B,B=>e[B],Q),F||function(B,Q){Q&&B.filter(B=>va(Q[B])).append("title").call(vr,Q)}(B,t)}function Tr(B,{target:Q,tip:F},{ariaLabel:U,title:t,fill:s,fillOpacity:I,stroke:g,strokeOpacity:i,strokeWidth:l,opacity:c,href:e}){U&&Bx(B,"aria-label",([B])=>U[B]),s&&Bx(B,"fill",([B])=>s[B]),I&&Bx(B,"fill-opacity",([B])=>I[B]),g&&Bx(B,"stroke",([B])=>g[B]),i&&Bx(B,"stroke-opacity",([B])=>i[B]),l&&Bx(B,"stroke-width",([B])=>l[B]),c&&Bx(B,"opacity",([B])=>c[B]),e&&qr(B,([B])=>e[B],Q),F||function(B,Q){Q&&B.filter(([B])=>va(Q[B])).append("title").call(kr,Q)}(B,t)}function*zr(B,Q,F,U){const{z:t}=F,{z:s}=U,I=function({ariaLabel:B,title:Q,fill:F,fillOpacity:U,stroke:t,strokeOpacity:s,strokeWidth:I,opacity:g,href:i},{tip:l}){return[B,l?void 0:Q,F,U,t,s,I,g,i].filter(B=>void 0!==B)}(U,F),g=[...Q,...I];for(const Q of s?function(B,Q,F){const U=NB(B,B=>Q[B]);return void 0===F&&U.size>1+B.length>>1&&uu("Warning: the implicit z channel has high cardinality. This may occur when the fill or stroke channel is associated with quantitative data rather than ordinal or categorical data. You can suppress this warning by setting the z option explicitly; if this data represents a single series, set z to null."),U.values()}(B,s,t):[B]){let B,F;B:for(const U of Q){for(const B of g)if(!fa(B[U])){F&&F.push(-1);continue B}if(void 0!==B){F.push(U);for(let Q=0;Q<I.length;++Q){if(Co(I[Q][U])!==B[Q]){yield F,B=I.map(B=>Co(B[U])),F=[U];continue B}}}else F&&(yield F),B=I.map(B=>Co(B[U])),F=[U]}F&&(yield F)}}function Kr(B,Q,F,U){let t;const{clip:s=U.clip}=Q;"frame"===s?(B=mr("svg:g",U).each(function(){this.appendChild(B.node()),B.node=()=>this}),t=Or(U,F)):s&&(t=function(B,Q){let F,U;(F=Pr.get(Q))||Pr.set(Q,F=new WeakMap);"Sphere"===B.type&&(B=jr);if(!(U=F.get(B))){const t=wr();fF(Q.ownerSVGElement).append("clipPath").attr("id",t).append("path").attr("d",Q.path()(B)),F.set(B,U=`url(#${t})`)}return U}(s,U)),Bx(B,"aria-label",Q.ariaLabel),Bx(B,"aria-description",Q.ariaDescription),Bx(B,"aria-hidden",Q.ariaHidden),Bx(B,"clip-path",t)}const Or=function(B){const Q=new WeakMap;return(F,U)=>{let t=Q.get(F);if(!t){const s=wr();fF(F.ownerSVGElement).append("clipPath").attr("id",s).call(B,F,U),Q.set(F,t=`url(#${s})`)}return t}}((B,Q,F)=>{const{width:U,height:t,marginLeft:s,marginRight:I,marginTop:g,marginBottom:i}=F;B.append("rect").attr("x",s).attr("y",g).attr("width",U-I-s).attr("height",t-g-i)}),Pr=new WeakMap,jr={type:"Sphere"};function _r(B,Q,F,U){Kr(B,Q,F,U),Bx(B,"class",Q.className),Bx(B,"fill",Q.fill),Bx(B,"fill-opacity",Q.fillOpacity),Bx(B,"stroke",Q.stroke),Bx(B,"stroke-width",Q.strokeWidth),Bx(B,"stroke-opacity",Q.strokeOpacity),Bx(B,"stroke-linejoin",Q.strokeLinejoin),Bx(B,"stroke-linecap",Q.strokeLinecap),Bx(B,"stroke-miterlimit",Q.strokeMiterlimit),Bx(B,"stroke-dasharray",Q.strokeDasharray),Bx(B,"stroke-dashoffset",Q.strokeDashoffset),Bx(B,"shape-rendering",Q.shapeRendering),Bx(B,"filter",Q.imageFilter),Bx(B,"paint-order",Q.paintOrder);const{pointerEvents:t=(!1===U.pointerSticky?"none":void 0)}=Q;Bx(B,"pointer-events",t)}function $r(B,Q){!function(B,Q,F){null!=F&&B.style(Q,F)}(B,"mix-blend-mode",Q.mixBlendMode),Bx(B,"opacity",Q.opacity)}function qr(B,Q,F){B.each(function(B){const U=Q(B);if(null!=U){const B=this.ownerDocument.createElementNS(ZQ.svg,"a");B.setAttribute("fill","inherit"),B.setAttributeNS(ZQ.xlink,"href",U),null!=F&&B.setAttribute("target",F),this.parentNode.insertBefore(B,this).appendChild(this)}})}function Bx(B,Q,F){null!=F&&B.attr(Q,F)}function Qx(B,Q,{x:F,y:U},t=Yr,s=Yr){t+=Q.dx,s+=Q.dy,F?.bandwidth&&(t+=F.bandwidth()/2),U?.bandwidth&&(s+=U.bandwidth()/2),(t||s)&&B.attr("transform",`translate(${t},${s})`)}function Fx(B,Q){if((B=Yb(B))!==Q)return B}function Ux(B,Q){if((B=fb(B))!==Q)return B}const tx=/^-?([_a-z]|[\240-\377]|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])([_a-z0-9-]|[\240-\377]|\\[0-9a-f]{1,6}(\r\n|[ \t\r\n\f])?|\\[^\r\n\f0-9a-f])*$/i;function sx(B){if(void 0===B)return"plot-d6a7b5";if(B=`${B}`,!tx.test(B))throw new Error(`invalid class name: ${B}`);return B}function Ix(B,Q){if("string"==typeof Q)B.property("style",Q);else if(null!=Q)for(const F of B)Object.assign(F.style,Q)}function gx({frameAnchor:B},{width:Q,height:F,marginTop:U,marginRight:t,marginBottom:s,marginLeft:I}){return[/left$/.test(B)?I:/right$/.test(B)?Q-t:(I+Q-t)/2,/^top/.test(B)?U:/^bottom/.test(B)?F-s:(U+F-s)/2]}class ix{constructor(B,Q={},F={},U){const{facet:t="auto",facetAnchor:s,fx:I,fy:g,sort:i,dx:l=0,dy:c=0,margin:e=0,marginTop:n=e,marginRight:d=e,marginBottom:C=e,marginLeft:a=e,className:b,clip:o=U?.clip,channels:G,tip:u,render:r}=F;if(this.data=B,this.sort=Io(i)?i:null,this.initializer=tG(F).initializer,this.transform=this.initializer?F.transform:UG(F).transform,null===t||!1===t?this.facet=null:(this.facet=jb(!0===t?"include":t,"facet",["auto","include","exclude","super"]),this.fx=B===Nb&&"string"==typeof I?[I]:I,this.fy=B===Nb&&"string"==typeof g?[g]:g),this.facetAnchor=function(B){if(null==B)return null;const Q=Ir.get(`${B}`.toLowerCase());if(Q)return Q;throw new Error(`invalid facet anchor: ${B}`)}(s),Q=fo(Q),void 0!==G&&(Q={...ex(G),...Q}),void 0!==U&&(Q={...Jr(this,F,U),...Q}),this.channels=Object.fromEntries(Object.entries(Q).map(([Q,F])=>{if(so(F.value)){const{value:B,label:Q=F.label,scale:U=F.scale}=F.value;F={...F,label:Q,scale:U,value:B}}if(B===Nb&&"string"==typeof F.value){const{value:B}=F;F={...F,value:[B]}}return[Q,F]}).filter(([B,{value:Q,optional:F}])=>{if(null!=Q)return!0;if(F)return!1;throw new Error(`missing channel value: ${B}`)})),this.dx=+l,this.dy=+c,this.marginTop=+n,this.marginRight=+d,this.marginBottom=+C,this.marginLeft=+a,this.clip=wo(o),this.tip=function(B){return!0===B?"xy":!1===B||null==B?null:"string"==typeof B?jb(B,"tip",["x","y","xy"]):B}(u),this.className=Yb(b),"super"===this.facet){if(I||g)throw new Error("super-faceting cannot use fx or fy");for(const B in this.channels){const{scale:F}=Q[B];if("x"===F||"y"===F)throw new Error("super-faceting cannot use x or y")}}null!=r&&(this.render=cx(r,this.render))}initialize(B,Q,F){let U=_b(this.data);void 0===B&&null!=U&&(B=[co(U)]);const t=B;null!=this.transform&&(({facets:B,data:U}=this.transform(U,B,F)),U=_b(U)),void 0!==B&&(B.original=t);const s=function(B,Q){return Object.fromEntries(Object.entries(B).map(([B,F])=>[B,mG(Q,F,B)]))}(this.channels,U);return null!=this.sort&&function(B,Q,F,U,t){const{order:s,reverse:I,reduce:g=!0,limit:i}=t;for(const l in t){if(!jo.has(l))continue;let{value:c,order:e=s,reverse:n=I,reduce:d=g,limit:C=i}=ho(t[l]);const a=c?.startsWith("-");if(a&&(c=c.slice(1)),e=void 0===e?a!==("width"===c||"height"===c)?YG:DG:HG(e),null==d||!1===d)continue;const b="fx"===l||"fy"===l?XG(Q,U[l]):NG(F,l);if(!b)throw new Error(`missing channel for scale: ${l}`);const o=b.value,[G=0,u=1/0]=Ro(C)?C:C<0?[C]:[0,C];if(null==c)b.domain=()=>{let B=Array.from(new yB(o));return n&&(B=B.reverse()),0===G&&u===1/0||(B=B.slice(G,u)),B};else{const Q="data"===c?B:"height"===c?pG(F,"y1","y2"):"width"===c?pG(F,"x1","x2"):WG(F,c,"y"===c?"y2":"x"===c?"x2":void 0),U=oG(!0===d?"max":d,Q);b.domain=()=>{let B=pB(co(o),B=>U.reduceIndex(B,Q),B=>o[B]);return e&&B.sort(e),n&&B.reverse(),0===G&&u===1/0||(B=B.slice(G,u)),B.map(wb)}}}}(U,B,s,Q,this.sort),{data:U,facets:B,channels:s}}filter(B,Q,F){for(const U in Q){const{filter:t=fa}=Q[U];if(null!==t){const Q=F[U];B=B.filter(B=>t(Q[B]))}}return B}project(B,Q,F){for(const U in B)if("x"===B[U].scale&&/^x|x$/.test(U)){const t=U.replace(/^x|x$/,"y");t in B&&"y"===B[t].scale&&yr(U,t,Q,F.projection)}}scale(B,Q,F){const U=function(B,Q){const F=Object.fromEntries(Object.entries(B).map(([B,{scale:F,value:U}])=>{const t=null==F?null:Q[F];return[B,null==t?U:Bo(U,t)]}));return F.channels=B,F}(B,Q);return F.projection&&this.project(B,U,F),U}}function lx(...B){return B.plot=ix.prototype.plot,B}function cx(B,Q){if(null==B)return null===Q?void 0:Q;if(null==Q)return null===B?void 0:B;if("function"!=typeof B)throw new TypeError(`invalid render transform: ${B}`);if("function"!=typeof Q)throw new TypeError(`invalid render transform: ${Q}`);return function(F,U,t,s,I,g){return B.call(this,F,U,t,s,I,(B,F,U,t,s)=>Q.call(this,B,F,U,t,s,g))}}function ex(B){return Object.fromEntries(Object.entries(fo(B)).map(([B,Q])=>(void 0===(Q="string"==typeof Q?{value:Q,label:B}:ho(Q)).filter&&null==Q.scale&&(Q={...Q,filter:null}),[B,Q])))}function nx(B,Q){return!0===B?.tip?{...B,tip:Q}:Uo(B?.tip)&&void 0===B.tip.pointer?{...B,tip:{...B.tip,pointer:Q}}:B}function dx({x:B,y:Q,fy:F,fx:U},{projection:t,aspectRatio:s},{width:I,marginTopDefault:g,marginRightDefault:i,marginBottomDefault:l,marginLeftDefault:c}){const e=F&&F.scale.domain().length||1,n=function(B){if("function"==typeof B?.stream)return ur;if(Uo(B)){let Q,F;if(({domain:Q,type:B,...F}=B),null!=Q&&null!=B){const U="string"==typeof B?xr(B).type:B,[[t,s],[I,g]]=gi(U({...F,width:100,height:100})).bounds(Q),i=(g-s)/(I-t);return i&&isFinite(i)?i<.2?.2:i>5?5:i:ur}}if(null!=B){if("function"!=typeof B){const{aspectRatio:Q}=xr(B);if(Q)return Q}return ur}}(t);if(n){const B=(1.1*e-.1)/(1.1*(U?U.scale.domain().length:1)-.1)*n,Q=Math.max(.1,Math.min(10,B));return Math.round((I-c-i)*Q+g+l)}const d=Q?_u(Q)?Q.scale.domain().length||1:Math.max(7,17/e):1;if(null!=s){if(s=+s,!(isFinite(s)&&s>0))throw new Error(`invalid aspectRatio: ${s}`);const t=Cx("y",Q)/(Cx("x",B)*s),e=U?U.scale.bandwidth():1,n=F?F.scale.bandwidth():1;return(t*(e*(I-c-i)-B.insetLeft-B.insetRight)+Q.insetTop+Q.insetBottom)/n+g+l}return!(!Q&&!F)*Math.max(1,Math.min(60,d*e))*20+30*!!U+60}function Cx(B,Q){if(!Q)throw new Error(`aspectRatio requires ${B} scale`);const{type:F,domain:U}=Q;let t;switch(F){case"linear":case"utc":case"time":t=Number;break;case"pow":{const B=Q.scale.exponent();t=Q=>Math.pow(Q,B);break}case"log":t=Math.log;break;case"point":case"band":return U.length;default:throw new Error(`unsupported ${B} scale for aspectRatio: ${F}`)}const[s,I]=AB(U);return Math.abs(t(I)-t(s))}const ax=new WeakMap;function bx(B,Q,{x:F,y:U,px:t,py:s,maxRadius:I=40,channels:g,render:i,...l}={}){return I=+I,null!=t&&(F??=null,g={...g,px:{value:t,scale:"x"}}),null!=s&&(U??=null,g={...g,py:{value:s,scale:"y"}}),{x:F,y:U,channels:g,...l,render:cx(function(F,U,t,s,g,i){const l=(g={...g,pointerSticky:!1}).ownerSVGElement,{data:c}=g.getMarkState(this);let e=ax.get(l);e||ax.set(l,e={sticky:!1,roots:[],renders:[]});let n=e.renders.push(N)-1;const{x:d,y:C,fx:a,fy:b}=U;let o=a?a(F.fx)-s.marginLeft:0,G=b?b(F.fy)-s.marginTop:0;d?.bandwidth&&(o+=d.bandwidth()/2),C?.bandwidth&&(G+=C.bandwidth()/2);const u=null!=F.fi;let r;if(u){let B=e.facetStates;B||(e.facetStates=B=new Map),r=B.get(this),r||B.set(this,r=new Map)}const[x,L]=gx(this,s),{px:A,py:h}=t,R=A?B=>A[B]:rx(t,x),y=h?B=>h[B]:xx(t,L);let V,Z,S,m;function E(B,Q){if(u){if(m&&(m=cancelAnimationFrame(m)),null!=B)return r.set(F.fi,Q),void(m=requestAnimationFrame(()=>{m=null;for(const[U,t]of r)if(t<Q||t===Q&&U<F.fi){B=null;break}N(B)}));r.delete(F.fi)}N(B)}function N(B){if(V===B&&S===e.sticky)return;V=B,S=g.pointerSticky=e.sticky;const Q=null==V?[]:[V];u&&(Q.fx=F.fx,Q.fy=F.fy,Q.fi=F.fi);const I=i(Q,U,t,s,g);if(Z){if(u){const B=Z.parentNode,Q=Z.getAttribute("transform"),F=I.getAttribute("transform");Q?I.setAttribute("transform",Q):I.removeAttribute("transform"),F?B.setAttribute("transform",F):B.removeAttribute("transform"),I.removeAttribute("aria-label"),I.removeAttribute("aria-description"),I.removeAttribute("aria-hidden")}Z.replaceWith(I)}if(e.roots[n]=Z=I,!(null==V&&r?.size>1)){const B=null==V?null:Ab(c)?c[V]:c.get(V);g.dispatchValue(B)}return I}function X(U){if(e.sticky||"mouse"===U.pointerType&&1===U.buttons)return;let[t,g]=wF(U);t-=o,g-=G;const i=t<s.marginLeft||t>s.width-s.marginRight?1:B,l=g<s.marginTop||g>s.height-s.marginBottom?1:Q;let c=null,n=I*I;for(const B of F){const Q=i*(R(B)-t),F=l*(y(B)-g),U=Q*Q+F*F;U<=n&&(c=B,n=U)}if(null!=c&&(1!==B||1!==Q)){const B=R(c)-t,Q=y(c)-g;n=B*B+Q*Q}E(c,n)}return l.addEventListener("pointerenter",X),l.addEventListener("pointermove",X),l.addEventListener("pointerdown",function(B){"mouse"===B.pointerType&&null!=V&&(e.sticky&&e.roots.some(Q=>Q?.contains(B.target))||(e.sticky?(e.sticky=!1,e.renders.forEach(B=>B(null))):(e.sticky=!0,N(V)),B.stopImmediatePropagation()))}),l.addEventListener("pointerleave",function(B){"mouse"===B.pointerType&&(e.sticky||E(null))}),N(null)},i)}}function ox(B){return bx(1,1,B)}function Gx(B){return bx(1,.01,B)}function ux(B){return bx(.01,1,B)}function rx({x1:B,x2:Q,x:F=B},U){return B&&Q?F=>(B[F]+Q[F])/2:F?B=>F[B]:()=>U}function xx({y1:B,y2:Q,y:F=B},U){return B&&Q?F=>(B[F]+Q[F])/2:F?B=>F[B]:()=>U}function Lx(B){return _u(B)&&void 0===B.interval?void 0:"tabular-nums"}const Ax=Math.PI/180;function hx(B,{marker:Q,markerStart:F=Q,markerMid:U=Q,markerEnd:t=Q}={}){B.markerStart=Rx(F),B.markerMid=Rx(U),B.markerEnd=Rx(t)}function Rx(B){if(null==B||!1===B)return null;if(!0===B)return Zx;if("function"==typeof B)return B;switch(`${B}`.toLowerCase()){case"none":return null;case"arrow":return yx("auto");case"arrow-reverse":return yx("auto-start-reverse");case"dot":return Vx;case"circle":case"circle-fill":return Zx;case"circle-stroke":return Sx;case"tick":return mx("auto");case"tick-x":return mx(90);case"tick-y":return mx(0)}throw new Error(`invalid marker: ${B}`)}function yx(B){return(Q,F)=>mr("svg:marker",F).attr("viewBox","-5 -5 10 10").attr("markerWidth",6.67).attr("markerHeight",6.67).attr("orient",B).attr("fill","none").attr("stroke",Q).attr("stroke-width",1.5).attr("stroke-linecap","round").attr("stroke-linejoin","round").call(B=>B.append("path").attr("d","M-1.5,-3l3,3l-3,3")).node()}function Vx(B,Q){return mr("svg:marker",Q).attr("viewBox","-5 -5 10 10").attr("markerWidth",6.67).attr("markerHeight",6.67).attr("fill",B).attr("stroke","none").call(B=>B.append("circle").attr("r",2.5)).node()}function Zx(B,Q){return mr("svg:marker",Q).attr("viewBox","-5 -5 10 10").attr("markerWidth",6.67).attr("markerHeight",6.67).attr("fill",B).attr("stroke","var(--plot-background)").attr("stroke-width",1.5).call(B=>B.append("circle").attr("r",3)).node()}function Sx(B,Q){return mr("svg:marker",Q).attr("viewBox","-5 -5 10 10").attr("markerWidth",6.67).attr("markerHeight",6.67).attr("fill","var(--plot-background)").attr("stroke",B).attr("stroke-width",1.5).call(B=>B.append("circle").attr("r",3)).node()}function mx(B){return(Q,F)=>mr("svg:marker",F).attr("viewBox","-3 -3 6 6").attr("markerWidth",6).attr("markerHeight",6).attr("orient",B).attr("stroke",Q).call(B=>B.append("path").attr("d","M0,-3v6")).node()}let Ex=0;function Nx(B,Q,{stroke:F},U){return Hx(B,Q,F&&(B=>F[B]),null,U)}function Xx(B,Q,{stroke:F,z:U},t){return Hx(B,Q,F&&(([B])=>F[B]),U,t)}const px=1,Wx=2;function Hx(B,{markerStart:Q,markerMid:F,markerEnd:U,stroke:t},s=()=>t,I,g){if(!Q&&!F&&!U)return;const i=new Map,l=I&&function(B,Q){const F=new Uint8Array(Q.length),U=B.data().filter(B=>B.length>1),t=U.length;for(let B=0,s=Er;B<t;++B){const t=U[B];if(t.length>1){const B=t[0];s!==(s=Co(Q[B]))&&(F[B]|=px)}}for(let B=t-1,s=Er;B>=0;--B){const t=U[B];if(t.length>1){const B=t[0];s!==(s=Co(Q[B]))&&(F[B]|=Wx)}}return([B])=>F[B]}(B,I);function c(B,Q,F){return function(U){if(F&&!F(U))return;const t=s(U);let I=i.get(Q);I||i.set(Q,I=new Map);let l=I.get(t);if(!l){const B=this.parentNode.insertBefore(Q(t,g),this),F="plot-marker-"+ ++Ex;B.setAttribute("id",F),I.set(t,l=`url(#${F})`)}this.setAttribute(B,l)}}Q&&B.each(c("marker-start",Q,l&&(B=>l(B)&px))),F&&l&&B.each(c("marker-start",F,B=>!(l(B)&px))),F&&B.each(c("marker-mid",F)),U&&B.each(c("marker-end",U,l&&(B=>l(B)&Wx)))}function Dx({inset:B,insetLeft:Q,insetRight:F,...U}={}){return[Q,F]=fx(B,Q,F),{inset:B,insetLeft:Q,insetRight:F,...U}}function Yx({inset:B,insetTop:Q,insetBottom:F,...U}={}){return[Q,F]=fx(B,Q,F),{inset:B,insetTop:Q,insetBottom:F,...U}}function fx(B,Q,F){return void 0===B&&void 0===Q&&void 0===F?Yr?[1,0]:[.5,.5]:[Q,F]}function wx(B,{interval:Q}){return(B={...ho(B)}).interval=xo(void 0===B.interval?Q:B.interval),B}function Jx(B,Q,F,U){const{[B]:t,[`${B}1`]:s,[`${B}2`]:I}=F,{value:g,interval:i}=wx(t,F);if(null==g||null==i&&!U)return F;const l=oo(t);if(null==i){let Q;const t={transform:B=>Q||(Q=Vb(B,g)),label:l};return{...F,[B]:void 0,[`${B}1`]:void 0===s?t:s,[`${B}2`]:void 0!==I||s===I&&U?I:t}}let c,e;function n(B){return void 0!==e&&B===c?e:e=Bo(Vb(c=B,g),B=>i.floor(B))}return Q({...F,[B]:void 0,[`${B}1`]:void 0===s?{transform:n,label:l}:s,[`${B}2`]:void 0===I?{transform:B=>n(B).map(B=>i.offset(B)),label:l}:I})}function vx(B,Q,F){const{[B]:U}=F,{value:t,interval:s}=wx(U,F);return null==t||null==s?F:Q({...F,[B]:{label:oo(U),transform:B=>{const Q=Bo(Vb(B,t),B=>s.floor(B)),F=Q.map(B=>s.offset(B));return Q.map(Zo(Q)?(B,Q)=>null==B||isNaN(B=+B)||null==(Q=F[Q])||isNaN(Q=+Q)?void 0:new Date((B+Q)/2):(B,Q)=>null==B||null==(Q=F[Q])?NaN:(+B+ +Q)/2)}}})}const kx={ariaLabel:"rule",fill:null,stroke:"currentColor"};class Mx extends ix{constructor(B,Q={}){const{x:F,y1:U,y2:t,inset:s=0,insetTop:I=s,insetBottom:g=s}=Q;super(B,{x:{value:F,scale:"x",optional:!0},y1:{value:U,scale:"y",optional:!0},y2:{value:t,scale:"y",optional:!0}},nx(Q,"x"),kx),this.insetTop=fb(I),this.insetBottom=fb(g),hx(this,Q)}render(B,Q,F,U,t){const{x:s,y:I}=Q,{x:g,y1:i,y2:l}=F,{width:c,height:e,marginTop:n,marginRight:d,marginLeft:C,marginBottom:a}=U,{insetTop:b,insetBottom:o}=this;return mr("svg:g",t).call(_r,this,U,t).call(Qx,this,{x:g&&s},Yr,0).call(Q=>Q.selectAll().data(B).enter().append("line").call($r,this).attr("x1",g?B=>g[B]:(C+c-d)/2).attr("x2",g?B=>g[B]:(C+c-d)/2).attr("y1",i&&!qu(I)?B=>i[B]+b:n+b).attr("y2",l&&!qu(I)?I.bandwidth?B=>l[B]+I.bandwidth()-o:B=>l[B]-o:e-a-o).call(Mr,this,F).call(Nx,this,F,t)).node()}}class Tx extends ix{constructor(B,Q={}){const{x1:F,x2:U,y:t,inset:s=0,insetRight:I=s,insetLeft:g=s}=Q;super(B,{y:{value:t,scale:"y",optional:!0},x1:{value:F,scale:"x",optional:!0},x2:{value:U,scale:"x",optional:!0}},nx(Q,"y"),kx),this.insetRight=fb(I),this.insetLeft=fb(g),hx(this,Q)}render(B,Q,F,U,t){const{x:s,y:I}=Q,{y:g,x1:i,x2:l}=F,{width:c,height:e,marginTop:n,marginRight:d,marginLeft:C,marginBottom:a}=U,{insetLeft:b,insetRight:o}=this;return mr("svg:g",t).call(_r,this,U,t).call(Qx,this,{y:g&&I},0,Yr).call(Q=>Q.selectAll().data(B).enter().append("line").call($r,this).attr("x1",i&&!qu(s)?B=>i[B]+b:C+b).attr("x2",l&&!qu(s)?s.bandwidth?B=>l[B]+s.bandwidth()-o:B=>l[B]-o:c-d-o).attr("y1",g?B=>g[B]:(n+e-a)/2).attr("y2",g?B=>g[B]:(n+e-a)/2).call(Mr,this,F).call(Nx,this,F,t)).node()}}function zx(B,Q){let{x:F=Wb,y:U,y1:t,y2:s,...I}=function(B={}){return Jx("y",Yx,B)}(Q);return[t,s]=Ox(U,t,s),new Mx(B,{...I,x:F,y1:t,y2:s})}function Kx(B,Q){let{y:F=Wb,x:U,x1:t,x2:s,...I}=function(B={}){return Jx("x",Dx,B)}(Q);return[t,s]=Ox(U,t,s),new Tx(B,{...I,y:F,x1:t,x2:s})}function Ox(B,Q,F){if(null==B){if(void 0===Q){if(void 0!==F)return[0,F]}else if(void 0===F)return[0,Q]}else{if(void 0===Q)return void 0===F?[0,B]:[B,F];if(void 0===F)return[B,Q]}return[Q,F]}function Px(B,...Q){let F=Q.length;for(let U=0,t=!0;U<F;++U)"function"!=typeof Q[U]&&(t&&(B=B.slice(),t=!1),B.splice(U,2,B[U]+Q[U]+B[U+1]),Q.splice(U,1),--U,--F);return U=>{let t=B[0];for(let s=0;s<F;++s)t+=Q[s](U)+B[s+1];return t}}const jx={ariaLabel:"text",strokeLinejoin:"round",strokeWidth:3,paintOrder:"stroke"};class _x extends ix{constructor(B,Q={}){const{x:F,y:U,text:t=(Ro(B)&&yo(B)?Wb:pb),frameAnchor:s,textAnchor:I=(/right$/i.test(s)?"end":/left$/i.test(s)?"start":"middle"),lineAnchor:g=(/^top/i.test(s)?"top":/^bottom/i.test(s)?"bottom":"middle"),lineHeight:i=1,lineWidth:l=1/0,textOverflow:c,monospace:e,fontFamily:n=(e?"ui-monospace, monospace":void 0),fontSize:d,fontStyle:C,fontVariant:a,fontWeight:b,rotate:o}=Q,[G,u]=Ob(o,0),[r,x]=function(B){return null==B||"number"==typeof B?[void 0,B]:"string"!=typeof B?[B,void 0]:(B=B.trim().toLowerCase(),tL.has(B)||/^[+-]?\d*\.?\d+(e[+-]?\d+)?(\w*|%)$/.test(B)?[void 0,B]:[B,void 0])}(d);var L;if(super(B,{x:{value:F,scale:"x",optional:!0},y:{value:U,scale:"y",optional:!0},fontSize:{value:r,optional:!0},rotate:{value:(L=G,null==L?null:{transform:B=>Vb(B,L,Float64Array),label:oo(L)}),optional:!0},text:{value:t,filter:va,optional:!0}},Q,jx),this.rotate=u,this.textAnchor=Fx(I,"middle"),this.lineAnchor=jb(g,"lineAnchor",["top","middle","bottom"]),this.lineHeight=+i,this.lineWidth=+l,this.textOverflow=$x(c),this.monospace=!!e,this.fontFamily=Yb(n),this.fontSize=x,this.fontStyle=Yb(C),this.fontVariant=Yb(a),this.fontWeight=Yb(b),this.frameAnchor=Yo(s),!(this.lineWidth>=0))throw new Error(`invalid lineWidth: ${l}`);this.splitLines=lL(this),this.clipLine=cL(this)}render(B,Q,F,U,t){const{x:s,y:I}=Q,{x:g,y:i,rotate:l,text:c,title:e,fontSize:n}=F,{rotate:d}=this,[C,a]=gx(this,U);return mr("svg:g",t).call(_r,this,U,t).call(UL,this,c,U).call(Qx,this,{x:g&&s,y:i&&I}).call(Q=>Q.selectAll().data(B).enter().append("text").call($r,this).call(qx,this,c,e).attr("transform",Px`translate(${g?B=>g[B]:C},${i?B=>i[B]:a})${l?B=>` rotate(${l[B]})`:d?` rotate(${d})`:""}`).call(Bx,"font-size",n&&(B=>n[B])).call(Mr,this,F)).node()}}function $x(B){return null==B?null:jb(B,"textOverflow",["clip","ellipsis","clip-start","clip-end","ellipsis-start","ellipsis-middle","ellipsis-end"]).replace(/^(clip|ellipsis)$/,"$1-end")}function qx(B,Q,F,U){if(!F)return;const{lineAnchor:t,lineHeight:s,textOverflow:I,splitLines:g,clipLine:i}=Q;B.each(function(B){const Q=g(Dr(F[B])??"").map(i),l=Q.length,c="top"===t?.71:"bottom"===t?1-l:(164-100*l)/200;if(l>1){let B=0;for(let F=0;F<l;++F){if(++B,!Q[F])continue;const U=this.ownerDocument.createElementNS(ZQ.svg,"tspan");U.setAttribute("x",0),F===B-1?U.setAttribute("y",(c+F)*s+"em"):U.setAttribute("dy",B*s+"em"),U.textContent=Q[F],this.appendChild(U),B=0}}else c&&this.setAttribute("y",c*s+"em"),this.textContent=Q[0];if(I&&!U&&Q[0]!==F[B]){const Q=this.ownerDocument.createElementNS(ZQ.svg,"title");Q.textContent=F[B],this.appendChild(Q)}})}function BL(B,{x:Q,y:F,...U}={}){return void 0===U.frameAnchor&&([Q,F]=go(Q,F)),new _x(B,{...U,x:Q,y:F})}function QL(B,{x:Q=Wb,...F}={}){return new _x(B,function(B={}){return vx("y",Yx,B)}({...F,x:Q}))}function FL(B,{y:Q=Wb,...F}={}){return new _x(B,function(B={}){return vx("x",Dx,B)}({...F,y:Q}))}function UL(B,Q,F){Bx(B,"text-anchor",Q.textAnchor),Bx(B,"font-family",Q.fontFamily),Bx(B,"font-size",Q.fontSize),Bx(B,"font-style",Q.fontStyle),Bx(B,"font-variant",void 0===Q.fontVariant?function(B){return B&&(function(B){for(const Q of B)if(null!=Q)return"number"==typeof Q}(B)||Zo(B))?"tabular-nums":void 0}(F):Q.fontVariant),Bx(B,"font-weight",Q.fontWeight)}const tL=new Set(["inherit","initial","revert","unset","xx-small","x-small","small","medium","large","x-large","xx-large","xxx-large","larger","smaller"]);function sL(B,Q,F){const U=[];let t,s=0;for(const[I,g,i]of function*(B){let Q=0,F=0;const U=B.length;for(;F<U;){let U=1;switch(B[F]){case"­":case"-":++F,yield[Q,F,!1],Q=F;break;case" ":for(yield[Q,F,!1];" "===B[++F];);Q=F;break;case"\r":"\n"===B[F+1]&&++U;case"\n":yield[Q,F,!0],F+=U,Q=F;break;default:++F}}yield[Q,F,!0]}(B))void 0===t&&(t=I),s>t&&F(B,t,g)>Q&&(U.push(B.slice(t,s)+("­"===B[s-1]?"-":"")),t=I),i?(U.push(B.slice(t,g)),t=void 0):s=g;return U}const IL={a:56,b:63,c:57,d:63,e:58,f:37,g:62,h:60,i:26,j:26,k:55,l:26,m:88,n:60,o:60,p:62,q:62,r:39,s:54,t:38,u:60,v:55,w:79,x:54,y:55,z:55,A:69,B:67,C:73,D:74,E:61,F:58,G:76,H:75,I:28,J:55,K:67,L:58,M:89,N:75,O:78,P:65,Q:78,R:67,S:65,T:65,U:75,V:69,W:98,X:69,Y:67,Z:67,0:64,1:48,2:62,3:64,4:66,5:63,6:65,7:58,8:65,9:65," ":29,"!":32,'"':49,"'":31,"(":39,")":39,",":31,"-":48,".":31,"/":32,":":31,";":31,"?":52,"‘":31,"’":31,"“":47,"”":47,"…":82};function gL(B,Q=0,F=B.length){let U=0;for(let t=Q;t<F;t=oL(B,t))U+=IL[B[t]]??(uL(B,t)?120:IL.e);return U}function iL(B,Q=0,F=B.length){let U=0;for(let t=Q;t<F;t=oL(B,t))U+=uL(B,t)?126:63;return U}function lL({monospace:B,lineWidth:Q,textOverflow:F}){if(null!=F||Q==1/0)return B=>B.split(/\r\n?|\n/g);const U=B?iL:gL,t=100*Q;return B=>sL(B,t,U)}function cL({monospace:B,lineWidth:Q,textOverflow:F}){if(null==F||Q==1/0)return B=>B;const U=B?iL:gL,t=100*Q;switch(F){case"clip-start":return B=>CL(B,t,U,"");case"clip-end":return B=>dL(B,t,U,"");case"ellipsis-start":return B=>CL(B,t,U,eL);case"ellipsis-middle":return B=>function(B,Q,F,U){B=B.trim();const t=F(B);if(t<=Q)return B;const s=F(U)/2,[I,g]=nL(B,Q/2,F,s),[i]=nL(B,t-Q/2-g+s,F,-s);return i<0?U:B.slice(0,I).trimEnd()+U+B.slice(oL(B,i)).trimStart()}(B,t,U,eL);case"ellipsis-end":return B=>dL(B,t,U,eL)}}const eL="…";function nL(B,Q,F,U){const t=[];let s=0;for(let I=0,g=0,i=B.length;I<i;I=g){g=oL(B,I);const i=F(B,I,g);if(s+i>Q){for(s+=U;s>Q&&I>0;)g=I,I=t.pop(),s-=F(B,I,g);return[I,Q-s]}s+=i,t.push(I)}return[-1,0]}function dL(B,Q,F,U){B=B.trim();const t=F(U),[s]=nL(B,Q,F,t);return s<0?B:B.slice(0,s).trimEnd()+U}function CL(B,Q,F,U){const t=F(B=B.trim());if(t<=Q)return B;const s=F(U),[I]=nL(B,t-Q+s,F,-s);return I<0?U:U+B.slice(oL(B,I)).trimStart()}const aL=/[\p{Combining_Mark}\p{Emoji_Modifier}]+/uy,bL=/\p{Extended_Pictographic}/uy;function oL(B,Q){return Q+=function(B,Q){const F=B.charCodeAt(Q);if(F>=55296&&F<56320){const F=B.charCodeAt(Q+1);return F>=56320&&F<57344}return!1}(B,Q)?2:1,function(B,Q){return!GL(B,Q)&&(aL.lastIndex=Q,aL.test(B))}(B,Q)&&(Q=aL.lastIndex),function(B,Q){return 8205===B.charCodeAt(Q)}(B,Q)?oL(B,Q+1):Q}function GL(B,Q){return B.charCodeAt(Q)<128}function uL(B,Q){return!GL(B,Q)&&(bL.lastIndex=Q,bL.test(B))}const rL={ariaLabel:"vector",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinejoin:"round",strokeLinecap:"round"},xL=3.5,LL=5*xL,AL={draw(B,Q,F){const U=Q*F/LL;B.moveTo(0,0),B.lineTo(0,-Q),B.moveTo(-U,U-Q),B.lineTo(0,-Q),B.lineTo(U,U-Q)}},hL={draw(B,Q,F){B.moveTo(-F,0),B.lineTo(0,-Q),B.lineTo(F,0)}},RL=new Map([["arrow",AL],["spike",hL]]);class yL extends ix{constructor(B,Q={}){const{x:F,y:U,r:t=xL,length:s,rotate:I,shape:g=AL,anchor:i="middle",frameAnchor:l}=Q,[c,e]=Ob(s,12),[n,d]=Ob(I,0);super(B,{x:{value:F,scale:"x",optional:!0},y:{value:U,scale:"y",optional:!0},length:{value:c,scale:"length",optional:!0},rotate:{value:n,optional:!0}},Q,rL),this.r=+t,this.length=e,this.rotate=d,this.shape=function(B){if(function(B){return B&&"function"==typeof B.draw}(B))return B;const Q=RL.get(`${B}`.toLowerCase());if(Q)return Q;throw new Error(`invalid shape: ${B}`)}(g),this.anchor=jb(i,"anchor",["start","middle","end"]),this.frameAnchor=Yo(l)}render(B,Q,F,U,t){const{x:s,y:I}=Q,{x:g,y:i,length:l,rotate:c}=F,{length:e,rotate:n,anchor:d,shape:C,r:a}=this,[b,o]=gx(this,U);return mr("svg:g",t).call(_r,this,U,t).call(Qx,this,{x:g&&s,y:i&&I}).call(Q=>Q.selectAll().data(B).enter().append("path").call($r,this).attr("transform",Px`translate(${g?B=>g[B]:b},${i?B=>i[B]:o})${c?B=>` rotate(${c[B]})`:n?` rotate(${n})`:""}${"start"===d?"":"end"===d?l?B=>` translate(0,${l[B]})`:` translate(0,${e})`:l?B=>` translate(0,${l[B]/2})`:` translate(0,${e/2})`}`).attr("d",l?B=>{const Q=vs();return C.draw(Q,l[B],a),Q}:(()=>{const B=vs();return C.draw(B,e,a),B})()).call(Mr,this,F)).node()}}function VL(B,Q={}){const{x:F=Wb,...U}=Q;return new yL(B,{...U,x:F})}function ZL(B,Q={}){const{y:F=Wb,...U}=Q;return new yL(B,{...U,y:F})}function SL(B,Q){return arguments.length<2&&!Ro(B)&&(Q=B,B=null),void 0===Q&&(Q={}),[B,Q]}function mL({anchor:B}={},Q){return void 0===B?Q[0]:jb(B,"anchor",Q)}function EL(B){return mL(B,["left","right"])}function NL(B){return mL(B,["right","left"])}function XL(B){return mL(B,["bottom","top"])}function pL(B){return mL(B,["top","bottom"])}function WL(){const[B,Q]=SL(...arguments);return fL("y",EL(Q),B,Q)}function HL(){const[B,Q]=SL(...arguments);return fL("fy",NL(Q),B,Q)}function DL(){const[B,Q]=SL(...arguments);return wL("x",XL(Q),B,Q)}function YL(){const[B,Q]=SL(...arguments);return wL("fx",pL(Q),B,Q)}function fL(B,Q,F,{color:U="currentColor",opacity:t=1,stroke:s=U,strokeOpacity:I=t,strokeWidth:g=1,fill:i=U,fillOpacity:l=t,textAnchor:c,textStroke:e,textStrokeOpacity:n,textStrokeWidth:d,tickSize:C=("y"===B?6:0),tickPadding:a,tickRotate:b,x:o,margin:G,marginTop:u=(void 0===G?20:G),marginRight:r=(void 0===G?"right"===Q?40:0:G),marginBottom:x=(void 0===G?20:G),marginLeft:L=(void 0===G?"left"===Q?40:0:G),label:A,labelAnchor:h,labelArrow:R,labelOffset:y,ariaLabel:V=`${B}-axis`,...Z}){return C=fb(C),a=fb(a),b=fb(b),void 0!==h&&(h=jb(h,"labelAnchor",["center","top","bottom"])),R=sA(R),lx(C&&!Wo(s)?function(B,Q,F,{strokeWidth:U=1,strokeLinecap:t=null,strokeLinejoin:s=null,facetAnchor:I=Q+("y"===B?"-empty":""),frameAnchor:g=Q,tickSize:i,inset:l=0,insetLeft:c=l,insetRight:e=l,dx:n=0,y:d=("y"===B?void 0:null),ariaLabel:C,...a}){return PL(ZL,B,F,{ariaLabel:`${C} tick`,ariaHidden:!0},{strokeWidth:U,strokeLinecap:t,strokeLinejoin:s,facetAnchor:I,frameAnchor:g,y:d,...a,dx:"left"===Q?+n-Yr+ +c:+n+Yr-e,anchor:"start",length:i,shape:"left"===Q?QA:FA})}(B,Q,F,{stroke:s,strokeOpacity:I,strokeWidth:g,tickSize:C,tickPadding:a,tickRotate:b,x:o,ariaLabel:V,...Z}):null,Wo(i)?null:function(B,Q,F,{facetAnchor:U=Q+("y"===B?"-empty":""),frameAnchor:t=Q,tickSize:s,tickRotate:I=0,tickPadding:g=Math.max(3,9-s)+(Math.abs(I)>60?4*Math.cos(I*Ax):0),text:i,textAnchor:l=(Math.abs(I)>60?"middle":"left"===Q?"end":"start"),lineAnchor:c=(I>60?"top":I<-60?"bottom":"middle"),fontVariant:e,inset:n=0,insetLeft:d=n,insetRight:C=n,dx:a=0,ariaLabel:b,y:o=("y"===B?void 0:null),...G}){return PL(FL,B,F,{ariaLabel:`${b} tick label`},{facetAnchor:U,frameAnchor:t,text:i,textAnchor:l,lineAnchor:c,fontVariant:e,rotate:I,y:o,...G,dx:"left"===Q?+a-s-g+ +d:+a+ +s+ +g-C},function(B,F,U,t,s){void 0===e&&(this.fontVariant=UA(B)),void 0===i&&(s.text=jL(B,F,U,t,Q))})}(B,Q,F,{fill:i,fillOpacity:l,stroke:e,strokeOpacity:n,strokeWidth:d,textAnchor:c,tickSize:C,tickPadding:a,tickRotate:b,x:o,marginTop:u,marginRight:r,marginBottom:x,marginLeft:L,ariaLabel:V,...Z}),Wo(i)||null===A?null:BL([],OL({fill:i,fillOpacity:l,...Z},function(F,U,t,s,I){const g=s[B],{marginTop:i,marginRight:l,marginBottom:c,marginLeft:e}="y"===B&&I.inset||I,n=h??(g.bandwidth?"center":"top"),d=y??("right"===Q?l:e)-3;return"center"===n?(this.textAnchor=void 0,this.lineAnchor="right"===Q?"bottom":"top",this.frameAnchor=Q,this.rotate=-90):(this.textAnchor="right"===Q?"end":"start",this.lineAnchor=n,this.frameAnchor=`${n}-${Q}`,this.rotate=0),this.dy="top"===n?3-i:"bottom"===n?c-3:0,this.dx="right"===Q?d:-d,this.ariaLabel=`${V} label`,{facets:[[0]],channels:{text:{value:[tA(B,g,{anchor:Q,label:A,labelAnchor:n,labelArrow:R})]}}}})))}function wL(B,Q,F,{color:U="currentColor",opacity:t=1,stroke:s=U,strokeOpacity:I=t,strokeWidth:g=1,fill:i=U,fillOpacity:l=t,textAnchor:c,textStroke:e,textStrokeOpacity:n,textStrokeWidth:d,tickSize:C=("x"===B?6:0),tickPadding:a,tickRotate:b,y:o,margin:G,marginTop:u=(void 0===G?"top"===Q?30:0:G),marginRight:r=(void 0===G?20:G),marginBottom:x=(void 0===G?"bottom"===Q?30:0:G),marginLeft:L=(void 0===G?20:G),label:A,labelAnchor:h,labelArrow:R,labelOffset:y,ariaLabel:V=`${B}-axis`,...Z}){return C=fb(C),a=fb(a),b=fb(b),void 0!==h&&(h=jb(h,"labelAnchor",["center","left","right"])),R=sA(R),lx(C&&!Wo(s)?function(B,Q,F,{strokeWidth:U=1,strokeLinecap:t=null,strokeLinejoin:s=null,facetAnchor:I=Q+("x"===B?"-empty":""),frameAnchor:g=Q,tickSize:i,inset:l=0,insetTop:c=l,insetBottom:e=l,dy:n=0,x:d=("x"===B?void 0:null),ariaLabel:C,...a}){return PL(VL,B,F,{ariaLabel:`${C} tick`,ariaHidden:!0},{strokeWidth:U,strokeLinejoin:s,strokeLinecap:t,facetAnchor:I,frameAnchor:g,x:d,...a,dy:"bottom"===Q?+n-Yr-e:+n+Yr+ +c,anchor:"start",length:i,shape:"bottom"===Q?qL:BA})}(B,Q,F,{stroke:s,strokeOpacity:I,strokeWidth:g,tickSize:C,tickPadding:a,tickRotate:b,y:o,ariaLabel:V,...Z}):null,Wo(i)?null:function(B,Q,F,{facetAnchor:U=Q+("x"===B?"-empty":""),frameAnchor:t=Q,tickSize:s,tickRotate:I=0,tickPadding:g=Math.max(3,9-s)+(Math.abs(I)>=10?4*Math.cos(I*Ax):0),text:i,textAnchor:l=(Math.abs(I)>=10?I<0^"bottom"===Q?"start":"end":"middle"),lineAnchor:c=(Math.abs(I)>=10?"middle":"bottom"===Q?"top":"bottom"),fontVariant:e,inset:n=0,insetTop:d=n,insetBottom:C=n,dy:a=0,x:b=("x"===B?void 0:null),ariaLabel:o,...G}){return PL(QL,B,F,{ariaLabel:`${o} tick label`},{facetAnchor:U,frameAnchor:t,text:void 0===i?null:i,textAnchor:l,lineAnchor:c,fontVariant:e,rotate:I,x:b,...G,dy:"bottom"===Q?+a+ +s+ +g-C:+a-s-g+ +d},function(B,F,U,t,s){void 0===e&&(this.fontVariant=UA(B)),void 0===i&&(s.text=jL(B,F,U,t,Q))})}(B,Q,F,{fill:i,fillOpacity:l,stroke:e,strokeOpacity:n,strokeWidth:d,textAnchor:c,tickSize:C,tickPadding:a,tickRotate:b,y:o,marginTop:u,marginRight:r,marginBottom:x,marginLeft:L,ariaLabel:V,...Z}),Wo(i)||null===A?null:BL([],OL({fill:i,fillOpacity:l,...Z},function(F,U,t,s,I){const g=s[B],{marginTop:i,marginRight:l,marginBottom:c,marginLeft:e}="x"===B&&I.inset||I,n=h??(g.bandwidth?"center":"right"),d=y??("top"===Q?i:c)-3;return"center"===n?(this.frameAnchor=Q,this.textAnchor=void 0):(this.frameAnchor=`${Q}-${n}`,this.textAnchor="right"===n?"end":"start"),this.lineAnchor=Q,this.dy="top"===Q?-d:d,this.dx="right"===n?l-3:"left"===n?3-e:0,this.ariaLabel=`${V} label`,{facets:[[0]],channels:{text:{value:[tA(B,g,{anchor:Q,label:A,labelAnchor:n,labelArrow:R})]}}}})))}function JL(){const[B,Q]=SL(...arguments);return TL("y",EL(Q),B,Q)}function vL(){const[B,Q]=SL(...arguments);return TL("fy",NL(Q),B,Q)}function kL(){const[B,Q]=SL(...arguments);return zL("x",XL(Q),B,Q)}function ML(){const[B,Q]=SL(...arguments);return zL("fx",pL(Q),B,Q)}function TL(B,Q,F,{y:U=("y"===B?void 0:null),x:t=null,x1:s=("left"===Q?t:null),x2:I=("right"===Q?t:null),ariaLabel:g=`${B}-grid`,ariaHidden:i=!0,...l}){return PL(Kx,B,F,{ariaLabel:g,ariaHidden:i},{y:U,x1:s,x2:I,...KL(l)})}function zL(B,Q,F,{x:U=("x"===B?void 0:null),y:t=null,y1:s=("top"===Q?t:null),y2:I=("bottom"===Q?t:null),ariaLabel:g=`${B}-grid`,ariaHidden:i=!0,...l}){return PL(zx,B,F,{ariaLabel:g,ariaHidden:i},{x:U,y1:s,y2:I,...KL(l)})}function KL({color:B="currentColor",opacity:Q=.1,stroke:F=B,strokeOpacity:U=Q,strokeWidth:t=1,...s}){return{stroke:F,strokeOpacity:U,strokeWidth:t,...s}}function OL({fill:B,fillOpacity:Q,fontFamily:F,fontSize:U,fontStyle:t,fontVariant:s,fontWeight:I,monospace:g,pointerEvents:i,shapeRendering:l,clip:c=!1},e){return[,B]=Kb(B),[,Q]=Ob(Q),{facet:"super",x:null,y:null,fill:B,fillOpacity:Q,fontFamily:F,fontSize:U,fontStyle:t,fontVariant:s,fontWeight:I,monospace:g,pointerEvents:i,shapeRendering:l,clip:c,initializer:e}}function PL(B,Q,F,U,t,s){let I;const g=tG(t).initializer,i=B(F,tG({...t,initializer:function(B,F,U,g,i,l){const c=null==B&&("fx"===Q||"fy"===Q),{[Q]:e}=g;if(!e)throw new Error(`missing scale: ${Q}`);const n=e.domain();let{interval:d,ticks:C,tickFormat:a,tickSpacing:b=("x"===Q?80:35)}=t;if("string"==typeof C&&IA(e)&&(d=C,C=void 0),void 0===C&&(C=Lo(d,e.type)??function(B,Q){const[F,U]=AB(B.range());return(U-F)/Q}(e,b)),null==B){if(Ro(C))B=$b(C);else if(Ao(C))B=$L(C,...AB(n));else if(e.interval){let Q=e.interval;if(e.ticks){const[F,U]=AB(n);Q=ob(Q,(U-F)/Q[ib]/C)??Q,B=$L(Q,F,U)}else{Q=ob(Q,(B=n).length/C)??Q,Q!==e.interval&&(B=$L(Q,...AB(B)))}if(Q===e.interval){const Q=Math.round(B.length/C);Q>1&&(B=B.filter((B,F)=>F%Q===0))}}else B=e.ticks?e.ticks(C):n;if(!e.ticks&&B.length&&B!==n){const F=new yB(n);B=B.filter(B=>F.has(B)),B.length||uu(`Warning: the ${Q}-axis ticks appear to not align with the scale domain, resulting in no ticks. Try different ticks?`)}"y"===Q||"x"===Q?F=[co(B)]:I[Q]={scale:Q,value:Wb}}s?.call(this,e,B,C,a,I);const o=Object.fromEntries(Object.entries(I).map(([Q,F])=>[Q,{...F,value:Vb(B,F.value)}]));return c&&(F=l.filterFacets(B,o)),{data:B,facets:F,channels:o}}},g));return null==F?(I=i.channels,i.channels={}):I={},void 0!==U&&Object.assign(i,U),void 0===i.clip&&(i.clip=!1),i}function jL(B,Q,F,U,t){return{value:_L(B,Q,F,U,t)}}function _L(B,Q,F,U,t){return"function"!=typeof U||"log"===B.type&&B.tickFormat?void 0===U&&Q&&Zo(Q)?ub(B.type,Q,t)??Dr:B.tickFormat?B.tickFormat("number"==typeof F?F:null,U):"string"==typeof U&&B.domain().length>0?(Zo(B.domain())?fc:qs)(U):void 0===U?Dr:vb(U):U}function $L(B,Q,F){return B.range(Q,B.offset(B.floor(F)))}const qL={draw(B,Q){B.moveTo(0,0),B.lineTo(0,Q)}},BA={draw(B,Q){B.moveTo(0,0),B.lineTo(0,-Q)}},QA={draw(B,Q){B.moveTo(0,0),B.lineTo(-Q,0)}},FA={draw(B,Q){B.moveTo(0,0),B.lineTo(Q,0)}};function UA(B){return B.bandwidth&&!B.interval?void 0:"tabular-nums"}function tA(B,Q,{anchor:F,label:U=Q.label,labelAnchor:t,labelArrow:s}={}){if(!(null==U||U.inferred&&IA(Q)&&/^(date|time|year)$/i.test(U))){if(U=String(U),"auto"===s&&(s=(!Q.bandwidth||Q.interval)&&!/[↑↓→←]/.test(U)),!s)return U;if(!0===s){const F=function(B){return Math.sign(ja(B.domain()))*Math.sign(ja(B.range()))}(Q);F&&(s=/x$/.test(B)||"center"===t?/x$/.test(B)===F<0?"left":"right":F<0?"up":"down")}switch(s){case"left":return`← ${U}`;case"right":return`${U} →`;case"up":return"right"===F?`${U} ↑`:`↑ ${U}`;case"down":return"right"===F?`${U} ↓`:`↓ ${U}`}return U}}function sA(B="auto"){return!Wo(B)&&("boolean"==typeof B?B:jb(B,"labelArrow",["auto","up","right","down","left"]))}function IA(B){return Zo(B.domain())}function gA(B,Q){if(null==Q)return Q;const F=B(Q);if(!F)throw new Error(`scale not found: ${Q}`);return F}function iA(B,Q={},F){let{columns:U,tickFormat:t,fontVariant:s=Lx(B),swatchSize:I=15,swatchWidth:g=I,swatchHeight:i=I,marginLeft:l=0,className:c,style:e,width:n}=Q;const d=Sr(Q);c=sx(c),t=_L(B.scale,B.domain,void 0,t);const C=mr("div",d).attr("class",`${c}-swatches ${c}-swatches-${null!=U?"columns":"wrap"}`);let a;return null!=U?(a=`:where(.${c}-swatches-columns .${c}-swatch) {\n display: flex;\n align-items: center;\n break-inside: avoid;\n padding-bottom: 1px;\n}\n:where(.${c}-swatches-columns .${c}-swatch::before) {\n flex-shrink: 0;\n}\n:where(.${c}-swatches-columns .${c}-swatch-label) {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}`,C.style("columns",U).selectAll().data(B.domain).enter().append("div").attr("class",`${c}-swatch`).call(F,B,g,i).call(B=>B.append("div").attr("class",`${c}-swatch-label`).attr("title",t).text(t))):(a=`:where(.${c}-swatches-wrap) {\n display: flex;\n align-items: center;\n min-height: 33px;\n flex-wrap: wrap;\n}\n:where(.${c}-swatches-wrap .${c}-swatch) {\n display: inline-flex;\n align-items: center;\n margin-right: 1em;\n}`,C.selectAll().data(B.domain).enter().append("span").attr("class",`${c}-swatch`).call(F,B,g,i).append(function(){return this.ownerDocument.createTextNode(t.apply(this,arguments))})),C.call(B=>B.insert("style","*").text(`:where(.${c}-swatches) {\n font-family: system-ui, sans-serif;\n font-size: 10px;\n margin-bottom: 0.5em;\n}\n:where(.${c}-swatch > svg) {\n margin-right: 0.5em;\n overflow: visible;\n}\n${a}`)).style("margin-left",l?+l+"px":null).style("width",void 0===n?null:+n+"px").style("font-variant",Fx(s,"normal")).call(Ix,e).node()}const lA=new Map([["symbol",function(B,{fill:Q=(void 0!==B.hint?.fill?B.hint.fill:"none"),fillOpacity:F=1,stroke:U=(void 0!==B.hint?.stroke?B.hint.stroke:Wo(Q)?"currentColor":"none"),strokeOpacity:t=1,strokeWidth:s=1.5,r:I=4.5,...g}={},i){const[l,c]=Kb(Q),[e,n]=Kb(U),d=gA(i,l),C=gA(i,e),a=I*I*Math.PI;return F=Ob(F)[1],t=Ob(t)[1],s=Ob(s)[1],iA(B,g,(Q,U,I,g)=>Q.append("svg").attr("viewBox","-8 -8 16 16").attr("width",I).attr("height",g).attr("fill","color"===l?B=>d.scale(B):c).attr("fill-opacity",F).attr("stroke","color"===e?B=>C.scale(B):n).attr("stroke-opacity",t).attr("stroke-width",s).append("path").attr("d",Q=>{const F=vs();return B.scale(Q).draw(F,a),F}))}],["color",eA],["opacity",function({type:B,interpolate:Q,...F},{legend:U=!0,color:t=rU(0,0,0),...s}){if(!Q)throw new Error(`${B} opacity scales are not supported`);!0===U&&(U="ramp");if("ramp"!==`${U}`.toLowerCase())throw new Error(`${U} opacity legends are not supported`);return eA({type:B,...F,interpolate:nA(t)},{legend:U,...s})}]]);function cA({className:B,...Q},{label:F,ticks:U,tickFormat:t}={},s){return function(B={},...Q){let F=B;for(const U of Q)for(const Q in U)if(void 0===F[Q]){const t=U[Q];F===B?F={...F,[Q]:t}:F[Q]=t}return F}(s,{className:B,...Q},{label:F,ticks:U,tickFormat:t})}function eA(B,{legend:Q=!0,...F}){if(!0===Q&&(Q="ordinal"===B.type?"swatches":"ramp"),void 0!==B.domain)switch(`${Q}`.toLowerCase()){case"swatches":return function(B,{opacity:Q,...F}={}){if(!_u(B)&&!$u(B))throw new Error(`swatches legend requires ordinal or threshold color scale (not ${B.type})`);return iA(B,F,(B,F,U,t)=>B.append("svg").attr("width",U).attr("height",t).attr("fill",F.scale).attr("fill-opacity",Ob(Q)[1]).append("rect").attr("width","100%").attr("height","100%"))}(B,F);case"ramp":return function(B,Q){let{label:F=B.label,tickSize:U=6,width:t=240,height:s=44+U,marginTop:I=18,marginRight:g=0,marginBottom:i=16+U,marginLeft:l=0,style:c,ticks:e=(t-l-g)/64,tickFormat:n,fontVariant:d=Lx(B),round:C=!0,opacity:a,className:b}=Q;const o=Sr(Q);b=sx(b),a=Ob(a)[1],null===n&&(n=()=>null);const G=mr("svg",o).attr("class",`${b}-ramp`).attr("font-family","system-ui, sans-serif").attr("font-size",10).attr("width",t).attr("height",s).attr("viewBox",`0 0 ${t} ${s}`).call(B=>B.append("style").text(`:where(.${b}-ramp) {\n display: block;\n height: auto;\n height: intrinsic;\n max-width: 100%;\n overflow: visible;\n}\n:where(.${b}-ramp text) {\n white-space: pre;\n}`)).call(Ix,c);let u,r=B=>B.selectAll(".tick line").attr("y1",I+i-s);const x=C?(B,Q)=>B.rangeRound(Q):(B,Q)=>B.range(Q),{type:L,domain:A,range:h,interpolate:R,scale:y,pivot:V}=B;if(R){const B=void 0===h?R:Yt(1===R.length?bu(R):R,h);u=x(y.copy(),ft(rt(l,t-g),Math.min(A.length+(void 0!==V),void 0===h?1/0:h.length)));const Q=256,F=o.document.createElement("canvas");F.width=Q,F.height=1;const U=F.getContext("2d");for(let F=0,t=Q-1;F<Q;++F)U.fillStyle=B(F/t),U.fillRect(F,0,1,1);G.append("image").attr("opacity",a).attr("x",l).attr("y",I).attr("width",t-l-g).attr("height",s-I-i).attr("preserveAspectRatio","none").attr("xlink:href",F.toDataURL())}else if("threshold"===L){const B=A,Q=void 0===n?B=>B:"string"==typeof n?qs(n):n;u=x(Ll().domain([-1,h.length-1]),[l,t-g]),G.append("g").attr("fill-opacity",a).selectAll().data(h).enter().append("rect").attr("x",(B,Q)=>u(Q-1)).attr("y",I).attr("width",(B,Q)=>u(Q)-u(Q-1)).attr("height",s-I-i).attr("fill",B=>B),e=Bo(B,(B,Q)=>Q),n=F=>Q(B[F],F)}else u=x(il().domain(A),[l,t-g]),G.append("g").attr("fill-opacity",a).selectAll().data(A).enter().append("rect").attr("x",u).attr("y",I).attr("width",Math.max(0,u.bandwidth()-1)).attr("height",s-I-i).attr("fill",y),r=()=>{};return G.append("g").attr("transform",`translate(0,${s-i})`).call(xQ(u).ticks(Array.isArray(e)?null:e,"string"==typeof n?n:void 0).tickFormat("function"==typeof n?n:void 0).tickSize(U).tickValues(Array.isArray(e)?e:null)).attr("font-size",null).attr("font-family",null).attr("font-variant",Fx(d,"normal")).call(r).call(B=>B.select(".domain").remove()),void 0!==F&&G.append("text").attr("x",l).attr("y",I-6).attr("fill","currentColor").attr("font-weight","bold").text(F),G.node()}(B,F);default:throw new Error(`unknown legend type: ${Q}`)}}function nA(B){const{r:Q,g:F,b:U}=rU(B)||rU(0,0,0);return B=>`rgba(${Q},${F},${U},${B})`}function dA(B={},Q={}){1===arguments.length&&([B,Q]=function(B){const{offset:Q,order:F,reverse:U,...t}=B;return[{offset:Q,order:F,reverse:U},t]}(B));const{x1:F,x:U=F,y:t,...s}=Q,[I,g,i,l]=function(B,Q=Hb,F,U,{offset:t,order:s,reverse:I},g){if(null===Q)throw new Error(`stack requires ${U}`);const i=io(g),[l,c]=bo(B),[e,n]=ao(Q),[d,C]=ao(Q);return e.hint=d.hint=aA,t=function(B){if(null==B)return;if("function"==typeof B)return B;switch(`${B}`.toLowerCase()){case"expand":case"normalize":return oA;case"center":case"silhouette":return GA;case"wiggle":return uA}throw new Error(`unknown offset: ${B}`)}(t),s=function(B,Q,F){if(void 0===B&&Q===uA)return LA(wa);if(null==B)return;if("string"==typeof B){const Q=B.startsWith("-"),U=Q?Ja:wa;switch((Q?B.slice(1):B).toLowerCase()){case"value":case F:return function(B){return(Q,F,U)=>(Q,F)=>B(U[Q],U[F])}(U);case"z":return function(B){return(Q,F,U,t)=>(Q,F)=>B(t[Q],t[F])}(U);case"sum":return function(B){return RA(B,(B,Q,F,U)=>fB(co(B),B=>eQ(B,B=>F[B]),B=>U[B]))}(U);case"appearance":return function(B){return RA(B,(B,Q,F,U)=>fB(co(B),B=>Q[BQ(B,B=>F[B])],B=>U[B]))}(U);case"inside-out":return LA(U)}return AA(Xb(B))}if("function"==typeof B)return(1===B.length?AA:hA)(B);if(Ab(B))return U=B,RA(wa,()=>U);var U;throw new Error(`invalid order: ${B}`)}(s,t,U),[UG(g,(U,g,l)=>{({data:U,facets:g}=function(B,Q){if(1===Q.length)return{data:B,facets:Q};const F=lo(B),U=new Uint8Array(F);let t=0;for(const B of Q)for(const Q of B)U[Q]&&++t,U[Q]=1;if(0===t)return{data:B,facets:Q};const s=(B=Qo(B))[yb]=new Uint32Array(F+t);Q=Q.map(B=>Qo(B,Uint32Array));let I=F;U.fill(0);for(const F of Q)for(let Q=0,t=F.length;Q<t;++Q){const t=F[Q];U[t]?(F[Q]=I,B[I]=B[t],s[I]=t,++I):s[t]=t,U[t]=1}return{data:B,facets:Q}}(U,g));const e=null==B?void 0:c(uo(Vb(U,B),l?.[F])),d=Vb(U,Q,Float64Array),a=Vb(U,i),b=s&&s(U,e,d,a),o=lo(U),G=n(new Float64Array(o)),u=C(new Float64Array(o)),r=[];for(const B of g){const Q=e?Array.from(NB(B,B=>e[B]).values()):[B];if(b)for(const B of Q)B.sort(b);for(const B of Q){let Q=0,F=0;I&&B.reverse();for(const U of B){const B=d[U];B<0?Q=u[U]=(G[U]=Q)+B:B>0?F=u[U]=(G[U]=F)+B:u[U]=G[U]=F}}r.push(Q)}return t&&t(r,G,u,a),{data:U,facets:g}}),l,e,d]}(U,t,"x","y",B,s);return{...I,x1:F,x:g,y1:i,y2:l,y:Go(i,l)}}function CA({y:B,y1:Q,y2:F,...U}={}){return U=nx(U,"x"),void 0===Q&&void 0===F?dA({y:B,...U}):([Q,F]=function(B,Q,F,U=Wb){return void 0===Q&&void 0===F?(Q=0,F=void 0===B?U:B):void 0===Q?Q=void 0===B?0:B:void 0===F&&(F=void 0===B?0:B),[Q,F]}(B,Q,F),{...U,y1:Q,y2:F})}const aA={length:!0};function bA(B,Q){let F=0,U=0;for(const t of B){const B=Q[t];B<F&&(F=B),B>U&&(U=B)}return[F,U]}function oA(B,Q,F){for(const U of B)for(const B of U){const[U,t]=bA(B,F);for(const s of B){const B=1/(t-U||1);Q[s]=B*(Q[s]-U),F[s]=B*(F[s]-U)}}}function GA(B,Q,F){for(const U of B){for(const B of U){const[U,t]=bA(B,F);for(const s of B){const B=(t+U)/2;Q[s]-=B,F[s]-=B}}rA(U,Q,F)}xA(B,Q,F)}function uA(B,Q,F,U){for(const t of B){const B=new RB;let s=0;for(const I of t){let t=-1;const g=I.map(B=>Math.abs(F[B]-Q[B])),i=I.map(s=>{t=U?U[s]:++t;const I=F[s]-Q[s],g=B.has(t)?I-B.get(t):0;return B.set(t,I),g}),l=[0,...rB(i)];for(const B of I)Q[B]+=s,F[B]+=s;const c=eQ(g);c&&(s-=eQ(g,(B,Q)=>(i[Q]/2+l[Q])*B)/c)}rA(t,Q,F)}xA(B,Q,F)}function rA(B,Q,F){const U=jB(B,B=>jB(B,B=>Q[B]));for(const t of B)for(const B of t)Q[B]-=U,F[B]-=U}function xA(B,Q,F){const U=B.length;if(1===U)return;const t=B.map(B=>B.flat()),s=t.map(B=>(jB(B,B=>Q[B])+OB(B,B=>F[B]))/2),I=jB(s);for(let B=0;B<U;B++){const U=I-s[B];for(const s of t[B])Q[s]+=U,F[s]+=U}}function LA(B){return RA(B,(B,Q,F,U)=>{const t=co(B),s=fB(t,B=>Q[BQ(B,B=>F[B])],B=>U[B]),I=XB(t,B=>eQ(B,B=>F[B]),B=>U[B]),g=[],i=[];let l=0;for(const B of s)l<0?(l+=I.get(B),g.push(B)):(l-=I.get(B),i.push(B));return i.reverse().concat(g)})}function AA(B){return Q=>{const F=Vb(Q,B);return(B,Q)=>wa(F[B],F[Q])}}function hA(B){return Q=>Ab(Q)?(F,U)=>B(Q[F],Q[U]):(F,U)=>B(Q.get(F),Q.get(U))}function RA(B,Q){return(F,U,t,s)=>{if(!s)throw new Error("missing channel: z");const I=new RB(Q(F,U,t,s).map((B,Q)=>[B,Q]));return(Q,F)=>B(I.get(s[Q]),I.get(s[F]))}}const yA={ariaLabel:"rect"};class VA extends ix{constructor(B,Q={}){const{x1:F,y1:U,x2:t,y2:s}=Q;super(B,{x1:{value:F,scale:"x",type:null!=F&&null==t?"band":void 0,optional:!0},y1:{value:U,scale:"y",type:null!=U&&null==s?"band":void 0,optional:!0},x2:{value:t,scale:"x",optional:!0},y2:{value:s,scale:"y",optional:!0}},Q,yA),ZA(this,Q),SA(this,Q)}render(B,Q,F,U,t){const{x:s,y:I}=Q;let{x1:g,y1:i,x2:l,y2:c}=F;const{marginTop:e,marginRight:n,marginBottom:d,marginLeft:C,width:a,height:b}=U,{projection:o}=t,{insetTop:G,insetRight:u,insetBottom:r,insetLeft:x}=this,{rx:L,ry:A,rx1y1:h,rx1y2:R,rx2y1:y,rx2y2:V}=this;(g||l)&&!o&&qu(s)&&(g=l=null),(i||c)&&!o&&qu(I)&&(i=c=null);const Z=s?.bandwidth?s.bandwidth():0,S=I?.bandwidth?I.bandwidth():0;return mr("svg:g",t).call(_r,this,U,t).call(Qx,this,{},0,0).call(Q=>Q.selectAll().data(B).enter().call(h||R||y||V?B=>B.append("path").call($r,this).call(mA,g&&l?B=>g[B]+(l[B]<g[B]?-u:x):g?B=>g[B]+x:C+x,i&&c?B=>i[B]+(c[B]<i[B]?-r:G):i?B=>i[B]+G:e+G,g&&l?B=>l[B]-(l[B]<g[B]?-x:u):g?B=>g[B]+Z-u:a-n-u,i&&c?B=>c[B]-(c[B]<i[B]?-G:r):i?B=>i[B]+S-r:b-d-r,this).call(Mr,this,F):B=>B.append("rect").call($r,this).attr("x",g?l?B=>Math.min(g[B],l[B])+x:B=>g[B]+x:C+x).attr("y",i?c?B=>Math.min(i[B],c[B])+G:B=>i[B]+G:e+G).attr("width",g?l?B=>Math.max(0,Math.abs(l[B]-g[B])+Z-x-u):Z-x-u:a-n-C-u-x).attr("height",i?c?B=>Math.max(0,Math.abs(i[B]-c[B])+S-G-r):S-G-r:b-e-d-G-r).call(Bx,"rx",L).call(Bx,"ry",A).call(Mr,this,F))).node()}}function ZA(B,{inset:Q=0,insetTop:F=Q,insetRight:U=Q,insetBottom:t=Q,insetLeft:s=Q}={}){B.insetTop=fb(F),B.insetRight=fb(U),B.insetBottom=fb(t),B.insetLeft=fb(s)}function SA(B,{r:Q,rx:F,ry:U,rx1:t=Q,ry1:s=Q,rx2:I=Q,ry2:g=Q,rx1y1:i=(void 0!==t?+t:void 0!==s?+s:0),rx1y2:l=(void 0!==t?+t:void 0!==g?+g:0),rx2y1:c=(void 0!==I?+I:void 0!==s?+s:0),rx2y2:e=(void 0!==I?+I:void 0!==g?+g:0)}={}){i||l||c||e?(B.rx1y1=i,B.rx1y2=l,B.rx2y1=c,B.rx2y2=e):(B.rx=Fx(F,"auto"),B.ry=Fx(U,"auto"))}function mA(B,Q,F,U,t,s){const{rx1y1:I,rx1y2:g,rx2y1:i,rx2y2:l}=s;"function"!=typeof Q&&(Q=vb(Q)),"function"!=typeof F&&(F=vb(F)),"function"!=typeof U&&(U=vb(U)),"function"!=typeof t&&(t=vb(t));const c=Math.max(Math.abs(I+i),Math.abs(g+l)),e=Math.max(Math.abs(I+g),Math.abs(i+l));B.attr("d",B=>{const s=Q(B),n=F(B),d=U(B),C=t(B),a=s>d,b=n>C,o=a?d:s,G=a?s:d,u=b?C:n,r=b?n:C,x=Math.min(1,(G-o)/c,(r-u)/e),L=x*(a?b?l:i:b?g:I),A=x*(a?b?g:I:b?l:i),h=x*(a?b?I:g:b?i:l),R=x*(a?b?i:l:b?I:g);return`M${o},${u+NA(L,R)}A${L},${L} 0 0 ${L<0?0:1} ${o+EA(L,R)},${u}H${G-EA(A,h)}A${A},${A} 0 0 ${A<0?0:1} ${G},${u+NA(A,h)}V${r-NA(h,A)}A${h},${h} 0 0 ${h<0?0:1} ${G-EA(h,A)},${r}H${o+EA(R,L)}A${R},${R} 0 0 ${R<0?0:1} ${o},${r-NA(R,L)}Z`})}function EA(B,Q){return Q<0?B:Math.abs(B)}function NA(B,Q){return Q<0?Math.abs(B):B}function XA(B,Q={}){return function(B){return function({x:B,x1:Q,x2:F}){return void 0!==B||void 0!==Q||void 0!==F}(B)||Fo(B)||void 0!==B.interval}(Q)||(Q={...Q,x:pb,y2:Wb,interval:1}),new VA(B,CA(function(B={}){return Jx("x",Dx,B,!0)}(function(B={},Q="y"){return Fo(B)?B:{...B,[Q]:Wb}}(Q))))}const pA={ariaLabel:"frame",fill:"none",stroke:"currentColor",clip:!1},WA={ariaLabel:"frame",fill:null,stroke:"currentColor",strokeLinecap:"square",clip:!1};class HA extends ix{constructor(B={}){const{anchor:Q=null}=B;super(Nb,void 0,B,null==Q?pA:WA),this.anchor=Pb(Q,"anchor",["top","right","bottom","left"]),ZA(this,B),Q||SA(this,B)}render(B,Q,F,U,t){const{marginTop:s,marginRight:I,marginBottom:g,marginLeft:i,width:l,height:c}=U,{anchor:e,insetTop:n,insetRight:d,insetBottom:C,insetLeft:a}=this,{rx:b,ry:o,rx1y1:G,rx1y2:u,rx2y1:r,rx2y2:x}=this,L=i+a,A=l-I-d,h=s+n,R=c-g-C;return mr(e?"svg:line":G||u||r||x?"svg:path":"svg:rect",t).datum(0).call(_r,this,U,t).call($r,this).call(Mr,this,F).call(Qx,this,{}).call("left"===e?B=>B.attr("x1",L).attr("x2",L).attr("y1",h).attr("y2",R):"right"===e?B=>B.attr("x1",A).attr("x2",A).attr("y1",h).attr("y2",R):"top"===e?B=>B.attr("x1",L).attr("x2",A).attr("y1",h).attr("y2",h):"bottom"===e?B=>B.attr("x1",L).attr("x2",A).attr("y1",R).attr("y2",R):G||u||r||x?B=>B.call(mA,L,h,A,R,this):B=>B.attr("x",L).attr("y",h).attr("width",A-L).attr("height",R-h).attr("rx",b).attr("ry",o)).node()}}const DA={ariaLabel:"tip",fill:"var(--plot-background)",stroke:"currentColor"},YA=new Set(["geometry","href","src","ariaLabel","scales"]);class fA extends ix{constructor(B,Q={}){Q.tip&&(Q={...Q,tip:!1}),void 0===Q.title&&Ro(B)&&yo(B)&&(Q={...Q,title:Wb});const{x:F,y:U,x1:t,x2:s,y1:I,y2:g,anchor:i,preferredAnchor:l="bottom",monospace:c,fontFamily:e=(c?"ui-monospace, monospace":void 0),fontSize:n,fontStyle:d,fontVariant:C,fontWeight:a,lineHeight:b=1,lineWidth:o=20,frameAnchor:G,format:u,textAnchor:r="start",textOverflow:x,textPadding:L=8,title:A,pointerSize:h=12,pathFilter:R="drop-shadow(0 3px 4px rgba(0,0,0,0.2))"}=Q;super(B,{x:{value:null!=t&&null!=s?null:F,scale:"x",optional:!0},y:{value:null!=I&&null!=g?null:U,scale:"y",optional:!0},x1:{value:t,scale:"x",optional:null==s},y1:{value:I,scale:"y",optional:null==g},x2:{value:s,scale:"x",optional:null==t},y2:{value:g,scale:"y",optional:null==I},title:{value:A,optional:!0}},Q,DA),this.anchor=Do(i,"anchor"),this.preferredAnchor=Do(l,"preferredAnchor"),this.frameAnchor=Yo(G),this.textAnchor=Fx(r,"middle"),this.textPadding=+L,this.pointerSize=+h,this.pathFilter=Yb(R),this.lineHeight=+b,this.lineWidth=+o,this.textOverflow=$x(x),this.monospace=!!c,this.fontFamily=Yb(e),this.fontSize=fb(n),this.fontStyle=Yb(d),this.fontVariant=Yb(C),this.fontWeight=Yb(a);for(const B in DA)B in this.channels&&(this[B]=DA[B]);this.splitLines=lL(this),this.clipLine=cL(this),this.format="string"==typeof u||"function"==typeof u?{title:u}:{...u}}render(B,Q,F,U,t){const s=this,{x:I,y:g,fx:i,fy:l}=Q,{ownerSVGElement:c,document:e}=t,{anchor:n,monospace:d,lineHeight:C,lineWidth:a}=this,{textPadding:b,pointerSize:o,pathFilter:G}=this,{marginTop:u,marginLeft:r}=U,{x1:x,y1:L,x2:A,y2:h,x:R=x??A,y:y=L??h}=F,V=i?i(B.fx)-r:0,Z=l?l(B.fy)-u:0,[S,m]=gx(this,U),E=rx(F,S),N=xx(F,m),X=d?iL:gL,p=X(eL);let W,H;"title"in F?(W=JA.call(this,{title:F.channels.title},Q),H=kA):(W=JA.call(this,F.channels,Q),H=MA);const D=mr("svg:g",t).call(_r,this,U,t).call(UL,this).call(Qx,this,{x:R&&I,y:y&&g}).call(U=>U.selectAll().data(B).enter().append("g").attr("transform",B=>`translate(${Math.round(E(B))},${Math.round(N(B))})`).call($r,this).call(B=>B.append("path").attr("filter",G)).call(U=>U.append("text").each(function(U){const t=fF(this);this.setAttribute("fill","currentColor"),this.setAttribute("fill-opacity",1),this.setAttribute("stroke","none");const I=H.call(s,U,B,W,Q,F);if("string"==typeof I)for(const B of s.splitLines(I))Y(t,{value:s.clipLine(B)});else{const B=new Set;for(const Q of I){const{label:F=""}=Q;F&&B.has(F)||(B.add(F),Y(t,Q))}}})));function Y(B,{label:Q,value:F,color:U,opacity:t}){Q??="",F??="";const s=null!=U||null!=t;let I,g=100*a;const[i]=nL(Q,g,X,p);if(i>=0)Q=Q.slice(0,i).trimEnd()+eL,I=F.trim(),F="";else{(Q||!F&&!s)&&(F=" "+F);const[B]=nL(F,g-X(Q),X,p);B>=0&&(I=F.trim(),F=F.slice(0,B).trimEnd()+eL)}const l=B.append("tspan").attr("x",0).attr("dy",`${C}em`).text("​");Q&&l.append("tspan").attr("font-weight","bold").text(Q),F&&l.append(()=>e.createTextNode(F)),s&&l.append("tspan").text(" ■").attr("fill",U).attr("fill-opacity",t).style("user-select","none"),I&&l.append("title").text(I)}function f(){const{width:B,height:Q}=U.facet??U;D.selectChildren().each(function(F){let{x:U,width:t,height:I}=this.getBBox();t=Math.round(t),I=Math.round(I);let g=n;if(void 0===g){const U=E(F)+V,i=N(F)+Z,l=U+t+o+2*b<B,c=U-t-o-2*b>0,e=i+I+o+2*b<Q,n=i-I-o-2*b>0;g=l&&c?e&&n?s.preferredAnchor:n?"bottom":"top":e&&n?l?"left":"right":(l||c)&&(e||n)?`${n?"bottom":"top"}-${l?"left":"right"}`:s.preferredAnchor}const i=this.firstChild,l=this.lastChild;if(i.setAttribute("d",function(B,Q,F,U,t){const s=U+2*F,I=t+2*F;switch(B){case"middle":return`M${-s/2},${-I/2}h${s}v${I}h${-s}z`;case"top-left":return`M0,0l${Q},${Q}h${s-Q}v${I}h${-s}z`;case"top":return`M0,0l${Q/2},${Q/2}h${(s-Q)/2}v${I}h${-s}v${-I}h${(s-Q)/2}z`;case"top-right":return`M0,0l${-Q},${Q}h${Q-s}v${I}h${s}z`;case"right":return`M0,0l${-Q/2},${-Q/2}v${Q/2-I/2}h${-s}v${I}h${s}v${Q/2-I/2}z`;case"bottom-left":return`M0,0l${Q},${-Q}h${s-Q}v${-I}h${-s}z`;case"bottom":return`M0,0l${Q/2},${-Q/2}h${(s-Q)/2}v${-I}h${-s}v${I}h${(s-Q)/2}z`;case"bottom-right":return`M0,0l${-Q},${-Q}h${Q-s}v${-I}h${s}z`;case"left":return`M0,0l${Q/2},${-Q/2}v${Q/2-I/2}h${s}v${I}h${-s}v${Q/2-I/2}z`}}(g,o,b,t,I)),U)for(const B of l.childNodes)B.setAttribute("x",-U);l.setAttribute("y",+function(B,Q,F){return/^top(?:-|$)/.test(B)?.94-F:-.29-Q*F}(g,l.childNodes.length,C).toFixed(6)+"em"),l.setAttribute("transform",`translate(${function(B,Q,F,U,t){switch(B){case"middle":return[-U/2,t/2];case"top-left":return[F,Q+F];case"top":return[-U/2,Q/2+F];case"top-right":return[-U-F,Q+F];case"right":return[-Q/2-U-F,t/2];case"bottom-left":return[F,-Q-F];case"bottom":return[-U/2,-Q/2-F];case"bottom-right":return[-U-F,-Q-F];case"left":return[F+Q/2,t/2]}}(g,o,b,t,I)})`)}),D.attr("visibility",null)}return B.length&&(D.attr("visibility","hidden"),c.isConnected?Promise.resolve().then(f):"undefined"!=typeof requestAnimationFrame&&requestAnimationFrame(f)),D.node()}}function wA(B,{x:Q,y:F,...U}={}){return void 0===U.frameAnchor&&([Q,F]=go(Q,F)),new fA(B,{...U,x:Q,y:F})}function JA(B,Q){const F={};let U=this.format;U=vA(U,B,"x"),U=vA(U,B,"y"),this.format=U;for(const Q in U){const t=U[Q];if(null!==t&&!1!==t)if("fx"===Q||"fy"===Q)F[Q]=!0;else{const U=fG(B,Q);U&&(F[Q]=U)}}for(const Q in B){if(Q in F||Q in U||YA.has(Q))continue;if(("x"===Q||"y"===Q)&&B.geometry)continue;const t=fG(B,Q);if(t){if(null==t.scale&&"color"===t.defaultScale)continue;F[Q]=t}}this.facet&&(Q.fx&&!("fx"in U)&&(F.fx=!0),Q.fy&&!("fy"in U)&&(F.fy=!0));for(const B in F){const U=this.format[B];if("string"==typeof U){const t=F[B]?.value??Q[B]?.domain()??[];this.format[B]=(Zo(t)?fc:qs)(U)}else if(void 0===U||!0===U){const F=Q[B];this.format[B]=F?.bandwidth?_L(F,F.domain()):Dr}}return F}function vA(B,Q,F){if(!(F in B))return B;const U=`${F}1`,t=`${F}2`;if(!(!(U in B)&&U in Q||!(t in B)&&t in Q))return B;const s=Object.entries(B),I=B[F];return s.splice(s.findIndex(([B])=>B===F)+1,0,[U,I],[t,I]),Object.fromEntries(s)}function kA(B,Q,{title:F}){return this.format.title(F.value[B],B)}function*MA(B,Q,F,U,t){for(const s in F){if("fx"===s||"fy"===s){yield{label:KA(U,F,s),value:this.format[s](Q[s],B)};continue}if("x1"===s&&"x2"in F)continue;if("y1"===s&&"y2"in F)continue;const I=F[s];if("x2"===s&&"x1"in F)yield{label:zA(U,F,"x"),value:TA(this.format.x2,F.x1,I,B)};else if("y2"===s&&"y1"in F)yield{label:zA(U,F,"y"),value:TA(this.format.y2,F.y1,I,B)};else{const Q=I.value[B],g=I.scale;if(!fa(Q)&&null==g)continue;yield{label:KA(U,F,s),value:this.format[s](Q,B),color:"color"===g?t[s][B]:null,opacity:"opacity"===g?t[s][B]:null}}}}function TA(B,Q,F,U){return F.hint?.length?`${B(F.value[U]-Q.value[U],U)}`:`${B(Q.value[U],U)}–${B(F.value[U],U)}`}function zA(B,Q,F){const U=KA(B,Q,`${F}1`,F),t=KA(B,Q,`${F}2`,F);return U===t?U:`${U}–${t}`}function KA(B,Q,F,U=F){const t=Q[F],s=B[t?.scale??F];return String(s?.label??t?.label??U)}function OA(B={}){const{facet:Q,style:F,title:U,subtitle:t,caption:s,ariaLabel:I,ariaDescription:g}=B,i=sx(B.className),l=void 0===B.marks?[]:jA(B.marks);l.push(...function(B){const Q=[];for(const F of B){let B=F.tip;if(B){!0===B?B={}:"string"==typeof B&&(B={pointer:B});let{pointer:U,preferredAnchor:t}=B;U=/^x$/i.test(U)?Gx:/^y$/i.test(U)?ux:ox,B=U(sh(F,B)),B.title=null,void 0===t&&(B.preferredAnchor=U===ux?"left":"bottom");const s=wA(F.data,B);s.facet=F.facet,s.facetAnchor=F.facetAnchor,Q.push(s)}}return Q}(l));const c=function(B,Q){if(null==B)return;const{x:F,y:U}=B;if(null==F&&null==U)return;const t=_b(B.data);if(null==t)throw new Error("missing facet data");const s={};null!=F&&(s.fx=mG(t,{value:F,scale:"fx"}));null!=U&&(s.fy=mG(t,{value:U,scale:"fy"}));qA(s,Q);const I=tr(t,s);return{channels:s,groups:I,data:B.data}}(Q,B),e=new Map;for(const Q of l){const F=th(Q,c,B);F&&e.set(Q,F)}const n=new Map;c&&Fh(n,[c],B),Fh(n,e,B);const d=jA(function(B,Q,F){let{projection:U,x:t={},y:s={},fx:I={},fy:g={},axis:i,grid:l,facet:c={},facet:{axis:e=i,grid:n}=c,x:{axis:d=i,grid:C=(null===d?null:l)}=t,y:{axis:a=i,grid:b=(null===a?null:l)}=s,fx:{axis:o=e,grid:G=(null===o?null:n)}=I,fy:{axis:u=e,grid:r=(null===u?null:n)}=g}=F;(U||!to(t)&&!ch("x",B))&&(d=C=null);(U||!to(s)&&!ch("y",B))&&(a=b=null);Q.has("fx")||(o=G=null);Q.has("fy")||(u=r=null);void 0===d&&(d=!lh(B,"x"));void 0===a&&(a=!lh(B,"y"));void 0===o&&(o=!lh(B,"fx"));void 0===u&&(u=!lh(B,"fy"));!0===d&&(d="bottom");!0===a&&(a="left");!0===o&&(o="top"===d||null===d?"bottom":"top");!0===u&&(u="right"===a||null===a?"left":"right");const x=[];return gh(x,r,vL,g),Ih(x,u,HL,"right","left",c,g),gh(x,G,ML,I),Ih(x,o,YL,"top","bottom",c,I),gh(x,b,JL,s),Ih(x,a,WL,"left","right",F,s),gh(x,C,kL,t),Ih(x,d,DL,"bottom","top",F,t),x}(l,n,B));for(const Q of d){const F=th(Q,c,B);F&&e.set(Q,F)}l.unshift(...d);let C=Ur(n,B);if(void 0!==C){const B=c?br(C,c):void 0;for(const Q of l){if(null===Q.facet||"super"===Q.facet)continue;const F=e.get(Q);void 0!==F&&(F.facetsIndex=null!=Q.fx||null!=Q.fy?br(C,F):B)}const Q=new Set;for(const{facetsIndex:B}of e.values())B?.forEach((B,F)=>{B?.length>0&&Q.add(F)});C.forEach(0<Q.size&&Q.size<C.length?(B,F)=>B.empty=!Q.has(F):B=>B.empty=!1);for(const B of l)if("exclude"===B.facet){const Q=e.get(B);void 0!==Q&&(Q.facetsIndex=sr(Q.facetsIndex))}}for(const Q of jo.keys())to(B[Q])&&"fx"!==Q&&"fy"!==Q&&n.set(Q,[]);const a=new Map;for(const Q of l){if(a.has(Q))throw new Error("duplicate mark; each mark must be unique");const{facetsIndex:F,channels:U}=e.get(Q)??{},{data:t,facets:s,channels:I}=Q.initialize(F,U,B);qA(I,B),a.set(Q,{data:t,facets:s,channels:I})}const b=Du(Fh(n,a,B),B),o=function(B,Q,F={}){let U=.5-Yr,t=.5+Yr,s=.5+Yr,I=.5-Yr;for(const{marginTop:B,marginRight:F,marginBottom:g,marginLeft:i}of Q)B>U&&(U=B),F>t&&(t=F),g>s&&(s=g),i>I&&(I=i);let{margin:g,marginTop:i=(void 0!==g?g:U),marginRight:l=(void 0!==g?g:t),marginBottom:c=(void 0!==g?g:s),marginLeft:e=(void 0!==g?g:I)}=F;i=+i,l=+l,c=+c,e=+e;let{width:n=640,height:d=dx(B,F,{width:n,marginTopDefault:U,marginRightDefault:t,marginBottomDefault:s,marginLeftDefault:I})+Math.max(0,i-U+c-s)}=F;n=+n,d=+d;const C={width:n,height:d,marginTop:i,marginRight:l,marginBottom:c,marginLeft:e};if(B.fx||B.fy){let{margin:B,marginTop:Q=(void 0!==B?B:i),marginRight:U=(void 0!==B?B:l),marginBottom:t=(void 0!==B?B:c),marginLeft:s=(void 0!==B?B:e)}=F.facet??{};Q=+Q,U=+U,t=+t,s=+s,C.facet={marginTop:Q,marginRight:U,marginBottom:t,marginLeft:s}}return C}(b,l,B);!function(B,Q){const{x:F,y:U,fx:t,fy:s}=B,I=t||s?wu(Q):Q;t&&vu(t,I),s&&ku(s,I);const g=t||s?Ju(B,Q):Q;F&&vu(F,g),U&&ku(U,g)}(b,o);const G=Yu(b),{fx:u,fy:r}=G,x=u||r?Ju(b,o):o,L=u||r?function({fx:B,fy:Q},F){const{marginTop:U,marginRight:t,marginBottom:s,marginLeft:I,width:g,height:i}=wu(F),l=B&&eh(B),c=Q&&eh(Q);return{marginTop:Q?c[0]:U,marginRight:B?g-l[1]:t,marginBottom:Q?i-c[1]:s,marginLeft:B?l[0]:I,inset:{marginTop:F.marginTop,marginRight:F.marginRight,marginBottom:F.marginBottom,marginLeft:F.marginLeft},width:g,height:i}}(G,o):o,A=Sr(B),h=A.document,R=NQ("svg").call(h.documentElement);let y=R;A.ownerSVGElement=R,A.className=i,A.projection=rr(B,x),A.path=function(){return gi(this.projection??function({x:B,y:Q}){if(B||Q)return B??=B=>B,Q??=B=>B,ii({point(F,U){this.stream.point(B(F),Q(U))}})}(G))},A.filterFacets=(B,Q)=>br(C,{channels:Q,groups:tr(B,Q)}),A.getMarkState=B=>{const Q=a.get(B),F=e.get(B);return{...Q,channels:{...Q.channels,...F?.channels}}},A.dispatchValue=B=>{y.value!==B&&(y.value=B,y.dispatchEvent(new A.document.defaultView.Event("input",{bubbles:!0})))};const V=new Set;for(const[Q,F]of a)if(null!=Q.initializer){const U="super"===Q.facet?L:x,t=Q.initializer(F.data,F.facets,F.channels,G,U,A);if(void 0!==t.data&&(F.data=t.data),void 0!==t.facets&&(F.facets=t.facets),void 0!==t.channels){const{fx:U,fy:s,...I}=t.channels;Qh(I),Object.assign(F.channels,I);for(const Q of Object.values(I)){const{scale:F}=Q;null==F||_o(jo.get(F))||(Bh(Q,B),V.add(F))}null==U&&null==s||e.set(Q,!0)}}if(V.size){const Q=new Map;Fh(Q,a,B,B=>V.has(B)),Fh(n,a,B,B=>V.has(B));const F=function(B,Q){for(const F in B){const U=B[F],t=Q[F];void 0===U.label&&t&&(U.label=t.label)}return B}(Du(Q,B),b),{scales:U,...t}=Yu(F);Object.assign(b,F),Object.assign(G,t),Object.assign(G.scales,U)}let Z,S;void 0!==C&&(Z={x:u?.domain(),y:r?.domain()},C=function(B,{x:Q,y:F}){return Q&&=ir(Q),F&&=ir(F),B.filter(Q&&F?B=>Q.has(B.x)&&F.has(B.y):Q?B=>Q.has(B.x):B=>F.has(B.y)).sort(Q&&F?(B,U)=>Q.get(B.x)-Q.get(U.x)||F.get(B.y)-F.get(U.y):Q?(B,F)=>Q.get(B.x)-Q.get(F.x):(B,Q)=>F.get(B.y)-F.get(Q.y))}(C,Z),S=function(B,Q,{marginTop:F,marginLeft:U}){const t=B?({x:Q})=>B(Q)-U:()=>0,s=Q?({y:B})=>Q(B)-F:()=>0;return function(B){"svg"===this.tagName?(this.setAttribute("x",t(B)),this.setAttribute("y",s(B))):this.setAttribute("transform",`translate(${t(B)},${s(B)})`)}}(u,r,o));for(const[B,Q]of a)Q.values=B.scale(Q.channels,G,A);const{width:m,height:E}=o;fF(R).attr("class",i).attr("fill","currentColor").attr("font-family","system-ui, sans-serif").attr("font-size",10).attr("text-anchor","middle").attr("width",m).attr("height",E).attr("viewBox",`0 0 ${m} ${E}`).attr("aria-label",I).attr("aria-description",g).call(B=>B.append("style").text(`:where(.${i}) {\n --plot-background: white;\n display: block;\n height: auto;\n height: intrinsic;\n max-width: 100%;\n}\n:where(.${i} text),\n:where(.${i} tspan) {\n white-space: pre;\n}`)).call(Ix,F);for(const B of l){const{channels:Q,values:F,facets:U}=a.get(B);if(void 0===C||"super"===B.facet){let t=null;if(U&&(t=U[0],t=B.filter(t,Q,F),0===t.length))continue;const s=B.render(t,G,F,L,A);if(null==s)continue;R.appendChild(s)}else{let t;for(const s of C){if(!(B.facetAnchor?.(C,Z,s)??!s.empty))continue;let I=null;if(U){const t=e.has(B);if(I=U[t?s.i:0],I=B.filter(I,Q,F),0===I.length)continue;t||I!==U[0]||(I=no(I)),I.fx=s.x,I.fy=s.y,I.fi=s.i}const g=B.render(I,G,F,x,A);if(null!=g){(t??=fF(R).append("g")).append(()=>g).datum(s);for(const B of["aria-label","aria-description","aria-hidden","transform"])g.hasAttribute(B)&&(t.attr(B,g.getAttribute(B)),g.removeAttribute(B))}}t?.selectChildren().each(S)}}const N=function(B,Q,F){const U=[];for(const[t,s]of lA){const I=F[t];if(I?.legend&&t in B){const F=s(B[t],cA(Q,B[t],I),Q=>B[Q]);null!=F&&U.push(F)}}return U}(b,A,B),{figure:X=null!=U||null!=t||null!=s||N.length>0}=B;X&&(y=h.createElement("figure"),y.className=`${i}-figure`,y.style.maxWidth="initial",null!=U&&y.append(PA(h,U,"h2")),null!=t&&y.append(PA(h,t,"h3")),y.append(...N,R),null!=s&&y.append(function(B,Q){const F=B.createElement("figcaption");return F.append(Q),F}(h,s)),"value"in R&&(y.value=R.value,delete R.value)),y.scale=function(B){return Q=>{if(!jo.has(Q=`${Q}`))throw new Error(`unknown scale: ${Q}`);return B[Q]}}(G.scales),y.legend=function(B,Q,F={}){return(U,t)=>{if(!lA.has(U))throw new Error(`unknown legend type: ${U}`);if(U in B)return lA.get(U)(B[U],cA(Q,F[U],t),Q=>B[Q])}}(b,A,B);const p=function(){const B=Gu;return Gu=0,ou=void 0,B}();return p>0&&fF(R).append("text").attr("x",m).attr("y",20).attr("dy","-1em").attr("text-anchor","end").attr("font-family","initial").text("⚠️").append("title").text(`${p.toLocaleString("en-US")} warning${1===p?"":"s"}. Please check the console.`),y}function PA(B,Q,F){if(Q.ownerDocument)return Q;const U=B.createElement(F);return U.append(Q),U}function jA(B){return B.flat(1/0).filter(B=>null!=B).map(_A)}function _A(B){return"function"==typeof B.render?B:new $A(B)}class $A extends ix{constructor(B){if("function"!=typeof B)throw new TypeError("invalid mark; missing render function");super(),this.render=B}render(){}}function qA(B,Q){for(const F in B)Bh(B[F],Q);return B}function Bh(B,Q){const{scale:F,transform:U=!0}=B;if(null==F||!U)return;const{type:t,percent:s,interval:I,transform:g=(s?B=>null==B?NaN:100*B:ro(I,t))}=Q[F]??{};null!=g&&(B.value=Bo(B.value,g),B.transform=!1)}function Qh(B){for(const Q in B)EG(Q,B[Q])}function Fh(B,Q,F,U=Db){for(const{channels:t}of Q.values())for(const Q in t){const s=t[Q],{scale:I}=s;if(null!=I&&U(I))if("projection"===I){if(!Vr(F)){const Q=void 0===F.x?.domain,U=void 0===F.y?.domain;if(Q||U){const[F,t]=Zr(s);Q&&Uh(B,"x",F),U&&Uh(B,"y",t)}}}else Uh(B,I,s)}return B}function Uh(B,Q,F){const U=B.get(Q);void 0!==U?U.push(F):B.set(Q,[F])}function th(B,Q,F){if(null===B.facet||"super"===B.facet)return;const{fx:U,fy:t}=B;if(null!=U||null!=t){const Q=_b(B.data??U??t);if(void 0===Q)throw new Error(`missing facet data in ${B.ariaLabel}`);if(null===Q)return;const s={};return null!=U&&(s.fx=mG(Q,{value:U,scale:"fx"})),null!=t&&(s.fy=mG(Q,{value:t,scale:"fy"})),qA(s,F),{channels:s,groups:tr(Q,s)}}if(void 0===Q)return;const{channels:s,groups:I,data:g}=Q;if("auto"!==B.facet||B.data===g)return{channels:s,groups:I};g.length>0&&(I.size>1||1===I.size&&s.fx&&s.fy&&[...I][0][1].size>1)&&lo(_b(B.data))===lo(g)&&uu(`Warning: the ${B.ariaLabel} mark appears to use faceted data, but isn’t faceted. The mark data has the same length as the facet data and the mark facet option is "auto", but the mark data and facet data are distinct. If this mark should be faceted, set the mark facet option to true; otherwise, suppress this warning by setting the mark facet option to false.`)}function sh(B,Q={}){return tG({...Q,x:null,y:null},(Q,F,U,t,s,I)=>I.getMarkState(B))}function Ih(B,Q,F,U,t,s,I){if(!Q)return;const g=/^\s*both\s*$/i.test(Q);I=function(B,Q,{line:F=Q.line,ticks:U,tickSize:t,tickSpacing:s,tickPadding:I,tickFormat:g,tickRotate:i,fontVariant:l,ariaLabel:c,ariaDescription:e,label:n=Q.label,labelAnchor:d,labelArrow:C=Q.labelArrow,labelOffset:a}){return{anchor:B,line:F,ticks:U,tickSize:t,tickSpacing:s,tickPadding:I,tickFormat:g,tickRotate:i,fontVariant:l,ariaLabel:c,ariaDescription:e,label:n,labelAnchor:d,labelArrow:C,labelOffset:a}}(g?U:Q,s,I);const{line:i}=I;F!==WL&&F!==DL||!i||Ho(i)||B.push(function(B){return new HA(B)}(function(B){const{anchor:Q,line:F}=B;return{anchor:Q,facetAnchor:Q+"-empty",stroke:!0===F?void 0:F}}(I))),B.push(F(I)),g&&B.push(F({...I,anchor:t,label:null}))}function gh(B,Q,F,U){Q&&!Ho(Q)&&B.push(F(function(B,{stroke:Q=(Xo(B)?B:void 0),ticks:F=(ih(B)?B:void 0),tickSpacing:U,ariaLabel:t,ariaDescription:s}){return{stroke:Q,ticks:F,tickSpacing:U,ariaLabel:t,ariaDescription:s}}(Q,U)))}function ih(B){switch(typeof B){case"number":return!0;case"string":return!Xo(B)}return Ro(B)||"function"==typeof B?.range}function lh(B,Q){const F=`${Q}-axis `;return B.some(B=>B.ariaLabel?.startsWith(F))}function ch(B,Q){for(const F of Q)for(const Q in F.channels){const{scale:U}=F.channels[Q];if(U===B||"projection"===U)return!0}return!1}function eh(B){const Q=B.domain();if(0===Q.length)return[0,B.bandwidth()];let F=B(Q[0]),U=B(Q[Q.length-1]);return U<F&&([F,U]=[U,F]),[F,U+B.bandwidth()]}const nh=new Map([["basis",function(B){return new mC(B)}],["basis-closed",function(B){return new EC(B)}],["basis-open",function(B){return new NC(B)}],["bundle",pC],["bump-x",function(B){return new BC(B,!0)}],["bump-y",function(B){return new BC(B,!1)}],["cardinal",DC],["cardinal-closed",fC],["cardinal-open",JC],["catmull-rom",MC],["catmull-rom-closed",zC],["catmull-rom-open",OC],["linear",jd],["linear-closed",function(B){return new PC(B)}],["monotone-x",function(B){return new Ba(B)}],["monotone-y",function(B){return new Qa(B)}],["natural",function(B){return new Ua(B)}],["step",function(B){return new sa(B,.5)}],["step-after",function(B){return new sa(B,1)}],["step-before",function(B){return new sa(B,0)}]]);function dh(B=Ch,Q){return"function"!=typeof B&&"auto"===`${B}`.toLowerCase()?Ch:function(B=jd,Q){if("function"==typeof B)return B;const F=nh.get(`${B}`.toLowerCase());if(!F)throw new Error(`unknown curve: ${B}`);if(void 0!==Q){if("beta"in F)return F.beta(Q);if("tension"in F)return F.tension(Q);if("alpha"in F)return F.alpha(Q)}return F}(B,Q)}function Ch(B){return jd(B)}function ah(B={y:"count"},Q={}){[B,Q]=function({cumulative:B,domain:Q,thresholds:F,interval:U,...t},s){return[t,{cumulative:B,domain:Q,thresholds:F,interval:U,...s}]}(B,Q);const{x:F,y:U}=Q;return function(B,Q,F,U,{data:t=xG,filter:s=RG,sort:I,reverse:g,...i}={},l={}){B=oh(B),Q=oh(Q),i=function(B,Q){return function(B,Q,F=CG){const U=Object.entries(B);return null!=Q.title&&void 0===B.title&&U.push(["title",AG]),null!=Q.href&&void 0===B.href&&U.push(["href",LG]),U.filter(([,B])=>void 0!==B).map(([B,U])=>null===U?function(B){return{name:B,initialize(){},scope(){},reduce(){}}}(B):F(B,U,Q))}(B,Q,Gh)}(i,l),t=rh(t,Wb),I=null==I?void 0:Gh("sort",I,l),s=null==s?void 0:uh("filter",s,l),null!=U&&dG(i,"y","y1","y2")&&(U=null);const[c,e]=bo(B),[n,d]=bo(B),[C,a]=bo(Q),[b,o]=bo(Q),[G,u]=null!=U?[U,"y"]:[],[r,x]=bo(G),{x:L,y:A,z:h,fill:R,stroke:y,x1:V,x2:Z,y1:S,y2:m,domain:E,cumulative:N,thresholds:X,interval:p,...W}=l,[H,D]=bo(h),[Y]=Kb(R),[f]=Kb(y),[w,J]=bo(Y),[v,k]=bo(f);return{..."z"in l&&{z:H||h},..."fill"in l&&{fill:w||R},..."stroke"in l&&{stroke:v||y},...UG(W,(F,U,l)=>{const c=uo(Vb(F,G),l?.[u]),n=Vb(F,h),C=Vb(F,Y),b=Vb(F,f),r=function(B,Q){for(const F in Q){const U=Q[F];if(void 0!==U&&!B.some(B=>B.name===F))return U}}(i,{z:n,fill:C,stroke:b}),L=[],A=[],R=c&&x([]),y=n&&D([]),V=C&&J([]),Z=b&&k([]),S=B&&e([]),m=B&&d([]),E=Q&&a([]),N=Q&&o([]),X=function(B,Q,F){const U=B?.(F),t=Q?.(F);return U&&t?function*(B){const Q=U.bin(B);for(const[B,[s,I]]of U.entries()){const U=t.bin(Q[B]);for(const[B,[Q,g]]of t.entries())yield[U[B],{data:F,x1:s,y1:Q,x2:I,y2:g}]}}:U?function*(B){const Q=U.bin(B);for(const[B,[t,s]]of U.entries())yield[Q[B],{data:F,x1:t,x2:s}]}:function*(B){const Q=t.bin(B);for(const[B,[U,s]]of t.entries())yield[Q[B],{data:F,y1:U,y2:s}]}}(B,Q,F);let p=0;for(const B of i)B.initialize(F);I&&I.initialize(F),s&&s.initialize(F);for(const B of U){const Q=[];for(const Q of i)Q.scope("facet",B);I&&I.scope("facet",B),s&&s.scope("facet",B);for(const[U,g]of bG(B,r))for(const[B,l]of bG(g,c))for(const[g,e]of X(l))if(r&&(e.z=U),!s||s.reduce(g,e)){Q.push(p++),A.push(t.reduceIndex(g,F,e)),c&&R.push(B),n&&y.push(r===n?U:n[(g.length>0?g:l)[0]]),C&&V.push(r===C?U:C[(g.length>0?g:l)[0]]),b&&Z.push(r===b?U:b[(g.length>0?g:l)[0]]),S&&(S.push(e.x1),m.push(e.x2)),E&&(E.push(e.y1),N.push(e.y2));for(const B of i)B.reduce(g,e);I&&I.reduce(g,e)}L.push(Q)}return function(B,Q,F){if(Q){const F=Q.output.transform(),U=(B,Q)=>wa(F[B],F[Q]);B.forEach(B=>B.sort(U))}F&&B.forEach(B=>B.reverse())}(L,I,g),{data:A,facets:L}}),...!dG(i,"x")&&(c?{x1:c,x2:n,x:Go(c,n)}:{x:L,x1:V,x2:Z}),...!dG(i,"y")&&(C?{y1:C,y2:b,y:Go(C,b)}:{y:A,y1:S,y2:m}),...r&&{[u]:r},...Object.fromEntries(i.map(({name:B,output:Q})=>[B,Q]))}}(function(B,{cumulative:Q,domain:F,thresholds:U,interval:t},s){void 0===(B={...ho(B)}).domain&&(B.domain=F);void 0===B.cumulative&&(B.cumulative=Q);void 0===B.thresholds&&(B.thresholds=U);void 0===B.interval&&(B.interval=t);void 0===B.value&&(B.value=s);return B.thresholds=function(B,Q,F=Lh){if(void 0===B)return void 0===Q?F:Lo(Q);if("string"==typeof B){switch(B.toLowerCase()){case"freedman-diaconis":return UQ;case"scott":return tQ;case"sturges":return KB;case"auto":return Lh}return ab(B)}return B}(B.thresholds,B.interval),B}(F,Q,Wb),null,0,U,B,Dx(Q))}function bh(B={}){return function(B,Q,F={}){if(null==F?.interval)return F;const{reduce:U=LG}=F,t={filter:null};return null!=F[Q]&&(t[Q]=U),null!=F[`${Q}1`]&&(t[`${Q}1`]=U),null!=F[`${Q}2`]&&(t[`${Q}2`]=U),B(t,F)}(ah,"y",nx(B,"x"))}function oh(B){if(null==B)return;const{value:Q,cumulative:F,domain:U=AB,thresholds:t}=B,s=B=>{let s,I=Vb(B,Q);if(Zo(I)||function(B){return function(B){return Ao(B)&&"function"==typeof B?.floor&&B.floor()instanceof Date}(B)||Ro(B)&&Zo(B)}(t)){I=Bo(I,zb,Float64Array);let[B,Q]="function"==typeof U?U(I):U,F="function"!=typeof t||Ao(t)?t:t(I,B,Q);"number"==typeof F&&(F=Ec(B,Q,F)),Ao(F)&&(U===AB&&(B=F.floor(B),Q=F.offset(F.floor(Q))),F=F.range(B,F.offset(Q))),s=F}else{I=kb(I);let[B,Q]="function"==typeof U?U(I):U,F="function"!=typeof t||Ao(t)?t:t(I,B,Q);if("number"==typeof F)if(U===AB){let U=TB(B,Q,F);if(isFinite(U))if(U>0){let t=Math.round(B/U),s=Math.round(Q/U);t*U<=B||--t,s*U>Q||++s;let I=s-t+1;F=new Float64Array(I);for(let B=0;B<I;++B)F[B]=(t+B)*U}else if(U<0){U=-U;let t=Math.round(B*U),s=Math.round(Q*U);t/U<=B||--t,s/U>Q||++s;let I=s-t+1;F=new Float64Array(I);for(let B=0;B<I;++B)F[B]=(t+B)/U}else F=[B];else F=[B]}else F=MB(B,Q,F);else Ao(F)&&(U===AB&&(B=F.floor(B),Q=F.offset(F.floor(Q))),F=F.range(B,F.offset(Q)));s=F}const g=[];if(1===s.length)g.push([s[0],s[0]]);else for(let B=1;B<s.length;++B)g.push([s[B-1],s[B]]);return g.bin=(F<0?Rh:F>0?hh:Ah)(g,s,I),g};return s.label=oo(Q),s}function Gh(B,Q,F){return CG(B,Q,F,uh)}function uh(B,Q,F){return aG(B,Q,F,rh)}function rh(B,Q){return oG(B,Q,xh)}function xh(B){switch(`${B}`.toLowerCase()){case"x":return Vh;case"x1":return Sh;case"x2":return mh;case"y":return Zh;case"y1":return Eh;case"y2":return Nh;case"z":return SG}throw new Error(`invalid bin reduce: ${B}`)}function Lh(B,Q,F){return Math.min(200,tQ(B,Q,F))}function Ah(B,Q,F){return Q=kb(Q),U=>{const t=B.map(()=>[]);for(const B of U)t[aB(Q,F[B])-1]?.push(B);return t}}function hh(B,Q,F){const U=Ah(B,Q,F);return B=>{const Q=U(B);for(let B=1,F=Q.length;B<F;++B){const F=Q[B-1],U=Q[B];for(const B of F)U.push(B)}return Q}}function Rh(B,Q,F){const U=Ah(B,Q,F);return B=>{const Q=U(B);for(let B=Q.length-2;B>=0;--B){const F=Q[B+1],U=Q[B];for(const B of F)U.push(B)}return Q}}function yh(B,Q){const F=(+B+ +Q)/2;return B instanceof Date?new Date(F):F}const Vh={reduceIndex:(B,Q,{x1:F,x2:U})=>yh(F,U)},Zh={reduceIndex:(B,Q,{y1:F,y2:U})=>yh(F,U)},Sh={reduceIndex:(B,Q,{x1:F})=>F},mh={reduceIndex:(B,Q,{x2:F})=>F},Eh={reduceIndex:(B,Q,{y1:F})=>F},Nh={reduceIndex:(B,Q,{y2:F})=>F},Xh={ariaLabel:"dot",fill:"none",stroke:"currentColor",strokeWidth:1.5};function ph(B){return void 0===B.sort&&void 0===B.reverse?function(B,{sort:Q,...F}={}){return{...(so(B)&&void 0!==B.channel?tG:gG)(F,cG(B)),sort:Io(Q)?Q:null}}({channel:"-r"},B):B}class Wh extends ix{constructor(B,Q={}){const{x:F,y:U,r:t,rotate:s,symbol:I=UC,frameAnchor:g}=Q,[i,l]=Ob(s,0),[c,e]=function(B){if(null==B||BG(B))return[void 0,B];if("string"==typeof B){const Q=qo.get(`${B}`.toLowerCase());if(Q)return[void 0,Q]}return[B,void 0]}(I),[n,d]=Ob(t,null==c?3:4.5);super(B,{x:{value:F,scale:"x",optional:!0},y:{value:U,scale:"y",optional:!0},r:{value:n,scale:"r",filter:Ma,optional:!0},rotate:{value:i,optional:!0},symbol:{value:c,scale:"auto",optional:!0}},ph(Q),Xh),this.r=d,this.rotate=l,this.symbol=e,this.frameAnchor=Yo(g);const{channels:C}=this,{symbol:a}=C;if(a){const{fill:B,stroke:Q}=C;a.hint={fill:B?B.value===a.value?"color":"currentColor":this.fill??"currentColor",stroke:Q?Q.value===a.value?"color":"currentColor":this.stroke??"none"}}}render(B,Q,F,U,t){const{x:s,y:I}=Q,{x:g,y:i,r:l,rotate:c,symbol:e}=F,{r:n,rotate:d,symbol:C}=this,[a,b]=gx(this,U),o=C===UC,G=l?void 0:n*n*Math.PI;return Ta(n)&&(B=[]),mr("svg:g",t).call(_r,this,U,t).call(Qx,this,{x:g&&s,y:i&&I}).call(Q=>Q.selectAll().data(B).enter().append(o?"circle":"path").call($r,this).call(o?B=>{B.attr("cx",g?B=>g[B]:a).attr("cy",i?B=>i[B]:b).attr("r",l?B=>l[B]:n)}:B=>{B.attr("transform",Px`translate(${g?B=>g[B]:a},${i?B=>i[B]:b})${c?B=>` rotate(${c[B]})`:d?` rotate(${d})`:""}`).attr("d",l&&e?B=>{const Q=vs();return e[B].draw(Q,l[B]*l[B]*Math.PI),Q}:l?B=>{const Q=vs();return C.draw(Q,l[B]*l[B]*Math.PI),Q}:e?B=>{const Q=vs();return e[B].draw(Q,G),Q}:(()=>{const B=vs();return C.draw(B,G),B})())}).call(Mr,this,F)).node()}}function Hh(B,{x:Q,y:F,...U}={}){return void 0===U.frameAnchor&&([Q,F]=go(Q,F)),new Wh(B,{...U,x:Q,y:F})}const Dh={ariaLabel:"line",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round",strokeMiterlimit:1};class Yh extends ix{constructor(B,Q={}){const{x:F,y:U,z:t,curve:s,tension:I}=Q;super(B,{x:{value:F,scale:"x"},y:{value:U,scale:"y"},z:{value:io(Q),optional:!0}},Q,Dh),this.z=t,this.curve=dh(s,I),hx(this,Q)}filter(B){return B}project(B,Q,F){this.curve!==Ch&&super.project(B,Q,F)}render(B,Q,F,U,t){const{x:s,y:I}=F,{curve:g}=this;return mr("svg:g",t).call(_r,this,U,t).call(Qx,this,Q).call(Q=>Q.selectAll().data(zr(B,[s,I],this,F)).enter().append("path").call($r,this).call(Tr,this,F).call(Xx,this,F,t).attr("d",g===Ch&&t.projection?function(B,Q,F){return Q=kb(Q),F=kb(F),U=>{let t=[];const s=[t];for(const B of U)-1===B?(t=[],s.push(t)):t.push([Q[B],F[B]]);return B({type:"MultiLineString",coordinates:s})}}(t.path(),s,I):qd().curve(g).defined(B=>B>=0).x(B=>s[B]).y(B=>I[B]))).node()}}function fh(B,{x:Q=pb,y:F=Wb,...U}={}){return new Yh(B,bh({...U,x:Q,y:F}))}function wh(B,Q,F){var U=Q,t=function(B){return atob(B)}(B),s=t.indexOf("\n",10)+1,I=t.substring(s)+"//# sourceMappingURL="+U,g=new Blob([I],{type:"application/javascript"});return URL.createObjectURL(g)}function Jh(B,Q,F){var U;return function(F){return U=U||wh(B,Q),new Worker(U,F)}}ix.prototype.plot=function({marks:B=[],...Q}={}){return OA({...Q,marks:[...B,this]})};var vh=Jh("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgdmFyIGRpc3RyaWJ1dGlvbnMkMSA9IHtleHBvcnRzOiB7fX07CgogIHZhciBkaXN0cmlidXRpb25zID0gZGlzdHJpYnV0aW9ucyQxLmV4cG9ydHM7CiAgKGZ1bmN0aW9uIChtb2R1bGUpIHsKCiAgICAvLyBBIG51bWJlciBvZiBsb2cgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbnMgKFBERikuIE5hbWluZyBhbmQgcGFyYW1ldGVyaXphdGlvbgogICAgLy8gc2hvdWxkIG1hdGNoIFIncywgZXhjZXB0IGZvciB0aGF0IGFsbCBmdW5jdGlvbnMgcmVzaWRlIGluIGFuIGxkIG9iamVjdCAoCiAgICAvLyBhcyBpbiAibG9nIGRlbnNpdHkiKSwgc28gdG8gZ2V0IGEgbm9ybWFsIGxvZyBkZW5zaXR5IHlvdSB3b3VsZCB3cml0ZQogICAgLy8gbGQubm9ybSguLi4pLgogICAgLy8gTW9zdCBvZiB0aGUgY29kZSBiZWxvdyBpcyBkaXJlY3RseSB0YWtlbiBmcm9tIHRoZSBncmVhdCBKc3RhdCBwcm9qZWN0CiAgICAvLyAoaHR0cHM6Ly9naXRodWIuY29tL2pzdGF0Lykgd2hpY2ggaW5jbHVkZXMgUERGIGZvciBtYW55IGNvbW1vbiBwcm9iYWJpbGl0eQogICAgLy8gZGlzdHJpYnV0aW9ucy4gV2hhdCBJIGhhdmUgZG9uZSBpcyBvbmx5IHRvIGNvbnZlcnQgdGhlc2UgdG8gbG9nIFBERnMuCgogICAgLyoKICAgIE9yaWdpbmFsIHdvcmsgQ29weXJpZ2h0IChjKSAyMDEzIGpTdGF0CiAgICBNb2RpZmllZCB3b3JrIENvcHlyaWdodCAoYykgMjAxNSBSYXNtdXMgQsOlw6V0aCAKICAgIAlQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiAgICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAogICAgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwogICAgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAogICAgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCiAgICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogICAgCVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCiAgICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KICAgIAlUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogICAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKICAgIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKICAgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCiAgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCiAgICBUSEUgU09GVFdBUkUuCiAgICAJKi8KCiAgICAvLyBUaGlzIGJvaWxlciBwbGF0ZSBjb2RlIGhlcmUgaXMgdGFrZW4gZnJvbToKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS91bWRqcy91bWQvYmxvYi9tYXN0ZXIvdGVtcGxhdGVzL3JldHVybkV4cG9ydHMuanMKICAgIC8vIEl0IHNob3VsZCBtYWtlIHNodXJlIHRoYXQgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBib3RoIGluIHRoZSBicm93c2VyLAogICAgLy8gTm9kZSwgYW5kIGJ5IHVzaW5nIHRoZSBBc3luY2hyb25vdXMgTW9kdWxlIERlZmluaXRpb24gc3RhbmRhcmQuCiAgICAvLyBJZiB0aGlzIG1vZHVsZSBpcyBsb2FkZWQgaW4gdGhlIGJyb3dzZXIgaXQgd2lsbCBjcmVhdGVkIHRoZSBnbG9iYWwKICAgIC8vIG9iamVjdCBsZCAuCiAgICAoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHsKICAgICAgaWYgKG1vZHVsZS5leHBvcnRzKSB7CiAgICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0CiAgICAgICAgLy8gb25seSBDb21tb25KUy1saWtlIGVudmlyb25tZW50cyB0aGF0IHN1cHBvcnQgbW9kdWxlLmV4cG9ydHMsCiAgICAgICAgLy8gbGlrZSBOb2RlLgogICAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFscyAocm9vdCBpcyB3aW5kb3cpCiAgICAgICAgcm9vdC5sZCA9IGZhY3RvcnkoKTsKICAgICAgfQogICAgfSkoZGlzdHJpYnV0aW9ucywgZnVuY3Rpb24gKCkgewogICAgICAvLyBPYmplY3QgdG8gaG9sZCB0aGUgZnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkLgogICAgICB2YXIgbGQgPSB7fTsKCiAgICAgIC8vLy8vLy8vLy8gSGVscGVyIGZ1bmN0aW9ucyAvLy8vLy8vLy8vCiAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICB2YXIgbGdhbW1hID0gZnVuY3Rpb24gKHgpIHsKICAgICAgICB2YXIgaiA9IDA7CiAgICAgICAgdmFyIGNvZiA9IFs3Ni4xODAwOTE3Mjk0NzE0NiwgLTg2LjUwNTMyMDMyOTQxNjc4LCAyNC4wMTQwOTgyNDA4MzA5MSwgLTEuMjMxNzM5NTcyNDUwMTU1LCAwLjEyMDg2NTA5NzM4NjYxNzllLTIsIC01Mzk1MjM5Mzg0OTUzZS0xOF07CiAgICAgICAgdmFyIHNlciA9IDEuMDAwMDAwMDAwMTkwMDE1OwogICAgICAgIHZhciB4eCwgeSwgdG1wOwogICAgICAgIHRtcCA9ICh5ID0geHggPSB4KSArIDUuNTsKICAgICAgICB0bXAgLT0gKHh4ICsgMC41KSAqIGxvZyh0bXApOwogICAgICAgIGZvciAoOyBqIDwgNjsgaisrKSBzZXIgKz0gY29mW2pdIC8gKyt5OwogICAgICAgIHJldHVybiBsb2coMi41MDY2MjgyNzQ2MzEwMDA1ICogc2VyIC8geHgpIC0gdG1wOwogICAgICB9OwogICAgICBsZC5sZ2FtbWEgPSBsZ2FtbWE7CiAgICAgIHZhciBsZmFjdG9yaWFsID0gZnVuY3Rpb24gKG4pIHsKICAgICAgICByZXR1cm4gbiA8IDAgPyBOYU4gOiBsZ2FtbWEobiArIDEpOwogICAgICB9OwogICAgICBsZC5sZmFjdG9yaWFsID0gbGZhY3RvcmlhbDsKICAgICAgdmFyIGxjaG9vc2UgPSBmdW5jdGlvbiAobiwgaykgewogICAgICAgIHJldHVybiBsZmFjdG9yaWFsKG4pIC0gbGZhY3RvcmlhbChrKSAtIGxmYWN0b3JpYWwobiAtIGspOwogICAgICB9OwogICAgICBsZC5sY2hvb3NlID0gbGNob29zZTsKICAgICAgdmFyIGxiZXRhID0gZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICByZXR1cm4gbGdhbW1hKGEpICsgbGdhbW1hKGIpIC0gbGdhbW1hKGEgKyBiKTsKICAgICAgfTsKICAgICAgbGQubGJldGEgPSBsYmV0YTsKICAgICAgdmFyIGxvZyA9IE1hdGgubG9nOwogICAgICB2YXIgZXhwID0gTWF0aC5leHA7CiAgICAgIHZhciBhYnMgPSBNYXRoLmFiczsKICAgICAgdmFyIHBvdyA9IE1hdGgucG93OwogICAgICB2YXIgc3FydCA9IE1hdGguc3FydDsKICAgICAgdmFyIHBpID0gTWF0aC5QSTsKCiAgICAgIC8vLy8vLy8vLy8gQ29udGlub3VzIGRpc3RyaWJ1dGlvbnMgLy8vLy8vLy8vLwogICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgIGxkLmJldGEgPSBmdW5jdGlvbiAoeCwgc2hhcGUxLCBzaGFwZTIpIHsKICAgICAgICBpZiAoeCA+IDEgfHwgeCA8IDApIHsKICAgICAgICAgIHJldHVybiAtSW5maW5pdHk7CiAgICAgICAgfQogICAgICAgIGlmIChzaGFwZTEgPT09IDEgJiYgc2hhcGUyID09PSAxKSB7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIChzaGFwZTEgLSAxKSAqIGxvZyh4KSArIChzaGFwZTIgLSAxKSAqIGxvZygxIC0geCkgLSBsYmV0YShzaGFwZTEsIHNoYXBlMik7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZC5jYXVjaHkgPSBmdW5jdGlvbiAoeCwgbG9jYXRpb24sIHNjYWxlKSB7CiAgICAgICAgcmV0dXJuIGxvZyhzY2FsZSkgLSBsb2cocG93KHggLSBsb2NhdGlvbiwgMikgKyBwb3coc2NhbGUsIDIpKSAtIGxvZyhwaSk7CiAgICAgIH07CiAgICAgIGxkLm5vcm0gPSBmdW5jdGlvbiAoeCwgbWVhbiwgc2QpIHsKICAgICAgICByZXR1cm4gLTAuNSAqIGxvZygyICogcGkpIC0gbG9nKHNkKSAtIHBvdyh4IC0gbWVhbiwgMikgLyAoMiAqIHNkICogc2QpOwogICAgICB9OwoKICAgICAgLy8gQSBiaXZhcmlhdGUgTm9ybWFsIGRpc3RyaWJ1dGlvbiBwYXJhbWV0ZXJpemVkIGJ5IGFycmF5cyBvZiB0d28gbWVhbnMgYW5kIFNEcywgYW5kIAogICAgICAvLyB0aGUgY29ycmVsYXRpb24uCiAgICAgIGxkLmJpdmFybm9ybSA9IGZ1bmN0aW9uICh4LCBtZWFuLCBzZCwgY29ycikgewogICAgICAgIHZhciB6ID0gcG93KHhbMF0gLSBtZWFuWzBdLCAyKSAvIHBvdyhzZFswXSwgMikgKyBwb3coeFsxXSAtIG1lYW5bMV0sIDIpIC8gcG93KHNkWzFdLCAyKSAtIDIgKiBjb3JyICogKHhbMF0gLSBtZWFuWzBdKSAqICh4WzFdIC0gbWVhblsxXSkgLyAoc2RbMF0gKiBzZFsxXSk7CiAgICAgICAgdmFyIG5vcm1hbGl6aW5nX2ZhY3RvciA9IC0obG9nKDIpICsgbG9nKHBpKSArIGxvZyhzZFswXSkgKyBsb2coc2RbMV0pICsgMC41ICogbG9nKDEgLSBwb3coY29yciwgMikpKTsKICAgICAgICB2YXIgYml2YXJfbG9nX2RlbnMgPSBub3JtYWxpemluZ19mYWN0b3IgLSB6IC8gKDIgKiAoMSAtIHBvdyhjb3JyLCAyKSkpOwogICAgICAgIHJldHVybiBiaXZhcl9sb2dfZGVuczsKICAgICAgfTsKICAgICAgbGQubGFwbGFjZSA9IGZ1bmN0aW9uICh4LCBsb2NhdGlvbiwgc2NhbGUpIHsKICAgICAgICByZXR1cm4gLWFicyh4IC0gbG9jYXRpb24pIC8gc2NhbGUgLSBsb2coMiAqIHNjYWxlKTsKICAgICAgfTsKICAgICAgbGQuZGV4cCA9IGxkLmxhcGxhY2U7CiAgICAgIGxkLmdhbW1hID0gZnVuY3Rpb24gKHgsIHNoYXBlLCByYXRlKSB7CiAgICAgICAgdmFyIHNjYWxlID0gMSAvIHJhdGU7CiAgICAgICAgaWYgKHggPCAwKSB7CiAgICAgICAgICByZXR1cm4gLUluZmluaXR5OwogICAgICAgIH0KICAgICAgICBpZiAoeCA9PT0gMCAmJiBzaGFwZSA9PT0gMSkgewogICAgICAgICAgcmV0dXJuIC1sb2coc2NhbGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gKHNoYXBlIC0gMSkgKiBsb2coeCkgLSB4IC8gc2NhbGUgLSBsZ2FtbWEoc2hhcGUpIC0gc2hhcGUgKiBsb2coc2NhbGUpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgbGQuaW52Z2FtbWEgPSBmdW5jdGlvbiAoeCwgc2hhcGUsIHNjYWxlKSB7CiAgICAgICAgaWYgKHggPD0gMCkgewogICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIC0oc2hhcGUgKyAxKSAqIGxvZyh4KSAtIHNjYWxlIC8geCAtIGxnYW1tYShzaGFwZSkgKyBzaGFwZSAqIGxvZyhzY2FsZSk7CiAgICAgIH07CiAgICAgIGxkLmxub3JtID0gZnVuY3Rpb24gKHgsIG1lYW5sb2csIHNkbG9nKSB7CiAgICAgICAgaWYgKHggPD0gMCkgewogICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIC1sb2coeCkgLSAwLjUgKiBsb2coMiAqIHBpKSAtIGxvZyhzZGxvZykgLSBwb3cobG9nKHgpIC0gbWVhbmxvZywgMikgLyAoMiAqIHNkbG9nICogc2Rsb2cpOwogICAgICB9OwogICAgICBsZC5wYXJldG8gPSBmdW5jdGlvbiAoeCwgc2NhbGUsIHNoYXBlKSB7CiAgICAgICAgaWYgKHggPCBzY2FsZSkgewogICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxvZyhzaGFwZSkgKyBzaGFwZSAqIGxvZyhzY2FsZSkgLSAoc2hhcGUgKyAxKSAqIGxvZyh4KTsKICAgICAgfTsKICAgICAgbGQudCA9IGZ1bmN0aW9uICh4LCBsb2NhdGlvbiwgc2NhbGUsIGRmKSB7CiAgICAgICAgZGYgPSBkZiA+IDFlMTAwID8gMWUxMDAgOiBkZjsKICAgICAgICByZXR1cm4gbGdhbW1hKChkZiArIDEpIC8gMikgLSBsZ2FtbWEoZGYgLyAyKSAtIGxvZyhzcXJ0KHBpICogZGYpICogc2NhbGUpICsgbG9nKHBvdygxICsgMSAvIGRmICogcG93KCh4IC0gbG9jYXRpb24pIC8gc2NhbGUsIDIpLCAtKGRmICsgMSkgLyAyKSk7CiAgICAgIH07CgogICAgICAvLyBUaGlzIGlzIGEgZGlyZWN0IGphdmFzY3JpcHQgdHJhbnNsYXRpb24gb2YgdGhlIFIgY29kZSB1c2VkIHRvIGV2YWx1YXRlCiAgICAgIC8vIHRoZSBsb2cgZGVuc2l0eSBvZiBhIHdlaWJ1bGwgZGlzdHJpYnV0aW9uOiAKICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3djaC9yLXNvdXJjZS9ibG9iL2IxNTZlM2E3MTE5NjdmNTgxMzFlMjNjMWIxZGMxZWE5MGUyZjBjNDMvc3JjL25tYXRoL2R3ZWlidWxsLmMKICAgICAgbGQud2VpYnVsbCA9IGZ1bmN0aW9uICh4LCBzaGFwZSwgc2NhbGUpIHsKICAgICAgICBpZiAoeCA8IDApIHJldHVybiAtSW5maW5pdHk7CiAgICAgICAgaWYgKHggPT09IDAgJiYgc2hhcGUgPCAxKSByZXR1cm4gSW5maW5pdHk7CiAgICAgICAgdmFyIHRtcDEgPSBwb3coeCAvIHNjYWxlLCBzaGFwZSAtIDEpOwogICAgICAgIHZhciB0bXAyID0gdG1wMSAqICh4IC8gc2NhbGUpOwogICAgICAgIHJldHVybiAtdG1wMiArIGxvZyhzaGFwZSAqIHRtcDEgLyBzY2FsZSk7CiAgICAgIH07CgogICAgICAvLyBUaGlzIGlzIGEgZGlyZWN0IGphdmFzY3JpcHQgdHJhbnNsYXRpb24gb2YgdGhlIFIgY29kZSB1c2VkIHRvIGV2YWx1YXRlCiAgICAgIC8vIHRoZSBsb2cgZGVuc2l0eSBvZiBhIGxvZ2lzdGljIGRpc3RyaWJ1dGlvbjogCiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93Y2gvci1zb3VyY2UvYmxvYi9iMTU2ZTNhNzExOTY3ZjU4MTMxZTIzYzFiMWRjMWVhOTBlMmYwYzQzL3NyYy9ubWF0aC9kbG9naXMuYwogICAgICBsZC5sb2dpcyA9IGZ1bmN0aW9uICh4LCBsb2NhdGlvbiwgc2NhbGUpIHsKICAgICAgICB4ID0gYWJzKCh4IC0gbG9jYXRpb24pIC8gc2NhbGUpOwogICAgICAgIHZhciBlID0gZXhwKC14KTsKICAgICAgICB2YXIgZiA9IDEuMCArIGU7CiAgICAgICAgcmV0dXJuIC0oeCArIGxvZyhzY2FsZSAqIGYgKiBmKSk7CiAgICAgIH07CiAgICAgIGxkLmRpcmljaGxldCA9IGZ1bmN0aW9uICh4LCBhbHBoYSkgewogICAgICAgIHZhciBzdW1fYWxwaGEgPSAwOwogICAgICAgIHZhciBzdW1fbGdhbW1hX2FscGhhID0gMDsKICAgICAgICB2YXIgc3VtX2FscGhhX3N1Yl8xX2xvZ194ID0gMDsKICAgICAgICB2YXIgbiA9IGFscGhhLmxlbmd0aDsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgICAgc3VtX2FscGhhICs9IGFscGhhW2ldOwogICAgICAgICAgc3VtX2xnYW1tYV9hbHBoYSArPSBsZ2FtbWEoYWxwaGFbaV0pOwogICAgICAgICAgc3VtX2FscGhhX3N1Yl8xX2xvZ194ICs9IChhbHBoYVtpXSAtIDEpICogbG9nKHhbaV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGdhbW1hKHN1bV9hbHBoYSkgLSBzdW1fbGdhbW1hX2FscGhhICsgc3VtX2FscGhhX3N1Yl8xX2xvZ194OwogICAgICB9OwogICAgICBsZC5leHAgPSBmdW5jdGlvbiAoeCwgcmF0ZSkgewogICAgICAgIHJldHVybiB4IDwgMCA/IC1JbmZpbml0eSA6IGxvZyhyYXRlKSAtIHJhdGUgKiB4OwogICAgICB9OwogICAgICBsZC51bmlmID0gZnVuY3Rpb24gKHgsIG1pbiwgbWF4KSB7CiAgICAgICAgcmV0dXJuIHggPCBtaW4gfHwgeCA+IG1heCA/IC1JbmZpbml0eSA6IGxvZygxIC8gKG1heCAtIG1pbikpOwogICAgICB9OwoKICAgICAgLy8vLy8vLy8vLyBEaXNjcmV0ZSBkaXN0cmlidXRpb25zIC8vLy8vLy8vLy8KICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgIGxkLmJlcm4gPSBmdW5jdGlvbiAoeCwgcHJvYikgewogICAgICAgIHJldHVybiAhKHggPT09IDAgfHwgeCA9PT0gMSkgPyAtSW5maW5pdHkgOiBsb2coeCAqIHByb2IgKyAoMSAtIHgpICogKDEgLSBwcm9iKSk7CiAgICAgIH07CiAgICAgIGxkLmNhdCA9IGZ1bmN0aW9uICh4LCBwcm9icykgewogICAgICAgIGlmICh4IDwgMSB8fCB4ID4gcHJvYnMubGVuZ3RoKSB7CiAgICAgICAgICByZXR1cm4gLUluZmluaXR5OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gbG9nKHByb2JzW3ggLSAxXSk7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZC5iaW5vbSA9IGZ1bmN0aW9uICh4LCBzaXplLCBwcm9iKSB7CiAgICAgICAgaWYgKHggPiBzaXplIHx8IHggPCAwKSB7CiAgICAgICAgICByZXR1cm4gLUluZmluaXR5OwogICAgICAgIH0KICAgICAgICBpZiAocHJvYiA9PT0gMCB8fCBwcm9iID09PSAxKSB7CiAgICAgICAgICByZXR1cm4gc2l6ZSAqIHByb2IgPT09IHggPyAwIDogLUluZmluaXR5OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGNob29zZShzaXplLCB4KSArIHggKiBsb2cocHJvYikgKyAoc2l6ZSAtIHgpICogbG9nKDEgLSBwcm9iKTsKICAgICAgfTsKICAgICAgbGQubmJpbm9tID0gZnVuY3Rpb24gKHgsIHNpemUsIHByb2IpIHsKICAgICAgICBpZiAoeCA8IDApIHsKICAgICAgICAgIHJldHVybiAtSW5maW5pdHk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsY2hvb3NlKHggKyBzaXplIC0gMSwgc2l6ZSAtIDEpICsgeCAqIGxvZygxIC0gcHJvYikgKyBzaXplICogbG9nKHByb2IpOwogICAgICB9OwogICAgICBsZC5oeXBlciA9IGZ1bmN0aW9uICh4LCBtLCBuLCBrKSB7CiAgICAgICAgaWYgKHggPCAwIHx8IHggPiBrKSB7CiAgICAgICAgICByZXR1cm4gLUluZmluaXR5OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gbGNob29zZShtLCB4KSArIGxjaG9vc2UobiwgayAtIHgpIC0gbGNob29zZShtICsgbiwgayk7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZC5wb2lzID0gZnVuY3Rpb24gKHgsIGxhbWJkYSkgewogICAgICAgIHJldHVybiB4IDwgMCA/IC1JbmZpbml0eSA6IGxvZyhsYW1iZGEpICogeCAtIGxhbWJkYSAtIGxmYWN0b3JpYWwoeCk7CiAgICAgIH07CiAgICAgIHJldHVybiBsZDsKICAgIH0pOwogIH0pKGRpc3RyaWJ1dGlvbnMkMSk7CiAgdmFyIGRpc3RyaWJ1dGlvbnNFeHBvcnRzID0gZGlzdHJpYnV0aW9ucyQxLmV4cG9ydHM7CgogIHZhciBtY21jJDEgPSB7ZXhwb3J0czoge319OwoKICB2YXIgbWNtYyA9IG1jbWMkMS5leHBvcnRzOwogIChmdW5jdGlvbiAobW9kdWxlKSB7CgogICAgLy8gVGhpcyBib2lsZXIgcGxhdGUgY29kZSBoZXJlIGlzIHRha2VuIGZyb206CiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdW1kanMvdW1kL2Jsb2IvbWFzdGVyL3RlbXBsYXRlcy9yZXR1cm5FeHBvcnRzLmpzCiAgICAvLyBJdCBzaG91bGQgbWFrZSBzaHVyZSB0aGF0IG1vZHVsZSBjYW4gYmUgaW1wb3J0ZWQgYm90aCBpbiB0aGUgYnJvd3NlciwKICAgIC8vIE5vZGUsIGFuZCBieSB1c2luZyB0aGUgQXN5bmNocm9ub3VzIE1vZHVsZSBEZWZpbml0aW9uIHN0YW5kYXJkLgogICAgLy8gSWYgdGhpcyBtb2R1bGUgaXMgbG9hZGVkIGluIHRoZSBicm93c2VyIGl0IHdpbGwgY3JlYXRlZCB0aGUgZ2xvYmFsCiAgICAvLyBvYmplY3QgbWNtYyAuCiAgICAoZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHsKICAgICAgaWYgKG1vZHVsZS5leHBvcnRzKSB7CiAgICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0CiAgICAgICAgLy8gb25seSBDb21tb25KUy1saWtlIGVudmlyb25tZW50cyB0aGF0IHN1cHBvcnQgbW9kdWxlLmV4cG9ydHMsCiAgICAgICAgLy8gbGlrZSBOb2RlLgogICAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFscyAocm9vdCBpcyB3aW5kb3cpCiAgICAgICAgcm9vdC5tY21jID0gZmFjdG9yeSgpOwogICAgICB9CiAgICB9KShtY21jLCBmdW5jdGlvbiAoKSB7CiAgICAgIC8vLyBUaGUgYWN0dWFsIG1vZHVsZSBjb2RlIHN0YXJ0cyBoZXJlIC8vLwogICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gIAoKICAgICAgLy8vLy8vLy8vLyBIZWxwZXIgRnVuY3Rpb25zIC8vLy8vLy8vLy8KICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgIC8qKiBSZXR1cm5zIGEgcmFuZG9tIHJlYWwgbnVtYmVyIGJldHdlZW4gbWluIGFuZCBtYXggKi8KICAgICAgdmFyIHJ1bmlmID0gZnVuY3Rpb24gKG1pbiwgbWF4KSB7CiAgICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSArIG1pbjsKICAgICAgfTsKCiAgICAgIC8qKiBSZXR1cm5zIGEgcmFuZG9tIGludGVnZXIgYmV0d2VlbiBtaW4gYW5kIG1heCAqLwogICAgICB2YXIgcnVuaWZfZGlzY3JldGUgPSBmdW5jdGlvbiAobWluLCBtYXgpIHsKICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKSArIG1pbjsKICAgICAgfTsKCiAgICAgIC8qKiBSZXR1cm5zIGEgcmFuZG9tIHJlYWwgbnVtYmVyIGZyb20gYSBub3JtYWwgZGlzdHJpYmJ1dGlvbiBkZWZpbmVkCiAgICAgICAqICBieSBtZWFuIGFuZCBzZC4gCiAgICAgICAqICBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2pzdGF0L2pzdGF0L2Jsb2IvbWFzdGVyL3NyYy9zcGVjaWFsLmpzICovCiAgICAgIHZhciBybm9ybSA9IGZ1bmN0aW9uIChtZWFuLCBzZCkgewogICAgICAgIHZhciB1LCB2LCB4LCB5LCBxOwogICAgICAgIGRvIHsKICAgICAgICAgIHUgPSBNYXRoLnJhbmRvbSgpOwogICAgICAgICAgdiA9IDEuNzE1NiAqIChNYXRoLnJhbmRvbSgpIC0gMC41KTsKICAgICAgICAgIHggPSB1IC0gMC40NDk4NzE7CiAgICAgICAgICB5ID0gTWF0aC5hYnModikgKyAwLjM4NjU5NTsKICAgICAgICAgIHEgPSB4ICogeCArIHkgKiAoMC4xOTYwMCAqIHkgLSAwLjI1NDcyICogeCk7CiAgICAgICAgfSB3aGlsZSAocSA+IDAuMjc1OTcgJiYgKHEgPiAwLjI3ODQ2IHx8IHYgKiB2ID4gLTQgKiBNYXRoLmxvZyh1KSAqIHUgKiB1KSk7CiAgICAgICAgcmV0dXJuIHYgLyB1ICogc2QgKyBtZWFuOwogICAgICB9OwoKICAgICAgLyoqIFJldHVybnMgYSBkZWVwIGNsb25lIG9mIHNyYywgc29ydCBvZi4uLiBJdCBvbmx5IGNvcGllcyBhIGxpbWl0ZWQKICAgICAgICogbnVtYmVyIG9mIHR5cGVzIGFuZCwgZm9yIGV4YW1wbGUsIGZ1bmN0aW9uIGFyZSBub3QgY29waWVkLiAKICAgICAgICogRnJvbSBodHRwOi8vZGF2aWR3YWxzaC5uYW1lL2phdmFzY3JpcHQtY2xvbmUKICAgICAgICovCiAgICAgIHZhciBkZWVwX2Nsb25lID0gZnVuY3Rpb24gKHNyYykgewogICAgICAgIGZ1bmN0aW9uIG1peGluKGRlc3QsIHNvdXJjZSwgY29weUZ1bmMpIHsKICAgICAgICAgIHZhciBuYW1lLAogICAgICAgICAgICBzLAogICAgICAgICAgICBlbXB0eSA9IHt9OwogICAgICAgICAgZm9yIChuYW1lIGluIHNvdXJjZSkgewogICAgICAgICAgICAvLyB0aGUgKCEobmFtZSBpbiBlbXB0eSkgfHwgZW1wdHlbbmFtZV0gIT09IHMpIGNvbmRpdGlvbiBhdm9pZHMgY29weWluZyBwcm9wZXJ0aWVzIGluICJzb3VyY2UiCiAgICAgICAgICAgIC8vIGluaGVyaXRlZCBmcm9tIE9iamVjdC5wcm90b3R5cGUuCSBGb3IgZXhhbXBsZSwgaWYgZGVzdCBoYXMgYSBjdXN0b20gdG9TdHJpbmcoKSBtZXRob2QsCiAgICAgICAgICAgIC8vIGRvbid0IG92ZXJ3cml0ZSBpdCB3aXRoIHRoZSB0b1N0cmluZygpIG1ldGhvZCB0aGF0IHNvdXJjZSBpbmhlcml0ZWQgZnJvbSBPYmplY3QucHJvdG90eXBlCiAgICAgICAgICAgIHMgPSBzb3VyY2VbbmFtZV07CiAgICAgICAgICAgIGlmICghKG5hbWUgaW4gZGVzdCkgfHwgZGVzdFtuYW1lXSAhPT0gcyAmJiAoIShuYW1lIGluIGVtcHR5KSB8fCBlbXB0eVtuYW1lXSAhPT0gcykpIHsKICAgICAgICAgICAgICBkZXN0W25hbWVdID0gY29weUZ1bmMgPyBjb3B5RnVuYyhzKSA6IHM7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBkZXN0OwogICAgICAgIH0KICAgICAgICBpZiAoIXNyYyB8fCB0eXBlb2Ygc3JjICE9ICJvYmplY3QiIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzcmMpID09PSAiW29iamVjdCBGdW5jdGlvbl0iKSB7CiAgICAgICAgICAvLyBudWxsLCB1bmRlZmluZWQsIGFueSBub24tb2JqZWN0LCBvciBmdW5jdGlvbgogICAgICAgICAgcmV0dXJuIHNyYzsgLy8gYW55dGhpbmcKICAgICAgICB9CiAgICAgICAgaWYgKHNyYy5ub2RlVHlwZSAmJiAiY2xvbmVOb2RlIiBpbiBzcmMpIHsKICAgICAgICAgIC8vIERPTSBOb2RlCiAgICAgICAgICByZXR1cm4gc3JjLmNsb25lTm9kZSh0cnVlKTsgLy8gTm9kZQogICAgICAgIH0KICAgICAgICBpZiAoc3JjIGluc3RhbmNlb2YgRGF0ZSkgewogICAgICAgICAgLy8gRGF0ZQogICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHNyYy5nZXRUaW1lKCkpOyAvLyBEYXRlCiAgICAgICAgfQogICAgICAgIGlmIChzcmMgaW5zdGFuY2VvZiBSZWdFeHApIHsKICAgICAgICAgIC8vIFJlZ0V4cAogICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoc3JjKTsgLy8gUmVnRXhwCiAgICAgICAgfQogICAgICAgIHZhciByLCBpLCBsOwogICAgICAgIGlmIChzcmMgaW5zdGFuY2VvZiBBcnJheSkgewogICAgICAgICAgLy8gYXJyYXkKICAgICAgICAgIHIgPSBbXTsKICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSBzcmMubGVuZ3RoOyBpIDwgbDsgKytpKSB7CiAgICAgICAgICAgIGlmIChpIGluIHNyYykgewogICAgICAgICAgICAgIHIucHVzaChkZWVwX2Nsb25lKHNyY1tpXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIGdlbmVyaWMgb2JqZWN0cwogICAgICAgICAgciA9IHNyYy5jb25zdHJ1Y3RvciA/IG5ldyBzcmMuY29uc3RydWN0b3IoKSA6IHt9OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWl4aW4ociwgc3JjLCBkZWVwX2Nsb25lKTsKICAgICAgfTsKCiAgICAgIC8qKiBTcGVjaWFsaXplZCBjbG9uZSBmdW5jdGlvbiB0aGF0IG9ubHkgY2xvbmVzIHNjYWxhcnMgYW5kIG5lc3RlZCBhcnJheXMgd2hlcmUKICAgICAgICogZWFjaCBhcnJheSBlaXRoZXIgY29uc2lzdHMgb2YgYWxsIGFycmF5cyBvciBhbGwgbnVtYmVycy4gVGhpcyBmdW5jdGlvbgogICAgICAgKiBpcyBtZWFudCBhcyBhIGZhc3Qgd2F5IG9mIGNsb25pbmcgcGFyYW1ldGVyIGRyYXdzIHdpdGhpbiB0aGUgbWNtYyBzYW1wbGluZwogICAgICAgKiBsb29wLgogICAgICAgKi8KICAgICAgdmFyIGNsb25lX3BhcmFtX2RyYXcgPSBmdW5jdGlvbiAoeCkgewogICAgICAgIGlmIChBcnJheS5pc0FycmF5KHgpKSB7CiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh4WzBdKSkgewogICAgICAgICAgICAvLyB4IGlzIGFuIGFycmF5IG9mIGFycmF5cyBzbyB3ZSBuZWVkIHRvIGNsb25lIGl0IHJlY3Vyc2l2ZWx5CiAgICAgICAgICAgIHZhciB4X2NvcHkgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHgubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICB4X2NvcHkucHVzaChjbG9uZV9wYXJhbV9kcmF3KHhbaV0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geF9jb3B5OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gV2UnbGwgYXNzdW1lIHggaXMgYSBhcnJheXMgb2Ygc2NhbGFycwogICAgICAgICAgICByZXR1cm4geC5zbGljZSgwKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gV2UnbGwgYXNzdW1lIHggaXMgYSBzY2FsYXIKICAgICAgICAgIHJldHVybiB4OwogICAgICAgIH0KICAgICAgfTsKCiAgICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgb2JqZWN0IGlzIGEgbnVtYmVyLgogICAgICAgKi8KICAgICAgdmFyIGlzX251bWJlciA9IGZ1bmN0aW9uIChvYmplY3QpIHsKICAgICAgICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PSAibnVtYmVyIiB8fCB0eXBlb2Ygb2JqZWN0ID09ICJvYmplY3QiICYmIG9iamVjdC5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyOwogICAgICB9OwoKICAgICAgLyoqCiAgICAgICAqIENyZWF0ZXMgYW5kIGluaXRpYWxpemVzIGEgKHBvc3NpYmx5IG11bHRpZGltZW5zaW9uYWwvbmVzdGVkKSBhcnJheS4KICAgICAgICogQHBhcmFtIGRpbSAtIEFuIGFycmF5IGdpdmluZyB0aGUgZGltZW5zaW9uIG9mIHRoZSBhcnJheS4gRm9yIGV4YW1wbGUsCiAgICAgICAqICAgWzVdIHdvdWxkIHlpZWxkIGEgNSBlbGVtZW50IGFycmF5LCBhbmQgWzMsM10gd291bGQgeWllbGQgYSAzIGJ5IDMgbWF0cml4LgogICAgICAgKiBAcGFyYW0gaW5pdCAtIEEgdmFsdWUgb3IgYSBmdW5jdGlvbiB1c2VkIHRvIGZpbGwgaW4gdGhlIGVhY2ggZWxlbWVudCBpbgogICAgICAgKiAgIHRoZSBhcnJheS4gSWYgaXQgaXMgYSBmdW5jdGlvbiBpdCBzaG91bGQgdGFrZSBubyBhcmd1bWVudHMsIGl0IHdpbGwgYmUgCiAgICAgICAqICAgZXZhbHVhdGVkIG9uY2UgZm9yIGVhY2ggZWxlbWVudCwgYW5kIGl0J3MgcmV0dXJuIHZhbHVlIHdpbGwgYmUgdXNlZCB0bwogICAgICAgKiAgIGZpbGwgaW4gZWFjaCBlbGVtZW50LgogICAgICAgKiBAZXhhbXBsZSAKICAgICAgICogLy8gVGhlIGZvbGxvd2luZyB3b3VsZCByZXR1cm4gW1sxLDFdLFsxLDFdLFsxLDFdXQogICAgICAgKiBjcmVhdGVfYXJyYXkoWzIsM10sIDEpCiAgICAgICAqLwogICAgICB2YXIgY3JlYXRlX2FycmF5ID0gZnVuY3Rpb24gKGRpbSwgaW5pdCkgewogICAgICAgIHZhciBhcnIgPSBuZXcgQXJyYXkoZGltWzBdKTsKICAgICAgICB2YXIgaTsKICAgICAgICBpZiAoZGltLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAvLyBGaWxsIGl0IHVwIHdpdGggaW5pdAogICAgICAgICAgaWYgKHR5cGVvZiBpbml0ID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykgewogICAgICAgICAgICAgIGFycltpXSA9IGluaXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7CiAgICAgICAgICAgICAgYXJyW2ldID0gaW5pdDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoZGltLmxlbmd0aCA+IDEpIHsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykgewogICAgICAgICAgICBhcnJbaV0gPSBjcmVhdGVfYXJyYXkoZGltLnNsaWNlKDEpLCBpbml0KTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgImNyZWF0ZV9hcnJheSBjYW4ndCBjcmVhdGUgYSBkaW1lbnNpb25sZXNzIGFycmF5IjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFycjsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm4gdGhlIGRpbWVuc2lvbnMgb2YgYSBwb3NzaWJseSBuZXN0ZWQgYXJyYXkgYXMgYW4gYXJyYXkuIEZvciAKICAgICAgICogZXhhbXBsZSwgYXJyYXlfZGltKCBbWzEsIDJdLCBbMSwgMl1dICkgc2hvdWxkIHJldHVybiBbMiwgMl0KICAgICAgICogQXNzdW1lcyB0aGF0IGFsbCBhcnJheXMgaW5zaWRlIGFub3RoZXIgYXJyYXkgYXJlIG9mIHRoZSBzYW1lIGxlbmd0aC4KICAgICAgICogQGV4YW1wbGUKICAgICAgICogLy8gU2hvdWxkIHJldHVybiBbNCwgMiwgMV0KICAgICAgICogYXJyYXlfZGltKGNyZWF0ZV9hcnJheShbNCwgMiwgMV0sIDApKQogICAgICAgKi8KICAgICAgdmFyIGFycmF5X2RpbSA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYVswXSkpIHsKICAgICAgICAgIHJldHVybiBbYS5sZW5ndGhdLmNvbmNhdChhcnJheV9kaW0oYVswXSkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gW2EubGVuZ3RoXTsKICAgICAgICB9CiAgICAgIH07CgogICAgICAvKioKICAgICAgICogQ2hlY2tzIGlmIHR3byBhcnJheXMgYXJlIGVxdWFsIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgY29udGFpbiB0aGUgc2FtZSBlbGVtZW50cwogICAgICAgKiBhcyBqdWRnZWQgYnkgdGhlICI9PSIgb3BlcmF0b3IuIFJldHVybnMgdHJ1ZSBvciBmYWxzZS4KICAgICAgICogQWRhcHRlZCBmcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE0ODUzOTc0LzEwMDE4NDgKICAgICAgICovCiAgICAgIHZhciBhcnJheV9lcXVhbCA9IGZ1bmN0aW9uIChhMSwgYTIpIHsKICAgICAgICBpZiAoYTEubGVuZ3RoICE9IGEyLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgbmVzdGVkIGFycmF5cwogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYTFbaV0pICYmIEFycmF5LmlzQXJyYXkoYTJbaV0pKSB7CiAgICAgICAgICAgIC8vIHJlY3Vyc2UgaW50byB0aGUgbmVzdGVkIGFycmF5cwogICAgICAgICAgICBpZiAoIWFycmF5X2VxdWFsKGExW2ldLCBhMltpXSkpIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0gZWxzZSBpZiAoYTFbaV0gIT0gYTJbaV0pIHsKICAgICAgICAgICAgLy8gV2FybmluZyAtIHR3byBkaWZmZXJlbnQgb2JqZWN0IGluc3RhbmNlcyB3aWxsIG5ldmVyIGJlIGVxdWFsOiB7eDoyMH0gIT0ge3g6MjB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH07CgogICAgICAvKioKICAgICAgICogVHJhdmVyc2VzIGEgcG9zc2libHkgbmVzdGVkIGFycmF5IGEgYW5kIGFwcGxpZXMgZnVuIHRvIGFsbCAibGVhZiBub2RlcyIsIAogICAgICAgKiB0aGF0IGlzLCB2YWx1ZXMgdGhhdCBhcmUgbm90IGFycmF5cy4gUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgc2FtZSBzaXplIGFzCiAgICAgICAqIGEuCiAgICAgICAqLwogICAgICB2YXIgbmVzdGVkX2FycmF5X2FwcGx5ID0gZnVuY3Rpb24gKGEsIGZ1bikgewogICAgICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7CiAgICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5KGEubGVuZ3RoKTsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICByZXN1bHRbaV0gPSBuZXN0ZWRfYXJyYXlfYXBwbHkoYVtpXSwgZnVuKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBmdW4oYSk7CiAgICAgICAgfQogICAgICB9OwoKICAgICAgLyoqIFJhbmRvbWl6aW5nIHRoZSBhcnJheSBlbGVtZW50IG9yZGVyIGluLXBsYWNlLiBVc2luZyBEdXJzdGVuZmVsZAogICAgICAgKiBzaHVmZmxlIGFsZ29yaXRobS4gQWRhcHRlZCBmcm9tIGhlcmU6IAogICAgICAgKiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xMjY0Njg2NC8xMDAxODQ4CiAgICAgICAqLwogICAgICBmdW5jdGlvbiBzaHVmZmxlX2FycmF5KGFycmF5KSB7CiAgICAgICAgZm9yICh2YXIgaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHsKICAgICAgICAgIHZhciBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGkgKyAxKSk7CiAgICAgICAgICB2YXIgdGVtcCA9IGFycmF5W2ldOwogICAgICAgICAgYXJyYXlbaV0gPSBhcnJheVtqXTsKICAgICAgICAgIGFycmF5W2pdID0gdGVtcDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICB9CgogICAgICAvKioKICAgICAgICogRG9lcyB0aGUgc2FtZSB0aGluZyBhcyBuZXN0ZWRfYXJyYXlfYXBwbHksIHRoYXQgaXMsIHRyYXZlcnNlcyBhIHBvc3NpYmx5CiAgICAgICAqIG5lc3RlZCBhcnJheSBhIGFuZCBhcHBsaWVzIGZ1biB0byBhbGwgImxlYWYgbm9kZXMiIGFuZCByZXR1cm5zIGFuIGFycmF5IAogICAgICAgKiBvZiB0aGUgc2FtZSBzaXplIGFzIGEuIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgbmVzdGVkX2FycmF5X3JhbmRvbV9hcHBseQogICAgICAgKiBicmFuY2hlcyByYW5kb21seS4KICAgICAgICovCiAgICAgIHZhciBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5ID0gZnVuY3Rpb24gKGEsIGZ1bikgewogICAgICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7CiAgICAgICAgICB2YXIgbGVuID0gYS5sZW5ndGg7CiAgICAgICAgICB2YXIgaTsKICAgICAgICAgIHZhciBhcnJheV9pcyA9IFtdOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGFycmF5X2lzW2ldID0gaTsKICAgICAgICAgIH0KICAgICAgICAgIHNodWZmbGVfYXJyYXkoYXJyYXlfaXMpOwogICAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIHZhciBhcnJheV9pID0gYXJyYXlfaXNbaV07CiAgICAgICAgICAgIHJlc3VsdFthcnJheV9pXSA9IG5lc3RlZF9hcnJheV9hcHBseShhW2FycmF5X2ldLCBmdW4pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGZ1bihhKTsKICAgICAgICB9CiAgICAgIH07CgogICAgICAvKioKICAgICAgICogQWxsb3dzIGEgcHJldHR5IHdheSBvZiBzZXR0aW5nIGRlZmF1bHQgb3B0aW9ucyB3aGVyZSB0aGUgZGVmdWx0cyBjYW4gYmUKICAgICAgICogb3ZlcnJpZGRlbiBieSBhbiBvcHRpb25zIG9iamVjdC4KICAgICAgICogIEBwYXJhbSBvcHRpb25fbmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBvcHRpb24gYXMgYSBzdHJpbmcKICAgICAgICogIEBwYXJhbSBteV9vcHRpb25zIC0gYW4gb3B0aW9uIG9iamVjdCB0aGF0IGNvdWxkIGhhdmUgb3B0aW9uX25hbWUgCiAgICAgICAqICAgIGFzIGEgbWVtYmVyLgogICAgICAgKiBAcGFyYW0gZGVmYXVsX3ZhbHVlIC0gZGVmdWx0IHZhbHVlIHRoYXQgaXMgcmV0dXJuZWQgaWYgb3B0aW9uX25hbWUgCiAgICAgICAqICAgaXMgbm90IGRlZmluZWQgaW4gbXlfb3B0aW9ucy4KICAgICAgICogQGV4YW1wbGUKICAgICAgICogdmFyIG15X29wdGlvbnMgPSB7cGk6IDMuMTQxNTl9CiAgICAgICAqIHZhciBwaSA9IGdldF9vcHRpb24oInBpIiwgbXlfb3B0aW9ucywgMy4xNCkKICAgICAgICovCiAgICAgIC8vIFByZXR0eSB3YXkgb2Ygc2V0dGluZyBkZWZhdWx0IG9wdGlvbnMgd2hlcmUgdGhlIGRlZmF1bHRzIGNhbiBiZSBvdmVycmlkZGVuCiAgICAgIC8vIGJ5IGFuIG9wdGlvbnMgb2JqZWN0LiBGb3IgZXhhbXBsZToKICAgICAgLy8gdmFyIHBpID0gZ2V0X29wdGlvbigicGkiLCBteV9vcHRpb25zLCAzLjE0KQogICAgICB2YXIgZ2V0X29wdGlvbiA9IGZ1bmN0aW9uIChvcHRpb25fbmFtZSwgb3B0aW9ucywgZGVmYXVsX3ZhbHVlKSB7CiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICAgICAgcmV0dXJuIG9wdGlvbnMuaGFzT3duUHJvcGVydHkob3B0aW9uX25hbWUpICYmIG9wdGlvbnNbb3B0aW9uX25hbWVdICE9PSB1bmRlZmluZWQgJiYgb3B0aW9uc1tvcHRpb25fbmFtZV0gIT09IG51bGwgPyBvcHRpb25zW29wdGlvbl9uYW1lXSA6IGRlZmF1bF92YWx1ZTsKICAgICAgfTsKCiAgICAgIC8qKiBWZXJzaW9uIG9mIGdldF9vcHRpb24gd2hlcmUgdGhlIG9wdGlvbiBzaG91bGQgYmUgYSBvbmUgb3IgbXVsdGktZGltZW5zaW9uYWwKICAgICAgICogYXJyYXkgYW5kIHdoZXJlIHRoZSBkZWZhdWx0IGNhbiBiZSBvdmVycmlkZGVuIGVpdGhlciBieSBhIHNjYWxhciBvciBieSBhbiBhcnJheS4KICAgICAgICogSWYgaXQncyBhIHNjYWxhciB0aGUgdGhhdCBzY2FsYXIgaXMgdXNlZCB0byBpbml0aWFsaXplIGFuIGFycmF5IHdpdGggCiAgICAgICAqIGRpbSBkaW1lbnNpb25zLgogICAgICAgKiAKICAgICAgICovCiAgICAgIHZhciBnZXRfbXVsdGlkaW1fb3B0aW9uID0gZnVuY3Rpb24gKG9wdGlvbl9uYW1lLCBvcHRpb25zLCBkaW0sIGRlZmF1bF92YWx1ZSkgewogICAgICAgIHZhciB2YWx1ZSA9IGdldF9vcHRpb24ob3B0aW9uX25hbWUsIG9wdGlvbnMsIGRlZmF1bF92YWx1ZSk7CiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgICAgICAgdmFsdWUgPSBjcmVhdGVfYXJyYXkoZGltLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIGlmICghYXJyYXlfZXF1YWwoYXJyYXlfZGltKHZhbHVlKSwgZGltKSkgewogICAgICAgICAgdGhyb3cgIlRoZSBvcHRpb24gIiArIG9wdGlvbl9uYW1lICsgIiBpcyBvZiBkaW1lbnNpb24gWyIgKyBhcnJheV9kaW0odmFsdWUpICsgIl0gYnV0IHNob3VsZCBiZSBbIiArIGRpbSArICJdLiI7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgfTsKCiAgICAgIC8vLy8vLy8vLy8gRnVuY3Rpb25zIGZvciBoYW5kbGluZyBwYXJhbWV0ZXIgb2JqZWN0cyAvLy8vLy8vLy8vCiAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGZpeGVkIChzYW1lIGV2ZXJ5IHRpbWUpIG51bWJlciB0aGF0IGNvdWxkIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZQogICAgICAgKiBhIHBhcmFtZXRlciBvZiBhIGNlcnRhaW4gdHlwZSwgcG9zc2libHkgd2l0aCBsb3dlciBhbmQgdXBwZXIgYm91bmRzLgogICAgICAgKiBUaGUgcG9zc2lsZSB0eXBlcyBhcmUgInJlYWwiLCAiaW50IiwgYW5kICJiaW5hcnkiLgogICAgICAgKi8KICAgICAgdmFyIHBhcmFtX2luaXRfZml4ZWQgPSBmdW5jdGlvbiAodHlwZSwgbG93ZXIsIHVwcGVyKSB7CiAgICAgICAgaWYgKGxvd2VyID4gdXBwZXIpIHsKICAgICAgICAgIHRocm93ICJDYW4gbm90IGluaXRpYWxpemUgcGFyYW1ldGVyIHdoZXJlIGxvd2VyIGJvdW5kID4gdXBwZXIgYm91bmQiOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZSA9PT0gInJlYWwiKSB7CiAgICAgICAgICBpZiAobG93ZXIgPT09IC1JbmZpbml0eSAmJiB1cHBlciA9PT0gSW5maW5pdHkpIHsKICAgICAgICAgICAgcmV0dXJuIDAuNTsKICAgICAgICAgIH0gZWxzZSBpZiAobG93ZXIgPT09IC1JbmZpbml0eSkgewogICAgICAgICAgICByZXR1cm4gdXBwZXIgLSAwLjU7CiAgICAgICAgICB9IGVsc2UgaWYgKHVwcGVyID09PSBJbmZpbml0eSkgewogICAgICAgICAgICByZXR1cm4gbG93ZXIgKyAwLjU7CiAgICAgICAgICB9IGVsc2UgaWYgKGxvd2VyIDw9IHVwcGVyKSB7CiAgICAgICAgICAgIHJldHVybiAobG93ZXIgKyB1cHBlcikgLyAyOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gImludCIpIHsKICAgICAgICAgIGlmIChsb3dlciA9PT0gLUluZmluaXR5ICYmIHVwcGVyID09PSBJbmZpbml0eSkgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgIH0gZWxzZSBpZiAobG93ZXIgPT09IC1JbmZpbml0eSkgewogICAgICAgICAgICByZXR1cm4gdXBwZXIgLSAxOwogICAgICAgICAgfSBlbHNlIGlmICh1cHBlciA9PT0gSW5maW5pdHkpIHsKICAgICAgICAgICAgcmV0dXJuIGxvd2VyICsgMTsKICAgICAgICAgIH0gZWxzZSBpZiAobG93ZXIgPD0gdXBwZXIpIHsKICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoKGxvd2VyICsgdXBwZXIpIC8gMik7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAiYmluYXJ5IikgewogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIHRocm93ICJDb3VsZCBub3QgaW5pdGlhbGl6ZSBwYXJhbWV0ZXIgb2YgdHlwZSAiICsgdHlwZSArICJbIiArIGxvd2VyICsgIiwgIiArIHVwcGVyICsgIl0iOwogICAgICB9OwoKICAgICAgLyoqCiAgICAgICAqIENvbXBsZXRlcyBwYXJhbXNfdG9fY29tcGxldGUsIGFuIG9iamVjdCBjb250YWluaW5nIHBhcmFtZXRlciBkZXNjcmlwdGlvbnMsIAogICAgICAgKiBhbmQgaW5pdGlhbGl6ZXMgbm9uLWluaXRpYWxpemVkIHBhcmFtZXRlcnMuIFRoaXMgbW9kaWZpZWQgdmVyc2lvbiBvZgogICAgICAgKiBwYXJhbXNfdG9fY29tcGxldGUgaXMgcmV0dXJuZWQgYXMgYSBkZWVwIGNvcHkgYW5kIG5vdCBtb2RpZmllZCBpbiBwbGFjZS4KICAgICAgICogSW5pdGlhbGl6YXRpb24gaXMgZG9uZSBieSBzdXBwbHlpbmcgYSBwYXJhbV9pbml0IGZ1bmN0aW9uIHdpdGggc2lnbmF0dXJlCiAgICAgICAqIGZ1bmN0aW9uKHR5cGUsIGxvd2VyLCB1cHBlcikgdGhhdCBzaG91bGQgcmV0dXJuIGEgc2luZ2xlIG51bWJlciAKICAgICAgICogKGxpa2UgcGFyYW1faW5pdF9maXhlZCwgZm9yIGV4YW1wbGUpLgogICAgICAgKiBAZXhhbXBsZQogICAgICAgKiB2YXIgcGFyYW1zID0geyAibXUiOiB7InR5cGUiOiAicmVhbCJ9IH0KICAgICAgICogcGFyYW1zID0gY29tcGxldGVfcGFyYW1zKHBhcmFtcyk7CiAgICAgICAqIC8vIHBhcmFtcyBzaG91bGQgbm93IGJlOgogICAgICAgKiAvLyAgeyJtdSI6IHsgInR5cGUiOiAicmVhbCIsICJkaW0iOiBbMV0sICJ1cHBlciI6IEluZmluaXR5LAogICAgICAgKiAvLyAgICAgICAgICAgImxvd2VyIjogLUluZmluaXR5LCAiaW5pdCI6IDAuNSB9fQogICAgICAgKi8KICAgICAgdmFyIGNvbXBsZXRlX3BhcmFtcyA9IGZ1bmN0aW9uIChwYXJhbXNfdG9fY29tcGxldGUsIHBhcmFtX2luaXQpIHsKICAgICAgICB2YXIgcGFyYW1zID0gZGVlcF9jbG9uZShwYXJhbXNfdG9fY29tcGxldGUpOwogICAgICAgIGZvciAodmFyIHBhcmFtX25hbWUgaW4gcGFyYW1zKSB7CiAgICAgICAgICBpZiAoIXBhcmFtcy5oYXNPd25Qcm9wZXJ0eShwYXJhbV9uYW1lKSkgY29udGludWU7CiAgICAgICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbcGFyYW1fbmFtZV07CiAgICAgICAgICBpZiAoIXBhcmFtLmhhc093blByb3BlcnR5KCJ0eXBlIikpIHsKICAgICAgICAgICAgcGFyYW0udHlwZSA9ICJyZWFsIjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghcGFyYW0uaGFzT3duUHJvcGVydHkoImRpbSIpKSB7CiAgICAgICAgICAgIHBhcmFtLmRpbSA9IFsxXTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpc19udW1iZXIocGFyYW0uZGltKSkgewogICAgICAgICAgICBwYXJhbS5kaW0gPSBbcGFyYW0uZGltXTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChwYXJhbS50eXBlID09ICJiaW5hcnkiKSB7CiAgICAgICAgICAgIHBhcmFtLnVwcGVyID0gMTsKICAgICAgICAgICAgcGFyYW0ubG93ZXIgPSAwOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFwYXJhbS5oYXNPd25Qcm9wZXJ0eSgidXBwZXIiKSkgewogICAgICAgICAgICBwYXJhbS51cHBlciA9IEluZmluaXR5OwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFwYXJhbS5oYXNPd25Qcm9wZXJ0eSgibG93ZXIiKSkgewogICAgICAgICAgICBwYXJhbS5sb3dlciA9IC1JbmZpbml0eTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChwYXJhbS5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpKSB7CiAgICAgICAgICAgIC8vIElmIHRoaXMgaXMganVzdCBhIG51bWJlciBvciBhIG5lc3RlZCBhcnJheSB3ZSBsZWF2ZSBpdCBhbG9uZSwgYnV0IGlmLi4uCiAgICAgICAgICAgIGlmIChhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkgJiYgdHlwZW9mIHBhcmFtLmluaXQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgICAgICAvLyBwYXJhbS5pbml0IGlzIGEgZnVuY3Rpb24sIHVzZSB0aGF0IHRvIGluaXRpYWxpemUgdGhlIHBhcmFtZXRlci4KICAgICAgICAgICAgICBwYXJhbS5pbml0ID0gcGFyYW0uaW5pdCgpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCFhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0uaW5pdCkpIHsKICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIgd2hlcmUgdGhlIHBhcmFtLmluaXQgZXhpc3QgYnV0CiAgICAgICAgICAgICAgLy8gaXMgbm90IGFuIGFycmF5LiBUaGVuIGFzc3VtZSBpdCBpcyBhIG51bWJlciBvciBhIGZ1bmN0aW9uIGFuZCB1c2UKICAgICAgICAgICAgICAvLyBpdCB0byBpbml0aWFsaXplIHRoZSBwYXJhbWV0ZXIuCiAgICAgICAgICAgICAgcGFyYW0uaW5pdCA9IGNyZWF0ZV9hcnJheShwYXJhbS5kaW0sIHBhcmFtLmluaXQpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBXZSB1c2UgdGhlIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uCiAgICAgICAgICAgIGlmIChhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHsKICAgICAgICAgICAgICBwYXJhbS5pbml0ID0gcGFyYW1faW5pdChwYXJhbS50eXBlLCBwYXJhbS5sb3dlciwgcGFyYW0udXBwZXIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHBhcmFtLmluaXQgPSBjcmVhdGVfYXJyYXkocGFyYW0uZGltLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1faW5pdChwYXJhbS50eXBlLCBwYXJhbS5sb3dlciwgcGFyYW0udXBwZXIpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJhbXM7CiAgICAgIH07CgogICAgICAvLy8vLy8vLy8vIFN0ZXBwZXIgRnVuY3Rpb25zIC8vLy8vLy8vLy8vCiAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgIC8qKgogICAgICAgKiBAaW50ZXJmYWNlCiAgICAgICAqIEEgU3RlcHBlciBpcyBhbiBvYmplY3QgcmVzcG9uc2libGUgZm9yIHB1c2hpbmcgYXJvdW5kIG9uZQogICAgICAgKiBvciBtb3JlIHBhcmFtZXRlciB2YWx1ZXMgaW4gYSBzdGF0ZSBhY2NvcmRpbmcgdG8gdGhlIGRpc3RyaWJ1dGlvbgogICAgICAgKiBkZWZpbmVkIGJ5IHRoZSBsb2cgcG9zdGVyaW9yLiBUaGlzIGRlZmluZXMgdGhlIFN0ZXBwZXIgImludGVyZmFjZSIsCiAgICAgICAqIHdoZXJlICJpbnRlcmZhY2UiIG1lYW5zIHRoYXQgU3RlcHBlciBkZWZpbmVzIGEgY2xhc3MgdGhhdCBpcyBuZXZlcgogICAgICAgKiBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQsIGJ1dCBqdXN0IHRvIGJlIHN1YmNsYXNzZWQgYnkgc3BlY2lhbGl6ZWQKICAgICAgICogc3RlcHBlciBmdW5jdGlvbnMuCiAgICAgICAqIEBpbnRlcmZhY2UKICAgICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIHBhcmFtZXRlciBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGU6CiAgICAgICAqICAgeyJtdSI6IHsgInR5cGUiOiAicmVhbCIsICJkaW0iOiBbMV0sICJ1cHBlciI6IEluZmluaXR5LCAKICAgICAgICogICAibG93ZXIiOiAtSW5maW5pdHksICJpbml0IjogMC41IH19CiAgICAgICAqICAgVGhlIHBhcmFtZXRlciBkZWZpbml0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gYmUgImNvbXBsZXRlIiwgdGhhdCBpcywKICAgICAgICogICBzcGVjaWZ5aW5nIGFsbCByZWxldmFudCBhdHRyaWJ1dGVzIHN1Y2ggYXMgZGltLCBsb3dlciBhbmQgdXBwZXIuCiAgICAgICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycyBpbiBwYXJhbXMKICAgICAgICogICAoYW5kIHBvc3NpYmx5IG1vcmUpLiBUaGUgcGFyYW1ldGVyIG5hbWVzIGFyZSBnaXZlbiBhcyBrZXlzIGFuZCB0aGUgc3RhdGVzCiAgICAgICAqICAgYXMgc2NhbGFycyBvciwgcG9zc2libHkgbmVzdGVkLCBhcnJheXMuIEZvciBleGFtcGxlOgogICAgICAgKiAgIHttdTogMTAsIHNpZ21hOiA1LCBiZXRhOiBbMSwgMi41XX0KICAgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiAqdGFraW5nIG5vIHBhcmFtZXRlcnMqIHRoYXQgcmV0dXJucyB0aGUKICAgICAgICogICBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiBUaGF0IGlzLCB0aGUgdmFsdWUgb2YgbG9nX3Bvc3QKICAgICAgICogICBzaG91bGQgY2hhbmdlIGlmIHRoZSB0aGUgdmFsdWVzIGluIHN0YXRlIGFyZSBjaGFuZ2VkLgogICAgICAKICAgICAgICovCiAgICAgIHZhciBTdGVwcGVyID0gZnVuY3Rpb24gKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0KSB7CiAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOwogICAgICAgIHRoaXMubG9nX3Bvc3QgPSBsb2dfcG9zdDsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAgKiBUYWtlcyBhIHN0ZXAgaW4gdGhlIHBhcmFtZXRlciBzcGFjZS4gU2hvdWxkIHJldHVybiB0aGUgbmV3IHN0YXRlLAogICAgICAgKiBidXQgaXMgbWFpbmx5IGNhbGxlZCBmb3IgaXQncyBzaWRlIGVmZmVjdCBvZiBtYWtpbmcgYSBjaGFuZ2UgaW4gdGhlCiAgICAgICAqIHN0YXRlIG9iamVjdC4KICAgICAgICovCiAgICAgIFN0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdGhyb3cgIkV2ZXJ5IFN0ZXBwZXIgbmVlZCB0byBpbXBsZW1lbnQgc3RlcCgpIjsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAgKiBJZiBpbXBsZW1lbnRlZCwgbWFrZXMgdGhlIHN0ZXBwZXIgYWRhcHQgd2hpbGUgc3RlcHBpbmcuCiAgICAgICAqLwogICAgICBTdGVwcGVyLnByb3RvdHlwZS5zdGFydF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgIC8vIE9wdGlvbmFsLCBzb21lIHN0ZXBwZXJzIG1pZ2h0IG5vdCBiZSBhZGFwdGl2ZS4gKi8gCiAgICAgIH07CgogICAgICAvKioKICAgICAgICogSWYgaW1wbGVtZW50ZWQsIG1ha2VzIHRoZSBzdGVwcGVyIGNlYXNlIGFkYXB0aW5nIHdoaWxlIHN0ZXBwaW5nLgogICAgICAgKi8KICAgICAgU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgIC8vIE9wdGlvbmFsLCBzb21lIHN0ZXBwZXJzIG1pZ2h0IG5vdCBiZSBhZGFwdGl2ZS4gKi8gCiAgICAgIH07CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhbiBvYmplY3QgY29udGFpbmcgaW5mbyByZWdhcmRpbmcgdGhlIHN0ZXBwZXIuCiAgICAgICAqLwogICAgICBTdGVwcGVyLnByb3RvdHlwZS5pbmZvID0gZnVuY3Rpb24gKCkgewogICAgICAgIC8vIFJldHVybnMgYW4gb2JqZWN0IHdpdGggaW5mbyBhYm91dCB0aGUgc3RhdGUgb2YgdGhlIHN0ZXBwZXIuCiAgICAgICAgcmV0dXJuIHt9OwogICAgICB9OwoKICAgICAgLyoqCiAgICAgICAqIEBjbGFzcwogICAgICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn0KICAgICAgICogQ29uc3RydWN0b3IgZm9yIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlIG1ldHJvcG9saXMgc3RlcCBpbgogICAgICAgKiB0aGUgQWRhcHRpdmUgTWV0cm9wb2xpcy1XaXRoaW4tR2liYnMgYWxnb3JpdGhtIGluICJFeGFtcGxlcyBvZiBBZGFwdGl2ZSBNQ01DIgogICAgICAgKiBieSBSb2JlcnRzIGFuZCBSb3NlbnRoYWwgKDIwMDgpLgogICAgICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyIGRlZmluaXRpb24uCiAgICAgICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy4KICAgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIAogICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuCiAgICAgICAqIEBwYXJhbSBnZW5lcmF0ZV9wcm9wb3NhbCAtIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgcHJvcG9zYWwgKGFzIGEgbnVtYmVyKQogICAgICAgKiB3aXRoIHNpZ25hdHVyZSBmdW5jdGlvbihwYXJhbV9zdGF0ZSwgbG9nX3NjYWxlKSB3aGVyZSBwYXJhbV9zdGF0ZSBpcyBhCiAgICAgICAqIG51bWJlciBhbmQgbG9nX3NjYWxlIGRlZmluZXMgdGhlIHNjYWxlIG9mIHRoZSBwcm9wb3NhbCBzb21laG93LgogICAgICAqLwogICAgICB2YXIgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIGdlbmVyYXRlX3Byb3Bvc2FsKSB7CiAgICAgICAgU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0KTsKICAgICAgICB2YXIgcGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7CiAgICAgICAgaWYgKHBhcmFtX25hbWVzLmxlbmd0aCAhPSAxKSB7CiAgICAgICAgICB0aHJvdyAiT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgY2FuIG9ubHkgaGFuZGxlIG9uZSBwYXJhbWV0ZXIuIjsKICAgICAgICB9CiAgICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07CiAgICAgICAgdmFyIHBhcmFtID0gdGhpcy5wYXJhbXNbdGhpcy5wYXJhbV9uYW1lXTsKICAgICAgICBpZiAoIWFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSkgewogICAgICAgICAgdGhyb3cgIk9uZWRpbU1ldHJvcG9saXNTdGVwcGVyIGNhbiBvbmx5IGhhbmRsZSBvbmUgb25lLWRpbWVuc2lvbmFsIHBhcmFtZXRlci4iOwogICAgICAgIH0KICAgICAgICB0aGlzLmxvd2VyID0gcGFyYW0ubG93ZXI7CiAgICAgICAgdGhpcy51cHBlciA9IHBhcmFtLnVwcGVyOwogICAgICAgIHRoaXMucHJvcF9sb2dfc2NhbGUgPSBnZXRfb3B0aW9uKCJwcm9wX2xvZ19zY2FsZSIsIG9wdGlvbnMsIDApOwogICAgICAgIHRoaXMuYmF0Y2hfc2l6ZSA9IGdldF9vcHRpb24oImJhdGNoX3NpemUiLCBvcHRpb25zLCA1MCk7CiAgICAgICAgdGhpcy5tYXhfYWRhcHRhdGlvbiA9IGdldF9vcHRpb24oIm1heF9hZGFwdGF0aW9uIiwgb3B0aW9ucywgMC4zMyk7CiAgICAgICAgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24gPSBnZXRfb3B0aW9uKCJpbml0aWFsX2FkYXB0YXRpb24iLCBvcHRpb25zLCAxLjApOwogICAgICAgIHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlID0gZ2V0X29wdGlvbigidGFyZ2V0X2FjY2VwdF9yYXRlIiwgb3B0aW9ucywgMC40NCk7CiAgICAgICAgdGhpcy5pc19hZGFwdGluZyA9IGdldF9vcHRpb24oImlzX2FkYXB0aW5nIiwgb3B0aW9ucywgdHJ1ZSk7CiAgICAgICAgdGhpcy5nZW5lcmF0ZV9wcm9wb3NhbCA9IGdlbmVyYXRlX3Byb3Bvc2FsOwogICAgICAgIHRoaXMuYWNjZXB0YW5jZV9jb3VudCA9IDA7CiAgICAgICAgdGhpcy5iYXRjaF9jb3VudCA9IDA7CiAgICAgICAgdGhpcy5pdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uID0gMDsKICAgICAgfTsKICAgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdGVwcGVyLnByb3RvdHlwZSk7CiAgICAgIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyOwogICAgICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgcGFyYW1fc3RhdGUgPSB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV07CiAgICAgICAgdmFyIHBhcmFtX3Byb3Bvc2FsID0gdGhpcy5nZW5lcmF0ZV9wcm9wb3NhbChwYXJhbV9zdGF0ZSwgdGhpcy5wcm9wX2xvZ19zY2FsZSk7CiAgICAgICAgaWYgKHBhcmFtX3Byb3Bvc2FsIDwgdGhpcy5sb3dlciB8fCBwYXJhbV9wcm9wb3NhbCA+IHRoaXMudXBwZXIpIDsgZWxzZSB7CiAgICAgICAgICAvLyBtYWtlIGEgTWV0cm9wb2xpcyBzdGVwCiAgICAgICAgICB2YXIgY3Vycl9sb2dfZGVucyA9IHRoaXMubG9nX3Bvc3QoKTsKICAgICAgICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IHBhcmFtX3Byb3Bvc2FsOwogICAgICAgICAgdmFyIHByb3BfbG9nX2RlbnMgPSB0aGlzLmxvZ19wb3N0KCk7CiAgICAgICAgICB2YXIgYWNjZXB0X3Byb2IgPSBNYXRoLmV4cChwcm9wX2xvZ19kZW5zIC0gY3Vycl9sb2dfZGVucyk7CiAgICAgICAgICBpZiAoYWNjZXB0X3Byb2IgPiBNYXRoLnJhbmRvbSgpKSB7CiAgICAgICAgICAgIC8vIFdlIGRvIG5vdGhpbmcgYXMgdGhlIHN0YXRlIG9mIHBhcmFtIGhhcyBhbHJlYWR5IGJlZW4gY2hhbmdlZCB0byB0aGUgcHJvcG9zYWwKICAgICAgICAgICAgaWYgKHRoaXMuaXNfYWRhcHRpbmcpIHRoaXMuYWNjZXB0YW5jZV9jb3VudCsrOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gcmV2ZXJ0IHN0YXRlIGJhY2sgdG8gdGhlIG9sZCBzdGF0ZSBvZiBwYXJhbQogICAgICAgICAgICB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0gPSBwYXJhbV9zdGF0ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuaXNfYWRhcHRpbmcpIHsKICAgICAgICAgIHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbisrOwogICAgICAgICAgaWYgKHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiA+PSB0aGlzLmJhdGNoX3NpemUpIHsKICAgICAgICAgICAgLy8gdGhlbiBhZGFwdAogICAgICAgICAgICB0aGlzLmJhdGNoX2NvdW50Kys7CiAgICAgICAgICAgIHZhciBsb2dfc2RfYWRqdXN0bWVudCA9IE1hdGgubWluKHRoaXMubWF4X2FkYXB0YXRpb24sIHRoaXMuaW5pdGlhbF9hZGFwdGF0aW9uIC8gTWF0aC5zcXJ0KHRoaXMuYmF0Y2hfY291bnQpKTsKICAgICAgICAgICAgaWYgKHRoaXMuYWNjZXB0YW5jZV9jb3VudCAvIHRoaXMuYmF0Y2hfc2l6ZSA+IHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlKSB7CiAgICAgICAgICAgICAgdGhpcy5wcm9wX2xvZ19zY2FsZSArPSBsb2dfc2RfYWRqdXN0bWVudDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aGlzLnByb3BfbG9nX3NjYWxlIC09IGxvZ19zZF9hZGp1c3RtZW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuYWNjZXB0YW5jZV9jb3VudCA9IDA7CiAgICAgICAgICAgIHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiA9IDA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV07CiAgICAgIH07CiAgICAgIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5zdGFydF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMuaXNfYWRhcHRpbmcgPSB0cnVlOwogICAgICB9OwogICAgICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMuaXNfYWRhcHRpbmcgPSBmYWxzZTsKICAgICAgfTsKICAgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHByb3BfbG9nX3NjYWxlOiB0aGlzLnByb3BfbG9nX3NjYWxlLAogICAgICAgICAgaXNfYWRhcHRpbmc6IHRoaXMuaXNfYWRhcHRpbmcsCiAgICAgICAgICBhY2NlcHRhbmNlX2NvdW50OiB0aGlzLmFjY2VwdGFuY2VfY291bnQsCiAgICAgICAgICBpdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uOiB0aGlzLml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24sCiAgICAgICAgICBiYXRjaF9jb3VudDogdGhpcy5iYXRjaF9jb3VudAogICAgICAgIH07CiAgICAgIH07CgogICAgICAvKioKICAgICAgICogRnVuY3Rpb24gcmV0dXJuaW5nIGEgTm9ybWFsIHByb3Bvc2FsLgogICAgICAgKi8KICAgICAgdmFyIG5vcm1hbF9wcm9wb3NhbCA9IGZ1bmN0aW9uIChwYXJhbV9zdGF0ZSwgcHJvcF9sb2dfc2NhbGUpIHsKICAgICAgICByZXR1cm4gcm5vcm0ocGFyYW1fc3RhdGUsIE1hdGguZXhwKHByb3BfbG9nX3NjYWxlKSk7CiAgICAgIH07CgogICAgICAvKioKICAgICAgICogQGNsYXNzCiAgICAgICAqIEBhdWdtZW50cyB7T25lZGltTWV0cm9wb2xpc1N0ZXBwZXJ9CiAgICAgICAqIEEgInN1YmNsYXNzIiBvZiBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciBtYWtpbmcgY29udGlub3VzIE5vcm1hbCBwcm9wb3NhbHMuCiAgICAgICAqLwogICAgICB2YXIgUmVhbE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24gKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKSB7CiAgICAgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgbm9ybWFsX3Byb3Bvc2FsKTsKICAgICAgfTsKICAgICAgUmVhbE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlKTsKICAgICAgUmVhbE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJlYWxNZXRyb3BvbGlzU3RlcHBlcjsKCiAgICAgIC8qKgogICAgICAgKiBGdW5jdGlvbiByZXR1cm5pbmcgYSBkaXNjcmV0aXplZCBOb3JtYWwgcHJvcG9zYWwuCiAgICAgICAqLwogICAgICB2YXIgZGlzY3JldGVfbm9ybWFsX3Byb3Bvc2FsID0gZnVuY3Rpb24gKHBhcmFtX3N0YXRlLCBwcm9wX2xvZ19zY2FsZSkgewogICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHJub3JtKHBhcmFtX3N0YXRlLCBNYXRoLmV4cChwcm9wX2xvZ19zY2FsZSkpKTsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAqIEBjbGFzcwogICAgICAqIEBhdWdtZW50cyB7T25lZGltTWV0cm9wb2xpc1N0ZXBwZXJ9CiAgICAgICogQSAic3ViY2xhc3MiIG9mIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyIG1ha2luZyBkaXNjcmV0aXplZCBOb3JtYWwgcHJvcG9zYWxzLgogICAgICAqLwogICAgICB2YXIgSW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHsKICAgICAgICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zLCBkaXNjcmV0ZV9ub3JtYWxfcHJvcG9zYWwpOwogICAgICB9OwogICAgICBJbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7CiAgICAgIEludE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEludE1ldHJvcG9saXNTdGVwcGVyOwoKICAgICAgLyoqCiAgICAgICAqIEBjbGFzcwogICAgICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn0KICAgICAgICogQ29uc3RydWN0b3IgZm9yIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlIG1ldHJvcG9saXMgc3RlcCBpbgogICAgICAgKiB0aGUgQWRhcHRpdmUgTWV0cm9wb2xpcy1XaXRoaW4tR2liYnMgYWxnb3JpdGhtIGluICJFeGFtcGxlcyBvZiBBZGFwdGl2ZSBNQ01DIgogICAgICAgKiBieSBSb2JlcnRzIGFuZCBSb3NlbnRoYWwgKDIwMDgpIGZvciBwb3NzaWJseSBtdWx0aWRpbWVuc2lvbmFsIGFycmF5cy4gVGhhdAogICAgICAgKiBpcywgaW5zdGVhZCBvZiBqdXN0IHRha2luZyBhIHN0ZXAgZm9yIGEgb25lLWRpbWVuc2lvbmFsIHBhcmFtZXRlciBsaWtlIAogICAgICAgKiBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciwgdGhpcyBTdGVwcGVyIGlzIHJlc3BvbnNpYmxlIGZvciB0YWtpbmcgc3RlcHMgCiAgICAgICAqIGZvciBhIG11bHRpZGltZW5zaW9uYWwgYXJyYXkuIEl0J3Mgc3RpbGwgcHJldHR5IGR1bWIgYW5kIGp1c3QgdGFrZXMKICAgICAgICogb25lLWRpbWVuc2lvbmFsIHN0ZXBzIGZvciBlYWNoIHBhcmFtZXRlciBjb21wb25lbnQsIHRob3VnaC4KICAgICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIGEgc2luZ2xlIHBhcmFtZXRlciBkZWZpbml0aW9uIGZvciBhIAogICAgICAgKiAgIG11bHRpZGltZW5zaW9uYWwgcGFyYW1ldGVyLgogICAgICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuCiAgICAgICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiAKICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zIHRvIHRoZSBzdGVwcGVyLgogICAgICAgKiBAcGFyYW0gU3ViU3RlcHBlciAtIGEgY29uc3RydWN0b3IgZm9yIHRoZSB0eXBlIG9mIG9uZSBkaW1lbnNpb25hbCBTdGVwcGVyIHRvIGFwcGx5IG9uCiAgICAgICAqICAgYWxsIHRoZSBjb21wb25lbnRzIG9mIHRoZSBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlci4KICAgICAgKi8KICAgICAgdmFyIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIFN1YlN0ZXBwZXIpIHsKICAgICAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpOwogICAgICAgIHZhciBwYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTsKICAgICAgICBpZiAocGFyYW1fbmFtZXMubGVuZ3RoICE9IDEpIHsKICAgICAgICAgIHRocm93ICJNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIGNhbid0IGhhbmRsZSBtb3JlIHRoYW4gb25lIHBhcmFtZXRlci4iOwogICAgICAgIH0KICAgICAgICB0aGlzLnBhcmFtX25hbWUgPSBwYXJhbV9uYW1lc1swXTsKICAgICAgICB2YXIgcGFyYW0gPSB0aGlzLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVdOwogICAgICAgIHRoaXMubG93ZXIgPSBwYXJhbS5sb3dlcjsKICAgICAgICB0aGlzLnVwcGVyID0gcGFyYW0udXBwZXI7CiAgICAgICAgdGhpcy5kaW0gPSBwYXJhbS5kaW07CiAgICAgICAgdGhpcy5wcm9wX2xvZ19zY2FsZSA9IGdldF9tdWx0aWRpbV9vcHRpb24oInByb3BfbG9nX3NjYWxlIiwgb3B0aW9ucywgdGhpcy5kaW0sIDApOwogICAgICAgIHRoaXMuYmF0Y2hfc2l6ZSA9IGdldF9tdWx0aWRpbV9vcHRpb24oImJhdGNoX3NpemUiLCBvcHRpb25zLCB0aGlzLmRpbSwgNTApOwogICAgICAgIHRoaXMubWF4X2FkYXB0YXRpb24gPSBnZXRfbXVsdGlkaW1fb3B0aW9uKCJtYXhfYWRhcHRhdGlvbiIsIG9wdGlvbnMsIHRoaXMuZGltLCAwLjMzKTsKICAgICAgICB0aGlzLmluaXRpYWxfYWRhcHRhdGlvbiA9IGdldF9tdWx0aWRpbV9vcHRpb24oImluaXRpYWxfYWRhcHRhdGlvbiIsIG9wdGlvbnMsIHRoaXMuZGltLCAxLjApOwogICAgICAgIHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlID0gZ2V0X211bHRpZGltX29wdGlvbigidGFyZ2V0X2FjY2VwdF9yYXRlIiwgb3B0aW9ucywgdGhpcy5kaW0sIDAuNDQpOwogICAgICAgIHRoaXMuaXNfYWRhcHRpbmcgPSBnZXRfbXVsdGlkaW1fb3B0aW9uKCJpc19hZGFwdGluZyIsIG9wdGlvbnMsIHRoaXMuZGltLCB0cnVlKTsKCiAgICAgICAgLy8gVGhpcyBoYWNrIGJlbG93IGlzIGEgcmVjdXJzaXZlIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhbiBhcnJheSBvZiAKICAgICAgICAvLyBvbmUgZGltZW5zaW9uYWwgc3RlcHBlcnMgYWNjb3JkaW5nIHRvIGRpbS4KICAgICAgICB2YXIgY3JlYXRlX3N1YnN0ZXBwZXJzID0gZnVuY3Rpb24gKGRpbSwgc3Vic3RhdGUsIGxvZ19wb3N0LCBwcm9wX2xvZ19zY2FsZSwgYmF0Y2hfc2l6ZSwgbWF4X2FkYXB0YXRpb24sIGluaXRpYWxfYWRhcHRhdGlvbiwgdGFyZ2V0X2FjY2VwdF9yYXRlLCBpc19hZGFwdGluZykgewogICAgICAgICAgdmFyIHN1YnN0ZXBwZXJzID0gW107CiAgICAgICAgICBpZiAoZGltLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7CiAgICAgICAgICAgICAgdmFyIHN1Ym9wdGlvbnMgPSB7CiAgICAgICAgICAgICAgICBwcm9wX2xvZ19zY2FsZTogcHJvcF9sb2dfc2NhbGVbaV0sCiAgICAgICAgICAgICAgICBiYXRjaF9zaXplOiBiYXRjaF9zaXplW2ldLAogICAgICAgICAgICAgICAgbWF4X2FkYXB0YXRpb246IG1heF9hZGFwdGF0aW9uW2ldLAogICAgICAgICAgICAgICAgaW5pdGlhbF9hZGFwdGF0aW9uOiBpbml0aWFsX2FkYXB0YXRpb25baV0sCiAgICAgICAgICAgICAgICB0YXJnZXRfYWNjZXB0X3JhdGU6IHRhcmdldF9hY2NlcHRfcmF0ZVtpXSwKICAgICAgICAgICAgICAgIGlzX2FkYXB0aW5nOiBpc19hZGFwdGluZ1tpXQogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgdmFyIHN1YnBhcmFtID0ge307CiAgICAgICAgICAgICAgc3VicGFyYW1baV0gPSBkZWVwX2Nsb25lKHBhcmFtKTsKICAgICAgICAgICAgICBzdWJwYXJhbVtpXS5kaW0gPSBbMV07IC8vIEFzIHRoaXMgc2hvdWxkIG5vdyBiZSBhIG9uZS1kaW0gcGFyYW1ldGVyCiAgICAgICAgICAgICAgZGVsZXRlIHN1YnBhcmFtW2ldLmluaXQ7IC8vIEFzIGl0IHNvdWxkIG5vdCBiZSBuZWVkZWQKICAgICAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IG5ldyBTdWJTdGVwcGVyKHN1YnBhcmFtLCBzdWJzdGF0ZSwgbG9nX3Bvc3QsIHN1Ym9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7CiAgICAgICAgICAgICAgc3Vic3RlcHBlcnNbaV0gPSBjcmVhdGVfc3Vic3RlcHBlcnMoZGltLnNsaWNlKDEpLCBzdWJzdGF0ZVtpXSwgbG9nX3Bvc3QsIHByb3BfbG9nX3NjYWxlW2ldLCBiYXRjaF9zaXplW2ldLCBtYXhfYWRhcHRhdGlvbltpXSwgaW5pdGlhbF9hZGFwdGF0aW9uW2ldLCB0YXJnZXRfYWNjZXB0X3JhdGVbaV0sIGlzX2FkYXB0aW5nW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHN1YnN0ZXBwZXJzOwogICAgICAgIH07CiAgICAgICAgdGhpcy5zdWJzdGVwcGVycyA9IGNyZWF0ZV9zdWJzdGVwcGVycyh0aGlzLmRpbSwgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdLCB0aGlzLmxvZ19wb3N0LCB0aGlzLnByb3BfbG9nX3NjYWxlLCB0aGlzLmJhdGNoX3NpemUsIHRoaXMubWF4X2FkYXB0YXRpb24sIHRoaXMuaW5pdGlhbF9hZGFwdGF0aW9uLCB0aGlzLnRhcmdldF9hY2NlcHRfcmF0ZSwgdGhpcy5pc19hZGFwdGluZyk7CiAgICAgIH07CiAgICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdGVwcGVyLnByb3RvdHlwZSk7CiAgICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjsKICAgICAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAvLyBHbyB0aHJvdWdoIHRoZSBzdWJzdGVwcGVycyBpbiBhIHJhbmRvbSBvcmRlciBhbmQgY2FsbCBzdGVwKCkgb24gdGhlbS4KICAgICAgICByZXR1cm4gbmVzdGVkX2FycmF5X3JhbmRvbV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbiAoc3Vic3RlcHBlcikgewogICAgICAgICAgcmV0dXJuIHN1YnN0ZXBwZXIuc3RlcCgpOwogICAgICAgIH0pOwogICAgICB9OwogICAgICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5zdGFydF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgIG5lc3RlZF9hcnJheV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbiAoc3Vic3RlcHBlcikgewogICAgICAgICAgc3Vic3RlcHBlci5zdGFydF9hZGFwdGF0aW9uKCk7CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBuZXN0ZWRfYXJyYXlfYXBwbHkodGhpcy5zdWJzdGVwcGVycywgZnVuY3Rpb24gKHN1YnN0ZXBwZXIpIHsKICAgICAgICAgIHN1YnN0ZXBwZXIuc3RvcF9hZGFwdGF0aW9uKCk7CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIG5lc3RlZF9hcnJheV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbiAoc3Vic3RlcHBlcikgewogICAgICAgICAgcmV0dXJuIHN1YnN0ZXBwZXIuaW5mbygpOwogICAgICAgIH0pOwogICAgICB9OwoKICAgICAgLyoqCiAgICAgICAqIEBjbGFzcwogICAgICAgKiBAYXVnbWVudHMge011bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXJ9CiAgICAgICAqIEEgInN1YmNsYXNzIiBvZiBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIG1ha2luZyBjb250aW5vdXMgTm9ybWFsIHByb3Bvc2Fscy4KICAgICAgICovCiAgICAgIHZhciBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykgewogICAgICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgUmVhbE1ldHJvcG9saXNTdGVwcGVyKTsKICAgICAgfTsKICAgICAgTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7CiAgICAgIE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyOwoKICAgICAgLyoqCiAgICAgICAqIEBjbGFzcwogICAgICAgKiBAYXVnbWVudHMge011bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXJ9CiAgICAgICAqIEEgInN1YmNsYXNzIiBvZiBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIG1ha2luZyBkaXNjcmV0aXplZCBOb3JtYWwgcHJvcG9zYWxzLgogICAgICAgKi8KICAgICAgdmFyIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHsKICAgICAgICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIEludE1ldHJvcG9saXNTdGVwcGVyKTsKICAgICAgfTsKICAgICAgTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlKTsKICAgICAgTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyOwoKICAgICAgLyoqCiAgICAgICAqIEBjbGFzcwogICAgICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn0KICAgICAgICogQ29uc3RydWN0b3IgZm9yIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgYSBzdGVwIGZvciBhIGJpbmFyeSBwYXJhbWV0ZXIuCiAgICAgICAqIFRoaXMgaXMgZG9uZSBieSBldmFsdWF0aW5nIHRoZSBsb2cgcG9zdGVyaW9yIGZvciBib3RoIHN0YXRlcyBvZiB0aGUKICAgICAgICogcGFyYW1ldGVyIGFuZCB0aGVuIHNlbGVjdGluZyBhIHN0YXRlIHJhbmRvbWx5IHdpdGggcHJvYmFiaWxpdHkgcmVsYXRpdmUgCiAgICAgICAqIHRvIHRoZSBwb3N0ZXJpb3Igb2YgZWFjaCBzdGF0ZS4KICAgICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIGEgc2luZ2xlIHBhcmFtZXRlciBkZWZpbml0aW9uLgogICAgICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuCiAgICAgICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiAKICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zIHRvIHRoZSBzdGVwcGVyLgogICAgICAqLwogICAgICB2YXIgQmluYXJ5U3RlcHBlciA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykgewogICAgICAgIFN0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCk7CiAgICAgICAgdmFyIHBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpOwogICAgICAgIGlmIChwYXJhbV9uYW1lcy5sZW5ndGggPT0gMSkgewogICAgICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93ICJCaW5hcnlTdGVwcGVyIGNhbid0IGhhbmRsZSBtb3JlIHRoYW4gb25lIHBhcmFtZXRlci4iOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQmluYXJ5U3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN0ZXBwZXIucHJvdG90eXBlKTsKICAgICAgQmluYXJ5U3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCaW5hcnlTdGVwcGVyOwogICAgICBCaW5hcnlTdGVwcGVyLnByb3RvdHlwZS5zdGVwID0gZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IDA7CiAgICAgICAgdmFyIHplcm9fbG9nX2RlbnMgPSB0aGlzLmxvZ19wb3N0KCk7CiAgICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gMTsKICAgICAgICB2YXIgb25lX2xvZ19kZW5zID0gdGhpcy5sb2dfcG9zdCgpOwogICAgICAgIHZhciBtYXhfbG9nX2RlbnMgPSBNYXRoLm1heCh6ZXJvX2xvZ19kZW5zLCBvbmVfbG9nX2RlbnMpOwogICAgICAgIHplcm9fbG9nX2RlbnMgLT0gbWF4X2xvZ19kZW5zOwogICAgICAgIG9uZV9sb2dfZGVucyAtPSBtYXhfbG9nX2RlbnM7CiAgICAgICAgdmFyIHplcm9fcHJvYiA9IE1hdGguZXhwKHplcm9fbG9nX2RlbnMgLSBNYXRoLmxvZyhNYXRoLmV4cCh6ZXJvX2xvZ19kZW5zKSArIE1hdGguZXhwKG9uZV9sb2dfZGVucykpKTsKICAgICAgICBpZiAoTWF0aC5yYW5kb20oKSA8IHplcm9fcHJvYikgewogICAgICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gMDsKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0gLy8gZWxzZSBrZWVwIHRoZSBwYXJhbSBhdCAxIC4KICAgICAgICByZXR1cm4gMTsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAqIEBjbGFzcwogICAgICAqIEBpbXBsZW1lbnRzIHtTdGVwcGVyfQogICAgICAqIEp1c3QgbGlrZSBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIHRoaXMgU3RlcHBlciB0YWtlcyBhIHN0ZXBzIGZvcgogICAgICAqIGEgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIgYnkgdXBkYXRpbmcgZWFjaCBjb21wb25lbnQgaW4gdHVybi4gVGhlIGRpZmZlcmVuY2UKICAgICAgKiBpcyB0aGF0IHRoaXMgc3RlcHBlciB3b3JrcyBvbiBiaW5hcnkgcGFyYW1ldGVycy4KICAgICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyIGRlZmluaXRpb24gZm9yIGEgCiAgICAgICogICBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlci4KICAgICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuCiAgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIAogICAgICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci4KICAgICAgKi8KICAgICAgdmFyIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHsKICAgICAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpOwogICAgICAgIHZhciBwYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTsKICAgICAgICBpZiAocGFyYW1fbmFtZXMubGVuZ3RoID09IDEpIHsKICAgICAgICAgIHRoaXMucGFyYW1fbmFtZSA9IHBhcmFtX25hbWVzWzBdOwogICAgICAgICAgdmFyIHBhcmFtID0gdGhpcy5wYXJhbXNbdGhpcy5wYXJhbV9uYW1lXTsKICAgICAgICAgIHRoaXMuZGltID0gcGFyYW0uZGltOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyAiQmluYXJ5Q29tcG9uZW50U3RlcHBlciBjYW4ndCBoYW5kbGUgbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIuIjsKICAgICAgICB9CiAgICAgICAgdmFyIGNyZWF0ZV9zdWJzdGVwcGVycyA9IGZ1bmN0aW9uIChkaW0sIHN1YnN0YXRlLCBsb2dfcG9zdCkgewogICAgICAgICAgdmFyIHN1YnN0ZXBwZXJzID0gW107CiAgICAgICAgICB2YXIgaTsKICAgICAgICAgIGlmIChkaW0ubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykgewogICAgICAgICAgICAgIHZhciBzdWJwYXJhbXMgPSB7fTsKICAgICAgICAgICAgICBzdWJwYXJhbXNbaV0gPSBwYXJhbTsKICAgICAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IG5ldyBCaW5hcnlTdGVwcGVyKHN1YnBhcmFtcywgc3Vic3RhdGUsIGxvZ19wb3N0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7CiAgICAgICAgICAgICAgc3Vic3RlcHBlcnNbaV0gPSBjcmVhdGVfc3Vic3RlcHBlcnMoZGltLnNsaWNlKDEpLCBzdWJzdGF0ZVtpXSwgbG9nX3Bvc3QpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gc3Vic3RlcHBlcnM7CiAgICAgICAgfTsKICAgICAgICB0aGlzLnN1YnN0ZXBwZXJzID0gY3JlYXRlX3N1YnN0ZXBwZXJzKHRoaXMuZGltLCB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0sIHRoaXMubG9nX3Bvc3QpOwogICAgICB9OwogICAgICBCaW5hcnlDb21wb25lbnRTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOwogICAgICBCaW5hcnlDb21wb25lbnRTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJpbmFyeUNvbXBvbmVudFN0ZXBwZXI7CiAgICAgIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gR28gdGhyb3VnaCB0aGUgc3Vic3RlcHBlcnMgaW4gYSByYW5kb20gb3JkZXIgYW5kIGNhbGwgc3RlcCgpIG9uIHRoZW0uCiAgICAgICAgcmV0dXJuIG5lc3RlZF9hcnJheV9yYW5kb21fYXBwbHkodGhpcy5zdWJzdGVwcGVycywgZnVuY3Rpb24gKHN1YnN0ZXBwZXIpIHsKICAgICAgICAgIHJldHVybiBzdWJzdGVwcGVyLnN0ZXAoKTsKICAgICAgICB9KTsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAgKiBAY2xhc3MKICAgICAgICogQGltcGxlbWVudHMge1N0ZXBwZXJ9CiAgICAgICAqIFRoaXMgc3RlcHBlciBjYW4gYmUgcmVzcG9uc2libGUgZm9yIHRha2luZyBhIHN0ZXAgZm9yIG9uZSBvciBtb3JlIHBhcmFtZXRlcnMuCiAgICAgICAqIEZvciByZWFsIGFuZCBpbnQgcGFyYW1ldGVycyBpdCB0YWtlcyBNZXRyb3BvbGlzIHdpdGhpbiBHaWJicyBzdGVwcywgYW5kIGZvciAKICAgICAgICogYmluYXJ5IHBhcmFtZXRlcnMgaXQgZG9lcyBldmFsdWF0ZXMgdGhlIHBvc3RlcmlvciBmb3IgYm90aCBwYXJhbXRlciB2YWx1ZXMgYW5kCiAgICAgICAqIHJhbmRvbWx5IGNoYW5nZXMgdG8gYSBjZXJ0YWluIHZhbHVlIHByb3BvcnRpb25hbGx5IHRvIHRoYXQgdmFsdWUncyBwb3N0ZXJpb3IKICAgICAgICogKHRoaXMgaXMgYWxzbyBkb25lIGZvciBlYWNoIHBhcmFtZXRlciwgc28gYWxzbyBhICogd2l0aGluIEdpYmJzIGFwcHJvYWNoKS4KICAgICAgICogVGhpcyBzdGVwcGVyIGlzIGFsc28gYWRhcHRpdmUgYW5kIGNhbiBiZSBlZmZpY2llbnQgd2hlbiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKICAgICAgICogYXJlIG5vdCB0b28gaGlnaCBhbmQgdGhlIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHBhcmFtZXRlcnMgYXJlIGxvdy4KICAgICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIGEgb25lIG9yIG1vcmUgcGFyYW1ldGVyIGRlZmluaXRpb25zCiAgICAgICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy4KICAgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIAogICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuCiAgICAgICovCiAgICAgIHZhciBBbXdnU3RlcHBlciA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykgewogICAgICAgIFN0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCk7CiAgICAgICAgdGhpcy5wYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTsKICAgICAgICB0aGlzLnN1YnN0ZXBwZXJzID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhcmFtX25hbWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbdGhpcy5wYXJhbV9uYW1lc1tpXV07CiAgICAgICAgICB2YXIgU2VsZWN0U3RlcHBlcjsKICAgICAgICAgIHN3aXRjaCAocGFyYW0udHlwZSkgewogICAgICAgICAgICBjYXNlICJyZWFsIjoKICAgICAgICAgICAgICBpZiAoYXJyYXlfZXF1YWwocGFyYW0uZGltLCBbMV0pKSB7CiAgICAgICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gUmVhbE1ldHJvcG9saXNTdGVwcGVyOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJpbnQiOgogICAgICAgICAgICAgIGlmIChhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHsKICAgICAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBJbnRNZXRyb3BvbGlzU3RlcHBlcjsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJiaW5hcnkiOgogICAgICAgICAgICAgIGlmIChhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHsKICAgICAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBCaW5hcnlTdGVwcGVyOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gQmluYXJ5Q29tcG9uZW50U3RlcHBlcjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgdGhyb3cgIkFtd2dTdGVwcGVyIGNhbid0IGhhbmRsZSBwYXJhbWV0ZXIgIiArIHRoaXMucGFyYW1fbmFtZXNbaV0gKyAiIHdpdGggdHlwZSAiICsgcGFyYW0udHlwZTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBwYXJhbV9vYmplY3Rfd3JhcCA9IHt9OwogICAgICAgICAgcGFyYW1fb2JqZWN0X3dyYXBbdGhpcy5wYXJhbV9uYW1lc1tpXV0gPSBwYXJhbTsKICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgICAgICAgdmFyIHBhcmFtX29wdGlvbnMgPSBvcHRpb25zLnBhcmFtcyAmJiBvcHRpb25zLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVzW2ldXSB8fCB7fTsKICAgICAgICAgIHBhcmFtX29wdGlvbnMucHJvcF9sb2dfc2NhbGUgPSBwYXJhbV9vcHRpb25zLnByb3BfbG9nX3NjYWxlIHx8IG9wdGlvbnMucHJvcF9sb2dfc2NhbGU7CiAgICAgICAgICBwYXJhbV9vcHRpb25zLmJhdGNoX3NpemUgPSBwYXJhbV9vcHRpb25zLmJhdGNoX3NpemUgfHwgb3B0aW9ucy5iYXRjaF9zaXplOwogICAgICAgICAgcGFyYW1fb3B0aW9ucy5tYXhfYWRhcHRhdGlvbiA9IHBhcmFtX29wdGlvbnMubWF4X2FkYXB0YXRpb24gfHwgb3B0aW9ucy5tYXhfYWRhcHRhdGlvbjsKICAgICAgICAgIHBhcmFtX29wdGlvbnMuaW5pdGlhbF9hZGFwdGF0aW9uID0gcGFyYW1fb3B0aW9ucy5pbml0aWFsX2FkYXB0YXRpb24gfHwgb3B0aW9ucy5pbml0aWFsX2FkYXB0YXRpb247CiAgICAgICAgICBwYXJhbV9vcHRpb25zLnRhcmdldF9hY2NlcHRfcmF0ZSA9IHBhcmFtX29wdGlvbnMudGFyZ2V0X2FjY2VwdF9yYXRlIHx8IG9wdGlvbnMudGFyZ2V0X2FjY2VwdF9yYXRlOwogICAgICAgICAgcGFyYW1fb3B0aW9ucy5pc19hZGFwdGluZyA9IHBhcmFtX29wdGlvbnMuaXNfYWRhcHRpbmcgfHwgb3B0aW9ucy5pc19hZGFwdGluZzsKICAgICAgICAgIHRoaXMuc3Vic3RlcHBlcnNbaV0gPSBuZXcgU2VsZWN0U3RlcHBlcihwYXJhbV9vYmplY3Rfd3JhcCwgc3RhdGUsIGxvZ19wb3N0LCBwYXJhbV9vcHRpb25zKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIEFtd2dTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOwogICAgICBBbXdnU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBbXdnU3RlcHBlcjsKICAgICAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgc2h1ZmZsZV9hcnJheSh0aGlzLnN1YnN0ZXBwZXJzKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic3RlcHBlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHRoaXMuc3Vic3RlcHBlcnNbaV0uc3RlcCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZTsKICAgICAgfTsKICAgICAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN1YnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB0aGlzLnN1YnN0ZXBwZXJzW2ldLnN0YXJ0X2FkYXB0YXRpb24oKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIEFtd2dTdGVwcGVyLnByb3RvdHlwZS5zdG9wX2FkYXB0YXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN1YnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB0aGlzLnN1YnN0ZXBwZXJzW2ldLnN0b3BfYWRhcHRhdGlvbigpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGluZm8gPSB7fTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic3RlcHBlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGluZm9bdGhpcy5wYXJhbV9uYW1lc1tpXV0gPSB0aGlzLnN1YnN0ZXBwZXJzW2ldLmluZm8oKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGluZm87CiAgICAgIH07CgogICAgICAvLy8vLy8vLy8vLyBTYW1wbGVyIEZ1bmN0aW9ucyAvLy8vLy8vLy8vCiAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgICAgIC8qKgogICAgICAqIEBpbnRlcmZhY2UKICAgICAgKiBXaGlsZSB5b3UgY291bGQgZml0IGEgbW9kZWwgYnkgcGFzdGluZyB0b2dldGhlciBTdGVwcGVycywgYQogICAgICAvLyBTYW1wbGVyIGlzIGhlcmUgaXMgYSBjb252ZW5pZW5jZSBjbGFzcyB3aGVyZSBhbiBpbnN0YW5jZSBvZiBTYW1wbGVyCiAgICAgIC8vIHNldHMgdXAgdGhlIFN0ZXBwZXJzLCBjaGVja3MgdGhlIHBhcmFtZXRlciBkZWZpbml0aW9uLAogICAgICAvLyBhbmQgbWFuYWdlcyB0aGUgc2FtcGxpbmcuIFRoaXMgaGVyZSBkZWZpbmVzIHRoZSBTYW1wbGVyICJpbnRlcmZhY2UiLgogICAgICAqIEBpbnRlcmZhY2UKICAgICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggcGFyYW1ldGVyIGRlZmluaXRpb25zLCBmb3IgZXhhbXBsZToKICAgICAgKiAgIHsibXUiOiB7InR5cGUiOiAicmVhbCJ9LCAic2lnbWEiOiB7InR5cGUiOiAicmVhbCIsICJsb3dlciIgPSAwfX0KICAgICAgKiAgIFRoZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMgZG9lc24ndCBoYXZlIHRvIGJlICJjb21wbGV0ZSIgYW5kIHByb3BlcnRpZXMKICAgICAgKiAgIGxlZnQgb3V0IChsaWtlIGxvd2VyIGFuZCB1cHBlcikgd2lsbCBiZSBmaWxsZWQgaW4gYnkgZGVmYXVsdHMuCiAgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB3aXRoIHNpZ25hdHVyZSBmdW5jdGlvbihzdGF0ZSwgZGF0YSkuIEhlcmUKICAgICAgKiAgIHN0YXRlIHdpbGwgYmUgYW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc3RhdGUgd2l0aCBlYWNoIHBhcmFtZXRlciBhcyBhIAogICAgICAqICAga2V5IGFuZCB0aGUgcGFyYW1ldGVyIHZhbHVlcyBhcyBudW1iZXJzIG9yIGFycmF5cy4gRm9yIGV4YW1wbGU6CiAgICAgICogICB7Im11IjogMywgInNpZ21hIjogMS41fS4gVGhlIGRhdGEgYXJndW1lbnQgd2lsbCBiZSB0aGUgc2FtZSBvYmplY3QgYXMgCiAgICAgICogICB0aGUgZGF0YSBhcmd1bWVudCBnaXZlbiBiZWxvdy4KICAgICAgKiBAcGFyYW0gZGF0YSAtIGFuIG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIG9uIHRvIHRoZSBsb2dfcG9zdCBmdW5jdGlvbgogICAgICAqICAgd2hlbiBzYW1wbGluZy4KICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHNhbXBsZXIuCiAgICAgICovCiAgICAgIHZhciBTYW1wbGVyID0gZnVuY3Rpb24gKHBhcmFtcywgbG9nX3Bvc3QsIGRhdGEsIG9wdGlvbnMpIHsKICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOwogICAgICAgIHRoaXMucGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7CgogICAgICAgIC8vIFNldHRpbmcgZGVmYXVsdCBvcHRpb25zIGlmIG5vdCBwYXNzZWQgdGhyb3VnaCB0aGUgb3B0aW9ucyBvYmplY3QKICAgICAgICB0aGlzLnBhcmFtX2luaXRfZnVuID0gZ2V0X29wdGlvbigicGFyYW1faW5pdF9mdW4iLCBvcHRpb25zLCBwYXJhbV9pbml0X2ZpeGVkKTsKICAgICAgICB2YXIgdGhpbm5pbmdfaW50ZXJ2YWwgPSBnZXRfb3B0aW9uKCJ0aGluIiwgb3B0aW9ucywgMSk7CiAgICAgICAgdmFyIHBhcmFtc190b19tb25pdG9yID0gZ2V0X29wdGlvbigibW9uaXRvciIsIG9wdGlvbnMsIG51bGwpOwogICAgICAgIHRoaXMudGhpbih0aGlubmluZ19pbnRlcnZhbCk7CiAgICAgICAgdGhpcy5tb25pdG9yKHBhcmFtc190b19tb25pdG9yKTsKICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgIC8vIENvbXBsZXRpbmcgdGhlIHBhcmFtcyBhbmQgaW5pdGlhbGl6aW5nIHRoZSBzdGF0ZS4KICAgICAgICB0aGlzLnBhcmFtcyA9IGNvbXBsZXRlX3BhcmFtcyh0aGlzLnBhcmFtcywgdGhpcy5wYXJhbV9pbml0X2Z1bik7CiAgICAgICAgdmFyIHN0YXRlID0ge307CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnBhcmFtX25hbWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBzdGF0ZVt0aGlzLnBhcmFtX25hbWVzW2ldXSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZXNbaV1dLmluaXQ7CiAgICAgICAgfQogICAgICAgIHRoaXMubG9nX3Bvc3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICByZXR1cm4gbG9nX3Bvc3Qoc3RhdGUsIGRhdGEpOwogICAgICAgIH07CiAgICAgICAgLy8gUnVubmluZyB0aGUgbG9nX3Bvc3QgZnVuY3Rpb24gb25jZSBpbiBjYXNlIGl0IGZ1cnRoZXIgbW9kaWZpZXMgdGhlIHN0YXRlCiAgICAgICAgLy8gZm9yIGV4YW1wbGUgYWRkaW5nIGRlcml2ZWQgcXVhbnRpdGllcy4KICAgICAgICB0aGlzLmxvZ19wb3N0KCk7CiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOwogICAgICAgIHRoaXMuc3RlcHBlcnMgPSB0aGlzLmNyZWF0ZV9zdGVwcGVyX2Vuc2FtYmxlKHRoaXMucGFyYW1zLCB0aGlzLnN0YXRlLCB0aGlzLmxvZ19wb3N0LCB0aGlzLm9wdGlvbnMpOwogICAgICB9OwoKICAgICAgLyoqIFNob3VsZCByZXR1cm4gYSB2ZWN0b3Igb2Ygc3RlcHBlcnMgdGhhdCB3aGVuIGNhbGxlZCAKICAgICAgICogc2hvdWxkIHRha2UgYSBzdGVwIGluIHRoZSBwYXJhbWV0ZXIgc3BhY2UuCiAgICAgICAqLwogICAgICBTYW1wbGVyLnByb3RvdHlwZS5jcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSA9IGZ1bmN0aW9uIChzdGF0ZSwgbG9nX3Bvc3QpIHsKICAgICAgICB0aHJvdyAiRXZlcnkgU2FtcGxlciBuZWVkcyB0byBpbXBsZW1lbnQgY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUoKSI7CiAgICAgIH07CgogICAgICAvKiogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBpbmZvIGFib3V0IHRoZSBzdGF0ZSBvZiB0aGUgU2FtcGxlci4KICAgICAgICovCiAgICAgIFNhbXBsZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHN0YXRlOiB0aGlzLnN0YXRlLAogICAgICAgICAgdGhpbjogdGhpcy50aGluLAogICAgICAgICAgbW9uaXRvcjogdGhpcy5tb25pdG9yLAogICAgICAgICAgc3RlcHBlcnM6IHRoaXMuc3RlcHBlcnMKICAgICAgICB9OwogICAgICB9OwoKICAgICAgLyoqIFRha2VzIGEgc3RlcCBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlLiBSZXR1cm5zIHRoZSBuZXcgc3BhY2UKICAgICAgICogYnV0IGFsc28gbW9kaWZpZXMgdGhlIHN0YXRlIGluIHBsYWNlLgogICAgICAgKi8KICAgICAgU2FtcGxlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBzaHVmZmxlX2FycmF5KHRoaXMuc3RlcHBlcnMpOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zdGVwcGVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgdGhpcy5zdGVwcGVyc1tpXS5zdGVwKCk7CiAgICAgICAgfQogICAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnN0YXRlKS5sZW5ndGggPiBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcykubGVuZ3RoKSB7CiAgICAgICAgICAvLyBUaGUgc3RhdGUgY29udGFpbnMgZGV2aXZlZCBxdWFudGl0aWVzIChub3Qgb25seSBwYXJhbWV0ZXJzKSBhbmQgd2UKICAgICAgICAgIC8vIG5lZWQgdG8gcnVuIHRoZSBsb2dfcG9zdCBvbmNlIG1vcmUgaW4gb3JkZXIgdG8gc2V0IHRoZSBkZXJpdmVkIHF1YW50aXRpZXMKICAgICAgICAgIC8vIGZvciB0aGUgZmluYWwgcGFyYW1ldGVyIHN0YXRlCiAgICAgICAgICB0aGlzLmxvZ19wb3N0KCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLnN0YXRlOwogICAgICB9OwoKICAgICAgLyoqCiAgICAgICAqIFRha2VzIG5faXRlcmF0aW9ucyBzdGVwcyBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlIGFuZCByZXR1cm5zIHRoZW0KICAgICAgICogYXMgYW4gb2JqZWN0IG9mIGFycmF5cyB3aXRoIG9uZSBhcnJheSBwZXIgcGFyYW1ldGVyLiBGb3IgZXhhbXBsZToKICAgICAgICoge211OiBbMSwgLTEsIDIsIDMsIC4uLl0sIHNpZ21hOiBbMSwgMiwgMiwgMSwgLi4uXX0uCiAgICAgICAqIElmIHRoaW4gaXMgPiAxIHRoZW4gbl9pdGVyYXRpb25zIC8gdGhpbiBzYW1wbGVzIGFyZSByZXR1cm5lZC4KICAgICAgICovCiAgICAgIFNhbXBsZXIucHJvdG90eXBlLnNhbXBsZSA9IGZ1bmN0aW9uIChuX2l0ZXJhdGlvbnMpIHsKICAgICAgICAvLyBJbml0aWFsaXppbmcgY3Vycl9zYW1wbGUgd2hlcmUgdGhlIHNhbXBsZSBpcyBnb2luZyB0byBiZSBzYXZlZAogICAgICAgIC8vIGFzIGFuIG9iamVjdCBjb250YWluaW5nIG9uZSBhcnJheSBwZXIgcGFyYW1ldGVyIHRvIGJlIG1vbml0b3JlZC4KICAgICAgICB2YXIgaSwgaiwgbW9uaXRvcmVkX3BhcmFtczsKICAgICAgICBpZiAodGhpcy5tb25pdG9yZWRfcGFyYW1zID09PSBudWxsKSB7CiAgICAgICAgICBtb25pdG9yZWRfcGFyYW1zID0gT2JqZWN0LmtleXModGhpcy5zdGF0ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG1vbml0b3JlZF9wYXJhbXMgPSB0aGlzLm1vbml0b3JlZF9wYXJhbXM7CiAgICAgICAgfQogICAgICAgIHZhciBjdXJyX3NhbXBsZSA9IHt9OwogICAgICAgIGZvciAoaiA9IDA7IGogPCBtb25pdG9yZWRfcGFyYW1zLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICBjdXJyX3NhbXBsZVttb25pdG9yZWRfcGFyYW1zW2pdXSA9IFtdOwogICAgICAgIH0KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbl9pdGVyYXRpb25zOyBpKyspIHsKICAgICAgICAgIGlmIChpICUgdGhpcy50aGlubmluZ19pbnRlcnZhbCA9PT0gMCkgewogICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbW9uaXRvcmVkX3BhcmFtcy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgIHZhciBwYXJhbSA9IG1vbml0b3JlZF9wYXJhbXNbal07CiAgICAgICAgICAgICAgY3Vycl9zYW1wbGVbcGFyYW1dLnB1c2goY2xvbmVfcGFyYW1fZHJhdyh0aGlzLnN0YXRlW3BhcmFtXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLnN0ZXAoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGN1cnJfc2FtcGxlOwogICAgICB9OwoKICAgICAgLyoqCiAgICAgICAqIFRha2VzIG5faXRlcmF0aW9uIHN0ZXBzIGluIHBhcmFtZXRlciBzcGFjZSBidXQgcmV0dXJucyBub3RoaW5nLgogICAgICAgKi8KICAgICAgU2FtcGxlci5wcm90b3R5cGUuYnVybiA9IGZ1bmN0aW9uIChuX2l0ZXJhdGlvbnMpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5faXRlcmF0aW9uczsgaSsrKSB7CiAgICAgICAgICB0aGlzLnN0ZXAoKTsKICAgICAgICB9CiAgICAgIH07CgogICAgICAvKioKICAgICAgICogU2V0cyB3aGF0IHBhcmFtZXRlcnMgc2hvdWxkIGJlIG1vbml0b3JlZCBhbmQgcmV0dXJuZWQgd2hlbiBjYWxsaW5nCiAgICAgICAqIHNhbXBsZS4KICAgICAgICovCiAgICAgIFNhbXBsZXIucHJvdG90eXBlLm1vbml0b3IgPSBmdW5jdGlvbiAocGFyYW1zX3RvX21vbml0b3IpIHsKICAgICAgICB0aGlzLm1vbml0b3JlZF9wYXJhbXMgPSBwYXJhbXNfdG9fbW9uaXRvcjsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAgKiBTZXRzIHRoZSB0aGlubmluZy4gRm9yIGV4YW1wbGUgdGhpbiA9PSAxMCBtZWFucyB0aGF0IGV2ZXJ5IDEwdGggcG9zdGVyaW9yCiAgICAgICAqIGRyYXcgd2lsbCBiZSBrZXB0LgogICAgICAgKi8KICAgICAgU2FtcGxlci5wcm90b3R5cGUudGhpbiA9IGZ1bmN0aW9uICh0aGlubmluZ19pbnRlcnZhbCkgewogICAgICAgIHRoaXMudGhpbm5pbmdfaW50ZXJ2YWwgPSB0aGlubmluZ19pbnRlcnZhbDsKICAgICAgfTsKCiAgICAgIC8qKgogICAgICAgKiBTZXRzIGFkYXB0YXRpb24gb24sIGlmIGFwcGxpY2FibGUsIGluIGFsbCBzdGVwcGVycy4KICAgICAgICovCiAgICAgIFNhbXBsZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB0aGlzLnN0ZXBwZXJzW2ldLnN0YXJ0X2FkYXB0YXRpb24oKTsKICAgICAgICB9CiAgICAgIH07CgogICAgICAvKioKICAgICAgKiBTZXRzIGFkYXB0YXRpb24gb2ZmLCBpZiBhcHBsaWNhYmxlLCBpbiBhbGwgc3RlcHBlcnMuCiAgICAgICovCiAgICAgIFNhbXBsZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3RlcHBlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHRoaXMuc3RlcHBlcnNbaV0uc3RvcF9hZGFwdGF0aW9uKCk7CiAgICAgICAgfQogICAgICB9OwoKICAgICAgLyoqCiAgICAgICogQGNsYXNzCiAgICAgICogQGltcGxlbWVudHMge1NhbXBsZXJ9CiAgICAgICogVGhpcyBzYW1wbGVyIHVzZXMgdGhlIEFtd2dTdGVwcGVyIGFzIHRoZSBzdGVwcGVyIGZ1bmN0aW9uIHdoaWNoIGltcGxlbWVudHMgdGhlIAogICAgICAqIEFkYXB0aXZlIE1ldHJvcG9saXMtV2l0aGluLUdpYmJzIGFsZ29yaXRobSBpbiAiRXhhbXBsZXMgb2YgQWRhcHRpdmUgTUNNQyIKICAgICAgKiBieSBSb2JlcnRzIGFuZCBSb3NlbnRoYWwgKDIwMDgpLiBBbiBhZGl0aW9uIGlzIHRoYXQgaXQgaGFuZGxlcyBpbnQgcGFyYW1ldGVycwogICAgICAqIGJ5IG1ha2luZyBkaXNjcmV0ZSBOb3JtYWwgcHJvcG9zYWxzIGFuZCBiaW5hcnkgcGFyYW1ldGVycyBieSB0YWtpbmcgb24gYSBuZXcgCiAgICAgICogdmFsdWUgcHJvcG9ydGlvbmFsIHRvIHRoZSBwb3N0ZXJpb3Igb2YgdGhlIHR3byBwb3NzaWJsZSBzdGF0ZXMgb2YgdGhlCiAgICAgICogcGFyYW1ldGVyLiBUaGlzIHNhbXBsZXIgY2FuIGJlIGVmZmljaWVudCB3aGVuIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycwogICAgICAqIGFyZSBub3QgdG9vIGhpZ2ggYW5kIHRoZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBwYXJhbWV0ZXJzIGFyZSBsb3cuCiAgICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIGEgb25lIG9yIG1vcmUgcGFyYW1ldGVyIGRlZmluaXRpb25zCiAgICAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLgogICAgICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiAKICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuCiAgICAgICovCiAgICAgIHZhciBBbXdnU2FtcGxlciA9IGZ1bmN0aW9uIChwYXJhbXMsIGxvZ19wb3N0LCBkYXRhLCBvcHRpb25zKSB7CiAgICAgICAgU2FtcGxlci5jYWxsKHRoaXMsIHBhcmFtcywgbG9nX3Bvc3QsIGRhdGEsIG9wdGlvbnMpOwogICAgICB9OwogICAgICBBbXdnU2FtcGxlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNhbXBsZXIucHJvdG90eXBlKTsKICAgICAgQW13Z1NhbXBsZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQW13Z1NhbXBsZXI7CiAgICAgIEFtd2dTYW1wbGVyLnByb3RvdHlwZS5jcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykgewogICAgICAgIHJldHVybiBbbmV3IEFtd2dTdGVwcGVyKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKV07CiAgICAgIH07CgogICAgICAvLyBSZXR1cm5pbmcgdGhlIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBwdWJsaWNseSBleHBvc2VkIGJ5IHRoaXMgbW9kdWxlCiAgICAgIHJldHVybiB7CiAgICAgICAgcnVuaWY6IHJ1bmlmLAogICAgICAgIHJ1bmlmX2Rpc2NyZXRlOiBydW5pZl9kaXNjcmV0ZSwKICAgICAgICBybm9ybTogcm5vcm0sCiAgICAgICAgcGFyYW1faW5pdF9maXhlZDogcGFyYW1faW5pdF9maXhlZCwKICAgICAgICBjb21wbGV0ZV9wYXJhbXM6IGNvbXBsZXRlX3BhcmFtcywKICAgICAgICBSZWFsTWV0cm9wb2xpc1N0ZXBwZXI6IFJlYWxNZXRyb3BvbGlzU3RlcHBlciwKICAgICAgICBJbnRNZXRyb3BvbGlzU3RlcHBlcjogSW50TWV0cm9wb2xpc1N0ZXBwZXIsCiAgICAgICAgTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI6IE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLAogICAgICAgIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI6IE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIsCiAgICAgICAgQmluYXJ5U3RlcHBlcjogQmluYXJ5U3RlcHBlciwKICAgICAgICBCaW5hcnlDb21wb25lbnRTdGVwcGVyOiBCaW5hcnlDb21wb25lbnRTdGVwcGVyLAogICAgICAgIEFtd2dTdGVwcGVyOiBBbXdnU3RlcHBlciwKICAgICAgICBBbXdnU2FtcGxlcjogQW13Z1NhbXBsZXIKICAgICAgfTsKICAgIH0pOwogIH0pKG1jbWMkMSk7CiAgdmFyIG1jbWNFeHBvcnRzID0gbWNtYyQxLmV4cG9ydHM7CgogIGZ1bmN0aW9uIGFzY2VuZGluZyQxKGEsIGIpIHsKICAgIHJldHVybiBhID09IG51bGwgfHwgYiA9PSBudWxsID8gTmFOIDogYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47CiAgfQoKICBmdW5jdGlvbiogbnVtYmVycyh2YWx1ZXMsIHZhbHVlb2YpIHsKICAgIHsKICAgICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7CiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKHZhbHVlID0gK3ZhbHVlKSA+PSB2YWx1ZSkgewogICAgICAgICAgeWllbGQgdmFsdWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjb21wYXJlRGVmaW5lZChjb21wYXJlID0gYXNjZW5kaW5nJDEpIHsKICAgIGlmIChjb21wYXJlID09PSBhc2NlbmRpbmckMSkgcmV0dXJuIGFzY2VuZGluZ0RlZmluZWQ7CiAgICBpZiAodHlwZW9mIGNvbXBhcmUgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoImNvbXBhcmUgaXMgbm90IGEgZnVuY3Rpb24iKTsKICAgIHJldHVybiAoYSwgYikgPT4gewogICAgICBjb25zdCB4ID0gY29tcGFyZShhLCBiKTsKICAgICAgaWYgKHggfHwgeCA9PT0gMCkgcmV0dXJuIHg7CiAgICAgIHJldHVybiAoY29tcGFyZShiLCBiKSA9PT0gMCkgLSAoY29tcGFyZShhLCBhKSA9PT0gMCk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBhc2NlbmRpbmdEZWZpbmVkKGEsIGIpIHsKICAgIHJldHVybiAoYSA9PSBudWxsIHx8ICEoYSA+PSBhKSkgLSAoYiA9PSBudWxsIHx8ICEoYiA+PSBiKSkgfHwgKGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwKTsKICB9CgogIGZ1bmN0aW9uIG1heCh2YWx1ZXMsIHZhbHVlb2YpIHsKICAgIGxldCBtYXg7CiAgICB7CiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7CiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKG1heCA8IHZhbHVlIHx8IG1heCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkgewogICAgICAgICAgbWF4ID0gdmFsdWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbWF4OwogIH0KCiAgZnVuY3Rpb24gbWluKHZhbHVlcywgdmFsdWVvZikgewogICAgbGV0IG1pbjsKICAgIHsKICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHsKICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAobWluID4gdmFsdWUgfHwgbWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSB7CiAgICAgICAgICBtaW4gPSB2YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBtaW47CiAgfQoKICAvLyBCYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vbW91cm5lci9xdWlja3NlbGVjdAogIC8vIElTQyBsaWNlbnNlLCBDb3B5cmlnaHQgMjAxOCBWbGFkaW1pciBBZ2Fmb25raW4uCiAgZnVuY3Rpb24gcXVpY2tzZWxlY3QoYXJyYXksIGssIGxlZnQgPSAwLCByaWdodCA9IEluZmluaXR5LCBjb21wYXJlKSB7CiAgICBrID0gTWF0aC5mbG9vcihrKTsKICAgIGxlZnQgPSBNYXRoLmZsb29yKE1hdGgubWF4KDAsIGxlZnQpKTsKICAgIHJpZ2h0ID0gTWF0aC5mbG9vcihNYXRoLm1pbihhcnJheS5sZW5ndGggLSAxLCByaWdodCkpOwogICAgaWYgKCEobGVmdCA8PSBrICYmIGsgPD0gcmlnaHQpKSByZXR1cm4gYXJyYXk7CiAgICBjb21wYXJlID0gY29tcGFyZSA9PT0gdW5kZWZpbmVkID8gYXNjZW5kaW5nRGVmaW5lZCA6IGNvbXBhcmVEZWZpbmVkKGNvbXBhcmUpOwogICAgd2hpbGUgKHJpZ2h0ID4gbGVmdCkgewogICAgICBpZiAocmlnaHQgLSBsZWZ0ID4gNjAwKSB7CiAgICAgICAgY29uc3QgbiA9IHJpZ2h0IC0gbGVmdCArIDE7CiAgICAgICAgY29uc3QgbSA9IGsgLSBsZWZ0ICsgMTsKICAgICAgICBjb25zdCB6ID0gTWF0aC5sb2cobik7CiAgICAgICAgY29uc3QgcyA9IDAuNSAqIE1hdGguZXhwKDIgKiB6IC8gMyk7CiAgICAgICAgY29uc3Qgc2QgPSAwLjUgKiBNYXRoLnNxcnQoeiAqIHMgKiAobiAtIHMpIC8gbikgKiAobSAtIG4gLyAyIDwgMCA/IC0xIDogMSk7CiAgICAgICAgY29uc3QgbmV3TGVmdCA9IE1hdGgubWF4KGxlZnQsIE1hdGguZmxvb3IoayAtIG0gKiBzIC8gbiArIHNkKSk7CiAgICAgICAgY29uc3QgbmV3UmlnaHQgPSBNYXRoLm1pbihyaWdodCwgTWF0aC5mbG9vcihrICsgKG4gLSBtKSAqIHMgLyBuICsgc2QpKTsKICAgICAgICBxdWlja3NlbGVjdChhcnJheSwgaywgbmV3TGVmdCwgbmV3UmlnaHQsIGNvbXBhcmUpOwogICAgICB9CiAgICAgIGNvbnN0IHQgPSBhcnJheVtrXTsKICAgICAgbGV0IGkgPSBsZWZ0OwogICAgICBsZXQgaiA9IHJpZ2h0OwogICAgICBzd2FwKGFycmF5LCBsZWZ0LCBrKTsKICAgICAgaWYgKGNvbXBhcmUoYXJyYXlbcmlnaHRdLCB0KSA+IDApIHN3YXAoYXJyYXksIGxlZnQsIHJpZ2h0KTsKICAgICAgd2hpbGUgKGkgPCBqKSB7CiAgICAgICAgc3dhcChhcnJheSwgaSwgaiksICsraSwgLS1qOwogICAgICAgIHdoaWxlIChjb21wYXJlKGFycmF5W2ldLCB0KSA8IDApICsraTsKICAgICAgICB3aGlsZSAoY29tcGFyZShhcnJheVtqXSwgdCkgPiAwKSAtLWo7CiAgICAgIH0KICAgICAgaWYgKGNvbXBhcmUoYXJyYXlbbGVmdF0sIHQpID09PSAwKSBzd2FwKGFycmF5LCBsZWZ0LCBqKTtlbHNlICsraiwgc3dhcChhcnJheSwgaiwgcmlnaHQpOwogICAgICBpZiAoaiA8PSBrKSBsZWZ0ID0gaiArIDE7CiAgICAgIGlmIChrIDw9IGopIHJpZ2h0ID0gaiAtIDE7CiAgICB9CiAgICByZXR1cm4gYXJyYXk7CiAgfQogIGZ1bmN0aW9uIHN3YXAoYXJyYXksIGksIGopIHsKICAgIGNvbnN0IHQgPSBhcnJheVtpXTsKICAgIGFycmF5W2ldID0gYXJyYXlbal07CiAgICBhcnJheVtqXSA9IHQ7CiAgfQoKICBmdW5jdGlvbiBxdWFudGlsZSh2YWx1ZXMsIHAsIHZhbHVlb2YpIHsKICAgIHZhbHVlcyA9IEZsb2F0NjRBcnJheS5mcm9tKG51bWJlcnModmFsdWVzKSk7CiAgICBpZiAoIShuID0gdmFsdWVzLmxlbmd0aCkgfHwgaXNOYU4ocCA9ICtwKSkgcmV0dXJuOwogICAgaWYgKHAgPD0gMCB8fCBuIDwgMikgcmV0dXJuIG1pbih2YWx1ZXMpOwogICAgaWYgKHAgPj0gMSkgcmV0dXJuIG1heCh2YWx1ZXMpOwogICAgdmFyIG4sCiAgICAgIGkgPSAobiAtIDEpICogcCwKICAgICAgaTAgPSBNYXRoLmZsb29yKGkpLAogICAgICB2YWx1ZTAgPSBtYXgocXVpY2tzZWxlY3QodmFsdWVzLCBpMCkuc3ViYXJyYXkoMCwgaTAgKyAxKSksCiAgICAgIHZhbHVlMSA9IG1pbih2YWx1ZXMuc3ViYXJyYXkoaTAgKyAxKSk7CiAgICByZXR1cm4gdmFsdWUwICsgKHZhbHVlMSAtIHZhbHVlMCkgKiAoaSAtIGkwKTsKICB9CgogIGZ1bmN0aW9uIG1lZGlhbih2YWx1ZXMsIHZhbHVlb2YpIHsKICAgIHJldHVybiBxdWFudGlsZSh2YWx1ZXMsIDAuNSk7CiAgfQoKICB2YXIgbm9vcCA9IHsKICAgIHZhbHVlOiAoKSA9PiB7fQogIH07CiAgZnVuY3Rpb24gZGlzcGF0Y2goKSB7CiAgICBmb3IgKHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGgsIF8gPSB7fSwgdDsgaSA8IG47ICsraSkgewogICAgICBpZiAoISh0ID0gYXJndW1lbnRzW2ldICsgIiIpIHx8IHQgaW4gXyB8fCAvW1xzLl0vLnRlc3QodCkpIHRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiICsgdCk7CiAgICAgIF9bdF0gPSBbXTsKICAgIH0KICAgIHJldHVybiBuZXcgRGlzcGF0Y2goXyk7CiAgfQogIGZ1bmN0aW9uIERpc3BhdGNoKF8pIHsKICAgIHRoaXMuXyA9IF87CiAgfQogIGZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzJDEodHlwZW5hbWVzLCB0eXBlcykgewogICAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XHMrLykubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgIHZhciBuYW1lID0gIiIsCiAgICAgICAgaSA9IHQuaW5kZXhPZigiLiIpOwogICAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpOwogICAgICBpZiAodCAmJiAhdHlwZXMuaGFzT3duUHJvcGVydHkodCkpIHRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiICsgdCk7CiAgICAgIHJldHVybiB7CiAgICAgICAgdHlwZTogdCwKICAgICAgICBuYW1lOiBuYW1lCiAgICAgIH07CiAgICB9KTsKICB9CiAgRGlzcGF0Y2gucHJvdG90eXBlID0gZGlzcGF0Y2gucHJvdG90eXBlID0gewogICAgY29uc3RydWN0b3I6IERpc3BhdGNoLAogICAgb246IGZ1bmN0aW9uICh0eXBlbmFtZSwgY2FsbGJhY2spIHsKICAgICAgdmFyIF8gPSB0aGlzLl8sCiAgICAgICAgVCA9IHBhcnNlVHlwZW5hbWVzJDEodHlwZW5hbWUgKyAiIiwgXyksCiAgICAgICAgdCwKICAgICAgICBpID0gLTEsCiAgICAgICAgbiA9IFQubGVuZ3RoOwoKICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBjYWxsYmFjayBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS4KICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgodCA9ICh0eXBlbmFtZSA9IFRbaV0pLnR5cGUpICYmICh0ID0gZ2V0JDEoX1t0XSwgdHlwZW5hbWUubmFtZSkpKSByZXR1cm4gdDsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIC8vIElmIGEgdHlwZSB3YXMgc3BlY2lmaWVkLCBzZXQgdGhlIGNhbGxiYWNrIGZvciB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS4KICAgICAgLy8gT3RoZXJ3aXNlLCBpZiBhIG51bGwgY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmVtb3ZlIGNhbGxiYWNrcyBvZiB0aGUgZ2l2ZW4gbmFtZS4KICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwgJiYgdHlwZW9mIGNhbGxiYWNrICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIgKyBjYWxsYmFjayk7CiAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgaWYgKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSBfW3RdID0gc2V0JDEoX1t0XSwgdHlwZW5hbWUubmFtZSwgY2FsbGJhY2spO2Vsc2UgaWYgKGNhbGxiYWNrID09IG51bGwpIGZvciAodCBpbiBfKSBfW3RdID0gc2V0JDEoX1t0XSwgdHlwZW5hbWUubmFtZSwgbnVsbCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAogICAgY29weTogZnVuY3Rpb24gKCkgewogICAgICB2YXIgY29weSA9IHt9LAogICAgICAgIF8gPSB0aGlzLl87CiAgICAgIGZvciAodmFyIHQgaW4gXykgY29weVt0XSA9IF9bdF0uc2xpY2UoKTsKICAgICAgcmV0dXJuIG5ldyBEaXNwYXRjaChjb3B5KTsKICAgIH0sCiAgICBjYWxsOiBmdW5jdGlvbiAodHlwZSwgdGhhdCkgewogICAgICBpZiAoKG4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMikgPiAwKSBmb3IgKHZhciBhcmdzID0gbmV3IEFycmF5KG4pLCBpID0gMCwgbiwgdDsgaSA8IG47ICsraSkgYXJnc1tpXSA9IGFyZ3VtZW50c1tpICsgMl07CiAgICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIiArIHR5cGUpOwogICAgICBmb3IgKHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7CiAgICB9LAogICAgYXBwbHk6IGZ1bmN0aW9uICh0eXBlLCB0aGF0LCBhcmdzKSB7CiAgICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIiArIHR5cGUpOwogICAgICBmb3IgKHZhciB0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpOwogICAgfQogIH07CiAgZnVuY3Rpb24gZ2V0JDEodHlwZSwgbmFtZSkgewogICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aCwgYzsgaSA8IG47ICsraSkgewogICAgICBpZiAoKGMgPSB0eXBlW2ldKS5uYW1lID09PSBuYW1lKSB7CiAgICAgICAgcmV0dXJuIGMudmFsdWU7CiAgICAgIH0KICAgIH0KICB9CiAgZnVuY3Rpb24gc2V0JDEodHlwZSwgbmFtZSwgY2FsbGJhY2spIHsKICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHlwZS5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKHR5cGVbaV0ubmFtZSA9PT0gbmFtZSkgewogICAgICAgIHR5cGVbaV0gPSBub29wLCB0eXBlID0gdHlwZS5zbGljZSgwLCBpKS5jb25jYXQodHlwZS5zbGljZShpICsgMSkpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgdHlwZS5wdXNoKHsKICAgICAgbmFtZTogbmFtZSwKICAgICAgdmFsdWU6IGNhbGxiYWNrCiAgICB9KTsKICAgIHJldHVybiB0eXBlOwogIH0KCiAgdmFyIHhodG1sID0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOwogIHZhciBuYW1lc3BhY2VzID0gewogICAgc3ZnOiAiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLAogICAgeGh0bWw6IHhodG1sLAogICAgeGxpbms6ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiwKICAgIHhtbDogImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsCiAgICB4bWxuczogImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIgogIH07CgogIGZ1bmN0aW9uIG5hbWVzcGFjZSAobmFtZSkgewogICAgdmFyIHByZWZpeCA9IG5hbWUgKz0gIiIsCiAgICAgIGkgPSBwcmVmaXguaW5kZXhPZigiOiIpOwogICAgaWYgKGkgPj0gMCAmJiAocHJlZml4ID0gbmFtZS5zbGljZSgwLCBpKSkgIT09ICJ4bWxucyIpIG5hbWUgPSBuYW1lLnNsaWNlKGkgKyAxKTsKICAgIHJldHVybiBuYW1lc3BhY2VzLmhhc093blByb3BlcnR5KHByZWZpeCkgPyB7CiAgICAgIHNwYWNlOiBuYW1lc3BhY2VzW3ByZWZpeF0sCiAgICAgIGxvY2FsOiBuYW1lCiAgICB9IDogbmFtZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnMKICB9CgogIGZ1bmN0aW9uIGNyZWF0b3JJbmhlcml0KG5hbWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBkb2N1bWVudCA9IHRoaXMub3duZXJEb2N1bWVudCwKICAgICAgICB1cmkgPSB0aGlzLm5hbWVzcGFjZVVSSTsKICAgICAgcmV0dXJuIHVyaSA9PT0geGh0bWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0geGh0bWwgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHVyaSwgbmFtZSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBjcmVhdG9yRml4ZWQoZnVsbG5hbWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBjcmVhdG9yIChuYW1lKSB7CiAgICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7CiAgICByZXR1cm4gKGZ1bGxuYW1lLmxvY2FsID8gY3JlYXRvckZpeGVkIDogY3JlYXRvckluaGVyaXQpKGZ1bGxuYW1lKTsKICB9CgogIGZ1bmN0aW9uIG5vbmUoKSB7fQogIGZ1bmN0aW9uIHNlbGVjdG9yIChzZWxlY3RvcikgewogICAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwgPyBub25lIDogZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgIH07CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fc2VsZWN0IChzZWxlY3QpIHsKICAgIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSAiZnVuY3Rpb24iKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpOwogICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkgewogICAgICAgICAgaWYgKCJfX2RhdGFfXyIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187CiAgICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IFNlbGVjdGlvbiQxKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cyk7CiAgfQoKICAvLyBHaXZlbiBzb21ldGhpbmcgYXJyYXkgbGlrZSAob3IgbnVsbCksIHJldHVybnMgc29tZXRoaW5nIHRoYXQgaXMgc3RyaWN0bHkgYW4KICAvLyBhcnJheS4gVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IGFycmF5LWxpa2Ugb2JqZWN0cyBwYXNzZWQgdG8gZDMuc2VsZWN0QWxsCiAgLy8gb3Igc2VsZWN0aW9uLnNlbGVjdEFsbCBhcmUgY29udmVydGVkIGludG8gcHJvcGVyIGFycmF5cyB3aGVuIGNyZWF0aW5nIGEKICAvLyBzZWxlY3Rpb247IHdlIGRvbuKAmXQgZXZlciB3YW50IHRvIGNyZWF0ZSBhIHNlbGVjdGlvbiBiYWNrZWQgYnkgYSBsaXZlCiAgLy8gSFRNTENvbGxlY3Rpb24gb3IgTm9kZUxpc3QuIEhvd2V2ZXIsIG5vdGUgdGhhdCBzZWxlY3Rpb24uc2VsZWN0QWxsIHdpbGwgdXNlIGEKICAvLyBzdGF0aWMgTm9kZUxpc3QgYXMgYSBncm91cCwgc2luY2UgaXQgc2FmZWx5IGRlcml2ZWQgZnJvbSBxdWVyeVNlbGVjdG9yQWxsLgogIGZ1bmN0aW9uIGFycmF5KHgpIHsKICAgIHJldHVybiB4ID09IG51bGwgPyBbXSA6IEFycmF5LmlzQXJyYXkoeCkgPyB4IDogQXJyYXkuZnJvbSh4KTsKICB9CgogIGZ1bmN0aW9uIGVtcHR5KCkgewogICAgcmV0dXJuIFtdOwogIH0KICBmdW5jdGlvbiBzZWxlY3RvckFsbCAoc2VsZWN0b3IpIHsKICAgIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gZW1wdHkgOiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIGFycmF5QWxsKHNlbGVjdCkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIGFycmF5KHNlbGVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9zZWxlY3RBbGwgKHNlbGVjdCkgewogICAgaWYgKHR5cGVvZiBzZWxlY3QgPT09ICJmdW5jdGlvbiIpIHNlbGVjdCA9IGFycmF5QWxsKHNlbGVjdCk7ZWxzZSBzZWxlY3QgPSBzZWxlY3RvckFsbChzZWxlY3QpOwogICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gW10sIHBhcmVudHMgPSBbXSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgICAgc3ViZ3JvdXBzLnB1c2goc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKTsKICAgICAgICAgIHBhcmVudHMucHVzaChub2RlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgU2VsZWN0aW9uJDEoc3ViZ3JvdXBzLCBwYXJlbnRzKTsKICB9CgogIGZ1bmN0aW9uIG1hdGNoZXIgKHNlbGVjdG9yKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gdGhpcy5tYXRjaGVzKHNlbGVjdG9yKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGNoaWxkTWF0Y2hlcihzZWxlY3RvcikgewogICAgcmV0dXJuIGZ1bmN0aW9uIChub2RlKSB7CiAgICAgIHJldHVybiBub2RlLm1hdGNoZXMoc2VsZWN0b3IpOwogICAgfTsKICB9CgogIHZhciBmaW5kID0gQXJyYXkucHJvdG90eXBlLmZpbmQ7CiAgZnVuY3Rpb24gY2hpbGRGaW5kKG1hdGNoKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gZmluZC5jYWxsKHRoaXMuY2hpbGRyZW4sIG1hdGNoKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGNoaWxkRmlyc3QoKSB7CiAgICByZXR1cm4gdGhpcy5maXJzdEVsZW1lbnRDaGlsZDsKICB9CiAgZnVuY3Rpb24gc2VsZWN0aW9uX3NlbGVjdENoaWxkIChtYXRjaCkgewogICAgcmV0dXJuIHRoaXMuc2VsZWN0KG1hdGNoID09IG51bGwgPyBjaGlsZEZpcnN0IDogY2hpbGRGaW5kKHR5cGVvZiBtYXRjaCA9PT0gImZ1bmN0aW9uIiA/IG1hdGNoIDogY2hpbGRNYXRjaGVyKG1hdGNoKSkpOwogIH0KCiAgdmFyIGZpbHRlciA9IEFycmF5LnByb3RvdHlwZS5maWx0ZXI7CiAgZnVuY3Rpb24gY2hpbGRyZW4oKSB7CiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuKTsKICB9CiAgZnVuY3Rpb24gY2hpbGRyZW5GaWx0ZXIobWF0Y2gpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiBmaWx0ZXIuY2FsbCh0aGlzLmNoaWxkcmVuLCBtYXRjaCk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzZWxlY3Rpb25fc2VsZWN0Q2hpbGRyZW4gKG1hdGNoKSB7CiAgICByZXR1cm4gdGhpcy5zZWxlY3RBbGwobWF0Y2ggPT0gbnVsbCA/IGNoaWxkcmVuIDogY2hpbGRyZW5GaWx0ZXIodHlwZW9mIG1hdGNoID09PSAiZnVuY3Rpb24iID8gbWF0Y2ggOiBjaGlsZE1hdGNoZXIobWF0Y2gpKSk7CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fZmlsdGVyIChtYXRjaCkgewogICAgaWYgKHR5cGVvZiBtYXRjaCAhPT0gImZ1bmN0aW9uIikgbWF0Y2ggPSBtYXRjaGVyKG1hdGNoKTsKICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gW10sIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7CiAgICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24kMShzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpOwogIH0KCiAgZnVuY3Rpb24gc3BhcnNlICh1cGRhdGUpIHsKICAgIHJldHVybiBuZXcgQXJyYXkodXBkYXRlLmxlbmd0aCk7CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fZW50ZXIgKCkgewogICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24kMSh0aGlzLl9lbnRlciB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksIHRoaXMuX3BhcmVudHMpOwogIH0KICBmdW5jdGlvbiBFbnRlck5vZGUocGFyZW50LCBkYXR1bSkgewogICAgdGhpcy5vd25lckRvY3VtZW50ID0gcGFyZW50Lm93bmVyRG9jdW1lbnQ7CiAgICB0aGlzLm5hbWVzcGFjZVVSSSA9IHBhcmVudC5uYW1lc3BhY2VVUkk7CiAgICB0aGlzLl9uZXh0ID0gbnVsbDsKICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDsKICAgIHRoaXMuX19kYXRhX18gPSBkYXR1bTsKICB9CiAgRW50ZXJOb2RlLnByb3RvdHlwZSA9IHsKICAgIGNvbnN0cnVjdG9yOiBFbnRlck5vZGUsCiAgICBhcHBlbmRDaGlsZDogZnVuY3Rpb24gKGNoaWxkKSB7CiAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCB0aGlzLl9uZXh0KTsKICAgIH0sCiAgICBpbnNlcnRCZWZvcmU6IGZ1bmN0aW9uIChjaGlsZCwgbmV4dCkgewogICAgICByZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbmV4dCk7CiAgICB9LAogICAgcXVlcnlTZWxlY3RvcjogZnVuY3Rpb24gKHNlbGVjdG9yKSB7CiAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7CiAgICB9LAogICAgcXVlcnlTZWxlY3RvckFsbDogZnVuY3Rpb24gKHNlbGVjdG9yKSB7CiAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gY29uc3RhbnQkMSAoeCkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIHg7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gYmluZEluZGV4KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQsIGRhdGEpIHsKICAgIHZhciBpID0gMCwKICAgICAgbm9kZSwKICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsCiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDsKCiAgICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZml0IGludG8gdXBkYXRlLgogICAgLy8gUHV0IGFueSBudWxsIG5vZGVzIGludG8gZW50ZXIuCiAgICAvLyBQdXQgYW55IHJlbWFpbmluZyBkYXRhIGludG8gZW50ZXIuCiAgICBmb3IgKDsgaSA8IGRhdGFMZW5ndGg7ICsraSkgewogICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgbm9kZS5fX2RhdGFfXyA9IGRhdGFbaV07CiAgICAgICAgdXBkYXRlW2ldID0gbm9kZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBlbnRlcltpXSA9IG5ldyBFbnRlck5vZGUocGFyZW50LCBkYXRhW2ldKTsKICAgICAgfQogICAgfQoKICAgIC8vIFB1dCBhbnkgbm9uLW51bGwgbm9kZXMgdGhhdCBkb27igJl0IGZpdCBpbnRvIGV4aXQuCiAgICBmb3IgKDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHsKICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgIGV4aXRbaV0gPSBub2RlOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIGJpbmRLZXkocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSwga2V5KSB7CiAgICB2YXIgaSwKICAgICAgbm9kZSwKICAgICAgbm9kZUJ5S2V5VmFsdWUgPSBuZXcgTWFwKCksCiAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLAogICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsCiAgICAgIGtleVZhbHVlcyA9IG5ldyBBcnJheShncm91cExlbmd0aCksCiAgICAgIGtleVZhbHVlOwoKICAgIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBub2RlLgogICAgLy8gSWYgbXVsdGlwbGUgbm9kZXMgaGF2ZSB0aGUgc2FtZSBrZXksIHRoZSBkdXBsaWNhdGVzIGFyZSBhZGRlZCB0byBleGl0LgogICAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHsKICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgIGtleVZhbHVlc1tpXSA9IGtleVZhbHVlID0ga2V5LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApICsgIiI7CiAgICAgICAgaWYgKG5vZGVCeUtleVZhbHVlLmhhcyhrZXlWYWx1ZSkpIHsKICAgICAgICAgIGV4aXRbaV0gPSBub2RlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBub2RlQnlLZXlWYWx1ZS5zZXQoa2V5VmFsdWUsIG5vZGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBkYXR1bS4KICAgIC8vIElmIHRoZXJlIGEgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBrZXksIGpvaW4gYW5kIGFkZCBpdCB0byB1cGRhdGUuCiAgICAvLyBJZiB0aGVyZSBpcyBub3QgKG9yIHRoZSBrZXkgaXMgYSBkdXBsaWNhdGUpLCBhZGQgaXQgdG8gZW50ZXIuCiAgICBmb3IgKGkgPSAwOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7CiAgICAgIGtleVZhbHVlID0ga2V5LmNhbGwocGFyZW50LCBkYXRhW2ldLCBpLCBkYXRhKSArICIiOwogICAgICBpZiAobm9kZSA9IG5vZGVCeUtleVZhbHVlLmdldChrZXlWYWx1ZSkpIHsKICAgICAgICB1cGRhdGVbaV0gPSBub2RlOwogICAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldOwogICAgICAgIG5vZGVCeUtleVZhbHVlLmRlbGV0ZShrZXlWYWx1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtpXSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBBZGQgYW55IHJlbWFpbmluZyBub2RlcyB0aGF0IHdlcmUgbm90IGJvdW5kIHRvIGRhdGEgdG8gZXhpdC4KICAgIGZvciAoaSA9IDA7IGkgPCBncm91cExlbmd0aDsgKytpKSB7CiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBub2RlQnlLZXlWYWx1ZS5nZXQoa2V5VmFsdWVzW2ldKSA9PT0gbm9kZSkgewogICAgICAgIGV4aXRbaV0gPSBub2RlOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIGRhdHVtKG5vZGUpIHsKICAgIHJldHVybiBub2RlLl9fZGF0YV9fOwogIH0KICBmdW5jdGlvbiBzZWxlY3Rpb25fZGF0YSAodmFsdWUsIGtleSkgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLCBkYXR1bSk7CiAgICB2YXIgYmluZCA9IGtleSA/IGJpbmRLZXkgOiBiaW5kSW5kZXgsCiAgICAgIHBhcmVudHMgPSB0aGlzLl9wYXJlbnRzLAogICAgICBncm91cHMgPSB0aGlzLl9ncm91cHM7CiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB2YWx1ZSA9IGNvbnN0YW50JDEodmFsdWUpOwogICAgZm9yICh2YXIgbSA9IGdyb3Vwcy5sZW5ndGgsIHVwZGF0ZSA9IG5ldyBBcnJheShtKSwgZW50ZXIgPSBuZXcgQXJyYXkobSksIGV4aXQgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgIHZhciBwYXJlbnQgPSBwYXJlbnRzW2pdLAogICAgICAgIGdyb3VwID0gZ3JvdXBzW2pdLAogICAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLAogICAgICAgIGRhdGEgPSBhcnJheWxpa2UodmFsdWUuY2FsbChwYXJlbnQsIHBhcmVudCAmJiBwYXJlbnQuX19kYXRhX18sIGosIHBhcmVudHMpKSwKICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsCiAgICAgICAgZW50ZXJHcm91cCA9IGVudGVyW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLAogICAgICAgIHVwZGF0ZUdyb3VwID0gdXBkYXRlW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLAogICAgICAgIGV4aXRHcm91cCA9IGV4aXRbal0gPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpOwogICAgICBiaW5kKHBhcmVudCwgZ3JvdXAsIGVudGVyR3JvdXAsIHVwZGF0ZUdyb3VwLCBleGl0R3JvdXAsIGRhdGEsIGtleSk7CgogICAgICAvLyBOb3cgY29ubmVjdCB0aGUgZW50ZXIgbm9kZXMgdG8gdGhlaXIgZm9sbG93aW5nIHVwZGF0ZSBub2RlLCBzdWNoIHRoYXQKICAgICAgLy8gYXBwZW5kQ2hpbGQgY2FuIGluc2VydCB0aGUgbWF0ZXJpYWxpemVkIGVudGVyIG5vZGUgYmVmb3JlIHRoaXMgbm9kZSwKICAgICAgLy8gcmF0aGVyIHRoYW4gYXQgdGhlIGVuZCBvZiB0aGUgcGFyZW50IG5vZGUuCiAgICAgIGZvciAodmFyIGkwID0gMCwgaTEgPSAwLCBwcmV2aW91cywgbmV4dDsgaTAgPCBkYXRhTGVuZ3RoOyArK2kwKSB7CiAgICAgICAgaWYgKHByZXZpb3VzID0gZW50ZXJHcm91cFtpMF0pIHsKICAgICAgICAgIGlmIChpMCA+PSBpMSkgaTEgPSBpMCArIDE7CiAgICAgICAgICB3aGlsZSAoIShuZXh0ID0gdXBkYXRlR3JvdXBbaTFdKSAmJiArK2kxIDwgZGF0YUxlbmd0aCk7CiAgICAgICAgICBwcmV2aW91cy5fbmV4dCA9IG5leHQgfHwgbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHVwZGF0ZSA9IG5ldyBTZWxlY3Rpb24kMSh1cGRhdGUsIHBhcmVudHMpOwogICAgdXBkYXRlLl9lbnRlciA9IGVudGVyOwogICAgdXBkYXRlLl9leGl0ID0gZXhpdDsKICAgIHJldHVybiB1cGRhdGU7CiAgfQoKICAvLyBHaXZlbiBzb21lIGRhdGEsIHRoaXMgcmV0dXJucyBhbiBhcnJheS1saWtlIHZpZXcgb2YgaXQ6IGFuIG9iamVjdCB0aGF0CiAgLy8gZXhwb3NlcyBhIGxlbmd0aCBwcm9wZXJ0eSBhbmQgYWxsb3dzIG51bWVyaWMgaW5kZXhpbmcuIE5vdGUgdGhhdCB1bmxpa2UKICAvLyBzZWxlY3RBbGwsIHRoaXMgaXNu4oCZdCB3b3JyaWVkIGFib3V0IOKAnGxpdmXigJ0gY29sbGVjdGlvbnMgYmVjYXVzZSB0aGUgcmVzdWx0aW5nCiAgLy8gYXJyYXkgd2lsbCBvbmx5IGJlIHVzZWQgYnJpZWZseSB3aGlsZSBkYXRhIGlzIGJlaW5nIGJvdW5kLiAoSXQgaXMgcG9zc2libGUgdG8KICAvLyBjYXVzZSB0aGUgZGF0YSB0byBjaGFuZ2Ugd2hpbGUgaXRlcmF0aW5nIGJ5IHVzaW5nIGEga2V5IGZ1bmN0aW9uLCBidXQgcGxlYXNlCiAgLy8gZG9u4oCZdDsgd2XigJlkIHJhdGhlciBhdm9pZCBhIGdyYXR1aXRvdXMgY29weS4pCiAgZnVuY3Rpb24gYXJyYXlsaWtlKGRhdGEpIHsKICAgIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gIm9iamVjdCIgJiYgImxlbmd0aCIgaW4gZGF0YSA/IGRhdGEgLy8gQXJyYXksIFR5cGVkQXJyYXksIE5vZGVMaXN0LCBhcnJheS1saWtlCiAgICA6IEFycmF5LmZyb20oZGF0YSk7IC8vIE1hcCwgU2V0LCBpdGVyYWJsZSwgc3RyaW5nLCBvciBhbnl0aGluZyBlbHNlCiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fZXhpdCAoKSB7CiAgICByZXR1cm4gbmV3IFNlbGVjdGlvbiQxKHRoaXMuX2V4aXQgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UpLCB0aGlzLl9wYXJlbnRzKTsKICB9CgogIGZ1bmN0aW9uIHNlbGVjdGlvbl9qb2luIChvbmVudGVyLCBvbnVwZGF0ZSwgb25leGl0KSB7CiAgICB2YXIgZW50ZXIgPSB0aGlzLmVudGVyKCksCiAgICAgIHVwZGF0ZSA9IHRoaXMsCiAgICAgIGV4aXQgPSB0aGlzLmV4aXQoKTsKICAgIGlmICh0eXBlb2Ygb25lbnRlciA9PT0gImZ1bmN0aW9uIikgewogICAgICBlbnRlciA9IG9uZW50ZXIoZW50ZXIpOwogICAgICBpZiAoZW50ZXIpIGVudGVyID0gZW50ZXIuc2VsZWN0aW9uKCk7CiAgICB9IGVsc2UgewogICAgICBlbnRlciA9IGVudGVyLmFwcGVuZChvbmVudGVyICsgIiIpOwogICAgfQogICAgaWYgKG9udXBkYXRlICE9IG51bGwpIHsKICAgICAgdXBkYXRlID0gb251cGRhdGUodXBkYXRlKTsKICAgICAgaWYgKHVwZGF0ZSkgdXBkYXRlID0gdXBkYXRlLnNlbGVjdGlvbigpOwogICAgfQogICAgaWYgKG9uZXhpdCA9PSBudWxsKSBleGl0LnJlbW92ZSgpO2Vsc2Ugb25leGl0KGV4aXQpOwogICAgcmV0dXJuIGVudGVyICYmIHVwZGF0ZSA/IGVudGVyLm1lcmdlKHVwZGF0ZSkub3JkZXIoKSA6IHVwZGF0ZTsKICB9CgogIGZ1bmN0aW9uIHNlbGVjdGlvbl9tZXJnZSAoY29udGV4dCkgewogICAgdmFyIHNlbGVjdGlvbiA9IGNvbnRleHQuc2VsZWN0aW9uID8gY29udGV4dC5zZWxlY3Rpb24oKSA6IGNvbnRleHQ7CiAgICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gc2VsZWN0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cDBbaV0gfHwgZ3JvdXAxW2ldKSB7CiAgICAgICAgICBtZXJnZVtpXSA9IG5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmb3IgKDsgaiA8IG0wOyArK2opIHsKICAgICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTsKICAgIH0KICAgIHJldHVybiBuZXcgU2VsZWN0aW9uJDEobWVyZ2VzLCB0aGlzLl9wYXJlbnRzKTsKICB9CgogIGZ1bmN0aW9uIHNlbGVjdGlvbl9vcmRlciAoKSB7CiAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAtMSwgbSA9IGdyb3Vwcy5sZW5ndGg7ICsraiA8IG07KSB7CiAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gZ3JvdXAubGVuZ3RoIC0gMSwgbmV4dCA9IGdyb3VwW2ldLCBub2RlOyAtLWkgPj0gMDspIHsKICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICBpZiAobmV4dCAmJiBub2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG5leHQpIF4gNCkgbmV4dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBuZXh0KTsKICAgICAgICAgIG5leHQgPSBub2RlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRoaXM7CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fc29ydCAoY29tcGFyZSkgewogICAgaWYgKCFjb21wYXJlKSBjb21wYXJlID0gYXNjZW5kaW5nOwogICAgZnVuY3Rpb24gY29tcGFyZU5vZGUoYSwgYikgewogICAgICByZXR1cm4gYSAmJiBiID8gY29tcGFyZShhLl9fZGF0YV9fLCBiLl9fZGF0YV9fKSA6ICFhIC0gIWI7CiAgICB9CiAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzb3J0Z3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc29ydGdyb3VwID0gc29ydGdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICBzb3J0Z3JvdXBbaV0gPSBub2RlOwogICAgICAgIH0KICAgICAgfQogICAgICBzb3J0Z3JvdXAuc29ydChjb21wYXJlTm9kZSk7CiAgICB9CiAgICByZXR1cm4gbmV3IFNlbGVjdGlvbiQxKHNvcnRncm91cHMsIHRoaXMuX3BhcmVudHMpLm9yZGVyKCk7CiAgfQogIGZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKSB7CiAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fY2FsbCAoKSB7CiAgICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbMF07CiAgICBhcmd1bWVudHNbMF0gPSB0aGlzOwogICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgIHJldHVybiB0aGlzOwogIH0KCiAgZnVuY3Rpb24gc2VsZWN0aW9uX25vZGVzICgpIHsKICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMpOwogIH0KCiAgZnVuY3Rpb24gc2VsZWN0aW9uX25vZGUgKCkgewogICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHsKICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgdmFyIG5vZGUgPSBncm91cFtpXTsKICAgICAgICBpZiAobm9kZSkgcmV0dXJuIG5vZGU7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgZnVuY3Rpb24gc2VsZWN0aW9uX3NpemUgKCkgewogICAgbGV0IHNpemUgPSAwOwogICAgZm9yIChjb25zdCBub2RlIG9mIHRoaXMpICsrc2l6ZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogICAgcmV0dXJuIHNpemU7CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fZW1wdHkgKCkgewogICAgcmV0dXJuICF0aGlzLm5vZGUoKTsKICB9CgogIGZ1bmN0aW9uIHNlbGVjdGlvbl9lYWNoIChjYWxsYmFjaykgewogICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHsKICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgY2FsbGJhY2suY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0aGlzOwogIH0KCiAgZnVuY3Rpb24gYXR0clJlbW92ZSQxKG5hbWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gYXR0clJlbW92ZU5TJDEoZnVsbG5hbWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGF0dHJDb25zdGFudCQxKG5hbWUsIHZhbHVlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBhdHRyQ29uc3RhbnROUyQxKGZ1bGxuYW1lLCB2YWx1ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHZhbHVlKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGF0dHJGdW5jdGlvbiQxKG5hbWUsIHZhbHVlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO2Vsc2UgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdik7CiAgICB9OwogIH0KICBmdW5jdGlvbiBhdHRyRnVuY3Rpb25OUyQxKGZ1bGxuYW1lLCB2YWx1ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICBpZiAodiA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7ZWxzZSB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgdik7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzZWxlY3Rpb25fYXR0ciAobmFtZSwgdmFsdWUpIHsKICAgIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgICB2YXIgbm9kZSA9IHRoaXMubm9kZSgpOwogICAgICByZXR1cm4gZnVsbG5hbWUubG9jYWwgPyBub2RlLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCkgOiBub2RlLmdldEF0dHJpYnV0ZShmdWxsbmFtZSk7CiAgICB9CiAgICByZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsID8gZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMkMSA6IGF0dHJSZW1vdmUkMSA6IHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIiA/IGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMkMSA6IGF0dHJGdW5jdGlvbiQxIDogZnVsbG5hbWUubG9jYWwgPyBhdHRyQ29uc3RhbnROUyQxIDogYXR0ckNvbnN0YW50JDEpKGZ1bGxuYW1lLCB2YWx1ZSkpOwogIH0KCiAgZnVuY3Rpb24gZGVmYXVsdFZpZXcgKG5vZGUpIHsKICAgIHJldHVybiBub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IC8vIG5vZGUgaXMgYSBOb2RlCiAgICB8fCBub2RlLmRvY3VtZW50ICYmIG5vZGUgLy8gbm9kZSBpcyBhIFdpbmRvdwogICAgfHwgbm9kZS5kZWZhdWx0VmlldzsgLy8gbm9kZSBpcyBhIERvY3VtZW50CiAgfQoKICBmdW5jdGlvbiBzdHlsZVJlbW92ZSQxKG5hbWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzdHlsZUNvbnN0YW50JDEobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlLCBwcmlvcml0eSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzdHlsZUZ1bmN0aW9uJDEobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIGlmICh2ID09IG51bGwpIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7ZWxzZSB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHYsIHByaW9yaXR5KTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9zdHlsZSAobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGwgPyBzdHlsZVJlbW92ZSQxIDogdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gc3R5bGVGdW5jdGlvbiQxIDogc3R5bGVDb25zdGFudCQxKShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkgPT0gbnVsbCA/ICIiIDogcHJpb3JpdHkpKSA6IHN0eWxlVmFsdWUodGhpcy5ub2RlKCksIG5hbWUpOwogIH0KICBmdW5jdGlvbiBzdHlsZVZhbHVlKG5vZGUsIG5hbWUpIHsKICAgIHJldHVybiBub2RlLnN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSkgfHwgZGVmYXVsdFZpZXcobm9kZSkuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpOwogIH0KCiAgZnVuY3Rpb24gcHJvcGVydHlSZW1vdmUobmFtZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgZGVsZXRlIHRoaXNbbmFtZV07CiAgICB9OwogIH0KICBmdW5jdGlvbiBwcm9wZXJ0eUNvbnN0YW50KG5hbWUsIHZhbHVlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB0aGlzW25hbWVdID0gdmFsdWU7CiAgICB9OwogIH0KICBmdW5jdGlvbiBwcm9wZXJ0eUZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIGlmICh2ID09IG51bGwpIGRlbGV0ZSB0aGlzW25hbWVdO2Vsc2UgdGhpc1tuYW1lXSA9IHY7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzZWxlY3Rpb25fcHJvcGVydHkgKG5hbWUsIHZhbHVlKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGwgPyBwcm9wZXJ0eVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIiA/IHByb3BlcnR5RnVuY3Rpb24gOiBwcm9wZXJ0eUNvbnN0YW50KShuYW1lLCB2YWx1ZSkpIDogdGhpcy5ub2RlKClbbmFtZV07CiAgfQoKICBmdW5jdGlvbiBjbGFzc0FycmF5KHN0cmluZykgewogICAgcmV0dXJuIHN0cmluZy50cmltKCkuc3BsaXQoL158XHMrLyk7CiAgfQogIGZ1bmN0aW9uIGNsYXNzTGlzdChub2RlKSB7CiAgICByZXR1cm4gbm9kZS5jbGFzc0xpc3QgfHwgbmV3IENsYXNzTGlzdChub2RlKTsKICB9CiAgZnVuY3Rpb24gQ2xhc3NMaXN0KG5vZGUpIHsKICAgIHRoaXMuX25vZGUgPSBub2RlOwogICAgdGhpcy5fbmFtZXMgPSBjbGFzc0FycmF5KG5vZGUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpIHx8ICIiKTsKICB9CiAgQ2xhc3NMaXN0LnByb3RvdHlwZSA9IHsKICAgIGFkZDogZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgdmFyIGkgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpOwogICAgICBpZiAoaSA8IDApIHsKICAgICAgICB0aGlzLl9uYW1lcy5wdXNoKG5hbWUpOwogICAgICAgIHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsIHRoaXMuX25hbWVzLmpvaW4oIiAiKSk7CiAgICAgIH0KICAgIH0sCiAgICByZW1vdmU6IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTsKICAgICAgaWYgKGkgPj0gMCkgewogICAgICAgIHRoaXMuX25hbWVzLnNwbGljZShpLCAxKTsKICAgICAgICB0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCB0aGlzLl9uYW1lcy5qb2luKCIgIikpOwogICAgICB9CiAgICB9LAogICAgY29udGFpbnM6IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgIHJldHVybiB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpID49IDA7CiAgICB9CiAgfTsKICBmdW5jdGlvbiBjbGFzc2VkQWRkKG5vZGUsIG5hbWVzKSB7CiAgICB2YXIgbGlzdCA9IGNsYXNzTGlzdChub2RlKSwKICAgICAgaSA9IC0xLAogICAgICBuID0gbmFtZXMubGVuZ3RoOwogICAgd2hpbGUgKCsraSA8IG4pIGxpc3QuYWRkKG5hbWVzW2ldKTsKICB9CiAgZnVuY3Rpb24gY2xhc3NlZFJlbW92ZShub2RlLCBuYW1lcykgewogICAgdmFyIGxpc3QgPSBjbGFzc0xpc3Qobm9kZSksCiAgICAgIGkgPSAtMSwKICAgICAgbiA9IG5hbWVzLmxlbmd0aDsKICAgIHdoaWxlICgrK2kgPCBuKSBsaXN0LnJlbW92ZShuYW1lc1tpXSk7CiAgfQogIGZ1bmN0aW9uIGNsYXNzZWRUcnVlKG5hbWVzKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICBjbGFzc2VkQWRkKHRoaXMsIG5hbWVzKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGNsYXNzZWRGYWxzZShuYW1lcykgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgY2xhc3NlZFJlbW92ZSh0aGlzLCBuYW1lcyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBjbGFzc2VkRnVuY3Rpb24obmFtZXMsIHZhbHVlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAodmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKSA/IGNsYXNzZWRBZGQgOiBjbGFzc2VkUmVtb3ZlKSh0aGlzLCBuYW1lcyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzZWxlY3Rpb25fY2xhc3NlZCAobmFtZSwgdmFsdWUpIHsKICAgIHZhciBuYW1lcyA9IGNsYXNzQXJyYXkobmFtZSArICIiKTsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgICB2YXIgbGlzdCA9IGNsYXNzTGlzdCh0aGlzLm5vZGUoKSksCiAgICAgICAgaSA9IC0xLAogICAgICAgIG4gPSBuYW1lcy5sZW5ndGg7CiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWxpc3QuY29udGFpbnMobmFtZXNbaV0pKSByZXR1cm4gZmFsc2U7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gY2xhc3NlZEZ1bmN0aW9uIDogdmFsdWUgPyBjbGFzc2VkVHJ1ZSA6IGNsYXNzZWRGYWxzZSkobmFtZXMsIHZhbHVlKSk7CiAgfQoKICBmdW5jdGlvbiB0ZXh0UmVtb3ZlKCkgewogICAgdGhpcy50ZXh0Q29udGVudCA9ICIiOwogIH0KICBmdW5jdGlvbiB0ZXh0Q29uc3RhbnQkMSh2YWx1ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlOwogICAgfTsKICB9CiAgZnVuY3Rpb24gdGV4dEZ1bmN0aW9uJDEodmFsdWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgdGhpcy50ZXh0Q29udGVudCA9IHYgPT0gbnVsbCA/ICIiIDogdjsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl90ZXh0ICh2YWx1ZSkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbCA/IHRleHRSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gdGV4dEZ1bmN0aW9uJDEgOiB0ZXh0Q29uc3RhbnQkMSkodmFsdWUpKSA6IHRoaXMubm9kZSgpLnRleHRDb250ZW50OwogIH0KCiAgZnVuY3Rpb24gaHRtbFJlbW92ZSgpIHsKICAgIHRoaXMuaW5uZXJIVE1MID0gIiI7CiAgfQogIGZ1bmN0aW9uIGh0bWxDb25zdGFudCh2YWx1ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdGhpcy5pbm5lckhUTUwgPSB2YWx1ZTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGh0bWxGdW5jdGlvbih2YWx1ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICB0aGlzLmlubmVySFRNTCA9IHYgPT0gbnVsbCA/ICIiIDogdjsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9odG1sICh2YWx1ZSkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbCA/IGh0bWxSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gaHRtbEZ1bmN0aW9uIDogaHRtbENvbnN0YW50KSh2YWx1ZSkpIDogdGhpcy5ub2RlKCkuaW5uZXJIVE1MOwogIH0KCiAgZnVuY3Rpb24gcmFpc2UoKSB7CiAgICBpZiAodGhpcy5uZXh0U2libGluZykgdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpOwogIH0KICBmdW5jdGlvbiBzZWxlY3Rpb25fcmFpc2UgKCkgewogICAgcmV0dXJuIHRoaXMuZWFjaChyYWlzZSk7CiAgfQoKICBmdW5jdGlvbiBsb3dlcigpIHsKICAgIGlmICh0aGlzLnByZXZpb3VzU2libGluZykgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLCB0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZCk7CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9sb3dlciAoKSB7CiAgICByZXR1cm4gdGhpcy5lYWNoKGxvd2VyKTsKICB9CgogIGZ1bmN0aW9uIHNlbGVjdGlvbl9hcHBlbmQgKG5hbWUpIHsKICAgIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gImZ1bmN0aW9uIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpOwogICAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBjb25zdGFudE51bGwoKSB7CiAgICByZXR1cm4gbnVsbDsKICB9CiAgZnVuY3Rpb24gc2VsZWN0aW9uX2luc2VydCAobmFtZSwgYmVmb3JlKSB7CiAgICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09ICJmdW5jdGlvbiIgPyBuYW1lIDogY3JlYXRvcihuYW1lKSwKICAgICAgc2VsZWN0ID0gYmVmb3JlID09IG51bGwgPyBjb25zdGFudE51bGwgOiB0eXBlb2YgYmVmb3JlID09PSAiZnVuY3Rpb24iID8gYmVmb3JlIDogc2VsZWN0b3IoYmVmb3JlKTsKICAgIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB0aGlzLmluc2VydEJlZm9yZShjcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgc2VsZWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgbnVsbCk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHJlbW92ZSgpIHsKICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CiAgICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9yZW1vdmUgKCkgewogICAgcmV0dXJuIHRoaXMuZWFjaChyZW1vdmUpOwogIH0KCiAgZnVuY3Rpb24gc2VsZWN0aW9uX2Nsb25lU2hhbGxvdygpIHsKICAgIHZhciBjbG9uZSA9IHRoaXMuY2xvbmVOb2RlKGZhbHNlKSwKICAgICAgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwogICAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRoaXMubmV4dFNpYmxpbmcpIDogY2xvbmU7CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZURlZXAoKSB7CiAgICB2YXIgY2xvbmUgPSB0aGlzLmNsb25lTm9kZSh0cnVlKSwKICAgICAgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwogICAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRoaXMubmV4dFNpYmxpbmcpIDogY2xvbmU7CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZSAoZGVlcCkgewogICAgcmV0dXJuIHRoaXMuc2VsZWN0KGRlZXAgPyBzZWxlY3Rpb25fY2xvbmVEZWVwIDogc2VsZWN0aW9uX2Nsb25lU2hhbGxvdyk7CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25fZGF0dW0gKHZhbHVlKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHRoaXMucHJvcGVydHkoIl9fZGF0YV9fIiwgdmFsdWUpIDogdGhpcy5ub2RlKCkuX19kYXRhX187CiAgfQoKICBmdW5jdGlvbiBjb250ZXh0TGlzdGVuZXIobGlzdGVuZXIpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBldmVudCwgdGhpcy5fX2RhdGFfXyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMpIHsKICAgIHJldHVybiB0eXBlbmFtZXMudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcChmdW5jdGlvbiAodCkgewogICAgICB2YXIgbmFtZSA9ICIiLAogICAgICAgIGkgPSB0LmluZGV4T2YoIi4iKTsKICAgICAgaWYgKGkgPj0gMCkgbmFtZSA9IHQuc2xpY2UoaSArIDEpLCB0ID0gdC5zbGljZSgwLCBpKTsKICAgICAgcmV0dXJuIHsKICAgICAgICB0eXBlOiB0LAogICAgICAgIG5hbWU6IG5hbWUKICAgICAgfTsKICAgIH0pOwogIH0KICBmdW5jdGlvbiBvblJlbW92ZSh0eXBlbmFtZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIG9uID0gdGhpcy5fX29uOwogICAgICBpZiAoIW9uKSByZXR1cm47CiAgICAgIGZvciAodmFyIGogPSAwLCBpID0gLTEsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHsKICAgICAgICBpZiAobyA9IG9uW2pdLCAoIXR5cGVuYW1lLnR5cGUgfHwgby50eXBlID09PSB0eXBlbmFtZS50eXBlKSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHsKICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIsIG8ub3B0aW9ucyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG9uWysraV0gPSBvOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoKytpKSBvbi5sZW5ndGggPSBpO2Vsc2UgZGVsZXRlIHRoaXMuX19vbjsKICAgIH07CiAgfQogIGZ1bmN0aW9uIG9uQWRkKHR5cGVuYW1lLCB2YWx1ZSwgb3B0aW9ucykgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIG9uID0gdGhpcy5fX29uLAogICAgICAgIG8sCiAgICAgICAgbGlzdGVuZXIgPSBjb250ZXh0TGlzdGVuZXIodmFsdWUpOwogICAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoOyBqIDwgbTsgKytqKSB7CiAgICAgICAgaWYgKChvID0gb25bal0pLnR5cGUgPT09IHR5cGVuYW1lLnR5cGUgJiYgby5uYW1lID09PSB0eXBlbmFtZS5uYW1lKSB7CiAgICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLm9wdGlvbnMpOwogICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciA9IGxpc3RlbmVyLCBvLm9wdGlvbnMgPSBvcHRpb25zKTsKICAgICAgICAgIG8udmFsdWUgPSB2YWx1ZTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKHR5cGVuYW1lLnR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTsKICAgICAgbyA9IHsKICAgICAgICB0eXBlOiB0eXBlbmFtZS50eXBlLAogICAgICAgIG5hbWU6IHR5cGVuYW1lLm5hbWUsCiAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgIGxpc3RlbmVyOiBsaXN0ZW5lciwKICAgICAgICBvcHRpb25zOiBvcHRpb25zCiAgICAgIH07CiAgICAgIGlmICghb24pIHRoaXMuX19vbiA9IFtvXTtlbHNlIG9uLnB1c2gobyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzZWxlY3Rpb25fb24gKHR5cGVuYW1lLCB2YWx1ZSwgb3B0aW9ucykgewogICAgdmFyIHR5cGVuYW1lcyA9IHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lICsgIiIpLAogICAgICBpLAogICAgICBuID0gdHlwZW5hbWVzLmxlbmd0aCwKICAgICAgdDsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgICB2YXIgb24gPSB0aGlzLm5vZGUoKS5fX29uOwogICAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoLCBvOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yIChpID0gMCwgbyA9IG9uW2pdOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAoKHQgPSB0eXBlbmFtZXNbaV0pLnR5cGUgPT09IG8udHlwZSAmJiB0Lm5hbWUgPT09IG8ubmFtZSkgewogICAgICAgICAgICByZXR1cm4gby52YWx1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgb24gPSB2YWx1ZSA/IG9uQWRkIDogb25SZW1vdmU7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB0aGlzLmVhY2gob24odHlwZW5hbWVzW2ldLCB2YWx1ZSwgb3B0aW9ucykpOwogICAgcmV0dXJuIHRoaXM7CiAgfQoKICBmdW5jdGlvbiBkaXNwYXRjaEV2ZW50KG5vZGUsIHR5cGUsIHBhcmFtcykgewogICAgdmFyIHdpbmRvdyA9IGRlZmF1bHRWaWV3KG5vZGUpLAogICAgICBldmVudCA9IHdpbmRvdy5DdXN0b21FdmVudDsKICAgIGlmICh0eXBlb2YgZXZlbnQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgZXZlbnQgPSBuZXcgZXZlbnQodHlwZSwgcGFyYW1zKTsKICAgIH0gZWxzZSB7CiAgICAgIGV2ZW50ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpOwogICAgICBpZiAocGFyYW1zKSBldmVudC5pbml0RXZlbnQodHlwZSwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlKSwgZXZlbnQuZGV0YWlsID0gcGFyYW1zLmRldGFpbDtlbHNlIGV2ZW50LmluaXRFdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UpOwogICAgfQogICAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICB9CiAgZnVuY3Rpb24gZGlzcGF0Y2hDb25zdGFudCh0eXBlLCBwYXJhbXMpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBkaXNwYXRjaEZ1bmN0aW9uKHR5cGUsIHBhcmFtcykgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIGRpc3BhdGNoRXZlbnQodGhpcywgdHlwZSwgcGFyYW1zLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gc2VsZWN0aW9uX2Rpc3BhdGNoICh0eXBlLCBwYXJhbXMpIHsKICAgIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiBwYXJhbXMgPT09ICJmdW5jdGlvbiIgPyBkaXNwYXRjaEZ1bmN0aW9uIDogZGlzcGF0Y2hDb25zdGFudCkodHlwZSwgcGFyYW1zKSk7CiAgfQoKICBmdW5jdGlvbiogc2VsZWN0aW9uX2l0ZXJhdG9yICgpIHsKICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7CiAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZTsgaSA8IG47ICsraSkgewogICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHlpZWxkIG5vZGU7CiAgICAgIH0KICAgIH0KICB9CgogIHZhciByb290ID0gW251bGxdOwogIGZ1bmN0aW9uIFNlbGVjdGlvbiQxKGdyb3VwcywgcGFyZW50cykgewogICAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzOwogICAgdGhpcy5fcGFyZW50cyA9IHBhcmVudHM7CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbigpIHsKICAgIHJldHVybiBuZXcgU2VsZWN0aW9uJDEoW1tkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdXSwgcm9vdCk7CiAgfQogIGZ1bmN0aW9uIHNlbGVjdGlvbl9zZWxlY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpczsKICB9CiAgU2VsZWN0aW9uJDEucHJvdG90eXBlID0gc2VsZWN0aW9uLnByb3RvdHlwZSA9IHsKICAgIGNvbnN0cnVjdG9yOiBTZWxlY3Rpb24kMSwKICAgIHNlbGVjdDogc2VsZWN0aW9uX3NlbGVjdCwKICAgIHNlbGVjdEFsbDogc2VsZWN0aW9uX3NlbGVjdEFsbCwKICAgIHNlbGVjdENoaWxkOiBzZWxlY3Rpb25fc2VsZWN0Q2hpbGQsCiAgICBzZWxlY3RDaGlsZHJlbjogc2VsZWN0aW9uX3NlbGVjdENoaWxkcmVuLAogICAgZmlsdGVyOiBzZWxlY3Rpb25fZmlsdGVyLAogICAgZGF0YTogc2VsZWN0aW9uX2RhdGEsCiAgICBlbnRlcjogc2VsZWN0aW9uX2VudGVyLAogICAgZXhpdDogc2VsZWN0aW9uX2V4aXQsCiAgICBqb2luOiBzZWxlY3Rpb25fam9pbiwKICAgIG1lcmdlOiBzZWxlY3Rpb25fbWVyZ2UsCiAgICBzZWxlY3Rpb246IHNlbGVjdGlvbl9zZWxlY3Rpb24sCiAgICBvcmRlcjogc2VsZWN0aW9uX29yZGVyLAogICAgc29ydDogc2VsZWN0aW9uX3NvcnQsCiAgICBjYWxsOiBzZWxlY3Rpb25fY2FsbCwKICAgIG5vZGVzOiBzZWxlY3Rpb25fbm9kZXMsCiAgICBub2RlOiBzZWxlY3Rpb25fbm9kZSwKICAgIHNpemU6IHNlbGVjdGlvbl9zaXplLAogICAgZW1wdHk6IHNlbGVjdGlvbl9lbXB0eSwKICAgIGVhY2g6IHNlbGVjdGlvbl9lYWNoLAogICAgYXR0cjogc2VsZWN0aW9uX2F0dHIsCiAgICBzdHlsZTogc2VsZWN0aW9uX3N0eWxlLAogICAgcHJvcGVydHk6IHNlbGVjdGlvbl9wcm9wZXJ0eSwKICAgIGNsYXNzZWQ6IHNlbGVjdGlvbl9jbGFzc2VkLAogICAgdGV4dDogc2VsZWN0aW9uX3RleHQsCiAgICBodG1sOiBzZWxlY3Rpb25faHRtbCwKICAgIHJhaXNlOiBzZWxlY3Rpb25fcmFpc2UsCiAgICBsb3dlcjogc2VsZWN0aW9uX2xvd2VyLAogICAgYXBwZW5kOiBzZWxlY3Rpb25fYXBwZW5kLAogICAgaW5zZXJ0OiBzZWxlY3Rpb25faW5zZXJ0LAogICAgcmVtb3ZlOiBzZWxlY3Rpb25fcmVtb3ZlLAogICAgY2xvbmU6IHNlbGVjdGlvbl9jbG9uZSwKICAgIGRhdHVtOiBzZWxlY3Rpb25fZGF0dW0sCiAgICBvbjogc2VsZWN0aW9uX29uLAogICAgZGlzcGF0Y2g6IHNlbGVjdGlvbl9kaXNwYXRjaCwKICAgIFtTeW1ib2wuaXRlcmF0b3JdOiBzZWxlY3Rpb25faXRlcmF0b3IKICB9OwoKICBmdW5jdGlvbiBkZWZpbmUgKGNvbnN0cnVjdG9yLCBmYWN0b3J5LCBwcm90b3R5cGUpIHsKICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGZhY3RvcnkucHJvdG90eXBlID0gcHJvdG90eXBlOwogICAgcHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0b3I7CiAgfQogIGZ1bmN0aW9uIGV4dGVuZChwYXJlbnQsIGRlZmluaXRpb24pIHsKICAgIHZhciBwcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudC5wcm90b3R5cGUpOwogICAgZm9yICh2YXIga2V5IGluIGRlZmluaXRpb24pIHByb3RvdHlwZVtrZXldID0gZGVmaW5pdGlvbltrZXldOwogICAgcmV0dXJuIHByb3RvdHlwZTsKICB9CgogIGZ1bmN0aW9uIENvbG9yKCkge30KICB2YXIgZGFya2VyID0gMC43OwogIHZhciBicmlnaHRlciA9IDEgLyBkYXJrZXI7CiAgdmFyIHJlSSA9ICJcXHMqKFsrLV0/XFxkKylcXHMqIiwKICAgIHJlTiA9ICJcXHMqKFsrLV0/KD86XFxkKlxcLik/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIiwKICAgIHJlUCA9ICJcXHMqKFsrLV0/KD86XFxkKlxcLik/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiIsCiAgICByZUhleCA9IC9eIyhbMC05YS1mXXszLDh9KSQvLAogICAgcmVSZ2JJbnRlZ2VyID0gbmV3IFJlZ0V4cChgXnJnYlxcKCR7cmVJfSwke3JlSX0sJHtyZUl9XFwpJGApLAogICAgcmVSZ2JQZXJjZW50ID0gbmV3IFJlZ0V4cChgXnJnYlxcKCR7cmVQfSwke3JlUH0sJHtyZVB9XFwpJGApLAogICAgcmVSZ2JhSW50ZWdlciA9IG5ldyBSZWdFeHAoYF5yZ2JhXFwoJHtyZUl9LCR7cmVJfSwke3JlSX0sJHtyZU59XFwpJGApLAogICAgcmVSZ2JhUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5yZ2JhXFwoJHtyZVB9LCR7cmVQfSwke3JlUH0sJHtyZU59XFwpJGApLAogICAgcmVIc2xQZXJjZW50ID0gbmV3IFJlZ0V4cChgXmhzbFxcKCR7cmVOfSwke3JlUH0sJHtyZVB9XFwpJGApLAogICAgcmVIc2xhUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5oc2xhXFwoJHtyZU59LCR7cmVQfSwke3JlUH0sJHtyZU59XFwpJGApOwogIHZhciBuYW1lZCA9IHsKICAgIGFsaWNlYmx1ZTogMHhmMGY4ZmYsCiAgICBhbnRpcXVld2hpdGU6IDB4ZmFlYmQ3LAogICAgYXF1YTogMHgwMGZmZmYsCiAgICBhcXVhbWFyaW5lOiAweDdmZmZkNCwKICAgIGF6dXJlOiAweGYwZmZmZiwKICAgIGJlaWdlOiAweGY1ZjVkYywKICAgIGJpc3F1ZTogMHhmZmU0YzQsCiAgICBibGFjazogMHgwMDAwMDAsCiAgICBibGFuY2hlZGFsbW9uZDogMHhmZmViY2QsCiAgICBibHVlOiAweDAwMDBmZiwKICAgIGJsdWV2aW9sZXQ6IDB4OGEyYmUyLAogICAgYnJvd246IDB4YTUyYTJhLAogICAgYnVybHl3b29kOiAweGRlYjg4NywKICAgIGNhZGV0Ymx1ZTogMHg1ZjllYTAsCiAgICBjaGFydHJldXNlOiAweDdmZmYwMCwKICAgIGNob2NvbGF0ZTogMHhkMjY5MWUsCiAgICBjb3JhbDogMHhmZjdmNTAsCiAgICBjb3JuZmxvd2VyYmx1ZTogMHg2NDk1ZWQsCiAgICBjb3Juc2lsazogMHhmZmY4ZGMsCiAgICBjcmltc29uOiAweGRjMTQzYywKICAgIGN5YW46IDB4MDBmZmZmLAogICAgZGFya2JsdWU6IDB4MDAwMDhiLAogICAgZGFya2N5YW46IDB4MDA4YjhiLAogICAgZGFya2dvbGRlbnJvZDogMHhiODg2MGIsCiAgICBkYXJrZ3JheTogMHhhOWE5YTksCiAgICBkYXJrZ3JlZW46IDB4MDA2NDAwLAogICAgZGFya2dyZXk6IDB4YTlhOWE5LAogICAgZGFya2toYWtpOiAweGJkYjc2YiwKICAgIGRhcmttYWdlbnRhOiAweDhiMDA4YiwKICAgIGRhcmtvbGl2ZWdyZWVuOiAweDU1NmIyZiwKICAgIGRhcmtvcmFuZ2U6IDB4ZmY4YzAwLAogICAgZGFya29yY2hpZDogMHg5OTMyY2MsCiAgICBkYXJrcmVkOiAweDhiMDAwMCwKICAgIGRhcmtzYWxtb246IDB4ZTk5NjdhLAogICAgZGFya3NlYWdyZWVuOiAweDhmYmM4ZiwKICAgIGRhcmtzbGF0ZWJsdWU6IDB4NDgzZDhiLAogICAgZGFya3NsYXRlZ3JheTogMHgyZjRmNGYsCiAgICBkYXJrc2xhdGVncmV5OiAweDJmNGY0ZiwKICAgIGRhcmt0dXJxdW9pc2U6IDB4MDBjZWQxLAogICAgZGFya3Zpb2xldDogMHg5NDAwZDMsCiAgICBkZWVwcGluazogMHhmZjE0OTMsCiAgICBkZWVwc2t5Ymx1ZTogMHgwMGJmZmYsCiAgICBkaW1ncmF5OiAweDY5Njk2OSwKICAgIGRpbWdyZXk6IDB4Njk2OTY5LAogICAgZG9kZ2VyYmx1ZTogMHgxZTkwZmYsCiAgICBmaXJlYnJpY2s6IDB4YjIyMjIyLAogICAgZmxvcmFsd2hpdGU6IDB4ZmZmYWYwLAogICAgZm9yZXN0Z3JlZW46IDB4MjI4YjIyLAogICAgZnVjaHNpYTogMHhmZjAwZmYsCiAgICBnYWluc2Jvcm86IDB4ZGNkY2RjLAogICAgZ2hvc3R3aGl0ZTogMHhmOGY4ZmYsCiAgICBnb2xkOiAweGZmZDcwMCwKICAgIGdvbGRlbnJvZDogMHhkYWE1MjAsCiAgICBncmF5OiAweDgwODA4MCwKICAgIGdyZWVuOiAweDAwODAwMCwKICAgIGdyZWVueWVsbG93OiAweGFkZmYyZiwKICAgIGdyZXk6IDB4ODA4MDgwLAogICAgaG9uZXlkZXc6IDB4ZjBmZmYwLAogICAgaG90cGluazogMHhmZjY5YjQsCiAgICBpbmRpYW5yZWQ6IDB4Y2Q1YzVjLAogICAgaW5kaWdvOiAweDRiMDA4MiwKICAgIGl2b3J5OiAweGZmZmZmMCwKICAgIGtoYWtpOiAweGYwZTY4YywKICAgIGxhdmVuZGVyOiAweGU2ZTZmYSwKICAgIGxhdmVuZGVyYmx1c2g6IDB4ZmZmMGY1LAogICAgbGF3bmdyZWVuOiAweDdjZmMwMCwKICAgIGxlbW9uY2hpZmZvbjogMHhmZmZhY2QsCiAgICBsaWdodGJsdWU6IDB4YWRkOGU2LAogICAgbGlnaHRjb3JhbDogMHhmMDgwODAsCiAgICBsaWdodGN5YW46IDB4ZTBmZmZmLAogICAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IDB4ZmFmYWQyLAogICAgbGlnaHRncmF5OiAweGQzZDNkMywKICAgIGxpZ2h0Z3JlZW46IDB4OTBlZTkwLAogICAgbGlnaHRncmV5OiAweGQzZDNkMywKICAgIGxpZ2h0cGluazogMHhmZmI2YzEsCiAgICBsaWdodHNhbG1vbjogMHhmZmEwN2EsCiAgICBsaWdodHNlYWdyZWVuOiAweDIwYjJhYSwKICAgIGxpZ2h0c2t5Ymx1ZTogMHg4N2NlZmEsCiAgICBsaWdodHNsYXRlZ3JheTogMHg3Nzg4OTksCiAgICBsaWdodHNsYXRlZ3JleTogMHg3Nzg4OTksCiAgICBsaWdodHN0ZWVsYmx1ZTogMHhiMGM0ZGUsCiAgICBsaWdodHllbGxvdzogMHhmZmZmZTAsCiAgICBsaW1lOiAweDAwZmYwMCwKICAgIGxpbWVncmVlbjogMHgzMmNkMzIsCiAgICBsaW5lbjogMHhmYWYwZTYsCiAgICBtYWdlbnRhOiAweGZmMDBmZiwKICAgIG1hcm9vbjogMHg4MDAwMDAsCiAgICBtZWRpdW1hcXVhbWFyaW5lOiAweDY2Y2RhYSwKICAgIG1lZGl1bWJsdWU6IDB4MDAwMGNkLAogICAgbWVkaXVtb3JjaGlkOiAweGJhNTVkMywKICAgIG1lZGl1bXB1cnBsZTogMHg5MzcwZGIsCiAgICBtZWRpdW1zZWFncmVlbjogMHgzY2IzNzEsCiAgICBtZWRpdW1zbGF0ZWJsdWU6IDB4N2I2OGVlLAogICAgbWVkaXVtc3ByaW5nZ3JlZW46IDB4MDBmYTlhLAogICAgbWVkaXVtdHVycXVvaXNlOiAweDQ4ZDFjYywKICAgIG1lZGl1bXZpb2xldHJlZDogMHhjNzE1ODUsCiAgICBtaWRuaWdodGJsdWU6IDB4MTkxOTcwLAogICAgbWludGNyZWFtOiAweGY1ZmZmYSwKICAgIG1pc3R5cm9zZTogMHhmZmU0ZTEsCiAgICBtb2NjYXNpbjogMHhmZmU0YjUsCiAgICBuYXZham93aGl0ZTogMHhmZmRlYWQsCiAgICBuYXZ5OiAweDAwMDA4MCwKICAgIG9sZGxhY2U6IDB4ZmRmNWU2LAogICAgb2xpdmU6IDB4ODA4MDAwLAogICAgb2xpdmVkcmFiOiAweDZiOGUyMywKICAgIG9yYW5nZTogMHhmZmE1MDAsCiAgICBvcmFuZ2VyZWQ6IDB4ZmY0NTAwLAogICAgb3JjaGlkOiAweGRhNzBkNiwKICAgIHBhbGVnb2xkZW5yb2Q6IDB4ZWVlOGFhLAogICAgcGFsZWdyZWVuOiAweDk4ZmI5OCwKICAgIHBhbGV0dXJxdW9pc2U6IDB4YWZlZWVlLAogICAgcGFsZXZpb2xldHJlZDogMHhkYjcwOTMsCiAgICBwYXBheWF3aGlwOiAweGZmZWZkNSwKICAgIHBlYWNocHVmZjogMHhmZmRhYjksCiAgICBwZXJ1OiAweGNkODUzZiwKICAgIHBpbms6IDB4ZmZjMGNiLAogICAgcGx1bTogMHhkZGEwZGQsCiAgICBwb3dkZXJibHVlOiAweGIwZTBlNiwKICAgIHB1cnBsZTogMHg4MDAwODAsCiAgICByZWJlY2NhcHVycGxlOiAweDY2MzM5OSwKICAgIHJlZDogMHhmZjAwMDAsCiAgICByb3N5YnJvd246IDB4YmM4ZjhmLAogICAgcm95YWxibHVlOiAweDQxNjllMSwKICAgIHNhZGRsZWJyb3duOiAweDhiNDUxMywKICAgIHNhbG1vbjogMHhmYTgwNzIsCiAgICBzYW5keWJyb3duOiAweGY0YTQ2MCwKICAgIHNlYWdyZWVuOiAweDJlOGI1NywKICAgIHNlYXNoZWxsOiAweGZmZjVlZSwKICAgIHNpZW5uYTogMHhhMDUyMmQsCiAgICBzaWx2ZXI6IDB4YzBjMGMwLAogICAgc2t5Ymx1ZTogMHg4N2NlZWIsCiAgICBzbGF0ZWJsdWU6IDB4NmE1YWNkLAogICAgc2xhdGVncmF5OiAweDcwODA5MCwKICAgIHNsYXRlZ3JleTogMHg3MDgwOTAsCiAgICBzbm93OiAweGZmZmFmYSwKICAgIHNwcmluZ2dyZWVuOiAweDAwZmY3ZiwKICAgIHN0ZWVsYmx1ZTogMHg0NjgyYjQsCiAgICB0YW46IDB4ZDJiNDhjLAogICAgdGVhbDogMHgwMDgwODAsCiAgICB0aGlzdGxlOiAweGQ4YmZkOCwKICAgIHRvbWF0bzogMHhmZjYzNDcsCiAgICB0dXJxdW9pc2U6IDB4NDBlMGQwLAogICAgdmlvbGV0OiAweGVlODJlZSwKICAgIHdoZWF0OiAweGY1ZGViMywKICAgIHdoaXRlOiAweGZmZmZmZiwKICAgIHdoaXRlc21va2U6IDB4ZjVmNWY1LAogICAgeWVsbG93OiAweGZmZmYwMCwKICAgIHllbGxvd2dyZWVuOiAweDlhY2QzMgogIH07CiAgZGVmaW5lKENvbG9yLCBjb2xvciwgewogICAgY29weShjaGFubmVscykgewogICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLCB0aGlzLCBjaGFubmVscyk7CiAgICB9LAogICAgZGlzcGxheWFibGUoKSB7CiAgICAgIHJldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCk7CiAgICB9LAogICAgaGV4OiBjb2xvcl9mb3JtYXRIZXgsCiAgICAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LgogICAgZm9ybWF0SGV4OiBjb2xvcl9mb3JtYXRIZXgsCiAgICBmb3JtYXRIZXg4OiBjb2xvcl9mb3JtYXRIZXg4LAogICAgZm9ybWF0SHNsOiBjb2xvcl9mb3JtYXRIc2wsCiAgICBmb3JtYXRSZ2I6IGNvbG9yX2Zvcm1hdFJnYiwKICAgIHRvU3RyaW5nOiBjb2xvcl9mb3JtYXRSZ2IKICB9KTsKICBmdW5jdGlvbiBjb2xvcl9mb3JtYXRIZXgoKSB7CiAgICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXgoKTsKICB9CiAgZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4OCgpIHsKICAgIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleDgoKTsKICB9CiAgZnVuY3Rpb24gY29sb3JfZm9ybWF0SHNsKCkgewogICAgcmV0dXJuIGhzbENvbnZlcnQodGhpcykuZm9ybWF0SHNsKCk7CiAgfQogIGZ1bmN0aW9uIGNvbG9yX2Zvcm1hdFJnYigpIHsKICAgIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdFJnYigpOwogIH0KICBmdW5jdGlvbiBjb2xvcihmb3JtYXQpIHsKICAgIHZhciBtLCBsOwogICAgZm9ybWF0ID0gKGZvcm1hdCArICIiKS50cmltKCkudG9Mb3dlckNhc2UoKTsKICAgIHJldHVybiAobSA9IHJlSGV4LmV4ZWMoZm9ybWF0KSkgPyAobCA9IG1bMV0ubGVuZ3RoLCBtID0gcGFyc2VJbnQobVsxXSwgMTYpLCBsID09PSA2ID8gcmdibihtKSAvLyAjZmYwMDAwCiAgICA6IGwgPT09IDMgPyBuZXcgUmdiKG0gPj4gOCAmIDB4ZiB8IG0gPj4gNCAmIDB4ZjAsIG0gPj4gNCAmIDB4ZiB8IG0gJiAweGYwLCAobSAmIDB4ZikgPDwgNCB8IG0gJiAweGYsIDEpIC8vICNmMDAKICAgIDogbCA9PT0gOCA/IHJnYmEobSA+PiAyNCAmIDB4ZmYsIG0gPj4gMTYgJiAweGZmLCBtID4+IDggJiAweGZmLCAobSAmIDB4ZmYpIC8gMHhmZikgLy8gI2ZmMDAwMDAwCiAgICA6IGwgPT09IDQgPyByZ2JhKG0gPj4gMTIgJiAweGYgfCBtID4+IDggJiAweGYwLCBtID4+IDggJiAweGYgfCBtID4+IDQgJiAweGYwLCBtID4+IDQgJiAweGYgfCBtICYgMHhmMCwgKChtICYgMHhmKSA8PCA0IHwgbSAmIDB4ZikgLyAweGZmKSAvLyAjZjAwMAogICAgOiBudWxsIC8vIGludmFsaWQgaGV4CiAgICApIDogKG0gPSByZVJnYkludGVnZXIuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSwgbVsyXSwgbVszXSwgMSkgLy8gcmdiKDI1NSwgMCwgMCkKICAgIDogKG0gPSByZVJnYlBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgMSkgLy8gcmdiKDEwMCUsIDAlLCAwJSkKICAgIDogKG0gPSByZVJnYmFJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkgPyByZ2JhKG1bMV0sIG1bMl0sIG1bM10sIG1bNF0pIC8vIHJnYmEoMjU1LCAwLCAwLCAxKQogICAgOiAobSA9IHJlUmdiYVBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IHJnYmEobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgbVs0XSkgLy8gcmdiKDEwMCUsIDAlLCAwJSwgMSkKICAgIDogKG0gPSByZUhzbFBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IGhzbGEobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgMSkgLy8gaHNsKDEyMCwgNTAlLCA1MCUpCiAgICA6IChtID0gcmVIc2xhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCBtWzRdKSAvLyBoc2xhKDEyMCwgNTAlLCA1MCUsIDEpCiAgICA6IG5hbWVkLmhhc093blByb3BlcnR5KGZvcm1hdCkgPyByZ2JuKG5hbWVkW2Zvcm1hdF0pIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zCiAgICA6IGZvcm1hdCA9PT0gInRyYW5zcGFyZW50IiA/IG5ldyBSZ2IoTmFOLCBOYU4sIE5hTiwgMCkgOiBudWxsOwogIH0KICBmdW5jdGlvbiByZ2JuKG4pIHsKICAgIHJldHVybiBuZXcgUmdiKG4gPj4gMTYgJiAweGZmLCBuID4+IDggJiAweGZmLCBuICYgMHhmZiwgMSk7CiAgfQogIGZ1bmN0aW9uIHJnYmEociwgZywgYiwgYSkgewogICAgaWYgKGEgPD0gMCkgciA9IGcgPSBiID0gTmFOOwogICAgcmV0dXJuIG5ldyBSZ2IociwgZywgYiwgYSk7CiAgfQogIGZ1bmN0aW9uIHJnYkNvbnZlcnQobykgewogICAgaWYgKCEobyBpbnN0YW5jZW9mIENvbG9yKSkgbyA9IGNvbG9yKG8pOwogICAgaWYgKCFvKSByZXR1cm4gbmV3IFJnYigpOwogICAgbyA9IG8ucmdiKCk7CiAgICByZXR1cm4gbmV3IFJnYihvLnIsIG8uZywgby5iLCBvLm9wYWNpdHkpOwogIH0KICBmdW5jdGlvbiByZ2IociwgZywgYiwgb3BhY2l0eSkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyByZ2JDb252ZXJ0KHIpIDogbmV3IFJnYihyLCBnLCBiLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7CiAgfQogIGZ1bmN0aW9uIFJnYihyLCBnLCBiLCBvcGFjaXR5KSB7CiAgICB0aGlzLnIgPSArcjsKICAgIHRoaXMuZyA9ICtnOwogICAgdGhpcy5iID0gK2I7CiAgICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTsKICB9CiAgZGVmaW5lKFJnYiwgcmdiLCBleHRlbmQoQ29sb3IsIHsKICAgIGJyaWdodGVyKGspIHsKICAgICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspOwogICAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpOwogICAgfSwKICAgIGRhcmtlcihrKSB7CiAgICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspOwogICAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpOwogICAgfSwKICAgIHJnYigpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAogICAgY2xhbXAoKSB7CiAgICAgIHJldHVybiBuZXcgUmdiKGNsYW1waSh0aGlzLnIpLCBjbGFtcGkodGhpcy5nKSwgY2xhbXBpKHRoaXMuYiksIGNsYW1wYSh0aGlzLm9wYWNpdHkpKTsKICAgIH0sCiAgICBkaXNwbGF5YWJsZSgpIHsKICAgICAgcmV0dXJuIC0wLjUgPD0gdGhpcy5yICYmIHRoaXMuciA8IDI1NS41ICYmIC0wLjUgPD0gdGhpcy5nICYmIHRoaXMuZyA8IDI1NS41ICYmIC0wLjUgPD0gdGhpcy5iICYmIHRoaXMuYiA8IDI1NS41ICYmIDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxOwogICAgfSwKICAgIGhleDogcmdiX2Zvcm1hdEhleCwKICAgIC8vIERlcHJlY2F0ZWQhIFVzZSBjb2xvci5mb3JtYXRIZXguCiAgICBmb3JtYXRIZXg6IHJnYl9mb3JtYXRIZXgsCiAgICBmb3JtYXRIZXg4OiByZ2JfZm9ybWF0SGV4OCwKICAgIGZvcm1hdFJnYjogcmdiX2Zvcm1hdFJnYiwKICAgIHRvU3RyaW5nOiByZ2JfZm9ybWF0UmdiCiAgfSkpOwogIGZ1bmN0aW9uIHJnYl9mb3JtYXRIZXgoKSB7CiAgICByZXR1cm4gYCMke2hleCh0aGlzLnIpfSR7aGV4KHRoaXMuZyl9JHtoZXgodGhpcy5iKX1gOwogIH0KICBmdW5jdGlvbiByZ2JfZm9ybWF0SGV4OCgpIHsKICAgIHJldHVybiBgIyR7aGV4KHRoaXMucil9JHtoZXgodGhpcy5nKX0ke2hleCh0aGlzLmIpfSR7aGV4KChpc05hTih0aGlzLm9wYWNpdHkpID8gMSA6IHRoaXMub3BhY2l0eSkgKiAyNTUpfWA7CiAgfQogIGZ1bmN0aW9uIHJnYl9mb3JtYXRSZ2IoKSB7CiAgICBjb25zdCBhID0gY2xhbXBhKHRoaXMub3BhY2l0eSk7CiAgICByZXR1cm4gYCR7YSA9PT0gMSA/ICJyZ2IoIiA6ICJyZ2JhKCJ9JHtjbGFtcGkodGhpcy5yKX0sICR7Y2xhbXBpKHRoaXMuZyl9LCAke2NsYW1waSh0aGlzLmIpfSR7YSA9PT0gMSA/ICIpIiA6IGAsICR7YX0pYH1gOwogIH0KICBmdW5jdGlvbiBjbGFtcGEob3BhY2l0eSkgewogICAgcmV0dXJuIGlzTmFOKG9wYWNpdHkpID8gMSA6IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIG9wYWNpdHkpKTsKICB9CiAgZnVuY3Rpb24gY2xhbXBpKHZhbHVlKSB7CiAgICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHZhbHVlKSB8fCAwKSk7CiAgfQogIGZ1bmN0aW9uIGhleCh2YWx1ZSkgewogICAgdmFsdWUgPSBjbGFtcGkodmFsdWUpOwogICAgcmV0dXJuICh2YWx1ZSA8IDE2ID8gIjAiIDogIiIpICsgdmFsdWUudG9TdHJpbmcoMTYpOwogIH0KICBmdW5jdGlvbiBoc2xhKGgsIHMsIGwsIGEpIHsKICAgIGlmIChhIDw9IDApIGggPSBzID0gbCA9IE5hTjtlbHNlIGlmIChsIDw9IDAgfHwgbCA+PSAxKSBoID0gcyA9IE5hTjtlbHNlIGlmIChzIDw9IDApIGggPSBOYU47CiAgICByZXR1cm4gbmV3IEhzbChoLCBzLCBsLCBhKTsKICB9CiAgZnVuY3Rpb24gaHNsQ29udmVydChvKSB7CiAgICBpZiAobyBpbnN0YW5jZW9mIEhzbCkgcmV0dXJuIG5ldyBIc2woby5oLCBvLnMsIG8ubCwgby5vcGFjaXR5KTsKICAgIGlmICghKG8gaW5zdGFuY2VvZiBDb2xvcikpIG8gPSBjb2xvcihvKTsKICAgIGlmICghbykgcmV0dXJuIG5ldyBIc2woKTsKICAgIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbzsKICAgIG8gPSBvLnJnYigpOwogICAgdmFyIHIgPSBvLnIgLyAyNTUsCiAgICAgIGcgPSBvLmcgLyAyNTUsCiAgICAgIGIgPSBvLmIgLyAyNTUsCiAgICAgIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpLAogICAgICBtYXggPSBNYXRoLm1heChyLCBnLCBiKSwKICAgICAgaCA9IE5hTiwKICAgICAgcyA9IG1heCAtIG1pbiwKICAgICAgbCA9IChtYXggKyBtaW4pIC8gMjsKICAgIGlmIChzKSB7CiAgICAgIGlmIChyID09PSBtYXgpIGggPSAoZyAtIGIpIC8gcyArIChnIDwgYikgKiA2O2Vsc2UgaWYgKGcgPT09IG1heCkgaCA9IChiIC0gcikgLyBzICsgMjtlbHNlIGggPSAociAtIGcpIC8gcyArIDQ7CiAgICAgIHMgLz0gbCA8IDAuNSA/IG1heCArIG1pbiA6IDIgLSBtYXggLSBtaW47CiAgICAgIGggKj0gNjA7CiAgICB9IGVsc2UgewogICAgICBzID0gbCA+IDAgJiYgbCA8IDEgPyAwIDogaDsKICAgIH0KICAgIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIG8ub3BhY2l0eSk7CiAgfQogIGZ1bmN0aW9uIGhzbChoLCBzLCBsLCBvcGFjaXR5KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhzbENvbnZlcnQoaCkgOiBuZXcgSHNsKGgsIHMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsKICB9CiAgZnVuY3Rpb24gSHNsKGgsIHMsIGwsIG9wYWNpdHkpIHsKICAgIHRoaXMuaCA9ICtoOwogICAgdGhpcy5zID0gK3M7CiAgICB0aGlzLmwgPSArbDsKICAgIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5OwogIH0KICBkZWZpbmUoSHNsLCBoc2wsIGV4dGVuZChDb2xvciwgewogICAgYnJpZ2h0ZXIoaykgewogICAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7CiAgICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpOwogICAgfSwKICAgIGRhcmtlcihrKSB7CiAgICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspOwogICAgICByZXR1cm4gbmV3IEhzbCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTsKICAgIH0sCiAgICByZ2IoKSB7CiAgICAgIHZhciBoID0gdGhpcy5oICUgMzYwICsgKHRoaXMuaCA8IDApICogMzYwLAogICAgICAgIHMgPSBpc05hTihoKSB8fCBpc05hTih0aGlzLnMpID8gMCA6IHRoaXMucywKICAgICAgICBsID0gdGhpcy5sLAogICAgICAgIG0yID0gbCArIChsIDwgMC41ID8gbCA6IDEgLSBsKSAqIHMsCiAgICAgICAgbTEgPSAyICogbCAtIG0yOwogICAgICByZXR1cm4gbmV3IFJnYihoc2wycmdiKGggPj0gMjQwID8gaCAtIDI0MCA6IGggKyAxMjAsIG0xLCBtMiksIGhzbDJyZ2IoaCwgbTEsIG0yKSwgaHNsMnJnYihoIDwgMTIwID8gaCArIDI0MCA6IGggLSAxMjAsIG0xLCBtMiksIHRoaXMub3BhY2l0eSk7CiAgICB9LAogICAgY2xhbXAoKSB7CiAgICAgIHJldHVybiBuZXcgSHNsKGNsYW1waCh0aGlzLmgpLCBjbGFtcHQodGhpcy5zKSwgY2xhbXB0KHRoaXMubCksIGNsYW1wYSh0aGlzLm9wYWNpdHkpKTsKICAgIH0sCiAgICBkaXNwbGF5YWJsZSgpIHsKICAgICAgcmV0dXJuICgwIDw9IHRoaXMucyAmJiB0aGlzLnMgPD0gMSB8fCBpc05hTih0aGlzLnMpKSAmJiAwIDw9IHRoaXMubCAmJiB0aGlzLmwgPD0gMSAmJiAwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMTsKICAgIH0sCiAgICBmb3JtYXRIc2woKSB7CiAgICAgIGNvbnN0IGEgPSBjbGFtcGEodGhpcy5vcGFjaXR5KTsKICAgICAgcmV0dXJuIGAke2EgPT09IDEgPyAiaHNsKCIgOiAiaHNsYSgifSR7Y2xhbXBoKHRoaXMuaCl9LCAke2NsYW1wdCh0aGlzLnMpICogMTAwfSUsICR7Y2xhbXB0KHRoaXMubCkgKiAxMDB9JSR7YSA9PT0gMSA/ICIpIiA6IGAsICR7YX0pYH1gOwogICAgfQogIH0pKTsKICBmdW5jdGlvbiBjbGFtcGgodmFsdWUpIHsKICAgIHZhbHVlID0gKHZhbHVlIHx8IDApICUgMzYwOwogICAgcmV0dXJuIHZhbHVlIDwgMCA/IHZhbHVlICsgMzYwIDogdmFsdWU7CiAgfQogIGZ1bmN0aW9uIGNsYW1wdCh2YWx1ZSkgewogICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHZhbHVlIHx8IDApKTsKICB9CgogIC8qIEZyb20gRnZEIDEzLjM3LCBDU1MgQ29sb3IgTW9kdWxlIExldmVsIDMgKi8KICBmdW5jdGlvbiBoc2wycmdiKGgsIG0xLCBtMikgewogICAgcmV0dXJuIChoIDwgNjAgPyBtMSArIChtMiAtIG0xKSAqIGggLyA2MCA6IGggPCAxODAgPyBtMiA6IGggPCAyNDAgPyBtMSArIChtMiAtIG0xKSAqICgyNDAgLSBoKSAvIDYwIDogbTEpICogMjU1OwogIH0KCiAgdmFyIGNvbnN0YW50ID0geCA9PiAoKSA9PiB4OwoKICBmdW5jdGlvbiBsaW5lYXIoYSwgZCkgewogICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgIHJldHVybiBhICsgdCAqIGQ7CiAgICB9OwogIH0KICBmdW5jdGlvbiBleHBvbmVudGlhbChhLCBiLCB5KSB7CiAgICByZXR1cm4gYSA9IE1hdGgucG93KGEsIHkpLCBiID0gTWF0aC5wb3coYiwgeSkgLSBhLCB5ID0gMSAvIHksIGZ1bmN0aW9uICh0KSB7CiAgICAgIHJldHVybiBNYXRoLnBvdyhhICsgdCAqIGIsIHkpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gZ2FtbWEoeSkgewogICAgcmV0dXJuICh5ID0gK3kpID09PSAxID8gbm9nYW1tYSA6IGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgIHJldHVybiBiIC0gYSA/IGV4cG9uZW50aWFsKGEsIGIsIHkpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBub2dhbW1hKGEsIGIpIHsKICAgIHZhciBkID0gYiAtIGE7CiAgICByZXR1cm4gZCA/IGxpbmVhcihhLCBkKSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpOwogIH0KCiAgdmFyIGludGVycG9sYXRlUmdiID0gKGZ1bmN0aW9uIHJnYkdhbW1hKHkpIHsKICAgIHZhciBjb2xvciA9IGdhbW1hKHkpOwogICAgZnVuY3Rpb24gcmdiJDEoc3RhcnQsIGVuZCkgewogICAgICB2YXIgciA9IGNvbG9yKChzdGFydCA9IHJnYihzdGFydCkpLnIsIChlbmQgPSByZ2IoZW5kKSkuciksCiAgICAgICAgZyA9IGNvbG9yKHN0YXJ0LmcsIGVuZC5nKSwKICAgICAgICBiID0gY29sb3Ioc3RhcnQuYiwgZW5kLmIpLAogICAgICAgIG9wYWNpdHkgPSBub2dhbW1hKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgc3RhcnQuciA9IHIodCk7CiAgICAgICAgc3RhcnQuZyA9IGcodCk7CiAgICAgICAgc3RhcnQuYiA9IGIodCk7CiAgICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7CiAgICAgICAgcmV0dXJuIHN0YXJ0ICsgIiI7CiAgICAgIH07CiAgICB9CiAgICByZ2IkMS5nYW1tYSA9IHJnYkdhbW1hOwogICAgcmV0dXJuIHJnYiQxOwogIH0pKDEpOwoKICBmdW5jdGlvbiBpbnRlcnBvbGF0ZU51bWJlciAoYSwgYikgewogICAgcmV0dXJuIGEgPSArYSwgYiA9ICtiLCBmdW5jdGlvbiAodCkgewogICAgICByZXR1cm4gYSAqICgxIC0gdCkgKyBiICogdDsKICAgIH07CiAgfQoKICB2YXIgcmVBID0gL1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLAogICAgcmVCID0gbmV3IFJlZ0V4cChyZUEuc291cmNlLCAiZyIpOwogIGZ1bmN0aW9uIHplcm8oYikgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIGI7CiAgICB9OwogIH0KICBmdW5jdGlvbiBvbmUoYikgewogICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgIHJldHVybiBiKHQpICsgIiI7CiAgICB9OwogIH0KICBmdW5jdGlvbiBpbnRlcnBvbGF0ZVN0cmluZyAoYSwgYikgewogICAgdmFyIGJpID0gcmVBLmxhc3RJbmRleCA9IHJlQi5sYXN0SW5kZXggPSAwLAogICAgICAvLyBzY2FuIGluZGV4IGZvciBuZXh0IG51bWJlciBpbiBiCiAgICAgIGFtLAogICAgICAvLyBjdXJyZW50IG1hdGNoIGluIGEKICAgICAgYm0sCiAgICAgIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYgogICAgICBicywKICAgICAgLy8gc3RyaW5nIHByZWNlZGluZyBjdXJyZW50IG51bWJlciBpbiBiLCBpZiBhbnkKICAgICAgaSA9IC0xLAogICAgICAvLyBpbmRleCBpbiBzCiAgICAgIHMgPSBbXSwKICAgICAgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzCiAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnMKCiAgICAvLyBDb2VyY2UgaW5wdXRzIHRvIHN0cmluZ3MuCiAgICBhID0gYSArICIiLCBiID0gYiArICIiOwoKICAgIC8vIEludGVycG9sYXRlIHBhaXJzIG9mIG51bWJlcnMgaW4gYSAmIGIuCiAgICB3aGlsZSAoKGFtID0gcmVBLmV4ZWMoYSkpICYmIChibSA9IHJlQi5leGVjKGIpKSkgewogICAgICBpZiAoKGJzID0gYm0uaW5kZXgpID4gYmkpIHsKICAgICAgICAvLyBhIHN0cmluZyBwcmVjZWRlcyB0aGUgbmV4dCBudW1iZXIgaW4gYgogICAgICAgIGJzID0gYi5zbGljZShiaSwgYnMpOwogICAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJzOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZwogICAgICAgIGVsc2Ugc1srK2ldID0gYnM7CiAgICAgIH0KICAgICAgaWYgKChhbSA9IGFtWzBdKSA9PT0gKGJtID0gYm1bMF0pKSB7CiAgICAgICAgLy8gbnVtYmVycyBpbiBhICYgYiBtYXRjaAogICAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJtOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZwogICAgICAgIGVsc2Ugc1srK2ldID0gYm07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gaW50ZXJwb2xhdGUgbm9uLW1hdGNoaW5nIG51bWJlcnMKICAgICAgICBzWysraV0gPSBudWxsOwogICAgICAgIHEucHVzaCh7CiAgICAgICAgICBpOiBpLAogICAgICAgICAgeDogaW50ZXJwb2xhdGVOdW1iZXIoYW0sIGJtKQogICAgICAgIH0pOwogICAgICB9CiAgICAgIGJpID0gcmVCLmxhc3RJbmRleDsKICAgIH0KCiAgICAvLyBBZGQgcmVtYWlucyBvZiBiLgogICAgaWYgKGJpIDwgYi5sZW5ndGgpIHsKICAgICAgYnMgPSBiLnNsaWNlKGJpKTsKICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nCiAgICAgIGVsc2Ugc1srK2ldID0gYnM7CiAgICB9CgogICAgLy8gU3BlY2lhbCBvcHRpbWl6YXRpb24gZm9yIG9ubHkgYSBzaW5nbGUgbWF0Y2guCiAgICAvLyBPdGhlcndpc2UsIGludGVycG9sYXRlIGVhY2ggb2YgdGhlIG51bWJlcnMgYW5kIHJlam9pbiB0aGUgc3RyaW5nLgogICAgcmV0dXJuIHMubGVuZ3RoIDwgMiA/IHFbMF0gPyBvbmUocVswXS54KSA6IHplcm8oYikgOiAoYiA9IHEubGVuZ3RoLCBmdW5jdGlvbiAodCkgewogICAgICBmb3IgKHZhciBpID0gMCwgbzsgaSA8IGI7ICsraSkgc1sobyA9IHFbaV0pLmldID0gby54KHQpOwogICAgICByZXR1cm4gcy5qb2luKCIiKTsKICAgIH0pOwogIH0KCiAgdmFyIGRlZ3JlZXMgPSAxODAgLyBNYXRoLlBJOwogIHZhciBpZGVudGl0eSA9IHsKICAgIHRyYW5zbGF0ZVg6IDAsCiAgICB0cmFuc2xhdGVZOiAwLAogICAgcm90YXRlOiAwLAogICAgc2tld1g6IDAsCiAgICBzY2FsZVg6IDEsCiAgICBzY2FsZVk6IDEKICB9OwogIGZ1bmN0aW9uIGRlY29tcG9zZSAoYSwgYiwgYywgZCwgZSwgZikgewogICAgdmFyIHNjYWxlWCwgc2NhbGVZLCBza2V3WDsKICAgIGlmIChzY2FsZVggPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYikpIGEgLz0gc2NhbGVYLCBiIC89IHNjYWxlWDsKICAgIGlmIChza2V3WCA9IGEgKiBjICsgYiAqIGQpIGMgLT0gYSAqIHNrZXdYLCBkIC09IGIgKiBza2V3WDsKICAgIGlmIChzY2FsZVkgPSBNYXRoLnNxcnQoYyAqIGMgKyBkICogZCkpIGMgLz0gc2NhbGVZLCBkIC89IHNjYWxlWSwgc2tld1ggLz0gc2NhbGVZOwogICAgaWYgKGEgKiBkIDwgYiAqIGMpIGEgPSAtYSwgYiA9IC1iLCBza2V3WCA9IC1za2V3WCwgc2NhbGVYID0gLXNjYWxlWDsKICAgIHJldHVybiB7CiAgICAgIHRyYW5zbGF0ZVg6IGUsCiAgICAgIHRyYW5zbGF0ZVk6IGYsCiAgICAgIHJvdGF0ZTogTWF0aC5hdGFuMihiLCBhKSAqIGRlZ3JlZXMsCiAgICAgIHNrZXdYOiBNYXRoLmF0YW4oc2tld1gpICogZGVncmVlcywKICAgICAgc2NhbGVYOiBzY2FsZVgsCiAgICAgIHNjYWxlWTogc2NhbGVZCiAgICB9OwogIH0KCiAgdmFyIHN2Z05vZGU7CgogIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovCiAgZnVuY3Rpb24gcGFyc2VDc3ModmFsdWUpIHsKICAgIGNvbnN0IG0gPSBuZXcgKHR5cGVvZiBET01NYXRyaXggPT09ICJmdW5jdGlvbiIgPyBET01NYXRyaXggOiBXZWJLaXRDU1NNYXRyaXgpKHZhbHVlICsgIiIpOwogICAgcmV0dXJuIG0uaXNJZGVudGl0eSA/IGlkZW50aXR5IDogZGVjb21wb3NlKG0uYSwgbS5iLCBtLmMsIG0uZCwgbS5lLCBtLmYpOwogIH0KICBmdW5jdGlvbiBwYXJzZVN2Zyh2YWx1ZSkgewogICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBpZGVudGl0eTsKICAgIGlmICghc3ZnTm9kZSkgc3ZnTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCAiZyIpOwogICAgc3ZnTm9kZS5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsIHZhbHVlKTsKICAgIGlmICghKHZhbHVlID0gc3ZnTm9kZS50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKSkgcmV0dXJuIGlkZW50aXR5OwogICAgdmFsdWUgPSB2YWx1ZS5tYXRyaXg7CiAgICByZXR1cm4gZGVjb21wb3NlKHZhbHVlLmEsIHZhbHVlLmIsIHZhbHVlLmMsIHZhbHVlLmQsIHZhbHVlLmUsIHZhbHVlLmYpOwogIH0KCiAgZnVuY3Rpb24gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2UsIHB4Q29tbWEsIHB4UGFyZW4sIGRlZ1BhcmVuKSB7CiAgICBmdW5jdGlvbiBwb3AocykgewogICAgICByZXR1cm4gcy5sZW5ndGggPyBzLnBvcCgpICsgIiAiIDogIiI7CiAgICB9CiAgICBmdW5jdGlvbiB0cmFuc2xhdGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHsKICAgICAgaWYgKHhhICE9PSB4YiB8fCB5YSAhPT0geWIpIHsKICAgICAgICB2YXIgaSA9IHMucHVzaCgidHJhbnNsYXRlKCIsIG51bGwsIHB4Q29tbWEsIG51bGwsIHB4UGFyZW4pOwogICAgICAgIHEucHVzaCh7CiAgICAgICAgICBpOiBpIC0gNCwKICAgICAgICAgIHg6IGludGVycG9sYXRlTnVtYmVyKHhhLCB4YikKICAgICAgICB9LCB7CiAgICAgICAgICBpOiBpIC0gMiwKICAgICAgICAgIHg6IGludGVycG9sYXRlTnVtYmVyKHlhLCB5YikKICAgICAgICB9KTsKICAgICAgfSBlbHNlIGlmICh4YiB8fCB5YikgewogICAgICAgIHMucHVzaCgidHJhbnNsYXRlKCIgKyB4YiArIHB4Q29tbWEgKyB5YiArIHB4UGFyZW4pOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiByb3RhdGUoYSwgYiwgcywgcSkgewogICAgICBpZiAoYSAhPT0gYikgewogICAgICAgIGlmIChhIC0gYiA+IDE4MCkgYiArPSAzNjA7ZWxzZSBpZiAoYiAtIGEgPiAxODApIGEgKz0gMzYwOyAvLyBzaG9ydGVzdCBwYXRoCiAgICAgICAgcS5wdXNoKHsKICAgICAgICAgIGk6IHMucHVzaChwb3AocykgKyAicm90YXRlKCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsCiAgICAgICAgICB4OiBpbnRlcnBvbGF0ZU51bWJlcihhLCBiKQogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKGIpIHsKICAgICAgICBzLnB1c2gocG9wKHMpICsgInJvdGF0ZSgiICsgYiArIGRlZ1BhcmVuKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gc2tld1goYSwgYiwgcywgcSkgewogICAgICBpZiAoYSAhPT0gYikgewogICAgICAgIHEucHVzaCh7CiAgICAgICAgICBpOiBzLnB1c2gocG9wKHMpICsgInNrZXdYKCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsCiAgICAgICAgICB4OiBpbnRlcnBvbGF0ZU51bWJlcihhLCBiKQogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKGIpIHsKICAgICAgICBzLnB1c2gocG9wKHMpICsgInNrZXdYKCIgKyBiICsgZGVnUGFyZW4pOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBzY2FsZSh4YSwgeWEsIHhiLCB5YiwgcywgcSkgewogICAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5YikgewogICAgICAgIHZhciBpID0gcy5wdXNoKHBvcChzKSArICJzY2FsZSgiLCBudWxsLCAiLCIsIG51bGwsICIpIik7CiAgICAgICAgcS5wdXNoKHsKICAgICAgICAgIGk6IGkgLSA0LAogICAgICAgICAgeDogaW50ZXJwb2xhdGVOdW1iZXIoeGEsIHhiKQogICAgICAgIH0sIHsKICAgICAgICAgIGk6IGkgLSAyLAogICAgICAgICAgeDogaW50ZXJwb2xhdGVOdW1iZXIoeWEsIHliKQogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKHhiICE9PSAxIHx8IHliICE9PSAxKSB7CiAgICAgICAgcy5wdXNoKHBvcChzKSArICJzY2FsZSgiICsgeGIgKyAiLCIgKyB5YiArICIpIik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmdW5jdGlvbiAoYSwgYikgewogICAgICB2YXIgcyA9IFtdLAogICAgICAgIC8vIHN0cmluZyBjb25zdGFudHMgYW5kIHBsYWNlaG9sZGVycwogICAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnMKICAgICAgYSA9IHBhcnNlKGEpLCBiID0gcGFyc2UoYik7CiAgICAgIHRyYW5zbGF0ZShhLnRyYW5zbGF0ZVgsIGEudHJhbnNsYXRlWSwgYi50cmFuc2xhdGVYLCBiLnRyYW5zbGF0ZVksIHMsIHEpOwogICAgICByb3RhdGUoYS5yb3RhdGUsIGIucm90YXRlLCBzLCBxKTsKICAgICAgc2tld1goYS5za2V3WCwgYi5za2V3WCwgcywgcSk7CiAgICAgIHNjYWxlKGEuc2NhbGVYLCBhLnNjYWxlWSwgYi5zY2FsZVgsIGIuc2NhbGVZLCBzLCBxKTsKICAgICAgYSA9IGIgPSBudWxsOyAvLyBnYwogICAgICByZXR1cm4gZnVuY3Rpb24gKHQpIHsKICAgICAgICB2YXIgaSA9IC0xLAogICAgICAgICAgbiA9IHEubGVuZ3RoLAogICAgICAgICAgbzsKICAgICAgICB3aGlsZSAoKytpIDwgbikgc1sobyA9IHFbaV0pLmldID0gby54KHQpOwogICAgICAgIHJldHVybiBzLmpvaW4oIiIpOwogICAgICB9OwogICAgfTsKICB9CiAgdmFyIGludGVycG9sYXRlVHJhbnNmb3JtQ3NzID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VDc3MsICJweCwgIiwgInB4KSIsICJkZWcpIik7CiAgdmFyIGludGVycG9sYXRlVHJhbnNmb3JtU3ZnID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VTdmcsICIsICIsICIpIiwgIikiKTsKCiAgdmFyIGZyYW1lID0gMCwKICAgIC8vIGlzIGFuIGFuaW1hdGlvbiBmcmFtZSBwZW5kaW5nPwogICAgdGltZW91dCQxID0gMCwKICAgIC8vIGlzIGEgdGltZW91dCBwZW5kaW5nPwogICAgaW50ZXJ2YWwgPSAwLAogICAgLy8gYXJlIGFueSB0aW1lcnMgYWN0aXZlPwogICAgcG9rZURlbGF5ID0gMTAwMCwKICAgIC8vIGhvdyBmcmVxdWVudGx5IHdlIGNoZWNrIGZvciBjbG9jayBza2V3CiAgICB0YXNrSGVhZCwKICAgIHRhc2tUYWlsLAogICAgY2xvY2tMYXN0ID0gMCwKICAgIGNsb2NrTm93ID0gMCwKICAgIGNsb2NrU2tldyA9IDAsCiAgICBjbG9jayA9IHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gIm9iamVjdCIgJiYgcGVyZm9ybWFuY2Uubm93ID8gcGVyZm9ybWFuY2UgOiBEYXRlLAogICAgc2V0RnJhbWUgPSB0eXBlb2Ygd2luZG93ID09PSAib2JqZWN0IiAmJiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdykgOiBmdW5jdGlvbiAoZikgewogICAgICBzZXRUaW1lb3V0KGYsIDE3KTsKICAgIH07CiAgZnVuY3Rpb24gbm93KCkgewogICAgcmV0dXJuIGNsb2NrTm93IHx8IChzZXRGcmFtZShjbGVhck5vdyksIGNsb2NrTm93ID0gY2xvY2subm93KCkgKyBjbG9ja1NrZXcpOwogIH0KICBmdW5jdGlvbiBjbGVhck5vdygpIHsKICAgIGNsb2NrTm93ID0gMDsKICB9CiAgZnVuY3Rpb24gVGltZXIoKSB7CiAgICB0aGlzLl9jYWxsID0gdGhpcy5fdGltZSA9IHRoaXMuX25leHQgPSBudWxsOwogIH0KICBUaW1lci5wcm90b3R5cGUgPSB0aW1lci5wcm90b3R5cGUgPSB7CiAgICBjb25zdHJ1Y3RvcjogVGltZXIsCiAgICByZXN0YXJ0OiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7CiAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uIik7CiAgICAgIHRpbWUgPSAodGltZSA9PSBudWxsID8gbm93KCkgOiArdGltZSkgKyAoZGVsYXkgPT0gbnVsbCA/IDAgOiArZGVsYXkpOwogICAgICBpZiAoIXRoaXMuX25leHQgJiYgdGFza1RhaWwgIT09IHRoaXMpIHsKICAgICAgICBpZiAodGFza1RhaWwpIHRhc2tUYWlsLl9uZXh0ID0gdGhpcztlbHNlIHRhc2tIZWFkID0gdGhpczsKICAgICAgICB0YXNrVGFpbCA9IHRoaXM7CiAgICAgIH0KICAgICAgdGhpcy5fY2FsbCA9IGNhbGxiYWNrOwogICAgICB0aGlzLl90aW1lID0gdGltZTsKICAgICAgc2xlZXAoKTsKICAgIH0sCiAgICBzdG9wOiBmdW5jdGlvbiAoKSB7CiAgICAgIGlmICh0aGlzLl9jYWxsKSB7CiAgICAgICAgdGhpcy5fY2FsbCA9IG51bGw7CiAgICAgICAgdGhpcy5fdGltZSA9IEluZmluaXR5OwogICAgICAgIHNsZWVwKCk7CiAgICAgIH0KICAgIH0KICB9OwogIGZ1bmN0aW9uIHRpbWVyKGNhbGxiYWNrLCBkZWxheSwgdGltZSkgewogICAgdmFyIHQgPSBuZXcgVGltZXIoKTsKICAgIHQucmVzdGFydChjYWxsYmFjaywgZGVsYXksIHRpbWUpOwogICAgcmV0dXJuIHQ7CiAgfQogIGZ1bmN0aW9uIHRpbWVyRmx1c2goKSB7CiAgICBub3coKTsgLy8gR2V0IHRoZSBjdXJyZW50IHRpbWUsIGlmIG5vdCBhbHJlYWR5IHNldC4KICAgICsrZnJhbWU7IC8vIFByZXRlbmQgd2XigJl2ZSBzZXQgYW4gYWxhcm0sIGlmIHdlIGhhdmVu4oCZdCBhbHJlYWR5LgogICAgdmFyIHQgPSB0YXNrSGVhZCwKICAgICAgZTsKICAgIHdoaWxlICh0KSB7CiAgICAgIGlmICgoZSA9IGNsb2NrTm93IC0gdC5fdGltZSkgPj0gMCkgdC5fY2FsbC5jYWxsKHVuZGVmaW5lZCwgZSk7CiAgICAgIHQgPSB0Ll9uZXh0OwogICAgfQogICAgLS1mcmFtZTsKICB9CiAgZnVuY3Rpb24gd2FrZSgpIHsKICAgIGNsb2NrTm93ID0gKGNsb2NrTGFzdCA9IGNsb2NrLm5vdygpKSArIGNsb2NrU2tldzsKICAgIGZyYW1lID0gdGltZW91dCQxID0gMDsKICAgIHRyeSB7CiAgICAgIHRpbWVyRmx1c2goKTsKICAgIH0gZmluYWxseSB7CiAgICAgIGZyYW1lID0gMDsKICAgICAgbmFwKCk7CiAgICAgIGNsb2NrTm93ID0gMDsKICAgIH0KICB9CiAgZnVuY3Rpb24gcG9rZSgpIHsKICAgIHZhciBub3cgPSBjbG9jay5ub3coKSwKICAgICAgZGVsYXkgPSBub3cgLSBjbG9ja0xhc3Q7CiAgICBpZiAoZGVsYXkgPiBwb2tlRGVsYXkpIGNsb2NrU2tldyAtPSBkZWxheSwgY2xvY2tMYXN0ID0gbm93OwogIH0KICBmdW5jdGlvbiBuYXAoKSB7CiAgICB2YXIgdDAsCiAgICAgIHQxID0gdGFza0hlYWQsCiAgICAgIHQyLAogICAgICB0aW1lID0gSW5maW5pdHk7CiAgICB3aGlsZSAodDEpIHsKICAgICAgaWYgKHQxLl9jYWxsKSB7CiAgICAgICAgaWYgKHRpbWUgPiB0MS5fdGltZSkgdGltZSA9IHQxLl90aW1lOwogICAgICAgIHQwID0gdDEsIHQxID0gdDEuX25leHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdDIgPSB0MS5fbmV4dCwgdDEuX25leHQgPSBudWxsOwogICAgICAgIHQxID0gdDAgPyB0MC5fbmV4dCA9IHQyIDogdGFza0hlYWQgPSB0MjsKICAgICAgfQogICAgfQogICAgdGFza1RhaWwgPSB0MDsKICAgIHNsZWVwKHRpbWUpOwogIH0KICBmdW5jdGlvbiBzbGVlcCh0aW1lKSB7CiAgICBpZiAoZnJhbWUpIHJldHVybjsgLy8gU29vbmVzdCBhbGFybSBhbHJlYWR5IHNldCwgb3Igd2lsbCBiZS4KICAgIGlmICh0aW1lb3V0JDEpIHRpbWVvdXQkMSA9IGNsZWFyVGltZW91dCh0aW1lb3V0JDEpOwogICAgdmFyIGRlbGF5ID0gdGltZSAtIGNsb2NrTm93OyAvLyBTdHJpY3RseSBsZXNzIHRoYW4gaWYgd2UgcmVjb21wdXRlZCBjbG9ja05vdy4KICAgIGlmIChkZWxheSA+IDI0KSB7CiAgICAgIGlmICh0aW1lIDwgSW5maW5pdHkpIHRpbWVvdXQkMSA9IHNldFRpbWVvdXQod2FrZSwgdGltZSAtIGNsb2NrLm5vdygpIC0gY2xvY2tTa2V3KTsKICAgICAgaWYgKGludGVydmFsKSBpbnRlcnZhbCA9IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKCFpbnRlcnZhbCkgY2xvY2tMYXN0ID0gY2xvY2subm93KCksIGludGVydmFsID0gc2V0SW50ZXJ2YWwocG9rZSwgcG9rZURlbGF5KTsKICAgICAgZnJhbWUgPSAxLCBzZXRGcmFtZSh3YWtlKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHRpbWVvdXQgKGNhbGxiYWNrLCBkZWxheSwgdGltZSkgewogICAgdmFyIHQgPSBuZXcgVGltZXIoKTsKICAgIGRlbGF5ID0gZGVsYXkgPT0gbnVsbCA/IDAgOiArZGVsYXk7CiAgICB0LnJlc3RhcnQoZWxhcHNlZCA9PiB7CiAgICAgIHQuc3RvcCgpOwogICAgICBjYWxsYmFjayhlbGFwc2VkICsgZGVsYXkpOwogICAgfSwgZGVsYXksIHRpbWUpOwogICAgcmV0dXJuIHQ7CiAgfQoKICB2YXIgZW1wdHlPbiA9IGRpc3BhdGNoKCJzdGFydCIsICJlbmQiLCAiY2FuY2VsIiwgImludGVycnVwdCIpOwogIHZhciBlbXB0eVR3ZWVuID0gW107CiAgdmFyIENSRUFURUQgPSAwOwogIHZhciBTQ0hFRFVMRUQgPSAxOwogIHZhciBTVEFSVElORyA9IDI7CiAgdmFyIFNUQVJURUQgPSAzOwogIHZhciBSVU5OSU5HID0gNDsKICB2YXIgRU5ESU5HID0gNTsKICB2YXIgRU5ERUQgPSA2OwogIGZ1bmN0aW9uIHNjaGVkdWxlIChub2RlLCBuYW1lLCBpZCwgaW5kZXgsIGdyb3VwLCB0aW1pbmcpIHsKICAgIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbjsKICAgIGlmICghc2NoZWR1bGVzKSBub2RlLl9fdHJhbnNpdGlvbiA9IHt9O2Vsc2UgaWYgKGlkIGluIHNjaGVkdWxlcykgcmV0dXJuOwogICAgY3JlYXRlKG5vZGUsIGlkLCB7CiAgICAgIG5hbWU6IG5hbWUsCiAgICAgIGluZGV4OiBpbmRleCwKICAgICAgLy8gRm9yIGNvbnRleHQgZHVyaW5nIGNhbGxiYWNrLgogICAgICBncm91cDogZ3JvdXAsCiAgICAgIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay4KICAgICAgb246IGVtcHR5T24sCiAgICAgIHR3ZWVuOiBlbXB0eVR3ZWVuLAogICAgICB0aW1lOiB0aW1pbmcudGltZSwKICAgICAgZGVsYXk6IHRpbWluZy5kZWxheSwKICAgICAgZHVyYXRpb246IHRpbWluZy5kdXJhdGlvbiwKICAgICAgZWFzZTogdGltaW5nLmVhc2UsCiAgICAgIHRpbWVyOiBudWxsLAogICAgICBzdGF0ZTogQ1JFQVRFRAogICAgfSk7CiAgfQogIGZ1bmN0aW9uIGluaXQobm9kZSwgaWQpIHsKICAgIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7CiAgICBpZiAoc2NoZWR1bGUuc3RhdGUgPiBDUkVBVEVEKSB0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHNjaGVkdWxlZCIpOwogICAgcmV0dXJuIHNjaGVkdWxlOwogIH0KICBmdW5jdGlvbiBzZXQobm9kZSwgaWQpIHsKICAgIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7CiAgICBpZiAoc2NoZWR1bGUuc3RhdGUgPiBTVEFSVEVEKSB0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHJ1bm5pbmciKTsKICAgIHJldHVybiBzY2hlZHVsZTsKICB9CiAgZnVuY3Rpb24gZ2V0KG5vZGUsIGlkKSB7CiAgICB2YXIgc2NoZWR1bGUgPSBub2RlLl9fdHJhbnNpdGlvbjsKICAgIGlmICghc2NoZWR1bGUgfHwgIShzY2hlZHVsZSA9IHNjaGVkdWxlW2lkXSkpIHRocm93IG5ldyBFcnJvcigidHJhbnNpdGlvbiBub3QgZm91bmQiKTsKICAgIHJldHVybiBzY2hlZHVsZTsKICB9CiAgZnVuY3Rpb24gY3JlYXRlKG5vZGUsIGlkLCBzZWxmKSB7CiAgICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sCiAgICAgIHR3ZWVuOwoKICAgIC8vIEluaXRpYWxpemUgdGhlIHNlbGYgdGltZXIgd2hlbiB0aGUgdHJhbnNpdGlvbiBpcyBjcmVhdGVkLgogICAgLy8gTm90ZSB0aGUgYWN0dWFsIGRlbGF5IGlzIG5vdCBrbm93biB1bnRpbCB0aGUgZmlyc3QgY2FsbGJhY2shCiAgICBzY2hlZHVsZXNbaWRdID0gc2VsZjsKICAgIHNlbGYudGltZXIgPSB0aW1lcihzY2hlZHVsZSwgMCwgc2VsZi50aW1lKTsKICAgIGZ1bmN0aW9uIHNjaGVkdWxlKGVsYXBzZWQpIHsKICAgICAgc2VsZi5zdGF0ZSA9IFNDSEVEVUxFRDsKICAgICAgc2VsZi50aW1lci5yZXN0YXJ0KHN0YXJ0LCBzZWxmLmRlbGF5LCBzZWxmLnRpbWUpOwoKICAgICAgLy8gSWYgdGhlIGVsYXBzZWQgZGVsYXkgaXMgbGVzcyB0aGFuIG91ciBmaXJzdCBzbGVlcCwgc3RhcnQgaW1tZWRpYXRlbHkuCiAgICAgIGlmIChzZWxmLmRlbGF5IDw9IGVsYXBzZWQpIHN0YXJ0KGVsYXBzZWQgLSBzZWxmLmRlbGF5KTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0YXJ0KGVsYXBzZWQpIHsKICAgICAgdmFyIGksIGosIG4sIG87CgogICAgICAvLyBJZiB0aGUgc3RhdGUgaXMgbm90IFNDSEVEVUxFRCwgdGhlbiB3ZSBwcmV2aW91c2x5IGVycm9yZWQgb24gc3RhcnQuCiAgICAgIGlmIChzZWxmLnN0YXRlICE9PSBTQ0hFRFVMRUQpIHJldHVybiBzdG9wKCk7CiAgICAgIGZvciAoaSBpbiBzY2hlZHVsZXMpIHsKICAgICAgICBvID0gc2NoZWR1bGVzW2ldOwogICAgICAgIGlmIChvLm5hbWUgIT09IHNlbGYubmFtZSkgY29udGludWU7CgogICAgICAgIC8vIFdoaWxlIHRoaXMgZWxlbWVudCBhbHJlYWR5IGhhcyBhIHN0YXJ0aW5nIHRyYW5zaXRpb24gZHVyaW5nIHRoaXMgZnJhbWUsCiAgICAgICAgLy8gZGVmZXIgc3RhcnRpbmcgYW4gaW50ZXJydXB0aW5nIHRyYW5zaXRpb24gdW50aWwgdGhhdCB0cmFuc2l0aW9uIGhhcyBhCiAgICAgICAgLy8gY2hhbmNlIHRvIHRpY2sgKGFuZCBwb3NzaWJseSBlbmQpOyBzZWUgZDMvZDMtdHJhbnNpdGlvbiM1NCEKICAgICAgICBpZiAoby5zdGF0ZSA9PT0gU1RBUlRFRCkgcmV0dXJuIHRpbWVvdXQoc3RhcnQpOwoKICAgICAgICAvLyBJbnRlcnJ1cHQgdGhlIGFjdGl2ZSB0cmFuc2l0aW9uLCBpZiBhbnkuCiAgICAgICAgaWYgKG8uc3RhdGUgPT09IFJVTk5JTkcpIHsKICAgICAgICAgIG8uc3RhdGUgPSBFTkRFRDsKICAgICAgICAgIG8udGltZXIuc3RvcCgpOwogICAgICAgICAgby5vbi5jYWxsKCJpbnRlcnJ1cHQiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBvLmluZGV4LCBvLmdyb3VwKTsKICAgICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07CiAgICAgICAgfQoKICAgICAgICAvLyBDYW5jZWwgYW55IHByZS1lbXB0ZWQgdHJhbnNpdGlvbnMuCiAgICAgICAgZWxzZSBpZiAoK2kgPCBpZCkgewogICAgICAgICAgby5zdGF0ZSA9IEVOREVEOwogICAgICAgICAgby50aW1lci5zdG9wKCk7CiAgICAgICAgICBvLm9uLmNhbGwoImNhbmNlbCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIG8uaW5kZXgsIG8uZ3JvdXApOwogICAgICAgICAgZGVsZXRlIHNjaGVkdWxlc1tpXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIERlZmVyIHRoZSBmaXJzdCB0aWNrIHRvIGVuZCBvZiB0aGUgY3VycmVudCBmcmFtZTsgc2VlIGQzL2QzIzE1NzYuCiAgICAgIC8vIE5vdGUgdGhlIHRyYW5zaXRpb24gbWF5IGJlIGNhbmNlbGVkIGFmdGVyIHN0YXJ0IGFuZCBiZWZvcmUgdGhlIGZpcnN0IHRpY2shCiAgICAgIC8vIE5vdGUgdGhpcyBtdXN0IGJlIHNjaGVkdWxlZCBiZWZvcmUgdGhlIHN0YXJ0IGV2ZW50OyBzZWUgZDMvZDMtdHJhbnNpdGlvbiMxNiEKICAgICAgLy8gQXNzdW1pbmcgdGhpcyBpcyBzdWNjZXNzZnVsLCBzdWJzZXF1ZW50IGNhbGxiYWNrcyBnbyBzdHJhaWdodCB0byB0aWNrLgogICAgICB0aW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gU1RBUlRFRCkgewogICAgICAgICAgc2VsZi5zdGF0ZSA9IFJVTk5JTkc7CiAgICAgICAgICBzZWxmLnRpbWVyLnJlc3RhcnQodGljaywgc2VsZi5kZWxheSwgc2VsZi50aW1lKTsKICAgICAgICAgIHRpY2soZWxhcHNlZCk7CiAgICAgICAgfQogICAgICB9KTsKCiAgICAgIC8vIERpc3BhdGNoIHRoZSBzdGFydCBldmVudC4KICAgICAgLy8gTm90ZSB0aGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhlIHR3ZWVuIGFyZSBpbml0aWFsaXplZC4KICAgICAgc2VsZi5zdGF0ZSA9IFNUQVJUSU5HOwogICAgICBzZWxmLm9uLmNhbGwoInN0YXJ0Iiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7CiAgICAgIGlmIChzZWxmLnN0YXRlICE9PSBTVEFSVElORykgcmV0dXJuOyAvLyBpbnRlcnJ1cHRlZAogICAgICBzZWxmLnN0YXRlID0gU1RBUlRFRDsKCiAgICAgIC8vIEluaXRpYWxpemUgdGhlIHR3ZWVuLCBkZWxldGluZyBudWxsIHR3ZWVuLgogICAgICB0d2VlbiA9IG5ldyBBcnJheShuID0gc2VsZi50d2Vlbi5sZW5ndGgpOwogICAgICBmb3IgKGkgPSAwLCBqID0gLTE7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAobyA9IHNlbGYudHdlZW5baV0udmFsdWUuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKSkgewogICAgICAgICAgdHdlZW5bKytqXSA9IG87CiAgICAgICAgfQogICAgICB9CiAgICAgIHR3ZWVuLmxlbmd0aCA9IGogKyAxOwogICAgfQogICAgZnVuY3Rpb24gdGljayhlbGFwc2VkKSB7CiAgICAgIHZhciB0ID0gZWxhcHNlZCA8IHNlbGYuZHVyYXRpb24gPyBzZWxmLmVhc2UuY2FsbChudWxsLCBlbGFwc2VkIC8gc2VsZi5kdXJhdGlvbikgOiAoc2VsZi50aW1lci5yZXN0YXJ0KHN0b3ApLCBzZWxmLnN0YXRlID0gRU5ESU5HLCAxKSwKICAgICAgICBpID0gLTEsCiAgICAgICAgbiA9IHR3ZWVuLmxlbmd0aDsKICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICB0d2VlbltpXS5jYWxsKG5vZGUsIHQpOwogICAgICB9CgogICAgICAvLyBEaXNwYXRjaCB0aGUgZW5kIGV2ZW50LgogICAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gRU5ESU5HKSB7CiAgICAgICAgc2VsZi5vbi5jYWxsKCJlbmQiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKTsKICAgICAgICBzdG9wKCk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHN0b3AoKSB7CiAgICAgIHNlbGYuc3RhdGUgPSBFTkRFRDsKICAgICAgc2VsZi50aW1lci5zdG9wKCk7CiAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaWRdOwogICAgICBmb3IgKHZhciBpIGluIHNjaGVkdWxlcykgcmV0dXJuOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCiAgICAgIGRlbGV0ZSBub2RlLl9fdHJhbnNpdGlvbjsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGludGVycnVwdCAobm9kZSwgbmFtZSkgewogICAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uLAogICAgICBzY2hlZHVsZSwKICAgICAgYWN0aXZlLAogICAgICBlbXB0eSA9IHRydWUsCiAgICAgIGk7CiAgICBpZiAoIXNjaGVkdWxlcykgcmV0dXJuOwogICAgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgIiI7CiAgICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7CiAgICAgIGlmICgoc2NoZWR1bGUgPSBzY2hlZHVsZXNbaV0pLm5hbWUgIT09IG5hbWUpIHsKICAgICAgICBlbXB0eSA9IGZhbHNlOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGFjdGl2ZSA9IHNjaGVkdWxlLnN0YXRlID4gU1RBUlRJTkcgJiYgc2NoZWR1bGUuc3RhdGUgPCBFTkRJTkc7CiAgICAgIHNjaGVkdWxlLnN0YXRlID0gRU5ERUQ7CiAgICAgIHNjaGVkdWxlLnRpbWVyLnN0b3AoKTsKICAgICAgc2NoZWR1bGUub24uY2FsbChhY3RpdmUgPyAiaW50ZXJydXB0IiA6ICJjYW5jZWwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzY2hlZHVsZS5pbmRleCwgc2NoZWR1bGUuZ3JvdXApOwogICAgICBkZWxldGUgc2NoZWR1bGVzW2ldOwogICAgfQogICAgaWYgKGVtcHR5KSBkZWxldGUgbm9kZS5fX3RyYW5zaXRpb247CiAgfQoKICBmdW5jdGlvbiBzZWxlY3Rpb25faW50ZXJydXB0IChuYW1lKSB7CiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgaW50ZXJydXB0KHRoaXMsIG5hbWUpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiB0d2VlblJlbW92ZShpZCwgbmFtZSkgewogICAgdmFyIHR3ZWVuMCwgdHdlZW4xOwogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSwKICAgICAgICB0d2VlbiA9IHNjaGVkdWxlLnR3ZWVuOwoKICAgICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCB0d2VlbiB3aXRoIHRoZSBwcmV2aW91cyBub2RlLAogICAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdl4oCZcmUgZG9uZSEKICAgICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLgogICAgICBpZiAodHdlZW4gIT09IHR3ZWVuMCkgewogICAgICAgIHR3ZWVuMSA9IHR3ZWVuMCA9IHR3ZWVuOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHdlZW4xLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKHR3ZWVuMVtpXS5uYW1lID09PSBuYW1lKSB7CiAgICAgICAgICAgIHR3ZWVuMSA9IHR3ZWVuMS5zbGljZSgpOwogICAgICAgICAgICB0d2VlbjEuc3BsaWNlKGksIDEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgc2NoZWR1bGUudHdlZW4gPSB0d2VlbjE7CiAgICB9OwogIH0KICBmdW5jdGlvbiB0d2VlbkZ1bmN0aW9uKGlkLCBuYW1lLCB2YWx1ZSkgewogICAgdmFyIHR3ZWVuMCwgdHdlZW4xOwogICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yKCk7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLAogICAgICAgIHR3ZWVuID0gc2NoZWR1bGUudHdlZW47CgogICAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsCiAgICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCB0d2VlbiBhbmQgd2XigJlyZSBkb25lIQogICAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuCiAgICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7CiAgICAgICAgdHdlZW4xID0gKHR3ZWVuMCA9IHR3ZWVuKS5zbGljZSgpOwogICAgICAgIGZvciAodmFyIHQgPSB7CiAgICAgICAgICAgIG5hbWU6IG5hbWUsCiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZQogICAgICAgICAgfSwgaSA9IDAsIG4gPSB0d2VlbjEubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgICAgdHdlZW4xW2ldID0gdDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChpID09PSBuKSB0d2VlbjEucHVzaCh0KTsKICAgICAgfQogICAgICBzY2hlZHVsZS50d2VlbiA9IHR3ZWVuMTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHRyYW5zaXRpb25fdHdlZW4gKG5hbWUsIHZhbHVlKSB7CiAgICB2YXIgaWQgPSB0aGlzLl9pZDsKICAgIG5hbWUgKz0gIiI7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgICAgdmFyIHR3ZWVuID0gZ2V0KHRoaXMubm9kZSgpLCBpZCkudHdlZW47CiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHdlZW4ubGVuZ3RoLCB0OyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKCh0ID0gdHdlZW5baV0pLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgIHJldHVybiB0LnZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiB0aGlzLmVhY2goKHZhbHVlID09IG51bGwgPyB0d2VlblJlbW92ZSA6IHR3ZWVuRnVuY3Rpb24pKGlkLCBuYW1lLCB2YWx1ZSkpOwogIH0KICBmdW5jdGlvbiB0d2VlblZhbHVlKHRyYW5zaXRpb24sIG5hbWUsIHZhbHVlKSB7CiAgICB2YXIgaWQgPSB0cmFuc2l0aW9uLl9pZDsKICAgIHRyYW5zaXRpb24uZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCk7CiAgICAgIChzY2hlZHVsZS52YWx1ZSB8fCAoc2NoZWR1bGUudmFsdWUgPSB7fSkpW25hbWVdID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIH0pOwogICAgcmV0dXJuIGZ1bmN0aW9uIChub2RlKSB7CiAgICAgIHJldHVybiBnZXQobm9kZSwgaWQpLnZhbHVlW25hbWVdOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIGludGVycG9sYXRlIChhLCBiKSB7CiAgICB2YXIgYzsKICAgIHJldHVybiAodHlwZW9mIGIgPT09ICJudW1iZXIiID8gaW50ZXJwb2xhdGVOdW1iZXIgOiBiIGluc3RhbmNlb2YgY29sb3IgPyBpbnRlcnBvbGF0ZVJnYiA6IChjID0gY29sb3IoYikpID8gKGIgPSBjLCBpbnRlcnBvbGF0ZVJnYikgOiBpbnRlcnBvbGF0ZVN0cmluZykoYSwgYik7CiAgfQoKICBmdW5jdGlvbiBhdHRyUmVtb3ZlKG5hbWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gYXR0clJlbW92ZU5TKGZ1bGxuYW1lKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBhdHRyQ29uc3RhbnQobmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkgewogICAgdmFyIHN0cmluZzAwLAogICAgICBzdHJpbmcxID0gdmFsdWUxICsgIiIsCiAgICAgIGludGVycG9sYXRlMDsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7CiAgICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbCA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMoZnVsbG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHsKICAgIHZhciBzdHJpbmcwMCwKICAgICAgc3RyaW5nMSA9IHZhbHVlMSArICIiLAogICAgICBpbnRlcnBvbGF0ZTA7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsKICAgICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBhdHRyRnVuY3Rpb24obmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7CiAgICB2YXIgc3RyaW5nMDAsIHN0cmluZzEwLCBpbnRlcnBvbGF0ZTA7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgc3RyaW5nMCwKICAgICAgICB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSwKICAgICAgICBzdHJpbmcxOwogICAgICBpZiAodmFsdWUxID09IG51bGwpIHJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgICBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7CiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyAiIjsKICAgICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMoZnVsbG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkgewogICAgdmFyIHN0cmluZzAwLCBzdHJpbmcxMCwgaW50ZXJwb2xhdGUwOwogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHN0cmluZzAsCiAgICAgICAgdmFsdWUxID0gdmFsdWUodGhpcyksCiAgICAgICAgc3RyaW5nMTsKICAgICAgaWYgKHZhbHVlMSA9PSBudWxsKSByZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICAgIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyAiIjsKICAgICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gdHJhbnNpdGlvbl9hdHRyIChuYW1lLCB2YWx1ZSkgewogICAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpLAogICAgICBpID0gZnVsbG5hbWUgPT09ICJ0cmFuc2Zvcm0iID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm1TdmcgOiBpbnRlcnBvbGF0ZTsKICAgIHJldHVybiB0aGlzLmF0dHJUd2VlbihuYW1lLCB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyRnVuY3Rpb25OUyA6IGF0dHJGdW5jdGlvbikoZnVsbG5hbWUsIGksIHR3ZWVuVmFsdWUodGhpcywgImF0dHIuIiArIG5hbWUsIHZhbHVlKSkgOiB2YWx1ZSA9PSBudWxsID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0clJlbW92ZU5TIDogYXR0clJlbW92ZSkoZnVsbG5hbWUpIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQpKGZ1bGxuYW1lLCBpLCB2YWx1ZSkpOwogIH0KCiAgZnVuY3Rpb24gYXR0ckludGVycG9sYXRlKG5hbWUsIGkpIHsKICAgIHJldHVybiBmdW5jdGlvbiAodCkgewogICAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCBpLmNhbGwodGhpcywgdCkpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gYXR0ckludGVycG9sYXRlTlMoZnVsbG5hbWUsIGkpIHsKICAgIHJldHVybiBmdW5jdGlvbiAodCkgewogICAgICB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgaS5jYWxsKHRoaXMsIHQpKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGF0dHJUd2Vlbk5TKGZ1bGxuYW1lLCB2YWx1ZSkgewogICAgdmFyIHQwLCBpMDsKICAgIGZ1bmN0aW9uIHR3ZWVuKCkgewogICAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiBhdHRySW50ZXJwb2xhdGVOUyhmdWxsbmFtZSwgaSk7CiAgICAgIHJldHVybiB0MDsKICAgIH0KICAgIHR3ZWVuLl92YWx1ZSA9IHZhbHVlOwogICAgcmV0dXJuIHR3ZWVuOwogIH0KICBmdW5jdGlvbiBhdHRyVHdlZW4obmFtZSwgdmFsdWUpIHsKICAgIHZhciB0MCwgaTA7CiAgICBmdW5jdGlvbiB0d2VlbigpIHsKICAgICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgYXR0ckludGVycG9sYXRlKG5hbWUsIGkpOwogICAgICByZXR1cm4gdDA7CiAgICB9CiAgICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTsKICAgIHJldHVybiB0d2VlbjsKICB9CiAgZnVuY3Rpb24gdHJhbnNpdGlvbl9hdHRyVHdlZW4gKG5hbWUsIHZhbHVlKSB7CiAgICB2YXIga2V5ID0gImF0dHIuIiArIG5hbWU7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlOwogICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgbnVsbCk7CiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3IoKTsKICAgIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTsKICAgIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgKGZ1bGxuYW1lLmxvY2FsID8gYXR0clR3ZWVuTlMgOiBhdHRyVHdlZW4pKGZ1bGxuYW1lLCB2YWx1ZSkpOwogIH0KCiAgZnVuY3Rpb24gZGVsYXlGdW5jdGlvbihpZCwgdmFsdWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIGluaXQodGhpcywgaWQpLmRlbGF5ID0gK3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBkZWxheUNvbnN0YW50KGlkLCB2YWx1ZSkgewogICAgcmV0dXJuIHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbiAoKSB7CiAgICAgIGluaXQodGhpcywgaWQpLmRlbGF5ID0gdmFsdWU7CiAgICB9OwogIH0KICBmdW5jdGlvbiB0cmFuc2l0aW9uX2RlbGF5ICh2YWx1ZSkgewogICAgdmFyIGlkID0gdGhpcy5faWQ7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gZGVsYXlGdW5jdGlvbiA6IGRlbGF5Q29uc3RhbnQpKGlkLCB2YWx1ZSkpIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZGVsYXk7CiAgfQoKICBmdW5jdGlvbiBkdXJhdGlvbkZ1bmN0aW9uKGlkLCB2YWx1ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgc2V0KHRoaXMsIGlkKS5kdXJhdGlvbiA9ICt2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gZHVyYXRpb25Db25zdGFudChpZCwgdmFsdWUpIHsKICAgIHJldHVybiB2YWx1ZSA9ICt2YWx1ZSwgZnVuY3Rpb24gKCkgewogICAgICBzZXQodGhpcywgaWQpLmR1cmF0aW9uID0gdmFsdWU7CiAgICB9OwogIH0KICBmdW5jdGlvbiB0cmFuc2l0aW9uX2R1cmF0aW9uICh2YWx1ZSkgewogICAgdmFyIGlkID0gdGhpcy5faWQ7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gZHVyYXRpb25GdW5jdGlvbiA6IGR1cmF0aW9uQ29uc3RhbnQpKGlkLCB2YWx1ZSkpIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZHVyYXRpb247CiAgfQoKICBmdW5jdGlvbiBlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSB7CiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3IoKTsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHNldCh0aGlzLCBpZCkuZWFzZSA9IHZhbHVlOwogICAgfTsKICB9CiAgZnVuY3Rpb24gdHJhbnNpdGlvbl9lYXNlICh2YWx1ZSkgewogICAgdmFyIGlkID0gdGhpcy5faWQ7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHRoaXMuZWFjaChlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSkgOiBnZXQodGhpcy5ub2RlKCksIGlkKS5lYXNlOwogIH0KCiAgZnVuY3Rpb24gZWFzZVZhcnlpbmcoaWQsIHZhbHVlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIGlmICh0eXBlb2YgdiAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yKCk7CiAgICAgIHNldCh0aGlzLCBpZCkuZWFzZSA9IHY7CiAgICB9OwogIH0KICBmdW5jdGlvbiB0cmFuc2l0aW9uX2Vhc2VWYXJ5aW5nICh2YWx1ZSkgewogICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yKCk7CiAgICByZXR1cm4gdGhpcy5lYWNoKGVhc2VWYXJ5aW5nKHRoaXMuX2lkLCB2YWx1ZSkpOwogIH0KCiAgZnVuY3Rpb24gdHJhbnNpdGlvbl9maWx0ZXIgKG1hdGNoKSB7CiAgICBpZiAodHlwZW9mIG1hdGNoICE9PSAiZnVuY3Rpb24iKSBtYXRjaCA9IG1hdGNoZXIobWF0Y2gpOwogICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgbWF0Y2guY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpIHsKICAgICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCB0aGlzLl9uYW1lLCB0aGlzLl9pZCk7CiAgfQoKICBmdW5jdGlvbiB0cmFuc2l0aW9uX21lcmdlICh0cmFuc2l0aW9uKSB7CiAgICBpZiAodHJhbnNpdGlvbi5faWQgIT09IHRoaXMuX2lkKSB0aHJvdyBuZXcgRXJyb3IoKTsKICAgIGZvciAodmFyIGdyb3VwczAgPSB0aGlzLl9ncm91cHMsIGdyb3VwczEgPSB0cmFuc2l0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cDBbaV0gfHwgZ3JvdXAxW2ldKSB7CiAgICAgICAgICBtZXJnZVtpXSA9IG5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmb3IgKDsgaiA8IG0wOyArK2opIHsKICAgICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTsKICAgIH0KICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbihtZXJnZXMsIHRoaXMuX3BhcmVudHMsIHRoaXMuX25hbWUsIHRoaXMuX2lkKTsKICB9CgogIGZ1bmN0aW9uIHN0YXJ0KG5hbWUpIHsKICAgIHJldHVybiAobmFtZSArICIiKS50cmltKCkuc3BsaXQoL158XHMrLykuZXZlcnkoZnVuY3Rpb24gKHQpIHsKICAgICAgdmFyIGkgPSB0LmluZGV4T2YoIi4iKTsKICAgICAgaWYgKGkgPj0gMCkgdCA9IHQuc2xpY2UoMCwgaSk7CiAgICAgIHJldHVybiAhdCB8fCB0ID09PSAic3RhcnQiOwogICAgfSk7CiAgfQogIGZ1bmN0aW9uIG9uRnVuY3Rpb24oaWQsIG5hbWUsIGxpc3RlbmVyKSB7CiAgICB2YXIgb24wLAogICAgICBvbjEsCiAgICAgIHNpdCA9IHN0YXJ0KG5hbWUpID8gaW5pdCA6IHNldDsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBzY2hlZHVsZSA9IHNpdCh0aGlzLCBpZCksCiAgICAgICAgb24gPSBzY2hlZHVsZS5vbjsKCiAgICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgYSBkaXNwYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBub2RlLAogICAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSEKICAgICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLgogICAgICBpZiAob24gIT09IG9uMCkgKG9uMSA9IChvbjAgPSBvbikuY29weSgpKS5vbihuYW1lLCBsaXN0ZW5lcik7CiAgICAgIHNjaGVkdWxlLm9uID0gb24xOwogICAgfTsKICB9CiAgZnVuY3Rpb24gdHJhbnNpdGlvbl9vbiAobmFtZSwgbGlzdGVuZXIpIHsKICAgIHZhciBpZCA9IHRoaXMuX2lkOwogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyID8gZ2V0KHRoaXMubm9kZSgpLCBpZCkub24ub24obmFtZSkgOiB0aGlzLmVhY2gob25GdW5jdGlvbihpZCwgbmFtZSwgbGlzdGVuZXIpKTsKICB9CgogIGZ1bmN0aW9uIHJlbW92ZUZ1bmN0aW9uKGlkKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwogICAgICBmb3IgKHZhciBpIGluIHRoaXMuX190cmFuc2l0aW9uKSBpZiAoK2kgIT09IGlkKSByZXR1cm47CiAgICAgIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHRyYW5zaXRpb25fcmVtb3ZlICgpIHsKICAgIHJldHVybiB0aGlzLm9uKCJlbmQucmVtb3ZlIiwgcmVtb3ZlRnVuY3Rpb24odGhpcy5faWQpKTsKICB9CgogIGZ1bmN0aW9uIHRyYW5zaXRpb25fc2VsZWN0IChzZWxlY3QpIHsKICAgIHZhciBuYW1lID0gdGhpcy5fbmFtZSwKICAgICAgaWQgPSB0aGlzLl9pZDsKICAgIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSAiZnVuY3Rpb24iKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpOwogICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkgewogICAgICAgICAgaWYgKCJfX2RhdGFfXyIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187CiAgICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7CiAgICAgICAgICBzY2hlZHVsZShzdWJncm91cFtpXSwgbmFtZSwgaWQsIGksIHN1Ymdyb3VwLCBnZXQobm9kZSwgaWQpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTsKICB9CgogIGZ1bmN0aW9uIHRyYW5zaXRpb25fc2VsZWN0QWxsIChzZWxlY3QpIHsKICAgIHZhciBuYW1lID0gdGhpcy5fbmFtZSwKICAgICAgaWQgPSB0aGlzLl9pZDsKICAgIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSAiZnVuY3Rpb24iKSBzZWxlY3QgPSBzZWxlY3RvckFsbChzZWxlY3QpOwogICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gW10sIHBhcmVudHMgPSBbXSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgICAgZm9yICh2YXIgY2hpbGRyZW4gPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCksIGNoaWxkLCBpbmhlcml0ID0gZ2V0KG5vZGUsIGlkKSwgayA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGsgPCBsOyArK2spIHsKICAgICAgICAgICAgaWYgKGNoaWxkID0gY2hpbGRyZW5ba10pIHsKICAgICAgICAgICAgICBzY2hlZHVsZShjaGlsZCwgbmFtZSwgaWQsIGssIGNoaWxkcmVuLCBpbmhlcml0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgc3ViZ3JvdXBzLnB1c2goY2hpbGRyZW4pOwogICAgICAgICAgcGFyZW50cy5wdXNoKG5vZGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgcGFyZW50cywgbmFtZSwgaWQpOwogIH0KCiAgdmFyIFNlbGVjdGlvbiA9IHNlbGVjdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3I7CiAgZnVuY3Rpb24gdHJhbnNpdGlvbl9zZWxlY3Rpb24gKCkgewogICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTsKICB9CgogIGZ1bmN0aW9uIHN0eWxlTnVsbChuYW1lLCBpbnRlcnBvbGF0ZSkgewogICAgdmFyIHN0cmluZzAwLCBzdHJpbmcxMCwgaW50ZXJwb2xhdGUwOwogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHN0cmluZzAgPSBzdHlsZVZhbHVlKHRoaXMsIG5hbWUpLAogICAgICAgIHN0cmluZzEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGVWYWx1ZSh0aGlzLCBuYW1lKSk7CiAgICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbCA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCBzdHJpbmcxMCA9IHN0cmluZzEpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gc3R5bGVSZW1vdmUobmFtZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQobmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkgewogICAgdmFyIHN0cmluZzAwLAogICAgICBzdHJpbmcxID0gdmFsdWUxICsgIiIsCiAgICAgIGludGVycG9sYXRlMDsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBzdHJpbmcwID0gc3R5bGVWYWx1ZSh0aGlzLCBuYW1lKTsKICAgICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzdHlsZUZ1bmN0aW9uKG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkgewogICAgdmFyIHN0cmluZzAwLCBzdHJpbmcxMCwgaW50ZXJwb2xhdGUwOwogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHN0cmluZzAgPSBzdHlsZVZhbHVlKHRoaXMsIG5hbWUpLAogICAgICAgIHZhbHVlMSA9IHZhbHVlKHRoaXMpLAogICAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyAiIjsKICAgICAgaWYgKHZhbHVlMSA9PSBudWxsKSBzdHJpbmcxID0gdmFsdWUxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlVmFsdWUodGhpcywgbmFtZSkpOwogICAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGwgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMCA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzdHlsZU1heWJlUmVtb3ZlKGlkLCBuYW1lKSB7CiAgICB2YXIgb24wLAogICAgICBvbjEsCiAgICAgIGxpc3RlbmVyMCwKICAgICAga2V5ID0gInN0eWxlLiIgKyBuYW1lLAogICAgICBldmVudCA9ICJlbmQuIiArIGtleSwKICAgICAgcmVtb3ZlOwogICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSwKICAgICAgICBvbiA9IHNjaGVkdWxlLm9uLAogICAgICAgIGxpc3RlbmVyID0gc2NoZWR1bGUudmFsdWVba2V5XSA9PSBudWxsID8gcmVtb3ZlIHx8IChyZW1vdmUgPSBzdHlsZVJlbW92ZShuYW1lKSkgOiB1bmRlZmluZWQ7CgogICAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSwKICAgICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhCiAgICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS4KICAgICAgaWYgKG9uICE9PSBvbjAgfHwgbGlzdGVuZXIwICE9PSBsaXN0ZW5lcikgKG9uMSA9IChvbjAgPSBvbikuY29weSgpKS5vbihldmVudCwgbGlzdGVuZXIwID0gbGlzdGVuZXIpOwogICAgICBzY2hlZHVsZS5vbiA9IG9uMTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHRyYW5zaXRpb25fc3R5bGUgKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgewogICAgdmFyIGkgPSAobmFtZSArPSAiIikgPT09ICJ0cmFuc2Zvcm0iID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MgOiBpbnRlcnBvbGF0ZTsKICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gdGhpcy5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlTnVsbChuYW1lLCBpKSkub24oImVuZC5zdHlsZS4iICsgbmFtZSwgc3R5bGVSZW1vdmUobmFtZSkpIDogdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gdGhpcy5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlRnVuY3Rpb24obmFtZSwgaSwgdHdlZW5WYWx1ZSh0aGlzLCAic3R5bGUuIiArIG5hbWUsIHZhbHVlKSkpLmVhY2goc3R5bGVNYXliZVJlbW92ZSh0aGlzLl9pZCwgbmFtZSkpIDogdGhpcy5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlQ29uc3RhbnQobmFtZSwgaSwgdmFsdWUpLCBwcmlvcml0eSkub24oImVuZC5zdHlsZS4iICsgbmFtZSwgbnVsbCk7CiAgfQoKICBmdW5jdGlvbiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKHQpIHsKICAgICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCBpLmNhbGwodGhpcywgdCksIHByaW9yaXR5KTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHN0eWxlVHdlZW4obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgICB2YXIgdCwgaTA7CiAgICBmdW5jdGlvbiB0d2VlbigpIHsKICAgICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICBpZiAoaSAhPT0gaTApIHQgPSAoaTAgPSBpKSAmJiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KTsKICAgICAgcmV0dXJuIHQ7CiAgICB9CiAgICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTsKICAgIHJldHVybiB0d2VlbjsKICB9CiAgZnVuY3Rpb24gdHJhbnNpdGlvbl9zdHlsZVR3ZWVuIChuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsKICAgIHZhciBrZXkgPSAic3R5bGUuIiArIChuYW1lICs9ICIiKTsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7CiAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTsKICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBFcnJvcigpOwogICAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBzdHlsZVR3ZWVuKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gIiIgOiBwcmlvcml0eSkpOwogIH0KCiAgZnVuY3Rpb24gdGV4dENvbnN0YW50KHZhbHVlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7CiAgICB9OwogIH0KICBmdW5jdGlvbiB0ZXh0RnVuY3Rpb24odmFsdWUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciB2YWx1ZTEgPSB2YWx1ZSh0aGlzKTsKICAgICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlMSA9PSBudWxsID8gIiIgOiB2YWx1ZTE7CiAgICB9OwogIH0KICBmdW5jdGlvbiB0cmFuc2l0aW9uX3RleHQgKHZhbHVlKSB7CiAgICByZXR1cm4gdGhpcy50d2VlbigidGV4dCIsIHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIiA/IHRleHRGdW5jdGlvbih0d2VlblZhbHVlKHRoaXMsICJ0ZXh0IiwgdmFsdWUpKSA6IHRleHRDb25zdGFudCh2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZSArICIiKSk7CiAgfQoKICBmdW5jdGlvbiB0ZXh0SW50ZXJwb2xhdGUoaSkgewogICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgIHRoaXMudGV4dENvbnRlbnQgPSBpLmNhbGwodGhpcywgdCk7CiAgICB9OwogIH0KICBmdW5jdGlvbiB0ZXh0VHdlZW4odmFsdWUpIHsKICAgIHZhciB0MCwgaTA7CiAgICBmdW5jdGlvbiB0d2VlbigpIHsKICAgICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgdGV4dEludGVycG9sYXRlKGkpOwogICAgICByZXR1cm4gdDA7CiAgICB9CiAgICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTsKICAgIHJldHVybiB0d2VlbjsKICB9CiAgZnVuY3Rpb24gdHJhbnNpdGlvbl90ZXh0VHdlZW4gKHZhbHVlKSB7CiAgICB2YXIga2V5ID0gInRleHQiOwogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTsKICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpOwogICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yKCk7CiAgICByZXR1cm4gdGhpcy50d2VlbihrZXksIHRleHRUd2Vlbih2YWx1ZSkpOwogIH0KCiAgZnVuY3Rpb24gdHJhbnNpdGlvbl90cmFuc2l0aW9uICgpIHsKICAgIHZhciBuYW1lID0gdGhpcy5fbmFtZSwKICAgICAgaWQwID0gdGhpcy5faWQsCiAgICAgIGlkMSA9IG5ld0lkKCk7CiAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICB2YXIgaW5oZXJpdCA9IGdldChub2RlLCBpZDApOwogICAgICAgICAgc2NoZWR1bGUobm9kZSwgbmFtZSwgaWQxLCBpLCBncm91cCwgewogICAgICAgICAgICB0aW1lOiBpbmhlcml0LnRpbWUgKyBpbmhlcml0LmRlbGF5ICsgaW5oZXJpdC5kdXJhdGlvbiwKICAgICAgICAgICAgZGVsYXk6IDAsCiAgICAgICAgICAgIGR1cmF0aW9uOiBpbmhlcml0LmR1cmF0aW9uLAogICAgICAgICAgICBlYXNlOiBpbmhlcml0LmVhc2UKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKGdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQxKTsKICB9CgogIGZ1bmN0aW9uIHRyYW5zaXRpb25fZW5kICgpIHsKICAgIHZhciBvbjAsCiAgICAgIG9uMSwKICAgICAgdGhhdCA9IHRoaXMsCiAgICAgIGlkID0gdGhhdC5faWQsCiAgICAgIHNpemUgPSB0aGF0LnNpemUoKTsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIHZhciBjYW5jZWwgPSB7CiAgICAgICAgICB2YWx1ZTogcmVqZWN0CiAgICAgICAgfSwKICAgICAgICBlbmQgPSB7CiAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoLS1zaXplID09PSAwKSByZXNvbHZlKCk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgdGhhdC5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLAogICAgICAgICAgb24gPSBzY2hlZHVsZS5vbjsKCiAgICAgICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsCiAgICAgICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhCiAgICAgICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLgogICAgICAgIGlmIChvbiAhPT0gb24wKSB7CiAgICAgICAgICBvbjEgPSAob24wID0gb24pLmNvcHkoKTsKICAgICAgICAgIG9uMS5fLmNhbmNlbC5wdXNoKGNhbmNlbCk7CiAgICAgICAgICBvbjEuXy5pbnRlcnJ1cHQucHVzaChjYW5jZWwpOwogICAgICAgICAgb24xLl8uZW5kLnB1c2goZW5kKTsKICAgICAgICB9CiAgICAgICAgc2NoZWR1bGUub24gPSBvbjE7CiAgICAgIH0pOwoKICAgICAgLy8gVGhlIHNlbGVjdGlvbiB3YXMgZW1wdHksIHJlc29sdmUgZW5kIGltbWVkaWF0ZWx5CiAgICAgIGlmIChzaXplID09PSAwKSByZXNvbHZlKCk7CiAgICB9KTsKICB9CgogIHZhciBpZCA9IDA7CiAgZnVuY3Rpb24gVHJhbnNpdGlvbihncm91cHMsIHBhcmVudHMsIG5hbWUsIGlkKSB7CiAgICB0aGlzLl9ncm91cHMgPSBncm91cHM7CiAgICB0aGlzLl9wYXJlbnRzID0gcGFyZW50czsKICAgIHRoaXMuX25hbWUgPSBuYW1lOwogICAgdGhpcy5faWQgPSBpZDsKICB9CiAgZnVuY3Rpb24gbmV3SWQoKSB7CiAgICByZXR1cm4gKytpZDsKICB9CiAgdmFyIHNlbGVjdGlvbl9wcm90b3R5cGUgPSBzZWxlY3Rpb24ucHJvdG90eXBlOwogIFRyYW5zaXRpb24ucHJvdG90eXBlID0gewogICAgY29uc3RydWN0b3I6IFRyYW5zaXRpb24sCiAgICBzZWxlY3Q6IHRyYW5zaXRpb25fc2VsZWN0LAogICAgc2VsZWN0QWxsOiB0cmFuc2l0aW9uX3NlbGVjdEFsbCwKICAgIHNlbGVjdENoaWxkOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNlbGVjdENoaWxkLAogICAgc2VsZWN0Q2hpbGRyZW46IHNlbGVjdGlvbl9wcm90b3R5cGUuc2VsZWN0Q2hpbGRyZW4sCiAgICBmaWx0ZXI6IHRyYW5zaXRpb25fZmlsdGVyLAogICAgbWVyZ2U6IHRyYW5zaXRpb25fbWVyZ2UsCiAgICBzZWxlY3Rpb246IHRyYW5zaXRpb25fc2VsZWN0aW9uLAogICAgdHJhbnNpdGlvbjogdHJhbnNpdGlvbl90cmFuc2l0aW9uLAogICAgY2FsbDogc2VsZWN0aW9uX3Byb3RvdHlwZS5jYWxsLAogICAgbm9kZXM6IHNlbGVjdGlvbl9wcm90b3R5cGUubm9kZXMsCiAgICBub2RlOiBzZWxlY3Rpb25fcHJvdG90eXBlLm5vZGUsCiAgICBzaXplOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNpemUsCiAgICBlbXB0eTogc2VsZWN0aW9uX3Byb3RvdHlwZS5lbXB0eSwKICAgIGVhY2g6IHNlbGVjdGlvbl9wcm90b3R5cGUuZWFjaCwKICAgIG9uOiB0cmFuc2l0aW9uX29uLAogICAgYXR0cjogdHJhbnNpdGlvbl9hdHRyLAogICAgYXR0clR3ZWVuOiB0cmFuc2l0aW9uX2F0dHJUd2VlbiwKICAgIHN0eWxlOiB0cmFuc2l0aW9uX3N0eWxlLAogICAgc3R5bGVUd2VlbjogdHJhbnNpdGlvbl9zdHlsZVR3ZWVuLAogICAgdGV4dDogdHJhbnNpdGlvbl90ZXh0LAogICAgdGV4dFR3ZWVuOiB0cmFuc2l0aW9uX3RleHRUd2VlbiwKICAgIHJlbW92ZTogdHJhbnNpdGlvbl9yZW1vdmUsCiAgICB0d2VlbjogdHJhbnNpdGlvbl90d2VlbiwKICAgIGRlbGF5OiB0cmFuc2l0aW9uX2RlbGF5LAogICAgZHVyYXRpb246IHRyYW5zaXRpb25fZHVyYXRpb24sCiAgICBlYXNlOiB0cmFuc2l0aW9uX2Vhc2UsCiAgICBlYXNlVmFyeWluZzogdHJhbnNpdGlvbl9lYXNlVmFyeWluZywKICAgIGVuZDogdHJhbnNpdGlvbl9lbmQsCiAgICBbU3ltYm9sLml0ZXJhdG9yXTogc2VsZWN0aW9uX3Byb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdCiAgfTsKCiAgZnVuY3Rpb24gY3ViaWNJbk91dCh0KSB7CiAgICByZXR1cm4gKCh0ICo9IDIpIDw9IDEgPyB0ICogdCAqIHQgOiAodCAtPSAyKSAqIHQgKiB0ICsgMikgLyAyOwogIH0KCiAgdmFyIGRlZmF1bHRUaW1pbmcgPSB7CiAgICB0aW1lOiBudWxsLAogICAgLy8gU2V0IG9uIHVzZS4KICAgIGRlbGF5OiAwLAogICAgZHVyYXRpb246IDI1MCwKICAgIGVhc2U6IGN1YmljSW5PdXQKICB9OwogIGZ1bmN0aW9uIGluaGVyaXQobm9kZSwgaWQpIHsKICAgIHZhciB0aW1pbmc7CiAgICB3aGlsZSAoISh0aW1pbmcgPSBub2RlLl9fdHJhbnNpdGlvbikgfHwgISh0aW1pbmcgPSB0aW1pbmdbaWRdKSkgewogICAgICBpZiAoIShub2RlID0gbm9kZS5wYXJlbnROb2RlKSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgdHJhbnNpdGlvbiAke2lkfSBub3QgZm91bmRgKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRpbWluZzsKICB9CiAgZnVuY3Rpb24gc2VsZWN0aW9uX3RyYW5zaXRpb24gKG5hbWUpIHsKICAgIHZhciBpZCwgdGltaW5nOwogICAgaWYgKG5hbWUgaW5zdGFuY2VvZiBUcmFuc2l0aW9uKSB7CiAgICAgIGlkID0gbmFtZS5faWQsIG5hbWUgPSBuYW1lLl9uYW1lOwogICAgfSBlbHNlIHsKICAgICAgaWQgPSBuZXdJZCgpLCAodGltaW5nID0gZGVmYXVsdFRpbWluZykudGltZSA9IG5vdygpLCBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyAiIjsKICAgIH0KICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkLCBpLCBncm91cCwgdGltaW5nIHx8IGluaGVyaXQobm9kZSwgaWQpKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbihncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTsKICB9CgogIHNlbGVjdGlvbi5wcm90b3R5cGUuaW50ZXJydXB0ID0gc2VsZWN0aW9uX2ludGVycnVwdDsKICBzZWxlY3Rpb24ucHJvdG90eXBlLnRyYW5zaXRpb24gPSBzZWxlY3Rpb25fdHJhbnNpdGlvbjsKCiAgZnVuY3Rpb24gVHJhbnNmb3JtKGssIHgsIHkpIHsKICAgIHRoaXMuayA9IGs7CiAgICB0aGlzLnggPSB4OwogICAgdGhpcy55ID0geTsKICB9CiAgVHJhbnNmb3JtLnByb3RvdHlwZSA9IHsKICAgIGNvbnN0cnVjdG9yOiBUcmFuc2Zvcm0sCiAgICBzY2FsZTogZnVuY3Rpb24gKGspIHsKICAgICAgcmV0dXJuIGsgPT09IDEgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmsgKiBrLCB0aGlzLngsIHRoaXMueSk7CiAgICB9LAogICAgdHJhbnNsYXRlOiBmdW5jdGlvbiAoeCwgeSkgewogICAgICByZXR1cm4geCA9PT0gMCAmIHkgPT09IDAgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmssIHRoaXMueCArIHRoaXMuayAqIHgsIHRoaXMueSArIHRoaXMuayAqIHkpOwogICAgfSwKICAgIGFwcGx5OiBmdW5jdGlvbiAocG9pbnQpIHsKICAgICAgcmV0dXJuIFtwb2ludFswXSAqIHRoaXMuayArIHRoaXMueCwgcG9pbnRbMV0gKiB0aGlzLmsgKyB0aGlzLnldOwogICAgfSwKICAgIGFwcGx5WDogZnVuY3Rpb24gKHgpIHsKICAgICAgcmV0dXJuIHggKiB0aGlzLmsgKyB0aGlzLng7CiAgICB9LAogICAgYXBwbHlZOiBmdW5jdGlvbiAoeSkgewogICAgICByZXR1cm4geSAqIHRoaXMuayArIHRoaXMueTsKICAgIH0sCiAgICBpbnZlcnQ6IGZ1bmN0aW9uIChsb2NhdGlvbikgewogICAgICByZXR1cm4gWyhsb2NhdGlvblswXSAtIHRoaXMueCkgLyB0aGlzLmssIChsb2NhdGlvblsxXSAtIHRoaXMueSkgLyB0aGlzLmtdOwogICAgfSwKICAgIGludmVydFg6IGZ1bmN0aW9uICh4KSB7CiAgICAgIHJldHVybiAoeCAtIHRoaXMueCkgLyB0aGlzLms7CiAgICB9LAogICAgaW52ZXJ0WTogZnVuY3Rpb24gKHkpIHsKICAgICAgcmV0dXJuICh5IC0gdGhpcy55KSAvIHRoaXMuazsKICAgIH0sCiAgICByZXNjYWxlWDogZnVuY3Rpb24gKHgpIHsKICAgICAgcmV0dXJuIHguY29weSgpLmRvbWFpbih4LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCwgdGhpcykubWFwKHguaW52ZXJ0LCB4KSk7CiAgICB9LAogICAgcmVzY2FsZVk6IGZ1bmN0aW9uICh5KSB7CiAgICAgIHJldHVybiB5LmNvcHkoKS5kb21haW4oeS5yYW5nZSgpLm1hcCh0aGlzLmludmVydFksIHRoaXMpLm1hcCh5LmludmVydCwgeSkpOwogICAgfSwKICAgIHRvU3RyaW5nOiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiAidHJhbnNsYXRlKCIgKyB0aGlzLnggKyAiLCIgKyB0aGlzLnkgKyAiKSBzY2FsZSgiICsgdGhpcy5rICsgIikiOwogICAgfQogIH07CiAgVHJhbnNmb3JtLnByb3RvdHlwZTsKCiAgLyoKICAgIEhURE1hdGggU3RhdGljIENsYXNzIC0gTm90IGludGVuZGVkIGZvciBpbnN0YW50aWF0aW9uIQoKICAgIE1vZGVsIHBhcmFtZXRlcnM6CiAgICAgIGsgPSBkaXNjb3VudCBmYWN0b3IgKDAsIEluZmluaXR5KQoKICAgIEJlaGF2aW9yYWwgdmFyaWFibGVzOgogICAgICBBID0gYW1vdW50CiAgICAgIEQgPSBkZWxheQogICAgICBWID0gc3ViamVjdGl2ZSB2YWx1ZQoKICAgIEVxdWF0aW9uczoKICAgICAgViA9IEEgLyAoMSArIGtEKQogICAgICBrID0gKEEgLSBWKSAvIChWRCkKICAqLwogIGNsYXNzIEhURE1hdGggewogICAgc3RhdGljIGsgPSB7CiAgICAgIERFRkFVTFQ6IDAuMDUsCiAgICAgIE1JTjogMCwKICAgICAgTUFYOiAxMDAsCiAgICAgIFNURVA6IDAuMDAxLAogICAgICBKVU1QOiAwLjAxCiAgICB9OwogICAgc3RhdGljIGFkazJ2KGEsIGQsIGspIHsKICAgICAgcmV0dXJuIGEgLyAoMSArIGsgKiBkKTsKICAgIH0KICAgIHN0YXRpYyBhZHYyayhhLCBkLCB2KSB7CiAgICAgIHJldHVybiAoYSAtIHYpIC8gKHYgKiBkKTsKICAgIH0KICB9CgogIC8vIEludGVybmFsIGRlcGVuZGVuY2llcwoKICAvKiBlc2xpbnQgbm8tcmVzdHJpY3RlZC1nbG9iYWxzOiBbIm9mZiIsICJzZWxmIl0gKi8KCiAgc2VsZi5vbm1lc3NhZ2UgPSBldmVudCA9PiB7CiAgICBjb25zdCBwYXJhbXMgPSB7CiAgICAgIGs6IHsKICAgICAgICB0eXBlOiAncmVhbCcsCiAgICAgICAgbG93ZXI6IEhURE1hdGguay5NSU4sCiAgICAgICAgdXBwZXI6IEhURE1hdGguay5NQVgKICAgICAgfSwKICAgICAgbHVjZTogewogICAgICAgIHR5cGU6ICdyZWFsJywKICAgICAgICBsb3dlcjogMCwKICAgICAgICB1cHBlcjogMTAwCiAgICAgIH0KICAgIH07CiAgICBjb25zdCBsb2dQb3N0ID0gKHN0YXRlLCBkYXRhKSA9PiB7CiAgICAgIGxldCBscCA9IDA7CgogICAgICAvLyBQcmlvcnMKICAgICAgY29uc3Qga01lYW4gPSAyOwogICAgICBjb25zdCBrU2hhcGUgPSAzOwogICAgICBscCArPSBkaXN0cmlidXRpb25zRXhwb3J0cy5nYW1tYShzdGF0ZS5rLCBrU2hhcGUsIGtTaGFwZSAvIGtNZWFuKTsKICAgICAgLy8gbHAgKz0gQmF5ZXNEaXN0cmlidXRpb25zLnVuaWYoc3RhdGUuaywgMCwgMTAwKTsKCiAgICAgIGNvbnN0IGx1Y2VNZWFuID0gMjsKICAgICAgY29uc3QgbHVjZVNoYXBlID0gMzsKICAgICAgbHAgKz0gZGlzdHJpYnV0aW9uc0V4cG9ydHMuZ2FtbWEoc3RhdGUubHVjZSwgbHVjZVNoYXBlLCBsdWNlU2hhcGUgLyBsdWNlTWVhbik7CiAgICAgIC8vIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy51bmlmKHN0YXRlLmx1Y2UsIDAsIDEwMCk7CgogICAgICAvLyBMaWtlbGlob29kCiAgICAgIGRhdGEuZm9yRWFjaChjaG9pY2UgPT4gewogICAgICAgIC8vIFZhbHVlcwogICAgICAgIGNvbnN0IHZzID0gSFRETWF0aC5hZGsydihjaG9pY2UuYXMsIGNob2ljZS5kcywgc3RhdGUuayk7CiAgICAgICAgY29uc3QgdmwgPSBIVERNYXRoLmFkazJ2KGNob2ljZS5hbCwgY2hvaWNlLmRsLCBzdGF0ZS5rKTsKCiAgICAgICAgLy8gQ2hvaWNlIG9mIHNvb25lciBvciBsYXRlciBpcyBzYW1wbGVkIGZyb20gYSBCZXJub3VsbGkgZGlzdHJpYnV0aW9uCiAgICAgICAgLy8gTHVjZSBjaG9pY2UgcnVsZSBpcyB1c2VkIHRvIGNvbXB1dGUgcHJvYmFiaWxpdHkgb2Ygd2FpdGluZyEgKDAgPSBzb29uZXIsIDEgPSBsYXRlcikKICAgICAgICBjb25zdCBiaW52YWwgPSAxIC8gKDEgKyBNYXRoLmV4cChzdGF0ZS5sdWNlICogKHZzIC0gdmwpKSk7CgogICAgICAgIC8vIEFjdHVhbCByZXNwb25zZQogICAgICAgIGNvbnN0IHJlc3BvbnNlID0gY2hvaWNlLnJlc3BvbnNlID09PSAnZmlyc3QnID8gMCA6IDE7CiAgICAgICAgbHAgKz0gZGlzdHJpYnV0aW9uc0V4cG9ydHMuYmVybihyZXNwb25zZSwgYmludmFsKTsKICAgICAgfSk7CiAgICAgIHJldHVybiBscDsKICAgIH07CgogICAgLy8gSW5pdGlhbGl6aW5nIHRoZSBzYW1wbGVyCiAgICBjb25zdCBzYW1wbGVyID0gbmV3IG1jbWNFeHBvcnRzLkFtd2dTYW1wbGVyKHBhcmFtcywgbG9nUG9zdCwgZXZlbnQuZGF0YSk7CiAgICAvLyBCdXJuaW5nIHNvbWUgc2FtcGxlcyB0byB0aGUgTUNNQyBnb2RzIGFuZCBzYW1wbGluZyA1MDAwIGRyYXdzCiAgICBzYW1wbGVyLmJ1cm4oMTAwMCk7CiAgICBjb25zdCBzYW1wbGVzID0gc2FtcGxlci5zYW1wbGUoNTAwMCk7CgogICAgLy8gRXh0cmFjdCBzdW1tYXJ5IHN0YXRzCiAgICBjb25zdCByZXN1bHRzID0gewogICAgICBrOiBtZWRpYW4oc2FtcGxlcy5rKSwKICAgICAgbHVjZTogbWVkaWFuKHNhbXBsZXMubHVjZSkKICAgIH07CiAgICBzZWxmLnBvc3RNZXNzYWdlKHsKICAgICAgcmVzdWx0czogcmVzdWx0cywKICAgICAgc2FtcGxlczogc2FtcGxlcwogICAgfSk7CiAgfTsKCn0pKCk7Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWh0ZC1maXQtd29ya2VyLmpzLm1hcAoK","data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRkLWZpdC13b3JrZXIuanMiLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9iYXllcy5qcy9kaXN0cmlidXRpb25zLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2JheWVzLmpzL21jbWMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2FzY2VuZGluZy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbnVtYmVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9zb3J0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9tYXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL21pbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvcXVpY2tzZWxlY3QuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3F1YW50aWxlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9tZWRpYW4uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtZGlzcGF0Y2gvc3JjL2Rpc3BhdGNoLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvbmFtZXNwYWNlcy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL25hbWVzcGFjZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL2NyZWF0b3IuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rvci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9zZWxlY3QuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9hcnJheS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdG9yQWxsLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NlbGVjdEFsbC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL21hdGNoZXIuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0Q2hpbGQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vc2VsZWN0Q2hpbGRyZW4uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZmlsdGVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NwYXJzZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9lbnRlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL2NvbnN0YW50LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2RhdGEuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZXhpdC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9qb2luLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL21lcmdlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL29yZGVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NvcnQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vY2FsbC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9ub2Rlcy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9ub2RlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3NpemUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZW1wdHkuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vZWFjaC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9hdHRyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvd2luZG93LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3N0eWxlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3Byb3BlcnR5LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2NsYXNzZWQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vdGV4dC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9odG1sLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL3JhaXNlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2xvd2VyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2FwcGVuZC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1zZWxlY3Rpb24vc3JjL3NlbGVjdGlvbi9pbnNlcnQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtc2VsZWN0aW9uL3NyYy9zZWxlY3Rpb24vcmVtb3ZlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2Nsb25lLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2RhdHVtLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL29uLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2Rpc3BhdGNoLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2l0ZXJhdG9yLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXNlbGVjdGlvbi9zcmMvc2VsZWN0aW9uL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWNvbG9yL3NyYy9kZWZpbmUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtY29sb3Ivc3JjL2NvbG9yLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9jb25zdGFudC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvY29sb3IuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3JnYi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvbnVtYmVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWludGVycG9sYXRlL3NyYy9zdHJpbmcuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3RyYW5zZm9ybS9kZWNvbXBvc2UuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtaW50ZXJwb2xhdGUvc3JjL3RyYW5zZm9ybS9wYXJzZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1pbnRlcnBvbGF0ZS9zcmMvdHJhbnNmb3JtL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRpbWVyL3NyYy90aW1lci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10aW1lci9zcmMvdGltZW91dC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NjaGVkdWxlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL2ludGVycnVwdC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy9zZWxlY3Rpb24vaW50ZXJydXB0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vdHdlZW4uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9pbnRlcnBvbGF0ZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2F0dHIuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9hdHRyVHdlZW4uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9kZWxheS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2R1cmF0aW9uLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZWFzZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL2Vhc2VWYXJ5aW5nLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZmlsdGVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vbWVyZ2UuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi9vbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3JlbW92ZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdEFsbC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3NlbGVjdGlvbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3N0eWxlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vc3R5bGVUd2Vlbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy10cmFuc2l0aW9uL3NyYy90cmFuc2l0aW9uL3RleHQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90ZXh0VHdlZW4uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvdHJhbnNpdGlvbi90cmFuc2l0aW9uLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vZW5kLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXRyYW5zaXRpb24vc3JjL3RyYW5zaXRpb24vaW5kZXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtZWFzZS9zcmMvY3ViaWMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL3RyYW5zaXRpb24uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtdHJhbnNpdGlvbi9zcmMvc2VsZWN0aW9uL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLXpvb20vc3JjL3RyYW5zZm9ybS5qcyIsIi4uL2Rpc2NvdW50YWJsZS1tYXRoL3NyYy9odGQtbWF0aC5qcyIsIi4uL2Rpc2NvdW50YWJsZS1tYXRoL3NyYy9pbmRleC5qcyIsInNyYy9jb21wb25lbnRzL2h0ZC1maXQtd29ya2VyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5cbi8vIEEgbnVtYmVyIG9mIGxvZyBwcm9iYWJpbGl0eSBkZW5zaXR5IGZ1bmN0aW9ucyAoUERGKS4gTmFtaW5nIGFuZCBwYXJhbWV0ZXJpemF0aW9uXG4vLyBzaG91bGQgbWF0Y2ggUidzLCBleGNlcHQgZm9yIHRoYXQgYWxsIGZ1bmN0aW9ucyByZXNpZGUgaW4gYW4gbGQgb2JqZWN0IChcbi8vIGFzIGluIFwibG9nIGRlbnNpdHlcIiksIHNvIHRvIGdldCBhIG5vcm1hbCBsb2cgZGVuc2l0eSB5b3Ugd291bGQgd3JpdGVcbi8vIGxkLm5vcm0oLi4uKS5cbi8vIE1vc3Qgb2YgdGhlIGNvZGUgYmVsb3cgaXMgZGlyZWN0bHkgdGFrZW4gZnJvbSB0aGUgZ3JlYXQgSnN0YXQgcHJvamVjdFxuLy8gKGh0dHBzOi8vZ2l0aHViLmNvbS9qc3RhdC8pIHdoaWNoIGluY2x1ZGVzIFBERiBmb3IgbWFueSBjb21tb24gcHJvYmFiaWxpdHlcbi8vIGRpc3RyaWJ1dGlvbnMuIFdoYXQgSSBoYXZlIGRvbmUgaXMgb25seSB0byBjb252ZXJ0IHRoZXNlIHRvIGxvZyBQREZzLlxuXG4vKlxuT3JpZ2luYWwgd29yayBDb3B5cmlnaHQgKGMpIDIwMTMgalN0YXRcbk1vZGlmaWVkIHdvcmsgQ29weXJpZ2h0IChjKSAyMDE1IFJhc211cyBCw6XDpXRoIFxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG5vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG5pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG50byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG5jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG5hbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG5GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG5PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG5USEUgU09GVFdBUkUuXG5cbiovXG5cblxuLy8gVGhpcyBib2lsZXIgcGxhdGUgY29kZSBoZXJlIGlzIHRha2VuIGZyb206XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdW1kanMvdW1kL2Jsb2IvbWFzdGVyL3RlbXBsYXRlcy9yZXR1cm5FeHBvcnRzLmpzXG4vLyBJdCBzaG91bGQgbWFrZSBzaHVyZSB0aGF0IG1vZHVsZSBjYW4gYmUgaW1wb3J0ZWQgYm90aCBpbiB0aGUgYnJvd3Nlcixcbi8vIE5vZGUsIGFuZCBieSB1c2luZyB0aGUgQXN5bmNocm9ub3VzIE1vZHVsZSBEZWZpbml0aW9uIHN0YW5kYXJkLlxuLy8gSWYgdGhpcyBtb2R1bGUgaXMgbG9hZGVkIGluIHRoZSBicm93c2VyIGl0IHdpbGwgY3JlYXRlZCB0aGUgZ2xvYmFsXG4vLyBvYmplY3QgbGQgLlxuKGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICAvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuXG4gICAgICAgIGRlZmluZShbXSwgZmFjdG9yeSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgICAgICAvLyBOb2RlLiBEb2VzIG5vdCB3b3JrIHdpdGggc3RyaWN0IENvbW1vbkpTLCBidXRcbiAgICAgICAgLy8gb25seSBDb21tb25KUy1saWtlIGVudmlyb25tZW50cyB0aGF0IHN1cHBvcnQgbW9kdWxlLmV4cG9ydHMsXG4gICAgICAgIC8vIGxpa2UgTm9kZS5cbiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzIChyb290IGlzIHdpbmRvdylcbiAgICAgICAgcm9vdC5sZCA9IGZhY3RvcnkoKTtcbiAgfVxufSh0aGlzLCBmdW5jdGlvbigpIHtcbiAgLy8gT2JqZWN0IHRvIGhvbGQgdGhlIGZ1bmN0aW9ucyB0byBiZSBleHBvcnRlZC5cbiAgdmFyIGxkICA9IHt9O1xuICBcbiAgLy8vLy8vLy8vLyBIZWxwZXIgZnVuY3Rpb25zIC8vLy8vLy8vLy9cbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgXG4gIHZhciBsZ2FtbWEgPSBmdW5jdGlvbih4KSB7XG4gICAgdmFyIGogPSAwO1xuICAgIHZhciBjb2YgPSBbXG4gICAgICA3Ni4xODAwOTE3Mjk0NzE0NiwgLTg2LjUwNTMyMDMyOTQxNjc3LCAyNC4wMTQwOTgyNDA4MzA5MSxcbiAgICAgIC0xLjIzMTczOTU3MjQ1MDE1NSwgMC4xMjA4NjUwOTczODY2MTc5ZS0yLCAtMC41Mzk1MjM5Mzg0OTUzZS01XG4gICAgXTtcbiAgICB2YXIgc2VyID0gMS4wMDAwMDAwMDAxOTAwMTU7XG4gICAgdmFyIHh4LCB5LCB0bXA7XG4gICAgdG1wID0gKHkgPSB4eCA9IHgpICsgNS41O1xuICAgIHRtcCAtPSAoeHggKyAwLjUpICogbG9nKHRtcCk7XG4gICAgZm9yICg7IGogPCA2OyBqKyspXG4gICAgICBzZXIgKz0gY29mW2pdIC8gKyt5O1xuICAgIHJldHVybiBsb2coMi41MDY2MjgyNzQ2MzEwMDA1ICogc2VyIC8geHgpIC0gdG1wO1xuICB9O1xuICBsZC5sZ2FtbWEgPSBsZ2FtbWE7XG4gIFxuICB2YXIgbGZhY3RvcmlhbCA9IGZ1bmN0aW9uKG4pIHtcbiAgICByZXR1cm4gbiA8IDAgPyBOYU4gOiBsZ2FtbWEobiArIDEpO1xuICB9O1xuICBsZC5sZmFjdG9yaWFsID0gbGZhY3RvcmlhbDtcbiAgXG4gIHZhciBsY2hvb3NlID0gZnVuY3Rpb24obiwgayl7XG4gICAgcmV0dXJuIGxmYWN0b3JpYWwobikgLSBsZmFjdG9yaWFsKGspIC0gbGZhY3RvcmlhbChuIC0gayk7XG4gIH07XG4gIGxkLmxjaG9vc2UgPSBsY2hvb3NlO1xuICBcbiAgdmFyIGxiZXRhID0gZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBsZ2FtbWEoYSkgKyBsZ2FtbWEoYikgLSBsZ2FtbWEoYSArIGIpO1xuICB9O1xuICBsZC5sYmV0YSA9IGxiZXRhO1xuICBcbiAgdmFyIGxvZyAgPSBNYXRoLmxvZztcbiAgdmFyIGV4cCAgPSBNYXRoLmV4cDtcbiAgdmFyIGFicyAgPSBNYXRoLmFicztcbiAgdmFyIHBvdyAgPSBNYXRoLnBvdztcbiAgdmFyIHNxcnQgPSBNYXRoLnNxcnQ7XG4gIHZhciBwaSAgID0gTWF0aC5QSTtcbiAgXG4gIC8vLy8vLy8vLy8gQ29udGlub3VzIGRpc3RyaWJ1dGlvbnMgLy8vLy8vLy8vL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgXG4gIGxkLmJldGEgPSBmdW5jdGlvbih4LCBzaGFwZTEsIHNoYXBlMikge1xuICAgIGlmICh4ID4gMSB8fCB4IDwgMCkge1xuICAgICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgIH1cbiAgICBpZihzaGFwZTEgPT09IDEgJiYgc2hhcGUyID09PSAxKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIChzaGFwZTEgLSAxKSAqIGxvZyh4KSArIChzaGFwZTIgLSAxKSAqIGxvZygxIC0geCkgLSBsYmV0YShzaGFwZTEsIHNoYXBlMik7ICBcbiAgICB9XG4gIH07XG4gIFxuICBsZC5jYXVjaHkgPSBmdW5jdGlvbih4LCBsb2NhdGlvbiwgc2NhbGUpIHtcbiAgICByZXR1cm4gbG9nKHNjYWxlKSAtIGxvZyhwb3coeCAtIGxvY2F0aW9uLCAyKSArIHBvdyhzY2FsZSwgMikpICAtIGxvZyhwaSk7XG4gIH07XG4gIFxuICBsZC5ub3JtID0gZnVuY3Rpb24oeCwgbWVhbiwgc2QpIHtcbiAgICAgIHJldHVybiAtMC41ICogbG9nKDIgKiBwaSkgLWxvZyhzZCkgLSBwb3coeCAtIG1lYW4sIDIpIC8gKDIgKiBzZCAqIHNkKTtcbiAgfTtcblxuICAvLyBBIGJpdmFyaWF0ZSBOb3JtYWwgZGlzdHJpYnV0aW9uIHBhcmFtZXRlcml6ZWQgYnkgYXJyYXlzIG9mIHR3byBtZWFucyBhbmQgU0RzLCBhbmQgXG4gIC8vIHRoZSBjb3JyZWxhdGlvbi5cbiAgbGQuYml2YXJub3JtID0gZnVuY3Rpb24oeCwgbWVhbiwgc2QsIGNvcnIpIHtcbiAgICB2YXIgeiA9IHBvdyh4WzBdIC0gbWVhblswXSwgMikgLyBwb3coc2RbMF0sIDIpICtcbiAgICAgICAgICAgIHBvdyh4WzFdIC0gbWVhblsxXSwgMikgLyBwb3coc2RbMV0sIDIpIC0gXG4gICAgICAgICAgICAoMiAqIGNvcnIgKiAoeFswXSAtIG1lYW5bMF0pICogKHhbMV0gLSBtZWFuWzFdKSkgLyAoc2RbMF0gKiBzZFsxXSk7XG4gICAgdmFyIG5vcm1hbGl6aW5nX2ZhY3RvciA9IC0oIGxvZygyKSArIGxvZyhwaSkgKyBsb2coc2RbMF0pICsgbG9nKHNkWzFdKSArIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjUgKiBsb2coMSAtIHBvdyhjb3JyLCAyKSkgKTsgXG4gICAgdmFyIGJpdmFyX2xvZ19kZW5zID0gbm9ybWFsaXppbmdfZmFjdG9yIC0geiAvICgyICogKDEgLSBwb3coY29yciwgMikgKSApOyBcbiAgICByZXR1cm4gYml2YXJfbG9nX2RlbnM7XG4gIH07XG4gIFxuXG4gIGxkLmxhcGxhY2UgPSBmdW5jdGlvbih4LCBsb2NhdGlvbiwgc2NhbGUpIHtcbiAgICByZXR1cm4gKC1hYnMoeCAtIGxvY2F0aW9uKS9zY2FsZSkgLSBsb2coMiAqIHNjYWxlKTtcbiAgfTtcbiAgXG4gIGxkLmRleHAgPSBsZC5sYXBsYWNlO1xuICBcbiAgbGQuZ2FtbWEgPSBmdW5jdGlvbih4LCBzaGFwZSwgcmF0ZSkge1xuICAgIHZhciBzY2FsZSA9IDEgLyByYXRlO1xuICAgIGlmICh4IDwgMCkge1xuICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICB9XG4gICAgaWYoKHggPT09IDAgJiYgc2hhcGUgPT09IDEpICkge1xuICAgICAgcmV0dXJuIC1sb2coc2NhbGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKHNoYXBlIC0gMSkgKiBsb2coeCkgLSB4IC8gc2NhbGUgLSBsZ2FtbWEoc2hhcGUpIC0gc2hhcGUgKiBsb2coc2NhbGUpO1xuICAgIH1cbiAgfTtcbiAgXG4gIGxkLmludmdhbW1hID0gZnVuY3Rpb24oeCwgc2hhcGUsIHNjYWxlKSB7XG4gICAgICBpZiAoeCA8PSAwKSB7XG4gICAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgICB9XG4gICAgICByZXR1cm4gLShzaGFwZSArIDEpICogbG9nKHgpIC0gc2NhbGUgLyB4IC0gbGdhbW1hKHNoYXBlKSArIHNoYXBlICogbG9nKHNjYWxlKTtcbiAgICB9O1xuICBcbiAgbGQubG5vcm0gPSAgZnVuY3Rpb24oeCwgbWVhbmxvZywgc2Rsb2cpIHtcbiAgICBpZiAoeCA8PSAwKSB7XG4gICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgIH1cbiAgICByZXR1cm4gLWxvZyh4KSAtIDAuNSAqIGxvZygyICogcGkpIC0gbG9nKHNkbG9nKSAtIFxuICAgICAgICAgICAgcG93KGxvZyh4KSAtIG1lYW5sb2csIDIpIC8gKDIgKiBzZGxvZyAqIHNkbG9nKTtcbiAgfTtcbiAgXG4gIGxkLnBhcmV0byA9IGZ1bmN0aW9uKHgsIHNjYWxlLCBzaGFwZSkge1xuICAgIGlmICh4IDwgc2NhbGUpIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfVxuICAgIHJldHVybiBsb2coc2hhcGUpICsgc2hhcGUgKiBsb2coc2NhbGUpIC0gKHNoYXBlICsgMSkgKiBsb2coeCk7XG4gIH07XG4gIFxuICBsZC50ICA9ICBmdW5jdGlvbih4LCBsb2NhdGlvbiwgc2NhbGUsIGRmKSB7XG4gICAgZGYgPSBkZiA+IDFlMTAwID8gMWUxMDAgOiBkZjtcbiAgICByZXR1cm4gbGdhbW1hKChkZiArIDEpLzIpIC0gbGdhbW1hKGRmLzIpIC0gbG9nKHNxcnQocGkgKiBkZikgKiBzY2FsZSkgK1xuICAgICAgICAgICBsb2cocG93KDEgKyAoMS9kZikgKiBwb3coKHggLSBsb2NhdGlvbikvc2NhbGUsIDIpLCAtKGRmICsgMSkvMikpO1xuICB9O1xuICBcbiAgLy8gVGhpcyBpcyBhIGRpcmVjdCBqYXZhc2NyaXB0IHRyYW5zbGF0aW9uIG9mIHRoZSBSIGNvZGUgdXNlZCB0byBldmFsdWF0ZVxuICAvLyB0aGUgbG9nIGRlbnNpdHkgb2YgYSB3ZWlidWxsIGRpc3RyaWJ1dGlvbjogXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93Y2gvci1zb3VyY2UvYmxvYi9iMTU2ZTNhNzExOTY3ZjU4MTMxZTIzYzFiMWRjMWVhOTBlMmYwYzQzL3NyYy9ubWF0aC9kd2VpYnVsbC5jXG4gIGxkLndlaWJ1bGwgPSBmdW5jdGlvbih4LCBzaGFwZSwgc2NhbGUpIHtcbiAgICBpZiAoeCA8IDApIHJldHVybiAtSW5maW5pdHk7XG4gICAgaWYoeCA9PT0gMCAmJiBzaGFwZSA8IDEpIHJldHVybiBJbmZpbml0eTtcbiAgICB2YXIgdG1wMSA9IHBvdyh4IC8gc2NhbGUsIHNoYXBlIC0gMSk7XG4gICAgdmFyIHRtcDIgPSB0bXAxICogKHggLyBzY2FsZSk7XG5cdCAgcmV0dXJuIC10bXAyICsgbG9nKHNoYXBlICogdG1wMSAvIHNjYWxlKTtcbiAgfTtcbiAgXG4gIC8vIFRoaXMgaXMgYSBkaXJlY3QgamF2YXNjcmlwdCB0cmFuc2xhdGlvbiBvZiB0aGUgUiBjb2RlIHVzZWQgdG8gZXZhbHVhdGVcbiAgLy8gdGhlIGxvZyBkZW5zaXR5IG9mIGEgbG9naXN0aWMgZGlzdHJpYnV0aW9uOiBcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3djaC9yLXNvdXJjZS9ibG9iL2IxNTZlM2E3MTE5NjdmNTgxMzFlMjNjMWIxZGMxZWE5MGUyZjBjNDMvc3JjL25tYXRoL2Rsb2dpcy5jXG4gIGxkLmxvZ2lzID0gZnVuY3Rpb24oeCwgbG9jYXRpb24sIHNjYWxlKSB7XG4gICAgeCA9IGFicygoeCAtIGxvY2F0aW9uKSAvIHNjYWxlKTtcbiAgICB2YXIgZSA9IGV4cCgteCk7XG4gICAgdmFyIGYgPSAxLjAgKyBlO1xuICAgIHJldHVybiAtKHggKyBsb2coc2NhbGUgKiBmICogZikpOyAgICBcbiAgfTtcblxuICBsZC5kaXJpY2hsZXQgPSBmdW5jdGlvbih4LCBhbHBoYSkge1xuICAgIHZhciBzdW1fYWxwaGEgPSAwO1xuICAgIHZhciBzdW1fbGdhbW1hX2FscGhhID0gMDtcbiAgICB2YXIgc3VtX2FscGhhX3N1Yl8xX2xvZ194ID0gMDtcbiAgICB2YXIgbiA9IGFscGhhLmxlbmd0aDtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICBzdW1fYWxwaGEgKz0gYWxwaGFbaV07XG4gICAgICBzdW1fbGdhbW1hX2FscGhhICs9IGxnYW1tYShhbHBoYVtpXSk7XG4gICAgICBzdW1fYWxwaGFfc3ViXzFfbG9nX3ggKz0gKGFscGhhW2ldIC0gMSkgKiBsb2coeFtpXSk7XG4gICAgfVxuICAgIHJldHVybiBsZ2FtbWEoc3VtX2FscGhhKSAtIHN1bV9sZ2FtbWFfYWxwaGEgKyBzdW1fYWxwaGFfc3ViXzFfbG9nX3g7XG4gIH07XG4gICBcbiAgICBcbiAgbGQuZXhwID0gZnVuY3Rpb24oeCwgcmF0ZSkge1xuICAgICAgcmV0dXJuIHggPCAwID8gLUluZmluaXR5IDogbG9nKHJhdGUpIC1yYXRlICogeDtcbiAgfTtcbiAgXG4gIGxkLnVuaWYgPSBmdW5jdGlvbih4LCBtaW4sIG1heCkge1xuICAgICAgcmV0dXJuICh4IDwgbWluIHx8IHggPiBtYXgpID8gLUluZmluaXR5IDogbG9nKDEgLyAobWF4IC0gbWluKSk7XG4gIH07XG4gIFxuICAvLy8vLy8vLy8vIERpc2NyZXRlIGRpc3RyaWJ1dGlvbnMgLy8vLy8vLy8vL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgbGQuYmVybiA9IGZ1bmN0aW9uKHgsIHByb2IpIHtcbiAgICAgIHJldHVybiAhKHggPT09IDAgfHwgeCA9PT0gMSkgPyAtSW5maW5pdHkgOiBsb2coeCAqIHByb2IgKyAoMSAtIHgpICogKDEgLSBwcm9iKSk7XG4gIH07XG4gIFxuICBsZC5jYXQgPSBmdW5jdGlvbih4LCBwcm9icykge1xuICAgIGlmKHggPCAxIHx8IHggPiBwcm9icy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBsb2coIHByb2JzW3ggLSAxXSApO1xuICAgIH1cbiAgfTtcbiAgXG4gIGxkLmJpbm9tID0gZnVuY3Rpb24oeCwgc2l6ZSwgcHJvYikge1xuICAgIGlmKHggPiBzaXplIHx8IHggPCAwKSB7XG4gICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgIH1cbiAgICBpZihwcm9iID09PSAwIHx8IHByb2IgPT09IDEpIHtcbiAgICAgIHJldHVybiAoc2l6ZSAqIHByb2IpID09PSB4ID8gMCA6IC1JbmZpbml0eTtcbiAgICB9XG4gICAgcmV0dXJuIGxjaG9vc2Uoc2l6ZSwgeCkgKyB4ICogbG9nKHByb2IpICsgKHNpemUgLSB4KSAqIGxvZygxIC0gcHJvYik7XG4gIH07XG4gIFxuICB2YXIgbXVsdGlub20gPSBmdW5jdGlvbih4LCBwcm9icykge1xuICAgIHZhciBuID0geC5sZW5ndGg7XG4gICAgdmFyIHNpemUgPSAwO1xuICAgIHZhciB0bXBfdGVybSA9IDA7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgaWYocHJvYnNbaV0gPT09IDApIHtcbiAgICAgICAgaWYoeFtpXSAhPT0gMCkge1xuICAgICAgICAgIHJldHVybiAtSW5maW5pdHk7ICBcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2l6ZSArPSB4W2ldO1xuICAgICAgICB0bXBfdGVybSArPSB4W2ldICogbG9nKHByb2JzW2ldKSAtIGxnYW1tYSh4W2ldICsgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsZ2FtbWEoc2l6ZSArIDEpICsgdG1wX3Rlcm0gO1xuICB9O1xuICBcbiAgbGQubmJpbm9tID0gZnVuY3Rpb24oeCwgc2l6ZSwgcHJvYikge1xuICAgIGlmKHggPCAwKSB7XG4gICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgIH1cbiAgICByZXR1cm4gbGNob29zZSh4ICsgc2l6ZSAtIDEsIHNpemUgLSAxKSArIHggKiBsb2coMSAtIHByb2IpICsgc2l6ZSAqIGxvZyhwcm9iKTtcbiAgfTtcbiAgXG4gIGxkLmh5cGVyID0gZnVuY3Rpb24oeCwgbSwgbiwgaykge1xuICAgIGlmKHggPCAwIHx8IHggPiBrKSB7XG4gICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxjaG9vc2UobSwgeCkgKyBsY2hvb3NlKG4sIGsteCkgLSBsY2hvb3NlKG0rbiwgayk7XG4gICAgfVxuICB9O1xuICBcbiAgbGQucG9pcyA9IGZ1bmN0aW9uKHgsIGxhbWJkYSkge1xuICAgICAgcmV0dXJuIHggPCAwID8gLUluZmluaXR5IDogbG9nKGxhbWJkYSkgKiB4IC0gbGFtYmRhIC0gbGZhY3RvcmlhbCh4KTtcbiAgfTtcbiAgXG4gIHJldHVybiBsZDtcbn0pKTsiLCJcInVzZSBzdHJpY3RcIjtcblxuLy8gVGhpcyBib2lsZXIgcGxhdGUgY29kZSBoZXJlIGlzIHRha2VuIGZyb206XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdW1kanMvdW1kL2Jsb2IvbWFzdGVyL3RlbXBsYXRlcy9yZXR1cm5FeHBvcnRzLmpzXG4vLyBJdCBzaG91bGQgbWFrZSBzaHVyZSB0aGF0IG1vZHVsZSBjYW4gYmUgaW1wb3J0ZWQgYm90aCBpbiB0aGUgYnJvd3Nlcixcbi8vIE5vZGUsIGFuZCBieSB1c2luZyB0aGUgQXN5bmNocm9ub3VzIE1vZHVsZSBEZWZpbml0aW9uIHN0YW5kYXJkLlxuLy8gSWYgdGhpcyBtb2R1bGUgaXMgbG9hZGVkIGluIHRoZSBicm93c2VyIGl0IHdpbGwgY3JlYXRlZCB0aGUgZ2xvYmFsXG4vLyBvYmplY3QgbWNtYyAuXG4oZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cbiAgICAgICAgZGVmaW5lKFtdLCBmYWN0b3J5KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIC8vIE5vZGUuIERvZXMgbm90IHdvcmsgd2l0aCBzdHJpY3QgQ29tbW9uSlMsIGJ1dFxuICAgICAgICAvLyBvbmx5IENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cyxcbiAgICAgICAgLy8gbGlrZSBOb2RlLlxuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHMgKHJvb3QgaXMgd2luZG93KVxuICAgICAgICByb290Lm1jbWMgPSBmYWN0b3J5KCk7XG4gIH1cbn0odGhpcywgZnVuY3Rpb24oKXtcblxuLy8vIFRoZSBhY3R1YWwgbW9kdWxlIGNvZGUgc3RhcnRzIGhlcmUgLy8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gIFxuICBcbiAgLy8vLy8vLy8vLyBIZWxwZXIgRnVuY3Rpb25zIC8vLy8vLy8vLy9cbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgXG4gIC8qKiBSZXR1cm5zIGEgcmFuZG9tIHJlYWwgbnVtYmVyIGJldHdlZW4gbWluIGFuZCBtYXggKi9cbiAgdmFyIHJ1bmlmID0gZnVuY3Rpb24obWluLCBtYXgpIHtcbiAgICByZXR1cm4gTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4pICsgbWluO1xuICB9O1xuICBcbiAgLyoqIFJldHVybnMgYSByYW5kb20gaW50ZWdlciBiZXR3ZWVuIG1pbiBhbmQgbWF4ICovXG4gIHZhciBydW5pZl9kaXNjcmV0ZSA9IGZ1bmN0aW9uKG1pbiwgbWF4KSB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSkgKyBtaW47XG4gIH07XG4gIFxuICAvKiogUmV0dXJucyBhIHJhbmRvbSByZWFsIG51bWJlciBmcm9tIGEgbm9ybWFsIGRpc3RyaWJidXRpb24gZGVmaW5lZFxuICAgKiAgYnkgbWVhbiBhbmQgc2QuIFxuICAgKiAgQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9qc3RhdC9qc3RhdC9ibG9iL21hc3Rlci9zcmMvc3BlY2lhbC5qcyAqL1xuICB2YXIgcm5vcm0gPSBmdW5jdGlvbihtZWFuLCBzZCkge1xuICAgIHZhciB1LCB2LCB4LCB5LCBxO1xuICAgIGRvIHtcbiAgICAgIHUgPSBNYXRoLnJhbmRvbSgpO1xuICAgICAgdiA9IDEuNzE1NiAqIChNYXRoLnJhbmRvbSgpIC0gMC41KTtcbiAgICAgIHggPSB1IC0gMC40NDk4NzE7XG4gICAgICB5ID0gTWF0aC5hYnModikgKyAwLjM4NjU5NTtcbiAgICAgIHEgPSB4ICogeCArIHkgKiAoMC4xOTYwMCAqIHkgLSAwLjI1NDcyICogeCk7XG4gICAgfSB3aGlsZSAocSA+IDAuMjc1OTcgJiYgKHEgPiAwLjI3ODQ2IHx8IHYgKiB2ID4gLTQgKiBNYXRoLmxvZyh1KSAqIHUgKiB1KSk7XG4gICAgXG4gICAgcmV0dXJuICh2IC8gdSkgKiBzZCArIG1lYW47XG4gIH07XG4gIFxuICBcbiAgLyoqIFJldHVybnMgYSBkZWVwIGNsb25lIG9mIHNyYywgc29ydCBvZi4uLiBJdCBvbmx5IGNvcGllcyBhIGxpbWl0ZWRcbiAgICogbnVtYmVyIG9mIHR5cGVzIGFuZCwgZm9yIGV4YW1wbGUsIGZ1bmN0aW9uIGFyZSBub3QgY29waWVkLiBcbiAgICogRnJvbSBodHRwOi8vZGF2aWR3YWxzaC5uYW1lL2phdmFzY3JpcHQtY2xvbmVcbiAgICovXG4gIHZhciBkZWVwX2Nsb25lID0gZnVuY3Rpb24oc3JjKSB7XG4gIFx0ZnVuY3Rpb24gbWl4aW4oZGVzdCwgc291cmNlLCBjb3B5RnVuYykge1xuICBcdFx0dmFyIG5hbWUsIHMsIGksIGVtcHR5ID0ge307XG4gIFx0XHRmb3IobmFtZSBpbiBzb3VyY2Upe1xuICBcdFx0XHQvLyB0aGUgKCEobmFtZSBpbiBlbXB0eSkgfHwgZW1wdHlbbmFtZV0gIT09IHMpIGNvbmRpdGlvbiBhdm9pZHMgY29weWluZyBwcm9wZXJ0aWVzIGluIFwic291cmNlXCJcbiAgXHRcdFx0Ly8gaW5oZXJpdGVkIGZyb20gT2JqZWN0LnByb3RvdHlwZS5cdCBGb3IgZXhhbXBsZSwgaWYgZGVzdCBoYXMgYSBjdXN0b20gdG9TdHJpbmcoKSBtZXRob2QsXG4gIFx0XHRcdC8vIGRvbid0IG92ZXJ3cml0ZSBpdCB3aXRoIHRoZSB0b1N0cmluZygpIG1ldGhvZCB0aGF0IHNvdXJjZSBpbmhlcml0ZWQgZnJvbSBPYmplY3QucHJvdG90eXBlXG4gIFx0XHRcdHMgPSBzb3VyY2VbbmFtZV07XG4gIFx0XHRcdGlmKCEobmFtZSBpbiBkZXN0KSB8fCAoZGVzdFtuYW1lXSAhPT0gcyAmJiAoIShuYW1lIGluIGVtcHR5KSB8fCBlbXB0eVtuYW1lXSAhPT0gcykpKXtcbiAgXHRcdFx0XHRkZXN0W25hbWVdID0gY29weUZ1bmMgPyBjb3B5RnVuYyhzKSA6IHM7XG4gIFx0XHRcdH1cbiAgXHRcdH1cbiAgXHRcdHJldHVybiBkZXN0O1xuICBcdH1cbiAgXHRpZighc3JjIHx8IHR5cGVvZiBzcmMgIT0gXCJvYmplY3RcIiB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc3JjKSA9PT0gXCJbb2JqZWN0IEZ1bmN0aW9uXVwiKXtcbiAgXHRcdC8vIG51bGwsIHVuZGVmaW5lZCwgYW55IG5vbi1vYmplY3QsIG9yIGZ1bmN0aW9uXG4gIFx0XHRyZXR1cm4gc3JjO1x0Ly8gYW55dGhpbmdcbiAgXHR9XG4gIFx0aWYoc3JjLm5vZGVUeXBlICYmIFwiY2xvbmVOb2RlXCIgaW4gc3JjKXtcbiAgXHRcdC8vIERPTSBOb2RlXG4gIFx0XHRyZXR1cm4gc3JjLmNsb25lTm9kZSh0cnVlKTsgLy8gTm9kZVxuICBcdH1cbiAgXHRpZihzcmMgaW5zdGFuY2VvZiBEYXRlKXtcbiAgXHRcdC8vIERhdGVcbiAgXHRcdHJldHVybiBuZXcgRGF0ZShzcmMuZ2V0VGltZSgpKTtcdC8vIERhdGVcbiAgXHR9XG4gIFx0aWYoc3JjIGluc3RhbmNlb2YgUmVnRXhwKXtcbiAgXHRcdC8vIFJlZ0V4cFxuICBcdFx0cmV0dXJuIG5ldyBSZWdFeHAoc3JjKTsgICAvLyBSZWdFeHBcbiAgXHR9XG4gIFx0dmFyIHIsIGksIGw7XG4gIFx0aWYoc3JjIGluc3RhbmNlb2YgQXJyYXkpe1xuICBcdFx0Ly8gYXJyYXlcbiAgXHRcdHIgPSBbXTtcbiAgXHRcdGZvcihpID0gMCwgbCA9IHNyYy5sZW5ndGg7IGkgPCBsOyArK2kpe1xuICBcdFx0XHRpZihpIGluIHNyYyl7XG4gIFx0XHRcdFx0ci5wdXNoKGRlZXBfY2xvbmUoc3JjW2ldKSk7XG4gIFx0XHRcdH1cbiAgXHRcdH1cbiAgXHR9IGVsc2Uge1xuICBcdFx0Ly8gZ2VuZXJpYyBvYmplY3RzXG4gIFx0XHRyID0gc3JjLmNvbnN0cnVjdG9yID8gbmV3IHNyYy5jb25zdHJ1Y3RvcigpIDoge307XG4gIFx0fVxuICBcdHJldHVybiBtaXhpbihyLCBzcmMsIGRlZXBfY2xvbmUpO1xuICB9O1xuICBcbiAgLyoqIFNwZWNpYWxpemVkIGNsb25lIGZ1bmN0aW9uIHRoYXQgb25seSBjbG9uZXMgc2NhbGFycyBhbmQgbmVzdGVkIGFycmF5cyB3aGVyZVxuICAgKiBlYWNoIGFycmF5IGVpdGhlciBjb25zaXN0cyBvZiBhbGwgYXJyYXlzIG9yIGFsbCBudW1iZXJzLiBUaGlzIGZ1bmN0aW9uXG4gICAqIGlzIG1lYW50IGFzIGEgZmFzdCB3YXkgb2YgY2xvbmluZyBwYXJhbWV0ZXIgZHJhd3Mgd2l0aGluIHRoZSBtY21jIHNhbXBsaW5nXG4gICAqIGxvb3AuXG4gICAqL1xuICB2YXIgY2xvbmVfcGFyYW1fZHJhdyA9IGZ1bmN0aW9uKHgpIHtcbiAgICBpZihBcnJheS5pc0FycmF5KHgpKSB7XG4gICAgICBpZihBcnJheS5pc0FycmF5KHhbMF0pKSB7XG4gICAgICAgIC8vIHggaXMgYW4gYXJyYXkgb2YgYXJyYXlzIHNvIHdlIG5lZWQgdG8gY2xvbmUgaXQgcmVjdXJzaXZlbHlcbiAgICAgICAgdmFyIHhfY29weSA9IFtdO1xuICAgICAgICBmb3IodmFyIGkgPSAwLCBsZW5ndGggPSB4Lmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgeF9jb3B5LnB1c2goY2xvbmVfcGFyYW1fZHJhdyh4W2ldKSk7XG4gICAgICAgIH0gXG4gICAgICAgIHJldHVybiB4X2NvcHk7XG4gICAgICB9IGVsc2UgeyAvLyBXZSdsbCBhc3N1bWUgeCBpcyBhIGFycmF5cyBvZiBzY2FsYXJzXG4gICAgICAgIHJldHVybiB4LnNsaWNlKDApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7IC8vIFdlJ2xsIGFzc3VtZSB4IGlzIGEgc2NhbGFyXG4gICAgICByZXR1cm4geDtcbiAgICB9XG4gIH07XG4gIFxuICAvKiogUmV0dXJucyB0cnVlIGlmIG9iamVjdCBpcyBhIG51bWJlci5cbiAgICovXG4gIHZhciBpc19udW1iZXIgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09IFwibnVtYmVyXCIgfHwgKHR5cGVvZiBvYmplY3QgPT0gXCJvYmplY3RcIiAmJiBvYmplY3QuY29uc3RydWN0b3IgPT09IE51bWJlcik7XG4gIH07XG4gIFxuICAvKipcbiAgICogQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSAocG9zc2libHkgbXVsdGlkaW1lbnNpb25hbC9uZXN0ZWQpIGFycmF5LlxuICAgKiBAcGFyYW0gZGltIC0gQW4gYXJyYXkgZ2l2aW5nIHRoZSBkaW1lbnNpb24gb2YgdGhlIGFycmF5LiBGb3IgZXhhbXBsZSxcbiAgICogICBbNV0gd291bGQgeWllbGQgYSA1IGVsZW1lbnQgYXJyYXksIGFuZCBbMywzXSB3b3VsZCB5aWVsZCBhIDMgYnkgMyBtYXRyaXguXG4gICAqIEBwYXJhbSBpbml0IC0gQSB2YWx1ZSBvciBhIGZ1bmN0aW9uIHVzZWQgdG8gZmlsbCBpbiB0aGUgZWFjaCBlbGVtZW50IGluXG4gICAqICAgdGhlIGFycmF5LiBJZiBpdCBpcyBhIGZ1bmN0aW9uIGl0IHNob3VsZCB0YWtlIG5vIGFyZ3VtZW50cywgaXQgd2lsbCBiZSBcbiAgICogICBldmFsdWF0ZWQgb25jZSBmb3IgZWFjaCBlbGVtZW50LCBhbmQgaXQncyByZXR1cm4gdmFsdWUgd2lsbCBiZSB1c2VkIHRvXG4gICAqICAgZmlsbCBpbiBlYWNoIGVsZW1lbnQuXG4gICAqIEBleGFtcGxlIFxuICAgKiAvLyBUaGUgZm9sbG93aW5nIHdvdWxkIHJldHVybiBbWzEsMV0sWzEsMV0sWzEsMV1dXG4gICAqIGNyZWF0ZV9hcnJheShbMiwzXSwgMSlcbiAgICovXG4gIHZhciBjcmVhdGVfYXJyYXkgPSBmdW5jdGlvbihkaW0sIGluaXQpIHtcbiAgICB2YXIgYXJyID0gbmV3IEFycmF5KGRpbVswXSk7XG4gICAgdmFyIGk7XG4gICAgaWYoZGltLmxlbmd0aCA9PSAxKSB7IC8vIEZpbGwgaXQgdXAgd2l0aCBpbml0XG4gICAgICBpZih0eXBlb2YgaW5pdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGZvcihpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7XG4gICAgICAgICAgYXJyW2ldID0gaW5pdCgpO1xuICAgICAgICB9ICBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcihpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7XG4gICAgICAgICAgYXJyW2ldID0gaW5pdDtcbiAgICAgICAgfSBcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYoZGltLmxlbmd0aCA+IDEpIHtcbiAgICAgIGZvcihpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7XG4gICAgICAgIGFycltpXSA9IGNyZWF0ZV9hcnJheShkaW0uc2xpY2UoMSksIGluaXQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBcImNyZWF0ZV9hcnJheSBjYW4ndCBjcmVhdGUgYSBkaW1lbnNpb25sZXNzIGFycmF5XCI7XG4gICAgfVxuICAgIHJldHVybiBhcnI7XG4gIH07XG4gIFxuICAvKipcbiAgICogUmV0dXJuIHRoZSBkaW1lbnNpb25zIG9mIGEgcG9zc2libHkgbmVzdGVkIGFycmF5IGFzIGFuIGFycmF5LiBGb3IgXG4gICAqIGV4YW1wbGUsIGFycmF5X2RpbSggW1sxLCAyXSwgWzEsIDJdXSApIHNob3VsZCByZXR1cm4gWzIsIDJdXG4gICAqIEFzc3VtZXMgdGhhdCBhbGwgYXJyYXlzIGluc2lkZSBhbm90aGVyIGFycmF5IGFyZSBvZiB0aGUgc2FtZSBsZW5ndGguXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFNob3VsZCByZXR1cm4gWzQsIDIsIDFdXG4gICAqIGFycmF5X2RpbShjcmVhdGVfYXJyYXkoWzQsIDIsIDFdLCAwKSlcbiAgICovXG4gIHZhciBhcnJheV9kaW0gPSBmdW5jdGlvbihhKSB7XG4gICAgaWYoQXJyYXkuaXNBcnJheShhWzBdKSkge1xuICAgICAgcmV0dXJuIFthLmxlbmd0aF0uY29uY2F0KGFycmF5X2RpbShhWzBdKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbYS5sZW5ndGhdO1xuICAgIH1cbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdHdvIGFycmF5cyBhcmUgZXF1YWwgaW4gdGhlIHNlbnNlIHRoYXQgdGhleSBjb250YWluIHRoZSBzYW1lIGVsZW1lbnRzXG4gICAqIGFzIGp1ZGdlZCBieSB0aGUgXCI9PVwiIG9wZXJhdG9yLiBSZXR1cm5zIHRydWUgb3IgZmFsc2UuXG4gICAqIEFkYXB0ZWQgZnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNDg1Mzk3NC8xMDAxODQ4XG4gICAqLyBcbiAgdmFyIGFycmF5X2VxdWFsID0gZnVuY3Rpb24gKGExLCBhMikge1xuICAgICAgaWYgKGExLmxlbmd0aCAhPSBhMi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIG5lc3RlZCBhcnJheXNcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhMVtpXSkgJiYgQXJyYXkuaXNBcnJheShhMltpXSkpIHtcbiAgICAgICAgICAgICAgLy8gcmVjdXJzZSBpbnRvIHRoZSBuZXN0ZWQgYXJyYXlzXG4gICAgICAgICAgICAgIGlmICghYXJyYXlfZXF1YWwoYTFbaV0sIGEyW2ldKSkgcmV0dXJuIGZhbHNlOyAgICAgICBcbiAgICAgICAgICB9ICAgICAgICAgICBcbiAgICAgICAgICBlbHNlIGlmIChhMVtpXSAhPSBhMltpXSkgeyBcbiAgICAgICAgICAgICAgLy8gV2FybmluZyAtIHR3byBkaWZmZXJlbnQgb2JqZWN0IGluc3RhbmNlcyB3aWxsIG5ldmVyIGJlIGVxdWFsOiB7eDoyMH0gIT0ge3g6MjB9XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICBcbiAgICAgICAgICB9ICAgICAgICAgICBcbiAgICAgIH0gICAgICAgXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBUcmF2ZXJzZXMgYSBwb3NzaWJseSBuZXN0ZWQgYXJyYXkgYSBhbmQgYXBwbGllcyBmdW4gdG8gYWxsIFwibGVhZiBub2Rlc1wiLCBcbiAgICogdGhhdCBpcywgdmFsdWVzIHRoYXQgYXJlIG5vdCBhcnJheXMuIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIHNhbWUgc2l6ZSBhc1xuICAgKiBhLlxuICAgKi9cbiAgdmFyIG5lc3RlZF9hcnJheV9hcHBseSA9IGZ1bmN0aW9uKGEsIGZ1bikge1xuICAgIGlmKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXkoYS5sZW5ndGgpO1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0W2ldID0gbmVzdGVkX2FycmF5X2FwcGx5KGFbaV0sIGZ1bik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZnVuKGEpO1xuICAgIH1cbiAgfTtcbiAgXG4gIC8qKiBSYW5kb21pemluZyB0aGUgYXJyYXkgZWxlbWVudCBvcmRlciBpbi1wbGFjZS4gVXNpbmcgRHVyc3RlbmZlbGRcbiAgICogc2h1ZmZsZSBhbGdvcml0aG0uIEFkYXB0ZWQgZnJvbSBoZXJlOiBcbiAgICogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTI2NDY4NjQvMTAwMTg0OFxuICAgKi9cbiAgZnVuY3Rpb24gc2h1ZmZsZV9hcnJheShhcnJheSkge1xuICAgICAgZm9yICh2YXIgaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICB2YXIgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChpICsgMSkpO1xuICAgICAgICAgIHZhciB0ZW1wID0gYXJyYXlbaV07XG4gICAgICAgICAgYXJyYXlbaV0gPSBhcnJheVtqXTtcbiAgICAgICAgICBhcnJheVtqXSA9IHRlbXA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBEb2VzIHRoZSBzYW1lIHRoaW5nIGFzIG5lc3RlZF9hcnJheV9hcHBseSwgdGhhdCBpcywgdHJhdmVyc2VzIGEgcG9zc2libHlcbiAgICogbmVzdGVkIGFycmF5IGEgYW5kIGFwcGxpZXMgZnVuIHRvIGFsbCBcImxlYWYgbm9kZXNcIiBhbmQgcmV0dXJucyBhbiBhcnJheSBcbiAgICogb2YgdGhlIHNhbWUgc2l6ZSBhcyBhLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IG5lc3RlZF9hcnJheV9yYW5kb21fYXBwbHlcbiAgICogYnJhbmNoZXMgcmFuZG9tbHkuXG4gICAqL1xuICB2YXIgbmVzdGVkX2FycmF5X3JhbmRvbV9hcHBseSA9IGZ1bmN0aW9uKGEsIGZ1bikge1xuICAgIGlmKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgIHZhciBsZW4gPSBhLmxlbmd0aDtcbiAgICAgIHZhciBpO1xuICAgICAgdmFyIGFycmF5X2lzID0gW107XG4gICAgICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBhcnJheV9pc1tpXSA9IGk7XG4gICAgICB9XG4gICAgICBzaHVmZmxlX2FycmF5KGFycmF5X2lzKTtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIFxuICAgICAgZm9yKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIGFycmF5X2kgPSBhcnJheV9pc1tpXTtcbiAgICAgICAgcmVzdWx0W2FycmF5X2ldID0gbmVzdGVkX2FycmF5X2FwcGx5KGFbYXJyYXlfaV0sIGZ1bik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZnVuKGEpO1xuICAgIH1cbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBBbGxvd3MgYSBwcmV0dHkgd2F5IG9mIHNldHRpbmcgZGVmYXVsdCBvcHRpb25zIHdoZXJlIHRoZSBkZWZ1bHRzIGNhbiBiZVxuICAgKiBvdmVycmlkZGVuIGJ5IGFuIG9wdGlvbnMgb2JqZWN0LlxuICAgKiAgQHBhcmFtIG9wdGlvbl9uYW1lIC0gdGhlIG5hbWUgb2YgdGhlIG9wdGlvbiBhcyBhIHN0cmluZ1xuICAgKiAgQHBhcmFtIG15X29wdGlvbnMgLSBhbiBvcHRpb24gb2JqZWN0IHRoYXQgY291bGQgaGF2ZSBvcHRpb25fbmFtZSBcbiAgICogICAgYXMgYSBtZW1iZXIuXG4gICAqIEBwYXJhbSBkZWZhdWxfdmFsdWUgLSBkZWZ1bHQgdmFsdWUgdGhhdCBpcyByZXR1cm5lZCBpZiBvcHRpb25fbmFtZSBcbiAgICogICBpcyBub3QgZGVmaW5lZCBpbiBteV9vcHRpb25zLlxuICAgKiBAZXhhbXBsZVxuICAgKiB2YXIgbXlfb3B0aW9ucyA9IHtwaTogMy4xNDE1OX1cbiAgICogdmFyIHBpID0gZ2V0X29wdGlvbihcInBpXCIsIG15X29wdGlvbnMsIDMuMTQpXG4gICAqL1xuICAvLyBQcmV0dHkgd2F5IG9mIHNldHRpbmcgZGVmYXVsdCBvcHRpb25zIHdoZXJlIHRoZSBkZWZhdWx0cyBjYW4gYmUgb3ZlcnJpZGRlblxuICAvLyBieSBhbiBvcHRpb25zIG9iamVjdC4gRm9yIGV4YW1wbGU6XG4gIC8vIHZhciBwaSA9IGdldF9vcHRpb24oXCJwaVwiLCBteV9vcHRpb25zLCAzLjE0KVxuICB2YXIgZ2V0X29wdGlvbiA9IGZ1bmN0aW9uKG9wdGlvbl9uYW1lLCBvcHRpb25zLCBkZWZhdWxfdmFsdWUpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICByZXR1cm4gb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShvcHRpb25fbmFtZSkgJiYgXG4gICAgICAgICAgIG9wdGlvbnNbb3B0aW9uX25hbWVdICE9PSB1bmRlZmluZWQgICYmIFxuICAgICAgICAgICBvcHRpb25zW29wdGlvbl9uYW1lXSAhPT0gbnVsbCA/IG9wdGlvbnNbb3B0aW9uX25hbWVdIDogZGVmYXVsX3ZhbHVlO1xuICB9O1xuICBcbiAgLyoqIFZlcnNpb24gb2YgZ2V0X29wdGlvbiB3aGVyZSB0aGUgb3B0aW9uIHNob3VsZCBiZSBhIG9uZSBvciBtdWx0aS1kaW1lbnNpb25hbFxuICAgKiBhcnJheSBhbmQgd2hlcmUgdGhlIGRlZmF1bHQgY2FuIGJlIG92ZXJyaWRkZW4gZWl0aGVyIGJ5IGEgc2NhbGFyIG9yIGJ5IGFuIGFycmF5LlxuICAgKiBJZiBpdCdzIGEgc2NhbGFyIHRoZSB0aGF0IHNjYWxhciBpcyB1c2VkIHRvIGluaXRpYWxpemUgYW4gYXJyYXkgd2l0aCBcbiAgICogZGltIGRpbWVuc2lvbnMuXG4gICAqIFxuICAgKi9cbiAgdmFyIGdldF9tdWx0aWRpbV9vcHRpb24gPSBmdW5jdGlvbihvcHRpb25fbmFtZSwgb3B0aW9ucywgZGltLCBkZWZhdWxfdmFsdWUpIHtcbiAgICB2YXIgdmFsdWUgPSBnZXRfb3B0aW9uKG9wdGlvbl9uYW1lLCBvcHRpb25zLCBkZWZhdWxfdmFsdWUpO1xuICAgICBpZighIEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgdmFsdWUgPSBjcmVhdGVfYXJyYXkoZGltLCB2YWx1ZSk7XG4gICAgIH0gXG4gICAgIGlmKCEgYXJyYXlfZXF1YWwoIGFycmF5X2RpbSh2YWx1ZSksIGRpbSkpIHtcbiAgICAgICB0aHJvdyBcIlRoZSBvcHRpb24gXCIgKyBvcHRpb25fbmFtZSArIFwiIGlzIG9mIGRpbWVuc2lvbiBbXCIgKyBcbiAgICAgICAgICAgICBhcnJheV9kaW0odmFsdWUpICsgXCJdIGJ1dCBzaG91bGQgYmUgW1wiICsgZGltICsgXCJdLlwiO1xuICAgIH1cbiAgICAgcmV0dXJuIHZhbHVlO1xuICB9O1xuICBcbiAgLy8vLy8vLy8vLyBGdW5jdGlvbnMgZm9yIGhhbmRsaW5nIHBhcmFtZXRlciBvYmplY3RzIC8vLy8vLy8vLy9cbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgZml4ZWQgKHNhbWUgZXZlcnkgdGltZSkgbnVtYmVyIHRoYXQgY291bGQgYmUgdXNlZCB0byBpbml0aWFsaXplXG4gICAqIGEgcGFyYW1ldGVyIG9mIGEgY2VydGFpbiB0eXBlLCBwb3NzaWJseSB3aXRoIGxvd2VyIGFuZCB1cHBlciBib3VuZHMuXG4gICAqIFRoZSBwb3NzaWxlIHR5cGVzIGFyZSBcInJlYWxcIiwgXCJpbnRcIiwgYW5kIFwiYmluYXJ5XCIuXG4gICAqL1xuICB2YXIgcGFyYW1faW5pdF9maXhlZCA9IGZ1bmN0aW9uKHR5cGUsIGxvd2VyLCB1cHBlcikge1xuICAgIGlmKGxvd2VyID4gdXBwZXIpIHtcbiAgICAgIHRocm93IFwiQ2FuIG5vdCBpbml0aWFsaXplIHBhcmFtZXRlciB3aGVyZSBsb3dlciBib3VuZCA+IHVwcGVyIGJvdW5kXCI7XG4gICAgfVxuICAgIGlmKHR5cGUgPT09IFwicmVhbFwiKSB7XG4gICAgICBpZihsb3dlciA9PT0gLUluZmluaXR5ICYmIHVwcGVyID09PSBJbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gMC41O1xuICAgICAgfSBlbHNlIGlmKGxvd2VyID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgcmV0dXJuIHVwcGVyIC0gMC41O1xuICAgICAgfSBlbHNlIGlmKHVwcGVyID09PSBJbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gbG93ZXIgKyAwLjU7XG4gICAgICB9IGVsc2UgaWYobG93ZXIgPD0gdXBwZXIpIHtcbiAgICAgICAgcmV0dXJuIChsb3dlciArIHVwcGVyKSAvIDI7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKHR5cGUgPT09IFwiaW50XCIpIHtcbiAgICAgIGlmKGxvd2VyID09PSAtSW5maW5pdHkgJiYgdXBwZXIgPT09IEluZmluaXR5KSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfSBlbHNlIGlmKGxvd2VyID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgcmV0dXJuIHVwcGVyIC0gMTtcbiAgICAgIH0gZWxzZSBpZih1cHBlciA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgcmV0dXJuIGxvd2VyICsgMTtcbiAgICAgIH0gZWxzZSBpZihsb3dlciA8PSB1cHBlcil7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKChsb3dlciArIHVwcGVyKSAvIDIpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZih0eXBlID09PSBcImJpbmFyeVwiKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgdGhyb3cgXCJDb3VsZCBub3QgaW5pdGlhbGl6ZSBwYXJhbWV0ZXIgb2YgdHlwZSBcIiArIHR5cGUgKyBcIltcIiArIGxvd2VyICsgXCIsIFwiICsgdXBwZXIgKyBcIl1cIjtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBDb21wbGV0ZXMgcGFyYW1zX3RvX2NvbXBsZXRlLCBhbiBvYmplY3QgY29udGFpbmluZyBwYXJhbWV0ZXIgZGVzY3JpcHRpb25zLCBcbiAgICogYW5kIGluaXRpYWxpemVzIG5vbi1pbml0aWFsaXplZCBwYXJhbWV0ZXJzLiBUaGlzIG1vZGlmaWVkIHZlcnNpb24gb2ZcbiAgICogcGFyYW1zX3RvX2NvbXBsZXRlIGlzIHJldHVybmVkIGFzIGEgZGVlcCBjb3B5IGFuZCBub3QgbW9kaWZpZWQgaW4gcGxhY2UuXG4gICAqIEluaXRpYWxpemF0aW9uIGlzIGRvbmUgYnkgc3VwcGx5aW5nIGEgcGFyYW1faW5pdCBmdW5jdGlvbiB3aXRoIHNpZ25hdHVyZVxuICAgKiBmdW5jdGlvbih0eXBlLCBsb3dlciwgdXBwZXIpIHRoYXQgc2hvdWxkIHJldHVybiBhIHNpbmdsZSBudW1iZXIgXG4gICAqIChsaWtlIHBhcmFtX2luaXRfZml4ZWQsIGZvciBleGFtcGxlKS5cbiAgICogQGV4YW1wbGVcbiAgICogdmFyIHBhcmFtcyA9IHsgXCJtdVwiOiB7XCJ0eXBlXCI6IFwicmVhbFwifSB9XG4gICAqIHBhcmFtcyA9IGNvbXBsZXRlX3BhcmFtcyhwYXJhbXMpO1xuICAgKiAvLyBwYXJhbXMgc2hvdWxkIG5vdyBiZTpcbiAgICogLy8gIHtcIm11XCI6IHsgXCJ0eXBlXCI6IFwicmVhbFwiLCBcImRpbVwiOiBbMV0sIFwidXBwZXJcIjogSW5maW5pdHksXG4gICAqIC8vICAgICAgICAgICBcImxvd2VyXCI6IC1JbmZpbml0eSwgXCJpbml0XCI6IDAuNSB9fVxuICAgKi8gXG4gIHZhciBjb21wbGV0ZV9wYXJhbXMgID0gZnVuY3Rpb24ocGFyYW1zX3RvX2NvbXBsZXRlLCBwYXJhbV9pbml0KSB7XG4gICAgdmFyIHBhcmFtcyA9IGRlZXBfY2xvbmUocGFyYW1zX3RvX2NvbXBsZXRlKTtcbiAgICBmb3IgKHZhciBwYXJhbV9uYW1lIGluIHBhcmFtcykgeyBpZiAoIXBhcmFtcy5oYXNPd25Qcm9wZXJ0eShwYXJhbV9uYW1lKSkgY29udGludWU7XG4gICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbcGFyYW1fbmFtZV07XG4gICAgICBpZiggIXBhcmFtLmhhc093blByb3BlcnR5KFwidHlwZVwiKSkge1xuICAgICAgICBwYXJhbS50eXBlID0gXCJyZWFsXCI7XG4gICAgICB9XG4gICAgICBpZighcGFyYW0uaGFzT3duUHJvcGVydHkoXCJkaW1cIikpIHtcbiAgICAgICAgcGFyYW0uZGltID0gWzFdO1xuICAgICAgfVxuICAgICAgaWYoaXNfbnVtYmVyKHBhcmFtLmRpbSkpIHtcbiAgICAgICAgcGFyYW0uZGltID0gW3BhcmFtLmRpbV07XG4gICAgICB9XG4gICAgICBpZihwYXJhbS50eXBlID09IFwiYmluYXJ5XCIpIHtcbiAgICAgICAgcGFyYW0udXBwZXIgPSAxO1xuICAgICAgICBwYXJhbS5sb3dlciA9IDA7XG4gICAgICB9XG4gICAgICBpZighcGFyYW0uaGFzT3duUHJvcGVydHkoXCJ1cHBlclwiKSkge1xuICAgICAgICBwYXJhbS51cHBlciA9IEluZmluaXR5O1xuICAgICAgfVxuICAgICAgaWYoIXBhcmFtLmhhc093blByb3BlcnR5KFwibG93ZXJcIikpIHtcbiAgICAgICAgcGFyYW0ubG93ZXIgPSAtSW5maW5pdHk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmKHBhcmFtLmhhc093blByb3BlcnR5KFwiaW5pdFwiKSkge1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGp1c3QgYSBudW1iZXIgb3IgYSBuZXN0ZWQgYXJyYXkgd2UgbGVhdmUgaXQgYWxvbmUsIGJ1dCBpZi4uLlxuICAgICAgICBpZihhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkgJiYgdHlwZW9mIHBhcmFtLmluaXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIHBhcmFtLmluaXQgaXMgYSBmdW5jdGlvbiwgdXNlIHRoYXQgdG8gaW5pdGlhbGl6ZSB0aGUgcGFyYW1ldGVyLlxuICAgICAgICAgIHBhcmFtLmluaXQgPSBwYXJhbS5pbml0KCk7XG4gICAgICAgIH0gZWxzZSBpZighYXJyYXlfZXF1YWwocGFyYW0uZGltLCBbMV0pICYmICFBcnJheS5pc0FycmF5KHBhcmFtLmluaXQpKSB7XG4gICAgICAgIC8vIFdlIGhhdmUgYSBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlciB3aGVyZSB0aGUgcGFyYW0uaW5pdCBleGlzdCBidXRcbiAgICAgICAgLy8gaXMgbm90IGFuIGFycmF5LiBUaGVuIGFzc3VtZSBpdCBpcyBhIG51bWJlciBvciBhIGZ1bmN0aW9uIGFuZCB1c2VcbiAgICAgICAgLy8gaXQgdG8gaW5pdGlhbGl6ZSB0aGUgcGFyYW1ldGVyLlxuICAgICAgICBwYXJhbS5pbml0ID0gY3JlYXRlX2FycmF5KHBhcmFtLmRpbSwgcGFyYW0uaW5pdCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7IC8vIFdlIHVzZSB0aGUgZGVmYXVsdCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi5cbiAgICAgICAgaWYoYXJyYXlfZXF1YWwocGFyYW0uZGltLCBbMV0pKSB7XG4gICAgICAgICAgcGFyYW0uaW5pdCA9IHBhcmFtX2luaXQocGFyYW0udHlwZSwgcGFyYW0ubG93ZXIsIHBhcmFtLnVwcGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXJhbS5pbml0ID0gY3JlYXRlX2FycmF5KHBhcmFtLmRpbSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW1faW5pdChwYXJhbS50eXBlLCBwYXJhbS5sb3dlciwgcGFyYW0udXBwZXIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH07XG4gIFxuICBcbiAgLy8vLy8vLy8vLyBTdGVwcGVyIEZ1bmN0aW9ucyAvLy8vLy8vLy8vL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gIFxuICBcbiAgLyoqXG4gICAqIEBpbnRlcmZhY2VcbiAgICogQSBTdGVwcGVyIGlzIGFuIG9iamVjdCByZXNwb25zaWJsZSBmb3IgcHVzaGluZyBhcm91bmQgb25lXG4gICAqIG9yIG1vcmUgcGFyYW1ldGVyIHZhbHVlcyBpbiBhIHN0YXRlIGFjY29yZGluZyB0byB0aGUgZGlzdHJpYnV0aW9uXG4gICAqIGRlZmluZWQgYnkgdGhlIGxvZyBwb3N0ZXJpb3IuIFRoaXMgZGVmaW5lcyB0aGUgU3RlcHBlciBcImludGVyZmFjZVwiLFxuICAgKiB3aGVyZSBcImludGVyZmFjZVwiIG1lYW5zIHRoYXQgU3RlcHBlciBkZWZpbmVzIGEgY2xhc3MgdGhhdCBpcyBuZXZlclxuICAgKiBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQsIGJ1dCBqdXN0IHRvIGJlIHN1YmNsYXNzZWQgYnkgc3BlY2lhbGl6ZWRcbiAgICogc3RlcHBlciBmdW5jdGlvbnMuXG4gICAqIEBpbnRlcmZhY2VcbiAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIHBhcmFtZXRlciBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGU6XG4gICAqICAge1wibXVcIjogeyBcInR5cGVcIjogXCJyZWFsXCIsIFwiZGltXCI6IFsxXSwgXCJ1cHBlclwiOiBJbmZpbml0eSwgXG4gICAqICAgXCJsb3dlclwiOiAtSW5maW5pdHksIFwiaW5pdFwiOiAwLjUgfX1cbiAgICogICBUaGUgcGFyYW1ldGVyIGRlZmluaXRpb25zIGFyZSBleHBlY3RlZCB0byBiZSBcImNvbXBsZXRlXCIsIHRoYXQgaXMsXG4gICAqICAgc3BlY2lmeWluZyBhbGwgcmVsZXZhbnQgYXR0cmlidXRlcyBzdWNoIGFzIGRpbSwgbG93ZXIgYW5kIHVwcGVyLlxuICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMgaW4gcGFyYW1zXG4gICAqICAgKGFuZCBwb3NzaWJseSBtb3JlKS4gVGhlIHBhcmFtZXRlciBuYW1lcyBhcmUgZ2l2ZW4gYXMga2V5cyBhbmQgdGhlIHN0YXRlc1xuICAgKiAgIGFzIHNjYWxhcnMgb3IsIHBvc3NpYmx5IG5lc3RlZCwgYXJyYXlzLiBGb3IgZXhhbXBsZTpcbiAgICogICB7bXU6IDEwLCBzaWdtYTogNSwgYmV0YTogWzEsIDIuNV19XG4gICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gKnRha2luZyBubyBwYXJhbWV0ZXJzKiB0aGF0IHJldHVybnMgdGhlXG4gICAqICAgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gVGhhdCBpcywgdGhlIHZhbHVlIG9mIGxvZ19wb3N0XG4gICAqICAgc2hvdWxkIGNoYW5nZSBpZiB0aGUgdGhlIHZhbHVlcyBpbiBzdGF0ZSBhcmUgY2hhbmdlZC5cbiAgXG4gICAqL1xuICB2YXIgU3RlcHBlciA9IGZ1bmN0aW9uKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0KSB7XG4gICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIHRoaXMubG9nX3Bvc3QgPSBsb2dfcG9zdDtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBUYWtlcyBhIHN0ZXAgaW4gdGhlIHBhcmFtZXRlciBzcGFjZS4gU2hvdWxkIHJldHVybiB0aGUgbmV3IHN0YXRlLFxuICAgKiBidXQgaXMgbWFpbmx5IGNhbGxlZCBmb3IgaXQncyBzaWRlIGVmZmVjdCBvZiBtYWtpbmcgYSBjaGFuZ2UgaW4gdGhlXG4gICAqIHN0YXRlIG9iamVjdC5cbiAgICovXG4gIFN0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbigpIHtcbiAgICB0aHJvdyBcIkV2ZXJ5IFN0ZXBwZXIgbmVlZCB0byBpbXBsZW1lbnQgc3RlcCgpXCI7XG4gIH07XG4gIFxuICAvKipcbiAgICogSWYgaW1wbGVtZW50ZWQsIG1ha2VzIHRoZSBzdGVwcGVyIGFkYXB0IHdoaWxlIHN0ZXBwaW5nLlxuICAgKi8gXG4gIFN0ZXBwZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICAvLyBPcHRpb25hbCwgc29tZSBzdGVwcGVycyBtaWdodCBub3QgYmUgYWRhcHRpdmUuICovIFxuICB9O1xuICBcbiAgLyoqXG4gICAqIElmIGltcGxlbWVudGVkLCBtYWtlcyB0aGUgc3RlcHBlciBjZWFzZSBhZGFwdGluZyB3aGlsZSBzdGVwcGluZy5cbiAgICovIFxuICBTdGVwcGVyLnByb3RvdHlwZS5zdG9wX2FkYXB0YXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICAvLyBPcHRpb25hbCwgc29tZSBzdGVwcGVycyBtaWdodCBub3QgYmUgYWRhcHRpdmUuICovIFxuICB9O1xuICBcbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5nIGluZm8gcmVnYXJkaW5nIHRoZSBzdGVwcGVyLlxuICAgKi8gXG4gIFN0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbigpIHtcbiAgICAvLyBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGluZm8gYWJvdXQgdGhlIHN0YXRlIG9mIHRoZSBzdGVwcGVyLlxuICAgIHJldHVybiB7fTtcbiAgfTtcbiAgXG4gIFxuICAvKipcbiAgICogQGNsYXNzXG4gICAqIEBpbXBsZW1lbnRzIHtTdGVwcGVyfVxuICAgKiBDb25zdHJ1Y3RvciBmb3IgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgbWV0cm9wb2xpcyBzdGVwIGluXG4gICAqIHRoZSBBZGFwdGl2ZSBNZXRyb3BvbGlzLVdpdGhpbi1HaWJicyBhbGdvcml0aG0gaW4gXCJFeGFtcGxlcyBvZiBBZGFwdGl2ZSBNQ01DXCJcbiAgICogYnkgUm9iZXJ0cyBhbmQgUm9zZW50aGFsICgyMDA4KS5cbiAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIGEgc2luZ2xlIHBhcmFtZXRlciBkZWZpbml0aW9uLlxuICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiBcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zIHRvIHRoZSBzdGVwcGVyLlxuICAgKiBAcGFyYW0gZ2VuZXJhdGVfcHJvcG9zYWwgLSBhIGZ1bmN0aW9uIHJldHVybmluZyBhIHByb3Bvc2FsIChhcyBhIG51bWJlcilcbiAgICogd2l0aCBzaWduYXR1cmUgZnVuY3Rpb24ocGFyYW1fc3RhdGUsIGxvZ19zY2FsZSkgd2hlcmUgcGFyYW1fc3RhdGUgaXMgYVxuICAgKiBudW1iZXIgYW5kIGxvZ19zY2FsZSBkZWZpbmVzIHRoZSBzY2FsZSBvZiB0aGUgcHJvcG9zYWwgc29tZWhvdy5cbiAgKi9cbiAgdmFyIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIGdlbmVyYXRlX3Byb3Bvc2FsKSB7XG4gICAgU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0KTtcbiAgICBcbiAgICB2YXIgcGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7XG4gICAgaWYocGFyYW1fbmFtZXMubGVuZ3RoICAhPSAxKSB7XG4gICAgICB0aHJvdyBcIk9uZWRpbU1ldHJvcG9saXNTdGVwcGVyIGNhbiBvbmx5IGhhbmRsZSBvbmUgcGFyYW1ldGVyLlwiO1xuICAgIH1cbiAgICB0aGlzLnBhcmFtX25hbWUgPSBwYXJhbV9uYW1lc1swXTtcbiAgICB2YXIgcGFyYW0gPSB0aGlzLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVdO1xuICAgIGlmKCFhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHtcbiAgICAgIHRocm93IFwiT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgY2FuIG9ubHkgaGFuZGxlIG9uZSBvbmUtZGltZW5zaW9uYWwgcGFyYW1ldGVyLlwiO1xuICAgIH1cbiAgICB0aGlzLmxvd2VyID0gcGFyYW0ubG93ZXI7XG4gICAgdGhpcy51cHBlciA9IHBhcmFtLnVwcGVyO1xuICAgIFxuICAgIHRoaXMucHJvcF9sb2dfc2NhbGUgICAgID0gZ2V0X29wdGlvbihcInByb3BfbG9nX3NjYWxlXCIsIG9wdGlvbnMsIDApO1xuICAgIHRoaXMuYmF0Y2hfc2l6ZSAgICAgICAgID0gZ2V0X29wdGlvbihcImJhdGNoX3NpemVcIiwgb3B0aW9ucywgNTApO1xuICAgIHRoaXMubWF4X2FkYXB0YXRpb24gICAgID0gZ2V0X29wdGlvbihcIm1heF9hZGFwdGF0aW9uXCIsIG9wdGlvbnMsIDAuMzMpO1xuICAgIHRoaXMuaW5pdGlhbF9hZGFwdGF0aW9uID0gZ2V0X29wdGlvbihcImluaXRpYWxfYWRhcHRhdGlvblwiLCBvcHRpb25zLCAxLjApO1xuICAgIHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlID0gZ2V0X29wdGlvbihcInRhcmdldF9hY2NlcHRfcmF0ZVwiLCBvcHRpb25zLCAwLjQ0KTtcbiAgICB0aGlzLmlzX2FkYXB0aW5nICAgICAgICA9IGdldF9vcHRpb24oXCJpc19hZGFwdGluZ1wiLCBvcHRpb25zLCB0cnVlKTtcbiAgICBcbiAgICB0aGlzLmdlbmVyYXRlX3Byb3Bvc2FsID0gZ2VuZXJhdGVfcHJvcG9zYWw7XG4gICAgXG4gICAgdGhpcy5hY2NlcHRhbmNlX2NvdW50ID0gMDtcbiAgICB0aGlzLmJhdGNoX2NvdW50ID0gMDtcbiAgICB0aGlzLml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24gPSAwOyAgXG4gIH07XG4gIFxuICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN0ZXBwZXIucHJvdG90eXBlKTsgXG4gIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyO1xuICBcbiAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBwYXJhbV9zdGF0ZSA9IHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXTtcbiAgICAgIHZhciBwYXJhbV9wcm9wb3NhbCA9IHRoaXMuZ2VuZXJhdGVfcHJvcG9zYWwocGFyYW1fc3RhdGUsIHRoaXMucHJvcF9sb2dfc2NhbGUpO1xuICAgICAgaWYocGFyYW1fcHJvcG9zYWwgPCB0aGlzLmxvd2VyIHx8IHBhcmFtX3Byb3Bvc2FsID4gdGhpcy51cHBlcikge1xuICAgICAgICAvLyBPdXRzaWRlIG9mIGxpbWl0cyBvZiB0aGUgcGFyYW1ldGVyLCByZWplY3QgdGhlIHByb3Bvc2FsIFxuICAgICAgICAvLyBhbmQgc3RheSBhdCB0aGUgY3VycmVudCBzdGF0ZS5cbiAgICAgIH0gZWxzZSB7IC8vIG1ha2UgYSBNZXRyb3BvbGlzIHN0ZXBcbiAgICAgICAgdmFyIGN1cnJfbG9nX2RlbnMgPSB0aGlzLmxvZ19wb3N0KCk7XG4gICAgICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IHBhcmFtX3Byb3Bvc2FsO1xuICAgICAgICB2YXIgcHJvcF9sb2dfZGVucyA9IHRoaXMubG9nX3Bvc3QoKTtcbiAgICAgICAgdmFyIGFjY2VwdF9wcm9iID0gTWF0aC5leHAocHJvcF9sb2dfZGVucyAtIGN1cnJfbG9nX2RlbnMpO1xuICAgICAgICBpZihhY2NlcHRfcHJvYiA+IE1hdGgucmFuZG9tKCkpIHtcbiAgICAgICAgICAvLyBXZSBkbyBub3RoaW5nIGFzIHRoZSBzdGF0ZSBvZiBwYXJhbSBoYXMgYWxyZWFkeSBiZWVuIGNoYW5nZWQgdG8gdGhlIHByb3Bvc2FsXG4gICAgICAgICAgaWYodGhpcy5pc19hZGFwdGluZykgdGhpcy5hY2NlcHRhbmNlX2NvdW50KysgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHJldmVydCBzdGF0ZSBiYWNrIHRvIHRoZSBvbGQgc3RhdGUgb2YgcGFyYW1cbiAgICAgICAgICB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0gPSBwYXJhbV9zdGF0ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYodGhpcy5pc19hZGFwdGluZykge1xuICAgICAgICB0aGlzLml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24gKys7XG4gICAgICAgIGlmKHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiA+PSB0aGlzLmJhdGNoX3NpemUpIHsgLy8gdGhlbiBhZGFwdFxuICAgICAgICAgIHRoaXMuYmF0Y2hfY291bnQgKys7XG4gICAgICAgICAgdmFyIGxvZ19zZF9hZGp1c3RtZW50ID0gXG4gICAgICAgICAgICBNYXRoLm1pbih0aGlzLm1heF9hZGFwdGF0aW9uLCBcbiAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbF9hZGFwdGF0aW9uIC8gTWF0aC5zcXJ0KHRoaXMuYmF0Y2hfY291bnQpKTtcbiAgICAgICAgICBpZih0aGlzLmFjY2VwdGFuY2VfY291bnQgLyB0aGlzLmJhdGNoX3NpemUgPiB0aGlzLnRhcmdldF9hY2NlcHRfcmF0ZSkge1xuICAgICAgICAgICAgdGhpcy5wcm9wX2xvZ19zY2FsZSArPSBsb2dfc2RfYWRqdXN0bWVudDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcm9wX2xvZ19zY2FsZSAtPSBsb2dfc2RfYWRqdXN0bWVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5hY2NlcHRhbmNlX2NvdW50ID0gMDtcbiAgICAgICAgICB0aGlzLml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24gPSAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdO1xuICB9O1xuICBcbiAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmlzX2FkYXB0aW5nID0gdHJ1ZTtcbiAgfTtcbiAgXG4gIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5zdG9wX2FkYXB0YXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmlzX2FkYXB0aW5nID0gZmFsc2U7XG4gIH07XG4gIFxuICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB7XG4gICAgICBwcm9wX2xvZ19zY2FsZTogdGhpcy5wcm9wX2xvZ19zY2FsZSxcbiAgICAgIGlzX2FkYXB0aW5nOiB0aGlzLmlzX2FkYXB0aW5nLFxuICAgICAgYWNjZXB0YW5jZV9jb3VudDogdGhpcy5hY2NlcHRhbmNlX2NvdW50LFxuICAgICAgaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbjogdGhpcy5pdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uLFxuICAgICAgYmF0Y2hfY291bnQ6IHRoaXMuYmF0Y2hfY291bnRcbiAgICB9O1xuICB9O1xuICBcbiAgXG4gIC8qKlxuICAgKiBGdW5jdGlvbiByZXR1cm5pbmcgYSBOb3JtYWwgcHJvcG9zYWwuXG4gICAqL1xuICB2YXIgbm9ybWFsX3Byb3Bvc2FsID0gZnVuY3Rpb24ocGFyYW1fc3RhdGUsIHByb3BfbG9nX3NjYWxlKSB7XG4gICAgcmV0dXJuIHJub3JtKHBhcmFtX3N0YXRlICwgTWF0aC5leHAocHJvcF9sb2dfc2NhbGUpKTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGF1Z21lbnRzIHtPbmVkaW1NZXRyb3BvbGlzU3RlcHBlcn1cbiAgICogQSBcInN1YmNsYXNzXCIgb2YgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgbWFraW5nIGNvbnRpbm91cyBOb3JtYWwgcHJvcG9zYWxzLlxuICAgKi9cbiAgdmFyIFJlYWxNZXRyb3BvbGlzU3RlcHBlciA9IGZ1bmN0aW9uKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKSB7XG4gICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgbm9ybWFsX3Byb3Bvc2FsKTtcbiAgfTtcbiAgXG4gIFJlYWxNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7IFxuICBSZWFsTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmVhbE1ldHJvcG9saXNTdGVwcGVyO1xuICBcbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHJldHVybmluZyBhIGRpc2NyZXRpemVkIE5vcm1hbCBwcm9wb3NhbC5cbiAgICovXG4gIHZhciBkaXNjcmV0ZV9ub3JtYWxfcHJvcG9zYWwgPSBmdW5jdGlvbihwYXJhbV9zdGF0ZSwgcHJvcF9sb2dfc2NhbGUpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChybm9ybShwYXJhbV9zdGF0ZSAsIE1hdGguZXhwKHByb3BfbG9nX3NjYWxlKSkpO1xuICB9O1xuICBcbiAgICAvKipcbiAgICogQGNsYXNzXG4gICAqIEBhdWdtZW50cyB7T25lZGltTWV0cm9wb2xpc1N0ZXBwZXJ9XG4gICAqIEEgXCJzdWJjbGFzc1wiIG9mIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyIG1ha2luZyBkaXNjcmV0aXplZCBOb3JtYWwgcHJvcG9zYWxzLlxuICAgKi9cbiAgdmFyIEludE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHtcbiAgICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zLCBkaXNjcmV0ZV9ub3JtYWxfcHJvcG9zYWwpO1xuICB9O1xuICBcbiAgSW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgSW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW50TWV0cm9wb2xpc1N0ZXBwZXI7XG4gIFxuICBcbiAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn1cbiAgICogQ29uc3RydWN0b3IgZm9yIGFuIG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlIG1ldHJvcG9saXMgc3RlcCBpblxuICAgKiB0aGUgQWRhcHRpdmUgTWV0cm9wb2xpcy1XaXRoaW4tR2liYnMgYWxnb3JpdGhtIGluIFwiRXhhbXBsZXMgb2YgQWRhcHRpdmUgTUNNQ1wiXG4gICAqIGJ5IFJvYmVydHMgYW5kIFJvc2VudGhhbCAoMjAwOCkgZm9yIHBvc3NpYmx5IG11bHRpZGltZW5zaW9uYWwgYXJyYXlzLiBUaGF0XG4gICAqIGlzLCBpbnN0ZWFkIG9mIGp1c3QgdGFraW5nIGEgc3RlcCBmb3IgYSBvbmUtZGltZW5zaW9uYWwgcGFyYW1ldGVyIGxpa2UgXG4gICAqIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLCB0aGlzIFN0ZXBwZXIgaXMgcmVzcG9uc2libGUgZm9yIHRha2luZyBzdGVwcyBcbiAgICogZm9yIGEgbXVsdGlkaW1lbnNpb25hbCBhcnJheS4gSXQncyBzdGlsbCBwcmV0dHkgZHVtYiBhbmQganVzdCB0YWtlc1xuICAgKiBvbmUtZGltZW5zaW9uYWwgc3RlcHMgZm9yIGVhY2ggcGFyYW1ldGVyIGNvbXBvbmVudCwgdGhvdWdoLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyIGRlZmluaXRpb24gZm9yIGEgXG4gICAqICAgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIuXG4gICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuXG4gICAqIEBwYXJhbSBTdWJTdGVwcGVyIC0gYSBjb25zdHJ1Y3RvciBmb3IgdGhlIHR5cGUgb2Ygb25lIGRpbWVuc2lvbmFsIFN0ZXBwZXIgdG8gYXBwbHkgb25cbiAgICogICBhbGwgdGhlIGNvbXBvbmVudHMgb2YgdGhlIG11bHRpZGltZW5zaW9uYWwgcGFyYW1ldGVyLlxuICAqL1xuICB2YXIgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciA9IGZ1bmN0aW9uKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zLCBTdWJTdGVwcGVyKSB7XG4gICAgU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0KTtcbiAgICBcbiAgICB2YXIgcGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7XG4gICAgaWYocGFyYW1fbmFtZXMubGVuZ3RoICAhPSAxKSB7XG4gICAgICB0aHJvdyBcIk11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgY2FuJ3QgaGFuZGxlIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyLlwiO1xuICAgIH1cbiAgICB0aGlzLnBhcmFtX25hbWUgPSBwYXJhbV9uYW1lc1swXTtcbiAgICB2YXIgcGFyYW0gPSB0aGlzLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVdO1xuICAgIHRoaXMubG93ZXIgPSBwYXJhbS5sb3dlcjtcbiAgICB0aGlzLnVwcGVyID0gcGFyYW0udXBwZXI7XG4gICAgdGhpcy5kaW0gPSBwYXJhbS5kaW07XG4gIFxuICAgIHRoaXMucHJvcF9sb2dfc2NhbGUgICAgID0gZ2V0X211bHRpZGltX29wdGlvbihcInByb3BfbG9nX3NjYWxlXCIsIG9wdGlvbnMsIHRoaXMuZGltLCAwKTtcbiAgICB0aGlzLmJhdGNoX3NpemUgICAgICAgICA9IGdldF9tdWx0aWRpbV9vcHRpb24oXCJiYXRjaF9zaXplXCIsIG9wdGlvbnMsIHRoaXMuZGltLCA1MCk7XG4gICAgdGhpcy5tYXhfYWRhcHRhdGlvbiAgICAgPSBnZXRfbXVsdGlkaW1fb3B0aW9uKFwibWF4X2FkYXB0YXRpb25cIiwgb3B0aW9ucywgdGhpcy5kaW0sIDAuMzMpO1xuICAgIHRoaXMuaW5pdGlhbF9hZGFwdGF0aW9uID0gZ2V0X211bHRpZGltX29wdGlvbihcImluaXRpYWxfYWRhcHRhdGlvblwiLCBvcHRpb25zLCB0aGlzLmRpbSwgMS4wKTtcbiAgICB0aGlzLnRhcmdldF9hY2NlcHRfcmF0ZSA9IGdldF9tdWx0aWRpbV9vcHRpb24oXCJ0YXJnZXRfYWNjZXB0X3JhdGVcIiwgb3B0aW9ucywgdGhpcy5kaW0sIDAuNDQpO1xuICAgIHRoaXMuaXNfYWRhcHRpbmcgICAgICAgID0gZ2V0X211bHRpZGltX29wdGlvbihcImlzX2FkYXB0aW5nXCIsIG9wdGlvbnMsIHRoaXMuZGltLCB0cnVlKTtcbiAgICBcbiAgICAvLyBUaGlzIGhhY2sgYmVsb3cgaXMgYSByZWN1cnNpdmUgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuIGFycmF5IG9mIFxuICAgIC8vIG9uZSBkaW1lbnNpb25hbCBzdGVwcGVycyBhY2NvcmRpbmcgdG8gZGltLlxuICAgIHZhciBjcmVhdGVfc3Vic3RlcHBlcnMgPSBcbiAgICAgIGZ1bmN0aW9uKGRpbSwgc3Vic3RhdGUsIGxvZ19wb3N0LCBwcm9wX2xvZ19zY2FsZSwgYmF0Y2hfc2l6ZSwgbWF4X2FkYXB0YXRpb24sIGluaXRpYWxfYWRhcHRhdGlvbiwgdGFyZ2V0X2FjY2VwdF9yYXRlLCBpc19hZGFwdGluZykge1xuICAgICAgdmFyIHN1YnN0ZXBwZXJzID0gW107XG4gICAgICBpZihkaW0ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBkaW1bMF07IGkrKykge1xuICAgICAgICAgIHZhciBzdWJvcHRpb25zID0ge3Byb3BfbG9nX3NjYWxlOiBwcm9wX2xvZ19zY2FsZVtpXSwgYmF0Y2hfc2l6ZTogYmF0Y2hfc2l6ZVtpXSxcbiAgICAgICAgICAgIG1heF9hZGFwdGF0aW9uOiBtYXhfYWRhcHRhdGlvbltpXSwgaW5pdGlhbF9hZGFwdGF0aW9uOiBpbml0aWFsX2FkYXB0YXRpb25baV0sXG4gICAgICAgICAgICB0YXJnZXRfYWNjZXB0X3JhdGU6IHRhcmdldF9hY2NlcHRfcmF0ZVtpXSwgaXNfYWRhcHRpbmc6IGlzX2FkYXB0aW5nW2ldfTtcbiAgICAgICAgICAgIHZhciBzdWJwYXJhbSA9IHt9O1xuICAgICAgICAgICAgc3VicGFyYW1baV0gPSBkZWVwX2Nsb25lKHBhcmFtKTtcbiAgICAgICAgICAgIHN1YnBhcmFtW2ldLmRpbSA9IFsxXTsgLy8gQXMgdGhpcyBzaG91bGQgbm93IGJlIGEgb25lLWRpbSBwYXJhbWV0ZXJcbiAgICAgICAgICAgIGRlbGV0ZSBzdWJwYXJhbVtpXS5pbml0OyAvLyBBcyBpdCBzb3VsZCBub3QgYmUgbmVlZGVkXG4gICAgICAgICAgc3Vic3RlcHBlcnNbaV0gPSBuZXcgU3ViU3RlcHBlcihzdWJwYXJhbSwgc3Vic3RhdGUsIGxvZ19wb3N0LCBzdWJvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7XG4gICAgICAgICAgc3Vic3RlcHBlcnNbaV0gPSBjcmVhdGVfc3Vic3RlcHBlcnMoZGltLnNsaWNlKDEpLCBzdWJzdGF0ZVtpXSwgbG9nX3Bvc3QsIHByb3BfbG9nX3NjYWxlW2ldLCBcbiAgICAgICAgICAgIGJhdGNoX3NpemVbaV0sIG1heF9hZGFwdGF0aW9uW2ldLCBpbml0aWFsX2FkYXB0YXRpb25baV0sIHRhcmdldF9hY2NlcHRfcmF0ZVtpXSwgaXNfYWRhcHRpbmdbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3Vic3RlcHBlcnM7XG4gICAgfTtcbiAgICBcbiAgICB0aGlzLnN1YnN0ZXBwZXJzID0gY3JlYXRlX3N1YnN0ZXBwZXJzKHRoaXMuZGltLCB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0sIHRoaXMubG9nX3Bvc3QsXG4gICAgICB0aGlzLnByb3BfbG9nX3NjYWxlLCB0aGlzLmJhdGNoX3NpemUsIHRoaXMubWF4X2FkYXB0YXRpb24sIHRoaXMuaW5pdGlhbF9hZGFwdGF0aW9uLFxuICAgICAgdGhpcy50YXJnZXRfYWNjZXB0X3JhdGUsIHRoaXMuaXNfYWRhcHRpbmcpO1xuICAgIFxuICB9O1xuICBcbiAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN0ZXBwZXIucHJvdG90eXBlKTsgXG4gIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjtcbiAgXG4gIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBHbyB0aHJvdWdoIHRoZSBzdWJzdGVwcGVycyBpbiBhIHJhbmRvbSBvcmRlciBhbmQgY2FsbCBzdGVwKCkgb24gdGhlbS5cbiAgICByZXR1cm4gbmVzdGVkX2FycmF5X3JhbmRvbV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbihzdWJzdGVwcGVyKSB7cmV0dXJuIHN1YnN0ZXBwZXIuc3RlcCgpOyB9KTtcbiAgfTtcbiAgXG4gIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICBuZXN0ZWRfYXJyYXlfYXBwbHkodGhpcy5zdWJzdGVwcGVycywgZnVuY3Rpb24oc3Vic3RlcHBlcikge3N1YnN0ZXBwZXIuc3RhcnRfYWRhcHRhdGlvbigpOyB9KTtcbiAgfTtcbiAgXG4gIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIG5lc3RlZF9hcnJheV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbihzdWJzdGVwcGVyKSB7c3Vic3RlcHBlci5zdG9wX2FkYXB0YXRpb24oKTsgfSk7XG4gIH07XG4gIFxuICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5pbmZvID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5lc3RlZF9hcnJheV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbihzdWJzdGVwcGVyKSB7XG4gICAgICByZXR1cm4gc3Vic3RlcHBlci5pbmZvKCk7IFxuICAgIH0pO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAYXVnbWVudHMge011bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXJ9XG4gICAqIEEgXCJzdWJjbGFzc1wiIG9mIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgbWFraW5nIGNvbnRpbm91cyBOb3JtYWwgcHJvcG9zYWxzLlxuICAgKi9cbiAgdmFyIE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHtcbiAgICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIFJlYWxNZXRyb3BvbGlzU3RlcHBlcik7XG4gIH07XG4gIFxuICBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlKTsgXG4gIE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyO1xuXG4gIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGF1Z21lbnRzIHtNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyfVxuICAgKiBBIFwic3ViY2xhc3NcIiBvZiBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIG1ha2luZyBkaXNjcmV0aXplZCBOb3JtYWwgcHJvcG9zYWxzLlxuICAgKi8gICAgXG4gIHZhciBNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHtcbiAgICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIEludE1ldHJvcG9saXNTdGVwcGVyKTtcbiAgfTtcbiAgXG4gIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7IFxuICBNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI7XG4gIFxuICAvKipcbiAgICogQGNsYXNzXG4gICAqIEBpbXBsZW1lbnRzIHtTdGVwcGVyfVxuICAgKiBDb25zdHJ1Y3RvciBmb3IgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBhIHN0ZXAgZm9yIGEgYmluYXJ5IHBhcmFtZXRlci5cbiAgICogVGhpcyBpcyBkb25lIGJ5IGV2YWx1YXRpbmcgdGhlIGxvZyBwb3N0ZXJpb3IgZm9yIGJvdGggc3RhdGVzIG9mIHRoZVxuICAgKiBwYXJhbWV0ZXIgYW5kIHRoZW4gc2VsZWN0aW5nIGEgc3RhdGUgcmFuZG9tbHkgd2l0aCBwcm9iYWJpbGl0eSByZWxhdGl2ZSBcbiAgICogdG8gdGhlIHBvc3RlcmlvciBvZiBlYWNoIHN0YXRlLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyIGRlZmluaXRpb24uXG4gICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuXG4gICovXG4gIHZhciBCaW5hcnlTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHtcbiAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpO1xuICAgIHZhciBwYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTtcbiAgICBpZihwYXJhbV9uYW1lcy5sZW5ndGggID09IDEpIHtcbiAgICAgIHRoaXMucGFyYW1fbmFtZSA9IHBhcmFtX25hbWVzWzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBcIkJpbmFyeVN0ZXBwZXIgY2FuJ3QgaGFuZGxlIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyLlwiO1xuICAgIH1cbiAgfTtcbiAgXG4gIEJpbmFyeVN0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdGVwcGVyLnByb3RvdHlwZSk7IFxuICBCaW5hcnlTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJpbmFyeVN0ZXBwZXI7XG4gIFxuICBCaW5hcnlTdGVwcGVyLnByb3RvdHlwZS5zdGVwID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gMDtcbiAgICB2YXIgemVyb19sb2dfZGVucyA9IHRoaXMubG9nX3Bvc3QoKTtcbiAgICB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0gPSAxO1xuICAgIHZhciBvbmVfbG9nX2RlbnMgPSB0aGlzLmxvZ19wb3N0KCk7XG4gICAgdmFyIG1heF9sb2dfZGVucyA9IE1hdGgubWF4KHplcm9fbG9nX2RlbnMsIG9uZV9sb2dfZGVucyk7XG4gICAgemVyb19sb2dfZGVucyAtPSBtYXhfbG9nX2RlbnM7XG4gICAgb25lX2xvZ19kZW5zIC09IG1heF9sb2dfZGVucztcbiAgICB2YXIgemVyb19wcm9iID0gTWF0aC5leHAoemVyb19sb2dfZGVucyAtIE1hdGgubG9nKCBNYXRoLmV4cCh6ZXJvX2xvZ19kZW5zKSArIE1hdGguZXhwKG9uZV9sb2dfZGVucykgKSApO1xuICAgIGlmKE1hdGgucmFuZG9tKCkgPCB6ZXJvX3Byb2IpIHtcbiAgICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IDA7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IC8vIGVsc2Uga2VlcCB0aGUgcGFyYW0gYXQgMSAuXG4gICAgcmV0dXJuIDE7XG4gIH07XG4gIFxuICAgIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGltcGxlbWVudHMge1N0ZXBwZXJ9XG4gICAqIEp1c3QgbGlrZSBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIHRoaXMgU3RlcHBlciB0YWtlcyBhIHN0ZXBzIGZvclxuICAgKiBhIG11bHRpZGltZW5zaW9uYWwgcGFyYW1ldGVyIGJ5IHVwZGF0aW5nIGVhY2ggY29tcG9uZW50IGluIHR1cm4uIFRoZSBkaWZmZXJlbmNlXG4gICAqIGlzIHRoYXQgdGhpcyBzdGVwcGVyIHdvcmtzIG9uIGJpbmFyeSBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyIGRlZmluaXRpb24gZm9yIGEgXG4gICAqICAgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIuXG4gICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuXG4gICovXG4gIHZhciBCaW5hcnlDb21wb25lbnRTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHtcbiAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpO1xuICAgIFxuICAgIHZhciBwYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTtcbiAgICBpZihwYXJhbV9uYW1lcy5sZW5ndGggID09IDEpIHtcbiAgICAgIHRoaXMucGFyYW1fbmFtZSA9IHBhcmFtX25hbWVzWzBdO1xuICAgICAgdmFyIHBhcmFtID0gdGhpcy5wYXJhbXNbdGhpcy5wYXJhbV9uYW1lXTtcbiAgICAgIHRoaXMuZGltID0gcGFyYW0uZGltO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBcIkJpbmFyeUNvbXBvbmVudFN0ZXBwZXIgY2FuJ3QgaGFuZGxlIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyLlwiO1xuICAgIH1cbiAgICBcbiAgICB2YXIgY3JlYXRlX3N1YnN0ZXBwZXJzID0gXG4gICAgICBmdW5jdGlvbihkaW0sIHN1YnN0YXRlLCBsb2dfcG9zdCkge1xuICAgICAgdmFyIHN1YnN0ZXBwZXJzID0gW107XG4gICAgICB2YXIgaTtcbiAgICAgIGlmKGRpbS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgICB2YXIgc3VicGFyYW1zID0ge307XG4gICAgICAgICAgc3VicGFyYW1zW2ldID0gcGFyYW07XG4gICAgICAgICAgc3Vic3RlcHBlcnNbaV0gPSBuZXcgQmluYXJ5U3RlcHBlcihzdWJwYXJhbXMsIHN1YnN0YXRlLCBsb2dfcG9zdCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcihpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7XG4gICAgICAgICAgc3Vic3RlcHBlcnNbaV0gPSBjcmVhdGVfc3Vic3RlcHBlcnMoZGltLnNsaWNlKDEpLCBzdWJzdGF0ZVtpXSwgbG9nX3Bvc3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3Vic3RlcHBlcnM7XG4gICAgfTtcbiAgICBcbiAgICB0aGlzLnN1YnN0ZXBwZXJzID0gY3JlYXRlX3N1YnN0ZXBwZXJzKHRoaXMuZGltLCB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0sIHRoaXMubG9nX3Bvc3QpO1xuICB9O1xuICBcbiAgQmluYXJ5Q29tcG9uZW50U3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN0ZXBwZXIucHJvdG90eXBlKTsgXG4gIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQmluYXJ5Q29tcG9uZW50U3RlcHBlcjtcbiAgXG4gIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBHbyB0aHJvdWdoIHRoZSBzdWJzdGVwcGVycyBpbiBhIHJhbmRvbSBvcmRlciBhbmQgY2FsbCBzdGVwKCkgb24gdGhlbS5cbiAgICByZXR1cm4gbmVzdGVkX2FycmF5X3JhbmRvbV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbihzdWJzdGVwcGVyKSB7cmV0dXJuIHN1YnN0ZXBwZXIuc3RlcCgpOyB9KTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGltcGxlbWVudHMge1N0ZXBwZXJ9XG4gICAqIFRoaXMgc3RlcHBlciBjYW4gYmUgcmVzcG9uc2libGUgZm9yIHRha2luZyBhIHN0ZXAgZm9yIG9uZSBvciBtb3JlIHBhcmFtZXRlcnMuXG4gICAqIEZvciByZWFsIGFuZCBpbnQgcGFyYW1ldGVycyBpdCB0YWtlcyBNZXRyb3BvbGlzIHdpdGhpbiBHaWJicyBzdGVwcywgYW5kIGZvciBcbiAgICogYmluYXJ5IHBhcmFtZXRlcnMgaXQgZG9lcyBldmFsdWF0ZXMgdGhlIHBvc3RlcmlvciBmb3IgYm90aCBwYXJhbXRlciB2YWx1ZXMgYW5kXG4gICAqIHJhbmRvbWx5IGNoYW5nZXMgdG8gYSBjZXJ0YWluIHZhbHVlIHByb3BvcnRpb25hbGx5IHRvIHRoYXQgdmFsdWUncyBwb3N0ZXJpb3JcbiAgICogKHRoaXMgaXMgYWxzbyBkb25lIGZvciBlYWNoIHBhcmFtZXRlciwgc28gYWxzbyBhICogd2l0aGluIEdpYmJzIGFwcHJvYWNoKS5cbiAgICogVGhpcyBzdGVwcGVyIGlzIGFsc28gYWRhcHRpdmUgYW5kIGNhbiBiZSBlZmZpY2llbnQgd2hlbiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnNcbiAgICogYXJlIG5vdCB0b28gaGlnaCBhbmQgdGhlIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHBhcmFtZXRlcnMgYXJlIGxvdy5cbiAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIGEgb25lIG9yIG1vcmUgcGFyYW1ldGVyIGRlZmluaXRpb25zXG4gICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuXG4gICovXG4gIHZhciBBbXdnU3RlcHBlciA9IGZ1bmN0aW9uKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKSB7XG4gICAgU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0KTtcbiAgICB0aGlzLnBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpO1xuICAgIHRoaXMuc3Vic3RlcHBlcnMgPSBbXTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5wYXJhbV9uYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhcmFtID0gcGFyYW1zW3RoaXMucGFyYW1fbmFtZXNbaV1dO1xuICAgICAgdmFyIFNlbGVjdFN0ZXBwZXI7XG4gICAgICBzd2l0Y2ggKHBhcmFtLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcInJlYWxcIjpcbiAgICAgICAgICBpZihhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHtcbiAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBSZWFsTWV0cm9wb2xpc1N0ZXBwZXI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJpbnRcIjpcbiAgICAgICAgICBpZihhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHtcbiAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBJbnRNZXRyb3BvbGlzU3RlcHBlcjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYmluYXJ5XCI6XG4gICAgICAgICAgaWYoYXJyYXlfZXF1YWwocGFyYW0uZGltLCBbMV0pKSB7XG4gICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gQmluYXJ5U3RlcHBlcjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IEJpbmFyeUNvbXBvbmVudFN0ZXBwZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IFwiQW13Z1N0ZXBwZXIgY2FuJ3QgaGFuZGxlIHBhcmFtZXRlciBcIiArIHRoaXMucGFyYW1fbmFtZXNbaV0gICtcIiB3aXRoIHR5cGUgXCIgKyBwYXJhbS50eXBlOyBcbiAgICAgIH1cbiAgICAgIHZhciBwYXJhbV9vYmplY3Rfd3JhcCA9IHt9O1xuICAgICAgcGFyYW1fb2JqZWN0X3dyYXBbdGhpcy5wYXJhbV9uYW1lc1tpXV0gPSBwYXJhbTtcbiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgdmFyIHBhcmFtX29wdGlvbnMgPSBvcHRpb25zLnBhcmFtcyAmJiBvcHRpb25zLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVzW2ldXSB8fCB7fTtcbiAgICAgIHBhcmFtX29wdGlvbnMucHJvcF9sb2dfc2NhbGUgICAgID0gcGFyYW1fb3B0aW9ucy5wcm9wX2xvZ19zY2FsZSAgICAgfHwgb3B0aW9ucy5wcm9wX2xvZ19zY2FsZTsgXG4gICAgICBwYXJhbV9vcHRpb25zLmJhdGNoX3NpemUgICAgICAgICA9IHBhcmFtX29wdGlvbnMuYmF0Y2hfc2l6ZSAgICAgICAgIHx8IG9wdGlvbnMuYmF0Y2hfc2l6ZTsgXG4gICAgICBwYXJhbV9vcHRpb25zLm1heF9hZGFwdGF0aW9uICAgICA9IHBhcmFtX29wdGlvbnMubWF4X2FkYXB0YXRpb24gICAgIHx8IG9wdGlvbnMubWF4X2FkYXB0YXRpb247XG4gICAgICBwYXJhbV9vcHRpb25zLmluaXRpYWxfYWRhcHRhdGlvbiA9IHBhcmFtX29wdGlvbnMuaW5pdGlhbF9hZGFwdGF0aW9uIHx8IG9wdGlvbnMuaW5pdGlhbF9hZGFwdGF0aW9uO1xuICAgICAgcGFyYW1fb3B0aW9ucy50YXJnZXRfYWNjZXB0X3JhdGUgPSBwYXJhbV9vcHRpb25zLnRhcmdldF9hY2NlcHRfcmF0ZSB8fCBvcHRpb25zLnRhcmdldF9hY2NlcHRfcmF0ZTsgXG4gICAgICBwYXJhbV9vcHRpb25zLmlzX2FkYXB0aW5nICAgICAgICA9IHBhcmFtX29wdGlvbnMuaXNfYWRhcHRpbmcgICAgICAgIHx8IG9wdGlvbnMuaXNfYWRhcHRpbmc7IFxuICAgICAgdGhpcy5zdWJzdGVwcGVyc1tpXSA9IG5ldyBTZWxlY3RTdGVwcGVyKHBhcmFtX29iamVjdF93cmFwLCBzdGF0ZSwgbG9nX3Bvc3QsIHBhcmFtX29wdGlvbnMpO1xuICAgIH1cbiAgfTtcbiAgXG4gIEFtd2dTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQW13Z1N0ZXBwZXI7XG4gIFxuICBBbXdnU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIHNodWZmbGVfYXJyYXkodGhpcy5zdWJzdGVwcGVycyk7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic3RlcHBlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuc3Vic3RlcHBlcnNbaV0uc3RlcCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdGF0ZTtcbiAgfTtcbiAgXG4gIEFtd2dTdGVwcGVyLnByb3RvdHlwZS5zdGFydF9hZGFwdGF0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic3RlcHBlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuc3Vic3RlcHBlcnNbaV0uc3RhcnRfYWRhcHRhdGlvbigpO1xuICAgIH1cbiAgfTtcbiAgXG4gIEFtd2dTdGVwcGVyLnByb3RvdHlwZS5zdG9wX2FkYXB0YXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5zdWJzdGVwcGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5zdWJzdGVwcGVyc1tpXS5zdG9wX2FkYXB0YXRpb24oKTtcbiAgICB9IFxuICB9O1xuICBcbiAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaW5mbyA9IHt9O1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnN1YnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpbmZvW3RoaXMucGFyYW1fbmFtZXNbaV1dID0gdGhpcy5zdWJzdGVwcGVyc1tpXS5pbmZvKCk7XG4gICAgfVxuICAgIHJldHVybiBpbmZvO1xuICB9O1xuICBcbiAgXG4gIFxuICAvLy8vLy8vLy8vLyBTYW1wbGVyIEZ1bmN0aW9ucyAvLy8vLy8vLy8vXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgXG4gIFxuICAgLyoqXG4gICAqIEBpbnRlcmZhY2VcbiAgICogV2hpbGUgeW91IGNvdWxkIGZpdCBhIG1vZGVsIGJ5IHBhc3RpbmcgdG9nZXRoZXIgU3RlcHBlcnMsIGFcbiAgLy8gU2FtcGxlciBpcyBoZXJlIGlzIGEgY29udmVuaWVuY2UgY2xhc3Mgd2hlcmUgYW4gaW5zdGFuY2Ugb2YgU2FtcGxlclxuICAvLyBzZXRzIHVwIHRoZSBTdGVwcGVycywgY2hlY2tzIHRoZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbixcbiAgLy8gYW5kIG1hbmFnZXMgdGhlIHNhbXBsaW5nLiBUaGlzIGhlcmUgZGVmaW5lcyB0aGUgU2FtcGxlciBcImludGVyZmFjZVwiLlxuICAgKiBAaW50ZXJmYWNlXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMsIGZvciBleGFtcGxlOlxuICAgKiAgIHtcIm11XCI6IHtcInR5cGVcIjogXCJyZWFsXCJ9LCBcInNpZ21hXCI6IHtcInR5cGVcIjogXCJyZWFsXCIsIFwibG93ZXJcIiA9IDB9fVxuICAgKiAgIFRoZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMgZG9lc24ndCBoYXZlIHRvIGJlIFwiY29tcGxldGVcIiBhbmQgcHJvcGVydGllc1xuICAgKiAgIGxlZnQgb3V0IChsaWtlIGxvd2VyIGFuZCB1cHBlcikgd2lsbCBiZSBmaWxsZWQgaW4gYnkgZGVmYXVsdHMuXG4gICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gd2l0aCBzaWduYXR1cmUgZnVuY3Rpb24oc3RhdGUsIGRhdGEpLiBIZXJlXG4gICAqICAgc3RhdGUgd2lsbCBiZSBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSB3aXRoIGVhY2ggcGFyYW1ldGVyIGFzIGEgXG4gICAqICAga2V5IGFuZCB0aGUgcGFyYW1ldGVyIHZhbHVlcyBhcyBudW1iZXJzIG9yIGFycmF5cy4gRm9yIGV4YW1wbGU6XG4gICAqICAge1wibXVcIjogMywgXCJzaWdtYVwiOiAxLjV9LiBUaGUgZGF0YSBhcmd1bWVudCB3aWxsIGJlIHRoZSBzYW1lIG9iamVjdCBhcyBcbiAgICogICB0aGUgZGF0YSBhcmd1bWVudCBnaXZlbiBiZWxvdy5cbiAgICogQHBhcmFtIGRhdGEgLSBhbiBvYmplY3QgdGhhdCB3aWxsIGJlIHBhc3NlZCBvbiB0byB0aGUgbG9nX3Bvc3QgZnVuY3Rpb25cbiAgICogICB3aGVuIHNhbXBsaW5nLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHNhbXBsZXIuXG4gICAqL1xuICB2YXIgU2FtcGxlciA9IGZ1bmN0aW9uKHBhcmFtcywgbG9nX3Bvc3QsIGRhdGEsIG9wdGlvbnMpIHtcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIHRoaXMucGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7XG4gICAgXG4gICAgLy8gU2V0dGluZyBkZWZhdWx0IG9wdGlvbnMgaWYgbm90IHBhc3NlZCB0aHJvdWdoIHRoZSBvcHRpb25zIG9iamVjdFxuICAgIHRoaXMucGFyYW1faW5pdF9mdW4gICA9IGdldF9vcHRpb24oXCJwYXJhbV9pbml0X2Z1blwiLCBvcHRpb25zLCBwYXJhbV9pbml0X2ZpeGVkKTtcbiAgICB2YXIgdGhpbm5pbmdfaW50ZXJ2YWwgPSBnZXRfb3B0aW9uKFwidGhpblwiLCBvcHRpb25zLCAxKTtcbiAgICB2YXIgcGFyYW1zX3RvX21vbml0b3IgPSBnZXRfb3B0aW9uKFwibW9uaXRvclwiLCBvcHRpb25zLCBudWxsKTtcbiAgICB0aGlzLnRoaW4odGhpbm5pbmdfaW50ZXJ2YWwpO1xuICAgIHRoaXMubW9uaXRvcihwYXJhbXNfdG9fbW9uaXRvcik7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAvLyBDb21wbGV0aW5nIHRoZSBwYXJhbXMgYW5kIGluaXRpYWxpemluZyB0aGUgc3RhdGUuXG4gICAgdGhpcy5wYXJhbXMgPSBjb21wbGV0ZV9wYXJhbXModGhpcy5wYXJhbXMsIHRoaXMucGFyYW1faW5pdF9mdW4pO1xuICAgIHZhciBzdGF0ZSA9IHt9O1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnBhcmFtX25hbWVzLmxlbmd0aDsgaSsrICkge1xuICAgICAgc3RhdGVbdGhpcy5wYXJhbV9uYW1lc1tpXV0gPSB0aGlzLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVzW2ldXS5pbml0O1xuICAgIH1cbiAgICB0aGlzLmxvZ19wb3N0ID0gZnVuY3Rpb24oKSB7IFxuICAgICAgcmV0dXJuIGxvZ19wb3N0KHN0YXRlLCBkYXRhKTtcbiAgICB9O1xuICAgIC8vIFJ1bm5pbmcgdGhlIGxvZ19wb3N0IGZ1bmN0aW9uIG9uY2UgaW4gY2FzZSBpdCBmdXJ0aGVyIG1vZGlmaWVzIHRoZSBzdGF0ZVxuICAgIC8vIGZvciBleGFtcGxlIGFkZGluZyBkZXJpdmVkIHF1YW50aXRpZXMuXG4gICAgdGhpcy5sb2dfcG9zdCgpO1xuICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICB0aGlzLnN0ZXBwZXJzID0gdGhpcy5jcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSh0aGlzLnBhcmFtcywgdGhpcy5zdGF0ZSwgdGhpcy5sb2dfcG9zdCwgdGhpcy5vcHRpb25zKTtcbiAgfTtcbiAgXG4gIC8qKiBTaG91bGQgcmV0dXJuIGEgdmVjdG9yIG9mIHN0ZXBwZXJzIHRoYXQgd2hlbiBjYWxsZWQgXG4gICAqIHNob3VsZCB0YWtlIGEgc3RlcCBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlLlxuICAgKi9cbiAgU2FtcGxlci5wcm90b3R5cGUuY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUgPSBmdW5jdGlvbihzdGF0ZSwgbG9nX3Bvc3Qpe1xuICAgIHRocm93IFwiRXZlcnkgU2FtcGxlciBuZWVkcyB0byBpbXBsZW1lbnQgY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUoKVwiO1xuICB9O1xuICBcbiAgLyoqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggaW5mbyBhYm91dCB0aGUgc3RhdGUgb2YgdGhlIFNhbXBsZXIuXG4gICAqLyBcbiAgU2FtcGxlci5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB7c3RhdGU6IHRoaXMuc3RhdGUsIHRoaW46IHRoaXMudGhpbiwgbW9uaXRvcjogdGhpcy5tb25pdG9yLFxuICAgICAgICAgICAgc3RlcHBlcnM6IHRoaXMuc3RlcHBlcnN9O1xuICB9O1xuICBcbiAgLyoqIFRha2VzIGEgc3RlcCBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlLiBSZXR1cm5zIHRoZSBuZXcgc3BhY2VcbiAgICogYnV0IGFsc28gbW9kaWZpZXMgdGhlIHN0YXRlIGluIHBsYWNlLlxuICAgKi8gXG4gIFNhbXBsZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbigpIHtcbiAgICBzaHVmZmxlX2FycmF5KHRoaXMuc3RlcHBlcnMpO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnN0ZXBwZXJzW2ldLnN0ZXAoKTtcbiAgICB9XG4gICAgaWYoT2JqZWN0LmtleXModGhpcy5zdGF0ZSkubGVuZ3RoID4gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpLmxlbmd0aCkge1xuICAgICAgLy8gVGhlIHN0YXRlIGNvbnRhaW5zIGRldml2ZWQgcXVhbnRpdGllcyAobm90IG9ubHkgcGFyYW1ldGVycykgYW5kIHdlXG4gICAgICAvLyBuZWVkIHRvIHJ1biB0aGUgbG9nX3Bvc3Qgb25jZSBtb3JlIGluIG9yZGVyIHRvIHNldCB0aGUgZGVyaXZlZCBxdWFudGl0aWVzXG4gICAgICAvLyBmb3IgdGhlIGZpbmFsIHBhcmFtZXRlciBzdGF0ZVxuICAgICAgdGhpcy5sb2dfcG9zdCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdGF0ZTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBUYWtlcyBuX2l0ZXJhdGlvbnMgc3RlcHMgaW4gdGhlIHBhcmFtZXRlciBzcGFjZSBhbmQgcmV0dXJucyB0aGVtXG4gICAqIGFzIGFuIG9iamVjdCBvZiBhcnJheXMgd2l0aCBvbmUgYXJyYXkgcGVyIHBhcmFtZXRlci4gRm9yIGV4YW1wbGU6XG4gICAqIHttdTogWzEsIC0xLCAyLCAzLCAuLi5dLCBzaWdtYTogWzEsIDIsIDIsIDEsIC4uLl19LlxuICAgKiBJZiB0aGluIGlzID4gMSB0aGVuIG5faXRlcmF0aW9ucyAvIHRoaW4gc2FtcGxlcyBhcmUgcmV0dXJuZWQuXG4gICAqLyBcbiAgU2FtcGxlci5wcm90b3R5cGUuc2FtcGxlID0gZnVuY3Rpb24obl9pdGVyYXRpb25zKSB7XG4gICAgICAvLyBJbml0aWFsaXppbmcgY3Vycl9zYW1wbGUgd2hlcmUgdGhlIHNhbXBsZSBpcyBnb2luZyB0byBiZSBzYXZlZFxuICAgICAgLy8gYXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgb25lIGFycmF5IHBlciBwYXJhbWV0ZXIgdG8gYmUgbW9uaXRvcmVkLlxuICAgICAgdmFyIGksIGosIG1vbml0b3JlZF9wYXJhbXM7XG4gICAgICBpZih0aGlzLm1vbml0b3JlZF9wYXJhbXMgPT09IG51bGwpIHtcbiAgICAgICAgbW9uaXRvcmVkX3BhcmFtcyA9IE9iamVjdC5rZXlzKHRoaXMuc3RhdGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbW9uaXRvcmVkX3BhcmFtcyA9IHRoaXMubW9uaXRvcmVkX3BhcmFtcztcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdmFyIGN1cnJfc2FtcGxlID0ge307XG4gICAgICBmb3IoaiA9IDA7IGogPCBtb25pdG9yZWRfcGFyYW1zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGN1cnJfc2FtcGxlW21vbml0b3JlZF9wYXJhbXNbal1dID0gW107XG4gICAgICB9XG4gICAgICBcbiAgICAgIGZvcihpID0gMDsgaSA8IG5faXRlcmF0aW9uczsgaSsrKSB7XG4gICAgICAgIGlmKGkgJSB0aGlzLnRoaW5uaW5nX2ludGVydmFsID09PSAwKSB7XG4gICAgICAgICAgZm9yKGogPSAwOyBqIDwgbW9uaXRvcmVkX3BhcmFtcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIHBhcmFtID0gbW9uaXRvcmVkX3BhcmFtc1tqXTtcbiAgICAgICAgICAgIGN1cnJfc2FtcGxlW3BhcmFtXS5wdXNoKCBjbG9uZV9wYXJhbV9kcmF3KHRoaXMuc3RhdGVbcGFyYW1dKSApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0ZXAoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjdXJyX3NhbXBsZTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBUYWtlcyBuX2l0ZXJhdGlvbiBzdGVwcyBpbiBwYXJhbWV0ZXIgc3BhY2UgYnV0IHJldHVybnMgbm90aGluZy5cbiAgICovIFxuICBTYW1wbGVyLnByb3RvdHlwZS5idXJuID0gZnVuY3Rpb24obl9pdGVyYXRpb25zKSB7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IG5faXRlcmF0aW9uczsgaSsrKSB7XG4gICAgICB0aGlzLnN0ZXAoKTtcbiAgICB9XG4gIH07XG4gIFxuICAvKipcbiAgICogU2V0cyB3aGF0IHBhcmFtZXRlcnMgc2hvdWxkIGJlIG1vbml0b3JlZCBhbmQgcmV0dXJuZWQgd2hlbiBjYWxsaW5nXG4gICAqIHNhbXBsZS5cbiAgICovIFxuICBTYW1wbGVyLnByb3RvdHlwZS5tb25pdG9yID0gZnVuY3Rpb24ocGFyYW1zX3RvX21vbml0b3IpIHtcbiAgICAgIHRoaXMubW9uaXRvcmVkX3BhcmFtcyA9IHBhcmFtc190b19tb25pdG9yO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFNldHMgdGhlIHRoaW5uaW5nLiBGb3IgZXhhbXBsZSB0aGluID09IDEwIG1lYW5zIHRoYXQgZXZlcnkgMTB0aCBwb3N0ZXJpb3JcbiAgICogZHJhdyB3aWxsIGJlIGtlcHQuXG4gICAqLyBcbiAgU2FtcGxlci5wcm90b3R5cGUudGhpbiA9IGZ1bmN0aW9uKHRoaW5uaW5nX2ludGVydmFsKSB7XG4gICAgdGhpcy50aGlubmluZ19pbnRlcnZhbCA9IHRoaW5uaW5nX2ludGVydmFsO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFNldHMgYWRhcHRhdGlvbiBvbiwgaWYgYXBwbGljYWJsZSwgaW4gYWxsIHN0ZXBwZXJzLlxuICAgKi8gXG4gIFNhbXBsZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5zdGVwcGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5zdGVwcGVyc1tpXS5zdGFydF9hZGFwdGF0aW9uKCk7XG4gICAgfVxuICB9O1xuICBcbiAgICAvKipcbiAgICogU2V0cyBhZGFwdGF0aW9uIG9mZiwgaWYgYXBwbGljYWJsZSwgaW4gYWxsIHN0ZXBwZXJzLlxuICAgKi8gXG4gIFNhbXBsZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnN0ZXBwZXJzW2ldLnN0b3BfYWRhcHRhdGlvbigpO1xuICAgIH1cbiAgfTtcbiAgXG4gICAvKipcbiAgICogQGNsYXNzXG4gICAqIEBpbXBsZW1lbnRzIHtTYW1wbGVyfVxuICAgKiBUaGlzIHNhbXBsZXIgdXNlcyB0aGUgQW13Z1N0ZXBwZXIgYXMgdGhlIHN0ZXBwZXIgZnVuY3Rpb24gd2hpY2ggaW1wbGVtZW50cyB0aGUgXG4gICAqIEFkYXB0aXZlIE1ldHJvcG9saXMtV2l0aGluLUdpYmJzIGFsZ29yaXRobSBpbiBcIkV4YW1wbGVzIG9mIEFkYXB0aXZlIE1DTUNcIlxuICAgKiBieSBSb2JlcnRzIGFuZCBSb3NlbnRoYWwgKDIwMDgpLiBBbiBhZGl0aW9uIGlzIHRoYXQgaXQgaGFuZGxlcyBpbnQgcGFyYW1ldGVyc1xuICAgKiBieSBtYWtpbmcgZGlzY3JldGUgTm9ybWFsIHByb3Bvc2FscyBhbmQgYmluYXJ5IHBhcmFtZXRlcnMgYnkgdGFraW5nIG9uIGEgbmV3IFxuICAgKiB2YWx1ZSBwcm9wb3J0aW9uYWwgdG8gdGhlIHBvc3RlcmlvciBvZiB0aGUgdHdvIHBvc3NpYmxlIHN0YXRlcyBvZiB0aGVcbiAgICogcGFyYW1ldGVyLiBUaGlzIHNhbXBsZXIgY2FuIGJlIGVmZmljaWVudCB3aGVuIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVyc1xuICAgKiBhcmUgbm90IHRvbyBoaWdoIGFuZCB0aGUgY29ycmVsYXRpb25zIGJldHdlZW4gcGFyYW1ldGVycyBhcmUgbG93LlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBvbmUgb3IgbW9yZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnNcbiAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gbG9nX3Bvc3QgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci5cbiAgKi9cbiAgdmFyIEFtd2dTYW1wbGVyID0gZnVuY3Rpb24ocGFyYW1zLCBsb2dfcG9zdCwgZGF0YSwgb3B0aW9ucykge1xuICAgIFNhbXBsZXIuY2FsbCh0aGlzLCBwYXJhbXMsIGxvZ19wb3N0LCBkYXRhLCBvcHRpb25zKTtcbiAgfTtcbiAgXG4gIEFtd2dTYW1wbGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU2FtcGxlci5wcm90b3R5cGUpOyBcbiAgQW13Z1NhbXBsZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQW13Z1NhbXBsZXI7XG4gIFxuICBBbXdnU2FtcGxlci5wcm90b3R5cGUuY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucyl7XG4gICAgcmV0dXJuIFsgbmV3IEFtd2dTdGVwcGVyKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKSBdO1xuICB9O1xuICBcbiAgXG4gIC8vIFJldHVybmluZyB0aGUgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIHB1YmxpY2x5IGV4cG9zZWQgYnkgdGhpcyBtb2R1bGVcbiAgcmV0dXJuIHtcbiAgICBydW5pZjogcnVuaWYsXG4gICAgcnVuaWZfZGlzY3JldGU6IHJ1bmlmX2Rpc2NyZXRlLFxuICAgIHJub3JtOiBybm9ybSxcbiAgICBwYXJhbV9pbml0X2ZpeGVkOiBwYXJhbV9pbml0X2ZpeGVkLCBcbiAgICBjb21wbGV0ZV9wYXJhbXM6IGNvbXBsZXRlX3BhcmFtcywgXG4gICAgUmVhbE1ldHJvcG9saXNTdGVwcGVyOiBSZWFsTWV0cm9wb2xpc1N0ZXBwZXIsIFxuICAgIEludE1ldHJvcG9saXNTdGVwcGVyOiBJbnRNZXRyb3BvbGlzU3RlcHBlciwgXG4gICAgTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI6IE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLCBcbiAgICBNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyOiBNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLCBcbiAgICBCaW5hcnlTdGVwcGVyOiBCaW5hcnlTdGVwcGVyLCBcbiAgICBCaW5hcnlDb21wb25lbnRTdGVwcGVyOiBCaW5hcnlDb21wb25lbnRTdGVwcGVyLCBcbiAgICBBbXdnU3RlcHBlcjogQW13Z1N0ZXBwZXIsIFxuICAgIEFtd2dTYW1wbGVyOiBBbXdnU2FtcGxlclxuICB9O1xufSkpO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYXNjZW5kaW5nKGEsIGIpIHtcbiAgcmV0dXJuIGEgPT0gbnVsbCB8fCBiID09IG51bGwgPyBOYU4gOiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG51bWJlcih4KSB7XG4gIHJldHVybiB4ID09PSBudWxsID8gTmFOIDogK3g7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiogbnVtYmVycyh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKHZhbHVlID0gK3ZhbHVlKSA+PSB2YWx1ZSkge1xuICAgICAgICB5aWVsZCB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbCAmJiAodmFsdWUgPSArdmFsdWUpID49IHZhbHVlKSB7XG4gICAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IGFzY2VuZGluZyBmcm9tIFwiLi9hc2NlbmRpbmcuanNcIjtcbmltcG9ydCBwZXJtdXRlIGZyb20gXCIuL3Blcm11dGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc29ydCh2YWx1ZXMsIC4uLkYpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZXNbU3ltYm9sLml0ZXJhdG9yXSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwidmFsdWVzIGlzIG5vdCBpdGVyYWJsZVwiKTtcbiAgdmFsdWVzID0gQXJyYXkuZnJvbSh2YWx1ZXMpO1xuICBsZXQgW2ZdID0gRjtcbiAgaWYgKChmICYmIGYubGVuZ3RoICE9PSAyKSB8fCBGLmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCBpbmRleCA9IFVpbnQzMkFycmF5LmZyb20odmFsdWVzLCAoZCwgaSkgPT4gaSk7XG4gICAgaWYgKEYubGVuZ3RoID4gMSkge1xuICAgICAgRiA9IEYubWFwKGYgPT4gdmFsdWVzLm1hcChmKSk7XG4gICAgICBpbmRleC5zb3J0KChpLCBqKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZiBvZiBGKSB7XG4gICAgICAgICAgY29uc3QgYyA9IGFzY2VuZGluZ0RlZmluZWQoZltpXSwgZltqXSk7XG4gICAgICAgICAgaWYgKGMpIHJldHVybiBjO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZiA9IHZhbHVlcy5tYXAoZik7XG4gICAgICBpbmRleC5zb3J0KChpLCBqKSA9PiBhc2NlbmRpbmdEZWZpbmVkKGZbaV0sIGZbal0pKTtcbiAgICB9XG4gICAgcmV0dXJuIHBlcm11dGUodmFsdWVzLCBpbmRleCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlcy5zb3J0KGNvbXBhcmVEZWZpbmVkKGYpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVEZWZpbmVkKGNvbXBhcmUgPSBhc2NlbmRpbmcpIHtcbiAgaWYgKGNvbXBhcmUgPT09IGFzY2VuZGluZykgcmV0dXJuIGFzY2VuZGluZ0RlZmluZWQ7XG4gIGlmICh0eXBlb2YgY29tcGFyZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiY29tcGFyZSBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgcmV0dXJuIChhLCBiKSA9PiB7XG4gICAgY29uc3QgeCA9IGNvbXBhcmUoYSwgYik7XG4gICAgaWYgKHggfHwgeCA9PT0gMCkgcmV0dXJuIHg7XG4gICAgcmV0dXJuIChjb21wYXJlKGIsIGIpID09PSAwKSAtIChjb21wYXJlKGEsIGEpID09PSAwKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzY2VuZGluZ0RlZmluZWQoYSwgYikge1xuICByZXR1cm4gKGEgPT0gbnVsbCB8fCAhKGEgPj0gYSkpIC0gKGIgPT0gbnVsbCB8fCAhKGIgPj0gYikpIHx8IChhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMCk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYXgodmFsdWVzLCB2YWx1ZW9mKSB7XG4gIGxldCBtYXg7XG4gIGlmICh2YWx1ZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGxcbiAgICAgICAgICAmJiAobWF4IDwgdmFsdWUgfHwgKG1heCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWF4ID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBpbmRleCA9IC0xO1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWUsICsraW5kZXgsIHZhbHVlcykpICE9IG51bGxcbiAgICAgICAgICAmJiAobWF4IDwgdmFsdWUgfHwgKG1heCA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWF4ID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXg7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtaW4odmFsdWVzLCB2YWx1ZW9mKSB7XG4gIGxldCBtaW47XG4gIGlmICh2YWx1ZW9mID09PSB1bmRlZmluZWQpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGxcbiAgICAgICAgICAmJiAobWluID4gdmFsdWUgfHwgKG1pbiA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWluID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxldCBpbmRleCA9IC0xO1xuICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWUsICsraW5kZXgsIHZhbHVlcykpICE9IG51bGxcbiAgICAgICAgICAmJiAobWluID4gdmFsdWUgfHwgKG1pbiA9PT0gdW5kZWZpbmVkICYmIHZhbHVlID49IHZhbHVlKSkpIHtcbiAgICAgICAgbWluID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBtaW47XG59XG4iLCJpbXBvcnQge2FzY2VuZGluZ0RlZmluZWQsIGNvbXBhcmVEZWZpbmVkfSBmcm9tIFwiLi9zb3J0LmpzXCI7XG5cbi8vIEJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3VybmVyL3F1aWNrc2VsZWN0XG4vLyBJU0MgbGljZW5zZSwgQ29weXJpZ2h0IDIwMTggVmxhZGltaXIgQWdhZm9ua2luLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcXVpY2tzZWxlY3QoYXJyYXksIGssIGxlZnQgPSAwLCByaWdodCA9IEluZmluaXR5LCBjb21wYXJlKSB7XG4gIGsgPSBNYXRoLmZsb29yKGspO1xuICBsZWZ0ID0gTWF0aC5mbG9vcihNYXRoLm1heCgwLCBsZWZ0KSk7XG4gIHJpZ2h0ID0gTWF0aC5mbG9vcihNYXRoLm1pbihhcnJheS5sZW5ndGggLSAxLCByaWdodCkpO1xuXG4gIGlmICghKGxlZnQgPD0gayAmJiBrIDw9IHJpZ2h0KSkgcmV0dXJuIGFycmF5O1xuXG4gIGNvbXBhcmUgPSBjb21wYXJlID09PSB1bmRlZmluZWQgPyBhc2NlbmRpbmdEZWZpbmVkIDogY29tcGFyZURlZmluZWQoY29tcGFyZSk7XG5cbiAgd2hpbGUgKHJpZ2h0ID4gbGVmdCkge1xuICAgIGlmIChyaWdodCAtIGxlZnQgPiA2MDApIHtcbiAgICAgIGNvbnN0IG4gPSByaWdodCAtIGxlZnQgKyAxO1xuICAgICAgY29uc3QgbSA9IGsgLSBsZWZ0ICsgMTtcbiAgICAgIGNvbnN0IHogPSBNYXRoLmxvZyhuKTtcbiAgICAgIGNvbnN0IHMgPSAwLjUgKiBNYXRoLmV4cCgyICogeiAvIDMpO1xuICAgICAgY29uc3Qgc2QgPSAwLjUgKiBNYXRoLnNxcnQoeiAqIHMgKiAobiAtIHMpIC8gbikgKiAobSAtIG4gLyAyIDwgMCA/IC0xIDogMSk7XG4gICAgICBjb25zdCBuZXdMZWZ0ID0gTWF0aC5tYXgobGVmdCwgTWF0aC5mbG9vcihrIC0gbSAqIHMgLyBuICsgc2QpKTtcbiAgICAgIGNvbnN0IG5ld1JpZ2h0ID0gTWF0aC5taW4ocmlnaHQsIE1hdGguZmxvb3IoayArIChuIC0gbSkgKiBzIC8gbiArIHNkKSk7XG4gICAgICBxdWlja3NlbGVjdChhcnJheSwgaywgbmV3TGVmdCwgbmV3UmlnaHQsIGNvbXBhcmUpO1xuICAgIH1cblxuICAgIGNvbnN0IHQgPSBhcnJheVtrXTtcbiAgICBsZXQgaSA9IGxlZnQ7XG4gICAgbGV0IGogPSByaWdodDtcblxuICAgIHN3YXAoYXJyYXksIGxlZnQsIGspO1xuICAgIGlmIChjb21wYXJlKGFycmF5W3JpZ2h0XSwgdCkgPiAwKSBzd2FwKGFycmF5LCBsZWZ0LCByaWdodCk7XG5cbiAgICB3aGlsZSAoaSA8IGopIHtcbiAgICAgIHN3YXAoYXJyYXksIGksIGopLCArK2ksIC0tajtcbiAgICAgIHdoaWxlIChjb21wYXJlKGFycmF5W2ldLCB0KSA8IDApICsraTtcbiAgICAgIHdoaWxlIChjb21wYXJlKGFycmF5W2pdLCB0KSA+IDApIC0tajtcbiAgICB9XG5cbiAgICBpZiAoY29tcGFyZShhcnJheVtsZWZ0XSwgdCkgPT09IDApIHN3YXAoYXJyYXksIGxlZnQsIGopO1xuICAgIGVsc2UgKytqLCBzd2FwKGFycmF5LCBqLCByaWdodCk7XG5cbiAgICBpZiAoaiA8PSBrKSBsZWZ0ID0gaiArIDE7XG4gICAgaWYgKGsgPD0gaikgcmlnaHQgPSBqIC0gMTtcbiAgfVxuXG4gIHJldHVybiBhcnJheTtcbn1cblxuZnVuY3Rpb24gc3dhcChhcnJheSwgaSwgaikge1xuICBjb25zdCB0ID0gYXJyYXlbaV07XG4gIGFycmF5W2ldID0gYXJyYXlbal07XG4gIGFycmF5W2pdID0gdDtcbn1cbiIsImltcG9ydCBtYXggZnJvbSBcIi4vbWF4LmpzXCI7XG5pbXBvcnQgbWF4SW5kZXggZnJvbSBcIi4vbWF4SW5kZXguanNcIjtcbmltcG9ydCBtaW4gZnJvbSBcIi4vbWluLmpzXCI7XG5pbXBvcnQgbWluSW5kZXggZnJvbSBcIi4vbWluSW5kZXguanNcIjtcbmltcG9ydCBxdWlja3NlbGVjdCBmcm9tIFwiLi9xdWlja3NlbGVjdC5qc1wiO1xuaW1wb3J0IG51bWJlciwge251bWJlcnN9IGZyb20gXCIuL251bWJlci5qc1wiO1xuaW1wb3J0IHthc2NlbmRpbmdEZWZpbmVkfSBmcm9tIFwiLi9zb3J0LmpzXCI7XG5pbXBvcnQgZ3JlYXRlc3QgZnJvbSBcIi4vZ3JlYXRlc3QuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcXVhbnRpbGUodmFsdWVzLCBwLCB2YWx1ZW9mKSB7XG4gIHZhbHVlcyA9IEZsb2F0NjRBcnJheS5mcm9tKG51bWJlcnModmFsdWVzLCB2YWx1ZW9mKSk7XG4gIGlmICghKG4gPSB2YWx1ZXMubGVuZ3RoKSB8fCBpc05hTihwID0gK3ApKSByZXR1cm47XG4gIGlmIChwIDw9IDAgfHwgbiA8IDIpIHJldHVybiBtaW4odmFsdWVzKTtcbiAgaWYgKHAgPj0gMSkgcmV0dXJuIG1heCh2YWx1ZXMpO1xuICB2YXIgbixcbiAgICAgIGkgPSAobiAtIDEpICogcCxcbiAgICAgIGkwID0gTWF0aC5mbG9vcihpKSxcbiAgICAgIHZhbHVlMCA9IG1heChxdWlja3NlbGVjdCh2YWx1ZXMsIGkwKS5zdWJhcnJheSgwLCBpMCArIDEpKSxcbiAgICAgIHZhbHVlMSA9IG1pbih2YWx1ZXMuc3ViYXJyYXkoaTAgKyAxKSk7XG4gIHJldHVybiB2YWx1ZTAgKyAodmFsdWUxIC0gdmFsdWUwKSAqIChpIC0gaTApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcXVhbnRpbGVTb3J0ZWQodmFsdWVzLCBwLCB2YWx1ZW9mID0gbnVtYmVyKSB7XG4gIGlmICghKG4gPSB2YWx1ZXMubGVuZ3RoKSB8fCBpc05hTihwID0gK3ApKSByZXR1cm47XG4gIGlmIChwIDw9IDAgfHwgbiA8IDIpIHJldHVybiArdmFsdWVvZih2YWx1ZXNbMF0sIDAsIHZhbHVlcyk7XG4gIGlmIChwID49IDEpIHJldHVybiArdmFsdWVvZih2YWx1ZXNbbiAtIDFdLCBuIC0gMSwgdmFsdWVzKTtcbiAgdmFyIG4sXG4gICAgICBpID0gKG4gLSAxKSAqIHAsXG4gICAgICBpMCA9IE1hdGguZmxvb3IoaSksXG4gICAgICB2YWx1ZTAgPSArdmFsdWVvZih2YWx1ZXNbaTBdLCBpMCwgdmFsdWVzKSxcbiAgICAgIHZhbHVlMSA9ICt2YWx1ZW9mKHZhbHVlc1tpMCArIDFdLCBpMCArIDEsIHZhbHVlcyk7XG4gIHJldHVybiB2YWx1ZTAgKyAodmFsdWUxIC0gdmFsdWUwKSAqIChpIC0gaTApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcXVhbnRpbGVJbmRleCh2YWx1ZXMsIHAsIHZhbHVlb2YgPSBudW1iZXIpIHtcbiAgaWYgKGlzTmFOKHAgPSArcCkpIHJldHVybjtcbiAgbnVtYmVycyA9IEZsb2F0NjRBcnJheS5mcm9tKHZhbHVlcywgKF8sIGkpID0+IG51bWJlcih2YWx1ZW9mKHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkpO1xuICBpZiAocCA8PSAwKSByZXR1cm4gbWluSW5kZXgobnVtYmVycyk7XG4gIGlmIChwID49IDEpIHJldHVybiBtYXhJbmRleChudW1iZXJzKTtcbiAgdmFyIG51bWJlcnMsXG4gICAgICBpbmRleCA9IFVpbnQzMkFycmF5LmZyb20odmFsdWVzLCAoXywgaSkgPT4gaSksXG4gICAgICBqID0gbnVtYmVycy5sZW5ndGggLSAxLFxuICAgICAgaSA9IE1hdGguZmxvb3IoaiAqIHApO1xuICBxdWlja3NlbGVjdChpbmRleCwgaSwgMCwgaiwgKGksIGopID0+IGFzY2VuZGluZ0RlZmluZWQobnVtYmVyc1tpXSwgbnVtYmVyc1tqXSkpO1xuICBpID0gZ3JlYXRlc3QoaW5kZXguc3ViYXJyYXkoMCwgaSArIDEpLCAoaSkgPT4gbnVtYmVyc1tpXSk7XG4gIHJldHVybiBpID49IDAgPyBpIDogLTE7XG59XG4iLCJpbXBvcnQgcXVhbnRpbGUsIHtxdWFudGlsZUluZGV4fSBmcm9tIFwiLi9xdWFudGlsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZWRpYW4odmFsdWVzLCB2YWx1ZW9mKSB7XG4gIHJldHVybiBxdWFudGlsZSh2YWx1ZXMsIDAuNSwgdmFsdWVvZik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZWRpYW5JbmRleCh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgcmV0dXJuIHF1YW50aWxlSW5kZXgodmFsdWVzLCAwLjUsIHZhbHVlb2YpO1xufVxuIiwidmFyIG5vb3AgPSB7dmFsdWU6ICgpID0+IHt9fTtcblxuZnVuY3Rpb24gZGlzcGF0Y2goKSB7XG4gIGZvciAodmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aCwgXyA9IHt9LCB0OyBpIDwgbjsgKytpKSB7XG4gICAgaWYgKCEodCA9IGFyZ3VtZW50c1tpXSArIFwiXCIpIHx8ICh0IGluIF8pIHx8IC9bXFxzLl0vLnRlc3QodCkpIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgdHlwZTogXCIgKyB0KTtcbiAgICBfW3RdID0gW107XG4gIH1cbiAgcmV0dXJuIG5ldyBEaXNwYXRjaChfKTtcbn1cblxuZnVuY3Rpb24gRGlzcGF0Y2goXykge1xuICB0aGlzLl8gPSBfO1xufVxuXG5mdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMsIHR5cGVzKSB7XG4gIHJldHVybiB0eXBlbmFtZXMudHJpbSgpLnNwbGl0KC9efFxccysvKS5tYXAoZnVuY3Rpb24odCkge1xuICAgIHZhciBuYW1lID0gXCJcIiwgaSA9IHQuaW5kZXhPZihcIi5cIik7XG4gICAgaWYgKGkgPj0gMCkgbmFtZSA9IHQuc2xpY2UoaSArIDEpLCB0ID0gdC5zbGljZSgwLCBpKTtcbiAgICBpZiAodCAmJiAhdHlwZXMuaGFzT3duUHJvcGVydHkodCkpIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdHlwZTogXCIgKyB0KTtcbiAgICByZXR1cm4ge3R5cGU6IHQsIG5hbWU6IG5hbWV9O1xuICB9KTtcbn1cblxuRGlzcGF0Y2gucHJvdG90eXBlID0gZGlzcGF0Y2gucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogRGlzcGF0Y2gsXG4gIG9uOiBmdW5jdGlvbih0eXBlbmFtZSwgY2FsbGJhY2spIHtcbiAgICB2YXIgXyA9IHRoaXMuXyxcbiAgICAgICAgVCA9IHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lICsgXCJcIiwgXyksXG4gICAgICAgIHQsXG4gICAgICAgIGkgPSAtMSxcbiAgICAgICAgbiA9IFQubGVuZ3RoO1xuXG4gICAgLy8gSWYgbm8gY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBjYWxsYmFjayBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSAmJiAodCA9IGdldChfW3RdLCB0eXBlbmFtZS5uYW1lKSkpIHJldHVybiB0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIGEgdHlwZSB3YXMgc3BlY2lmaWVkLCBzZXQgdGhlIGNhbGxiYWNrIGZvciB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS5cbiAgICAvLyBPdGhlcndpc2UsIGlmIGEgbnVsbCBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZW1vdmUgY2FsbGJhY2tzIG9mIHRoZSBnaXZlbiBuYW1lLlxuICAgIGlmIChjYWxsYmFjayAhPSBudWxsICYmIHR5cGVvZiBjYWxsYmFjayAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGNhbGxiYWNrOiBcIiArIGNhbGxiYWNrKTtcbiAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgaWYgKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSBfW3RdID0gc2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUsIGNhbGxiYWNrKTtcbiAgICAgIGVsc2UgaWYgKGNhbGxiYWNrID09IG51bGwpIGZvciAodCBpbiBfKSBfW3RdID0gc2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUsIG51bGwpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuICBjb3B5OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgY29weSA9IHt9LCBfID0gdGhpcy5fO1xuICAgIGZvciAodmFyIHQgaW4gXykgY29weVt0XSA9IF9bdF0uc2xpY2UoKTtcbiAgICByZXR1cm4gbmV3IERpc3BhdGNoKGNvcHkpO1xuICB9LFxuICBjYWxsOiBmdW5jdGlvbih0eXBlLCB0aGF0KSB7XG4gICAgaWYgKChuID0gYXJndW1lbnRzLmxlbmd0aCAtIDIpID4gMCkgZm9yICh2YXIgYXJncyA9IG5ldyBBcnJheShuKSwgaSA9IDAsIG4sIHQ7IGkgPCBuOyArK2kpIGFyZ3NbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgZm9yICh0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpO1xuICB9LFxuICBhcHBseTogZnVuY3Rpb24odHlwZSwgdGhhdCwgYXJncykge1xuICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHR5cGU6IFwiICsgdHlwZSk7XG4gICAgZm9yICh2YXIgdCA9IHRoaXMuX1t0eXBlXSwgaSA9IDAsIG4gPSB0Lmxlbmd0aDsgaSA8IG47ICsraSkgdFtpXS52YWx1ZS5hcHBseSh0aGF0LCBhcmdzKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZ2V0KHR5cGUsIG5hbWUpIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aCwgYzsgaSA8IG47ICsraSkge1xuICAgIGlmICgoYyA9IHR5cGVbaV0pLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgIHJldHVybiBjLnZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXQodHlwZSwgbmFtZSwgY2FsbGJhY2spIHtcbiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgIGlmICh0eXBlW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgIHR5cGVbaV0gPSBub29wLCB0eXBlID0gdHlwZS5zbGljZSgwLCBpKS5jb25jYXQodHlwZS5zbGljZShpICsgMSkpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChjYWxsYmFjayAhPSBudWxsKSB0eXBlLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiBjYWxsYmFja30pO1xuICByZXR1cm4gdHlwZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZGlzcGF0Y2g7XG4iLCJleHBvcnQgdmFyIHhodG1sID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgc3ZnOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gIHhodG1sOiB4aHRtbCxcbiAgeGxpbms6IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLFxuICB4bWw6IFwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlXCIsXG4gIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvXCJcbn07XG4iLCJpbXBvcnQgbmFtZXNwYWNlcyBmcm9tIFwiLi9uYW1lc3BhY2VzLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIHByZWZpeCA9IG5hbWUgKz0gXCJcIiwgaSA9IHByZWZpeC5pbmRleE9mKFwiOlwiKTtcbiAgaWYgKGkgPj0gMCAmJiAocHJlZml4ID0gbmFtZS5zbGljZSgwLCBpKSkgIT09IFwieG1sbnNcIikgbmFtZSA9IG5hbWUuc2xpY2UoaSArIDEpO1xuICByZXR1cm4gbmFtZXNwYWNlcy5oYXNPd25Qcm9wZXJ0eShwcmVmaXgpID8ge3NwYWNlOiBuYW1lc3BhY2VzW3ByZWZpeF0sIGxvY2FsOiBuYW1lfSA6IG5hbWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG59XG4iLCJpbXBvcnQgbmFtZXNwYWNlIGZyb20gXCIuL25hbWVzcGFjZS5qc1wiO1xuaW1wb3J0IHt4aHRtbH0gZnJvbSBcIi4vbmFtZXNwYWNlcy5qc1wiO1xuXG5mdW5jdGlvbiBjcmVhdG9ySW5oZXJpdChuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgZG9jdW1lbnQgPSB0aGlzLm93bmVyRG9jdW1lbnQsXG4gICAgICAgIHVyaSA9IHRoaXMubmFtZXNwYWNlVVJJO1xuICAgIHJldHVybiB1cmkgPT09IHhodG1sICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IHhodG1sXG4gICAgICAgID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKVxuICAgICAgICA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh1cmksIG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdG9yRml4ZWQoZnVsbG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpO1xuICByZXR1cm4gKGZ1bGxuYW1lLmxvY2FsXG4gICAgICA/IGNyZWF0b3JGaXhlZFxuICAgICAgOiBjcmVhdG9ySW5oZXJpdCkoZnVsbG5hbWUpO1xufVxuIiwiZnVuY3Rpb24gbm9uZSgpIHt9XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gbm9uZSA6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICB9O1xufVxuIiwiaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5pbXBvcnQgc2VsZWN0b3IgZnJvbSBcIi4uL3NlbGVjdG9yLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdCkge1xuICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpKSB7XG4gICAgICAgIGlmIChcIl9fZGF0YV9fXCIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187XG4gICAgICAgIHN1Ymdyb3VwW2ldID0gc3Vibm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiLy8gR2l2ZW4gc29tZXRoaW5nIGFycmF5IGxpa2UgKG9yIG51bGwpLCByZXR1cm5zIHNvbWV0aGluZyB0aGF0IGlzIHN0cmljdGx5IGFuXG4vLyBhcnJheS4gVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IGFycmF5LWxpa2Ugb2JqZWN0cyBwYXNzZWQgdG8gZDMuc2VsZWN0QWxsXG4vLyBvciBzZWxlY3Rpb24uc2VsZWN0QWxsIGFyZSBjb252ZXJ0ZWQgaW50byBwcm9wZXIgYXJyYXlzIHdoZW4gY3JlYXRpbmcgYVxuLy8gc2VsZWN0aW9uOyB3ZSBkb27igJl0IGV2ZXIgd2FudCB0byBjcmVhdGUgYSBzZWxlY3Rpb24gYmFja2VkIGJ5IGEgbGl2ZVxuLy8gSFRNTENvbGxlY3Rpb24gb3IgTm9kZUxpc3QuIEhvd2V2ZXIsIG5vdGUgdGhhdCBzZWxlY3Rpb24uc2VsZWN0QWxsIHdpbGwgdXNlIGFcbi8vIHN0YXRpYyBOb2RlTGlzdCBhcyBhIGdyb3VwLCBzaW5jZSBpdCBzYWZlbHkgZGVyaXZlZCBmcm9tIHF1ZXJ5U2VsZWN0b3JBbGwuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhcnJheSh4KSB7XG4gIHJldHVybiB4ID09IG51bGwgPyBbXSA6IEFycmF5LmlzQXJyYXkoeCkgPyB4IDogQXJyYXkuZnJvbSh4KTtcbn1cbiIsImZ1bmN0aW9uIGVtcHR5KCkge1xuICByZXR1cm4gW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gZW1wdHkgOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgfTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IGFycmF5IGZyb20gXCIuLi9hcnJheS5qc1wiO1xuaW1wb3J0IHNlbGVjdG9yQWxsIGZyb20gXCIuLi9zZWxlY3RvckFsbC5qc1wiO1xuXG5mdW5jdGlvbiBhcnJheUFsbChzZWxlY3QpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBhcnJheShzZWxlY3QuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHNlbGVjdCkge1xuICBpZiAodHlwZW9mIHNlbGVjdCA9PT0gXCJmdW5jdGlvblwiKSBzZWxlY3QgPSBhcnJheUFsbChzZWxlY3QpO1xuICBlbHNlIHNlbGVjdCA9IHNlbGVjdG9yQWxsKHNlbGVjdCk7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gW10sIHBhcmVudHMgPSBbXSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgc3ViZ3JvdXBzLnB1c2goc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKTtcbiAgICAgICAgcGFyZW50cy5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgcGFyZW50cyk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihzZWxlY3Rvcikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0Y2hlcyhzZWxlY3Rvcik7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGlsZE1hdGNoZXIoc2VsZWN0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgfTtcbn1cblxuIiwiaW1wb3J0IHtjaGlsZE1hdGNoZXJ9IGZyb20gXCIuLi9tYXRjaGVyLmpzXCI7XG5cbnZhciBmaW5kID0gQXJyYXkucHJvdG90eXBlLmZpbmQ7XG5cbmZ1bmN0aW9uIGNoaWxkRmluZChtYXRjaCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGZpbmQuY2FsbCh0aGlzLmNoaWxkcmVuLCBtYXRjaCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNoaWxkRmlyc3QoKSB7XG4gIHJldHVybiB0aGlzLmZpcnN0RWxlbWVudENoaWxkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihtYXRjaCkge1xuICByZXR1cm4gdGhpcy5zZWxlY3QobWF0Y2ggPT0gbnVsbCA/IGNoaWxkRmlyc3RcbiAgICAgIDogY2hpbGRGaW5kKHR5cGVvZiBtYXRjaCA9PT0gXCJmdW5jdGlvblwiID8gbWF0Y2ggOiBjaGlsZE1hdGNoZXIobWF0Y2gpKSk7XG59XG4iLCJpbXBvcnQge2NoaWxkTWF0Y2hlcn0gZnJvbSBcIi4uL21hdGNoZXIuanNcIjtcblxudmFyIGZpbHRlciA9IEFycmF5LnByb3RvdHlwZS5maWx0ZXI7XG5cbmZ1bmN0aW9uIGNoaWxkcmVuKCkge1xuICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuKTtcbn1cblxuZnVuY3Rpb24gY2hpbGRyZW5GaWx0ZXIobWF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBmaWx0ZXIuY2FsbCh0aGlzLmNoaWxkcmVuLCBtYXRjaCk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hdGNoKSB7XG4gIHJldHVybiB0aGlzLnNlbGVjdEFsbChtYXRjaCA9PSBudWxsID8gY2hpbGRyZW5cbiAgICAgIDogY2hpbGRyZW5GaWx0ZXIodHlwZW9mIG1hdGNoID09PSBcImZ1bmN0aW9uXCIgPyBtYXRjaCA6IGNoaWxkTWF0Y2hlcihtYXRjaCkpKTtcbn1cbiIsImltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IG1hdGNoZXIgZnJvbSBcIi4uL21hdGNoZXIuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obWF0Y2gpIHtcbiAgaWYgKHR5cGVvZiBtYXRjaCAhPT0gXCJmdW5jdGlvblwiKSBtYXRjaCA9IG1hdGNoZXIobWF0Y2gpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBtYXRjaC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkge1xuICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih1cGRhdGUpIHtcbiAgcmV0dXJuIG5ldyBBcnJheSh1cGRhdGUubGVuZ3RoKTtcbn1cbiIsImltcG9ydCBzcGFyc2UgZnJvbSBcIi4vc3BhcnNlLmpzXCI7XG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2VudGVyIHx8IHRoaXMuX2dyb3Vwcy5tYXAoc3BhcnNlKSwgdGhpcy5fcGFyZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBFbnRlck5vZGUocGFyZW50LCBkYXR1bSkge1xuICB0aGlzLm93bmVyRG9jdW1lbnQgPSBwYXJlbnQub3duZXJEb2N1bWVudDtcbiAgdGhpcy5uYW1lc3BhY2VVUkkgPSBwYXJlbnQubmFtZXNwYWNlVVJJO1xuICB0aGlzLl9uZXh0ID0gbnVsbDtcbiAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuICB0aGlzLl9fZGF0YV9fID0gZGF0dW07XG59XG5cbkVudGVyTm9kZS5wcm90b3R5cGUgPSB7XG4gIGNvbnN0cnVjdG9yOiBFbnRlck5vZGUsXG4gIGFwcGVuZENoaWxkOiBmdW5jdGlvbihjaGlsZCkgeyByZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgdGhpcy5fbmV4dCk7IH0sXG4gIGluc2VydEJlZm9yZTogZnVuY3Rpb24oY2hpbGQsIG5leHQpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIG5leHQpOyB9LFxuICBxdWVyeVNlbGVjdG9yOiBmdW5jdGlvbihzZWxlY3RvcikgeyByZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOyB9LFxuICBxdWVyeVNlbGVjdG9yQWxsOiBmdW5jdGlvbihzZWxlY3RvcikgeyByZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOyB9XG59O1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oeCkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHg7XG4gIH07XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCB7RW50ZXJOb2RlfSBmcm9tIFwiLi9lbnRlci5qc1wiO1xuaW1wb3J0IGNvbnN0YW50IGZyb20gXCIuLi9jb25zdGFudC5qc1wiO1xuXG5mdW5jdGlvbiBiaW5kSW5kZXgocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSkge1xuICB2YXIgaSA9IDAsXG4gICAgICBub2RlLFxuICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsXG4gICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7XG5cbiAgLy8gUHV0IGFueSBub24tbnVsbCBub2RlcyB0aGF0IGZpdCBpbnRvIHVwZGF0ZS5cbiAgLy8gUHV0IGFueSBudWxsIG5vZGVzIGludG8gZW50ZXIuXG4gIC8vIFB1dCBhbnkgcmVtYWluaW5nIGRhdGEgaW50byBlbnRlci5cbiAgZm9yICg7IGkgPCBkYXRhTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICBub2RlLl9fZGF0YV9fID0gZGF0YVtpXTtcbiAgICAgIHVwZGF0ZVtpXSA9IG5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudGVyW2ldID0gbmV3IEVudGVyTm9kZShwYXJlbnQsIGRhdGFbaV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFB1dCBhbnkgbm9uLW51bGwgbm9kZXMgdGhhdCBkb27igJl0IGZpdCBpbnRvIGV4aXQuXG4gIGZvciAoOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkge1xuICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgIGV4aXRbaV0gPSBub2RlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBiaW5kS2V5KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQsIGRhdGEsIGtleSkge1xuICB2YXIgaSxcbiAgICAgIG5vZGUsXG4gICAgICBub2RlQnlLZXlWYWx1ZSA9IG5ldyBNYXAsXG4gICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCxcbiAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCxcbiAgICAgIGtleVZhbHVlcyA9IG5ldyBBcnJheShncm91cExlbmd0aCksXG4gICAgICBrZXlWYWx1ZTtcblxuICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggbm9kZS5cbiAgLy8gSWYgbXVsdGlwbGUgbm9kZXMgaGF2ZSB0aGUgc2FtZSBrZXksIHRoZSBkdXBsaWNhdGVzIGFyZSBhZGRlZCB0byBleGl0LlxuICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkge1xuICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgIGtleVZhbHVlc1tpXSA9IGtleVZhbHVlID0ga2V5LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApICsgXCJcIjtcbiAgICAgIGlmIChub2RlQnlLZXlWYWx1ZS5oYXMoa2V5VmFsdWUpKSB7XG4gICAgICAgIGV4aXRbaV0gPSBub2RlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZUJ5S2V5VmFsdWUuc2V0KGtleVZhbHVlLCBub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggZGF0dW0uXG4gIC8vIElmIHRoZXJlIGEgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBrZXksIGpvaW4gYW5kIGFkZCBpdCB0byB1cGRhdGUuXG4gIC8vIElmIHRoZXJlIGlzIG5vdCAob3IgdGhlIGtleSBpcyBhIGR1cGxpY2F0ZSksIGFkZCBpdCB0byBlbnRlci5cbiAgZm9yIChpID0gMDsgaSA8IGRhdGFMZW5ndGg7ICsraSkge1xuICAgIGtleVZhbHVlID0ga2V5LmNhbGwocGFyZW50LCBkYXRhW2ldLCBpLCBkYXRhKSArIFwiXCI7XG4gICAgaWYgKG5vZGUgPSBub2RlQnlLZXlWYWx1ZS5nZXQoa2V5VmFsdWUpKSB7XG4gICAgICB1cGRhdGVbaV0gPSBub2RlO1xuICAgICAgbm9kZS5fX2RhdGFfXyA9IGRhdGFbaV07XG4gICAgICBub2RlQnlLZXlWYWx1ZS5kZWxldGUoa2V5VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbnRlcltpXSA9IG5ldyBFbnRlck5vZGUocGFyZW50LCBkYXRhW2ldKTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgYW55IHJlbWFpbmluZyBub2RlcyB0aGF0IHdlcmUgbm90IGJvdW5kIHRvIGRhdGEgdG8gZXhpdC5cbiAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKG5vZGVCeUtleVZhbHVlLmdldChrZXlWYWx1ZXNbaV0pID09PSBub2RlKSkge1xuICAgICAgZXhpdFtpXSA9IG5vZGU7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRhdHVtKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuX19kYXRhX187XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLCBkYXR1bSk7XG5cbiAgdmFyIGJpbmQgPSBrZXkgPyBiaW5kS2V5IDogYmluZEluZGV4LFxuICAgICAgcGFyZW50cyA9IHRoaXMuX3BhcmVudHMsXG4gICAgICBncm91cHMgPSB0aGlzLl9ncm91cHM7XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB2YWx1ZSA9IGNvbnN0YW50KHZhbHVlKTtcblxuICBmb3IgKHZhciBtID0gZ3JvdXBzLmxlbmd0aCwgdXBkYXRlID0gbmV3IEFycmF5KG0pLCBlbnRlciA9IG5ldyBBcnJheShtKSwgZXhpdCA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICB2YXIgcGFyZW50ID0gcGFyZW50c1tqXSxcbiAgICAgICAgZ3JvdXAgPSBncm91cHNbal0sXG4gICAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLFxuICAgICAgICBkYXRhID0gYXJyYXlsaWtlKHZhbHVlLmNhbGwocGFyZW50LCBwYXJlbnQgJiYgcGFyZW50Ll9fZGF0YV9fLCBqLCBwYXJlbnRzKSksXG4gICAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCxcbiAgICAgICAgZW50ZXJHcm91cCA9IGVudGVyW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLFxuICAgICAgICB1cGRhdGVHcm91cCA9IHVwZGF0ZVtqXSA9IG5ldyBBcnJheShkYXRhTGVuZ3RoKSxcbiAgICAgICAgZXhpdEdyb3VwID0gZXhpdFtqXSA9IG5ldyBBcnJheShncm91cExlbmd0aCk7XG5cbiAgICBiaW5kKHBhcmVudCwgZ3JvdXAsIGVudGVyR3JvdXAsIHVwZGF0ZUdyb3VwLCBleGl0R3JvdXAsIGRhdGEsIGtleSk7XG5cbiAgICAvLyBOb3cgY29ubmVjdCB0aGUgZW50ZXIgbm9kZXMgdG8gdGhlaXIgZm9sbG93aW5nIHVwZGF0ZSBub2RlLCBzdWNoIHRoYXRcbiAgICAvLyBhcHBlbmRDaGlsZCBjYW4gaW5zZXJ0IHRoZSBtYXRlcmlhbGl6ZWQgZW50ZXIgbm9kZSBiZWZvcmUgdGhpcyBub2RlLFxuICAgIC8vIHJhdGhlciB0aGFuIGF0IHRoZSBlbmQgb2YgdGhlIHBhcmVudCBub2RlLlxuICAgIGZvciAodmFyIGkwID0gMCwgaTEgPSAwLCBwcmV2aW91cywgbmV4dDsgaTAgPCBkYXRhTGVuZ3RoOyArK2kwKSB7XG4gICAgICBpZiAocHJldmlvdXMgPSBlbnRlckdyb3VwW2kwXSkge1xuICAgICAgICBpZiAoaTAgPj0gaTEpIGkxID0gaTAgKyAxO1xuICAgICAgICB3aGlsZSAoIShuZXh0ID0gdXBkYXRlR3JvdXBbaTFdKSAmJiArK2kxIDwgZGF0YUxlbmd0aCk7XG4gICAgICAgIHByZXZpb3VzLl9uZXh0ID0gbmV4dCB8fCBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZSA9IG5ldyBTZWxlY3Rpb24odXBkYXRlLCBwYXJlbnRzKTtcbiAgdXBkYXRlLl9lbnRlciA9IGVudGVyO1xuICB1cGRhdGUuX2V4aXQgPSBleGl0O1xuICByZXR1cm4gdXBkYXRlO1xufVxuXG4vLyBHaXZlbiBzb21lIGRhdGEsIHRoaXMgcmV0dXJucyBhbiBhcnJheS1saWtlIHZpZXcgb2YgaXQ6IGFuIG9iamVjdCB0aGF0XG4vLyBleHBvc2VzIGEgbGVuZ3RoIHByb3BlcnR5IGFuZCBhbGxvd3MgbnVtZXJpYyBpbmRleGluZy4gTm90ZSB0aGF0IHVubGlrZVxuLy8gc2VsZWN0QWxsLCB0aGlzIGlzbuKAmXQgd29ycmllZCBhYm91dCDigJxsaXZl4oCdIGNvbGxlY3Rpb25zIGJlY2F1c2UgdGhlIHJlc3VsdGluZ1xuLy8gYXJyYXkgd2lsbCBvbmx5IGJlIHVzZWQgYnJpZWZseSB3aGlsZSBkYXRhIGlzIGJlaW5nIGJvdW5kLiAoSXQgaXMgcG9zc2libGUgdG9cbi8vIGNhdXNlIHRoZSBkYXRhIHRvIGNoYW5nZSB3aGlsZSBpdGVyYXRpbmcgYnkgdXNpbmcgYSBrZXkgZnVuY3Rpb24sIGJ1dCBwbGVhc2Vcbi8vIGRvbuKAmXQ7IHdl4oCZZCByYXRoZXIgYXZvaWQgYSBncmF0dWl0b3VzIGNvcHkuKVxuZnVuY3Rpb24gYXJyYXlsaWtlKGRhdGEpIHtcbiAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIFwibGVuZ3RoXCIgaW4gZGF0YVxuICAgID8gZGF0YSAvLyBBcnJheSwgVHlwZWRBcnJheSwgTm9kZUxpc3QsIGFycmF5LWxpa2VcbiAgICA6IEFycmF5LmZyb20oZGF0YSk7IC8vIE1hcCwgU2V0LCBpdGVyYWJsZSwgc3RyaW5nLCBvciBhbnl0aGluZyBlbHNlXG59XG4iLCJpbXBvcnQgc3BhcnNlIGZyb20gXCIuL3NwYXJzZS5qc1wiO1xuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9leGl0IHx8IHRoaXMuX2dyb3Vwcy5tYXAoc3BhcnNlKSwgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihvbmVudGVyLCBvbnVwZGF0ZSwgb25leGl0KSB7XG4gIHZhciBlbnRlciA9IHRoaXMuZW50ZXIoKSwgdXBkYXRlID0gdGhpcywgZXhpdCA9IHRoaXMuZXhpdCgpO1xuICBpZiAodHlwZW9mIG9uZW50ZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGVudGVyID0gb25lbnRlcihlbnRlcik7XG4gICAgaWYgKGVudGVyKSBlbnRlciA9IGVudGVyLnNlbGVjdGlvbigpO1xuICB9IGVsc2Uge1xuICAgIGVudGVyID0gZW50ZXIuYXBwZW5kKG9uZW50ZXIgKyBcIlwiKTtcbiAgfVxuICBpZiAob251cGRhdGUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZSA9IG9udXBkYXRlKHVwZGF0ZSk7XG4gICAgaWYgKHVwZGF0ZSkgdXBkYXRlID0gdXBkYXRlLnNlbGVjdGlvbigpO1xuICB9XG4gIGlmIChvbmV4aXQgPT0gbnVsbCkgZXhpdC5yZW1vdmUoKTsgZWxzZSBvbmV4aXQoZXhpdCk7XG4gIHJldHVybiBlbnRlciAmJiB1cGRhdGUgPyBlbnRlci5tZXJnZSh1cGRhdGUpLm9yZGVyKCkgOiB1cGRhdGU7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29udGV4dCkge1xuICB2YXIgc2VsZWN0aW9uID0gY29udGV4dC5zZWxlY3Rpb24gPyBjb250ZXh0LnNlbGVjdGlvbigpIDogY29udGV4dDtcblxuICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gc2VsZWN0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0sIGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXAwW2ldIHx8IGdyb3VwMVtpXSkge1xuICAgICAgICBtZXJnZVtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IGogPCBtMDsgKytqKSB7XG4gICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKG1lcmdlcywgdGhpcy5fcGFyZW50cyk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAtMSwgbSA9IGdyb3Vwcy5sZW5ndGg7ICsraiA8IG07KSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSBncm91cC5sZW5ndGggLSAxLCBuZXh0ID0gZ3JvdXBbaV0sIG5vZGU7IC0taSA+PSAwOykge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBpZiAobmV4dCAmJiBub2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG5leHQpIF4gNCkgbmV4dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBuZXh0KTtcbiAgICAgICAgbmV4dCA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59XG4iLCJpbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY29tcGFyZSkge1xuICBpZiAoIWNvbXBhcmUpIGNvbXBhcmUgPSBhc2NlbmRpbmc7XG5cbiAgZnVuY3Rpb24gY29tcGFyZU5vZGUoYSwgYikge1xuICAgIHJldHVybiBhICYmIGIgPyBjb21wYXJlKGEuX19kYXRhX18sIGIuX19kYXRhX18pIDogIWEgLSAhYjtcbiAgfVxuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHNvcnRncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHNvcnRncm91cCA9IHNvcnRncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHNvcnRncm91cFtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICAgIHNvcnRncm91cC5zb3J0KGNvbXBhcmVOb2RlKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgU2VsZWN0aW9uKHNvcnRncm91cHMsIHRoaXMuX3BhcmVudHMpLm9yZGVyKCk7XG59XG5cbmZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKSB7XG4gIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbMF07XG4gIGFyZ3VtZW50c1swXSA9IHRoaXM7XG4gIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gIHJldHVybiB0aGlzO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHRoaXMpO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG5cbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgIHZhciBub2RlID0gZ3JvdXBbaV07XG4gICAgICBpZiAobm9kZSkgcmV0dXJuIG5vZGU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgbGV0IHNpemUgPSAwO1xuICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcykgKytzaXplOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHJldHVybiBzaXplO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiAhdGhpcy5ub2RlKCk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjYWxsYmFjaykge1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSBjYWxsYmFjay5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn1cbiIsImltcG9ydCBuYW1lc3BhY2UgZnJvbSBcIi4uL25hbWVzcGFjZS5qc1wiO1xuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlKG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyUmVtb3ZlTlMoZnVsbG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckNvbnN0YW50KG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudE5TKGZ1bGxuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHZhbHVlKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMoZnVsbG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHYpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgdmFyIG5vZGUgPSB0aGlzLm5vZGUoKTtcbiAgICByZXR1cm4gZnVsbG5hbWUubG9jYWxcbiAgICAgICAgPyBub2RlLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbClcbiAgICAgICAgOiBub2RlLmdldEF0dHJpYnV0ZShmdWxsbmFtZSk7XG4gIH1cblxuICByZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJSZW1vdmVOUyA6IGF0dHJSZW1vdmUpIDogKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJGdW5jdGlvbk5TIDogYXR0ckZ1bmN0aW9uKVxuICAgICAgOiAoZnVsbG5hbWUubG9jYWwgPyBhdHRyQ29uc3RhbnROUyA6IGF0dHJDb25zdGFudCkpKShmdWxsbmFtZSwgdmFsdWUpKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUpIHtcbiAgcmV0dXJuIChub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSAvLyBub2RlIGlzIGEgTm9kZVxuICAgICAgfHwgKG5vZGUuZG9jdW1lbnQgJiYgbm9kZSkgLy8gbm9kZSBpcyBhIFdpbmRvd1xuICAgICAgfHwgbm9kZS5kZWZhdWx0VmlldzsgLy8gbm9kZSBpcyBhIERvY3VtZW50XG59XG4iLCJpbXBvcnQgZGVmYXVsdFZpZXcgZnJvbSBcIi4uL3dpbmRvdy5qc1wiO1xuXG5mdW5jdGlvbiBzdHlsZVJlbW92ZShuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUNvbnN0YW50KG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHlsZUZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7XG4gICAgZWxzZSB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHYsIHByaW9yaXR5KTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMVxuICAgICAgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGxcbiAgICAgICAgICAgID8gc3R5bGVSZW1vdmUgOiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgPyBzdHlsZUZ1bmN0aW9uXG4gICAgICAgICAgICA6IHN0eWxlQ29uc3RhbnQpKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gXCJcIiA6IHByaW9yaXR5KSlcbiAgICAgIDogc3R5bGVWYWx1ZSh0aGlzLm5vZGUoKSwgbmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHlsZVZhbHVlKG5vZGUsIG5hbWUpIHtcbiAgcmV0dXJuIG5vZGUuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKVxuICAgICAgfHwgZGVmYXVsdFZpZXcobm9kZSkuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpO1xufVxuIiwiZnVuY3Rpb24gcHJvcGVydHlSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgZGVsZXRlIHRoaXNbbmFtZV07XG4gIH07XG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5Q29uc3RhbnQobmFtZSwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXNbbmFtZV0gPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcHJvcGVydHlGdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmICh2ID09IG51bGwpIGRlbGV0ZSB0aGlzW25hbWVdO1xuICAgIGVsc2UgdGhpc1tuYW1lXSA9IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMVxuICAgICAgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IHByb3BlcnR5UmVtb3ZlIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IHByb3BlcnR5RnVuY3Rpb25cbiAgICAgICAgICA6IHByb3BlcnR5Q29uc3RhbnQpKG5hbWUsIHZhbHVlKSlcbiAgICAgIDogdGhpcy5ub2RlKClbbmFtZV07XG59XG4iLCJmdW5jdGlvbiBjbGFzc0FycmF5KHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnRyaW0oKS5zcGxpdCgvXnxcXHMrLyk7XG59XG5cbmZ1bmN0aW9uIGNsYXNzTGlzdChub2RlKSB7XG4gIHJldHVybiBub2RlLmNsYXNzTGlzdCB8fCBuZXcgQ2xhc3NMaXN0KG5vZGUpO1xufVxuXG5mdW5jdGlvbiBDbGFzc0xpc3Qobm9kZSkge1xuICB0aGlzLl9ub2RlID0gbm9kZTtcbiAgdGhpcy5fbmFtZXMgPSBjbGFzc0FycmF5KG5vZGUuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgfHwgXCJcIik7XG59XG5cbkNsYXNzTGlzdC5wcm90b3R5cGUgPSB7XG4gIGFkZDogZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTtcbiAgICBpZiAoaSA8IDApIHtcbiAgICAgIHRoaXMuX25hbWVzLnB1c2gobmFtZSk7XG4gICAgICB0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIHRoaXMuX25hbWVzLmpvaW4oXCIgXCIpKTtcbiAgICB9XG4gIH0sXG4gIHJlbW92ZTogZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTtcbiAgICBpZiAoaSA+PSAwKSB7XG4gICAgICB0aGlzLl9uYW1lcy5zcGxpY2UoaSwgMSk7XG4gICAgICB0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIHRoaXMuX25hbWVzLmpvaW4oXCIgXCIpKTtcbiAgICB9XG4gIH0sXG4gIGNvbnRhaW5zOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSkgPj0gMDtcbiAgfVxufTtcblxuZnVuY3Rpb24gY2xhc3NlZEFkZChub2RlLCBuYW1lcykge1xuICB2YXIgbGlzdCA9IGNsYXNzTGlzdChub2RlKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoO1xuICB3aGlsZSAoKytpIDwgbikgbGlzdC5hZGQobmFtZXNbaV0pO1xufVxuXG5mdW5jdGlvbiBjbGFzc2VkUmVtb3ZlKG5vZGUsIG5hbWVzKSB7XG4gIHZhciBsaXN0ID0gY2xhc3NMaXN0KG5vZGUpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7XG4gIHdoaWxlICgrK2kgPCBuKSBsaXN0LnJlbW92ZShuYW1lc1tpXSk7XG59XG5cbmZ1bmN0aW9uIGNsYXNzZWRUcnVlKG5hbWVzKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBjbGFzc2VkQWRkKHRoaXMsIG5hbWVzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZEZhbHNlKG5hbWVzKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICBjbGFzc2VkUmVtb3ZlKHRoaXMsIG5hbWVzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY2xhc3NlZEZ1bmN0aW9uKG5hbWVzLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgKHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgPyBjbGFzc2VkQWRkIDogY2xhc3NlZFJlbW92ZSkodGhpcywgbmFtZXMpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgbmFtZXMgPSBjbGFzc0FycmF5KG5hbWUgKyBcIlwiKTtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgbGlzdCA9IGNsYXNzTGlzdCh0aGlzLm5vZGUoKSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDtcbiAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFsaXN0LmNvbnRhaW5zKG5hbWVzW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gY2xhc3NlZEZ1bmN0aW9uIDogdmFsdWVcbiAgICAgID8gY2xhc3NlZFRydWVcbiAgICAgIDogY2xhc3NlZEZhbHNlKShuYW1lcywgdmFsdWUpKTtcbn1cbiIsImZ1bmN0aW9uIHRleHRSZW1vdmUoKSB7XG4gIHRoaXMudGV4dENvbnRlbnQgPSBcIlwiO1xufVxuXG5mdW5jdGlvbiB0ZXh0Q29uc3RhbnQodmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdGV4dEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHYgPT0gbnVsbCA/IFwiXCIgOiB2O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbFxuICAgICAgICAgID8gdGV4dFJlbW92ZSA6ICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gdGV4dEZ1bmN0aW9uXG4gICAgICAgICAgOiB0ZXh0Q29uc3RhbnQpKHZhbHVlKSlcbiAgICAgIDogdGhpcy5ub2RlKCkudGV4dENvbnRlbnQ7XG59XG4iLCJmdW5jdGlvbiBodG1sUmVtb3ZlKCkge1xuICB0aGlzLmlubmVySFRNTCA9IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGh0bWxDb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5pbm5lckhUTUwgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gaHRtbEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdGhpcy5pbm5lckhUTUwgPSB2ID09IG51bGwgPyBcIlwiIDogdjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGxcbiAgICAgICAgICA/IGh0bWxSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGh0bWxGdW5jdGlvblxuICAgICAgICAgIDogaHRtbENvbnN0YW50KSh2YWx1ZSkpXG4gICAgICA6IHRoaXMubm9kZSgpLmlubmVySFRNTDtcbn1cbiIsImZ1bmN0aW9uIHJhaXNlKCkge1xuICBpZiAodGhpcy5uZXh0U2libGluZykgdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChyYWlzZSk7XG59XG4iLCJmdW5jdGlvbiBsb3dlcigpIHtcbiAgaWYgKHRoaXMucHJldmlvdXNTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMsIHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2gobG93ZXIpO1xufVxuIiwiaW1wb3J0IGNyZWF0b3IgZnJvbSBcIi4uL2NyZWF0b3IuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSkge1xuICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09IFwiZnVuY3Rpb25cIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpO1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9KTtcbn1cbiIsImltcG9ydCBjcmVhdG9yIGZyb20gXCIuLi9jcmVhdG9yLmpzXCI7XG5pbXBvcnQgc2VsZWN0b3IgZnJvbSBcIi4uL3NlbGVjdG9yLmpzXCI7XG5cbmZ1bmN0aW9uIGNvbnN0YW50TnVsbCgpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIGJlZm9yZSkge1xuICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09IFwiZnVuY3Rpb25cIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpLFxuICAgICAgc2VsZWN0ID0gYmVmb3JlID09IG51bGwgPyBjb25zdGFudE51bGwgOiB0eXBlb2YgYmVmb3JlID09PSBcImZ1bmN0aW9uXCIgPyBiZWZvcmUgOiBzZWxlY3RvcihiZWZvcmUpO1xuICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKGNyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCBzZWxlY3QuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCBudWxsKTtcbiAgfSk7XG59XG4iLCJmdW5jdGlvbiByZW1vdmUoKSB7XG4gIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmVhY2gocmVtb3ZlKTtcbn1cbiIsImZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZVNoYWxsb3coKSB7XG4gIHZhciBjbG9uZSA9IHRoaXMuY2xvbmVOb2RlKGZhbHNlKSwgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICByZXR1cm4gcGFyZW50ID8gcGFyZW50Lmluc2VydEJlZm9yZShjbG9uZSwgdGhpcy5uZXh0U2libGluZykgOiBjbG9uZTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uX2Nsb25lRGVlcCgpIHtcbiAgdmFyIGNsb25lID0gdGhpcy5jbG9uZU5vZGUodHJ1ZSksIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRoaXMubmV4dFNpYmxpbmcpIDogY2xvbmU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGRlZXApIHtcbiAgcmV0dXJuIHRoaXMuc2VsZWN0KGRlZXAgPyBzZWxlY3Rpb25fY2xvbmVEZWVwIDogc2VsZWN0aW9uX2Nsb25lU2hhbGxvdyk7XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyB0aGlzLnByb3BlcnR5KFwiX19kYXRhX19cIiwgdmFsdWUpXG4gICAgICA6IHRoaXMubm9kZSgpLl9fZGF0YV9fO1xufVxuIiwiZnVuY3Rpb24gY29udGV4dExpc3RlbmVyKGxpc3RlbmVyKSB7XG4gIHJldHVybiBmdW5jdGlvbihldmVudCkge1xuICAgIGxpc3RlbmVyLmNhbGwodGhpcywgZXZlbnQsIHRoaXMuX19kYXRhX18pO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMpIHtcbiAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XFxzKy8pLm1hcChmdW5jdGlvbih0KSB7XG4gICAgdmFyIG5hbWUgPSBcIlwiLCBpID0gdC5pbmRleE9mKFwiLlwiKTtcbiAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvblJlbW92ZSh0eXBlbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG9uID0gdGhpcy5fX29uO1xuICAgIGlmICghb24pIHJldHVybjtcbiAgICBmb3IgKHZhciBqID0gMCwgaSA9IC0xLCBtID0gb24ubGVuZ3RoLCBvOyBqIDwgbTsgKytqKSB7XG4gICAgICBpZiAobyA9IG9uW2pdLCAoIXR5cGVuYW1lLnR5cGUgfHwgby50eXBlID09PSB0eXBlbmFtZS50eXBlKSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciwgby5vcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9uWysraV0gPSBvO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoKytpKSBvbi5sZW5ndGggPSBpO1xuICAgIGVsc2UgZGVsZXRlIHRoaXMuX19vbjtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb25BZGQodHlwZW5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgb24gPSB0aGlzLl9fb24sIG8sIGxpc3RlbmVyID0gY29udGV4dExpc3RlbmVyKHZhbHVlKTtcbiAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoOyBqIDwgbTsgKytqKSB7XG4gICAgICBpZiAoKG8gPSBvbltqXSkudHlwZSA9PT0gdHlwZW5hbWUudHlwZSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciwgby5vcHRpb25zKTtcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciA9IGxpc3RlbmVyLCBvLm9wdGlvbnMgPSBvcHRpb25zKTtcbiAgICAgICAgby52YWx1ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcih0eXBlbmFtZS50eXBlLCBsaXN0ZW5lciwgb3B0aW9ucyk7XG4gICAgbyA9IHt0eXBlOiB0eXBlbmFtZS50eXBlLCBuYW1lOiB0eXBlbmFtZS5uYW1lLCB2YWx1ZTogdmFsdWUsIGxpc3RlbmVyOiBsaXN0ZW5lciwgb3B0aW9uczogb3B0aW9uc307XG4gICAgaWYgKCFvbikgdGhpcy5fX29uID0gW29dO1xuICAgIGVsc2Ugb24ucHVzaChvKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odHlwZW5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gIHZhciB0eXBlbmFtZXMgPSBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZSArIFwiXCIpLCBpLCBuID0gdHlwZW5hbWVzLmxlbmd0aCwgdDtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgb24gPSB0aGlzLm5vZGUoKS5fX29uO1xuICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHtcbiAgICAgIGZvciAoaSA9IDAsIG8gPSBvbltqXTsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAoKHQgPSB0eXBlbmFtZXNbaV0pLnR5cGUgPT09IG8udHlwZSAmJiB0Lm5hbWUgPT09IG8ubmFtZSkge1xuICAgICAgICAgIHJldHVybiBvLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIG9uID0gdmFsdWUgPyBvbkFkZCA6IG9uUmVtb3ZlO1xuICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB0aGlzLmVhY2gob24odHlwZW5hbWVzW2ldLCB2YWx1ZSwgb3B0aW9ucykpO1xuICByZXR1cm4gdGhpcztcbn1cbiIsImltcG9ydCBkZWZhdWx0VmlldyBmcm9tIFwiLi4vd2luZG93LmpzXCI7XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQobm9kZSwgdHlwZSwgcGFyYW1zKSB7XG4gIHZhciB3aW5kb3cgPSBkZWZhdWx0Vmlldyhub2RlKSxcbiAgICAgIGV2ZW50ID0gd2luZG93LkN1c3RvbUV2ZW50O1xuXG4gIGlmICh0eXBlb2YgZXZlbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGV2ZW50ID0gbmV3IGV2ZW50KHR5cGUsIHBhcmFtcyk7XG4gIH0gZWxzZSB7XG4gICAgZXZlbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKTtcbiAgICBpZiAocGFyYW1zKSBldmVudC5pbml0RXZlbnQodHlwZSwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlKSwgZXZlbnQuZGV0YWlsID0gcGFyYW1zLmRldGFpbDtcbiAgICBlbHNlIGV2ZW50LmluaXRFdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UpO1xuICB9XG5cbiAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hDb25zdGFudCh0eXBlLCBwYXJhbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRnVuY3Rpb24odHlwZSwgcGFyYW1zKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2hFdmVudCh0aGlzLCB0eXBlLCBwYXJhbXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHR5cGUsIHBhcmFtcykge1xuICByZXR1cm4gdGhpcy5lYWNoKCh0eXBlb2YgcGFyYW1zID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gZGlzcGF0Y2hGdW5jdGlvblxuICAgICAgOiBkaXNwYXRjaENvbnN0YW50KSh0eXBlLCBwYXJhbXMpKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKigpIHtcbiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHtcbiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHlpZWxkIG5vZGU7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgc2VsZWN0aW9uX3NlbGVjdCBmcm9tIFwiLi9zZWxlY3QuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fc2VsZWN0QWxsIGZyb20gXCIuL3NlbGVjdEFsbC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RDaGlsZCBmcm9tIFwiLi9zZWxlY3RDaGlsZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9zZWxlY3RDaGlsZHJlbiBmcm9tIFwiLi9zZWxlY3RDaGlsZHJlbi5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9maWx0ZXIgZnJvbSBcIi4vZmlsdGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2RhdGEgZnJvbSBcIi4vZGF0YS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lbnRlciBmcm9tIFwiLi9lbnRlci5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9leGl0IGZyb20gXCIuL2V4aXQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fam9pbiBmcm9tIFwiLi9qb2luLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX21lcmdlIGZyb20gXCIuL21lcmdlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX29yZGVyIGZyb20gXCIuL29yZGVyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NvcnQgZnJvbSBcIi4vc29ydC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9jYWxsIGZyb20gXCIuL2NhbGwuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbm9kZXMgZnJvbSBcIi4vbm9kZXMuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fbm9kZSBmcm9tIFwiLi9ub2RlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3NpemUgZnJvbSBcIi4vc2l6ZS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lbXB0eSBmcm9tIFwiLi9lbXB0eS5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9lYWNoIGZyb20gXCIuL2VhY2guanNcIjtcbmltcG9ydCBzZWxlY3Rpb25fYXR0ciBmcm9tIFwiLi9hdHRyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3N0eWxlIGZyb20gXCIuL3N0eWxlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3Byb3BlcnR5IGZyb20gXCIuL3Byb3BlcnR5LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2NsYXNzZWQgZnJvbSBcIi4vY2xhc3NlZC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl90ZXh0IGZyb20gXCIuL3RleHQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faHRtbCBmcm9tIFwiLi9odG1sLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3JhaXNlIGZyb20gXCIuL3JhaXNlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2xvd2VyIGZyb20gXCIuL2xvd2VyLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2FwcGVuZCBmcm9tIFwiLi9hcHBlbmQuanNcIjtcbmltcG9ydCBzZWxlY3Rpb25faW5zZXJ0IGZyb20gXCIuL2luc2VydC5qc1wiO1xuaW1wb3J0IHNlbGVjdGlvbl9yZW1vdmUgZnJvbSBcIi4vcmVtb3ZlLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2Nsb25lIGZyb20gXCIuL2Nsb25lLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2RhdHVtIGZyb20gXCIuL2RhdHVtLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX29uIGZyb20gXCIuL29uLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2Rpc3BhdGNoIGZyb20gXCIuL2Rpc3BhdGNoLmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX2l0ZXJhdG9yIGZyb20gXCIuL2l0ZXJhdG9yLmpzXCI7XG5cbmV4cG9ydCB2YXIgcm9vdCA9IFtudWxsXTtcblxuZXhwb3J0IGZ1bmN0aW9uIFNlbGVjdGlvbihncm91cHMsIHBhcmVudHMpIHtcbiAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzO1xuICB0aGlzLl9wYXJlbnRzID0gcGFyZW50cztcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbihbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLCByb290KTtcbn1cblxuZnVuY3Rpb24gc2VsZWN0aW9uX3NlbGVjdGlvbigpIHtcbiAgcmV0dXJuIHRoaXM7XG59XG5cblNlbGVjdGlvbi5wcm90b3R5cGUgPSBzZWxlY3Rpb24ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogU2VsZWN0aW9uLFxuICBzZWxlY3Q6IHNlbGVjdGlvbl9zZWxlY3QsXG4gIHNlbGVjdEFsbDogc2VsZWN0aW9uX3NlbGVjdEFsbCxcbiAgc2VsZWN0Q2hpbGQ6IHNlbGVjdGlvbl9zZWxlY3RDaGlsZCxcbiAgc2VsZWN0Q2hpbGRyZW46IHNlbGVjdGlvbl9zZWxlY3RDaGlsZHJlbixcbiAgZmlsdGVyOiBzZWxlY3Rpb25fZmlsdGVyLFxuICBkYXRhOiBzZWxlY3Rpb25fZGF0YSxcbiAgZW50ZXI6IHNlbGVjdGlvbl9lbnRlcixcbiAgZXhpdDogc2VsZWN0aW9uX2V4aXQsXG4gIGpvaW46IHNlbGVjdGlvbl9qb2luLFxuICBtZXJnZTogc2VsZWN0aW9uX21lcmdlLFxuICBzZWxlY3Rpb246IHNlbGVjdGlvbl9zZWxlY3Rpb24sXG4gIG9yZGVyOiBzZWxlY3Rpb25fb3JkZXIsXG4gIHNvcnQ6IHNlbGVjdGlvbl9zb3J0LFxuICBjYWxsOiBzZWxlY3Rpb25fY2FsbCxcbiAgbm9kZXM6IHNlbGVjdGlvbl9ub2RlcyxcbiAgbm9kZTogc2VsZWN0aW9uX25vZGUsXG4gIHNpemU6IHNlbGVjdGlvbl9zaXplLFxuICBlbXB0eTogc2VsZWN0aW9uX2VtcHR5LFxuICBlYWNoOiBzZWxlY3Rpb25fZWFjaCxcbiAgYXR0cjogc2VsZWN0aW9uX2F0dHIsXG4gIHN0eWxlOiBzZWxlY3Rpb25fc3R5bGUsXG4gIHByb3BlcnR5OiBzZWxlY3Rpb25fcHJvcGVydHksXG4gIGNsYXNzZWQ6IHNlbGVjdGlvbl9jbGFzc2VkLFxuICB0ZXh0OiBzZWxlY3Rpb25fdGV4dCxcbiAgaHRtbDogc2VsZWN0aW9uX2h0bWwsXG4gIHJhaXNlOiBzZWxlY3Rpb25fcmFpc2UsXG4gIGxvd2VyOiBzZWxlY3Rpb25fbG93ZXIsXG4gIGFwcGVuZDogc2VsZWN0aW9uX2FwcGVuZCxcbiAgaW5zZXJ0OiBzZWxlY3Rpb25faW5zZXJ0LFxuICByZW1vdmU6IHNlbGVjdGlvbl9yZW1vdmUsXG4gIGNsb25lOiBzZWxlY3Rpb25fY2xvbmUsXG4gIGRhdHVtOiBzZWxlY3Rpb25fZGF0dW0sXG4gIG9uOiBzZWxlY3Rpb25fb24sXG4gIGRpc3BhdGNoOiBzZWxlY3Rpb25fZGlzcGF0Y2gsXG4gIFtTeW1ib2wuaXRlcmF0b3JdOiBzZWxlY3Rpb25faXRlcmF0b3Jcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHNlbGVjdGlvbjtcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbnN0cnVjdG9yLCBmYWN0b3J5LCBwcm90b3R5cGUpIHtcbiAgY29uc3RydWN0b3IucHJvdG90eXBlID0gZmFjdG9yeS5wcm90b3R5cGUgPSBwcm90b3R5cGU7XG4gIHByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKHBhcmVudCwgZGVmaW5pdGlvbikge1xuICB2YXIgcHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShwYXJlbnQucHJvdG90eXBlKTtcbiAgZm9yICh2YXIga2V5IGluIGRlZmluaXRpb24pIHByb3RvdHlwZVtrZXldID0gZGVmaW5pdGlvbltrZXldO1xuICByZXR1cm4gcHJvdG90eXBlO1xufVxuIiwiaW1wb3J0IGRlZmluZSwge2V4dGVuZH0gZnJvbSBcIi4vZGVmaW5lLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBDb2xvcigpIHt9XG5cbmV4cG9ydCB2YXIgZGFya2VyID0gMC43O1xuZXhwb3J0IHZhciBicmlnaHRlciA9IDEgLyBkYXJrZXI7XG5cbnZhciByZUkgPSBcIlxcXFxzKihbKy1dP1xcXFxkKylcXFxccypcIixcbiAgICByZU4gPSBcIlxcXFxzKihbKy1dPyg/OlxcXFxkKlxcXFwuKT9cXFxcZCsoPzpbZUVdWystXT9cXFxcZCspPylcXFxccypcIixcbiAgICByZVAgPSBcIlxcXFxzKihbKy1dPyg/OlxcXFxkKlxcXFwuKT9cXFxcZCsoPzpbZUVdWystXT9cXFxcZCspPyklXFxcXHMqXCIsXG4gICAgcmVIZXggPSAvXiMoWzAtOWEtZl17Myw4fSkkLyxcbiAgICByZVJnYkludGVnZXIgPSBuZXcgUmVnRXhwKGBecmdiXFxcXCgke3JlSX0sJHtyZUl9LCR7cmVJfVxcXFwpJGApLFxuICAgIHJlUmdiUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5yZ2JcXFxcKCR7cmVQfSwke3JlUH0sJHtyZVB9XFxcXCkkYCksXG4gICAgcmVSZ2JhSW50ZWdlciA9IG5ldyBSZWdFeHAoYF5yZ2JhXFxcXCgke3JlSX0sJHtyZUl9LCR7cmVJfSwke3JlTn1cXFxcKSRgKSxcbiAgICByZVJnYmFQZXJjZW50ID0gbmV3IFJlZ0V4cChgXnJnYmFcXFxcKCR7cmVQfSwke3JlUH0sJHtyZVB9LCR7cmVOfVxcXFwpJGApLFxuICAgIHJlSHNsUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5oc2xcXFxcKCR7cmVOfSwke3JlUH0sJHtyZVB9XFxcXCkkYCksXG4gICAgcmVIc2xhUGVyY2VudCA9IG5ldyBSZWdFeHAoYF5oc2xhXFxcXCgke3JlTn0sJHtyZVB9LCR7cmVQfSwke3JlTn1cXFxcKSRgKTtcblxudmFyIG5hbWVkID0ge1xuICBhbGljZWJsdWU6IDB4ZjBmOGZmLFxuICBhbnRpcXVld2hpdGU6IDB4ZmFlYmQ3LFxuICBhcXVhOiAweDAwZmZmZixcbiAgYXF1YW1hcmluZTogMHg3ZmZmZDQsXG4gIGF6dXJlOiAweGYwZmZmZixcbiAgYmVpZ2U6IDB4ZjVmNWRjLFxuICBiaXNxdWU6IDB4ZmZlNGM0LFxuICBibGFjazogMHgwMDAwMDAsXG4gIGJsYW5jaGVkYWxtb25kOiAweGZmZWJjZCxcbiAgYmx1ZTogMHgwMDAwZmYsXG4gIGJsdWV2aW9sZXQ6IDB4OGEyYmUyLFxuICBicm93bjogMHhhNTJhMmEsXG4gIGJ1cmx5d29vZDogMHhkZWI4ODcsXG4gIGNhZGV0Ymx1ZTogMHg1ZjllYTAsXG4gIGNoYXJ0cmV1c2U6IDB4N2ZmZjAwLFxuICBjaG9jb2xhdGU6IDB4ZDI2OTFlLFxuICBjb3JhbDogMHhmZjdmNTAsXG4gIGNvcm5mbG93ZXJibHVlOiAweDY0OTVlZCxcbiAgY29ybnNpbGs6IDB4ZmZmOGRjLFxuICBjcmltc29uOiAweGRjMTQzYyxcbiAgY3lhbjogMHgwMGZmZmYsXG4gIGRhcmtibHVlOiAweDAwMDA4YixcbiAgZGFya2N5YW46IDB4MDA4YjhiLFxuICBkYXJrZ29sZGVucm9kOiAweGI4ODYwYixcbiAgZGFya2dyYXk6IDB4YTlhOWE5LFxuICBkYXJrZ3JlZW46IDB4MDA2NDAwLFxuICBkYXJrZ3JleTogMHhhOWE5YTksXG4gIGRhcmtraGFraTogMHhiZGI3NmIsXG4gIGRhcmttYWdlbnRhOiAweDhiMDA4YixcbiAgZGFya29saXZlZ3JlZW46IDB4NTU2YjJmLFxuICBkYXJrb3JhbmdlOiAweGZmOGMwMCxcbiAgZGFya29yY2hpZDogMHg5OTMyY2MsXG4gIGRhcmtyZWQ6IDB4OGIwMDAwLFxuICBkYXJrc2FsbW9uOiAweGU5OTY3YSxcbiAgZGFya3NlYWdyZWVuOiAweDhmYmM4ZixcbiAgZGFya3NsYXRlYmx1ZTogMHg0ODNkOGIsXG4gIGRhcmtzbGF0ZWdyYXk6IDB4MmY0ZjRmLFxuICBkYXJrc2xhdGVncmV5OiAweDJmNGY0ZixcbiAgZGFya3R1cnF1b2lzZTogMHgwMGNlZDEsXG4gIGRhcmt2aW9sZXQ6IDB4OTQwMGQzLFxuICBkZWVwcGluazogMHhmZjE0OTMsXG4gIGRlZXBza3libHVlOiAweDAwYmZmZixcbiAgZGltZ3JheTogMHg2OTY5NjksXG4gIGRpbWdyZXk6IDB4Njk2OTY5LFxuICBkb2RnZXJibHVlOiAweDFlOTBmZixcbiAgZmlyZWJyaWNrOiAweGIyMjIyMixcbiAgZmxvcmFsd2hpdGU6IDB4ZmZmYWYwLFxuICBmb3Jlc3RncmVlbjogMHgyMjhiMjIsXG4gIGZ1Y2hzaWE6IDB4ZmYwMGZmLFxuICBnYWluc2Jvcm86IDB4ZGNkY2RjLFxuICBnaG9zdHdoaXRlOiAweGY4ZjhmZixcbiAgZ29sZDogMHhmZmQ3MDAsXG4gIGdvbGRlbnJvZDogMHhkYWE1MjAsXG4gIGdyYXk6IDB4ODA4MDgwLFxuICBncmVlbjogMHgwMDgwMDAsXG4gIGdyZWVueWVsbG93OiAweGFkZmYyZixcbiAgZ3JleTogMHg4MDgwODAsXG4gIGhvbmV5ZGV3OiAweGYwZmZmMCxcbiAgaG90cGluazogMHhmZjY5YjQsXG4gIGluZGlhbnJlZDogMHhjZDVjNWMsXG4gIGluZGlnbzogMHg0YjAwODIsXG4gIGl2b3J5OiAweGZmZmZmMCxcbiAga2hha2k6IDB4ZjBlNjhjLFxuICBsYXZlbmRlcjogMHhlNmU2ZmEsXG4gIGxhdmVuZGVyYmx1c2g6IDB4ZmZmMGY1LFxuICBsYXduZ3JlZW46IDB4N2NmYzAwLFxuICBsZW1vbmNoaWZmb246IDB4ZmZmYWNkLFxuICBsaWdodGJsdWU6IDB4YWRkOGU2LFxuICBsaWdodGNvcmFsOiAweGYwODA4MCxcbiAgbGlnaHRjeWFuOiAweGUwZmZmZixcbiAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IDB4ZmFmYWQyLFxuICBsaWdodGdyYXk6IDB4ZDNkM2QzLFxuICBsaWdodGdyZWVuOiAweDkwZWU5MCxcbiAgbGlnaHRncmV5OiAweGQzZDNkMyxcbiAgbGlnaHRwaW5rOiAweGZmYjZjMSxcbiAgbGlnaHRzYWxtb246IDB4ZmZhMDdhLFxuICBsaWdodHNlYWdyZWVuOiAweDIwYjJhYSxcbiAgbGlnaHRza3libHVlOiAweDg3Y2VmYSxcbiAgbGlnaHRzbGF0ZWdyYXk6IDB4Nzc4ODk5LFxuICBsaWdodHNsYXRlZ3JleTogMHg3Nzg4OTksXG4gIGxpZ2h0c3RlZWxibHVlOiAweGIwYzRkZSxcbiAgbGlnaHR5ZWxsb3c6IDB4ZmZmZmUwLFxuICBsaW1lOiAweDAwZmYwMCxcbiAgbGltZWdyZWVuOiAweDMyY2QzMixcbiAgbGluZW46IDB4ZmFmMGU2LFxuICBtYWdlbnRhOiAweGZmMDBmZixcbiAgbWFyb29uOiAweDgwMDAwMCxcbiAgbWVkaXVtYXF1YW1hcmluZTogMHg2NmNkYWEsXG4gIG1lZGl1bWJsdWU6IDB4MDAwMGNkLFxuICBtZWRpdW1vcmNoaWQ6IDB4YmE1NWQzLFxuICBtZWRpdW1wdXJwbGU6IDB4OTM3MGRiLFxuICBtZWRpdW1zZWFncmVlbjogMHgzY2IzNzEsXG4gIG1lZGl1bXNsYXRlYmx1ZTogMHg3YjY4ZWUsXG4gIG1lZGl1bXNwcmluZ2dyZWVuOiAweDAwZmE5YSxcbiAgbWVkaXVtdHVycXVvaXNlOiAweDQ4ZDFjYyxcbiAgbWVkaXVtdmlvbGV0cmVkOiAweGM3MTU4NSxcbiAgbWlkbmlnaHRibHVlOiAweDE5MTk3MCxcbiAgbWludGNyZWFtOiAweGY1ZmZmYSxcbiAgbWlzdHlyb3NlOiAweGZmZTRlMSxcbiAgbW9jY2FzaW46IDB4ZmZlNGI1LFxuICBuYXZham93aGl0ZTogMHhmZmRlYWQsXG4gIG5hdnk6IDB4MDAwMDgwLFxuICBvbGRsYWNlOiAweGZkZjVlNixcbiAgb2xpdmU6IDB4ODA4MDAwLFxuICBvbGl2ZWRyYWI6IDB4NmI4ZTIzLFxuICBvcmFuZ2U6IDB4ZmZhNTAwLFxuICBvcmFuZ2VyZWQ6IDB4ZmY0NTAwLFxuICBvcmNoaWQ6IDB4ZGE3MGQ2LFxuICBwYWxlZ29sZGVucm9kOiAweGVlZThhYSxcbiAgcGFsZWdyZWVuOiAweDk4ZmI5OCxcbiAgcGFsZXR1cnF1b2lzZTogMHhhZmVlZWUsXG4gIHBhbGV2aW9sZXRyZWQ6IDB4ZGI3MDkzLFxuICBwYXBheWF3aGlwOiAweGZmZWZkNSxcbiAgcGVhY2hwdWZmOiAweGZmZGFiOSxcbiAgcGVydTogMHhjZDg1M2YsXG4gIHBpbms6IDB4ZmZjMGNiLFxuICBwbHVtOiAweGRkYTBkZCxcbiAgcG93ZGVyYmx1ZTogMHhiMGUwZTYsXG4gIHB1cnBsZTogMHg4MDAwODAsXG4gIHJlYmVjY2FwdXJwbGU6IDB4NjYzMzk5LFxuICByZWQ6IDB4ZmYwMDAwLFxuICByb3N5YnJvd246IDB4YmM4ZjhmLFxuICByb3lhbGJsdWU6IDB4NDE2OWUxLFxuICBzYWRkbGVicm93bjogMHg4YjQ1MTMsXG4gIHNhbG1vbjogMHhmYTgwNzIsXG4gIHNhbmR5YnJvd246IDB4ZjRhNDYwLFxuICBzZWFncmVlbjogMHgyZThiNTcsXG4gIHNlYXNoZWxsOiAweGZmZjVlZSxcbiAgc2llbm5hOiAweGEwNTIyZCxcbiAgc2lsdmVyOiAweGMwYzBjMCxcbiAgc2t5Ymx1ZTogMHg4N2NlZWIsXG4gIHNsYXRlYmx1ZTogMHg2YTVhY2QsXG4gIHNsYXRlZ3JheTogMHg3MDgwOTAsXG4gIHNsYXRlZ3JleTogMHg3MDgwOTAsXG4gIHNub3c6IDB4ZmZmYWZhLFxuICBzcHJpbmdncmVlbjogMHgwMGZmN2YsXG4gIHN0ZWVsYmx1ZTogMHg0NjgyYjQsXG4gIHRhbjogMHhkMmI0OGMsXG4gIHRlYWw6IDB4MDA4MDgwLFxuICB0aGlzdGxlOiAweGQ4YmZkOCxcbiAgdG9tYXRvOiAweGZmNjM0NyxcbiAgdHVycXVvaXNlOiAweDQwZTBkMCxcbiAgdmlvbGV0OiAweGVlODJlZSxcbiAgd2hlYXQ6IDB4ZjVkZWIzLFxuICB3aGl0ZTogMHhmZmZmZmYsXG4gIHdoaXRlc21va2U6IDB4ZjVmNWY1LFxuICB5ZWxsb3c6IDB4ZmZmZjAwLFxuICB5ZWxsb3dncmVlbjogMHg5YWNkMzJcbn07XG5cbmRlZmluZShDb2xvciwgY29sb3IsIHtcbiAgY29weShjaGFubmVscykge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyB0aGlzLmNvbnN0cnVjdG9yLCB0aGlzLCBjaGFubmVscyk7XG4gIH0sXG4gIGRpc3BsYXlhYmxlKCkge1xuICAgIHJldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCk7XG4gIH0sXG4gIGhleDogY29sb3JfZm9ybWF0SGV4LCAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LlxuICBmb3JtYXRIZXg6IGNvbG9yX2Zvcm1hdEhleCxcbiAgZm9ybWF0SGV4ODogY29sb3JfZm9ybWF0SGV4OCxcbiAgZm9ybWF0SHNsOiBjb2xvcl9mb3JtYXRIc2wsXG4gIGZvcm1hdFJnYjogY29sb3JfZm9ybWF0UmdiLFxuICB0b1N0cmluZzogY29sb3JfZm9ybWF0UmdiXG59KTtcblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4KCkge1xuICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXgoKTtcbn1cblxuZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4OCgpIHtcbiAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4OCgpO1xufVxuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRIc2woKSB7XG4gIHJldHVybiBoc2xDb252ZXJ0KHRoaXMpLmZvcm1hdEhzbCgpO1xufVxuXG5mdW5jdGlvbiBjb2xvcl9mb3JtYXRSZ2IoKSB7XG4gIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdFJnYigpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb2xvcihmb3JtYXQpIHtcbiAgdmFyIG0sIGw7XG4gIGZvcm1hdCA9IChmb3JtYXQgKyBcIlwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIChtID0gcmVIZXguZXhlYyhmb3JtYXQpKSA/IChsID0gbVsxXS5sZW5ndGgsIG0gPSBwYXJzZUludChtWzFdLCAxNiksIGwgPT09IDYgPyByZ2JuKG0pIC8vICNmZjAwMDBcbiAgICAgIDogbCA9PT0gMyA/IG5ldyBSZ2IoKG0gPj4gOCAmIDB4ZikgfCAobSA+PiA0ICYgMHhmMCksIChtID4+IDQgJiAweGYpIHwgKG0gJiAweGYwKSwgKChtICYgMHhmKSA8PCA0KSB8IChtICYgMHhmKSwgMSkgLy8gI2YwMFxuICAgICAgOiBsID09PSA4ID8gcmdiYShtID4+IDI0ICYgMHhmZiwgbSA+PiAxNiAmIDB4ZmYsIG0gPj4gOCAmIDB4ZmYsIChtICYgMHhmZikgLyAweGZmKSAvLyAjZmYwMDAwMDBcbiAgICAgIDogbCA9PT0gNCA/IHJnYmEoKG0gPj4gMTIgJiAweGYpIHwgKG0gPj4gOCAmIDB4ZjApLCAobSA+PiA4ICYgMHhmKSB8IChtID4+IDQgJiAweGYwKSwgKG0gPj4gNCAmIDB4ZikgfCAobSAmIDB4ZjApLCAoKChtICYgMHhmKSA8PCA0KSB8IChtICYgMHhmKSkgLyAweGZmKSAvLyAjZjAwMFxuICAgICAgOiBudWxsKSAvLyBpbnZhbGlkIGhleFxuICAgICAgOiAobSA9IHJlUmdiSW50ZWdlci5leGVjKGZvcm1hdCkpID8gbmV3IFJnYihtWzFdLCBtWzJdLCBtWzNdLCAxKSAvLyByZ2IoMjU1LCAwLCAwKVxuICAgICAgOiAobSA9IHJlUmdiUGVyY2VudC5leGVjKGZvcm1hdCkpID8gbmV3IFJnYihtWzFdICogMjU1IC8gMTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCAxKSAvLyByZ2IoMTAwJSwgMCUsIDAlKVxuICAgICAgOiAobSA9IHJlUmdiYUludGVnZXIuZXhlYyhmb3JtYXQpKSA/IHJnYmEobVsxXSwgbVsyXSwgbVszXSwgbVs0XSkgLy8gcmdiYSgyNTUsIDAsIDAsIDEpXG4gICAgICA6IChtID0gcmVSZ2JhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gcmdiYShtWzFdICogMjU1IC8gMTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCBtWzRdKSAvLyByZ2IoMTAwJSwgMCUsIDAlLCAxKVxuICAgICAgOiAobSA9IHJlSHNsUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCAxKSAvLyBoc2woMTIwLCA1MCUsIDUwJSlcbiAgICAgIDogKG0gPSByZUhzbGFQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBoc2xhKG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIG1bNF0pIC8vIGhzbGEoMTIwLCA1MCUsIDUwJSwgMSlcbiAgICAgIDogbmFtZWQuaGFzT3duUHJvcGVydHkoZm9ybWF0KSA/IHJnYm4obmFtZWRbZm9ybWF0XSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgIDogZm9ybWF0ID09PSBcInRyYW5zcGFyZW50XCIgPyBuZXcgUmdiKE5hTiwgTmFOLCBOYU4sIDApXG4gICAgICA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJnYm4obikge1xuICByZXR1cm4gbmV3IFJnYihuID4+IDE2ICYgMHhmZiwgbiA+PiA4ICYgMHhmZiwgbiAmIDB4ZmYsIDEpO1xufVxuXG5mdW5jdGlvbiByZ2JhKHIsIGcsIGIsIGEpIHtcbiAgaWYgKGEgPD0gMCkgciA9IGcgPSBiID0gTmFOO1xuICByZXR1cm4gbmV3IFJnYihyLCBnLCBiLCBhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJnYkNvbnZlcnQobykge1xuICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0gY29sb3Iobyk7XG4gIGlmICghbykgcmV0dXJuIG5ldyBSZ2I7XG4gIG8gPSBvLnJnYigpO1xuICByZXR1cm4gbmV3IFJnYihvLnIsIG8uZywgby5iLCBvLm9wYWNpdHkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmdiKHIsIGcsIGIsIG9wYWNpdHkpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyByZ2JDb252ZXJ0KHIpIDogbmV3IFJnYihyLCBnLCBiLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSZ2IociwgZywgYiwgb3BhY2l0eSkge1xuICB0aGlzLnIgPSArcjtcbiAgdGhpcy5nID0gK2c7XG4gIHRoaXMuYiA9ICtiO1xuICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTtcbn1cblxuZGVmaW5lKFJnYiwgcmdiLCBleHRlbmQoQ29sb3IsIHtcbiAgYnJpZ2h0ZXIoaykge1xuICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciA6IE1hdGgucG93KGJyaWdodGVyLCBrKTtcbiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpO1xuICB9LFxuICBkYXJrZXIoaykge1xuICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspO1xuICAgIHJldHVybiBuZXcgUmdiKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSxcbiAgY2xhbXAoKSB7XG4gICAgcmV0dXJuIG5ldyBSZ2IoY2xhbXBpKHRoaXMuciksIGNsYW1waSh0aGlzLmcpLCBjbGFtcGkodGhpcy5iKSwgY2xhbXBhKHRoaXMub3BhY2l0eSkpO1xuICB9LFxuICBkaXNwbGF5YWJsZSgpIHtcbiAgICByZXR1cm4gKC0wLjUgPD0gdGhpcy5yICYmIHRoaXMuciA8IDI1NS41KVxuICAgICAgICAmJiAoLTAuNSA8PSB0aGlzLmcgJiYgdGhpcy5nIDwgMjU1LjUpXG4gICAgICAgICYmICgtMC41IDw9IHRoaXMuYiAmJiB0aGlzLmIgPCAyNTUuNSlcbiAgICAgICAgJiYgKDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTtcbiAgfSxcbiAgaGV4OiByZ2JfZm9ybWF0SGV4LCAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LlxuICBmb3JtYXRIZXg6IHJnYl9mb3JtYXRIZXgsXG4gIGZvcm1hdEhleDg6IHJnYl9mb3JtYXRIZXg4LFxuICBmb3JtYXRSZ2I6IHJnYl9mb3JtYXRSZ2IsXG4gIHRvU3RyaW5nOiByZ2JfZm9ybWF0UmdiXG59KSk7XG5cbmZ1bmN0aW9uIHJnYl9mb3JtYXRIZXgoKSB7XG4gIHJldHVybiBgIyR7aGV4KHRoaXMucil9JHtoZXgodGhpcy5nKX0ke2hleCh0aGlzLmIpfWA7XG59XG5cbmZ1bmN0aW9uIHJnYl9mb3JtYXRIZXg4KCkge1xuICByZXR1cm4gYCMke2hleCh0aGlzLnIpfSR7aGV4KHRoaXMuZyl9JHtoZXgodGhpcy5iKX0ke2hleCgoaXNOYU4odGhpcy5vcGFjaXR5KSA/IDEgOiB0aGlzLm9wYWNpdHkpICogMjU1KX1gO1xufVxuXG5mdW5jdGlvbiByZ2JfZm9ybWF0UmdiKCkge1xuICBjb25zdCBhID0gY2xhbXBhKHRoaXMub3BhY2l0eSk7XG4gIHJldHVybiBgJHthID09PSAxID8gXCJyZ2IoXCIgOiBcInJnYmEoXCJ9JHtjbGFtcGkodGhpcy5yKX0sICR7Y2xhbXBpKHRoaXMuZyl9LCAke2NsYW1waSh0aGlzLmIpfSR7YSA9PT0gMSA/IFwiKVwiIDogYCwgJHthfSlgfWA7XG59XG5cbmZ1bmN0aW9uIGNsYW1wYShvcGFjaXR5KSB7XG4gIHJldHVybiBpc05hTihvcGFjaXR5KSA/IDEgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBvcGFjaXR5KSk7XG59XG5cbmZ1bmN0aW9uIGNsYW1waSh2YWx1ZSkge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHZhbHVlKSB8fCAwKSk7XG59XG5cbmZ1bmN0aW9uIGhleCh2YWx1ZSkge1xuICB2YWx1ZSA9IGNsYW1waSh2YWx1ZSk7XG4gIHJldHVybiAodmFsdWUgPCAxNiA/IFwiMFwiIDogXCJcIikgKyB2YWx1ZS50b1N0cmluZygxNik7XG59XG5cbmZ1bmN0aW9uIGhzbGEoaCwgcywgbCwgYSkge1xuICBpZiAoYSA8PSAwKSBoID0gcyA9IGwgPSBOYU47XG4gIGVsc2UgaWYgKGwgPD0gMCB8fCBsID49IDEpIGggPSBzID0gTmFOO1xuICBlbHNlIGlmIChzIDw9IDApIGggPSBOYU47XG4gIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHNsQ29udmVydChvKSB7XG4gIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbmV3IEhzbChvLmgsIG8ucywgby5sLCBvLm9wYWNpdHkpO1xuICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0gY29sb3Iobyk7XG4gIGlmICghbykgcmV0dXJuIG5ldyBIc2w7XG4gIGlmIChvIGluc3RhbmNlb2YgSHNsKSByZXR1cm4gbztcbiAgbyA9IG8ucmdiKCk7XG4gIHZhciByID0gby5yIC8gMjU1LFxuICAgICAgZyA9IG8uZyAvIDI1NSxcbiAgICAgIGIgPSBvLmIgLyAyNTUsXG4gICAgICBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKSxcbiAgICAgIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpLFxuICAgICAgaCA9IE5hTixcbiAgICAgIHMgPSBtYXggLSBtaW4sXG4gICAgICBsID0gKG1heCArIG1pbikgLyAyO1xuICBpZiAocykge1xuICAgIGlmIChyID09PSBtYXgpIGggPSAoZyAtIGIpIC8gcyArIChnIDwgYikgKiA2O1xuICAgIGVsc2UgaWYgKGcgPT09IG1heCkgaCA9IChiIC0gcikgLyBzICsgMjtcbiAgICBlbHNlIGggPSAociAtIGcpIC8gcyArIDQ7XG4gICAgcyAvPSBsIDwgMC41ID8gbWF4ICsgbWluIDogMiAtIG1heCAtIG1pbjtcbiAgICBoICo9IDYwO1xuICB9IGVsc2Uge1xuICAgIHMgPSBsID4gMCAmJiBsIDwgMSA/IDAgOiBoO1xuICB9XG4gIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIG8ub3BhY2l0eSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoc2woaCwgcywgbCwgb3BhY2l0eSkge1xuICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhzbENvbnZlcnQoaCkgOiBuZXcgSHNsKGgsIHMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTtcbn1cblxuZnVuY3Rpb24gSHNsKGgsIHMsIGwsIG9wYWNpdHkpIHtcbiAgdGhpcy5oID0gK2g7XG4gIHRoaXMucyA9ICtzO1xuICB0aGlzLmwgPSArbDtcbiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7XG59XG5cbmRlZmluZShIc2wsIGhzbCwgZXh0ZW5kKENvbG9yLCB7XG4gIGJyaWdodGVyKGspIHtcbiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7XG4gICAgcmV0dXJuIG5ldyBIc2wodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIGRhcmtlcihrKSB7XG4gICAgayA9IGsgPT0gbnVsbCA/IGRhcmtlciA6IE1hdGgucG93KGRhcmtlciwgayk7XG4gICAgcmV0dXJuIG5ldyBIc2wodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7XG4gIH0sXG4gIHJnYigpIHtcbiAgICB2YXIgaCA9IHRoaXMuaCAlIDM2MCArICh0aGlzLmggPCAwKSAqIDM2MCxcbiAgICAgICAgcyA9IGlzTmFOKGgpIHx8IGlzTmFOKHRoaXMucykgPyAwIDogdGhpcy5zLFxuICAgICAgICBsID0gdGhpcy5sLFxuICAgICAgICBtMiA9IGwgKyAobCA8IDAuNSA/IGwgOiAxIC0gbCkgKiBzLFxuICAgICAgICBtMSA9IDIgKiBsIC0gbTI7XG4gICAgcmV0dXJuIG5ldyBSZ2IoXG4gICAgICBoc2wycmdiKGggPj0gMjQwID8gaCAtIDI0MCA6IGggKyAxMjAsIG0xLCBtMiksXG4gICAgICBoc2wycmdiKGgsIG0xLCBtMiksXG4gICAgICBoc2wycmdiKGggPCAxMjAgPyBoICsgMjQwIDogaCAtIDEyMCwgbTEsIG0yKSxcbiAgICAgIHRoaXMub3BhY2l0eVxuICAgICk7XG4gIH0sXG4gIGNsYW1wKCkge1xuICAgIHJldHVybiBuZXcgSHNsKGNsYW1waCh0aGlzLmgpLCBjbGFtcHQodGhpcy5zKSwgY2xhbXB0KHRoaXMubCksIGNsYW1wYSh0aGlzLm9wYWNpdHkpKTtcbiAgfSxcbiAgZGlzcGxheWFibGUoKSB7XG4gICAgcmV0dXJuICgwIDw9IHRoaXMucyAmJiB0aGlzLnMgPD0gMSB8fCBpc05hTih0aGlzLnMpKVxuICAgICAgICAmJiAoMCA8PSB0aGlzLmwgJiYgdGhpcy5sIDw9IDEpXG4gICAgICAgICYmICgwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMSk7XG4gIH0sXG4gIGZvcm1hdEhzbCgpIHtcbiAgICBjb25zdCBhID0gY2xhbXBhKHRoaXMub3BhY2l0eSk7XG4gICAgcmV0dXJuIGAke2EgPT09IDEgPyBcImhzbChcIiA6IFwiaHNsYShcIn0ke2NsYW1waCh0aGlzLmgpfSwgJHtjbGFtcHQodGhpcy5zKSAqIDEwMH0lLCAke2NsYW1wdCh0aGlzLmwpICogMTAwfSUke2EgPT09IDEgPyBcIilcIiA6IGAsICR7YX0pYH1gO1xuICB9XG59KSk7XG5cbmZ1bmN0aW9uIGNsYW1waCh2YWx1ZSkge1xuICB2YWx1ZSA9ICh2YWx1ZSB8fCAwKSAlIDM2MDtcbiAgcmV0dXJuIHZhbHVlIDwgMCA/IHZhbHVlICsgMzYwIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNsYW1wdCh2YWx1ZSkge1xuICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdmFsdWUgfHwgMCkpO1xufVxuXG4vKiBGcm9tIEZ2RCAxMy4zNywgQ1NTIENvbG9yIE1vZHVsZSBMZXZlbCAzICovXG5mdW5jdGlvbiBoc2wycmdiKGgsIG0xLCBtMikge1xuICByZXR1cm4gKGggPCA2MCA/IG0xICsgKG0yIC0gbTEpICogaCAvIDYwXG4gICAgICA6IGggPCAxODAgPyBtMlxuICAgICAgOiBoIDwgMjQwID8gbTEgKyAobTIgLSBtMSkgKiAoMjQwIC0gaCkgLyA2MFxuICAgICAgOiBtMSkgKiAyNTU7XG59XG4iLCJleHBvcnQgZGVmYXVsdCB4ID0+ICgpID0+IHg7XG4iLCJpbXBvcnQgY29uc3RhbnQgZnJvbSBcIi4vY29uc3RhbnQuanNcIjtcblxuZnVuY3Rpb24gbGluZWFyKGEsIGQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYSArIHQgKiBkO1xuICB9O1xufVxuXG5mdW5jdGlvbiBleHBvbmVudGlhbChhLCBiLCB5KSB7XG4gIHJldHVybiBhID0gTWF0aC5wb3coYSwgeSksIGIgPSBNYXRoLnBvdyhiLCB5KSAtIGEsIHkgPSAxIC8geSwgZnVuY3Rpb24odCkge1xuICAgIHJldHVybiBNYXRoLnBvdyhhICsgdCAqIGIsIHkpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHVlKGEsIGIpIHtcbiAgdmFyIGQgPSBiIC0gYTtcbiAgcmV0dXJuIGQgPyBsaW5lYXIoYSwgZCA+IDE4MCB8fCBkIDwgLTE4MCA/IGQgLSAzNjAgKiBNYXRoLnJvdW5kKGQgLyAzNjApIDogZCkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdhbW1hKHkpIHtcbiAgcmV0dXJuICh5ID0gK3kpID09PSAxID8gbm9nYW1tYSA6IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gYiAtIGEgPyBleHBvbmVudGlhbChhLCBiLCB5KSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBub2dhbW1hKGEsIGIpIHtcbiAgdmFyIGQgPSBiIC0gYTtcbiAgcmV0dXJuIGQgPyBsaW5lYXIoYSwgZCkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTtcbn1cbiIsImltcG9ydCB7cmdiIGFzIGNvbG9yUmdifSBmcm9tIFwiZDMtY29sb3JcIjtcbmltcG9ydCBiYXNpcyBmcm9tIFwiLi9iYXNpcy5qc1wiO1xuaW1wb3J0IGJhc2lzQ2xvc2VkIGZyb20gXCIuL2Jhc2lzQ2xvc2VkLmpzXCI7XG5pbXBvcnQgbm9nYW1tYSwge2dhbW1hfSBmcm9tIFwiLi9jb2xvci5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gcmdiR2FtbWEoeSkge1xuICB2YXIgY29sb3IgPSBnYW1tYSh5KTtcblxuICBmdW5jdGlvbiByZ2Ioc3RhcnQsIGVuZCkge1xuICAgIHZhciByID0gY29sb3IoKHN0YXJ0ID0gY29sb3JSZ2Ioc3RhcnQpKS5yLCAoZW5kID0gY29sb3JSZ2IoZW5kKSkuciksXG4gICAgICAgIGcgPSBjb2xvcihzdGFydC5nLCBlbmQuZyksXG4gICAgICAgIGIgPSBjb2xvcihzdGFydC5iLCBlbmQuYiksXG4gICAgICAgIG9wYWNpdHkgPSBub2dhbW1hKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgc3RhcnQuciA9IHIodCk7XG4gICAgICBzdGFydC5nID0gZyh0KTtcbiAgICAgIHN0YXJ0LmIgPSBiKHQpO1xuICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7XG4gICAgICByZXR1cm4gc3RhcnQgKyBcIlwiO1xuICAgIH07XG4gIH1cblxuICByZ2IuZ2FtbWEgPSByZ2JHYW1tYTtcblxuICByZXR1cm4gcmdiO1xufSkoMSk7XG5cbmZ1bmN0aW9uIHJnYlNwbGluZShzcGxpbmUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGNvbG9ycykge1xuICAgIHZhciBuID0gY29sb3JzLmxlbmd0aCxcbiAgICAgICAgciA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgZyA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgYiA9IG5ldyBBcnJheShuKSxcbiAgICAgICAgaSwgY29sb3I7XG4gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgY29sb3IgPSBjb2xvclJnYihjb2xvcnNbaV0pO1xuICAgICAgcltpXSA9IGNvbG9yLnIgfHwgMDtcbiAgICAgIGdbaV0gPSBjb2xvci5nIHx8IDA7XG4gICAgICBiW2ldID0gY29sb3IuYiB8fCAwO1xuICAgIH1cbiAgICByID0gc3BsaW5lKHIpO1xuICAgIGcgPSBzcGxpbmUoZyk7XG4gICAgYiA9IHNwbGluZShiKTtcbiAgICBjb2xvci5vcGFjaXR5ID0gMTtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgY29sb3IuciA9IHIodCk7XG4gICAgICBjb2xvci5nID0gZyh0KTtcbiAgICAgIGNvbG9yLmIgPSBiKHQpO1xuICAgICAgcmV0dXJuIGNvbG9yICsgXCJcIjtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgdmFyIHJnYkJhc2lzID0gcmdiU3BsaW5lKGJhc2lzKTtcbmV4cG9ydCB2YXIgcmdiQmFzaXNDbG9zZWQgPSByZ2JTcGxpbmUoYmFzaXNDbG9zZWQpO1xuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICByZXR1cm4gYSA9ICthLCBiID0gK2IsIGZ1bmN0aW9uKHQpIHtcbiAgICByZXR1cm4gYSAqICgxIC0gdCkgKyBiICogdDtcbiAgfTtcbn1cbiIsImltcG9ydCBudW1iZXIgZnJvbSBcIi4vbnVtYmVyLmpzXCI7XG5cbnZhciByZUEgPSAvWy0rXT8oPzpcXGQrXFwuP1xcZCp8XFwuP1xcZCspKD86W2VFXVstK10/XFxkKyk/L2csXG4gICAgcmVCID0gbmV3IFJlZ0V4cChyZUEuc291cmNlLCBcImdcIik7XG5cbmZ1bmN0aW9uIHplcm8oYikge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGI7XG4gIH07XG59XG5cbmZ1bmN0aW9uIG9uZShiKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIGIodCkgKyBcIlwiO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiKSB7XG4gIHZhciBiaSA9IHJlQS5sYXN0SW5kZXggPSByZUIubGFzdEluZGV4ID0gMCwgLy8gc2NhbiBpbmRleCBmb3IgbmV4dCBudW1iZXIgaW4gYlxuICAgICAgYW0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYVxuICAgICAgYm0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYlxuICAgICAgYnMsIC8vIHN0cmluZyBwcmVjZWRpbmcgY3VycmVudCBudW1iZXIgaW4gYiwgaWYgYW55XG4gICAgICBpID0gLTEsIC8vIGluZGV4IGluIHNcbiAgICAgIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzXG4gICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzXG5cbiAgLy8gQ29lcmNlIGlucHV0cyB0byBzdHJpbmdzLlxuICBhID0gYSArIFwiXCIsIGIgPSBiICsgXCJcIjtcblxuICAvLyBJbnRlcnBvbGF0ZSBwYWlycyBvZiBudW1iZXJzIGluIGEgJiBiLlxuICB3aGlsZSAoKGFtID0gcmVBLmV4ZWMoYSkpXG4gICAgICAmJiAoYm0gPSByZUIuZXhlYyhiKSkpIHtcbiAgICBpZiAoKGJzID0gYm0uaW5kZXgpID4gYmkpIHsgLy8gYSBzdHJpbmcgcHJlY2VkZXMgdGhlIG5leHQgbnVtYmVyIGluIGJcbiAgICAgIGJzID0gYi5zbGljZShiaSwgYnMpO1xuICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgICBlbHNlIHNbKytpXSA9IGJzO1xuICAgIH1cbiAgICBpZiAoKGFtID0gYW1bMF0pID09PSAoYm0gPSBibVswXSkpIHsgLy8gbnVtYmVycyBpbiBhICYgYiBtYXRjaFxuICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYm07IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgICBlbHNlIHNbKytpXSA9IGJtO1xuICAgIH0gZWxzZSB7IC8vIGludGVycG9sYXRlIG5vbi1tYXRjaGluZyBudW1iZXJzXG4gICAgICBzWysraV0gPSBudWxsO1xuICAgICAgcS5wdXNoKHtpOiBpLCB4OiBudW1iZXIoYW0sIGJtKX0pO1xuICAgIH1cbiAgICBiaSA9IHJlQi5sYXN0SW5kZXg7XG4gIH1cblxuICAvLyBBZGQgcmVtYWlucyBvZiBiLlxuICBpZiAoYmkgPCBiLmxlbmd0aCkge1xuICAgIGJzID0gYi5zbGljZShiaSk7XG4gICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nXG4gICAgZWxzZSBzWysraV0gPSBicztcbiAgfVxuXG4gIC8vIFNwZWNpYWwgb3B0aW1pemF0aW9uIGZvciBvbmx5IGEgc2luZ2xlIG1hdGNoLlxuICAvLyBPdGhlcndpc2UsIGludGVycG9sYXRlIGVhY2ggb2YgdGhlIG51bWJlcnMgYW5kIHJlam9pbiB0aGUgc3RyaW5nLlxuICByZXR1cm4gcy5sZW5ndGggPCAyID8gKHFbMF1cbiAgICAgID8gb25lKHFbMF0ueClcbiAgICAgIDogemVybyhiKSlcbiAgICAgIDogKGIgPSBxLmxlbmd0aCwgZnVuY3Rpb24odCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBvOyBpIDwgYjsgKytpKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7XG4gICAgICAgICAgcmV0dXJuIHMuam9pbihcIlwiKTtcbiAgICAgICAgfSk7XG59XG4iLCJ2YXIgZGVncmVlcyA9IDE4MCAvIE1hdGguUEk7XG5cbmV4cG9ydCB2YXIgaWRlbnRpdHkgPSB7XG4gIHRyYW5zbGF0ZVg6IDAsXG4gIHRyYW5zbGF0ZVk6IDAsXG4gIHJvdGF0ZTogMCxcbiAgc2tld1g6IDAsXG4gIHNjYWxlWDogMSxcbiAgc2NhbGVZOiAxXG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIHZhciBzY2FsZVgsIHNjYWxlWSwgc2tld1g7XG4gIGlmIChzY2FsZVggPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYikpIGEgLz0gc2NhbGVYLCBiIC89IHNjYWxlWDtcbiAgaWYgKHNrZXdYID0gYSAqIGMgKyBiICogZCkgYyAtPSBhICogc2tld1gsIGQgLT0gYiAqIHNrZXdYO1xuICBpZiAoc2NhbGVZID0gTWF0aC5zcXJ0KGMgKiBjICsgZCAqIGQpKSBjIC89IHNjYWxlWSwgZCAvPSBzY2FsZVksIHNrZXdYIC89IHNjYWxlWTtcbiAgaWYgKGEgKiBkIDwgYiAqIGMpIGEgPSAtYSwgYiA9IC1iLCBza2V3WCA9IC1za2V3WCwgc2NhbGVYID0gLXNjYWxlWDtcbiAgcmV0dXJuIHtcbiAgICB0cmFuc2xhdGVYOiBlLFxuICAgIHRyYW5zbGF0ZVk6IGYsXG4gICAgcm90YXRlOiBNYXRoLmF0YW4yKGIsIGEpICogZGVncmVlcyxcbiAgICBza2V3WDogTWF0aC5hdGFuKHNrZXdYKSAqIGRlZ3JlZXMsXG4gICAgc2NhbGVYOiBzY2FsZVgsXG4gICAgc2NhbGVZOiBzY2FsZVlcbiAgfTtcbn1cbiIsImltcG9ydCBkZWNvbXBvc2UsIHtpZGVudGl0eX0gZnJvbSBcIi4vZGVjb21wb3NlLmpzXCI7XG5cbnZhciBzdmdOb2RlO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ3NzKHZhbHVlKSB7XG4gIGNvbnN0IG0gPSBuZXcgKHR5cGVvZiBET01NYXRyaXggPT09IFwiZnVuY3Rpb25cIiA/IERPTU1hdHJpeCA6IFdlYktpdENTU01hdHJpeCkodmFsdWUgKyBcIlwiKTtcbiAgcmV0dXJuIG0uaXNJZGVudGl0eSA/IGlkZW50aXR5IDogZGVjb21wb3NlKG0uYSwgbS5iLCBtLmMsIG0uZCwgbS5lLCBtLmYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTdmcodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBpZGVudGl0eTtcbiAgaWYgKCFzdmdOb2RlKSBzdmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJnXCIpO1xuICBzdmdOb2RlLnNldEF0dHJpYnV0ZShcInRyYW5zZm9ybVwiLCB2YWx1ZSk7XG4gIGlmICghKHZhbHVlID0gc3ZnTm9kZS50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKSkgcmV0dXJuIGlkZW50aXR5O1xuICB2YWx1ZSA9IHZhbHVlLm1hdHJpeDtcbiAgcmV0dXJuIGRlY29tcG9zZSh2YWx1ZS5hLCB2YWx1ZS5iLCB2YWx1ZS5jLCB2YWx1ZS5kLCB2YWx1ZS5lLCB2YWx1ZS5mKTtcbn1cbiIsImltcG9ydCBudW1iZXIgZnJvbSBcIi4uL251bWJlci5qc1wiO1xuaW1wb3J0IHtwYXJzZUNzcywgcGFyc2VTdmd9IGZyb20gXCIuL3BhcnNlLmpzXCI7XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlLCBweENvbW1hLCBweFBhcmVuLCBkZWdQYXJlbikge1xuXG4gIGZ1bmN0aW9uIHBvcChzKSB7XG4gICAgcmV0dXJuIHMubGVuZ3RoID8gcy5wb3AoKSArIFwiIFwiIDogXCJcIjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zbGF0ZSh4YSwgeWEsIHhiLCB5YiwgcywgcSkge1xuICAgIGlmICh4YSAhPT0geGIgfHwgeWEgIT09IHliKSB7XG4gICAgICB2YXIgaSA9IHMucHVzaChcInRyYW5zbGF0ZShcIiwgbnVsbCwgcHhDb21tYSwgbnVsbCwgcHhQYXJlbik7XG4gICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBudW1iZXIoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogbnVtYmVyKHlhLCB5Yil9KTtcbiAgICB9IGVsc2UgaWYgKHhiIHx8IHliKSB7XG4gICAgICBzLnB1c2goXCJ0cmFuc2xhdGUoXCIgKyB4YiArIHB4Q29tbWEgKyB5YiArIHB4UGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJvdGF0ZShhLCBiLCBzLCBxKSB7XG4gICAgaWYgKGEgIT09IGIpIHtcbiAgICAgIGlmIChhIC0gYiA+IDE4MCkgYiArPSAzNjA7IGVsc2UgaWYgKGIgLSBhID4gMTgwKSBhICs9IDM2MDsgLy8gc2hvcnRlc3QgcGF0aFxuICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgXCJyb3RhdGUoXCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IG51bWJlcihhLCBiKX0pO1xuICAgIH0gZWxzZSBpZiAoYikge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwicm90YXRlKFwiICsgYiArIGRlZ1BhcmVuKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBza2V3WChhLCBiLCBzLCBxKSB7XG4gICAgaWYgKGEgIT09IGIpIHtcbiAgICAgIHEucHVzaCh7aTogcy5wdXNoKHBvcChzKSArIFwic2tld1goXCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IG51bWJlcihhLCBiKX0pO1xuICAgIH0gZWxzZSBpZiAoYikge1xuICAgICAgcy5wdXNoKHBvcChzKSArIFwic2tld1goXCIgKyBiICsgZGVnUGFyZW4pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNjYWxlKHhhLCB5YSwgeGIsIHliLCBzLCBxKSB7XG4gICAgaWYgKHhhICE9PSB4YiB8fCB5YSAhPT0geWIpIHtcbiAgICAgIHZhciBpID0gcy5wdXNoKHBvcChzKSArIFwic2NhbGUoXCIsIG51bGwsIFwiLFwiLCBudWxsLCBcIilcIik7XG4gICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBudW1iZXIoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogbnVtYmVyKHlhLCB5Yil9KTtcbiAgICB9IGVsc2UgaWYgKHhiICE9PSAxIHx8IHliICE9PSAxKSB7XG4gICAgICBzLnB1c2gocG9wKHMpICsgXCJzY2FsZShcIiArIHhiICsgXCIsXCIgKyB5YiArIFwiKVwiKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24oYSwgYikge1xuICAgIHZhciBzID0gW10sIC8vIHN0cmluZyBjb25zdGFudHMgYW5kIHBsYWNlaG9sZGVyc1xuICAgICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzXG4gICAgYSA9IHBhcnNlKGEpLCBiID0gcGFyc2UoYik7XG4gICAgdHJhbnNsYXRlKGEudHJhbnNsYXRlWCwgYS50cmFuc2xhdGVZLCBiLnRyYW5zbGF0ZVgsIGIudHJhbnNsYXRlWSwgcywgcSk7XG4gICAgcm90YXRlKGEucm90YXRlLCBiLnJvdGF0ZSwgcywgcSk7XG4gICAgc2tld1goYS5za2V3WCwgYi5za2V3WCwgcywgcSk7XG4gICAgc2NhbGUoYS5zY2FsZVgsIGEuc2NhbGVZLCBiLnNjYWxlWCwgYi5zY2FsZVksIHMsIHEpO1xuICAgIGEgPSBiID0gbnVsbDsgLy8gZ2NcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgdmFyIGkgPSAtMSwgbiA9IHEubGVuZ3RoLCBvO1xuICAgICAgd2hpbGUgKCsraSA8IG4pIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTtcbiAgICAgIHJldHVybiBzLmpvaW4oXCJcIik7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IHZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyA9IGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlQ3NzLCBcInB4LCBcIiwgXCJweClcIiwgXCJkZWcpXCIpO1xuZXhwb3J0IHZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyA9IGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlU3ZnLCBcIiwgXCIsIFwiKVwiLCBcIilcIik7XG4iLCJ2YXIgZnJhbWUgPSAwLCAvLyBpcyBhbiBhbmltYXRpb24gZnJhbWUgcGVuZGluZz9cbiAgICB0aW1lb3V0ID0gMCwgLy8gaXMgYSB0aW1lb3V0IHBlbmRpbmc/XG4gICAgaW50ZXJ2YWwgPSAwLCAvLyBhcmUgYW55IHRpbWVycyBhY3RpdmU/XG4gICAgcG9rZURlbGF5ID0gMTAwMCwgLy8gaG93IGZyZXF1ZW50bHkgd2UgY2hlY2sgZm9yIGNsb2NrIHNrZXdcbiAgICB0YXNrSGVhZCxcbiAgICB0YXNrVGFpbCxcbiAgICBjbG9ja0xhc3QgPSAwLFxuICAgIGNsb2NrTm93ID0gMCxcbiAgICBjbG9ja1NrZXcgPSAwLFxuICAgIGNsb2NrID0gdHlwZW9mIHBlcmZvcm1hbmNlID09PSBcIm9iamVjdFwiICYmIHBlcmZvcm1hbmNlLm5vdyA/IHBlcmZvcm1hbmNlIDogRGF0ZSxcbiAgICBzZXRGcmFtZSA9IHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpIDogZnVuY3Rpb24oZikgeyBzZXRUaW1lb3V0KGYsIDE3KTsgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vdygpIHtcbiAgcmV0dXJuIGNsb2NrTm93IHx8IChzZXRGcmFtZShjbGVhck5vdyksIGNsb2NrTm93ID0gY2xvY2subm93KCkgKyBjbG9ja1NrZXcpO1xufVxuXG5mdW5jdGlvbiBjbGVhck5vdygpIHtcbiAgY2xvY2tOb3cgPSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gVGltZXIoKSB7XG4gIHRoaXMuX2NhbGwgPVxuICB0aGlzLl90aW1lID1cbiAgdGhpcy5fbmV4dCA9IG51bGw7XG59XG5cblRpbWVyLnByb3RvdHlwZSA9IHRpbWVyLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRpbWVyLFxuICByZXN0YXJ0OiBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgICB0aW1lID0gKHRpbWUgPT0gbnVsbCA/IG5vdygpIDogK3RpbWUpICsgKGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5KTtcbiAgICBpZiAoIXRoaXMuX25leHQgJiYgdGFza1RhaWwgIT09IHRoaXMpIHtcbiAgICAgIGlmICh0YXNrVGFpbCkgdGFza1RhaWwuX25leHQgPSB0aGlzO1xuICAgICAgZWxzZSB0YXNrSGVhZCA9IHRoaXM7XG4gICAgICB0YXNrVGFpbCA9IHRoaXM7XG4gICAgfVxuICAgIHRoaXMuX2NhbGwgPSBjYWxsYmFjaztcbiAgICB0aGlzLl90aW1lID0gdGltZTtcbiAgICBzbGVlcCgpO1xuICB9LFxuICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5fY2FsbCkge1xuICAgICAgdGhpcy5fY2FsbCA9IG51bGw7XG4gICAgICB0aGlzLl90aW1lID0gSW5maW5pdHk7XG4gICAgICBzbGVlcCgpO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRpbWVyKGNhbGxiYWNrLCBkZWxheSwgdGltZSkge1xuICB2YXIgdCA9IG5ldyBUaW1lcjtcbiAgdC5yZXN0YXJ0KGNhbGxiYWNrLCBkZWxheSwgdGltZSk7XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGltZXJGbHVzaCgpIHtcbiAgbm93KCk7IC8vIEdldCB0aGUgY3VycmVudCB0aW1lLCBpZiBub3QgYWxyZWFkeSBzZXQuXG4gICsrZnJhbWU7IC8vIFByZXRlbmQgd2XigJl2ZSBzZXQgYW4gYWxhcm0sIGlmIHdlIGhhdmVu4oCZdCBhbHJlYWR5LlxuICB2YXIgdCA9IHRhc2tIZWFkLCBlO1xuICB3aGlsZSAodCkge1xuICAgIGlmICgoZSA9IGNsb2NrTm93IC0gdC5fdGltZSkgPj0gMCkgdC5fY2FsbC5jYWxsKHVuZGVmaW5lZCwgZSk7XG4gICAgdCA9IHQuX25leHQ7XG4gIH1cbiAgLS1mcmFtZTtcbn1cblxuZnVuY3Rpb24gd2FrZSgpIHtcbiAgY2xvY2tOb3cgPSAoY2xvY2tMYXN0ID0gY2xvY2subm93KCkpICsgY2xvY2tTa2V3O1xuICBmcmFtZSA9IHRpbWVvdXQgPSAwO1xuICB0cnkge1xuICAgIHRpbWVyRmx1c2goKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBmcmFtZSA9IDA7XG4gICAgbmFwKCk7XG4gICAgY2xvY2tOb3cgPSAwO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBva2UoKSB7XG4gIHZhciBub3cgPSBjbG9jay5ub3coKSwgZGVsYXkgPSBub3cgLSBjbG9ja0xhc3Q7XG4gIGlmIChkZWxheSA+IHBva2VEZWxheSkgY2xvY2tTa2V3IC09IGRlbGF5LCBjbG9ja0xhc3QgPSBub3c7XG59XG5cbmZ1bmN0aW9uIG5hcCgpIHtcbiAgdmFyIHQwLCB0MSA9IHRhc2tIZWFkLCB0MiwgdGltZSA9IEluZmluaXR5O1xuICB3aGlsZSAodDEpIHtcbiAgICBpZiAodDEuX2NhbGwpIHtcbiAgICAgIGlmICh0aW1lID4gdDEuX3RpbWUpIHRpbWUgPSB0MS5fdGltZTtcbiAgICAgIHQwID0gdDEsIHQxID0gdDEuX25leHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHQyID0gdDEuX25leHQsIHQxLl9uZXh0ID0gbnVsbDtcbiAgICAgIHQxID0gdDAgPyB0MC5fbmV4dCA9IHQyIDogdGFza0hlYWQgPSB0MjtcbiAgICB9XG4gIH1cbiAgdGFza1RhaWwgPSB0MDtcbiAgc2xlZXAodGltZSk7XG59XG5cbmZ1bmN0aW9uIHNsZWVwKHRpbWUpIHtcbiAgaWYgKGZyYW1lKSByZXR1cm47IC8vIFNvb25lc3QgYWxhcm0gYWxyZWFkeSBzZXQsIG9yIHdpbGwgYmUuXG4gIGlmICh0aW1lb3V0KSB0aW1lb3V0ID0gY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICB2YXIgZGVsYXkgPSB0aW1lIC0gY2xvY2tOb3c7IC8vIFN0cmljdGx5IGxlc3MgdGhhbiBpZiB3ZSByZWNvbXB1dGVkIGNsb2NrTm93LlxuICBpZiAoZGVsYXkgPiAyNCkge1xuICAgIGlmICh0aW1lIDwgSW5maW5pdHkpIHRpbWVvdXQgPSBzZXRUaW1lb3V0KHdha2UsIHRpbWUgLSBjbG9jay5ub3coKSAtIGNsb2NrU2tldyk7XG4gICAgaWYgKGludGVydmFsKSBpbnRlcnZhbCA9IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICB9IGVsc2Uge1xuICAgIGlmICghaW50ZXJ2YWwpIGNsb2NrTGFzdCA9IGNsb2NrLm5vdygpLCBpbnRlcnZhbCA9IHNldEludGVydmFsKHBva2UsIHBva2VEZWxheSk7XG4gICAgZnJhbWUgPSAxLCBzZXRGcmFtZSh3YWtlKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtUaW1lcn0gZnJvbSBcIi4vdGltZXIuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7XG4gIHZhciB0ID0gbmV3IFRpbWVyO1xuICBkZWxheSA9IGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5O1xuICB0LnJlc3RhcnQoZWxhcHNlZCA9PiB7XG4gICAgdC5zdG9wKCk7XG4gICAgY2FsbGJhY2soZWxhcHNlZCArIGRlbGF5KTtcbiAgfSwgZGVsYXksIHRpbWUpO1xuICByZXR1cm4gdDtcbn1cbiIsImltcG9ydCB7ZGlzcGF0Y2h9IGZyb20gXCJkMy1kaXNwYXRjaFwiO1xuaW1wb3J0IHt0aW1lciwgdGltZW91dH0gZnJvbSBcImQzLXRpbWVyXCI7XG5cbnZhciBlbXB0eU9uID0gZGlzcGF0Y2goXCJzdGFydFwiLCBcImVuZFwiLCBcImNhbmNlbFwiLCBcImludGVycnVwdFwiKTtcbnZhciBlbXB0eVR3ZWVuID0gW107XG5cbmV4cG9ydCB2YXIgQ1JFQVRFRCA9IDA7XG5leHBvcnQgdmFyIFNDSEVEVUxFRCA9IDE7XG5leHBvcnQgdmFyIFNUQVJUSU5HID0gMjtcbmV4cG9ydCB2YXIgU1RBUlRFRCA9IDM7XG5leHBvcnQgdmFyIFJVTk5JTkcgPSA0O1xuZXhwb3J0IHZhciBFTkRJTkcgPSA1O1xuZXhwb3J0IHZhciBFTkRFRCA9IDY7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5vZGUsIG5hbWUsIGlkLCBpbmRleCwgZ3JvdXAsIHRpbWluZykge1xuICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb247XG4gIGlmICghc2NoZWR1bGVzKSBub2RlLl9fdHJhbnNpdGlvbiA9IHt9O1xuICBlbHNlIGlmIChpZCBpbiBzY2hlZHVsZXMpIHJldHVybjtcbiAgY3JlYXRlKG5vZGUsIGlkLCB7XG4gICAgbmFtZTogbmFtZSxcbiAgICBpbmRleDogaW5kZXgsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay5cbiAgICBncm91cDogZ3JvdXAsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay5cbiAgICBvbjogZW1wdHlPbixcbiAgICB0d2VlbjogZW1wdHlUd2VlbixcbiAgICB0aW1lOiB0aW1pbmcudGltZSxcbiAgICBkZWxheTogdGltaW5nLmRlbGF5LFxuICAgIGR1cmF0aW9uOiB0aW1pbmcuZHVyYXRpb24sXG4gICAgZWFzZTogdGltaW5nLmVhc2UsXG4gICAgdGltZXI6IG51bGwsXG4gICAgc3RhdGU6IENSRUFURURcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0KG5vZGUsIGlkKSB7XG4gIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7XG4gIGlmIChzY2hlZHVsZS5zdGF0ZSA+IENSRUFURUQpIHRocm93IG5ldyBFcnJvcihcInRvbyBsYXRlOyBhbHJlYWR5IHNjaGVkdWxlZFwiKTtcbiAgcmV0dXJuIHNjaGVkdWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0KG5vZGUsIGlkKSB7XG4gIHZhciBzY2hlZHVsZSA9IGdldChub2RlLCBpZCk7XG4gIGlmIChzY2hlZHVsZS5zdGF0ZSA+IFNUQVJURUQpIHRocm93IG5ldyBFcnJvcihcInRvbyBsYXRlOyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gIHJldHVybiBzY2hlZHVsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldChub2RlLCBpZCkge1xuICB2YXIgc2NoZWR1bGUgPSBub2RlLl9fdHJhbnNpdGlvbjtcbiAgaWYgKCFzY2hlZHVsZSB8fCAhKHNjaGVkdWxlID0gc2NoZWR1bGVbaWRdKSkgdGhyb3cgbmV3IEVycm9yKFwidHJhbnNpdGlvbiBub3QgZm91bmRcIik7XG4gIHJldHVybiBzY2hlZHVsZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlKG5vZGUsIGlkLCBzZWxmKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbixcbiAgICAgIHR3ZWVuO1xuXG4gIC8vIEluaXRpYWxpemUgdGhlIHNlbGYgdGltZXIgd2hlbiB0aGUgdHJhbnNpdGlvbiBpcyBjcmVhdGVkLlxuICAvLyBOb3RlIHRoZSBhY3R1YWwgZGVsYXkgaXMgbm90IGtub3duIHVudGlsIHRoZSBmaXJzdCBjYWxsYmFjayFcbiAgc2NoZWR1bGVzW2lkXSA9IHNlbGY7XG4gIHNlbGYudGltZXIgPSB0aW1lcihzY2hlZHVsZSwgMCwgc2VsZi50aW1lKTtcblxuICBmdW5jdGlvbiBzY2hlZHVsZShlbGFwc2VkKSB7XG4gICAgc2VsZi5zdGF0ZSA9IFNDSEVEVUxFRDtcbiAgICBzZWxmLnRpbWVyLnJlc3RhcnQoc3RhcnQsIHNlbGYuZGVsYXksIHNlbGYudGltZSk7XG5cbiAgICAvLyBJZiB0aGUgZWxhcHNlZCBkZWxheSBpcyBsZXNzIHRoYW4gb3VyIGZpcnN0IHNsZWVwLCBzdGFydCBpbW1lZGlhdGVseS5cbiAgICBpZiAoc2VsZi5kZWxheSA8PSBlbGFwc2VkKSBzdGFydChlbGFwc2VkIC0gc2VsZi5kZWxheSk7XG4gIH1cblxuICBmdW5jdGlvbiBzdGFydChlbGFwc2VkKSB7XG4gICAgdmFyIGksIGosIG4sIG87XG5cbiAgICAvLyBJZiB0aGUgc3RhdGUgaXMgbm90IFNDSEVEVUxFRCwgdGhlbiB3ZSBwcmV2aW91c2x5IGVycm9yZWQgb24gc3RhcnQuXG4gICAgaWYgKHNlbGYuc3RhdGUgIT09IFNDSEVEVUxFRCkgcmV0dXJuIHN0b3AoKTtcblxuICAgIGZvciAoaSBpbiBzY2hlZHVsZXMpIHtcbiAgICAgIG8gPSBzY2hlZHVsZXNbaV07XG4gICAgICBpZiAoby5uYW1lICE9PSBzZWxmLm5hbWUpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBXaGlsZSB0aGlzIGVsZW1lbnQgYWxyZWFkeSBoYXMgYSBzdGFydGluZyB0cmFuc2l0aW9uIGR1cmluZyB0aGlzIGZyYW1lLFxuICAgICAgLy8gZGVmZXIgc3RhcnRpbmcgYW4gaW50ZXJydXB0aW5nIHRyYW5zaXRpb24gdW50aWwgdGhhdCB0cmFuc2l0aW9uIGhhcyBhXG4gICAgICAvLyBjaGFuY2UgdG8gdGljayAoYW5kIHBvc3NpYmx5IGVuZCk7IHNlZSBkMy9kMy10cmFuc2l0aW9uIzU0IVxuICAgICAgaWYgKG8uc3RhdGUgPT09IFNUQVJURUQpIHJldHVybiB0aW1lb3V0KHN0YXJ0KTtcblxuICAgICAgLy8gSW50ZXJydXB0IHRoZSBhY3RpdmUgdHJhbnNpdGlvbiwgaWYgYW55LlxuICAgICAgaWYgKG8uc3RhdGUgPT09IFJVTk5JTkcpIHtcbiAgICAgICAgby5zdGF0ZSA9IEVOREVEO1xuICAgICAgICBvLnRpbWVyLnN0b3AoKTtcbiAgICAgICAgby5vbi5jYWxsKFwiaW50ZXJydXB0XCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIG8uaW5kZXgsIG8uZ3JvdXApO1xuICAgICAgICBkZWxldGUgc2NoZWR1bGVzW2ldO1xuICAgICAgfVxuXG4gICAgICAvLyBDYW5jZWwgYW55IHByZS1lbXB0ZWQgdHJhbnNpdGlvbnMuXG4gICAgICBlbHNlIGlmICgraSA8IGlkKSB7XG4gICAgICAgIG8uc3RhdGUgPSBFTkRFRDtcbiAgICAgICAgby50aW1lci5zdG9wKCk7XG4gICAgICAgIG8ub24uY2FsbChcImNhbmNlbFwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBvLmluZGV4LCBvLmdyb3VwKTtcbiAgICAgICAgZGVsZXRlIHNjaGVkdWxlc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWZlciB0aGUgZmlyc3QgdGljayB0byBlbmQgb2YgdGhlIGN1cnJlbnQgZnJhbWU7IHNlZSBkMy9kMyMxNTc2LlxuICAgIC8vIE5vdGUgdGhlIHRyYW5zaXRpb24gbWF5IGJlIGNhbmNlbGVkIGFmdGVyIHN0YXJ0IGFuZCBiZWZvcmUgdGhlIGZpcnN0IHRpY2shXG4gICAgLy8gTm90ZSB0aGlzIG11c3QgYmUgc2NoZWR1bGVkIGJlZm9yZSB0aGUgc3RhcnQgZXZlbnQ7IHNlZSBkMy9kMy10cmFuc2l0aW9uIzE2IVxuICAgIC8vIEFzc3VtaW5nIHRoaXMgaXMgc3VjY2Vzc2Z1bCwgc3Vic2VxdWVudCBjYWxsYmFja3MgZ28gc3RyYWlnaHQgdG8gdGljay5cbiAgICB0aW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHNlbGYuc3RhdGUgPT09IFNUQVJURUQpIHtcbiAgICAgICAgc2VsZi5zdGF0ZSA9IFJVTk5JTkc7XG4gICAgICAgIHNlbGYudGltZXIucmVzdGFydCh0aWNrLCBzZWxmLmRlbGF5LCBzZWxmLnRpbWUpO1xuICAgICAgICB0aWNrKGVsYXBzZWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gRGlzcGF0Y2ggdGhlIHN0YXJ0IGV2ZW50LlxuICAgIC8vIE5vdGUgdGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIHRoZSB0d2VlbiBhcmUgaW5pdGlhbGl6ZWQuXG4gICAgc2VsZi5zdGF0ZSA9IFNUQVJUSU5HO1xuICAgIHNlbGYub24uY2FsbChcInN0YXJ0XCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApO1xuICAgIGlmIChzZWxmLnN0YXRlICE9PSBTVEFSVElORykgcmV0dXJuOyAvLyBpbnRlcnJ1cHRlZFxuICAgIHNlbGYuc3RhdGUgPSBTVEFSVEVEO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgdHdlZW4sIGRlbGV0aW5nIG51bGwgdHdlZW4uXG4gICAgdHdlZW4gPSBuZXcgQXJyYXkobiA9IHNlbGYudHdlZW4ubGVuZ3RoKTtcbiAgICBmb3IgKGkgPSAwLCBqID0gLTE7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChvID0gc2VsZi50d2VlbltpXS52YWx1ZS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApKSB7XG4gICAgICAgIHR3ZWVuWysral0gPSBvO1xuICAgICAgfVxuICAgIH1cbiAgICB0d2Vlbi5sZW5ndGggPSBqICsgMTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRpY2soZWxhcHNlZCkge1xuICAgIHZhciB0ID0gZWxhcHNlZCA8IHNlbGYuZHVyYXRpb24gPyBzZWxmLmVhc2UuY2FsbChudWxsLCBlbGFwc2VkIC8gc2VsZi5kdXJhdGlvbikgOiAoc2VsZi50aW1lci5yZXN0YXJ0KHN0b3ApLCBzZWxmLnN0YXRlID0gRU5ESU5HLCAxKSxcbiAgICAgICAgaSA9IC0xLFxuICAgICAgICBuID0gdHdlZW4ubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIHR3ZWVuW2ldLmNhbGwobm9kZSwgdCk7XG4gICAgfVxuXG4gICAgLy8gRGlzcGF0Y2ggdGhlIGVuZCBldmVudC5cbiAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gRU5ESU5HKSB7XG4gICAgICBzZWxmLm9uLmNhbGwoXCJlbmRcIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7XG4gICAgICBzdG9wKCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc3RvcCgpIHtcbiAgICBzZWxmLnN0YXRlID0gRU5ERUQ7XG4gICAgc2VsZi50aW1lci5zdG9wKCk7XG4gICAgZGVsZXRlIHNjaGVkdWxlc1tpZF07XG4gICAgZm9yICh2YXIgaSBpbiBzY2hlZHVsZXMpIHJldHVybjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIGRlbGV0ZSBub2RlLl9fdHJhbnNpdGlvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHtTVEFSVElORywgRU5ESU5HLCBFTkRFRH0gZnJvbSBcIi4vdHJhbnNpdGlvbi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihub2RlLCBuYW1lKSB7XG4gIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbixcbiAgICAgIHNjaGVkdWxlLFxuICAgICAgYWN0aXZlLFxuICAgICAgZW1wdHkgPSB0cnVlLFxuICAgICAgaTtcblxuICBpZiAoIXNjaGVkdWxlcykgcmV0dXJuO1xuXG4gIG5hbWUgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFtZSArIFwiXCI7XG5cbiAgZm9yIChpIGluIHNjaGVkdWxlcykge1xuICAgIGlmICgoc2NoZWR1bGUgPSBzY2hlZHVsZXNbaV0pLm5hbWUgIT09IG5hbWUpIHsgZW1wdHkgPSBmYWxzZTsgY29udGludWU7IH1cbiAgICBhY3RpdmUgPSBzY2hlZHVsZS5zdGF0ZSA+IFNUQVJUSU5HICYmIHNjaGVkdWxlLnN0YXRlIDwgRU5ESU5HO1xuICAgIHNjaGVkdWxlLnN0YXRlID0gRU5ERUQ7XG4gICAgc2NoZWR1bGUudGltZXIuc3RvcCgpO1xuICAgIHNjaGVkdWxlLm9uLmNhbGwoYWN0aXZlID8gXCJpbnRlcnJ1cHRcIiA6IFwiY2FuY2VsXCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNjaGVkdWxlLmluZGV4LCBzY2hlZHVsZS5ncm91cCk7XG4gICAgZGVsZXRlIHNjaGVkdWxlc1tpXTtcbiAgfVxuXG4gIGlmIChlbXB0eSkgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uO1xufVxuIiwiaW1wb3J0IGludGVycnVwdCBmcm9tIFwiLi4vaW50ZXJydXB0LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcbiAgICBpbnRlcnJ1cHQodGhpcywgbmFtZSk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHtnZXQsIHNldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gdHdlZW5SZW1vdmUoaWQsIG5hbWUpIHtcbiAgdmFyIHR3ZWVuMCwgdHdlZW4xO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSxcbiAgICAgICAgdHdlZW4gPSBzY2hlZHVsZS50d2VlbjtcblxuICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgdHdlZW4gd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKHR3ZWVuICE9PSB0d2VlbjApIHtcbiAgICAgIHR3ZWVuMSA9IHR3ZWVuMCA9IHR3ZWVuO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0d2VlbjEubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGlmICh0d2VlbjFbaV0ubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICAgIHR3ZWVuMSA9IHR3ZWVuMS5zbGljZSgpO1xuICAgICAgICAgIHR3ZWVuMS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzY2hlZHVsZS50d2VlbiA9IHR3ZWVuMTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gdHdlZW5GdW5jdGlvbihpZCwgbmFtZSwgdmFsdWUpIHtcbiAgdmFyIHR3ZWVuMCwgdHdlZW4xO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgIHR3ZWVuID0gc2NoZWR1bGUudHdlZW47XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIHR3ZWVuIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7XG4gICAgICB0d2VlbjEgPSAodHdlZW4wID0gdHdlZW4pLnNsaWNlKCk7XG4gICAgICBmb3IgKHZhciB0ID0ge25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX0sIGkgPSAwLCBuID0gdHdlZW4xLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICB0d2VlbjFbaV0gPSB0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaSA9PT0gbikgdHdlZW4xLnB1c2godCk7XG4gICAgfVxuXG4gICAgc2NoZWR1bGUudHdlZW4gPSB0d2VlbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIG5hbWUgKz0gXCJcIjtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICB2YXIgdHdlZW4gPSBnZXQodGhpcy5ub2RlKCksIGlkKS50d2VlbjtcbiAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR3ZWVuLmxlbmd0aCwgdDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKCh0ID0gdHdlZW5baV0pLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHQudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbCA/IHR3ZWVuUmVtb3ZlIDogdHdlZW5GdW5jdGlvbikoaWQsIG5hbWUsIHZhbHVlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0d2VlblZhbHVlKHRyYW5zaXRpb24sIG5hbWUsIHZhbHVlKSB7XG4gIHZhciBpZCA9IHRyYW5zaXRpb24uX2lkO1xuXG4gIHRyYW5zaXRpb24uZWFjaChmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpO1xuICAgIChzY2hlZHVsZS52YWx1ZSB8fCAoc2NoZWR1bGUudmFsdWUgPSB7fSkpW25hbWVdID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICByZXR1cm4gZ2V0KG5vZGUsIGlkKS52YWx1ZVtuYW1lXTtcbiAgfTtcbn1cbiIsImltcG9ydCB7Y29sb3J9IGZyb20gXCJkMy1jb2xvclwiO1xuaW1wb3J0IHtpbnRlcnBvbGF0ZU51bWJlciwgaW50ZXJwb2xhdGVSZ2IsIGludGVycG9sYXRlU3RyaW5nfSBmcm9tIFwiZDMtaW50ZXJwb2xhdGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oYSwgYikge1xuICB2YXIgYztcbiAgcmV0dXJuICh0eXBlb2YgYiA9PT0gXCJudW1iZXJcIiA/IGludGVycG9sYXRlTnVtYmVyXG4gICAgICA6IGIgaW5zdGFuY2VvZiBjb2xvciA/IGludGVycG9sYXRlUmdiXG4gICAgICA6IChjID0gY29sb3IoYikpID8gKGIgPSBjLCBpbnRlcnBvbGF0ZVJnYilcbiAgICAgIDogaW50ZXJwb2xhdGVTdHJpbmcpKGEsIGIpO1xufVxuIiwiaW1wb3J0IHtpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyBhcyBpbnRlcnBvbGF0ZVRyYW5zZm9ybX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge25hbWVzcGFjZX0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHt0d2VlblZhbHVlfSBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuaW1wb3J0IGludGVycG9sYXRlIGZyb20gXCIuL2ludGVycG9sYXRlLmpzXCI7XG5cbmZ1bmN0aW9uIGF0dHJSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJSZW1vdmVOUyhmdWxsbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyQ29uc3RhbnQobmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkge1xuICB2YXIgc3RyaW5nMDAsXG4gICAgICBzdHJpbmcxID0gdmFsdWUxICsgXCJcIixcbiAgICAgIGludGVycG9sYXRlMDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJDb25zdGFudE5TKGZ1bGxuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGF0dHJGdW5jdGlvbihuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCwgdmFsdWUxID0gdmFsdWUodGhpcyksIHN0cmluZzE7XG4gICAgaWYgKHZhbHVlMSA9PSBudWxsKSByZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCI7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBhdHRyRnVuY3Rpb25OUyhmdWxsbmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEwLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAsIHZhbHVlMSA9IHZhbHVlKHRoaXMpLCBzdHJpbmcxO1xuICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkgcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpO1xuICAgIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7XG4gICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCI7XG4gICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsXG4gICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTBcbiAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSksIGkgPSBmdWxsbmFtZSA9PT0gXCJ0cmFuc2Zvcm1cIiA/IGludGVycG9sYXRlVHJhbnNmb3JtIDogaW50ZXJwb2xhdGU7XG4gIHJldHVybiB0aGlzLmF0dHJUd2VlbihuYW1lLCB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyRnVuY3Rpb25OUyA6IGF0dHJGdW5jdGlvbikoZnVsbG5hbWUsIGksIHR3ZWVuVmFsdWUodGhpcywgXCJhdHRyLlwiICsgbmFtZSwgdmFsdWUpKVxuICAgICAgOiB2YWx1ZSA9PSBudWxsID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0clJlbW92ZU5TIDogYXR0clJlbW92ZSkoZnVsbG5hbWUpXG4gICAgICA6IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJDb25zdGFudE5TIDogYXR0ckNvbnN0YW50KShmdWxsbmFtZSwgaSwgdmFsdWUpKTtcbn1cbiIsImltcG9ydCB7bmFtZXNwYWNlfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5cbmZ1bmN0aW9uIGF0dHJJbnRlcnBvbGF0ZShuYW1lLCBpKSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgaS5jYWxsKHRoaXMsIHQpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0ckludGVycG9sYXRlTlMoZnVsbG5hbWUsIGkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgaS5jYWxsKHRoaXMsIHQpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gYXR0clR3ZWVuTlMoZnVsbG5hbWUsIHZhbHVlKSB7XG4gIHZhciB0MCwgaTA7XG4gIGZ1bmN0aW9uIHR3ZWVuKCkge1xuICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgYXR0ckludGVycG9sYXRlTlMoZnVsbG5hbWUsIGkpO1xuICAgIHJldHVybiB0MDtcbiAgfVxuICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTtcbiAgcmV0dXJuIHR3ZWVuO1xufVxuXG5mdW5jdGlvbiBhdHRyVHdlZW4obmFtZSwgdmFsdWUpIHtcbiAgdmFyIHQwLCBpMDtcbiAgZnVuY3Rpb24gdHdlZW4oKSB7XG4gICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiBhdHRySW50ZXJwb2xhdGUobmFtZSwgaSk7XG4gICAgcmV0dXJuIHQwO1xuICB9XG4gIHR3ZWVuLl92YWx1ZSA9IHZhbHVlO1xuICByZXR1cm4gdHdlZW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gIHZhciBrZXkgPSBcImF0dHIuXCIgKyBuYW1lO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlO1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTtcbiAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCAoZnVsbG5hbWUubG9jYWwgPyBhdHRyVHdlZW5OUyA6IGF0dHJUd2VlbikoZnVsbG5hbWUsIHZhbHVlKSk7XG59XG4iLCJpbXBvcnQge2dldCwgaW5pdH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZnVuY3Rpb24gZGVsYXlGdW5jdGlvbihpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIGluaXQodGhpcywgaWQpLmRlbGF5ID0gK3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGRlbGF5Q29uc3RhbnQoaWQsIHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9ICt2YWx1ZSwgZnVuY3Rpb24oKSB7XG4gICAgaW5pdCh0aGlzLCBpZCkuZGVsYXkgPSB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gZGVsYXlGdW5jdGlvblxuICAgICAgICAgIDogZGVsYXlDb25zdGFudCkoaWQsIHZhbHVlKSlcbiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZGVsYXk7XG59XG4iLCJpbXBvcnQge2dldCwgc2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBkdXJhdGlvbkZ1bmN0aW9uKGlkLCB2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgc2V0KHRoaXMsIGlkKS5kdXJhdGlvbiA9ICt2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkdXJhdGlvbkNvbnN0YW50KGlkLCB2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPSArdmFsdWUsIGZ1bmN0aW9uKCkge1xuICAgIHNldCh0aGlzLCBpZCkuZHVyYXRpb24gPSB2YWx1ZTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGlkID0gdGhpcy5faWQ7XG5cbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gZHVyYXRpb25GdW5jdGlvblxuICAgICAgICAgIDogZHVyYXRpb25Db25zdGFudCkoaWQsIHZhbHVlKSlcbiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZHVyYXRpb247XG59XG4iLCJpbXBvcnQge2dldCwgc2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgc2V0KHRoaXMsIGlkKS5lYXNlID0gdmFsdWU7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoXG4gICAgICA/IHRoaXMuZWFjaChlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSlcbiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZWFzZTtcbn1cbiIsImltcG9ydCB7c2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5mdW5jdGlvbiBlYXNlVmFyeWluZyhpZCwgdmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAodHlwZW9mIHYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICAgIHNldCh0aGlzLCBpZCkuZWFzZSA9IHY7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yO1xuICByZXR1cm4gdGhpcy5lYWNoKGVhc2VWYXJ5aW5nKHRoaXMuX2lkLCB2YWx1ZSkpO1xufVxuIiwiaW1wb3J0IHttYXRjaGVyfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG1hdGNoKSB7XG4gIGlmICh0eXBlb2YgbWF0Y2ggIT09IFwiZnVuY3Rpb25cIikgbWF0Y2ggPSBtYXRjaGVyKG1hdGNoKTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gW10sIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgbWF0Y2guY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpIHtcbiAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCB0aGlzLl9uYW1lLCB0aGlzLl9pZCk7XG59XG4iLCJpbXBvcnQge1RyYW5zaXRpb259IGZyb20gXCIuL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHRyYW5zaXRpb24pIHtcbiAgaWYgKHRyYW5zaXRpb24uX2lkICE9PSB0aGlzLl9pZCkgdGhyb3cgbmV3IEVycm9yO1xuXG4gIGZvciAodmFyIGdyb3VwczAgPSB0aGlzLl9ncm91cHMsIGdyb3VwczEgPSB0cmFuc2l0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0sIGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmIChub2RlID0gZ3JvdXAwW2ldIHx8IGdyb3VwMVtpXSkge1xuICAgICAgICBtZXJnZVtpXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICg7IGogPCBtMDsgKytqKSB7XG4gICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTtcbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihtZXJnZXMsIHRoaXMuX3BhcmVudHMsIHRoaXMuX25hbWUsIHRoaXMuX2lkKTtcbn1cbiIsImltcG9ydCB7Z2V0LCBzZXQsIGluaXR9IGZyb20gXCIuL3NjaGVkdWxlLmpzXCI7XG5cbmZ1bmN0aW9uIHN0YXJ0KG5hbWUpIHtcbiAgcmV0dXJuIChuYW1lICsgXCJcIikudHJpbSgpLnNwbGl0KC9efFxccysvKS5ldmVyeShmdW5jdGlvbih0KSB7XG4gICAgdmFyIGkgPSB0LmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChpID49IDApIHQgPSB0LnNsaWNlKDAsIGkpO1xuICAgIHJldHVybiAhdCB8fCB0ID09PSBcInN0YXJ0XCI7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBvbkZ1bmN0aW9uKGlkLCBuYW1lLCBsaXN0ZW5lcikge1xuICB2YXIgb24wLCBvbjEsIHNpdCA9IHN0YXJ0KG5hbWUpID8gaW5pdCA6IHNldDtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2hlZHVsZSA9IHNpdCh0aGlzLCBpZCksXG4gICAgICAgIG9uID0gc2NoZWR1bGUub247XG5cbiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSxcbiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuXG4gICAgaWYgKG9uICE9PSBvbjApIChvbjEgPSAob24wID0gb24pLmNvcHkoKSkub24obmFtZSwgbGlzdGVuZXIpO1xuXG4gICAgc2NoZWR1bGUub24gPSBvbjE7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUsIGxpc3RlbmVyKSB7XG4gIHZhciBpZCA9IHRoaXMuX2lkO1xuXG4gIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMlxuICAgICAgPyBnZXQodGhpcy5ub2RlKCksIGlkKS5vbi5vbihuYW1lKVxuICAgICAgOiB0aGlzLmVhY2gob25GdW5jdGlvbihpZCwgbmFtZSwgbGlzdGVuZXIpKTtcbn1cbiIsImZ1bmN0aW9uIHJlbW92ZUZ1bmN0aW9uKGlkKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICAgIGZvciAodmFyIGkgaW4gdGhpcy5fX3RyYW5zaXRpb24pIGlmICgraSAhPT0gaWQpIHJldHVybjtcbiAgICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5vbihcImVuZC5yZW1vdmVcIiwgcmVtb3ZlRnVuY3Rpb24odGhpcy5faWQpKTtcbn1cbiIsImltcG9ydCB7c2VsZWN0b3J9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSwge2dldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIHZhciBuYW1lID0gdGhpcy5fbmFtZSxcbiAgICAgIGlkID0gdGhpcy5faWQ7XG5cbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3Ioc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBzdWJub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkge1xuICAgICAgICBpZiAoXCJfX2RhdGFfX1wiIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fO1xuICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7XG4gICAgICAgIHNjaGVkdWxlKHN1Ymdyb3VwW2ldLCBuYW1lLCBpZCwgaSwgc3ViZ3JvdXAsIGdldChub2RlLCBpZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTtcbn1cbiIsImltcG9ydCB7c2VsZWN0b3JBbGx9IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSBcIi4vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSwge2dldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oc2VsZWN0KSB7XG4gIHZhciBuYW1lID0gdGhpcy5fbmFtZSxcbiAgICAgIGlkID0gdGhpcy5faWQ7XG5cbiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09IFwiZnVuY3Rpb25cIikgc2VsZWN0ID0gc2VsZWN0b3JBbGwoc2VsZWN0KTtcblxuICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBbXSwgcGFyZW50cyA9IFtdLCBqID0gMDsgaiA8IG07ICsraikge1xuICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICBmb3IgKHZhciBjaGlsZHJlbiA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSwgY2hpbGQsIGluaGVyaXQgPSBnZXQobm9kZSwgaWQpLCBrID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgayA8IGw7ICsraykge1xuICAgICAgICAgIGlmIChjaGlsZCA9IGNoaWxkcmVuW2tdKSB7XG4gICAgICAgICAgICBzY2hlZHVsZShjaGlsZCwgbmFtZSwgaWQsIGssIGNoaWxkcmVuLCBpbmhlcml0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3ViZ3JvdXBzLnB1c2goY2hpbGRyZW4pO1xuICAgICAgICBwYXJlbnRzLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgcGFyZW50cywgbmFtZSwgaWQpO1xufVxuIiwiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcblxudmFyIFNlbGVjdGlvbiA9IHNlbGVjdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3I7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9ncm91cHMsIHRoaXMuX3BhcmVudHMpO1xufVxuIiwiaW1wb3J0IHtpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyBhcyBpbnRlcnBvbGF0ZVRyYW5zZm9ybX0gZnJvbSBcImQzLWludGVycG9sYXRlXCI7XG5pbXBvcnQge3N0eWxlfSBmcm9tIFwiZDMtc2VsZWN0aW9uXCI7XG5pbXBvcnQge3NldH0gZnJvbSBcIi4vc2NoZWR1bGUuanNcIjtcbmltcG9ydCB7dHdlZW5WYWx1ZX0gZnJvbSBcIi4vdHdlZW4uanNcIjtcbmltcG9ydCBpbnRlcnBvbGF0ZSBmcm9tIFwiLi9pbnRlcnBvbGF0ZS5qc1wiO1xuXG5mdW5jdGlvbiBzdHlsZU51bGwobmFtZSwgaW50ZXJwb2xhdGUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHN0eWxlKHRoaXMsIG5hbWUpLFxuICAgICAgICBzdHJpbmcxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlKHRoaXMsIG5hbWUpKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgc3RyaW5nMTAgPSBzdHJpbmcxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVSZW1vdmUobmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVDb25zdGFudChuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7XG4gIHZhciBzdHJpbmcwMCxcbiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyBcIlwiLFxuICAgICAgaW50ZXJwb2xhdGUwO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHN0cmluZzAgPSBzdHlsZSh0aGlzLCBuYW1lKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVGdW5jdGlvbihuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHtcbiAgdmFyIHN0cmluZzAwLFxuICAgICAgc3RyaW5nMTAsXG4gICAgICBpbnRlcnBvbGF0ZTA7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RyaW5nMCA9IHN0eWxlKHRoaXMsIG5hbWUpLFxuICAgICAgICB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSxcbiAgICAgICAgc3RyaW5nMSA9IHZhbHVlMSArIFwiXCI7XG4gICAgaWYgKHZhbHVlMSA9PSBudWxsKSBzdHJpbmcxID0gdmFsdWUxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlKHRoaXMsIG5hbWUpKTtcbiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGxcbiAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMFxuICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0eWxlTWF5YmVSZW1vdmUoaWQsIG5hbWUpIHtcbiAgdmFyIG9uMCwgb24xLCBsaXN0ZW5lcjAsIGtleSA9IFwic3R5bGUuXCIgKyBuYW1lLCBldmVudCA9IFwiZW5kLlwiICsga2V5LCByZW1vdmU7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLFxuICAgICAgICBvbiA9IHNjaGVkdWxlLm9uLFxuICAgICAgICBsaXN0ZW5lciA9IHNjaGVkdWxlLnZhbHVlW2tleV0gPT0gbnVsbCA/IHJlbW92ZSB8fCAocmVtb3ZlID0gc3R5bGVSZW1vdmUobmFtZSkpIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhXG4gICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLlxuICAgIGlmIChvbiAhPT0gb24wIHx8IGxpc3RlbmVyMCAhPT0gbGlzdGVuZXIpIChvbjEgPSAob24wID0gb24pLmNvcHkoKSkub24oZXZlbnQsIGxpc3RlbmVyMCA9IGxpc3RlbmVyKTtcblxuICAgIHNjaGVkdWxlLm9uID0gb24xO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgdmFyIGkgPSAobmFtZSArPSBcIlwiKSA9PT0gXCJ0cmFuc2Zvcm1cIiA/IGludGVycG9sYXRlVHJhbnNmb3JtIDogaW50ZXJwb2xhdGU7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsID8gdGhpc1xuICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVOdWxsKG5hbWUsIGkpKVxuICAgICAgLm9uKFwiZW5kLnN0eWxlLlwiICsgbmFtZSwgc3R5bGVSZW1vdmUobmFtZSkpXG4gICAgOiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IHRoaXNcbiAgICAgIC5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlRnVuY3Rpb24obmFtZSwgaSwgdHdlZW5WYWx1ZSh0aGlzLCBcInN0eWxlLlwiICsgbmFtZSwgdmFsdWUpKSlcbiAgICAgIC5lYWNoKHN0eWxlTWF5YmVSZW1vdmUodGhpcy5faWQsIG5hbWUpKVxuICAgIDogdGhpc1xuICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVDb25zdGFudChuYW1lLCBpLCB2YWx1ZSksIHByaW9yaXR5KVxuICAgICAgLm9uKFwiZW5kLnN0eWxlLlwiICsgbmFtZSwgbnVsbCk7XG59XG4iLCJmdW5jdGlvbiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KSB7XG4gIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCBpLmNhbGwodGhpcywgdCksIHByaW9yaXR5KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3R5bGVUd2VlbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgdmFyIHQsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0ID0gKGkwID0gaSkgJiYgc3R5bGVJbnRlcnBvbGF0ZShuYW1lLCBpLCBwcmlvcml0eSk7XG4gICAgcmV0dXJuIHQ7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gIHZhciBrZXkgPSBcInN0eWxlLlwiICsgKG5hbWUgKz0gXCJcIik7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBFcnJvcjtcbiAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBzdHlsZVR3ZWVuKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gXCJcIiA6IHByaW9yaXR5KSk7XG59XG4iLCJpbXBvcnQge3R3ZWVuVmFsdWV9IGZyb20gXCIuL3R3ZWVuLmpzXCI7XG5cbmZ1bmN0aW9uIHRleHRDb25zdGFudCh2YWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0ZXh0RnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZTEgPSB2YWx1ZSh0aGlzKTtcbiAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWUxID09IG51bGwgPyBcIlwiIDogdmFsdWUxO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdGhpcy50d2VlbihcInRleHRcIiwgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gdGV4dEZ1bmN0aW9uKHR3ZWVuVmFsdWUodGhpcywgXCJ0ZXh0XCIsIHZhbHVlKSlcbiAgICAgIDogdGV4dENvbnN0YW50KHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKyBcIlwiKSk7XG59XG4iLCJmdW5jdGlvbiB0ZXh0SW50ZXJwb2xhdGUoaSkge1xuICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgIHRoaXMudGV4dENvbnRlbnQgPSBpLmNhbGwodGhpcywgdCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRleHRUd2Vlbih2YWx1ZSkge1xuICB2YXIgdDAsIGkwO1xuICBmdW5jdGlvbiB0d2VlbigpIHtcbiAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIHRleHRJbnRlcnBvbGF0ZShpKTtcbiAgICByZXR1cm4gdDA7XG4gIH1cbiAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7XG4gIHJldHVybiB0d2Vlbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24odmFsdWUpIHtcbiAgdmFyIGtleSA9IFwidGV4dFwiO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlO1xuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgRXJyb3I7XG4gIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgdGV4dFR3ZWVuKHZhbHVlKSk7XG59XG4iLCJpbXBvcnQge1RyYW5zaXRpb24sIG5ld0lkfSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHNjaGVkdWxlLCB7Z2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLFxuICAgICAgaWQwID0gdGhpcy5faWQsXG4gICAgICBpZDEgPSBuZXdJZCgpO1xuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHZhciBpbmhlcml0ID0gZ2V0KG5vZGUsIGlkMCk7XG4gICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkMSwgaSwgZ3JvdXAsIHtcbiAgICAgICAgICB0aW1lOiBpbmhlcml0LnRpbWUgKyBpbmhlcml0LmRlbGF5ICsgaW5oZXJpdC5kdXJhdGlvbixcbiAgICAgICAgICBkZWxheTogMCxcbiAgICAgICAgICBkdXJhdGlvbjogaW5oZXJpdC5kdXJhdGlvbixcbiAgICAgICAgICBlYXNlOiBpbmhlcml0LmVhc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKGdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQxKTtcbn1cbiIsImltcG9ydCB7c2V0fSBmcm9tIFwiLi9zY2hlZHVsZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcbiAgdmFyIG9uMCwgb24xLCB0aGF0ID0gdGhpcywgaWQgPSB0aGF0Ll9pZCwgc2l6ZSA9IHRoYXQuc2l6ZSgpO1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIGNhbmNlbCA9IHt2YWx1ZTogcmVqZWN0fSxcbiAgICAgICAgZW5kID0ge3ZhbHVlOiBmdW5jdGlvbigpIHsgaWYgKC0tc2l6ZSA9PT0gMCkgcmVzb2x2ZSgpOyB9fTtcblxuICAgIHRoYXQuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzY2hlZHVsZSA9IHNldCh0aGlzLCBpZCksXG4gICAgICAgICAgb24gPSBzY2hlZHVsZS5vbjtcblxuICAgICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsXG4gICAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSFcbiAgICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS5cbiAgICAgIGlmIChvbiAhPT0gb24wKSB7XG4gICAgICAgIG9uMSA9IChvbjAgPSBvbikuY29weSgpO1xuICAgICAgICBvbjEuXy5jYW5jZWwucHVzaChjYW5jZWwpO1xuICAgICAgICBvbjEuXy5pbnRlcnJ1cHQucHVzaChjYW5jZWwpO1xuICAgICAgICBvbjEuXy5lbmQucHVzaChlbmQpO1xuICAgICAgfVxuXG4gICAgICBzY2hlZHVsZS5vbiA9IG9uMTtcbiAgICB9KTtcblxuICAgIC8vIFRoZSBzZWxlY3Rpb24gd2FzIGVtcHR5LCByZXNvbHZlIGVuZCBpbW1lZGlhdGVseVxuICAgIGlmIChzaXplID09PSAwKSByZXNvbHZlKCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHtzZWxlY3Rpb259IGZyb20gXCJkMy1zZWxlY3Rpb25cIjtcbmltcG9ydCB0cmFuc2l0aW9uX2F0dHIgZnJvbSBcIi4vYXR0ci5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fYXR0clR3ZWVuIGZyb20gXCIuL2F0dHJUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZGVsYXkgZnJvbSBcIi4vZGVsYXkuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2R1cmF0aW9uIGZyb20gXCIuL2R1cmF0aW9uLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9lYXNlIGZyb20gXCIuL2Vhc2UuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX2Vhc2VWYXJ5aW5nIGZyb20gXCIuL2Vhc2VWYXJ5aW5nLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9maWx0ZXIgZnJvbSBcIi4vZmlsdGVyLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9tZXJnZSBmcm9tIFwiLi9tZXJnZS5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fb24gZnJvbSBcIi4vb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3JlbW92ZSBmcm9tIFwiLi9yZW1vdmUuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdCBmcm9tIFwiLi9zZWxlY3QuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdEFsbCBmcm9tIFwiLi9zZWxlY3RBbGwuanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3NlbGVjdGlvbiBmcm9tIFwiLi9zZWxlY3Rpb24uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3N0eWxlIGZyb20gXCIuL3N0eWxlLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl9zdHlsZVR3ZWVuIGZyb20gXCIuL3N0eWxlVHdlZW4uanNcIjtcbmltcG9ydCB0cmFuc2l0aW9uX3RleHQgZnJvbSBcIi4vdGV4dC5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdGV4dFR3ZWVuIGZyb20gXCIuL3RleHRUd2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fdHJhbnNpdGlvbiBmcm9tIFwiLi90cmFuc2l0aW9uLmpzXCI7XG5pbXBvcnQgdHJhbnNpdGlvbl90d2VlbiBmcm9tIFwiLi90d2Vlbi5qc1wiO1xuaW1wb3J0IHRyYW5zaXRpb25fZW5kIGZyb20gXCIuL2VuZC5qc1wiO1xuXG52YXIgaWQgPSAwO1xuXG5leHBvcnQgZnVuY3Rpb24gVHJhbnNpdGlvbihncm91cHMsIHBhcmVudHMsIG5hbWUsIGlkKSB7XG4gIHRoaXMuX2dyb3VwcyA9IGdyb3VwcztcbiAgdGhpcy5fcGFyZW50cyA9IHBhcmVudHM7XG4gIHRoaXMuX25hbWUgPSBuYW1lO1xuICB0aGlzLl9pZCA9IGlkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmFuc2l0aW9uKG5hbWUpIHtcbiAgcmV0dXJuIHNlbGVjdGlvbigpLnRyYW5zaXRpb24obmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZXdJZCgpIHtcbiAgcmV0dXJuICsraWQ7XG59XG5cbnZhciBzZWxlY3Rpb25fcHJvdG90eXBlID0gc2VsZWN0aW9uLnByb3RvdHlwZTtcblxuVHJhbnNpdGlvbi5wcm90b3R5cGUgPSB0cmFuc2l0aW9uLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRyYW5zaXRpb24sXG4gIHNlbGVjdDogdHJhbnNpdGlvbl9zZWxlY3QsXG4gIHNlbGVjdEFsbDogdHJhbnNpdGlvbl9zZWxlY3RBbGwsXG4gIHNlbGVjdENoaWxkOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNlbGVjdENoaWxkLFxuICBzZWxlY3RDaGlsZHJlbjogc2VsZWN0aW9uX3Byb3RvdHlwZS5zZWxlY3RDaGlsZHJlbixcbiAgZmlsdGVyOiB0cmFuc2l0aW9uX2ZpbHRlcixcbiAgbWVyZ2U6IHRyYW5zaXRpb25fbWVyZ2UsXG4gIHNlbGVjdGlvbjogdHJhbnNpdGlvbl9zZWxlY3Rpb24sXG4gIHRyYW5zaXRpb246IHRyYW5zaXRpb25fdHJhbnNpdGlvbixcbiAgY2FsbDogc2VsZWN0aW9uX3Byb3RvdHlwZS5jYWxsLFxuICBub2Rlczogc2VsZWN0aW9uX3Byb3RvdHlwZS5ub2RlcyxcbiAgbm9kZTogc2VsZWN0aW9uX3Byb3RvdHlwZS5ub2RlLFxuICBzaXplOiBzZWxlY3Rpb25fcHJvdG90eXBlLnNpemUsXG4gIGVtcHR5OiBzZWxlY3Rpb25fcHJvdG90eXBlLmVtcHR5LFxuICBlYWNoOiBzZWxlY3Rpb25fcHJvdG90eXBlLmVhY2gsXG4gIG9uOiB0cmFuc2l0aW9uX29uLFxuICBhdHRyOiB0cmFuc2l0aW9uX2F0dHIsXG4gIGF0dHJUd2VlbjogdHJhbnNpdGlvbl9hdHRyVHdlZW4sXG4gIHN0eWxlOiB0cmFuc2l0aW9uX3N0eWxlLFxuICBzdHlsZVR3ZWVuOiB0cmFuc2l0aW9uX3N0eWxlVHdlZW4sXG4gIHRleHQ6IHRyYW5zaXRpb25fdGV4dCxcbiAgdGV4dFR3ZWVuOiB0cmFuc2l0aW9uX3RleHRUd2VlbixcbiAgcmVtb3ZlOiB0cmFuc2l0aW9uX3JlbW92ZSxcbiAgdHdlZW46IHRyYW5zaXRpb25fdHdlZW4sXG4gIGRlbGF5OiB0cmFuc2l0aW9uX2RlbGF5LFxuICBkdXJhdGlvbjogdHJhbnNpdGlvbl9kdXJhdGlvbixcbiAgZWFzZTogdHJhbnNpdGlvbl9lYXNlLFxuICBlYXNlVmFyeWluZzogdHJhbnNpdGlvbl9lYXNlVmFyeWluZyxcbiAgZW5kOiB0cmFuc2l0aW9uX2VuZCxcbiAgW1N5bWJvbC5pdGVyYXRvcl06IHNlbGVjdGlvbl9wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXVxufTtcbiIsImV4cG9ydCBmdW5jdGlvbiBjdWJpY0luKHQpIHtcbiAgcmV0dXJuIHQgKiB0ICogdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN1YmljT3V0KHQpIHtcbiAgcmV0dXJuIC0tdCAqIHQgKiB0ICsgMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGN1YmljSW5PdXQodCkge1xuICByZXR1cm4gKCh0ICo9IDIpIDw9IDEgPyB0ICogdCAqIHQgOiAodCAtPSAyKSAqIHQgKiB0ICsgMikgLyAyO1xufVxuIiwiaW1wb3J0IHtUcmFuc2l0aW9uLCBuZXdJZH0gZnJvbSBcIi4uL3RyYW5zaXRpb24vaW5kZXguanNcIjtcbmltcG9ydCBzY2hlZHVsZSBmcm9tIFwiLi4vdHJhbnNpdGlvbi9zY2hlZHVsZS5qc1wiO1xuaW1wb3J0IHtlYXNlQ3ViaWNJbk91dH0gZnJvbSBcImQzLWVhc2VcIjtcbmltcG9ydCB7bm93fSBmcm9tIFwiZDMtdGltZXJcIjtcblxudmFyIGRlZmF1bHRUaW1pbmcgPSB7XG4gIHRpbWU6IG51bGwsIC8vIFNldCBvbiB1c2UuXG4gIGRlbGF5OiAwLFxuICBkdXJhdGlvbjogMjUwLFxuICBlYXNlOiBlYXNlQ3ViaWNJbk91dFxufTtcblxuZnVuY3Rpb24gaW5oZXJpdChub2RlLCBpZCkge1xuICB2YXIgdGltaW5nO1xuICB3aGlsZSAoISh0aW1pbmcgPSBub2RlLl9fdHJhbnNpdGlvbikgfHwgISh0aW1pbmcgPSB0aW1pbmdbaWRdKSkge1xuICAgIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHRyYW5zaXRpb24gJHtpZH0gbm90IGZvdW5kYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aW1pbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKG5hbWUpIHtcbiAgdmFyIGlkLFxuICAgICAgdGltaW5nO1xuXG4gIGlmIChuYW1lIGluc3RhbmNlb2YgVHJhbnNpdGlvbikge1xuICAgIGlkID0gbmFtZS5faWQsIG5hbWUgPSBuYW1lLl9uYW1lO1xuICB9IGVsc2Uge1xuICAgIGlkID0gbmV3SWQoKSwgKHRpbWluZyA9IGRlZmF1bHRUaW1pbmcpLnRpbWUgPSBub3coKSwgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgXCJcIjtcbiAgfVxuXG4gIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkLCBpLCBncm91cCwgdGltaW5nIHx8IGluaGVyaXQobm9kZSwgaWQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IFRyYW5zaXRpb24oZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZCk7XG59XG4iLCJpbXBvcnQge3NlbGVjdGlvbn0gZnJvbSBcImQzLXNlbGVjdGlvblwiO1xuaW1wb3J0IHNlbGVjdGlvbl9pbnRlcnJ1cHQgZnJvbSBcIi4vaW50ZXJydXB0LmpzXCI7XG5pbXBvcnQgc2VsZWN0aW9uX3RyYW5zaXRpb24gZnJvbSBcIi4vdHJhbnNpdGlvbi5qc1wiO1xuXG5zZWxlY3Rpb24ucHJvdG90eXBlLmludGVycnVwdCA9IHNlbGVjdGlvbl9pbnRlcnJ1cHQ7XG5zZWxlY3Rpb24ucHJvdG90eXBlLnRyYW5zaXRpb24gPSBzZWxlY3Rpb25fdHJhbnNpdGlvbjtcbiIsImV4cG9ydCBmdW5jdGlvbiBUcmFuc2Zvcm0oaywgeCwgeSkge1xuICB0aGlzLmsgPSBrO1xuICB0aGlzLnggPSB4O1xuICB0aGlzLnkgPSB5O1xufVxuXG5UcmFuc2Zvcm0ucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogVHJhbnNmb3JtLFxuICBzY2FsZTogZnVuY3Rpb24oaykge1xuICAgIHJldHVybiBrID09PSAxID8gdGhpcyA6IG5ldyBUcmFuc2Zvcm0odGhpcy5rICogaywgdGhpcy54LCB0aGlzLnkpO1xuICB9LFxuICB0cmFuc2xhdGU6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICByZXR1cm4geCA9PT0gMCAmIHkgPT09IDAgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmssIHRoaXMueCArIHRoaXMuayAqIHgsIHRoaXMueSArIHRoaXMuayAqIHkpO1xuICB9LFxuICBhcHBseTogZnVuY3Rpb24ocG9pbnQpIHtcbiAgICByZXR1cm4gW3BvaW50WzBdICogdGhpcy5rICsgdGhpcy54LCBwb2ludFsxXSAqIHRoaXMuayArIHRoaXMueV07XG4gIH0sXG4gIGFwcGx5WDogZnVuY3Rpb24oeCkge1xuICAgIHJldHVybiB4ICogdGhpcy5rICsgdGhpcy54O1xuICB9LFxuICBhcHBseVk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4geSAqIHRoaXMuayArIHRoaXMueTtcbiAgfSxcbiAgaW52ZXJ0OiBmdW5jdGlvbihsb2NhdGlvbikge1xuICAgIHJldHVybiBbKGxvY2F0aW9uWzBdIC0gdGhpcy54KSAvIHRoaXMuaywgKGxvY2F0aW9uWzFdIC0gdGhpcy55KSAvIHRoaXMua107XG4gIH0sXG4gIGludmVydFg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4gKHggLSB0aGlzLngpIC8gdGhpcy5rO1xuICB9LFxuICBpbnZlcnRZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuICh5IC0gdGhpcy55KSAvIHRoaXMuaztcbiAgfSxcbiAgcmVzY2FsZVg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4geC5jb3B5KCkuZG9tYWluKHgucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRYLCB0aGlzKS5tYXAoeC5pbnZlcnQsIHgpKTtcbiAgfSxcbiAgcmVzY2FsZVk6IGZ1bmN0aW9uKHkpIHtcbiAgICByZXR1cm4geS5jb3B5KCkuZG9tYWluKHkucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRZLCB0aGlzKS5tYXAoeS5pbnZlcnQsIHkpKTtcbiAgfSxcbiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcInRyYW5zbGF0ZShcIiArIHRoaXMueCArIFwiLFwiICsgdGhpcy55ICsgXCIpIHNjYWxlKFwiICsgdGhpcy5rICsgXCIpXCI7XG4gIH1cbn07XG5cbmV4cG9ydCB2YXIgaWRlbnRpdHkgPSBuZXcgVHJhbnNmb3JtKDEsIDAsIDApO1xuXG50cmFuc2Zvcm0ucHJvdG90eXBlID0gVHJhbnNmb3JtLnByb3RvdHlwZTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHJhbnNmb3JtKG5vZGUpIHtcbiAgd2hpbGUgKCFub2RlLl9fem9vbSkgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHJldHVybiBpZGVudGl0eTtcbiAgcmV0dXJuIG5vZGUuX196b29tO1xufVxuIiwiXG4vKlxuICBIVERNYXRoIFN0YXRpYyBDbGFzcyAtIE5vdCBpbnRlbmRlZCBmb3IgaW5zdGFudGlhdGlvbiFcblxuICBNb2RlbCBwYXJhbWV0ZXJzOlxuICAgIGsgPSBkaXNjb3VudCBmYWN0b3IgKDAsIEluZmluaXR5KVxuXG4gIEJlaGF2aW9yYWwgdmFyaWFibGVzOlxuICAgIEEgPSBhbW91bnRcbiAgICBEID0gZGVsYXlcbiAgICBWID0gc3ViamVjdGl2ZSB2YWx1ZVxuXG4gIEVxdWF0aW9uczpcbiAgICBWID0gQSAvICgxICsga0QpXG4gICAgayA9IChBIC0gVikgLyAoVkQpXG4qL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSFRETWF0aCB7XG4gIHN0YXRpYyBrID0ge1xuICAgIERFRkFVTFQ6IDAuMDUsXG4gICAgTUlOOiAwLFxuICAgIE1BWDogMTAwLFxuICAgIFNURVA6IDAuMDAxLFxuICAgIEpVTVA6IDAuMDEsXG4gIH07XG5cbiAgc3RhdGljIGFkazJ2KGEsIGQsIGspIHtcbiAgICByZXR1cm4gYSAvICgxICsgayAqIGQpO1xuICB9XG5cbiAgc3RhdGljIGFkdjJrKGEsIGQsIHYpIHtcbiAgICByZXR1cm4gKGEgLSB2KSAvICh2ICogZCk7XG4gIH1cbn1cbiIsIlxuLy8gSW50ZXJuYWwgZGVwZW5kZW5jaWVzXG5pbXBvcnQgSFRETWF0aCBmcm9tICcuL2h0ZC1tYXRoJztcblxuZXhwb3J0IGRlZmF1bHQgSFRETWF0aDtcbiIsIi8qIGVzbGludCBuby1yZXN0cmljdGVkLWdsb2JhbHM6IFtcIm9mZlwiLCBcInNlbGZcIl0gKi9cblxuLy8gTmVlZGVkIGZvciBkMyBpbiBXZWJXb3JrZXIhXG5pbXBvcnQgJ3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZSc7XG5cbmltcG9ydCAqIGFzIEJheWVzRGlzdHJpYnV0aW9ucyBmcm9tICdiYXllcy5qcy9kaXN0cmlidXRpb25zJztcbmltcG9ydCAqIGFzIEJheWVzTWNtYyBmcm9tICdiYXllcy5qcy9tY21jJztcbmltcG9ydCAqIGFzIGQzIGZyb20gJ2QzJztcbmltcG9ydCBIVERNYXRoIGZyb20gJ0BkZWNpZGFibGVzL2Rpc2NvdW50YWJsZS1tYXRoJztcblxuc2VsZi5vbm1lc3NhZ2UgPSAoZXZlbnQpID0+IHtcbiAgY29uc3QgcGFyYW1zID0ge1xuICAgIGs6IHt0eXBlOiAncmVhbCcsIGxvd2VyOiBIVERNYXRoLmsuTUlOLCB1cHBlcjogSFRETWF0aC5rLk1BWH0sXG4gICAgbHVjZToge3R5cGU6ICdyZWFsJywgbG93ZXI6IDAsIHVwcGVyOiAxMDB9LFxuICB9O1xuXG4gIGNvbnN0IGxvZ1Bvc3QgPSAoc3RhdGUsIGRhdGEpID0+IHtcbiAgICBsZXQgbHAgPSAwO1xuXG4gICAgLy8gUHJpb3JzXG4gICAgY29uc3Qga01lYW4gPSAyO1xuICAgIGNvbnN0IGtTaGFwZSA9IDM7XG4gICAgbHAgKz0gQmF5ZXNEaXN0cmlidXRpb25zLmdhbW1hKFxuICAgICAgc3RhdGUuayxcbiAgICAgIGtTaGFwZSxcbiAgICAgIGtTaGFwZSAvIGtNZWFuLFxuICAgICk7XG4gICAgLy8gbHAgKz0gQmF5ZXNEaXN0cmlidXRpb25zLnVuaWYoc3RhdGUuaywgMCwgMTAwKTtcblxuICAgIGNvbnN0IGx1Y2VNZWFuID0gMjtcbiAgICBjb25zdCBsdWNlU2hhcGUgPSAzO1xuICAgIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy5nYW1tYShcbiAgICAgIHN0YXRlLmx1Y2UsXG4gICAgICBsdWNlU2hhcGUsXG4gICAgICBsdWNlU2hhcGUgLyBsdWNlTWVhbixcbiAgICApO1xuICAgIC8vIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy51bmlmKHN0YXRlLmx1Y2UsIDAsIDEwMCk7XG5cbiAgICAvLyBMaWtlbGlob29kXG4gICAgZGF0YS5mb3JFYWNoKChjaG9pY2UpID0+IHtcbiAgICAgIC8vIFZhbHVlc1xuICAgICAgY29uc3QgdnMgPSBIVERNYXRoLmFkazJ2KGNob2ljZS5hcywgY2hvaWNlLmRzLCBzdGF0ZS5rKTtcbiAgICAgIGNvbnN0IHZsID0gSFRETWF0aC5hZGsydihjaG9pY2UuYWwsIGNob2ljZS5kbCwgc3RhdGUuayk7XG5cbiAgICAgIC8vIENob2ljZSBvZiBzb29uZXIgb3IgbGF0ZXIgaXMgc2FtcGxlZCBmcm9tIGEgQmVybm91bGxpIGRpc3RyaWJ1dGlvblxuICAgICAgLy8gTHVjZSBjaG9pY2UgcnVsZSBpcyB1c2VkIHRvIGNvbXB1dGUgcHJvYmFiaWxpdHkgb2Ygd2FpdGluZyEgKDAgPSBzb29uZXIsIDEgPSBsYXRlcilcbiAgICAgIGNvbnN0IGJpbnZhbCA9IDEgLyAoMSArIE1hdGguZXhwKHN0YXRlLmx1Y2UgKiAodnMgLSB2bCkpKTtcblxuICAgICAgLy8gQWN0dWFsIHJlc3BvbnNlXG4gICAgICBjb25zdCByZXNwb25zZSA9IChjaG9pY2UucmVzcG9uc2UgPT09ICdmaXJzdCcpID8gMCA6IDE7XG5cbiAgICAgIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy5iZXJuKHJlc3BvbnNlLCBiaW52YWwpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxwO1xuICB9O1xuXG4gIC8vIEluaXRpYWxpemluZyB0aGUgc2FtcGxlclxuICBjb25zdCBzYW1wbGVyID0gbmV3IEJheWVzTWNtYy5BbXdnU2FtcGxlcihwYXJhbXMsIGxvZ1Bvc3QsIGV2ZW50LmRhdGEpO1xuICAvLyBCdXJuaW5nIHNvbWUgc2FtcGxlcyB0byB0aGUgTUNNQyBnb2RzIGFuZCBzYW1wbGluZyA1MDAwIGRyYXdzXG4gIHNhbXBsZXIuYnVybigxMDAwKTtcbiAgY29uc3Qgc2FtcGxlcyA9IHNhbXBsZXIuc2FtcGxlKDUwMDApO1xuXG4gIC8vIEV4dHJhY3Qgc3VtbWFyeSBzdGF0c1xuICBjb25zdCByZXN1bHRzID0ge1xuICAgIGs6IGQzLm1lZGlhbihzYW1wbGVzLmspLFxuICAgIGx1Y2U6IGQzLm1lZGlhbihzYW1wbGVzLmx1Y2UpLFxuICB9O1xuXG4gIHNlbGYucG9zdE1lc3NhZ2Uoe3Jlc3VsdHM6IHJlc3VsdHMsIHNhbXBsZXM6IHNhbXBsZXN9KTtcbn07XG4iXSwibmFtZXMiOlsicm9vdCIsImZhY3RvcnkiLCJtb2R1bGUiLCJleHBvcnRzIiwibGQiLCJ0aGlzIiwibGdhbW1hIiwieCIsImoiLCJjb2YiLCJzZXIiLCJ4eCIsInkiLCJ0bXAiLCJsb2ciLCJsZmFjdG9yaWFsIiwibiIsIk5hTiIsImxjaG9vc2UiLCJrIiwibGJldGEiLCJhIiwiYiIsIk1hdGgiLCJleHAiLCJhYnMiLCJwb3ciLCJzcXJ0IiwicGkiLCJQSSIsImJldGEiLCJzaGFwZTEiLCJzaGFwZTIiLCJJbmZpbml0eSIsImNhdWNoeSIsImxvY2F0aW9uIiwic2NhbGUiLCJub3JtIiwibWVhbiIsInNkIiwiYml2YXJub3JtIiwiY29yciIsInoiLCJub3JtYWxpemluZ19mYWN0b3IiLCJiaXZhcl9sb2dfZGVucyIsImxhcGxhY2UiLCJkZXhwIiwiZ2FtbWEiLCJzaGFwZSIsInJhdGUiLCJpbnZnYW1tYSIsImxub3JtIiwibWVhbmxvZyIsInNkbG9nIiwicGFyZXRvIiwidCIsImRmIiwid2VpYnVsbCIsInRtcDEiLCJ0bXAyIiwibG9naXMiLCJlIiwiZiIsImRpcmljaGxldCIsImFscGhhIiwic3VtX2FscGhhIiwic3VtX2xnYW1tYV9hbHBoYSIsInN1bV9hbHBoYV9zdWJfMV9sb2dfeCIsImxlbmd0aCIsImkiLCJ1bmlmIiwibWluIiwibWF4IiwiYmVybiIsInByb2IiLCJjYXQiLCJwcm9icyIsImJpbm9tIiwic2l6ZSIsIm5iaW5vbSIsImh5cGVyIiwibSIsInBvaXMiLCJsYW1iZGEiLCJtY21jIiwicnVuaWYiLCJyYW5kb20iLCJydW5pZl9kaXNjcmV0ZSIsImZsb29yIiwicm5vcm0iLCJ1IiwidiIsInEiLCJkZWVwX2Nsb25lIiwic3JjIiwibWl4aW4iLCJkZXN0Iiwic291cmNlIiwiY29weUZ1bmMiLCJuYW1lIiwicyIsImVtcHR5IiwiT2JqZWN0IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJjYWxsIiwibm9kZVR5cGUiLCJjbG9uZU5vZGUiLCJEYXRlIiwiZ2V0VGltZSIsIlJlZ0V4cCIsInIiLCJsIiwiQXJyYXkiLCJwdXNoIiwiY29uc3RydWN0b3IiLCJjbG9uZV9wYXJhbV9kcmF3IiwiaXNBcnJheSIsInhfY29weSIsInNsaWNlIiwiaXNfbnVtYmVyIiwib2JqZWN0IiwiTnVtYmVyIiwiY3JlYXRlX2FycmF5IiwiZGltIiwiaW5pdCIsImFyciIsImFycmF5X2RpbSIsImNvbmNhdCIsImFycmF5X2VxdWFsIiwiYTEiLCJhMiIsIm5lc3RlZF9hcnJheV9hcHBseSIsImZ1biIsInJlc3VsdCIsInNodWZmbGVfYXJyYXkiLCJhcnJheSIsInRlbXAiLCJuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5IiwibGVuIiwiYXJyYXlfaXMiLCJhcnJheV9pIiwiZ2V0X29wdGlvbiIsIm9wdGlvbl9uYW1lIiwib3B0aW9ucyIsImRlZmF1bF92YWx1ZSIsImhhc093blByb3BlcnR5IiwidW5kZWZpbmVkIiwiZ2V0X211bHRpZGltX29wdGlvbiIsInZhbHVlIiwicGFyYW1faW5pdF9maXhlZCIsInR5cGUiLCJsb3dlciIsInVwcGVyIiwicm91bmQiLCJjb21wbGV0ZV9wYXJhbXMiLCJwYXJhbXNfdG9fY29tcGxldGUiLCJwYXJhbV9pbml0IiwicGFyYW1zIiwicGFyYW1fbmFtZSIsInBhcmFtIiwiU3RlcHBlciIsInN0YXRlIiwibG9nX3Bvc3QiLCJzdGVwIiwic3RhcnRfYWRhcHRhdGlvbiIsInN0b3BfYWRhcHRhdGlvbiIsImluZm8iLCJPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciIsImdlbmVyYXRlX3Byb3Bvc2FsIiwicGFyYW1fbmFtZXMiLCJrZXlzIiwicHJvcF9sb2dfc2NhbGUiLCJiYXRjaF9zaXplIiwibWF4X2FkYXB0YXRpb24iLCJpbml0aWFsX2FkYXB0YXRpb24iLCJ0YXJnZXRfYWNjZXB0X3JhdGUiLCJpc19hZGFwdGluZyIsImFjY2VwdGFuY2VfY291bnQiLCJiYXRjaF9jb3VudCIsIml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24iLCJjcmVhdGUiLCJwYXJhbV9zdGF0ZSIsInBhcmFtX3Byb3Bvc2FsIiwiY3Vycl9sb2dfZGVucyIsInByb3BfbG9nX2RlbnMiLCJhY2NlcHRfcHJvYiIsImxvZ19zZF9hZGp1c3RtZW50Iiwibm9ybWFsX3Byb3Bvc2FsIiwiUmVhbE1ldHJvcG9saXNTdGVwcGVyIiwiZGlzY3JldGVfbm9ybWFsX3Byb3Bvc2FsIiwiSW50TWV0cm9wb2xpc1N0ZXBwZXIiLCJNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIiwiU3ViU3RlcHBlciIsImNyZWF0ZV9zdWJzdGVwcGVycyIsInN1YnN0YXRlIiwic3Vic3RlcHBlcnMiLCJzdWJvcHRpb25zIiwic3VicGFyYW0iLCJzdWJzdGVwcGVyIiwiTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIiLCJNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIiwiQmluYXJ5U3RlcHBlciIsInplcm9fbG9nX2RlbnMiLCJvbmVfbG9nX2RlbnMiLCJtYXhfbG9nX2RlbnMiLCJ6ZXJvX3Byb2IiLCJCaW5hcnlDb21wb25lbnRTdGVwcGVyIiwic3VicGFyYW1zIiwiQW13Z1N0ZXBwZXIiLCJTZWxlY3RTdGVwcGVyIiwicGFyYW1fb2JqZWN0X3dyYXAiLCJwYXJhbV9vcHRpb25zIiwiU2FtcGxlciIsImRhdGEiLCJwYXJhbV9pbml0X2Z1biIsInRoaW5uaW5nX2ludGVydmFsIiwicGFyYW1zX3RvX21vbml0b3IiLCJ0aGluIiwibW9uaXRvciIsInN0ZXBwZXJzIiwiY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUiLCJzYW1wbGUiLCJuX2l0ZXJhdGlvbnMiLCJtb25pdG9yZWRfcGFyYW1zIiwiY3Vycl9zYW1wbGUiLCJidXJuIiwiQW13Z1NhbXBsZXIiLCJhc2NlbmRpbmciLCJudW1iZXJzIiwidmFsdWVzIiwidmFsdWVvZiIsImNvbXBhcmVEZWZpbmVkIiwiY29tcGFyZSIsImFzY2VuZGluZ0RlZmluZWQiLCJUeXBlRXJyb3IiLCJxdWlja3NlbGVjdCIsImxlZnQiLCJyaWdodCIsIm5ld0xlZnQiLCJuZXdSaWdodCIsInN3YXAiLCJxdWFudGlsZSIsInAiLCJGbG9hdDY0QXJyYXkiLCJmcm9tIiwiaXNOYU4iLCJpMCIsInZhbHVlMCIsInN1YmFycmF5IiwidmFsdWUxIiwibWVkaWFuIiwibm9vcCIsImRpc3BhdGNoIiwiYXJndW1lbnRzIiwiXyIsInRlc3QiLCJFcnJvciIsIkRpc3BhdGNoIiwicGFyc2VUeXBlbmFtZXMiLCJ0eXBlbmFtZXMiLCJ0eXBlcyIsInRyaW0iLCJzcGxpdCIsIm1hcCIsImluZGV4T2YiLCJvbiIsInR5cGVuYW1lIiwiY2FsbGJhY2siLCJUIiwiZ2V0Iiwic2V0IiwiY29weSIsInRoYXQiLCJhcmdzIiwiYXBwbHkiLCJjIiwieGh0bWwiLCJzdmciLCJ4bGluayIsInhtbCIsInhtbG5zIiwicHJlZml4IiwibmFtZXNwYWNlcyIsInNwYWNlIiwibG9jYWwiLCJjcmVhdG9ySW5oZXJpdCIsImRvY3VtZW50Iiwib3duZXJEb2N1bWVudCIsInVyaSIsIm5hbWVzcGFjZVVSSSIsImRvY3VtZW50RWxlbWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjcmVhdGVFbGVtZW50TlMiLCJjcmVhdG9yRml4ZWQiLCJmdWxsbmFtZSIsIm5hbWVzcGFjZSIsIm5vbmUiLCJzZWxlY3RvciIsInF1ZXJ5U2VsZWN0b3IiLCJzZWxlY3QiLCJncm91cHMiLCJfZ3JvdXBzIiwic3ViZ3JvdXBzIiwiZ3JvdXAiLCJzdWJncm91cCIsIm5vZGUiLCJzdWJub2RlIiwiX19kYXRhX18iLCJTZWxlY3Rpb24iLCJfcGFyZW50cyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJhcnJheUFsbCIsInNlbGVjdG9yQWxsIiwicGFyZW50cyIsIm1hdGNoZXMiLCJjaGlsZE1hdGNoZXIiLCJmaW5kIiwiY2hpbGRGaW5kIiwibWF0Y2giLCJjaGlsZHJlbiIsImNoaWxkRmlyc3QiLCJmaXJzdEVsZW1lbnRDaGlsZCIsImZpbHRlciIsImNoaWxkcmVuRmlsdGVyIiwic2VsZWN0QWxsIiwibWF0Y2hlciIsInVwZGF0ZSIsIl9lbnRlciIsInNwYXJzZSIsIkVudGVyTm9kZSIsInBhcmVudCIsImRhdHVtIiwiX25leHQiLCJfcGFyZW50IiwiYXBwZW5kQ2hpbGQiLCJjaGlsZCIsImluc2VydEJlZm9yZSIsIm5leHQiLCJiaW5kSW5kZXgiLCJlbnRlciIsImV4aXQiLCJncm91cExlbmd0aCIsImRhdGFMZW5ndGgiLCJiaW5kS2V5Iiwia2V5Iiwibm9kZUJ5S2V5VmFsdWUiLCJNYXAiLCJrZXlWYWx1ZXMiLCJrZXlWYWx1ZSIsImhhcyIsImRlbGV0ZSIsImJpbmQiLCJjb25zdGFudCIsImFycmF5bGlrZSIsImVudGVyR3JvdXAiLCJ1cGRhdGVHcm91cCIsImV4aXRHcm91cCIsImkxIiwicHJldmlvdXMiLCJfZXhpdCIsIm9uZW50ZXIiLCJvbnVwZGF0ZSIsIm9uZXhpdCIsInNlbGVjdGlvbiIsImFwcGVuZCIsInJlbW92ZSIsIm1lcmdlIiwib3JkZXIiLCJjb250ZXh0IiwiZ3JvdXBzMCIsImdyb3VwczEiLCJtMCIsIm0xIiwibWVyZ2VzIiwiZ3JvdXAwIiwiZ3JvdXAxIiwiY29tcGFyZURvY3VtZW50UG9zaXRpb24iLCJwYXJlbnROb2RlIiwiY29tcGFyZU5vZGUiLCJzb3J0Z3JvdXBzIiwic29ydGdyb3VwIiwic29ydCIsImF0dHJSZW1vdmUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJhdHRyUmVtb3ZlTlMiLCJyZW1vdmVBdHRyaWJ1dGVOUyIsImF0dHJDb25zdGFudCIsInNldEF0dHJpYnV0ZSIsImF0dHJDb25zdGFudE5TIiwic2V0QXR0cmlidXRlTlMiLCJhdHRyRnVuY3Rpb24iLCJhdHRyRnVuY3Rpb25OUyIsImdldEF0dHJpYnV0ZU5TIiwiZ2V0QXR0cmlidXRlIiwiZWFjaCIsImRlZmF1bHRWaWV3Iiwic3R5bGVSZW1vdmUiLCJzdHlsZSIsInJlbW92ZVByb3BlcnR5Iiwic3R5bGVDb25zdGFudCIsInByaW9yaXR5Iiwic2V0UHJvcGVydHkiLCJzdHlsZUZ1bmN0aW9uIiwic3R5bGVWYWx1ZSIsImdldFByb3BlcnR5VmFsdWUiLCJnZXRDb21wdXRlZFN0eWxlIiwicHJvcGVydHlSZW1vdmUiLCJwcm9wZXJ0eUNvbnN0YW50IiwicHJvcGVydHlGdW5jdGlvbiIsImNsYXNzQXJyYXkiLCJzdHJpbmciLCJjbGFzc0xpc3QiLCJDbGFzc0xpc3QiLCJfbm9kZSIsIl9uYW1lcyIsImFkZCIsImpvaW4iLCJzcGxpY2UiLCJjb250YWlucyIsImNsYXNzZWRBZGQiLCJuYW1lcyIsImxpc3QiLCJjbGFzc2VkUmVtb3ZlIiwiY2xhc3NlZFRydWUiLCJjbGFzc2VkRmFsc2UiLCJjbGFzc2VkRnVuY3Rpb24iLCJ0ZXh0UmVtb3ZlIiwidGV4dENvbnRlbnQiLCJ0ZXh0Q29uc3RhbnQiLCJ0ZXh0RnVuY3Rpb24iLCJodG1sUmVtb3ZlIiwiaW5uZXJIVE1MIiwiaHRtbENvbnN0YW50IiwiaHRtbEZ1bmN0aW9uIiwicmFpc2UiLCJuZXh0U2libGluZyIsInByZXZpb3VzU2libGluZyIsImZpcnN0Q2hpbGQiLCJjcmVhdG9yIiwiY29uc3RhbnROdWxsIiwiYmVmb3JlIiwicmVtb3ZlQ2hpbGQiLCJzZWxlY3Rpb25fY2xvbmVTaGFsbG93IiwiY2xvbmUiLCJzZWxlY3Rpb25fY2xvbmVEZWVwIiwiZGVlcCIsInByb3BlcnR5IiwiY29udGV4dExpc3RlbmVyIiwibGlzdGVuZXIiLCJldmVudCIsIm9uUmVtb3ZlIiwiX19vbiIsIm8iLCJyZW1vdmVFdmVudExpc3RlbmVyIiwib25BZGQiLCJhZGRFdmVudExpc3RlbmVyIiwiZGlzcGF0Y2hFdmVudCIsIndpbmRvdyIsIkN1c3RvbUV2ZW50IiwiY3JlYXRlRXZlbnQiLCJpbml0RXZlbnQiLCJidWJibGVzIiwiY2FuY2VsYWJsZSIsImRldGFpbCIsImRpc3BhdGNoQ29uc3RhbnQiLCJkaXNwYXRjaEZ1bmN0aW9uIiwic2VsZWN0aW9uX3NlbGVjdGlvbiIsInNlbGVjdGlvbl9zZWxlY3QiLCJzZWxlY3Rpb25fc2VsZWN0QWxsIiwic2VsZWN0Q2hpbGQiLCJzZWxlY3Rpb25fc2VsZWN0Q2hpbGQiLCJzZWxlY3RDaGlsZHJlbiIsInNlbGVjdGlvbl9zZWxlY3RDaGlsZHJlbiIsInNlbGVjdGlvbl9maWx0ZXIiLCJzZWxlY3Rpb25fZGF0YSIsInNlbGVjdGlvbl9lbnRlciIsInNlbGVjdGlvbl9leGl0Iiwic2VsZWN0aW9uX2pvaW4iLCJzZWxlY3Rpb25fbWVyZ2UiLCJzZWxlY3Rpb25fb3JkZXIiLCJzZWxlY3Rpb25fc29ydCIsInNlbGVjdGlvbl9jYWxsIiwibm9kZXMiLCJzZWxlY3Rpb25fbm9kZXMiLCJzZWxlY3Rpb25fbm9kZSIsInNlbGVjdGlvbl9zaXplIiwic2VsZWN0aW9uX2VtcHR5Iiwic2VsZWN0aW9uX2VhY2giLCJhdHRyIiwic2VsZWN0aW9uX2F0dHIiLCJzZWxlY3Rpb25fc3R5bGUiLCJzZWxlY3Rpb25fcHJvcGVydHkiLCJjbGFzc2VkIiwic2VsZWN0aW9uX2NsYXNzZWQiLCJ0ZXh0Iiwic2VsZWN0aW9uX3RleHQiLCJodG1sIiwic2VsZWN0aW9uX2h0bWwiLCJzZWxlY3Rpb25fcmFpc2UiLCJzZWxlY3Rpb25fbG93ZXIiLCJzZWxlY3Rpb25fYXBwZW5kIiwiaW5zZXJ0Iiwic2VsZWN0aW9uX2luc2VydCIsInNlbGVjdGlvbl9yZW1vdmUiLCJzZWxlY3Rpb25fY2xvbmUiLCJzZWxlY3Rpb25fZGF0dW0iLCJzZWxlY3Rpb25fb24iLCJzZWxlY3Rpb25fZGlzcGF0Y2giLCJTeW1ib2wiLCJpdGVyYXRvciIsInNlbGVjdGlvbl9pdGVyYXRvciIsImV4dGVuZCIsImRlZmluaXRpb24iLCJDb2xvciIsImRhcmtlciIsImJyaWdodGVyIiwicmVJIiwicmVOIiwicmVQIiwicmVIZXgiLCJyZVJnYkludGVnZXIiLCJyZVJnYlBlcmNlbnQiLCJyZVJnYmFJbnRlZ2VyIiwicmVSZ2JhUGVyY2VudCIsInJlSHNsUGVyY2VudCIsInJlSHNsYVBlcmNlbnQiLCJuYW1lZCIsImFsaWNlYmx1ZSIsImFudGlxdWV3aGl0ZSIsImFxdWEiLCJhcXVhbWFyaW5lIiwiYXp1cmUiLCJiZWlnZSIsImJpc3F1ZSIsImJsYWNrIiwiYmxhbmNoZWRhbG1vbmQiLCJibHVlIiwiYmx1ZXZpb2xldCIsImJyb3duIiwiYnVybHl3b29kIiwiY2FkZXRibHVlIiwiY2hhcnRyZXVzZSIsImNob2NvbGF0ZSIsImNvcmFsIiwiY29ybmZsb3dlcmJsdWUiLCJjb3Juc2lsayIsImNyaW1zb24iLCJjeWFuIiwiZGFya2JsdWUiLCJkYXJrY3lhbiIsImRhcmtnb2xkZW5yb2QiLCJkYXJrZ3JheSIsImRhcmtncmVlbiIsImRhcmtncmV5IiwiZGFya2toYWtpIiwiZGFya21hZ2VudGEiLCJkYXJrb2xpdmVncmVlbiIsImRhcmtvcmFuZ2UiLCJkYXJrb3JjaGlkIiwiZGFya3JlZCIsImRhcmtzYWxtb24iLCJkYXJrc2VhZ3JlZW4iLCJkYXJrc2xhdGVibHVlIiwiZGFya3NsYXRlZ3JheSIsImRhcmtzbGF0ZWdyZXkiLCJkYXJrdHVycXVvaXNlIiwiZGFya3Zpb2xldCIsImRlZXBwaW5rIiwiZGVlcHNreWJsdWUiLCJkaW1ncmF5IiwiZGltZ3JleSIsImRvZGdlcmJsdWUiLCJmaXJlYnJpY2siLCJmbG9yYWx3aGl0ZSIsImZvcmVzdGdyZWVuIiwiZnVjaHNpYSIsImdhaW5zYm9ybyIsImdob3N0d2hpdGUiLCJnb2xkIiwiZ29sZGVucm9kIiwiZ3JheSIsImdyZWVuIiwiZ3JlZW55ZWxsb3ciLCJncmV5IiwiaG9uZXlkZXciLCJob3RwaW5rIiwiaW5kaWFucmVkIiwiaW5kaWdvIiwiaXZvcnkiLCJraGFraSIsImxhdmVuZGVyIiwibGF2ZW5kZXJibHVzaCIsImxhd25ncmVlbiIsImxlbW9uY2hpZmZvbiIsImxpZ2h0Ymx1ZSIsImxpZ2h0Y29yYWwiLCJsaWdodGN5YW4iLCJsaWdodGdvbGRlbnJvZHllbGxvdyIsImxpZ2h0Z3JheSIsImxpZ2h0Z3JlZW4iLCJsaWdodGdyZXkiLCJsaWdodHBpbmsiLCJsaWdodHNhbG1vbiIsImxpZ2h0c2VhZ3JlZW4iLCJsaWdodHNreWJsdWUiLCJsaWdodHNsYXRlZ3JheSIsImxpZ2h0c2xhdGVncmV5IiwibGlnaHRzdGVlbGJsdWUiLCJsaWdodHllbGxvdyIsImxpbWUiLCJsaW1lZ3JlZW4iLCJsaW5lbiIsIm1hZ2VudGEiLCJtYXJvb24iLCJtZWRpdW1hcXVhbWFyaW5lIiwibWVkaXVtYmx1ZSIsIm1lZGl1bW9yY2hpZCIsIm1lZGl1bXB1cnBsZSIsIm1lZGl1bXNlYWdyZWVuIiwibWVkaXVtc2xhdGVibHVlIiwibWVkaXVtc3ByaW5nZ3JlZW4iLCJtZWRpdW10dXJxdW9pc2UiLCJtZWRpdW12aW9sZXRyZWQiLCJtaWRuaWdodGJsdWUiLCJtaW50Y3JlYW0iLCJtaXN0eXJvc2UiLCJtb2NjYXNpbiIsIm5hdmFqb3doaXRlIiwibmF2eSIsIm9sZGxhY2UiLCJvbGl2ZSIsIm9saXZlZHJhYiIsIm9yYW5nZSIsIm9yYW5nZXJlZCIsIm9yY2hpZCIsInBhbGVnb2xkZW5yb2QiLCJwYWxlZ3JlZW4iLCJwYWxldHVycXVvaXNlIiwicGFsZXZpb2xldHJlZCIsInBhcGF5YXdoaXAiLCJwZWFjaHB1ZmYiLCJwZXJ1IiwicGluayIsInBsdW0iLCJwb3dkZXJibHVlIiwicHVycGxlIiwicmViZWNjYXB1cnBsZSIsInJlZCIsInJvc3licm93biIsInJveWFsYmx1ZSIsInNhZGRsZWJyb3duIiwic2FsbW9uIiwic2FuZHlicm93biIsInNlYWdyZWVuIiwic2Vhc2hlbGwiLCJzaWVubmEiLCJzaWx2ZXIiLCJza3libHVlIiwic2xhdGVibHVlIiwic2xhdGVncmF5Iiwic2xhdGVncmV5Iiwic25vdyIsInNwcmluZ2dyZWVuIiwic3RlZWxibHVlIiwidGFuIiwidGVhbCIsInRoaXN0bGUiLCJ0b21hdG8iLCJ0dXJxdW9pc2UiLCJ2aW9sZXQiLCJ3aGVhdCIsIndoaXRlIiwid2hpdGVzbW9rZSIsInllbGxvdyIsInllbGxvd2dyZWVuIiwiZGVmaW5lIiwiY29sb3IiLCJjaGFubmVscyIsImFzc2lnbiIsImRpc3BsYXlhYmxlIiwicmdiIiwiaGV4IiwiY29sb3JfZm9ybWF0SGV4IiwiZm9ybWF0SGV4IiwiZm9ybWF0SGV4OCIsImNvbG9yX2Zvcm1hdEhleDgiLCJmb3JtYXRIc2wiLCJjb2xvcl9mb3JtYXRIc2wiLCJmb3JtYXRSZ2IiLCJjb2xvcl9mb3JtYXRSZ2IiLCJoc2xDb252ZXJ0IiwiZm9ybWF0IiwidG9Mb3dlckNhc2UiLCJleGVjIiwicGFyc2VJbnQiLCJyZ2JuIiwiUmdiIiwicmdiYSIsImhzbGEiLCJnIiwicmdiQ29udmVydCIsIm9wYWNpdHkiLCJjbGFtcCIsImNsYW1waSIsImNsYW1wYSIsInJnYl9mb3JtYXRIZXgiLCJyZ2JfZm9ybWF0SGV4OCIsInJnYl9mb3JtYXRSZ2IiLCJoIiwiSHNsIiwiaHNsIiwibTIiLCJoc2wycmdiIiwiY2xhbXBoIiwiY2xhbXB0IiwibGluZWFyIiwiZCIsImV4cG9uZW50aWFsIiwibm9nYW1tYSIsInJnYkdhbW1hIiwic3RhcnQiLCJlbmQiLCJjb2xvclJnYiIsInJlQSIsInJlQiIsInplcm8iLCJvbmUiLCJiaSIsImxhc3RJbmRleCIsImFtIiwiYm0iLCJicyIsImluZGV4IiwibnVtYmVyIiwiZGVncmVlcyIsImlkZW50aXR5IiwidHJhbnNsYXRlWCIsInRyYW5zbGF0ZVkiLCJyb3RhdGUiLCJza2V3WCIsInNjYWxlWCIsInNjYWxlWSIsImF0YW4yIiwiYXRhbiIsInN2Z05vZGUiLCJwYXJzZUNzcyIsIkRPTU1hdHJpeCIsIldlYktpdENTU01hdHJpeCIsImlzSWRlbnRpdHkiLCJkZWNvbXBvc2UiLCJwYXJzZVN2ZyIsInRyYW5zZm9ybSIsImJhc2VWYWwiLCJjb25zb2xpZGF0ZSIsIm1hdHJpeCIsImludGVycG9sYXRlVHJhbnNmb3JtIiwicGFyc2UiLCJweENvbW1hIiwicHhQYXJlbiIsImRlZ1BhcmVuIiwicG9wIiwidHJhbnNsYXRlIiwieGEiLCJ5YSIsInhiIiwieWIiLCJpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyIsImludGVycG9sYXRlVHJhbnNmb3JtU3ZnIiwiZnJhbWUiLCJ0aW1lb3V0IiwiaW50ZXJ2YWwiLCJwb2tlRGVsYXkiLCJ0YXNrSGVhZCIsInRhc2tUYWlsIiwiY2xvY2tMYXN0IiwiY2xvY2tOb3ciLCJjbG9ja1NrZXciLCJjbG9jayIsInBlcmZvcm1hbmNlIiwibm93Iiwic2V0RnJhbWUiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJzZXRUaW1lb3V0IiwiY2xlYXJOb3ciLCJUaW1lciIsIl9jYWxsIiwiX3RpbWUiLCJ0aW1lciIsInJlc3RhcnQiLCJkZWxheSIsInRpbWUiLCJzbGVlcCIsInN0b3AiLCJ0aW1lckZsdXNoIiwid2FrZSIsIm5hcCIsInBva2UiLCJ0MCIsInQxIiwidDIiLCJjbGVhclRpbWVvdXQiLCJjbGVhckludGVydmFsIiwic2V0SW50ZXJ2YWwiLCJlbGFwc2VkIiwiZW1wdHlPbiIsImVtcHR5VHdlZW4iLCJDUkVBVEVEIiwiU0NIRURVTEVEIiwiU1RBUlRJTkciLCJTVEFSVEVEIiwiUlVOTklORyIsIkVORElORyIsIkVOREVEIiwiaWQiLCJ0aW1pbmciLCJzY2hlZHVsZXMiLCJfX3RyYW5zaXRpb24iLCJ0d2VlbiIsImR1cmF0aW9uIiwiZWFzZSIsInNjaGVkdWxlIiwic2VsZiIsInRpY2siLCJhY3RpdmUiLCJpbnRlcnJ1cHQiLCJ0d2VlblJlbW92ZSIsInR3ZWVuMCIsInR3ZWVuMSIsInR3ZWVuRnVuY3Rpb24iLCJfaWQiLCJ0d2VlblZhbHVlIiwidHJhbnNpdGlvbiIsImludGVycG9sYXRlTnVtYmVyIiwiaW50ZXJwb2xhdGVSZ2IiLCJpbnRlcnBvbGF0ZVN0cmluZyIsImludGVycG9sYXRlIiwic3RyaW5nMDAiLCJzdHJpbmcxIiwiaW50ZXJwb2xhdGUwIiwic3RyaW5nMCIsInN0cmluZzEwIiwiYXR0clR3ZWVuIiwiYXR0ckludGVycG9sYXRlIiwiYXR0ckludGVycG9sYXRlTlMiLCJhdHRyVHdlZW5OUyIsIl92YWx1ZSIsImRlbGF5RnVuY3Rpb24iLCJkZWxheUNvbnN0YW50IiwiZHVyYXRpb25GdW5jdGlvbiIsImR1cmF0aW9uQ29uc3RhbnQiLCJlYXNlQ29uc3RhbnQiLCJlYXNlVmFyeWluZyIsIlRyYW5zaXRpb24iLCJfbmFtZSIsImV2ZXJ5Iiwib25GdW5jdGlvbiIsIm9uMCIsIm9uMSIsInNpdCIsInJlbW92ZUZ1bmN0aW9uIiwiaW5oZXJpdCIsInN0eWxlTnVsbCIsInN0eWxlTWF5YmVSZW1vdmUiLCJsaXN0ZW5lcjAiLCJzdHlsZVR3ZWVuIiwic3R5bGVJbnRlcnBvbGF0ZSIsInRleHRJbnRlcnBvbGF0ZSIsInRleHRUd2VlbiIsImlkMCIsImlkMSIsIm5ld0lkIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJjYW5jZWwiLCJzZWxlY3Rpb25fcHJvdG90eXBlIiwidHJhbnNpdGlvbl9zZWxlY3QiLCJ0cmFuc2l0aW9uX3NlbGVjdEFsbCIsInRyYW5zaXRpb25fZmlsdGVyIiwidHJhbnNpdGlvbl9tZXJnZSIsInRyYW5zaXRpb25fc2VsZWN0aW9uIiwidHJhbnNpdGlvbl90cmFuc2l0aW9uIiwidHJhbnNpdGlvbl9vbiIsInRyYW5zaXRpb25fYXR0ciIsInRyYW5zaXRpb25fYXR0clR3ZWVuIiwidHJhbnNpdGlvbl9zdHlsZSIsInRyYW5zaXRpb25fc3R5bGVUd2VlbiIsInRyYW5zaXRpb25fdGV4dCIsInRyYW5zaXRpb25fdGV4dFR3ZWVuIiwidHJhbnNpdGlvbl9yZW1vdmUiLCJ0cmFuc2l0aW9uX3R3ZWVuIiwidHJhbnNpdGlvbl9kZWxheSIsInRyYW5zaXRpb25fZHVyYXRpb24iLCJ0cmFuc2l0aW9uX2Vhc2UiLCJ0cmFuc2l0aW9uX2Vhc2VWYXJ5aW5nIiwidHJhbnNpdGlvbl9lbmQiLCJjdWJpY0luT3V0IiwiZGVmYXVsdFRpbWluZyIsImVhc2VDdWJpY0luT3V0Iiwic2VsZWN0aW9uX2ludGVycnVwdCIsInNlbGVjdGlvbl90cmFuc2l0aW9uIiwiVHJhbnNmb3JtIiwicG9pbnQiLCJhcHBseVgiLCJhcHBseVkiLCJpbnZlcnQiLCJpbnZlcnRYIiwiaW52ZXJ0WSIsInJlc2NhbGVYIiwiZG9tYWluIiwicmFuZ2UiLCJyZXNjYWxlWSIsIkhURE1hdGgiLCJERUZBVUxUIiwiTUlOIiwiTUFYIiwiU1RFUCIsIkpVTVAiLCJhZGsydiIsImFkdjJrIiwib25tZXNzYWdlIiwibHVjZSIsImxvZ1Bvc3QiLCJscCIsImtNZWFuIiwia1NoYXBlIiwiQmF5ZXNEaXN0cmlidXRpb25zIiwibHVjZU1lYW4iLCJsdWNlU2hhcGUiLCJmb3JFYWNoIiwiY2hvaWNlIiwidnMiLCJhcyIsImRzIiwidmwiLCJhbCIsImRsIiwiYmludmFsIiwicmVzcG9uc2UiLCJzYW1wbGVyIiwiQmF5ZXNNY21jIiwic2FtcGxlcyIsInJlc3VsdHMiLCJkMyIsInBvc3RNZXNz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Q0FBQy93QixNQUFNLEVBQUU2dkIsT0FBTyxFQUFFemQsS0FBSyxDQUFDNU8sSUFBSSxDQUFDO0VBQ3RFO0VBQ0FzdEIsRUFBQUEsT0FBTyxDQUFDMXNCLElBQUksQ0FBQyxJQUFJLENBQUM7RUFDbEIsRUFBQSxNQUFNNHNCLE9BQU8sR0FBR0YsT0FBTyxDQUFDOXNCLE1BQU0sQ0FBQyxJQUFJLENBQUM7O0VBRXBDO0VBQ0EsRUFBQSxNQUFNaXRCLE9BQU8sR0FBRztNQUNkNTVCLENBQUMsRUFBRTY1QixNQUFTLENBQUNGLE9BQU8sQ0FBQzM1QixDQUFDLENBQUM7RUFDdkJ1NEIsSUFBQUEsSUFBSSxFQUFFc0IsTUFBUyxDQUFDRixPQUFPLENBQUNwQixJQUFJO0tBQzdCO0lBRURwRyxJQUFJLENBQUMySCxXQUFXLENBQUM7RUFBQ0YsSUFBQUEsT0FBTyxFQUFFQSxPQUFPO0VBQUVELElBQUFBLE9BQU8sRUFBRUE7RUFBTyxHQUFDLENBQUM7RUFDeEQsQ0FBQzs7Ozs7OyIsInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLDQxLDQyLDQzLDQ0LDQ1LDQ2LDQ3LDQ4LDQ5LDUwLDUxLDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLDY0LDY1LDY2LDY3LDY4LDY5LDcwLDcxLDcyLDczLDc0LDc1LDc2LDc3LDc4LDc5LDgwLDgxLDgyLDgzLDg0LDg1LDg2LDg3LDg4LDg5LDkwLDkxLDkyLDkzLDk0LDk1LDk2XX0=");class kh extends ca{static get properties(){return{}}constructor(){super(),this.k=Wa.k.DEFAULT,this.choices=[],this.samples=null,this.working=!1,this.queued=!1,this.worker=new vh,this.worker.onmessage=B=>{this.working=!1,this.samples=B.data.samples,this.k=B.data.results.k,this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-fit-update",{detail:{k:this.k},bubbles:!0})),this.queued&&this.fit()},this.fit()}fit(){this.working?this.queued=!0:(this.worker.postMessage(this.choices),this.working=!0,this.queued=!1)}clear(){this.choices=[],this.fit()}get(B="default"){const Q=this.choices.find(Q=>Q.name===B);return void 0===Q?null:Q}set(B,Q,F,U,t,s="",I=""){const g=this.choices.find(B=>B.name===s);void 0===g?this.choices.push({as:B,ds:Q,al:F,dl:U,response:t,name:s,label:I}):(g.as=B,g.ds=Q,g.al=F,g.dl=U,g.response=t,g.label=I),this.fit()}static get styles(){return[super.styles,g`
1465
1486
  /* :host {
1466
1487
  display: inline-block;
1467
1488
  } */
@@ -1496,7 +1517,7 @@ const da=2;let Ca=class{constructor(B){}get _$AU(){return this._$AM._$AU}_$AT(B,
1496
1517
  <div class="hist luce"></div>
1497
1518
  </div>
1498
1519
  </div>
1499
- `}plotParam(B){this.shadowRoot.querySelector(`.hist.${B}`).replaceChildren(OL({title:`Posterior of ${B}`,x:{label:`${B}`},width:320,height:240,style:"font-size: 0.75rem; font-family: var(---font-family-base);",marks:[XL(this.samples[B],ah({y:"count"},{x:Wb})),XL(this.samples[B],ux(ah({y:"count"},{x:Wb,stroke:"black",fill:"white",tip:!0})))]})),this.shadowRoot.querySelector(`.trace.${B}`).replaceChildren(OL({title:`Traceplot of ${B}`,x:{label:"Sample"},y:{label:`${B}`},width:320,height:240,style:"font-size: 0.75rem; font-family: var(---font-family-base);",marks:[Yh(this.samples[B]),Hh(this.samples[B],ox({x:pb,y:Wb,stroke:"black",fill:"white",r:4,tip:!0}))]}))}update(B){super.update(B),null!==this.samples&&(this.plotParam("k"),this.plotParam("luce"))}}customElements.define("htd-fit",kh);class Mh extends ca{static get properties(){return{k:{attribute:"k",type:Number,reflect:!0}}}constructor(){super(),this.k=void 0}updated(B){super.updated(B),void 0!==this.k&&void 0===this.kSlider?(this.kSlider=this.shadowRoot.querySelector("decidables-slider.k"),this.kSlider.nonlinearRange(!0,B=>B**.5/(B**.5+1),B=>(B/(1-B))**2)):void 0===this.k&&void 0!==this.kSlider&&(this.kSlider=void 0)}setK(B){this.k=+B.target.value,this.dispatchEvent(new CustomEvent("htd-parameters-k",{detail:{k:this.k},bubbles:!0}))}static get styles(){return[super.styles,g`
1520
+ `}plotParam(B){this.shadowRoot.querySelector(`.hist.${B}`).replaceChildren(OA({title:`Posterior of ${B}`,x:{label:`${B}`},width:320,height:240,style:"font-size: 0.75rem; font-family: var(---font-family-base);",marks:[XA(this.samples[B],ah({y:"count"},{x:Wb})),XA(this.samples[B],Gx(ah({y:"count"},{x:Wb,stroke:"black",fill:"white",tip:!0})))]})),this.shadowRoot.querySelector(`.trace.${B}`).replaceChildren(OA({title:`Traceplot of ${B}`,x:{label:"Sample"},y:{label:`${B}`},width:320,height:240,style:"font-size: 0.75rem; font-family: var(---font-family-base);",marks:[fh(this.samples[B]),Hh(this.samples[B],ox({x:pb,y:Wb,stroke:"black",fill:"white",r:4,tip:!0}))]}))}update(B){super.update(B),null!==this.samples&&(this.plotParam("k"),this.plotParam("luce"))}}customElements.define("htd-fit",kh);class Mh extends ca{static get properties(){return{k:{attribute:"k",type:Number,reflect:!0}}}constructor(){super(),this.k=void 0}updated(B){super.updated(B),void 0!==this.k&&void 0===this.kSlider?(this.kSlider=this.shadowRoot.querySelector("decidables-slider.k"),this.kSlider.nonlinearRange(!0,B=>B**.5/(B**.5+1),B=>(B/(1-B))**2)):void 0===this.k&&void 0!==this.kSlider&&(this.kSlider=void 0)}setK(B){this.k=+B.target.value,this.dispatchEvent(new CustomEvent("htd-parameters-k",{detail:{k:this.k},bubbles:!0}))}static get styles(){return[super.styles,g`
1500
1521
  :host {
1501
1522
  display: inline-block;
1502
1523
  }
@@ -1673,7 +1694,7 @@ const da=2;let Ca=class{constructor(B){}get _$AU(){return this._$AM._$AU}_$AT(B,
1673
1694
  amount-ll="${this.al}"
1674
1695
  delay-ll="${this.dl}">
1675
1696
  </itc-choice>
1676
- </div>`}update(B){super.update(B),(this.firstUpdate||B.has("running"))&&(this.running?(this.pauseTime&&(this.baseTime+=Pt()-this.pauseTime,this.pauseTime=0),this.runner=function(B,Q,F){var U=new $t,t=Q;return U._restart=U.restart,U.restart=function(B,Q,F){Q=+Q,F=null==F?Pt():+F,U._restart(function s(I){I+=t,U._restart(s,t+=Q,F),B(I)},Q,F)},U.restart(B,Q,F),U}(this.run.bind(this),20)):void 0!==this.runner&&(this.runner.stop(),this.pauseTime=Pt())),this.firstUpdate=!1}reset(){this.runner.stop(),this.running=!1,this.trial=0,this.state="resetted",this.as=0,this.ds=0,this.al=0,this.dl=0,this.baseTime=0,this.pauseTime=0,this.startTime=0,this.lastTime=0}run(){const B=Pt(),Q=this.baseTime?B-this.baseTime:0,F=this.baseTime?Q-this.startTime:0;this.lastTime=Q,"resetted"===this.state?(this.state="iti",this.baseTime=B,this.startTime=0,this.dispatchEvent(new CustomEvent("itc-block-start",{detail:{trials:this.trials},bubbles:!0}))):"iti"===this.state&&F>=this.iti?(this.trial+=1,this.state="stimulus",this.startTime=Q,this.as=this.range.as.values[Math.floor(Math.random()*this.range.as.values.length)],this.ds=this.range.ds.values[Math.floor(Math.random()*this.range.ds.values.length)],this.al=this.range.al.values[Math.floor(Math.random()*this.range.al.values.length)],this.dl=this.range.dl.values[Math.floor(Math.random()*this.range.dl.values.length)],this.dispatchEvent(new CustomEvent("itc-trial-start",{detail:{trials:this.trials,duration:this.duration,iti:this.iti,trial:this.trial,as:this.as,ds:this.ds,al:this.al,dl:this.dl},bubbles:!0}))):"stimulus"===this.state&&F>=this.duration&&(this.dispatchEvent(new CustomEvent("itc-trial-end",{detail:{trials:this.trials,duration:this.duration,iti:this.iti,trial:this.trial,as:this.as,ds:this.ds,al:this.al,dl:this.dl},bubbles:!0})),this.trial>=this.trials?(this.runner.stop(),this.running=!1,this.state="ended",this.baseTime=0,this.pauseTime=0,this.startTime=0,this.lastTime=0,this.dispatchEvent(new CustomEvent("itc-block-end",{detail:{trials:this.trial},bubbles:!0}))):(this.state="iti",this.startTime=Q))}}customElements.define("itc-task",Kh);class Oh extends Ha{static get properties(){return{a:{attribute:"amount",type:Number,reflect:!0},d:{attribute:"delay",type:Number,reflect:!0},k:{attribute:"k",type:Number,reflect:!0},v:{attribute:!1,type:Number,reflect:!1}}}constructor(){super(),this.a=100,this.d=30,this.k=Wa.k.DEFAULT,this.alignState()}alignState(){this.v=Wa.adk2v(this.a,this.d,this.k)}sendEvent(){this.dispatchEvent(new CustomEvent("htd-equation-adk2v-change",{detail:{a:this.a,d:this.d,k:this.k,v:this.v},bubbles:!0}))}aInput(B){this.a=parseFloat(B.target.value),this.alignState(),this.sendEvent()}dInput(B){this.d=parseFloat(B.target.value),this.alignState(),this.sendEvent()}kInput(B){this.k=parseFloat(B.target.value),this.alignState(),this.sendEvent()}willUpdate(){this.alignState()}render(){let B,Q,F,U;this.numeric?(B=M`<decidables-spinner class="a bottom"
1697
+ </div>`}update(B){super.update(B),(this.firstUpdate||B.has("running"))&&(this.running?(this.pauseTime&&(this.baseTime+=jt()-this.pauseTime,this.pauseTime=0),this.runner=function(B,Q,F){var U=new $t,t=Q;return U._restart=U.restart,U.restart=function(B,Q,F){Q=+Q,F=null==F?jt():+F,U._restart(function s(I){I+=t,U._restart(s,t+=Q,F),B(I)},Q,F)},U.restart(B,Q,F),U}(this.run.bind(this),20)):void 0!==this.runner&&(this.runner.stop(),this.pauseTime=jt())),this.firstUpdate=!1}reset(){this.runner.stop(),this.running=!1,this.trial=0,this.state="resetted",this.as=0,this.ds=0,this.al=0,this.dl=0,this.baseTime=0,this.pauseTime=0,this.startTime=0,this.lastTime=0}run(){const B=jt(),Q=this.baseTime?B-this.baseTime:0,F=this.baseTime?Q-this.startTime:0;this.lastTime=Q,"resetted"===this.state?(this.state="iti",this.baseTime=B,this.startTime=0,this.dispatchEvent(new CustomEvent("itc-block-start",{detail:{trials:this.trials},bubbles:!0}))):"iti"===this.state&&F>=this.iti?(this.trial+=1,this.state="stimulus",this.startTime=Q,this.as=this.range.as.values[Math.floor(Math.random()*this.range.as.values.length)],this.ds=this.range.ds.values[Math.floor(Math.random()*this.range.ds.values.length)],this.al=this.range.al.values[Math.floor(Math.random()*this.range.al.values.length)],this.dl=this.range.dl.values[Math.floor(Math.random()*this.range.dl.values.length)],this.dispatchEvent(new CustomEvent("itc-trial-start",{detail:{trials:this.trials,duration:this.duration,iti:this.iti,trial:this.trial,as:this.as,ds:this.ds,al:this.al,dl:this.dl},bubbles:!0}))):"stimulus"===this.state&&F>=this.duration&&(this.dispatchEvent(new CustomEvent("itc-trial-end",{detail:{trials:this.trials,duration:this.duration,iti:this.iti,trial:this.trial,as:this.as,ds:this.ds,al:this.al,dl:this.dl},bubbles:!0})),this.trial>=this.trials?(this.runner.stop(),this.running=!1,this.state="ended",this.baseTime=0,this.pauseTime=0,this.startTime=0,this.lastTime=0,this.dispatchEvent(new CustomEvent("itc-block-end",{detail:{trials:this.trial},bubbles:!0}))):(this.state="iti",this.startTime=Q))}}customElements.define("itc-task",Kh);class Oh extends Ha{static get properties(){return{a:{attribute:"amount",type:Number,reflect:!0},d:{attribute:"delay",type:Number,reflect:!0},k:{attribute:"k",type:Number,reflect:!0},v:{attribute:!1,type:Number,reflect:!1}}}constructor(){super(),this.a=100,this.d=30,this.k=Wa.k.DEFAULT,this.alignState()}alignState(){this.v=Wa.adk2v(this.a,this.d,this.k)}sendEvent(){this.dispatchEvent(new CustomEvent("htd-equation-adk2v-change",{detail:{a:this.a,d:this.d,k:this.k,v:this.v},bubbles:!0}))}aInput(B){this.a=parseFloat(B.target.value),this.alignState(),this.sendEvent()}dInput(B){this.d=parseFloat(B.target.value),this.alignState(),this.sendEvent()}kInput(B){this.k=parseFloat(B.target.value),this.alignState(),this.sendEvent()}willUpdate(){this.alignState()}render(){let B,Q,F,U;this.numeric?(B=M`<decidables-spinner class="a bottom"
1677
1698
  ?disabled=${!this.interactive}
1678
1699
  step="1"
1679
1700
  .value=${this.a}
@@ -1723,7 +1744,7 @@ const da=2;let Ca=class{constructor(B){}get _$AU(){return this._$AM._$AU}_$AT(B,
1723
1744
  ${t}
1724
1745
  </tbody>
1725
1746
  </table>
1726
- </div>`}}customElements.define("htd-equation-adk2v",Oh);class jh extends ca{static get styles(){return[super.styles,g`
1747
+ </div>`}}customElements.define("htd-equation-adk2v",Oh);class Ph extends ca{static get styles(){return[super.styles,g`
1727
1748
  :host {
1728
1749
  ---border: var(--border, 1px solid var(---color-border));
1729
1750
  display: inline-block;
@@ -1773,5 +1794,5 @@ const da=2;let Ca=class{constructor(B){}get _$AU(){return this._$AM._$AU}_$AT(B,
1773
1794
  <div class="body">
1774
1795
  <slot>Empty!</slot>
1775
1796
  </div>
1776
- </div>`}}customElements.define("htd-example",jh);class Ph extends jh{static get properties(){return{trials:{attribute:"trials",type:Number,reflect:!0},duration:{attribute:"duration",type:Number,reflect:!0},k:{attribute:!1,type:Number,reflect:!1}}}constructor(){super(),this.trials=10,this.duration=2e3,this.k=Wa.k.DEFAULT,this.discountableControl=null,this.itcTask=null,this.discountableResponse=null,this.htdFit=null,this.htdParameters=null,this.htdCurves=null}connectedCallback(){super.connectedCallback(),this.discountableControl=this.querySelector("discountable-control"),this.itcTask=this.querySelector("itc-task"),this.discountableResponse=this.querySelector("discountable-response"),this.htdFit=this.querySelector("htd-fit"),this.htdParameters=this.querySelector("htd-parameters"),this.htdCurves=this.querySelector("htd-curves"),this.discountableControl&&(this.discountableControl.addEventListener("discountable-control-trials",B=>{this.trials=B.detail.trials}),this.discountableControl.addEventListener("discountable-control-duration",B=>{this.duration=B.detail.duration}),this.discountableControl.addEventListener("discountable-control-run",()=>{this.itcTask&&(this.itcTask.running=!0)}),this.discountableControl.addEventListener("discountable-control-pause",()=>{this.itcTask&&(this.itcTask.running=!1)}),this.discountableControl.addEventListener("discountable-control-reset",()=>{this.itcTask&&this.itcTask.reset(),this.discountableResponse&&this.discountableResponse.reset(),this.htdFit&&this.htdFit.clear(),this.htdCurves&&this.htdCurves.clearOptions()})),this.itcTask&&(this.itcTask.addEventListener("itc-trial-start",B=>{this.discountableResponse&&this.discountableResponse.start(B.detail.as,B.detail.ds,B.detail.al,B.detail.dl,B.detail.trial),this.htdCurves&&(this.htdCurves.setOption(B.detail.as,B.detail.ds,"smaller-sooner","s"),this.htdCurves.setOption(B.detail.al,B.detail.dl,"larger-later","l"))}),this.itcTask.addEventListener("itc-trial-end",()=>{this.discountableResponse&&this.discountableResponse.stop(),this.htdCurves&&(this.htdCurves.removeOption("smaller-sooner"),this.htdCurves.removeOption("larger-later"))}),this.itcTask.addEventListener("itc-block-end",()=>{this.discountableControl&&this.discountableControl.complete()})),this.discountableResponse&&this.discountableResponse.addEventListener("discountable-response",B=>{this.htdFit&&this.htdFit.set(B.detail.as,B.detail.ds,B.detail.al,B.detail.dl,B.detail.response,B.detail.trial.toString(),B.detail.trial.toString())}),this.htdFit&&this.htdFit.addEventListener("htd-fit-update",B=>{this.k=B.detail.k})}update(B){super.update(B),this.discountableControl&&(this.discountableControl.trials=null!=this.discountableControl.trials?this.trials:void 0,this.discountableControl.duration=null!=this.discountableControl.duration?this.duration:void 0),this.discountableResponse&&(this.discountableResponse.trialTotal=this.trials),this.itcTask&&(this.itcTask.duration=this.duration,this.itcTask.iti=this.duration,this.itcTask.trials=this.trials),this.htdCurves&&(this.htdCurves.k=this.k),this.htdParameters&&(this.htdParameters.k=null!=this.htdParameters.k?this.k:void 0)}}customElements.define("htd-example-human",Ph);class _h extends jh{static get properties(){return{as:{attribute:"amount-ss",type:Number,reflect:!0},ds:{attribute:"delay-ss",type:Number,reflect:!0},al:{attribute:"amount-ll",type:Number,reflect:!0},dl:{attribute:"delay-ll",type:Number,reflect:!0},k:{attribute:"k",type:Number,reflect:!0}}}constructor(){super(),this.as=10,this.ds=1,this.al=50,this.dl=40,this.k=Wa.k.DEFAULT,this.htdCalculation=null,this.htdCurves=null,this.htdParameters=null,this.itcChoice=null}connectedCallback(){super.connectedCallback(),this.htdCalculation=this.querySelector("htd-calculation"),this.htdCurves=this.querySelector("htd-curves"),this.htdParameters=this.querySelector("htd-parameters"),this.itcChoice=this.querySelector("itc-choice"),this.htdCalculation&&this.htdCalculation.addEventListener("htd-calculation-change",B=>{this.as=B.detail.as,this.ds=B.detail.ds,this.al=B.detail.al,this.dl=B.detail.dl,this.k=B.detail.k}),this.htdCurves&&this.htdCurves.addEventListener("htd-curves-change",B=>{this.k=B.detail.k,"default"===B.detail.name?(this.as=B.detail.a,this.ds=B.detail.d):"larger-later"===B.detail.name&&(this.al=B.detail.a,this.dl=B.detail.d)}),this.htdParameters&&this.htdParameters.addEventListener("htd-parameters-k",B=>{this.k=B.detail.k}),this.itcChoice&&this.itcChoice.addEventListener("itc-choice-change",B=>{this.as=B.detail.as,this.ds=B.detail.ds,this.al=B.detail.al,this.dl=B.detail.dl}),this.requestUpdate()}update(B){super.update(B),this.htdCalculation&&(this.htdCalculation.as=this.as,this.htdCalculation.ds=this.ds,this.htdCalculation.al=this.al,this.htdCalculation.dl=this.dl,this.htdCalculation.k=this.k),this.htdCurves&&(this.htdCurves.setOption(this.as,this.ds,"default","s"),this.htdCurves.setOption(this.al,this.dl,"larger-later","l"),this.htdCurves.k=this.k),this.htdParameters&&(this.htdParameters.k=null!=this.htdParameters.k?this.k:void 0),this.itcChoice&&(this.itcChoice.as=this.as,this.itcChoice.ds=this.ds,this.itcChoice.al=this.al,this.itcChoice.dl=this.dl)}}customElements.define("htd-example-interactive",_h);class $h extends jh{static get properties(){return{trials:{attribute:"trials",type:Number,reflect:!0},duration:{attribute:"duration",type:Number,reflect:!0},k:{attribute:"k",type:Number,reflect:!0}}}constructor(){super(),this.trials=10,this.duration=2e3,this.k=Wa.k.DEFAULT,this.discountableControl=null,this.discountableResponse=null,this.htdCalculation=null,this.htdCurves=null,this.htdParameters=null,this.itcTask=null}connectedCallback(){super.connectedCallback(),this.discountableControl=this.querySelector("discountable-control"),this.discountableResponse=this.querySelector("discountable-response"),this.htdCalculation=this.querySelector("htd-calculation"),this.htdCurves=this.querySelector("htd-curves"),this.htdParameters=this.querySelector("htd-parameters"),this.itcTask=this.querySelector("itc-task"),this.discountableControl&&(this.discountableControl.addEventListener("discountable-control-trials",B=>{this.trials=B.detail.trials}),this.discountableControl.addEventListener("discountable-control-duration",B=>{this.duration=B.detail.duration}),this.discountableControl.addEventListener("discountable-control-run",()=>{this.htdCurves&&this.htdCurves.resumeTrial(),this.itcTask&&(this.itcTask.running=!0)}),this.discountableControl.addEventListener("discountable-control-pause",()=>{this.htdCurves&&this.htdCurves.pauseTrial(),this.itcTask&&(this.itcTask.running=!1)}),this.discountableControl.addEventListener("discountable-control-reset",()=>{this.discountableResponse&&this.discountableResponse.reset(),this.htdCurves&&this.htdCurves.clearOptions(),this.itcTask&&this.itcTask.reset()})),this.htdCurves&&(this.htdCurves.addEventListener("htd-curves-change",B=>{this.k=B.detail.k}),this.htdCurves.addEventListener("discountable-response",B=>{this.discountableResponse&&this.discountableResponse.responded(B.detail.response)})),this.htdParameters&&this.htdParameters.addEventListener("htd-parameters-k",B=>{this.k=B.detail.k}),this.itcTask&&(this.itcTask.addEventListener("itc-trial-start",B=>{this.discountableResponse&&this.discountableResponse.start(B.detail.as,B.detail.ds,B.detail.al,B.detail.dl,B.detail.trial);const Q=Wa.adk2v(B.detail.as,B.detail.ds,this.k)>Wa.adk2v(B.detail.al,B.detail.dl,this.k)?"first":"second";this.htdCurves&&this.htdCurves.trial(B.detail.as,B.detail.ds,B.detail.al,B.detail.dl,B.detail.trial,Q)}),this.itcTask.addEventListener("itc-trial-end",()=>{this.discountableResponse&&this.discountableResponse.stop()}),this.itcTask.addEventListener("itc-block-end",()=>{this.discountableControl&&this.discountableControl.complete()})),this.requestUpdate()}update(B){super.update(B),this.discountableControl&&(this.discountableControl.trials=null!=this.discountableControl.trials?this.trials:void 0,this.discountableControl.duration=null!=this.discountableControl.duration?this.duration:void 0),this.discountableResponse&&(this.discountableResponse.trialTotal=this.trials),this.itcTask&&(this.itcTask.duration=this.duration,this.itcTask.iti=this.duration,this.itcTask.trials=this.trials),this.htdCalculation&&(this.htdCalculation.k=this.k),this.htdCurves&&(this.htdCurves.k=this.k),this.htdParameters&&(this.htdParameters.k=null!=this.htdParameters.k?this.k:void 0)}}customElements.define("htd-example-model",$h),B.DiscountableControl=ea,B.DiscountableElement=ca,B.DiscountableResponse=na,B.HTDCalculation=Da,B.HTDCurves=fa,B.HTDEquationADK2V=Oh,B.HTDExampleHuman=Ph,B.HTDExampleInteractive=_h,B.HTDExampleModel=$h,B.HTDFit=kh,B.HTDParameters=Mh,B.ITCChoice=zh,B.ITCOption=Th,B.ITCTask=Kh});
1797
+ </div>`}}customElements.define("htd-example",Ph);class jh extends Ph{static get properties(){return{trials:{attribute:"trials",type:Number,reflect:!0},duration:{attribute:"duration",type:Number,reflect:!0},k:{attribute:!1,type:Number,reflect:!1}}}constructor(){super(),this.trials=10,this.duration=2e3,this.k=Wa.k.DEFAULT,this.discountableControl=null,this.itcTask=null,this.discountableResponse=null,this.htdFit=null,this.htdParameters=null,this.htdCurves=null}connectedCallback(){super.connectedCallback(),this.discountableControl=this.querySelector("discountable-control"),this.itcTask=this.querySelector("itc-task"),this.discountableResponse=this.querySelector("discountable-response"),this.htdFit=this.querySelector("htd-fit"),this.htdParameters=this.querySelector("htd-parameters"),this.htdCurves=this.querySelector("htd-curves"),this.discountableControl&&(this.discountableControl.addEventListener("discountable-control-trials",B=>{this.trials=B.detail.trials}),this.discountableControl.addEventListener("discountable-control-duration",B=>{this.duration=B.detail.duration}),this.discountableControl.addEventListener("discountable-control-run",()=>{this.itcTask&&(this.itcTask.running=!0)}),this.discountableControl.addEventListener("discountable-control-pause",()=>{this.itcTask&&(this.itcTask.running=!1)}),this.discountableControl.addEventListener("discountable-control-reset",()=>{this.itcTask&&this.itcTask.reset(),this.discountableResponse&&this.discountableResponse.reset(),this.htdFit&&this.htdFit.clear(),this.htdCurves&&this.htdCurves.clearOptions()})),this.itcTask&&(this.itcTask.addEventListener("itc-trial-start",B=>{this.discountableResponse&&this.discountableResponse.start(B.detail.as,B.detail.ds,B.detail.al,B.detail.dl,B.detail.trial),this.htdCurves&&(this.htdCurves.setOption(B.detail.as,B.detail.ds,"smaller-sooner","s"),this.htdCurves.setOption(B.detail.al,B.detail.dl,"larger-later","l"))}),this.itcTask.addEventListener("itc-trial-end",()=>{this.discountableResponse&&this.discountableResponse.stop(),this.htdCurves&&(this.htdCurves.removeOption("smaller-sooner"),this.htdCurves.removeOption("larger-later"))}),this.itcTask.addEventListener("itc-block-end",()=>{this.discountableControl&&this.discountableControl.complete()})),this.discountableResponse&&this.discountableResponse.addEventListener("discountable-response",B=>{this.htdFit&&this.htdFit.set(B.detail.as,B.detail.ds,B.detail.al,B.detail.dl,B.detail.response,B.detail.trial.toString(),B.detail.trial.toString())}),this.htdFit&&this.htdFit.addEventListener("htd-fit-update",B=>{this.k=B.detail.k})}update(B){super.update(B),this.discountableControl&&(this.discountableControl.trials=null!=this.discountableControl.trials?this.trials:void 0,this.discountableControl.duration=null!=this.discountableControl.duration?this.duration:void 0),this.discountableResponse&&(this.discountableResponse.trialTotal=this.trials),this.itcTask&&(this.itcTask.duration=this.duration,this.itcTask.iti=this.duration,this.itcTask.trials=this.trials),this.htdCurves&&(this.htdCurves.k=this.k),this.htdParameters&&(this.htdParameters.k=null!=this.htdParameters.k?this.k:void 0)}}customElements.define("htd-example-human",jh);class _h extends Ph{static get properties(){return{as:{attribute:"amount-ss",type:Number,reflect:!0},ds:{attribute:"delay-ss",type:Number,reflect:!0},al:{attribute:"amount-ll",type:Number,reflect:!0},dl:{attribute:"delay-ll",type:Number,reflect:!0},k:{attribute:"k",type:Number,reflect:!0}}}constructor(){super(),this.as=10,this.ds=1,this.al=50,this.dl=40,this.k=Wa.k.DEFAULT,this.htdCalculation=null,this.htdCurves=null,this.htdParameters=null,this.itcChoice=null}connectedCallback(){super.connectedCallback(),this.htdCalculation=this.querySelector("htd-calculation"),this.htdCurves=this.querySelector("htd-curves"),this.htdParameters=this.querySelector("htd-parameters"),this.itcChoice=this.querySelector("itc-choice"),this.htdCalculation&&this.htdCalculation.addEventListener("htd-calculation-change",B=>{this.as=B.detail.as,this.ds=B.detail.ds,this.al=B.detail.al,this.dl=B.detail.dl,this.k=B.detail.k}),this.htdCurves&&this.htdCurves.addEventListener("htd-curves-change",B=>{this.k=B.detail.k,"default"===B.detail.name?(this.as=B.detail.a,this.ds=B.detail.d):"larger-later"===B.detail.name&&(this.al=B.detail.a,this.dl=B.detail.d)}),this.htdParameters&&this.htdParameters.addEventListener("htd-parameters-k",B=>{this.k=B.detail.k}),this.itcChoice&&this.itcChoice.addEventListener("itc-choice-change",B=>{this.as=B.detail.as,this.ds=B.detail.ds,this.al=B.detail.al,this.dl=B.detail.dl}),this.requestUpdate()}update(B){super.update(B),this.htdCalculation&&(this.htdCalculation.as=this.as,this.htdCalculation.ds=this.ds,this.htdCalculation.al=this.al,this.htdCalculation.dl=this.dl,this.htdCalculation.k=this.k),this.htdCurves&&(this.htdCurves.setOption(this.as,this.ds,"default","s"),this.htdCurves.setOption(this.al,this.dl,"larger-later","l"),this.htdCurves.k=this.k),this.htdParameters&&(this.htdParameters.k=null!=this.htdParameters.k?this.k:void 0),this.itcChoice&&(this.itcChoice.as=this.as,this.itcChoice.ds=this.ds,this.itcChoice.al=this.al,this.itcChoice.dl=this.dl)}}customElements.define("htd-example-interactive",_h);class $h extends Ph{static get properties(){return{trials:{attribute:"trials",type:Number,reflect:!0},duration:{attribute:"duration",type:Number,reflect:!0},k:{attribute:"k",type:Number,reflect:!0}}}constructor(){super(),this.trials=10,this.duration=2e3,this.k=Wa.k.DEFAULT,this.discountableControl=null,this.discountableResponse=null,this.htdCalculation=null,this.htdCurves=null,this.htdParameters=null,this.itcTask=null}connectedCallback(){super.connectedCallback(),this.discountableControl=this.querySelector("discountable-control"),this.discountableResponse=this.querySelector("discountable-response"),this.htdCalculation=this.querySelector("htd-calculation"),this.htdCurves=this.querySelector("htd-curves"),this.htdParameters=this.querySelector("htd-parameters"),this.itcTask=this.querySelector("itc-task"),this.discountableControl&&(this.discountableControl.addEventListener("discountable-control-trials",B=>{this.trials=B.detail.trials}),this.discountableControl.addEventListener("discountable-control-duration",B=>{this.duration=B.detail.duration}),this.discountableControl.addEventListener("discountable-control-run",()=>{this.htdCurves&&this.htdCurves.resumeTrial(),this.itcTask&&(this.itcTask.running=!0)}),this.discountableControl.addEventListener("discountable-control-pause",()=>{this.htdCurves&&this.htdCurves.pauseTrial(),this.itcTask&&(this.itcTask.running=!1)}),this.discountableControl.addEventListener("discountable-control-reset",()=>{this.discountableResponse&&this.discountableResponse.reset(),this.htdCurves&&this.htdCurves.clearOptions(),this.itcTask&&this.itcTask.reset()})),this.htdCurves&&(this.htdCurves.addEventListener("htd-curves-change",B=>{this.k=B.detail.k}),this.htdCurves.addEventListener("discountable-response",B=>{this.discountableResponse&&this.discountableResponse.responded(B.detail.response)})),this.htdParameters&&this.htdParameters.addEventListener("htd-parameters-k",B=>{this.k=B.detail.k}),this.itcTask&&(this.itcTask.addEventListener("itc-trial-start",B=>{this.discountableResponse&&this.discountableResponse.start(B.detail.as,B.detail.ds,B.detail.al,B.detail.dl,B.detail.trial);const Q=Wa.adk2v(B.detail.as,B.detail.ds,this.k)>Wa.adk2v(B.detail.al,B.detail.dl,this.k)?"first":"second";this.htdCurves&&this.htdCurves.trial(B.detail.as,B.detail.ds,B.detail.al,B.detail.dl,B.detail.trial,Q)}),this.itcTask.addEventListener("itc-trial-end",()=>{this.discountableResponse&&this.discountableResponse.stop()}),this.itcTask.addEventListener("itc-block-end",()=>{this.discountableControl&&this.discountableControl.complete()})),this.requestUpdate()}update(B){super.update(B),this.discountableControl&&(this.discountableControl.trials=null!=this.discountableControl.trials?this.trials:void 0,this.discountableControl.duration=null!=this.discountableControl.duration?this.duration:void 0),this.discountableResponse&&(this.discountableResponse.trialTotal=this.trials),this.itcTask&&(this.itcTask.duration=this.duration,this.itcTask.iti=this.duration,this.itcTask.trials=this.trials),this.htdCalculation&&(this.htdCalculation.k=this.k),this.htdCurves&&(this.htdCurves.k=this.k),this.htdParameters&&(this.htdParameters.k=null!=this.htdParameters.k?this.k:void 0)}}customElements.define("htd-example-model",$h),B.DiscountableControl=ea,B.DiscountableElement=ca,B.DiscountableResponse=na,B.HTDCalculation=Da,B.HTDCurves=Ya,B.HTDEquationADK2V=Oh,B.HTDExampleHuman=jh,B.HTDExampleInteractive=_h,B.HTDExampleModel=$h,B.HTDFit=kh,B.HTDParameters=Mh,B.ITCChoice=zh,B.ITCOption=Th,B.ITCTask=Kh});
1777
1798
  //# sourceMappingURL=discountableElements.umd.min.js.map