You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2 lines
157 KiB
JavaScript

(()=>{"use strict";const t=function(t,e){return t instanceof DOMPoint?DOMPoint.fromPoint(t):t instanceof DOMRect?new DOMPoint(t.x,t.y):new DOMPoint(t,e)},e=t;function n(e){const{best:n}=e;return t(n.x?.rawDistance??0,n.y?.rawDistance??0)}const a=/[|;,\s]/;function s(t,e){if(null===t)return[];const n=t.split(a);return void 0===e?n:Object.values(e).filter((t=>n.includes(t)))}function o(t,e){const n=Array.isArray(t)?t:[t];return void 0===e?n.join("|"):Object.values(e).filter((t=>n.includes(t))).join("|")}const r=function(t,e){return customElements.get(e)?Promise.reject(new Error(`Already defined <${e}>`)):(customElements.define(e,t),customElements.whenDefined(e))};var i;!function(t){t.topToTop="topToTop",t.topToBottom="topToBottom",t.rightToRight="rightToRight",t.rightToLeft="rightToLeft",t.bottomToTop="bottomToTop",t.bottomToBottom="bottomToBottom",t.leftToRight="leftToRight",t.leftToLeft="leftToLeft",t.xCenterToXCenter="xCenterToXCenter",t.yCenterToYCenter="yCenterToYCenter"}(i||(i={}));const c=[i.rightToRight,i.rightToLeft,i.leftToRight,i.leftToLeft,i.xCenterToXCenter],l=[i.topToTop,i.topToBottom,i.bottomToTop,i.bottomToBottom,i.yCenterToYCenter],u=i;var g;let h;!function(t){t.outer="outer",t.inner="inner",t.center="center",t.extend="extend"}(g||(g={})),function(t){t.inner="inner",t.center="center"}(h||(h={}));const f=g;var d;!function(t){t.disabled="disabled",t.group="group",t.unattractable="unattractable",t.unmovable="unmovable",t.attractDistance="attract-distance",t.alignTo="align-to",t.alignToParent="align-to-parent",t.crossPrevent="cross-prevent",t.offsetUnit="offset-unit"}(d||(d={}));const m=d;var b;!function(t){t.parent="parent"}(b||(b={}));const p=b;var T;!function(t){t.magnetstart="magnetstart",t.magnetmove="magnetmove",t.magnetend="magnetend",t.attract="attract",t.attracted="attracted",t.attractmove="attractmove",t.attractedmove="attractedmove",t.unattract="unattract",t.unattracted="unattracted"}(T||(T={}));const y=T;var D;!function(t){t.pixel="px",t.px="px",t.percentage="%",t["%"]="%"}(D||(D={}));const x=D,{isNaN:v}=globalThis,{abs:P}=Math,A=document.createElement("template"),M={[m.disabled]:!1,[m.group]:null,[m.attractDistance]:10,[m.unattractable]:!1,[m.unmovable]:!1,get[m.alignTo](){return[f.outer,f.center,f.extend]},get[m.alignToParent](){return[]},get[m.crossPrevent](){return[]},[m.offsetUnit]:x.pixel};A.innerHTML="\n <style>\n :host {\n position: relative;\n display: inline-block;\n }\n </style>\n <slot>\n </slot>\n";class w extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"}),this.shadowRoot.append(A.content.cloneNode(!0))}static get ALIGNMENT(){return{...u}}static get ALIGN_TO(){return{...f}}static get ALIGN_TO_PARENT(){return{...h}}static get CROSS_PREVENT(){return{...p}}static get EVENT(){return{...y}}static getAlignmentsFromAlignTo(t){const e=Array.isArray(t)?t:[t],n=[];return e.includes(f.outer)&&n.push(u.topToBottom,u.rightToLeft,u.bottomToTop,u.leftToRight),e.includes(f.inner)&&n.push(u.topToTop,u.rightToRight,u.bottomToBottom,u.leftToLeft),e.includes(f.center)&&n.push(u.xCenterToXCenter,u.yCenterToYCenter),n}static getMagnetAttractionOffset=n;get disabled(){return null!==this.traceMagnetAttributeValue(m.disabled)}set disabled(t){t?this.setAttribute(m.disabled,""):this.removeAttribute(m.disabled)}get group(){return this.traceMagnetAttributeValue(m.group)}set group(t){null===t||0===t.length?this.removeAttribute(m.group):this.setAttribute(m.group,t)}get parentMagnet(){const t=this.getAttribute(m.group);let e=this.parentElement;for(;e;){if(e instanceof w){const n=e.getAttribute(m.group);if(null===t||null===n||t===n)return e}e=e.parentElement}return null}get unattractable(){return null!==this.traceMagnetAttributeValue(m.unattractable)}set unattractable(t){t?this.setAttribute(m.unattractable,""):this.removeAttribute(m.unattractable)}get unmovable(){return null!==this.traceMagnetAttributeValue(m.unmovable)}set unmovable(t){t?this.setAttribute(m.unmovable,""):this.removeAttribute(m.unmovable)}get attractDistance(){const t=this.traceMagnetAttributeValue(m.attractDistance);return null===t?M[m.attractDistance]:Number(t)}set attractDistance(t){if(null===t)this.removeAttribute(m.attractDistance);else{if(v(t))throw new TypeError(`Invalid attraction distance: ${t}`);if(t<0)throw new RangeError(`Attraction distance should be greater than 0: ${t}`);t!==this.attractDistance&&this.setAttribute(m.attractDistance,`${t}`)}}get alignTos(){const t=this.traceMagnetAttributeValue(m.alignTo);return null===t?M[m.alignTo]:s(t,f)}set alignTos(t){this.setAttribute(m.alignTo,o(Array.isArray(t)?t:s(t,f)))}get alignToParents(){const t=this.traceMagnetAttributeValue(m.alignToParent);return null===t?M[m.alignToParent]:s(t,h)}set alignToParents(t){this.setAttribute(m.alignToParent,o(Array.isArray(t)?t:s(t,h)))}get alignments(){return w.getAlignmentsFromAlignTo(this.alignTos)}get parentAlignments(){return w.getAlignmentsFromAlignTo(this.alignToParents)}get crossPrevents(){const t=this.traceMagnetAttributeValue(m.crossPrevent);return null===t?M[m.crossPrevent]:s(t,p)}set crossPrevents(t){this.setAttribute(m.crossPrevent,o(Array.isArray(t)?t:s(t,p)))}get offsetUnit(){const t=this.traceMagnetAttributeValue(m.offsetUnit);return null===t?M[m.offsetUnit]:t}set offsetUnit(t){if(null===t)this.removeAttribute(m.offsetUnit);else{if(!Object.values(x).includes(t))throw new Error(`Invalid offset unit: ${t}`);t!==this.offsetUnit&&this.setAttribute(m.offsetUnit,t)}}traceMagnetAttributeValue(t){const e=this.getAttribute(t);if(null!==e)return e;const{parentMagnet:n}=this;return n?n.traceMagnetAttributeValue(t):null}}r(w,"magnet-pack");const C=w;function R(t,...e){if(t instanceof Window)return new DOMRect(0,0,t.innerWidth,t.innerHeight);if(t instanceof Document)return document.body.getBoundingClientRect();if(t instanceof Element)return t.getBoundingClientRect();if(E.isPack(t))return DOMRect.fromRect(t.rect);if("object"!=typeof t){const n=t,[a,s,o]=e;return new DOMRect(n,a,s,o)}const{top:n,right:a,bottom:s,left:o,x:r=o,y:i=n,width:c=a-r,height:l=s-i}=t;return new DOMRect(r,i,c,l)}function k(t){return E.isPack(t)?t.rect:t instanceof DOMRect?t:R(t)}const B=R;class J{constructor(t,e=k(t)){const n=J.isPack(t)?t.raw:t;this.raw=n,this.rect=e,Object.freeze(this)}static isPack(t){return t instanceof J}}function O(t){return J.isPack(t)?t:new J(t)}const E=J,L=function(t,e,n){switch(n){default:return 1/0;case u.topToTop:return e.top-t.top;case u.topToBottom:return e.bottom-t.top;case u.rightToRight:return e.right-t.right;case u.rightToLeft:return e.left-t.right;case u.bottomToTop:return e.top-t.bottom;case u.bottomToBottom:return e.bottom-t.bottom;case u.leftToRight:return e.right-t.left;case u.leftToLeft:return e.left-t.left;case u.xCenterToXCenter:return(e.right+e.left-(t.right+t.left))/2;case u.yCenterToYCenter:return(e.top+e.bottom-(t.top+t.bottom))/2}},j=()=>!0,F=()=>!1;function N(t,e){const n=t.right+t.left,a=e.right+e.left;return P(n-a)/2}function X(t,e){const n=t.top+t.bottom,a=e.top+e.bottom;return P(n-a)/2}const Y=function(t,e,n={}){const a=O(t),s=e.map((t=>O(t))),{attractDistance:o=M[m.attractDistance],alignTos:r=M[m.alignTo],alignments:i=C.getAlignmentsFromAlignTo(r),onJudgeDistance:c=j,onJudgeAttraction:l=j,attractionBest:g={}}=n,h={attractDistance:o,alignTos:r,alignments:i,onJudgeDistance:c};return s.reduce(((t,e)=>{const n=it.prototype.attractionTo.call(a,e,h),{best:s,results:r}=n,i=l({source:a,target:e,results:[...r],best:{x:s.x,y:s.y}});if(t.target.push(e),i){const{results:e,best:n}=t;if(e.push(...r),s.x)if(void 0===n.x||s.x.absDistance<n.x.absDistance)n.x=s.x;else if(n.x.absDistance===s.x.absDistance){const t=k(a),e=s.x.target.rect,r=n.x.target.rect,i=X(t,e),c=X(t,r);if(i<c)n.x=s.x;else if(i===c){const e=o/3;if(s.x.rawDistance>e)s.x.alignment===u.leftToLeft&&(n.x=s.x);else if(s.x.rawDistance<-e)s.x.alignment===u.rightToRight&&(n.x=s.x);else if(s.x.alignment===u.xCenterToXCenter){const e=s.x.target.rect,a=n.x.target.rect,o=e.top+e.bottom,r=a.top+a.bottom,i=t.top+t.bottom,c=P(o-i);P(r-i)<c&&(n.x=s.x)}}}if(s.y)if(void 0===n.y||s.y.absDistance<n.y.absDistance)n.y=s.y;else if(n.y.absDistance===s.y.absDistance){const t=k(a),e=s.y.target.rect,r=n.y.target.rect,i=N(t,e),c=N(t,r);if(i<c)n.y=s.y;else if(i===c){const e=o/3;if(s.y.rawDistance<-e)s.y.alignment===u.bottomToBottom&&(n.y=s.y);else if(s.y.rawDistance>e)s.y.alignment===u.topToTop&&(n.y=s.y);else if(s.y.alignment===u.yCenterToYCenter){const e=s.y.target.rect,a=n.y.target.rect,o=e.right+e.left,r=a.right+a.left,i=t.right+t.left,c=P(o-i);P(r-i)<c&&(n.y=s.y)}}}}return t}),{source:a,target:[],results:[],best:{...g}})},V=function(t,e,n={}){const a=O(t),s=O(e),{attractDistance:o=M[m.attractDistance],alignTos:r=M[m.alignTo],alignments:i=it.getAlignmentsFromAlignTo(r),onJudgeDistance:g=j}=n;return i.reduce(((t,e)=>{const n=it.prototype.distanceTo.call(a,s,e);if(g({...n},{attractDistance:o,alignTos:r})){const{results:a,best:s}=t;if(a.push(n),c.includes(e)){if(void 0===s.x||n.absDistance<s.x.absDistance)s.x=n;else if(s.x.absDistance===n.absDistance){const t=o/3;n.rawDistance>t?n.alignment===u.leftToLeft&&(s.x=n):n.rawDistance<-t?n.alignment===u.rightToRight&&(s.x=n):n.alignment===u.xCenterToXCenter&&(s.x=n)}}else if(l.includes(e))if(void 0===s.y||n.absDistance<s.y.absDistance)s.y=n;else if(s.y.absDistance===n.absDistance){const t=o/3;n.rawDistance<-t?n.alignment===u.bottomToBottom&&(s.y=n):n.rawDistance>t?n.alignment===u.topToTop&&(s.y=n):n.alignment===u.yCenterToYCenter&&(s.y=n)}}return t}),{source:a,target:s,results:[],best:{}})},I=function(t){return Boolean(t.best.x??t.best.y)},$=function(){return!0};function U(t,e,n,a){e.forEach((e=>{!function(t,e,n,a){t.addEventListener(e,n,a)}(t,e,n,a)}))}function S(t,e,n,a){e.forEach((e=>{t.removeEventListener(e,n,a)}))}function W(t,e,n){return t.dispatchEvent(new CustomEvent(e,n))}const H=function(t,n){let a=0,s=0;return t.left<n.left?a=n.left-t.left:t.right>n.right&&(a=n.right-t.right),t.top<n.top?s=n.top-t.top:t.bottom>n.bottom&&(s=n.bottom-t.bottom),e(a,s)},z=function(t,a,s={}){const o=t.raw,{ignoreEvent:r=!(o instanceof HTMLElement),alignToParents:i=M[m.alignToParent],crossPrevents:c=M[m.crossPrevent],parentPack:l,lastAttractionBest:u,onJudgeMovement:g=j}=s,h=u?.x,f=u?.y,d=it.getAlignmentsFromAlignTo(i).length>0,b=c.includes(p.parent)&&l,T=k(t),{width:D,height:x}=T,v=k(l??T),P=T,A=b?H(P,v):e(0,0),w=B(P.x+A.x,P.y+A.y,D,x),C=new E(o,w),R=g(C),J=[],O=[],L=[],N=t=>{r||O.forEach((e=>{const n=e.target,a=n.raw,s={source:C,target:n,sourceNextRect:t};W(a,y.unattracted,{bubbles:!0,cancelable:!1,composed:!0,detail:s})}))};if(!R)return h&&O.push(h),f&&O.push(f),N(w),{position:null,attractionBest:null};const X={},{unattractable:I=M[m.unattractable],attractDistance:$=M[m.attractDistance],alignTos:U=M[m.alignTo],alignments:S=it.getAlignmentsFromAlignTo(U),onJudgeDistanceInParent:z=j}=s,_=new E(o,P),G=I?F:s.onJudgeDistance??j;if(d&&l){const{best:t}=V(_,l,{attractDistance:$,alignTos:U,alignments:S,onJudgeDistance:G});X.x=t.x,X.y=t.y}const q=b?t=>z(t,{attractDistance:$,alignTos:U,parent:l,onJudgeDistance:G}):G,K=I?F:s.onJudgeAttraction??j,Q=Y(_,a,{attractDistance:$,alignTos:U,alignments:S,onJudgeDistance:q,onJudgeAttraction:K,attractionBest:X}),Z=Q.best,tt=n(Q),et=B(P.x+tt.x,P.y+tt.y,D,x),nt=b?H(et,v):e(0,0),at=B(et.x+nt.x,et.y+nt.y,D,x);if(!r){const{x:t,y:n}=Z,a=h?.target,s=f?.target,r=t?.target,i=n?.target,c=i!==s;if(r!==a)a&&O.push(h),r&&J.push(t);else if(r){const e=h?.alignment;e!==t.alignment?J.push(t):L.push(t)}if(c)s&&O.push(f),i&&J.push(n);else if(i){const t=f?.alignment;t!==n.alignment?J.push(n):L.push(n)}if(J.length>0){const t={source:C,nextRect:at,attraction:Q};if(!W(o,y.attract,{bubbles:!0,cancelable:!0,composed:!0,detail:t}))return h&&O.push(h),f&&O.push(f),{position:e(P.x+A.x,P.y+A.y),attractionBest:null}}if(O.length>0){const t={source:C,nextRect:at,attraction:Q};W(o,y.unattract,{bubbles:!0,cancelable:!1,composed:!0,detail:t})}if(L.length>0){const t={source:C,nextRect:at,attraction:Q};W(o,y.attractmove,{bubbles:!0,cancelable:!1,composed:!0,detail:t})}}var st;return st=at,r||J.forEach((t=>{const e=t.target,n=e.raw,a={source:C,target:e,sourceNextRect:st,distance:t};W(n,y.attracted,{bubbles:!0,cancelable:!1,composed:!0,detail:a})})),N(at),(t=>{r||L.forEach((e=>{const n=e.target,a=n.raw,s={source:C,target:n,sourceNextRect:t,distance:e};W(a,y.attractedmove,{bubbles:!0,cancelable:!1,composed:!0,detail:s})}))})(at),{position:e(P.x+tt.x+nt.x,P.y+tt.y+nt.y),attractionBest:Z}},_=function(e){const{clientX:n,clientY:a}=e;return t(n,a)},G=["pointerdown"],q=["pointermove"],K=["pointerup"];function Q(t){t.resetMagnetRect(),t.resetParentPack(),t.resetTargetMagnetPacks()}function Z(t,n,a){const{magnetRect:s,targetMagnetPacks:o,judgeMagnetMovement:r}=this,{position:i,attractionBest:c}=z(new E(this,B(s.x+a.x-t.x,s.y+a.y-t.y,s.width,s.height)),o,{unattractable:this.unattractable,attractDistance:this.attractDistance,alignTos:this.alignTos,alignToParents:this.alignToParents,crossPrevents:this.crossPrevents,parentPack:this.parentPack,lastAttractionBest:this.lastAttractionBest,onJudgeDistance:this.judgeMagnetDistance,onJudgeDistanceInParent:this.judgeMagnetDistanceInParent,onJudgeAttraction:this.judgeMagnetAttraction,onJudgeMovement:n=>{if(!r(n))return!1;const s={source:n,targets:o,startPoint:e(t),movePoint:e(a)};return W(this,y.magnetmove,{bubbles:!0,cancelable:!0,composed:!0,detail:s})}});return this.setMagnetOffset((i?.x??s.x)-s.x+n.x,(i?.y??s.y)-s.y+n.y),this.lastAttractionBest=c,a}function tt(t){if(this.disabled||this.unmovable)return;const n=_(t);this.isMoving=!1,Q(this);const{magnetRect:a,targetMagnetPacks:s}=this,o={source:new E(this,a),targets:s,startPoint:e(n)};if(!W(this,y.magnetstart,{bubbles:!0,cancelable:!0,composed:!0,detail:o}))return;let r=n;const i=Z.bind(this,n,this.lastOffset),c=t=>{const e=_(t);r=i(e)},l=new MutationObserver((()=>{i(r)})),u=()=>{this.isMoving=!1,this.style.removeProperty("z-index"),S(document,q,c),S(document,K,u),l.disconnect(),Q(this),W(this,y.magnetend,{bubbles:!0,cancelable:!1,composed:!0})};this.isMoving=!0,this.style.setProperty("z-index",`${Date.now()}`),t.preventDefault(),U(document,q,c),U(document,K,u),l.observe(this,{attributes:!0,attributeFilter:Object.values(m)}),i(r)}function et(t){t.disabled||t.unmovable?function(t){S(t,G,tt)}(t):function(t){U(t,G,tt)}(t)}var nt;!function(t){t.offsetX="--offset-x",t.offsetY="--offset-y"}(nt||(nt={}));const at=nt,st="magnet-block",ot=document.createElement("template");ot.innerHTML=`\n <style>\n :host {\n --x: var(${at.offsetX}, 0);\n --y: var(${at.offsetY}, 0);\n\n position: relative;\n transform: translate(var(--x), var(--y));\n touch-action: none;\n display: inline-block;\n }\n </style>\n <slot>\n </slot>\n`;class rt extends C{rectCache=null;parentPackCache=null;targetMagnetPacksCache=null;isMoving=!1;lastOffset=e(0,0);lastAttractionBest=null;constructor(){super(),this.shadowRoot.append(ot.content.cloneNode(!0)),et(this)}get disabled(){return super.disabled}set disabled(t){super.disabled=t,et(this)}get unmovable(){return super.unmovable}set unmovable(t){super.unmovable=t,et(this)}get magnetRect(){return this.rectCache||(this.rectCache=k(this)),this.rectCache}resetMagnetRect(){this.isMoving||(this.rectCache=null)}get parentPack(){const t=this.parentElement??document.body;return this.parentPackCache||(this.parentPackCache=O(t)),this.parentPackCache}resetParentPack(){this.isMoving||(this.parentPackCache=null)}get targetMagnetPacks(){return this.targetMagnetPacksCache||(this.targetMagnetPacksCache=this.getAttractableMagnets().map((t=>O(t)))),this.targetMagnetPacksCache}resetTargetMagnetPacks(){this.isMoving||(this.targetMagnetPacksCache=null)}getOtherMagnets(){return Array.from(document.querySelectorAll(st)).filter((t=>t!==this))}getAttractableMagnets(){if(this.disabled||this.unattractable)return[];const{group:t}=this,e=null!==t,n=`magnet-block:not([${m.disabled}]):not([${m.unattractable}])`;return Array.from(document.querySelectorAll(n)).filter((n=>!(n===this||this.contains(n)||e&&t!==n.group)))}judgeMagnetDistance(...[t,e={}]){const{attractDistance:n=this.attractDistance,alignTos:a=this.alignTos}=e;return function(t,e={}){const{attractDistance:n=M[m.attractDistance]}=e;if(t.absDistance>n)return!1;const{alignTos:a=M[m.alignTo]}=e;if(a.includes(f.extend))return!0;const{source:{rect:s},target:{rect:o}}=t;switch(t.alignment){default:return!1;case u.topToTop:case u.topToBottom:case u.bottomToTop:case u.bottomToBottom:case u.yCenterToYCenter:return!(s.right+n<o.left||s.left-n>o.right);case u.rightToRight:case u.rightToLeft:case u.leftToRight:case u.leftToLeft:case u.xCenterToXCenter:return!(s.top-n>o.bottom||s.bottom+n<o.top)}}(t,{attractDistance:n,alignTos:a})}judgeMagnetDistanceInParent(...[t,e={}]){const{attractDistance:n=this.attractDistance,alignTos:a=this.alignTos,onJudgeDistance:s=this.judgeMagnetDistance}=e;return function(t,e={}){const{onJudgeDistance:n=j,...a}=e;if(!n(t,a))return!1;const s=k(e.parent??document.body),{alignment:o,rawDistance:r,source:i}=t,{rect:c}=i;switch(o){default:return!0;case"topToTop":case"topToBottom":case"bottomToTop":case"bottomToBottom":case"yCenterToYCenter":return c.top+r>=s.top&&c.bottom+r<=s.bottom;case"rightToRight":case"rightToLeft":case"leftToRight":case"leftToLeft":case"xCenterToXCenter":return c.right+r<=s.right&&c.left+r>=s.left}}(t,{attractDistance:n,alignTos:a,parent:e.parent??this.parentPack,onJudgeDistance:s})}judgeMagnetAttraction=I;judgeMagnetMovement=$;rawDistanceTo(t,e){const n=k(this),a=k(t);return L(n,a,e)}distanceTo(t,e){return function(t,e,n){const a=O(t),s=O(e),o=k(t),r=k(e),i=L(o,r,n);return{source:a,target:s,alignment:n,rawDistance:i,absDistance:P(i)}}(this,t,e)}attractionTo(t,e={}){const{attractDistance:n=this.attractDistance,alignTos:a=this.alignTos,alignments:s,onJudgeDistance:o=this.judgeMagnetDistance}=e;return V(this,t,{attractDistance:n,alignTos:a,alignments:s,onJudgeDistance:o})}attractionToParent(t={}){const{attractDistance:e=this.attractDistance,alignTos:n=this.alignToParents,alignments:a,onJudgeDistance:s=this.judgeMagnetDistance}=t;return V(this,this.parentPack,{attractDistance:e,alignTos:n,alignments:a,onJudgeDistance:s})}multiAttractionsTo(t,e={}){const{attractDistance:n=this.attractDistance,alignTos:a=this.alignTos,alignToParents:s=this.alignToParents,alignments:o,onJudgeDistance:r=this.judgeMagnetDistance,attractionBest:i,onJudgeAttraction:c=this.judgeMagnetAttraction}=e,l=rt.prototype.attractionToParent.call(this,{attractDistance:n,alignTos:s,alignments:o,onJudgeDistance:r,attractionBest:i});return Y(this,t,{attractDistance:n,alignTos:a,alignments:o,onJudgeDistance:r,onJudgeAttraction:c,attractionBest:l?.best})}getMagnetAttractionResultOfPosition(t,n,a){const s=e(t,n),o=(t instanceof DOMPoint?n:a)??{},{width:r,height:i}=this.magnetRect,c=B(s.x,s.y,r,i),l=new E(this,c),{ignoreEvent:u,unattractable:g=this.unattractable,attractDistance:h=this.attractDistance,alignTos:f=this.alignTos,alignments:d,alignToParents:m=this.alignToParents,crossPrevents:b=this.crossPrevents,parentPack:p=this.parentPack,lastAttractionBest:T=this.lastAttractionBest,onJudgeDistance:y=this.judgeMagnetDistance,onJudgeDistanceInParent:D=this.judgeMagnetDistanceInParent,onJudgeAttraction:x=this.judgeMagnetAttraction,onJudgeMovement:v=this.judgeMagnetMovement}=o,P=z(l,this.targetMagnetPacks,{ignoreEvent:u,unattractable:g,attractDistance:h,alignTos:f,alignments:d,alignToParents:m,crossPrevents:b,parentPack:p,lastAttractionBest:T,onJudgeDistance:y,onJudgeDistanceInParent:D,onJudgeAttraction:x,onJudgeMovement:v});return this.resetMagnetRect(),this.resetParentPack(),this.resetTargetMagnetPacks(),P}get lastMagnetOffset(){const{offsetUnit:t,lastOffset:n}=this;switch(t){default:case x.pixel:return e(n);case x.percentage:{const{offsetParent:t}=this,a=B(t??document);return e(n.x/a.width,n.y/a.height)}}}resetMagnetOffset(){this.style.removeProperty(at.offsetX),this.style.removeProperty(at.offsetY),this.lastOffset=e(0,0)}setMagnetOffset(t=this.lastOffset,n){const a=e(t,n),{offsetUnit:s}=this;switch(s){default:case x.pixel:this.style.setProperty(at.offsetX,`${a.x}px`),this.style.setProperty(at.offsetY,`${a.y}px`);break;case x.percentage:{const t=this.offsetParent??document.body,n=globalThis.getComputedStyle(t),{boxSizing:s,width:o,height:r}=n;let i=parseFloat(o),c=parseFloat(r);if("border-box"===s){const{paddingTop:t,paddingRight:e,paddingBottom:a,paddingLeft:s,borderTopWidth:o,borderRightWidth:r,borderBottomWidth:l,borderLeftWidth:u}=n,g=parseFloat(t),h=parseFloat(e),f=parseFloat(a),d=parseFloat(s),m=parseFloat(o),b=parseFloat(r),p=parseFloat(l);i-=h+d+b+parseFloat(u),c-=g+f+m+p}const l=e(a.x/i,a.y/c);this.style.setProperty(at.offsetX,100*l.x+"%"),this.style.setProperty(at.offsetY,100*l.y+"%");break}}this.lastOffset=e(a)}setMagnetPosition(t=e(this.magnetRect),n){const a=e(t,n),{lastOffset:s,magnetRect:o}=this,r=e(o.x-s.x,o.y-s.y);this.setMagnetOffset(a.x-r.x,a.y-r.y),this.resetMagnetRect()}get bestAttraction(){const{lastAttractionBest:t}=this,e=t?.x,n=t?.y,a={};if(e){const{source:t,target:n}=e;a.x={...e,source:new E(t.raw,B(t.rect)),target:new E(n.raw,B(n.rect))}}else a.x=void 0;if(n){const{source:t,target:e}=n;a.y={...n,source:new E(t.raw,B(t.rect)),target:new E(e.raw,B(e.rect))}}else a.y=void 0;return a}}r(rt,st);const it=rt})();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LElBQUtuQixFQUFXd0MsRUFBTzdCLGFBR2pEZ0MsRUFBZXBKLE9BQUllLEVBR3JCLEdBQUlkLEVBQUcsQ0FDTCxNQUFNLE9BQUU0RSxFQUFGLE9BQVVvRSxHQUFXaEosRUFFM0JtSixFQUFlbkosRUFBSSxJQUNkQSxFQUNINEUsT0FBUSxJQUFJcUMsRUFBS3JDLEVBQU8rQyxJQUFLbkIsRUFBVzVCLEVBQU91QyxPQUMvQzZCLE9BQVEsSUFBSS9CLEVBQUsrQixFQUFPckIsSUFBS25CLEVBQVd3QyxFQUFPN0IsYUFHakRnQyxFQUFlbkosT0FBSWMsRUFHckIsT0FBT3FJLEdBSVg1QyxFQUFnQmlELEdBQVFoSSxJQUV4QixhIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvdHlwZXMvUG9pbnQudHMiLCJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvdHlwZXMvQXR0cmFjdGlvbi50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy91dGlscy9tdWx0aUF0dHJpYnV0ZVZhbHVlcy50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy91dGlscy9yZWdpc3RlckVsZW1lbnQudHMiLCJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvdmFsdWVzL2FsaWdubWVudC50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy92YWx1ZXMvYWxpZ25Uby50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy92YWx1ZXMvYXR0cmlidXRlLnRzIiwid2VicGFjazovL0BsZjJjb20vbWFnbmV0LmpzLy4vc3JjL3ZhbHVlcy9jcm9zc1ByZXZlbnQudHMiLCJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvdmFsdWVzL2V2ZW50LnRzIiwid2VicGFjazovL0BsZjJjb20vbWFnbmV0LmpzLy4vc3JjL3ZhbHVlcy9vZmZzZXRVbml0LnRzIiwid2VicGFjazovL0BsZjJjb20vbWFnbmV0LmpzLy4vc3JjL3V0aWxzL251bWVyaWMudHMiLCJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvY29yZS50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy90eXBlcy9SZWN0LnRzIiwid2VicGFjazovL0BsZjJjb20vbWFnbmV0LmpzLy4vc3JjL3R5cGVzL1BhY2sudHMiLCJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvbWV0aG9kcy9yYXdEaXN0YW5jZVRvLnRzIiwid2VicGFjazovL0BsZjJjb20vbWFnbmV0LmpzLy4vc3JjL3V0aWxzL3JldHVyblRydWVGYWxzZS50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy91dGlscy9kaXN0YW5jZUJldHdlZW5SZWN0cy50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy9tZXRob2RzL211bHRpQXR0cmFjdGlvbnNUby50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy9tZXRob2RzL3NpbmdsZUF0dHJhY3Rpb25Uby50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy9tZXRob2RzL2p1ZGdlQXR0cmFjdGlvbi50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy9tZXRob2RzL2p1ZGdlTW92ZW1lbnQudHMiLCJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvdXRpbHMvZXZlbnRIYW5kbGVyLnRzIiwid2VicGFjazovL0BsZjJjb20vbWFnbmV0LmpzLy4vc3JjL3V0aWxzL2dldE9mZnNldFRvQmVJblJlY3QudHMiLCJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvbWV0aG9kcy9hdHRyYWN0aW9uUmVzdWx0T2ZQb3NpdGlvbi50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy91dGlscy9nZXRFdmVudFhZLnRzIiwid2VicGFjazovL0BsZjJjb20vbWFnbmV0LmpzLy4vc3JjL3V0aWxzL2RyYWdMaXN0ZW5lci50cyIsIndlYnBhY2s6Ly9AbGYyY29tL21hZ25ldC5qcy8uL3NyYy92YWx1ZXMvc3R5bGUudHMiLCJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvYmxvY2sudHMiLCJ3ZWJwYWNrOi8vQGxmMmNvbS9tYWduZXQuanMvLi9zcmMvbWV0aG9kcy9qdWRnZURpc3RhbmNlLnRzIiwid2VicGFjazovL0BsZjJjb20vbWFnbmV0LmpzLy4vc3JjL21ldGhvZHMvanVkZ2VEaXN0YW5jZUluUGFyZW50LnRzIiwid2VicGFjazovL0BsZjJjb20vbWFnbmV0LmpzLy4vc3JjL21ldGhvZHMvZGlzdGFuY2VUby50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUGFjaywgeyBSZWN0YWJsZSB9IGZyb20gJy4vUGFjayc7XG5pbXBvcnQgeyBnZXRSZWN0IH0gZnJvbSAnLi9SZWN0JztcblxuaW50ZXJmYWNlIENyZWF0ZVBvaW50IHtcbiAgKHg6IG51bWJlciwgeTogbnVtYmVyKTogRE9NUG9pbnQ7XG4gIChwb2ludDogRE9NUG9pbnQpOiBET01Qb2ludDtcbiAgKHJlY3Q6IERPTVJlY3QpOiBET01Qb2ludDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHBvaW50IG9iamVjdCBmcm9tIGEgcG9pbnQgb3IgKHgsIHkpLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlUG9pbnQ6IENyZWF0ZVBvaW50ID0gZnVuY3Rpb24gY3JlYXRlUG9pbnQoXG4gIHg6IG51bWJlciB8IERPTVBvaW50IHwgRE9NUmVjdCxcbiAgeT86IG51bWJlcixcbikge1xuICBpZiAoeCBpbnN0YW5jZW9mIERPTVBvaW50KSB7XG4gICAgcmV0dXJuIERPTVBvaW50LmZyb21Qb2ludCh4KTtcbiAgfVxuICBpZiAoeCBpbnN0YW5jZW9mIERPTVJlY3QpIHtcbiAgICByZXR1cm4gbmV3IERPTVBvaW50KHgueCwgeC55KTtcbiAgfVxuXG4gIHJldHVybiBuZXcgRE9NUG9pbnQoeCwgeSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgcG9pbnQgb2JqZWN0IGZyb20gc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UG9pbnQoc291cmNlOiBSZWN0YWJsZSB8IFBhY2sgfCBET01Qb2ludCk6IERPTVBvaW50IHtcbiAgcmV0dXJuIChzb3VyY2UgaW5zdGFuY2VvZiBET01Qb2ludFxuICAgID8gc291cmNlXG4gICAgOiBET01Qb2ludC5mcm9tUG9pbnQoZ2V0UmVjdChzb3VyY2UpKVxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVQb2ludDtcbiIsImltcG9ydCBEaXN0YW5jZSBmcm9tICcuL0Rpc3RhbmNlJztcbmltcG9ydCBQYWNrIGZyb20gJy4vUGFjayc7XG5pbXBvcnQgeyBjcmVhdGVQb2ludCB9IGZyb20gJy4vUG9pbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF0dHJhY3Rpb25CZXN0IHtcbiAgeD86IERpc3RhbmNlO1xuICB5PzogRGlzdGFuY2U7XG59XG5cbmludGVyZmFjZSBBdHRyYWN0aW9uPFQ+IHtcbiAgc291cmNlOiBQYWNrO1xuICB0YXJnZXQ6IFQ7XG4gIHJlc3VsdHM6IERpc3RhbmNlW107XG4gIGJlc3Q6IEF0dHJhY3Rpb25CZXN0O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIG9mZnNldCBvZiBhdHRyYWN0aW9uIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEF0dHJhY3Rpb25PZmZzZXQoYXR0cmFjdGlvbjogQXR0cmFjdGlvbjx1bmtub3duPik6IERPTVBvaW50IHtcbiAgY29uc3QgeyBiZXN0IH0gPSBhdHRyYWN0aW9uO1xuXG4gIHJldHVybiBjcmVhdGVQb2ludChcbiAgICBiZXN0Lng/LnJhd0Rpc3RhbmNlID8/IDAsXG4gICAgYmVzdC55Py5yYXdEaXN0YW5jZSA/PyAwLFxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBBdHRyYWN0aW9uO1xuIiwiY29uc3QgU1BMSVRURVIgPSAvW3w7LFxcc10vO1xuXG4vKipcbiAqIFJldHVybnMgc3BsaXR0ZWQgdmFsdWVzIGZyb20gYXR0cmlidXRlIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXJyYXlGcm9tQXR0cmlidXRlVmFsdWU8ViBleHRlbmRzIHN0cmluZz4oXG4gIHZhbHVlOiBzdHJpbmcgfCBudWxsLFxuICBpbmRleE9iamVjdD86IFJlY29yZDxzdHJpbmcsIFY+LFxuKTogVltdIHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgdmFsdWVzID0gdmFsdWUuc3BsaXQoU1BMSVRURVIpO1xuXG4gIGlmIChpbmRleE9iamVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHZhbHVlcyBhcyBWW107XG4gIH1cblxuICBjb25zdCBpbmRleHMgPSBPYmplY3QudmFsdWVzKGluZGV4T2JqZWN0KTtcblxuICByZXR1cm4gaW5kZXhzXG4gICAgLmZpbHRlcigoaW5kZXgpID0+IHZhbHVlcy5pbmNsdWRlcyhpbmRleCkpO1xufVxuXG4vKipcbiAqIFJldHVybnMgY29tYmluZWQgdmFsdWUgZnJvbSBhcnJheSBvZiB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZUZyb21BcnJheTxUPihcbiAgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLFxuICBpbmRleE9iamVjdD86IFQsXG4pOiBzdHJpbmcge1xuICBjb25zdCB2YWx1ZXMgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcblxuICBpZiAoaW5kZXhPYmplY3QgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB2YWx1ZXMuam9pbignfCcpO1xuICB9XG5cbiAgY29uc3QgaW5kZXhzID0gT2JqZWN0LnZhbHVlcyhpbmRleE9iamVjdCk7XG5cbiAgcmV0dXJuIGluZGV4c1xuICAgIC5maWx0ZXIoKGluZGV4KSA9PiB2YWx1ZXMuaW5jbHVkZXMoaW5kZXgpKVxuICAgIC5qb2luKCd8Jyk7XG59XG4iLCIvKipcbiAqIFJlZ2lzdGVycyBLbm9iIGVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyRWxlbWVudChcbiAgTm9kZTogdHlwZW9mIEhUTUxFbGVtZW50LFxuICBub2RlTmFtZTogc3RyaW5nLFxuKTogUmV0dXJuVHlwZTx0eXBlb2YgY3VzdG9tRWxlbWVudHMud2hlbkRlZmluZWQ+IHtcbiAgaWYgKGN1c3RvbUVsZW1lbnRzLmdldChub2RlTmFtZSkpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICBuZXcgRXJyb3IoYEFscmVhZHkgZGVmaW5lZCA8JHtub2RlTmFtZX0+YCksXG4gICAgKTtcbiAgfVxuXG4gIGN1c3RvbUVsZW1lbnRzLmRlZmluZShub2RlTmFtZSwgTm9kZSk7XG5cbiAgcmV0dXJuIGN1c3RvbUVsZW1lbnRzLndoZW5EZWZpbmVkKG5vZGVOYW1lKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgcmVnaXN0ZXJFbGVtZW50O1xuIiwiZW51bSBBbGlnbm1lbnQge1xuICB0b3BUb1RvcCA9ICd0b3BUb1RvcCcsXG4gIHRvcFRvQm90dG9tID0gJ3RvcFRvQm90dG9tJyxcbiAgcmlnaHRUb1JpZ2h0ID0gJ3JpZ2h0VG9SaWdodCcsXG4gIHJpZ2h0VG9MZWZ0ID0gJ3JpZ2h0VG9MZWZ0JyxcbiAgYm90dG9tVG9Ub3AgPSAnYm90dG9tVG9Ub3AnLFxuICBib3R0b21Ub0JvdHRvbSA9ICdib3R0b21Ub0JvdHRvbScsXG4gIGxlZnRUb1JpZ2h0ID0gJ2xlZnRUb1JpZ2h0JyxcbiAgbGVmdFRvTGVmdCA9ICdsZWZ0VG9MZWZ0JyxcbiAgeENlbnRlclRvWENlbnRlciA9ICd4Q2VudGVyVG9YQ2VudGVyJyxcbiAgeUNlbnRlclRvWUNlbnRlciA9ICd5Q2VudGVyVG9ZQ2VudGVyJyxcbn1cblxuZXhwb3J0IGNvbnN0IEFsaWdubWVudFhzOiBBbGlnbm1lbnRbXSA9IFtcbiAgQWxpZ25tZW50LnJpZ2h0VG9SaWdodCxcbiAgQWxpZ25tZW50LnJpZ2h0VG9MZWZ0LFxuICBBbGlnbm1lbnQubGVmdFRvUmlnaHQsXG4gIEFsaWdubWVudC5sZWZ0VG9MZWZ0LFxuICBBbGlnbm1lbnQueENlbnRlclRvWENlbnRlcixcbl07XG5cbmV4cG9ydCBjb25zdCBBbGlnbm1lbnRZczogQWxpZ25tZW50W10gPSBbXG4gIEFsaWdubWVudC50b3BUb1RvcCxcbiAgQWxpZ25tZW50LnRvcFRvQm90dG9tLFxuICBBbGlnbm1lbnQuYm90dG9tVG9Ub3AsXG4gIEFsaWdubWVudC5ib3R0b21Ub0JvdHRvbSxcbiAgQWxpZ25tZW50LnlDZW50ZXJUb1lDZW50ZXIsXG5dO1xuXG5leHBvcnQgZGVmYXVsdCBBbGlnbm1lbnQ7XG4iLCJlbnVtIEFsaWduVG8ge1xuICBvdXRlciA9ICdvdXRlcicsXG4gIGlubmVyID0gJ2lubmVyJyxcbiAgY2VudGVyID0gJ2NlbnRlcicsXG4gIGV4dGVuZCA9ICdleHRlbmQnLFxufVxuXG5leHBvcnQgZW51bSBBbGlnblRvUGFyZW50IHtcbiAgaW5uZXIgPSAnaW5uZXInLFxuICBjZW50ZXIgPSAnY2VudGVyJyxcbn1cblxuZXhwb3J0IGRlZmF1bHQgQWxpZ25UbztcbiIsImVudW0gQXR0cmlidXRlIHtcbiAgZGlzYWJsZWQgPSAnZGlzYWJsZWQnLFxuICBncm91cCA9ICdncm91cCcsXG4gIHVuYXR0cmFjdGFibGUgPSAndW5hdHRyYWN0YWJsZScsXG4gIHVubW92YWJsZSA9ICd1bm1vdmFibGUnLFxuICBhdHRyYWN0RGlzdGFuY2UgPSAnYXR0cmFjdC1kaXN0YW5jZScsXG4gIGFsaWduVG8gPSAnYWxpZ24tdG8nLFxuICBhbGlnblRvUGFyZW50ID0gJ2FsaWduLXRvLXBhcmVudCcsXG4gIGNyb3NzUHJldmVudCA9ICdjcm9zcy1wcmV2ZW50JyxcbiAgb2Zmc2V0VW5pdCA9ICdvZmZzZXQtdW5pdCcsXG59XG5cbmV4cG9ydCBkZWZhdWx0IEF0dHJpYnV0ZTtcbiIsImVudW0gQ3Jvc3NQcmV2ZW50IHtcbiAgcGFyZW50ID0gJ3BhcmVudCcsXG59XG5cbmV4cG9ydCBkZWZhdWx0IENyb3NzUHJldmVudDtcbiIsImVudW0gRXZlbnQge1xuICBtYWduZXRzdGFydCA9ICdtYWduZXRzdGFydCcsXG4gIG1hZ25ldG1vdmUgPSAnbWFnbmV0bW92ZScsXG4gIG1hZ25ldGVuZCA9ICdtYWduZXRlbmQnLFxuICBhdHRyYWN0ID0gJ2F0dHJhY3QnLFxuICBhdHRyYWN0ZWQgPSAnYXR0cmFjdGVkJyxcbiAgYXR0cmFjdG1vdmUgPSAnYXR0cmFjdG1vdmUnLFxuICBhdHRyYWN0ZWRtb3ZlID0gJ2F0dHJhY3RlZG1vdmUnLFxuICB1bmF0dHJhY3QgPSAndW5hdHRyYWN0JyxcbiAgdW5hdHRyYWN0ZWQgPSAndW5hdHRyYWN0ZWQnLFxufVxuXG5leHBvcnQgZGVmYXVsdCBFdmVudDtcbiIsImVudW0gT2Zmc2V0VW5pdCB7XG4gIHBpeGVsID0gJ3B4JyxcbiAgcHggPSAncHgnLFxuICBwZXJjZW50YWdlID0gJyUnLFxuICAnJScgPSAnJScsXG59XG5cbmV4cG9ydCBkZWZhdWx0IE9mZnNldFVuaXQ7XG4iLCJjb25zdCB7IGlzTmFOIH0gPSBnbG9iYWxUaGlzO1xuY29uc3QgeyBhYnMgfSA9IE1hdGg7XG5cbmV4cG9ydCB7IGlzTmFOLCBhYnMgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgc291cmNlIGlzIGEgbnVtYmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNudW0objogdW5rbm93bik6IG4gaXMgbnVtYmVyIHtcbiAgcmV0dXJuIHR5cGVvZiBuID09PSAnbnVtYmVyJztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG51bWJlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0ZE51bShuOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoaXNOYU4obikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIG51bWJlcjogJHtufWApO1xuICB9XG5cbiAgcmV0dXJuIChpc251bShuKSA/IG4gOiBOdW1iZXIobikpO1xufVxuIiwiaW1wb3J0IHsgZ2V0QXR0cmFjdGlvbk9mZnNldCB9IGZyb20gJy4vdHlwZXMvQXR0cmFjdGlvbic7XG5pbXBvcnQgeyBnZXRBcnJheUZyb21BdHRyaWJ1dGVWYWx1ZSwgZ2V0QXR0cmlidXRlVmFsdWVGcm9tQXJyYXkgfSBmcm9tICcuL3V0aWxzL211bHRpQXR0cmlidXRlVmFsdWVzJztcbmltcG9ydCByZWdpc3RlckVsZW1lbnQgZnJvbSAnLi91dGlscy9yZWdpc3RlckVsZW1lbnQnO1xuaW1wb3J0IEFsaWdubWVudCBmcm9tICcuL3ZhbHVlcy9hbGlnbm1lbnQnO1xuaW1wb3J0IEFsaWduVG8sIHsgQWxpZ25Ub1BhcmVudCB9IGZyb20gJy4vdmFsdWVzL2FsaWduVG8nO1xuaW1wb3J0IEF0dHJpYnV0ZSBmcm9tICcuL3ZhbHVlcy9hdHRyaWJ1dGUnO1xuaW1wb3J0IENyb3NzUHJldmVudCBmcm9tICcuL3ZhbHVlcy9jcm9zc1ByZXZlbnQnO1xuaW1wb3J0IEV2ZW50IGZyb20gJy4vdmFsdWVzL2V2ZW50JztcbmltcG9ydCBPZmZzZXRVbml0IGZyb20gJy4vdmFsdWVzL29mZnNldFVuaXQnO1xuaW1wb3J0IHsgaXNOYU4gfSBmcm9tICcuL3V0aWxzL251bWVyaWMnO1xuXG5jb25zdCBub2RlTmFtZSA9ICdtYWduZXQtcGFjayc7XG5jb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0QXR0cmlidXRlVmFsdWVzID0ge1xuICBbQXR0cmlidXRlLmRpc2FibGVkXTogZmFsc2UsXG4gIFtBdHRyaWJ1dGUuZ3JvdXBdOiBudWxsLFxuICBbQXR0cmlidXRlLmF0dHJhY3REaXN0YW5jZV06IDEwLFxuICBbQXR0cmlidXRlLnVuYXR0cmFjdGFibGVdOiBmYWxzZSxcbiAgW0F0dHJpYnV0ZS51bm1vdmFibGVdOiBmYWxzZSxcbiAgZ2V0IFtBdHRyaWJ1dGUuYWxpZ25Ub10oKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFsaWduVG8ub3V0ZXIsXG4gICAgICBBbGlnblRvLmNlbnRlcixcbiAgICAgIEFsaWduVG8uZXh0ZW5kLFxuICAgIF07XG4gIH0sXG4gIGdldCBbQXR0cmlidXRlLmFsaWduVG9QYXJlbnRdKCkge1xuICAgIHJldHVybiBbXTtcbiAgfSxcbiAgZ2V0IFtBdHRyaWJ1dGUuY3Jvc3NQcmV2ZW50XSgpIHtcbiAgICByZXR1cm4gW1xuICAgICAgLy8gQ3Jvc3NQcmV2ZW50cy5wYXJlbnQsXG4gICAgXTtcbiAgfSxcbiAgW0F0dHJpYnV0ZS5vZmZzZXRVbml0XTogT2Zmc2V0VW5pdC5waXhlbCxcbn07XG5cbnRlbXBsYXRlLmlubmVySFRNTCA9IGBcbiAgPHN0eWxlPlxuICAgIDpob3N0IHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB9XG4gIDwvc3R5bGU+XG4gIDxzbG90PlxuICA8L3Nsb3Q+XG5gO1xuXG5jbGFzcyBNYWduZXRQYWNrIGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlOiAnb3BlbicgfSk7XG4gICAgKHRoaXMuc2hhZG93Um9vdCBhcyBTaGFkb3dSb290KS5hcHBlbmQodGVtcGxhdGUuY29udGVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuICB9XG5cbiAgc3RhdGljIGdldCBBTElHTk1FTlQoKSB7XG4gICAgcmV0dXJuIHsgLi4uQWxpZ25tZW50IH07XG4gIH1cblxuICBzdGF0aWMgZ2V0IEFMSUdOX1RPKCkge1xuICAgIHJldHVybiB7IC4uLkFsaWduVG8gfTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgQUxJR05fVE9fUEFSRU5UKCkge1xuICAgIHJldHVybiB7IC4uLkFsaWduVG9QYXJlbnQgfTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgQ1JPU1NfUFJFVkVOVCgpIHtcbiAgICByZXR1cm4geyAuLi5Dcm9zc1ByZXZlbnQgfTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRVZFTlQoKSB7XG4gICAgcmV0dXJuIHsgLi4uRXZlbnQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsaWdubWVudCB2YWx1ZXMgY29udmVydGVkIGZyb20gc2lkZXMgb2YgYWxpZ25pbmcuXG4gICAqL1xuICBzdGF0aWMgZ2V0QWxpZ25tZW50c0Zyb21BbGlnblRvKHNvdXJjZTogc3RyaW5nW10pOiBBbGlnbm1lbnRbXSB7XG4gICAgY29uc3QgYWxpZ25Ub3MgPSBBcnJheS5pc0FycmF5KHNvdXJjZSkgPyBzb3VyY2UgOiBbc291cmNlXTtcbiAgICBjb25zdCBhbGlnbm1lbnRzOiBBbGlnbm1lbnRbXSA9IFtdO1xuXG4gICAgaWYgKGFsaWduVG9zLmluY2x1ZGVzKEFsaWduVG8ub3V0ZXIpKSB7XG4gICAgICBhbGlnbm1lbnRzLnB1c2goXG4gICAgICAgIEFsaWdubWVudC50b3BUb0JvdHRvbSxcbiAgICAgICAgQWxpZ25tZW50LnJpZ2h0VG9MZWZ0LFxuICAgICAgICBBbGlnbm1lbnQuYm90dG9tVG9Ub3AsXG4gICAgICAgIEFsaWdubWVudC5sZWZ0VG9SaWdodCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChhbGlnblRvcy5pbmNsdWRlcyhBbGlnblRvLmlubmVyKSkge1xuICAgICAgYWxpZ25tZW50cy5wdXNoKFxuICAgICAgICBBbGlnbm1lbnQudG9wVG9Ub3AsXG4gICAgICAgIEFsaWdubWVudC5yaWdodFRvUmlnaHQsXG4gICAgICAgIEFsaWdubWVudC5ib3R0b21Ub0JvdHRvbSxcbiAgICAgICAgQWxpZ25tZW50LmxlZnRUb0xlZnQsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoYWxpZ25Ub3MuaW5jbHVkZXMoQWxpZ25Uby5jZW50ZXIpKSB7XG4gICAgICBhbGlnbm1lbnRzLnB1c2goXG4gICAgICAgIEFsaWdubWVudC54Q2VudGVyVG9YQ2VudGVyLFxuICAgICAgICBBbGlnbm1lbnQueUNlbnRlclRvWUNlbnRlcixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFsaWdubWVudHM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgb2Zmc2V0IG9mIGF0dHJhY3Rpb24gcmVzdWx0LlxuICAgKi9cbiAgc3RhdGljIGdldE1hZ25ldEF0dHJhY3Rpb25PZmZzZXQgPSBnZXRBdHRyYWN0aW9uT2Zmc2V0XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBtYWduZXQgaXMgZGlzYWJsZWQuXG4gICAqL1xuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2VNYWduZXRBdHRyaWJ1dGVWYWx1ZShBdHRyaWJ1dGUuZGlzYWJsZWQpICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgZGlzYWJsZWQgb2YgbWFnbmV0LlxuICAgKi9cbiAgc2V0IGRpc2FibGVkKGRpc2FibGVkOiBib29sZWFuKSB7XG4gICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZShBdHRyaWJ1dGUuZGlzYWJsZWQsICcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoQXR0cmlidXRlLmRpc2FibGVkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBtYWduZXQgZ3JvdXAuXG4gICAqL1xuICBnZXQgZ3JvdXAoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2VNYWduZXRBdHRyaWJ1dGVWYWx1ZShBdHRyaWJ1dGUuZ3JvdXApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgbWFnbmV0IGdyb3VwLlxuICAgKi9cbiAgc2V0IGdyb3VwKGdyb3VwOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgaWYgKGdyb3VwID09PSBudWxsIHx8IGdyb3VwLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoQXR0cmlidXRlLmdyb3VwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoQXR0cmlidXRlLmdyb3VwLCBncm91cCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG5lYXJlc3QgcGFyZW50IG1hZ25ldCBlbGVtZW50LlxuICAgKi9cbiAgZ2V0IHBhcmVudE1hZ25ldCgpOiBNYWduZXRQYWNrIHwgbnVsbCB7XG4gICAgY29uc3QgZ3JvdXAgPSB0aGlzLmdldEF0dHJpYnV0ZShBdHRyaWJ1dGUuZ3JvdXApO1xuXG4gICAgbGV0IHBhcmVudCA9IHRoaXMucGFyZW50RWxlbWVudDtcblxuICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBNYWduZXRQYWNrKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudEdyb3VwID0gcGFyZW50LmdldEF0dHJpYnV0ZShBdHRyaWJ1dGUuZ3JvdXApO1xuXG4gICAgICAgIGlmIChncm91cCA9PT0gbnVsbFxuICAgICAgICAgIHx8IHBhcmVudEdyb3VwID09PSBudWxsXG4gICAgICAgICAgfHwgZ3JvdXAgPT09IHBhcmVudEdyb3VwXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBtYWduZXQgaGFzIG5vIGF0dHJhY3Rpb24uXG4gICAqL1xuICBnZXQgdW5hdHRyYWN0YWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50cmFjZU1hZ25ldEF0dHJpYnV0ZVZhbHVlKEF0dHJpYnV0ZS51bmF0dHJhY3RhYmxlKSAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVuYXR0cmFjdGFibGUgb2YgbWFnbmV0LlxuICAgKi9cbiAgc2V0IHVuYXR0cmFjdGFibGUodW5hdHRyYWN0YWJsZTogYm9vbGVhbikge1xuICAgIGlmICh1bmF0dHJhY3RhYmxlKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZShBdHRyaWJ1dGUudW5hdHRyYWN0YWJsZSwgJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShBdHRyaWJ1dGUudW5hdHRyYWN0YWJsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWFnbmV0IGlzIHVuYWJsZSB0byBiZSBkcmFnZ2VkLlxuICAgKi9cbiAgZ2V0IHVubW92YWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50cmFjZU1hZ25ldEF0dHJpYnV0ZVZhbHVlKEF0dHJpYnV0ZS51bm1vdmFibGUpICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdW5tb3ZhYmxlIG9mIG1hZ25ldC5cbiAgICovXG4gIHNldCB1bm1vdmFibGUodW5tb3ZhYmxlOiBib29sZWFuKSB7XG4gICAgaWYgKHVubW92YWJsZSkge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoQXR0cmlidXRlLnVubW92YWJsZSwgJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShBdHRyaWJ1dGUudW5tb3ZhYmxlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZGlzdGFuY2Ugb2YgYXR0cmFjdGlvbi5cbiAgICovXG4gIGdldCBhdHRyYWN0RGlzdGFuY2UoKTogbnVtYmVyIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMudHJhY2VNYWduZXRBdHRyaWJ1dGVWYWx1ZShBdHRyaWJ1dGUuYXR0cmFjdERpc3RhbmNlKTtcblxuICAgIHJldHVybiAodmFsdWUgPT09IG51bGxcbiAgICAgID8gZGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1tBdHRyaWJ1dGUuYXR0cmFjdERpc3RhbmNlXVxuICAgICAgOiBOdW1iZXIodmFsdWUpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBkaXN0YW5jZSBvZiBhdHRyYWN0aW9uLlxuICAgKi9cbiAgc2V0IGF0dHJhY3REaXN0YW5jZShhdHRyYWN0RGlzdGFuY2U6IG51bWJlciB8IG51bGwpIHtcbiAgICBpZiAoYXR0cmFjdERpc3RhbmNlID09PSBudWxsKSB7XG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShBdHRyaWJ1dGUuYXR0cmFjdERpc3RhbmNlKTtcbiAgICB9IGVsc2UgaWYgKGlzTmFOKGF0dHJhY3REaXN0YW5jZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgYXR0cmFjdGlvbiBkaXN0YW5jZTogJHthdHRyYWN0RGlzdGFuY2V9YCk7XG4gICAgfSBlbHNlIGlmIChhdHRyYWN0RGlzdGFuY2UgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgQXR0cmFjdGlvbiBkaXN0YW5jZSBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIDA6ICR7YXR0cmFjdERpc3RhbmNlfWApO1xuICAgIH0gZWxzZSBpZiAoYXR0cmFjdERpc3RhbmNlICE9PSB0aGlzLmF0dHJhY3REaXN0YW5jZSkge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoQXR0cmlidXRlLmF0dHJhY3REaXN0YW5jZSwgYCR7YXR0cmFjdERpc3RhbmNlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIG1hZ25ldCBhdHRyYWN0aW9uIHNpZGVzLlxuICAgKi9cbiAgZ2V0IGFsaWduVG9zKCk6IEFsaWduVG9bXSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnRyYWNlTWFnbmV0QXR0cmlidXRlVmFsdWUoQXR0cmlidXRlLmFsaWduVG8pO1xuXG4gICAgcmV0dXJuICh2YWx1ZSA9PT0gbnVsbFxuICAgICAgPyBkZWZhdWx0QXR0cmlidXRlVmFsdWVzW0F0dHJpYnV0ZS5hbGlnblRvXVxuICAgICAgOiBnZXRBcnJheUZyb21BdHRyaWJ1dGVWYWx1ZSh2YWx1ZSwgQWxpZ25UbylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgbWFnbmV0IGF0dHJhY3Rpb24gc2lkZXMuXG4gICAqL1xuICBzZXQgYWxpZ25Ub3MoYWxpZ25Ub3M6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoXG4gICAgICBBdHRyaWJ1dGUuYWxpZ25UbyxcbiAgICAgIGdldEF0dHJpYnV0ZVZhbHVlRnJvbUFycmF5KChBcnJheS5pc0FycmF5KGFsaWduVG9zKVxuICAgICAgICA/IGFsaWduVG9zXG4gICAgICAgIDogZ2V0QXJyYXlGcm9tQXR0cmlidXRlVmFsdWUoYWxpZ25Ub3MsIEFsaWduVG8pXG4gICAgICApKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGF0dHJhY3Rpb24gc2lkZXMgZm9yIGl0cyBwYXJlbnQgZWxlbWVudC5cbiAgICovXG4gIGdldCBhbGlnblRvUGFyZW50cygpOiBBbGlnblRvUGFyZW50W10ge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy50cmFjZU1hZ25ldEF0dHJpYnV0ZVZhbHVlKEF0dHJpYnV0ZS5hbGlnblRvUGFyZW50KTtcblxuICAgIHJldHVybiAodmFsdWUgPT09IG51bGxcbiAgICAgID8gZGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1tBdHRyaWJ1dGUuYWxpZ25Ub1BhcmVudF1cbiAgICAgIDogZ2V0QXJyYXlGcm9tQXR0cmlidXRlVmFsdWUodmFsdWUsIEFsaWduVG9QYXJlbnQpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBhdHRyYWN0aW9uIHNpZGVzIGZvciBpdHMgcGFyZW50IGVsZW1lbnQuXG4gICAqL1xuICBzZXQgYWxpZ25Ub1BhcmVudHMoYWxpZ25Ub1BhcmVudHM6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoXG4gICAgICBBdHRyaWJ1dGUuYWxpZ25Ub1BhcmVudCxcbiAgICAgIGdldEF0dHJpYnV0ZVZhbHVlRnJvbUFycmF5KChBcnJheS5pc0FycmF5KGFsaWduVG9QYXJlbnRzKVxuICAgICAgICA/IGFsaWduVG9QYXJlbnRzXG4gICAgICAgIDogZ2V0QXJyYXlGcm9tQXR0cmlidXRlVmFsdWUoYWxpZ25Ub1BhcmVudHMsIEFsaWduVG9QYXJlbnQpXG4gICAgICApKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgbWFnbmV0IGFsaWdubWVudHMgZm9yIGF0dHJhY3Rpb24uXG4gICAqL1xuICBnZXQgYWxpZ25tZW50cygpOiBBbGlnbm1lbnRbXSB7XG4gICAgcmV0dXJuIE1hZ25ldFBhY2suZ2V0QWxpZ25tZW50c0Zyb21BbGlnblRvKHRoaXMuYWxpZ25Ub3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgbWFnbmV0IGFsaWdubWVudHMgZm9yIHBhcmVudCBhdHRyYWN0aW9uLlxuICAgKi9cbiAgZ2V0IHBhcmVudEFsaWdubWVudHMoKTogQWxpZ25tZW50W10ge1xuICAgIHJldHVybiBNYWduZXRQYWNrLmdldEFsaWdubWVudHNGcm9tQWxpZ25Ubyh0aGlzLmFsaWduVG9QYXJlbnRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRhcmdldHMgdGhhdCB0aGUgbWFnbmV0IHdvdWxkIHByZXZlbnQgZnJvbSBjcm9zc2luZy5cbiAgICovXG4gIGdldCBjcm9zc1ByZXZlbnRzKCk6IENyb3NzUHJldmVudFtdIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMudHJhY2VNYWduZXRBdHRyaWJ1dGVWYWx1ZShBdHRyaWJ1dGUuY3Jvc3NQcmV2ZW50KTtcblxuICAgIHJldHVybiAodmFsdWUgPT09IG51bGxcbiAgICAgID8gZGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1tBdHRyaWJ1dGUuY3Jvc3NQcmV2ZW50XVxuICAgICAgOiBnZXRBcnJheUZyb21BdHRyaWJ1dGVWYWx1ZSh2YWx1ZSwgQ3Jvc3NQcmV2ZW50KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0YXJnZXRzIHRoYXQgdGhlIG1hZ25ldCB3b3VsZCBwcmV2ZW50IGZyb20gY3Jvc3NpbmcuXG4gICAqL1xuICBzZXQgY3Jvc3NQcmV2ZW50cyhjcm9zc1ByZXZlbnRzOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKFxuICAgICAgQXR0cmlidXRlLmNyb3NzUHJldmVudCxcbiAgICAgIGdldEF0dHJpYnV0ZVZhbHVlRnJvbUFycmF5KChBcnJheS5pc0FycmF5KGNyb3NzUHJldmVudHMpXG4gICAgICAgID8gY3Jvc3NQcmV2ZW50c1xuICAgICAgICA6IGdldEFycmF5RnJvbUF0dHJpYnV0ZVZhbHVlKGNyb3NzUHJldmVudHMsIENyb3NzUHJldmVudClcbiAgICAgICkpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB1bml0IG9mIG9mZnNldC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgb2Zmc2V0VW5pdCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy50cmFjZU1hZ25ldEF0dHJpYnV0ZVZhbHVlKEF0dHJpYnV0ZS5vZmZzZXRVbml0KTtcblxuICAgIHJldHVybiAodmFsdWUgPT09IG51bGxcbiAgICAgID8gZGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1tBdHRyaWJ1dGUub2Zmc2V0VW5pdF1cbiAgICAgIDogdmFsdWVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHVuaXQgb2Ygb2Zmc2V0LlxuICAgKi9cbiAgcHJvdGVjdGVkIHNldCBvZmZzZXRVbml0KG9mZnNldFVuaXQ6IHN0cmluZyB8IG51bGwpIHtcbiAgICBpZiAob2Zmc2V0VW5pdCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoQXR0cmlidXRlLm9mZnNldFVuaXQpO1xuICAgIH0gZWxzZSBpZiAoIU9iamVjdC52YWx1ZXMoT2Zmc2V0VW5pdCkuaW5jbHVkZXMob2Zmc2V0VW5pdCBhcyBPZmZzZXRVbml0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG9mZnNldCB1bml0OiAke29mZnNldFVuaXR9YCk7XG4gICAgfSBlbHNlIGlmIChvZmZzZXRVbml0ICE9PSB0aGlzLm9mZnNldFVuaXQpIHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlKEF0dHJpYnV0ZS5vZmZzZXRVbml0LCBvZmZzZXRVbml0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmFsdWUgb2Ygc3BlY2lmaWMgYXR0cmlidXRlIG5hbWUuXG4gICAqL1xuICB0cmFjZU1hZ25ldEF0dHJpYnV0ZVZhbHVlKGF0dHJOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKTtcblxuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IHsgcGFyZW50TWFnbmV0IH0gPSB0aGlzO1xuXG4gICAgcmV0dXJuIChwYXJlbnRNYWduZXRcbiAgICAgID8gcGFyZW50TWFnbmV0LnRyYWNlTWFnbmV0QXR0cmlidXRlVmFsdWUoYXR0ck5hbWUpXG4gICAgICA6IG51bGxcbiAgICApO1xuICB9XG59XG5cbnJlZ2lzdGVyRWxlbWVudChNYWduZXRQYWNrLCBub2RlTmFtZSk7XG5cbmV4cG9ydCBkZWZhdWx0IE1hZ25ldFBhY2s7XG4iLCJpbXBvcnQgUGFjaywgeyBSZWN0YWJsZSB9IGZyb20gJy4vUGFjayc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdGxpa2UgZXh0ZW5kcyBQYXJ0aWFsPERPTVJlY3Q+IHtcbiAgdG9wPzogbnVtYmVyO1xuICByaWdodD86IG51bWJlcjtcbiAgYm90dG9tPzogbnVtYmVyO1xuICBsZWZ0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBjb21wbGV0ZWQgcmVjdCBvYmplY3QgZnJvbSByZWN0YWJsZSBzb3VyY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWN0KFxuICBzb3VyY2U6IFJlY3RhYmxlIHwgUGFjayB8IG51bWJlcixcbiAgLi4uYXJnczogW251bWJlcj8sIG51bWJlcj8sIG51bWJlcj9dXG4pOiBET01SZWN0IHtcbiAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFdpbmRvdykge1xuICAgIHJldHVybiBuZXcgRE9NUmVjdCgwLCAwLCBzb3VyY2UuaW5uZXJXaWR0aCwgc291cmNlLmlubmVySGVpZ2h0KTtcbiAgfVxuXG4gIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBEb2N1bWVudCkge1xuICAgIHJldHVybiBkb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB9XG5cbiAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICByZXR1cm4gc291cmNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB9XG5cbiAgaWYgKFBhY2suaXNQYWNrKHNvdXJjZSkpIHtcbiAgICByZXR1cm4gRE9NUmVjdC5mcm9tUmVjdChzb3VyY2UucmVjdCk7XG4gIH1cblxuICBpZiAodHlwZW9mIHNvdXJjZSAhPT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCB4ID0gc291cmNlO1xuICAgIGNvbnN0IFt5LCB3aWR0aCwgaGVpZ2h0XSA9IGFyZ3M7XG5cbiAgICByZXR1cm4gbmV3IERPTVJlY3QoeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gIH1cblxuICBjb25zdCB7XG4gICAgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0LFxuICAgIHggPSBsZWZ0IGFzIG51bWJlcixcbiAgICB5ID0gdG9wIGFzIG51bWJlcixcbiAgICB3aWR0aCA9IChyaWdodCBhcyBudW1iZXIpIC0geCxcbiAgICBoZWlnaHQgPSAoYm90dG9tIGFzIG51bWJlcikgLSB5LFxuICB9ID0gc291cmNlO1xuXG4gIHJldHVybiBuZXcgRE9NUmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHJlY3Qgb2JqZWN0IGZyb20gc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVjdChzb3VyY2U6IFJlY3RhYmxlIHwgUGFjayk6IERPTVJlY3Qge1xuICBpZiAoUGFjay5pc1BhY2soc291cmNlKSkge1xuICAgIHJldHVybiBzb3VyY2UucmVjdDtcbiAgfVxuXG4gIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBET01SZWN0KSB7XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVSZWN0KHNvdXJjZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVJlY3Q7XG4iLCJpbXBvcnQgeyBnZXRSZWN0LCBSZWN0bGlrZSB9IGZyb20gJy4vUmVjdCc7XG5cbmV4cG9ydCB0eXBlIFJlY3RhYmxlID0gUmVjdGxpa2UgfCBET01SZWN0IHwgRWxlbWVudCB8IERvY3VtZW50IHwgV2luZG93O1xuXG5jbGFzcyBQYWNrIHtcbiAgcmVhZG9ubHkgcmF3OiBSZWN0YWJsZTtcblxuICByZWFkb25seSByZWN0OiBET01SZWN0O1xuXG4gIGNvbnN0cnVjdG9yKHNvdXJjZTogUmVjdGFibGUgfCBQYWNrLCByZWN0OiBET01SZWN0ID0gZ2V0UmVjdChzb3VyY2UpKSB7XG4gICAgY29uc3QgcmF3ID0gUGFjay5pc1BhY2soc291cmNlKSA/IHNvdXJjZS5yYXcgOiBzb3VyY2U7XG5cbiAgICB0aGlzLnJhdyA9IHJhdztcbiAgICB0aGlzLnJlY3QgPSByZWN0O1xuXG4gICAgT2JqZWN0LmZyZWV6ZSh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgc291cmNlIGlzIHBhY2sgb2JlamN0LlxuICAgKi9cbiAgc3RhdGljIGlzUGFjayhzb3VyY2U6IHVua25vd24pOiBzb3VyY2UgaXMgUGFjayB7XG4gICAgcmV0dXJuIHNvdXJjZSBpbnN0YW5jZW9mIFBhY2s7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHBhY2sgb2JqZWN0IGZyb20gc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFjayhzb3VyY2U6IFJlY3RhYmxlIHwgUGFjayk6IFBhY2sge1xuICByZXR1cm4gUGFjay5pc1BhY2soc291cmNlKSA/IHNvdXJjZSA6IG5ldyBQYWNrKHNvdXJjZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBhY2s7XG4iLCJpbXBvcnQgQWxpZ25tZW50IGZyb20gJy4uL3ZhbHVlcy9hbGlnbm1lbnQnO1xuXG4vKipcbiAqIFJldHVybnMgZGlzdGFuY2UgYmV0d2VlbiBzb3VyY2UgdG8gdGFyZ2V0IG9uIHNwZWNpZmljIGFsaWdubWVudC5cbiAqL1xuZnVuY3Rpb24gcmF3RGlzdGFuY2VUbyhcbiAgc291cmNlUmVjdDogRE9NUmVjdCxcbiAgdGFyZ2V0UmVjdDogRE9NUmVjdCxcbiAgYWxpZ25tZW50OiBBbGlnbm1lbnQsXG4pOiBudW1iZXIge1xuICBzd2l0Y2ggKGFsaWdubWVudCkge1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gSW5maW5pdHk7XG5cbiAgICBjYXNlIEFsaWdubWVudC50b3BUb1RvcDpcbiAgICAgIHJldHVybiB0YXJnZXRSZWN0LnRvcCAtIHNvdXJjZVJlY3QudG9wO1xuXG4gICAgY2FzZSBBbGlnbm1lbnQudG9wVG9Cb3R0b206XG4gICAgICByZXR1cm4gdGFyZ2V0UmVjdC5ib3R0b20gLSBzb3VyY2VSZWN0LnRvcDtcblxuICAgIGNhc2UgQWxpZ25tZW50LnJpZ2h0VG9SaWdodDpcbiAgICAgIHJldHVybiB0YXJnZXRSZWN0LnJpZ2h0IC0gc291cmNlUmVjdC5yaWdodDtcblxuICAgIGNhc2UgQWxpZ25tZW50LnJpZ2h0VG9MZWZ0OlxuICAgICAgcmV0dXJuIHRhcmdldFJlY3QubGVmdCAtIHNvdXJjZVJlY3QucmlnaHQ7XG5cbiAgICBjYXNlIEFsaWdubWVudC5ib3R0b21Ub1RvcDpcbiAgICAgIHJldHVybiB0YXJnZXRSZWN0LnRvcCAtIHNvdXJjZVJlY3QuYm90dG9tO1xuXG4gICAgY2FzZSBBbGlnbm1lbnQuYm90dG9tVG9Cb3R0b206XG4gICAgICByZXR1cm4gdGFyZ2V0UmVjdC5ib3R0b20gLSBzb3VyY2VSZWN0LmJvdHRvbTtcblxuICAgIGNhc2UgQWxpZ25tZW50LmxlZnRUb1JpZ2h0OlxuICAgICAgcmV0dXJuIHRhcmdldFJlY3QucmlnaHQgLSBzb3VyY2VSZWN0LmxlZnQ7XG5cbiAgICBjYXNlIEFsaWdubWVudC5sZWZ0VG9MZWZ0OlxuICAgICAgcmV0dXJuIHRhcmdldFJlY3QubGVmdCAtIHNvdXJjZVJlY3QubGVmdDtcblxuICAgIGNhc2UgQWxpZ25tZW50LnhDZW50ZXJUb1hDZW50ZXI6XG4gICAgICByZXR1cm4gKFxuICAgICAgICAodGFyZ2V0UmVjdC5yaWdodCArIHRhcmdldFJlY3QubGVmdCkgLSAoc291cmNlUmVjdC5yaWdodCArIHNvdXJjZVJlY3QubGVmdClcbiAgICAgICkgLyAyO1xuXG4gICAgY2FzZSBBbGlnbm1lbnQueUNlbnRlclRvWUNlbnRlcjpcbiAgICAgIHJldHVybiAoXG4gICAgICAgICh0YXJnZXRSZWN0LnRvcCArIHRhcmdldFJlY3QuYm90dG9tKSAtIChzb3VyY2VSZWN0LnRvcCArIHNvdXJjZVJlY3QuYm90dG9tKVxuICAgICAgKSAvIDI7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgcmF3RGlzdGFuY2VUbztcbiIsImV4cG9ydCBjb25zdCByZXR1cm5UcnVlID0gKCkgPT4gdHJ1ZTtcblxuZXhwb3J0IGNvbnN0IHJldHVybkZhbHNlID0gKCkgPT4gZmFsc2U7XG4iLCJpbXBvcnQgY3JlYXRlUG9pbnQgZnJvbSAnLi4vdHlwZXMvUG9pbnQnO1xuaW1wb3J0IHsgYWJzIH0gZnJvbSAnLi9udW1lcmljJztcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBvbiB4LWF4aXMgb2YgY2VudGVycyBmcm9tIHNvdXJjZSB0byB0YXJnZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZUJldHdlZW5YQ2VudGVyc09mUmVjdHMoXG4gIHNvdXJjZVJlY3Q6IERPTVJlY3QsXG4gIHRhcmdldFJlY3Q6IERPTVJlY3QsXG4pOiBudW1iZXIge1xuICBjb25zdCBzb3VyY2VSZWN0WENlbnRlciA9IHNvdXJjZVJlY3QucmlnaHQgKyBzb3VyY2VSZWN0LmxlZnQ7XG4gIGNvbnN0IHRhcmdldFJlY3RYQ2VudGVyID0gdGFyZ2V0UmVjdC5yaWdodCArIHRhcmdldFJlY3QubGVmdDtcblxuICByZXR1cm4gYWJzKHNvdXJjZVJlY3RYQ2VudGVyIC0gdGFyZ2V0UmVjdFhDZW50ZXIpIC8gMjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBvbiB5LWF4aXMgb2YgY2VudGVycyBmcm9tIHNvdXJjZSB0byB0YXJnZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZUJldHdlZW5ZQ2VudGVyc09mUmVjdHMoXG4gIHNvdXJjZVJlY3Q6IERPTVJlY3QsXG4gIHRhcmdldFJlY3Q6IERPTVJlY3QsXG4pOiBudW1iZXIge1xuICBjb25zdCBzb3VyY2VSZWN0WUNlbnRlciA9IHNvdXJjZVJlY3QudG9wICsgc291cmNlUmVjdC5ib3R0b207XG4gIGNvbnN0IHRhcmdldFJlY3RZQ2VudGVyID0gdGFyZ2V0UmVjdC50b3AgKyB0YXJnZXRSZWN0LmJvdHRvbTtcblxuICByZXR1cm4gYWJzKHNvdXJjZVJlY3RZQ2VudGVyIC0gdGFyZ2V0UmVjdFlDZW50ZXIpIC8gMjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBvbiB4LWF4aXMgb2YgY2VudGVycyBmcm9tIHNvdXJjZSB0byB0YXJnZXQuXG4gKi9cbmZ1bmN0aW9uIGRpc3RhbmNlQmV0d2VlbkNlbnRlcnNPZlJlY3RzKFxuICBzb3VyY2VSZWN0OiBET01SZWN0LFxuICB0YXJnZXRSZWN0OiBET01SZWN0LFxuKTogRE9NUG9pbnQge1xuICByZXR1cm4gY3JlYXRlUG9pbnQoXG4gICAgZGlzdGFuY2VCZXR3ZWVuWENlbnRlcnNPZlJlY3RzKHNvdXJjZVJlY3QsIHRhcmdldFJlY3QpLFxuICAgIGRpc3RhbmNlQmV0d2VlbllDZW50ZXJzT2ZSZWN0cyhzb3VyY2VSZWN0LCB0YXJnZXRSZWN0KSxcbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZGlzdGFuY2VCZXR3ZWVuQ2VudGVyc09mUmVjdHM7XG4iLCJpbXBvcnQgTWFnbmV0IGZyb20gJy4uL2Jsb2NrJztcbmltcG9ydCBNYWduZXRQYWNrLCB7IGRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXMgfSBmcm9tICcuLi9jb3JlJztcbmltcG9ydCBBdHRyYWN0aW9uLCB7IEF0dHJhY3Rpb25CZXN0IH0gZnJvbSAnLi4vdHlwZXMvQXR0cmFjdGlvbic7XG5pbXBvcnQgUGFjaywgeyBnZXRQYWNrLCBSZWN0YWJsZSB9IGZyb20gJy4uL3R5cGVzL1BhY2snO1xuaW1wb3J0IHsgZ2V0UmVjdCB9IGZyb20gJy4uL3R5cGVzL1JlY3QnO1xuaW1wb3J0IHsgYWJzIH0gZnJvbSAnLi4vdXRpbHMvbnVtZXJpYyc7XG5pbXBvcnQgQWxpZ25tZW50IGZyb20gJy4uL3ZhbHVlcy9hbGlnbm1lbnQnO1xuaW1wb3J0IHsgU2luZ2xlQXR0cmFjdGlvblRvT3B0aW9ucyB9IGZyb20gJy4vc2luZ2xlQXR0cmFjdGlvblRvJztcbmltcG9ydCB7IE9uSnVkZ2VBdHRyYWN0aW9uIH0gZnJvbSAnLi9qdWRnZUF0dHJhY3Rpb24nO1xuaW1wb3J0IHsgcmV0dXJuVHJ1ZSB9IGZyb20gJy4uL3V0aWxzL3JldHVyblRydWVGYWxzZSc7XG5pbXBvcnQgQXR0cmlidXRlIGZyb20gJy4uL3ZhbHVlcy9hdHRyaWJ1dGUnO1xuaW1wb3J0IHsgZGlzdGFuY2VCZXR3ZWVuWENlbnRlcnNPZlJlY3RzLCBkaXN0YW5jZUJldHdlZW5ZQ2VudGVyc09mUmVjdHMgfSBmcm9tICcuLi91dGlscy9kaXN0YW5jZUJldHdlZW5SZWN0cyc7XG5cbmV4cG9ydCB0eXBlIE11bHRpQXR0cmFjdGlvbiA9IEF0dHJhY3Rpb248UGFja1tdPjtcblxuZXhwb3J0IGludGVyZmFjZSBNdWx0aUF0dHJhY3Rpb25zVG9PcHRpb25zIGV4dGVuZHMgU2luZ2xlQXR0cmFjdGlvblRvT3B0aW9ucyB7XG4gIGF0dHJhY3Rpb25CZXN0PzogQXR0cmFjdGlvbkJlc3Q7XG4gIG9uSnVkZ2VBdHRyYWN0aW9uPzogT25KdWRnZUF0dHJhY3Rpb247XG59XG5cbi8qKlxuICogUmV0dXJucyByZXN1bHQgb2YgYXR0cmFjdGlvbnMgZnJvbSBzb3VyY2UgdG8gdGFyZ2V0cyBvbiBhbGlnbm1lbnRzLlxuICovXG5mdW5jdGlvbiBtdWx0aUF0dHJhY3Rpb25zVG8oXG4gIHNvdXJjZTogUmVjdGFibGUgfCBQYWNrLFxuICB0YXJnZXRzOiAoUmVjdGFibGUgfCBQYWNrKVtdLFxuICBvcHRpb25zOiBNdWx0aUF0dHJhY3Rpb25zVG9PcHRpb25zID0ge30sXG4pOiBNdWx0aUF0dHJhY3Rpb24ge1xuICBjb25zdCBzb3VyY2VQYWNrID0gZ2V0UGFjayhzb3VyY2UpO1xuICBjb25zdCB0YXJnZXRQYWNrcyA9IHRhcmdldHMubWFwKCh0YXJnZXQpID0+IGdldFBhY2sodGFyZ2V0KSk7XG4gIGNvbnN0IHtcbiAgICBhdHRyYWN0RGlzdGFuY2UgPSBkZWZhdWx0QXR0cmlidXRlVmFsdWVzW0F0dHJpYnV0ZS5hdHRyYWN0RGlzdGFuY2VdLFxuICAgIGFsaWduVG9zID0gZGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1tBdHRyaWJ1dGUuYWxpZ25Ub10sXG4gICAgYWxpZ25tZW50cyA9IE1hZ25ldFBhY2suZ2V0QWxpZ25tZW50c0Zyb21BbGlnblRvKGFsaWduVG9zKSxcbiAgICBvbkp1ZGdlRGlzdGFuY2UgPSByZXR1cm5UcnVlLFxuICAgIG9uSnVkZ2VBdHRyYWN0aW9uID0gcmV0dXJuVHJ1ZSxcbiAgICBhdHRyYWN0aW9uQmVzdCA9IHt9LFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3Qgc2luZ2xlQXR0cmFjdGlvbk9wdGlvbnM6IFNpbmdsZUF0dHJhY3Rpb25Ub09wdGlvbnMgPSB7XG4gICAgYXR0cmFjdERpc3RhbmNlLFxuICAgIGFsaWduVG9zLFxuICAgIGFsaWdubWVudHMsXG4gICAgb25KdWRnZURpc3RhbmNlLFxuICB9O1xuICBjb25zdCBtdWx0aUF0dHJhY3Rpb24gPSB0YXJnZXRQYWNrcy5yZWR1Y2U8TXVsdGlBdHRyYWN0aW9uPihcbiAgICAoYXR0cmFjdGlvbiwgdGFyZ2V0UGFjaykgPT4ge1xuICAgICAgY29uc3Qgc2luZ2xlQXR0cmFjdGlvbiA9IE1hZ25ldC5wcm90b3R5cGUuYXR0cmFjdGlvblRvLmNhbGwoXG4gICAgICAgIHNvdXJjZVBhY2ssXG4gICAgICAgIHRhcmdldFBhY2ssXG4gICAgICAgIHNpbmdsZUF0dHJhY3Rpb25PcHRpb25zLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYmVzdDogY3VycmVudEJlc3QsXG4gICAgICAgIHJlc3VsdHM6IGN1cnJlbnRSZXN1bHRzLFxuICAgICAgfSA9IHNpbmdsZUF0dHJhY3Rpb247XG4gICAgICBjb25zdCBwYXNzSnVkZ2VtZW50ID0gb25KdWRnZUF0dHJhY3Rpb24oe1xuICAgICAgICBzb3VyY2U6IHNvdXJjZVBhY2ssXG4gICAgICAgIHRhcmdldDogdGFyZ2V0UGFjayxcbiAgICAgICAgcmVzdWx0czogWy4uLmN1cnJlbnRSZXN1bHRzXSxcbiAgICAgICAgYmVzdDoge1xuICAgICAgICAgIHg6IGN1cnJlbnRCZXN0LngsXG4gICAgICAgICAgeTogY3VycmVudEJlc3QueSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBhdHRyYWN0aW9uLnRhcmdldC5wdXNoKHRhcmdldFBhY2spO1xuXG4gICAgICBpZiAocGFzc0p1ZGdlbWVudCkge1xuICAgICAgICBjb25zdCB7IHJlc3VsdHMsIGJlc3QgfSA9IGF0dHJhY3Rpb247XG5cbiAgICAgICAgcmVzdWx0cy5wdXNoKC4uLmN1cnJlbnRSZXN1bHRzKTtcblxuICAgICAgICBpZiAoY3VycmVudEJlc3QueCkge1xuICAgICAgICAgIGlmIChiZXN0LnggPT09IHVuZGVmaW5lZCB8fCBjdXJyZW50QmVzdC54LmFic0Rpc3RhbmNlIDwgYmVzdC54LmFic0Rpc3RhbmNlXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBiZXN0LnggPSBjdXJyZW50QmVzdC54O1xuICAgICAgICAgIH0gZWxzZSBpZiAoYmVzdC54LmFic0Rpc3RhbmNlID09PSBjdXJyZW50QmVzdC54LmFic0Rpc3RhbmNlKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VSZWN0ID0gZ2V0UmVjdChzb3VyY2VQYWNrKTtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldFJlY3QgPSBjdXJyZW50QmVzdC54LnRhcmdldC5yZWN0O1xuICAgICAgICAgICAgY29uc3QgbGFzdEJlc3RSZWN0ID0gYmVzdC54LnRhcmdldC5yZWN0O1xuICAgICAgICAgICAgY29uc3QgY3VycmVudERpZmZZID0gZGlzdGFuY2VCZXR3ZWVuWUNlbnRlcnNPZlJlY3RzKHNvdXJjZVJlY3QsIHRhcmdldFJlY3QpO1xuICAgICAgICAgICAgY29uc3QgZGlmZlkgPSBkaXN0YW5jZUJldHdlZW5ZQ2VudGVyc09mUmVjdHMoc291cmNlUmVjdCwgbGFzdEJlc3RSZWN0KTtcblxuICAgICAgICAgICAgaWYgKGN1cnJlbnREaWZmWSA8IGRpZmZZKSB7XG4gICAgICAgICAgICAgIGJlc3QueCA9IGN1cnJlbnRCZXN0Lng7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnREaWZmWSA9PT0gZGlmZlkpIHtcbiAgICAgICAgICAgICAgY29uc3QgZ2FwID0gYXR0cmFjdERpc3RhbmNlIC8gMztcblxuICAgICAgICAgICAgICBpZiAoY3VycmVudEJlc3QueC5yYXdEaXN0YW5jZSA+IGdhcCkge1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50QmVzdC54LmFsaWdubWVudCA9PT0gQWxpZ25tZW50LmxlZnRUb0xlZnQpIHtcbiAgICAgICAgICAgICAgICAgIGJlc3QueCA9IGN1cnJlbnRCZXN0Lng7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRCZXN0LngucmF3RGlzdGFuY2UgPCAtZ2FwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRCZXN0LnguYWxpZ25tZW50ID09PSBBbGlnbm1lbnQucmlnaHRUb1JpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICBiZXN0LnggPSBjdXJyZW50QmVzdC54O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50QmVzdC54LmFsaWdubWVudCA9PT0gQWxpZ25tZW50LnhDZW50ZXJUb1hDZW50ZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0UmVjdCA9IGN1cnJlbnRCZXN0LngudGFyZ2V0LnJlY3Q7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFJlY3QgPSBiZXN0LngudGFyZ2V0LnJlY3Q7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdFlCYXNlID0gbGFzdFJlY3QudG9wICsgbGFzdFJlY3QuYm90dG9tO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRZQmFzZSA9IGN1cnJlbnRSZWN0LnRvcCArIGN1cnJlbnRSZWN0LmJvdHRvbTtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VZQmFzZSA9IHNvdXJjZVJlY3QudG9wICsgc291cmNlUmVjdC5ib3R0b207XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdFlEaXN0YW5jZSA9IGFicyhsYXN0WUJhc2UgLSBzb3VyY2VZQmFzZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFlEaXN0YW5jZSA9IGFicyhjdXJyZW50WUJhc2UgLSBzb3VyY2VZQmFzZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFlEaXN0YW5jZSA8IGxhc3RZRGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgICAgIGJlc3QueCA9IGN1cnJlbnRCZXN0Lng7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGN1cnJlbnRCZXN0LnkpIHtcbiAgICAgICAgICBpZiAoYmVzdC55ID09PSB1bmRlZmluZWQgfHwgY3VycmVudEJlc3QueS5hYnNEaXN0YW5jZSA8IGJlc3QueS5hYnNEaXN0YW5jZVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgYmVzdC55ID0gY3VycmVudEJlc3QueTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGJlc3QueS5hYnNEaXN0YW5jZSA9PT0gY3VycmVudEJlc3QueS5hYnNEaXN0YW5jZSkge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlUmVjdCA9IGdldFJlY3Qoc291cmNlUGFjayk7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRSZWN0ID0gY3VycmVudEJlc3QueS50YXJnZXQucmVjdDtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RCZXN0UmVjdCA9IGJlc3QueS50YXJnZXQucmVjdDtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREaWZmWCA9IGRpc3RhbmNlQmV0d2VlblhDZW50ZXJzT2ZSZWN0cyhzb3VyY2VSZWN0LCB0YXJnZXRSZWN0KTtcbiAgICAgICAgICAgIGNvbnN0IGRpZmZYID0gZGlzdGFuY2VCZXR3ZWVuWENlbnRlcnNPZlJlY3RzKHNvdXJjZVJlY3QsIGxhc3RCZXN0UmVjdCk7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50RGlmZlggPCBkaWZmWCkge1xuICAgICAgICAgICAgICBiZXN0LnkgPSBjdXJyZW50QmVzdC55O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50RGlmZlggPT09IGRpZmZYKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGdhcCA9IGF0dHJhY3REaXN0YW5jZSAvIDM7XG5cbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnRCZXN0LnkucmF3RGlzdGFuY2UgPCAtZ2FwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRCZXN0LnkuYWxpZ25tZW50ID09PSBBbGlnbm1lbnQuYm90dG9tVG9Cb3R0b20pIHtcbiAgICAgICAgICAgICAgICAgIGJlc3QueSA9IGN1cnJlbnRCZXN0Lnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRCZXN0LnkucmF3RGlzdGFuY2UgPiBnYXApIHtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEJlc3QueS5hbGlnbm1lbnQgPT09IEFsaWdubWVudC50b3BUb1RvcCkge1xuICAgICAgICAgICAgICAgICAgYmVzdC55ID0gY3VycmVudEJlc3QueTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudEJlc3QueS5hbGlnbm1lbnQgPT09IEFsaWdubWVudC55Q2VudGVyVG9ZQ2VudGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdFJlY3QgPSBjdXJyZW50QmVzdC55LnRhcmdldC5yZWN0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRSZWN0ID0gYmVzdC55LnRhcmdldC5yZWN0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RYQmFzZSA9IGxhc3RSZWN0LnJpZ2h0ICsgbGFzdFJlY3QubGVmdDtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50WEJhc2UgPSBjdXJyZW50UmVjdC5yaWdodCArIGN1cnJlbnRSZWN0LmxlZnQ7XG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlWEJhc2UgPSBzb3VyY2VSZWN0LnJpZ2h0ICsgc291cmNlUmVjdC5sZWZ0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RYRGlzdGFuY2UgPSBhYnMobGFzdFhCYXNlIC0gc291cmNlWEJhc2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRYRGlzdGFuY2UgPSBhYnMoY3VycmVudFhCYXNlIC0gc291cmNlWEJhc2UpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRYRGlzdGFuY2UgPCBsYXN0WERpc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgICBiZXN0LnkgPSBjdXJyZW50QmVzdC55O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXR0cmFjdGlvbjtcbiAgICB9LFxuICAgIHtcbiAgICAgIHNvdXJjZTogc291cmNlUGFjayxcbiAgICAgIHRhcmdldDogW10sXG4gICAgICByZXN1bHRzOiBbXSxcbiAgICAgIGJlc3Q6IHsgLi4uYXR0cmFjdGlvbkJlc3QgfSxcbiAgICB9LFxuICApO1xuXG4gIHJldHVybiBtdWx0aUF0dHJhY3Rpb247XG59XG5cbmV4cG9ydCBkZWZhdWx0IG11bHRpQXR0cmFjdGlvbnNUbztcbiIsImltcG9ydCBBdHRyYWN0aW9uIGZyb20gJy4uL3R5cGVzL0F0dHJhY3Rpb24nO1xuaW1wb3J0IFBhY2ssIHsgZ2V0UGFjaywgUmVjdGFibGUgfSBmcm9tICcuLi90eXBlcy9QYWNrJztcbmltcG9ydCBBbGlnbm1lbnQsIHsgQWxpZ25tZW50WHMsIEFsaWdubWVudFlzIH0gZnJvbSAnLi4vdmFsdWVzL2FsaWdubWVudCc7XG5pbXBvcnQgQWxpZ25UbywgeyBBbGlnblRvUGFyZW50IH0gZnJvbSAnLi4vdmFsdWVzL2FsaWduVG8nO1xuaW1wb3J0IHsgT25KdWRnZURpc3RhbmNlIH0gZnJvbSAnLi9qdWRnZURpc3RhbmNlJztcbmltcG9ydCBNYWduZXQgZnJvbSAnLi4vYmxvY2snO1xuaW1wb3J0IHsgcmV0dXJuVHJ1ZSB9IGZyb20gJy4uL3V0aWxzL3JldHVyblRydWVGYWxzZSc7XG5pbXBvcnQgeyBkZWZhdWx0QXR0cmlidXRlVmFsdWVzIH0gZnJvbSAnLi4vY29yZSc7XG5pbXBvcnQgQXR0cmlidXRlIGZyb20gJy4uL3ZhbHVlcy9hdHRyaWJ1dGUnO1xuXG5leHBvcnQgdHlwZSBTaW5nbGVBdHRyYWN0aW9uID0gQXR0cmFjdGlvbjxQYWNrPjtcblxuZXhwb3J0IGludGVyZmFjZSBTaW5nbGVBdHRyYWN0aW9uVG9PcHRpb25zIHtcbiAgYXR0cmFjdERpc3RhbmNlPzogbnVtYmVyO1xuICBhbGlnblRvcz86IChBbGlnblRvIHwgQWxpZ25Ub1BhcmVudClbXTtcbiAgYWxpZ25tZW50cz86IEFsaWdubWVudFtdO1xuICBvbkp1ZGdlRGlzdGFuY2U/OiBPbkp1ZGdlRGlzdGFuY2U7XG59XG5cbi8qKlxuICogUmV0dXJucyByZXN1bHQgb2YgYXR0cmFjdGlvbnMgZnJvbSBzb3VyY2UgdG8gdGFyZ2V0IG9uIGFsaWdubWVudHMuXG4gKi9cbmZ1bmN0aW9uIHNpbmdsZUF0dHJhY3Rpb25UbyhcbiAgc291cmNlOiBSZWN0YWJsZSB8IFBhY2ssXG4gIHRhcmdldDogUmVjdGFibGUgfCBQYWNrLFxuICBvcHRpb25zOiBTaW5nbGVBdHRyYWN0aW9uVG9PcHRpb25zID0ge30sXG4pOiBTaW5nbGVBdHRyYWN0aW9uIHtcbiAgY29uc3Qgc291cmNlUGFjayA9IGdldFBhY2soc291cmNlKTtcbiAgY29uc3QgdGFyZ2V0UGFjayA9IGdldFBhY2sodGFyZ2V0KTtcbiAgY29uc3Qge1xuICAgIGF0dHJhY3REaXN0YW5jZSA9IGRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXNbQXR0cmlidXRlLmF0dHJhY3REaXN0YW5jZV0sXG4gICAgYWxpZ25Ub3MgPSBkZWZhdWx0QXR0cmlidXRlVmFsdWVzW0F0dHJpYnV0ZS5hbGlnblRvXSxcbiAgICBhbGlnbm1lbnRzID0gTWFnbmV0LmdldEFsaWdubWVudHNGcm9tQWxpZ25UbyhhbGlnblRvcyksXG4gICAgb25KdWRnZURpc3RhbmNlID0gcmV0dXJuVHJ1ZSxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHNpbmdsZUF0dHJhY3Rpb24gPSBhbGlnbm1lbnRzLnJlZHVjZTxTaW5nbGVBdHRyYWN0aW9uPihcbiAgICAoYXR0cmFjdGlvbiwgYWxpZ25tZW50KSA9PiB7XG4gICAgICBjb25zdCBkaXN0YW5jZSA9IE1hZ25ldC5wcm90b3R5cGUuZGlzdGFuY2VUby5jYWxsKHNvdXJjZVBhY2ssIHRhcmdldFBhY2ssIGFsaWdubWVudCk7XG4gICAgICBjb25zdCBwYXNzSnVkZ2VtZW50ID0gb25KdWRnZURpc3RhbmNlKFxuICAgICAgICB7IC4uLmRpc3RhbmNlIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBhdHRyYWN0RGlzdGFuY2UsXG4gICAgICAgICAgYWxpZ25Ub3MsXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICBpZiAocGFzc0p1ZGdlbWVudCkge1xuICAgICAgICBjb25zdCB7IHJlc3VsdHMsIGJlc3QgfSA9IGF0dHJhY3Rpb247XG5cbiAgICAgICAgcmVzdWx0cy5wdXNoKGRpc3RhbmNlKTtcblxuICAgICAgICBpZiAoQWxpZ25tZW50WHMuaW5jbHVkZXMoYWxpZ25tZW50KSkge1xuICAgICAgICAgIGlmIChiZXN0LnggPT09IHVuZGVmaW5lZCB8fCBkaXN0YW5jZS5hYnNEaXN0YW5jZSA8IGJlc3QueC5hYnNEaXN0YW5jZSkge1xuICAgICAgICAgICAgYmVzdC54ID0gZGlzdGFuY2U7XG4gICAgICAgICAgfSBlbHNlIGlmIChiZXN0LnguYWJzRGlzdGFuY2UgPT09IGRpc3RhbmNlLmFic0Rpc3RhbmNlKSB7XG4gICAgICAgICAgICBjb25zdCBnYXAgPSBhdHRyYWN0RGlzdGFuY2UgLyAzO1xuXG4gICAgICAgICAgICBpZiAoZGlzdGFuY2UucmF3RGlzdGFuY2UgPiBnYXApIHtcbiAgICAgICAgICAgICAgaWYgKGRpc3RhbmNlLmFsaWdubWVudCA9PT0gQWxpZ25tZW50LmxlZnRUb0xlZnQpIHtcbiAgICAgICAgICAgICAgICBiZXN0LnggPSBkaXN0YW5jZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZS5yYXdEaXN0YW5jZSA8IC1nYXApIHtcbiAgICAgICAgICAgICAgaWYgKGRpc3RhbmNlLmFsaWdubWVudCA9PT0gQWxpZ25tZW50LnJpZ2h0VG9SaWdodCkge1xuICAgICAgICAgICAgICAgIGJlc3QueCA9IGRpc3RhbmNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRpc3RhbmNlLmFsaWdubWVudCA9PT0gQWxpZ25tZW50LnhDZW50ZXJUb1hDZW50ZXIpIHtcbiAgICAgICAgICAgICAgYmVzdC54ID0gZGlzdGFuY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKEFsaWdubWVudFlzLmluY2x1ZGVzKGFsaWdubWVudCkpIHtcbiAgICAgICAgICBpZiAoYmVzdC55ID09PSB1bmRlZmluZWQgfHwgZGlzdGFuY2UuYWJzRGlzdGFuY2UgPCBiZXN0LnkuYWJzRGlzdGFuY2UpIHtcbiAgICAgICAgICAgIGJlc3QueSA9IGRpc3RhbmNlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoYmVzdC55LmFic0Rpc3RhbmNlID09PSBkaXN0YW5jZS5hYnNEaXN0YW5jZSkge1xuICAgICAgICAgICAgY29uc3QgZ2FwID0gYXR0cmFjdERpc3RhbmNlIC8gMztcblxuICAgICAgICAgICAgaWYgKGRpc3RhbmNlLnJhd0Rpc3RhbmNlIDwgLWdhcCkge1xuICAgICAgICAgICAgICBpZiAoZGlzdGFuY2UuYWxpZ25tZW50ID09PSBBbGlnbm1lbnQuYm90dG9tVG9Cb3R0b20pIHtcbiAgICAgICAgICAgICAgICBiZXN0LnkgPSBkaXN0YW5jZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZS5yYXdEaXN0YW5jZSA+IGdhcCkge1xuICAgICAgICAgICAgICBpZiAoZGlzdGFuY2UuYWxpZ25tZW50ID09PSBBbGlnbm1lbnQudG9wVG9Ub3ApIHtcbiAgICAgICAgICAgICAgICBiZXN0LnkgPSBkaXN0YW5jZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZS5hbGlnbm1lbnQgPT09IEFsaWdubWVudC55Q2VudGVyVG9ZQ2VudGVyKSB7XG4gICAgICAgICAgICAgIGJlc3QueSA9IGRpc3RhbmNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXR0cmFjdGlvbjtcbiAgICB9LFxuICAgIHtcbiAgICAgIHNvdXJjZTogc291cmNlUGFjayxcbiAgICAgIHRhcmdldDogdGFyZ2V0UGFjayxcbiAgICAgIHJlc3VsdHM6IFtdLFxuICAgICAgYmVzdDoge30sXG4gICAgfSxcbiAgKTtcblxuICByZXR1cm4gc2luZ2xlQXR0cmFjdGlvbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2luZ2xlQXR0cmFjdGlvblRvO1xuIiwiaW1wb3J0IHsgU2luZ2xlQXR0cmFjdGlvbiB9IGZyb20gJy4vc2luZ2xlQXR0cmFjdGlvblRvJztcblxuZXhwb3J0IHR5cGUgT25KdWRnZUF0dHJhY3Rpb24gPSAoXG4gIGF0dHJhY3Rpb246IFNpbmdsZUF0dHJhY3Rpb24sXG4pID0+IGJvb2xlYW47XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBhdHRyYWN0aW9uIHBhc3NlcyB0aGUganVkZ2VtZW50LiBPdGhlcndpc2UgdGhlXG4gKiBhdHRyYWN0aW9uIHdvdWxkIG5vdCBiZSBvbiB0aGUgcmVzdWx0IGxpc3Qgb2YgYXR0cmFjdGlvbnMuXG4gKi9cbmNvbnN0IGp1ZGdlQXR0cmFjdGlvbjogT25KdWRnZUF0dHJhY3Rpb24gPSBmdW5jdGlvbiBqdWRnZUF0dHJhY3Rpb24oXG4gIGF0dHJhY3Rpb24sXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIEJvb2xlYW4oYXR0cmFjdGlvbi5iZXN0LnggPz8gYXR0cmFjdGlvbi5iZXN0LnkpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQganVkZ2VBdHRyYWN0aW9uO1xuIiwiaW1wb3J0IFBhY2sgZnJvbSAnLi4vdHlwZXMvUGFjayc7XG5cbmV4cG9ydCB0eXBlIE9uSnVkZ2VNb3ZlbWVudCA9IChwYWNrOiBQYWNrKSA9PiBib29sZWFuO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGlzdGFuY2UgcGFzc2VzIHRoZSBqdWRnZW1lbnQuIE90aGVyd2lzZSB0aGVcbiAqIGRpc3RhbmNlIHdvdWxkIG5vdCBiZSBvbiB0aGUgcmVzdWx0IGxpc3Qgb2YgYXR0cmFjdGlvbi5cbiAqL1xuY29uc3QganVkZ2VNb3ZlbWVudDogT25KdWRnZU1vdmVtZW50ID0gZnVuY3Rpb24ganVkZ2VNb3ZlbWVudCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBqdWRnZU1vdmVtZW50O1xuIiwidHlwZSBFdmVudEhvbGRlciA9IEhUTUxFbGVtZW50IHwgRG9jdW1lbnQgfCBXaW5kb3c7XG50eXBlIEV2ZW50TGlzdGVuZXIgPSAoLi4uYXJnczogYW55W10pID0+IHZvaWQ7XG5cbmludGVyZmFjZSBFdmVudExpc3RlbmVyT3B0aW9ucyB7XG4gIGNhcHR1cmU/OiBib29sZWFuO1xuICBvbmNlPzogYm9vbGVhbjtcbiAgcGFzc2l2ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQWRkcyBldmVudCBvZiB0eXBlIHRvIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKFxuICByZWY6IEV2ZW50SG9sZGVyLFxuICB0eXBlOiBzdHJpbmcsXG4gIGxpc3RlbmVyOiBFdmVudExpc3RlbmVyLFxuICBvcHRpb25zPzogRXZlbnRMaXN0ZW5lck9wdGlvbnMsXG4pOiB2b2lkIHtcbiAgcmVmLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIEFkZHMgZXZlbnRzIG9mIHR5cGVzIHRvIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVycyhcbiAgcmVmOiBFdmVudEhvbGRlcixcbiAgdHlwZXM6IHN0cmluZ1tdLFxuICBsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lcixcbiAgb3B0aW9ucz86IEV2ZW50TGlzdGVuZXJPcHRpb25zLFxuKTogdm9pZCB7XG4gIHR5cGVzLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICBhZGRFdmVudExpc3RlbmVyKHJlZiwgdHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGV2ZW50IG9mIHR5cGUgZnJvbSBlbGVtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgcmVmOiBFdmVudEhvbGRlcixcbiAgdHlwZTogc3RyaW5nLFxuICBsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lcixcbiAgb3B0aW9ucz86IEV2ZW50TGlzdGVuZXJPcHRpb25zLFxuKTogdm9pZCB7XG4gIHJlZi5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGV2ZW50cyBvZiB0eXBlcyBmcm9tIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVycyhcbiAgcmVmOiBFdmVudEhvbGRlcixcbiAgdHlwZXM6IHN0cmluZ1tdLFxuICBsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lcixcbiAgb3B0aW9ucz86IEV2ZW50TGlzdGVuZXJPcHRpb25zLFxuKTogdm9pZCB7XG4gIHR5cGVzLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICByZWYucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucyk7XG4gIH0pO1xufVxuXG5pbnRlcmZhY2UgQ3VzdG9tRXZlbnRJbml0PFQ+IHtcbiAgZGV0YWlsPzogVDtcbiAgYnViYmxlcz86IGJvb2xlYW47XG4gIGNhbmNlbGFibGU/OiBib29sZWFuO1xuICBjb21wb3NlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVHJpZ2dlcnMgZXZlbnQgYW5kIHJldHVybnMgZmFsc2UgaWYgdGhlIGV2ZW50IGlzIGNhbmNlbGxlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaWdnZXJFdmVudDxUID0gdW5kZWZpbmVkPihcbiAgcmVmOiBFdmVudEhvbGRlcixcbiAgdHlwZTogc3RyaW5nLFxuICBvcHRpb25zPzogQ3VzdG9tRXZlbnRJbml0PFQ+LFxuKTogYm9vbGVhbiB7XG4gIHJldHVybiByZWYuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQodHlwZSwgb3B0aW9ucykpO1xufVxuXG4vKipcbiAqIFRyaWdnZXJzIGV2ZW50cyBhbmQgcmV0dXJucyBmYWxzZSBpZiBhbnkgb2YgdGhlIGV2ZW50IGlzXG4gKiBjYW5jZWxsZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmlnZ2VyRXZlbnRzPFQ+KFxuICByZWY6IEV2ZW50SG9sZGVyLFxuICB0eXBlczogc3RyaW5nW10sXG4gIG9wdGlvbnM/OiBDdXN0b21FdmVudEluaXQ8VD4sXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVzLmV2ZXJ5KCh0eXBlKSA9PiB0cmlnZ2VyRXZlbnQocmVmLCB0eXBlLCBvcHRpb25zKSk7XG59XG4iLCJpbXBvcnQgY3JlYXRlUG9pbnQgZnJvbSAnLi4vdHlwZXMvUG9pbnQnO1xuXG4vKipcbiAqIFJldHVybnMgb2Zmc2V0IHRvIGtlZXAgc291cmNlIHJlY3QgaW4gdGFyZ2V0IHJlY3QuXG4gKi9cbmZ1bmN0aW9uIGdldE9mZnNldFRvQmVJblJlY3Qoc291cmNlUmVjdDogRE9NUmVjdCwgdGFyZ2V0UmVjdDogRE9NUmVjdCk6IERPTVBvaW50IHtcbiAgbGV0IHggPSAwO1xuICBsZXQgeSA9IDA7XG5cbiAgaWYgKHNvdXJjZVJlY3QubGVmdCA8IHRhcmdldFJlY3QubGVmdCkge1xuICAgIHggPSB0YXJnZXRSZWN0LmxlZnQgLSBzb3VyY2VSZWN0LmxlZnQ7XG4gIH0gZWxzZSBpZiAoc291cmNlUmVjdC5yaWdodCA+IHRhcmdldFJlY3QucmlnaHQpIHtcbiAgICB4ID0gdGFyZ2V0UmVjdC5yaWdodCAtIHNvdXJjZVJlY3QucmlnaHQ7XG4gIH1cblxuICBpZiAoc291cmNlUmVjdC50b3AgPCB0YXJnZXRSZWN0LnRvcCkge1xuICAgIHkgPSB0YXJnZXRSZWN0LnRvcCAtIHNvdXJjZVJlY3QudG9wO1xuICB9IGVsc2UgaWYgKHNvdXJjZVJlY3QuYm90dG9tID4gdGFyZ2V0UmVjdC5ib3R0b20pIHtcbiAgICB5ID0gdGFyZ2V0UmVjdC5ib3R0b20gLSBzb3VyY2VSZWN0LmJvdHRvbTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVQb2ludCh4LCB5KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0T2Zmc2V0VG9CZUluUmVjdDtcbiIsImltcG9ydCBNYWduZXQgZnJvbSAnLi4vYmxvY2snO1xuaW1wb3J0IHsgZGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyB9IGZyb20gJy4uL2NvcmUnO1xuaW1wb3J0IHsgQXR0cmFjdGlvbkJlc3QsIGdldEF0dHJhY3Rpb25PZmZzZXQgfSBmcm9tICcuLi90eXBlcy9BdHRyYWN0aW9uJztcbmltcG9ydCBEaXN0YW5jZSBmcm9tICcuLi90eXBlcy9EaXN0YW5jZSc7XG5pbXBvcnQge1xuICBBdHRyYWN0ZWRFdmVudERldGFpbCwgQXR0cmFjdGVkbW92ZUV2ZW50RGV0YWlsLCBBdHRyYWN0RXZlbnREZXRhaWwsXG4gIEF0dHJhY3Rtb3ZlRXZlbnREZXRhaWwsIFVuYXR0cmFjdGVkRXZlbnREZXRhaWwsIFVuYXR0cmFjdEV2ZW50RGV0YWlsLFxufSBmcm9tICcuLi90eXBlcy9FdmVudERldGFpbCc7XG5pbXBvcnQgUGFjayBmcm9tICcuLi90eXBlcy9QYWNrJztcbmltcG9ydCBjcmVhdGVQb2ludCBmcm9tICcuLi90eXBlcy9Qb2ludCc7XG5pbXBvcnQgY3JlYXRlUmVjdCwgeyBnZXRSZWN0IH0gZnJvbSAnLi4vdHlwZXMvUmVjdCc7XG5pbXBvcnQgeyB0cmlnZ2VyRXZlbnQgfSBmcm9tICcuLi91dGlscy9ldmVudEhhbmRsZXInO1xuaW1wb3J0IGdldE9mZnNldFRvQmVJblJlY3QgZnJvbSAnLi4vdXRpbHMvZ2V0T2Zmc2V0VG9CZUluUmVjdCc7XG5pbXBvcnQgeyByZXR1cm5GYWxzZSwgcmV0dXJuVHJ1ZSB9IGZyb20gJy4uL3V0aWxzL3JldHVyblRydWVGYWxzZSc7XG5pbXBvcnQgQWxpZ25tZW50IGZyb20gJy4uL3ZhbHVlcy9hbGlnbm1lbnQnO1xuaW1wb3J0IEFsaWduVG8sIHsgQWxpZ25Ub1BhcmVudCB9IGZyb20gJy4uL3ZhbHVlcy9hbGlnblRvJztcbmltcG9ydCBBdHRyaWJ1dGUgZnJvbSAnLi4vdmFsdWVzL2F0dHJpYnV0ZSc7XG5pbXBvcnQgQ3Jvc3NQcmV2ZW50IGZyb20gJy4uL3ZhbHVlcy9jcm9zc1ByZXZlbnQnO1xuaW1wb3J0IEV2ZW50IGZyb20gJy4uL3ZhbHVlcy9ldmVudCc7XG5pbXBvcnQgeyBPbkp1ZGdlQXR0cmFjdGlvbiB9IGZyb20gJy4vanVkZ2VBdHRyYWN0aW9uJztcbmltcG9ydCB7IE9uSnVkZ2VEaXN0YW5jZSB9IGZyb20gJy4vanVkZ2VEaXN0YW5jZSc7XG5pbXBvcnQgeyBPbkp1ZGdlRGlzdGFuY2VJblBhcmVudCB9IGZyb20gJy4vanVkZ2VEaXN0YW5jZUluUGFyZW50JztcbmltcG9ydCB7IE9uSnVkZ2VNb3ZlbWVudCB9IGZyb20gJy4vanVkZ2VNb3ZlbWVudCc7XG5pbXBvcnQgbXVsdGlBdHRyYWN0aW9uc1RvIGZyb20gJy4vbXVsdGlBdHRyYWN0aW9uc1RvJztcbmltcG9ydCBzaW5nbGVBdHRyYWN0aW9uVG8gZnJvbSAnLi9zaW5nbGVBdHRyYWN0aW9uVG8nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF0dHJhY3Rpb25SZXN1bHRPZlBvc2l0aW9uT3B0aW9ucyB7XG4gIGlnbm9yZUV2ZW50PzogYm9vbGVhbjtcbiAgdW5hdHRyYWN0YWJsZT86IGJvb2xlYW47XG4gIGF0dHJhY3REaXN0YW5jZT86IG51bWJlcjtcbiAgYWxpZ25Ub3M/OiBBbGlnblRvW107XG4gIGFsaWdubWVudHM/OiBBbGlnbm1lbnRbXTtcbiAgYWxpZ25Ub1BhcmVudHM/OiBBbGlnblRvUGFyZW50W107XG4gIGNyb3NzUHJldmVudHM/OiBDcm9zc1ByZXZlbnRbXTtcbiAgcGFyZW50UGFjaz86IFBhY2s7XG4gIGxhc3RBdHRyYWN0aW9uQmVzdD86IEF0dHJhY3Rpb25CZXN0IHwgbnVsbDtcbiAgb25KdWRnZURpc3RhbmNlPzogT25KdWRnZURpc3RhbmNlO1xuICBvbkp1ZGdlRGlzdGFuY2VJblBhcmVudD86IE9uSnVkZ2VEaXN0YW5jZUluUGFyZW50O1xuICBvbkp1ZGdlQXR0cmFjdGlvbj86IE9uSnVkZ2VBdHRyYWN0aW9uO1xuICBvbkp1ZGdlTW92ZW1lbnQ/OiBPbkp1ZGdlTW92ZW1lbnQ7XG59XG5cbmludGVyZmFjZSBBdHRyYWN0aW9uUmVzdWx0T2ZQb3NpdGlvblJlc3VsdCB7XG4gIHBvc2l0aW9uOiBET01Qb2ludCB8IG51bGw7XG4gIGF0dHJhY3Rpb25CZXN0OiBBdHRyYWN0aW9uQmVzdCB8IG51bGw7XG59XG5cbmZ1bmN0aW9uIGF0dHJhY3Rpb25SZXN1bHRPZlBvc2l0aW9uKFxuICBzb3VyY2VQYWNrOiBQYWNrLFxuICB0YXJnZXRQYWNrczogUGFja1tdLFxuICBvcHRpb25zOiBBdHRyYWN0aW9uUmVzdWx0T2ZQb3NpdGlvbk9wdGlvbnMgPSB7fSxcbik6IEF0dHJhY3Rpb25SZXN1bHRPZlBvc2l0aW9uUmVzdWx0IHtcbiAgY29uc3Qgc291cmNlUmF3ID0gc291cmNlUGFjay5yYXcgYXMgSFRNTEVsZW1lbnQ7XG4gIGNvbnN0IHtcbiAgICBpZ25vcmVFdmVudCA9ICEoc291cmNlUmF3IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpLFxuICAgIGFsaWduVG9QYXJlbnRzID0gZGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1tBdHRyaWJ1dGUuYWxpZ25Ub1BhcmVudF0sXG4gICAgY3Jvc3NQcmV2ZW50cyA9IGRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXNbQXR0cmlidXRlLmNyb3NzUHJldmVudF0sXG4gICAgcGFyZW50UGFjayxcbiAgICBsYXN0QXR0cmFjdGlvbkJlc3QsXG4gICAgb25KdWRnZU1vdmVtZW50ID0gcmV0dXJuVHJ1ZSxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGxhc3RCZXN0WCA9IGxhc3RBdHRyYWN0aW9uQmVzdD8ueDtcbiAgY29uc3QgbGFzdEJlc3RZID0gbGFzdEF0dHJhY3Rpb25CZXN0Py55O1xuICBjb25zdCBwYXJlbnRBbGlnbm1lbnRzID0gTWFnbmV0LmdldEFsaWdubWVudHNGcm9tQWxpZ25UbyhhbGlnblRvUGFyZW50cyk7XG4gIGNvbnN0IGFsaWduVG9QYXJlbnQgPSBwYXJlbnRBbGlnbm1lbnRzLmxlbmd0aCA+IDA7XG4gIGNvbnN0IGNyb3NzUHJldmVudFBhcmVudCA9IGNyb3NzUHJldmVudHMuaW5jbHVkZXMoQ3Jvc3NQcmV2ZW50LnBhcmVudCk7XG4gIGNvbnN0IGtlZXBJblBhcmVudCA9IGNyb3NzUHJldmVudFBhcmVudCAmJiBwYXJlbnRQYWNrO1xuICBjb25zdCBzb3VyY2VSZWN0ID0gZ2V0UmVjdChzb3VyY2VQYWNrKTtcbiAgY29uc3Qge1xuICAgIHdpZHRoOiBzb3VyY2VXaWR0aCxcbiAgICBoZWlnaHQ6IHNvdXJjZUhlaWdodCxcbiAgfSA9IHNvdXJjZVJlY3Q7XG4gIGNvbnN0IHBhcmVudFJlY3QgPSBnZXRSZWN0KFxuICAgIHBhcmVudFBhY2tcbiAgICA/PyBzb3VyY2VSZWN0LCAvLyBoYWNrIGZvciB0c2xpbnQgYmVjYXVzZSBgcGFyZW50UmVjdGAgd291bGQgYmUgbmVlZGxlc3NcbiAgKTtcblxuICAvKipcbiAgICogTmVlZCB0byBjb25zaWRlciB0aGUgZHJhZ2dpbmcgZm9yY2Ugd2hlbiB0aGUgbWFnbmV0IGlzIHByZXZlbnRlZFxuICAgKiBmcm9tIGNyb3NzaW5nIHBhcmVudCBlbGVtZW50LiBUaGUgYXR0cmFjdGlvbiBvZiB0aGUgbmVhciBtYWduZXRzXG4gICAqIHNob3VsZCBiZSBpZ25vcmVkIGlmIHRoZSBmb3JjZSBpcyBncmVhdGVyIHRoYW4gdGhlIGF0dHJhY3RpbmdcbiAgICogZGlzdGFuY2VzLlxuICAgKi9cbiAgY29uc3Qgc291cmNlUmF3UmVjdCA9IHNvdXJjZVJlY3Q7XG4gIGNvbnN0IHNvdXJjZUluUGFyZW50T2Zmc2V0ID0gKGtlZXBJblBhcmVudFxuICAgID8gZ2V0T2Zmc2V0VG9CZUluUmVjdChzb3VyY2VSYXdSZWN0LCBwYXJlbnRSZWN0KVxuICAgIDogY3JlYXRlUG9pbnQoMCwgMClcbiAgKTtcbiAgY29uc3Qgc291cmNlSW5QYXJlbnRSZWN0ID0gY3JlYXRlUmVjdChcbiAgICBzb3VyY2VSYXdSZWN0LnggKyBzb3VyY2VJblBhcmVudE9mZnNldC54LFxuICAgIHNvdXJjZVJhd1JlY3QueSArIHNvdXJjZUluUGFyZW50T2Zmc2V0LnksXG4gICAgc291cmNlV2lkdGgsXG4gICAgc291cmNlSGVpZ2h0LFxuICApO1xuICBjb25zdCBzb3VyY2VJblBhcmVudFBhY2sgPSBuZXcgUGFjayhzb3VyY2VSYXcsIHNvdXJjZUluUGFyZW50UmVjdCk7XG4gIGNvbnN0IHBhc3NKdWRnZU1vdmVtZW50ID0gb25KdWRnZU1vdmVtZW50KHNvdXJjZUluUGFyZW50UGFjayk7XG5cbiAgLyoqXG4gICAqIFJlY29yZHMgZm9yIHRob3NlIHRhcmdldHMgbmVlZCB0byBkaXNwYXRjaCBldmVudC5cbiAgICovXG4gIGNvbnN0IGF0dHJhY3RSZXN1bHRzOiBEaXN0YW5jZVtdID0gW107XG4gIGNvbnN0IHVuYXR0cmFjdFJlc3VsdHM6IERpc3RhbmNlW10gPSBbXTtcbiAgY29uc3QgYXR0cmFjdG1vdmVSZXN1bHRzOiBEaXN0YW5jZVtdID0gW107XG5cbiAgY29uc3QgZGlzcGF0Y2hBdHRyYWN0RXZlbnRzID0gKHNvdXJjZU5leHRSZWN0OiBET01SZWN0KSA9PiB7XG4gICAgaWYgKGlnbm9yZUV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXR0cmFjdFJlc3VsdHMuZm9yRWFjaCgoYXR0cmFjdFJlc3VsdCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0UGFjayA9IGF0dHJhY3RSZXN1bHQudGFyZ2V0O1xuICAgICAgY29uc3QgdGFyZ2V0RWxlbSA9IHRhcmdldFBhY2sucmF3IGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3QgYXR0cmFjdGVkRXZlbnREZXRhaWw6IEF0dHJhY3RlZEV2ZW50RGV0YWlsID0ge1xuICAgICAgICBzb3VyY2U6IHNvdXJjZUluUGFyZW50UGFjayxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXRQYWNrLFxuICAgICAgICBzb3VyY2VOZXh0UmVjdCxcbiAgICAgICAgZGlzdGFuY2U6IGF0dHJhY3RSZXN1bHQsXG4gICAgICB9O1xuXG4gICAgICB0cmlnZ2VyRXZlbnQ8QXR0cmFjdGVkRXZlbnREZXRhaWw+KFxuICAgICAgICB0YXJnZXRFbGVtLFxuICAgICAgICBFdmVudC5hdHRyYWN0ZWQsXG4gICAgICAgIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDogYXR0cmFjdGVkRXZlbnREZXRhaWwsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0pO1xuICB9O1xuICBjb25zdCBkaXNwYXRjaFVuYXR0cmFjdEV2ZW50cyA9IChzb3VyY2VOZXh0UmVjdDogRE9NUmVjdCkgPT4ge1xuICAgIGlmIChpZ25vcmVFdmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHVuYXR0cmFjdFJlc3VsdHMuZm9yRWFjaCgodW5hdHRyYWN0UmVzdWx0KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXRQYWNrID0gdW5hdHRyYWN0UmVzdWx0LnRhcmdldDtcbiAgICAgIGNvbnN0IHRhcmdldEVsZW0gPSB0YXJnZXRQYWNrLnJhdyBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGNvbnN0IHVuYXR0cmFjdGVkRXZlbnREZXRhaWw6IFVuYXR0cmFjdGVkRXZlbnREZXRhaWwgPSB7XG4gICAgICAgIHNvdXJjZTogc291cmNlSW5QYXJlbnRQYWNrLFxuICAgICAgICB0YXJnZXQ6IHRhcmdldFBhY2ssXG4gICAgICAgIHNvdXJjZU5leHRSZWN0LFxuICAgICAgfTtcblxuICAgICAgdHJpZ2dlckV2ZW50PFVuYXR0cmFjdGVkRXZlbnREZXRhaWw+KFxuICAgICAgICB0YXJnZXRFbGVtLFxuICAgICAgICBFdmVudC51bmF0dHJhY3RlZCxcbiAgICAgICAge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiB1bmF0dHJhY3RlZEV2ZW50RGV0YWlsLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9KTtcbiAgfTtcbiAgY29uc3QgZGlzcGF0Y2hBdHRyYWN0bW92ZUV2ZW50cyA9IChzb3VyY2VOZXh0UmVjdDogRE9NUmVjdCkgPT4ge1xuICAgIGlmIChpZ25vcmVFdmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF0dHJhY3Rtb3ZlUmVzdWx0cy5mb3JFYWNoKChhdHRyYWN0bW92ZVJlc3VsdCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0UGFjayA9IGF0dHJhY3Rtb3ZlUmVzdWx0LnRhcmdldDtcbiAgICAgIGNvbnN0IHRhcmdldEVsZW0gPSB0YXJnZXRQYWNrLnJhdyBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGNvbnN0IGF0dHJhY3RlZG1vdmVFdmVudERldGFpbDogQXR0cmFjdGVkbW92ZUV2ZW50RGV0YWlsID0ge1xuICAgICAgICBzb3VyY2U6IHNvdXJjZUluUGFyZW50UGFjayxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXRQYWNrLFxuICAgICAgICBzb3VyY2VOZXh0UmVjdCxcbiAgICAgICAgZGlzdGFuY2U6IGF0dHJhY3Rtb3ZlUmVzdWx0LFxuICAgICAgfTtcblxuICAgICAgdHJpZ2dlckV2ZW50PEF0dHJhY3RlZG1vdmVFdmVudERldGFpbD4oXG4gICAgICAgIHRhcmdldEVsZW0sXG4gICAgICAgIEV2ZW50LmF0dHJhY3RlZG1vdmUsXG4gICAgICAgIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDogYXR0cmFjdGVkbW92ZUV2ZW50RGV0YWlsLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9KTtcbiAgfTtcblxuICBpZiAoIXBhc3NKdWRnZU1vdmVtZW50KSB7XG4gICAgaWYgKGxhc3RCZXN0WCkge1xuICAgICAgdW5hdHRyYWN0UmVzdWx0cy5wdXNoKGxhc3RCZXN0WCk7XG4gICAgfVxuICAgIGlmIChsYXN0QmVzdFkpIHtcbiAgICAgIHVuYXR0cmFjdFJlc3VsdHMucHVzaChsYXN0QmVzdFkpO1xuICAgIH1cblxuICAgIGRpc3BhdGNoVW5hdHRyYWN0RXZlbnRzKHNvdXJjZUluUGFyZW50UmVjdCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcG9zaXRpb246IG51bGwsXG4gICAgICBhdHRyYWN0aW9uQmVzdDogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZHMgYmVzdCBhdHRyYWN0aW9uIHJlc3VsdCBpZiBtYWduZXQgYWxpZ25zIHRvIHBhcmVudC5cbiAgICovXG4gIGNvbnN0IGF0dHJhY3Rpb25CZXN0OiBBdHRyYWN0aW9uQmVzdCA9IHt9O1xuXG4gIGNvbnN0IHtcbiAgICB1bmF0dHJhY3RhYmxlID0gZGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1tBdHRyaWJ1dGUudW5hdHRyYWN0YWJsZV0sXG4gICAgYXR0cmFjdERpc3RhbmNlID0gZGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1tBdHRyaWJ1dGUuYXR0cmFjdERpc3RhbmNlXSxcbiAgICBhbGlnblRvcyA9IGRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXNbQXR0cmlidXRlLmFsaWduVG9dLFxuICAgIGFsaWdubWVudHMgPSBNYWduZXQuZ2V0QWxpZ25tZW50c0Zyb21BbGlnblRvKGFsaWduVG9zKSxcbiAgICBvbkp1ZGdlRGlzdGFuY2VJblBhcmVudCA9IHJldHVyblRydWUsXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBzb3VyY2VSYXdQYWNrID0gbmV3IFBhY2soc291cmNlUmF3LCBzb3VyY2VSYXdSZWN0KTtcbiAgY29uc3Qgb25KdWRnZURpc3RhbmNlID0gKHVuYXR0cmFjdGFibGVcbiAgICA/IHJldHVybkZhbHNlXG4gICAgOiAob3B0aW9ucy5vbkp1ZGdlRGlzdGFuY2UgPz8gcmV0dXJuVHJ1ZSlcbiAgKTtcblxuICBpZiAoYWxpZ25Ub1BhcmVudCAmJiBwYXJlbnRQYWNrKSB7XG4gICAgY29uc3QgeyBiZXN0IH0gPSBzaW5nbGVBdHRyYWN0aW9uVG8oXG4gICAgICBzb3VyY2VSYXdQYWNrLFxuICAgICAgcGFyZW50UGFjayxcbiAgICAgIHtcbiAgICAgICAgYXR0cmFjdERpc3RhbmNlLFxuICAgICAgICBhbGlnblRvcyxcbiAgICAgICAgYWxpZ25tZW50cyxcbiAgICAgICAgb25KdWRnZURpc3RhbmNlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXR0cmFjdGlvbkJlc3QueCA9IGJlc3QueDtcbiAgICBhdHRyYWN0aW9uQmVzdC55ID0gYmVzdC55O1xuICB9XG5cbiAgY29uc3Qgb25KdWRnZU11bHRpRGlzdGFuY2U6IE9uSnVkZ2VEaXN0YW5jZSA9IChrZWVwSW5QYXJlbnRcbiAgICA/ICgoZGlzdGFuY2UpID0+IChcbiAgICAgIG9uSnVkZ2VEaXN0YW5jZUluUGFyZW50KGRpc3RhbmNlLCB7XG4gICAgICAgIGF0dHJhY3REaXN0YW5jZSxcbiAgICAgICAgYWxpZ25Ub3MsXG4gICAgICAgIHBhcmVudDogcGFyZW50UGFjayxcbiAgICAgICAgb25KdWRnZURpc3RhbmNlLFxuICAgICAgfSlcbiAgICApKVxuICAgIDogb25KdWRnZURpc3RhbmNlXG4gICk7XG4gIGNvbnN0IG9uSnVkZ2VBdHRyYWN0aW9uID0gKHVuYXR0cmFjdGFibGVcbiAgICA/IHJldHVybkZhbHNlXG4gICAgOiAob3B0aW9ucy5vbkp1ZGdlQXR0cmFjdGlvbiA/PyByZXR1cm5UcnVlKVxuICApO1xuICBjb25zdCBzb3VyY2VBdHRyYWN0aW9uID0gbXVsdGlBdHRyYWN0aW9uc1RvKFxuICAgIHNvdXJjZVJhd1BhY2ssXG4gICAgdGFyZ2V0UGFja3MsXG4gICAge1xuICAgICAgYXR0cmFjdERpc3RhbmNlLFxuICAgICAgYWxpZ25Ub3MsXG4gICAgICBhbGlnbm1lbnRzLFxuICAgICAgb25KdWRnZURpc3RhbmNlOiBvbkp1ZGdlTXVsdGlEaXN0YW5jZSxcbiAgICAgIG9uSnVkZ2VBdHRyYWN0aW9uLFxuICAgICAgYXR0cmFjdGlvbkJlc3QsXG4gICAgfSxcbiAgKTtcbiAgY29uc3Qgc291cmNlQXR0cmFjdGlvbkJlc3QgPSBzb3VyY2VBdHRyYWN0aW9uLmJlc3Q7XG4gIGNvbnN0IHNvdXJjZUF0dHJhY3Rpb25PZmZzZXQgPSBnZXRBdHRyYWN0aW9uT2Zmc2V0KHNvdXJjZUF0dHJhY3Rpb24pO1xuICBjb25zdCBzb3VyY2VBdHRyYWN0aW9uUmVjdCA9IGNyZWF0ZVJlY3QoXG4gICAgc291cmNlUmF3UmVjdC54ICsgc291cmNlQXR0cmFjdGlvbk9mZnNldC54LFxuICAgIHNvdXJjZVJhd1JlY3QueSArIHNvdXJjZUF0dHJhY3Rpb25PZmZzZXQueSxcbiAgICBzb3VyY2VXaWR0aCxcbiAgICBzb3VyY2VIZWlnaHQsXG4gICk7XG4gIGNvbnN0IHNvdXJjZUF0dHJhY3Rpb25JblBhcmVudE9mZnNldCA9IChrZWVwSW5QYXJlbnRcbiAgICA/IGdldE9mZnNldFRvQmVJblJlY3Qoc291cmNlQXR0cmFjdGlvblJlY3QsIHBhcmVudFJlY3QpXG4gICAgOiBjcmVhdGVQb2ludCgwLCAwKVxuICApO1xuICBjb25zdCBzb3VyY2VBdHRyYWN0aW9uSW5QYXJlbnRSZWN0ID0gY3JlYXRlUmVjdChcbiAgICBzb3VyY2VBdHRyYWN0aW9uUmVjdC54ICsgc291cmNlQXR0cmFjdGlvbkluUGFyZW50T2Zmc2V0LngsXG4gICAgc291cmNlQXR0cmFjdGlvblJlY3QueSArIHNvdXJjZUF0dHJhY3Rpb25JblBhcmVudE9mZnNldC55LFxuICAgIHNvdXJjZVdpZHRoLFxuICAgIHNvdXJjZUhlaWdodCxcbiAgKTtcblxuICBpZiAoIWlnbm9yZUV2ZW50KSB7XG4gICAgY29uc3Qge1xuICAgICAgeDogY3VycmVudEJlc3RYLFxuICAgICAgeTogY3VycmVudEJlc3RZLFxuICAgIH0gPSBzb3VyY2VBdHRyYWN0aW9uQmVzdDtcbiAgICBjb25zdCBsYXN0VGFyZ2V0WCA9IGxhc3RCZXN0WD8udGFyZ2V0O1xuICAgIGNvbnN0IGxhc3RUYXJnZXRZID0gbGFzdEJlc3RZPy50YXJnZXQ7XG4gICAgY29uc3QgY3VycmVudFRhcmdldFggPSBjdXJyZW50QmVzdFg/LnRhcmdldDtcbiAgICBjb25zdCBjdXJyZW50VGFyZ2V0WSA9IGN1cnJlbnRCZXN0WT8udGFyZ2V0O1xuICAgIGNvbnN0IGRpZmZUYXJnZXRYID0gY3VycmVudFRhcmdldFggIT09IGxhc3RUYXJnZXRYO1xuICAgIGNvbnN0IGRpZmZUYXJnZXRZID0gY3VycmVudFRhcmdldFkgIT09IGxhc3RUYXJnZXRZO1xuXG4gICAgLyoqXG4gICAgICogUmVjb3JkcyBhbmQgZGlzcGF0Y2hlcyBldmVudHMgb24geC95IHBhY2tzLlxuICAgICAqL1xuICAgIGlmIChkaWZmVGFyZ2V0WCkge1xuICAgICAgaWYgKGxhc3RUYXJnZXRYKSB7XG4gICAgICAgIHVuYXR0cmFjdFJlc3VsdHMucHVzaChsYXN0QmVzdFgpO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRUYXJnZXRYKSB7XG4gICAgICAgIGF0dHJhY3RSZXN1bHRzLnB1c2goY3VycmVudEJlc3RYKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRUYXJnZXRYKSB7XG4gICAgICBjb25zdCBsYXN0QWxpZ25tZW50WCA9IGxhc3RCZXN0WD8uYWxpZ25tZW50O1xuICAgICAgY29uc3QgY3VycmVudEFsaWdubWVudFggPSBjdXJyZW50QmVzdFguYWxpZ25tZW50O1xuXG4gICAgICBpZiAobGFzdEFsaWdubWVudFggIT09IGN1cnJlbnRBbGlnbm1lbnRYKSB7XG4gICAgICAgIGF0dHJhY3RSZXN1bHRzLnB1c2goY3VycmVudEJlc3RYKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF0dHJhY3Rtb3ZlUmVzdWx0cy5wdXNoKGN1cnJlbnRCZXN0WCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpZmZUYXJnZXRZKSB7XG4gICAgICBpZiAobGFzdFRhcmdldFkpIHtcbiAgICAgICAgdW5hdHRyYWN0UmVzdWx0cy5wdXNoKGxhc3RCZXN0WSk7XG4gICAgICB9XG4gICAgICBpZiAoY3VycmVudFRhcmdldFkpIHtcbiAgICAgICAgYXR0cmFjdFJlc3VsdHMucHVzaChjdXJyZW50QmVzdFkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY3VycmVudFRhcmdldFkpIHtcbiAgICAgIGNvbnN0IGxhc3RBbGlnbm1lbnRZID0gbGFzdEJlc3RZPy5hbGlnbm1lbnQ7XG4gICAgICBjb25zdCBjdXJyZW50QWxpZ25tZW50WSA9IGN1cnJlbnRCZXN0WS5hbGlnbm1lbnQ7XG5cbiAgICAgIGlmIChsYXN0QWxpZ25tZW50WSAhPT0gY3VycmVudEFsaWdubWVudFkpIHtcbiAgICAgICAgYXR0cmFjdFJlc3VsdHMucHVzaChjdXJyZW50QmVzdFkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXR0cmFjdG1vdmVSZXN1bHRzLnB1c2goY3VycmVudEJlc3RZKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHRyYWN0aW9uIGhhcHBlbnMuXG4gICAgICovXG4gICAgaWYgKGF0dHJhY3RSZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGF0dHJhY3RFdmVudERldGFpbDogQXR0cmFjdEV2ZW50RGV0YWlsID0ge1xuICAgICAgICBzb3VyY2U6IHNvdXJjZUluUGFyZW50UGFjayxcbiAgICAgICAgbmV4dFJlY3Q6IHNvdXJjZUF0dHJhY3Rpb25JblBhcmVudFJlY3QsXG4gICAgICAgIGF0dHJhY3Rpb246IHNvdXJjZUF0dHJhY3Rpb24sXG4gICAgICB9O1xuICAgICAgY29uc3QgcGFzc0F0dHJhY3RFdmVudCA9IHRyaWdnZXJFdmVudDxBdHRyYWN0RXZlbnREZXRhaWw+KFxuICAgICAgICBzb3VyY2VSYXcsXG4gICAgICAgIEV2ZW50LmF0dHJhY3QsXG4gICAgICAgIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiBhdHRyYWN0RXZlbnREZXRhaWwsXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICBpZiAoIXBhc3NBdHRyYWN0RXZlbnQpIHtcbiAgICAgICAgaWYgKGxhc3RCZXN0WCkge1xuICAgICAgICAgIHVuYXR0cmFjdFJlc3VsdHMucHVzaChsYXN0QmVzdFgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXN0QmVzdFkpIHtcbiAgICAgICAgICB1bmF0dHJhY3RSZXN1bHRzLnB1c2gobGFzdEJlc3RZKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcG9zaXRpb246IGNyZWF0ZVBvaW50KFxuICAgICAgICAgICAgc291cmNlUmF3UmVjdC54ICsgc291cmNlSW5QYXJlbnRPZmZzZXQueCxcbiAgICAgICAgICAgIHNvdXJjZVJhd1JlY3QueSArIHNvdXJjZUluUGFyZW50T2Zmc2V0LnksXG4gICAgICAgICAgKSxcbiAgICAgICAgICBhdHRyYWN0aW9uQmVzdDogbnVsbCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodW5hdHRyYWN0UmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB1bmF0dHJhY3RFdmVudERldGFpbDogVW5hdHRyYWN0RXZlbnREZXRhaWwgPSB7XG4gICAgICAgIHNvdXJjZTogc291cmNlSW5QYXJlbnRQYWNrLFxuICAgICAgICBuZXh0UmVjdDogc291cmNlQXR0cmFjdGlvbkluUGFyZW50UmVjdCxcbiAgICAgICAgYXR0cmFjdGlvbjogc291cmNlQXR0cmFjdGlvbixcbiAgICAgIH07XG5cbiAgICAgIHRyaWdnZXJFdmVudDxVbmF0dHJhY3RFdmVudERldGFpbD4oXG4gICAgICAgIHNvdXJjZVJhdyxcbiAgICAgICAgRXZlbnQudW5hdHRyYWN0LFxuICAgICAgICB7XG4gICAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgICBkZXRhaWw6IHVuYXR0cmFjdEV2ZW50RGV0YWlsLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYXR0cmFjdG1vdmVSZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGF0dHJhY3Rtb3ZlRXZlbnREZXRhaWw6IEF0dHJhY3Rtb3ZlRXZlbnREZXRhaWwgPSB7XG4gICAgICAgIHNvdXJjZTogc291cmNlSW5QYXJlbnRQYWNrLFxuICAgICAgICBuZXh0UmVjdDogc291cmNlQXR0cmFjdGlvbkluUGFyZW50UmVjdCxcbiAgICAgICAgYXR0cmFjdGlvbjogc291cmNlQXR0cmFjdGlvbixcbiAgICAgIH07XG5cbiAgICAgIHRyaWdnZXJFdmVudDxBdHRyYWN0bW92ZUV2ZW50RGV0YWlsPihcbiAgICAgICAgc291cmNlUmF3LFxuICAgICAgICBFdmVudC5hdHRyYWN0bW92ZSxcbiAgICAgICAge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiBhdHRyYWN0bW92ZUV2ZW50RGV0YWlsLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBkaXNwYXRjaEF0dHJhY3RFdmVudHMoc291cmNlQXR0cmFjdGlvbkluUGFyZW50UmVjdCk7XG4gIGRpc3BhdGNoVW5hdHRyYWN0RXZlbnRzKHNvdXJjZUF0dHJhY3Rpb25JblBhcmVudFJlY3QpO1xuICBkaXNwYXRjaEF0dHJhY3Rtb3ZlRXZlbnRzKHNvdXJjZUF0dHJhY3Rpb25JblBhcmVudFJlY3QpO1xuXG4gIHJldHVybiB7XG4gICAgcG9zaXRpb246IGNyZWF0ZVBvaW50KFxuICAgICAgc291cmNlUmF3UmVjdC54ICsgc291cmNlQXR0cmFjdGlvbk9mZnNldC54ICsgc291cmNlQXR0cmFjdGlvbkluUGFyZW50T2Zmc2V0LngsXG4gICAgICBzb3VyY2VSYXdSZWN0LnkgKyBzb3VyY2VBdHRyYWN0aW9uT2Zmc2V0LnkgKyBzb3VyY2VBdHRyYWN0aW9uSW5QYXJlbnRPZmZzZXQueSxcbiAgICApLFxuICAgIGF0dHJhY3Rpb25CZXN0OiBzb3VyY2VBdHRyYWN0aW9uQmVzdCxcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb247XG4iLCJpbXBvcnQgeyBjcmVhdGVQb2ludCB9IGZyb20gJy4uL3R5cGVzL1BvaW50JztcblxuLyoqXG4gKiBSZXR1cm5zICh4LCB5KSBvZiBtb3VzdC90b3VjaCBldmVudC5cbiAqL1xuZnVuY3Rpb24gZ2V0RXZlbnRYWShldmVudDogUG9pbnRlckV2ZW50KTogRE9NUG9pbnQge1xuICBjb25zdCB7IGNsaWVudFgsIGNsaWVudFkgfSA9IGV2ZW50O1xuXG4gIHJldHVybiBjcmVhdGVQb2ludChjbGllbnRYLCBjbGllbnRZKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0RXZlbnRYWTtcbiIsImltcG9ydCBNYWduZXQgZnJvbSAnLi4vYmxvY2snO1xuaW1wb3J0IGF0dHJhY3Rpb25SZXN1bHRPZlBvc2l0aW9uIGZyb20gJy4uL21ldGhvZHMvYXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb24nO1xuaW1wb3J0IHsgT25KdWRnZU1vdmVtZW50IH0gZnJvbSAnLi4vbWV0aG9kcy9qdWRnZU1vdmVtZW50JztcbmltcG9ydCB7IE1vdmVFdmVudERldGFpbCwgU3RhcnRFdmVudERldGFpbCB9IGZyb20gJy4uL3R5cGVzL0V2ZW50RGV0YWlsJztcbmltcG9ydCBQYWNrIGZyb20gJy4uL3R5cGVzL1BhY2snO1xuaW1wb3J0IGNyZWF0ZVBvaW50IGZyb20gJy4uL3R5cGVzL1BvaW50JztcbmltcG9ydCBjcmVhdGVSZWN0IGZyb20gJy4uL3R5cGVzL1JlY3QnO1xuaW1wb3J0IEF0dHJpYnV0ZSBmcm9tICcuLi92YWx1ZXMvYXR0cmlidXRlJztcbmltcG9ydCBFdmVudCBmcm9tICcuLi92YWx1ZXMvZXZlbnQnO1xuaW1wb3J0IHsgYWRkRXZlbnRMaXN0ZW5lcnMsIHJlbW92ZUV2ZW50TGlzdGVuZXJzLCB0cmlnZ2VyRXZlbnQgfSBmcm9tICcuL2V2ZW50SGFuZGxlcic7XG5pbXBvcnQgZ2V0RXZlbnRYWSBmcm9tICcuL2dldEV2ZW50WFknO1xuXG5jb25zdCBFVkVOVF9EUkFHX1NUQVJUID0gWydwb2ludGVyZG93biddO1xuY29uc3QgRVZFTlRfRFJBR19NT1ZFID0gWydwb2ludGVybW92ZSddO1xuY29uc3QgRVZFTlRfRFJBR19FTkQgPSBbJ3BvaW50ZXJ1cCddO1xuXG4vKipcbiAqIFJlc2V0cyBtYWduZXQgY2FjaGVzLlxuICovXG5mdW5jdGlvbiByZXNldE1hZ25ldENhY2hlcyhtYWduZXQ6IE1hZ25ldCk6IHZvaWQge1xuICBtYWduZXQucmVzZXRNYWduZXRSZWN0KCk7XG4gIG1hZ25ldC5yZXNldFBhcmVudFBhY2soKTtcbiAgbWFnbmV0LnJlc2V0VGFyZ2V0TWFnbmV0UGFja3MoKTtcbn1cblxuLyoqXG4gKiBFdmVudCBsaXN0ZW5lciBvZiBkcmFnIG1vdmUgZXZlbnQuXG4gKi9cbmZ1bmN0aW9uIG1vdmVMaXN0ZW5lcihcbiAgdGhpczogTWFnbmV0LFxuICBzdGFydFBvaW50OiBET01Qb2ludCxcbiAgc3RhcnRMYXN0T2Zmc2V0OiBET01Qb2ludCxcbiAgbW92ZVBvaW50OiBET01Qb2ludCxcbik6IERPTVBvaW50IHtcbiAgY29uc3Qge1xuICAgIG1hZ25ldFJlY3Q6IHNvdXJjZVJlY3QsXG4gICAgdGFyZ2V0TWFnbmV0UGFja3M6IHRhcmdldFBhY2tzLFxuICAgIGp1ZGdlTWFnbmV0TW92ZW1lbnQsXG4gIH0gPSB0aGlzO1xuICBjb25zdCBvbkp1ZGdlTW92ZW1lbnQ6IE9uSnVkZ2VNb3ZlbWVudCA9IChuZXh0U291cmNlUGFjaykgPT4ge1xuICAgIGlmICghanVkZ2VNYWduZXRNb3ZlbWVudChuZXh0U291cmNlUGFjaykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBtb3ZlRXZlbnREZXRhaWw6IE1vdmVFdmVudERldGFpbCA9IHtcbiAgICAgIHNvdXJjZTogbmV4dFNvdXJjZVBhY2ssXG4gICAgICB0YXJnZXRzOiB0YXJnZXRQYWNrcyxcbiAgICAgIHN0YXJ0UG9pbnQ6IGNyZWF0ZVBvaW50KHN0YXJ0UG9pbnQpLFxuICAgICAgbW92ZVBvaW50OiBjcmVhdGVQb2ludChtb3ZlUG9pbnQpLFxuICAgIH07XG4gICAgY29uc3QgcGFzc01vdmVFdmVudCA9IHRyaWdnZXJFdmVudDxNb3ZlRXZlbnREZXRhaWw+KFxuICAgICAgdGhpcyxcbiAgICAgIEV2ZW50Lm1hZ25ldG1vdmUsXG4gICAgICB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IG1vdmVFdmVudERldGFpbCxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJldHVybiBwYXNzTW92ZUV2ZW50O1xuICB9O1xuICBjb25zdCB7IHBvc2l0aW9uLCBhdHRyYWN0aW9uQmVzdCB9ID0gYXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb24oXG4gICAgbmV3IFBhY2sodGhpcywgY3JlYXRlUmVjdChcbiAgICAgIHNvdXJjZVJlY3QueCArIG1vdmVQb2ludC54IC0gc3RhcnRQb2ludC54LFxuICAgICAgc291cmNlUmVjdC55ICsgbW92ZVBvaW50LnkgLSBzdGFydFBvaW50LnksXG4gICAgICBzb3VyY2VSZWN0LndpZHRoLFxuICAgICAgc291cmNlUmVjdC5oZWlnaHQsXG4gICAgKSksXG4gICAgdGFyZ2V0UGFja3MsXG4gICAge1xuICAgICAgdW5hdHRyYWN0YWJsZTogdGhpcy51bmF0dHJhY3RhYmxlLFxuICAgICAgYXR0cmFjdERpc3RhbmNlOiB0aGlzLmF0dHJhY3REaXN0YW5jZSxcbiAgICAgIGFsaWduVG9zOiB0aGlzLmFsaWduVG9zLFxuICAgICAgYWxpZ25Ub1BhcmVudHM6IHRoaXMuYWxpZ25Ub1BhcmVudHMsXG4gICAgICBjcm9zc1ByZXZlbnRzOiB0aGlzLmNyb3NzUHJldmVudHMsXG4gICAgICBwYXJlbnRQYWNrOiB0aGlzLnBhcmVudFBhY2ssXG4gICAgICBsYXN0QXR0cmFjdGlvbkJlc3Q6IHRoaXMubGFzdEF0dHJhY3Rpb25CZXN0LFxuICAgICAgb25KdWRnZURpc3RhbmNlOiB0aGlzLmp1ZGdlTWFnbmV0RGlzdGFuY2UsXG4gICAgICBvbkp1ZGdlRGlzdGFuY2VJblBhcmVudDogdGhpcy5qdWRnZU1hZ25ldERpc3RhbmNlSW5QYXJlbnQsXG4gICAgICBvbkp1ZGdlQXR0cmFjdGlvbjogdGhpcy5qdWRnZU1hZ25ldEF0dHJhY3Rpb24sXG4gICAgICBvbkp1ZGdlTW92ZW1lbnQsXG4gICAgfSxcbiAgKTtcbiAgdGhpcy5zZXRNYWduZXRPZmZzZXQoXG4gICAgKHBvc2l0aW9uPy54ID8/IHNvdXJjZVJlY3QueCkgLSBzb3VyY2VSZWN0LnggKyBzdGFydExhc3RPZmZzZXQueCxcbiAgICAocG9zaXRpb24/LnkgPz8gc291cmNlUmVjdC55KSAtIHNvdXJjZVJlY3QueSArIHN0YXJ0TGFzdE9mZnNldC55LFxuICApO1xuICB0aGlzLmxhc3RBdHRyYWN0aW9uQmVzdCA9IGF0dHJhY3Rpb25CZXN0O1xuXG4gIHJldHVybiBtb3ZlUG9pbnQ7XG59XG5cbi8qKlxuICogRXZlbnQgbGlzdGVuZXIgb2YgZHJhZyBzdGFydCBldmVudC5cbiAqL1xuZnVuY3Rpb24gc3RhcnRMaXN0ZW5lcihcbiAgdGhpczogTWFnbmV0LFxuICBldmVudDogUG9pbnRlckV2ZW50LFxuKTogdm9pZCB7XG4gIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMudW5tb3ZhYmxlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc3RhcnRQb2ludCA9IGdldEV2ZW50WFkoZXZlbnQpO1xuXG4gIHRoaXMuaXNNb3ZpbmcgPSBmYWxzZTtcbiAgcmVzZXRNYWduZXRDYWNoZXModGhpcyk7XG5cbiAgY29uc3Qge1xuICAgIG1hZ25ldFJlY3Q6IHNvdXJjZVJlY3QsXG4gICAgdGFyZ2V0TWFnbmV0UGFja3M6IHRhcmdldFBhY2tzLFxuICB9ID0gdGhpcztcbiAgY29uc3Qgc291cmNlUGFjayA9IG5ldyBQYWNrKHRoaXMsIHNvdXJjZVJlY3QpO1xuICBjb25zdCBzdGFydEV2ZW50RGV0YWlsOiBTdGFydEV2ZW50RGV0YWlsID0ge1xuICAgIHNvdXJjZTogc291cmNlUGFjayxcbiAgICB0YXJnZXRzOiB0YXJnZXRQYWNrcyxcbiAgICBzdGFydFBvaW50OiBjcmVhdGVQb2ludChzdGFydFBvaW50KSxcbiAgfTtcbiAgY29uc3QgcGFzc1N0YXJ0RXZlbnQgPSB0cmlnZ2VyRXZlbnQ8U3RhcnRFdmVudERldGFpbD4oXG4gICAgdGhpcyxcbiAgICBFdmVudC5tYWduZXRzdGFydCxcbiAgICB7XG4gICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgZGV0YWlsOiBzdGFydEV2ZW50RGV0YWlsLFxuICAgIH0sXG4gICk7XG5cbiAgaWYgKCFwYXNzU3RhcnRFdmVudCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBsYXN0TW92ZVBvaW50OiBET01Qb2ludCA9IHN0YXJ0UG9pbnQ7XG4gIGNvbnN0IGRyYWdNb3ZlSGFuZGxlciA9IG1vdmVMaXN0ZW5lci5iaW5kKHRoaXMsIHN0YXJ0UG9pbnQsIHRoaXMubGFzdE9mZnNldCk7XG4gIGNvbnN0IGRyYWdNb3ZlTGlzdGVuZXIgPSAoZXZ0OiBQb2ludGVyRXZlbnQpID0+IHtcbiAgICBjb25zdCBtb3ZlUG9pbnQgPSBnZXRFdmVudFhZKGV2dCk7XG5cbiAgICBsYXN0TW92ZVBvaW50ID0gZHJhZ01vdmVIYW5kbGVyKG1vdmVQb2ludCk7XG4gIH07XG4gIGNvbnN0IGF0dHJpYnV0ZU9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xuICAgIGRyYWdNb3ZlSGFuZGxlcihsYXN0TW92ZVBvaW50KTtcbiAgfSk7XG4gIGNvbnN0IGRyYWdFbmRMaXN0ZW5lciA9ICgpID0+IHtcbiAgICB0aGlzLmlzTW92aW5nID0gZmFsc2U7XG4gICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnei1pbmRleCcpO1xuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKGRvY3VtZW50LCBFVkVOVF9EUkFHX01PVkUsIGRyYWdNb3ZlTGlzdGVuZXIpO1xuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKGRvY3VtZW50LCBFVkVOVF9EUkFHX0VORCwgZHJhZ0VuZExpc3RlbmVyKTtcbiAgICBhdHRyaWJ1dGVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgcmVzZXRNYWduZXRDYWNoZXModGhpcyk7XG4gICAgdHJpZ2dlckV2ZW50KHRoaXMsIEV2ZW50Lm1hZ25ldGVuZCwge1xuICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgfSk7XG4gIH07XG5cbiAgdGhpcy5pc01vdmluZyA9IHRydWU7XG4gIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJ3otaW5kZXgnLCBgJHtEYXRlLm5vdygpfWApO1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICBhZGRFdmVudExpc3RlbmVycyhkb2N1bWVudCwgRVZFTlRfRFJBR19NT1ZFLCBkcmFnTW92ZUxpc3RlbmVyKTtcbiAgYWRkRXZlbnRMaXN0ZW5lcnMoZG9jdW1lbnQsIEVWRU5UX0RSQUdfRU5ELCBkcmFnRW5kTGlzdGVuZXIpO1xuICBhdHRyaWJ1dGVPYnNlcnZlci5vYnNlcnZlKHRoaXMsIHtcbiAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgIGF0dHJpYnV0ZUZpbHRlcjogT2JqZWN0LnZhbHVlcyhBdHRyaWJ1dGUpLFxuICB9KTtcbiAgZHJhZ01vdmVIYW5kbGVyKGxhc3RNb3ZlUG9pbnQpO1xufVxuXG4vKipcbiAqIEFkZHMgYmFzaWMgZHJhZyBldmVudCBsaXN0ZW5lcnMgb2YgbWFnbmV0LlxuICovXG5mdW5jdGlvbiBhZGRCYXNpY0RyYWdMaXN0ZW5lcnMobWFnbmV0OiBNYWduZXQpOiB2b2lkIHtcbiAgYWRkRXZlbnRMaXN0ZW5lcnMobWFnbmV0LCBFVkVOVF9EUkFHX1NUQVJULCBzdGFydExpc3RlbmVyKTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGJhc2ljIGRyYWcgZXZlbnQgbGlzdGVuZXJzIG9mIG1hZ25ldC5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQmFzaWNEcmFnTGlzdGVuZXJzKG1hZ25ldDogTWFnbmV0KTogdm9pZCB7XG4gIHJlbW92ZUV2ZW50TGlzdGVuZXJzKG1hZ25ldCwgRVZFTlRfRFJBR19TVEFSVCwgc3RhcnRMaXN0ZW5lcik7XG59XG5cbi8qKlxuICogQWRkcyBvciByZW1vdmVzIGRyYWcgZXZlbnQgbGlzdGVuZXJzIG9mIG1hZ25ldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrRHJhZ0xpc3RlbmVycyhtYWduZXQ6IE1hZ25ldCk6IHZvaWQge1xuICBpZiAobWFnbmV0LmRpc2FibGVkIHx8IG1hZ25ldC51bm1vdmFibGUpIHtcbiAgICByZW1vdmVCYXNpY0RyYWdMaXN0ZW5lcnMobWFnbmV0KTtcbiAgfSBlbHNlIHtcbiAgICBhZGRCYXNpY0RyYWdMaXN0ZW5lcnMobWFnbmV0KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBzdGFydExpc3RlbmVyO1xuIiwiZW51bSBTdHlsZSB7XG4gIG9mZnNldFggPSAnLS1vZmZzZXQteCcsXG4gIG9mZnNldFkgPSAnLS1vZmZzZXQteScsXG59XG5cbmV4cG9ydCBkZWZhdWx0IFN0eWxlO1xuIiwiaW1wb3J0IE1hZ25ldFBhY2sgZnJvbSAnLi9jb3JlJztcbmltcG9ydCBkaXN0YW5jZVRvIGZyb20gJy4vbWV0aG9kcy9kaXN0YW5jZVRvJztcbmltcG9ydCByYXdEaXN0YW5jZVRvIGZyb20gJy4vbWV0aG9kcy9yYXdEaXN0YW5jZVRvJztcbmltcG9ydCBtdWx0aUF0dHJhY3Rpb25zVG8sIHsgTXVsdGlBdHRyYWN0aW9uc1RvT3B0aW9ucyB9IGZyb20gJy4vbWV0aG9kcy9tdWx0aUF0dHJhY3Rpb25zVG8nO1xuaW1wb3J0IHNpbmdsZUF0dHJhY3Rpb25UbywgeyBTaW5nbGVBdHRyYWN0aW9uVG9PcHRpb25zIH0gZnJvbSAnLi9tZXRob2RzL3NpbmdsZUF0dHJhY3Rpb25Ubyc7XG5pbXBvcnQganVkZ2VBdHRyYWN0aW9uIGZyb20gJy4vbWV0aG9kcy9qdWRnZUF0dHJhY3Rpb24nO1xuaW1wb3J0IGp1ZGdlRGlzdGFuY2UgZnJvbSAnLi9tZXRob2RzL2p1ZGdlRGlzdGFuY2UnO1xuaW1wb3J0IGp1ZGdlRGlzdGFuY2VJblBhcmVudCBmcm9tICcuL21ldGhvZHMvanVkZ2VEaXN0YW5jZUluUGFyZW50JztcbmltcG9ydCBqdWRnZU1vdmVtZW50IGZyb20gJy4vbWV0aG9kcy9qdWRnZU1vdmVtZW50JztcbmltcG9ydCB7IEF0dHJhY3Rpb25CZXN0IH0gZnJvbSAnLi90eXBlcy9BdHRyYWN0aW9uJztcbmltcG9ydCBQYWNrLCB7IGdldFBhY2ssIFJlY3RhYmxlIH0gZnJvbSAnLi90eXBlcy9QYWNrJztcbmltcG9ydCBjcmVhdGVQb2ludCBmcm9tICcuL3R5cGVzL1BvaW50JztcbmltcG9ydCBjcmVhdGVSZWN0LCB7IGdldFJlY3QgfSBmcm9tICcuL3R5cGVzL1JlY3QnO1xuaW1wb3J0IHsgY2hlY2tEcmFnTGlzdGVuZXJzIH0gZnJvbSAnLi91dGlscy9kcmFnTGlzdGVuZXInO1xuaW1wb3J0IHJlZ2lzdGVyRWxlbWVudCBmcm9tICcuL3V0aWxzL3JlZ2lzdGVyRWxlbWVudCc7XG5pbXBvcnQgQWxpZ25tZW50IGZyb20gJy4vdmFsdWVzL2FsaWdubWVudCc7XG5pbXBvcnQgQXR0cmlidXRlIGZyb20gJy4vdmFsdWVzL2F0dHJpYnV0ZSc7XG5pbXBvcnQgT2Zmc2V0VW5pdCBmcm9tICcuL3ZhbHVlcy9vZmZzZXRVbml0JztcbmltcG9ydCBTdHlsZSBmcm9tICcuL3ZhbHVlcy9zdHlsZSc7XG5pbXBvcnQgeyBBbGlnblRvUGFyZW50IH0gZnJvbSAnLi92YWx1ZXMvYWxpZ25Ubyc7XG5pbXBvcnQgYXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb24sIHsgQXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb25PcHRpb25zIH0gZnJvbSAnLi9tZXRob2RzL2F0dHJhY3Rpb25SZXN1bHRPZlBvc2l0aW9uJztcblxuY29uc3Qgbm9kZU5hbWUgPSAnbWFnbmV0LWJsb2NrJztcbmNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcblxudGVtcGxhdGUuaW5uZXJIVE1MID0gYFxuICA8c3R5bGU+XG4gICAgOmhvc3Qge1xuICAgICAgLS14OiB2YXIoJHtTdHlsZS5vZmZzZXRYfSwgMCk7XG4gICAgICAtLXk6IHZhcigke1N0eWxlLm9mZnNldFl9LCAwKTtcblxuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUodmFyKC0teCksIHZhcigtLXkpKTtcbiAgICAgIHRvdWNoLWFjdGlvbjogbm9uZTtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB9XG4gIDwvc3R5bGU+XG4gIDxzbG90PlxuICA8L3Nsb3Q+XG5gO1xuXG5jbGFzcyBNYWduZXQgZXh0ZW5kcyBNYWduZXRQYWNrIHtcbiAgcHJvdGVjdGVkIHJlY3RDYWNoZTogRE9NUmVjdCB8IG51bGwgPSBudWxsO1xuXG4gIHByb3RlY3RlZCBwYXJlbnRQYWNrQ2FjaGU6IFBhY2sgfCBudWxsID0gbnVsbDtcblxuICBwcm90ZWN0ZWQgdGFyZ2V0TWFnbmV0UGFja3NDYWNoZTogUGFja1tdIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJvdGVjdGVkIGlzTW92aW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIGxhc3RPZmZzZXQ6IERPTVBvaW50ID0gY3JlYXRlUG9pbnQoMCwgMCk7XG5cbiAgcHJvdGVjdGVkIGxhc3RBdHRyYWN0aW9uQmVzdDogQXR0cmFjdGlvbkJlc3QgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgKHRoaXMuc2hhZG93Um9vdCBhcyBTaGFkb3dSb290KS5hcHBlbmQodGVtcGxhdGUuY29udGVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuICAgIGNoZWNrRHJhZ0xpc3RlbmVycyh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgbWFnbmV0IGlzIGRpc2FibGVkLlxuICAgKi9cbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdXBlci5kaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGRpc2FibGVkIG9mIG1hZ25ldC5cbiAgICovXG4gIHNldCBkaXNhYmxlZChkaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHN1cGVyLmRpc2FibGVkID0gZGlzYWJsZWQ7XG4gICAgY2hlY2tEcmFnTGlzdGVuZXJzKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWFnbmV0IGlzIHVuYWJsZSB0byBiZSBkcmFnZ2VkLlxuICAgKi9cbiAgZ2V0IHVubW92YWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3VwZXIudW5tb3ZhYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdW5tb3ZhYmxlIG9mIG1hZ25ldC5cbiAgICovXG4gIHNldCB1bm1vdmFibGUodW5tb3ZhYmxlOiBib29sZWFuKSB7XG4gICAgc3VwZXIudW5tb3ZhYmxlID0gdW5tb3ZhYmxlO1xuICAgIGNoZWNrRHJhZ0xpc3RlbmVycyh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHJlY3Qgb2JqZWN0IG9mIHRoaXMgbWFnbmV0LlxuICAgKi9cbiAgZ2V0IG1hZ25ldFJlY3QoKTogRE9NUmVjdCB7XG4gICAgaWYgKCF0aGlzLnJlY3RDYWNoZSkge1xuICAgICAgdGhpcy5yZWN0Q2FjaGUgPSBnZXRSZWN0KHRoaXMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJlY3RDYWNoZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIHJlY3Qgb2JqZWN0IG9mIHRoaXMgbWFnbmV0LlxuICAgKi9cbiAgcmVzZXRNYWduZXRSZWN0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc01vdmluZykge1xuICAgICAgdGhpcy5yZWN0Q2FjaGUgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHBhY2sgb2JqZWN0IG9mIHBhcmVudCBpZiBleGlzdGluZy5cbiAgICovXG4gIGdldCBwYXJlbnRQYWNrKCk6IFBhY2sge1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50RWxlbWVudCA/PyBkb2N1bWVudC5ib2R5O1xuXG4gICAgaWYgKCF0aGlzLnBhcmVudFBhY2tDYWNoZSkge1xuICAgICAgdGhpcy5wYXJlbnRQYWNrQ2FjaGUgPSBnZXRQYWNrKHBhcmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucGFyZW50UGFja0NhY2hlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgcGFjayBvYmplY3Qgb2YgdGhlIHBhcmVudCBvZiBtYWduZXQuXG4gICAqL1xuICByZXNldFBhcmVudFBhY2soKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTW92aW5nKSB7XG4gICAgICB0aGlzLnBhcmVudFBhY2tDYWNoZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgcGFjayBvYmplY3RzIG9mIHRhcmdldCBtYWduZXRzLlxuICAgKi9cbiAgZ2V0IHRhcmdldE1hZ25ldFBhY2tzKCk6IFBhY2tbXSB7XG4gICAgaWYgKCF0aGlzLnRhcmdldE1hZ25ldFBhY2tzQ2FjaGUpIHtcbiAgICAgIHRoaXMudGFyZ2V0TWFnbmV0UGFja3NDYWNoZSA9IHRoaXMuZ2V0QXR0cmFjdGFibGVNYWduZXRzKClcbiAgICAgICAgLm1hcCgodGFyZ2V0KSA9PiBnZXRQYWNrKHRhcmdldCkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRhcmdldE1hZ25ldFBhY2tzQ2FjaGU7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBwYWNrIG9iamVjdHMgb2YgdGFyZ2V0IG1hZ25ldHMuXG4gICAqL1xuICByZXNldFRhcmdldE1hZ25ldFBhY2tzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc01vdmluZykge1xuICAgICAgdGhpcy50YXJnZXRNYWduZXRQYWNrc0NhY2hlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBvdGhlciBtYWduZXQgZWxlbWVudHMuXG4gICAqL1xuICBnZXRPdGhlck1hZ25ldHMoKTogTWFnbmV0W10ge1xuICAgIHJldHVybiAoQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKG5vZGVOYW1lKSkgYXMgTWFnbmV0W10pXG4gICAgICAuZmlsdGVyKChtYWduZXQpID0+IG1hZ25ldCAhPT0gdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBhdHRyYWN0YWJsZSBtYWduZXQgZWxlbWVudHMuXG4gICAqL1xuICBnZXRBdHRyYWN0YWJsZU1hZ25ldHMoKTogTWFnbmV0W10ge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMudW5hdHRyYWN0YWJsZSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZ3JvdXAgfSA9IHRoaXM7XG4gICAgY29uc3QgaGFzR3JvdXAgPSBncm91cCAhPT0gbnVsbDtcbiAgICBjb25zdCBub25EaXNhYmxlZFNlbGVjdG9yID0gYDpub3QoWyR7QXR0cmlidXRlLmRpc2FibGVkfV0pYDtcbiAgICBjb25zdCBub25VbmF0dHJhY3RhYmxlU2VsZWN0b3IgPSBgOm5vdChbJHtBdHRyaWJ1dGUudW5hdHRyYWN0YWJsZX1dKWA7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBgJHtub2RlTmFtZX0ke25vbkRpc2FibGVkU2VsZWN0b3J9JHtub25VbmF0dHJhY3RhYmxlU2VsZWN0b3J9YDtcbiAgICBjb25zdCBtYWduZXRzID0gKEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcikpIGFzIE1hZ25ldFtdKVxuICAgICAgLmZpbHRlcigobWFnbmV0KSA9PiAoXG4gICAgICAgIG1hZ25ldCAhPT0gdGhpc1xuICAgICAgICAmJiAhdGhpcy5jb250YWlucyhtYWduZXQpXG4gICAgICAgICYmIChoYXNHcm91cCA/IGdyb3VwID09PSBtYWduZXQuZ3JvdXAgOiB0cnVlKVxuICAgICAgKSk7XG5cbiAgICByZXR1cm4gbWFnbmV0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRpc3RhbmNlIHBhc3NlcyB0aGUganVkZ2VtZW50LiBPdGhlcndpc2UgdGhlXG4gICAqIGRpc3RhbmNlIHdvdWxkIG5vdCBiZSBsaXN0ZWQgb24gdGhlIGF0dHJhY3Rpb24gcmVzdWx0LlxuICAgKi9cbiAganVkZ2VNYWduZXREaXN0YW5jZSguLi5bXG4gICAgZGlzdGFuY2UsXG4gICAgb3B0aW9ucyA9IHt9LFxuICBdOiBQYXJhbWV0ZXJzPHR5cGVvZiBqdWRnZURpc3RhbmNlPikge1xuICAgIGNvbnN0IHtcbiAgICAgIGF0dHJhY3REaXN0YW5jZSA9IHRoaXMuYXR0cmFjdERpc3RhbmNlLFxuICAgICAgYWxpZ25Ub3MgPSB0aGlzLmFsaWduVG9zLFxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgcmV0dXJuIGp1ZGdlRGlzdGFuY2UoZGlzdGFuY2UsIHtcbiAgICAgIGF0dHJhY3REaXN0YW5jZSxcbiAgICAgIGFsaWduVG9zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzYW1lIGFzIC5qdWRnZU1hZ25ldERpc2FuY2UgYnV0IGNvbnNpZGVyIGEgd3JhcHBlciBlbGVtZW50LlxuICAgKi9cbiAganVkZ2VNYWduZXREaXN0YW5jZUluUGFyZW50KC4uLltcbiAgICBkaXN0YW5jZSxcbiAgICBvcHRpb25zID0ge30sXG4gIF06IFBhcmFtZXRlcnM8dHlwZW9mIGp1ZGdlRGlzdGFuY2VJblBhcmVudD4pIHtcbiAgICBjb25zdCB7XG4gICAgICBhdHRyYWN0RGlzdGFuY2UgPSB0aGlzLmF0dHJhY3REaXN0YW5jZSxcbiAgICAgIGFsaWduVG9zID0gdGhpcy5hbGlnblRvcyxcbiAgICAgIG9uSnVkZ2VEaXN0YW5jZSA9IHRoaXMuanVkZ2VNYWduZXREaXN0YW5jZSxcbiAgICB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBwYXJlbnQgPSBvcHRpb25zLnBhcmVudCA/PyB0aGlzLnBhcmVudFBhY2s7XG5cbiAgICByZXR1cm4ganVkZ2VEaXN0YW5jZUluUGFyZW50KGRpc3RhbmNlLCB7XG4gICAgICBhdHRyYWN0RGlzdGFuY2UsXG4gICAgICBhbGlnblRvcyxcbiAgICAgIHBhcmVudCxcbiAgICAgIG9uSnVkZ2VEaXN0YW5jZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGF0dHJhY3Rpb24gcGFzc2VzIHRoZSBqdWRnZW1lbnQuIE90aGVyd2lzZSB0aGVcbiAgICogZGlzdGFuY2UgcmVzdWx0cyBvZiBhdHRyYWN0aW9uIHdvdWxkIG5vdCBiZSBsaXN0ZWQgb24gdGhlIHJlc3VsdCBvZlxuICAgKiBhdHRyYWN0aW9ucy5cbiAgICovXG4gIGp1ZGdlTWFnbmV0QXR0cmFjdGlvbiA9IGp1ZGdlQXR0cmFjdGlvblxuXG4gIC8qKlxuICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgb2Zmc2V0IG9mIHBhY2sgcGFzc2VzIHRoZSBqdWRnZW1lbnQuIE90aGVyd2lzZVxuICAqIHRoZSBtYWduZXQgd291bGQgbm90IGJlIGFwcGxpZWQgdGhlIG1vdmVtZW50LlxuICAqL1xuICBqdWRnZU1hZ25ldE1vdmVtZW50ID0ganVkZ2VNb3ZlbWVudFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGRpc3RhbmNlIHZhbHVlIHRvIHRhcmdldCBvbiBzcGVjaWZpYyBhbGlnbm1lbnQuXG4gICAqL1xuICByYXdEaXN0YW5jZVRvKFxuICAgIHRhcmdldDogUmVjdGFibGUgfCBQYWNrLFxuICAgIGFsaWdubWVudDogQWxpZ25tZW50LFxuICApIHtcbiAgICBjb25zdCBzb3VyY2VSZWN0ID0gZ2V0UmVjdCh0aGlzKTtcbiAgICBjb25zdCB0YXJnZXRSZWN0ID0gZ2V0UmVjdCh0YXJnZXQpO1xuXG4gICAgcmV0dXJuIHJhd0Rpc3RhbmNlVG8oc291cmNlUmVjdCwgdGFyZ2V0UmVjdCwgYWxpZ25tZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGRpc3RhbmNlIG9iamVjdCB0byB0YXJnZXQgb24gYWxpZ25tZW50LlxuICAgKi9cbiAgZGlzdGFuY2VUbyhcbiAgICB0YXJnZXQ6IFJlY3RhYmxlIHwgUGFjayxcbiAgICBhbGlnbm1lbnQ6IEFsaWdubWVudCxcbiAgKSB7XG4gICAgcmV0dXJuIGRpc3RhbmNlVG8odGhpcywgdGFyZ2V0LCBhbGlnbm1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgcmVzdWx0IG9mIGF0dHJhY3Rpb25zIHRvIHRhcmdldCBvbiBhbGlnbm1lbnRzLlxuICAgKi9cbiAgYXR0cmFjdGlvblRvKFxuICAgIHRhcmdldDogUmVjdGFibGUgfCBQYWNrLFxuICAgIG9wdGlvbnM6IFNpbmdsZUF0dHJhY3Rpb25Ub09wdGlvbnMgPSB7fSxcbiAgKSB7XG4gICAgY29uc3Qge1xuICAgICAgYXR0cmFjdERpc3RhbmNlID0gdGhpcy5hdHRyYWN0RGlzdGFuY2UsXG4gICAgICBhbGlnblRvcyA9IHRoaXMuYWxpZ25Ub3MsXG4gICAgICBhbGlnbm1lbnRzLFxuICAgICAgb25KdWRnZURpc3RhbmNlID0gdGhpcy5qdWRnZU1hZ25ldERpc3RhbmNlLFxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgcmV0dXJuIHNpbmdsZUF0dHJhY3Rpb25UbyhcbiAgICAgIHRoaXMsXG4gICAgICB0YXJnZXQsXG4gICAgICB7XG4gICAgICAgIGF0dHJhY3REaXN0YW5jZSxcbiAgICAgICAgYWxpZ25Ub3MsXG4gICAgICAgIGFsaWdubWVudHMsXG4gICAgICAgIG9uSnVkZ2VEaXN0YW5jZSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHJlc3VsdCBvZiBhdHRyYWN0aW9ucyB0byBwYXJlbnQgb24gYWxpZ25tZW50cy5cbiAgICovXG4gIGF0dHJhY3Rpb25Ub1BhcmVudChcbiAgICBvcHRpb25zOiBTaW5nbGVBdHRyYWN0aW9uVG9PcHRpb25zID0ge30sXG4gICkge1xuICAgIGNvbnN0IHtcbiAgICAgIGF0dHJhY3REaXN0YW5jZSA9IHRoaXMuYXR0cmFjdERpc3RhbmNlLFxuICAgICAgYWxpZ25Ub3MgPSB0aGlzLmFsaWduVG9QYXJlbnRzLFxuICAgICAgYWxpZ25tZW50cyxcbiAgICAgIG9uSnVkZ2VEaXN0YW5jZSA9IHRoaXMuanVkZ2VNYWduZXREaXN0YW5jZSxcbiAgICB9ID0gb3B0aW9ucztcblxuICAgIHJldHVybiBzaW5nbGVBdHRyYWN0aW9uVG8oXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy5wYXJlbnRQYWNrLFxuICAgICAge1xuICAgICAgICBhdHRyYWN0RGlzdGFuY2UsXG4gICAgICAgIGFsaWduVG9zLFxuICAgICAgICBhbGlnbm1lbnRzLFxuICAgICAgICBvbkp1ZGdlRGlzdGFuY2UsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyByZXN1bHQgb2YgYXR0cmFjdGlvbnMgZnJvbSBzb3VyY2UgdG8gdGFyZ2V0cyBvbiBhbGlnbm1lbnRzLlxuICAgKi9cbiAgbXVsdGlBdHRyYWN0aW9uc1RvKFxuICAgIHRhcmdldHM6IChSZWN0YWJsZSB8IFBhY2spW10sXG4gICAgb3B0aW9uczogTXVsdGlBdHRyYWN0aW9uc1RvT3B0aW9ucyAmIHtcbiAgICAgIGFsaWduVG9QYXJlbnRzPzogQWxpZ25Ub1BhcmVudFtdO1xuICAgIH0gPSB7fSxcbiAgKSB7XG4gICAgY29uc3Qge1xuICAgICAgYXR0cmFjdERpc3RhbmNlID0gdGhpcy5hdHRyYWN0RGlzdGFuY2UsXG4gICAgICBhbGlnblRvcyA9IHRoaXMuYWxpZ25Ub3MsXG4gICAgICBhbGlnblRvUGFyZW50cyA9IHRoaXMuYWxpZ25Ub1BhcmVudHMsXG4gICAgICBhbGlnbm1lbnRzLFxuICAgICAgb25KdWRnZURpc3RhbmNlID0gdGhpcy5qdWRnZU1hZ25ldERpc3RhbmNlLFxuICAgICAgYXR0cmFjdGlvbkJlc3QsXG4gICAgICBvbkp1ZGdlQXR0cmFjdGlvbiA9IHRoaXMuanVkZ2VNYWduZXRBdHRyYWN0aW9uLFxuICAgIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHBhcmVudEF0dHJhY3Rpb24gPSBNYWduZXQucHJvdG90eXBlLmF0dHJhY3Rpb25Ub1BhcmVudC5jYWxsKFxuICAgICAgdGhpcyxcbiAgICAgIHtcbiAgICAgICAgYXR0cmFjdERpc3RhbmNlLFxuICAgICAgICBhbGlnblRvczogYWxpZ25Ub1BhcmVudHMsXG4gICAgICAgIGFsaWdubWVudHMsXG4gICAgICAgIG9uSnVkZ2VEaXN0YW5jZSxcbiAgICAgICAgYXR0cmFjdGlvbkJlc3QsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXR1cm4gbXVsdGlBdHRyYWN0aW9uc1RvKFxuICAgICAgdGhpcyxcbiAgICAgIHRhcmdldHMsXG4gICAgICB7XG4gICAgICAgIGF0dHJhY3REaXN0YW5jZSxcbiAgICAgICAgYWxpZ25Ub3MsXG4gICAgICAgIGFsaWdubWVudHMsXG4gICAgICAgIG9uSnVkZ2VEaXN0YW5jZSxcbiAgICAgICAgb25KdWRnZUF0dHJhY3Rpb24sXG4gICAgICAgIGF0dHJhY3Rpb25CZXN0OiBwYXJlbnRBdHRyYWN0aW9uPy5iZXN0LFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZmluYWwgYXZhaWxhYmxlIHBvc2l0aW9uIGFuZCBhdHRyYWN0aW9uIG9uIHNwZWNpZmljIHBvc2l0aW9uLlxuICAgKi9cbiAgZ2V0TWFnbmV0QXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb24oXG4gICAgcG9zaXRpb246IERPTVBvaW50LFxuICAgIG9wdGlvbnM/OiBBdHRyYWN0aW9uUmVzdWx0T2ZQb3NpdGlvbk9wdGlvbnMsXG4gICk6IFJldHVyblR5cGU8dHlwZW9mIGF0dHJhY3Rpb25SZXN1bHRPZlBvc2l0aW9uPlxuXG4gIGdldE1hZ25ldEF0dHJhY3Rpb25SZXN1bHRPZlBvc2l0aW9uKFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgb3B0aW9ucz86IEF0dHJhY3Rpb25SZXN1bHRPZlBvc2l0aW9uT3B0aW9ucyxcbiAgKTogUmV0dXJuVHlwZTx0eXBlb2YgYXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb24+XG5cbiAgZ2V0TWFnbmV0QXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb248QTAgZXh0ZW5kcyBET01Qb2ludCB8IG51bWJlcj4oXG4gICAgYXJnMDogQTAsXG4gICAgYXJnMT86IEEwIGV4dGVuZHMgRE9NUG9pbnQgPyBBdHRyYWN0aW9uUmVzdWx0T2ZQb3NpdGlvbk9wdGlvbnMgOiBudW1iZXIsXG4gICAgYXJnMj86IEEwIGV4dGVuZHMgRE9NUG9pbnQgPyB1bmRlZmluZWQgOiBBdHRyYWN0aW9uUmVzdWx0T2ZQb3NpdGlvbk9wdGlvbnMsXG4gICkge1xuICAgIGNvbnN0IHBvc2l0aW9uID0gY3JlYXRlUG9pbnQoYXJnMCBhcyBudW1iZXIsIGFyZzEgYXMgbnVtYmVyKTtcbiAgICBjb25zdCBvcHRpb25zID0gKFxuICAgICAgKGFyZzAgaW5zdGFuY2VvZiBET01Qb2ludCA/IGFyZzEgOiBhcmcyKSA/PyB7fVxuICAgICkgYXMgQXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb25PcHRpb25zO1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGhpcy5tYWduZXRSZWN0O1xuICAgIGNvbnN0IHNvdXJjZVJlY3QgPSBjcmVhdGVSZWN0KFxuICAgICAgcG9zaXRpb24ueCxcbiAgICAgIHBvc2l0aW9uLnksXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICApO1xuICAgIGNvbnN0IHNvdXJjZVBhY2sgPSBuZXcgUGFjayh0aGlzLCBzb3VyY2VSZWN0KTtcbiAgICBjb25zdCB7XG4gICAgICBpZ25vcmVFdmVudCxcbiAgICAgIHVuYXR0cmFjdGFibGUgPSB0aGlzLnVuYXR0cmFjdGFibGUsXG4gICAgICBhdHRyYWN0RGlzdGFuY2UgPSB0aGlzLmF0dHJhY3REaXN0YW5jZSxcbiAgICAgIGFsaWduVG9zID0gdGhpcy5hbGlnblRvcyxcbiAgICAgIGFsaWdubWVudHMsXG4gICAgICBhbGlnblRvUGFyZW50cyA9IHRoaXMuYWxpZ25Ub1BhcmVudHMsXG4gICAgICBjcm9zc1ByZXZlbnRzID0gdGhpcy5jcm9zc1ByZXZlbnRzLFxuICAgICAgcGFyZW50UGFjayA9IHRoaXMucGFyZW50UGFjayxcbiAgICAgIGxhc3RBdHRyYWN0aW9uQmVzdCA9IHRoaXMubGFzdEF0dHJhY3Rpb25CZXN0LFxuICAgICAgb25KdWRnZURpc3RhbmNlID0gdGhpcy5qdWRnZU1hZ25ldERpc3RhbmNlLFxuICAgICAgb25KdWRnZURpc3RhbmNlSW5QYXJlbnQgPSB0aGlzLmp1ZGdlTWFnbmV0RGlzdGFuY2VJblBhcmVudCxcbiAgICAgIG9uSnVkZ2VBdHRyYWN0aW9uID0gdGhpcy5qdWRnZU1hZ25ldEF0dHJhY3Rpb24sXG4gICAgICBvbkp1ZGdlTW92ZW1lbnQgPSB0aGlzLmp1ZGdlTWFnbmV0TW92ZW1lbnQsXG4gICAgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgcmVzdWx0ID0gYXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb24oXG4gICAgICBzb3VyY2VQYWNrLFxuICAgICAgdGhpcy50YXJnZXRNYWduZXRQYWNrcyxcbiAgICAgIHtcbiAgICAgICAgaWdub3JlRXZlbnQsXG4gICAgICAgIHVuYXR0cmFjdGFibGUsXG4gICAgICAgIGF0dHJhY3REaXN0YW5jZSxcbiAgICAgICAgYWxpZ25Ub3MsXG4gICAgICAgIGFsaWdubWVudHMsXG4gICAgICAgIGFsaWduVG9QYXJlbnRzLFxuICAgICAgICBjcm9zc1ByZXZlbnRzLFxuICAgICAgICBwYXJlbnRQYWNrLFxuICAgICAgICBsYXN0QXR0cmFjdGlvbkJlc3QsXG4gICAgICAgIG9uSnVkZ2VEaXN0YW5jZSxcbiAgICAgICAgb25KdWRnZURpc3RhbmNlSW5QYXJlbnQsXG4gICAgICAgIG9uSnVkZ2VBdHRyYWN0aW9uLFxuICAgICAgICBvbkp1ZGdlTW92ZW1lbnQsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICB0aGlzLnJlc2V0TWFnbmV0UmVjdCgpO1xuICAgIHRoaXMucmVzZXRQYXJlbnRQYWNrKCk7XG4gICAgdGhpcy5yZXNldFRhcmdldE1hZ25ldFBhY2tzKCk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBwb2ludCBvYmplY3Qgb2YgbWFnbmV0IG9mZnNldC5cbiAgICovXG4gIGdldCBsYXN0TWFnbmV0T2Zmc2V0KCk6IERPTVBvaW50IHtcbiAgICBjb25zdCB7IG9mZnNldFVuaXQsIGxhc3RPZmZzZXQgfSA9IHRoaXM7XG5cbiAgICBzd2l0Y2ggKG9mZnNldFVuaXQpIHtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICBjYXNlIE9mZnNldFVuaXQucGl4ZWw6XG4gICAgICAgIHJldHVybiBjcmVhdGVQb2ludChsYXN0T2Zmc2V0KTtcblxuICAgICAgY2FzZSBPZmZzZXRVbml0LnBlcmNlbnRhZ2U6IHtcbiAgICAgICAgY29uc3QgeyBvZmZzZXRQYXJlbnQgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHBhcmVudFJlY3QgPSBjcmVhdGVSZWN0KG9mZnNldFBhcmVudCA/PyBkb2N1bWVudCk7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGNyZWF0ZVBvaW50KFxuICAgICAgICAgIGxhc3RPZmZzZXQueCAvIHBhcmVudFJlY3Qud2lkdGgsXG4gICAgICAgICAgbGFzdE9mZnNldC55IC8gcGFyZW50UmVjdC5oZWlnaHQsXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIG9mZnNldDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBvZmZzZXQgb2YgbWFnbmV0IG1vdmVtZW50LlxuICAgKi9cbiAgcmVzZXRNYWduZXRPZmZzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShTdHlsZS5vZmZzZXRYKTtcbiAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KFN0eWxlLm9mZnNldFkpO1xuICAgIHRoaXMubGFzdE9mZnNldCA9IGNyZWF0ZVBvaW50KDAsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIE9mZnNldHMgbWFnbmV0IG1vdmVtZW50IHdpdGggKGR4LCBkeSkuXG4gICAqL1xuICBzZXRNYWduZXRPZmZzZXQoZHg6IG51bWJlciwgZHk6IG51bWJlcik6IHZvaWRcblxuICBzZXRNYWduZXRPZmZzZXQob2Zmc2V0PzogRE9NUG9pbnQpOiB2b2lkXG5cbiAgc2V0TWFnbmV0T2Zmc2V0PERYIGV4dGVuZHMgRE9NUG9pbnQgfCBudW1iZXI+KFxuICAgIGR4OiBEWCA9IHRoaXMubGFzdE9mZnNldCBhcyBEWCxcbiAgICBkeT86IERYIGV4dGVuZHMgRE9NUG9pbnQgPyB1bmRlZmluZWQgOiBudW1iZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG9mZnNldCA9IGNyZWF0ZVBvaW50KGR4IGFzIG51bWJlciwgZHkgYXMgbnVtYmVyKTtcbiAgICBjb25zdCB7IG9mZnNldFVuaXQgfSA9IHRoaXM7XG5cbiAgICBzd2l0Y2ggKG9mZnNldFVuaXQpIHtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICBjYXNlIE9mZnNldFVuaXQucGl4ZWw6XG4gICAgICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoU3R5bGUub2Zmc2V0WCwgYCR7b2Zmc2V0Lnh9cHhgKTtcbiAgICAgICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShTdHlsZS5vZmZzZXRZLCBgJHtvZmZzZXQueX1weGApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBPZmZzZXRVbml0LnBlcmNlbnRhZ2U6IHtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQgPz8gZG9jdW1lbnQuYm9keTtcbiAgICAgICAgY29uc3Qgc3R5bGVzID0gZ2xvYmFsVGhpcy5nZXRDb21wdXRlZFN0eWxlKHBhcmVudCk7XG4gICAgICAgIGNvbnN0IHsgYm94U2l6aW5nLCB3aWR0aCwgaGVpZ2h0IH0gPSBzdHlsZXM7XG4gICAgICAgIGxldCBmaW5hbFdpZHRoID0gcGFyc2VGbG9hdCh3aWR0aCk7XG4gICAgICAgIGxldCBmaW5hbEhlaWdodCA9IHBhcnNlRmxvYXQoaGVpZ2h0KTtcblxuICAgICAgICBpZiAoYm94U2l6aW5nID09PSAnYm9yZGVyLWJveCcpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBwYWRkaW5nVG9wLCBwYWRkaW5nUmlnaHQsIHBhZGRpbmdCb3R0b20sIHBhZGRpbmdMZWZ0LFxuICAgICAgICAgICAgYm9yZGVyVG9wV2lkdGgsIGJvcmRlclJpZ2h0V2lkdGgsIGJvcmRlckJvdHRvbVdpZHRoLCBib3JkZXJMZWZ0V2lkdGgsXG4gICAgICAgICAgfSA9IHN0eWxlcztcbiAgICAgICAgICBjb25zdCB0b3AgPSBwYXJzZUZsb2F0KHBhZGRpbmdUb3ApO1xuICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gcGFyc2VGbG9hdChwYWRkaW5nUmlnaHQpO1xuICAgICAgICAgIGNvbnN0IGJvdHRvbSA9IHBhcnNlRmxvYXQocGFkZGluZ0JvdHRvbSk7XG4gICAgICAgICAgY29uc3QgbGVmdCA9IHBhcnNlRmxvYXQocGFkZGluZ0xlZnQpO1xuICAgICAgICAgIGNvbnN0IGJvcmRlclRvcCA9IHBhcnNlRmxvYXQoYm9yZGVyVG9wV2lkdGgpO1xuICAgICAgICAgIGNvbnN0IGJvcmRlclJpZ2h0ID0gcGFyc2VGbG9hdChib3JkZXJSaWdodFdpZHRoKTtcbiAgICAgICAgICBjb25zdCBib3JkZXJCb3R0b20gPSBwYXJzZUZsb2F0KGJvcmRlckJvdHRvbVdpZHRoKTtcbiAgICAgICAgICBjb25zdCBib3JkZXJMZWZ0ID0gcGFyc2VGbG9hdChib3JkZXJMZWZ0V2lkdGgpO1xuXG4gICAgICAgICAgZmluYWxXaWR0aCAtPSByaWdodCArIGxlZnQgKyBib3JkZXJSaWdodCArIGJvcmRlckxlZnQ7XG4gICAgICAgICAgZmluYWxIZWlnaHQgLT0gdG9wICsgYm90dG9tICsgYm9yZGVyVG9wICsgYm9yZGVyQm90dG9tO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVsYXRpdmVPZmZzZXQgPSBjcmVhdGVQb2ludChcbiAgICAgICAgICBvZmZzZXQueCAvIGZpbmFsV2lkdGgsXG4gICAgICAgICAgb2Zmc2V0LnkgLyBmaW5hbEhlaWdodCxcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KFN0eWxlLm9mZnNldFgsIGAkezEwMCAqIHJlbGF0aXZlT2Zmc2V0Lnh9JWApO1xuICAgICAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KFN0eWxlLm9mZnNldFksIGAkezEwMCAqIHJlbGF0aXZlT2Zmc2V0Lnl9JWApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxhc3RPZmZzZXQgPSBjcmVhdGVQb2ludChvZmZzZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIG1hZ25ldCBtb3ZlbWVudCB0byAoeCwgeSkuXG4gICAqL1xuICBzZXRNYWduZXRQb3NpdGlvbih4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWRcblxuICBzZXRNYWduZXRQb3NpdGlvbihwb3NpdGlvbj86IERPTVBvaW50KTogdm9pZFxuXG4gIHNldE1hZ25ldFBvc2l0aW9uPFggZXh0ZW5kcyBET01Qb2ludCB8IG51bWJlcj4oXG4gICAgeDogWCA9IGNyZWF0ZVBvaW50KHRoaXMubWFnbmV0UmVjdCkgYXMgWCxcbiAgICB5PzogWCBleHRlbmRzIERPTVBvaW50ID8gdW5kZWZpbmVkIDogbnVtYmVyLFxuICApIHtcbiAgICBjb25zdCBwb3NpdGlvbiA9IGNyZWF0ZVBvaW50KHggYXMgbnVtYmVyLCB5IGFzIG51bWJlcik7XG4gICAgY29uc3Qge1xuICAgICAgbGFzdE9mZnNldCxcbiAgICAgIG1hZ25ldFJlY3Q6IHNvdXJjZVJlY3QsXG4gICAgfSA9IHRoaXM7XG4gICAgY29uc3Qgb3JpZ2luID0gY3JlYXRlUG9pbnQoXG4gICAgICBzb3VyY2VSZWN0LnggLSBsYXN0T2Zmc2V0LngsXG4gICAgICBzb3VyY2VSZWN0LnkgLSBsYXN0T2Zmc2V0LnksXG4gICAgKTtcblxuICAgIHRoaXMuc2V0TWFnbmV0T2Zmc2V0KFxuICAgICAgcG9zaXRpb24ueCAtIG9yaWdpbi54LFxuICAgICAgcG9zaXRpb24ueSAtIG9yaWdpbi55LFxuICAgICk7XG4gICAgdGhpcy5yZXNldE1hZ25ldFJlY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBiZXN0IGF0dHJhY3Rpb24gb2YgbGFzdCBtb3ZlLlxuICAgKi9cbiAgZ2V0IGJlc3RBdHRyYWN0aW9uKCk6IEF0dHJhY3Rpb25CZXN0IHtcbiAgICBjb25zdCB7IGxhc3RBdHRyYWN0aW9uQmVzdCB9ID0gdGhpcztcbiAgICBjb25zdCB4ID0gbGFzdEF0dHJhY3Rpb25CZXN0Py54O1xuICAgIGNvbnN0IHkgPSBsYXN0QXR0cmFjdGlvbkJlc3Q/Lnk7XG4gICAgY29uc3QgYXR0cmFjdGlvbkJlc3Q6IEF0dHJhY3Rpb25CZXN0ID0ge307XG5cbiAgICBpZiAoeCkge1xuICAgICAgY29uc3QgeyBzb3VyY2UsIHRhcmdldCB9ID0geDtcblxuICAgICAgYXR0cmFjdGlvbkJlc3QueCA9IHtcbiAgICAgICAgLi4ueCxcbiAgICAgICAgc291cmNlOiBuZXcgUGFjayhzb3VyY2UucmF3LCBjcmVhdGVSZWN0KHNvdXJjZS5yZWN0KSksXG4gICAgICAgIHRhcmdldDogbmV3IFBhY2sodGFyZ2V0LnJhdywgY3JlYXRlUmVjdCh0YXJnZXQucmVjdCkpLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXR0cmFjdGlvbkJlc3QueCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoeSkge1xuICAgICAgY29uc3QgeyBzb3VyY2UsIHRhcmdldCB9ID0geTtcblxuICAgICAgYXR0cmFjdGlvbkJlc3QueSA9IHtcbiAgICAgICAgLi4ueSxcbiAgICAgICAgc291cmNlOiBuZXcgUGFjayhzb3VyY2UucmF3LCBjcmVhdGVSZWN0KHNvdXJjZS5yZWN0KSksXG4gICAgICAgIHRhcmdldDogbmV3IFBhY2sodGFyZ2V0LnJhdywgY3JlYXRlUmVjdCh0YXJnZXQucmVjdCkpLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXR0cmFjdGlvbkJlc3QueSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gYXR0cmFjdGlvbkJlc3Q7XG4gIH1cbn1cblxucmVnaXN0ZXJFbGVtZW50KE1hZ25ldCwgbm9kZU5hbWUpO1xuXG5leHBvcnQgZGVmYXVsdCBNYWduZXQ7XG4iLCJpbXBvcnQgeyBkZWZhdWx0QXR0cmlidXRlVmFsdWVzIH0gZnJvbSAnLi4vY29yZSc7XG5pbXBvcnQgRGlzdGFuY2UgZnJvbSAnLi4vdHlwZXMvRGlzdGFuY2UnO1xuaW1wb3J0IEFsaWdubWVudCBmcm9tICcuLi92YWx1ZXMvYWxpZ25tZW50JztcbmltcG9ydCBBbGlnblRvLCB7IEFsaWduVG9QYXJlbnQgfSBmcm9tICcuLi92YWx1ZXMvYWxpZ25Ubyc7XG5pbXBvcnQgQXR0cmlidXRlIGZyb20gJy4uL3ZhbHVlcy9hdHRyaWJ1dGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEp1ZGdlRGlzdGFuY2VPcHRpb25zIHtcbiAgYXR0cmFjdERpc3RhbmNlPzogbnVtYmVyO1xuICBhbGlnblRvcz86IChBbGlnblRvIHwgQWxpZ25Ub1BhcmVudClbXTtcbn1cblxuZXhwb3J0IHR5cGUgT25KdWRnZURpc3RhbmNlID0gKFxuICBkaXN0YW5jZTogRGlzdGFuY2UsXG4gIG9wdGlvbnM/OiBKdWRnZURpc3RhbmNlT3B0aW9ucyxcbikgPT4gYm9vbGVhbjtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRpc3RhbmNlIHBhc3NlcyB0aGUganVkZ2VtZW50LiBPdGhlcndpc2UgdGhlXG4gKiBkaXN0YW5jZSB3b3VsZCBub3QgYmUgb24gdGhlIHJlc3VsdCBsaXN0IG9mIGF0dHJhY3Rpb24uXG4gKi9cbmNvbnN0IGp1ZGdlRGlzdGFuY2U6IE9uSnVkZ2VEaXN0YW5jZSA9IGZ1bmN0aW9uIGp1ZGdlRGlzdGFuY2UoXG4gIGRpc3RhbmNlLFxuICBvcHRpb25zID0ge30sXG4pOiBib29sZWFuIHtcbiAgY29uc3Qge1xuICAgIGF0dHJhY3REaXN0YW5jZSA9IGRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXNbQXR0cmlidXRlLmF0dHJhY3REaXN0YW5jZV0sXG4gIH0gPSBvcHRpb25zO1xuXG4gIGlmIChkaXN0YW5jZS5hYnNEaXN0YW5jZSA+IGF0dHJhY3REaXN0YW5jZSkge1xuICAgIC8vIHRvbyBmYXIsIG5vIGNvbnNpZGVyXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIGFsaWduVG9zID0gZGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1tBdHRyaWJ1dGUuYWxpZ25Ub10sXG4gIH0gPSBvcHRpb25zO1xuXG4gIGlmIChhbGlnblRvcy5pbmNsdWRlcyhBbGlnblRvLmV4dGVuZCkpIHtcbiAgICAvLyBhbGlnbiB0byBleHRlbmRlZCBlZGdlc1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIHNvdXJjZToge1xuICAgICAgcmVjdDogc291cmNlUmVjdCxcbiAgICB9LFxuICAgIHRhcmdldDoge1xuICAgICAgcmVjdDogdGFyZ2V0UmVjdCxcbiAgICB9LFxuICB9ID0gZGlzdGFuY2U7XG5cbiAgLy8gb25seSBwYXNzIHdoZW4gc291cmNlIG92ZXJsYXBzIHRhcmdldFxuICBzd2l0Y2ggKGRpc3RhbmNlLmFsaWdubWVudCkge1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBjYXNlIEFsaWdubWVudC50b3BUb1RvcDpcbiAgICBjYXNlIEFsaWdubWVudC50b3BUb0JvdHRvbTpcbiAgICBjYXNlIEFsaWdubWVudC5ib3R0b21Ub1RvcDpcbiAgICBjYXNlIEFsaWdubWVudC5ib3R0b21Ub0JvdHRvbTpcbiAgICBjYXNlIEFsaWdubWVudC55Q2VudGVyVG9ZQ2VudGVyOlxuICAgICAgaWYgKFxuICAgICAgICAoc291cmNlUmVjdC5yaWdodCArIGF0dHJhY3REaXN0YW5jZSkgPCB0YXJnZXRSZWN0LmxlZnRcbiAgICAgICAgfHwgKHNvdXJjZVJlY3QubGVmdCAtIGF0dHJhY3REaXN0YW5jZSkgPiB0YXJnZXRSZWN0LnJpZ2h0XG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGNhc2UgQWxpZ25tZW50LnJpZ2h0VG9SaWdodDpcbiAgICBjYXNlIEFsaWdubWVudC5yaWdodFRvTGVmdDpcbiAgICBjYXNlIEFsaWdubWVudC5sZWZ0VG9SaWdodDpcbiAgICBjYXNlIEFsaWdubWVudC5sZWZ0VG9MZWZ0OlxuICAgIGNhc2UgQWxpZ25tZW50LnhDZW50ZXJUb1hDZW50ZXI6XG4gICAgICBpZiAoXG4gICAgICAgIChzb3VyY2VSZWN0LnRvcCAtIGF0dHJhY3REaXN0YW5jZSkgPiB0YXJnZXRSZWN0LmJvdHRvbVxuICAgICAgICB8fCAoc291cmNlUmVjdC5ib3R0b20gKyBhdHRyYWN0RGlzdGFuY2UpIDwgdGFyZ2V0UmVjdC50b3BcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBqdWRnZURpc3RhbmNlO1xuIiwiaW1wb3J0IERpc3RhbmNlIGZyb20gJy4uL3R5cGVzL0Rpc3RhbmNlJztcbmltcG9ydCBQYWNrLCB7IFJlY3RhYmxlIH0gZnJvbSAnLi4vdHlwZXMvUGFjayc7XG5pbXBvcnQgeyBnZXRSZWN0IH0gZnJvbSAnLi4vdHlwZXMvUmVjdCc7XG5pbXBvcnQgeyByZXR1cm5UcnVlIH0gZnJvbSAnLi4vdXRpbHMvcmV0dXJuVHJ1ZUZhbHNlJztcbmltcG9ydCB7IEp1ZGdlRGlzdGFuY2VPcHRpb25zLCBPbkp1ZGdlRGlzdGFuY2UgfSBmcm9tICcuL2p1ZGdlRGlzdGFuY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEp1ZGdlRGlzdGFuY2VJblBhcmVudE9wdGlvbnMgZXh0ZW5kcyBKdWRnZURpc3RhbmNlT3B0aW9ucyB7XG4gIHBhcmVudD86IFBhY2sgfCBSZWN0YWJsZSB8IG51bGw7XG4gIG9uSnVkZ2VEaXN0YW5jZT86IE9uSnVkZ2VEaXN0YW5jZTtcbn1cblxuZXhwb3J0IHR5cGUgT25KdWRnZURpc3RhbmNlSW5QYXJlbnQgPSAoXG4gIGRpc3RhbmNlOiBEaXN0YW5jZSxcbiAgb3B0aW9ucz86IEp1ZGdlRGlzdGFuY2VJblBhcmVudE9wdGlvbnMsXG4pID0+IGJvb2xlYW47XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBkaXN0YW5jZSBwYXNzZXMgdGhlIGp1ZGdlbWVudC4gT3RoZXJ3aXNlIHRoZVxuICogZGlzdGFuY2Ugd291bGQgbm90IGJlIG9uIHRoZSByZXN1bHQgbGlzdCBvZiBhdHRyYWN0aW9uLlxuICovXG5jb25zdCBqdWRnZURpc3RhbmNlSW5QYXJlbnQ6IE9uSnVkZ2VEaXN0YW5jZUluUGFyZW50ID0gZnVuY3Rpb24ganVkZ2VEaXN0YW5jZUluUGFyZW50KFxuICBkaXN0YW5jZSxcbiAgb3B0aW9ucyA9IHt9LFxuKSB7XG4gIGNvbnN0IHtcbiAgICBvbkp1ZGdlRGlzdGFuY2UgPSByZXR1cm5UcnVlLFxuICAgIC4uLmp1ZGdlRGlzdGFuY2VPcHRpb25zXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBwYXNzSnVkZ2VEaXN0YW5jZSA9IG9uSnVkZ2VEaXN0YW5jZShkaXN0YW5jZSwganVkZ2VEaXN0YW5jZU9wdGlvbnMpO1xuXG4gIGlmICghcGFzc0p1ZGdlRGlzdGFuY2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogSWYgb3B0aW9ucy5wYXJlbnQgaXMgYG51bGxgLCB1c2UgYGRvY3VtZW50LmJvZHlgIGluc3RlYWQuXG4gICAqL1xuICBjb25zdCBwYXJlbnQgPSBvcHRpb25zLnBhcmVudCA/PyBkb2N1bWVudC5ib2R5O1xuXG4gIGNvbnN0IHBhcmVudFJlY3QgPSBnZXRSZWN0KHBhcmVudCk7XG4gIGNvbnN0IHsgYWxpZ25tZW50LCByYXdEaXN0YW5jZSwgc291cmNlIH0gPSBkaXN0YW5jZTtcbiAgY29uc3Qge1xuICAgIHJlY3Q6IHNvdXJjZVJlY3QsXG4gIH0gPSBzb3VyY2U7XG5cbiAgc3dpdGNoIChhbGlnbm1lbnQpIHtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBjYXNlICd0b3BUb1RvcCc6XG4gICAgY2FzZSAndG9wVG9Cb3R0b20nOlxuICAgIGNhc2UgJ2JvdHRvbVRvVG9wJzpcbiAgICBjYXNlICdib3R0b21Ub0JvdHRvbSc6XG4gICAgICByZXR1cm4gKFxuICAgICAgICBzb3VyY2VSZWN0LnRvcCArIHJhd0Rpc3RhbmNlID49IHBhcmVudFJlY3QudG9wXG4gICAgICAgICYmIHNvdXJjZVJlY3QuYm90dG9tICsgcmF3RGlzdGFuY2UgPD0gcGFyZW50UmVjdC5ib3R0b21cbiAgICAgICk7XG5cbiAgICBjYXNlICdyaWdodFRvUmlnaHQnOlxuICAgIGNhc2UgJ3JpZ2h0VG9MZWZ0JzpcbiAgICBjYXNlICdsZWZ0VG9SaWdodCc6XG4gICAgY2FzZSAnbGVmdFRvTGVmdCc6XG4gICAgICByZXR1cm4gKFxuICAgICAgICBzb3VyY2VSZWN0LnJpZ2h0ICsgcmF3RGlzdGFuY2UgPD0gcGFyZW50UmVjdC5yaWdodFxuICAgICAgICAmJiBzb3VyY2VSZWN0LmxlZnQgKyByYXdEaXN0YW5jZSA+PSBwYXJlbnRSZWN0LmxlZnRcbiAgICAgICk7XG5cbiAgICBjYXNlICd4Q2VudGVyVG9YQ2VudGVyJzpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHNvdXJjZVJlY3QucmlnaHQgKyByYXdEaXN0YW5jZSA8PSBwYXJlbnRSZWN0LnJpZ2h0XG4gICAgICAgICYmIHNvdXJjZVJlY3QubGVmdCArIHJhd0Rpc3RhbmNlID49IHBhcmVudFJlY3QubGVmdFxuICAgICAgKTtcblxuICAgIGNhc2UgJ3lDZW50ZXJUb1lDZW50ZXInOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgc291cmNlUmVjdC50b3AgKyByYXdEaXN0YW5jZSA+PSBwYXJlbnRSZWN0LnRvcFxuICAgICAgICAmJiBzb3VyY2VSZWN0LmJvdHRvbSArIHJhd0Rpc3RhbmNlIDw9IHBhcmVudFJlY3QuYm90dG9tXG4gICAgICApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBqdWRnZURpc3RhbmNlSW5QYXJlbnQ7XG4iLCJpbXBvcnQgRGlzdGFuY2UgZnJvbSAnLi4vdHlwZXMvRGlzdGFuY2UnO1xuaW1wb3J0IFBhY2ssIHsgZ2V0UGFjaywgUmVjdGFibGUgfSBmcm9tICcuLi90eXBlcy9QYWNrJztcbmltcG9ydCB7IGdldFJlY3QgfSBmcm9tICcuLi90eXBlcy9SZWN0JztcbmltcG9ydCB7IGFicyB9IGZyb20gJy4uL3V0aWxzL251bWVyaWMnO1xuaW1wb3J0IEFsaWdubWVudCBmcm9tICcuLi92YWx1ZXMvYWxpZ25tZW50JztcbmltcG9ydCByYXdEaXN0YW5jZVRvIGZyb20gJy4vcmF3RGlzdGFuY2VUbyc7XG5cbi8qKlxuICogUmV0dXJucyBkaXN0YW5jZSBvYmplY3QgZnJvbSBzb3VyY2UgdG8gdGFyZ2V0IG9uIGFsaWdubWVudC5cbiAqL1xuZnVuY3Rpb24gZGlzdGFuY2VUbyhcbiAgc291cmNlOiBSZWN0YWJsZSB8IFBhY2ssXG4gIHRhcmdldDogUmVjdGFibGUgfCBQYWNrLFxuICBhbGlnbm1lbnQ6IEFsaWdubWVudCxcbik6IERpc3RhbmNlIHtcbiAgY29uc3Qgc291cmNlUGFjayA9IGdldFBhY2soc291cmNlKTtcbiAgY29uc3QgdGFyZ2V0UGFjayA9IGdldFBhY2sodGFyZ2V0KTtcbiAgY29uc3Qgc291cmNlUmVjdCA9IGdldFJlY3Qoc291cmNlKTtcbiAgY29uc3QgdGFyZ2V0UmVjdCA9IGdldFJlY3QodGFyZ2V0KTtcbiAgY29uc3QgcmF3RGlzdGFuY2UgPSByYXdEaXN0YW5jZVRvKHNvdXJjZVJlY3QsIHRhcmdldFJlY3QsIGFsaWdubWVudCk7XG4gIGNvbnN0IGFic0Rpc3RhbmNlID0gYWJzKHJhd0Rpc3RhbmNlKTtcblxuICByZXR1cm4ge1xuICAgIHNvdXJjZTogc291cmNlUGFjayxcbiAgICB0YXJnZXQ6IHRhcmdldFBhY2ssXG4gICAgYWxpZ25tZW50LFxuICAgIHJhd0Rpc3RhbmNlLFxuICAgIGFic0Rpc3RhbmNlLFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBkaXN0YW5jZVRvO1xuIl0sIm5hbWVzIjpbImNyZWF0ZVBvaW50IiwieCIsInkiLCJET01Qb2ludCIsImZyb21Qb2ludCIsIkRPTVJlY3QiLCJnZXRBdHRyYWN0aW9uT2Zmc2V0IiwiYXR0cmFjdGlvbiIsImJlc3QiLCJyYXdEaXN0YW5jZSIsIlNQTElUVEVSIiwiZ2V0QXJyYXlGcm9tQXR0cmlidXRlVmFsdWUiLCJ2YWx1ZSIsImluZGV4T2JqZWN0IiwidmFsdWVzIiwic3BsaXQiLCJ1bmRlZmluZWQiLCJPYmplY3QiLCJmaWx0ZXIiLCJpbmRleCIsImluY2x1ZGVzIiwiZ2V0QXR0cmlidXRlVmFsdWVGcm9tQXJyYXkiLCJBcnJheSIsImlzQXJyYXkiLCJqb2luIiwiTm9kZSIsIm5vZGVOYW1lIiwiY3VzdG9tRWxlbWVudHMiLCJnZXQiLCJQcm9taXNlIiwicmVqZWN0IiwiRXJyb3IiLCJkZWZpbmUiLCJ3aGVuRGVmaW5lZCIsIkFsaWdubWVudCIsIkFsaWdubWVudFhzIiwicmlnaHRUb1JpZ2h0IiwicmlnaHRUb0xlZnQiLCJsZWZ0VG9SaWdodCIsImxlZnRUb0xlZnQiLCJ4Q2VudGVyVG9YQ2VudGVyIiwiQWxpZ25tZW50WXMiLCJ0b3BUb1RvcCIsInRvcFRvQm90dG9tIiwiYm90dG9tVG9Ub3AiLCJib3R0b21Ub0JvdHRvbSIsInlDZW50ZXJUb1lDZW50ZXIiLCJBbGlnblRvIiwiQWxpZ25Ub1BhcmVudCIsIkF0dHJpYnV0ZSIsIkNyb3NzUHJldmVudCIsIkV2ZW50IiwiT2Zmc2V0VW5pdCIsImlzTmFOIiwiZ2xvYmFsVGhpcyIsImFicyIsIk1hdGgiLCJ0ZW1wbGF0ZSIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXMiLCJpbm5lckhUTUwiLCJNYWduZXRQYWNrIiwiSFRNTEVsZW1lbnQiLCJjb25zdHJ1Y3RvciIsInN1cGVyIiwidGhpcyIsImF0dGFjaFNoYWRvdyIsIm1vZGUiLCJzaGFkb3dSb290IiwiYXBwZW5kIiwiY29udGVudCIsImNsb25lTm9kZSIsIkFMSUdOTUVOVCIsIkFMSUdOX1RPIiwiQUxJR05fVE9fUEFSRU5UIiwiQ1JPU1NfUFJFVkVOVCIsIkVWRU5UIiwic291cmNlIiwiYWxpZ25Ub3MiLCJhbGlnbm1lbnRzIiwicHVzaCIsImRpc2FibGVkIiwidHJhY2VNYWduZXRBdHRyaWJ1dGVWYWx1ZSIsInNldEF0dHJpYnV0ZSIsInJlbW92ZUF0dHJpYnV0ZSIsImdyb3VwIiwibGVuZ3RoIiwicGFyZW50TWFnbmV0IiwiZ2V0QXR0cmlidXRlIiwicGFyZW50IiwicGFyZW50RWxlbWVudCIsInBhcmVudEdyb3VwIiwidW5hdHRyYWN0YWJsZSIsInVubW92YWJsZSIsImF0dHJhY3REaXN0YW5jZSIsIk51bWJlciIsIlR5cGVFcnJvciIsIlJhbmdlRXJyb3IiLCJhbGlnblRvUGFyZW50cyIsImdldEFsaWdubWVudHNGcm9tQWxpZ25UbyIsInBhcmVudEFsaWdubWVudHMiLCJjcm9zc1ByZXZlbnRzIiwib2Zmc2V0VW5pdCIsImF0dHJOYW1lIiwicmVnaXN0ZXJFbGVtZW50IiwiY3JlYXRlUmVjdCIsImFyZ3MiLCJXaW5kb3ciLCJpbm5lcldpZHRoIiwiaW5uZXJIZWlnaHQiLCJEb2N1bWVudCIsImJvZHkiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJFbGVtZW50IiwiUGFjayIsImZyb21SZWN0IiwicmVjdCIsIndpZHRoIiwiaGVpZ2h0IiwidG9wIiwicmlnaHQiLCJib3R0b20iLCJsZWZ0IiwiZ2V0UmVjdCIsInJhdyIsImlzUGFjayIsImZyZWV6ZSIsImdldFBhY2siLCJzb3VyY2VSZWN0IiwidGFyZ2V0UmVjdCIsImFsaWdubWVudCIsIkluZmluaXR5IiwicmV0dXJuVHJ1ZSIsInJldHVybkZhbHNlIiwiZGlzdGFuY2VCZXR3ZWVuWENlbnRlcnNPZlJlY3RzIiwic291cmNlUmVjdFhDZW50ZXIiLCJ0YXJnZXRSZWN0WENlbnRlciIsImRpc3RhbmNlQmV0d2VlbllDZW50ZXJzT2ZSZWN0cyIsInNvdXJjZVJlY3RZQ2VudGVyIiwidGFyZ2V0UmVjdFlDZW50ZXIiLCJ0YXJnZXRzIiwib3B0aW9ucyIsInNvdXJjZVBhY2siLCJ0YXJnZXRQYWNrcyIsIm1hcCIsInRhcmdldCIsIm9uSnVkZ2VEaXN0YW5jZSIsIm9uSnVkZ2VBdHRyYWN0aW9uIiwiYXR0cmFjdGlvbkJlc3QiLCJzaW5nbGVBdHRyYWN0aW9uT3B0aW9ucyIsInJlZHVjZSIsInRhcmdldFBhY2siLCJzaW5nbGVBdHRyYWN0aW9uIiwiTWFnbmV0IiwiY3VycmVudEJlc3QiLCJyZXN1bHRzIiwiY3VycmVudFJlc3VsdHMiLCJwYXNzSnVkZ2VtZW50IiwiYWJzRGlzdGFuY2UiLCJsYXN0QmVzdFJlY3QiLCJjdXJyZW50RGlmZlkiLCJkaWZmWSIsImdhcCIsImxhc3RSZWN0IiwiY3VycmVudFJlY3QiLCJsYXN0WUJhc2UiLCJjdXJyZW50WUJhc2UiLCJzb3VyY2VZQmFzZSIsImxhc3RZRGlzdGFuY2UiLCJjdXJyZW50RGlmZlgiLCJkaWZmWCIsImxhc3RYQmFzZSIsImN1cnJlbnRYQmFzZSIsInNvdXJjZVhCYXNlIiwibGFzdFhEaXN0YW5jZSIsImRpc3RhbmNlIiwiQm9vbGVhbiIsImFkZEV2ZW50TGlzdGVuZXJzIiwicmVmIiwidHlwZXMiLCJsaXN0ZW5lciIsImZvckVhY2giLCJ0eXBlIiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXJzIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInRyaWdnZXJFdmVudCIsImRpc3BhdGNoRXZlbnQiLCJDdXN0b21FdmVudCIsInNvdXJjZVJhdyIsImlnbm9yZUV2ZW50IiwicGFyZW50UGFjayIsImxhc3RBdHRyYWN0aW9uQmVzdCIsIm9uSnVkZ2VNb3ZlbWVudCIsImxhc3RCZXN0WCIsImxhc3RCZXN0WSIsImFsaWduVG9QYXJlbnQiLCJrZWVwSW5QYXJlbnQiLCJzb3VyY2VXaWR0aCIsInNvdXJjZUhlaWdodCIsInBhcmVudFJlY3QiLCJzb3VyY2VSYXdSZWN0Iiwic291cmNlSW5QYXJlbnRPZmZzZXQiLCJnZXRPZmZzZXRUb0JlSW5SZWN0Iiwic291cmNlSW5QYXJlbnRSZWN0Iiwic291cmNlSW5QYXJlbnRQYWNrIiwicGFzc0p1ZGdlTW92ZW1lbnQiLCJhdHRyYWN0UmVzdWx0cyIsInVuYXR0cmFjdFJlc3VsdHMiLCJhdHRyYWN0bW92ZVJlc3VsdHMiLCJkaXNwYXRjaFVuYXR0cmFjdEV2ZW50cyIsInNvdXJjZU5leHRSZWN0IiwidW5hdHRyYWN0UmVzdWx0IiwidGFyZ2V0RWxlbSIsInVuYXR0cmFjdGVkRXZlbnREZXRhaWwiLCJidWJibGVzIiwiY2FuY2VsYWJsZSIsImNvbXBvc2VkIiwiZGV0YWlsIiwicG9zaXRpb24iLCJvbkp1ZGdlRGlzdGFuY2VJblBhcmVudCIsInNvdXJjZVJhd1BhY2siLCJzaW5nbGVBdHRyYWN0aW9uVG8iLCJvbkp1ZGdlTXVsdGlEaXN0YW5jZSIsInNvdXJjZUF0dHJhY3Rpb24iLCJtdWx0aUF0dHJhY3Rpb25zVG8iLCJzb3VyY2VBdHRyYWN0aW9uQmVzdCIsInNvdXJjZUF0dHJhY3Rpb25PZmZzZXQiLCJzb3VyY2VBdHRyYWN0aW9uUmVjdCIsInNvdXJjZUF0dHJhY3Rpb25JblBhcmVudE9mZnNldCIsInNvdXJjZUF0dHJhY3Rpb25JblBhcmVudFJlY3QiLCJjdXJyZW50QmVzdFgiLCJjdXJyZW50QmVzdFkiLCJsYXN0VGFyZ2V0WCIsImxhc3RUYXJnZXRZIiwiY3VycmVudFRhcmdldFgiLCJjdXJyZW50VGFyZ2V0WSIsImRpZmZUYXJnZXRZIiwibGFzdEFsaWdubWVudFgiLCJsYXN0QWxpZ25tZW50WSIsImF0dHJhY3RFdmVudERldGFpbCIsIm5leHRSZWN0IiwidW5hdHRyYWN0RXZlbnREZXRhaWwiLCJhdHRyYWN0bW92ZUV2ZW50RGV0YWlsIiwiYXR0cmFjdFJlc3VsdCIsImF0dHJhY3RlZEV2ZW50RGV0YWlsIiwiYXR0cmFjdG1vdmVSZXN1bHQiLCJhdHRyYWN0ZWRtb3ZlRXZlbnREZXRhaWwiLCJkaXNwYXRjaEF0dHJhY3Rtb3ZlRXZlbnRzIiwiZXZlbnQiLCJjbGllbnRYIiwiY2xpZW50WSIsIkVWRU5UX0RSQUdfU1RBUlQiLCJFVkVOVF9EUkFHX01PVkUiLCJFVkVOVF9EUkFHX0VORCIsInJlc2V0TWFnbmV0Q2FjaGVzIiwibWFnbmV0IiwicmVzZXRNYWduZXRSZWN0IiwicmVzZXRQYXJlbnRQYWNrIiwicmVzZXRUYXJnZXRNYWduZXRQYWNrcyIsIm1vdmVMaXN0ZW5lciIsInN0YXJ0UG9pbnQiLCJzdGFydExhc3RPZmZzZXQiLCJtb3ZlUG9pbnQiLCJtYWduZXRSZWN0IiwidGFyZ2V0TWFnbmV0UGFja3MiLCJqdWRnZU1hZ25ldE1vdmVtZW50IiwiYXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb24iLCJqdWRnZU1hZ25ldERpc3RhbmNlIiwianVkZ2VNYWduZXREaXN0YW5jZUluUGFyZW50IiwianVkZ2VNYWduZXRBdHRyYWN0aW9uIiwibmV4dFNvdXJjZVBhY2siLCJtb3ZlRXZlbnREZXRhaWwiLCJzZXRNYWduZXRPZmZzZXQiLCJzdGFydExpc3RlbmVyIiwiZ2V0RXZlbnRYWSIsImlzTW92aW5nIiwic3RhcnRFdmVudERldGFpbCIsImxhc3RNb3ZlUG9pbnQiLCJkcmFnTW92ZUhhbmRsZXIiLCJiaW5kIiwibGFzdE9mZnNldCIsImRyYWdNb3ZlTGlzdGVuZXIiLCJldnQiLCJhdHRyaWJ1dGVPYnNlcnZlciIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJkcmFnRW5kTGlzdGVuZXIiLCJzdHlsZSIsInJlbW92ZVByb3BlcnR5IiwiZGlzY29ubmVjdCIsInNldFByb3BlcnR5IiwiRGF0ZSIsIm5vdyIsInByZXZlbnREZWZhdWx0Iiwib2JzZXJ2ZSIsImF0dHJpYnV0ZXMiLCJhdHRyaWJ1dGVGaWx0ZXIiLCJjaGVja0RyYWdMaXN0ZW5lcnMiLCJyZW1vdmVCYXNpY0RyYWdMaXN0ZW5lcnMiLCJhZGRCYXNpY0RyYWdMaXN0ZW5lcnMiLCJTdHlsZSIsInJlY3RDYWNoZSIsInBhcmVudFBhY2tDYWNoZSIsInRhcmdldE1hZ25ldFBhY2tzQ2FjaGUiLCJnZXRBdHRyYWN0YWJsZU1hZ25ldHMiLCJnZXRPdGhlck1hZ25ldHMiLCJmcm9tIiwicXVlcnlTZWxlY3RvckFsbCIsImhhc0dyb3VwIiwic2VsZWN0b3IiLCJjb250YWlucyIsImp1ZGdlRGlzdGFuY2UiLCJqdWRnZURpc3RhbmNlT3B0aW9ucyIsImp1ZGdlRGlzdGFuY2VJblBhcmVudCIsImp1ZGdlQXR0cmFjdGlvbiIsImp1ZGdlTW92ZW1lbnQiLCJyYXdEaXN0YW5jZVRvIiwiZGlzdGFuY2VUbyIsImF0dHJhY3Rpb25UbyIsImF0dHJhY3Rpb25Ub1BhcmVudCIsInBhcmVudEF0dHJhY3Rpb24iLCJwcm90b3R5cGUiLCJjYWxsIiwiZ2V0TWFnbmV0QXR0cmFjdGlvblJlc3VsdE9mUG9zaXRpb24iLCJhcmcwIiwiYXJnMSIsImFyZzIiLCJyZXN1bHQiLCJsYXN0TWFnbmV0T2Zmc2V0Iiwib2Zmc2V0UGFyZW50IiwicmVzZXRNYWduZXRPZmZzZXQiLCJkeCIsImR5Iiwib2Zmc2V0Iiwic3R5bGVzIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImJveFNpemluZyIsImZpbmFsV2lkdGgiLCJwYXJzZUZsb2F0IiwiZmluYWxIZWlnaHQiLCJwYWRkaW5nVG9wIiwicGFkZGluZ1JpZ2h0IiwicGFkZGluZ0JvdHRvbSIsInBhZGRpbmdMZWZ0IiwiYm9yZGVyVG9wV2lkdGgiLCJib3JkZXJSaWdodFdpZHRoIiwiYm9yZGVyQm90dG9tV2lkdGgiLCJib3JkZXJMZWZ0V2lkdGgiLCJib3JkZXJUb3AiLCJib3JkZXJSaWdodCIsImJvcmRlckJvdHRvbSIsInJlbGF0aXZlT2Zmc2V0Iiwic2V0TWFnbmV0UG9zaXRpb24iLCJvcmlnaW4iLCJiZXN0QXR0cmFjdGlvbiJdLCJzb3VyY2VSb290IjoiIn0=