@decidables/discountable-elements 0.3.8 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -0
- package/README.md +62 -5
- package/lib/discountableElements.esm.js +4907 -4076
- package/lib/discountableElements.esm.js.map +1 -1
- package/lib/discountableElements.esm.min.js +325 -171
- package/lib/discountableElements.esm.min.js.map +1 -1
- package/lib/discountableElements.umd.js +4912 -4080
- package/lib/discountableElements.umd.js.map +1 -1
- package/lib/discountableElements.umd.min.js +297 -143
- package/lib/discountableElements.umd.min.js.map +1 -1
- package/package.json +6 -6
- package/src/components/discountable-control.js +2 -2
- package/src/components/discountable-response.js +24 -0
- package/src/components/htd-calculation.js +44 -8
- package/src/components/htd-curves.js +179 -37
- package/src/components/htd-fit-worker.js +1 -1
- package/src/components/htd-fit.js +32 -4
- package/src/components/htd-parameters.js +112 -0
- package/src/components/index.js +1 -0
- package/src/equations/adk2v.js +30 -5
- package/src/examples/human.js +110 -64
- package/src/examples/interactive.js +18 -1
- package/src/examples/model.js +89 -65
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
!function(
|
|
1
|
+
!function(B,Q){"object"==typeof exports&&"undefined"!=typeof module?Q(exports):"function"==typeof define&&define.amd?define(["exports"],Q):Q((B="undefined"!=typeof globalThis?globalThis:B||self).discountableElements={})}(this,(function(B){"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* @license
|
|
4
4
|
* Copyright 2019 Google LLC
|
|
5
5
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
6
|
-
*/const
|
|
6
|
+
*/const Q=globalThis,F=Q.ShadowRoot&&(void 0===Q.ShadyCSS||Q.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,t=Symbol(),U=new WeakMap;let I=class{constructor(B,Q,F){if(this._$cssResult$=!0,F!==t)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=U.get(Q)),void 0===B&&((this.o=B=new CSSStyleSheet).replaceSync(this.cssText),F&&U.set(Q,B))}return B}toString(){return this.cssText}};const s=B=>new I("string"==typeof B?B:B+"",void 0,t),g=(B,...Q)=>{const F=1===B.length?B[0]:Q.reduce(((Q,F,t)=>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[t+1]),B[0]);return new I(F,B,t)},i=F?B=>B:B=>B instanceof CSSStyleSheet?(B=>{let Q="";for(const F of B.cssRules)Q+=F.cssText;return s(Q)})(B):B
|
|
7
7
|
/**
|
|
8
8
|
* @license
|
|
9
9
|
* Copyright 2017 Google LLC
|
|
10
10
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
11
|
-
*/,{is:
|
|
11
|
+
*/,{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),A={attribute:!0,type:String,converter:r,reflect:!1,hasChanged:x};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.elementProperties.set(B,Q),!Q.noAccessor){const F=Symbol(),t=this.getPropertyDescriptor(B,F,Q);void 0!==t&&c(this.prototype,B,t)}}static getPropertyDescriptor(B,Q,F){const{get:t,set:U}=e(this.prototype,B)??{get(){return this[Q]},set(B){this[Q]=B}};return{get(){return t?.call(this)},set(Q){const I=t?.call(this);U.call(this,Q),this.requestUpdate(B,I,F)},configurable:!0,enumerable:!0}}static getPropertyOptions(B){return this.elementProperties.get(B)??A}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,t)=>{if(F)B.adoptedStyleSheets=t.map((B=>B instanceof CSSStyleSheet?B:B.styleSheet));else for(const F of t){const t=document.createElement("style"),U=Q.litNonce;void 0!==U&&t.setAttribute("nonce",U),t.textContent=F.cssText,B.appendChild(t)}})(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)}_$EC(B,Q){const F=this.constructor.elementProperties.get(B),t=this.constructor._$Eu(B,F);if(void 0!==t&&!0===F.reflect){const U=(void 0!==F.converter?.toAttribute?F.converter:r).toAttribute(Q,F.type);this._$Em=B,null==U?this.removeAttribute(t):this.setAttribute(t,U),this._$Em=null}}_$AK(B,Q){const F=this.constructor,t=F._$Eh.get(B);if(void 0!==t&&this._$Em!==t){const B=F.getPropertyOptions(t),U="function"==typeof B.converter?{fromAttribute:B.converter}:void 0!==B.converter?.fromAttribute?B.converter:r;this._$Em=t,this[t]=U.fromAttribute(Q,B.type),this._$Em=null}}requestUpdate(B,Q,F){if(void 0!==B){if(F??=this.constructor.getPropertyOptions(B),!(F.hasChanged??x)(this[B],Q))return;this.P(B,Q,F)}!1===this.isUpdatePending&&(this._$ES=this._$ET())}P(B,Q,F){this._$AL.has(B)||this._$AL.set(B,Q),!0===F.reflect&&this._$Em!==B&&(this._$Ej??=new Set).add(B)}async _$ET(){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)!0!==F.wrapped||this._$AL.has(Q)||void 0===this[Q]||this.P(Q,this[Q],F)}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._$EU()}catch(Q){throw B=!1,this._$EU(),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)}_$EU(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(B){return!0}update(B){this._$Ej&&=this._$Ej.forEach((B=>this._$EC(B,this[B]))),this._$EU()}updated(B){}firstUpdated(B){}};L.elementStyles=[],L.shadowRootOptions={mode:"open"},L[u("elementProperties")]=new Map,L[u("finalized")]=new Map,G?.({ReactiveElement:L}),(a.reactiveElementVersions??=[]).push("2.0.4");
|
|
12
12
|
/**
|
|
13
13
|
* @license
|
|
14
14
|
* Copyright 2017 Google LLC
|
|
15
15
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
16
16
|
*/
|
|
17
|
-
const
|
|
17
|
+
const h=globalThis,y=h.trustedTypes,R=y?y.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,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,P=E.createTreeWalker(E,129);function j(B,Q){if(!p(B)||!B.hasOwnProperty("raw"))throw Error("invalid template strings array");return void 0!==R?R.createHTML(Q):Q}let _=class B{constructor({strings:Q,_$litType$:F},t){let U;this.parts=[];let I=0,s=0;const g=Q.length-1,i=this.parts,[l,c]=((B,Q)=>{const F=B.length-1,t=[];let U,I=2===Q?"<svg>":3===Q?"<math>":"",s=H;for(let Q=0;Q<F;Q++){const F=B[Q];let g,i,l=-1,c=0;for(;c<F.length&&(s.lastIndex=c,i=s.exec(F),null!==i);)c=s.lastIndex,s===H?"!--"===i[1]?s=D:void 0!==i[1]?s=Y:void 0!==i[2]?(J.test(i[2])&&(U=RegExp("</"+i[2],"g")),s=f):void 0!==i[3]&&(s=f):s===f?">"===i[0]?(s=U??H,l=-1):void 0===i[1]?l=-2:(l=s.lastIndex-i[2].length,g=i[1],s=void 0===i[3]?f:'"'===i[3]?v:w):s===v||s===w?s=f:s===D||s===Y?s=H:(s=f,U=void 0);const e=s===f&&B[Q+1].startsWith("/>")?" ":"";I+=s===H?F+m:l>=0?(t.push(g),F.slice(0,l)+V+F.slice(l)+Z+e):F+Z+(-2===l?Q:e)}return[j(B,I+(B[F]||"<?>")+(2===Q?"</svg>":3===Q?"</math>":"")),t]})(Q,F);if(this.el=B.createElement(l,t),P.currentNode=this.el.content,2===F||3===F){const B=this.el.content.firstChild;B.replaceWith(...B.childNodes)}for(;null!==(U=P.nextNode())&&i.length<g;){if(1===U.nodeType){if(U.hasAttributes())for(const B of U.getAttributeNames())if(B.endsWith(V)){const Q=c[s++],F=U.getAttribute(B).split(Z),t=/([.?@])?(.*)/.exec(Q);i.push({type:1,index:I,name:t[2],strings:F,ctor:"."===t[1]?FB:"?"===t[1]?tB:"@"===t[1]?UB:QB}),U.removeAttribute(B)}else B.startsWith(Z)&&(i.push({type:6,index:I}),U.removeAttribute(B));if(J.test(U.tagName)){const B=U.textContent.split(Z),Q=B.length-1;if(Q>0){U.textContent=y?y.emptyScript:"";for(let F=0;F<Q;F++)U.append(B[F],N()),P.nextNode(),i.push({type:2,index:++I});U.append(B[Q],N())}}}else if(8===U.nodeType)if(U.data===S)i.push({type:2,index:I});else{let B=-1;for(;-1!==(B=U.data.indexOf(Z,B+1));)i.push({type:7,index:I}),B+=Z.length-1}I++}}static createElement(B,Q){const F=E.createElement("template");return F.innerHTML=B,F}};function $(B,Q,F=B,t){if(Q===z)return Q;let U=void 0!==t?F._$Co?.[t]:F._$Cl;const I=X(Q)?void 0:Q._$litDirective$;return U?.constructor!==I&&(U?._$AO?.(!1),void 0===I?U=void 0:(U=new I(B),U._$AT(B,F,t)),void 0!==t?(F._$Co??=[])[t]=U:F._$Cl=U),void 0!==U&&(Q=$(B,U._$AS(B,Q.values),U,t)),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,t=(B?.creationScope??E).importNode(Q,!0);P.currentNode=t;let U=P.nextNode(),I=0,s=0,g=F[0];for(;void 0!==g;){if(I===g.index){let Q;2===g.type?Q=new BB(U,U.nextSibling,this,B):1===g.type?Q=new g.ctor(U,g.name,g.strings,this,B):6===g.type&&(Q=new IB(U,this,B)),this._$AV.push(Q),g=F[++s]}I!==g?.index&&(U=P.nextNode(),I++)}return P.currentNode=E,t}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,t){this.type=2,this._$AH=K,this._$AN=void 0,this._$AA=B,this._$AB=Q,this._$AM=F,this.options=t,this._$Cv=t?.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,t="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===t)this._$AH.p(Q);else{const B=new q(t,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,t=0;for(const U of B)t===Q.length?Q.push(F=new BB(this.O(N()),this.O(N()),this,this.options)):F=Q[t],F._$AI(U),t++;t<Q.length&&(this._$AR(F&&F._$AB.nextSibling,t),Q.length=t)}_$AR(B=this._$AA.nextSibling,Q){for(this._$AP?.(!1,!0,Q);B&&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,t,U){this.type=1,this._$AH=K,this._$AN=void 0,this.element=B,this.name=Q,this._$AM=t,this.options=U,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,t){const U=this.strings;let I=!1;if(void 0===U)B=$(this,B,Q,0),I=!X(B)||B!==this._$AH&&B!==z,I&&(this._$AH=B);else{const t=B;let s,g;for(B=U[0],s=0;s<U.length-1;s++)g=$(this,t[F+s],Q,s),g===z&&(g=this._$AH[s]),I||=!X(g)||g!==this._$AH[s],g===K?B=K:B!==K&&(B+=(g??"")+U[s+1]),this._$AH[s]=g}I&&!t&&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 tB extends QB{constructor(){super(...arguments),this.type=4}j(B){this.element.toggleAttribute(this.name,!!B&&B!==K)}}class UB extends QB{constructor(B,Q,F,t,U){super(B,Q,F,t,U),this.type=5}_$AI(B,Q=this){if((B=$(this,B,Q,0)??K)===z)return;const F=this._$AH,t=B===K&&F!==K||B.capture!==F.capture||B.once!==F.once||B.passive!==F.passive,U=B!==K&&(F===K||t);t&&this.element.removeEventListener(this.name,this,F),U&&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 IB{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 sB=h.litHtmlPolyfillSupport;sB?.(_,BB),(h.litHtmlVersions??=[]).push("3.2.1");
|
|
18
18
|
/**
|
|
19
19
|
* @license
|
|
20
20
|
* Copyright 2017 Google LLC
|
|
21
21
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
22
22
|
*/
|
|
23
|
-
let rt=class extends G{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const e=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=((t,e,n)=>{const i=n?.renderBefore??e;let s=i._$litPart$;if(void 0===s){const t=n?.renderBefore??null;i._$litPart$=s=new tt(e.insertBefore(v(),t),t,void 0,n??{})}return s._$AI(t),s})(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return z}};rt._$litElement$=!0,rt.finalized=!0,globalThis.litElementHydrateSupport?.({LitElement:rt});const ot=globalThis.litElementPolyfillSupport;function gt(t,e){return null==t||null==e?NaN:t<e?-1:t>e?1:t>=e?0:NaN}function Bt(t,e){return null==t||null==e?NaN:e<t?-1:e>t?1:e>=t?0:NaN}function dt(t){let e,n,i;function s(t,i,s=0,c=t.length){if(s<c){if(0!==e(i,i))return c;do{const e=s+c>>>1;n(t[e],i)<0?s=e+1:c=e}while(s<c)}return s}return 2!==t.length?(e=gt,n=(e,n)=>gt(t(e),n),i=(e,n)=>t(e)-n):(e=t===gt||t===Bt?t:It,n=t,i=t),{left:s,center:function(t,e,n=0,c=t.length){const a=s(t,e,n,c-1);return a>n&&i(t[a-1],e)>-i(t[a],e)?a-1:a},right:function(t,i,s=0,c=t.length){if(s<c){if(0!==e(i,i))return c;do{const e=s+c>>>1;n(t[e],i)<=0?s=e+1:c=e}while(s<c)}return s}}}function It(){return 0}function Qt(t){return null===t?NaN:+t}ot?.({LitElement:rt}),(globalThis.litElementVersions??=[]).push("4.0.5");const ut=dt(gt).right;function Ft(t,e){let n=0;for(let e of t)null!=e&&(e=+e)>=e&&++n;return n}function ht(t){return 0|t.length}function bt(t){return!(t>0)}function Ut(t){return"object"!=typeof t||"length"in t?t:Array.from(t)}function Ct(t,e){var n=0;return Float64Array.from(t,(t=>n+=+t||0))}function yt(t,e){let n,i=0,s=0,c=0;if(void 0===e)for(let e of t)null!=e&&(e=+e)>=e&&(n=e-s,s+=n/++i,c+=n*(e-s));else{let a=-1;for(let l of t)null!=(l=e(l,++a,t))&&(l=+l)>=l&&(n=l-s,s+=n/++i,c+=n*(l-s))}if(i>1)return c/(i-1)}function ft(t,e){const n=yt(t,e);return n?Math.sqrt(n):n}function Gt(t,e){let n,i;if(void 0===e)for(const e of t)null!=e&&(void 0===n?e>=e&&(n=i=e):(n>e&&(n=e),i<e&&(i=e)));else{let s=-1;for(let c of t)null!=(c=e(c,++s,t))&&(void 0===n?c>=c&&(n=i=c):(n>c&&(n=c),i<c&&(i=c)))}return[n,i]}dt(Qt).center;class pt{constructor(){this._partials=new Float64Array(32),this._n=0}add(t){const e=this._partials;let n=0;for(let i=0;i<this._n&&i<32;i++){const s=e[i],c=t+s,a=Math.abs(t)<Math.abs(s)?t-(c-s):s-(c-t);a&&(e[n++]=a),t=c}return e[n]=t,this._n=n+1,this}valueOf(){const t=this._partials;let e,n,i,s=this._n,c=0;if(s>0){for(c=t[--s];s>0&&(e=c,n=t[--s],c=e+n,i=n-(c-e),!i););s>0&&(i<0&&t[s-1]<0||i>0&&t[s-1]>0)&&(n=2*i,e=c+n,n==e-c&&(c=e))}return c}}class mt extends Map{constructor(t,e=Rt){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:e}}),null!=t)for(const[e,n]of t)this.set(e,n)}get(t){return super.get(xt(this,t))}has(t){return super.has(xt(this,t))}set(t,e){return super.set(St(this,t),e)}delete(t){return super.delete(Lt(this,t))}}class At extends Set{constructor(t,e=Rt){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:e}}),null!=t)for(const e of t)this.add(e)}has(t){return super.has(xt(this,t))}add(t){return super.add(St(this,t))}delete(t){return super.delete(Lt(this,t))}}function xt({_intern:t,_key:e},n){const i=e(n);return t.has(i)?t.get(i):n}function St({_intern:t,_key:e},n){const i=e(n);return t.has(i)?t.get(i):(t.set(i,n),n)}function Lt({_intern:t,_key:e},n){const i=e(n);return t.has(i)&&(n=t.get(i),t.delete(i)),n}function Rt(t){return null!==t&&"object"==typeof t?t.valueOf():t}function Xt(t){return t}function vt(t,...e){return Et(t,Xt,Xt,e)}function Nt(t,e,...n){return Et(t,Xt,e,n)}function Zt(t,e,...n){return Et(t,Array.from,e,n)}function Et(t,e,n,i){return function t(s,c){if(c>=i.length)return n(s);const a=new mt,l=i[c++];let r=-1;for(const t of s){const e=l(t,++r,s),n=a.get(e);n?n.push(t):a.set(e,[t])}for(const[e,n]of a)a.set(e,t(n,c));return e(a)}(t,0)}function Vt(t,...e){if("function"!=typeof t[Symbol.iterator])throw new TypeError("values is not iterable");t=Array.from(t);let[n]=e;if(n&&2!==n.length||e.length>1){const c=Uint32Array.from(t,((t,e)=>e));return e.length>1?(e=e.map((e=>t.map(e))),c.sort(((t,n)=>{for(const i of e){const e=Wt(i[t],i[n]);if(e)return e}}))):(n=t.map(n),c.sort(((t,e)=>Wt(n[t],n[e])))),i=t,s=c,Array.from(s,(t=>i[t]))}var i,s;return t.sort(wt(n))}function wt(t=gt){if(t===gt)return Wt;if("function"!=typeof t)throw new TypeError("compare is not a function");return(e,n)=>{const i=t(e,n);return i||0===i?i:(0===t(n,n))-(0===t(e,e))}}function Wt(t,e){return(null==t||!(t>=t))-(null==e||!(e>=e))||(t<e?-1:t>e?1:0)}function Ht(t,e,n){return(2!==e.length?Vt(Nt(t,e,n),(([t,e],[n,i])=>gt(e,i)||gt(t,n))):Vt(vt(t,n),(([t,n],[i,s])=>e(n,s)||gt(t,i)))).map((([t])=>t))}const Dt=Math.sqrt(50),Yt=Math.sqrt(10),kt=Math.sqrt(2);function Jt(t,e,n){const i=(e-t)/Math.max(0,n),s=Math.floor(Math.log10(i)),c=i/Math.pow(10,s),a=c>=Dt?10:c>=Yt?5:c>=kt?2:1;let l,r,o;return s<0?(o=Math.pow(10,-s)/a,l=Math.round(t*o),r=Math.round(e*o),l/o<t&&++l,r/o>e&&--r,o=-o):(o=Math.pow(10,s)*a,l=Math.round(t/o),r=Math.round(e/o),l*o<t&&++l,r*o>e&&--r),r<l&&.5<=n&&n<2?Jt(t,e,2*n):[l,r,o]}function Mt(t,e,n){if(!((n=+n)>0))return[];if((t=+t)===(e=+e))return[t];const i=e<t,[s,c,a]=i?Jt(e,t,n):Jt(t,e,n);if(!(c>=s))return[];const l=c-s+1,r=new Array(l);if(i)if(a<0)for(let t=0;t<l;++t)r[t]=(c-t)/-a;else for(let t=0;t<l;++t)r[t]=(c-t)*a;else if(a<0)for(let t=0;t<l;++t)r[t]=(s+t)/-a;else for(let t=0;t<l;++t)r[t]=(s+t)*a;return r}function Tt(t,e,n){return Jt(t=+t,e=+e,n=+n)[2]}function zt(t,e,n){n=+n;const i=(e=+e)<(t=+t),s=i?Tt(e,t,n):Tt(t,e,n);return(i?-1:1)*(s<0?1/-s:s)}function Kt(t){return Math.max(1,Math.ceil(Math.log(Ft(t))/Math.LN2)+1)}function Ot(t,e){let n;if(void 0===e)for(const e of t)null!=e&&(n<e||void 0===n&&e>=e)&&(n=e);else{let i=-1;for(let s of t)null!=(s=e(s,++i,t))&&(n<s||void 0===n&&s>=s)&&(n=s)}return n}function _t(t,e){let n,i=-1,s=-1;if(void 0===e)for(const e of t)++s,null!=e&&(n<e||void 0===n&&e>=e)&&(n=e,i=s);else for(let c of t)null!=(c=e(c,++s,t))&&(n<c||void 0===n&&c>=c)&&(n=c,i=s);return i}function Pt(t,e){let n;if(void 0===e)for(const e of t)null!=e&&(n>e||void 0===n&&e>=e)&&(n=e);else{let i=-1;for(let s of t)null!=(s=e(s,++i,t))&&(n>s||void 0===n&&s>=s)&&(n=s)}return n}function jt(t,e){let n,i=-1,s=-1;if(void 0===e)for(const e of t)++s,null!=e&&(n>e||void 0===n&&e>=e)&&(n=e,i=s);else for(let c of t)null!=(c=e(c,++s,t))&&(n>c||void 0===n&&c>=c)&&(n=c,i=s);return i}function $t(t,e,n=0,i=1/0,s){if(e=Math.floor(e),n=Math.floor(Math.max(0,n)),i=Math.floor(Math.min(t.length-1,i)),!(n<=e&&e<=i))return t;for(s=void 0===s?Wt:wt(s);i>n;){if(i-n>600){const c=i-n+1,a=e-n+1,l=Math.log(c),r=.5*Math.exp(2*l/3),o=.5*Math.sqrt(l*r*(c-r)/c)*(a-c/2<0?-1:1);$t(t,e,Math.max(n,Math.floor(e-a*r/c+o)),Math.min(i,Math.floor(e+(c-a)*r/c+o)),s)}const c=t[e];let a=n,l=i;for(qt(t,n,e),s(t[i],c)>0&&qt(t,n,i);a<l;){for(qt(t,a,l),++a,--l;s(t[a],c)<0;)++a;for(;s(t[l],c)>0;)--l}0===s(t[n],c)?qt(t,n,l):(++l,qt(t,l,i)),l<=e&&(n=l+1),e<=l&&(i=l-1)}return t}function qt(t,e,n){const i=t[e];t[e]=t[n],t[n]=i}function te(t,e=gt){let n,i=!1;if(1===e.length){let s;for(const c of t){const t=e(c);(i?gt(t,s)>0:0===gt(t,t))&&(n=c,s=t,i=!0)}}else for(const s of t)(i?e(s,n)>0:0===e(s,s))&&(n=s,i=!0);return n}function ee(t,e,n){if(t=Float64Array.from(function*(t,e){if(void 0===e)for(let e of t)null!=e&&(e=+e)>=e&&(yield e);else{let n=-1;for(let i of t)null!=(i=e(i,++n,t))&&(i=+i)>=i&&(yield i)}}(t,n)),(i=t.length)&&!isNaN(e=+e)){if(e<=0||i<2)return Pt(t);if(e>=1)return Ot(t);var i,s=(i-1)*e,c=Math.floor(s),a=Ot($t(t,c).subarray(0,c+1));return a+(Pt(t.subarray(c+1))-a)*(s-c)}}function ne(t,e,n=Qt){if((i=t.length)&&!isNaN(e=+e)){if(e<=0||i<2)return+n(t[0],0,t);if(e>=1)return+n(t[i-1],i-1,t);var i,s=(i-1)*e,c=Math.floor(s),a=+n(t[c],c,t);return a+(+n(t[c+1],c+1,t)-a)*(s-c)}}function ie(t,e,n){const i=Ft(t),s=ee(t,.75)-ee(t,.25);return i&&s?Math.ceil((n-e)/(2*s*Math.pow(i,-1/3))):1}function se(t,e,n){const i=Ft(t),s=ft(t);return i&&s?Math.ceil((n-e)*Math.cbrt(i)/(3.49*s)):1}function ce(t,e){let n=0,i=0;if(void 0===e)for(let e of t)null!=e&&(e=+e)>=e&&(++n,i+=e);else{let s=-1;for(let c of t)null!=(c=e(c,++s,t))&&(c=+c)>=c&&(++n,i+=c)}if(n)return i/n}function ae(t,e){return ee(t,.5,e)}function le(t){return Array.from(function*(t){for(const e of t)yield*e}(t))}function re(t,e){const n=new mt;if(void 0===e)for(let e of t)null!=e&&e>=e&&n.set(e,(n.get(e)||0)+1);else{let i=-1;for(let s of t)null!=(s=e(s,++i,t))&&s>=s&&n.set(s,(n.get(s)||0)+1)}let i,s=0;for(const[t,e]of n)e>s&&(s=e,i=t);return i}function oe(t,e){return[t,e]}function ge(t,e,n){t=+t,e=+e,n=(s=arguments.length)<2?(e=t,t=0,1):s<3?1:+n;for(var i=-1,s=0|Math.max(0,Math.ceil((e-t)/n)),c=new Array(s);++i<s;)c[i]=t+i*n;return c}function Be(t,e){let n=0;if(void 0===e)for(let e of t)(e=+e)&&(n+=e);else{let i=-1;for(let s of t)(s=+e(s,++i,t))&&(n+=s)}return n}function de(t){if("function"!=typeof t[Symbol.iterator])throw new TypeError("values is not iterable");return Array.from(t).reverse()}function Ie(t){return t}var Qe=1,ue=2,Fe=3,he=4,be=1e-6;function Ue(t){return"translate("+t+",0)"}function Ce(t){return"translate(0,"+t+")"}function ye(t){return e=>+t(e)}function fe(t,e){return e=Math.max(0,t.bandwidth()-2*e)/2,t.round()&&(e=Math.round(e)),n=>+t(n)+e}function Ge(){return!this.__axis}function pe(t,e){var n=[],i=null,s=null,c=6,a=6,l=3,r="undefined"!=typeof window&&window.devicePixelRatio>1?0:.5,o=t===Qe||t===he?-1:1,g=t===he||t===ue?"x":"y",B=t===Qe||t===Fe?Ue:Ce;function d(d){var I=null==i?e.ticks?e.ticks.apply(e,n):e.domain():i,Q=null==s?e.tickFormat?e.tickFormat.apply(e,n):Ie:s,u=Math.max(c,0)+l,F=e.range(),h=+F[0]+r,b=+F[F.length-1]+r,U=(e.bandwidth?fe:ye)(e.copy(),r),C=d.selection?d.selection():d,y=C.selectAll(".domain").data([null]),f=C.selectAll(".tick").data(I,e).order(),G=f.exit(),p=f.enter().append("g").attr("class","tick"),m=f.select("line"),A=f.select("text");y=y.merge(y.enter().insert("path",".tick").attr("class","domain").attr("stroke","currentColor")),f=f.merge(p),m=m.merge(p.append("line").attr("stroke","currentColor").attr(g+"2",o*c)),A=A.merge(p.append("text").attr("fill","currentColor").attr(g,o*u).attr("dy",t===Qe?"0em":t===Fe?"0.71em":"0.32em")),d!==C&&(y=y.transition(d),f=f.transition(d),m=m.transition(d),A=A.transition(d),G=G.transition(d).attr("opacity",be).attr("transform",(function(t){return isFinite(t=U(t))?B(t+r):this.getAttribute("transform")})),p.attr("opacity",be).attr("transform",(function(t){var e=this.parentNode.__axis;return B((e&&isFinite(e=e(t))?e:U(t))+r)}))),G.remove(),y.attr("d",t===he||t===ue?a?"M"+o*a+","+h+"H"+r+"V"+b+"H"+o*a:"M"+r+","+h+"V"+b:a?"M"+h+","+o*a+"V"+r+"H"+b+"V"+o*a:"M"+h+","+r+"H"+b),f.attr("opacity",1).attr("transform",(function(t){return B(U(t)+r)})),m.attr(g+"2",o*c),A.attr(g,o*u).text(Q),C.filter(Ge).attr("fill","none").attr("font-size",10).attr("font-family","sans-serif").attr("text-anchor",t===ue?"start":t===he?"end":"middle"),C.each((function(){this.__axis=U}))}return d.scale=function(t){return arguments.length?(e=t,d):e},d.ticks=function(){return n=Array.from(arguments),d},d.tickArguments=function(t){return arguments.length?(n=null==t?[]:Array.from(t),d):n.slice()},d.tickValues=function(t){return arguments.length?(i=null==t?null:Array.from(t),d):i&&i.slice()},d.tickFormat=function(t){return arguments.length?(s=t,d):s},d.tickSize=function(t){return arguments.length?(c=a=+t,d):c},d.tickSizeInner=function(t){return arguments.length?(c=+t,d):c},d.tickSizeOuter=function(t){return arguments.length?(a=+t,d):a},d.tickPadding=function(t){return arguments.length?(l=+t,d):l},d.offset=function(t){return arguments.length?(r=+t,d):r},d}function me(t){return pe(Fe,t)}var Ae={value:()=>{}};function xe(){for(var t,e=0,n=arguments.length,i={};e<n;++e){if(!(t=arguments[e]+"")||t in i||/[\s.]/.test(t))throw new Error("illegal type: "+t);i[t]=[]}return new Se(i)}function Se(t){this._=t}function Le(t,e){for(var n,i=0,s=t.length;i<s;++i)if((n=t[i]).name===e)return n.value}function Re(t,e,n){for(var i=0,s=t.length;i<s;++i)if(t[i].name===e){t[i]=Ae,t=t.slice(0,i).concat(t.slice(i+1));break}return null!=n&&t.push({name:e,value:n}),t}Se.prototype=xe.prototype={constructor:Se,on:function(t,e){var n,i,s=this._,c=(i=s,(t+"").trim().split(/^|\s+/).map((function(t){var e="",n=t.indexOf(".");if(n>=0&&(e=t.slice(n+1),t=t.slice(0,n)),t&&!i.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:e}}))),a=-1,l=c.length;if(!(arguments.length<2)){if(null!=e&&"function"!=typeof e)throw new Error("invalid callback: "+e);for(;++a<l;)if(n=(t=c[a]).type)s[n]=Re(s[n],t.name,e);else if(null==e)for(n in s)s[n]=Re(s[n],t.name,null);return this}for(;++a<l;)if((n=(t=c[a]).type)&&(n=Le(s[n],t.name)))return n},copy:function(){var t={},e=this._;for(var n in e)t[n]=e[n].slice();return new Se(t)},call:function(t,e){if((n=arguments.length-2)>0)for(var n,i,s=new Array(n),c=0;c<n;++c)s[c]=arguments[c+2];if(!this._.hasOwnProperty(t))throw new Error("unknown type: "+t);for(c=0,n=(i=this._[t]).length;c<n;++c)i[c].value.apply(e,s)},apply:function(t,e,n){if(!this._.hasOwnProperty(t))throw new Error("unknown type: "+t);for(var i=this._[t],s=0,c=i.length;s<c;++s)i[s].value.apply(e,n)}};var Xe="http://www.w3.org/1999/xhtml",ve={svg:"http://www.w3.org/2000/svg",xhtml:Xe,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function Ne(t){var e=t+="",n=e.indexOf(":");return n>=0&&"xmlns"!==(e=t.slice(0,n))&&(t=t.slice(n+1)),ve.hasOwnProperty(e)?{space:ve[e],local:t}:t}function Ze(t){return function(){var e=this.ownerDocument,n=this.namespaceURI;return n===Xe&&e.documentElement.namespaceURI===Xe?e.createElement(t):e.createElementNS(n,t)}}function Ee(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function Ve(t){var e=Ne(t);return(e.local?Ee:Ze)(e)}function we(){}function We(t){return null==t?we:function(){return this.querySelector(t)}}function He(){return[]}function De(t){return null==t?He:function(){return this.querySelectorAll(t)}}function Ye(t){return function(){return function(t){return null==t?[]:Array.isArray(t)?t:Array.from(t)}(t.apply(this,arguments))}}function ke(t){return function(){return this.matches(t)}}function Je(t){return function(e){return e.matches(t)}}var Me=Array.prototype.find;function Te(){return this.firstElementChild}var ze=Array.prototype.filter;function Ke(){return Array.from(this.children)}function Oe(t){return new Array(t.length)}function _e(t,e){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=e}function Pe(t,e,n,i,s,c){for(var a,l=0,r=e.length,o=c.length;l<o;++l)(a=e[l])?(a.__data__=c[l],i[l]=a):n[l]=new _e(t,c[l]);for(;l<r;++l)(a=e[l])&&(s[l]=a)}function je(t,e,n,i,s,c,a){var l,r,o,g=new Map,B=e.length,d=c.length,I=new Array(B);for(l=0;l<B;++l)(r=e[l])&&(I[l]=o=a.call(r,r.__data__,l,e)+"",g.has(o)?s[l]=r:g.set(o,r));for(l=0;l<d;++l)o=a.call(t,c[l],l,c)+"",(r=g.get(o))?(i[l]=r,r.__data__=c[l],g.delete(o)):n[l]=new _e(t,c[l]);for(l=0;l<B;++l)(r=e[l])&&g.get(I[l])===r&&(s[l]=r)}function $e(t){return t.__data__}function qe(t){return"object"==typeof t&&"length"in t?t:Array.from(t)}function tn(t,e){return t<e?-1:t>e?1:t>=e?0:NaN}function en(t){return function(){this.removeAttribute(t)}}function nn(t){return function(){this.removeAttributeNS(t.space,t.local)}}function sn(t,e){return function(){this.setAttribute(t,e)}}function cn(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}function an(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttribute(t):this.setAttribute(t,n)}}function ln(t,e){return function(){var n=e.apply(this,arguments);null==n?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,n)}}function rn(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function on(t){return function(){this.style.removeProperty(t)}}function gn(t,e,n){return function(){this.style.setProperty(t,e,n)}}function Bn(t,e,n){return function(){var i=e.apply(this,arguments);null==i?this.style.removeProperty(t):this.style.setProperty(t,i,n)}}function dn(t,e){return t.style.getPropertyValue(e)||rn(t).getComputedStyle(t,null).getPropertyValue(e)}function In(t){return function(){delete this[t]}}function Qn(t,e){return function(){this[t]=e}}function un(t,e){return function(){var n=e.apply(this,arguments);null==n?delete this[t]:this[t]=n}}function Fn(t){return t.trim().split(/^|\s+/)}function hn(t){return t.classList||new bn(t)}function bn(t){this._node=t,this._names=Fn(t.getAttribute("class")||"")}function Un(t,e){for(var n=hn(t),i=-1,s=e.length;++i<s;)n.add(e[i])}function Cn(t,e){for(var n=hn(t),i=-1,s=e.length;++i<s;)n.remove(e[i])}function yn(t){return function(){Un(this,t)}}function fn(t){return function(){Cn(this,t)}}function Gn(t,e){return function(){(e.apply(this,arguments)?Un:Cn)(this,t)}}function pn(){this.textContent=""}function mn(t){return function(){this.textContent=t}}function An(t){return function(){var e=t.apply(this,arguments);this.textContent=null==e?"":e}}function xn(){this.innerHTML=""}function Sn(t){return function(){this.innerHTML=t}}function Ln(t){return function(){var e=t.apply(this,arguments);this.innerHTML=null==e?"":e}}function Rn(){this.nextSibling&&this.parentNode.appendChild(this)}function Xn(){this.previousSibling&&this.parentNode.insertBefore(this,this.parentNode.firstChild)}function vn(){return null}function Nn(){var t=this.parentNode;t&&t.removeChild(this)}function Zn(){var t=this.cloneNode(!1),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function En(){var t=this.cloneNode(!0),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function Vn(t){return function(){var e=this.__on;if(e){for(var n,i=0,s=-1,c=e.length;i<c;++i)n=e[i],t.type&&n.type!==t.type||n.name!==t.name?e[++s]=n:this.removeEventListener(n.type,n.listener,n.options);++s?e.length=s:delete this.__on}}}function wn(t,e,n){return function(){var i,s=this.__on,c=function(t){return function(e){t.call(this,e,this.__data__)}}(e);if(s)for(var a=0,l=s.length;a<l;++a)if((i=s[a]).type===t.type&&i.name===t.name)return this.removeEventListener(i.type,i.listener,i.options),this.addEventListener(i.type,i.listener=c,i.options=n),void(i.value=e);this.addEventListener(t.type,c,n),i={type:t.type,name:t.name,value:e,listener:c,options:n},s?s.push(i):this.__on=[i]}}function Wn(t,e,n){var i=rn(t),s=i.CustomEvent;"function"==typeof s?s=new s(e,n):(s=i.document.createEvent("Event"),n?(s.initEvent(e,n.bubbles,n.cancelable),s.detail=n.detail):s.initEvent(e,!1,!1)),t.dispatchEvent(s)}function Hn(t,e){return function(){return Wn(this,t,e)}}function Dn(t,e){return function(){return Wn(this,t,e.apply(this,arguments))}}_e.prototype={constructor:_e,appendChild:function(t){return this._parent.insertBefore(t,this._next)},insertBefore:function(t,e){return this._parent.insertBefore(t,e)},querySelector:function(t){return this._parent.querySelector(t)},querySelectorAll:function(t){return this._parent.querySelectorAll(t)}},bn.prototype={add:function(t){this._names.indexOf(t)<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},remove:function(t){var e=this._names.indexOf(t);e>=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};var Yn=[null];function kn(t,e){this._groups=t,this._parents=e}function Jn(){return new kn([[document.documentElement]],Yn)}function Mn(t){return"string"==typeof t?new kn([[document.querySelector(t)]],[document.documentElement]):new kn([[t]],Yn)}function Tn(t,e){if(t=function(t){let e;for(;e=t.sourceEvent;)t=e;return t}(t),void 0===e&&(e=t.currentTarget),e){var n=e.ownerSVGElement||e;if(n.createSVGPoint){var i=n.createSVGPoint();return i.x=t.clientX,i.y=t.clientY,[(i=i.matrixTransform(e.getScreenCTM().inverse())).x,i.y]}if(e.getBoundingClientRect){var s=e.getBoundingClientRect();return[t.clientX-s.left-e.clientLeft,t.clientY-s.top-e.clientTop]}}return[t.pageX,t.pageY]}kn.prototype=Jn.prototype={constructor:kn,select:function(t){"function"!=typeof t&&(t=We(t));for(var e=this._groups,n=e.length,i=new Array(n),s=0;s<n;++s)for(var c,a,l=e[s],r=l.length,o=i[s]=new Array(r),g=0;g<r;++g)(c=l[g])&&(a=t.call(c,c.__data__,g,l))&&("__data__"in c&&(a.__data__=c.__data__),o[g]=a);return new kn(i,this._parents)},selectAll:function(t){t="function"==typeof t?Ye(t):De(t);for(var e=this._groups,n=e.length,i=[],s=[],c=0;c<n;++c)for(var a,l=e[c],r=l.length,o=0;o<r;++o)(a=l[o])&&(i.push(t.call(a,a.__data__,o,l)),s.push(a));return new kn(i,s)},selectChild:function(t){return this.select(null==t?Te:function(t){return function(){return Me.call(this.children,t)}}("function"==typeof t?t:Je(t)))},selectChildren:function(t){return this.selectAll(null==t?Ke:function(t){return function(){return ze.call(this.children,t)}}("function"==typeof t?t:Je(t)))},filter:function(t){"function"!=typeof t&&(t=ke(t));for(var e=this._groups,n=e.length,i=new Array(n),s=0;s<n;++s)for(var c,a=e[s],l=a.length,r=i[s]=[],o=0;o<l;++o)(c=a[o])&&t.call(c,c.__data__,o,a)&&r.push(c);return new kn(i,this._parents)},data:function(t,e){if(!arguments.length)return Array.from(this,$e);var n=e?je:Pe,i=this._parents,s=this._groups;"function"!=typeof t&&(t=function(t){return function(){return t}}(t));for(var c=s.length,a=new Array(c),l=new Array(c),r=new Array(c),o=0;o<c;++o){var g=i[o],B=s[o],d=B.length,I=qe(t.call(g,g&&g.__data__,o,i)),Q=I.length,u=l[o]=new Array(Q),F=a[o]=new Array(Q);n(g,B,u,F,r[o]=new Array(d),I,e);for(var h,b,U=0,C=0;U<Q;++U)if(h=u[U]){for(U>=C&&(C=U+1);!(b=F[C])&&++C<Q;);h._next=b||null}}return(a=new kn(a,i))._enter=l,a._exit=r,a},enter:function(){return new kn(this._enter||this._groups.map(Oe),this._parents)},exit:function(){return new kn(this._exit||this._groups.map(Oe),this._parents)},join:function(t,e,n){var i=this.enter(),s=this,c=this.exit();return"function"==typeof t?(i=t(i))&&(i=i.selection()):i=i.append(t+""),null!=e&&(s=e(s))&&(s=s.selection()),null==n?c.remove():n(c),i&&s?i.merge(s).order():s},merge:function(t){for(var e=t.selection?t.selection():t,n=this._groups,i=e._groups,s=n.length,c=i.length,a=Math.min(s,c),l=new Array(s),r=0;r<a;++r)for(var o,g=n[r],B=i[r],d=g.length,I=l[r]=new Array(d),Q=0;Q<d;++Q)(o=g[Q]||B[Q])&&(I[Q]=o);for(;r<s;++r)l[r]=n[r];return new kn(l,this._parents)},selection:function(){return this},order:function(){for(var t=this._groups,e=-1,n=t.length;++e<n;)for(var i,s=t[e],c=s.length-1,a=s[c];--c>=0;)(i=s[c])&&(a&&4^i.compareDocumentPosition(a)&&a.parentNode.insertBefore(i,a),a=i);return this},sort:function(t){function e(e,n){return e&&n?t(e.__data__,n.__data__):!e-!n}t||(t=tn);for(var n=this._groups,i=n.length,s=new Array(i),c=0;c<i;++c){for(var a,l=n[c],r=l.length,o=s[c]=new Array(r),g=0;g<r;++g)(a=l[g])&&(o[g]=a);o.sort(e)}return new kn(s,this._parents).order()},call:function(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this},nodes:function(){return Array.from(this)},node:function(){for(var t=this._groups,e=0,n=t.length;e<n;++e)for(var i=t[e],s=0,c=i.length;s<c;++s){var a=i[s];if(a)return a}return null},size:function(){let t=0;for(const e of this)++t;return t},empty:function(){return!this.node()},each:function(t){for(var e=this._groups,n=0,i=e.length;n<i;++n)for(var s,c=e[n],a=0,l=c.length;a<l;++a)(s=c[a])&&t.call(s,s.__data__,a,c);return this},attr:function(t,e){var n=Ne(t);if(arguments.length<2){var i=this.node();return n.local?i.getAttributeNS(n.space,n.local):i.getAttribute(n)}return this.each((null==e?n.local?nn:en:"function"==typeof e?n.local?ln:an:n.local?cn:sn)(n,e))},style:function(t,e,n){return arguments.length>1?this.each((null==e?on:"function"==typeof e?Bn:gn)(t,e,null==n?"":n)):dn(this.node(),t)},property:function(t,e){return arguments.length>1?this.each((null==e?In:"function"==typeof e?un:Qn)(t,e)):this.node()[t]},classed:function(t,e){var n=Fn(t+"");if(arguments.length<2){for(var i=hn(this.node()),s=-1,c=n.length;++s<c;)if(!i.contains(n[s]))return!1;return!0}return this.each(("function"==typeof e?Gn:e?yn:fn)(n,e))},text:function(t){return arguments.length?this.each(null==t?pn:("function"==typeof t?An:mn)(t)):this.node().textContent},html:function(t){return arguments.length?this.each(null==t?xn:("function"==typeof t?Ln:Sn)(t)):this.node().innerHTML},raise:function(){return this.each(Rn)},lower:function(){return this.each(Xn)},append:function(t){var e="function"==typeof t?t:Ve(t);return this.select((function(){return this.appendChild(e.apply(this,arguments))}))},insert:function(t,e){var n="function"==typeof t?t:Ve(t),i=null==e?vn:"function"==typeof e?e:We(e);return this.select((function(){return this.insertBefore(n.apply(this,arguments),i.apply(this,arguments)||null)}))},remove:function(){return this.each(Nn)},clone:function(t){return this.select(t?En:Zn)},datum:function(t){return arguments.length?this.property("__data__",t):this.node().__data__},on:function(t,e,n){var i,s,c=function(t){return t.trim().split(/^|\s+/).map((function(t){var e="",n=t.indexOf(".");return n>=0&&(e=t.slice(n+1),t=t.slice(0,n)),{type:t,name:e}}))}(t+""),a=c.length;if(!(arguments.length<2)){for(l=e?wn:Vn,i=0;i<a;++i)this.each(l(c[i],e,n));return this}var l=this.node().__on;if(l)for(var r,o=0,g=l.length;o<g;++o)for(i=0,r=l[o];i<a;++i)if((s=c[i]).type===r.type&&s.name===r.name)return r.value},dispatch:function(t,e){return this.each(("function"==typeof e?Dn:Hn)(t,e))},[Symbol.iterator]:function*(){for(var t=this._groups,e=0,n=t.length;e<n;++e)for(var i,s=t[e],c=0,a=s.length;c<a;++c)(i=s[c])&&(yield i)}};const zn={passive:!1},Kn={capture:!0,passive:!1};function On(t){t.stopImmediatePropagation()}function _n(t){t.preventDefault(),t.stopImmediatePropagation()}var Pn=t=>()=>t;function jn(t,{sourceEvent:e,subject:n,target:i,identifier:s,active:c,x:a,y:l,dx:r,dy:o,dispatch:g}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:e,enumerable:!0,configurable:!0},subject:{value:n,enumerable:!0,configurable:!0},target:{value:i,enumerable:!0,configurable:!0},identifier:{value:s,enumerable:!0,configurable:!0},active:{value:c,enumerable:!0,configurable:!0},x:{value:a,enumerable:!0,configurable:!0},y:{value:l,enumerable:!0,configurable:!0},dx:{value:r,enumerable:!0,configurable:!0},dy:{value:o,enumerable:!0,configurable:!0},_:{value:g}})}function $n(t){return!t.ctrlKey&&!t.button}function qn(){return this.parentNode}function ti(t,e){return null==e?{x:t.x,y:t.y}:e}function ei(){return navigator.maxTouchPoints||"ontouchstart"in this}function ni(){var t,e,n,i,s=$n,c=qn,a=ti,l=ei,r={},o=xe("start","drag","end"),g=0,B=0;function d(t){t.on("mousedown.drag",I).filter(l).on("touchstart.drag",F).on("touchmove.drag",h,zn).on("touchend.drag touchcancel.drag",b).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function I(a,l){if(!i&&s.call(this,a,l)){var r=U(this,c.call(this,a,l),a,l,"mouse");r&&(Mn(a.view).on("mousemove.drag",Q,Kn).on("mouseup.drag",u,Kn),function(t){var e=t.document.documentElement,n=Mn(t).on("dragstart.drag",_n,Kn);"onselectstart"in e?n.on("selectstart.drag",_n,Kn):(e.__noselect=e.style.MozUserSelect,e.style.MozUserSelect="none")}(a.view),On(a),n=!1,t=a.clientX,e=a.clientY,r("start",a))}}function Q(i){if(_n(i),!n){var s=i.clientX-t,c=i.clientY-e;n=s*s+c*c>B}r.mouse("drag",i)}function u(t){Mn(t.view).on("mousemove.drag mouseup.drag",null),function(t,e){var n=t.document.documentElement,i=Mn(t).on("dragstart.drag",null);e&&(i.on("click.drag",_n,Kn),setTimeout((function(){i.on("click.drag",null)}),0)),"onselectstart"in n?i.on("selectstart.drag",null):(n.style.MozUserSelect=n.__noselect,delete n.__noselect)}(t.view,n),_n(t),r.mouse("end",t)}function F(t,e){if(s.call(this,t,e)){var n,i,a=t.changedTouches,l=c.call(this,t,e),r=a.length;for(n=0;n<r;++n)(i=U(this,l,t,e,a[n].identifier,a[n]))&&(On(t),i("start",t,a[n]))}}function h(t){var e,n,i=t.changedTouches,s=i.length;for(e=0;e<s;++e)(n=r[i[e].identifier])&&(_n(t),n("drag",t,i[e]))}function b(t){var e,n,s=t.changedTouches,c=s.length;for(i&&clearTimeout(i),i=setTimeout((function(){i=null}),500),e=0;e<c;++e)(n=r[s[e].identifier])&&(On(t),n("end",t,s[e]))}function U(t,e,n,i,s,c){var l,B,I,Q=o.copy(),u=Tn(c||n,e);if(null!=(I=a.call(t,new jn("beforestart",{sourceEvent:n,target:d,identifier:s,active:g,x:u[0],y:u[1],dx:0,dy:0,dispatch:Q}),i)))return l=I.x-u[0]||0,B=I.y-u[1]||0,function n(c,a,o){var F,h=u;switch(c){case"start":r[s]=n,F=g++;break;case"end":delete r[s],--g;case"drag":u=Tn(o||a,e),F=g}Q.call(c,t,new jn(c,{sourceEvent:a,subject:I,target:d,identifier:s,active:F,x:u[0]+l,y:u[1]+B,dx:u[0]-h[0],dy:u[1]-h[1],dispatch:Q}),i)}}return d.filter=function(t){return arguments.length?(s="function"==typeof t?t:Pn(!!t),d):s},d.container=function(t){return arguments.length?(c="function"==typeof t?t:Pn(t),d):c},d.subject=function(t){return arguments.length?(a="function"==typeof t?t:Pn(t),d):a},d.touchable=function(t){return arguments.length?(l="function"==typeof t?t:Pn(!!t),d):l},d.on=function(){var t=o.on.apply(o,arguments);return t===o?d:t},d.clickDistance=function(t){return arguments.length?(B=(t=+t)*t,d):Math.sqrt(B)},d}function ii(t,e,n){t.prototype=e.prototype=n,n.constructor=t}function si(t,e){var n=Object.create(t.prototype);for(var i in e)n[i]=e[i];return n}function ci(){}jn.prototype.on=function(){var t=this._.on.apply(this._,arguments);return t===this._?this:t};var ai=.7,li=1/ai,ri="\\s*([+-]?\\d+)\\s*",oi="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*",gi="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*",Bi=/^#([0-9a-f]{3,8})$/,di=new RegExp(`^rgb\\(${ri},${ri},${ri}\\)$`),Ii=new RegExp(`^rgb\\(${gi},${gi},${gi}\\)$`),Qi=new RegExp(`^rgba\\(${ri},${ri},${ri},${oi}\\)$`),ui=new RegExp(`^rgba\\(${gi},${gi},${gi},${oi}\\)$`),Fi=new RegExp(`^hsl\\(${oi},${gi},${gi}\\)$`),hi=new RegExp(`^hsla\\(${oi},${gi},${gi},${oi}\\)$`),bi={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 Ui(){return this.rgb().formatHex()}function Ci(){return this.rgb().formatRgb()}function yi(t){var e,n;return t=(t+"").trim().toLowerCase(),(e=Bi.exec(t))?(n=e[1].length,e=parseInt(e[1],16),6===n?fi(e):3===n?new Ai(e>>8&15|e>>4&240,e>>4&15|240&e,(15&e)<<4|15&e,1):8===n?Gi(e>>24&255,e>>16&255,e>>8&255,(255&e)/255):4===n?Gi(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|240&e,((15&e)<<4|15&e)/255):null):(e=di.exec(t))?new Ai(e[1],e[2],e[3],1):(e=Ii.exec(t))?new Ai(255*e[1]/100,255*e[2]/100,255*e[3]/100,1):(e=Qi.exec(t))?Gi(e[1],e[2],e[3],e[4]):(e=ui.exec(t))?Gi(255*e[1]/100,255*e[2]/100,255*e[3]/100,e[4]):(e=Fi.exec(t))?vi(e[1],e[2]/100,e[3]/100,1):(e=hi.exec(t))?vi(e[1],e[2]/100,e[3]/100,e[4]):bi.hasOwnProperty(t)?fi(bi[t]):"transparent"===t?new Ai(NaN,NaN,NaN,0):null}function fi(t){return new Ai(t>>16&255,t>>8&255,255&t,1)}function Gi(t,e,n,i){return i<=0&&(t=e=n=NaN),new Ai(t,e,n,i)}function pi(t){return t instanceof ci||(t=yi(t)),t?new Ai((t=t.rgb()).r,t.g,t.b,t.opacity):new Ai}function mi(t,e,n,i){return 1===arguments.length?pi(t):new Ai(t,e,n,null==i?1:i)}function Ai(t,e,n,i){this.r=+t,this.g=+e,this.b=+n,this.opacity=+i}function xi(){return`#${Xi(this.r)}${Xi(this.g)}${Xi(this.b)}`}function Si(){const t=Li(this.opacity);return`${1===t?"rgb(":"rgba("}${Ri(this.r)}, ${Ri(this.g)}, ${Ri(this.b)}${1===t?")":`, ${t})`}`}function Li(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function Ri(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function Xi(t){return((t=Ri(t))<16?"0":"")+t.toString(16)}function vi(t,e,n,i){return i<=0?t=e=n=NaN:n<=0||n>=1?t=e=NaN:e<=0&&(t=NaN),new Ei(t,e,n,i)}function Ni(t){if(t instanceof Ei)return new Ei(t.h,t.s,t.l,t.opacity);if(t instanceof ci||(t=yi(t)),!t)return new Ei;if(t instanceof Ei)return t;var e=(t=t.rgb()).r/255,n=t.g/255,i=t.b/255,s=Math.min(e,n,i),c=Math.max(e,n,i),a=NaN,l=c-s,r=(c+s)/2;return l?(a=e===c?(n-i)/l+6*(n<i):n===c?(i-e)/l+2:(e-n)/l+4,l/=r<.5?c+s:2-c-s,a*=60):l=r>0&&r<1?0:a,new Ei(a,l,r,t.opacity)}function Zi(t,e,n,i){return 1===arguments.length?Ni(t):new Ei(t,e,n,null==i?1:i)}function Ei(t,e,n,i){this.h=+t,this.s=+e,this.l=+n,this.opacity=+i}function Vi(t){return(t=(t||0)%360)<0?t+360:t}function wi(t){return Math.max(0,Math.min(1,t||0))}function Wi(t,e,n){return 255*(t<60?e+(n-e)*t/60:t<180?n:t<240?e+(n-e)*(240-t)/60:e)}ii(ci,yi,{copy(t){return Object.assign(new this.constructor,this,t)},displayable(){return this.rgb().displayable()},hex:Ui,formatHex:Ui,formatHex8:function(){return this.rgb().formatHex8()},formatHsl:function(){return Ni(this).formatHsl()},formatRgb:Ci,toString:Ci}),ii(Ai,mi,si(ci,{brighter(t){return t=null==t?li:Math.pow(li,t),new Ai(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=null==t?ai:Math.pow(ai,t),new Ai(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new Ai(Ri(this.r),Ri(this.g),Ri(this.b),Li(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:xi,formatHex:xi,formatHex8:function(){return`#${Xi(this.r)}${Xi(this.g)}${Xi(this.b)}${Xi(255*(isNaN(this.opacity)?1:this.opacity))}`},formatRgb:Si,toString:Si})),ii(Ei,Zi,si(ci,{brighter(t){return t=null==t?li:Math.pow(li,t),new Ei(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=null==t?ai:Math.pow(ai,t),new Ei(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+360*(this.h<0),e=isNaN(t)||isNaN(this.s)?0:this.s,n=this.l,i=n+(n<.5?n:1-n)*e,s=2*n-i;return new Ai(Wi(t>=240?t-240:t+120,s,i),Wi(t,s,i),Wi(t<120?t+240:t-120,s,i),this.opacity)},clamp(){return new Ei(Vi(this.h),wi(this.s),wi(this.l),Li(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 t=Li(this.opacity);return`${1===t?"hsl(":"hsla("}${Vi(this.h)}, ${100*wi(this.s)}%, ${100*wi(this.l)}%${1===t?")":`, ${t})`}`}}));const Hi=Math.PI/180,Di=180/Math.PI,Yi=.96422,ki=1,Ji=.82521,Mi=4/29,Ti=6/29,zi=3*Ti*Ti,Ki=Ti*Ti*Ti;function Oi(t){if(t instanceof Pi)return new Pi(t.l,t.a,t.b,t.opacity);if(t instanceof ns)return is(t);t instanceof Ai||(t=pi(t));var e,n,i=ts(t.r),s=ts(t.g),c=ts(t.b),a=ji((.2225045*i+.7168786*s+.0606169*c)/ki);return i===s&&s===c?e=n=a:(e=ji((.4360747*i+.3850649*s+.1430804*c)/Yi),n=ji((.0139322*i+.0971045*s+.7141733*c)/Ji)),new Pi(116*a-16,500*(e-a),200*(a-n),t.opacity)}function _i(t,e,n,i){return 1===arguments.length?Oi(t):new Pi(t,e,n,null==i?1:i)}function Pi(t,e,n,i){this.l=+t,this.a=+e,this.b=+n,this.opacity=+i}function ji(t){return t>Ki?Math.pow(t,1/3):t/zi+Mi}function $i(t){return t>Ti?t*t*t:zi*(t-Mi)}function qi(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function ts(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function es(t,e,n,i){return 1===arguments.length?function(t){if(t instanceof ns)return new ns(t.h,t.c,t.l,t.opacity);if(t instanceof Pi||(t=Oi(t)),0===t.a&&0===t.b)return new ns(NaN,0<t.l&&t.l<100?0:NaN,t.l,t.opacity);var e=Math.atan2(t.b,t.a)*Di;return new ns(e<0?e+360:e,Math.sqrt(t.a*t.a+t.b*t.b),t.l,t.opacity)}(t):new ns(t,e,n,null==i?1:i)}function ns(t,e,n,i){this.h=+t,this.c=+e,this.l=+n,this.opacity=+i}function is(t){if(isNaN(t.h))return new Pi(t.l,0,0,t.opacity);var e=t.h*Hi;return new Pi(t.l,Math.cos(e)*t.c,Math.sin(e)*t.c,t.opacity)}ii(Pi,_i,si(ci,{brighter(t){return new Pi(this.l+18*(null==t?1:t),this.a,this.b,this.opacity)},darker(t){return new Pi(this.l-18*(null==t?1:t),this.a,this.b,this.opacity)},rgb(){var t=(this.l+16)/116,e=isNaN(this.a)?t:t+this.a/500,n=isNaN(this.b)?t:t-this.b/200;return new Ai(qi(3.1338561*(e=Yi*$i(e))-1.6168667*(t=ki*$i(t))-.4906146*(n=Ji*$i(n))),qi(-.9787684*e+1.9161415*t+.033454*n),qi(.0719453*e-.2289914*t+1.4052427*n),this.opacity)}})),ii(ns,es,si(ci,{brighter(t){return new ns(this.h,this.c,this.l+18*(null==t?1:t),this.opacity)},darker(t){return new ns(this.h,this.c,this.l-18*(null==t?1:t),this.opacity)},rgb(){return is(this).rgb()}}));var ss=-.14861,cs=1.78277,as=-.29227,ls=-.90649,rs=1.97294,os=rs*ls,gs=rs*cs,Bs=cs*as-ls*ss;function ds(t,e,n,i){return 1===arguments.length?function(t){if(t instanceof Is)return new Is(t.h,t.s,t.l,t.opacity);t instanceof Ai||(t=pi(t));var e=t.r/255,n=t.g/255,i=t.b/255,s=(Bs*i+os*e-gs*n)/(Bs+os-gs),c=i-s,a=(rs*(n-s)-as*c)/ls,l=Math.sqrt(a*a+c*c)/(rs*s*(1-s)),r=l?Math.atan2(a,c)*Di-120:NaN;return new Is(r<0?r+360:r,l,s,t.opacity)}(t):new Is(t,e,n,null==i?1:i)}function Is(t,e,n,i){this.h=+t,this.s=+e,this.l=+n,this.opacity=+i}ii(Is,ds,si(ci,{brighter(t){return t=null==t?li:Math.pow(li,t),new Is(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=null==t?ai:Math.pow(ai,t),new Is(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=isNaN(this.h)?0:(this.h+120)*Hi,e=+this.l,n=isNaN(this.s)?0:this.s*e*(1-e),i=Math.cos(t),s=Math.sin(t);return new Ai(255*(e+n*(ss*i+cs*s)),255*(e+n*(as*i+ls*s)),255*(e+n*(rs*i)),this.opacity)}}));var Qs=t=>()=>t;function us(t,e){return function(n){return t+n*e}}function Fs(t,e){var n=e-t;return n?us(t,n>180||n<-180?n-360*Math.round(n/360):n):Qs(isNaN(t)?e:t)}function hs(t){return 1==(t=+t)?bs:function(e,n){return n-e?function(t,e,n){return t=Math.pow(t,n),e=Math.pow(e,n)-t,n=1/n,function(i){return Math.pow(t+i*e,n)}}(e,n,t):Qs(isNaN(e)?n:e)}}function bs(t,e){var n=e-t;return n?us(t,n):Qs(isNaN(t)?e:t)}var Us=function t(e){var n=hs(e);function i(t,e){var i=n((t=mi(t)).r,(e=mi(e)).r),s=n(t.g,e.g),c=n(t.b,e.b),a=bs(t.opacity,e.opacity);return function(e){return t.r=i(e),t.g=s(e),t.b=c(e),t.opacity=a(e),t+""}}return i.gamma=t,i}(1);var Cs,ys=(Cs=function(t){var e=t.length-1;return function(n){var i=n<=0?n=0:n>=1?(n=1,e-1):Math.floor(n*e),s=t[i],c=t[i+1],a=i>0?t[i-1]:2*s-c,l=i<e-1?t[i+2]:2*c-s;return function(t,e,n,i,s){var c=t*t,a=c*t;return((1-3*t+3*c-a)*e+(4-6*c+3*a)*n+(1+3*t+3*c-3*a)*i+a*s)/6}((n-i/e)*e,a,s,c,l)}},function(t){var e,n,i=t.length,s=new Array(i),c=new Array(i),a=new Array(i);for(e=0;e<i;++e)n=mi(t[e]),s[e]=n.r||0,c[e]=n.g||0,a[e]=n.b||0;return s=Cs(s),c=Cs(c),a=Cs(a),n.opacity=1,function(t){return n.r=s(t),n.g=c(t),n.b=a(t),n+""}});function fs(t,e){e||(e=[]);var n,i=t?Math.min(e.length,t.length):0,s=e.slice();return function(c){for(n=0;n<i;++n)s[n]=t[n]*(1-c)+e[n]*c;return s}}function Gs(t,e){var n,i=e?e.length:0,s=t?Math.min(i,t.length):0,c=new Array(s),a=new Array(i);for(n=0;n<s;++n)c[n]=Rs(t[n],e[n]);for(;n<i;++n)a[n]=e[n];return function(t){for(n=0;n<s;++n)a[n]=c[n](t);return a}}function ps(t,e){var n=new Date;return t=+t,e=+e,function(i){return n.setTime(t*(1-i)+e*i),n}}function ms(t,e){return t=+t,e=+e,function(n){return t*(1-n)+e*n}}function As(t,e){var n,i={},s={};for(n in null!==t&&"object"==typeof t||(t={}),null!==e&&"object"==typeof e||(e={}),e)n in t?i[n]=Rs(t[n],e[n]):s[n]=e[n];return function(t){for(n in i)s[n]=i[n](t);return s}}var xs=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,Ss=new RegExp(xs.source,"g");function Ls(t,e){var n,i,s,c=xs.lastIndex=Ss.lastIndex=0,a=-1,l=[],r=[];for(t+="",e+="";(n=xs.exec(t))&&(i=Ss.exec(e));)(s=i.index)>c&&(s=e.slice(c,s),l[a]?l[a]+=s:l[++a]=s),(n=n[0])===(i=i[0])?l[a]?l[a]+=i:l[++a]=i:(l[++a]=null,r.push({i:a,x:ms(n,i)})),c=Ss.lastIndex;return c<e.length&&(s=e.slice(c),l[a]?l[a]+=s:l[++a]=s),l.length<2?r[0]?function(t){return function(e){return t(e)+""}}(r[0].x):function(t){return function(){return t}}(e):(e=r.length,function(t){for(var n,i=0;i<e;++i)l[(n=r[i]).i]=n.x(t);return l.join("")})}function Rs(t,e){var n,i=typeof e;return null==e||"boolean"===i?Qs(e):("number"===i?ms:"string"===i?(n=yi(e))?(e=n,Us):Ls:e instanceof yi?Us:e instanceof Date?ps:function(t){return ArrayBuffer.isView(t)&&!(t instanceof DataView)}(e)?fs:Array.isArray(e)?Gs:"function"!=typeof e.valueOf&&"function"!=typeof e.toString||isNaN(e)?As:ms)(t,e)}function Xs(t,e){return t=+t,e=+e,function(n){return Math.round(t*(1-n)+e*n)}}var vs,Ns=180/Math.PI,Zs={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1};function Es(t,e,n,i,s,c){var a,l,r;return(a=Math.sqrt(t*t+e*e))&&(t/=a,e/=a),(r=t*n+e*i)&&(n-=t*r,i-=e*r),(l=Math.sqrt(n*n+i*i))&&(n/=l,i/=l,r/=l),t*i<e*n&&(t=-t,e=-e,r=-r,a=-a),{translateX:s,translateY:c,rotate:Math.atan2(e,t)*Ns,skewX:Math.atan(r)*Ns,scaleX:a,scaleY:l}}function Vs(t,e,n,i){function s(t){return t.length?t.pop()+" ":""}return function(c,a){var l=[],r=[];return c=t(c),a=t(a),function(t,i,s,c,a,l){if(t!==s||i!==c){var r=a.push("translate(",null,e,null,n);l.push({i:r-4,x:ms(t,s)},{i:r-2,x:ms(i,c)})}else(s||c)&&a.push("translate("+s+e+c+n)}(c.translateX,c.translateY,a.translateX,a.translateY,l,r),function(t,e,n,c){t!==e?(t-e>180?e+=360:e-t>180&&(t+=360),c.push({i:n.push(s(n)+"rotate(",null,i)-2,x:ms(t,e)})):e&&n.push(s(n)+"rotate("+e+i)}(c.rotate,a.rotate,l,r),function(t,e,n,c){t!==e?c.push({i:n.push(s(n)+"skewX(",null,i)-2,x:ms(t,e)}):e&&n.push(s(n)+"skewX("+e+i)}(c.skewX,a.skewX,l,r),function(t,e,n,i,c,a){if(t!==n||e!==i){var l=c.push(s(c)+"scale(",null,",",null,")");a.push({i:l-4,x:ms(t,n)},{i:l-2,x:ms(e,i)})}else 1===n&&1===i||c.push(s(c)+"scale("+n+","+i+")")}(c.scaleX,c.scaleY,a.scaleX,a.scaleY,l,r),c=a=null,function(t){for(var e,n=-1,i=r.length;++n<i;)l[(e=r[n]).i]=e.x(t);return l.join("")}}}var ws=Vs((function(t){const e=new("function"==typeof DOMMatrix?DOMMatrix:WebKitCSSMatrix)(t+"");return e.isIdentity?Zs:Es(e.a,e.b,e.c,e.d,e.e,e.f)}),"px, ","px)","deg)"),Ws=Vs((function(t){return null==t?Zs:(vs||(vs=document.createElementNS("http://www.w3.org/2000/svg","g")),vs.setAttribute("transform",t),(t=vs.transform.baseVal.consolidate())?Es((t=t.matrix).a,t.b,t.c,t.d,t.e,t.f):Zs)}),", ",")",")");var Hs=function(t){return function(e,n){var i=t((e=Zi(e)).h,(n=Zi(n)).h),s=bs(e.s,n.s),c=bs(e.l,n.l),a=bs(e.opacity,n.opacity);return function(t){return e.h=i(t),e.s=s(t),e.l=c(t),e.opacity=a(t),e+""}}}(Fs);var Ds=function(t){return function(e,n){var i=t((e=es(e)).h,(n=es(n)).h),s=bs(e.c,n.c),c=bs(e.l,n.l),a=bs(e.opacity,n.opacity);return function(t){return e.h=i(t),e.c=s(t),e.l=c(t),e.opacity=a(t),e+""}}}(Fs);function Ys(t){return function e(n){function i(e,i){var s=t((e=ds(e)).h,(i=ds(i)).h),c=bs(e.s,i.s),a=bs(e.l,i.l),l=bs(e.opacity,i.opacity);return function(t){return e.h=s(t),e.s=c(t),e.l=a(Math.pow(t,n)),e.opacity=l(t),e+""}}return n=+n,i.gamma=e,i}(1)}Ys(Fs);var ks=Ys(bs);function Js(t,e){void 0===e&&(e=t,t=Rs);for(var n=0,i=e.length-1,s=e[0],c=new Array(i<0?0:i);n<i;)c[n]=t(s,s=e[++n]);return function(t){var e=Math.max(0,Math.min(i-1,Math.floor(t*=i)));return c[e](t-e)}}function Ms(t,e){for(var n=new Array(e),i=0;i<e;++i)n[i]=t(i/(e-1));return n}var Ts,zs,Ks=0,Os=0,_s=0,Ps=1e3,js=0,$s=0,qs=0,tc="object"==typeof performance&&performance.now?performance:Date,ec="object"==typeof window&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(t){setTimeout(t,17)};function nc(){return $s||(ec(ic),$s=tc.now()+qs)}function ic(){$s=0}function sc(){this._call=this._time=this._next=null}function cc(t,e,n){var i=new sc;return i.restart(t,e,n),i}function ac(){$s=(js=tc.now())+qs,Ks=Os=0;try{!function(){nc(),++Ks;for(var t,e=Ts;e;)(t=$s-e._time)>=0&&e._call.call(void 0,t),e=e._next;--Ks}()}finally{Ks=0,function(){var t,e,n=Ts,i=1/0;for(;n;)n._call?(i>n._time&&(i=n._time),t=n,n=n._next):(e=n._next,n._next=null,n=t?t._next=e:Ts=e);zs=t,rc(i)}(),$s=0}}function lc(){var t=tc.now(),e=t-js;e>Ps&&(qs-=e,js=t)}function rc(t){Ks||(Os&&(Os=clearTimeout(Os)),t-$s>24?(t<1/0&&(Os=setTimeout(ac,t-tc.now()-qs)),_s&&(_s=clearInterval(_s))):(_s||(js=tc.now(),_s=setInterval(lc,Ps)),Ks=1,ec(ac)))}function oc(t,e,n){var i=new sc;return e=null==e?0:+e,i.restart((n=>{i.stop(),t(n+e)}),e,n),i}sc.prototype=cc.prototype={constructor:sc,restart:function(t,e,n){if("function"!=typeof t)throw new TypeError("callback is not a function");n=(null==n?nc():+n)+(null==e?0:+e),this._next||zs===this||(zs?zs._next=this:Ts=this,zs=this),this._call=t,this._time=n,rc()},stop:function(){this._call&&(this._call=null,this._time=1/0,rc())}};var gc=xe("start","end","cancel","interrupt"),Bc=[],dc=0,Ic=1,Qc=2,uc=3,Fc=4,hc=5,bc=6;function Uc(t,e,n,i,s,c){var a=t.__transition;if(a){if(n in a)return}else t.__transition={};!function(t,e,n){var i,s=t.__transition;function c(t){n.state=Ic,n.timer.restart(a,n.delay,n.time),n.delay<=t&&a(t-n.delay)}function a(c){var o,g,B,d;if(n.state!==Ic)return r();for(o in s)if((d=s[o]).name===n.name){if(d.state===uc)return oc(a);d.state===Fc?(d.state=bc,d.timer.stop(),d.on.call("interrupt",t,t.__data__,d.index,d.group),delete s[o]):+o<e&&(d.state=bc,d.timer.stop(),d.on.call("cancel",t,t.__data__,d.index,d.group),delete s[o])}if(oc((function(){n.state===uc&&(n.state=Fc,n.timer.restart(l,n.delay,n.time),l(c))})),n.state=Qc,n.on.call("start",t,t.__data__,n.index,n.group),n.state===Qc){for(n.state=uc,i=new Array(B=n.tween.length),o=0,g=-1;o<B;++o)(d=n.tween[o].value.call(t,t.__data__,n.index,n.group))&&(i[++g]=d);i.length=g+1}}function l(e){for(var s=e<n.duration?n.ease.call(null,e/n.duration):(n.timer.restart(r),n.state=hc,1),c=-1,a=i.length;++c<a;)i[c].call(t,s);n.state===hc&&(n.on.call("end",t,t.__data__,n.index,n.group),r())}function r(){for(var i in n.state=bc,n.timer.stop(),delete s[e],s)return;delete t.__transition}s[e]=n,n.timer=cc(c,0,n.time)}(t,n,{name:e,index:i,group:s,on:gc,tween:Bc,time:c.time,delay:c.delay,duration:c.duration,ease:c.ease,timer:null,state:dc})}function Cc(t,e){var n=fc(t,e);if(n.state>dc)throw new Error("too late; already scheduled");return n}function yc(t,e){var n=fc(t,e);if(n.state>uc)throw new Error("too late; already running");return n}function fc(t,e){var n=t.__transition;if(!n||!(n=n[e]))throw new Error("transition not found");return n}function Gc(t,e){var n,i;return function(){var s=yc(this,t),c=s.tween;if(c!==n)for(var a=0,l=(i=n=c).length;a<l;++a)if(i[a].name===e){(i=i.slice()).splice(a,1);break}s.tween=i}}function pc(t,e,n){var i,s;if("function"!=typeof n)throw new Error;return function(){var c=yc(this,t),a=c.tween;if(a!==i){s=(i=a).slice();for(var l={name:e,value:n},r=0,o=s.length;r<o;++r)if(s[r].name===e){s[r]=l;break}r===o&&s.push(l)}c.tween=s}}function mc(t,e,n){var i=t._id;return t.each((function(){var t=yc(this,i);(t.value||(t.value={}))[e]=n.apply(this,arguments)})),function(t){return fc(t,i).value[e]}}function Ac(t,e){var n;return("number"==typeof e?ms:e instanceof yi?Us:(n=yi(e))?(e=n,Us):Ls)(t,e)}function xc(t){return function(){this.removeAttribute(t)}}function Sc(t){return function(){this.removeAttributeNS(t.space,t.local)}}function Lc(t,e,n){var i,s,c=n+"";return function(){var a=this.getAttribute(t);return a===c?null:a===i?s:s=e(i=a,n)}}function Rc(t,e,n){var i,s,c=n+"";return function(){var a=this.getAttributeNS(t.space,t.local);return a===c?null:a===i?s:s=e(i=a,n)}}function Xc(t,e,n){var i,s,c;return function(){var a,l,r=n(this);if(null!=r)return(a=this.getAttribute(t))===(l=r+"")?null:a===i&&l===s?c:(s=l,c=e(i=a,r));this.removeAttribute(t)}}function vc(t,e,n){var i,s,c;return function(){var a,l,r=n(this);if(null!=r)return(a=this.getAttributeNS(t.space,t.local))===(l=r+"")?null:a===i&&l===s?c:(s=l,c=e(i=a,r));this.removeAttributeNS(t.space,t.local)}}function Nc(t,e){var n,i;function s(){var s=e.apply(this,arguments);return s!==i&&(n=(i=s)&&function(t,e){return function(n){this.setAttributeNS(t.space,t.local,e.call(this,n))}}(t,s)),n}return s._value=e,s}function Zc(t,e){var n,i;function s(){var s=e.apply(this,arguments);return s!==i&&(n=(i=s)&&function(t,e){return function(n){this.setAttribute(t,e.call(this,n))}}(t,s)),n}return s._value=e,s}function Ec(t,e){return function(){Cc(this,t).delay=+e.apply(this,arguments)}}function Vc(t,e){return e=+e,function(){Cc(this,t).delay=e}}function wc(t,e){return function(){yc(this,t).duration=+e.apply(this,arguments)}}function Wc(t,e){return e=+e,function(){yc(this,t).duration=e}}var Hc=Jn.prototype.constructor;function Dc(t){return function(){this.style.removeProperty(t)}}var Yc=0;function kc(t,e,n,i){this._groups=t,this._parents=e,this._name=n,this._id=i}function Jc(){return++Yc}var Mc=Jn.prototype;kc.prototype={constructor:kc,select:function(t){var e=this._name,n=this._id;"function"!=typeof t&&(t=We(t));for(var i=this._groups,s=i.length,c=new Array(s),a=0;a<s;++a)for(var l,r,o=i[a],g=o.length,B=c[a]=new Array(g),d=0;d<g;++d)(l=o[d])&&(r=t.call(l,l.__data__,d,o))&&("__data__"in l&&(r.__data__=l.__data__),B[d]=r,Uc(B[d],e,n,d,B,fc(l,n)));return new kc(c,this._parents,e,n)},selectAll:function(t){var e=this._name,n=this._id;"function"!=typeof t&&(t=De(t));for(var i=this._groups,s=i.length,c=[],a=[],l=0;l<s;++l)for(var r,o=i[l],g=o.length,B=0;B<g;++B)if(r=o[B]){for(var d,I=t.call(r,r.__data__,B,o),Q=fc(r,n),u=0,F=I.length;u<F;++u)(d=I[u])&&Uc(d,e,n,u,I,Q);c.push(I),a.push(r)}return new kc(c,a,e,n)},selectChild:Mc.selectChild,selectChildren:Mc.selectChildren,filter:function(t){"function"!=typeof t&&(t=ke(t));for(var e=this._groups,n=e.length,i=new Array(n),s=0;s<n;++s)for(var c,a=e[s],l=a.length,r=i[s]=[],o=0;o<l;++o)(c=a[o])&&t.call(c,c.__data__,o,a)&&r.push(c);return new kc(i,this._parents,this._name,this._id)},merge:function(t){if(t._id!==this._id)throw new Error;for(var e=this._groups,n=t._groups,i=e.length,s=n.length,c=Math.min(i,s),a=new Array(i),l=0;l<c;++l)for(var r,o=e[l],g=n[l],B=o.length,d=a[l]=new Array(B),I=0;I<B;++I)(r=o[I]||g[I])&&(d[I]=r);for(;l<i;++l)a[l]=e[l];return new kc(a,this._parents,this._name,this._id)},selection:function(){return new Hc(this._groups,this._parents)},transition:function(){for(var t=this._name,e=this._id,n=Jc(),i=this._groups,s=i.length,c=0;c<s;++c)for(var a,l=i[c],r=l.length,o=0;o<r;++o)if(a=l[o]){var g=fc(a,e);Uc(a,t,n,o,l,{time:g.time+g.delay+g.duration,delay:0,duration:g.duration,ease:g.ease})}return new kc(i,this._parents,t,n)},call:Mc.call,nodes:Mc.nodes,node:Mc.node,size:Mc.size,empty:Mc.empty,each:Mc.each,on:function(t,e){var n=this._id;return arguments.length<2?fc(this.node(),n).on.on(t):this.each(function(t,e,n){var i,s,c=function(t){return(t+"").trim().split(/^|\s+/).every((function(t){var e=t.indexOf(".");return e>=0&&(t=t.slice(0,e)),!t||"start"===t}))}(e)?Cc:yc;return function(){var a=c(this,t),l=a.on;l!==i&&(s=(i=l).copy()).on(e,n),a.on=s}}(n,t,e))},attr:function(t,e){var n=Ne(t),i="transform"===n?Ws:Ac;return this.attrTween(t,"function"==typeof e?(n.local?vc:Xc)(n,i,mc(this,"attr."+t,e)):null==e?(n.local?Sc:xc)(n):(n.local?Rc:Lc)(n,i,e))},attrTween:function(t,e){var n="attr."+t;if(arguments.length<2)return(n=this.tween(n))&&n._value;if(null==e)return this.tween(n,null);if("function"!=typeof e)throw new Error;var i=Ne(t);return this.tween(n,(i.local?Nc:Zc)(i,e))},style:function(t,e,n){var i="transform"==(t+="")?ws:Ac;return null==e?this.styleTween(t,function(t,e){var n,i,s;return function(){var c=dn(this,t),a=(this.style.removeProperty(t),dn(this,t));return c===a?null:c===n&&a===i?s:s=e(n=c,i=a)}}(t,i)).on("end.style."+t,Dc(t)):"function"==typeof e?this.styleTween(t,function(t,e,n){var i,s,c;return function(){var a=dn(this,t),l=n(this),r=l+"";return null==l&&(this.style.removeProperty(t),r=l=dn(this,t)),a===r?null:a===i&&r===s?c:(s=r,c=e(i=a,l))}}(t,i,mc(this,"style."+t,e))).each(function(t,e){var n,i,s,c,a="style."+e,l="end."+a;return function(){var r=yc(this,t),o=r.on,g=null==r.value[a]?c||(c=Dc(e)):void 0;o===n&&s===g||(i=(n=o).copy()).on(l,s=g),r.on=i}}(this._id,t)):this.styleTween(t,function(t,e,n){var i,s,c=n+"";return function(){var a=dn(this,t);return a===c?null:a===i?s:s=e(i=a,n)}}(t,i,e),n).on("end.style."+t,null)},styleTween:function(t,e,n){var i="style."+(t+="");if(arguments.length<2)return(i=this.tween(i))&&i._value;if(null==e)return this.tween(i,null);if("function"!=typeof e)throw new Error;return this.tween(i,function(t,e,n){var i,s;function c(){var c=e.apply(this,arguments);return c!==s&&(i=(s=c)&&function(t,e,n){return function(i){this.style.setProperty(t,e.call(this,i),n)}}(t,c,n)),i}return c._value=e,c}(t,e,null==n?"":n))},text:function(t){return this.tween("text","function"==typeof t?function(t){return function(){var e=t(this);this.textContent=null==e?"":e}}(mc(this,"text",t)):function(t){return function(){this.textContent=t}}(null==t?"":t+""))},textTween:function(t){var e="text";if(arguments.length<1)return(e=this.tween(e))&&e._value;if(null==t)return this.tween(e,null);if("function"!=typeof t)throw new Error;return this.tween(e,function(t){var e,n;function i(){var i=t.apply(this,arguments);return i!==n&&(e=(n=i)&&function(t){return function(e){this.textContent=t.call(this,e)}}(i)),e}return i._value=t,i}(t))},remove:function(){return this.on("end.remove",function(t){return function(){var e=this.parentNode;for(var n in this.__transition)if(+n!==t)return;e&&e.removeChild(this)}}(this._id))},tween:function(t,e){var n=this._id;if(t+="",arguments.length<2){for(var i,s=fc(this.node(),n).tween,c=0,a=s.length;c<a;++c)if((i=s[c]).name===t)return i.value;return null}return this.each((null==e?Gc:pc)(n,t,e))},delay:function(t){var e=this._id;return arguments.length?this.each(("function"==typeof t?Ec:Vc)(e,t)):fc(this.node(),e).delay},duration:function(t){var e=this._id;return arguments.length?this.each(("function"==typeof t?wc:Wc)(e,t)):fc(this.node(),e).duration},ease:function(t){var e=this._id;return arguments.length?this.each(function(t,e){if("function"!=typeof e)throw new Error;return function(){yc(this,t).ease=e}}(e,t)):fc(this.node(),e).ease},easeVarying:function(t){if("function"!=typeof t)throw new Error;return this.each(function(t,e){return function(){var n=e.apply(this,arguments);if("function"!=typeof n)throw new Error;yc(this,t).ease=n}}(this._id,t))},end:function(){var t,e,n=this,i=n._id,s=n.size();return new Promise((function(c,a){var l={value:a},r={value:function(){0==--s&&c()}};n.each((function(){var n=yc(this,i),s=n.on;s!==t&&((e=(t=s).copy())._.cancel.push(l),e._.interrupt.push(l),e._.end.push(r)),n.on=e})),0===s&&c()}))},[Symbol.iterator]:Mc[Symbol.iterator]};const Tc=t=>+t;function zc(t){return--t*t*t+1}var Kc={time:null,delay:0,duration:250,ease:function(t){return((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2}};function Oc(t,e){for(var n;!(n=t.__transition)||!(n=n[e]);)if(!(t=t.parentNode))throw new Error(`transition ${e} not found`);return n}Jn.prototype.interrupt=function(t){return this.each((function(){!function(t,e){var n,i,s,c=t.__transition,a=!0;if(c){for(s in e=null==e?null:e+"",c)(n=c[s]).name===e?(i=n.state>Qc&&n.state<hc,n.state=bc,n.timer.stop(),n.on.call(i?"interrupt":"cancel",t,t.__data__,n.index,n.group),delete c[s]):a=!1;a&&delete t.__transition}}(this,t)}))},Jn.prototype.transition=function(t){var e,n;t instanceof kc?(e=t._id,t=t._name):(e=Jc(),(n=Kc).time=nc(),t=null==t?null:t+"");for(var i=this._groups,s=i.length,c=0;c<s;++c)for(var a,l=i[c],r=l.length,o=0;o<r;++o)(a=l[o])&&Uc(a,t,e,o,l,n||Oc(a,e));return new kc(i,this._parents,t,e)};const _c=Math.PI,Pc=2*_c,jc=1e-6,$c=Pc-jc;function qc(t){this._+=t[0];for(let e=1,n=t.length;e<n;++e)this._+=arguments[e]+t[e]}class ta{constructor(t){this._x0=this._y0=this._x1=this._y1=null,this._="",this._append=null==t?qc:function(t){let e=Math.floor(t);if(!(e>=0))throw new Error(`invalid digits: ${t}`);if(e>15)return qc;const n=10**e;return function(t){this._+=t[0];for(let e=1,i=t.length;e<i;++e)this._+=Math.round(arguments[e]*n)/n+t[e]}}(t)}moveTo(t,e){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+e}`}closePath(){null!==this._x1&&(this._x1=this._x0,this._y1=this._y0,this._append`Z`)}lineTo(t,e){this._append`L${this._x1=+t},${this._y1=+e}`}quadraticCurveTo(t,e,n,i){this._append`Q${+t},${+e},${this._x1=+n},${this._y1=+i}`}bezierCurveTo(t,e,n,i,s,c){this._append`C${+t},${+e},${+n},${+i},${this._x1=+s},${this._y1=+c}`}arcTo(t,e,n,i,s){if(t=+t,e=+e,n=+n,i=+i,(s=+s)<0)throw new Error(`negative radius: ${s}`);let c=this._x1,a=this._y1,l=n-t,r=i-e,o=c-t,g=a-e,B=o*o+g*g;if(null===this._x1)this._append`M${this._x1=t},${this._y1=e}`;else if(B>jc)if(Math.abs(g*l-r*o)>jc&&s){let d=n-c,I=i-a,Q=l*l+r*r,u=d*d+I*I,F=Math.sqrt(Q),h=Math.sqrt(B),b=s*Math.tan((_c-Math.acos((Q+B-u)/(2*F*h)))/2),U=b/h,C=b/F;Math.abs(U-1)>jc&&this._append`L${t+U*o},${e+U*g}`,this._append`A${s},${s},0,0,${+(g*d>o*I)},${this._x1=t+C*l},${this._y1=e+C*r}`}else this._append`L${this._x1=t},${this._y1=e}`;else;}arc(t,e,n,i,s,c){if(t=+t,e=+e,c=!!c,(n=+n)<0)throw new Error(`negative radius: ${n}`);let a=n*Math.cos(i),l=n*Math.sin(i),r=t+a,o=e+l,g=1^c,B=c?i-s:s-i;null===this._x1?this._append`M${r},${o}`:(Math.abs(this._x1-r)>jc||Math.abs(this._y1-o)>jc)&&this._append`L${r},${o}`,n&&(B<0&&(B=B%Pc+Pc),B>$c?this._append`A${n},${n},0,1,${g},${t-a},${e-l}A${n},${n},0,1,${g},${this._x1=r},${this._y1=o}`:B>jc&&this._append`A${n},${n},0,${+(B>=_c)},${g},${this._x1=t+n*Math.cos(s)},${this._y1=e+n*Math.sin(s)}`)}rect(t,e,n,i){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+e}h${n=+n}v${+i}h${-n}Z`}toString(){return this._}}function ea(t=3){return new ta(+t)}function na(t,e){if((n=(t=e?t.toExponential(e-1):t.toExponential()).indexOf("e"))<0)return null;var n,i=t.slice(0,n);return[i.length>1?i[0]+i.slice(2):i,+t.slice(n+1)]}function ia(t){return(t=na(Math.abs(t)))?t[1]:NaN}var sa,ca=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function aa(t){if(!(e=ca.exec(t)))throw new Error("invalid format: "+t);var e;return new la({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}function la(t){this.fill=void 0===t.fill?" ":t.fill+"",this.align=void 0===t.align?">":t.align+"",this.sign=void 0===t.sign?"-":t.sign+"",this.symbol=void 0===t.symbol?"":t.symbol+"",this.zero=!!t.zero,this.width=void 0===t.width?void 0:+t.width,this.comma=!!t.comma,this.precision=void 0===t.precision?void 0:+t.precision,this.trim=!!t.trim,this.type=void 0===t.type?"":t.type+""}function ra(t,e){var n=na(t,e);if(!n)return t+"";var i=n[0],s=n[1];return s<0?"0."+new Array(-s).join("0")+i:i.length>s+1?i.slice(0,s+1)+"."+i.slice(s+1):i+new Array(s-i.length+2).join("0")}aa.prototype=la.prototype,la.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 oa={"%":(t,e)=>(100*t).toFixed(e),b:t=>Math.round(t).toString(2),c:t=>t+"",d:function(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)},e:(t,e)=>t.toExponential(e),f:(t,e)=>t.toFixed(e),g:(t,e)=>t.toPrecision(e),o:t=>Math.round(t).toString(8),p:(t,e)=>ra(100*t,e),r:ra,s:function(t,e){var n=na(t,e);if(!n)return t+"";var i=n[0],s=n[1],c=s-(sa=3*Math.max(-8,Math.min(8,Math.floor(s/3))))+1,a=i.length;return c===a?i:c>a?i+new Array(c-a+1).join("0"):c>0?i.slice(0,c)+"."+i.slice(c):"0."+new Array(1-c).join("0")+na(t,Math.max(0,e+c-1))[0]},X:t=>Math.round(t).toString(16).toUpperCase(),x:t=>Math.round(t).toString(16)};function ga(t){return t}var Ba,da,Ia,Qa=Array.prototype.map,ua=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function Fa(t){var e,n,i=void 0===t.grouping||void 0===t.thousands?ga:(e=Qa.call(t.grouping,Number),n=t.thousands+"",function(t,i){for(var s=t.length,c=[],a=0,l=e[0],r=0;s>0&&l>0&&(r+l+1>i&&(l=Math.max(1,i-r)),c.push(t.substring(s-=l,s+l)),!((r+=l+1)>i));)l=e[a=(a+1)%e.length];return c.reverse().join(n)}),s=void 0===t.currency?"":t.currency[0]+"",c=void 0===t.currency?"":t.currency[1]+"",a=void 0===t.decimal?".":t.decimal+"",l=void 0===t.numerals?ga:function(t){return function(e){return e.replace(/[0-9]/g,(function(e){return t[+e]}))}}(Qa.call(t.numerals,String)),r=void 0===t.percent?"%":t.percent+"",o=void 0===t.minus?"−":t.minus+"",g=void 0===t.nan?"NaN":t.nan+"";function B(t){var e=(t=aa(t)).fill,n=t.align,B=t.sign,d=t.symbol,I=t.zero,Q=t.width,u=t.comma,F=t.precision,h=t.trim,b=t.type;"n"===b?(u=!0,b="g"):oa[b]||(void 0===F&&(F=12),h=!0,b="g"),(I||"0"===e&&"="===n)&&(I=!0,e="0",n="=");var U="$"===d?s:"#"===d&&/[boxX]/.test(b)?"0"+b.toLowerCase():"",C="$"===d?c:/[%p]/.test(b)?r:"",y=oa[b],f=/[defgprs%]/.test(b);function G(t){var s,c,r,d=U,G=C;if("c"===b)G=y(t)+G,t="";else{var p=(t=+t)<0||1/t<0;if(t=isNaN(t)?g:y(Math.abs(t),F),h&&(t=function(t){t:for(var e,n=t.length,i=1,s=-1;i<n;++i)switch(t[i]){case".":s=e=i;break;case"0":0===s&&(s=i),e=i;break;default:if(!+t[i])break t;s>0&&(s=0)}return s>0?t.slice(0,s)+t.slice(e+1):t}(t)),p&&0==+t&&"+"!==B&&(p=!1),d=(p?"("===B?B:o:"-"===B||"("===B?"":B)+d,G=("s"===b?ua[8+sa/3]:"")+G+(p&&"("===B?")":""),f)for(s=-1,c=t.length;++s<c;)if(48>(r=t.charCodeAt(s))||r>57){G=(46===r?a+t.slice(s+1):t.slice(s))+G,t=t.slice(0,s);break}}u&&!I&&(t=i(t,1/0));var m=d.length+t.length+G.length,A=m<Q?new Array(Q-m+1).join(e):"";switch(u&&I&&(t=i(A+t,A.length?Q-G.length:1/0),A=""),n){case"<":t=d+t+G+A;break;case"=":t=d+A+t+G;break;case"^":t=A.slice(0,m=A.length>>1)+d+t+G+A.slice(m);break;default:t=A+d+t+G}return l(t)}return F=void 0===F?6:/[gprs]/.test(b)?Math.max(1,Math.min(21,F)):Math.max(0,Math.min(20,F)),G.toString=function(){return t+""},G}return{format:B,formatPrefix:function(t,e){var n=B(((t=aa(t)).type="f",t)),i=3*Math.max(-8,Math.min(8,Math.floor(ia(e)/3))),s=Math.pow(10,-i),c=ua[8+i/3];return function(t){return n(s*t)+c}}}}Ba=Fa({thousands:",",grouping:[3],currency:["$",""]}),da=Ba.format,Ia=Ba.formatPrefix;var ha=1e-6,ba=1e-12,Ua=Math.PI,Ca=Ua/2,ya=Ua/4,fa=2*Ua,Ga=180/Ua,pa=Ua/180,ma=Math.abs,Aa=Math.atan,xa=Math.atan2,Sa=Math.cos,La=Math.exp,Ra=Math.log,Xa=Math.pow,va=Math.sin,Na=Math.sign||function(t){return t>0?1:t<0?-1:0},Za=Math.sqrt,Ea=Math.tan;function Va(t){return t>1?0:t<-1?Ua:Math.acos(t)}function wa(t){return t>1?Ca:t<-1?-Ca:Math.asin(t)}function Wa(){}function Ha(t,e){t&&Ya.hasOwnProperty(t.type)&&Ya[t.type](t,e)}var Da={Feature:function(t,e){Ha(t.geometry,e)},FeatureCollection:function(t,e){for(var n=t.features,i=-1,s=n.length;++i<s;)Ha(n[i].geometry,e)}},Ya={Sphere:function(t,e){e.sphere()},Point:function(t,e){t=t.coordinates,e.point(t[0],t[1],t[2])},MultiPoint:function(t,e){for(var n=t.coordinates,i=-1,s=n.length;++i<s;)t=n[i],e.point(t[0],t[1],t[2])},LineString:function(t,e){ka(t.coordinates,e,0)},MultiLineString:function(t,e){for(var n=t.coordinates,i=-1,s=n.length;++i<s;)ka(n[i],e,0)},Polygon:function(t,e){Ja(t.coordinates,e)},MultiPolygon:function(t,e){for(var n=t.coordinates,i=-1,s=n.length;++i<s;)Ja(n[i],e)},GeometryCollection:function(t,e){for(var n=t.geometries,i=-1,s=n.length;++i<s;)Ha(n[i],e)}};function ka(t,e,n){var i,s=-1,c=t.length-n;for(e.lineStart();++s<c;)i=t[s],e.point(i[0],i[1],i[2]);e.lineEnd()}function Ja(t,e){var n=-1,i=t.length;for(e.polygonStart();++n<i;)ka(t[n],e,1);e.polygonEnd()}function Ma(t,e){t&&Da.hasOwnProperty(t.type)?Da[t.type](t,e):Ha(t,e)}function Ta(t){return[xa(t[1],t[0]),wa(t[2])]}function za(t){var e=t[0],n=t[1],i=Sa(n);return[i*Sa(e),i*va(e),va(n)]}function Ka(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function Oa(t,e){return[t[1]*e[2]-t[2]*e[1],t[2]*e[0]-t[0]*e[2],t[0]*e[1]-t[1]*e[0]]}function _a(t,e){t[0]+=e[0],t[1]+=e[1],t[2]+=e[2]}function Pa(t,e){return[t[0]*e,t[1]*e,t[2]*e]}function ja(t){var e=Za(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=e,t[1]/=e,t[2]/=e}function $a(t,e){function n(n,i){return n=t(n,i),e(n[0],n[1])}return t.invert&&e.invert&&(n.invert=function(n,i){return(n=e.invert(n,i))&&t.invert(n[0],n[1])}),n}function qa(t,e){return ma(t)>Ua&&(t-=Math.round(t/fa)*fa),[t,e]}function tl(t,e,n){return(t%=fa)?e||n?$a(nl(t),il(e,n)):nl(t):e||n?il(e,n):qa}function el(t){return function(e,n){return ma(e+=t)>Ua&&(e-=Math.round(e/fa)*fa),[e,n]}}function nl(t){var e=el(t);return e.invert=el(-t),e}function il(t,e){var n=Sa(t),i=va(t),s=Sa(e),c=va(e);function a(t,e){var a=Sa(e),l=Sa(t)*a,r=va(t)*a,o=va(e),g=o*n+l*i;return[xa(r*s-g*c,l*n-o*i),wa(g*s+r*c)]}return a.invert=function(t,e){var a=Sa(e),l=Sa(t)*a,r=va(t)*a,o=va(e),g=o*s-r*c;return[xa(r*s+o*c,l*n+g*i),wa(g*n-l*i)]},a}function sl(t,e){(e=za(e))[0]-=t,ja(e);var n=Va(-e[1]);return((-e[2]<0?-n:n)+fa-ha)%fa}function cl(){var t,e=[];return{point:function(e,n,i){t.push([e,n,i])},lineStart:function(){e.push(t=[])},lineEnd:Wa,rejoin:function(){e.length>1&&e.push(e.pop().concat(e.shift()))},result:function(){var n=e;return e=[],t=null,n}}}function al(t,e){return ma(t[0]-e[0])<ha&&ma(t[1]-e[1])<ha}function ll(t,e,n,i){this.x=t,this.z=e,this.o=n,this.e=i,this.v=!1,this.n=this.p=null}function rl(t,e,n,i,s){var c,a,l=[],r=[];if(t.forEach((function(t){if(!((e=t.length-1)<=0)){var e,n,i=t[0],a=t[e];if(al(i,a)){if(!i[2]&&!a[2]){for(s.lineStart(),c=0;c<e;++c)s.point((i=t[c])[0],i[1]);return void s.lineEnd()}a[0]+=2*ha}l.push(n=new ll(i,t,null,!0)),r.push(n.o=new ll(i,null,n,!1)),l.push(n=new ll(a,t,null,!1)),r.push(n.o=new ll(a,null,n,!0))}})),l.length){for(r.sort(e),ol(l),ol(r),c=0,a=r.length;c<a;++c)r[c].e=n=!n;for(var o,g,B=l[0];;){for(var d=B,I=!0;d.v;)if((d=d.n)===B)return;o=d.z,s.lineStart();do{if(d.v=d.o.v=!0,d.e){if(I)for(c=0,a=o.length;c<a;++c)s.point((g=o[c])[0],g[1]);else i(d.x,d.n.x,1,s);d=d.n}else{if(I)for(o=d.p.z,c=o.length-1;c>=0;--c)s.point((g=o[c])[0],g[1]);else i(d.x,d.p.x,-1,s);d=d.p}o=(d=d.o).z,I=!I}while(!d.v);s.lineEnd()}}}function ol(t){if(e=t.length){for(var e,n,i=0,s=t[0];++i<e;)s.n=n=t[i],n.p=s,s=n;s.n=n=t[0],n.p=s}}function gl(t){return ma(t[0])<=Ua?t[0]:Na(t[0])*((ma(t[0])+Ua)%fa-Ua)}function Bl(t,e,n,i){return function(s){var c,a,l,r=e(s),o=cl(),g=e(o),B=!1,d={point:I,lineStart:u,lineEnd:F,polygonStart:function(){d.point=h,d.lineStart=b,d.lineEnd=U,a=[],c=[]},polygonEnd:function(){d.point=I,d.lineStart=u,d.lineEnd=F,a=le(a);var t=function(t,e){var n=gl(e),i=e[1],s=va(i),c=[va(n),-Sa(n),0],a=0,l=0,r=new pt;1===s?i=Ca+ha:-1===s&&(i=-Ca-ha);for(var o=0,g=t.length;o<g;++o)if(d=(B=t[o]).length)for(var B,d,I=B[d-1],Q=gl(I),u=I[1]/2+ya,F=va(u),h=Sa(u),b=0;b<d;++b,Q=C,F=f,h=G,I=U){var U=B[b],C=gl(U),y=U[1]/2+ya,f=va(y),G=Sa(y),p=C-Q,m=p>=0?1:-1,A=m*p,x=A>Ua,S=F*f;if(r.add(xa(S*m*va(A),h*G+S*Sa(A))),a+=x?p+m*fa:p,x^Q>=n^C>=n){var L=Oa(za(I),za(U));ja(L);var R=Oa(c,L);ja(R);var X=(x^p>=0?-1:1)*wa(R[2]);(i>X||i===X&&(L[0]||L[1]))&&(l+=x^p>=0?1:-1)}}return(a<-ha||a<ha&&r<-ba)^1&l}(c,i);a.length?(B||(s.polygonStart(),B=!0),rl(a,Il,t,n,s)):t&&(B||(s.polygonStart(),B=!0),s.lineStart(),n(null,null,1,s),s.lineEnd()),B&&(s.polygonEnd(),B=!1),a=c=null},sphere:function(){s.polygonStart(),s.lineStart(),n(null,null,1,s),s.lineEnd(),s.polygonEnd()}};function I(e,n){t(e,n)&&s.point(e,n)}function Q(t,e){r.point(t,e)}function u(){d.point=Q,r.lineStart()}function F(){d.point=I,r.lineEnd()}function h(t,e){l.push([t,e]),g.point(t,e)}function b(){g.lineStart(),l=[]}function U(){h(l[0][0],l[0][1]),g.lineEnd();var t,e,n,i,r=g.clean(),d=o.result(),I=d.length;if(l.pop(),c.push(l),l=null,I)if(1&r){if((e=(n=d[0]).length-1)>0){for(B||(s.polygonStart(),B=!0),s.lineStart(),t=0;t<e;++t)s.point((i=n[t])[0],i[1]);s.lineEnd()}}else I>1&&2&r&&d.push(d.pop().concat(d.shift())),a.push(d.filter(dl))}return d}}function dl(t){return t.length>1}function Il(t,e){return((t=t.x)[0]<0?t[1]-Ca-ha:Ca-t[1])-((e=e.x)[0]<0?e[1]-Ca-ha:Ca-e[1])}qa.invert=qa;var Ql=Bl((function(){return!0}),(function(t){var e,n=NaN,i=NaN,s=NaN;return{lineStart:function(){t.lineStart(),e=1},point:function(c,a){var l=c>0?Ua:-Ua,r=ma(c-n);ma(r-Ua)<ha?(t.point(n,i=(i+a)/2>0?Ca:-Ca),t.point(s,i),t.lineEnd(),t.lineStart(),t.point(l,i),t.point(c,i),e=0):s!==l&&r>=Ua&&(ma(n-s)<ha&&(n-=s*ha),ma(c-l)<ha&&(c-=l*ha),i=function(t,e,n,i){var s,c,a=va(t-n);return ma(a)>ha?Aa((va(e)*(c=Sa(i))*va(n)-va(i)*(s=Sa(e))*va(t))/(s*c*a)):(e+i)/2}(n,i,c,a),t.point(s,i),t.lineEnd(),t.lineStart(),t.point(l,i),e=0),t.point(n=c,i=a),s=l},lineEnd:function(){t.lineEnd(),n=i=NaN},clean:function(){return 2-e}}}),(function(t,e,n,i){var s;if(null==t)s=n*Ca,i.point(-Ua,s),i.point(0,s),i.point(Ua,s),i.point(Ua,0),i.point(Ua,-s),i.point(0,-s),i.point(-Ua,-s),i.point(-Ua,0),i.point(-Ua,s);else if(ma(t[0]-e[0])>ha){var c=t[0]<e[0]?Ua:-Ua;s=n*c/2,i.point(-c,s),i.point(0,s),i.point(c,s)}else i.point(e[0],e[1])}),[-Ua,-Ca]);function ul(t){var e=Sa(t),n=2*pa,i=e>0,s=ma(e)>ha;function c(t,n){return Sa(t)*Sa(n)>e}function a(t,n,i){var s=[1,0,0],c=Oa(za(t),za(n)),a=Ka(c,c),l=c[0],r=a-l*l;if(!r)return!i&&t;var o=e*a/r,g=-e*l/r,B=Oa(s,c),d=Pa(s,o);_a(d,Pa(c,g));var I=B,Q=Ka(d,I),u=Ka(I,I),F=Q*Q-u*(Ka(d,d)-1);if(!(F<0)){var h=Za(F),b=Pa(I,(-Q-h)/u);if(_a(b,d),b=Ta(b),!i)return b;var U,C=t[0],y=n[0],f=t[1],G=n[1];y<C&&(U=C,C=y,y=U);var p=y-C,m=ma(p-Ua)<ha;if(!m&&G<f&&(U=f,f=G,G=U),m||p<ha?m?f+G>0^b[1]<(ma(b[0]-C)<ha?f:G):f<=b[1]&&b[1]<=G:p>Ua^(C<=b[0]&&b[0]<=y)){var A=Pa(I,(-Q+h)/u);return _a(A,d),[b,Ta(A)]}}}function l(e,n){var s=i?t:Ua-t,c=0;return e<-s?c|=1:e>s&&(c|=2),n<-s?c|=4:n>s&&(c|=8),c}return Bl(c,(function(t){var e,n,r,o,g;return{lineStart:function(){o=r=!1,g=1},point:function(B,d){var I,Q=[B,d],u=c(B,d),F=i?u?0:l(B,d):u?l(B+(B<0?Ua:-Ua),d):0;if(!e&&(o=r=u)&&t.lineStart(),u!==r&&(!(I=a(e,Q))||al(e,I)||al(Q,I))&&(Q[2]=1),u!==r)g=0,u?(t.lineStart(),I=a(Q,e),t.point(I[0],I[1])):(I=a(e,Q),t.point(I[0],I[1],2),t.lineEnd()),e=I;else if(s&&e&&i^u){var h;F&n||!(h=a(Q,e,!0))||(g=0,i?(t.lineStart(),t.point(h[0][0],h[0][1]),t.point(h[1][0],h[1][1]),t.lineEnd()):(t.point(h[1][0],h[1][1]),t.lineEnd(),t.lineStart(),t.point(h[0][0],h[0][1],3)))}!u||e&&al(e,Q)||t.point(Q[0],Q[1]),e=Q,r=u,n=F},lineEnd:function(){r&&t.lineEnd(),e=null},clean:function(){return g|(o&&r)<<1}}}),(function(e,i,s,c){!function(t,e,n,i,s,c){if(n){var a=Sa(e),l=va(e),r=i*n;null==s?(s=e+i*fa,c=e-r/2):(s=sl(a,s),c=sl(a,c),(i>0?s<c:s>c)&&(s+=i*fa));for(var o,g=s;i>0?g>c:g<c;g-=r)o=Ta([a,-l*Sa(g),-l*va(g)]),t.point(o[0],o[1])}}(c,t,n,s,e,i)}),i?[0,-t]:[-Ua,t-Ua])}var Fl=1e9,hl=-Fl;function bl(t,e,n,i){function s(s,c){return t<=s&&s<=n&&e<=c&&c<=i}function c(s,c,l,o){var g=0,B=0;if(null==s||(g=a(s,l))!==(B=a(c,l))||r(s,c)<0^l>0)do{o.point(0===g||3===g?t:n,g>1?i:e)}while((g=(g+l+4)%4)!==B);else o.point(c[0],c[1])}function a(i,s){return ma(i[0]-t)<ha?s>0?0:3:ma(i[0]-n)<ha?s>0?2:1:ma(i[1]-e)<ha?s>0?1:0:s>0?3:2}function l(t,e){return r(t.x,e.x)}function r(t,e){var n=a(t,1),i=a(e,1);return n!==i?n-i:0===n?e[1]-t[1]:1===n?t[0]-e[0]:2===n?t[1]-e[1]:e[0]-t[0]}return function(a){var r,o,g,B,d,I,Q,u,F,h,b,U=a,C=cl(),y={point:f,lineStart:function(){y.point=G,o&&o.push(g=[]);h=!0,F=!1,Q=u=NaN},lineEnd:function(){r&&(G(B,d),I&&F&&C.rejoin(),r.push(C.result()));y.point=f,F&&U.lineEnd()},polygonStart:function(){U=C,r=[],o=[],b=!0},polygonEnd:function(){var e=function(){for(var e=0,n=0,s=o.length;n<s;++n)for(var c,a,l=o[n],r=1,g=l.length,B=l[0],d=B[0],I=B[1];r<g;++r)c=d,a=I,d=(B=l[r])[0],I=B[1],a<=i?I>i&&(d-c)*(i-a)>(I-a)*(t-c)&&++e:I<=i&&(d-c)*(i-a)<(I-a)*(t-c)&&--e;return e}(),n=b&&e,s=(r=le(r)).length;(n||s)&&(a.polygonStart(),n&&(a.lineStart(),c(null,null,1,a),a.lineEnd()),s&&rl(r,l,e,c,a),a.polygonEnd());U=a,r=o=g=null}};function f(t,e){s(t,e)&&U.point(t,e)}function G(c,a){var l=s(c,a);if(o&&g.push([c,a]),h)B=c,d=a,I=l,h=!1,l&&(U.lineStart(),U.point(c,a));else if(l&&F)U.point(c,a);else{var r=[Q=Math.max(hl,Math.min(Fl,Q)),u=Math.max(hl,Math.min(Fl,u))],C=[c=Math.max(hl,Math.min(Fl,c)),a=Math.max(hl,Math.min(Fl,a))];!function(t,e,n,i,s,c){var a,l=t[0],r=t[1],o=0,g=1,B=e[0]-l,d=e[1]-r;if(a=n-l,B||!(a>0)){if(a/=B,B<0){if(a<o)return;a<g&&(g=a)}else if(B>0){if(a>g)return;a>o&&(o=a)}if(a=s-l,B||!(a<0)){if(a/=B,B<0){if(a>g)return;a>o&&(o=a)}else if(B>0){if(a<o)return;a<g&&(g=a)}if(a=i-r,d||!(a>0)){if(a/=d,d<0){if(a<o)return;a<g&&(g=a)}else if(d>0){if(a>g)return;a>o&&(o=a)}if(a=c-r,d||!(a<0)){if(a/=d,d<0){if(a>g)return;a>o&&(o=a)}else if(d>0){if(a<o)return;a<g&&(g=a)}return o>0&&(t[0]=l+o*B,t[1]=r+o*d),g<1&&(e[0]=l+g*B,e[1]=r+g*d),!0}}}}}(r,C,t,e,n,i)?l&&(U.lineStart(),U.point(c,a),b=!1):(F||(U.lineStart(),U.point(r[0],r[1])),U.point(C[0],C[1]),l||U.lineEnd(),b=!1)}Q=c,u=a,F=l}return y}}var Ul,Cl,yl,fl,Gl=t=>t,pl=new pt,ml=new pt,Al={point:Wa,lineStart:Wa,lineEnd:Wa,polygonStart:function(){Al.lineStart=xl,Al.lineEnd=Rl},polygonEnd:function(){Al.lineStart=Al.lineEnd=Al.point=Wa,pl.add(ma(ml)),ml=new pt},result:function(){var t=pl/2;return pl=new pt,t}};function xl(){Al.point=Sl}function Sl(t,e){Al.point=Ll,Ul=yl=t,Cl=fl=e}function Ll(t,e){ml.add(fl*t-yl*e),yl=t,fl=e}function Rl(){Ll(Ul,Cl)}var Xl=1/0,vl=Xl,Nl=-Xl,Zl=Nl,El={point:function(t,e){t<Xl&&(Xl=t);t>Nl&&(Nl=t);e<vl&&(vl=e);e>Zl&&(Zl=e)},lineStart:Wa,lineEnd:Wa,polygonStart:Wa,polygonEnd:Wa,result:function(){var t=[[Xl,vl],[Nl,Zl]];return Nl=Zl=-(vl=Xl=1/0),t}};var Vl,wl,Wl,Hl,Dl=0,Yl=0,kl=0,Jl=0,Ml=0,Tl=0,zl=0,Kl=0,Ol=0,_l={point:Pl,lineStart:jl,lineEnd:tr,polygonStart:function(){_l.lineStart=er,_l.lineEnd=nr},polygonEnd:function(){_l.point=Pl,_l.lineStart=jl,_l.lineEnd=tr},result:function(){var t=Ol?[zl/Ol,Kl/Ol]:Tl?[Jl/Tl,Ml/Tl]:kl?[Dl/kl,Yl/kl]:[NaN,NaN];return Dl=Yl=kl=Jl=Ml=Tl=zl=Kl=Ol=0,t}};function Pl(t,e){Dl+=t,Yl+=e,++kl}function jl(){_l.point=$l}function $l(t,e){_l.point=ql,Pl(Wl=t,Hl=e)}function ql(t,e){var n=t-Wl,i=e-Hl,s=Za(n*n+i*i);Jl+=s*(Wl+t)/2,Ml+=s*(Hl+e)/2,Tl+=s,Pl(Wl=t,Hl=e)}function tr(){_l.point=Pl}function er(){_l.point=ir}function nr(){sr(Vl,wl)}function ir(t,e){_l.point=sr,Pl(Vl=Wl=t,wl=Hl=e)}function sr(t,e){var n=t-Wl,i=e-Hl,s=Za(n*n+i*i);Jl+=s*(Wl+t)/2,Ml+=s*(Hl+e)/2,Tl+=s,zl+=(s=Hl*t-Wl*e)*(Wl+t),Kl+=s*(Hl+e),Ol+=3*s,Pl(Wl=t,Hl=e)}function cr(t){this._context=t}cr.prototype={_radius:4.5,pointRadius:function(t){return this._radius=t,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(t,e){switch(this._point){case 0:this._context.moveTo(t,e),this._point=1;break;case 1:this._context.lineTo(t,e);break;default:this._context.moveTo(t+this._radius,e),this._context.arc(t,e,this._radius,0,fa)}},result:Wa};var ar,lr,rr,or,gr,Br=new pt,dr={point:Wa,lineStart:function(){dr.point=Ir},lineEnd:function(){ar&&Qr(lr,rr),dr.point=Wa},polygonStart:function(){ar=!0},polygonEnd:function(){ar=null},result:function(){var t=+Br;return Br=new pt,t}};function Ir(t,e){dr.point=Qr,lr=or=t,rr=gr=e}function Qr(t,e){or-=t,gr-=e,Br.add(Za(or*or+gr*gr)),or=t,gr=e}let ur,Fr,hr,br;class Ur{constructor(t){this._append=null==t?Cr:function(t){const e=Math.floor(t);if(!(e>=0))throw new RangeError(`invalid digits: ${t}`);if(e>15)return Cr;if(e!==ur){const t=10**e;ur=e,Fr=function(e){let n=1;this._+=e[0];for(const i=e.length;n<i;++n)this._+=Math.round(arguments[n]*t)/t+e[n]}}return Fr}(t),this._radius=4.5,this._=""}pointRadius(t){return this._radius=+t,this}polygonStart(){this._line=0}polygonEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){0===this._line&&(this._+="Z"),this._point=NaN}point(t,e){switch(this._point){case 0:this._append`M${t},${e}`,this._point=1;break;case 1:this._append`L${t},${e}`;break;default:if(this._append`M${t},${e}`,this._radius!==hr||this._append!==Fr){const t=this._radius,e=this._;this._="",this._append`m0,${t}a${t},${t} 0 1,1 0,${-2*t}a${t},${t} 0 1,1 0,${2*t}z`,hr=t,Fr=this._append,br=this._,this._=e}this._+=br}}result(){const t=this._;return this._="",t.length?t:null}}function Cr(t){let e=1;this._+=t[0];for(const n=t.length;e<n;++e)this._+=arguments[e]+t[e]}function yr(t,e){let n,i,s=3,c=4.5;function a(t){return t&&("function"==typeof c&&i.pointRadius(+c.apply(this,arguments)),Ma(t,n(i))),i.result()}return a.area=function(t){return Ma(t,n(Al)),Al.result()},a.measure=function(t){return Ma(t,n(dr)),dr.result()},a.bounds=function(t){return Ma(t,n(El)),El.result()},a.centroid=function(t){return Ma(t,n(_l)),_l.result()},a.projection=function(e){return arguments.length?(n=null==e?(t=null,Gl):(t=e).stream,a):t},a.context=function(t){return arguments.length?(i=null==t?(e=null,new Ur(s)):new cr(e=t),"function"!=typeof c&&i.pointRadius(c),a):e},a.pointRadius=function(t){return arguments.length?(c="function"==typeof t?t:(i.pointRadius(+t),+t),a):c},a.digits=function(t){if(!arguments.length)return s;if(null==t)s=null;else{const e=Math.floor(t);if(!(e>=0))throw new RangeError(`invalid digits: ${t}`);s=e}return null===e&&(i=new Ur(s)),a},a.projection(t).digits(s).context(e)}function fr(t){return{stream:Gr(t)}}function Gr(t){return function(e){var n=new pr;for(var i in t)n[i]=t[i];return n.stream=e,n}}function pr(){}function mr(t,e,n){var i=t.clipExtent&&t.clipExtent();return t.scale(150).translate([0,0]),null!=i&&t.clipExtent(null),Ma(n,t.stream(El)),e(El.result()),null!=i&&t.clipExtent(i),t}function Ar(t,e,n){return mr(t,(function(n){var i=e[1][0]-e[0][0],s=e[1][1]-e[0][1],c=Math.min(i/(n[1][0]-n[0][0]),s/(n[1][1]-n[0][1])),a=+e[0][0]+(i-c*(n[1][0]+n[0][0]))/2,l=+e[0][1]+(s-c*(n[1][1]+n[0][1]))/2;t.scale(150*c).translate([a,l])}),n)}function xr(t,e,n){return Ar(t,[[0,0],e],n)}function Sr(t,e,n){return mr(t,(function(n){var i=+e,s=i/(n[1][0]-n[0][0]),c=(i-s*(n[1][0]+n[0][0]))/2,a=-s*n[0][1];t.scale(150*s).translate([c,a])}),n)}function Lr(t,e,n){return mr(t,(function(n){var i=+e,s=i/(n[1][1]-n[0][1]),c=-s*n[0][0],a=(i-s*(n[1][1]+n[0][1]))/2;t.scale(150*s).translate([c,a])}),n)}pr.prototype={constructor:pr,point:function(t,e){this.stream.point(t,e)},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 Rr=16,Xr=Sa(30*pa);function vr(t,e){return+e?function(t,e){function n(i,s,c,a,l,r,o,g,B,d,I,Q,u,F){var h=o-i,b=g-s,U=h*h+b*b;if(U>4*e&&u--){var C=a+d,y=l+I,f=r+Q,G=Za(C*C+y*y+f*f),p=wa(f/=G),m=ma(ma(f)-1)<ha||ma(c-B)<ha?(c+B)/2:xa(y,C),A=t(m,p),x=A[0],S=A[1],L=x-i,R=S-s,X=b*L-h*R;(X*X/U>e||ma((h*L+b*R)/U-.5)>.3||a*d+l*I+r*Q<Xr)&&(n(i,s,c,a,l,r,x,S,m,C/=G,y/=G,f,u,F),F.point(x,S),n(x,S,m,C,y,f,o,g,B,d,I,Q,u,F))}}return function(e){var i,s,c,a,l,r,o,g,B,d,I,Q,u={point:F,lineStart:h,lineEnd:U,polygonStart:function(){e.polygonStart(),u.lineStart=C},polygonEnd:function(){e.polygonEnd(),u.lineStart=h}};function F(n,i){n=t(n,i),e.point(n[0],n[1])}function h(){g=NaN,u.point=b,e.lineStart()}function b(i,s){var c=za([i,s]),a=t(i,s);n(g,B,o,d,I,Q,g=a[0],B=a[1],o=i,d=c[0],I=c[1],Q=c[2],Rr,e),e.point(g,B)}function U(){u.point=F,e.lineEnd()}function C(){h(),u.point=y,u.lineEnd=f}function y(t,e){b(i=t,e),s=g,c=B,a=d,l=I,r=Q,u.point=b}function f(){n(g,B,o,d,I,Q,s,c,i,a,l,r,Rr,e),u.lineEnd=U,U()}return u}}(t,e):function(t){return Gr({point:function(e,n){e=t(e,n),this.stream.point(e[0],e[1])}})}(t)}var Nr=Gr({point:function(t,e){this.stream.point(t*pa,e*pa)}});function Zr(t,e,n,i,s,c){if(!c)return function(t,e,n,i,s){function c(c,a){return[e+t*(c*=i),n-t*(a*=s)]}return c.invert=function(c,a){return[(c-e)/t*i,(n-a)/t*s]},c}(t,e,n,i,s);var a=Sa(c),l=va(c),r=a*t,o=l*t,g=a/t,B=l/t,d=(l*n-a*e)/t,I=(l*e+a*n)/t;function Q(t,c){return[r*(t*=i)-o*(c*=s)+e,n-o*t-r*c]}return Q.invert=function(t,e){return[i*(g*t-B*e+d),s*(I-B*t-g*e)]},Q}function Er(t){return Vr((function(){return t}))()}function Vr(t){var e,n,i,s,c,a,l,r,o,g,B=150,d=480,I=250,Q=0,u=0,F=0,h=0,b=0,U=0,C=1,y=1,f=null,G=Ql,p=null,m=Gl,A=.5;function x(t){return r(t[0]*pa,t[1]*pa)}function S(t){return(t=r.invert(t[0],t[1]))&&[t[0]*Ga,t[1]*Ga]}function L(){var t=Zr(B,0,0,C,y,U).apply(null,e(Q,u)),i=Zr(B,d-t[0],I-t[1],C,y,U);return n=tl(F,h,b),l=$a(e,i),r=$a(n,l),a=vr(l,A),R()}function R(){return o=g=null,x}return x.stream=function(t){return o&&g===t?o:o=Nr(function(t){return Gr({point:function(e,n){var i=t(e,n);return this.stream.point(i[0],i[1])}})}(n)(G(a(m(g=t)))))},x.preclip=function(t){return arguments.length?(G=t,f=void 0,R()):G},x.postclip=function(t){return arguments.length?(m=t,p=i=s=c=null,R()):m},x.clipAngle=function(t){return arguments.length?(G=+t?ul(f=t*pa):(f=null,Ql),R()):f*Ga},x.clipExtent=function(t){return arguments.length?(m=null==t?(p=i=s=c=null,Gl):bl(p=+t[0][0],i=+t[0][1],s=+t[1][0],c=+t[1][1]),R()):null==p?null:[[p,i],[s,c]]},x.scale=function(t){return arguments.length?(B=+t,L()):B},x.translate=function(t){return arguments.length?(d=+t[0],I=+t[1],L()):[d,I]},x.center=function(t){return arguments.length?(Q=t[0]%360*pa,u=t[1]%360*pa,L()):[Q*Ga,u*Ga]},x.rotate=function(t){return arguments.length?(F=t[0]%360*pa,h=t[1]%360*pa,b=t.length>2?t[2]%360*pa:0,L()):[F*Ga,h*Ga,b*Ga]},x.angle=function(t){return arguments.length?(U=t%360*pa,L()):U*Ga},x.reflectX=function(t){return arguments.length?(C=t?-1:1,L()):C<0},x.reflectY=function(t){return arguments.length?(y=t?-1:1,L()):y<0},x.precision=function(t){return arguments.length?(a=vr(l,A=t*t),R()):Za(A)},x.fitExtent=function(t,e){return Ar(x,t,e)},x.fitSize=function(t,e){return xr(x,t,e)},x.fitWidth=function(t,e){return Sr(x,t,e)},x.fitHeight=function(t,e){return Lr(x,t,e)},function(){return e=t.apply(this,arguments),x.invert=e.invert&&S,L()}}function wr(t){var e=0,n=Ua/3,i=Vr(t),s=i(e,n);return s.parallels=function(t){return arguments.length?i(e=t[0]*pa,n=t[1]*pa):[e*Ga,n*Ga]},s}function Wr(t,e){var n=va(t),i=(n+va(e))/2;if(ma(i)<ha)return function(t){var e=Sa(t);function n(t,n){return[t*e,va(n)/e]}return n.invert=function(t,n){return[t/e,wa(n*e)]},n}(t);var s=1+n*(2*i-n),c=Za(s)/i;function a(t,e){var n=Za(s-2*i*va(e))/i;return[n*va(t*=i),c-n*Sa(t)]}return a.invert=function(t,e){var n=c-e,a=xa(t,ma(n))*Na(n);return n*i<0&&(a-=Ua*Na(t)*Na(n)),[a/i,wa((s-(t*t+n*n)*i*i)/(2*i))]},a}function Hr(){return wr(Wr).scale(155.424).center([0,33.6442])}function Dr(){return Hr().parallels([29.5,45.5]).scale(1070).translate([480,250]).rotate([96,0]).center([-.6,38.7])}function Yr(){var t,e,n,i,s,c,a=Dr(),l=Hr().rotate([154,0]).center([-2,58.5]).parallels([55,65]),r=Hr().rotate([157,0]).center([-3,19.9]).parallels([8,18]),o={point:function(t,e){c=[t,e]}};function g(t){var e=t[0],a=t[1];return c=null,n.point(e,a),c||(i.point(e,a),c)||(s.point(e,a),c)}function B(){return t=e=null,g}return g.invert=function(t){var e=a.scale(),n=a.translate(),i=(t[0]-n[0])/e,s=(t[1]-n[1])/e;return(s>=.12&&s<.234&&i>=-.425&&i<-.214?l:s>=.166&&s<.234&&i>=-.214&&i<-.115?r:a).invert(t)},g.stream=function(n){return t&&e===n?t:t=function(t){var e=t.length;return{point:function(n,i){for(var s=-1;++s<e;)t[s].point(n,i)},sphere:function(){for(var n=-1;++n<e;)t[n].sphere()},lineStart:function(){for(var n=-1;++n<e;)t[n].lineStart()},lineEnd:function(){for(var n=-1;++n<e;)t[n].lineEnd()},polygonStart:function(){for(var n=-1;++n<e;)t[n].polygonStart()},polygonEnd:function(){for(var n=-1;++n<e;)t[n].polygonEnd()}}}([a.stream(e=n),l.stream(n),r.stream(n)])},g.precision=function(t){return arguments.length?(a.precision(t),l.precision(t),r.precision(t),B()):a.precision()},g.scale=function(t){return arguments.length?(a.scale(t),l.scale(.35*t),r.scale(t),g.translate(a.translate())):a.scale()},g.translate=function(t){if(!arguments.length)return a.translate();var e=a.scale(),c=+t[0],g=+t[1];return n=a.translate(t).clipExtent([[c-.455*e,g-.238*e],[c+.455*e,g+.238*e]]).stream(o),i=l.translate([c-.307*e,g+.201*e]).clipExtent([[c-.425*e+ha,g+.12*e+ha],[c-.214*e-ha,g+.234*e-ha]]).stream(o),s=r.translate([c-.205*e,g+.212*e]).clipExtent([[c-.214*e+ha,g+.166*e+ha],[c-.115*e-ha,g+.234*e-ha]]).stream(o),B()},g.fitExtent=function(t,e){return Ar(g,t,e)},g.fitSize=function(t,e){return xr(g,t,e)},g.fitWidth=function(t,e){return Sr(g,t,e)},g.fitHeight=function(t,e){return Lr(g,t,e)},g.scale(1070)}function kr(t){return function(e,n){var i=Sa(e),s=Sa(n),c=t(i*s);return c===1/0?[2,0]:[c*s*va(e),c*va(n)]}}function Jr(t){return function(e,n){var i=Za(e*e+n*n),s=t(i),c=va(s),a=Sa(s);return[xa(e*c,i*a),wa(i&&n*c/i)]}}var Mr=kr((function(t){return Za(2/(1+t))}));function Tr(){return Er(Mr).scale(124.75).clipAngle(179.999)}Mr.invert=Jr((function(t){return 2*wa(t/2)}));var zr=kr((function(t){return(t=Va(t))&&t/va(t)}));function Kr(){return Er(zr).scale(79.4188).clipAngle(179.999)}function Or(t,e){return[t,Ra(Ea((Ca+e)/2))]}function _r(){return Pr(Or).scale(961/fa)}function Pr(t){var e,n,i,s=Er(t),c=s.center,a=s.scale,l=s.translate,r=s.clipExtent,o=null;function g(){var c=Ua*a(),l=s(function(t){function e(e){return(e=t(e[0]*pa,e[1]*pa))[0]*=Ga,e[1]*=Ga,e}return t=tl(t[0]*pa,t[1]*pa,t.length>2?t[2]*pa:0),e.invert=function(e){return(e=t.invert(e[0]*pa,e[1]*pa))[0]*=Ga,e[1]*=Ga,e},e}(s.rotate()).invert([0,0]));return r(null==o?[[l[0]-c,l[1]-c],[l[0]+c,l[1]+c]]:t===Or?[[Math.max(l[0]-c,o),e],[Math.min(l[0]+c,n),i]]:[[o,Math.max(l[1]-c,e)],[n,Math.min(l[1]+c,i)]])}return s.scale=function(t){return arguments.length?(a(t),g()):a()},s.translate=function(t){return arguments.length?(l(t),g()):l()},s.center=function(t){return arguments.length?(c(t),g()):c()},s.clipExtent=function(t){return arguments.length?(null==t?o=e=n=i=null:(o=+t[0][0],e=+t[0][1],n=+t[1][0],i=+t[1][1]),g()):null==o?null:[[o,e],[n,i]]},g()}function jr(t){return Ea((Ca+t)/2)}function $r(t,e){var n=Sa(t),i=t===e?va(t):Ra(n/Sa(e))/Ra(jr(e)/jr(t)),s=n*Xa(jr(t),i)/i;if(!i)return Or;function c(t,e){s>0?e<-Ca+ha&&(e=-Ca+ha):e>Ca-ha&&(e=Ca-ha);var n=s/Xa(jr(e),i);return[n*va(i*t),s-n*Sa(i*t)]}return c.invert=function(t,e){var n=s-e,c=Na(i)*Za(t*t+n*n),a=xa(t,ma(n))*Na(n);return n*i<0&&(a-=Ua*Na(t)*Na(n)),[a/i,2*Aa(Xa(s/c,1/i))-Ca]},c}function qr(){return wr($r).scale(109.5).parallels([30,30])}function to(t,e){return[t,e]}function eo(){return Er(to).scale(152.63)}function no(t,e){var n=Sa(t),i=t===e?va(t):(n-Sa(e))/(e-t),s=n/i+t;if(ma(i)<ha)return to;function c(t,e){var n=s-e,c=i*t;return[n*va(c),s-n*Sa(c)]}return c.invert=function(t,e){var n=s-e,c=xa(t,ma(n))*Na(n);return n*i<0&&(c-=Ua*Na(t)*Na(n)),[c/i,s-Na(i)*Za(t*t+n*n)]},c}function io(){return wr(no).scale(131.154).center([0,13.9389])}zr.invert=Jr((function(t){return t})),Or.invert=function(t,e){return[t,2*Aa(La(e))-Ca]},to.invert=to;var so=1.340264,co=-.081106,ao=893e-6,lo=.003796,ro=Za(3)/2;function oo(t,e){var n=wa(ro*va(e)),i=n*n,s=i*i*i;return[t*Sa(n)/(ro*(so+3*co*i+s*(7*ao+9*lo*i))),n*(so+co*i+s*(ao+lo*i))]}function go(){return Er(oo).scale(177.158)}function Bo(t,e){var n=Sa(e),i=Sa(t)*n;return[n*va(t)/i,va(e)/i]}function Io(){return Er(Bo).scale(144.049).clipAngle(60)}function Qo(t,e){return[Sa(e)*va(t),va(e)]}function uo(){return Er(Qo).scale(249.5).clipAngle(90+ha)}function Fo(t,e){var n=Sa(e),i=1+Sa(t)*n;return[n*va(t)/i,va(e)/i]}function ho(){return Er(Fo).scale(250).clipAngle(142)}function bo(t,e){return[Ra(Ea((Ca+e)/2)),-t]}function Uo(){var t=Pr(bo),e=t.center,n=t.rotate;return t.center=function(t){return arguments.length?e([-t[1],t[0]]):[(t=e())[1],-t[0]]},t.rotate=function(t){return arguments.length?n([t[0],t[1],t.length>2?t[2]+90:90]):[(t=n())[0],t[1],t[2]-90]},n([0,0,90]).scale(159.155)}function Co(t,e){switch(arguments.length){case 0:break;case 1:this.range(t);break;default:this.range(e).domain(t)}return this}function yo(t,e){switch(arguments.length){case 0:break;case 1:"function"==typeof t?this.interpolator(t):this.range(t);break;default:this.domain(t),"function"==typeof e?this.interpolator(e):this.range(e)}return this}oo.invert=function(t,e){for(var n,i=e,s=i*i,c=s*s*s,a=0;a<12&&(c=(s=(i-=n=(i*(so+co*s+c*(ao+lo*s))-e)/(so+3*co*s+c*(7*ao+9*lo*s)))*i)*s*s,!(ma(n)<ba));++a);return[ro*t*(so+3*co*s+c*(7*ao+9*lo*s))/Sa(i),wa(va(i)/ro)]},Bo.invert=Jr(Aa),Qo.invert=Jr(wa),Fo.invert=Jr((function(t){return 2*Aa(t)})),bo.invert=function(t,e){return[-e,2*Aa(La(t))-Ca]};const fo=Symbol("implicit");function Go(){var t=new mt,e=[],n=[],i=fo;function s(s){let c=t.get(s);if(void 0===c){if(i!==fo)return i;t.set(s,c=e.push(s)-1)}return n[c%n.length]}return s.domain=function(n){if(!arguments.length)return e.slice();e=[],t=new mt;for(const i of n)t.has(i)||t.set(i,e.push(i)-1);return s},s.range=function(t){return arguments.length?(n=Array.from(t),s):n.slice()},s.unknown=function(t){return arguments.length?(i=t,s):i},s.copy=function(){return Go(e,n).unknown(i)},Co.apply(s,arguments),s}function po(){var t,e,n=Go().unknown(void 0),i=n.domain,s=n.range,c=0,a=1,l=!1,r=0,o=0,g=.5;function B(){var n=i().length,B=a<c,d=B?a:c,I=B?c:a;t=(I-d)/Math.max(1,n-r+2*o),l&&(t=Math.floor(t)),d+=(I-d-t*(n-r))*g,e=t*(1-r),l&&(d=Math.round(d),e=Math.round(e));var Q=ge(n).map((function(e){return d+t*e}));return s(B?Q.reverse():Q)}return delete n.unknown,n.domain=function(t){return arguments.length?(i(t),B()):i()},n.range=function(t){return arguments.length?([c,a]=t,c=+c,a=+a,B()):[c,a]},n.rangeRound=function(t){return[c,a]=t,c=+c,a=+a,l=!0,B()},n.bandwidth=function(){return e},n.step=function(){return t},n.round=function(t){return arguments.length?(l=!!t,B()):l},n.padding=function(t){return arguments.length?(r=Math.min(1,o=+t),B()):r},n.paddingInner=function(t){return arguments.length?(r=Math.min(1,t),B()):r},n.paddingOuter=function(t){return arguments.length?(o=+t,B()):o},n.align=function(t){return arguments.length?(g=Math.max(0,Math.min(1,t)),B()):g},n.copy=function(){return po(i(),[c,a]).round(l).paddingInner(r).paddingOuter(o).align(g)},Co.apply(B(),arguments)}function mo(t){var e=t.copy;return t.padding=t.paddingOuter,delete t.paddingInner,delete t.paddingOuter,t.copy=function(){return mo(e())},t}function Ao(){return mo(po.apply(null,arguments).paddingInner(1))}function xo(t){return+t}var So=[0,1];function Lo(t){return t}function Ro(t,e){return(e-=t=+t)?function(n){return(n-t)/e}:function(t){return function(){return t}}(isNaN(e)?NaN:.5)}function Xo(t,e,n){var i=t[0],s=t[1],c=e[0],a=e[1];return s<i?(i=Ro(s,i),c=n(a,c)):(i=Ro(i,s),c=n(c,a)),function(t){return c(i(t))}}function vo(t,e,n){var i=Math.min(t.length,e.length)-1,s=new Array(i),c=new Array(i),a=-1;for(t[i]<t[0]&&(t=t.slice().reverse(),e=e.slice().reverse());++a<i;)s[a]=Ro(t[a],t[a+1]),c[a]=n(e[a],e[a+1]);return function(e){var n=ut(t,e,1,i)-1;return c[n](s[n](e))}}function No(t,e){return e.domain(t.domain()).range(t.range()).interpolate(t.interpolate()).clamp(t.clamp()).unknown(t.unknown())}function Zo(){var t,e,n,i,s,c,a=So,l=So,r=Rs,o=Lo;function g(){var t=Math.min(a.length,l.length);return o!==Lo&&(o=function(t,e){var n;return t>e&&(n=t,t=e,e=n),function(n){return Math.max(t,Math.min(e,n))}}(a[0],a[t-1])),i=t>2?vo:Xo,s=c=null,B}function B(e){return null==e||isNaN(e=+e)?n:(s||(s=i(a.map(t),l,r)))(t(o(e)))}return B.invert=function(n){return o(e((c||(c=i(l,a.map(t),ms)))(n)))},B.domain=function(t){return arguments.length?(a=Array.from(t,xo),g()):a.slice()},B.range=function(t){return arguments.length?(l=Array.from(t),g()):l.slice()},B.rangeRound=function(t){return l=Array.from(t),r=Xs,g()},B.clamp=function(t){return arguments.length?(o=!!t||Lo,g()):o!==Lo},B.interpolate=function(t){return arguments.length?(r=t,g()):r},B.unknown=function(t){return arguments.length?(n=t,B):n},function(n,i){return t=n,e=i,g()}}function Eo(){return Zo()(Lo,Lo)}function Vo(t,e,n,i){var s,c=zt(t,e,n);switch((i=aa(null==i?",f":i)).type){case"s":var a=Math.max(Math.abs(t),Math.abs(e));return null!=i.precision||isNaN(s=function(t,e){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(ia(e)/3)))-ia(Math.abs(t)))}(c,a))||(i.precision=s),Ia(i,a);case"":case"e":case"g":case"p":case"r":null!=i.precision||isNaN(s=function(t,e){return t=Math.abs(t),e=Math.abs(e)-t,Math.max(0,ia(e)-ia(t))+1}(c,Math.max(Math.abs(t),Math.abs(e))))||(i.precision=s-("e"===i.type));break;case"f":case"%":null!=i.precision||isNaN(s=function(t){return Math.max(0,-ia(Math.abs(t)))}(c))||(i.precision=s-2*("%"===i.type))}return da(i)}function wo(t){var e=t.domain;return t.ticks=function(t){var n=e();return Mt(n[0],n[n.length-1],null==t?10:t)},t.tickFormat=function(t,n){var i=e();return Vo(i[0],i[i.length-1],null==t?10:t,n)},t.nice=function(n){null==n&&(n=10);var i,s,c=e(),a=0,l=c.length-1,r=c[a],o=c[l],g=10;for(o<r&&(s=r,r=o,o=s,s=a,a=l,l=s);g-- >0;){if((s=Tt(r,o,n))===i)return c[a]=r,c[l]=o,e(c);if(s>0)r=Math.floor(r/s)*s,o=Math.ceil(o/s)*s;else{if(!(s<0))break;r=Math.ceil(r*s)/s,o=Math.floor(o*s)/s}i=s}return t},t}function Wo(){var t=Eo();return t.copy=function(){return No(t,Wo())},Co.apply(t,arguments),wo(t)}function Ho(t){var e;function n(t){return null==t||isNaN(t=+t)?e:t}return n.invert=n,n.domain=n.range=function(e){return arguments.length?(t=Array.from(e,xo),n):t.slice()},n.unknown=function(t){return arguments.length?(e=t,n):e},n.copy=function(){return Ho(t).unknown(e)},t=arguments.length?Array.from(t,xo):[0,1],wo(n)}function Do(t,e){var n,i=0,s=(t=t.slice()).length-1,c=t[i],a=t[s];return a<c&&(n=i,i=s,s=n,n=c,c=a,a=n),t[i]=e.floor(c),t[s]=e.ceil(a),t}function Yo(t){return Math.log(t)}function ko(t){return Math.exp(t)}function Jo(t){return-Math.log(-t)}function Mo(t){return-Math.exp(-t)}function To(t){return isFinite(t)?+("1e"+t):t<0?0:t}function zo(t){return(e,n)=>-t(-e,n)}function Ko(t){const e=t(Yo,ko),n=e.domain;let i,s,c=10;function a(){return i=function(t){return t===Math.E?Math.log:10===t&&Math.log10||2===t&&Math.log2||(t=Math.log(t),e=>Math.log(e)/t)}(c),s=function(t){return 10===t?To:t===Math.E?Math.exp:e=>Math.pow(t,e)}(c),n()[0]<0?(i=zo(i),s=zo(s),t(Jo,Mo)):t(Yo,ko),e}return e.base=function(t){return arguments.length?(c=+t,a()):c},e.domain=function(t){return arguments.length?(n(t),a()):n()},e.ticks=t=>{const e=n();let a=e[0],l=e[e.length-1];const r=l<a;r&&([a,l]=[l,a]);let o,g,B=i(a),d=i(l);const I=null==t?10:+t;let Q=[];if(!(c%1)&&d-B<I){if(B=Math.floor(B),d=Math.ceil(d),a>0){for(;B<=d;++B)for(o=1;o<c;++o)if(g=B<0?o/s(-B):o*s(B),!(g<a)){if(g>l)break;Q.push(g)}}else for(;B<=d;++B)for(o=c-1;o>=1;--o)if(g=B>0?o/s(-B):o*s(B),!(g<a)){if(g>l)break;Q.push(g)}2*Q.length<I&&(Q=Mt(a,l,I))}else Q=Mt(B,d,Math.min(d-B,I)).map(s);return r?Q.reverse():Q},e.tickFormat=(t,n)=>{if(null==t&&(t=10),null==n&&(n=10===c?"s":","),"function"!=typeof n&&(c%1||null!=(n=aa(n)).precision||(n.trim=!0),n=da(n)),t===1/0)return n;const a=Math.max(1,c*t/e.ticks().length);return t=>{let e=t/s(Math.round(i(t)));return e*c<c-.5&&(e*=c),e<=a?n(t):""}},e.nice=()=>n(Do(n(),{floor:t=>s(Math.floor(i(t))),ceil:t=>s(Math.ceil(i(t)))})),e}function Oo(){const t=Ko(Zo()).domain([1,10]);return t.copy=()=>No(t,Oo()).base(t.base()),Co.apply(t,arguments),t}function _o(t){return function(e){return Math.sign(e)*Math.log1p(Math.abs(e/t))}}function Po(t){return function(e){return Math.sign(e)*Math.expm1(Math.abs(e))*t}}function jo(t){var e=1,n=t(_o(e),Po(e));return n.constant=function(n){return arguments.length?t(_o(e=+n),Po(e)):e},wo(n)}function $o(){var t=jo(Zo());return t.copy=function(){return No(t,$o()).constant(t.constant())},Co.apply(t,arguments)}function qo(t){return function(e){return e<0?-Math.pow(-e,t):Math.pow(e,t)}}function tg(t){return t<0?-Math.sqrt(-t):Math.sqrt(t)}function eg(t){return t<0?-t*t:t*t}function ng(t){var e=t(Lo,Lo),n=1;return e.exponent=function(e){return arguments.length?1===(n=+e)?t(Lo,Lo):.5===n?t(tg,eg):t(qo(n),qo(1/n)):n},wo(e)}function ig(){var t=ng(Zo());return t.copy=function(){return No(t,ig()).exponent(t.exponent())},Co.apply(t,arguments),t}function sg(){var t,e=[],n=[],i=[];function s(){var t=0,s=Math.max(1,n.length);for(i=new Array(s-1);++t<s;)i[t-1]=ne(e,t/s);return c}function c(e){return null==e||isNaN(e=+e)?t:n[ut(i,e)]}return c.invertExtent=function(t){var s=n.indexOf(t);return s<0?[NaN,NaN]:[s>0?i[s-1]:e[0],s<i.length?i[s]:e[e.length-1]]},c.domain=function(t){if(!arguments.length)return e.slice();e=[];for(let n of t)null==n||isNaN(n=+n)||e.push(n);return e.sort(gt),s()},c.range=function(t){return arguments.length?(n=Array.from(t),s()):n.slice()},c.unknown=function(e){return arguments.length?(t=e,c):t},c.quantiles=function(){return i.slice()},c.copy=function(){return sg().domain(e).range(n).unknown(t)},Co.apply(c,arguments)}function cg(){var t,e=[.5],n=[0,1],i=1;function s(s){return null!=s&&s<=s?n[ut(e,s,0,i)]:t}return s.domain=function(t){return arguments.length?(e=Array.from(t),i=Math.min(e.length,n.length-1),s):e.slice()},s.range=function(t){return arguments.length?(n=Array.from(t),i=Math.min(e.length,n.length-1),s):n.slice()},s.invertExtent=function(t){var i=n.indexOf(t);return[e[i-1],e[i]]},s.unknown=function(e){return arguments.length?(t=e,s):t},s.copy=function(){return cg().domain(e).range(n).unknown(t)},Co.apply(s,arguments)}const ag=new Date,lg=new Date;function rg(t,e,n,i){function s(e){return t(e=0===arguments.length?new Date:new Date(+e)),e}return s.floor=e=>(t(e=new Date(+e)),e),s.ceil=n=>(t(n=new Date(n-1)),e(n,1),t(n),n),s.round=t=>{const e=s(t),n=s.ceil(t);return t-e<n-t?e:n},s.offset=(t,n)=>(e(t=new Date(+t),null==n?1:Math.floor(n)),t),s.range=(n,i,c)=>{const a=[];if(n=s.ceil(n),c=null==c?1:Math.floor(c),!(n<i&&c>0))return a;let l;do{a.push(l=new Date(+n)),e(n,c),t(n)}while(l<n&&n<i);return a},s.filter=n=>rg((e=>{if(e>=e)for(;t(e),!n(e);)e.setTime(e-1)}),((t,i)=>{if(t>=t)if(i<0)for(;++i<=0;)for(;e(t,-1),!n(t););else for(;--i>=0;)for(;e(t,1),!n(t););})),n&&(s.count=(e,i)=>(ag.setTime(+e),lg.setTime(+i),t(ag),t(lg),Math.floor(n(ag,lg))),s.every=t=>(t=Math.floor(t),isFinite(t)&&t>0?t>1?s.filter(i?e=>i(e)%t==0:e=>s.count(0,e)%t==0):s:null)),s}const og=rg((()=>{}),((t,e)=>{t.setTime(+t+e)}),((t,e)=>e-t));og.every=t=>(t=Math.floor(t),isFinite(t)&&t>0?t>1?rg((e=>{e.setTime(Math.floor(e/t)*t)}),((e,n)=>{e.setTime(+e+n*t)}),((e,n)=>(n-e)/t)):og:null),og.range;const gg=1e3,Bg=6e4,dg=36e5,Ig=864e5,Qg=6048e5,ug=2592e6,Fg=31536e6,hg=rg((t=>{t.setTime(t-t.getMilliseconds())}),((t,e)=>{t.setTime(+t+e*gg)}),((t,e)=>(e-t)/gg),(t=>t.getUTCSeconds()));hg.range;const bg=rg((t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*gg)}),((t,e)=>{t.setTime(+t+e*Bg)}),((t,e)=>(e-t)/Bg),(t=>t.getMinutes()));bg.range;const Ug=rg((t=>{t.setUTCSeconds(0,0)}),((t,e)=>{t.setTime(+t+e*Bg)}),((t,e)=>(e-t)/Bg),(t=>t.getUTCMinutes()));Ug.range;const Cg=rg((t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*gg-t.getMinutes()*Bg)}),((t,e)=>{t.setTime(+t+e*dg)}),((t,e)=>(e-t)/dg),(t=>t.getHours()));Cg.range;const yg=rg((t=>{t.setUTCMinutes(0,0,0)}),((t,e)=>{t.setTime(+t+e*dg)}),((t,e)=>(e-t)/dg),(t=>t.getUTCHours()));yg.range;const fg=rg((t=>t.setHours(0,0,0,0)),((t,e)=>t.setDate(t.getDate()+e)),((t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*Bg)/Ig),(t=>t.getDate()-1));fg.range;const Gg=rg((t=>{t.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCDate(t.getUTCDate()+e)}),((t,e)=>(e-t)/Ig),(t=>t.getUTCDate()-1));Gg.range;const pg=rg((t=>{t.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCDate(t.getUTCDate()+e)}),((t,e)=>(e-t)/Ig),(t=>Math.floor(t/Ig)));function mg(t){return rg((e=>{e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)}),((t,e)=>{t.setDate(t.getDate()+7*e)}),((t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*Bg)/Qg))}pg.range;const Ag=mg(0),xg=mg(1),Sg=mg(2),Lg=mg(3),Rg=mg(4),Xg=mg(5),vg=mg(6);function Ng(t){return rg((e=>{e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCDate(t.getUTCDate()+7*e)}),((t,e)=>(e-t)/Qg))}Ag.range,xg.range,Sg.range,Lg.range,Rg.range,Xg.range,vg.range;const Zg=Ng(0),Eg=Ng(1),Vg=Ng(2),wg=Ng(3),Wg=Ng(4),Hg=Ng(5),Dg=Ng(6);Zg.range,Eg.range,Vg.range,wg.range,Wg.range,Hg.range,Dg.range;const Yg=rg((t=>{t.setDate(1),t.setHours(0,0,0,0)}),((t,e)=>{t.setMonth(t.getMonth()+e)}),((t,e)=>e.getMonth()-t.getMonth()+12*(e.getFullYear()-t.getFullYear())),(t=>t.getMonth()));Yg.range;const kg=rg((t=>{t.setUTCDate(1),t.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCMonth(t.getUTCMonth()+e)}),((t,e)=>e.getUTCMonth()-t.getUTCMonth()+12*(e.getUTCFullYear()-t.getUTCFullYear())),(t=>t.getUTCMonth()));kg.range;const Jg=rg((t=>{t.setMonth(0,1),t.setHours(0,0,0,0)}),((t,e)=>{t.setFullYear(t.getFullYear()+e)}),((t,e)=>e.getFullYear()-t.getFullYear()),(t=>t.getFullYear()));Jg.every=t=>isFinite(t=Math.floor(t))&&t>0?rg((e=>{e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)}),((e,n)=>{e.setFullYear(e.getFullYear()+n*t)})):null,Jg.range;const Mg=rg((t=>{t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)}),((t,e)=>{t.setUTCFullYear(t.getUTCFullYear()+e)}),((t,e)=>e.getUTCFullYear()-t.getUTCFullYear()),(t=>t.getUTCFullYear()));function Tg(t,e,n,i,s,c){const a=[[hg,1,gg],[hg,5,5e3],[hg,15,15e3],[hg,30,3e4],[c,1,Bg],[c,5,3e5],[c,15,9e5],[c,30,18e5],[s,1,dg],[s,3,108e5],[s,6,216e5],[s,12,432e5],[i,1,Ig],[i,2,1728e5],[n,1,Qg],[e,1,ug],[e,3,7776e6],[t,1,Fg]];function l(e,n,i){const s=Math.abs(n-e)/i,c=dt((([,,t])=>t)).right(a,s);if(c===a.length)return t.every(zt(e/Fg,n/Fg,i));if(0===c)return og.every(Math.max(zt(e,n,i),1));const[l,r]=a[s/a[c-1][2]<a[c][2]/s?c-1:c];return l.every(r)}return[function(t,e,n){const i=e<t;i&&([t,e]=[e,t]);const s=n&&"function"==typeof n.range?n:l(t,e,n),c=s?s.range(t,+e+1):[];return i?c.reverse():c},l]}Mg.every=t=>isFinite(t=Math.floor(t))&&t>0?rg((e=>{e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)}),((e,n)=>{e.setUTCFullYear(e.getUTCFullYear()+n*t)})):null,Mg.range;const[zg,Kg]=Tg(Mg,kg,Zg,pg,yg,Ug),[Og,_g]=Tg(Jg,Yg,Ag,fg,Cg,bg);function Pg(t){if(0<=t.y&&t.y<100){var e=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return e.setFullYear(t.y),e}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function jg(t){if(0<=t.y&&t.y<100){var e=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return e.setUTCFullYear(t.y),e}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function $g(t,e,n){return{y:t,m:e,d:n,H:0,M:0,S:0,L:0}}var qg,tB,eB,nB={"-":"",_:" ",0:"0"},iB=/^\s*\d+/,sB=/^%/,cB=/[\\^$*+?|[\]().{}]/g;function aB(t,e,n){var i=t<0?"-":"",s=(i?-t:t)+"",c=s.length;return i+(c<n?new Array(n-c+1).join(e)+s:s)}function lB(t){return t.replace(cB,"\\$&")}function rB(t){return new RegExp("^(?:"+t.map(lB).join("|")+")","i")}function oB(t){return new Map(t.map(((t,e)=>[t.toLowerCase(),e])))}function gB(t,e,n){var i=iB.exec(e.slice(n,n+1));return i?(t.w=+i[0],n+i[0].length):-1}function BB(t,e,n){var i=iB.exec(e.slice(n,n+1));return i?(t.u=+i[0],n+i[0].length):-1}function dB(t,e,n){var i=iB.exec(e.slice(n,n+2));return i?(t.U=+i[0],n+i[0].length):-1}function IB(t,e,n){var i=iB.exec(e.slice(n,n+2));return i?(t.V=+i[0],n+i[0].length):-1}function QB(t,e,n){var i=iB.exec(e.slice(n,n+2));return i?(t.W=+i[0],n+i[0].length):-1}function uB(t,e,n){var i=iB.exec(e.slice(n,n+4));return i?(t.y=+i[0],n+i[0].length):-1}function FB(t,e,n){var i=iB.exec(e.slice(n,n+2));return i?(t.y=+i[0]+(+i[0]>68?1900:2e3),n+i[0].length):-1}function hB(t,e,n){var i=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(n,n+6));return i?(t.Z=i[1]?0:-(i[2]+(i[3]||"00")),n+i[0].length):-1}function bB(t,e,n){var i=iB.exec(e.slice(n,n+1));return i?(t.q=3*i[0]-3,n+i[0].length):-1}function UB(t,e,n){var i=iB.exec(e.slice(n,n+2));return i?(t.m=i[0]-1,n+i[0].length):-1}function CB(t,e,n){var i=iB.exec(e.slice(n,n+2));return i?(t.d=+i[0],n+i[0].length):-1}function yB(t,e,n){var i=iB.exec(e.slice(n,n+3));return i?(t.m=0,t.d=+i[0],n+i[0].length):-1}function fB(t,e,n){var i=iB.exec(e.slice(n,n+2));return i?(t.H=+i[0],n+i[0].length):-1}function GB(t,e,n){var i=iB.exec(e.slice(n,n+2));return i?(t.M=+i[0],n+i[0].length):-1}function pB(t,e,n){var i=iB.exec(e.slice(n,n+2));return i?(t.S=+i[0],n+i[0].length):-1}function mB(t,e,n){var i=iB.exec(e.slice(n,n+3));return i?(t.L=+i[0],n+i[0].length):-1}function AB(t,e,n){var i=iB.exec(e.slice(n,n+6));return i?(t.L=Math.floor(i[0]/1e3),n+i[0].length):-1}function xB(t,e,n){var i=sB.exec(e.slice(n,n+1));return i?n+i[0].length:-1}function SB(t,e,n){var i=iB.exec(e.slice(n));return i?(t.Q=+i[0],n+i[0].length):-1}function LB(t,e,n){var i=iB.exec(e.slice(n));return i?(t.s=+i[0],n+i[0].length):-1}function RB(t,e){return aB(t.getDate(),e,2)}function XB(t,e){return aB(t.getHours(),e,2)}function vB(t,e){return aB(t.getHours()%12||12,e,2)}function NB(t,e){return aB(1+fg.count(Jg(t),t),e,3)}function ZB(t,e){return aB(t.getMilliseconds(),e,3)}function EB(t,e){return ZB(t,e)+"000"}function VB(t,e){return aB(t.getMonth()+1,e,2)}function wB(t,e){return aB(t.getMinutes(),e,2)}function WB(t,e){return aB(t.getSeconds(),e,2)}function HB(t){var e=t.getDay();return 0===e?7:e}function DB(t,e){return aB(Ag.count(Jg(t)-1,t),e,2)}function YB(t){var e=t.getDay();return e>=4||0===e?Rg(t):Rg.ceil(t)}function kB(t,e){return t=YB(t),aB(Rg.count(Jg(t),t)+(4===Jg(t).getDay()),e,2)}function JB(t){return t.getDay()}function MB(t,e){return aB(xg.count(Jg(t)-1,t),e,2)}function TB(t,e){return aB(t.getFullYear()%100,e,2)}function zB(t,e){return aB((t=YB(t)).getFullYear()%100,e,2)}function KB(t,e){return aB(t.getFullYear()%1e4,e,4)}function OB(t,e){var n=t.getDay();return aB((t=n>=4||0===n?Rg(t):Rg.ceil(t)).getFullYear()%1e4,e,4)}function _B(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+aB(e/60|0,"0",2)+aB(e%60,"0",2)}function PB(t,e){return aB(t.getUTCDate(),e,2)}function jB(t,e){return aB(t.getUTCHours(),e,2)}function $B(t,e){return aB(t.getUTCHours()%12||12,e,2)}function qB(t,e){return aB(1+Gg.count(Mg(t),t),e,3)}function td(t,e){return aB(t.getUTCMilliseconds(),e,3)}function ed(t,e){return td(t,e)+"000"}function nd(t,e){return aB(t.getUTCMonth()+1,e,2)}function id(t,e){return aB(t.getUTCMinutes(),e,2)}function sd(t,e){return aB(t.getUTCSeconds(),e,2)}function cd(t){var e=t.getUTCDay();return 0===e?7:e}function ad(t,e){return aB(Zg.count(Mg(t)-1,t),e,2)}function ld(t){var e=t.getUTCDay();return e>=4||0===e?Wg(t):Wg.ceil(t)}function rd(t,e){return t=ld(t),aB(Wg.count(Mg(t),t)+(4===Mg(t).getUTCDay()),e,2)}function od(t){return t.getUTCDay()}function gd(t,e){return aB(Eg.count(Mg(t)-1,t),e,2)}function Bd(t,e){return aB(t.getUTCFullYear()%100,e,2)}function dd(t,e){return aB((t=ld(t)).getUTCFullYear()%100,e,2)}function Id(t,e){return aB(t.getUTCFullYear()%1e4,e,4)}function Qd(t,e){var n=t.getUTCDay();return aB((t=n>=4||0===n?Wg(t):Wg.ceil(t)).getUTCFullYear()%1e4,e,4)}function ud(){return"+0000"}function Fd(){return"%"}function hd(t){return+t}function bd(t){return Math.floor(+t/1e3)}function Ud(t){return new Date(t)}function Cd(t){return t instanceof Date?+t:+new Date(+t)}function yd(t,e,n,i,s,c,a,l,r,o){var g=Eo(),B=g.invert,d=g.domain,I=o(".%L"),Q=o(":%S"),u=o("%I:%M"),F=o("%I %p"),h=o("%a %d"),b=o("%b %d"),U=o("%B"),C=o("%Y");function y(t){return(r(t)<t?I:l(t)<t?Q:a(t)<t?u:c(t)<t?F:i(t)<t?s(t)<t?h:b:n(t)<t?U:C)(t)}return g.invert=function(t){return new Date(B(t))},g.domain=function(t){return arguments.length?d(Array.from(t,Cd)):d().map(Ud)},g.ticks=function(e){var n=d();return t(n[0],n[n.length-1],null==e?10:e)},g.tickFormat=function(t,e){return null==e?y:o(e)},g.nice=function(t){var n=d();return t&&"function"==typeof t.range||(t=e(n[0],n[n.length-1],null==t?10:t)),t?d(Do(n,t)):g},g.copy=function(){return No(g,yd(t,e,n,i,s,c,a,l,r,o))},g}function fd(t,e){return e.domain(t.domain()).interpolator(t.interpolator()).clamp(t.clamp()).unknown(t.unknown())}function Gd(){var t,e,n,i,s,c,a,l=0,r=.5,o=1,g=1,B=Lo,d=!1;function I(t){return isNaN(t=+t)?a:(t=.5+((t=+c(t))-e)*(g*t<g*e?i:s),B(d?Math.max(0,Math.min(1,t)):t))}function Q(t){return function(e){var n,i,s;return arguments.length?([n,i,s]=e,B=Js(t,[n,i,s]),I):[B(0),B(.5),B(1)]}}return I.domain=function(a){return arguments.length?([l,r,o]=a,t=c(l=+l),e=c(r=+r),n=c(o=+o),i=t===e?0:.5/(e-t),s=e===n?0:.5/(n-e),g=e<t?-1:1,I):[l,r,o]},I.clamp=function(t){return arguments.length?(d=!!t,I):d},I.interpolator=function(t){return arguments.length?(B=t,I):B},I.range=Q(Rs),I.rangeRound=Q(Xs),I.unknown=function(t){return arguments.length?(a=t,I):a},function(a){return c=a,t=a(l),e=a(r),n=a(o),i=t===e?0:.5/(e-t),s=e===n?0:.5/(n-e),g=e<t?-1:1,I}}function pd(){var t=wo(Gd()(Lo));return t.copy=function(){return fd(t,pd())},yo.apply(t,arguments)}function md(){var t=Ko(Gd()).domain([.1,1,10]);return t.copy=function(){return fd(t,md()).base(t.base())},yo.apply(t,arguments)}function Ad(){var t=jo(Gd());return t.copy=function(){return fd(t,Ad()).constant(t.constant())},yo.apply(t,arguments)}function xd(){var t=ng(Gd());return t.copy=function(){return fd(t,xd()).exponent(t.exponent())},yo.apply(t,arguments)}function Sd(t){for(var e=t.length/6|0,n=new Array(e),i=0;i<e;)n[i]="#"+t.slice(6*i,6*++i);return n}!function(t){qg=function(t){var e=t.dateTime,n=t.date,i=t.time,s=t.periods,c=t.days,a=t.shortDays,l=t.months,r=t.shortMonths,o=rB(s),g=oB(s),B=rB(c),d=oB(c),I=rB(a),Q=oB(a),u=rB(l),F=oB(l),h=rB(r),b=oB(r),U={a:function(t){return a[t.getDay()]},A:function(t){return c[t.getDay()]},b:function(t){return r[t.getMonth()]},B:function(t){return l[t.getMonth()]},c:null,d:RB,e:RB,f:EB,g:zB,G:OB,H:XB,I:vB,j:NB,L:ZB,m:VB,M:wB,p:function(t){return s[+(t.getHours()>=12)]},q:function(t){return 1+~~(t.getMonth()/3)},Q:hd,s:bd,S:WB,u:HB,U:DB,V:kB,w:JB,W:MB,x:null,X:null,y:TB,Y:KB,Z:_B,"%":Fd},C={a:function(t){return a[t.getUTCDay()]},A:function(t){return c[t.getUTCDay()]},b:function(t){return r[t.getUTCMonth()]},B:function(t){return l[t.getUTCMonth()]},c:null,d:PB,e:PB,f:ed,g:dd,G:Qd,H:jB,I:$B,j:qB,L:td,m:nd,M:id,p:function(t){return s[+(t.getUTCHours()>=12)]},q:function(t){return 1+~~(t.getUTCMonth()/3)},Q:hd,s:bd,S:sd,u:cd,U:ad,V:rd,w:od,W:gd,x:null,X:null,y:Bd,Y:Id,Z:ud,"%":Fd},y={a:function(t,e,n){var i=I.exec(e.slice(n));return i?(t.w=Q.get(i[0].toLowerCase()),n+i[0].length):-1},A:function(t,e,n){var i=B.exec(e.slice(n));return i?(t.w=d.get(i[0].toLowerCase()),n+i[0].length):-1},b:function(t,e,n){var i=h.exec(e.slice(n));return i?(t.m=b.get(i[0].toLowerCase()),n+i[0].length):-1},B:function(t,e,n){var i=u.exec(e.slice(n));return i?(t.m=F.get(i[0].toLowerCase()),n+i[0].length):-1},c:function(t,n,i){return p(t,e,n,i)},d:CB,e:CB,f:AB,g:FB,G:uB,H:fB,I:fB,j:yB,L:mB,m:UB,M:GB,p:function(t,e,n){var i=o.exec(e.slice(n));return i?(t.p=g.get(i[0].toLowerCase()),n+i[0].length):-1},q:bB,Q:SB,s:LB,S:pB,u:BB,U:dB,V:IB,w:gB,W:QB,x:function(t,e,i){return p(t,n,e,i)},X:function(t,e,n){return p(t,i,e,n)},y:FB,Y:uB,Z:hB,"%":xB};function f(t,e){return function(n){var i,s,c,a=[],l=-1,r=0,o=t.length;for(n instanceof Date||(n=new Date(+n));++l<o;)37===t.charCodeAt(l)&&(a.push(t.slice(r,l)),null!=(s=nB[i=t.charAt(++l)])?i=t.charAt(++l):s="e"===i?" ":"0",(c=e[i])&&(i=c(n,s)),a.push(i),r=l+1);return a.push(t.slice(r,l)),a.join("")}}function G(t,e){return function(n){var i,s,c=$g(1900,void 0,1);if(p(c,t,n+="",0)!=n.length)return null;if("Q"in c)return new Date(c.Q);if("s"in c)return new Date(1e3*c.s+("L"in c?c.L:0));if(e&&!("Z"in c)&&(c.Z=0),"p"in c&&(c.H=c.H%12+12*c.p),void 0===c.m&&(c.m="q"in c?c.q:0),"V"in c){if(c.V<1||c.V>53)return null;"w"in c||(c.w=1),"Z"in c?(s=(i=jg($g(c.y,0,1))).getUTCDay(),i=s>4||0===s?Eg.ceil(i):Eg(i),i=Gg.offset(i,7*(c.V-1)),c.y=i.getUTCFullYear(),c.m=i.getUTCMonth(),c.d=i.getUTCDate()+(c.w+6)%7):(s=(i=Pg($g(c.y,0,1))).getDay(),i=s>4||0===s?xg.ceil(i):xg(i),i=fg.offset(i,7*(c.V-1)),c.y=i.getFullYear(),c.m=i.getMonth(),c.d=i.getDate()+(c.w+6)%7)}else("W"in c||"U"in c)&&("w"in c||(c.w="u"in c?c.u%7:"W"in c?1:0),s="Z"in c?jg($g(c.y,0,1)).getUTCDay():Pg($g(c.y,0,1)).getDay(),c.m=0,c.d="W"in c?(c.w+6)%7+7*c.W-(s+5)%7:c.w+7*c.U-(s+6)%7);return"Z"in c?(c.H+=c.Z/100|0,c.M+=c.Z%100,jg(c)):Pg(c)}}function p(t,e,n,i){for(var s,c,a=0,l=e.length,r=n.length;a<l;){if(i>=r)return-1;if(37===(s=e.charCodeAt(a++))){if(s=e.charAt(a++),!(c=y[s in nB?e.charAt(a++):s])||(i=c(t,n,i))<0)return-1}else if(s!=n.charCodeAt(i++))return-1}return i}return U.x=f(n,U),U.X=f(i,U),U.c=f(e,U),C.x=f(n,C),C.X=f(i,C),C.c=f(e,C),{format:function(t){var e=f(t+="",U);return e.toString=function(){return t},e},parse:function(t){var e=G(t+="",!1);return e.toString=function(){return t},e},utcFormat:function(t){var e=f(t+="",C);return e.toString=function(){return t},e},utcParse:function(t){var e=G(t+="",!0);return e.toString=function(){return t},e}}}(t),tB=qg.format,qg.parse,eB=qg.utcFormat,qg.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 Ld=Sd("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"),Rd=Sd("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666"),Xd=Sd("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666"),vd=Sd("4269d0efb118ff725c6cc5b03ca951ff8ab7a463f297bbf59c6b4e9498a0"),Nd=Sd("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928"),Zd=Sd("fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2"),Ed=Sd("b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc"),Vd=Sd("e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999"),wd=Sd("66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3"),Wd=Sd("8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f"),Hd=Sd("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab"),Dd=t=>ys(t[t.length-1]),Yd=new Array(3).concat("d8b365f5f5f55ab4ac","a6611adfc27d80cdc1018571","a6611adfc27df5f5f580cdc1018571","8c510ad8b365f6e8c3c7eae55ab4ac01665e","8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e","8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e","8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e","5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30","5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30").map(Sd),kd=Dd(Yd),Jd=new Array(3).concat("af8dc3f7f7f77fbf7b","7b3294c2a5cfa6dba0008837","7b3294c2a5cff7f7f7a6dba0008837","762a83af8dc3e7d4e8d9f0d37fbf7b1b7837","762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837","762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837","762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837","40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b","40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b").map(Sd),Md=Dd(Jd),Td=new Array(3).concat("e9a3c9f7f7f7a1d76a","d01c8bf1b6dab8e1864dac26","d01c8bf1b6daf7f7f7b8e1864dac26","c51b7de9a3c9fde0efe6f5d0a1d76a4d9221","c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221","c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221","c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221","8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419","8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419").map(Sd),zd=Dd(Td),Kd=new Array(3).concat("998ec3f7f7f7f1a340","5e3c99b2abd2fdb863e66101","5e3c99b2abd2f7f7f7fdb863e66101","542788998ec3d8daebfee0b6f1a340b35806","542788998ec3d8daebf7f7f7fee0b6f1a340b35806","5427888073acb2abd2d8daebfee0b6fdb863e08214b35806","5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806","2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08","2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08").map(Sd),Od=Dd(Kd),_d=new Array(3).concat("ef8a62f7f7f767a9cf","ca0020f4a58292c5de0571b0","ca0020f4a582f7f7f792c5de0571b0","b2182bef8a62fddbc7d1e5f067a9cf2166ac","b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac","b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac","b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac","67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061","67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061").map(Sd),Pd=Dd(_d),jd=new Array(3).concat("ef8a62ffffff999999","ca0020f4a582bababa404040","ca0020f4a582ffffffbababa404040","b2182bef8a62fddbc7e0e0e09999994d4d4d","b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d","b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d","b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d","67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a","67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a").map(Sd),$d=Dd(jd),qd=new Array(3).concat("fc8d59ffffbf91bfdb","d7191cfdae61abd9e92c7bb6","d7191cfdae61ffffbfabd9e92c7bb6","d73027fc8d59fee090e0f3f891bfdb4575b4","d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4","d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4","d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4","a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695","a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695").map(Sd),tI=Dd(qd),eI=new Array(3).concat("fc8d59ffffbf91cf60","d7191cfdae61a6d96a1a9641","d7191cfdae61ffffbfa6d96a1a9641","d73027fc8d59fee08bd9ef8b91cf601a9850","d73027fc8d59fee08bffffbfd9ef8b91cf601a9850","d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850","d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850","a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837","a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837").map(Sd),nI=Dd(eI),iI=new Array(3).concat("fc8d59ffffbf99d594","d7191cfdae61abdda42b83ba","d7191cfdae61ffffbfabdda42b83ba","d53e4ffc8d59fee08be6f59899d5943288bd","d53e4ffc8d59fee08bffffbfe6f59899d5943288bd","d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd","d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd","9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2","9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2").map(Sd),sI=Dd(iI),cI=new Array(3).concat("e5f5f999d8c92ca25f","edf8fbb2e2e266c2a4238b45","edf8fbb2e2e266c2a42ca25f006d2c","edf8fbccece699d8c966c2a42ca25f006d2c","edf8fbccece699d8c966c2a441ae76238b45005824","f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824","f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b").map(Sd),aI=Dd(cI),lI=new Array(3).concat("e0ecf49ebcda8856a7","edf8fbb3cde38c96c688419d","edf8fbb3cde38c96c68856a7810f7c","edf8fbbfd3e69ebcda8c96c68856a7810f7c","edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b","f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b","f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b").map(Sd),rI=Dd(lI),oI=new Array(3).concat("e0f3dba8ddb543a2ca","f0f9e8bae4bc7bccc42b8cbe","f0f9e8bae4bc7bccc443a2ca0868ac","f0f9e8ccebc5a8ddb57bccc443a2ca0868ac","f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e","f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e","f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081").map(Sd),gI=Dd(oI),BI=new Array(3).concat("fee8c8fdbb84e34a33","fef0d9fdcc8afc8d59d7301f","fef0d9fdcc8afc8d59e34a33b30000","fef0d9fdd49efdbb84fc8d59e34a33b30000","fef0d9fdd49efdbb84fc8d59ef6548d7301f990000","fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000","fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000").map(Sd),dI=Dd(BI),II=new Array(3).concat("ece2f0a6bddb1c9099","f6eff7bdc9e167a9cf02818a","f6eff7bdc9e167a9cf1c9099016c59","f6eff7d0d1e6a6bddb67a9cf1c9099016c59","f6eff7d0d1e6a6bddb67a9cf3690c002818a016450","fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450","fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636").map(Sd),QI=Dd(II),uI=new Array(3).concat("ece7f2a6bddb2b8cbe","f1eef6bdc9e174a9cf0570b0","f1eef6bdc9e174a9cf2b8cbe045a8d","f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d","f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b","fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b","fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858").map(Sd),FI=Dd(uI),hI=new Array(3).concat("e7e1efc994c7dd1c77","f1eef6d7b5d8df65b0ce1256","f1eef6d7b5d8df65b0dd1c77980043","f1eef6d4b9dac994c7df65b0dd1c77980043","f1eef6d4b9dac994c7df65b0e7298ace125691003f","f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f","f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f").map(Sd),bI=Dd(hI),UI=new Array(3).concat("fde0ddfa9fb5c51b8a","feebe2fbb4b9f768a1ae017e","feebe2fbb4b9f768a1c51b8a7a0177","feebe2fcc5c0fa9fb5f768a1c51b8a7a0177","feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177","fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177","fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a").map(Sd),CI=Dd(UI),yI=new Array(3).concat("edf8b17fcdbb2c7fb8","ffffcca1dab441b6c4225ea8","ffffcca1dab441b6c42c7fb8253494","ffffccc7e9b47fcdbb41b6c42c7fb8253494","ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84","ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84","ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58").map(Sd),fI=Dd(yI),GI=new Array(3).concat("f7fcb9addd8e31a354","ffffccc2e69978c679238443","ffffccc2e69978c67931a354006837","ffffccd9f0a3addd8e78c67931a354006837","ffffccd9f0a3addd8e78c67941ab5d238443005a32","ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32","ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529").map(Sd),pI=Dd(GI),mI=new Array(3).concat("fff7bcfec44fd95f0e","ffffd4fed98efe9929cc4c02","ffffd4fed98efe9929d95f0e993404","ffffd4fee391fec44ffe9929d95f0e993404","ffffd4fee391fec44ffe9929ec7014cc4c028c2d04","ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04","ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506").map(Sd),AI=Dd(mI),xI=new Array(3).concat("ffeda0feb24cf03b20","ffffb2fecc5cfd8d3ce31a1c","ffffb2fecc5cfd8d3cf03b20bd0026","ffffb2fed976feb24cfd8d3cf03b20bd0026","ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026","ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026","ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026").map(Sd),SI=Dd(xI),LI=new Array(3).concat("deebf79ecae13182bd","eff3ffbdd7e76baed62171b5","eff3ffbdd7e76baed63182bd08519c","eff3ffc6dbef9ecae16baed63182bd08519c","eff3ffc6dbef9ecae16baed64292c62171b5084594","f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594","f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b").map(Sd),RI=Dd(LI),XI=new Array(3).concat("e5f5e0a1d99b31a354","edf8e9bae4b374c476238b45","edf8e9bae4b374c47631a354006d2c","edf8e9c7e9c0a1d99b74c47631a354006d2c","edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32","f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32","f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b").map(Sd),vI=Dd(XI),NI=new Array(3).concat("f0f0f0bdbdbd636363","f7f7f7cccccc969696525252","f7f7f7cccccc969696636363252525","f7f7f7d9d9d9bdbdbd969696636363252525","f7f7f7d9d9d9bdbdbd969696737373525252252525","fffffff0f0f0d9d9d9bdbdbd969696737373525252252525","fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000").map(Sd),ZI=Dd(NI),EI=new Array(3).concat("efedf5bcbddc756bb1","f2f0f7cbc9e29e9ac86a51a3","f2f0f7cbc9e29e9ac8756bb154278f","f2f0f7dadaebbcbddc9e9ac8756bb154278f","f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486","fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486","fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d").map(Sd),VI=Dd(EI),wI=new Array(3).concat("fee0d2fc9272de2d26","fee5d9fcae91fb6a4acb181d","fee5d9fcae91fb6a4ade2d26a50f15","fee5d9fcbba1fc9272fb6a4ade2d26a50f15","fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d","fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d","fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d").map(Sd),WI=Dd(wI),HI=new Array(3).concat("fee6cefdae6be6550d","feeddefdbe85fd8d3cd94701","feeddefdbe85fd8d3ce6550da63603","feeddefdd0a2fdae6bfd8d3ce6550da63603","feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04","fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04","fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704").map(Sd),DI=Dd(HI);function YI(t){return t=Math.max(0,Math.min(1,t)),"rgb("+Math.max(0,Math.min(255,Math.round(-4.54-t*(35.34-t*(2381.73-t*(6402.7-t*(7024.72-2710.57*t)))))))+", "+Math.max(0,Math.min(255,Math.round(32.49+t*(170.73+t*(52.82-t*(131.46-t*(176.58-67.37*t)))))))+", "+Math.max(0,Math.min(255,Math.round(81.24+t*(442.36-t*(2482.43-t*(6167.24-t*(6614.94-2475.67*t)))))))+")"}var kI=ks(ds(300,.5,0),ds(-240,.5,1)),JI=ks(ds(-100,.75,.35),ds(80,1.5,.8)),MI=ks(ds(260,.75,.35),ds(80,1.5,.8)),TI=ds();function zI(t){(t<0||t>1)&&(t-=Math.floor(t));var e=Math.abs(t-.5);return TI.h=360*t-100,TI.s=1.5-1.5*e,TI.l=.8-.9*e,TI+""}var KI=mi(),OI=Math.PI/3,_I=2*Math.PI/3;function PI(t){var e;return t=(.5-t)*Math.PI,KI.r=255*(e=Math.sin(t))*e,KI.g=255*(e=Math.sin(t+OI))*e,KI.b=255*(e=Math.sin(t+_I))*e,KI+""}function jI(t){return t=Math.max(0,Math.min(1,t)),"rgb("+Math.max(0,Math.min(255,Math.round(34.61+t*(1172.33-t*(10793.56-t*(33300.12-t*(38394.49-14825.05*t)))))))+", "+Math.max(0,Math.min(255,Math.round(23.31+t*(557.33+t*(1225.33-t*(3574.96-t*(1073.77+707.56*t)))))))+", "+Math.max(0,Math.min(255,Math.round(27.2+t*(3211.1-t*(15327.97-t*(27814-t*(22569.18-6838.66*t)))))))+")"}function $I(t){var e=t.length;return function(n){return t[Math.max(0,Math.min(e-1,Math.floor(n*e)))]}}var qI=$I(Sd("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")),tQ=$I(Sd("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")),eQ=$I(Sd("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")),nQ=$I(Sd("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));function iQ(t){return function(){return t}}const sQ=Math.cos,cQ=Math.min,aQ=Math.sin,lQ=Math.sqrt,rQ=Math.PI,oQ=2*rQ;function gQ(t){this._context=t}function BQ(t){return new gQ(t)}function dQ(t){return t[0]}function IQ(t){return t[1]}function QQ(t,e){var n=iQ(!0),i=null,s=BQ,c=null,a=function(t){let e=3;return t.digits=function(n){if(!arguments.length)return e;if(null==n)e=null;else{const t=Math.floor(n);if(!(t>=0))throw new RangeError(`invalid digits: ${n}`);e=t}return t},()=>new ta(e)}(l);function l(l){var r,o,g,B=(l=function(t){return"object"==typeof t&&"length"in t?t:Array.from(t)}(l)).length,d=!1;for(null==i&&(c=s(g=a())),r=0;r<=B;++r)!(r<B&&n(o=l[r],r,l))===d&&((d=!d)?c.lineStart():c.lineEnd()),d&&c.point(+t(o,r,l),+e(o,r,l));if(g)return c=null,g+""||null}return t="function"==typeof t?t:void 0===t?dQ:iQ(t),e="function"==typeof e?e:void 0===e?IQ:iQ(e),l.x=function(e){return arguments.length?(t="function"==typeof e?e:iQ(+e),l):t},l.y=function(t){return arguments.length?(e="function"==typeof t?t:iQ(+t),l):e},l.defined=function(t){return arguments.length?(n="function"==typeof t?t:iQ(!!t),l):n},l.curve=function(t){return arguments.length?(s=t,null!=i&&(c=s(i)),l):s},l.context=function(t){return arguments.length?(null==t?i=c=null:c=s(i=t),l):i},l}gQ.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(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:this._context.lineTo(t,e)}}};class uQ{constructor(t,e){this._context=t,this._x=e}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(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:this._x?this._context.bezierCurveTo(this._x0=(this._x0+t)/2,this._y0,this._x0,e,t,e):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+e)/2,t,this._y0,t,e)}this._x0=t,this._y0=e}}const FQ=lQ(3);var hQ={draw(t,e){const n=.59436*lQ(e+cQ(e/28,.75)),i=n/2,s=i*FQ;t.moveTo(0,n),t.lineTo(0,-n),t.moveTo(-s,-i),t.lineTo(s,i),t.moveTo(-s,i),t.lineTo(s,-i)}},bQ={draw(t,e){const n=lQ(e/rQ);t.moveTo(n,0),t.arc(0,0,n,0,oQ)}},UQ={draw(t,e){const n=lQ(e/5)/2;t.moveTo(-3*n,-n),t.lineTo(-n,-n),t.lineTo(-n,-3*n),t.lineTo(n,-3*n),t.lineTo(n,-n),t.lineTo(3*n,-n),t.lineTo(3*n,n),t.lineTo(n,n),t.lineTo(n,3*n),t.lineTo(-n,3*n),t.lineTo(-n,n),t.lineTo(-3*n,n),t.closePath()}};const CQ=lQ(1/3),yQ=2*CQ;var fQ={draw(t,e){const n=lQ(e/yQ),i=n*CQ;t.moveTo(0,-n),t.lineTo(i,0),t.lineTo(0,n),t.lineTo(-i,0),t.closePath()}},GQ={draw(t,e){const n=.62625*lQ(e);t.moveTo(0,-n),t.lineTo(n,0),t.lineTo(0,n),t.lineTo(-n,0),t.closePath()}},pQ={draw(t,e){const n=.87559*lQ(e-cQ(e/7,2));t.moveTo(-n,0),t.lineTo(n,0),t.moveTo(0,n),t.lineTo(0,-n)}},mQ={draw(t,e){const n=lQ(e),i=-n/2;t.rect(i,i,n,n)}},AQ={draw(t,e){const n=.4431*lQ(e);t.moveTo(n,n),t.lineTo(n,-n),t.lineTo(-n,-n),t.lineTo(-n,n),t.closePath()}};const xQ=aQ(rQ/10)/aQ(7*rQ/10),SQ=aQ(oQ/10)*xQ,LQ=-sQ(oQ/10)*xQ;var RQ={draw(t,e){const n=lQ(.8908130915292852*e),i=SQ*n,s=LQ*n;t.moveTo(0,-n),t.lineTo(i,s);for(let e=1;e<5;++e){const c=oQ*e/5,a=sQ(c),l=aQ(c);t.lineTo(l*n,-a*n),t.lineTo(a*i-l*s,l*i+a*s)}t.closePath()}};const XQ=lQ(3);var vQ={draw(t,e){const n=-lQ(e/(3*XQ));t.moveTo(0,2*n),t.lineTo(-XQ*n,-n),t.lineTo(XQ*n,-n),t.closePath()}};const NQ=lQ(3);var ZQ={draw(t,e){const n=.6824*lQ(e),i=n/2,s=n*NQ/2;t.moveTo(0,-n),t.lineTo(s,i),t.lineTo(-s,i),t.closePath()}};const EQ=-.5,VQ=lQ(3)/2,wQ=1/lQ(12),WQ=3*(wQ/2+1);var HQ={draw(t,e){const n=lQ(e/WQ),i=n/2,s=n*wQ,c=i,a=n*wQ+n,l=-c,r=a;t.moveTo(i,s),t.lineTo(c,a),t.lineTo(l,r),t.lineTo(EQ*i-VQ*s,VQ*i+EQ*s),t.lineTo(EQ*c-VQ*a,VQ*c+EQ*a),t.lineTo(EQ*l-VQ*r,VQ*l+EQ*r),t.lineTo(EQ*i+VQ*s,EQ*s-VQ*i),t.lineTo(EQ*c+VQ*a,EQ*a-VQ*c),t.lineTo(EQ*l+VQ*r,EQ*r-VQ*l),t.closePath()}},DQ={draw(t,e){const n=.6189*lQ(e-cQ(e/6,1.7));t.moveTo(-n,-n),t.lineTo(n,n),t.moveTo(-n,n),t.lineTo(n,-n)}};const YQ=[bQ,UQ,fQ,mQ,RQ,vQ,HQ],kQ=[bQ,pQ,DQ,ZQ,hQ,AQ,GQ];function JQ(){}function MQ(t,e,n){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+e)/6,(t._y0+4*t._y1+n)/6)}function TQ(t){this._context=t}function zQ(t){this._context=t}function KQ(t){this._context=t}function OQ(t,e){this._basis=new TQ(t),this._beta=e}TQ.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:MQ(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(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);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:MQ(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}},zQ.prototype={areaStart:JQ,areaEnd:JQ,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(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x2=t,this._y2=e;break;case 1:this._point=2,this._x3=t,this._y3=e;break;case 2:this._point=3,this._x4=t,this._y4=e,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+e)/6);break;default:MQ(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}},KQ.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(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var n=(this._x0+4*this._x1+t)/6,i=(this._y0+4*this._y1+e)/6;this._line?this._context.lineTo(n,i):this._context.moveTo(n,i);break;case 3:this._point=4;default:MQ(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}},OQ.prototype={lineStart:function(){this._x=[],this._y=[],this._basis.lineStart()},lineEnd:function(){var t=this._x,e=this._y,n=t.length-1;if(n>0)for(var i,s=t[0],c=e[0],a=t[n]-s,l=e[n]-c,r=-1;++r<=n;)i=r/n,this._basis.point(this._beta*t[r]+(1-this._beta)*(s+i*a),this._beta*e[r]+(1-this._beta)*(c+i*l));this._x=this._y=null,this._basis.lineEnd()},point:function(t,e){this._x.push(+t),this._y.push(+e)}};var _Q=function t(e){function n(t){return 1===e?new TQ(t):new OQ(t,e)}return n.beta=function(e){return t(+e)},n}(.85);function PQ(t,e,n){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-e),t._y2+t._k*(t._y1-n),t._x2,t._y2)}function jQ(t,e){this._context=t,this._k=(1-e)/6}jQ.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:PQ(this,this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2,this._x1=t,this._y1=e;break;case 2:this._point=3;default:PQ(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var $Q=function t(e){function n(t){return new jQ(t,e)}return n.tension=function(e){return t(+e)},n}(0);function qQ(t,e){this._context=t,this._k=(1-e)/6}qQ.prototype={areaStart:JQ,areaEnd:JQ,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(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:PQ(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var tu=function t(e){function n(t){return new qQ(t,e)}return n.tension=function(e){return t(+e)},n}(0);function eu(t,e){this._context=t,this._k=(1-e)/6}eu.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(t,e){switch(t=+t,e=+e,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:PQ(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var nu=function t(e){function n(t){return new eu(t,e)}return n.tension=function(e){return t(+e)},n}(0);function iu(t,e,n){var i=t._x1,s=t._y1,c=t._x2,a=t._y2;if(t._l01_a>1e-12){var l=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,r=3*t._l01_a*(t._l01_a+t._l12_a);i=(i*l-t._x0*t._l12_2a+t._x2*t._l01_2a)/r,s=(s*l-t._y0*t._l12_2a+t._y2*t._l01_2a)/r}if(t._l23_a>1e-12){var o=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,g=3*t._l23_a*(t._l23_a+t._l12_a);c=(c*o+t._x1*t._l23_2a-e*t._l12_2a)/g,a=(a*o+t._y1*t._l23_2a-n*t._l12_2a)/g}t._context.bezierCurveTo(i,s,c,a,t._x2,t._y2)}function su(t,e){this._context=t,this._alpha=e}su.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(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3;default:iu(this,t,e)}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=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var cu=function t(e){function n(t){return e?new su(t,e):new jQ(t,0)}return n.alpha=function(e){return t(+e)},n}(.5);function au(t,e){this._context=t,this._alpha=e}au.prototype={areaStart:JQ,areaEnd:JQ,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(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:iu(this,t,e)}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=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var lu=function t(e){function n(t){return e?new au(t,e):new qQ(t,0)}return n.alpha=function(e){return t(+e)},n}(.5);function ru(t,e){this._context=t,this._alpha=e}ru.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(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,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:iu(this,t,e)}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=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};var ou=function t(e){function n(t){return e?new ru(t,e):new eu(t,0)}return n.alpha=function(e){return t(+e)},n}(.5);function gu(t){this._context=t}function Bu(t){return t<0?-1:1}function du(t,e,n){var i=t._x1-t._x0,s=e-t._x1,c=(t._y1-t._y0)/(i||s<0&&-0),a=(n-t._y1)/(s||i<0&&-0),l=(c*s+a*i)/(i+s);return(Bu(c)+Bu(a))*Math.min(Math.abs(c),Math.abs(a),.5*Math.abs(l))||0}function Iu(t,e){var n=t._x1-t._x0;return n?(3*(t._y1-t._y0)/n-e)/2:e}function Qu(t,e,n){var i=t._x0,s=t._y0,c=t._x1,a=t._y1,l=(c-i)/3;t._context.bezierCurveTo(i+l,s+l*e,c-l,a-l*n,c,a)}function uu(t){this._context=t}function Fu(t){this._context=new hu(t)}function hu(t){this._context=t}function bu(t){this._context=t}function Uu(t){var e,n,i=t.length-1,s=new Array(i),c=new Array(i),a=new Array(i);for(s[0]=0,c[0]=2,a[0]=t[0]+2*t[1],e=1;e<i-1;++e)s[e]=1,c[e]=4,a[e]=4*t[e]+2*t[e+1];for(s[i-1]=2,c[i-1]=7,a[i-1]=8*t[i-1]+t[i],e=1;e<i;++e)n=s[e]/c[e-1],c[e]-=n,a[e]-=n*a[e-1];for(s[i-1]=a[i-1]/c[i-1],e=i-2;e>=0;--e)s[e]=(a[e]-s[e+1])/c[e];for(c[i-1]=(t[i]+s[i-1])/2,e=0;e<i-1;++e)c[e]=2*t[e+1]-s[e+1];return[s,c]}function Cu(t,e){this._context=t,this._t=e}function yu(t,e,n){this.k=t,this.x=e,this.y=n}gu.prototype={areaStart:JQ,areaEnd:JQ,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(t,e){t=+t,e=+e,this._point?this._context.lineTo(t,e):(this._point=1,this._context.moveTo(t,e))}},uu.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:Qu(this,this._t0,Iu(this,this._t0))}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){var n=NaN;if(e=+e,(t=+t)!==this._x1||e!==this._y1){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,Qu(this,Iu(this,n=du(this,t,e)),n);break;default:Qu(this,this._t0,n=du(this,t,e))}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e,this._t0=n}}},(Fu.prototype=Object.create(uu.prototype)).point=function(t,e){uu.prototype.point.call(this,e,t)},hu.prototype={moveTo:function(t,e){this._context.moveTo(e,t)},closePath:function(){this._context.closePath()},lineTo:function(t,e){this._context.lineTo(e,t)},bezierCurveTo:function(t,e,n,i,s,c){this._context.bezierCurveTo(e,t,i,n,c,s)}},bu.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var t=this._x,e=this._y,n=t.length;if(n)if(this._line?this._context.lineTo(t[0],e[0]):this._context.moveTo(t[0],e[0]),2===n)this._context.lineTo(t[1],e[1]);else for(var i=Uu(t),s=Uu(e),c=0,a=1;a<n;++c,++a)this._context.bezierCurveTo(i[0][c],s[0][c],i[1][c],s[1][c],t[a],e[a]);(this._line||0!==this._line&&1===n)&&this._context.closePath(),this._line=1-this._line,this._x=this._y=null},point:function(t,e){this._x.push(+t),this._y.push(+e)}},Cu.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(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,e),this._context.lineTo(t,e);else{var n=this._x*(1-this._t)+t*this._t;this._context.lineTo(n,this._y),this._context.lineTo(n,e)}}this._x=t,this._y=e}},yu.prototype={constructor:yu,scale:function(t){return 1===t?this:new yu(this.k*t,this.x,this.y)},translate:function(t,e){return 0===t&0===e?this:new yu(this.k,this.x+this.k*t,this.y+this.k*e)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}},yu.prototype;class fu extends rt{getComputedStyleValue(t){return getComputedStyle(this).getPropertyValue(t).trim()}firstUpdated(t){super.firstUpdated(t),Mn(this.renderRoot.host).classed("keyboard",!0).on("mousemove.keyboard touchstart.keyboard",(t=>{Mn(t.currentTarget.renderRoot.host).classed("keyboard",!1).on("mousemove.keyboard touchstart.keyboard",null)})).on("keydown.keyboard",(t=>{Mn(t.currentTarget.renderRoot.host).classed("keyboard",!0).on("keydown.keyboard mousemove.keyboard touchstart.keyboard",null)}))}static get greys(){const t="#999999",e={white:"#ffffff"};return e.light75=Us(t,"#ffffff")(.75),e.light50=Us(t,"#ffffff")(.5),e.light25=Us(t,"#ffffff")(.25),e.grey=t,e.dark25=Us(t,"#000000")(.25),e.dark50=Us(t,"#000000")(.5),e.dark75=Us(t,"#000000")(.75),e.black="#000000",e}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(t,e=!1,n=!1){const i=this.shadows.opacityUmbra+this.shadows.opacityBoost,s=this.shadows.opacityPenumbra+this.shadows.opacityBoost,c=this.shadows.opacityAmbient+this.shadows.opacityBoost,a=n?`rgba(${this.shadows.inverseBaselineColorString}, ${i})`:`rgba(${this.shadows.baselineColorString}, ${i})`,l=n?`rgba(${this.shadows.inverseBaselineColorString}, ${s})`:`rgba(${this.shadows.baselineColorString}, ${s})`,r=n?`rgba(${this.shadows.inverseBaselineColorString}, ${c})`:`rgba(${this.shadows.baselineColorString}, ${c})`,o=this.shadows.mapUmbra[t],g=this.shadows.mapPenumbra[t],B=this.shadows.mapAmbient[t];return`${e?`${-o.y}px ${o.y/2}px ${o.b}px ${o.s}px`:`${o.y/2}px ${o.y}px ${o.b}px ${o.s}px`} ${a}, ${e?`${-g.y}px ${g.y/2}px ${g.b}px ${g.s}px`:`${g.y/2}px ${g.y}px ${g.b}px ${g.s}px`} ${l}, ${e?`${-B.y}px ${B.y/2}px ${B.b}px ${B.s}px`:`${B.y/2}px ${B.y}px ${B.b}px ${B.s}px`} ${r}`}static get svgDefs(){const t=fu.shadows;return`\n <defs>\n ${t.elevations.map((e=>`\n <filter id=shadow-${e} 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=${t.mapUmbra[e].y/2} dy=${t.mapUmbra[e].y} />\n <feOffset in="solid" result="offP" dx=${t.mapPenumbra[e].y/2} dy=${t.mapPenumbra[e].y} />\n <feOffset in="solid" result="offA" dx=${t.mapAmbient[e].y/2} dy=${t.mapAmbient[e].y} />\n ${0===t.mapUmbra[e].s?"":`<feMorphology in="offU" result="spreadU" operator=${t.mapUmbra[e].s>0?"dilate":"erode"} radius=${Math.abs(t.mapUmbra[e].s)} />`}\n ${0===t.mapPenumbra[e].s?"":`<feMorphology in="offP" result="spreadP" operator=${t.mapPenumbra[e].s>0?"dilate":"erode"} radius=${Math.abs(t.mapPenumbra[e].s)} />`}\n ${0===t.mapAmbient[e].s?"":`<feMorphology in="offA" result="spreadA" operator=${t.mapAmbient[e].s>0?"dilate":"erode"} radius=${Math.abs(t.mapAmbient[e].s)} />`}\n <feGaussianBlur in=${0===t.mapUmbra[e].s?"offU":"spreadU"} result="blurU" stdDeviation=${t.mapUmbra[e].b/2} />\n <feGaussianBlur in=${0===t.mapPenumbra[e].s?"offP":"spreadP"} result="blurP" stdDeviation=${t.mapPenumbra[e].b/2} />\n <feGaussianBlur in=${0===t.mapAmbient[e].s?"offA":"spreadA"} result="blurA" stdDeviation=${t.mapAmbient[e].b/2} />\n <feFlood in="SourceGraphic" result="opU" flood-color=${t.baselineColor} flood-opacity=${t.opacityUmbra+t.opacityBoost} />\n <feFlood in="SourceGraphic" result="opP" flood-color=${t.baselineColor} flood-opacity=${t.opacityPenumbra+t.opacityBoost} />\n <feFlood in="SourceGraphic" result="opA" flood-color=${t.baselineColor} flood-opacity=${t.opacityAmbient+t.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>`))}\n </defs>\n `}static get svgFilters(){const t=fu.shadows,e=t.elevations.map((e=>T`
|
|
24
|
-
<filter id=${`shadow-${
|
|
23
|
+
let gB=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 t=F?.renderBefore??Q;let U=t._$litPart$;if(void 0===U){const B=F?.renderBefore??null;t._$litPart$=U=new BB(Q.insertBefore(N(),B),B,void 0,F??{})}return U._$AI(B),U})(Q,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return z}};gB._$litElement$=!0,gB.finalized=!0,globalThis.litElementHydrateSupport?.({LitElement:gB});const iB=globalThis.litElementPolyfillSupport;function lB(B,Q){return null==B||null==Q?NaN:B<Q?-1:B>Q?1:B>=Q?0:NaN}function cB(B,Q){return null==B||null==Q?NaN:Q<B?-1:Q>B?1:Q>=B?0:NaN}function eB(B){let Q,F,t;function U(B,t,U=0,I=B.length){if(U<I){if(0!==Q(t,t))return I;do{const Q=U+I>>>1;F(B[Q],t)<0?U=Q+1:I=Q}while(U<I)}return U}return 2!==B.length?(Q=lB,F=(Q,F)=>lB(B(Q),F),t=(Q,F)=>B(Q)-F):(Q=B===lB||B===cB?B:nB,F=B,t=B),{left:U,center:function(B,Q,F=0,I=B.length){const s=U(B,Q,F,I-1);return s>F&&t(B[s-1],Q)>-t(B[s],Q)?s-1:s},right:function(B,t,U=0,I=B.length){if(U<I){if(0!==Q(t,t))return I;do{const Q=U+I>>>1;F(B[Q],t)<=0?U=Q+1:I=Q}while(U<I)}return U}}}function nB(){return 0}function dB(B){return null===B?NaN:+B}iB?.({LitElement:gB}),(globalThis.litElementVersions??=[]).push("4.1.1");const CB=eB(lB).right;function aB(B,Q){let F=0;for(let Q of B)null!=Q&&(Q=+Q)>=Q&&++F;return F}function bB(B){return 0|B.length}function oB(B){return!(B>0)}function GB(B){return"object"!=typeof B||"length"in B?B:Array.from(B)}function uB(B,Q){var F=0;return Float64Array.from(B,(B=>F+=+B||0))}function rB(B,Q){let F,t=0,U=0,I=0;if(void 0===Q)for(let Q of B)null!=Q&&(Q=+Q)>=Q&&(F=Q-U,U+=F/++t,I+=F*(Q-U));else{let s=-1;for(let g of B)null!=(g=Q(g,++s,B))&&(g=+g)>=g&&(F=g-U,U+=F/++t,I+=F*(g-U))}if(t>1)return I/(t-1)}function xB(B,Q){const F=rB(B,Q);return F?Math.sqrt(F):F}function AB(B,Q){let F,t;if(void 0===Q)for(const Q of B)null!=Q&&(void 0===F?Q>=Q&&(F=t=Q):(F>Q&&(F=Q),t<Q&&(t=Q)));else{let U=-1;for(let I of B)null!=(I=Q(I,++U,B))&&(void 0===F?I>=I&&(F=t=I):(F>I&&(F=I),t<I&&(t=I)))}return[F,t]}eB(dB).center;class LB{constructor(){this._partials=new Float64Array(32),this._n=0}add(B){const Q=this._partials;let F=0;for(let t=0;t<this._n&&t<32;t++){const U=Q[t],I=B+U,s=Math.abs(B)<Math.abs(U)?B-(I-U):U-(I-B);s&&(Q[F++]=s),B=I}return Q[F]=B,this._n=F+1,this}valueOf(){const B=this._partials;let Q,F,t,U=this._n,I=0;if(U>0){for(I=B[--U];U>0&&(Q=I,F=B[--U],I=Q+F,t=F-(I-Q),!t););U>0&&(t<0&&B[U-1]<0||t>0&&B[U-1]>0)&&(F=2*t,Q=I+F,F==Q-I&&(I=Q))}return I}}class hB extends Map{constructor(B,Q=SB){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(RB(this,B))}has(B){return super.has(RB(this,B))}set(B,Q){return super.set(VB(this,B),Q)}delete(B){return super.delete(ZB(this,B))}}class yB extends Set{constructor(B,Q=SB){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(RB(this,B))}add(B){return super.add(VB(this,B))}delete(B){return super.delete(ZB(this,B))}}function RB({_intern:B,_key:Q},F){const t=Q(F);return B.has(t)?B.get(t):F}function VB({_intern:B,_key:Q},F){const t=Q(F);return B.has(t)?B.get(t):(B.set(t,F),F)}function ZB({_intern:B,_key:Q},F){const t=Q(F);return B.has(t)&&(F=B.get(t),B.delete(t)),F}function SB(B){return null!==B&&"object"==typeof B?B.valueOf():B}function mB(B){return B}function EB(B,...Q){return pB(B,mB,mB,Q)}function NB(B,Q,...F){return pB(B,mB,Q,F)}function XB(B,Q,...F){return pB(B,Array.from,Q,F)}function pB(B,Q,F,t){return function B(U,I){if(I>=t.length)return F(U);const s=new hB,g=t[I++];let i=-1;for(const B of U){const Q=g(B,++i,U),F=s.get(Q);F?F.push(B):s.set(Q,[B])}for(const[Q,F]of s)s.set(Q,B(F,I));return Q(s)}(B,0)}function WB(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 I=Uint32Array.from(B,((B,Q)=>Q));return Q.length>1?(Q=Q.map((Q=>B.map(Q))),I.sort(((B,F)=>{for(const t of Q){const Q=DB(t[B],t[F]);if(Q)return Q}}))):(F=B.map(F),I.sort(((B,Q)=>DB(F[B],F[Q])))),t=B,U=I,Array.from(U,(B=>t[B]))}var t,U;return B.sort(HB(F))}function HB(B=lB){if(B===lB)return DB;if("function"!=typeof B)throw new TypeError("compare is not a function");return(Q,F)=>{const t=B(Q,F);return t||0===t?t:(0===B(F,F))-(0===B(Q,Q))}}function DB(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?WB(NB(B,Q,F),(([B,Q],[F,t])=>lB(Q,t)||lB(B,F))):WB(EB(B,F),(([B,F],[t,U])=>Q(F,U)||lB(B,t)))).map((([B])=>B))}const fB=Math.sqrt(50),wB=Math.sqrt(10),vB=Math.sqrt(2);function JB(B,Q,F){const t=(Q-B)/Math.max(0,F),U=Math.floor(Math.log10(t)),I=t/Math.pow(10,U),s=I>=fB?10:I>=wB?5:I>=vB?2:1;let g,i,l;return U<0?(l=Math.pow(10,-U)/s,g=Math.round(B*l),i=Math.round(Q*l),g/l<B&&++g,i/l>Q&&--i,l=-l):(l=Math.pow(10,U)*s,g=Math.round(B/l),i=Math.round(Q/l),g*l<B&&++g,i*l>Q&&--i),i<g&&.5<=F&&F<2?JB(B,Q,2*F):[g,i,l]}function kB(B,Q,F){if(!((F=+F)>0))return[];if((B=+B)===(Q=+Q))return[B];const t=Q<B,[U,I,s]=t?JB(Q,B,F):JB(B,Q,F);if(!(I>=U))return[];const g=I-U+1,i=new Array(g);if(t)if(s<0)for(let B=0;B<g;++B)i[B]=(I-B)/-s;else for(let B=0;B<g;++B)i[B]=(I-B)*s;else if(s<0)for(let B=0;B<g;++B)i[B]=(U+B)/-s;else for(let B=0;B<g;++B)i[B]=(U+B)*s;return i}function MB(B,Q,F){return JB(B=+B,Q=+Q,F=+F)[2]}function TB(B,Q,F){F=+F;const t=(Q=+Q)<(B=+B),U=t?MB(Q,B,F):MB(B,Q,F);return(t?-1:1)*(U<0?1/-U:U)}function zB(B){return Math.max(1,Math.ceil(Math.log(aB(B))/Math.LN2)+1)}function KB(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 t=-1;for(let U of B)null!=(U=Q(U,++t,B))&&(F<U||void 0===F&&U>=U)&&(F=U)}return F}function OB(B,Q){let F,t=-1,U=-1;if(void 0===Q)for(const Q of B)++U,null!=Q&&(F<Q||void 0===F&&Q>=Q)&&(F=Q,t=U);else for(let I of B)null!=(I=Q(I,++U,B))&&(F<I||void 0===F&&I>=I)&&(F=I,t=U);return t}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 t=-1;for(let U of B)null!=(U=Q(U,++t,B))&&(F>U||void 0===F&&U>=U)&&(F=U)}return F}function jB(B,Q){let F,t=-1,U=-1;if(void 0===Q)for(const Q of B)++U,null!=Q&&(F>Q||void 0===F&&Q>=Q)&&(F=Q,t=U);else for(let I of B)null!=(I=Q(I,++U,B))&&(F>I||void 0===F&&I>=I)&&(F=I,t=U);return t}function _B(B,Q,F=0,t=1/0,U){if(Q=Math.floor(Q),F=Math.floor(Math.max(0,F)),t=Math.floor(Math.min(B.length-1,t)),!(F<=Q&&Q<=t))return B;for(U=void 0===U?DB:HB(U);t>F;){if(t-F>600){const I=t-F+1,s=Q-F+1,g=Math.log(I),i=.5*Math.exp(2*g/3),l=.5*Math.sqrt(g*i*(I-i)/I)*(s-I/2<0?-1:1);_B(B,Q,Math.max(F,Math.floor(Q-s*i/I+l)),Math.min(t,Math.floor(Q+(I-s)*i/I+l)),U)}const I=B[Q];let s=F,g=t;for($B(B,F,Q),U(B[t],I)>0&&$B(B,F,t);s<g;){for($B(B,s,g),++s,--g;U(B[s],I)<0;)++s;for(;U(B[g],I)>0;)--g}0===U(B[F],I)?$B(B,F,g):(++g,$B(B,g,t)),g<=Q&&(F=g+1),Q<=g&&(t=g-1)}return B}function $B(B,Q,F){const t=B[Q];B[Q]=B[F],B[F]=t}function qB(B,Q=lB){let F,t=!1;if(1===Q.length){let U;for(const I of B){const B=Q(I);(t?lB(B,U)>0:0===lB(B,B))&&(F=I,U=B,t=!0)}}else for(const U of B)(t?Q(U,F)>0:0===Q(U,U))&&(F=U,t=!0);return F}function BQ(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 t of B)null!=(t=Q(t,++F,B))&&(t=+t)>=t&&(yield t)}}(B,F)),(t=B.length)&&!isNaN(Q=+Q)){if(Q<=0||t<2)return PB(B);if(Q>=1)return KB(B);var t,U=(t-1)*Q,I=Math.floor(U),s=KB(_B(B,I).subarray(0,I+1));return s+(PB(B.subarray(I+1))-s)*(U-I)}}function QQ(B,Q,F=dB){if((t=B.length)&&!isNaN(Q=+Q)){if(Q<=0||t<2)return+F(B[0],0,B);if(Q>=1)return+F(B[t-1],t-1,B);var t,U=(t-1)*Q,I=Math.floor(U),s=+F(B[I],I,B);return s+(+F(B[I+1],I+1,B)-s)*(U-I)}}function FQ(B,Q,F){const t=aB(B),U=BQ(B,.75)-BQ(B,.25);return t&&U?Math.ceil((F-Q)/(2*U*Math.pow(t,-1/3))):1}function tQ(B,Q,F){const t=aB(B),U=xB(B);return t&&U?Math.ceil((F-Q)*Math.cbrt(t)/(3.49*U)):1}function UQ(B,Q){let F=0,t=0;if(void 0===Q)for(let Q of B)null!=Q&&(Q=+Q)>=Q&&(++F,t+=Q);else{let U=-1;for(let I of B)null!=(I=Q(I,++U,B))&&(I=+I)>=I&&(++F,t+=I)}if(F)return t/F}function IQ(B,Q){return BQ(B,.5,Q)}function sQ(B){return Array.from(function*(B){for(const Q of B)yield*Q}(B))}function gQ(B,Q){const F=new hB;if(void 0===Q)for(let Q of B)null!=Q&&Q>=Q&&F.set(Q,(F.get(Q)||0)+1);else{let t=-1;for(let U of B)null!=(U=Q(U,++t,B))&&U>=U&&F.set(U,(F.get(U)||0)+1)}let t,U=0;for(const[B,Q]of F)Q>U&&(U=Q,t=B);return t}function iQ(B,Q){return[B,Q]}function lQ(B,Q,F){B=+B,Q=+Q,F=(U=arguments.length)<2?(Q=B,B=0,1):U<3?1:+F;for(var t=-1,U=0|Math.max(0,Math.ceil((Q-B)/F)),I=new Array(U);++t<U;)I[t]=B+t*F;return I}function cQ(B,Q){let F=0;if(void 0===Q)for(let Q of B)(Q=+Q)&&(F+=Q);else{let t=-1;for(let U of B)(U=+Q(U,++t,B))&&(F+=U)}return F}function eQ(B){if("function"!=typeof B[Symbol.iterator])throw new TypeError("values is not iterable");return Array.from(B).reverse()}function nQ(B){return B}var dQ=1e-6;function CQ(B){return"translate("+B+",0)"}function aQ(B){return"translate(0,"+B+")"}function bQ(B){return Q=>+B(Q)}function oQ(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 uQ(B,Q){var F=[],t=null,U=null,I=6,s=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?CQ:aQ;function n(n){var d=null==t?Q.ticks?Q.ticks.apply(Q,F):Q.domain():t,C=null==U?Q.tickFormat?Q.tickFormat.apply(Q,F):nQ:U,a=Math.max(I,0)+g,b=Q.range(),o=+b[0]+i,G=+b[b.length-1]+i,u=(Q.bandwidth?oQ:bQ)(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"),y=A.select("line"),R=A.select("text");x=x.merge(x.enter().insert("path",".tick").attr("class","domain").attr("stroke","currentColor")),A=A.merge(h),y=y.merge(h.append("line").attr("stroke","currentColor").attr(c+"2",l*I)),R=R.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),y=y.transition(n),R=R.transition(n),L=L.transition(n).attr("opacity",dQ).attr("transform",(function(B){return isFinite(B=u(B))?e(B+i):this.getAttribute("transform")})),h.attr("opacity",dQ).attr("transform",(function(B){var Q=this.parentNode.__axis;return e((Q&&isFinite(Q=Q(B))?Q:u(B))+i)}))),L.remove(),x.attr("d",4===B||2===B?s?"M"+l*s+","+o+"H"+i+"V"+G+"H"+l*s:"M"+i+","+o+"V"+G:s?"M"+o+","+l*s+"V"+i+"H"+G+"V"+l*s:"M"+o+","+i+"H"+G),A.attr("opacity",1).attr("transform",(function(B){return e(u(B)+i)})),y.attr(c+"2",l*I),R.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=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?(t=null==B?null:Array.from(B),n):t&&t.slice()},n.tickFormat=function(B){return arguments.length?(U=B,n):U},n.tickSize=function(B){return arguments.length?(I=s=+B,n):I},n.tickSizeInner=function(B){return arguments.length?(I=+B,n):I},n.tickSizeOuter=function(B){return arguments.length?(s=+B,n):s},n.tickPadding=function(B){return arguments.length?(g=+B,n):g},n.offset=function(B){return arguments.length?(i=+B,n):i},n}function rQ(B){return uQ(3,B)}var xQ={value:()=>{}};function AQ(){for(var B,Q=0,F=arguments.length,t={};Q<F;++Q){if(!(B=arguments[Q]+"")||B in t||/[\s.]/.test(B))throw new Error("illegal type: "+B);t[B]=[]}return new LQ(t)}function LQ(B){this._=B}function hQ(B,Q){for(var F,t=0,U=B.length;t<U;++t)if((F=B[t]).name===Q)return F.value}function yQ(B,Q,F){for(var t=0,U=B.length;t<U;++t)if(B[t].name===Q){B[t]=xQ,B=B.slice(0,t).concat(B.slice(t+1));break}return null!=F&&B.push({name:Q,value:F}),B}LQ.prototype=AQ.prototype={constructor:LQ,on:function(B,Q){var F,t,U=this._,I=(t=U,(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&&!t.hasOwnProperty(B))throw new Error("unknown type: "+B);return{type:B,name:Q}}))),s=-1,g=I.length;if(!(arguments.length<2)){if(null!=Q&&"function"!=typeof Q)throw new Error("invalid callback: "+Q);for(;++s<g;)if(F=(B=I[s]).type)U[F]=yQ(U[F],B.name,Q);else if(null==Q)for(F in U)U[F]=yQ(U[F],B.name,null);return this}for(;++s<g;)if((F=(B=I[s]).type)&&(F=hQ(U[F],B.name)))return F},copy:function(){var B={},Q=this._;for(var F in Q)B[F]=Q[F].slice();return new LQ(B)},call:function(B,Q){if((F=arguments.length-2)>0)for(var F,t,U=new Array(F),I=0;I<F;++I)U[I]=arguments[I+2];if(!this._.hasOwnProperty(B))throw new Error("unknown type: "+B);for(I=0,F=(t=this._[B]).length;I<F;++I)t[I].value.apply(Q,U)},apply:function(B,Q,F){if(!this._.hasOwnProperty(B))throw new Error("unknown type: "+B);for(var t=this._[B],U=0,I=t.length;U<I;++U)t[U].value.apply(Q,F)}};var RQ="http://www.w3.org/1999/xhtml",VQ={svg:"http://www.w3.org/2000/svg",xhtml:RQ,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function ZQ(B){var Q=B+="",F=Q.indexOf(":");return F>=0&&"xmlns"!==(Q=B.slice(0,F))&&(B=B.slice(F+1)),VQ.hasOwnProperty(Q)?{space:VQ[Q],local:B}:B}function SQ(B){return function(){var Q=this.ownerDocument,F=this.namespaceURI;return F===RQ&&Q.documentElement.namespaceURI===RQ?Q.createElement(B):Q.createElementNS(F,B)}}function mQ(B){return function(){return this.ownerDocument.createElementNS(B.space,B.local)}}function EQ(B){var Q=ZQ(B);return(Q.local?mQ:SQ)(Q)}function NQ(){}function XQ(B){return null==B?NQ:function(){return this.querySelector(B)}}function pQ(){return[]}function WQ(B){return null==B?pQ:function(){return this.querySelectorAll(B)}}function HQ(B){return function(){return function(B){return null==B?[]:Array.isArray(B)?B:Array.from(B)}(B.apply(this,arguments))}}function DQ(B){return function(){return this.matches(B)}}function YQ(B){return function(Q){return Q.matches(B)}}var fQ=Array.prototype.find;function wQ(){return this.firstElementChild}var vQ=Array.prototype.filter;function JQ(){return Array.from(this.children)}function kQ(B){return new Array(B.length)}function MQ(B,Q){this.ownerDocument=B.ownerDocument,this.namespaceURI=B.namespaceURI,this._next=null,this._parent=B,this.__data__=Q}function TQ(B,Q,F,t,U,I){for(var s,g=0,i=Q.length,l=I.length;g<l;++g)(s=Q[g])?(s.__data__=I[g],t[g]=s):F[g]=new MQ(B,I[g]);for(;g<i;++g)(s=Q[g])&&(U[g]=s)}function zQ(B,Q,F,t,U,I,s){var g,i,l,c=new Map,e=Q.length,n=I.length,d=new Array(e);for(g=0;g<e;++g)(i=Q[g])&&(d[g]=l=s.call(i,i.__data__,g,Q)+"",c.has(l)?U[g]=i:c.set(l,i));for(g=0;g<n;++g)l=s.call(B,I[g],g,I)+"",(i=c.get(l))?(t[g]=i,i.__data__=I[g],c.delete(l)):F[g]=new MQ(B,I[g]);for(g=0;g<e;++g)(i=Q[g])&&c.get(d[g])===i&&(U[g]=i)}function KQ(B){return B.__data__}function OQ(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 jQ(B){return function(){this.removeAttribute(B)}}function _Q(B){return function(){this.removeAttributeNS(B.space,B.local)}}function $Q(B,Q){return function(){this.setAttribute(B,Q)}}function qQ(B,Q){return function(){this.setAttributeNS(B.space,B.local,Q)}}function BF(B,Q){return function(){var F=Q.apply(this,arguments);null==F?this.removeAttribute(B):this.setAttribute(B,F)}}function QF(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 FF(B){return B.ownerDocument&&B.ownerDocument.defaultView||B.document&&B||B.defaultView}function tF(B){return function(){this.style.removeProperty(B)}}function UF(B,Q,F){return function(){this.style.setProperty(B,Q,F)}}function IF(B,Q,F){return function(){var t=Q.apply(this,arguments);null==t?this.style.removeProperty(B):this.style.setProperty(B,t,F)}}function sF(B,Q){return B.style.getPropertyValue(Q)||FF(B).getComputedStyle(B,null).getPropertyValue(Q)}function gF(B){return function(){delete this[B]}}function iF(B,Q){return function(){this[B]=Q}}function lF(B,Q){return function(){var F=Q.apply(this,arguments);null==F?delete this[B]:this[B]=F}}function cF(B){return B.trim().split(/^|\s+/)}function eF(B){return B.classList||new nF(B)}function nF(B){this._node=B,this._names=cF(B.getAttribute("class")||"")}function dF(B,Q){for(var F=eF(B),t=-1,U=Q.length;++t<U;)F.add(Q[t])}function CF(B,Q){for(var F=eF(B),t=-1,U=Q.length;++t<U;)F.remove(Q[t])}function aF(B){return function(){dF(this,B)}}function bF(B){return function(){CF(this,B)}}function oF(B,Q){return function(){(Q.apply(this,arguments)?dF:CF)(this,B)}}function GF(){this.textContent=""}function uF(B){return function(){this.textContent=B}}function rF(B){return function(){var Q=B.apply(this,arguments);this.textContent=null==Q?"":Q}}function xF(){this.innerHTML=""}function AF(B){return function(){this.innerHTML=B}}function LF(B){return function(){var Q=B.apply(this,arguments);this.innerHTML=null==Q?"":Q}}function hF(){this.nextSibling&&this.parentNode.appendChild(this)}function yF(){this.previousSibling&&this.parentNode.insertBefore(this,this.parentNode.firstChild)}function RF(){return null}function VF(){var B=this.parentNode;B&&B.removeChild(this)}function ZF(){var B=this.cloneNode(!1),Q=this.parentNode;return Q?Q.insertBefore(B,this.nextSibling):B}function SF(){var B=this.cloneNode(!0),Q=this.parentNode;return Q?Q.insertBefore(B,this.nextSibling):B}function mF(B){return function(){var Q=this.__on;if(Q){for(var F,t=0,U=-1,I=Q.length;t<I;++t)F=Q[t],B.type&&F.type!==B.type||F.name!==B.name?Q[++U]=F:this.removeEventListener(F.type,F.listener,F.options);++U?Q.length=U:delete this.__on}}}function EF(B,Q,F){return function(){var t,U=this.__on,I=function(B){return function(Q){B.call(this,Q,this.__data__)}}(Q);if(U)for(var s=0,g=U.length;s<g;++s)if((t=U[s]).type===B.type&&t.name===B.name)return this.removeEventListener(t.type,t.listener,t.options),this.addEventListener(t.type,t.listener=I,t.options=F),void(t.value=Q);this.addEventListener(B.type,I,F),t={type:B.type,name:B.name,value:Q,listener:I,options:F},U?U.push(t):this.__on=[t]}}function NF(B,Q,F){var t=FF(B),U=t.CustomEvent;"function"==typeof U?U=new U(Q,F):(U=t.document.createEvent("Event"),F?(U.initEvent(Q,F.bubbles,F.cancelable),U.detail=F.detail):U.initEvent(Q,!1,!1)),B.dispatchEvent(U)}function XF(B,Q){return function(){return NF(this,B,Q)}}function pF(B,Q){return function(){return NF(this,B,Q.apply(this,arguments))}}MQ.prototype={constructor:MQ,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)}},nF.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 WF=[null];function HF(B,Q){this._groups=B,this._parents=Q}function DF(){return new HF([[document.documentElement]],WF)}function YF(B){return"string"==typeof B?new HF([[document.querySelector(B)]],[document.documentElement]):new HF([[B]],WF)}function fF(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 t=F.createSVGPoint();return t.x=B.clientX,t.y=B.clientY,[(t=t.matrixTransform(Q.getScreenCTM().inverse())).x,t.y]}if(Q.getBoundingClientRect){var U=Q.getBoundingClientRect();return[B.clientX-U.left-Q.clientLeft,B.clientY-U.top-Q.clientTop]}}return[B.pageX,B.pageY]}HF.prototype=DF.prototype={constructor:HF,select:function(B){"function"!=typeof B&&(B=XQ(B));for(var Q=this._groups,F=Q.length,t=new Array(F),U=0;U<F;++U)for(var I,s,g=Q[U],i=g.length,l=t[U]=new Array(i),c=0;c<i;++c)(I=g[c])&&(s=B.call(I,I.__data__,c,g))&&("__data__"in I&&(s.__data__=I.__data__),l[c]=s);return new HF(t,this._parents)},selectAll:function(B){B="function"==typeof B?HQ(B):WQ(B);for(var Q=this._groups,F=Q.length,t=[],U=[],I=0;I<F;++I)for(var s,g=Q[I],i=g.length,l=0;l<i;++l)(s=g[l])&&(t.push(B.call(s,s.__data__,l,g)),U.push(s));return new HF(t,U)},selectChild:function(B){return this.select(null==B?wQ:function(B){return function(){return fQ.call(this.children,B)}}("function"==typeof B?B:YQ(B)))},selectChildren:function(B){return this.selectAll(null==B?JQ:function(B){return function(){return vQ.call(this.children,B)}}("function"==typeof B?B:YQ(B)))},filter:function(B){"function"!=typeof B&&(B=DQ(B));for(var Q=this._groups,F=Q.length,t=new Array(F),U=0;U<F;++U)for(var I,s=Q[U],g=s.length,i=t[U]=[],l=0;l<g;++l)(I=s[l])&&B.call(I,I.__data__,l,s)&&i.push(I);return new HF(t,this._parents)},data:function(B,Q){if(!arguments.length)return Array.from(this,KQ);var F=Q?zQ:TQ,t=this._parents,U=this._groups;"function"!=typeof B&&(B=function(B){return function(){return B}}(B));for(var I=U.length,s=new Array(I),g=new Array(I),i=new Array(I),l=0;l<I;++l){var c=t[l],e=U[l],n=e.length,d=OQ(B.call(c,c&&c.__data__,l,t)),C=d.length,a=g[l]=new Array(C),b=s[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(s=new HF(s,t))._enter=g,s._exit=i,s},enter:function(){return new HF(this._enter||this._groups.map(kQ),this._parents)},exit:function(){return new HF(this._exit||this._groups.map(kQ),this._parents)},join:function(B,Q,F){var t=this.enter(),U=this,I=this.exit();return"function"==typeof B?(t=B(t))&&(t=t.selection()):t=t.append(B+""),null!=Q&&(U=Q(U))&&(U=U.selection()),null==F?I.remove():F(I),t&&U?t.merge(U).order():U},merge:function(B){for(var Q=B.selection?B.selection():B,F=this._groups,t=Q._groups,U=F.length,I=t.length,s=Math.min(U,I),g=new Array(U),i=0;i<s;++i)for(var l,c=F[i],e=t[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<U;++i)g[i]=F[i];return new HF(g,this._parents)},selection:function(){return this},order:function(){for(var B=this._groups,Q=-1,F=B.length;++Q<F;)for(var t,U=B[Q],I=U.length-1,s=U[I];--I>=0;)(t=U[I])&&(s&&4^t.compareDocumentPosition(s)&&s.parentNode.insertBefore(t,s),s=t);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,t=F.length,U=new Array(t),I=0;I<t;++I){for(var s,g=F[I],i=g.length,l=U[I]=new Array(i),c=0;c<i;++c)(s=g[c])&&(l[c]=s);l.sort(Q)}return new HF(U,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 t=B[Q],U=0,I=t.length;U<I;++U){var s=t[U];if(s)return s}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,t=Q.length;F<t;++F)for(var U,I=Q[F],s=0,g=I.length;s<g;++s)(U=I[s])&&B.call(U,U.__data__,s,I);return this},attr:function(B,Q){var F=ZQ(B);if(arguments.length<2){var t=this.node();return F.local?t.getAttributeNS(F.space,F.local):t.getAttribute(F)}return this.each((null==Q?F.local?_Q:jQ:"function"==typeof Q?F.local?QF:BF:F.local?qQ:$Q)(F,Q))},style:function(B,Q,F){return arguments.length>1?this.each((null==Q?tF:"function"==typeof Q?IF:UF)(B,Q,null==F?"":F)):sF(this.node(),B)},property:function(B,Q){return arguments.length>1?this.each((null==Q?gF:"function"==typeof Q?lF:iF)(B,Q)):this.node()[B]},classed:function(B,Q){var F=cF(B+"");if(arguments.length<2){for(var t=eF(this.node()),U=-1,I=F.length;++U<I;)if(!t.contains(F[U]))return!1;return!0}return this.each(("function"==typeof Q?oF:Q?aF:bF)(F,Q))},text:function(B){return arguments.length?this.each(null==B?GF:("function"==typeof B?rF:uF)(B)):this.node().textContent},html:function(B){return arguments.length?this.each(null==B?xF:("function"==typeof B?LF:AF)(B)):this.node().innerHTML},raise:function(){return this.each(hF)},lower:function(){return this.each(yF)},append:function(B){var Q="function"==typeof B?B:EQ(B);return this.select((function(){return this.appendChild(Q.apply(this,arguments))}))},insert:function(B,Q){var F="function"==typeof B?B:EQ(B),t=null==Q?RF:"function"==typeof Q?Q:XQ(Q);return this.select((function(){return this.insertBefore(F.apply(this,arguments),t.apply(this,arguments)||null)}))},remove:function(){return this.each(VF)},clone:function(B){return this.select(B?SF:ZF)},datum:function(B){return arguments.length?this.property("__data__",B):this.node().__data__},on:function(B,Q,F){var t,U,I=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+""),s=I.length;if(!(arguments.length<2)){for(g=Q?EF:mF,t=0;t<s;++t)this.each(g(I[t],Q,F));return this}var g=this.node().__on;if(g)for(var i,l=0,c=g.length;l<c;++l)for(t=0,i=g[l];t<s;++t)if((U=I[t]).type===i.type&&U.name===i.name)return i.value},dispatch:function(B,Q){return this.each(("function"==typeof Q?pF:XF)(B,Q))},[Symbol.iterator]:function*(){for(var B=this._groups,Q=0,F=B.length;Q<F;++Q)for(var t,U=B[Q],I=0,s=U.length;I<s;++I)(t=U[I])&&(yield t)}};const wF={passive:!1},vF={capture:!0,passive:!1};function JF(B){B.stopImmediatePropagation()}function kF(B){B.preventDefault(),B.stopImmediatePropagation()}var MF=B=>()=>B;function TF(B,{sourceEvent:Q,subject:F,target:t,identifier:U,active:I,x:s,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:t,enumerable:!0,configurable:!0},identifier:{value:U,enumerable:!0,configurable:!0},active:{value:I,enumerable:!0,configurable:!0},x:{value:s,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 zF(B){return!B.ctrlKey&&!B.button}function KF(){return this.parentNode}function OF(B,Q){return null==Q?{x:B.x,y:B.y}:Q}function PF(){return navigator.maxTouchPoints||"ontouchstart"in this}function jF(){var B,Q,F,t,U=zF,I=KF,s=OF,g=PF,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,wF).on("touchend.drag touchcancel.drag",G).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function d(s,g){if(!t&&U.call(this,s,g)){var i=u(this,I.call(this,s,g),s,g,"mouse");i&&(YF(s.view).on("mousemove.drag",C,vF).on("mouseup.drag",a,vF),function(B){var Q=B.document.documentElement,F=YF(B).on("dragstart.drag",kF,vF);"onselectstart"in Q?F.on("selectstart.drag",kF,vF):(Q.__noselect=Q.style.MozUserSelect,Q.style.MozUserSelect="none")}(s.view),JF(s),F=!1,B=s.clientX,Q=s.clientY,i("start",s))}}function C(t){if(kF(t),!F){var U=t.clientX-B,I=t.clientY-Q;F=U*U+I*I>e}i.mouse("drag",t)}function a(B){YF(B.view).on("mousemove.drag mouseup.drag",null),function(B,Q){var F=B.document.documentElement,t=YF(B).on("dragstart.drag",null);Q&&(t.on("click.drag",kF,vF),setTimeout((function(){t.on("click.drag",null)}),0)),"onselectstart"in F?t.on("selectstart.drag",null):(F.style.MozUserSelect=F.__noselect,delete F.__noselect)}(B.view,F),kF(B),i.mouse("end",B)}function b(B,Q){if(U.call(this,B,Q)){var F,t,s=B.changedTouches,g=I.call(this,B,Q),i=s.length;for(F=0;F<i;++F)(t=u(this,g,B,Q,s[F].identifier,s[F]))&&(JF(B),t("start",B,s[F]))}}function o(B){var Q,F,t=B.changedTouches,U=t.length;for(Q=0;Q<U;++Q)(F=i[t[Q].identifier])&&(kF(B),F("drag",B,t[Q]))}function G(B){var Q,F,U=B.changedTouches,I=U.length;for(t&&clearTimeout(t),t=setTimeout((function(){t=null}),500),Q=0;Q<I;++Q)(F=i[U[Q].identifier])&&(JF(B),F("end",B,U[Q]))}function u(B,Q,F,t,U,I){var g,e,d,C=l.copy(),a=fF(I||F,Q);if(null!=(d=s.call(B,new TF("beforestart",{sourceEvent:F,target:n,identifier:U,active:c,x:a[0],y:a[1],dx:0,dy:0,dispatch:C}),t)))return g=d.x-a[0]||0,e=d.y-a[1]||0,function F(I,s,l){var b,o=a;switch(I){case"start":i[U]=F,b=c++;break;case"end":delete i[U],--c;case"drag":a=fF(l||s,Q),b=c}C.call(I,B,new TF(I,{sourceEvent:s,subject:d,target:n,identifier:U,active:b,x:a[0]+g,y:a[1]+e,dx:a[0]-o[0],dy:a[1]-o[1],dispatch:C}),t)}}return n.filter=function(B){return arguments.length?(U="function"==typeof B?B:MF(!!B),n):U},n.container=function(B){return arguments.length?(I="function"==typeof B?B:MF(B),n):I},n.subject=function(B){return arguments.length?(s="function"==typeof B?B:MF(B),n):s},n.touchable=function(B){return arguments.length?(g="function"==typeof B?B:MF(!!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 $F(B,Q){var F=Object.create(B.prototype);for(var t in Q)F[t]=Q[t];return F}function qF(){}TF.prototype.on=function(){var B=this._.on.apply(this._,arguments);return B===this._?this:B};var Bt=.7,Qt=1/Bt,Ft="\\s*([+-]?\\d+)\\s*",tt="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*",Ut="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*",It=/^#([0-9a-f]{3,8})$/,st=new RegExp(`^rgb\\(${Ft},${Ft},${Ft}\\)$`),gt=new RegExp(`^rgb\\(${Ut},${Ut},${Ut}\\)$`),lt=new RegExp(`^rgba\\(${Ft},${Ft},${Ft},${tt}\\)$`),ct=new RegExp(`^rgba\\(${Ut},${Ut},${Ut},${tt}\\)$`),et=new RegExp(`^hsl\\(${tt},${Ut},${Ut}\\)$`),nt=new RegExp(`^hsla\\(${tt},${Ut},${Ut},${tt}\\)$`),dt={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 Ct(){return this.rgb().formatHex()}function at(){return this.rgb().formatRgb()}function bt(B){var Q,F;return B=(B+"").trim().toLowerCase(),(Q=It.exec(B))?(F=Q[1].length,Q=parseInt(Q[1],16),6===F?ot(Q):3===F?new xt(Q>>8&15|Q>>4&240,Q>>4&15|240&Q,(15&Q)<<4|15&Q,1):8===F?Gt(Q>>24&255,Q>>16&255,Q>>8&255,(255&Q)/255):4===F?Gt(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=st.exec(B))?new xt(Q[1],Q[2],Q[3],1):(Q=gt.exec(B))?new xt(255*Q[1]/100,255*Q[2]/100,255*Q[3]/100,1):(Q=lt.exec(B))?Gt(Q[1],Q[2],Q[3],Q[4]):(Q=ct.exec(B))?Gt(255*Q[1]/100,255*Q[2]/100,255*Q[3]/100,Q[4]):(Q=et.exec(B))?Vt(Q[1],Q[2]/100,Q[3]/100,1):(Q=nt.exec(B))?Vt(Q[1],Q[2]/100,Q[3]/100,Q[4]):dt.hasOwnProperty(B)?ot(dt[B]):"transparent"===B?new xt(NaN,NaN,NaN,0):null}function ot(B){return new xt(B>>16&255,B>>8&255,255&B,1)}function Gt(B,Q,F,t){return t<=0&&(B=Q=F=NaN),new xt(B,Q,F,t)}function ut(B){return B instanceof qF||(B=bt(B)),B?new xt((B=B.rgb()).r,B.g,B.b,B.opacity):new xt}function rt(B,Q,F,t){return 1===arguments.length?ut(B):new xt(B,Q,F,null==t?1:t)}function xt(B,Q,F,t){this.r=+B,this.g=+Q,this.b=+F,this.opacity=+t}function At(){return`#${Rt(this.r)}${Rt(this.g)}${Rt(this.b)}`}function Lt(){const B=ht(this.opacity);return`${1===B?"rgb(":"rgba("}${yt(this.r)}, ${yt(this.g)}, ${yt(this.b)}${1===B?")":`, ${B})`}`}function ht(B){return isNaN(B)?1:Math.max(0,Math.min(1,B))}function yt(B){return Math.max(0,Math.min(255,Math.round(B)||0))}function Rt(B){return((B=yt(B))<16?"0":"")+B.toString(16)}function Vt(B,Q,F,t){return t<=0?B=Q=F=NaN:F<=0||F>=1?B=Q=NaN:Q<=0&&(B=NaN),new mt(B,Q,F,t)}function Zt(B){if(B instanceof mt)return new mt(B.h,B.s,B.l,B.opacity);if(B instanceof qF||(B=bt(B)),!B)return new mt;if(B instanceof mt)return B;var Q=(B=B.rgb()).r/255,F=B.g/255,t=B.b/255,U=Math.min(Q,F,t),I=Math.max(Q,F,t),s=NaN,g=I-U,i=(I+U)/2;return g?(s=Q===I?(F-t)/g+6*(F<t):F===I?(t-Q)/g+2:(Q-F)/g+4,g/=i<.5?I+U:2-I-U,s*=60):g=i>0&&i<1?0:s,new mt(s,g,i,B.opacity)}function St(B,Q,F,t){return 1===arguments.length?Zt(B):new mt(B,Q,F,null==t?1:t)}function mt(B,Q,F,t){this.h=+B,this.s=+Q,this.l=+F,this.opacity=+t}function Et(B){return(B=(B||0)%360)<0?B+360:B}function Nt(B){return Math.max(0,Math.min(1,B||0))}function Xt(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(qF,bt,{copy(B){return Object.assign(new this.constructor,this,B)},displayable(){return this.rgb().displayable()},hex:Ct,formatHex:Ct,formatHex8:function(){return this.rgb().formatHex8()},formatHsl:function(){return Zt(this).formatHsl()},formatRgb:at,toString:at}),_F(xt,rt,$F(qF,{brighter(B){return B=null==B?Qt:Math.pow(Qt,B),new xt(this.r*B,this.g*B,this.b*B,this.opacity)},darker(B){return B=null==B?Bt:Math.pow(Bt,B),new xt(this.r*B,this.g*B,this.b*B,this.opacity)},rgb(){return this},clamp(){return new xt(yt(this.r),yt(this.g),yt(this.b),ht(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:At,formatHex:At,formatHex8:function(){return`#${Rt(this.r)}${Rt(this.g)}${Rt(this.b)}${Rt(255*(isNaN(this.opacity)?1:this.opacity))}`},formatRgb:Lt,toString:Lt})),_F(mt,St,$F(qF,{brighter(B){return B=null==B?Qt:Math.pow(Qt,B),new mt(this.h,this.s,this.l*B,this.opacity)},darker(B){return B=null==B?Bt:Math.pow(Bt,B),new mt(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,t=F+(F<.5?F:1-F)*Q,U=2*F-t;return new xt(Xt(B>=240?B-240:B+120,U,t),Xt(B,U,t),Xt(B<120?B+240:B-120,U,t),this.opacity)},clamp(){return new mt(Et(this.h),Nt(this.s),Nt(this.l),ht(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=ht(this.opacity);return`${1===B?"hsl(":"hsla("}${Et(this.h)}, ${100*Nt(this.s)}%, ${100*Nt(this.l)}%${1===B?")":`, ${B})`}`}}));const pt=Math.PI/180,Wt=180/Math.PI,Ht=.96422,Dt=.82521,Yt=4/29,ft=6/29,wt=3*ft*ft,vt=ft*ft*ft;function Jt(B){if(B instanceof Mt)return new Mt(B.l,B.a,B.b,B.opacity);if(B instanceof jt)return _t(B);B instanceof xt||(B=ut(B));var Q,F,t=Ot(B.r),U=Ot(B.g),I=Ot(B.b),s=Tt((.2225045*t+.7168786*U+.0606169*I)/1);return t===U&&U===I?Q=F=s:(Q=Tt((.4360747*t+.3850649*U+.1430804*I)/Ht),F=Tt((.0139322*t+.0971045*U+.7141733*I)/Dt)),new Mt(116*s-16,500*(Q-s),200*(s-F),B.opacity)}function kt(B,Q,F,t){return 1===arguments.length?Jt(B):new Mt(B,Q,F,null==t?1:t)}function Mt(B,Q,F,t){this.l=+B,this.a=+Q,this.b=+F,this.opacity=+t}function Tt(B){return B>vt?Math.pow(B,1/3):B/wt+Yt}function zt(B){return B>ft?B*B*B:wt*(B-Yt)}function Kt(B){return 255*(B<=.0031308?12.92*B:1.055*Math.pow(B,1/2.4)-.055)}function Ot(B){return(B/=255)<=.04045?B/12.92:Math.pow((B+.055)/1.055,2.4)}function Pt(B,Q,F,t){return 1===arguments.length?function(B){if(B instanceof jt)return new jt(B.h,B.c,B.l,B.opacity);if(B instanceof Mt||(B=Jt(B)),0===B.a&&0===B.b)return new jt(NaN,0<B.l&&B.l<100?0:NaN,B.l,B.opacity);var Q=Math.atan2(B.b,B.a)*Wt;return new jt(Q<0?Q+360:Q,Math.sqrt(B.a*B.a+B.b*B.b),B.l,B.opacity)}(B):new jt(B,Q,F,null==t?1:t)}function jt(B,Q,F,t){this.h=+B,this.c=+Q,this.l=+F,this.opacity=+t}function _t(B){if(isNaN(B.h))return new Mt(B.l,0,0,B.opacity);var Q=B.h*pt;return new Mt(B.l,Math.cos(Q)*B.c,Math.sin(Q)*B.c,B.opacity)}_F(Mt,kt,$F(qF,{brighter(B){return new Mt(this.l+18*(null==B?1:B),this.a,this.b,this.opacity)},darker(B){return new Mt(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 xt(Kt(3.1338561*(Q=Ht*zt(Q))-1.6168667*(B=1*zt(B))-.4906146*(F=Dt*zt(F))),Kt(-.9787684*Q+1.9161415*B+.033454*F),Kt(.0719453*Q-.2289914*B+1.4052427*F),this.opacity)}})),_F(jt,Pt,$F(qF,{brighter(B){return new jt(this.h,this.c,this.l+18*(null==B?1:B),this.opacity)},darker(B){return new jt(this.h,this.c,this.l-18*(null==B?1:B),this.opacity)},rgb(){return _t(this).rgb()}}));var $t=-.14861,qt=1.78277,BU=-.29227,QU=-.90649,FU=1.97294,tU=FU*QU,UU=FU*qt,IU=qt*BU-QU*$t;function sU(B,Q,F,t){return 1===arguments.length?function(B){if(B instanceof gU)return new gU(B.h,B.s,B.l,B.opacity);B instanceof xt||(B=ut(B));var Q=B.r/255,F=B.g/255,t=B.b/255,U=(IU*t+tU*Q-UU*F)/(IU+tU-UU),I=t-U,s=(FU*(F-U)-BU*I)/QU,g=Math.sqrt(s*s+I*I)/(FU*U*(1-U)),i=g?Math.atan2(s,I)*Wt-120:NaN;return new gU(i<0?i+360:i,g,U,B.opacity)}(B):new gU(B,Q,F,null==t?1:t)}function gU(B,Q,F,t){this.h=+B,this.s=+Q,this.l=+F,this.opacity=+t}_F(gU,sU,$F(qF,{brighter(B){return B=null==B?Qt:Math.pow(Qt,B),new gU(this.h,this.s,this.l*B,this.opacity)},darker(B){return B=null==B?Bt:Math.pow(Bt,B),new gU(this.h,this.s,this.l*B,this.opacity)},rgb(){var B=isNaN(this.h)?0:(this.h+120)*pt,Q=+this.l,F=isNaN(this.s)?0:this.s*Q*(1-Q),t=Math.cos(B),U=Math.sin(B);return new xt(255*(Q+F*($t*t+qt*U)),255*(Q+F*(BU*t+QU*U)),255*(Q+F*(FU*t)),this.opacity)}}));var iU=B=>()=>B;function lU(B,Q){return function(F){return B+F*Q}}function cU(B,Q){var F=Q-B;return F?lU(B,F>180||F<-180?F-360*Math.round(F/360):F):iU(isNaN(B)?Q:B)}function eU(B){return 1==(B=+B)?nU: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(t){return Math.pow(B+t*Q,F)}}(Q,F,B):iU(isNaN(Q)?F:Q)}}function nU(B,Q){var F=Q-B;return F?lU(B,F):iU(isNaN(B)?Q:B)}var dU=function B(Q){var F=eU(Q);function t(B,Q){var t=F((B=rt(B)).r,(Q=rt(Q)).r),U=F(B.g,Q.g),I=F(B.b,Q.b),s=nU(B.opacity,Q.opacity);return function(Q){return B.r=t(Q),B.g=U(Q),B.b=I(Q),B.opacity=s(Q),B+""}}return t.gamma=B,t}(1);var CU,aU=(CU=function(B){var Q=B.length-1;return function(F){var t=F<=0?F=0:F>=1?(F=1,Q-1):Math.floor(F*Q),U=B[t],I=B[t+1],s=t>0?B[t-1]:2*U-I,g=t<Q-1?B[t+2]:2*I-U;return function(B,Q,F,t,U){var I=B*B,s=I*B;return((1-3*B+3*I-s)*Q+(4-6*I+3*s)*F+(1+3*B+3*I-3*s)*t+s*U)/6}((F-t/Q)*Q,s,U,I,g)}},function(B){var Q,F,t=B.length,U=new Array(t),I=new Array(t),s=new Array(t);for(Q=0;Q<t;++Q)F=rt(B[Q]),U[Q]=F.r||0,I[Q]=F.g||0,s[Q]=F.b||0;return U=CU(U),I=CU(I),s=CU(s),F.opacity=1,function(B){return F.r=U(B),F.g=I(B),F.b=s(B),F+""}});function bU(B,Q){Q||(Q=[]);var F,t=B?Math.min(Q.length,B.length):0,U=Q.slice();return function(I){for(F=0;F<t;++F)U[F]=B[F]*(1-I)+Q[F]*I;return U}}function oU(B,Q){var F,t=Q?Q.length:0,U=B?Math.min(t,B.length):0,I=new Array(U),s=new Array(t);for(F=0;F<U;++F)I[F]=hU(B[F],Q[F]);for(;F<t;++F)s[F]=Q[F];return function(B){for(F=0;F<U;++F)s[F]=I[F](B);return s}}function GU(B,Q){var F=new Date;return B=+B,Q=+Q,function(t){return F.setTime(B*(1-t)+Q*t),F}}function uU(B,Q){return B=+B,Q=+Q,function(F){return B*(1-F)+Q*F}}function rU(B,Q){var F,t={},U={};for(F in null!==B&&"object"==typeof B||(B={}),null!==Q&&"object"==typeof Q||(Q={}),Q)F in B?t[F]=hU(B[F],Q[F]):U[F]=Q[F];return function(B){for(F in t)U[F]=t[F](B);return U}}var xU=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,AU=new RegExp(xU.source,"g");function LU(B,Q){var F,t,U,I=xU.lastIndex=AU.lastIndex=0,s=-1,g=[],i=[];for(B+="",Q+="";(F=xU.exec(B))&&(t=AU.exec(Q));)(U=t.index)>I&&(U=Q.slice(I,U),g[s]?g[s]+=U:g[++s]=U),(F=F[0])===(t=t[0])?g[s]?g[s]+=t:g[++s]=t:(g[++s]=null,i.push({i:s,x:uU(F,t)})),I=AU.lastIndex;return I<Q.length&&(U=Q.slice(I),g[s]?g[s]+=U:g[++s]=U),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,t=0;t<Q;++t)g[(F=i[t]).i]=F.x(B);return g.join("")})}function hU(B,Q){var F,t=typeof Q;return null==Q||"boolean"===t?iU(Q):("number"===t?uU:"string"===t?(F=bt(Q))?(Q=F,dU):LU:Q instanceof bt?dU:Q instanceof Date?GU:function(B){return ArrayBuffer.isView(B)&&!(B instanceof DataView)}(Q)?bU:Array.isArray(Q)?oU:"function"!=typeof Q.valueOf&&"function"!=typeof Q.toString||isNaN(Q)?rU:uU)(B,Q)}function yU(B,Q){return B=+B,Q=+Q,function(F){return Math.round(B*(1-F)+Q*F)}}var RU,VU=180/Math.PI,ZU={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1};function SU(B,Q,F,t,U,I){var s,g,i;return(s=Math.sqrt(B*B+Q*Q))&&(B/=s,Q/=s),(i=B*F+Q*t)&&(F-=B*i,t-=Q*i),(g=Math.sqrt(F*F+t*t))&&(F/=g,t/=g,i/=g),B*t<Q*F&&(B=-B,Q=-Q,i=-i,s=-s),{translateX:U,translateY:I,rotate:Math.atan2(Q,B)*VU,skewX:Math.atan(i)*VU,scaleX:s,scaleY:g}}function mU(B,Q,F,t){function U(B){return B.length?B.pop()+" ":""}return function(I,s){var g=[],i=[];return I=B(I),s=B(s),function(B,t,U,I,s,g){if(B!==U||t!==I){var i=s.push("translate(",null,Q,null,F);g.push({i:i-4,x:uU(B,U)},{i:i-2,x:uU(t,I)})}else(U||I)&&s.push("translate("+U+Q+I+F)}(I.translateX,I.translateY,s.translateX,s.translateY,g,i),function(B,Q,F,I){B!==Q?(B-Q>180?Q+=360:Q-B>180&&(B+=360),I.push({i:F.push(U(F)+"rotate(",null,t)-2,x:uU(B,Q)})):Q&&F.push(U(F)+"rotate("+Q+t)}(I.rotate,s.rotate,g,i),function(B,Q,F,I){B!==Q?I.push({i:F.push(U(F)+"skewX(",null,t)-2,x:uU(B,Q)}):Q&&F.push(U(F)+"skewX("+Q+t)}(I.skewX,s.skewX,g,i),function(B,Q,F,t,I,s){if(B!==F||Q!==t){var g=I.push(U(I)+"scale(",null,",",null,")");s.push({i:g-4,x:uU(B,F)},{i:g-2,x:uU(Q,t)})}else 1===F&&1===t||I.push(U(I)+"scale("+F+","+t+")")}(I.scaleX,I.scaleY,s.scaleX,s.scaleY,g,i),I=s=null,function(B){for(var Q,F=-1,t=i.length;++F<t;)g[(Q=i[F]).i]=Q.x(B);return g.join("")}}}var EU=mU((function(B){const Q=new("function"==typeof DOMMatrix?DOMMatrix:WebKitCSSMatrix)(B+"");return Q.isIdentity?ZU:SU(Q.a,Q.b,Q.c,Q.d,Q.e,Q.f)}),"px, ","px)","deg)"),NU=mU((function(B){return null==B?ZU:(RU||(RU=document.createElementNS("http://www.w3.org/2000/svg","g")),RU.setAttribute("transform",B),(B=RU.transform.baseVal.consolidate())?SU((B=B.matrix).a,B.b,B.c,B.d,B.e,B.f):ZU)}),", ",")",")");var XU=function(B){return function(Q,F){var t=B((Q=St(Q)).h,(F=St(F)).h),U=nU(Q.s,F.s),I=nU(Q.l,F.l),s=nU(Q.opacity,F.opacity);return function(B){return Q.h=t(B),Q.s=U(B),Q.l=I(B),Q.opacity=s(B),Q+""}}}(cU);var pU=function(B){return function(Q,F){var t=B((Q=Pt(Q)).h,(F=Pt(F)).h),U=nU(Q.c,F.c),I=nU(Q.l,F.l),s=nU(Q.opacity,F.opacity);return function(B){return Q.h=t(B),Q.c=U(B),Q.l=I(B),Q.opacity=s(B),Q+""}}}(cU);function WU(B){return function Q(F){function t(Q,t){var U=B((Q=sU(Q)).h,(t=sU(t)).h),I=nU(Q.s,t.s),s=nU(Q.l,t.l),g=nU(Q.opacity,t.opacity);return function(B){return Q.h=U(B),Q.s=I(B),Q.l=s(Math.pow(B,F)),Q.opacity=g(B),Q+""}}return F=+F,t.gamma=Q,t}(1)}WU(cU);var HU=WU(nU);function DU(B,Q){void 0===Q&&(Q=B,B=hU);for(var F=0,t=Q.length-1,U=Q[0],I=new Array(t<0?0:t);F<t;)I[F]=B(U,U=Q[++F]);return function(B){var Q=Math.max(0,Math.min(t-1,Math.floor(B*=t)));return I[Q](B-Q)}}function YU(B,Q){for(var F=new Array(Q),t=0;t<Q;++t)F[t]=B(t/(Q-1));return F}var fU,wU,vU=0,JU=0,kU=0,MU=0,TU=0,zU=0,KU="object"==typeof performance&&performance.now?performance:Date,OU="object"==typeof window&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(B){setTimeout(B,17)};function PU(){return TU||(OU(jU),TU=KU.now()+zU)}function jU(){TU=0}function _U(){this._call=this._time=this._next=null}function $U(B,Q,F){var t=new _U;return t.restart(B,Q,F),t}function qU(){TU=(MU=KU.now())+zU,vU=JU=0;try{!function(){PU(),++vU;for(var B,Q=fU;Q;)(B=TU-Q._time)>=0&&Q._call.call(void 0,B),Q=Q._next;--vU}()}finally{vU=0,function(){var B,Q,F=fU,t=1/0;for(;F;)F._call?(t>F._time&&(t=F._time),B=F,F=F._next):(Q=F._next,F._next=null,F=B?B._next=Q:fU=Q);wU=B,QI(t)}(),TU=0}}function BI(){var B=KU.now(),Q=B-MU;Q>1e3&&(zU-=Q,MU=B)}function QI(B){vU||(JU&&(JU=clearTimeout(JU)),B-TU>24?(B<1/0&&(JU=setTimeout(qU,B-KU.now()-zU)),kU&&(kU=clearInterval(kU))):(kU||(MU=KU.now(),kU=setInterval(BI,1e3)),vU=1,OU(qU)))}function FI(B,Q,F){var t=new _U;return Q=null==Q?0:+Q,t.restart((F=>{t.stop(),B(F+Q)}),Q,F),t}_U.prototype=$U.prototype={constructor:_U,restart:function(B,Q,F){if("function"!=typeof B)throw new TypeError("callback is not a function");F=(null==F?PU():+F)+(null==Q?0:+Q),this._next||wU===this||(wU?wU._next=this:fU=this,wU=this),this._call=B,this._time=F,QI()},stop:function(){this._call&&(this._call=null,this._time=1/0,QI())}};var tI=AQ("start","end","cancel","interrupt"),UI=[];function II(B,Q,F,t,U,I){var s=B.__transition;if(s){if(F in s)return}else B.__transition={};!function(B,Q,F){var t,U=B.__transition;function I(B){F.state=1,F.timer.restart(s,F.delay,F.time),F.delay<=B&&s(B-F.delay)}function s(I){var l,c,e,n;if(1!==F.state)return i();for(l in U)if((n=U[l]).name===F.name){if(3===n.state)return FI(s);4===n.state?(n.state=6,n.timer.stop(),n.on.call("interrupt",B,B.__data__,n.index,n.group),delete U[l]):+l<Q&&(n.state=6,n.timer.stop(),n.on.call("cancel",B,B.__data__,n.index,n.group),delete U[l])}if(FI((function(){3===F.state&&(F.state=4,F.timer.restart(g,F.delay,F.time),g(I))})),F.state=2,F.on.call("start",B,B.__data__,F.index,F.group),2===F.state){for(F.state=3,t=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))&&(t[++c]=n);t.length=c+1}}function g(Q){for(var U=Q<F.duration?F.ease.call(null,Q/F.duration):(F.timer.restart(i),F.state=5,1),I=-1,s=t.length;++I<s;)t[I].call(B,U);5===F.state&&(F.on.call("end",B,B.__data__,F.index,F.group),i())}function i(){for(var t in F.state=6,F.timer.stop(),delete U[Q],U)return;delete B.__transition}U[Q]=F,F.timer=$U(I,0,F.time)}(B,F,{name:Q,index:t,group:U,on:tI,tween:UI,time:I.time,delay:I.delay,duration:I.duration,ease:I.ease,timer:null,state:0})}function sI(B,Q){var F=iI(B,Q);if(F.state>0)throw new Error("too late; already scheduled");return F}function gI(B,Q){var F=iI(B,Q);if(F.state>3)throw new Error("too late; already running");return F}function iI(B,Q){var F=B.__transition;if(!F||!(F=F[Q]))throw new Error("transition not found");return F}function lI(B,Q){var F,t;return function(){var U=gI(this,B),I=U.tween;if(I!==F)for(var s=0,g=(t=F=I).length;s<g;++s)if(t[s].name===Q){(t=t.slice()).splice(s,1);break}U.tween=t}}function cI(B,Q,F){var t,U;if("function"!=typeof F)throw new Error;return function(){var I=gI(this,B),s=I.tween;if(s!==t){U=(t=s).slice();for(var g={name:Q,value:F},i=0,l=U.length;i<l;++i)if(U[i].name===Q){U[i]=g;break}i===l&&U.push(g)}I.tween=U}}function eI(B,Q,F){var t=B._id;return B.each((function(){var B=gI(this,t);(B.value||(B.value={}))[Q]=F.apply(this,arguments)})),function(B){return iI(B,t).value[Q]}}function nI(B,Q){var F;return("number"==typeof Q?uU:Q instanceof bt?dU:(F=bt(Q))?(Q=F,dU):LU)(B,Q)}function dI(B){return function(){this.removeAttribute(B)}}function CI(B){return function(){this.removeAttributeNS(B.space,B.local)}}function aI(B,Q,F){var t,U,I=F+"";return function(){var s=this.getAttribute(B);return s===I?null:s===t?U:U=Q(t=s,F)}}function bI(B,Q,F){var t,U,I=F+"";return function(){var s=this.getAttributeNS(B.space,B.local);return s===I?null:s===t?U:U=Q(t=s,F)}}function oI(B,Q,F){var t,U,I;return function(){var s,g,i=F(this);if(null!=i)return(s=this.getAttribute(B))===(g=i+"")?null:s===t&&g===U?I:(U=g,I=Q(t=s,i));this.removeAttribute(B)}}function GI(B,Q,F){var t,U,I;return function(){var s,g,i=F(this);if(null!=i)return(s=this.getAttributeNS(B.space,B.local))===(g=i+"")?null:s===t&&g===U?I:(U=g,I=Q(t=s,i));this.removeAttributeNS(B.space,B.local)}}function uI(B,Q){var F,t;function U(){var U=Q.apply(this,arguments);return U!==t&&(F=(t=U)&&function(B,Q){return function(F){this.setAttributeNS(B.space,B.local,Q.call(this,F))}}(B,U)),F}return U._value=Q,U}function rI(B,Q){var F,t;function U(){var U=Q.apply(this,arguments);return U!==t&&(F=(t=U)&&function(B,Q){return function(F){this.setAttribute(B,Q.call(this,F))}}(B,U)),F}return U._value=Q,U}function xI(B,Q){return function(){sI(this,B).delay=+Q.apply(this,arguments)}}function AI(B,Q){return Q=+Q,function(){sI(this,B).delay=Q}}function LI(B,Q){return function(){gI(this,B).duration=+Q.apply(this,arguments)}}function hI(B,Q){return Q=+Q,function(){gI(this,B).duration=Q}}var yI=DF.prototype.constructor;function RI(B){return function(){this.style.removeProperty(B)}}var VI=0;function ZI(B,Q,F,t){this._groups=B,this._parents=Q,this._name=F,this._id=t}function SI(){return++VI}var mI=DF.prototype;ZI.prototype={constructor:ZI,select:function(B){var Q=this._name,F=this._id;"function"!=typeof B&&(B=XQ(B));for(var t=this._groups,U=t.length,I=new Array(U),s=0;s<U;++s)for(var g,i,l=t[s],c=l.length,e=I[s]=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,II(e[n],Q,F,n,e,iI(g,F)));return new ZI(I,this._parents,Q,F)},selectAll:function(B){var Q=this._name,F=this._id;"function"!=typeof B&&(B=WQ(B));for(var t=this._groups,U=t.length,I=[],s=[],g=0;g<U;++g)for(var i,l=t[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=iI(i,F),a=0,b=d.length;a<b;++a)(n=d[a])&&II(n,Q,F,a,d,C);I.push(d),s.push(i)}return new ZI(I,s,Q,F)},selectChild:mI.selectChild,selectChildren:mI.selectChildren,filter:function(B){"function"!=typeof B&&(B=DQ(B));for(var Q=this._groups,F=Q.length,t=new Array(F),U=0;U<F;++U)for(var I,s=Q[U],g=s.length,i=t[U]=[],l=0;l<g;++l)(I=s[l])&&B.call(I,I.__data__,l,s)&&i.push(I);return new ZI(t,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,t=Q.length,U=F.length,I=Math.min(t,U),s=new Array(t),g=0;g<I;++g)for(var i,l=Q[g],c=F[g],e=l.length,n=s[g]=new Array(e),d=0;d<e;++d)(i=l[d]||c[d])&&(n[d]=i);for(;g<t;++g)s[g]=Q[g];return new ZI(s,this._parents,this._name,this._id)},selection:function(){return new yI(this._groups,this._parents)},transition:function(){for(var B=this._name,Q=this._id,F=SI(),t=this._groups,U=t.length,I=0;I<U;++I)for(var s,g=t[I],i=g.length,l=0;l<i;++l)if(s=g[l]){var c=iI(s,Q);II(s,B,F,l,g,{time:c.time+c.delay+c.duration,delay:0,duration:c.duration,ease:c.ease})}return new ZI(t,this._parents,B,F)},call:mI.call,nodes:mI.nodes,node:mI.node,size:mI.size,empty:mI.empty,each:mI.each,on:function(B,Q){var F=this._id;return arguments.length<2?iI(this.node(),F).on.on(B):this.each(function(B,Q,F){var t,U,I=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)?sI:gI;return function(){var s=I(this,B),g=s.on;g!==t&&(U=(t=g).copy()).on(Q,F),s.on=U}}(F,B,Q))},attr:function(B,Q){var F=ZQ(B),t="transform"===F?NU:nI;return this.attrTween(B,"function"==typeof Q?(F.local?GI:oI)(F,t,eI(this,"attr."+B,Q)):null==Q?(F.local?CI:dI)(F):(F.local?bI:aI)(F,t,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 t=ZQ(B);return this.tween(F,(t.local?uI:rI)(t,Q))},style:function(B,Q,F){var t="transform"==(B+="")?EU:nI;return null==Q?this.styleTween(B,function(B,Q){var F,t,U;return function(){var I=sF(this,B),s=(this.style.removeProperty(B),sF(this,B));return I===s?null:I===F&&s===t?U:U=Q(F=I,t=s)}}(B,t)).on("end.style."+B,RI(B)):"function"==typeof Q?this.styleTween(B,function(B,Q,F){var t,U,I;return function(){var s=sF(this,B),g=F(this),i=g+"";return null==g&&(this.style.removeProperty(B),i=g=sF(this,B)),s===i?null:s===t&&i===U?I:(U=i,I=Q(t=s,g))}}(B,t,eI(this,"style."+B,Q))).each(function(B,Q){var F,t,U,I,s="style."+Q,g="end."+s;return function(){var i=gI(this,B),l=i.on,c=null==i.value[s]?I||(I=RI(Q)):void 0;l===F&&U===c||(t=(F=l).copy()).on(g,U=c),i.on=t}}(this._id,B)):this.styleTween(B,function(B,Q,F){var t,U,I=F+"";return function(){var s=sF(this,B);return s===I?null:s===t?U:U=Q(t=s,F)}}(B,t,Q),F).on("end.style."+B,null)},styleTween:function(B,Q,F){var t="style."+(B+="");if(arguments.length<2)return(t=this.tween(t))&&t._value;if(null==Q)return this.tween(t,null);if("function"!=typeof Q)throw new Error;return this.tween(t,function(B,Q,F){var t,U;function I(){var I=Q.apply(this,arguments);return I!==U&&(t=(U=I)&&function(B,Q,F){return function(t){this.style.setProperty(B,Q.call(this,t),F)}}(B,I,F)),t}return I._value=Q,I}(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}}(eI(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 t(){var t=B.apply(this,arguments);return t!==F&&(Q=(F=t)&&function(B){return function(Q){this.textContent=B.call(this,Q)}}(t)),Q}return t._value=B,t}(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 t,U=iI(this.node(),F).tween,I=0,s=U.length;I<s;++I)if((t=U[I]).name===B)return t.value;return null}return this.each((null==Q?lI:cI)(F,B,Q))},delay:function(B){var Q=this._id;return arguments.length?this.each(("function"==typeof B?xI:AI)(Q,B)):iI(this.node(),Q).delay},duration:function(B){var Q=this._id;return arguments.length?this.each(("function"==typeof B?LI:hI)(Q,B)):iI(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(){gI(this,B).ease=Q}}(Q,B)):iI(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;gI(this,B).ease=F}}(this._id,B))},end:function(){var B,Q,F=this,t=F._id,U=F.size();return new Promise((function(I,s){var g={value:s},i={value:function(){0==--U&&I()}};F.each((function(){var F=gI(this,t),U=F.on;U!==B&&((Q=(B=U).copy())._.cancel.push(g),Q._.interrupt.push(g),Q._.end.push(i)),F.on=Q})),0===U&&I()}))},[Symbol.iterator]:mI[Symbol.iterator]};const EI=B=>+B;function NI(B){return--B*B*B+1}var XI={time:null,delay:0,duration:250,ease:function(B){return((B*=2)<=1?B*B*B:(B-=2)*B*B+2)/2}};function pI(B,Q){for(var F;!(F=B.__transition)||!(F=F[Q]);)if(!(B=B.parentNode))throw new Error(`transition ${Q} not found`);return F}DF.prototype.interrupt=function(B){return this.each((function(){!function(B,Q){var F,t,U,I=B.__transition,s=!0;if(I){for(U in Q=null==Q?null:Q+"",I)(F=I[U]).name===Q?(t=F.state>2&&F.state<5,F.state=6,F.timer.stop(),F.on.call(t?"interrupt":"cancel",B,B.__data__,F.index,F.group),delete I[U]):s=!1;s&&delete B.__transition}}(this,B)}))},DF.prototype.transition=function(B){var Q,F;B instanceof ZI?(Q=B._id,B=B._name):(Q=SI(),(F=XI).time=PU(),B=null==B?null:B+"");for(var t=this._groups,U=t.length,I=0;I<U;++I)for(var s,g=t[I],i=g.length,l=0;l<i;++l)(s=g[l])&&II(s,B,Q,l,g,F||pI(s,Q));return new ZI(t,this._parents,B,Q)};const WI=Math.PI,HI=2*WI,DI=1e-6,YI=HI-DI;function fI(B){this._+=B[0];for(let Q=1,F=B.length;Q<F;++Q)this._+=arguments[Q]+B[Q]}class wI{constructor(B){this._x0=this._y0=this._x1=this._y1=null,this._="",this._append=null==B?fI:function(B){let Q=Math.floor(B);if(!(Q>=0))throw new Error(`invalid digits: ${B}`);if(Q>15)return fI;const F=10**Q;return function(B){this._+=B[0];for(let Q=1,t=B.length;Q<t;++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,t){this._append`Q${+B},${+Q},${this._x1=+F},${this._y1=+t}`}bezierCurveTo(B,Q,F,t,U,I){this._append`C${+B},${+Q},${+F},${+t},${this._x1=+U},${this._y1=+I}`}arcTo(B,Q,F,t,U){if(B=+B,Q=+Q,F=+F,t=+t,(U=+U)<0)throw new Error(`negative radius: ${U}`);let I=this._x1,s=this._y1,g=F-B,i=t-Q,l=I-B,c=s-Q,e=l*l+c*c;if(null===this._x1)this._append`M${this._x1=B},${this._y1=Q}`;else if(e>DI)if(Math.abs(c*g-i*l)>DI&&U){let n=F-I,d=t-s,C=g*g+i*i,a=n*n+d*d,b=Math.sqrt(C),o=Math.sqrt(e),G=U*Math.tan((WI-Math.acos((C+e-a)/(2*b*o)))/2),u=G/o,r=G/b;Math.abs(u-1)>DI&&this._append`L${B+u*l},${Q+u*c}`,this._append`A${U},${U},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,t,U,I){if(B=+B,Q=+Q,I=!!I,(F=+F)<0)throw new Error(`negative radius: ${F}`);let s=F*Math.cos(t),g=F*Math.sin(t),i=B+s,l=Q+g,c=1^I,e=I?t-U:U-t;null===this._x1?this._append`M${i},${l}`:(Math.abs(this._x1-i)>DI||Math.abs(this._y1-l)>DI)&&this._append`L${i},${l}`,F&&(e<0&&(e=e%HI+HI),e>YI?this._append`A${F},${F},0,1,${c},${B-s},${Q-g}A${F},${F},0,1,${c},${this._x1=i},${this._y1=l}`:e>DI&&this._append`A${F},${F},0,${+(e>=WI)},${c},${this._x1=B+F*Math.cos(U)},${this._y1=Q+F*Math.sin(U)}`)}rect(B,Q,F,t){this._append`M${this._x0=this._x1=+B},${this._y0=this._y1=+Q}h${F=+F}v${+t}h${-F}Z`}toString(){return this._}}function vI(B=3){return new wI(+B)}function JI(B,Q){if((F=(B=Q?B.toExponential(Q-1):B.toExponential()).indexOf("e"))<0)return null;var F,t=B.slice(0,F);return[t.length>1?t[0]+t.slice(2):t,+B.slice(F+1)]}function kI(B){return(B=JI(Math.abs(B)))?B[1]:NaN}var MI,TI=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function zI(B){if(!(Q=TI.exec(B)))throw new Error("invalid format: "+B);var Q;return new KI({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 KI(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 OI(B,Q){var F=JI(B,Q);if(!F)return B+"";var t=F[0],U=F[1];return U<0?"0."+new Array(-U).join("0")+t:t.length>U+1?t.slice(0,U+1)+"."+t.slice(U+1):t+new Array(U-t.length+2).join("0")}zI.prototype=KI.prototype,KI.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 PI={"%":(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)=>OI(100*B,Q),r:OI,s:function(B,Q){var F=JI(B,Q);if(!F)return B+"";var t=F[0],U=F[1],I=U-(MI=3*Math.max(-8,Math.min(8,Math.floor(U/3))))+1,s=t.length;return I===s?t:I>s?t+new Array(I-s+1).join("0"):I>0?t.slice(0,I)+"."+t.slice(I):"0."+new Array(1-I).join("0")+JI(B,Math.max(0,Q+I-1))[0]},X:B=>Math.round(B).toString(16).toUpperCase(),x:B=>Math.round(B).toString(16)};function jI(B){return B}var _I,$I,qI,Bs=Array.prototype.map,Qs=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function Fs(B){var Q,F,t=void 0===B.grouping||void 0===B.thousands?jI:(Q=Bs.call(B.grouping,Number),F=B.thousands+"",function(B,t){for(var U=B.length,I=[],s=0,g=Q[0],i=0;U>0&&g>0&&(i+g+1>t&&(g=Math.max(1,t-i)),I.push(B.substring(U-=g,U+g)),!((i+=g+1)>t));)g=Q[s=(s+1)%Q.length];return I.reverse().join(F)}),U=void 0===B.currency?"":B.currency[0]+"",I=void 0===B.currency?"":B.currency[1]+"",s=void 0===B.decimal?".":B.decimal+"",g=void 0===B.numerals?jI:function(B){return function(Q){return Q.replace(/[0-9]/g,(function(Q){return B[+Q]}))}}(Bs.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=zI(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"):PI[G]||(void 0===b&&(b=12),o=!0,G="g"),(d||"0"===Q&&"="===F)&&(d=!0,Q="0",F="=");var u="$"===n?U:"#"===n&&/[boxX]/.test(G)?"0"+G.toLowerCase():"",r="$"===n?I:/[%p]/.test(G)?i:"",x=PI[G],A=/[defgprs%]/.test(G);function L(B){var U,I,i,n=u,L=r;if("c"===G)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,t=1,U=-1;t<F;++t)switch(B[t]){case".":U=Q=t;break;case"0":0===U&&(U=t),Q=t;break;default:if(!+B[t])break B;U>0&&(U=0)}return U>0?B.slice(0,U)+B.slice(Q+1):B}(B)),h&&0==+B&&"+"!==e&&(h=!1),n=(h?"("===e?e:l:"-"===e||"("===e?"":e)+n,L=("s"===G?Qs[8+MI/3]:"")+L+(h&&"("===e?")":""),A)for(U=-1,I=B.length;++U<I;)if(48>(i=B.charCodeAt(U))||i>57){L=(46===i?s+B.slice(U+1):B.slice(U))+L,B=B.slice(0,U);break}}a&&!d&&(B=t(B,1/0));var y=n.length+B.length+L.length,R=y<C?new Array(C-y+1).join(Q):"";switch(a&&d&&(B=t(R+B,R.length?C-L.length:1/0),R=""),F){case"<":B=n+B+L+R;break;case"=":B=n+R+B+L;break;case"^":B=R.slice(0,y=R.length>>1)+n+B+L+R.slice(y);break;default:B=R+n+B+L}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)),L.toString=function(){return B+""},L}return{format:e,formatPrefix:function(B,Q){var F=e(((B=zI(B)).type="f",B)),t=3*Math.max(-8,Math.min(8,Math.floor(kI(Q)/3))),U=Math.pow(10,-t),I=Qs[8+t/3];return function(B){return F(U*B)+I}}}}_I=Fs({thousands:",",grouping:[3],currency:["$",""]}),$I=_I.format,qI=_I.formatPrefix;var ts=1e-6,Us=Math.PI,Is=Us/2,ss=Us/4,gs=2*Us,is=180/Us,ls=Us/180,cs=Math.abs,es=Math.atan,ns=Math.atan2,ds=Math.cos,Cs=Math.exp,as=Math.log,bs=Math.pow,os=Math.sin,Gs=Math.sign||function(B){return B>0?1:B<0?-1:0},us=Math.sqrt,rs=Math.tan;function xs(B){return B>1?0:B<-1?Us:Math.acos(B)}function As(B){return B>1?Is:B<-1?-Is:Math.asin(B)}function Ls(){}function hs(B,Q){B&&Rs.hasOwnProperty(B.type)&&Rs[B.type](B,Q)}var ys={Feature:function(B,Q){hs(B.geometry,Q)},FeatureCollection:function(B,Q){for(var F=B.features,t=-1,U=F.length;++t<U;)hs(F[t].geometry,Q)}},Rs={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,t=-1,U=F.length;++t<U;)B=F[t],Q.point(B[0],B[1],B[2])},LineString:function(B,Q){Vs(B.coordinates,Q,0)},MultiLineString:function(B,Q){for(var F=B.coordinates,t=-1,U=F.length;++t<U;)Vs(F[t],Q,0)},Polygon:function(B,Q){Zs(B.coordinates,Q)},MultiPolygon:function(B,Q){for(var F=B.coordinates,t=-1,U=F.length;++t<U;)Zs(F[t],Q)},GeometryCollection:function(B,Q){for(var F=B.geometries,t=-1,U=F.length;++t<U;)hs(F[t],Q)}};function Vs(B,Q,F){var t,U=-1,I=B.length-F;for(Q.lineStart();++U<I;)t=B[U],Q.point(t[0],t[1],t[2]);Q.lineEnd()}function Zs(B,Q){var F=-1,t=B.length;for(Q.polygonStart();++F<t;)Vs(B[F],Q,1);Q.polygonEnd()}function Ss(B,Q){B&&ys.hasOwnProperty(B.type)?ys[B.type](B,Q):hs(B,Q)}function ms(B){return[ns(B[1],B[0]),As(B[2])]}function Es(B){var Q=B[0],F=B[1],t=ds(F);return[t*ds(Q),t*os(Q),os(F)]}function Ns(B,Q){return B[0]*Q[0]+B[1]*Q[1]+B[2]*Q[2]}function Xs(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 ps(B,Q){B[0]+=Q[0],B[1]+=Q[1],B[2]+=Q[2]}function Ws(B,Q){return[B[0]*Q,B[1]*Q,B[2]*Q]}function Hs(B){var Q=us(B[0]*B[0]+B[1]*B[1]+B[2]*B[2]);B[0]/=Q,B[1]/=Q,B[2]/=Q}function Ds(B,Q){function F(F,t){return F=B(F,t),Q(F[0],F[1])}return B.invert&&Q.invert&&(F.invert=function(F,t){return(F=Q.invert(F,t))&&B.invert(F[0],F[1])}),F}function Ys(B,Q){return cs(B)>Us&&(B-=Math.round(B/gs)*gs),[B,Q]}function fs(B,Q,F){return(B%=gs)?Q||F?Ds(vs(B),Js(Q,F)):vs(B):Q||F?Js(Q,F):Ys}function ws(B){return function(Q,F){return cs(Q+=B)>Us&&(Q-=Math.round(Q/gs)*gs),[Q,F]}}function vs(B){var Q=ws(B);return Q.invert=ws(-B),Q}function Js(B,Q){var F=ds(B),t=os(B),U=ds(Q),I=os(Q);function s(B,Q){var s=ds(Q),g=ds(B)*s,i=os(B)*s,l=os(Q),c=l*F+g*t;return[ns(i*U-c*I,g*F-l*t),As(c*U+i*I)]}return s.invert=function(B,Q){var s=ds(Q),g=ds(B)*s,i=os(B)*s,l=os(Q),c=l*U-i*I;return[ns(i*U+l*I,g*F+c*t),As(c*F-g*t)]},s}function ks(B,Q){(Q=Es(Q))[0]-=B,Hs(Q);var F=xs(-Q[1]);return((-Q[2]<0?-F:F)+gs-ts)%gs}function Ms(){var B,Q=[];return{point:function(Q,F,t){B.push([Q,F,t])},lineStart:function(){Q.push(B=[])},lineEnd:Ls,rejoin:function(){Q.length>1&&Q.push(Q.pop().concat(Q.shift()))},result:function(){var F=Q;return Q=[],B=null,F}}}function Ts(B,Q){return cs(B[0]-Q[0])<ts&&cs(B[1]-Q[1])<ts}function zs(B,Q,F,t){this.x=B,this.z=Q,this.o=F,this.e=t,this.v=!1,this.n=this.p=null}function Ks(B,Q,F,t,U){var I,s,g=[],i=[];if(B.forEach((function(B){if(!((Q=B.length-1)<=0)){var Q,F,t=B[0],s=B[Q];if(Ts(t,s)){if(!t[2]&&!s[2]){for(U.lineStart(),I=0;I<Q;++I)U.point((t=B[I])[0],t[1]);return void U.lineEnd()}s[0]+=2e-6}g.push(F=new zs(t,B,null,!0)),i.push(F.o=new zs(t,null,F,!1)),g.push(F=new zs(s,B,null,!1)),i.push(F.o=new zs(s,null,F,!0))}})),g.length){for(i.sort(Q),Os(g),Os(i),I=0,s=i.length;I<s;++I)i[I].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,U.lineStart();do{if(n.v=n.o.v=!0,n.e){if(d)for(I=0,s=l.length;I<s;++I)U.point((c=l[I])[0],c[1]);else t(n.x,n.n.x,1,U);n=n.n}else{if(d)for(l=n.p.z,I=l.length-1;I>=0;--I)U.point((c=l[I])[0],c[1]);else t(n.x,n.p.x,-1,U);n=n.p}l=(n=n.o).z,d=!d}while(!n.v);U.lineEnd()}}}function Os(B){if(Q=B.length){for(var Q,F,t=0,U=B[0];++t<Q;)U.n=F=B[t],F.p=U,U=F;U.n=F=B[0],F.p=U}}function Ps(B){return cs(B[0])<=Us?B[0]:Gs(B[0])*((cs(B[0])+Us)%gs-Us)}function js(B,Q,F,t){return function(U){var I,s,g,i=Q(U),l=Ms(),c=Q(l),e=!1,n={point:d,lineStart:a,lineEnd:b,polygonStart:function(){n.point=o,n.lineStart=G,n.lineEnd=u,s=[],I=[]},polygonEnd:function(){n.point=d,n.lineStart=a,n.lineEnd=b,s=sQ(s);var B=function(B,Q){var F=Ps(Q),t=Q[1],U=os(t),I=[os(F),-ds(F),0],s=0,g=0,i=new LB;1===U?t=Is+ts:-1===U&&(t=-Is-ts);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=Ps(d),a=d[1]/2+ss,b=os(a),o=ds(a),G=0;G<n;++G,C=r,b=A,o=L,d=u){var u=e[G],r=Ps(u),x=u[1]/2+ss,A=os(x),L=ds(x),h=r-C,y=h>=0?1:-1,R=y*h,V=R>Us,Z=b*A;if(i.add(ns(Z*y*os(R),o*L+Z*ds(R))),s+=V?h+y*gs:h,V^C>=F^r>=F){var S=Xs(Es(d),Es(u));Hs(S);var m=Xs(I,S);Hs(m);var E=(V^h>=0?-1:1)*As(m[2]);(t>E||t===E&&(S[0]||S[1]))&&(g+=V^h>=0?1:-1)}}return(s<-1e-6||s<ts&&i<-1e-12)^1&g}(I,t);s.length?(e||(U.polygonStart(),e=!0),Ks(s,$s,B,F,U)):B&&(e||(U.polygonStart(),e=!0),U.lineStart(),F(null,null,1,U),U.lineEnd()),e&&(U.polygonEnd(),e=!1),s=I=null},sphere:function(){U.polygonStart(),U.lineStart(),F(null,null,1,U),U.lineEnd(),U.polygonEnd()}};function d(Q,F){B(Q,F)&&U.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,t,i=c.clean(),n=l.result(),d=n.length;if(g.pop(),I.push(g),g=null,d)if(1&i){if((Q=(F=n[0]).length-1)>0){for(e||(U.polygonStart(),e=!0),U.lineStart(),B=0;B<Q;++B)U.point((t=F[B])[0],t[1]);U.lineEnd()}}else d>1&&2&i&&n.push(n.pop().concat(n.shift())),s.push(n.filter(_s))}return n}}function _s(B){return B.length>1}function $s(B,Q){return((B=B.x)[0]<0?B[1]-Is-ts:Is-B[1])-((Q=Q.x)[0]<0?Q[1]-Is-ts:Is-Q[1])}Ys.invert=Ys;var qs=js((function(){return!0}),(function(B){var Q,F=NaN,t=NaN,U=NaN;return{lineStart:function(){B.lineStart(),Q=1},point:function(I,s){var g=I>0?Us:-Us,i=cs(I-F);cs(i-Us)<ts?(B.point(F,t=(t+s)/2>0?Is:-Is),B.point(U,t),B.lineEnd(),B.lineStart(),B.point(g,t),B.point(I,t),Q=0):U!==g&&i>=Us&&(cs(F-U)<ts&&(F-=U*ts),cs(I-g)<ts&&(I-=g*ts),t=function(B,Q,F,t){var U,I,s=os(B-F);return cs(s)>ts?es((os(Q)*(I=ds(t))*os(F)-os(t)*(U=ds(Q))*os(B))/(U*I*s)):(Q+t)/2}(F,t,I,s),B.point(U,t),B.lineEnd(),B.lineStart(),B.point(g,t),Q=0),B.point(F=I,t=s),U=g},lineEnd:function(){B.lineEnd(),F=t=NaN},clean:function(){return 2-Q}}}),(function(B,Q,F,t){var U;if(null==B)U=F*Is,t.point(-Us,U),t.point(0,U),t.point(Us,U),t.point(Us,0),t.point(Us,-U),t.point(0,-U),t.point(-Us,-U),t.point(-Us,0),t.point(-Us,U);else if(cs(B[0]-Q[0])>ts){var I=B[0]<Q[0]?Us:-Us;U=F*I/2,t.point(-I,U),t.point(0,U),t.point(I,U)}else t.point(Q[0],Q[1])}),[-Us,-Is]);function Bg(B){var Q=ds(B),F=2*ls,t=Q>0,U=cs(Q)>ts;function I(B,F){return ds(B)*ds(F)>Q}function s(B,F,t){var U=[1,0,0],I=Xs(Es(B),Es(F)),s=Ns(I,I),g=I[0],i=s-g*g;if(!i)return!t&&B;var l=Q*s/i,c=-Q*g/i,e=Xs(U,I),n=Ws(U,l);ps(n,Ws(I,c));var d=e,C=Ns(n,d),a=Ns(d,d),b=C*C-a*(Ns(n,n)-1);if(!(b<0)){var o=us(b),G=Ws(d,(-C-o)/a);if(ps(G,n),G=ms(G),!t)return G;var u,r=B[0],x=F[0],A=B[1],L=F[1];x<r&&(u=r,r=x,x=u);var h=x-r,y=cs(h-Us)<ts;if(!y&&L<A&&(u=A,A=L,L=u),y||h<ts?y?A+L>0^G[1]<(cs(G[0]-r)<ts?A:L):A<=G[1]&&G[1]<=L:h>Us^(r<=G[0]&&G[0]<=x)){var R=Ws(d,(-C+o)/a);return ps(R,n),[G,ms(R)]}}}function g(Q,F){var U=t?B:Us-B,I=0;return Q<-U?I|=1:Q>U&&(I|=2),F<-U?I|=4:F>U&&(I|=8),I}return js(I,(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=I(e,n),b=t?a?0:g(e,n):a?g(e+(e<0?Us:-Us),n):0;if(!Q&&(l=i=a)&&B.lineStart(),a!==i&&(!(d=s(Q,C))||Ts(Q,d)||Ts(C,d))&&(C[2]=1),a!==i)c=0,a?(B.lineStart(),d=s(C,Q),B.point(d[0],d[1])):(d=s(Q,C),B.point(d[0],d[1],2),B.lineEnd()),Q=d;else if(U&&Q&&t^a){var o;b&F||!(o=s(C,Q,!0))||(c=0,t?(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&&Ts(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,t,U,I){!function(B,Q,F,t,U,I){if(F){var s=ds(Q),g=os(Q),i=t*F;null==U?(U=Q+t*gs,I=Q-i/2):(U=ks(s,U),I=ks(s,I),(t>0?U<I:U>I)&&(U+=t*gs));for(var l,c=U;t>0?c>I:c<I;c-=i)l=ms([s,-g*ds(c),-g*os(c)]),B.point(l[0],l[1])}}(I,B,F,U,Q,t)}),t?[0,-B]:[-Us,B-Us])}var Qg=1e9,Fg=-1e9;function tg(B,Q,F,t){function U(U,I){return B<=U&&U<=F&&Q<=I&&I<=t}function I(U,I,g,l){var c=0,e=0;if(null==U||(c=s(U,g))!==(e=s(I,g))||i(U,I)<0^g>0)do{l.point(0===c||3===c?B:F,c>1?t:Q)}while((c=(c+g+4)%4)!==e);else l.point(I[0],I[1])}function s(t,U){return cs(t[0]-B)<ts?U>0?0:3:cs(t[0]-F)<ts?U>0?2:1:cs(t[1]-Q)<ts?U>0?1:0:U>0?3:2}function g(B,Q){return i(B.x,Q.x)}function i(B,Q){var F=s(B,1),t=s(Q,1);return F!==t?F-t:0===F?Q[1]-B[1]:1===F?B[0]-Q[0]:2===F?B[1]-Q[1]:Q[0]-B[0]}return function(s){var i,l,c,e,n,d,C,a,b,o,G,u=s,r=Ms(),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&&u.lineEnd()},polygonStart:function(){u=r,i=[],l=[],G=!0},polygonEnd:function(){var Q=function(){for(var Q=0,F=0,U=l.length;F<U;++F)for(var I,s,g=l[F],i=1,c=g.length,e=g[0],n=e[0],d=e[1];i<c;++i)I=n,s=d,n=(e=g[i])[0],d=e[1],s<=t?d>t&&(n-I)*(t-s)>(d-s)*(B-I)&&++Q:d<=t&&(n-I)*(t-s)<(d-s)*(B-I)&&--Q;return Q}(),F=G&&Q,U=(i=sQ(i)).length;(F||U)&&(s.polygonStart(),F&&(s.lineStart(),I(null,null,1,s),s.lineEnd()),U&&Ks(i,g,Q,I,s),s.polygonEnd());u=s,i=l=c=null}};function A(B,Q){U(B,Q)&&u.point(B,Q)}function L(I,s){var g=U(I,s);if(l&&c.push([I,s]),o)e=I,n=s,d=g,o=!1,g&&(u.lineStart(),u.point(I,s));else if(g&&b)u.point(I,s);else{var i=[C=Math.max(Fg,Math.min(Qg,C)),a=Math.max(Fg,Math.min(Qg,a))],r=[I=Math.max(Fg,Math.min(Qg,I)),s=Math.max(Fg,Math.min(Qg,s))];!function(B,Q,F,t,U,I){var s,g=B[0],i=B[1],l=0,c=1,e=Q[0]-g,n=Q[1]-i;if(s=F-g,e||!(s>0)){if(s/=e,e<0){if(s<l)return;s<c&&(c=s)}else if(e>0){if(s>c)return;s>l&&(l=s)}if(s=U-g,e||!(s<0)){if(s/=e,e<0){if(s>c)return;s>l&&(l=s)}else if(e>0){if(s<l)return;s<c&&(c=s)}if(s=t-i,n||!(s>0)){if(s/=n,n<0){if(s<l)return;s<c&&(c=s)}else if(n>0){if(s>c)return;s>l&&(l=s)}if(s=I-i,n||!(s<0)){if(s/=n,n<0){if(s>c)return;s>l&&(l=s)}else if(n>0){if(s<l)return;s<c&&(c=s)}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,t)?g&&(u.lineStart(),u.point(I,s),G=!1):(b||(u.lineStart(),u.point(i[0],i[1])),u.point(r[0],r[1]),g||u.lineEnd(),G=!1)}C=I,a=s,b=g}return x}}var Ug,Ig,sg,gg,ig=B=>B,lg=new LB,cg=new LB,eg={point:Ls,lineStart:Ls,lineEnd:Ls,polygonStart:function(){eg.lineStart=ng,eg.lineEnd=ag},polygonEnd:function(){eg.lineStart=eg.lineEnd=eg.point=Ls,lg.add(cs(cg)),cg=new LB},result:function(){var B=lg/2;return lg=new LB,B}};function ng(){eg.point=dg}function dg(B,Q){eg.point=Cg,Ug=sg=B,Ig=gg=Q}function Cg(B,Q){cg.add(gg*B-sg*Q),sg=B,gg=Q}function ag(){Cg(Ug,Ig)}var bg=1/0,og=bg,Gg=-bg,ug=Gg,rg={point:function(B,Q){B<bg&&(bg=B);B>Gg&&(Gg=B);Q<og&&(og=Q);Q>ug&&(ug=Q)},lineStart:Ls,lineEnd:Ls,polygonStart:Ls,polygonEnd:Ls,result:function(){var B=[[bg,og],[Gg,ug]];return Gg=ug=-(og=bg=1/0),B}};var xg,Ag,Lg,hg,yg=0,Rg=0,Vg=0,Zg=0,Sg=0,mg=0,Eg=0,Ng=0,Xg=0,pg={point:Wg,lineStart:Hg,lineEnd:fg,polygonStart:function(){pg.lineStart=wg,pg.lineEnd=vg},polygonEnd:function(){pg.point=Wg,pg.lineStart=Hg,pg.lineEnd=fg},result:function(){var B=Xg?[Eg/Xg,Ng/Xg]:mg?[Zg/mg,Sg/mg]:Vg?[yg/Vg,Rg/Vg]:[NaN,NaN];return yg=Rg=Vg=Zg=Sg=mg=Eg=Ng=Xg=0,B}};function Wg(B,Q){yg+=B,Rg+=Q,++Vg}function Hg(){pg.point=Dg}function Dg(B,Q){pg.point=Yg,Wg(Lg=B,hg=Q)}function Yg(B,Q){var F=B-Lg,t=Q-hg,U=us(F*F+t*t);Zg+=U*(Lg+B)/2,Sg+=U*(hg+Q)/2,mg+=U,Wg(Lg=B,hg=Q)}function fg(){pg.point=Wg}function wg(){pg.point=Jg}function vg(){kg(xg,Ag)}function Jg(B,Q){pg.point=kg,Wg(xg=Lg=B,Ag=hg=Q)}function kg(B,Q){var F=B-Lg,t=Q-hg,U=us(F*F+t*t);Zg+=U*(Lg+B)/2,Sg+=U*(hg+Q)/2,mg+=U,Eg+=(U=hg*B-Lg*Q)*(Lg+B),Ng+=U*(hg+Q),Xg+=3*U,Wg(Lg=B,hg=Q)}function Mg(B){this._context=B}Mg.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,gs)}},result:Ls};var Tg,zg,Kg,Og,Pg,jg=new LB,_g={point:Ls,lineStart:function(){_g.point=$g},lineEnd:function(){Tg&&qg(zg,Kg),_g.point=Ls},polygonStart:function(){Tg=!0},polygonEnd:function(){Tg=null},result:function(){var B=+jg;return jg=new LB,B}};function $g(B,Q){_g.point=qg,zg=Og=B,Kg=Pg=Q}function qg(B,Q){Og-=B,Pg-=Q,jg.add(us(Og*Og+Pg*Pg)),Og=B,Pg=Q}let Bi,Qi,Fi,ti;class Ui{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!==Bi){const B=10**Q;Bi=Q,Qi=function(Q){let F=1;this._+=Q[0];for(const t=Q.length;F<t;++F)this._+=Math.round(arguments[F]*B)/B+Q[F]}}return Qi}(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!==Fi||this._append!==Qi){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`,Fi=B,Qi=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 si(B,Q){let F,t,U=3,I=4.5;function s(B){return B&&("function"==typeof I&&t.pointRadius(+I.apply(this,arguments)),Ss(B,F(t))),t.result()}return s.area=function(B){return Ss(B,F(eg)),eg.result()},s.measure=function(B){return Ss(B,F(_g)),_g.result()},s.bounds=function(B){return Ss(B,F(rg)),rg.result()},s.centroid=function(B){return Ss(B,F(pg)),pg.result()},s.projection=function(Q){return arguments.length?(F=null==Q?(B=null,ig):(B=Q).stream,s):B},s.context=function(B){return arguments.length?(t=null==B?(Q=null,new Ui(U)):new Mg(Q=B),"function"!=typeof I&&t.pointRadius(I),s):Q},s.pointRadius=function(B){return arguments.length?(I="function"==typeof B?B:(t.pointRadius(+B),+B),s):I},s.digits=function(B){if(!arguments.length)return U;if(null==B)U=null;else{const Q=Math.floor(B);if(!(Q>=0))throw new RangeError(`invalid digits: ${B}`);U=Q}return null===Q&&(t=new Ui(U)),s},s.projection(B).digits(U).context(Q)}function gi(B){return{stream:ii(B)}}function ii(B){return function(Q){var F=new li;for(var t in B)F[t]=B[t];return F.stream=Q,F}}function li(){}function ci(B,Q,F){var t=B.clipExtent&&B.clipExtent();return B.scale(150).translate([0,0]),null!=t&&B.clipExtent(null),Ss(F,B.stream(rg)),Q(rg.result()),null!=t&&B.clipExtent(t),B}function ei(B,Q,F){return ci(B,(function(F){var t=Q[1][0]-Q[0][0],U=Q[1][1]-Q[0][1],I=Math.min(t/(F[1][0]-F[0][0]),U/(F[1][1]-F[0][1])),s=+Q[0][0]+(t-I*(F[1][0]+F[0][0]))/2,g=+Q[0][1]+(U-I*(F[1][1]+F[0][1]))/2;B.scale(150*I).translate([s,g])}),F)}function ni(B,Q,F){return ei(B,[[0,0],Q],F)}function di(B,Q,F){return ci(B,(function(F){var t=+Q,U=t/(F[1][0]-F[0][0]),I=(t-U*(F[1][0]+F[0][0]))/2,s=-U*F[0][1];B.scale(150*U).translate([I,s])}),F)}function Ci(B,Q,F){return ci(B,(function(F){var t=+Q,U=t/(F[1][1]-F[0][1]),I=-U*F[0][0],s=(t-U*(F[1][1]+F[0][1]))/2;B.scale(150*U).translate([I,s])}),F)}li.prototype={constructor:li,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 ai=ds(30*ls);function bi(B,Q){return+Q?function(B,Q){function F(t,U,I,s,g,i,l,c,e,n,d,C,a,b){var o=l-t,G=c-U,u=o*o+G*G;if(u>4*Q&&a--){var r=s+n,x=g+d,A=i+C,L=us(r*r+x*x+A*A),h=As(A/=L),y=cs(cs(A)-1)<ts||cs(I-e)<ts?(I+e)/2:ns(x,r),R=B(y,h),V=R[0],Z=R[1],S=V-t,m=Z-U,E=G*S-o*m;(E*E/u>Q||cs((o*S+G*m)/u-.5)>.3||s*n+g*d+i*C<ai)&&(F(t,U,I,s,g,i,V,Z,y,r/=L,x/=L,A,a,b),b.point(V,Z),F(V,Z,y,r,x,A,l,c,e,n,d,C,a,b))}}return function(Q){var t,U,I,s,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,t){F=B(F,t),Q.point(F[0],F[1])}function o(){c=NaN,a.point=G,Q.lineStart()}function G(t,U){var I=Es([t,U]),s=B(t,U);F(c,e,l,n,d,C,c=s[0],e=s[1],l=t,n=I[0],d=I[1],C=I[2],16,Q),Q.point(c,e)}function u(){a.point=b,Q.lineEnd()}function r(){o(),a.point=x,a.lineEnd=A}function x(B,Q){G(t=B,Q),U=c,I=e,s=n,g=d,i=C,a.point=G}function A(){F(c,e,l,n,d,C,U,I,t,s,g,i,16,Q),a.lineEnd=u,u()}return a}}(B,Q):function(B){return ii({point:function(Q,F){Q=B(Q,F),this.stream.point(Q[0],Q[1])}})}(B)}var oi=ii({point:function(B,Q){this.stream.point(B*ls,Q*ls)}});function Gi(B,Q,F,t,U,I){if(!I)return function(B,Q,F,t,U){function I(I,s){return[Q+B*(I*=t),F-B*(s*=U)]}return I.invert=function(I,s){return[(I-Q)/B*t,(F-s)/B*U]},I}(B,Q,F,t,U);var s=ds(I),g=os(I),i=s*B,l=g*B,c=s/B,e=g/B,n=(g*F-s*Q)/B,d=(g*Q+s*F)/B;function C(B,I){return[i*(B*=t)-l*(I*=U)+Q,F-l*B-i*I]}return C.invert=function(B,Q){return[t*(c*B-e*Q+n),U*(d-e*B-c*Q)]},C}function ui(B){return ri((function(){return B}))()}function ri(B){var Q,F,t,U,I,s,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,A=null,L=qs,h=null,y=ig,R=.5;function V(B){return i(B[0]*ls,B[1]*ls)}function Z(B){return(B=i.invert(B[0],B[1]))&&[B[0]*is,B[1]*is]}function S(){var B=Gi(e,0,0,r,x,u).apply(null,Q(C,a)),t=Gi(e,n-B[0],d-B[1],r,x,u);return F=fs(b,o,G),g=Ds(Q,t),i=Ds(F,g),s=bi(g,R),m()}function m(){return l=c=null,V}return V.stream=function(B){return l&&c===B?l:l=oi(function(B){return ii({point:function(Q,F){var t=B(Q,F);return this.stream.point(t[0],t[1])}})}(F)(L(s(y(c=B)))))},V.preclip=function(B){return arguments.length?(L=B,A=void 0,m()):L},V.postclip=function(B){return arguments.length?(y=B,h=t=U=I=null,m()):y},V.clipAngle=function(B){return arguments.length?(L=+B?Bg(A=B*ls):(A=null,qs),m()):A*is},V.clipExtent=function(B){return arguments.length?(y=null==B?(h=t=U=I=null,ig):tg(h=+B[0][0],t=+B[0][1],U=+B[1][0],I=+B[1][1]),m()):null==h?null:[[h,t],[U,I]]},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*ls,a=B[1]%360*ls,S()):[C*is,a*is]},V.rotate=function(B){return arguments.length?(b=B[0]%360*ls,o=B[1]%360*ls,G=B.length>2?B[2]%360*ls:0,S()):[b*is,o*is,G*is]},V.angle=function(B){return arguments.length?(u=B%360*ls,S()):u*is},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?(s=bi(g,R=B*B),m()):us(R)},V.fitExtent=function(B,Q){return ei(V,B,Q)},V.fitSize=function(B,Q){return ni(V,B,Q)},V.fitWidth=function(B,Q){return di(V,B,Q)},V.fitHeight=function(B,Q){return Ci(V,B,Q)},function(){return Q=B.apply(this,arguments),V.invert=Q.invert&&Z,S()}}function xi(B){var Q=0,F=Us/3,t=ri(B),U=t(Q,F);return U.parallels=function(B){return arguments.length?t(Q=B[0]*ls,F=B[1]*ls):[Q*is,F*is]},U}function Ai(B,Q){var F=os(B),t=(F+os(Q))/2;if(cs(t)<ts)return function(B){var Q=ds(B);function F(B,F){return[B*Q,os(F)/Q]}return F.invert=function(B,F){return[B/Q,As(F*Q)]},F}(B);var U=1+F*(2*t-F),I=us(U)/t;function s(B,Q){var F=us(U-2*t*os(Q))/t;return[F*os(B*=t),I-F*ds(B)]}return s.invert=function(B,Q){var F=I-Q,s=ns(B,cs(F))*Gs(F);return F*t<0&&(s-=Us*Gs(B)*Gs(F)),[s/t,As((U-(B*B+F*F)*t*t)/(2*t))]},s}function Li(){return xi(Ai).scale(155.424).center([0,33.6442])}function hi(){return Li().parallels([29.5,45.5]).scale(1070).translate([480,250]).rotate([96,0]).center([-.6,38.7])}function yi(){var B,Q,F,t,U,I,s=hi(),g=Li().rotate([154,0]).center([-2,58.5]).parallels([55,65]),i=Li().rotate([157,0]).center([-3,19.9]).parallels([8,18]),l={point:function(B,Q){I=[B,Q]}};function c(B){var Q=B[0],s=B[1];return I=null,F.point(Q,s),I||(t.point(Q,s),I)||(U.point(Q,s),I)}function e(){return B=Q=null,c}return c.invert=function(B){var Q=s.scale(),F=s.translate(),t=(B[0]-F[0])/Q,U=(B[1]-F[1])/Q;return(U>=.12&&U<.234&&t>=-.425&&t<-.214?g:U>=.166&&U<.234&&t>=-.214&&t<-.115?i:s).invert(B)},c.stream=function(F){return B&&Q===F?B:B=function(B){var Q=B.length;return{point:function(F,t){for(var U=-1;++U<Q;)B[U].point(F,t)},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()}}}([s.stream(Q=F),g.stream(F),i.stream(F)])},c.precision=function(B){return arguments.length?(s.precision(B),g.precision(B),i.precision(B),e()):s.precision()},c.scale=function(B){return arguments.length?(s.scale(B),g.scale(.35*B),i.scale(B),c.translate(s.translate())):s.scale()},c.translate=function(B){if(!arguments.length)return s.translate();var Q=s.scale(),I=+B[0],c=+B[1];return F=s.translate(B).clipExtent([[I-.455*Q,c-.238*Q],[I+.455*Q,c+.238*Q]]).stream(l),t=g.translate([I-.307*Q,c+.201*Q]).clipExtent([[I-.425*Q+ts,c+.12*Q+ts],[I-.214*Q-ts,c+.234*Q-ts]]).stream(l),U=i.translate([I-.205*Q,c+.212*Q]).clipExtent([[I-.214*Q+ts,c+.166*Q+ts],[I-.115*Q-ts,c+.234*Q-ts]]).stream(l),e()},c.fitExtent=function(B,Q){return ei(c,B,Q)},c.fitSize=function(B,Q){return ni(c,B,Q)},c.fitWidth=function(B,Q){return di(c,B,Q)},c.fitHeight=function(B,Q){return Ci(c,B,Q)},c.scale(1070)}function Ri(B){return function(Q,F){var t=ds(Q),U=ds(F),I=B(t*U);return I===1/0?[2,0]:[I*U*os(Q),I*os(F)]}}function Vi(B){return function(Q,F){var t=us(Q*Q+F*F),U=B(t),I=os(U),s=ds(U);return[ns(Q*I,t*s),As(t&&F*I/t)]}}var Zi=Ri((function(B){return us(2/(1+B))}));function Si(){return ui(Zi).scale(124.75).clipAngle(179.999)}Zi.invert=Vi((function(B){return 2*As(B/2)}));var mi=Ri((function(B){return(B=xs(B))&&B/os(B)}));function Ei(){return ui(mi).scale(79.4188).clipAngle(179.999)}function Ni(B,Q){return[B,as(rs((Is+Q)/2))]}function Xi(){return pi(Ni).scale(961/gs)}function pi(B){var Q,F,t,U=ui(B),I=U.center,s=U.scale,g=U.translate,i=U.clipExtent,l=null;function c(){var I=Us*s(),g=U(function(B){function Q(Q){return(Q=B(Q[0]*ls,Q[1]*ls))[0]*=is,Q[1]*=is,Q}return B=fs(B[0]*ls,B[1]*ls,B.length>2?B[2]*ls:0),Q.invert=function(Q){return(Q=B.invert(Q[0]*ls,Q[1]*ls))[0]*=is,Q[1]*=is,Q},Q}(U.rotate()).invert([0,0]));return i(null==l?[[g[0]-I,g[1]-I],[g[0]+I,g[1]+I]]:B===Ni?[[Math.max(g[0]-I,l),Q],[Math.min(g[0]+I,F),t]]:[[l,Math.max(g[1]-I,Q)],[F,Math.min(g[1]+I,t)]])}return U.scale=function(B){return arguments.length?(s(B),c()):s()},U.translate=function(B){return arguments.length?(g(B),c()):g()},U.center=function(B){return arguments.length?(I(B),c()):I()},U.clipExtent=function(B){return arguments.length?(null==B?l=Q=F=t=null:(l=+B[0][0],Q=+B[0][1],F=+B[1][0],t=+B[1][1]),c()):null==l?null:[[l,Q],[F,t]]},c()}function Wi(B){return rs((Is+B)/2)}function Hi(B,Q){var F=ds(B),t=B===Q?os(B):as(F/ds(Q))/as(Wi(Q)/Wi(B)),U=F*bs(Wi(B),t)/t;if(!t)return Ni;function I(B,Q){U>0?Q<-Is+ts&&(Q=-Is+ts):Q>Is-ts&&(Q=Is-ts);var F=U/bs(Wi(Q),t);return[F*os(t*B),U-F*ds(t*B)]}return I.invert=function(B,Q){var F=U-Q,I=Gs(t)*us(B*B+F*F),s=ns(B,cs(F))*Gs(F);return F*t<0&&(s-=Us*Gs(B)*Gs(F)),[s/t,2*es(bs(U/I,1/t))-Is]},I}function Di(){return xi(Hi).scale(109.5).parallels([30,30])}function Yi(B,Q){return[B,Q]}function fi(){return ui(Yi).scale(152.63)}function wi(B,Q){var F=ds(B),t=B===Q?os(B):(F-ds(Q))/(Q-B),U=F/t+B;if(cs(t)<ts)return Yi;function I(B,Q){var F=U-Q,I=t*B;return[F*os(I),U-F*ds(I)]}return I.invert=function(B,Q){var F=U-Q,I=ns(B,cs(F))*Gs(F);return F*t<0&&(I-=Us*Gs(B)*Gs(F)),[I/t,U-Gs(t)*us(B*B+F*F)]},I}function vi(){return xi(wi).scale(131.154).center([0,13.9389])}mi.invert=Vi((function(B){return B})),Ni.invert=function(B,Q){return[B,2*es(Cs(Q))-Is]},Yi.invert=Yi;var Ji=1.340264,ki=-.081106,Mi=893e-6,Ti=.003796,zi=us(3)/2;function Ki(B,Q){var F=As(zi*os(Q)),t=F*F,U=t*t*t;return[B*ds(F)/(zi*(Ji+3*ki*t+U*(7*Mi+9*Ti*t))),F*(Ji+ki*t+U*(Mi+Ti*t))]}function Oi(){return ui(Ki).scale(177.158)}function Pi(B,Q){var F=ds(Q),t=ds(B)*F;return[F*os(B)/t,os(Q)/t]}function ji(){return ui(Pi).scale(144.049).clipAngle(60)}function _i(B,Q){return[ds(Q)*os(B),os(Q)]}function $i(){return ui(_i).scale(249.5).clipAngle(90.000001)}function qi(B,Q){var F=ds(Q),t=1+ds(B)*F;return[F*os(B)/t,os(Q)/t]}function Bl(){return ui(qi).scale(250).clipAngle(142)}function Ql(B,Q){return[as(rs((Is+Q)/2)),-B]}function Fl(){var B=pi(Ql),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 Ul(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}Ki.invert=function(B,Q){for(var F,t=Q,U=t*t,I=U*U*U,s=0;s<12&&(I=(U=(t-=F=(t*(Ji+ki*U+I*(Mi+Ti*U))-Q)/(Ji+3*ki*U+I*(7*Mi+9*Ti*U)))*t)*U*U,!(cs(F)<1e-12));++s);return[zi*B*(Ji+3*ki*U+I*(7*Mi+9*Ti*U))/ds(t),As(os(t)/zi)]},Pi.invert=Vi(es),_i.invert=Vi(As),qi.invert=Vi((function(B){return 2*es(B)})),Ql.invert=function(B,Q){return[-Q,2*es(Cs(B))-Is]};const Il=Symbol("implicit");function sl(){var B=new hB,Q=[],F=[],t=Il;function U(U){let I=B.get(U);if(void 0===I){if(t!==Il)return t;B.set(U,I=Q.push(U)-1)}return F[I%F.length]}return U.domain=function(F){if(!arguments.length)return Q.slice();Q=[],B=new hB;for(const t of F)B.has(t)||B.set(t,Q.push(t)-1);return U},U.range=function(B){return arguments.length?(F=Array.from(B),U):F.slice()},U.unknown=function(B){return arguments.length?(t=B,U):t},U.copy=function(){return sl(Q,F).unknown(t)},tl.apply(U,arguments),U}function gl(){var B,Q,F=sl().unknown(void 0),t=F.domain,U=F.range,I=0,s=1,g=!1,i=0,l=0,c=.5;function e(){var F=t().length,e=s<I,n=e?s:I,d=e?I:s;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=lQ(F).map((function(Q){return n+B*Q}));return U(e?C.reverse():C)}return delete F.unknown,F.domain=function(B){return arguments.length?(t(B),e()):t()},F.range=function(B){return arguments.length?([I,s]=B,I=+I,s=+s,e()):[I,s]},F.rangeRound=function(B){return[I,s]=B,I=+I,s=+s,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 gl(t(),[I,s]).round(g).paddingInner(i).paddingOuter(l).align(c)},tl.apply(e(),arguments)}function il(B){var Q=B.copy;return B.padding=B.paddingOuter,delete B.paddingInner,delete B.paddingOuter,B.copy=function(){return il(Q())},B}function ll(){return il(gl.apply(null,arguments).paddingInner(1))}function cl(B){return+B}var el=[0,1];function nl(B){return B}function dl(B,Q){return(Q-=B=+B)?function(F){return(F-B)/Q}:function(B){return function(){return B}}(isNaN(Q)?NaN:.5)}function Cl(B,Q,F){var t=B[0],U=B[1],I=Q[0],s=Q[1];return U<t?(t=dl(U,t),I=F(s,I)):(t=dl(t,U),I=F(I,s)),function(B){return I(t(B))}}function al(B,Q,F){var t=Math.min(B.length,Q.length)-1,U=new Array(t),I=new Array(t),s=-1;for(B[t]<B[0]&&(B=B.slice().reverse(),Q=Q.slice().reverse());++s<t;)U[s]=dl(B[s],B[s+1]),I[s]=F(Q[s],Q[s+1]);return function(Q){var F=CB(B,Q,1,t)-1;return I[F](U[F](Q))}}function bl(B,Q){return Q.domain(B.domain()).range(B.range()).interpolate(B.interpolate()).clamp(B.clamp()).unknown(B.unknown())}function ol(){var B,Q,F,t,U,I,s=el,g=el,i=hU,l=nl;function c(){var B=Math.min(s.length,g.length);return l!==nl&&(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))}}(s[0],s[B-1])),t=B>2?al:Cl,U=I=null,e}function e(Q){return null==Q||isNaN(Q=+Q)?F:(U||(U=t(s.map(B),g,i)))(B(l(Q)))}return e.invert=function(F){return l(Q((I||(I=t(g,s.map(B),uU)))(F)))},e.domain=function(B){return arguments.length?(s=Array.from(B,cl),c()):s.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=yU,c()},e.clamp=function(B){return arguments.length?(l=!!B||nl,c()):l!==nl},e.interpolate=function(B){return arguments.length?(i=B,c()):i},e.unknown=function(B){return arguments.length?(F=B,e):F},function(F,t){return B=F,Q=t,c()}}function Gl(){return ol()(nl,nl)}function ul(B,Q,F,t){var U,I=TB(B,Q,F);switch((t=zI(null==t?",f":t)).type){case"s":var s=Math.max(Math.abs(B),Math.abs(Q));return null!=t.precision||isNaN(U=function(B,Q){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(kI(Q)/3)))-kI(Math.abs(B)))}(I,s))||(t.precision=U),qI(t,s);case"":case"e":case"g":case"p":case"r":null!=t.precision||isNaN(U=function(B,Q){return B=Math.abs(B),Q=Math.abs(Q)-B,Math.max(0,kI(Q)-kI(B))+1}(I,Math.max(Math.abs(B),Math.abs(Q))))||(t.precision=U-("e"===t.type));break;case"f":case"%":null!=t.precision||isNaN(U=function(B){return Math.max(0,-kI(Math.abs(B)))}(I))||(t.precision=U-2*("%"===t.type))}return $I(t)}function rl(B){var Q=B.domain;return B.ticks=function(B){var F=Q();return kB(F[0],F[F.length-1],null==B?10:B)},B.tickFormat=function(B,F){var t=Q();return ul(t[0],t[t.length-1],null==B?10:B,F)},B.nice=function(F){null==F&&(F=10);var t,U,I=Q(),s=0,g=I.length-1,i=I[s],l=I[g],c=10;for(l<i&&(U=i,i=l,l=U,U=s,s=g,g=U);c-- >0;){if((U=MB(i,l,F))===t)return I[s]=i,I[g]=l,Q(I);if(U>0)i=Math.floor(i/U)*U,l=Math.ceil(l/U)*U;else{if(!(U<0))break;i=Math.ceil(i*U)/U,l=Math.floor(l*U)/U}t=U}return B},B}function xl(){var B=Gl();return B.copy=function(){return bl(B,xl())},tl.apply(B,arguments),rl(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,cl),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,cl):[0,1],rl(F)}function Ll(B,Q){var F,t=0,U=(B=B.slice()).length-1,I=B[t],s=B[U];return s<I&&(F=t,t=U,U=F,F=I,I=s,s=F),B[t]=Q.floor(I),B[U]=Q.ceil(s),B}function hl(B){return Math.log(B)}function yl(B){return Math.exp(B)}function Rl(B){return-Math.log(-B)}function Vl(B){return-Math.exp(-B)}function Zl(B){return isFinite(B)?+("1e"+B):B<0?0:B}function Sl(B){return(Q,F)=>-B(-Q,F)}function ml(B){const Q=B(hl,yl),F=Q.domain;let t,U,I=10;function s(){return t=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)}(I),U=function(B){return 10===B?Zl:B===Math.E?Math.exp:Q=>Math.pow(B,Q)}(I),F()[0]<0?(t=Sl(t),U=Sl(U),B(Rl,Vl)):B(hl,yl),Q}return Q.base=function(B){return arguments.length?(I=+B,s()):I},Q.domain=function(B){return arguments.length?(F(B),s()):F()},Q.ticks=B=>{const Q=F();let s=Q[0],g=Q[Q.length-1];const i=g<s;i&&([s,g]=[g,s]);let l,c,e=t(s),n=t(g);const d=null==B?10:+B;let C=[];if(!(I%1)&&n-e<d){if(e=Math.floor(e),n=Math.ceil(n),s>0){for(;e<=n;++e)for(l=1;l<I;++l)if(c=e<0?l/U(-e):l*U(e),!(c<s)){if(c>g)break;C.push(c)}}else for(;e<=n;++e)for(l=I-1;l>=1;--l)if(c=e>0?l/U(-e):l*U(e),!(c<s)){if(c>g)break;C.push(c)}2*C.length<d&&(C=kB(s,g,d))}else C=kB(e,n,Math.min(n-e,d)).map(U);return i?C.reverse():C},Q.tickFormat=(B,F)=>{if(null==B&&(B=10),null==F&&(F=10===I?"s":","),"function"!=typeof F&&(I%1||null!=(F=zI(F)).precision||(F.trim=!0),F=$I(F)),B===1/0)return F;const s=Math.max(1,I*B/Q.ticks().length);return B=>{let Q=B/U(Math.round(t(B)));return Q*I<I-.5&&(Q*=I),Q<=s?F(B):""}},Q.nice=()=>F(Ll(F(),{floor:B=>U(Math.floor(t(B))),ceil:B=>U(Math.ceil(t(B)))})),Q}function El(){const B=ml(ol()).domain([1,10]);return B.copy=()=>bl(B,El()).base(B.base()),tl.apply(B,arguments),B}function Nl(B){return function(Q){return Math.sign(Q)*Math.log1p(Math.abs(Q/B))}}function Xl(B){return function(Q){return Math.sign(Q)*Math.expm1(Math.abs(Q))*B}}function pl(B){var Q=1,F=B(Nl(Q),Xl(Q));return F.constant=function(F){return arguments.length?B(Nl(Q=+F),Xl(Q)):Q},rl(F)}function Wl(){var B=pl(ol());return B.copy=function(){return bl(B,Wl()).constant(B.constant())},tl.apply(B,arguments)}function Hl(B){return function(Q){return Q<0?-Math.pow(-Q,B):Math.pow(Q,B)}}function Dl(B){return B<0?-Math.sqrt(-B):Math.sqrt(B)}function Yl(B){return B<0?-B*B:B*B}function fl(B){var Q=B(nl,nl),F=1;return Q.exponent=function(Q){return arguments.length?1===(F=+Q)?B(nl,nl):.5===F?B(Dl,Yl):B(Hl(F),Hl(1/F)):F},rl(Q)}function wl(){var B=fl(ol());return B.copy=function(){return bl(B,wl()).exponent(B.exponent())},tl.apply(B,arguments),B}function vl(){var B,Q=[],F=[],t=[];function U(){var B=0,U=Math.max(1,F.length);for(t=new Array(U-1);++B<U;)t[B-1]=QQ(Q,B/U);return I}function I(Q){return null==Q||isNaN(Q=+Q)?B:F[CB(t,Q)]}return I.invertExtent=function(B){var U=F.indexOf(B);return U<0?[NaN,NaN]:[U>0?t[U-1]:Q[0],U<t.length?t[U]:Q[Q.length-1]]},I.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(lB),U()},I.range=function(B){return arguments.length?(F=Array.from(B),U()):F.slice()},I.unknown=function(Q){return arguments.length?(B=Q,I):B},I.quantiles=function(){return t.slice()},I.copy=function(){return vl().domain(Q).range(F).unknown(B)},tl.apply(I,arguments)}function Jl(){var B,Q=[.5],F=[0,1],t=1;function U(U){return null!=U&&U<=U?F[CB(Q,U,0,t)]:B}return U.domain=function(B){return arguments.length?(Q=Array.from(B),t=Math.min(Q.length,F.length-1),U):Q.slice()},U.range=function(B){return arguments.length?(F=Array.from(B),t=Math.min(Q.length,F.length-1),U):F.slice()},U.invertExtent=function(B){var t=F.indexOf(B);return[Q[t-1],Q[t]]},U.unknown=function(Q){return arguments.length?(B=Q,U):B},U.copy=function(){return Jl().domain(Q).range(F).unknown(B)},tl.apply(U,arguments)}const kl=new Date,Ml=new Date;function Tl(B,Q,F,t){function U(Q){return B(Q=0===arguments.length?new Date:new Date(+Q)),Q}return U.floor=Q=>(B(Q=new Date(+Q)),Q),U.ceil=F=>(B(F=new Date(F-1)),Q(F,1),B(F),F),U.round=B=>{const Q=U(B),F=U.ceil(B);return B-Q<F-B?Q:F},U.offset=(B,F)=>(Q(B=new Date(+B),null==F?1:Math.floor(F)),B),U.range=(F,t,I)=>{const s=[];if(F=U.ceil(F),I=null==I?1:Math.floor(I),!(F<t&&I>0))return s;let g;do{s.push(g=new Date(+F)),Q(F,I),B(F)}while(g<F&&F<t);return s},U.filter=F=>Tl((Q=>{if(Q>=Q)for(;B(Q),!F(Q);)Q.setTime(Q-1)}),((B,t)=>{if(B>=B)if(t<0)for(;++t<=0;)for(;Q(B,-1),!F(B););else for(;--t>=0;)for(;Q(B,1),!F(B););})),F&&(U.count=(Q,t)=>(kl.setTime(+Q),Ml.setTime(+t),B(kl),B(Ml),Math.floor(F(kl,Ml))),U.every=B=>(B=Math.floor(B),isFinite(B)&&B>0?B>1?U.filter(t?Q=>t(Q)%B==0:Q=>U.count(0,Q)%B==0):U:null)),U}const zl=Tl((()=>{}),((B,Q)=>{B.setTime(+B+Q)}),((B,Q)=>Q-B));zl.every=B=>(B=Math.floor(B),isFinite(B)&&B>0?B>1?Tl((Q=>{Q.setTime(Math.floor(Q/B)*B)}),((Q,F)=>{Q.setTime(+Q+F*B)}),((Q,F)=>(F-Q)/B)):zl:null),zl.range;const Kl=1e3,Ol=6e4,Pl=36e5,jl=864e5,_l=6048e5,$l=2592e6,ql=31536e6,Bc=Tl((B=>{B.setTime(B-B.getMilliseconds())}),((B,Q)=>{B.setTime(+B+Q*Kl)}),((B,Q)=>(Q-B)/Kl),(B=>B.getUTCSeconds()));Bc.range;const Qc=Tl((B=>{B.setTime(B-B.getMilliseconds()-B.getSeconds()*Kl)}),((B,Q)=>{B.setTime(+B+Q*Ol)}),((B,Q)=>(Q-B)/Ol),(B=>B.getMinutes()));Qc.range;const Fc=Tl((B=>{B.setUTCSeconds(0,0)}),((B,Q)=>{B.setTime(+B+Q*Ol)}),((B,Q)=>(Q-B)/Ol),(B=>B.getUTCMinutes()));Fc.range;const tc=Tl((B=>{B.setTime(B-B.getMilliseconds()-B.getSeconds()*Kl-B.getMinutes()*Ol)}),((B,Q)=>{B.setTime(+B+Q*Pl)}),((B,Q)=>(Q-B)/Pl),(B=>B.getHours()));tc.range;const Uc=Tl((B=>{B.setUTCMinutes(0,0,0)}),((B,Q)=>{B.setTime(+B+Q*Pl)}),((B,Q)=>(Q-B)/Pl),(B=>B.getUTCHours()));Uc.range;const Ic=Tl((B=>B.setHours(0,0,0,0)),((B,Q)=>B.setDate(B.getDate()+Q)),((B,Q)=>(Q-B-(Q.getTimezoneOffset()-B.getTimezoneOffset())*Ol)/jl),(B=>B.getDate()-1));Ic.range;const sc=Tl((B=>{B.setUTCHours(0,0,0,0)}),((B,Q)=>{B.setUTCDate(B.getUTCDate()+Q)}),((B,Q)=>(Q-B)/jl),(B=>B.getUTCDate()-1));sc.range;const gc=Tl((B=>{B.setUTCHours(0,0,0,0)}),((B,Q)=>{B.setUTCDate(B.getUTCDate()+Q)}),((B,Q)=>(Q-B)/jl),(B=>Math.floor(B/jl)));function ic(B){return Tl((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())*Ol)/_l))}gc.range;const lc=ic(0),cc=ic(1),ec=ic(2),nc=ic(3),dc=ic(4),Cc=ic(5),ac=ic(6);function bc(B){return Tl((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))}lc.range,cc.range,ec.range,nc.range,dc.range,Cc.range,ac.range;const oc=bc(0),Gc=bc(1),uc=bc(2),rc=bc(3),xc=bc(4),Ac=bc(5),Lc=bc(6);oc.range,Gc.range,uc.range,rc.range,xc.range,Ac.range,Lc.range;const hc=Tl((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()));hc.range;const yc=Tl((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 Rc=Tl((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()));Rc.every=B=>isFinite(B=Math.floor(B))&&B>0?Tl((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,Rc.range;const Vc=Tl((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 Zc(B,Q,F,t,U,I){const s=[[Bc,1,Kl],[Bc,5,5e3],[Bc,15,15e3],[Bc,30,3e4],[I,1,Ol],[I,5,3e5],[I,15,9e5],[I,30,18e5],[U,1,Pl],[U,3,108e5],[U,6,216e5],[U,12,432e5],[t,1,jl],[t,2,1728e5],[F,1,_l],[Q,1,$l],[Q,3,7776e6],[B,1,ql]];function g(Q,F,t){const U=Math.abs(F-Q)/t,I=eB((([,,B])=>B)).right(s,U);if(I===s.length)return B.every(TB(Q/ql,F/ql,t));if(0===I)return zl.every(Math.max(TB(Q,F,t),1));const[g,i]=s[U/s[I-1][2]<s[I][2]/U?I-1:I];return g.every(i)}return[function(B,Q,F){const t=Q<B;t&&([B,Q]=[Q,B]);const U=F&&"function"==typeof F.range?F:g(B,Q,F),I=U?U.range(B,+Q+1):[];return t?I.reverse():I},g]}Vc.every=B=>isFinite(B=Math.floor(B))&&B>0?Tl((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,Vc.range;const[Sc,mc]=Zc(Vc,yc,oc,gc,Uc,Fc),[Ec,Nc]=Zc(Rc,hc,lc,Ic,tc,Qc);function Xc(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 pc(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 Wc(B,Q,F){return{y:B,m:Q,d:F,H:0,M:0,S:0,L:0}}var Hc,Dc,Yc,fc={"-":"",_:" ",0:"0"},wc=/^\s*\d+/,vc=/^%/,Jc=/[\\^$*+?|[\]().{}]/g;function kc(B,Q,F){var t=B<0?"-":"",U=(t?-B:B)+"",I=U.length;return t+(I<F?new Array(F-I+1).join(Q)+U:U)}function Mc(B){return B.replace(Jc,"\\$&")}function Tc(B){return new RegExp("^(?:"+B.map(Mc).join("|")+")","i")}function zc(B){return new Map(B.map(((B,Q)=>[B.toLowerCase(),Q])))}function Kc(B,Q,F){var t=wc.exec(Q.slice(F,F+1));return t?(B.w=+t[0],F+t[0].length):-1}function Oc(B,Q,F){var t=wc.exec(Q.slice(F,F+1));return t?(B.u=+t[0],F+t[0].length):-1}function Pc(B,Q,F){var t=wc.exec(Q.slice(F,F+2));return t?(B.U=+t[0],F+t[0].length):-1}function jc(B,Q,F){var t=wc.exec(Q.slice(F,F+2));return t?(B.V=+t[0],F+t[0].length):-1}function _c(B,Q,F){var t=wc.exec(Q.slice(F,F+2));return t?(B.W=+t[0],F+t[0].length):-1}function $c(B,Q,F){var t=wc.exec(Q.slice(F,F+4));return t?(B.y=+t[0],F+t[0].length):-1}function qc(B,Q,F){var t=wc.exec(Q.slice(F,F+2));return t?(B.y=+t[0]+(+t[0]>68?1900:2e3),F+t[0].length):-1}function Be(B,Q,F){var t=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(Q.slice(F,F+6));return t?(B.Z=t[1]?0:-(t[2]+(t[3]||"00")),F+t[0].length):-1}function Qe(B,Q,F){var t=wc.exec(Q.slice(F,F+1));return t?(B.q=3*t[0]-3,F+t[0].length):-1}function Fe(B,Q,F){var t=wc.exec(Q.slice(F,F+2));return t?(B.m=t[0]-1,F+t[0].length):-1}function te(B,Q,F){var t=wc.exec(Q.slice(F,F+2));return t?(B.d=+t[0],F+t[0].length):-1}function Ue(B,Q,F){var t=wc.exec(Q.slice(F,F+3));return t?(B.m=0,B.d=+t[0],F+t[0].length):-1}function Ie(B,Q,F){var t=wc.exec(Q.slice(F,F+2));return t?(B.H=+t[0],F+t[0].length):-1}function se(B,Q,F){var t=wc.exec(Q.slice(F,F+2));return t?(B.M=+t[0],F+t[0].length):-1}function ge(B,Q,F){var t=wc.exec(Q.slice(F,F+2));return t?(B.S=+t[0],F+t[0].length):-1}function ie(B,Q,F){var t=wc.exec(Q.slice(F,F+3));return t?(B.L=+t[0],F+t[0].length):-1}function le(B,Q,F){var t=wc.exec(Q.slice(F,F+6));return t?(B.L=Math.floor(t[0]/1e3),F+t[0].length):-1}function ce(B,Q,F){var t=vc.exec(Q.slice(F,F+1));return t?F+t[0].length:-1}function ee(B,Q,F){var t=wc.exec(Q.slice(F));return t?(B.Q=+t[0],F+t[0].length):-1}function ne(B,Q,F){var t=wc.exec(Q.slice(F));return t?(B.s=+t[0],F+t[0].length):-1}function de(B,Q){return kc(B.getDate(),Q,2)}function Ce(B,Q){return kc(B.getHours(),Q,2)}function ae(B,Q){return kc(B.getHours()%12||12,Q,2)}function be(B,Q){return kc(1+Ic.count(Rc(B),B),Q,3)}function oe(B,Q){return kc(B.getMilliseconds(),Q,3)}function Ge(B,Q){return oe(B,Q)+"000"}function ue(B,Q){return kc(B.getMonth()+1,Q,2)}function re(B,Q){return kc(B.getMinutes(),Q,2)}function xe(B,Q){return kc(B.getSeconds(),Q,2)}function Ae(B){var Q=B.getDay();return 0===Q?7:Q}function Le(B,Q){return kc(lc.count(Rc(B)-1,B),Q,2)}function he(B){var Q=B.getDay();return Q>=4||0===Q?dc(B):dc.ceil(B)}function ye(B,Q){return B=he(B),kc(dc.count(Rc(B),B)+(4===Rc(B).getDay()),Q,2)}function Re(B){return B.getDay()}function Ve(B,Q){return kc(cc.count(Rc(B)-1,B),Q,2)}function Ze(B,Q){return kc(B.getFullYear()%100,Q,2)}function Se(B,Q){return kc((B=he(B)).getFullYear()%100,Q,2)}function me(B,Q){return kc(B.getFullYear()%1e4,Q,4)}function Ee(B,Q){var F=B.getDay();return kc((B=F>=4||0===F?dc(B):dc.ceil(B)).getFullYear()%1e4,Q,4)}function Ne(B){var Q=B.getTimezoneOffset();return(Q>0?"-":(Q*=-1,"+"))+kc(Q/60|0,"0",2)+kc(Q%60,"0",2)}function Xe(B,Q){return kc(B.getUTCDate(),Q,2)}function pe(B,Q){return kc(B.getUTCHours(),Q,2)}function We(B,Q){return kc(B.getUTCHours()%12||12,Q,2)}function He(B,Q){return kc(1+sc.count(Vc(B),B),Q,3)}function De(B,Q){return kc(B.getUTCMilliseconds(),Q,3)}function Ye(B,Q){return De(B,Q)+"000"}function fe(B,Q){return kc(B.getUTCMonth()+1,Q,2)}function we(B,Q){return kc(B.getUTCMinutes(),Q,2)}function ve(B,Q){return kc(B.getUTCSeconds(),Q,2)}function Je(B){var Q=B.getUTCDay();return 0===Q?7:Q}function ke(B,Q){return kc(oc.count(Vc(B)-1,B),Q,2)}function Me(B){var Q=B.getUTCDay();return Q>=4||0===Q?xc(B):xc.ceil(B)}function Te(B,Q){return B=Me(B),kc(xc.count(Vc(B),B)+(4===Vc(B).getUTCDay()),Q,2)}function ze(B){return B.getUTCDay()}function Ke(B,Q){return kc(Gc.count(Vc(B)-1,B),Q,2)}function Oe(B,Q){return kc(B.getUTCFullYear()%100,Q,2)}function Pe(B,Q){return kc((B=Me(B)).getUTCFullYear()%100,Q,2)}function je(B,Q){return kc(B.getUTCFullYear()%1e4,Q,4)}function _e(B,Q){var F=B.getUTCDay();return kc((B=F>=4||0===F?xc(B):xc.ceil(B)).getUTCFullYear()%1e4,Q,4)}function $e(){return"+0000"}function qe(){return"%"}function Bn(B){return+B}function Qn(B){return Math.floor(+B/1e3)}function Fn(B){return new Date(B)}function tn(B){return B instanceof Date?+B:+new Date(+B)}function Un(B,Q,F,t,U,I,s,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"),G=l("%b %d"),u=l("%B"),r=l("%Y");function x(B){return(i(B)<B?d:g(B)<B?C:s(B)<B?a:I(B)<B?b:t(B)<B?U(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(Fn)},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(Ll(F,B)):c},c.copy=function(){return bl(c,Un(B,Q,F,t,U,I,s,g,i,l))},c}function In(B,Q){return Q.domain(B.domain()).interpolator(B.interpolator()).clamp(B.clamp()).unknown(B.unknown())}function sn(){var B,Q,F,t,U,I,s,g=0,i=.5,l=1,c=1,e=nl,n=!1;function d(B){return isNaN(B=+B)?s:(B=.5+((B=+I(B))-Q)*(c*B<c*Q?t:U),e(n?Math.max(0,Math.min(1,B)):B))}function C(B){return function(Q){var F,t,U;return arguments.length?([F,t,U]=Q,e=DU(B,[F,t,U]),d):[e(0),e(.5),e(1)]}}return d.domain=function(s){return arguments.length?([g,i,l]=s,B=I(g=+g),Q=I(i=+i),F=I(l=+l),t=B===Q?0:.5/(Q-B),U=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(hU),d.rangeRound=C(yU),d.unknown=function(B){return arguments.length?(s=B,d):s},function(s){return I=s,B=s(g),Q=s(i),F=s(l),t=B===Q?0:.5/(Q-B),U=Q===F?0:.5/(F-Q),c=Q<B?-1:1,d}}function gn(){var B=rl(sn()(nl));return B.copy=function(){return In(B,gn())},Ul.apply(B,arguments)}function ln(){var B=ml(sn()).domain([.1,1,10]);return B.copy=function(){return In(B,ln()).base(B.base())},Ul.apply(B,arguments)}function cn(){var B=pl(sn());return B.copy=function(){return In(B,cn()).constant(B.constant())},Ul.apply(B,arguments)}function en(){var B=fl(sn());return B.copy=function(){return In(B,en()).exponent(B.exponent())},Ul.apply(B,arguments)}function nn(B){for(var Q=B.length/6|0,F=new Array(Q),t=0;t<Q;)F[t]="#"+B.slice(6*t,6*++t);return F}!function(B){Hc=function(B){var Q=B.dateTime,F=B.date,t=B.time,U=B.periods,I=B.days,s=B.shortDays,g=B.months,i=B.shortMonths,l=Tc(U),c=zc(U),e=Tc(I),n=zc(I),d=Tc(s),C=zc(s),a=Tc(g),b=zc(g),o=Tc(i),G=zc(i),u={a:function(B){return s[B.getDay()]},A:function(B){return I[B.getDay()]},b:function(B){return i[B.getMonth()]},B:function(B){return g[B.getMonth()]},c:null,d:de,e:de,f:Ge,g:Se,G:Ee,H:Ce,I:ae,j:be,L:oe,m:ue,M:re,p:function(B){return U[+(B.getHours()>=12)]},q:function(B){return 1+~~(B.getMonth()/3)},Q:Bn,s:Qn,S:xe,u:Ae,U:Le,V:ye,w:Re,W:Ve,x:null,X:null,y:Ze,Y:me,Z:Ne,"%":qe},r={a:function(B){return s[B.getUTCDay()]},A:function(B){return I[B.getUTCDay()]},b:function(B){return i[B.getUTCMonth()]},B:function(B){return g[B.getUTCMonth()]},c:null,d:Xe,e:Xe,f:Ye,g:Pe,G:_e,H:pe,I:We,j:He,L:De,m:fe,M:we,p:function(B){return U[+(B.getUTCHours()>=12)]},q:function(B){return 1+~~(B.getUTCMonth()/3)},Q:Bn,s:Qn,S:ve,u:Je,U:ke,V:Te,w:ze,W:Ke,x:null,X:null,y:Oe,Y:je,Z:$e,"%":qe},x={a:function(B,Q,F){var t=d.exec(Q.slice(F));return t?(B.w=C.get(t[0].toLowerCase()),F+t[0].length):-1},A:function(B,Q,F){var t=e.exec(Q.slice(F));return t?(B.w=n.get(t[0].toLowerCase()),F+t[0].length):-1},b:function(B,Q,F){var t=o.exec(Q.slice(F));return t?(B.m=G.get(t[0].toLowerCase()),F+t[0].length):-1},B:function(B,Q,F){var t=a.exec(Q.slice(F));return t?(B.m=b.get(t[0].toLowerCase()),F+t[0].length):-1},c:function(B,F,t){return h(B,Q,F,t)},d:te,e:te,f:le,g:qc,G:$c,H:Ie,I:Ie,j:Ue,L:ie,m:Fe,M:se,p:function(B,Q,F){var t=l.exec(Q.slice(F));return t?(B.p=c.get(t[0].toLowerCase()),F+t[0].length):-1},q:Qe,Q:ee,s:ne,S:ge,u:Oc,U:Pc,V:jc,w:Kc,W:_c,x:function(B,Q,t){return h(B,F,Q,t)},X:function(B,Q,F){return h(B,t,Q,F)},y:qc,Y:$c,Z:Be,"%":ce};function A(B,Q){return function(F){var t,U,I,s=[],g=-1,i=0,l=B.length;for(F instanceof Date||(F=new Date(+F));++g<l;)37===B.charCodeAt(g)&&(s.push(B.slice(i,g)),null!=(U=fc[t=B.charAt(++g)])?t=B.charAt(++g):U="e"===t?" ":"0",(I=Q[t])&&(t=I(F,U)),s.push(t),i=g+1);return s.push(B.slice(i,g)),s.join("")}}function L(B,Q){return function(F){var t,U,I=Wc(1900,void 0,1);if(h(I,B,F+="",0)!=F.length)return null;if("Q"in I)return new Date(I.Q);if("s"in I)return new Date(1e3*I.s+("L"in I?I.L:0));if(Q&&!("Z"in I)&&(I.Z=0),"p"in I&&(I.H=I.H%12+12*I.p),void 0===I.m&&(I.m="q"in I?I.q:0),"V"in I){if(I.V<1||I.V>53)return null;"w"in I||(I.w=1),"Z"in I?(U=(t=pc(Wc(I.y,0,1))).getUTCDay(),t=U>4||0===U?Gc.ceil(t):Gc(t),t=sc.offset(t,7*(I.V-1)),I.y=t.getUTCFullYear(),I.m=t.getUTCMonth(),I.d=t.getUTCDate()+(I.w+6)%7):(U=(t=Xc(Wc(I.y,0,1))).getDay(),t=U>4||0===U?cc.ceil(t):cc(t),t=Ic.offset(t,7*(I.V-1)),I.y=t.getFullYear(),I.m=t.getMonth(),I.d=t.getDate()+(I.w+6)%7)}else("W"in I||"U"in I)&&("w"in I||(I.w="u"in I?I.u%7:"W"in I?1:0),U="Z"in I?pc(Wc(I.y,0,1)).getUTCDay():Xc(Wc(I.y,0,1)).getDay(),I.m=0,I.d="W"in I?(I.w+6)%7+7*I.W-(U+5)%7:I.w+7*I.U-(U+6)%7);return"Z"in I?(I.H+=I.Z/100|0,I.M+=I.Z%100,pc(I)):Xc(I)}}function h(B,Q,F,t){for(var U,I,s=0,g=Q.length,i=F.length;s<g;){if(t>=i)return-1;if(37===(U=Q.charCodeAt(s++))){if(U=Q.charAt(s++),!(I=x[U in fc?Q.charAt(s++):U])||(t=I(B,F,t))<0)return-1}else if(U!=F.charCodeAt(t++))return-1}return t}return u.x=A(F,u),u.X=A(t,u),u.c=A(Q,u),r.x=A(F,r),r.X=A(t,r),r.c=A(Q,r),{format:function(B){var Q=A(B+="",u);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),Dc=Hc.format,Hc.parse,Yc=Hc.utcFormat,Hc.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 dn=nn("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"),Cn=nn("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666"),an=nn("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666"),bn=nn("4269d0efb118ff725c6cc5b03ca951ff8ab7a463f297bbf59c6b4e9498a0"),on=nn("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928"),Gn=nn("fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2"),un=nn("b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc"),rn=nn("e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999"),xn=nn("66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3"),An=nn("8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f"),Ln=nn("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab"),hn=B=>aU(B[B.length-1]),yn=new Array(3).concat("d8b365f5f5f55ab4ac","a6611adfc27d80cdc1018571","a6611adfc27df5f5f580cdc1018571","8c510ad8b365f6e8c3c7eae55ab4ac01665e","8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e","8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e","8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e","5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30","5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30").map(nn),Rn=hn(yn),Vn=new Array(3).concat("af8dc3f7f7f77fbf7b","7b3294c2a5cfa6dba0008837","7b3294c2a5cff7f7f7a6dba0008837","762a83af8dc3e7d4e8d9f0d37fbf7b1b7837","762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837","762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837","762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837","40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b","40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b").map(nn),Zn=hn(Vn),Sn=new Array(3).concat("e9a3c9f7f7f7a1d76a","d01c8bf1b6dab8e1864dac26","d01c8bf1b6daf7f7f7b8e1864dac26","c51b7de9a3c9fde0efe6f5d0a1d76a4d9221","c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221","c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221","c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221","8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419","8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419").map(nn),mn=hn(Sn),En=new Array(3).concat("998ec3f7f7f7f1a340","5e3c99b2abd2fdb863e66101","5e3c99b2abd2f7f7f7fdb863e66101","542788998ec3d8daebfee0b6f1a340b35806","542788998ec3d8daebf7f7f7fee0b6f1a340b35806","5427888073acb2abd2d8daebfee0b6fdb863e08214b35806","5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806","2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08","2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08").map(nn),Nn=hn(En),Xn=new Array(3).concat("ef8a62f7f7f767a9cf","ca0020f4a58292c5de0571b0","ca0020f4a582f7f7f792c5de0571b0","b2182bef8a62fddbc7d1e5f067a9cf2166ac","b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac","b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac","b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac","67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061","67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061").map(nn),pn=hn(Xn),Wn=new Array(3).concat("ef8a62ffffff999999","ca0020f4a582bababa404040","ca0020f4a582ffffffbababa404040","b2182bef8a62fddbc7e0e0e09999994d4d4d","b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d","b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d","b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d","67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a","67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a").map(nn),Hn=hn(Wn),Dn=new Array(3).concat("fc8d59ffffbf91bfdb","d7191cfdae61abd9e92c7bb6","d7191cfdae61ffffbfabd9e92c7bb6","d73027fc8d59fee090e0f3f891bfdb4575b4","d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4","d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4","d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4","a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695","a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695").map(nn),Yn=hn(Dn),fn=new Array(3).concat("fc8d59ffffbf91cf60","d7191cfdae61a6d96a1a9641","d7191cfdae61ffffbfa6d96a1a9641","d73027fc8d59fee08bd9ef8b91cf601a9850","d73027fc8d59fee08bffffbfd9ef8b91cf601a9850","d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850","d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850","a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837","a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837").map(nn),wn=hn(fn),vn=new Array(3).concat("fc8d59ffffbf99d594","d7191cfdae61abdda42b83ba","d7191cfdae61ffffbfabdda42b83ba","d53e4ffc8d59fee08be6f59899d5943288bd","d53e4ffc8d59fee08bffffbfe6f59899d5943288bd","d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd","d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd","9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2","9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2").map(nn),Jn=hn(vn),kn=new Array(3).concat("e5f5f999d8c92ca25f","edf8fbb2e2e266c2a4238b45","edf8fbb2e2e266c2a42ca25f006d2c","edf8fbccece699d8c966c2a42ca25f006d2c","edf8fbccece699d8c966c2a441ae76238b45005824","f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824","f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b").map(nn),Mn=hn(kn),Tn=new Array(3).concat("e0ecf49ebcda8856a7","edf8fbb3cde38c96c688419d","edf8fbb3cde38c96c68856a7810f7c","edf8fbbfd3e69ebcda8c96c68856a7810f7c","edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b","f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b","f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b").map(nn),zn=hn(Tn),Kn=new Array(3).concat("e0f3dba8ddb543a2ca","f0f9e8bae4bc7bccc42b8cbe","f0f9e8bae4bc7bccc443a2ca0868ac","f0f9e8ccebc5a8ddb57bccc443a2ca0868ac","f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e","f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e","f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081").map(nn),On=hn(Kn),Pn=new Array(3).concat("fee8c8fdbb84e34a33","fef0d9fdcc8afc8d59d7301f","fef0d9fdcc8afc8d59e34a33b30000","fef0d9fdd49efdbb84fc8d59e34a33b30000","fef0d9fdd49efdbb84fc8d59ef6548d7301f990000","fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000","fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000").map(nn),jn=hn(Pn),_n=new Array(3).concat("ece2f0a6bddb1c9099","f6eff7bdc9e167a9cf02818a","f6eff7bdc9e167a9cf1c9099016c59","f6eff7d0d1e6a6bddb67a9cf1c9099016c59","f6eff7d0d1e6a6bddb67a9cf3690c002818a016450","fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450","fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636").map(nn),$n=hn(_n),qn=new Array(3).concat("ece7f2a6bddb2b8cbe","f1eef6bdc9e174a9cf0570b0","f1eef6bdc9e174a9cf2b8cbe045a8d","f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d","f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b","fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b","fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858").map(nn),Bd=hn(qn),Qd=new Array(3).concat("e7e1efc994c7dd1c77","f1eef6d7b5d8df65b0ce1256","f1eef6d7b5d8df65b0dd1c77980043","f1eef6d4b9dac994c7df65b0dd1c77980043","f1eef6d4b9dac994c7df65b0e7298ace125691003f","f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f","f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f").map(nn),Fd=hn(Qd),td=new Array(3).concat("fde0ddfa9fb5c51b8a","feebe2fbb4b9f768a1ae017e","feebe2fbb4b9f768a1c51b8a7a0177","feebe2fcc5c0fa9fb5f768a1c51b8a7a0177","feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177","fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177","fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a").map(nn),Ud=hn(td),Id=new Array(3).concat("edf8b17fcdbb2c7fb8","ffffcca1dab441b6c4225ea8","ffffcca1dab441b6c42c7fb8253494","ffffccc7e9b47fcdbb41b6c42c7fb8253494","ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84","ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84","ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58").map(nn),sd=hn(Id),gd=new Array(3).concat("f7fcb9addd8e31a354","ffffccc2e69978c679238443","ffffccc2e69978c67931a354006837","ffffccd9f0a3addd8e78c67931a354006837","ffffccd9f0a3addd8e78c67941ab5d238443005a32","ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32","ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529").map(nn),id=hn(gd),ld=new Array(3).concat("fff7bcfec44fd95f0e","ffffd4fed98efe9929cc4c02","ffffd4fed98efe9929d95f0e993404","ffffd4fee391fec44ffe9929d95f0e993404","ffffd4fee391fec44ffe9929ec7014cc4c028c2d04","ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04","ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506").map(nn),cd=hn(ld),ed=new Array(3).concat("ffeda0feb24cf03b20","ffffb2fecc5cfd8d3ce31a1c","ffffb2fecc5cfd8d3cf03b20bd0026","ffffb2fed976feb24cfd8d3cf03b20bd0026","ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026","ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026","ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026").map(nn),nd=hn(ed),dd=new Array(3).concat("deebf79ecae13182bd","eff3ffbdd7e76baed62171b5","eff3ffbdd7e76baed63182bd08519c","eff3ffc6dbef9ecae16baed63182bd08519c","eff3ffc6dbef9ecae16baed64292c62171b5084594","f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594","f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b").map(nn),Cd=hn(dd),ad=new Array(3).concat("e5f5e0a1d99b31a354","edf8e9bae4b374c476238b45","edf8e9bae4b374c47631a354006d2c","edf8e9c7e9c0a1d99b74c47631a354006d2c","edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32","f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32","f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b").map(nn),bd=hn(ad),od=new Array(3).concat("f0f0f0bdbdbd636363","f7f7f7cccccc969696525252","f7f7f7cccccc969696636363252525","f7f7f7d9d9d9bdbdbd969696636363252525","f7f7f7d9d9d9bdbdbd969696737373525252252525","fffffff0f0f0d9d9d9bdbdbd969696737373525252252525","fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000").map(nn),Gd=hn(od),ud=new Array(3).concat("efedf5bcbddc756bb1","f2f0f7cbc9e29e9ac86a51a3","f2f0f7cbc9e29e9ac8756bb154278f","f2f0f7dadaebbcbddc9e9ac8756bb154278f","f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486","fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486","fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d").map(nn),rd=hn(ud),xd=new Array(3).concat("fee0d2fc9272de2d26","fee5d9fcae91fb6a4acb181d","fee5d9fcae91fb6a4ade2d26a50f15","fee5d9fcbba1fc9272fb6a4ade2d26a50f15","fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d","fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d","fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d").map(nn),Ad=hn(xd),Ld=new Array(3).concat("fee6cefdae6be6550d","feeddefdbe85fd8d3cd94701","feeddefdbe85fd8d3ce6550da63603","feeddefdd0a2fdae6bfd8d3ce6550da63603","feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04","fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04","fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704").map(nn),hd=hn(Ld);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 Rd=HU(sU(300,.5,0),sU(-240,.5,1)),Vd=HU(sU(-100,.75,.35),sU(80,1.5,.8)),Zd=HU(sU(260,.75,.35),sU(80,1.5,.8)),Sd=sU();function md(B){(B<0||B>1)&&(B-=Math.floor(B));var Q=Math.abs(B-.5);return Sd.h=360*B-100,Sd.s=1.5-1.5*Q,Sd.l=.8-.9*Q,Sd+""}var Ed=rt(),Nd=Math.PI/3,Xd=2*Math.PI/3;function pd(B){var Q;return B=(.5-B)*Math.PI,Ed.r=255*(Q=Math.sin(B))*Q,Ed.g=255*(Q=Math.sin(B+Nd))*Q,Ed.b=255*(Q=Math.sin(B+Xd))*Q,Ed+""}function Wd(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 Hd(B){var Q=B.length;return function(F){return B[Math.max(0,Math.min(Q-1,Math.floor(F*Q)))]}}var Dd=Hd(nn("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")),Yd=Hd(nn("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")),fd=Hd(nn("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")),wd=Hd(nn("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));function vd(B){return function(){return B}}const Jd=Math.cos,kd=Math.min,Md=Math.sin,Td=Math.sqrt,zd=Math.PI,Kd=2*zd;function Od(B){this._context=B}function Pd(B){return new Od(B)}function jd(B){return B[0]}function _d(B){return B[1]}function $d(B,Q){var F=vd(!0),t=null,U=Pd,I=null,s=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 wI(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==t&&(I=U(c=s())),i=0;i<=e;++i)!(i<e&&F(l=g[i],i,g))===n&&((n=!n)?I.lineStart():I.lineEnd()),n&&I.point(+B(l,i,g),+Q(l,i,g));if(c)return I=null,c+""||null}return B="function"==typeof B?B:void 0===B?jd: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?(U=B,null!=t&&(I=U(t)),g):U},g.context=function(B){return arguments.length?(null==B?t=I=null:I=U(t=B),g):t},g}Od.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 qd{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 BC=Td(3);var QC={draw(B,Q){const F=.59436*Td(Q+kd(Q/28,.75)),t=F/2,U=t*BC;B.moveTo(0,F),B.lineTo(0,-F),B.moveTo(-U,-t),B.lineTo(U,t),B.moveTo(-U,t),B.lineTo(U,-t)}},FC={draw(B,Q){const F=Td(Q/zd);B.moveTo(F,0),B.arc(0,0,F,0,Kd)}},tC={draw(B,Q){const F=Td(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 UC=Td(1/3),IC=2*UC;var sC={draw(B,Q){const F=Td(Q/IC),t=F*UC;B.moveTo(0,-F),B.lineTo(t,0),B.lineTo(0,F),B.lineTo(-t,0),B.closePath()}},gC={draw(B,Q){const F=.62625*Td(Q);B.moveTo(0,-F),B.lineTo(F,0),B.lineTo(0,F),B.lineTo(-F,0),B.closePath()}},iC={draw(B,Q){const F=.87559*Td(Q-kd(Q/7,2));B.moveTo(-F,0),B.lineTo(F,0),B.moveTo(0,F),B.lineTo(0,-F)}},lC={draw(B,Q){const F=Td(Q),t=-F/2;B.rect(t,t,F,F)}},cC={draw(B,Q){const F=.4431*Td(Q);B.moveTo(F,F),B.lineTo(F,-F),B.lineTo(-F,-F),B.lineTo(-F,F),B.closePath()}};const eC=Md(zd/10)/Md(7*zd/10),nC=Md(Kd/10)*eC,dC=-Jd(Kd/10)*eC;var CC={draw(B,Q){const F=Td(.8908130915292852*Q),t=nC*F,U=dC*F;B.moveTo(0,-F),B.lineTo(t,U);for(let Q=1;Q<5;++Q){const I=Kd*Q/5,s=Jd(I),g=Md(I);B.lineTo(g*F,-s*F),B.lineTo(s*t-g*U,g*t+s*U)}B.closePath()}};const aC=Td(3);var bC={draw(B,Q){const F=-Td(Q/(3*aC));B.moveTo(0,2*F),B.lineTo(-aC*F,-F),B.lineTo(aC*F,-F),B.closePath()}};const oC=Td(3);var GC={draw(B,Q){const F=.6824*Td(Q),t=F/2,U=F*oC/2;B.moveTo(0,-F),B.lineTo(U,t),B.lineTo(-U,t),B.closePath()}};const uC=-.5,rC=Td(3)/2,xC=1/Td(12),AC=3*(xC/2+1);var LC={draw(B,Q){const F=Td(Q/AC),t=F/2,U=F*xC,I=t,s=F*xC+F,g=-I,i=s;B.moveTo(t,U),B.lineTo(I,s),B.lineTo(g,i),B.lineTo(uC*t-rC*U,rC*t+uC*U),B.lineTo(uC*I-rC*s,rC*I+uC*s),B.lineTo(uC*g-rC*i,rC*g+uC*i),B.lineTo(uC*t+rC*U,uC*U-rC*t),B.lineTo(uC*I+rC*s,uC*s-rC*I),B.lineTo(uC*g+rC*i,uC*i-rC*g),B.closePath()}},hC={draw(B,Q){const F=.6189*Td(Q-kd(Q/6,1.7));B.moveTo(-F,-F),B.lineTo(F,F),B.moveTo(-F,F),B.lineTo(F,-F)}};const yC=[FC,tC,sC,lC,CC,bC,LC],RC=[FC,iC,hC,GC,QC,cC,gC];function VC(){}function ZC(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 SC(B){this._context=B}function mC(B){this._context=B}function EC(B){this._context=B}function NC(B,Q){this._basis=new SC(B),this._beta=Q}SC.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:ZC(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:ZC(this,B,Q)}this._x0=this._x1,this._x1=B,this._y0=this._y1,this._y1=Q}},mC.prototype={areaStart:VC,areaEnd:VC,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:ZC(this,B,Q)}this._x0=this._x1,this._x1=B,this._y0=this._y1,this._y1=Q}},EC.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,t=(this._y0+4*this._y1+Q)/6;this._line?this._context.lineTo(F,t):this._context.moveTo(F,t);break;case 3:this._point=4;default:ZC(this,B,Q)}this._x0=this._x1,this._x1=B,this._y0=this._y1,this._y1=Q}},NC.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 t,U=B[0],I=Q[0],s=B[F]-U,g=Q[F]-I,i=-1;++i<=F;)t=i/F,this._basis.point(this._beta*B[i]+(1-this._beta)*(U+t*s),this._beta*Q[i]+(1-this._beta)*(I+t*g));this._x=this._y=null,this._basis.lineEnd()},point:function(B,Q){this._x.push(+B),this._y.push(+Q)}};var XC=function B(Q){function F(B){return 1===Q?new SC(B):new NC(B,Q)}return F.beta=function(Q){return B(+Q)},F}(.85);function pC(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 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(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:pC(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:pC(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 HC=function B(Q){function F(B){return new WC(B,Q)}return F.tension=function(Q){return B(+Q)},F}(0);function DC(B,Q){this._context=B,this._k=(1-Q)/6}DC.prototype={areaStart:VC,areaEnd:VC,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:pC(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 DC(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: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:pC(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 wC=function B(Q){function F(B){return new fC(B,Q)}return F.tension=function(Q){return B(+Q)},F}(0);function vC(B,Q,F){var t=B._x1,U=B._y1,I=B._x2,s=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);t=(t*g-B._x0*B._l12_2a+B._x2*B._l01_2a)/i,U=(U*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);I=(I*l+B._x1*B._l23_2a-Q*B._l12_2a)/c,s=(s*l+B._y1*B._l23_2a-F*B._l12_2a)/c}B._context.bezierCurveTo(t,U,I,s,B._x2,B._y2)}function JC(B,Q){this._context=B,this._alpha=Q}JC.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,t=this._y2-Q;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(F*F+t*t,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 kC=function B(Q){function F(B){return Q?new JC(B,Q):new WC(B,0)}return F.alpha=function(Q){return B(+Q)},F}(.5);function MC(B,Q){this._context=B,this._alpha=Q}MC.prototype={areaStart:VC,areaEnd:VC,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,t=this._y2-Q;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(F*F+t*t,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 TC=function B(Q){function F(B){return Q?new MC(B,Q):new DC(B,0)}return F.alpha=function(Q){return B(+Q)},F}(.5);function zC(B,Q){this._context=B,this._alpha=Q}zC.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,t=this._y2-Q;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(F*F+t*t,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 KC=function B(Q){function F(B){return Q?new zC(B,Q):new fC(B,0)}return F.alpha=function(Q){return B(+Q)},F}(.5);function OC(B){this._context=B}function PC(B){return B<0?-1:1}function jC(B,Q,F){var t=B._x1-B._x0,U=Q-B._x1,I=(B._y1-B._y0)/(t||U<0&&-0),s=(F-B._y1)/(U||t<0&&-0),g=(I*U+s*t)/(t+U);return(PC(I)+PC(s))*Math.min(Math.abs(I),Math.abs(s),.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 $C(B,Q,F){var t=B._x0,U=B._y0,I=B._x1,s=B._y1,g=(I-t)/3;B._context.bezierCurveTo(t+g,U+g*Q,I-g,s-g*F,I,s)}function qC(B){this._context=B}function Ba(B){this._context=new Qa(B)}function Qa(B){this._context=B}function Fa(B){this._context=B}function ta(B){var Q,F,t=B.length-1,U=new Array(t),I=new Array(t),s=new Array(t);for(U[0]=0,I[0]=2,s[0]=B[0]+2*B[1],Q=1;Q<t-1;++Q)U[Q]=1,I[Q]=4,s[Q]=4*B[Q]+2*B[Q+1];for(U[t-1]=2,I[t-1]=7,s[t-1]=8*B[t-1]+B[t],Q=1;Q<t;++Q)F=U[Q]/I[Q-1],I[Q]-=F,s[Q]-=F*s[Q-1];for(U[t-1]=s[t-1]/I[t-1],Q=t-2;Q>=0;--Q)U[Q]=(s[Q]-U[Q+1])/I[Q];for(I[t-1]=(B[t]+U[t-1])/2,Q=0;Q<t-1;++Q)I[Q]=2*B[Q+1]-U[Q+1];return[U,I]}function Ua(B,Q){this._context=B,this._t=Q}function Ia(B,Q,F){this.k=B,this.x=Q,this.y=F}OC.prototype={areaStart:VC,areaEnd:VC,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))}},qC.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:$C(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,$C(this,_C(this,F=jC(this,B,Q)),F);break;default:$C(this,this._t0,F=jC(this,B,Q))}this._x0=this._x1,this._x1=B,this._y0=this._y1,this._y1=Q,this._t0=F}}},(Ba.prototype=Object.create(qC.prototype)).point=function(B,Q){qC.prototype.point.call(this,Q,B)},Qa.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,t,U,I){this._context.bezierCurveTo(Q,B,t,F,I,U)}},Fa.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 t=ta(B),U=ta(Q),I=0,s=1;s<F;++I,++s)this._context.bezierCurveTo(t[0][I],U[0][I],t[1][I],U[1][I],B[s],Q[s]);(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)}},Ua.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 sa extends gB{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=dU(B,"#ffffff")(.75),Q.light50=dU(B,"#ffffff")(.5),Q.light25=dU(B,"#ffffff")(.25),Q.grey=B,Q.dark25=dU(B,"#000000")(.25),Q.dark50=dU(B,"#000000")(.5),Q.dark75=dU(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 t=this.shadows.opacityUmbra+this.shadows.opacityBoost,U=this.shadows.opacityPenumbra+this.shadows.opacityBoost,I=this.shadows.opacityAmbient+this.shadows.opacityBoost,s=F?`rgba(${this.shadows.inverseBaselineColorString}, ${t})`:`rgba(${this.shadows.baselineColorString}, ${t})`,g=F?`rgba(${this.shadows.inverseBaselineColorString}, ${U})`:`rgba(${this.shadows.baselineColorString}, ${U})`,i=F?`rgba(${this.shadows.inverseBaselineColorString}, ${I})`:`rgba(${this.shadows.baselineColorString}, ${I})`,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`} ${s}, ${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=sa.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=sa.shadows,Q=B.elevations.map((Q=>T`
|
|
24
|
+
<filter id=${`shadow-${Q}`} x="-250%" y="-250%" width="600%" height="600%">
|
|
25
25
|
<feComponentTransfer in="SourceAlpha" result="solid">
|
|
26
26
|
<feFuncA type="table" tableValues="0 1 1"/>
|
|
27
27
|
</feComponentTransfer>
|
|
28
|
-
<feOffset in="solid" result="offU" dx=${
|
|
29
|
-
<feOffset in="solid" result="offP" dx=${
|
|
30
|
-
<feOffset in="solid" result="offA" dx=${
|
|
31
|
-
${0===
|
|
32
|
-
${0===
|
|
33
|
-
${0===
|
|
34
|
-
<feGaussianBlur in=${0===
|
|
35
|
-
<feGaussianBlur in=${0===
|
|
36
|
-
<feGaussianBlur in=${0===
|
|
37
|
-
<feFlood in="SourceGraphic" result="opU" flood-color=${
|
|
38
|
-
<feFlood in="SourceGraphic" result="opP" flood-color=${
|
|
39
|
-
<feFlood in="SourceGraphic" result="opA" flood-color=${
|
|
28
|
+
<feOffset in="solid" result="offU" dx=${B.mapUmbra[Q].y/2} dy=${B.mapUmbra[Q].y} />
|
|
29
|
+
<feOffset in="solid" result="offP" dx=${B.mapPenumbra[Q].y/2} dy=${B.mapPenumbra[Q].y} />
|
|
30
|
+
<feOffset in="solid" result="offA" dx=${B.mapAmbient[Q].y/2} dy=${B.mapAmbient[Q].y} />
|
|
31
|
+
${0===B.mapUmbra[Q].s?T``:T`<feMorphology in="offU" result="spreadU" operator=${B.mapUmbra[Q].s>0?"dilate":"erode"} radius=${Math.abs(B.mapUmbra[Q].s)} />`}
|
|
32
|
+
${0===B.mapPenumbra[Q].s?T``:T`<feMorphology in="offP" result="spreadP" operator=${B.mapPenumbra[Q].s>0?"dilate":"erode"} radius=${Math.abs(B.mapPenumbra[Q].s)} />`}
|
|
33
|
+
${0===B.mapAmbient[Q].s?T``:T`<feMorphology in="offA" result="spreadA" operator=${B.mapAmbient[Q].s>0?"dilate":"erode"} radius=${Math.abs(B.mapAmbient[Q].s)} />`}
|
|
34
|
+
<feGaussianBlur in=${0===B.mapUmbra[Q].s?"offU":"spreadU"} result="blurU" stdDeviation=${B.mapUmbra[Q].b/2} />
|
|
35
|
+
<feGaussianBlur in=${0===B.mapPenumbra[Q].s?"offP":"spreadP"} result="blurP" stdDeviation=${B.mapPenumbra[Q].b/2} />
|
|
36
|
+
<feGaussianBlur in=${0===B.mapAmbient[Q].s?"offA":"spreadA"} result="blurA" stdDeviation=${B.mapAmbient[Q].b/2} />
|
|
37
|
+
<feFlood in="SourceGraphic" result="opU" flood-color=${B.baselineColor} flood-opacity=${B.opacityUmbra+B.opacityBoost} />
|
|
38
|
+
<feFlood in="SourceGraphic" result="opP" flood-color=${B.baselineColor} flood-opacity=${B.opacityPenumbra+B.opacityBoost} />
|
|
39
|
+
<feFlood in="SourceGraphic" result="opA" flood-color=${B.baselineColor} flood-opacity=${B.opacityAmbient+B.opacityBoost} />
|
|
40
40
|
<feComposite in="opU" in2="blurU" result="shU" operator="in" />
|
|
41
41
|
<feComposite in="opP" in2="blurP" result="shP" operator="in" />
|
|
42
42
|
<feComposite in="opA" in2="blurA" result="shA" operator="in" />
|
|
@@ -53,27 +53,27 @@ let rt=class extends G{constructor(){super(...arguments),this.renderOptions={hos
|
|
|
53
53
|
</filter>`));return T`
|
|
54
54
|
<svg class="defs">
|
|
55
55
|
<defs>
|
|
56
|
-
${
|
|
56
|
+
${Q}
|
|
57
57
|
</defs>
|
|
58
58
|
</svg>
|
|
59
|
-
`}static get styles(){return
|
|
59
|
+
`}static get styles(){return g`
|
|
60
60
|
:host {
|
|
61
|
-
---shadow-0: var(--shadow-0, ${
|
|
62
|
-
---shadow-2: var(--shadow-2, ${
|
|
63
|
-
---shadow-4: var(--shadow-4, ${
|
|
64
|
-
---shadow-8: var(--shadow-8, ${
|
|
65
|
-
|
|
66
|
-
---color-background: var(--color-background, ${
|
|
67
|
-
---color-border: var(--color-border, ${
|
|
68
|
-
---color-text: var(--color-text, ${
|
|
69
|
-
---color-text-inverse: var(--color-text-inverse, ${
|
|
70
|
-
---color-link: var(--color-link, ${
|
|
71
|
-
---color-element-background: var(--color-element-background, ${
|
|
72
|
-
---color-element-disabled: var(--color-element-disabled, ${
|
|
73
|
-
---color-element-enabled: var(--color-element-enabled, ${
|
|
74
|
-
---color-element-selected: var(--color-element-selected, ${
|
|
75
|
-
---color-element-border: var(--color-element-border, ${
|
|
76
|
-
---color-element-emphasis: var(--color-element-emphasis, ${
|
|
61
|
+
---shadow-0: var(--shadow-0, ${s(this.cssBoxShadow(0))});
|
|
62
|
+
---shadow-2: var(--shadow-2, ${s(this.cssBoxShadow(2))});
|
|
63
|
+
---shadow-4: var(--shadow-4, ${s(this.cssBoxShadow(4))});
|
|
64
|
+
---shadow-8: var(--shadow-8, ${s(this.cssBoxShadow(8))});
|
|
65
|
+
|
|
66
|
+
---color-background: var(--color-background, ${s(this.greys.white)});
|
|
67
|
+
---color-border: var(--color-border, ${s(this.greys.light75)});
|
|
68
|
+
---color-text: var(--color-text, ${s(this.greys.dark75)});
|
|
69
|
+
---color-text-inverse: var(--color-text-inverse, ${s(this.greys.white)});
|
|
70
|
+
---color-link: var(--color-link, ${s(this.greys.dark25)});
|
|
71
|
+
---color-element-background: var(--color-element-background, ${s(this.greys.light75)});
|
|
72
|
+
---color-element-disabled: var(--color-element-disabled, ${s(this.greys.light50)});
|
|
73
|
+
---color-element-enabled: var(--color-element-enabled, ${s(this.greys.dark25)});
|
|
74
|
+
---color-element-selected: var(--color-element-selected, ${s(this.greys.grey)});
|
|
75
|
+
---color-element-border: var(--color-element-border, ${s(this.greys.dark50)});
|
|
76
|
+
---color-element-emphasis: var(--color-element-emphasis, ${s(this.greys.dark75)});
|
|
77
77
|
|
|
78
78
|
---font-family-base: var(--font-family-base, "Source Sans", sans-serif);
|
|
79
79
|
---font-family-math: var(--font-family-math, "Source Serif", serif);
|
|
@@ -113,8 +113,11 @@ let rt=class extends G{constructor(){super(...arguments),this.renderOptions={hos
|
|
|
113
113
|
width: 0;
|
|
114
114
|
height: 0;
|
|
115
115
|
}
|
|
116
|
-
`}}customElements.define("decidables-button",class extends
|
|
116
|
+
`}}customElements.define("decidables-button",class extends sa{static get properties(){return{disabled:{attribute:"disabled",type:Boolean,reflect:!0}}}constructor(){super(),this.disabled=!1}static get styles(){return[super.styles,g`
|
|
117
117
|
:host {
|
|
118
|
+
---decidables-button-background-color-disabled: var(--decidables-button-background-color, var(---color-element-disabled));
|
|
119
|
+
---decidables-button-background-color-enabled: var(--decidables-button-background-color, var(---color-element-enabled));
|
|
120
|
+
|
|
118
121
|
margin: 0.25rem;
|
|
119
122
|
}
|
|
120
123
|
|
|
@@ -134,7 +137,7 @@ let rt=class extends G{constructor(){super(...arguments),this.renderOptions={hos
|
|
|
134
137
|
}
|
|
135
138
|
|
|
136
139
|
button:disabled {
|
|
137
|
-
background-color: var(
|
|
140
|
+
background-color: var(---decidables-button-background-color-disabled);
|
|
138
141
|
outline: none;
|
|
139
142
|
box-shadow: none;
|
|
140
143
|
}
|
|
@@ -142,7 +145,7 @@ let rt=class extends G{constructor(){super(...arguments),this.renderOptions={hos
|
|
|
142
145
|
button:enabled {
|
|
143
146
|
cursor: pointer;
|
|
144
147
|
|
|
145
|
-
background-color: var(
|
|
148
|
+
background-color: var(---decidables-button-background-color-enabled);
|
|
146
149
|
outline: none;
|
|
147
150
|
box-shadow: var(---shadow-2);
|
|
148
151
|
}
|
|
@@ -176,11 +179,15 @@ let rt=class extends G{constructor(){super(...arguments),this.renderOptions={hos
|
|
|
176
179
|
* Copyright 2018 Google LLC
|
|
177
180
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
178
181
|
*/
|
|
179
|
-
const
|
|
182
|
+
const ga=B=>B??K;customElements.define("decidables-slider",class extends sa{static get properties(){return{disabled:{attribute:"disabled",type:Boolean,reflect:!0},scale:{attribute:"scale",type:Boolean,reflect:!0},max:{attribute:"max",type:Number,reflect:!0},min:{attribute:"min",type:Number,reflect:!0},step:{attribute:"step",type:Number,reflect:!0},value:{attribute:"value",type:Number,reflect:!0},nonlinear:{attribute:!1,type:Boolean,reflect:!1}}}constructor(){super(),this.disabled=!1,this.scale=!1,this.max=void 0,this.min=void 0,this.step=void 0,this.value=void 0,this.nonlinear=!1,this.rangeMax=void 0,this.rangeMin=void 0,this.rangeStep=void 0,this.rangeValue=void 0,this.toRange=void 0,this.fromRange=void 0}nonlinearRange(B,Q,F){this.nonlinear=B,this.toRange=B?Q:void 0,this.fromRange=B?F:void 0}rangeChanged(B){this.value=this.nonlinear?this.fromRange(B.target.value):B.target.value,this.dispatchEvent(new CustomEvent("change",{detail:{value:this.value},bubbles:!0}))}rangeInputted(B){this.value=this.nonlinear?this.fromRange(B.target.value):B.target.value}spinnerInputted(B){this.value=B.target.value}willUpdate(){this.rangeMax=void 0===this.max?void 0:this.nonlinear?this.toRange(this.max):this.max,this.rangeMin=void 0===this.min?void 0:this.nonlinear?this.toRange(this.min):this.min,this.rangeStep=void 0===this.step?void 0:this.nonlinear?"any":this.step,this.rangeValue=void 0===this.value?void 0:this.nonlinear?this.toRange(this.value):this.value}static get styles(){return[super.styles,g`
|
|
180
183
|
:host {
|
|
181
|
-
---
|
|
182
|
-
---
|
|
183
|
-
---
|
|
184
|
+
---decidables-slider-background-color: var(--decidables-slider-background-color, var(---color-element-disabled));
|
|
185
|
+
---decidables-slider-color: var(--decidables-slider-color, var(---color-element-enabled));
|
|
186
|
+
---decidables-spinner-background-color: var(--decidables-slider-background-color, none);
|
|
187
|
+
|
|
188
|
+
---shadow-2-rotate: var(--shadow-2-rotate, ${s(this.cssBoxShadow(2,!0,!1))});
|
|
189
|
+
---shadow-4-rotate: var(--shadow-4-rotate, ${s(this.cssBoxShadow(4,!0,!1))});
|
|
190
|
+
---shadow-8-rotate: var(--shadow-8-rotate, ${s(this.cssBoxShadow(8,!0,!1))});
|
|
184
191
|
|
|
185
192
|
display: flex;
|
|
186
193
|
|
|
@@ -195,7 +202,10 @@ const Gu=t=>t??K;customElements.define("decidables-slider",class extends fu{stat
|
|
|
195
202
|
}
|
|
196
203
|
|
|
197
204
|
.range {
|
|
198
|
-
|
|
205
|
+
position: relative;
|
|
206
|
+
display: flex;
|
|
207
|
+
|
|
208
|
+
flex-direction: row;
|
|
199
209
|
|
|
200
210
|
width: 3.5rem;
|
|
201
211
|
height: 4.75rem;
|
|
@@ -206,6 +216,8 @@ const Gu=t=>t??K;customElements.define("decidables-slider",class extends fu{stat
|
|
|
206
216
|
--decidables-spinner-input-width: 3.5rem;
|
|
207
217
|
|
|
208
218
|
margin: 0 0.25rem 0.25rem;
|
|
219
|
+
|
|
220
|
+
background: var(---decidables-spinner-background-color);
|
|
209
221
|
}
|
|
210
222
|
|
|
211
223
|
/* Adapted from http://danielstern.ca/range.css/#/ */
|
|
@@ -244,14 +256,14 @@ const Gu=t=>t??K;customElements.define("decidables-slider",class extends fu{stat
|
|
|
244
256
|
width: 100%;
|
|
245
257
|
height: 4px;
|
|
246
258
|
|
|
247
|
-
background: var(---
|
|
259
|
+
background: var(---decidables-slider-background-color);
|
|
248
260
|
border: 0;
|
|
249
261
|
border-radius: 2px;
|
|
250
262
|
box-shadow: none;
|
|
251
263
|
}
|
|
252
264
|
|
|
253
265
|
input[type=range]:focus::-webkit-slider-runnable-track {
|
|
254
|
-
background: var(---
|
|
266
|
+
background: var(---decidables-slider-background-color);
|
|
255
267
|
}
|
|
256
268
|
|
|
257
269
|
/* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
|
|
@@ -259,7 +271,7 @@ const Gu=t=>t??K;customElements.define("decidables-slider",class extends fu{stat
|
|
|
259
271
|
width: 100%;
|
|
260
272
|
height: 4px;
|
|
261
273
|
|
|
262
|
-
background: var(---
|
|
274
|
+
background: var(---decidables-slider-background-color);
|
|
263
275
|
border: 0;
|
|
264
276
|
border-radius: 2px;
|
|
265
277
|
box-shadow: none;
|
|
@@ -279,7 +291,7 @@ const Gu=t=>t??K;customElements.define("decidables-slider",class extends fu{stat
|
|
|
279
291
|
/* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
|
|
280
292
|
input[type=range]::-ms-fill-lower {
|
|
281
293
|
background: #cccccc;
|
|
282
|
-
/* background: var(---
|
|
294
|
+
/* background: var(---decidables-slider-background-color); */
|
|
283
295
|
border: 0;
|
|
284
296
|
border-radius: 2px;
|
|
285
297
|
box-shadow: none;
|
|
@@ -288,7 +300,7 @@ const Gu=t=>t??K;customElements.define("decidables-slider",class extends fu{stat
|
|
|
288
300
|
/* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
|
|
289
301
|
input[type=range]::-ms-fill-upper {
|
|
290
302
|
background: #cccccc;
|
|
291
|
-
/* background: var(---
|
|
303
|
+
/* background: var(---decidables-slider-background-color); */
|
|
292
304
|
border: 0;
|
|
293
305
|
border-radius: 2px;
|
|
294
306
|
box-shadow: none;
|
|
@@ -296,12 +308,12 @@ const Gu=t=>t??K;customElements.define("decidables-slider",class extends fu{stat
|
|
|
296
308
|
|
|
297
309
|
/* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
|
|
298
310
|
input[type=range]:focus::-ms-fill-lower {
|
|
299
|
-
background: var(---
|
|
311
|
+
background: var(---decidables-slider-background-color);
|
|
300
312
|
}
|
|
301
313
|
|
|
302
314
|
/* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
|
|
303
315
|
input[type=range]:focus::-ms-fill-upper {
|
|
304
|
-
background: var(---
|
|
316
|
+
background: var(---decidables-slider-background-color);
|
|
305
317
|
}
|
|
306
318
|
|
|
307
319
|
/* Thumb */
|
|
@@ -319,12 +331,12 @@ const Gu=t=>t??K;customElements.define("decidables-slider",class extends fu{stat
|
|
|
319
331
|
}
|
|
320
332
|
|
|
321
333
|
input[type=range]:disabled::-webkit-slider-thumb {
|
|
322
|
-
background: var(---
|
|
334
|
+
background: var(---decidables-slider-background-color);
|
|
323
335
|
box-shadow: none;
|
|
324
336
|
}
|
|
325
337
|
|
|
326
338
|
input[type=range]:enabled::-webkit-slider-thumb {
|
|
327
|
-
background: var(---
|
|
339
|
+
background: var(---decidables-slider-color);
|
|
328
340
|
box-shadow: var(---shadow-2-rotate);
|
|
329
341
|
}
|
|
330
342
|
|
|
@@ -355,13 +367,13 @@ const Gu=t=>t??K;customElements.define("decidables-slider",class extends fu{stat
|
|
|
355
367
|
|
|
356
368
|
/* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
|
|
357
369
|
input[type=range]:disabled::-moz-range-thumb {
|
|
358
|
-
background: var(---
|
|
370
|
+
background: var(---decidables-slider-background-color);
|
|
359
371
|
box-shadow: none;
|
|
360
372
|
}
|
|
361
373
|
|
|
362
374
|
/* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
|
|
363
375
|
input[type=range]:enabled::-moz-range-thumb {
|
|
364
|
-
background: var(---
|
|
376
|
+
background: var(---decidables-slider-color);
|
|
365
377
|
box-shadow: var(---shadow-2-rotate);
|
|
366
378
|
}
|
|
367
379
|
|
|
@@ -398,13 +410,13 @@ const Gu=t=>t??K;customElements.define("decidables-slider",class extends fu{stat
|
|
|
398
410
|
|
|
399
411
|
/* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
|
|
400
412
|
input[type=range]:disabled::-ms-thumb {
|
|
401
|
-
background: var(---
|
|
413
|
+
background: var(---decidables-slider-background-color);
|
|
402
414
|
box-shadow: none;
|
|
403
415
|
}
|
|
404
416
|
|
|
405
417
|
/* stylelint-disable-next-line no-descending-specificity */ /* stylelint ERROR */
|
|
406
418
|
input[type=range]:enabled::-ms-thumb {
|
|
407
|
-
background: var(---
|
|
419
|
+
background: var(---decidables-slider-color);
|
|
408
420
|
box-shadow: var(---shadow-2-rotate);
|
|
409
421
|
}
|
|
410
422
|
|
|
@@ -426,15 +438,48 @@ const Gu=t=>t??K;customElements.define("decidables-slider",class extends fu{stat
|
|
|
426
438
|
:host(.keyboard) input[type=range]:enabled:focus:active::-ms-thumb {
|
|
427
439
|
box-shadow: var(---shadow-8-rotate);
|
|
428
440
|
}
|
|
441
|
+
|
|
442
|
+
datalist {
|
|
443
|
+
position: absolute;
|
|
444
|
+
left: 2rem;
|
|
445
|
+
z-index: -1;
|
|
446
|
+
display: flex;
|
|
447
|
+
|
|
448
|
+
flex-direction: column;
|
|
449
|
+
|
|
450
|
+
align-items: flex-start;
|
|
451
|
+
justify-content: space-between;
|
|
452
|
+
|
|
453
|
+
height: 4.75rem;
|
|
454
|
+
|
|
455
|
+
font-size: 0.75rem;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
option {
|
|
459
|
+
padding: 0;
|
|
460
|
+
|
|
461
|
+
line-height: 0.8;
|
|
462
|
+
min-block-size: 0;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
option::before {
|
|
466
|
+
content: "– ";
|
|
467
|
+
}
|
|
429
468
|
`]}render(){return M`
|
|
430
469
|
<label for="slider">
|
|
431
470
|
<slot></slot>
|
|
432
471
|
</label>
|
|
433
472
|
<div class="range">
|
|
434
|
-
<input ?disabled=${this.disabled} type="range" id="slider" min=${
|
|
473
|
+
<input ?disabled=${this.disabled} type="range" id="slider" min=${ga(this.rangeMin)} max=${ga(this.rangeMax)} step=${ga(this.rangeStep)} .value=${this.rangeValue} @change=${this.rangeChanged.bind(this)} @input=${this.rangeInputted.bind(this)}>
|
|
474
|
+
${this.scale?M`
|
|
475
|
+
<datalist id="ticks">
|
|
476
|
+
<option value=${ga(this.rangeMax)} label=${ga(this.max)}></option>
|
|
477
|
+
<option value=${ga(this.rangeMin)} label=${ga(this.min)}></option>
|
|
478
|
+
</datalist>
|
|
479
|
+
`:M``}
|
|
435
480
|
</div>
|
|
436
|
-
<decidables-spinner ?disabled=${this.disabled} min=${
|
|
437
|
-
`}});customElements.define("decidables-spinner",class extends
|
|
481
|
+
<decidables-spinner ?disabled=${this.disabled} min=${ga(this.min)} max=${ga(this.max)} step=${ga(this.step)} .value=${this.value} @input=${this.spinnerInputted.bind(this)}></decidables-spinner>
|
|
482
|
+
`}});customElements.define("decidables-spinner",class extends sa{static get properties(){return{disabled:{attribute:"disabled",type:Boolean,reflect:!0},max:{attribute:"max",type:Number,reflect:!0},min:{attribute:"min",type:Number,reflect:!0},step:{attribute:"step",type:Number,reflect:!0},value:{attribute:"value",type:Number,reflect:!0}}}constructor(){super(),this.disabled=!1,this.max=void 0,this.min=void 0,this.step=void 0,this.value=void 0}inputted(B){this.value=B.target.value}static get styles(){return[super.styles,g`
|
|
438
483
|
:host {
|
|
439
484
|
---decidables-spinner-font-size: var(--decidables-spinner-font-size, 1.125rem);
|
|
440
485
|
---decidables-spinner-input-width: var(--decidables-spinner-input-width, 4rem);
|
|
@@ -531,9 +576,9 @@ const Gu=t=>t??K;customElements.define("decidables-slider",class extends fu{stat
|
|
|
531
576
|
`]}render(){return M`
|
|
532
577
|
<label>
|
|
533
578
|
<slot></slot>
|
|
534
|
-
<input ?disabled=${this.disabled} type="number" min=${
|
|
579
|
+
<input ?disabled=${this.disabled} type="number" min=${ga(this.min)} max=${ga(this.max)} step=${ga(this.step)} .value=${this.value} @input=${this.inputted.bind(this)}>
|
|
535
580
|
</label>
|
|
536
|
-
`}});customElements.define("decidables-switch",class extends
|
|
581
|
+
`}});customElements.define("decidables-switch",class extends sa{static get properties(){return{checked:{attribute:"checked",type:Boolean,reflect:!0},disabled:{attribute:"disabled",type:Boolean,reflect:!0}}}constructor(){super(),this.checked=!1,this.disabled=!1}changed(B){this.checked=B.target.checked,this.dispatchEvent(new CustomEvent("change",{detail:{checked:this.checked},bubbles:!0}))}static get styles(){return[super.styles,g`
|
|
537
582
|
:host {
|
|
538
583
|
display: flex;
|
|
539
584
|
|
|
@@ -661,7 +706,7 @@ const Gu=t=>t??K;customElements.define("decidables-slider",class extends fu{stat
|
|
|
661
706
|
<label for="switch">
|
|
662
707
|
<slot></slot>
|
|
663
708
|
</label>
|
|
664
|
-
`}});customElements.define("decidables-toggle",class extends
|
|
709
|
+
`}});customElements.define("decidables-toggle",class extends sa{static get properties(){return{disabled:{attribute:"disabled",type:Boolean,reflect:!0}}}constructor(){super(),this.disabled=!1}static get styles(){return[super.styles,g`
|
|
665
710
|
fieldset {
|
|
666
711
|
display: flex;
|
|
667
712
|
|
|
@@ -683,7 +728,7 @@ const Gu=t=>t??K;customElements.define("decidables-slider",class extends fu{stat
|
|
|
683
728
|
<legend><slot name="label"></slot></legend>
|
|
684
729
|
<slot></slot>
|
|
685
730
|
</fieldset>
|
|
686
|
-
`}});customElements.define("decidables-toggle-option",class extends
|
|
731
|
+
`}});customElements.define("decidables-toggle-option",class extends sa{static get properties(){return{checked:{attribute:"checked",type:Boolean,reflect:!0},disabled:{attribute:"disabled",type:Boolean,reflect:!0},name:{attribute:"name",type:String,reflect:!0},value:{attribute:"value",type:String,reflect:!0}}}constructor(){super(),this.checked=!1,this.disabled=!1,this.name=void 0,this.value=void 0}changed(B){this.checked=B.target.checked,this.dispatchEvent(new CustomEvent("change",{detail:{checked:this.checked,value:this.value},bubbles:!0}))}static get styles(){return[super.styles,g`
|
|
687
732
|
:host {
|
|
688
733
|
display: flex;
|
|
689
734
|
}
|
|
@@ -781,42 +826,42 @@ const Gu=t=>t??K;customElements.define("decidables-slider",class extends fu{stat
|
|
|
781
826
|
<label for="toggle-option">
|
|
782
827
|
<slot></slot>
|
|
783
828
|
</label>
|
|
784
|
-
`}});class
|
|
829
|
+
`}});class ia extends sa{static get properties(){return{interactive:{attribute:"interactive",type:Boolean,reflect:!0}}}constructor(){super(),this.interactive=!1}static get colors(){return{a:rn[0],d:rn[1],k:rn[2],v:rn[3],sooner:rn[5],later:rn[7],larger:"#4545d0",smaller:"#f032e6",equal:"#10dbc9",nr:"#cccccc"}}static get lights(){return Object.keys(ia.colors).reduce(((B,Q)=>(B[Q]=dU(ia.colors[Q],"#ffffff")(.5),B)),{})}static get darks(){return Object.keys(ia.colors).reduce(((B,Q)=>(B[Q]=dU(ia.colors[Q],"#000000")(.5),B)),{})}static get styles(){return[super.styles,g`
|
|
785
830
|
:host {
|
|
786
|
-
---color-a: var(--color-a, ${
|
|
787
|
-
---color-d: var(--color-d, ${
|
|
788
|
-
---color-k: var(--color-k, ${
|
|
789
|
-
---color-v: var(--color-v, ${
|
|
790
|
-
---color-sooner: var(--color-sooner, ${
|
|
791
|
-
---color-later: var(--color-later, ${
|
|
792
|
-
---color-larger: var(--color-larger, ${
|
|
793
|
-
---color-smaller: var(--color-smaller, ${
|
|
794
|
-
---color-equal: var(--color-equal, ${
|
|
795
|
-
---color-nr: var(--color-nr, ${
|
|
796
|
-
|
|
797
|
-
---color-a-light: var(--color-a-light, ${
|
|
798
|
-
---color-d-light: var(--color-d-light, ${
|
|
799
|
-
---color-k-light: var(--color-k-light, ${
|
|
800
|
-
---color-v-light: var(--color-v-light, ${
|
|
801
|
-
---color-sooner-light: var(--color-sooner-light, ${
|
|
802
|
-
---color-later-light: var(--color-later-light, ${
|
|
803
|
-
---color-larger-light: var(--color-larger-light, ${
|
|
804
|
-
---color-smaller-light: var(--color-smaller-light, ${
|
|
805
|
-
---color-equal-light: var(--color-equal-light, ${
|
|
806
|
-
---color-nr-light: var(--color-nr-light, ${
|
|
807
|
-
|
|
808
|
-
---color-a-dark: var(--color-a-dark, ${
|
|
809
|
-
---color-d-dark: var(--color-d-dark, ${
|
|
810
|
-
---color-k-dark: var(--color-k-dark, ${
|
|
811
|
-
---color-v-dark: var(--color-v-dark, ${
|
|
812
|
-
---color-sooner-dark: var(--color-sooner-dark, ${
|
|
813
|
-
---color-later-dark: var(--color-later-dark, ${
|
|
814
|
-
---color-larger-dark: var(--color-larger-dark, ${
|
|
815
|
-
---color-smaller-dark: var(--color-smaller-dark, ${
|
|
816
|
-
---color-equal-dark: var(--color-equal-dark, ${
|
|
817
|
-
---color-nr-dark: var(--color-nr-dark, ${
|
|
818
|
-
}
|
|
819
|
-
`]}}class
|
|
831
|
+
---color-a: var(--color-a, ${s(this.colors.a)});
|
|
832
|
+
---color-d: var(--color-d, ${s(this.colors.d)});
|
|
833
|
+
---color-k: var(--color-k, ${s(this.colors.k)});
|
|
834
|
+
---color-v: var(--color-v, ${s(this.colors.v)});
|
|
835
|
+
---color-sooner: var(--color-sooner, ${s(this.colors.sooner)});
|
|
836
|
+
---color-later: var(--color-later, ${s(this.colors.later)});
|
|
837
|
+
---color-larger: var(--color-larger, ${s(this.colors.larger)});
|
|
838
|
+
---color-smaller: var(--color-smaller, ${s(this.colors.smaller)});
|
|
839
|
+
---color-equal: var(--color-equal, ${s(this.colors.equal)});
|
|
840
|
+
---color-nr: var(--color-nr, ${s(this.colors.nr)});
|
|
841
|
+
|
|
842
|
+
---color-a-light: var(--color-a-light, ${s(this.lights.a)});
|
|
843
|
+
---color-d-light: var(--color-d-light, ${s(this.lights.d)});
|
|
844
|
+
---color-k-light: var(--color-k-light, ${s(this.lights.k)});
|
|
845
|
+
---color-v-light: var(--color-v-light, ${s(this.lights.v)});
|
|
846
|
+
---color-sooner-light: var(--color-sooner-light, ${s(this.lights.sooner)});
|
|
847
|
+
---color-later-light: var(--color-later-light, ${s(this.lights.later)});
|
|
848
|
+
---color-larger-light: var(--color-larger-light, ${s(this.lights.larger)});
|
|
849
|
+
---color-smaller-light: var(--color-smaller-light, ${s(this.lights.smaller)});
|
|
850
|
+
---color-equal-light: var(--color-equal-light, ${s(this.lights.equal)});
|
|
851
|
+
---color-nr-light: var(--color-nr-light, ${s(this.lights.nr)});
|
|
852
|
+
|
|
853
|
+
---color-a-dark: var(--color-a-dark, ${s(this.darks.a)});
|
|
854
|
+
---color-d-dark: var(--color-d-dark, ${s(this.darks.d)});
|
|
855
|
+
---color-k-dark: var(--color-k-dark, ${s(this.darks.k)});
|
|
856
|
+
---color-v-dark: var(--color-v-dark, ${s(this.darks.v)});
|
|
857
|
+
---color-sooner-dark: var(--color-sooner-dark, ${s(this.darks.sooner)});
|
|
858
|
+
---color-later-dark: var(--color-later-dark, ${s(this.darks.later)});
|
|
859
|
+
---color-larger-dark: var(--color-larger-dark, ${s(this.darks.larger)});
|
|
860
|
+
---color-smaller-dark: var(--color-smaller-dark, ${s(this.darks.smaller)});
|
|
861
|
+
---color-equal-dark: var(--color-equal-dark, ${s(this.darks.equal)});
|
|
862
|
+
---color-nr-dark: var(--color-nr-dark, ${s(this.darks.nr)});
|
|
863
|
+
}
|
|
864
|
+
`]}}class la extends ia{static get properties(){return{trials:{attribute:"trials",type:Number,reflect:!0},duration:{attribute:"duration",type:Number,reflect:!0},run:{attribute:"run",type:Boolean,reflect:!0},pause:{attribute:"pause",type:Boolean,reflect:!0},reset:{attribute:"reset",type:Boolean,reflect:!0},state:{atribute:!1,type:String,reflect:!1}}}constructor(){super(),this.trials=void 0,this.duration=void 0,this.run=!1,this.pause=!1,this.reset=!1,this.states=["resetted","running","paused","ended"],this.state="resetted"}setTrials(B){this.trials=B.target.value,this.dispatchEvent(new CustomEvent("discountable-control-trials",{detail:{trials:this.trials},bubbles:!0}))}setDuration(B){this.duration=B.target.value,this.dispatchEvent(new CustomEvent("discountable-control-duration",{detail:{duration:this.duration},bubbles:!0}))}doRun(){this.state="running",this.dispatchEvent(new CustomEvent("discountable-control-run",{detail:{},bubbles:!0}))}doPause(){this.state="paused",this.dispatchEvent(new CustomEvent("discountable-control-pause",{detail:{},bubbles:!0}))}doReset(){this.state="resetted",this.dispatchEvent(new CustomEvent("discountable-control-reset",{detail:{},bubbles:!0}))}complete(){this.state="ended"}static get styles(){return[super.styles,g`
|
|
820
865
|
:host {
|
|
821
866
|
display: inline-block;
|
|
822
867
|
}
|
|
@@ -840,8 +885,8 @@ const Gu=t=>t??K;customElements.define("decidables-slider",class extends fu{stat
|
|
|
840
885
|
}
|
|
841
886
|
`]}render(){return M`
|
|
842
887
|
<div class="holder">
|
|
843
|
-
${this.trials?M`<decidables-slider min="1" max="100" step="1" .value=${this.trials} @change=${this.setTrials.bind(this)} @input=${this.setTrials.bind(this)}>Trials</decidables-slider>`:M``}
|
|
844
|
-
${this.duration?M`<decidables-slider min="10" max="4000" step="10" .value=${this.duration} @change=${this.setDuration.bind(this)} @input=${this.setDuration.bind(this)}>Duration</decidables-slider>`:M``}
|
|
888
|
+
${null!=this.trials?M`<decidables-slider min="1" max="100" step="1" .value=${this.trials} @change=${this.setTrials.bind(this)} @input=${this.setTrials.bind(this)}>Trials</decidables-slider>`:M``}
|
|
889
|
+
${null!=this.duration?M`<decidables-slider min="10" max="4000" step="10" .value=${this.duration} @change=${this.setDuration.bind(this)} @input=${this.setDuration.bind(this)}>Duration</decidables-slider>`:M``}
|
|
845
890
|
${this.run||this.pause||this.reset?M`
|
|
846
891
|
<div class="buttons">
|
|
847
892
|
${this.run?M`<decidables-button name="run" ?disabled=${"running"===this.state||"ended"===this.state} @click=${this.doRun.bind(this)}>Run</decidables-button>`:M``}
|
|
@@ -849,7 +894,7 @@ const Gu=t=>t??K;customElements.define("decidables-slider",class extends fu{stat
|
|
|
849
894
|
${this.reset?M`<decidables-button name="reset" ?disabled=${"resetted"===this.state} @click=${this.doReset.bind(this)}>Reset</decidables-button>`:M``}
|
|
850
895
|
</div>
|
|
851
896
|
`:M``}
|
|
852
|
-
</div>`}}customElements.define("discountable-control",
|
|
897
|
+
</div>`}}customElements.define("discountable-control",la);class ca extends ia{static get properties(){return{feedback:{attribute:"feedback",type:Boolean,reflect:!0},trial:{attribute:"trial",type:Boolean,reflect:!0},state:{attribute:!1,type:String,reflect:!1},trialCount:{attribute:!1,type:Number,reflect:!1},trialTotal:{attribute:!1,type:Number,reflect:!1}}}constructor(){super(),this.trial=!1,this.feedback=!1,this.states=["off","waiting","feedback"],this.state="off",this.trialCount=0,this.trialTotal=0,this.as=0,this.ds=0,this.al=0,this.dl=0,this.responses=["first","second","nr"],this.response=void 0}start(B,Q,F,t,U){this.state="waiting",this.as=B,this.ds=Q,this.al=F,this.dl=t,this.trialCount=U,this.response=void 0}stop(){this.state="feedback",void 0===this.response&&(this.response="nr")}first(){this.responded("first")}second(){this.responded("second")}responded(B){this.state="feedback",this.response=B,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}))}reset(){this.state="off",this.trialCount=0,this.response=void 0}keydown(B){"waiting"===this.state&&("ArrowLeft"===B.key?(this.responded("first"),B.preventDefault()):"ArrowRight"===B.key&&(this.responded("second"),B.preventDefault()))}connectedCallback(){super.connectedCallback(),window.addEventListener("keydown",this.keydown.bind(this))}disconnectedCallback(){window.removeEventListener("keydown",this.keydown.bind(this)),super.disconnectedCallback()}static get styles(){return[super.styles,g`
|
|
853
898
|
:host {
|
|
854
899
|
display: inline-block;
|
|
855
900
|
}
|
|
@@ -976,23 +1021,23 @@ const Gu=t=>t??K;customElements.define("decidables-slider",class extends fu{stat
|
|
|
976
1021
|
${"feedback"===this.state&&this.feedback?"first"===this.response?M`<span class="response">First</span>`:"second"===this.response?M`<span class="response">Second</span>`:M`<span class="response">No<br>Response</span>`:""}
|
|
977
1022
|
</div>
|
|
978
1023
|
</div>`:M``}
|
|
979
|
-
</div>`}}customElements.define("discountable-response",
|
|
1024
|
+
</div>`}}customElements.define("discountable-response",ca);
|
|
980
1025
|
/**
|
|
981
1026
|
* @license
|
|
982
1027
|
* Copyright 2017 Google LLC
|
|
983
1028
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
984
1029
|
*/
|
|
985
|
-
const
|
|
1030
|
+
const ea=2;let na=class{constructor(B){}get _$AU(){return this._$AM._$AU}_$AT(B,Q,F){this._$Ct=B,this._$AM=Q,this._$Ci=F}_$AS(B,Q){return this.update(B,Q)}update(B,Q){return this.render(...Q)}};
|
|
986
1031
|
/**
|
|
987
1032
|
* @license
|
|
988
1033
|
* Copyright 2020 Google LLC
|
|
989
1034
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
990
|
-
*/const
|
|
1035
|
+
*/const da=(B,Q)=>{const F=B._$AN;if(void 0===F)return!1;for(const B of F)B._$AO?.(Q,!1),da(B,Q);return!0},Ca=B=>{let Q,F;do{if(void 0===(Q=B._$AM))break;F=Q._$AN,F.delete(B),B=Q}while(0===F?.size)},aa=B=>{for(let Q;Q=B._$AM;B=Q){let F=Q._$AN;if(void 0===F)Q._$AN=F=new Set;else if(F.has(B))break;F.add(B),Ga(Q)}};
|
|
991
1036
|
/**
|
|
992
1037
|
* @license
|
|
993
1038
|
* Copyright 2017 Google LLC
|
|
994
1039
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
995
|
-
*/function
|
|
1040
|
+
*/function ba(B){void 0!==this._$AN?(Ca(this),this._$AM=B,aa(this)):this._$AM=B}function oa(B,Q=!1,F=0){const t=this._$AH,U=this._$AN;if(void 0!==U&&0!==U.size)if(Q)if(Array.isArray(t))for(let B=F;B<t.length;B++)da(t[B],!1),Ca(t[B]);else null!=t&&(da(t,!1),Ca(t));else da(this,B)}const Ga=B=>{B.type==ea&&(B._$AP??=oa,B._$AQ??=ba)};class ua extends na{constructor(){super(...arguments),this._$AN=void 0}_$AT(B,Q,F){super._$AT(B,Q,F),aa(this),this.isConnected=B._$AU}_$AO(B,Q=!0){B!==this.isConnected&&(this.isConnected=B,B?this.reconnected?.():this.disconnected?.()),Q&&(da(this,B),Ca(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 ra=new WeakMap;let xa=0;const Aa=new Map,La=new WeakSet,ha=()=>new Promise((B=>requestAnimationFrame(B))),ya=[{opacity:0},{opacity:1}],Ra=(B,Q)=>{const F=B-Q;return 0===F?void 0:F},Va=(B,Q)=>{const F=B/Q;return 1===F?void 0:F},Za={left:(B,Q)=>{const F=Ra(B,Q);return{value:F,transform:null==F||isNaN(F)?void 0:`translateX(${F}px)`}},top:(B,Q)=>{const F=Ra(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 t=Va(B,Q);return{value:t,overrideFrom:F,transform:null==t||isNaN(t)?void 0:`scaleX(${t})`}},height:(B,Q)=>{let F;0===Q&&(Q=1,F={height:"1px"});const t=Va(B,Q);return{value:t,overrideFrom:F,transform:null==t||isNaN(t)?void 0:`scaleY(${t})`}}},Sa={duration:333,easing:"ease-in-out"},ma=["left","top","width","height","opacity","color","background"],Ea=new WeakMap;const Na=(B=>(...Q)=>({_$litDirective$:B,values:Q}))(class extends ua{constructor(B){if(super(B),this.t=!1,this.i=null,this.o=null,this.h=!0,this.shouldLog=!1,B.type===ea)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 ra.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,Ea.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??=ma,this.options=B}m(){const B={},Q=this.element.getBoundingClientRect(),F=getComputedStyle(this.element);return this.options.properties.forEach((t=>{const U=Q[t]??(Za[t]?void 0:F[t]),I=Number(U);B[t]=isNaN(I)?U+"":I})),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 ha;const Q=this.O(),F=this.j(this.options.keyframeOptions,Q),t=this.m();if(void 0!==this.A){const{from:F,to:U}=this.N(this.A,t,Q);this.log("measured",[this.A,t,F,U]),B=this.calculateKeyframes(F,U)}else{const F=Aa.get(this.options.inId);if(F){Aa.delete(this.options.inId);const{from:U,to:I}=this.N(F,t,Q);B=this.calculateKeyframes(U,I),B=this.options.in?[{...this.options.in[0],...B[0]},...this.options.in.slice(1),B[1]]:B,xa++,B.forEach((B=>B.zIndex=xa))}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&&Aa.set(this.options.id,this.A),void 0===this.options.out)return;if(this.prepare(),await ha(),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=Ea.get(Q);F&&!F.isDisabled()&&F&&B.push(F)}return B}get isHostRendered(){const B=La.has(this.u);return B||this.u.updateComplete.then((()=>{La.add(this.u)})),B}j(B,Q=this.O()){const F={...Sa};return Q.forEach((B=>Object.assign(F,B.options.keyframeOptions))),Object.assign(F,B),F}N(B,Q,F){B={...B},Q={...Q};const t=F.map((B=>B.animatingProperties)).filter((B=>void 0!==B));let U=1,I=1;return t.length>0&&(t.forEach((B=>{B.width&&(U/=B.width),B.height&&(I/=B.height)})),void 0!==B.left&&void 0!==Q.left&&(B.left=U*B.left,Q.left=U*Q.left),void 0!==B.top&&void 0!==Q.top&&(B.top=I*B.top,Q.top=I*Q.top)),{from:B,to:Q}}calculateKeyframes(B,Q,F=!1){const t={},U={};let I=!1;const s={};for(const F in Q){const g=B[F],i=Q[F];if(F in Za){const B=Za[F];if(void 0===g||void 0===i)continue;const Q=B(g,i);void 0!==Q.transform&&(s[F]=Q.value,I=!0,t.transform=`${t.transform??""} ${Q.transform}`,void 0!==Q.overrideFrom&&Object.assign(t,Q.overrideFrom))}else g!==i&&void 0!==g&&void 0!==i&&(I=!0,t[F]=g,U[F]=i)}return t.transformOrigin=U.transformOrigin=F?"center center":"top left",this.animatingProperties=s,I?[t,U]: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 t=this.getController();t?.add(this);try{await this.webAnimation.finished}catch(B){}t?.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 Xa{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 pa extends ia{static get properties(){return{numeric:{attribute:"numeric",type:Boolean,reflect:!0}}}constructor(){super(),this.numeric=!1}static get styles(){return[super.styles,g`
|
|
996
1041
|
:host {
|
|
997
1042
|
display: block;
|
|
998
1043
|
|
|
@@ -1162,7 +1207,7 @@ const xu=2;let Su=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,
|
|
|
1162
1207
|
.v {
|
|
1163
1208
|
background: var(---color-v-light);
|
|
1164
1209
|
}
|
|
1165
|
-
`]}}class
|
|
1210
|
+
`]}}class Wa extends pa{static get properties(){return{numeric:{attribute:"numeric",type:Boolean,reflect:!0},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.numeric=!1,this.as=20,this.ds=5,this.al=50,this.dl=40,this.k=Xa.k.DEFAULT,this.alignState()}alignState(){this.vs=Xa.adk2v(this.as,this.ds,this.k),this.vl=Xa.adk2v(this.al,this.dl,this.k),this.vDiff=this.vs-this.vl}sendEvent(){this.dispatchEvent(new CustomEvent("htd-calculation-change",{detail:{as:this.as,ds:this.ds,al:this.al,dl:this.dl,k:this.k},bubbles:!0}))}asInput(B){this.as=parseFloat(B.target.value),this.alignState(),this.sendEvent()}dsInput(B){this.ds=parseFloat(B.target.value),this.alignState(),this.sendEvent()}alInput(B){this.al=parseFloat(B.target.value),this.alignState(),this.sendEvent()}dlInput(B){this.dl=parseFloat(B.target.value),this.alignState(),this.sendEvent()}kInput(B){this.k=parseFloat(B.target.value),this.alignState(),this.sendEvent()}static get styles(){return[super.styles,g`
|
|
1166
1211
|
/* :host {
|
|
1167
1212
|
display: inline-block;
|
|
1168
1213
|
} */
|
|
@@ -1174,58 +1219,93 @@ const xu=2;let Su=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,
|
|
|
1174
1219
|
decidables-spinner {
|
|
1175
1220
|
border-radius: var(---border-radius);
|
|
1176
1221
|
}
|
|
1177
|
-
`]}willUpdate(){this.alignState()}render(){let
|
|
1222
|
+
`]}willUpdate(){this.alignState()}render(){let B,Q,F,t,U,I,s,g;this.numeric?(B=M`<decidables-spinner class="a as"
|
|
1223
|
+
?disabled=${!this.interactive}
|
|
1224
|
+
step="1"
|
|
1225
|
+
.value=${this.as}
|
|
1226
|
+
@input=${this.asInput.bind(this)}
|
|
1227
|
+
>
|
|
1178
1228
|
<var class="math-var">A<sub class="subscript">ss</sub></var>
|
|
1179
|
-
</decidables-spinner>`,
|
|
1229
|
+
</decidables-spinner>`,Q=M`<decidables-spinner class="d ds"
|
|
1230
|
+
?disabled=${!this.interactive}
|
|
1231
|
+
min="0"
|
|
1232
|
+
step="1"
|
|
1233
|
+
.value=${this.ds}
|
|
1234
|
+
@input=${this.dsInput.bind(this)}
|
|
1235
|
+
>
|
|
1180
1236
|
<var class="math-var">D<sub class="subscript">ss</sub></var>
|
|
1181
|
-
</decidables-spinner>`,
|
|
1237
|
+
</decidables-spinner>`,F=M`<decidables-spinner class="a al"
|
|
1238
|
+
?disabled=${!this.interactive}
|
|
1239
|
+
step="1"
|
|
1240
|
+
.value=${this.al}
|
|
1241
|
+
@input=${this.alInput.bind(this)}
|
|
1242
|
+
>
|
|
1182
1243
|
<var class="math-var">A<sub class="subscript">ll</sub></var>
|
|
1183
|
-
</decidables-spinner>`,
|
|
1244
|
+
</decidables-spinner>`,t=M`<decidables-spinner class="d dl"
|
|
1245
|
+
?disabled=${!this.interactive}
|
|
1246
|
+
min="0"
|
|
1247
|
+
step="1"
|
|
1248
|
+
.value=${this.dl}
|
|
1249
|
+
@input=${this.dlInput.bind(this)}
|
|
1250
|
+
>
|
|
1184
1251
|
<var class="math-var">D<sub class="subscript">ll</sub></var>
|
|
1185
|
-
</decidables-spinner>`,
|
|
1252
|
+
</decidables-spinner>`,U=M`<decidables-spinner class="k"
|
|
1253
|
+
?disabled=${!this.interactive}
|
|
1254
|
+
min=${Xa.k.MIN}
|
|
1255
|
+
max=${Xa.k.MAX}
|
|
1256
|
+
step=${Xa.k.STEP}
|
|
1257
|
+
.value=${+this.k.toFixed(3)}
|
|
1258
|
+
@input=${this.kInput.bind(this)}
|
|
1259
|
+
>
|
|
1186
1260
|
<var class="math-var">k</var>
|
|
1187
|
-
</decidables-spinner>`,
|
|
1261
|
+
</decidables-spinner>`,I=M`<decidables-spinner class="v vs"
|
|
1262
|
+
disabled
|
|
1263
|
+
.value=${+this.vs.toFixed(2)}
|
|
1264
|
+
>
|
|
1188
1265
|
<var class="math-var">V<sub class="subscript">ss</sub></var>
|
|
1189
|
-
</decidables-spinner>`,
|
|
1266
|
+
</decidables-spinner>`,s=M`<decidables-spinner class="v vl"
|
|
1267
|
+
disabled
|
|
1268
|
+
.value=${+this.vl.toFixed(2)}
|
|
1269
|
+
>
|
|
1190
1270
|
<var class="math-var">V<sub class="subscript">ll</sub></var>
|
|
1191
|
-
</decidables-spinner>`,
|
|
1271
|
+
</decidables-spinner>`,g=M`${this.vDiff>0?M`<span class="comparison" ${Na({in:ya})}>></span>`:this.vDiff<0?M`<span class="comparison" ${Na({in:ya})}><</span>`:M`<span class="comparison" ${Na({in:ya})}>=</span>`}`):(B=M`<var class="math-var a as">A<sub class="subscript">ss</sub></var>`,Q=M`<var class="math-var d ds">D<sub class="subscript">ss</sub></var>`,F=M`<var class="math-var a al">A<sub class="subscript">ll</sub></var>`,t=M`<var class="math-var d dl">D<sub class="subscript">ll</sub></var>`,U=M`<var class="math-var k">k</var>`,I=M`<var class="math-var v vs">V<sub class="subscript">ss</sub></var>`,s=M`<var class="math-var v vl">V<sub class="subscript">ll</sub></var>`,g=M`<span class="comparison">≟</span>`);const i=M`
|
|
1192
1272
|
<tr>
|
|
1193
1273
|
<td class="underline">
|
|
1194
|
-
${
|
|
1274
|
+
${B}
|
|
1195
1275
|
</td>
|
|
1196
1276
|
<td rowspan="2">
|
|
1197
|
-
${
|
|
1277
|
+
${g}
|
|
1198
1278
|
</td>
|
|
1199
1279
|
<td class="underline">
|
|
1200
|
-
${
|
|
1280
|
+
${F}
|
|
1201
1281
|
</td>
|
|
1202
1282
|
</tr>
|
|
1203
1283
|
<tr>
|
|
1204
1284
|
<td class="">
|
|
1205
|
-
<span class="paren tight">(</span>1<span class="plus">+</span>${
|
|
1285
|
+
<span class="paren tight">(</span>1<span class="plus">+</span>${U}${Q}<span class="paren tight">)</span>
|
|
1206
1286
|
</td>
|
|
1207
1287
|
<td class="">
|
|
1208
|
-
<span class="paren tight">(</span>1<span class="plus">+</span>${
|
|
1288
|
+
<span class="paren tight">(</span>1<span class="plus">+</span>${U}${t}<span class="paren tight">)</span>
|
|
1209
1289
|
</td>
|
|
1210
1290
|
</tr>
|
|
1211
1291
|
<tr>
|
|
1212
1292
|
<td class="right">
|
|
1213
|
-
${
|
|
1293
|
+
${I}
|
|
1214
1294
|
</td>
|
|
1215
1295
|
<td>
|
|
1216
|
-
${
|
|
1296
|
+
${g}
|
|
1217
1297
|
</td>
|
|
1218
1298
|
<td class="left">
|
|
1219
|
-
${
|
|
1299
|
+
${s}
|
|
1220
1300
|
</td>
|
|
1221
1301
|
</tr>`;return M`
|
|
1222
1302
|
<div class="holder">
|
|
1223
1303
|
<table class="equation">
|
|
1224
1304
|
<tbody>
|
|
1225
|
-
${
|
|
1305
|
+
${i}
|
|
1226
1306
|
</tbody>
|
|
1227
1307
|
</table>
|
|
1228
|
-
</div>`}}customElements.define("htd-calculation",
|
|
1308
|
+
</div>`}}customElements.define("htd-calculation",Wa);class Ha 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()}}}(ia)){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=Xa.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=Xa.adk2v(B.a,B.d,this.k)})),this.v=this.options[0].v}trial(B,Q,F,t,U,I){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=t,this.trialCount=U,this.response=I,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",t="",U=!1){"default"===F&&(this.a=B,this.d=Q,this.label=t);const I=this.options.find((B=>B.name===F));void 0===I?this.options.push({name:F,a:B,d:Q,label:t,trial:U,new:U}):(I.a=B,I.d=Q,I.label=t),this.requestUpdate()}static get styles(){return[super.styles,g`
|
|
1229
1309
|
:host {
|
|
1230
1310
|
display: inline-block;
|
|
1231
1311
|
|
|
@@ -1370,7 +1450,20 @@ const xu=2;let Su=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,
|
|
|
1370
1450
|
/* HACK: This gets Safari to correctly apply the filter! */
|
|
1371
1451
|
stroke: #0000ff;
|
|
1372
1452
|
}
|
|
1373
|
-
`]}render(){return M``}willUpdate(){this.alignState()}update(t){if(super.update(t),Number.isNaN(this.width)||Number.isNaN(this.height)||Number.isNaN(this.rem))return;const e=this.width,n=this.height;let i,s;e/n>1.8?(s=n,i=1.8*s):(i=e,s=i/1.8);const c=2*this.rem,a=3*this.rem,l=3*this.rem,r=s-(c+a),o=i-(l+2*this.rem),g=parseInt(this.getComputedStyleValue("---transition-duration"),10),B=Wo().domain([this.scale.time.min,this.scale.time.max]).range([0,o]),d=Wo().domain([this.scale.value.min,this.scale.value.max]).range([r,0]),I=QQ().x((t=>B(t.d))).y((t=>d(t.v))),Q=Mn(this.renderRoot).selectAll(".main").data([{width:this.width,height:this.height,rem:this.rem}]),u=Q.enter().append("svg").classed("main",!0);u.html(pu.svgDefs);const F=u.merge(Q).attr("viewBox",`0 0 ${i} ${s}`),h=u.append("g").classed("plot",!0),b=F.select(".plot").attr("transform",`translate(${l}, ${c})`);h.append("clipPath").attr("id","clip-htd-curves").append("rect"),b.select("clipPath rect").attr("height",r+1).attr("width",o+1);const U=h.append("g").classed("underlayer",!0),C=b.select(".underlayer");U.append("rect").classed("background",!0),C.select(".background").attr("height",r).attr("width",o),U.append("g").classed("axis-x",!0);C.select(".axis-x").attr("transform",`translate(0, ${d(0)})`).transition().duration(2*g).ease(zc).call(me(B)).attr("font-size",null).attr("font-family",null).selectAll("line, path").attr("stroke",null);const y=U.append("text").classed("title-x",!0).attr("text-anchor","middle");y.append("tspan").classed("name",!0).text("Delay ("),y.append("tspan").classed("math-var d",!0).text("D"),y.append("tspan").classed("name",!0).text(")"),C.select(".title-x").attr("transform",`translate(${o/2}, ${r+2.25*this.rem})`),U.append("g").classed("axis-y",!0);var f;C.select(".axis-y").transition().duration(2*g).ease(zc).call((f=d,pe(he,f))).attr("font-size",null).attr("font-family",null).selectAll("line, path").attr("stroke",null);const G=U.append("text").classed("title-y",!0).attr("text-anchor","middle");G.append("tspan").classed("name",!0).text("Value ("),G.append("tspan").classed("math-var v",!0).text("V"),G.append("tspan").classed("name",!0).text(")"),C.select(".title-y").attr("transform",`translate(${-2*this.rem}, ${r/2})rotate(-90)`),h.append("g").classed("content",!0);const p=b.select(".content").selectAll(".option").data(this.options.filter((t=>null!==t.a&&null!==t.d)),(t=>t.name)),m=p.enter().append("g").classed("option",!0);m.append("path").classed("curve",!0).attr("clip-path","url(#clip-htd-curves)").attr("d",(t=>{const e=ge(B(t.d),B(0),-1).map((e=>({d:B.invert(e),v:_u.adk2v(t.a,t.d-B.invert(e),this.k)})));return I(e)})).attr("stroke-dasharray",((t,e,n)=>{if(t.trial){return`0,${n[e].getTotalLength()}`}return"none"})),m.append("line").classed("bar",!0).attr("x1",(t=>B(t.d))).attr("x2",(t=>B(t.d))).attr("y1",d(0)).attr("y2",(t=>d(t.a))).attr("stroke-dasharray",((t,e,n)=>{if(t.trial){return`0,${n[e].getTotalLength()}`}return"none"}));const A=m.append("g").classed("point",!0).attr("transform",(t=>`translate(${B(t.d)}, ${d(t.a)})`)).attr("opacity",(t=>t.trial?0:1));A.append("circle").classed("mark",!0),A.append("text").classed("label",!0);const x=m.merge(p);x.filter(((t,e,n)=>this.interactive&&!n[e].classList.contains("interactive"))).select(".curve").classed("interactive",!0).attr("tabindex",0).call(ni().subject((t=>({x:t.x,y:t.y}))).on("start",(t=>{Mn(t.currentTarget).classed("dragging",!0)})).on("drag",((t,e)=>{this.drag=!0;const n=e.d-B.invert(t.x),i=n<0?0:n>e.d?e.d:n,s=d.invert(t.y),c=s<=0?.001:s>e.a?e.a:s,a=_u.adv2k(e.a,i,c);this.k=a<this.scale.discount.min?this.scale.discount.min:a>this.scale.discount.max?this.scale.discount.max:this.scale.discount.round(a),this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:e.name,a:e.a,d:e.d,k:this.k,label:e.label},bubbles:!0}))})).on("end",(t=>{Mn(t.currentTarget).classed("dragging",!1)}))).on("keydown",((t,e)=>{if(["ArrowUp","ArrowDown","ArrowRight","ArrowLeft"].includes(t.key)){let n=this.k;switch(t.key){case"ArrowUp":case"ArrowLeft":n*=t.shiftKey?.95:.85;break;case"ArrowDown":case"ArrowRight":n*=t.shiftKey?1.05:1.15}n=n<this.scale.discount.min?this.scale.discount.min:n>this.scale.discount.max?this.scale.discount.max:this.scale.discount.round(n),n!==this.k&&(this.k=n,this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:e.name,a:e.a,d:e.d,k:this.k,label:e.label},bubbles:!0}))),t.preventDefault()}})),x.filter(((t,e,n)=>this.interactive&&!t.trial&&!n[e].classList.contains("interactive"))).select(".bar").classed("interactive",!0).attr("tabindex",0).call(ni().subject(((t,e)=>({x:B(e.d),y:d(e.a)}))).on("start",(t=>{Mn(t.currentTarget).classed("dragging",!0)})).on("drag",((t,e)=>{this.drag=!0;const n=B.invert(t.x);e.d=n<this.scale.time.min?this.scale.time.min:n>this.scale.time.max?this.scale.time.max:this.scale.time.round(n),"default"===e.name&&(this.d=e.d),this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:e.name,a:e.a,d:e.d,k:this.k,label:e.label},bubbles:!0}))})).on("end",(t=>{Mn(t.currentTarget).classed("dragging",!1)}))).on("keydown",((t,e)=>{if(["ArrowLeft","ArrowRight"].includes(t.key)){let n=e.d;switch(t.key){case"ArrowRight":n+=t.shiftKey?1:5;break;case"ArrowLeft":n-=t.shiftKey?1:5}n=n<this.scale.time.min?this.scale.time.min:n>this.scale.time.max?this.scale.time.max:n,n!==e.d&&(e.d=n,"default"===e.name&&(this.d=e.d),this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:e.name,a:e.a,d:e.d,k:this.k,label:e.label},bubbles:!0}))),t.preventDefault()}})),x.filter(((t,e,n)=>this.interactive&&!t.trial&&!n[e].classList.contains("interactive"))).select(".point").classed("interactive",!0).attr("tabindex",0).call(ni().subject(((t,e)=>({x:B(e.d),y:d(e.a)}))).on("start",(t=>{Mn(t.currentTarget).classed("dragging",!0)})).on("drag",((t,e)=>{this.drag=!0;const n=d.invert(t.y);e.a=n<this.scale.value.min?this.scale.value.min:n>this.scale.value.max?this.scale.value.max:this.scale.value.round(n),"default"===e.name&&(this.a=e.a),this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:e.name,a:e.a,d:e.d,k:this.k,label:e.label},bubbles:!0}))})).on("end",(t=>{Mn(t.currentTarget).classed("dragging",!1)}))).on("keydown",((t,e)=>{if(["ArrowUp","ArrowDown"].includes(t.key)){let n=e.a;switch(t.key){case"ArrowUp":n+=t.shiftKey?1:5;break;case"ArrowDown":n-=t.shiftKey?1:5}n=n<this.scale.value.min?this.scale.value.min:n>this.scale.value.max?this.scale.value.max:n,n!==e.a&&(e.a=n,"default"===e.name&&(this.a=e.a),this.alignState(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("htd-curves-change",{detail:{name:e.name,a:e.a,d:e.d,k:this.k,label:e.label},bubbles:!0}))),t.preventDefault()}})),x.filter(((t,e,n)=>!this.interactive&&n[e].classList.contains("interactive"))).select(".curve").classed("interactive",!1).attr("tabindex",null).on("drag",null).on("keydown",null),x.filter(((t,e,n)=>(!this.interactive||t.trial)&&n[e].classList.contains("interactive"))).select(".bar").classed("interactive",!1).attr("tabindex",null).on("drag",null).on("keydown",null),x.filter(((t,e,n)=>(!this.interactive||t.trial)&&n[e].classList.contains("interactive"))).select(".point").classed("interactive",!1).attr("tabindex",null).on("drag",null).on("keydown",null),x.filter((t=>t.new)).select(".curve").transition().duration(g).delay(g+g/10).ease(Tc).attrTween("stroke-dasharray",((t,e,n)=>{const i=n[e].getTotalLength();return Rs(`0,${i}`,`${i},0`)})).on("end",(t=>{t.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}))})),x.filter((t=>t.new)).select(".bar").transition().duration(g).ease(Tc).attrTween("stroke-dasharray",((t,e,n)=>{const i=n[e].getTotalLength();return Rs(`0,${i}`,`${i},${i}`)})),x.filter((t=>t.new)).select(".point").transition().duration(g/10).delay(g).ease(Tc).attrTween("opacity",(()=>Rs(0,1))),p.select(".curve").transition().duration(this.drag?0:this.firstUpdate?2*g:g).ease(zc).attrTween("d",((t,e,n)=>{const i=n[e],s=Rs(void 0!==i.a?i.a:t.a,t.a),c=Rs(void 0!==i.d?i.d:t.d,t.d);return t=>{i.a=s(t),i.d=c(t);const e=ge(B(i.d),B(0),-1).map((t=>({d:B.invert(t),v:_u.adk2v(i.a,i.d-B.invert(t),this.k)})));return I(e)}})),p.select(".bar").transition().duration(this.drag?0:this.firstUpdate?2*g:g).ease(zc).attrTween("x1",((t,e,n)=>{const i=n[e],s=Rs(void 0!==i.d?i.d:t.d,t.d);return t=>(i.d=s(t),`${B(i.d)}`)})).attrTween("x2",((t,e,n)=>{const i=n[e],s=Rs(void 0!==i.d?i.d:t.d,t.d);return t=>(i.d=s(t),`${B(i.d)}`)})).attrTween("y2",((t,e,n)=>{const i=n[e],s=Rs(void 0!==i.a?i.a:t.a,t.a);return t=>(i.a=s(t),`${d(i.a)}`)})),p.select(".point").transition().duration(this.drag?0:this.firstUpdate?2*g:g).ease(zc).attrTween("transform",((t,e,n)=>{const i=n[e],s=Rs(void 0!==i.d?i.d:t.d,t.d),c=Rs(void 0!==i.a?i.a:t.a,t.a);return t=>(i.d=s(t),i.a=c(t),`translate(${B(i.d)}, ${d(i.a)})`)})),x.select(".point .label").text((t=>t.label)),p.exit().remove(),this.drag=!1,this.firstUpdate=!1}}function qu(t){return null!=t&&!Number.isNaN(t)}function tF(t,e){return+qu(e)-+qu(t)||gt(t,e)}function eF(t,e){return+qu(e)-+qu(t)||Bt(t,e)}function nF(t){return null!=t&&""!=`${t}`}function iF(t){return isFinite(t)?t:NaN}function sF(t){return t>0&&isFinite(t)?t:NaN}function cF(t){return t<0&&isFinite(t)?t:NaN}function aF(t,e){if(t instanceof Date||(t=new Date(+t)),isNaN(t))return"function"==typeof e?e(t):e;const n=t.getUTCHours(),i=t.getUTCMinutes(),s=t.getUTCSeconds(),c=t.getUTCMilliseconds();return`${a=t.getUTCFullYear(),a<0?`-${lF(-a,6)}`:a>9999?`+${lF(a,6)}`:lF(a,4)}-${lF(t.getUTCMonth()+1,2)}-${lF(t.getUTCDate(),2)}${n||i||s||c?`T${lF(n,2)}:${lF(i,2)}${s||c?`:${lF(s,2)}${c?`.${lF(c,3)}`:""}`:""}Z`:""}`;var a}function lF(t,e){return`${t}`.padStart(e,"0")}customElements.define("htd-curves",$u);const rF=/^(?:[-+]\d{2})?\d{4}(?:-\d{2}(?:-\d{2})?)?(?:T\d{2}:\d{2}(?::\d{2}(?:\.\d{3})?)?(?:Z|[-+]\d{2}:?\d{2})?)?$/;function oF(t,e){return rF.test(t+="")?new Date(t):"function"==typeof e?e(t):e}function gF(t){if(null==t)return;return Bt(t[0],t[t.length-1])}const BF=1e3,dF=6e4,IF=36e5,QF=864e5,uF=7*QF,FF=30*QF,hF=365*QF,bF=[["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",BF],["5 seconds",5e3],["15 seconds",15e3],["30 seconds",3e4],["minute",dF],["5 minutes",3e5],["15 minutes",9e5],["30 minutes",18e5],["hour",IF],["3 hours",108e5],["6 hours",216e5],["12 hours",432e5],["day",QF],["2 days",2*QF],["week",uF],["2 weeks",2*uF],["month",FF],["3 months",3*FF],["6 months",6*FF],["year",hF],["2 years",2*hF],["5 years",5*hF],["10 years",10*hF],["20 years",20*hF],["50 years",50*hF],["100 years",100*hF]],UF=new Map([["second",BF],["minute",dF],["hour",IF],["day",QF],["monday",uF],["tuesday",uF],["wednesday",uF],["thursday",uF],["friday",uF],["saturday",uF],["sunday",uF],["week",uF],["month",FF],["year",hF]]),CF=new Map([["second",hg],["minute",bg],["hour",Cg],["day",fg],["monday",xg],["tuesday",Sg],["wednesday",Lg],["thursday",Rg],["friday",Xg],["saturday",vg],["sunday",Ag],["week",Ag],["month",Yg],["year",Jg]]),yF=new Map([["second",hg],["minute",Ug],["hour",yg],["day",pg],["monday",Eg],["tuesday",Vg],["wednesday",wg],["thursday",Wg],["friday",Hg],["saturday",Dg],["sunday",Zg],["week",Zg],["month",kg],["year",Mg]]),fF=Symbol("intervalDuration"),GF=Symbol("intervalType");for(const[t,e]of CF)e[fF]=UF.get(t),e[GF]="time";for(const[t,e]of yF)e[fF]=UF.get(t),e[GF]="utc";const pF=[["year",Mg,"utc"],["month",kg,"utc"],["day",pg,"utc",6*FF],["hour",yg,"utc",3*QF],["minute",Ug,"utc",216e5],["second",hg,"utc",18e5]],mF=[["year",Jg,"time"],["month",Yg,"time"],["day",fg,"time",6*FF],["hour",Cg,"time",3*QF],["minute",bg,"time",216e5],["second",hg,"time",18e5]],AF=[pF[0],mF[0],pF[1],mF[1],pF[2],mF[2],...pF.slice(3)];function xF(t){let e=`${t}`.toLowerCase();e.endsWith("s")&&(e=e.slice(0,-1));let n=1;const i=/^(?:(\d+)\s+)/.exec(e);switch(i&&(e=e.slice(i[0].length),n=+i[1]),e){case"quarter":e="month",n*=3;break;case"half":e="month",n*=6}let s=yF.get(e);if(!s)throw new Error(`unknown interval: ${t}`);if(n>1&&!s.every)throw new Error(`non-periodic interval: ${e}`);return[e,n]}function SF(t){return RF(xF(t),"time")}function LF(t){return RF(xF(t),"utc")}function RF([t,e],n){let i=("time"===n?CF:yF).get(t);return e>1&&(i=i.every(e),i[fF]=UF.get(t)*e,i[GF]=n),i}function XF(t,e){if(!(e>1))return;const n=t[fF];if(!bF.some((([,t])=>t===n)))return;if(n%QF==0&&QF<n&&n<FF)return;const[i]=bF[dt((([,t])=>Math.log(t))).center(bF,Math.log(n*e))];return("time"===t[GF]?SF:LF)(i)}function vF(t,e,n){const i="time"===e?tB:eB;if(null==n)return i("year"===t?"%Y":"month"===t?"%Y-%m":"day"===t?"%Y-%m-%d":"hour"===t||"minute"===t?"%Y-%m-%dT%H:%M":"second"===t?"%Y-%m-%dT%H:%M:%S":"%Y-%m-%dT%H:%M:%S.%L");const s=function(t){return"left"===t||"right"===t?(t,e)=>`\n${t}\n${e}`:"top"===t?(t,e)=>`${e}\n${t}`:(t,e)=>`${t}\n${e}`}(n);switch(t){case"millisecond":return ZF(i(".%L"),i(":%M:%S"),s);case"second":return ZF(i(":%S"),i("%-I:%M"),s);case"minute":return ZF(i("%-I:%M"),i("%p"),s);case"hour":return ZF(i("%-I %p"),i("%b %-d"),s);case"day":return ZF(i("%-d"),i("%b"),s);case"month":return ZF(i("%b"),i("%Y"),s);case"year":return i("%Y")}throw new Error("unable to format time ticks")}function NF(t,e,n){const i=Ot(function(t,e=oe){const n=[];let i,s=!1;for(const c of t)s&&n.push(e(i,c)),i=c,s=!0;return n}(e,((t,e)=>Math.abs(e-t))));if(i<1e3)return vF("millisecond","utc",n);for(const[s,c,a,l]of function(t){return"time"===t?mF:"utc"===t?pF:AF}(t)){if(i>l)break;if("hour"===s&&!i)break;if(e.every((t=>c.floor(t)>=t)))return vF(s,a,n)}}function ZF(t,e,n){return(i,s,c)=>{const a=t(i,s),l=e(i,s),r=s-gF(c);return s!==r&&void 0!==c[r]&&l===e(c[r],r)?a:n(a,l)}}const EF=Object.getPrototypeOf(Uint8Array),VF=Object.prototype.toString,wF=Symbol("reindex");function WF(t,e,n){const i=typeof e;return"string"===i?HF(t,kF(e),n):"function"===i?HF(t,e,n):"number"===i||e instanceof Date||"boolean"===i?lh(t,jF(e),n):"function"==typeof e?.transform?DF(e.transform(t),n):function(t,e){return e?hh(t,e):t}(DF(e,n),t?.[wF])}function HF(t,e,n){return lh(t,n?.prototype instanceof EF?function(t){return(e,n)=>qF(t(e,n))}(e):e,n)}function DF(t,e){return void 0===e?ah(t):t instanceof e?t:e.prototype instanceof EF&&!(t instanceof EF)?e.from(t,qF):e.from(t)}const YF=[null],kF=t=>e=>e[t],JF={transform:Fh},MF={transform:t=>t},TF=()=>1,zF=()=>!0,KF=t=>null==t?t:`${t}`,OF=t=>null==t?t:+t,_F=t=>t?t[0]:void 0,PF=t=>t?t[1]:void 0,jF=t=>()=>t;function $F(t){return t instanceof EF?t:lh(t,qF,Float64Array)}function qF(t){return null==t?NaN:Number(t)}function th(t){return lh(t,eh)}function eh(t){return t instanceof Date&&!isNaN(t)?t:"string"==typeof t?oF(t):null==t||isNaN(t=+t)?void 0:new Date(t)}function nh(t,e){return void 0===t&&(t=e),null===t?[void 0,"none"]:Wh(t)?[void 0,t]:[t,void 0]}function ih(t,e){return void 0===t&&(t=e),null===t||"number"==typeof t?[void 0,t]:[t,void 0]}function sh(t,e,n){if(null!=t)return ch(t,e,n)}function ch(t,e,n){const i=`${t}`.toLowerCase();if(!n.includes(i))throw new Error(`invalid ${e}: ${t}`);return i}function ah(t){return null==t||t instanceof Array||t instanceof EF?t:Array.from(t)}function lh(t,e,n=Array){return null==t?t:t instanceof n?t.map(e):n.from(t,e)}function rh(t,e=Array){return t instanceof e?t.slice():e.from(t)}function oh({y:t,y1:e,y2:n}){return void 0!==t||void 0!==e||void 0!==n}function gh(t){return t?.toString===VF}function Bh(t){return gh(t)&&(void 0!==t.type||void 0!==t.domain)}function dh(t){return gh(t)&&"function"!=typeof t.transform}function Ih(t){return dh(t)&&void 0===t.value&&void 0===t.channel}function Qh(t,e){return void 0===t&&void 0===e?[_F,PF]:[t,e]}function uh({z:t,fill:e,stroke:n}={}){return void 0===t&&([t]=nh(e)),void 0===t&&([t]=nh(n)),t}function Fh(t){const e=t.length,n=new Uint32Array(e);for(let t=0;t<e;++t)n[t]=t;return n}function hh(t,e){return lh(e,(e=>t[e]),t.constructor)}function bh(t,e,n){return t.subarray?t.subarray(e,n):t.slice(e,n)}function Uh(t){return null!==t&&"object"==typeof t?t.valueOf():t}function Ch(t){let e;return[{transform:()=>e,label:fh(t)},t=>e=t]}function yh(t){return null==t?[t]:Ch(t)}function fh(t,e){return"string"==typeof t?t:t&&void 0!==t.label?t.label:e}function Gh(t,e){return{transform(n){const i=t.transform(n),s=e.transform(n);return Nh(i)||Nh(s)?lh(i,((t,e)=>new Date((+i[e]+ +s[e])/2))):lh(i,((t,e)=>(+i[e]+ +s[e])/2),Float64Array)},label:t.label}}function ph(t,e){const n=mh(e?.interval,e?.type);return n?lh(t,n):t}function mh(t,e){const n=Ah(t,e);return n&&(t=>qu(t)?n.floor(t):t)}function Ah(t,e){if(null!=t){if("number"==typeof t){0<t&&t<1&&Number.isInteger(1/t)&&(t=-1/t);const e=Math.abs(t);return t<0?{floor:t=>Math.floor(t*e)/e,offset:t=>(t*e+1)/e,range:(t,n)=>ge(Math.ceil(t*e),n*e).map((t=>t/e))}:{floor:t=>Math.floor(t/e)*e,offset:t=>t+e,range:(t,n)=>ge(Math.ceil(t/e),n/e).map((t=>t*e))}}if("string"==typeof t)return("time"===e?SF:LF)(t);if("function"!=typeof t.floor)throw new Error("invalid interval; missing floor method");if("function"!=typeof t.offset)throw new Error("invalid interval; missing offset method");return t}}function xh(t,e){if((t=Ah(t,e))&&"function"!=typeof t.range)throw new Error("invalid interval: missing range method");return t}function Sh(t){return"function"==typeof t?.range}function Lh(t){return void 0===t||dh(t)?t:{value:t}}function Rh(t){return t&&"function"==typeof t[Symbol.iterator]}function Xh(t){for(const e of t)if(null!=e)return"object"!=typeof e||e instanceof Date}function vh(t){for(const e of t){if(null==e)continue;const t=typeof e;return"string"===t||"boolean"===t}}function Nh(t){for(const e of t)if(null!=e)return e instanceof Date}function Zh(t){for(const e of t)if(null!=e)return"string"==typeof e&&isNaN(e)&&oF(e)}function Eh(t){for(const e of t)if(null!=e){if("string"!=typeof e)return!1;if(e.trim())return!isNaN(e)}}function Vh(t,e){let n;for(const i of t)if(null!=i){if(!e(i))return!1;n=!0}return n}const wh=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 Wh(t){return"string"==typeof t&&(t=t.toLowerCase().trim(),/^#[0-9a-f]{3,8}$/.test(t)||/^(?:url|var|rgb|rgba|hsl|hsla|hwb|lab|lch|oklab|oklch|color|color-mix)\(.*\)$/.test(t)||wh.has(t))}function Hh(t){return"number"==typeof t&&(0<=t&&t<=1||isNaN(t))}function Dh(t){return null==t||Yh(t)}function Yh(t){return/^\s*none\s*$/i.test(t)}function kh(t,e){return sh(t,e,["middle","top-left","top","top-right","right","bottom-right","bottom","bottom-left","left"])}function Jh(t="middle"){return kh(t,"frameAnchor")}function Mh(t){return Rh(t)?function(t){console.warn("named iterables are deprecated; please use an object instead");const e=new Set;return Object.fromEntries(Array.from(t,(t=>{const{name:n}=t;if(null==n)throw new Error("missing name");const i=`${n}`;if("__proto__"===i)throw new Error(`illegal name: ${i}`);if(e.has(i))throw new Error(`duplicate name: ${i}`);return e.add(i),[n,t]})))}(t):t}function Th(t){return!0===t?t="frame":!1===t?t=null:null!=t&&(t=ch(t,"clip",["frame","sphere"])),t}const zh=Symbol("position"),Kh=Symbol("color"),Oh=Symbol("radius"),_h=Symbol("length"),Ph=Symbol("opacity"),jh=Symbol("symbol"),$h=Symbol("projection"),qh=new Map([["x",zh],["y",zh],["fx",zh],["fy",zh],["r",Oh],["color",Kh],["opacity",Ph],["symbol",jh],["length",_h],["projection",$h]]);const tb=2/Math.sqrt(3),eb=new Map([["asterisk",hQ],["circle",bQ],["cross",UQ],["diamond",fQ],["diamond2",GQ],["hexagon",{draw(t,e){const n=Math.sqrt(e/Math.PI),i=n*tb,s=i/2;t.moveTo(0,i),t.lineTo(n,s),t.lineTo(n,-s),t.lineTo(0,-i),t.lineTo(-n,-s),t.lineTo(-n,s),t.closePath()}}],["plus",pQ],["square",mQ],["square2",AQ],["star",RQ],["times",DQ],["triangle",vQ],["triangle2",ZQ],["wye",HQ]]);function nb(t){return t&&"function"==typeof t.draw}function ib(t){return!!nb(t)||"string"==typeof t&&eb.has(t.toLowerCase())}function sb(t){if(null==t||nb(t))return t;const e=eb.get(`${t}`.toLowerCase());if(e)return e;throw new Error(`invalid symbol: ${t}`)}function cb({filter:t,sort:e,reverse:n,transform:i,initializer:s,...c}={},a){if(void 0===i&&(null!=t&&(i=ob(t)),null==e||Ih(e)||(i=lb(i,Bb(e))),n&&(i=lb(i,gb))),null!=a&&null!=s)throw new Error("transforms cannot be applied after initializers");return{...c,...(null===e||Ih(e))&&{sort:e},transform:lb(i,a)}}function ab({filter:t,sort:e,reverse:n,initializer:i,...s}={},c){return void 0===i&&(null!=t&&(i=ob(t)),null==e||Ih(e)||(i=rb(i,Bb(e))),n&&(i=rb(i,gb))),{...s,...(null===e||Ih(e))&&{sort:e},initializer:rb(i,c)}}function lb(t,e){return null==t?null===e?void 0:e:null==e?null===t?void 0:t:function(n,i,s){return({data:n,facets:i}=t.call(this,n,i,s)),e.call(this,ah(n),i,s)}}function rb(t,e){return null==t?null===e?void 0:e:null==e?null===t?void 0:t:function(n,i,s,...c){let a,l,r,o,g,B;return({data:l=n,facets:r=i,channels:a}=t.call(this,n,i,s,...c)),({data:g=l,facets:B=r,channels:o}=e.call(this,l,r,{...s,...a},...c)),{data:g,facets:B,channels:{...a,...o}}}}function ob(t){return(e,n)=>{const i=WF(e,t);return{data:e,facets:n.map((t=>t.filter((t=>i[t]))))}}}function gb(t,e){return{data:t,facets:e.map((t=>t.slice().reverse()))}}function Bb(t){return("function"==typeof t&&1!==t.length?db:Ib)(t)}function db(t){return(e,n)=>{const i=(n,i)=>t(e[n],e[i]);return{data:e,facets:n.map((t=>t.slice().sort(i)))}}}function Ib(t){let e,n;({channel:e,value:t,order:n}={...Lh(t)});const i=e?.startsWith("-");if(i&&(e=e.slice(1)),void 0===n&&(n=i?eF:tF),"function"!=typeof n)switch(`${n}`.toLowerCase()){case"ascending":n=tF;break;case"descending":n=eF;break;default:throw new Error(`invalid order: ${n}`)}return(i,s,c)=>{let a;if(void 0===e)a=WF(i,t);else{if(void 0===c)throw new Error("channel sort requires an initializer");if(a=c[e],!a)return{};a=a.value}const l=(t,e)=>n(a[t],a[e]);return{data:i,facets:s.map((t=>t.slice().sort(l)))}}}function Qb(t,...e){for(const{name:n}of t)if(e.includes(n))return!0;return!1}function ub(t,e,n,i=Fb){let s;gh(e)&&"reduce"in e&&(s=e.scale,e=e.reduce);const c=i(t,e,n),[a,l]=Ch(c.label);let r;return{name:t,output:void 0===s?a:{value:a,scale:s},initialize(t){c.initialize(t),r=l([])},scope(t,e){c.scope(t,e)},reduce(t,e){r.push(c.reduce(t,e))}}}function Fb(t,e,n,i=bb){const s=function(t,e){if(void 0!==e[t])return e[t];switch(t){case"x1":case"x2":t="x";break;case"y1":case"y2":t="y"}return e[t]}(t,n),c=i(e,s);let a,l;return{label:fh(c===Ab?null:s,c.label),initialize(t){a=void 0===s?t:WF(t,s),"data"===c.scope&&(l=c.reduceIndex(Fh(t),a))},scope(t,e){c.scope===t&&(l=c.reduceIndex(e,a))},reduce:(t,e)=>null==c.scope?c.reduceIndex(t,a,e):c.reduceIndex(t,a,l,e)}}function hb(t,e){return e?vt(t,(t=>e[t])):[[,t]]}function bb(t,e,n=Ub){if(null==t)return n(t);if("function"==typeof t.reduceIndex)return t;if("function"==typeof t.reduce&&gh(t))return function(t){return console.warn("deprecated reduce interface; implement reduceIndex instead."),{...t,reduceIndex:t.reduce.bind(t)}}(t);if("function"==typeof t)return function(t){return{reduceIndex:(e,n,i)=>t(hh(n,e),i)}}(t);if(/^p\d{2}$/i.test(t))return Cb(function(t){const e=+`${t}`.slice(1)/100;return(t,n)=>ee(t,e,n)}(t));switch(`${t}`.toLowerCase()){case"first":return Gb;case"last":return mb;case"identity":return fb;case"count":return Ab;case"distinct":return xb;case"sum":return null==e?Ab:Sb;case"proportion":return Lb(e,"data");case"proportion-facet":return Lb(e,"facet");case"deviation":return Cb(ft);case"min":return Cb(Pt);case"min-index":return Cb(jt);case"max":return Cb(Ot);case"max-index":return Cb(_t);case"mean":return yb(ce);case"median":return yb(ae);case"variance":return Cb(yt);case"mode":return Cb(re)}return n(t)}function Ub(t){throw new Error(`invalid reduce: ${t}`)}function Cb(t){return{reduceIndex:(e,n)=>t(e,(t=>n[t]))}}function yb(t){return{reduceIndex(e,n){const i=t(e,(t=>n[t]));return Nh(n)?new Date(i):i}}}const fb={reduceIndex:(t,e)=>hh(e,t)},Gb={reduceIndex:(t,e)=>e[t[0]]},pb={reduceIndex(t,e){const n=Vt(Nt(t,(t=>t.length),(t=>e[t])),PF),i=n.slice(-5).reverse();if(i.length<n.length){const t=n.slice(0,-4);i[4]=[`… ${t.length.toLocaleString("en-US")} more`,Be(t,PF)]}return i.map((([t,e])=>`${t} (${e.toLocaleString("en-US")})`)).join("\n")}},mb={reduceIndex:(t,e)=>e[t[t.length-1]]},Ab={label:"Frequency",reduceIndex:t=>t.length},xb={label:"Distinct",reduceIndex(t,e){const n=new At;for(const i of t)n.add(e[i]);return n.size}},Sb=Cb(Be);function Lb(t,e){return null==t?{scope:e,label:"Frequency",reduceIndex:(t,e,n=1)=>t.length/n}:{scope:e,reduceIndex:(t,e,n=1)=>Be(t,(t=>e[t]))/n}}const Rb={reduceIndex:(t,e,{z:n})=>n};function Xb(t,{scale:e,type:n,value:i,filter:s,hint:c,label:a=fh(i)},l){return void 0===c&&"function"==typeof i?.transform&&(c=i.hint),vb(l,{scale:e,type:n,value:WF(t,i),label:a,filter:s,hint:c})}function vb(t,e){const{scale:n,value:i}=e;if(!0===n||"auto"===n)switch(t){case"fill":case"stroke":case"color":e.scale=!0!==n&&Vh(i,Wh)?null:"color";break;case"fillOpacity":case"strokeOpacity":case"opacity":e.scale=!0!==n&&Vh(i,Hh)?null:"opacity";break;case"symbol":!0!==n&&Vh(i,ib)?(e.scale=null,e.value=lh(i,sb)):e.scale="symbol";break;default:e.scale=qh.has(t)?t:null}else if(!1===n)e.scale=null;else if(null!=n&&!qh.has(n))throw new Error(`unknown scale: ${n}`);return e}function Nb(t,e){for(const n in t){const i=t[n];if(i.scale===e)return i}}function Zb(t,e){const n=t.original;if(n===t)return e;const i=e.value,s=e.value=[];for(let e=0;e<n.length;++e){const c=i[n[e][0]];for(const n of t[e])s[n]=c}return e}function Eb(t,e,n){const i=Vb(t,e);return lh(Vb(t,n),((t,e)=>Math.abs(t-i[e])),Float64Array)}function Vb(t,e,n){let i=t[e];if(i||void 0===n||(i=t[n]),i)return i.value;throw new Error(`missing channel: ${e}`)}function wb(t){if(null==t||"function"==typeof t)return t;switch(`${t}`.toLowerCase()){case"ascending":return Wb;case"descending":return Hb}throw new Error(`invalid order: ${t}`)}function Wb([t,e],[n,i]){return tF(e,i)||tF(t,n)}function Hb([t,e],[n,i]){return eF(e,i)||tF(t,n)}function Db(t,e){let n=t[e];if(n){for(;n.source;)n=n.source;return null===n.source?null:n}}function Yb(t={}){const{document:e=("undefined"!=typeof window?window.document:void 0),clip:n}=t;return{document:e,clip:Th(n)}}function kb(t,{document:e}){return Mn(Ve(t).call(e.documentElement))}let Jb,Mb=0;function Tb(t){t!==Jb&&(Jb=t,console.warn(t),++Mb)}const zb=Math.PI,Kb=2*zb,Ob=.618;function _b({projection:t,inset:e=0,insetTop:n=e,insetRight:i=e,insetBottom:s=e,insetLeft:c=e}={},a){if(null==t)return;if("function"==typeof t.stream)return t;let l,r,o="frame";if(gh(t)){let e;if(({type:t,domain:r,inset:e,insetTop:n=(void 0!==e?e:n),insetRight:i=(void 0!==e?e:i),insetBottom:s=(void 0!==e?e:s),insetLeft:c=(void 0!==e?e:c),clip:o=o,...l}=t),null==t)return}"function"!=typeof t&&({type:t}=Pb(t));const{width:g,height:B,marginLeft:d,marginRight:I,marginTop:Q,marginBottom:u}=a,F=g-d-I-c-i,h=B-Q-u-n-s;if(t=t?.({width:F,height:h,clip:o,...l}),null==t)return;o=function(t,e,n,i,s){if(!1===t||null==t||"number"==typeof t)return t=>t;!0===t&&(t="frame");if("frame"===`${t}`.toLowerCase())return bl(e,n,i,s);throw new Error(`unknown projection clip type: ${t}`)}(o,d,Q,g-I,B-u);let b,U=d+c,C=Q+n;if(null!=r){const[[e,n],[i,s]]=yr(t).bounds(r),c=Math.min(F/(i-e),h/(s-n));c>0?(U-=(c*(e+i)-F)/2,C-=(c*(n+s)-h)/2,b=fr({point(t,e){this.stream.point(t*c+U,e*c+C)}})):Tb("Warning: the projection could not be fit to the specified domain; using the default scale.")}return b??=0===U&&0===C?qb():fr({point(t,e){this.stream.point(t+U,e+C)}}),{stream:e=>t.stream(b.stream(o(e)))}}function Pb(t){switch(`${t}`.toLowerCase()){case"albers-usa":return jb(Yr,.7463,.4673);case"albers":return $b(Dr,.7463,.4673);case"azimuthal-equal-area":return jb(Tr,4,4);case"azimuthal-equidistant":return jb(Kr,Kb,Kb);case"conic-conformal":return $b(qr,Kb,Kb);case"conic-equal-area":return $b(Hr,6.1702,2.9781);case"conic-equidistant":return $b(io,7.312,3.6282);case"equal-earth":return jb(go,5.4133,2.6347);case"equirectangular":return jb(eo,Kb,zb);case"gnomonic":return jb(Io,3.4641,3.4641);case"identity":return{type:qb};case"reflect-y":return{type:tU};case"mercator":return jb(_r,Kb,Kb);case"orthographic":return jb(uo,2,2);case"stereographic":return jb(ho,2,2);case"transverse-mercator":return jb(Uo,Kb,Kb);default:throw new Error(`unknown projection type: ${t}`)}}function jb(t,e,n){return{type:({width:i,height:s,rotate:c,precision:a=.15,clip:l})=>{const r=t();return null!=a&&r.precision?.(a),null!=c&&r.rotate?.(c),"number"==typeof l&&r.clipAngle?.(l),r.scale(Math.min(i/e,s/n)),r.translate([i/2,s/2]),r},aspectRatio:n/e}}function $b(t,e,n){const{type:i,aspectRatio:s}=jb(t,e,n);return{type:t=>{const{parallels:e,domain:n,width:s,height:c}=t,a=i(t);return null!=e&&(a.parallels(e),void 0===n&&a.fitSize([s,c],{type:"Sphere"})),a},aspectRatio:s}}const qb=jF({stream:t=>t}),tU=jF(fr({point(t,e){this.stream.point(t,-e)}}));function eU(t,e,n,i){const s=n[t],c=n[e],a=s.length,l=n[t]=new Float64Array(a).fill(NaN),r=n[e]=new Float64Array(a).fill(NaN);let o;const g=i.stream({point(t,e){l[o]=t,r[o]=e}});for(o=0;o<a;++o)g.point(s[o],c[o])}function nU({projection:t}={}){return null!=t&&("function"==typeof t.stream||(gh(t)&&(t=t.type),null!=t))}function iU(t){const e=[],n=[],i={scale:"x",value:e},s={scale:"y",value:n},c={point(t,i){e.push(t),n.push(i)},lineStart(){},lineEnd(){},polygonStart(){},polygonEnd(){},sphere(){}};for(const e of t.value)Ma(e,c);return[i,s]}const sU=new Map([["accent",Rd],["category10",Ld],["dark2",Xd],["observable10",vd],["paired",Nd],["pastel1",Zd],["pastel2",Ed],["set1",Vd],["set2",wd],["set3",Wd],["tableau10",Hd]]);const cU=new Map([...sU,["brbg",lU(Yd,kd)],["prgn",lU(Jd,Md)],["piyg",lU(Td,zd)],["puor",lU(Kd,Od)],["rdbu",lU(_d,Pd)],["rdgy",lU(jd,$d)],["rdylbu",lU(qd,tI)],["rdylgn",lU(eI,nI)],["spectral",lU(iI,sI)],["burd",rU(_d,Pd)],["buylrd",rU(qd,tI)],["blues",aU(LI,RI)],["greens",aU(XI,vI)],["greys",aU(NI,ZI)],["oranges",aU(HI,DI)],["purples",aU(EI,VI)],["reds",aU(wI,WI)],["turbo",oU(jI)],["viridis",oU(qI)],["magma",oU(tQ)],["inferno",oU(eQ)],["plasma",oU(nQ)],["cividis",oU(YI)],["cubehelix",oU(kI)],["warm",oU(JI)],["cool",oU(MI)],["bugn",aU(cI,aI)],["bupu",aU(lI,rI)],["gnbu",aU(oI,gI)],["orrd",aU(BI,dI)],["pubu",aU(uI,FI)],["pubugn",aU(II,QI)],["purd",aU(hI,bI)],["rdpu",aU(UI,CI)],["ylgn",aU(GI,pI)],["ylgnbu",aU(yI,fI)],["ylorbr",aU(mI,AI)],["ylorrd",aU(xI,SI)],["rainbow",gU(zI)],["sinebow",gU(PI)]]);function aU(t,e){return({length:n})=>1===n?[t[3][1]]:2===n?[t[3][1],t[3][2]]:(n=Math.max(3,Math.floor(n)))>9?Ms(e,n):t[n]}function lU(t,e){return({length:n})=>2===n?[t[3][0],t[3][2]]:(n=Math.max(3,Math.floor(n)))>11?Ms(e,n):t[n]}function rU(t,e){return({length:n})=>2===n?[t[3][2],t[3][0]]:(n=Math.max(3,Math.floor(n)))>11?Ms((t=>e(1-t)),n):t[n].slice().reverse()}function oU(t){return({length:e})=>Ms(t,Math.max(2,Math.floor(e)))}function gU(t){return({length:e})=>Ms(t,Math.floor(e)+1).slice(0,-1)}function BU(t){const e=`${t}`.toLowerCase();if(!cU.has(e))throw new Error(`unknown ordinal scheme: ${e}`);return cU.get(e)}function dU(t,e){const n=BU(t),i="function"==typeof n?n({length:e}):n;return i.length!==e?i.slice(0,e):i}const IU=new Map([["brbg",kd],["prgn",Md],["piyg",zd],["puor",Od],["rdbu",Pd],["rdgy",$d],["rdylbu",tI],["rdylgn",nI],["spectral",sI],["burd",t=>Pd(1-t)],["buylrd",t=>tI(1-t)],["blues",RI],["greens",vI],["greys",ZI],["purples",VI],["reds",WI],["oranges",DI],["turbo",jI],["viridis",qI],["magma",tQ],["inferno",eQ],["plasma",nQ],["cividis",YI],["cubehelix",kI],["warm",JI],["cool",MI],["bugn",aI],["bupu",rI],["gnbu",gI],["orrd",dI],["pubugn",QI],["pubu",FI],["purd",bI],["rdpu",CI],["ylgnbu",fI],["ylgn",pI],["ylorbr",AI],["ylorrd",SI],["rainbow",zI],["sinebow",PI]]);function QU(t){const e=`${t}`.toLowerCase();if(!IU.has(e))throw new Error(`unknown quantitative scheme: ${e}`);return IU.get(e)}const uU=new Set(["brbg","prgn","piyg","puor","rdbu","rdgy","rdylbu","rdylgn","spectral","burd","buylrd"]);const FU=t=>e=>t(1-e),hU=[0,1],bU=new Map([["number",ms],["rgb",Us],["hsl",Hs],["hcl",Ds],["lab",function(t,e){var n=bs((t=_i(t)).l,(e=_i(e)).l),i=bs(t.a,e.a),s=bs(t.b,e.b),c=bs(t.opacity,e.opacity);return function(e){return t.l=n(e),t.a=i(e),t.b=s(e),t.opacity=c(e),t+""}}]]);function UU(t){const e=`${t}`.toLowerCase();if(!bU.has(e))throw new Error(`unknown interpolator: ${e}`);return bU.get(e)}function CU(t,e,n,{type:i,nice:s,clamp:c,zero:a,domain:l=xU(t,n),unknown:r,round:o,scheme:g,interval:B,range:d=(qh.get(t)===Oh?LU(n,l):qh.get(t)===_h?RU(n,l):qh.get(t)===Ph?hU:void 0),interpolate:I=(qh.get(t)===Kh?null==g&&void 0!==d?Us:QU(void 0!==g?g:"cyclical"===i?"rainbow":"turbo"):o?Xs:ms),reverse:Q}){if(B=xh(B,i),"cyclical"!==i&&"sequential"!==i||(i="linear"),"function"!=typeof I&&(I=UU(I)),Q=!!Q,void 0!==d){if((l=ah(l)).length!==(d=ah(d)).length){if(1===I.length)throw new Error("invalid piecewise interpolator");I=Js(I,d),d=void 0}}if(1===I.length?(Q&&(I=FU(I),Q=!1),void 0===d&&(d=Float64Array.from(l,((t,e)=>e/(l.length-1))),2===d.length&&(d=hU)),e.interpolate((d===hU?jF:NU)(I))):e.interpolate(I),a){const[t,e]=Gt(l);(t>0||e<0)&&(gF(l=rh(l))!==Math.sign(t)?l[l.length-1]=0:l[0]=0)}return Q&&(l=de(l)),e.domain(l).unknown(r),s&&(e.nice(function(t,e){return!0===t?void 0:"number"==typeof t?t:function(t,e){if((t=xh(t,e))&&"function"!=typeof t.ceil)throw new Error("invalid interval: missing ceil method");return t}(t,e)}(s,i)),l=e.domain()),void 0!==d&&e.range(d),c&&e.clamp(c),{type:i,domain:l,range:d,scale:e,interpolate:I,interval:B}}function yU(t,e,{exponent:n=1,...i}){return CU(t,ig().exponent(n),e,{...i,type:"pow"})}function fU(t,e,{base:n=10,domain:i=XU(e),...s}){return CU(t,Oo().base(n),e,{...s,domain:i})}function GU(t,e,{constant:n=1,...i}){return CU(t,$o().constant(n),e,i)}function pU(t,e,{range:n,quantiles:i=(void 0===n?5:(n=[...n]).length),n:s=i,scheme:c="rdylbu",domain:a=vU(e),unknown:l,interpolate:r,reverse:o}){return void 0===n&&(n=void 0!==r?Ms(r,s):qh.get(t)===Kh?dU(c,s):void 0),a.length>0&&(a=sg(a,void 0===n?{length:s}:n).quantiles()),mU(t,e,{domain:a,range:n,reverse:o,unknown:l})}function mU(t,e,{domain:n=[0],unknown:i,scheme:s="rdylbu",interpolate:c,range:a=(void 0!==c?Ms(c,n.length+1):qh.get(t)===Kh?dU(s,n.length+1):void 0),reverse:l}){const r=gF(n=ah(n));if(!isNaN(r)&&!function(t,e){for(let n=1,i=t.length,s=t[0];n<i;++n){const i=Bt(s,s=t[n]);if(0!==i&&i!==e)return!1}return!0}(n,r))throw new Error(`the ${t} scale has a non-monotonic domain`);return l&&(a=de(a)),{type:"threshold",scale:cg(r<0?de(n):n,void 0===a?[]:a).unknown(i),domain:n,range:a}}function AU(t,e=iF){return t.length?[Pt(t,(({value:t})=>void 0===t?t:Pt(t,e))),Ot(t,(({value:t})=>void 0===t?t:Ot(t,e)))]:[0,1]}function xU(t,e){const n=qh.get(t);return(n===Oh||n===Ph||n===_h?SU:AU)(e)}function SU(t){return[0,t.length?Ot(t,(({value:t})=>void 0===t?t:Ot(t,iF))):1]}function LU(t,e){const n=t.find((({radius:t})=>void 0!==t));if(void 0!==n)return[0,n.radius];const i=ee(t,.5,(({value:t})=>void 0===t?NaN:ee(t,.25,sF))),s=e.map((t=>3*Math.sqrt(t/i))),c=30/Ot(s);return c<1?s.map((t=>t*c)):s}function RU(t,e){const n=ae(t,(({value:t})=>void 0===t?NaN:ae(t,Math.abs))),i=e.map((t=>12*t/n)),s=60/Ot(i);return s<1?i.map((t=>t*s)):i}function XU(t){for(const{value:e}of t)if(void 0!==e)for(let n of e){if(n>0)return AU(t,sF);if(n<0)return AU(t,cF)}return[1,10]}function vU(t){const e=[];for(const{value:n}of t)if(void 0!==n)for(const t of n)e.push(t);return e}function NU(t){return(e,n)=>i=>t(e+i*(n-e))}function ZU(t,e,n,i,{type:s,nice:c,clamp:a,domain:l=AU(i),unknown:r,pivot:o=0,scheme:g,range:B,symmetric:d=!0,interpolate:I=(qh.get(t)===Kh?null==g&&void 0!==B?Us:QU(void 0!==g?g:"rdbu"):ms),reverse:Q}){o=+o,l=ah(l);let[u,F]=l;if(l.length>2&&Tb(`Warning: the diverging ${t} scale domain contains extra elements.`),Bt(u,F)<0&&([u,F]=[F,u],Q=!Q),u=Math.min(u,o),F=Math.max(F,o),"function"!=typeof I&&(I=UU(I)),void 0!==B&&(I=1===I.length?NU(I)(...B):Js(I,B)),Q&&(I=FU(I)),d){const t=n.apply(o),e=t-n.apply(u),i=n.apply(F)-t;e<i?u=n.invert(t-i):e>i&&(F=n.invert(t+e))}return e.domain([u,o,F]).unknown(r).interpolator(I),a&&e.clamp(a),c&&e.nice(c),{type:s,domain:[u,F],pivot:o,interpolate:I,scale:e}}function EU(t,e,n){return ZU(t,pd(),HU,e,n)}function VU(t,e,{exponent:n=1,...i}){return ZU(t,xd().exponent(n=+n),function(t){return.5===t?YU:{apply:e=>Math.sign(e)*Math.pow(Math.abs(e),t),invert:e=>Math.sign(e)*Math.pow(Math.abs(e),1/t)}}(n),e,{...i,type:"diverging-pow"})}function wU(t,e,{base:n=10,pivot:i=1,domain:s=AU(e,i<0?cF:sF),...c}){return ZU(t,md().base(n=+n),DU,e,{domain:s,pivot:i,...c})}function WU(t,e,{constant:n=1,...i}){return ZU(t,Ad().constant(n=+n),function(t){return{apply:e=>Math.sign(e)*Math.log1p(Math.abs(e/t)),invert:e=>Math.sign(e)*Math.expm1(Math.abs(e))*t}}(n),e,i)}const HU={apply:t=>t,invert:t=>t},DU={apply:Math.log,invert:Math.exp},YU={apply:t=>Math.sign(t)*Math.sqrt(Math.abs(t)),invert:t=>Math.sign(t)*(t*t)};function kU(t,e,n,i){return CU(t,e,n,i)}function JU(t,e,n){return kU(t,function(){return Co.apply(yd(Og,_g,Jg,Yg,Ag,fg,Cg,bg,hg,tB).domain([new Date(2e3,0,1),new Date(2e3,0,2)]),arguments)}(),e,n)}function MU(t,e,n){return kU(t,function(){return Co.apply(yd(zg,Kg,Mg,kg,Zg,Gg,yg,Ug,hg,eB).domain([Date.UTC(2e3,0,1),Date.UTC(2e3,0,2)]),arguments)}(),e,n)}const TU=Symbol("ordinal");function zU(t,e,n,{type:i,interval:s,domain:c,range:a,reverse:l,hint:r}){return s=xh(s,i),void 0===c&&(c=_U(n,s,t)),"categorical"!==i&&i!==TU||(i="ordinal"),l&&(c=de(c)),c=e.domain(c).domain(),void 0!==a&&("function"==typeof a&&(a=a(c)),e.range(a)),{type:i,domain:c,range:a,scale:e,hint:r,interval:s}}function KU(t,e,{type:n,interval:i,domain:s,range:c,scheme:a,unknown:l,...r}){let o;if(i=xh(i,n),void 0===s&&(s=_U(e,i,t)),qh.get(t)===jh)o=function(t){return{fill:PU(t,"fill"),stroke:PU(t,"stroke")}}(e),c=void 0===c?function(t){return Dh(t.fill)?kQ:YQ}(o):lh(c,sb);else if(qh.get(t)===Kh&&(void 0!==c||"ordinal"!==n&&n!==TU||(c=function(t,e="greys"){const n=new Set,[i,s]=dU(e,2);for(const e of t)if(null!=e)if(!0===e)n.add(s);else{if(!1!==e)return;n.add(i)}return[...n]}(s,a),void 0!==c&&(a=void 0)),void 0===a&&void 0===c&&(a="ordinal"===n?"turbo":"observable10"),void 0!==a))if(void 0!==c){const t=QU(a),e=c[0],n=c[1]-c[0];c=({length:i})=>Ms((i=>t(e+n*i)),i)}else c=BU(a);if(l===fo)throw new Error(`implicit unknown on ${t} scale is not supported`);return zU(t,Go().unknown(l),e,{...r,type:n,domain:s,range:c,hint:o})}function OU(t,e,n,i){let{round:s}=n;return void 0!==s&&t.round(s=!!s),(t=zU(i,t,e,n)).round=s,t}function _U(t,e,n){const i=new At;for(const{value:e,domain:n}of t){if(void 0!==n)return n();if(void 0!==e)for(const t of e)i.add(t)}if(void 0!==e){const[t,n]=Gt(i).map(e.floor,e);return e.range(t,e.offset(n))}if(i.size>1e4&&qh.get(n)===zh)throw new Error(`implicit ordinal domain of ${n} scale has more than 10,000 values`);return Vt(i,tF)}function PU(t,e){let n;for(const{hint:i}of t){const t=i?.[e];if(void 0!==t)if(void 0===n)n=t;else if(n!==t)return}return n}function jU(t,{label:e,inset:n=0,insetTop:i=n,insetRight:s=n,insetBottom:c=n,insetLeft:a=n,round:l,nice:r,clamp:o,zero:g,align:B,padding:d,projection:I,facet:{label:Q=e}={},...u}={}){const F={};for(const[n,h]of t){const t=u[n],b=aC(n,h,{round:qh.get(n)===zh?l:void 0,nice:r,clamp:o,zero:g,align:B,padding:d,projection:I,...t});if(b){let{label:l=("fx"===n||"fy"===n?Q:e),percent:r,transform:o,inset:g,insetTop:B=(void 0!==g?g:"y"===n?i:0),insetRight:d=(void 0!==g?g:"x"===n?s:0),insetBottom:I=(void 0!==g?g:"y"===n?c:0),insetLeft:u=(void 0!==g?g:"x"===n?a:0)}=t||{};if(null==o)o=void 0;else if("function"!=typeof o)throw new Error("invalid scale transform; not a function");b.percent=!!r,b.label=void 0===l?qU(h,b):l,b.transform=o,"x"===n||"fx"===n?(b.insetLeft=+u,b.insetRight=+d):"y"!==n&&"fy"!==n||(b.insetTop=+B,b.insetBottom=+I),F[n]=b}}return F}function $U(t){const e={},n={scales:e};for(const[i,s]of Object.entries(t)){const{scale:t,type:c,interval:a,label:l}=s;e[i]=FC(s),n[i]=t,t.type=c,null!=a&&(t.interval=a),null!=l&&(t.label=l)}return n}function qU(t=[],e){let n;for(const{label:e}of t)if(void 0!==e)if(void 0===n)n=e;else if(n!==e)return;if(void 0!==n)return!BC(e)&&e.percent&&(n=`${n} (%)`),{inferred:!0,toString:()=>n}}function tC(t){const{marginTop:e,marginRight:n,marginBottom:i,marginLeft:s,width:c,height:a,facet:{marginTop:l,marginRight:r,marginBottom:o,marginLeft:g}}=t;return{marginTop:Math.max(e,l),marginRight:Math.max(n,r),marginBottom:Math.max(i,o),marginLeft:Math.max(s,g),width:c,height:a}}function eC({fx:t,fy:e},n){const{marginTop:i,marginRight:s,marginBottom:c,marginLeft:a,width:l,height:r}=tC(n);return{marginTop:i,marginRight:s,marginBottom:c,marginLeft:a,width:t?t.scale.bandwidth()+a+s:l,height:e?e.scale.bandwidth()+i+c:r,facet:{width:l,height:r}}}function nC(t,e){if(void 0===t.range){const{insetLeft:n,insetRight:i}=t,{width:s,marginLeft:c=0,marginRight:a=0}=e,l=c+n,r=s-a-i;t.range=[l,Math.max(l,r)],BC(t)||(t.range=cC(t)),t.scale.range(t.range)}sC(t)}function iC(t,e){if(void 0===t.range){const{insetTop:n,insetBottom:i}=t,{height:s,marginTop:c=0,marginBottom:a=0}=e,l=c+n,r=s-a-i;t.range=[Math.max(l,r),l],BC(t)?t.range.reverse():t.range=cC(t),t.scale.range(t.range)}sC(t)}function sC(t){void 0===t.round&&function({type:t}){return"point"===t||"band"===t}(t)&&function({scale:t}){const e=t.domain().length,[n,i]=t.range(),s=t.paddingInner?t.paddingInner():1,c=t.paddingOuter?t.paddingOuter():t.padding(),a=e-s,l=Math.abs(i-n)/Math.max(1,a+2*c);return(l-Math.floor(l))*a}(t)<=30&&t.scale.round(!0)}function cC(t){const e=t.scale.domain().length+dC(t);if(!(e>2))return t.range;const[n,i]=t.range;return Array.from({length:e},((t,s)=>n+s/(e-1)*(i-n)))}function aC(t,e=[],n={}){const i=function(t,e,{type:n,domain:i,range:s,scheme:c,pivot:a,projection:l}){if(n=rC(n),"fx"===t||"fy"===t)return"band";"x"!==t&&"y"!==t||null==l||(n=oC);for(const t of e){const e=rC(t.type);if(void 0!==e)if(void 0===n)n=e;else if(n!==e)throw new Error(`scale incompatible with channel: ${n} !== ${e}`)}if(n===oC)return;if(void 0!==n)return n;if(void 0===i&&!e.some((({value:t})=>void 0!==t)))return;const r=qh.get(t);if(r===Oh)return"sqrt";if(r===Ph||r===_h)return"linear";if(r===jh)return"ordinal";if((i||s||[]).length>2)return gC(r);if(void 0!==i){if(vh(i))return gC(r);if(Nh(i))return"utc"}else{const t=e.map((({value:t})=>t)).filter((t=>void 0!==t));if(t.some(vh))return gC(r);if(t.some(Nh))return"utc"}if(r===Kh){if(null!=a||function(t){return null!=t&&uU.has(`${t}`.toLowerCase())}(c))return"diverging";if(function(t){return null!=t&&sU.has(`${t}`.toLowerCase())}(c))return"categorical"}return"linear"}(t,e,n);if(void 0===n.type&&void 0===n.domain&&void 0===n.range&&null==n.interval&&"fx"!==t&&"fy"!==t&&BC({type:i})){const n=e.map((({value:t})=>t)).filter((t=>void 0!==t));n.some(Nh)?Tb(`Warning: some data associated with the ${t} scale are dates. Dates are typically associated with a "utc" or "time" scale rather than a "${lC(i)}" 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 ${t} scale (e.g., d3.utcDay), or you can suppress this warning by setting the type of the ${t} scale to "${lC(i)}".`):n.some(Zh)?Tb(`Warning: some data associated with the ${t} 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 "${lC(i)}" 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 ${t} scale to "${lC(i)}".`):n.some(Eh)&&Tb(`Warning: some data associated with the ${t} 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 "${lC(i)}" scale. If you want to treat this data as ordinal, you can specify the interval of the ${t} scale (e.g., 1 for integers), or you can suppress this warning by setting the type of the ${t} scale to "${lC(i)}".`)}switch(n.type=i,i){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":n=QC(e,n,$F);break;case"identity":switch(qh.get(t)){case zh:n=QC(e,n,$F);break;case jh:n=QC(e,n,uC)}break;case"utc":case"time":n=QC(e,n,th)}switch(i){case"diverging":return EU(t,e,n);case"diverging-sqrt":return function(t,e,n){return VU(t,e,{...n,exponent:.5})}(t,e,n);case"diverging-pow":return VU(t,e,n);case"diverging-log":return wU(t,e,n);case"diverging-symlog":return WU(t,e,n);case"categorical":case"ordinal":case TU:return KU(t,e,n);case"cyclical":case"sequential":case"linear":return function(t,e,n){return CU(t,Wo(),e,n)}(t,e,n);case"sqrt":return function(t,e,n){return yU(t,e,{...n,exponent:.5})}(t,e,n);case"threshold":return mU(t,0,n);case"quantile":return pU(t,e,n);case"quantize":return function(t,e,{range:n,n:i=(void 0===n?5:(n=[...n]).length),scheme:s="rdylbu",domain:c=xU(t,e),unknown:a,interpolate:l,reverse:r}){const[o,g]=Gt(c);let B;return void 0===n?(B=Mt(o,g,i),B[0]<=o&&B.splice(0,1),B[B.length-1]>=g&&B.pop(),i=B.length+1,n=void 0!==l?Ms(l,i):qh.get(t)===Kh?dU(s,i):void 0):(B=Ms(ms(o,g),i+1).slice(1,-1),o instanceof Date&&(B=B.map((t=>new Date(t))))),gF(ah(c))<0&&B.reverse(),mU(t,0,{domain:B,range:n,reverse:r,unknown:a})}(t,e,n);case"pow":return yU(t,e,n);case"log":return fU(t,e,n);case"symlog":return GU(t,e,n);case"utc":return MU(t,e,n);case"time":return JU(t,e,n);case"point":return function(t,e,{align:n=.5,padding:i=.5,...s}){return OU(Ao().align(n).padding(i),e,s,t)}(t,e,n);case"band":return function(t,e,{align:n=.5,padding:i=.1,paddingInner:s=i,paddingOuter:c=("fx"===t||"fy"===t?0:i),...a}){return OU(po().align(n).paddingInner(s).paddingOuter(c),e,a,t)}(t,e,n);case"identity":return function(t){return{type:"identity",scale:(e=qh.get(t),e===zh||e===Oh||e===_h||e===Ph?Ho():t=>t)};var e}(t);case void 0:return;default:throw new Error(`unknown scale type: ${i}`)}}function lC(t){return"symbol"==typeof t?t.description:t}function rC(t){return"string"==typeof t?`${t}`.toLowerCase():t}const oC={toString:()=>"projection"};function gC(t){switch(t){case zh:return"point";case Kh:return TU;default:return"ordinal"}}function BC({type:t}){return"ordinal"===t||"point"===t||"band"===t||t===TU}function dC({type:t}){return"threshold"===t}function IC(t){if(void 0===t)return!0;const e=t.domain(),n=t(e[0]);for(let i=1,s=e.length;i<s;++i)if(t(e[i])-n)return!1;return!0}function QC(t,{domain:e,...n},i){for(const n of t)void 0!==n.value&&(void 0===e&&(e=n.value?.domain),n.value=i(n.value));return{domain:void 0===e?e:i(e),...n}}function uC(t){return lh(t,sb)}function FC({scale:t,type:e,domain:n,range:i,interpolate:s,interval:c,transform:a,percent:l,pivot:r}){if("identity"===e)return{type:"identity",apply:t=>t,invert:t=>t};const o=t.unknown?t.unknown():void 0;return{type:e,domain:rh(n),...void 0!==i&&{range:rh(i)},...void 0!==a&&{transform:a},...l&&{percent:l},...void 0!==o&&{unknown:o},...void 0!==c&&{interval:c},...void 0!==s&&{interpolate:s},...t.clamp&&{clamp:t.clamp()},...void 0!==r&&{pivot:r,symmetric:!1},...t.base&&{base:t.base()},...t.exponent&&{exponent:t.exponent()},...t.constant&&{constant:t.constant()},...t.align&&{align:t.align(),round:t.round()},...t.padding&&(t.paddingInner?{paddingInner:t.paddingInner(),paddingOuter:t.paddingOuter()}:{padding:t.padding()}),...t.bandwidth&&{bandwidth:t.bandwidth(),step:t.step()},apply:e=>t(e),...t.invert&&{invert:e=>t.invert(e)}}}const hC=function(t){let e,n;return(...i)=>((n?.length!==i.length||n.some(((t,e)=>t!==i[e])))&&(n=i,e=t(...i)),e)}((t=>new Intl.NumberFormat(t)));function bC(t){return aF(t,"Invalid Date")}const UC=function(t="en-US"){const e=function(t="en-US"){const e=hC(t);return t=>null==t||isNaN(t)?void 0:e.format(t)}(t);return t=>(t instanceof Date?bC:"number"==typeof t?e:KF)(t)}(),CC=("undefined"!=typeof window?window.devicePixelRatio>1:"undefined"==typeof it)?0:.5;let yC=0;function fC(){return"plot-clip-"+ ++yC}function GC(t,{title:e,href:n,ariaLabel:i,ariaDescription:s,ariaHidden:c,target:a,fill:l,fillOpacity:r,stroke:o,strokeWidth:g,strokeOpacity:B,strokeLinejoin:d,strokeLinecap:I,strokeMiterlimit:Q,strokeDasharray:u,strokeDashoffset:F,opacity:h,mixBlendMode:b,imageFilter:U,paintOrder:C,pointerEvents:y,shapeRendering:f,channels:G},{ariaLabel:p,fill:m="currentColor",fillOpacity:A,stroke:x="none",strokeOpacity:S,strokeWidth:L,strokeLinecap:R,strokeLinejoin:X,strokeMiterlimit:v,paintOrder:N}){null===m&&(l=null,r=null),null===x&&(o=null,B=null),Dh(m)?Dh(x)||Dh(l)&&!G?.fill||(x="none"):!Dh(x)||Dh(o)&&!G?.stroke||(m="none");const[Z,E]=nh(l,m),[V,w]=ih(r,A),[W,H]=nh(o,x),[D,Y]=ih(B,S),[k,J]=ih(h);Yh(H)||(void 0===g&&(g=L),void 0===I&&(I=R),void 0===d&&(d=X),void 0!==Q||/^\s*round\s*$/i.test(d)||(Q=v),Yh(E)||void 0!==C||(C=N));const[M,T]=ih(g);return null!==m&&(t.fill=ZC(E,"currentColor"),t.fillOpacity=EC(w,1)),null!==x&&(t.stroke=ZC(H,"none"),t.strokeWidth=EC(T,1),t.strokeOpacity=EC(Y,1),t.strokeLinejoin=ZC(d,"miter"),t.strokeLinecap=ZC(I,"butt"),t.strokeMiterlimit=EC(Q,4),t.strokeDasharray=ZC(u,"none"),t.strokeDashoffset=ZC(F,"0")),t.target=KF(a),t.ariaLabel=KF(p),t.ariaDescription=KF(s),t.ariaHidden=KF(c),t.opacity=EC(J,1),t.mixBlendMode=ZC(b,"normal"),t.imageFilter=ZC(U,"none"),t.paintOrder=ZC(C,"normal"),t.pointerEvents=ZC(y,"auto"),t.shapeRendering=ZC(f,"auto"),{title:{value:e,optional:!0,filter:null},href:{value:n,optional:!0,filter:null},ariaLabel:{value:i,optional:!0,filter:null},fill:{value:Z,scale:"auto",optional:!0},fillOpacity:{value:V,scale:"auto",optional:!0},stroke:{value:W,scale:"auto",optional:!0},strokeOpacity:{value:D,scale:"auto",optional:!0},strokeWidth:{value:M,optional:!0},opacity:{value:k,scale:"auto",optional:!0}}}function pC(t,e){e&&t.text((t=>UC(e[t])))}function mC(t,e){e&&t.text((([t])=>UC(e[t])))}function AC(t,{target:e,tip:n},{ariaLabel:i,title:s,fill:c,fillOpacity:a,stroke:l,strokeOpacity:r,strokeWidth:o,opacity:g,href:B}){i&&vC(t,"aria-label",(t=>i[t])),c&&vC(t,"fill",(t=>c[t])),a&&vC(t,"fill-opacity",(t=>a[t])),l&&vC(t,"stroke",(t=>l[t])),r&&vC(t,"stroke-opacity",(t=>r[t])),o&&vC(t,"stroke-width",(t=>o[t])),g&&vC(t,"opacity",(t=>g[t])),B&&XC(t,(t=>B[t]),e),n||function(t,e){e&&t.filter((t=>nF(e[t]))).append("title").call(pC,e)}(t,s)}function xC(t,{target:e,tip:n},{ariaLabel:i,title:s,fill:c,fillOpacity:a,stroke:l,strokeOpacity:r,strokeWidth:o,opacity:g,href:B}){i&&vC(t,"aria-label",(([t])=>i[t])),c&&vC(t,"fill",(([t])=>c[t])),a&&vC(t,"fill-opacity",(([t])=>a[t])),l&&vC(t,"stroke",(([t])=>l[t])),r&&vC(t,"stroke-opacity",(([t])=>r[t])),o&&vC(t,"stroke-width",(([t])=>o[t])),g&&vC(t,"opacity",(([t])=>g[t])),B&&XC(t,(([t])=>B[t]),e),n||function(t,e){e&&t.filter((([t])=>nF(e[t]))).append("title").call(mC,e)}(t,s)}function*SC(t,e,n,i){const{z:s}=n,{z:c}=i,a=function({ariaLabel:t,title:e,fill:n,fillOpacity:i,stroke:s,strokeOpacity:c,strokeWidth:a,opacity:l,href:r},{tip:o}){return[t,o?void 0:e,n,i,s,c,a,l,r].filter((t=>void 0!==t))}(i,n),l=[...e,...a];for(const e of c?function(t,e,n){const i=vt(t,(t=>e[t]));return void 0===n&&i.size>1+t.length>>1&&Tb("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."),i.values()}(t,c,s):[t]){let t,n;t:for(const i of e){for(const t of l)if(!qu(t[i])){n&&n.push(-1);continue t}if(void 0!==t){n.push(i);for(let e=0;e<a.length;++e){if(Uh(a[e][i])!==t[e]){yield n,t=a.map((t=>Uh(t[i]))),n=[i];continue t}}}else n&&(yield n),t=a.map((t=>Uh(t[i]))),n=[i]}n&&(yield n)}}function LC(t,e,n,i){!function(t,e,n,i){let s;const{clip:c=i.clip}=e;switch(c){case"frame":{const{width:e,height:c,marginLeft:a,marginRight:l,marginTop:r,marginBottom:o}=n,g=fC();s=`url(#${g})`,t=kb("svg:g",i).call((t=>t.append("svg:clipPath").attr("id",g).append("rect").attr("x",a).attr("y",r).attr("width",e-l-a).attr("height",c-r-o))).each((function(){this.appendChild(t.node()),t.node=()=>this}));break}case"sphere":{const{projection:e}=i;if(!e)throw new Error('the "sphere" clip option requires a projection');const n=fC();s=`url(#${n})`,t.append("clipPath").attr("id",n).append("path").attr("d",yr(e)({type:"Sphere"}));break}}vC(t,"aria-label",e.ariaLabel),vC(t,"aria-description",e.ariaDescription),vC(t,"aria-hidden",e.ariaHidden),vC(t,"clip-path",s)}(t,e,n,i),vC(t,"fill",e.fill),vC(t,"fill-opacity",e.fillOpacity),vC(t,"stroke",e.stroke),vC(t,"stroke-width",e.strokeWidth),vC(t,"stroke-opacity",e.strokeOpacity),vC(t,"stroke-linejoin",e.strokeLinejoin),vC(t,"stroke-linecap",e.strokeLinecap),vC(t,"stroke-miterlimit",e.strokeMiterlimit),vC(t,"stroke-dasharray",e.strokeDasharray),vC(t,"stroke-dashoffset",e.strokeDashoffset),vC(t,"shape-rendering",e.shapeRendering),vC(t,"filter",e.imageFilter),vC(t,"paint-order",e.paintOrder);const{pointerEvents:s=(!1===i.pointerSticky?"none":void 0)}=e;vC(t,"pointer-events",s)}function RC(t,e){!function(t,e,n){null!=n&&t.style(e,n)}(t,"mix-blend-mode",e.mixBlendMode),vC(t,"opacity",e.opacity)}function XC(t,e,n){t.each((function(t){const i=e(t);if(null!=i){const t=this.ownerDocument.createElementNS(ve.svg,"a");t.setAttribute("fill","inherit"),t.setAttributeNS(ve.xlink,"href",i),null!=n&&t.setAttribute("target",n),this.parentNode.insertBefore(t,this).appendChild(this)}}))}function vC(t,e,n){null!=n&&t.attr(e,n)}function NC(t,e,{x:n,y:i},s=CC,c=CC){s+=e.dx,c+=e.dy,n?.bandwidth&&(s+=n.bandwidth()/2),i?.bandwidth&&(c+=i.bandwidth()/2),(s||c)&&t.attr("transform",`translate(${s},${c})`)}function ZC(t,e){if((t=KF(t))!==e)return t}function EC(t,e){if((t=OF(t))!==e)return t}const VC=/^-?([_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 wC(t){if(void 0===t)return"plot-d6a7b5";if(t=`${t}`,!VC.test(t))throw new Error(`invalid class name: ${t}`);return t}function WC(t,e){if("string"==typeof e)t.property("style",e);else if(null!=e)for(const n of t)Object.assign(n.style,e)}function HC({frameAnchor:t},{width:e,height:n,marginTop:i,marginRight:s,marginBottom:c,marginLeft:a}){return[/left$/.test(t)?a:/right$/.test(t)?e-s:(a+e-s)/2,/^top/.test(t)?i:/^bottom/.test(t)?n-c:(i+n-c)/2]}function DC({x:t,y:e,fy:n,fx:i},{projection:s,aspectRatio:c},{width:a,marginTopDefault:l,marginRightDefault:r,marginBottomDefault:o,marginLeftDefault:g}){const B=n?n.scale.domain().length:1,d=function(t){if("function"==typeof t?.stream)return Ob;if(gh(t)&&(t=t.type),null!=t){if("function"!=typeof t){const{aspectRatio:e}=Pb(t);if(e)return e}return Ob}}(s);if(d){const t=(1.1*B-.1)/(1.1*(i?i.scale.domain().length:1)-.1)*d,e=Math.max(.1,Math.min(10,t));return Math.round((a-g-r)*e+l+o)}const I=e?BC(e)?e.scale.domain().length:Math.max(7,17/B):1;if(null!=c){if(c=+c,!(isFinite(c)&&c>0))throw new Error(`invalid aspectRatio: ${c}`);const s=YC("y",e)/(YC("x",t)*c),B=i?i.scale.bandwidth():1,d=n?n.scale.bandwidth():1;return(s*(B*(a-g-r)-t.insetLeft-t.insetRight)+e.insetTop+e.insetBottom)/d+l+o}return!(!e&&!n)*Math.max(1,Math.min(60,I*B))*20+30*!!i+60}function YC(t,e){if(!e)throw new Error(`aspectRatio requires ${t} scale`);const{type:n,domain:i}=e;let s;switch(n){case"linear":case"utc":case"time":s=Number;break;case"pow":{const t=e.scale.exponent();s=e=>Math.pow(e,t);break}case"log":s=Math.log;break;case"point":case"band":return i.length;default:throw new Error(`unsupported ${t} scale for aspectRatio: ${n}`)}const[c,a]=Gt(i);return Math.abs(s(a)-s(c))}function kC(t,e){const{fx:n,fy:i}=jU(t,e),s=n?.scale.domain(),c=i?.scale.domain();return s&&c?function(...t){const e="function"==typeof t[t.length-1]&&function(t){return e=>t(...e)}(t.pop()),n=(t=t.map(Ut)).map(ht),i=t.length-1,s=new Array(i+1).fill(0),c=[];if(i<0||n.some(bt))return c;for(;;){c.push(s.map(((e,n)=>t[n][e])));let a=i;for(;++s[a]===n[a];){if(0===a)return e?c.map(e):c;s[a--]=0}}}(s,c).map((([t,e],n)=>({x:t,y:e,i:n}))):s?s.map(((t,e)=>({x:t,i:e}))):c?c.map(((t,e)=>({y:t,i:e}))):void 0}function JC(t,{fx:e,fy:n}){const i=Fh(t),s=e?.value,c=n?.value;return e&&n?Nt(i,(t=>(t.fx=s[t[0]],t.fy=c[t[0]],t)),(t=>s[t]),(t=>c[t])):e?Nt(i,(t=>(t.fx=s[t[0]],t)),(t=>s[t])):Nt(i,(t=>(t.fy=c[t[0]],t)),(t=>c[t]))}function MC(t){const e=[],n=new Uint32Array(Be(t,(t=>t.length)));for(const i of t){let s=0;for(const e of t)i!==e&&(n.set(e,s),s+=e.length);e.push(n.slice(0,s))}return e}const TC=new Map([["top",PC],["right",qC],["bottom",jC],["left",$C],["top-left",ty(PC,$C)],["top-right",ty(PC,qC)],["bottom-left",ty(jC,$C)],["bottom-right",ty(jC,qC)],["top-empty",function(t,{y:e},{x:n,y:i,empty:s}){if(s)return!1;if(!e)return;const c=OC(e,i);if(c>0)return _C(t,n,e[c-1])}],["right-empty",function(t,{x:e},{x:n,y:i,empty:s}){if(s)return!1;if(!e)return;const c=OC(e,n);if(c<e.length-1)return _C(t,e[c+1],i)}],["bottom-empty",function(t,{y:e},{x:n,y:i,empty:s}){if(s)return!1;if(!e)return;const c=OC(e,i);if(c<e.length-1)return _C(t,n,e[c+1])}],["left-empty",function(t,{x:e},{x:n,y:i,empty:s}){if(s)return!1;if(!e)return;const c=OC(e,n);if(c>0)return _C(t,e[c-1],i)}],["empty",function(t,e,{empty:n}){return n}]]);const zC=new WeakMap;function KC(t){let e=zC.get(t);return e||zC.set(t,e=new mt(lh(t,((t,e)=>[t,e])))),e}function OC(t,e){return KC(t).get(e)}function _C(t,e,n){return function(t,e,n){return e=Uh(e),n=Uh(n),t.find((t=>Object.is(Uh(t.x),e)&&Object.is(Uh(t.y),n)))}(t,e,n)?.empty}function PC(t,{y:e},{y:n}){return!e||0===OC(e,n)}function jC(t,{y:e},{y:n}){return!e||OC(e,n)===e.length-1}function $C(t,{x:e},{x:n}){return!e||0===OC(e,n)}function qC(t,{x:e},{x:n}){return!e||OC(e,n)===e.length-1}function ty(t,e){return function(){return t.apply(null,arguments)&&e.apply(null,arguments)}}function ey(t,{channels:{fx:e,fy:n},groups:i}){return e&&n?t.map((({x:t,y:e})=>i.get(t)?.get(e)??[])):e?t.map((({x:t})=>i.get(t)??[])):t.map((({y:t})=>i.get(t)??[]))}class ny{constructor(t,e={},n={},i){const{facet:s="auto",facetAnchor:c,fx:a,fy:l,sort:r,dx:o=0,dy:g=0,margin:B=0,marginTop:d=B,marginRight:I=B,marginBottom:Q=B,marginLeft:u=B,clip:F=i?.clip,channels:h,tip:b,render:U}=n;if(this.data=t,this.sort=Ih(r)?r:null,this.initializer=ab(n).initializer,this.transform=this.initializer?n.transform:cb(n).transform,null===s||!1===s?this.facet=null:(this.facet=ch(!0===s?"include":s,"facet",["auto","include","exclude","super"]),this.fx=t===YF&&"string"==typeof a?[a]:a,this.fy=t===YF&&"string"==typeof l?[l]:l),this.facetAnchor=function(t){if(null==t)return null;const e=TC.get(`${t}`.toLowerCase());if(e)return e;throw new Error(`invalid facet anchor: ${t}`)}(c),e=Mh(e),void 0!==h&&(e={...cy(h),...e}),void 0!==i&&(e={...GC(this,n,i),...e}),this.channels=Object.fromEntries(Object.entries(e).map((([e,n])=>{if(dh(n.value)){const{value:t,label:e=n.label,scale:i=n.scale}=n.value;n={...n,label:e,scale:i,value:t}}if(t===YF&&"string"==typeof n.value){const{value:t}=n;n={...n,value:[t]}}return[e,n]})).filter((([t,{value:e,optional:n}])=>{if(null!=e)return!0;if(n)return!1;throw new Error(`missing channel value: ${t}`)}))),this.dx=+o,this.dy=+g,this.marginTop=+d,this.marginRight=+I,this.marginBottom=+Q,this.marginLeft=+u,this.clip=Th(F),this.tip=function(t){return!0===t?"xy":!1===t||null==t?null:"string"==typeof t?ch(t,"tip",["x","y","xy"]):t}(b),"super"===this.facet){if(a||l)throw new Error("super-faceting cannot use fx or fy");for(const t in this.channels){const{scale:n}=e[t];if("x"===n||"y"===n)throw new Error("super-faceting cannot use x or y")}}null!=U&&(this.render=sy(U,this.render))}initialize(t,e,n){let i=ah(this.data);void 0===t&&null!=i&&(t=[Fh(i)]);const s=t;null!=this.transform&&(({facets:t,data:i}=this.transform(i,t,n)),i=ah(i)),void 0!==t&&(t.original=s);const c=function(t,e){return Object.fromEntries(Object.entries(t).map((([t,n])=>[t,Xb(e,n,t)])))}(this.channels,i);return null!=this.sort&&function(t,e,n,i,s){const{order:c,reverse:a,reduce:l=!0,limit:r}=s;for(const o in s){if(!qh.has(o))continue;let{value:g,order:B=c,reverse:d=a,reduce:I=l,limit:Q=r}=Lh(s[o]);const u=g?.startsWith("-");if(u&&(g=g.slice(1)),B=void 0===B?u!==("width"===g||"height"===g)?Hb:Wb:wb(B),null==I||!1===I)continue;const F="fx"===o||"fy"===o?Zb(e,i[o]):Nb(n,o);if(!F)throw new Error(`missing channel for scale: ${o}`);const h=F.value,[b=0,U=1/0]=Rh(Q)?Q:Q<0?[Q]:[0,Q];if(null==g)F.domain=()=>{let t=Array.from(new At(h));return d&&(t=t.reverse()),0===b&&U===1/0||(t=t.slice(b,U)),t};else{const e="data"===g?t:"height"===g?Eb(n,"y1","y2"):"width"===g?Eb(n,"x1","x2"):Vb(n,g,"y"===g?"y2":"x"===g?"x2":void 0),i=bb(!0===I?"max":I,e);F.domain=()=>{let t=Zt(Fh(h),(t=>i.reduceIndex(t,e)),(t=>h[t]));return B&&t.sort(B),d&&t.reverse(),0===b&&U===1/0||(t=t.slice(b,U)),t.map(_F)}}}}(i,t,c,e,this.sort),{data:i,facets:t,channels:c}}filter(t,e,n){for(const i in e){const{filter:s=qu}=e[i];if(null!==s){const e=n[i];t=t.filter((t=>s(e[t])))}}return t}project(t,e,n){for(const i in t)if("x"===t[i].scale&&/^x|x$/.test(i)){const s=i.replace(/^x|x$/,"y");s in t&&"y"===t[s].scale&&eU(i,s,e,n.projection)}}scale(t,e,n){const i=function(t,e){const n=Object.fromEntries(Object.entries(t).map((([t,{scale:n,value:i}])=>{const s=null==n?null:e[n];return[t,null==s?i:lh(i,s)]})));return n.channels=t,n}(t,e);return n.projection&&this.project(t,i,n),i}}function iy(...t){return t.plot=ny.prototype.plot,t}function sy(t,e){if(null==t)return null===e?void 0:e;if(null==e)return null===t?void 0:t;if("function"!=typeof t)throw new TypeError(`invalid render transform: ${t}`);if("function"!=typeof e)throw new TypeError(`invalid render transform: ${e}`);return function(n,i,s,c,a,l){return t.call(this,n,i,s,c,a,((t,n,i,s,c)=>e.call(this,t,n,i,s,c,l)))}}function cy(t){return Object.fromEntries(Object.entries(Mh(t)).map((([t,e])=>(void 0===(e="string"==typeof e?{value:e,label:t}:Lh(e)).filter&&null==e.scale&&(e={...e,filter:null}),[t,e]))))}function ay(t,e){return!0===t?.tip?{...t,tip:e}:gh(t?.tip)&&void 0===t.tip.pointer?{...t,tip:{...t.tip,pointer:e}}:t}const ly=new WeakMap;function ry(t,e,{x:n,y:i,px:s,py:c,maxRadius:a=40,channels:l,render:r,...o}={}){return a=+a,null!=s&&(n??=null,l={...l,px:{value:s,scale:"x"}}),null!=c&&(i??=null,l={...l,py:{value:c,scale:"y"}}),{x:n,y:i,channels:l,...o,render:sy((function(n,i,s,c,l,r){const o=(l={...l,pointerSticky:!1}).ownerSVGElement,{data:g}=l.getMarkState(this);let B=ly.get(o);B||ly.set(o,B={sticky:!1,roots:[],renders:[]});let d=B.renders.push(v)-1;const{x:I,y:Q,fx:u,fy:F}=i;let h=u?u(n.fx)-c.marginLeft:0,b=F?F(n.fy)-c.marginTop:0;I?.bandwidth&&(h+=I.bandwidth()/2),Q?.bandwidth&&(b+=Q.bandwidth()/2);const U=null!=n.fi;let C;if(U){let t=B.facetStates;t||(B.facetStates=t=new Map),C=t.get(this),C||t.set(this,C=new Map)}const[y,f]=HC(this,c),{px:G,py:p}=s,m=G?t=>G[t]:dy(s,y),A=p?t=>p[t]:Iy(s,f);let x,S,L,R;function X(t,e){if(U){if(R&&(R=cancelAnimationFrame(R)),null!=t)return C.set(n.fi,e),void(R=requestAnimationFrame((()=>{R=null;for(const[i,s]of C)if(s<e||s===e&&i<n.fi){t=null;break}v(t)})));C.delete(n.fi)}v(t)}function v(t){if(x===t&&L===B.sticky)return;x=t,L=l.pointerSticky=B.sticky;const e=null==x?[]:[x];U&&(e.fx=n.fx,e.fy=n.fy,e.fi=n.fi);const a=r(e,i,s,c,l);if(S){if(U){const t=S.parentNode,e=S.getAttribute("transform"),n=a.getAttribute("transform");e?a.setAttribute("transform",e):a.removeAttribute("transform"),n?t.setAttribute("transform",n):t.removeAttribute("transform"),a.removeAttribute("aria-label"),a.removeAttribute("aria-description"),a.removeAttribute("aria-hidden")}S.replaceWith(a)}return B.roots[d]=S=a,null==x&&C?.size>1||l.dispatchValue(null==x?null:g[x]),a}function N(i){if(B.sticky||"mouse"===i.pointerType&&1===i.buttons)return;let[s,l]=Tn(i);s-=h,l-=b;const r=s<c.marginLeft||s>c.width-c.marginRight?1:t,o=l<c.marginTop||l>c.height-c.marginBottom?1:e;let g=null,d=a*a;for(const t of n){const e=r*(m(t)-s),n=o*(A(t)-l),i=e*e+n*n;i<=d&&(g=t,d=i)}if(null!=g&&(1!==t||1!==e)){const t=m(g)-s,e=A(g)-l;d=t*t+e*e}X(g,d)}return o.addEventListener("pointerenter",N),o.addEventListener("pointermove",N),o.addEventListener("pointerdown",(function(t){"mouse"===t.pointerType&&null!=x&&(B.sticky&&B.roots.some((e=>e?.contains(t.target)))||(B.sticky?(B.sticky=!1,B.renders.forEach((t=>t(null)))):(B.sticky=!0,v(x)),t.stopImmediatePropagation()))})),o.addEventListener("pointerleave",(function(t){"mouse"===t.pointerType&&(B.sticky||X(null))})),v(null)}),r)}}function oy(t){return ry(1,1,t)}function gy(t){return ry(1,.01,t)}function By(t){return ry(.01,1,t)}function dy({x1:t,x2:e,x:n=t},i){return t&&e?n=>(t[n]+e[n])/2:n?t=>n[t]:()=>i}function Iy({y1:t,y2:e,y:n=t},i){return t&&e?n=>(t[n]+e[n])/2:n?t=>n[t]:()=>i}function Qy(t){return BC(t)&&void 0===t.interval?void 0:"tabular-nums"}const uy=Math.PI/180;function Fy(t,{marker:e,markerStart:n=e,markerMid:i=e,markerEnd:s=e}={}){t.markerStart=hy(n),t.markerMid=hy(i),t.markerEnd=hy(s)}function hy(t){if(null==t||!1===t)return null;if(!0===t)return Cy;if("function"==typeof t)return t;switch(`${t}`.toLowerCase()){case"none":return null;case"arrow":return by("auto");case"arrow-reverse":return by("auto-start-reverse");case"dot":return Uy;case"circle":case"circle-fill":return Cy;case"circle-stroke":return yy;case"tick":return fy("auto");case"tick-x":return fy(90);case"tick-y":return fy(0)}throw new Error(`invalid marker: ${t}`)}function by(t){return(e,n)=>kb("svg:marker",n).attr("viewBox","-5 -5 10 10").attr("markerWidth",6.67).attr("markerHeight",6.67).attr("orient",t).attr("fill","none").attr("stroke",e).attr("stroke-width",1.5).attr("stroke-linecap","round").attr("stroke-linejoin","round").call((t=>t.append("path").attr("d","M-1.5,-3l3,3l-3,3"))).node()}function Uy(t,e){return kb("svg:marker",e).attr("viewBox","-5 -5 10 10").attr("markerWidth",6.67).attr("markerHeight",6.67).attr("fill",t).attr("stroke","none").call((t=>t.append("circle").attr("r",2.5))).node()}function Cy(t,e){return kb("svg:marker",e).attr("viewBox","-5 -5 10 10").attr("markerWidth",6.67).attr("markerHeight",6.67).attr("fill",t).attr("stroke","var(--plot-background)").attr("stroke-width",1.5).call((t=>t.append("circle").attr("r",3))).node()}function yy(t,e){return kb("svg:marker",e).attr("viewBox","-5 -5 10 10").attr("markerWidth",6.67).attr("markerHeight",6.67).attr("fill","var(--plot-background)").attr("stroke",t).attr("stroke-width",1.5).call((t=>t.append("circle").attr("r",3))).node()}function fy(t){return(e,n)=>kb("svg:marker",n).attr("viewBox","-3 -3 6 6").attr("markerWidth",6).attr("markerHeight",6).attr("orient",t).attr("stroke",e).call((t=>t.append("path").attr("d","M0,-3v6"))).node()}let Gy=0;function py(t,e,{stroke:n},i){return Ay(t,e,n&&(t=>n[t]),i)}function my(t,e,{stroke:n},i){return Ay(t,e,n&&(([t])=>n[t]),i)}function Ay(t,{markerStart:e,markerMid:n,markerEnd:i,stroke:s},c=(()=>s),a){const l=new Map;function r(t){return function(e){const n=c(e);let i=l.get(t);i||l.set(t,i=new Map);let s=i.get(n);if(!s){const e=this.parentNode.insertBefore(t(n,a),this),c="plot-marker-"+ ++Gy;e.setAttribute("id",c),i.set(n,s=`url(#${c})`)}return s}}e&&t.attr("marker-start",r(e)),n&&t.attr("marker-mid",r(n)),i&&t.attr("marker-end",r(i))}function xy({inset:t,insetLeft:e,insetRight:n,...i}={}){return[e,n]=Ly(t,e,n),{inset:t,insetLeft:e,insetRight:n,...i}}function Sy({inset:t,insetTop:e,insetBottom:n,...i}={}){return[e,n]=Ly(t,e,n),{inset:t,insetTop:e,insetBottom:n,...i}}function Ly(t,e,n){return void 0===t&&void 0===e&&void 0===n?CC?[1,0]:[.5,.5]:[e,n]}function Ry(t,{interval:e}){return(t={...Lh(t)}).interval=Ah(void 0===t.interval?e:t.interval),t}function Xy(t,e,n,i){const{[t]:s,[`${t}1`]:c,[`${t}2`]:a}=n,{value:l,interval:r}=Ry(s,n);if(null==l||null==r&&!i)return n;const o=fh(s);if(null==r){let e;const s={transform:t=>e||(e=WF(t,l)),label:o};return{...n,[t]:void 0,[`${t}1`]:void 0===c?s:c,[`${t}2`]:void 0!==a||c===a&&i?a:s}}let g,B;function d(t){return void 0!==B&&t===g?B:B=lh(WF(g=t,l),(t=>r.floor(t)))}return e({...n,[t]:void 0,[`${t}1`]:void 0===c?{transform:d,label:o}:c,[`${t}2`]:void 0===a?{transform:t=>d(t).map((t=>r.offset(t))),label:o}:a})}function vy(t,e,n){const{[t]:i}=n,{value:s,interval:c}=Ry(i,n);return null==s||null==c?n:e({...n,[t]:{label:fh(i),transform:t=>{const e=lh(WF(t,s),(t=>c.floor(t))),n=e.map((t=>c.offset(t)));return e.map(Nh(e)?(t,e)=>null==t||isNaN(t=+t)||null==(e=n[e])||isNaN(e=+e)?void 0:new Date((t+e)/2):(t,e)=>null==t||null==(e=n[e])?NaN:(+t+ +e)/2)}}})}const Ny={ariaLabel:"rule",fill:null,stroke:"currentColor"};class Zy extends ny{constructor(t,e={}){const{x:n,y1:i,y2:s,inset:c=0,insetTop:a=c,insetBottom:l=c}=e;super(t,{x:{value:n,scale:"x",optional:!0},y1:{value:i,scale:"y",optional:!0},y2:{value:s,scale:"y",optional:!0}},ay(e,"x"),Ny),this.insetTop=OF(a),this.insetBottom=OF(l),Fy(this,e)}render(t,e,n,i,s){const{x:c,y:a}=e,{x:l,y1:r,y2:o}=n,{width:g,height:B,marginTop:d,marginRight:I,marginLeft:Q,marginBottom:u}=i,{insetTop:F,insetBottom:h}=this;return kb("svg:g",s).call(LC,this,i,s).call(NC,this,{x:l&&c},CC,0).call((e=>e.selectAll().data(t).enter().append("line").call(RC,this).attr("x1",l?t=>l[t]:(Q+g-I)/2).attr("x2",l?t=>l[t]:(Q+g-I)/2).attr("y1",r&&!IC(a)?t=>r[t]+F:d+F).attr("y2",o&&!IC(a)?a.bandwidth?t=>o[t]+a.bandwidth()-h:t=>o[t]-h:B-u-h).call(AC,this,n).call(py,this,n,s))).node()}}class Ey extends ny{constructor(t,e={}){const{x1:n,x2:i,y:s,inset:c=0,insetRight:a=c,insetLeft:l=c}=e;super(t,{y:{value:s,scale:"y",optional:!0},x1:{value:n,scale:"x",optional:!0},x2:{value:i,scale:"x",optional:!0}},ay(e,"y"),Ny),this.insetRight=OF(a),this.insetLeft=OF(l),Fy(this,e)}render(t,e,n,i,s){const{x:c,y:a}=e,{y:l,x1:r,x2:o}=n,{width:g,height:B,marginTop:d,marginRight:I,marginLeft:Q,marginBottom:u}=i,{insetLeft:F,insetRight:h}=this;return kb("svg:g",s).call(LC,this,i,s).call(NC,this,{y:l&&a},0,CC).call((e=>e.selectAll().data(t).enter().append("line").call(RC,this).attr("x1",r&&!IC(c)?t=>r[t]+F:Q+F).attr("x2",o&&!IC(c)?c.bandwidth?t=>o[t]+c.bandwidth()-h:t=>o[t]-h:g-I-h).attr("y1",l?t=>l[t]:(d+B-u)/2).attr("y2",l?t=>l[t]:(d+B-u)/2).call(AC,this,n).call(py,this,n,s))).node()}}function Vy(t,e){let{x:n=MF,y:i,y1:s,y2:c,...a}=function(t={}){return Xy("y",Sy,t)}(e);return[s,c]=Wy(i,s,c),new Zy(t,{...a,x:n,y1:s,y2:c})}function wy(t,e){let{y:n=MF,x:i,x1:s,x2:c,...a}=function(t={}){return Xy("x",xy,t)}(e);return[s,c]=Wy(i,s,c),new Ey(t,{...a,y:n,x1:s,x2:c})}function Wy(t,e,n){if(null==t){if(void 0===e){if(void 0!==n)return[0,n]}else if(void 0===n)return[0,e]}else{if(void 0===e)return void 0===n?[0,t]:[t,n];if(void 0===n)return[t,e]}return[e,n]}function Hy(t,...e){let n=e.length;for(let i=0,s=!0;i<n;++i)"function"!=typeof e[i]&&(s&&(t=t.slice(),s=!1),t.splice(i,2,t[i]+e[i]+t[i+1]),e.splice(i,1),--i,--n);return i=>{let s=t[0];for(let c=0;c<n;++c)s+=e[c](i)+t[c+1];return s}}const Dy={ariaLabel:"text",strokeLinejoin:"round",strokeWidth:3,paintOrder:"stroke"},Yy="";class ky extends ny{constructor(t,e={}){const{x:n,y:i,text:s=(Rh(t)&&Xh(t)?MF:JF),frameAnchor:c,textAnchor:a=(/right$/i.test(c)?"end":/left$/i.test(c)?"start":"middle"),lineAnchor:l=(/^top/i.test(c)?"top":/^bottom/i.test(c)?"bottom":"middle"),lineHeight:r=1,lineWidth:o=1/0,textOverflow:g,monospace:B,fontFamily:d=(B?"ui-monospace, monospace":void 0),fontSize:I,fontStyle:Q,fontVariant:u,fontWeight:F,rotate:h}=e,[b,U]=ih(h,0),[C,y]=function(t){return null==t||"number"==typeof t?[void 0,t]:"string"!=typeof t?[t,void 0]:(t=t.trim().toLowerCase(),_y.has(t)||/^[+-]?\d*\.?\d+(e[+-]?\d+)?(\w*|%)$/.test(t)?[void 0,t]:[t,void 0])}(I);var f;if(super(t,{x:{value:n,scale:"x",optional:!0},y:{value:i,scale:"y",optional:!0},fontSize:{value:C,optional:!0},rotate:{value:(f=b,null==f?null:{transform:t=>WF(t,f,Float64Array),label:fh(f)}),optional:!0},text:{value:s,filter:nF,optional:!0}},e,Dy),this.rotate=U,this.textAnchor=ZC(a,"middle"),this.lineAnchor=ch(l,"lineAnchor",["top","middle","bottom"]),this.lineHeight=+r,this.lineWidth=+o,this.textOverflow=Jy(g),this.monospace=!!B,this.fontFamily=KF(d),this.fontSize=y,this.fontStyle=KF(Q),this.fontVariant=KF(u),this.fontWeight=KF(F),this.frameAnchor=Jh(c),!(this.lineWidth>=0))throw new Error(`invalid lineWidth: ${o}`);this.splitLines=tf(this),this.clipLine=ef(this)}render(t,e,n,i,s){const{x:c,y:a}=e,{x:l,y:r,rotate:o,text:g,title:B,fontSize:d}=n,{rotate:I}=this,[Q,u]=HC(this,i);return kb("svg:g",s).call(LC,this,i,s).call(Oy,this,g,i).call(NC,this,{x:l&&c,y:r&&a}).call((e=>e.selectAll().data(t).enter().append("text").call(RC,this).call(My,this,g,B).attr("transform",Hy`translate(${l?t=>l[t]:Q},${r?t=>r[t]:u})${o?t=>` rotate(${o[t]})`:I?` rotate(${I})`:""}`).call(vC,"font-size",d&&(t=>d[t])).call(AC,this,n))).node()}}function Jy(t){return null==t?null:ch(t,"textOverflow",["clip","ellipsis","clip-start","clip-end","ellipsis-start","ellipsis-middle","ellipsis-end"]).replace(/^(clip|ellipsis)$/,"$1-end")}function My(t,e,n,i){if(!n)return;const{lineAnchor:s,lineHeight:c,textOverflow:a,splitLines:l,clipLine:r}=e;t.each((function(t){const e=l(UC(n[t])??"").map(r),o=e.length,g="top"===s?.71:"bottom"===s?1-o:(164-100*o)/200;if(o>1){let t=0;for(let n=0;n<o;++n){if(++t,!e[n])continue;const i=this.ownerDocument.createElementNS(ve.svg,"tspan");i.setAttribute("x",0),n===t-1?i.setAttribute("y",(g+n)*c+"em"):i.setAttribute("dy",t*c+"em"),i.textContent=e[n],this.appendChild(i),t=0}}else g&&this.setAttribute("y",g*c+"em"),this.textContent=e[0];if(a&&!i&&e[0]!==n[t]){const e=this.ownerDocument.createElementNS(ve.svg,"title");e.textContent=n[t],this.appendChild(e)}}))}function Ty(t,{x:e,y:n,...i}={}){return void 0===i.frameAnchor&&([e,n]=Qh(e,n)),new ky(t,{...i,x:e,y:n})}function zy(t,{x:e=MF,...n}={}){return new ky(t,function(t={}){return vy("y",Sy,t)}({...n,x:e}))}function Ky(t,{y:e=MF,...n}={}){return new ky(t,function(t={}){return vy("x",xy,t)}({...n,y:e}))}function Oy(t,e,n){vC(t,"text-anchor",e.textAnchor),vC(t,"font-family",e.fontFamily),vC(t,"font-size",e.fontSize),vC(t,"font-style",e.fontStyle),vC(t,"font-variant",void 0===e.fontVariant?function(t){return t&&(function(t){for(const e of t)if(null!=e)return"number"==typeof e}(t)||Nh(t))?"tabular-nums":void 0}(n):e.fontVariant),vC(t,"font-weight",e.fontWeight)}const _y=new Set(["inherit","initial","revert","unset","xx-small","x-small","small","medium","large","x-large","xx-large","xxx-large","larger","smaller"]);function Py(t,e,n){const i=[];let s,c=0;for(const[a,l,r]of function*(t){let e=0,n=0;const i=t.length;for(;n<i;){let i=1;switch(t[n]){case Yy:case"-":++n,yield[e,n,!1],e=n;break;case" ":for(yield[e,n,!1];" "===t[++n];);e=n;break;case"\r":"\n"===t[n+1]&&++i;case"\n":yield[e,n,!0],n+=i,e=n;break;default:++n}}yield[e,n,!0]}(t))void 0===s&&(s=a),c>s&&n(t,s,l)>e&&(i.push(t.slice(s,c)+(t[c-1]===Yy?"-":"")),s=a),r?(i.push(t.slice(s,l)),s=void 0):c=l;return i}const jy={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 $y(t,e=0,n=t.length){let i=0;for(let s=e;s<n;s=of(t,s))i+=jy[t[s]]??(Bf(t,s)?120:jy.e);return i}function qy(t,e=0,n=t.length){let i=0;for(let s=e;s<n;s=of(t,s))i+=Bf(t,s)?126:63;return i}function tf({monospace:t,lineWidth:e,textOverflow:n}){if(null!=n||e==1/0)return t=>t.split(/\r\n?|\n/g);const i=t?qy:$y,s=100*e;return t=>Py(t,s,i)}function ef({monospace:t,lineWidth:e,textOverflow:n}){if(null==n||e==1/0)return t=>t;const i=t?qy:$y,s=100*e;switch(n){case"clip-start":return t=>af(t,s,i,"");case"clip-end":return t=>cf(t,s,i,"");case"ellipsis-start":return t=>af(t,s,i,nf);case"ellipsis-middle":return t=>function(t,e,n,i){t=t.trim();const s=n(t);if(s<=e)return t;const c=n(i)/2,[a,l]=sf(t,e/2,n,c),[r]=sf(t,s-e/2-l+c,n,-c);return r<0?i:t.slice(0,a).trimEnd()+i+t.slice(of(t,r)).trimStart()}(t,s,i,nf);case"ellipsis-end":return t=>cf(t,s,i,nf)}}const nf="…";function sf(t,e,n,i){const s=[];let c=0;for(let a=0,l=0,r=t.length;a<r;a=l){l=of(t,a);const r=n(t,a,l);if(c+r>e){for(c+=i;c>e&&a>0;)l=a,a=s.pop(),c-=n(t,a,l);return[a,e-c]}c+=r,s.push(a)}return[-1,0]}function cf(t,e,n,i){t=t.trim();const s=n(i),[c]=sf(t,e,n,s);return c<0?t:t.slice(0,c).trimEnd()+i}function af(t,e,n,i){const s=n(t=t.trim());if(s<=e)return t;const c=n(i),[a]=sf(t,s-e+c,n,-c);return a<0?i:i+t.slice(of(t,a)).trimStart()}const lf=/[\p{Combining_Mark}\p{Emoji_Modifier}]+/uy,rf=/\p{Extended_Pictographic}/uy;function of(t,e){return e+=function(t,e){const n=t.charCodeAt(e);if(n>=55296&&n<56320){const n=t.charCodeAt(e+1);return n>=56320&&n<57344}return!1}(t,e)?2:1,function(t,e){return!gf(t,e)&&(lf.lastIndex=e,lf.test(t))}(t,e)&&(e=lf.lastIndex),function(t,e){return 8205===t.charCodeAt(e)}(t,e)?of(t,e+1):e}function gf(t,e){return t.charCodeAt(e)<128}function Bf(t,e){return!gf(t,e)&&(rf.lastIndex=e,rf.test(t))}const df={ariaLabel:"vector",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinejoin:"round",strokeLinecap:"round"},If=3.5,Qf=5*If,uf={draw(t,e,n){const i=e*n/Qf;t.moveTo(0,0),t.lineTo(0,-e),t.moveTo(-i,i-e),t.lineTo(0,-e),t.lineTo(i,i-e)}},Ff={draw(t,e,n){t.moveTo(-n,0),t.lineTo(0,-e),t.lineTo(n,0)}},hf=new Map([["arrow",uf],["spike",Ff]]);class bf extends ny{constructor(t,e={}){const{x:n,y:i,r:s=If,length:c,rotate:a,shape:l=uf,anchor:r="middle",frameAnchor:o}=e,[g,B]=ih(c,12),[d,I]=ih(a,0);super(t,{x:{value:n,scale:"x",optional:!0},y:{value:i,scale:"y",optional:!0},length:{value:g,scale:"length",optional:!0},rotate:{value:d,optional:!0}},e,df),this.r=+s,this.length=B,this.rotate=I,this.shape=function(t){if(function(t){return t&&"function"==typeof t.draw}(t))return t;const e=hf.get(`${t}`.toLowerCase());if(e)return e;throw new Error(`invalid shape: ${t}`)}(l),this.anchor=ch(r,"anchor",["start","middle","end"]),this.frameAnchor=Jh(o)}render(t,e,n,i,s){const{x:c,y:a}=e,{x:l,y:r,length:o,rotate:g}=n,{length:B,rotate:d,anchor:I,shape:Q,r:u}=this,[F,h]=HC(this,i);return kb("svg:g",s).call(LC,this,i,s).call(NC,this,{x:l&&c,y:r&&a}).call((e=>e.selectAll().data(t).enter().append("path").call(RC,this).attr("transform",Hy`translate(${l?t=>l[t]:F},${r?t=>r[t]:h})${g?t=>` rotate(${g[t]})`:d?` rotate(${d})`:""}${"start"===I?"":"end"===I?o?t=>` translate(0,${o[t]})`:` translate(0,${B})`:o?t=>` translate(0,${o[t]/2})`:` translate(0,${B/2})`}`).attr("d",o?t=>{const e=ea();return Q.draw(e,o[t],u),e}:(()=>{const t=ea();return Q.draw(t,B,u),t})()).call(AC,this,n))).node()}}function Uf(t,e={}){const{x:n=MF,...i}=e;return new bf(t,{...i,x:n})}function Cf(t,e={}){const{y:n=MF,...i}=e;return new bf(t,{...i,y:n})}function yf(t,e){return arguments.length<2&&!Rh(t)&&(e=t,t=null),void 0===e&&(e={}),[t,e]}function ff({anchor:t}={},e){return void 0===t?e[0]:ch(t,"anchor",e)}function Gf(t){return ff(t,["left","right"])}function pf(t){return ff(t,["right","left"])}function mf(t){return ff(t,["bottom","top"])}function Af(t){return ff(t,["top","bottom"])}function xf(){const[t,e]=yf(...arguments);return Xf("y",Gf(e),t,e)}function Sf(){const[t,e]=yf(...arguments);return Xf("fy",pf(e),t,e)}function Lf(){const[t,e]=yf(...arguments);return vf("x",mf(e),t,e)}function Rf(){const[t,e]=yf(...arguments);return vf("fx",Af(e),t,e)}function Xf(t,e,n,{color:i="currentColor",opacity:s=1,stroke:c=i,strokeOpacity:a=s,strokeWidth:l=1,fill:r=i,fillOpacity:o=s,textAnchor:g,textStroke:B,textStrokeOpacity:d,textStrokeWidth:I,tickSize:Q=("y"===t?6:0),tickPadding:u,tickRotate:F,x:h,margin:b,marginTop:U=(void 0===b?20:b),marginRight:C=(void 0===b?"right"===e?40:0:b),marginBottom:y=(void 0===b?20:b),marginLeft:f=(void 0===b?"left"===e?40:0:b),label:G,labelAnchor:p,labelArrow:m,labelOffset:A,...x}){return Q=OF(Q),u=OF(u),F=OF(F),void 0!==p&&(p=ch(p,"labelAnchor",["center","top","bottom"])),m=jf(m),iy(Q&&!Dh(c)?function(t,e,n,{strokeWidth:i=1,strokeLinecap:s=null,strokeLinejoin:c=null,facetAnchor:a=e+("y"===t?"-empty":""),frameAnchor:l=e,tickSize:r,inset:o=0,insetLeft:g=o,insetRight:B=o,dx:d=0,y:I=("y"===t?void 0:null),...Q}){return Yf(Cf,t,n,{ariaLabel:`${t}-axis tick`,ariaHidden:!0},{strokeWidth:i,strokeLinecap:s,strokeLinejoin:c,facetAnchor:a,frameAnchor:l,y:I,...Q,dx:"left"===e?+d-CC+ +g:+d+CC-B,anchor:"start",length:r,shape:"left"===e?Kf:Of})}(t,e,n,{stroke:c,strokeOpacity:a,strokeWidth:l,tickSize:Q,tickPadding:u,tickRotate:F,x:h,...x}):null,Dh(r)?null:function(t,e,n,{facetAnchor:i=e+("y"===t?"-empty":""),frameAnchor:s=e,tickSize:c,tickRotate:a=0,tickPadding:l=Math.max(3,9-c)+(Math.abs(a)>60?4*Math.cos(a*uy):0),text:r,textAnchor:o=(Math.abs(a)>60?"middle":"left"===e?"end":"start"),lineAnchor:g=(a>60?"top":a<-60?"bottom":"middle"),fontVariant:B,inset:d=0,insetLeft:I=d,insetRight:Q=d,dx:u=0,y:F=("y"===t?void 0:null),...h}){return Yf(Ky,t,n,{ariaLabel:`${t}-axis tick label`},{facetAnchor:i,frameAnchor:s,text:r,textAnchor:o,lineAnchor:g,fontVariant:B,rotate:a,y:F,...h,dx:"left"===e?+u-c-l+ +I:+u+ +c+ +l-Q},(function(t,n,i,s,c){void 0===B&&(this.fontVariant=_f(t)),void 0===r&&(c.text=kf(t,n,i,s,e))}))}(t,e,n,{fill:r,fillOpacity:o,stroke:B,strokeOpacity:d,strokeWidth:I,textAnchor:g,tickSize:Q,tickPadding:u,tickRotate:F,x:h,marginTop:U,marginRight:C,marginBottom:y,marginLeft:f,...x}),Dh(r)||null===G?null:Ty([],Df({fill:r,fillOpacity:o,...x},(function(n,i,s,c,a){const l=c[t],{marginTop:r,marginRight:o,marginBottom:g,marginLeft:B}="y"===t&&a.inset||a,d=p??(l.bandwidth?"center":"top"),I=A??("right"===e?o:B)-3;return"center"===d?(this.textAnchor=void 0,this.lineAnchor="right"===e?"bottom":"top",this.frameAnchor=e,this.rotate=-90):(this.textAnchor="right"===e?"end":"start",this.lineAnchor=d,this.frameAnchor=`${d}-${e}`,this.rotate=0),this.dy="top"===d?3-r:"bottom"===d?g-3:0,this.dx="right"===e?I:-I,this.ariaLabel=`${t}-axis label`,{facets:[[0]],channels:{text:{value:[Pf(t,l,{anchor:e,label:G,labelAnchor:d,labelArrow:m})]}}}}))))}function vf(t,e,n,{color:i="currentColor",opacity:s=1,stroke:c=i,strokeOpacity:a=s,strokeWidth:l=1,fill:r=i,fillOpacity:o=s,textAnchor:g,textStroke:B,textStrokeOpacity:d,textStrokeWidth:I,tickSize:Q=("x"===t?6:0),tickPadding:u,tickRotate:F,y:h,margin:b,marginTop:U=(void 0===b?"top"===e?30:0:b),marginRight:C=(void 0===b?20:b),marginBottom:y=(void 0===b?"bottom"===e?30:0:b),marginLeft:f=(void 0===b?20:b),label:G,labelAnchor:p,labelArrow:m,labelOffset:A,...x}){return Q=OF(Q),u=OF(u),F=OF(F),void 0!==p&&(p=ch(p,"labelAnchor",["center","left","right"])),m=jf(m),iy(Q&&!Dh(c)?function(t,e,n,{strokeWidth:i=1,strokeLinecap:s=null,strokeLinejoin:c=null,facetAnchor:a=e+("x"===t?"-empty":""),frameAnchor:l=e,tickSize:r,inset:o=0,insetTop:g=o,insetBottom:B=o,dy:d=0,x:I=("x"===t?void 0:null),...Q}){return Yf(Uf,t,n,{ariaLabel:`${t}-axis tick`,ariaHidden:!0},{strokeWidth:i,strokeLinejoin:c,strokeLinecap:s,facetAnchor:a,frameAnchor:l,x:I,...Q,dy:"bottom"===e?+d-CC-B:+d+CC+ +g,anchor:"start",length:r,shape:"bottom"===e?Tf:zf})}(t,e,n,{stroke:c,strokeOpacity:a,strokeWidth:l,tickSize:Q,tickPadding:u,tickRotate:F,y:h,...x}):null,Dh(r)?null:function(t,e,n,{facetAnchor:i=e+("x"===t?"-empty":""),frameAnchor:s=e,tickSize:c,tickRotate:a=0,tickPadding:l=Math.max(3,9-c)+(Math.abs(a)>=10?4*Math.cos(a*uy):0),text:r,textAnchor:o=(Math.abs(a)>=10?a<0^"bottom"===e?"start":"end":"middle"),lineAnchor:g=(Math.abs(a)>=10?"middle":"bottom"===e?"top":"bottom"),fontVariant:B,inset:d=0,insetTop:I=d,insetBottom:Q=d,dy:u=0,x:F=("x"===t?void 0:null),...h}){return Yf(zy,t,n,{ariaLabel:`${t}-axis tick label`},{facetAnchor:i,frameAnchor:s,text:void 0===r?null:r,textAnchor:o,lineAnchor:g,fontVariant:B,rotate:a,x:F,...h,dy:"bottom"===e?+u+ +c+ +l-Q:+u-c-l+ +I},(function(t,n,i,s,c){void 0===B&&(this.fontVariant=_f(t)),void 0===r&&(c.text=kf(t,n,i,s,e))}))}(t,e,n,{fill:r,fillOpacity:o,stroke:B,strokeOpacity:d,strokeWidth:I,textAnchor:g,tickSize:Q,tickPadding:u,tickRotate:F,y:h,marginTop:U,marginRight:C,marginBottom:y,marginLeft:f,...x}),Dh(r)||null===G?null:Ty([],Df({fill:r,fillOpacity:o,...x},(function(n,i,s,c,a){const l=c[t],{marginTop:r,marginRight:o,marginBottom:g,marginLeft:B}="x"===t&&a.inset||a,d=p??(l.bandwidth?"center":"right"),I=A??("top"===e?r:g)-3;return"center"===d?(this.frameAnchor=e,this.textAnchor=void 0):(this.frameAnchor=`${e}-${d}`,this.textAnchor="right"===d?"end":"start"),this.lineAnchor=e,this.dy="top"===e?-I:I,this.dx="right"===d?o-3:"left"===d?3-B:0,this.ariaLabel=`${t}-axis label`,{facets:[[0]],channels:{text:{value:[Pf(t,l,{anchor:e,label:G,labelAnchor:d,labelArrow:m})]}}}}))))}function Nf(){const[t,e]=yf(...arguments);return wf("y",Gf(e),t,e)}function Zf(){const[t,e]=yf(...arguments);return wf("fy",pf(e),t,e)}function Ef(){const[t,e]=yf(...arguments);return Wf("x",mf(e),t,e)}function Vf(){const[t,e]=yf(...arguments);return Wf("fx",Af(e),t,e)}function wf(t,e,n,{y:i=("y"===t?void 0:null),x:s=null,x1:c=("left"===e?s:null),x2:a=("right"===e?s:null),...l}){return Yf(wy,t,n,{ariaLabel:`${t}-grid`,ariaHidden:!0},{y:i,x1:c,x2:a,...Hf(l)})}function Wf(t,e,n,{x:i=("x"===t?void 0:null),y:s=null,y1:c=("top"===e?s:null),y2:a=("bottom"===e?s:null),...l}){return Yf(Vy,t,n,{ariaLabel:`${t}-grid`,ariaHidden:!0},{x:i,y1:c,y2:a,...Hf(l)})}function Hf({color:t="currentColor",opacity:e=.1,stroke:n=t,strokeOpacity:i=e,strokeWidth:s=1,...c}){return{stroke:n,strokeOpacity:i,strokeWidth:s,...c}}function Df({fill:t,fillOpacity:e,fontFamily:n,fontSize:i,fontStyle:s,fontVariant:c,fontWeight:a,monospace:l,pointerEvents:r,shapeRendering:o,clip:g=!1},B){return[,t]=nh(t),[,e]=ih(e),{facet:"super",x:null,y:null,fill:t,fillOpacity:e,fontFamily:n,fontSize:i,fontStyle:s,fontVariant:c,fontWeight:a,monospace:l,pointerEvents:r,shapeRendering:o,clip:g,initializer:B}}function Yf(t,e,n,i,s,c){let a;const l=ab(s).initializer,r=t(n,ab({...s,initializer:function(t,n,i,l,r,o){const g=null==t&&("fx"===e||"fy"===e),{[e]:B}=l;if(!B)throw new Error(`missing scale: ${e}`);const d=B.domain();let{interval:I,ticks:Q,tickFormat:u,tickSpacing:F=("x"===e?80:35)}=s;if("string"==typeof Q&&$f(B)&&(I=Q,Q=void 0),void 0===Q&&(Q=xh(I,B.type)??function(t,e){const[n,i]=Gt(t.range());return(i-n)/e}(B,F)),null==t){if(Rh(Q))t=ah(Q);else if(Sh(Q))t=Mf(Q,...Gt(d));else if(B.interval){let e=B.interval;if(B.ticks){const[n,i]=Gt(d);e=XF(e,(i-n)/e[fF]/Q)??e,t=Mf(e,n,i)}else{e=XF(e,(t=d).length/Q)??e,e!==B.interval&&(t=Mf(e,...Gt(t)))}if(e===B.interval){const e=Math.round(t.length/Q);e>1&&(t=t.filter(((t,n)=>n%e==0)))}}else t=B.ticks?B.ticks(Q):d;if(!B.ticks&&t.length&&t!==d){const n=new At(d);t=t.filter((t=>n.has(t))),t.length||Tb(`Warning: the ${e}-axis ticks appear to not align with the scale domain, resulting in no ticks. Try different ticks?`)}"y"===e||"x"===e?n=[Fh(t)]:a[e]={scale:e,value:MF}}c?.call(this,B,t,Q,u,a);const h=Object.fromEntries(Object.entries(a).map((([e,n])=>[e,{...n,value:WF(t,n.value)}])));return g&&(n=o.filterFacets(t,h)),{data:t,facets:n,channels:h}}},l));return null==n?(a=r.channels,r.channels={}):a={},void 0!==i&&Object.assign(r,i),void 0===r.clip&&(r.clip=!1),r}function kf(t,e,n,i,s){return{value:Jf(t,e,n,i,s)}}function Jf(t,e,n,i,s){return"function"==typeof i?i:void 0===i&&e&&Nh(e)?NF(t.type,e,s)??UC:t.tickFormat?t.tickFormat("number"==typeof n?n:null,i):void 0===i?UC:"string"==typeof i?(Nh(t.domain())?eB:da)(i):jF(i)}function Mf(t,e,n){return t.range(e,t.offset(t.floor(n)))}const Tf={draw(t,e){t.moveTo(0,0),t.lineTo(0,e)}},zf={draw(t,e){t.moveTo(0,0),t.lineTo(0,-e)}},Kf={draw(t,e){t.moveTo(0,0),t.lineTo(-e,0)}},Of={draw(t,e){t.moveTo(0,0),t.lineTo(e,0)}};function _f(t){return t.bandwidth&&!t.interval?void 0:"tabular-nums"}function Pf(t,e,{anchor:n,label:i=e.label,labelAnchor:s,labelArrow:c}={}){if(!(null==i||i.inferred&&$f(e)&&/^(date|time|year)$/i.test(i))){if(i=String(i),"auto"===c&&(c=(!e.bandwidth||e.interval)&&!/[↑↓→←]/.test(i)),!c)return i;if(!0===c){const n=function(t){return Math.sign(gF(t.domain()))*Math.sign(gF(t.range()))}(e);n&&(c=/x$/.test(t)||"center"===s?/x$/.test(t)===n<0?"left":"right":n<0?"up":"down")}switch(c){case"left":return`← ${i}`;case"right":return`${i} →`;case"up":return"right"===n?`${i} ↑`:`↑ ${i}`;case"down":return"right"===n?`${i} ↓`:`↓ ${i}`}return i}}function jf(t="auto"){return!Dh(t)&&("boolean"==typeof t?t:ch(t,"labelArrow",["auto","up","right","down","left"]))}function $f(t){return Nh(t.domain())}function qf(t,e){if(null==e)return e;const n=t(e);if(!n)throw new Error(`scale not found: ${e}`);return n}function tG(t,e={},n){let{columns:i,tickFormat:s,fontVariant:c=Qy(t),swatchSize:a=15,swatchWidth:l=a,swatchHeight:r=a,marginLeft:o=0,className:g,style:B,width:d}=e;const I=Yb(e);g=wC(g),s=Jf(t.scale,t.domain,void 0,s);const Q=kb("div",I).attr("class",`${g}-swatches ${g}-swatches-${null!=i?"columns":"wrap"}`);let u;return null!=i?(u=`:where(.${g}-swatches-columns .${g}-swatch) {\n display: flex;\n align-items: center;\n break-inside: avoid;\n padding-bottom: 1px;\n}\n:where(.${g}-swatches-columns .${g}-swatch::before) {\n flex-shrink: 0;\n}\n:where(.${g}-swatches-columns .${g}-swatch-label) {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}`,Q.style("columns",i).selectAll().data(t.domain).enter().append("div").attr("class",`${g}-swatch`).call(n,t,l,r).call((t=>t.append("div").attr("class",`${g}-swatch-label`).attr("title",s).text(s)))):(u=`:where(.${g}-swatches-wrap) {\n display: flex;\n align-items: center;\n min-height: 33px;\n flex-wrap: wrap;\n}\n:where(.${g}-swatches-wrap .${g}-swatch) {\n display: inline-flex;\n align-items: center;\n margin-right: 1em;\n}`,Q.selectAll().data(t.domain).enter().append("span").attr("class",`${g}-swatch`).call(n,t,l,r).append((function(){return this.ownerDocument.createTextNode(s.apply(this,arguments))}))),Q.call((t=>t.insert("style","*").text(`:where(.${g}-swatches) {\n font-family: system-ui, sans-serif;\n font-size: 10px;\n margin-bottom: 0.5em;\n}\n:where(.${g}-swatch > svg) {\n margin-right: 0.5em;\n overflow: visible;\n}\n${u}`))).style("margin-left",o?+o+"px":null).style("width",void 0===d?null:+d+"px").style("font-variant",ZC(c,"normal")).call(WC,B).node()}const eG=new Map([["symbol",function(t,{fill:e=(void 0!==t.hint?.fill?t.hint.fill:"none"),fillOpacity:n=1,stroke:i=(void 0!==t.hint?.stroke?t.hint.stroke:Dh(e)?"currentColor":"none"),strokeOpacity:s=1,strokeWidth:c=1.5,r:a=4.5,...l}={},r){const[o,g]=nh(e),[B,d]=nh(i),I=qf(r,o),Q=qf(r,B),u=a*a*Math.PI;return n=ih(n)[1],s=ih(s)[1],c=ih(c)[1],tG(t,l,((e,i,a,l)=>e.append("svg").attr("viewBox","-8 -8 16 16").attr("width",a).attr("height",l).attr("fill","color"===o?t=>I.scale(t):g).attr("fill-opacity",n).attr("stroke","color"===B?t=>Q.scale(t):d).attr("stroke-opacity",s).attr("stroke-width",c).append("path").attr("d",(e=>{const n=ea();return t.scale(e).draw(n,u),n}))))}],["color",iG],["opacity",function({type:t,interpolate:e,...n},{legend:i=!0,color:s=mi(0,0,0),...c}){if(!e)throw new Error(`${t} opacity scales are not supported`);!0===i&&(i="ramp");if("ramp"!==`${i}`.toLowerCase())throw new Error(`${i} opacity legends are not supported`);return iG({type:t,...n,interpolate:sG(s)},{legend:i,...c})}]]);function nG({className:t,...e},{label:n,ticks:i,tickFormat:s}={},c){return function(t={},...e){let n=t;for(const i of e)for(const e in i)if(void 0===n[e]){const s=i[e];n===t?n={...n,[e]:s}:n[e]=s}return n}(c,{className:t,...e},{label:n,ticks:i,tickFormat:s})}function iG(t,{legend:e=!0,...n}){if(!0===e&&(e="ordinal"===t.type?"swatches":"ramp"),void 0!==t.domain)switch(`${e}`.toLowerCase()){case"swatches":return function(t,{opacity:e,...n}={}){if(!BC(t)&&!dC(t))throw new Error(`swatches legend requires ordinal or threshold color scale (not ${t.type})`);return tG(t,n,((t,n,i,s)=>t.append("svg").attr("width",i).attr("height",s).attr("fill",n.scale).attr("fill-opacity",ih(e)[1]).append("rect").attr("width","100%").attr("height","100%")))}(t,n);case"ramp":return function(t,e){let{label:n=t.label,tickSize:i=6,width:s=240,height:c=44+i,marginTop:a=18,marginRight:l=0,marginBottom:r=16+i,marginLeft:o=0,style:g,ticks:B=(s-o-l)/64,tickFormat:d,fontVariant:I=Qy(t),round:Q=!0,opacity:u,className:F}=e;const h=Yb(e);F=wC(F),u=ih(u)[1],null===d&&(d=()=>null);const b=kb("svg",h).attr("class",`${F}-ramp`).attr("font-family","system-ui, sans-serif").attr("font-size",10).attr("width",s).attr("height",c).attr("viewBox",`0 0 ${s} ${c}`).call((t=>t.append("style").text(`:where(.${F}-ramp) {\n display: block;\n height: auto;\n height: intrinsic;\n max-width: 100%;\n overflow: visible;\n}\n:where(.${F}-ramp text) {\n white-space: pre;\n}`))).call(WC,g);let U,C=t=>t.selectAll(".tick line").attr("y1",a+r-c);const y=Q?(t,e)=>t.rangeRound(e):(t,e)=>t.range(e),{type:f,domain:G,range:p,interpolate:m,scale:A,pivot:x}=t;if(m){const t=void 0===p?m:Js(1===m.length?NU(m):m,p);U=y(A.copy(),Ms(ms(o,s-l),Math.min(G.length+(void 0!==x),void 0===p?1/0:p.length)));const e=256,n=h.document.createElement("canvas");n.width=e,n.height=1;const i=n.getContext("2d");for(let n=0,s=e-1;n<e;++n)i.fillStyle=t(n/s),i.fillRect(n,0,1,1);b.append("image").attr("opacity",u).attr("x",o).attr("y",a).attr("width",s-o-l).attr("height",c-a-r).attr("preserveAspectRatio","none").attr("xlink:href",n.toDataURL())}else if("threshold"===f){const t=G,e=void 0===d?t=>t:"string"==typeof d?da(d):d;U=y(Wo().domain([-1,p.length-1]),[o,s-l]),b.append("g").attr("fill-opacity",u).selectAll().data(p).enter().append("rect").attr("x",((t,e)=>U(e-1))).attr("y",a).attr("width",((t,e)=>U(e)-U(e-1))).attr("height",c-a-r).attr("fill",(t=>t)),B=lh(t,((t,e)=>e)),d=n=>e(t[n],n)}else U=y(po().domain(G),[o,s-l]),b.append("g").attr("fill-opacity",u).selectAll().data(G).enter().append("rect").attr("x",U).attr("y",a).attr("width",Math.max(0,U.bandwidth()-1)).attr("height",c-a-r).attr("fill",A),C=()=>{};return b.append("g").attr("transform",`translate(0,${c-r})`).call(me(U).ticks(Array.isArray(B)?null:B,"string"==typeof d?d:void 0).tickFormat("function"==typeof d?d:void 0).tickSize(i).tickValues(Array.isArray(B)?B:null)).attr("font-size",null).attr("font-family",null).attr("font-variant",ZC(I,"normal")).call(C).call((t=>t.select(".domain").remove())),void 0!==n&&b.append("text").attr("x",o).attr("y",a-6).attr("fill","currentColor").attr("font-weight","bold").text(n),b.node()}(t,n);default:throw new Error(`unknown legend type: ${e}`)}}function sG(t){const{r:e,g:n,b:i}=mi(t)||mi(0,0,0);return t=>`rgba(${e},${n},${i},${t})`}const cG={ariaLabel:"frame",fill:"none",stroke:"currentColor",clip:!1},aG={ariaLabel:"frame",fill:null,stroke:"currentColor",strokeLinecap:"square",clip:!1};class lG extends ny{constructor(t={}){const{anchor:e=null,inset:n=0,insetTop:i=n,insetRight:s=n,insetBottom:c=n,insetLeft:a=n,rx:l,ry:r}=t;super(YF,void 0,t,null==e?cG:aG),this.anchor=sh(e,"anchor",["top","right","bottom","left"]),this.insetTop=OF(i),this.insetRight=OF(s),this.insetBottom=OF(c),this.insetLeft=OF(a),this.rx=OF(l),this.ry=OF(r)}render(t,e,n,i,s){const{marginTop:c,marginRight:a,marginBottom:l,marginLeft:r,width:o,height:g}=i,{anchor:B,insetTop:d,insetRight:I,insetBottom:Q,insetLeft:u,rx:F,ry:h}=this,b=r+u,U=o-a-I,C=c+d,y=g-l-Q;return kb(B?"svg:line":"svg:rect",s).datum(0).call(LC,this,i,s).call(RC,this).call(AC,this,n).call(NC,this,{}).call("left"===B?t=>t.attr("x1",b).attr("x2",b).attr("y1",C).attr("y2",y):"right"===B?t=>t.attr("x1",U).attr("x2",U).attr("y1",C).attr("y2",y):"top"===B?t=>t.attr("x1",b).attr("x2",U).attr("y1",C).attr("y2",C):"bottom"===B?t=>t.attr("x1",b).attr("x2",U).attr("y1",y).attr("y2",y):t=>t.attr("x",b).attr("y",C).attr("width",U-b).attr("height",y-C).attr("rx",F).attr("ry",h)).node()}}const rG={ariaLabel:"tip",fill:"var(--plot-background)",stroke:"currentColor"},oG=new Set(["geometry","href","src","ariaLabel","scales"]);class gG extends ny{constructor(t,e={}){e.tip&&(e={...e,tip:!1}),void 0===e.title&&Rh(t)&&Xh(t)&&(e={...e,title:MF});const{x:n,y:i,x1:s,x2:c,y1:a,y2:l,anchor:r,preferredAnchor:o="bottom",monospace:g,fontFamily:B=(g?"ui-monospace, monospace":void 0),fontSize:d,fontStyle:I,fontVariant:Q,fontWeight:u,lineHeight:F=1,lineWidth:h=20,frameAnchor:b,format:U,textAnchor:C="start",textOverflow:y,textPadding:f=8,title:G,pointerSize:p=12,pathFilter:m="drop-shadow(0 3px 4px rgba(0,0,0,0.2))"}=e;super(t,{x:{value:null!=s&&null!=c?null:n,scale:"x",optional:!0},y:{value:null!=a&&null!=l?null:i,scale:"y",optional:!0},x1:{value:s,scale:"x",optional:null==c},y1:{value:a,scale:"y",optional:null==l},x2:{value:c,scale:"x",optional:null==s},y2:{value:l,scale:"y",optional:null==a},title:{value:G,optional:!0}},e,rG),this.anchor=kh(r,"anchor"),this.preferredAnchor=kh(o,"preferredAnchor"),this.frameAnchor=Jh(b),this.textAnchor=ZC(C,"middle"),this.textPadding=+f,this.pointerSize=+p,this.pathFilter=KF(m),this.lineHeight=+F,this.lineWidth=+h,this.textOverflow=Jy(y),this.monospace=!!g,this.fontFamily=KF(B),this.fontSize=OF(d),this.fontStyle=KF(I),this.fontVariant=KF(Q),this.fontWeight=KF(u);for(const t in rG)t in this.channels&&(this[t]=rG[t]);this.splitLines=tf(this),this.clipLine=ef(this),this.format={...U}}render(t,e,n,i,s){const c=this,{x:a,y:l,fx:r,fy:o}=e,{ownerSVGElement:g,document:B}=s,{anchor:d,monospace:I,lineHeight:Q,lineWidth:u}=this,{textPadding:F,pointerSize:h,pathFilter:b}=this,{marginTop:U,marginLeft:C}=i,{x1:y,y1:f,x2:G,y2:p,x:m=y??G,y:A=f??p}=n,x=r?r(t.fx)-C:0,S=o?o(t.fy)-U:0,[L,R]=HC(this,i),X=dy(n,L),v=Iy(n,R),N=I?qy:$y,Z=N(nf);let E,V;"title"in n?(E=n.channels,V=QG):(E=dG.call(this,n,e),V=uG);const w=kb("svg:g",s).call(LC,this,i,s).call(Oy,this).call(NC,this,{x:m&&a,y:A&&l}).call((i=>i.selectAll().data(t).enter().append("g").attr("transform",(t=>`translate(${Math.round(X(t))},${Math.round(v(t))})`)).call(RC,this).call((t=>t.append("path").attr("filter",b))).call((i=>i.append("text").each((function(i){const s=Mn(this);this.setAttribute("fill","currentColor"),this.setAttribute("fill-opacity",1),this.setAttribute("stroke","none");const a=V.call(c,i,t,E,e,n);if("string"==typeof a)for(const t of c.splitLines(a))W(s,{value:c.clipLine(t)});else{const t=new Set;for(const e of a){const{label:n=""}=e;n&&t.has(n)||(t.add(n),W(s,e))}}}))))));function W(t,{label:e,value:n,color:i,opacity:s}){e??="",n??="";const c=null!=i||null!=s;let a,l=100*u;const[r]=sf(e,l,N,Z);if(r>=0)e=e.slice(0,r).trimEnd()+nf,a=n.trim(),n="";else{(e||!n&&!c)&&(n=" "+n);const[t]=sf(n,l-N(e),N,Z);t>=0&&(a=n.trim(),n=n.slice(0,t).trimEnd()+nf)}const o=t.append("tspan").attr("x",0).attr("dy",`${Q}em`).text("");e&&o.append("tspan").attr("font-weight","bold").text(e),n&&o.append((()=>B.createTextNode(n))),c&&o.append("tspan").text(" ■").attr("fill",i).attr("fill-opacity",s).style("user-select","none"),a&&o.append("title").text(a)}function H(){const{width:t,height:e}=i.facet??i;w.selectChildren().each((function(n){let{x:i,width:s,height:a}=this.getBBox();s=Math.round(s),a=Math.round(a);let l=d;if(void 0===l){const i=X(n)+x,r=v(n)+S,o=i+s+h+2*F<t,g=i-s-h-2*F>0,B=r+a+h+2*F<e,d=r-a-h-2*F>0;l=o&&g?B&&d?c.preferredAnchor:d?"bottom":"top":B&&d?o?"left":"right":(o||g)&&(B||d)?`${d?"bottom":"top"}-${o?"left":"right"}`:c.preferredAnchor}const r=this.firstChild,o=this.lastChild;if(r.setAttribute("d",function(t,e,n,i,s){const c=i+2*n,a=s+2*n;switch(t){case"middle":return`M${-c/2},${-a/2}h${c}v${a}h${-c}z`;case"top-left":return`M0,0l${e},${e}h${c-e}v${a}h${-c}z`;case"top":return`M0,0l${e/2},${e/2}h${(c-e)/2}v${a}h${-c}v${-a}h${(c-e)/2}z`;case"top-right":return`M0,0l${-e},${e}h${e-c}v${a}h${c}z`;case"right":return`M0,0l${-e/2},${-e/2}v${e/2-a/2}h${-c}v${a}h${c}v${e/2-a/2}z`;case"bottom-left":return`M0,0l${e},${-e}h${c-e}v${-a}h${-c}z`;case"bottom":return`M0,0l${e/2},${-e/2}h${(c-e)/2}v${-a}h${-c}v${a}h${(c-e)/2}z`;case"bottom-right":return`M0,0l${-e},${-e}h${e-c}v${-a}h${c}z`;case"left":return`M0,0l${e/2},${-e/2}v${e/2-a/2}h${c}v${a}h${-c}v${e/2-a/2}z`}}(l,h,F,s,a)),i)for(const t of o.childNodes)t.setAttribute("x",-i);o.setAttribute("y",+function(t,e,n){return/^top(?:-|$)/.test(t)?.94-n:-.29-e*n}(l,o.childNodes.length,Q).toFixed(6)+"em"),o.setAttribute("transform",`translate(${function(t,e,n,i,s){switch(t){case"middle":return[-i/2,s/2];case"top-left":return[n,e+n];case"top":return[-i/2,e/2+n];case"top-right":return[-i-n,e+n];case"right":return[-e/2-i-n,s/2];case"bottom-left":return[n,-e-n];case"bottom":return[-i/2,-e/2-n];case"bottom-right":return[-i-n,-e-n];case"left":return[n+e/2,s/2]}}(l,h,F,s,a)})`)})),w.attr("visibility",null)}return t.length&&(w.attr("visibility","hidden"),g.isConnected?Promise.resolve().then(H):"undefined"!=typeof requestAnimationFrame&&requestAnimationFrame(H)),w.node()}}function BG(t,{x:e,y:n,...i}={}){return void 0===i.frameAnchor&&([e,n]=Qh(e,n)),new gG(t,{...i,x:e,y:n})}function dG({channels:t},e){const n={};let i=this.format;i=IG(i,t,"x"),i=IG(i,t,"y"),this.format=i;for(const e in i){const s=i[e];if(null!==s&&!1!==s)if("fx"===e||"fy"===e)n[e]=!0;else{const i=Db(t,e);i&&(n[e]=i)}}for(const e in t){if(e in n||e in i||oG.has(e))continue;const s=Db(t,e);s&&(n[e]=s)}this.facet&&(e.fx&&!("fx"in i)&&(n.fx=!0),e.fy&&!("fy"in i)&&(n.fy=!0));for(const t in n){const i=this.format[t];if("string"==typeof i){const s=n[t]?.value??e[t]?.domain()??[];this.format[t]=(Nh(s)?eB:da)(i)}else if(void 0===i||!0===i){const n=e[t];this.format[t]=n?.bandwidth?Jf(n,n.domain()):UC}}return n}function IG(t,e,n){if(!(n in t))return t;const i=`${n}1`,s=`${n}2`;if(!(!(i in t)&&i in e||!(s in t)&&s in e))return t;const c=Object.entries(t),a=t[n];return c.splice(c.findIndex((([t])=>t===n))+1,0,[i,a],[s,a]),Object.fromEntries(c)}function QG(t,e,{title:n}){return UC(n.value[t],t)}function*uG(t,e,n,i,s){for(const c in n){if("fx"===c||"fy"===c){yield{label:bG(i,n,c),value:this.format[c](e[c],t)};continue}if("x1"===c&&"x2"in n)continue;if("y1"===c&&"y2"in n)continue;const a=n[c];if("x2"===c&&"x1"in n)yield{label:hG(i,n,"x"),value:FG(this.format.x2,n.x1,a,t)};else if("y2"===c&&"y1"in n)yield{label:hG(i,n,"y"),value:FG(this.format.y2,n.y1,a,t)};else{const e=a.value[t],l=a.scale;if(!qu(e)&&null==l)continue;yield{label:bG(i,n,c),value:this.format[c](e,t),color:"color"===l?s[c][t]:null,opacity:"opacity"===l?s[c][t]:null}}}}function FG(t,e,n,i){return n.hint?.length?`${t(n.value[i]-e.value[i],i)}`:`${t(e.value[i],i)}–${t(n.value[i],i)}`}function hG(t,e,n){const i=bG(t,e,`${n}1`,n),s=bG(t,e,`${n}2`,n);return i===s?i:`${i}–${s}`}function bG(t,e,n,i=n){const s=e[n],c=t[s?.scale??n];return String(c?.label??s?.label??i)}function UG(t={}){const{facet:e,style:n,title:i,subtitle:s,caption:c,ariaLabel:a,ariaDescription:l}=t,r=wC(t.className),o=void 0===t.marks?[]:yG(t.marks);o.push(...function(t){const e=[];for(const n of t){let t=n.tip;if(t){!0===t?t={}:"string"==typeof t&&(t={pointer:t});let{pointer:i,preferredAnchor:s}=t;i=/^x$/i.test(i)?gy:/^y$/i.test(i)?By:oy,t=i(RG(n,t)),t.title=null,void 0===s&&(t.preferredAnchor=i===By?"left":"bottom");const c=BG(n.data,t);c.facet=n.facet,c.facetAnchor=n.facetAnchor,e.push(c)}}return e}(o));const g=function(t,e){if(null==t)return;const{x:n,y:i}=t;if(null==n&&null==i)return;const s=ah(t.data);if(null==s)throw new Error("missing facet data");const c={};null!=n&&(c.fx=Xb(s,{value:n,scale:"fx"}));null!=i&&(c.fy=Xb(s,{value:i,scale:"fy"}));pG(c,e);const a=JC(s,c);return{channels:c,groups:a,data:t.data}}(e,t),B=new Map;for(const e of o){const n=LG(e,g,t);n&&B.set(e,n)}const d=new Map;g&&xG(d,[g],t),xG(d,B,t);const I=yG(function(t,e,n){let{projection:i,x:s={},y:c={},fx:a={},fy:l={},axis:r,grid:o,facet:g={},facet:{axis:B=r,grid:d}=g,x:{axis:I=r,grid:Q=(null===I?null:o)}=s,y:{axis:u=r,grid:F=(null===u?null:o)}=c,fx:{axis:h=B,grid:b=(null===h?null:d)}=a,fy:{axis:U=B,grid:C=(null===U?null:d)}=l}=n;(i||!Bh(s)&&!EG("x",t))&&(I=Q=null);(i||!Bh(c)&&!EG("y",t))&&(u=F=null);e.has("fx")||(h=b=null);e.has("fy")||(U=C=null);void 0===I&&(I=!ZG(t,"x"));void 0===u&&(u=!ZG(t,"y"));void 0===h&&(h=!ZG(t,"fx"));void 0===U&&(U=!ZG(t,"fy"));!0===I&&(I="bottom");!0===u&&(u="left");!0===h&&(h="top"===I||null===I?"bottom":"top");!0===U&&(U="right"===u||null===u?"left":"right");const y=[];return vG(y,C,Zf,l),XG(y,U,Sf,"right","left",g,l),vG(y,b,Vf,a),XG(y,h,Rf,"top","bottom",g,a),vG(y,F,Nf,c),XG(y,u,xf,"left","right",n,c),vG(y,Q,Ef,s),XG(y,I,Lf,"bottom","top",n,s),y}(o,d,t));for(const e of I){const n=LG(e,g,t);n&&B.set(e,n)}o.unshift(...I);let Q=kC(d,t);if(void 0!==Q){const t=g?ey(Q,g):void 0;for(const e of o){if(null===e.facet||"super"===e.facet)continue;const n=B.get(e);void 0!==n&&(n.facetsIndex=null!=e.fx||null!=e.fy?ey(Q,n):t)}const e=new Set;for(const{facetsIndex:t}of B.values())t?.forEach(((t,n)=>{t?.length>0&&e.add(n)}));Q.forEach(0<e.size&&e.size<Q.length?(t,n)=>t.empty=!e.has(n):t=>t.empty=!1);for(const t of o)if("exclude"===t.facet){const e=B.get(t);void 0!==e&&(e.facetsIndex=MC(e.facetsIndex))}}for(const e of qh.keys())Bh(t[e])&&"fx"!==e&&"fy"!==e&&d.set(e,[]);const u=new Map;for(const e of o){if(u.has(e))throw new Error("duplicate mark; each mark must be unique");const{facetsIndex:n,channels:i}=B.get(e)??{},{data:s,facets:c,channels:a}=e.initialize(n,i,t);pG(a,t),u.set(e,{data:s,facets:c,channels:a})}const F=jU(xG(d,u,t),t),h=function(t,e,n={}){let i=.5-CC,s=.5+CC,c=.5+CC,a=.5-CC;for(const{marginTop:t,marginRight:n,marginBottom:l,marginLeft:r}of e)t>i&&(i=t),n>s&&(s=n),l>c&&(c=l),r>a&&(a=r);let{margin:l,marginTop:r=(void 0!==l?l:i),marginRight:o=(void 0!==l?l:s),marginBottom:g=(void 0!==l?l:c),marginLeft:B=(void 0!==l?l:a)}=n;r=+r,o=+o,g=+g,B=+B;let{width:d=640,height:I=DC(t,n,{width:d,marginTopDefault:i,marginRightDefault:s,marginBottomDefault:c,marginLeftDefault:a})+Math.max(0,r-i+g-c)}=n;d=+d,I=+I;const Q={width:d,height:I,marginTop:r,marginRight:o,marginBottom:g,marginLeft:B};if(t.fx||t.fy){let{margin:t,marginTop:e=(void 0!==t?t:r),marginRight:i=(void 0!==t?t:o),marginBottom:s=(void 0!==t?t:g),marginLeft:c=(void 0!==t?t:B)}=n.facet??{};e=+e,i=+i,s=+s,c=+c,Q.facet={marginTop:e,marginRight:i,marginBottom:s,marginLeft:c}}return Q}(F,o,t);!function(t,e){const{x:n,y:i,fx:s,fy:c}=t,a=s||c?tC(e):e;s&&nC(s,a),c&&iC(c,a);const l=s||c?eC(t,e):e;n&&nC(n,l),i&&iC(i,l)}(F,h);const b=$U(F),{fx:U,fy:C}=b,y=U||C?eC(F,h):h,f=U||C?function({fx:t,fy:e},n){const{marginTop:i,marginRight:s,marginBottom:c,marginLeft:a,width:l,height:r}=tC(n),o=t&&VG(t),g=e&&VG(e);return{marginTop:e?g[0]:i,marginRight:t?l-o[1]:s,marginBottom:e?r-g[1]:c,marginLeft:t?o[0]:a,inset:{marginTop:n.marginTop,marginRight:n.marginRight,marginBottom:n.marginBottom,marginLeft:n.marginLeft},width:l,height:r}}(b,h):h,G=Yb(t),p=G.document,m=Ve("svg").call(p.documentElement);let A=m;G.ownerSVGElement=m,G.className=r,G.projection=_b(t,y),G.filterFacets=(t,e)=>ey(Q,{channels:e,groups:JC(t,e)}),G.getMarkState=t=>{const e=u.get(t),n=B.get(t);return{...e,channels:{...e.channels,...n?.channels}}},G.dispatchValue=t=>{A.value!==t&&(A.value=t,A.dispatchEvent(new Event("input",{bubbles:!0})))};const x=new Set;for(const[e,n]of u)if(null!=e.initializer){const i="super"===e.facet?f:y,s=e.initializer(n.data,n.facets,n.channels,b,i,G);if(void 0!==s.data&&(n.data=s.data),void 0!==s.facets&&(n.facets=s.facets),void 0!==s.channels){const{fx:i,fy:c,...a}=s.channels;AG(a),Object.assign(n.channels,a);for(const e of Object.values(a)){const{scale:n}=e;null!=n&&((S=qh.get(n))!==zh&&S!==$h)&&(mG(e,t),x.add(n))}null==i&&null==c||B.set(e,!0)}}var S;if(x.size){const e=new Map;xG(e,u,t,(t=>x.has(t))),xG(d,u,t,(t=>x.has(t)));const n=function(t,e){for(const n in t){const i=t[n],s=e[n];void 0===i.label&&s&&(i.label=s.label)}return t}(jU(e,t),F),{scales:i,...s}=$U(n);Object.assign(F,n),Object.assign(b,s),Object.assign(b.scales,i)}let L,R;void 0!==Q&&(L={x:U?.domain(),y:C?.domain()},Q=function(t,{x:e,y:n}){return e&&=KC(e),n&&=KC(n),t.filter(e&&n?t=>e.has(t.x)&&n.has(t.y):e?t=>e.has(t.x):t=>n.has(t.y)).sort(e&&n?(t,i)=>e.get(t.x)-e.get(i.x)||n.get(t.y)-n.get(i.y):e?(t,n)=>e.get(t.x)-e.get(n.x):(t,e)=>n.get(t.y)-n.get(e.y))}(Q,L),R=function(t,e,{marginTop:n,marginLeft:i}){return t&&e?({x:s,y:c})=>`translate(${t(s)-i},${e(c)-n})`:t?({x:e})=>`translate(${t(e)-i},0)`:({y:t})=>`translate(0,${e(t)-n})`}(U,C,h));for(const[t,e]of u)e.values=t.scale(e.channels,b,G);const{width:X,height:v}=h;Mn(m).attr("class",r).attr("fill","currentColor").attr("font-family","system-ui, sans-serif").attr("font-size",10).attr("text-anchor","middle").attr("width",X).attr("height",v).attr("viewBox",`0 0 ${X} ${v}`).attr("aria-label",a).attr("aria-description",l).call((t=>t.append("style").text(`:where(.${r}) {\n --plot-background: white;\n display: block;\n height: auto;\n height: intrinsic;\n max-width: 100%;\n}\n:where(.${r} text),\n:where(.${r} tspan) {\n white-space: pre;\n}`))).call(WC,n);for(const t of o){const{channels:e,values:n,facets:i}=u.get(t);if(void 0===Q||"super"===t.facet){let s=null;if(i&&(s=i[0],s=t.filter(s,e,n),0===s.length))continue;const c=t.render(s,b,n,f,G);if(null==c)continue;m.appendChild(c)}else{let s;for(const c of Q){if(!(t.facetAnchor?.(Q,L,c)??!c.empty))continue;let a=null;if(i){const s=B.has(t);if(a=i[s?c.i:0],a=t.filter(a,e,n),0===a.length)continue;s||a!==i[0]||(a=bh(a)),a.fx=c.x,a.fy=c.y,a.fi=c.i}const l=t.render(a,b,n,y,G);if(null!=l){(s??=Mn(m).append("g")).append((()=>l)).datum(c);for(const t of["aria-label","aria-description","aria-hidden","transform"])l.hasAttribute(t)&&(s.attr(t,l.getAttribute(t)),l.removeAttribute(t))}}s?.selectChildren().attr("transform",R)}}const N=function(t,e,n){const i=[];for(const[s,c]of eG){const a=n[s];if(a?.legend&&s in t){const n=c(t[s],nG(e,t[s],a),(e=>t[e]));null!=n&&i.push(n)}}return i}(F,G,t),{figure:Z=null!=i||null!=s||null!=c||N.length>0}=t;Z&&(A=p.createElement("figure"),A.className=`${r}-figure`,A.style.maxWidth="initial",null!=i&&A.append(CG(p,i,"h2")),null!=s&&A.append(CG(p,s,"h3")),A.append(...N,m),null!=c&&A.append(function(t,e){const n=t.createElement("figcaption");return n.append(e),n}(p,c))),A.scale=function(t){return e=>{if(!qh.has(e=`${e}`))throw new Error(`unknown scale: ${e}`);return t[e]}}(b.scales),A.legend=function(t,e,n={}){return(i,s)=>{if(!eG.has(i))throw new Error(`unknown legend type: ${i}`);if(i in t)return eG.get(i)(t[i],nG(e,n[i],s),(e=>t[e]))}}(F,G,t);const E=function(){const t=Mb;return Mb=0,Jb=void 0,t}();return E>0&&Mn(m).append("text").attr("x",X).attr("y",20).attr("dy","-1em").attr("text-anchor","end").attr("font-family","initial").text("⚠️").append("title").text(`${E.toLocaleString("en-US")} warning${1===E?"":"s"}. Please check the console.`),A}function CG(t,e,n){if(e.ownerDocument)return e;const i=t.createElement(n);return i.append(e),i}function yG(t){return t.flat(1/0).filter((t=>null!=t)).map(fG)}function fG(t){return"function"==typeof t.render?t:new GG(t)}ny.prototype.plot=function({marks:t=[],...e}={}){return UG({...e,marks:[...t,this]})};class GG extends ny{constructor(t){if("function"!=typeof t)throw new TypeError("invalid mark; missing render function");super(),this.render=t}render(){}}function pG(t,e){for(const n in t)mG(t[n],e);return t}function mG(t,e){const{scale:n,transform:i=!0}=t;if(null==n||!i)return;const{type:s,percent:c,interval:a,transform:l=(c?t=>100*t:mh(a,s))}=e[n]??{};null!=l&&(t.value=lh(t.value,l),t.transform=!1)}function AG(t){for(const e in t)vb(e,t[e])}function xG(t,e,n,i=zF){for(const{channels:s}of e.values())for(const e in s){const c=s[e],{scale:a}=c;if(null!=a&&i(a))if("projection"===a){if(!nU(n)){const e=void 0===n.x?.domain,i=void 0===n.y?.domain;if(e||i){const[n,s]=iU(c);e&&SG(t,"x",n),i&&SG(t,"y",s)}}}else SG(t,a,c)}return t}function SG(t,e,n){const i=t.get(e);void 0!==i?i.push(n):t.set(e,[n])}function LG(t,e,n){if(null===t.facet||"super"===t.facet)return;const{fx:i,fy:s}=t;if(null!=i||null!=s){const e=ah(t.data??i??s);if(void 0===e)throw new Error(`missing facet data in ${t.ariaLabel}`);if(null===e)return;const c={};return null!=i&&(c.fx=Xb(e,{value:i,scale:"fx"})),null!=s&&(c.fy=Xb(e,{value:s,scale:"fy"})),pG(c,n),{channels:c,groups:JC(e,c)}}if(void 0===e)return;const{channels:c,groups:a,data:l}=e;if("auto"!==t.facet||t.data===l)return{channels:c,groups:a};l.length>0&&(a.size>1||1===a.size&&c.fx&&c.fy&&[...a][0][1].size>1)&&ah(t.data)?.length===l.length&&Tb(`Warning: the ${t.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 RG(t,e={}){return ab({...e,x:null,y:null},((e,n,i,s,c,a)=>a.getMarkState(t)))}function XG(t,e,n,i,s,c,a){if(!e)return;const l=/^\s*both\s*$/i.test(e);a=function(t,e,{line:n=e.line,ticks:i,tickSize:s,tickSpacing:c,tickPadding:a,tickFormat:l,tickRotate:r,fontVariant:o,ariaLabel:g,ariaDescription:B,label:d=e.label,labelAnchor:I,labelArrow:Q=e.labelArrow,labelOffset:u}){return{anchor:t,line:n,ticks:i,tickSize:s,tickSpacing:c,tickPadding:a,tickFormat:l,tickRotate:r,fontVariant:o,ariaLabel:g,ariaDescription:B,label:d,labelAnchor:I,labelArrow:Q,labelOffset:u}}(l?i:e,c,a);const{line:r}=a;n!==xf&&n!==Lf||!r||Yh(r)||t.push(function(t){return new lG(t)}(function(t){const{anchor:e,line:n}=t;return{anchor:e,facetAnchor:e+"-empty",stroke:!0===n?void 0:n}}(a))),t.push(n(a)),l&&t.push(n({...a,anchor:s,label:null}))}function vG(t,e,n,i){e&&!Yh(e)&&t.push(n(function(t,{stroke:e=(Wh(t)?t:void 0),ticks:n=(NG(t)?t:void 0),tickSpacing:i,ariaLabel:s,ariaDescription:c}){return{stroke:e,ticks:n,tickSpacing:i,ariaLabel:s,ariaDescription:c}}(e,i)))}function NG(t){switch(typeof t){case"number":return!0;case"string":return!Wh(t)}return Rh(t)||"function"==typeof t?.range}function ZG(t,e){const n=`${e}-axis `;return t.some((t=>t.ariaLabel?.startsWith(n)))}function EG(t,e){for(const n of e)for(const e in n.channels){const{scale:i}=n.channels[e];if(i===t||"projection"===i)return!0}return!1}function VG(t){const e=t.domain();let n=t(e[0]),i=t(e[e.length-1]);return i<n&&([n,i]=[i,n]),[n,i+t.bandwidth()]}const wG=new Map([["basis",function(t){return new TQ(t)}],["basis-closed",function(t){return new zQ(t)}],["basis-open",function(t){return new KQ(t)}],["bundle",_Q],["bump-x",function(t){return new uQ(t,!0)}],["bump-y",function(t){return new uQ(t,!1)}],["cardinal",$Q],["cardinal-closed",tu],["cardinal-open",nu],["catmull-rom",cu],["catmull-rom-closed",lu],["catmull-rom-open",ou],["linear",BQ],["linear-closed",function(t){return new gu(t)}],["monotone-x",function(t){return new uu(t)}],["monotone-y",function(t){return new Fu(t)}],["natural",function(t){return new bu(t)}],["step",function(t){return new Cu(t,.5)}],["step-after",function(t){return new Cu(t,1)}],["step-before",function(t){return new Cu(t,0)}]]);function WG(t=HG,e){return"function"!=typeof t&&"auto"===`${t}`.toLowerCase()?HG:function(t=BQ,e){if("function"==typeof t)return t;const n=wG.get(`${t}`.toLowerCase());if(!n)throw new Error(`unknown curve: ${t}`);if(void 0!==e){if("beta"in n)return n.beta(e);if("tension"in n)return n.tension(e);if("alpha"in n)return n.alpha(e)}return n}(t,e)}function HG(t){return BQ(t)}function DG(t={y:"count"},e={}){[t,e]=function({cumulative:t,domain:e,thresholds:n,interval:i,...s},c){return[s,{cumulative:t,domain:e,thresholds:n,interval:i,...c}]}(t,e);const{x:n,y:i}=e;return function(t,e,n,i,{data:s=fb,filter:c=Ab,sort:a,reverse:l,...r}={},o={}){t=kG(t),e=kG(e),r=function(t,e){return function(t,e,n=ub){const i=Object.entries(t);return null!=e.title&&void 0===t.title&&i.push(["title",pb]),null!=e.href&&void 0===t.href&&i.push(["href",Gb]),i.filter((([,t])=>void 0!==t)).map((([t,i])=>null===i?function(t){return{name:t,initialize(){},scope(){},reduce(){}}}(t):n(t,i,e)))}(t,e,JG)}(r,o),s=TG(s,MF),a=null==a?void 0:JG("sort",a,o),c=null==c?void 0:MG("filter",c,o),null!=i&&Qb(r,"y","y1","y2")&&(i=null);const[g,B]=yh(t),[d,I]=yh(t),[Q,u]=yh(e),[F,h]=yh(e),[b,U]=null!=i?[i,"y"]:[],[C,y]=yh(b),{x:f,y:G,z:p,fill:m,stroke:A,x1:x,x2:S,y1:L,y2:R,domain:X,cumulative:v,thresholds:N,interval:Z,...E}=o,[V,w]=yh(p),[W]=nh(m),[H]=nh(A),[D,Y]=yh(W),[k,J]=yh(H);return{..."z"in o&&{z:V||p},..."fill"in o&&{fill:D||m},..."stroke"in o&&{stroke:k||A},...cb(E,((n,i,o)=>{const g=ph(WF(n,b),o?.[U]),d=WF(n,p),Q=WF(n,W),F=WF(n,H),C=function(t,e){for(const n in e){const i=e[n];if(void 0!==i&&!t.some((t=>t.name===n)))return i}}(r,{z:d,fill:Q,stroke:F}),f=[],G=[],m=g&&y([]),A=d&&w([]),x=Q&&Y([]),S=F&&J([]),L=t&&B([]),R=t&&I([]),X=e&&u([]),v=e&&h([]),N=function(t,e,n){const i=t?.(n),s=e?.(n);return i&&s?function*(t){const e=i.bin(t);for(const[t,[c,a]]of i.entries()){const i=s.bin(e[t]);for(const[t,[e,l]]of s.entries())yield[i[t],{data:n,x1:c,y1:e,x2:a,y2:l}]}}:i?function*(t){const e=i.bin(t);for(const[t,[s,c]]of i.entries())yield[e[t],{data:n,x1:s,x2:c}]}:function*(t){const e=s.bin(t);for(const[t,[i,c]]of s.entries())yield[e[t],{data:n,y1:i,y2:c}]}}(t,e,n);let Z=0;for(const t of r)t.initialize(n);a&&a.initialize(n),c&&c.initialize(n);for(const t of i){const e=[];for(const e of r)e.scope("facet",t);a&&a.scope("facet",t),c&&c.scope("facet",t);for(const[i,l]of hb(t,C))for(const[t,o]of hb(l,g))for(const[l,B]of N(o))if(C&&(B.z=i),!c||c.reduce(l,B)){e.push(Z++),G.push(s.reduceIndex(l,n,B)),g&&m.push(t),d&&A.push(C===d?i:d[(l.length>0?l:o)[0]]),Q&&x.push(C===Q?i:Q[(l.length>0?l:o)[0]]),F&&S.push(C===F?i:F[(l.length>0?l:o)[0]]),L&&(L.push(B.x1),R.push(B.x2)),X&&(X.push(B.y1),v.push(B.y2));for(const t of r)t.reduce(l,B);a&&a.reduce(l,B)}f.push(e)}return function(t,e,n){if(e){const n=e.output.transform(),i=(t,e)=>tF(n[t],n[e]);t.forEach((t=>t.sort(i)))}n&&t.forEach((t=>t.reverse()))}(f,a,l),{data:G,facets:f}})),...!Qb(r,"x")&&(g?{x1:g,x2:d,x:Gh(g,d)}:{x:f,x1:x,x2:S}),...!Qb(r,"y")&&(Q?{y1:Q,y2:F,y:Gh(Q,F)}:{y:G,y1:L,y2:R}),...C&&{[U]:C},...Object.fromEntries(r.map((({name:t,output:e})=>[t,e])))}}(function(t,{cumulative:e,domain:n,thresholds:i,interval:s},c){void 0===(t={...Lh(t)}).domain&&(t.domain=n);void 0===t.cumulative&&(t.cumulative=e);void 0===t.thresholds&&(t.thresholds=i);void 0===t.interval&&(t.interval=s);void 0===t.value&&(t.value=c);return t.thresholds=function(t,e,n=KG){if(void 0===t)return void 0===e?n:xh(e);if("string"==typeof t){switch(t.toLowerCase()){case"freedman-diaconis":return ie;case"scott":return se;case"sturges":return Kt;case"auto":return KG}return LF(t)}return t}(t.thresholds,t.interval),t}(n,e,MF),null,0,i,t,xy(e))}function YG(t={}){return function(t,e,n={}){if(null==n?.interval)return n;const{reduce:i=Gb}=n,s={filter:null};return null!=n[e]&&(s[e]=i),null!=n[`${e}1`]&&(s[`${e}1`]=i),null!=n[`${e}2`]&&(s[`${e}2`]=i),t(s,n)}(DG,"y",ay(t,"x"))}function kG(t){if(null==t)return;const{value:e,cumulative:n,domain:i=Gt,thresholds:s}=t,c=t=>{let c,a=WF(t,e);if(Nh(a)||function(t){return function(t){return Sh(t)&&"function"==typeof t?.floor&&t.floor()instanceof Date}(t)||Rh(t)&&Nh(t)}(s)){a=lh(a,eh,Float64Array);let[t,e]="function"==typeof i?i(a):i,n="function"!=typeof s||Sh(s)?s:s(a,t,e);"number"==typeof n&&(n=Kg(t,e,n)),Sh(n)&&(i===Gt&&(t=n.floor(t),e=n.offset(n.floor(e))),n=n.range(t,n.offset(e))),c=n}else{a=$F(a);let[t,e]="function"==typeof i?i(a):i,n="function"!=typeof s||Sh(s)?s:s(a,t,e);if("number"==typeof n)if(i===Gt){let i=Tt(t,e,n);if(isFinite(i))if(i>0){let s=Math.round(t/i),c=Math.round(e/i);s*i<=t||--s,c*i>e||++c;let a=c-s+1;n=new Float64Array(a);for(let t=0;t<a;++t)n[t]=(s+t)*i}else if(i<0){i=-i;let s=Math.round(t*i),c=Math.round(e*i);s/i<=t||--s,c/i>e||++c;let a=c-s+1;n=new Float64Array(a);for(let t=0;t<a;++t)n[t]=(s+t)/i}else n=[t];else n=[t]}else n=Mt(t,e,n);else Sh(n)&&(i===Gt&&(t=n.floor(t),e=n.offset(n.floor(e))),n=n.range(t,n.offset(e)));c=n}const l=[];if(1===c.length)l.push([c[0],c[0]]);else for(let t=1;t<c.length;++t)l.push([c[t-1],c[t]]);return l.bin=(n<0?PG:n>0?_G:OG)(l,c,a),l};return c.label=fh(e),c}function JG(t,e,n){return ub(t,e,n,MG)}function MG(t,e,n){return Fb(t,e,n,TG)}function TG(t,e){return bb(t,e,zG)}function zG(t){switch(`${t}`.toLowerCase()){case"x":return $G;case"x1":return tp;case"x2":return ep;case"y":return qG;case"y1":return np;case"y2":return ip;case"z":return Rb}throw new Error(`invalid bin reduce: ${t}`)}function KG(t,e,n){return Math.min(200,se(t,e,n))}function OG(t,e,n){return e=$F(e),i=>{const s=t.map((()=>[]));for(const t of i)s[ut(e,n[t])-1]?.push(t);return s}}function _G(t,e,n){const i=OG(t,e,n);return t=>{const e=i(t);for(let t=1,n=e.length;t<n;++t){const n=e[t-1],i=e[t];for(const t of n)i.push(t)}return e}}function PG(t,e,n){const i=OG(t,e,n);return t=>{const e=i(t);for(let t=e.length-2;t>=0;--t){const n=e[t+1],i=e[t];for(const t of n)i.push(t)}return e}}function jG(t,e){const n=(+t+ +e)/2;return t instanceof Date?new Date(n):n}const $G={reduceIndex:(t,e,{x1:n,x2:i})=>jG(n,i)},qG={reduceIndex:(t,e,{y1:n,y2:i})=>jG(n,i)},tp={reduceIndex:(t,e,{x1:n})=>n},ep={reduceIndex:(t,e,{x2:n})=>n},np={reduceIndex:(t,e,{y1:n})=>n},ip={reduceIndex:(t,e,{y2:n})=>n};function sp(t={},e={}){1===arguments.length&&([t,e]=function(t){const{offset:e,order:n,reverse:i,...s}=t;return[{offset:e,order:n,reverse:i},s]}(t));const{x1:n,x:i=n,y:s,...c}=e,[a,l,r,o]=function(t,e=TF,n,i,{offset:s,order:c,reverse:a},l){if(null===e)throw new Error(`stack requires ${i}`);const r=uh(l),[o,g]=yh(t),[B,d]=Ch(e),[I,Q]=Ch(e);return B.hint=I.hint=ap,s=function(t){if(null==t)return;if("function"==typeof t)return t;switch(`${t}`.toLowerCase()){case"expand":case"normalize":return rp;case"center":case"silhouette":return op;case"wiggle":return gp}throw new Error(`unknown offset: ${t}`)}(s),c=function(t,e,n){if(void 0===t&&e===gp)return Ip(tF);if(null==t)return;if("string"==typeof t){const e=t.startsWith("-"),i=e?eF:tF;switch((e?t.slice(1):t).toLowerCase()){case"value":case n:return function(t){return(e,n,i)=>(e,n)=>t(i[e],i[n])}(i);case"z":return function(t){return(e,n,i,s)=>(e,n)=>t(s[e],s[n])}(i);case"sum":return function(t){return Fp(t,((t,e,n,i)=>Ht(Fh(t),(t=>Be(t,(t=>n[t]))),(t=>i[t]))))}(i);case"appearance":return function(t){return Fp(t,((t,e,n,i)=>Ht(Fh(t),(t=>e[te(t,(t=>n[t]))]),(t=>i[t]))))}(i);case"inside-out":return Ip(i)}return Qp(kF(t))}if("function"==typeof t)return(1===t.length?Qp:up)(t);if(Array.isArray(t))return i=t,Fp(tF,(()=>i));var i;throw new Error(`invalid order: ${t}`)}(c,s,i),[cb(l,((i,l,o)=>{({data:i,facets:l}=function(t,e){if(1===e.length)return{data:t,facets:e};const n=t.length,i=new Uint8Array(n);let s=0;for(const t of e)for(const e of t)i[e]&&++s,i[e]=1;if(0===s)return{data:t,facets:e};const c=(t=rh(t))[wF]=new Uint32Array(n+s);e=e.map((t=>rh(t,Uint32Array)));let a=n;i.fill(0);for(const n of e)for(let e=0,s=n.length;e<s;++e){const s=n[e];i[s]?(n[e]=a,t[a]=t[s],c[a]=s,++a):c[s]=s,i[s]=1}return{data:t,facets:e}}(i,l));const B=null==t?void 0:g(ph(WF(i,t),o?.[n])),I=WF(i,e,Float64Array),u=WF(i,r),F=c&&c(i,B,I,u),h=i.length,b=d(new Float64Array(h)),U=Q(new Float64Array(h)),C=[];for(const t of l){const e=B?Array.from(vt(t,(t=>B[t])).values()):[t];if(F)for(const t of e)t.sort(F);for(const t of e){let e=0,n=0;a&&t.reverse();for(const i of t){const t=I[i];t<0?e=U[i]=(b[i]=e)+t:t>0?n=U[i]=(b[i]=n)+t:U[i]=b[i]=n}}C.push(e)}return s&&s(C,b,U,u),{data:i,facets:l}})),o,B,I]}(i,s,"x","y",t,c);return{...a,x1:n,x:l,y1:r,y2:o,y:Gh(r,o)}}function cp({y:t,y1:e,y2:n,...i}={}){return i=ay(i,"x"),void 0===e&&void 0===n?sp({y:t,...i}):([e,n]=function(t,e,n,i=MF){return void 0===e&&void 0===n?(e=0,n=void 0===t?i:t):void 0===e?e=void 0===t?0:t:void 0===n&&(n=void 0===t?0:t),[e,n]}(t,e,n),{...i,y1:e,y2:n})}const ap={length:!0};function lp(t,e){let n=0,i=0;for(const s of t){const t=e[s];t<n&&(n=t),t>i&&(i=t)}return[n,i]}function rp(t,e,n){for(const i of t)for(const t of i){const[i,s]=lp(t,n);for(const c of t){const t=1/(s-i||1);e[c]=t*(e[c]-i),n[c]=t*(n[c]-i)}}}function op(t,e,n){for(const i of t){for(const t of i){const[i,s]=lp(t,n);for(const c of t){const t=(s+i)/2;e[c]-=t,n[c]-=t}}Bp(i,e,n)}dp(t,e,n)}function gp(t,e,n,i){for(const s of t){const t=new mt;let c=0;for(const a of s){let s=-1;const l=a.map((t=>Math.abs(n[t]-e[t]))),r=a.map((c=>{s=i?i[c]:++s;const a=n[c]-e[c],l=t.has(s)?a-t.get(s):0;return t.set(s,a),l})),o=[0,...Ct(r)];for(const t of a)e[t]+=c,n[t]+=c;const g=Be(l);g&&(c-=Be(l,((t,e)=>(r[e]/2+o[e])*t))/g)}Bp(s,e,n)}dp(t,e,n)}function Bp(t,e,n){const i=Pt(t,(t=>Pt(t,(t=>e[t]))));for(const s of t)for(const t of s)e[t]-=i,n[t]-=i}function dp(t,e,n){const i=t.length;if(1===i)return;const s=t.map((t=>t.flat())),c=s.map((t=>(Pt(t,(t=>e[t]))+Ot(t,(t=>n[t])))/2)),a=Pt(c);for(let t=0;t<i;t++){const i=a-c[t];for(const c of s[t])e[c]+=i,n[c]+=i}}function Ip(t){return Fp(t,((t,e,n,i)=>{const s=Fh(t),c=Ht(s,(t=>e[te(t,(t=>n[t]))]),(t=>i[t])),a=Nt(s,(t=>Be(t,(t=>n[t]))),(t=>i[t])),l=[],r=[];let o=0;for(const t of c)o<0?(o+=a.get(t),l.push(t)):(o-=a.get(t),r.push(t));return r.reverse().concat(l)}))}function Qp(t){return e=>{const n=WF(e,t);return(t,e)=>tF(n[t],n[e])}}function up(t){return e=>(n,i)=>t(e[n],e[i])}function Fp(t,e){return(n,i,s,c)=>{if(!c)throw new Error("missing channel: z");const a=new mt(e(n,i,s,c).map(((t,e)=>[t,e])));return(e,n)=>t(a.get(c[e]),a.get(c[n]))}}const hp={ariaLabel:"line",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round",strokeMiterlimit:1};class bp extends ny{constructor(t,e={}){const{x:n,y:i,z:s,curve:c,tension:a}=e;super(t,{x:{value:n,scale:"x"},y:{value:i,scale:"y"},z:{value:uh(e),optional:!0}},e,hp),this.z=s,this.curve=WG(c,a),Fy(this,e)}filter(t){return t}project(t,e,n){this.curve!==HG&&super.project(t,e,n)}render(t,e,n,i,s){const{x:c,y:a}=n,{curve:l}=this;return kb("svg:g",s).call(LC,this,i,s).call(NC,this,e).call((e=>e.selectAll().data(SC(t,[c,a],this,n)).enter().append("path").call(RC,this).call(xC,this,n).call(my,this,n,s).attr("d",l===HG&&s.projection?function(t,e,n){const i=yr(t);return e=$F(e),n=$F(n),t=>{let s=[];const c=[s];for(const i of t)-1===i?(s=[],c.push(s)):s.push([e[i],n[i]]);return i({type:"MultiLineString",coordinates:c})}}(s.projection,c,a):QQ().curve(l).defined((t=>t>=0)).x((t=>c[t])).y((t=>a[t]))))).node()}}function Up(t,{x:e=JF,y:n=MF,...i}={}){return new bp(t,YG({...i,x:e,y:n}))}const Cp={ariaLabel:"rect"};class yp extends ny{constructor(t,e={}){const{x1:n,y1:i,x2:s,y2:c,inset:a=0,insetTop:l=a,insetRight:r=a,insetBottom:o=a,insetLeft:g=a,rx:B,ry:d}=e;super(t,{x1:{value:n,scale:"x",type:null!=n&&null==s?"band":void 0,optional:!0},y1:{value:i,scale:"y",type:null!=i&&null==c?"band":void 0,optional:!0},x2:{value:s,scale:"x",optional:!0},y2:{value:c,scale:"y",optional:!0}},e,Cp),this.insetTop=OF(l),this.insetRight=OF(r),this.insetBottom=OF(o),this.insetLeft=OF(g),this.rx=ZC(B,"auto"),this.ry=ZC(d,"auto")}render(t,e,n,i,s){const{x:c,y:a}=e,{x1:l,y1:r,x2:o,y2:g}=n,{marginTop:B,marginRight:d,marginBottom:I,marginLeft:Q,width:u,height:F}=i,{projection:h}=s,{insetTop:b,insetRight:U,insetBottom:C,insetLeft:y,rx:f,ry:G}=this,p=(c?.bandwidth?c.bandwidth():0)-y-U,m=(a?.bandwidth?a.bandwidth():0)-b-C;return kb("svg:g",s).call(LC,this,i,s).call(NC,this,{},0,0).call((e=>e.selectAll().data(t).enter().append("rect").call(RC,this).attr("x",!l||!h&&IC(c)?Q+y:o?t=>Math.min(l[t],o[t])+y:t=>l[t]+y).attr("y",!r||!h&&IC(a)?B+b:g?t=>Math.min(r[t],g[t])+b:t=>r[t]+b).attr("width",!l||!h&&IC(c)?u-d-Q-U-y:o?t=>Math.max(0,Math.abs(o[t]-l[t])+p):p).attr("height",!r||!h&&IC(a)?F-B-I-b-C:g?t=>Math.max(0,Math.abs(r[t]-g[t])+m):m).call(vC,"rx",f).call(vC,"ry",G).call(AC,this,n))).node()}}function fp(t,e={}){return function(t){return function({x:t,x1:e,x2:n}){return void 0!==t||void 0!==e||void 0!==n}(t)||oh(t)||void 0!==t.interval}(e)||(e={...e,x:JF,y2:MF,interval:1}),new yp(t,cp(function(t={}){return Xy("x",xy,t,!0)}(function(t={}){return oh(t)?t:{...t,y:MF}}(e))))}function Gp(t,e,n){var i=e,s=function(t,e){return atob(t)}(t),c=s.indexOf("\n",10)+1,a=s.substring(c)+"//# sourceMappingURL="+i,l=new Blob([a],{type:"application/javascript"});return URL.createObjectURL(l)}var pp,mp,Ap,xp=(pp="Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewoJJ3VzZSBzdHJpY3QnOwoKCXZhciBjb21tb25qc0dsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHt9OwoKCXZhciBkaXN0cmlidXRpb25zID0ge2V4cG9ydHM6IHt9fTsKCgkoZnVuY3Rpb24gKG1vZHVsZSkgewoKCSAgLy8gQSBudW1iZXIgb2YgbG9nIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb25zIChQREYpLiBOYW1pbmcgYW5kIHBhcmFtZXRlcml6YXRpb24KCSAgLy8gc2hvdWxkIG1hdGNoIFIncywgZXhjZXB0IGZvciB0aGF0IGFsbCBmdW5jdGlvbnMgcmVzaWRlIGluIGFuIGxkIG9iamVjdCAoCgkgIC8vIGFzIGluICJsb2cgZGVuc2l0eSIpLCBzbyB0byBnZXQgYSBub3JtYWwgbG9nIGRlbnNpdHkgeW91IHdvdWxkIHdyaXRlCgkgIC8vIGxkLm5vcm0oLi4uKS4KCSAgLy8gTW9zdCBvZiB0aGUgY29kZSBiZWxvdyBpcyBkaXJlY3RseSB0YWtlbiBmcm9tIHRoZSBncmVhdCBKc3RhdCBwcm9qZWN0CgkgIC8vIChodHRwczovL2dpdGh1Yi5jb20vanN0YXQvKSB3aGljaCBpbmNsdWRlcyBQREYgZm9yIG1hbnkgY29tbW9uIHByb2JhYmlsaXR5CgkgIC8vIGRpc3RyaWJ1dGlvbnMuIFdoYXQgSSBoYXZlIGRvbmUgaXMgb25seSB0byBjb252ZXJ0IHRoZXNlIHRvIGxvZyBQREZzLgoKCSAgLyoKCSAgT3JpZ2luYWwgd29yayBDb3B5cmlnaHQgKGMpIDIwMTMgalN0YXQKCSAgTW9kaWZpZWQgd29yayBDb3B5cmlnaHQgKGMpIDIwMTUgUmFzbXVzIELDpcOldGggCgkgIAlQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CgkgIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCgkgIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKCSAgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAoJICBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKCSAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCSAgCVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCgkgIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoJICAJVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKCSAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCgkgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQoJICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCgkgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCgkgIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KCSAgVEhFIFNPRlRXQVJFLgoJICAJKi8KCgkgIC8vIFRoaXMgYm9pbGVyIHBsYXRlIGNvZGUgaGVyZSBpcyB0YWtlbiBmcm9tOgoJICAvLyBodHRwczovL2dpdGh1Yi5jb20vdW1kanMvdW1kL2Jsb2IvbWFzdGVyL3RlbXBsYXRlcy9yZXR1cm5FeHBvcnRzLmpzCgkgIC8vIEl0IHNob3VsZCBtYWtlIHNodXJlIHRoYXQgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBib3RoIGluIHRoZSBicm93c2VyLAoJICAvLyBOb2RlLCBhbmQgYnkgdXNpbmcgdGhlIEFzeW5jaHJvbm91cyBNb2R1bGUgRGVmaW5pdGlvbiBzdGFuZGFyZC4KCSAgLy8gSWYgdGhpcyBtb2R1bGUgaXMgbG9hZGVkIGluIHRoZSBicm93c2VyIGl0IHdpbGwgY3JlYXRlZCB0aGUgZ2xvYmFsCgkgIC8vIG9iamVjdCBsZCAuCgkgIChmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkgewoJICAgIGlmIChtb2R1bGUuZXhwb3J0cykgewoJICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0CgkgICAgICAvLyBvbmx5IENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cywKCSAgICAgIC8vIGxpa2UgTm9kZS4KCSAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpOwoJICAgIH0gZWxzZSB7CgkgICAgICAvLyBCcm93c2VyIGdsb2JhbHMgKHJvb3QgaXMgd2luZG93KQoJICAgICAgcm9vdC5sZCA9IGZhY3RvcnkoKTsKCSAgICB9CgkgIH0pKGNvbW1vbmpzR2xvYmFsLCBmdW5jdGlvbiAoKSB7CgkgICAgLy8gT2JqZWN0IHRvIGhvbGQgdGhlIGZ1bmN0aW9ucyB0byBiZSBleHBvcnRlZC4KCSAgICB2YXIgbGQgPSB7fTsKCgkgICAgLy8vLy8vLy8vLyBIZWxwZXIgZnVuY3Rpb25zIC8vLy8vLy8vLy8KCSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKCSAgICB2YXIgbGdhbW1hID0gZnVuY3Rpb24gKHgpIHsKCSAgICAgIHZhciBqID0gMDsKCSAgICAgIHZhciBjb2YgPSBbNzYuMTgwMDkxNzI5NDcxNDYsIC04Ni41MDUzMjAzMjk0MTY3NywgMjQuMDE0MDk4MjQwODMwOTEsIC0xLjIzMTczOTU3MjQ1MDE1NSwgMC4xMjA4NjUwOTczODY2MTc5ZS0yLCAtMC41Mzk1MjM5Mzg0OTUzZS01XTsKCSAgICAgIHZhciBzZXIgPSAxLjAwMDAwMDAwMDE5MDAxNTsKCSAgICAgIHZhciB4eCwgeSwgdG1wOwoJICAgICAgdG1wID0gKHkgPSB4eCA9IHgpICsgNS41OwoJICAgICAgdG1wIC09ICh4eCArIDAuNSkgKiBsb2codG1wKTsKCSAgICAgIGZvciAoOyBqIDwgNjsgaisrKSBzZXIgKz0gY29mW2pdIC8gKyt5OwoJICAgICAgcmV0dXJuIGxvZygyLjUwNjYyODI3NDYzMTAwMDUgKiBzZXIgLyB4eCkgLSB0bXA7CgkgICAgfTsKCSAgICBsZC5sZ2FtbWEgPSBsZ2FtbWE7CgkgICAgdmFyIGxmYWN0b3JpYWwgPSBmdW5jdGlvbiAobikgewoJICAgICAgcmV0dXJuIG4gPCAwID8gTmFOIDogbGdhbW1hKG4gKyAxKTsKCSAgICB9OwoJICAgIGxkLmxmYWN0b3JpYWwgPSBsZmFjdG9yaWFsOwoJICAgIHZhciBsY2hvb3NlID0gZnVuY3Rpb24gKG4sIGspIHsKCSAgICAgIHJldHVybiBsZmFjdG9yaWFsKG4pIC0gbGZhY3RvcmlhbChrKSAtIGxmYWN0b3JpYWwobiAtIGspOwoJICAgIH07CgkgICAgbGQubGNob29zZSA9IGxjaG9vc2U7CgkgICAgdmFyIGxiZXRhID0gZnVuY3Rpb24gKGEsIGIpIHsKCSAgICAgIHJldHVybiBsZ2FtbWEoYSkgKyBsZ2FtbWEoYikgLSBsZ2FtbWEoYSArIGIpOwoJICAgIH07CgkgICAgbGQubGJldGEgPSBsYmV0YTsKCSAgICB2YXIgbG9nID0gTWF0aC5sb2c7CgkgICAgdmFyIGV4cCA9IE1hdGguZXhwOwoJICAgIHZhciBhYnMgPSBNYXRoLmFiczsKCSAgICB2YXIgcG93ID0gTWF0aC5wb3c7CgkgICAgdmFyIHNxcnQgPSBNYXRoLnNxcnQ7CgkgICAgdmFyIHBpID0gTWF0aC5QSTsKCgkgICAgLy8vLy8vLy8vLyBDb250aW5vdXMgZGlzdHJpYnV0aW9ucyAvLy8vLy8vLy8vCgkgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoJICAgIGxkLmJldGEgPSBmdW5jdGlvbiAoeCwgc2hhcGUxLCBzaGFwZTIpIHsKCSAgICAgIGlmICh4ID4gMSB8fCB4IDwgMCkgewoJICAgICAgICByZXR1cm4gLUluZmluaXR5OwoJICAgICAgfQoJICAgICAgaWYgKHNoYXBlMSA9PT0gMSAmJiBzaGFwZTIgPT09IDEpIHsKCSAgICAgICAgcmV0dXJuIDA7CgkgICAgICB9IGVsc2UgewoJICAgICAgICByZXR1cm4gKHNoYXBlMSAtIDEpICogbG9nKHgpICsgKHNoYXBlMiAtIDEpICogbG9nKDEgLSB4KSAtIGxiZXRhKHNoYXBlMSwgc2hhcGUyKTsKCSAgICAgIH0KCSAgICB9OwoJICAgIGxkLmNhdWNoeSA9IGZ1bmN0aW9uICh4LCBsb2NhdGlvbiwgc2NhbGUpIHsKCSAgICAgIHJldHVybiBsb2coc2NhbGUpIC0gbG9nKHBvdyh4IC0gbG9jYXRpb24sIDIpICsgcG93KHNjYWxlLCAyKSkgLSBsb2cocGkpOwoJICAgIH07CgkgICAgbGQubm9ybSA9IGZ1bmN0aW9uICh4LCBtZWFuLCBzZCkgewoJICAgICAgcmV0dXJuIC0wLjUgKiBsb2coMiAqIHBpKSAtIGxvZyhzZCkgLSBwb3coeCAtIG1lYW4sIDIpIC8gKDIgKiBzZCAqIHNkKTsKCSAgICB9OwoKCSAgICAvLyBBIGJpdmFyaWF0ZSBOb3JtYWwgZGlzdHJpYnV0aW9uIHBhcmFtZXRlcml6ZWQgYnkgYXJyYXlzIG9mIHR3byBtZWFucyBhbmQgU0RzLCBhbmQgCgkgICAgLy8gdGhlIGNvcnJlbGF0aW9uLgoJICAgIGxkLmJpdmFybm9ybSA9IGZ1bmN0aW9uICh4LCBtZWFuLCBzZCwgY29ycikgewoJICAgICAgdmFyIHogPSBwb3coeFswXSAtIG1lYW5bMF0sIDIpIC8gcG93KHNkWzBdLCAyKSArIHBvdyh4WzFdIC0gbWVhblsxXSwgMikgLyBwb3coc2RbMV0sIDIpIC0gMiAqIGNvcnIgKiAoeFswXSAtIG1lYW5bMF0pICogKHhbMV0gLSBtZWFuWzFdKSAvIChzZFswXSAqIHNkWzFdKTsKCSAgICAgIHZhciBub3JtYWxpemluZ19mYWN0b3IgPSAtKGxvZygyKSArIGxvZyhwaSkgKyBsb2coc2RbMF0pICsgbG9nKHNkWzFdKSArIDAuNSAqIGxvZygxIC0gcG93KGNvcnIsIDIpKSk7CgkgICAgICB2YXIgYml2YXJfbG9nX2RlbnMgPSBub3JtYWxpemluZ19mYWN0b3IgLSB6IC8gKDIgKiAoMSAtIHBvdyhjb3JyLCAyKSkpOwoJICAgICAgcmV0dXJuIGJpdmFyX2xvZ19kZW5zOwoJICAgIH07CgkgICAgbGQubGFwbGFjZSA9IGZ1bmN0aW9uICh4LCBsb2NhdGlvbiwgc2NhbGUpIHsKCSAgICAgIHJldHVybiAtYWJzKHggLSBsb2NhdGlvbikgLyBzY2FsZSAtIGxvZygyICogc2NhbGUpOwoJICAgIH07CgkgICAgbGQuZGV4cCA9IGxkLmxhcGxhY2U7CgkgICAgbGQuZ2FtbWEgPSBmdW5jdGlvbiAoeCwgc2hhcGUsIHJhdGUpIHsKCSAgICAgIHZhciBzY2FsZSA9IDEgLyByYXRlOwoJICAgICAgaWYgKHggPCAwKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICBpZiAoeCA9PT0gMCAmJiBzaGFwZSA9PT0gMSkgewoJICAgICAgICByZXR1cm4gLWxvZyhzY2FsZSk7CgkgICAgICB9IGVsc2UgewoJICAgICAgICByZXR1cm4gKHNoYXBlIC0gMSkgKiBsb2coeCkgLSB4IC8gc2NhbGUgLSBsZ2FtbWEoc2hhcGUpIC0gc2hhcGUgKiBsb2coc2NhbGUpOwoJICAgICAgfQoJICAgIH07CgkgICAgbGQuaW52Z2FtbWEgPSBmdW5jdGlvbiAoeCwgc2hhcGUsIHNjYWxlKSB7CgkgICAgICBpZiAoeCA8PSAwKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICByZXR1cm4gLShzaGFwZSArIDEpICogbG9nKHgpIC0gc2NhbGUgLyB4IC0gbGdhbW1hKHNoYXBlKSArIHNoYXBlICogbG9nKHNjYWxlKTsKCSAgICB9OwoJICAgIGxkLmxub3JtID0gZnVuY3Rpb24gKHgsIG1lYW5sb2csIHNkbG9nKSB7CgkgICAgICBpZiAoeCA8PSAwKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICByZXR1cm4gLWxvZyh4KSAtIDAuNSAqIGxvZygyICogcGkpIC0gbG9nKHNkbG9nKSAtIHBvdyhsb2coeCkgLSBtZWFubG9nLCAyKSAvICgyICogc2Rsb2cgKiBzZGxvZyk7CgkgICAgfTsKCSAgICBsZC5wYXJldG8gPSBmdW5jdGlvbiAoeCwgc2NhbGUsIHNoYXBlKSB7CgkgICAgICBpZiAoeCA8IHNjYWxlKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICByZXR1cm4gbG9nKHNoYXBlKSArIHNoYXBlICogbG9nKHNjYWxlKSAtIChzaGFwZSArIDEpICogbG9nKHgpOwoJICAgIH07CgkgICAgbGQudCA9IGZ1bmN0aW9uICh4LCBsb2NhdGlvbiwgc2NhbGUsIGRmKSB7CgkgICAgICBkZiA9IGRmID4gMWUxMDAgPyAxZTEwMCA6IGRmOwoJICAgICAgcmV0dXJuIGxnYW1tYSgoZGYgKyAxKSAvIDIpIC0gbGdhbW1hKGRmIC8gMikgLSBsb2coc3FydChwaSAqIGRmKSAqIHNjYWxlKSArIGxvZyhwb3coMSArIDEgLyBkZiAqIHBvdygoeCAtIGxvY2F0aW9uKSAvIHNjYWxlLCAyKSwgLShkZiArIDEpIC8gMikpOwoJICAgIH07CgoJICAgIC8vIFRoaXMgaXMgYSBkaXJlY3QgamF2YXNjcmlwdCB0cmFuc2xhdGlvbiBvZiB0aGUgUiBjb2RlIHVzZWQgdG8gZXZhbHVhdGUKCSAgICAvLyB0aGUgbG9nIGRlbnNpdHkgb2YgYSB3ZWlidWxsIGRpc3RyaWJ1dGlvbjogCgkgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3djaC9yLXNvdXJjZS9ibG9iL2IxNTZlM2E3MTE5NjdmNTgxMzFlMjNjMWIxZGMxZWE5MGUyZjBjNDMvc3JjL25tYXRoL2R3ZWlidWxsLmMKCSAgICBsZC53ZWlidWxsID0gZnVuY3Rpb24gKHgsIHNoYXBlLCBzY2FsZSkgewoJICAgICAgaWYgKHggPCAwKSByZXR1cm4gLUluZmluaXR5OwoJICAgICAgaWYgKHggPT09IDAgJiYgc2hhcGUgPCAxKSByZXR1cm4gSW5maW5pdHk7CgkgICAgICB2YXIgdG1wMSA9IHBvdyh4IC8gc2NhbGUsIHNoYXBlIC0gMSk7CgkgICAgICB2YXIgdG1wMiA9IHRtcDEgKiAoeCAvIHNjYWxlKTsKCSAgICAgIHJldHVybiAtdG1wMiArIGxvZyhzaGFwZSAqIHRtcDEgLyBzY2FsZSk7CgkgICAgfTsKCgkgICAgLy8gVGhpcyBpcyBhIGRpcmVjdCBqYXZhc2NyaXB0IHRyYW5zbGF0aW9uIG9mIHRoZSBSIGNvZGUgdXNlZCB0byBldmFsdWF0ZQoJICAgIC8vIHRoZSBsb2cgZGVuc2l0eSBvZiBhIGxvZ2lzdGljIGRpc3RyaWJ1dGlvbjogCgkgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3djaC9yLXNvdXJjZS9ibG9iL2IxNTZlM2E3MTE5NjdmNTgxMzFlMjNjMWIxZGMxZWE5MGUyZjBjNDMvc3JjL25tYXRoL2Rsb2dpcy5jCgkgICAgbGQubG9naXMgPSBmdW5jdGlvbiAoeCwgbG9jYXRpb24sIHNjYWxlKSB7CgkgICAgICB4ID0gYWJzKCh4IC0gbG9jYXRpb24pIC8gc2NhbGUpOwoJICAgICAgdmFyIGUgPSBleHAoLXgpOwoJICAgICAgdmFyIGYgPSAxLjAgKyBlOwoJICAgICAgcmV0dXJuIC0oeCArIGxvZyhzY2FsZSAqIGYgKiBmKSk7CgkgICAgfTsKCSAgICBsZC5kaXJpY2hsZXQgPSBmdW5jdGlvbiAoeCwgYWxwaGEpIHsKCSAgICAgIHZhciBzdW1fYWxwaGEgPSAwOwoJICAgICAgdmFyIHN1bV9sZ2FtbWFfYWxwaGEgPSAwOwoJICAgICAgdmFyIHN1bV9hbHBoYV9zdWJfMV9sb2dfeCA9IDA7CgkgICAgICB2YXIgbiA9IGFscGhhLmxlbmd0aDsKCSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7CgkgICAgICAgIHN1bV9hbHBoYSArPSBhbHBoYVtpXTsKCSAgICAgICAgc3VtX2xnYW1tYV9hbHBoYSArPSBsZ2FtbWEoYWxwaGFbaV0pOwoJICAgICAgICBzdW1fYWxwaGFfc3ViXzFfbG9nX3ggKz0gKGFscGhhW2ldIC0gMSkgKiBsb2coeFtpXSk7CgkgICAgICB9CgkgICAgICByZXR1cm4gbGdhbW1hKHN1bV9hbHBoYSkgLSBzdW1fbGdhbW1hX2FscGhhICsgc3VtX2FscGhhX3N1Yl8xX2xvZ194OwoJICAgIH07CgkgICAgbGQuZXhwID0gZnVuY3Rpb24gKHgsIHJhdGUpIHsKCSAgICAgIHJldHVybiB4IDwgMCA/IC1JbmZpbml0eSA6IGxvZyhyYXRlKSAtIHJhdGUgKiB4OwoJICAgIH07CgkgICAgbGQudW5pZiA9IGZ1bmN0aW9uICh4LCBtaW4sIG1heCkgewoJICAgICAgcmV0dXJuIHggPCBtaW4gfHwgeCA+IG1heCA/IC1JbmZpbml0eSA6IGxvZygxIC8gKG1heCAtIG1pbikpOwoJICAgIH07CgoJICAgIC8vLy8vLy8vLy8gRGlzY3JldGUgZGlzdHJpYnV0aW9ucyAvLy8vLy8vLy8vCgkgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgkgICAgbGQuYmVybiA9IGZ1bmN0aW9uICh4LCBwcm9iKSB7CgkgICAgICByZXR1cm4gISh4ID09PSAwIHx8IHggPT09IDEpID8gLUluZmluaXR5IDogbG9nKHggKiBwcm9iICsgKDEgLSB4KSAqICgxIC0gcHJvYikpOwoJICAgIH07CgkgICAgbGQuY2F0ID0gZnVuY3Rpb24gKHgsIHByb2JzKSB7CgkgICAgICBpZiAoeCA8IDEgfHwgeCA+IHByb2JzLmxlbmd0aCkgewoJICAgICAgICByZXR1cm4gLUluZmluaXR5OwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgcmV0dXJuIGxvZyhwcm9ic1t4IC0gMV0pOwoJICAgICAgfQoJICAgIH07CgkgICAgbGQuYmlub20gPSBmdW5jdGlvbiAoeCwgc2l6ZSwgcHJvYikgewoJICAgICAgaWYgKHggPiBzaXplIHx8IHggPCAwKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICBpZiAocHJvYiA9PT0gMCB8fCBwcm9iID09PSAxKSB7CgkgICAgICAgIHJldHVybiBzaXplICogcHJvYiA9PT0geCA/IDAgOiAtSW5maW5pdHk7CgkgICAgICB9CgkgICAgICByZXR1cm4gbGNob29zZShzaXplLCB4KSArIHggKiBsb2cocHJvYikgKyAoc2l6ZSAtIHgpICogbG9nKDEgLSBwcm9iKTsKCSAgICB9OwoJICAgIGxkLm5iaW5vbSA9IGZ1bmN0aW9uICh4LCBzaXplLCBwcm9iKSB7CgkgICAgICBpZiAoeCA8IDApIHsKCSAgICAgICAgcmV0dXJuIC1JbmZpbml0eTsKCSAgICAgIH0KCSAgICAgIHJldHVybiBsY2hvb3NlKHggKyBzaXplIC0gMSwgc2l6ZSAtIDEpICsgeCAqIGxvZygxIC0gcHJvYikgKyBzaXplICogbG9nKHByb2IpOwoJICAgIH07CgkgICAgbGQuaHlwZXIgPSBmdW5jdGlvbiAoeCwgbSwgbiwgaykgewoJICAgICAgaWYgKHggPCAwIHx8IHggPiBrKSB7CgkgICAgICAgIHJldHVybiAtSW5maW5pdHk7CgkgICAgICB9IGVsc2UgewoJICAgICAgICByZXR1cm4gbGNob29zZShtLCB4KSArIGxjaG9vc2UobiwgayAtIHgpIC0gbGNob29zZShtICsgbiwgayk7CgkgICAgICB9CgkgICAgfTsKCSAgICBsZC5wb2lzID0gZnVuY3Rpb24gKHgsIGxhbWJkYSkgewoJICAgICAgcmV0dXJuIHggPCAwID8gLUluZmluaXR5IDogbG9nKGxhbWJkYSkgKiB4IC0gbGFtYmRhIC0gbGZhY3RvcmlhbCh4KTsKCSAgICB9OwoJICAgIHJldHVybiBsZDsKCSAgfSk7Cgl9KShkaXN0cmlidXRpb25zKTsKCXZhciBkaXN0cmlidXRpb25zRXhwb3J0cyA9IGRpc3RyaWJ1dGlvbnMuZXhwb3J0czsKCgl2YXIgbWNtYyA9IHtleHBvcnRzOiB7fX07CgoJKGZ1bmN0aW9uIChtb2R1bGUpIHsKCgkgIC8vIFRoaXMgYm9pbGVyIHBsYXRlIGNvZGUgaGVyZSBpcyB0YWtlbiBmcm9tOgoJICAvLyBodHRwczovL2dpdGh1Yi5jb20vdW1kanMvdW1kL2Jsb2IvbWFzdGVyL3RlbXBsYXRlcy9yZXR1cm5FeHBvcnRzLmpzCgkgIC8vIEl0IHNob3VsZCBtYWtlIHNodXJlIHRoYXQgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBib3RoIGluIHRoZSBicm93c2VyLAoJICAvLyBOb2RlLCBhbmQgYnkgdXNpbmcgdGhlIEFzeW5jaHJvbm91cyBNb2R1bGUgRGVmaW5pdGlvbiBzdGFuZGFyZC4KCSAgLy8gSWYgdGhpcyBtb2R1bGUgaXMgbG9hZGVkIGluIHRoZSBicm93c2VyIGl0IHdpbGwgY3JlYXRlZCB0aGUgZ2xvYmFsCgkgIC8vIG9iamVjdCBtY21jIC4KCSAgKGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7CgkgICAgaWYgKG1vZHVsZS5leHBvcnRzKSB7CgkgICAgICAvLyBOb2RlLiBEb2VzIG5vdCB3b3JrIHdpdGggc3RyaWN0IENvbW1vbkpTLCBidXQKCSAgICAgIC8vIG9ubHkgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgdGhhdCBzdXBwb3J0IG1vZHVsZS5leHBvcnRzLAoJICAgICAgLy8gbGlrZSBOb2RlLgoJICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7CgkgICAgfSBlbHNlIHsKCSAgICAgIC8vIEJyb3dzZXIgZ2xvYmFscyAocm9vdCBpcyB3aW5kb3cpCgkgICAgICByb290Lm1jbWMgPSBmYWN0b3J5KCk7CgkgICAgfQoJICB9KShjb21tb25qc0dsb2JhbCwgZnVuY3Rpb24gKCkgewoJICAgIC8vLyBUaGUgYWN0dWFsIG1vZHVsZSBjb2RlIHN0YXJ0cyBoZXJlIC8vLwoJICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgCgoJICAgIC8vLy8vLy8vLy8gSGVscGVyIEZ1bmN0aW9ucyAvLy8vLy8vLy8vCgkgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgkgICAgLyoqIFJldHVybnMgYSByYW5kb20gcmVhbCBudW1iZXIgYmV0d2VlbiBtaW4gYW5kIG1heCAqLwoJICAgIHZhciBydW5pZiA9IGZ1bmN0aW9uIChtaW4sIG1heCkgewoJICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluKSArIG1pbjsKCSAgICB9OwoKCSAgICAvKiogUmV0dXJucyBhIHJhbmRvbSBpbnRlZ2VyIGJldHdlZW4gbWluIGFuZCBtYXggKi8KCSAgICB2YXIgcnVuaWZfZGlzY3JldGUgPSBmdW5jdGlvbiAobWluLCBtYXgpIHsKCSAgICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkpICsgbWluOwoJICAgIH07CgoJICAgIC8qKiBSZXR1cm5zIGEgcmFuZG9tIHJlYWwgbnVtYmVyIGZyb20gYSBub3JtYWwgZGlzdHJpYmJ1dGlvbiBkZWZpbmVkCgkgICAgICogIGJ5IG1lYW4gYW5kIHNkLiAKCSAgICAgKiAgQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9qc3RhdC9qc3RhdC9ibG9iL21hc3Rlci9zcmMvc3BlY2lhbC5qcyAqLwoJICAgIHZhciBybm9ybSA9IGZ1bmN0aW9uIChtZWFuLCBzZCkgewoJICAgICAgdmFyIHUsIHYsIHgsIHksIHE7CgkgICAgICBkbyB7CgkgICAgICAgIHUgPSBNYXRoLnJhbmRvbSgpOwoJICAgICAgICB2ID0gMS43MTU2ICogKE1hdGgucmFuZG9tKCkgLSAwLjUpOwoJICAgICAgICB4ID0gdSAtIDAuNDQ5ODcxOwoJICAgICAgICB5ID0gTWF0aC5hYnModikgKyAwLjM4NjU5NTsKCSAgICAgICAgcSA9IHggKiB4ICsgeSAqICgwLjE5NjAwICogeSAtIDAuMjU0NzIgKiB4KTsKCSAgICAgIH0gd2hpbGUgKHEgPiAwLjI3NTk3ICYmIChxID4gMC4yNzg0NiB8fCB2ICogdiA+IC00ICogTWF0aC5sb2codSkgKiB1ICogdSkpOwoJICAgICAgcmV0dXJuIHYgLyB1ICogc2QgKyBtZWFuOwoJICAgIH07CgoJICAgIC8qKiBSZXR1cm5zIGEgZGVlcCBjbG9uZSBvZiBzcmMsIHNvcnQgb2YuLi4gSXQgb25seSBjb3BpZXMgYSBsaW1pdGVkCgkgICAgICogbnVtYmVyIG9mIHR5cGVzIGFuZCwgZm9yIGV4YW1wbGUsIGZ1bmN0aW9uIGFyZSBub3QgY29waWVkLiAKCSAgICAgKiBGcm9tIGh0dHA6Ly9kYXZpZHdhbHNoLm5hbWUvamF2YXNjcmlwdC1jbG9uZQoJICAgICAqLwoJICAgIHZhciBkZWVwX2Nsb25lID0gZnVuY3Rpb24gKHNyYykgewoJICAgICAgZnVuY3Rpb24gbWl4aW4oZGVzdCwgc291cmNlLCBjb3B5RnVuYykgewoJICAgICAgICB2YXIgbmFtZSwKCSAgICAgICAgICBzLAoJICAgICAgICAgIGVtcHR5ID0ge307CgkgICAgICAgIGZvciAobmFtZSBpbiBzb3VyY2UpIHsKCSAgICAgICAgICAvLyB0aGUgKCEobmFtZSBpbiBlbXB0eSkgfHwgZW1wdHlbbmFtZV0gIT09IHMpIGNvbmRpdGlvbiBhdm9pZHMgY29weWluZyBwcm9wZXJ0aWVzIGluICJzb3VyY2UiCgkgICAgICAgICAgLy8gaW5oZXJpdGVkIGZyb20gT2JqZWN0LnByb3RvdHlwZS4JIEZvciBleGFtcGxlLCBpZiBkZXN0IGhhcyBhIGN1c3RvbSB0b1N0cmluZygpIG1ldGhvZCwKCSAgICAgICAgICAvLyBkb24ndCBvdmVyd3JpdGUgaXQgd2l0aCB0aGUgdG9TdHJpbmcoKSBtZXRob2QgdGhhdCBzb3VyY2UgaW5oZXJpdGVkIGZyb20gT2JqZWN0LnByb3RvdHlwZQoJICAgICAgICAgIHMgPSBzb3VyY2VbbmFtZV07CgkgICAgICAgICAgaWYgKCEobmFtZSBpbiBkZXN0KSB8fCBkZXN0W25hbWVdICE9PSBzICYmICghKG5hbWUgaW4gZW1wdHkpIHx8IGVtcHR5W25hbWVdICE9PSBzKSkgewoJICAgICAgICAgICAgZGVzdFtuYW1lXSA9IGNvcHlGdW5jID8gY29weUZ1bmMocykgOiBzOwoJICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gZGVzdDsKCSAgICAgIH0KCSAgICAgIGlmICghc3JjIHx8IHR5cGVvZiBzcmMgIT0gIm9iamVjdCIgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHNyYykgPT09ICJbb2JqZWN0IEZ1bmN0aW9uXSIpIHsKCSAgICAgICAgLy8gbnVsbCwgdW5kZWZpbmVkLCBhbnkgbm9uLW9iamVjdCwgb3IgZnVuY3Rpb24KCSAgICAgICAgcmV0dXJuIHNyYzsgLy8gYW55dGhpbmcKCSAgICAgIH0KCSAgICAgIGlmIChzcmMubm9kZVR5cGUgJiYgImNsb25lTm9kZSIgaW4gc3JjKSB7CgkgICAgICAgIC8vIERPTSBOb2RlCgkgICAgICAgIHJldHVybiBzcmMuY2xvbmVOb2RlKHRydWUpOyAvLyBOb2RlCgkgICAgICB9CgkgICAgICBpZiAoc3JjIGluc3RhbmNlb2YgRGF0ZSkgewoJICAgICAgICAvLyBEYXRlCgkgICAgICAgIHJldHVybiBuZXcgRGF0ZShzcmMuZ2V0VGltZSgpKTsgLy8gRGF0ZQoJICAgICAgfQoJICAgICAgaWYgKHNyYyBpbnN0YW5jZW9mIFJlZ0V4cCkgewoJICAgICAgICAvLyBSZWdFeHAKCSAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoc3JjKTsgLy8gUmVnRXhwCgkgICAgICB9CgkgICAgICB2YXIgciwgaSwgbDsKCSAgICAgIGlmIChzcmMgaW5zdGFuY2VvZiBBcnJheSkgewoJICAgICAgICAvLyBhcnJheQoJICAgICAgICByID0gW107CgkgICAgICAgIGZvciAoaSA9IDAsIGwgPSBzcmMubGVuZ3RoOyBpIDwgbDsgKytpKSB7CgkgICAgICAgICAgaWYgKGkgaW4gc3JjKSB7CgkgICAgICAgICAgICByLnB1c2goZGVlcF9jbG9uZShzcmNbaV0pKTsKCSAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICAgIH0gZWxzZSB7CgkgICAgICAgIC8vIGdlbmVyaWMgb2JqZWN0cwoJICAgICAgICByID0gc3JjLmNvbnN0cnVjdG9yID8gbmV3IHNyYy5jb25zdHJ1Y3RvcigpIDoge307CgkgICAgICB9CgkgICAgICByZXR1cm4gbWl4aW4ociwgc3JjLCBkZWVwX2Nsb25lKTsKCSAgICB9OwoKCSAgICAvKiogU3BlY2lhbGl6ZWQgY2xvbmUgZnVuY3Rpb24gdGhhdCBvbmx5IGNsb25lcyBzY2FsYXJzIGFuZCBuZXN0ZWQgYXJyYXlzIHdoZXJlCgkgICAgICogZWFjaCBhcnJheSBlaXRoZXIgY29uc2lzdHMgb2YgYWxsIGFycmF5cyBvciBhbGwgbnVtYmVycy4gVGhpcyBmdW5jdGlvbgoJICAgICAqIGlzIG1lYW50IGFzIGEgZmFzdCB3YXkgb2YgY2xvbmluZyBwYXJhbWV0ZXIgZHJhd3Mgd2l0aGluIHRoZSBtY21jIHNhbXBsaW5nCgkgICAgICogbG9vcC4KCSAgICAgKi8KCSAgICB2YXIgY2xvbmVfcGFyYW1fZHJhdyA9IGZ1bmN0aW9uICh4KSB7CgkgICAgICBpZiAoQXJyYXkuaXNBcnJheSh4KSkgewoJICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh4WzBdKSkgewoJICAgICAgICAgIC8vIHggaXMgYW4gYXJyYXkgb2YgYXJyYXlzIHNvIHdlIG5lZWQgdG8gY2xvbmUgaXQgcmVjdXJzaXZlbHkKCSAgICAgICAgICB2YXIgeF9jb3B5ID0gW107CgkgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IHgubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKCSAgICAgICAgICAgIHhfY29weS5wdXNoKGNsb25lX3BhcmFtX2RyYXcoeFtpXSkpOwoJICAgICAgICAgIH0KCSAgICAgICAgICByZXR1cm4geF9jb3B5OwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIC8vIFdlJ2xsIGFzc3VtZSB4IGlzIGEgYXJyYXlzIG9mIHNjYWxhcnMKCSAgICAgICAgICByZXR1cm4geC5zbGljZSgwKTsKCSAgICAgICAgfQoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgLy8gV2UnbGwgYXNzdW1lIHggaXMgYSBzY2FsYXIKCSAgICAgICAgcmV0dXJuIHg7CgkgICAgICB9CgkgICAgfTsKCgkgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBvYmplY3QgaXMgYSBudW1iZXIuCgkgICAgICovCgkgICAgdmFyIGlzX251bWJlciA9IGZ1bmN0aW9uIChvYmplY3QpIHsKCSAgICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09ICJudW1iZXIiIHx8IHR5cGVvZiBvYmplY3QgPT0gIm9iamVjdCIgJiYgb2JqZWN0LmNvbnN0cnVjdG9yID09PSBOdW1iZXI7CgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSAocG9zc2libHkgbXVsdGlkaW1lbnNpb25hbC9uZXN0ZWQpIGFycmF5LgoJICAgICAqIEBwYXJhbSBkaW0gLSBBbiBhcnJheSBnaXZpbmcgdGhlIGRpbWVuc2lvbiBvZiB0aGUgYXJyYXkuIEZvciBleGFtcGxlLAoJICAgICAqICAgWzVdIHdvdWxkIHlpZWxkIGEgNSBlbGVtZW50IGFycmF5LCBhbmQgWzMsM10gd291bGQgeWllbGQgYSAzIGJ5IDMgbWF0cml4LgoJICAgICAqIEBwYXJhbSBpbml0IC0gQSB2YWx1ZSBvciBhIGZ1bmN0aW9uIHVzZWQgdG8gZmlsbCBpbiB0aGUgZWFjaCBlbGVtZW50IGluCgkgICAgICogICB0aGUgYXJyYXkuIElmIGl0IGlzIGEgZnVuY3Rpb24gaXQgc2hvdWxkIHRha2Ugbm8gYXJndW1lbnRzLCBpdCB3aWxsIGJlIAoJICAgICAqICAgZXZhbHVhdGVkIG9uY2UgZm9yIGVhY2ggZWxlbWVudCwgYW5kIGl0J3MgcmV0dXJuIHZhbHVlIHdpbGwgYmUgdXNlZCB0bwoJICAgICAqICAgZmlsbCBpbiBlYWNoIGVsZW1lbnQuCgkgICAgICogQGV4YW1wbGUgCgkgICAgICogLy8gVGhlIGZvbGxvd2luZyB3b3VsZCByZXR1cm4gW1sxLDFdLFsxLDFdLFsxLDFdXQoJICAgICAqIGNyZWF0ZV9hcnJheShbMiwzXSwgMSkKCSAgICAgKi8KCSAgICB2YXIgY3JlYXRlX2FycmF5ID0gZnVuY3Rpb24gKGRpbSwgaW5pdCkgewoJICAgICAgdmFyIGFyciA9IG5ldyBBcnJheShkaW1bMF0pOwoJICAgICAgdmFyIGk7CgkgICAgICBpZiAoZGltLmxlbmd0aCA9PSAxKSB7CgkgICAgICAgIC8vIEZpbGwgaXQgdXAgd2l0aCBpbml0CgkgICAgICAgIGlmICh0eXBlb2YgaW5pdCA9PT0gImZ1bmN0aW9uIikgewoJICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykgewoJICAgICAgICAgICAgYXJyW2ldID0gaW5pdCgpOwoJICAgICAgICAgIH0KCSAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHsKCSAgICAgICAgICAgIGFycltpXSA9IGluaXQ7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9IGVsc2UgaWYgKGRpbS5sZW5ndGggPiAxKSB7CgkgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykgewoJICAgICAgICAgIGFycltpXSA9IGNyZWF0ZV9hcnJheShkaW0uc2xpY2UoMSksIGluaXQpOwoJICAgICAgICB9CgkgICAgICB9IGVsc2UgewoJICAgICAgICB0aHJvdyAiY3JlYXRlX2FycmF5IGNhbid0IGNyZWF0ZSBhIGRpbWVuc2lvbmxlc3MgYXJyYXkiOwoJICAgICAgfQoJICAgICAgcmV0dXJuIGFycjsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBSZXR1cm4gdGhlIGRpbWVuc2lvbnMgb2YgYSBwb3NzaWJseSBuZXN0ZWQgYXJyYXkgYXMgYW4gYXJyYXkuIEZvciAKCSAgICAgKiBleGFtcGxlLCBhcnJheV9kaW0oIFtbMSwgMl0sIFsxLCAyXV0gKSBzaG91bGQgcmV0dXJuIFsyLCAyXQoJICAgICAqIEFzc3VtZXMgdGhhdCBhbGwgYXJyYXlzIGluc2lkZSBhbm90aGVyIGFycmF5IGFyZSBvZiB0aGUgc2FtZSBsZW5ndGguCgkgICAgICogQGV4YW1wbGUKCSAgICAgKiAvLyBTaG91bGQgcmV0dXJuIFs0LCAyLCAxXQoJICAgICAqIGFycmF5X2RpbShjcmVhdGVfYXJyYXkoWzQsIDIsIDFdLCAwKSkKCSAgICAgKi8KCSAgICB2YXIgYXJyYXlfZGltID0gZnVuY3Rpb24gKGEpIHsKCSAgICAgIGlmIChBcnJheS5pc0FycmF5KGFbMF0pKSB7CgkgICAgICAgIHJldHVybiBbYS5sZW5ndGhdLmNvbmNhdChhcnJheV9kaW0oYVswXSkpOwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgcmV0dXJuIFthLmxlbmd0aF07CgkgICAgICB9CgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogQ2hlY2tzIGlmIHR3byBhcnJheXMgYXJlIGVxdWFsIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgY29udGFpbiB0aGUgc2FtZSBlbGVtZW50cwoJICAgICAqIGFzIGp1ZGdlZCBieSB0aGUgIj09IiBvcGVyYXRvci4gUmV0dXJucyB0cnVlIG9yIGZhbHNlLgoJICAgICAqIEFkYXB0ZWQgZnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNDg1Mzk3NC8xMDAxODQ4CgkgICAgICovCgkgICAgdmFyIGFycmF5X2VxdWFsID0gZnVuY3Rpb24gKGExLCBhMikgewoJICAgICAgaWYgKGExLmxlbmd0aCAhPSBhMi5sZW5ndGgpIHJldHVybiBmYWxzZTsKCSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBuZXN0ZWQgYXJyYXlzCgkgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGExW2ldKSAmJiBBcnJheS5pc0FycmF5KGEyW2ldKSkgewoJICAgICAgICAgIC8vIHJlY3Vyc2UgaW50byB0aGUgbmVzdGVkIGFycmF5cwoJICAgICAgICAgIGlmICghYXJyYXlfZXF1YWwoYTFbaV0sIGEyW2ldKSkgcmV0dXJuIGZhbHNlOwoJICAgICAgICB9IGVsc2UgaWYgKGExW2ldICE9IGEyW2ldKSB7CgkgICAgICAgICAgLy8gV2FybmluZyAtIHR3byBkaWZmZXJlbnQgb2JqZWN0IGluc3RhbmNlcyB3aWxsIG5ldmVyIGJlIGVxdWFsOiB7eDoyMH0gIT0ge3g6MjB9CgkgICAgICAgICAgcmV0dXJuIGZhbHNlOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgICByZXR1cm4gdHJ1ZTsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBUcmF2ZXJzZXMgYSBwb3NzaWJseSBuZXN0ZWQgYXJyYXkgYSBhbmQgYXBwbGllcyBmdW4gdG8gYWxsICJsZWFmIG5vZGVzIiwgCgkgICAgICogdGhhdCBpcywgdmFsdWVzIHRoYXQgYXJlIG5vdCBhcnJheXMuIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIHNhbWUgc2l6ZSBhcwoJICAgICAqIGEuCgkgICAgICovCgkgICAgdmFyIG5lc3RlZF9hcnJheV9hcHBseSA9IGZ1bmN0aW9uIChhLCBmdW4pIHsKCSAgICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7CgkgICAgICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXkoYS5sZW5ndGgpOwoJICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgICByZXN1bHRbaV0gPSBuZXN0ZWRfYXJyYXlfYXBwbHkoYVtpXSwgZnVuKTsKCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gcmVzdWx0OwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgcmV0dXJuIGZ1bihhKTsKCSAgICAgIH0KCSAgICB9OwoKCSAgICAvKiogUmFuZG9taXppbmcgdGhlIGFycmF5IGVsZW1lbnQgb3JkZXIgaW4tcGxhY2UuIFVzaW5nIER1cnN0ZW5mZWxkCgkgICAgICogc2h1ZmZsZSBhbGdvcml0aG0uIEFkYXB0ZWQgZnJvbSBoZXJlOiAKCSAgICAgKiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xMjY0Njg2NC8xMDAxODQ4CgkgICAgICovCgkgICAgZnVuY3Rpb24gc2h1ZmZsZV9hcnJheShhcnJheSkgewoJICAgICAgZm9yICh2YXIgaSA9IGFycmF5Lmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHsKCSAgICAgICAgdmFyIGogPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoaSArIDEpKTsKCSAgICAgICAgdmFyIHRlbXAgPSBhcnJheVtpXTsKCSAgICAgICAgYXJyYXlbaV0gPSBhcnJheVtqXTsKCSAgICAgICAgYXJyYXlbal0gPSB0ZW1wOwoJICAgICAgfQoJICAgICAgcmV0dXJuIGFycmF5OwoJICAgIH0KCgkgICAgLyoqCgkgICAgICogRG9lcyB0aGUgc2FtZSB0aGluZyBhcyBuZXN0ZWRfYXJyYXlfYXBwbHksIHRoYXQgaXMsIHRyYXZlcnNlcyBhIHBvc3NpYmx5CgkgICAgICogbmVzdGVkIGFycmF5IGEgYW5kIGFwcGxpZXMgZnVuIHRvIGFsbCAibGVhZiBub2RlcyIgYW5kIHJldHVybnMgYW4gYXJyYXkgCgkgICAgICogb2YgdGhlIHNhbWUgc2l6ZSBhcyBhLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IG5lc3RlZF9hcnJheV9yYW5kb21fYXBwbHkKCSAgICAgKiBicmFuY2hlcyByYW5kb21seS4KCSAgICAgKi8KCSAgICB2YXIgbmVzdGVkX2FycmF5X3JhbmRvbV9hcHBseSA9IGZ1bmN0aW9uIChhLCBmdW4pIHsKCSAgICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7CgkgICAgICAgIHZhciBsZW4gPSBhLmxlbmd0aDsKCSAgICAgICAgdmFyIGk7CgkgICAgICAgIHZhciBhcnJheV9pcyA9IFtdOwoJICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKCSAgICAgICAgICBhcnJheV9pc1tpXSA9IGk7CgkgICAgICAgIH0KCSAgICAgICAgc2h1ZmZsZV9hcnJheShhcnJheV9pcyk7CgkgICAgICAgIHZhciByZXN1bHQgPSBbXTsKCSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CgkgICAgICAgICAgdmFyIGFycmF5X2kgPSBhcnJheV9pc1tpXTsKCSAgICAgICAgICByZXN1bHRbYXJyYXlfaV0gPSBuZXN0ZWRfYXJyYXlfYXBwbHkoYVthcnJheV9pXSwgZnVuKTsKCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gcmVzdWx0OwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgcmV0dXJuIGZ1bihhKTsKCSAgICAgIH0KCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBBbGxvd3MgYSBwcmV0dHkgd2F5IG9mIHNldHRpbmcgZGVmYXVsdCBvcHRpb25zIHdoZXJlIHRoZSBkZWZ1bHRzIGNhbiBiZQoJICAgICAqIG92ZXJyaWRkZW4gYnkgYW4gb3B0aW9ucyBvYmplY3QuCgkgICAgICogIEBwYXJhbSBvcHRpb25fbmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBvcHRpb24gYXMgYSBzdHJpbmcKCSAgICAgKiAgQHBhcmFtIG15X29wdGlvbnMgLSBhbiBvcHRpb24gb2JqZWN0IHRoYXQgY291bGQgaGF2ZSBvcHRpb25fbmFtZSAKCSAgICAgKiAgICBhcyBhIG1lbWJlci4KCSAgICAgKiBAcGFyYW0gZGVmYXVsX3ZhbHVlIC0gZGVmdWx0IHZhbHVlIHRoYXQgaXMgcmV0dXJuZWQgaWYgb3B0aW9uX25hbWUgCgkgICAgICogICBpcyBub3QgZGVmaW5lZCBpbiBteV9vcHRpb25zLgoJICAgICAqIEBleGFtcGxlCgkgICAgICogdmFyIG15X29wdGlvbnMgPSB7cGk6IDMuMTQxNTl9CgkgICAgICogdmFyIHBpID0gZ2V0X29wdGlvbigicGkiLCBteV9vcHRpb25zLCAzLjE0KQoJICAgICAqLwoJICAgIC8vIFByZXR0eSB3YXkgb2Ygc2V0dGluZyBkZWZhdWx0IG9wdGlvbnMgd2hlcmUgdGhlIGRlZmF1bHRzIGNhbiBiZSBvdmVycmlkZGVuCgkgICAgLy8gYnkgYW4gb3B0aW9ucyBvYmplY3QuIEZvciBleGFtcGxlOgoJICAgIC8vIHZhciBwaSA9IGdldF9vcHRpb24oInBpIiwgbXlfb3B0aW9ucywgMy4xNCkKCSAgICB2YXIgZ2V0X29wdGlvbiA9IGZ1bmN0aW9uIChvcHRpb25fbmFtZSwgb3B0aW9ucywgZGVmYXVsX3ZhbHVlKSB7CgkgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCSAgICAgIHJldHVybiBvcHRpb25zLmhhc093blByb3BlcnR5KG9wdGlvbl9uYW1lKSAmJiBvcHRpb25zW29wdGlvbl9uYW1lXSAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnNbb3B0aW9uX25hbWVdICE9PSBudWxsID8gb3B0aW9uc1tvcHRpb25fbmFtZV0gOiBkZWZhdWxfdmFsdWU7CgkgICAgfTsKCgkgICAgLyoqIFZlcnNpb24gb2YgZ2V0X29wdGlvbiB3aGVyZSB0aGUgb3B0aW9uIHNob3VsZCBiZSBhIG9uZSBvciBtdWx0aS1kaW1lbnNpb25hbAoJICAgICAqIGFycmF5IGFuZCB3aGVyZSB0aGUgZGVmYXVsdCBjYW4gYmUgb3ZlcnJpZGRlbiBlaXRoZXIgYnkgYSBzY2FsYXIgb3IgYnkgYW4gYXJyYXkuCgkgICAgICogSWYgaXQncyBhIHNjYWxhciB0aGUgdGhhdCBzY2FsYXIgaXMgdXNlZCB0byBpbml0aWFsaXplIGFuIGFycmF5IHdpdGggCgkgICAgICogZGltIGRpbWVuc2lvbnMuCgkgICAgICogCgkgICAgICovCgkgICAgdmFyIGdldF9tdWx0aWRpbV9vcHRpb24gPSBmdW5jdGlvbiAob3B0aW9uX25hbWUsIG9wdGlvbnMsIGRpbSwgZGVmYXVsX3ZhbHVlKSB7CgkgICAgICB2YXIgdmFsdWUgPSBnZXRfb3B0aW9uKG9wdGlvbl9uYW1lLCBvcHRpb25zLCBkZWZhdWxfdmFsdWUpOwoJICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkgewoJICAgICAgICB2YWx1ZSA9IGNyZWF0ZV9hcnJheShkaW0sIHZhbHVlKTsKCSAgICAgIH0KCSAgICAgIGlmICghYXJyYXlfZXF1YWwoYXJyYXlfZGltKHZhbHVlKSwgZGltKSkgewoJICAgICAgICB0aHJvdyAiVGhlIG9wdGlvbiAiICsgb3B0aW9uX25hbWUgKyAiIGlzIG9mIGRpbWVuc2lvbiBbIiArIGFycmF5X2RpbSh2YWx1ZSkgKyAiXSBidXQgc2hvdWxkIGJlIFsiICsgZGltICsgIl0uIjsKCSAgICAgIH0KCSAgICAgIHJldHVybiB2YWx1ZTsKCSAgICB9OwoKCSAgICAvLy8vLy8vLy8vIEZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgcGFyYW1ldGVyIG9iamVjdHMgLy8vLy8vLy8vLwoJICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoJICAgIC8qKgoJICAgICAqIFJldHVybnMgYSBmaXhlZCAoc2FtZSBldmVyeSB0aW1lKSBudW1iZXIgdGhhdCBjb3VsZCBiZSB1c2VkIHRvIGluaXRpYWxpemUKCSAgICAgKiBhIHBhcmFtZXRlciBvZiBhIGNlcnRhaW4gdHlwZSwgcG9zc2libHkgd2l0aCBsb3dlciBhbmQgdXBwZXIgYm91bmRzLgoJICAgICAqIFRoZSBwb3NzaWxlIHR5cGVzIGFyZSAicmVhbCIsICJpbnQiLCBhbmQgImJpbmFyeSIuCgkgICAgICovCgkgICAgdmFyIHBhcmFtX2luaXRfZml4ZWQgPSBmdW5jdGlvbiAodHlwZSwgbG93ZXIsIHVwcGVyKSB7CgkgICAgICBpZiAobG93ZXIgPiB1cHBlcikgewoJICAgICAgICB0aHJvdyAiQ2FuIG5vdCBpbml0aWFsaXplIHBhcmFtZXRlciB3aGVyZSBsb3dlciBib3VuZCA+IHVwcGVyIGJvdW5kIjsKCSAgICAgIH0KCSAgICAgIGlmICh0eXBlID09PSAicmVhbCIpIHsKCSAgICAgICAgaWYgKGxvd2VyID09PSAtSW5maW5pdHkgJiYgdXBwZXIgPT09IEluZmluaXR5KSB7CgkgICAgICAgICAgcmV0dXJuIDAuNTsKCSAgICAgICAgfSBlbHNlIGlmIChsb3dlciA9PT0gLUluZmluaXR5KSB7CgkgICAgICAgICAgcmV0dXJuIHVwcGVyIC0gMC41OwoJICAgICAgICB9IGVsc2UgaWYgKHVwcGVyID09PSBJbmZpbml0eSkgewoJICAgICAgICAgIHJldHVybiBsb3dlciArIDAuNTsKCSAgICAgICAgfSBlbHNlIGlmIChsb3dlciA8PSB1cHBlcikgewoJICAgICAgICAgIHJldHVybiAobG93ZXIgKyB1cHBlcikgLyAyOwoJICAgICAgICB9CgkgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICJpbnQiKSB7CgkgICAgICAgIGlmIChsb3dlciA9PT0gLUluZmluaXR5ICYmIHVwcGVyID09PSBJbmZpbml0eSkgewoJICAgICAgICAgIHJldHVybiAxOwoJICAgICAgICB9IGVsc2UgaWYgKGxvd2VyID09PSAtSW5maW5pdHkpIHsKCSAgICAgICAgICByZXR1cm4gdXBwZXIgLSAxOwoJICAgICAgICB9IGVsc2UgaWYgKHVwcGVyID09PSBJbmZpbml0eSkgewoJICAgICAgICAgIHJldHVybiBsb3dlciArIDE7CgkgICAgICAgIH0gZWxzZSBpZiAobG93ZXIgPD0gdXBwZXIpIHsKCSAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCgobG93ZXIgKyB1cHBlcikgLyAyKTsKCSAgICAgICAgfQoJICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAiYmluYXJ5IikgewoJICAgICAgICByZXR1cm4gMTsKCSAgICAgIH0KCSAgICAgIHRocm93ICJDb3VsZCBub3QgaW5pdGlhbGl6ZSBwYXJhbWV0ZXIgb2YgdHlwZSAiICsgdHlwZSArICJbIiArIGxvd2VyICsgIiwgIiArIHVwcGVyICsgIl0iOwoJICAgIH07CgoJICAgIC8qKgoJICAgICAqIENvbXBsZXRlcyBwYXJhbXNfdG9fY29tcGxldGUsIGFuIG9iamVjdCBjb250YWluaW5nIHBhcmFtZXRlciBkZXNjcmlwdGlvbnMsIAoJICAgICAqIGFuZCBpbml0aWFsaXplcyBub24taW5pdGlhbGl6ZWQgcGFyYW1ldGVycy4gVGhpcyBtb2RpZmllZCB2ZXJzaW9uIG9mCgkgICAgICogcGFyYW1zX3RvX2NvbXBsZXRlIGlzIHJldHVybmVkIGFzIGEgZGVlcCBjb3B5IGFuZCBub3QgbW9kaWZpZWQgaW4gcGxhY2UuCgkgICAgICogSW5pdGlhbGl6YXRpb24gaXMgZG9uZSBieSBzdXBwbHlpbmcgYSBwYXJhbV9pbml0IGZ1bmN0aW9uIHdpdGggc2lnbmF0dXJlCgkgICAgICogZnVuY3Rpb24odHlwZSwgbG93ZXIsIHVwcGVyKSB0aGF0IHNob3VsZCByZXR1cm4gYSBzaW5nbGUgbnVtYmVyIAoJICAgICAqIChsaWtlIHBhcmFtX2luaXRfZml4ZWQsIGZvciBleGFtcGxlKS4KCSAgICAgKiBAZXhhbXBsZQoJICAgICAqIHZhciBwYXJhbXMgPSB7ICJtdSI6IHsidHlwZSI6ICJyZWFsIn0gfQoJICAgICAqIHBhcmFtcyA9IGNvbXBsZXRlX3BhcmFtcyhwYXJhbXMpOwoJICAgICAqIC8vIHBhcmFtcyBzaG91bGQgbm93IGJlOgoJICAgICAqIC8vICB7Im11IjogeyAidHlwZSI6ICJyZWFsIiwgImRpbSI6IFsxXSwgInVwcGVyIjogSW5maW5pdHksCgkgICAgICogLy8gICAgICAgICAgICJsb3dlciI6IC1JbmZpbml0eSwgImluaXQiOiAwLjUgfX0KCSAgICAgKi8KCSAgICB2YXIgY29tcGxldGVfcGFyYW1zID0gZnVuY3Rpb24gKHBhcmFtc190b19jb21wbGV0ZSwgcGFyYW1faW5pdCkgewoJICAgICAgdmFyIHBhcmFtcyA9IGRlZXBfY2xvbmUocGFyYW1zX3RvX2NvbXBsZXRlKTsKCSAgICAgIGZvciAodmFyIHBhcmFtX25hbWUgaW4gcGFyYW1zKSB7CgkgICAgICAgIGlmICghcGFyYW1zLmhhc093blByb3BlcnR5KHBhcmFtX25hbWUpKSBjb250aW51ZTsKCSAgICAgICAgdmFyIHBhcmFtID0gcGFyYW1zW3BhcmFtX25hbWVdOwoJICAgICAgICBpZiAoIXBhcmFtLmhhc093blByb3BlcnR5KCJ0eXBlIikpIHsKCSAgICAgICAgICBwYXJhbS50eXBlID0gInJlYWwiOwoJICAgICAgICB9CgkgICAgICAgIGlmICghcGFyYW0uaGFzT3duUHJvcGVydHkoImRpbSIpKSB7CgkgICAgICAgICAgcGFyYW0uZGltID0gWzFdOwoJICAgICAgICB9CgkgICAgICAgIGlmIChpc19udW1iZXIocGFyYW0uZGltKSkgewoJICAgICAgICAgIHBhcmFtLmRpbSA9IFtwYXJhbS5kaW1dOwoJICAgICAgICB9CgkgICAgICAgIGlmIChwYXJhbS50eXBlID09ICJiaW5hcnkiKSB7CgkgICAgICAgICAgcGFyYW0udXBwZXIgPSAxOwoJICAgICAgICAgIHBhcmFtLmxvd2VyID0gMDsKCSAgICAgICAgfQoJICAgICAgICBpZiAoIXBhcmFtLmhhc093blByb3BlcnR5KCJ1cHBlciIpKSB7CgkgICAgICAgICAgcGFyYW0udXBwZXIgPSBJbmZpbml0eTsKCSAgICAgICAgfQoJICAgICAgICBpZiAoIXBhcmFtLmhhc093blByb3BlcnR5KCJsb3dlciIpKSB7CgkgICAgICAgICAgcGFyYW0ubG93ZXIgPSAtSW5maW5pdHk7CgkgICAgICAgIH0KCSAgICAgICAgaWYgKHBhcmFtLmhhc093blByb3BlcnR5KCJpbml0IikpIHsKCSAgICAgICAgICAvLyBJZiB0aGlzIGlzIGp1c3QgYSBudW1iZXIgb3IgYSBuZXN0ZWQgYXJyYXkgd2UgbGVhdmUgaXQgYWxvbmUsIGJ1dCBpZi4uLgoJICAgICAgICAgIGlmIChhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkgJiYgdHlwZW9mIHBhcmFtLmluaXQgPT09ICJmdW5jdGlvbiIpIHsKCSAgICAgICAgICAgIC8vIHBhcmFtLmluaXQgaXMgYSBmdW5jdGlvbiwgdXNlIHRoYXQgdG8gaW5pdGlhbGl6ZSB0aGUgcGFyYW1ldGVyLgoJICAgICAgICAgICAgcGFyYW0uaW5pdCA9IHBhcmFtLmluaXQoKTsKCSAgICAgICAgICB9IGVsc2UgaWYgKCFhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0uaW5pdCkpIHsKCSAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlciB3aGVyZSB0aGUgcGFyYW0uaW5pdCBleGlzdCBidXQKCSAgICAgICAgICAgIC8vIGlzIG5vdCBhbiBhcnJheS4gVGhlbiBhc3N1bWUgaXQgaXMgYSBudW1iZXIgb3IgYSBmdW5jdGlvbiBhbmQgdXNlCgkgICAgICAgICAgICAvLyBpdCB0byBpbml0aWFsaXplIHRoZSBwYXJhbWV0ZXIuCgkgICAgICAgICAgICBwYXJhbS5pbml0ID0gY3JlYXRlX2FycmF5KHBhcmFtLmRpbSwgcGFyYW0uaW5pdCk7CgkgICAgICAgICAgfQoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIC8vIFdlIHVzZSB0aGUgZGVmYXVsdCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4KCSAgICAgICAgICBpZiAoYXJyYXlfZXF1YWwocGFyYW0uZGltLCBbMV0pKSB7CgkgICAgICAgICAgICBwYXJhbS5pbml0ID0gcGFyYW1faW5pdChwYXJhbS50eXBlLCBwYXJhbS5sb3dlciwgcGFyYW0udXBwZXIpOwoJICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICBwYXJhbS5pbml0ID0gY3JlYXRlX2FycmF5KHBhcmFtLmRpbSwgZnVuY3Rpb24gKCkgewoJICAgICAgICAgICAgICByZXR1cm4gcGFyYW1faW5pdChwYXJhbS50eXBlLCBwYXJhbS5sb3dlciwgcGFyYW0udXBwZXIpOwoJICAgICAgICAgICAgfSk7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICB9CgkgICAgICByZXR1cm4gcGFyYW1zOwoJICAgIH07CgoJICAgIC8vLy8vLy8vLy8gU3RlcHBlciBGdW5jdGlvbnMgLy8vLy8vLy8vLy8KCSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoJICAgIC8qKgoJICAgICAqIEBpbnRlcmZhY2UKCSAgICAgKiBBIFN0ZXBwZXIgaXMgYW4gb2JqZWN0IHJlc3BvbnNpYmxlIGZvciBwdXNoaW5nIGFyb3VuZCBvbmUKCSAgICAgKiBvciBtb3JlIHBhcmFtZXRlciB2YWx1ZXMgaW4gYSBzdGF0ZSBhY2NvcmRpbmcgdG8gdGhlIGRpc3RyaWJ1dGlvbgoJICAgICAqIGRlZmluZWQgYnkgdGhlIGxvZyBwb3N0ZXJpb3IuIFRoaXMgZGVmaW5lcyB0aGUgU3RlcHBlciAiaW50ZXJmYWNlIiwKCSAgICAgKiB3aGVyZSAiaW50ZXJmYWNlIiBtZWFucyB0aGF0IFN0ZXBwZXIgZGVmaW5lcyBhIGNsYXNzIHRoYXQgaXMgbmV2ZXIKCSAgICAgKiBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQsIGJ1dCBqdXN0IHRvIGJlIHN1YmNsYXNzZWQgYnkgc3BlY2lhbGl6ZWQKCSAgICAgKiBzdGVwcGVyIGZ1bmN0aW9ucy4KCSAgICAgKiBAaW50ZXJmYWNlCgkgICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIHBhcmFtZXRlciBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGU6CgkgICAgICogICB7Im11IjogeyAidHlwZSI6ICJyZWFsIiwgImRpbSI6IFsxXSwgInVwcGVyIjogSW5maW5pdHksIAoJICAgICAqICAgImxvd2VyIjogLUluZmluaXR5LCAiaW5pdCI6IDAuNSB9fQoJICAgICAqICAgVGhlIHBhcmFtZXRlciBkZWZpbml0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gYmUgImNvbXBsZXRlIiwgdGhhdCBpcywKCSAgICAgKiAgIHNwZWNpZnlpbmcgYWxsIHJlbGV2YW50IGF0dHJpYnV0ZXMgc3VjaCBhcyBkaW0sIGxvd2VyIGFuZCB1cHBlci4KCSAgICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMgaW4gcGFyYW1zCgkgICAgICogICAoYW5kIHBvc3NpYmx5IG1vcmUpLiBUaGUgcGFyYW1ldGVyIG5hbWVzIGFyZSBnaXZlbiBhcyBrZXlzIGFuZCB0aGUgc3RhdGVzCgkgICAgICogICBhcyBzY2FsYXJzIG9yLCBwb3NzaWJseSBuZXN0ZWQsIGFycmF5cy4gRm9yIGV4YW1wbGU6CgkgICAgICogICB7bXU6IDEwLCBzaWdtYTogNSwgYmV0YTogWzEsIDIuNV19CgkgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiAqdGFraW5nIG5vIHBhcmFtZXRlcnMqIHRoYXQgcmV0dXJucyB0aGUKCSAgICAgKiAgIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIFRoYXQgaXMsIHRoZSB2YWx1ZSBvZiBsb2dfcG9zdAoJICAgICAqICAgc2hvdWxkIGNoYW5nZSBpZiB0aGUgdGhlIHZhbHVlcyBpbiBzdGF0ZSBhcmUgY2hhbmdlZC4KCSAgICAKCSAgICAgKi8KCSAgICB2YXIgU3RlcHBlciA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCkgewoJICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CgkgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7CgkgICAgICB0aGlzLmxvZ19wb3N0ID0gbG9nX3Bvc3Q7CgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogVGFrZXMgYSBzdGVwIGluIHRoZSBwYXJhbWV0ZXIgc3BhY2UuIFNob3VsZCByZXR1cm4gdGhlIG5ldyBzdGF0ZSwKCSAgICAgKiBidXQgaXMgbWFpbmx5IGNhbGxlZCBmb3IgaXQncyBzaWRlIGVmZmVjdCBvZiBtYWtpbmcgYSBjaGFuZ2UgaW4gdGhlCgkgICAgICogc3RhdGUgb2JqZWN0LgoJICAgICAqLwoJICAgIFN0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAoKSB7CgkgICAgICB0aHJvdyAiRXZlcnkgU3RlcHBlciBuZWVkIHRvIGltcGxlbWVudCBzdGVwKCkiOwoJICAgIH07CgoJICAgIC8qKgoJICAgICAqIElmIGltcGxlbWVudGVkLCBtYWtlcyB0aGUgc3RlcHBlciBhZGFwdCB3aGlsZSBzdGVwcGluZy4KCSAgICAgKi8KCSAgICBTdGVwcGVyLnByb3RvdHlwZS5zdGFydF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgLy8gT3B0aW9uYWwsIHNvbWUgc3RlcHBlcnMgbWlnaHQgbm90IGJlIGFkYXB0aXZlLiAqLyAKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBJZiBpbXBsZW1lbnRlZCwgbWFrZXMgdGhlIHN0ZXBwZXIgY2Vhc2UgYWRhcHRpbmcgd2hpbGUgc3RlcHBpbmcuCgkgICAgICovCgkgICAgU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgLy8gT3B0aW9uYWwsIHNvbWUgc3RlcHBlcnMgbWlnaHQgbm90IGJlIGFkYXB0aXZlLiAqLyAKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBSZXR1cm5zIGFuIG9iamVjdCBjb250YWluZyBpbmZvIHJlZ2FyZGluZyB0aGUgc3RlcHBlci4KCSAgICAgKi8KCSAgICBTdGVwcGVyLnByb3RvdHlwZS5pbmZvID0gZnVuY3Rpb24gKCkgewoJICAgICAgLy8gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBpbmZvIGFib3V0IHRoZSBzdGF0ZSBvZiB0aGUgc3RlcHBlci4KCSAgICAgIHJldHVybiB7fTsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBAY2xhc3MKCSAgICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn0KCSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgbWV0cm9wb2xpcyBzdGVwIGluCgkgICAgICogdGhlIEFkYXB0aXZlIE1ldHJvcG9saXMtV2l0aGluLUdpYmJzIGFsZ29yaXRobSBpbiAiRXhhbXBsZXMgb2YgQWRhcHRpdmUgTUNNQyIKCSAgICAgKiBieSBSb2JlcnRzIGFuZCBSb3NlbnRoYWwgKDIwMDgpLgoJICAgICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbi4KCSAgICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuCgkgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIAoJICAgICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci4KCSAgICAgKiBAcGFyYW0gZ2VuZXJhdGVfcHJvcG9zYWwgLSBhIGZ1bmN0aW9uIHJldHVybmluZyBhIHByb3Bvc2FsIChhcyBhIG51bWJlcikKCSAgICAgKiB3aXRoIHNpZ25hdHVyZSBmdW5jdGlvbihwYXJhbV9zdGF0ZSwgbG9nX3NjYWxlKSB3aGVyZSBwYXJhbV9zdGF0ZSBpcyBhCgkgICAgICogbnVtYmVyIGFuZCBsb2dfc2NhbGUgZGVmaW5lcyB0aGUgc2NhbGUgb2YgdGhlIHByb3Bvc2FsIHNvbWVob3cuCgkgICAgKi8KCSAgICB2YXIgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIGdlbmVyYXRlX3Byb3Bvc2FsKSB7CgkgICAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpOwoJICAgICAgdmFyIHBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpOwoJICAgICAgaWYgKHBhcmFtX25hbWVzLmxlbmd0aCAhPSAxKSB7CgkgICAgICAgIHRocm93ICJPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciBjYW4gb25seSBoYW5kbGUgb25lIHBhcmFtZXRlci4iOwoJICAgICAgfQoJICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07CgkgICAgICB2YXIgcGFyYW0gPSB0aGlzLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVdOwoJICAgICAgaWYgKCFhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHsKCSAgICAgICAgdGhyb3cgIk9uZWRpbU1ldHJvcG9saXNTdGVwcGVyIGNhbiBvbmx5IGhhbmRsZSBvbmUgb25lLWRpbWVuc2lvbmFsIHBhcmFtZXRlci4iOwoJICAgICAgfQoJICAgICAgdGhpcy5sb3dlciA9IHBhcmFtLmxvd2VyOwoJICAgICAgdGhpcy51cHBlciA9IHBhcmFtLnVwcGVyOwoJICAgICAgdGhpcy5wcm9wX2xvZ19zY2FsZSA9IGdldF9vcHRpb24oInByb3BfbG9nX3NjYWxlIiwgb3B0aW9ucywgMCk7CgkgICAgICB0aGlzLmJhdGNoX3NpemUgPSBnZXRfb3B0aW9uKCJiYXRjaF9zaXplIiwgb3B0aW9ucywgNTApOwoJICAgICAgdGhpcy5tYXhfYWRhcHRhdGlvbiA9IGdldF9vcHRpb24oIm1heF9hZGFwdGF0aW9uIiwgb3B0aW9ucywgMC4zMyk7CgkgICAgICB0aGlzLmluaXRpYWxfYWRhcHRhdGlvbiA9IGdldF9vcHRpb24oImluaXRpYWxfYWRhcHRhdGlvbiIsIG9wdGlvbnMsIDEuMCk7CgkgICAgICB0aGlzLnRhcmdldF9hY2NlcHRfcmF0ZSA9IGdldF9vcHRpb24oInRhcmdldF9hY2NlcHRfcmF0ZSIsIG9wdGlvbnMsIDAuNDQpOwoJICAgICAgdGhpcy5pc19hZGFwdGluZyA9IGdldF9vcHRpb24oImlzX2FkYXB0aW5nIiwgb3B0aW9ucywgdHJ1ZSk7CgkgICAgICB0aGlzLmdlbmVyYXRlX3Byb3Bvc2FsID0gZ2VuZXJhdGVfcHJvcG9zYWw7CgkgICAgICB0aGlzLmFjY2VwdGFuY2VfY291bnQgPSAwOwoJICAgICAgdGhpcy5iYXRjaF9jb3VudCA9IDA7CgkgICAgICB0aGlzLml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24gPSAwOwoJICAgIH07CgkgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdGVwcGVyLnByb3RvdHlwZSk7CgkgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gT25lZGltTWV0cm9wb2xpc1N0ZXBwZXI7CgkgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAoKSB7CgkgICAgICB2YXIgcGFyYW1fc3RhdGUgPSB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV07CgkgICAgICB2YXIgcGFyYW1fcHJvcG9zYWwgPSB0aGlzLmdlbmVyYXRlX3Byb3Bvc2FsKHBhcmFtX3N0YXRlLCB0aGlzLnByb3BfbG9nX3NjYWxlKTsKCSAgICAgIGlmIChwYXJhbV9wcm9wb3NhbCA8IHRoaXMubG93ZXIgfHwgcGFyYW1fcHJvcG9zYWwgPiB0aGlzLnVwcGVyKSA7IGVsc2UgewoJICAgICAgICAvLyBtYWtlIGEgTWV0cm9wb2xpcyBzdGVwCgkgICAgICAgIHZhciBjdXJyX2xvZ19kZW5zID0gdGhpcy5sb2dfcG9zdCgpOwoJICAgICAgICB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0gPSBwYXJhbV9wcm9wb3NhbDsKCSAgICAgICAgdmFyIHByb3BfbG9nX2RlbnMgPSB0aGlzLmxvZ19wb3N0KCk7CgkgICAgICAgIHZhciBhY2NlcHRfcHJvYiA9IE1hdGguZXhwKHByb3BfbG9nX2RlbnMgLSBjdXJyX2xvZ19kZW5zKTsKCSAgICAgICAgaWYgKGFjY2VwdF9wcm9iID4gTWF0aC5yYW5kb20oKSkgewoJICAgICAgICAgIC8vIFdlIGRvIG5vdGhpbmcgYXMgdGhlIHN0YXRlIG9mIHBhcmFtIGhhcyBhbHJlYWR5IGJlZW4gY2hhbmdlZCB0byB0aGUgcHJvcG9zYWwKCSAgICAgICAgICBpZiAodGhpcy5pc19hZGFwdGluZykgdGhpcy5hY2NlcHRhbmNlX2NvdW50Kys7CgkgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgLy8gcmV2ZXJ0IHN0YXRlIGJhY2sgdG8gdGhlIG9sZCBzdGF0ZSBvZiBwYXJhbQoJICAgICAgICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IHBhcmFtX3N0YXRlOwoJICAgICAgICB9CgkgICAgICB9CgkgICAgICBpZiAodGhpcy5pc19hZGFwdGluZykgewoJICAgICAgICB0aGlzLml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24rKzsKCSAgICAgICAgaWYgKHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiA+PSB0aGlzLmJhdGNoX3NpemUpIHsKCSAgICAgICAgICAvLyB0aGVuIGFkYXB0CgkgICAgICAgICAgdGhpcy5iYXRjaF9jb3VudCsrOwoJICAgICAgICAgIHZhciBsb2dfc2RfYWRqdXN0bWVudCA9IE1hdGgubWluKHRoaXMubWF4X2FkYXB0YXRpb24sIHRoaXMuaW5pdGlhbF9hZGFwdGF0aW9uIC8gTWF0aC5zcXJ0KHRoaXMuYmF0Y2hfY291bnQpKTsKCSAgICAgICAgICBpZiAodGhpcy5hY2NlcHRhbmNlX2NvdW50IC8gdGhpcy5iYXRjaF9zaXplID4gdGhpcy50YXJnZXRfYWNjZXB0X3JhdGUpIHsKCSAgICAgICAgICAgIHRoaXMucHJvcF9sb2dfc2NhbGUgKz0gbG9nX3NkX2FkanVzdG1lbnQ7CgkgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgIHRoaXMucHJvcF9sb2dfc2NhbGUgLT0gbG9nX3NkX2FkanVzdG1lbnQ7CgkgICAgICAgICAgfQoJICAgICAgICAgIHRoaXMuYWNjZXB0YW5jZV9jb3VudCA9IDA7CgkgICAgICAgICAgdGhpcy5pdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uID0gMDsKCSAgICAgICAgfQoJICAgICAgfQoJICAgICAgcmV0dXJuIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXTsKCSAgICB9OwoJICAgIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5zdGFydF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgdGhpcy5pc19hZGFwdGluZyA9IHRydWU7CgkgICAgfTsKCSAgICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgdGhpcy5pc19hZGFwdGluZyA9IGZhbHNlOwoJICAgIH07CgkgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbiAoKSB7CgkgICAgICByZXR1cm4gewoJICAgICAgICBwcm9wX2xvZ19zY2FsZTogdGhpcy5wcm9wX2xvZ19zY2FsZSwKCSAgICAgICAgaXNfYWRhcHRpbmc6IHRoaXMuaXNfYWRhcHRpbmcsCgkgICAgICAgIGFjY2VwdGFuY2VfY291bnQ6IHRoaXMuYWNjZXB0YW5jZV9jb3VudCwKCSAgICAgICAgaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbjogdGhpcy5pdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uLAoJICAgICAgICBiYXRjaF9jb3VudDogdGhpcy5iYXRjaF9jb3VudAoJICAgICAgfTsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBGdW5jdGlvbiByZXR1cm5pbmcgYSBOb3JtYWwgcHJvcG9zYWwuCgkgICAgICovCgkgICAgdmFyIG5vcm1hbF9wcm9wb3NhbCA9IGZ1bmN0aW9uIChwYXJhbV9zdGF0ZSwgcHJvcF9sb2dfc2NhbGUpIHsKCSAgICAgIHJldHVybiBybm9ybShwYXJhbV9zdGF0ZSwgTWF0aC5leHAocHJvcF9sb2dfc2NhbGUpKTsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBAY2xhc3MKCSAgICAgKiBAYXVnbWVudHMge09uZWRpbU1ldHJvcG9saXNTdGVwcGVyfQoJICAgICAqIEEgInN1YmNsYXNzIiBvZiBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciBtYWtpbmcgY29udGlub3VzIE5vcm1hbCBwcm9wb3NhbHMuCgkgICAgICovCgkgICAgdmFyIFJlYWxNZXRyb3BvbGlzU3RlcHBlciA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykgewoJICAgICAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgbm9ybWFsX3Byb3Bvc2FsKTsKCSAgICB9OwoJICAgIFJlYWxNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7CgkgICAgUmVhbE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJlYWxNZXRyb3BvbGlzU3RlcHBlcjsKCgkgICAgLyoqCgkgICAgICogRnVuY3Rpb24gcmV0dXJuaW5nIGEgZGlzY3JldGl6ZWQgTm9ybWFsIHByb3Bvc2FsLgoJICAgICAqLwoJICAgIHZhciBkaXNjcmV0ZV9ub3JtYWxfcHJvcG9zYWwgPSBmdW5jdGlvbiAocGFyYW1fc3RhdGUsIHByb3BfbG9nX3NjYWxlKSB7CgkgICAgICByZXR1cm4gTWF0aC5yb3VuZChybm9ybShwYXJhbV9zdGF0ZSwgTWF0aC5leHAocHJvcF9sb2dfc2NhbGUpKSk7CgkgICAgfTsKCgkgICAgLyoqCgkgICAgKiBAY2xhc3MKCSAgICAqIEBhdWdtZW50cyB7T25lZGltTWV0cm9wb2xpc1N0ZXBwZXJ9CgkgICAgKiBBICJzdWJjbGFzcyIgb2YgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgbWFraW5nIGRpc2NyZXRpemVkIE5vcm1hbCBwcm9wb3NhbHMuCgkgICAgKi8KCSAgICB2YXIgSW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHsKCSAgICAgIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIGRpc2NyZXRlX25vcm1hbF9wcm9wb3NhbCk7CgkgICAgfTsKCSAgICBJbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7CgkgICAgSW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW50TWV0cm9wb2xpc1N0ZXBwZXI7CgoJICAgIC8qKgoJICAgICAqIEBjbGFzcwoJICAgICAqIEBpbXBsZW1lbnRzIHtTdGVwcGVyfQoJICAgICAqIENvbnN0cnVjdG9yIGZvciBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoZSBtZXRyb3BvbGlzIHN0ZXAgaW4KCSAgICAgKiB0aGUgQWRhcHRpdmUgTWV0cm9wb2xpcy1XaXRoaW4tR2liYnMgYWxnb3JpdGhtIGluICJFeGFtcGxlcyBvZiBBZGFwdGl2ZSBNQ01DIgoJICAgICAqIGJ5IFJvYmVydHMgYW5kIFJvc2VudGhhbCAoMjAwOCkgZm9yIHBvc3NpYmx5IG11bHRpZGltZW5zaW9uYWwgYXJyYXlzLiBUaGF0CgkgICAgICogaXMsIGluc3RlYWQgb2YganVzdCB0YWtpbmcgYSBzdGVwIGZvciBhIG9uZS1kaW1lbnNpb25hbCBwYXJhbWV0ZXIgbGlrZSAKCSAgICAgKiBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciwgdGhpcyBTdGVwcGVyIGlzIHJlc3BvbnNpYmxlIGZvciB0YWtpbmcgc3RlcHMgCgkgICAgICogZm9yIGEgbXVsdGlkaW1lbnNpb25hbCBhcnJheS4gSXQncyBzdGlsbCBwcmV0dHkgZHVtYiBhbmQganVzdCB0YWtlcwoJICAgICAqIG9uZS1kaW1lbnNpb25hbCBzdGVwcyBmb3IgZWFjaCBwYXJhbWV0ZXIgY29tcG9uZW50LCB0aG91Z2guCgkgICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIGEgc2luZ2xlIHBhcmFtZXRlciBkZWZpbml0aW9uIGZvciBhIAoJICAgICAqICAgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIuCgkgICAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLgoJICAgICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiAKCSAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuCgkgICAgICogQHBhcmFtIFN1YlN0ZXBwZXIgLSBhIGNvbnN0cnVjdG9yIGZvciB0aGUgdHlwZSBvZiBvbmUgZGltZW5zaW9uYWwgU3RlcHBlciB0byBhcHBseSBvbgoJICAgICAqICAgYWxsIHRoZSBjb21wb25lbnRzIG9mIHRoZSBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlci4KCSAgICAqLwoJICAgIHZhciBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24gKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zLCBTdWJTdGVwcGVyKSB7CgkgICAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpOwoJICAgICAgdmFyIHBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpOwoJICAgICAgaWYgKHBhcmFtX25hbWVzLmxlbmd0aCAhPSAxKSB7CgkgICAgICAgIHRocm93ICJNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIGNhbid0IGhhbmRsZSBtb3JlIHRoYW4gb25lIHBhcmFtZXRlci4iOwoJICAgICAgfQoJICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07CgkgICAgICB2YXIgcGFyYW0gPSB0aGlzLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVdOwoJICAgICAgdGhpcy5sb3dlciA9IHBhcmFtLmxvd2VyOwoJICAgICAgdGhpcy51cHBlciA9IHBhcmFtLnVwcGVyOwoJICAgICAgdGhpcy5kaW0gPSBwYXJhbS5kaW07CgkgICAgICB0aGlzLnByb3BfbG9nX3NjYWxlID0gZ2V0X211bHRpZGltX29wdGlvbigicHJvcF9sb2dfc2NhbGUiLCBvcHRpb25zLCB0aGlzLmRpbSwgMCk7CgkgICAgICB0aGlzLmJhdGNoX3NpemUgPSBnZXRfbXVsdGlkaW1fb3B0aW9uKCJiYXRjaF9zaXplIiwgb3B0aW9ucywgdGhpcy5kaW0sIDUwKTsKCSAgICAgIHRoaXMubWF4X2FkYXB0YXRpb24gPSBnZXRfbXVsdGlkaW1fb3B0aW9uKCJtYXhfYWRhcHRhdGlvbiIsIG9wdGlvbnMsIHRoaXMuZGltLCAwLjMzKTsKCSAgICAgIHRoaXMuaW5pdGlhbF9hZGFwdGF0aW9uID0gZ2V0X211bHRpZGltX29wdGlvbigiaW5pdGlhbF9hZGFwdGF0aW9uIiwgb3B0aW9ucywgdGhpcy5kaW0sIDEuMCk7CgkgICAgICB0aGlzLnRhcmdldF9hY2NlcHRfcmF0ZSA9IGdldF9tdWx0aWRpbV9vcHRpb24oInRhcmdldF9hY2NlcHRfcmF0ZSIsIG9wdGlvbnMsIHRoaXMuZGltLCAwLjQ0KTsKCSAgICAgIHRoaXMuaXNfYWRhcHRpbmcgPSBnZXRfbXVsdGlkaW1fb3B0aW9uKCJpc19hZGFwdGluZyIsIG9wdGlvbnMsIHRoaXMuZGltLCB0cnVlKTsKCgkgICAgICAvLyBUaGlzIGhhY2sgYmVsb3cgaXMgYSByZWN1cnNpdmUgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuIGFycmF5IG9mIAoJICAgICAgLy8gb25lIGRpbWVuc2lvbmFsIHN0ZXBwZXJzIGFjY29yZGluZyB0byBkaW0uCgkgICAgICB2YXIgY3JlYXRlX3N1YnN0ZXBwZXJzID0gZnVuY3Rpb24gKGRpbSwgc3Vic3RhdGUsIGxvZ19wb3N0LCBwcm9wX2xvZ19zY2FsZSwgYmF0Y2hfc2l6ZSwgbWF4X2FkYXB0YXRpb24sIGluaXRpYWxfYWRhcHRhdGlvbiwgdGFyZ2V0X2FjY2VwdF9yYXRlLCBpc19hZGFwdGluZykgewoJICAgICAgICB2YXIgc3Vic3RlcHBlcnMgPSBbXTsKCSAgICAgICAgaWYgKGRpbS5sZW5ndGggPT09IDEpIHsKCSAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7CgkgICAgICAgICAgICB2YXIgc3Vib3B0aW9ucyA9IHsKCSAgICAgICAgICAgICAgcHJvcF9sb2dfc2NhbGU6IHByb3BfbG9nX3NjYWxlW2ldLAoJICAgICAgICAgICAgICBiYXRjaF9zaXplOiBiYXRjaF9zaXplW2ldLAoJICAgICAgICAgICAgICBtYXhfYWRhcHRhdGlvbjogbWF4X2FkYXB0YXRpb25baV0sCgkgICAgICAgICAgICAgIGluaXRpYWxfYWRhcHRhdGlvbjogaW5pdGlhbF9hZGFwdGF0aW9uW2ldLAoJICAgICAgICAgICAgICB0YXJnZXRfYWNjZXB0X3JhdGU6IHRhcmdldF9hY2NlcHRfcmF0ZVtpXSwKCSAgICAgICAgICAgICAgaXNfYWRhcHRpbmc6IGlzX2FkYXB0aW5nW2ldCgkgICAgICAgICAgICB9OwoJICAgICAgICAgICAgdmFyIHN1YnBhcmFtID0ge307CgkgICAgICAgICAgICBzdWJwYXJhbVtpXSA9IGRlZXBfY2xvbmUocGFyYW0pOwoJICAgICAgICAgICAgc3VicGFyYW1baV0uZGltID0gWzFdOyAvLyBBcyB0aGlzIHNob3VsZCBub3cgYmUgYSBvbmUtZGltIHBhcmFtZXRlcgoJICAgICAgICAgICAgZGVsZXRlIHN1YnBhcmFtW2ldLmluaXQ7IC8vIEFzIGl0IHNvdWxkIG5vdCBiZSBuZWVkZWQKCSAgICAgICAgICAgIHN1YnN0ZXBwZXJzW2ldID0gbmV3IFN1YlN0ZXBwZXIoc3VicGFyYW0sIHN1YnN0YXRlLCBsb2dfcG9zdCwgc3Vib3B0aW9ucyk7CgkgICAgICAgICAgfQoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHsKCSAgICAgICAgICAgIHN1YnN0ZXBwZXJzW2ldID0gY3JlYXRlX3N1YnN0ZXBwZXJzKGRpbS5zbGljZSgxKSwgc3Vic3RhdGVbaV0sIGxvZ19wb3N0LCBwcm9wX2xvZ19zY2FsZVtpXSwgYmF0Y2hfc2l6ZVtpXSwgbWF4X2FkYXB0YXRpb25baV0sIGluaXRpYWxfYWRhcHRhdGlvbltpXSwgdGFyZ2V0X2FjY2VwdF9yYXRlW2ldLCBpc19hZGFwdGluZ1tpXSk7CgkgICAgICAgICAgfQoJICAgICAgICB9CgkgICAgICAgIHJldHVybiBzdWJzdGVwcGVyczsKCSAgICAgIH07CgkgICAgICB0aGlzLnN1YnN0ZXBwZXJzID0gY3JlYXRlX3N1YnN0ZXBwZXJzKHRoaXMuZGltLCB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0sIHRoaXMubG9nX3Bvc3QsIHRoaXMucHJvcF9sb2dfc2NhbGUsIHRoaXMuYmF0Y2hfc2l6ZSwgdGhpcy5tYXhfYWRhcHRhdGlvbiwgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24sIHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlLCB0aGlzLmlzX2FkYXB0aW5nKTsKCSAgICB9OwoJICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdGVwcGVyLnByb3RvdHlwZSk7CgkgICAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyOwoJICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAvLyBHbyB0aHJvdWdoIHRoZSBzdWJzdGVwcGVycyBpbiBhIHJhbmRvbSBvcmRlciBhbmQgY2FsbCBzdGVwKCkgb24gdGhlbS4KCSAgICAgIHJldHVybiBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uIChzdWJzdGVwcGVyKSB7CgkgICAgICAgIHJldHVybiBzdWJzdGVwcGVyLnN0ZXAoKTsKCSAgICAgIH0pOwoJICAgIH07CgkgICAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uICgpIHsKCSAgICAgIG5lc3RlZF9hcnJheV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbiAoc3Vic3RlcHBlcikgewoJICAgICAgICBzdWJzdGVwcGVyLnN0YXJ0X2FkYXB0YXRpb24oKTsKCSAgICAgIH0pOwoJICAgIH07CgkgICAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgbmVzdGVkX2FycmF5X2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uIChzdWJzdGVwcGVyKSB7CgkgICAgICAgIHN1YnN0ZXBwZXIuc3RvcF9hZGFwdGF0aW9uKCk7CgkgICAgICB9KTsKCSAgICB9OwoJICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbiAoKSB7CgkgICAgICByZXR1cm4gbmVzdGVkX2FycmF5X2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uIChzdWJzdGVwcGVyKSB7CgkgICAgICAgIHJldHVybiBzdWJzdGVwcGVyLmluZm8oKTsKCSAgICAgIH0pOwoJICAgIH07CgoJICAgIC8qKgoJICAgICAqIEBjbGFzcwoJICAgICAqIEBhdWdtZW50cyB7TXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcn0KCSAgICAgKiBBICJzdWJjbGFzcyIgb2YgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciBtYWtpbmcgY29udGlub3VzIE5vcm1hbCBwcm9wb3NhbHMuCgkgICAgICovCgkgICAgdmFyIE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24gKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKSB7CgkgICAgICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIFJlYWxNZXRyb3BvbGlzU3RlcHBlcik7CgkgICAgfTsKCSAgICBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlKTsKCSAgICBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjsKCgkgICAgLyoqCgkgICAgICogQGNsYXNzCgkgICAgICogQGF1Z21lbnRzIHtNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyfQoJICAgICAqIEEgInN1YmNsYXNzIiBvZiBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIG1ha2luZyBkaXNjcmV0aXplZCBOb3JtYWwgcHJvcG9zYWxzLgoJICAgICAqLwoJICAgIHZhciBNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24gKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKSB7CgkgICAgICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIEludE1ldHJvcG9saXNTdGVwcGVyKTsKCSAgICB9OwoJICAgIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7CgkgICAgTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyOwoKCSAgICAvKioKCSAgICAgKiBAY2xhc3MKCSAgICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn0KCSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBhIHN0ZXAgZm9yIGEgYmluYXJ5IHBhcmFtZXRlci4KCSAgICAgKiBUaGlzIGlzIGRvbmUgYnkgZXZhbHVhdGluZyB0aGUgbG9nIHBvc3RlcmlvciBmb3IgYm90aCBzdGF0ZXMgb2YgdGhlCgkgICAgICogcGFyYW1ldGVyIGFuZCB0aGVuIHNlbGVjdGluZyBhIHN0YXRlIHJhbmRvbWx5IHdpdGggcHJvYmFiaWxpdHkgcmVsYXRpdmUgCgkgICAgICogdG8gdGhlIHBvc3RlcmlvciBvZiBlYWNoIHN0YXRlLgoJICAgICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbi4KCSAgICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuCgkgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIAoJICAgICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci4KCSAgICAqLwoJICAgIHZhciBCaW5hcnlTdGVwcGVyID0gZnVuY3Rpb24gKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKSB7CgkgICAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpOwoJICAgICAgdmFyIHBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpOwoJICAgICAgaWYgKHBhcmFtX25hbWVzLmxlbmd0aCA9PSAxKSB7CgkgICAgICAgIHRoaXMucGFyYW1fbmFtZSA9IHBhcmFtX25hbWVzWzBdOwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgdGhyb3cgIkJpbmFyeVN0ZXBwZXIgY2FuJ3QgaGFuZGxlIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyLiI7CgkgICAgICB9CgkgICAgfTsKCSAgICBCaW5hcnlTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOwoJICAgIEJpbmFyeVN0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQmluYXJ5U3RlcHBlcjsKCSAgICBCaW5hcnlTdGVwcGVyLnByb3RvdHlwZS5zdGVwID0gZnVuY3Rpb24gKCkgewoJICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gMDsKCSAgICAgIHZhciB6ZXJvX2xvZ19kZW5zID0gdGhpcy5sb2dfcG9zdCgpOwoJICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gMTsKCSAgICAgIHZhciBvbmVfbG9nX2RlbnMgPSB0aGlzLmxvZ19wb3N0KCk7CgkgICAgICB2YXIgbWF4X2xvZ19kZW5zID0gTWF0aC5tYXgoemVyb19sb2dfZGVucywgb25lX2xvZ19kZW5zKTsKCSAgICAgIHplcm9fbG9nX2RlbnMgLT0gbWF4X2xvZ19kZW5zOwoJICAgICAgb25lX2xvZ19kZW5zIC09IG1heF9sb2dfZGVuczsKCSAgICAgIHZhciB6ZXJvX3Byb2IgPSBNYXRoLmV4cCh6ZXJvX2xvZ19kZW5zIC0gTWF0aC5sb2coTWF0aC5leHAoemVyb19sb2dfZGVucykgKyBNYXRoLmV4cChvbmVfbG9nX2RlbnMpKSk7CgkgICAgICBpZiAoTWF0aC5yYW5kb20oKSA8IHplcm9fcHJvYikgewoJICAgICAgICB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0gPSAwOwoJICAgICAgICByZXR1cm4gMDsKCSAgICAgIH0gLy8gZWxzZSBrZWVwIHRoZSBwYXJhbSBhdCAxIC4KCSAgICAgIHJldHVybiAxOwoJICAgIH07CgoJICAgIC8qKgoJICAgICogQGNsYXNzCgkgICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn0KCSAgICAqIEp1c3QgbGlrZSBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIHRoaXMgU3RlcHBlciB0YWtlcyBhIHN0ZXBzIGZvcgoJICAgICogYSBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlciBieSB1cGRhdGluZyBlYWNoIGNvbXBvbmVudCBpbiB0dXJuLiBUaGUgZGlmZmVyZW5jZQoJICAgICogaXMgdGhhdCB0aGlzIHN0ZXBwZXIgd29ya3Mgb24gYmluYXJ5IHBhcmFtZXRlcnMuCgkgICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyIGRlZmluaXRpb24gZm9yIGEgCgkgICAgKiAgIG11bHRpZGltZW5zaW9uYWwgcGFyYW1ldGVyLgoJICAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLgoJICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIAoJICAgICogQHBhcmFtIG9wdGlvbnMgLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zIHRvIHRoZSBzdGVwcGVyLgoJICAgICovCgkgICAgdmFyIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHsKCSAgICAgIFN0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCk7CgkgICAgICB2YXIgcGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7CgkgICAgICBpZiAocGFyYW1fbmFtZXMubGVuZ3RoID09IDEpIHsKCSAgICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07CgkgICAgICAgIHZhciBwYXJhbSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZV07CgkgICAgICAgIHRoaXMuZGltID0gcGFyYW0uZGltOwoJICAgICAgfSBlbHNlIHsKCSAgICAgICAgdGhyb3cgIkJpbmFyeUNvbXBvbmVudFN0ZXBwZXIgY2FuJ3QgaGFuZGxlIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyLiI7CgkgICAgICB9CgkgICAgICB2YXIgY3JlYXRlX3N1YnN0ZXBwZXJzID0gZnVuY3Rpb24gKGRpbSwgc3Vic3RhdGUsIGxvZ19wb3N0KSB7CgkgICAgICAgIHZhciBzdWJzdGVwcGVycyA9IFtdOwoJICAgICAgICB2YXIgaTsKCSAgICAgICAgaWYgKGRpbS5sZW5ndGggPT09IDEpIHsKCSAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHsKCSAgICAgICAgICAgIHZhciBzdWJwYXJhbXMgPSB7fTsKCSAgICAgICAgICAgIHN1YnBhcmFtc1tpXSA9IHBhcmFtOwoJICAgICAgICAgICAgc3Vic3RlcHBlcnNbaV0gPSBuZXcgQmluYXJ5U3RlcHBlcihzdWJwYXJhbXMsIHN1YnN0YXRlLCBsb2dfcG9zdCk7CgkgICAgICAgICAgfQoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykgewoJICAgICAgICAgICAgc3Vic3RlcHBlcnNbaV0gPSBjcmVhdGVfc3Vic3RlcHBlcnMoZGltLnNsaWNlKDEpLCBzdWJzdGF0ZVtpXSwgbG9nX3Bvc3QpOwoJICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICByZXR1cm4gc3Vic3RlcHBlcnM7CgkgICAgICB9OwoJICAgICAgdGhpcy5zdWJzdGVwcGVycyA9IGNyZWF0ZV9zdWJzdGVwcGVycyh0aGlzLmRpbSwgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdLCB0aGlzLmxvZ19wb3N0KTsKCSAgICB9OwoJICAgIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdGVwcGVyLnByb3RvdHlwZSk7CgkgICAgQmluYXJ5Q29tcG9uZW50U3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCaW5hcnlDb21wb25lbnRTdGVwcGVyOwoJICAgIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbiAoKSB7CgkgICAgICAvLyBHbyB0aHJvdWdoIHRoZSBzdWJzdGVwcGVycyBpbiBhIHJhbmRvbSBvcmRlciBhbmQgY2FsbCBzdGVwKCkgb24gdGhlbS4KCSAgICAgIHJldHVybiBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uIChzdWJzdGVwcGVyKSB7CgkgICAgICAgIHJldHVybiBzdWJzdGVwcGVyLnN0ZXAoKTsKCSAgICAgIH0pOwoJICAgIH07CgoJICAgIC8qKgoJICAgICAqIEBjbGFzcwoJICAgICAqIEBpbXBsZW1lbnRzIHtTdGVwcGVyfQoJICAgICAqIFRoaXMgc3RlcHBlciBjYW4gYmUgcmVzcG9uc2libGUgZm9yIHRha2luZyBhIHN0ZXAgZm9yIG9uZSBvciBtb3JlIHBhcmFtZXRlcnMuCgkgICAgICogRm9yIHJlYWwgYW5kIGludCBwYXJhbWV0ZXJzIGl0IHRha2VzIE1ldHJvcG9saXMgd2l0aGluIEdpYmJzIHN0ZXBzLCBhbmQgZm9yIAoJICAgICAqIGJpbmFyeSBwYXJhbWV0ZXJzIGl0IGRvZXMgZXZhbHVhdGVzIHRoZSBwb3N0ZXJpb3IgZm9yIGJvdGggcGFyYW10ZXIgdmFsdWVzIGFuZAoJICAgICAqIHJhbmRvbWx5IGNoYW5nZXMgdG8gYSBjZXJ0YWluIHZhbHVlIHByb3BvcnRpb25hbGx5IHRvIHRoYXQgdmFsdWUncyBwb3N0ZXJpb3IKCSAgICAgKiAodGhpcyBpcyBhbHNvIGRvbmUgZm9yIGVhY2ggcGFyYW1ldGVyLCBzbyBhbHNvIGEgKiB3aXRoaW4gR2liYnMgYXBwcm9hY2gpLgoJICAgICAqIFRoaXMgc3RlcHBlciBpcyBhbHNvIGFkYXB0aXZlIGFuZCBjYW4gYmUgZWZmaWNpZW50IHdoZW4gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzCgkgICAgICogYXJlIG5vdCB0b28gaGlnaCBhbmQgdGhlIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHBhcmFtZXRlcnMgYXJlIGxvdy4KCSAgICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBvbmUgb3IgbW9yZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMKCSAgICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuCgkgICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIAoJICAgICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci4KCSAgICAqLwoJICAgIHZhciBBbXdnU3RlcHBlciA9IGZ1bmN0aW9uIChwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykgewoJICAgICAgU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0KTsKCSAgICAgIHRoaXMucGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7CgkgICAgICB0aGlzLnN1YnN0ZXBwZXJzID0gW107CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucGFyYW1fbmFtZXMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgdmFyIHBhcmFtID0gcGFyYW1zW3RoaXMucGFyYW1fbmFtZXNbaV1dOwoJICAgICAgICB2YXIgU2VsZWN0U3RlcHBlcjsKCSAgICAgICAgc3dpdGNoIChwYXJhbS50eXBlKSB7CgkgICAgICAgICAgY2FzZSAicmVhbCI6CgkgICAgICAgICAgICBpZiAoYXJyYXlfZXF1YWwocGFyYW0uZGltLCBbMV0pKSB7CgkgICAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBSZWFsTWV0cm9wb2xpc1N0ZXBwZXI7CgkgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICBjYXNlICJpbnQiOgoJICAgICAgICAgICAgaWYgKGFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSkgewoJICAgICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gSW50TWV0cm9wb2xpc1N0ZXBwZXI7CgkgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjsKCSAgICAgICAgICAgIH0KCSAgICAgICAgICAgIGJyZWFrOwoJICAgICAgICAgIGNhc2UgImJpbmFyeSI6CgkgICAgICAgICAgICBpZiAoYXJyYXlfZXF1YWwocGFyYW0uZGltLCBbMV0pKSB7CgkgICAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBCaW5hcnlTdGVwcGVyOwoJICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IEJpbmFyeUNvbXBvbmVudFN0ZXBwZXI7CgkgICAgICAgICAgICB9CgkgICAgICAgICAgICBicmVhazsKCSAgICAgICAgICBkZWZhdWx0OgoJICAgICAgICAgICAgdGhyb3cgIkFtd2dTdGVwcGVyIGNhbid0IGhhbmRsZSBwYXJhbWV0ZXIgIiArIHRoaXMucGFyYW1fbmFtZXNbaV0gKyAiIHdpdGggdHlwZSAiICsgcGFyYW0udHlwZTsKCSAgICAgICAgfQoJICAgICAgICB2YXIgcGFyYW1fb2JqZWN0X3dyYXAgPSB7fTsKCSAgICAgICAgcGFyYW1fb2JqZWN0X3dyYXBbdGhpcy5wYXJhbV9uYW1lc1tpXV0gPSBwYXJhbTsKCSAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CgkgICAgICAgIHZhciBwYXJhbV9vcHRpb25zID0gb3B0aW9ucy5wYXJhbXMgJiYgb3B0aW9ucy5wYXJhbXNbdGhpcy5wYXJhbV9uYW1lc1tpXV0gfHwge307CgkgICAgICAgIHBhcmFtX29wdGlvbnMucHJvcF9sb2dfc2NhbGUgPSBwYXJhbV9vcHRpb25zLnByb3BfbG9nX3NjYWxlIHx8IG9wdGlvbnMucHJvcF9sb2dfc2NhbGU7CgkgICAgICAgIHBhcmFtX29wdGlvbnMuYmF0Y2hfc2l6ZSA9IHBhcmFtX29wdGlvbnMuYmF0Y2hfc2l6ZSB8fCBvcHRpb25zLmJhdGNoX3NpemU7CgkgICAgICAgIHBhcmFtX29wdGlvbnMubWF4X2FkYXB0YXRpb24gPSBwYXJhbV9vcHRpb25zLm1heF9hZGFwdGF0aW9uIHx8IG9wdGlvbnMubWF4X2FkYXB0YXRpb247CgkgICAgICAgIHBhcmFtX29wdGlvbnMuaW5pdGlhbF9hZGFwdGF0aW9uID0gcGFyYW1fb3B0aW9ucy5pbml0aWFsX2FkYXB0YXRpb24gfHwgb3B0aW9ucy5pbml0aWFsX2FkYXB0YXRpb247CgkgICAgICAgIHBhcmFtX29wdGlvbnMudGFyZ2V0X2FjY2VwdF9yYXRlID0gcGFyYW1fb3B0aW9ucy50YXJnZXRfYWNjZXB0X3JhdGUgfHwgb3B0aW9ucy50YXJnZXRfYWNjZXB0X3JhdGU7CgkgICAgICAgIHBhcmFtX29wdGlvbnMuaXNfYWRhcHRpbmcgPSBwYXJhbV9vcHRpb25zLmlzX2FkYXB0aW5nIHx8IG9wdGlvbnMuaXNfYWRhcHRpbmc7CgkgICAgICAgIHRoaXMuc3Vic3RlcHBlcnNbaV0gPSBuZXcgU2VsZWN0U3RlcHBlcihwYXJhbV9vYmplY3Rfd3JhcCwgc3RhdGUsIGxvZ19wb3N0LCBwYXJhbV9vcHRpb25zKTsKCSAgICAgIH0KCSAgICB9OwoJICAgIEFtd2dTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOwoJICAgIEFtd2dTdGVwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEFtd2dTdGVwcGVyOwoJICAgIEFtd2dTdGVwcGVyLnByb3RvdHlwZS5zdGVwID0gZnVuY3Rpb24gKCkgewoJICAgICAgc2h1ZmZsZV9hcnJheSh0aGlzLnN1YnN0ZXBwZXJzKTsKCSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zdWJzdGVwcGVycy5sZW5ndGg7IGkrKykgewoJICAgICAgICB0aGlzLnN1YnN0ZXBwZXJzW2ldLnN0ZXAoKTsKCSAgICAgIH0KCSAgICAgIHJldHVybiB0aGlzLnN0YXRlOwoJICAgIH07CgkgICAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbiAoKSB7CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic3RlcHBlcnMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgdGhpcy5zdWJzdGVwcGVyc1tpXS5zdGFydF9hZGFwdGF0aW9uKCk7CgkgICAgICB9CgkgICAgfTsKCSAgICBBbXdnU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN1YnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7CgkgICAgICAgIHRoaXMuc3Vic3RlcHBlcnNbaV0uc3RvcF9hZGFwdGF0aW9uKCk7CgkgICAgICB9CgkgICAgfTsKCSAgICBBbXdnU3RlcHBlci5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uICgpIHsKCSAgICAgIHZhciBpbmZvID0ge307CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic3RlcHBlcnMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgaW5mb1t0aGlzLnBhcmFtX25hbWVzW2ldXSA9IHRoaXMuc3Vic3RlcHBlcnNbaV0uaW5mbygpOwoJICAgICAgfQoJICAgICAgcmV0dXJuIGluZm87CgkgICAgfTsKCgkgICAgLy8vLy8vLy8vLy8gU2FtcGxlciBGdW5jdGlvbnMgLy8vLy8vLy8vLwoJICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgkgICAgLyoqCgkgICAgKiBAaW50ZXJmYWNlCgkgICAgKiBXaGlsZSB5b3UgY291bGQgZml0IGEgbW9kZWwgYnkgcGFzdGluZyB0b2dldGhlciBTdGVwcGVycywgYQoJICAgIC8vIFNhbXBsZXIgaXMgaGVyZSBpcyBhIGNvbnZlbmllbmNlIGNsYXNzIHdoZXJlIGFuIGluc3RhbmNlIG9mIFNhbXBsZXIKCSAgICAvLyBzZXRzIHVwIHRoZSBTdGVwcGVycywgY2hlY2tzIHRoZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiwKCSAgICAvLyBhbmQgbWFuYWdlcyB0aGUgc2FtcGxpbmcuIFRoaXMgaGVyZSBkZWZpbmVzIHRoZSBTYW1wbGVyICJpbnRlcmZhY2UiLgoJICAgICogQGludGVyZmFjZQoJICAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIHBhcmFtZXRlciBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGU6CgkgICAgKiAgIHsibXUiOiB7InR5cGUiOiAicmVhbCJ9LCAic2lnbWEiOiB7InR5cGUiOiAicmVhbCIsICJsb3dlciIgPSAwfX0KCSAgICAqICAgVGhlIHBhcmFtZXRlciBkZWZpbml0aW9ucyBkb2Vzbid0IGhhdmUgdG8gYmUgImNvbXBsZXRlIiBhbmQgcHJvcGVydGllcwoJICAgICogICBsZWZ0IG91dCAobGlrZSBsb3dlciBhbmQgdXBwZXIpIHdpbGwgYmUgZmlsbGVkIGluIGJ5IGRlZmF1bHRzLgoJICAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB3aXRoIHNpZ25hdHVyZSBmdW5jdGlvbihzdGF0ZSwgZGF0YSkuIEhlcmUKCSAgICAqICAgc3RhdGUgd2lsbCBiZSBhbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSB3aXRoIGVhY2ggcGFyYW1ldGVyIGFzIGEgCgkgICAgKiAgIGtleSBhbmQgdGhlIHBhcmFtZXRlciB2YWx1ZXMgYXMgbnVtYmVycyBvciBhcnJheXMuIEZvciBleGFtcGxlOgoJICAgICogICB7Im11IjogMywgInNpZ21hIjogMS41fS4gVGhlIGRhdGEgYXJndW1lbnQgd2lsbCBiZSB0aGUgc2FtZSBvYmplY3QgYXMgCgkgICAgKiAgIHRoZSBkYXRhIGFyZ3VtZW50IGdpdmVuIGJlbG93LgoJICAgICogQHBhcmFtIGRhdGEgLSBhbiBvYmplY3QgdGhhdCB3aWxsIGJlIHBhc3NlZCBvbiB0byB0aGUgbG9nX3Bvc3QgZnVuY3Rpb24KCSAgICAqICAgd2hlbiBzYW1wbGluZy4KCSAgICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc2FtcGxlci4KCSAgICAqLwoJICAgIHZhciBTYW1wbGVyID0gZnVuY3Rpb24gKHBhcmFtcywgbG9nX3Bvc3QsIGRhdGEsIG9wdGlvbnMpIHsKCSAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOwoJICAgICAgdGhpcy5kYXRhID0gZGF0YTsKCSAgICAgIHRoaXMucGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7CgoJICAgICAgLy8gU2V0dGluZyBkZWZhdWx0IG9wdGlvbnMgaWYgbm90IHBhc3NlZCB0aHJvdWdoIHRoZSBvcHRpb25zIG9iamVjdAoJICAgICAgdGhpcy5wYXJhbV9pbml0X2Z1biA9IGdldF9vcHRpb24oInBhcmFtX2luaXRfZnVuIiwgb3B0aW9ucywgcGFyYW1faW5pdF9maXhlZCk7CgkgICAgICB2YXIgdGhpbm5pbmdfaW50ZXJ2YWwgPSBnZXRfb3B0aW9uKCJ0aGluIiwgb3B0aW9ucywgMSk7CgkgICAgICB2YXIgcGFyYW1zX3RvX21vbml0b3IgPSBnZXRfb3B0aW9uKCJtb25pdG9yIiwgb3B0aW9ucywgbnVsbCk7CgkgICAgICB0aGlzLnRoaW4odGhpbm5pbmdfaW50ZXJ2YWwpOwoJICAgICAgdGhpcy5tb25pdG9yKHBhcmFtc190b19tb25pdG9yKTsKCSAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CgkgICAgICAvLyBDb21wbGV0aW5nIHRoZSBwYXJhbXMgYW5kIGluaXRpYWxpemluZyB0aGUgc3RhdGUuCgkgICAgICB0aGlzLnBhcmFtcyA9IGNvbXBsZXRlX3BhcmFtcyh0aGlzLnBhcmFtcywgdGhpcy5wYXJhbV9pbml0X2Z1bik7CgkgICAgICB2YXIgc3RhdGUgPSB7fTsKCSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYXJhbV9uYW1lcy5sZW5ndGg7IGkrKykgewoJICAgICAgICBzdGF0ZVt0aGlzLnBhcmFtX25hbWVzW2ldXSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZXNbaV1dLmluaXQ7CgkgICAgICB9CgkgICAgICB0aGlzLmxvZ19wb3N0ID0gZnVuY3Rpb24gKCkgewoJICAgICAgICByZXR1cm4gbG9nX3Bvc3Qoc3RhdGUsIGRhdGEpOwoJICAgICAgfTsKCSAgICAgIC8vIFJ1bm5pbmcgdGhlIGxvZ19wb3N0IGZ1bmN0aW9uIG9uY2UgaW4gY2FzZSBpdCBmdXJ0aGVyIG1vZGlmaWVzIHRoZSBzdGF0ZQoJICAgICAgLy8gZm9yIGV4YW1wbGUgYWRkaW5nIGRlcml2ZWQgcXVhbnRpdGllcy4KCSAgICAgIHRoaXMubG9nX3Bvc3QoKTsKCSAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKCSAgICAgIHRoaXMuc3RlcHBlcnMgPSB0aGlzLmNyZWF0ZV9zdGVwcGVyX2Vuc2FtYmxlKHRoaXMucGFyYW1zLCB0aGlzLnN0YXRlLCB0aGlzLmxvZ19wb3N0LCB0aGlzLm9wdGlvbnMpOwoJICAgIH07CgoJICAgIC8qKiBTaG91bGQgcmV0dXJuIGEgdmVjdG9yIG9mIHN0ZXBwZXJzIHRoYXQgd2hlbiBjYWxsZWQgCgkgICAgICogc2hvdWxkIHRha2UgYSBzdGVwIGluIHRoZSBwYXJhbWV0ZXIgc3BhY2UuCgkgICAgICovCgkgICAgU2FtcGxlci5wcm90b3R5cGUuY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUgPSBmdW5jdGlvbiAoc3RhdGUsIGxvZ19wb3N0KSB7CgkgICAgICB0aHJvdyAiRXZlcnkgU2FtcGxlciBuZWVkcyB0byBpbXBsZW1lbnQgY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUoKSI7CgkgICAgfTsKCgkgICAgLyoqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggaW5mbyBhYm91dCB0aGUgc3RhdGUgb2YgdGhlIFNhbXBsZXIuCgkgICAgICovCgkgICAgU2FtcGxlci5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uICgpIHsKCSAgICAgIHJldHVybiB7CgkgICAgICAgIHN0YXRlOiB0aGlzLnN0YXRlLAoJICAgICAgICB0aGluOiB0aGlzLnRoaW4sCgkgICAgICAgIG1vbml0b3I6IHRoaXMubW9uaXRvciwKCSAgICAgICAgc3RlcHBlcnM6IHRoaXMuc3RlcHBlcnMKCSAgICAgIH07CgkgICAgfTsKCgkgICAgLyoqIFRha2VzIGEgc3RlcCBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlLiBSZXR1cm5zIHRoZSBuZXcgc3BhY2UKCSAgICAgKiBidXQgYWxzbyBtb2RpZmllcyB0aGUgc3RhdGUgaW4gcGxhY2UuCgkgICAgICovCgkgICAgU2FtcGxlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uICgpIHsKCSAgICAgIHNodWZmbGVfYXJyYXkodGhpcy5zdGVwcGVycyk7CgkgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3RlcHBlcnMubGVuZ3RoOyBpKyspIHsKCSAgICAgICAgdGhpcy5zdGVwcGVyc1tpXS5zdGVwKCk7CgkgICAgICB9CgkgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5zdGF0ZSkubGVuZ3RoID4gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpLmxlbmd0aCkgewoJICAgICAgICAvLyBUaGUgc3RhdGUgY29udGFpbnMgZGV2aXZlZCBxdWFudGl0aWVzIChub3Qgb25seSBwYXJhbWV0ZXJzKSBhbmQgd2UKCSAgICAgICAgLy8gbmVlZCB0byBydW4gdGhlIGxvZ19wb3N0IG9uY2UgbW9yZSBpbiBvcmRlciB0byBzZXQgdGhlIGRlcml2ZWQgcXVhbnRpdGllcwoJICAgICAgICAvLyBmb3IgdGhlIGZpbmFsIHBhcmFtZXRlciBzdGF0ZQoJICAgICAgICB0aGlzLmxvZ19wb3N0KCk7CgkgICAgICB9CgkgICAgICByZXR1cm4gdGhpcy5zdGF0ZTsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBUYWtlcyBuX2l0ZXJhdGlvbnMgc3RlcHMgaW4gdGhlIHBhcmFtZXRlciBzcGFjZSBhbmQgcmV0dXJucyB0aGVtCgkgICAgICogYXMgYW4gb2JqZWN0IG9mIGFycmF5cyB3aXRoIG9uZSBhcnJheSBwZXIgcGFyYW1ldGVyLiBGb3IgZXhhbXBsZToKCSAgICAgKiB7bXU6IFsxLCAtMSwgMiwgMywgLi4uXSwgc2lnbWE6IFsxLCAyLCAyLCAxLCAuLi5dfS4KCSAgICAgKiBJZiB0aGluIGlzID4gMSB0aGVuIG5faXRlcmF0aW9ucyAvIHRoaW4gc2FtcGxlcyBhcmUgcmV0dXJuZWQuCgkgICAgICovCgkgICAgU2FtcGxlci5wcm90b3R5cGUuc2FtcGxlID0gZnVuY3Rpb24gKG5faXRlcmF0aW9ucykgewoJICAgICAgLy8gSW5pdGlhbGl6aW5nIGN1cnJfc2FtcGxlIHdoZXJlIHRoZSBzYW1wbGUgaXMgZ29pbmcgdG8gYmUgc2F2ZWQKCSAgICAgIC8vIGFzIGFuIG9iamVjdCBjb250YWluaW5nIG9uZSBhcnJheSBwZXIgcGFyYW1ldGVyIHRvIGJlIG1vbml0b3JlZC4KCSAgICAgIHZhciBpLCBqLCBtb25pdG9yZWRfcGFyYW1zOwoJICAgICAgaWYgKHRoaXMubW9uaXRvcmVkX3BhcmFtcyA9PT0gbnVsbCkgewoJICAgICAgICBtb25pdG9yZWRfcGFyYW1zID0gT2JqZWN0LmtleXModGhpcy5zdGF0ZSk7CgkgICAgICB9IGVsc2UgewoJICAgICAgICBtb25pdG9yZWRfcGFyYW1zID0gdGhpcy5tb25pdG9yZWRfcGFyYW1zOwoJICAgICAgfQoJICAgICAgdmFyIGN1cnJfc2FtcGxlID0ge307CgkgICAgICBmb3IgKGogPSAwOyBqIDwgbW9uaXRvcmVkX3BhcmFtcy5sZW5ndGg7IGorKykgewoJICAgICAgICBjdXJyX3NhbXBsZVttb25pdG9yZWRfcGFyYW1zW2pdXSA9IFtdOwoJICAgICAgfQoJICAgICAgZm9yIChpID0gMDsgaSA8IG5faXRlcmF0aW9uczsgaSsrKSB7CgkgICAgICAgIGlmIChpICUgdGhpcy50aGlubmluZ19pbnRlcnZhbCA9PT0gMCkgewoJICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBtb25pdG9yZWRfcGFyYW1zLmxlbmd0aDsgaisrKSB7CgkgICAgICAgICAgICB2YXIgcGFyYW0gPSBtb25pdG9yZWRfcGFyYW1zW2pdOwoJICAgICAgICAgICAgY3Vycl9zYW1wbGVbcGFyYW1dLnB1c2goY2xvbmVfcGFyYW1fZHJhdyh0aGlzLnN0YXRlW3BhcmFtXSkpOwoJICAgICAgICAgIH0KCSAgICAgICAgfQoJICAgICAgICB0aGlzLnN0ZXAoKTsKCSAgICAgIH0KCSAgICAgIHJldHVybiBjdXJyX3NhbXBsZTsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBUYWtlcyBuX2l0ZXJhdGlvbiBzdGVwcyBpbiBwYXJhbWV0ZXIgc3BhY2UgYnV0IHJldHVybnMgbm90aGluZy4KCSAgICAgKi8KCSAgICBTYW1wbGVyLnByb3RvdHlwZS5idXJuID0gZnVuY3Rpb24gKG5faXRlcmF0aW9ucykgewoJICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuX2l0ZXJhdGlvbnM7IGkrKykgewoJICAgICAgICB0aGlzLnN0ZXAoKTsKCSAgICAgIH0KCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBTZXRzIHdoYXQgcGFyYW1ldGVycyBzaG91bGQgYmUgbW9uaXRvcmVkIGFuZCByZXR1cm5lZCB3aGVuIGNhbGxpbmcKCSAgICAgKiBzYW1wbGUuCgkgICAgICovCgkgICAgU2FtcGxlci5wcm90b3R5cGUubW9uaXRvciA9IGZ1bmN0aW9uIChwYXJhbXNfdG9fbW9uaXRvcikgewoJICAgICAgdGhpcy5tb25pdG9yZWRfcGFyYW1zID0gcGFyYW1zX3RvX21vbml0b3I7CgkgICAgfTsKCgkgICAgLyoqCgkgICAgICogU2V0cyB0aGUgdGhpbm5pbmcuIEZvciBleGFtcGxlIHRoaW4gPT0gMTAgbWVhbnMgdGhhdCBldmVyeSAxMHRoIHBvc3RlcmlvcgoJICAgICAqIGRyYXcgd2lsbCBiZSBrZXB0LgoJICAgICAqLwoJICAgIFNhbXBsZXIucHJvdG90eXBlLnRoaW4gPSBmdW5jdGlvbiAodGhpbm5pbmdfaW50ZXJ2YWwpIHsKCSAgICAgIHRoaXMudGhpbm5pbmdfaW50ZXJ2YWwgPSB0aGlubmluZ19pbnRlcnZhbDsKCSAgICB9OwoKCSAgICAvKioKCSAgICAgKiBTZXRzIGFkYXB0YXRpb24gb24sIGlmIGFwcGxpY2FibGUsIGluIGFsbCBzdGVwcGVycy4KCSAgICAgKi8KCSAgICBTYW1wbGVyLnByb3RvdHlwZS5zdGFydF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7CgkgICAgICAgIHRoaXMuc3RlcHBlcnNbaV0uc3RhcnRfYWRhcHRhdGlvbigpOwoJICAgICAgfQoJICAgIH07CgoJICAgIC8qKgoJICAgICogU2V0cyBhZGFwdGF0aW9uIG9mZiwgaWYgYXBwbGljYWJsZSwgaW4gYWxsIHN0ZXBwZXJzLgoJICAgICovCgkgICAgU2FtcGxlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24gKCkgewoJICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7CgkgICAgICAgIHRoaXMuc3RlcHBlcnNbaV0uc3RvcF9hZGFwdGF0aW9uKCk7CgkgICAgICB9CgkgICAgfTsKCgkgICAgLyoqCgkgICAgKiBAY2xhc3MKCSAgICAqIEBpbXBsZW1lbnRzIHtTYW1wbGVyfQoJICAgICogVGhpcyBzYW1wbGVyIHVzZXMgdGhlIEFtd2dTdGVwcGVyIGFzIHRoZSBzdGVwcGVyIGZ1bmN0aW9uIHdoaWNoIGltcGxlbWVudHMgdGhlIAoJICAgICogQWRhcHRpdmUgTWV0cm9wb2xpcy1XaXRoaW4tR2liYnMgYWxnb3JpdGhtIGluICJFeGFtcGxlcyBvZiBBZGFwdGl2ZSBNQ01DIgoJICAgICogYnkgUm9iZXJ0cyBhbmQgUm9zZW50aGFsICgyMDA4KS4gQW4gYWRpdGlvbiBpcyB0aGF0IGl0IGhhbmRsZXMgaW50IHBhcmFtZXRlcnMKCSAgICAqIGJ5IG1ha2luZyBkaXNjcmV0ZSBOb3JtYWwgcHJvcG9zYWxzIGFuZCBiaW5hcnkgcGFyYW1ldGVycyBieSB0YWtpbmcgb24gYSBuZXcgCgkgICAgKiB2YWx1ZSBwcm9wb3J0aW9uYWwgdG8gdGhlIHBvc3RlcmlvciBvZiB0aGUgdHdvIHBvc3NpYmxlIHN0YXRlcyBvZiB0aGUKCSAgICAqIHBhcmFtZXRlci4gVGhpcyBzYW1wbGVyIGNhbiBiZSBlZmZpY2llbnQgd2hlbiB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKCSAgICAqIGFyZSBub3QgdG9vIGhpZ2ggYW5kIHRoZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBwYXJhbWV0ZXJzIGFyZSBsb3cuCgkgICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBvbmUgb3IgbW9yZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMKCSAgICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy4KCSAgICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiAKCSAgICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci4KCSAgICAqLwoJICAgIHZhciBBbXdnU2FtcGxlciA9IGZ1bmN0aW9uIChwYXJhbXMsIGxvZ19wb3N0LCBkYXRhLCBvcHRpb25zKSB7CgkgICAgICBTYW1wbGVyLmNhbGwodGhpcywgcGFyYW1zLCBsb2dfcG9zdCwgZGF0YSwgb3B0aW9ucyk7CgkgICAgfTsKCSAgICBBbXdnU2FtcGxlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNhbXBsZXIucHJvdG90eXBlKTsKCSAgICBBbXdnU2FtcGxlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBbXdnU2FtcGxlcjsKCSAgICBBbXdnU2FtcGxlci5wcm90b3R5cGUuY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUgPSBmdW5jdGlvbiAocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHsKCSAgICAgIHJldHVybiBbbmV3IEFtd2dTdGVwcGVyKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKV07CgkgICAgfTsKCgkgICAgLy8gUmV0dXJuaW5nIHRoZSBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgcHVibGljbHkgZXhwb3NlZCBieSB0aGlzIG1vZHVsZQoJICAgIHJldHVybiB7CgkgICAgICBydW5pZjogcnVuaWYsCgkgICAgICBydW5pZl9kaXNjcmV0ZTogcnVuaWZfZGlzY3JldGUsCgkgICAgICBybm9ybTogcm5vcm0sCgkgICAgICBwYXJhbV9pbml0X2ZpeGVkOiBwYXJhbV9pbml0X2ZpeGVkLAoJICAgICAgY29tcGxldGVfcGFyYW1zOiBjb21wbGV0ZV9wYXJhbXMsCgkgICAgICBSZWFsTWV0cm9wb2xpc1N0ZXBwZXI6IFJlYWxNZXRyb3BvbGlzU3RlcHBlciwKCSAgICAgIEludE1ldHJvcG9saXNTdGVwcGVyOiBJbnRNZXRyb3BvbGlzU3RlcHBlciwKCSAgICAgIE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyOiBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciwKCSAgICAgIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI6IE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIsCgkgICAgICBCaW5hcnlTdGVwcGVyOiBCaW5hcnlTdGVwcGVyLAoJICAgICAgQmluYXJ5Q29tcG9uZW50U3RlcHBlcjogQmluYXJ5Q29tcG9uZW50U3RlcHBlciwKCSAgICAgIEFtd2dTdGVwcGVyOiBBbXdnU3RlcHBlciwKCSAgICAgIEFtd2dTYW1wbGVyOiBBbXdnU2FtcGxlcgoJICAgIH07CgkgIH0pOwoJfSkobWNtYyk7Cgl2YXIgbWNtY0V4cG9ydHMgPSBtY21jLmV4cG9ydHM7CgoJZnVuY3Rpb24gYXNjZW5kaW5nKGEsIGIpIHsKCSAgcmV0dXJuIGEgPT0gbnVsbCB8fCBiID09IG51bGwgPyBOYU4gOiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjsKCX0KCglmdW5jdGlvbiogbnVtYmVycyh2YWx1ZXMsIHZhbHVlb2YpIHsKCSAgewoJICAgIGZvciAobGV0IHZhbHVlIG9mIHZhbHVlcykgewoJICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKHZhbHVlID0gK3ZhbHVlKSA+PSB2YWx1ZSkgewoJICAgICAgICB5aWVsZCB2YWx1ZTsKCSAgICAgIH0KCSAgICB9CgkgIH0KCX0KCglmdW5jdGlvbiBjb21wYXJlRGVmaW5lZChjb21wYXJlID0gYXNjZW5kaW5nKSB7CgkgIGlmIChjb21wYXJlID09PSBhc2NlbmRpbmcpIHJldHVybiBhc2NlbmRpbmdEZWZpbmVkOwoJICBpZiAodHlwZW9mIGNvbXBhcmUgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoImNvbXBhcmUgaXMgbm90IGEgZnVuY3Rpb24iKTsKCSAgcmV0dXJuIChhLCBiKSA9PiB7CgkgICAgY29uc3QgeCA9IGNvbXBhcmUoYSwgYik7CgkgICAgaWYgKHggfHwgeCA9PT0gMCkgcmV0dXJuIHg7CgkgICAgcmV0dXJuIChjb21wYXJlKGIsIGIpID09PSAwKSAtIChjb21wYXJlKGEsIGEpID09PSAwKTsKCSAgfTsKCX0KCWZ1bmN0aW9uIGFzY2VuZGluZ0RlZmluZWQoYSwgYikgewoJICByZXR1cm4gKGEgPT0gbnVsbCB8fCAhKGEgPj0gYSkpIC0gKGIgPT0gbnVsbCB8fCAhKGIgPj0gYikpIHx8IChhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMCk7Cgl9CgoJZnVuY3Rpb24gbWF4KHZhbHVlcywgdmFsdWVvZikgewoJICBsZXQgbWF4OwoJICB7CgkgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHsKCSAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIChtYXggPCB2YWx1ZSB8fCBtYXggPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+PSB2YWx1ZSkpIHsKCSAgICAgICAgbWF4ID0gdmFsdWU7CgkgICAgICB9CgkgICAgfQoJICB9CgkgIHJldHVybiBtYXg7Cgl9CgoJZnVuY3Rpb24gbWluKHZhbHVlcywgdmFsdWVvZikgewoJICBsZXQgbWluOwoJICB7CgkgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHsKCSAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIChtaW4gPiB2YWx1ZSB8fCBtaW4gPT09IHVuZGVmaW5lZCAmJiB2YWx1ZSA+PSB2YWx1ZSkpIHsKCSAgICAgICAgbWluID0gdmFsdWU7CgkgICAgICB9CgkgICAgfQoJICB9CgkgIHJldHVybiBtaW47Cgl9CgoJLy8gQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL21vdXJuZXIvcXVpY2tzZWxlY3QKCS8vIElTQyBsaWNlbnNlLCBDb3B5cmlnaHQgMjAxOCBWbGFkaW1pciBBZ2Fmb25raW4uCglmdW5jdGlvbiBxdWlja3NlbGVjdChhcnJheSwgaywgbGVmdCA9IDAsIHJpZ2h0ID0gSW5maW5pdHksIGNvbXBhcmUpIHsKCSAgayA9IE1hdGguZmxvb3Ioayk7CgkgIGxlZnQgPSBNYXRoLmZsb29yKE1hdGgubWF4KDAsIGxlZnQpKTsKCSAgcmlnaHQgPSBNYXRoLmZsb29yKE1hdGgubWluKGFycmF5Lmxlbmd0aCAtIDEsIHJpZ2h0KSk7CgkgIGlmICghKGxlZnQgPD0gayAmJiBrIDw9IHJpZ2h0KSkgcmV0dXJuIGFycmF5OwoJICBjb21wYXJlID0gY29tcGFyZSA9PT0gdW5kZWZpbmVkID8gYXNjZW5kaW5nRGVmaW5lZCA6IGNvbXBhcmVEZWZpbmVkKGNvbXBhcmUpOwoJICB3aGlsZSAocmlnaHQgPiBsZWZ0KSB7CgkgICAgaWYgKHJpZ2h0IC0gbGVmdCA+IDYwMCkgewoJICAgICAgY29uc3QgbiA9IHJpZ2h0IC0gbGVmdCArIDE7CgkgICAgICBjb25zdCBtID0gayAtIGxlZnQgKyAxOwoJICAgICAgY29uc3QgeiA9IE1hdGgubG9nKG4pOwoJICAgICAgY29uc3QgcyA9IDAuNSAqIE1hdGguZXhwKDIgKiB6IC8gMyk7CgkgICAgICBjb25zdCBzZCA9IDAuNSAqIE1hdGguc3FydCh6ICogcyAqIChuIC0gcykgLyBuKSAqIChtIC0gbiAvIDIgPCAwID8gLTEgOiAxKTsKCSAgICAgIGNvbnN0IG5ld0xlZnQgPSBNYXRoLm1heChsZWZ0LCBNYXRoLmZsb29yKGsgLSBtICogcyAvIG4gKyBzZCkpOwoJICAgICAgY29uc3QgbmV3UmlnaHQgPSBNYXRoLm1pbihyaWdodCwgTWF0aC5mbG9vcihrICsgKG4gLSBtKSAqIHMgLyBuICsgc2QpKTsKCSAgICAgIHF1aWNrc2VsZWN0KGFycmF5LCBrLCBuZXdMZWZ0LCBuZXdSaWdodCwgY29tcGFyZSk7CgkgICAgfQoJICAgIGNvbnN0IHQgPSBhcnJheVtrXTsKCSAgICBsZXQgaSA9IGxlZnQ7CgkgICAgbGV0IGogPSByaWdodDsKCSAgICBzd2FwKGFycmF5LCBsZWZ0LCBrKTsKCSAgICBpZiAoY29tcGFyZShhcnJheVtyaWdodF0sIHQpID4gMCkgc3dhcChhcnJheSwgbGVmdCwgcmlnaHQpOwoJICAgIHdoaWxlIChpIDwgaikgewoJICAgICAgc3dhcChhcnJheSwgaSwgaiksICsraSwgLS1qOwoJICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyYXlbaV0sIHQpIDwgMCkgKytpOwoJICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyYXlbal0sIHQpID4gMCkgLS1qOwoJICAgIH0KCSAgICBpZiAoY29tcGFyZShhcnJheVtsZWZ0XSwgdCkgPT09IDApIHN3YXAoYXJyYXksIGxlZnQsIGopO2Vsc2UgKytqLCBzd2FwKGFycmF5LCBqLCByaWdodCk7CgkgICAgaWYgKGogPD0gaykgbGVmdCA9IGogKyAxOwoJICAgIGlmIChrIDw9IGopIHJpZ2h0ID0gaiAtIDE7CgkgIH0KCSAgcmV0dXJuIGFycmF5OwoJfQoJZnVuY3Rpb24gc3dhcChhcnJheSwgaSwgaikgewoJICBjb25zdCB0ID0gYXJyYXlbaV07CgkgIGFycmF5W2ldID0gYXJyYXlbal07CgkgIGFycmF5W2pdID0gdDsKCX0KCglmdW5jdGlvbiBxdWFudGlsZSh2YWx1ZXMsIHAsIHZhbHVlb2YpIHsKCSAgdmFsdWVzID0gRmxvYXQ2NEFycmF5LmZyb20obnVtYmVycyh2YWx1ZXMpKTsKCSAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpIHx8IGlzTmFOKHAgPSArcCkpIHJldHVybjsKCSAgaWYgKHAgPD0gMCB8fCBuIDwgMikgcmV0dXJuIG1pbih2YWx1ZXMpOwoJICBpZiAocCA+PSAxKSByZXR1cm4gbWF4KHZhbHVlcyk7CgkgIHZhciBuLAoJICAgIGkgPSAobiAtIDEpICogcCwKCSAgICBpMCA9IE1hdGguZmxvb3IoaSksCgkgICAgdmFsdWUwID0gbWF4KHF1aWNrc2VsZWN0KHZhbHVlcywgaTApLnN1YmFycmF5KDAsIGkwICsgMSkpLAoJICAgIHZhbHVlMSA9IG1pbih2YWx1ZXMuc3ViYXJyYXkoaTAgKyAxKSk7CgkgIHJldHVybiB2YWx1ZTAgKyAodmFsdWUxIC0gdmFsdWUwKSAqIChpIC0gaTApOwoJfQoKCWZ1bmN0aW9uIG1lZGlhbih2YWx1ZXMsIHZhbHVlb2YpIHsKCSAgcmV0dXJuIHF1YW50aWxlKHZhbHVlcywgMC41KTsKCX0KCglmdW5jdGlvbiBUcmFuc2Zvcm0oaywgeCwgeSkgewoJICB0aGlzLmsgPSBrOwoJICB0aGlzLnggPSB4OwoJICB0aGlzLnkgPSB5OwoJfQoJVHJhbnNmb3JtLnByb3RvdHlwZSA9IHsKCSAgY29uc3RydWN0b3I6IFRyYW5zZm9ybSwKCSAgc2NhbGU6IGZ1bmN0aW9uIChrKSB7CgkgICAgcmV0dXJuIGsgPT09IDEgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmsgKiBrLCB0aGlzLngsIHRoaXMueSk7CgkgIH0sCgkgIHRyYW5zbGF0ZTogZnVuY3Rpb24gKHgsIHkpIHsKCSAgICByZXR1cm4geCA9PT0gMCAmIHkgPT09IDAgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmssIHRoaXMueCArIHRoaXMuayAqIHgsIHRoaXMueSArIHRoaXMuayAqIHkpOwoJICB9LAoJICBhcHBseTogZnVuY3Rpb24gKHBvaW50KSB7CgkgICAgcmV0dXJuIFtwb2ludFswXSAqIHRoaXMuayArIHRoaXMueCwgcG9pbnRbMV0gKiB0aGlzLmsgKyB0aGlzLnldOwoJICB9LAoJICBhcHBseVg6IGZ1bmN0aW9uICh4KSB7CgkgICAgcmV0dXJuIHggKiB0aGlzLmsgKyB0aGlzLng7CgkgIH0sCgkgIGFwcGx5WTogZnVuY3Rpb24gKHkpIHsKCSAgICByZXR1cm4geSAqIHRoaXMuayArIHRoaXMueTsKCSAgfSwKCSAgaW52ZXJ0OiBmdW5jdGlvbiAobG9jYXRpb24pIHsKCSAgICByZXR1cm4gWyhsb2NhdGlvblswXSAtIHRoaXMueCkgLyB0aGlzLmssIChsb2NhdGlvblsxXSAtIHRoaXMueSkgLyB0aGlzLmtdOwoJICB9LAoJICBpbnZlcnRYOiBmdW5jdGlvbiAoeCkgewoJICAgIHJldHVybiAoeCAtIHRoaXMueCkgLyB0aGlzLms7CgkgIH0sCgkgIGludmVydFk6IGZ1bmN0aW9uICh5KSB7CgkgICAgcmV0dXJuICh5IC0gdGhpcy55KSAvIHRoaXMuazsKCSAgfSwKCSAgcmVzY2FsZVg6IGZ1bmN0aW9uICh4KSB7CgkgICAgcmV0dXJuIHguY29weSgpLmRvbWFpbih4LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCwgdGhpcykubWFwKHguaW52ZXJ0LCB4KSk7CgkgIH0sCgkgIHJlc2NhbGVZOiBmdW5jdGlvbiAoeSkgewoJICAgIHJldHVybiB5LmNvcHkoKS5kb21haW4oeS5yYW5nZSgpLm1hcCh0aGlzLmludmVydFksIHRoaXMpLm1hcCh5LmludmVydCwgeSkpOwoJICB9LAoJICB0b1N0cmluZzogZnVuY3Rpb24gKCkgewoJICAgIHJldHVybiAidHJhbnNsYXRlKCIgKyB0aGlzLnggKyAiLCIgKyB0aGlzLnkgKyAiKSBzY2FsZSgiICsgdGhpcy5rICsgIikiOwoJICB9Cgl9OwoJVHJhbnNmb3JtLnByb3RvdHlwZTsKCgkvKgoJICBIVERNYXRoIFN0YXRpYyBDbGFzcyAtIE5vdCBpbnRlbmRlZCBmb3IgaW5zdGFudGlhdGlvbiEKCgkgIFZhcmlhYmxlczoKCSAgICBBID0gYW1vdW50CgkgICAgRCA9IGRlbGF5CgkgICAgViA9IHN1YmplY3RpdmUgdmFsdWUKCgkgICAgayA9IGRpc2NvdW50IGZhY3RvcgoKCSAgRXF1YXRpb25zOgoJICAgIFYgPSBBIC8gKDEgKyBrRCkKCSovCgljbGFzcyBIVERNYXRoIHsKCSAgc3RhdGljIGFkazJ2KGEsIGQsIGspIHsKCSAgICByZXR1cm4gYSAvICgxICsgayAqIGQpOwoJICB9CgkgIHN0YXRpYyBhZHYyayhhLCBkLCB2KSB7CgkgICAgcmV0dXJuIChhIC0gdikgLyAodiAqIGQpOwoJICB9Cgl9CgoJLy8gSW50ZXJuYWwgZGVwZW5kZW5jaWVzCgoJLyogZXNsaW50IG5vLXJlc3RyaWN0ZWQtZ2xvYmFsczogWyJvZmYiLCAic2VsZiJdICovCgoJc2VsZi5vbm1lc3NhZ2UgPSBldmVudCA9PiB7CgkgIGNvbnN0IHBhcmFtcyA9IHsKCSAgICBrOiB7CgkgICAgICB0eXBlOiAncmVhbCcsCgkgICAgICBsb3dlcjogMCwKCSAgICAgIHVwcGVyOiAxMDAKCSAgICB9LAoJICAgIGx1Y2U6IHsKCSAgICAgIHR5cGU6ICdyZWFsJywKCSAgICAgIGxvd2VyOiAwLAoJICAgICAgdXBwZXI6IDEwMAoJICAgIH0KCSAgfTsKCSAgY29uc3QgbG9nUG9zdCA9IChzdGF0ZSwgZGF0YSkgPT4gewoJICAgIGxldCBscCA9IDA7CgoJICAgIC8vIFByaW9ycwoJICAgIGNvbnN0IGtNZWFuID0gMjsKCSAgICBjb25zdCBrU2hhcGUgPSAzOwoJICAgIGxwICs9IGRpc3RyaWJ1dGlvbnNFeHBvcnRzLmdhbW1hKHN0YXRlLmssIGtTaGFwZSwga1NoYXBlIC8ga01lYW4pOwoJICAgIC8vIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy51bmlmKHN0YXRlLmssIDAsIDEwMCk7CgoJICAgIGNvbnN0IGx1Y2VNZWFuID0gMjsKCSAgICBjb25zdCBsdWNlU2hhcGUgPSAzOwoJICAgIGxwICs9IGRpc3RyaWJ1dGlvbnNFeHBvcnRzLmdhbW1hKHN0YXRlLmx1Y2UsIGx1Y2VTaGFwZSwgbHVjZVNoYXBlIC8gbHVjZU1lYW4pOwoJICAgIC8vIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy51bmlmKHN0YXRlLmx1Y2UsIDAsIDEwMCk7CgoJICAgIC8vIExpa2VsaWhvb2QKCSAgICBkYXRhLmZvckVhY2goY2hvaWNlID0+IHsKCSAgICAgIC8vIFZhbHVlcwoJICAgICAgY29uc3QgdnMgPSBIVERNYXRoLmFkazJ2KGNob2ljZS5hcywgY2hvaWNlLmRzLCBzdGF0ZS5rKTsKCSAgICAgIGNvbnN0IHZsID0gSFRETWF0aC5hZGsydihjaG9pY2UuYWwsIGNob2ljZS5kbCwgc3RhdGUuayk7CgoJICAgICAgLy8gQ2hvaWNlIG9mIHNvb25lciBvciBsYXRlciBpcyBzYW1wbGVkIGZyb20gYSBCZXJub3VsbGkgZGlzdHJpYnV0aW9uCgkgICAgICAvLyBMdWNlIGNob2ljZSBydWxlIGlzIHVzZWQgdG8gY29tcHV0ZSBwcm9iYWJpbGl0eSBvZiB3YWl0aW5nISAoMCA9IHNvb25lciwgMSA9IGxhdGVyKQoJICAgICAgY29uc3QgYmludmFsID0gMSAvICgxICsgTWF0aC5leHAoc3RhdGUubHVjZSAqICh2cyAtIHZsKSkpOwoKCSAgICAgIC8vIEFjdHVhbCByZXNwb25zZQoJICAgICAgY29uc3QgcmVzcG9uc2UgPSBjaG9pY2UucmVzcG9uc2UgPT09ICdmaXJzdCcgPyAwIDogMTsKCSAgICAgIGxwICs9IGRpc3RyaWJ1dGlvbnNFeHBvcnRzLmJlcm4ocmVzcG9uc2UsIGJpbnZhbCk7CgkgICAgfSk7CgkgICAgcmV0dXJuIGxwOwoJICB9OwoKCSAgLy8gSW5pdGlhbGl6aW5nIHRoZSBzYW1wbGVyCgkgIGNvbnN0IHNhbXBsZXIgPSBuZXcgbWNtY0V4cG9ydHMuQW13Z1NhbXBsZXIocGFyYW1zLCBsb2dQb3N0LCBldmVudC5kYXRhKTsKCSAgLy8gQnVybmluZyBzb21lIHNhbXBsZXMgdG8gdGhlIE1DTUMgZ29kcyBhbmQgc2FtcGxpbmcgNTAwMCBkcmF3cwoJICBzYW1wbGVyLmJ1cm4oMTAwMCk7CgkgIGNvbnN0IHNhbXBsZXMgPSBzYW1wbGVyLnNhbXBsZSg1MDAwKTsKCgkgIC8vIEV4dHJhY3Qgc3VtbWFyeSBzdGF0cwoJICBjb25zdCByZXN1bHRzID0gewoJICAgIGs6IG1lZGlhbihzYW1wbGVzLmspLAoJICAgIGx1Y2U6IG1lZGlhbihzYW1wbGVzLmx1Y2UpCgkgIH07CgkgIHNlbGYucG9zdE1lc3NhZ2UoewoJICAgIHJlc3VsdHM6IHJlc3VsdHMsCgkgICAgc2FtcGxlczogc2FtcGxlcwoJICB9KTsKCX07Cgp9KSgpOwovLyMgc291cmNlTWFwcGluZ1VSTD1odGQtZml0LXdvcmtlci5qcy5tYXAKCg==",mp="data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRkLWZpdC13b3JrZXIuanMiLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9iYXllcy5qcy9kaXN0cmlidXRpb25zLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2JheWVzLmpzL21jbWMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL2FzY2VuZGluZy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvbnVtYmVyLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9zb3J0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9tYXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL21pbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9kMy1hcnJheS9zcmMvcXVpY2tzZWxlY3QuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtYXJyYXkvc3JjL3F1YW50aWxlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2QzLWFycmF5L3NyYy9tZWRpYW4uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZDMtem9vbS9zcmMvdHJhbnNmb3JtLmpzIiwiLi4vZGlzY291bnRhYmxlLW1hdGgvc3JjL2h0ZC1tYXRoLmpzIiwiLi4vZGlzY291bnRhYmxlLW1hdGgvc3JjL2luZGV4LmpzIiwic3JjL2NvbXBvbmVudHMvaHRkLWZpdC13b3JrZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cblxuLy8gQSBudW1iZXIgb2YgbG9nIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb25zIChQREYpLiBOYW1pbmcgYW5kIHBhcmFtZXRlcml6YXRpb25cbi8vIHNob3VsZCBtYXRjaCBSJ3MsIGV4Y2VwdCBmb3IgdGhhdCBhbGwgZnVuY3Rpb25zIHJlc2lkZSBpbiBhbiBsZCBvYmplY3QgKFxuLy8gYXMgaW4gXCJsb2cgZGVuc2l0eVwiKSwgc28gdG8gZ2V0IGEgbm9ybWFsIGxvZyBkZW5zaXR5IHlvdSB3b3VsZCB3cml0ZVxuLy8gbGQubm9ybSguLi4pLlxuLy8gTW9zdCBvZiB0aGUgY29kZSBiZWxvdyBpcyBkaXJlY3RseSB0YWtlbiBmcm9tIHRoZSBncmVhdCBKc3RhdCBwcm9qZWN0XG4vLyAoaHR0cHM6Ly9naXRodWIuY29tL2pzdGF0Lykgd2hpY2ggaW5jbHVkZXMgUERGIGZvciBtYW55IGNvbW1vbiBwcm9iYWJpbGl0eVxuLy8gZGlzdHJpYnV0aW9ucy4gV2hhdCBJIGhhdmUgZG9uZSBpcyBvbmx5IHRvIGNvbnZlcnQgdGhlc2UgdG8gbG9nIFBERnMuXG5cbi8qXG5PcmlnaW5hbCB3b3JrIENvcHlyaWdodCAoYykgMjAxMyBqU3RhdFxuTW9kaWZpZWQgd29yayBDb3B5cmlnaHQgKGMpIDIwMTUgUmFzbXVzIELDpcOldGggXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cblRIRSBTT0ZUV0FSRS5cblxuKi9cblxuXG4vLyBUaGlzIGJvaWxlciBwbGF0ZSBjb2RlIGhlcmUgaXMgdGFrZW4gZnJvbTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS91bWRqcy91bWQvYmxvYi9tYXN0ZXIvdGVtcGxhdGVzL3JldHVybkV4cG9ydHMuanNcbi8vIEl0IHNob3VsZCBtYWtlIHNodXJlIHRoYXQgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBib3RoIGluIHRoZSBicm93c2VyLFxuLy8gTm9kZSwgYW5kIGJ5IHVzaW5nIHRoZSBBc3luY2hyb25vdXMgTW9kdWxlIERlZmluaXRpb24gc3RhbmRhcmQuXG4vLyBJZiB0aGlzIG1vZHVsZSBpcyBsb2FkZWQgaW4gdGhlIGJyb3dzZXIgaXQgd2lsbCBjcmVhdGVkIHRoZSBnbG9iYWxcbi8vIG9iamVjdCBsZCAuXG4oZnVuY3Rpb24gKHJvb3QsIGZhY3RvcnkpIHtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cbiAgICAgICAgZGVmaW5lKFtdLCBmYWN0b3J5KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIC8vIE5vZGUuIERvZXMgbm90IHdvcmsgd2l0aCBzdHJpY3QgQ29tbW9uSlMsIGJ1dFxuICAgICAgICAvLyBvbmx5IENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cyxcbiAgICAgICAgLy8gbGlrZSBOb2RlLlxuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHMgKHJvb3QgaXMgd2luZG93KVxuICAgICAgICByb290LmxkID0gZmFjdG9yeSgpO1xuICB9XG59KHRoaXMsIGZ1bmN0aW9uKCkge1xuICAvLyBPYmplY3QgdG8gaG9sZCB0aGUgZnVuY3Rpb25zIHRvIGJlIGV4cG9ydGVkLlxuICB2YXIgbGQgID0ge307XG4gIFxuICAvLy8vLy8vLy8vIEhlbHBlciBmdW5jdGlvbnMgLy8vLy8vLy8vL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgdmFyIGxnYW1tYSA9IGZ1bmN0aW9uKHgpIHtcbiAgICB2YXIgaiA9IDA7XG4gICAgdmFyIGNvZiA9IFtcbiAgICAgIDc2LjE4MDA5MTcyOTQ3MTQ2LCAtODYuNTA1MzIwMzI5NDE2NzcsIDI0LjAxNDA5ODI0MDgzMDkxLFxuICAgICAgLTEuMjMxNzM5NTcyNDUwMTU1LCAwLjEyMDg2NTA5NzM4NjYxNzllLTIsIC0wLjUzOTUyMzkzODQ5NTNlLTVcbiAgICBdO1xuICAgIHZhciBzZXIgPSAxLjAwMDAwMDAwMDE5MDAxNTtcbiAgICB2YXIgeHgsIHksIHRtcDtcbiAgICB0bXAgPSAoeSA9IHh4ID0geCkgKyA1LjU7XG4gICAgdG1wIC09ICh4eCArIDAuNSkgKiBsb2codG1wKTtcbiAgICBmb3IgKDsgaiA8IDY7IGorKylcbiAgICAgIHNlciArPSBjb2Zbal0gLyArK3k7XG4gICAgcmV0dXJuIGxvZygyLjUwNjYyODI3NDYzMTAwMDUgKiBzZXIgLyB4eCkgLSB0bXA7XG4gIH07XG4gIGxkLmxnYW1tYSA9IGxnYW1tYTtcbiAgXG4gIHZhciBsZmFjdG9yaWFsID0gZnVuY3Rpb24obikge1xuICAgIHJldHVybiBuIDwgMCA/IE5hTiA6IGxnYW1tYShuICsgMSk7XG4gIH07XG4gIGxkLmxmYWN0b3JpYWwgPSBsZmFjdG9yaWFsO1xuICBcbiAgdmFyIGxjaG9vc2UgPSBmdW5jdGlvbihuLCBrKXtcbiAgICByZXR1cm4gbGZhY3RvcmlhbChuKSAtIGxmYWN0b3JpYWwoaykgLSBsZmFjdG9yaWFsKG4gLSBrKTtcbiAgfTtcbiAgbGQubGNob29zZSA9IGxjaG9vc2U7XG4gIFxuICB2YXIgbGJldGEgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGxnYW1tYShhKSArIGxnYW1tYShiKSAtIGxnYW1tYShhICsgYik7XG4gIH07XG4gIGxkLmxiZXRhID0gbGJldGE7XG4gIFxuICB2YXIgbG9nICA9IE1hdGgubG9nO1xuICB2YXIgZXhwICA9IE1hdGguZXhwO1xuICB2YXIgYWJzICA9IE1hdGguYWJzO1xuICB2YXIgcG93ICA9IE1hdGgucG93O1xuICB2YXIgc3FydCA9IE1hdGguc3FydDtcbiAgdmFyIHBpICAgPSBNYXRoLlBJO1xuICBcbiAgLy8vLy8vLy8vLyBDb250aW5vdXMgZGlzdHJpYnV0aW9ucyAvLy8vLy8vLy8vXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgbGQuYmV0YSA9IGZ1bmN0aW9uKHgsIHNoYXBlMSwgc2hhcGUyKSB7XG4gICAgaWYgKHggPiAxIHx8IHggPCAwKSB7XG4gICAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfVxuICAgIGlmKHNoYXBlMSA9PT0gMSAmJiBzaGFwZTIgPT09IDEpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKHNoYXBlMSAtIDEpICogbG9nKHgpICsgKHNoYXBlMiAtIDEpICogbG9nKDEgLSB4KSAtIGxiZXRhKHNoYXBlMSwgc2hhcGUyKTsgIFxuICAgIH1cbiAgfTtcbiAgXG4gIGxkLmNhdWNoeSA9IGZ1bmN0aW9uKHgsIGxvY2F0aW9uLCBzY2FsZSkge1xuICAgIHJldHVybiBsb2coc2NhbGUpIC0gbG9nKHBvdyh4IC0gbG9jYXRpb24sIDIpICsgcG93KHNjYWxlLCAyKSkgIC0gbG9nKHBpKTtcbiAgfTtcbiAgXG4gIGxkLm5vcm0gPSBmdW5jdGlvbih4LCBtZWFuLCBzZCkge1xuICAgICAgcmV0dXJuIC0wLjUgKiBsb2coMiAqIHBpKSAtbG9nKHNkKSAtIHBvdyh4IC0gbWVhbiwgMikgLyAoMiAqIHNkICogc2QpO1xuICB9O1xuXG4gIC8vIEEgYml2YXJpYXRlIE5vcm1hbCBkaXN0cmlidXRpb24gcGFyYW1ldGVyaXplZCBieSBhcnJheXMgb2YgdHdvIG1lYW5zIGFuZCBTRHMsIGFuZCBcbiAgLy8gdGhlIGNvcnJlbGF0aW9uLlxuICBsZC5iaXZhcm5vcm0gPSBmdW5jdGlvbih4LCBtZWFuLCBzZCwgY29ycikge1xuICAgIHZhciB6ID0gcG93KHhbMF0gLSBtZWFuWzBdLCAyKSAvIHBvdyhzZFswXSwgMikgK1xuICAgICAgICAgICAgcG93KHhbMV0gLSBtZWFuWzFdLCAyKSAvIHBvdyhzZFsxXSwgMikgLSBcbiAgICAgICAgICAgICgyICogY29yciAqICh4WzBdIC0gbWVhblswXSkgKiAoeFsxXSAtIG1lYW5bMV0pKSAvIChzZFswXSAqIHNkWzFdKTtcbiAgICB2YXIgbm9ybWFsaXppbmdfZmFjdG9yID0gLSggbG9nKDIpICsgbG9nKHBpKSArIGxvZyhzZFswXSkgKyBsb2coc2RbMV0pICsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNSAqIGxvZygxIC0gcG93KGNvcnIsIDIpKSApOyBcbiAgICB2YXIgYml2YXJfbG9nX2RlbnMgPSBub3JtYWxpemluZ19mYWN0b3IgLSB6IC8gKDIgKiAoMSAtIHBvdyhjb3JyLCAyKSApICk7IFxuICAgIHJldHVybiBiaXZhcl9sb2dfZGVucztcbiAgfTtcbiAgXG5cbiAgbGQubGFwbGFjZSA9IGZ1bmN0aW9uKHgsIGxvY2F0aW9uLCBzY2FsZSkge1xuICAgIHJldHVybiAoLWFicyh4IC0gbG9jYXRpb24pL3NjYWxlKSAtIGxvZygyICogc2NhbGUpO1xuICB9O1xuICBcbiAgbGQuZGV4cCA9IGxkLmxhcGxhY2U7XG4gIFxuICBsZC5nYW1tYSA9IGZ1bmN0aW9uKHgsIHNoYXBlLCByYXRlKSB7XG4gICAgdmFyIHNjYWxlID0gMSAvIHJhdGU7XG4gICAgaWYgKHggPCAwKSB7XG4gICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgIH1cbiAgICBpZigoeCA9PT0gMCAmJiBzaGFwZSA9PT0gMSkgKSB7XG4gICAgICByZXR1cm4gLWxvZyhzY2FsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAoc2hhcGUgLSAxKSAqIGxvZyh4KSAtIHggLyBzY2FsZSAtIGxnYW1tYShzaGFwZSkgLSBzaGFwZSAqIGxvZyhzY2FsZSk7XG4gICAgfVxuICB9O1xuICBcbiAgbGQuaW52Z2FtbWEgPSBmdW5jdGlvbih4LCBzaGFwZSwgc2NhbGUpIHtcbiAgICAgIGlmICh4IDw9IDApIHtcbiAgICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAtKHNoYXBlICsgMSkgKiBsb2coeCkgLSBzY2FsZSAvIHggLSBsZ2FtbWEoc2hhcGUpICsgc2hhcGUgKiBsb2coc2NhbGUpO1xuICAgIH07XG4gIFxuICBsZC5sbm9ybSA9ICBmdW5jdGlvbih4LCBtZWFubG9nLCBzZGxvZykge1xuICAgIGlmICh4IDw9IDApIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfVxuICAgIHJldHVybiAtbG9nKHgpIC0gMC41ICogbG9nKDIgKiBwaSkgLSBsb2coc2Rsb2cpIC0gXG4gICAgICAgICAgICBwb3cobG9nKHgpIC0gbWVhbmxvZywgMikgLyAoMiAqIHNkbG9nICogc2Rsb2cpO1xuICB9O1xuICBcbiAgbGQucGFyZXRvID0gZnVuY3Rpb24oeCwgc2NhbGUsIHNoYXBlKSB7XG4gICAgaWYgKHggPCBzY2FsZSkge1xuICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICB9XG4gICAgcmV0dXJuIGxvZyhzaGFwZSkgKyBzaGFwZSAqIGxvZyhzY2FsZSkgLSAoc2hhcGUgKyAxKSAqIGxvZyh4KTtcbiAgfTtcbiAgXG4gIGxkLnQgID0gIGZ1bmN0aW9uKHgsIGxvY2F0aW9uLCBzY2FsZSwgZGYpIHtcbiAgICBkZiA9IGRmID4gMWUxMDAgPyAxZTEwMCA6IGRmO1xuICAgIHJldHVybiBsZ2FtbWEoKGRmICsgMSkvMikgLSBsZ2FtbWEoZGYvMikgLSBsb2coc3FydChwaSAqIGRmKSAqIHNjYWxlKSArXG4gICAgICAgICAgIGxvZyhwb3coMSArICgxL2RmKSAqIHBvdygoeCAtIGxvY2F0aW9uKS9zY2FsZSwgMiksIC0oZGYgKyAxKS8yKSk7XG4gIH07XG4gIFxuICAvLyBUaGlzIGlzIGEgZGlyZWN0IGphdmFzY3JpcHQgdHJhbnNsYXRpb24gb2YgdGhlIFIgY29kZSB1c2VkIHRvIGV2YWx1YXRlXG4gIC8vIHRoZSBsb2cgZGVuc2l0eSBvZiBhIHdlaWJ1bGwgZGlzdHJpYnV0aW9uOiBcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3djaC9yLXNvdXJjZS9ibG9iL2IxNTZlM2E3MTE5NjdmNTgxMzFlMjNjMWIxZGMxZWE5MGUyZjBjNDMvc3JjL25tYXRoL2R3ZWlidWxsLmNcbiAgbGQud2VpYnVsbCA9IGZ1bmN0aW9uKHgsIHNoYXBlLCBzY2FsZSkge1xuICAgIGlmICh4IDwgMCkgcmV0dXJuIC1JbmZpbml0eTtcbiAgICBpZih4ID09PSAwICYmIHNoYXBlIDwgMSkgcmV0dXJuIEluZmluaXR5O1xuICAgIHZhciB0bXAxID0gcG93KHggLyBzY2FsZSwgc2hhcGUgLSAxKTtcbiAgICB2YXIgdG1wMiA9IHRtcDEgKiAoeCAvIHNjYWxlKTtcblx0ICByZXR1cm4gLXRtcDIgKyBsb2coc2hhcGUgKiB0bXAxIC8gc2NhbGUpO1xuICB9O1xuICBcbiAgLy8gVGhpcyBpcyBhIGRpcmVjdCBqYXZhc2NyaXB0IHRyYW5zbGF0aW9uIG9mIHRoZSBSIGNvZGUgdXNlZCB0byBldmFsdWF0ZVxuICAvLyB0aGUgbG9nIGRlbnNpdHkgb2YgYSBsb2dpc3RpYyBkaXN0cmlidXRpb246IFxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vd2NoL3Itc291cmNlL2Jsb2IvYjE1NmUzYTcxMTk2N2Y1ODEzMWUyM2MxYjFkYzFlYTkwZTJmMGM0My9zcmMvbm1hdGgvZGxvZ2lzLmNcbiAgbGQubG9naXMgPSBmdW5jdGlvbih4LCBsb2NhdGlvbiwgc2NhbGUpIHtcbiAgICB4ID0gYWJzKCh4IC0gbG9jYXRpb24pIC8gc2NhbGUpO1xuICAgIHZhciBlID0gZXhwKC14KTtcbiAgICB2YXIgZiA9IDEuMCArIGU7XG4gICAgcmV0dXJuIC0oeCArIGxvZyhzY2FsZSAqIGYgKiBmKSk7ICAgIFxuICB9O1xuXG4gIGxkLmRpcmljaGxldCA9IGZ1bmN0aW9uKHgsIGFscGhhKSB7XG4gICAgdmFyIHN1bV9hbHBoYSA9IDA7XG4gICAgdmFyIHN1bV9sZ2FtbWFfYWxwaGEgPSAwO1xuICAgIHZhciBzdW1fYWxwaGFfc3ViXzFfbG9nX3ggPSAwO1xuICAgIHZhciBuID0gYWxwaGEubGVuZ3RoO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgIHN1bV9hbHBoYSArPSBhbHBoYVtpXTtcbiAgICAgIHN1bV9sZ2FtbWFfYWxwaGEgKz0gbGdhbW1hKGFscGhhW2ldKTtcbiAgICAgIHN1bV9hbHBoYV9zdWJfMV9sb2dfeCArPSAoYWxwaGFbaV0gLSAxKSAqIGxvZyh4W2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIGxnYW1tYShzdW1fYWxwaGEpIC0gc3VtX2xnYW1tYV9hbHBoYSArIHN1bV9hbHBoYV9zdWJfMV9sb2dfeDtcbiAgfTtcbiAgIFxuICAgIFxuICBsZC5leHAgPSBmdW5jdGlvbih4LCByYXRlKSB7XG4gICAgICByZXR1cm4geCA8IDAgPyAtSW5maW5pdHkgOiBsb2cocmF0ZSkgLXJhdGUgKiB4O1xuICB9O1xuICBcbiAgbGQudW5pZiA9IGZ1bmN0aW9uKHgsIG1pbiwgbWF4KSB7XG4gICAgICByZXR1cm4gKHggPCBtaW4gfHwgeCA+IG1heCkgPyAtSW5maW5pdHkgOiBsb2coMSAvIChtYXggLSBtaW4pKTtcbiAgfTtcbiAgXG4gIC8vLy8vLy8vLy8gRGlzY3JldGUgZGlzdHJpYnV0aW9ucyAvLy8vLy8vLy8vXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gIFxuICBsZC5iZXJuID0gZnVuY3Rpb24oeCwgcHJvYikge1xuICAgICAgcmV0dXJuICEoeCA9PT0gMCB8fCB4ID09PSAxKSA/IC1JbmZpbml0eSA6IGxvZyh4ICogcHJvYiArICgxIC0geCkgKiAoMSAtIHByb2IpKTtcbiAgfTtcbiAgXG4gIGxkLmNhdCA9IGZ1bmN0aW9uKHgsIHByb2JzKSB7XG4gICAgaWYoeCA8IDEgfHwgeCA+IHByb2JzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGxvZyggcHJvYnNbeCAtIDFdICk7XG4gICAgfVxuICB9O1xuICBcbiAgbGQuYmlub20gPSBmdW5jdGlvbih4LCBzaXplLCBwcm9iKSB7XG4gICAgaWYoeCA+IHNpemUgfHwgeCA8IDApIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfVxuICAgIGlmKHByb2IgPT09IDAgfHwgcHJvYiA9PT0gMSkge1xuICAgICAgcmV0dXJuIChzaXplICogcHJvYikgPT09IHggPyAwIDogLUluZmluaXR5O1xuICAgIH1cbiAgICByZXR1cm4gbGNob29zZShzaXplLCB4KSArIHggKiBsb2cocHJvYikgKyAoc2l6ZSAtIHgpICogbG9nKDEgLSBwcm9iKTtcbiAgfTtcbiAgXG4gIHZhciBtdWx0aW5vbSA9IGZ1bmN0aW9uKHgsIHByb2JzKSB7XG4gICAgdmFyIG4gPSB4Lmxlbmd0aDtcbiAgICB2YXIgc2l6ZSA9IDA7XG4gICAgdmFyIHRtcF90ZXJtID0gMDtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICBpZihwcm9ic1tpXSA9PT0gMCkge1xuICAgICAgICBpZih4W2ldICE9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTsgIFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaXplICs9IHhbaV07XG4gICAgICAgIHRtcF90ZXJtICs9IHhbaV0gKiBsb2cocHJvYnNbaV0pIC0gbGdhbW1hKHhbaV0gKyAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxnYW1tYShzaXplICsgMSkgKyB0bXBfdGVybSA7XG4gIH07XG4gIFxuICBsZC5uYmlub20gPSBmdW5jdGlvbih4LCBzaXplLCBwcm9iKSB7XG4gICAgaWYoeCA8IDApIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfVxuICAgIHJldHVybiBsY2hvb3NlKHggKyBzaXplIC0gMSwgc2l6ZSAtIDEpICsgeCAqIGxvZygxIC0gcHJvYikgKyBzaXplICogbG9nKHByb2IpO1xuICB9O1xuICBcbiAgbGQuaHlwZXIgPSBmdW5jdGlvbih4LCBtLCBuLCBrKSB7XG4gICAgaWYoeCA8IDAgfHwgeCA+IGspIHtcbiAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgfSBlbHNlIHtcbiAgICByZXR1cm4gbGNob29zZShtLCB4KSArIGxjaG9vc2Uobiwgay14KSAtIGxjaG9vc2UobStuLCBrKTtcbiAgICB9XG4gIH07XG4gIFxuICBsZC5wb2lzID0gZnVuY3Rpb24oeCwgbGFtYmRhKSB7XG4gICAgICByZXR1cm4geCA8IDAgPyAtSW5maW5pdHkgOiBsb2cobGFtYmRhKSAqIHggLSBsYW1iZGEgLSBsZmFjdG9yaWFsKHgpO1xuICB9O1xuICBcbiAgcmV0dXJuIGxkO1xufSkpOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vLyBUaGlzIGJvaWxlciBwbGF0ZSBjb2RlIGhlcmUgaXMgdGFrZW4gZnJvbTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS91bWRqcy91bWQvYmxvYi9tYXN0ZXIvdGVtcGxhdGVzL3JldHVybkV4cG9ydHMuanNcbi8vIEl0IHNob3VsZCBtYWtlIHNodXJlIHRoYXQgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCBib3RoIGluIHRoZSBicm93c2VyLFxuLy8gTm9kZSwgYW5kIGJ5IHVzaW5nIHRoZSBBc3luY2hyb25vdXMgTW9kdWxlIERlZmluaXRpb24gc3RhbmRhcmQuXG4vLyBJZiB0aGlzIG1vZHVsZSBpcyBsb2FkZWQgaW4gdGhlIGJyb3dzZXIgaXQgd2lsbCBjcmVhdGVkIHRoZSBnbG9iYWxcbi8vIG9iamVjdCBtY21jIC5cbihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgLy8gQU1ELiBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgbW9kdWxlLlxuICAgICAgICBkZWZpbmUoW10sIGZhY3RvcnkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0XG4gICAgICAgIC8vIG9ubHkgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgdGhhdCBzdXBwb3J0IG1vZHVsZS5leHBvcnRzLFxuICAgICAgICAvLyBsaWtlIE5vZGUuXG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFscyAocm9vdCBpcyB3aW5kb3cpXG4gICAgICAgIHJvb3QubWNtYyA9IGZhY3RvcnkoKTtcbiAgfVxufSh0aGlzLCBmdW5jdGlvbigpe1xuXG4vLy8gVGhlIGFjdHVhbCBtb2R1bGUgY29kZSBzdGFydHMgaGVyZSAvLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgXG4gIFxuICAvLy8vLy8vLy8vIEhlbHBlciBGdW5jdGlvbnMgLy8vLy8vLy8vL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgLyoqIFJldHVybnMgYSByYW5kb20gcmVhbCBudW1iZXIgYmV0d2VlbiBtaW4gYW5kIG1heCAqL1xuICB2YXIgcnVuaWYgPSBmdW5jdGlvbihtaW4sIG1heCkge1xuICAgIHJldHVybiBNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbikgKyBtaW47XG4gIH07XG4gIFxuICAvKiogUmV0dXJucyBhIHJhbmRvbSBpbnRlZ2VyIGJldHdlZW4gbWluIGFuZCBtYXggKi9cbiAgdmFyIHJ1bmlmX2Rpc2NyZXRlID0gZnVuY3Rpb24obWluLCBtYXgpIHtcbiAgICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKG1heCAtIG1pbiArIDEpKSArIG1pbjtcbiAgfTtcbiAgXG4gIC8qKiBSZXR1cm5zIGEgcmFuZG9tIHJlYWwgbnVtYmVyIGZyb20gYSBub3JtYWwgZGlzdHJpYmJ1dGlvbiBkZWZpbmVkXG4gICAqICBieSBtZWFuIGFuZCBzZC4gXG4gICAqICBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2pzdGF0L2pzdGF0L2Jsb2IvbWFzdGVyL3NyYy9zcGVjaWFsLmpzICovXG4gIHZhciBybm9ybSA9IGZ1bmN0aW9uKG1lYW4sIHNkKSB7XG4gICAgdmFyIHUsIHYsIHgsIHksIHE7XG4gICAgZG8ge1xuICAgICAgdSA9IE1hdGgucmFuZG9tKCk7XG4gICAgICB2ID0gMS43MTU2ICogKE1hdGgucmFuZG9tKCkgLSAwLjUpO1xuICAgICAgeCA9IHUgLSAwLjQ0OTg3MTtcbiAgICAgIHkgPSBNYXRoLmFicyh2KSArIDAuMzg2NTk1O1xuICAgICAgcSA9IHggKiB4ICsgeSAqICgwLjE5NjAwICogeSAtIDAuMjU0NzIgKiB4KTtcbiAgICB9IHdoaWxlIChxID4gMC4yNzU5NyAmJiAocSA+IDAuMjc4NDYgfHwgdiAqIHYgPiAtNCAqIE1hdGgubG9nKHUpICogdSAqIHUpKTtcbiAgICBcbiAgICByZXR1cm4gKHYgLyB1KSAqIHNkICsgbWVhbjtcbiAgfTtcbiAgXG4gIFxuICAvKiogUmV0dXJucyBhIGRlZXAgY2xvbmUgb2Ygc3JjLCBzb3J0IG9mLi4uIEl0IG9ubHkgY29waWVzIGEgbGltaXRlZFxuICAgKiBudW1iZXIgb2YgdHlwZXMgYW5kLCBmb3IgZXhhbXBsZSwgZnVuY3Rpb24gYXJlIG5vdCBjb3BpZWQuIFxuICAgKiBGcm9tIGh0dHA6Ly9kYXZpZHdhbHNoLm5hbWUvamF2YXNjcmlwdC1jbG9uZVxuICAgKi9cbiAgdmFyIGRlZXBfY2xvbmUgPSBmdW5jdGlvbihzcmMpIHtcbiAgXHRmdW5jdGlvbiBtaXhpbihkZXN0LCBzb3VyY2UsIGNvcHlGdW5jKSB7XG4gIFx0XHR2YXIgbmFtZSwgcywgaSwgZW1wdHkgPSB7fTtcbiAgXHRcdGZvcihuYW1lIGluIHNvdXJjZSl7XG4gIFx0XHRcdC8vIHRoZSAoIShuYW1lIGluIGVtcHR5KSB8fCBlbXB0eVtuYW1lXSAhPT0gcykgY29uZGl0aW9uIGF2b2lkcyBjb3B5aW5nIHByb3BlcnRpZXMgaW4gXCJzb3VyY2VcIlxuICBcdFx0XHQvLyBpbmhlcml0ZWQgZnJvbSBPYmplY3QucHJvdG90eXBlLlx0IEZvciBleGFtcGxlLCBpZiBkZXN0IGhhcyBhIGN1c3RvbSB0b1N0cmluZygpIG1ldGhvZCxcbiAgXHRcdFx0Ly8gZG9uJ3Qgb3ZlcndyaXRlIGl0IHdpdGggdGhlIHRvU3RyaW5nKCkgbWV0aG9kIHRoYXQgc291cmNlIGluaGVyaXRlZCBmcm9tIE9iamVjdC5wcm90b3R5cGVcbiAgXHRcdFx0cyA9IHNvdXJjZVtuYW1lXTtcbiAgXHRcdFx0aWYoIShuYW1lIGluIGRlc3QpIHx8IChkZXN0W25hbWVdICE9PSBzICYmICghKG5hbWUgaW4gZW1wdHkpIHx8IGVtcHR5W25hbWVdICE9PSBzKSkpe1xuICBcdFx0XHRcdGRlc3RbbmFtZV0gPSBjb3B5RnVuYyA/IGNvcHlGdW5jKHMpIDogcztcbiAgXHRcdFx0fVxuICBcdFx0fVxuICBcdFx0cmV0dXJuIGRlc3Q7XG4gIFx0fVxuICBcdGlmKCFzcmMgfHwgdHlwZW9mIHNyYyAhPSBcIm9iamVjdFwiIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzcmMpID09PSBcIltvYmplY3QgRnVuY3Rpb25dXCIpe1xuICBcdFx0Ly8gbnVsbCwgdW5kZWZpbmVkLCBhbnkgbm9uLW9iamVjdCwgb3IgZnVuY3Rpb25cbiAgXHRcdHJldHVybiBzcmM7XHQvLyBhbnl0aGluZ1xuICBcdH1cbiAgXHRpZihzcmMubm9kZVR5cGUgJiYgXCJjbG9uZU5vZGVcIiBpbiBzcmMpe1xuICBcdFx0Ly8gRE9NIE5vZGVcbiAgXHRcdHJldHVybiBzcmMuY2xvbmVOb2RlKHRydWUpOyAvLyBOb2RlXG4gIFx0fVxuICBcdGlmKHNyYyBpbnN0YW5jZW9mIERhdGUpe1xuICBcdFx0Ly8gRGF0ZVxuICBcdFx0cmV0dXJuIG5ldyBEYXRlKHNyYy5nZXRUaW1lKCkpO1x0Ly8gRGF0ZVxuICBcdH1cbiAgXHRpZihzcmMgaW5zdGFuY2VvZiBSZWdFeHApe1xuICBcdFx0Ly8gUmVnRXhwXG4gIFx0XHRyZXR1cm4gbmV3IFJlZ0V4cChzcmMpOyAgIC8vIFJlZ0V4cFxuICBcdH1cbiAgXHR2YXIgciwgaSwgbDtcbiAgXHRpZihzcmMgaW5zdGFuY2VvZiBBcnJheSl7XG4gIFx0XHQvLyBhcnJheVxuICBcdFx0ciA9IFtdO1xuICBcdFx0Zm9yKGkgPSAwLCBsID0gc3JjLmxlbmd0aDsgaSA8IGw7ICsraSl7XG4gIFx0XHRcdGlmKGkgaW4gc3JjKXtcbiAgXHRcdFx0XHRyLnB1c2goZGVlcF9jbG9uZShzcmNbaV0pKTtcbiAgXHRcdFx0fVxuICBcdFx0fVxuICBcdH0gZWxzZSB7XG4gIFx0XHQvLyBnZW5lcmljIG9iamVjdHNcbiAgXHRcdHIgPSBzcmMuY29uc3RydWN0b3IgPyBuZXcgc3JjLmNvbnN0cnVjdG9yKCkgOiB7fTtcbiAgXHR9XG4gIFx0cmV0dXJuIG1peGluKHIsIHNyYywgZGVlcF9jbG9uZSk7XG4gIH07XG4gIFxuICAvKiogU3BlY2lhbGl6ZWQgY2xvbmUgZnVuY3Rpb24gdGhhdCBvbmx5IGNsb25lcyBzY2FsYXJzIGFuZCBuZXN0ZWQgYXJyYXlzIHdoZXJlXG4gICAqIGVhY2ggYXJyYXkgZWl0aGVyIGNvbnNpc3RzIG9mIGFsbCBhcnJheXMgb3IgYWxsIG51bWJlcnMuIFRoaXMgZnVuY3Rpb25cbiAgICogaXMgbWVhbnQgYXMgYSBmYXN0IHdheSBvZiBjbG9uaW5nIHBhcmFtZXRlciBkcmF3cyB3aXRoaW4gdGhlIG1jbWMgc2FtcGxpbmdcbiAgICogbG9vcC5cbiAgICovXG4gIHZhciBjbG9uZV9wYXJhbV9kcmF3ID0gZnVuY3Rpb24oeCkge1xuICAgIGlmKEFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICAgIGlmKEFycmF5LmlzQXJyYXkoeFswXSkpIHtcbiAgICAgICAgLy8geCBpcyBhbiBhcnJheSBvZiBhcnJheXMgc28gd2UgbmVlZCB0byBjbG9uZSBpdCByZWN1cnNpdmVseVxuICAgICAgICB2YXIgeF9jb3B5ID0gW107XG4gICAgICAgIGZvcih2YXIgaSA9IDAsIGxlbmd0aCA9IHgubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB4X2NvcHkucHVzaChjbG9uZV9wYXJhbV9kcmF3KHhbaV0pKTtcbiAgICAgICAgfSBcbiAgICAgICAgcmV0dXJuIHhfY29weTtcbiAgICAgIH0gZWxzZSB7IC8vIFdlJ2xsIGFzc3VtZSB4IGlzIGEgYXJyYXlzIG9mIHNjYWxhcnNcbiAgICAgICAgcmV0dXJuIHguc2xpY2UoMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHsgLy8gV2UnbGwgYXNzdW1lIHggaXMgYSBzY2FsYXJcbiAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfTtcbiAgXG4gIC8qKiBSZXR1cm5zIHRydWUgaWYgb2JqZWN0IGlzIGEgbnVtYmVyLlxuICAgKi9cbiAgdmFyIGlzX251bWJlciA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT0gXCJudW1iZXJcIiB8fCAodHlwZW9mIG9iamVjdCA9PSBcIm9iamVjdFwiICYmIG9iamVjdC5jb25zdHJ1Y3RvciA9PT0gTnVtYmVyKTtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhIChwb3NzaWJseSBtdWx0aWRpbWVuc2lvbmFsL25lc3RlZCkgYXJyYXkuXG4gICAqIEBwYXJhbSBkaW0gLSBBbiBhcnJheSBnaXZpbmcgdGhlIGRpbWVuc2lvbiBvZiB0aGUgYXJyYXkuIEZvciBleGFtcGxlLFxuICAgKiAgIFs1XSB3b3VsZCB5aWVsZCBhIDUgZWxlbWVudCBhcnJheSwgYW5kIFszLDNdIHdvdWxkIHlpZWxkIGEgMyBieSAzIG1hdHJpeC5cbiAgICogQHBhcmFtIGluaXQgLSBBIHZhbHVlIG9yIGEgZnVuY3Rpb24gdXNlZCB0byBmaWxsIGluIHRoZSBlYWNoIGVsZW1lbnQgaW5cbiAgICogICB0aGUgYXJyYXkuIElmIGl0IGlzIGEgZnVuY3Rpb24gaXQgc2hvdWxkIHRha2Ugbm8gYXJndW1lbnRzLCBpdCB3aWxsIGJlIFxuICAgKiAgIGV2YWx1YXRlZCBvbmNlIGZvciBlYWNoIGVsZW1lbnQsIGFuZCBpdCdzIHJldHVybiB2YWx1ZSB3aWxsIGJlIHVzZWQgdG9cbiAgICogICBmaWxsIGluIGVhY2ggZWxlbWVudC5cbiAgICogQGV4YW1wbGUgXG4gICAqIC8vIFRoZSBmb2xsb3dpbmcgd291bGQgcmV0dXJuIFtbMSwxXSxbMSwxXSxbMSwxXV1cbiAgICogY3JlYXRlX2FycmF5KFsyLDNdLCAxKVxuICAgKi9cbiAgdmFyIGNyZWF0ZV9hcnJheSA9IGZ1bmN0aW9uKGRpbSwgaW5pdCkge1xuICAgIHZhciBhcnIgPSBuZXcgQXJyYXkoZGltWzBdKTtcbiAgICB2YXIgaTtcbiAgICBpZihkaW0ubGVuZ3RoID09IDEpIHsgLy8gRmlsbCBpdCB1cCB3aXRoIGluaXRcbiAgICAgIGlmKHR5cGVvZiBpbml0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgICBhcnJbaV0gPSBpbml0KCk7XG4gICAgICAgIH0gIFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgICBhcnJbaV0gPSBpbml0O1xuICAgICAgICB9IFxuICAgICAgfVxuICAgIH0gZWxzZSBpZihkaW0ubGVuZ3RoID4gMSkge1xuICAgICAgZm9yKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgYXJyW2ldID0gY3JlYXRlX2FycmF5KGRpbS5zbGljZSgxKSwgaW5pdCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IFwiY3JlYXRlX2FycmF5IGNhbid0IGNyZWF0ZSBhIGRpbWVuc2lvbmxlc3MgYXJyYXlcIjtcbiAgICB9XG4gICAgcmV0dXJuIGFycjtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGRpbWVuc2lvbnMgb2YgYSBwb3NzaWJseSBuZXN0ZWQgYXJyYXkgYXMgYW4gYXJyYXkuIEZvciBcbiAgICogZXhhbXBsZSwgYXJyYXlfZGltKCBbWzEsIDJdLCBbMSwgMl1dICkgc2hvdWxkIHJldHVybiBbMiwgMl1cbiAgICogQXNzdW1lcyB0aGF0IGFsbCBhcnJheXMgaW5zaWRlIGFub3RoZXIgYXJyYXkgYXJlIG9mIHRoZSBzYW1lIGxlbmd0aC5cbiAgICogQGV4YW1wbGVcbiAgICogLy8gU2hvdWxkIHJldHVybiBbNCwgMiwgMV1cbiAgICogYXJyYXlfZGltKGNyZWF0ZV9hcnJheShbNCwgMiwgMV0sIDApKVxuICAgKi9cbiAgdmFyIGFycmF5X2RpbSA9IGZ1bmN0aW9uKGEpIHtcbiAgICBpZihBcnJheS5pc0FycmF5KGFbMF0pKSB7XG4gICAgICByZXR1cm4gW2EubGVuZ3RoXS5jb25jYXQoYXJyYXlfZGltKGFbMF0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFthLmxlbmd0aF07XG4gICAgfVxuICB9O1xuICBcbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0d28gYXJyYXlzIGFyZSBlcXVhbCBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5IGNvbnRhaW4gdGhlIHNhbWUgZWxlbWVudHNcbiAgICogYXMganVkZ2VkIGJ5IHRoZSBcIj09XCIgb3BlcmF0b3IuIFJldHVybnMgdHJ1ZSBvciBmYWxzZS5cbiAgICogQWRhcHRlZCBmcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE0ODUzOTc0LzEwMDE4NDhcbiAgICovIFxuICB2YXIgYXJyYXlfZXF1YWwgPSBmdW5jdGlvbiAoYTEsIGEyKSB7XG4gICAgICBpZiAoYTEubGVuZ3RoICE9IGEyLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgbmVzdGVkIGFycmF5c1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGExW2ldKSAmJiBBcnJheS5pc0FycmF5KGEyW2ldKSkge1xuICAgICAgICAgICAgICAvLyByZWN1cnNlIGludG8gdGhlIG5lc3RlZCBhcnJheXNcbiAgICAgICAgICAgICAgaWYgKCFhcnJheV9lcXVhbChhMVtpXSwgYTJbaV0pKSByZXR1cm4gZmFsc2U7ICAgICAgIFxuICAgICAgICAgIH0gICAgICAgICAgIFxuICAgICAgICAgIGVsc2UgaWYgKGExW2ldICE9IGEyW2ldKSB7IFxuICAgICAgICAgICAgICAvLyBXYXJuaW5nIC0gdHdvIGRpZmZlcmVudCBvYmplY3QgaW5zdGFuY2VzIHdpbGwgbmV2ZXIgYmUgZXF1YWw6IHt4OjIwfSAhPSB7eDoyMH1cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgIFxuICAgICAgICAgIH0gICAgICAgICAgIFxuICAgICAgfSAgICAgICBcbiAgICAgIHJldHVybiB0cnVlO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFRyYXZlcnNlcyBhIHBvc3NpYmx5IG5lc3RlZCBhcnJheSBhIGFuZCBhcHBsaWVzIGZ1biB0byBhbGwgXCJsZWFmIG5vZGVzXCIsIFxuICAgKiB0aGF0IGlzLCB2YWx1ZXMgdGhhdCBhcmUgbm90IGFycmF5cy4gUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgc2FtZSBzaXplIGFzXG4gICAqIGEuXG4gICAqL1xuICB2YXIgbmVzdGVkX2FycmF5X2FwcGx5ID0gZnVuY3Rpb24oYSwgZnVuKSB7XG4gICAgaWYoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheShhLmxlbmd0aCk7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXN1bHRbaV0gPSBuZXN0ZWRfYXJyYXlfYXBwbHkoYVtpXSwgZnVuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmdW4oYSk7XG4gICAgfVxuICB9O1xuICBcbiAgLyoqIFJhbmRvbWl6aW5nIHRoZSBhcnJheSBlbGVtZW50IG9yZGVyIGluLXBsYWNlLiBVc2luZyBEdXJzdGVuZmVsZFxuICAgKiBzaHVmZmxlIGFsZ29yaXRobS4gQWRhcHRlZCBmcm9tIGhlcmU6IFxuICAgKiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xMjY0Njg2NC8xMDAxODQ4XG4gICAqL1xuICBmdW5jdGlvbiBzaHVmZmxlX2FycmF5KGFycmF5KSB7XG4gICAgICBmb3IgKHZhciBpID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgICAgIHZhciBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGkgKyAxKSk7XG4gICAgICAgICAgdmFyIHRlbXAgPSBhcnJheVtpXTtcbiAgICAgICAgICBhcnJheVtpXSA9IGFycmF5W2pdO1xuICAgICAgICAgIGFycmF5W2pdID0gdGVtcDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIERvZXMgdGhlIHNhbWUgdGhpbmcgYXMgbmVzdGVkX2FycmF5X2FwcGx5LCB0aGF0IGlzLCB0cmF2ZXJzZXMgYSBwb3NzaWJseVxuICAgKiBuZXN0ZWQgYXJyYXkgYSBhbmQgYXBwbGllcyBmdW4gdG8gYWxsIFwibGVhZiBub2Rlc1wiIGFuZCByZXR1cm5zIGFuIGFycmF5IFxuICAgKiBvZiB0aGUgc2FtZSBzaXplIGFzIGEuIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgbmVzdGVkX2FycmF5X3JhbmRvbV9hcHBseVxuICAgKiBicmFuY2hlcyByYW5kb21seS5cbiAgICovXG4gIHZhciBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5ID0gZnVuY3Rpb24oYSwgZnVuKSB7XG4gICAgaWYoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgdmFyIGxlbiA9IGEubGVuZ3RoO1xuICAgICAgdmFyIGk7XG4gICAgICB2YXIgYXJyYXlfaXMgPSBbXTtcbiAgICAgIGZvcihpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGFycmF5X2lzW2ldID0gaTtcbiAgICAgIH1cbiAgICAgIHNodWZmbGVfYXJyYXkoYXJyYXlfaXMpO1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgXG4gICAgICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICB2YXIgYXJyYXlfaSA9IGFycmF5X2lzW2ldO1xuICAgICAgICByZXN1bHRbYXJyYXlfaV0gPSBuZXN0ZWRfYXJyYXlfYXBwbHkoYVthcnJheV9pXSwgZnVuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmdW4oYSk7XG4gICAgfVxuICB9O1xuICBcbiAgLyoqXG4gICAqIEFsbG93cyBhIHByZXR0eSB3YXkgb2Ygc2V0dGluZyBkZWZhdWx0IG9wdGlvbnMgd2hlcmUgdGhlIGRlZnVsdHMgY2FuIGJlXG4gICAqIG92ZXJyaWRkZW4gYnkgYW4gb3B0aW9ucyBvYmplY3QuXG4gICAqICBAcGFyYW0gb3B0aW9uX25hbWUgLSB0aGUgbmFtZSBvZiB0aGUgb3B0aW9uIGFzIGEgc3RyaW5nXG4gICAqICBAcGFyYW0gbXlfb3B0aW9ucyAtIGFuIG9wdGlvbiBvYmplY3QgdGhhdCBjb3VsZCBoYXZlIG9wdGlvbl9uYW1lIFxuICAgKiAgICBhcyBhIG1lbWJlci5cbiAgICogQHBhcmFtIGRlZmF1bF92YWx1ZSAtIGRlZnVsdCB2YWx1ZSB0aGF0IGlzIHJldHVybmVkIGlmIG9wdGlvbl9uYW1lIFxuICAgKiAgIGlzIG5vdCBkZWZpbmVkIGluIG15X29wdGlvbnMuXG4gICAqIEBleGFtcGxlXG4gICAqIHZhciBteV9vcHRpb25zID0ge3BpOiAzLjE0MTU5fVxuICAgKiB2YXIgcGkgPSBnZXRfb3B0aW9uKFwicGlcIiwgbXlfb3B0aW9ucywgMy4xNClcbiAgICovXG4gIC8vIFByZXR0eSB3YXkgb2Ygc2V0dGluZyBkZWZhdWx0IG9wdGlvbnMgd2hlcmUgdGhlIGRlZmF1bHRzIGNhbiBiZSBvdmVycmlkZGVuXG4gIC8vIGJ5IGFuIG9wdGlvbnMgb2JqZWN0LiBGb3IgZXhhbXBsZTpcbiAgLy8gdmFyIHBpID0gZ2V0X29wdGlvbihcInBpXCIsIG15X29wdGlvbnMsIDMuMTQpXG4gIHZhciBnZXRfb3B0aW9uID0gZnVuY3Rpb24ob3B0aW9uX25hbWUsIG9wdGlvbnMsIGRlZmF1bF92YWx1ZSkge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBvcHRpb25zLmhhc093blByb3BlcnR5KG9wdGlvbl9uYW1lKSAmJiBcbiAgICAgICAgICAgb3B0aW9uc1tvcHRpb25fbmFtZV0gIT09IHVuZGVmaW5lZCAgJiYgXG4gICAgICAgICAgIG9wdGlvbnNbb3B0aW9uX25hbWVdICE9PSBudWxsID8gb3B0aW9uc1tvcHRpb25fbmFtZV0gOiBkZWZhdWxfdmFsdWU7XG4gIH07XG4gIFxuICAvKiogVmVyc2lvbiBvZiBnZXRfb3B0aW9uIHdoZXJlIHRoZSBvcHRpb24gc2hvdWxkIGJlIGEgb25lIG9yIG11bHRpLWRpbWVuc2lvbmFsXG4gICAqIGFycmF5IGFuZCB3aGVyZSB0aGUgZGVmYXVsdCBjYW4gYmUgb3ZlcnJpZGRlbiBlaXRoZXIgYnkgYSBzY2FsYXIgb3IgYnkgYW4gYXJyYXkuXG4gICAqIElmIGl0J3MgYSBzY2FsYXIgdGhlIHRoYXQgc2NhbGFyIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBhcnJheSB3aXRoIFxuICAgKiBkaW0gZGltZW5zaW9ucy5cbiAgICogXG4gICAqL1xuICB2YXIgZ2V0X211bHRpZGltX29wdGlvbiA9IGZ1bmN0aW9uKG9wdGlvbl9uYW1lLCBvcHRpb25zLCBkaW0sIGRlZmF1bF92YWx1ZSkge1xuICAgIHZhciB2YWx1ZSA9IGdldF9vcHRpb24ob3B0aW9uX25hbWUsIG9wdGlvbnMsIGRlZmF1bF92YWx1ZSk7XG4gICAgIGlmKCEgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICB2YWx1ZSA9IGNyZWF0ZV9hcnJheShkaW0sIHZhbHVlKTtcbiAgICAgfSBcbiAgICAgaWYoISBhcnJheV9lcXVhbCggYXJyYXlfZGltKHZhbHVlKSwgZGltKSkge1xuICAgICAgIHRocm93IFwiVGhlIG9wdGlvbiBcIiArIG9wdGlvbl9uYW1lICsgXCIgaXMgb2YgZGltZW5zaW9uIFtcIiArIFxuICAgICAgICAgICAgIGFycmF5X2RpbSh2YWx1ZSkgKyBcIl0gYnV0IHNob3VsZCBiZSBbXCIgKyBkaW0gKyBcIl0uXCI7XG4gICAgfVxuICAgICByZXR1cm4gdmFsdWU7XG4gIH07XG4gIFxuICAvLy8vLy8vLy8vIEZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgcGFyYW1ldGVyIG9iamVjdHMgLy8vLy8vLy8vL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgLyoqXG4gICAqIFJldHVybnMgYSBmaXhlZCAoc2FtZSBldmVyeSB0aW1lKSBudW1iZXIgdGhhdCBjb3VsZCBiZSB1c2VkIHRvIGluaXRpYWxpemVcbiAgICogYSBwYXJhbWV0ZXIgb2YgYSBjZXJ0YWluIHR5cGUsIHBvc3NpYmx5IHdpdGggbG93ZXIgYW5kIHVwcGVyIGJvdW5kcy5cbiAgICogVGhlIHBvc3NpbGUgdHlwZXMgYXJlIFwicmVhbFwiLCBcImludFwiLCBhbmQgXCJiaW5hcnlcIi5cbiAgICovXG4gIHZhciBwYXJhbV9pbml0X2ZpeGVkID0gZnVuY3Rpb24odHlwZSwgbG93ZXIsIHVwcGVyKSB7XG4gICAgaWYobG93ZXIgPiB1cHBlcikge1xuICAgICAgdGhyb3cgXCJDYW4gbm90IGluaXRpYWxpemUgcGFyYW1ldGVyIHdoZXJlIGxvd2VyIGJvdW5kID4gdXBwZXIgYm91bmRcIjtcbiAgICB9XG4gICAgaWYodHlwZSA9PT0gXCJyZWFsXCIpIHtcbiAgICAgIGlmKGxvd2VyID09PSAtSW5maW5pdHkgJiYgdXBwZXIgPT09IEluZmluaXR5KSB7XG4gICAgICAgIHJldHVybiAwLjU7XG4gICAgICB9IGVsc2UgaWYobG93ZXIgPT09IC1JbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gdXBwZXIgLSAwLjU7XG4gICAgICB9IGVsc2UgaWYodXBwZXIgPT09IEluZmluaXR5KSB7XG4gICAgICAgIHJldHVybiBsb3dlciArIDAuNTtcbiAgICAgIH0gZWxzZSBpZihsb3dlciA8PSB1cHBlcikge1xuICAgICAgICByZXR1cm4gKGxvd2VyICsgdXBwZXIpIC8gMjtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYodHlwZSA9PT0gXCJpbnRcIikge1xuICAgICAgaWYobG93ZXIgPT09IC1JbmZpbml0eSAmJiB1cHBlciA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9IGVsc2UgaWYobG93ZXIgPT09IC1JbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gdXBwZXIgLSAxO1xuICAgICAgfSBlbHNlIGlmKHVwcGVyID09PSBJbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gbG93ZXIgKyAxO1xuICAgICAgfSBlbHNlIGlmKGxvd2VyIDw9IHVwcGVyKXtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoKGxvd2VyICsgdXBwZXIpIC8gMik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKHR5cGUgPT09IFwiYmluYXJ5XCIpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICB0aHJvdyBcIkNvdWxkIG5vdCBpbml0aWFsaXplIHBhcmFtZXRlciBvZiB0eXBlIFwiICsgdHlwZSArIFwiW1wiICsgbG93ZXIgKyBcIiwgXCIgKyB1cHBlciArIFwiXVwiO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIENvbXBsZXRlcyBwYXJhbXNfdG9fY29tcGxldGUsIGFuIG9iamVjdCBjb250YWluaW5nIHBhcmFtZXRlciBkZXNjcmlwdGlvbnMsIFxuICAgKiBhbmQgaW5pdGlhbGl6ZXMgbm9uLWluaXRpYWxpemVkIHBhcmFtZXRlcnMuIFRoaXMgbW9kaWZpZWQgdmVyc2lvbiBvZlxuICAgKiBwYXJhbXNfdG9fY29tcGxldGUgaXMgcmV0dXJuZWQgYXMgYSBkZWVwIGNvcHkgYW5kIG5vdCBtb2RpZmllZCBpbiBwbGFjZS5cbiAgICogSW5pdGlhbGl6YXRpb24gaXMgZG9uZSBieSBzdXBwbHlpbmcgYSBwYXJhbV9pbml0IGZ1bmN0aW9uIHdpdGggc2lnbmF0dXJlXG4gICAqIGZ1bmN0aW9uKHR5cGUsIGxvd2VyLCB1cHBlcikgdGhhdCBzaG91bGQgcmV0dXJuIGEgc2luZ2xlIG51bWJlciBcbiAgICogKGxpa2UgcGFyYW1faW5pdF9maXhlZCwgZm9yIGV4YW1wbGUpLlxuICAgKiBAZXhhbXBsZVxuICAgKiB2YXIgcGFyYW1zID0geyBcIm11XCI6IHtcInR5cGVcIjogXCJyZWFsXCJ9IH1cbiAgICogcGFyYW1zID0gY29tcGxldGVfcGFyYW1zKHBhcmFtcyk7XG4gICAqIC8vIHBhcmFtcyBzaG91bGQgbm93IGJlOlxuICAgKiAvLyAge1wibXVcIjogeyBcInR5cGVcIjogXCJyZWFsXCIsIFwiZGltXCI6IFsxXSwgXCJ1cHBlclwiOiBJbmZpbml0eSxcbiAgICogLy8gICAgICAgICAgIFwibG93ZXJcIjogLUluZmluaXR5LCBcImluaXRcIjogMC41IH19XG4gICAqLyBcbiAgdmFyIGNvbXBsZXRlX3BhcmFtcyAgPSBmdW5jdGlvbihwYXJhbXNfdG9fY29tcGxldGUsIHBhcmFtX2luaXQpIHtcbiAgICB2YXIgcGFyYW1zID0gZGVlcF9jbG9uZShwYXJhbXNfdG9fY29tcGxldGUpO1xuICAgIGZvciAodmFyIHBhcmFtX25hbWUgaW4gcGFyYW1zKSB7IGlmICghcGFyYW1zLmhhc093blByb3BlcnR5KHBhcmFtX25hbWUpKSBjb250aW51ZTtcbiAgICAgIHZhciBwYXJhbSA9IHBhcmFtc1twYXJhbV9uYW1lXTtcbiAgICAgIGlmKCAhcGFyYW0uaGFzT3duUHJvcGVydHkoXCJ0eXBlXCIpKSB7XG4gICAgICAgIHBhcmFtLnR5cGUgPSBcInJlYWxcIjtcbiAgICAgIH1cbiAgICAgIGlmKCFwYXJhbS5oYXNPd25Qcm9wZXJ0eShcImRpbVwiKSkge1xuICAgICAgICBwYXJhbS5kaW0gPSBbMV07XG4gICAgICB9XG4gICAgICBpZihpc19udW1iZXIocGFyYW0uZGltKSkge1xuICAgICAgICBwYXJhbS5kaW0gPSBbcGFyYW0uZGltXTtcbiAgICAgIH1cbiAgICAgIGlmKHBhcmFtLnR5cGUgPT0gXCJiaW5hcnlcIikge1xuICAgICAgICBwYXJhbS51cHBlciA9IDE7XG4gICAgICAgIHBhcmFtLmxvd2VyID0gMDtcbiAgICAgIH1cbiAgICAgIGlmKCFwYXJhbS5oYXNPd25Qcm9wZXJ0eShcInVwcGVyXCIpKSB7XG4gICAgICAgIHBhcmFtLnVwcGVyID0gSW5maW5pdHk7XG4gICAgICB9XG4gICAgICBpZighcGFyYW0uaGFzT3duUHJvcGVydHkoXCJsb3dlclwiKSkge1xuICAgICAgICBwYXJhbS5sb3dlciA9IC1JbmZpbml0eTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYocGFyYW0uaGFzT3duUHJvcGVydHkoXCJpbml0XCIpKSB7XG4gICAgICAgIC8vIElmIHRoaXMgaXMganVzdCBhIG51bWJlciBvciBhIG5lc3RlZCBhcnJheSB3ZSBsZWF2ZSBpdCBhbG9uZSwgYnV0IGlmLi4uXG4gICAgICAgIGlmKGFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSAmJiB0eXBlb2YgcGFyYW0uaW5pdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gcGFyYW0uaW5pdCBpcyBhIGZ1bmN0aW9uLCB1c2UgdGhhdCB0byBpbml0aWFsaXplIHRoZSBwYXJhbWV0ZXIuXG4gICAgICAgICAgcGFyYW0uaW5pdCA9IHBhcmFtLmluaXQoKTtcbiAgICAgICAgfSBlbHNlIGlmKCFhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0uaW5pdCkpIHtcbiAgICAgICAgLy8gV2UgaGF2ZSBhIG11bHRpZGltZW5zaW9uYWwgcGFyYW1ldGVyIHdoZXJlIHRoZSBwYXJhbS5pbml0IGV4aXN0IGJ1dFxuICAgICAgICAvLyBpcyBub3QgYW4gYXJyYXkuIFRoZW4gYXNzdW1lIGl0IGlzIGEgbnVtYmVyIG9yIGEgZnVuY3Rpb24gYW5kIHVzZVxuICAgICAgICAvLyBpdCB0byBpbml0aWFsaXplIHRoZSBwYXJhbWV0ZXIuXG4gICAgICAgIHBhcmFtLmluaXQgPSBjcmVhdGVfYXJyYXkocGFyYW0uZGltLCBwYXJhbS5pbml0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHsgLy8gV2UgdXNlIHRoZSBkZWZhdWx0IGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLlxuICAgICAgICBpZihhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHtcbiAgICAgICAgICBwYXJhbS5pbml0ID0gcGFyYW1faW5pdChwYXJhbS50eXBlLCBwYXJhbS5sb3dlciwgcGFyYW0udXBwZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcmFtLmluaXQgPSBjcmVhdGVfYXJyYXkocGFyYW0uZGltLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbV9pbml0KHBhcmFtLnR5cGUsIHBhcmFtLmxvd2VyLCBwYXJhbS51cHBlcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfTtcbiAgXG4gIFxuICAvLy8vLy8vLy8vIFN0ZXBwZXIgRnVuY3Rpb25zIC8vLy8vLy8vLy8vXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgXG4gIFxuICAvKipcbiAgICogQGludGVyZmFjZVxuICAgKiBBIFN0ZXBwZXIgaXMgYW4gb2JqZWN0IHJlc3BvbnNpYmxlIGZvciBwdXNoaW5nIGFyb3VuZCBvbmVcbiAgICogb3IgbW9yZSBwYXJhbWV0ZXIgdmFsdWVzIGluIGEgc3RhdGUgYWNjb3JkaW5nIHRvIHRoZSBkaXN0cmlidXRpb25cbiAgICogZGVmaW5lZCBieSB0aGUgbG9nIHBvc3Rlcmlvci4gVGhpcyBkZWZpbmVzIHRoZSBTdGVwcGVyIFwiaW50ZXJmYWNlXCIsXG4gICAqIHdoZXJlIFwiaW50ZXJmYWNlXCIgbWVhbnMgdGhhdCBTdGVwcGVyIGRlZmluZXMgYSBjbGFzcyB0aGF0IGlzIG5ldmVyXG4gICAqIG1lYW50IHRvIGJlIGluc3RhbnRpYXRlZCwgYnV0IGp1c3QgdG8gYmUgc3ViY2xhc3NlZCBieSBzcGVjaWFsaXplZFxuICAgKiBzdGVwcGVyIGZ1bmN0aW9ucy5cbiAgICogQGludGVyZmFjZVxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggcGFyYW1ldGVyIGRlZmluaXRpb25zLCBmb3IgZXhhbXBsZTpcbiAgICogICB7XCJtdVwiOiB7IFwidHlwZVwiOiBcInJlYWxcIiwgXCJkaW1cIjogWzFdLCBcInVwcGVyXCI6IEluZmluaXR5LCBcbiAgICogICBcImxvd2VyXCI6IC1JbmZpbml0eSwgXCJpbml0XCI6IDAuNSB9fVxuICAgKiAgIFRoZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMgYXJlIGV4cGVjdGVkIHRvIGJlIFwiY29tcGxldGVcIiwgdGhhdCBpcyxcbiAgICogICBzcGVjaWZ5aW5nIGFsbCByZWxldmFudCBhdHRyaWJ1dGVzIHN1Y2ggYXMgZGltLCBsb3dlciBhbmQgdXBwZXIuXG4gICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycyBpbiBwYXJhbXNcbiAgICogICAoYW5kIHBvc3NpYmx5IG1vcmUpLiBUaGUgcGFyYW1ldGVyIG5hbWVzIGFyZSBnaXZlbiBhcyBrZXlzIGFuZCB0aGUgc3RhdGVzXG4gICAqICAgYXMgc2NhbGFycyBvciwgcG9zc2libHkgbmVzdGVkLCBhcnJheXMuIEZvciBleGFtcGxlOlxuICAgKiAgIHttdTogMTAsIHNpZ21hOiA1LCBiZXRhOiBbMSwgMi41XX1cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiAqdGFraW5nIG5vIHBhcmFtZXRlcnMqIHRoYXQgcmV0dXJucyB0aGVcbiAgICogICBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiBUaGF0IGlzLCB0aGUgdmFsdWUgb2YgbG9nX3Bvc3RcbiAgICogICBzaG91bGQgY2hhbmdlIGlmIHRoZSB0aGUgdmFsdWVzIGluIHN0YXRlIGFyZSBjaGFuZ2VkLlxuICBcbiAgICovXG4gIHZhciBTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpIHtcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgdGhpcy5sb2dfcG9zdCA9IGxvZ19wb3N0O1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFRha2VzIGEgc3RlcCBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlLiBTaG91bGQgcmV0dXJuIHRoZSBuZXcgc3RhdGUsXG4gICAqIGJ1dCBpcyBtYWlubHkgY2FsbGVkIGZvciBpdCdzIHNpZGUgZWZmZWN0IG9mIG1ha2luZyBhIGNoYW5nZSBpbiB0aGVcbiAgICogc3RhdGUgb2JqZWN0LlxuICAgKi9cbiAgU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIHRocm93IFwiRXZlcnkgU3RlcHBlciBuZWVkIHRvIGltcGxlbWVudCBzdGVwKClcIjtcbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBJZiBpbXBsZW1lbnRlZCwgbWFrZXMgdGhlIHN0ZXBwZXIgYWRhcHQgd2hpbGUgc3RlcHBpbmcuXG4gICAqLyBcbiAgU3RlcHBlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIE9wdGlvbmFsLCBzb21lIHN0ZXBwZXJzIG1pZ2h0IG5vdCBiZSBhZGFwdGl2ZS4gKi8gXG4gIH07XG4gIFxuICAvKipcbiAgICogSWYgaW1wbGVtZW50ZWQsIG1ha2VzIHRoZSBzdGVwcGVyIGNlYXNlIGFkYXB0aW5nIHdoaWxlIHN0ZXBwaW5nLlxuICAgKi8gXG4gIFN0ZXBwZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIE9wdGlvbmFsLCBzb21lIHN0ZXBwZXJzIG1pZ2h0IG5vdCBiZSBhZGFwdGl2ZS4gKi8gXG4gIH07XG4gIFxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3QgY29udGFpbmcgaW5mbyByZWdhcmRpbmcgdGhlIHN0ZXBwZXIuXG4gICAqLyBcbiAgU3RlcHBlci5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIFJldHVybnMgYW4gb2JqZWN0IHdpdGggaW5mbyBhYm91dCB0aGUgc3RhdGUgb2YgdGhlIHN0ZXBwZXIuXG4gICAgcmV0dXJuIHt9O1xuICB9O1xuICBcbiAgXG4gIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGltcGxlbWVudHMge1N0ZXBwZXJ9XG4gICAqIENvbnN0cnVjdG9yIGZvciBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoZSBtZXRyb3BvbGlzIHN0ZXAgaW5cbiAgICogdGhlIEFkYXB0aXZlIE1ldHJvcG9saXMtV2l0aGluLUdpYmJzIGFsZ29yaXRobSBpbiBcIkV4YW1wbGVzIG9mIEFkYXB0aXZlIE1DTUNcIlxuICAgKiBieSBSb2JlcnRzIGFuZCBSb3NlbnRoYWwgKDIwMDgpLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyIGRlZmluaXRpb24uXG4gICAqIEBwYXJhbSBzdGF0ZSAtIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzdGF0ZSBvZiBhbGwgcGFyYW1ldGVycy5cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGxvZyBkZW5zaXR5IHRoYXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUuIFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbnMgdG8gdGhlIHN0ZXBwZXIuXG4gICAqIEBwYXJhbSBnZW5lcmF0ZV9wcm9wb3NhbCAtIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgcHJvcG9zYWwgKGFzIGEgbnVtYmVyKVxuICAgKiB3aXRoIHNpZ25hdHVyZSBmdW5jdGlvbihwYXJhbV9zdGF0ZSwgbG9nX3NjYWxlKSB3aGVyZSBwYXJhbV9zdGF0ZSBpcyBhXG4gICAqIG51bWJlciBhbmQgbG9nX3NjYWxlIGRlZmluZXMgdGhlIHNjYWxlIG9mIHRoZSBwcm9wb3NhbCBzb21laG93LlxuICAqL1xuICB2YXIgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgZ2VuZXJhdGVfcHJvcG9zYWwpIHtcbiAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpO1xuICAgIFxuICAgIHZhciBwYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTtcbiAgICBpZihwYXJhbV9uYW1lcy5sZW5ndGggICE9IDEpIHtcbiAgICAgIHRocm93IFwiT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgY2FuIG9ubHkgaGFuZGxlIG9uZSBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICAgIHRoaXMucGFyYW1fbmFtZSA9IHBhcmFtX25hbWVzWzBdO1xuICAgIHZhciBwYXJhbSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZV07XG4gICAgaWYoIWFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSkge1xuICAgICAgdGhyb3cgXCJPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciBjYW4gb25seSBoYW5kbGUgb25lIG9uZS1kaW1lbnNpb25hbCBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICAgIHRoaXMubG93ZXIgPSBwYXJhbS5sb3dlcjtcbiAgICB0aGlzLnVwcGVyID0gcGFyYW0udXBwZXI7XG4gICAgXG4gICAgdGhpcy5wcm9wX2xvZ19zY2FsZSAgICAgPSBnZXRfb3B0aW9uKFwicHJvcF9sb2dfc2NhbGVcIiwgb3B0aW9ucywgMCk7XG4gICAgdGhpcy5iYXRjaF9zaXplICAgICAgICAgPSBnZXRfb3B0aW9uKFwiYmF0Y2hfc2l6ZVwiLCBvcHRpb25zLCA1MCk7XG4gICAgdGhpcy5tYXhfYWRhcHRhdGlvbiAgICAgPSBnZXRfb3B0aW9uKFwibWF4X2FkYXB0YXRpb25cIiwgb3B0aW9ucywgMC4zMyk7XG4gICAgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24gPSBnZXRfb3B0aW9uKFwiaW5pdGlhbF9hZGFwdGF0aW9uXCIsIG9wdGlvbnMsIDEuMCk7XG4gICAgdGhpcy50YXJnZXRfYWNjZXB0X3JhdGUgPSBnZXRfb3B0aW9uKFwidGFyZ2V0X2FjY2VwdF9yYXRlXCIsIG9wdGlvbnMsIDAuNDQpO1xuICAgIHRoaXMuaXNfYWRhcHRpbmcgICAgICAgID0gZ2V0X29wdGlvbihcImlzX2FkYXB0aW5nXCIsIG9wdGlvbnMsIHRydWUpO1xuICAgIFxuICAgIHRoaXMuZ2VuZXJhdGVfcHJvcG9zYWwgPSBnZW5lcmF0ZV9wcm9wb3NhbDtcbiAgICBcbiAgICB0aGlzLmFjY2VwdGFuY2VfY291bnQgPSAwO1xuICAgIHRoaXMuYmF0Y2hfY291bnQgPSAwO1xuICAgIHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiA9IDA7ICBcbiAgfTtcbiAgXG4gIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gT25lZGltTWV0cm9wb2xpc1N0ZXBwZXI7XG4gIFxuICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHBhcmFtX3N0YXRlID0gdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdO1xuICAgICAgdmFyIHBhcmFtX3Byb3Bvc2FsID0gdGhpcy5nZW5lcmF0ZV9wcm9wb3NhbChwYXJhbV9zdGF0ZSwgdGhpcy5wcm9wX2xvZ19zY2FsZSk7XG4gICAgICBpZihwYXJhbV9wcm9wb3NhbCA8IHRoaXMubG93ZXIgfHwgcGFyYW1fcHJvcG9zYWwgPiB0aGlzLnVwcGVyKSB7XG4gICAgICAgIC8vIE91dHNpZGUgb2YgbGltaXRzIG9mIHRoZSBwYXJhbWV0ZXIsIHJlamVjdCB0aGUgcHJvcG9zYWwgXG4gICAgICAgIC8vIGFuZCBzdGF5IGF0IHRoZSBjdXJyZW50IHN0YXRlLlxuICAgICAgfSBlbHNlIHsgLy8gbWFrZSBhIE1ldHJvcG9saXMgc3RlcFxuICAgICAgICB2YXIgY3Vycl9sb2dfZGVucyA9IHRoaXMubG9nX3Bvc3QoKTtcbiAgICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gcGFyYW1fcHJvcG9zYWw7XG4gICAgICAgIHZhciBwcm9wX2xvZ19kZW5zID0gdGhpcy5sb2dfcG9zdCgpO1xuICAgICAgICB2YXIgYWNjZXB0X3Byb2IgPSBNYXRoLmV4cChwcm9wX2xvZ19kZW5zIC0gY3Vycl9sb2dfZGVucyk7XG4gICAgICAgIGlmKGFjY2VwdF9wcm9iID4gTWF0aC5yYW5kb20oKSkge1xuICAgICAgICAgIC8vIFdlIGRvIG5vdGhpbmcgYXMgdGhlIHN0YXRlIG9mIHBhcmFtIGhhcyBhbHJlYWR5IGJlZW4gY2hhbmdlZCB0byB0aGUgcHJvcG9zYWxcbiAgICAgICAgICBpZih0aGlzLmlzX2FkYXB0aW5nKSB0aGlzLmFjY2VwdGFuY2VfY291bnQrKyA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gcmV2ZXJ0IHN0YXRlIGJhY2sgdG8gdGhlIG9sZCBzdGF0ZSBvZiBwYXJhbVxuICAgICAgICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IHBhcmFtX3N0YXRlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZih0aGlzLmlzX2FkYXB0aW5nKSB7XG4gICAgICAgIHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiArKztcbiAgICAgICAgaWYodGhpcy5pdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uID49IHRoaXMuYmF0Y2hfc2l6ZSkgeyAvLyB0aGVuIGFkYXB0XG4gICAgICAgICAgdGhpcy5iYXRjaF9jb3VudCArKztcbiAgICAgICAgICB2YXIgbG9nX3NkX2FkanVzdG1lbnQgPSBcbiAgICAgICAgICAgIE1hdGgubWluKHRoaXMubWF4X2FkYXB0YXRpb24sIFxuICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24gLyBNYXRoLnNxcnQodGhpcy5iYXRjaF9jb3VudCkpO1xuICAgICAgICAgIGlmKHRoaXMuYWNjZXB0YW5jZV9jb3VudCAvIHRoaXMuYmF0Y2hfc2l6ZSA+IHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BfbG9nX3NjYWxlICs9IGxvZ19zZF9hZGp1c3RtZW50O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByb3BfbG9nX3NjYWxlIC09IGxvZ19zZF9hZGp1c3RtZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmFjY2VwdGFuY2VfY291bnQgPSAwO1xuICAgICAgICAgIHRoaXMuaXRlcmF0aW9uc19zaW5jZV9hZGFwdGlvbiA9IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV07XG4gIH07XG4gIFxuICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuaXNfYWRhcHRpbmcgPSB0cnVlO1xuICB9O1xuICBcbiAgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuaXNfYWRhcHRpbmcgPSBmYWxzZTtcbiAgfTtcbiAgXG4gIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZS5pbmZvID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByb3BfbG9nX3NjYWxlOiB0aGlzLnByb3BfbG9nX3NjYWxlLFxuICAgICAgaXNfYWRhcHRpbmc6IHRoaXMuaXNfYWRhcHRpbmcsXG4gICAgICBhY2NlcHRhbmNlX2NvdW50OiB0aGlzLmFjY2VwdGFuY2VfY291bnQsXG4gICAgICBpdGVyYXRpb25zX3NpbmNlX2FkYXB0aW9uOiB0aGlzLml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24sXG4gICAgICBiYXRjaF9jb3VudDogdGhpcy5iYXRjaF9jb3VudFxuICAgIH07XG4gIH07XG4gIFxuICBcbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHJldHVybmluZyBhIE5vcm1hbCBwcm9wb3NhbC5cbiAgICovXG4gIHZhciBub3JtYWxfcHJvcG9zYWwgPSBmdW5jdGlvbihwYXJhbV9zdGF0ZSwgcHJvcF9sb2dfc2NhbGUpIHtcbiAgICByZXR1cm4gcm5vcm0ocGFyYW1fc3RhdGUgLCBNYXRoLmV4cChwcm9wX2xvZ19zY2FsZSkpO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAYXVnbWVudHMge09uZWRpbU1ldHJvcG9saXNTdGVwcGVyfVxuICAgKiBBIFwic3ViY2xhc3NcIiBvZiBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciBtYWtpbmcgY29udGlub3VzIE5vcm1hbCBwcm9wb3NhbHMuXG4gICAqL1xuICB2YXIgUmVhbE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHtcbiAgICBPbmVkaW1NZXRyb3BvbGlzU3RlcHBlci5jYWxsKHRoaXMsIHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zLCBub3JtYWxfcHJvcG9zYWwpO1xuICB9O1xuICBcbiAgUmVhbE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlKTsgXG4gIFJlYWxNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSZWFsTWV0cm9wb2xpc1N0ZXBwZXI7XG4gIFxuICAvKipcbiAgICogRnVuY3Rpb24gcmV0dXJuaW5nIGEgZGlzY3JldGl6ZWQgTm9ybWFsIHByb3Bvc2FsLlxuICAgKi9cbiAgdmFyIGRpc2NyZXRlX25vcm1hbF9wcm9wb3NhbCA9IGZ1bmN0aW9uKHBhcmFtX3N0YXRlLCBwcm9wX2xvZ19zY2FsZSkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKHJub3JtKHBhcmFtX3N0YXRlICwgTWF0aC5leHAocHJvcF9sb2dfc2NhbGUpKSk7XG4gIH07XG4gIFxuICAgIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGF1Z21lbnRzIHtPbmVkaW1NZXRyb3BvbGlzU3RlcHBlcn1cbiAgICogQSBcInN1YmNsYXNzXCIgb2YgT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIgbWFraW5nIGRpc2NyZXRpemVkIE5vcm1hbCBwcm9wb3NhbHMuXG4gICAqL1xuICB2YXIgSW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIGRpc2NyZXRlX25vcm1hbF9wcm9wb3NhbCk7XG4gIH07XG4gIFxuICBJbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE9uZWRpbU1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSk7IFxuICBJbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbnRNZXRyb3BvbGlzU3RlcHBlcjtcbiAgXG4gIFxuICAvKipcbiAgICogQGNsYXNzXG4gICAqIEBpbXBsZW1lbnRzIHtTdGVwcGVyfVxuICAgKiBDb25zdHJ1Y3RvciBmb3IgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgbWV0cm9wb2xpcyBzdGVwIGluXG4gICAqIHRoZSBBZGFwdGl2ZSBNZXRyb3BvbGlzLVdpdGhpbi1HaWJicyBhbGdvcml0aG0gaW4gXCJFeGFtcGxlcyBvZiBBZGFwdGl2ZSBNQ01DXCJcbiAgICogYnkgUm9iZXJ0cyBhbmQgUm9zZW50aGFsICgyMDA4KSBmb3IgcG9zc2libHkgbXVsdGlkaW1lbnNpb25hbCBhcnJheXMuIFRoYXRcbiAgICogaXMsIGluc3RlYWQgb2YganVzdCB0YWtpbmcgYSBzdGVwIGZvciBhIG9uZS1kaW1lbnNpb25hbCBwYXJhbWV0ZXIgbGlrZSBcbiAgICogT25lZGltTWV0cm9wb2xpc1N0ZXBwZXIsIHRoaXMgU3RlcHBlciBpcyByZXNwb25zaWJsZSBmb3IgdGFraW5nIHN0ZXBzIFxuICAgKiBmb3IgYSBtdWx0aWRpbWVuc2lvbmFsIGFycmF5LiBJdCdzIHN0aWxsIHByZXR0eSBkdW1iIGFuZCBqdXN0IHRha2VzXG4gICAqIG9uZS1kaW1lbnNpb25hbCBzdGVwcyBmb3IgZWFjaCBwYXJhbWV0ZXIgY29tcG9uZW50LCB0aG91Z2guXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBmb3IgYSBcbiAgICogICBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlci5cbiAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gbG9nX3Bvc3QgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci5cbiAgICogQHBhcmFtIFN1YlN0ZXBwZXIgLSBhIGNvbnN0cnVjdG9yIGZvciB0aGUgdHlwZSBvZiBvbmUgZGltZW5zaW9uYWwgU3RlcHBlciB0byBhcHBseSBvblxuICAgKiAgIGFsbCB0aGUgY29tcG9uZW50cyBvZiB0aGUgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIuXG4gICovXG4gIHZhciBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMsIFN1YlN0ZXBwZXIpIHtcbiAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpO1xuICAgIFxuICAgIHZhciBwYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTtcbiAgICBpZihwYXJhbV9uYW1lcy5sZW5ndGggICE9IDEpIHtcbiAgICAgIHRocm93IFwiTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciBjYW4ndCBoYW5kbGUgbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICAgIHRoaXMucGFyYW1fbmFtZSA9IHBhcmFtX25hbWVzWzBdO1xuICAgIHZhciBwYXJhbSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZV07XG4gICAgdGhpcy5sb3dlciA9IHBhcmFtLmxvd2VyO1xuICAgIHRoaXMudXBwZXIgPSBwYXJhbS51cHBlcjtcbiAgICB0aGlzLmRpbSA9IHBhcmFtLmRpbTtcbiAgXG4gICAgdGhpcy5wcm9wX2xvZ19zY2FsZSAgICAgPSBnZXRfbXVsdGlkaW1fb3B0aW9uKFwicHJvcF9sb2dfc2NhbGVcIiwgb3B0aW9ucywgdGhpcy5kaW0sIDApO1xuICAgIHRoaXMuYmF0Y2hfc2l6ZSAgICAgICAgID0gZ2V0X211bHRpZGltX29wdGlvbihcImJhdGNoX3NpemVcIiwgb3B0aW9ucywgdGhpcy5kaW0sIDUwKTtcbiAgICB0aGlzLm1heF9hZGFwdGF0aW9uICAgICA9IGdldF9tdWx0aWRpbV9vcHRpb24oXCJtYXhfYWRhcHRhdGlvblwiLCBvcHRpb25zLCB0aGlzLmRpbSwgMC4zMyk7XG4gICAgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24gPSBnZXRfbXVsdGlkaW1fb3B0aW9uKFwiaW5pdGlhbF9hZGFwdGF0aW9uXCIsIG9wdGlvbnMsIHRoaXMuZGltLCAxLjApO1xuICAgIHRoaXMudGFyZ2V0X2FjY2VwdF9yYXRlID0gZ2V0X211bHRpZGltX29wdGlvbihcInRhcmdldF9hY2NlcHRfcmF0ZVwiLCBvcHRpb25zLCB0aGlzLmRpbSwgMC40NCk7XG4gICAgdGhpcy5pc19hZGFwdGluZyAgICAgICAgPSBnZXRfbXVsdGlkaW1fb3B0aW9uKFwiaXNfYWRhcHRpbmdcIiwgb3B0aW9ucywgdGhpcy5kaW0sIHRydWUpO1xuICAgIFxuICAgIC8vIFRoaXMgaGFjayBiZWxvdyBpcyBhIHJlY3Vyc2l2ZSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYW4gYXJyYXkgb2YgXG4gICAgLy8gb25lIGRpbWVuc2lvbmFsIHN0ZXBwZXJzIGFjY29yZGluZyB0byBkaW0uXG4gICAgdmFyIGNyZWF0ZV9zdWJzdGVwcGVycyA9IFxuICAgICAgZnVuY3Rpb24oZGltLCBzdWJzdGF0ZSwgbG9nX3Bvc3QsIHByb3BfbG9nX3NjYWxlLCBiYXRjaF9zaXplLCBtYXhfYWRhcHRhdGlvbiwgaW5pdGlhbF9hZGFwdGF0aW9uLCB0YXJnZXRfYWNjZXB0X3JhdGUsIGlzX2FkYXB0aW5nKSB7XG4gICAgICB2YXIgc3Vic3RlcHBlcnMgPSBbXTtcbiAgICAgIGlmKGRpbS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGRpbVswXTsgaSsrKSB7XG4gICAgICAgICAgdmFyIHN1Ym9wdGlvbnMgPSB7cHJvcF9sb2dfc2NhbGU6IHByb3BfbG9nX3NjYWxlW2ldLCBiYXRjaF9zaXplOiBiYXRjaF9zaXplW2ldLFxuICAgICAgICAgICAgbWF4X2FkYXB0YXRpb246IG1heF9hZGFwdGF0aW9uW2ldLCBpbml0aWFsX2FkYXB0YXRpb246IGluaXRpYWxfYWRhcHRhdGlvbltpXSxcbiAgICAgICAgICAgIHRhcmdldF9hY2NlcHRfcmF0ZTogdGFyZ2V0X2FjY2VwdF9yYXRlW2ldLCBpc19hZGFwdGluZzogaXNfYWRhcHRpbmdbaV19O1xuICAgICAgICAgICAgdmFyIHN1YnBhcmFtID0ge307XG4gICAgICAgICAgICBzdWJwYXJhbVtpXSA9IGRlZXBfY2xvbmUocGFyYW0pO1xuICAgICAgICAgICAgc3VicGFyYW1baV0uZGltID0gWzFdOyAvLyBBcyB0aGlzIHNob3VsZCBub3cgYmUgYSBvbmUtZGltIHBhcmFtZXRlclxuICAgICAgICAgICAgZGVsZXRlIHN1YnBhcmFtW2ldLmluaXQ7IC8vIEFzIGl0IHNvdWxkIG5vdCBiZSBuZWVkZWRcbiAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IG5ldyBTdWJTdGVwcGVyKHN1YnBhcmFtLCBzdWJzdGF0ZSwgbG9nX3Bvc3QsIHN1Ym9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IGNyZWF0ZV9zdWJzdGVwcGVycyhkaW0uc2xpY2UoMSksIHN1YnN0YXRlW2ldLCBsb2dfcG9zdCwgcHJvcF9sb2dfc2NhbGVbaV0sIFxuICAgICAgICAgICAgYmF0Y2hfc2l6ZVtpXSwgbWF4X2FkYXB0YXRpb25baV0sIGluaXRpYWxfYWRhcHRhdGlvbltpXSwgdGFyZ2V0X2FjY2VwdF9yYXRlW2ldLCBpc19hZGFwdGluZ1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdWJzdGVwcGVycztcbiAgICB9O1xuICAgIFxuICAgIHRoaXMuc3Vic3RlcHBlcnMgPSBjcmVhdGVfc3Vic3RlcHBlcnModGhpcy5kaW0sIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSwgdGhpcy5sb2dfcG9zdCxcbiAgICAgIHRoaXMucHJvcF9sb2dfc2NhbGUsIHRoaXMuYmF0Y2hfc2l6ZSwgdGhpcy5tYXhfYWRhcHRhdGlvbiwgdGhpcy5pbml0aWFsX2FkYXB0YXRpb24sXG4gICAgICB0aGlzLnRhcmdldF9hY2NlcHRfcmF0ZSwgdGhpcy5pc19hZGFwdGluZyk7XG4gICAgXG4gIH07XG4gIFxuICBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyO1xuICBcbiAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIEdvIHRocm91Z2ggdGhlIHN1YnN0ZXBwZXJzIGluIGEgcmFuZG9tIG9yZGVyIGFuZCBjYWxsIHN0ZXAoKSBvbiB0aGVtLlxuICAgIHJldHVybiBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uKHN1YnN0ZXBwZXIpIHtyZXR1cm4gc3Vic3RlcHBlci5zdGVwKCk7IH0pO1xuICB9O1xuICBcbiAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIG5lc3RlZF9hcnJheV9hcHBseSh0aGlzLnN1YnN0ZXBwZXJzLCBmdW5jdGlvbihzdWJzdGVwcGVyKSB7c3Vic3RlcHBlci5zdGFydF9hZGFwdGF0aW9uKCk7IH0pO1xuICB9O1xuICBcbiAgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgbmVzdGVkX2FycmF5X2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uKHN1YnN0ZXBwZXIpIHtzdWJzdGVwcGVyLnN0b3BfYWRhcHRhdGlvbigpOyB9KTtcbiAgfTtcbiAgXG4gIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmluZm8gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmVzdGVkX2FycmF5X2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uKHN1YnN0ZXBwZXIpIHtcbiAgICAgIHJldHVybiBzdWJzdGVwcGVyLmluZm8oKTsgXG4gICAgfSk7XG4gIH07XG4gIFxuICAvKipcbiAgICogQGNsYXNzXG4gICAqIEBhdWdtZW50cyB7TXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcn1cbiAgICogQSBcInN1YmNsYXNzXCIgb2YgTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlciBtYWtpbmcgY29udGlub3VzIE5vcm1hbCBwcm9wb3NhbHMuXG4gICAqL1xuICB2YXIgTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgUmVhbE1ldHJvcG9saXNTdGVwcGVyKTtcbiAgfTtcbiAgXG4gIE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTXVsdGlkaW1Db21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI7XG5cbiAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAYXVnbWVudHMge011bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXJ9XG4gICAqIEEgXCJzdWJjbGFzc1wiIG9mIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgbWFraW5nIGRpc2NyZXRpemVkIE5vcm1hbCBwcm9wb3NhbHMuXG4gICAqLyAgICBcbiAgdmFyIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucywgSW50TWV0cm9wb2xpc1N0ZXBwZXIpO1xuICB9O1xuICBcbiAgTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlKTsgXG4gIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjtcbiAgXG4gIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGltcGxlbWVudHMge1N0ZXBwZXJ9XG4gICAqIENvbnN0cnVjdG9yIGZvciBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIGEgc3RlcCBmb3IgYSBiaW5hcnkgcGFyYW1ldGVyLlxuICAgKiBUaGlzIGlzIGRvbmUgYnkgZXZhbHVhdGluZyB0aGUgbG9nIHBvc3RlcmlvciBmb3IgYm90aCBzdGF0ZXMgb2YgdGhlXG4gICAqIHBhcmFtZXRlciBhbmQgdGhlbiBzZWxlY3RpbmcgYSBzdGF0ZSByYW5kb21seSB3aXRoIHByb2JhYmlsaXR5IHJlbGF0aXZlIFxuICAgKiB0byB0aGUgcG9zdGVyaW9yIG9mIGVhY2ggc3RhdGUuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbi5cbiAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gbG9nX3Bvc3QgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci5cbiAgKi9cbiAgdmFyIEJpbmFyeVN0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIFN0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCk7XG4gICAgdmFyIHBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpO1xuICAgIGlmKHBhcmFtX25hbWVzLmxlbmd0aCAgPT0gMSkge1xuICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IFwiQmluYXJ5U3RlcHBlciBjYW4ndCBoYW5kbGUgbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICB9O1xuICBcbiAgQmluYXJ5U3RlcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFN0ZXBwZXIucHJvdG90eXBlKTsgXG4gIEJpbmFyeVN0ZXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQmluYXJ5U3RlcHBlcjtcbiAgXG4gIEJpbmFyeVN0ZXBwZXIucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLnN0YXRlW3RoaXMucGFyYW1fbmFtZV0gPSAwO1xuICAgIHZhciB6ZXJvX2xvZ19kZW5zID0gdGhpcy5sb2dfcG9zdCgpO1xuICAgIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSA9IDE7XG4gICAgdmFyIG9uZV9sb2dfZGVucyA9IHRoaXMubG9nX3Bvc3QoKTtcbiAgICB2YXIgbWF4X2xvZ19kZW5zID0gTWF0aC5tYXgoemVyb19sb2dfZGVucywgb25lX2xvZ19kZW5zKTtcbiAgICB6ZXJvX2xvZ19kZW5zIC09IG1heF9sb2dfZGVucztcbiAgICBvbmVfbG9nX2RlbnMgLT0gbWF4X2xvZ19kZW5zO1xuICAgIHZhciB6ZXJvX3Byb2IgPSBNYXRoLmV4cCh6ZXJvX2xvZ19kZW5zIC0gTWF0aC5sb2coIE1hdGguZXhwKHplcm9fbG9nX2RlbnMpICsgTWF0aC5leHAob25lX2xvZ19kZW5zKSApICk7XG4gICAgaWYoTWF0aC5yYW5kb20oKSA8IHplcm9fcHJvYikge1xuICAgICAgdGhpcy5zdGF0ZVt0aGlzLnBhcmFtX25hbWVdID0gMDtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gLy8gZWxzZSBrZWVwIHRoZSBwYXJhbSBhdCAxIC5cbiAgICByZXR1cm4gMTtcbiAgfTtcbiAgXG4gICAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn1cbiAgICogSnVzdCBsaWtlIE11bHRpZGltQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIgdGhpcyBTdGVwcGVyIHRha2VzIGEgc3RlcHMgZm9yXG4gICAqIGEgbXVsdGlkaW1lbnNpb25hbCBwYXJhbWV0ZXIgYnkgdXBkYXRpbmcgZWFjaCBjb21wb25lbnQgaW4gdHVybi4gVGhlIGRpZmZlcmVuY2VcbiAgICogaXMgdGhhdCB0aGlzIHN0ZXBwZXIgd29ya3Mgb24gYmluYXJ5IHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBmb3IgYSBcbiAgICogICBtdWx0aWRpbWVuc2lvbmFsIHBhcmFtZXRlci5cbiAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gbG9nX3Bvc3QgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci5cbiAgKi9cbiAgdmFyIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIgPSBmdW5jdGlvbihwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCwgb3B0aW9ucykge1xuICAgIFN0ZXBwZXIuY2FsbCh0aGlzLCBwYXJhbXMsIHN0YXRlLCBsb2dfcG9zdCk7XG4gICAgXG4gICAgdmFyIHBhcmFtX25hbWVzID0gT2JqZWN0LmtleXModGhpcy5wYXJhbXMpO1xuICAgIGlmKHBhcmFtX25hbWVzLmxlbmd0aCAgPT0gMSkge1xuICAgICAgdGhpcy5wYXJhbV9uYW1lID0gcGFyYW1fbmFtZXNbMF07XG4gICAgICB2YXIgcGFyYW0gPSB0aGlzLnBhcmFtc1t0aGlzLnBhcmFtX25hbWVdO1xuICAgICAgdGhpcy5kaW0gPSBwYXJhbS5kaW07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IFwiQmluYXJ5Q29tcG9uZW50U3RlcHBlciBjYW4ndCBoYW5kbGUgbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIuXCI7XG4gICAgfVxuICAgIFxuICAgIHZhciBjcmVhdGVfc3Vic3RlcHBlcnMgPSBcbiAgICAgIGZ1bmN0aW9uKGRpbSwgc3Vic3RhdGUsIGxvZ19wb3N0KSB7XG4gICAgICB2YXIgc3Vic3RlcHBlcnMgPSBbXTtcbiAgICAgIHZhciBpO1xuICAgICAgaWYoZGltLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBmb3IoaSA9IDA7IGkgPCBkaW1bMF07IGkrKykge1xuICAgICAgICAgIHZhciBzdWJwYXJhbXMgPSB7fTtcbiAgICAgICAgICBzdWJwYXJhbXNbaV0gPSBwYXJhbTtcbiAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IG5ldyBCaW5hcnlTdGVwcGVyKHN1YnBhcmFtcywgc3Vic3RhdGUsIGxvZ19wb3N0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yKGkgPSAwOyBpIDwgZGltWzBdOyBpKyspIHtcbiAgICAgICAgICBzdWJzdGVwcGVyc1tpXSA9IGNyZWF0ZV9zdWJzdGVwcGVycyhkaW0uc2xpY2UoMSksIHN1YnN0YXRlW2ldLCBsb2dfcG9zdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdWJzdGVwcGVycztcbiAgICB9O1xuICAgIFxuICAgIHRoaXMuc3Vic3RlcHBlcnMgPSBjcmVhdGVfc3Vic3RlcHBlcnModGhpcy5kaW0sIHRoaXMuc3RhdGVbdGhpcy5wYXJhbV9uYW1lXSwgdGhpcy5sb2dfcG9zdCk7XG4gIH07XG4gIFxuICBCaW5hcnlDb21wb25lbnRTdGVwcGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3RlcHBlci5wcm90b3R5cGUpOyBcbiAgQmluYXJ5Q29tcG9uZW50U3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCaW5hcnlDb21wb25lbnRTdGVwcGVyO1xuICBcbiAgQmluYXJ5Q29tcG9uZW50U3RlcHBlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIEdvIHRocm91Z2ggdGhlIHN1YnN0ZXBwZXJzIGluIGEgcmFuZG9tIG9yZGVyIGFuZCBjYWxsIHN0ZXAoKSBvbiB0aGVtLlxuICAgIHJldHVybiBuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5KHRoaXMuc3Vic3RlcHBlcnMsIGZ1bmN0aW9uKHN1YnN0ZXBwZXIpIHtyZXR1cm4gc3Vic3RlcHBlci5zdGVwKCk7IH0pO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIEBjbGFzc1xuICAgKiBAaW1wbGVtZW50cyB7U3RlcHBlcn1cbiAgICogVGhpcyBzdGVwcGVyIGNhbiBiZSByZXNwb25zaWJsZSBmb3IgdGFraW5nIGEgc3RlcCBmb3Igb25lIG9yIG1vcmUgcGFyYW1ldGVycy5cbiAgICogRm9yIHJlYWwgYW5kIGludCBwYXJhbWV0ZXJzIGl0IHRha2VzIE1ldHJvcG9saXMgd2l0aGluIEdpYmJzIHN0ZXBzLCBhbmQgZm9yIFxuICAgKiBiaW5hcnkgcGFyYW1ldGVycyBpdCBkb2VzIGV2YWx1YXRlcyB0aGUgcG9zdGVyaW9yIGZvciBib3RoIHBhcmFtdGVyIHZhbHVlcyBhbmRcbiAgICogcmFuZG9tbHkgY2hhbmdlcyB0byBhIGNlcnRhaW4gdmFsdWUgcHJvcG9ydGlvbmFsbHkgdG8gdGhhdCB2YWx1ZSdzIHBvc3RlcmlvclxuICAgKiAodGhpcyBpcyBhbHNvIGRvbmUgZm9yIGVhY2ggcGFyYW1ldGVyLCBzbyBhbHNvIGEgKiB3aXRoaW4gR2liYnMgYXBwcm9hY2gpLlxuICAgKiBUaGlzIHN0ZXBwZXIgaXMgYWxzbyBhZGFwdGl2ZSBhbmQgY2FuIGJlIGVmZmljaWVudCB3aGVuIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVyc1xuICAgKiBhcmUgbm90IHRvbyBoaWdoIGFuZCB0aGUgY29ycmVsYXRpb25zIGJldHdlZW4gcGFyYW1ldGVycyBhcmUgbG93LlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQW4gb2JqZWN0IHdpdGggYSBvbmUgb3IgbW9yZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbnNcbiAgICogQHBhcmFtIHN0YXRlIC0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHN0YXRlIG9mIGFsbCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gbG9nX3Bvc3QgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbG9nIGRlbnNpdHkgdGhhdCBkZXBlbmRzIG9uIHRoZSBzdGF0ZS4gXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc3RlcHBlci5cbiAgKi9cbiAgdmFyIEFtd2dTdGVwcGVyID0gZnVuY3Rpb24ocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIHtcbiAgICBTdGVwcGVyLmNhbGwodGhpcywgcGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QpO1xuICAgIHRoaXMucGFyYW1fbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcyk7XG4gICAgdGhpcy5zdWJzdGVwcGVycyA9IFtdO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnBhcmFtX25hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbdGhpcy5wYXJhbV9uYW1lc1tpXV07XG4gICAgICB2YXIgU2VsZWN0U3RlcHBlcjtcbiAgICAgIHN3aXRjaCAocGFyYW0udHlwZSkge1xuICAgICAgICBjYXNlIFwicmVhbFwiOlxuICAgICAgICAgIGlmKGFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSkge1xuICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IFJlYWxNZXRyb3BvbGlzU3RlcHBlcjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IE11bHRpUmVhbENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImludFwiOlxuICAgICAgICAgIGlmKGFycmF5X2VxdWFsKHBhcmFtLmRpbSwgWzFdKSkge1xuICAgICAgICAgICAgU2VsZWN0U3RlcHBlciA9IEludE1ldHJvcG9saXNTdGVwcGVyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gTXVsdGlJbnRDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJiaW5hcnlcIjpcbiAgICAgICAgICBpZihhcnJheV9lcXVhbChwYXJhbS5kaW0sIFsxXSkpIHtcbiAgICAgICAgICAgIFNlbGVjdFN0ZXBwZXIgPSBCaW5hcnlTdGVwcGVyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBTZWxlY3RTdGVwcGVyID0gQmluYXJ5Q29tcG9uZW50U3RlcHBlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgXCJBbXdnU3RlcHBlciBjYW4ndCBoYW5kbGUgcGFyYW1ldGVyIFwiICsgdGhpcy5wYXJhbV9uYW1lc1tpXSAgK1wiIHdpdGggdHlwZSBcIiArIHBhcmFtLnR5cGU7IFxuICAgICAgfVxuICAgICAgdmFyIHBhcmFtX29iamVjdF93cmFwID0ge307XG4gICAgICBwYXJhbV9vYmplY3Rfd3JhcFt0aGlzLnBhcmFtX25hbWVzW2ldXSA9IHBhcmFtO1xuICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgICB2YXIgcGFyYW1fb3B0aW9ucyA9IG9wdGlvbnMucGFyYW1zICYmIG9wdGlvbnMucGFyYW1zW3RoaXMucGFyYW1fbmFtZXNbaV1dIHx8IHt9O1xuICAgICAgcGFyYW1fb3B0aW9ucy5wcm9wX2xvZ19zY2FsZSAgICAgPSBwYXJhbV9vcHRpb25zLnByb3BfbG9nX3NjYWxlICAgICB8fCBvcHRpb25zLnByb3BfbG9nX3NjYWxlOyBcbiAgICAgIHBhcmFtX29wdGlvbnMuYmF0Y2hfc2l6ZSAgICAgICAgID0gcGFyYW1fb3B0aW9ucy5iYXRjaF9zaXplICAgICAgICAgfHwgb3B0aW9ucy5iYXRjaF9zaXplOyBcbiAgICAgIHBhcmFtX29wdGlvbnMubWF4X2FkYXB0YXRpb24gICAgID0gcGFyYW1fb3B0aW9ucy5tYXhfYWRhcHRhdGlvbiAgICAgfHwgb3B0aW9ucy5tYXhfYWRhcHRhdGlvbjtcbiAgICAgIHBhcmFtX29wdGlvbnMuaW5pdGlhbF9hZGFwdGF0aW9uID0gcGFyYW1fb3B0aW9ucy5pbml0aWFsX2FkYXB0YXRpb24gfHwgb3B0aW9ucy5pbml0aWFsX2FkYXB0YXRpb247XG4gICAgICBwYXJhbV9vcHRpb25zLnRhcmdldF9hY2NlcHRfcmF0ZSA9IHBhcmFtX29wdGlvbnMudGFyZ2V0X2FjY2VwdF9yYXRlIHx8IG9wdGlvbnMudGFyZ2V0X2FjY2VwdF9yYXRlOyBcbiAgICAgIHBhcmFtX29wdGlvbnMuaXNfYWRhcHRpbmcgICAgICAgID0gcGFyYW1fb3B0aW9ucy5pc19hZGFwdGluZyAgICAgICAgfHwgb3B0aW9ucy5pc19hZGFwdGluZzsgXG4gICAgICB0aGlzLnN1YnN0ZXBwZXJzW2ldID0gbmV3IFNlbGVjdFN0ZXBwZXIocGFyYW1fb2JqZWN0X3dyYXAsIHN0YXRlLCBsb2dfcG9zdCwgcGFyYW1fb3B0aW9ucyk7XG4gICAgfVxuICB9O1xuICBcbiAgQW13Z1N0ZXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdGVwcGVyLnByb3RvdHlwZSk7IFxuICBBbXdnU3RlcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBbXdnU3RlcHBlcjtcbiAgXG4gIEFtd2dTdGVwcGVyLnByb3RvdHlwZS5zdGVwID0gZnVuY3Rpb24oKSB7XG4gICAgc2h1ZmZsZV9hcnJheSh0aGlzLnN1YnN0ZXBwZXJzKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5zdWJzdGVwcGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5zdWJzdGVwcGVyc1tpXS5zdGVwKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICB9O1xuICBcbiAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLnN0YXJ0X2FkYXB0YXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5zdWJzdGVwcGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5zdWJzdGVwcGVyc1tpXS5zdGFydF9hZGFwdGF0aW9uKCk7XG4gICAgfVxuICB9O1xuICBcbiAgQW13Z1N0ZXBwZXIucHJvdG90eXBlLnN0b3BfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnN1YnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnN1YnN0ZXBwZXJzW2ldLnN0b3BfYWRhcHRhdGlvbigpO1xuICAgIH0gXG4gIH07XG4gIFxuICBBbXdnU3RlcHBlci5wcm90b3R5cGUuaW5mbyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpbmZvID0ge307XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic3RlcHBlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGluZm9bdGhpcy5wYXJhbV9uYW1lc1tpXV0gPSB0aGlzLnN1YnN0ZXBwZXJzW2ldLmluZm8oKTtcbiAgICB9XG4gICAgcmV0dXJuIGluZm87XG4gIH07XG4gIFxuICBcbiAgXG4gIC8vLy8vLy8vLy8vIFNhbXBsZXIgRnVuY3Rpb25zIC8vLy8vLy8vLy9cbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICBcbiAgXG4gICAvKipcbiAgICogQGludGVyZmFjZVxuICAgKiBXaGlsZSB5b3UgY291bGQgZml0IGEgbW9kZWwgYnkgcGFzdGluZyB0b2dldGhlciBTdGVwcGVycywgYVxuICAvLyBTYW1wbGVyIGlzIGhlcmUgaXMgYSBjb252ZW5pZW5jZSBjbGFzcyB3aGVyZSBhbiBpbnN0YW5jZSBvZiBTYW1wbGVyXG4gIC8vIHNldHMgdXAgdGhlIFN0ZXBwZXJzLCBjaGVja3MgdGhlIHBhcmFtZXRlciBkZWZpbml0aW9uLFxuICAvLyBhbmQgbWFuYWdlcyB0aGUgc2FtcGxpbmcuIFRoaXMgaGVyZSBkZWZpbmVzIHRoZSBTYW1wbGVyIFwiaW50ZXJmYWNlXCIuXG4gICAqIEBpbnRlcmZhY2VcbiAgICogQHBhcmFtIHBhcmFtcyAtIEFuIG9iamVjdCB3aXRoIHBhcmFtZXRlciBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGU6XG4gICAqICAge1wibXVcIjoge1widHlwZVwiOiBcInJlYWxcIn0sIFwic2lnbWFcIjoge1widHlwZVwiOiBcInJlYWxcIiwgXCJsb3dlclwiID0gMH19XG4gICAqICAgVGhlIHBhcmFtZXRlciBkZWZpbml0aW9ucyBkb2Vzbid0IGhhdmUgdG8gYmUgXCJjb21wbGV0ZVwiIGFuZCBwcm9wZXJ0aWVzXG4gICAqICAgbGVmdCBvdXQgKGxpa2UgbG93ZXIgYW5kIHVwcGVyKSB3aWxsIGJlIGZpbGxlZCBpbiBieSBkZWZhdWx0cy5cbiAgICogQHBhcmFtIGxvZ19wb3N0IC0gQSBmdW5jdGlvbiB3aXRoIHNpZ25hdHVyZSBmdW5jdGlvbihzdGF0ZSwgZGF0YSkuIEhlcmVcbiAgICogICBzdGF0ZSB3aWxsIGJlIGFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHN0YXRlIHdpdGggZWFjaCBwYXJhbWV0ZXIgYXMgYSBcbiAgICogICBrZXkgYW5kIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIGFzIG51bWJlcnMgb3IgYXJyYXlzLiBGb3IgZXhhbXBsZTpcbiAgICogICB7XCJtdVwiOiAzLCBcInNpZ21hXCI6IDEuNX0uIFRoZSBkYXRhIGFyZ3VtZW50IHdpbGwgYmUgdGhlIHNhbWUgb2JqZWN0IGFzIFxuICAgKiAgIHRoZSBkYXRhIGFyZ3VtZW50IGdpdmVuIGJlbG93LlxuICAgKiBAcGFyYW0gZGF0YSAtIGFuIG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIG9uIHRvIHRoZSBsb2dfcG9zdCBmdW5jdGlvblxuICAgKiAgIHdoZW4gc2FtcGxpbmcuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gYW4gb2JqZWN0IHdpdGggb3B0aW9ucyB0byB0aGUgc2FtcGxlci5cbiAgICovXG4gIHZhciBTYW1wbGVyID0gZnVuY3Rpb24ocGFyYW1zLCBsb2dfcG9zdCwgZGF0YSwgb3B0aW9ucykge1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5wYXJhbV9uYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMucGFyYW1zKTtcbiAgICBcbiAgICAvLyBTZXR0aW5nIGRlZmF1bHQgb3B0aW9ucyBpZiBub3QgcGFzc2VkIHRocm91Z2ggdGhlIG9wdGlvbnMgb2JqZWN0XG4gICAgdGhpcy5wYXJhbV9pbml0X2Z1biAgID0gZ2V0X29wdGlvbihcInBhcmFtX2luaXRfZnVuXCIsIG9wdGlvbnMsIHBhcmFtX2luaXRfZml4ZWQpO1xuICAgIHZhciB0aGlubmluZ19pbnRlcnZhbCA9IGdldF9vcHRpb24oXCJ0aGluXCIsIG9wdGlvbnMsIDEpO1xuICAgIHZhciBwYXJhbXNfdG9fbW9uaXRvciA9IGdldF9vcHRpb24oXCJtb25pdG9yXCIsIG9wdGlvbnMsIG51bGwpO1xuICAgIHRoaXMudGhpbih0aGlubmluZ19pbnRlcnZhbCk7XG4gICAgdGhpcy5tb25pdG9yKHBhcmFtc190b19tb25pdG9yKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIC8vIENvbXBsZXRpbmcgdGhlIHBhcmFtcyBhbmQgaW5pdGlhbGl6aW5nIHRoZSBzdGF0ZS5cbiAgICB0aGlzLnBhcmFtcyA9IGNvbXBsZXRlX3BhcmFtcyh0aGlzLnBhcmFtcywgdGhpcy5wYXJhbV9pbml0X2Z1bik7XG4gICAgdmFyIHN0YXRlID0ge307XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMucGFyYW1fbmFtZXMubGVuZ3RoOyBpKysgKSB7XG4gICAgICBzdGF0ZVt0aGlzLnBhcmFtX25hbWVzW2ldXSA9IHRoaXMucGFyYW1zW3RoaXMucGFyYW1fbmFtZXNbaV1dLmluaXQ7XG4gICAgfVxuICAgIHRoaXMubG9nX3Bvc3QgPSBmdW5jdGlvbigpIHsgXG4gICAgICByZXR1cm4gbG9nX3Bvc3Qoc3RhdGUsIGRhdGEpO1xuICAgIH07XG4gICAgLy8gUnVubmluZyB0aGUgbG9nX3Bvc3QgZnVuY3Rpb24gb25jZSBpbiBjYXNlIGl0IGZ1cnRoZXIgbW9kaWZpZXMgdGhlIHN0YXRlXG4gICAgLy8gZm9yIGV4YW1wbGUgYWRkaW5nIGRlcml2ZWQgcXVhbnRpdGllcy5cbiAgICB0aGlzLmxvZ19wb3N0KCk7XG4gICAgdGhpcy5zdGF0ZSA9IHN0YXRlO1xuICAgIHRoaXMuc3RlcHBlcnMgPSB0aGlzLmNyZWF0ZV9zdGVwcGVyX2Vuc2FtYmxlKHRoaXMucGFyYW1zLCB0aGlzLnN0YXRlLCB0aGlzLmxvZ19wb3N0LCB0aGlzLm9wdGlvbnMpO1xuICB9O1xuICBcbiAgLyoqIFNob3VsZCByZXR1cm4gYSB2ZWN0b3Igb2Ygc3RlcHBlcnMgdGhhdCB3aGVuIGNhbGxlZCBcbiAgICogc2hvdWxkIHRha2UgYSBzdGVwIGluIHRoZSBwYXJhbWV0ZXIgc3BhY2UuXG4gICAqL1xuICBTYW1wbGVyLnByb3RvdHlwZS5jcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSA9IGZ1bmN0aW9uKHN0YXRlLCBsb2dfcG9zdCl7XG4gICAgdGhyb3cgXCJFdmVyeSBTYW1wbGVyIG5lZWRzIHRvIGltcGxlbWVudCBjcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSgpXCI7XG4gIH07XG4gIFxuICAvKiogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBpbmZvIGFib3V0IHRoZSBzdGF0ZSBvZiB0aGUgU2FtcGxlci5cbiAgICovIFxuICBTYW1wbGVyLnByb3RvdHlwZS5pbmZvID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHtzdGF0ZTogdGhpcy5zdGF0ZSwgdGhpbjogdGhpcy50aGluLCBtb25pdG9yOiB0aGlzLm1vbml0b3IsXG4gICAgICAgICAgICBzdGVwcGVyczogdGhpcy5zdGVwcGVyc307XG4gIH07XG4gIFxuICAvKiogVGFrZXMgYSBzdGVwIGluIHRoZSBwYXJhbWV0ZXIgc3BhY2UuIFJldHVybnMgdGhlIG5ldyBzcGFjZVxuICAgKiBidXQgYWxzbyBtb2RpZmllcyB0aGUgc3RhdGUgaW4gcGxhY2UuXG4gICAqLyBcbiAgU2FtcGxlci5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uKCkge1xuICAgIHNodWZmbGVfYXJyYXkodGhpcy5zdGVwcGVycyk7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuc3RlcHBlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuc3RlcHBlcnNbaV0uc3RlcCgpO1xuICAgIH1cbiAgICBpZihPYmplY3Qua2V5cyh0aGlzLnN0YXRlKS5sZW5ndGggPiBPYmplY3Qua2V5cyh0aGlzLnBhcmFtcykubGVuZ3RoKSB7XG4gICAgICAvLyBUaGUgc3RhdGUgY29udGFpbnMgZGV2aXZlZCBxdWFudGl0aWVzIChub3Qgb25seSBwYXJhbWV0ZXJzKSBhbmQgd2VcbiAgICAgIC8vIG5lZWQgdG8gcnVuIHRoZSBsb2dfcG9zdCBvbmNlIG1vcmUgaW4gb3JkZXIgdG8gc2V0IHRoZSBkZXJpdmVkIHF1YW50aXRpZXNcbiAgICAgIC8vIGZvciB0aGUgZmluYWwgcGFyYW1ldGVyIHN0YXRlXG4gICAgICB0aGlzLmxvZ19wb3N0KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFRha2VzIG5faXRlcmF0aW9ucyBzdGVwcyBpbiB0aGUgcGFyYW1ldGVyIHNwYWNlIGFuZCByZXR1cm5zIHRoZW1cbiAgICogYXMgYW4gb2JqZWN0IG9mIGFycmF5cyB3aXRoIG9uZSBhcnJheSBwZXIgcGFyYW1ldGVyLiBGb3IgZXhhbXBsZTpcbiAgICoge211OiBbMSwgLTEsIDIsIDMsIC4uLl0sIHNpZ21hOiBbMSwgMiwgMiwgMSwgLi4uXX0uXG4gICAqIElmIHRoaW4gaXMgPiAxIHRoZW4gbl9pdGVyYXRpb25zIC8gdGhpbiBzYW1wbGVzIGFyZSByZXR1cm5lZC5cbiAgICovIFxuICBTYW1wbGVyLnByb3RvdHlwZS5zYW1wbGUgPSBmdW5jdGlvbihuX2l0ZXJhdGlvbnMpIHtcbiAgICAgIC8vIEluaXRpYWxpemluZyBjdXJyX3NhbXBsZSB3aGVyZSB0aGUgc2FtcGxlIGlzIGdvaW5nIHRvIGJlIHNhdmVkXG4gICAgICAvLyBhcyBhbiBvYmplY3QgY29udGFpbmluZyBvbmUgYXJyYXkgcGVyIHBhcmFtZXRlciB0byBiZSBtb25pdG9yZWQuXG4gICAgICB2YXIgaSwgaiwgbW9uaXRvcmVkX3BhcmFtcztcbiAgICAgIGlmKHRoaXMubW9uaXRvcmVkX3BhcmFtcyA9PT0gbnVsbCkge1xuICAgICAgICBtb25pdG9yZWRfcGFyYW1zID0gT2JqZWN0LmtleXModGhpcy5zdGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtb25pdG9yZWRfcGFyYW1zID0gdGhpcy5tb25pdG9yZWRfcGFyYW1zO1xuICAgICAgfVxuICAgICAgXG4gICAgICB2YXIgY3Vycl9zYW1wbGUgPSB7fTtcbiAgICAgIGZvcihqID0gMDsgaiA8IG1vbml0b3JlZF9wYXJhbXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY3Vycl9zYW1wbGVbbW9uaXRvcmVkX3BhcmFtc1tqXV0gPSBbXTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgZm9yKGkgPSAwOyBpIDwgbl9pdGVyYXRpb25zOyBpKyspIHtcbiAgICAgICAgaWYoaSAlIHRoaXMudGhpbm5pbmdfaW50ZXJ2YWwgPT09IDApIHtcbiAgICAgICAgICBmb3IoaiA9IDA7IGogPCBtb25pdG9yZWRfcGFyYW1zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICB2YXIgcGFyYW0gPSBtb25pdG9yZWRfcGFyYW1zW2pdO1xuICAgICAgICAgICAgY3Vycl9zYW1wbGVbcGFyYW1dLnB1c2goIGNsb25lX3BhcmFtX2RyYXcodGhpcy5zdGF0ZVtwYXJhbV0pICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RlcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGN1cnJfc2FtcGxlO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIFRha2VzIG5faXRlcmF0aW9uIHN0ZXBzIGluIHBhcmFtZXRlciBzcGFjZSBidXQgcmV0dXJucyBub3RoaW5nLlxuICAgKi8gXG4gIFNhbXBsZXIucHJvdG90eXBlLmJ1cm4gPSBmdW5jdGlvbihuX2l0ZXJhdGlvbnMpIHtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbl9pdGVyYXRpb25zOyBpKyspIHtcbiAgICAgIHRoaXMuc3RlcCgpO1xuICAgIH1cbiAgfTtcbiAgXG4gIC8qKlxuICAgKiBTZXRzIHdoYXQgcGFyYW1ldGVycyBzaG91bGQgYmUgbW9uaXRvcmVkIGFuZCByZXR1cm5lZCB3aGVuIGNhbGxpbmdcbiAgICogc2FtcGxlLlxuICAgKi8gXG4gIFNhbXBsZXIucHJvdG90eXBlLm1vbml0b3IgPSBmdW5jdGlvbihwYXJhbXNfdG9fbW9uaXRvcikge1xuICAgICAgdGhpcy5tb25pdG9yZWRfcGFyYW1zID0gcGFyYW1zX3RvX21vbml0b3I7XG4gIH07XG4gIFxuICAvKipcbiAgICogU2V0cyB0aGUgdGhpbm5pbmcuIEZvciBleGFtcGxlIHRoaW4gPT0gMTAgbWVhbnMgdGhhdCBldmVyeSAxMHRoIHBvc3RlcmlvclxuICAgKiBkcmF3IHdpbGwgYmUga2VwdC5cbiAgICovIFxuICBTYW1wbGVyLnByb3RvdHlwZS50aGluID0gZnVuY3Rpb24odGhpbm5pbmdfaW50ZXJ2YWwpIHtcbiAgICB0aGlzLnRoaW5uaW5nX2ludGVydmFsID0gdGhpbm5pbmdfaW50ZXJ2YWw7XG4gIH07XG4gIFxuICAvKipcbiAgICogU2V0cyBhZGFwdGF0aW9uIG9uLCBpZiBhcHBsaWNhYmxlLCBpbiBhbGwgc3RlcHBlcnMuXG4gICAqLyBcbiAgU2FtcGxlci5wcm90b3R5cGUuc3RhcnRfYWRhcHRhdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnN0ZXBwZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnN0ZXBwZXJzW2ldLnN0YXJ0X2FkYXB0YXRpb24oKTtcbiAgICB9XG4gIH07XG4gIFxuICAgIC8qKlxuICAgKiBTZXRzIGFkYXB0YXRpb24gb2ZmLCBpZiBhcHBsaWNhYmxlLCBpbiBhbGwgc3RlcHBlcnMuXG4gICAqLyBcbiAgU2FtcGxlci5wcm90b3R5cGUuc3RvcF9hZGFwdGF0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuc3RlcHBlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuc3RlcHBlcnNbaV0uc3RvcF9hZGFwdGF0aW9uKCk7XG4gICAgfVxuICB9O1xuICBcbiAgIC8qKlxuICAgKiBAY2xhc3NcbiAgICogQGltcGxlbWVudHMge1NhbXBsZXJ9XG4gICAqIFRoaXMgc2FtcGxlciB1c2VzIHRoZSBBbXdnU3RlcHBlciBhcyB0aGUgc3RlcHBlciBmdW5jdGlvbiB3aGljaCBpbXBsZW1lbnRzIHRoZSBcbiAgICogQWRhcHRpdmUgTWV0cm9wb2xpcy1XaXRoaW4tR2liYnMgYWxnb3JpdGhtIGluIFwiRXhhbXBsZXMgb2YgQWRhcHRpdmUgTUNNQ1wiXG4gICAqIGJ5IFJvYmVydHMgYW5kIFJvc2VudGhhbCAoMjAwOCkuIEFuIGFkaXRpb24gaXMgdGhhdCBpdCBoYW5kbGVzIGludCBwYXJhbWV0ZXJzXG4gICAqIGJ5IG1ha2luZyBkaXNjcmV0ZSBOb3JtYWwgcHJvcG9zYWxzIGFuZCBiaW5hcnkgcGFyYW1ldGVycyBieSB0YWtpbmcgb24gYSBuZXcgXG4gICAqIHZhbHVlIHByb3BvcnRpb25hbCB0byB0aGUgcG9zdGVyaW9yIG9mIHRoZSB0d28gcG9zc2libGUgc3RhdGVzIG9mIHRoZVxuICAgKiBwYXJhbWV0ZXIuIFRoaXMgc2FtcGxlciBjYW4gYmUgZWZmaWNpZW50IHdoZW4gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzXG4gICAqIGFyZSBub3QgdG9vIGhpZ2ggYW5kIHRoZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBwYXJhbWV0ZXJzIGFyZSBsb3cuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBbiBvYmplY3Qgd2l0aCBhIG9uZSBvciBtb3JlIHBhcmFtZXRlciBkZWZpbml0aW9uc1xuICAgKiBAcGFyYW0gc3RhdGUgLSBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgc3RhdGUgb2YgYWxsIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSBsb2dfcG9zdCAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBsb2cgZGVuc2l0eSB0aGF0IGRlcGVuZHMgb24gdGhlIHN0YXRlLiBcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25zIHRvIHRoZSBzdGVwcGVyLlxuICAqL1xuICB2YXIgQW13Z1NhbXBsZXIgPSBmdW5jdGlvbihwYXJhbXMsIGxvZ19wb3N0LCBkYXRhLCBvcHRpb25zKSB7XG4gICAgU2FtcGxlci5jYWxsKHRoaXMsIHBhcmFtcywgbG9nX3Bvc3QsIGRhdGEsIG9wdGlvbnMpO1xuICB9O1xuICBcbiAgQW13Z1NhbXBsZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTYW1wbGVyLnByb3RvdHlwZSk7IFxuICBBbXdnU2FtcGxlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBbXdnU2FtcGxlcjtcbiAgXG4gIEFtd2dTYW1wbGVyLnByb3RvdHlwZS5jcmVhdGVfc3RlcHBlcl9lbnNhbWJsZSA9IGZ1bmN0aW9uKHBhcmFtcywgc3RhdGUsIGxvZ19wb3N0LCBvcHRpb25zKXtcbiAgICByZXR1cm4gWyBuZXcgQW13Z1N0ZXBwZXIocGFyYW1zLCBzdGF0ZSwgbG9nX3Bvc3QsIG9wdGlvbnMpIF07XG4gIH07XG4gIFxuICBcbiAgLy8gUmV0dXJuaW5nIHRoZSBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgcHVibGljbHkgZXhwb3NlZCBieSB0aGlzIG1vZHVsZVxuICByZXR1cm4ge1xuICAgIHJ1bmlmOiBydW5pZixcbiAgICBydW5pZl9kaXNjcmV0ZTogcnVuaWZfZGlzY3JldGUsXG4gICAgcm5vcm06IHJub3JtLFxuICAgIHBhcmFtX2luaXRfZml4ZWQ6IHBhcmFtX2luaXRfZml4ZWQsIFxuICAgIGNvbXBsZXRlX3BhcmFtczogY29tcGxldGVfcGFyYW1zLCBcbiAgICBSZWFsTWV0cm9wb2xpc1N0ZXBwZXI6IFJlYWxNZXRyb3BvbGlzU3RlcHBlciwgXG4gICAgSW50TWV0cm9wb2xpc1N0ZXBwZXI6IEludE1ldHJvcG9saXNTdGVwcGVyLCBcbiAgICBNdWx0aVJlYWxDb21wb25lbnRNZXRyb3BvbGlzU3RlcHBlcjogTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIsIFxuICAgIE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXI6IE11bHRpSW50Q29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIsIFxuICAgIEJpbmFyeVN0ZXBwZXI6IEJpbmFyeVN0ZXBwZXIsIFxuICAgIEJpbmFyeUNvbXBvbmVudFN0ZXBwZXI6IEJpbmFyeUNvbXBvbmVudFN0ZXBwZXIsIFxuICAgIEFtd2dTdGVwcGVyOiBBbXdnU3RlcHBlciwgXG4gICAgQW13Z1NhbXBsZXI6IEFtd2dTYW1wbGVyXG4gIH07XG59KSk7XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhc2NlbmRpbmcoYSwgYikge1xuICByZXR1cm4gYSA9PSBudWxsIHx8IGIgPT0gbnVsbCA/IE5hTiA6IGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiBhID49IGIgPyAwIDogTmFOO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbnVtYmVyKHgpIHtcbiAgcmV0dXJuIHggPT09IG51bGwgPyBOYU4gOiAreDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBudW1iZXJzKHZhbHVlcywgdmFsdWVvZikge1xuICBpZiAodmFsdWVvZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAodmFsdWUgPSArdmFsdWUpID49IHZhbHVlKSB7XG4gICAgICAgIHlpZWxkIHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlLCArK2luZGV4LCB2YWx1ZXMpKSAhPSBudWxsICYmICh2YWx1ZSA9ICt2YWx1ZSkgPj0gdmFsdWUpIHtcbiAgICAgICAgeWllbGQgdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgYXNjZW5kaW5nIGZyb20gXCIuL2FzY2VuZGluZy5qc1wiO1xuaW1wb3J0IHBlcm11dGUgZnJvbSBcIi4vcGVybXV0ZS5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzb3J0KHZhbHVlcywgLi4uRikge1xuICBpZiAodHlwZW9mIHZhbHVlc1tTeW1ib2wuaXRlcmF0b3JdICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJ2YWx1ZXMgaXMgbm90IGl0ZXJhYmxlXCIpO1xuICB2YWx1ZXMgPSBBcnJheS5mcm9tKHZhbHVlcyk7XG4gIGxldCBbZl0gPSBGO1xuICBpZiAoKGYgJiYgZi5sZW5ndGggIT09IDIpIHx8IEYubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IGluZGV4ID0gVWludDMyQXJyYXkuZnJvbSh2YWx1ZXMsIChkLCBpKSA9PiBpKTtcbiAgICBpZiAoRi5sZW5ndGggPiAxKSB7XG4gICAgICBGID0gRi5tYXAoZiA9PiB2YWx1ZXMubWFwKGYpKTtcbiAgICAgIGluZGV4LnNvcnQoKGksIGopID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBmIG9mIEYpIHtcbiAgICAgICAgICBjb25zdCBjID0gYXNjZW5kaW5nRGVmaW5lZChmW2ldLCBmW2pdKTtcbiAgICAgICAgICBpZiAoYykgcmV0dXJuIGM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmID0gdmFsdWVzLm1hcChmKTtcbiAgICAgIGluZGV4LnNvcnQoKGksIGopID0+IGFzY2VuZGluZ0RlZmluZWQoZltpXSwgZltqXSkpO1xuICAgIH1cbiAgICByZXR1cm4gcGVybXV0ZSh2YWx1ZXMsIGluZGV4KTtcbiAgfVxuICByZXR1cm4gdmFsdWVzLnNvcnQoY29tcGFyZURlZmluZWQoZikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZURlZmluZWQoY29tcGFyZSA9IGFzY2VuZGluZykge1xuICBpZiAoY29tcGFyZSA9PT0gYXNjZW5kaW5nKSByZXR1cm4gYXNjZW5kaW5nRGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBjb21wYXJlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjb21wYXJlIGlzIG5vdCBhIGZ1bmN0aW9uXCIpO1xuICByZXR1cm4gKGEsIGIpID0+IHtcbiAgICBjb25zdCB4ID0gY29tcGFyZShhLCBiKTtcbiAgICBpZiAoeCB8fCB4ID09PSAwKSByZXR1cm4geDtcbiAgICByZXR1cm4gKGNvbXBhcmUoYiwgYikgPT09IDApIC0gKGNvbXBhcmUoYSwgYSkgPT09IDApO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNjZW5kaW5nRGVmaW5lZChhLCBiKSB7XG4gIHJldHVybiAoYSA9PSBudWxsIHx8ICEoYSA+PSBhKSkgLSAoYiA9PSBudWxsIHx8ICEoYiA+PSBiKSkgfHwgKGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiAwKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1heCh2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgbGV0IG1heDtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbFxuICAgICAgICAgICYmIChtYXggPCB2YWx1ZSB8fCAobWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbFxuICAgICAgICAgICYmIChtYXggPCB2YWx1ZSB8fCAobWF4ID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1heDtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1pbih2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgbGV0IG1pbjtcbiAgaWYgKHZhbHVlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbFxuICAgICAgICAgICYmIChtaW4gPiB2YWx1ZSB8fCAobWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtaW4gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZSwgKytpbmRleCwgdmFsdWVzKSkgIT0gbnVsbFxuICAgICAgICAgICYmIChtaW4gPiB2YWx1ZSB8fCAobWluID09PSB1bmRlZmluZWQgJiYgdmFsdWUgPj0gdmFsdWUpKSkge1xuICAgICAgICBtaW4gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1pbjtcbn1cbiIsImltcG9ydCB7YXNjZW5kaW5nRGVmaW5lZCwgY29tcGFyZURlZmluZWR9IGZyb20gXCIuL3NvcnQuanNcIjtcblxuLy8gQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL21vdXJuZXIvcXVpY2tzZWxlY3Rcbi8vIElTQyBsaWNlbnNlLCBDb3B5cmlnaHQgMjAxOCBWbGFkaW1pciBBZ2Fmb25raW4uXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWlja3NlbGVjdChhcnJheSwgaywgbGVmdCA9IDAsIHJpZ2h0ID0gSW5maW5pdHksIGNvbXBhcmUpIHtcbiAgayA9IE1hdGguZmxvb3Ioayk7XG4gIGxlZnQgPSBNYXRoLmZsb29yKE1hdGgubWF4KDAsIGxlZnQpKTtcbiAgcmlnaHQgPSBNYXRoLmZsb29yKE1hdGgubWluKGFycmF5Lmxlbmd0aCAtIDEsIHJpZ2h0KSk7XG5cbiAgaWYgKCEobGVmdCA8PSBrICYmIGsgPD0gcmlnaHQpKSByZXR1cm4gYXJyYXk7XG5cbiAgY29tcGFyZSA9IGNvbXBhcmUgPT09IHVuZGVmaW5lZCA/IGFzY2VuZGluZ0RlZmluZWQgOiBjb21wYXJlRGVmaW5lZChjb21wYXJlKTtcblxuICB3aGlsZSAocmlnaHQgPiBsZWZ0KSB7XG4gICAgaWYgKHJpZ2h0IC0gbGVmdCA+IDYwMCkge1xuICAgICAgY29uc3QgbiA9IHJpZ2h0IC0gbGVmdCArIDE7XG4gICAgICBjb25zdCBtID0gayAtIGxlZnQgKyAxO1xuICAgICAgY29uc3QgeiA9IE1hdGgubG9nKG4pO1xuICAgICAgY29uc3QgcyA9IDAuNSAqIE1hdGguZXhwKDIgKiB6IC8gMyk7XG4gICAgICBjb25zdCBzZCA9IDAuNSAqIE1hdGguc3FydCh6ICogcyAqIChuIC0gcykgLyBuKSAqIChtIC0gbiAvIDIgPCAwID8gLTEgOiAxKTtcbiAgICAgIGNvbnN0IG5ld0xlZnQgPSBNYXRoLm1heChsZWZ0LCBNYXRoLmZsb29yKGsgLSBtICogcyAvIG4gKyBzZCkpO1xuICAgICAgY29uc3QgbmV3UmlnaHQgPSBNYXRoLm1pbihyaWdodCwgTWF0aC5mbG9vcihrICsgKG4gLSBtKSAqIHMgLyBuICsgc2QpKTtcbiAgICAgIHF1aWNrc2VsZWN0KGFycmF5LCBrLCBuZXdMZWZ0LCBuZXdSaWdodCwgY29tcGFyZSk7XG4gICAgfVxuXG4gICAgY29uc3QgdCA9IGFycmF5W2tdO1xuICAgIGxldCBpID0gbGVmdDtcbiAgICBsZXQgaiA9IHJpZ2h0O1xuXG4gICAgc3dhcChhcnJheSwgbGVmdCwgayk7XG4gICAgaWYgKGNvbXBhcmUoYXJyYXlbcmlnaHRdLCB0KSA+IDApIHN3YXAoYXJyYXksIGxlZnQsIHJpZ2h0KTtcblxuICAgIHdoaWxlIChpIDwgaikge1xuICAgICAgc3dhcChhcnJheSwgaSwgaiksICsraSwgLS1qO1xuICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyYXlbaV0sIHQpIDwgMCkgKytpO1xuICAgICAgd2hpbGUgKGNvbXBhcmUoYXJyYXlbal0sIHQpID4gMCkgLS1qO1xuICAgIH1cblxuICAgIGlmIChjb21wYXJlKGFycmF5W2xlZnRdLCB0KSA9PT0gMCkgc3dhcChhcnJheSwgbGVmdCwgaik7XG4gICAgZWxzZSArK2osIHN3YXAoYXJyYXksIGosIHJpZ2h0KTtcblxuICAgIGlmIChqIDw9IGspIGxlZnQgPSBqICsgMTtcbiAgICBpZiAoayA8PSBqKSByaWdodCA9IGogLSAxO1xuICB9XG5cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5mdW5jdGlvbiBzd2FwKGFycmF5LCBpLCBqKSB7XG4gIGNvbnN0IHQgPSBhcnJheVtpXTtcbiAgYXJyYXlbaV0gPSBhcnJheVtqXTtcbiAgYXJyYXlbal0gPSB0O1xufVxuIiwiaW1wb3J0IG1heCBmcm9tIFwiLi9tYXguanNcIjtcbmltcG9ydCBtYXhJbmRleCBmcm9tIFwiLi9tYXhJbmRleC5qc1wiO1xuaW1wb3J0IG1pbiBmcm9tIFwiLi9taW4uanNcIjtcbmltcG9ydCBtaW5JbmRleCBmcm9tIFwiLi9taW5JbmRleC5qc1wiO1xuaW1wb3J0IHF1aWNrc2VsZWN0IGZyb20gXCIuL3F1aWNrc2VsZWN0LmpzXCI7XG5pbXBvcnQgbnVtYmVyLCB7bnVtYmVyc30gZnJvbSBcIi4vbnVtYmVyLmpzXCI7XG5pbXBvcnQge2FzY2VuZGluZ0RlZmluZWR9IGZyb20gXCIuL3NvcnQuanNcIjtcbmltcG9ydCBncmVhdGVzdCBmcm9tIFwiLi9ncmVhdGVzdC5qc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBxdWFudGlsZSh2YWx1ZXMsIHAsIHZhbHVlb2YpIHtcbiAgdmFsdWVzID0gRmxvYXQ2NEFycmF5LmZyb20obnVtYmVycyh2YWx1ZXMsIHZhbHVlb2YpKTtcbiAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpIHx8IGlzTmFOKHAgPSArcCkpIHJldHVybjtcbiAgaWYgKHAgPD0gMCB8fCBuIDwgMikgcmV0dXJuIG1pbih2YWx1ZXMpO1xuICBpZiAocCA+PSAxKSByZXR1cm4gbWF4KHZhbHVlcyk7XG4gIHZhciBuLFxuICAgICAgaSA9IChuIC0gMSkgKiBwLFxuICAgICAgaTAgPSBNYXRoLmZsb29yKGkpLFxuICAgICAgdmFsdWUwID0gbWF4KHF1aWNrc2VsZWN0KHZhbHVlcywgaTApLnN1YmFycmF5KDAsIGkwICsgMSkpLFxuICAgICAgdmFsdWUxID0gbWluKHZhbHVlcy5zdWJhcnJheShpMCArIDEpKTtcbiAgcmV0dXJuIHZhbHVlMCArICh2YWx1ZTEgLSB2YWx1ZTApICogKGkgLSBpMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWFudGlsZVNvcnRlZCh2YWx1ZXMsIHAsIHZhbHVlb2YgPSBudW1iZXIpIHtcbiAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpIHx8IGlzTmFOKHAgPSArcCkpIHJldHVybjtcbiAgaWYgKHAgPD0gMCB8fCBuIDwgMikgcmV0dXJuICt2YWx1ZW9mKHZhbHVlc1swXSwgMCwgdmFsdWVzKTtcbiAgaWYgKHAgPj0gMSkgcmV0dXJuICt2YWx1ZW9mKHZhbHVlc1tuIC0gMV0sIG4gLSAxLCB2YWx1ZXMpO1xuICB2YXIgbixcbiAgICAgIGkgPSAobiAtIDEpICogcCxcbiAgICAgIGkwID0gTWF0aC5mbG9vcihpKSxcbiAgICAgIHZhbHVlMCA9ICt2YWx1ZW9mKHZhbHVlc1tpMF0sIGkwLCB2YWx1ZXMpLFxuICAgICAgdmFsdWUxID0gK3ZhbHVlb2YodmFsdWVzW2kwICsgMV0sIGkwICsgMSwgdmFsdWVzKTtcbiAgcmV0dXJuIHZhbHVlMCArICh2YWx1ZTEgLSB2YWx1ZTApICogKGkgLSBpMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWFudGlsZUluZGV4KHZhbHVlcywgcCwgdmFsdWVvZiA9IG51bWJlcikge1xuICBpZiAoaXNOYU4ocCA9ICtwKSkgcmV0dXJuO1xuICBudW1iZXJzID0gRmxvYXQ2NEFycmF5LmZyb20odmFsdWVzLCAoXywgaSkgPT4gbnVtYmVyKHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSk7XG4gIGlmIChwIDw9IDApIHJldHVybiBtaW5JbmRleChudW1iZXJzKTtcbiAgaWYgKHAgPj0gMSkgcmV0dXJuIG1heEluZGV4KG51bWJlcnMpO1xuICB2YXIgbnVtYmVycyxcbiAgICAgIGluZGV4ID0gVWludDMyQXJyYXkuZnJvbSh2YWx1ZXMsIChfLCBpKSA9PiBpKSxcbiAgICAgIGogPSBudW1iZXJzLmxlbmd0aCAtIDEsXG4gICAgICBpID0gTWF0aC5mbG9vcihqICogcCk7XG4gIHF1aWNrc2VsZWN0KGluZGV4LCBpLCAwLCBqLCAoaSwgaikgPT4gYXNjZW5kaW5nRGVmaW5lZChudW1iZXJzW2ldLCBudW1iZXJzW2pdKSk7XG4gIGkgPSBncmVhdGVzdChpbmRleC5zdWJhcnJheSgwLCBpICsgMSksIChpKSA9PiBudW1iZXJzW2ldKTtcbiAgcmV0dXJuIGkgPj0gMCA/IGkgOiAtMTtcbn1cbiIsImltcG9ydCBxdWFudGlsZSwge3F1YW50aWxlSW5kZXh9IGZyb20gXCIuL3F1YW50aWxlLmpzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lZGlhbih2YWx1ZXMsIHZhbHVlb2YpIHtcbiAgcmV0dXJuIHF1YW50aWxlKHZhbHVlcywgMC41LCB2YWx1ZW9mKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lZGlhbkluZGV4KHZhbHVlcywgdmFsdWVvZikge1xuICByZXR1cm4gcXVhbnRpbGVJbmRleCh2YWx1ZXMsIDAuNSwgdmFsdWVvZik7XG59XG4iLCJleHBvcnQgZnVuY3Rpb24gVHJhbnNmb3JtKGssIHgsIHkpIHtcbiAgdGhpcy5rID0gaztcbiAgdGhpcy54ID0geDtcbiAgdGhpcy55ID0geTtcbn1cblxuVHJhbnNmb3JtLnByb3RvdHlwZSA9IHtcbiAgY29uc3RydWN0b3I6IFRyYW5zZm9ybSxcbiAgc2NhbGU6IGZ1bmN0aW9uKGspIHtcbiAgICByZXR1cm4gayA9PT0gMSA/IHRoaXMgOiBuZXcgVHJhbnNmb3JtKHRoaXMuayAqIGssIHRoaXMueCwgdGhpcy55KTtcbiAgfSxcbiAgdHJhbnNsYXRlOiBmdW5jdGlvbih4LCB5KSB7XG4gICAgcmV0dXJuIHggPT09IDAgJiB5ID09PSAwID8gdGhpcyA6IG5ldyBUcmFuc2Zvcm0odGhpcy5rLCB0aGlzLnggKyB0aGlzLmsgKiB4LCB0aGlzLnkgKyB0aGlzLmsgKiB5KTtcbiAgfSxcbiAgYXBwbHk6IGZ1bmN0aW9uKHBvaW50KSB7XG4gICAgcmV0dXJuIFtwb2ludFswXSAqIHRoaXMuayArIHRoaXMueCwgcG9pbnRbMV0gKiB0aGlzLmsgKyB0aGlzLnldO1xuICB9LFxuICBhcHBseVg6IGZ1bmN0aW9uKHgpIHtcbiAgICByZXR1cm4geCAqIHRoaXMuayArIHRoaXMueDtcbiAgfSxcbiAgYXBwbHlZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuIHkgKiB0aGlzLmsgKyB0aGlzLnk7XG4gIH0sXG4gIGludmVydDogZnVuY3Rpb24obG9jYXRpb24pIHtcbiAgICByZXR1cm4gWyhsb2NhdGlvblswXSAtIHRoaXMueCkgLyB0aGlzLmssIChsb2NhdGlvblsxXSAtIHRoaXMueSkgLyB0aGlzLmtdO1xuICB9LFxuICBpbnZlcnRYOiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuICh4IC0gdGhpcy54KSAvIHRoaXMuaztcbiAgfSxcbiAgaW52ZXJ0WTogZnVuY3Rpb24oeSkge1xuICAgIHJldHVybiAoeSAtIHRoaXMueSkgLyB0aGlzLms7XG4gIH0sXG4gIHJlc2NhbGVYOiBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIHguY29weSgpLmRvbWFpbih4LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCwgdGhpcykubWFwKHguaW52ZXJ0LCB4KSk7XG4gIH0sXG4gIHJlc2NhbGVZOiBmdW5jdGlvbih5KSB7XG4gICAgcmV0dXJuIHkuY29weSgpLmRvbWFpbih5LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WSwgdGhpcykubWFwKHkuaW52ZXJ0LCB5KSk7XG4gIH0sXG4gIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJ0cmFuc2xhdGUoXCIgKyB0aGlzLnggKyBcIixcIiArIHRoaXMueSArIFwiKSBzY2FsZShcIiArIHRoaXMuayArIFwiKVwiO1xuICB9XG59O1xuXG5leHBvcnQgdmFyIGlkZW50aXR5ID0gbmV3IFRyYW5zZm9ybSgxLCAwLCAwKTtcblxudHJhbnNmb3JtLnByb3RvdHlwZSA9IFRyYW5zZm9ybS5wcm90b3R5cGU7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRyYW5zZm9ybShub2RlKSB7XG4gIHdoaWxlICghbm9kZS5fX3pvb20pIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSByZXR1cm4gaWRlbnRpdHk7XG4gIHJldHVybiBub2RlLl9fem9vbTtcbn1cbiIsIlxuLypcbiAgSFRETWF0aCBTdGF0aWMgQ2xhc3MgLSBOb3QgaW50ZW5kZWQgZm9yIGluc3RhbnRpYXRpb24hXG5cbiAgVmFyaWFibGVzOlxuICAgIEEgPSBhbW91bnRcbiAgICBEID0gZGVsYXlcbiAgICBWID0gc3ViamVjdGl2ZSB2YWx1ZVxuXG4gICAgayA9IGRpc2NvdW50IGZhY3RvclxuXG4gIEVxdWF0aW9uczpcbiAgICBWID0gQSAvICgxICsga0QpXG4qL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSFRETWF0aCB7XG4gIHN0YXRpYyBhZGsydihhLCBkLCBrKSB7XG4gICAgcmV0dXJuIGEgLyAoMSArIGsgKiBkKTtcbiAgfVxuXG4gIHN0YXRpYyBhZHYyayhhLCBkLCB2KSB7XG4gICAgcmV0dXJuIChhIC0gdikgLyAodiAqIGQpO1xuICB9XG59XG4iLCJcbi8vIEludGVybmFsIGRlcGVuZGVuY2llc1xuaW1wb3J0IEhURE1hdGggZnJvbSAnLi9odGQtbWF0aCc7XG5cbmV4cG9ydCBkZWZhdWx0IEhURE1hdGg7XG4iLCIvKiBlc2xpbnQgbm8tcmVzdHJpY3RlZC1nbG9iYWxzOiBbXCJvZmZcIiwgXCJzZWxmXCJdICovXG5cbi8vIE5lZWRlZCBmb3IgZDMgaW4gV2ViV29ya2VyIVxuaW1wb3J0ICdyZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUnO1xuXG5pbXBvcnQgKiBhcyBCYXllc0Rpc3RyaWJ1dGlvbnMgZnJvbSAnYmF5ZXMuanMvZGlzdHJpYnV0aW9ucyc7XG5pbXBvcnQgKiBhcyBCYXllc01jbWMgZnJvbSAnYmF5ZXMuanMvbWNtYyc7XG5pbXBvcnQgKiBhcyBkMyBmcm9tICdkMyc7XG5pbXBvcnQgSFRETWF0aCBmcm9tICdAZGVjaWRhYmxlcy9kaXNjb3VudGFibGUtbWF0aCc7XG5cbnNlbGYub25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gIGNvbnN0IHBhcmFtcyA9IHtcbiAgICBrOiB7dHlwZTogJ3JlYWwnLCBsb3dlcjogMCwgdXBwZXI6IDEwMH0sXG4gICAgbHVjZToge3R5cGU6ICdyZWFsJywgbG93ZXI6IDAsIHVwcGVyOiAxMDB9LFxuICB9O1xuXG4gIGNvbnN0IGxvZ1Bvc3QgPSAoc3RhdGUsIGRhdGEpID0+IHtcbiAgICBsZXQgbHAgPSAwO1xuXG4gICAgLy8gUHJpb3JzXG4gICAgY29uc3Qga01lYW4gPSAyO1xuICAgIGNvbnN0IGtTaGFwZSA9IDM7XG4gICAgbHAgKz0gQmF5ZXNEaXN0cmlidXRpb25zLmdhbW1hKFxuICAgICAgc3RhdGUuayxcbiAgICAgIGtTaGFwZSxcbiAgICAgIGtTaGFwZSAvIGtNZWFuLFxuICAgICk7XG4gICAgLy8gbHAgKz0gQmF5ZXNEaXN0cmlidXRpb25zLnVuaWYoc3RhdGUuaywgMCwgMTAwKTtcblxuICAgIGNvbnN0IGx1Y2VNZWFuID0gMjtcbiAgICBjb25zdCBsdWNlU2hhcGUgPSAzO1xuICAgIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy5nYW1tYShcbiAgICAgIHN0YXRlLmx1Y2UsXG4gICAgICBsdWNlU2hhcGUsXG4gICAgICBsdWNlU2hhcGUgLyBsdWNlTWVhbixcbiAgICApO1xuICAgIC8vIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy51bmlmKHN0YXRlLmx1Y2UsIDAsIDEwMCk7XG5cbiAgICAvLyBMaWtlbGlob29kXG4gICAgZGF0YS5mb3JFYWNoKChjaG9pY2UpID0+IHtcbiAgICAgIC8vIFZhbHVlc1xuICAgICAgY29uc3QgdnMgPSBIVERNYXRoLmFkazJ2KGNob2ljZS5hcywgY2hvaWNlLmRzLCBzdGF0ZS5rKTtcbiAgICAgIGNvbnN0IHZsID0gSFRETWF0aC5hZGsydihjaG9pY2UuYWwsIGNob2ljZS5kbCwgc3RhdGUuayk7XG5cbiAgICAgIC8vIENob2ljZSBvZiBzb29uZXIgb3IgbGF0ZXIgaXMgc2FtcGxlZCBmcm9tIGEgQmVybm91bGxpIGRpc3RyaWJ1dGlvblxuICAgICAgLy8gTHVjZSBjaG9pY2UgcnVsZSBpcyB1c2VkIHRvIGNvbXB1dGUgcHJvYmFiaWxpdHkgb2Ygd2FpdGluZyEgKDAgPSBzb29uZXIsIDEgPSBsYXRlcilcbiAgICAgIGNvbnN0IGJpbnZhbCA9IDEgLyAoMSArIE1hdGguZXhwKHN0YXRlLmx1Y2UgKiAodnMgLSB2bCkpKTtcblxuICAgICAgLy8gQWN0dWFsIHJlc3BvbnNlXG4gICAgICBjb25zdCByZXNwb25zZSA9IChjaG9pY2UucmVzcG9uc2UgPT09ICdmaXJzdCcpID8gMCA6IDE7XG5cbiAgICAgIGxwICs9IEJheWVzRGlzdHJpYnV0aW9ucy5iZXJuKHJlc3BvbnNlLCBiaW52YWwpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxwO1xuICB9O1xuXG4gIC8vIEluaXRpYWxpemluZyB0aGUgc2FtcGxlclxuICBjb25zdCBzYW1wbGVyID0gbmV3IEJheWVzTWNtYy5BbXdnU2FtcGxlcihwYXJhbXMsIGxvZ1Bvc3QsIGV2ZW50LmRhdGEpO1xuICAvLyBCdXJuaW5nIHNvbWUgc2FtcGxlcyB0byB0aGUgTUNNQyBnb2RzIGFuZCBzYW1wbGluZyA1MDAwIGRyYXdzXG4gIHNhbXBsZXIuYnVybigxMDAwKTtcbiAgY29uc3Qgc2FtcGxlcyA9IHNhbXBsZXIuc2FtcGxlKDUwMDApO1xuXG4gIC8vIEV4dHJhY3Qgc3VtbWFyeSBzdGF0c1xuICBjb25zdCByZXN1bHRzID0ge1xuICAgIGs6IGQzLm1lZGlhbihzYW1wbGVzLmspLFxuICAgIGx1Y2U6IGQzLm1lZGlhbihzYW1wbGVzLmx1Y2UpLFxuICB9O1xuXG4gIHNlbGYucG9zdE1lc3NhZ2Uoe3Jlc3VsdHM6IHJlc3VsdHMsIHNhbXBsZXM6IHNhbXBsZXN9KTtcbn07XG4iXSwibmFtZXMiOlsicm9vdCIsImZhY3RvcnkiLCJtb2R1bGUiLCJleHBvcnRzIiwibGQiLCJ0aGlzIiwibGdhbW1hIiwieCIsImoiLCJjb2YiLCJzZXIiLCJ4eCIsInkiLCJ0bXAiLCJsb2ciLCJsZmFjdG9yaWFsIiwibiIsIk5hTiIsImxjaG9vc2UiLCJrIiwibGJldGEiLCJhIiwiYiIsIk1hdGgiLCJleHAiLCJhYnMiLCJwb3ciLCJzcXJ0IiwicGkiLCJQSSIsImJldGEiLCJzaGFwZTEiLCJzaGFwZTIiLCJJbmZpbml0eSIsImNhdWNoeSIsImxvY2F0aW9uIiwic2NhbGUiLCJub3JtIiwibWVhbiIsInNkIiwiYml2YXJub3JtIiwiY29yciIsInoiLCJub3JtYWxpemluZ19mYWN0b3IiLCJiaXZhcl9sb2dfZGVucyIsImxhcGxhY2UiLCJkZXhwIiwiZ2FtbWEiLCJzaGFwZSIsInJhdGUiLCJpbnZnYW1tYSIsImxub3JtIiwibWVhbmxvZyIsInNkbG9nIiwicGFyZXRvIiwidCIsImRmIiwid2VpYnVsbCIsInRtcDEiLCJ0bXAyIiwibG9naXMiLCJlIiwiZiIsImRpcmljaGxldCIsImFscGhhIiwic3VtX2FscGhhIiwic3VtX2xnYW1tYV9hbHBoYSIsInN1bV9hbHBoYV9zdWJfMV9sb2dfeCIsImxlbmd0aCIsImkiLCJ1bmlmIiwibWluIiwibWF4IiwiYmVybiIsInByb2IiLCJjYXQiLCJwcm9icyIsImJpbm9tIiwic2l6ZSIsIm5iaW5vbSIsImh5cGVyIiwibSIsInBvaXMiLCJsYW1iZGEiLCJtY21jIiwicnVuaWYiLCJyYW5kb20iLCJydW5pZl9kaXNjcmV0ZSIsImZsb29yIiwicm5vcm0iLCJ1IiwidiIsInEiLCJkZWVwX2Nsb25lIiwic3JjIiwibWl4aW4iLCJkZXN0Iiwic291cmNlIiwiY29weUZ1bmMiLCJuYW1lIiwicyIsImVtcHR5IiwiT2JqZWN0IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJjYWxsIiwibm9kZVR5cGUiLCJjbG9uZU5vZGUiLCJEYXRlIiwiZ2V0VGltZSIsIlJlZ0V4cCIsInIiLCJsIiwiQXJyYXkiLCJwdXNoIiwiY29uc3RydWN0b3IiLCJjbG9uZV9wYXJhbV9kcmF3IiwiaXNBcnJheSIsInhfY29weSIsInNsaWNlIiwiaXNfbnVtYmVyIiwib2JqZWN0IiwiTnVtYmVyIiwiY3JlYXRlX2FycmF5IiwiZGltIiwiaW5pdCIsImFyciIsImFycmF5X2RpbSIsImNvbmNhdCIsImFycmF5X2VxdWFsIiwiYTEiLCJhMiIsIm5lc3RlZF9hcnJheV9hcHBseSIsImZ1biIsInJlc3VsdCIsInNodWZmbGVfYXJyYXkiLCJhcnJheSIsInRlbXAiLCJuZXN0ZWRfYXJyYXlfcmFuZG9tX2FwcGx5IiwibGVuIiwiYXJyYXlfaXMiLCJhcnJheV9pIiwiZ2V0X29wdGlvbiIsIm9wdGlvbl9uYW1lIiwib3B0aW9ucyIsImRlZmF1bF92YWx1ZSIsImhhc093blByb3BlcnR5IiwidW5kZWZpbmVkIiwiZ2V0X211bHRpZGltX29wdGlvbiIsInZhbHVlIiwicGFyYW1faW5pdF9maXhlZCIsInR5cGUiLCJsb3dlciIsInVwcGVyIiwicm91bmQiLCJjb21wbGV0ZV9wYXJhbXMiLCJwYXJhbXNfdG9fY29tcGxldGUiLCJwYXJhbV9pbml0IiwicGFyYW1zIiwicGFyYW1fbmFtZSIsInBhcmFtIiwiU3RlcHBlciIsInN0YXRlIiwibG9nX3Bvc3QiLCJzdGVwIiwic3RhcnRfYWRhcHRhdGlvbiIsInN0b3BfYWRhcHRhdGlvbiIsImluZm8iLCJPbmVkaW1NZXRyb3BvbGlzU3RlcHBlciIsImdlbmVyYXRlX3Byb3Bvc2FsIiwicGFyYW1fbmFtZXMiLCJrZXlzIiwicHJvcF9sb2dfc2NhbGUiLCJiYXRjaF9zaXplIiwibWF4X2FkYXB0YXRpb24iLCJpbml0aWFsX2FkYXB0YXRpb24iLCJ0YXJnZXRfYWNjZXB0X3JhdGUiLCJpc19hZGFwdGluZyIsImFjY2VwdGFuY2VfY291bnQiLCJiYXRjaF9jb3VudCIsIml0ZXJhdGlvbnNfc2luY2VfYWRhcHRpb24iLCJjcmVhdGUiLCJwYXJhbV9zdGF0ZSIsInBhcmFtX3Byb3Bvc2FsIiwiY3Vycl9sb2dfZGVucyIsInByb3BfbG9nX2RlbnMiLCJhY2NlcHRfcHJvYiIsImxvZ19zZF9hZGp1c3RtZW50Iiwibm9ybWFsX3Byb3Bvc2FsIiwiUmVhbE1ldHJvcG9saXNTdGVwcGVyIiwiZGlzY3JldGVfbm9ybWFsX3Byb3Bvc2FsIiwiSW50TWV0cm9wb2xpc1N0ZXBwZXIiLCJNdWx0aWRpbUNvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIiwiU3ViU3RlcHBlciIsImNyZWF0ZV9zdWJzdGVwcGVycyIsInN1YnN0YXRlIiwic3Vic3RlcHBlcnMiLCJzdWJvcHRpb25zIiwic3VicGFyYW0iLCJzdWJzdGVwcGVyIiwiTXVsdGlSZWFsQ29tcG9uZW50TWV0cm9wb2xpc1N0ZXBwZXIiLCJNdWx0aUludENvbXBvbmVudE1ldHJvcG9saXNTdGVwcGVyIiwiQmluYXJ5U3RlcHBlciIsInplcm9fbG9nX2RlbnMiLCJvbmVfbG9nX2RlbnMiLCJtYXhfbG9nX2RlbnMiLCJ6ZXJvX3Byb2IiLCJCaW5hcnlDb21wb25lbnRTdGVwcGVyIiwic3VicGFyYW1zIiwiQW13Z1N0ZXBwZXIiLCJTZWxlY3RTdGVwcGVyIiwicGFyYW1fb2JqZWN0X3dyYXAiLCJwYXJhbV9vcHRpb25zIiwiU2FtcGxlciIsImRhdGEiLCJwYXJhbV9pbml0X2Z1biIsInRoaW5uaW5nX2ludGVydmFsIiwicGFyYW1zX3RvX21vbml0b3IiLCJ0aGluIiwibW9uaXRvciIsInN0ZXBwZXJzIiwiY3JlYXRlX3N0ZXBwZXJfZW5zYW1ibGUiLCJzYW1wbGUiLCJuX2l0ZXJhdGlvbnMiLCJtb25pdG9yZWRfcGFyYW1zIiwiY3Vycl9zYW1wbGUiLCJidXJuIiwiQW13Z1NhbXBsZXIiLCJhc2NlbmRpbmciLCJudW1iZXJzIiwidmFsdWVzIiwidmFsdWVvZiIsImNvbXBhcmVEZWZpbmVkIiwiY29tcGFyZSIsImFzY2VuZGluZ0RlZmluZWQiLCJUeXBlRXJyb3IiLCJxdWlja3NlbGVjdCIsImxlZnQiLCJyaWdodCIsIm5ld0xlZnQiLCJuZXdSaWdodCIsInN3YXAiLCJxdWFudGlsZSIsInAiLCJGbG9hdDY0QXJyYXkiLCJmcm9tIiwiaXNOYU4iLCJpMCIsInZhbHVlMCIsInN1YmFycmF5IiwidmFsdWUxIiwibWVkaWFuIiwiVHJhbnNmb3JtIiwidHJhbnNsYXRlIiwiYXBwbHkiLCJwb2ludCIsImFwcGx5WCIsImFwcGx5WSIsImludmVydCIsImludmVydFgiLCJpbnZlcnRZIiwicmVzY2FsZVgiLCJjb3B5IiwiZG9tYWluIiwicmFuZ2UiLCJtYXAiLCJyZXNjYWxlWSIsIkhURE1hdGgiLCJhZGsydiIsImQiLCJhZHYyayIsInNlbGYiLCJvbm1lc3NhZ2UiLCJldmVudCIsImx1Y2UiLCJsb2dQb3N0IiwibHAiLCJrTWVhbiIsImtTaGFwZSIsIkJheWVzRGlzdHJpYnV0aW9ucyIsImx1Y2VNZWFuIiwibHVjZVNoYXBlIiwiZm9yRWFjaCIsImNob2ljZSIsInZzIiwiYXMiLCJkcyIsInZsIiwiYWwiLCJkbCIsImJpbnZhbCIsInJlc3BvbnNlIiwic2FtcGxlciIsIkJheWVzTWNtYyIsInNhbXBsZXMiLCJyZXN1bHRzIiwiZDMiLCJwb3N0TWVzc2FnZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0NBR0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7O0NBRUE7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7O0NBT0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0dBQ0MsQ0FBVUEsVUFBQUEsSUFBSSxFQUFFQyxPQUFPLEVBQUU7S0FJZixJQUFrQ0MsTUFBTSxDQUFDQyxPQUFPLEVBQUU7Q0FDN0Q7Q0FDQTtDQUNBO0NBQ1FELE1BQUFBLE1BQUEsQ0FBQUMsT0FBQSxHQUFpQkYsT0FBTyxFQUFFLENBQUE7Q0FDbEMsS0FBSyxNQUFNO0NBQ1g7Q0FDUUQsTUFBQUEsSUFBSSxDQUFDSSxFQUFFLEdBQUdILE9BQU8sRUFBRSxDQUFBO0NBQ3hCLEtBQUE7Q0FDSCxHQUFDLEVBQUNJLGNBQUksRUFBRSxZQUFXO0NBQ25CO0tBQ0UsSUFBSUQsRUFBRSxHQUFJLEVBQUUsQ0FBQTs7Q0FFZDtDQUNBOztDQUVFLElBQUEsSUFBSUUsTUFBTSxHQUFHLFVBQVNDLENBQUMsRUFBRTtPQUN2QixJQUFJQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0NBQ1QsTUFBQSxJQUFJQyxHQUFHLEdBQUcsQ0FDUixpQkFBaUIsRUFBRSxDQUFDLGlCQUFpQixFQUFFLGlCQUFpQixFQUN4RCxDQUFDLGlCQUFpQixFQUFFLHFCQUFxQixFQUFFLENBQUMsa0JBQWtCLENBQy9ELENBQUE7T0FDRCxJQUFJQyxHQUFHLEdBQUcsaUJBQWlCLENBQUE7Q0FDM0IsTUFBQSxJQUFJQyxFQUFFLEVBQUVDLENBQUMsRUFBRUMsR0FBRyxDQUFBO09BQ2RBLEdBQUcsR0FBRyxDQUFDRCxDQUFDLEdBQUdELEVBQUUsR0FBR0osQ0FBQyxJQUFJLEdBQUcsQ0FB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QUEsTUFBTUMsRUFBRSxHQUFHakIsT0FBTyxDQUFDQyxLQUFLLENBQUNlLE1BQU0sQ0FBQ0UsRUFBRSxFQUFFRixNQUFNLENBQUNHLEVBQUUsRUFBRTVILEtBQUssQ0FBQy9JLENBQUMsQ0FBQyxDQUFBO0NBQ3ZELE1BQUEsTUFBTTRRLEVBQUUsR0FBR3BCLE9BQU8sQ0FBQ0MsS0FBSyxDQUFDZSxNQUFNLENBQUNLLEVBQUUsRUFBRUwsTUFBTSxDQUFDTSxFQUFFLEVBQUUvSCxLQUFLLENBQUMvSSxDQUFDLENBQUMsQ0FBQTs7Q0FFdkQ7Q0FDQTtDQUNBLE1BQUEsTUFBTStRLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHM1EsSUFBSSxDQUFDQyxHQUFHLENBQUMwSSxLQUFLLENBQUNnSCxJQUFJLElBQUlVLEVBQUUsR0FBR0csRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBOztDQUV6RDtPQUNBLE1BQU1JLFFBQVEsR0FBSVIsTUFBTSxDQUFDUSxRQUFRLEtBQUssT0FBTyxHQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7T0FFdERmLEVBQUUsSUFBSUcseUJBQXVCLENBQUNZLFFBQVEsRUFBRUQsTUFBTSxDQUFDLENBQUE7Q0FDakQsS0FBQyxDQUFDLENBQUE7Q0FFRixJQUFBLE9BQU9kLEVBQUUsQ0FBQTtJQUNWLENBQUE7O0NBRUQ7Q0FDQSxFQUFBLE1BQU1nQixPQUFPLEdBQUcsSUFBSUMsdUJBQXFCLENBQUN2SSxNQUFNLEVBQUVxSCxPQUFPLEVBQUVGLEtBQUssQ0FBQzNELElBQUksQ0FBQyxDQUFBO0NBQ3RFO0NBQ0E4RSxFQUFBQSxPQUFPLENBQUNsRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7Q0FDbEIsRUFBQSxNQUFNb0UsT0FBTyxHQUFHRixPQUFPLENBQUN0RSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7O0NBRXBDO0NBQ0EsRUFBQSxNQUFNeUUsT0FBTyxHQUFHO0tBQ2RwUixDQUFDLEVBQUVxUixNQUFTLENBQUNGLE9BQU8sQ0FBQ25SLENBQUMsQ0FBQztDQUN2QitQLElBQUFBLElBQUksRUFBRXNCLE1BQVMsQ0FBQ0YsT0FBTyxDQUFDcEIsSUFBSSxDQUFBO0lBQzdCLENBQUE7R0FFREgsSUFBSSxDQUFDMEIsV0FBVyxDQUFDO0NBQUNGLElBQUFBLE9BQU8sRUFBRUEsT0FBTztDQUFFRCxJQUFBQSxPQUFPLEVBQUVBLE9BQUFBO0NBQU8sR0FBQyxDQUFDLENBQUE7Q0FDeEQsQ0FBQzs7Ozs7OyIsInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswLDEsMiwzLDQsNSw2LDcsOCw5LDEwXX0=",function(t){return Ap=Ap||Gp(pp,mp),new Worker(Ap,t)});class Sp extends pu{static get properties(){return{}}constructor(){super(),this.k=.05,this.choices=[],this.samples=null,this.working=!1,this.queued=!1,this.worker=new xp,this.worker.onmessage=t=>{this.working=!1,this.samples=t.data.samples,this.k=t.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(t="default"){const e=this.choices.find((e=>e.name===t));return void 0===e?null:e}set(t,e,n,i,s,c="",a=""){const l=this.choices.find((t=>t.name===c));void 0===l?this.choices.push({as:t,ds:e,al:n,dl:i,response:s,name:c,label:a}):(l.as=t,l.ds=e,l.al=n,l.dl=i,l.response=s,l.label=a),this.fit()}static get styles(){return[super.styles,l`
|
|
1453
|
+
|
|
1454
|
+
/* Make larger targets for touch users */
|
|
1455
|
+
.interactive .touch {
|
|
1456
|
+
stroke: #000000;
|
|
1457
|
+
stroke-opacity: 0;
|
|
1458
|
+
}
|
|
1459
|
+
|
|
1460
|
+
@media (pointer: coarse) {
|
|
1461
|
+
.interactive .touch {
|
|
1462
|
+
stroke-linecap: round;
|
|
1463
|
+
stroke-width: 12;
|
|
1464
|
+
}
|
|
1465
|
+
}
|
|
1466
|
+
`]}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 t,U;Q/F>1.8?(U=F,t=1.8*U):(t=Q,U=t/1.8);const I=2*this.rem,s=3*this.rem,g=3*this.rem,i=U-(I+s),l=t-(g+2*this.rem),c=parseInt(this.getComputedStyleValue("---transition-duration"),10),e=xl().domain([this.scale.time.min,this.scale.time.max]).range([0,l]),n=xl().domain([this.scale.value.min,this.scale.value.max]).range([i,0]),d=$d().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(ia.svgDefs);const b=a.merge(C).attr("viewBox",`0 0 ${t} ${U}`),o=a.append("g").classed("plot",!0),G=b.select(".plot").attr("transform",`translate(${g}, ${I})`);o.append("clipPath").attr("id","clip-htd-curves").append("rect"),G.select("clipPath rect").attr("height",i+1).attr("width",l+1);const u=o.append("g").classed("underlayer",!0),r=G.select(".underlayer");u.append("rect").classed("background",!0),r.select(".background").attr("height",i).attr("width",l),u.append("g").classed("axis-x",!0);r.select(".axis-x").attr("transform",`translate(0, ${n(0)})`).transition().duration(2*c).ease(NI).call(rQ(e)).attr("font-size",null).attr("font-family",null).selectAll("line, path").attr("stroke",null);const x=u.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})`),u.append("g").classed("axis-y",!0);var A;r.select(".axis-y").transition().duration(2*c).ease(NI).call((A=n,uQ(4,A))).attr("font-size",null).attr("font-family",null).selectAll("line, path").attr("stroke",null);const L=u.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=G.select(".content").selectAll(".option").data(this.options.filter((B=>null!==B.a&&null!==B.d)),(B=>B.name)),y=h.enter().append("g").classed("option",!0),R=y.append("g").classed("curve",!0).attr("clip-path","url(#clip-htd-curves)");R.append("path").classed("path",!0).attr("d",(B=>{const Q=lQ(e(B.d),e(0),-1).map((Q=>({d:e.invert(Q),v:Xa.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"})),R.append("path").classed("path touch",!0).attr("d",(B=>{const Q=lQ(e(B.d),e(0),-1).map((Q=>({d:e.invert(Q),v:Xa.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=y.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=y.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=y.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(jF().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),t=F<0?0:F>Q.d?Q.d:F,U=n.invert(B.y),I=U<=0?.001:U>Q.a?Q.a:U,s=Xa.adv2k(Q.a,t,I);this.k=s<Xa.k.MIN?Xa.k.MIN:s>Xa.k.MAX?Xa.k.MAX:s,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<Xa.k.MIN?Xa.k.MIN:F>Xa.k.MAX?Xa.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(jF().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(jF().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(EI).attrTween("stroke-dasharray",((B,Q,F)=>{const t=F[Q].getTotalLength();return hU(`0,${t}`,`${t},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(EI).attrTween("stroke-dasharray",((B,Q,F)=>{const t=F[Q].getTotalLength();return hU(`0,${t}`,`${t},0`)})),S.filter((B=>B.new)).select(".bar .line").transition().duration(c).ease(EI).attrTween("stroke-dasharray",((B,Q,F)=>{const t=F[Q].getTotalLength();return hU(`0,${t}`,`${t},${t}`)})),S.filter((B=>B.new)).select(".bar .line.touch").transition().duration(c).ease(EI).attrTween("stroke-dasharray",((B,Q,F)=>{const t=F[Q].getTotalLength();return hU(`0,${t}`,`${t},${t}`)})),S.filter((B=>B.new)).select(".point").transition().duration(c/10).delay(c).ease(EI).attrTween("opacity",(()=>hU(0,1))),h.select(".curve .path").transition().duration(this.drag?0:this.firstUpdate?2*c:c).ease(NI).attrTween("d",((B,Q,F)=>{const t=F[Q],U=hU(void 0!==t.a?t.a:B.a,B.a),I=hU(void 0!==t.d?t.d:B.d,B.d);return B=>{t.a=U(B),t.d=I(B);const Q=lQ(e(t.d),e(0),-1).map((B=>({d:e.invert(B),v:Xa.adk2v(t.a,t.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(NI).attrTween("d",((B,Q,F)=>{const t=F[Q],U=hU(void 0!==t.a?t.a:B.a,B.a),I=hU(void 0!==t.d?t.d:B.d,B.d);return B=>{t.a=U(B),t.d=I(B);const Q=lQ(e(t.d),e(0),-1).map((B=>({d:e.invert(B),v:Xa.adk2v(t.a,t.d-e.invert(B),this.k)})));return d(Q)}})),h.select(".bar .line").transition().duration(this.drag?0:this.firstUpdate?2*c:c).ease(NI).attrTween("x1",((B,Q,F)=>{const t=F[Q],U=hU(void 0!==t.d?t.d:B.d,B.d);return B=>(t.d=U(B),`${e(t.d)}`)})).attrTween("x2",((B,Q,F)=>{const t=F[Q],U=hU(void 0!==t.d?t.d:B.d,B.d);return B=>(t.d=U(B),`${e(t.d)}`)})).attrTween("y2",((B,Q,F)=>{const t=F[Q],U=hU(void 0!==t.a?t.a:B.a,B.a);return B=>(t.a=U(B),`${n(t.a)}`)})),h.select(".bar .line.touch").transition().duration(this.drag?0:this.firstUpdate?2*c:c).ease(NI).attrTween("x1",((B,Q,F)=>{const t=F[Q],U=hU(void 0!==t.d?t.d:B.d,B.d);return B=>(t.d=U(B),`${e(t.d)}`)})).attrTween("x2",((B,Q,F)=>{const t=F[Q],U=hU(void 0!==t.d?t.d:B.d,B.d);return B=>(t.d=U(B),`${e(t.d)}`)})).attrTween("y2",((B,Q,F)=>{const t=F[Q],U=hU(void 0!==t.a?t.a:B.a,B.a);return B=>(t.a=U(B),`${n(t.a)}`)})),h.select(".point").transition().duration(this.drag?0:this.firstUpdate?2*c:c).ease(NI).attrTween("transform",((B,Q,F)=>{const t=F[Q],U=hU(void 0!==t.d?t.d:B.d,B.d),I=hU(void 0!==t.a?t.a:B.a,B.a);return B=>(t.d=U(B),t.a=I(B),`translate(${e(t.d)}, ${n(t.a)})`)})),S.select(".point .label").text((B=>B.label)),h.exit().remove(),this.drag=!1,this.firstUpdate=!1}}function Da(B){return null!=B&&!Number.isNaN(B)}function Ya(B,Q){return+Da(Q)-+Da(B)||lB(B,Q)}function fa(B,Q){return+Da(Q)-+Da(B)||cB(B,Q)}function wa(B){return null!=B&&""!=`${B}`}function va(B){return isFinite(B)?B:NaN}function Ja(B){return B>0&&isFinite(B)?B:NaN}function ka(B){return B<0&&isFinite(B)?B:NaN}function Ma(B,Q){if(B instanceof Date||(B=new Date(+B)),isNaN(B))return Q;const F=B.getUTCHours(),t=B.getUTCMinutes(),U=B.getUTCSeconds(),I=B.getUTCMilliseconds();return`${s=B.getUTCFullYear(),s<0?`-${Ta(-s,6)}`:s>9999?`+${Ta(s,6)}`:Ta(s,4)}-${Ta(B.getUTCMonth()+1,2)}-${Ta(B.getUTCDate(),2)}${F||t||U||I?`T${Ta(F,2)}:${Ta(t,2)}${U||I?`:${Ta(U,2)}${I?`.${Ta(I,3)}`:""}`:""}Z`:""}`;var s}function Ta(B,Q){return`${B}`.padStart(Q,"0")}customElements.define("htd-curves",Ha);const za=/^(?:[-+]\d{2})?\d{4}(?:-\d{2}(?:-\d{2})?)?(?:T\d{2}:\d{2}(?::\d{2}(?:\.\d{3})?)?(?:Z|[-+]\d{2}:?\d{2})?)?$/;function Ka(B,Q){return za.test(B+="")?new Date(B):Q}function Oa(B){if(null==B)return;return cB(B[0],B[B.length-1])}const Pa=1e3,ja=6e4,_a=36e5,$a=864e5,qa=6048e5,Bb=2592e6,Qb=31536e6,Fb=[["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",Pa],["5 seconds",5e3],["15 seconds",15e3],["30 seconds",3e4],["minute",ja],["5 minutes",3e5],["15 minutes",9e5],["30 minutes",18e5],["hour",_a],["3 hours",108e5],["6 hours",216e5],["12 hours",432e5],["day",$a],["2 days",1728e5],["week",qa],["2 weeks",12096e5],["month",Bb],["3 months",7776e6],["6 months",15552e6],["year",Qb],["2 years",63072e6],["5 years",15768e7],["10 years",31536e7],["20 years",63072e7],["50 years",15768e8],["100 years",31536e8]],tb=new Map([["second",Pa],["minute",ja],["hour",_a],["day",$a],["monday",qa],["tuesday",qa],["wednesday",qa],["thursday",qa],["friday",qa],["saturday",qa],["sunday",qa],["week",qa],["month",Bb],["year",Qb]]),Ub=new Map([["second",Bc],["minute",Qc],["hour",tc],["day",Ic],["monday",cc],["tuesday",ec],["wednesday",nc],["thursday",dc],["friday",Cc],["saturday",ac],["sunday",lc],["week",lc],["month",hc],["year",Rc]]),Ib=new Map([["second",Bc],["minute",Fc],["hour",Uc],["day",gc],["monday",Gc],["tuesday",uc],["wednesday",rc],["thursday",xc],["friday",Ac],["saturday",Lc],["sunday",oc],["week",oc],["month",yc],["year",Vc]]),sb=Symbol("intervalDuration"),gb=Symbol("intervalType");for(const[B,Q]of Ub)Q[sb]=tb.get(B),Q[gb]="time";for(const[B,Q]of Ib)Q[sb]=tb.get(B),Q[gb]="utc";const ib=[["year",Vc,"utc"],["month",yc,"utc"],["day",gc,"utc",15552e6],["hour",Uc,"utc",2592e5],["minute",Fc,"utc",216e5],["second",Bc,"utc",18e5]],lb=[["year",Rc,"time"],["month",hc,"time"],["day",Ic,"time",15552e6],["hour",tc,"time",2592e5],["minute",Qc,"time",216e5],["second",Bc,"time",18e5]],cb=[ib[0],lb[0],ib[1],lb[1],ib[2],lb[2],...ib.slice(3)];function eb(B){let Q=`${B}`.toLowerCase();Q.endsWith("s")&&(Q=Q.slice(0,-1));let F=1;const t=/^(?:(\d+)\s+)/.exec(Q);switch(t&&(Q=Q.slice(t[0].length),F=+t[1]),Q){case"quarter":Q="month",F*=3;break;case"half":Q="month",F*=6}let U=Ib.get(Q);if(!U)throw new Error(`unknown interval: ${B}`);if(F>1&&!U.every)throw new Error(`non-periodic interval: ${Q}`);return[Q,F]}function nb(B){return Cb(eb(B),"time")}function db(B){return Cb(eb(B),"utc")}function Cb([B,Q],F){let t=("time"===F?Ub:Ib).get(B);return Q>1&&(t=t.every(Q),t[sb]=tb.get(B)*Q,t[gb]=F),t}function ab(B,Q){if(!(Q>1))return;const F=B[sb];if(!Fb.some((([,B])=>B===F)))return;if(F%$a==0&&$a<F&&F<Bb)return;const[t]=Fb[eB((([,B])=>Math.log(B))).center(Fb,Math.log(F*Q))];return("time"===B[gb]?nb:db)(t)}function bb(B,Q,F){const t="time"===Q?Dc:Yc;if(null==F)return t("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 U=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 Gb(t(".%L"),t(":%M:%S"),U);case"second":return Gb(t(":%S"),t("%-I:%M"),U);case"minute":return Gb(t("%-I:%M"),t("%p"),U);case"hour":return Gb(t("%-I %p"),t("%b %-d"),U);case"day":return Gb(t("%-d"),t("%b"),U);case"month":return Gb(t("%b"),t("%Y"),U);case"year":return t("%Y")}throw new Error("unable to format time ticks")}function ob(B,Q,F){const t=KB(function(B,Q=iQ){const F=[];let t,U=!1;for(const I of B)U&&F.push(Q(t,I)),t=I,U=!0;return F}(Q,((B,Q)=>Math.abs(Q-B))));if(t<1e3)return bb("millisecond","utc",F);for(const[U,I,s,g]of function(B){return"time"===B?lb:"utc"===B?ib:cb}(B)){if(t>g)break;if("hour"===U&&!t)break;if(Q.every((B=>I.floor(B)>=B)))return bb(U,s,F)}}function Gb(B,Q,F){return(t,U,I)=>{const s=B(t,U),g=Q(t,U),i=U-Oa(I);return U!==i&&void 0!==I[i]&&g===Q(I[i],i)?s:F(s,g)}}const ub=Object.getPrototypeOf(Uint8Array),rb=Object.prototype.toString;function xb(B){return B instanceof Array||B instanceof ub}function Ab(B){return B instanceof ub&&!function(B){return B instanceof BigInt64Array||B instanceof BigUint64Array}(B)}function Lb(B){return B?.prototype instanceof ub&&!function(B){return B===BigInt64Array||B===BigUint64Array}(B)}const hb=Symbol("reindex");function yb(B,Q,F){const t=typeof Q;return"string"===t?Do(B)?Zb(B.getChild(Q),F):Rb(B,mb(Q),F):"function"===t?Rb(B,Q,F):"number"===t||Q instanceof Date||"boolean"===t?jb(B,fb(Q),F):"function"==typeof Q?.transform?Vb(Q.transform(B),F):function(B,Q){return null!=B&&Q?go(B,Q):B}(Vb(Q,F),B?.[hb])}function Rb(B,Q,F){return jb(B,Lb(F)?(B,F)=>vb(Q(B,F)):Q,F)}function Vb(B,Q){return void 0===Q?Pb(B):Yo(B)?Zb(B,Q):B instanceof Q?B:Q.from(B,Lb(Q)&&!Ab(B)?vb:void 0)}function Zb(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)?Vb(B.toArray(),Q):Jb(B.toArray())}const Sb=[null],mb=B=>Q=>{const F=Q[B];return void 0===F&&"Feature"===Q.type?Q.properties?.[B]:F},Eb={transform:so},Nb={transform:B=>B},Xb=()=>1,pb=()=>!0,Wb=B=>null==B?B:`${B}`,Hb=B=>null==B?B:+B,Db=B=>B?B[0]:void 0,Yb=B=>B?B[1]:void 0,fb=B=>()=>B;function wb(B){return Ab(B)?B:jb(B,vb,Float64Array)}function vb(B){return null==B?NaN:Number(B)}function Jb(B){return jb(B,kb)}function kb(B){return B instanceof Date&&!isNaN(B)?B:"string"==typeof B?Ka(B):null==B||isNaN(B=Number(B))?void 0:new Date(B)}function Mb(B,Q){return void 0===B&&(B=Q),null===B?[void 0,"none"]:So(B)?[void 0,B]:[B,void 0]}function Tb(B,Q){return void 0===B&&(B=Q),null===B||"number"==typeof B?[void 0,B]:[B,void 0]}function zb(B,Q,F){if(null!=B)return Kb(B,Q,F)}function Kb(B,Q,F){const t=`${B}`.toLowerCase();if(!F.includes(t))throw new Error(`invalid ${Q}: ${B}`);return t}function Ob(B){return Do(B)?B:Pb(B)}function Pb(B){if(null==B||xb(B))return B;if(Yo(B))return Zb(B);switch(B.type){case"FeatureCollection":return B.features;case"GeometryCollection":return B.geometries;case"Feature":case"LineString":case"MultiLineString":case"MultiPoint":case"MultiPolygon":case"Point":case"Polygon":case"Sphere":return[B]}return Array.from(B)}function jb(B,Q,F=Array){return null==B?B:B instanceof F?B.map(Q):F.from(B,Q)}function _b(B,Q=Array){return B instanceof Q?B.slice():Q.from(B)}function $b({y:B,y1:Q,y2:F}){return void 0!==B||void 0!==Q||void 0!==F}function qb(B){return B?.toString===rb}function Bo(B){return qb(B)&&(void 0!==B.type||void 0!==B.domain)}function Qo(B){return qb(B)&&"function"!=typeof B.transform}function Fo(B){return Qo(B)&&void 0===B.value&&void 0===B.channel}function to(B,Q){return void 0===B&&void 0===Q?[Db,Yb]:[B,Q]}function Uo({z:B,fill:Q,stroke:F}={}){return void 0===B&&([B]=Mb(Q)),void 0===B&&([B]=Mb(F)),B}function Io(B){return xb(B)?B.length:B?.numRows}function so(B){const Q=Io(B),F=new Uint32Array(Q);for(let B=0;B<Q;++B)F[B]=B;return F}function go(B,Q){return xb(B)?jb(Q,(Q=>B[Q]),B.constructor):jb(Q,(Q=>B.at(Q)))}function io(B,Q,F){return B.subarray?B.subarray(Q,F):B.slice(Q,F)}function lo(B){return null!==B&&"object"==typeof B?B.valueOf():B}function co(B){let Q;return[{transform:()=>Q,label:no(B)},B=>Q=B]}function eo(B){return null==B?[B]:co(B)}function no(B,Q){return"string"==typeof B?B:B&&void 0!==B.label?B.label:Q}function Co(B,Q){return{transform(F){const t=B.transform(F),U=Q.transform(F);return ho(t)||ho(U)?jb(t,((B,Q)=>new Date((+t[Q]+ +U[Q])/2))):jb(t,((B,Q)=>(+t[Q]+ +U[Q])/2),Float64Array)},label:B.label}}function ao(B,Q){const F=bo(Q?.interval,Q?.type);return F?jb(B,F):B}function bo(B,Q){const F=oo(B,Q);return F&&(B=>Da(B)?F.floor(B):B)}function oo(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)=>lQ(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)=>lQ(Math.ceil(B/Q),F/Q).map((B=>B*Q))}}(B);if("string"==typeof B)return("time"===Q?nb:db)(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 Go(B,Q){if((B=oo(B,Q))&&"function"!=typeof B.range)throw new Error("invalid interval: missing range method");return B}function uo(B){return"function"==typeof B?.range}function ro(B){return void 0===B||Qo(B)?B:{value:B}}function xo(B){return B&&"function"==typeof B[Symbol.iterator]}function Ao(B){for(const Q of B)if(null!=Q)return"object"!=typeof Q||Q instanceof Date}function Lo(B){for(const Q of B){if(null==Q)continue;const B=typeof Q;return"string"===B||"boolean"===B}}function ho(B){for(const Q of B)if(null!=Q)return Q instanceof Date}function yo(B){for(const Q of B)if(null!=Q)return"string"==typeof Q&&isNaN(Q)&&Ka(Q)}function Ro(B){for(const Q of B)if(null!=Q){if("string"!=typeof Q)return!1;if(Q.trim())return!isNaN(Q)}}function Vo(B,Q){let F;for(const t of B)if(null!=t){if(!Q(t))return!1;F=!0}return F}const Zo=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 So(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)||Zo.has(B))}function mo(B){return"number"==typeof B&&(0<=B&&B<=1||isNaN(B))}function Eo(B){return null==B||No(B)}function No(B){return/^\s*none\s*$/i.test(B)}function Xo(B,Q){return zb(B,Q,["middle","top-left","top","top-right","right","bottom-right","bottom","bottom-left","left"])}function po(B="middle"){return Xo(B,"frameAnchor")}function Wo(B){return xo(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 t=`${F}`;if("__proto__"===t)throw new Error(`illegal name: ${t}`);if(Q.has(t))throw new Error(`duplicate name: ${t}`);return Q.add(t),[F,B]})))}(B):B}function Ho(B){return!0===B?B="frame":!1===B?B=null:null!=B&&(B=Kb(B,"clip",["frame","sphere"])),B}function Do(B){return B&&"function"==typeof B.getChild&&"function"==typeof B.toArray&&B.schema&&Array.isArray(B.schema.fields)}function Yo(B){return B&&"function"==typeof B.toArray&&B.type}const fo=Symbol("position"),wo=Symbol("color"),vo=Symbol("radius"),Jo=Symbol("length"),ko=Symbol("opacity"),Mo=Symbol("symbol"),To=Symbol("projection"),zo=new Map([["x",fo],["y",fo],["fx",fo],["fy",fo],["r",vo],["color",wo],["opacity",ko],["symbol",Mo],["length",Jo],["projection",To]]);const Ko=2/Math.sqrt(3),Oo=new Map([["asterisk",QC],["circle",FC],["cross",tC],["diamond",sC],["diamond2",gC],["hexagon",{draw(B,Q){const F=Math.sqrt(Q/Math.PI),t=F*Ko,U=t/2;B.moveTo(0,t),B.lineTo(F,U),B.lineTo(F,-U),B.lineTo(0,-t),B.lineTo(-F,-U),B.lineTo(-F,U),B.closePath()}}],["plus",iC],["square",lC],["square2",cC],["star",CC],["times",hC],["triangle",bC],["triangle2",GC],["wye",LC]]);function Po(B){return B&&"function"==typeof B.draw}function jo(B){return!!Po(B)||"string"==typeof B&&Oo.has(B.toLowerCase())}function _o(B){if(null==B||Po(B))return B;const Q=Oo.get(`${B}`.toLowerCase());if(Q)return Q;throw new Error(`invalid symbol: ${B}`)}function $o({filter:B,sort:Q,reverse:F,transform:t,initializer:U,...I}={},s){if(void 0===t&&(null!=B&&(t=tG(B)),null==Q||Fo(Q)||(t=BG(t,IG(Q))),F&&(t=BG(t,UG))),null!=s&&null!=U)throw new Error("transforms cannot be applied after initializers");return{...I,...(null===Q||Fo(Q))&&{sort:Q},transform:BG(t,s)}}function qo({filter:B,sort:Q,reverse:F,initializer:t,...U}={},I){return void 0===t&&(null!=B&&(t=tG(B)),null==Q||Fo(Q)||(t=QG(t,IG(Q))),F&&(t=QG(t,UG))),{...U,...(null===Q||Fo(Q))&&{sort:Q},initializer:QG(t,I)}}function BG(B,Q){return null==B?null===Q?void 0:Q:null==Q?null===B?void 0:B:function(F,t,U){return({data:F,facets:t}=B.call(this,F,t,U)),Q.call(this,Ob(F),t,U)}}function QG(B,Q){return null==B?null===Q?void 0:Q:null==Q?null===B?void 0:B:function(F,t,U,...I){let s,g,i,l,c,e;return({data:g=F,facets:i=t,channels:s}=B.call(this,F,t,U,...I)),({data:c=g,facets:e=i,channels:l}=Q.call(this,g,i,{...U,...s},...I)),{data:c,facets:e,channels:{...s,...l}}}}function FG(B,Q){return(null!=B.initializer?qo:$o)(B,Q)}function tG(B){return(Q,F)=>{const t=yb(Q,B);return{data:Q,facets:F.map((B=>B.filter((B=>t[B]))))}}}function UG(B,Q){return{data:B,facets:Q.map((B=>B.slice().reverse()))}}function IG(B){return("function"==typeof B&&1!==B.length?sG:gG)(B)}function sG(B){return(Q,F)=>{const t=xb(Q)?(F,t)=>B(Q[F],Q[t]):(F,t)=>B(Q.get(F),Q.get(t));return{data:Q,facets:F.map((B=>B.slice().sort(t)))}}}function gG(B){let Q,F;({channel:Q,value:B,order:F}={...ro(B)});const t=Q?.startsWith("-");if(t&&(Q=Q.slice(1)),void 0===F&&(F=t?fa:Ya),"function"!=typeof F)switch(`${F}`.toLowerCase()){case"ascending":F=Ya;break;case"descending":F=fa;break;default:throw new Error(`invalid order: ${F}`)}return(t,U,I)=>{let s;if(void 0===Q)s=yb(t,B);else{if(void 0===I)throw new Error("channel sort requires an initializer");if(s=I[Q],!s)return{};s=s.value}const g=(B,Q)=>F(s[B],s[Q]);return{data:t,facets:U.map((B=>B.slice().sort(g)))}}}function iG(B,...Q){for(const{name:F}of B)if(Q.includes(F))return!0;return!1}function lG(B,Q,F,t=cG){let U;qb(Q)&&"reduce"in Q&&(U=Q.scale,Q=Q.reduce);const I=t(B,Q,F),[s,g]=co(I.label);let i;return{name:B,output:void 0===U?s:{value:s,scale:U},initialize(B){I.initialize(B),i=g([])},scope(B,Q){I.scope(B,Q)},reduce(B,Q){i.push(I.reduce(B,Q))}}}function cG(B,Q,F,t=nG){const U=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),I=t(Q,U);let s,g;return{label:no(I===rG?null:U,I.label),initialize(B){s=void 0===U?B:yb(B,U),"data"===I.scope&&(g=I.reduceIndex(so(B),s))},scope(B,Q){I.scope===B&&(g=I.reduceIndex(Q,s))},reduce:(B,Q)=>null==I.scope?I.reduceIndex(B,s,Q):I.reduceIndex(B,s,g,Q)}}function eG(B,Q){return Q?EB(B,(B=>Q[B])):[[,B]]}function nG(B,Q,F=dG){if(null==B)return F(B);if("function"==typeof B.reduceIndex)return B;if("function"==typeof B.reduce&&qb(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,t)=>B(go(F,Q),t)}}(B);if(/^p\d{2}$/i.test(B))return CG(function(B){const Q=+`${B}`.slice(1)/100;return(B,F)=>BQ(B,Q,F)}(B));switch(`${B}`.toLowerCase()){case"first":return oG;case"last":return uG;case"identity":return bG;case"count":return rG;case"distinct":return xG;case"sum":return null==Q?rG:AG;case"proportion":return LG(Q,"data");case"proportion-facet":return LG(Q,"facet");case"deviation":return CG(xB);case"min":return CG(PB);case"min-index":return CG(jB);case"max":return CG(KB);case"max-index":return CG(OB);case"mean":return aG(UQ);case"median":return aG(IQ);case"variance":return CG(rB);case"mode":return CG(gQ)}return F(B)}function dG(B){throw new Error(`invalid reduce: ${B}`)}function CG(B){return{reduceIndex:(Q,F)=>B(Q,(B=>F[B]))}}function aG(B){return{reduceIndex(Q,F){const t=B(Q,(B=>F[B]));return ho(F)?new Date(t):t}}}const bG={reduceIndex:(B,Q)=>go(Q,B)},oG={reduceIndex:(B,Q)=>Q[B[0]]},GG={reduceIndex(B,Q){const F=WB(NB(B,(B=>B.length),(B=>Q[B])),Yb),t=F.slice(-5).reverse();if(t.length<F.length){const B=F.slice(0,-4);t[4]=[`… ${B.length.toLocaleString("en-US")} more`,cQ(B,Yb)]}return t.map((([B,Q])=>`${B} (${Q.toLocaleString("en-US")})`)).join("\n")}},uG={reduceIndex:(B,Q)=>Q[B[B.length-1]]},rG={label:"Frequency",reduceIndex:B=>B.length},xG={label:"Distinct",reduceIndex(B,Q){const F=new yB;for(const t of B)F.add(Q[t]);return F.size}},AG=CG(cQ);function LG(B,Q){return null==B?{scope:Q,label:"Frequency",reduceIndex:(B,Q,F=1)=>B.length/F}:{scope:Q,reduceIndex:(B,Q,F=1)=>cQ(B,(B=>Q[B]))/F}}const hG={reduceIndex:(B,Q,{z:F})=>F};function yG(B,{scale:Q,type:F,value:t,filter:U,hint:I,label:s=no(t)},g){return void 0===I&&"function"==typeof t?.transform&&(I=t.hint),RG(g,{scale:Q,type:F,value:yb(B,t),label:s,filter:U,hint:I})}function RG(B,Q){const{scale:F,value:t}=Q;if(!0===F||"auto"===F)switch(B){case"fill":case"stroke":case"color":Q.scale=!0!==F&&Vo(t,So)?null:"color",Q.defaultScale="color";break;case"fillOpacity":case"strokeOpacity":case"opacity":Q.scale=!0!==F&&Vo(t,mo)?null:"opacity",Q.defaultScale="opacity";break;case"symbol":!0!==F&&Vo(t,jo)?(Q.scale=null,Q.value=jb(t,_o)):Q.scale="symbol",Q.defaultScale="symbol";break;default:Q.scale=zo.has(B)?B:null}else if(!1===F)Q.scale=null;else if(null!=F&&!zo.has(F))throw new Error(`unknown scale: ${F}`);return Q}function VG(B,Q){for(const F in B){const t=B[F];if(t.scale===Q)return t}}function ZG(B,Q){const F=B.original;if(F===B)return Q;const t=Q.value,U=Q.value=[];for(let Q=0;Q<F.length;++Q){const I=t[F[Q][0]];for(const F of B[Q])U[F]=I}return Q}function SG(B,Q,F){const t=mG(B,Q);return jb(mG(B,F),((B,Q)=>Math.abs(B-t[Q])),Float64Array)}function mG(B,Q,F){let t=B[Q];if(t||void 0===F||(t=B[F]),t)return t.value;throw new Error(`missing channel: ${Q}`)}function EG(B){if(null==B||"function"==typeof B)return B;switch(`${B}`.toLowerCase()){case"ascending":return NG;case"descending":return XG}throw new Error(`invalid order: ${B}`)}function NG([B,Q],[F,t]){return Ya(Q,t)||Ya(B,F)}function XG([B,Q],[F,t]){return fa(Q,t)||Ya(B,F)}function pG(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",Cn],["category10",dn],["dark2",an],["observable10",bn],["paired",on],["pastel1",Gn],["pastel2",un],["set1",rn],["set2",xn],["set3",An],["tableau10",Ln]]);const HG=new Map([...WG,["brbg",YG(yn,Rn)],["prgn",YG(Vn,Zn)],["piyg",YG(Sn,mn)],["puor",YG(En,Nn)],["rdbu",YG(Xn,pn)],["rdgy",YG(Wn,Hn)],["rdylbu",YG(Dn,Yn)],["rdylgn",YG(fn,wn)],["spectral",YG(vn,Jn)],["burd",fG(Xn,pn)],["buylrd",fG(Dn,Yn)],["blues",DG(dd,Cd)],["greens",DG(ad,bd)],["greys",DG(od,Gd)],["oranges",DG(Ld,hd)],["purples",DG(ud,rd)],["reds",DG(xd,Ad)],["turbo",wG(Wd)],["viridis",wG(Dd)],["magma",wG(Yd)],["inferno",wG(fd)],["plasma",wG(wd)],["cividis",wG(yd)],["cubehelix",wG(Rd)],["warm",wG(Vd)],["cool",wG(Zd)],["bugn",DG(kn,Mn)],["bupu",DG(Tn,zn)],["gnbu",DG(Kn,On)],["orrd",DG(Pn,jn)],["pubu",DG(qn,Bd)],["pubugn",DG(_n,$n)],["purd",DG(Qd,Fd)],["rdpu",DG(td,Ud)],["ylgn",DG(gd,id)],["ylgnbu",DG(Id,sd)],["ylorbr",DG(ld,cd)],["ylorrd",DG(ed,nd)],["rainbow",vG(md)],["sinebow",vG(pd)]]);function DG(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?YU(Q,F):B[F]}function YG(B,Q){return({length:F})=>2===F?[B[3][0],B[3][2]]:(F=Math.max(3,Math.floor(F)))>11?YU(Q,F):B[F]}function fG(B,Q){return({length:F})=>2===F?[B[3][2],B[3][0]]:(F=Math.max(3,Math.floor(F)))>11?YU((B=>Q(1-B)),F):B[F].slice().reverse()}function wG(B){return({length:Q})=>YU(B,Math.max(2,Math.floor(Q)))}function vG(B){return({length:Q})=>YU(B,Math.floor(Q)+1).slice(0,-1)}function JG(B){const Q=`${B}`.toLowerCase();if(!HG.has(Q))throw new Error(`unknown ordinal scheme: ${Q}`);return HG.get(Q)}function kG(B,Q){const F=JG(B),t="function"==typeof F?F({length:Q}):F;return t.length!==Q?t.slice(0,Q):t}const MG=new Map([["brbg",Rn],["prgn",Zn],["piyg",mn],["puor",Nn],["rdbu",pn],["rdgy",Hn],["rdylbu",Yn],["rdylgn",wn],["spectral",Jn],["burd",B=>pn(1-B)],["buylrd",B=>Yn(1-B)],["blues",Cd],["greens",bd],["greys",Gd],["purples",rd],["reds",Ad],["oranges",hd],["turbo",Wd],["viridis",Dd],["magma",Yd],["inferno",fd],["plasma",wd],["cividis",yd],["cubehelix",Rd],["warm",Vd],["cool",Zd],["bugn",Mn],["bupu",zn],["gnbu",On],["orrd",jn],["pubugn",$n],["pubu",Bd],["purd",Fd],["rdpu",Ud],["ylgnbu",sd],["ylgn",id],["ylorbr",cd],["ylorrd",nd],["rainbow",md],["sinebow",pd]]);function TG(B){const Q=`${B}`.toLowerCase();if(!MG.has(Q))throw new Error(`unknown quantitative scheme: ${Q}`);return MG.get(Q)}const zG=new Set(["brbg","prgn","piyg","puor","rdbu","rdgy","rdylbu","rdylgn","spectral","burd","buylrd"]);const KG=B=>Q=>B(1-Q),OG=[0,1],PG=new Map([["number",uU],["rgb",dU],["hsl",XU],["hcl",pU],["lab",function(B,Q){var F=nU((B=kt(B)).l,(Q=kt(Q)).l),t=nU(B.a,Q.a),U=nU(B.b,Q.b),I=nU(B.opacity,Q.opacity);return function(Q){return B.l=F(Q),B.a=t(Q),B.b=U(Q),B.opacity=I(Q),B+""}}]]);function jG(B){const Q=`${B}`.toLowerCase();if(!PG.has(Q))throw new Error(`unknown interpolator: ${Q}`);return PG.get(Q)}function _G(B,Q,F,{type:t,nice:U,clamp:I,zero:s,domain:g=Uu(B,F),unknown:i,round:l,scheme:c,interval:e,range:n=(zo.get(B)===vo?su(F,g):zo.get(B)===Jo?gu(F,g):zo.get(B)===ko?OG:void 0),interpolate:d=(zo.get(B)===wo?null==c&&void 0!==n?dU:TG(void 0!==c?c:"cyclical"===t?"rainbow":"turbo"):l?yU:uU),reverse:C}){if(e=Go(e,t),"cyclical"!==t&&"sequential"!==t||(t="linear"),"function"!=typeof d&&(d=jG(d)),C=!!C,void 0!==n){if((g=Pb(g)).length!==(n=Pb(n)).length){if(1===d.length)throw new Error("invalid piecewise interpolator");d=DU(d,n),n=void 0}}if(1===d.length?(C&&(d=KG(d),C=!1),void 0===n&&(n=Float64Array.from(g,((B,Q)=>Q/(g.length-1))),2===n.length&&(n=OG)),Q.interpolate((n===OG?fb:cu)(d))):Q.interpolate(d),s){const[B,Q]=AB(g);if(B>0||Q<0){(Oa(g=_b(g))||1)===Math.sign(B)?g[0]=0:g[g.length-1]=0}}return C&&(g=eQ(g)),Q.domain(g).unknown(i),U&&(Q.nice(function(B,Q){return!0===B?void 0:"number"==typeof B?B:function(B,Q){if((B=Go(B,Q))&&"function"!=typeof B.ceil)throw new Error("invalid interval: missing ceil method");return B}(B,Q)}(U,t)),g=Q.domain()),void 0!==n&&Q.range(n),I&&Q.clamp(I),{type:t,domain:g,range:n,scale:Q,interpolate:d,interval:e}}function $G(B,Q,{exponent:F=1,...t}){return _G(B,wl().exponent(F),Q,{...t,type:"pow"})}function qG(B,Q,{base:F=10,domain:t=iu(Q),...U}){return _G(B,El().base(F),Q,{...U,domain:t})}function Bu(B,Q,{constant:F=1,...t}){return _G(B,Wl().constant(F),Q,t)}function Qu(B,Q,{range:F,quantiles:t=(void 0===F?5:(F=[...F]).length),n:U=t,scheme:I="rdylbu",domain:s=lu(Q),unknown:g,interpolate:i,reverse:l}){return void 0===F&&(F=void 0!==i?YU(i,U):zo.get(B)===wo?kG(I,U):void 0),s.length>0&&(s=vl(s,void 0===F?{length:U}:F).quantiles()),Fu(B,Q,{domain:s,range:F,reverse:l,unknown:g})}function Fu(B,Q,{domain:F=[0],unknown:t,scheme:U="rdylbu",interpolate:I,range:s=(void 0!==I?YU(I,F.length+1):zo.get(B)===wo?kG(U,F.length+1):void 0),reverse:g}){const i=Oa(F=Pb(F));if(!isNaN(i)&&!function(B,Q){for(let F=1,t=B.length,U=B[0];F<t;++F){const t=cB(U,U=B[F]);if(0!==t&&t!==Q)return!1}return!0}(F,i))throw new Error(`the ${B} scale has a non-monotonic domain`);return g&&(s=eQ(s)),{type:"threshold",scale:Jl(i<0?eQ(F):F,void 0===s?[]:s).unknown(t),domain:F,range:s}}function tu(B,Q=va){return B.length?[PB(B,(({value:B})=>void 0===B?B:PB(B,Q))),KB(B,(({value:B})=>void 0===B?B:KB(B,Q)))]:[0,1]}function Uu(B,Q){const F=zo.get(B);return(F===vo||F===ko||F===Jo?Iu:tu)(Q)}function Iu(B){return[0,B.length?KB(B,(({value:B})=>void 0===B?B:KB(B,va))):1]}function su(B,Q){const F=B.find((({radius:B})=>void 0!==B));if(void 0!==F)return[0,F.radius];const t=BQ(B,.5,(({value:B})=>void 0===B?NaN:BQ(B,.25,Ja))),U=Q.map((B=>3*Math.sqrt(B/t))),I=30/KB(U);return I<1?U.map((B=>B*I)):U}function gu(B,Q){const F=IQ(B,(({value:B})=>void 0===B?NaN:IQ(B,Math.abs))),t=Q.map((B=>12*B/F)),U=60/KB(t);return U<1?t.map((B=>B*U)):t}function iu(B){for(const{value:Q}of B)if(void 0!==Q)for(let F of Q){if(F>0)return tu(B,Ja);if(F<0)return tu(B,ka)}return[1,10]}function lu(B){const Q=[];for(const{value:F}of B)if(void 0!==F)for(const B of F)Q.push(B);return Q}function cu(B){return(Q,F)=>t=>B(Q+t*(F-Q))}let eu,nu=0;function du(B){B!==eu&&(eu=B,console.warn(B),++nu)}function Cu(B,Q,F,t,{type:U,nice:I,clamp:s,domain:g=tu(t),unknown:i,pivot:l=0,scheme:c,range:e,symmetric:n=!0,interpolate:d=(zo.get(B)===wo?null==c&&void 0!==e?dU:TG(void 0!==c?c:"rdbu"):uU),reverse:C}){l=+l,g=Pb(g);let[a,b]=g;if(g.length>2&&du(`Warning: the diverging ${B} scale domain contains extra elements.`),cB(a,b)<0&&([a,b]=[b,a],C=!C),a=Math.min(a,l),b=Math.max(b,l),"function"!=typeof d&&(d=jG(d)),void 0!==e&&(d=1===d.length?cu(d)(...e):DU(d,e)),C&&(d=KG(d)),n){const B=F.apply(l),Q=B-F.apply(a),t=F.apply(b)-B;Q<t?a=F.invert(B-t):Q>t&&(b=F.invert(B+Q))}return Q.domain([a,l,b]).unknown(i).interpolator(d),s&&Q.clamp(s),I&&Q.nice(I),{type:U,domain:[a,b],pivot:l,interpolate:d,scale:Q}}function au(B,Q,F){return Cu(B,gn(),uu,Q,F)}function bu(B,Q,{exponent:F=1,...t}){return Cu(B,en().exponent(F=+F),function(B){return.5===B?xu:{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,{...t,type:"diverging-pow"})}function ou(B,Q,{base:F=10,pivot:t=1,domain:U=tu(Q,t<0?ka:Ja),...I}){return Cu(B,ln().base(F=+F),ru,Q,{domain:U,pivot:t,...I})}function Gu(B,Q,{constant:F=1,...t}){return Cu(B,cn().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,t)}const uu={apply:B=>B,invert:B=>B},ru={apply:Math.log,invert:Math.exp},xu={apply:B=>Math.sign(B)*Math.sqrt(Math.abs(B)),invert:B=>Math.sign(B)*(B*B)};function Au(B,Q,F,t){return _G(B,Q,F,t)}function Lu(B,Q,F){return Au(B,function(){return tl.apply(Un(Ec,Nc,Rc,hc,lc,Ic,tc,Qc,Bc,Dc).domain([new Date(2e3,0,1),new Date(2e3,0,2)]),arguments)}(),Q,F)}function hu(B,Q,F){return Au(B,function(){return tl.apply(Un(Sc,mc,Vc,yc,oc,sc,Uc,Fc,Bc,Yc).domain([Date.UTC(2e3,0,1),Date.UTC(2e3,0,2)]),arguments)}(),Q,F)}const yu=Symbol("ordinal");function Ru(B,Q,F,{type:t,interval:U,domain:I,range:s,reverse:g,hint:i}){return U=Go(U,t),void 0===I&&(I=Su(F,U,B)),"categorical"!==t&&t!==yu||(t="ordinal"),g&&(I=eQ(I)),I=Q.domain(I).domain(),void 0!==s&&("function"==typeof s&&(s=s(I)),Q.range(s)),{type:t,domain:I,range:s,scale:Q,hint:i,interval:U}}function Vu(B,Q,{type:F,interval:t,domain:U,range:I,scheme:s,unknown:g,...i}){let l;if(t=Go(t,F),void 0===U&&(U=Su(Q,t,B)),zo.get(B)===Mo)l=function(B){return{fill:mu(B,"fill"),stroke:mu(B,"stroke")}}(Q),I=void 0===I?function(B){return Eo(B.fill)?RC:yC}(l):jb(I,_o);else if(zo.get(B)===wo&&(void 0!==I||"ordinal"!==F&&F!==yu||(I=function(B,Q="greys"){const F=new Set,[t,U]=kG(Q,2);for(const Q of B)if(null!=Q)if(!0===Q)F.add(U);else{if(!1!==Q)return;F.add(t)}return[...F]}(U,s),void 0!==I&&(s=void 0)),void 0===s&&void 0===I&&(s="ordinal"===F?"turbo":"observable10"),void 0!==s))if(void 0!==I){const B=TG(s),Q=I[0],F=I[1]-I[0];I=({length:t})=>YU((t=>B(Q+F*t)),t)}else I=JG(s);if(g===Il)throw new Error(`implicit unknown on ${B} scale is not supported`);return Ru(B,sl().unknown(g),Q,{...i,type:F,domain:U,range:I,hint:l})}function Zu(B,Q,F,t){let{round:U}=F;return void 0!==U&&B.round(U=!!U),(B=Ru(t,B,Q,F)).round=U,B}function Su(B,Q,F){const t=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)t.add(B)}if(void 0!==Q){const[B,F]=AB(t).map(Q.floor,Q);return Q.range(B,Q.offset(F))}if(t.size>1e4&&zo.get(F)===fo)throw new Error(`implicit ordinal domain of ${F} scale has more than 10,000 values`);return WB(t,Ya)}function mu(B,Q){let F;for(const{hint:t}of B){const B=t?.[Q];if(void 0!==B)if(void 0===F)F=B;else if(F!==B)return}return F}function Eu(B,{label:Q,inset:F=0,insetTop:t=F,insetRight:U=F,insetBottom:I=F,insetLeft:s=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=wu(F,o,{round:zo.get(F)===fo?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?t:0),insetRight:n=(void 0!==c?c:"x"===F?U:0),insetBottom:d=(void 0!==c?c:"y"===F?I:0),insetLeft:a=(void 0!==c?c:"x"===F?s: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?Xu(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 Nu(B){const Q={},F={scales:Q};for(const[t,U]of Object.entries(B)){const{scale:B,type:I,interval:s,label:g}=U;Q[t]=ju(U),F[t]=B,B.type=I,null!=s&&(B.interval=s),null!=g&&(B.label=g)}return F}function Xu(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!Tu(Q)&&Q.percent&&(F=`${F} (%)`),{inferred:!0,toString:()=>F}}function pu(B){const{marginTop:Q,marginRight:F,marginBottom:t,marginLeft:U,width:I,height:s,facet:{marginTop:g,marginRight:i,marginBottom:l,marginLeft:c}}=B;return{marginTop:Math.max(Q,g),marginRight:Math.max(F,i),marginBottom:Math.max(t,l),marginLeft:Math.max(U,c),width:I,height:s}}function Wu({fx:B,fy:Q},F){const{marginTop:t,marginRight:U,marginBottom:I,marginLeft:s,width:g,height:i}=pu(F);return{marginTop:t,marginRight:U,marginBottom:I,marginLeft:s,width:B?B.scale.bandwidth()+s+U:g,height:Q?Q.scale.bandwidth()+t+I:i,facet:{width:g,height:i}}}function Hu(B,Q){if(void 0===B.range){const{insetLeft:F,insetRight:t}=B,{width:U,marginLeft:I=0,marginRight:s=0}=Q,g=I+F,i=U-s-t;B.range=[g,Math.max(g,i)],Tu(B)||(B.range=fu(B)),B.scale.range(B.range)}Yu(B)}function Du(B,Q){if(void 0===B.range){const{insetTop:F,insetBottom:t}=B,{height:U,marginTop:I=0,marginBottom:s=0}=Q,g=I+F,i=U-s-t;B.range=[Math.max(g,i),g],Tu(B)?B.range.reverse():B.range=fu(B),B.scale.range(B.range)}Yu(B)}function Yu(B){void 0===B.round&&function({type:B}){return"point"===B||"band"===B}(B)&&function({scale:B}){const Q=B.domain().length,[F,t]=B.range(),U=B.paddingInner?B.paddingInner():1,I=B.paddingOuter?B.paddingOuter():B.padding(),s=Q-U,g=Math.abs(t-F)/Math.max(1,s+2*I);return(g-Math.floor(g))*s}(B)<=30&&B.scale.round(!0)}function fu(B){const Q=B.scale.domain().length+zu(B);if(!(Q>2))return B.range;const[F,t]=B.range;return Array.from({length:Q},((B,U)=>F+U/(Q-1)*(t-F)))}function wu(B,Q=[],F={}){const t=function(B,Q,{type:F,domain:t,range:U,scheme:I,pivot:s,projection:g}){if(F=Ju(F),"fx"===B||"fy"===B)return"band";"x"!==B&&"y"!==B||null==g||(F=ku);for(const B of Q){const Q=Ju(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===ku)return;if(void 0!==F)return F;if(void 0===t&&!Q.some((({value:B})=>void 0!==B)))return;const i=zo.get(B);if(i===vo)return"sqrt";if(i===ko||i===Jo)return"linear";if(i===Mo)return"ordinal";if((t||U||[]).length>2)return Mu(i);if(void 0!==t){if(Lo(t))return Mu(i);if(ho(t))return"utc"}else{const B=Q.map((({value:B})=>B)).filter((B=>void 0!==B));if(B.some(Lo))return Mu(i);if(B.some(ho))return"utc"}if(i===wo){if(null!=s||function(B){return null!=B&&zG.has(`${B}`.toLowerCase())}(I))return"diverging";if(function(B){return null!=B&&WG.has(`${B}`.toLowerCase())}(I))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&&Tu({type:t})){const F=Q.map((({value:B})=>B)).filter((B=>void 0!==B));F.some(ho)?du(`Warning: some data associated with the ${B} scale are dates. Dates are typically associated with a "utc" or "time" scale rather than a "${vu(t)}" 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 "${vu(t)}".`):F.some(yo)?du(`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 "${vu(t)}" 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 "${vu(t)}".`):F.some(Ro)&&du(`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 "${vu(t)}" 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 "${vu(t)}".`)}switch(F.type=t,t){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=Ou(Q,F,wb);break;case"identity":switch(zo.get(B)){case fo:F=Ou(Q,F,wb);break;case Mo:F=Ou(Q,F,Pu)}break;case"utc":case"time":F=Ou(Q,F,Jb)}switch(t){case"diverging":return au(B,Q,F);case"diverging-sqrt":return function(B,Q,F){return bu(B,Q,{...F,exponent:.5})}(B,Q,F);case"diverging-pow":return bu(B,Q,F);case"diverging-log":return ou(B,Q,F);case"diverging-symlog":return Gu(B,Q,F);case"categorical":case"ordinal":case yu:return Vu(B,Q,F);case"cyclical":case"sequential":case"linear":return function(B,Q,F){return _G(B,xl(),Q,F)}(B,Q,F);case"sqrt":return function(B,Q,F){return $G(B,Q,{...F,exponent:.5})}(B,Q,F);case"threshold":return Fu(B,0,F);case"quantile":return Qu(B,Q,F);case"quantize":return function(B,Q,{range:F,n:t=(void 0===F?5:(F=[...F]).length),scheme:U="rdylbu",domain:I=Uu(B,Q),unknown:s,interpolate:g,reverse:i}){const[l,c]=AB(I);let e;return void 0===F?(e=kB(l,c,t),e[0]<=l&&e.splice(0,1),e[e.length-1]>=c&&e.pop(),t=e.length+1,F=void 0!==g?YU(g,t):zo.get(B)===wo?kG(U,t):void 0):(e=YU(uU(l,c),t+1).slice(1,-1),l instanceof Date&&(e=e.map((B=>new Date(B))))),Oa(Pb(I))<0&&e.reverse(),Fu(B,0,{domain:e,range:F,reverse:i,unknown:s})}(B,Q,F);case"pow":return $G(B,Q,F);case"log":return qG(B,Q,F);case"symlog":return Bu(B,Q,F);case"utc":return hu(B,Q,F);case"time":return Lu(B,Q,F);case"point":return function(B,Q,{align:F=.5,padding:t=.5,...U}){return Zu(ll().align(F).padding(t),Q,U,B)}(B,Q,F);case"band":return function(B,Q,{align:F=.5,padding:t=.1,paddingInner:U=t,paddingOuter:I=("fx"===B||"fy"===B?0:t),...s}){return Zu(gl().align(F).paddingInner(U).paddingOuter(I),Q,s,B)}(B,Q,F);case"identity":return function(B){return{type:"identity",scale:(Q=zo.get(B),Q===fo||Q===vo||Q===Jo||Q===ko?Al():B=>B)};var Q}(B);case void 0:return;default:throw new Error(`unknown scale type: ${t}`)}}function vu(B){return"symbol"==typeof B?B.description:B}function Ju(B){return"string"==typeof B?`${B}`.toLowerCase():B}const ku={toString:()=>"projection"};function Mu(B){switch(B){case fo:return"point";case wo:return yu;default:return"ordinal"}}function Tu({type:B}){return"ordinal"===B||"point"===B||"band"===B||B===yu}function zu({type:B}){return"threshold"===B}function Ku(B){if(void 0===B)return!0;const Q=B.domain(),F=B(Q[0]);for(let t=1,U=Q.length;t<U;++t)if(B(Q[t])-F)return!1;return!0}function Ou(B,{domain:Q,...F},t){for(const F of B)void 0!==F.value&&(void 0===Q&&(Q=F.value?.domain),F.value=t(F.value));return{domain:void 0===Q?Q:t(Q),...F}}function Pu(B){return jb(B,_o)}function ju({scale:B,type:Q,domain:F,range:t,interpolate:U,interval:I,transform:s,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:_b(F),...void 0!==t&&{range:_b(t)},...void 0!==s&&{transform:s},...g&&{percent:g},...void 0!==l&&{unknown:l},...void 0!==I&&{interval:I},...void 0!==U&&{interpolate:U},...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 _u(B,Q){const{fx:F,fy:t}=Eu(B,Q),U=F?.scale.domain(),I=t?.scale.domain();return U&&I?function(...B){const Q="function"==typeof B[B.length-1]&&function(B){return Q=>B(...Q)}(B.pop()),F=(B=B.map(GB)).map(bB),t=B.length-1,U=new Array(t+1).fill(0),I=[];if(t<0||F.some(oB))return I;for(;;){I.push(U.map(((Q,F)=>B[F][Q])));let s=t;for(;++U[s]===F[s];){if(0===s)return Q?I.map(Q):I;U[s--]=0}}}(U,I).map((([B,Q],F)=>({x:B,y:Q,i:F}))):U?U.map(((B,Q)=>({x:B,i:Q}))):I?I.map(((B,Q)=>({y:B,i:Q}))):void 0}function $u(B,{fx:Q,fy:F}){const t=so(B),U=Q?.value,I=F?.value;return Q&&F?NB(t,(B=>(B.fx=U[B[0]],B.fy=I[B[0]],B)),(B=>U[B]),(B=>I[B])):Q?NB(t,(B=>(B.fx=U[B[0]],B)),(B=>U[B])):NB(t,(B=>(B.fy=I[B[0]],B)),(B=>I[B]))}function qu(B){const Q=[],F=new Uint32Array(cQ(B,(B=>B.length)));for(const t of B){let U=0;for(const Q of B)t!==Q&&(F.set(Q,U),U+=Q.length);Q.push(F.slice(0,U))}return Q}const Br=new Map([["top",Ir],["right",ir],["bottom",sr],["left",gr],["top-left",lr(Ir,gr)],["top-right",lr(Ir,ir)],["bottom-left",lr(sr,gr)],["bottom-right",lr(sr,ir)],["top-empty",function(B,{y:Q},{x:F,y:t,empty:U}){if(U)return!1;if(!Q)return;const I=tr(Q,t);if(I>0)return Ur(B,F,Q[I-1])}],["right-empty",function(B,{x:Q},{x:F,y:t,empty:U}){if(U)return!1;if(!Q)return;const I=tr(Q,F);if(I<Q.length-1)return Ur(B,Q[I+1],t)}],["bottom-empty",function(B,{y:Q},{x:F,y:t,empty:U}){if(U)return!1;if(!Q)return;const I=tr(Q,t);if(I<Q.length-1)return Ur(B,F,Q[I+1])}],["left-empty",function(B,{x:Q},{x:F,y:t,empty:U}){if(U)return!1;if(!Q)return;const I=tr(Q,F);if(I>0)return Ur(B,Q[I-1],t)}],["empty",function(B,Q,{empty:F}){return F}]]);const Qr=new WeakMap;function Fr(B){let Q=Qr.get(B);return Q||Qr.set(B,Q=new hB(jb(B,((B,Q)=>[B,Q])))),Q}function tr(B,Q){return Fr(B).get(Q)}function Ur(B,Q,F){return function(B,Q,F){return Q=lo(Q),F=lo(F),B.find((B=>Object.is(lo(B.x),Q)&&Object.is(lo(B.y),F)))}(B,Q,F)?.empty}function Ir(B,{y:Q},{y:F}){return!Q||0===tr(Q,F)}function sr(B,{y:Q},{y:F}){return!Q||tr(Q,F)===Q.length-1}function gr(B,{x:Q},{x:F}){return!Q||0===tr(Q,F)}function ir(B,{x:Q},{x:F}){return!Q||tr(Q,F)===Q.length-1}function lr(B,Q){return function(){return B.apply(null,arguments)&&Q.apply(null,arguments)}}function cr(B,{channels:{fx:Q,fy:F},groups:t}){return Q&&F?B.map((({x:B,y:Q})=>t.get(B)?.get(Q)??[])):Q?B.map((({x:B})=>t.get(B)??[])):B.map((({y:B})=>t.get(B)??[]))}const er=Math.PI,nr=2*er,dr=.618;function Cr({projection:B,inset:Q=0,insetTop:F=Q,insetRight:t=Q,insetBottom:U=Q,insetLeft:I=Q}={},s){if(null==B)return;if("function"==typeof B.stream)return B;let g,i,l="frame";if(qb(B)){let Q;if(({type:B,domain:i,inset:Q,insetTop:F=(void 0!==Q?Q:F),insetRight:t=(void 0!==Q?Q:t),insetBottom:U=(void 0!==Q?Q:U),insetLeft:I=(void 0!==Q?Q:I),clip:l=l,...g}=B),null==B)return}"function"!=typeof B&&({type:B}=ar(B));const{width:c,height:e,marginLeft:n,marginRight:d,marginTop:C,marginBottom:a}=s,b=c-n-d-I-t,o=e-C-a-F-U;if(B=B?.({width:b,height:o,clip:l,...g}),null==B)return;l=function(B,Q,F,t,U){if(!1===B||null==B||"number"==typeof B)return B=>B;!0===B&&(B="frame");if("frame"===`${B}`.toLowerCase())return tg(Q,F,t,U);throw new Error(`unknown projection clip type: ${B}`)}(l,n,C,c-d,e-a);let G,u=n+I,r=C+F;if(null!=i){const[[Q,F],[t,U]]=si(B).bounds(i),I=Math.min(b/(t-Q),o/(U-F));I>0?(u-=(I*(Q+t)-b)/2,r-=(I*(F+U)-o)/2,G=gi({point(B,Q){this.stream.point(B*I+u,Q*I+r)}})):du("Warning: the projection could not be fit to the specified domain; using the default scale.")}return G??=0===u&&0===r?Gr():gi({point(B,Q){this.stream.point(B+u,Q+r)}}),{stream:Q=>B.stream(G.stream(l(Q)))}}function ar(B){switch(`${B}`.toLowerCase()){case"albers-usa":return br(yi,.7463,.4673);case"albers":return or(hi,.7463,.4673);case"azimuthal-equal-area":return br(Si,4,4);case"azimuthal-equidistant":return br(Ei,nr,nr);case"conic-conformal":return or(Di,nr,nr);case"conic-equal-area":return or(Li,6.1702,2.9781);case"conic-equidistant":return or(vi,7.312,3.6282);case"equal-earth":return br(Oi,5.4133,2.6347);case"equirectangular":return br(fi,nr,er);case"gnomonic":return br(ji,3.4641,3.4641);case"identity":return{type:Gr};case"reflect-y":return{type:ur};case"mercator":return br(Xi,nr,nr);case"orthographic":return br($i,2,2);case"stereographic":return br(Bl,2,2);case"transverse-mercator":return br(Fl,nr,nr);default:throw new Error(`unknown projection type: ${B}`)}}function br(B,Q,F){return{type:({width:t,height:U,rotate:I,precision:s=.15,clip:g})=>{const i=B();return null!=s&&i.precision?.(s),null!=I&&i.rotate?.(I),"number"==typeof g&&i.clipAngle?.(g),null!=t&&(i.scale(Math.min(t/Q,U/F)),i.translate([t/2,U/2])),i},aspectRatio:F/Q}}function or(B,Q,F){const{type:t,aspectRatio:U}=br(B,Q,F);return{type:B=>{const{parallels:Q,domain:F,width:U,height:I}=B,s=t(B);return null!=Q&&(s.parallels(Q),void 0===F&&null!=U&&s.fitSize([U,I],{type:"Sphere"})),s},aspectRatio:U}}const Gr=fb({stream:B=>B}),ur=fb(gi({point(B,Q){this.stream.point(B,-Q)}}));function rr(B,Q,F,t){const U=F[B],I=F[Q],s=U.length,g=F[B]=new Float64Array(s).fill(NaN),i=F[Q]=new Float64Array(s).fill(NaN);let l;const c=t.stream({point(B,Q){g[l]=B,i[l]=Q}});for(l=0;l<s;++l)c.point(U[l],I[l])}function xr({projection:B}={}){return null!=B&&("function"==typeof B.stream||(qb(B)&&(B=B.type),null!=B))}function Ar(B){const Q=[],F=[],t={scale:"x",value:Q},U={scale:"y",value:F},I={point(B,t){Q.push(B),F.push(t)},lineStart(){},lineEnd(){},polygonStart(){},polygonEnd(){},sphere(){}};for(const Q of B.value)Ss(Q,I);return[t,U]}function Lr(B={}){const{document:Q=("undefined"!=typeof window?window.document:void 0),clip:F}=B;return{document:Q,clip:Ho(F)}}function hr(B,{document:Q}){return YF(EQ(B).call(Q.documentElement))}const yr=Symbol("unset");function Rr(B){return(1===B.length?Vr:Zr)(B)}function Vr(B){let Q,F=yr;return t=>(Object.is(F,t)||(F=t,Q=B(t)),Q)}function Zr(B){let Q,F;return(...t)=>((F?.length!==t.length||F.some(((B,Q)=>!Object.is(B,t[Q]))))&&(F=t,Q=B(...t)),Q)}const Sr=Rr((B=>new Intl.NumberFormat(B)));function mr(B){return Ma(B,"Invalid Date")}Rr(((B,Q)=>new Intl.DateTimeFormat(B,{timeZone:"UTC",...Q&&{month:Q}}))),Rr(((B,Q)=>new Intl.DateTimeFormat(B,{timeZone:"UTC",...Q&&{weekday:Q}})));const Er=function(B="en-US"){const Q=function(B="en-US"){const Q=Sr(B);return B=>null==B||isNaN(B)?void 0:Q.format(B)}(B);return B=>(B instanceof Date?mr:"number"==typeof B?Q:Wb)(B)}(),Nr=("undefined"!=typeof window?window.devicePixelRatio>1:"undefined"==typeof it)?0:.5;let Xr=0;function pr(B,{title:Q,href:F,ariaLabel:t,ariaDescription:U,ariaHidden:I,target:s,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:A,channels:L},{ariaLabel:h,fill:y="currentColor",fillOpacity:R,stroke:V="none",strokeOpacity:Z,strokeWidth:S,strokeLinecap:m,strokeLinejoin:E,strokeMiterlimit:N,paintOrder:X}){null===y&&(g=null,i=null),null===V&&(l=null,e=null),Eo(y)?Eo(V)||Eo(g)&&!L?.fill||(V="none"):!Eo(V)||Eo(l)&&!L?.stroke||(y="none");const[p,W]=Mb(g,y),[H,D]=Tb(i,R),[Y,f]=Mb(l,V),[w,v]=Tb(e,Z),[J,k]=Tb(o);No(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),No(W)||void 0!==r||(r=X));const[M,T]=Tb(c);return null!==y&&(B.fill=Or(W,"currentColor"),B.fillOpacity=Pr(D,1)),null!==V&&(B.stroke=Or(f,"none"),B.strokeWidth=Pr(T,1),B.strokeOpacity=Pr(v,1),B.strokeLinejoin=Or(n,"miter"),B.strokeLinecap=Or(d,"butt"),B.strokeMiterlimit=Pr(C,4),B.strokeDasharray=Or(a,"none"),B.strokeDashoffset=Or(b,"0")),B.target=Wb(s),B.ariaLabel=Wb(h),B.ariaDescription=Wb(U),B.ariaHidden=Wb(I),B.opacity=Pr(k,1),B.mixBlendMode=Or(G,"normal"),B.imageFilter=Or(u,"none"),B.paintOrder=Or(r,"normal"),B.pointerEvents=Or(x,"auto"),B.shapeRendering=Or(A,"auto"),{title:{value:Q,optional:!0,filter:null},href:{value:F,optional:!0,filter:null},ariaLabel:{value:t,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:J,scale:"auto",optional:!0}}}function Wr(B,Q){Q&&B.text((B=>Er(Q[B])))}function Hr(B,Q){Q&&B.text((([B])=>Er(Q[B])))}function Dr(B,{target:Q,tip:F},{ariaLabel:t,title:U,fill:I,fillOpacity:s,stroke:g,strokeOpacity:i,strokeWidth:l,opacity:c,href:e}){t&&zr(B,"aria-label",(B=>t[B])),I&&zr(B,"fill",(B=>I[B])),s&&zr(B,"fill-opacity",(B=>s[B])),g&&zr(B,"stroke",(B=>g[B])),i&&zr(B,"stroke-opacity",(B=>i[B])),l&&zr(B,"stroke-width",(B=>l[B])),c&&zr(B,"opacity",(B=>c[B])),e&&Tr(B,(B=>e[B]),Q),F||function(B,Q){Q&&B.filter((B=>wa(Q[B]))).append("title").call(Wr,Q)}(B,U)}function Yr(B,{target:Q,tip:F},{ariaLabel:t,title:U,fill:I,fillOpacity:s,stroke:g,strokeOpacity:i,strokeWidth:l,opacity:c,href:e}){t&&zr(B,"aria-label",(([B])=>t[B])),I&&zr(B,"fill",(([B])=>I[B])),s&&zr(B,"fill-opacity",(([B])=>s[B])),g&&zr(B,"stroke",(([B])=>g[B])),i&&zr(B,"stroke-opacity",(([B])=>i[B])),l&&zr(B,"stroke-width",(([B])=>l[B])),c&&zr(B,"opacity",(([B])=>c[B])),e&&Tr(B,(([B])=>e[B]),Q),F||function(B,Q){Q&&B.filter((([B])=>wa(Q[B]))).append("title").call(Hr,Q)}(B,U)}function*fr(B,Q,F,t){const{z:U}=F,{z:I}=t,s=function({ariaLabel:B,title:Q,fill:F,fillOpacity:t,stroke:U,strokeOpacity:I,strokeWidth:s,opacity:g,href:i},{tip:l}){return[B,l?void 0:Q,F,t,U,I,s,g,i].filter((B=>void 0!==B))}(t,F),g=[...Q,...s];for(const Q of I?function(B,Q,F){const t=EB(B,(B=>Q[B]));return void 0===F&&t.size>1+B.length>>1&&du("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."),t.values()}(B,I,U):[B]){let B,F;B:for(const t of Q){for(const B of g)if(!Da(B[t])){F&&F.push(-1);continue B}if(void 0!==B){F.push(t);for(let Q=0;Q<s.length;++Q){if(lo(s[Q][t])!==B[Q]){yield F,B=s.map((B=>lo(B[t]))),F=[t];continue B}}}else F&&(yield F),B=s.map((B=>lo(B[t]))),F=[t]}F&&(yield F)}}function wr(B){const Q=new WeakMap;return(F,t)=>{let U=Q.get(F);if(!U){const I="plot-clip-"+ ++Xr;YF(F.ownerSVGElement).append("clipPath").attr("id",I).call(B,F,t),Q.set(F,U=`url(#${I})`)}return U}}const vr=wr(((B,Q,F)=>{const{width:t,height:U,marginLeft:I,marginRight:s,marginTop:g,marginBottom:i}=F;B.append("rect").attr("x",I).attr("y",g).attr("width",t-s-I).attr("height",U-g-i)})),Jr=wr(((B,Q)=>{const{projection:F}=Q;if(!F)throw new Error('the "sphere" clip option requires a projection');B.append("path").attr("d",si(F)({type:"Sphere"}))}));function kr(B,Q,F,t){!function(B,Q,F,t){let U;const{clip:I=t.clip}=Q;switch(I){case"frame":B=hr("svg:g",t).each((function(){this.appendChild(B.node()),B.node=()=>this})),U=vr(t,F);break;case"sphere":U=Jr(t)}zr(B,"aria-label",Q.ariaLabel),zr(B,"aria-description",Q.ariaDescription),zr(B,"aria-hidden",Q.ariaHidden),zr(B,"clip-path",U)}(B,Q,F,t),zr(B,"class",Q.className),zr(B,"fill",Q.fill),zr(B,"fill-opacity",Q.fillOpacity),zr(B,"stroke",Q.stroke),zr(B,"stroke-width",Q.strokeWidth),zr(B,"stroke-opacity",Q.strokeOpacity),zr(B,"stroke-linejoin",Q.strokeLinejoin),zr(B,"stroke-linecap",Q.strokeLinecap),zr(B,"stroke-miterlimit",Q.strokeMiterlimit),zr(B,"stroke-dasharray",Q.strokeDasharray),zr(B,"stroke-dashoffset",Q.strokeDashoffset),zr(B,"shape-rendering",Q.shapeRendering),zr(B,"filter",Q.imageFilter),zr(B,"paint-order",Q.paintOrder);const{pointerEvents:U=(!1===t.pointerSticky?"none":void 0)}=Q;zr(B,"pointer-events",U)}function Mr(B,Q){!function(B,Q,F){null!=F&&B.style(Q,F)}(B,"mix-blend-mode",Q.mixBlendMode),zr(B,"opacity",Q.opacity)}function Tr(B,Q,F){B.each((function(B){const t=Q(B);if(null!=t){const B=this.ownerDocument.createElementNS(VQ.svg,"a");B.setAttribute("fill","inherit"),B.setAttributeNS(VQ.xlink,"href",t),null!=F&&B.setAttribute("target",F),this.parentNode.insertBefore(B,this).appendChild(this)}}))}function zr(B,Q,F){null!=F&&B.attr(Q,F)}function Kr(B,Q,{x:F,y:t},U=Nr,I=Nr){U+=Q.dx,I+=Q.dy,F?.bandwidth&&(U+=F.bandwidth()/2),t?.bandwidth&&(I+=t.bandwidth()/2),(U||I)&&B.attr("transform",`translate(${U},${I})`)}function Or(B,Q){if((B=Wb(B))!==Q)return B}function Pr(B,Q){if((B=Hb(B))!==Q)return B}const jr=/^-?([_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 _r(B){if(void 0===B)return"plot-d6a7b5";if(B=`${B}`,!jr.test(B))throw new Error(`invalid class name: ${B}`);return B}function $r(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 qr({frameAnchor:B},{width:Q,height:F,marginTop:t,marginRight:U,marginBottom:I,marginLeft:s}){return[/left$/.test(B)?s:/right$/.test(B)?Q-U:(s+Q-U)/2,/^top/.test(B)?t:/^bottom/.test(B)?F-I:(t+F-I)/2]}class Bx{constructor(B,Q={},F={},t){const{facet:U="auto",facetAnchor:I,fx:s,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=t?.clip,channels:G,tip:u,render:r}=F;if(this.data=B,this.sort=Fo(i)?i:null,this.initializer=qo(F).initializer,this.transform=this.initializer?F.transform:$o(F).transform,null===U||!1===U?this.facet=null:(this.facet=Kb(!0===U?"include":U,"facet",["auto","include","exclude","super"]),this.fx=B===Sb&&"string"==typeof s?[s]:s,this.fy=B===Sb&&"string"==typeof g?[g]:g),this.facetAnchor=function(B){if(null==B)return null;const Q=Br.get(`${B}`.toLowerCase());if(Q)return Q;throw new Error(`invalid facet anchor: ${B}`)}(I),Q=Wo(Q),void 0!==G&&(Q={...tx(G),...Q}),void 0!==t&&(Q={...pr(this,F,t),...Q}),this.channels=Object.fromEntries(Object.entries(Q).map((([Q,F])=>{if(Qo(F.value)){const{value:B,label:Q=F.label,scale:t=F.scale}=F.value;F={...F,label:Q,scale:t,value:B}}if(B===Sb&&"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=Ho(o),this.tip=function(B){return!0===B?"xy":!1===B||null==B?null:"string"==typeof B?Kb(B,"tip",["x","y","xy"]):B}(u),this.className=b?_r(b):null,"super"===this.facet){if(s||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=Fx(r,this.render))}initialize(B,Q,F){let t=Ob(this.data);void 0===B&&null!=t&&(B=[so(t)]);const U=B;null!=this.transform&&(({facets:B,data:t}=this.transform(t,B,F)),t=Ob(t)),void 0!==B&&(B.original=U);const I=function(B,Q){return Object.fromEntries(Object.entries(B).map((([B,F])=>[B,yG(Q,F,B)])))}(this.channels,t);return null!=this.sort&&function(B,Q,F,t,U){const{order:I,reverse:s,reduce:g=!0,limit:i}=U;for(const l in U){if(!zo.has(l))continue;let{value:c,order:e=I,reverse:n=s,reduce:d=g,limit:C=i}=ro(U[l]);const a=c?.startsWith("-");if(a&&(c=c.slice(1)),e=void 0===e?a!==("width"===c||"height"===c)?XG:NG:EG(e),null==d||!1===d)continue;const b="fx"===l||"fy"===l?ZG(Q,t[l]):VG(F,l);if(!b)throw new Error(`missing channel for scale: ${l}`);const o=b.value,[G=0,u=1/0]=xo(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?SG(F,"y1","y2"):"width"===c?SG(F,"x1","x2"):mG(F,c,"y"===c?"y2":"x"===c?"x2":void 0),t=nG(!0===d?"max":d,Q);b.domain=()=>{let B=XB(so(o),(B=>t.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(Db)}}}}(t,B,I,Q,this.sort),{data:t,facets:B,channels:I}}filter(B,Q,F){for(const t in Q){const{filter:U=Da}=Q[t];if(null!==U){const Q=F[t];B=B.filter((B=>U(Q[B])))}}return B}project(B,Q,F){for(const t in B)if("x"===B[t].scale&&/^x|x$/.test(t)){const U=t.replace(/^x|x$/,"y");U in B&&"y"===B[U].scale&&rr(t,U,Q,F.projection)}}scale(B,Q,F){const t=function(B,Q){const F=Object.fromEntries(Object.entries(B).map((([B,{scale:F,value:t}])=>{const U=null==F?null:Q[F];return[B,null==U?t:jb(t,U)]})));return F.channels=B,F}(B,Q);return F.projection&&this.project(B,t,F),t}}function Qx(...B){return B.plot=Bx.prototype.plot,B}function Fx(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,t,U,I,s,g){return B.call(this,F,t,U,I,s,((B,F,t,U,I)=>Q.call(this,B,F,t,U,I,g)))}}function tx(B){return Object.fromEntries(Object.entries(Wo(B)).map((([B,Q])=>(void 0===(Q="string"==typeof Q?{value:Q,label:B}:ro(Q)).filter&&null==Q.scale&&(Q={...Q,filter:null}),[B,Q]))))}function Ux(B,Q){return!0===B?.tip?{...B,tip:Q}:qb(B?.tip)&&void 0===B.tip.pointer?{...B,tip:{...B.tip,pointer:Q}}:B}function Ix({x:B,y:Q,fy:F,fx:t},{projection:U,aspectRatio:I},{width:s,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 dr;if(qb(B)){let Q,F;if(({domain:Q,type:B,...F}=B),null!=Q&&null!=B){const t="string"==typeof B?ar(B).type:B,[[U,I],[s,g]]=si(t({...F,width:100,height:100})).bounds(Q),i=(g-I)/(s-U);return i&&isFinite(i)?i<.2?.2:i>5?5:i:dr}}if(null!=B){if("function"!=typeof B){const{aspectRatio:Q}=ar(B);if(Q)return Q}return dr}}(U);if(n){const B=(1.1*e-.1)/(1.1*(t?t.scale.domain().length:1)-.1)*n,Q=Math.max(.1,Math.min(10,B));return Math.round((s-c-i)*Q+g+l)}const d=Q?Tu(Q)?Q.scale.domain().length||1:Math.max(7,17/e):1;if(null!=I){if(I=+I,!(isFinite(I)&&I>0))throw new Error(`invalid aspectRatio: ${I}`);const U=sx("y",Q)/(sx("x",B)*I),e=t?t.scale.bandwidth():1,n=F?F.scale.bandwidth():1;return(U*(e*(s-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*!!t+60}function sx(B,Q){if(!Q)throw new Error(`aspectRatio requires ${B} scale`);const{type:F,domain:t}=Q;let U;switch(F){case"linear":case"utc":case"time":U=Number;break;case"pow":{const B=Q.scale.exponent();U=Q=>Math.pow(Q,B);break}case"log":U=Math.log;break;case"point":case"band":return t.length;default:throw new Error(`unsupported ${B} scale for aspectRatio: ${F}`)}const[I,s]=AB(t);return Math.abs(U(s)-U(I))}const gx=new WeakMap;function ix(B,Q,{x:F,y:t,px:U,py:I,maxRadius:s=40,channels:g,render:i,...l}={}){return s=+s,null!=U&&(F??=null,g={...g,px:{value:U,scale:"x"}}),null!=I&&(t??=null,g={...g,py:{value:I,scale:"y"}}),{x:F,y:t,channels:g,...l,render:Fx((function(F,t,U,I,g,i){const l=(g={...g,pointerSticky:!1}).ownerSVGElement,{data:c}=g.getMarkState(this);let e=gx.get(l);e||gx.set(l,e={sticky:!1,roots:[],renders:[]});let n=e.renders.push(N)-1;const{x:d,y:C,fx:a,fy:b}=t;let o=a?a(F.fx)-I.marginLeft:0,G=b?b(F.fy)-I.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,A]=qr(this,I),{px:L,py:h}=U,y=L?B=>L[B]:nx(U,x),R=h?B=>h[B]:dx(U,A);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[t,U]of r)if(U<Q||U===Q&&t<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 s=i(Q,t,U,I,g);if(Z){if(u){const B=Z.parentNode,Q=Z.getAttribute("transform"),F=s.getAttribute("transform");Q?s.setAttribute("transform",Q):s.removeAttribute("transform"),F?B.setAttribute("transform",F):B.removeAttribute("transform"),s.removeAttribute("aria-label"),s.removeAttribute("aria-description"),s.removeAttribute("aria-hidden")}Z.replaceWith(s)}if(e.roots[n]=Z=s,!(null==V&&r?.size>1)){const B=null==V?null:xb(c)?c[V]:c.get(V);g.dispatchValue(B)}return s}function X(t){if(e.sticky||"mouse"===t.pointerType&&1===t.buttons)return;let[U,g]=fF(t);U-=o,g-=G;const i=U<I.marginLeft||U>I.width-I.marginRight?1:B,l=g<I.marginTop||g>I.height-I.marginBottom?1:Q;let c=null,n=s*s;for(const B of F){const Q=i*(y(B)-U),F=l*(R(B)-g),t=Q*Q+F*F;t<=n&&(c=B,n=t)}if(null!=c&&(1!==B||1!==Q)){const B=y(c)-U,Q=R(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 lx(B){return ix(1,1,B)}function cx(B){return ix(1,.01,B)}function ex(B){return ix(.01,1,B)}function nx({x1:B,x2:Q,x:F=B},t){return B&&Q?F=>(B[F]+Q[F])/2:F?B=>F[B]:()=>t}function dx({y1:B,y2:Q,y:F=B},t){return B&&Q?F=>(B[F]+Q[F])/2:F?B=>F[B]:()=>t}function Cx(B){return Tu(B)&&void 0===B.interval?void 0:"tabular-nums"}const ax=Math.PI/180;function bx(B,{marker:Q,markerStart:F=Q,markerMid:t=Q,markerEnd:U=Q}={}){B.markerStart=ox(F),B.markerMid=ox(t),B.markerEnd=ox(U)}function ox(B){if(null==B||!1===B)return null;if(!0===B)return rx;if("function"==typeof B)return B;switch(`${B}`.toLowerCase()){case"none":return null;case"arrow":return Gx("auto");case"arrow-reverse":return Gx("auto-start-reverse");case"dot":return ux;case"circle":case"circle-fill":return rx;case"circle-stroke":return xx;case"tick":return Ax("auto");case"tick-x":return Ax(90);case"tick-y":return Ax(0)}throw new Error(`invalid marker: ${B}`)}function Gx(B){return(Q,F)=>hr("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 ux(B,Q){return hr("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 rx(B,Q){return hr("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 xx(B,Q){return hr("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 Ax(B){return(Q,F)=>hr("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 Lx=0;function hx(B,Q,{stroke:F},t){return Zx(B,Q,F&&(B=>F[B]),null,t)}function yx(B,Q,{stroke:F,z:t},U){return Zx(B,Q,F&&(([B])=>F[B]),t,U)}const Rx=1,Vx=2;function Zx(B,{markerStart:Q,markerMid:F,markerEnd:t,stroke:U},I=()=>U,s,g){if(!Q&&!F&&!t)return;const i=new Map,l=s&&function(B,Q){const F=new Uint8Array(Q.length),t=B.data().filter((B=>B.length>1)),U=t.length;for(let B=0,I=yr;B<U;++B){const U=t[B];if(U.length>1){const B=U[0];I!==(I=lo(Q[B]))&&(F[B]|=Rx)}}for(let B=U-1,I=yr;B>=0;--B){const U=t[B];if(U.length>1){const B=U[0];I!==(I=lo(Q[B]))&&(F[B]|=Vx)}}return([B])=>F[B]}(B,s);function c(B,Q,F){return function(t){if(F&&!F(t))return;const U=I(t);let s=i.get(Q);s||i.set(Q,s=new Map);let l=s.get(U);if(!l){const B=this.parentNode.insertBefore(Q(U,g),this),F="plot-marker-"+ ++Lx;B.setAttribute("id",F),s.set(U,l=`url(#${F})`)}this.setAttribute(B,l)}}Q&&B.each(c("marker-start",Q,l&&(B=>l(B)&Rx))),F&&l&&B.each(c("marker-start",F,(B=>!(l(B)&Rx)))),F&&B.each(c("marker-mid",F)),t&&B.each(c("marker-end",t,l&&(B=>l(B)&Vx)))}function Sx({inset:B,insetLeft:Q,insetRight:F,...t}={}){return[Q,F]=Ex(B,Q,F),{inset:B,insetLeft:Q,insetRight:F,...t}}function mx({inset:B,insetTop:Q,insetBottom:F,...t}={}){return[Q,F]=Ex(B,Q,F),{inset:B,insetTop:Q,insetBottom:F,...t}}function Ex(B,Q,F){return void 0===B&&void 0===Q&&void 0===F?Nr?[1,0]:[.5,.5]:[Q,F]}function Nx(B,{interval:Q}){return(B={...ro(B)}).interval=oo(void 0===B.interval?Q:B.interval),B}function Xx(B,Q,F,t){const{[B]:U,[`${B}1`]:I,[`${B}2`]:s}=F,{value:g,interval:i}=Nx(U,F);if(null==g||null==i&&!t)return F;const l=no(U);if(null==i){let Q;const U={transform:B=>Q||(Q=yb(B,g)),label:l};return{...F,[B]:void 0,[`${B}1`]:void 0===I?U:I,[`${B}2`]:void 0!==s||I===s&&t?s:U}}let c,e;function n(B){return void 0!==e&&B===c?e:e=jb(yb(c=B,g),(B=>i.floor(B)))}return Q({...F,[B]:void 0,[`${B}1`]:void 0===I?{transform:n,label:l}:I,[`${B}2`]:void 0===s?{transform:B=>n(B).map((B=>i.offset(B))),label:l}:s})}function px(B,Q,F){const{[B]:t}=F,{value:U,interval:I}=Nx(t,F);return null==U||null==I?F:Q({...F,[B]:{label:no(t),transform:B=>{const Q=jb(yb(B,U),(B=>I.floor(B))),F=Q.map((B=>I.offset(B)));return Q.map(ho(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 Wx={ariaLabel:"rule",fill:null,stroke:"currentColor"};class Hx extends Bx{constructor(B,Q={}){const{x:F,y1:t,y2:U,inset:I=0,insetTop:s=I,insetBottom:g=I}=Q;super(B,{x:{value:F,scale:"x",optional:!0},y1:{value:t,scale:"y",optional:!0},y2:{value:U,scale:"y",optional:!0}},Ux(Q,"x"),Wx),this.insetTop=Hb(s),this.insetBottom=Hb(g),bx(this,Q)}render(B,Q,F,t,U){const{x:I,y:s}=Q,{x:g,y1:i,y2:l}=F,{width:c,height:e,marginTop:n,marginRight:d,marginLeft:C,marginBottom:a}=t,{insetTop:b,insetBottom:o}=this;return hr("svg:g",U).call(kr,this,t,U).call(Kr,this,{x:g&&I},Nr,0).call((Q=>Q.selectAll().data(B).enter().append("line").call(Mr,this).attr("x1",g?B=>g[B]:(C+c-d)/2).attr("x2",g?B=>g[B]:(C+c-d)/2).attr("y1",i&&!Ku(s)?B=>i[B]+b:n+b).attr("y2",l&&!Ku(s)?s.bandwidth?B=>l[B]+s.bandwidth()-o:B=>l[B]-o:e-a-o).call(Dr,this,F).call(hx,this,F,U))).node()}}class Dx extends Bx{constructor(B,Q={}){const{x1:F,x2:t,y:U,inset:I=0,insetRight:s=I,insetLeft:g=I}=Q;super(B,{y:{value:U,scale:"y",optional:!0},x1:{value:F,scale:"x",optional:!0},x2:{value:t,scale:"x",optional:!0}},Ux(Q,"y"),Wx),this.insetRight=Hb(s),this.insetLeft=Hb(g),bx(this,Q)}render(B,Q,F,t,U){const{x:I,y:s}=Q,{y:g,x1:i,x2:l}=F,{width:c,height:e,marginTop:n,marginRight:d,marginLeft:C,marginBottom:a}=t,{insetLeft:b,insetRight:o}=this;return hr("svg:g",U).call(kr,this,t,U).call(Kr,this,{y:g&&s},0,Nr).call((Q=>Q.selectAll().data(B).enter().append("line").call(Mr,this).attr("x1",i&&!Ku(I)?B=>i[B]+b:C+b).attr("x2",l&&!Ku(I)?I.bandwidth?B=>l[B]+I.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(Dr,this,F).call(hx,this,F,U))).node()}}function Yx(B,Q){let{x:F=Nb,y:t,y1:U,y2:I,...s}=function(B={}){return Xx("y",mx,B)}(Q);return[U,I]=wx(t,U,I),new Hx(B,{...s,x:F,y1:U,y2:I})}function fx(B,Q){let{y:F=Nb,x:t,x1:U,x2:I,...s}=function(B={}){return Xx("x",Sx,B)}(Q);return[U,I]=wx(t,U,I),new Dx(B,{...s,y:F,x1:U,x2:I})}function wx(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 vx(B,...Q){let F=Q.length;for(let t=0,U=!0;t<F;++t)"function"!=typeof Q[t]&&(U&&(B=B.slice(),U=!1),B.splice(t,2,B[t]+Q[t]+B[t+1]),Q.splice(t,1),--t,--F);return t=>{let U=B[0];for(let I=0;I<F;++I)U+=Q[I](t)+B[I+1];return U}}const Jx={ariaLabel:"text",strokeLinejoin:"round",strokeWidth:3,paintOrder:"stroke"};class kx extends Bx{constructor(B,Q={}){const{x:F,y:t,text:U=(xo(B)&&Ao(B)?Nb:Eb),frameAnchor:I,textAnchor:s=(/right$/i.test(I)?"end":/left$/i.test(I)?"start":"middle"),lineAnchor:g=(/^top/i.test(I)?"top":/^bottom/i.test(I)?"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]=Tb(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(),jx.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:t,scale:"y",optional:!0},fontSize:{value:r,optional:!0},rotate:{value:(A=G,null==A?null:{transform:B=>yb(B,A,Float64Array),label:no(A)}),optional:!0},text:{value:U,filter:wa,optional:!0}},Q,Jx),this.rotate=u,this.textAnchor=Or(s,"middle"),this.lineAnchor=Kb(g,"lineAnchor",["top","middle","bottom"]),this.lineHeight=+i,this.lineWidth=+l,this.textOverflow=Mx(c),this.monospace=!!e,this.fontFamily=Wb(n),this.fontSize=x,this.fontStyle=Wb(C),this.fontVariant=Wb(a),this.fontWeight=Wb(b),this.frameAnchor=po(I),!(this.lineWidth>=0))throw new Error(`invalid lineWidth: ${l}`);this.splitLines=QA(this),this.clipLine=FA(this)}render(B,Q,F,t,U){const{x:I,y:s}=Q,{x:g,y:i,rotate:l,text:c,title:e,fontSize:n}=F,{rotate:d}=this,[C,a]=qr(this,t);return hr("svg:g",U).call(kr,this,t,U).call(Px,this,c,t).call(Kr,this,{x:g&&I,y:i&&s}).call((Q=>Q.selectAll().data(B).enter().append("text").call(Mr,this).call(Tx,this,c,e).attr("transform",vx`translate(${g?B=>g[B]:C},${i?B=>i[B]:a})${l?B=>` rotate(${l[B]})`:d?` rotate(${d})`:""}`).call(zr,"font-size",n&&(B=>n[B])).call(Dr,this,F))).node()}}function Mx(B){return null==B?null:Kb(B,"textOverflow",["clip","ellipsis","clip-start","clip-end","ellipsis-start","ellipsis-middle","ellipsis-end"]).replace(/^(clip|ellipsis)$/,"$1-end")}function Tx(B,Q,F,t){if(!F)return;const{lineAnchor:U,lineHeight:I,textOverflow:s,splitLines:g,clipLine:i}=Q;B.each((function(B){const Q=g(Er(F[B])??"").map(i),l=Q.length,c="top"===U?.71:"bottom"===U?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 t=this.ownerDocument.createElementNS(VQ.svg,"tspan");t.setAttribute("x",0),F===B-1?t.setAttribute("y",(c+F)*I+"em"):t.setAttribute("dy",B*I+"em"),t.textContent=Q[F],this.appendChild(t),B=0}}else c&&this.setAttribute("y",c*I+"em"),this.textContent=Q[0];if(s&&!t&&Q[0]!==F[B]){const Q=this.ownerDocument.createElementNS(VQ.svg,"title");Q.textContent=F[B],this.appendChild(Q)}}))}function zx(B,{x:Q,y:F,...t}={}){return void 0===t.frameAnchor&&([Q,F]=to(Q,F)),new kx(B,{...t,x:Q,y:F})}function Kx(B,{x:Q=Nb,...F}={}){return new kx(B,function(B={}){return px("y",mx,B)}({...F,x:Q}))}function Ox(B,{y:Q=Nb,...F}={}){return new kx(B,function(B={}){return px("x",Sx,B)}({...F,y:Q}))}function Px(B,Q,F){zr(B,"text-anchor",Q.textAnchor),zr(B,"font-family",Q.fontFamily),zr(B,"font-size",Q.fontSize),zr(B,"font-style",Q.fontStyle),zr(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)||ho(B))?"tabular-nums":void 0}(F):Q.fontVariant),zr(B,"font-weight",Q.fontWeight)}const jx=new Set(["inherit","initial","revert","unset","xx-small","x-small","small","medium","large","x-large","xx-large","xxx-large","larger","smaller"]);function _x(B,Q,F){const t=[];let U,I=0;for(const[s,g,i]of function*(B){let Q=0,F=0;const t=B.length;for(;F<t;){let t=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]&&++t;case"\n":yield[Q,F,!0],F+=t,Q=F;break;default:++F}}yield[Q,F,!0]}(B))void 0===U&&(U=s),I>U&&F(B,U,g)>Q&&(t.push(B.slice(U,I)+(""===B[I-1]?"-":"")),U=s),i?(t.push(B.slice(U,g)),U=void 0):I=g;return t}const $x={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 qx(B,Q=0,F=B.length){let t=0;for(let U=Q;U<F;U=lA(B,U))t+=$x[B[U]]??(eA(B,U)?120:$x.e);return t}function BA(B,Q=0,F=B.length){let t=0;for(let U=Q;U<F;U=lA(B,U))t+=eA(B,U)?126:63;return t}function QA({monospace:B,lineWidth:Q,textOverflow:F}){if(null!=F||Q==1/0)return B=>B.split(/\r\n?|\n/g);const t=B?BA:qx,U=100*Q;return B=>_x(B,U,t)}function FA({monospace:B,lineWidth:Q,textOverflow:F}){if(null==F||Q==1/0)return B=>B;const t=B?BA:qx,U=100*Q;switch(F){case"clip-start":return B=>sA(B,U,t,"");case"clip-end":return B=>IA(B,U,t,"");case"ellipsis-start":return B=>sA(B,U,t,tA);case"ellipsis-middle":return B=>function(B,Q,F,t){B=B.trim();const U=F(B);if(U<=Q)return B;const I=F(t)/2,[s,g]=UA(B,Q/2,F,I),[i]=UA(B,U-Q/2-g+I,F,-I);return i<0?t:B.slice(0,s).trimEnd()+t+B.slice(lA(B,i)).trimStart()}(B,U,t,tA);case"ellipsis-end":return B=>IA(B,U,t,tA)}}const tA="…";function UA(B,Q,F,t){const U=[];let I=0;for(let s=0,g=0,i=B.length;s<i;s=g){g=lA(B,s);const i=F(B,s,g);if(I+i>Q){for(I+=t;I>Q&&s>0;)g=s,s=U.pop(),I-=F(B,s,g);return[s,Q-I]}I+=i,U.push(s)}return[-1,0]}function IA(B,Q,F,t){B=B.trim();const U=F(t),[I]=UA(B,Q,F,U);return I<0?B:B.slice(0,I).trimEnd()+t}function sA(B,Q,F,t){const U=F(B=B.trim());if(U<=Q)return B;const I=F(t),[s]=UA(B,U-Q+I,F,-I);return s<0?t:t+B.slice(lA(B,s)).trimStart()}const gA=/[\p{Combining_Mark}\p{Emoji_Modifier}]+/uy,iA=/\p{Extended_Pictographic}/uy;function lA(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!cA(B,Q)&&(gA.lastIndex=Q,gA.test(B))}(B,Q)&&(Q=gA.lastIndex),function(B,Q){return 8205===B.charCodeAt(Q)}(B,Q)?lA(B,Q+1):Q}function cA(B,Q){return B.charCodeAt(Q)<128}function eA(B,Q){return!cA(B,Q)&&(iA.lastIndex=Q,iA.test(B))}const nA={ariaLabel:"vector",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinejoin:"round",strokeLinecap:"round"},dA=3.5,CA=5*dA,aA={draw(B,Q,F){const t=Q*F/CA;B.moveTo(0,0),B.lineTo(0,-Q),B.moveTo(-t,t-Q),B.lineTo(0,-Q),B.lineTo(t,t-Q)}},bA={draw(B,Q,F){B.moveTo(-F,0),B.lineTo(0,-Q),B.lineTo(F,0)}},oA=new Map([["arrow",aA],["spike",bA]]);class GA extends Bx{constructor(B,Q={}){const{x:F,y:t,r:U=dA,length:I,rotate:s,shape:g=aA,anchor:i="middle",frameAnchor:l}=Q,[c,e]=Tb(I,12),[n,d]=Tb(s,0);super(B,{x:{value:F,scale:"x",optional:!0},y:{value:t,scale:"y",optional:!0},length:{value:c,scale:"length",optional:!0},rotate:{value:n,optional:!0}},Q,nA),this.r=+U,this.length=e,this.rotate=d,this.shape=function(B){if(function(B){return B&&"function"==typeof B.draw}(B))return B;const Q=oA.get(`${B}`.toLowerCase());if(Q)return Q;throw new Error(`invalid shape: ${B}`)}(g),this.anchor=Kb(i,"anchor",["start","middle","end"]),this.frameAnchor=po(l)}render(B,Q,F,t,U){const{x:I,y:s}=Q,{x:g,y:i,length:l,rotate:c}=F,{length:e,rotate:n,anchor:d,shape:C,r:a}=this,[b,o]=qr(this,t);return hr("svg:g",U).call(kr,this,t,U).call(Kr,this,{x:g&&I,y:i&&s}).call((Q=>Q.selectAll().data(B).enter().append("path").call(Mr,this).attr("transform",vx`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=vI();return C.draw(Q,l[B],a),Q}:(()=>{const B=vI();return C.draw(B,e,a),B})()).call(Dr,this,F))).node()}}function uA(B,Q={}){const{x:F=Nb,...t}=Q;return new GA(B,{...t,x:F})}function rA(B,Q={}){const{y:F=Nb,...t}=Q;return new GA(B,{...t,y:F})}function xA(B,Q){return arguments.length<2&&!xo(B)&&(Q=B,B=null),void 0===Q&&(Q={}),[B,Q]}function AA({anchor:B}={},Q){return void 0===B?Q[0]:Kb(B,"anchor",Q)}function LA(B){return AA(B,["left","right"])}function hA(B){return AA(B,["right","left"])}function yA(B){return AA(B,["bottom","top"])}function RA(B){return AA(B,["top","bottom"])}function VA(){const[B,Q]=xA(...arguments);return EA("y",LA(Q),B,Q)}function ZA(){const[B,Q]=xA(...arguments);return EA("fy",hA(Q),B,Q)}function SA(){const[B,Q]=xA(...arguments);return NA("x",yA(Q),B,Q)}function mA(){const[B,Q]=xA(...arguments);return NA("fx",RA(Q),B,Q)}function EA(B,Q,F,{color:t="currentColor",opacity:U=1,stroke:I=t,strokeOpacity:s=U,strokeWidth:g=1,fill:i=t,fillOpacity:l=U,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:A=(void 0===G?"left"===Q?40:0:G),label:L,labelAnchor:h,labelArrow:y,labelOffset:R,...V}){return C=Hb(C),a=Hb(a),b=Hb(b),void 0!==h&&(h=Kb(h,"labelAnchor",["center","top","bottom"])),y=_A(y),Qx(C&&!Eo(I)?function(B,Q,F,{strokeWidth:t=1,strokeLinecap:U=null,strokeLinejoin:I=null,facetAnchor:s=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),...C}){return vA(rA,B,F,{ariaLabel:`${B}-axis tick`,ariaHidden:!0},{strokeWidth:t,strokeLinecap:U,strokeLinejoin:I,facetAnchor:s,frameAnchor:g,y:d,...C,dx:"left"===Q?+n-Nr+ +c:+n+Nr-e,anchor:"start",length:i,shape:"left"===Q?KA:OA})}(B,Q,F,{stroke:I,strokeOpacity:s,strokeWidth:g,tickSize:C,tickPadding:a,tickRotate:b,x:o,...V}):null,Eo(i)?null:function(B,Q,F,{facetAnchor:t=Q+("y"===B?"-empty":""),frameAnchor:U=Q,tickSize:I,tickRotate:s=0,tickPadding:g=Math.max(3,9-I)+(Math.abs(s)>60?4*Math.cos(s*ax):0),text:i,textAnchor:l=(Math.abs(s)>60?"middle":"left"===Q?"end":"start"),lineAnchor:c=(s>60?"top":s<-60?"bottom":"middle"),fontVariant:e,inset:n=0,insetLeft:d=n,insetRight:C=n,dx:a=0,y:b=("y"===B?void 0:null),...o}){return vA(Ox,B,F,{ariaLabel:`${B}-axis tick label`},{facetAnchor:t,frameAnchor:U,text:i,textAnchor:l,lineAnchor:c,fontVariant:e,rotate:s,y:b,...o,dx:"left"===Q?+a-I-g+ +d:+a+ +I+ +g-C},(function(B,F,t,U,I){void 0===e&&(this.fontVariant=PA(B)),void 0===i&&(I.text=JA(B,F,t,U,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:A,...V}),Eo(i)||null===L?null:zx([],wA({fill:i,fillOpacity:l,...V},(function(F,t,U,I,s){const g=I[B],{marginTop:i,marginRight:l,marginBottom:c,marginLeft:e}="y"===B&&s.inset||s,n=h??(g.bandwidth?"center":"top"),d=R??("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=`${B}-axis label`,{facets:[[0]],channels:{text:{value:[jA(B,g,{anchor:Q,label:L,labelAnchor:n,labelArrow:y})]}}}}))))}function NA(B,Q,F,{color:t="currentColor",opacity:U=1,stroke:I=t,strokeOpacity:s=U,strokeWidth:g=1,fill:i=t,fillOpacity:l=U,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:A=(void 0===G?20:G),label:L,labelAnchor:h,labelArrow:y,labelOffset:R,...V}){return C=Hb(C),a=Hb(a),b=Hb(b),void 0!==h&&(h=Kb(h,"labelAnchor",["center","left","right"])),y=_A(y),Qx(C&&!Eo(I)?function(B,Q,F,{strokeWidth:t=1,strokeLinecap:U=null,strokeLinejoin:I=null,facetAnchor:s=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),...C}){return vA(uA,B,F,{ariaLabel:`${B}-axis tick`,ariaHidden:!0},{strokeWidth:t,strokeLinejoin:I,strokeLinecap:U,facetAnchor:s,frameAnchor:g,x:d,...C,dy:"bottom"===Q?+n-Nr-e:+n+Nr+ +c,anchor:"start",length:i,shape:"bottom"===Q?TA:zA})}(B,Q,F,{stroke:I,strokeOpacity:s,strokeWidth:g,tickSize:C,tickPadding:a,tickRotate:b,y:o,...V}):null,Eo(i)?null:function(B,Q,F,{facetAnchor:t=Q+("x"===B?"-empty":""),frameAnchor:U=Q,tickSize:I,tickRotate:s=0,tickPadding:g=Math.max(3,9-I)+(Math.abs(s)>=10?4*Math.cos(s*ax):0),text:i,textAnchor:l=(Math.abs(s)>=10?s<0^"bottom"===Q?"start":"end":"middle"),lineAnchor:c=(Math.abs(s)>=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),...o}){return vA(Kx,B,F,{ariaLabel:`${B}-axis tick label`},{facetAnchor:t,frameAnchor:U,text:void 0===i?null:i,textAnchor:l,lineAnchor:c,fontVariant:e,rotate:s,x:b,...o,dy:"bottom"===Q?+a+ +I+ +g-C:+a-I-g+ +d},(function(B,F,t,U,I){void 0===e&&(this.fontVariant=PA(B)),void 0===i&&(I.text=JA(B,F,t,U,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:A,...V}),Eo(i)||null===L?null:zx([],wA({fill:i,fillOpacity:l,...V},(function(F,t,U,I,s){const g=I[B],{marginTop:i,marginRight:l,marginBottom:c,marginLeft:e}="x"===B&&s.inset||s,n=h??(g.bandwidth?"center":"right"),d=R??("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=`${B}-axis label`,{facets:[[0]],channels:{text:{value:[jA(B,g,{anchor:Q,label:L,labelAnchor:n,labelArrow:y})]}}}}))))}function XA(){const[B,Q]=xA(...arguments);return DA("y",LA(Q),B,Q)}function pA(){const[B,Q]=xA(...arguments);return DA("fy",hA(Q),B,Q)}function WA(){const[B,Q]=xA(...arguments);return YA("x",yA(Q),B,Q)}function HA(){const[B,Q]=xA(...arguments);return YA("fx",RA(Q),B,Q)}function DA(B,Q,F,{y:t=("y"===B?void 0:null),x:U=null,x1:I=("left"===Q?U:null),x2:s=("right"===Q?U:null),...g}){return vA(fx,B,F,{ariaLabel:`${B}-grid`,ariaHidden:!0},{y:t,x1:I,x2:s,...fA(g)})}function YA(B,Q,F,{x:t=("x"===B?void 0:null),y:U=null,y1:I=("top"===Q?U:null),y2:s=("bottom"===Q?U:null),...g}){return vA(Yx,B,F,{ariaLabel:`${B}-grid`,ariaHidden:!0},{x:t,y1:I,y2:s,...fA(g)})}function fA({color:B="currentColor",opacity:Q=.1,stroke:F=B,strokeOpacity:t=Q,strokeWidth:U=1,...I}){return{stroke:F,strokeOpacity:t,strokeWidth:U,...I}}function wA({fill:B,fillOpacity:Q,fontFamily:F,fontSize:t,fontStyle:U,fontVariant:I,fontWeight:s,monospace:g,pointerEvents:i,shapeRendering:l,clip:c=!1},e){return[,B]=Mb(B),[,Q]=Tb(Q),{facet:"super",x:null,y:null,fill:B,fillOpacity:Q,fontFamily:F,fontSize:t,fontStyle:U,fontVariant:I,fontWeight:s,monospace:g,pointerEvents:i,shapeRendering:l,clip:c,initializer:e}}function vA(B,Q,F,t,U,I){let s;const g=qo(U).initializer,i=B(F,qo({...U,initializer:function(B,F,t,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)}=U;if("string"==typeof C&&$A(e)&&(d=C,C=void 0),void 0===C&&(C=Go(d,e.type)??function(B,Q){const[F,t]=AB(B.range());return(t-F)/Q}(e,b)),null==B){if(xo(C))B=Pb(C);else if(uo(C))B=MA(C,...AB(n));else if(e.interval){let Q=e.interval;if(e.ticks){const[F,t]=AB(n);Q=ab(Q,(t-F)/Q[sb]/C)??Q,B=MA(Q,F,t)}else{Q=ab(Q,(B=n).length/C)??Q,Q!==e.interval&&(B=MA(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||du(`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=[so(B)]:s[Q]={scale:Q,value:Nb}}I?.call(this,e,B,C,a,s);const o=Object.fromEntries(Object.entries(s).map((([Q,F])=>[Q,{...F,value:yb(B,F.value)}])));return c&&(F=l.filterFacets(B,o)),{data:B,facets:F,channels:o}}},g));return null==F?(s=i.channels,i.channels={}):s={},void 0!==t&&Object.assign(i,t),void 0===i.clip&&(i.clip=!1),i}function JA(B,Q,F,t,U){return{value:kA(B,Q,F,t,U)}}function kA(B,Q,F,t,U){return"function"!=typeof t||"log"===B.type&&B.tickFormat?void 0===t&&Q&&ho(Q)?ob(B.type,Q,U)??Er:B.tickFormat?B.tickFormat("number"==typeof F?F:null,t):void 0===t?Er:"string"==typeof t?(ho(B.domain())?Yc:$I)(t):fb(t):t}function MA(B,Q,F){return B.range(Q,B.offset(B.floor(F)))}const TA={draw(B,Q){B.moveTo(0,0),B.lineTo(0,Q)}},zA={draw(B,Q){B.moveTo(0,0),B.lineTo(0,-Q)}},KA={draw(B,Q){B.moveTo(0,0),B.lineTo(-Q,0)}},OA={draw(B,Q){B.moveTo(0,0),B.lineTo(Q,0)}};function PA(B){return B.bandwidth&&!B.interval?void 0:"tabular-nums"}function jA(B,Q,{anchor:F,label:t=Q.label,labelAnchor:U,labelArrow:I}={}){if(!(null==t||t.inferred&&$A(Q)&&/^(date|time|year)$/i.test(t))){if(t=String(t),"auto"===I&&(I=(!Q.bandwidth||Q.interval)&&!/[↑↓→←]/.test(t)),!I)return t;if(!0===I){const F=function(B){return Math.sign(Oa(B.domain()))*Math.sign(Oa(B.range()))}(Q);F&&(I=/x$/.test(B)||"center"===U?/x$/.test(B)===F<0?"left":"right":F<0?"up":"down")}switch(I){case"left":return`← ${t}`;case"right":return`${t} →`;case"up":return"right"===F?`${t} ↑`:`↑ ${t}`;case"down":return"right"===F?`${t} ↓`:`↓ ${t}`}return t}}function _A(B="auto"){return!Eo(B)&&("boolean"==typeof B?B:Kb(B,"labelArrow",["auto","up","right","down","left"]))}function $A(B){return ho(B.domain())}function qA(B,Q){if(null==Q)return Q;const F=B(Q);if(!F)throw new Error(`scale not found: ${Q}`);return F}function BL(B,Q={},F){let{columns:t,tickFormat:U,fontVariant:I=Cx(B),swatchSize:s=15,swatchWidth:g=s,swatchHeight:i=s,marginLeft:l=0,className:c,style:e,width:n}=Q;const d=Lr(Q);c=_r(c),U=kA(B.scale,B.domain,void 0,U);const C=hr("div",d).attr("class",`${c}-swatches ${c}-swatches-${null!=t?"columns":"wrap"}`);let a;return null!=t?(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",t).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",U).text(U)))):(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(U.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",Or(I,"normal")).call($r,e).node()}const QL=new Map([["symbol",function(B,{fill:Q=(void 0!==B.hint?.fill?B.hint.fill:"none"),fillOpacity:F=1,stroke:t=(void 0!==B.hint?.stroke?B.hint.stroke:Eo(Q)?"currentColor":"none"),strokeOpacity:U=1,strokeWidth:I=1.5,r:s=4.5,...g}={},i){const[l,c]=Mb(Q),[e,n]=Mb(t),d=qA(i,l),C=qA(i,e),a=s*s*Math.PI;return F=Tb(F)[1],U=Tb(U)[1],I=Tb(I)[1],BL(B,g,((Q,t,s,g)=>Q.append("svg").attr("viewBox","-8 -8 16 16").attr("width",s).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",U).attr("stroke-width",I).append("path").attr("d",(Q=>{const F=vI();return B.scale(Q).draw(F,a),F}))))}],["color",tL],["opacity",function({type:B,interpolate:Q,...F},{legend:t=!0,color:U=rt(0,0,0),...I}){if(!Q)throw new Error(`${B} opacity scales are not supported`);!0===t&&(t="ramp");if("ramp"!==`${t}`.toLowerCase())throw new Error(`${t} opacity legends are not supported`);return tL({type:B,...F,interpolate:UL(U)},{legend:t,...I})}]]);function FL({className:B,...Q},{label:F,ticks:t,tickFormat:U}={},I){return function(B={},...Q){let F=B;for(const t of Q)for(const Q in t)if(void 0===F[Q]){const U=t[Q];F===B?F={...F,[Q]:U}:F[Q]=U}return F}(I,{className:B,...Q},{label:F,ticks:t,tickFormat:U})}function tL(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(!Tu(B)&&!zu(B))throw new Error(`swatches legend requires ordinal or threshold color scale (not ${B.type})`);return BL(B,F,((B,F,t,U)=>B.append("svg").attr("width",t).attr("height",U).attr("fill",F.scale).attr("fill-opacity",Tb(Q)[1]).append("rect").attr("width","100%").attr("height","100%")))}(B,F);case"ramp":return function(B,Q){let{label:F=B.label,tickSize:t=6,width:U=240,height:I=44+t,marginTop:s=18,marginRight:g=0,marginBottom:i=16+t,marginLeft:l=0,style:c,ticks:e=(U-l-g)/64,tickFormat:n,fontVariant:d=Cx(B),round:C=!0,opacity:a,className:b}=Q;const o=Lr(Q);b=_r(b),a=Tb(a)[1],null===n&&(n=()=>null);const G=hr("svg",o).attr("class",`${b}-ramp`).attr("font-family","system-ui, sans-serif").attr("font-size",10).attr("width",U).attr("height",I).attr("viewBox",`0 0 ${U} ${I}`).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($r,c);let u,r=B=>B.selectAll(".tick line").attr("y1",s+i-I);const x=C?(B,Q)=>B.rangeRound(Q):(B,Q)=>B.range(Q),{type:A,domain:L,range:h,interpolate:y,scale:R,pivot:V}=B;if(y){const B=void 0===h?y:DU(1===y.length?cu(y):y,h);u=x(R.copy(),YU(uU(l,U-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 t=F.getContext("2d");for(let F=0,U=Q-1;F<Q;++F)t.fillStyle=B(F/U),t.fillRect(F,0,1,1);G.append("image").attr("opacity",a).attr("x",l).attr("y",s).attr("width",U-l-g).attr("height",I-s-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?$I(n):n;u=x(xl().domain([-1,h.length-1]),[l,U-g]),G.append("g").attr("fill-opacity",a).selectAll().data(h).enter().append("rect").attr("x",((B,Q)=>u(Q-1))).attr("y",s).attr("width",((B,Q)=>u(Q)-u(Q-1))).attr("height",I-s-i).attr("fill",(B=>B)),e=jb(B,((B,Q)=>Q)),n=F=>Q(B[F],F)}else u=x(gl().domain(L),[l,U-g]),G.append("g").attr("fill-opacity",a).selectAll().data(L).enter().append("rect").attr("x",u).attr("y",s).attr("width",Math.max(0,u.bandwidth()-1)).attr("height",I-s-i).attr("fill",R),r=()=>{};return G.append("g").attr("transform",`translate(0,${I-i})`).call(rQ(u).ticks(Array.isArray(e)?null:e,"string"==typeof n?n:void 0).tickFormat("function"==typeof n?n:void 0).tickSize(t).tickValues(Array.isArray(e)?e:null)).attr("font-size",null).attr("font-family",null).attr("font-variant",Or(d,"normal")).call(r).call((B=>B.select(".domain").remove())),void 0!==F&&G.append("text").attr("x",l).attr("y",s-6).attr("fill","currentColor").attr("font-weight","bold").text(F),G.node()}(B,F);default:throw new Error(`unknown legend type: ${Q}`)}}function UL(B){const{r:Q,g:F,b:t}=rt(B)||rt(0,0,0);return B=>`rgba(${Q},${F},${t},${B})`}function IL(B={},Q={}){1===arguments.length&&([B,Q]=function(B){const{offset:Q,order:F,reverse:t,...U}=B;return[{offset:Q,order:F,reverse:t},U]}(B));const{x1:F,x:t=F,y:U,...I}=Q,[s,g,i,l]=function(B,Q=Xb,F,t,{offset:U,order:I,reverse:s},g){if(null===Q)throw new Error(`stack requires ${t}`);const i=Uo(g),[l,c]=eo(B),[e,n]=co(Q),[d,C]=co(Q);return e.hint=d.hint=gL,U=function(B){if(null==B)return;if("function"==typeof B)return B;switch(`${B}`.toLowerCase()){case"expand":case"normalize":return lL;case"center":case"silhouette":return cL;case"wiggle":return eL}throw new Error(`unknown offset: ${B}`)}(U),I=function(B,Q,F){if(void 0===B&&Q===eL)return CL(Ya);if(null==B)return;if("string"==typeof B){const Q=B.startsWith("-"),t=Q?fa:Ya;switch((Q?B.slice(1):B).toLowerCase()){case"value":case F:return function(B){return(Q,F,t)=>(Q,F)=>B(t[Q],t[F])}(t);case"z":return function(B){return(Q,F,t,U)=>(Q,F)=>B(U[Q],U[F])}(t);case"sum":return function(B){return oL(B,((B,Q,F,t)=>YB(so(B),(B=>cQ(B,(B=>F[B]))),(B=>t[B]))))}(t);case"appearance":return function(B){return oL(B,((B,Q,F,t)=>YB(so(B),(B=>Q[qB(B,(B=>F[B]))]),(B=>t[B]))))}(t);case"inside-out":return CL(t)}return aL(mb(B))}if("function"==typeof B)return(1===B.length?aL:bL)(B);if(xb(B))return t=B,oL(Ya,(()=>t));var t;throw new Error(`invalid order: ${B}`)}(I,U,t),[$o(g,((t,g,l)=>{({data:t,facets:g}=function(B,Q){if(1===Q.length)return{data:B,facets:Q};const F=Io(B),t=new Uint8Array(F);let U=0;for(const B of Q)for(const Q of B)t[Q]&&++U,t[Q]=1;if(0===U)return{data:B,facets:Q};const I=(B=_b(B))[hb]=new Uint32Array(F+U);Q=Q.map((B=>_b(B,Uint32Array)));let s=F;t.fill(0);for(const F of Q)for(let Q=0,U=F.length;Q<U;++Q){const U=F[Q];t[U]?(F[Q]=s,B[s]=B[U],I[s]=U,++s):I[U]=U,t[U]=1}return{data:B,facets:Q}}(t,g));const e=null==B?void 0:c(ao(yb(t,B),l?.[F])),d=yb(t,Q,Float64Array),a=yb(t,i),b=I&&I(t,e,d,a),o=Io(t),G=n(new Float64Array(o)),u=C(new Float64Array(o)),r=[];for(const B of g){const Q=e?Array.from(EB(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;s&&B.reverse();for(const t of B){const B=d[t];B<0?Q=u[t]=(G[t]=Q)+B:B>0?F=u[t]=(G[t]=F)+B:u[t]=G[t]=F}}r.push(Q)}return U&&U(r,G,u,a),{data:t,facets:g}})),l,e,d]}(t,U,"x","y",B,I);return{...s,x1:F,x:g,y1:i,y2:l,y:Co(i,l)}}function sL({y:B,y1:Q,y2:F,...t}={}){return t=Ux(t,"x"),void 0===Q&&void 0===F?IL({y:B,...t}):([Q,F]=function(B,Q,F,t=Nb){return void 0===Q&&void 0===F?(Q=0,F=void 0===B?t:B):void 0===Q?Q=void 0===B?0:B:void 0===F&&(F=void 0===B?0:B),[Q,F]}(B,Q,F),{...t,y1:Q,y2:F})}const gL={length:!0};function iL(B,Q){let F=0,t=0;for(const U of B){const B=Q[U];B<F&&(F=B),B>t&&(t=B)}return[F,t]}function lL(B,Q,F){for(const t of B)for(const B of t){const[t,U]=iL(B,F);for(const I of B){const B=1/(U-t||1);Q[I]=B*(Q[I]-t),F[I]=B*(F[I]-t)}}}function cL(B,Q,F){for(const t of B){for(const B of t){const[t,U]=iL(B,F);for(const I of B){const B=(U+t)/2;Q[I]-=B,F[I]-=B}}nL(t,Q,F)}dL(B,Q,F)}function eL(B,Q,F,t){for(const U of B){const B=new hB;let I=0;for(const s of U){let U=-1;const g=s.map((B=>Math.abs(F[B]-Q[B]))),i=s.map((I=>{U=t?t[I]:++U;const s=F[I]-Q[I],g=B.has(U)?s-B.get(U):0;return B.set(U,s),g})),l=[0,...uB(i)];for(const B of s)Q[B]+=I,F[B]+=I;const c=cQ(g);c&&(I-=cQ(g,((B,Q)=>(i[Q]/2+l[Q])*B))/c)}nL(U,Q,F)}dL(B,Q,F)}function nL(B,Q,F){const t=PB(B,(B=>PB(B,(B=>Q[B]))));for(const U of B)for(const B of U)Q[B]-=t,F[B]-=t}function dL(B,Q,F){const t=B.length;if(1===t)return;const U=B.map((B=>B.flat())),I=U.map((B=>(PB(B,(B=>Q[B]))+KB(B,(B=>F[B])))/2)),s=PB(I);for(let B=0;B<t;B++){const t=s-I[B];for(const I of U[B])Q[I]+=t,F[I]+=t}}function CL(B){return oL(B,((B,Q,F,t)=>{const U=so(B),I=YB(U,(B=>Q[qB(B,(B=>F[B]))]),(B=>t[B])),s=NB(U,(B=>cQ(B,(B=>F[B]))),(B=>t[B])),g=[],i=[];let l=0;for(const B of I)l<0?(l+=s.get(B),g.push(B)):(l-=s.get(B),i.push(B));return i.reverse().concat(g)}))}function aL(B){return Q=>{const F=yb(Q,B);return(B,Q)=>Ya(F[B],F[Q])}}function bL(B){return Q=>xb(Q)?(F,t)=>B(Q[F],Q[t]):(F,t)=>B(Q.get(F),Q.get(t))}function oL(B,Q){return(F,t,U,I)=>{if(!I)throw new Error("missing channel: z");const s=new hB(Q(F,t,U,I).map(((B,Q)=>[B,Q])));return(Q,F)=>B(s.get(I[Q]),s.get(I[F]))}}const GL={ariaLabel:"rect"};class uL extends Bx{constructor(B,Q={}){const{x1:F,y1:t,x2:U,y2:I}=Q;super(B,{x1:{value:F,scale:"x",type:null!=F&&null==U?"band":void 0,optional:!0},y1:{value:t,scale:"y",type:null!=t&&null==I?"band":void 0,optional:!0},x2:{value:U,scale:"x",optional:!0},y2:{value:I,scale:"y",optional:!0}},Q,GL),rL(this,Q),xL(this,Q)}render(B,Q,F,t,U){const{x:I,y:s}=Q;let{x1:g,y1:i,x2:l,y2:c}=F;const{marginTop:e,marginRight:n,marginBottom:d,marginLeft:C,width:a,height:b}=t,{projection:o}=U,{insetTop:G,insetRight:u,insetBottom:r,insetLeft:x}=this,{rx:A,ry:L,rx1y1:h,rx1y2:y,rx2y1:R,rx2y2:V}=this;(g||l)&&!o&&Ku(I)&&(g=l=null),(i||c)&&!o&&Ku(s)&&(i=c=null);const Z=I?.bandwidth?I.bandwidth():0,S=s?.bandwidth?s.bandwidth():0;return hr("svg:g",U).call(kr,this,t,U).call(Kr,this,{},0,0).call((Q=>Q.selectAll().data(B).enter().call(h||y||R||V?B=>B.append("path").call(Mr,this).call(AL,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(Dr,this,F):B=>B.append("rect").call(Mr,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(zr,"rx",A).call(zr,"ry",L).call(Dr,this,F)))).node()}}function rL(B,{inset:Q=0,insetTop:F=Q,insetRight:t=Q,insetBottom:U=Q,insetLeft:I=Q}={}){B.insetTop=Hb(F),B.insetRight=Hb(t),B.insetBottom=Hb(U),B.insetLeft=Hb(I)}function xL(B,{r:Q,rx:F,ry:t,rx1:U=Q,ry1:I=Q,rx2:s=Q,ry2:g=Q,rx1y1:i=(void 0!==U?+U:void 0!==I?+I:0),rx1y2:l=(void 0!==U?+U:void 0!==g?+g:0),rx2y1:c=(void 0!==s?+s:void 0!==I?+I:0),rx2y2:e=(void 0!==s?+s:void 0!==g?+g:0)}={}){i||l||c||e?(B.rx1y1=i,B.rx1y2=l,B.rx2y1=c,B.rx2y2=e):(B.rx=Or(F,"auto"),B.ry=Or(t,"auto"))}function AL(B,Q,F,t,U,I){const{rx1y1:s,rx1y2:g,rx2y1:i,rx2y2:l}=I;"function"!=typeof Q&&(Q=fb(Q)),"function"!=typeof F&&(F=fb(F)),"function"!=typeof t&&(t=fb(t)),"function"!=typeof U&&(U=fb(U));const c=Math.max(Math.abs(s+i),Math.abs(g+l)),e=Math.max(Math.abs(s+g),Math.abs(i+l));B.attr("d",(B=>{const I=Q(B),n=F(B),d=t(B),C=U(B),a=I>d,b=n>C,o=a?d:I,G=a?I:d,u=b?C:n,r=b?n:C,x=Math.min(1,(G-o)/c,(r-u)/e),A=x*(a?b?l:i:b?g:s),L=x*(a?b?g:s:b?l:i),h=x*(a?b?s:g:b?i:l),y=x*(a?b?i:l:b?s:g);return`M${o},${u+hL(A,y)}A${A},${A} 0 0 ${A<0?0:1} ${o+LL(A,y)},${u}H${G-LL(L,h)}A${L},${L} 0 0 ${L<0?0:1} ${G},${u+hL(L,h)}V${r-hL(h,L)}A${h},${h} 0 0 ${h<0?0:1} ${G-LL(h,L)},${r}H${o+LL(y,A)}A${y},${y} 0 0 ${y<0?0:1} ${o},${r-hL(y,A)}Z`}))}function LL(B,Q){return Q<0?B:Math.abs(B)}function hL(B,Q){return Q<0?Math.abs(B):B}function yL(B,Q={}){return function(B){return function({x:B,x1:Q,x2:F}){return void 0!==B||void 0!==Q||void 0!==F}(B)||$b(B)||void 0!==B.interval}(Q)||(Q={...Q,x:Eb,y2:Nb,interval:1}),new uL(B,sL(function(B={}){return Xx("x",Sx,B,!0)}(function(B={}){return $b(B)?B:{...B,y:Nb}}(Q))))}const RL={ariaLabel:"frame",fill:"none",stroke:"currentColor",clip:!1},VL={ariaLabel:"frame",fill:null,stroke:"currentColor",strokeLinecap:"square",clip:!1};class ZL extends Bx{constructor(B={}){const{anchor:Q=null}=B;super(Sb,void 0,B,null==Q?RL:VL),this.anchor=zb(Q,"anchor",["top","right","bottom","left"]),rL(this,B),Q||xL(this,B)}render(B,Q,F,t,U){const{marginTop:I,marginRight:s,marginBottom:g,marginLeft:i,width:l,height:c}=t,{anchor:e,insetTop:n,insetRight:d,insetBottom:C,insetLeft:a}=this,{rx:b,ry:o,rx1y1:G,rx1y2:u,rx2y1:r,rx2y2:x}=this,A=i+a,L=l-s-d,h=I+n,y=c-g-C;return hr(e?"svg:line":G||u||r||x?"svg:path":"svg:rect",U).datum(0).call(kr,this,t,U).call(Mr,this).call(Dr,this,F).call(Kr,this,{}).call("left"===e?B=>B.attr("x1",A).attr("x2",A).attr("y1",h).attr("y2",y):"right"===e?B=>B.attr("x1",L).attr("x2",L).attr("y1",h).attr("y2",y):"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",y).attr("y2",y):G||u||r||x?B=>B.call(AL,A,h,L,y,this):B=>B.attr("x",A).attr("y",h).attr("width",L-A).attr("height",y-h).attr("rx",b).attr("ry",o)).node()}}const SL={ariaLabel:"tip",fill:"var(--plot-background)",stroke:"currentColor"},mL=new Set(["geometry","href","src","ariaLabel","scales"]);class EL extends Bx{constructor(B,Q={}){Q.tip&&(Q={...Q,tip:!1}),void 0===Q.title&&xo(B)&&Ao(B)&&(Q={...Q,title:Nb});const{x:F,y:t,x1:U,x2:I,y1:s,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:A=8,title:L,pointerSize:h=12,pathFilter:y="drop-shadow(0 3px 4px rgba(0,0,0,0.2))"}=Q;super(B,{x:{value:null!=U&&null!=I?null:F,scale:"x",optional:!0},y:{value:null!=s&&null!=g?null:t,scale:"y",optional:!0},x1:{value:U,scale:"x",optional:null==I},y1:{value:s,scale:"y",optional:null==g},x2:{value:I,scale:"x",optional:null==U},y2:{value:g,scale:"y",optional:null==s},title:{value:L,optional:!0}},Q,SL),this.anchor=Xo(i,"anchor"),this.preferredAnchor=Xo(l,"preferredAnchor"),this.frameAnchor=po(G),this.textAnchor=Or(r,"middle"),this.textPadding=+A,this.pointerSize=+h,this.pathFilter=Wb(y),this.lineHeight=+b,this.lineWidth=+o,this.textOverflow=Mx(x),this.monospace=!!c,this.fontFamily=Wb(e),this.fontSize=Hb(n),this.fontStyle=Wb(d),this.fontVariant=Wb(C),this.fontWeight=Wb(a);for(const B in SL)B in this.channels&&(this[B]=SL[B]);this.splitLines=QA(this),this.clipLine=FA(this),this.format="string"==typeof u||"function"==typeof u?{title:u}:{...u}}render(B,Q,F,t,U){const I=this,{x:s,y:g,fx:i,fy:l}=Q,{ownerSVGElement:c,document:e}=U,{anchor:n,monospace:d,lineHeight:C,lineWidth:a}=this,{textPadding:b,pointerSize:o,pathFilter:G}=this,{marginTop:u,marginLeft:r}=t,{x1:x,y1:A,x2:L,y2:h,x:y=x??L,y:R=A??h}=F,V=i?i(B.fx)-r:0,Z=l?l(B.fy)-u:0,[S,m]=qr(this,t),E=nx(F,S),N=dx(F,m),X=d?BA:qx,p=X(tA);let W,H;"title"in F?(W=XL.call(this,{title:F.channels.title},Q),H=WL):(W=XL.call(this,F.channels,Q),H=HL);const D=hr("svg:g",U).call(kr,this,t,U).call(Px,this).call(Kr,this,{x:y&&s,y:R&&g}).call((t=>t.selectAll().data(B).enter().append("g").attr("transform",(B=>`translate(${Math.round(E(B))},${Math.round(N(B))})`)).call(Mr,this).call((B=>B.append("path").attr("filter",G))).call((t=>t.append("text").each((function(t){const U=YF(this);this.setAttribute("fill","currentColor"),this.setAttribute("fill-opacity",1),this.setAttribute("stroke","none");const s=H.call(I,t,B,W,Q,F);if("string"==typeof s)for(const B of I.splitLines(s))Y(U,{value:I.clipLine(B)});else{const B=new Set;for(const Q of s){const{label:F=""}=Q;F&&B.has(F)||(B.add(F),Y(U,Q))}}}))))));function Y(B,{label:Q,value:F,color:t,opacity:U}){Q??="",F??="";const I=null!=t||null!=U;let s,g=100*a;const[i]=UA(Q,g,X,p);if(i>=0)Q=Q.slice(0,i).trimEnd()+tA,s=F.trim(),F="";else{(Q||!F&&!I)&&(F=" "+F);const[B]=UA(F,g-X(Q),X,p);B>=0&&(s=F.trim(),F=F.slice(0,B).trimEnd()+tA)}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))),I&&l.append("tspan").text(" ■").attr("fill",t).attr("fill-opacity",U).style("user-select","none"),s&&l.append("title").text(s)}function f(){const{width:B,height:Q}=t.facet??t;D.selectChildren().each((function(F){let{x:t,width:U,height:s}=this.getBBox();U=Math.round(U),s=Math.round(s);let g=n;if(void 0===g){const t=E(F)+V,i=N(F)+Z,l=t+U+o+2*b<B,c=t-U-o-2*b>0,e=i+s+o+2*b<Q,n=i-s-o-2*b>0;g=l&&c?e&&n?I.preferredAnchor:n?"bottom":"top":e&&n?l?"left":"right":(l||c)&&(e||n)?`${n?"bottom":"top"}-${l?"left":"right"}`:I.preferredAnchor}const i=this.firstChild,l=this.lastChild;if(i.setAttribute("d",function(B,Q,F,t,U){const I=t+2*F,s=U+2*F;switch(B){case"middle":return`M${-I/2},${-s/2}h${I}v${s}h${-I}z`;case"top-left":return`M0,0l${Q},${Q}h${I-Q}v${s}h${-I}z`;case"top":return`M0,0l${Q/2},${Q/2}h${(I-Q)/2}v${s}h${-I}v${-s}h${(I-Q)/2}z`;case"top-right":return`M0,0l${-Q},${Q}h${Q-I}v${s}h${I}z`;case"right":return`M0,0l${-Q/2},${-Q/2}v${Q/2-s/2}h${-I}v${s}h${I}v${Q/2-s/2}z`;case"bottom-left":return`M0,0l${Q},${-Q}h${I-Q}v${-s}h${-I}z`;case"bottom":return`M0,0l${Q/2},${-Q/2}h${(I-Q)/2}v${-s}h${-I}v${s}h${(I-Q)/2}z`;case"bottom-right":return`M0,0l${-Q},${-Q}h${Q-I}v${-s}h${I}z`;case"left":return`M0,0l${Q/2},${-Q/2}v${Q/2-s/2}h${I}v${s}h${-I}v${Q/2-s/2}z`}}(g,o,b,U,s)),t)for(const B of l.childNodes)B.setAttribute("x",-t);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,t,U){switch(B){case"middle":return[-t/2,U/2];case"top-left":return[F,Q+F];case"top":return[-t/2,Q/2+F];case"top-right":return[-t-F,Q+F];case"right":return[-Q/2-t-F,U/2];case"bottom-left":return[F,-Q-F];case"bottom":return[-t/2,-Q/2-F];case"bottom-right":return[-t-F,-Q-F];case"left":return[F+Q/2,U/2]}}(g,o,b,U,s)})`)})),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 NL(B,{x:Q,y:F,...t}={}){return void 0===t.frameAnchor&&([Q,F]=to(Q,F)),new EL(B,{...t,x:Q,y:F})}function XL(B,Q){const F={};let t=this.format;t=pL(t,B,"x"),t=pL(t,B,"y"),this.format=t;for(const Q in t){const U=t[Q];if(null!==U&&!1!==U)if("fx"===Q||"fy"===Q)F[Q]=!0;else{const t=pG(B,Q);t&&(F[Q]=t)}}for(const Q in B){if(Q in F||Q in t||mL.has(Q))continue;if(("x"===Q||"y"===Q)&&B.geometry)continue;const U=pG(B,Q);if(U){if(null==U.scale&&"color"===U.defaultScale)continue;F[Q]=U}}this.facet&&(Q.fx&&!("fx"in t)&&(F.fx=!0),Q.fy&&!("fy"in t)&&(F.fy=!0));for(const B in F){const t=this.format[B];if("string"==typeof t){const U=F[B]?.value??Q[B]?.domain()??[];this.format[B]=(ho(U)?Yc:$I)(t)}else if(void 0===t||!0===t){const F=Q[B];this.format[B]=F?.bandwidth?kA(F,F.domain()):Er}}return F}function pL(B,Q,F){if(!(F in B))return B;const t=`${F}1`,U=`${F}2`;if(!(!(t in B)&&t in Q||!(U in B)&&U in Q))return B;const I=Object.entries(B),s=B[F];return I.splice(I.findIndex((([B])=>B===F))+1,0,[t,s],[U,s]),Object.fromEntries(I)}function WL(B,Q,{title:F}){return this.format.title(F.value[B],B)}function*HL(B,Q,F,t,U){for(const I in F){if("fx"===I||"fy"===I){yield{label:fL(t,F,I),value:this.format[I](Q[I],B)};continue}if("x1"===I&&"x2"in F)continue;if("y1"===I&&"y2"in F)continue;const s=F[I];if("x2"===I&&"x1"in F)yield{label:YL(t,F,"x"),value:DL(this.format.x2,F.x1,s,B)};else if("y2"===I&&"y1"in F)yield{label:YL(t,F,"y"),value:DL(this.format.y2,F.y1,s,B)};else{const Q=s.value[B],g=s.scale;if(!Da(Q)&&null==g)continue;yield{label:fL(t,F,I),value:this.format[I](Q,B),color:"color"===g?U[I][B]:null,opacity:"opacity"===g?U[I][B]:null}}}}function DL(B,Q,F,t){return F.hint?.length?`${B(F.value[t]-Q.value[t],t)}`:`${B(Q.value[t],t)}–${B(F.value[t],t)}`}function YL(B,Q,F){const t=fL(B,Q,`${F}1`,F),U=fL(B,Q,`${F}2`,F);return t===U?t:`${t}–${U}`}function fL(B,Q,F,t=F){const U=Q[F],I=B[U?.scale??F];return String(I?.label??U?.label??t)}function wL(B={}){const{facet:Q,style:F,title:t,subtitle:U,caption:I,ariaLabel:s,ariaDescription:g}=B,i=_r(B.className),l=void 0===B.marks?[]:JL(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:t,preferredAnchor:U}=B;t=/^x$/i.test(t)?cx:/^y$/i.test(t)?ex:lx,B=t(_L(F,B)),B.title=null,void 0===U&&(B.preferredAnchor=t===ex?"left":"bottom");const I=NL(F.data,B);I.facet=F.facet,I.facetAnchor=F.facetAnchor,Q.push(I)}}return Q}(l));const c=function(B,Q){if(null==B)return;const{x:F,y:t}=B;if(null==F&&null==t)return;const U=Ob(B.data);if(null==U)throw new Error("missing facet data");const I={};null!=F&&(I.fx=yG(U,{value:F,scale:"fx"}));null!=t&&(I.fy=yG(U,{value:t,scale:"fy"}));TL(I,Q);const s=$u(U,I);return{channels:I,groups:s,data:B.data}}(Q,B),e=new Map;for(const Q of l){const F=jL(Q,c,B);F&&e.set(Q,F)}const n=new Map;c&&OL(n,[c],B),OL(n,e,B);const d=JL(function(B,Q,F){let{projection:t,x:U={},y:I={},fx:s={},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)}=U,y:{axis:a=i,grid:b=(null===a?null:l)}=I,fx:{axis:o=e,grid:G=(null===o?null:n)}=s,fy:{axis:u=e,grid:r=(null===u?null:n)}=g}=F;(t||!Bo(U)&&!Fh("x",B))&&(d=C=null);(t||!Bo(I)&&!Fh("y",B))&&(a=b=null);Q.has("fx")||(o=G=null);Q.has("fy")||(u=r=null);void 0===d&&(d=!Qh(B,"x"));void 0===a&&(a=!Qh(B,"y"));void 0===o&&(o=!Qh(B,"fx"));void 0===u&&(u=!Qh(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 qL(x,r,pA,g),$L(x,u,ZA,"right","left",c,g),qL(x,G,HA,s),$L(x,o,mA,"top","bottom",c,s),qL(x,b,XA,I),$L(x,a,VA,"left","right",F,I),qL(x,C,WA,U),$L(x,d,SA,"bottom","top",F,U),x}(l,n,B));for(const Q of d){const F=jL(Q,c,B);F&&e.set(Q,F)}l.unshift(...d);let C=_u(n,B);if(void 0!==C){const B=c?cr(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?cr(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=qu(Q.facetsIndex))}}for(const Q of zo.keys())Bo(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:t}=e.get(Q)??{},{data:U,facets:I,channels:s}=Q.initialize(F,t,B);TL(s,B),a.set(Q,{data:U,facets:I,channels:s})}const b=Eu(OL(n,a,B),B),o=function(B,Q,F={}){let t=.5-Nr,U=.5+Nr,I=.5+Nr,s=.5-Nr;for(const{marginTop:B,marginRight:F,marginBottom:g,marginLeft:i}of Q)B>t&&(t=B),F>U&&(U=F),g>I&&(I=g),i>s&&(s=i);let{margin:g,marginTop:i=(void 0!==g?g:t),marginRight:l=(void 0!==g?g:U),marginBottom:c=(void 0!==g?g:I),marginLeft:e=(void 0!==g?g:s)}=F;i=+i,l=+l,c=+c,e=+e;let{width:n=640,height:d=Ix(B,F,{width:n,marginTopDefault:t,marginRightDefault:U,marginBottomDefault:I,marginLeftDefault:s})+Math.max(0,i-t+c-I)}=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:t=(void 0!==B?B:l),marginBottom:U=(void 0!==B?B:c),marginLeft:I=(void 0!==B?B:e)}=F.facet??{};Q=+Q,t=+t,U=+U,I=+I,C.facet={marginTop:Q,marginRight:t,marginBottom:U,marginLeft:I}}return C}(b,l,B);!function(B,Q){const{x:F,y:t,fx:U,fy:I}=B,s=U||I?pu(Q):Q;U&&Hu(U,s),I&&Du(I,s);const g=U||I?Wu(B,Q):Q;F&&Hu(F,g),t&&Du(t,g)}(b,o);const G=Nu(b),{fx:u,fy:r}=G,x=u||r?Wu(b,o):o,A=u||r?function({fx:B,fy:Q},F){const{marginTop:t,marginRight:U,marginBottom:I,marginLeft:s,width:g,height:i}=pu(F),l=B&&th(B),c=Q&&th(Q);return{marginTop:Q?c[0]:t,marginRight:B?g-l[1]:U,marginBottom:Q?i-c[1]:I,marginLeft:B?l[0]:s,inset:{marginTop:F.marginTop,marginRight:F.marginRight,marginBottom:F.marginBottom,marginLeft:F.marginLeft},width:g,height:i}}(G,o):o,L=Lr(B),h=L.document,y=EQ("svg").call(h.documentElement);let R=y;L.ownerSVGElement=y,L.className=i,L.projection=Cr(B,x),L.filterFacets=(B,Q)=>cr(C,{channels:Q,groups:$u(B,Q)}),L.getMarkState=B=>{const Q=a.get(B),F=e.get(B);return{...Q,channels:{...Q.channels,...F?.channels}}},L.dispatchValue=B=>{R.value!==B&&(R.value=B,R.dispatchEvent(new Event("input",{bubbles:!0})))};const V=new Set;for(const[Q,F]of a)if(null!=Q.initializer){const t="super"===Q.facet?A:x,U=Q.initializer(F.data,F.facets,F.channels,G,t,L);if(void 0!==U.data&&(F.data=U.data),void 0!==U.facets&&(F.facets=U.facets),void 0!==U.channels){const{fx:t,fy:I,...s}=U.channels;KL(s),Object.assign(F.channels,s);for(const Q of Object.values(s)){const{scale:F}=Q;null!=F&&((Z=zo.get(F))!==fo&&Z!==To)&&(zL(Q,B),V.add(F))}null==t&&null==I||e.set(Q,!0)}}var Z;if(V.size){const Q=new Map;OL(Q,a,B,(B=>V.has(B))),OL(n,a,B,(B=>V.has(B)));const F=function(B,Q){for(const F in B){const t=B[F],U=Q[F];void 0===t.label&&U&&(t.label=U.label)}return B}(Eu(Q,B),b),{scales:t,...U}=Nu(F);Object.assign(b,F),Object.assign(G,U),Object.assign(G.scales,t)}let S,m;void 0!==C&&(S={x:u?.domain(),y:r?.domain()},C=function(B,{x:Q,y:F}){return Q&&=Fr(Q),F&&=Fr(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,t)=>Q.get(B.x)-Q.get(t.x)||F.get(B.y)-F.get(t.y):Q?(B,F)=>Q.get(B.x)-Q.get(F.x):(B,Q)=>F.get(B.y)-F.get(Q.y))}(C,S),m=function(B,Q,{marginTop:F,marginLeft:t}){return B&&Q?({x:U,y:I})=>`translate(${B(U)-t},${Q(I)-F})`:B?({x:Q})=>`translate(${B(Q)-t},0)`:({y:B})=>`translate(0,${Q(B)-F})`}(u,r,o));for(const[B,Q]of a)Q.values=B.scale(Q.channels,G,L);const{width:E,height:N}=o;YF(y).attr("class",i).attr("fill","currentColor").attr("font-family","system-ui, sans-serif").attr("font-size",10).attr("text-anchor","middle").attr("width",E).attr("height",N).attr("viewBox",`0 0 ${E} ${N}`).attr("aria-label",s).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($r,F);for(const B of l){const{channels:Q,values:F,facets:t}=a.get(B);if(void 0===C||"super"===B.facet){let U=null;if(t&&(U=t[0],U=B.filter(U,Q,F),0===U.length))continue;const I=B.render(U,G,F,A,L);if(null==I)continue;y.appendChild(I)}else{let U;for(const I of C){if(!(B.facetAnchor?.(C,S,I)??!I.empty))continue;let s=null;if(t){const U=e.has(B);if(s=t[U?I.i:0],s=B.filter(s,Q,F),0===s.length)continue;U||s!==t[0]||(s=io(s)),s.fx=I.x,s.fy=I.y,s.fi=I.i}const g=B.render(s,G,F,x,L);if(null!=g){(U??=YF(y).append("g")).append((()=>g)).datum(I);for(const B of["aria-label","aria-description","aria-hidden","transform"])g.hasAttribute(B)&&(U.attr(B,g.getAttribute(B)),g.removeAttribute(B))}}U?.selectChildren().attr("transform",m)}}const X=function(B,Q,F){const t=[];for(const[U,I]of QL){const s=F[U];if(s?.legend&&U in B){const F=I(B[U],FL(Q,B[U],s),(Q=>B[Q]));null!=F&&t.push(F)}}return t}(b,L,B),{figure:p=null!=t||null!=U||null!=I||X.length>0}=B;p&&(R=h.createElement("figure"),R.className=`${i}-figure`,R.style.maxWidth="initial",null!=t&&R.append(vL(h,t,"h2")),null!=U&&R.append(vL(h,U,"h3")),R.append(...X,y),null!=I&&R.append(function(B,Q){const F=B.createElement("figcaption");return F.append(Q),F}(h,I)),"value"in y&&(R.value=y.value,delete y.value)),R.scale=function(B){return Q=>{if(!zo.has(Q=`${Q}`))throw new Error(`unknown scale: ${Q}`);return B[Q]}}(G.scales),R.legend=function(B,Q,F={}){return(t,U)=>{if(!QL.has(t))throw new Error(`unknown legend type: ${t}`);if(t in B)return QL.get(t)(B[t],FL(Q,F[t],U),(Q=>B[Q]))}}(b,L,B);const W=function(){const B=nu;return nu=0,eu=void 0,B}();return W>0&&YF(y).append("text").attr("x",E).attr("y",20).attr("dy","-1em").attr("text-anchor","end").attr("font-family","initial").text("⚠️").append("title").text(`${W.toLocaleString("en-US")} warning${1===W?"":"s"}. Please check the console.`),R}function vL(B,Q,F){if(Q.ownerDocument)return Q;const t=B.createElement(F);return t.append(Q),t}function JL(B){return B.flat(1/0).filter((B=>null!=B)).map(kL)}function kL(B){return"function"==typeof B.render?B:new ML(B)}class ML extends Bx{constructor(B){if("function"!=typeof B)throw new TypeError("invalid mark; missing render function");super(),this.render=B}render(){}}function TL(B,Q){for(const F in B)zL(B[F],Q);return B}function zL(B,Q){const{scale:F,transform:t=!0}=B;if(null==F||!t)return;const{type:U,percent:I,interval:s,transform:g=(I?B=>null==B?NaN:100*B:bo(s,U))}=Q[F]??{};null!=g&&(B.value=jb(B.value,g),B.transform=!1)}function KL(B){for(const Q in B)RG(Q,B[Q])}function OL(B,Q,F,t=pb){for(const{channels:U}of Q.values())for(const Q in U){const I=U[Q],{scale:s}=I;if(null!=s&&t(s))if("projection"===s){if(!xr(F)){const Q=void 0===F.x?.domain,t=void 0===F.y?.domain;if(Q||t){const[F,U]=Ar(I);Q&&PL(B,"x",F),t&&PL(B,"y",U)}}}else PL(B,s,I)}return B}function PL(B,Q,F){const t=B.get(Q);void 0!==t?t.push(F):B.set(Q,[F])}function jL(B,Q,F){if(null===B.facet||"super"===B.facet)return;const{fx:t,fy:U}=B;if(null!=t||null!=U){const Q=Ob(B.data??t??U);if(void 0===Q)throw new Error(`missing facet data in ${B.ariaLabel}`);if(null===Q)return;const I={};return null!=t&&(I.fx=yG(Q,{value:t,scale:"fx"})),null!=U&&(I.fy=yG(Q,{value:U,scale:"fy"})),TL(I,F),{channels:I,groups:$u(Q,I)}}if(void 0===Q)return;const{channels:I,groups:s,data:g}=Q;if("auto"!==B.facet||B.data===g)return{channels:I,groups:s};g.length>0&&(s.size>1||1===s.size&&I.fx&&I.fy&&[...s][0][1].size>1)&&Io(Ob(B.data))===Io(g)&&du(`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 _L(B,Q={}){return qo({...Q,x:null,y:null},((Q,F,t,U,I,s)=>s.getMarkState(B)))}function $L(B,Q,F,t,U,I,s){if(!Q)return;const g=/^\s*both\s*$/i.test(Q);s=function(B,Q,{line:F=Q.line,ticks:t,tickSize:U,tickSpacing:I,tickPadding:s,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:t,tickSize:U,tickSpacing:I,tickPadding:s,tickFormat:g,tickRotate:i,fontVariant:l,ariaLabel:c,ariaDescription:e,label:n,labelAnchor:d,labelArrow:C,labelOffset:a}}(g?t:Q,I,s);const{line:i}=s;F!==VA&&F!==SA||!i||No(i)||B.push(function(B){return new ZL(B)}(function(B){const{anchor:Q,line:F}=B;return{anchor:Q,facetAnchor:Q+"-empty",stroke:!0===F?void 0:F}}(s))),B.push(F(s)),g&&B.push(F({...s,anchor:U,label:null}))}function qL(B,Q,F,t){Q&&!No(Q)&&B.push(F(function(B,{stroke:Q=(So(B)?B:void 0),ticks:F=(Bh(B)?B:void 0),tickSpacing:t,ariaLabel:U,ariaDescription:I}){return{stroke:Q,ticks:F,tickSpacing:t,ariaLabel:U,ariaDescription:I}}(Q,t)))}function Bh(B){switch(typeof B){case"number":return!0;case"string":return!So(B)}return xo(B)||"function"==typeof B?.range}function Qh(B,Q){const F=`${Q}-axis `;return B.some((B=>B.ariaLabel?.startsWith(F)))}function Fh(B,Q){for(const F of Q)for(const Q in F.channels){const{scale:t}=F.channels[Q];if(t===B||"projection"===t)return!0}return!1}function th(B){const Q=B.domain();if(0===Q.length)return[0,B.bandwidth()];let F=B(Q[0]),t=B(Q[Q.length-1]);return t<F&&([F,t]=[t,F]),[F,t+B.bandwidth()]}const Uh=new Map([["basis",function(B){return new SC(B)}],["basis-closed",function(B){return new mC(B)}],["basis-open",function(B){return new EC(B)}],["bundle",XC],["bump-x",function(B){return new qd(B,!0)}],["bump-y",function(B){return new qd(B,!1)}],["cardinal",HC],["cardinal-closed",YC],["cardinal-open",wC],["catmull-rom",kC],["catmull-rom-closed",TC],["catmull-rom-open",KC],["linear",Pd],["linear-closed",function(B){return new OC(B)}],["monotone-x",function(B){return new qC(B)}],["monotone-y",function(B){return new Ba(B)}],["natural",function(B){return new Fa(B)}],["step",function(B){return new Ua(B,.5)}],["step-after",function(B){return new Ua(B,1)}],["step-before",function(B){return new Ua(B,0)}]]);function Ih(B=sh,Q){return"function"!=typeof B&&"auto"===`${B}`.toLowerCase()?sh:function(B=Pd,Q){if("function"==typeof B)return B;const F=Uh.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 sh(B){return Pd(B)}function gh(B={y:"count"},Q={}){[B,Q]=function({cumulative:B,domain:Q,thresholds:F,interval:t,...U},I){return[U,{cumulative:B,domain:Q,thresholds:F,interval:t,...I}]}(B,Q);const{x:F,y:t}=Q;return function(B,Q,F,t,{data:U=bG,filter:I=rG,sort:s,reverse:g,...i}={},l={}){B=lh(B),Q=lh(Q),i=function(B,Q){return function(B,Q,F=lG){const t=Object.entries(B);return null!=Q.title&&void 0===B.title&&t.push(["title",GG]),null!=Q.href&&void 0===B.href&&t.push(["href",oG]),t.filter((([,B])=>void 0!==B)).map((([B,t])=>null===t?function(B){return{name:B,initialize(){},scope(){},reduce(){}}}(B):F(B,t,Q)))}(B,Q,ch)}(i,l),U=nh(U,Nb),s=null==s?void 0:ch("sort",s,l),I=null==I?void 0:eh("filter",I,l),null!=t&&iG(i,"y","y1","y2")&&(t=null);const[c,e]=eo(B),[n,d]=eo(B),[C,a]=eo(Q),[b,o]=eo(Q),[G,u]=null!=t?[t,"y"]:[],[r,x]=eo(G),{x:A,y:L,z:h,fill:y,stroke:R,x1:V,x2:Z,y1:S,y2:m,domain:E,cumulative:N,thresholds:X,interval:p,...W}=l,[H,D]=eo(h),[Y]=Mb(y),[f]=Mb(R),[w,v]=eo(Y),[J,k]=eo(f);return{..."z"in l&&{z:H||h},..."fill"in l&&{fill:w||y},..."stroke"in l&&{stroke:J||R},...$o(W,((F,t,l)=>{const c=ao(yb(F,G),l?.[u]),n=yb(F,h),C=yb(F,Y),b=yb(F,f),r=function(B,Q){for(const F in Q){const t=Q[F];if(void 0!==t&&!B.some((B=>B.name===F)))return t}}(i,{z:n,fill:C,stroke:b}),A=[],L=[],y=c&&x([]),R=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 t=B?.(F),U=Q?.(F);return t&&U?function*(B){const Q=t.bin(B);for(const[B,[I,s]]of t.entries()){const t=U.bin(Q[B]);for(const[B,[Q,g]]of U.entries())yield[t[B],{data:F,x1:I,y1:Q,x2:s,y2:g}]}}:t?function*(B){const Q=t.bin(B);for(const[B,[U,I]]of t.entries())yield[Q[B],{data:F,x1:U,x2:I}]}:function*(B){const Q=U.bin(B);for(const[B,[t,I]]of U.entries())yield[Q[B],{data:F,y1:t,y2:I}]}}(B,Q,F);let p=0;for(const B of i)B.initialize(F);s&&s.initialize(F),I&&I.initialize(F);for(const B of t){const Q=[];for(const Q of i)Q.scope("facet",B);s&&s.scope("facet",B),I&&I.scope("facet",B);for(const[t,g]of eG(B,r))for(const[B,l]of eG(g,c))for(const[g,e]of X(l))if(r&&(e.z=t),!I||I.reduce(g,e)){Q.push(p++),L.push(U.reduceIndex(g,F,e)),c&&y.push(B),n&&R.push(r===n?t:n[(g.length>0?g:l)[0]]),C&&V.push(r===C?t:C[(g.length>0?g:l)[0]]),b&&Z.push(r===b?t: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);s&&s.reduce(g,e)}A.push(Q)}return function(B,Q,F){if(Q){const F=Q.output.transform(),t=(B,Q)=>Ya(F[B],F[Q]);B.forEach((B=>B.sort(t)))}F&&B.forEach((B=>B.reverse()))}(A,s,g),{data:L,facets:A}})),...!iG(i,"x")&&(c?{x1:c,x2:n,x:Co(c,n)}:{x:A,x1:V,x2:Z}),...!iG(i,"y")&&(C?{y1:C,y2:b,y:Co(C,b)}:{y:L,y1:S,y2:m}),...r&&{[u]:r},...Object.fromEntries(i.map((({name:B,output:Q})=>[B,Q])))}}(function(B,{cumulative:Q,domain:F,thresholds:t,interval:U},I){void 0===(B={...ro(B)}).domain&&(B.domain=F);void 0===B.cumulative&&(B.cumulative=Q);void 0===B.thresholds&&(B.thresholds=t);void 0===B.interval&&(B.interval=U);void 0===B.value&&(B.value=I);return B.thresholds=function(B,Q,F=Ch){if(void 0===B)return void 0===Q?F:Go(Q);if("string"==typeof B){switch(B.toLowerCase()){case"freedman-diaconis":return FQ;case"scott":return tQ;case"sturges":return zB;case"auto":return Ch}return db(B)}return B}(B.thresholds,B.interval),B}(F,Q,Nb),null,0,t,B,Sx(Q))}function ih(B={}){return function(B,Q,F={}){if(null==F?.interval)return F;const{reduce:t=oG}=F,U={filter:null};return null!=F[Q]&&(U[Q]=t),null!=F[`${Q}1`]&&(U[`${Q}1`]=t),null!=F[`${Q}2`]&&(U[`${Q}2`]=t),B(U,F)}(gh,"y",Ux(B,"x"))}function lh(B){if(null==B)return;const{value:Q,cumulative:F,domain:t=AB,thresholds:U}=B,I=B=>{let I,s=yb(B,Q);if(ho(s)||function(B){return function(B){return uo(B)&&"function"==typeof B?.floor&&B.floor()instanceof Date}(B)||xo(B)&&ho(B)}(U)){s=jb(s,kb,Float64Array);let[B,Q]="function"==typeof t?t(s):t,F="function"!=typeof U||uo(U)?U:U(s,B,Q);"number"==typeof F&&(F=mc(B,Q,F)),uo(F)&&(t===AB&&(B=F.floor(B),Q=F.offset(F.floor(Q))),F=F.range(B,F.offset(Q))),I=F}else{s=wb(s);let[B,Q]="function"==typeof t?t(s):t,F="function"!=typeof U||uo(U)?U:U(s,B,Q);if("number"==typeof F)if(t===AB){let t=MB(B,Q,F);if(isFinite(t))if(t>0){let U=Math.round(B/t),I=Math.round(Q/t);U*t<=B||--U,I*t>Q||++I;let s=I-U+1;F=new Float64Array(s);for(let B=0;B<s;++B)F[B]=(U+B)*t}else if(t<0){t=-t;let U=Math.round(B*t),I=Math.round(Q*t);U/t<=B||--U,I/t>Q||++I;let s=I-U+1;F=new Float64Array(s);for(let B=0;B<s;++B)F[B]=(U+B)/t}else F=[B];else F=[B]}else F=kB(B,Q,F);else uo(F)&&(t===AB&&(B=F.floor(B),Q=F.offset(F.floor(Q))),F=F.range(B,F.offset(Q)));I=F}const g=[];if(1===I.length)g.push([I[0],I[0]]);else for(let B=1;B<I.length;++B)g.push([I[B-1],I[B]]);return g.bin=(F<0?oh:F>0?bh:ah)(g,I,s),g};return I.label=no(Q),I}function ch(B,Q,F){return lG(B,Q,F,eh)}function eh(B,Q,F){return cG(B,Q,F,nh)}function nh(B,Q){return nG(B,Q,dh)}function dh(B){switch(`${B}`.toLowerCase()){case"x":return uh;case"x1":return xh;case"x2":return Ah;case"y":return rh;case"y1":return Lh;case"y2":return hh;case"z":return hG}throw new Error(`invalid bin reduce: ${B}`)}function Ch(B,Q,F){return Math.min(200,tQ(B,Q,F))}function ah(B,Q,F){return Q=wb(Q),t=>{const U=B.map((()=>[]));for(const B of t)U[CB(Q,F[B])-1]?.push(B);return U}}function bh(B,Q,F){const t=ah(B,Q,F);return B=>{const Q=t(B);for(let B=1,F=Q.length;B<F;++B){const F=Q[B-1],t=Q[B];for(const B of F)t.push(B)}return Q}}function oh(B,Q,F){const t=ah(B,Q,F);return B=>{const Q=t(B);for(let B=Q.length-2;B>=0;--B){const F=Q[B+1],t=Q[B];for(const B of F)t.push(B)}return Q}}function Gh(B,Q){const F=(+B+ +Q)/2;return B instanceof Date?new Date(F):F}const uh={reduceIndex:(B,Q,{x1:F,x2:t})=>Gh(F,t)},rh={reduceIndex:(B,Q,{y1:F,y2:t})=>Gh(F,t)},xh={reduceIndex:(B,Q,{x1:F})=>F},Ah={reduceIndex:(B,Q,{x2:F})=>F},Lh={reduceIndex:(B,Q,{y1:F})=>F},hh={reduceIndex:(B,Q,{y2:F})=>F},yh={ariaLabel:"dot",fill:"none",stroke:"currentColor",strokeWidth:1.5};function Rh(B){return void 0===B.sort&&void 0===B.reverse?function(B,{sort:Q,...F}={}){return{...(Qo(B)&&void 0!==B.channel?qo:FG)(F,IG(B)),sort:Fo(Q)?Q:null}}({channel:"-r"},B):B}class Vh extends Bx{constructor(B,Q={}){const{x:F,y:t,r:U,rotate:I,symbol:s=FC,frameAnchor:g}=Q,[i,l]=Tb(I,0),[c,e]=function(B){if(null==B||Po(B))return[void 0,B];if("string"==typeof B){const Q=Oo.get(`${B}`.toLowerCase());if(Q)return[void 0,Q]}return[B,void 0]}(s),[n,d]=Tb(U,null==c?3:4.5);super(B,{x:{value:F,scale:"x",optional:!0},y:{value:t,scale:"y",optional:!0},r:{value:n,scale:"r",filter:Ja,optional:!0},rotate:{value:i,optional:!0},symbol:{value:c,scale:"auto",optional:!0}},Rh(Q),yh),this.r=d,this.rotate=l,this.symbol=e,this.frameAnchor=po(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,t,U){const{x:I,y:s}=Q,{x:g,y:i,r:l,rotate:c,symbol:e}=F,{r:n,rotate:d,symbol:C}=this,[a,b]=qr(this,t),o=C===FC,G=l?void 0:n*n*Math.PI;return ka(n)&&(B=[]),hr("svg:g",U).call(kr,this,t,U).call(Kr,this,{x:g&&I,y:i&&s}).call((Q=>Q.selectAll().data(B).enter().append(o?"circle":"path").call(Mr,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",vx`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=vI();return e[B].draw(Q,l[B]*l[B]*Math.PI),Q}:l?B=>{const Q=vI();return C.draw(Q,l[B]*l[B]*Math.PI),Q}:e?B=>{const Q=vI();return e[B].draw(Q,G),Q}:(()=>{const B=vI();return C.draw(B,G),B})())}).call(Dr,this,F))).node()}}function Zh(B,{x:Q,y:F,...t}={}){return void 0===t.frameAnchor&&([Q,F]=to(Q,F)),new Vh(B,{...t,x:Q,y:F})}const Sh={ariaLabel:"line",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round",strokeMiterlimit:1};class mh extends Bx{constructor(B,Q={}){const{x:F,y:t,z:U,curve:I,tension:s}=Q;super(B,{x:{value:F,scale:"x"},y:{value:t,scale:"y"},z:{value:Uo(Q),optional:!0}},Q,Sh),this.z=U,this.curve=Ih(I,s),bx(this,Q)}filter(B){return B}project(B,Q,F){this.curve!==sh&&super.project(B,Q,F)}render(B,Q,F,t,U){const{x:I,y:s}=F,{curve:g}=this;return hr("svg:g",U).call(kr,this,t,U).call(Kr,this,Q).call((Q=>Q.selectAll().data(fr(B,[I,s],this,F)).enter().append("path").call(Mr,this).call(Yr,this,F).call(yx,this,F,U).attr("d",g===sh&&U.projection?function(B,Q,F){const t=si(B);return Q=wb(Q),F=wb(F),B=>{let U=[];const I=[U];for(const t of B)-1===t?(U=[],I.push(U)):U.push([Q[t],F[t]]);return t({type:"MultiLineString",coordinates:I})}}(U.projection,I,s):$d().curve(g).defined((B=>B>=0)).x((B=>I[B])).y((B=>s[B]))))).node()}}function Eh(B,{x:Q=Eb,y:F=Nb,...t}={}){return new mh(B,ih({...t,x:Q,y:F}))}function Nh(B,Q,F){var t=Q,U=function(B){return atob(B)}(B),I=U.indexOf("\n",10)+1,s=U.substring(I)+"//# sourceMappingURL="+t,g=new Blob([s],{type:"application/javascript"});return URL.createObjectURL(g)}function Xh(B,Q,F){var t;return function(F){return t=t||Nh(B,Q),new Worker(t,F)}}Bx.prototype.plot=function({marks:B=[],...Q}={}){return wL({...Q,marks:[...B,this]})};var ph=Xh("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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Q0FBQ1EsUUFBUSxLQUFLLE9BQU8sR0FBSSxDQUFDLEdBQUcsQ0FBQztRQUV0RGYsRUFBRSxJQUFJRyx5QkFBdUIsQ0FBQ1ksUUFBUSxFQUFFRCxNQUFNLENBQUM7RUFDakQsS0FBQyxDQUFDO0VBRUYsSUFBQSxPQUFPZCxFQUFFO0tBQ1Y7O0VBRUQ7RUFDQSxFQUFBLE1BQU1nQixPQUFPLEdBQUcsSUFBSUMsdUJBQXFCLENBQUMvd0IsTUFBTSxFQUFFNnZCLE9BQU8sRUFBRXpkLEtBQUssQ0FBQzVPLElBQUksQ0FBQztFQUN0RTtFQUNBc3RCLEVBQUFBLE9BQU8sQ0FBQzFzQixJQUFJLENBQUMsSUFBSSxDQUFDO0VBQ2xCLEVBQUEsTUFBTTRzQixPQUFPLEdBQUdGLE9BQU8sQ0FBQzlzQixNQUFNLENBQUMsSUFBSSxDQUFDOztFQUVwQztFQUNBLEVBQUEsTUFBTWl0QixPQUFPLEdBQUc7TUFDZDU1QixDQUFDLEVBQUU2NUIsTUFBUyxDQUFDRixPQUFPLENBQUMzNUIsQ0FBQyxDQUFDO0VBQ3ZCdTRCLElBQUFBLElBQUksRUFBRXNCLE1BQVMsQ0FBQ0YsT0FBTyxDQUFDcEIsSUFBSTtLQUM3QjtJQUVEcEcsSUFBSSxDQUFDMkgsV0FBVyxDQUFDO0VBQUNGLElBQUFBLE9BQU8sRUFBRUEsT0FBTztFQUFFRCxJQUFBQSxPQUFPLEVBQUVBO0VBQU8sR0FBQyxDQUFDO0VBQ3hELENBQUM7Ozs7OzsiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMSwzMiwzMywzNCwzNSwzNiwzNywzOCwzOSw0MCw0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSw1Miw1Myw1NCw1NSw1Niw1Nyw1OCw1OSw2MCw2MSw2Miw2Myw2NCw2NSw2Niw2Nyw2OCw2OSw3MCw3MSw3Miw3Myw3NCw3NSw3Niw3Nyw3OCw3OSw4MCw4MSw4Miw4Myw4NCw4NSw4Niw4Nyw4OCw4OSw5MCw5MSw5Miw5Myw5NCw5NSw5Nl19");class Wh extends ia{static get properties(){return{}}constructor(){super(),this.k=Xa.k.DEFAULT,this.choices=[],this.samples=null,this.working=!1,this.queued=!1,this.worker=new ph,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,t,U,I="",s=""){const g=this.choices.find((B=>B.name===I));void 0===g?this.choices.push({as:B,ds:Q,al:F,dl:t,response:U,name:I,label:s}):(g.as=B,g.ds=Q,g.al=F,g.dl=t,g.response=U,g.label=s),this.fit()}static get styles(){return[super.styles,g`
|
|
1374
1467
|
/* :host {
|
|
1375
1468
|
display: inline-block;
|
|
1376
1469
|
} */
|
|
@@ -1394,7 +1487,7 @@ const xu=2;let Su=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,
|
|
|
1394
1487
|
<div>
|
|
1395
1488
|
<div>After ${this.choices.length} trials:</div>
|
|
1396
1489
|
<div>Current:
|
|
1397
|
-
<var class="math-var k">k</var> = ${this.k.toFixed(
|
|
1490
|
+
<var class="math-var k">k</var> = ${this.k.toFixed(3)}
|
|
1398
1491
|
</div>
|
|
1399
1492
|
<div class="param">
|
|
1400
1493
|
<div class="trace k"></div>
|
|
@@ -1405,7 +1498,46 @@ const xu=2;let Su=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,
|
|
|
1405
1498
|
<div class="hist luce"></div>
|
|
1406
1499
|
</div>
|
|
1407
1500
|
</div>
|
|
1408
|
-
`}plotParam(
|
|
1501
|
+
`}plotParam(B){this.shadowRoot.querySelector(`.hist.${B}`).replaceChildren(wL({title:`Posterior of ${B}`,x:{label:`${B}`},width:320,height:240,style:"font-size: 0.75rem; font-family: var(---font-family-base);",marks:[yL(this.samples[B],gh({y:"count"},{x:Nb})),yL(this.samples[B],cx(gh({y:"count"},{x:Nb,stroke:"black",fill:"white",tip:!0})))]})),this.shadowRoot.querySelector(`.trace.${B}`).replaceChildren(wL({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:[Eh(this.samples[B]),Zh(this.samples[B],lx({x:Eb,y:Nb,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",Wh);class Hh extends ia{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`
|
|
1502
|
+
:host {
|
|
1503
|
+
display: inline-block;
|
|
1504
|
+
}
|
|
1505
|
+
|
|
1506
|
+
.holder {
|
|
1507
|
+
display: flex;
|
|
1508
|
+
|
|
1509
|
+
flex-direction: row;
|
|
1510
|
+
|
|
1511
|
+
align-items: stretch;
|
|
1512
|
+
justify-content: center;
|
|
1513
|
+
}
|
|
1514
|
+
|
|
1515
|
+
decidables-slider {
|
|
1516
|
+
line-height: 1;
|
|
1517
|
+
text-align: center;
|
|
1518
|
+
}
|
|
1519
|
+
|
|
1520
|
+
decidables-slider div {
|
|
1521
|
+
margin-bottom: 0.25rem;
|
|
1522
|
+
}
|
|
1523
|
+
|
|
1524
|
+
.k {
|
|
1525
|
+
--decidables-slider-background-color: var(---color-k-light);
|
|
1526
|
+
--decidables-slider-color: var(---color-k);
|
|
1527
|
+
}
|
|
1528
|
+
`]}render(){return M`
|
|
1529
|
+
<div class="holder">
|
|
1530
|
+
${null!=this.k?M`<decidables-slider class="k"
|
|
1531
|
+
?disabled=${!this.interactive}
|
|
1532
|
+
scale
|
|
1533
|
+
min=${Xa.k.MIN}
|
|
1534
|
+
max=${Xa.k.MAX}
|
|
1535
|
+
step=${Xa.k.STEP}
|
|
1536
|
+
.value=${+this.k.toFixed(3)}
|
|
1537
|
+
@change=${this.setK.bind(this)}
|
|
1538
|
+
@input=${this.setK.bind(this)}
|
|
1539
|
+
><div>Discounting Factor<br><span class="math-var">k</span></div></decidables-slider>`:M``}
|
|
1540
|
+
</div>`}}customElements.define("htd-parameters",Hh);class Dh extends ia{static get properties(){return{state:{attribute:"state",type:String,reflect:!0},a:{attribute:"amount",type:Number,reflect:!0},d:{attribute:"delay",type:Number,reflect:!0}}}constructor(){super(),this.states=["choice","fixation","blank"],this.state="choice",this.a=0,this.d=0}static get styles(){return[super.styles,g`
|
|
1409
1541
|
:host {
|
|
1410
1542
|
display: inline-block;
|
|
1411
1543
|
|
|
@@ -1464,7 +1596,7 @@ const xu=2;let Su=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,
|
|
|
1464
1596
|
--decidables-spinner-postfix: "days";
|
|
1465
1597
|
--decidables-spinner-postfix-padding: 3.75rem;
|
|
1466
1598
|
}
|
|
1467
|
-
`]}sendEvent(){this.dispatchEvent(new CustomEvent("itc-option-change",{detail:{a:this.a,d:this.d},bubbles:!0}))}aInput(
|
|
1599
|
+
`]}sendEvent(){this.dispatchEvent(new CustomEvent("itc-option-change",{detail:{a:this.a,d:this.d},bubbles:!0}))}aInput(B){this.a=parseFloat(B.target.value),this.sendEvent()}dInput(B){this.d=parseFloat(B.target.value),this.sendEvent()}render(){return M`
|
|
1468
1600
|
<div class="holder">
|
|
1469
1601
|
${"choice"===this.state?this.interactive?M`<decidables-spinner
|
|
1470
1602
|
class="amount interactive"
|
|
@@ -1487,7 +1619,7 @@ const xu=2;let Su=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,
|
|
|
1487
1619
|
class="delay static"
|
|
1488
1620
|
>${this.d} days</div>`:""}
|
|
1489
1621
|
</div>
|
|
1490
|
-
`}}customElements.define("itc-option",
|
|
1622
|
+
`}}customElements.define("itc-option",Dh);class Yh extends ia{static get properties(){return{state:{attribute:"state",type:String,reflect:!0},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}}}constructor(){super(),this.states=["choice","fixation","blank"],this.state="choice",this.as=10,this.ds=5,this.al=40,this.dl=30}static get styles(){return[super.styles,g`
|
|
1491
1623
|
:host {
|
|
1492
1624
|
display: inline-block;
|
|
1493
1625
|
}
|
|
@@ -1511,7 +1643,7 @@ const xu=2;let Su=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,
|
|
|
1511
1643
|
width: 10rem;
|
|
1512
1644
|
height: 10rem;
|
|
1513
1645
|
}
|
|
1514
|
-
`]}sendEvent(){this.dispatchEvent(new CustomEvent("itc-choice-change",{detail:{as:this.as,ds:this.ds,al:this.al,dl:this.dl},bubbles:!0}))}ssChange(
|
|
1646
|
+
`]}sendEvent(){this.dispatchEvent(new CustomEvent("itc-choice-change",{detail:{as:this.as,ds:this.ds,al:this.al,dl:this.dl},bubbles:!0}))}ssChange(B){this.as=parseFloat(B.detail.a),this.ds=parseFloat(B.detail.d),this.sendEvent()}llChange(B){this.al=parseFloat(B.detail.a),this.dl=parseFloat(B.detail.d),this.sendEvent()}render(){return M`
|
|
1515
1647
|
<div class="holder">
|
|
1516
1648
|
<itc-option
|
|
1517
1649
|
class="ss"
|
|
@@ -1530,7 +1662,7 @@ const xu=2;let Su=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,
|
|
|
1530
1662
|
delay="${this.dl}"
|
|
1531
1663
|
@itc-option-change=${this.llChange.bind(this)}>
|
|
1532
1664
|
</itc-option>
|
|
1533
|
-
</div>`}}customElements.define("itc-choice",
|
|
1665
|
+
</div>`}}customElements.define("itc-choice",Yh);class fh extends ia{static get properties(){return{duration:{attribute:"duration",type:Number,reflect:!0},iti:{attribute:"iti",type:Number,reflect:!0},trials:{attribute:"trials",type:Number,reflect:!0},running:{attribute:"running",type:Boolean,reflect:!0},state:{attribute:!1,type:String,reflect:!1}}}constructor(){super(),this.duration=2e3,this.iti=2e3,this.trials=5,this.running=!1,this.states=["resetted","iti","stimulus","ended"],this.state="resetted",this.range={},this.range.as={start:5,stop:20,step:5},this.range.ds={start:5,stop:20,step:5},this.range.al={start:40,stop:80,step:5},this.range.dl={start:40,stop:80,step:5},this.range.as.values=lQ(this.range.as.start,this.range.as.stop+.01,this.range.as.step),this.range.ds.values=lQ(this.range.ds.start,this.range.ds.stop+.01,this.range.ds.step),this.range.al.values=lQ(this.range.al.start,this.range.al.stop+.01,this.range.al.step),this.range.dl.values=lQ(this.range.dl.start,this.range.dl.stop+.01,this.range.dl.step),this.firstUpdate=!0,this.as=0,this.ds=0,this.al=0,this.dl=0,this.trial=0,this.baseTime=0,this.pauseTime=0,this.startTime=0,this.lastTime=0,this.runner=void 0}static get styles(){return[super.styles,g`
|
|
1534
1666
|
:host {
|
|
1535
1667
|
display: inline-block;
|
|
1536
1668
|
}
|
|
@@ -1543,35 +1675,57 @@ const xu=2;let Su=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,
|
|
|
1543
1675
|
amount-ll="${this.al}"
|
|
1544
1676
|
delay-ll="${this.dl}">
|
|
1545
1677
|
</itc-choice>
|
|
1546
|
-
</div>`}update(
|
|
1678
|
+
</div>`}update(B){super.update(B),(this.firstUpdate||B.has("running"))&&(this.running?(this.pauseTime&&(this.baseTime+=PU()-this.pauseTime,this.pauseTime=0),this.runner=function(B,Q,F){var t=new _U,U=Q;return t._restart=t.restart,t.restart=function(B,Q,F){Q=+Q,F=null==F?PU():+F,t._restart((function I(s){s+=U,t._restart(I,U+=Q,F),B(s)}),Q,F)},t.restart(B,Q,F),t}(this.run.bind(this),20)):void 0!==this.runner&&(this.runner.stop(),this.pauseTime=PU())),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=PU(),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",fh);class wh extends pa{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=Xa.k.DEFAULT,this.alignState()}alignState(){this.v=Xa.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,t;this.numeric?(B=M`<decidables-spinner class="a bottom"
|
|
1679
|
+
?disabled=${!this.interactive}
|
|
1680
|
+
step="1"
|
|
1681
|
+
.value=${this.a}
|
|
1682
|
+
@input=${this.aInput.bind(this)}
|
|
1683
|
+
>
|
|
1547
1684
|
<var class="math-var">A</var>
|
|
1548
|
-
</decidables-spinner>`,
|
|
1685
|
+
</decidables-spinner>`,Q=M`<decidables-spinner class="d bottom"
|
|
1686
|
+
?disabled=${!this.interactive}
|
|
1687
|
+
min="0"
|
|
1688
|
+
step="1"
|
|
1689
|
+
.value=${this.d}
|
|
1690
|
+
@input=${this.dInput.bind(this)}
|
|
1691
|
+
>
|
|
1549
1692
|
<var class="math-var">D</var>
|
|
1550
|
-
</decidables-spinner>`,
|
|
1693
|
+
</decidables-spinner>`,F=M`<decidables-spinner class="k bottom"
|
|
1694
|
+
?disabled=${!this.interactive}
|
|
1695
|
+
min=${Xa.k.MIN}
|
|
1696
|
+
max=${Xa.k.MAX}
|
|
1697
|
+
step=${Xa.k.STEP}
|
|
1698
|
+
.value=${this.k}
|
|
1699
|
+
@input=${this.kInput.bind(this)}
|
|
1700
|
+
>
|
|
1551
1701
|
<var class="math-var">k</var>
|
|
1552
|
-
</decidables-spinner>`,
|
|
1702
|
+
</decidables-spinner>`,t=M`<decidables-spinner class="v bottom"
|
|
1703
|
+
disabled
|
|
1704
|
+
step=".001"
|
|
1705
|
+
.value=${+this.v.toFixed(3)}
|
|
1706
|
+
>
|
|
1553
1707
|
<var class="math-var">V</var>
|
|
1554
|
-
</decidables-spinner>`):(
|
|
1708
|
+
</decidables-spinner>`):(B=M`<var class="math-var a">A</var>`,Q=M`<var class="math-var d">D</var>`,F=M`<var class="math-var k">k</var>`,t=M`<var class="math-var v">V</var>`);const U=M`
|
|
1555
1709
|
<tr>
|
|
1556
1710
|
<td rowspan="2">
|
|
1557
|
-
${
|
|
1711
|
+
${t}<span class="equals">=</span>
|
|
1558
1712
|
</td>
|
|
1559
1713
|
<td class="underline">
|
|
1560
|
-
${
|
|
1714
|
+
${B}
|
|
1561
1715
|
</td>
|
|
1562
1716
|
</tr>
|
|
1563
1717
|
<tr>
|
|
1564
1718
|
<td class="">
|
|
1565
|
-
<span class="paren tight">(</span>1<span class="plus">+</span>${
|
|
1719
|
+
<span class="paren tight">(</span>1<span class="plus">+</span>${F}${Q}<span class="paren tight">)</span>
|
|
1566
1720
|
</td>
|
|
1567
1721
|
</tr>`;return M`
|
|
1568
1722
|
<div class="holder">
|
|
1569
1723
|
<table class="equation">
|
|
1570
1724
|
<tbody>
|
|
1571
|
-
${
|
|
1725
|
+
${U}
|
|
1572
1726
|
</tbody>
|
|
1573
1727
|
</table>
|
|
1574
|
-
</div>`}}customElements.define("htd-equation-adk2v",
|
|
1728
|
+
</div>`}}customElements.define("htd-equation-adk2v",wh);class vh extends ia{static get styles(){return[super.styles,g`
|
|
1575
1729
|
:host {
|
|
1576
1730
|
---border: var(--border, 1px solid var(---color-border));
|
|
1577
1731
|
display: inline-block;
|
|
@@ -1621,5 +1775,5 @@ const xu=2;let Su=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,
|
|
|
1621
1775
|
<div class="body">
|
|
1622
1776
|
<slot>Empty!</slot>
|
|
1623
1777
|
</div>
|
|
1624
|
-
</div>`}}customElements.define("htd-example",
|
|
1778
|
+
</div>`}}customElements.define("htd-example",vh);class Jh extends vh{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=Xa.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 kh extends vh{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=Xa.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",kh);class Mh extends vh{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=Xa.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=Xa.adk2v(B.detail.as,B.detail.ds,this.k)>Xa.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",Mh),B.DiscountableControl=la,B.DiscountableElement=ia,B.DiscountableResponse=ca,B.HTDCalculation=Wa,B.HTDCurves=Ha,B.HTDEquationADK2V=wh,B.HTDExampleHuman=Jh,B.HTDExampleInteractive=kh,B.HTDExampleModel=Mh,B.HTDFit=Wh,B.HTDParameters=Hh,B.ITCChoice=Yh,B.ITCOption=Dh,B.ITCTask=fh}));
|
|
1625
1779
|
//# sourceMappingURL=discountableElements.umd.min.js.map
|