@citolab/qti-components 6.9.1-1 → 6.9.1-11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/custom-elements.json +76 -76
- package/dist/index.js +70 -51
- package/dist/item.css +13 -2
- package/dist/qti-components/index.d.ts +13 -2
- package/dist/qti-components/index.js +99 -80
- package/package.json +11 -12
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import{a as f,b as
|
|
1
|
+
import{a as f,b as y,c as i,d as Lt}from"../chunk-H4VLZ2F7.js";import{provide as lr}from"@lit/context";import{LitElement as cr,html as pr}from"lit";import{customElement as dr,property as W}from"lit/decorators.js";function b(l,s){let e=f({waitUntilFirstUpdate:!1},s);return(t,r)=>{let{update:n}=t,o=Array.isArray(l)?l:[l];t.update=function(a){o.forEach(c=>{let p=c;if(a.has(p)){let d=a.get(p),m=this[p];d!==m&&(!e.waitUntilFirstUpdate||this.hasUpdated)&&this[r](d,m)}}),n.call(this,a)}}}import{createContext as ar}from"@lit/context";var St=[{identifier:"completionStatus",cardinality:"single",baseType:"string",value:"unknown",type:"outcome"},{identifier:"numAttempts",cardinality:"single",baseType:"integer",value:"0",type:"response"}],M=ar("item");var _=class extends cr{constructor(){super();this.identifier="";this.adaptive="false";this.timeDependent="false";this._handleDisabledChange=(e,t)=>{this._interactionElements.forEach(r=>r.disabled=t)};this._handleReadonlyChange=(e,t)=>this._interactionElements.forEach(r=>r.readonly=t);this._context={identifier:this.getAttribute("identifier"),variables:St};this._initialContext=y(f({},this._context),{variables:this._context.variables});this._feedbackElements=[];this._interactionElements=[];this.addEventListener("qti-register-variable",e=>{this._context=y(f({},this._context),{variables:[...this._context.variables,e.detail.variable]}),this._initialContext=this._context,e.stopPropagation()}),this.addEventListener("qti-register-feedback",e=>{e.stopPropagation();let t=e.detail;this._feedbackElements.push(t),t.checkShowFeedback(t.outcomeIdentifier)}),this.addEventListener("qti-register-interaction",e=>{e.stopPropagation(),this._interactionElements.push(e.target)}),this.addEventListener("end-attempt",e=>{let{responseIdentifier:t,countAttempt:r}=e.detail;this.updateResponseVariable(t,"true"),this.processResponse(r)}),this.addEventListener("qti-set-outcome-value",e=>{let{outcomeIdentifier:t,value:r}=e.detail;this.updateOutcomeVariable(t,r),e.stopPropagation()}),this.addEventListener("qti-interaction-response",this.handleUpdateResponseVariable)}get variables(){return this._context.variables.map(e=>({identifier:e.identifier,value:e.value,type:e.type}))}set variables(e){if(!Array.isArray(e)||e.some(t=>!("identifier"in t))){console.warn("variables property should be an array of VariableDeclaration");return}this._context=y(f({},this._context),{variables:this._context.variables.map(t=>{let r=e.find(n=>n.identifier===t.identifier);return r?f(f({},t),r):t})}),this._context.variables.forEach(t=>{if(t.type==="response"){let r=this._interactionElements.find(n=>n.responseIdentifier===t.identifier);r&&(r.response=t.value)}t.type==="outcome"&&this._feedbackElements.forEach(r=>r.checkShowFeedback(t.identifier))})}async connectedCallback(){super.connectedCallback(),await this.updateComplete,this._emit("qti-assessment-item-connected",this)}set responses(e){if(e)for(let t of e){this.getResponse(t.responseIdentifier)&&this.updateResponseVariable(t.responseIdentifier,t.response);let n=this._interactionElements.find(o=>o.getAttribute("response-identifier")===t.responseIdentifier);n&&(n.response=t.response)}}render(){return pr`<slot></slot>`}showCorrectResponse(e){let r=this._context.variables.filter(n=>"correctResponse"in n&&n.correctResponse).map(n=>({responseIdentifier:n.identifier,response:n.correctResponse}));for(let n of r){let o=this._interactionElements.find(a=>a.getAttribute("response-identifier")===n.responseIdentifier);o&&(o.correctResponse=e?n.response:"")}}processResponse(e=!0){var r;let t=this.querySelector("qti-response-processing");return!t||!t.process?!1:(t.process(),this.adaptive==="false"&&this.updateOutcomeVariable("completionStatus",this._getCompletionStatus()),e&&this.updateOutcomeVariable("numAttempts",(+((r=this._context.variables.find(n=>n.identifier==="numAttempts"))==null?void 0:r.value)+1).toString()),this._emit("qti-response-processed"),!0)}resetResponses(){this._context=this._initialContext}getResponse(e){return this.getVariable(e)}getOutcome(e){return this.getVariable(e)}getVariable(e){return this._context.variables.find(t=>t.identifier===e)||null}handleUpdateResponseVariable(e){let{responseIdentifier:t,response:r}=e.detail;this.updateResponseVariable(t,r)}updateResponseVariable(e,t){this._context=y(f({},this._context),{variables:this._context.variables.map(r=>r.identifier!==e?r:y(f({},r),{value:t}))}),this._emit("qti-interaction-changed",{item:this.identifier,responseIdentifier:e,response:Array.isArray(t)?[...t]:t}),this.adaptive==="false"&&this.updateOutcomeVariable("completionStatus",this._getCompletionStatus())}updateOutcomeVariable(e,t){var n;let r=this.getOutcome(e);if(!r){console.warn(`Can not set qti-outcome-identifier: ${e}, it is not available`);return}this._context=y(f({},this._context),{variables:this._context.variables.map(o=>o.identifier!==e?o:y(f({},o),{value:r.cardinality==="single"?t:[...o.value,t]}))}),this._feedbackElements.forEach(o=>o.checkShowFeedback(e)),this._emit("qti-outcome-changed",{item:this.identifier,outcomeIdentifier:e,value:(n=this._context.variables.find(o=>o.identifier===e))==null?void 0:n.value})}_getCompletionStatus(){return this._interactionElements.every(e=>e.validate())?"completed":this._interactionElements.some(e=>e.validate())?"incomplete":"not_attempted"}_emit(e,t=null){this.dispatchEvent(new CustomEvent(e,{bubbles:!0,composed:!0,detail:t}))}};i([W({type:String})],_.prototype,"title",2),i([W({type:String})],_.prototype,"identifier",2),i([W({type:String})],_.prototype,"adaptive",2),i([W({type:String})],_.prototype,"timeDependent",2),i([W({type:Boolean})],_.prototype,"disabled",2),i([b("disabled",{waitUntilFirstUpdate:!0})],_.prototype,"_handleDisabledChange",2),i([W({type:Boolean})],_.prototype,"readonly",2),i([b("readonly",{waitUntilFirstUpdate:!0})],_.prototype,"_handleReadonlyChange",2),i([lr({context:M})],_.prototype,"_context",2),_=i([dr("qti-assessment-item")],_);import{LitElement as ur}from"lit";import{customElement as mr,property as Nt}from"lit/decorators.js";var z=class extends ur{constructor(){super(...arguments);this.identifier="";this.href=""}async connectedCallback(){super.connectedCallback();let e=new Event("qti-assessment-stimulus-ref-connected",{cancelable:!0,bubbles:!0});if(this.dispatchEvent(e)){let n=this.closest("qti-assessment-item").querySelector(`[data-stimulus-idref=${this.identifier}]`);n?await this.loadAndAppendStimulus(n):console.warn(`Stimulus with data-stimulus-idref ${this.identifier} not found`)}}async loadAndAppendStimulus(e){let t=this.href.substring(0,this.href.lastIndexOf("/")),r=await Lt().load(this.href).then(n=>n.path(t).htmldoc());if(r){let n=r.querySelectorAll("qti-stimulus-body, qti-stylesheet");e.append(...n)}}};i([Nt({type:String})],z.prototype,"identifier",2),i([Nt({type:String})],z.prototype,"href",2),z=i([mr("qti-assessment-stimulus-ref")],z);import{LitElement as hr,html as fr}from"lit";import{property as oe}from"lit/decorators.js";var gr={SPACE:32},C=class extends hr{constructor(){super(...arguments);this.tabindex=0;this.disabled=!1;this.readonly=!1;this.checked=!1}handleDisabledChange(e,t){t?(this.tabindex=void 0,this.blur()):this.tabIndex=0}connectedCallback(){super.connectedCallback(),this.addEventListener("keyup",this._onKeyUp),this.addEventListener("click",this._onClick),this.dispatchEvent(new CustomEvent("qti-register-choice",{bubbles:!0,cancelable:!1,composed:!0}))}disconnectedCallback(){this.removeEventListener("keyup",this._onKeyUp),this.removeEventListener("click",this._onClick),this.dispatchEvent(new CustomEvent("qti-loose-choice",{bubbles:!0,cancelable:!1,composed:!0}))}reset(){this.checked=!1,this.disabled=!1}_onKeyUp(e){if(!e.altKey)switch(e.keyCode){case gr.SPACE:e.preventDefault(),this._toggleChecked();break;default:}}_onClick(){this._toggleChecked()}_toggleChecked(){this.disabled||this.readonly||(this.checked=!this.checked,this.dispatchEvent(new CustomEvent("qti-choice-element-selected",{bubbles:!0,cancelable:!1,composed:!0,detail:{identifier:this.identifier,checked:this.checked}})))}validateAllProps(){return!!this.getAttribute("identifier")}render(){return this.validateAllProps()||console.warn(`Invalid props for ${this.outerHTML}`,"missing identifier"),fr` <slot></slot> `}};i([oe({type:String})],C.prototype,"identifier",2),i([oe({type:Number,reflect:!0})],C.prototype,"tabindex",2),i([oe({reflect:!0,type:Boolean,attribute:"aria-disabled",converter:{toAttribute:e=>e}})],C.prototype,"disabled",2),i([oe({reflect:!0,type:Boolean,attribute:"aria-readonly",converter:{toAttribute:e=>e}})],C.prototype,"readonly",2),i([oe({reflect:!0,type:Boolean,attribute:"aria-checked",converter:{toAttribute:e=>e}})],C.prototype,"checked",2),i([b("disabled",{waitUntilFirstUpdate:!0})],C.prototype,"handleDisabledChange",1);import{customElement as vr}from"lit/decorators.js";import{html as yr,LitElement as xr}from"lit";import{css as br}from"lit";var Ht=br`
|
|
2
2
|
:host {
|
|
3
3
|
display: block;
|
|
4
4
|
}
|
|
5
|
-
`;var J=class extends
|
|
5
|
+
`;var J=class extends xr{render(){return yr`<slot name="qti-rubric-block"></slot><slot></slot>`}};J.styles=Ht,J=i([vr("qti-item-body")],J);import{html as Er,LitElement as qr}from"lit";import{customElement as Cr}from"lit/decorators.js";var Ae=class extends qr{render(){return Er`<slot></slot>`}connectedCallback(){this.parentElement.tagName.endsWith("INTERACTION")&&this.setAttribute("slot","prompt")}};Ae=i([Cr("qti-prompt")],Ae);import{LitElement as _r}from"lit";import{customElement as wr}from"lit/decorators.js";var Me=class extends _r{firstUpdated(s){super.firstUpdated(s);let e=this,t=this.getAttribute("href");if(t!==null){let r=document.createElement("link");r.rel="stylesheet",r.type="text/css",r.media="screen",r.href=t,e.appendChild(r),this.styleLink=r}if(this.textContent!==null){let r=document.createElement("style");r.media="screen",r.textContent=this.textContent,e.appendChild(r),this.styleLink=r}}disconnectedCallback(){if(this.styleLink)try{this.styleLink.remove()}catch(s){console.log("could not remove stylesheet")}}};Me=i([wr("qti-stylesheet")],Me);import{consume as Ar}from"@lit/context";import{css as Mr,html as Lr}from"lit";import{customElement as Sr,property as Le,state as Nr}from"lit/decorators.js";import{html as kr,LitElement as Tr}from"lit";import{customElement as Rr}from"lit/decorators.js";var U=class extends Tr{render(){return kr`<slot></slot>`}defaultValues(s){let e=Array.from(this.querySelectorAll("qti-default-value > qti-value"));if(e.length===0)return null;let t=e.map(r=>r.innerHTML);return t.length>1||s.cardinality==="multiple"||s.cardinality==="ordered"?t:t[0]}};U=i([Rr("qti-variabledeclaration")],U);var L=class extends U{render(){var e,t;let s=(t=(e=this.itemContext)==null?void 0:e.variables.find(r=>r.identifier===this.identifier))==null?void 0:t.value;return Lr`${JSON.stringify(s,null,2)}`}get interpolationTable(){let s=this.querySelector("qti-interpolation-table");if(s){let e=new Map;for(let t of s.querySelectorAll("qti-interpolation-table-entry")){!t.getAttribute("source-value")&&t.getAttribute("target-value")&&console.error("source-value or target-value is missing in qti-interpolation-table-entry");let r=parseInt(t.getAttribute("source-value")),n=parseInt(t.getAttribute("target-value"));(isNaN(r)||isNaN(n))&&console.error("source-value or target-value is not a number in qti-interpolation-table-entry"),e.set(r,n)}return e}return null}connectedCallback(){super.connectedCallback();let s={identifier:this.identifier,cardinality:this.cardinality,baseType:this.baseType,type:"outcome",value:null,interpolationTable:this.interpolationTable};s.value=this.defaultValues(s),this.dispatchEvent(new CustomEvent("qti-register-variable",{bubbles:!0,composed:!0,detail:{variable:s}}))}};L.styles=[Mr`
|
|
6
6
|
:host {
|
|
7
7
|
display: none;
|
|
8
8
|
}
|
|
9
|
-
`],
|
|
9
|
+
`],i([Le({type:String,attribute:"base-type"})],L.prototype,"baseType",2),i([Le({type:String,attribute:"external-scored"})],L.prototype,"externalScored",2),i([Le({type:String})],L.prototype,"identifier",2),i([Le({type:String})],L.prototype,"cardinality",2),i([Ar({context:M,subscribe:!0}),Nr()],L.prototype,"itemContext",2),L=i([Sr("qti-outcome-declaration")],L);import{consume as Hr}from"@lit/context";import{css as Vr,html as $r}from"lit";import{customElement as Dr,property as Ze,state as Or}from"lit/decorators.js";var P=class extends U{render(){var e,t;let s=(t=(e=this.itemContext)==null?void 0:e.variables.find(r=>r.identifier===this.identifier))==null?void 0:t.value;return $r`${JSON.stringify(s,null,2)}`}connectedCallback(){super.connectedCallback();let s={baseType:this.baseType,identifier:this.identifier,correctResponse:this.correctResponse,cardinality:this.cardinality||"single",mapping:this.mapping,value:null,type:"response",candidateResponse:null};s.value=this.defaultValues(s),this.dispatchEvent(new CustomEvent("qti-register-variable",{bubbles:!0,composed:!0,detail:{variable:s}}))}get correctResponse(){let s,e=this.querySelector("qti-correct-response");if(e){let t=e.querySelectorAll("qti-value");if(this.cardinality==="single"&&t.length>0)s=t[0].textContent,t[0].remove();else if(this.cardinality!=="single"){s=[];for(let r=0;r<t.length;r++)s.push(t[r].textContent),t[r].remove()}}return s}get mapping(){return this.querySelector("qti-mapping")}};P.styles=[Vr`
|
|
10
10
|
:host {
|
|
11
11
|
display: none;
|
|
12
12
|
}
|
|
13
|
-
`],
|
|
13
|
+
`],i([Ze({type:String,attribute:"base-type"})],P.prototype,"baseType",2),i([Ze({type:String})],P.prototype,"identifier",2),i([Ze({type:String})],P.prototype,"cardinality",2),i([Hr({context:M,subscribe:!0}),Or()],P.prototype,"itemContext",2),P=i([Dr("qti-response-declaration")],P);import{LitElement as Pr}from"lit";import{customElement as Ur}from"lit/decorators.js";var Se=class extends Pr{};Se=i([Ur("qti-companion-materials-info")],Se);import{LitElement as Fr,html as Ir}from"lit";import{customElement as Br}from"lit/decorators.js";var Ne=class extends Fr{render(){return Ir`<slot></slot>`}};Ne=i([Br("qti-content-body")],Ne);import{LitElement as Xr,css as Yr,html as jr}from"lit";import{customElement as Kr,property as He}from"lit/decorators.js";var S=class extends Xr{handleclassNamesChange(s,e){this.classNames.split(" ").forEach(r=>{switch(r){case"qti-rubric-discretionary-placement":this.setAttribute("slot","qti-rubric-block");break;case"qti-rubric-inline":this.setAttribute("slot","");break;default:break}})}render(){return jr`<slot></slot>`}connectedCallback(){super.connectedCallback(),this.setAttribute("slot","qti-rubric-block")}};S.styles=Yr`
|
|
14
14
|
:host {
|
|
15
15
|
display: block;
|
|
16
16
|
}
|
|
17
|
-
`,
|
|
17
|
+
`,i([He({type:String})],S.prototype,"id",2),i([He({type:String})],S.prototype,"use",2),i([He({type:String})],S.prototype,"view",2),i([He({type:String,attribute:"class"})],S.prototype,"classNames",2),i([b("classNames",{waitUntilFirstUpdate:!0})],S.prototype,"handleclassNamesChange",1),S=i([Kr("qti-rubric-block")],S);import{css as Jr,html as Zr}from"lit";import{customElement as Gr}from"lit/decorators.js";import{LitElement as zr}from"lit";import{property as Ve}from"lit/decorators.js";var Wr=()=>new Intl.NumberFormat().format(.1).replace(/\d/g,""),ne=l=>{if(typeof l=="string")return l;let s=Wr();return s==="."?l.toLocaleString():l.toString().replace(".","").replace(s,".")};function Ge(l){return l==null}function ae(l){return l.replace(/([^:]\/)\/+/g,"$1").replace(/\/\//g,"/").replace("http:/","http://").replace("https:/","https://")}var w=class extends zr{connectedCallback(){super.connectedCallback(),this.dispatchEvent(new CustomEvent("qti-register-feedback",{bubbles:!0,composed:!0,detail:this}))}checkShowFeedback(s){let e=this.closest("qti-assessment-item").getOutcome(s);if(this.outcomeIdentifier!==s||!e)return;let t=!1;Array.isArray(e.value)?t=e.value.includes(this.identifier):t=!Ge(this.identifier)&&!Ge(e==null?void 0:e.value)&&this.identifier===e.value||!1,this.showFeedback(t)}showFeedback(s){this.showStatus=s&&this.showHide==="show"||!s&&this.showHide==="hide"?"on":"off"}};i([Ve({type:String,attribute:"show-hide"})],w.prototype,"showHide",2),i([Ve({type:String,attribute:"outcome-identifier"})],w.prototype,"outcomeIdentifier",2),i([Ve({type:String})],w.prototype,"identifier",2),i([Ve({type:String,attribute:!1})],w.prototype,"showStatus",2);var le=class extends w{render(){return Zr` <slot part="feedback" class="feedback ${this.showStatus}"></slot> `}firstUpdated(s){this.checkShowFeedback(this.outcomeIdentifier)}};le.styles=Jr`
|
|
18
18
|
:host {
|
|
19
19
|
display: block;
|
|
20
20
|
}
|
|
@@ -24,21 +24,21 @@ import{a as f,b as x,c as s,d as At}from"../chunk-H4VLZ2F7.js";import{provide as
|
|
|
24
24
|
.off {
|
|
25
25
|
display: none;
|
|
26
26
|
}
|
|
27
|
-
`,le=
|
|
27
|
+
`,le=i([Gr("qti-feedback-block")],le);import{css as Qr,html as es}from"lit";import{customElement as ts}from"lit/decorators.js";var ce=class extends w{constructor(){super(...arguments);this.render=()=>es` <slot part="feedback" class="${this.showStatus}"></slot> `}};ce.styles=Qr`
|
|
28
28
|
.on {
|
|
29
29
|
display: inline-block;
|
|
30
30
|
}
|
|
31
31
|
.off {
|
|
32
32
|
display: none;
|
|
33
33
|
}
|
|
34
|
-
`,ce=
|
|
34
|
+
`,ce=i([ts("qti-feedback-inline")],ce);import{css as rs,html as ss}from"lit";import{customElement as is}from"lit/decorators.js";var pe=class extends w{constructor(){super(...arguments);this.render=()=>ss` <slot part="feedback" class="${this.showStatus}"></slot> `}};pe.styles=rs`
|
|
35
35
|
.on {
|
|
36
36
|
display: inline-block;
|
|
37
37
|
}
|
|
38
38
|
.off {
|
|
39
39
|
display: none;
|
|
40
40
|
}
|
|
41
|
-
`,pe=
|
|
41
|
+
`,pe=i([is("qti-modal-feedback")],pe);import{css as ns,html as as}from"lit";import{ifDefined as et}from"lit/directives/if-defined.js";import{property as Qe}from"lit/decorators.js";import{LitElement as os}from"lit";var h=class extends os{constructor(){super(...arguments);this.responseIdentifier="";this.disabled=!1;this.readonly=!1}set correctResponse(e){console.warn("correctResponse is not implemented")}connectedCallback(){super.connectedCallback(),this.dispatchEvent(new CustomEvent("qti-register-interaction",{bubbles:!0,cancelable:!1,composed:!0}))}saveResponse(e){this.dispatchEvent(new CustomEvent("qti-interaction-response",{bubbles:!0,cancelable:!1,composed:!0,detail:{responseIdentifier:this.responseIdentifier,response:Array.isArray(e)?[...e]:e}}))}};i([Qe({attribute:"response-identifier"})],h.prototype,"responseIdentifier",2),i([Qe({reflect:!0,type:Boolean})],h.prototype,"disabled",2),i([Qe({reflect:!0,type:Boolean})],h.prototype,"readonly",2);import{ref as ls,createRef as cs}from"lit/directives/ref.js";import{customElement as ps,property as $e,state as ds}from"lit/decorators.js";var N=class extends h{constructor(){super(...arguments);this.textareaRef=cs();this._value=""}handleclassNamesChange(e,t){this.classNames.split(" ").forEach(n=>{if(n.startsWith("qti-height-lines")){let o=n.replace("qti-height-lines-","");this.textareaRef&&(this.textareaRef.value.rows=parseInt(o))}})}set response(e){this._value=e!==void 0?e:""}validate(){return this._value!==""}static get styles(){return[ns`
|
|
42
42
|
/* PK: display host as block, else design will be collapsed */
|
|
43
43
|
:host {
|
|
44
44
|
display: block;
|
|
@@ -49,10 +49,10 @@ import{a as f,b as x,c as s,d as At}from"../chunk-H4VLZ2F7.js";import{provide as
|
|
|
49
49
|
height: 100%;
|
|
50
50
|
border: 0;
|
|
51
51
|
}
|
|
52
|
-
`]}render(){return
|
|
52
|
+
`]}render(){return as`<slot name="prompt"></slot
|
|
53
53
|
><textarea
|
|
54
54
|
part="textarea"
|
|
55
|
-
${
|
|
55
|
+
${ls(this.textareaRef)}
|
|
56
56
|
spellcheck="false"
|
|
57
57
|
autocomplete="off"
|
|
58
58
|
@keydown="${e=>e.stopImmediatePropagation()}"
|
|
@@ -64,13 +64,12 @@ import{a as f,b as x,c as s,d as At}from"../chunk-H4VLZ2F7.js";import{provide as
|
|
|
64
64
|
?disabled="${this.disabled}"
|
|
65
65
|
?readonly="${this.readonly}"
|
|
66
66
|
.value=${this._value}
|
|
67
|
-
></textarea>`}textChanged(e){if(this.disabled||this.readonly)return;let t=e.target;this.setEmptyAttribute(t.value),this._value!==t.value&&(this._value=t.value,this.saveResponse(t.value))}reset(){this._value=""}setEmptyAttribute(e){this.setAttribute("empty",e===""?"true":"false")}};
|
|
67
|
+
></textarea>`}textChanged(e){if(this.disabled||this.readonly)return;let t=e.target;this.setEmptyAttribute(t.value),this._value!==t.value&&(this._value=t.value,this.saveResponse(t.value))}reset(){this._value=""}setEmptyAttribute(e){this.setAttribute("empty",e===""?"true":"false")}};i([$e({type:Number,attribute:"expected-length"})],N.prototype,"expectedLength",2),i([$e({type:String,attribute:"pattern-mask"})],N.prototype,"patternMask",2),i([$e({type:String,attribute:"placeholder-text"})],N.prototype,"placeholderText",2),i([ds()],N.prototype,"_value",2),i([$e({type:String,attribute:"class"})],N.prototype,"classNames",2),i([b("classNames",{waitUntilFirstUpdate:!0})],N.prototype,"handleclassNamesChange",1),N=i([ps("qti-extended-text-interaction")],N);import{css as us,html as ms}from"lit";import{customElement as hs,property as De,state as tt}from"lit/decorators.js";import{ifDefined as $t}from"lit/directives/if-defined.js";import{createRef as fs}from"lit/directives/ref.js";function Vt(l,s){let e,t=f({},s);return(r,n)=>{let{connectedCallback:o,disconnectedCallback:a}=r;r.connectedCallback=function(){var d;o.call(this);let c=m=>{let x=Array.from(this.querySelectorAll(l));for(let g of m){let A=Array.from(g.addedNodes).map(Y=>Y),v=Array.from(g.addedNodes).map(Y=>Y);g.type==="childList"&&A.find(Y=>x.includes(Y))&&this[n](A,v)}};e=new MutationObserver(c),e.observe(this,{childList:!0,subtree:!0});let p=(d=this.querySelectorAll(l))!=null?d:[];this[n](Array.from(p),[])},r.disconnectedCallback=function(){a.call(this),e.disconnect()}}}var k=class extends h{constructor(){super(...arguments);this._value="";this._correctValue="";this._size=5;this.inputRef=fs()}handleclassNamesChange(e,t){t.split(" ").forEach(n=>{if(n.startsWith("qti-input-width")){let o=n.replace("qti-input-width-","");this._size=parseInt(o)}})}set response(e){this._value=e!==void 0?e:""}validate(){return this._value!==""}static get styles(){return[us`
|
|
68
68
|
[part='correct'] {
|
|
69
69
|
position: absolute;
|
|
70
70
|
width: 100%;
|
|
71
71
|
}
|
|
72
|
-
`]}set correctResponse(e){this._correctValue=e}render(){return
|
|
73
|
-
<div part="correct">${this._correctValue}</div>
|
|
72
|
+
`]}set correctResponse(e){this._correctValue=e}render(){return ms`
|
|
74
73
|
<input
|
|
75
74
|
part="input"
|
|
76
75
|
spellcheck="false"
|
|
@@ -79,36 +78,37 @@ import{a as f,b as x,c as s,d as At}from"../chunk-H4VLZ2F7.js";import{provide as
|
|
|
79
78
|
@keyup="${this.textChanged}"
|
|
80
79
|
@change="${this.textChanged}"
|
|
81
80
|
type="${this.patternMask=="[0-9]*"?"number":"text"}"
|
|
82
|
-
placeholder="${
|
|
81
|
+
placeholder="${$t(this.placeholderText?this.placeholderText:void 0)}"
|
|
83
82
|
.value="${this._value}"
|
|
84
83
|
size="${this._size}"
|
|
85
|
-
pattern="${
|
|
84
|
+
pattern="${$t(this.patternMask?this.patternMask:void 0)}"
|
|
86
85
|
?disabled="${this.disabled}"
|
|
87
86
|
?readonly="${this.readonly}"
|
|
88
87
|
/>
|
|
89
|
-
|
|
88
|
+
<div part="correct">${this._correctValue}</div>
|
|
89
|
+
`}textChanged(e){if(this.disabled||this.readonly)return;let t=e.target;this.setEmptyAttribute(t.value),this._value!==t.value&&(this._value=t.value,this.saveResponse(t.value))}reset(){this._value=""}setEmptyAttribute(e){this.setAttribute("empty",e===""?"true":"false")}};i([De({type:Number,attribute:"expected-length"})],k.prototype,"expectedLength",2),i([De({type:String,attribute:"pattern-mask"})],k.prototype,"patternMask",2),i([De({type:String,attribute:"placeholder-text"})],k.prototype,"placeholderText",2),i([tt()],k.prototype,"_value",2),i([tt()],k.prototype,"_correctValue",2),i([tt()],k.prototype,"_size",2),i([De({type:String,attribute:"class"})],k.prototype,"classNames",2),i([b("classNames")],k.prototype,"handleclassNamesChange",1),k=i([hs("qti-text-entry-interaction")],k);import{html as gs}from"lit";import{customElement as bs}from"lit/decorators.js";import{property as Dt}from"lit/decorators.js";var E=class extends h{constructor(){super();this._choiceElements=[];this.minChoices=0;this.maxChoices=1;this._handleDisabledChange=(e,t)=>this._choiceElements.forEach(r=>r.disabled=t);this._handleReadonlyChange=(e,t)=>this._choiceElements.forEach(r=>r.readonly=t);this._handleMaxChoicesChange=()=>this._determineInputType();this.addEventListener("qti-register-choice",this._registerChoiceElement),this.addEventListener("qti-loose-choice",this._looseChoiceElement)}validate(){return this._choiceElements.reduce((t,r)=>t+(r.checked?1:0),0)>=this.minChoices}set response(e){let t=Array.isArray(e)?e:[e];this._choiceElements.forEach(r=>{r.checked=!!t.find(n=>n===r.identifier)})}set correctResponse(e){let t=Array.isArray(e)?e:[e];if(e==""){this._choiceElements.forEach(r=>{r.removeAttribute("data-correct-response")});return}this._choiceElements.forEach(r=>{r.setAttribute("data-correct-response",t.find(n=>n===r.identifier)?"true":"false")})}connectedCallback(){super.connectedCallback(),this.addEventListener("qti-choice-element-selected",this._choiceElementSelectedHandler)}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener("qti-choice-element-selected",this._choiceElementSelectedHandler),this.removeEventListener("qti-register-choice",this._registerChoiceElement)}_registerChoiceElement(e){e.stopPropagation();let t=e.target;this._choiceElements.push(t),this._setInputType(t)}_looseChoiceElement(e){e.stopPropagation();let t=e.target;this._choiceElements.push(t),this._choiceElements=this._choiceElements.filter(r=>r!==t)}_determineInputType(){this._choiceElements.forEach(e=>{this._setInputType(e)})}_setInputType(e){this.maxChoices===1?e.setAttribute("role","radio"):e.setAttribute("role","checkbox")}_choiceElementSelectedHandler(e){this.maxChoices===1&&this._choiceElements.filter(t=>t.identifier!==e.detail.identifier).forEach(t=>{t.checked=!1}),this._choiceElementSelected()}_choiceElementSelected(){let e=this._choiceElements.filter(r=>r.checked).map(r=>r.identifier);this.maxChoices>1&&(this.maxChoices===e.length?this._choiceElements.forEach(r=>r.disabled=!r.checked):this._choiceElements.forEach(r=>r.disabled=!1));let t;this.maxChoices===1?t=e.length>0?e[0]:void 0:t=e,this.saveResponse(t)}};i([Dt({type:Number,attribute:"min-choices"})],E.prototype,"minChoices",2),i([Dt({type:Number,attribute:"max-choices"})],E.prototype,"maxChoices",2),i([b("disabled",{waitUntilFirstUpdate:!0})],E.prototype,"_handleDisabledChange",2),i([b("readonly",{waitUntilFirstUpdate:!0})],E.prototype,"_handleReadonlyChange",2),i([b("maxChoices",{waitUntilFirstUpdate:!0})],E.prototype,"_handleMaxChoicesChange",2);var Oe=class extends E{constructor(){super(...arguments);this.render=()=>gs`<slot></slot>`}connectedCallback(){super.connectedCallback(),this.setAttribute("qti-hottext-interaction","")}};Oe=i([bs("qti-hottext-interaction")],Oe);import{css as vs,html as Ot}from"lit";import{customElement as ys,property as xs,state as Pt}from"lit/decorators.js";import{unsafeHTML as Ut}from"lit/directives/unsafe-html.js";var F=class extends h{constructor(){super(...arguments);this.options=[];this.correctOption="";this.dataPrompt="select"}static get styles(){return[vs`
|
|
90
90
|
:host {
|
|
91
91
|
display: inline-block;
|
|
92
92
|
}
|
|
93
|
-
`]}render(){return
|
|
93
|
+
`]}render(){return Ot`
|
|
94
94
|
<select part="select" @change="${this.choiceSelected}" ?disabled="${this.disabled}" ?readonly="${this.readonly}">
|
|
95
|
-
${this.options.map(e=>
|
|
96
|
-
<option value="${e.value}" ?selected="${e.selected}">${
|
|
95
|
+
${this.options.map(e=>Ot`
|
|
96
|
+
<option value="${e.value}" ?selected="${e.selected}">${Ut(e.textContent)}</option>
|
|
97
97
|
`)}
|
|
98
98
|
</select>
|
|
99
99
|
|
|
100
|
-
${
|
|
101
|
-
`}connectedCallback(){super.connectedCallback(),this.addEventListener("on-dropdown-selected",this.choiceSelected);let e=Array.from(this.querySelectorAll("qti-inline-choice"));this.options=[{textContent:this.dataPrompt,value:"",selected:!1},...e.map(t=>({textContent:t.innerHTML,value:t.getAttribute("identifier"),selected:!1}))]}disconnectedCallback(){this.removeEventListener("on-dropdown-selected",this.choiceSelected)}validate(){let e=this.options.find(t=>t.selected);return e?e.value!=="":!1}reset(){this.options=this.options.map((e,t)=>
|
|
100
|
+
${Ut(this.correctOption)}
|
|
101
|
+
`}connectedCallback(){super.connectedCallback(),this.addEventListener("on-dropdown-selected",this.choiceSelected);let e=Array.from(this.querySelectorAll("qti-inline-choice"));this.options=[{textContent:this.dataPrompt,value:"",selected:!1},...e.map(t=>({textContent:t.innerHTML,value:t.getAttribute("identifier"),selected:!1}))]}disconnectedCallback(){this.removeEventListener("on-dropdown-selected",this.choiceSelected)}validate(){let e=this.options.find(t=>t.selected);return e?e.value!=="":!1}reset(){this.options=this.options.map((e,t)=>y(f({},e),{selected:t===0}))}set response(e){this.options=this.options.map(t=>(e===t.value&&(t.selected=!0),t))}set correctResponse(e){if(e===""){this.correctOption="";return}this.correctOption=`<span part="correct-option">${this.options.find(t=>e===t.value).textContent}</span>`}choiceSelected(e){let t=e.target.value;this.options=this.options.map(r=>y(f({},r),{selected:r.value===t})),this.saveResponse(t)}};F.inputWidthClass=["","qti-input-width-2","qti-input-width-1","qti-input-width-3","qti-input-width-4","qti-input-width-6","qti-input-width-10","qti-input-width-15","qti-input-width-20","qti-input-width-72"],i([Pt()],F.prototype,"options",2),i([Pt()],F.prototype,"correctOption",2),i([xs({attribute:"data-prompt",type:String})],F.prototype,"dataPrompt",2),F=i([ys("qti-inline-choice-interaction")],F);import{customElement as qs,property as Cs}from"lit/decorators.js";import{html as _s}from"lit";import{css as Es}from"lit";var Ft=Es`
|
|
102
102
|
:host {
|
|
103
103
|
display: flex;
|
|
104
104
|
flex-direction: column;
|
|
105
105
|
// align-items: flex-start;
|
|
106
106
|
}
|
|
107
|
-
`;var Z=class extends E{render(){return
|
|
107
|
+
`;var Z=class extends E{render(){return _s` <slot name="prompt"></slot><slot part="slot"></slot>`}};Z.styles=Ft,i([Cs({type:String})],Z.prototype,"orientation",2),Z=i([qs("qti-choice-interaction")],Z);import{css as ws,html as ks,LitElement as Ts}from"lit";import{customElement as Rs}from"lit/decorators.js";var de=class extends Ts{render(){return ks`<slot></slot>`}process(){let s=new rt,e=[...this.children];s.process(e)}};de.styles=[ws`
|
|
108
108
|
:host {
|
|
109
109
|
display: none;
|
|
110
110
|
}
|
|
111
|
-
`],de=
|
|
111
|
+
`],de=i([Rs("qti-outcome-processing")],de);var rt=class{process(s){for(let e of s)e.process()}};import{css as As,html as Ms,LitElement as Ls}from"lit";import{customElement as Ss}from"lit/decorators.js";var It=`<qti-response-processing>
|
|
112
112
|
<qti-response-condition>
|
|
113
113
|
<qti-response-if>
|
|
114
114
|
<qti-match>
|
|
@@ -125,7 +125,7 @@ import{a as f,b as x,c as s,d as At}from"../chunk-H4VLZ2F7.js";import{provide as
|
|
|
125
125
|
</qti-set-outcome-value>
|
|
126
126
|
</qti-response-else>
|
|
127
127
|
</qti-response-condition>
|
|
128
|
-
</qti-response-processing>`,
|
|
128
|
+
</qti-response-processing>`,Bt=`<qti-response-processing>
|
|
129
129
|
<qti-response-condition>
|
|
130
130
|
<qti-response-if>
|
|
131
131
|
<qti-is-null>
|
|
@@ -141,7 +141,7 @@ import{a as f,b as x,c as s,d as At}from"../chunk-H4VLZ2F7.js";import{provide as
|
|
|
141
141
|
</qti-set-outcome-value>
|
|
142
142
|
</qti-response-else>
|
|
143
143
|
</qti-response-condition>
|
|
144
|
-
</qti-response-processing>`,
|
|
144
|
+
</qti-response-processing>`,Xt=`<qti-response-processing>
|
|
145
145
|
<qti-response-condition>
|
|
146
146
|
<qti-response-if>
|
|
147
147
|
<qti-is-null>
|
|
@@ -157,24 +157,24 @@ import{a as f,b as x,c as s,d as At}from"../chunk-H4VLZ2F7.js";import{provide as
|
|
|
157
157
|
</qti-set-outcome-value>
|
|
158
158
|
</qti-response-else>
|
|
159
159
|
</qti-response-condition>
|
|
160
|
-
</qti-response-processing>`;var
|
|
160
|
+
</qti-response-processing>`;var j=class extends Ls{render(){return Ms`<slot></slot>`}process(){let s=[...this.children];for(let e of s)e.process()}firstUpdated(s){if(this.getAttribute("template")){let e=this.getAttribute("template").split("/"),t=e[e.length-1].replace(".xml","");switch(this.innerHTML="",t){case"map_response":{this.appendChild(this.fragmentFromString(Bt).firstElementChild.firstElementChild);break}case"map_response_point":{this.appendChild(this.fragmentFromString(Xt).firstElementChild.firstElementChild);break}case"match_correct":this.appendChild(this.fragmentFromString(It).firstElementChild.firstElementChild);break}}}fragmentFromString(s){return document.createRange().createContextualFragment(s)}};j.styles=[As`
|
|
161
161
|
:host {
|
|
162
162
|
display: none;
|
|
163
163
|
}
|
|
164
|
-
`],
|
|
165
|
-
<slot></slot>`}calculate(){return this.result=this.getResult(),this.result}getResult(){throw new Error("Not implemented")}get assessmentItem(){return this.closest("qti-assessment-item")}};u.styles=
|
|
164
|
+
`],j=i([Ss("qti-response-processing")],j);import{property as $s}from"lit/decorators.js";import{customElement as Ns}from"lit/decorators.js";import{html as Hs,LitElement as Vs}from"lit";var H=class extends Vs{render(){return Hs`<slot></slot>`}process(){throw new Error("Not implemented")}};H=i([Ns("qti-rule")],H);var Pe=class extends H{get childExpression(){return this.firstElementChild}process(){let s=this.getAttribute("identifier"),e=this.closest("qti-assessment-item").getVariable(s),t;return e.interpolationTable&&(t=e.interpolationTable.get(parseInt(this.childExpression.calculate()))),t==null?(console.warn("lookupOutcomeValue: value is null or undefined"),0):(this.dispatchEvent(new CustomEvent("qti-set-outcome-value",{bubbles:!0,composed:!0,detail:{outcomeIdentifier:this.identifier,value:ne(t)}})),t)}};i([$s({type:String})],Pe.prototype,"identifier",2);customElements.define("qti-lookup-outcome-value",Pe);import{html as Ds}from"lit";var st=class extends H{render(){return Ds`<slot></slot>`}process(){let s=[...this.children];for(let e=0;e<s.length;e++){let t=s[e];if(t.calculate()){t.process();return}}}};customElements.define("qti-response-condition",st);var it=class extends H{process(){let s=this.getAttribute("identifier"),e=this.firstElementChild,r=new ot(e).process();this.dispatchEvent(new CustomEvent("qti-set-outcome-value",{bubbles:!0,composed:!0,detail:{outcomeIdentifier:s,value:Array.isArray(r)?r.map(n=>ne(n)):ne(r)}}))}},ot=class{constructor(s){this.expression=s}process(){let s=this.expression?this.expression.calculate():null;if(s==null){console.warn("setOutcomeValue: value is null or undefined");return}return s}};customElements.define("qti-set-outcome-value",it);import{LitElement as Os,html as Ps}from"lit";var ue=class extends Os{render(){return Ps`<slot></slot>`}calculate(){return!0}getSubRules(){return[...this.children]}process(){let s=this.getSubRules();for(let e=0;e<s.length;e++)s[e].process()}};customElements.define("qti-response-else",ue);import{html as Us}from"lit";var me=class extends ue{calculate(){return this.firstElementChild.calculate()}getSubRules(){let s=[];for(let e=1;e<this.children.length;e++)s.push(this.children[e]);return s}};customElements.define("qti-response-if",me);var nt=class extends me{render(){return Us`${super.render()}`}};customElements.define("qti-response-else-if",nt);import{LitElement as Fs,css as Is,html as Bs}from"lit";import{state as Xs}from"lit/decorators.js";var u=class extends Fs{constructor(){super(...arguments);this.getVariables=()=>Array.from(this.children).map(e=>{switch(e.tagName.toLowerCase()){case"qti-base-value":return{baseType:e.getAttribute("base-type"),value:e.textContent,cardinality:"single"};case"qti-variable":{let t=e.getAttribute("identifier")||"";return this.assessmentItem.getVariable(t)}case"qti-multiple":{let r=e.getResult();return r.length>0?{identifier:"",baseType:r[0].baseType,value:r.map(n=>n.value),cardinality:"multiple",type:"response"}:null}case"qti-correct":{let t=e.getAttribute("identifier")||"",r=this.assessmentItem.getResponse(t);return{baseType:r.baseType,value:r.correctResponse,cardinality:r.cardinality}}default:{try{return{baseType:"integer",value:e.getResult().toString(),cardinality:"single"}}catch(t){console.warn("default not sufficient")}return null}}}).filter(e=>e!==null)}render(){return Bs`<pre>${JSON.stringify(this.result,null,2)}</pre>
|
|
165
|
+
<slot></slot>`}calculate(){return this.result=this.getResult(),this.result}getResult(){throw new Error("Not implemented")}get assessmentItem(){return this.closest("qti-assessment-item")}};u.styles=Is`
|
|
166
166
|
slot {
|
|
167
167
|
display: none;
|
|
168
168
|
}
|
|
169
|
-
`,s([Ii()],u.prototype,"result",2);var w=class extends u{calculate(){return this.result=this.getResult(),this.result}getResult(){throw new Error("Not implemented")}};var Ue=class extends Bi(w){calculate(){return this.calculateChildren(Array.from(this.children))}};function Bi(a){return class extends a{calculateChildren(e){return e.map(r=>{let n=r;if(!n.calculate)return console.error("Element doesn't implement QtiConditionExpression"),null;let o=n.calculate();if(typeof o=="string")if(o==="true")o=!0;else if(o==="false")o=!1;else return console.error("unexpected value in qti-and, expected boolean"),null;return o}).every(r=>typeof r=="boolean"&&r)}}}customElements.define("qti-and",Ue);import{property as Xi}from"lit/decorators.js";var Fe=class extends u{constructor(){super(...arguments);this.baseType="string"}getResult(){return this.textContent}};s([Xi({type:String,attribute:"base-type"})],Fe.prototype,"baseType",2);customElements.define("qti-base-value",Fe);var at=class extends w{getResult(){let i=this.getVariables();if(this.children.length===2){let e=i[0],t=i[1];if(e.baseType==="directedPair"&&t.baseType==="directedPair"&&e.cardinality==="multiple"){let r=e.value,n=t.value;return r.filter(c=>n.includes(c)).length>0}else if(e.baseType==="directedPair"&&t.baseType==="directedPair"&&e.cardinality==="single"){let r=e.value;return t.value.includes(r)}else console.error("unsupported baseType or cardinality in qti contains, only baseType: directedPair and cardinality: multiple is supported")}else console.error("unexpected number of children in qti contains");return!1}};customElements.define("qti-contains",at);var lt=class extends u{get interpretation(){return this.getAttribute("interpretation")||""}getResult(){let i=this.getAttribute("identifier")||"",e=this.closest("qti-assessment-item").getResponse(i);return e.correctResponse,e.cardinality!=="single"?e.correctResponse.length>0?e.correctResponse[0]:"":e.correctResponse}};customElements.define("qti-correct",lt);import{property as Yi}from"lit/decorators.js";var Ie=class extends u{constructor(){super(...arguments);this.roundingMode="significantFigures"}get figures(){if(!this.getAttribute("figures"))return console.error("figures attribute is missing"),null;let t=parseInt(this.getAttribute("figures")||"0");return isNaN(t)?(console.error("figures attribute is not a number"),null):t<0?(console.error("figures attribute is negative"),null):t<1&&this.roundingMode==="significantFigures"?(console.error("figures cannot be smaller than 1 for RoundingMode significantFigures"),null):t}getResult(){if(this.children.length===2){let e=this.getVariables(),t=e[0],r=e[1];if(this.roundingMode===null)return null;if(t.cardinality!=="single"||r.cardinality!=="single"||Array.isArray(t.value)||Array.isArray(r.value))return console.error("unexpected cardinality in qti equal"),!1;switch(e[0].baseType){case"integer":case"float":{let n=parseFloat(t.value),o=parseFloat(r.value);if(!isNaN(n)&&!isNaN(o))return this.roundingMode==="significantFigures"?n.toPrecision(this.figures)===o.toPrecision(this.figures):Math.round(n*Math.pow(10,this.figures))/Math.pow(10,this.figures)===Math.round(o*Math.pow(10,this.figures))/Math.pow(10,this.figures);console.error(`value cannot be casted to numeric value in equalRounded operator: ${n}, ${o}`);break}default:{console.error("values other than float and int cannot be used in equalRounded operator.");break}}return!1}return console.error("unexpected number of children in qti-equal-rounded"),null}};s([Yi({type:String})],Ie.prototype,"roundingMode",2);customElements.define("qti-equal-rounded",Ie);import{property as ji}from"lit/decorators.js";var R=class{static compareSingleValues(i,e,t){switch(t){case"identifier":case"string":return i===e;case"integer":{let r=parseInt(i,10),n=parseInt(e,10);if(!isNaN(r)&&!isNaN(n))return r===n;console.error(`Cannot convert ${i} and/or ${e} to int.`);break}case"float":{let r=parseFloat(i),n=parseFloat(e);if(!isNaN(r)&&!isNaN(n))return r===n;console.error(`couldn't convert ${i} and/or ${e} to float.`);break}case"pair":case"directedPair":{let r=i.split(" ").sort(),n=e.split(" ").sort();if(r.length===2&&n.length===2)return t==="pair"&&(r.sort(),n.sort()),r.join(" ")===n.join(" ");console.error(`compared two pair but one of the values does not have 2 values: 1: ${i} 2: ${e}`);break}}return!1}};var Be=class extends u{constructor(){super(...arguments);this.toleranceMode="exact"}getResult(){if(this.children.length===2){let e=this.getVariables(),t=e[0],r=e[1];return this.toleranceMode!=="exact"?(console.error("toleranceMode is not supported yet"),!1):t.cardinality!=="single"||r.cardinality!=="single"||Array.isArray(t.value)||Array.isArray(r.value)?(console.error("unexpected cardinality in qti equal"),!1):R.compareSingleValues(t.value,r.value,t.baseType)}return console.error("unexpected number of children in qti-equal"),null}};s([ji({type:String})],Be.prototype,"toleranceMode",2);customElements.define("qti-equal",Be);var ct=class extends u{getResult(){if(this.children.length===2){let i=this.getVariables(),e=i[0],t=i[1];if(e.baseType===t.baseType&&(e.baseType==="integer"||e.baseType==="float"))return+e.value>+t.value;console.error("unexpected baseType or cardinality in qti gt")}return console.error("unexpected number of children in qt"),null}};customElements.define("qti-gt",ct);var pt=class extends w{getResult(){if(this.children.length===2){let i=this.getVariables(),e=i[0],t=i[1];return e.baseType===t.baseType&&(e.baseType==="integer"||e.baseType==="float")?+e.value>=+t.value:(console.error("unexpected baseType or cardinality in qti gte"),null)}return console.log("unexpected number of children in qte"),null}};customElements.define("qti-gte",pt);var dt=class extends u{getResult(){if(this.children.length===1){let i=this.getVariables();if(!i)return!0;let e=i[0].value;return e==null||e==null||e===""}return console.error("unexpected number of children in qti Null"),null}};customElements.define("qti-is-null",dt);var ut=class extends u{getResult(){if(this.children.length===2){let i=this.getVariables(),e=i[0],t=i[1];if(e.baseType===t.baseType&&(e.baseType==="integer"||e.baseType==="float"))return+e.value<+t.value;console.error("unexpected baseType or cardinality in qti lt")}return console.error("unexpected number of children in lt"),null}};customElements.define("qti-lt",ut);var mt=class extends w{getResult(){if(this.children.length===2){let i=this.getVariables(),e=i[0],t=i[1];return e.baseType===t.baseType&&(e.baseType==="integer"||e.baseType==="float")?+e.value<=+t.value:(console.error("unexpected baseType or cardinality in qti lte"),null)}return console.log("unexpected number of children in lte"),null}};customElements.define("qti-lte",mt);import{property as Ki}from"lit/decorators.js";var Xe=class extends u{getResult(){let i=this.assessmentItem.getResponse(this.identifier);if(!i)return console.warn(`Response ${this.identifier} can not be found`),null;let e=i.mapping,t=Array.isArray(i.value)?i.value:[i.value],r=0;for(let n of t){let o=e.mapEntries.find(l=>R.compareSingleValues(l.mapKey,n,i.baseType));o==null||o.mappedValue==null?r+=e.defaultValue:r+=o.mappedValue}return e.lowerBound!=null&&(r=Math.max(e.lowerBound,r)),e.upperBound!=null&&(r=Math.min(e.upperBound,r)),r}};s([Ki({type:String})],Xe.prototype,"identifier",2);customElements.define("qti-map-response",Xe);import{property as ht}from"lit/decorators.js";import{LitElement as zi}from"lit";var G=class extends zi{constructor(){super(...arguments);this.defaultValue=0}get mapEntries(){return Array.from(this.querySelectorAll("qti-map-entry")).map(e=>({mapKey:e.getAttribute("map-key"),mappedValue:+e.getAttribute("mapped-value")}))}};s([ht({attribute:"default-value",type:Number})],G.prototype,"defaultValue",2),s([ht({attribute:"lower-bound",type:Number})],G.prototype,"lowerBound",2),s([ht({attribute:"upper-bound",type:Number})],G.prototype,"upperBound",2);customElements.define("qti-mapping",G);var ft=class a extends u{getResult(){if(this.children.length===2){let i=this.getVariables(),e=i[0],t=i[1];return a.match(e,t)}return console.error("unexpected number of children in match"),null}static match(i,e){var t;if(e.cardinality==="single")return i.value===null?!1:Array.isArray(i.value)||Array.isArray(e.value)?(console.error("unexpected cardinality in qti match"),!1):R.compareSingleValues((t=i.value)==null?void 0:t.toString(),e.value.toString(),e.baseType);{if(!Array.isArray(i.value)||!Array.isArray(e.value))return console.error("unexpected cardinality in qti match"),!1;if(i.value.length!==e.value.length)return!1;let r=0;for(let n of e.value){if(e.cardinality==="ordered"){let o=i[r];if(!R.compareSingleValues(n,o,e.baseType))return!1}else{let o=null;for(let l of i.value)if(R.compareSingleValues(n,l,e.baseType)){o=l;break}if(o!==null)i.value.splice(i.value.indexOf(o),1);else return!1}r++}return!0}}};customElements.define("qti-match",ft);var gt=class extends u{getResult(){let i=this.getVariables();this.children.length!==2&&console.warn("The member operator takes two sub-expressions");let[e,t]=i;if(e.baseType!==t.baseType&&console.warn("Which must both have the same base-type"),t.cardinality==="multiple"||t.cardinality==="ordered"||console.warn("and the second must be a multiple or ordered container"),(e.baseType==="float"||t.baseType==="float")&&console.warn("The member operator should not be used on sub-expressions with a base-type of float"),(e.baseType==="duration"||t.baseType==="duration")&&console.warn("It must not be used on sub-expressions with a base-type of duration"),e.value===null||t.value===null)return null;let r=e.value;return t.value.includes(r)}};customElements.define("qti-member",gt);var bt=class extends u{getResult(){let i=this.getVariables();if(i.length===0)return console.error("unexpected number of children in qti multiple"),null;for(let e of i)if(e.cardinality!=="multiple"&&e.cardinality!=="single")return console.error("unexpected cardinality in qti multiple"),[];return i}};customElements.define("qti-multiple",bt);import{html as Wi}from"lit";var vt=class extends u{render(){return Wi`${super.render()}`}getResult(){return!this.firstElementChild.calculate()}};customElements.define("qti-not",vt);var yt=class extends w{getResult(){return Array.from(this.children).map(e=>{let t=e;if(!t.calculate)return console.error("Element doesn't implement QtiConditionExpression"),null;let r=t.calculate();if(typeof r=="string")if(r==="true")r=!0;else if(r==="false")r=!1;else return console.error("unexpected value in qti-or, expected boolean"),null;return r}).some(e=>typeof e=="boolean"&&e)}};customElements.define("qti-or",yt);var xt=class extends u{getResult(){let i=this.getVariables();if(i.length===0)return console.error("unexpected number of children in qti multiple"),null;for(let e of i)if(e.cardinality!=="ordered"&&e.cardinality!=="single")return console.error("unexpected cardinality in qti ordered"),[];return i}};customElements.define("qti-ordered",xt);import{consume as Ji}from"@lit/context";import{LitElement as Zi,html as Gi}from"lit";import{property as Qi,state as es}from"lit/decorators.js";var he=class extends Zi{render(){var e,t;let i=(t=(e=this.itemContext)==null?void 0:e.variables.find(r=>r.identifier===this.identifier))==null?void 0:t.value;return Gi`${JSON.stringify(i,null,2)}`}calculate(){let i=this.closest("qti-assessment-item"),e=this.identifier;return i.getVariable(e).value}};s([Qi({type:String})],he.prototype,"identifier",2),s([Ji({context:M,subscribe:!0}),es()],he.prototype,"itemContext",2);customElements.define("qti-printed-variable",he);var Et=class extends u{getResult(){return this.getVariables().reduce((t,r)=>{if(r.baseType=="float"||r.baseType=="integer")try{return t*parseInt(r.value.toString())}catch(n){console.warn("can not convert to number")}else console.warn(`has another baseType ${r.baseType}`);return t},1)}};customElements.define("qti-product",Et);import{property as ts}from"lit/decorators.js";var Ye=class extends u{constructor(){super(...arguments);this.caseSensitive="true"}getResult(){if(this.children.length===2){let e=this.getVariables(),t=e[0],r=e[1];if(t.cardinality!=="single"||r.cardinality!=="single"||Array.isArray(t.value)||Array.isArray(r.value))return console.error("unexpected cardinality in qti string-match"),!1;let n=this.caseSensitive==="true"?t.value:t.value.toLowerCase(),o=this.caseSensitive==="true"?r.value:r.value.toLowerCase();return R.compareSingleValues(n,o,t.baseType)}return console.error("unexpected number of children in qti-string-match"),null}};s([ts({type:String,attribute:"case-sensitive"})],Ye.prototype,"caseSensitive",2);customElements.define("qti-string-match",Ye);var qt=class extends u{constructor(){super(),this._expression=new Ct(Array.from(this.children))}getResult(){return this._expression.calculate()}},Ct=class{constructor(i){this.expressions=i}calculate(){return this.expressions.map(e=>{if(!e.calculate)return console.error("Element doesn't implement QtiConditionExpression"),null;let t=e.calculate();return Number.isNaN(t)?(console.error("unexpected value in qti-sum, expected number"),null):Number(t)}).reduce((e,t)=>e+t,0)}};customElements.define("qti-sum",qt);var _t=class extends u{getResult(){let i=this.getAttribute("identifier");return this.closest("qti-assessment-item").getVariable(i).value}};customElements.define("qti-variable",_t);import{html as Xt}from"lit";import{customElement as rs,property as kt,state as is}from"lit/decorators.js";var F=class extends h{constructor(){super(...arguments);this._errorMessage=null;this.loadConfig=async(e,t)=>{e=this.removeDoubleSlashes(e);try{let r=await fetch(e);if(r.ok){let o=await r.json();for(let l in o.paths)t&&(o.paths[l]=this.getResolvablePath(o.paths[l],t));return o}}catch(r){}return null};this.getResolvablePath=(e,t)=>e!=null&&e.toLocaleLowerCase().startsWith("http")||!t?e:this.removeDoubleSlashes(`${t}/${e}`);this.mergeConfigs=async(e,t,r)=>{var n;for(let o in t==null?void 0:t.paths)if(!e.paths[o]){let l=!1;try{let c=(n=t.paths[o])!=null&&n.toLocaleLowerCase().endsWith(".js")?t.paths[o]:t.paths[o]+".js";(await fetch(c)).ok?e.paths[o]=t.paths[o].replace(/\.js$/,""):l=!0}catch(c){l=!0}if(l&&r)if(typeof r=="string")try{let c=await this.loadConfig(r);c!=null&&c.paths[o]&&(e.paths[o]=c.paths[o].replace(/\.js$/,""))}catch(c){}else typeof r=="object"&&r!=null&&r.paths[o]&&(e.paths[o]=r.paths[o].replace(/\.js$/,""));else l&&console.error("Failed to resolve module: "+o)}}}convertQtiVariableJSON(e){for(let t in e)if(e.hasOwnProperty(t)){let r=e[t];if(r){for(let n in r)if(r.hasOwnProperty(n)){let o=r[n];if(Array.isArray(o))return o.map(String);if(o!=null)return String(o)}}}return null}startChecking(){this.intervalId=setInterval(()=>{let e=this.pci.getResponse(),t=this.pci.getResponse(),r=JSON.stringify(e);if(r!==this.rawResponse){this.rawResponse=r;let n=this.convertQtiVariableJSON(t);this.response=n,this.saveResponse(n)}},200)}stopChecking(){this.intervalId!==void 0&&clearInterval(this.intervalId)}validate(){return!0}set response(e){}getTAOConfig(e){let t=e.querySelectorAll("properties"),r={},n=l=>{let c={},p=l.getAttribute("key");if(p){let d=Array.from(l.children),m=d.map(v=>v.getAttribute("key"));m.length>0&&!m.find(v=>!Number.isInteger(+v))?c[p]=d.map(v=>o(v)):c[p]=l.textContent}return c},o=l=>{if(l){let c={};for(let p of l.children)c=f(f({},c),n(p));return c}};for(let l of t)return l.getAttribute("key")||(r=f(f({},r),o(l))),r;return console.log("Can not find qti-custom-interaction config"),null}register(e){this.pci=e;let t=this.parentElement.tagName==="QTI-CUSTOM-INTERACTION"?"TAO":"IMS",r=t=="IMS"?this.querySelector("qti-interaction-markup"):this.querySelector("markup");r.classList.add("qti-customInteraction"),t=="TAO"&&this.querySelector("properties")&&(this.querySelector("properties").style.display="none");let n=t=="IMS"?{properties:this.dataset,onready:()=>{console.log("onready")}}:this.getTAOConfig(this);t=="IMS"?e.getInstance(r,n,void 0):e.initialize(this.customInteractionTypeIdentifier,r.firstElementChild,n),t=="TAO"&&Array.from(this.querySelectorAll("link")).map(l=>l.getAttribute("href")).forEach(l=>{let c=document.createElement("link");c.rel="stylesheet",c.type="text/css",c.media="screen",c.href=l,r.appendChild(c)}),this.startChecking()}connectedCallback(){super.connectedCallback();let e={context:this.customInteractionTypeIdentifier,catchError:!0,paths:{}};if(window.requirePaths&&window.requireShim&&(e.paths=window.requirePaths,e.shim=window.requireShim),!globalThis.require){this._errorMessage="requirejs not found, load with cdn: https://cdnjs.com/libraries/require.js";return}this.registerModules(e).then(()=>{requirejs.config(e)(["require"],r=>{!r.defined("qtiCustomInteractionContext")&&define("qtiCustomInteractionContext",()=>({register:o=>{this.register(o)},notifyReady:()=>{}}));let n=r.defined(this.module);r([this.module],o=>{n&&this.register(o)},o=>{this._errorMessage=o})},r=>{this._errorMessage=r})})}disconnectedCallback(){super.disconnectedCallback(),this.stopChecking()}async registerModules(e){let t=this.getAttribute("data-base-url");if(t){let n=`${t}/modules/module_resolution.js`,o=`${t}/modules/module_resolution_fallback.js`;if(n){let l=await this.loadConfig(n,t);await this.mergeConfigs(e,l,o)}}let r=this.querySelector("qti-interaction-modules");if(r){let n=r.querySelectorAll("qti-interaction-module");for(let o of n){let l=o.getAttribute("id"),c=o.getAttribute("primary-path"),p=o.getAttribute("fallback-path"),d=c?{paths:x(f({},e.paths),{[l]:this.getResolvablePath(c,t)})}:null,m=p?{paths:x(f({},e.paths),{[l]:this.getResolvablePath(p,t)})}:null;l&&d&&await this.mergeConfigs(e,d,m)}}}removeDoubleSlashes(e){return e.replace(/([^:]\/)\/+/g,"$1").replace(/\/\//g,"/").replace("http:/","http://").replace("https:/","https://")}render(){return Xt`<slot></slot>${this._errorMessage&&Xt`<div style="color:red">
|
|
169
|
+
`,i([Xs()],u.prototype,"result",2);var T=class extends u{calculate(){return this.result=this.getResult(),this.result}getResult(){throw new Error("Not implemented")}};var Ue=class extends Ys(T){calculate(){return this.calculateChildren(Array.from(this.children))}};function Ys(l){return class extends l{calculateChildren(e){return e.map(r=>{let n=r;if(!n.calculate)return console.error("Element doesn't implement QtiConditionExpression"),null;let o=n.calculate();if(typeof o=="string")if(o==="true")o=!0;else if(o==="false")o=!1;else return console.error("unexpected value in qti-and, expected boolean"),null;return o}).every(r=>typeof r=="boolean"&&r)}}}customElements.define("qti-and",Ue);import{property as js}from"lit/decorators.js";var Fe=class extends u{constructor(){super(...arguments);this.baseType="string"}getResult(){return this.textContent}};i([js({type:String,attribute:"base-type"})],Fe.prototype,"baseType",2);customElements.define("qti-base-value",Fe);var at=class extends T{getResult(){let s=this.getVariables();if(this.children.length===2){let e=s[0],t=s[1];if(e.baseType==="directedPair"&&t.baseType==="directedPair"&&e.cardinality==="multiple"){let r=e.value,n=t.value;return r.filter(c=>n.includes(c)).length>0}else if(e.baseType==="directedPair"&&t.baseType==="directedPair"&&e.cardinality==="single"){let r=e.value;return t.value.includes(r)}else console.error("unsupported baseType or cardinality in qti contains, only baseType: directedPair and cardinality: multiple is supported")}else console.error("unexpected number of children in qti contains");return!1}};customElements.define("qti-contains",at);var lt=class extends u{get interpretation(){return this.getAttribute("interpretation")||""}getResult(){let s=this.getAttribute("identifier")||"",e=this.closest("qti-assessment-item").getResponse(s);return e.correctResponse,e.cardinality!=="single"?e.correctResponse.length>0?e.correctResponse[0]:"":e.correctResponse}};customElements.define("qti-correct",lt);import{property as Ks}from"lit/decorators.js";var Ie=class extends u{constructor(){super(...arguments);this.roundingMode="significantFigures"}get figures(){if(!this.getAttribute("figures"))return console.error("figures attribute is missing"),null;let t=parseInt(this.getAttribute("figures")||"0");return isNaN(t)?(console.error("figures attribute is not a number"),null):t<0?(console.error("figures attribute is negative"),null):t<1&&this.roundingMode==="significantFigures"?(console.error("figures cannot be smaller than 1 for RoundingMode significantFigures"),null):t}getResult(){if(this.children.length===2){let e=this.getVariables(),t=e[0],r=e[1];if(this.roundingMode===null)return null;if(t.cardinality!=="single"||r.cardinality!=="single"||Array.isArray(t.value)||Array.isArray(r.value))return console.error("unexpected cardinality in qti equal"),!1;switch(e[0].baseType){case"integer":case"float":{let n=parseFloat(t.value),o=parseFloat(r.value);if(!isNaN(n)&&!isNaN(o))return this.roundingMode==="significantFigures"?n.toPrecision(this.figures)===o.toPrecision(this.figures):Math.round(n*Math.pow(10,this.figures))/Math.pow(10,this.figures)===Math.round(o*Math.pow(10,this.figures))/Math.pow(10,this.figures);console.error(`value cannot be casted to numeric value in equalRounded operator: ${n}, ${o}`);break}default:{console.error("values other than float and int cannot be used in equalRounded operator.");break}}return!1}return console.error("unexpected number of children in qti-equal-rounded"),null}};i([Ks({type:String})],Ie.prototype,"roundingMode",2);customElements.define("qti-equal-rounded",Ie);import{property as Ws}from"lit/decorators.js";var R=class{static compareSingleValues(s,e,t){switch(t){case"identifier":case"string":return s===e;case"integer":{let r=parseInt(s,10),n=parseInt(e,10);if(!isNaN(r)&&!isNaN(n))return r===n;console.error(`Cannot convert ${s} and/or ${e} to int.`);break}case"float":{let r=parseFloat(s),n=parseFloat(e);if(!isNaN(r)&&!isNaN(n))return r===n;console.error(`couldn't convert ${s} and/or ${e} to float.`);break}case"pair":case"directedPair":{let r=s.split(" ").sort(),n=e.split(" ").sort();if(r.length===2&&n.length===2)return t==="pair"&&(r.sort(),n.sort()),r.join(" ")===n.join(" ");console.error(`compared two pair but one of the values does not have 2 values: 1: ${s} 2: ${e}`);break}}return!1}};var Be=class extends u{constructor(){super(...arguments);this.toleranceMode="exact"}getResult(){if(this.children.length===2){let e=this.getVariables(),t=e[0],r=e[1];return this.toleranceMode!=="exact"?(console.error("toleranceMode is not supported yet"),!1):t.cardinality!=="single"||r.cardinality!=="single"||Array.isArray(t.value)||Array.isArray(r.value)?(console.error("unexpected cardinality in qti equal"),!1):R.compareSingleValues(t.value,r.value,t.baseType)}return console.error("unexpected number of children in qti-equal"),null}};i([Ws({type:String})],Be.prototype,"toleranceMode",2);customElements.define("qti-equal",Be);var ct=class extends u{getResult(){if(this.children.length===2){let s=this.getVariables(),e=s[0],t=s[1];if(e.baseType===t.baseType&&(e.baseType==="integer"||e.baseType==="float"))return+e.value>+t.value;console.error("unexpected baseType or cardinality in qti gt")}return console.error("unexpected number of children in qt"),null}};customElements.define("qti-gt",ct);var pt=class extends T{getResult(){if(this.children.length===2){let s=this.getVariables(),e=s[0],t=s[1];return e.baseType===t.baseType&&(e.baseType==="integer"||e.baseType==="float")?+e.value>=+t.value:(console.error("unexpected baseType or cardinality in qti gte"),null)}return console.log("unexpected number of children in qte"),null}};customElements.define("qti-gte",pt);var dt=class extends u{getResult(){if(this.children.length===1){let s=this.getVariables();if(!s)return!0;let e=s[0].value;return e==null||e==null||e===""}return console.error("unexpected number of children in qti Null"),null}};customElements.define("qti-is-null",dt);var ut=class extends u{getResult(){if(this.children.length===2){let s=this.getVariables(),e=s[0],t=s[1];if(e.baseType===t.baseType&&(e.baseType==="integer"||e.baseType==="float"))return+e.value<+t.value;console.error("unexpected baseType or cardinality in qti lt")}return console.error("unexpected number of children in lt"),null}};customElements.define("qti-lt",ut);var mt=class extends T{getResult(){if(this.children.length===2){let s=this.getVariables(),e=s[0],t=s[1];return e.baseType===t.baseType&&(e.baseType==="integer"||e.baseType==="float")?+e.value<=+t.value:(console.error("unexpected baseType or cardinality in qti lte"),null)}return console.log("unexpected number of children in lte"),null}};customElements.define("qti-lte",mt);import{property as zs}from"lit/decorators.js";var Xe=class extends u{getResult(){let s=this.assessmentItem.getResponse(this.identifier);if(!s)return console.warn(`Response ${this.identifier} can not be found`),null;let e=s.mapping,t=Array.isArray(s.value)?s.value:[s.value],r=0;for(let n of t){let o=e.mapEntries.find(a=>R.compareSingleValues(a.mapKey,n,s.baseType));o==null||o.mappedValue==null?r+=e.defaultValue:r+=o.mappedValue}return e.lowerBound!=null&&(r=Math.max(e.lowerBound,r)),e.upperBound!=null&&(r=Math.min(e.upperBound,r)),r}};i([zs({type:String})],Xe.prototype,"identifier",2);customElements.define("qti-map-response",Xe);import{property as ht}from"lit/decorators.js";import{LitElement as Js}from"lit";var G=class extends Js{constructor(){super(...arguments);this.defaultValue=0}get mapEntries(){return Array.from(this.querySelectorAll("qti-map-entry")).map(e=>({mapKey:e.getAttribute("map-key"),mappedValue:+e.getAttribute("mapped-value")}))}};i([ht({attribute:"default-value",type:Number})],G.prototype,"defaultValue",2),i([ht({attribute:"lower-bound",type:Number})],G.prototype,"lowerBound",2),i([ht({attribute:"upper-bound",type:Number})],G.prototype,"upperBound",2);customElements.define("qti-mapping",G);var ft=class l extends u{getResult(){if(this.children.length===2){let s=this.getVariables(),e=s[0],t=s[1];return l.match(e,t)}return console.error("unexpected number of children in match"),null}static match(s,e){var t;if(e.cardinality==="single")return s.value===null?!1:Array.isArray(s.value)||Array.isArray(e.value)?(console.error("unexpected cardinality in qti match"),!1):R.compareSingleValues((t=s.value)==null?void 0:t.toString(),e.value.toString(),e.baseType);{if(!Array.isArray(s.value)||!Array.isArray(e.value))return console.error("unexpected cardinality in qti match"),!1;if(s.value.length!==e.value.length)return!1;let r=0;for(let n of e.value){if(e.cardinality==="ordered"){let o=s[r];if(!R.compareSingleValues(n,o,e.baseType))return!1}else{let o=null,a=[...s.value];for(let c of a)if(R.compareSingleValues(n,c,e.baseType)){o=c;break}if(o!==null)a.splice(a.indexOf(o),1);else return!1}r++}return!0}}};customElements.define("qti-match",ft);var gt=class extends u{getResult(){let s=this.getVariables();this.children.length!==2&&console.warn("The member operator takes two sub-expressions");let[e,t]=s;if(e.baseType!==t.baseType&&console.warn("Which must both have the same base-type"),t.cardinality==="multiple"||t.cardinality==="ordered"||console.warn("and the second must be a multiple or ordered container"),(e.baseType==="float"||t.baseType==="float")&&console.warn("The member operator should not be used on sub-expressions with a base-type of float"),(e.baseType==="duration"||t.baseType==="duration")&&console.warn("It must not be used on sub-expressions with a base-type of duration"),e.value===null||t.value===null)return null;let r=e.value;return t.value.includes(r)}};customElements.define("qti-member",gt);var bt=class extends u{getResult(){let s=this.getVariables();if(s.length===0)return console.error("unexpected number of children in qti multiple"),null;for(let e of s)if(e.cardinality!=="multiple"&&e.cardinality!=="single")return console.error("unexpected cardinality in qti multiple"),[];return s}};customElements.define("qti-multiple",bt);import{html as Zs}from"lit";var vt=class extends u{render(){return Zs`${super.render()}`}getResult(){return!this.firstElementChild.calculate()}};customElements.define("qti-not",vt);var yt=class extends T{getResult(){return Array.from(this.children).map(e=>{let t=e;if(!t.calculate)return console.error("Element doesn't implement QtiConditionExpression"),null;let r=t.calculate();if(typeof r=="string")if(r==="true")r=!0;else if(r==="false")r=!1;else return console.error("unexpected value in qti-or, expected boolean"),null;return r}).some(e=>typeof e=="boolean"&&e)}};customElements.define("qti-or",yt);var xt=class extends u{getResult(){let s=this.getVariables();if(s.length===0)return console.error("unexpected number of children in qti multiple"),null;for(let e of s)if(e.cardinality!=="ordered"&&e.cardinality!=="single")return console.error("unexpected cardinality in qti ordered"),[];return s}};customElements.define("qti-ordered",xt);import{consume as Gs}from"@lit/context";import{LitElement as Qs,html as ei}from"lit";import{property as ti,state as ri}from"lit/decorators.js";var he=class extends Qs{render(){var e,t;let s=(t=(e=this.itemContext)==null?void 0:e.variables.find(r=>r.identifier===this.identifier))==null?void 0:t.value;return ei`${JSON.stringify(s,null,2)}`}calculate(){let s=this.closest("qti-assessment-item"),e=this.identifier;return s.getVariable(e).value}};i([ti({type:String})],he.prototype,"identifier",2),i([Gs({context:M,subscribe:!0}),ri()],he.prototype,"itemContext",2);customElements.define("qti-printed-variable",he);var Et=class extends u{getResult(){return this.getVariables().reduce((t,r)=>{if(r.baseType=="float"||r.baseType=="integer")try{return t*parseInt(r.value.toString())}catch(n){console.warn("can not convert to number")}else console.warn(`has another baseType ${r.baseType}`);return t},1)}};customElements.define("qti-product",Et);import{property as si}from"lit/decorators.js";var Ye=class extends u{constructor(){super(...arguments);this.caseSensitive="true"}getResult(){if(this.children.length===2){let e=this.getVariables(),t=e[0],r=e[1];if(t.cardinality!=="single"||r.cardinality!=="single"||Array.isArray(t.value)||Array.isArray(r.value))return console.error("unexpected cardinality in qti string-match"),!1;let n=this.caseSensitive==="true"?t.value:t.value.toLowerCase(),o=this.caseSensitive==="true"?r.value:r.value.toLowerCase();return R.compareSingleValues(n,o,t.baseType)}return console.error("unexpected number of children in qti-string-match"),null}};i([si({type:String,attribute:"case-sensitive"})],Ye.prototype,"caseSensitive",2);customElements.define("qti-string-match",Ye);var qt=class extends u{constructor(){super(),this._expression=new Ct(Array.from(this.children))}getResult(){return this._expression.calculate()}},Ct=class{constructor(s){this.expressions=s}calculate(){return this.expressions.map(e=>{if(!e.calculate)return console.error("Element doesn't implement QtiConditionExpression"),null;let t=e.calculate();return Number.isNaN(t)?(console.error("unexpected value in qti-sum, expected number"),null):Number(t)}).reduce((e,t)=>e+t,0)}};customElements.define("qti-sum",qt);var _t=class extends u{getResult(){let s=this.getAttribute("identifier");return this.closest("qti-assessment-item").getVariable(s).value}};customElements.define("qti-variable",_t);import{html as Yt}from"lit";import{customElement as ii,property as wt,state as oi}from"lit/decorators.js";var I=class extends h{constructor(){super(...arguments);this._errorMessage=null;this.loadConfig=async(e,t)=>{e=this.removeDoubleSlashes(e);try{let r=await fetch(e);if(r.ok){let o=await r.json();for(let a in o.paths)t&&(o.paths[a]=this.getResolvablePath(o.paths[a],t));return o}}catch(r){}return null};this.getResolvablePath=(e,t)=>e!=null&&e.toLocaleLowerCase().startsWith("http")||!t?e:this.removeDoubleSlashes(`${t}/${e}`);this.mergeConfigs=async(e,t,r)=>{var n;for(let o in t==null?void 0:t.paths)if(!e.paths[o]){let a=!1;try{let c=(n=t.paths[o])!=null&&n.toLocaleLowerCase().endsWith(".js")?t.paths[o]:t.paths[o]+".js";(await fetch(c)).ok?e.paths[o]=t.paths[o].replace(/\.js$/,""):a=!0}catch(c){a=!0}if(a&&r)if(typeof r=="string")try{let c=await this.loadConfig(r);c!=null&&c.paths[o]&&(e.paths[o]=c.paths[o].replace(/\.js$/,""))}catch(c){}else typeof r=="object"&&r!=null&&r.paths[o]&&(e.paths[o]=r.paths[o].replace(/\.js$/,""));else a&&console.error("Failed to resolve module: "+o)}}}convertQtiVariableJSON(e){for(let t in e)if(e.hasOwnProperty(t)){let r=e[t];if(r){for(let n in r)if(r.hasOwnProperty(n)){let o=r[n];if(Array.isArray(o))return o.map(String);if(o!=null)return String(o)}}}return null}startChecking(){this.intervalId=setInterval(()=>{let e=this.pci.getResponse(),t=this.pci.getResponse(),r=JSON.stringify(e);if(r!==this.rawResponse){this.rawResponse=r;let n=this.convertQtiVariableJSON(t);this.response=n,this.saveResponse(n)}},200)}stopChecking(){this.intervalId!==void 0&&clearInterval(this.intervalId)}validate(){return!0}set response(e){}getTAOConfig(e){let t=e.querySelectorAll("properties"),r={},n=a=>{let c={},p=a.getAttribute("key");if(p){let d=Array.from(a.children),m=d.map(g=>g.getAttribute("key"));m.length>0&&!m.find(g=>!Number.isInteger(+g))?c[p]=d.map(g=>o(g)):c[p]=a.textContent}return c},o=a=>{if(a){let c={};for(let p of a.children)c=f(f({},c),n(p));return c}};for(let a of t)return a.getAttribute("key")||(r=f(f({},r),o(a))),r;return console.log("Can not find qti-custom-interaction config"),null}register(e){this.pci=e;let t=this.parentElement.tagName==="QTI-CUSTOM-INTERACTION"?"TAO":"IMS",r=t=="IMS"?this.querySelector("qti-interaction-markup"):this.querySelector("markup");r.classList.add("qti-customInteraction"),t=="TAO"&&this.querySelector("properties")&&(this.querySelector("properties").style.display="none");let n=t=="IMS"?{properties:this.dataset,onready:()=>{console.log("onready")}}:this.getTAOConfig(this);t=="IMS"?e.getInstance(r,n,void 0):e.initialize(this.customInteractionTypeIdentifier,r.firstElementChild,n),t=="TAO"&&Array.from(this.querySelectorAll("link")).map(a=>a.getAttribute("href")).forEach(a=>{let c=document.createElement("link");c.rel="stylesheet",c.type="text/css",c.media="screen",c.href=a,r.appendChild(c)}),this.startChecking()}connectedCallback(){super.connectedCallback();let e={context:this.customInteractionTypeIdentifier,catchError:!0,paths:{}};if(window.requirePaths&&window.requireShim&&(e.paths=window.requirePaths,e.shim=window.requireShim),!globalThis.require){this._errorMessage="requirejs not found, load with cdn: https://cdnjs.com/libraries/require.js";return}this.registerModules(e).then(()=>{requirejs.config(e)(["require"],r=>{!r.defined("qtiCustomInteractionContext")&&define("qtiCustomInteractionContext",()=>({register:o=>{this.register(o)},notifyReady:()=>{}}));let n=r.defined(this.module);r([this.module],o=>{n&&this.register(o)},o=>{this._errorMessage=o})},r=>{this._errorMessage=r})})}disconnectedCallback(){super.disconnectedCallback(),this.stopChecking()}async registerModules(e){let t=this.getAttribute("data-base-url");if(t){let n=`${t}/modules/module_resolution.js`,o=`${t}/modules/module_resolution_fallback.js`;if(n){let a=await this.loadConfig(n,t);await this.mergeConfigs(e,a,o)}}let r=this.querySelector("qti-interaction-modules");if(r){let n=r.querySelectorAll("qti-interaction-module");for(let o of n){let a=o.getAttribute("id"),c=o.getAttribute("primary-path"),p=o.getAttribute("fallback-path"),d=c?{paths:y(f({},e.paths),{[a]:this.getResolvablePath(c,t)})}:null,m=p?{paths:y(f({},e.paths),{[a]:this.getResolvablePath(p,t)})}:null;a&&d&&await this.mergeConfigs(e,d,m)}}}removeDoubleSlashes(e){return e.replace(/([^:]\/)\/+/g,"$1").replace(/\/\//g,"/").replace("http:/","http://").replace("https:/","https://")}render(){return Yt`<slot></slot>${this._errorMessage&&Yt`<div style="color:red">
|
|
170
170
|
<h1>Error</h1>
|
|
171
171
|
${this._errorMessage}
|
|
172
|
-
</div>`}`}};s([kt({type:String,attribute:"response-identifier"})],F.prototype,"responseIdentifier",2),s([kt({type:String,attribute:"module"})],F.prototype,"module",2),s([kt({type:String,attribute:"custom-interaction-type-identifier"})],F.prototype,"customInteractionTypeIdentifier",2),s([is()],F.prototype,"_errorMessage",2),F=s([rs("qti-portable-custom-interaction")],F);import{LitElement as os,css as ns,html as Kt}from"lit";import{customElement as as,state as ls}from"lit/decorators.js";var je=class a{constructor(){this._touchBegin=0;this._touchDown=null;this._lastClick=0;this._canDrag=!1;this._dragSrc=null;this._dragCopy=null;this._touchEndCalled=!1;this._dragRunning=!1;this._dataTransfer={data:{},setData:function(i,e){this.data[i]=e},getData:function(i){return this.data[i]},effectAllowed:"move"};this._copyOffset={x:0,y:0};this._lastTarget=null;this._currentDropContainer=null;this._handleClick=!0;this._DBLCLICKDELAY=500;this._CONTEXTMENUDELAY=1e3;this._DRAGDELTA=5;this._COPYOPACITY=.7;this.copyStylesDragClone=!0;this.dragOnClick=!1;this._createDragCopy=(i,e)=>{if(this._dragCopy===null&&this._dragRunning){this._dragSrc.style.opacity=this._COPYOPACITY,this._dragCopy=this._dragSrc.cloneNode(!0);let t=window.getComputedStyle(this._dragSrc);if(this._dragCopy.style="",this._dragCopy.setAttribute("dragclone",""),this.copyStylesDragClone)for(let r of t)this._dragCopy.style[r]=t.getPropertyValue(r);this._calculateDragCopyPosition(e),this._dragCopy.style.top=e.clientY-this._copyOffset.y+"px",this._dragCopy.style.left=e.clientX-this._copyOffset.x+"px",this._dragCopy.style.position="fixed",this._dragCopy.style.pointerEvents="none",this._dragCopy.style.zIndex="999999",this._dragCopy=document.body.appendChild(this._dragCopy),this._dispatchEvent(this._dragSrc,"dragstart")}if(this._dragRunning){let t=this;requestAnimationFrame(function(){t._touchEndCalled||t._dragCopy===null||(t._dragCopy.style.top=e.clientY-t._copyOffset.y+"px",t._dragCopy.style.left=e.clientX-t._copyOffset.x+"px")});let r=this._findDroppable(i);r!=this._lastTarget&&(this._dispatchEvent(r,"dragenter"),this._dispatchEvent(this._lastTarget,"dragleave"),this._lastTarget=r),this._currentDropContainer=r,this._currentDropContainer&&this._dispatchEvent(r,"dragover")}};return a._instance?a._instance:(a._instance=this,document.addEventListener("touchmove",this._touchMove.bind(this),{passive:!1,capture:!1}),document.addEventListener("mousemove",this._touchMove.bind(this),{passive:!1,capture:!1}),document.addEventListener("touchend",this._touchEnd.bind(this),{passive:!1,capture:!1}),document.addEventListener("mouseup",this._touchEnd.bind(this),{passive:!1,capture:!1}),document.addEventListener("touchcancel",this._touchCancel.bind(this),{passive:!1,capture:!1}),this)}addDraggables(i){i.forEach(e=>{e.addEventListener("touchstart",this._touchStart.bind(this),{passive:!1,capture:!1}),e.addEventListener("mousedown",this._touchStart.bind(this),{passive:!1,capture:!1})})}_touchStart(i){this._touchBegin=Date.now();let{x:e,y:t}=this._getPoint(i);if(this._touchDown={x:e,y:t},this._dragSrc=i.currentTarget,this._canDrag=!0,this.dragOnClick){let r={clientX:e,clientY:t};this._dragRunning=!0,this._createDragCopy(i,r)}i.preventDefault()}_touchMove(i){if(this._canDrag&&this._dragSrc){let{x:e,y:t}=this._getPoint(i),r={clientX:e,clientY:t};this._getDelta(r)>=this._DRAGDELTA&&(this._dragRunning=!0),this._createDragCopy(i,r),i.preventDefault()}}_touchEnd(i){var e;if(this._touchEndCalled=!0,this._canDrag=!1,this._currentDropContainer)this._dispatchEvent(this._currentDropContainer,"drop"),this._dispatchEvent(this._dragSrc,"dragend");else if(this._dragRunning){let t=new CustomEvent("dragend",{bubbles:!0,cancelable:!0});t.dataTransfer={dropEffect:"none"},(e=this._dragSrc)==null||e.dispatchEvent(t)}this._reset()}_touchCancel(i){this._reset()}_findDroppable(i){let e=this._getPoint(i);return this.elementFromPoint(e.x,e.y)}elementFromPoint(i,e){let t=document.elementFromPoint(i,e);if(t){for(;t.shadowRoot;){let r=t.shadowRoot.elementFromPoint(i,e);if(r===null||r===t)break;t=r}return t}return null}_getPoint(i,e){return i&&i.touches&&(i=i.touches[0]),{x:e?i.pageX:i.clientX,y:e?i.pageY:i.clientY}}_calculateDragCopyPosition(i){let e=this._dragSrc.getBoundingClientRect();this._copyOffset.x=i.clientX-e.left,this._copyOffset.y=i.clientY-e.top}_getDelta(i){let e=Math.abs(i.clientX-this._touchDown.x),t=Math.abs(i.clientY-this._touchDown.y);return e+t}_dispatchEvent(i,e,t=!0){if(!i)return!1;let r=new CustomEvent(e,{bubbles:t,cancelable:!0});return r.dataTransfer=this._dataTransfer,i.dispatchEvent(r),r.defaultPrevented}_reset(){this._dragRunning&&(this._dragSrc.style.opacity="1.0",this._dragCopy.parentElement.removeChild(this._dragCopy)),this._dragRunning=!1,this._dragSrc=null,this._dragCopy=null,this._canDrag=!1,this._touchBegin=0,this._touchDown=null,this._lastClick=0,this._touchEndCalled=!1,this._dataTransfer={data:{},setData:function(i,e){this.data[i]=e},getData:function(i){return this.data[i]},effectAllowed:"move"},this._copyOffset={x:0,y:0},this._lastTarget=null,this._currentDropContainer=null,this._handleClick=!0}};import{property as ss}from"lit/decorators.js";var Yt=(a,i,e)=>{class t extends a{constructor(){super(...arguments);this.disabled=!1}firstUpdated(o){if(this.classList.contains("qti-match-tabular"))return;super.firstUpdated(o);let l=Array.from(i?this.shadowRoot.querySelectorAll(e):this.querySelectorAll(e));this.dragoverHandler=this.dragoverHandler.bind(this),this.dragleaveHandler=this.dragleaveHandler.bind(this),this.dragenterHandler=this.dragenterHandler.bind(this),this.dropHandler=this.dropHandler.bind(this),l.forEach(c=>{c.setAttribute("dropzone","move"),c.addEventListener("dragleave",this.dragleaveHandler),this.attachHandler(c)});for(let c of l)this.observer=new MutationObserver(p=>{p.forEach(d=>{if(d.type==="attributes")switch(d.attributeName){case"disabled":{c.hasAttribute("disabled")?this.removeHandler(c):this.attachHandler(c);break}}})}),this.observer.observe(c,{attributes:!0})}attachHandler(o){o.addEventListener("dragover",this.dragoverHandler),o.addEventListener("dragenter",this.dragenterHandler),o.addEventListener("drop",this.dropHandler)}removeHandler(o){o.removeEventListener("dragover",this.dragoverHandler),o.removeEventListener("dragenter",this.dragenterHandler),o.removeEventListener("drop",this.dropHandler)}disconnectedCallback(){var o;this.classList.contains("qti-match-tabular")||(super.disconnectedCallback(),(o=this.observer)==null||o.disconnect())}dragenterHandler(o){o.preventDefault()}dragoverHandler(o){return o.preventDefault(),o.currentTarget.setAttribute("active",""),o.dataTransfer.dropEffect="move",!1}dropHandler(o){o.preventDefault();let l=o.currentTarget,c=this.querySelector(`[identifier=${o.dataTransfer.getData("text")}`),p=c||this.shadowRoot.querySelector(`[identifier=${o.dataTransfer.getData("text")}`);return l?p.parentElement.getAttribute("identifier")!==l.getAttribute("identifier")&&l.appendChild(p):console.error(`cannot find droppable, target: ${o.target?JSON.stringify(o.target):"null"}`),l.removeAttribute("active"),!1}dragleaveHandler(o){return o.preventDefault(),o.currentTarget.removeAttribute("active"),o.dataTransfer.dropEffect="none",!1}}return s([ss({type:Boolean,reflect:!0})],t.prototype,"disabled",2),t};var jt=(a,i,e)=>{class t extends a{}return t};import{property as Q}from"lit/decorators.js";var H=(a,i,e,t)=>{class r extends jt(Yt(a,e,t),t,i){constructor(){super(...arguments);this.draggables=new Map;this.responseIdentifier="";this.configuration={copyStylesDragClone:!0,dragCanBePlacedBack:!0,dragOnClick:!1};this.disabled=!1;this.readonly=!1;this.minAssociations=1;this.maxAssociations=1}reInitDragAndDrop(l,c){if(this.classList.contains("qti-match-tabular"))return;l.filter(d=>!this.draggables||!this.draggables.get(d)).length>0&&(this.dragDropApi.addDraggables(l),l.forEach(d=>{this.draggables.set(d,{parent:d.parentElement,index:Array.from(d.parentNode.children).indexOf(d)}),d.setAttribute("qti-draggable","true"),d.addEventListener("dragstart",m=>{m.dataTransfer.setData("text",m.currentTarget.getAttribute("identifier")),d.setAttribute("dragging","")}),d.addEventListener("dragend",m=>{if(m.preventDefault(),d.removeAttribute("over"),d.removeAttribute("dragging"),(m.dataTransfer.dropEffect==="none"||m.dataTransfer.dropEffect===void 0)&&this.configuration.dragCanBePlacedBack){let y=m.currentTarget,v=this.draggables.get(y),K=v.index<v.parent.children.length?v.index:v.parent.children.length-1,g=v.parent,D=v.parent.children[K];g.insertBefore(y,D),this.saveResponse(),this.checkMaxMatchAssociations()}m.dataTransfer.dropEffect==="move"&&(this.saveResponse(),this.checkMaxMatchAssociations())})}))}handleDragOptionsChanged(l,c){this.dragDropApi.copyStylesDragClone=c.copyStylesDragClone,this.dragDropApi.dragOnClick=c.dragOnClick}handleDisabledChange(l,c){this.draggables.forEach((p,d)=>{c?d.setAttribute("disabled",""):d.removeAttribute("disabled"),c?d.removeAttribute("qti-draggable"):d.setAttribute("qti-draggable","true")})}handleReadonlyChange(l,c){this.draggables.forEach((p,d)=>{c?d.setAttribute("readonly",""):d.removeAttribute("readonly"),c?d.removeAttribute("qti-draggable"):d.setAttribute("qti-draggable","true")})}firstUpdated(l){super.firstUpdated(l),this.droppables=Array.from(e?this.shadowRoot.querySelectorAll(t):this.querySelectorAll(t))}connectedCallback(){super.connectedCallback(),this.dragDropApi=new je,this.dispatchEvent(new CustomEvent("qti-register-interaction",{bubbles:!0,composed:!0,detail:this}))}reset(l=!0){this.draggables.forEach((c,p)=>{let d=c.parent.children,m=c.index<d.length?c.index:d.length;c.parent.insertBefore(p,d[m])}),l&&this.saveResponse()}checkMaxMatchAssociations(){this.droppables.forEach(l=>{let p=+(l.getAttribute("match-max")||1)<=(l.children.length||0);p?l.setAttribute("disabled",""):l.removeAttribute("disabled"),p?l.removeAttribute("dropzone"):l.setAttribute("dropzone","move")})}set response(l){this.classList.contains("qti-match-tabular")||(this.reset(!1),l!==null&&Array.isArray(l)&&l.forEach(c=>{let[p,...d]=c.split(" ").reverse();if(p){let m=this.droppables.find(y=>y.getAttribute("identifier")===p);d.forEach(y=>{let v=this.querySelector(`[identifier=${y}]`);m?v?(m.appendChild(v),this.checkMaxMatchAssociations()):console.error(`cannot find draggable with identifier: ${y}`):console.error(`cannot find droppable with identifier: ${p}`)})}}))}validate(){let c=(e?Array.from(this.shadowRoot.querySelectorAll(t)):Array.from(this.querySelectorAll(t))).filter(p=>p.childElementCount>0).length;return this.minAssociations<=0||this.minAssociations<=c}saveResponse(){let l=this.droppables.map(c=>{var d;let p="";return((d=c.children)==null?void 0:d.length)>0&&(p+=Array.from(c.children).map(m=>m.getAttribute("identifier")).join(" ")+" "),p+=c.getAttribute("identifier"),p});this.dispatchEvent(new CustomEvent("qti-interaction-response",{bubbles:!0,composed:!0,detail:{responseIdentifier:this.responseIdentifier,response:l}}))}}return s([Ht(i)],r.prototype,"reInitDragAndDrop",1),s([Q({type:String,attribute:"response-identifier"})],r.prototype,"responseIdentifier",2),s([Q({attribute:!1,type:Object})],r.prototype,"configuration",2),s([b("configuration")],r.prototype,"handleDragOptionsChanged",1),s([Q({type:Boolean,reflect:!0})],r.prototype,"disabled",2),s([b("disabled",{waitUntilFirstUpdate:!0})],r.prototype,"handleDisabledChange",1),s([Q({type:Boolean,reflect:!0})],r.prototype,"readonly",2),s([b("readonly",{waitUntilFirstUpdate:!0})],r.prototype,"handleReadonlyChange",1),s([Q({type:Number,reflect:!0,attribute:"min-associations"})],r.prototype,"minAssociations",2),s([Q({type:Number,reflect:!0,attribute:"max-associations"})],r.prototype,"maxAssociations",2),r};var ee=class extends H(os,"qti-simple-associable-choice",!0,".dl"){render(){return Kt` <slot name="prompt"></slot>
|
|
172
|
+
</div>`}`}};i([wt({type:String,attribute:"response-identifier"})],I.prototype,"responseIdentifier",2),i([wt({type:String,attribute:"module"})],I.prototype,"module",2),i([wt({type:String,attribute:"custom-interaction-type-identifier"})],I.prototype,"customInteractionTypeIdentifier",2),i([oi()],I.prototype,"_errorMessage",2),I=i([ii("qti-portable-custom-interaction")],I);import{LitElement as ai,css as li,html as Wt}from"lit";import{customElement as ci,state as pi}from"lit/decorators.js";var je=class l{constructor(){this._touchBegin=0;this._touchDown=null;this._lastClick=0;this._canDrag=!1;this._dragSrc=null;this._dragCopy=null;this._touchEndCalled=!1;this._dragRunning=!1;this._dataTransfer={data:{},setData:function(s,e){this.data[s]=e},getData:function(s){return this.data[s]},effectAllowed:"move"};this._copyOffset={x:0,y:0};this._lastTarget=null;this._currentDropContainer=null;this._handleClick=!0;this._DBLCLICKDELAY=500;this._CONTEXTMENUDELAY=1e3;this._DRAGDELTA=5;this._COPYOPACITY=.7;this.copyStylesDragClone=!0;this.dragOnClick=!1;this._createDragCopy=(s,e)=>{if(this._dragCopy===null&&this._dragRunning){this._dragSrc.style.opacity=this._COPYOPACITY,this._dragCopy=this._dragSrc.cloneNode(!0);let t=window.getComputedStyle(this._dragSrc);if(this._dragCopy.style="",this._dragCopy.setAttribute("dragclone",""),this.copyStylesDragClone)for(let r of t)this._dragCopy.style[r]=t.getPropertyValue(r);this._calculateDragCopyPosition(e),this._dragCopy.style.top=e.clientY-this._copyOffset.y+"px",this._dragCopy.style.left=e.clientX-this._copyOffset.x+"px",this._dragCopy.style.position="fixed",this._dragCopy.style.pointerEvents="none",this._dragCopy.style.zIndex="999999",this._dragCopy=document.body.appendChild(this._dragCopy),this._dispatchEvent(this._dragSrc,"dragstart")}if(this._dragRunning){let t=this;requestAnimationFrame(function(){t._touchEndCalled||t._dragCopy===null||(t._dragCopy.style.top=e.clientY-t._copyOffset.y+"px",t._dragCopy.style.left=e.clientX-t._copyOffset.x+"px")});let r=this._findDroppable(s);r!=this._lastTarget&&(this._dispatchEvent(r,"dragenter"),this._dispatchEvent(this._lastTarget,"dragleave"),this._lastTarget=r),this._currentDropContainer=r,this._currentDropContainer&&this._dispatchEvent(r,"dragover")}};return l._instance?l._instance:(l._instance=this,document.addEventListener("touchmove",this._touchMove.bind(this),{passive:!1,capture:!1}),document.addEventListener("mousemove",this._touchMove.bind(this),{passive:!1,capture:!1}),document.addEventListener("touchend",this._touchEnd.bind(this),{passive:!1,capture:!1}),document.addEventListener("mouseup",this._touchEnd.bind(this),{passive:!1,capture:!1}),document.addEventListener("touchcancel",this._touchCancel.bind(this),{passive:!1,capture:!1}),this)}addDraggables(s){s.forEach(e=>{e.addEventListener("touchstart",this._touchStart.bind(this),{passive:!1,capture:!1}),e.addEventListener("mousedown",this._touchStart.bind(this),{passive:!1,capture:!1})})}_touchStart(s){this._touchBegin=Date.now();let{x:e,y:t}=this._getPoint(s);if(this._touchDown={x:e,y:t},this._dragSrc=s.currentTarget,this._canDrag=!0,this.dragOnClick){let r={clientX:e,clientY:t};this._dragRunning=!0,this._createDragCopy(s,r)}s.preventDefault()}_touchMove(s){if(this._canDrag&&this._dragSrc){let{x:e,y:t}=this._getPoint(s),r={clientX:e,clientY:t};this._getDelta(r)>=this._DRAGDELTA&&(this._dragRunning=!0),this._createDragCopy(s,r),s.preventDefault()}}_touchEnd(s){var e;if(this._touchEndCalled=!0,this._canDrag=!1,this._currentDropContainer)this._dispatchEvent(this._currentDropContainer,"drop"),this._dispatchEvent(this._dragSrc,"dragend");else if(this._dragRunning){let t=new CustomEvent("dragend",{bubbles:!0,cancelable:!0});t.dataTransfer={dropEffect:"none"},(e=this._dragSrc)==null||e.dispatchEvent(t)}this._reset()}_touchCancel(s){this._reset()}_findDroppable(s){let e=this._getPoint(s);return this.elementFromPoint(e.x,e.y)}elementFromPoint(s,e){let t=document.elementFromPoint(s,e);if(t){for(;t.shadowRoot;){let r=t.shadowRoot.elementFromPoint(s,e);if(r===null||r===t)break;t=r}return t}return null}_getPoint(s,e){return s&&s.touches&&(s=s.touches[0]),{x:e?s.pageX:s.clientX,y:e?s.pageY:s.clientY}}_calculateDragCopyPosition(s){let e=this._dragSrc.getBoundingClientRect();this._copyOffset.x=s.clientX-e.left,this._copyOffset.y=s.clientY-e.top}_getDelta(s){let e=Math.abs(s.clientX-this._touchDown.x),t=Math.abs(s.clientY-this._touchDown.y);return e+t}_dispatchEvent(s,e,t=!0){if(!s)return!1;let r=new CustomEvent(e,{bubbles:t,cancelable:!0});return r.dataTransfer=this._dataTransfer,s.dispatchEvent(r),r.defaultPrevented}_reset(){this._dragRunning&&(this._dragSrc.style.opacity="1.0",this._dragCopy.parentElement.removeChild(this._dragCopy)),this._dragRunning=!1,this._dragSrc=null,this._dragCopy=null,this._canDrag=!1,this._touchBegin=0,this._touchDown=null,this._lastClick=0,this._touchEndCalled=!1,this._dataTransfer={data:{},setData:function(s,e){this.data[s]=e},getData:function(s){return this.data[s]},effectAllowed:"move"},this._copyOffset={x:0,y:0},this._lastTarget=null,this._currentDropContainer=null,this._handleClick=!0}};import{property as ni}from"lit/decorators.js";var jt=(l,s,e)=>{class t extends l{constructor(){super(...arguments);this.disabled=!1}firstUpdated(o){if(this.classList.contains("qti-match-tabular"))return;super.firstUpdated(o);let a=Array.from(s?this.shadowRoot.querySelectorAll(e):this.querySelectorAll(e));this.dragoverHandler=this.dragoverHandler.bind(this),this.dragleaveHandler=this.dragleaveHandler.bind(this),this.dragenterHandler=this.dragenterHandler.bind(this),this.dropHandler=this.dropHandler.bind(this),a.forEach(c=>{c.setAttribute("dropzone","move"),c.addEventListener("dragleave",this.dragleaveHandler),this.attachHandler(c)});for(let c of a)this.observer=new MutationObserver(p=>{p.forEach(d=>{if(d.type==="attributes")switch(d.attributeName){case"disabled":{c.hasAttribute("disabled")?this.removeHandler(c):this.attachHandler(c);break}}})}),this.observer.observe(c,{attributes:!0})}attachHandler(o){o.addEventListener("dragover",this.dragoverHandler),o.addEventListener("dragenter",this.dragenterHandler),o.addEventListener("drop",this.dropHandler)}removeHandler(o){o.removeEventListener("dragover",this.dragoverHandler),o.removeEventListener("dragenter",this.dragenterHandler),o.removeEventListener("drop",this.dropHandler)}disconnectedCallback(){var o;this.classList.contains("qti-match-tabular")||(super.disconnectedCallback(),(o=this.observer)==null||o.disconnect())}dragenterHandler(o){o.preventDefault()}dragoverHandler(o){return o.preventDefault(),o.currentTarget.setAttribute("active",""),o.dataTransfer.dropEffect="move",!1}dropHandler(o){o.preventDefault();let a=o.currentTarget,c=this.querySelector(`[identifier=${o.dataTransfer.getData("text")}`),p=c||this.shadowRoot.querySelector(`[identifier=${o.dataTransfer.getData("text")}`);return a?p.parentElement.getAttribute("identifier")!==a.getAttribute("identifier")&&a.appendChild(p):console.error(`cannot find droppable, target: ${o.target?JSON.stringify(o.target):"null"}`),a.removeAttribute("active"),!1}dragleaveHandler(o){return o.preventDefault(),o.currentTarget.removeAttribute("active"),o.dataTransfer.dropEffect="none",!1}}return i([ni({type:Boolean,reflect:!0})],t.prototype,"disabled",2),t};var Kt=(l,s,e)=>{class t extends l{}return t};import{property as Q}from"lit/decorators.js";var V=(l,s,e,t)=>{class r extends Kt(jt(l,e,t),t,s){constructor(){super(...arguments);this.draggables=new Map;this.responseIdentifier="";this.configuration={copyStylesDragClone:!0,dragCanBePlacedBack:!0,dragOnClick:!1};this.disabled=!1;this.readonly=!1;this.minAssociations=1;this.maxAssociations=1;this.handleDragStart=a=>{a.dataTransfer.setData("text",a.currentTarget.getAttribute("identifier")),a.currentTarget.setAttribute("dragging",""),this.droppables.forEach(c=>c.setAttribute("enabled",""))};this.handleDragEnd=a=>{a.preventDefault(),this.droppables.forEach(p=>p.removeAttribute("enabled"));let c=a.currentTarget;c.removeAttribute("over"),c.removeAttribute("dragging"),(a.dataTransfer.dropEffect==="none"||a.dataTransfer.dropEffect===void 0)&&this.configuration.dragCanBePlacedBack&&this.placeDraggableBack(c),a.dataTransfer.dropEffect==="move"&&(this.saveResponse(),this.checkMaxMatchAssociations())}}reInitDragAndDrop(a,c){if(this.classList.contains("qti-match-tabular"))return;a.filter(d=>!this.draggables||!this.draggables.get(d)).length>0&&(this.dragDropApi.addDraggables(a),a.forEach(d=>{this.draggables.set(d,{parent:d.parentElement,index:Array.from(d.parentNode.children).indexOf(d)}),d.setAttribute("qti-draggable","true"),d.addEventListener("dragstart",this.handleDragStart),d.addEventListener("dragend",this.handleDragEnd)}))}handleDragOptionsChanged(a,c){this.dragDropApi.copyStylesDragClone=c.copyStylesDragClone,this.dragDropApi.dragOnClick=c.dragOnClick}handleDisabledChange(a,c){this.draggables.forEach((p,d)=>{c?d.setAttribute("disabled",""):d.removeAttribute("disabled"),c?d.removeAttribute("qti-draggable"):d.setAttribute("qti-draggable","true")})}handleReadonlyChange(a,c){this.draggables.forEach((p,d)=>{c?d.setAttribute("readonly",""):d.removeAttribute("readonly"),c?d.removeAttribute("qti-draggable"):d.setAttribute("qti-draggable","true")})}firstUpdated(a){super.firstUpdated(a),this.droppables=Array.from(e?this.shadowRoot.querySelectorAll(t):this.querySelectorAll(t))}connectedCallback(){super.connectedCallback(),this.dragDropApi=new je,this.dispatchEvent(new CustomEvent("qti-register-interaction",{bubbles:!0,composed:!0,detail:this}))}placeDraggableBack(a){let c=this.draggables.get(a),p=c.index<=c.parent.children.length?c.index:c.parent.children.length-1,d=c.parent,m=c.parent.children[p];d.insertBefore(a,m),this.saveResponse(),this.checkMaxMatchAssociations()}reset(a=!0){this.draggables.forEach((c,p)=>{let d=c.parent.children,m=c.index<d.length?c.index:d.length;c.parent.insertBefore(p,d[m])}),a&&this.saveResponse()}checkMaxMatchAssociations(){this.droppables.forEach(a=>{let p=+(a.getAttribute("match-max")||1)<=(a.querySelectorAll('[qti-draggable="true"]').length||0);p?a.setAttribute("disabled",""):a.removeAttribute("disabled"),p?a.removeAttribute("dropzone"):a.setAttribute("dropzone","move")})}set response(a){this.classList.contains("qti-match-tabular")||(this.reset(!1),a!==null&&Array.isArray(a)&&a.forEach(c=>{let[p,...d]=c.split(" ").reverse();if(p){let m=this.droppables.find(x=>x.getAttribute("identifier")===p);d.forEach(x=>{let g=this.querySelector(`[identifier=${x}]`);m?g?(m.appendChild(g),this.checkMaxMatchAssociations()):console.error(`cannot find draggable with identifier: ${x}`):console.error(`cannot find droppable with identifier: ${p}`)})}}))}validate(){let c=(e?Array.from(this.shadowRoot.querySelectorAll(t)):Array.from(this.querySelectorAll(t))).filter(p=>p.childElementCount>0).length;return this.minAssociations<=0||this.minAssociations<=c}saveResponse(){let a=this.droppables.map(c=>{let p="",d=c.querySelectorAll('[qti-draggable="true"]');return d.length>0&&(p+=Array.from(d).map(m=>m.getAttribute("identifier")).join(" ")+" "),p+=c.getAttribute("identifier"),p});this.dispatchEvent(new CustomEvent("qti-interaction-response",{bubbles:!0,composed:!0,detail:{responseIdentifier:this.responseIdentifier,response:a}}))}}return i([Vt(s)],r.prototype,"reInitDragAndDrop",1),i([Q({type:String,attribute:"response-identifier"})],r.prototype,"responseIdentifier",2),i([Q({attribute:!1,type:Object})],r.prototype,"configuration",2),i([b("configuration")],r.prototype,"handleDragOptionsChanged",1),i([Q({type:Boolean,reflect:!0})],r.prototype,"disabled",2),i([b("disabled",{waitUntilFirstUpdate:!0})],r.prototype,"handleDisabledChange",1),i([Q({type:Boolean,reflect:!0})],r.prototype,"readonly",2),i([b("readonly",{waitUntilFirstUpdate:!0})],r.prototype,"handleReadonlyChange",1),i([Q({type:Number,reflect:!0,attribute:"min-associations"})],r.prototype,"minAssociations",2),i([Q({type:Number,reflect:!0,attribute:"max-associations"})],r.prototype,"maxAssociations",2),r};var ee=class extends V(ai,"qti-simple-associable-choice",!0,".dl"){render(){return Wt` <slot name="prompt"></slot>
|
|
173
173
|
<slot name="qti-simple-associable-choice"></slot>
|
|
174
|
-
${this._childrenMap.length>0&&Array.from(Array(Math.ceil(this._childrenMap.length/2)).keys()).map((
|
|
174
|
+
${this._childrenMap.length>0&&Array.from(Array(Math.ceil(this._childrenMap.length/2)).keys()).map((s,e)=>Wt`<div part="associables-container">
|
|
175
175
|
<div name="left${e}" part="drop-list" class="dl" identifier="droplist${e}_left"></div>
|
|
176
176
|
<div name="right${e}" part="drop-list" class="dl" identifier="droplist${e}_right"></div>
|
|
177
|
-
</div>`)}`}connectedCallback(){super.connectedCallback(),this._childrenMap=Array.from(this.querySelectorAll("qti-simple-associable-choice"))}};ee.styles=
|
|
177
|
+
</div>`)}`}connectedCallback(){super.connectedCallback(),this._childrenMap=Array.from(this.querySelectorAll("qti-simple-associable-choice"))}};ee.styles=li`
|
|
178
178
|
:host {
|
|
179
179
|
display: block; /* necessary to calculate scaling position */
|
|
180
180
|
}
|
|
@@ -183,7 +183,7 @@ import{a as f,b as x,c as s,d as At}from"../chunk-H4VLZ2F7.js";import{provide as
|
|
|
183
183
|
flex-wrap: wrap;
|
|
184
184
|
gap: 0.5rem;
|
|
185
185
|
}
|
|
186
|
-
`,
|
|
186
|
+
`,i([pi()],ee.prototype,"_childrenMap",2),ee=i([ci("qti-associate-interaction")],ee);import{html as zt}from"lit";import{customElement as di,property as fe,state as ui}from"lit/decorators.js";var $=class extends h{constructor(){super();this._errorMessage=null;this.handlePostMessage=this.handlePostMessage.bind(this)}connectedCallback(){super.connectedCallback();let e=this.data.startsWith("http")?this.data:ae(this.baseItemUrl+"/"+this.data);fetch(e).then(t=>t.json()).then(t=>{this.manifest=t,this.setupCES()}).catch(t=>{this._errorMessage=t})}setupCES(){let e=this.shadowRoot.querySelector("#pciContainer"),t=e.contentWindow||e,r=e.contentDocument;window.addEventListener("message",this.handlePostMessage),r.open(),r.write(`
|
|
187
187
|
<html>
|
|
188
188
|
<head>
|
|
189
189
|
<link href='${ae(`${this.baseRefUrl}/${this.manifest.style[0]}`)}' rel="stylesheet" />
|
|
@@ -191,7 +191,7 @@ import{a as f,b as x,c as s,d as At}from"../chunk-H4VLZ2F7.js";import{provide as
|
|
|
191
191
|
</head>
|
|
192
192
|
<body></body>
|
|
193
193
|
</html>
|
|
194
|
-
`),r.close()}validate(){return this.rawResponse!==""}set response(e){this.rawResponse=e}disconnectedCallback(){this.
|
|
194
|
+
`),r.close()}getIFrames(){let e=this.shadowRoot.querySelectorAll("iframe"),t=this.querySelectorAll("iframe"),r=[...e,...t];for(let n of r){let o=n.src;if(new URL(o,window.location.href).origin===window.location.origin)try{let c=n.contentDocument||n.contentWindow.document;c&&this.getInnerIFrames(c,r)}catch(c){console.error("Error accessing nested iframe:",c)}}return r.forEach((n,o)=>{r.indexOf(n)!==o&&r.splice(o,1)}),r}getInnerIFrames(e,t=[]){return e.querySelectorAll("iframe").forEach(n=>{t.push(n);let o=n.src;if(new URL(o,window.location.href).origin===window.location.origin)try{let c=n.contentDocument||n.contentWindow.document;this.getInnerIFrames(c,t)}catch(c){console.error("Error accessing nested iframe:",c)}else console.warn("Skipped cross-origin iframe:",o)}),t}postToWindowAndIframes(e,t){window.postMessage({type:e,data:t},"*");let r=this.getIFrames();for(let n of r)n.contentWindow&&n.contentWindow.postMessage({type:e,data:t},"*")}handlePostMessage(e){let{type:t,data:r}=e.data;switch(t){case"setResponse":this.rawResponse=r,this.saveResponse(r);break;case"getResponse":{this.postToWindowAndIframes("responseData",this.rawResponse);break}case"getMedia":{let n=this.manifest.media.map(o=>o.startsWith("http")?o:ae(this.baseRefUrl+"/"+o));this.postToWindowAndIframes("mediaData",n);break}case"setStageHeight":console.log("setStageHeight not implemented");break}}validate(){return this.rawResponse!==""}set response(e){this.rawResponse=e}disconnectedCallback(){window.removeEventListener("message",this.handlePostMessage),super.disconnectedCallback()}render(){return zt`<iframe
|
|
195
195
|
width=${this.getAttribute("width")}
|
|
196
196
|
height=${this.getAttribute("height")}
|
|
197
197
|
frameborder="0"
|
|
@@ -202,8 +202,8 @@ import{a as f,b as x,c as s,d as At}from"../chunk-H4VLZ2F7.js";import{provide as
|
|
|
202
202
|
${this._errorMessage&&zt`<div style="color:red">
|
|
203
203
|
<h1>Error</h1>
|
|
204
204
|
${this._errorMessage}
|
|
205
|
-
</div>`}`}};
|
|
206
|
-
<slot part="drops"></slot>`}};ge.styles=[
|
|
205
|
+
</div>`}`}};i([fe({type:String,attribute:"response-identifier"})],$.prototype,"responseIdentifier",2),i([fe({type:String,attribute:"data"})],$.prototype,"data",2),i([fe({type:String,attribute:"data-base-item"})],$.prototype,"baseItemUrl",2),i([fe({type:String,attribute:"data-base-ref"})],$.prototype,"baseRefUrl",2),i([fe({type:String,attribute:"id"})],$.prototype,"id",2),i([ui()],$.prototype,"_errorMessage",2),$=i([di("qti-custom-interaction")],$);import{html as mi}from"lit";import{customElement as hi,property as Jt}from"lit/decorators.js";var te=class extends h{constructor(){super(...arguments);this.countAttempt="true"}validate(){return!0}set response(e){}render(){return mi`<button ?disabled=${this.disabled} part="button" @click=${this.endAttempt}>${this.title}</button>`}endAttempt(e){this.dispatchEvent(new CustomEvent("end-attempt",{bubbles:!0,composed:!0,detail:{responseIdentifier:this.responseIdentifier,countAttempt:this.countAttempt==="true"}}))}};i([Jt({type:String,attribute:"count-attempt"})],te.prototype,"countAttempt",2),i([Jt({type:String})],te.prototype,"title",2),te=i([hi("qti-end-attempt-interaction")],te);import{css as fi,html as gi,LitElement as bi}from"lit";import{customElement as vi}from"lit/decorators.js";var ge=class extends V(bi,"qti-gap-text",!1,"qti-gap"){render(){return gi` <slot part="drags" name="qti-gap-text"></slot>
|
|
206
|
+
<slot part="drops"></slot>`}set correctResponse(s){let e=[],t=Array.isArray(s)?s:[s];t&&(e=t.map(n=>{let o=n.split(" ");return{text:o[0],gap:o[1]}})),this.querySelectorAll("qti-gap").forEach((n,o)=>{var d,m,x,g;let a=n.getAttribute("identifier"),c=(d=e.find(A=>A.gap===a))==null?void 0:d.text,p=(m=this.querySelector(`qti-gap-text[identifier="${c}"]`))==null?void 0:m.textContent.trim();if(c&&p){if(!((x=n.nextElementSibling)!=null&&x.classList.contains("correct-option"))){let A=document.createElement("span");A.classList.add("correct-option"),A.textContent=p,n.insertAdjacentElement("afterend",A)}}else(g=n.nextElementSibling)!=null&&g.classList.contains("correct-option")&&n.nextElementSibling.remove()})}};ge.styles=[fi`
|
|
207
207
|
:host {
|
|
208
208
|
display: flex;
|
|
209
209
|
align-items: flex-start;
|
|
@@ -229,14 +229,14 @@ import{a as f,b as x,c as s,d as At}from"../chunk-H4VLZ2F7.js";import{provide as
|
|
|
229
229
|
flex: 1;
|
|
230
230
|
gap: 0.5rem;
|
|
231
231
|
}
|
|
232
|
-
`],ge=
|
|
232
|
+
`],ge=i([vi("qti-gap-match-interaction")],ge);import{css as yi,html as xi,svg as Zt}from"lit";import{customElement as Ei,query as qi,queryAssignedElements as Ci,state as kt}from"lit/decorators.js";import{ifDefined as Gt}from"lit/directives/if-defined.js";import{repeat as _i}from"lit/directives/repeat.js";function re(l,s,e,t){switch(l){case"circle":{let[r,n,o]=s,a=r/e.width*100,c=n/e.height*100,p=o/e.width*100;t.style.left=a-p+"%",t.style.top=c-p+"%",t.style.width=t.style.height=4*p+"px",t.style.borderRadius="9999px"}break;case"rect":{let[r,n,o,a]=s,c=r/e.width*100,p=n/e.height*100,d=o/e.width*100,m=a/e.height*100;t.style.left=c+"%",t.style.top=p+"%",t.style.width=d-c+"%",t.style.height=m-p+"%"}break;case"poly":{let r=s.reduce((v,Y,Mt,or)=>{if(Mt%2===1){let nr=v.pop();v[v.length]={x:nr,y:or[Mt]}}else v.push(Y);return v},[]),n=Math.min(...r.map(v=>v.x)),o=Math.max(...r.map(v=>v.x)),a=Math.min(...r.map(v=>v.y)),c=Math.max(...r.map(v=>v.y)),p=n/e.width*100,d=a/e.height*100,m=o/e.width*100,x=c/e.height*100;t.style.left=n/e.width*100+"%",t.style.top=a/e.height*100+"%",t.style.width=m-p+"%",t.style.height=x-d+"%";let A=r.map(v=>({x:(v.x-n)/(o-n)*100,y:(v.y-a)/(c-a)*100})).map(v=>Math.round(v.x)+"% "+Math.round(v.y)+"%").join(",");t.style.clipPath=`polygon(${A})`}break;default:break}}var D=class extends h{constructor(){super();this.startPoint=null;this.endPoint=null;this._lines=[];this.addEventListener("qti-register-hotspot",this.positionHotspotOnRegister)}reset(){this._lines=[]}validate(){return this._lines.length>0}set response(e){Array.isArray(e)&&(this._lines=e)}render(){var e,t,r,n;return xi`<slot name="prompt"></slot>
|
|
233
233
|
<line-container>
|
|
234
234
|
<svg
|
|
235
|
-
width=${
|
|
236
|
-
height=${
|
|
235
|
+
width=${Gt((e=this.grImage[0])==null?void 0:e.width)}
|
|
236
|
+
height=${Gt((t=this.grImage[0])==null?void 0:t.height)}
|
|
237
237
|
viewbox="0 0 ${(r=this.grImage[0])==null?void 0:r.width} ${(n=this.grImage[0])==null?void 0:n.height}"
|
|
238
238
|
>
|
|
239
|
-
${
|
|
239
|
+
${_i(this._lines,o=>o,(o,a)=>Zt`
|
|
240
240
|
<line
|
|
241
241
|
part="line"
|
|
242
242
|
x1=${parseInt(this.querySelector("[identifier="+o.split(" ")[0]+"]").style.left)}
|
|
@@ -245,10 +245,10 @@ import{a as f,b as x,c as s,d as At}from"../chunk-H4VLZ2F7.js";import{provide as
|
|
|
245
245
|
y2=${parseInt(this.querySelector("[identifier="+o.split(" ")[1]+"]").style.top)}
|
|
246
246
|
stroke="red"
|
|
247
247
|
stroke-width="3"
|
|
248
|
-
@click=${c=>{c.stopPropagation(),this._lines=this._lines.filter((p,d)=>d!==
|
|
248
|
+
@click=${c=>{c.stopPropagation(),this._lines=this._lines.filter((p,d)=>d!==a),this.saveResponse(this._lines)}}
|
|
249
249
|
/>
|
|
250
250
|
`)}
|
|
251
|
-
${this.startPoint&&
|
|
251
|
+
${this.startPoint&&Zt`<line
|
|
252
252
|
part="point"
|
|
253
253
|
x1=${this.startCoord.x}
|
|
254
254
|
y1=${this.startCoord.y}
|
|
@@ -259,7 +259,7 @@ import{a as f,b as x,c as s,d as At}from"../chunk-H4VLZ2F7.js";import{provide as
|
|
|
259
259
|
/>`}
|
|
260
260
|
</svg>
|
|
261
261
|
<slot></slot>
|
|
262
|
-
</line-container>`}positionHotspotOnRegister(e){let t=this.querySelector("img"),r=e.target,n=r.getAttribute("coords"),o=r.getAttribute("shape"),
|
|
262
|
+
</line-container>`}positionHotspotOnRegister(e){let t=this.querySelector("img"),r=e.target,n=r.getAttribute("coords"),o=r.getAttribute("shape"),a=n.split(",").map(c=>parseInt(c));re(o,a,t,r)}firstUpdated(e){super.firstUpdated(e),this.hotspots=this.querySelectorAll("qti-associable-hotspot"),document.addEventListener("mousemove",t=>{this.mouseCoord={x:t.clientX-this.grImage[0].getBoundingClientRect().left,y:t.clientY-this.grImage[0].getBoundingClientRect().top}}),this.hotspots.forEach(t=>{t.style.left=t.getAttribute("coords").split(",")[0]+"px",t.style.top=t.getAttribute("coords").split(",")[1]+"px",t.addEventListener("click",r=>{this.startPoint?this.endPoint||(this.endPoint=r.target,this._lines=[...this._lines,this.startPoint.getAttribute("identifier")+" "+this.endPoint.getAttribute("identifier")],this.saveResponse(this._lines),this.startPoint=null,this.endPoint=null):(this.startPoint=r.target,this.startCoord={x:this.startPoint.getAttribute("coords").split(",")[0],y:this.startPoint.getAttribute("coords").split(",")[1]})})})}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener("qti-register-hotspot",this.positionHotspotOnRegister)}};D.styles=[yi`
|
|
263
263
|
slot:not([name='prompt']) {
|
|
264
264
|
// position: relative; /* qti-hotspot-choice relative to the slot */
|
|
265
265
|
display: block;
|
|
@@ -282,8 +282,8 @@ import{a as f,b as x,c as s,d as At}from"../chunk-H4VLZ2F7.js";import{provide as
|
|
|
282
282
|
top: 0px;
|
|
283
283
|
left: 0px;
|
|
284
284
|
}
|
|
285
|
-
`],
|
|
286
|
-
<slot name="qti-gap-img"></slot>`}positionHotspotOnRegister(
|
|
285
|
+
`],i([kt()],D.prototype,"_lines",2),i([kt()],D.prototype,"startCoord",2),i([kt()],D.prototype,"mouseCoord",2),i([qi("svg")],D.prototype,"svgContainer",2),i([Ci({selector:"img"})],D.prototype,"grImage",2),D=i([Ei("qti-graphic-associate-interaction")],D);import{css as wi,html as ki,LitElement as Ti}from"lit";import{customElement as Ri}from"lit/decorators.js";var be=class extends V(Ti,"qti-gap-img",!1,"qti-associable-hotspot"){render(){return ki` <slot></slot>
|
|
286
|
+
<slot name="qti-gap-img"></slot>`}positionHotspotOnRegister(s){let e=this.querySelector("img"),t=s.target,r=t.getAttribute("coords"),n=t.getAttribute("shape"),o=r.split(",").map(a=>parseInt(a));switch(n){case"circle":{let[a,c,p]=o;t.style.left=a-p+"px",t.style.top=c-p+"px",t.style.width=t.style.height=2*p+"px"}break;case"rect":{let[a,c,p,d]=o;t.style.left=a+"px",t.style.top=c+"px",t.style.width=p-a+"px",t.style.height=d-c+"px"}break;default:break}}connectedCallback(){super.connectedCallback(),this.addEventListener("qti-register-hotspot",this.positionHotspotOnRegister)}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener("qti-register-hotspot",this.positionHotspotOnRegister)}};be.styles=wi`
|
|
287
287
|
:host {
|
|
288
288
|
display: inline-block;
|
|
289
289
|
position: relative;
|
|
@@ -292,12 +292,12 @@ import{a as f,b as x,c as s,d as At}from"../chunk-H4VLZ2F7.js";import{provide as
|
|
|
292
292
|
display: flex;
|
|
293
293
|
gap: 1rem;
|
|
294
294
|
}
|
|
295
|
-
`,be=
|
|
295
|
+
`,be=i([Ri("qti-graphic-gap-match-interaction")],be);import{css as Ai,html as Mi}from"lit";import{customElement as Li}from"lit/decorators.js";var ve=class extends E{render(){return Mi`
|
|
296
296
|
<slot name="prompt"></slot>
|
|
297
297
|
<!-- slot for the prompt -->
|
|
298
298
|
<slot></slot>
|
|
299
299
|
<!-- slot for the image and hotspots -->
|
|
300
|
-
`}setHotspotOrder(
|
|
300
|
+
`}setHotspotOrder(s){let{identifier:e}=s.detail,t=this._choiceElements.find(n=>n.getAttribute("identifier")===e),r=this._choiceElements.length;if(!this.choiceOrdering){if(this.choiceOrdering=!0,t.order==null){if(this._choiceElements.filter(n=>n.order>0).length>=r){this.choiceOrdering=!1;return}t.order=this._choiceElements.filter(n=>!!n.order).length+1,this.choiceOrdering=!1;return}else this._choiceElements.forEach(n=>(n.order>n.order&&n.order--,n)),t.order=null;this.choiceOrdering=!1}}positionHotspotOnRegister(s){let e=this.querySelector("img"),t=s.target,r=t.getAttribute("coords"),n=t.getAttribute("shape"),o=r.split(",").map(a=>parseInt(a));re(n,o,e,t)}connectedCallback(){super.connectedCallback(),this.addEventListener("qti-choice-element-selected",this.setHotspotOrder),this.addEventListener("qti-register-choice",this.positionHotspotOnRegister)}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener("qti-choice-element-selected",this.setHotspotOrder),this.removeEventListener("qti-register-choice",this.positionHotspotOnRegister)}};ve.styles=[Ai`
|
|
301
301
|
slot:not([name='prompt']) {
|
|
302
302
|
position: relative; /* qti-hotspot-choice relative to the slot */
|
|
303
303
|
display: block;
|
|
@@ -308,12 +308,12 @@ import{a as f,b as x,c as s,d as At}from"../chunk-H4VLZ2F7.js";import{provide as
|
|
|
308
308
|
pointer-events: none;
|
|
309
309
|
user-select: none;
|
|
310
310
|
}
|
|
311
|
-
`],ve=
|
|
311
|
+
`],ve=i([Li("qti-graphic-order-interaction")],ve);import{css as Si,html as Ni}from"lit";import{customElement as Hi}from"lit/decorators.js";var ye=class extends E{render(){return Ni`
|
|
312
312
|
<slot name="prompt"></slot>
|
|
313
313
|
<!-- slot for the prompt -->
|
|
314
314
|
<slot></slot>
|
|
315
315
|
<!-- slot for the image and hotspots -->
|
|
316
|
-
`}positionHotspotOnRegister(
|
|
316
|
+
`}positionHotspotOnRegister(s){let e=this.querySelector("img"),t=s.target,r=t.getAttribute("coords"),n=t.getAttribute("shape"),o=r.split(",").map(a=>parseInt(a));re(n,o,e,t)}connectedCallback(){super.connectedCallback(),this.addEventListener("qti-register-choice",this.positionHotspotOnRegister)}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener("qti-register-choice",this.positionHotspotOnRegister)}};ye.styles=[Si`
|
|
317
317
|
slot:not([name='prompt']) {
|
|
318
318
|
position: relative; /* qti-hotspot-choice relative to the slot */
|
|
319
319
|
display: block;
|
|
@@ -325,41 +325,60 @@ import{a as f,b as x,c as s,d as At}from"../chunk-H4VLZ2F7.js";import{provide as
|
|
|
325
325
|
user-select: none;
|
|
326
326
|
/* width:100%; */
|
|
327
327
|
}
|
|
328
|
-
`],ye=
|
|
328
|
+
`],ye=i([Hi("qti-hotspot-interaction")],ye);import{css as Oi,html as xe,LitElement as Pi}from"lit";import{customElement as Ui,property as Fi,state as Qt}from"lit/decorators.js";import{unsafeHTML as er}from"lit/directives/unsafe-html.js";import{html as Vi,LitElement as $i}from"lit";import{customElement as Di,property as Tt}from"lit/decorators.js";var K=class extends $i{constructor(){super(...arguments);this.matchMin=0;this.matchMax=1;this.fixed=!1}connectedCallback(){super.connectedCallback(),this.setAttribute("slot","qti-simple-associable-choice"),this.setAttribute("part","qti-simple-associable-choice")}render(){return Vi`
|
|
329
329
|
<slot></slot>
|
|
330
330
|
<slot name="qti-simple-associable-choice"></slot>
|
|
331
|
-
`}};
|
|
331
|
+
`}};i([Tt({type:Number,attribute:"match-min"})],K.prototype,"matchMin",2),i([Tt({type:Number,attribute:"match-max"})],K.prototype,"matchMax",2),i([Tt({type:Boolean,attribute:"fixed"})],K.prototype,"fixed",2),K=i([Di("qti-simple-associable-choice")],K);var B=class extends V(Pi,"qti-simple-match-set:first-of-type qti-simple-associable-choice",!1,"qti-simple-match-set:last-of-type qti-simple-associable-choice"){constructor(){super(...arguments);this.lastCheckedRadio=null;this.response=[];this.correctOptions=[];this.responseIdentifier="";this.handleRadioClick=e=>{let t=e.target;this.lastCheckedRadio===t?(t.checked=!1,this.lastCheckedRadio=null,this.handleRadioChange(e)):this.lastCheckedRadio=t};this.handleRadioChange=e=>{let t=e.target,r=t.value,n=t.name,o=t.type;t.checked?(this.response?this.response.indexOf(r)===-1&&(o==="radio"&&(this.response=this.response.filter(a=>a.indexOf(n)===-1)),this.response=[...this.response,r]):this.response=[r],this.lastCheckedRadio=t):(this.response=this.response.filter(a=>a!==r),this.lastCheckedRadio=null),this.requestUpdate(),this.dispatchEvent(new CustomEvent("qti-interaction-response",{bubbles:!0,composed:!0,detail:{responseIdentifier:this.responseIdentifier,response:Array.isArray(this.response)?[...this.response]:this.response}}))}}connectedCallback(){super.connectedCallback(),this.rows=Array.from(this.querySelectorAll("qti-simple-match-set:first-of-type qti-simple-associable-choice")),this.cols=Array.from(this.querySelectorAll("qti-simple-match-set:last-of-type qti-simple-associable-choice")),this.response=[]}set correctResponse(e){if(e===""){this.correctOptions=[];return}else Array.isArray(e)&&(this.correctOptions=e)}render(){return this.classList.contains("qti-match-tabular")?xe`
|
|
332
332
|
<slot name="prompt"></slot>
|
|
333
333
|
<table>
|
|
334
334
|
<tr>
|
|
335
335
|
<td></td>
|
|
336
|
-
${this.cols.map((e,t)=>xe`<th part="r-header">${
|
|
336
|
+
${this.cols.map((e,t)=>xe`<th part="r-header">${er(e.innerHTML)}</th>`)}
|
|
337
337
|
</tr>
|
|
338
338
|
|
|
339
339
|
${this.rows.map((e,t)=>xe`<tr>
|
|
340
|
-
<td part="c-header">${
|
|
341
|
-
${this.cols.map((r,n)=>{let o=e.getAttribute("identifier"),
|
|
340
|
+
<td part="c-header">${er(e.innerHTML)}</td>
|
|
341
|
+
${this.cols.map((r,n)=>{let o=e.getAttribute("identifier"),a=r.getAttribute("identifier"),c=`${o} ${a}`,p=this.response.filter(g=>g.split(" ")[0]===o).length||0,d=this.response.includes(c),m=`rb ${d?"rb-checked":""} ${this.correctOptions.includes(c)?"rb-correct":""}`,x=this.correctOptions.length>0?!0:e.matchMax===1?!1:p>=e.matchMax&&!d;return xe`<td>
|
|
342
342
|
<input
|
|
343
343
|
type=${e.matchMax===1?"radio":"checkbox"}
|
|
344
344
|
role="id"
|
|
345
|
+
part=${m}
|
|
345
346
|
name=${o}
|
|
346
347
|
value=${c}
|
|
347
|
-
.disabled=${
|
|
348
|
-
|
|
349
|
-
@
|
|
350
|
-
@click=${y=>e.matchMax===1?this.handleRadioClick(y):null}
|
|
348
|
+
.disabled=${x}
|
|
349
|
+
@change=${g=>this.handleRadioChange(g)}
|
|
350
|
+
@click=${g=>e.matchMax===1?this.handleRadioClick(g):null}
|
|
351
351
|
/>
|
|
352
352
|
</td>`})}
|
|
353
353
|
</tr>`)}
|
|
354
354
|
</table>
|
|
355
|
-
`:xe`<slot name="prompt"></slot> <slot></slot>`}};
|
|
356
|
-
|
|
355
|
+
`:xe`<slot name="prompt"></slot> <slot></slot>`}};B.styles=[Oi`
|
|
356
|
+
:host {
|
|
357
|
+
display: flex;
|
|
358
|
+
flex-direction: column;
|
|
359
|
+
gap: 0.5rem;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/* :host(.qti-choices-top) {
|
|
363
|
+
flex-direction: column;
|
|
364
|
+
} */
|
|
365
|
+
:host(.qti-choices-bottom) {
|
|
366
|
+
flex-direction: column-reverse;
|
|
367
|
+
}
|
|
368
|
+
:host(.qti-choices-left) {
|
|
369
|
+
flex-direction: row;
|
|
370
|
+
}
|
|
371
|
+
:host(.qti-choices-right) {
|
|
372
|
+
flex-direction: row-reverse;
|
|
373
|
+
}
|
|
374
|
+
`],i([Qt()],B.prototype,"response",2),i([Qt()],B.prototype,"correctOptions",2),i([Fi({type:String,attribute:"response-identifier"})],B.prototype,"responseIdentifier",2),B=i([Ui("qti-match-interaction")],B);import{css as Ii,html as Bi}from"lit";import{customElement as Xi}from"lit/decorators.js";var Ee=class extends h{constructor(){super();this.value=0}reset(){}validate(){return!0}set response(e){}static get properties(){return y(f({},h.properties),{step:{type:Number,attribute:"step",default:10}})}render(){return Bi` <slot name="prompt"></slot>
|
|
375
|
+
<slot></slot>`}connectedCallback(){super.connectedCallback();let e=this.querySelector("audio")||this.querySelector("video")||this.querySelector("object");e&&e.addEventListener("ended",()=>{this.value++,this.saveResponse(this.value.toString())})}};Ee.styles=[Ii``],Ee=i([Xi("qti-media-interaction")],Ee);import{css as Yi,html as tr,LitElement as ji}from"lit";import{customElement as Ki,property as Wi,state as Rt}from"lit/decorators.js";import{unsafeHTML as zi}from"lit/directives/unsafe-html.js";var O=class extends V(ji,"qti-simple-choice",!0,"drop-list"){constructor(){super(...arguments);this.nrChoices=0;this.correctResponses=[];this.showCorrectResponses=!1}render(){let e=Array.from(this.querySelectorAll("qti-simple-choice"));return this.nrChoices<e.length&&(this.nrChoices=e.length),tr` <slot name="prompt"> </slot>
|
|
357
376
|
<div part="container">
|
|
358
377
|
<slot part="drags"> </slot>
|
|
359
378
|
<div part="drops">
|
|
360
|
-
${Array.from(this.
|
|
379
|
+
${Array.from(Array(this.nrChoices)).map((t,r)=>tr`<drop-list part="drop-list" identifier="droplist${r}"></drop-list>${this.showCorrectResponses&&this.correctResponses.length>r?zi(`<span part='correct-response'>${this.correctResponses[r]}</span>`):""}`)}
|
|
361
380
|
</div>
|
|
362
|
-
</div>`}connectedCallback(){super.connectedCallback(),this.childrenMap=Array.from(this.querySelectorAll("qti-simple-choice")),this.childrenMap.forEach(
|
|
381
|
+
</div>`}set correctResponse(e){if(e===""){this.showCorrectResponses=!1;return}this.correctResponses.length===0&&(Array.isArray(e)?e:[e]).forEach((r,n)=>{let o=this.querySelector(`qti-simple-choice[identifier="${r}"]`);o||(o=this.shadowRoot.querySelector(`qti-simple-choice[identifier="${r}"]`));let a=o==null?void 0:o.textContent.trim();this.correctResponses=[...this.correctResponses,a]}),this.showCorrectResponses=!0}connectedCallback(){super.connectedCallback(),this.childrenMap=Array.from(this.querySelectorAll("qti-simple-choice")),this.childrenMap.forEach(e=>e.setAttribute("part","qti-simple-choice"))}};O.layoutClass=["qti-choices-top","qti-choices-bottom","qti-choices-left","qti-choices-right"],O.styles=[Yi`
|
|
363
382
|
[part='drags'] {
|
|
364
383
|
display: flex;
|
|
365
384
|
align-items: flex-start;
|
|
@@ -407,7 +426,7 @@ import{a as f,b as x,c as s,d as At}from"../chunk-H4VLZ2F7.js";import{provide as
|
|
|
407
426
|
:host(.qti-choices-right) [part='container'] {
|
|
408
427
|
flex-direction: row-reverse;
|
|
409
428
|
}
|
|
410
|
-
`],
|
|
429
|
+
`],i([Rt()],O.prototype,"nrChoices",2),i([Rt()],O.prototype,"correctResponses",2),i([Rt()],O.prototype,"showCorrectResponses",2),i([Wi({type:String})],O.prototype,"orientation",2),O=i([Ki("qti-order-interaction")],O);import{LitElement as Ji,css as Zi,html as Gi}from"lit";var Ke=class extends Ji{render(){return Gi`<slot></slot>`}};Ke.styles=[Zi`
|
|
411
430
|
:host {
|
|
412
431
|
display: block;
|
|
413
432
|
}
|
|
@@ -418,23 +437,23 @@ import{a as f,b as x,c as s,d as At}from"../chunk-H4VLZ2F7.js";import{provide as
|
|
|
418
437
|
left: 50%;
|
|
419
438
|
transform: translateX(-50%);
|
|
420
439
|
}
|
|
421
|
-
`];customElements.define("qti-position-object-interaction",Ke);import{LitElement as
|
|
440
|
+
`];customElements.define("qti-position-object-interaction",Ke);import{LitElement as Qi,css as eo,html as to}from"lit";import{customElement as ro}from"lit/decorators.js";var qe=class extends Qi{render(){return to`<slot></slot>`}constructor(){super(),this.removeMoveListener=this.removeMoveListener.bind(this),this.dragElementHandler=this.dragElementHandler.bind(this)}dragElementHandler(s){s.preventDefault();let e=s.clientX-this.startX,t=s.clientY-this.startY;this.dragElement.style.left=this.dragElement.offsetLeft+e+"px",this.dragElement.style.top=this.dragElement.offsetTop+t+"px",this.startX=s.clientX,this.startY=s.clientY}firstUpdated(s){super.firstUpdated(s),this.dragElement=this.querySelector("qti-position-object-interaction>img"),this.startX=0,this.startY=0,this.dragElement.addEventListener("mousedown",e=>{this.startX=e.clientX,this.startY=e.clientY,document.addEventListener("mousemove",this.dragElementHandler,!0)}),document.addEventListener("mouseup",this.removeMoveListener)}removeMoveListener(s){document.removeEventListener("mousemove",this.dragElementHandler,!0)}disconnectedCallback(){super.disconnectedCallback(),document.removeEventListener("mousemove",this.dragElementHandler),document.removeEventListener("mouseup",this.removeMoveListener)}};qe.styles=[eo`
|
|
422
441
|
:host {
|
|
423
442
|
display: inline-block;
|
|
424
443
|
position: relative;
|
|
425
444
|
}
|
|
426
|
-
`],qe=
|
|
445
|
+
`],qe=i([ro("qti-position-object-stage")],qe);import{css as so,html as rr}from"lit";import{customElement as io,property as sr,state as oo}from"lit/decorators.js";import{repeat as no}from"lit/directives/repeat.js";import{styleMap as ao}from"lit/directives/style-map.js";var X=class extends h{constructor(){super(...arguments);this.maxChoices=0;this.minChoices=0;this._points=[]}render(){return rr` <slot name="prompt"></slot>
|
|
427
446
|
<point-container>
|
|
428
|
-
${
|
|
447
|
+
${no(this._points,e=>e,(e,t)=>rr`
|
|
429
448
|
<button
|
|
430
449
|
part="point"
|
|
431
|
-
style=${
|
|
450
|
+
style=${ao({position:"absolute",transform:"translate(-50%, -50%)",left:`${e.split(" ")[0]}px`,top:`${e.split(" ")[1]}px`})}
|
|
432
451
|
aria-label="Remove point at ${e}"
|
|
433
452
|
@click=${r=>{r.stopPropagation(),this._points=this._points.filter((n,o)=>o!==t),this.saveResponse(this._points)}}
|
|
434
453
|
></button>
|
|
435
454
|
`)}
|
|
436
455
|
<slot></slot>
|
|
437
|
-
</point-container>`}reset(){this._points=[]}validate(){return this._points.length>=this.minChoices&&this._points.length<=this.maxChoices}set response(e){this._points=Array.isArray(e)?e:[e]}connectedCallback(){super.connectedCallback(),this.querySelector("img").addEventListener("click",t=>{let r=t.offsetX,n=t.offsetY;this._points=[...this._points,r+" "+n],this.saveResponse(this._points)})}disconnectedCallback(){super.disconnectedCallback()}};
|
|
456
|
+
</point-container>`}reset(){this._points=[]}validate(){return this._points.length>=this.minChoices&&this._points.length<=this.maxChoices}set response(e){this._points=Array.isArray(e)?e:[e]}connectedCallback(){super.connectedCallback(),this.querySelector("img").addEventListener("click",t=>{let r=t.offsetX,n=t.offsetY;this._points=[...this._points,r+" "+n],this.saveResponse(this._points)})}disconnectedCallback(){super.disconnectedCallback()}};X.styles=[so`
|
|
438
457
|
:host {
|
|
439
458
|
display: block;
|
|
440
459
|
}
|
|
@@ -442,29 +461,29 @@ import{a as f,b as x,c as s,d as At}from"../chunk-H4VLZ2F7.js";import{provide as
|
|
|
442
461
|
display: block;
|
|
443
462
|
position: relative;
|
|
444
463
|
}
|
|
445
|
-
`],
|
|
464
|
+
`],i([sr({type:Number,attribute:"max-choices"})],X.prototype,"maxChoices",2),i([sr({type:Number,attribute:"min-choices"})],X.prototype,"minChoices",2),i([oo()],X.prototype,"_points",2),X=i([io("qti-select-point-interaction")],X);import{css as lo,html as We,nothing as At}from"lit";import{customElement as co,property as se,query as ir}from"lit/decorators.js";var q=class extends h{constructor(){super();this.stepLabel=!1;this.reverse=!1;this._handleDisabledChange=(e,t)=>{};this._handleReadonlyChange=(e,t)=>{};this.csLive=getComputedStyle(this)}set min(e){this._min=e,this.value=e,this.style.setProperty("--min",`${this._min}`)}get min(){return this._min}set max(e){this._max=e,this.style.setProperty("--max",`${this._max}`)}get max(){return this._max}set step(e){this._step=e,this.style.setProperty("--step",`${this._step}`)}get step(){return this._step}reset(){}validate(){return!0}set response(e){if(Array.isArray(e)){console.error("QtiSliderInteraction: response is an array, but should be a single value");return}let t=parseInt(e);if(Number.isNaN(t)){console.error("QtiSliderInteraction: response is not a number");return}this.value=t}render(){this.value<this.min&&(this.value=this.min),this.value>this.max&&(this.value=this.max);let e=(this.value-this.min)/(this.max-this.min)*100;return this.style.setProperty("--value-percentage",`${e}%`),this.setAttribute("aria-valuenow",this.value.toString()),We`<slot name="prompt"></slot>
|
|
446
465
|
<div id="slider" part="slider">
|
|
447
|
-
${this.csLive.getPropertyValue("--show-bounds")=="true"?
|
|
466
|
+
${this.csLive.getPropertyValue("--show-bounds")=="true"?We`<div id="bounds" part="bounds">
|
|
448
467
|
<div>${this._min}</div>
|
|
449
468
|
<div>${this._max}</div>
|
|
450
|
-
</div>`:
|
|
451
|
-
${this.csLive.getPropertyValue("--show-ticks")=="true"?
|
|
469
|
+
</div>`:At}
|
|
470
|
+
${this.csLive.getPropertyValue("--show-ticks")=="true"?We`<div id="ticks" part="ticks"></div>`:At}
|
|
452
471
|
<div id="rail" part="rail" @mousedown=${this._onMouseDown} @touchstart=${this._onTouchMove}>
|
|
453
472
|
<div id="knob" part="knob">
|
|
454
|
-
${this.csLive.getPropertyValue("--show-value")=="true"?
|
|
473
|
+
${this.csLive.getPropertyValue("--show-value")=="true"?We`<div id="value" part="value">${this.value}</div>`:At}
|
|
455
474
|
</div>
|
|
456
475
|
</div>
|
|
457
|
-
</div>`}connectedCallback(){super.connectedCallback(),this.step=1,this.setAttribute("tabindex","0"),this.setAttribute("role","slider")}_onTouchMove(e){let t=
|
|
476
|
+
</div>`}connectedCallback(){super.connectedCallback(),this.step=1,this.setAttribute("tabindex","0"),this.setAttribute("role","slider")}_onTouchMove(e){let t=a=>{let{x:c}=this.getPositionFromEvent(a),p=c-this._rail.getBoundingClientRect().left-document.documentElement.scrollLeft;this.calculateValue(p),a.stopPropagation()},r=()=>{document.removeEventListener("touchmove",t),document.removeEventListener("touchend",r),this.saveResponse(this.value.toString())};document.addEventListener("touchmove",t),document.addEventListener("touchend",r);let{x:n}=this.getPositionFromEvent(e),o=n-this._rail.getBoundingClientRect().left-document.documentElement.scrollLeft;this.calculateValue(o),e.stopPropagation()}_onMouseDown(e){let t=o=>{let a=o.pageX-this._rail.getBoundingClientRect().left-document.documentElement.scrollLeft;this.calculateValue(a),o.preventDefault(),o.stopPropagation()},r=()=>{document.removeEventListener("mousemove",t),document.removeEventListener("mouseup",r),this.saveResponse(this.value.toString())};document.addEventListener("mousemove",t),document.addEventListener("mouseup",r);let n=e.pageX-this._rail.getBoundingClientRect().left-document.documentElement.scrollLeft;this.calculateValue(n),e.preventDefault(),e.stopPropagation()}calculateValue(e){let t=this.min+(this.max-this.min)*e/this._rail.getBoundingClientRect().width,r=this.min+Math.round((t-this.min)/this._step)*this._step;this.value=r}getPositionFromEvent(e){let t;if(e.type=="touchstart"||e.type=="touchmove"||e.type=="touchend"||e.type=="touchcancel"){let r=typeof e.originalEvent=="undefined"?e:e.originalEvent,n=r.touches[0]||r.changedTouches[0];t={x:n.pageX,y:n.pageY}}else(e.type=="mousedown"||e.type=="mouseup"||e.type=="mousemove"||e.type=="mouseover"||e.type=="mouseout"||e.type=="mouseenter"||e.type=="mouseleave")&&(t={x:e.clientX,y:e.clientY});return t}};q.styles=[lo``],i([ir("#knob")],q.prototype,"_knob",2),i([ir("#rail")],q.prototype,"_rail",2),i([se({type:Number})],q.prototype,"value",2),i([se({type:Boolean,attribute:"step-label"})],q.prototype,"stepLabel",2),i([se({type:Boolean})],q.prototype,"reverse",2),i([se({type:Number,attribute:"lower-bound"})],q.prototype,"min",1),i([se({type:Number,attribute:"upper-bound"})],q.prototype,"max",1),i([se({type:Number,attribute:"step"})],q.prototype,"step",1),i([b("disabled",{waitUntilFirstUpdate:!0})],q.prototype,"_handleDisabledChange",2),i([b("readonly",{waitUntilFirstUpdate:!0})],q.prototype,"_handleReadonlyChange",2),q=i([co("qti-slider-interaction")],q);import{consume as po}from"@lit/context";import{LitElement as uo,html as mo}from"lit";import{customElement as ho,state as fo}from"lit/decorators.js";var Ce=class extends uo{render(){return mo`<slot @slotchange=${this.handleSlotChange}></slot>`}handleSlotChange(s){var t,r,n;let e=Array.from((r=(t=this.firstElementChild)==null?void 0:t.childNodes)!=null?r:[]).find(o=>o.nodeType===Node.COMMENT_NODE);try{this.operatorFunction=new Function("context","fn","item",(n=e.textContent)!=null?n:"")}catch(o){console.error("custom-operator contains invalid javascript code",o)}}calculate(){let s={variable:t=>{var r,n,o;return(o=(n=(r=this._context)==null?void 0:r.variables.find(a=>a.identifier===t))==null?void 0:n.value)!=null?o:""},correct:t=>{var r,n,o;return(o=(n=(r=this._context)==null?void 0:r.variables.find(a=>a.identifier===t))==null?void 0:n.correctResponse)!=null?o:""}},e={getVariable:t=>{var r;return(r=this._context)==null?void 0:r.variables.find(n=>n.identifier===t)},updateOutcomeVariable:(t,r)=>{this.dispatchEvent(new CustomEvent("qti-set-outcome-value",{bubbles:!0,composed:!0,detail:{outcomeIdentifier:t,value:r}}))}};return this.operatorFunction(this._context,s,e)}};i([po({context:M,subscribe:!0}),fo()],Ce.prototype,"_context",2),Ce=i([ho("qti-custom-operator")],Ce);import{LitElement as go,css as bo,html as vo}from"lit";import{customElement as yo}from"lit/decorators.js";var _e=class extends go{connectedCallback(){super.connectedCallback(),this.dispatchEvent(new CustomEvent("qti-register-hotspot",{bubbles:!0,cancelable:!1,composed:!0}))}render(){return vo` <slot name="qti-gap-img"></slot> `}};_e.styles=bo`
|
|
458
477
|
:host {
|
|
459
478
|
position: absolute;
|
|
460
479
|
}
|
|
461
|
-
`,_e=
|
|
480
|
+
`,_e=i([yo("qti-associable-hotspot")],_e);import{html as xo,LitElement as Eo}from"lit";import{customElement as qo,property as Co}from"lit/decorators.js";var we=class extends Eo{constructor(){super(...arguments);this.tabindex=0}render(){return xo` <slot name="qti-gap-text"></slot>`}};i([Co({type:Number,reflect:!0})],we.prototype,"tabindex",2),we=i([qo("qti-gap")],we);import{LitElement as _o}from"lit";import{customElement as wo,property as ko}from"lit/decorators.js";var ke=class extends _o{constructor(){super(...arguments);this.tabindex=0}connectedCallback(){this.setAttribute("slot","qti-gap-img")}};i([ko({type:Number,reflect:!0})],ke.prototype,"tabindex",2),ke=i([wo("qti-gap-img")],ke);import{html as To,LitElement as Ro}from"lit";import{customElement as Ao,property as Mo}from"lit/decorators.js";var Te=class extends Ro{constructor(){super(...arguments);this.tabindex=0}connectedCallback(){super.connectedCallback(),this.setAttribute("slot","qti-gap-text")}render(){return To`<slot></slot>`}};i([Mo({type:Number,reflect:!0})],Te.prototype,"tabindex",2),Te=i([Ao("qti-gap-text")],Te);import{css as Lo}from"lit";import{customElement as So,property as No}from"lit/decorators.js";var ie=class extends C{};ie.styles=Lo`
|
|
462
481
|
:host {
|
|
463
482
|
position: absolute;
|
|
464
483
|
}
|
|
465
|
-
`,
|
|
466
|
-
<slot></slot> `}};
|
|
467
|
-
<slot part="slot"></slot> `}};Re.styles
|
|
484
|
+
`,i([No({attribute:"aria-ordervalue",type:Number,reflect:!0})],ie.prototype,"order",2),ie=i([So("qti-hotspot-choice")],ie);import{customElement as Ho}from"lit/decorators.js";import{html as Vo}from"lit";var ze=class extends C{render(){return Vo`<div part="ch"><div part="cha"></div></div>
|
|
485
|
+
<slot></slot> `}};ze=i([Ho("qti-hottext")],ze);import{LitElement as $o}from"lit";import{customElement as Do}from"lit/decorators.js";var Je=class extends $o{};Je=i([Do("qti-inline-choice")],Je);import{customElement as Oo}from"lit/decorators.js";import{css as Po,html as Uo}from"lit";var Re=class extends C{render(){return Uo`<div part="ch"><div part="cha"></div></div>
|
|
486
|
+
<slot part="slot"></slot> `}};Re.styles=Po`
|
|
468
487
|
:host {
|
|
469
488
|
display: flex;
|
|
470
489
|
}
|
|
@@ -472,5 +491,5 @@ import{a as f,b as x,c as s,d as At}from"../chunk-H4VLZ2F7.js";import{provide as
|
|
|
472
491
|
width: 100%;
|
|
473
492
|
display: block;
|
|
474
493
|
}
|
|
475
|
-
`,Re=
|
|
476
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0udHMiLCAiLi4vLi4vc3JjL2xpYi9kZWNvcmF0b3JzL3dhdGNoLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYvcXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2Nob2ljZS9xdGktY2hvaWNlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWl0ZW0tYm9keS9xdGktaXRlbS1ib2R5LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWl0ZW0tYm9keS9xdGktaXRlbS1ib2R5LnN0eWxlcy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1wcm9tcHQvcXRpLXByb21wdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1zdHlsZXNoZWV0L3F0aS1zdHlsZXNoZWV0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uL3F0aS1vdXRjb21lLWRlY2xhcmF0aW9uL3F0aS1vdXRjb21lLWRlY2xhcmF0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbi9xdGktcmVzcG9uc2UtZGVjbGFyYXRpb24vcXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mby9xdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJ1YnJpYy1ibG9jay9xdGktY29udGVudC1ib2R5LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJ1YnJpYy1ibG9jay9xdGktcnVicmljLWJsb2NrLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay1ibG9jay9xdGktZmVlZGJhY2stYmxvY2sudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktZmVlZGJhY2svcXRpLWZlZWRiYWNrLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvaW50ZXJuYWwvdXRpbHMudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktZmVlZGJhY2svcXRpLWZlZWRiYWNrLWlubGluZS9xdGktZmVlZGJhY2staW5saW5lLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWZlZWRiYWNrL3F0aS1tb2RhbC1mZWVkYmFjay9xdGktbW9kYWwtZmVlZGJhY2sudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWV4dGVuZGVkLXRleHQtaW50ZXJhY3Rpb24vcXRpLWV4dGVuZGVkLXRleHQtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9kZWNvcmF0b3JzL2xpdmUtcXVlcnkudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvY2hvaWNlcy9jaG9pY2VzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktY2hvaWNlLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24uc3R5bGVzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLW91dGNvbWUtcHJvY2Vzc2luZy9xdGktb3V0Y29tZS1wcm9jZXNzaW5nLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9pbnRlcm5hbC90ZW1wbGF0ZS1zdHJpbmdzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLWxvb2t1cC1vdXRjb21lLXZhbHVlL3F0aS1sb29rdXAtb3V0Y29tZS12YWx1ZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1ydWxlL3F0aS1ydWxlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLXJlc3BvbnNlLWNvbmRpdGlvbi9xdGktcmVzcG9uc2UtY29uZGl0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLXNldC1vdXRjb21lLXZhbHVlL3F0aS1zZXQtb3V0Y29tZS12YWx1ZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1yZXNwb25zZS1lbHNlL3F0aS1yZXNwb25zZS1lbHNlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJlc3BvbnNlLWVsc2UvcXRpLXJlc3BvbnNlLWlmL3F0aS1yZXNwb25zZS1lbHNlLWlmL3F0aS1yZXNwb25zZS1lbHNlLWlmLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJlc3BvbnNlLWVsc2UvcXRpLXJlc3BvbnNlLWlmL3F0aS1yZXNwb25zZS1pZi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWFuZC9xdGktYW5kLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWFuZC9pbmRleC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1iYXNldmFsdWUvcXRpLWJhc2V2YWx1ZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1jb250YWlucy9xdGktY29udGFpbnMudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktY29ycmVjdC9xdGktY29ycmVjdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1lcXVhbC1yb3VuZGVkL3F0aS1lcXVhbC1yb3VuZGVkLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWVxdWFsL3F0aS1lcXVhbC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3V0aWxpdGllcy9zY29yaW5nLWhlbHBlci50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1ndC9xdGktZ3QudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktZ3RlL3F0aS1ndGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktaXMtbnVsbC9xdGktaXMtbnVsbC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1sdC9xdGktbHQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbHRlL3F0aS1sdGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWFwLXJlc3BvbnNlL3F0aS1tYXAtcmVzcG9uc2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWFwcGluZy9xdGktbWFwcGluZy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tYXRjaC9xdGktbWF0Y2gudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWVtYmVyL3F0aS1tZW1iZXIudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbXVsdGlwbGUvcXRpLW11bHRpcGxlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW5vdC9xdGktbm90LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW9yL3F0aS1vci50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1vcmRlcmVkL3F0aS1vcmRlcmVkLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLXByaW50ZWQtdmFyaWFibGUvcXRpLXByaW50ZWQtdmFyaWFibGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktcHJvZHVjdC9xdGktcHJvZHVjdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1zdHJpbmctbWF0Y2gvcXRpLXN0cmluZy1tYXRjaC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1zdW0vcXRpLXN1bS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS12YXJpYWJsZS9xdGktdmFyaWFibGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWFwaS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJvcHBhYmxlcy1taXhpbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9kcmFnLWRyb3AvZmxpcHBhYmxlcy1taXhpbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1jdXN0b20taW50ZXJhY3Rpb24vcXRpLWN1c3RvbS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24vcXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLWdhcC1tYXRjaC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2hvdHNwb3RzL2hvdHNwb3QudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWdhcC1tYXRjaC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1vcmRlci1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1vcmRlci1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaG90c3BvdC1pbnRlcmFjdGlvbi9xdGktaG90c3BvdC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLW1hdGNoLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLW1lZGlhLWludGVyYWN0aW9uL3F0aS1tZWRpYS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktb3JkZXItaW50ZXJhY3Rpb24vcXRpLW9yZGVyLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3Qtc3RhZ2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbi9xdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1zbGlkZXItaW50ZXJhY3Rpb24vcXRpLXNsaWRlci1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1jdXN0b20tb3BlcmF0b3IvcXRpLWN1c3RvbS1vcGVyYXRvci50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYWJsZS1ob3RzcG90LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1nYXAudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC1pbWcudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC10ZXh0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWNob2ljZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaG90dGV4dC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaW5saW5lLWNob2ljZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktc2ltcGxlLWNob2ljZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBwcm92aWRlIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuaW1wb3J0IHR5cGUgeyBJbnRlcmFjdGlvbkNoYW5nZWREZXRhaWxzLCBPdXRjb21lQ2hhbmdlZERldGFpbHMgfSBmcm9tICcuLi9pbnRlcm5hbC9ldmVudC10eXBlcyc7XG5pbXBvcnQgdHlwZSB7IFJlc3BvbnNlSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgdHlwZSB7IFZhcmlhYmxlRGVjbGFyYXRpb24sIFZhcmlhYmxlVmFsdWUgfSBmcm9tICcuLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgT3V0Y29tZVZhcmlhYmxlLCBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB0eXBlIHsgUXRpRmVlZGJhY2sgfSBmcm9tICcuLi9xdGktZmVlZGJhY2svcXRpLWZlZWRiYWNrJztcbmltcG9ydCB0eXBlIHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHR5cGUgeyBRdGlSZXNwb25zZVByb2Nlc3NpbmcgfSBmcm9tICcuLi9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZyc7XG5pbXBvcnQgeyBJdGVtQ29udGV4dCwgaXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0VmFyaWFibGVzIH0gZnJvbSAnLi9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBxdGktYXNzZXNzbWVudC1pdGVtIGVsZW1lbnQgY29udGFpbnMgYWxsIHRoZSBvdGhlciBRVEkgMyBpdGVtIHN0cnVjdHVyZXMuXG4gKiBAZG9jdW1lbnRhdGlvbiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLmRsdG5uajg3bDB5alxuICogQHN0YXR1cyBzdGFibGVcbiAqIEBzaW5jZSA0LjBcbiAqXG4gKiBAZGVwZW5kZW5jeSBxdGktZmVlZGJhY2tcbiAqIEBkZXBlbmRlbmN5IHF0aS1yZXNwb25zZXByb2Nlc3NpbmdcbiAqXG4gKiBAc2xvdCAtIFRoZSBkZWZhdWx0IHNsb3Qgd2hlcmUgYWxsIHRoZSBvdGhlciBRVEkgMyBpdGVtIHN0cnVjdHVyZXMgZ28uXG4gKlxuICogQGV2ZW50IHF0aS1pbnRlcmFjdGlvbi1jaGFuZ2VkIC0gRW1pdHRlZCB3aGVuIGFuIGludGVyYWN0aW9uIGlzIGNoYW5nZWQuXG4gKiBAZXZlbnQgcXRpLW91dGNvbWUtY2hhbmdlZCAtIEVtaXR0ZWQgd2hlbiBhbiBvdXRjb21lIGhhcyBjaGFuZ2VkLlxuICogQGV2ZW50IHF0aS1yZXNwb25zZS1wcm9jZXNzaW5nIC0gRW1pdHRlZCB3aGVuIHJlc3BvbnNlLXByb2Nlc3NpbmcgaXMgY2FsbGVkLlxuICpcbiAqL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKVxuZXhwb3J0IGNsYXNzIFF0aUFzc2Vzc21lbnRJdGVtIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB0aXRsZTogc3RyaW5nO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllcjogc3RyaW5nID0gJyc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBhZGFwdGl2ZTogJ3RydWUnIHwgJ2ZhbHNlJyA9ICdmYWxzZSc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB0aW1lRGVwZW5kZW50OiAndHJ1ZScgfCAnZmFsc2UnID0gJ2ZhbHNlJztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pIGRpc2FibGVkOiBib29sZWFuO1xuICBAd2F0Y2goJ2Rpc2FibGVkJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBfaGFuZGxlRGlzYWJsZWRDaGFuZ2UgPSAoXzogYm9vbGVhbiwgZGlzYWJsZWQ6IGJvb2xlYW4pID0+IHtcbiAgICB0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLmZvckVhY2goY2ggPT4gKGNoLmRpc2FibGVkID0gZGlzYWJsZWQpKTtcbiAgfTtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pIHJlYWRvbmx5OiBib29sZWFuO1xuICBAd2F0Y2goJ3JlYWRvbmx5JywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBfaGFuZGxlUmVhZG9ubHlDaGFuZ2UgPSAoXzogYm9vbGVhbiwgcmVhZG9ubHk6IGJvb2xlYW4pID0+XG4gICAgdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5mb3JFYWNoKGNoID0+IChjaC5yZWFkb25seSA9IHJlYWRvbmx5KSk7XG5cbiAgQHByb3ZpZGUoeyBjb250ZXh0OiBpdGVtQ29udGV4dCB9KVxuICAvLyBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6IGZhbHNlIH0pXG4gIHByaXZhdGUgX2NvbnRleHQ6IEl0ZW1Db250ZXh0ID0ge1xuICAgIGlkZW50aWZpZXI6IHRoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyksXG4gICAgdmFyaWFibGVzOiBpdGVtQ29udGV4dFZhcmlhYmxlc1xuICB9O1xuXG4gIHB1YmxpYyBnZXQgdmFyaWFibGVzKCk6IFZhcmlhYmxlVmFsdWU8c3RyaW5nIHwgc3RyaW5nW10gfCBudWxsPltdIHtcbiAgICByZXR1cm4gdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHYgPT4gKHsgaWRlbnRpZmllcjogdi5pZGVudGlmaWVyLCB2YWx1ZTogdi52YWx1ZSwgdHlwZTogdi50eXBlIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdmFyaWFibGVzKHZhbHVlOiBWYXJpYWJsZVZhbHVlPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD5bXSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdmFsdWUuc29tZSh2ID0+ICEoJ2lkZW50aWZpZXInIGluIHYpKSkge1xuICAgICAgY29uc29sZS53YXJuKCd2YXJpYWJsZXMgcHJvcGVydHkgc2hvdWxkIGJlIGFuIGFycmF5IG9mIFZhcmlhYmxlRGVjbGFyYXRpb24nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jb250ZXh0ID0ge1xuICAgICAgLi4udGhpcy5fY29udGV4dCxcbiAgICAgIHZhcmlhYmxlczogdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHZhcmlhYmxlID0+IHtcbiAgICAgICAgY29uc3QgbWF0Y2hpbmdWYWx1ZSA9IHZhbHVlLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHZhcmlhYmxlLmlkZW50aWZpZXIpO1xuICAgICAgICBpZiAobWF0Y2hpbmdWYWx1ZSkge1xuICAgICAgICAgIHJldHVybiB7IC4uLnZhcmlhYmxlLCAuLi5tYXRjaGluZ1ZhbHVlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhcmlhYmxlO1xuICAgICAgfSlcbiAgICB9O1xuXG4gICAgdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICBpZiAodmFyaWFibGUudHlwZSA9PT0gJ3Jlc3BvbnNlJykge1xuICAgICAgICBjb25zdCBpbnRlcmFjdGlvbkVsZW1lbnQgPSB0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLmZpbmQoXG4gICAgICAgICAgKGVsOiBJbnRlcmFjdGlvbikgPT4gZWwucmVzcG9uc2VJZGVudGlmaWVyID09PSB2YXJpYWJsZS5pZGVudGlmaWVyXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpbnRlcmFjdGlvbkVsZW1lbnQpIHtcbiAgICAgICAgICBpbnRlcmFjdGlvbkVsZW1lbnQucmVzcG9uc2UgPSB2YXJpYWJsZS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodmFyaWFibGUudHlwZSA9PT0gJ291dGNvbWUnKSB7XG4gICAgICAgIHRoaXMuX2ZlZWRiYWNrRWxlbWVudHMuZm9yRWFjaChmZSA9PiBmZS5jaGVja1Nob3dGZWVkYmFjayh2YXJpYWJsZS5pZGVudGlmaWVyKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0aWFsQ29udGV4dDogUmVhZG9ubHk8SXRlbUNvbnRleHQ+ID0geyAuLi50aGlzLl9jb250ZXh0LCB2YXJpYWJsZXM6IHRoaXMuX2NvbnRleHQudmFyaWFibGVzIH07XG4gIHByaXZhdGUgX2ZlZWRiYWNrRWxlbWVudHM6IFF0aUZlZWRiYWNrW10gPSBbXTtcbiAgcHJpdmF0ZSBfaW50ZXJhY3Rpb25FbGVtZW50czogSW50ZXJhY3Rpb25bXSA9IFtdO1xuXG4gIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTtcbiAgICB0aGlzLl9lbWl0PHsgZGV0YWlsOiBRdGlBc3Nlc3NtZW50SXRlbSB9PigncXRpLWFzc2Vzc21lbnQtaXRlbS1jb25uZWN0ZWQnLCB0aGlzKTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCB1c2UgdmFyaWFibGVzIHByb3BlcnR5IGluc3RlYWQgKi9cbiAgc2V0IHJlc3BvbnNlcyhteVJlc3BvbnNlczogUmVzcG9uc2VJbnRlcmFjdGlvbltdKSB7XG4gICAgaWYgKG15UmVzcG9uc2VzKSB7XG4gICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIG15UmVzcG9uc2VzKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlVmFyaWFibGUgPSB0aGlzLmdldFJlc3BvbnNlKHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllcik7XG4gICAgICAgIGlmIChyZXNwb25zZVZhcmlhYmxlKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVSZXNwb25zZVZhcmlhYmxlKHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllciwgcmVzcG9uc2UucmVzcG9uc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIHwgdW5kZWZpbmVkID0gdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5maW5kKFxuICAgICAgICAgIGkgPT4gaS5nZXRBdHRyaWJ1dGUoJ3Jlc3BvbnNlLWlkZW50aWZpZXInKSA9PT0gcmVzcG9uc2UucmVzcG9uc2VJZGVudGlmaWVyXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpbnRlcmFjdGlvbikge1xuICAgICAgICAgIGludGVyYWN0aW9uLnJlc3BvbnNlID0gcmVzcG9uc2UucmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLXZhcmlhYmxlJywgZSA9PiB7XG4gICAgICB0aGlzLl9jb250ZXh0ID0geyAuLi50aGlzLl9jb250ZXh0LCB2YXJpYWJsZXM6IFsuLi50aGlzLl9jb250ZXh0LnZhcmlhYmxlcywgZS5kZXRhaWwudmFyaWFibGVdIH07XG4gICAgICB0aGlzLl9pbml0aWFsQ29udGV4dCA9IHRoaXMuX2NvbnRleHQ7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0pO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWZlZWRiYWNrJywgKGU6IEN1c3RvbUV2ZW50PFF0aUZlZWRiYWNrPikgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IGZlZWRiYWNrRWxlbWVudCA9IGUuZGV0YWlsO1xuICAgICAgdGhpcy5fZmVlZGJhY2tFbGVtZW50cy5wdXNoKGZlZWRiYWNrRWxlbWVudCk7XG4gICAgICBmZWVkYmFja0VsZW1lbnQuY2hlY2tTaG93RmVlZGJhY2soZmVlZGJhY2tFbGVtZW50Lm91dGNvbWVJZGVudGlmaWVyKTtcbiAgICB9KTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1pbnRlcmFjdGlvbicsIChlOiBDdXN0b21FdmVudDxudWxsPikgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMucHVzaChlLnRhcmdldCBhcyBJbnRlcmFjdGlvbik7XG4gICAgfSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdlbmQtYXR0ZW1wdCcsIChlOiBDdXN0b21FdmVudDx7IHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nOyBjb3VudEF0dGVtcHQ6IGJvb2xlYW4gfT4pID0+IHtcbiAgICAgIGNvbnN0IHsgcmVzcG9uc2VJZGVudGlmaWVyLCBjb3VudEF0dGVtcHQgfSA9IGUuZGV0YWlsO1xuICAgICAgdGhpcy51cGRhdGVSZXNwb25zZVZhcmlhYmxlKHJlc3BvbnNlSWRlbnRpZmllciwgJ3RydWUnKTtcbiAgICAgIHRoaXMucHJvY2Vzc1Jlc3BvbnNlKGNvdW50QXR0ZW1wdCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAvLyB3b3JkdCBhYW5nZXJvZXBlbiB2YW51aXQgZGUgcHJvY2Vzc2luZ3RlbXBsYXRlXG4gICAgICAncXRpLXNldC1vdXRjb21lLXZhbHVlJyxcbiAgICAgIChlOiBDdXN0b21FdmVudDx7IG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PikgPT4ge1xuICAgICAgICBjb25zdCB7IG91dGNvbWVJZGVudGlmaWVyLCB2YWx1ZSB9ID0gZS5kZXRhaWw7XG4gICAgICAgIHRoaXMudXBkYXRlT3V0Y29tZVZhcmlhYmxlKG91dGNvbWVJZGVudGlmaWVyLCB2YWx1ZSk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywgdGhpcy5oYW5kbGVVcGRhdGVSZXNwb25zZVZhcmlhYmxlKTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93Q29ycmVjdFJlc3BvbnNlKHNob3c6IGJvb2xlYW4pIHtcbiAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlcyA9IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbHRlcihcbiAgICAgICh2YXJpOiBSZXNwb25zZVZhcmlhYmxlIHwgT3V0Y29tZVZhcmlhYmxlKSA9PiAnY29ycmVjdFJlc3BvbnNlJyBpbiB2YXJpICYmIHZhcmkuY29ycmVjdFJlc3BvbnNlXG4gICAgKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgY29uc3QgcmVzcG9uc2VzID0gcmVzcG9uc2VWYXJpYWJsZXMubWFwKGNyID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcjogY3IuaWRlbnRpZmllcixcbiAgICAgICAgcmVzcG9uc2U6IGNyLmNvcnJlY3RSZXNwb25zZVxuICAgICAgfTtcbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIHJlc3BvbnNlcykge1xuICAgICAgY29uc3QgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIHwgdW5kZWZpbmVkID0gdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5maW5kKFxuICAgICAgICBpID0+IGkuZ2V0QXR0cmlidXRlKCdyZXNwb25zZS1pZGVudGlmaWVyJykgPT09IHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllclxuICAgICAgKTtcbiAgICAgIGludGVyYWN0aW9uICYmIChpbnRlcmFjdGlvbi5jb3JyZWN0UmVzcG9uc2UgPSBzaG93ID8gcmVzcG9uc2UucmVzcG9uc2UgOiAnJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHByb2Nlc3NSZXNwb25zZShjb3VudE51bUF0dGVtcHRzOiBib29sZWFuID0gdHJ1ZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlc3BvbnNlUHJvY2Vzc29yID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktcmVzcG9uc2UtcHJvY2Vzc2luZycpIGFzIHVua25vd24gYXMgUXRpUmVzcG9uc2VQcm9jZXNzaW5nO1xuICAgIGlmICghcmVzcG9uc2VQcm9jZXNzb3IpIHtcbiAgICAgIC8vIGNvbnNvbGUuaW5mbygnQ2xpZW50IHNpZGUgcmVzcG9uc2UgcHJvY2Vzc2luZyB0ZW1wbGF0ZSBub3QgYXZhaWxhYmxlJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFyZXNwb25zZVByb2Nlc3Nvci5wcm9jZXNzKSB7XG4gICAgICAvLyBjb25zb2xlLmluZm8oJ0NsaWVudCBzaWRlIHJlc3BvbnNlIHdlYmNvbXBvbmVudHMgbm90IGF2YWlsYWJsZScpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJlc3BvbnNlUHJvY2Vzc29yLnByb2Nlc3MoKTtcblxuICAgIGlmICh0aGlzLmFkYXB0aXZlID09PSAnZmFsc2UnKSB7XG4gICAgICAvLyBpZiBhZGFwYXRpdmUsIGNvbXBsZXRpb25TdGF0dXMgaXMgc2V0IGJ5IHRoZSBwcm9jZXNzaW5nIHRlbXBsYXRlXG4gICAgICB0aGlzLnVwZGF0ZU91dGNvbWVWYXJpYWJsZSgnY29tcGxldGlvblN0YXR1cycsIHRoaXMuX2dldENvbXBsZXRpb25TdGF0dXMoKSk7XG4gICAgfVxuXG4gICAgY291bnROdW1BdHRlbXB0cyAmJlxuICAgICAgdGhpcy51cGRhdGVPdXRjb21lVmFyaWFibGUoXG4gICAgICAgICdudW1BdHRlbXB0cycsXG4gICAgICAgICgrdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gJ251bUF0dGVtcHRzJyk/LnZhbHVlICsgMSkudG9TdHJpbmcoKVxuICAgICAgKTtcblxuICAgIHRoaXMuX2VtaXQoJ3F0aS1yZXNwb25zZS1wcm9jZXNzZWQnKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldFJlc3BvbnNlcygpIHtcbiAgICB0aGlzLl9jb250ZXh0ID0gdGhpcy5faW5pdGlhbENvbnRleHQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0UmVzcG9uc2UoaWRlbnRpZmllcjogc3RyaW5nKTogUmVhZG9ubHk8UmVzcG9uc2VWYXJpYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLmdldFZhcmlhYmxlKGlkZW50aWZpZXIpIGFzIFJlc3BvbnNlVmFyaWFibGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0T3V0Y29tZShpZGVudGlmaWVyOiBzdHJpbmcpOiBSZWFkb25seTxPdXRjb21lVmFyaWFibGU+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRWYXJpYWJsZShpZGVudGlmaWVyKSBhcyBPdXRjb21lVmFyaWFibGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmFyaWFibGUoaWRlbnRpZmllcjogc3RyaW5nKTogUmVhZG9ubHk8VmFyaWFibGVEZWNsYXJhdGlvbjxzdHJpbmcgfCBzdHJpbmdbXSB8IG51bGw+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHx8IG51bGw7XG4gIH1cblxuICAvLyBzYXZpbmcgcHJpdmF0ZXMgaGVyZTogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHJpdmF0ZSBoYW5kbGVVcGRhdGVSZXNwb25zZVZhcmlhYmxlKGV2ZW50OiBDdXN0b21FdmVudDxSZXNwb25zZUludGVyYWN0aW9uPikge1xuICAgIGNvbnN0IHsgcmVzcG9uc2VJZGVudGlmaWVyLCByZXNwb25zZSB9ID0gZXZlbnQuZGV0YWlsO1xuICAgIHRoaXMudXBkYXRlUmVzcG9uc2VWYXJpYWJsZShyZXNwb25zZUlkZW50aWZpZXIsIHJlc3BvbnNlKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVSZXNwb25zZVZhcmlhYmxlKGlkZW50aWZpZXI6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fY29udGV4dCA9IHtcbiAgICAgIC4uLnRoaXMuX2NvbnRleHQsXG4gICAgICB2YXJpYWJsZXM6IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLm1hcCh2ID0+ICh2LmlkZW50aWZpZXIgIT09IGlkZW50aWZpZXIgPyB2IDogeyAuLi52LCB2YWx1ZTogdmFsdWUgfSkpXG4gICAgfTtcblxuICAgIHRoaXMuX2VtaXQ8SW50ZXJhY3Rpb25DaGFuZ2VkRGV0YWlscz4oJ3F0aS1pbnRlcmFjdGlvbi1jaGFuZ2VkJywge1xuICAgICAgaXRlbTogdGhpcy5pZGVudGlmaWVyLFxuICAgICAgcmVzcG9uc2VJZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgcmVzcG9uc2U6IHZhbHVlXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5hZGFwdGl2ZSA9PT0gJ2ZhbHNlJykge1xuICAgICAgLy8gaWYgYWRhcGF0aXZlLCBjb21wbGV0aW9uU3RhdHVzIGlzIHNldCBieSB0aGUgcHJvY2Vzc2luZyB0ZW1wbGF0ZVxuICAgICAgdGhpcy51cGRhdGVPdXRjb21lVmFyaWFibGUoJ2NvbXBsZXRpb25TdGF0dXMnLCB0aGlzLl9nZXRDb21wbGV0aW9uU3RhdHVzKCkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVPdXRjb21lVmFyaWFibGUoaWRlbnRpZmllcjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBvdXRjb21lVmFyaWFibGUgPSB0aGlzLmdldE91dGNvbWUoaWRlbnRpZmllcik7XG4gICAgaWYgKCFvdXRjb21lVmFyaWFibGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihgQ2FuIG5vdCBzZXQgcXRpLW91dGNvbWUtaWRlbnRpZmllcjogJHtpZGVudGlmaWVyfSwgaXQgaXMgbm90IGF2YWlsYWJsZWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2NvbnRleHQgPSB7XG4gICAgICAuLi50aGlzLl9jb250ZXh0LFxuICAgICAgdmFyaWFibGVzOiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5tYXAodiA9PiB7XG4gICAgICAgIGlmICh2LmlkZW50aWZpZXIgIT09IGlkZW50aWZpZXIpIHtcbiAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnYsXG4gICAgICAgICAgdmFsdWU6IG91dGNvbWVWYXJpYWJsZS5jYXJkaW5hbGl0eSA9PT0gJ3NpbmdsZScgPyB2YWx1ZSA6IFsuLi52LnZhbHVlLCB2YWx1ZSBhcyBzdHJpbmddXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgIH07XG5cbiAgICB0aGlzLl9mZWVkYmFja0VsZW1lbnRzLmZvckVhY2goZmUgPT4gZmUuY2hlY2tTaG93RmVlZGJhY2soaWRlbnRpZmllcikpO1xuXG4gICAgdGhpcy5fZW1pdDxPdXRjb21lQ2hhbmdlZERldGFpbHM+KCdxdGktb3V0Y29tZS1jaGFuZ2VkJywge1xuICAgICAgaXRlbTogdGhpcy5pZGVudGlmaWVyLFxuICAgICAgb3V0Y29tZUlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICB2YWx1ZTogdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcik/LnZhbHVlXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRDb21wbGV0aW9uU3RhdHVzKCk6ICdjb21wbGV0ZWQnIHwgJ2luY29tcGxldGUnIHwgJ25vdF9hdHRlbXB0ZWQnIHwgJ3Vua25vd24nIHtcbiAgICBpZiAodGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5ldmVyeShpbnRlcmFjdGlvbkVsZW1lbnQgPT4gaW50ZXJhY3Rpb25FbGVtZW50LnZhbGlkYXRlKCkpKSByZXR1cm4gJ2NvbXBsZXRlZCc7XG4gICAgaWYgKHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMuc29tZShpbnRlcmFjdGlvbkVsZW1lbnQgPT4gaW50ZXJhY3Rpb25FbGVtZW50LnZhbGlkYXRlKCkpKSByZXR1cm4gJ2luY29tcGxldGUnO1xuICAgIHJldHVybiAnbm90X2F0dGVtcHRlZCc7XG4gIH1cblxuICBwcml2YXRlIF9lbWl0PFQ+KG5hbWUsIGRldGFpbCA9IG51bGwpIHtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8VD4obmFtZSwge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsXG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFzc2Vzc21lbnQtaXRlbSc6IFF0aUFzc2Vzc21lbnRJdGVtO1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcblxudHlwZSBVcGRhdGVIYW5kbGVyID0gKHByZXY/OiB1bmtub3duLCBuZXh0PzogdW5rbm93bikgPT4gdm9pZDtcblxudHlwZSBOb25VbmRlZmluZWQ8QT4gPSBBIGV4dGVuZHMgdW5kZWZpbmVkID8gbmV2ZXIgOiBBO1xuXG50eXBlIFVwZGF0ZUhhbmRsZXJGdW5jdGlvbktleXM8VCBleHRlbmRzIG9iamVjdD4gPSB7XG4gIFtLIGluIGtleW9mIFRdLT86IE5vblVuZGVmaW5lZDxUW0tdPiBleHRlbmRzIFVwZGF0ZUhhbmRsZXIgPyBLIDogbmV2ZXI7XG59W2tleW9mIFRdO1xuXG5pbnRlcmZhY2UgV2F0Y2hPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHRydWUsIHdpbGwgb25seSBzdGFydCB3YXRjaGluZyBhZnRlciB0aGUgaW5pdGlhbCB1cGRhdGUvcmVuZGVyXG4gICAqL1xuICB3YWl0VW50aWxGaXJzdFVwZGF0ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUnVucyB3aGVuIG9ic2VydmVkIHByb3BlcnRpZXMgY2hhbmdlLCBlLmcuIEBwcm9wZXJ0eSBvciBAc3RhdGUsIGJ1dCBiZWZvcmUgdGhlIGNvbXBvbmVudCB1cGRhdGVzLiBUbyB3YWl0IGZvciBhblxuICogdXBkYXRlIHRvIGNvbXBsZXRlIGFmdGVyIGEgY2hhbmdlIG9jY3VycywgdXNlIGBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlYCBpbiB0aGUgaGFuZGxlci4gVG8gc3RhcnQgd2F0Y2hpbmcgYWZ0ZXIgdGhlXG4gKiBpbml0aWFsIHVwZGF0ZS9yZW5kZXIsIHVzZSBgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9YCBvciBgdGhpcy5oYXNVcGRhdGVkYCBpbiB0aGUgaGFuZGxlci5cbiAqXG4gKiBVc2FnZTpcbiAqXG4gKiBAd2F0Y2goJ3Byb3BOYW1lJylcbiAqIGhhbmRsZVByb3BDaGFuZ2Uob2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gKiAgIC4uLlxuICogfVxuICovXG5leHBvcnQgZnVuY3Rpb24gd2F0Y2gocHJvcGVydHlOYW1lOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3B0aW9ucz86IFdhdGNoT3B0aW9ucykge1xuICBjb25zdCByZXNvbHZlZE9wdGlvbnM6IFJlcXVpcmVkPFdhdGNoT3B0aW9ucz4gPSB7XG4gICAgd2FpdFVudGlsRmlyc3RVcGRhdGU6IGZhbHNlLFxuICAgIC4uLm9wdGlvbnNcbiAgfTtcbiAgcmV0dXJuIDxFbGVtQ2xhc3MgZXh0ZW5kcyBMaXRFbGVtZW50Pihwcm90bzogRWxlbUNsYXNzLCBkZWNvcmF0ZWRGbk5hbWU6IFVwZGF0ZUhhbmRsZXJGdW5jdGlvbktleXM8RWxlbUNsYXNzPikgPT4ge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSB1cGRhdGUgaXMgYSBwcm90ZWN0ZWQgcHJvcGVydHlcbiAgICBjb25zdCB7IHVwZGF0ZSB9ID0gcHJvdG87XG4gICAgY29uc3Qgd2F0Y2hlZFByb3BlcnRpZXMgPSBBcnJheS5pc0FycmF5KHByb3BlcnR5TmFtZSkgPyBwcm9wZXJ0eU5hbWUgOiBbcHJvcGVydHlOYW1lXTtcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSB1cGRhdGUgaXMgYSBwcm90ZWN0ZWQgcHJvcGVydHlcbiAgICBwcm90by51cGRhdGUgPSBmdW5jdGlvbiAodGhpczogRWxlbUNsYXNzLCBjaGFuZ2VkUHJvcHM6IE1hcDxrZXlvZiBFbGVtQ2xhc3MsIEVsZW1DbGFzc1trZXlvZiBFbGVtQ2xhc3NdPikge1xuICAgICAgd2F0Y2hlZFByb3BlcnRpZXMuZm9yRWFjaChwcm9wZXJ0eSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IHByb3BlcnR5IGFzIGtleW9mIEVsZW1DbGFzcztcbiAgICAgICAgaWYgKGNoYW5nZWRQcm9wcy5oYXMoa2V5KSkge1xuICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gY2hhbmdlZFByb3BzLmdldChrZXkpO1xuICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpc1trZXldO1xuXG4gICAgICAgICAgaWYgKG9sZFZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKCFyZXNvbHZlZE9wdGlvbnMud2FpdFVudGlsRmlyc3RVcGRhdGUgfHwgdGhpcy5oYXNVcGRhdGVkKSB7XG4gICAgICAgICAgICAgICh0aGlzW2RlY29yYXRlZEZuTmFtZV0gYXMgdW5rbm93biBhcyBVcGRhdGVIYW5kbGVyKShvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHVwZGF0ZS5jYWxsKHRoaXMsIGNoYW5nZWRQcm9wcyk7XG4gICAgfTtcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1Db250ZXh0IHtcbiAgaHJlZj86IHN0cmluZztcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xuICB2YXJpYWJsZXM6IFJlYWRvbmx5QXJyYXk8VmFyaWFibGVEZWNsYXJhdGlvbjxzdHJpbmcgfCBzdHJpbmdbXT4+O1xufVxuXG5leHBvcnQgY29uc3QgaXRlbUNvbnRleHRWYXJpYWJsZXMgPSBbXG4gIHtcbiAgICBpZGVudGlmaWVyOiAnY29tcGxldGlvblN0YXR1cycsXG4gICAgY2FyZGluYWxpdHk6ICdzaW5nbGUnLFxuICAgIGJhc2VUeXBlOiAnc3RyaW5nJyxcbiAgICB2YWx1ZTogJ3Vua25vd24nLFxuICAgIHR5cGU6ICdvdXRjb21lJ1xuICB9LFxuICB7XG4gICAgaWRlbnRpZmllcjogJ251bUF0dGVtcHRzJyxcbiAgICBjYXJkaW5hbGl0eTogJ3NpbmdsZScsXG4gICAgYmFzZVR5cGU6ICdpbnRlZ2VyJyxcbiAgICB2YWx1ZTogJzAnLFxuICAgIHR5cGU6ICdyZXNwb25zZSdcbiAgfVxuXSBhcyBWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdPltdO1xuXG5leHBvcnQgY29uc3QgaXRlbUNvbnRleHQgPSBjcmVhdGVDb250ZXh0PEl0ZW1Db250ZXh0PignaXRlbScpO1xuIiwgImltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBxdGlUcmFuc2Zvcm1JdGVtIH0gZnJvbSAnLi4vLi4vcXRpLXRyYW5zZm9ybWVycyc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGN1c3RvbSBlbGVtZW50IGZvciByZWZlcmVuY2luZyBhbiBhc3Nlc3NtZW50IHN0aW11bHVzLlxuICovXG5AY3VzdG9tRWxlbWVudCgncXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmJylcbmV4cG9ydCBjbGFzcyBRdGlBc3Nlc3NtZW50U3RpbXVsdXNSZWYgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBzdGltdWx1cy5cbiAgICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyID0gJyc7XG5cbiAgLyoqXG4gICAqIFRoZSBocmVmIG9mIHRoZSBzdGltdWx1cy5cbiAgICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBocmVmID0gJyc7XG5cbiAgLyoqXG4gICAqIExpZmVjeWNsZSBtZXRob2QgY2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQgaXMgY29ubmVjdGVkIHRvIHRoZSBET00uXG4gICAqIExvYWRzIGFuZCBhcHBlbmRzIHRoZSBzdGltdWx1cyBpZiB0aGUgJ3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi1jb25uZWN0ZWQnIGV2ZW50IGlzIG5vdCBwcmV2ZW50ZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KCdxdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYtY29ubmVjdGVkJywgeyBjYW5jZWxhYmxlOiB0cnVlLCBidWJibGVzOiB0cnVlIH0pO1xuICAgIGNvbnN0IGlzUHJldmVudGVkID0gdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblxuICAgIGlmIChpc1ByZXZlbnRlZCkge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuY2xvc2VzdCgncXRpLWFzc2Vzc21lbnQtaXRlbScpO1xuXG4gICAgICBjb25zdCBzdGltdWx1c1JlZiA9IGl0ZW0ucXVlcnlTZWxlY3RvcihgW2RhdGEtc3RpbXVsdXMtaWRyZWY9JHt0aGlzLmlkZW50aWZpZXJ9XWApO1xuICAgICAgaWYgKHN0aW11bHVzUmVmKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZEFuZEFwcGVuZFN0aW11bHVzKHN0aW11bHVzUmVmKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3RpbXVsdXMgd2l0aCBkYXRhLXN0aW11bHVzLWlkcmVmICR7dGhpcy5pZGVudGlmaWVyfSBub3QgZm91bmRgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgYW5kIGFwcGVuZHMgdGhlIHN0aW11bHVzIHRvIHRoZSBzcGVjaWZpZWQgZWxlbWVudC5cbiAgICogQHBhcmFtIHN0aW11bHVzUmVmIC0gVGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIHN0aW11bHVzIHdpbGwgYmUgYXBwZW5kZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbG9hZEFuZEFwcGVuZFN0aW11bHVzKHN0aW11bHVzUmVmOiBFbGVtZW50KSB7XG4gICAgY29uc3QgcGF0aCA9IHRoaXMuaHJlZi5zdWJzdHJpbmcoMCwgdGhpcy5ocmVmLmxhc3RJbmRleE9mKCcvJykpO1xuICAgIGNvbnN0IHN0aW11bHVzID0gYXdhaXQgcXRpVHJhbnNmb3JtSXRlbSgpXG4gICAgICAubG9hZCh0aGlzLmhyZWYpXG4gICAgICAudGhlbihhcGkgPT4gYXBpLnBhdGgocGF0aCkuaHRtbGRvYygpKTtcbiAgICBpZiAoc3RpbXVsdXMpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gc3RpbXVsdXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXN0aW11bHVzLWJvZHksIHF0aS1zdHlsZXNoZWV0Jyk7XG4gICAgICBzdGltdWx1c1JlZi5hcHBlbmQoLi4uZWxlbWVudHMpO1xuICAgIH1cbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYnOiBRdGlBc3Nlc3NtZW50U3RpbXVsdXNSZWY7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcblxuY29uc3QgS0VZQ09ERSA9IHtcbiAgU1BBQ0U6IDMyXG59O1xuXG4vKipcbiAqIEBzdW1tYXJ5IHF0aS1jaG9pY2UgaXMgdXNlZCBieSBxdGktc2ltcGxlLWNob2ljZSwgcXRpLWlubGluZS1jaG9pY2UsIHF0aS1ob3R0ZXh0LCBxdGktaG90c3BvdC1jaG9pY2UuXG4gKlxuICogQHNpbmNlIDEuMFxuICogQHN0YXR1cyBzdGFibGVcbiAqXG4gKiBAZXZlbnQgcXRpLXJlZ2lzdGVyLWNob2ljZSAtIHJlZ2lzdGVyIGl0c2VsdmVzIG9uIGEgcXRpLWNob2ljZS1pbnRlcmFjdGlvbiBlbGVtZW50LlxuICogQGV2ZW50IHF0aS1sb29zZS1jaG9pY2UgLSBkZS1yZWdpc3RlciBpdHNlbHZlcyBvbiBhIHF0aS1jaG9pY2UtaW50ZXJhY3Rpb24gZWxlbWVudC5cbiAqIEBldmVudCBxdGktY2hvaWNlLWVsZW1lbnQtc2VsZWN0ZWQgLSBFbWl0dGVkIHdoZW4gdGhlIGNob2ljZSBpcyBzZWxlY3RlZC5cbiAqXG4gKiBAc2xvdCAtIFRoZSBjaG9pY2VzIHNsb3QgZWxlbWVudFxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUXRpQ2hvaWNlIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlIH0pIHRhYmluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQgPSAwO1xuXG4gIEBwcm9wZXJ0eSh7XG4gICAgcmVmbGVjdDogdHJ1ZSxcbiAgICB0eXBlOiBCb29sZWFuLFxuICAgIGF0dHJpYnV0ZTogJ2FyaWEtZGlzYWJsZWQnLFxuICAgIGNvbnZlcnRlcjoge1xuICAgICAgdG9BdHRyaWJ1dGU6IHZhbHVlID0+IHZhbHVlXG4gICAgfVxuICB9KVxuICBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIEBwcm9wZXJ0eSh7XG4gICAgcmVmbGVjdDogdHJ1ZSxcbiAgICB0eXBlOiBCb29sZWFuLFxuICAgIGF0dHJpYnV0ZTogJ2FyaWEtcmVhZG9ubHknLFxuICAgIGNvbnZlcnRlcjoge1xuICAgICAgdG9BdHRyaWJ1dGU6IHZhbHVlID0+IHZhbHVlXG4gICAgfVxuICB9KVxuICByZWFkb25seSA9IGZhbHNlO1xuXG4gIEBwcm9wZXJ0eSh7XG4gICAgcmVmbGVjdDogdHJ1ZSxcbiAgICB0eXBlOiBCb29sZWFuLFxuICAgIGF0dHJpYnV0ZTogJ2FyaWEtY2hlY2tlZCcsXG4gICAgY29udmVydGVyOiB7XG4gICAgICB0b0F0dHJpYnV0ZTogdmFsdWUgPT4gdmFsdWVcbiAgICB9XG4gIH0pXG4gIGNoZWNrZWQgPSBmYWxzZTtcblxuICBAd2F0Y2goJ2Rpc2FibGVkJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBoYW5kbGVEaXNhYmxlZENoYW5nZShfOiBib29sZWFuLCBkaXNhYmxlZDogYm9vbGVhbikge1xuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgdGhpcy50YWJpbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuYmx1cigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRhYkluZGV4ID0gMDtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuX29uS2V5VXApO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkNsaWNrKTtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLXJlZ2lzdGVyLWNob2ljZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5fb25LZXlVcCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uQ2xpY2spO1xuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktbG9vc2UtY2hvaWNlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWVcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpIHtcbiAgICB0aGlzLmNoZWNrZWQgPSBmYWxzZTtcbiAgICB0aGlzLmRpc2FibGVkID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9vbktleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmFsdEtleSkgcmV0dXJuO1xuXG4gICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XG4gICAgICBjYXNlIEtFWUNPREUuU1BBQ0U6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuX3RvZ2dsZUNoZWNrZWQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfb25DbGljaygpIHtcbiAgICB0aGlzLl90b2dnbGVDaGVja2VkKCk7XG4gIH1cblxuICBwcml2YXRlIF90b2dnbGVDaGVja2VkKCkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcbiAgICB0aGlzLmNoZWNrZWQgPSAhdGhpcy5jaGVja2VkO1xuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktY2hvaWNlLWVsZW1lbnQtc2VsZWN0ZWQnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7IGlkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllciwgY2hlY2tlZDogdGhpcy5jaGVja2VkIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHZhbGlkYXRlQWxsUHJvcHMoKSB7XG4gICAgaWYgKCF0aGlzLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlQWxsUHJvcHMoKSkge1xuICAgICAgY29uc29sZS53YXJuKGBJbnZhbGlkIHByb3BzIGZvciAke3RoaXMub3V0ZXJIVE1MfWAsIGBtaXNzaW5nIGlkZW50aWZpZXJgKTtcbiAgICB9XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90Pjwvc2xvdD4gYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY2hvaWNlJzogUXRpQ2hvaWNlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3F0aS1pdGVtLWJvZHkuc3R5bGVzJztcbmltcG9ydCB0eXBlIHsgQ1NTUmVzdWx0R3JvdXAgfSBmcm9tICdsaXQnO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBxdGktaXRlbS1ib2R5IG5vZGUgY29udGFpbnMgdGhlIHRleHQsIGdyYXBoaWNzLCBtZWRpYSBvYmplY3RzIGFuZCBpbnRlcmFjdGlvbnMgdGhhdCBkZXNjcmliZSB0aGUgaXRlbSdzIGNvbnRlbnQgYW5kIGluZm9ybWF0aW9uIGFib3V0IGhvdyBpdCBpcyBzdHJ1Y3R1cmVkLlxuICogQGRvY3VtZW50YXRpb24gaHR0cHM6Ly93d3cuaW1zZ2xvYmFsLm9yZy9zcGVjL3F0aS92M3AwL2ltcGwjaC5zcGhwbzZsdTZ6cWlcbiAqIEBzdGF0dXMgc3RhYmxlXG4gKiBAc2luY2UgNC4wXG4gKlxuICogQHNsb3QgLSBpdGVtIGJvZHkgY29udGVudC5cbiAqIEBzbG90IHF0aS1ydWJyaWMtYmxvY2sgLSB0aGUgcXRpIHJ1YnJpYyBibG9jayBpcyBwbGFjZWQgYWJvdmUgdGhlIGl0ZW1cbiAqXG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktaXRlbS1ib2R5JylcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFF0aUl0ZW1Cb2R5IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gc3R5bGVzO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicXRpLXJ1YnJpYy1ibG9ja1wiPjwvc2xvdD48c2xvdD48L3Nsb3Q+YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktaXRlbS1ib2R5JzogUXRpSXRlbUJvZHk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuXG5leHBvcnQgZGVmYXVsdCBjc3NgXG4gIDpob3N0IHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxuYDtcbiIsICJpbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5AY3VzdG9tRWxlbWVudCgncXRpLXByb21wdCcpXG5leHBvcnQgY2xhc3MgUXRpUHJvbXB0IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIC8vIGlmIHByb21wdHMgYXJlIGluIGludGVyYWN0aW9ucyB0aGV5IHNob3VsZCBoYXZlIGEgc2xvdCwgc28gdGhlIHByb21wdCBoYXMgdG8gZ28gdGhlcmVcbiAgICAvLyBpZiBwcm9tcHQgaXMgaW4gdGhlIGJvZHksIHRoZW4ganVzdCBkaXNwbGF5IHRoZSBwcm9tcHQgdGhlcmUuXG4gICAgLy8gQSBiZXR0ZXIgY2hlY2sgd291bGQgYmUgdGhlIGxhdHRlciwgYnV0IG5vdCBjYW4ndCBnZXQgdGhyb3VnaCB0aGUgc2hhZG93cm9vdCB0byBmaW5kIHRoZSBzbG90XG4gICAgY29uc3QgaW5JbnRlcmFjdGlvbiA9IHRoaXMucGFyZW50RWxlbWVudC50YWdOYW1lLmVuZHNXaXRoKCdJTlRFUkFDVElPTicpO1xuICAgIGluSW50ZXJhY3Rpb24gJiYgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAncHJvbXB0Jyk7XG4gICAgLy8gY29uc3QgcHJvbXB0U2xvdCA9IHRoaXMucGFyZW50RWxlbWVudC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXCJbbmFtZT0ncHJvbXB0J11cIik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXByb21wdCc6IFF0aVByb21wdDtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIFByb3BlcnR5VmFsdWVNYXAgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1zdHlsZXNoZWV0JylcbmV4cG9ydCBjbGFzcyBRdGlTdHlsZXNoZWV0IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHByaXZhdGUgc3R5bGVMaW5rOiBIVE1MU3R5bGVFbGVtZW50IHwgSFRNTExpbmtFbGVtZW50O1xuXG4gIC8vIHByb3RlY3RlZCBjcmVhdGVSZW5kZXJSb290KCk6IEhUTUxFbGVtZW50IHwgRG9jdW1lbnRGcmFnbWVudCB7XG4gIC8vICAgcmV0dXJuIHRoaXM7XG4gIC8vIH1cblxuICBwcm90ZWN0ZWQgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZU1hcDxhbnk+IHwgTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPik6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgY29uc3QgaXRlbSA9IHRoaXM7XG4gICAgY29uc3QgbGluayA9IHRoaXMuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG5cbiAgICBpZiAobGluayAhPT0gbnVsbCkge1xuICAgICAgY29uc3Qgc3R5bGVzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgc3R5bGVzLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICAgIHN0eWxlcy50eXBlID0gJ3RleHQvY3NzJztcbiAgICAgIHN0eWxlcy5tZWRpYSA9ICdzY3JlZW4nO1xuICAgICAgc3R5bGVzLmhyZWYgPSBsaW5rO1xuICAgICAgaXRlbS5hcHBlbmRDaGlsZChzdHlsZXMpO1xuICAgICAgdGhpcy5zdHlsZUxpbmsgPSBzdHlsZXM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGV4dENvbnRlbnQgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHN0eWxlcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICBzdHlsZXMubWVkaWEgPSAnc2NyZWVuJztcbiAgICAgIHN0eWxlcy50ZXh0Q29udGVudCA9IHRoaXMudGV4dENvbnRlbnQ7XG4gICAgICBpdGVtLmFwcGVuZENoaWxkKHN0eWxlcyk7XG4gICAgICB0aGlzLnN0eWxlTGluayA9IHN0eWxlcztcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBpZiAodGhpcy5zdHlsZUxpbmspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuc3R5bGVMaW5rLnJlbW92ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ2NvdWxkIG5vdCByZW1vdmUgc3R5bGVzaGVldCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktc3R5bGVzaGVldCc6IFF0aVN0eWxlc2hlZXQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBCYXNlVHlwZSwgQ2FyZGluYWxpdHkgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgeyBPdXRjb21lVmFyaWFibGUgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgSXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuaW1wb3J0IHsgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktb3V0Y29tZS1kZWNsYXJhdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpT3V0Y29tZURlY2xhcmF0aW9uIGV4dGVuZHMgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnYmFzZS10eXBlJyB9KSBiYXNlVHlwZTogQmFzZVR5cGU7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZXh0ZXJuYWwtc2NvcmVkJyB9KSBleHRlcm5hbFNjb3JlZDogU3RyaW5nO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllcjogc3RyaW5nO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgY2FyZGluYWxpdHk6IENhcmRpbmFsaXR5O1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwdWJsaWMgaXRlbUNvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pdGVtQ29udGV4dD8udmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHRoaXMuaWRlbnRpZmllcik/LnZhbHVlO1xuICAgIHJldHVybiBodG1sYCR7SlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpfWA7XG4gIH1cblxuICBnZXQgaW50ZXJwb2xhdGlvblRhYmxlKCk6IE1hcDxudW1iZXIsIG51bWJlcj4gfCBudWxsIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMucXVlcnlTZWxlY3RvcigncXRpLWludGVycG9sYXRpb24tdGFibGUnKTtcbiAgICBpZiAodGFibGUpIHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB0YWJsZS5xdWVyeVNlbGVjdG9yQWxsKCdxdGktaW50ZXJwb2xhdGlvbi10YWJsZS1lbnRyeScpKSB7XG4gICAgICAgIGlmICghZW50cnkuZ2V0QXR0cmlidXRlKCdzb3VyY2UtdmFsdWUnKSAmJiBlbnRyeS5nZXRBdHRyaWJ1dGUoJ3RhcmdldC12YWx1ZScpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignc291cmNlLXZhbHVlIG9yIHRhcmdldC12YWx1ZSBpcyBtaXNzaW5nIGluIHF0aS1pbnRlcnBvbGF0aW9uLXRhYmxlLWVudHJ5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc291cmNlVmFsdWUgPSBwYXJzZUludChlbnRyeS5nZXRBdHRyaWJ1dGUoJ3NvdXJjZS12YWx1ZScpKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0VmFsdWUgPSBwYXJzZUludChlbnRyeS5nZXRBdHRyaWJ1dGUoJ3RhcmdldC12YWx1ZScpKTtcbiAgICAgICAgaWYgKGlzTmFOKHNvdXJjZVZhbHVlKSB8fCBpc05hTih0YXJnZXRWYWx1ZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdzb3VyY2UtdmFsdWUgb3IgdGFyZ2V0LXZhbHVlIGlzIG5vdCBhIG51bWJlciBpbiBxdGktaW50ZXJwb2xhdGlvbi10YWJsZS1lbnRyeScpO1xuICAgICAgICB9XG4gICAgICAgIGVudHJpZXMuc2V0KHNvdXJjZVZhbHVlLCB0YXJnZXRWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cmllcztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGNvbnN0IG91dGNvbWVWYXJpYWJsZTogT3V0Y29tZVZhcmlhYmxlID0ge1xuICAgICAgaWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyLFxuICAgICAgY2FyZGluYWxpdHk6IHRoaXMuY2FyZGluYWxpdHksXG4gICAgICBiYXNlVHlwZTogdGhpcy5iYXNlVHlwZSxcbiAgICAgIHR5cGU6ICdvdXRjb21lJyxcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgaW50ZXJwb2xhdGlvblRhYmxlOiB0aGlzLmludGVycG9sYXRpb25UYWJsZVxuICAgIH07XG4gICAgb3V0Y29tZVZhcmlhYmxlLnZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWVzKG91dGNvbWVWYXJpYWJsZSk7XG5cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1yZWdpc3Rlci12YXJpYWJsZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogeyB2YXJpYWJsZTogb3V0Y29tZVZhcmlhYmxlIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktb3V0Y29tZS1kZWNsYXJhdGlvbic6IFF0aU91dGNvbWVEZWNsYXJhdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXZhcmlhYmxlZGVjbGFyYXRpb24nKVxuZXhwb3J0IGNsYXNzIFF0aVZhcmlhYmxlRGVjbGFyYXRpb24gZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlZmF1bHRWYWx1ZXModmFyaWFibGU6IFZhcmlhYmxlRGVjbGFyYXRpb248c3RyaW5nIHwgc3RyaW5nW10gfCBudWxsPikge1xuICAgIGNvbnN0IGh0bWxWYWx1ZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWRlZmF1bHQtdmFsdWUgPiBxdGktdmFsdWUnKSk7XG5cbiAgICBpZiAoaHRtbFZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZXMgPSBodG1sVmFsdWVzLm1hcChuID0+IG4uaW5uZXJIVE1MKTtcbiAgICBpZiAoZGVmYXVsdFZhbHVlcy5sZW5ndGggPiAxIHx8IHZhcmlhYmxlLmNhcmRpbmFsaXR5ID09PSAnbXVsdGlwbGUnIHx8IHZhcmlhYmxlLmNhcmRpbmFsaXR5ID09PSAnb3JkZXJlZCcpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVzO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFZhbHVlc1swXTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktdmFyaWFibGVkZWNsYXJhdGlvbic6IFF0aVZhcmlhYmxlRGVjbGFyYXRpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBCYXNlVHlwZSwgQ2FyZGluYWxpdHkgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IEl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dCB9IGZyb20gJy4uLy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmltcG9ydCB7IFF0aU1hcHBpbmcgfSBmcm9tICcuLi8uLi9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWFwcGluZy9xdGktbWFwcGluZyc7XG5pbXBvcnQgeyBRdGlWYXJpYWJsZURlY2xhcmF0aW9uIH0gZnJvbSAnLi4vcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpUmVzcG9uc2VEZWNsYXJhdGlvbiBleHRlbmRzIFF0aVZhcmlhYmxlRGVjbGFyYXRpb24ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2Jhc2UtdHlwZScgfSkgYmFzZVR5cGU6IEJhc2VUeXBlO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGNhcmRpbmFsaXR5OiBDYXJkaW5hbGl0eTtcblxuICBAY29uc3VtZSh7IGNvbnRleHQ6IGl0ZW1Db250ZXh0LCBzdWJzY3JpYmU6IHRydWUgfSlcbiAgQHN0YXRlKClcbiAgcHVibGljIGl0ZW1Db250ZXh0PzogSXRlbUNvbnRleHQ7XG5cbiAgc3RhdGljIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaXRlbUNvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB0aGlzLmlkZW50aWZpZXIpPy52YWx1ZTtcbiAgICByZXR1cm4gaHRtbGAke0pTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKX1gO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlOiBSZXNwb25zZVZhcmlhYmxlID0ge1xuICAgICAgYmFzZVR5cGU6IHRoaXMuYmFzZVR5cGUsXG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICBjb3JyZWN0UmVzcG9uc2U6IHRoaXMuY29ycmVjdFJlc3BvbnNlLFxuICAgICAgY2FyZGluYWxpdHk6IHRoaXMuY2FyZGluYWxpdHkgfHwgJ3NpbmdsZScsXG4gICAgICBtYXBwaW5nOiB0aGlzLm1hcHBpbmcsXG4gICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIHR5cGU6ICdyZXNwb25zZScsXG4gICAgICBjYW5kaWRhdGVSZXNwb25zZTogbnVsbFxuICAgIH07XG4gICAgcmVzcG9uc2VWYXJpYWJsZS52YWx1ZSA9IHRoaXMuZGVmYXVsdFZhbHVlcyhyZXNwb25zZVZhcmlhYmxlKTtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLXJlZ2lzdGVyLXZhcmlhYmxlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7IHZhcmlhYmxlOiByZXNwb25zZVZhcmlhYmxlIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGNvcnJlY3RSZXNwb25zZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgbGV0IHJlc3VsdDogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgY29uc3QgY29ycmVjdFJlc3BvbnNlID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktY29ycmVjdC1yZXNwb25zZScpO1xuICAgIGlmIChjb3JyZWN0UmVzcG9uc2UpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IGNvcnJlY3RSZXNwb25zZS5xdWVyeVNlbGVjdG9yQWxsKCdxdGktdmFsdWUnKTtcbiAgICAgIGlmICh0aGlzLmNhcmRpbmFsaXR5ID09PSAnc2luZ2xlJyAmJiB2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHQgPSB2YWx1ZXNbMF0udGV4dENvbnRlbnQ7XG4gICAgICAgIHZhbHVlc1swXS5yZW1vdmUoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWVzW2ldLnRleHRDb250ZW50KTtcbiAgICAgICAgICB2YWx1ZXNbaV0ucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IG1hcHBpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvcigncXRpLW1hcHBpbmcnKSBhcyBRdGlNYXBwaW5nO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbic6IFF0aVJlc3BvbnNlRGVjbGFyYXRpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvJylcbmV4cG9ydCBjbGFzcyBRdGlDb21wYW5pb25NYXRlcmlhbHNJbmZvIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIC8vIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gIC8vICAgc2xvdCB7XG4gIC8vICAgICBkaXNwbGF5OiBoaWRkZW47XG4gIC8vICAgfVxuICAvLyBgO1xuICAvLyBvdmVycmlkZSByZW5kZXIoKSB7XG4gIC8vICAgcmV0dXJuIGh0bWxgIDxzbG90Pjwvc2xvdD4gYDtcbiAgLy8gfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvJzogUXRpQ29tcGFuaW9uTWF0ZXJpYWxzSW5mbztcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1jb250ZW50LWJvZHknKVxuZXhwb3J0IGNsYXNzIFF0aUNvbnRlbnRCb2R5IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxufVxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWNvbnRlbnQtYm9keSc6IFF0aUNvbnRlbnRCb2R5O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1ydWJyaWMtYmxvY2snKVxuZXhwb3J0IGNsYXNzIFF0aVJ1YnJpY0Jsb2NrIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBvdmVycmlkZSBpZDsgLy8gPVwicXRpQXNwZWN0SW5ob3VkUnVicmljQmxvY2tcIlxuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB1c2U6ICdpbnN0cnVjdGlvbnMnIHwgJ3Njb3JpbmcnIHwgJ25hdmlnYXRpb24nOyAvLyAgPSBcInNjb3JpbmdcIlxuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB2aWV3OiAnYXV0aG9yJyB8ICdjYW5kaWRhdGUnIHwgJ3Byb2N0b3InIHwgJ3Njb3JlcicgfCAndGVzdENvbnN0cnVjdG9yJyB8ICd0dXRvcic7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjbGFzcycgfSkgY2xhc3NOYW1lcztcbiAgQHdhdGNoKCdjbGFzc05hbWVzJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBoYW5kbGVjbGFzc05hbWVzQ2hhbmdlKG9sZCwgZGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjbGFzc05hbWVzID0gdGhpcy5jbGFzc05hbWVzLnNwbGl0KCcgJyk7XG4gICAgY2xhc3NOYW1lcy5mb3JFYWNoKChjbGFzc05hbWU6IHN0cmluZykgPT4ge1xuICAgICAgc3dpdGNoIChjbGFzc05hbWUpIHtcbiAgICAgICAgY2FzZSAncXRpLXJ1YnJpYy1kaXNjcmV0aW9uYXJ5LXBsYWNlbWVudCc6XG4gICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAncXRpLXJ1YnJpYy1ibG9jaycpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdxdGktcnVicmljLWlubGluZSc6XG4gICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAnJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIC8vIGJ5IGRlZmF1bHQgcHV0IHRoaXMgaW4gYSBzbG90IGluIHRoZSBpdGVtLWJvZHlcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktcnVicmljLWJsb2NrJyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXJ1YnJpYy1ibG9jayc6IFF0aVJ1YnJpY0Jsb2NrO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgUHJvcGVydHlWYWx1ZU1hcCwgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBRdGlGZWVkYmFjayB9IGZyb20gJy4uL3F0aS1mZWVkYmFjayc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZmVlZGJhY2stYmxvY2snKVxuZXhwb3J0IGNsYXNzIFF0aUZlZWRiYWNrQmxvY2sgZXh0ZW5kcyBRdGlGZWVkYmFjayB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICAgIC5vbiB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gICAgLm9mZiB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IHBhcnQ9XCJmZWVkYmFja1wiIGNsYXNzPVwiZmVlZGJhY2sgJHt0aGlzLnNob3dTdGF0dXN9XCI+PC9zbG90PiBgO1xuICB9XG5cbiAgcHJvdGVjdGVkIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVNYXA8YW55PiB8IE1hcDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pOiB2b2lkIHtcbiAgICB0aGlzLmNoZWNrU2hvd0ZlZWRiYWNrKHRoaXMub3V0Y29tZUlkZW50aWZpZXIpO1xuICB9XG59XG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZmVlZGJhY2stYmxvY2snOiBRdGlGZWVkYmFja0Jsb2NrO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgUHJvcGVydHlWYWx1ZU1hcCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aUFzc2Vzc21lbnRJdGVtIH0gZnJvbSAnLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtJztcbmltcG9ydCB7IElzTnVsbE9yVW5kZWZpbmVkIH0gZnJvbSAnLi4vaW50ZXJuYWwvdXRpbHMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUXRpRmVlZGJhY2sgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdzaG93LWhpZGUnIH0pXG4gIHByb3RlY3RlZCBzaG93SGlkZTogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnb3V0Y29tZS1pZGVudGlmaWVyJyB9KVxuICBwdWJsaWMgb3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHJvdGVjdGVkIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogZmFsc2UgfSlcbiAgcHVibGljIHNob3dTdGF0dXM6IHN0cmluZztcblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8UXRpRmVlZGJhY2s+KCdxdGktcmVnaXN0ZXItZmVlZGJhY2snLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHRoaXNcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBjaGVja1Nob3dGZWVkYmFjayhvdXRjb21lSWRlbnRpZmllcjogc3RyaW5nKSB7ICAgIFxuICAgIGNvbnN0IG91dGNvbWVWYXJpYWJsZSA9ICh0aGlzLmNsb3Nlc3QoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKSBhcyBRdGlBc3Nlc3NtZW50SXRlbSkuZ2V0T3V0Y29tZShvdXRjb21lSWRlbnRpZmllcik7XG5cbiAgICBpZiAodGhpcy5vdXRjb21lSWRlbnRpZmllciAhPT0gb3V0Y29tZUlkZW50aWZpZXIgfHwgIW91dGNvbWVWYXJpYWJsZSkgcmV0dXJuO1xuICAgIGxldCBpc0ZvdW5kID0gZmFsc2U7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob3V0Y29tZVZhcmlhYmxlLnZhbHVlKSkge1xuICAgICAgaXNGb3VuZCA9IG91dGNvbWVWYXJpYWJsZS52YWx1ZS5pbmNsdWRlcyh0aGlzLmlkZW50aWZpZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpc0ZvdW5kID1cbiAgICAgICAgKCFJc051bGxPclVuZGVmaW5lZCh0aGlzLmlkZW50aWZpZXIpICYmXG4gICAgICAgICAgIUlzTnVsbE9yVW5kZWZpbmVkKG91dGNvbWVWYXJpYWJsZT8udmFsdWUpICYmXG4gICAgICAgICAgdGhpcy5pZGVudGlmaWVyID09PSBvdXRjb21lVmFyaWFibGUudmFsdWUpIHx8XG4gICAgICAgIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0ZlZWRiYWNrKGlzRm91bmQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93RmVlZGJhY2sodmFsdWU6IGJvb2xlYW4pIHsgICAgXG4gICAgdGhpcy5zaG93U3RhdHVzID0gKHZhbHVlICYmIHRoaXMuc2hvd0hpZGUgPT09ICdzaG93JykgfHwgKCF2YWx1ZSAmJiB0aGlzLnNob3dIaWRlID09PSAnaGlkZScpID8gJ29uJyA6ICdvZmYnOyAgICBcbiAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBkZWNpbWFsU2VwYXJhdG9yID0gKCkgPT4ge1xuICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KCkuZm9ybWF0KDAuMSkucmVwbGFjZSgvXFxkL2csICcnKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCA9IChudW1iZXI6IG51bWJlciB8IHN0cmluZykgPT4ge1xuICAvLyBjaGVjayBpZiB0eXBlIGlzIHN0cmluZ1xuICBpZiAodHlwZW9mIG51bWJlciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbnVtYmVyO1xuICB9XG4gIGNvbnN0IGRTZXAgPSBkZWNpbWFsU2VwYXJhdG9yKCk7XG4gIGlmIChkU2VwID09PSAnLicpIHtcbiAgICByZXR1cm4gbnVtYmVyLnRvTG9jYWxlU3RyaW5nKCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bWJlci50b1N0cmluZygpLnJlcGxhY2UoJy4nLCAnJykucmVwbGFjZShkU2VwLCAnLicpO1xuICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gSXNOdWxsT3JVbmRlZmluZWQodmFsdWU6IHVua25vd24pIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVEb3VibGVTbGFzaGVzKHN0cjogc3RyaW5nKSB7XG4gIGNvbnN0IHNpbmdsZUZvcndhcmRTbGFzaGVzID0gc3RyXG4gICAgLnJlcGxhY2UoLyhbXjpdXFwvKVxcLysvZywgJyQxJylcbiAgICAucmVwbGFjZSgvXFwvXFwvL2csICcvJylcbiAgICAucmVwbGFjZSgnaHR0cDovJywgJ2h0dHA6Ly8nKVxuICAgIC5yZXBsYWNlKCdodHRwczovJywgJ2h0dHBzOi8vJyk7XG4gIHJldHVybiBzaW5nbGVGb3J3YXJkU2xhc2hlcztcbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aUZlZWRiYWNrIH0gZnJvbSAnLi4vcXRpLWZlZWRiYWNrJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1mZWVkYmFjay1pbmxpbmUnKVxuZXhwb3J0IGNsYXNzIFF0aUZlZWRiYWNrSW5saW5lIGV4dGVuZHMgUXRpRmVlZGJhY2sge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIC5vbiB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgfVxuICAgIC5vZmYge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyID0gKCkgPT4gaHRtbGAgPHNsb3QgcGFydD1cImZlZWRiYWNrXCIgY2xhc3M9XCIke3RoaXMuc2hvd1N0YXR1c31cIj48L3Nsb3Q+IGA7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1mZWVkYmFjay1pbmxpbmUnOiBRdGlGZWVkYmFja0lubGluZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpRmVlZGJhY2sgfSBmcm9tICcuLi9xdGktZmVlZGJhY2snO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW1vZGFsLWZlZWRiYWNrJylcbmV4cG9ydCBjbGFzcyBRdGlNb2RhbEZlZWRiYWNrIGV4dGVuZHMgUXRpRmVlZGJhY2sge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIC5vbiB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgfVxuICAgIC5vZmYge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyID0gKCkgPT4gaHRtbGAgPHNsb3QgcGFydD1cImZlZWRiYWNrXCIgY2xhc3M9XCIke3RoaXMuc2hvd1N0YXR1c31cIj48L3Nsb3Q+IGA7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1tb2RhbC1mZWVkYmFjayc6IFF0aU1vZGFsRmVlZGJhY2s7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgaWZEZWZpbmVkIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvaWYtZGVmaW5lZC5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IHJlZiwgY3JlYXRlUmVmIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVmLmpzJztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZXh0ZW5kZWQtdGV4dC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpRXh0ZW5kZWRUZXh0SW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIC8vIHB1YmxpYyBzdGF0aWMgcm93SGVpZ2h0Q2xhc3MgPSBbXTtcblxuICB0ZXh0YXJlYVJlZiA9IGNyZWF0ZVJlZjxIVE1MVGV4dEFyZWFFbGVtZW50PigpO1xuXG4gIC8qKiBleHBlY3RlZCBsZW5ndGggaXMgbWFwcGVkIHRvIHRoZSBwcm9wZXJ0eSBtYXhsZW5ndGggb24gdGhlIHRleHRhcmVhICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiAnZXhwZWN0ZWQtbGVuZ3RoJyB9KSBleHBlY3RlZExlbmd0aDogbnVtYmVyO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAncGF0dGVybi1tYXNrJyB9KSBwYXR0ZXJuTWFzazogc3RyaW5nO1xuXG4gIC8qKiB0ZXh0IGFwcGVhcmluZyBpbiB0aGUgZXh0ZW5kZWQtdGV4dC1udGVyYWN0aW9uIGlmIGl0IGlzIGVtcHR5ICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAncGxhY2Vob2xkZXItdGV4dCcgfSkgcGxhY2Vob2xkZXJUZXh0OiBzdHJpbmc7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfdmFsdWUgPSAnJztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2NsYXNzJyB9KSBjbGFzc05hbWVzO1xuICBAd2F0Y2goJ2NsYXNzTmFtZXMnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIGhhbmRsZWNsYXNzTmFtZXNDaGFuZ2Uob2xkLCBkaXNhYmxlZDogYm9vbGVhbikge1xuICAgIGNvbnN0IGNsYXNzTmFtZXMgPSB0aGlzLmNsYXNzTmFtZXMuc3BsaXQoJyAnKTtcbiAgICBjbGFzc05hbWVzLmZvckVhY2goKGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoY2xhc3NOYW1lLnN0YXJ0c1dpdGgoJ3F0aS1oZWlnaHQtbGluZXMnKSkge1xuICAgICAgICBjb25zdCBuclJvd3MgPSBjbGFzc05hbWUucmVwbGFjZSgncXRpLWhlaWdodC1saW5lcy0nLCAnJyk7XG4gICAgICAgIGlmICh0aGlzLnRleHRhcmVhUmVmKSB7XG4gICAgICAgICAgdGhpcy50ZXh0YXJlYVJlZi52YWx1ZS5yb3dzID0gcGFyc2VJbnQobnJSb3dzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldCByZXNwb25zZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiAnJztcbiAgfVxuXG4gIHB1YmxpYyB2YWxpZGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUgIT09ICcnO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIGdldCBzdHlsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNzc2BcbiAgICAgICAgLyogUEs6IGRpc3BsYXkgaG9zdCBhcyBibG9jaywgZWxzZSBkZXNpZ24gd2lsbCBiZSBjb2xsYXBzZWQgKi9cbiAgICAgICAgOmhvc3Qge1xuICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB9XG4gICAgICAgIHRleHRhcmVhIHtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICBib3JkZXI6IDA7XG4gICAgICAgIH1cbiAgICAgIGBcbiAgICBdO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3RcbiAgICAgID48dGV4dGFyZWFcbiAgICAgICAgcGFydD1cInRleHRhcmVhXCJcbiAgICAgICAgJHtyZWYodGhpcy50ZXh0YXJlYVJlZil9XG4gICAgICAgIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgIEBrZXlkb3duPVwiJHtldmVudCA9PiBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1cIlxuICAgICAgICBAa2V5dXA9XCIke3RoaXMudGV4dENoYW5nZWR9XCJcbiAgICAgICAgQGNoYW5nZT1cIiR7dGhpcy50ZXh0Q2hhbmdlZH1cIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIiR7aWZEZWZpbmVkKHRoaXMucGxhY2Vob2xkZXJUZXh0ID8gdGhpcy5wbGFjZWhvbGRlclRleHQgOiB1bmRlZmluZWQpfVwiXG4gICAgICAgIG1heGxlbmd0aD1cIiR7aWZEZWZpbmVkKHRoaXMuZXhwZWN0ZWRMZW5ndGggPyB0aGlzLmV4cGVjdGVkTGVuZ3RoIDogdW5kZWZpbmVkKX1cIlxuICAgICAgICBwYXR0ZXJuPVwiJHtpZkRlZmluZWQodGhpcy5wYXR0ZXJuTWFzayA/IHRoaXMucGF0dGVybk1hc2sgOiB1bmRlZmluZWQpfVwiXG4gICAgICAgID9kaXNhYmxlZD1cIiR7dGhpcy5kaXNhYmxlZH1cIlxuICAgICAgICA/cmVhZG9ubHk9XCIke3RoaXMucmVhZG9ubHl9XCJcbiAgICAgICAgLnZhbHVlPSR7dGhpcy5fdmFsdWV9XG4gICAgICA+PC90ZXh0YXJlYT5gO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRleHRDaGFuZ2VkKGV2ZW50OiBFdmVudCkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIHRoaXMuc2V0RW1wdHlBdHRyaWJ1dGUoaW5wdXQudmFsdWUpO1xuICAgIGlmICh0aGlzLl92YWx1ZSAhPT0gaW5wdXQudmFsdWUpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gaW5wdXQudmFsdWU7XG4gICAgICB0aGlzLnNhdmVSZXNwb25zZShpbnB1dC52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5fdmFsdWUgPSAnJztcbiAgfVxuXG4gIHByaXZhdGUgc2V0RW1wdHlBdHRyaWJ1dGUodGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2VtcHR5JywgdGV4dCA9PT0gJycgPyAndHJ1ZScgOiAnZmFsc2UnKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZXh0ZW5kZWQtdGV4dC1pbnRlcmFjdGlvbic6IFF0aUV4dGVuZGVkVGV4dEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEludGVyYWN0aW9uIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3Jlc3BvbnNlLWlkZW50aWZpZXInIH0pIHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nID0gJyc7XG5cbiAgLyoqIGRpc2FibGVkIHNob3VsZCBiZSBleHBvc2VkIHRvIHRoZSBhdHRyaWJ1dGVzIGFuZCBhY2Nlc3NpYmxlIGFzIHByb3BlcnR5ICovXG4gIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUsIHR5cGU6IEJvb2xlYW4gfSkgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAvKiogcmVhZG9ubHkgc2hvdWxkIGJlIGV4cG9zZWQgdG8gdGhlIGF0dHJpYnV0ZXMgYW5kIGFjY2Vzc2libGUgYXMgcHJvcGVydHkgKi9cbiAgQHByb3BlcnR5KHsgcmVmbGVjdDogdHJ1ZSwgdHlwZTogQm9vbGVhbiB9KSByZWFkb25seSA9IGZhbHNlO1xuXG4gIGFic3RyYWN0IHZhbGlkYXRlKCk6IGJvb2xlYW47XG4gIGFic3RyYWN0IHNldCByZXNwb25zZSh2YWw6IFJlYWRvbmx5PHN0cmluZyB8IHN0cmluZ1tdPik7XG4gIHNldCBjb3JyZWN0UmVzcG9uc2UodmFsOiBSZWFkb25seTxzdHJpbmcgfCBzdHJpbmdbXT4pIHtcbiAgICBjb25zb2xlLndhcm4oJ2NvcnJlY3RSZXNwb25zZSBpcyBub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktcmVnaXN0ZXItaW50ZXJhY3Rpb24nLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHNhdmVSZXNwb25zZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1pbnRlcmFjdGlvbi1yZXNwb25zZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICByZXNwb25zZUlkZW50aWZpZXI6IHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLFxuICAgICAgICAgIHJlc3BvbnNlOiB2YWx1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaWZEZWZpbmVkIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvaWYtZGVmaW5lZC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVSZWYgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9yZWYuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3JzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aVRleHRFbnRyeUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ2V4cGVjdGVkLWxlbmd0aCcgfSkgZXhwZWN0ZWRMZW5ndGg6IG51bWJlcjtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3BhdHRlcm4tbWFzaycgfSkgcGF0dGVybk1hc2s6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3BsYWNlaG9sZGVyLXRleHQnIH0pIHBsYWNlaG9sZGVyVGV4dDogc3RyaW5nO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX3ZhbHVlID0gJyc7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfY29ycmVjdFZhbHVlID0gJyc7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfc2l6ZSA9IDU7XG5cbiAgaW5wdXRSZWYgPSBjcmVhdGVSZWY8SFRNTElucHV0RWxlbWVudD4oKTtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2NsYXNzJyB9KSBjbGFzc05hbWVzO1xuICBAd2F0Y2goJ2NsYXNzTmFtZXMnKVxuICBoYW5kbGVjbGFzc05hbWVzQ2hhbmdlKG9sZCwgY2xhc3Nlczogc3RyaW5nKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lcyA9IGNsYXNzZXMuc3BsaXQoJyAnKTtcbiAgICBjbGFzc05hbWVzLmZvckVhY2goKGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoY2xhc3NOYW1lLnN0YXJ0c1dpdGgoJ3F0aS1pbnB1dC13aWR0aCcpKSB7XG4gICAgICAgIGNvbnN0IG5yUm93cyA9IGNsYXNzTmFtZS5yZXBsYWNlKCdxdGktaW5wdXQtd2lkdGgtJywgJycpO1xuICAgICAgICB0aGlzLl9zaXplID0gcGFyc2VJbnQobnJSb3dzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgcmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDogJyc7XG4gIH1cblxuICBwdWJsaWMgdmFsaWRhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlICE9PSAnJztcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBnZXQgc3R5bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICBjc3NgXG4gICAgICAgIFtwYXJ0PSdjb3JyZWN0J10ge1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgfVxuICAgICAgYFxuICAgIF07XG4gIH1cblxuICBzZXQgY29ycmVjdFJlc3BvbnNlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jb3JyZWN0VmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxkaXYgcGFydD1cImNvcnJlY3RcIj4ke3RoaXMuX2NvcnJlY3RWYWx1ZX08L2Rpdj5cbiAgICAgIDxpbnB1dFxuICAgICAgICBwYXJ0PVwiaW5wdXRcIlxuICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICBAa2V5ZG93bj1cIiR7ZXZlbnQgPT4gZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9XCJcbiAgICAgICAgQGtleXVwPVwiJHt0aGlzLnRleHRDaGFuZ2VkfVwiXG4gICAgICAgIEBjaGFuZ2U9XCIke3RoaXMudGV4dENoYW5nZWR9XCJcbiAgICAgICAgdHlwZT1cIiR7dGhpcy5wYXR0ZXJuTWFzayA9PSAnWzAtOV0qJyA/ICdudW1iZXInIDogJ3RleHQnfVwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiJHtpZkRlZmluZWQodGhpcy5wbGFjZWhvbGRlclRleHQgPyB0aGlzLnBsYWNlaG9sZGVyVGV4dCA6IHVuZGVmaW5lZCl9XCJcbiAgICAgICAgLnZhbHVlPVwiJHt0aGlzLl92YWx1ZX1cIlxuICAgICAgICBzaXplPVwiJHt0aGlzLl9zaXplfVwiXG4gICAgICAgIHBhdHRlcm49XCIke2lmRGVmaW5lZCh0aGlzLnBhdHRlcm5NYXNrID8gdGhpcy5wYXR0ZXJuTWFzayA6IHVuZGVmaW5lZCl9XCJcbiAgICAgICAgP2Rpc2FibGVkPVwiJHt0aGlzLmRpc2FibGVkfVwiXG4gICAgICAgID9yZWFkb25seT1cIiR7dGhpcy5yZWFkb25seX1cIlxuICAgICAgLz5cbiAgICBgO1xuICB9XG4gIC8vXG4gIC8vIG1heGxlbmd0aD1cIiR7aWZEZWZpbmVkKHRoaXMuZXhwZWN0ZWRMZW5ndGggPyB0aGlzLmV4cGVjdGVkTGVuZ3RoIDogdW5kZWZpbmVkKX1cIlxuXG4gIHByb3RlY3RlZCB0ZXh0Q2hhbmdlZChldmVudDogRXZlbnQpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSByZXR1cm47XG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICB0aGlzLnNldEVtcHR5QXR0cmlidXRlKGlucHV0LnZhbHVlKTtcbiAgICBpZiAodGhpcy5fdmFsdWUgIT09IGlucHV0LnZhbHVlKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IGlucHV0LnZhbHVlO1xuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UoaW5wdXQudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX3ZhbHVlID0gJyc7XG4gIH1cblxuICBwcml2YXRlIHNldEVtcHR5QXR0cmlidXRlKHRleHQ6IHN0cmluZykge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdlbXB0eScsIHRleHQgPT09ICcnID8gJ3RydWUnIDogJ2ZhbHNlJyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24nOiBRdGlUZXh0RW50cnlJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgIi8vIEB3YXRjaCBkZWNvcmF0b3Jcbi8vXG4vLyBSdW5zIHdoZW4gYW4gb2JzZXJ2ZWQgcHJvcGVydHkgY2hhbmdlcywgZS5nLiBAcHJvcGVydHkgb3IgQHN0YXRlLCBidXQgYmVmb3JlIHRoZSBjb21wb25lbnQgdXBkYXRlcy5cbi8vXG4vLyBUbyB3YWl0IGZvciBhbiB1cGRhdGUgdG8gY29tcGxldGUgYWZ0ZXIgYSBjaGFuZ2Ugb2NjdXJzLCB1c2UgYGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGVgIGluIHRoZSBoYW5kbGVyLiBUbyBzdGFydFxuLy8gd2F0Y2hpbmcgYWZ0ZXIgdGhlIGluaXRpYWwgdXBkYXRlL3JlbmRlciwgdXNlIGB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH1gIG9yIGB0aGlzLmhhc1VwZGF0ZWRgIGluIHRoZSBoYW5kbGVyLlxuLy9cbi8vIFVzYWdlOlxuLy9cbi8vICBAd2F0Y2goJ3Byb3BOYW1lJylcbi8vICBoYW5kbGVQcm9wQ2hhbmdlKG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuLy8gICAgLi4uXG4vLyAgfVxuXG5pbXBvcnQgdHlwZSB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuXG50eXBlIFVwZGF0ZUhhbmRsZXIgPSAocHJldj86IHVua25vd24sIG5leHQ/OiB1bmtub3duKSA9PiB2b2lkO1xuXG50eXBlIE5vblVuZGVmaW5lZDxBPiA9IEEgZXh0ZW5kcyB1bmRlZmluZWQgPyBuZXZlciA6IEE7XG5cbnR5cGUgVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxUIGV4dGVuZHMgb2JqZWN0PiA9IHtcbiAgW0sgaW4ga2V5b2YgVF0tPzogTm9uVW5kZWZpbmVkPFRbS10+IGV4dGVuZHMgVXBkYXRlSGFuZGxlciA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVF07XG5cbmludGVyZmFjZSBMaXZlUXVlcnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHRydWUsIHdpbGwgb25seSBzdGFydCB3YXRjaGluZyBhZnRlciB0aGUgaW5pdGlhbCB1cGRhdGUvcmVuZGVyXG4gICAqL1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGl2ZVF1ZXJ5KHF1ZXJ5U2VsZWN0b3I6IHN0cmluZywgb3B0aW9ucz86IExpdmVRdWVyeU9wdGlvbnMpIHtcbiAgbGV0IG9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xuICBjb25zdCByZXNvbHZlZE9wdGlvbnM6IFJlcXVpcmVkPExpdmVRdWVyeU9wdGlvbnM+ID0ge1xuICAgIC4uLm9wdGlvbnNcbiAgfTtcbiAgcmV0dXJuIDxFbGVtQ2xhc3MgZXh0ZW5kcyBMaXRFbGVtZW50PihcbiAgICBwcm90bzogRWxlbUNsYXNzLFxuICAgIGRlY29yYXRlZEZuTmFtZTogVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxFbGVtQ2xhc3M+XG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHsgY29ubmVjdGVkQ2FsbGJhY2ssIGRpc2Nvbm5lY3RlZENhbGxiYWNrIH0gPSBwcm90bztcblxuICAgIHByb3RvLmNvbm5lY3RlZENhbGxiYWNrID0gZnVuY3Rpb24gKHRoaXM6IEVsZW1DbGFzcykge1xuICAgICAgY29ubmVjdGVkQ2FsbGJhY2suY2FsbCh0aGlzKTtcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gKG11dGF0aW9uTGlzdDogTXV0YXRpb25SZWNvcmRbXSkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50c1RvV2F0Y2ggPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbChxdWVyeVNlbGVjdG9yKSk7XG4gICAgICAgIGZvciAoY29uc3QgbXV0YXRpb24gb2YgbXV0YXRpb25MaXN0KSB7XG4gICAgICAgICAgY29uc3QgYWRkZWROb2RlcyA9IEFycmF5LmZyb20obXV0YXRpb24uYWRkZWROb2RlcykubWFwKGUgPT4gZSBhcyBFbGVtZW50KTtcbiAgICAgICAgICBjb25zdCByZW1vdmVkTm9kZXMgPSBBcnJheS5mcm9tKG11dGF0aW9uLmFkZGVkTm9kZXMpLm1hcChlID0+IGUgYXMgRWxlbWVudCk7XG4gICAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdjaGlsZExpc3QnICYmIGFkZGVkTm9kZXMuZmluZChuID0+IGVsZW1lbnRzVG9XYXRjaC5pbmNsdWRlcyhuKSkpIHtcbiAgICAgICAgICAgICh0aGlzW2RlY29yYXRlZEZuTmFtZV0gYXMgdW5rbm93biBhcyBVcGRhdGVIYW5kbGVyKShhZGRlZE5vZGVzLCByZW1vdmVkTm9kZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spO1xuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcblxuICAgICAgY29uc3QgZWxlbWVudHNBZGRlZCA9IHRoaXMucXVlcnlTZWxlY3RvckFsbChxdWVyeVNlbGVjdG9yKSA/PyBbXTtcbiAgICAgICh0aGlzW2RlY29yYXRlZEZuTmFtZV0gYXMgdW5rbm93biBhcyBVcGRhdGVIYW5kbGVyKShBcnJheS5mcm9tKGVsZW1lbnRzQWRkZWQpLCBbXSk7XG4gICAgfTtcblxuICAgIHByb3RvLmRpc2Nvbm5lY3RlZENhbGxiYWNrID0gZnVuY3Rpb24gKHRoaXM6IEVsZW1DbGFzcykge1xuICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2suY2FsbCh0aGlzKTtcbiAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9O1xuICB9O1xufVxuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IENob2ljZXMgfSBmcm9tICcuLi9pbnRlcm5hbC9jaG9pY2VzL2Nob2ljZXMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUhvdHRleHRJbnRlcmFjdGlvbiBleHRlbmRzIENob2ljZXMge1xuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdxdGktaG90dGV4dC1pbnRlcmFjdGlvbicsICcnKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlciA9ICgpID0+IGh0bWxgPHNsb3Q+PC9zbG90PmA7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uJzogUXRpSG90dGV4dEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHsgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpQ2hvaWNlIH0gZnJvbSAnLi4vY2hvaWNlL3F0aS1jaG9pY2UnO1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENob2ljZXMgZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIHByb3RlY3RlZCBfY2hvaWNlRWxlbWVudHM6IFF0aUNob2ljZVtdID0gW107XG5cbiAgLyoqIHRoZSBtaW5pbWFsIG51bWJlciBvZiBzZWxlY3Rpb25zIGEgY2FuZGlkYXRlIG11c3QgbWFrZSAqL1xuICBAcHJvcGVydHkoe1xuICAgIHR5cGU6IE51bWJlcixcbiAgICBhdHRyaWJ1dGU6ICdtaW4tY2hvaWNlcydcbiAgfSlcbiAgcHVibGljIG1pbkNob2ljZXM6IG51bWJlciA9IDA7XG5cbiAgLyoqIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWxlY3Rpb25zIGEgY2FuZGlkYXRlIG11c3QgbWFrZSwgdGhlIG90aGVyIG9wdGlvbnMgd2lsbCBiZSBkaXNhYmxlZCB3aGVuIG1heCBvcHRpb25zIGlzIGNoZWNrZWQgKi9cbiAgQHByb3BlcnR5KHtcbiAgICB0eXBlOiBOdW1iZXIsXG4gICAgYXR0cmlidXRlOiAnbWF4LWNob2ljZXMnXG4gIH0pXG4gIHB1YmxpYyBtYXhDaG9pY2VzOiBudW1iZXIgPSAxO1xuXG4gIEB3YXRjaCgnZGlzYWJsZWQnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIF9oYW5kbGVEaXNhYmxlZENoYW5nZSA9IChfOiBib29sZWFuLCBkaXNhYmxlZDogYm9vbGVhbikgPT5cbiAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNoID0+IChjaC5kaXNhYmxlZCA9IGRpc2FibGVkKSk7XG5cbiAgQHdhdGNoKCdyZWFkb25seScsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgX2hhbmRsZVJlYWRvbmx5Q2hhbmdlID0gKF86IGJvb2xlYW4sIHJlYWRvbmx5OiBib29sZWFuKSA9PlxuICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2ggPT4gKGNoLnJlYWRvbmx5ID0gcmVhZG9ubHkpKTtcblxuICBAd2F0Y2goJ21heENob2ljZXMnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIF9oYW5kbGVNYXhDaG9pY2VzQ2hhbmdlID0gKCkgPT4gdGhpcy5fZGV0ZXJtaW5lSW5wdXRUeXBlKCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1jaG9pY2UnLCB0aGlzLl9yZWdpc3RlckNob2ljZUVsZW1lbnQpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLWxvb3NlLWNob2ljZScsIHRoaXMuX2xvb3NlQ2hvaWNlRWxlbWVudCk7XG4gIH1cblxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBuclNlbGVjdGVkID0gdGhpcy5fY2hvaWNlRWxlbWVudHMucmVkdWNlKChhY2MsIHZhbCkgPT4ge1xuICAgICAgcmV0dXJuIGFjYyArICh2YWwuY2hlY2tlZCA/IDEgOiAwKTtcbiAgICB9LCAwKTtcbiAgICByZXR1cm4gbnJTZWxlY3RlZCA+PSB0aGlzLm1pbkNob2ljZXM7XG4gIH1cblxuICBzZXQgcmVzcG9uc2UocmVzcG9uc2VWYWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBjb25zdCByZXNwb25zZVZhbHVlQXJyYXkgPSBBcnJheS5pc0FycmF5KHJlc3BvbnNlVmFsdWUpID8gcmVzcG9uc2VWYWx1ZSA6IFtyZXNwb25zZVZhbHVlXTtcbiAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNlID0+IHtcbiAgICAgIGNlLmNoZWNrZWQgPSByZXNwb25zZVZhbHVlQXJyYXkuZmluZChydiA9PiBydiA9PT0gY2UuaWRlbnRpZmllcikgPyB0cnVlIDogZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICBzZXQgY29ycmVjdFJlc3BvbnNlKHJlc3BvbnNlVmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgcmVzcG9uc2VWYWx1ZUFycmF5ID0gQXJyYXkuaXNBcnJheShyZXNwb25zZVZhbHVlKSA/IHJlc3BvbnNlVmFsdWUgOiBbcmVzcG9uc2VWYWx1ZV07XG4gICAgaWYgKHJlc3BvbnNlVmFsdWUgPT0gJycpIHtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2UgPT4ge1xuICAgICAgICBjZS5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtY29ycmVjdC1yZXNwb25zZScpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2UgPT4ge1xuICAgICAgY2Uuc2V0QXR0cmlidXRlKCdkYXRhLWNvcnJlY3QtcmVzcG9uc2UnLCByZXNwb25zZVZhbHVlQXJyYXkuZmluZChydiA9PiBydiA9PT0gY2UuaWRlbnRpZmllcikgPyAndHJ1ZScgOiAnZmFsc2UnKTtcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktY2hvaWNlLWVsZW1lbnQtc2VsZWN0ZWQnLCB0aGlzLl9jaG9pY2VFbGVtZW50U2VsZWN0ZWRIYW5kbGVyKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdxdGktY2hvaWNlLWVsZW1lbnQtc2VsZWN0ZWQnLCB0aGlzLl9jaG9pY2VFbGVtZW50U2VsZWN0ZWRIYW5kbGVyKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1jaG9pY2UnLCB0aGlzLl9yZWdpc3RlckNob2ljZUVsZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJDaG9pY2VFbGVtZW50KGU6IEN1c3RvbUV2ZW50KSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBjaG9pY2VFbGVtZW50ID0gZS50YXJnZXQgYXMgUXRpQ2hvaWNlO1xuICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLnB1c2goY2hvaWNlRWxlbWVudCk7XG4gICAgdGhpcy5fc2V0SW5wdXRUeXBlKGNob2ljZUVsZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbG9vc2VDaG9pY2VFbGVtZW50KGU6IEN1c3RvbUV2ZW50KSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBjaG9pY2VFbGVtZW50ID0gZS50YXJnZXQgYXMgUXRpQ2hvaWNlO1xuICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLnB1c2goY2hvaWNlRWxlbWVudCk7XG4gICAgdGhpcy5fY2hvaWNlRWxlbWVudHMgPSB0aGlzLl9jaG9pY2VFbGVtZW50cy5maWx0ZXIoY2ggPT4gY2ggIT09IGNob2ljZUVsZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGV0ZXJtaW5lSW5wdXRUeXBlKCkge1xuICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2hvaWNlRWxlbWVudCA9PiB7XG4gICAgICB0aGlzLl9zZXRJbnB1dFR5cGUoY2hvaWNlRWxlbWVudCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9zZXRJbnB1dFR5cGUoY2hvaWNlRWxlbWVudDogUXRpQ2hvaWNlKSB7XG4gICAgaWYgKHRoaXMubWF4Q2hvaWNlcyA9PT0gMSkge1xuICAgICAgLy8gaWYgemVybyB0aGVuIHlvdSBjYW4gY2hvb3NlIGhvdyBtdWNoIHlvdSB3YW50XG4gICAgICBjaG9pY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsICdyYWRpbycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaG9pY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsICdjaGVja2JveCcpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBfY2hvaWNlRWxlbWVudFNlbGVjdGVkSGFuZGxlcihldmVudDogQ3VzdG9tRXZlbnQ8eyBpZGVudGlmaWVyOiBzdHJpbmc7IGNoZWNrZWQ6IGJvb2xlYW4gfT4pIHtcbiAgICBpZiAodGhpcy5tYXhDaG9pY2VzID09PSAxKSB7XG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50c1xuICAgICAgICAuZmlsdGVyKGNlID0+IGNlLmlkZW50aWZpZXIgIT09IGV2ZW50LmRldGFpbC5pZGVudGlmaWVyKVxuICAgICAgICAuZm9yRWFjaChjZSA9PiB7XG4gICAgICAgICAgY2UuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5fY2hvaWNlRWxlbWVudFNlbGVjdGVkKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2Nob2ljZUVsZW1lbnRTZWxlY3RlZCgpIHtcbiAgICBjb25zdCBzZWxlY3RlZElkZW50aWZpZXJzID0gdGhpcy5fY2hvaWNlRWxlbWVudHMuZmlsdGVyKGNlID0+IGNlLmNoZWNrZWQpLm1hcChjZSA9PiBjZS5pZGVudGlmaWVyKTtcblxuICAgIGlmICh0aGlzLm1heENob2ljZXMgPiAxKSB7XG4gICAgICBpZiAodGhpcy5tYXhDaG9pY2VzID09PSBzZWxlY3RlZElkZW50aWZpZXJzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNlID0+IChjZS5kaXNhYmxlZCA9ICFjZS5jaGVja2VkKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNlID0+IChjZS5kaXNhYmxlZCA9IGZhbHNlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgaWYgKHRoaXMubWF4Q2hvaWNlcyA9PT0gMSkge1xuICAgICAgcmVzdWx0ID0gc2VsZWN0ZWRJZGVudGlmaWVycy5sZW5ndGggPiAwID8gc2VsZWN0ZWRJZGVudGlmaWVyc1swXSA6IHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gc2VsZWN0ZWRJZGVudGlmaWVycztcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXJndW1lbnRcbiAgICB0aGlzLnNhdmVSZXNwb25zZShyZXN1bHQpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHVuc2FmZUhUTUwgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuaW50ZXJmYWNlIE9wdGlvblR5cGUge1xuICB0ZXh0Q29udGVudDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBzZWxlY3RlZDogYm9vbGVhbjtcbn1cblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlJbmxpbmVDaG9pY2VJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgcHVibGljIHN0YXRpYyBpbnB1dFdpZHRoQ2xhc3MgPSBbXG4gICAgJycsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0yJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTEnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtMycsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC00JyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTYnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtMTAnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtMTUnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtMjAnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtNzInXG4gIF07XG5cbiAgQHN0YXRlKCkgb3B0aW9uczogT3B0aW9uVHlwZVtdID0gW107XG5cbiAgQHN0YXRlKCkgY29ycmVjdE9wdGlvbjogc3RyaW5nID0gJyc7XG5cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnZGF0YS1wcm9tcHQnLCB0eXBlOiBTdHJpbmcgfSlcbiAgZGF0YVByb21wdDogc3RyaW5nID0gJ3NlbGVjdCc7XG5cbiAgc3RhdGljIG92ZXJyaWRlIGdldCBzdHlsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNzc2BcbiAgICAgICAgOmhvc3Qge1xuICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgfVxuICAgICAgYFxuICAgIF07XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2VsZWN0IHBhcnQ9XCJzZWxlY3RcIiBAY2hhbmdlPVwiJHt0aGlzLmNob2ljZVNlbGVjdGVkfVwiID9kaXNhYmxlZD1cIiR7dGhpcy5kaXNhYmxlZH1cIiA/cmVhZG9ubHk9XCIke3RoaXMucmVhZG9ubHl9XCI+XG4gICAgICAgICR7dGhpcy5vcHRpb25zLm1hcChcbiAgICAgICAgICBvcHRpb24gPT4gaHRtbGBcbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIke29wdGlvbi52YWx1ZX1cIiA/c2VsZWN0ZWQ9XCIke29wdGlvbi5zZWxlY3RlZH1cIj4ke3Vuc2FmZUhUTUwob3B0aW9uLnRleHRDb250ZW50KX08L29wdGlvbj5cbiAgICAgICAgICBgXG4gICAgICAgICl9XG4gICAgICA8L3NlbGVjdD5cblxuICAgICAgJHt1bnNhZmVIVE1MKHRoaXMuY29ycmVjdE9wdGlvbil9XG4gICAgYDtcbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdvbi1kcm9wZG93bi1zZWxlY3RlZCcsIHRoaXMuY2hvaWNlU2VsZWN0ZWQpO1xuICAgIGNvbnN0IGNob2ljZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWlubGluZS1jaG9pY2UnKSk7XG4gICAgdGhpcy5vcHRpb25zID0gW1xuICAgICAge1xuICAgICAgICB0ZXh0Q29udGVudDogdGhpcy5kYXRhUHJvbXB0LFxuICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgIHNlbGVjdGVkOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIC4uLmNob2ljZXMubWFwKGNob2ljZSA9PiAoe1xuICAgICAgICB0ZXh0Q29udGVudDogY2hvaWNlLmlubmVySFRNTCxcbiAgICAgICAgdmFsdWU6IGNob2ljZS5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSxcbiAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlXG4gICAgICB9KSlcbiAgICBdO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdvbi1kcm9wZG93bi1zZWxlY3RlZCcsIHRoaXMuY2hvaWNlU2VsZWN0ZWQpO1xuICB9XG5cbiAgcHVibGljIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbmQob3B0aW9uID0+IG9wdGlvbi5zZWxlY3RlZCk7XG4gICAgcmV0dXJuIHNlbGVjdGVkT3B0aW9uID8gc2VsZWN0ZWRPcHRpb24udmFsdWUgIT09ICcnIDogZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKSB7XG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5vcHRpb25zLm1hcCgob3B0aW9uLCBpKSA9PiAoeyAuLi5vcHRpb24sIHNlbGVjdGVkOiBpID09PSAwIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgcmVzcG9uc2UodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMub3B0aW9ucyA9IHRoaXMub3B0aW9ucy5tYXAob3B0aW9uID0+IHtcbiAgICAgIHZhbHVlID09PSBvcHRpb24udmFsdWUgJiYgKG9wdGlvbi5zZWxlY3RlZCA9IHRydWUpO1xuICAgICAgcmV0dXJuIG9wdGlvbjtcbiAgICB9KTtcbiAgfVxuXG4gIHNldCBjb3JyZWN0UmVzcG9uc2UodmFsdWU6IFJlYWRvbmx5PHN0cmluZyB8IHN0cmluZ1tdPikge1xuICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgIHRoaXMuY29ycmVjdE9wdGlvbiA9ICcnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNvcnJlY3RPcHRpb24gPSBgPHNwYW4gcGFydD1cImNvcnJlY3Qtb3B0aW9uXCI+JHtcbiAgICAgIHRoaXMub3B0aW9ucy5maW5kKG9wdGlvbiA9PiB2YWx1ZSA9PT0gb3B0aW9uLnZhbHVlKS50ZXh0Q29udGVudFxuICAgIH08L3NwYW4+YDtcbiAgfVxuXG4gIHB1YmxpYyBjaG9pY2VTZWxlY3RlZChldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBzZWxlY3RlZE9wdGlvblZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MU2VsZWN0RWxlbWVudCkudmFsdWU7XG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5vcHRpb25zLm1hcChvcHRpb24gPT4gKHsgLi4ub3B0aW9uLCBzZWxlY3RlZDogb3B0aW9uLnZhbHVlID09PSBzZWxlY3RlZE9wdGlvblZhbHVlIH0pKTtcbiAgICB0aGlzLnNhdmVSZXNwb25zZShzZWxlY3RlZE9wdGlvblZhbHVlKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvbic6IFF0aUlubGluZUNob2ljZUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9xdGktY2hvaWNlLWludGVyYWN0aW9uLnN0eWxlcyc7XG5pbXBvcnQgdHlwZSB7IENTU1Jlc3VsdEdyb3VwIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IENob2ljZXMgfSBmcm9tICcuLi9pbnRlcm5hbC9jaG9pY2VzL2Nob2ljZXMnO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBDaG9pY2VJbnRlcmFjdGlvbi5UeXBlIChxdGktY2hvaWNlLWludGVyYWN0aW9uKSBpbnRlcmFjdGlvbiBwcmVzZW50cyBhIGNvbGxlY3Rpb24gb2YgY2hvaWNlcyB0byB0aGUgY2FuZGlkYXRlLlxuICogQGRvY3VtZW50YXRpb24gaHR0cHM6Ly93d3cuaW1zZ2xvYmFsLm9yZy9zcGVjL3F0aS92M3AwL2ltcGwjaC5qOW51MW9hMXR1M2JcbiAqIEBzdGF0dXMgc3RhYmxlXG4gKiBAc2luY2UgNi4wXG4gKlxuICogQGV2ZW50IHF0aS1yZWdpc3Rlci1pbnRlcmFjdGlvbiAtIGVtaXR0ZWQgd2hlbiB0aGUgaW50ZXJhY3Rpb24gd2FudHMgdG8gcmVnaXN0ZXIgaXRzZWxmXG4gKiBAZXZlbnQgcXRpLWludGVyYWN0aW9uLXJlc3BvbnNlIC0gZW1pdHRlZCB3aGVuIHRoZSBpbnRlcmFjdGlvbiBjaGFuZ2VzXG4gKlxuICogQHNsb3QgLSBUaGUgZGVmYXVsdCBzbG90IHdoZXJlIDxxdGktc2ltcGxlLWNob2ljZT4gbXVzdCBiZSBwbGFjZWQuXG4gKiBAc2xvdCBwcm9tcHQgLSBzbG90IHdoZXJlIHRoZSBwcm9tcHQgaXMgcGxhY2VkLlxuICovXG5cbkBjdXN0b21FbGVtZW50KCdxdGktY2hvaWNlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlDaG9pY2VJbnRlcmFjdGlvbiBleHRlbmRzIENob2ljZXMge1xuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcblxuICAvKiogb3JpZW50YXRpb24gb2YgY2hvaWNlcyAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHVibGljIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD48c2xvdCBwYXJ0PVwic2xvdFwiPjwvc2xvdD5gO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24nOiBRdGlDaG9pY2VJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcyB9IGZyb20gJ2xpdCc7XG4vLyBpbXBvcnQgY29tcG9uZW50U3R5bGVzIGZyb20gJy4uLy4uL3V0aWxpdGllcy9zdHlsZXMvY29tcG9uZW50LnN0eWxlcyc7XG5cbi8qICR7Y29tcG9uZW50U3R5bGVzfSAqL1xuZXhwb3J0IGRlZmF1bHQgY3NzYFxuICA6aG9zdCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIC8vIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICB9XG5gO1xuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpUnVsZSwgUXRpUnVsZUJhc2UgfSBmcm9tICcuLic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktb3V0Y29tZS1wcm9jZXNzaW5nJylcbmV4cG9ydCBjbGFzcyBRdGlPdXRjb21lUHJvY2Vzc2luZyBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3MoKSB7XG4gICAgY29uc3QgbG9naWMgPSBuZXcgUXRpT3V0Y29tZVByb2Nlc3NpbmdQcm9jZXNzb3IoKTtcbiAgICBjb25zdCBydWxlcyA9IFsuLi50aGlzLmNoaWxkcmVuXSBhcyBRdGlSdWxlW107XG4gICAgbG9naWMucHJvY2VzcyhydWxlcyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW91dGNvbWUtcHJvY2Vzc2luZyc6IFF0aU91dGNvbWVQcm9jZXNzaW5nO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdGlPdXRjb21lUHJvY2Vzc2luZ1Byb2Nlc3NvciB7XG4gIHB1YmxpYyBwcm9jZXNzKHJ1bGVzOiBRdGlSdWxlQmFzZVtdKSB7XG4gICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgICBydWxlLnByb2Nlc3MoKTtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQsIFByb3BlcnR5VmFsdWVNYXAgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHsgbWFwUmVzcG9uc2UsIG1hcFJlc3BvbnNlUG9pbnQsIG1hdGNoQ29ycmVjdCB9IGZyb20gJy4uLy4uL2ludGVybmFsL3RlbXBsYXRlLXN0cmluZ3MnO1xuaW1wb3J0IHsgdHlwZSBRdGlSdWxlIH0gZnJvbSAnLi4vcXRpLXJ1bGUvcXRpLXJ1bGUnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnKVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUXRpUmVzcG9uc2VQcm9jZXNzaW5nIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgcHJvY2VzcygpIHtcbiAgICBjb25zdCBydWxlcyA9IFsuLi50aGlzLmNoaWxkcmVuXSBhcyBRdGlSdWxlW107XG5cbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXMpIHtcbiAgICAgIHJ1bGUucHJvY2VzcygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlTWFwPGFueT4gfCBNYXA8UHJvcGVydHlLZXksIHVua25vd24+KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZ2V0QXR0cmlidXRlKCd0ZW1wbGF0ZScpKSB7XG4gICAgICBjb25zdCBzcGxpdHRlZFRlbXBsYXRlTmFtZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCd0ZW1wbGF0ZScpIS5zcGxpdCgnLycpO1xuICAgICAgY29uc3QgdGVtcGxhdGVOYW1lID0gc3BsaXR0ZWRUZW1wbGF0ZU5hbWVbc3BsaXR0ZWRUZW1wbGF0ZU5hbWUubGVuZ3RoIC0gMV0ucmVwbGFjZSgnLnhtbCcsICcnKTtcbiAgICAgIHRoaXMuaW5uZXJIVE1MID0gJyc7XG4gICAgICBzd2l0Y2ggKHRlbXBsYXRlTmFtZSkge1xuICAgICAgICBjYXNlICdtYXBfcmVzcG9uc2UnOiB7XG4gICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLmZyYWdtZW50RnJvbVN0cmluZyhtYXBSZXNwb25zZSkuZmlyc3RFbGVtZW50Q2hpbGQuZmlyc3RFbGVtZW50Q2hpbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ21hcF9yZXNwb25zZV9wb2ludCc6IHtcbiAgICAgICAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMuZnJhZ21lbnRGcm9tU3RyaW5nKG1hcFJlc3BvbnNlUG9pbnQpLmZpcnN0RWxlbWVudENoaWxkLmZpcnN0RWxlbWVudENoaWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdtYXRjaF9jb3JyZWN0JzpcbiAgICAgICAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMuZnJhZ21lbnRGcm9tU3RyaW5nKG1hdGNoQ29ycmVjdCkuZmlyc3RFbGVtZW50Q2hpbGQuZmlyc3RFbGVtZW50Q2hpbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZnJhZ21lbnRGcm9tU3RyaW5nKHN0ckhUTUw6IHN0cmluZykge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChzdHJIVE1MKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcmVzcG9uc2UtcHJvY2Vzc2luZyc6IFF0aVJlc3BvbnNlUHJvY2Vzc2luZztcbiAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBtYXRjaENvcnJlY3QgPSBgPHF0aS1yZXNwb25zZS1wcm9jZXNzaW5nPlxuICA8cXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbiAgICA8cXRpLXJlc3BvbnNlLWlmPlxuICAgICAgPHF0aS1tYXRjaD5cbiAgICAgICAgPHF0aS12YXJpYWJsZSBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj48L3F0aS12YXJpYWJsZT5cbiAgICAgICAgPHF0aS1jb3JyZWN0IGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPjwvcXRpLWNvcnJlY3Q+XG4gICAgICA8L3F0aS1tYXRjaD5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJmbG9hdFwiPjE8L3F0aS1iYXNlLXZhbHVlPlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtaWY+XG4gICAgPHF0aS1yZXNwb25zZS1lbHNlPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1iYXNlLXZhbHVlIGJhc2UtdHlwZT1cImZsb2F0XCI+MDwvcXRpLWJhc2UtdmFsdWU+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1lbHNlPlxuICA8L3F0aS1yZXNwb25zZS1jb25kaXRpb24+XG48L3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nPmA7XG5cbmV4cG9ydCBjb25zdCBtYXBSZXNwb25zZSA9IGA8cXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+XG4gIDxxdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuICAgIDxxdGktcmVzcG9uc2UtaWY+XG4gICAgICA8cXRpLWlzLW51bGw+XG4gICAgICAgIDxxdGktdmFyaWFibGUgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+PC9xdGktdmFyaWFibGU+XG4gICAgICA8L3F0aS1pcy1udWxsPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1iYXNlLXZhbHVlIGJhc2UtdHlwZT1cImZsb2F0XCI+MC4wPC9xdGktYmFzZS12YWx1ZT5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWlmPlxuICAgIDxxdGktcmVzcG9uc2UtZWxzZT5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktbWFwLXJlc3BvbnNlIGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPiA8L3F0aS1tYXAtcmVzcG9uc2U+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1lbHNlPlxuICA8L3F0aS1yZXNwb25zZS1jb25kaXRpb24+XG48L3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nPmA7XG5cbmV4cG9ydCBjb25zdCBtYXBSZXNwb25zZVBvaW50ID0gYDxxdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5cbiAgPHF0aS1yZXNwb25zZS1jb25kaXRpb24+XG4gICAgPHF0aS1yZXNwb25zZS1pZj5cbiAgICAgIDxxdGktaXMtbnVsbD5cbiAgICAgICAgPHF0aS12YXJpYWJsZSBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj48L3F0aS12YXJpYWJsZT5cbiAgICAgIDwvcXRpLWlzLW51bGw+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLWJhc2UtdmFsdWUgYmFzZS10eXBlPVwiZmxvYXRcIj4wPC9xdGktYmFzZS12YWx1ZT5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWlmPlxuICAgIDxxdGktcmVzcG9uc2UtZWxzZT5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktbWFwLXJlc3BvbnNlLXBvaW50IGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPjwvcXRpLW1hcC1yZXNwb25zZS1wb2ludD5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWVsc2U+XG4gIDwvcXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbjwvcXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+YDtcbiIsICJpbXBvcnQgeyBPdXRjb21lVmFyaWFibGUgfSBmcm9tICdAY2l0b2xhYi9xdGktY29tcG9uZW50cy9xdGktY29tcG9uZW50cyc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0IH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdXRpbHMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUgfSBmcm9tICcuLi9xdGktcnVsZSc7XG5cbi8qKlxuICogVGhlIGxvb2t1cE91dGNvbWVWYWx1ZSBydWxlIHNldHMgdGhlIHZhbHVlIG9mIGFuIG91dGNvbWUgdmFyaWFibGUgdG8gdGhlIHZhbHVlIG9idGFpbmVkXG4gKiBieSBsb29raW5nIHVwIHRoZSB2YWx1ZSBvZiB0aGUgYXNzb2NpYXRlZCBleHByZXNzaW9uIGluIHRoZSBsb29rdXBUYWJsZSBhc3NvY2lhdGVkXG4gKiB3aXRoIHRoZSBvdXRjb21lJ3MgZGVjbGFyYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdGlMb29rdXBPdXRjb21lVmFsdWUgZXh0ZW5kcyBRdGlSdWxlIHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBnZXQgY2hpbGRFeHByZXNzaW9uKCk6IFF0aUV4cHJlc3Npb248c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQgYXMgUXRpRXhwcmVzc2lvbjxzdHJpbmc+O1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHByb2Nlc3MoKTogbnVtYmVyIHtcbiAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICBjb25zdCBvdXRjb21lVmFyaWFibGUgPSB0aGlzLmNsb3Nlc3QoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKS5nZXRWYXJpYWJsZShpZGVudGlmaWVyKSBhcyBPdXRjb21lVmFyaWFibGU7XG4gICAgbGV0IHZhbHVlO1xuICAgIGlmIChvdXRjb21lVmFyaWFibGUuaW50ZXJwb2xhdGlvblRhYmxlKSB7XG4gICAgICB2YWx1ZSA9IG91dGNvbWVWYXJpYWJsZS5pbnRlcnBvbGF0aW9uVGFibGUuZ2V0KHBhcnNlSW50KHRoaXMuY2hpbGRFeHByZXNzaW9uLmNhbGN1bGF0ZSgpKSk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ2xvb2t1cE91dGNvbWVWYWx1ZTogdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyBvdXRjb21lSWRlbnRpZmllcjogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfT4oJ3F0aS1zZXQtb3V0Y29tZS12YWx1ZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIG91dGNvbWVJZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICAgICAgdmFsdWU6IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0KHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1sb29rdXAtb3V0Y29tZS12YWx1ZScsIFF0aUxvb2t1cE91dGNvbWVWYWx1ZSk7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1sb29rdXAtb3V0Y29tZS12YWx1ZSc6IFF0aUxvb2t1cE91dGNvbWVWYWx1ZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1ydWxlJylcbmV4cG9ydCBjbGFzcyBRdGlSdWxlIGV4dGVuZHMgTGl0RWxlbWVudCBpbXBsZW1lbnRzIFF0aVJ1bGVCYXNlIHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3MoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF0aVJ1bGVCYXNlIHtcbiAgcHJvY2VzcygpOiBhbnk7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ydWxlJzogUXRpUnVsZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUgfSBmcm9tICcuLi9xdGktcnVsZSc7XG5cbmV4cG9ydCBjbGFzcyBRdGlSZXNwb25zZUNvbmRpdGlvbiBleHRlbmRzIFF0aVJ1bGUge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgcHJvY2VzcygpIHtcbiAgICBjb25zdCBicmFuY2hlcyA9IFsuLi50aGlzLmNoaWxkcmVuXSBhcyBRdGlFeHByZXNzaW9uPGFueT5bXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnJhbmNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGJyYW5jaCA9IGJyYW5jaGVzW2ldO1xuXG4gICAgICBpZiAoYnJhbmNoLmNhbGN1bGF0ZSgpKSB7XG4gICAgICAgIChicmFuY2ggYXMgdW5rbm93biBhcyBRdGlSdWxlKS5wcm9jZXNzKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1yZXNwb25zZS1jb25kaXRpb24nLCBRdGlSZXNwb25zZUNvbmRpdGlvbik7XG4iLCAiaW1wb3J0IHsgY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC91dGlscyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uLCBRdGlFeHByZXNzaW9uQmFzZSB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUsIFF0aVJ1bGVCYXNlIH0gZnJvbSAnLi4vcXRpLXJ1bGUnO1xuXG5leHBvcnQgY2xhc3MgUXRpU2V0T3V0Y29tZVZhbHVlIGV4dGVuZHMgUXRpUnVsZSB7XG4gIHB1YmxpYyBvdmVycmlkZSBwcm9jZXNzKCkge1xuICAgIGNvbnN0IG91dGNvbWVJZGVudGlmaWVyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcblxuICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUV4cHJlc3Npb248c3RyaW5nPjtcblxuICAgIGNvbnN0IHJ1bGUgPSBuZXcgUXRpU2V0T3V0Y29tZVZhbHVlUnVsZShleHByZXNzaW9uKTtcbiAgICBjb25zdCB2YWx1ZSA9IHJ1bGUucHJvY2VzcygpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDx7IG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PigncXRpLXNldC1vdXRjb21lLXZhbHVlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgb3V0Y29tZUlkZW50aWZpZXIsXG4gICAgICAgICAgdmFsdWU6IEFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICAgICAgICA/IHZhbHVlLm1hcCgodjogc3RyaW5nKSA9PiBjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCh2KSlcbiAgICAgICAgICAgIDogY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQodmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXRpU2V0T3V0Y29tZVZhbHVlUnVsZTxUPiBpbXBsZW1lbnRzIFF0aVJ1bGVCYXNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBleHByZXNzaW9uOiBRdGlFeHByZXNzaW9uQmFzZTxUPikge31cblxuICBwcm9jZXNzKCk6IGFueSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmV4cHJlc3Npb24gPyB0aGlzLmV4cHJlc3Npb24uY2FsY3VsYXRlKCkgOiBudWxsO1xuXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2Fybignc2V0T3V0Y29tZVZhbHVlOiB2YWx1ZSBpcyBudWxsIG9yIHVuZGVmaW5lZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktc2V0LW91dGNvbWUtdmFsdWUnLCBRdGlTZXRPdXRjb21lVmFsdWUpO1xuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgUXRpUnVsZSB9IGZyb20gJy4uL3F0aS1ydWxlL3F0aS1ydWxlJztcblxuZXhwb3J0IGNsYXNzIFF0aVJlc3BvbnNlRWxzZSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3ViUnVsZXMoKTogUXRpUnVsZVtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuY2hpbGRyZW5dIGFzIFF0aVJ1bGVbXTtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzKCkge1xuICAgIGNvbnN0IHN1YlJ1bGVzID0gdGhpcy5nZXRTdWJSdWxlcygpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViUnVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHN1YlJ1bGUgPSBzdWJSdWxlc1tpXTtcbiAgICAgIHN1YlJ1bGUucHJvY2VzcygpO1xuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1yZXNwb25zZS1lbHNlJywgUXRpUmVzcG9uc2VFbHNlKTtcbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IFF0aVJlc3BvbnNlSWYgfSBmcm9tICcuLi9xdGktcmVzcG9uc2UtaWYnO1xuXG5leHBvcnQgY2xhc3MgUXRpUmVzcG9uc2VFbHNlSWYgZXh0ZW5kcyBRdGlSZXNwb25zZUlmIHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCR7c3VwZXIucmVuZGVyKCl9YDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1yZXNwb25zZS1lbHNlLWlmJywgUXRpUmVzcG9uc2VFbHNlSWYpO1xuIiwgImltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi8uLi9xdGktZXhwcmVzc2lvbi9xdGktZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlSdWxlIH0gZnJvbSAnLi4vLi4vcXRpLXJ1bGUvcXRpLXJ1bGUnO1xuaW1wb3J0IHsgUXRpUmVzcG9uc2VFbHNlIH0gZnJvbSAnLi4vcXRpLXJlc3BvbnNlLWVsc2UnO1xuXG5leHBvcnQgY2xhc3MgUXRpUmVzcG9uc2VJZiBleHRlbmRzIFF0aVJlc3BvbnNlRWxzZSB7XG4gIHB1YmxpYyBvdmVycmlkZSBjYWxjdWxhdGUoKSB7XG4gICAgY29uc3QgZXhwcmVzc2lvbiA9IHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQgYXMgUXRpRXhwcmVzc2lvbjxib29sZWFuPjtcbiAgICBjb25zdCByZXN1bHQgPSBleHByZXNzaW9uLmNhbGN1bGF0ZSgpIGFzIGJvb2xlYW47XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRTdWJSdWxlcygpOiBRdGlSdWxlW10ge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdWx0LnB1c2godGhpcy5jaGlsZHJlbltpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcmVzcG9uc2UtaWYnLCBRdGlSZXNwb25zZUlmKTtcbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlLCBWYXJpYWJsZURlY2xhcmF0aW9uIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUFzc2Vzc21lbnRJdGVtIH0gZnJvbSAnLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtJztcbmltcG9ydCB7IFF0aU11bHRpcGxlIH0gZnJvbSAnLi9xdGktbXVsdGlwbGUvcXRpLW11bHRpcGxlJztcblxuZXhwb3J0IGludGVyZmFjZSBRdGlFeHByZXNzaW9uQmFzZTxUPiB7XG4gIC8vIGdldCBhc3Nlc3NtZW50SXRlbSgpOiBRdGlBc3Nlc3NtZW50SXRlbTtcblxuICAvLyBnZXRWYXJpYWJsZXMoKTogVmFyaWFibGVEZWNsYXJhdGlvbjxudW1iZXIgfCBzdHJpbmcgfCAobnVtYmVyIHwgc3RyaW5nKVtdIHwgbnVsbD5bXTtcbiAgY2FsY3VsYXRlKCk6IFJlYWRvbmx5PFQ+O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUXRpRXhwcmVzc2lvbjxUPiBleHRlbmRzIExpdEVsZW1lbnQgaW1wbGVtZW50cyBRdGlFeHByZXNzaW9uQmFzZTxUPiB7XG4gIEBzdGF0ZSgpXG4gIHByb3RlY3RlZCByZXN1bHQ6IGFueTtcblxuICAvLyBoaWRlIHRoZSBzbG90IHdpdGggY3NzXG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgc2xvdCB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHByZT4ke0pTT04uc3RyaW5naWZ5KHRoaXMucmVzdWx0LCBudWxsLCAyKX08L3ByZT5cbiAgICAgIDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpOiBSZWFkb25seTxUPiB7XG4gICAgdGhpcy5yZXN1bHQgPSB0aGlzLmdldFJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzLnJlc3VsdDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRSZXN1bHQoKTogUmVhZG9ubHk8VD4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICBnZXQgYXNzZXNzbWVudEl0ZW0oKTogUXRpQXNzZXNzbWVudEl0ZW0ge1xuICAgIHJldHVybiB0aGlzLmNsb3Nlc3QoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKSBhcyBRdGlBc3Nlc3NtZW50SXRlbTtcbiAgfVxuXG4gIGdldFZhcmlhYmxlcyA9ICgpOiBWYXJpYWJsZURlY2xhcmF0aW9uPG51bWJlciB8IHN0cmluZyB8IChudW1iZXIgfCBzdHJpbmcpW10gfCBudWxsPltdID0+XG4gICAgLy8gRklYTUU6IGlmIHRoaXMgaXRzZWxmIGlzIG11bHRpcGxlLCB0aGlzIHdpbGwgbmV2ZXIgZW50ZXIgdGhlIHF0aS1tdWx0aXBsZSBzd2l0Y2hcbiAgICAvLyBTZWUgdGhpcyBleGFtcGxlIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS8xRWRUZWNoL3F0aS1leGFtcGxlcy9ibG9iL21hc3Rlci9xdGl2My1leGFtcGxlcy9wYWNrYWdpbmcvaXRlbXMvRXhhbXBsZTA1LWZlZWRiYWNrQmxvY2stYWRhcHRpdmUueG1sXG5cbiAgICBBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4pXG4gICAgICAubWFwKChlOiBFbGVtZW50KSA9PiB7XG4gICAgICAgIHN3aXRjaCAoZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICBjYXNlICdxdGktYmFzZS12YWx1ZSc6IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGJhc2VUeXBlOiBlLmdldEF0dHJpYnV0ZSgnYmFzZS10eXBlJyksXG4gICAgICAgICAgICAgIHZhbHVlOiBlLnRleHRDb250ZW50LFxuICAgICAgICAgICAgICBjYXJkaW5hbGl0eTogJ3NpbmdsZSdcbiAgICAgICAgICAgIH0gYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAncXRpLXZhcmlhYmxlJzoge1xuICAgICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IGUuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgfHwgJyc7XG4gICAgICAgICAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMuYXNzZXNzbWVudEl0ZW0uZ2V0VmFyaWFibGUoaWRlbnRpZmllcik7XG4gICAgICAgICAgICByZXR1cm4gdmFyaWFibGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3F0aS1tdWx0aXBsZSc6IHtcbiAgICAgICAgICAgIGNvbnN0IG11bHRpcGxlID0gZSBhcyBRdGlNdWx0aXBsZTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IG11bHRpcGxlLmdldFJlc3VsdCgpO1xuICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaWRlbnRpZmllcjogJycsXG4gICAgICAgICAgICAgICAgYmFzZVR5cGU6IHZhbHVlc1swXS5iYXNlVHlwZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVzLm1hcCh2ID0+IHYudmFsdWUpLFxuICAgICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiAnbXVsdGlwbGUnLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdyZXNwb25zZSdcbiAgICAgICAgICAgICAgfSBhcyBSZXNwb25zZVZhcmlhYmxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3F0aS1jb3JyZWN0Jzoge1xuICAgICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IGUuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgfHwgJyc7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlID0gdGhpcy5hc3Nlc3NtZW50SXRlbS5nZXRSZXNwb25zZShpZGVudGlmaWVyKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGJhc2VUeXBlOiByZXNwb25zZVZhcmlhYmxlLmJhc2VUeXBlLFxuICAgICAgICAgICAgICB2YWx1ZTogcmVzcG9uc2VWYXJpYWJsZS5jb3JyZWN0UmVzcG9uc2UsXG4gICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiByZXNwb25zZVZhcmlhYmxlLmNhcmRpbmFsaXR5XG4gICAgICAgICAgICB9IGFzIFJlc3BvbnNlVmFyaWFibGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIC8vIGFkZGVkIGZvciB1c2Ugb2YgcXRpLWVxdWFsLXJvdW5kZWRcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSBlIGFzIFF0aUV4cHJlc3Npb248bnVtYmVyPjtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBleHByZXNzaW9uLmdldFJlc3VsdCgpO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGJhc2VUeXBlOiAnaW50ZWdlcicsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgY2FyZGluYWxpdHk6ICdzaW5nbGUnXG4gICAgICAgICAgICAgIH0gYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybignZGVmYXVsdCBub3Qgc3VmZmljaWVudCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZpbHRlcih2ID0+IHYgIT09IG51bGwpO1xufVxuIiwgImltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgcHVibGljIGNhbGN1bGF0ZSgpOiBSZWFkb25seTxib29sZWFuPiB7XG4gICAgdGhpcy5yZXN1bHQgPSB0aGlzLmdldFJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzLnJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSZXN1bHQoKTogUmVhZG9ubHk8Ym9vbGVhbj4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBRdGlDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbnR5cGUgQ29uc3RydWN0b3I8VD4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuZXhwb3J0IGNsYXNzIFF0aUFuZCBleHRlbmRzIHF0aUFuZE1peGluKFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxRdGlDb25kaXRpb25FeHByZXNzaW9uPikge1xuICBwdWJsaWMgY2FsY3VsYXRlKCkge1xuICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZUNoaWxkcmVuKEFycmF5LmZyb20odGhpcy5jaGlsZHJlbiBhcyB1bmtub3duIGFzIFF0aUV4cHJlc3Npb248YW55PltdKSk7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgTW9ja1F0aUV4cHJlc3Npb248VD4gPSB7IGNhbGN1bGF0ZTogKCkgPT4gVCB9O1xudHlwZSBNb2NrQ29uc3RydWN0b3IgPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiB7fTtcbmV4cG9ydCBmdW5jdGlvbiBxdGlBbmRNaXhpbjxUQmFzZSBleHRlbmRzIE1vY2tDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgcmV0dXJuIGNsYXNzIE1vY2tRdGlBbmQgZXh0ZW5kcyBCYXNlIHtcbiAgICBwdWJsaWMgY2FsY3VsYXRlQ2hpbGRyZW4oY2hpbGRyZW46IEFycmF5PE1vY2tRdGlFeHByZXNzaW9uPGFueT4+KSB7XG4gICAgICAvLyBjaGlsZHJlbiBjYW4gYmUgYSBtaXggb2YgcXRpLWV4cHJlc3Npb24gYW5kIHF0aS1jb25kaXRpb24tZXhwcmVzc2lvblxuICAgICAgY29uc3QgdmFsdWVzID0gY2hpbGRyZW4ubWFwKGMgPT4ge1xuICAgICAgICBjb25zdCBjb25kaXRpb24gPSBjIGFzIE1vY2tRdGlFeHByZXNzaW9uPGFueT47XG4gICAgICAgIGlmICghY29uZGl0aW9uLmNhbGN1bGF0ZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFbGVtZW50IGRvZXNuJ3QgaW1wbGVtZW50IFF0aUNvbmRpdGlvbkV4cHJlc3Npb25cIik7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHZhbHVlID0gY29uZGl0aW9uLmNhbGN1bGF0ZSgpIGFzIEJvb2xlYW47XG4gICAgICAgIC8vIGNvbnZlcnQgc3RyaW5nIHZhbHVlIHRvIGJvb2xlYW4gYW5kIHJldHVybiBudWxsIGlmIG5vdCBwb3NzaWJsZVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgdmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCB2YWx1ZSBpbiBxdGktYW5kLCBleHBlY3RlZCBib29sZWFuJyk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdmFsdWVzLmV2ZXJ5KGUgPT4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGUgPT09ICdib29sZWFuJyAmJiBlO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xufVxuIiwgImltcG9ydCB7IFF0aUFuZCB9IGZyb20gJy4vcXRpLWFuZCc7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1hbmQnLCBRdGlBbmQpO1xuXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hbmQnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYW5kJzogUXRpQW5kO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBCYXNlVHlwZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0JztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5leHBvcnQgY2xhc3MgUXRpQmFzZVZhbHVlIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxzdHJpbmc+IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdiYXNlLXR5cGUnIH0pIGJhc2VUeXBlOiBCYXNlVHlwZSA9ICdzdHJpbmcnO1xuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMudGV4dENvbnRlbnQ7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWJhc2UtdmFsdWUnLCBRdGlCYXNlVmFsdWUpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1jb25kaXRpb24tZXhwcmVzc2lvbic7XG5cbi8vIFBLOiBGb3IgdGhlIGNvbnRhaW5zIHdlIGFzc3VtZSB0aGUgZXhwcmVzc2lvbnMgdG8gY2FsY3VsYXRlIGFyZSBhbGwgZGlyZWN0ZWRQYWlyc1xuLy8gSSBkb24ndCBrbm93IGl0IHRoaXMgaW4gUVRJIGlzIGFsd2F5cyB0aGUgY2FzZSBob3dldmVyP1xuZXhwb3J0IGNsYXNzIFF0aUNvbnRhaW5zIGV4dGVuZHMgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgZm9yIG90aGVyIHR5cGVzIHRoYW4gZGlyZWN0ZWRQYWlyXG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2RpcmVjdGVkUGFpcicgJiZcbiAgICAgICAgdmFsdWUyLmJhc2VUeXBlID09PSAnZGlyZWN0ZWRQYWlyJyAmJlxuICAgICAgICB2YWx1ZTEuY2FyZGluYWxpdHkgPT09ICdtdWx0aXBsZSdcbiAgICAgICkge1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uMSA9IHZhbHVlMS52YWx1ZSBhcyBzdHJpbmdbXTtcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbjIgPSB2YWx1ZTIudmFsdWUgYXMgc3RyaW5nW107XG4gICAgICAgIGNvbnN0IGVudW1lcmFibGUgPSBwcm9qZWN0aW9uMS5maWx0ZXIoeCA9PiBwcm9qZWN0aW9uMi5pbmNsdWRlcyh4KSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZW51bWVyYWJsZS5sZW5ndGggPiAwO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdmFsdWUxLmJhc2VUeXBlID09PSAnZGlyZWN0ZWRQYWlyJyAmJlxuICAgICAgICB2YWx1ZTIuYmFzZVR5cGUgPT09ICdkaXJlY3RlZFBhaXInICYmXG4gICAgICAgIHZhbHVlMS5jYXJkaW5hbGl0eSA9PT0gJ3NpbmdsZSdcbiAgICAgICkge1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uMSA9IHZhbHVlMS52YWx1ZSBhcyBzdHJpbmc7XG4gICAgICAgIGNvbnN0IHByb2plY3Rpb24yID0gdmFsdWUyLnZhbHVlIGFzIHN0cmluZ1tdO1xuICAgICAgICByZXR1cm4gcHJvamVjdGlvbjIuaW5jbHVkZXMocHJvamVjdGlvbjEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAndW5zdXBwb3J0ZWQgYmFzZVR5cGUgb3IgY2FyZGluYWxpdHkgaW4gcXRpIGNvbnRhaW5zLCBvbmx5IGJhc2VUeXBlOiBkaXJlY3RlZFBhaXIgYW5kIGNhcmRpbmFsaXR5OiBtdWx0aXBsZSBpcyBzdXBwb3J0ZWQnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aSBjb250YWlucycpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktY29udGFpbnMnLCBRdGlDb250YWlucyk7XG4iLCAiaW1wb3J0IHsgUXRpQXNzZXNzbWVudEl0ZW0gfSBmcm9tICcuLi8uLi8uLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0nO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aUNvcnJlY3QgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPHN0cmluZyB8IHN0cmluZ1tdPiB7XG4gIGdldCBpbnRlcnByZXRhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoJ2ludGVycHJldGF0aW9uJykgfHwgJyc7XG4gIH1cblxuICBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgfHwgJyc7XG4gICAgY29uc3QgcmVzcG9uc2VWYXJpYWJsZSA9ICh0aGlzLmNsb3Nlc3QoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKSBhcyBRdGlBc3Nlc3NtZW50SXRlbSkuZ2V0UmVzcG9uc2UoaWRlbnRpZmllcik7XG4gICAgcmVzcG9uc2VWYXJpYWJsZS5jb3JyZWN0UmVzcG9uc2U7XG4gICAgaWYgKHJlc3BvbnNlVmFyaWFibGUuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2VWYXJpYWJsZS5jb3JyZWN0UmVzcG9uc2UubGVuZ3RoID4gMCA/IHJlc3BvbnNlVmFyaWFibGUuY29ycmVjdFJlc3BvbnNlWzBdIDogJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZXNwb25zZVZhcmlhYmxlLmNvcnJlY3RSZXNwb25zZTtcbiAgICB9XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktY29ycmVjdCcsIFF0aUNvcnJlY3QpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpRXF1YWxSb3VuZGVkIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSByb3VuZGluZ01vZGU6ICdkZWNpbWFsUGxhY2VzJyB8ICdzaWduaWZpY2FudEZpZ3VyZXMnID0gJ3NpZ25pZmljYW50RmlndXJlcyc7XG5cbiAgZ2V0IGZpZ3VyZXMoKSB7XG4gICAgY29uc3QgYXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdmaWd1cmVzJyk7XG4gICAgaWYgKCFhdHRyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdmaWd1cmVzIGF0dHJpYnV0ZSBpcyBtaXNzaW5nJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZmlndXJlcyA9IHBhcnNlSW50KHRoaXMuZ2V0QXR0cmlidXRlKCdmaWd1cmVzJykgfHwgJzAnKTtcbiAgICBpZiAoaXNOYU4oZmlndXJlcykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZpZ3VyZXMgYXR0cmlidXRlIGlzIG5vdCBhIG51bWJlcicpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChmaWd1cmVzIDwgMCkge1xuICAgICAgY29uc29sZS5lcnJvcignZmlndXJlcyBhdHRyaWJ1dGUgaXMgbmVnYXRpdmUnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoZmlndXJlcyA8IDEgJiYgdGhpcy5yb3VuZGluZ01vZGUgPT09ICdzaWduaWZpY2FudEZpZ3VyZXMnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdmaWd1cmVzIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gMSBmb3IgUm91bmRpbmdNb2RlIHNpZ25pZmljYW50RmlndXJlcycpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBmaWd1cmVzO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHRoaXMucm91bmRpbmdNb2RlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZTEuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIHZhbHVlMi5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTEudmFsdWUpIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUyLnZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIGVxdWFsJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAodmFsdWVzWzBdLmJhc2VUeXBlKSB7XG4gICAgICAgIGNhc2UgJ2ludGVnZXInOlxuICAgICAgICBjYXNlICdmbG9hdCc6IHtcbiAgICAgICAgICBjb25zdCBmbG9hdDEgPSBwYXJzZUZsb2F0KHZhbHVlMS52YWx1ZSBhcyBzdHJpbmcpO1xuICAgICAgICAgIGNvbnN0IGZsb2F0MiA9IHBhcnNlRmxvYXQodmFsdWUyLnZhbHVlIGFzIHN0cmluZyk7XG5cbiAgICAgICAgICBpZiAoIWlzTmFOKGZsb2F0MSkgJiYgIWlzTmFOKGZsb2F0MikpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvdW5kaW5nTW9kZSA9PT0gJ3NpZ25pZmljYW50RmlndXJlcycpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0MS50b1ByZWNpc2lvbih0aGlzLmZpZ3VyZXMpID09PSBmbG9hdDIudG9QcmVjaXNpb24odGhpcy5maWd1cmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgTWF0aC5yb3VuZChmbG9hdDEgKiBNYXRoLnBvdygxMCwgdGhpcy5maWd1cmVzKSkgLyBNYXRoLnBvdygxMCwgdGhpcy5maWd1cmVzKSA9PT1cbiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKGZsb2F0MiAqIE1hdGgucG93KDEwLCB0aGlzLmZpZ3VyZXMpKSAvIE1hdGgucG93KDEwLCB0aGlzLmZpZ3VyZXMpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYHZhbHVlIGNhbm5vdCBiZSBjYXN0ZWQgdG8gbnVtZXJpYyB2YWx1ZSBpbiBlcXVhbFJvdW5kZWQgb3BlcmF0b3I6ICR7ZmxvYXQxfSwgJHtmbG9hdDJ9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGB2YWx1ZXMgb3RoZXIgdGhhbiBmbG9hdCBhbmQgaW50IGNhbm5vdCBiZSB1c2VkIGluIGVxdWFsUm91bmRlZCBvcGVyYXRvci5gKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGktZXF1YWwtcm91bmRlZCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWVxdWFsLXJvdW5kZWQnLCBRdGlFcXVhbFJvdW5kZWQpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBTY29yaW5nSGVscGVyIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlFcXVhbCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgdG9sZXJhbmNlTW9kZTogJ2V4YWN0JyB8ICdyZWxhdGl2ZScgfCAnYWJzb2x1dGUnID0gJ2V4YWN0JztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodGhpcy50b2xlcmFuY2VNb2RlICE9PSAnZXhhY3QnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3RvbGVyYW5jZU1vZGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZTEuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIHZhbHVlMi5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTEudmFsdWUpIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUyLnZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIGVxdWFsJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXModmFsdWUxLnZhbHVlIGFzIHN0cmluZywgdmFsdWUyLnZhbHVlIGFzIHN0cmluZywgdmFsdWUxLmJhc2VUeXBlKTtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpLWVxdWFsJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktZXF1YWwnLCBRdGlFcXVhbCk7XG4iLCAiaW1wb3J0IHsgQmFzZVR5cGUgfSBmcm9tICcuLi8uLic7XG5cbmV4cG9ydCBjbGFzcyBTY29yaW5nSGVscGVyIHtcbiAgcHVibGljIHN0YXRpYyBjb21wYXJlU2luZ2xlVmFsdWVzKHZhbHVlMTogUmVhZG9ubHk8c3RyaW5nPiwgdmFsdWUyOiBSZWFkb25seTxzdHJpbmc+LCBiYXNlVHlwZTogQmFzZVR5cGUpOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKGJhc2VUeXBlKSB7XG4gICAgICBjYXNlICdpZGVudGlmaWVyJzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIHJldHVybiB2YWx1ZTEgPT09IHZhbHVlMjtcbiAgICAgIGNhc2UgJ2ludGVnZXInOiB7XG4gICAgICAgIGNvbnN0IGludDEgPSBwYXJzZUludCh2YWx1ZTEsIDEwKTtcbiAgICAgICAgY29uc3QgaW50MiA9IHBhcnNlSW50KHZhbHVlMiwgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKGludDEpICYmICFpc05hTihpbnQyKSkge1xuICAgICAgICAgIHJldHVybiBpbnQxID09PSBpbnQyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYENhbm5vdCBjb252ZXJ0ICR7dmFsdWUxfSBhbmQvb3IgJHt2YWx1ZTJ9IHRvIGludC5gKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Zsb2F0Jzoge1xuICAgICAgICBjb25zdCBmbG9hdDEgPSBwYXJzZUZsb2F0KHZhbHVlMSk7XG4gICAgICAgIGNvbnN0IGZsb2F0MiA9IHBhcnNlRmxvYXQodmFsdWUyKTtcbiAgICAgICAgaWYgKCFpc05hTihmbG9hdDEpICYmICFpc05hTihmbG9hdDIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZsb2F0MSA9PT0gZmxvYXQyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGNvdWxkbid0IGNvbnZlcnQgJHt2YWx1ZTF9IGFuZC9vciAke3ZhbHVlMn0gdG8gZmxvYXQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdwYWlyJzpcbiAgICAgIGNhc2UgJ2RpcmVjdGVkUGFpcic6IHtcbiAgICAgICAgY29uc3QgcGFpcjEgPSB2YWx1ZTEuc3BsaXQoJyAnKS5zb3J0KCk7XG4gICAgICAgIGNvbnN0IHBhaXIyID0gdmFsdWUyLnNwbGl0KCcgJykuc29ydCgpO1xuICAgICAgICBpZiAocGFpcjEubGVuZ3RoID09PSAyICYmIHBhaXIyLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIGlmIChiYXNlVHlwZSA9PT0gJ3BhaXInKSB7XG4gICAgICAgICAgICBwYWlyMS5zb3J0KCk7XG4gICAgICAgICAgICBwYWlyMi5zb3J0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBwYWlyMS5qb2luKCcgJykgPT09IHBhaXIyLmpvaW4oJyAnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBjb21wYXJlZCB0d28gcGFpciBidXQgb25lIG9mIHRoZSB2YWx1ZXMgZG9lcyBub3QgaGF2ZSAyIHZhbHVlczogMTogJHt2YWx1ZTF9IDI6ICR7dmFsdWUyfWApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aUd0IGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09IHZhbHVlMi5iYXNlVHlwZSAmJiAodmFsdWUxLmJhc2VUeXBlID09PSAnaW50ZWdlcicgfHwgdmFsdWUxLmJhc2VUeXBlID09PSAnZmxvYXQnKSkge1xuICAgICAgICByZXR1cm4gK3ZhbHVlMS52YWx1ZSA+ICt2YWx1ZTIudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGJhc2VUeXBlIG9yIGNhcmRpbmFsaXR5IGluIHF0aSBndCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWd0JywgUXRpR3QpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1jb25kaXRpb24tZXhwcmVzc2lvbic7XG5cbi8vIFBLOiBGb3IgdGhlIGNvbnRhaW5zIHdlIGFzc3VtZSB0aGUgZXhwcmVzc2lvbnMgdG8gY2FsY3VsYXRlIGFyZSBhbGwgZGlyZWN0ZWRQYWlyc1xuLy8gSSBkb24ndCBrbm93IGl0IHRoaXMgaW4gUVRJIGlzIGFsd2F5cyB0aGUgY2FzZSBob3dldmVyP1xuZXhwb3J0IGNsYXNzIFF0aUd0ZSBleHRlbmRzIFF0aUNvbmRpdGlvbkV4cHJlc3Npb24ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodmFsdWUxLmJhc2VUeXBlID09PSB2YWx1ZTIuYmFzZVR5cGUgJiYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2ludGVnZXInIHx8IHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2Zsb2F0JykpIHtcbiAgICAgICAgcmV0dXJuICt2YWx1ZTEudmFsdWUgPj0gK3ZhbHVlMi52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgYmFzZVR5cGUgb3IgY2FyZGluYWxpdHkgaW4gcXRpIGd0ZScpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5sb2coJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0ZScpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWd0ZScsIFF0aUd0ZSk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG4vLyBQSzogRm9yIHRoZSBjb250YWlucyB3ZSBhc3N1bWUgdGhlIGV4cHJlc3Npb25zIHRvIGNhbGN1bGF0ZSBhcmUgYWxsIGRpcmVjdGVkUGFpcnNcbi8vIEkgZG9uJ3Qga25vdyBpdCB0aGlzIGluIFFUSSBpcyBhbHdheXMgdGhlIGNhc2UgaG93ZXZlcj9cbmV4cG9ydCBjbGFzcyBRdGlJc051bGwgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgaWYgKCF2YXJpYWJsZXMpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IHZhcmlhYmxlc1swXS52YWx1ZTtcbiAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gJyc7XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aSBOdWxsJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktaXMtbnVsbCcsIFF0aUlzTnVsbCk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpTHQgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlICYmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdpbnRlZ2VyJyB8fCB2YWx1ZTEuYmFzZVR5cGUgPT09ICdmbG9hdCcpKSB7XG4gICAgICAgIHJldHVybiArdmFsdWUxLnZhbHVlIDwgK3ZhbHVlMi52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgYmFzZVR5cGUgb3IgY2FyZGluYWxpdHkgaW4gcXRpIGx0Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIGx0Jyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbHQnLCBRdGlMdCk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uJztcblxuLy8gUEs6IEZvciB0aGUgY29udGFpbnMgd2UgYXNzdW1lIHRoZSBleHByZXNzaW9ucyB0byBjYWxjdWxhdGUgYXJlIGFsbCBkaXJlY3RlZFBhaXJzXG4vLyBJIGRvbid0IGtub3cgaXQgdGhpcyBpbiBRVEkgaXMgYWx3YXlzIHRoZSBjYXNlIGhvd2V2ZXI/XG5leHBvcnQgY2xhc3MgUXRpTHRlIGV4dGVuZHMgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09IHZhbHVlMi5iYXNlVHlwZSAmJiAodmFsdWUxLmJhc2VUeXBlID09PSAnaW50ZWdlcicgfHwgdmFsdWUxLmJhc2VUeXBlID09PSAnZmxvYXQnKSkge1xuICAgICAgICByZXR1cm4gK3ZhbHVlMS52YWx1ZSA8PSArdmFsdWUyLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgbHRlJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZygndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gbHRlJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbHRlJywgUXRpTHRlKTtcbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFNjb3JpbmdIZWxwZXIgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvc2NvcmluZy1oZWxwZXInO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aU1hcFJlc3BvbnNlIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxudW1iZXI+IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IG51bWJlciB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLmFzc2Vzc21lbnRJdGVtLmdldFJlc3BvbnNlKHRoaXMuaWRlbnRpZmllcik7XG4gICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgY29uc29sZS53YXJuKGBSZXNwb25zZSAke3RoaXMuaWRlbnRpZmllcn0gY2FuIG5vdCBiZSBmb3VuZGApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG1hcHBpbmcgPSByZXNwb25zZS5tYXBwaW5nO1xuICAgIGNvbnN0IGNhbmRpZGF0ZVJlc3BvbnNlcyA9ICFBcnJheS5pc0FycmF5KHJlc3BvbnNlLnZhbHVlKSA/IFtyZXNwb25zZS52YWx1ZV0gOiByZXNwb25zZS52YWx1ZTtcbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZVJlc3BvbnNlIG9mIGNhbmRpZGF0ZVJlc3BvbnNlcykge1xuICAgICAgY29uc3QgbWFwcGVkVmFsdWUgPSBtYXBwaW5nLm1hcEVudHJpZXMuZmluZChlbnRyeSA9PiB7XG4gICAgICAgIHJldHVybiBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXMoZW50cnkubWFwS2V5LCBjYW5kaWRhdGVSZXNwb25zZSwgcmVzcG9uc2UuYmFzZVR5cGUpO1xuICAgICAgfSk7XG4gICAgICBpZiAoIShtYXBwZWRWYWx1ZSA9PSBudWxsIHx8IG1hcHBlZFZhbHVlLm1hcHBlZFZhbHVlID09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmVzdWx0ICs9IG1hcHBlZFZhbHVlLm1hcHBlZFZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ICs9IG1hcHBpbmcuZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobWFwcGluZy5sb3dlckJvdW5kICE9IG51bGwpIHtcbiAgICAgIHJlc3VsdCA9IE1hdGgubWF4KG1hcHBpbmcubG93ZXJCb3VuZCwgcmVzdWx0KTtcbiAgICB9XG4gICAgaWYgKG1hcHBpbmcudXBwZXJCb3VuZCAhPSBudWxsKSB7XG4gICAgICByZXN1bHQgPSBNYXRoLm1pbihtYXBwaW5nLnVwcGVyQm91bmQsIHJlc3VsdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbWFwLXJlc3BvbnNlJywgUXRpTWFwUmVzcG9uc2UpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSBcImxpdC9kZWNvcmF0b3JzLmpzXCI7XG5pbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSBcImxpdFwiO1xuXG5leHBvcnQgY2xhc3MgUXRpTWFwcGluZyBleHRlbmRzIExpdEVsZW1lbnQge1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6IFwiZGVmYXVsdC12YWx1ZVwiLCB0eXBlOiBOdW1iZXIgfSkgZGVmYXVsdFZhbHVlOiBudW1iZXIgPSAwO1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6IFwibG93ZXItYm91bmRcIiwgdHlwZTogTnVtYmVyIH0pIGxvd2VyQm91bmQ6IG51bWJlcjtcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiBcInVwcGVyLWJvdW5kXCIsIHR5cGU6IE51bWJlciB9KSB1cHBlckJvdW5kOiBudW1iZXI7XG5cbiAgXG4gIHB1YmxpYyBnZXQgbWFwRW50cmllcygpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoXCJxdGktbWFwLWVudHJ5XCIpKS5tYXAoKGVsKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYXBLZXk6IGVsLmdldEF0dHJpYnV0ZShcIm1hcC1rZXlcIiksXG4gICAgICAgIG1hcHBlZFZhbHVlOiArZWwuZ2V0QXR0cmlidXRlKFwibWFwcGVkLXZhbHVlXCIpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoXCJxdGktbWFwcGluZ1wiLCBRdGlNYXBwaW5nKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFNjb3JpbmdIZWxwZXIgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvc2NvcmluZy1oZWxwZXInO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aU1hdGNoIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIC8vUEsgOiBGSVhNRS5cbiAgLy8gVGhpcyB3YXMgYSBsaXR0bGUgZXhwZXJpbWVudCBpZiB3ZSBjb3VsZCBjYWxsIHRoZSBtYXRjaCBmdW5jdGlvbiBhcyBhIHN0YXRpYyBmdW5jdGlvbixcbiAgLy8gVGhpcyBjYW4gYmUgdXNlZCBmb3IgYWxsIGtpbmQgb2YgdGhpbmdzLCBidXQgbm93IGVzcGVjaWFsbHkgZm9yIHVzZSBpblxuICAvLyBxdGktcmVzcG9uc2UtY29uZGl0aW9uLXNjcmlwdFxuICAvLyBpbiB3aGljaCB3ZSBwYXNzIHRoZSBleHByZXNzaW9ucyBhcyBwdXJlIGZ1bmN0aW9ucywgYW5kIGhvcGUgZm9yIHRoZSBiZXN0LlxuICAvLyBTQURMWSwgdGhlIGdldFZhcmlhYmxlcyB0aHJvd3Mgcm9ldCBpbiBkZSBldGVuLi4gd2VldCBub2cgbmlldCBwcmVjaWVzIGhvZSBkZXplIHdlcmt0LlxuICAvLyBNYWFyIGlrIGdhIGVyaW4gZHVpa2VuLlxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZVRvTWFwID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgY29ycmVjdFZhbHVlSW5mbyA9IHZhbHVlc1sxXTtcbiAgICAgIHJldHVybiBRdGlNYXRjaC5tYXRjaCh2YWx1ZVRvTWFwLCBjb3JyZWN0VmFsdWVJbmZvKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBtYXRjaCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBtYXRjaCh2YWx1ZVRvTWFwOiBSZXNwb25zZVZhcmlhYmxlLCBjb3JyZWN0VmFsdWVJbmZvOiBSZXNwb25zZVZhcmlhYmxlKSB7XG4gICAgaWYgKGNvcnJlY3RWYWx1ZUluZm8uY2FyZGluYWxpdHkgPT09ICdzaW5nbGUnKSB7XG4gICAgICBpZiAodmFsdWVUb01hcC52YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVUb01hcC52YWx1ZSkgfHwgQXJyYXkuaXNBcnJheShjb3JyZWN0VmFsdWVJbmZvLnZhbHVlKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBtYXRjaCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gU2NvcmluZ0hlbHBlci5jb21wYXJlU2luZ2xlVmFsdWVzKFxuICAgICAgICB2YWx1ZVRvTWFwLnZhbHVlPy50b1N0cmluZygpLFxuICAgICAgICBjb3JyZWN0VmFsdWVJbmZvLnZhbHVlLnRvU3RyaW5nKCksXG4gICAgICAgIGNvcnJlY3RWYWx1ZUluZm8uYmFzZVR5cGVcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZVRvTWFwLnZhbHVlKSB8fCAhQXJyYXkuaXNBcnJheShjb3JyZWN0VmFsdWVJbmZvLnZhbHVlKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBtYXRjaCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBpZiBsZW5ndGggaXMgbm90IGVxdWFsLCBkb24ndCBjaGVjaywgaXQncyBpbmNvcnJlY3QuXG4gICAgICBpZiAodmFsdWVUb01hcC52YWx1ZS5sZW5ndGggIT09IGNvcnJlY3RWYWx1ZUluZm8udmFsdWUubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGxldCBhbnN3ZXJJbmRleCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGNvcnJlY3RBbnN3ZXIgb2YgY29ycmVjdFZhbHVlSW5mby52YWx1ZSkge1xuICAgICAgICBpZiAoY29ycmVjdFZhbHVlSW5mby5jYXJkaW5hbGl0eSA9PT0gJ29yZGVyZWQnKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlVG9NYXAgPSB2YWx1ZVRvTWFwW2Fuc3dlckluZGV4XTtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXMoY29ycmVjdEFuc3dlciwgY3VycmVudFZhbHVlVG9NYXAsIGNvcnJlY3RWYWx1ZUluZm8uYmFzZVR5cGUpO1xuICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHNlcXVlbmNlIGRvZXMgbm90IG1hdHRlciwgZmluZCB2YWx1ZSBzb21ld2hlcmUgaW4gdGhlIGFycmF5XG4gICAgICAgICAgLy8gYW5kIHJlbW92ZSB3aGVuIGZvdW5kLlxuICAgICAgICAgIGxldCBtYXRjaGluZ1ZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgICAgICBmb3IgKGNvbnN0IG12IG9mIHZhbHVlVG9NYXAudmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyhjb3JyZWN0QW5zd2VyLCBtdiwgY29ycmVjdFZhbHVlSW5mby5iYXNlVHlwZSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgIG1hdGNoaW5nVmFsdWUgPSBtdjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtYXRjaGluZ1ZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAodmFsdWVUb01hcC52YWx1ZSBhcyBzdHJpbmdbXSkuc3BsaWNlKHZhbHVlVG9NYXAudmFsdWUuaW5kZXhPZihtYXRjaGluZ1ZhbHVlKSwgMSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYW5zd2VySW5kZXgrKztcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlOyAvLyBpZiBldmVyeXRoaW5nIG1hdGNoZXMgaXQncyBjb3JyZWN0O1xuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1tYXRjaCcsIFF0aU1hdGNoKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlNZW1iZXIgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4gfCBudWxsPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG5cbiAgICBpZiAoISh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikpIHtcbiAgICAgIGNvbnNvbGUud2FybignVGhlIG1lbWJlciBvcGVyYXRvciB0YWtlcyB0d28gc3ViLWV4cHJlc3Npb25zJyk7XG4gICAgfVxuXG4gICAgY29uc3QgW3ZhbHVlMSwgdmFsdWUyXSA9IHZhbHVlcztcblxuICAgIGlmICghKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlKSkge1xuICAgICAgY29uc29sZS53YXJuKCdXaGljaCBtdXN0IGJvdGggaGF2ZSB0aGUgc2FtZSBiYXNlLXR5cGUnKTtcbiAgICB9XG4gICAgaWYgKCEodmFsdWUyLmNhcmRpbmFsaXR5ID09PSAnbXVsdGlwbGUnIHx8IHZhbHVlMi5jYXJkaW5hbGl0eSA9PT0gJ29yZGVyZWQnKSkge1xuICAgICAgY29uc29sZS53YXJuKCdhbmQgdGhlIHNlY29uZCBtdXN0IGJlIGEgbXVsdGlwbGUgb3Igb3JkZXJlZCBjb250YWluZXInKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2Zsb2F0JyB8fCB2YWx1ZTIuYmFzZVR5cGUgPT09ICdmbG9hdCcpIHtcbiAgICAgIGNvbnNvbGUud2FybignVGhlIG1lbWJlciBvcGVyYXRvciBzaG91bGQgbm90IGJlIHVzZWQgb24gc3ViLWV4cHJlc3Npb25zIHdpdGggYSBiYXNlLXR5cGUgb2YgZmxvYXQnKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2R1cmF0aW9uJyB8fCB2YWx1ZTIuYmFzZVR5cGUgPT09ICdkdXJhdGlvbicpIHtcbiAgICAgIGNvbnNvbGUud2FybignSXQgbXVzdCBub3QgYmUgdXNlZCBvbiBzdWItZXhwcmVzc2lvbnMgd2l0aCBhIGJhc2UtdHlwZSBvZiBkdXJhdGlvbicpO1xuICAgIH1cblxuICAgIC8vIElmIGVpdGhlciBzdWItZXhwcmVzc2lvbiBpcyBOVUxMIHRoZW4gdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0b3IgaXMgTlVMTFxuICAgIGlmICh2YWx1ZTEudmFsdWUgPT09IG51bGwgfHwgdmFsdWUyLnZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBUaGUgcmVzdWx0IGlzIGEgc2luZ2xlIGJvb2xlYW4gd2l0aCBhIHZhbHVlIG9mICd0cnVlJyBpZiB0aGUgdmFsdWUgZ2l2ZW4gYnkgdGhlIGZpcnN0IHN1Yi1leHByZXNzaW9uIGlzIGluIHRoZSBjb250YWluZXIgZGVmaW5lZCBieSB0aGUgc2Vjb25kIHN1Yi1leHByZXNzaW9uLlxuICAgIGNvbnN0IHByb2plY3Rpb24xID0gdmFsdWUxLnZhbHVlIGFzIHN0cmluZztcbiAgICBjb25zdCBwcm9qZWN0aW9uMiA9IHZhbHVlMi52YWx1ZSBhcyBzdHJpbmdbXTtcbiAgICByZXR1cm4gcHJvamVjdGlvbjIuaW5jbHVkZXMocHJvamVjdGlvbjEpO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW1lbWJlcicsIFF0aU1lbWJlcik7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSwgVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuZXhwb3J0IGNsYXNzIFF0aU11bHRpcGxlIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdPltdPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogUmVzcG9uc2VWYXJpYWJsZVtdIHtcbiAgICBjb25zdCB2YXJpYWJsZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICBpZiAodmFyaWFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpIG11bHRpcGxlJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2YXJpYWJsZSBvZiB2YXJpYWJsZXMpIHtcbiAgICAgIGlmICh2YXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ211bHRpcGxlJyAmJiB2YXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgbXVsdGlwbGUnKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbnN0IHZhbHVlcyA9IHZhcmlhYmxlcy5tYXAodiA9PiB2LnZhbHVlKTtcbiAgICAvLyBjb25zb2xlLmxvZyh2YXJpYWJsZXMpO1xuICAgIC8vIGNvbnN0IGZsYXR0ZW5lZEFycmF5ID0gdmFsdWVzLnJlZHVjZSgoYWNjOiBzdHJpbmdbXSwgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSA9PiB7XG4gICAgLy8gICByZXR1cm4gYWNjLmNvbmNhdChBcnJheS5pc0FycmF5KHZhbHVlKSA/IFsuLi52YWx1ZV0gOiB2YWx1ZSk7XG4gICAgLy8gfSwgW10pO1xuICAgIC8vIHJldHVybiBmbGF0dGVuZWRBcnJheTtcblxuICAgIHJldHVybiB2YXJpYWJsZXM7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbXVsdGlwbGUnLCBRdGlNdWx0aXBsZSk7XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpTm90IGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAke3N1cGVyLnJlbmRlcigpfWA7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj47XG4gICAgY29uc3QgcmVzdWx0ID0gZXhwcmVzc2lvbi5jYWxjdWxhdGUoKSBhcyBib29sZWFuO1xuICAgIHJldHVybiAhcmVzdWx0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW5vdCcsIFF0aU5vdCk7XG4iLCAiaW1wb3J0IHsgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1jb25kaXRpb24tZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpT3IgZXh0ZW5kcyBRdGlDb25kaXRpb25FeHByZXNzaW9uIHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICAvLyBjaGlsZHJlbiBjYW4gYmUgYSBtaXggb2YgcXRpLWV4cHJlc3Npb24gYW5kIHF0aS1jb25kaXRpb24tZXhwcmVzc2lvblxuICAgIGNvbnN0IHZhbHVlcyA9IEFycmF5LmZyb20odGhpcy5jaGlsZHJlbikubWFwKGMgPT4ge1xuICAgICAgY29uc3QgY29uZGl0aW9uID0gYyBhcyBRdGlFeHByZXNzaW9uPGFueT47XG4gICAgICBpZiAoIWNvbmRpdGlvbi5jYWxjdWxhdGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVsZW1lbnQgZG9lc24ndCBpbXBsZW1lbnQgUXRpQ29uZGl0aW9uRXhwcmVzc2lvblwiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBsZXQgdmFsdWUgPSBjb25kaXRpb24uY2FsY3VsYXRlKCkgYXMgQm9vbGVhbjtcbiAgICAgIC8vIGNvbnZlcnQgc3RyaW5nIHZhbHVlIHRvIGJvb2xlYW4gYW5kIHJldHVybiBudWxsIGlmIG5vdCBwb3NzaWJsZVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgICAgICB2YWx1ZSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09ICdmYWxzZScpIHtcbiAgICAgICAgICB2YWx1ZSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgdmFsdWUgaW4gcXRpLW9yLCBleHBlY3RlZCBib29sZWFuJyk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gdmFsdWVzLnNvbWUoZSA9PiB7XG4gICAgICByZXR1cm4gdHlwZW9mIGUgPT09ICdib29sZWFuJyAmJiBlO1xuICAgIH0pO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW9yJywgUXRpT3IpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcbmV4cG9ydCBjbGFzcyBRdGlPcmRlcmVkIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxSZXNwb25zZVZhcmlhYmxlW10+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBSZXNwb25zZVZhcmlhYmxlW10ge1xuICAgIGNvbnN0IHZhcmlhYmxlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgIGlmICh2YXJpYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGkgbXVsdGlwbGUnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHZhcmlhYmxlIG9mIHZhcmlhYmxlcykge1xuICAgICAgaWYgKHZhcmlhYmxlLmNhcmRpbmFsaXR5ICE9PSAnb3JkZXJlZCcgJiYgdmFyaWFibGUuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIG9yZGVyZWQnKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFyaWFibGVzO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW9yZGVyZWQnLCBRdGlPcmRlcmVkKTtcbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgSXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0IH0gZnJvbSAnc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0uY29udGV4dCc7XG5pbXBvcnQgeyBRdGlBc3Nlc3NtZW50SXRlbSB9IGZyb20gJy4uLy4uLy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbSc7XG5cbmV4cG9ydCBjbGFzcyBRdFByaW50ZWRWYXJpYWJsZSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwdWJsaWMgaXRlbUNvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLml0ZW1Db250ZXh0Py52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdGhpcy5pZGVudGlmaWVyKT8udmFsdWU7XG4gICAgcmV0dXJuIGh0bWxgJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgMil9YDtcbiAgfVxuXG4gIC8vIGNvbnN0cnVjdG9yKCkge1xuICAvLyAgIHN1cGVyKCk7XG4gIC8vICAgY29uc3QgYXNzZXNzbWVudEl0ZW0gPSB0aGlzLmNsb3Nlc3QoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKSBhcyBRdGlBc3Nlc3NtZW50SXRlbTtcbiAgLy8gICBhc3Nlc3NtZW50SXRlbS5hZGRFdmVudExpc3RlbmVyKCdxdGktcmVzcG9uc2UtcHJvY2Vzc2VkJywgKCkgPT4ge1xuICAvLyAgICAgdGhpcy52YWx1ZSA9IHRoaXMuY2FsY3VsYXRlKCkgYXMgc3RyaW5nO1xuICAvLyAgIH0pO1xuICAvLyB9XG5cbiAgLy8gcHVibGljIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAvLyAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gIC8vICAgdGhpcy52YWx1ZSA9IHRoaXMuY2FsY3VsYXRlKCkgYXMgc3RyaW5nO1xuICAvLyB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpOiBSZWFkb25seTxzdHJpbmcgfCBzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGFzc2Vzc21lbnRJdGVtID0gdGhpcy5jbG9zZXN0KCdxdGktYXNzZXNzbWVudC1pdGVtJykgYXMgUXRpQXNzZXNzbWVudEl0ZW07XG4gICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuaWRlbnRpZmllcjtcbiAgICBjb25zdCByZXN1bHQgPSBhc3Nlc3NtZW50SXRlbS5nZXRWYXJpYWJsZShpZGVudGlmaWVyKS52YWx1ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXByaW50ZWQtdmFyaWFibGUnLCBRdFByaW50ZWRWYXJpYWJsZSk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpUHJvZHVjdCBleHRlbmRzIFF0aUV4cHJlc3Npb248bnVtYmVyPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgY29uc3QgcHJvZHVjdCA9IHZhbHVlcy5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBjdXJyZW50VmFsdWUpID0+IHtcbiAgICAgIGlmIChjdXJyZW50VmFsdWUuYmFzZVR5cGUgPT0gJ2Zsb2F0JyB8fCBjdXJyZW50VmFsdWUuYmFzZVR5cGUgPT0gJ2ludGVnZXInKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yICogcGFyc2VJbnQoY3VycmVudFZhbHVlLnZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgY2FuIG5vdCBjb252ZXJ0IHRvIG51bWJlcmApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYGhhcyBhbm90aGVyIGJhc2VUeXBlICR7Y3VycmVudFZhbHVlLmJhc2VUeXBlfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH0sIDEpO1xuICAgIHJldHVybiBwcm9kdWN0O1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXByb2R1Y3QnLCBRdGlQcm9kdWN0KTtcbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgU2NvcmluZ0hlbHBlciB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9zY29yaW5nLWhlbHBlcic7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpU3RyaW5nTWF0Y2ggZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjYXNlLXNlbnNpdGl2ZScgfSkgY2FzZVNlbnNpdGl2ZSA9ICd0cnVlJztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlMS5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgdmFsdWUyLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJyB8fFxuICAgICAgICBBcnJheS5pc0FycmF5KHZhbHVlMS52YWx1ZSkgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTIudmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBjYXJkaW5hbGl0eSBpbiBxdGkgc3RyaW5nLW1hdGNoJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHYxID0gdGhpcy5jYXNlU2Vuc2l0aXZlID09PSAndHJ1ZScgPyB2YWx1ZTEudmFsdWUgOiAodmFsdWUxLnZhbHVlIGFzIHN0cmluZykudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IHYyID0gdGhpcy5jYXNlU2Vuc2l0aXZlID09PSAndHJ1ZScgPyB2YWx1ZTIudmFsdWUgOiAodmFsdWUyLnZhbHVlIGFzIHN0cmluZykudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXModjEgYXMgc3RyaW5nLCB2MiBhcyBzdHJpbmcsIHZhbHVlMS5iYXNlVHlwZSk7XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aS1zdHJpbmctbWF0Y2gnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1zdHJpbmctbWF0Y2gnLCBRdGlTdHJpbmdNYXRjaCk7XG4iLCAiaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiwgUXRpRXhwcmVzc2lvbkJhc2UgfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlTdW0gZXh0ZW5kcyBRdGlFeHByZXNzaW9uPG51bWJlcj4ge1xuICBwcml2YXRlIF9leHByZXNzaW9uOiBRdGlTdW1FeHByZXNzaW9uO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2V4cHJlc3Npb24gPSBuZXcgUXRpU3VtRXhwcmVzc2lvbihBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4gYXMgdW5rbm93biBhcyBRdGlFeHByZXNzaW9uQmFzZTxudW1iZXI+W10pKTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgLy8gY2hpbGRyZW4gY2FuIGJlIGEgbWl4IG9mIHF0aS1leHByZXNzaW9uIGFuZCBxdGktY29uZGl0aW9uLWV4cHJlc3Npb25cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2V4cHJlc3Npb24uY2FsY3VsYXRlKCk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdGlTdW1FeHByZXNzaW9uIGltcGxlbWVudHMgUXRpRXhwcmVzc2lvbkJhc2U8bnVtYmVyPiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZXhwcmVzc2lvbnM6IFF0aUV4cHJlc3Npb25CYXNlPG51bWJlcj5bXSkge31cblxuICBwdWJsaWMgY2FsY3VsYXRlKCkge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZXhwcmVzc2lvbnMubWFwKGMgPT4ge1xuICAgICAgaWYgKCFjLmNhbGN1bGF0ZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRWxlbWVudCBkb2Vzbid0IGltcGxlbWVudCBRdGlDb25kaXRpb25FeHByZXNzaW9uXCIpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbHVlID0gYy5jYWxjdWxhdGUoKTtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4odmFsdWUpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgdmFsdWUgaW4gcXRpLXN1bSwgZXhwZWN0ZWQgbnVtYmVyJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gTnVtYmVyKHZhbHVlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdmFsdWVzLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLXN1bScsIFF0aVN1bSk7XG4iLCAiaW1wb3J0IHsgUXRpQXNzZXNzbWVudEl0ZW0gfSBmcm9tICcuLi8uLi8uLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0nO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aVZhcmlhYmxlIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxzdHJpbmcgfCBzdHJpbmdbXT4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuICAgIGNvbnN0IHJlc3VsdCA9ICh0aGlzLmNsb3Nlc3QoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKSBhcyBRdGlBc3Nlc3NtZW50SXRlbSkuZ2V0VmFyaWFibGUoaWRlbnRpZmllcikudmFsdWU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS12YXJpYWJsZScsIFF0aVZhcmlhYmxlKTtcbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHsgSU1TcGNpLCBNb2R1bGVSZXNvbHV0aW9uQ29uZmlnLCBRdGlWYXJpYWJsZUpTT04gfSBmcm9tICcuL2ludGVyZmFjZSc7XG5cbmRlY2xhcmUgY29uc3QgcmVxdWlyZWpzOiBhbnk7XG5kZWNsYXJlIGNvbnN0IGRlZmluZTogYW55O1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpUG9ydGFibGVDdXN0b21JbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgcHJpdmF0ZSBpbnRlcnZhbElkOiBhbnk7XG4gIHByaXZhdGUgcmF3UmVzcG9uc2U6IHN0cmluZztcblxuICBwcml2YXRlIHBjaTogSU1TcGNpPHVua25vd24+O1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAncmVzcG9uc2UtaWRlbnRpZmllcicgfSlcbiAgcmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdtb2R1bGUnIH0pXG4gIG1vZHVsZTogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnY3VzdG9tLWludGVyYWN0aW9uLXR5cGUtaWRlbnRpZmllcicgfSlcbiAgY3VzdG9tSW50ZXJhY3Rpb25UeXBlSWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX2Vycm9yTWVzc2FnZTogc3RyaW5nID0gbnVsbDtcblxuICBwcml2YXRlIGNvbnZlcnRRdGlWYXJpYWJsZUpTT04oaW5wdXQ6IFF0aVZhcmlhYmxlSlNPTik6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICBmb3IgKGNvbnN0IHRvcExldmVsS2V5IGluIGlucHV0KSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICBpZiAoaW5wdXQuaGFzT3duUHJvcGVydHkodG9wTGV2ZWxLZXkpKSB7XG4gICAgICAgIGNvbnN0IG5lc3RlZE9iamVjdCA9IGlucHV0W3RvcExldmVsS2V5IGFzICdsaXN0JyB8ICdiYXNlJ107XG4gICAgICAgIGlmIChuZXN0ZWRPYmplY3QpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG5lc3RlZEtleSBpbiBuZXN0ZWRPYmplY3QpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgICAgIGlmIChuZXN0ZWRPYmplY3QuaGFzT3duUHJvcGVydHkobmVzdGVkS2V5KSkge1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG5lc3RlZE9iamVjdFtuZXN0ZWRLZXkgYXMga2V5b2YgdHlwZW9mIG5lc3RlZE9iamVjdF07XG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5tYXAoU3RyaW5nKTsgLy8gQ29udmVydCBlYWNoIGVsZW1lbnQgaW4gdGhlIGFycmF5IHRvIHN0cmluZ1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTsgLy8gQ29udmVydCB0aGUgc2luZ2xlIHZhbHVlIHRvIHN0cmluZ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydENoZWNraW5nKCk6IHZvaWQge1xuICAgIC8vIGJlY2F1c2UgdGhlIHBjaSBkb2Vzbid0IGhhdmUgYSBtZXRob2QgdG8gY2hlY2sgZm9yIGNoYW5nZXMgd2UnbGwgdXNlIGFuIGludGVydmFsXG4gICAgLy8gdG8gY2hlY2sgaWYgdGhlIHJlc3BvbnNlIGhhcyBjaGFuZ2VkLiBJZiBjaGFuZ2VkIHdlJ2xsIHNhdmUgdGhlIHJlc3BvbnNlXG4gICAgdGhpcy5pbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLnBjaS5nZXRSZXNwb25zZSgpO1xuICAgICAgY29uc3QgbmV3UmVzcG9uc2UgPSB0aGlzLnBjaS5nZXRSZXNwb25zZSgpO1xuICAgICAgY29uc3Qgc3RyaW5naWZpZWQgPSBKU09OLnN0cmluZ2lmeShyZXNwb25zZSk7XG4gICAgICBpZiAoc3RyaW5naWZpZWQgIT09IHRoaXMucmF3UmVzcG9uc2UpIHtcbiAgICAgICAgdGhpcy5yYXdSZXNwb25zZSA9IHN0cmluZ2lmaWVkO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuY29udmVydFF0aVZhcmlhYmxlSlNPTihuZXdSZXNwb25zZSk7XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodmFsdWUpO1xuICAgICAgfVxuICAgIH0sIDIwMCk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BDaGVja2luZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbnRlcnZhbElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbElkKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTsgLy8gRk9SIE5PV1xuICB9XG4gIHNldCByZXNwb25zZSh2YWw6IFJlYWRvbmx5PHN0cmluZyB8IHN0cmluZ1tdPikge1xuICAgIC8vIE9ubHkgc2V0IHN0YXRlIGlzIHN1cHBvcnRlZCBpbiBhIFBDSVxuICB9XG5cbiAgZ2V0VEFPQ29uZmlnKG5vZGUpIHtcbiAgICBjb25zdCBhID0gbm9kZS5xdWVyeVNlbGVjdG9yQWxsKCdwcm9wZXJ0aWVzJyk7XG4gICAgbGV0IGNvbmZpZyA9IHt9O1xuXG4gICAgY29uc3QgZ2V0UHJvcGVydHlWYWx1ZSA9IGVsID0+IHtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0ge307XG4gICAgICBjb25zdCBrZXkgPSBlbC5nZXRBdHRyaWJ1dGUoJ2tleScpO1xuICAgICAgaWYgKGtleSkge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oZWwuY2hpbGRyZW4pO1xuICAgICAgICBjb25zdCBhbGxLZXkgPSBjaGlsZHJlbi5tYXAoKGM6IEhUTUxFbGVtZW50KSA9PiBjLmdldEF0dHJpYnV0ZSgna2V5JykpO1xuICAgICAgICBjb25zdCBpc0FycmF5ID0gYWxsS2V5Lmxlbmd0aCA+IDAgJiYgIWFsbEtleS5maW5kKGsgPT4gIU51bWJlci5pc0ludGVnZXIoK2spKTtcbiAgICAgICAgaWYgKGlzQXJyYXkpIHtcbiAgICAgICAgICBwcm9wZXJ0eVtrZXldID0gY2hpbGRyZW4ubWFwKGMgPT4gZ2V0Q2hpbGRQcm9wZXJ0aWVzKGMpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9wZXJ0eVtrZXldID0gZWwudGV4dENvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9wZXJ0eTtcbiAgICB9O1xuXG4gICAgY29uc3QgZ2V0Q2hpbGRQcm9wZXJ0aWVzID0gKGVsKToge30gfCB2b2lkID0+IHtcbiAgICAgIGlmIChlbCkge1xuICAgICAgICBsZXQgcHJvcGVydGllcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsLmNoaWxkcmVuKSB7XG4gICAgICAgICAgcHJvcGVydGllcyA9IHsgLi4ucHJvcGVydGllcywgLi4uZ2V0UHJvcGVydHlWYWx1ZShjaGlsZCkgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcGVydGllcztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0aWVzIG9mIGEpIHtcbiAgICAgIGNvbnN0IGtleSA9IHByb3BlcnRpZXMuZ2V0QXR0cmlidXRlKCdrZXknKTtcbiAgICAgIGlmICgha2V5KSB7XG4gICAgICAgIGNvbmZpZyA9IHsgLi4uY29uZmlnLCAuLi5nZXRDaGlsZFByb3BlcnRpZXMocHJvcGVydGllcykgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCdDYW4gbm90IGZpbmQgcXRpLWN1c3RvbS1pbnRlcmFjdGlvbiBjb25maWcnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJlZ2lzdGVyKHBjaTogSU1TcGNpPHVua25vd24+KSB7XG4gICAgdGhpcy5wY2kgPSBwY2k7XG5cbiAgICBjb25zdCB0eXBlID0gdGhpcy5wYXJlbnRFbGVtZW50LnRhZ05hbWUgPT09ICdRVEktQ1VTVE9NLUlOVEVSQUNUSU9OJyA/ICdUQU8nIDogJ0lNUyc7XG4gICAgY29uc3QgZG9tOiBIVE1MRWxlbWVudCA9XG4gICAgICB0eXBlID09ICdJTVMnID8gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktaW50ZXJhY3Rpb24tbWFya3VwJykgOiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ21hcmt1cCcpO1xuICAgIGRvbS5jbGFzc0xpc3QuYWRkKCdxdGktY3VzdG9tSW50ZXJhY3Rpb24nKTtcblxuICAgIGlmICh0eXBlID09ICdUQU8nICYmIHRoaXMucXVlcnlTZWxlY3RvcigncHJvcGVydGllcycpKSB7XG4gICAgICAodGhpcy5xdWVyeVNlbGVjdG9yKCdwcm9wZXJ0aWVzJykgYXMgSFRNTEVsZW1lbnQpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnOiBhbnkgPVxuICAgICAgdHlwZSA9PSAnSU1TJ1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHRoaXMuZGF0YXNldCxcbiAgICAgICAgICAgIG9ucmVhZHk6ICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ29ucmVhZHknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDogdGhpcy5nZXRUQU9Db25maWcodGhpcyk7XG5cbiAgICB0eXBlID09ICdJTVMnXG4gICAgICA/IHBjaS5nZXRJbnN0YW5jZShkb20sIGNvbmZpZywgdW5kZWZpbmVkKVxuICAgICAgOiAocGNpIGFzIGFueSkuaW5pdGlhbGl6ZSh0aGlzLmN1c3RvbUludGVyYWN0aW9uVHlwZUlkZW50aWZpZXIsIGRvbS5maXJzdEVsZW1lbnRDaGlsZCwgY29uZmlnKTtcblxuICAgIGlmICh0eXBlID09ICdUQU8nKSB7XG4gICAgICBjb25zdCBsaW5rcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdsaW5rJykpLm1hcChhY2MgPT4gYWNjLmdldEF0dHJpYnV0ZSgnaHJlZicpKTtcbiAgICAgIGxpbmtzLmZvckVhY2gobGluayA9PiB7XG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgICAgc3R5bGVzLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICAgICAgc3R5bGVzLnR5cGUgPSAndGV4dC9jc3MnO1xuICAgICAgICBzdHlsZXMubWVkaWEgPSAnc2NyZWVuJztcbiAgICAgICAgc3R5bGVzLmhyZWYgPSBsaW5rO1xuICAgICAgICBkb20uYXBwZW5kQ2hpbGQoc3R5bGVzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnN0YXJ0Q2hlY2tpbmcoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgY29uc3QgcmVxdWlyZUNvbmZpZzogTW9kdWxlUmVzb2x1dGlvbkNvbmZpZyA9IHtcbiAgICAgIGNvbnRleHQ6IHRoaXMuY3VzdG9tSW50ZXJhY3Rpb25UeXBlSWRlbnRpZmllcixcbiAgICAgIGNhdGNoRXJyb3I6IHRydWUsXG4gICAgICBwYXRoczoge31cbiAgICB9O1xuXG4gICAgLy8gcGs6IGMnZXN0IHRyZXMgdWdseS4uIHR5cGVzY3JpcHQgd2h5dW5vc3ByZWFkIGFkZCBwcm9wcz8hP1xuICAgIGlmICh3aW5kb3dbJ3JlcXVpcmVQYXRocyddICYmIHdpbmRvd1sncmVxdWlyZVNoaW0nXSkge1xuICAgICAgcmVxdWlyZUNvbmZpZ1sncGF0aHMnXSA9IHdpbmRvd1sncmVxdWlyZVBhdGhzJ107XG4gICAgICByZXF1aXJlQ29uZmlnWydzaGltJ10gPSB3aW5kb3dbJ3JlcXVpcmVTaGltJ107XG4gICAgfVxuICAgIGlmICghZ2xvYmFsVGhpcy5yZXF1aXJlKSB7XG4gICAgICB0aGlzLl9lcnJvck1lc3NhZ2UgPSBgcmVxdWlyZWpzIG5vdCBmb3VuZCwgbG9hZCB3aXRoIGNkbjogaHR0cHM6Ly9jZG5qcy5jb20vbGlicmFyaWVzL3JlcXVpcmUuanNgO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBJbml0aWFsIGNoZWNrIGluIGNhc2UgdGhlIGNoaWxkcmVuIGFyZSBhbHJlYWR5IHByZXNlbnRcbiAgICB0aGlzLnJlZ2lzdGVyTW9kdWxlcyhyZXF1aXJlQ29uZmlnKS50aGVuKCgpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVpcmVQQ0kgPSByZXF1aXJlanMuY29uZmlnKHJlcXVpcmVDb25maWcpO1xuXG4gICAgICByZXF1aXJlUENJKFxuICAgICAgICBbJ3JlcXVpcmUnXSxcbiAgICAgICAgcmVxdWlyZSA9PiB7XG4gICAgICAgICAgIXJlcXVpcmUuZGVmaW5lZCgncXRpQ3VzdG9tSW50ZXJhY3Rpb25Db250ZXh0JykgJiZcbiAgICAgICAgICAgIGRlZmluZSgncXRpQ3VzdG9tSW50ZXJhY3Rpb25Db250ZXh0JywgKCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHJlZ2lzdGVyOiBjdHhBID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXIoY3R4QSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBub3RpZnlSZWFkeTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgLyogb25seSB1c2VkIGluIHRoZSBUQU8gdmVyc2lvbiAqL1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIFBLOiB0aGlzIGlzIGEgaGFjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgaW50ZXJhY3Rpb24gaXMgb25seSByZWdpc3RlcmVkIG9uY2VcbiAgICAgICAgICAvLyBJZiBpdCB3YXMgcHJldmlzb3VseSBsb2FkZWQsIHRoZSByZWdpc3RlciB3aWxsIG5vZyBraWNrIGluLCBiZWNhdXNlIHRoZSBjbGFzcyBpcyBhbHJlYWR5IGRlZmluZWRcbiAgICAgICAgICAvLyBhbmQgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBQQ0ksIHRoZSByZWdpc3RlciBpcyBjYWxsZWQuXG4gICAgICAgICAgLy8gU28gbm93IGl0IGlzIGFscmVhZGx5IGRlZmluZWQsIHdlIGp1c3QgcmVnaXN0ZXIgaXQgb3Vyc2VsdmVzLlxuXG4gICAgICAgICAgY29uc3Qgd2FzUHJldmlvdXNseUxvYWRlZCA9IHJlcXVpcmUuZGVmaW5lZCh0aGlzLm1vZHVsZSk7XG5cbiAgICAgICAgICByZXF1aXJlKFt0aGlzLm1vZHVsZV0sIGN0eEEgPT4ge1xuICAgICAgICAgICAgLy8gcmVnaXN0ZXIgaXQgYmVjYXVzZSBpdCB3YXMgcHJldmlvdXNseSBsb2FkZWRcbiAgICAgICAgICAgIHdhc1ByZXZpb3VzbHlMb2FkZWQgJiYgdGhpcy5yZWdpc3RlcihjdHhBKTtcbiAgICAgICAgICB9LCBlcnIgPT4ge1xuICAgICAgICAgICAgdGhpcy5fZXJyb3JNZXNzYWdlID0gZXJyO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBlcnIgPT4ge1xuICAgICAgICAgIHRoaXMuX2Vycm9yTWVzc2FnZSA9IGVycjtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5zdG9wQ2hlY2tpbmcoKTtcbiAgfVxuXG4gIGFzeW5jIHJlZ2lzdGVyTW9kdWxlcyhjb25maWc6IE1vZHVsZVJlc29sdXRpb25Db25maWcpIHtcbiAgICAvLyBnZXQgdGhlIHZhbHVlIG9mIGF0dHJpYnV0ZTogZGF0YS1iYXNlLXVybFxuICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmdldEF0dHJpYnV0ZSgnZGF0YS1iYXNlLXVybCcpO1xuICAgIGlmIChiYXNlVXJsKSB7XG4gICAgICBjb25zdCBtb2R1bGVSZXNvbHV0aW9uUGF0aCA9IGAke2Jhc2VVcmx9L21vZHVsZXMvbW9kdWxlX3Jlc29sdXRpb24uanNgO1xuICAgICAgY29uc3QgbW9kdWxlUmVzb2x1dGlvbkZhbGxiYWNrUGF0aCA9IGAke2Jhc2VVcmx9L21vZHVsZXMvbW9kdWxlX3Jlc29sdXRpb25fZmFsbGJhY2suanNgO1xuICAgICAgaWYgKG1vZHVsZVJlc29sdXRpb25QYXRoKSB7XG4gICAgICAgIGNvbnN0IHByaW1hcnlDb25maWcgPSBhd2FpdCB0aGlzLmxvYWRDb25maWcobW9kdWxlUmVzb2x1dGlvblBhdGgsIGJhc2VVcmwpO1xuICAgICAgICBhd2FpdCB0aGlzLm1lcmdlQ29uZmlncyhjb25maWcsIHByaW1hcnlDb25maWcsIG1vZHVsZVJlc29sdXRpb25GYWxsYmFja1BhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBHZXQgdGhlIHF0aS1pbnRlcmFjdGlvbi1tb2R1bGVzIGVsZW1lbnRcbiAgICBjb25zdCBpbnRlcmFjdGlvbk1vZHVsZXMgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3F0aS1pbnRlcmFjdGlvbi1tb2R1bGVzJyk7XG4gICAgaWYgKGludGVyYWN0aW9uTW9kdWxlcykge1xuICAgICAgLy8gR2V0IGFsbCBxdGktaW50ZXJhY3Rpb24tbW9kdWxlIGVsZW1lbnRzXG4gICAgICBjb25zdCBtb2R1bGVzID0gaW50ZXJhY3Rpb25Nb2R1bGVzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1pbnRlcmFjdGlvbi1tb2R1bGUnKTtcbiAgICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIG1vZHVsZSBhbmQgcmVnaXN0ZXIgaXQgd2l0aCBSZXF1aXJlSlNcbiAgICAgIGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcbiAgICAgICAgY29uc3QgbW9kdWxlSWQgPSBtb2R1bGUuZ2V0QXR0cmlidXRlKCdpZCcpO1xuICAgICAgICBjb25zdCBwcmltYXJ5UGF0aCA9IG1vZHVsZS5nZXRBdHRyaWJ1dGUoJ3ByaW1hcnktcGF0aCcpO1xuICAgICAgICBjb25zdCBmYWxsYmFja1BhdGggPSBtb2R1bGUuZ2V0QXR0cmlidXRlKCdmYWxsYmFjay1wYXRoJyk7XG4gICAgICAgIGNvbnN0IHByaW1hcnlDb25maWc6IE1vZHVsZVJlc29sdXRpb25Db25maWcgPSBwcmltYXJ5UGF0aFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBwYXRoczogeyAuLi5jb25maWdbJ3BhdGhzJ10sIC4uLnsgW21vZHVsZUlkXTogdGhpcy5nZXRSZXNvbHZhYmxlUGF0aChwcmltYXJ5UGF0aCwgYmFzZVVybCkgfSB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiBudWxsO1xuICAgICAgICBjb25zdCBmYWxsYmFja0NvbmZpZzogTW9kdWxlUmVzb2x1dGlvbkNvbmZpZyA9IGZhbGxiYWNrUGF0aFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBwYXRoczogeyAuLi5jb25maWdbJ3BhdGhzJ10sIC4uLnsgW21vZHVsZUlkXTogdGhpcy5nZXRSZXNvbHZhYmxlUGF0aChmYWxsYmFja1BhdGgsIGJhc2VVcmwpIH0gfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgaWYgKG1vZHVsZUlkICYmIHByaW1hcnlDb25maWcpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLm1lcmdlQ29uZmlncyhjb25maWcsIHByaW1hcnlDb25maWcsIGZhbGxiYWNrQ29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRG91YmxlU2xhc2hlcyhzdHI6IHN0cmluZykge1xuICAgIGNvbnN0IHNpbmdsZUZvcndhcmRTbGFzaGVzID0gc3RyXG4gICAgICAucmVwbGFjZSgvKFteOl1cXC8pXFwvKy9nLCAnJDEnKVxuICAgICAgLnJlcGxhY2UoL1xcL1xcLy9nLCAnLycpXG4gICAgICAucmVwbGFjZSgnaHR0cDovJywgJ2h0dHA6Ly8nKVxuICAgICAgLnJlcGxhY2UoJ2h0dHBzOi8nLCAnaHR0cHM6Ly8nKTtcbiAgICByZXR1cm4gc2luZ2xlRm9yd2FyZFNsYXNoZXM7XG4gIH1cblxuICBsb2FkQ29uZmlnID0gYXN5bmMgKHVybDogc3RyaW5nLCBiYXNlVXJsPzogc3RyaW5nKTogUHJvbWlzZTxNb2R1bGVSZXNvbHV0aW9uQ29uZmlnPiA9PiB7XG4gICAgdXJsID0gdGhpcy5yZW1vdmVEb3VibGVTbGFzaGVzKHVybCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcXVpcmVDb25maWcgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgICAgaWYgKHJlcXVpcmVDb25maWcub2spIHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gYXdhaXQgcmVxdWlyZUNvbmZpZy5qc29uKCk7XG4gICAgICAgIGNvbnN0IG1vZHVsZUNvbmcgPSBjb25maWcgYXMgTW9kdWxlUmVzb2x1dGlvbkNvbmZpZztcbiAgICAgICAgZm9yIChjb25zdCBtb2R1bGVJZCBpbiBtb2R1bGVDb25nLnBhdGhzKSB7XG4gICAgICAgICAgaWYgKGJhc2VVcmwpIHtcbiAgICAgICAgICAgIG1vZHVsZUNvbmcucGF0aHNbbW9kdWxlSWRdID0gdGhpcy5nZXRSZXNvbHZhYmxlUGF0aChtb2R1bGVDb25nLnBhdGhzW21vZHVsZUlkXSwgYmFzZVVybCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtb2R1bGVDb25nO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgZ2V0UmVzb2x2YWJsZVBhdGggPSAocGF0aDogc3RyaW5nLCBiYXNlUGF0aD86IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBwYXRoPy50b0xvY2FsZUxvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ2h0dHAnKSB8fCAhYmFzZVBhdGhcbiAgICAgID8gcGF0aFxuICAgICAgOiB0aGlzLnJlbW92ZURvdWJsZVNsYXNoZXMoYCR7YmFzZVBhdGh9LyR7cGF0aH1gKTtcbiAgfTtcblxuICBtZXJnZUNvbmZpZ3MgPSBhc3luYyAoXG4gICAgY29uZmlnOiBNb2R1bGVSZXNvbHV0aW9uQ29uZmlnLFxuICAgIHByaW1hcnlDb25maWc6IE1vZHVsZVJlc29sdXRpb25Db25maWcsXG4gICAgZmFsbGJhY2s6IHN0cmluZyB8IE1vZHVsZVJlc29sdXRpb25Db25maWdcbiAgKSA9PiB7XG4gICAgZm9yIChjb25zdCBtb2R1bGVJZCBpbiBwcmltYXJ5Q29uZmlnPy5wYXRocykge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGtleSBpcyBhbHJlYWR5IGluIHRoZSBjb25maWdcbiAgICAgIGlmICghY29uZmlnLnBhdGhzW21vZHVsZUlkXSkge1xuICAgICAgICAvLyBjaGVjayBpZiBmaWxlIGV4aXN0c1xuICAgICAgICBsZXQgZmFpbGVkVG9SZXNvbHZlID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcGF0aFdpdGhFeHRlbnNpb24gPSBwcmltYXJ5Q29uZmlnLnBhdGhzW21vZHVsZUlkXT8udG9Mb2NhbGVMb3dlckNhc2UoKS5lbmRzV2l0aCgnLmpzJylcbiAgICAgICAgICAgID8gcHJpbWFyeUNvbmZpZy5wYXRoc1ttb2R1bGVJZF1cbiAgICAgICAgICAgIDogcHJpbWFyeUNvbmZpZy5wYXRoc1ttb2R1bGVJZF0gKyAnLmpzJztcbiAgICAgICAgICBjb25zdCBtID0gYXdhaXQgZmV0Y2gocGF0aFdpdGhFeHRlbnNpb24pO1xuICAgICAgICAgIGlmIChtLm9rKSB7XG4gICAgICAgICAgICBjb25maWcucGF0aHNbbW9kdWxlSWRdID0gcHJpbWFyeUNvbmZpZy5wYXRoc1ttb2R1bGVJZF0ucmVwbGFjZSgvXFwuanMkLywgJycpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmYWlsZWRUb1Jlc29sdmUgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgZmFpbGVkVG9SZXNvbHZlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmFpbGVkVG9SZXNvbHZlICYmIGZhbGxiYWNrKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBmYWxsYmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZhbGxiYWNrQ29uZmlnID0gYXdhaXQgdGhpcy5sb2FkQ29uZmlnKGZhbGxiYWNrKTtcbiAgICAgICAgICAgICAgaWYgKGZhbGxiYWNrQ29uZmlnPy5wYXRoc1ttb2R1bGVJZF0pIHtcbiAgICAgICAgICAgICAgICBjb25maWcucGF0aHNbbW9kdWxlSWRdID0gZmFsbGJhY2tDb25maWcucGF0aHNbbW9kdWxlSWRdLnJlcGxhY2UoL1xcLmpzJC8sICcnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGZhbGxiYWNrID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaWYgKGZhbGxiYWNrPy5wYXRoc1ttb2R1bGVJZF0pIHtcbiAgICAgICAgICAgICAgY29uZmlnLnBhdGhzW21vZHVsZUlkXSA9IGZhbGxiYWNrLnBhdGhzW21vZHVsZUlkXS5yZXBsYWNlKC9cXC5qcyQvLCAnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGZhaWxlZFRvUmVzb2x2ZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byByZXNvbHZlIG1vZHVsZTogJyArIG1vZHVsZUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PiR7dGhpcy5fZXJyb3JNZXNzYWdlICYmXG4gICAgICBodG1sYDxkaXYgc3R5bGU9XCJjb2xvcjpyZWRcIj5cbiAgICAgICAgPGgxPkVycm9yPC9oMT5cbiAgICAgICAgJHt0aGlzLl9lcnJvck1lc3NhZ2V9XG4gICAgICA8L2Rpdj5gfWA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbic6IFF0aVBvcnRhYmxlQ3VzdG9tSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuXG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2RyYWctZHJvcCc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktYXNzb2NpYXRlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlBc3NvY2lhdGVJbnRlcmFjdGlvbiBleHRlbmRzIERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbihcbiAgTGl0RWxlbWVudCxcbiAgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnLFxuICB0cnVlLFxuICAnLmRsJ1xuKSB7XG4gIEBzdGF0ZSgpIHByaXZhdGUgX2NoaWxkcmVuTWFwOiBFbGVtZW50W107XG5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IGNzc2BcbiAgICA6aG9zdCB7XG4gICAgICBkaXNwbGF5OiBibG9jazsgLyogbmVjZXNzYXJ5IHRvIGNhbGN1bGF0ZSBzY2FsaW5nIHBvc2l0aW9uICovXG4gICAgfVxuICAgIHNsb3RbbmFtZT0ncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSddIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgICBnYXA6IDAuNXJlbTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPHNsb3QgbmFtZT1cInF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2VcIj48L3Nsb3Q+XG4gICAgICAke3RoaXMuX2NoaWxkcmVuTWFwLmxlbmd0aCA+IDAgJiZcbiAgICAgIEFycmF5LmZyb20oQXJyYXkoTWF0aC5jZWlsKHRoaXMuX2NoaWxkcmVuTWFwLmxlbmd0aCAvIDIpKS5rZXlzKCkpLm1hcChcbiAgICAgICAgKF8sIGluZGV4KSA9PlxuICAgICAgICAgIGh0bWxgPGRpdiBwYXJ0PVwiYXNzb2NpYWJsZXMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8ZGl2IG5hbWU9XCJsZWZ0JHtpbmRleH1cIiBwYXJ0PVwiZHJvcC1saXN0XCIgY2xhc3M9XCJkbFwiIGlkZW50aWZpZXI9XCJkcm9wbGlzdCR7aW5kZXh9X2xlZnRcIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgbmFtZT1cInJpZ2h0JHtpbmRleH1cIiBwYXJ0PVwiZHJvcC1saXN0XCIgY2xhc3M9XCJkbFwiIGlkZW50aWZpZXI9XCJkcm9wbGlzdCR7aW5kZXh9X3JpZ2h0XCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+YFxuICAgICAgKX1gO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLl9jaGlsZHJlbk1hcCA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJykpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24nOiBRdGlBc3NvY2lhdGVJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImV4cG9ydCBjbGFzcyBUb3VjaERyYWdBbmREcm9wIHtcbiAgcHJpdmF0ZSBfdG91Y2hCZWdpbiA9IDA7IC8vIHRpbWVzdGFtcCBvZiBmaXJzdCB0b3VjaFxuICBwcml2YXRlIF90b3VjaERvd24gPSBudWxsOyAvLyBwb2ludCBvZiBmaXJzdCB0b3VjaFxuICBwcml2YXRlIF9sYXN0Q2xpY2sgPSAwOyAvLyB0aW1lc3RhbXAgb2YgcHJldmlvdXMgY2xpY2sgKHRvdWNoc3RhcnQgKyB0b3VjaGVuZClcbiAgcHJpdmF0ZSBfY2FuRHJhZyA9IGZhbHNlOyAvLyB3aGV0aGVyIHRoZXJlIGlzIGFuIGVsZW1lbnQgd2hpY2ggY2FuIGJlIGRyYWdnZWRcbiAgcHJpdmF0ZSBfZHJhZ1NyYyA9IG51bGw7IC8vIHRoZSBlbGVtZW50IHdoaWNoIHNob3VsZCBiZSBkcmFnZ2VkXG4gIHByaXZhdGUgX2RyYWdDb3B5ID0gbnVsbDsgLy8gY29weSBvZiBkcmFnIHNvdXJjZSBmb3IgZHJhZyBmZWVkYmFja1xuICBwcml2YXRlIF90b3VjaEVuZENhbGxlZCA9IGZhbHNlOyAvLyB3aGV0aGVyIHRvdWNoRW5kIG9jY3VyZWRcbiAgcHJpdmF0ZSBfZHJhZ1J1bm5pbmcgPSBmYWxzZTsgLy8gd2hldGhlciBhIGRyYWcgcHJvY2VzcyBpcyBydW5uaW5nIGF0IHRoZSBtb21lbnRcblxuICBwcml2YXRlIF9kYXRhVHJhbnNmZXIgPSB7XG4gICAgZGF0YToge30sXG4gICAgc2V0RGF0YTogZnVuY3Rpb24gKHR5cGUsIHZhbCkge1xuICAgICAgdGhpcy5kYXRhW3R5cGVdID0gdmFsO1xuICAgIH0sXG4gICAgZ2V0RGF0YTogZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFbdHlwZV07XG4gICAgfSxcbiAgICBlZmZlY3RBbGxvd2VkOiAnbW92ZSdcbiAgfTtcbiAgcHJpdmF0ZSBfY29weU9mZnNldCA9IHsgeDogMCwgeTogMCB9OyAvLyBPZmZzZXQgZm9yIHBvc2l0aW9uaW5nIHRoZSBkcmFnIGNvcHlcblxuICBwcml2YXRlIF9sYXN0VGFyZ2V0ID0gbnVsbDsgLy8gVGhlIGxhc3QgcmVnaXN0ZXJlZCB0b3VjaCB0YXJnZXRcbiAgcHJpdmF0ZSBfY3VycmVudERyb3BDb250YWluZXIgPSBudWxsOyAvLyBUaGUgY3VycmVudCBkcm9wIGNvbnRhaW5lcjsgZmFsc2UgaWYgZWxlbWVudCBpcyBub3QgZHJvcHBhYmxlXG4gIHByaXZhdGUgX2hhbmRsZUNsaWNrID0gdHJ1ZTsgLy8gU3BlY2lmaWVzXG5cbiAgcHJpdmF0ZSBfREJMQ0xJQ0tERUxBWSA9IDUwMDsgLy8gbWF4aW11bSBkZWxheSBpbiB3aGljaCBhIHNlY29uZCBjbGljayBtdXN0IG9jY3VyXG4gIHByaXZhdGUgX0NPTlRFWFRNRU5VREVMQVkgPSAxMDAwOyAvLyBob2xkIGRlbGF5IGFmdGVyIHdoaWNoIGNvbnRleHQgbWVudSBpcyBzaG93blxuICBwcml2YXRlIF9EUkFHREVMVEEgPSA1OyAvLyBNaW5pbXVtIG9mIHBpeGVscyB3aGljaCB0aGUgZmluZ2VyIG11c3QgYmUgbW92ZWQgdG8gc3RhcnQgZHJhZ1xuICBwcml2YXRlIF9DT1BZT1BBQ0lUWSA9IDAuNzsgLy8gT3BhY2l0eSBvZiB0aGUgZHJhZyBjb3B5IGVsZW1lbnRcbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBUb3VjaERyYWdBbmREcm9wO1xuXG4gIGNvcHlTdHlsZXNEcmFnQ2xvbmU6IGJvb2xlYW4gPSB0cnVlO1xuICBkcmFnT25DbGljazogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIENoZWNrIHNpbmdsZXRvblxuICAgIGlmIChUb3VjaERyYWdBbmREcm9wLl9pbnN0YW5jZSkge1xuICAgICAgLy8gIHRocm93IG5ldyBFcnJvcihcIlRvdWNoRHJhZ0FuZERyb3AgY2FuJ3QgYmUgaW5zdGFudGlhdGVkIG1vcmUgdGhhbiBvbmNlLlwiKTtcbiAgICAgIHJldHVybiBUb3VjaERyYWdBbmREcm9wLl9pbnN0YW5jZTtcbiAgICB9XG4gICAgVG91Y2hEcmFnQW5kRHJvcC5faW5zdGFuY2UgPSB0aGlzO1xuXG4gICAgLy8gdGhpcy5faW5pdGlhbGl6ZUZpZWxkcygpO1xuXG4gICAgLy8gQWRkIGV2ZW50IGxpc3RlbmVyc1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5fdG91Y2hNb3ZlLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UsIGNhcHR1cmU6IGZhbHNlIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX3RvdWNoTW92ZS5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlLCBjYXB0dXJlOiBmYWxzZSB9KTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5fdG91Y2hFbmQuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSwgY2FwdHVyZTogZmFsc2UgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX3RvdWNoRW5kLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UsIGNhcHR1cmU6IGZhbHNlIH0pO1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hjYW5jZWwnLCB0aGlzLl90b3VjaENhbmNlbC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlLCBjYXB0dXJlOiBmYWxzZSB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkRHJhZ2dhYmxlcyhkcmFnZ2FibGVzOiBFbGVtZW50W10pIHtcbiAgICBkcmFnZ2FibGVzLmZvckVhY2goZWwgPT4ge1xuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX3RvdWNoU3RhcnQuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSwgY2FwdHVyZTogZmFsc2UgfSk7XG4gICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl90b3VjaFN0YXJ0LmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UsIGNhcHR1cmU6IGZhbHNlIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZvciB0b3VjaHN0YXJ0IGV2ZW50IGxpc3RlbmVyLlxuICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGVcbiAgICovXG4gIHByaXZhdGUgX3RvdWNoU3RhcnQoZSkge1xuICAgIC8vIFNhdmUgY3VycmVudCB0aW1lc3RhbXBcbiAgICB0aGlzLl90b3VjaEJlZ2luID0gRGF0ZS5ub3coKTtcblxuICAgIGNvbnN0IHsgeCwgeSB9ID0gdGhpcy5fZ2V0UG9pbnQoZSk7XG5cbiAgICB0aGlzLl90b3VjaERvd24gPSB7IHgsIHkgfTtcblxuICAgIHRoaXMuX2RyYWdTcmMgPSBlLmN1cnJlbnRUYXJnZXQ7XG4gICAgdGhpcy5fY2FuRHJhZyA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5kcmFnT25DbGljaykge1xuICAgICAgY29uc3QgX3RvdWNoZXMgPSB7IGNsaWVudFg6IHgsIGNsaWVudFk6IHkgfTtcbiAgICAgIHRoaXMuX2RyYWdSdW5uaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2NyZWF0ZURyYWdDb3B5KGUsIF90b3VjaGVzKTtcbiAgICB9XG5cbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGJhY2sgZm9yIHRvdWNobW92ZSBldmVudCBsaXN0ZW5lci5cbiAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlXG4gICAqL1xuICBwcml2YXRlIF90b3VjaE1vdmUoZSkge1xuICAgIGlmICh0aGlzLl9jYW5EcmFnICYmIHRoaXMuX2RyYWdTcmMpIHtcbiAgICAgIC8vIENyZWF0ZSBjb3B5IG9mIGVsZW1lbnQgZm9yIHZpc3VhbCBkcmFnIGZlZWRiYWNrXG5cbiAgICAgIGNvbnN0IHsgeCwgeSB9ID0gdGhpcy5fZ2V0UG9pbnQoZSk7XG4gICAgICBjb25zdCBfdG91Y2hlcyA9IHsgY2xpZW50WDogeCwgY2xpZW50WTogeSB9O1xuXG4gICAgICBpZiAodGhpcy5fZ2V0RGVsdGEoX3RvdWNoZXMpID49IHRoaXMuX0RSQUdERUxUQSkge1xuICAgICAgICB0aGlzLl9kcmFnUnVubmluZyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2NyZWF0ZURyYWdDb3B5KGUsIF90b3VjaGVzKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVEcmFnQ29weSA9IChlOiBhbnksIF90b3VjaGVzOiB7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH0pID0+IHtcbiAgICBpZiAodGhpcy5fZHJhZ0NvcHkgPT09IG51bGwgJiYgdGhpcy5fZHJhZ1J1bm5pbmcpIHtcbiAgICAgIHRoaXMuX2RyYWdTcmMuc3R5bGUub3BhY2l0eSA9IHRoaXMuX0NPUFlPUEFDSVRZO1xuICAgICAgdGhpcy5fZHJhZ0NvcHkgPSB0aGlzLl9kcmFnU3JjLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgIGNvbnN0IGVsZW1lbnRTdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9kcmFnU3JjKTtcblxuICAgICAgdGhpcy5fZHJhZ0NvcHkuc3R5bGUgPSAnJztcbiAgICAgIHRoaXMuX2RyYWdDb3B5LnNldEF0dHJpYnV0ZSgnZHJhZ2Nsb25lJywgJycpO1xuXG4gICAgICBpZiAodGhpcy5jb3B5U3R5bGVzRHJhZ0Nsb25lKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc3R5bGUgb2YgZWxlbWVudFN0eWxlcykge1xuICAgICAgICAgIHRoaXMuX2RyYWdDb3B5LnN0eWxlW3N0eWxlXSA9IGVsZW1lbnRTdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZShzdHlsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fY2FsY3VsYXRlRHJhZ0NvcHlQb3NpdGlvbihfdG91Y2hlcyk7XG5cbiAgICAgIHRoaXMuX2RyYWdDb3B5LnN0eWxlLnRvcCA9IF90b3VjaGVzLmNsaWVudFkgLSB0aGlzLl9jb3B5T2Zmc2V0LnkgKyAncHgnO1xuICAgICAgdGhpcy5fZHJhZ0NvcHkuc3R5bGUubGVmdCA9IF90b3VjaGVzLmNsaWVudFggLSB0aGlzLl9jb3B5T2Zmc2V0LnggKyAncHgnO1xuICAgICAgdGhpcy5fZHJhZ0NvcHkuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xuICAgICAgdGhpcy5fZHJhZ0NvcHkuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgIHRoaXMuX2RyYWdDb3B5LnN0eWxlLnpJbmRleCA9ICc5OTk5OTknO1xuXG4gICAgICB0aGlzLl9kcmFnQ29weSA9IGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5fZHJhZ0NvcHkpO1xuICAgICAgdGhpcy5fZGlzcGF0Y2hFdmVudCh0aGlzLl9kcmFnU3JjLCAnZHJhZ3N0YXJ0Jyk7XG4gICAgfVxuXG4gICAgLy8gRHJhZyBpcyBydW5uaW5nLCBtb3ZlIGRyYWcgY29weSBhbmQgZmlyZSBldmVudHNcbiAgICBpZiAodGhpcy5fZHJhZ1J1bm5pbmcpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgY29uc3QgX3RoaXMgPSB0aGlzO1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKF90aGlzLl90b3VjaEVuZENhbGxlZCB8fCBfdGhpcy5fZHJhZ0NvcHkgPT09IG51bGwpIHJldHVybjtcbiAgICAgICAgX3RoaXMuX2RyYWdDb3B5LnN0eWxlLnRvcCA9IF90b3VjaGVzLmNsaWVudFkgLSBfdGhpcy5fY29weU9mZnNldC55ICsgJ3B4JztcbiAgICAgICAgX3RoaXMuX2RyYWdDb3B5LnN0eWxlLmxlZnQgPSBfdG91Y2hlcy5jbGllbnRYIC0gX3RoaXMuX2NvcHlPZmZzZXQueCArICdweCc7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5fZmluZERyb3BwYWJsZShlKTtcblxuICAgICAgLy8gRmlyZSBkcmFnbGVhdmUgYW5kIGRyYWdlbnRlciBldmVudHMgd2hlbiB0YXJnZXQgaGFzIGNoYW5nZWQgZHVyaW5nIG1vdmVcbiAgICAgIGlmICh0YXJnZXQgIT0gdGhpcy5fbGFzdFRhcmdldCkge1xuICAgICAgICB0aGlzLl9kaXNwYXRjaEV2ZW50KHRhcmdldCwgJ2RyYWdlbnRlcicpO1xuICAgICAgICB0aGlzLl9kaXNwYXRjaEV2ZW50KHRoaXMuX2xhc3RUYXJnZXQsICdkcmFnbGVhdmUnKTtcbiAgICAgICAgdGhpcy5fbGFzdFRhcmdldCA9IHRhcmdldDtcbiAgICAgIH1cblxuICAgICAgLy8gTWFrZSBjdXJyZW50IGRyb3AgY29udGFpbmVyIGNsYXNzd2lkZSBhdmFpbGFibGUgYW5kIGZpcmUgZHJhZ292ZXIgaWYgaXQncyByZWFsbHkgYSBkcm9wIGNvbnRhaW5lci5cbiAgICAgIHRoaXMuX2N1cnJlbnREcm9wQ29udGFpbmVyID0gdGFyZ2V0O1xuICAgICAgaWYgKHRoaXMuX2N1cnJlbnREcm9wQ29udGFpbmVyKSB0aGlzLl9kaXNwYXRjaEV2ZW50KHRhcmdldCwgJ2RyYWdvdmVyJyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmb3IgdG91Y2hlbmQgZXZlbnQgbGlzdGVuZXIuXG4gICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZVxuICAgKi9cbiAgcHJpdmF0ZSBfdG91Y2hFbmQoZSkge1xuICAgIHRoaXMuX3RvdWNoRW5kQ2FsbGVkID0gdHJ1ZTtcbiAgICB0aGlzLl9jYW5EcmFnID0gZmFsc2U7XG5cbiAgICAvLyBjb25zb2xlLmxvZygxLCBlLnRhcmdldCwgdGhpcy5fY3VycmVudERyb3BDb250YWluZXIpO1xuXG4gICAgLy8gVXNlciBzZWVtcyB0byBjbGlja1xuICAgIC8vIGlmICghdGhpcy5fZHJhZ1J1bm5pbmcgJiYgdGhpcy5faGFuZGxlQ2xpY2spIHtcbiAgICAvLyAgIHRoaXMuX2Rpc3BhdGNoRXZlbnQoZS50YXJnZXQsICdjbGljaycpO1xuICAgIC8vICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIC8vICAgcmV0dXJuO1xuICAgIC8vIH1cbiAgICBpZiAodGhpcy5fY3VycmVudERyb3BDb250YWluZXIpIHtcbiAgICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnQodGhpcy5fY3VycmVudERyb3BDb250YWluZXIsICdkcm9wJyk7XG4gICAgICB0aGlzLl9kaXNwYXRjaEV2ZW50KHRoaXMuX2RyYWdTcmMsICdkcmFnZW5kJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGZpcmUgZHJhZ0V2ZW50IGV2ZW4gaWYgdGhlaXIgaXMgbm8gZHJvcHBhYmxlLiBBbmQgYXNzaWduIGRyb3BFZmZlY3Qgbm9uZS5cbiAgICAgIC8vIGZvciBvdXIgcHVycG9zZSwgdGhpcyB3aWxsIGJyaW5nIGJhY2sgdGhlIGRyYWcgdG8gaXRzIHN0YXJ0IHBvc2l0aW9uLCBzZWVsIGRyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbi50c1xuICAgICAgaWYgKHRoaXMuX2RyYWdSdW5uaW5nKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdkcmFnZW5kJywgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlIH0pO1xuICAgICAgICBldmVudFsnZGF0YVRyYW5zZmVyJ10gPSB7IGRyb3BFZmZlY3Q6ICdub25lJyB9O1xuICAgICAgICB0aGlzLl9kcmFnU3JjPy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9yZXNldCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZvciB0b3VjaGNhbmNlbCBldmVudCBsaXN0ZW5lciwgaW4gY2FzZSBicm93c2VyIHN1cHBvcnRzIHRoaXMuXG4gICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZVxuICAgKi9cbiAgcHJpdmF0ZSBfdG91Y2hDYW5jZWwoZSkge1xuICAgIHRoaXMuX3Jlc2V0KCk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgbmV4dCBkcm9wcGFibGUgZWxlbWVudCBhdCBjdXJyZW50IHBvaW50LlxuICAgKiBAcGFyYW0ge09iamVjdH0gcHRcbiAgICovXG4gIHByaXZhdGUgX2ZpbmREcm9wcGFibGUoZXZlbnQpIHtcbiAgICBjb25zdCBwb2ludEZyb21Ub3VjaEV2ZW50ID0gdGhpcy5fZ2V0UG9pbnQoZXZlbnQpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRGcm9tUG9pbnQocG9pbnRGcm9tVG91Y2hFdmVudC54LCBwb2ludEZyb21Ub3VjaEV2ZW50LnkpO1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBlbGVtZW50RnJvbVBvaW50KHg6IG51bWJlciwgeTogbnVtYmVyKTogRWxlbWVudCB7XG4gICAgbGV0IGVsID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh4LCB5KTtcbiAgICBpZiAoZWwpIHtcbiAgICAgIHdoaWxlIChlbC5zaGFkb3dSb290KSB7XG4gICAgICAgIGNvbnN0IGN1c3RvbUVsID0gZWwuc2hhZG93Um9vdC5lbGVtZW50RnJvbVBvaW50KHgsIHkpO1xuICAgICAgICBpZiAoY3VzdG9tRWwgPT09IG51bGwgfHwgY3VzdG9tRWwgPT09IGVsKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZWwgPSBjdXN0b21FbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9nZXRQb2ludChldmVudCwgcGFnZT8pIHtcbiAgICBpZiAoZXZlbnQgJiYgZXZlbnQudG91Y2hlcykge1xuICAgICAgZXZlbnQgPSBldmVudC50b3VjaGVzWzBdO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgeDogcGFnZSA/IGV2ZW50LnBhZ2VYIDogZXZlbnQuY2xpZW50WCxcbiAgICAgIHk6IHBhZ2UgPyBldmVudC5wYWdlWSA6IGV2ZW50LmNsaWVudFlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIG9mZnNldCBmb3IgZGlzcGxheWluZyB0aGUgZHJhZyBjb3B5IHRvIGhhdmUgYSBzZWFtbGVzcyBkcmFnZ2luZy5cbiAgICogQHBhcmFtIHtUb3VjaH0gdG91Y2ggVGhlIGN1cnJlbnQgdG91Y2guXG4gICAqL1xuICBwcml2YXRlIF9jYWxjdWxhdGVEcmFnQ29weVBvc2l0aW9uKHRvdWNoKSB7XG4gICAgY29uc3QgY2xpZW50UmVjdCA9IHRoaXMuX2RyYWdTcmMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5fY29weU9mZnNldC54ID0gdG91Y2guY2xpZW50WCAtIGNsaWVudFJlY3QubGVmdDtcbiAgICB0aGlzLl9jb3B5T2Zmc2V0LnkgPSB0b3VjaC5jbGllbnRZIC0gY2xpZW50UmVjdC50b3A7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgcGl4ZWwgZGVsdGEgYmV0d2VlbiBmaXJzdCB0b3VjaCBhbmQgdGhlIGN1cnJlbnQgdG91Y2ggcG9zaXRpb24uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB0b3VjaFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0RGVsdGEodG91Y2gpIHtcbiAgICBjb25zdCB4ID0gTWF0aC5hYnModG91Y2guY2xpZW50WCAtIHRoaXMuX3RvdWNoRG93bi54KTtcbiAgICBjb25zdCB5ID0gTWF0aC5hYnModG91Y2guY2xpZW50WSAtIHRoaXMuX3RvdWNoRG93bi55KTtcblxuICAgIHJldHVybiB4ICsgeTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGUgVGhlIGV2ZW50J3MgdGFyZ2V0IGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFR5cGUgVGhlIHR5cGUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0ge2Jvb2x9IGJ1YmJsZSBTZXRzIHdoZXRoZXIgdGhlIGV2ZW50IHNob3VsZCBidWJibGUuXG4gICAqL1xuICBwcml2YXRlIF9kaXNwYXRjaEV2ZW50KGUsIGV2ZW50VHlwZSwgYnViYmxlID0gdHJ1ZSkge1xuICAgIGlmICghZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnRUeXBlLCB7IGJ1YmJsZXM6IGJ1YmJsZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KTtcbiAgICBldmVudFsnZGF0YVRyYW5zZmVyJ10gPSB0aGlzLl9kYXRhVHJhbnNmZXI7XG4gICAgZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICByZXR1cm4gZXZlbnQuZGVmYXVsdFByZXZlbnRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgYWxsIHZhcmlhYmxlcyBhbmQgcHJlcGFyZXMgZm9yIG5ldyBEcmFnIGFuZCBEcm9wLlxuICAgKi9cbiAgcHJpdmF0ZSBfcmVzZXQoKSB7XG4gICAgaWYgKHRoaXMuX2RyYWdSdW5uaW5nKSB7XG4gICAgICB0aGlzLl9kcmFnU3JjLnN0eWxlLm9wYWNpdHkgPSAnMS4wJztcbiAgICAgIHRoaXMuX2RyYWdDb3B5LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5fZHJhZ0NvcHkpO1xuICAgIH1cblxuICAgIHRoaXMuX2RyYWdSdW5uaW5nID0gZmFsc2U7XG4gICAgdGhpcy5fZHJhZ1NyYyA9IG51bGw7XG4gICAgdGhpcy5fZHJhZ0NvcHkgPSBudWxsO1xuICAgIHRoaXMuX2NhbkRyYWcgPSBmYWxzZTtcblxuICAgIHRoaXMuX3RvdWNoQmVnaW4gPSAwO1xuICAgIHRoaXMuX3RvdWNoRG93biA9IG51bGw7XG4gICAgdGhpcy5fbGFzdENsaWNrID0gMDtcbiAgICB0aGlzLl90b3VjaEVuZENhbGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2RhdGFUcmFuc2ZlciA9IHtcbiAgICAgIGRhdGE6IHt9LFxuICAgICAgc2V0RGF0YTogZnVuY3Rpb24gKHR5cGUsIHZhbCkge1xuICAgICAgICB0aGlzLmRhdGFbdHlwZV0gPSB2YWw7XG4gICAgICB9LFxuICAgICAgZ2V0RGF0YTogZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVt0eXBlXTtcbiAgICAgIH0sXG4gICAgICBlZmZlY3RBbGxvd2VkOiAnbW92ZSdcbiAgICB9O1xuICAgIHRoaXMuX2NvcHlPZmZzZXQgPSB7IHg6IDAsIHk6IDAgfTtcblxuICAgIHRoaXMuX2xhc3RUYXJnZXQgPSBudWxsO1xuICAgIHRoaXMuX2N1cnJlbnREcm9wQ29udGFpbmVyID0gbnVsbDtcbiAgICB0aGlzLl9oYW5kbGVDbGljayA9IHRydWU7XG4gIH1cblxuICAvLyBwcml2YXRlIF9nZXRQb3NpdGlvbkZyb21FdmVudChlOiBhbnkpOiB7XG4gIC8vICAgeDogbnVtYmVyO1xuICAvLyAgIHk6IG51bWJlcjtcbiAgLy8gfSB7XG4gIC8vICAgbGV0IF90b3VjaE1vdmU7XG4gIC8vICAgaWYgKGUudHlwZSA9PSAndG91Y2hzdGFydCcgfHwgZS50eXBlID09ICd0b3VjaG1vdmUnIHx8IGUudHlwZSA9PSAndG91Y2hlbmQnIHx8IGUudHlwZSA9PSAndG91Y2hjYW5jZWwnKSB7XG4gIC8vICAgICBjb25zdCBldnQgPSB0eXBlb2YgZS5vcmlnaW5hbEV2ZW50ID09PSAndW5kZWZpbmVkJyA/IGUgOiBlLm9yaWdpbmFsRXZlbnQ7XG4gIC8vICAgICBjb25zdCB0b3VjaCA9IGV2dC50b3VjaGVzWzBdIHx8IGV2dC5jaGFuZ2VkVG91Y2hlc1swXTtcbiAgLy8gICAgIF90b3VjaE1vdmUgPSB7XG4gIC8vICAgICAgIHg6IHRvdWNoLnBhZ2VYLFxuICAvLyAgICAgICB5OiB0b3VjaC5wYWdlWVxuICAvLyAgICAgfTtcbiAgLy8gICB9IGVsc2UgaWYgKFxuICAvLyAgICAgZS50eXBlID09ICdtb3VzZWRvd24nIHx8XG4gIC8vICAgICBlLnR5cGUgPT0gJ21vdXNldXAnIHx8XG4gIC8vICAgICBlLnR5cGUgPT0gJ21vdXNlbW92ZScgfHxcbiAgLy8gICAgIGUudHlwZSA9PSAnbW91c2VvdmVyJyB8fFxuICAvLyAgICAgZS50eXBlID09ICdtb3VzZW91dCcgfHxcbiAgLy8gICAgIGUudHlwZSA9PSAnbW91c2VlbnRlcicgfHxcbiAgLy8gICAgIGUudHlwZSA9PSAnbW91c2VsZWF2ZSdcbiAgLy8gICApIHtcbiAgLy8gICAgIF90b3VjaE1vdmUgPSB7XG4gIC8vICAgICAgIHg6IGUuY2xpZW50WCxcbiAgLy8gICAgICAgeTogZS5jbGllbnRZXG4gIC8vICAgICB9O1xuICAvLyAgIH1cbiAgLy8gICByZXR1cm4gX3RvdWNoTW92ZTtcbiAgLy8gfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbnR5cGUgQ29uc3RydWN0b3I8VD4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5kZWNsYXJlIGNsYXNzIERyb3BwYWJsZXNJbnRlcmZhY2Uge31cblxuLy8gaHR0cHM6Ly9uZy1ydW4uY29tL2VkaXQvOU1HcjVkWVdBMjBBaUp0cHk1YXo/b3Blbj1hcHAlMkZhcHAuY29tcG9uZW50Lmh0bWxcbmV4cG9ydCBjb25zdCBEcm9wcGFibGVzTWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPExpdEVsZW1lbnQ+PihcbiAgc3VwZXJDbGFzczogVCxcbiAgZHJvcHBhYmxlc0luU2hhZG93Um9vdDogYm9vbGVhbixcbiAgZHJvcHBhYmxlc1NlbGVjdG9yOiBzdHJpbmdcbikgPT4ge1xuICBjbGFzcyBEcm9wcGFibGVzRWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3Mge1xuICAgIHByaXZhdGUgb2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXI7XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlIH0pIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTogdm9pZCB7XG4gICAgICAvLyBmb3IgcXRpLW1hdGNoLWludGVyYWN0aW9uIHRoZSBkcmFnIGludGVyYWN0aW9uIGNhbiBiZSByZXBsYWNlIHdpdGggYSBxdGktbWF0Y2gtdGFidWxhciBjbGFzc1xuICAgICAgLy8gd2hpY2ggc2hvd3MgdGhlIGRhdGEgaW4gYSBhIHRhYnVsYXIgd2F5LCBzbyBubyBkcmFnIGRyb3Agc2hvdWxkIGJlIGludm9sdmVkIHRoZW5cbiAgICAgIGlmICh0aGlzLmNsYXNzTGlzdC5jb250YWlucygncXRpLW1hdGNoLXRhYnVsYXInKSkgcmV0dXJuO1xuXG4gICAgICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTtcblxuICAgICAgY29uc3QgZHJvcHBhYmxlcyA9IEFycmF5LmZyb20oXG4gICAgICAgIGRyb3BwYWJsZXNJblNoYWRvd1Jvb3RcbiAgICAgICAgICA/IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKGRyb3BwYWJsZXNTZWxlY3RvcilcbiAgICAgICAgICA6IHRoaXMucXVlcnlTZWxlY3RvckFsbChkcm9wcGFibGVzU2VsZWN0b3IpXG4gICAgICApO1xuXG4gICAgICB0aGlzLmRyYWdvdmVySGFuZGxlciA9IHRoaXMuZHJhZ292ZXJIYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLmRyYWdsZWF2ZUhhbmRsZXIgPSB0aGlzLmRyYWdsZWF2ZUhhbmRsZXIuYmluZCh0aGlzKTtcbiAgICAgIHRoaXMuZHJhZ2VudGVySGFuZGxlciA9IHRoaXMuZHJhZ2VudGVySGFuZGxlci5iaW5kKHRoaXMpO1xuXG4gICAgICB0aGlzLmRyb3BIYW5kbGVyID0gdGhpcy5kcm9wSGFuZGxlci5iaW5kKHRoaXMpO1xuXG4gICAgICBkcm9wcGFibGVzLmZvckVhY2goZCA9PiB7XG4gICAgICAgIGQuc2V0QXR0cmlidXRlKCdkcm9wem9uZScsICdtb3ZlJyk7XG4gICAgICAgIGQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2xlYXZlJywgdGhpcy5kcmFnbGVhdmVIYW5kbGVyKTtcblxuICAgICAgICB0aGlzLmF0dGFjaEhhbmRsZXIoZCk7XG4gICAgICB9KTtcbiAgICAgIGZvciAoY29uc3QgZHJvcHBhYmxlIG9mIGRyb3BwYWJsZXMpIHtcbiAgICAgICAgdGhpcy5vYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKG11dGF0aW9ucyA9PiB7XG4gICAgICAgICAgbXV0YXRpb25zLmZvckVhY2gobXV0YXRpb24gPT4ge1xuICAgICAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdhdHRyaWJ1dGVzJykge1xuICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IG11dGF0aW9uLmF0dHJpYnV0ZU5hbWU7XG4gICAgICAgICAgICAgIHN3aXRjaCAocHJvcE5hbWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkaXNhYmxlZCc6IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGRpc2FibGVkID0gZHJvcHBhYmxlLmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICAgIGlmICghZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdHRhY2hIYW5kbGVyKGRyb3BwYWJsZSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUhhbmRsZXIoZHJvcHBhYmxlKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKGRyb3BwYWJsZSwge1xuICAgICAgICAgIGF0dHJpYnV0ZXM6IHRydWUgLy9jb25maWd1cmUgaXQgdG8gbGlzdGVuIHRvIGF0dHJpYnV0ZSBjaGFuZ2VzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXR0YWNoSGFuZGxlcihkcm9wcGFibGU6IEVsZW1lbnQpIHtcbiAgICAgIGRyb3BwYWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMuZHJhZ292ZXJIYW5kbGVyKTtcbiAgICAgIGRyb3BwYWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW50ZXInLCB0aGlzLmRyYWdlbnRlckhhbmRsZXIpO1xuICAgICAgZHJvcHBhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2Ryb3AnLCB0aGlzLmRyb3BIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZUhhbmRsZXIoZHJvcHBhYmxlOiBFbGVtZW50KSB7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmRyYWdvdmVySGFuZGxlcik7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgdGhpcy5kcmFnZW50ZXJIYW5kbGVyKTtcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5kcm9wSGFuZGxlcik7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgICAvLyBmb3IgcXRpLW1hdGNoLWludGVyYWN0aW9uIHRoZSBkcmFnIGludGVyYWN0aW9uIGNhbiBiZSByZXBsYWNlIHdpdGggYSBxdGktbWF0Y2gtdGFidWxhciBjbGFzc1xuICAgICAgLy8gd2hpY2ggc2hvd3MgdGhlIGRhdGEgaW4gYSBhIHRhYnVsYXIgd2F5LCBzbyBubyBkcmFnIGRyb3Agc2hvdWxkIGJlIGludm9sdmVkIHRoZW5cbiAgICAgIGlmICh0aGlzLmNsYXNzTGlzdC5jb250YWlucygncXRpLW1hdGNoLXRhYnVsYXInKSkgcmV0dXJuO1xuXG4gICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgICAgdGhpcy5vYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuICAgIH1cblxuICAgIGRyYWdlbnRlckhhbmRsZXIoZXY6IERyYWdFdmVudCkge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBkcmFnb3ZlckhhbmRsZXIoZXY6IERyYWdFdmVudCkge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGRyb3BwYWJsZSA9IGV2LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAvLyBkcm9wcGFibGVzSW5TaGFkb3dSb290XG4gICAgICAvLyA/IGRyb3BwYWJsZS5zZXRBdHRyaWJ1dGUoJ3BhcnQnLCBkcm9wcGFibGUuZ2V0QXR0cmlidXRlKCdwYXJ0JykgKyAnIGFjdGl2ZScpIDpcbiAgICAgIGRyb3BwYWJsZS5zZXRBdHRyaWJ1dGUoJ2FjdGl2ZScsICcnKTtcblxuICAgICAgZXYuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnbW92ZSc7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBkcm9wSGFuZGxlcihldjogRHJhZ0V2ZW50KSB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgZHJvcHBhYmxlID0gZXYuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIC8vIHBrOiBkcmFnZ2FibGVzIGluIGxpZ2h0IGRvbSBjYW4gYmUgZHJhZ2dlZCB0byBzaGFkb3dkb20sIHRoaXMgaXMgb25lIG9mIHRoZSBydWxlcyBvZiB3ZWJjb21wb25lbnRzLlxuICAgICAgLy8gVGhleSBtYXkgbm90IGNyZWF0ZSBuZXcgZWxlbWVudHMgaW4gbGlnaHQgZG9tLiBTb21lIHNvbWV0aW1lc3MgZHJvcCB6b25lcyBzaG91bGQgYmUgZ2VuZXJhdGVkXG4gICAgICAvLyBieSB0aGUgd2ViY29tcG9uZW50LiBUaGVuIGEgZHJhZ2dhYmxlICggd2hpY2ggaXMgYWx3YXlzIGFscmVhZHkgY3JlYXRlZCBieSBhIHdlYmNvbXBvbmVudCApXG4gICAgICAvLyBjYW4gYmUgaW4gbGlnaHQgZG9tLCBlbiBjYW4gYmUgZHJhZ2dlZCB0byBzaGFkb3cgZG9tLlxuICAgICAgLy8gdGhpbmtpbmcgb2YgYW5vdGhlciB3YXkgd2hlcmUgd2UganVzdCBjaGFuZ2Ugc2xvdHMuIE1heWJlIHRoYXRzIGJldHRlci4uXG4gICAgICBjb25zdCBkcmFnZ2FibGVJbkxpZ2h0RG9tID0gdGhpcy5xdWVyeVNlbGVjdG9yKGBbaWRlbnRpZmllcj0ke2V2LmRhdGFUcmFuc2Zlci5nZXREYXRhKCd0ZXh0Jyl9YCk7XG4gICAgICBjb25zdCBkcmFnZ2FibGUgPSBkcmFnZ2FibGVJbkxpZ2h0RG9tXG4gICAgICAgID8gZHJhZ2dhYmxlSW5MaWdodERvbVxuICAgICAgICA6IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKGBbaWRlbnRpZmllcj0ke2V2LmRhdGFUcmFuc2Zlci5nZXREYXRhKCd0ZXh0Jyl9YCk7XG5cbiAgICAgIGlmICghZHJvcHBhYmxlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYGNhbm5vdCBmaW5kIGRyb3BwYWJsZSwgdGFyZ2V0OiAke2V2LnRhcmdldCA/IEpTT04uc3RyaW5naWZ5KGV2LnRhcmdldCkgOiAnbnVsbCd9YCk7XG4gICAgICB9IGVsc2UgaWYgKGRyYWdnYWJsZS5wYXJlbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpICE9PSBkcm9wcGFibGUuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykpIHtcbiAgICAgICAgZHJvcHBhYmxlLmFwcGVuZENoaWxkKGRyYWdnYWJsZSk7XG4gICAgICB9XG4gICAgICAvLyBkcm9wcGFibGVzSW5TaGFkb3dSb290XG4gICAgICAvLyA/IGRyb3BwYWJsZS5zZXRBdHRyaWJ1dGUoJ3BhcnQnLCBkcm9wcGFibGUuZ2V0QXR0cmlidXRlKCdwYXJ0JykucmVwbGFjZSgnYWN0aXZlJywgJycpLnRyaW0oKSkgOlxuICAgICAgZHJvcHBhYmxlLnJlbW92ZUF0dHJpYnV0ZSgnYWN0aXZlJyk7XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBkcmFnbGVhdmVIYW5kbGVyKGV2OiBEcmFnRXZlbnQpIHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGNvbnN0IGRyb3BwYWJsZSA9IGV2LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlQXR0cmlidXRlKCdhY3RpdmUnKTtcbiAgICAgIGV2LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ25vbmUnO1xuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiBEcm9wcGFibGVzRWxlbWVudCBhcyBDb25zdHJ1Y3RvcjxEcm9wcGFibGVzSW50ZXJmYWNlPiAmIFQ7XG59O1xuIiwgIi8vIFRISVMgSVMgQSBNSVhJTiwgVEhJUyBJUyBBIE1JWElOXG4vLyBVU0UgTElLRSBUSElTXG4vLyBgYGBjbGFzcyBEcm9wTGlzdCBleHRlbmRzIEZsaXBwYWJsZXMoTGl0RWxlbWVudCkge2BgYFxuLy8gbWl4aW4gd2hpY2ggYW5pbWF0ZXMgY2hpbGRyZW4gd2l0aCBGTElQXG4vLyBhIGNvbWJpbmF0aW9uIGJldHdlZW4gdGhpcyBkaXJlY3RpdmU6XG4vLyBodHRwczovL25nLXJ1bi5jb20vZWRpdC85TUdyNWRZV0EyMEFpSnRweTVhej9vcGVuPWFwcCUyRmFwcC5jb21wb25lbnQuaHRtbFxuLy8gYW5kIGEgdHV0b3JpYWwgaG93IHRvIG1ha2UgYSBtaXhpblxuLy8gaHR0cHM6Ly9saXQuZGV2L2RvY3MvY29tcG9zaXRpb24vbWl4aW5zL1xuXG5pbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcblxudHlwZSBDb25zdHJ1Y3RvcjxUPiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5cbmV4cG9ydCBkZWNsYXJlIGNsYXNzIEZsaXBwYWJsZXNJbnRlcmZhY2Uge1xuICBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkO1xuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkO1xufVxuXG4vLyBqdXN0IGEgY29udmVyc2lvbiBvZiBhIGFuZ3VsYXIgRkxJUCBkaXJlY3RpdmUsIG1hZGUgYXMgYSBNaXhpblxuLy8gaHR0cHM6Ly9uZy1ydW4uY29tL2VkaXQvOU1HcjVkWVdBMjBBaUp0cHk1YXo/b3Blbj1hcHAlMkZhcHAuY29tcG9uZW50Lmh0bWxcbmV4cG9ydCBjb25zdCBGbGlwcGFibGVzTWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPExpdEVsZW1lbnQ+PihcbiAgc3VwZXJDbGFzczogVCxcbiAgZHJvcHBhYmxlc1NlbDogc3RyaW5nLFxuICBkcmFnZ2FibGVzU2VsOiBzdHJpbmdcbikgPT4ge1xuICBjbGFzcyBGbGlwcGFibGVzRWxlbWVudCBleHRlbmRzIHN1cGVyQ2xhc3Mge1xuICAgIC8vIHByaXZhdGUgc3RhdGUgPSBuZXcgTWFwPEVsZW1lbnQsIGFueT4oKTtcbiAgICAvLyBwcml2YXRlIG9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xuICAgIC8vIGZsaXBwYWJsZXNTZWxlY3Rvcjogc3RyaW5nO1xuICAgIC8vIG92ZXJyaWRlIGFzeW5jIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpIHtcbiAgICAvLyAgIGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGU7IC8vIHBrOiB0aGlzIGlzIHRoZSBrZXkgdG8gY2FsY3VsYXRlIGNvcnJlY3QgcHJvcG9ydGlvbnNcbiAgICAvLyAgIGNvbnN0IGRyYWdnYWJsZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbChkcmFnZ2FibGVzU2VsKSk7XG4gICAgLy8gICBkcmFnZ2FibGVzLmZvckVhY2goKGVsZW0pID0+IHtcbiAgICAvLyAgICAgY29uc3QgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgLy8gICAgIHRoaXMuc3RhdGUuc2V0KGVsZW0sIHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIC8vICAgfSk7XG4gICAgLy8gICB0aGlzLm9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5hbmltYXRlTWUpO1xuICAgIC8vICAgY29uc3QgZHJvcHBhYmxlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKGRyb3BwYWJsZXNTZWwpKTtcbiAgICAvLyAgIGRyb3BwYWJsZXMuZm9yRWFjaCgoZHJhZ2dhYmxlKSA9PiB7XG4gICAgLy8gICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZShkcmFnZ2FibGUsIHsgY2hpbGRMaXN0OiB0cnVlIH0pO1xuICAgIC8vICAgfSk7XG4gICAgLy8gICB0aGlzLm9ic2VydmVyLm9ic2VydmUodGhpcywgeyBjaGlsZExpc3Q6IHRydWUgfSk7XG4gICAgLy8gICBzdXBlci5maXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKTtcbiAgICAvLyB9XG4gICAgLy8gcHJpdmF0ZSBhbmltYXRlTWUgPSAoKSA9PiB7XG4gICAgLy8gICB0aGlzLnN0YXRlLmZvckVhY2goKHZhbHVlLCBlbGVtKSA9PiB7XG4gICAgLy8gICAgIGNvbnN0IHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0gPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIC8vICAgICBpZiAodGhpcy5zdGF0ZS5nZXQoZWxlbSkgPT0gbnVsbCkge1xuICAgIC8vICAgICAgIHRoaXMuc3RhdGUuc2V0KGVsZW0sIHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIC8vICAgICB9XG4gICAgLy8gICAgIGNvbnN0IGNhY2hlID0gdGhpcy5zdGF0ZS5nZXQoZWxlbSk7XG4gICAgLy8gICAgIGNvbnN0IGRlbHRhWCA9IGNhY2hlLmxlZnQgLSBsZWZ0O1xuICAgIC8vICAgICBjb25zdCBkZWx0YVkgPSBjYWNoZS50b3AgLSB0b3A7XG4gICAgLy8gICAgIGNvbnN0IGRlbHRhVyA9IGNhY2hlLndpZHRoIC8gd2lkdGg7XG4gICAgLy8gICAgIGNvbnN0IGRlbHRhSCA9IGNhY2hlLmhlaWdodCAvIGhlaWdodDtcbiAgICAvLyAgICAgdGhpcy5zdGF0ZS5zZXQoZWxlbSwgeyBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgLy8gICAgIGNvbnN0IHsgZHVyYXRpb24sIGVhc2luZyB9ID0geyBkdXJhdGlvbjogMzUwLCBlYXNpbmc6ICdjdWJpYy1iZXppZXIoMC4yNiwgMC44NiwgMC40NCwgMC45ODUpJyB9O1xuICAgIC8vICAgICBlbGVtLmFuaW1hdGUoXG4gICAgLy8gICAgICAgW1xuICAgIC8vICAgICAgICAge1xuICAgIC8vICAgICAgICAgICB0cmFuc2Zvcm1PcmlnaW46ICd0b3AgbGVmdCcsXG4gICAgLy8gICAgICAgICAgIHRyYW5zZm9ybTogYFxuICAgIC8vIHRyYW5zbGF0ZSgke2RlbHRhWH1weCwgJHtkZWx0YVl9cHgpXG4gICAgLy8gc2NhbGUoJHtkZWx0YVd9LCAke2RlbHRhSH0pXG4gICAgLy8gYCxcbiAgICAvLyAgICAgICAgICAgLy8gd2lkdGg6IGNhY2hlLndpZHRoLFxuICAgIC8vICAgICAgICAgICAvLyBoZWlnaHQ6IGNhY2hlLmhlaWdodCsgJ3B4JyxcbiAgICAvLyAgICAgICAgICAgLy8gb3BhY2l0eTogY2FjaGUub3BhY2l0eSxcbiAgICAvLyAgICAgICAgIH0sXG4gICAgLy8gICAgICAgICB7XG4gICAgLy8gICAgICAgICAgIHRyYW5zZm9ybU9yaWdpbjogJ3RvcCBsZWZ0JyxcbiAgICAvLyAgICAgICAgICAgdHJhbnNmb3JtOiAnbm9uZScsXG4gICAgLy8gICAgICAgICB9LFxuICAgIC8vICAgICAgIF0sXG4gICAgLy8gICAgICAge1xuICAgIC8vICAgICAgICAgZHVyYXRpb24sXG4gICAgLy8gICAgICAgICBlYXNpbmcsXG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICApO1xuICAgIC8vICAgfSk7XG4gICAgLy8gfTtcbiAgICAvLyBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICAvLyAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgLy8gICB0aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAvLyB9XG4gIH1cbiAgcmV0dXJuIEZsaXBwYWJsZXNFbGVtZW50IGFzIENvbnN0cnVjdG9yPEZsaXBwYWJsZXNJbnRlcmZhY2U+ICYgVDtcbn07XG4iLCAiaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBEcm9wcGFibGVzTWl4aW4gfSBmcm9tICcuL2Ryb3BwYWJsZXMtbWl4aW4nO1xuaW1wb3J0IHsgRmxpcHBhYmxlc01peGluIH0gZnJvbSAnLi9mbGlwcGFibGVzLW1peGluJztcbmltcG9ydCB7IElJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uLmludGVyZmFjZSc7XG5cbmltcG9ydCB7IFRvdWNoRHJhZ0FuZERyb3AgfSBmcm9tICcuL2RyYWctZHJvcC1hcGknO1xuaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uLy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuaW1wb3J0IHsgbGl2ZVF1ZXJ5IH0gZnJvbSAnLi4vLi4vLi4vLi4vZGVjb3JhdG9ycy9saXZlLXF1ZXJ5Jztcbi8vIGtleWJvYXJkIG5hdmlnYXRhYmxlIGRyYWcgZHJvcDogaHR0cHM6Ly9jb2RlcGVuLmlvL1NpdGVQb2ludC9wZW4vdkV6WGJqXG4vLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy81NTI0MjE5Ni90eXBlc2NyaXB0LWFsbG93cy10by11c2UtcHJvcGVyLW11bHRpcGxlLWluaGVyaXRhbmNlLXdpdGgtbWl4aW5zLWJ1dC1mYWlscy10by1jXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE3NzQ0I2lzc3VlY29tbWVudC01NTg5OTAzODFcbi8vIGh0dHBzOi8vbmctcnVuLmNvbS9lZGl0LzlNR3I1ZFlXQTIwQWlKdHB5NWF6P29wZW49YXBwJTJGYXBwLmNvbXBvbmVudC5odG1sXG5cbnR5cGUgQ29uc3RydWN0b3I8VD4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5pbnRlcmZhY2UgSW50ZXJhY3Rpb25Db25maWd1cmF0aW9uIHtcbiAgY29weVN0eWxlc0RyYWdDbG9uZTogYm9vbGVhbjtcbiAgZHJhZ0NhbkJlUGxhY2VkQmFjazogYm9vbGVhbjtcbiAgZHJhZ09uQ2xpY2s6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gPSA8VCBleHRlbmRzIENvbnN0cnVjdG9yPExpdEVsZW1lbnQ+PihcbiAgc3VwZXJDbGFzczogVCxcbiAgZHJhZ2dhYmxlc1NlbGVjdG9yOiBzdHJpbmcsXG4gIGRyb3BwYWJsZXNJblNoYWRvd1Jvb3Q6IGJvb2xlYW4sXG4gIGRyb3BwYWJsZXNTZWxlY3Rvcjogc3RyaW5nXG4pID0+IHtcbiAgY2xhc3MgRHJhZ0Ryb3BJbnRlcmFjdGlvbkVsZW1lbnQgZXh0ZW5kcyBGbGlwcGFibGVzTWl4aW4oXG4gICAgRHJvcHBhYmxlc01peGluKHN1cGVyQ2xhc3MsIGRyb3BwYWJsZXNJblNoYWRvd1Jvb3QsIGRyb3BwYWJsZXNTZWxlY3RvciksXG4gICAgZHJvcHBhYmxlc1NlbGVjdG9yLFxuICAgIGRyYWdnYWJsZXNTZWxlY3RvclxuICApIHtcbiAgICBwcm90ZWN0ZWQgZHJhZ2dhYmxlcyA9IG5ldyBNYXA8RWxlbWVudCwgeyBwYXJlbnQ6IEVsZW1lbnQ7IGluZGV4OiBudW1iZXIgfT4oKTtcbiAgICBwcm90ZWN0ZWQgZHJvcHBhYmxlczogRWxlbWVudFtdO1xuICAgIGRyYWdEcm9wQXBpOiBUb3VjaERyYWdBbmREcm9wO1xuXG4gICAgQGxpdmVRdWVyeShkcmFnZ2FibGVzU2VsZWN0b3IpXG4gICAgcmVJbml0RHJhZ0FuZERyb3AoZHJhZ3NBZGRlZDogRWxlbWVudFtdLCBkcmFnc1JlbW92ZWQ6IEVsZW1lbnRbXSkge1xuICAgICAgaWYgKHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpKSByZXR1cm47XG5cbiAgICAgIC8vIGNoZWNrIGlmIGFkZGVkIGVsZW1lbnRzIGFyZSBub3QgYWxyZWFkeSBpbiBsaXN0XG4gICAgICBjb25zdCBkcmFnZ2FibGVzID0gZHJhZ3NBZGRlZC5maWx0ZXIoZCA9PiAhdGhpcy5kcmFnZ2FibGVzIHx8ICF0aGlzLmRyYWdnYWJsZXMuZ2V0KGQpKTtcblxuICAgICAgaWYgKGRyYWdnYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmRyYWdEcm9wQXBpLmFkZERyYWdnYWJsZXMoZHJhZ3NBZGRlZCk7XG5cbiAgICAgICAgZHJhZ3NBZGRlZC5mb3JFYWNoKGVsZW0gPT4ge1xuICAgICAgICAgIC8vIHN0b3JlIGluaXRpYWwgcG9zaXRpb25zIG9mIGVsZW1lbnRzLCBhbmQgb2Zjb3Vyc2UsIGp1c3QgdGhlIGVsZW1lbnRzIGZvciBsb29waW5nIGFuZCBzdWNoXG4gICAgICAgICAgdGhpcy5kcmFnZ2FibGVzLnNldChlbGVtLCB7XG4gICAgICAgICAgICBwYXJlbnQ6IGVsZW0ucGFyZW50RWxlbWVudCxcbiAgICAgICAgICAgIGluZGV4OiBBcnJheS5mcm9tKGVsZW0ucGFyZW50Tm9kZS5jaGlsZHJlbikuaW5kZXhPZihlbGVtKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGVsZW0uc2V0QXR0cmlidXRlKCdxdGktZHJhZ2dhYmxlJywgJ3RydWUnKTtcbiAgICAgICAgICBlbGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIChldjogYW55KSA9PiB7XG4gICAgICAgICAgICBldi5kYXRhVHJhbnNmZXIuc2V0RGF0YSgndGV4dCcsIGV2LmN1cnJlbnRUYXJnZXQuZ2V0QXR0cmlidXRlKGBpZGVudGlmaWVyYCkpO1xuICAgICAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoJ2RyYWdnaW5nJywgJycpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgZWxlbS5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW5kJywgKGV2OiBEcmFnRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBlbGVtLnJlbW92ZUF0dHJpYnV0ZSgnb3ZlcicpO1xuICAgICAgICAgICAgZWxlbS5yZW1vdmVBdHRyaWJ1dGUoJ2RyYWdnaW5nJyk7XG5cbiAgICAgICAgICAgIC8vIHBrOiBpZiBub3QgZHJvcHBlZCBvbiBhIGRyb3AgbG9jYXRpb24gcHV0IGl0IGJhY2sgd2hlcmUgaXQgYmVsb25nc1xuICAgICAgICAgICAgaWYgKGV2LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID09PSAnbm9uZScgfHwgZXYuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLmRyYWdDYW5CZVBsYWNlZEJhY2spIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkcmFnZ2FibGUgPSBldi5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5kcmFnZ2FibGVzLmdldChkcmFnZ2FibGUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID1cbiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLmluZGV4IDwgcG9zaXRpb24ucGFyZW50LmNoaWxkcmVuLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICA/IHBvc2l0aW9uLmluZGV4XG4gICAgICAgICAgICAgICAgICAgIDogcG9zaXRpb24ucGFyZW50LmNoaWxkcmVuLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgY29uc3QgaW50ZXJhY3Rpb24gPSBwb3NpdGlvbi5wYXJlbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgZ2FwVGV4dCA9IHBvc2l0aW9uLnBhcmVudC5jaGlsZHJlbltpbmRleF07XG4gICAgICAgICAgICAgICAgaW50ZXJhY3Rpb24uaW5zZXJ0QmVmb3JlKGRyYWdnYWJsZSwgZ2FwVGV4dCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrTWF4TWF0Y2hBc3NvY2lhdGlvbnMoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV2LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID09PSAnbW92ZScpIHtcbiAgICAgICAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UoKTtcbiAgICAgICAgICAgICAgdGhpcy5jaGVja01heE1hdGNoQXNzb2NpYXRpb25zKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAncmVzcG9uc2UtaWRlbnRpZmllcicgfSkgcmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmcgPSAnJztcblxuICAgIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogZmFsc2UsIHR5cGU6IE9iamVjdCB9KSBjb25maWd1cmF0aW9uOiBJbnRlcmFjdGlvbkNvbmZpZ3VyYXRpb24gPSB7XG4gICAgICBjb3B5U3R5bGVzRHJhZ0Nsb25lOiB0cnVlLFxuICAgICAgZHJhZ0NhbkJlUGxhY2VkQmFjazogdHJ1ZSxcbiAgICAgIGRyYWdPbkNsaWNrOiBmYWxzZVxuICAgIH07XG4gICAgQHdhdGNoKCdjb25maWd1cmF0aW9uJylcbiAgICBoYW5kbGVEcmFnT3B0aW9uc0NoYW5nZWQob2xkLCBkcmFnT3B0aW9ucykge1xuICAgICAgdGhpcy5kcmFnRHJvcEFwaS5jb3B5U3R5bGVzRHJhZ0Nsb25lID0gZHJhZ09wdGlvbnMuY29weVN0eWxlc0RyYWdDbG9uZTtcbiAgICAgIHRoaXMuZHJhZ0Ryb3BBcGkuZHJhZ09uQ2xpY2sgPSBkcmFnT3B0aW9ucy5kcmFnT25DbGljaztcbiAgICB9XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlIH0pIGRpc2FibGVkID0gZmFsc2U7XG4gICAgQHdhdGNoKCdkaXNhYmxlZCcsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgICBoYW5kbGVEaXNhYmxlZENoYW5nZShvbGQsIGRpc2FibGVkOiBib29sZWFuKSB7XG4gICAgICB0aGlzLmRyYWdnYWJsZXMuZm9yRWFjaCgocywgY2gpID0+IHtcbiAgICAgICAgZGlzYWJsZWQgPyBjaC5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpIDogY2gucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgICBkaXNhYmxlZCA/IGNoLnJlbW92ZUF0dHJpYnV0ZSgncXRpLWRyYWdnYWJsZScpIDogY2guc2V0QXR0cmlidXRlKCdxdGktZHJhZ2dhYmxlJywgJ3RydWUnKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSkgcmVhZG9ubHkgPSBmYWxzZTtcbiAgICBAd2F0Y2goJ3JlYWRvbmx5JywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICAgIGhhbmRsZVJlYWRvbmx5Q2hhbmdlKG9sZCwgcmVhZG9ubHk6IGJvb2xlYW4pIHtcbiAgICAgIHRoaXMuZHJhZ2dhYmxlcy5mb3JFYWNoKChzLCBjaCkgPT4ge1xuICAgICAgICByZWFkb25seSA/IGNoLnNldEF0dHJpYnV0ZSgncmVhZG9ubHknLCAnJykgOiBjaC5yZW1vdmVBdHRyaWJ1dGUoJ3JlYWRvbmx5Jyk7XG4gICAgICAgIHJlYWRvbmx5ID8gY2gucmVtb3ZlQXR0cmlidXRlKCdxdGktZHJhZ2dhYmxlJykgOiBjaC5zZXRBdHRyaWJ1dGUoJ3F0aS1kcmFnZ2FibGUnLCAndHJ1ZScpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlLCBhdHRyaWJ1dGU6ICdtaW4tYXNzb2NpYXRpb25zJyB9KSBtaW5Bc3NvY2lhdGlvbnMgPSAxO1xuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSwgYXR0cmlidXRlOiAnbWF4LWFzc29jaWF0aW9ucycgfSkgbWF4QXNzb2NpYXRpb25zID0gMTtcblxuICAgIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpOiB2b2lkIHtcbiAgICAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpO1xuICAgICAgdGhpcy5kcm9wcGFibGVzID0gQXJyYXkuZnJvbShcbiAgICAgICAgZHJvcHBhYmxlc0luU2hhZG93Um9vdFxuICAgICAgICAgID8gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbGVjdG9yKVxuICAgICAgICAgIDogdGhpcy5xdWVyeVNlbGVjdG9yQWxsKGRyb3BwYWJsZXNTZWxlY3RvcilcbiAgICAgICk7XG4gICAgICAvLyBQSzogTWF5YmUgbGF0ZXIsIGZvciBub3cgd2UgYXNzdW1lIGRyb3BwYWJsZXMgYXJlIG5vdCBkeW5hbWljbHkgYWRkZWQgb3IgcmVtb3ZlZFxuICAgICAgLy8gLmZpbHRlcigoZWxlbSkgPT4gIXRoaXMuZHJvcHBhYmxlcyB8fCAhdGhpcy5kcm9wcGFibGVzLmluY2x1ZGVzKGVsZW0pKTtcbiAgICAgIC8vIHRoaXMuZHJvcHBhYmxlcyA9IHRoaXMuZHJvcHBhYmxlcyA/IHRoaXMuZHJvcHBhYmxlcy5jb25jYXQobmV3RHJvcHBhYmxlcykgOiBuZXdEcm9wcGFibGVzO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgICAgdGhpcy5kcmFnRHJvcEFwaSA9IG5ldyBUb3VjaERyYWdBbmREcm9wKCk7XG5cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50PERyYWdEcm9wSW50ZXJhY3Rpb25FbGVtZW50PigncXRpLXJlZ2lzdGVyLWludGVyYWN0aW9uJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiB0aGlzXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHJlc2V0KHNhdmUgPSB0cnVlKTogdm9pZCB7XG4gICAgICB0aGlzLmRyYWdnYWJsZXMuZm9yRWFjaCgocG9zaXRpb24sIGRyYWdnYWJsZSkgPT4ge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHBvc2l0aW9uLnBhcmVudC5jaGlsZHJlbjtcbiAgICAgICAgY29uc3QgaW5kZXggPSBwb3NpdGlvbi5pbmRleCA8IGNoaWxkcmVuLmxlbmd0aCA/IHBvc2l0aW9uLmluZGV4IDogY2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgICBwb3NpdGlvbi5wYXJlbnQuaW5zZXJ0QmVmb3JlKGRyYWdnYWJsZSwgY2hpbGRyZW5baW5kZXhdKTtcbiAgICAgIH0pO1xuICAgICAgc2F2ZSAmJiB0aGlzLnNhdmVSZXNwb25zZSgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjaGVja01heE1hdGNoQXNzb2NpYXRpb25zKCkge1xuICAgICAgdGhpcy5kcm9wcGFibGVzLmZvckVhY2goZCA9PiB7XG4gICAgICAgIGNvbnN0IG1heE1hdGNoID0gKyhkLmdldEF0dHJpYnV0ZSgnbWF0Y2gtbWF4JykgfHwgMSk7XG4gICAgICAgIC8vIGNvbnN0IG1heE1pbiA9ICsoZC5nZXRBdHRyaWJ1dGUoJ21hdGNoLW1pbicpIHx8IDApO1xuICAgICAgICBjb25zdCBkaXNhYmxlID0gbWF4TWF0Y2ggPD0gKGQuY2hpbGRyZW4ubGVuZ3RoIHx8IDApO1xuICAgICAgICBkaXNhYmxlID8gZC5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpIDogZC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICAgIGRpc2FibGUgPyBkLnJlbW92ZUF0dHJpYnV0ZSgnZHJvcHpvbmUnKSA6IGQuc2V0QXR0cmlidXRlKCdkcm9wem9uZScsICdtb3ZlJyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXQgcmVzcG9uc2UocmVzcG9uc2U6IHN0cmluZ1tdKSB7XG4gICAgICAvLyBmb3IgcXRpLW1hdGNoLWludGVyYWN0aW9uIHRoZSBkcmFnIGludGVyYWN0aW9uIGNhbiBiZSByZXBsYWNlIHdpdGggYSBxdGktbWF0Y2gtdGFidWxhciBjbGFzc1xuICAgICAgLy8gd2hpY2ggc2hvd3MgdGhlIGRhdGEgaW4gYSBhIHRhYnVsYXIgd2F5LCBzbyBubyBkcmFnIGRyb3Agc2hvdWxkIGJlIGludm9sdmVkIHRoZW5cbiAgICAgIGlmICh0aGlzLmNsYXNzTGlzdC5jb250YWlucygncXRpLW1hdGNoLXRhYnVsYXInKSkgcmV0dXJuO1xuXG4gICAgICB0aGlzLnJlc2V0KGZhbHNlKTtcbiAgICAgIGlmIChyZXNwb25zZSAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KHJlc3BvbnNlKSlcbiAgICAgICAgcmVzcG9uc2UuZm9yRWFjaChyZXNwb25zZSA9PiB7XG4gICAgICAgICAgY29uc3QgW2Ryb3BJZCwgLi4uZHJhZ0lkc10gPSByZXNwb25zZS5zcGxpdCgnICcpLnJldmVyc2UoKTtcbiAgICAgICAgICBpZiAoZHJvcElkKSB7XG4gICAgICAgICAgICBjb25zdCBkcm9wcGFibGUgPSB0aGlzLmRyb3BwYWJsZXMuZmluZChkcm9wID0+IGRyb3AuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgPT09IGRyb3BJZCk7XG4gICAgICAgICAgICBkcmFnSWRzLmZvckVhY2goZHJhZ0lkID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZHJhZ2dhYmxlID0gdGhpcy5xdWVyeVNlbGVjdG9yKGBbaWRlbnRpZmllcj0ke2RyYWdJZH1dYCk7XG4gICAgICAgICAgICAgIGlmICghZHJvcHBhYmxlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgY2Fubm90IGZpbmQgZHJvcHBhYmxlIHdpdGggaWRlbnRpZmllcjogJHtkcm9wSWR9YCk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWRyYWdnYWJsZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGNhbm5vdCBmaW5kIGRyYWdnYWJsZSB3aXRoIGlkZW50aWZpZXI6ICR7ZHJhZ0lkfWApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRyb3BwYWJsZS5hcHBlbmRDaGlsZChkcmFnZ2FibGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tNYXhNYXRjaEFzc29jaWF0aW9ucygpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhbGlkYXRlKCkge1xuICAgICAgY29uc3QgZHJvcHBhYmxlcyA9IGRyb3BwYWJsZXNJblNoYWRvd1Jvb3RcbiAgICAgICAgPyBBcnJheS5mcm9tKHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKGRyb3BwYWJsZXNTZWxlY3RvcikpXG4gICAgICAgIDogQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbGVjdG9yKSk7XG4gICAgICBjb25zdCBhc3NvY2lhdGlvbnMgPSBkcm9wcGFibGVzLmZpbHRlcihkID0+IGQuY2hpbGRFbGVtZW50Q291bnQgPiAwKS5sZW5ndGg7XG4gICAgICByZXR1cm4gdGhpcy5taW5Bc3NvY2lhdGlvbnMgPD0gMCB8fCB0aGlzLm1pbkFzc29jaWF0aW9ucyA8PSBhc3NvY2lhdGlvbnM7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHNhdmVSZXNwb25zZSgpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gdGhpcy5kcm9wcGFibGVzLm1hcChkcm9wcGFibGUgPT4ge1xuICAgICAgICBsZXQgcmVzcG9uc2VTdHJpbmcgPSAnJztcbiAgICAgICAgaWYgKGRyb3BwYWJsZS5jaGlsZHJlbj8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJlc3BvbnNlU3RyaW5nICs9XG4gICAgICAgICAgICBBcnJheS5mcm9tKGRyb3BwYWJsZS5jaGlsZHJlbilcbiAgICAgICAgICAgICAgLm1hcChkID0+IGQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykpXG4gICAgICAgICAgICAgIC5qb2luKCcgJykgKyBgIGA7XG4gICAgICAgIH1cbiAgICAgICAgcmVzcG9uc2VTdHJpbmcgKz0gZHJvcHBhYmxlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VTdHJpbmc7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1pbnRlcmFjdGlvbi1yZXNwb25zZScsIHtcbiAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgcmVzcG9uc2VJZGVudGlmaWVyOiB0aGlzLnJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICAgIHJlc3BvbnNlXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIERyYWdEcm9wSW50ZXJhY3Rpb25FbGVtZW50IGFzIENvbnN0cnVjdG9yPElJbnRlcmFjdGlvbj4gJiBUO1xufTtcbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHsgcmVtb3ZlRG91YmxlU2xhc2hlcyB9IGZyb20gJy4uLy4uL2ludGVybmFsL3V0aWxzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1jdXN0b20taW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUN1c3RvbUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBwcml2YXRlIHJhd1Jlc3BvbnNlOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdyZXNwb25zZS1pZGVudGlmaWVyJyB9KVxuICByZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2RhdGEnIH0pXG4gIGRhdGE6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2RhdGEtYmFzZS1pdGVtJyB9KVxuICBiYXNlSXRlbVVybDogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZGF0YS1iYXNlLXJlZicgfSlcbiAgYmFzZVJlZlVybDogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnaWQnIH0pXG4gIGlkOiBzdHJpbmc7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfZXJyb3JNZXNzYWdlOiBzdHJpbmcgPSBudWxsO1xuXG4gIHByaXZhdGUgY2hhbm5lbCA9IG5ldyBCcm9hZGNhc3RDaGFubmVsKCdjZXNfY2hhbm5lbCcpO1xuXG4gIG1hbmlmZXN0OiB7XG4gICAgc2NyaXB0OiBzdHJpbmdbXTtcbiAgICBzdHlsZTogc3RyaW5nW107XG4gICAgbWVkaWE6IHN0cmluZ1tdO1xuICB9O1xuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICBjb25zdCB1cmlUb01hbmlmZXN0ID0gdGhpcy5kYXRhLnN0YXJ0c1dpdGgoJ2h0dHAnKVxuICAgICAgPyB0aGlzLmRhdGFcbiAgICAgIDogcmVtb3ZlRG91YmxlU2xhc2hlcyh0aGlzLmJhc2VJdGVtVXJsICsgJy8nICsgdGhpcy5kYXRhKTtcbiAgICAvLyBmZXRjaCB0aGUganNvbiBmaWxlIGxvY2F0ZWQgYXQgdGhlIGRhdGEgYXR0cmlidXRlXG4gICAgZmV0Y2godXJpVG9NYW5pZmVzdClcbiAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmpzb24oKSlcbiAgICAgIC50aGVuKGRhdGEgPT4ge1xuICAgICAgICB0aGlzLm1hbmlmZXN0ID0gZGF0YTtcbiAgICAgICAgdGhpcy5zZXR1cENFUygpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICB0aGlzLl9lcnJvck1lc3NhZ2UgPSBlcnI7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIE1IOiBDaGFuZ2VkIHRoZSBkZWZhdWx0IGJvb3RzdHJhcC5qcyB0byB1c2UgdGhlIG5ldyBDRVMgQVBJXG4gIC8vIEJlY2F1c2UgdGhlIG9sZCBvbmUgdXNlcyB0aGUgZ2xvYmFsIENFUyBvYmplY3QgdGhhdCBpcyBub3QgYWxsb3dlZCB0byBiZSBhY2Nlc3NlZCB3aGVuIHRoZSBDSVxuICAvLyBpcyBlbWJlZGRlZCBpbiBhbiBpZnJhbWUgYW5kIGNvbWluZyBmcm9tIGFub3RoZXIgZG9tYWluXG4gIC8vIFRoZXJlZm9yIHdlIG5lZWQgdG8gdXNlIHRoZSBuZXcgQ0VTIEFQSSB0byBjb21tdW5pY2F0ZXMgdmlhIHRoZSBicm9hZGNhc3QgQVBJXG4gIHNldHVwQ0VTKCkge1xuICAgIGNvbnN0IGlmcmFtZSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCcjcGNpQ29udGFpbmVyJykgYXMgSFRNTElGcmFtZUVsZW1lbnQsXG4gICAgICBpZnJhbWVXaW4gPSBpZnJhbWUuY29udGVudFdpbmRvdyB8fCBpZnJhbWUsXG4gICAgICBpZnJhbWVEb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50O1xuXG4gICAgLy8gY29uc3QgY2hhbm5lbCA9IG5ldyBCcm9hZGNhc3RDaGFubmVsKCdjZXNfY2hhbm5lbCcpO1xuICAgIHRoaXMuY2hhbm5lbC5vbm1lc3NhZ2UgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgY29uc3QgeyB0eXBlLCBkYXRhIH0gPSBldmVudC5kYXRhO1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgJ3NldFJlc3BvbnNlJzpcbiAgICAgICAgICB0aGlzLnJhd1Jlc3BvbnNlID0gZGF0YTtcbiAgICAgICAgICB0aGlzLnNhdmVSZXNwb25zZShkYXRhKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZ2V0UmVzcG9uc2UnOlxuICAgICAgICAgIHRoaXMuY2hhbm5lbC5wb3N0TWVzc2FnZSh7IHR5cGU6ICdyZXNwb25zZURhdGEnLCBkYXRhOiB0aGlzLnJhd1Jlc3BvbnNlIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdnZXRNZWRpYSc6IHtcbiAgICAgICAgICBjb25zdCBtZWRpYURhdGEgPSB0aGlzLm1hbmlmZXN0Lm1lZGlhLm1hcChtZWRpYSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSBtZWRpYS5zdGFydHNXaXRoKCdodHRwJykgPyBtZWRpYSA6IHJlbW92ZURvdWJsZVNsYXNoZXModGhpcy5iYXNlUmVmVXJsICsgJy8nICsgbWVkaWEpO1xuICAgICAgICAgICAgcmV0dXJuIHVybDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmNoYW5uZWwucG9zdE1lc3NhZ2UoeyB0eXBlOiAnbWVkaWFEYXRhJywgZGF0YTogbWVkaWFEYXRhIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3NldFN0YWdlSGVpZ2h0JzpcbiAgICAgICAgICBjb25zb2xlLmxvZygnc2V0U3RhZ2VIZWlnaHQgbm90IGltcGxlbWVudGVkJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmcmFtZURvYy5vcGVuKCk7XG4gICAgaWZyYW1lRG9jLndyaXRlKGBcbiAgICAgIDxodG1sPlxuICAgICAgICA8aGVhZD5cbiAgICAgICAgICA8bGluayBocmVmPScke3JlbW92ZURvdWJsZVNsYXNoZXMoYCR7dGhpcy5iYXNlUmVmVXJsfS8ke3RoaXMubWFuaWZlc3Quc3R5bGVbMF19YCl9JyByZWw9XCJzdHlsZXNoZWV0XCIgLz5cbiAgICAgICAgICA8c2NyaXB0IHNyYz0nJHtyZW1vdmVEb3VibGVTbGFzaGVzKGAke3RoaXMuYmFzZVJlZlVybH0vJHt0aGlzLm1hbmlmZXN0LnNjcmlwdFswXX1gKX0nPjwvc2NyaXB0PlxuICAgICAgICA8L2hlYWQ+XG4gICAgICAgIDxib2R5PjwvYm9keT5cbiAgICAgIDwvaHRtbD5cbiAgICAgIGApO1xuXG4gICAgaWZyYW1lRG9jLmNsb3NlKCk7XG4gIH1cblxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yYXdSZXNwb25zZSAhPT0gJyc7XG4gIH1cblxuICBzZXQgcmVzcG9uc2UodmFsOiBSZWFkb25seTxzdHJpbmcgfCBzdHJpbmdbXT4pIHtcbiAgICB0aGlzLnJhd1Jlc3BvbnNlID0gdmFsIGFzIHN0cmluZztcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHRoaXMuY2hhbm5lbC5jbG9zZSgpO1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPGlmcmFtZVxuICAgICAgICB3aWR0aD0ke3RoaXMuZ2V0QXR0cmlidXRlKCd3aWR0aCcpfVxuICAgICAgICBoZWlnaHQ9JHt0aGlzLmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jyl9XG4gICAgICAgIGZyYW1lYm9yZGVyPVwiMFwiXG4gICAgICAgIHRpdGxlPVwicGNpQ29udGFpbmVyXCJcbiAgICAgICAgaWQ9XCJwY2lDb250YWluZXJcIlxuICAgICAgPlxuICAgICAgPC9pZnJhbWU+XG4gICAgICAke3RoaXMuX2Vycm9yTWVzc2FnZSAmJlxuICAgICAgaHRtbGA8ZGl2IHN0eWxlPVwiY29sb3I6cmVkXCI+XG4gICAgICAgIDxoMT5FcnJvcjwvaDE+XG4gICAgICAgICR7dGhpcy5fZXJyb3JNZXNzYWdlfVxuICAgICAgPC9kaXY+YH1gO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jdXN0b20taW50ZXJhY3Rpb24nOiBRdGlDdXN0b21JbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbkBjdXN0b21FbGVtZW50KCdxdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUVuZEF0dGVtcHRJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjb3VudC1hdHRlbXB0JyB9KVxuICBwdWJsaWMgY291bnRBdHRlbXB0OiBzdHJpbmcgPSAndHJ1ZSc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gIHB1YmxpYyB0aXRsZTogJ2VuZCBhdHRlbXB0JztcblxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICAvLyB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgc2V0IHJlc3BvbnNlKHZhbDogdW5kZWZpbmVkKSB7XG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxidXR0b24gP2Rpc2FibGVkPSR7dGhpcy5kaXNhYmxlZH0gcGFydD1cImJ1dHRvblwiIEBjbGljaz0ke3RoaXMuZW5kQXR0ZW1wdH0+JHt0aGlzLnRpdGxlfTwvYnV0dG9uPmA7XG4gIH1cbiAgcHVibGljIGVuZEF0dGVtcHQoZTogRXZlbnQpIHtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ2VuZC1hdHRlbXB0Jywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7IHJlc3BvbnNlSWRlbnRpZmllcjogdGhpcy5yZXNwb25zZUlkZW50aWZpZXIsIGNvdW50QXR0ZW1wdDogdGhpcy5jb3VudEF0dGVtcHQgPT09ICd0cnVlJyB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uJzogUXRpRW5kQXR0ZW1wdEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUdhcE1hdGNoSW50ZXJhY3Rpb24gZXh0ZW5kcyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1nYXAtdGV4dCcsIGZhbHNlLCAncXRpLWdhcCcpIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgICAgICBnYXA6IDAuNXJlbTtcbiAgICAgIH1cblxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLXRvcCkge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgfVxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLWJvdHRvbSkge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtbGVmdCkge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgfVxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLXJpZ2h0KSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTtcbiAgICAgIH1cbiAgICAgIFtwYXJ0PSdkcmFncyddLFxuICAgICAgW3BhcnQ9J2Ryb3BzJ10ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgZ2FwOiAwLjVyZW07XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgcGFydD1cImRyYWdzXCIgbmFtZT1cInF0aS1nYXAtdGV4dFwiPjwvc2xvdD5cbiAgICAgIDxzbG90IHBhcnQ9XCJkcm9wc1wiPjwvc2xvdD5gO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nOiBRdGlHYXBNYXRjaEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiLyogZXNsaW50LWRpc2FibGUgbGl0L25vLWludmFsaWQtaHRtbCAqL1xuaW1wb3J0IHsgY3NzLCBodG1sLCBzdmcgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcXVlcnksIHF1ZXJ5QXNzaWduZWRFbGVtZW50cywgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBpZkRlZmluZWQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9pZi1kZWZpbmVkLmpzJztcbmltcG9ydCB7IHJlcGVhdCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3JlcGVhdC5qcyc7XG5pbXBvcnQgeyBwb3NpdGlvbkhvdHNwb3RzIH0gZnJvbSAnLi4vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlHcmFwaGljQXNzb2NpYXRlSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIGNob2ljZU9yZGVyaW5nOiBib29sZWFuO1xuICBob3RzcG90cztcbiAgc3RhcnRQb2ludCA9IG51bGw7XG4gIGVuZFBvaW50ID0gbnVsbDtcbiAgQHN0YXRlKCkgX2xpbmVzID0gW107XG4gIEBzdGF0ZSgpIHN0YXJ0Q29vcmQ6IHsgeDogYW55OyB5OiBhbnkgfTtcbiAgQHN0YXRlKCkgbW91c2VDb29yZDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xuICBAcXVlcnkoJ3N2ZycpIHN2Z0NvbnRhaW5lcjtcbiAgQHF1ZXJ5QXNzaWduZWRFbGVtZW50cyh7IHNlbGVjdG9yOiAnaW1nJyB9KSBnckltYWdlO1xuXG4gIC8vIHRhcmdldCB0aGUgbWFpbiBzbG90IG1ha2UgaXQgcmVsYXRpdmUgYW5kIGZpdCB3aXRoIHRoZSBjb250ZW5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICBzbG90Om5vdChbbmFtZT0ncHJvbXB0J10pIHtcbiAgICAgICAgLy8gcG9zaXRpb246IHJlbGF0aXZlOyAvKiBxdGktaG90c3BvdC1jaG9pY2UgcmVsYXRpdmUgdG8gdGhlIHNsb3QgKi9cbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiBmaXQtY29udGVudDsgLyogaG90c3BvdHMgbm90IHN0cmV0Y2hpbmcgZnVydGhlciBpZiBpbWFnZSBpcyBhdCBtYXggc2l6ZSAqL1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKGltZykge1xuICAgICAgICAvKiBpbWFnZSBub3Qgc2VsZWN0YWJsZSBhbnltb3JlICovXG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIH1cbiAgICAgIDo6c2xvdHRlZChxdGktYXNzb2NpYWJsZS1ob3RzcG90KSB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgICAgfVxuICAgICAgbGluZS1jb250YWluZXIge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgICAgc3ZnIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB0b3A6IDBweDtcbiAgICAgICAgbGVmdDogMHB4O1xuICAgICAgfVxuICAgIGBcbiAgXTtcbiAgc3ZnOiBTVkdTVkdFbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItaG90c3BvdCcsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9saW5lcyA9IFtdO1xuICB9XG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9saW5lcy5sZW5ndGggPiAwO1xuICB9XG4gIHNldCByZXNwb25zZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgdGhpcy5fbGluZXMgPSB2YWw7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8bGluZS1jb250YWluZXI+XG4gICAgICAgIDxzdmdcbiAgICAgICAgICB3aWR0aD0ke2lmRGVmaW5lZCh0aGlzLmdySW1hZ2VbMF0/LndpZHRoKX1cbiAgICAgICAgICBoZWlnaHQ9JHtpZkRlZmluZWQodGhpcy5nckltYWdlWzBdPy5oZWlnaHQpfVxuICAgICAgICAgIHZpZXdib3g9XCIwIDAgJHt0aGlzLmdySW1hZ2VbMF0/LndpZHRofSAke3RoaXMuZ3JJbWFnZVswXT8uaGVpZ2h0fVwiXG4gICAgICAgID5cbiAgICAgICAgICAke3JlcGVhdChcbiAgICAgICAgICAgIHRoaXMuX2xpbmVzLFxuICAgICAgICAgICAgbGluZSA9PiBsaW5lLFxuICAgICAgICAgICAgKGxpbmUsIGluZGV4KSA9PiBzdmdgXG4gICAgICAgICAgICAgIDxsaW5lXG4gICAgICAgICAgICAgICAgcGFydD1cImxpbmVcIlxuICAgICAgICAgICAgICAgIHgxPSR7cGFyc2VJbnQodGhpcy5xdWVyeVNlbGVjdG9yPFNWR0xpbmVFbGVtZW50PignW2lkZW50aWZpZXI9JyArIGxpbmUuc3BsaXQoJyAnKVswXSArICddJykuc3R5bGUubGVmdCl9XG4gICAgICAgICAgICAgICAgeTE9JHtwYXJzZUludCh0aGlzLnF1ZXJ5U2VsZWN0b3I8U1ZHTGluZUVsZW1lbnQ+KCdbaWRlbnRpZmllcj0nICsgbGluZS5zcGxpdCgnICcpWzBdICsgJ10nKS5zdHlsZS50b3ApfVxuICAgICAgICAgICAgICAgIHgyPSR7cGFyc2VJbnQodGhpcy5xdWVyeVNlbGVjdG9yPFNWR0xpbmVFbGVtZW50PignW2lkZW50aWZpZXI9JyArIGxpbmUuc3BsaXQoJyAnKVsxXSArICddJykuc3R5bGUubGVmdCl9XG4gICAgICAgICAgICAgICAgeTI9JHtwYXJzZUludCh0aGlzLnF1ZXJ5U2VsZWN0b3I8U1ZHTGluZUVsZW1lbnQ+KCdbaWRlbnRpZmllcj0nICsgbGluZS5zcGxpdCgnICcpWzFdICsgJ10nKS5zdHlsZS50b3ApfVxuICAgICAgICAgICAgICAgIHN0cm9rZT1cInJlZFwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiXG4gICAgICAgICAgICAgICAgQGNsaWNrPSR7KGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5fbGluZXMgPSB0aGlzLl9saW5lcy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX2xpbmVzKTtcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgYFxuICAgICAgICAgICl9XG4gICAgICAgICAgJHt0aGlzLnN0YXJ0UG9pbnQgJiZcbiAgICAgICAgICBzdmdgPGxpbmVcbiAgICAgICAgICAgIHBhcnQ9XCJwb2ludFwiXG4gICAgICAgICAgICB4MT0ke3RoaXMuc3RhcnRDb29yZC54fVxuICAgICAgICAgICAgeTE9JHt0aGlzLnN0YXJ0Q29vcmQueX1cbiAgICAgICAgICAgIHgyPSR7dGhpcy5tb3VzZUNvb3JkLnh9XG4gICAgICAgICAgICB5Mj0ke3RoaXMubW91c2VDb29yZC55fVxuICAgICAgICAgICAgc3Ryb2tlPVwicmVkXCJcbiAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIlxuICAgICAgICAgIC8+YH1cbiAgICAgICAgPC9zdmc+XG4gICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwvbGluZS1jb250YWluZXI+YDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Ib3RzcG90T25SZWdpc3RlcihlOiBDdXN0b21FdmVudDxRdGlIb3RzcG90Q2hvaWNlPik6IHZvaWQge1xuICAgIGNvbnN0IGltZyA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJykgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICBjb25zdCBob3RzcG90ID0gZS50YXJnZXQgYXMgUXRpSG90c3BvdENob2ljZTtcbiAgICBjb25zdCBjb29yZHMgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJyk7XG4gICAgY29uc3Qgc2hhcGUgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnc2hhcGUnKTtcbiAgICBjb25zdCBjb29yZHNOdW1iZXIgPSBjb29yZHMuc3BsaXQoJywnKS5tYXAocyA9PiBwYXJzZUludChzKSk7XG4gICAgcG9zaXRpb25Ib3RzcG90cyhzaGFwZSwgY29vcmRzTnVtYmVyLCBpbWcsIGhvdHNwb3QpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGUpOiB2b2lkIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoZSk7XG5cbiAgICB0aGlzLmhvdHNwb3RzID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktYXNzb2NpYWJsZS1ob3RzcG90Jyk7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBldmVudCA9PiB7XG4gICAgICB0aGlzLm1vdXNlQ29vcmQgPSB7XG4gICAgICAgIHg6IGV2ZW50LmNsaWVudFggLSB0aGlzLmdySW1hZ2VbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCxcbiAgICAgICAgeTogZXZlbnQuY2xpZW50WSAtIHRoaXMuZ3JJbWFnZVswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3BcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICB0aGlzLmhvdHNwb3RzLmZvckVhY2goaG90c3BvdCA9PiB7XG4gICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJykuc3BsaXQoJywnKVswXSArICdweCc7XG4gICAgICBob3RzcG90LnN0eWxlLnRvcCA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKS5zcGxpdCgnLCcpWzFdICsgJ3B4JztcblxuICAgICAgaG90c3BvdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0UG9pbnQpIHtcbiAgICAgICAgICB0aGlzLnN0YXJ0UG9pbnQgPSBldmVudC50YXJnZXQ7XG5cbiAgICAgICAgICB0aGlzLnN0YXJ0Q29vcmQgPSB7XG4gICAgICAgICAgICB4OiB0aGlzLnN0YXJ0UG9pbnQuZ2V0QXR0cmlidXRlKCdjb29yZHMnKS5zcGxpdCgnLCcpWzBdLFxuICAgICAgICAgICAgeTogdGhpcy5zdGFydFBvaW50LmdldEF0dHJpYnV0ZSgnY29vcmRzJykuc3BsaXQoJywnKVsxXVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZW5kUG9pbnQpIHtcbiAgICAgICAgICB0aGlzLmVuZFBvaW50ID0gZXZlbnQudGFyZ2V0O1xuXG4gICAgICAgICAgdGhpcy5fbGluZXMgPSBbXG4gICAgICAgICAgICAuLi50aGlzLl9saW5lcyxcbiAgICAgICAgICAgIHRoaXMuc3RhcnRQb2ludC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSArICcgJyArIHRoaXMuZW5kUG9pbnQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJylcbiAgICAgICAgICBdO1xuICAgICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX2xpbmVzKTtcbiAgICAgICAgICB0aGlzLnN0YXJ0UG9pbnQgPSBudWxsO1xuICAgICAgICAgIHRoaXMuZW5kUG9pbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic6IFF0aUdyYXBoaWNBc3NvY2lhdGVJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi8uLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gcG9zaXRpb25Ib3RzcG90cyhcbiAgc2hhcGU6IHN0cmluZyxcbiAgY29vcmRzTnVtYmVyOiBudW1iZXJbXSxcbiAgaW1nOiBIVE1MSW1hZ2VFbGVtZW50LFxuICBob3RzcG90OiBRdGlIb3RzcG90Q2hvaWNlXG4pIHtcbiAgc3dpdGNoIChzaGFwZSkge1xuICAgIGNhc2UgJ2NpcmNsZSc6XG4gICAgICB7XG4gICAgICAgIGNvbnN0IFtjZW50ZXJYLCBjZW50ZXJZLCByYWRpdXNdID0gY29vcmRzTnVtYmVyO1xuICAgICAgICBjb25zdCBjZW50ZXJYUGVyID0gKGNlbnRlclggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCBjZW50ZXJZUGVyID0gKGNlbnRlclkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgY29uc3QgcmFkaXVzUGVyID0gKHJhZGl1cyAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IGNlbnRlclhQZXIgLSByYWRpdXNQZXIgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gY2VudGVyWVBlciAtIHJhZGl1c1BlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IGhvdHNwb3Quc3R5bGUuaGVpZ2h0ID0gNCAqIHJhZGl1c1BlciArICdweCc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUuYm9yZGVyUmFkaXVzID0gYDk5OTlweGA7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3JlY3QnOlxuICAgICAge1xuICAgICAgICBjb25zdCBbbGVmdFgsIHRvcFksIHJpZ2h0WCwgYm90dG9tWV0gPSBjb29yZHNOdW1iZXI7XG4gICAgICAgIGNvbnN0IGxlZnRYUGVyID0gKGxlZnRYIC8gaW1nLndpZHRoKSAqIDEwMDtcbiAgICAgICAgY29uc3QgdG9wWVBlciA9ICh0b3BZIC8gaW1nLmhlaWdodCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IHJpZ2h0WFBlciA9IChyaWdodFggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCBib3R0b21ZUGVyID0gKGJvdHRvbVkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgaG90c3BvdC5zdHlsZS5sZWZ0ID0gbGVmdFhQZXIgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gdG9wWVBlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IHJpZ2h0WFBlciAtIGxlZnRYUGVyICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLmhlaWdodCA9IGJvdHRvbVlQZXIgLSB0b3BZUGVyICsgJyUnO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdwb2x5JzpcbiAgICAgIHtcbiAgICAgICAgLy8gZnJvbSBhLGIsYyxkLGUsZiA9PiBbe3g6YSwgeTpifSx7eDpjLCB5OmR9LHt4OmUsIHk6Zn1dXG4gICAgICAgIGNvbnN0IHBvbHljb29yZHMgPSBjb29yZHNOdW1iZXIucmVkdWNlKChhY2MsIGN1cnJlbnRWYWx1ZSwgY3VycmVudEluZGV4LCBwb2x5QykgPT4ge1xuICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggJSAyID09PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0VmFsID0gYWNjLnBvcCgpO1xuICAgICAgICAgICAgYWNjW2FjYy5sZW5ndGhdID0geyB4OiBsYXN0VmFsLCB5OiBwb2x5Q1tjdXJyZW50SW5kZXhdIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIFtdKTtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgYm91bmRpbmcgYm94IGJ5IGZpbmRpbmcgdGhlIG1heCBheCBtaW4gY29vcmRpbmF0ZXMgb2YgeCBhbmQgeVxuICAgICAgICBjb25zdCBsZWZ0WCA9IE1hdGgubWluKC4uLnBvbHljb29yZHMubWFwKHBvaW50ID0+IHBvaW50LngpKTtcbiAgICAgICAgY29uc3QgcmlnaHRYID0gTWF0aC5tYXgoLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueCkpO1xuICAgICAgICBjb25zdCB0b3BZID0gTWF0aC5taW4oLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueSkpO1xuICAgICAgICBjb25zdCBib3R0b21ZID0gTWF0aC5tYXgoLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueSkpO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgcmVsYXRpdmUgZGlzdGFuY2UgY2F1c2Ugd2Ugd2FudCB0byB1c2UgcGVyY2VudGFnZXNcbiAgICAgICAgY29uc3QgbGVmdFhQZXIgPSAobGVmdFggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCB0b3BZUGVyID0gKHRvcFkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgY29uc3QgcmlnaHRYUGVyID0gKHJpZ2h0WCAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IGJvdHRvbVlQZXIgPSAoYm90dG9tWSAvIGltZy5oZWlnaHQpICogMTAwO1xuXG4gICAgICAgIC8vIHNldCB0aGUgaG90c3BvdCBvbiB4LHkgYW5kIHNldCB0aGUgd2lkdGggYW5kIGhlaWdodCBpbiBwZXJjZW50YWdlc1xuICAgICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSAobGVmdFggLyBpbWcud2lkdGgpICogMTAwICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLnRvcCA9ICh0b3BZIC8gaW1nLmhlaWdodCkgKiAxMDAgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUud2lkdGggPSByaWdodFhQZXIgLSBsZWZ0WFBlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS5oZWlnaHQgPSBib3R0b21ZUGVyIC0gdG9wWVBlciArICclJztcblxuICAgICAgICAvLyBhbGwgdGhlIHBvbHlnb24gcG9pbnRzIHNob3VsZCBiZSBjb3JyZWN0ZWQgY2F1c2VkIHRoZXkgYXJlIGZyb21cbiAgICAgICAgLy8gaW1hZ2UgMCwwIHBvaW50LCBhbmQgc2hvdWxkIGJlIGZyb20gdGhlIGhvdHNwb3QgcG9pbnQgd2hpY2ggYWxyZWFkeVxuICAgICAgICAvLyBoYXMgYmVlbiBvZmZzZXR0ZWQgZnJvbSB0aGUgaW1hZ2UgaW4gdGhlIHByZXZpb3VzIGZldyBsaW5lcyBvZiBjb2RlXG4gICAgICAgIC8vIGFsc28gdGhlIHBvaW50cyBoYXZlIGEgcmVsYXRpdmUgZGlzdGFuY2UgdG8gdGhlIGltYWdlLCBidXQgbm93IGhhdmVcbiAgICAgICAgLy8gdG8gaGF2ZSBhIHJlbGF0aXZlIGRpc3RhbmNlIGZyb20gdGhlIHdpZHRoIG9mIHRoZSBob3RzcG90XG4gICAgICAgIGNvbnN0IHBvbHlnb25EYXRhID0gcG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gKHtcbiAgICAgICAgICB4OiAoKHBvaW50LnggLSBsZWZ0WCkgLyAocmlnaHRYIC0gbGVmdFgpKSAqIDEwMCxcbiAgICAgICAgICB5OiAoKHBvaW50LnkgLSB0b3BZKSAvIChib3R0b21ZIC0gdG9wWSkpICogMTAwXG4gICAgICAgIH0pKTtcblxuICAgICAgICAvLyBjcmVhdGUgY2xpcCBwYXRoIGNvb3JkaW5hdGUgc3R5bGUgaW4gcGVyY2VudGFnZXNcbiAgICAgICAgY29uc3QgcG9seUQgPSBwb2x5Z29uRGF0YS5tYXAocCA9PiBNYXRoLnJvdW5kKHAueCkgKyAnJSAnICsgTWF0aC5yb3VuZChwLnkpICsgJyUnKS5qb2luKCcsJyk7XG5cbiAgICAgICAgLy8gNTAlIDAlLCAxMDAlIDUwJSwgNTAlIDEwMCUsIDAlIDUwJVxuICAgICAgICBob3RzcG90LnN0eWxlLmNsaXBQYXRoID0gYHBvbHlnb24oJHtwb2x5RH0pYDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluJztcbmltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlHcmFwaGljR2FwTWF0Y2hJbnRlcmFjdGlvbiBleHRlbmRzIERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbihcbiAgTGl0RWxlbWVudCxcbiAgJ3F0aS1nYXAtaW1nJyxcbiAgZmFsc2UsXG4gICdxdGktYXNzb2NpYWJsZS1ob3RzcG90J1xuKSB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIH1cbiAgICBzbG90W25hbWU9J3F0aS1nYXAtaW1nJ10ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGdhcDogMXJlbTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdD48L3Nsb3Q+XG4gICAgICA8c2xvdCBuYW1lPVwicXRpLWdhcC1pbWdcIj48L3Nsb3Q+YDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Ib3RzcG90T25SZWdpc3RlcihlOiBDdXN0b21FdmVudDxudWxsPik6IHZvaWQge1xuICAgIGNvbnN0IGltZyA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJykgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICBjb25zdCBob3RzcG90ID0gZS50YXJnZXQgYXMgUXRpSG90c3BvdENob2ljZTtcbiAgICBjb25zdCBjb29yZHMgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJyk7XG4gICAgY29uc3Qgc2hhcGUgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnc2hhcGUnKTtcbiAgICBjb25zdCBjb29yZHNOdW1iZXIgPSBjb29yZHMuc3BsaXQoJywnKS5tYXAocyA9PiBwYXJzZUludChzKSk7XG5cbiAgICAvLyBwb3NpdGlvbkhvdHNwb3RzKHNoYXBlLCBjb29yZHNOdW1iZXIsIGltZywgaG90c3BvdCk7XG4gICAgc3dpdGNoIChzaGFwZSkge1xuICAgICAgY2FzZSAnY2lyY2xlJzpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IFtjZW50ZXJYLCBjZW50ZXJZLCByYWRpdXNdID0gY29vcmRzTnVtYmVyO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IGNlbnRlclggLSByYWRpdXMgKyAncHgnO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gY2VudGVyWSAtIHJhZGl1cyArICdweCc7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IGhvdHNwb3Quc3R5bGUuaGVpZ2h0ID0gMiAqIHJhZGl1cyArICdweCc7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3JlY3QnOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgW2xlZnRYLCB0b3BZLCByaWdodFgsIGJvdHRvbVldID0gY29vcmRzTnVtYmVyO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IGxlZnRYICsgJ3B4JztcbiAgICAgICAgICBob3RzcG90LnN0eWxlLnRvcCA9IHRvcFkgKyAncHgnO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUud2lkdGggPSByaWdodFggLSBsZWZ0WCArICdweCc7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS5oZWlnaHQgPSBib3R0b21ZIC0gdG9wWSArICdweCc7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItaG90c3BvdCcsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1ob3RzcG90JywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nOiBRdGlHcmFwaGljR2FwTWF0Y2hJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBDaG9pY2VzIH0gZnJvbSAnLi4vaW50ZXJuYWwvY2hvaWNlcy9jaG9pY2VzJztcbmltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuXG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcG9zaXRpb25Ib3RzcG90cyB9IGZyb20gJy4uL2ludGVybmFsL2hvdHNwb3RzL2hvdHNwb3QnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUdyYXBoaWNPcmRlckludGVyYWN0aW9uIGV4dGVuZHMgQ2hvaWNlcyB7XG4gIGNob2ljZU9yZGVyaW5nOiBib29sZWFuO1xuXG4gIC8vIGRvIG5vdCBzZWxlY3QgKCBoaWdobGlnaHQgYmx1ZSwgdGhlIGltYWdlKVxuICAvLyB0YXJnZXQgdGhlIG1haW4gc2xvdCBtYWtlIGl0IHJlbGF0aXZlIGFuZCBmaXQgd2l0aCB0aGUgY29udGVuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgc2xvdDpub3QoW25hbWU9J3Byb21wdCddKSB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgLyogcXRpLWhvdHNwb3QtY2hvaWNlIHJlbGF0aXZlIHRvIHRoZSBzbG90ICovXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB3aWR0aDogZml0LWNvbnRlbnQ7IC8qIGhvdHNwb3RzIG5vdCBzdHJldGNoaW5nIGZ1cnRoZXIgaWYgaW1hZ2UgaXMgYXQgbWF4IHNpemUgKi9cbiAgICAgIH1cbiAgICAgIDo6c2xvdHRlZChpbWcpIHtcbiAgICAgICAgLyogaW1hZ2Ugbm90IHNlbGVjdGFibGUgYW55bW9yZSAqL1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBwcm9tcHQgLS0+XG4gICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBpbWFnZSBhbmQgaG90c3BvdHMgLS0+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SG90c3BvdE9yZGVyKGU6IEN1c3RvbUV2ZW50PHsgaWRlbnRpZmllcjogc3RyaW5nOyBjaGVja2VkOiBib29sZWFuIH0+KTogdm9pZCB7XG4gICAgY29uc3QgeyBpZGVudGlmaWVyIH0gPSBlLmRldGFpbDtcblxuICAgIGNvbnN0IGhvdHNwb3QgPSB0aGlzLl9jaG9pY2VFbGVtZW50cy5maW5kKGVsID0+IGVsLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpID09PSBpZGVudGlmaWVyKSBhcyBRdGlIb3RzcG90Q2hvaWNlO1xuXG4gICAgY29uc3QgbWF4U2VsZWN0aW9uID0gdGhpcy5fY2hvaWNlRWxlbWVudHMubGVuZ3RoO1xuICAgIGlmICghdGhpcy5jaG9pY2VPcmRlcmluZykge1xuICAgICAgdGhpcy5jaG9pY2VPcmRlcmluZyA9IHRydWU7XG4gICAgICBpZiAoaG90c3BvdC5vcmRlciA9PSBudWxsKSB7XG4gICAgICAgIGlmICgodGhpcy5fY2hvaWNlRWxlbWVudHMgYXMgUXRpSG90c3BvdENob2ljZVtdKS5maWx0ZXIoaSA9PiBpLm9yZGVyID4gMCkubGVuZ3RoID49IG1heFNlbGVjdGlvbikge1xuICAgICAgICAgIHRoaXMuY2hvaWNlT3JkZXJpbmcgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm47IC8vIGRvbid0IGRvIGFueXRoaW5nIGlmIHVzZXIgYWxyZWFkeSBzZWxlY3RlZCA1IGltYWdlcy5cbiAgICAgICAgfVxuICAgICAgICBob3RzcG90Lm9yZGVyID0gKHRoaXMuX2Nob2ljZUVsZW1lbnRzIGFzIFF0aUhvdHNwb3RDaG9pY2VbXSkuZmlsdGVyKGkgPT4gISFpLm9yZGVyKS5sZW5ndGggKyAxO1xuICAgICAgICB0aGlzLmNob2ljZU9yZGVyaW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICh0aGlzLl9jaG9pY2VFbGVtZW50cyBhcyBRdGlIb3RzcG90Q2hvaWNlW10pLmZvckVhY2goaG90c3BvdCA9PiB7XG4gICAgICAgICAgaWYgKGhvdHNwb3Qub3JkZXIgPiBob3RzcG90Lm9yZGVyKSB7XG4gICAgICAgICAgICBob3RzcG90Lm9yZGVyLS07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBob3RzcG90O1xuICAgICAgICB9KTtcbiAgICAgICAgaG90c3BvdC5vcmRlciA9IG51bGw7XG4gICAgICB9XG4gICAgICB0aGlzLmNob2ljZU9yZGVyaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKGU6IEN1c3RvbUV2ZW50PFF0aUhvdHNwb3RDaG9pY2U+KTogdm9pZCB7XG4gICAgY29uc3QgaW1nID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdpbWcnKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIGNvbnN0IGhvdHNwb3QgPSBlLnRhcmdldCBhcyBRdGlIb3RzcG90Q2hvaWNlO1xuICAgIGNvbnN0IGNvb3JkcyA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKTtcbiAgICBjb25zdCBzaGFwZSA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdzaGFwZScpO1xuICAgIGNvbnN0IGNvb3Jkc051bWJlciA9IGNvb3Jkcy5zcGxpdCgnLCcpLm1hcChzID0+IHBhcnNlSW50KHMpKTtcblxuICAgIHBvc2l0aW9uSG90c3BvdHMoc2hhcGUsIGNvb3Jkc051bWJlciwgaW1nLCBob3RzcG90KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktY2hvaWNlLWVsZW1lbnQtc2VsZWN0ZWQnLCB0aGlzLnNldEhvdHNwb3RPcmRlcik7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItY2hvaWNlJywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigncXRpLWNob2ljZS1lbGVtZW50LXNlbGVjdGVkJywgdGhpcy5zZXRIb3RzcG90T3JkZXIpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWNob2ljZScsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24nOiBRdGlHcmFwaGljT3JkZXJJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQ2hvaWNlcyB9IGZyb20gJy4uL2ludGVybmFsL2Nob2ljZXMvY2hvaWNlcyc7XG5pbXBvcnQgeyBwb3NpdGlvbkhvdHNwb3RzIH0gZnJvbSAnLi4vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdCc7XG5pbXBvcnQgeyBRdGlIb3RzcG90Q2hvaWNlIH0gZnJvbSAnLi4vcXRpLWhvdHNwb3QtY2hvaWNlJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1ob3RzcG90LWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlIb3RzcG90SW50ZXJhY3Rpb24gZXh0ZW5kcyBDaG9pY2VzIHtcbiAgLy8gZG8gbm90IHNlbGVjdCAoIGhpZ2hsaWdodCBibHVlLCB0aGUgaW1hZ2UpXG4gIC8vIHRhcmdldCB0aGUgbWFpbiBzbG90IG1ha2UgaXQgcmVsYXRpdmUgYW5kIGZpdCB3aXRoIHRoZSBjb250ZW5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICBzbG90Om5vdChbbmFtZT0ncHJvbXB0J10pIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOyAvKiBxdGktaG90c3BvdC1jaG9pY2UgcmVsYXRpdmUgdG8gdGhlIHNsb3QgKi9cbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiBmaXQtY29udGVudDsgLyogaG90c3BvdHMgbm90IHN0cmV0Y2hpbmcgZnVydGhlciBpZiBpbWFnZSBpcyBhdCBtYXggc2l6ZSAqL1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKGltZykge1xuICAgICAgICAvKiBpbWFnZSBub3Qgc2VsZWN0YWJsZSBhbnltb3JlICovXG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgLyogd2lkdGg6MTAwJTsgKi9cbiAgICAgIH1cbiAgICBgXG4gIF07XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBwcm9tcHQgLS0+XG4gICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBpbWFnZSBhbmQgaG90c3BvdHMgLS0+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Ib3RzcG90T25SZWdpc3RlcihlOiBDdXN0b21FdmVudDxRdGlIb3RzcG90Q2hvaWNlPik6IHZvaWQge1xuICAgIGNvbnN0IGltZyA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJykgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICBjb25zdCBob3RzcG90ID0gZS50YXJnZXQgYXMgUXRpSG90c3BvdENob2ljZTtcbiAgICBjb25zdCBjb29yZHMgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJyk7XG4gICAgY29uc3Qgc2hhcGUgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnc2hhcGUnKTtcbiAgICBjb25zdCBjb29yZHNOdW1iZXIgPSBjb29yZHMuc3BsaXQoJywnKS5tYXAocyA9PiBwYXJzZUludChzKSk7XG5cbiAgICBwb3NpdGlvbkhvdHNwb3RzKHNoYXBlLCBjb29yZHNOdW1iZXIsIGltZywgaG90c3BvdCk7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWNob2ljZScsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ob3RzcG90LWludGVyYWN0aW9uJzogUXRpSG90c3BvdEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCwgUHJvcGVydHlWYWx1ZXMgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIH0gZnJvbSAnLi4vaW50ZXJuYWwvZHJhZy1kcm9wL2RyYWctZHJvcC1pbnRlcmFjdGlvbi1taXhpbic7XG5cbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHVuc2FmZUhUTUwgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZUludGVyYWN0aW9uIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuaW1wb3J0ICcuLi9xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJztcbmltcG9ydCB7IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2UgfSBmcm9tICcuLi9xdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJztcblxuaW50ZXJmYWNlIENvbHVtbiB7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFJvdyB7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgaXNDaGVja2VkOiBib29sZWFuO1xufVxuXG5AY3VzdG9tRWxlbWVudCgncXRpLW1hdGNoLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlNYXRjaEludGVyYWN0aW9uIGV4dGVuZHMgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluKFxuICBMaXRFbGVtZW50LFxuICAncXRpLXNpbXBsZS1tYXRjaC1zZXQ6Zmlyc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJyxcbiAgZmFsc2UsXG4gICdxdGktc2ltcGxlLW1hdGNoLXNldDpsYXN0LW9mLXR5cGUgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSdcbikge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW107XG4gIHJvd3M6IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2VbXTtcbiAgY29sczogUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZVtdO1xuICBsYXN0Q2hlY2tlZFJhZGlvOiBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgQHN0YXRlKCkgcmVzcG9uc2UgPSBbXTtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdyZXNwb25zZS1pZGVudGlmaWVyJyB9KSByZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZyA9ICcnO1xuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yb3dzID0gQXJyYXkuZnJvbTxRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlPihcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB3Yy9uby1jaGlsZC10cmF2ZXJzYWwtaW4tY29ubmVjdGVkY2FsbGJhY2tcbiAgICAgIHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1tYXRjaC1zZXQ6Zmlyc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJylcbiAgICApO1xuICAgIHRoaXMuY29scyA9IEFycmF5LmZyb208UXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZT4oXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgd2Mvbm8tY2hpbGQtdHJhdmVyc2FsLWluLWNvbm5lY3RlZGNhbGxiYWNrXG4gICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtbWF0Y2gtc2V0Omxhc3Qtb2YtdHlwZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJylcbiAgICApO1xuXG4gICAgdGhpcy5yZXNwb25zZSA9IFtdO1xuICB9XG5cbiAgaGFuZGxlUmFkaW9DbGljayA9IGUgPT4ge1xuICAgIGNvbnN0IHJhZGlvID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBpZiAodGhpcy5sYXN0Q2hlY2tlZFJhZGlvID09PSByYWRpbykge1xuICAgICAgcmFkaW8uY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5sYXN0Q2hlY2tlZFJhZGlvID0gbnVsbDtcbiAgICAgIHRoaXMuaGFuZGxlUmFkaW9DaGFuZ2UoZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGFzdENoZWNrZWRSYWRpbyA9IHJhZGlvO1xuICAgIH1cbiAgfTtcblxuICBoYW5kbGVSYWRpb0NoYW5nZSA9IGUgPT4ge1xuICAgIGNvbnN0IGNoZWNrYm94ID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBjb25zdCB2YWx1ZSA9IGNoZWNrYm94LnZhbHVlO1xuICAgIGlmIChjaGVja2JveC5jaGVja2VkKSB7XG4gICAgICB0aGlzLnJlc3BvbnNlLnB1c2godmFsdWUpO1xuICAgICAgdGhpcy5sYXN0Q2hlY2tlZFJhZGlvID0gY2hlY2tib3g7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzcG9uc2UgPSB0aGlzLnJlc3BvbnNlLmZpbHRlcih2ID0+IHYgIT09IHZhbHVlKTtcbiAgICAgIHRoaXMubGFzdENoZWNrZWRSYWRpbyA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxSZXNwb25zZUludGVyYWN0aW9uPigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgcmVzcG9uc2VJZGVudGlmaWVyOiB0aGlzLnJlc3BvbnNlSWRlbnRpZmllcixcbiAgICAgICAgICByZXNwb25zZTogdGhpcy5yZXNwb25zZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGlmICghdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoJ3F0aS1tYXRjaC10YWJ1bGFyJykpIHtcbiAgICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+IDxzbG90Pjwvc2xvdD5gO1xuICAgIH1cbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8dGFibGU+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAke3RoaXMuY29scy5tYXAoKGNvbCwgaSkgPT4gaHRtbGA8dGggcGFydD1cInItaGVhZGVyXCI+JHt1bnNhZmVIVE1MKGNvbC5pbm5lckhUTUwpfTwvdGg+YCl9XG4gICAgICAgIDwvdHI+XG5cbiAgICAgICAgJHt0aGlzLnJvd3MubWFwKFxuICAgICAgICAgIChyb3csIHJJbmRleCkgPT5cbiAgICAgICAgICAgIGh0bWxgPHRyPlxuICAgICAgICAgICAgICA8dGQgcGFydD1cImMtaGVhZGVyXCI+JHt1bnNhZmVIVE1MKHJvdy5pbm5lckhUTUwpfTwvdGQ+XG4gICAgICAgICAgICAgICR7dGhpcy5jb2xzLm1hcCgoY29sLCBjSW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3dJZCA9IHJvdy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xJZCA9IGNvbC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGAke3Jvd0lkfSAke2NvbElkfWA7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJblJvd0NvdW50ID0gdGhpcy5yZXNwb25zZS5maWx0ZXIodiA9PiB2LnNwbGl0KCcgJylbMF0gPT09IHJvd0lkKS5sZW5ndGggfHwgMDtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGVja2VkID0gdGhpcy5yZXNwb25zZS5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgLy8gZGlzYWJsZSBpZiBtYXRjaCBtYXggaXMgZ3JlYXRlciB0aGFuIDEgYW5kIG1heCBpcyByZWFjaGVkXG4gICAgICAgICAgICAgICAgY29uc3QgZGlzYWJsZSA9IHJvdy5tYXRjaE1heCA9PT0gMSA/IGZhbHNlIDogc2VsZWN0ZWRJblJvd0NvdW50ID49IHJvdy5tYXRjaE1heCAmJiAhY2hlY2tlZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbGA8dGQ+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT0ke3Jvdy5tYXRjaE1heCA9PT0gMSA/ICdyYWRpbycgOiBgY2hlY2tib3hgfVxuICAgICAgICAgICAgICAgICAgICByb2xlPVwiaWRcIlxuICAgICAgICAgICAgICAgICAgICBuYW1lPSR7cm93SWR9XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPSR7dmFsdWV9XG4gICAgICAgICAgICAgICAgICAgIC5kaXNhYmxlZD0ke2Rpc2FibGV9XG4gICAgICAgICAgICAgICAgICAgIC5jaGVja2VkPSR7Y2hlY2tlZH1cbiAgICAgICAgICAgICAgICAgICAgQGNoYW5nZT0ke2UgPT4gdGhpcy5oYW5kbGVSYWRpb0NoYW5nZShlKX1cbiAgICAgICAgICAgICAgICAgICAgQGNsaWNrPSR7ZSA9PiAocm93Lm1hdGNoTWF4ID09PSAxID8gdGhpcy5oYW5kbGVSYWRpb0NsaWNrKGUpIDogbnVsbCl9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvdGQ+YDtcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA8L3RyPmBcbiAgICAgICAgKX1cbiAgICAgIDwvdGFibGU+XG4gICAgYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktbWF0Y2gtaW50ZXJhY3Rpb24nOiBRdGlNYXRjaEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuLy8gVEhJUyBJUyBOT1QgVVNFRCBJTiBUQUJVTEFSIE1BVENIIElOVEVSQUNUSU9OXG5AY3VzdG9tRWxlbWVudCgncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScpXG4vLyB0c2xpbnQ6ZGlzYWJsZTogaW5kZW50XG5leHBvcnQgY2xhc3MgUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZSBleHRlbmRzIExpdEVsZW1lbnQge1xuICAvKiogdGhlIG1pbmltYWwgbnVtYmVyIG9mIHNlbGVjdGlvbnMgYSBjYW5kaWRhdGUgbXVzdCBtYWtlICovXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGF0dHJpYnV0ZTogJ21hdGNoLW1pbidcbiAgfSlcbiAgcHVibGljIG1hdGNoTWluOiBudW1iZXIgPSAwO1xuXG4gIC8qKiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2VsZWN0aW9ucyBhIGNhbmRpZGF0ZSBtdXN0IG1ha2UsIHRoZSBvdGhlciBvcHRpb25zIHdpbGwgYmUgZGlzYWJsZWQgd2hlbiBtYXggb3B0aW9ucyBpcyBjaGVja2VkICovXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGF0dHJpYnV0ZTogJ21hdGNoLW1heCdcbiAgfSlcbiAgcHVibGljIG1hdGNoTWF4OiBudW1iZXIgPSAxO1xuXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogQm9vbGVhbixcbiAgICBhdHRyaWJ1dGU6ICdmaXhlZCdcbiAgfSlcbiAgcHVibGljIGZpeGVkID0gZmFsc2U7XG5cbiAgLy8gcGs6IFRoaXMgbmVlZHMgc29tZSBleHBsYW5hdGlvblxuICAvLyBpbiB0aGUgYXNzb2NpYXRlIGludGVyYWN0aW9uIHRoZXJlIGlzIGEgc3BlY2lhbCBzbG90IGZvciB0aGVzZSBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlc1xuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgncGFydCcsICdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJyk7XG4gIH1cblxuICAvLyBwazogVGhpcyBuZWVkcyBzb21lIGV4cGxhbmF0aW9uXG4gIC8vIGluIHF0aS1tYXRjaC1pbnRlcmFjdGlvbiwgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSBpcyB1c2VkIHRvIGRlbm90ZSB0aGVcbiAgLy8gZHJhZ2dhYmxlLCBidXQgYWxzbyB0aGUgZHJvcHBhYmxlLiBXRUlSRC4uIGJ1dCBsZXRzIGRlYWwgd2l0aCBpdC5cbiAgLy8gU28gd2UgaGF2ZSBhIHNsb3QgZm9yIHdoZW5ldmVyIGFub3RoZXIgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSBpcyBkcm9wcGVkIGluIGhlcmUuXG4gIC8vIEFuZCB3ZSBoYXZlIHNsb3QgZm9yIGNvbnRlbnQgbGlrZSBpbiB0aGlzIGFzc29jaWF0ZSBpbnRlcmFjdGlvblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8c2xvdCBuYW1lPVwicXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZVwiPjwvc2xvdD5cbiAgICBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnOiBRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1tZWRpYS1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpTWVkaWFJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgdmFsdWUgPSAwO1xuICByZXNldCgpIHtcbiAgICAvLyB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHNldCByZXNwb25zZSh2YWw6IHVuZGVmaW5lZCkge1xuICAgIC8vIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBnZXQgcHJvcGVydGllcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uSW50ZXJhY3Rpb24ucHJvcGVydGllcyxcbiAgICAgIC4uLntcbiAgICAgICAgc3RlcDoge1xuICAgICAgICAgIHR5cGU6IE51bWJlcixcbiAgICAgICAgICBhdHRyaWJ1dGU6ICdzdGVwJyxcbiAgICAgICAgICBkZWZhdWx0OiAxMFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbY3NzYGBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgLy8gZ2V0IGF1ZGlvLCB2aWRlbyBvZiBvYmplY3QgdGFnLlxuICAgIGNvbnN0IG1lZGlhT2JqZWN0ID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdhdWRpbycpIHx8IHRoaXMucXVlcnlTZWxlY3RvcigndmlkZW8nKSB8fCB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ29iamVjdCcpO1xuICAgIGlmIChtZWRpYU9iamVjdCkge1xuICAgICAgLy8gbGlzdGVuIHRvIGVuZGVkIGV2ZW50XG4gICAgICBtZWRpYU9iamVjdC5hZGRFdmVudExpc3RlbmVyKCdlbmRlZCcsICgpID0+IHtcbiAgICAgICAgLy8gc2V0IHZhbHVlIHRvIDBcbiAgICAgICAgdGhpcy52YWx1ZSsrO1xuICAgICAgICB0aGlzLnNhdmVSZXNwb25zZSh0aGlzLnZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1tZWRpYS1pbnRlcmFjdGlvbic6IFF0aU1lZGlhSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1vcmRlci1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpT3JkZXJJbnRlcmFjdGlvbiBleHRlbmRzIERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbihMaXRFbGVtZW50LCBgcXRpLXNpbXBsZS1jaG9pY2VgLCB0cnVlLCAnZHJvcC1saXN0Jykge1xuICBjaGlsZHJlbk1hcDogRWxlbWVudFtdO1xuICBwcml2YXRlIF9jbGFzc05hbWVzOiBzdHJpbmc7XG4gIHByaXZhdGUgX29yaWVudGF0aW9uOiAndmVydGljYWwnIHwgJ2hvcml6b250YWwnO1xuXG4gIHB1YmxpYyBzdGF0aWMgbGF5b3V0Q2xhc3MgPSBbJ3F0aS1jaG9pY2VzLXRvcCcsICdxdGktY2hvaWNlcy1ib3R0b20nLCAncXRpLWNob2ljZXMtbGVmdCcsICdxdGktY2hvaWNlcy1yaWdodCddO1xuXG4gIC8qKiBvcmllbnRhdGlvbiBvZiBjaG9pY2VzICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KVxuICBwdWJsaWMgb3JpZW50YXRpb246ICdob3Jpem9udGFsJyB8ICd2ZXJ0aWNhbCc7XG5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICBbcGFydD0nZHJhZ3MnXSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgfVxuXG4gICAgICBbcGFydD0nZHJvcHMnXSB7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgICAgIGdyaWQtYXV0by1mbG93OiBjb2x1bW47XG4gICAgICAgIGdyaWQtYXV0by1jb2x1bW5zOiAxZnI7XG4gICAgICB9XG5cbiAgICAgIDpob3N0KFtvcmllbnRhdGlvbj0naG9yaXpvbnRhbCddKSBbcGFydD0nZHJhZ3MnXSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICB9XG4gICAgICA6aG9zdChbb3JpZW50YXRpb249J2hvcml6b250YWwnXSkgW3BhcnQ9J2Ryb3BzJ10ge1xuICAgICAgICBncmlkLWF1dG8tZmxvdzogY29sdW1uO1xuICAgICAgfVxuICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSd2ZXJ0aWNhbCddKSBbcGFydD0nZHJhZ3MnXSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICB9XG4gICAgICA6aG9zdChbb3JpZW50YXRpb249J3ZlcnRpY2FsJ10pIFtwYXJ0PSdkcm9wcyddIHtcbiAgICAgICAgZ3JpZC1hdXRvLWZsb3c6IHJvdztcbiAgICAgIH1cblxuICAgICAgW3BhcnQ9J2Ryb3AtbGlzdCddIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICB9XG5cbiAgICAgIFtwYXJ0PSdjb250YWluZXInXSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGdhcDogMC41cmVtO1xuICAgICAgfVxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLXRvcCkgW3BhcnQ9J2NvbnRhaW5lciddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1ib3R0b20pIFtwYXJ0PSdjb250YWluZXInXSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1sZWZ0KSBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgfVxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLXJpZ2h0KSBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPiA8L3Nsb3Q+XG4gICAgICA8ZGl2IHBhcnQ9XCJjb250YWluZXJcIj5cbiAgICAgICAgPHNsb3QgcGFydD1cImRyYWdzXCI+IDwvc2xvdD5cbiAgICAgICAgPGRpdiBwYXJ0PVwiZHJvcHNcIj5cbiAgICAgICAgICAke0FycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLWNob2ljZScpKS5tYXAoXG4gICAgICAgICAgICAoXywgaSkgPT4gaHRtbGA8ZHJvcC1saXN0IHBhcnQ9XCJkcm9wLWxpc3RcIiBpZGVudGlmaWVyPVwiZHJvcGxpc3Qke2l9XCI+PC9kcm9wLWxpc3Q+YFxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgLy8gSU5GUklOR0VNRU5ULi5cbiAgICAvLyBQSzogaWYgY2hpbGRyZW4gYXJlIGRyb3BwZWQgaW50byBzaGFkb3dkb20sIHN0eWxpbmcgaXMgbG9zdCwgc28gd2UgYWRkIGEgcGFydCBzZWxlY3RvciBvbiBhbGwgY2hpbGRyZW5cbiAgICAvLyBJIHRoZXkgZ2V0IGxvc3QgaW50byBzaGFkb3cgZG9tIGFmdGVyIGRyb3BwZWQsIHRoZXkgY2FuIHN0aWxsIGJlIHN0eWxlZCB2aWEgbGlnaHRkb20gcGFydCBzZWxlY3RvcnNcbiAgICB0aGlzLmNoaWxkcmVuTWFwID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtY2hvaWNlJykpO1xuICAgIHRoaXMuY2hpbGRyZW5NYXAuZm9yRWFjaChlbCA9PiBlbC5zZXRBdHRyaWJ1dGUoJ3BhcnQnLCAncXRpLXNpbXBsZS1jaG9pY2UnKSk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW9yZGVyLWludGVyYWN0aW9uJzogUXRpT3JkZXJJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBjbGFzcyBRdGlTUG9zaXRpb25PYmplY3RJbnRlcmFjdGlvbiBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB9XG4gICAgICA6OnNsb3R0ZWQoaW1nKSB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgY3Vyc29yOiBtb3ZlO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgbGVmdDogNTAlO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gICAgICB9XG4gICAgYFxuICBdO1xufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24nLCBRdGlTUG9zaXRpb25PYmplY3RJbnRlcmFjdGlvbik7XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcG9zaXRpb24tb2JqZWN0LXN0YWdlJylcbmV4cG9ydCBjbGFzcyBRdGlQb3NpdGlvbk9iamVjdFN0YWdlIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIGNob2ljZU9yZGVyaW5nOiBib29sZWFuO1xuICBzdGFydFg6IGFueTtcbiAgc3RhcnRZOiBhbnk7XG4gIGRyYWdFbGVtZW50OiBhbnk7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmVtb3ZlTW92ZUxpc3RlbmVyID0gdGhpcy5yZW1vdmVNb3ZlTGlzdGVuZXIuYmluZCh0aGlzKTtcbiAgICB0aGlzLmRyYWdFbGVtZW50SGFuZGxlciA9IHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyLmJpbmQodGhpcyk7XG4gIH1cblxuICAvLyBEZWZpbmUgYSBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIG1vdXNlbW92ZSBldmVudCBvbiB0aGUgZHJhZ2dhYmxlIGVsZW1lbnRcbiAgZHJhZ0VsZW1lbnRIYW5kbGVyKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgdGhlIG1vdXNlIGhhcyBtb3ZlZCBzaW5jZSB0aGUgbGFzdCBldmVudFxuICAgIGNvbnN0IGRlbHRhWCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLnN0YXJ0WDtcbiAgICBjb25zdCBkZWx0YVkgPSBldmVudC5jbGllbnRZIC0gdGhpcy5zdGFydFk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkcmFnZ2FibGUgZWxlbWVudFxuICAgIHRoaXMuZHJhZ0VsZW1lbnQuc3R5bGUubGVmdCA9IHRoaXMuZHJhZ0VsZW1lbnQub2Zmc2V0TGVmdCArIGRlbHRhWCArICdweCc7XG4gICAgdGhpcy5kcmFnRWxlbWVudC5zdHlsZS50b3AgPSB0aGlzLmRyYWdFbGVtZW50Lm9mZnNldFRvcCArIGRlbHRhWSArICdweCc7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBtb3VzZVxuICAgIHRoaXMuc3RhcnRYID0gZXZlbnQuY2xpZW50WDtcbiAgICB0aGlzLnN0YXJ0WSA9IGV2ZW50LmNsaWVudFk7XG4gIH1cblxuICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoYSk6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChhKTtcblxuICAgIC8vIEdldCB0aGUgZHJhZ2dhYmxlIGFuZCBkcm9wIHpvbmUgZWxlbWVudHNcbiAgICB0aGlzLmRyYWdFbGVtZW50ID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uPmltZycpO1xuICAgIC8vIGNvbnN0IGNhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FudmFzJyk7XG5cbiAgICAvLyBJbml0aWFsaXplIHZhcmlhYmxlcyBmb3IgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBkcmFnZ2FibGUgZWxlbWVudFxuICAgIHRoaXMuc3RhcnRYID0gMDtcbiAgICB0aGlzLnN0YXJ0WSA9IDA7XG5cbiAgICAvLyBBZGQgYSBtb3VzZWRvd24gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGRyYWdnYWJsZSBlbGVtZW50XG4gICAgdGhpcy5kcmFnRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIC8vIFNhdmUgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBtb3VzZVxuICAgICAgdGhpcy5zdGFydFggPSBldmVudC5jbGllbnRYO1xuICAgICAgdGhpcy5zdGFydFkgPSBldmVudC5jbGllbnRZO1xuXG4gICAgICAvLyBBZGQgYSBtb3VzZW1vdmUgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGRvY3VtZW50XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdFbGVtZW50SGFuZGxlciwgdHJ1ZSk7XG4gICAgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMucmVtb3ZlTW92ZUxpc3RlbmVyKTtcbiAgfVxuXG4gIHJlbW92ZU1vdmVMaXN0ZW5lcihldmVudCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyLCB0cnVlKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnRWxlbWVudEhhbmRsZXIpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLnJlbW92ZU1vdmVMaXN0ZW5lcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXBvc2l0aW9uLW9iamVjdC1zdGFnZSc6IFF0aVBvc2l0aW9uT2JqZWN0U3RhZ2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcmVwZWF0IH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVwZWF0LmpzJztcbmltcG9ydCB7IHN0eWxlTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvc3R5bGUtbWFwLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpU2VsZWN0UG9pbnRJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgQHByb3BlcnR5KHtcbiAgICB0eXBlOiBOdW1iZXIsXG4gICAgYXR0cmlidXRlOiAnbWF4LWNob2ljZXMnXG4gIH0pXG4gIHB1YmxpYyBtYXhDaG9pY2VzOiBudW1iZXIgPSAwO1xuXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGF0dHJpYnV0ZTogJ21pbi1jaG9pY2VzJ1xuICB9KVxuICBwdWJsaWMgbWluQ2hvaWNlczogbnVtYmVyID0gMDtcblxuICBAc3RhdGUoKVxuICBwcml2YXRlIF9wb2ludHM6IHN0cmluZ1tdID0gW107XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPHBvaW50LWNvbnRhaW5lcj5cbiAgICAgICAgJHtyZXBlYXQoXG4gICAgICAgICAgdGhpcy5fcG9pbnRzLFxuICAgICAgICAgIHBvaW50ID0+IHBvaW50LFxuICAgICAgICAgIChwb2ludCwgaW5kZXgpID0+IGh0bWxgXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHBhcnQ9XCJwb2ludFwiXG4gICAgICAgICAgICAgIHN0eWxlPSR7c3R5bGVNYXAoe1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZSgtNTAlLCAtNTAlKScsXG4gICAgICAgICAgICAgICAgbGVmdDogYCR7cG9pbnQuc3BsaXQoJyAnKVswXX1weGAsXG4gICAgICAgICAgICAgICAgdG9wOiBgJHtwb2ludC5zcGxpdCgnICcpWzFdfXB4YFxuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJlbW92ZSBwb2ludCBhdCAke3BvaW50fVwiXG4gICAgICAgICAgICAgIEBjbGljaz0keyhlOiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcG9pbnRzID0gdGhpcy5fcG9pbnRzLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX3BvaW50cyk7XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgYFxuICAgICAgICApfVxuICAgICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8L3BvaW50LWNvbnRhaW5lcj5gO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgfVxuICAgICAgcG9pbnQtY29udGFpbmVyIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5fcG9pbnRzID0gW107XG4gIH1cblxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcG9pbnRzLmxlbmd0aCA+PSB0aGlzLm1pbkNob2ljZXMgJiYgdGhpcy5fcG9pbnRzLmxlbmd0aCA8PSB0aGlzLm1heENob2ljZXM7XG4gIH1cblxuICBzZXQgcmVzcG9uc2UodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIHRoaXMuX3BvaW50cyA9IEFycmF5LmlzQXJyYXkodmFsKSA/IHZhbCA6IFt2YWxdO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGNvbnN0IGltZyA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJyk7XG5cbiAgICAvLyBBdHRhY2ggYSBjbGljayBldmVudCBsaXN0ZW5lciB0byB0aGUgaW1hZ2UgZWxlbWVudFxuICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IHggPSBldmVudC5vZmZzZXRYO1xuICAgICAgY29uc3QgeSA9IGV2ZW50Lm9mZnNldFk7XG5cbiAgICAgIHRoaXMuX3BvaW50cyA9IFsuLi50aGlzLl9wb2ludHMsIHggKyAnICcgKyB5XTtcbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX3BvaW50cyk7XG4gICAgfSk7XG4gIH1cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uJzogUXRpU2VsZWN0UG9pbnRJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgbm90aGluZyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgcXVlcnkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuLyoqXG4gKiBAc3VtbWFyeSBUaGUgU2xpZGVySW50ZXJhY3Rpb24uVHlwZSAocXRpLXNsaWRlci1pbnRlcmFjdGlvbikgcHJlc2VudHMgdGhlIGNhbmRpZGF0ZSB3aXRoIGEgY29udHJvbCBmb3Igc2VsZWN0aW5nIGEgbnVtZXJpY2FsIHZhbHVlIGJldHdlZW4gYSBsb3dlciBhbmQgdXBwZXIgYm91bmQuXG4gKiBAZG9jdW1lbnRhdGlvbiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLnM2MXhjcmo0cWN5alxuICogQHN0YXR1cyBzdGFibGVcbiAqIEBzaW5jZSA2LjBcbiAqXG4gKiBAZXZlbnQgcXRpLXJlZ2lzdGVyLWludGVyYWN0aW9uIC0gZW1pdHRlZCB3aGVuIHRoZSBpbnRlcmFjdGlvbiB3YW50cyB0byByZWdpc3RlciBpdHNlbGZcbiAqIEBldmVudCBxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UgLSBlbWl0dGVkIHdoZW4gdGhlIGludGVyYWN0aW9uIGNoYW5nZXNcbiAqXG4gKiBAY3NzcHJvcCAtLXNob3ctdmFsdWUgLSBzaG93cyB0aGUgY3VycmVudCB2YWx1ZSB3aGlsZSBzbGlkaW5nXG4gKiBAY3NzcHJvcCAtLXNob3ctdGlja3MgLSBzaG93cyB0aGUgdGlja3MgYWNjb3JkaW5nIHRvIHN0ZXBzXG4gKiBAY3NzcHJvcCAtLXNob3ctYm91bmRzIC0gc2hvd3MgdmFsdWUgZm9yIGxvd2VyIGFuZCB1cHBlciBib3VuZGFyeVxuICpcbiAqIEBjc3NwYXJ0IHNsaWRlciAtLSBzbGlkZXIgaW5sdWRpbmcsIGJvdW5kcyBhbmQgdGlja3MgYW5kIHZhbHVlLCB1c2UgaXQgZm9yIHBhZGRpbmdzIGFuZCBtYXJnaW5zXG4gKiBAY3NzcGFydCBib3VuZHMgLS0gZGl2IGZvciBib3VuZHMsIGNvbnRhaW5pbmcgdHdvIGRpdnMgZm9yIHdpdGggbWluLCBhbmQgbWF4IGJvdW5kcyB2YWx1ZVxuICogQGNzc3BhcnQgdGlja3MgLS0gZGl2IGZvciB0aWNrcywgdXNlIGxpbmVhaXIgZ3JhZGllbnQgYW5kIGV4cG9zZWQgY3NzIHZhcmlhYmxlcyBmb3Igc3R5bGluZ1xuICogQGNzc3BhcnQgcmFpbCAtLSBkaXYgZm9yIHJhaWwsIHN0eWxlIGFjY29yZGluZyB0byBuZWVkc1xuICogQGNzc3BhcnQga25vYiAtLSBkaXYsIHNob3VsZCBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZVxuICogQGNzc3BhcnQgdmFsdWUgLS0gZGl2LCBjb250YWluaW5nIHZhbHVlXG4gKlxuICogQHNsb3QgLSBUaGUgZGVmYXVsdCBzbG90IHdoZXJlIDxxdGktc2ltcGxlLWNob2ljZT4gbXVzdCBiZSBwbGFjZWQuXG4gKiBAc2xvdCBwcm9tcHQgLSBzbG90IHdoZXJlIHRoZSBwcm9tcHQgaXMgcGxhY2VkLlxuICovXG5cbkBjdXN0b21FbGVtZW50KCdxdGktc2xpZGVyLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlTbGlkZXJJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgY3NMaXZlOiBDU1NTdHlsZURlY2xhcmF0aW9uO1xuXG4gIEBxdWVyeSgnI2tub2InKVxuICBwcml2YXRlIF9rbm9iOiBIVE1MRWxlbWVudDtcblxuICBAcXVlcnkoJyNyYWlsJylcbiAgcHJpdmF0ZSBfcmFpbDogSFRNTEVsZW1lbnQ7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyIH0pIHZhbHVlOiBudW1iZXI7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiwgYXR0cmlidXRlOiAnc3RlcC1sYWJlbCcgfSkgc3RlcExhYmVsID0gZmFsc2U7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSByZXZlcnNlID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfbWluOiBudW1iZXI7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiAnbG93ZXItYm91bmQnIH0pIHNldCBtaW4odmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21pbiA9IHZhbHVlO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLW1pbicsIGAke3RoaXMuX21pbn1gKTtcbiAgfVxuICBnZXQgbWluKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgfVxuXG4gIHByaXZhdGUgX21heDogbnVtYmVyO1xuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ3VwcGVyLWJvdW5kJyB9KSBzZXQgbWF4KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXggPSB2YWx1ZTtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLW1heCcsIGAke3RoaXMuX21heH1gKTtcbiAgfVxuICBnZXQgbWF4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21heDtcbiAgfVxuXG4gIHByaXZhdGUgX3N0ZXA6IG51bWJlcjtcbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdzdGVwJyB9KSBzZXQgc3RlcCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fc3RlcCA9IHZhbHVlO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tc3RlcCcsIGAke3RoaXMuX3N0ZXB9YCk7XG4gIH1cbiAgZ2V0IHN0ZXAoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc3RlcDtcbiAgfVxuXG4gIEB3YXRjaCgnZGlzYWJsZWQnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIF9oYW5kbGVEaXNhYmxlZENoYW5nZSA9IChvbGQsIGRpc2FibGVkKSA9PiB7fTtcblxuICBAd2F0Y2goJ3JlYWRvbmx5JywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBfaGFuZGxlUmVhZG9ubHlDaGFuZ2UgPSAob2xkLCByZWFkb25seSkgPT4ge307XG5cbiAgcmVzZXQoKSB7XG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gc3RhdGljIHNoYWRvd1Jvb3RPcHRpb25zOiBTaGFkb3dSb290SW5pdCA9IHsgLi4uTGl0RWxlbWVudC5zaGFkb3dSb290T3B0aW9ucywgZGVsZWdhdGVzRm9jdXM6IHRydWUsIG1vZGU6ICdvcGVuJyB9O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgLyogdGhlIGNvbXB1dGVkIHN0eWxlIGlzIGEgbGl2ZSBwcm9wZXJ0eSwgd2UgdXNlIHRoaXMgdG8gZ2V0IGNzcyB2YXJpYWJsZXNcbiAgICBzZWUgcmVuZGVyIHRlbXBsYXRlICovXG4gICAgdGhpcy5jc0xpdmUgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMpO1xuICB9XG5cbiAgc2V0IHJlc3BvbnNlKG15UmVzcG9uc2U6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobXlSZXNwb25zZSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1F0aVNsaWRlckludGVyYWN0aW9uOiByZXNwb25zZSBpcyBhbiBhcnJheSwgYnV0IHNob3VsZCBiZSBhIHNpbmdsZSB2YWx1ZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlSW50KG15UmVzcG9uc2UpO1xuICAgIGlmIChOdW1iZXIuaXNOYU4odmFsdWUpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdRdGlTbGlkZXJJbnRlcmFjdGlvbjogcmVzcG9uc2UgaXMgbm90IGEgbnVtYmVyJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbY3NzYGBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICAvLyBjb252ZXJ0IHRoZSB2YWx1ZSwgd2hpY2ggaXMgdGhlIHJlYWwgc2xpZGVyIHZhbHVlIHRvIGEgcGVyY2VudGFnZSBmb3IgdGhlIGRvbS5cbiAgICB0aGlzLnZhbHVlIDwgdGhpcy5taW4gJiYgKHRoaXMudmFsdWUgPSB0aGlzLm1pbik7XG4gICAgdGhpcy52YWx1ZSA+IHRoaXMubWF4ICYmICh0aGlzLnZhbHVlID0gdGhpcy5tYXgpO1xuICAgIGNvbnN0IHZhbHVlUGVyY2VudGFnZSA9ICgodGhpcy52YWx1ZSAtIHRoaXMubWluKSAvICh0aGlzLm1heCAtIHRoaXMubWluKSkgKiAxMDA7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnLS12YWx1ZS1wZXJjZW50YWdlJywgYCR7dmFsdWVQZXJjZW50YWdlfSVgKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsIHRoaXMudmFsdWUudG9TdHJpbmcoKSk7XG5cbiAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPGRpdiBpZD1cInNsaWRlclwiIHBhcnQ9XCJzbGlkZXJcIj5cbiAgICAgICAgJHt0aGlzLmNzTGl2ZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXNob3ctYm91bmRzJykgPT0gJ3RydWUnXG4gICAgICAgICAgPyBodG1sYDxkaXYgaWQ9XCJib3VuZHNcIiBwYXJ0PVwiYm91bmRzXCI+XG4gICAgICAgICAgICAgIDxkaXY+JHt0aGlzLl9taW59PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXY+JHt0aGlzLl9tYXh9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5gXG4gICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAke3RoaXMuY3NMaXZlLmdldFByb3BlcnR5VmFsdWUoJy0tc2hvdy10aWNrcycpID09ICd0cnVlJyA/IGh0bWxgPGRpdiBpZD1cInRpY2tzXCIgcGFydD1cInRpY2tzXCI+PC9kaXY+YCA6IG5vdGhpbmd9XG4gICAgICAgIDxkaXYgaWQ9XCJyYWlsXCIgcGFydD1cInJhaWxcIiBAbW91c2Vkb3duPSR7dGhpcy5fb25Nb3VzZURvd259IEB0b3VjaHN0YXJ0PSR7dGhpcy5fb25Ub3VjaE1vdmV9PlxuICAgICAgICAgIDxkaXYgaWQ9XCJrbm9iXCIgcGFydD1cImtub2JcIj5cbiAgICAgICAgICAgICR7dGhpcy5jc0xpdmUuZ2V0UHJvcGVydHlWYWx1ZSgnLS1zaG93LXZhbHVlJykgPT0gJ3RydWUnXG4gICAgICAgICAgICAgID8gaHRtbGA8ZGl2IGlkPVwidmFsdWVcIiBwYXJ0PVwidmFsdWVcIj4ke3RoaXMudmFsdWV9PC9kaXY+YFxuICAgICAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5zdGVwID0gMTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3NsaWRlcicpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25Ub3VjaE1vdmUoZXZlbnQpIHtcbiAgICBjb25zdCBoYW5kbGVUb3VjaE1vdmUgPSBldmVudCA9PiB7XG4gICAgICBjb25zdCB7IHggfSA9IHRoaXMuZ2V0UG9zaXRpb25Gcm9tRXZlbnQoZXZlbnQpO1xuICAgICAgY29uc3QgZGlmZlggPSB4IC0gdGhpcy5fcmFpbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgICB0aGlzLmNhbGN1bGF0ZVZhbHVlKGRpZmZYKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVUb3VjaEVuZCA9ICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGhhbmRsZVRvdWNoTW92ZSk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIGhhbmRsZVRvdWNoRW5kKTtcblxuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy52YWx1ZS50b1N0cmluZygpKTtcbiAgICB9O1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgaGFuZGxlVG91Y2hNb3ZlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIGhhbmRsZVRvdWNoRW5kKTtcblxuICAgIGNvbnN0IHsgeCB9ID0gdGhpcy5nZXRQb3NpdGlvbkZyb21FdmVudChldmVudCk7XG4gICAgY29uc3QgZGlmZlggPSB4IC0gdGhpcy5fcmFpbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgdGhpcy5jYWxjdWxhdGVWYWx1ZShkaWZmWCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIF9vbk1vdXNlRG93bihldmVudCkge1xuICAgIGNvbnN0IGhhbmRsZU1vdXNlTW92ZSA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgLy8gaWYgdGhlIHF0aS1zbGlkZXItaW50ZXJhY3Rpb24gaGFzIGFuIGFic29sdXRlIGxlZnQgcG9zaXRpb24gYW5kIGJvZHkgaXMgc2Nyb2xsZWQgYSBiaXQsIHRha2UgYWNjb3VudCBmb3IgdGhhdFxuICAgICAgY29uc3QgZGlmZlggPSBldmVudC5wYWdlWCAtIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuXG4gICAgICB0aGlzLmNhbGN1bGF0ZVZhbHVlKGRpZmZYKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlTW91c2VVcCA9ICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgaGFuZGxlTW91c2VVcCk7XG5cbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMudmFsdWUudG9TdHJpbmcoKSk7XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGhhbmRsZU1vdXNlVXApO1xuXG4gICAgLy8gaWYgdGhlIHF0aS1zbGlkZXItaW50ZXJhY3Rpb24gaGFzIGFuIGFic29sdXRlIGxlZnQgcG9zaXRpb24gYW5kIGJvZHkgaXMgc2Nyb2xsZWQgYSBiaXQsIHRha2UgYWNjb3VudCBmb3IgdGhhdFxuICAgIGNvbnN0IGRpZmZYID0gZXZlbnQucGFnZVggLSB0aGlzLl9yYWlsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDtcblxuICAgIHRoaXMuY2FsY3VsYXRlVmFsdWUoZGlmZlgpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICAvKiogY2FsY3VsYXRlVmFsdWUgZ2V0cyB4IHBvc2l0aW9uIGFuZCBjb21wYXJlcyB0aGlzIHdpdGggdGhlIHRvdGFsIHdpZHRoIGluIHBpeGVscyAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZVZhbHVlKGRpZmZYOiBudW1iZXIpIHtcbiAgICBjb25zdCB2YWx1ZU5vdyA9IHRoaXMubWluICsgKCh0aGlzLm1heCAtIHRoaXMubWluKSAqIGRpZmZYKSAvIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgY29uc3Qgcm91bmRlZFN0ZXBWYWx1ZSA9IHRoaXMubWluICsgTWF0aC5yb3VuZCgodmFsdWVOb3cgLSB0aGlzLm1pbikgLyB0aGlzLl9zdGVwKSAqIHRoaXMuX3N0ZXA7XG4gICAgdGhpcy52YWx1ZSA9IHJvdW5kZWRTdGVwVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGdldFBvc2l0aW9uRnJvbUV2ZW50KGU6IGFueSk6IHtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICB9IHtcbiAgICBsZXQgX3RvdWNoTW92ZTtcbiAgICBpZiAoZS50eXBlID09ICd0b3VjaHN0YXJ0JyB8fCBlLnR5cGUgPT0gJ3RvdWNobW92ZScgfHwgZS50eXBlID09ICd0b3VjaGVuZCcgfHwgZS50eXBlID09ICd0b3VjaGNhbmNlbCcpIHtcbiAgICAgIGNvbnN0IGV2dCA9IHR5cGVvZiBlLm9yaWdpbmFsRXZlbnQgPT09ICd1bmRlZmluZWQnID8gZSA6IGUub3JpZ2luYWxFdmVudDtcbiAgICAgIGNvbnN0IHRvdWNoID0gZXZ0LnRvdWNoZXNbMF0gfHwgZXZ0LmNoYW5nZWRUb3VjaGVzWzBdO1xuICAgICAgX3RvdWNoTW92ZSA9IHtcbiAgICAgICAgeDogdG91Y2gucGFnZVgsXG4gICAgICAgIHk6IHRvdWNoLnBhZ2VZXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBlLnR5cGUgPT0gJ21vdXNlZG93bicgfHxcbiAgICAgIGUudHlwZSA9PSAnbW91c2V1cCcgfHxcbiAgICAgIGUudHlwZSA9PSAnbW91c2Vtb3ZlJyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZW92ZXInIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlb3V0JyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZWVudGVyJyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZWxlYXZlJ1xuICAgICkge1xuICAgICAgX3RvdWNoTW92ZSA9IHtcbiAgICAgICAgeDogZS5jbGllbnRYLFxuICAgICAgICB5OiBlLmNsaWVudFlcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBfdG91Y2hNb3ZlO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1zbGlkZXItaW50ZXJhY3Rpb24nOiBRdGlTbGlkZXJJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7XG4gIGl0ZW1Db250ZXh0LFxuICB0eXBlIENhbGN1bGF0ZSxcbiAgdHlwZSBJdGVtQ29udGV4dCxcbiAgdHlwZSBSZXNwb25zZVZhcmlhYmxlXG59IGZyb20gJ0BjaXRvbGFiL3F0aS1jb21wb25lbnRzL3F0aS1jb21wb25lbnRzJztcbmltcG9ydCB7IGNvbnN1bWUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuLyoqXG4gKiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLmZpMjlxOGR1Ympnd1xuICogPHF0aS1jdXN0b20tb3BlcmF0b3IgY2xhc3M9XCJqcy5vcmdcIj5cbiAgICAgICAgPHF0aS1iYXNlLXZhbHVlIGJhc2UtdHlwZT1cInN0cmluZ1wiPjwhW0NEQVRBW1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNvbnRleHQudmFyaWFibGVzKTtcbiAgICAgICAgICByZXR1cm4gJ0InXG4gICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigncXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uJykuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIF1dPjwvcXRpLWJhc2UtdmFsdWU+XG4gICAgICA8L3F0aS1jdXN0b20tb3BlcmF0b3I+XG4gICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktY3VzdG9tLW9wZXJhdG9yJylcbmV4cG9ydCBjbGFzcyBRdGlDdXN0b21PcGVyYXRvciBleHRlbmRzIExpdEVsZW1lbnQgaW1wbGVtZW50cyBDYWxjdWxhdGUge1xuICBwcml2YXRlIG9wZXJhdG9yRnVuY3Rpb246IEZ1bmN0aW9uO1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwcml2YXRlIF9jb250ZXh0PzogSXRlbUNvbnRleHQ7XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IEBzbG90Y2hhbmdlPSR7dGhpcy5oYW5kbGVTbG90Q2hhbmdlfT48L3Nsb3Q+YDtcbiAgfVxuXG4gIGhhbmRsZVNsb3RDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgLy8gZXhwZWN0aW5nIDxbIUNEQVRBWyAuLi4gXV0+IGlzIGNvbnZlcnRlZCBpbnRvIDwhLS0gLi4uIC0tPiB3aXRoIHF0aS10cmFuc2Zvcm06IGNEYXRhVG9Db21tZW50XG4gICAgY29uc3QgY29tbWVudE5vZGUgPSBBcnJheS5mcm9tKHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQ/LmNoaWxkTm9kZXMgPz8gW10pLmZpbmQoXG4gICAgICBub2RlID0+IG5vZGUubm9kZVR5cGUgPT09IE5vZGUuQ09NTUVOVF9OT0RFXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5vcGVyYXRvckZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKCdjb250ZXh0JywgJ2ZuJywgJ2l0ZW0nLCBjb21tZW50Tm9kZS50ZXh0Q29udGVudCA/PyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcignY3VzdG9tLW9wZXJhdG9yIGNvbnRhaW5zIGludmFsaWQgamF2YXNjcmlwdCBjb2RlJywgZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpIHtcbiAgICBjb25zdCBmbiA9IHtcbiAgICAgIHZhcmlhYmxlOiAocmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmcpID0+XG4gICAgICAgIHRoaXMuX2NvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSByZXNwb25zZUlkZW50aWZpZXIpPy52YWx1ZSA/PyAnJyxcbiAgICAgIGNvcnJlY3Q6IChyZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZykgPT5cbiAgICAgICAgKHRoaXMuX2NvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSByZXNwb25zZUlkZW50aWZpZXIpIGFzIFJlc3BvbnNlVmFyaWFibGUpXG4gICAgICAgICAgPy5jb3JyZWN0UmVzcG9uc2UgPz8gJydcbiAgICB9O1xuICAgIGNvbnN0IGl0ZW0gPSB7XG4gICAgICBnZXRWYXJpYWJsZTogKHZhcmlhYmxlSWRlbnRpZmllcjogc3RyaW5nKSA9PlxuICAgICAgICB0aGlzLl9jb250ZXh0Py52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdmFyaWFibGVJZGVudGlmaWVyKSxcbiAgICAgIHVwZGF0ZU91dGNvbWVWYXJpYWJsZTogKG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkgPT4ge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PHsgb3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIH0+KCdxdGktc2V0LW91dGNvbWUtdmFsdWUnLCB7XG4gICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgb3V0Y29tZUlkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiB0aGlzLm9wZXJhdG9yRnVuY3Rpb24odGhpcy5fY29udGV4dCwgZm4sIGl0ZW0pO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jdXN0b20tb3BlcmF0b3InOiBRdGlDdXN0b21PcGVyYXRvcjtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWFzc29jaWFibGUtaG90c3BvdCcpXG5leHBvcnQgY2xhc3MgUXRpQXNzb2NpYWJsZUhvdHNwb3QgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZVxuICAgICAgfSlcbiAgICApO1xuICB9XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJxdGktZ2FwLWltZ1wiPjwvc2xvdD4gYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYXNzb2NpYWJsZS1ob3RzcG90JzogUXRpQXNzb2NpYWJsZUhvdHNwb3Q7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdhcCcpXG5leHBvcnQgY2xhc3MgUXRpR2FwIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSB9KSB0YWJpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkID0gMDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJxdGktZ2FwLXRleHRcIj48L3Nsb3Q+YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ2FwJzogUXRpR2FwO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1nYXAtaW1nJylcbmV4cG9ydCBjbGFzcyBRdGlHYXBJbWcgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlIH0pIHRhYmluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQgPSAwO1xuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1nYXAtaW1nJyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdhcC1pbWcnOiBRdGlHYXBJbWc7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdhcC10ZXh0JylcbmV4cG9ydCBjbGFzcyBRdGlHYXBUZXh0IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSB9KSB0YWJpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkID0gMDtcblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1nYXAtdGV4dCcpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1nYXAtdGV4dCc6IFF0aUdhcFRleHQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBRdGlDaG9pY2UgfSBmcm9tICcuL2ludGVybmFsL2Nob2ljZS9xdGktY2hvaWNlJztcblxuLy8gdHlwZSBzaGFwZSA9IHsgc2hhcGU6ICdyZWN0JyB8ICdjaXJjbGUnIHwgJ3BvbHknOyBjb29yZHM6IG51bWJlcltdIH07XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaG90c3BvdC1jaG9pY2UnKVxuZXhwb3J0IGNsYXNzIFF0aUhvdHNwb3RDaG9pY2UgZXh0ZW5kcyBRdGlDaG9pY2Uge1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdhcmlhLW9yZGVydmFsdWUnLCB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUgfSkgb3JkZXI6IG51bWJlcjtcblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB9XG4gIGA7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ob3RzcG90LWNob2ljZSc6IFF0aUhvdHNwb3RDaG9pY2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpQ2hvaWNlIH0gZnJvbSAnLi9pbnRlcm5hbC9jaG9pY2UvcXRpLWNob2ljZSc7XG5pbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1ob3R0ZXh0JylcbmV4cG9ydCBjbGFzcyBRdGlIb3R0ZXh0IGV4dGVuZHMgUXRpQ2hvaWNlIHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxkaXYgcGFydD1cImNoXCI+PGRpdiBwYXJ0PVwiY2hhXCI+PC9kaXY+PC9kaXY+XG4gICAgICA8c2xvdD48L3Nsb3Q+IGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWhvdHRleHQnOiBRdGlIb3R0ZXh0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWlubGluZS1jaG9pY2UnKVxuZXhwb3J0IGNsYXNzIFF0aUlubGluZUNob2ljZSBleHRlbmRzIExpdEVsZW1lbnQge31cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWlubGluZS1jaG9pY2UnOiBRdGlJbmxpbmVDaG9pY2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQ1NTUmVzdWx0R3JvdXAsIGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBRdGlDaG9pY2UgfSBmcm9tICcuL2ludGVybmFsL2Nob2ljZS9xdGktY2hvaWNlJztcblxuLyoqXG4gKiBAc3VtbWFyeSBTaG9ydCBzdW1tYXJ5IG9mIHRoZSBjb21wb25lbnQncyBpbnRlbmRlZCB1c2UuXG4gKiBAZG9jdW1lbnRhdGlvbiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLmo5bnUxb2ExdHUzYlxuICogQHN0YXR1cyBzdGFibGVcbiAqIEBzaW5jZSA0LjBcbiAqXG4gKiBAZXZlbnQgcXRpLWNob2ljZS1lbGVtZW50LXNlbGVjdGVkIC0gRW1pdHRlZCB3aGVuIGEgY2hvaWNlIGlzIHNlbGVjdGVkLlxuICogQGV2ZW50IHF0aS1yZWdpc3Rlci1jaG9pY2UgLSBFbWl0dGVkIHdoZW4gYW4gY2hvaWNlIGlzIGFkZGVkXG4gKiBAZXZlbnQgcXRpLWxvb3NlLWNob2ljZSAtIEVtaXR0ZWQgd2hlbiBhIGNob2ljZSBpcyByZW1vdmVkXG4gKlxuICogQHNsb3QgLSBUaGUgZGVmYXVsdCBzbG90LlxuICovXG5AY3VzdG9tRWxlbWVudCgncXRpLXNpbXBsZS1jaG9pY2UnKVxuZXhwb3J0IGNsYXNzIFF0aVNpbXBsZUNob2ljZSBleHRlbmRzIFF0aUNob2ljZSB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICB9XG4gICAgc2xvdCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPGRpdiBwYXJ0PVwiY2hcIj48ZGl2IHBhcnQ9XCJjaGFcIj48L2Rpdj48L2Rpdj5cbiAgICAgIDxzbG90IHBhcnQ9XCJzbG90XCI+PC9zbG90PiBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1zaW1wbGUtY2hvaWNlJzogUXRpU2ltcGxlQ2hvaWNlO1xuICB9XG59XG4iLCAiLyogb25seSBleHBvcnRlZCB0byBvdmVycmlkZSBvciBleHRlbmQgZm9yIHNwZWNpZmljIHB1cnBvc2VzICovXG5leHBvcnQgKiBmcm9tICcuL2ludGVybmFsL2V2ZW50LXR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJuYWwvZXZlbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuLyogb25seSBleHBvcnRlZCB0byBvdmVycmlkZSBvciBleHRlbmQgZm9yIHNwZWNpZmljIHB1cnBvc2VzICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi9xdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvY2hvaWNlL3F0aS1jaG9pY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaXRlbS1ib2R5L3F0aS1pdGVtLWJvZHknO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktcHJvbXB0L3F0aS1wcm9tcHQnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktc3R5bGVzaGVldC9xdGktc3R5bGVzaGVldCc7XG4vKiBzdGFydCByZXNwb25zZSBhbmQgb3V0Y29tZSAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uL3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbic7XG4vKiBlbmQgcmVzcG9uc2UgYW5kIG91dGNvbWUgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mby9xdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJ1YnJpYy1ibG9jay9xdGktY29udGVudC1ib2R5JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJ1YnJpYy1ibG9jay9xdGktcnVicmljLWJsb2NrJztcbi8qIHN0YXJ0IGZlZWRiYWNrICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2stYmxvY2svcXRpLWZlZWRiYWNrLWJsb2NrJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay1pbmxpbmUvcXRpLWZlZWRiYWNrLWlubGluZSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1mZWVkYmFjay9xdGktbW9kYWwtZmVlZGJhY2svcXRpLW1vZGFsLWZlZWRiYWNrJztcbi8qIGVuZCBmZWVkYmFjayAqL1xuLyogc3RhcnQgdGV4dGVudHJ5aW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uJztcbi8qIGVuZCB0ZXh0ZW50cnlpbnRlcmFjdGlvbiAqL1xuLyogc3RhcnQgaG90dGV4dCAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nO1xuLyogZW5kIGhvdHRleHQgKi9cbi8qIHN0YXJ0IGlubGluZWNob2ljZSAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24nO1xuLyogZW5kIGlubGluZWNob2ljZSAqL1xuLyogc3RhcnQgY2hvaWNlaW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbic7XG4vKiBlbmQgY2hvaWNlaW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLW91dGNvbWUtcHJvY2Vzc2luZy9xdGktb3V0Y29tZS1wcm9jZXNzaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnO1xuLyogc3RhcnQgY3VzdG9tIGludGVyYWN0aW9ucyAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uJztcbi8qIGVuZCBjdXN0b20gaW50ZXJhY3Rpb25zICovXG4vKiBzdGFydCBvbmx5IHByZXZpZXcgaXRlbXMgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktY3VzdG9tLWludGVyYWN0aW9uL3F0aS1jdXN0b20taW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uL3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uL3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLW1lZGlhLWludGVyYWN0aW9uL3F0aS1tZWRpYS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktb3JkZXItaW50ZXJhY3Rpb24vcXRpLW9yZGVyLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3Qtc3RhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbi9xdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zbGlkZXItaW50ZXJhY3Rpb24vcXRpLXNsaWRlci1pbnRlcmFjdGlvbic7XG4vKiBlbmQgb25seSBwcmV2aWV3IGl0ZW1zICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWN1c3RvbS1vcGVyYXRvci9xdGktY3VzdG9tLW9wZXJhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcCc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLWltZyc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLXRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtY2hvaWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXNpbXBsZS1jaG9pY2UnO1xuXG5jb25zb2xlLmxvZyhcbiAgJyVjQ1x1MDBCRlRPJWNMYWIlYzogcXRpLWNvbXBvbmVudHMgbG9hZGVkJyxcbiAgJ2ZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOmdyZWVuJyxcbiAgJ2ZvbnQtZmFtaWx5OiBcIlBUIFNhbnNcIiwgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6Z3JlZW47IGZvbnQtc2l6ZTogc21hbGxlcjt2ZXJ0aWNhbC1hbGlnbjogc3ViJyxcbiAgJ2ZvbnQtd2VpZ2h0OnVuc2V0J1xuKTtcblxuLy8gY3NzIGZvciBmb250IHB0LXNhbnMgYW5kIHN1YnNjcmlwdCBhbmQgZ3JlZW5cbiJdLAogICJtYXBwaW5ncyI6ICIrREFBQSxPQUFTLFdBQUFBLE9BQWUsZUFDeEIsT0FBUyxjQUFBQyxHQUFZLFFBQUFDLE9BQVksTUFDakMsT0FBUyxpQkFBQUMsR0FBZSxZQUFBQyxNQUFnQixvQkMyQmpDLFNBQVNDLEVBQU1DLEVBQWlDQyxFQUF3QixDQUM3RSxJQUFNQyxFQUEwQ0MsRUFBQSxDQUM5QyxxQkFBc0IsSUFDbkJGLEdBRUwsTUFBTyxDQUErQkcsRUFBa0JDLElBQTBELENBRWhILEdBQU0sQ0FBRSxPQUFBQyxDQUFPLEVBQUlGLEVBQ2JHLEVBQW9CLE1BQU0sUUFBUVAsQ0FBWSxFQUFJQSxFQUFlLENBQUNBLENBQVksRUFHcEZJLEVBQU0sT0FBUyxTQUEyQkksRUFBZ0UsQ0FDeEdELEVBQWtCLFFBQVFFLEdBQVksQ0FDcEMsSUFBTUMsRUFBTUQsRUFDWixHQUFJRCxFQUFhLElBQUlFLENBQUcsRUFBRyxDQUN6QixJQUFNQyxFQUFXSCxFQUFhLElBQUlFLENBQUcsRUFDL0JFLEVBQVcsS0FBS0YsQ0FBRyxFQUVyQkMsSUFBYUMsSUFDWCxDQUFDVixFQUFnQixzQkFBd0IsS0FBSyxhQUMvQyxLQUFLRyxDQUFlLEVBQStCTSxFQUFVQyxDQUFRLENBRzVFLENBQ0YsQ0FBQyxFQUVETixFQUFPLEtBQUssS0FBTUUsQ0FBWSxDQUNoQyxDQUNGLENBQ0YsQ0MxREEsT0FBUyxpQkFBQUssT0FBcUIsZUFTdkIsSUFBTUMsR0FBdUIsQ0FDbEMsQ0FDRSxXQUFZLG1CQUNaLFlBQWEsU0FDYixTQUFVLFNBQ1YsTUFBTyxVQUNQLEtBQU0sU0FDUixFQUNBLENBQ0UsV0FBWSxjQUNaLFlBQWEsU0FDYixTQUFVLFVBQ1YsTUFBTyxJQUNQLEtBQU0sVUFDUixDQUNGLEVBRWFDLEVBQWNGLEdBQTJCLE1BQU0sRUZJckQsSUFBTUcsRUFBTixj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QUF5QixPQUFBQyxHQUFLLFFBQUFDLE9BQVksTUFnQm5DLElBQU1DLEdBQU4sY0FBOEJDLENBQVUsQ0FXcEMsUUFBUyxDQUNoQixPQUFPQztBQUFBLGlDQUVULENBQ0YsRUFmYUYsR0FDSixPQUFTRztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFETEgsR0FBTkksRUFBQSxDQUROQyxHQUFjLG1CQUFtQixHQUNyQkwsSUN1RGIsUUFBUSxJQUNOLDBDQUNBLGdDQUNBLGdHQUNBLG1CQUNGIiwKICAibmFtZXMiOiBbInByb3ZpZGUiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAid2F0Y2giLCAicHJvcGVydHlOYW1lIiwgIm9wdGlvbnMiLCAicmVzb2x2ZWRPcHRpb25zIiwgIl9fc3ByZWFkVmFsdWVzIiwgInByb3RvIiwgImRlY29yYXRlZEZuTmFtZSIsICJ1cGRhdGUiLCAid2F0Y2hlZFByb3BlcnRpZXMiLCAiY2hhbmdlZFByb3BzIiwgInByb3BlcnR5IiwgImtleSIsICJvbGRWYWx1ZSIsICJuZXdWYWx1ZSIsICJjcmVhdGVDb250ZXh0IiwgIml0ZW1Db250ZXh0VmFyaWFibGVzIiwgIml0ZW1Db250ZXh0IiwgIlF0aUFzc2Vzc21lbnRJdGVtIiwgIkxpdEVsZW1lbnQiLCAiXyIsICJkaXNhYmxlZCIsICJjaCIsICJyZWFkb25seSIsICJpdGVtQ29udGV4dFZhcmlhYmxlcyIsICJfX3NwcmVhZFByb3BzIiwgIl9fc3ByZWFkVmFsdWVzIiwgImZlZWRiYWNrRWxlbWVudCIsICJyZXNwb25zZUlkZW50aWZpZXIiLCAiY291bnRBdHRlbXB0IiwgIm91dGNvbWVJZGVudGlmaWVyIiwgInZhbHVlIiwgInYiLCAidmFyaWFibGUiLCAibWF0Y2hpbmdWYWx1ZSIsICJpbnRlcmFjdGlvbkVsZW1lbnQiLCAiZWwiLCAiZmUiLCAibXlSZXNwb25zZXMiLCAicmVzcG9uc2UiLCAiaW50ZXJhY3Rpb24iLCAiaSIsICJodG1sIiwgInNob3ciLCAicmVzcG9uc2VzIiwgInZhcmkiLCAiY3IiLCAiY291bnROdW1BdHRlbXB0cyIsICJfYSIsICJyZXNwb25zZVByb2Nlc3NvciIsICJpZGVudGlmaWVyIiwgImV2ZW50IiwgIm91dGNvbWVWYXJpYWJsZSIsICJuYW1lIiwgImRldGFpbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAid2F0Y2giLCAicHJvdmlkZSIsICJpdGVtQ29udGV4dCIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJRdGlBc3Nlc3NtZW50U3RpbXVsdXNSZWYiLCAiTGl0RWxlbWVudCIsICJldmVudCIsICJzdGltdWx1c1JlZiIsICJwYXRoIiwgInN0aW11bHVzIiwgInF0aVRyYW5zZm9ybUl0ZW0iLCAiYXBpIiwgImVsZW1lbnRzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJwcm9wZXJ0eSIsICJLRVlDT0RFIiwgIlF0aUNob2ljZSIsICJMaXRFbGVtZW50IiwgIl8iLCAiZGlzYWJsZWQiLCAiZXZlbnQiLCAiaHRtbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAidmFsdWUiLCAid2F0Y2giLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3NzIiwgInF0aV9pdGVtX2JvZHlfc3R5bGVzX2RlZmF1bHQiLCAiUXRpSXRlbUJvZHkiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgInF0aV9pdGVtX2JvZHlfc3R5bGVzX2RlZmF1bHQiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpUHJvbXB0IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpU3R5bGVzaGVldCIsICJMaXRFbGVtZW50IiwgIl9jaGFuZ2VkUHJvcGVydGllcyIsICJpdGVtIiwgImxpbmsiLCAic3R5bGVzIiwgImVycm9yIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNvbnN1bWUiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlWYXJpYWJsZURlY2xhcmF0aW9uIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJ2YXJpYWJsZSIsICJodG1sVmFsdWVzIiwgImRlZmF1bHRWYWx1ZXMiLCAibiIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlPdXRjb21lRGVjbGFyYXRpb24iLCAiUXRpVmFyaWFibGVEZWNsYXJhdGlvbiIsICJfYSIsICJfYiIsICJ2YWx1ZSIsICJ2IiwgImh0bWwiLCAidGFibGUiLCAiZW50cmllcyIsICJlbnRyeSIsICJzb3VyY2VWYWx1ZSIsICJ0YXJnZXRWYWx1ZSIsICJvdXRjb21lVmFyaWFibGUiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJjb25zdW1lIiwgIml0ZW1Db250ZXh0IiwgInN0YXRlIiwgImN1c3RvbUVsZW1lbnQiLCAiY29uc3VtZSIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgIlF0aVJlc3BvbnNlRGVjbGFyYXRpb24iLCAiUXRpVmFyaWFibGVEZWNsYXJhdGlvbiIsICJfYSIsICJfYiIsICJ2YWx1ZSIsICJ2IiwgImh0bWwiLCAicmVzcG9uc2VWYXJpYWJsZSIsICJyZXN1bHQiLCAiY29ycmVjdFJlc3BvbnNlIiwgInZhbHVlcyIsICJpIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY29uc3VtZSIsICJpdGVtQ29udGV4dCIsICJzdGF0ZSIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlDb21wYW5pb25NYXRlcmlhbHNJbmZvIiwgIkxpdEVsZW1lbnQiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpQ29udGVudEJvZHkiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJRdGlSdWJyaWNCbG9jayIsICJMaXRFbGVtZW50IiwgIm9sZCIsICJkaXNhYmxlZCIsICJjbGFzc05hbWUiLCAiaHRtbCIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgIndhdGNoIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgInByb3BlcnR5IiwgImRlY2ltYWxTZXBhcmF0b3IiLCAiY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQiLCAibnVtYmVyIiwgImRTZXAiLCAiSXNOdWxsT3JVbmRlZmluZWQiLCAidmFsdWUiLCAicmVtb3ZlRG91YmxlU2xhc2hlcyIsICJzdHIiLCAiUXRpRmVlZGJhY2siLCAiTGl0RWxlbWVudCIsICJvdXRjb21lSWRlbnRpZmllciIsICJvdXRjb21lVmFyaWFibGUiLCAiaXNGb3VuZCIsICJJc051bGxPclVuZGVmaW5lZCIsICJ2YWx1ZSIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiUXRpRmVlZGJhY2tCbG9jayIsICJRdGlGZWVkYmFjayIsICJodG1sIiwgIl9jaGFuZ2VkUHJvcGVydGllcyIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlGZWVkYmFja0lubGluZSIsICJRdGlGZWVkYmFjayIsICJodG1sIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgIlF0aU1vZGFsRmVlZGJhY2siLCAiUXRpRmVlZGJhY2siLCAiaHRtbCIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiaWZEZWZpbmVkIiwgInByb3BlcnR5IiwgIkxpdEVsZW1lbnQiLCAiSW50ZXJhY3Rpb24iLCAiTGl0RWxlbWVudCIsICJ2YWwiLCAidmFsdWUiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgInJlZiIsICJjcmVhdGVSZWYiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJRdGlFeHRlbmRlZFRleHRJbnRlcmFjdGlvbiIsICJJbnRlcmFjdGlvbiIsICJjcmVhdGVSZWYiLCAib2xkIiwgImRpc2FibGVkIiwgImNsYXNzTmFtZSIsICJuclJvd3MiLCAidmFsdWUiLCAiY3NzIiwgImh0bWwiLCAicmVmIiwgImV2ZW50IiwgImlmRGVmaW5lZCIsICJpbnB1dCIsICJ0ZXh0IiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJ3YXRjaCIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiaWZEZWZpbmVkIiwgImNyZWF0ZVJlZiIsICJsaXZlUXVlcnkiLCAicXVlcnlTZWxlY3RvciIsICJvcHRpb25zIiwgIm9ic2VydmVyIiwgInJlc29sdmVkT3B0aW9ucyIsICJfX3NwcmVhZFZhbHVlcyIsICJwcm90byIsICJkZWNvcmF0ZWRGbk5hbWUiLCAiY29ubmVjdGVkQ2FsbGJhY2siLCAiZGlzY29ubmVjdGVkQ2FsbGJhY2siLCAiX2EiLCAiY2FsbGJhY2siLCAibXV0YXRpb25MaXN0IiwgImVsZW1lbnRzVG9XYXRjaCIsICJtdXRhdGlvbiIsICJhZGRlZE5vZGVzIiwgImUiLCAicmVtb3ZlZE5vZGVzIiwgIm4iLCAiZWxlbWVudHNBZGRlZCIsICJRdGlUZXh0RW50cnlJbnRlcmFjdGlvbiIsICJJbnRlcmFjdGlvbiIsICJjcmVhdGVSZWYiLCAib2xkIiwgImNsYXNzZXMiLCAiY2xhc3NOYW1lIiwgIm5yUm93cyIsICJ2YWx1ZSIsICJjc3MiLCAiaHRtbCIsICJldmVudCIsICJpZkRlZmluZWQiLCAiaW5wdXQiLCAidGV4dCIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAic3RhdGUiLCAid2F0Y2giLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiQ2hvaWNlcyIsICJJbnRlcmFjdGlvbiIsICJfIiwgImRpc2FibGVkIiwgImNoIiwgInJlYWRvbmx5IiwgImFjYyIsICJ2YWwiLCAicmVzcG9uc2VWYWx1ZSIsICJyZXNwb25zZVZhbHVlQXJyYXkiLCAiY2UiLCAicnYiLCAiY2hvaWNlRWxlbWVudCIsICJldmVudCIsICJzZWxlY3RlZElkZW50aWZpZXJzIiwgInJlc3VsdCIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAid2F0Y2giLCAiUXRpSG90dGV4dEludGVyYWN0aW9uIiwgIkNob2ljZXMiLCAiaHRtbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgInVuc2FmZUhUTUwiLCAiUXRpSW5saW5lQ2hvaWNlSW50ZXJhY3Rpb24iLCAiSW50ZXJhY3Rpb24iLCAiY3NzIiwgImh0bWwiLCAib3B0aW9uIiwgInVuc2FmZUhUTUwiLCAiY2hvaWNlcyIsICJjaG9pY2UiLCAic2VsZWN0ZWRPcHRpb24iLCAiaSIsICJfX3NwcmVhZFByb3BzIiwgIl9fc3ByZWFkVmFsdWVzIiwgInZhbHVlIiwgImV2ZW50IiwgInNlbGVjdGVkT3B0aW9uVmFsdWUiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInN0YXRlIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJodG1sIiwgImNzcyIsICJxdGlfY2hvaWNlX2ludGVyYWN0aW9uX3N0eWxlc19kZWZhdWx0IiwgIlF0aUNob2ljZUludGVyYWN0aW9uIiwgIkNob2ljZXMiLCAiaHRtbCIsICJxdGlfY2hvaWNlX2ludGVyYWN0aW9uX3N0eWxlc19kZWZhdWx0IiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlPdXRjb21lUHJvY2Vzc2luZyIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAibG9naWMiLCAiUXRpT3V0Y29tZVByb2Nlc3NpbmdQcm9jZXNzb3IiLCAicnVsZXMiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgInJ1bGUiLCAiY3NzIiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgIm1hdGNoQ29ycmVjdCIsICJtYXBSZXNwb25zZSIsICJtYXBSZXNwb25zZVBvaW50IiwgIlF0aVJlc3BvbnNlUHJvY2Vzc2luZyIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAicnVsZXMiLCAicnVsZSIsICJfY2hhbmdlZFByb3BlcnRpZXMiLCAic3BsaXR0ZWRUZW1wbGF0ZU5hbWUiLCAidGVtcGxhdGVOYW1lIiwgIm1hcFJlc3BvbnNlIiwgIm1hcFJlc3BvbnNlUG9pbnQiLCAibWF0Y2hDb3JyZWN0IiwgInN0ckhUTUwiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgIlF0aVJ1bGUiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgIlF0aUxvb2t1cE91dGNvbWVWYWx1ZSIsICJRdGlSdWxlIiwgImlkZW50aWZpZXIiLCAib3V0Y29tZVZhcmlhYmxlIiwgInZhbHVlIiwgImNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0IiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJodG1sIiwgIlF0aVJlc3BvbnNlQ29uZGl0aW9uIiwgIlF0aVJ1bGUiLCAiaHRtbCIsICJicmFuY2hlcyIsICJpIiwgImJyYW5jaCIsICJRdGlTZXRPdXRjb21lVmFsdWUiLCAiUXRpUnVsZSIsICJvdXRjb21lSWRlbnRpZmllciIsICJleHByZXNzaW9uIiwgInZhbHVlIiwgIlF0aVNldE91dGNvbWVWYWx1ZVJ1bGUiLCAidiIsICJjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiUXRpUmVzcG9uc2VFbHNlIiwgInN1YlJ1bGVzIiwgImkiLCAiaHRtbCIsICJRdGlSZXNwb25zZUlmIiwgIlF0aVJlc3BvbnNlRWxzZSIsICJyZXN1bHQiLCAiaSIsICJRdGlSZXNwb25zZUVsc2VJZiIsICJRdGlSZXNwb25zZUlmIiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJzdGF0ZSIsICJRdGlFeHByZXNzaW9uIiwgIkxpdEVsZW1lbnQiLCAiaWRlbnRpZmllciIsICJ2YWx1ZXMiLCAidiIsICJyZXNwb25zZVZhcmlhYmxlIiwgImVycm9yIiwgImh0bWwiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJzdGF0ZSIsICJRdGlDb25kaXRpb25FeHByZXNzaW9uIiwgIlF0aUV4cHJlc3Npb24iLCAiUXRpQW5kIiwgInF0aUFuZE1peGluIiwgIlF0aUNvbmRpdGlvbkV4cHJlc3Npb24iLCAiQmFzZSIsICJjaGlsZHJlbiIsICJjIiwgImNvbmRpdGlvbiIsICJ2YWx1ZSIsICJlIiwgIlF0aUFuZCIsICJwcm9wZXJ0eSIsICJRdGlCYXNlVmFsdWUiLCAiUXRpRXhwcmVzc2lvbiIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiUXRpQ29udGFpbnMiLCAiUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiIsICJ2YWx1ZXMiLCAidmFsdWUxIiwgInZhbHVlMiIsICJwcm9qZWN0aW9uMSIsICJwcm9qZWN0aW9uMiIsICJ4IiwgIlF0aUNvcnJlY3QiLCAiUXRpRXhwcmVzc2lvbiIsICJpZGVudGlmaWVyIiwgInJlc3BvbnNlVmFyaWFibGUiLCAicHJvcGVydHkiLCAiUXRpRXF1YWxSb3VuZGVkIiwgIlF0aUV4cHJlc3Npb24iLCAiZmlndXJlcyIsICJ2YWx1ZXMiLCAidmFsdWUxIiwgInZhbHVlMiIsICJmbG9hdDEiLCAiZmxvYXQyIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJwcm9wZXJ0eSIsICJTY29yaW5nSGVscGVyIiwgInZhbHVlMSIsICJ2YWx1ZTIiLCAiYmFzZVR5cGUiLCAiaW50MSIsICJpbnQyIiwgImZsb2F0MSIsICJmbG9hdDIiLCAicGFpcjEiLCAicGFpcjIiLCAiUXRpRXF1YWwiLCAiUXRpRXhwcmVzc2lvbiIsICJ2YWx1ZXMiLCAidmFsdWUxIiwgInZhbHVlMiIsICJTY29yaW5nSGVscGVyIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJRdGlHdCIsICJRdGlFeHByZXNzaW9uIiwgInZhbHVlcyIsICJ2YWx1ZTEiLCAidmFsdWUyIiwgIlF0aUd0ZSIsICJRdGlDb25kaXRpb25FeHByZXNzaW9uIiwgInZhbHVlcyIsICJ2YWx1ZTEiLCAidmFsdWUyIiwgIlF0aUlzTnVsbCIsICJRdGlFeHByZXNzaW9uIiwgInZhcmlhYmxlcyIsICJ2YWx1ZSIsICJRdGlMdCIsICJRdGlFeHByZXNzaW9uIiwgInZhbHVlcyIsICJ2YWx1ZTEiLCAidmFsdWUyIiwgIlF0aUx0ZSIsICJRdGlDb25kaXRpb25FeHByZXNzaW9uIiwgInZhbHVlcyIsICJ2YWx1ZTEiLCAidmFsdWUyIiwgInByb3BlcnR5IiwgIlF0aU1hcFJlc3BvbnNlIiwgIlF0aUV4cHJlc3Npb24iLCAicmVzcG9uc2UiLCAibWFwcGluZyIsICJjYW5kaWRhdGVSZXNwb25zZXMiLCAicmVzdWx0IiwgImNhbmRpZGF0ZVJlc3BvbnNlIiwgIm1hcHBlZFZhbHVlIiwgImVudHJ5IiwgIlNjb3JpbmdIZWxwZXIiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgInByb3BlcnR5IiwgIkxpdEVsZW1lbnQiLCAiUXRpTWFwcGluZyIsICJMaXRFbGVtZW50IiwgImVsIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJRdGlNYXRjaCIsICJfUXRpTWF0Y2giLCAiUXRpRXhwcmVzc2lvbiIsICJ2YWx1ZXMiLCAidmFsdWVUb01hcCIsICJjb3JyZWN0VmFsdWVJbmZvIiwgIl9hIiwgIlNjb3JpbmdIZWxwZXIiLCAiYW5zd2VySW5kZXgiLCAiY29ycmVjdEFuc3dlciIsICJjdXJyZW50VmFsdWVUb01hcCIsICJtYXRjaGluZ1ZhbHVlIiwgIm12IiwgIlF0aU1lbWJlciIsICJRdGlFeHByZXNzaW9uIiwgInZhbHVlcyIsICJ2YWx1ZTEiLCAidmFsdWUyIiwgInByb2plY3Rpb24xIiwgIlF0aU11bHRpcGxlIiwgIlF0aUV4cHJlc3Npb24iLCAidmFyaWFibGVzIiwgInZhcmlhYmxlIiwgImh0bWwiLCAiUXRpTm90IiwgIlF0aUV4cHJlc3Npb24iLCAiaHRtbCIsICJRdGlPciIsICJRdGlDb25kaXRpb25FeHByZXNzaW9uIiwgImMiLCAiY29uZGl0aW9uIiwgInZhbHVlIiwgIlF0aU9yZGVyZWQiLCAiUXRpRXhwcmVzc2lvbiIsICJ2YXJpYWJsZXMiLCAidmFyaWFibGUiLCAiY29uc3VtZSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiUXRQcmludGVkVmFyaWFibGUiLCAiTGl0RWxlbWVudCIsICJfYSIsICJfYiIsICJ2YWx1ZSIsICJ2IiwgImh0bWwiLCAiYXNzZXNzbWVudEl0ZW0iLCAiaWRlbnRpZmllciIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY29uc3VtZSIsICJpdGVtQ29udGV4dCIsICJzdGF0ZSIsICJRdGlQcm9kdWN0IiwgIlF0aUV4cHJlc3Npb24iLCAiYWNjdW11bGF0b3IiLCAiY3VycmVudFZhbHVlIiwgImVycm9yIiwgInByb3BlcnR5IiwgIlF0aVN0cmluZ01hdGNoIiwgIlF0aUV4cHJlc3Npb24iLCAidmFsdWVzIiwgInZhbHVlMSIsICJ2YWx1ZTIiLCAidjEiLCAidjIiLCAiU2NvcmluZ0hlbHBlciIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiUXRpU3VtIiwgIlF0aUV4cHJlc3Npb24iLCAiUXRpU3VtRXhwcmVzc2lvbiIsICJleHByZXNzaW9ucyIsICJjIiwgInZhbHVlIiwgImEiLCAiYiIsICJRdGlWYXJpYWJsZSIsICJRdGlFeHByZXNzaW9uIiwgImlkZW50aWZpZXIiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgIlF0aVBvcnRhYmxlQ3VzdG9tSW50ZXJhY3Rpb24iLCAiSW50ZXJhY3Rpb24iLCAidXJsIiwgImJhc2VVcmwiLCAicmVxdWlyZUNvbmZpZyIsICJtb2R1bGVDb25nIiwgIm1vZHVsZUlkIiwgImUiLCAicGF0aCIsICJiYXNlUGF0aCIsICJjb25maWciLCAicHJpbWFyeUNvbmZpZyIsICJmYWxsYmFjayIsICJfYSIsICJmYWlsZWRUb1Jlc29sdmUiLCAicGF0aFdpdGhFeHRlbnNpb24iLCAiZmFsbGJhY2tDb25maWciLCAiaW5wdXQiLCAidG9wTGV2ZWxLZXkiLCAibmVzdGVkT2JqZWN0IiwgIm5lc3RlZEtleSIsICJ2YWx1ZSIsICJyZXNwb25zZSIsICJuZXdSZXNwb25zZSIsICJzdHJpbmdpZmllZCIsICJ2YWwiLCAibm9kZSIsICJhIiwgImdldFByb3BlcnR5VmFsdWUiLCAiZWwiLCAicHJvcGVydHkiLCAia2V5IiwgImNoaWxkcmVuIiwgImFsbEtleSIsICJjIiwgImsiLCAiZ2V0Q2hpbGRQcm9wZXJ0aWVzIiwgInByb3BlcnRpZXMiLCAiY2hpbGQiLCAiX19zcHJlYWRWYWx1ZXMiLCAicGNpIiwgInR5cGUiLCAiZG9tIiwgImFjYyIsICJsaW5rIiwgInN0eWxlcyIsICJyZXF1aXJlIiwgImN0eEEiLCAid2FzUHJldmlvdXNseUxvYWRlZCIsICJlcnIiLCAibW9kdWxlUmVzb2x1dGlvblBhdGgiLCAibW9kdWxlUmVzb2x1dGlvbkZhbGxiYWNrUGF0aCIsICJpbnRlcmFjdGlvbk1vZHVsZXMiLCAibW9kdWxlcyIsICJtb2R1bGUiLCAicHJpbWFyeVBhdGgiLCAiZmFsbGJhY2tQYXRoIiwgIl9fc3ByZWFkUHJvcHMiLCAic3RyIiwgImh0bWwiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInN0YXRlIiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInN0YXRlIiwgIlRvdWNoRHJhZ0FuZERyb3AiLCAiX1RvdWNoRHJhZ0FuZERyb3AiLCAidHlwZSIsICJ2YWwiLCAiZSIsICJfdG91Y2hlcyIsICJlbGVtZW50U3R5bGVzIiwgInN0eWxlIiwgIl90aGlzIiwgInRhcmdldCIsICJkcmFnZ2FibGVzIiwgImVsIiwgIngiLCAieSIsICJfYSIsICJldmVudCIsICJwb2ludEZyb21Ub3VjaEV2ZW50IiwgImN1c3RvbUVsIiwgInBhZ2UiLCAidG91Y2giLCAiY2xpZW50UmVjdCIsICJldmVudFR5cGUiLCAiYnViYmxlIiwgInByb3BlcnR5IiwgIkRyb3BwYWJsZXNNaXhpbiIsICJzdXBlckNsYXNzIiwgImRyb3BwYWJsZXNJblNoYWRvd1Jvb3QiLCAiZHJvcHBhYmxlc1NlbGVjdG9yIiwgIkRyb3BwYWJsZXNFbGVtZW50IiwgImNoYW5nZWRQcm9wcyIsICJkcm9wcGFibGVzIiwgImQiLCAiZHJvcHBhYmxlIiwgIm11dGF0aW9ucyIsICJtdXRhdGlvbiIsICJfYSIsICJldiIsICJkcmFnZ2FibGVJbkxpZ2h0RG9tIiwgImRyYWdnYWJsZSIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiRmxpcHBhYmxlc01peGluIiwgInN1cGVyQ2xhc3MiLCAiZHJvcHBhYmxlc1NlbCIsICJkcmFnZ2FibGVzU2VsIiwgIkZsaXBwYWJsZXNFbGVtZW50IiwgInByb3BlcnR5IiwgIkRyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiIsICJzdXBlckNsYXNzIiwgImRyYWdnYWJsZXNTZWxlY3RvciIsICJkcm9wcGFibGVzSW5TaGFkb3dSb290IiwgImRyb3BwYWJsZXNTZWxlY3RvciIsICJEcmFnRHJvcEludGVyYWN0aW9uRWxlbWVudCIsICJGbGlwcGFibGVzTWl4aW4iLCAiRHJvcHBhYmxlc01peGluIiwgImRyYWdzQWRkZWQiLCAiZHJhZ3NSZW1vdmVkIiwgImVsZW0iLCAiZXYiLCAiZHJhZ2dhYmxlIiwgInBvc2l0aW9uIiwgImluZGV4IiwgImludGVyYWN0aW9uIiwgImdhcFRleHQiLCAib2xkIiwgImRyYWdPcHRpb25zIiwgImRpc2FibGVkIiwgInMiLCAiY2giLCAicmVhZG9ubHkiLCAiY2hhbmdlZFByb3BzIiwgIlRvdWNoRHJhZ0FuZERyb3AiLCAic2F2ZSIsICJjaGlsZHJlbiIsICJkIiwgImRpc2FibGUiLCAicmVzcG9uc2UiLCAiZHJvcElkIiwgImRyYWdJZHMiLCAiZHJvcHBhYmxlIiwgImRyb3AiLCAiZHJhZ0lkIiwgImFzc29jaWF0aW9ucyIsICJfYSIsICJyZXNwb25zZVN0cmluZyIsICJfX2RlY29yYXRlQ2xhc3MiLCAibGl2ZVF1ZXJ5IiwgInByb3BlcnR5IiwgIndhdGNoIiwgIlF0aUFzc29jaWF0ZUludGVyYWN0aW9uIiwgIkRyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiXyIsICJpbmRleCIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInN0YXRlIiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgIlF0aUN1c3RvbUludGVyYWN0aW9uIiwgIkludGVyYWN0aW9uIiwgInVyaVRvTWFuaWZlc3QiLCAicmVtb3ZlRG91YmxlU2xhc2hlcyIsICJyZXNwb25zZSIsICJkYXRhIiwgImVyciIsICJpZnJhbWUiLCAiaWZyYW1lV2luIiwgImlmcmFtZURvYyIsICJldmVudCIsICJ0eXBlIiwgIm1lZGlhRGF0YSIsICJtZWRpYSIsICJ2YWwiLCAiaHRtbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiUXRpRW5kQXR0ZW1wdEludGVyYWN0aW9uIiwgIkludGVyYWN0aW9uIiwgInZhbCIsICJodG1sIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlHYXBNYXRjaEludGVyYWN0aW9uIiwgIkRyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgInN2ZyIsICJjdXN0b21FbGVtZW50IiwgInF1ZXJ5IiwgInF1ZXJ5QXNzaWduZWRFbGVtZW50cyIsICJzdGF0ZSIsICJpZkRlZmluZWQiLCAicmVwZWF0IiwgInBvc2l0aW9uSG90c3BvdHMiLCAic2hhcGUiLCAiY29vcmRzTnVtYmVyIiwgImltZyIsICJob3RzcG90IiwgImNlbnRlclgiLCAiY2VudGVyWSIsICJyYWRpdXMiLCAiY2VudGVyWFBlciIsICJjZW50ZXJZUGVyIiwgInJhZGl1c1BlciIsICJsZWZ0WCIsICJ0b3BZIiwgInJpZ2h0WCIsICJib3R0b21ZIiwgImxlZnRYUGVyIiwgInRvcFlQZXIiLCAicmlnaHRYUGVyIiwgImJvdHRvbVlQZXIiLCAicG9seWNvb3JkcyIsICJhY2MiLCAiY3VycmVudFZhbHVlIiwgImN1cnJlbnRJbmRleCIsICJwb2x5QyIsICJsYXN0VmFsIiwgInBvaW50IiwgInBvbHlEIiwgInAiLCAiUXRpR3JhcGhpY0Fzc29jaWF0ZUludGVyYWN0aW9uIiwgIkludGVyYWN0aW9uIiwgInZhbCIsICJfYSIsICJfYiIsICJfYyIsICJfZCIsICJodG1sIiwgImlmRGVmaW5lZCIsICJyZXBlYXQiLCAibGluZSIsICJpbmRleCIsICJzdmciLCAiZSIsICJfIiwgImkiLCAiaW1nIiwgImhvdHNwb3QiLCAiY29vcmRzIiwgInNoYXBlIiwgImNvb3Jkc051bWJlciIsICJzIiwgInBvc2l0aW9uSG90c3BvdHMiLCAiZXZlbnQiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJzdGF0ZSIsICJxdWVyeSIsICJxdWVyeUFzc2lnbmVkRWxlbWVudHMiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpR3JhcGhpY0dhcE1hdGNoSW50ZXJhY3Rpb24iLCAiRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJlIiwgImltZyIsICJob3RzcG90IiwgImNvb3JkcyIsICJzaGFwZSIsICJjb29yZHNOdW1iZXIiLCAicyIsICJjZW50ZXJYIiwgImNlbnRlclkiLCAicmFkaXVzIiwgImxlZnRYIiwgInRvcFkiLCAicmlnaHRYIiwgImJvdHRvbVkiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpR3JhcGhpY09yZGVySW50ZXJhY3Rpb24iLCAiQ2hvaWNlcyIsICJodG1sIiwgImUiLCAiaWRlbnRpZmllciIsICJob3RzcG90IiwgImVsIiwgIm1heFNlbGVjdGlvbiIsICJpIiwgImltZyIsICJjb29yZHMiLCAic2hhcGUiLCAiY29vcmRzTnVtYmVyIiwgInMiLCAicG9zaXRpb25Ib3RzcG90cyIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlIb3RzcG90SW50ZXJhY3Rpb24iLCAiQ2hvaWNlcyIsICJodG1sIiwgImUiLCAiaW1nIiwgImhvdHNwb3QiLCAiY29vcmRzIiwgInNoYXBlIiwgImNvb3Jkc051bWJlciIsICJzIiwgInBvc2l0aW9uSG90c3BvdHMiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgInVuc2FmZUhUTUwiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiUXRpU2ltcGxlQXNzb2NpYWJsZUNob2ljZSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpTWF0Y2hJbnRlcmFjdGlvbiIsICJEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4iLCAiTGl0RWxlbWVudCIsICJyYWRpbyIsICJjaGVja2JveCIsICJ2YWx1ZSIsICJ2IiwgImh0bWwiLCAiY29sIiwgImkiLCAidW5zYWZlSFRNTCIsICJyb3ciLCAickluZGV4IiwgImNJbmRleCIsICJyb3dJZCIsICJjb2xJZCIsICJzZWxlY3RlZEluUm93Q291bnQiLCAiY2hlY2tlZCIsICJkaXNhYmxlIiwgImUiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInN0YXRlIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlNZWRpYUludGVyYWN0aW9uIiwgIkludGVyYWN0aW9uIiwgInZhbCIsICJfX3NwcmVhZFByb3BzIiwgIl9fc3ByZWFkVmFsdWVzIiwgImh0bWwiLCAibWVkaWFPYmplY3QiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJRdGlPcmRlckludGVyYWN0aW9uIiwgIkRyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiXyIsICJpIiwgImVsIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImNzcyIsICJodG1sIiwgIlF0aVNQb3NpdGlvbk9iamVjdEludGVyYWN0aW9uIiwgIkxpdEVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlQb3NpdGlvbk9iamVjdFN0YWdlIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJldmVudCIsICJkZWx0YVgiLCAiZGVsdGFZIiwgImEiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAicmVwZWF0IiwgInN0eWxlTWFwIiwgIlF0aVNlbGVjdFBvaW50SW50ZXJhY3Rpb24iLCAiSW50ZXJhY3Rpb24iLCAiaHRtbCIsICJyZXBlYXQiLCAicG9pbnQiLCAiaW5kZXgiLCAic3R5bGVNYXAiLCAiZSIsICJfIiwgImkiLCAidmFsIiwgImV2ZW50IiwgIngiLCAieSIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgInN0YXRlIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAibm90aGluZyIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInF1ZXJ5IiwgIlF0aVNsaWRlckludGVyYWN0aW9uIiwgIkludGVyYWN0aW9uIiwgIm9sZCIsICJkaXNhYmxlZCIsICJyZWFkb25seSIsICJ2YWx1ZSIsICJteVJlc3BvbnNlIiwgInZhbHVlUGVyY2VudGFnZSIsICJodG1sIiwgIm5vdGhpbmciLCAiZXZlbnQiLCAiaGFuZGxlVG91Y2hNb3ZlIiwgIngiLCAiZGlmZlgiLCAiaGFuZGxlVG91Y2hFbmQiLCAiaGFuZGxlTW91c2VNb3ZlIiwgImhhbmRsZU1vdXNlVXAiLCAidmFsdWVOb3ciLCAicm91bmRlZFN0ZXBWYWx1ZSIsICJfdG91Y2hNb3ZlIiwgImV2dCIsICJ0b3VjaCIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInF1ZXJ5IiwgInByb3BlcnR5IiwgIndhdGNoIiwgImN1c3RvbUVsZW1lbnQiLCAiY29uc3VtZSIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJzdGF0ZSIsICJRdGlDdXN0b21PcGVyYXRvciIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiZXZlbnQiLCAiX2EiLCAiX2IiLCAiX2MiLCAiY29tbWVudE5vZGUiLCAibm9kZSIsICJlIiwgImZuIiwgInJlc3BvbnNlSWRlbnRpZmllciIsICJ2IiwgIml0ZW0iLCAidmFyaWFibGVJZGVudGlmaWVyIiwgIm91dGNvbWVJZGVudGlmaWVyIiwgInZhbHVlIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjb25zdW1lIiwgIml0ZW1Db250ZXh0IiwgInN0YXRlIiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgIlF0aUFzc29jaWFibGVIb3RzcG90IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiUXRpR2FwIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiUXRpR2FwSW1nIiwgIkxpdEVsZW1lbnQiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiUXRpR2FwVGV4dCIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiUXRpSG90c3BvdENob2ljZSIsICJRdGlDaG9pY2UiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJRdGlIb3R0ZXh0IiwgIlF0aUNob2ljZSIsICJodG1sIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlJbmxpbmVDaG9pY2UiLCAiTGl0RWxlbWVudCIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgIlF0aVNpbXBsZUNob2ljZSIsICJRdGlDaG9pY2UiLCAiaHRtbCIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImN1c3RvbUVsZW1lbnQiXQp9Cg==
|
|
494
|
+
`,Re=i([Oo("qti-simple-choice")],Re);console.log("%cC\xBFTO%cLab%c: qti-components loaded","font-weight:bold; color:green",'font-family: "PT Sans", font-weight:bold; color:green; font-size: smaller;vertical-align: sub',"font-weight:unset");export{h as Interaction,he as QtPrintedVariable,Ue as QtiAnd,_ as QtiAssessmentItem,z as QtiAssessmentStimulusRef,_e as QtiAssociableHotspot,ee as QtiAssociateInteraction,Fe as QtiBaseValue,C as QtiChoice,Z as QtiChoiceInteraction,Se as QtiCompanionMaterialsInfo,T as QtiConditionExpression,at as QtiContains,Ne as QtiContentBody,lt as QtiCorrect,$ as QtiCustomInteraction,Ce as QtiCustomOperator,te as QtiEndAttemptInteraction,Be as QtiEqual,Ie as QtiEqualRounded,u as QtiExpression,N as QtiExtendedTextInteraction,le as QtiFeedbackBlock,ce as QtiFeedbackInline,we as QtiGap,ke as QtiGapImg,ge as QtiGapMatchInteraction,Te as QtiGapText,D as QtiGraphicAssociateInteraction,be as QtiGraphicGapMatchInteraction,ve as QtiGraphicOrderInteraction,ct as QtiGt,pt as QtiGte,ie as QtiHotspotChoice,ye as QtiHotspotInteraction,ze as QtiHottext,Oe as QtiHottextInteraction,Je as QtiInlineChoice,F as QtiInlineChoiceInteraction,dt as QtiIsNull,Pe as QtiLookupOutcomeValue,ut as QtiLt,mt as QtiLte,Xe as QtiMapResponse,G as QtiMapping,ft as QtiMatch,B as QtiMatchInteraction,Ee as QtiMediaInteraction,gt as QtiMember,pe as QtiModalFeedback,bt as QtiMultiple,vt as QtiNot,yt as QtiOr,O as QtiOrderInteraction,xt as QtiOrdered,L as QtiOutcomeDeclaration,de as QtiOutcomeProcessing,rt as QtiOutcomeProcessingProcessor,I as QtiPortableCustomInteraction,qe as QtiPositionObjectStage,Et as QtiProduct,Ae as QtiPrompt,st as QtiResponseCondition,P as QtiResponseDeclaration,ue as QtiResponseElse,nt as QtiResponseElseIf,me as QtiResponseIf,j as QtiResponseProcessing,S as QtiRubricBlock,H as QtiRule,Ke as QtiSPositionObjectInteraction,X as QtiSelectPointInteraction,it as QtiSetOutcomeValue,ot as QtiSetOutcomeValueRule,K as QtiSimpleAssociableChoice,Re as QtiSimpleChoice,q as QtiSliderInteraction,Ye as QtiStringMatch,Me as QtiStylesheet,qt as QtiSum,Ct as QtiSumExpression,k as QtiTextEntryInteraction,_t as QtiVariable,M as itemContext,St as itemContextVariables,Ys as qtiAndMixin};
|
|
495
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0udHMiLCAiLi4vLi4vc3JjL2xpYi9kZWNvcmF0b3JzL3dhdGNoLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYvcXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2Nob2ljZS9xdGktY2hvaWNlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWl0ZW0tYm9keS9xdGktaXRlbS1ib2R5LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWl0ZW0tYm9keS9xdGktaXRlbS1ib2R5LnN0eWxlcy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1wcm9tcHQvcXRpLXByb21wdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1zdHlsZXNoZWV0L3F0aS1zdHlsZXNoZWV0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uL3F0aS1vdXRjb21lLWRlY2xhcmF0aW9uL3F0aS1vdXRjb21lLWRlY2xhcmF0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbi9xdGktcmVzcG9uc2UtZGVjbGFyYXRpb24vcXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mby9xdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJ1YnJpYy1ibG9jay9xdGktY29udGVudC1ib2R5LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJ1YnJpYy1ibG9jay9xdGktcnVicmljLWJsb2NrLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay1ibG9jay9xdGktZmVlZGJhY2stYmxvY2sudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktZmVlZGJhY2svcXRpLWZlZWRiYWNrLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvaW50ZXJuYWwvdXRpbHMudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktZmVlZGJhY2svcXRpLWZlZWRiYWNrLWlubGluZS9xdGktZmVlZGJhY2staW5saW5lLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWZlZWRiYWNrL3F0aS1tb2RhbC1mZWVkYmFjay9xdGktbW9kYWwtZmVlZGJhY2sudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWV4dGVuZGVkLXRleHQtaW50ZXJhY3Rpb24vcXRpLWV4dGVuZGVkLXRleHQtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24vcXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9kZWNvcmF0b3JzL2xpdmUtcXVlcnkudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvY2hvaWNlcy9jaG9pY2VzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktY2hvaWNlLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24uc3R5bGVzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLW91dGNvbWUtcHJvY2Vzc2luZy9xdGktb3V0Y29tZS1wcm9jZXNzaW5nLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9pbnRlcm5hbC90ZW1wbGF0ZS1zdHJpbmdzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLWxvb2t1cC1vdXRjb21lLXZhbHVlL3F0aS1sb29rdXAtb3V0Y29tZS12YWx1ZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1ydWxlL3F0aS1ydWxlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLXJlc3BvbnNlLWNvbmRpdGlvbi9xdGktcmVzcG9uc2UtY29uZGl0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJ1bGUvcXRpLXNldC1vdXRjb21lLXZhbHVlL3F0aS1zZXQtb3V0Y29tZS12YWx1ZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1yZXNwb25zZS1lbHNlL3F0aS1yZXNwb25zZS1lbHNlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJlc3BvbnNlLWVsc2UvcXRpLXJlc3BvbnNlLWlmL3F0aS1yZXNwb25zZS1lbHNlLWlmL3F0aS1yZXNwb25zZS1lbHNlLWlmLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLXJlc3BvbnNlLWVsc2UvcXRpLXJlc3BvbnNlLWlmL3F0aS1yZXNwb25zZS1pZi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWFuZC9xdGktYW5kLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWFuZC9pbmRleC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1iYXNldmFsdWUvcXRpLWJhc2V2YWx1ZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1jb250YWlucy9xdGktY29udGFpbnMudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktY29ycmVjdC9xdGktY29ycmVjdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1lcXVhbC1yb3VuZGVkL3F0aS1lcXVhbC1yb3VuZGVkLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLWVxdWFsL3F0aS1lcXVhbC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3V0aWxpdGllcy9zY29yaW5nLWhlbHBlci50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1ndC9xdGktZ3QudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktZ3RlL3F0aS1ndGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktaXMtbnVsbC9xdGktaXMtbnVsbC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1sdC9xdGktbHQudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbHRlL3F0aS1sdGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWFwLXJlc3BvbnNlL3F0aS1tYXAtcmVzcG9uc2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWFwcGluZy9xdGktbWFwcGluZy50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1tYXRjaC9xdGktbWF0Y2gudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWVtYmVyL3F0aS1tZW1iZXIudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbXVsdGlwbGUvcXRpLW11bHRpcGxlLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW5vdC9xdGktbm90LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLW9yL3F0aS1vci50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1vcmRlcmVkL3F0aS1vcmRlcmVkLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcvcXRpLWV4cHJlc3Npb24vcXRpLXByaW50ZWQtdmFyaWFibGUvcXRpLXByaW50ZWQtdmFyaWFibGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktcHJvZHVjdC9xdGktcHJvZHVjdC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1zdHJpbmctbWF0Y2gvcXRpLXN0cmluZy1tYXRjaC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS1zdW0vcXRpLXN1bS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nL3F0aS1leHByZXNzaW9uL3F0aS12YXJpYWJsZS9xdGktdmFyaWFibGUudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWFwaS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJvcHBhYmxlcy1taXhpbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9kcmFnLWRyb3AvZmxpcHBhYmxlcy1taXhpbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1jdXN0b20taW50ZXJhY3Rpb24vcXRpLWN1c3RvbS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24vcXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLWdhcC1tYXRjaC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2hvdHNwb3RzL2hvdHNwb3QudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWdhcC1tYXRjaC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1vcmRlci1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1vcmRlci1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaG90c3BvdC1pbnRlcmFjdGlvbi9xdGktaG90c3BvdC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLW1hdGNoLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLW1lZGlhLWludGVyYWN0aW9uL3F0aS1tZWRpYS1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktb3JkZXItaW50ZXJhY3Rpb24vcXRpLW9yZGVyLWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3Qtc3RhZ2UudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbi9xdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1zbGlkZXItaW50ZXJhY3Rpb24vcXRpLXNsaWRlci1pbnRlcmFjdGlvbi50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1jdXN0b20tb3BlcmF0b3IvcXRpLWN1c3RvbS1vcGVyYXRvci50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktYXNzb2NpYWJsZS1ob3RzcG90LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1nYXAudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC1pbWcudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktY29tcG9uZW50cy9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcC10ZXh0LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWNob2ljZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaG90dGV4dC50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktaW5saW5lLWNob2ljZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL3F0aS1pbnRlcmFjdGlvbi9xdGktc2ltcGxlLWNob2ljZS50cyIsICIuLi8uLi9zcmMvbGliL3F0aS1jb21wb25lbnRzL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBwcm92aWRlIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuaW1wb3J0IHR5cGUgeyBJbnRlcmFjdGlvbkNoYW5nZWREZXRhaWxzLCBPdXRjb21lQ2hhbmdlZERldGFpbHMgfSBmcm9tICcuLi9pbnRlcm5hbC9ldmVudC10eXBlcyc7XG5pbXBvcnQgdHlwZSB7IFJlc3BvbnNlSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgdHlwZSB7IFZhcmlhYmxlRGVjbGFyYXRpb24sIFZhcmlhYmxlVmFsdWUgfSBmcm9tICcuLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgT3V0Y29tZVZhcmlhYmxlLCBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB0eXBlIHsgUXRpRmVlZGJhY2sgfSBmcm9tICcuLi9xdGktZmVlZGJhY2svcXRpLWZlZWRiYWNrJztcbmltcG9ydCB0eXBlIHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHR5cGUgeyBRdGlSZXNwb25zZVByb2Nlc3NpbmcgfSBmcm9tICcuLi9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZyc7XG5pbXBvcnQgeyBJdGVtQ29udGV4dCwgaXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0VmFyaWFibGVzIH0gZnJvbSAnLi9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBxdGktYXNzZXNzbWVudC1pdGVtIGVsZW1lbnQgY29udGFpbnMgYWxsIHRoZSBvdGhlciBRVEkgMyBpdGVtIHN0cnVjdHVyZXMuXG4gKiBAZG9jdW1lbnRhdGlvbiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLmRsdG5uajg3bDB5alxuICogQHN0YXR1cyBzdGFibGVcbiAqIEBzaW5jZSA0LjBcbiAqXG4gKiBAZGVwZW5kZW5jeSBxdGktZmVlZGJhY2tcbiAqIEBkZXBlbmRlbmN5IHF0aS1yZXNwb25zZXByb2Nlc3NpbmdcbiAqXG4gKiBAc2xvdCAtIFRoZSBkZWZhdWx0IHNsb3Qgd2hlcmUgYWxsIHRoZSBvdGhlciBRVEkgMyBpdGVtIHN0cnVjdHVyZXMgZ28uXG4gKlxuICogQGV2ZW50IHF0aS1pbnRlcmFjdGlvbi1jaGFuZ2VkIC0gRW1pdHRlZCB3aGVuIGFuIGludGVyYWN0aW9uIGlzIGNoYW5nZWQuXG4gKiBAZXZlbnQgcXRpLW91dGNvbWUtY2hhbmdlZCAtIEVtaXR0ZWQgd2hlbiBhbiBvdXRjb21lIGhhcyBjaGFuZ2VkLlxuICogQGV2ZW50IHF0aS1yZXNwb25zZS1wcm9jZXNzaW5nIC0gRW1pdHRlZCB3aGVuIHJlc3BvbnNlLXByb2Nlc3NpbmcgaXMgY2FsbGVkLlxuICpcbiAqL1xuQGN1c3RvbUVsZW1lbnQoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKVxuZXhwb3J0IGNsYXNzIFF0aUFzc2Vzc21lbnRJdGVtIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB0aXRsZTogc3RyaW5nO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllcjogc3RyaW5nID0gJyc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBhZGFwdGl2ZTogJ3RydWUnIHwgJ2ZhbHNlJyA9ICdmYWxzZSc7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB0aW1lRGVwZW5kZW50OiAndHJ1ZScgfCAnZmFsc2UnID0gJ2ZhbHNlJztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pIGRpc2FibGVkOiBib29sZWFuO1xuICBAd2F0Y2goJ2Rpc2FibGVkJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBfaGFuZGxlRGlzYWJsZWRDaGFuZ2UgPSAoXzogYm9vbGVhbiwgZGlzYWJsZWQ6IGJvb2xlYW4pID0+IHtcbiAgICB0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLmZvckVhY2goY2ggPT4gKGNoLmRpc2FibGVkID0gZGlzYWJsZWQpKTtcbiAgfTtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pIHJlYWRvbmx5OiBib29sZWFuO1xuICBAd2F0Y2goJ3JlYWRvbmx5JywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBfaGFuZGxlUmVhZG9ubHlDaGFuZ2UgPSAoXzogYm9vbGVhbiwgcmVhZG9ubHk6IGJvb2xlYW4pID0+XG4gICAgdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5mb3JFYWNoKGNoID0+IChjaC5yZWFkb25seSA9IHJlYWRvbmx5KSk7XG5cbiAgQHByb3ZpZGUoeyBjb250ZXh0OiBpdGVtQ29udGV4dCB9KVxuICAvLyBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6IGZhbHNlIH0pXG4gIHByaXZhdGUgX2NvbnRleHQ6IEl0ZW1Db250ZXh0ID0ge1xuICAgIGlkZW50aWZpZXI6IHRoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyksXG4gICAgdmFyaWFibGVzOiBpdGVtQ29udGV4dFZhcmlhYmxlc1xuICB9O1xuXG4gIHB1YmxpYyBnZXQgdmFyaWFibGVzKCk6IFZhcmlhYmxlVmFsdWU8c3RyaW5nIHwgc3RyaW5nW10gfCBudWxsPltdIHtcbiAgICByZXR1cm4gdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHYgPT4gKHsgaWRlbnRpZmllcjogdi5pZGVudGlmaWVyLCB2YWx1ZTogdi52YWx1ZSwgdHlwZTogdi50eXBlIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgdmFyaWFibGVzKHZhbHVlOiBWYXJpYWJsZVZhbHVlPHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbD5bXSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgdmFsdWUuc29tZSh2ID0+ICEoJ2lkZW50aWZpZXInIGluIHYpKSkge1xuICAgICAgY29uc29sZS53YXJuKCd2YXJpYWJsZXMgcHJvcGVydHkgc2hvdWxkIGJlIGFuIGFycmF5IG9mIFZhcmlhYmxlRGVjbGFyYXRpb24nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jb250ZXh0ID0ge1xuICAgICAgLi4udGhpcy5fY29udGV4dCxcbiAgICAgIHZhcmlhYmxlczogdGhpcy5fY29udGV4dC52YXJpYWJsZXMubWFwKHZhcmlhYmxlID0+IHtcbiAgICAgICAgY29uc3QgbWF0Y2hpbmdWYWx1ZSA9IHZhbHVlLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHZhcmlhYmxlLmlkZW50aWZpZXIpO1xuICAgICAgICBpZiAobWF0Y2hpbmdWYWx1ZSkge1xuICAgICAgICAgIHJldHVybiB7IC4uLnZhcmlhYmxlLCAuLi5tYXRjaGluZ1ZhbHVlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhcmlhYmxlO1xuICAgICAgfSlcbiAgICB9O1xuXG4gICAgdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICBpZiAodmFyaWFibGUudHlwZSA9PT0gJ3Jlc3BvbnNlJykge1xuICAgICAgICBjb25zdCBpbnRlcmFjdGlvbkVsZW1lbnQgPSB0aGlzLl9pbnRlcmFjdGlvbkVsZW1lbnRzLmZpbmQoXG4gICAgICAgICAgKGVsOiBJbnRlcmFjdGlvbikgPT4gZWwucmVzcG9uc2VJZGVudGlmaWVyID09PSB2YXJpYWJsZS5pZGVudGlmaWVyXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpbnRlcmFjdGlvbkVsZW1lbnQpIHtcbiAgICAgICAgICBpbnRlcmFjdGlvbkVsZW1lbnQucmVzcG9uc2UgPSB2YXJpYWJsZS52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodmFyaWFibGUudHlwZSA9PT0gJ291dGNvbWUnKSB7XG4gICAgICAgIHRoaXMuX2ZlZWRiYWNrRWxlbWVudHMuZm9yRWFjaChmZSA9PiBmZS5jaGVja1Nob3dGZWVkYmFjayh2YXJpYWJsZS5pZGVudGlmaWVyKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0aWFsQ29udGV4dDogUmVhZG9ubHk8SXRlbUNvbnRleHQ+ID0geyAuLi50aGlzLl9jb250ZXh0LCB2YXJpYWJsZXM6IHRoaXMuX2NvbnRleHQudmFyaWFibGVzIH07XG4gIHByaXZhdGUgX2ZlZWRiYWNrRWxlbWVudHM6IFF0aUZlZWRiYWNrW10gPSBbXTtcbiAgcHJpdmF0ZSBfaW50ZXJhY3Rpb25FbGVtZW50czogSW50ZXJhY3Rpb25bXSA9IFtdO1xuXG4gIGFzeW5jIGNvbm5lY3RlZENhbGxiYWNrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgYXdhaXQgdGhpcy51cGRhdGVDb21wbGV0ZTtcbiAgICB0aGlzLl9lbWl0PHsgZGV0YWlsOiBRdGlBc3Nlc3NtZW50SXRlbSB9PigncXRpLWFzc2Vzc21lbnQtaXRlbS1jb25uZWN0ZWQnLCB0aGlzKTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCB1c2UgdmFyaWFibGVzIHByb3BlcnR5IGluc3RlYWQgKi9cbiAgc2V0IHJlc3BvbnNlcyhteVJlc3BvbnNlczogUmVzcG9uc2VJbnRlcmFjdGlvbltdKSB7XG4gICAgaWYgKG15UmVzcG9uc2VzKSB7XG4gICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIG15UmVzcG9uc2VzKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlVmFyaWFibGUgPSB0aGlzLmdldFJlc3BvbnNlKHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllcik7XG4gICAgICAgIGlmIChyZXNwb25zZVZhcmlhYmxlKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVSZXNwb25zZVZhcmlhYmxlKHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllciwgcmVzcG9uc2UucmVzcG9uc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIHwgdW5kZWZpbmVkID0gdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5maW5kKFxuICAgICAgICAgIGkgPT4gaS5nZXRBdHRyaWJ1dGUoJ3Jlc3BvbnNlLWlkZW50aWZpZXInKSA9PT0gcmVzcG9uc2UucmVzcG9uc2VJZGVudGlmaWVyXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpbnRlcmFjdGlvbikge1xuICAgICAgICAgIGludGVyYWN0aW9uLnJlc3BvbnNlID0gcmVzcG9uc2UucmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLXZhcmlhYmxlJywgZSA9PiB7XG4gICAgICB0aGlzLl9jb250ZXh0ID0geyAuLi50aGlzLl9jb250ZXh0LCB2YXJpYWJsZXM6IFsuLi50aGlzLl9jb250ZXh0LnZhcmlhYmxlcywgZS5kZXRhaWwudmFyaWFibGVdIH07XG4gICAgICB0aGlzLl9pbml0aWFsQ29udGV4dCA9IHRoaXMuX2NvbnRleHQ7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0pO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWZlZWRiYWNrJywgKGU6IEN1c3RvbUV2ZW50PFF0aUZlZWRiYWNrPikgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGNvbnN0IGZlZWRiYWNrRWxlbWVudCA9IGUuZGV0YWlsO1xuICAgICAgdGhpcy5fZmVlZGJhY2tFbGVtZW50cy5wdXNoKGZlZWRiYWNrRWxlbWVudCk7XG4gICAgICBmZWVkYmFja0VsZW1lbnQuY2hlY2tTaG93RmVlZGJhY2soZmVlZGJhY2tFbGVtZW50Lm91dGNvbWVJZGVudGlmaWVyKTtcbiAgICB9KTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1pbnRlcmFjdGlvbicsIChlOiBDdXN0b21FdmVudDxudWxsPikgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMucHVzaChlLnRhcmdldCBhcyBJbnRlcmFjdGlvbik7XG4gICAgfSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdlbmQtYXR0ZW1wdCcsIChlOiBDdXN0b21FdmVudDx7IHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nOyBjb3VudEF0dGVtcHQ6IGJvb2xlYW4gfT4pID0+IHtcbiAgICAgIGNvbnN0IHsgcmVzcG9uc2VJZGVudGlmaWVyLCBjb3VudEF0dGVtcHQgfSA9IGUuZGV0YWlsO1xuICAgICAgdGhpcy51cGRhdGVSZXNwb25zZVZhcmlhYmxlKHJlc3BvbnNlSWRlbnRpZmllciwgJ3RydWUnKTtcbiAgICAgIHRoaXMucHJvY2Vzc1Jlc3BvbnNlKGNvdW50QXR0ZW1wdCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAvLyB3b3JkdCBhYW5nZXJvZXBlbiB2YW51aXQgZGUgcHJvY2Vzc2luZ3RlbXBsYXRlXG4gICAgICAncXRpLXNldC1vdXRjb21lLXZhbHVlJyxcbiAgICAgIChlOiBDdXN0b21FdmVudDx7IG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PikgPT4ge1xuICAgICAgICBjb25zdCB7IG91dGNvbWVJZGVudGlmaWVyLCB2YWx1ZSB9ID0gZS5kZXRhaWw7XG4gICAgICAgIHRoaXMudXBkYXRlT3V0Y29tZVZhcmlhYmxlKG91dGNvbWVJZGVudGlmaWVyLCB2YWx1ZSk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywgdGhpcy5oYW5kbGVVcGRhdGVSZXNwb25zZVZhcmlhYmxlKTtcbiAgfVxuXG4gIHB1YmxpYyBzaG93Q29ycmVjdFJlc3BvbnNlKHNob3c6IGJvb2xlYW4pIHtcbiAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlcyA9IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbHRlcihcbiAgICAgICh2YXJpOiBSZXNwb25zZVZhcmlhYmxlIHwgT3V0Y29tZVZhcmlhYmxlKSA9PiAnY29ycmVjdFJlc3BvbnNlJyBpbiB2YXJpICYmIHZhcmkuY29ycmVjdFJlc3BvbnNlXG4gICAgKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgY29uc3QgcmVzcG9uc2VzID0gcmVzcG9uc2VWYXJpYWJsZXMubWFwKGNyID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3BvbnNlSWRlbnRpZmllcjogY3IuaWRlbnRpZmllcixcbiAgICAgICAgcmVzcG9uc2U6IGNyLmNvcnJlY3RSZXNwb25zZVxuICAgICAgfTtcbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIHJlc3BvbnNlcykge1xuICAgICAgY29uc3QgaW50ZXJhY3Rpb246IEludGVyYWN0aW9uIHwgdW5kZWZpbmVkID0gdGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5maW5kKFxuICAgICAgICBpID0+IGkuZ2V0QXR0cmlidXRlKCdyZXNwb25zZS1pZGVudGlmaWVyJykgPT09IHJlc3BvbnNlLnJlc3BvbnNlSWRlbnRpZmllclxuICAgICAgKTtcbiAgICAgIGludGVyYWN0aW9uICYmIChpbnRlcmFjdGlvbi5jb3JyZWN0UmVzcG9uc2UgPSBzaG93ID8gcmVzcG9uc2UucmVzcG9uc2UgOiAnJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHByb2Nlc3NSZXNwb25zZShjb3VudE51bUF0dGVtcHRzOiBib29sZWFuID0gdHJ1ZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlc3BvbnNlUHJvY2Vzc29yID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktcmVzcG9uc2UtcHJvY2Vzc2luZycpIGFzIHVua25vd24gYXMgUXRpUmVzcG9uc2VQcm9jZXNzaW5nO1xuICAgIGlmICghcmVzcG9uc2VQcm9jZXNzb3IpIHtcbiAgICAgIC8vIGNvbnNvbGUuaW5mbygnQ2xpZW50IHNpZGUgcmVzcG9uc2UgcHJvY2Vzc2luZyB0ZW1wbGF0ZSBub3QgYXZhaWxhYmxlJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFyZXNwb25zZVByb2Nlc3Nvci5wcm9jZXNzKSB7XG4gICAgICAvLyBjb25zb2xlLmluZm8oJ0NsaWVudCBzaWRlIHJlc3BvbnNlIHdlYmNvbXBvbmVudHMgbm90IGF2YWlsYWJsZScpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJlc3BvbnNlUHJvY2Vzc29yLnByb2Nlc3MoKTtcblxuICAgIGlmICh0aGlzLmFkYXB0aXZlID09PSAnZmFsc2UnKSB7XG4gICAgICAvLyBpZiBhZGFwYXRpdmUsIGNvbXBsZXRpb25TdGF0dXMgaXMgc2V0IGJ5IHRoZSBwcm9jZXNzaW5nIHRlbXBsYXRlXG4gICAgICB0aGlzLnVwZGF0ZU91dGNvbWVWYXJpYWJsZSgnY29tcGxldGlvblN0YXR1cycsIHRoaXMuX2dldENvbXBsZXRpb25TdGF0dXMoKSk7XG4gICAgfVxuXG4gICAgY291bnROdW1BdHRlbXB0cyAmJlxuICAgICAgdGhpcy51cGRhdGVPdXRjb21lVmFyaWFibGUoXG4gICAgICAgICdudW1BdHRlbXB0cycsXG4gICAgICAgICgrdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gJ251bUF0dGVtcHRzJyk/LnZhbHVlICsgMSkudG9TdHJpbmcoKVxuICAgICAgKTtcblxuICAgIHRoaXMuX2VtaXQoJ3F0aS1yZXNwb25zZS1wcm9jZXNzZWQnKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldFJlc3BvbnNlcygpIHtcbiAgICB0aGlzLl9jb250ZXh0ID0gdGhpcy5faW5pdGlhbENvbnRleHQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0UmVzcG9uc2UoaWRlbnRpZmllcjogc3RyaW5nKTogUmVhZG9ubHk8UmVzcG9uc2VWYXJpYWJsZT4ge1xuICAgIHJldHVybiB0aGlzLmdldFZhcmlhYmxlKGlkZW50aWZpZXIpIGFzIFJlc3BvbnNlVmFyaWFibGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0T3V0Y29tZShpZGVudGlmaWVyOiBzdHJpbmcpOiBSZWFkb25seTxPdXRjb21lVmFyaWFibGU+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRWYXJpYWJsZShpZGVudGlmaWVyKSBhcyBPdXRjb21lVmFyaWFibGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmFyaWFibGUoaWRlbnRpZmllcjogc3RyaW5nKTogUmVhZG9ubHk8VmFyaWFibGVEZWNsYXJhdGlvbjxzdHJpbmcgfCBzdHJpbmdbXSB8IG51bGw+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRleHQudmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHx8IG51bGw7XG4gIH1cblxuICAvLyBzYXZpbmcgcHJpdmF0ZXMgaGVyZTogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHJpdmF0ZSBoYW5kbGVVcGRhdGVSZXNwb25zZVZhcmlhYmxlKGV2ZW50OiBDdXN0b21FdmVudDxSZXNwb25zZUludGVyYWN0aW9uPikge1xuICAgIGNvbnN0IHsgcmVzcG9uc2VJZGVudGlmaWVyLCByZXNwb25zZSB9ID0gZXZlbnQuZGV0YWlsO1xuICAgIHRoaXMudXBkYXRlUmVzcG9uc2VWYXJpYWJsZShyZXNwb25zZUlkZW50aWZpZXIsIHJlc3BvbnNlKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVSZXNwb25zZVZhcmlhYmxlKGlkZW50aWZpZXI6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fY29udGV4dCA9IHtcbiAgICAgIC4uLnRoaXMuX2NvbnRleHQsXG4gICAgICB2YXJpYWJsZXM6IHRoaXMuX2NvbnRleHQudmFyaWFibGVzLm1hcCh2ID0+ICh2LmlkZW50aWZpZXIgIT09IGlkZW50aWZpZXIgPyB2IDogeyAuLi52LCB2YWx1ZTogdmFsdWUgfSkpXG4gICAgfTtcblxuICAgIHRoaXMuX2VtaXQ8SW50ZXJhY3Rpb25DaGFuZ2VkRGV0YWlscz4oJ3F0aS1pbnRlcmFjdGlvbi1jaGFuZ2VkJywge1xuICAgICAgaXRlbTogdGhpcy5pZGVudGlmaWVyLFxuICAgICAgcmVzcG9uc2VJZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgcmVzcG9uc2U6IEFycmF5LmlzQXJyYXkodmFsdWUpID8gWy4uLnZhbHVlXSA6IHZhbHVlXG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5hZGFwdGl2ZSA9PT0gJ2ZhbHNlJykge1xuICAgICAgLy8gaWYgYWRhcGF0aXZlLCBjb21wbGV0aW9uU3RhdHVzIGlzIHNldCBieSB0aGUgcHJvY2Vzc2luZyB0ZW1wbGF0ZVxuICAgICAgdGhpcy51cGRhdGVPdXRjb21lVmFyaWFibGUoJ2NvbXBsZXRpb25TdGF0dXMnLCB0aGlzLl9nZXRDb21wbGV0aW9uU3RhdHVzKCkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVPdXRjb21lVmFyaWFibGUoaWRlbnRpZmllcjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBvdXRjb21lVmFyaWFibGUgPSB0aGlzLmdldE91dGNvbWUoaWRlbnRpZmllcik7XG4gICAgaWYgKCFvdXRjb21lVmFyaWFibGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihgQ2FuIG5vdCBzZXQgcXRpLW91dGNvbWUtaWRlbnRpZmllcjogJHtpZGVudGlmaWVyfSwgaXQgaXMgbm90IGF2YWlsYWJsZWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2NvbnRleHQgPSB7XG4gICAgICAuLi50aGlzLl9jb250ZXh0LFxuICAgICAgdmFyaWFibGVzOiB0aGlzLl9jb250ZXh0LnZhcmlhYmxlcy5tYXAodiA9PiB7XG4gICAgICAgIGlmICh2LmlkZW50aWZpZXIgIT09IGlkZW50aWZpZXIpIHtcbiAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnYsXG4gICAgICAgICAgdmFsdWU6IG91dGNvbWVWYXJpYWJsZS5jYXJkaW5hbGl0eSA9PT0gJ3NpbmdsZScgPyB2YWx1ZSA6IFsuLi52LnZhbHVlLCB2YWx1ZSBhcyBzdHJpbmddXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgIH07XG5cbiAgICB0aGlzLl9mZWVkYmFja0VsZW1lbnRzLmZvckVhY2goZmUgPT4gZmUuY2hlY2tTaG93RmVlZGJhY2soaWRlbnRpZmllcikpO1xuXG4gICAgdGhpcy5fZW1pdDxPdXRjb21lQ2hhbmdlZERldGFpbHM+KCdxdGktb3V0Y29tZS1jaGFuZ2VkJywge1xuICAgICAgaXRlbTogdGhpcy5pZGVudGlmaWVyLFxuICAgICAgb3V0Y29tZUlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICB2YWx1ZTogdGhpcy5fY29udGV4dC52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcik/LnZhbHVlXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRDb21wbGV0aW9uU3RhdHVzKCk6ICdjb21wbGV0ZWQnIHwgJ2luY29tcGxldGUnIHwgJ25vdF9hdHRlbXB0ZWQnIHwgJ3Vua25vd24nIHtcbiAgICBpZiAodGhpcy5faW50ZXJhY3Rpb25FbGVtZW50cy5ldmVyeShpbnRlcmFjdGlvbkVsZW1lbnQgPT4gaW50ZXJhY3Rpb25FbGVtZW50LnZhbGlkYXRlKCkpKSByZXR1cm4gJ2NvbXBsZXRlZCc7XG4gICAgaWYgKHRoaXMuX2ludGVyYWN0aW9uRWxlbWVudHMuc29tZShpbnRlcmFjdGlvbkVsZW1lbnQgPT4gaW50ZXJhY3Rpb25FbGVtZW50LnZhbGlkYXRlKCkpKSByZXR1cm4gJ2luY29tcGxldGUnO1xuICAgIHJldHVybiAnbm90X2F0dGVtcHRlZCc7XG4gIH1cblxuICBwcml2YXRlIF9lbWl0PFQ+KG5hbWUsIGRldGFpbCA9IG51bGwpIHtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8VD4obmFtZSwge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsXG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWFzc2Vzc21lbnQtaXRlbSc6IFF0aUFzc2Vzc21lbnRJdGVtO1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcblxudHlwZSBVcGRhdGVIYW5kbGVyID0gKHByZXY/OiB1bmtub3duLCBuZXh0PzogdW5rbm93bikgPT4gdm9pZDtcblxudHlwZSBOb25VbmRlZmluZWQ8QT4gPSBBIGV4dGVuZHMgdW5kZWZpbmVkID8gbmV2ZXIgOiBBO1xuXG50eXBlIFVwZGF0ZUhhbmRsZXJGdW5jdGlvbktleXM8VCBleHRlbmRzIG9iamVjdD4gPSB7XG4gIFtLIGluIGtleW9mIFRdLT86IE5vblVuZGVmaW5lZDxUW0tdPiBleHRlbmRzIFVwZGF0ZUhhbmRsZXIgPyBLIDogbmV2ZXI7XG59W2tleW9mIFRdO1xuXG5pbnRlcmZhY2UgV2F0Y2hPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHRydWUsIHdpbGwgb25seSBzdGFydCB3YXRjaGluZyBhZnRlciB0aGUgaW5pdGlhbCB1cGRhdGUvcmVuZGVyXG4gICAqL1xuICB3YWl0VW50aWxGaXJzdFVwZGF0ZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUnVucyB3aGVuIG9ic2VydmVkIHByb3BlcnRpZXMgY2hhbmdlLCBlLmcuIEBwcm9wZXJ0eSBvciBAc3RhdGUsIGJ1dCBiZWZvcmUgdGhlIGNvbXBvbmVudCB1cGRhdGVzLiBUbyB3YWl0IGZvciBhblxuICogdXBkYXRlIHRvIGNvbXBsZXRlIGFmdGVyIGEgY2hhbmdlIG9jY3VycywgdXNlIGBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlYCBpbiB0aGUgaGFuZGxlci4gVG8gc3RhcnQgd2F0Y2hpbmcgYWZ0ZXIgdGhlXG4gKiBpbml0aWFsIHVwZGF0ZS9yZW5kZXIsIHVzZSBgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9YCBvciBgdGhpcy5oYXNVcGRhdGVkYCBpbiB0aGUgaGFuZGxlci5cbiAqXG4gKiBVc2FnZTpcbiAqXG4gKiBAd2F0Y2goJ3Byb3BOYW1lJylcbiAqIGhhbmRsZVByb3BDaGFuZ2Uob2xkVmFsdWUsIG5ld1ZhbHVlKSB7XG4gKiAgIC4uLlxuICogfVxuICovXG5leHBvcnQgZnVuY3Rpb24gd2F0Y2gocHJvcGVydHlOYW1lOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3B0aW9ucz86IFdhdGNoT3B0aW9ucykge1xuICBjb25zdCByZXNvbHZlZE9wdGlvbnM6IFJlcXVpcmVkPFdhdGNoT3B0aW9ucz4gPSB7XG4gICAgd2FpdFVudGlsRmlyc3RVcGRhdGU6IGZhbHNlLFxuICAgIC4uLm9wdGlvbnNcbiAgfTtcbiAgcmV0dXJuIDxFbGVtQ2xhc3MgZXh0ZW5kcyBMaXRFbGVtZW50Pihwcm90bzogRWxlbUNsYXNzLCBkZWNvcmF0ZWRGbk5hbWU6IFVwZGF0ZUhhbmRsZXJGdW5jdGlvbktleXM8RWxlbUNsYXNzPikgPT4ge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSB1cGRhdGUgaXMgYSBwcm90ZWN0ZWQgcHJvcGVydHlcbiAgICBjb25zdCB7IHVwZGF0ZSB9ID0gcHJvdG87XG4gICAgY29uc3Qgd2F0Y2hlZFByb3BlcnRpZXMgPSBBcnJheS5pc0FycmF5KHByb3BlcnR5TmFtZSkgPyBwcm9wZXJ0eU5hbWUgOiBbcHJvcGVydHlOYW1lXTtcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSB1cGRhdGUgaXMgYSBwcm90ZWN0ZWQgcHJvcGVydHlcbiAgICBwcm90by51cGRhdGUgPSBmdW5jdGlvbiAodGhpczogRWxlbUNsYXNzLCBjaGFuZ2VkUHJvcHM6IE1hcDxrZXlvZiBFbGVtQ2xhc3MsIEVsZW1DbGFzc1trZXlvZiBFbGVtQ2xhc3NdPikge1xuICAgICAgd2F0Y2hlZFByb3BlcnRpZXMuZm9yRWFjaChwcm9wZXJ0eSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IHByb3BlcnR5IGFzIGtleW9mIEVsZW1DbGFzcztcbiAgICAgICAgaWYgKGNoYW5nZWRQcm9wcy5oYXMoa2V5KSkge1xuICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gY2hhbmdlZFByb3BzLmdldChrZXkpO1xuICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpc1trZXldO1xuXG4gICAgICAgICAgaWYgKG9sZFZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgICAgICAgaWYgKCFyZXNvbHZlZE9wdGlvbnMud2FpdFVudGlsRmlyc3RVcGRhdGUgfHwgdGhpcy5oYXNVcGRhdGVkKSB7XG4gICAgICAgICAgICAgICh0aGlzW2RlY29yYXRlZEZuTmFtZV0gYXMgdW5rbm93biBhcyBVcGRhdGVIYW5kbGVyKShvbGRWYWx1ZSwgbmV3VmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHVwZGF0ZS5jYWxsKHRoaXMsIGNoYW5nZWRQcm9wcyk7XG4gICAgfTtcbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1Db250ZXh0IHtcbiAgaHJlZj86IHN0cmluZztcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xuICB2YXJpYWJsZXM6IFJlYWRvbmx5QXJyYXk8VmFyaWFibGVEZWNsYXJhdGlvbjxzdHJpbmcgfCBzdHJpbmdbXT4+O1xufVxuXG5leHBvcnQgY29uc3QgaXRlbUNvbnRleHRWYXJpYWJsZXMgPSBbXG4gIHtcbiAgICBpZGVudGlmaWVyOiAnY29tcGxldGlvblN0YXR1cycsXG4gICAgY2FyZGluYWxpdHk6ICdzaW5nbGUnLFxuICAgIGJhc2VUeXBlOiAnc3RyaW5nJyxcbiAgICB2YWx1ZTogJ3Vua25vd24nLFxuICAgIHR5cGU6ICdvdXRjb21lJ1xuICB9LFxuICB7XG4gICAgaWRlbnRpZmllcjogJ251bUF0dGVtcHRzJyxcbiAgICBjYXJkaW5hbGl0eTogJ3NpbmdsZScsXG4gICAgYmFzZVR5cGU6ICdpbnRlZ2VyJyxcbiAgICB2YWx1ZTogJzAnLFxuICAgIHR5cGU6ICdyZXNwb25zZSdcbiAgfVxuXSBhcyBWYXJpYWJsZURlY2xhcmF0aW9uPHN0cmluZyB8IHN0cmluZ1tdPltdO1xuXG5leHBvcnQgY29uc3QgaXRlbUNvbnRleHQgPSBjcmVhdGVDb250ZXh0PEl0ZW1Db250ZXh0PignaXRlbScpO1xuIiwgImltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBxdGlUcmFuc2Zvcm1JdGVtIH0gZnJvbSAnLi4vLi4vcXRpLXRyYW5zZm9ybWVycyc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGN1c3RvbSBlbGVtZW50IGZvciByZWZlcmVuY2luZyBhbiBhc3Nlc3NtZW50IHN0aW11bHVzLlxuICovXG5AY3VzdG9tRWxlbWVudCgncXRpLWFzc2Vzc21lbnQtc3RpbXVsdXMtcmVmJylcbmV4cG9ydCBjbGFzcyBRdGlBc3Nlc3NtZW50U3RpbXVsdXNSZWYgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgLyoqXG4gICAqIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBzdGltdWx1cy5cbiAgICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyID0gJyc7XG5cbiAgLyoqXG4gICAqIFRoZSBocmVmIG9mIHRoZSBzdGltdWx1cy5cbiAgICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBocmVmID0gJyc7XG5cbiAgLyoqXG4gICAqIExpZmVjeWNsZSBtZXRob2QgY2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQgaXMgY29ubmVjdGVkIHRvIHRoZSBET00uXG4gICAqIExvYWRzIGFuZCBhcHBlbmRzIHRoZSBzdGltdWx1cyBpZiB0aGUgJ3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi1jb25uZWN0ZWQnIGV2ZW50IGlzIG5vdCBwcmV2ZW50ZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY29ubmVjdGVkQ2FsbGJhY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KCdxdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYtY29ubmVjdGVkJywgeyBjYW5jZWxhYmxlOiB0cnVlLCBidWJibGVzOiB0cnVlIH0pO1xuICAgIGNvbnN0IGlzUHJldmVudGVkID0gdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblxuICAgIGlmIChpc1ByZXZlbnRlZCkge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuY2xvc2VzdCgncXRpLWFzc2Vzc21lbnQtaXRlbScpO1xuXG4gICAgICBjb25zdCBzdGltdWx1c1JlZiA9IGl0ZW0ucXVlcnlTZWxlY3RvcihgW2RhdGEtc3RpbXVsdXMtaWRyZWY9JHt0aGlzLmlkZW50aWZpZXJ9XWApO1xuICAgICAgaWYgKHN0aW11bHVzUmVmKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZEFuZEFwcGVuZFN0aW11bHVzKHN0aW11bHVzUmVmKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3RpbXVsdXMgd2l0aCBkYXRhLXN0aW11bHVzLWlkcmVmICR7dGhpcy5pZGVudGlmaWVyfSBub3QgZm91bmRgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgYW5kIGFwcGVuZHMgdGhlIHN0aW11bHVzIHRvIHRoZSBzcGVjaWZpZWQgZWxlbWVudC5cbiAgICogQHBhcmFtIHN0aW11bHVzUmVmIC0gVGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIHN0aW11bHVzIHdpbGwgYmUgYXBwZW5kZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbG9hZEFuZEFwcGVuZFN0aW11bHVzKHN0aW11bHVzUmVmOiBFbGVtZW50KSB7XG4gICAgY29uc3QgcGF0aCA9IHRoaXMuaHJlZi5zdWJzdHJpbmcoMCwgdGhpcy5ocmVmLmxhc3RJbmRleE9mKCcvJykpO1xuICAgIGNvbnN0IHN0aW11bHVzID0gYXdhaXQgcXRpVHJhbnNmb3JtSXRlbSgpXG4gICAgICAubG9hZCh0aGlzLmhyZWYpXG4gICAgICAudGhlbihhcGkgPT4gYXBpLnBhdGgocGF0aCkuaHRtbGRvYygpKTtcbiAgICBpZiAoc3RpbXVsdXMpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gc3RpbXVsdXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXN0aW11bHVzLWJvZHksIHF0aS1zdHlsZXNoZWV0Jyk7XG4gICAgICBzdGltdWx1c1JlZi5hcHBlbmQoLi4uZWxlbWVudHMpO1xuICAgIH1cbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYnOiBRdGlBc3Nlc3NtZW50U3RpbXVsdXNSZWY7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcblxuY29uc3QgS0VZQ09ERSA9IHtcbiAgU1BBQ0U6IDMyXG59O1xuXG4vKipcbiAqIEBzdW1tYXJ5IHF0aS1jaG9pY2UgaXMgdXNlZCBieSBxdGktc2ltcGxlLWNob2ljZSwgcXRpLWlubGluZS1jaG9pY2UsIHF0aS1ob3R0ZXh0LCBxdGktaG90c3BvdC1jaG9pY2UuXG4gKlxuICogQHNpbmNlIDEuMFxuICogQHN0YXR1cyBzdGFibGVcbiAqXG4gKiBAZXZlbnQgcXRpLXJlZ2lzdGVyLWNob2ljZSAtIHJlZ2lzdGVyIGl0c2VsdmVzIG9uIGEgcXRpLWNob2ljZS1pbnRlcmFjdGlvbiBlbGVtZW50LlxuICogQGV2ZW50IHF0aS1sb29zZS1jaG9pY2UgLSBkZS1yZWdpc3RlciBpdHNlbHZlcyBvbiBhIHF0aS1jaG9pY2UtaW50ZXJhY3Rpb24gZWxlbWVudC5cbiAqIEBldmVudCBxdGktY2hvaWNlLWVsZW1lbnQtc2VsZWN0ZWQgLSBFbWl0dGVkIHdoZW4gdGhlIGNob2ljZSBpcyBzZWxlY3RlZC5cbiAqXG4gKiBAc2xvdCAtIFRoZSBjaG9pY2VzIHNsb3QgZWxlbWVudFxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUXRpQ2hvaWNlIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlIH0pIHRhYmluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQgPSAwO1xuXG4gIEBwcm9wZXJ0eSh7XG4gICAgcmVmbGVjdDogdHJ1ZSxcbiAgICB0eXBlOiBCb29sZWFuLFxuICAgIGF0dHJpYnV0ZTogJ2FyaWEtZGlzYWJsZWQnLFxuICAgIGNvbnZlcnRlcjoge1xuICAgICAgdG9BdHRyaWJ1dGU6IHZhbHVlID0+IHZhbHVlXG4gICAgfVxuICB9KVxuICBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIEBwcm9wZXJ0eSh7XG4gICAgcmVmbGVjdDogdHJ1ZSxcbiAgICB0eXBlOiBCb29sZWFuLFxuICAgIGF0dHJpYnV0ZTogJ2FyaWEtcmVhZG9ubHknLFxuICAgIGNvbnZlcnRlcjoge1xuICAgICAgdG9BdHRyaWJ1dGU6IHZhbHVlID0+IHZhbHVlXG4gICAgfVxuICB9KVxuICByZWFkb25seSA9IGZhbHNlO1xuXG4gIEBwcm9wZXJ0eSh7XG4gICAgcmVmbGVjdDogdHJ1ZSxcbiAgICB0eXBlOiBCb29sZWFuLFxuICAgIGF0dHJpYnV0ZTogJ2FyaWEtY2hlY2tlZCcsXG4gICAgY29udmVydGVyOiB7XG4gICAgICB0b0F0dHJpYnV0ZTogdmFsdWUgPT4gdmFsdWVcbiAgICB9XG4gIH0pXG4gIGNoZWNrZWQgPSBmYWxzZTtcblxuICBAd2F0Y2goJ2Rpc2FibGVkJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBoYW5kbGVEaXNhYmxlZENoYW5nZShfOiBib29sZWFuLCBkaXNhYmxlZDogYm9vbGVhbikge1xuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgdGhpcy50YWJpbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuYmx1cigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRhYkluZGV4ID0gMDtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuX29uS2V5VXApO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkNsaWNrKTtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLXJlZ2lzdGVyLWNob2ljZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5fb25LZXlVcCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX29uQ2xpY2spO1xuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktbG9vc2UtY2hvaWNlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjYW5jZWxhYmxlOiBmYWxzZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWVcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpIHtcbiAgICB0aGlzLmNoZWNrZWQgPSBmYWxzZTtcbiAgICB0aGlzLmRpc2FibGVkID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9vbktleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmFsdEtleSkgcmV0dXJuO1xuXG4gICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XG4gICAgICBjYXNlIEtFWUNPREUuU1BBQ0U6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuX3RvZ2dsZUNoZWNrZWQoKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfb25DbGljaygpIHtcbiAgICB0aGlzLl90b2dnbGVDaGVja2VkKCk7XG4gIH1cblxuICBwcml2YXRlIF90b2dnbGVDaGVja2VkKCkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcbiAgICB0aGlzLmNoZWNrZWQgPSAhdGhpcy5jaGVja2VkO1xuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktY2hvaWNlLWVsZW1lbnQtc2VsZWN0ZWQnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7IGlkZW50aWZpZXI6IHRoaXMuaWRlbnRpZmllciwgY2hlY2tlZDogdGhpcy5jaGVja2VkIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHZhbGlkYXRlQWxsUHJvcHMoKSB7XG4gICAgaWYgKCF0aGlzLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlQWxsUHJvcHMoKSkge1xuICAgICAgY29uc29sZS53YXJuKGBJbnZhbGlkIHByb3BzIGZvciAke3RoaXMub3V0ZXJIVE1MfWAsIGBtaXNzaW5nIGlkZW50aWZpZXJgKTtcbiAgICB9XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90Pjwvc2xvdD4gYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY2hvaWNlJzogUXRpQ2hvaWNlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3F0aS1pdGVtLWJvZHkuc3R5bGVzJztcbmltcG9ydCB0eXBlIHsgQ1NTUmVzdWx0R3JvdXAgfSBmcm9tICdsaXQnO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBxdGktaXRlbS1ib2R5IG5vZGUgY29udGFpbnMgdGhlIHRleHQsIGdyYXBoaWNzLCBtZWRpYSBvYmplY3RzIGFuZCBpbnRlcmFjdGlvbnMgdGhhdCBkZXNjcmliZSB0aGUgaXRlbSdzIGNvbnRlbnQgYW5kIGluZm9ybWF0aW9uIGFib3V0IGhvdyBpdCBpcyBzdHJ1Y3R1cmVkLlxuICogQGRvY3VtZW50YXRpb24gaHR0cHM6Ly93d3cuaW1zZ2xvYmFsLm9yZy9zcGVjL3F0aS92M3AwL2ltcGwjaC5zcGhwbzZsdTZ6cWlcbiAqIEBzdGF0dXMgc3RhYmxlXG4gKiBAc2luY2UgNC4wXG4gKlxuICogQHNsb3QgLSBpdGVtIGJvZHkgY29udGVudC5cbiAqIEBzbG90IHF0aS1ydWJyaWMtYmxvY2sgLSB0aGUgcXRpIHJ1YnJpYyBibG9jayBpcyBwbGFjZWQgYWJvdmUgdGhlIGl0ZW1cbiAqXG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktaXRlbS1ib2R5JylcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFF0aUl0ZW1Cb2R5IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXM6IENTU1Jlc3VsdEdyb3VwID0gc3R5bGVzO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicXRpLXJ1YnJpYy1ibG9ja1wiPjwvc2xvdD48c2xvdD48L3Nsb3Q+YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktaXRlbS1ib2R5JzogUXRpSXRlbUJvZHk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuXG5leHBvcnQgZGVmYXVsdCBjc3NgXG4gIDpob3N0IHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxuYDtcbiIsICJpbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5AY3VzdG9tRWxlbWVudCgncXRpLXByb21wdCcpXG5leHBvcnQgY2xhc3MgUXRpUHJvbXB0IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIC8vIGlmIHByb21wdHMgYXJlIGluIGludGVyYWN0aW9ucyB0aGV5IHNob3VsZCBoYXZlIGEgc2xvdCwgc28gdGhlIHByb21wdCBoYXMgdG8gZ28gdGhlcmVcbiAgICAvLyBpZiBwcm9tcHQgaXMgaW4gdGhlIGJvZHksIHRoZW4ganVzdCBkaXNwbGF5IHRoZSBwcm9tcHQgdGhlcmUuXG4gICAgLy8gQSBiZXR0ZXIgY2hlY2sgd291bGQgYmUgdGhlIGxhdHRlciwgYnV0IG5vdCBjYW4ndCBnZXQgdGhyb3VnaCB0aGUgc2hhZG93cm9vdCB0byBmaW5kIHRoZSBzbG90XG4gICAgY29uc3QgaW5JbnRlcmFjdGlvbiA9IHRoaXMucGFyZW50RWxlbWVudC50YWdOYW1lLmVuZHNXaXRoKCdJTlRFUkFDVElPTicpO1xuICAgIGluSW50ZXJhY3Rpb24gJiYgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAncHJvbXB0Jyk7XG4gICAgLy8gY29uc3QgcHJvbXB0U2xvdCA9IHRoaXMucGFyZW50RWxlbWVudC5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoXCJbbmFtZT0ncHJvbXB0J11cIik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXByb21wdCc6IFF0aVByb21wdDtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIFByb3BlcnR5VmFsdWVNYXAgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1zdHlsZXNoZWV0JylcbmV4cG9ydCBjbGFzcyBRdGlTdHlsZXNoZWV0IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHByaXZhdGUgc3R5bGVMaW5rOiBIVE1MU3R5bGVFbGVtZW50IHwgSFRNTExpbmtFbGVtZW50O1xuXG4gIC8vIHByb3RlY3RlZCBjcmVhdGVSZW5kZXJSb290KCk6IEhUTUxFbGVtZW50IHwgRG9jdW1lbnRGcmFnbWVudCB7XG4gIC8vICAgcmV0dXJuIHRoaXM7XG4gIC8vIH1cblxuICBwcm90ZWN0ZWQgZmlyc3RVcGRhdGVkKF9jaGFuZ2VkUHJvcGVydGllczogUHJvcGVydHlWYWx1ZU1hcDxhbnk+IHwgTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPik6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXMpO1xuXG4gICAgY29uc3QgaXRlbSA9IHRoaXM7XG4gICAgY29uc3QgbGluayA9IHRoaXMuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG5cbiAgICBpZiAobGluayAhPT0gbnVsbCkge1xuICAgICAgY29uc3Qgc3R5bGVzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgc3R5bGVzLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICAgIHN0eWxlcy50eXBlID0gJ3RleHQvY3NzJztcbiAgICAgIHN0eWxlcy5tZWRpYSA9ICdzY3JlZW4nO1xuICAgICAgc3R5bGVzLmhyZWYgPSBsaW5rO1xuICAgICAgaXRlbS5hcHBlbmRDaGlsZChzdHlsZXMpO1xuICAgICAgdGhpcy5zdHlsZUxpbmsgPSBzdHlsZXM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGV4dENvbnRlbnQgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHN0eWxlcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICBzdHlsZXMubWVkaWEgPSAnc2NyZWVuJztcbiAgICAgIHN0eWxlcy50ZXh0Q29udGVudCA9IHRoaXMudGV4dENvbnRlbnQ7XG4gICAgICBpdGVtLmFwcGVuZENoaWxkKHN0eWxlcyk7XG4gICAgICB0aGlzLnN0eWxlTGluayA9IHN0eWxlcztcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBpZiAodGhpcy5zdHlsZUxpbmspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuc3R5bGVMaW5rLnJlbW92ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ2NvdWxkIG5vdCByZW1vdmUgc3R5bGVzaGVldCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktc3R5bGVzaGVldCc6IFF0aVN0eWxlc2hlZXQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBCYXNlVHlwZSwgQ2FyZGluYWxpdHkgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgeyBPdXRjb21lVmFyaWFibGUgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgSXRlbUNvbnRleHQsIGl0ZW1Db250ZXh0IH0gZnJvbSAnLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuaW1wb3J0IHsgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiB9IGZyb20gJy4uL3F0aS12YXJpYWJsZS1kZWNsYXJhdGlvbic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktb3V0Y29tZS1kZWNsYXJhdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpT3V0Y29tZURlY2xhcmF0aW9uIGV4dGVuZHMgUXRpVmFyaWFibGVEZWNsYXJhdGlvbiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnYmFzZS10eXBlJyB9KSBiYXNlVHlwZTogQmFzZVR5cGU7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZXh0ZXJuYWwtc2NvcmVkJyB9KSBleHRlcm5hbFNjb3JlZDogU3RyaW5nO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgaWRlbnRpZmllcjogc3RyaW5nO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgY2FyZGluYWxpdHk6IENhcmRpbmFsaXR5O1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwdWJsaWMgaXRlbUNvbnRleHQ/OiBJdGVtQ29udGV4dDtcblxuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pdGVtQ29udGV4dD8udmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHRoaXMuaWRlbnRpZmllcik/LnZhbHVlO1xuICAgIHJldHVybiBodG1sYCR7SlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpfWA7XG4gIH1cblxuICBnZXQgaW50ZXJwb2xhdGlvblRhYmxlKCk6IE1hcDxudW1iZXIsIG51bWJlcj4gfCBudWxsIHtcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMucXVlcnlTZWxlY3RvcigncXRpLWludGVycG9sYXRpb24tdGFibGUnKTtcbiAgICBpZiAodGFibGUpIHtcbiAgICAgIGNvbnN0IGVudHJpZXMgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiB0YWJsZS5xdWVyeVNlbGVjdG9yQWxsKCdxdGktaW50ZXJwb2xhdGlvbi10YWJsZS1lbnRyeScpKSB7XG4gICAgICAgIGlmICghZW50cnkuZ2V0QXR0cmlidXRlKCdzb3VyY2UtdmFsdWUnKSAmJiBlbnRyeS5nZXRBdHRyaWJ1dGUoJ3RhcmdldC12YWx1ZScpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignc291cmNlLXZhbHVlIG9yIHRhcmdldC12YWx1ZSBpcyBtaXNzaW5nIGluIHF0aS1pbnRlcnBvbGF0aW9uLXRhYmxlLWVudHJ5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc291cmNlVmFsdWUgPSBwYXJzZUludChlbnRyeS5nZXRBdHRyaWJ1dGUoJ3NvdXJjZS12YWx1ZScpKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0VmFsdWUgPSBwYXJzZUludChlbnRyeS5nZXRBdHRyaWJ1dGUoJ3RhcmdldC12YWx1ZScpKTtcbiAgICAgICAgaWYgKGlzTmFOKHNvdXJjZVZhbHVlKSB8fCBpc05hTih0YXJnZXRWYWx1ZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdzb3VyY2UtdmFsdWUgb3IgdGFyZ2V0LXZhbHVlIGlzIG5vdCBhIG51bWJlciBpbiBxdGktaW50ZXJwb2xhdGlvbi10YWJsZS1lbnRyeScpO1xuICAgICAgICB9XG4gICAgICAgIGVudHJpZXMuc2V0KHNvdXJjZVZhbHVlLCB0YXJnZXRWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cmllcztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGNvbnN0IG91dGNvbWVWYXJpYWJsZTogT3V0Y29tZVZhcmlhYmxlID0ge1xuICAgICAgaWRlbnRpZmllcjogdGhpcy5pZGVudGlmaWVyLFxuICAgICAgY2FyZGluYWxpdHk6IHRoaXMuY2FyZGluYWxpdHksXG4gICAgICBiYXNlVHlwZTogdGhpcy5iYXNlVHlwZSxcbiAgICAgIHR5cGU6ICdvdXRjb21lJyxcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgaW50ZXJwb2xhdGlvblRhYmxlOiB0aGlzLmludGVycG9sYXRpb25UYWJsZVxuICAgIH07XG4gICAgb3V0Y29tZVZhcmlhYmxlLnZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWVzKG91dGNvbWVWYXJpYWJsZSk7XG5cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1yZWdpc3Rlci12YXJpYWJsZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDogeyB2YXJpYWJsZTogb3V0Y29tZVZhcmlhYmxlIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktb3V0Y29tZS1kZWNsYXJhdGlvbic6IFF0aU91dGNvbWVEZWNsYXJhdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGh0bWwsIExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXZhcmlhYmxlZGVjbGFyYXRpb24nKVxuZXhwb3J0IGNsYXNzIFF0aVZhcmlhYmxlRGVjbGFyYXRpb24gZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRlZmF1bHRWYWx1ZXModmFyaWFibGU6IFZhcmlhYmxlRGVjbGFyYXRpb248c3RyaW5nIHwgc3RyaW5nW10gfCBudWxsPikge1xuICAgIGNvbnN0IGh0bWxWYWx1ZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWRlZmF1bHQtdmFsdWUgPiBxdGktdmFsdWUnKSk7XG5cbiAgICBpZiAoaHRtbFZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRWYWx1ZXMgPSBodG1sVmFsdWVzLm1hcChuID0+IG4uaW5uZXJIVE1MKTtcbiAgICBpZiAoZGVmYXVsdFZhbHVlcy5sZW5ndGggPiAxIHx8IHZhcmlhYmxlLmNhcmRpbmFsaXR5ID09PSAnbXVsdGlwbGUnIHx8IHZhcmlhYmxlLmNhcmRpbmFsaXR5ID09PSAnb3JkZXJlZCcpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVzO1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFZhbHVlc1swXTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktdmFyaWFibGVkZWNsYXJhdGlvbic6IFF0aVZhcmlhYmxlRGVjbGFyYXRpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjb25zdW1lIH0gZnJvbSAnQGxpdC9jb250ZXh0JztcbmltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBCYXNlVHlwZSwgQ2FyZGluYWxpdHkgfSBmcm9tICcuLi8uLi9pbnRlcm5hbC9leHByZXNzaW9uLXJlc3VsdCc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IEl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dCB9IGZyb20gJy4uLy4uL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmltcG9ydCB7IFF0aU1hcHBpbmcgfSBmcm9tICcuLi8uLi9xdGktcmVzcG9uc2UtcHJvY2Vzc2luZy9xdGktZXhwcmVzc2lvbi9xdGktbWFwcGluZy9xdGktbWFwcGluZyc7XG5pbXBvcnQgeyBRdGlWYXJpYWJsZURlY2xhcmF0aW9uIH0gZnJvbSAnLi4vcXRpLXZhcmlhYmxlLWRlY2xhcmF0aW9uJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpUmVzcG9uc2VEZWNsYXJhdGlvbiBleHRlbmRzIFF0aVZhcmlhYmxlRGVjbGFyYXRpb24ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2Jhc2UtdHlwZScgfSkgYmFzZVR5cGU6IEJhc2VUeXBlO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGNhcmRpbmFsaXR5OiBDYXJkaW5hbGl0eTtcblxuICBAY29uc3VtZSh7IGNvbnRleHQ6IGl0ZW1Db250ZXh0LCBzdWJzY3JpYmU6IHRydWUgfSlcbiAgQHN0YXRlKClcbiAgcHVibGljIGl0ZW1Db250ZXh0PzogSXRlbUNvbnRleHQ7XG5cbiAgc3RhdGljIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaXRlbUNvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSB0aGlzLmlkZW50aWZpZXIpPy52YWx1ZTtcbiAgICByZXR1cm4gaHRtbGAke0pTT04uc3RyaW5naWZ5KHZhbHVlLCBudWxsLCAyKX1gO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlOiBSZXNwb25zZVZhcmlhYmxlID0ge1xuICAgICAgYmFzZVR5cGU6IHRoaXMuYmFzZVR5cGUsXG4gICAgICBpZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICBjb3JyZWN0UmVzcG9uc2U6IHRoaXMuY29ycmVjdFJlc3BvbnNlLFxuICAgICAgY2FyZGluYWxpdHk6IHRoaXMuY2FyZGluYWxpdHkgfHwgJ3NpbmdsZScsXG4gICAgICBtYXBwaW5nOiB0aGlzLm1hcHBpbmcsXG4gICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIHR5cGU6ICdyZXNwb25zZScsXG4gICAgICBjYW5kaWRhdGVSZXNwb25zZTogbnVsbFxuICAgIH07XG4gICAgcmVzcG9uc2VWYXJpYWJsZS52YWx1ZSA9IHRoaXMuZGVmYXVsdFZhbHVlcyhyZXNwb25zZVZhcmlhYmxlKTtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLXJlZ2lzdGVyLXZhcmlhYmxlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7IHZhcmlhYmxlOiByZXNwb25zZVZhcmlhYmxlIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGNvcnJlY3RSZXNwb25zZSgpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgbGV0IHJlc3VsdDogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgY29uc3QgY29ycmVjdFJlc3BvbnNlID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktY29ycmVjdC1yZXNwb25zZScpO1xuICAgIGlmIChjb3JyZWN0UmVzcG9uc2UpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IGNvcnJlY3RSZXNwb25zZS5xdWVyeVNlbGVjdG9yQWxsKCdxdGktdmFsdWUnKTtcbiAgICAgIGlmICh0aGlzLmNhcmRpbmFsaXR5ID09PSAnc2luZ2xlJyAmJiB2YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHQgPSB2YWx1ZXNbMF0udGV4dENvbnRlbnQ7XG4gICAgICAgIHZhbHVlc1swXS5yZW1vdmUoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScpIHtcbiAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWVzW2ldLnRleHRDb250ZW50KTtcbiAgICAgICAgICB2YWx1ZXNbaV0ucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IG1hcHBpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvcigncXRpLW1hcHBpbmcnKSBhcyBRdGlNYXBwaW5nO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbic6IFF0aVJlc3BvbnNlRGVjbGFyYXRpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvJylcbmV4cG9ydCBjbGFzcyBRdGlDb21wYW5pb25NYXRlcmlhbHNJbmZvIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIC8vIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gIC8vICAgc2xvdCB7XG4gIC8vICAgICBkaXNwbGF5OiBoaWRkZW47XG4gIC8vICAgfVxuICAvLyBgO1xuICAvLyBvdmVycmlkZSByZW5kZXIoKSB7XG4gIC8vICAgcmV0dXJuIGh0bWxgIDxzbG90Pjwvc2xvdD4gYDtcbiAgLy8gfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvJzogUXRpQ29tcGFuaW9uTWF0ZXJpYWxzSW5mbztcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1jb250ZW50LWJvZHknKVxuZXhwb3J0IGNsYXNzIFF0aUNvbnRlbnRCb2R5IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8c2xvdD48L3Nsb3Q+YDtcbiAgfVxufVxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWNvbnRlbnQtYm9keSc6IFF0aUNvbnRlbnRCb2R5O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1ydWJyaWMtYmxvY2snKVxuZXhwb3J0IGNsYXNzIFF0aVJ1YnJpY0Jsb2NrIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSBvdmVycmlkZSBpZDsgLy8gPVwicXRpQXNwZWN0SW5ob3VkUnVicmljQmxvY2tcIlxuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB1c2U6ICdpbnN0cnVjdGlvbnMnIHwgJ3Njb3JpbmcnIHwgJ25hdmlnYXRpb24nOyAvLyAgPSBcInNjb3JpbmdcIlxuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSB2aWV3OiAnYXV0aG9yJyB8ICdjYW5kaWRhdGUnIHwgJ3Byb2N0b3InIHwgJ3Njb3JlcicgfCAndGVzdENvbnN0cnVjdG9yJyB8ICd0dXRvcic7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjbGFzcycgfSkgY2xhc3NOYW1lcztcbiAgQHdhdGNoKCdjbGFzc05hbWVzJywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBoYW5kbGVjbGFzc05hbWVzQ2hhbmdlKG9sZCwgZGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjbGFzc05hbWVzID0gdGhpcy5jbGFzc05hbWVzLnNwbGl0KCcgJyk7XG4gICAgY2xhc3NOYW1lcy5mb3JFYWNoKChjbGFzc05hbWU6IHN0cmluZykgPT4ge1xuICAgICAgc3dpdGNoIChjbGFzc05hbWUpIHtcbiAgICAgICAgY2FzZSAncXRpLXJ1YnJpYy1kaXNjcmV0aW9uYXJ5LXBsYWNlbWVudCc6XG4gICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAncXRpLXJ1YnJpYy1ibG9jaycpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdxdGktcnVicmljLWlubGluZSc6XG4gICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAnJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIC8vIGJ5IGRlZmF1bHQgcHV0IHRoaXMgaW4gYSBzbG90IGluIHRoZSBpdGVtLWJvZHlcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdxdGktcnVicmljLWJsb2NrJyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXJ1YnJpYy1ibG9jayc6IFF0aVJ1YnJpY0Jsb2NrO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgUHJvcGVydHlWYWx1ZU1hcCwgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBRdGlGZWVkYmFjayB9IGZyb20gJy4uL3F0aS1mZWVkYmFjayc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZmVlZGJhY2stYmxvY2snKVxuZXhwb3J0IGNsYXNzIFF0aUZlZWRiYWNrQmxvY2sgZXh0ZW5kcyBRdGlGZWVkYmFjayB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICAgIC5vbiB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gICAgLm9mZiB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IHBhcnQ9XCJmZWVkYmFja1wiIGNsYXNzPVwiZmVlZGJhY2sgJHt0aGlzLnNob3dTdGF0dXN9XCI+PC9zbG90PiBgO1xuICB9XG5cbiAgcHJvdGVjdGVkIGZpcnN0VXBkYXRlZChfY2hhbmdlZFByb3BlcnRpZXM6IFByb3BlcnR5VmFsdWVNYXA8YW55PiB8IE1hcDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pOiB2b2lkIHtcbiAgICB0aGlzLmNoZWNrU2hvd0ZlZWRiYWNrKHRoaXMub3V0Y29tZUlkZW50aWZpZXIpO1xuICB9XG59XG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZmVlZGJhY2stYmxvY2snOiBRdGlGZWVkYmFja0Jsb2NrO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgUHJvcGVydHlWYWx1ZU1hcCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aUFzc2Vzc21lbnRJdGVtIH0gZnJvbSAnLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtJztcbmltcG9ydCB7IElzTnVsbE9yVW5kZWZpbmVkIH0gZnJvbSAnLi4vaW50ZXJuYWwvdXRpbHMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUXRpRmVlZGJhY2sgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdzaG93LWhpZGUnIH0pXG4gIHByb3RlY3RlZCBzaG93SGlkZTogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnb3V0Y29tZS1pZGVudGlmaWVyJyB9KVxuICBwdWJsaWMgb3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHJvdGVjdGVkIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogZmFsc2UgfSlcbiAgcHVibGljIHNob3dTdGF0dXM6IHN0cmluZztcblxuICBwdWJsaWMgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8UXRpRmVlZGJhY2s+KCdxdGktcmVnaXN0ZXItZmVlZGJhY2snLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHRoaXNcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBjaGVja1Nob3dGZWVkYmFjayhvdXRjb21lSWRlbnRpZmllcjogc3RyaW5nKSB7ICAgIFxuICAgIGNvbnN0IG91dGNvbWVWYXJpYWJsZSA9ICh0aGlzLmNsb3Nlc3QoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKSBhcyBRdGlBc3Nlc3NtZW50SXRlbSkuZ2V0T3V0Y29tZShvdXRjb21lSWRlbnRpZmllcik7XG5cbiAgICBpZiAodGhpcy5vdXRjb21lSWRlbnRpZmllciAhPT0gb3V0Y29tZUlkZW50aWZpZXIgfHwgIW91dGNvbWVWYXJpYWJsZSkgcmV0dXJuO1xuICAgIGxldCBpc0ZvdW5kID0gZmFsc2U7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob3V0Y29tZVZhcmlhYmxlLnZhbHVlKSkge1xuICAgICAgaXNGb3VuZCA9IG91dGNvbWVWYXJpYWJsZS52YWx1ZS5pbmNsdWRlcyh0aGlzLmlkZW50aWZpZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpc0ZvdW5kID1cbiAgICAgICAgKCFJc051bGxPclVuZGVmaW5lZCh0aGlzLmlkZW50aWZpZXIpICYmXG4gICAgICAgICAgIUlzTnVsbE9yVW5kZWZpbmVkKG91dGNvbWVWYXJpYWJsZT8udmFsdWUpICYmXG4gICAgICAgICAgdGhpcy5pZGVudGlmaWVyID09PSBvdXRjb21lVmFyaWFibGUudmFsdWUpIHx8XG4gICAgICAgIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0ZlZWRiYWNrKGlzRm91bmQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93RmVlZGJhY2sodmFsdWU6IGJvb2xlYW4pIHsgICAgXG4gICAgdGhpcy5zaG93U3RhdHVzID0gKHZhbHVlICYmIHRoaXMuc2hvd0hpZGUgPT09ICdzaG93JykgfHwgKCF2YWx1ZSAmJiB0aGlzLnNob3dIaWRlID09PSAnaGlkZScpID8gJ29uJyA6ICdvZmYnOyAgICBcbiAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBkZWNpbWFsU2VwYXJhdG9yID0gKCkgPT4ge1xuICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KCkuZm9ybWF0KDAuMSkucmVwbGFjZSgvXFxkL2csICcnKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCA9IChudW1iZXI6IG51bWJlciB8IHN0cmluZykgPT4ge1xuICAvLyBjaGVjayBpZiB0eXBlIGlzIHN0cmluZ1xuICBpZiAodHlwZW9mIG51bWJlciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbnVtYmVyO1xuICB9XG4gIGNvbnN0IGRTZXAgPSBkZWNpbWFsU2VwYXJhdG9yKCk7XG4gIGlmIChkU2VwID09PSAnLicpIHtcbiAgICByZXR1cm4gbnVtYmVyLnRvTG9jYWxlU3RyaW5nKCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bWJlci50b1N0cmluZygpLnJlcGxhY2UoJy4nLCAnJykucmVwbGFjZShkU2VwLCAnLicpO1xuICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gSXNOdWxsT3JVbmRlZmluZWQodmFsdWU6IHVua25vd24pIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVEb3VibGVTbGFzaGVzKHN0cjogc3RyaW5nKSB7XG4gIGNvbnN0IHNpbmdsZUZvcndhcmRTbGFzaGVzID0gc3RyXG4gICAgLnJlcGxhY2UoLyhbXjpdXFwvKVxcLysvZywgJyQxJylcbiAgICAucmVwbGFjZSgvXFwvXFwvL2csICcvJylcbiAgICAucmVwbGFjZSgnaHR0cDovJywgJ2h0dHA6Ly8nKVxuICAgIC5yZXBsYWNlKCdodHRwczovJywgJ2h0dHBzOi8vJyk7XG4gIHJldHVybiBzaW5nbGVGb3J3YXJkU2xhc2hlcztcbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFF0aUZlZWRiYWNrIH0gZnJvbSAnLi4vcXRpLWZlZWRiYWNrJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1mZWVkYmFjay1pbmxpbmUnKVxuZXhwb3J0IGNsYXNzIFF0aUZlZWRiYWNrSW5saW5lIGV4dGVuZHMgUXRpRmVlZGJhY2sge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIC5vbiB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgfVxuICAgIC5vZmYge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyID0gKCkgPT4gaHRtbGAgPHNsb3QgcGFydD1cImZlZWRiYWNrXCIgY2xhc3M9XCIke3RoaXMuc2hvd1N0YXR1c31cIj48L3Nsb3Q+IGA7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1mZWVkYmFjay1pbmxpbmUnOiBRdGlGZWVkYmFja0lubGluZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpRmVlZGJhY2sgfSBmcm9tICcuLi9xdGktZmVlZGJhY2snO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW1vZGFsLWZlZWRiYWNrJylcbmV4cG9ydCBjbGFzcyBRdGlNb2RhbEZlZWRiYWNrIGV4dGVuZHMgUXRpRmVlZGJhY2sge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIC5vbiB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgfVxuICAgIC5vZmYge1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyID0gKCkgPT4gaHRtbGAgPHNsb3QgcGFydD1cImZlZWRiYWNrXCIgY2xhc3M9XCIke3RoaXMuc2hvd1N0YXR1c31cIj48L3Nsb3Q+IGA7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1tb2RhbC1mZWVkYmFjayc6IFF0aU1vZGFsRmVlZGJhY2s7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgaWZEZWZpbmVkIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvaWYtZGVmaW5lZC5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IHJlZiwgY3JlYXRlUmVmIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVmLmpzJztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktZXh0ZW5kZWQtdGV4dC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpRXh0ZW5kZWRUZXh0SW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIC8vIHB1YmxpYyBzdGF0aWMgcm93SGVpZ2h0Q2xhc3MgPSBbXTtcblxuICB0ZXh0YXJlYVJlZiA9IGNyZWF0ZVJlZjxIVE1MVGV4dEFyZWFFbGVtZW50PigpO1xuXG4gIC8qKiBleHBlY3RlZCBsZW5ndGggaXMgbWFwcGVkIHRvIHRoZSBwcm9wZXJ0eSBtYXhsZW5ndGggb24gdGhlIHRleHRhcmVhICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiAnZXhwZWN0ZWQtbGVuZ3RoJyB9KSBleHBlY3RlZExlbmd0aDogbnVtYmVyO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAncGF0dGVybi1tYXNrJyB9KSBwYXR0ZXJuTWFzazogc3RyaW5nO1xuXG4gIC8qKiB0ZXh0IGFwcGVhcmluZyBpbiB0aGUgZXh0ZW5kZWQtdGV4dC1udGVyYWN0aW9uIGlmIGl0IGlzIGVtcHR5ICovXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAncGxhY2Vob2xkZXItdGV4dCcgfSkgcGxhY2Vob2xkZXJUZXh0OiBzdHJpbmc7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfdmFsdWUgPSAnJztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2NsYXNzJyB9KSBjbGFzc05hbWVzO1xuICBAd2F0Y2goJ2NsYXNzTmFtZXMnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIGhhbmRsZWNsYXNzTmFtZXNDaGFuZ2Uob2xkLCBkaXNhYmxlZDogYm9vbGVhbikge1xuICAgIGNvbnN0IGNsYXNzTmFtZXMgPSB0aGlzLmNsYXNzTmFtZXMuc3BsaXQoJyAnKTtcbiAgICBjbGFzc05hbWVzLmZvckVhY2goKGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoY2xhc3NOYW1lLnN0YXJ0c1dpdGgoJ3F0aS1oZWlnaHQtbGluZXMnKSkge1xuICAgICAgICBjb25zdCBuclJvd3MgPSBjbGFzc05hbWUucmVwbGFjZSgncXRpLWhlaWdodC1saW5lcy0nLCAnJyk7XG4gICAgICAgIGlmICh0aGlzLnRleHRhcmVhUmVmKSB7XG4gICAgICAgICAgdGhpcy50ZXh0YXJlYVJlZi52YWx1ZS5yb3dzID0gcGFyc2VJbnQobnJSb3dzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldCByZXNwb25zZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiAnJztcbiAgfVxuXG4gIHB1YmxpYyB2YWxpZGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUgIT09ICcnO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIGdldCBzdHlsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNzc2BcbiAgICAgICAgLyogUEs6IGRpc3BsYXkgaG9zdCBhcyBibG9jaywgZWxzZSBkZXNpZ24gd2lsbCBiZSBjb2xsYXBzZWQgKi9cbiAgICAgICAgOmhvc3Qge1xuICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB9XG4gICAgICAgIHRleHRhcmVhIHtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICBib3JkZXI6IDA7XG4gICAgICAgIH1cbiAgICAgIGBcbiAgICBdO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3RcbiAgICAgID48dGV4dGFyZWFcbiAgICAgICAgcGFydD1cInRleHRhcmVhXCJcbiAgICAgICAgJHtyZWYodGhpcy50ZXh0YXJlYVJlZil9XG4gICAgICAgIHNwZWxsY2hlY2s9XCJmYWxzZVwiXG4gICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgIEBrZXlkb3duPVwiJHtldmVudCA9PiBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1cIlxuICAgICAgICBAa2V5dXA9XCIke3RoaXMudGV4dENoYW5nZWR9XCJcbiAgICAgICAgQGNoYW5nZT1cIiR7dGhpcy50ZXh0Q2hhbmdlZH1cIlxuICAgICAgICBwbGFjZWhvbGRlcj1cIiR7aWZEZWZpbmVkKHRoaXMucGxhY2Vob2xkZXJUZXh0ID8gdGhpcy5wbGFjZWhvbGRlclRleHQgOiB1bmRlZmluZWQpfVwiXG4gICAgICAgIG1heGxlbmd0aD1cIiR7aWZEZWZpbmVkKHRoaXMuZXhwZWN0ZWRMZW5ndGggPyB0aGlzLmV4cGVjdGVkTGVuZ3RoIDogdW5kZWZpbmVkKX1cIlxuICAgICAgICBwYXR0ZXJuPVwiJHtpZkRlZmluZWQodGhpcy5wYXR0ZXJuTWFzayA/IHRoaXMucGF0dGVybk1hc2sgOiB1bmRlZmluZWQpfVwiXG4gICAgICAgID9kaXNhYmxlZD1cIiR7dGhpcy5kaXNhYmxlZH1cIlxuICAgICAgICA/cmVhZG9ubHk9XCIke3RoaXMucmVhZG9ubHl9XCJcbiAgICAgICAgLnZhbHVlPSR7dGhpcy5fdmFsdWV9XG4gICAgICA+PC90ZXh0YXJlYT5gO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRleHRDaGFuZ2VkKGV2ZW50OiBFdmVudCkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHJldHVybjtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIHRoaXMuc2V0RW1wdHlBdHRyaWJ1dGUoaW5wdXQudmFsdWUpO1xuICAgIGlmICh0aGlzLl92YWx1ZSAhPT0gaW5wdXQudmFsdWUpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gaW5wdXQudmFsdWU7XG4gICAgICB0aGlzLnNhdmVSZXNwb25zZShpbnB1dC52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5fdmFsdWUgPSAnJztcbiAgfVxuXG4gIHByaXZhdGUgc2V0RW1wdHlBdHRyaWJ1dGUodGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2VtcHR5JywgdGV4dCA9PT0gJycgPyAndHJ1ZScgOiAnZmFsc2UnKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZXh0ZW5kZWQtdGV4dC1pbnRlcmFjdGlvbic6IFF0aUV4dGVuZGVkVGV4dEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEludGVyYWN0aW9uIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogJ3Jlc3BvbnNlLWlkZW50aWZpZXInIH0pIHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nID0gJyc7XG5cbiAgLyoqIGRpc2FibGVkIHNob3VsZCBiZSBleHBvc2VkIHRvIHRoZSBhdHRyaWJ1dGVzIGFuZCBhY2Nlc3NpYmxlIGFzIHByb3BlcnR5ICovXG4gIEBwcm9wZXJ0eSh7IHJlZmxlY3Q6IHRydWUsIHR5cGU6IEJvb2xlYW4gfSkgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAvKiogcmVhZG9ubHkgc2hvdWxkIGJlIGV4cG9zZWQgdG8gdGhlIGF0dHJpYnV0ZXMgYW5kIGFjY2Vzc2libGUgYXMgcHJvcGVydHkgKi9cbiAgQHByb3BlcnR5KHsgcmVmbGVjdDogdHJ1ZSwgdHlwZTogQm9vbGVhbiB9KSByZWFkb25seSA9IGZhbHNlO1xuXG4gIGFic3RyYWN0IHZhbGlkYXRlKCk6IGJvb2xlYW47XG4gIGFic3RyYWN0IHNldCByZXNwb25zZSh2YWw6IFJlYWRvbmx5PHN0cmluZyB8IHN0cmluZ1tdPik7XG4gIHNldCBjb3JyZWN0UmVzcG9uc2UodmFsOiBSZWFkb25seTxzdHJpbmcgfCBzdHJpbmdbXT4pIHtcbiAgICBjb25zb2xlLndhcm4oJ2NvcnJlY3RSZXNwb25zZSBpcyBub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50KCdxdGktcmVnaXN0ZXItaW50ZXJhY3Rpb24nLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZVxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHNhdmVSZXNwb25zZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ3F0aS1pbnRlcmFjdGlvbi1yZXNwb25zZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICByZXNwb25zZUlkZW50aWZpZXI6IHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLFxuICAgICAgICAgIHJlc3BvbnNlOiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IFsuLi52YWx1ZV0gOiB2YWx1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgaWZEZWZpbmVkIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvaWYtZGVmaW5lZC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVSZWYgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9yZWYuanMnO1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3JzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aVRleHRFbnRyeUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ2V4cGVjdGVkLWxlbmd0aCcgfSkgZXhwZWN0ZWRMZW5ndGg6IG51bWJlcjtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3BhdHRlcm4tbWFzaycgfSkgcGF0dGVybk1hc2s6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3BsYWNlaG9sZGVyLXRleHQnIH0pIHBsYWNlaG9sZGVyVGV4dDogc3RyaW5nO1xuXG4gIEBzdGF0ZSgpXG4gIHByaXZhdGUgX3ZhbHVlID0gJyc7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfY29ycmVjdFZhbHVlID0gJyc7XG5cbiAgQHN0YXRlKClcbiAgcHJpdmF0ZSBfc2l6ZSA9IDU7XG5cbiAgaW5wdXRSZWYgPSBjcmVhdGVSZWY8SFRNTElucHV0RWxlbWVudD4oKTtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2NsYXNzJyB9KSBjbGFzc05hbWVzO1xuICBAd2F0Y2goJ2NsYXNzTmFtZXMnKVxuICBoYW5kbGVjbGFzc05hbWVzQ2hhbmdlKG9sZCwgY2xhc3Nlczogc3RyaW5nKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lcyA9IGNsYXNzZXMuc3BsaXQoJyAnKTtcbiAgICBjbGFzc05hbWVzLmZvckVhY2goKGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoY2xhc3NOYW1lLnN0YXJ0c1dpdGgoJ3F0aS1pbnB1dC13aWR0aCcpKSB7XG4gICAgICAgIGNvbnN0IG5yUm93cyA9IGNsYXNzTmFtZS5yZXBsYWNlKCdxdGktaW5wdXQtd2lkdGgtJywgJycpO1xuICAgICAgICB0aGlzLl9zaXplID0gcGFyc2VJbnQobnJSb3dzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgcmVzcG9uc2UodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDogJyc7XG4gIH1cblxuICBwdWJsaWMgdmFsaWRhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlICE9PSAnJztcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBnZXQgc3R5bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICBjc3NgXG4gICAgICAgIFtwYXJ0PSdjb3JyZWN0J10ge1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgfVxuICAgICAgYFxuICAgIF07XG4gIH1cblxuICBzZXQgY29ycmVjdFJlc3BvbnNlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jb3JyZWN0VmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgICAgICBcbiAgICAgIDxpbnB1dFxuICAgICAgICBwYXJ0PVwiaW5wdXRcIlxuICAgICAgICBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICBAa2V5ZG93bj1cIiR7ZXZlbnQgPT4gZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9XCJcbiAgICAgICAgQGtleXVwPVwiJHt0aGlzLnRleHRDaGFuZ2VkfVwiXG4gICAgICAgIEBjaGFuZ2U9XCIke3RoaXMudGV4dENoYW5nZWR9XCJcbiAgICAgICAgdHlwZT1cIiR7dGhpcy5wYXR0ZXJuTWFzayA9PSAnWzAtOV0qJyA/ICdudW1iZXInIDogJ3RleHQnfVwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiJHtpZkRlZmluZWQodGhpcy5wbGFjZWhvbGRlclRleHQgPyB0aGlzLnBsYWNlaG9sZGVyVGV4dCA6IHVuZGVmaW5lZCl9XCJcbiAgICAgICAgLnZhbHVlPVwiJHt0aGlzLl92YWx1ZX1cIlxuICAgICAgICBzaXplPVwiJHt0aGlzLl9zaXplfVwiXG4gICAgICAgIHBhdHRlcm49XCIke2lmRGVmaW5lZCh0aGlzLnBhdHRlcm5NYXNrID8gdGhpcy5wYXR0ZXJuTWFzayA6IHVuZGVmaW5lZCl9XCJcbiAgICAgICAgP2Rpc2FibGVkPVwiJHt0aGlzLmRpc2FibGVkfVwiXG4gICAgICAgID9yZWFkb25seT1cIiR7dGhpcy5yZWFkb25seX1cIlxuICAgICAgLz5cbiAgICAgIDxkaXYgcGFydD1cImNvcnJlY3RcIj4ke3RoaXMuX2NvcnJlY3RWYWx1ZX08L2Rpdj5cbiAgICBgO1xuICB9XG4gIC8vXG4gIC8vIG1heGxlbmd0aD1cIiR7aWZEZWZpbmVkKHRoaXMuZXhwZWN0ZWRMZW5ndGggPyB0aGlzLmV4cGVjdGVkTGVuZ3RoIDogdW5kZWZpbmVkKX1cIlxuXG4gIHByb3RlY3RlZCB0ZXh0Q2hhbmdlZChldmVudDogRXZlbnQpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSByZXR1cm47XG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICB0aGlzLnNldEVtcHR5QXR0cmlidXRlKGlucHV0LnZhbHVlKTtcbiAgICBpZiAodGhpcy5fdmFsdWUgIT09IGlucHV0LnZhbHVlKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IGlucHV0LnZhbHVlO1xuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UoaW5wdXQudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX3ZhbHVlID0gJyc7XG4gIH1cblxuICBwcml2YXRlIHNldEVtcHR5QXR0cmlidXRlKHRleHQ6IHN0cmluZykge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdlbXB0eScsIHRleHQgPT09ICcnID8gJ3RydWUnIDogJ2ZhbHNlJyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXRleHQtZW50cnktaW50ZXJhY3Rpb24nOiBRdGlUZXh0RW50cnlJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgIi8vIEB3YXRjaCBkZWNvcmF0b3Jcbi8vXG4vLyBSdW5zIHdoZW4gYW4gb2JzZXJ2ZWQgcHJvcGVydHkgY2hhbmdlcywgZS5nLiBAcHJvcGVydHkgb3IgQHN0YXRlLCBidXQgYmVmb3JlIHRoZSBjb21wb25lbnQgdXBkYXRlcy5cbi8vXG4vLyBUbyB3YWl0IGZvciBhbiB1cGRhdGUgdG8gY29tcGxldGUgYWZ0ZXIgYSBjaGFuZ2Ugb2NjdXJzLCB1c2UgYGF3YWl0IHRoaXMudXBkYXRlQ29tcGxldGVgIGluIHRoZSBoYW5kbGVyLiBUbyBzdGFydFxuLy8gd2F0Y2hpbmcgYWZ0ZXIgdGhlIGluaXRpYWwgdXBkYXRlL3JlbmRlciwgdXNlIGB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH1gIG9yIGB0aGlzLmhhc1VwZGF0ZWRgIGluIHRoZSBoYW5kbGVyLlxuLy9cbi8vIFVzYWdlOlxuLy9cbi8vICBAd2F0Y2goJ3Byb3BOYW1lJylcbi8vICBoYW5kbGVQcm9wQ2hhbmdlKG9sZFZhbHVlLCBuZXdWYWx1ZSkge1xuLy8gICAgLi4uXG4vLyAgfVxuXG5pbXBvcnQgdHlwZSB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuXG50eXBlIFVwZGF0ZUhhbmRsZXIgPSAocHJldj86IHVua25vd24sIG5leHQ/OiB1bmtub3duKSA9PiB2b2lkO1xuXG50eXBlIE5vblVuZGVmaW5lZDxBPiA9IEEgZXh0ZW5kcyB1bmRlZmluZWQgPyBuZXZlciA6IEE7XG5cbnR5cGUgVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxUIGV4dGVuZHMgb2JqZWN0PiA9IHtcbiAgW0sgaW4ga2V5b2YgVF0tPzogTm9uVW5kZWZpbmVkPFRbS10+IGV4dGVuZHMgVXBkYXRlSGFuZGxlciA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVF07XG5cbmludGVyZmFjZSBMaXZlUXVlcnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIHRydWUsIHdpbGwgb25seSBzdGFydCB3YXRjaGluZyBhZnRlciB0aGUgaW5pdGlhbCB1cGRhdGUvcmVuZGVyXG4gICAqL1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGl2ZVF1ZXJ5KHF1ZXJ5U2VsZWN0b3I6IHN0cmluZywgb3B0aW9ucz86IExpdmVRdWVyeU9wdGlvbnMpIHtcbiAgbGV0IG9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xuICBjb25zdCByZXNvbHZlZE9wdGlvbnM6IFJlcXVpcmVkPExpdmVRdWVyeU9wdGlvbnM+ID0ge1xuICAgIC4uLm9wdGlvbnNcbiAgfTtcbiAgcmV0dXJuIDxFbGVtQ2xhc3MgZXh0ZW5kcyBMaXRFbGVtZW50PihcbiAgICBwcm90bzogRWxlbUNsYXNzLFxuICAgIGRlY29yYXRlZEZuTmFtZTogVXBkYXRlSGFuZGxlckZ1bmN0aW9uS2V5czxFbGVtQ2xhc3M+XG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHsgY29ubmVjdGVkQ2FsbGJhY2ssIGRpc2Nvbm5lY3RlZENhbGxiYWNrIH0gPSBwcm90bztcblxuICAgIHByb3RvLmNvbm5lY3RlZENhbGxiYWNrID0gZnVuY3Rpb24gKHRoaXM6IEVsZW1DbGFzcykge1xuICAgICAgY29ubmVjdGVkQ2FsbGJhY2suY2FsbCh0aGlzKTtcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gKG11dGF0aW9uTGlzdDogTXV0YXRpb25SZWNvcmRbXSkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50c1RvV2F0Y2ggPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbChxdWVyeVNlbGVjdG9yKSk7XG4gICAgICAgIGZvciAoY29uc3QgbXV0YXRpb24gb2YgbXV0YXRpb25MaXN0KSB7XG4gICAgICAgICAgY29uc3QgYWRkZWROb2RlcyA9IEFycmF5LmZyb20obXV0YXRpb24uYWRkZWROb2RlcykubWFwKGUgPT4gZSBhcyBFbGVtZW50KTtcbiAgICAgICAgICBjb25zdCByZW1vdmVkTm9kZXMgPSBBcnJheS5mcm9tKG11dGF0aW9uLmFkZGVkTm9kZXMpLm1hcChlID0+IGUgYXMgRWxlbWVudCk7XG4gICAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdjaGlsZExpc3QnICYmIGFkZGVkTm9kZXMuZmluZChuID0+IGVsZW1lbnRzVG9XYXRjaC5pbmNsdWRlcyhuKSkpIHtcbiAgICAgICAgICAgICh0aGlzW2RlY29yYXRlZEZuTmFtZV0gYXMgdW5rbm93biBhcyBVcGRhdGVIYW5kbGVyKShhZGRlZE5vZGVzLCByZW1vdmVkTm9kZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spO1xuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcblxuICAgICAgY29uc3QgZWxlbWVudHNBZGRlZCA9IHRoaXMucXVlcnlTZWxlY3RvckFsbChxdWVyeVNlbGVjdG9yKSA/PyBbXTtcbiAgICAgICh0aGlzW2RlY29yYXRlZEZuTmFtZV0gYXMgdW5rbm93biBhcyBVcGRhdGVIYW5kbGVyKShBcnJheS5mcm9tKGVsZW1lbnRzQWRkZWQpLCBbXSk7XG4gICAgfTtcblxuICAgIHByb3RvLmRpc2Nvbm5lY3RlZENhbGxiYWNrID0gZnVuY3Rpb24gKHRoaXM6IEVsZW1DbGFzcykge1xuICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2suY2FsbCh0aGlzKTtcbiAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9O1xuICB9O1xufVxuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IENob2ljZXMgfSBmcm9tICcuLi9pbnRlcm5hbC9jaG9pY2VzL2Nob2ljZXMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUhvdHRleHRJbnRlcmFjdGlvbiBleHRlbmRzIENob2ljZXMge1xuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdxdGktaG90dGV4dC1pbnRlcmFjdGlvbicsICcnKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlbmRlciA9ICgpID0+IGh0bWxgPHNsb3Q+PC9zbG90PmA7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ob3R0ZXh0LWludGVyYWN0aW9uJzogUXRpSG90dGV4dEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuLi8uLi8uLi8uLi9kZWNvcmF0b3JzL3dhdGNoJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuaW1wb3J0IHsgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpQ2hvaWNlIH0gZnJvbSAnLi4vY2hvaWNlL3F0aS1jaG9pY2UnO1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENob2ljZXMgZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIHByb3RlY3RlZCBfY2hvaWNlRWxlbWVudHM6IFF0aUNob2ljZVtdID0gW107XG5cbiAgLyoqIHRoZSBtaW5pbWFsIG51bWJlciBvZiBzZWxlY3Rpb25zIGEgY2FuZGlkYXRlIG11c3QgbWFrZSAqL1xuICBAcHJvcGVydHkoe1xuICAgIHR5cGU6IE51bWJlcixcbiAgICBhdHRyaWJ1dGU6ICdtaW4tY2hvaWNlcydcbiAgfSlcbiAgcHVibGljIG1pbkNob2ljZXM6IG51bWJlciA9IDA7XG5cbiAgLyoqIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWxlY3Rpb25zIGEgY2FuZGlkYXRlIG11c3QgbWFrZSwgdGhlIG90aGVyIG9wdGlvbnMgd2lsbCBiZSBkaXNhYmxlZCB3aGVuIG1heCBvcHRpb25zIGlzIGNoZWNrZWQgKi9cbiAgQHByb3BlcnR5KHtcbiAgICB0eXBlOiBOdW1iZXIsXG4gICAgYXR0cmlidXRlOiAnbWF4LWNob2ljZXMnXG4gIH0pXG4gIHB1YmxpYyBtYXhDaG9pY2VzOiBudW1iZXIgPSAxO1xuXG4gIEB3YXRjaCgnZGlzYWJsZWQnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIF9oYW5kbGVEaXNhYmxlZENoYW5nZSA9IChfOiBib29sZWFuLCBkaXNhYmxlZDogYm9vbGVhbikgPT5cbiAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNoID0+IChjaC5kaXNhYmxlZCA9IGRpc2FibGVkKSk7XG5cbiAgQHdhdGNoKCdyZWFkb25seScsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgX2hhbmRsZVJlYWRvbmx5Q2hhbmdlID0gKF86IGJvb2xlYW4sIHJlYWRvbmx5OiBib29sZWFuKSA9PlxuICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2ggPT4gKGNoLnJlYWRvbmx5ID0gcmVhZG9ubHkpKTtcblxuICBAd2F0Y2goJ21heENob2ljZXMnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIF9oYW5kbGVNYXhDaG9pY2VzQ2hhbmdlID0gKCkgPT4gdGhpcy5fZGV0ZXJtaW5lSW5wdXRUeXBlKCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1jaG9pY2UnLCB0aGlzLl9yZWdpc3RlckNob2ljZUVsZW1lbnQpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLWxvb3NlLWNob2ljZScsIHRoaXMuX2xvb3NlQ2hvaWNlRWxlbWVudCk7XG4gIH1cblxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBuclNlbGVjdGVkID0gdGhpcy5fY2hvaWNlRWxlbWVudHMucmVkdWNlKChhY2MsIHZhbCkgPT4ge1xuICAgICAgcmV0dXJuIGFjYyArICh2YWwuY2hlY2tlZCA/IDEgOiAwKTtcbiAgICB9LCAwKTtcbiAgICByZXR1cm4gbnJTZWxlY3RlZCA+PSB0aGlzLm1pbkNob2ljZXM7XG4gIH1cblxuICBzZXQgcmVzcG9uc2UocmVzcG9uc2VWYWx1ZTogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICBjb25zdCByZXNwb25zZVZhbHVlQXJyYXkgPSBBcnJheS5pc0FycmF5KHJlc3BvbnNlVmFsdWUpID8gcmVzcG9uc2VWYWx1ZSA6IFtyZXNwb25zZVZhbHVlXTtcbiAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNlID0+IHtcbiAgICAgIGNlLmNoZWNrZWQgPSByZXNwb25zZVZhbHVlQXJyYXkuZmluZChydiA9PiBydiA9PT0gY2UuaWRlbnRpZmllcikgPyB0cnVlIDogZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICBzZXQgY29ycmVjdFJlc3BvbnNlKHJlc3BvbnNlVmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgcmVzcG9uc2VWYWx1ZUFycmF5ID0gQXJyYXkuaXNBcnJheShyZXNwb25zZVZhbHVlKSA/IHJlc3BvbnNlVmFsdWUgOiBbcmVzcG9uc2VWYWx1ZV07XG4gICAgaWYgKHJlc3BvbnNlVmFsdWUgPT0gJycpIHtcbiAgICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2UgPT4ge1xuICAgICAgICBjZS5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtY29ycmVjdC1yZXNwb25zZScpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2UgPT4ge1xuICAgICAgY2Uuc2V0QXR0cmlidXRlKCdkYXRhLWNvcnJlY3QtcmVzcG9uc2UnLCByZXNwb25zZVZhbHVlQXJyYXkuZmluZChydiA9PiBydiA9PT0gY2UuaWRlbnRpZmllcikgPyAndHJ1ZScgOiAnZmFsc2UnKTtcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktY2hvaWNlLWVsZW1lbnQtc2VsZWN0ZWQnLCB0aGlzLl9jaG9pY2VFbGVtZW50U2VsZWN0ZWRIYW5kbGVyKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdxdGktY2hvaWNlLWVsZW1lbnQtc2VsZWN0ZWQnLCB0aGlzLl9jaG9pY2VFbGVtZW50U2VsZWN0ZWRIYW5kbGVyKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1jaG9pY2UnLCB0aGlzLl9yZWdpc3RlckNob2ljZUVsZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJDaG9pY2VFbGVtZW50KGU6IEN1c3RvbUV2ZW50KSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBjaG9pY2VFbGVtZW50ID0gZS50YXJnZXQgYXMgUXRpQ2hvaWNlO1xuICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLnB1c2goY2hvaWNlRWxlbWVudCk7XG4gICAgdGhpcy5fc2V0SW5wdXRUeXBlKGNob2ljZUVsZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbG9vc2VDaG9pY2VFbGVtZW50KGU6IEN1c3RvbUV2ZW50KSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBjaG9pY2VFbGVtZW50ID0gZS50YXJnZXQgYXMgUXRpQ2hvaWNlO1xuICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLnB1c2goY2hvaWNlRWxlbWVudCk7XG4gICAgdGhpcy5fY2hvaWNlRWxlbWVudHMgPSB0aGlzLl9jaG9pY2VFbGVtZW50cy5maWx0ZXIoY2ggPT4gY2ggIT09IGNob2ljZUVsZW1lbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGV0ZXJtaW5lSW5wdXRUeXBlKCkge1xuICAgIHRoaXMuX2Nob2ljZUVsZW1lbnRzLmZvckVhY2goY2hvaWNlRWxlbWVudCA9PiB7XG4gICAgICB0aGlzLl9zZXRJbnB1dFR5cGUoY2hvaWNlRWxlbWVudCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9zZXRJbnB1dFR5cGUoY2hvaWNlRWxlbWVudDogUXRpQ2hvaWNlKSB7XG4gICAgaWYgKHRoaXMubWF4Q2hvaWNlcyA9PT0gMSkge1xuICAgICAgLy8gaWYgemVybyB0aGVuIHlvdSBjYW4gY2hvb3NlIGhvdyBtdWNoIHlvdSB3YW50XG4gICAgICBjaG9pY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsICdyYWRpbycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaG9pY2VFbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsICdjaGVja2JveCcpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBfY2hvaWNlRWxlbWVudFNlbGVjdGVkSGFuZGxlcihldmVudDogQ3VzdG9tRXZlbnQ8eyBpZGVudGlmaWVyOiBzdHJpbmc7IGNoZWNrZWQ6IGJvb2xlYW4gfT4pIHtcbiAgICBpZiAodGhpcy5tYXhDaG9pY2VzID09PSAxKSB7XG4gICAgICB0aGlzLl9jaG9pY2VFbGVtZW50c1xuICAgICAgICAuZmlsdGVyKGNlID0+IGNlLmlkZW50aWZpZXIgIT09IGV2ZW50LmRldGFpbC5pZGVudGlmaWVyKVxuICAgICAgICAuZm9yRWFjaChjZSA9PiB7XG4gICAgICAgICAgY2UuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5fY2hvaWNlRWxlbWVudFNlbGVjdGVkKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2Nob2ljZUVsZW1lbnRTZWxlY3RlZCgpIHtcbiAgICBjb25zdCBzZWxlY3RlZElkZW50aWZpZXJzID0gdGhpcy5fY2hvaWNlRWxlbWVudHMuZmlsdGVyKGNlID0+IGNlLmNoZWNrZWQpLm1hcChjZSA9PiBjZS5pZGVudGlmaWVyKTtcblxuICAgIGlmICh0aGlzLm1heENob2ljZXMgPiAxKSB7XG4gICAgICBpZiAodGhpcy5tYXhDaG9pY2VzID09PSBzZWxlY3RlZElkZW50aWZpZXJzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNlID0+IChjZS5kaXNhYmxlZCA9ICFjZS5jaGVja2VkKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9jaG9pY2VFbGVtZW50cy5mb3JFYWNoKGNlID0+IChjZS5kaXNhYmxlZCA9IGZhbHNlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdDogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgaWYgKHRoaXMubWF4Q2hvaWNlcyA9PT0gMSkge1xuICAgICAgcmVzdWx0ID0gc2VsZWN0ZWRJZGVudGlmaWVycy5sZW5ndGggPiAwID8gc2VsZWN0ZWRJZGVudGlmaWVyc1swXSA6IHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gc2VsZWN0ZWRJZGVudGlmaWVycztcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXJndW1lbnRcbiAgICB0aGlzLnNhdmVSZXNwb25zZShyZXN1bHQpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IHVuc2FmZUhUTUwgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuaW50ZXJmYWNlIE9wdGlvblR5cGUge1xuICB0ZXh0Q29udGVudDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBzZWxlY3RlZDogYm9vbGVhbjtcbn1cblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1pbmxpbmUtY2hvaWNlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlJbmxpbmVDaG9pY2VJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgcHVibGljIHN0YXRpYyBpbnB1dFdpZHRoQ2xhc3MgPSBbXG4gICAgJycsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC0yJyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTEnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtMycsXG4gICAgJ3F0aS1pbnB1dC13aWR0aC00JyxcbiAgICAncXRpLWlucHV0LXdpZHRoLTYnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtMTAnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtMTUnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtMjAnLFxuICAgICdxdGktaW5wdXQtd2lkdGgtNzInXG4gIF07XG5cbiAgQHN0YXRlKCkgb3B0aW9uczogT3B0aW9uVHlwZVtdID0gW107XG5cbiAgQHN0YXRlKCkgY29ycmVjdE9wdGlvbjogc3RyaW5nID0gJyc7XG5cbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiAnZGF0YS1wcm9tcHQnLCB0eXBlOiBTdHJpbmcgfSlcbiAgZGF0YVByb21wdDogc3RyaW5nID0gJ3NlbGVjdCc7XG5cbiAgc3RhdGljIG92ZXJyaWRlIGdldCBzdHlsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGNzc2BcbiAgICAgICAgOmhvc3Qge1xuICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgfVxuICAgICAgYFxuICAgIF07XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgXG4gICAgICA8c2VsZWN0IHBhcnQ9XCJzZWxlY3RcIiBAY2hhbmdlPVwiJHt0aGlzLmNob2ljZVNlbGVjdGVkfVwiID9kaXNhYmxlZD1cIiR7dGhpcy5kaXNhYmxlZH1cIiA/cmVhZG9ubHk9XCIke3RoaXMucmVhZG9ubHl9XCI+XG4gICAgICAgICR7dGhpcy5vcHRpb25zLm1hcChcbiAgICAgICAgICBvcHRpb24gPT4gaHRtbGBcbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIke29wdGlvbi52YWx1ZX1cIiA/c2VsZWN0ZWQ9XCIke29wdGlvbi5zZWxlY3RlZH1cIj4ke3Vuc2FmZUhUTUwob3B0aW9uLnRleHRDb250ZW50KX08L29wdGlvbj5cbiAgICAgICAgICBgXG4gICAgICAgICl9XG4gICAgICA8L3NlbGVjdD5cblxuICAgICAgJHt1bnNhZmVIVE1MKHRoaXMuY29ycmVjdE9wdGlvbil9XG4gICAgYDtcbiAgfVxuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdvbi1kcm9wZG93bi1zZWxlY3RlZCcsIHRoaXMuY2hvaWNlU2VsZWN0ZWQpO1xuICAgIGNvbnN0IGNob2ljZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLWlubGluZS1jaG9pY2UnKSk7XG4gICAgdGhpcy5vcHRpb25zID0gW1xuICAgICAge1xuICAgICAgICB0ZXh0Q29udGVudDogdGhpcy5kYXRhUHJvbXB0LFxuICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgIHNlbGVjdGVkOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIC4uLmNob2ljZXMubWFwKGNob2ljZSA9PiAoe1xuICAgICAgICB0ZXh0Q29udGVudDogY2hvaWNlLmlubmVySFRNTCxcbiAgICAgICAgdmFsdWU6IGNob2ljZS5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSxcbiAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlXG4gICAgICB9KSlcbiAgICBdO1xuICB9XG5cbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdvbi1kcm9wZG93bi1zZWxlY3RlZCcsIHRoaXMuY2hvaWNlU2VsZWN0ZWQpO1xuICB9XG5cbiAgcHVibGljIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbmQob3B0aW9uID0+IG9wdGlvbi5zZWxlY3RlZCk7XG4gICAgcmV0dXJuIHNlbGVjdGVkT3B0aW9uID8gc2VsZWN0ZWRPcHRpb24udmFsdWUgIT09ICcnIDogZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKSB7XG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5vcHRpb25zLm1hcCgob3B0aW9uLCBpKSA9PiAoeyAuLi5vcHRpb24sIHNlbGVjdGVkOiBpID09PSAwIH0pKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgcmVzcG9uc2UodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMub3B0aW9ucyA9IHRoaXMub3B0aW9ucy5tYXAob3B0aW9uID0+IHtcbiAgICAgIHZhbHVlID09PSBvcHRpb24udmFsdWUgJiYgKG9wdGlvbi5zZWxlY3RlZCA9IHRydWUpO1xuICAgICAgcmV0dXJuIG9wdGlvbjtcbiAgICB9KTtcbiAgfVxuXG4gIHNldCBjb3JyZWN0UmVzcG9uc2UodmFsdWU6IFJlYWRvbmx5PHN0cmluZyB8IHN0cmluZ1tdPikge1xuICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgIHRoaXMuY29ycmVjdE9wdGlvbiA9ICcnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNvcnJlY3RPcHRpb24gPSBgPHNwYW4gcGFydD1cImNvcnJlY3Qtb3B0aW9uXCI+JHtcbiAgICAgIHRoaXMub3B0aW9ucy5maW5kKG9wdGlvbiA9PiB2YWx1ZSA9PT0gb3B0aW9uLnZhbHVlKS50ZXh0Q29udGVudFxuICAgIH08L3NwYW4+YDtcbiAgfVxuXG4gIHB1YmxpYyBjaG9pY2VTZWxlY3RlZChldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBzZWxlY3RlZE9wdGlvblZhbHVlID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MU2VsZWN0RWxlbWVudCkudmFsdWU7XG4gICAgdGhpcy5vcHRpb25zID0gdGhpcy5vcHRpb25zLm1hcChvcHRpb24gPT4gKHsgLi4ub3B0aW9uLCBzZWxlY3RlZDogb3B0aW9uLnZhbHVlID09PSBzZWxlY3RlZE9wdGlvblZhbHVlIH0pKTtcbiAgICB0aGlzLnNhdmVSZXNwb25zZShzZWxlY3RlZE9wdGlvblZhbHVlKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktaW5saW5lLWNob2ljZS1pbnRlcmFjdGlvbic6IFF0aUlubGluZUNob2ljZUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCBzdHlsZXMgZnJvbSAnLi9xdGktY2hvaWNlLWludGVyYWN0aW9uLnN0eWxlcyc7XG5pbXBvcnQgdHlwZSB7IENTU1Jlc3VsdEdyb3VwIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IENob2ljZXMgfSBmcm9tICcuLi9pbnRlcm5hbC9jaG9pY2VzL2Nob2ljZXMnO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFRoZSBDaG9pY2VJbnRlcmFjdGlvbi5UeXBlIChxdGktY2hvaWNlLWludGVyYWN0aW9uKSBpbnRlcmFjdGlvbiBwcmVzZW50cyBhIGNvbGxlY3Rpb24gb2YgY2hvaWNlcyB0byB0aGUgY2FuZGlkYXRlLlxuICogQGRvY3VtZW50YXRpb24gaHR0cHM6Ly93d3cuaW1zZ2xvYmFsLm9yZy9zcGVjL3F0aS92M3AwL2ltcGwjaC5qOW51MW9hMXR1M2JcbiAqIEBzdGF0dXMgc3RhYmxlXG4gKiBAc2luY2UgNi4wXG4gKlxuICogQGV2ZW50IHF0aS1yZWdpc3Rlci1pbnRlcmFjdGlvbiAtIGVtaXR0ZWQgd2hlbiB0aGUgaW50ZXJhY3Rpb24gd2FudHMgdG8gcmVnaXN0ZXIgaXRzZWxmXG4gKiBAZXZlbnQgcXRpLWludGVyYWN0aW9uLXJlc3BvbnNlIC0gZW1pdHRlZCB3aGVuIHRoZSBpbnRlcmFjdGlvbiBjaGFuZ2VzXG4gKlxuICogQHNsb3QgLSBUaGUgZGVmYXVsdCBzbG90IHdoZXJlIDxxdGktc2ltcGxlLWNob2ljZT4gbXVzdCBiZSBwbGFjZWQuXG4gKiBAc2xvdCBwcm9tcHQgLSBzbG90IHdoZXJlIHRoZSBwcm9tcHQgaXMgcGxhY2VkLlxuICovXG5cbkBjdXN0b21FbGVtZW50KCdxdGktY2hvaWNlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlDaG9pY2VJbnRlcmFjdGlvbiBleHRlbmRzIENob2ljZXMge1xuICBzdGF0aWMgc3R5bGVzOiBDU1NSZXN1bHRHcm91cCA9IHN0eWxlcztcblxuICAvKiogb3JpZW50YXRpb24gb2YgY2hvaWNlcyAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHVibGljIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD48c2xvdCBwYXJ0PVwic2xvdFwiPjwvc2xvdD5gO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24nOiBRdGlDaG9pY2VJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcyB9IGZyb20gJ2xpdCc7XG4vLyBpbXBvcnQgY29tcG9uZW50U3R5bGVzIGZyb20gJy4uLy4uL3V0aWxpdGllcy9zdHlsZXMvY29tcG9uZW50LnN0eWxlcyc7XG5cbi8qICR7Y29tcG9uZW50U3R5bGVzfSAqL1xuZXhwb3J0IGRlZmF1bHQgY3NzYFxuICA6aG9zdCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIC8vIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICB9XG5gO1xuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpUnVsZSwgUXRpUnVsZUJhc2UgfSBmcm9tICcuLic7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktb3V0Y29tZS1wcm9jZXNzaW5nJylcbmV4cG9ydCBjbGFzcyBRdGlPdXRjb21lUHJvY2Vzc2luZyBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3MoKSB7XG4gICAgY29uc3QgbG9naWMgPSBuZXcgUXRpT3V0Y29tZVByb2Nlc3NpbmdQcm9jZXNzb3IoKTtcbiAgICBjb25zdCBydWxlcyA9IFsuLi50aGlzLmNoaWxkcmVuXSBhcyBRdGlSdWxlW107XG4gICAgbG9naWMucHJvY2VzcyhydWxlcyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW91dGNvbWUtcHJvY2Vzc2luZyc6IFF0aU91dGNvbWVQcm9jZXNzaW5nO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdGlPdXRjb21lUHJvY2Vzc2luZ1Byb2Nlc3NvciB7XG4gIHB1YmxpYyBwcm9jZXNzKHJ1bGVzOiBRdGlSdWxlQmFzZVtdKSB7XG4gICAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgICBydWxlLnByb2Nlc3MoKTtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwsIExpdEVsZW1lbnQsIFByb3BlcnR5VmFsdWVNYXAgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuaW1wb3J0IHsgbWFwUmVzcG9uc2UsIG1hcFJlc3BvbnNlUG9pbnQsIG1hdGNoQ29ycmVjdCB9IGZyb20gJy4uLy4uL2ludGVybmFsL3RlbXBsYXRlLXN0cmluZ3MnO1xuaW1wb3J0IHsgdHlwZSBRdGlSdWxlIH0gZnJvbSAnLi4vcXRpLXJ1bGUvcXRpLXJ1bGUnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnKVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUXRpUmVzcG9uc2VQcm9jZXNzaW5nIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgcHJvY2VzcygpIHtcbiAgICBjb25zdCBydWxlcyA9IFsuLi50aGlzLmNoaWxkcmVuXSBhcyBRdGlSdWxlW107XG5cbiAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXMpIHtcbiAgICAgIHJ1bGUucHJvY2VzcygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBmaXJzdFVwZGF0ZWQoX2NoYW5nZWRQcm9wZXJ0aWVzOiBQcm9wZXJ0eVZhbHVlTWFwPGFueT4gfCBNYXA8UHJvcGVydHlLZXksIHVua25vd24+KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZ2V0QXR0cmlidXRlKCd0ZW1wbGF0ZScpKSB7XG4gICAgICBjb25zdCBzcGxpdHRlZFRlbXBsYXRlTmFtZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCd0ZW1wbGF0ZScpIS5zcGxpdCgnLycpO1xuICAgICAgY29uc3QgdGVtcGxhdGVOYW1lID0gc3BsaXR0ZWRUZW1wbGF0ZU5hbWVbc3BsaXR0ZWRUZW1wbGF0ZU5hbWUubGVuZ3RoIC0gMV0ucmVwbGFjZSgnLnhtbCcsICcnKTtcbiAgICAgIHRoaXMuaW5uZXJIVE1MID0gJyc7XG4gICAgICBzd2l0Y2ggKHRlbXBsYXRlTmFtZSkge1xuICAgICAgICBjYXNlICdtYXBfcmVzcG9uc2UnOiB7XG4gICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLmZyYWdtZW50RnJvbVN0cmluZyhtYXBSZXNwb25zZSkuZmlyc3RFbGVtZW50Q2hpbGQuZmlyc3RFbGVtZW50Q2hpbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ21hcF9yZXNwb25zZV9wb2ludCc6IHtcbiAgICAgICAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMuZnJhZ21lbnRGcm9tU3RyaW5nKG1hcFJlc3BvbnNlUG9pbnQpLmZpcnN0RWxlbWVudENoaWxkLmZpcnN0RWxlbWVudENoaWxkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdtYXRjaF9jb3JyZWN0JzpcbiAgICAgICAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMuZnJhZ21lbnRGcm9tU3RyaW5nKG1hdGNoQ29ycmVjdCkuZmlyc3RFbGVtZW50Q2hpbGQuZmlyc3RFbGVtZW50Q2hpbGQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZnJhZ21lbnRGcm9tU3RyaW5nKHN0ckhUTUw6IHN0cmluZykge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChzdHJIVE1MKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktcmVzcG9uc2UtcHJvY2Vzc2luZyc6IFF0aVJlc3BvbnNlUHJvY2Vzc2luZztcbiAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBtYXRjaENvcnJlY3QgPSBgPHF0aS1yZXNwb25zZS1wcm9jZXNzaW5nPlxuICA8cXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbiAgICA8cXRpLXJlc3BvbnNlLWlmPlxuICAgICAgPHF0aS1tYXRjaD5cbiAgICAgICAgPHF0aS12YXJpYWJsZSBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj48L3F0aS12YXJpYWJsZT5cbiAgICAgICAgPHF0aS1jb3JyZWN0IGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPjwvcXRpLWNvcnJlY3Q+XG4gICAgICA8L3F0aS1tYXRjaD5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktYmFzZS12YWx1ZSBiYXNlLXR5cGU9XCJmbG9hdFwiPjE8L3F0aS1iYXNlLXZhbHVlPlxuICAgICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gICAgPC9xdGktcmVzcG9uc2UtaWY+XG4gICAgPHF0aS1yZXNwb25zZS1lbHNlPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1iYXNlLXZhbHVlIGJhc2UtdHlwZT1cImZsb2F0XCI+MDwvcXRpLWJhc2UtdmFsdWU+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1lbHNlPlxuICA8L3F0aS1yZXNwb25zZS1jb25kaXRpb24+XG48L3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nPmA7XG5cbmV4cG9ydCBjb25zdCBtYXBSZXNwb25zZSA9IGA8cXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+XG4gIDxxdGktcmVzcG9uc2UtY29uZGl0aW9uPlxuICAgIDxxdGktcmVzcG9uc2UtaWY+XG4gICAgICA8cXRpLWlzLW51bGw+XG4gICAgICAgIDxxdGktdmFyaWFibGUgaWRlbnRpZmllcj1cIlJFU1BPTlNFXCI+PC9xdGktdmFyaWFibGU+XG4gICAgICA8L3F0aS1pcy1udWxsPlxuICAgICAgPHF0aS1zZXQtb3V0Y29tZS12YWx1ZSBpZGVudGlmaWVyPVwiU0NPUkVcIj5cbiAgICAgICAgPHF0aS1iYXNlLXZhbHVlIGJhc2UtdHlwZT1cImZsb2F0XCI+MC4wPC9xdGktYmFzZS12YWx1ZT5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWlmPlxuICAgIDxxdGktcmVzcG9uc2UtZWxzZT5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktbWFwLXJlc3BvbnNlIGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPiA8L3F0aS1tYXAtcmVzcG9uc2U+XG4gICAgICA8L3F0aS1zZXQtb3V0Y29tZS12YWx1ZT5cbiAgICA8L3F0aS1yZXNwb25zZS1lbHNlPlxuICA8L3F0aS1yZXNwb25zZS1jb25kaXRpb24+XG48L3F0aS1yZXNwb25zZS1wcm9jZXNzaW5nPmA7XG5cbmV4cG9ydCBjb25zdCBtYXBSZXNwb25zZVBvaW50ID0gYDxxdGktcmVzcG9uc2UtcHJvY2Vzc2luZz5cbiAgPHF0aS1yZXNwb25zZS1jb25kaXRpb24+XG4gICAgPHF0aS1yZXNwb25zZS1pZj5cbiAgICAgIDxxdGktaXMtbnVsbD5cbiAgICAgICAgPHF0aS12YXJpYWJsZSBpZGVudGlmaWVyPVwiUkVTUE9OU0VcIj48L3F0aS12YXJpYWJsZT5cbiAgICAgIDwvcXRpLWlzLW51bGw+XG4gICAgICA8cXRpLXNldC1vdXRjb21lLXZhbHVlIGlkZW50aWZpZXI9XCJTQ09SRVwiPlxuICAgICAgICA8cXRpLWJhc2UtdmFsdWUgYmFzZS10eXBlPVwiZmxvYXRcIj4wPC9xdGktYmFzZS12YWx1ZT5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWlmPlxuICAgIDxxdGktcmVzcG9uc2UtZWxzZT5cbiAgICAgIDxxdGktc2V0LW91dGNvbWUtdmFsdWUgaWRlbnRpZmllcj1cIlNDT1JFXCI+XG4gICAgICAgIDxxdGktbWFwLXJlc3BvbnNlLXBvaW50IGlkZW50aWZpZXI9XCJSRVNQT05TRVwiPjwvcXRpLW1hcC1yZXNwb25zZS1wb2ludD5cbiAgICAgIDwvcXRpLXNldC1vdXRjb21lLXZhbHVlPlxuICAgIDwvcXRpLXJlc3BvbnNlLWVsc2U+XG4gIDwvcXRpLXJlc3BvbnNlLWNvbmRpdGlvbj5cbjwvcXRpLXJlc3BvbnNlLXByb2Nlc3Npbmc+YDtcbiIsICJpbXBvcnQgeyBPdXRjb21lVmFyaWFibGUgfSBmcm9tICdAY2l0b2xhYi9xdGktY29tcG9uZW50cy9xdGktY29tcG9uZW50cyc7XG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0IH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdXRpbHMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUgfSBmcm9tICcuLi9xdGktcnVsZSc7XG5cbi8qKlxuICogVGhlIGxvb2t1cE91dGNvbWVWYWx1ZSBydWxlIHNldHMgdGhlIHZhbHVlIG9mIGFuIG91dGNvbWUgdmFyaWFibGUgdG8gdGhlIHZhbHVlIG9idGFpbmVkXG4gKiBieSBsb29raW5nIHVwIHRoZSB2YWx1ZSBvZiB0aGUgYXNzb2NpYXRlZCBleHByZXNzaW9uIGluIHRoZSBsb29rdXBUYWJsZSBhc3NvY2lhdGVkXG4gKiB3aXRoIHRoZSBvdXRjb21lJ3MgZGVjbGFyYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBRdGlMb29rdXBPdXRjb21lVmFsdWUgZXh0ZW5kcyBRdGlSdWxlIHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBnZXQgY2hpbGRFeHByZXNzaW9uKCk6IFF0aUV4cHJlc3Npb248c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQgYXMgUXRpRXhwcmVzc2lvbjxzdHJpbmc+O1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHByb2Nlc3MoKTogbnVtYmVyIHtcbiAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICBjb25zdCBvdXRjb21lVmFyaWFibGUgPSB0aGlzLmNsb3Nlc3QoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKS5nZXRWYXJpYWJsZShpZGVudGlmaWVyKSBhcyBPdXRjb21lVmFyaWFibGU7XG4gICAgbGV0IHZhbHVlO1xuICAgIGlmIChvdXRjb21lVmFyaWFibGUuaW50ZXJwb2xhdGlvblRhYmxlKSB7XG4gICAgICB2YWx1ZSA9IG91dGNvbWVWYXJpYWJsZS5pbnRlcnBvbGF0aW9uVGFibGUuZ2V0KHBhcnNlSW50KHRoaXMuY2hpbGRFeHByZXNzaW9uLmNhbGN1bGF0ZSgpKSk7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ2xvb2t1cE91dGNvbWVWYWx1ZTogdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQ8eyBvdXRjb21lSWRlbnRpZmllcjogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfT4oJ3F0aS1zZXQtb3V0Y29tZS12YWx1ZScsIHtcbiAgICAgICAgYnViYmxlczogdHJ1ZSxcbiAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgIGRldGFpbDoge1xuICAgICAgICAgIG91dGNvbWVJZGVudGlmaWVyOiB0aGlzLmlkZW50aWZpZXIsXG4gICAgICAgICAgdmFsdWU6IGNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0KHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1sb29rdXAtb3V0Y29tZS12YWx1ZScsIFF0aUxvb2t1cE91dGNvbWVWYWx1ZSk7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1sb29rdXAtb3V0Y29tZS12YWx1ZSc6IFF0aUxvb2t1cE91dGNvbWVWYWx1ZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1ydWxlJylcbmV4cG9ydCBjbGFzcyBRdGlSdWxlIGV4dGVuZHMgTGl0RWxlbWVudCBpbXBsZW1lbnRzIFF0aVJ1bGVCYXNlIHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3MoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF0aVJ1bGVCYXNlIHtcbiAgcHJvY2VzcygpOiBhbnk7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ydWxlJzogUXRpUnVsZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUgfSBmcm9tICcuLi9xdGktcnVsZSc7XG5cbmV4cG9ydCBjbGFzcyBRdGlSZXNwb25zZUNvbmRpdGlvbiBleHRlbmRzIFF0aVJ1bGUge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgcHJvY2VzcygpIHtcbiAgICBjb25zdCBicmFuY2hlcyA9IFsuLi50aGlzLmNoaWxkcmVuXSBhcyBRdGlFeHByZXNzaW9uPGFueT5bXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnJhbmNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGJyYW5jaCA9IGJyYW5jaGVzW2ldO1xuXG4gICAgICBpZiAoYnJhbmNoLmNhbGN1bGF0ZSgpKSB7XG4gICAgICAgIChicmFuY2ggYXMgdW5rbm93biBhcyBRdGlSdWxlKS5wcm9jZXNzKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1yZXNwb25zZS1jb25kaXRpb24nLCBRdGlSZXNwb25zZUNvbmRpdGlvbik7XG4iLCAiaW1wb3J0IHsgY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC91dGlscyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uLCBRdGlFeHByZXNzaW9uQmFzZSB9IGZyb20gJy4uLy4uL3F0aS1leHByZXNzaW9uL3F0aS1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aVJ1bGUsIFF0aVJ1bGVCYXNlIH0gZnJvbSAnLi4vcXRpLXJ1bGUnO1xuXG5leHBvcnQgY2xhc3MgUXRpU2V0T3V0Y29tZVZhbHVlIGV4dGVuZHMgUXRpUnVsZSB7XG4gIHB1YmxpYyBvdmVycmlkZSBwcm9jZXNzKCkge1xuICAgIGNvbnN0IG91dGNvbWVJZGVudGlmaWVyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcblxuICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFF0aUV4cHJlc3Npb248c3RyaW5nPjtcblxuICAgIGNvbnN0IHJ1bGUgPSBuZXcgUXRpU2V0T3V0Y29tZVZhbHVlUnVsZShleHByZXNzaW9uKTtcbiAgICBjb25zdCB2YWx1ZSA9IHJ1bGUucHJvY2VzcygpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDx7IG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSB9PigncXRpLXNldC1vdXRjb21lLXZhbHVlJywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgb3V0Y29tZUlkZW50aWZpZXIsXG4gICAgICAgICAgdmFsdWU6IEFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICAgICAgICA/IHZhbHVlLm1hcCgodjogc3RyaW5nKSA9PiBjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCh2KSlcbiAgICAgICAgICAgIDogY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQodmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXRpU2V0T3V0Y29tZVZhbHVlUnVsZTxUPiBpbXBsZW1lbnRzIFF0aVJ1bGVCYXNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBleHByZXNzaW9uOiBRdGlFeHByZXNzaW9uQmFzZTxUPikge31cblxuICBwcm9jZXNzKCk6IGFueSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmV4cHJlc3Npb24gPyB0aGlzLmV4cHJlc3Npb24uY2FsY3VsYXRlKCkgOiBudWxsO1xuXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2Fybignc2V0T3V0Y29tZVZhbHVlOiB2YWx1ZSBpcyBudWxsIG9yIHVuZGVmaW5lZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktc2V0LW91dGNvbWUtdmFsdWUnLCBRdGlTZXRPdXRjb21lVmFsdWUpO1xuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgUXRpUnVsZSB9IGZyb20gJy4uL3F0aS1ydWxlL3F0aS1ydWxlJztcblxuZXhwb3J0IGNsYXNzIFF0aVJlc3BvbnNlRWxzZSBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3ViUnVsZXMoKTogUXRpUnVsZVtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuY2hpbGRyZW5dIGFzIFF0aVJ1bGVbXTtcbiAgfVxuXG4gIHB1YmxpYyBwcm9jZXNzKCkge1xuICAgIGNvbnN0IHN1YlJ1bGVzID0gdGhpcy5nZXRTdWJSdWxlcygpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViUnVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHN1YlJ1bGUgPSBzdWJSdWxlc1tpXTtcbiAgICAgIHN1YlJ1bGUucHJvY2VzcygpO1xuICAgIH1cbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1yZXNwb25zZS1lbHNlJywgUXRpUmVzcG9uc2VFbHNlKTtcbiIsICJpbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IFF0aVJlc3BvbnNlSWYgfSBmcm9tICcuLi9xdGktcmVzcG9uc2UtaWYnO1xuXG5leHBvcnQgY2xhc3MgUXRpUmVzcG9uc2VFbHNlSWYgZXh0ZW5kcyBRdGlSZXNwb25zZUlmIHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCR7c3VwZXIucmVuZGVyKCl9YDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1yZXNwb25zZS1lbHNlLWlmJywgUXRpUmVzcG9uc2VFbHNlSWYpO1xuIiwgImltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi8uLi9xdGktZXhwcmVzc2lvbi9xdGktZXhwcmVzc2lvbic7XG5pbXBvcnQgeyBRdGlSdWxlIH0gZnJvbSAnLi4vLi4vcXRpLXJ1bGUvcXRpLXJ1bGUnO1xuaW1wb3J0IHsgUXRpUmVzcG9uc2VFbHNlIH0gZnJvbSAnLi4vcXRpLXJlc3BvbnNlLWVsc2UnO1xuXG5leHBvcnQgY2xhc3MgUXRpUmVzcG9uc2VJZiBleHRlbmRzIFF0aVJlc3BvbnNlRWxzZSB7XG4gIHB1YmxpYyBvdmVycmlkZSBjYWxjdWxhdGUoKSB7XG4gICAgY29uc3QgZXhwcmVzc2lvbiA9IHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQgYXMgUXRpRXhwcmVzc2lvbjxib29sZWFuPjtcbiAgICBjb25zdCByZXN1bHQgPSBleHByZXNzaW9uLmNhbGN1bGF0ZSgpIGFzIGJvb2xlYW47XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRTdWJSdWxlcygpOiBRdGlSdWxlW10ge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdWx0LnB1c2godGhpcy5jaGlsZHJlbltpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktcmVzcG9uc2UtaWYnLCBRdGlSZXNwb25zZUlmKTtcbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50LCBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlLCBWYXJpYWJsZURlY2xhcmF0aW9uIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUFzc2Vzc21lbnRJdGVtIH0gZnJvbSAnLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtJztcbmltcG9ydCB7IFF0aU11bHRpcGxlIH0gZnJvbSAnLi9xdGktbXVsdGlwbGUvcXRpLW11bHRpcGxlJztcblxuZXhwb3J0IGludGVyZmFjZSBRdGlFeHByZXNzaW9uQmFzZTxUPiB7XG4gIC8vIGdldCBhc3Nlc3NtZW50SXRlbSgpOiBRdGlBc3Nlc3NtZW50SXRlbTtcblxuICAvLyBnZXRWYXJpYWJsZXMoKTogVmFyaWFibGVEZWNsYXJhdGlvbjxudW1iZXIgfCBzdHJpbmcgfCAobnVtYmVyIHwgc3RyaW5nKVtdIHwgbnVsbD5bXTtcbiAgY2FsY3VsYXRlKCk6IFJlYWRvbmx5PFQ+O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUXRpRXhwcmVzc2lvbjxUPiBleHRlbmRzIExpdEVsZW1lbnQgaW1wbGVtZW50cyBRdGlFeHByZXNzaW9uQmFzZTxUPiB7XG4gIEBzdGF0ZSgpXG4gIHByb3RlY3RlZCByZXN1bHQ6IGFueTtcblxuICAvLyBoaWRlIHRoZSBzbG90IHdpdGggY3NzXG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgc2xvdCB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHByZT4ke0pTT04uc3RyaW5naWZ5KHRoaXMucmVzdWx0LCBudWxsLCAyKX08L3ByZT5cbiAgICAgIDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpOiBSZWFkb25seTxUPiB7XG4gICAgdGhpcy5yZXN1bHQgPSB0aGlzLmdldFJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzLnJlc3VsdDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRSZXN1bHQoKTogUmVhZG9ubHk8VD4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICBnZXQgYXNzZXNzbWVudEl0ZW0oKTogUXRpQXNzZXNzbWVudEl0ZW0ge1xuICAgIHJldHVybiB0aGlzLmNsb3Nlc3QoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKSBhcyBRdGlBc3Nlc3NtZW50SXRlbTtcbiAgfVxuXG4gIGdldFZhcmlhYmxlcyA9ICgpOiBWYXJpYWJsZURlY2xhcmF0aW9uPG51bWJlciB8IHN0cmluZyB8IChudW1iZXIgfCBzdHJpbmcpW10gfCBudWxsPltdID0+XG4gICAgLy8gRklYTUU6IGlmIHRoaXMgaXRzZWxmIGlzIG11bHRpcGxlLCB0aGlzIHdpbGwgbmV2ZXIgZW50ZXIgdGhlIHF0aS1tdWx0aXBsZSBzd2l0Y2hcbiAgICAvLyBTZWUgdGhpcyBleGFtcGxlIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS8xRWRUZWNoL3F0aS1leGFtcGxlcy9ibG9iL21hc3Rlci9xdGl2My1leGFtcGxlcy9wYWNrYWdpbmcvaXRlbXMvRXhhbXBsZTA1LWZlZWRiYWNrQmxvY2stYWRhcHRpdmUueG1sXG5cbiAgICBBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4pXG4gICAgICAubWFwKChlOiBFbGVtZW50KSA9PiB7XG4gICAgICAgIHN3aXRjaCAoZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICBjYXNlICdxdGktYmFzZS12YWx1ZSc6IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGJhc2VUeXBlOiBlLmdldEF0dHJpYnV0ZSgnYmFzZS10eXBlJyksXG4gICAgICAgICAgICAgIHZhbHVlOiBlLnRleHRDb250ZW50LFxuICAgICAgICAgICAgICBjYXJkaW5hbGl0eTogJ3NpbmdsZSdcbiAgICAgICAgICAgIH0gYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAncXRpLXZhcmlhYmxlJzoge1xuICAgICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IGUuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgfHwgJyc7XG4gICAgICAgICAgICBjb25zdCB2YXJpYWJsZSA9IHRoaXMuYXNzZXNzbWVudEl0ZW0uZ2V0VmFyaWFibGUoaWRlbnRpZmllcik7XG4gICAgICAgICAgICByZXR1cm4gdmFyaWFibGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3F0aS1tdWx0aXBsZSc6IHtcbiAgICAgICAgICAgIGNvbnN0IG11bHRpcGxlID0gZSBhcyBRdGlNdWx0aXBsZTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IG11bHRpcGxlLmdldFJlc3VsdCgpO1xuICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaWRlbnRpZmllcjogJycsXG4gICAgICAgICAgICAgICAgYmFzZVR5cGU6IHZhbHVlc1swXS5iYXNlVHlwZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVzLm1hcCh2ID0+IHYudmFsdWUpLFxuICAgICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiAnbXVsdGlwbGUnLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdyZXNwb25zZSdcbiAgICAgICAgICAgICAgfSBhcyBSZXNwb25zZVZhcmlhYmxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3F0aS1jb3JyZWN0Jzoge1xuICAgICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IGUuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgfHwgJyc7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZVZhcmlhYmxlID0gdGhpcy5hc3Nlc3NtZW50SXRlbS5nZXRSZXNwb25zZShpZGVudGlmaWVyKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGJhc2VUeXBlOiByZXNwb25zZVZhcmlhYmxlLmJhc2VUeXBlLFxuICAgICAgICAgICAgICB2YWx1ZTogcmVzcG9uc2VWYXJpYWJsZS5jb3JyZWN0UmVzcG9uc2UsXG4gICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiByZXNwb25zZVZhcmlhYmxlLmNhcmRpbmFsaXR5XG4gICAgICAgICAgICB9IGFzIFJlc3BvbnNlVmFyaWFibGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIC8vIGFkZGVkIGZvciB1c2Ugb2YgcXRpLWVxdWFsLXJvdW5kZWRcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSBlIGFzIFF0aUV4cHJlc3Npb248bnVtYmVyPjtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBleHByZXNzaW9uLmdldFJlc3VsdCgpO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGJhc2VUeXBlOiAnaW50ZWdlcicsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgY2FyZGluYWxpdHk6ICdzaW5nbGUnXG4gICAgICAgICAgICAgIH0gYXMgUmVzcG9uc2VWYXJpYWJsZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybignZGVmYXVsdCBub3Qgc3VmZmljaWVudCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZpbHRlcih2ID0+IHYgIT09IG51bGwpO1xufVxuIiwgImltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgcHVibGljIGNhbGN1bGF0ZSgpOiBSZWFkb25seTxib29sZWFuPiB7XG4gICAgdGhpcy5yZXN1bHQgPSB0aGlzLmdldFJlc3VsdCgpO1xuICAgIHJldHVybiB0aGlzLnJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSZXN1bHQoKTogUmVhZG9ubHk8Ym9vbGVhbj4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBRdGlDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbnR5cGUgQ29uc3RydWN0b3I8VD4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuZXhwb3J0IGNsYXNzIFF0aUFuZCBleHRlbmRzIHF0aUFuZE1peGluKFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxRdGlDb25kaXRpb25FeHByZXNzaW9uPikge1xuICBwdWJsaWMgY2FsY3VsYXRlKCkge1xuICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZUNoaWxkcmVuKEFycmF5LmZyb20odGhpcy5jaGlsZHJlbiBhcyB1bmtub3duIGFzIFF0aUV4cHJlc3Npb248YW55PltdKSk7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgTW9ja1F0aUV4cHJlc3Npb248VD4gPSB7IGNhbGN1bGF0ZTogKCkgPT4gVCB9O1xudHlwZSBNb2NrQ29uc3RydWN0b3IgPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiB7fTtcbmV4cG9ydCBmdW5jdGlvbiBxdGlBbmRNaXhpbjxUQmFzZSBleHRlbmRzIE1vY2tDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgcmV0dXJuIGNsYXNzIE1vY2tRdGlBbmQgZXh0ZW5kcyBCYXNlIHtcbiAgICBwdWJsaWMgY2FsY3VsYXRlQ2hpbGRyZW4oY2hpbGRyZW46IEFycmF5PE1vY2tRdGlFeHByZXNzaW9uPGFueT4+KSB7XG4gICAgICAvLyBjaGlsZHJlbiBjYW4gYmUgYSBtaXggb2YgcXRpLWV4cHJlc3Npb24gYW5kIHF0aS1jb25kaXRpb24tZXhwcmVzc2lvblxuICAgICAgY29uc3QgdmFsdWVzID0gY2hpbGRyZW4ubWFwKGMgPT4ge1xuICAgICAgICBjb25zdCBjb25kaXRpb24gPSBjIGFzIE1vY2tRdGlFeHByZXNzaW9uPGFueT47XG4gICAgICAgIGlmICghY29uZGl0aW9uLmNhbGN1bGF0ZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFbGVtZW50IGRvZXNuJ3QgaW1wbGVtZW50IFF0aUNvbmRpdGlvbkV4cHJlc3Npb25cIik7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHZhbHVlID0gY29uZGl0aW9uLmNhbGN1bGF0ZSgpIGFzIEJvb2xlYW47XG4gICAgICAgIC8vIGNvbnZlcnQgc3RyaW5nIHZhbHVlIHRvIGJvb2xlYW4gYW5kIHJldHVybiBudWxsIGlmIG5vdCBwb3NzaWJsZVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgdmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCB2YWx1ZSBpbiBxdGktYW5kLCBleHBlY3RlZCBib29sZWFuJyk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdmFsdWVzLmV2ZXJ5KGUgPT4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGUgPT09ICdib29sZWFuJyAmJiBlO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xufVxuIiwgImltcG9ydCB7IFF0aUFuZCB9IGZyb20gJy4vcXRpLWFuZCc7XG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1hbmQnLCBRdGlBbmQpO1xuXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hbmQnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYW5kJzogUXRpQW5kO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBCYXNlVHlwZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0JztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5leHBvcnQgY2xhc3MgUXRpQmFzZVZhbHVlIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxzdHJpbmc+IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdiYXNlLXR5cGUnIH0pIGJhc2VUeXBlOiBCYXNlVHlwZSA9ICdzdHJpbmcnO1xuXG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMudGV4dENvbnRlbnQ7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWJhc2UtdmFsdWUnLCBRdGlCYXNlVmFsdWUpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1jb25kaXRpb24tZXhwcmVzc2lvbic7XG5cbi8vIFBLOiBGb3IgdGhlIGNvbnRhaW5zIHdlIGFzc3VtZSB0aGUgZXhwcmVzc2lvbnMgdG8gY2FsY3VsYXRlIGFyZSBhbGwgZGlyZWN0ZWRQYWlyc1xuLy8gSSBkb24ndCBrbm93IGl0IHRoaXMgaW4gUVRJIGlzIGFsd2F5cyB0aGUgY2FzZSBob3dldmVyP1xuZXhwb3J0IGNsYXNzIFF0aUNvbnRhaW5zIGV4dGVuZHMgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgZm9yIG90aGVyIHR5cGVzIHRoYW4gZGlyZWN0ZWRQYWlyXG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAoXG4gICAgICAgIHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2RpcmVjdGVkUGFpcicgJiZcbiAgICAgICAgdmFsdWUyLmJhc2VUeXBlID09PSAnZGlyZWN0ZWRQYWlyJyAmJlxuICAgICAgICB2YWx1ZTEuY2FyZGluYWxpdHkgPT09ICdtdWx0aXBsZSdcbiAgICAgICkge1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uMSA9IHZhbHVlMS52YWx1ZSBhcyBzdHJpbmdbXTtcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbjIgPSB2YWx1ZTIudmFsdWUgYXMgc3RyaW5nW107XG4gICAgICAgIGNvbnN0IGVudW1lcmFibGUgPSBwcm9qZWN0aW9uMS5maWx0ZXIoeCA9PiBwcm9qZWN0aW9uMi5pbmNsdWRlcyh4KSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZW51bWVyYWJsZS5sZW5ndGggPiAwO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdmFsdWUxLmJhc2VUeXBlID09PSAnZGlyZWN0ZWRQYWlyJyAmJlxuICAgICAgICB2YWx1ZTIuYmFzZVR5cGUgPT09ICdkaXJlY3RlZFBhaXInICYmXG4gICAgICAgIHZhbHVlMS5jYXJkaW5hbGl0eSA9PT0gJ3NpbmdsZSdcbiAgICAgICkge1xuICAgICAgICBjb25zdCBwcm9qZWN0aW9uMSA9IHZhbHVlMS52YWx1ZSBhcyBzdHJpbmc7XG4gICAgICAgIGNvbnN0IHByb2plY3Rpb24yID0gdmFsdWUyLnZhbHVlIGFzIHN0cmluZ1tdO1xuICAgICAgICByZXR1cm4gcHJvamVjdGlvbjIuaW5jbHVkZXMocHJvamVjdGlvbjEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAndW5zdXBwb3J0ZWQgYmFzZVR5cGUgb3IgY2FyZGluYWxpdHkgaW4gcXRpIGNvbnRhaW5zLCBvbmx5IGJhc2VUeXBlOiBkaXJlY3RlZFBhaXIgYW5kIGNhcmRpbmFsaXR5OiBtdWx0aXBsZSBpcyBzdXBwb3J0ZWQnXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aSBjb250YWlucycpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktY29udGFpbnMnLCBRdGlDb250YWlucyk7XG4iLCAiaW1wb3J0IHsgUXRpQXNzZXNzbWVudEl0ZW0gfSBmcm9tICcuLi8uLi8uLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0nO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aUNvcnJlY3QgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPHN0cmluZyB8IHN0cmluZ1tdPiB7XG4gIGdldCBpbnRlcnByZXRhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoJ2ludGVycHJldGF0aW9uJykgfHwgJyc7XG4gIH1cblxuICBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJykgfHwgJyc7XG4gICAgY29uc3QgcmVzcG9uc2VWYXJpYWJsZSA9ICh0aGlzLmNsb3Nlc3QoJ3F0aS1hc3Nlc3NtZW50LWl0ZW0nKSBhcyBRdGlBc3Nlc3NtZW50SXRlbSkuZ2V0UmVzcG9uc2UoaWRlbnRpZmllcik7XG4gICAgcmVzcG9uc2VWYXJpYWJsZS5jb3JyZWN0UmVzcG9uc2U7XG4gICAgaWYgKHJlc3BvbnNlVmFyaWFibGUuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnKSB7XG4gICAgICByZXR1cm4gcmVzcG9uc2VWYXJpYWJsZS5jb3JyZWN0UmVzcG9uc2UubGVuZ3RoID4gMCA/IHJlc3BvbnNlVmFyaWFibGUuY29ycmVjdFJlc3BvbnNlWzBdIDogJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZXNwb25zZVZhcmlhYmxlLmNvcnJlY3RSZXNwb25zZTtcbiAgICB9XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktY29ycmVjdCcsIFF0aUNvcnJlY3QpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpRXF1YWxSb3VuZGVkIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSByb3VuZGluZ01vZGU6ICdkZWNpbWFsUGxhY2VzJyB8ICdzaWduaWZpY2FudEZpZ3VyZXMnID0gJ3NpZ25pZmljYW50RmlndXJlcyc7XG5cbiAgZ2V0IGZpZ3VyZXMoKSB7XG4gICAgY29uc3QgYXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlKCdmaWd1cmVzJyk7XG4gICAgaWYgKCFhdHRyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdmaWd1cmVzIGF0dHJpYnV0ZSBpcyBtaXNzaW5nJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZmlndXJlcyA9IHBhcnNlSW50KHRoaXMuZ2V0QXR0cmlidXRlKCdmaWd1cmVzJykgfHwgJzAnKTtcbiAgICBpZiAoaXNOYU4oZmlndXJlcykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZpZ3VyZXMgYXR0cmlidXRlIGlzIG5vdCBhIG51bWJlcicpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChmaWd1cmVzIDwgMCkge1xuICAgICAgY29uc29sZS5lcnJvcignZmlndXJlcyBhdHRyaWJ1dGUgaXMgbmVnYXRpdmUnKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoZmlndXJlcyA8IDEgJiYgdGhpcy5yb3VuZGluZ01vZGUgPT09ICdzaWduaWZpY2FudEZpZ3VyZXMnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdmaWd1cmVzIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gMSBmb3IgUm91bmRpbmdNb2RlIHNpZ25pZmljYW50RmlndXJlcycpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBmaWd1cmVzO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHRoaXMucm91bmRpbmdNb2RlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZTEuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIHZhbHVlMi5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTEudmFsdWUpIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUyLnZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIGVxdWFsJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAodmFsdWVzWzBdLmJhc2VUeXBlKSB7XG4gICAgICAgIGNhc2UgJ2ludGVnZXInOlxuICAgICAgICBjYXNlICdmbG9hdCc6IHtcbiAgICAgICAgICBjb25zdCBmbG9hdDEgPSBwYXJzZUZsb2F0KHZhbHVlMS52YWx1ZSBhcyBzdHJpbmcpO1xuICAgICAgICAgIGNvbnN0IGZsb2F0MiA9IHBhcnNlRmxvYXQodmFsdWUyLnZhbHVlIGFzIHN0cmluZyk7XG5cbiAgICAgICAgICBpZiAoIWlzTmFOKGZsb2F0MSkgJiYgIWlzTmFOKGZsb2F0MikpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJvdW5kaW5nTW9kZSA9PT0gJ3NpZ25pZmljYW50RmlndXJlcycpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0MS50b1ByZWNpc2lvbih0aGlzLmZpZ3VyZXMpID09PSBmbG9hdDIudG9QcmVjaXNpb24odGhpcy5maWd1cmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgTWF0aC5yb3VuZChmbG9hdDEgKiBNYXRoLnBvdygxMCwgdGhpcy5maWd1cmVzKSkgLyBNYXRoLnBvdygxMCwgdGhpcy5maWd1cmVzKSA9PT1cbiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKGZsb2F0MiAqIE1hdGgucG93KDEwLCB0aGlzLmZpZ3VyZXMpKSAvIE1hdGgucG93KDEwLCB0aGlzLmZpZ3VyZXMpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYHZhbHVlIGNhbm5vdCBiZSBjYXN0ZWQgdG8gbnVtZXJpYyB2YWx1ZSBpbiBlcXVhbFJvdW5kZWQgb3BlcmF0b3I6ICR7ZmxvYXQxfSwgJHtmbG9hdDJ9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGB2YWx1ZXMgb3RoZXIgdGhhbiBmbG9hdCBhbmQgaW50IGNhbm5vdCBiZSB1c2VkIGluIGVxdWFsUm91bmRlZCBvcGVyYXRvci5gKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGktZXF1YWwtcm91bmRlZCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWVxdWFsLXJvdW5kZWQnLCBRdGlFcXVhbFJvdW5kZWQpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBTY29yaW5nSGVscGVyIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL3Njb3JpbmctaGVscGVyJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlFcXVhbCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSkgdG9sZXJhbmNlTW9kZTogJ2V4YWN0JyB8ICdyZWxhdGl2ZScgfCAnYWJzb2x1dGUnID0gJ2V4YWN0JztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodGhpcy50b2xlcmFuY2VNb2RlICE9PSAnZXhhY3QnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3RvbGVyYW5jZU1vZGUgaXMgbm90IHN1cHBvcnRlZCB5ZXQnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZTEuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIHZhbHVlMi5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTEudmFsdWUpIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUyLnZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIGVxdWFsJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXModmFsdWUxLnZhbHVlIGFzIHN0cmluZywgdmFsdWUyLnZhbHVlIGFzIHN0cmluZywgdmFsdWUxLmJhc2VUeXBlKTtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpLWVxdWFsJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktZXF1YWwnLCBRdGlFcXVhbCk7XG4iLCAiaW1wb3J0IHsgQmFzZVR5cGUgfSBmcm9tICcuLi8uLic7XG5cbmV4cG9ydCBjbGFzcyBTY29yaW5nSGVscGVyIHtcbiAgcHVibGljIHN0YXRpYyBjb21wYXJlU2luZ2xlVmFsdWVzKHZhbHVlMTogUmVhZG9ubHk8c3RyaW5nPiwgdmFsdWUyOiBSZWFkb25seTxzdHJpbmc+LCBiYXNlVHlwZTogQmFzZVR5cGUpOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKGJhc2VUeXBlKSB7XG4gICAgICBjYXNlICdpZGVudGlmaWVyJzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIHJldHVybiB2YWx1ZTEgPT09IHZhbHVlMjtcbiAgICAgIGNhc2UgJ2ludGVnZXInOiB7XG4gICAgICAgIGNvbnN0IGludDEgPSBwYXJzZUludCh2YWx1ZTEsIDEwKTtcbiAgICAgICAgY29uc3QgaW50MiA9IHBhcnNlSW50KHZhbHVlMiwgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKGludDEpICYmICFpc05hTihpbnQyKSkge1xuICAgICAgICAgIHJldHVybiBpbnQxID09PSBpbnQyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYENhbm5vdCBjb252ZXJ0ICR7dmFsdWUxfSBhbmQvb3IgJHt2YWx1ZTJ9IHRvIGludC5gKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Zsb2F0Jzoge1xuICAgICAgICBjb25zdCBmbG9hdDEgPSBwYXJzZUZsb2F0KHZhbHVlMSk7XG4gICAgICAgIGNvbnN0IGZsb2F0MiA9IHBhcnNlRmxvYXQodmFsdWUyKTtcbiAgICAgICAgaWYgKCFpc05hTihmbG9hdDEpICYmICFpc05hTihmbG9hdDIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZsb2F0MSA9PT0gZmxvYXQyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGNvdWxkbid0IGNvbnZlcnQgJHt2YWx1ZTF9IGFuZC9vciAke3ZhbHVlMn0gdG8gZmxvYXQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdwYWlyJzpcbiAgICAgIGNhc2UgJ2RpcmVjdGVkUGFpcic6IHtcbiAgICAgICAgY29uc3QgcGFpcjEgPSB2YWx1ZTEuc3BsaXQoJyAnKS5zb3J0KCk7XG4gICAgICAgIGNvbnN0IHBhaXIyID0gdmFsdWUyLnNwbGl0KCcgJykuc29ydCgpO1xuICAgICAgICBpZiAocGFpcjEubGVuZ3RoID09PSAyICYmIHBhaXIyLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIGlmIChiYXNlVHlwZSA9PT0gJ3BhaXInKSB7XG4gICAgICAgICAgICBwYWlyMS5zb3J0KCk7XG4gICAgICAgICAgICBwYWlyMi5zb3J0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBwYWlyMS5qb2luKCcgJykgPT09IHBhaXIyLmpvaW4oJyAnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBjb21wYXJlZCB0d28gcGFpciBidXQgb25lIG9mIHRoZSB2YWx1ZXMgZG9lcyBub3QgaGF2ZSAyIHZhbHVlczogMTogJHt2YWx1ZTF9IDI6ICR7dmFsdWUyfWApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aUd0IGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09IHZhbHVlMi5iYXNlVHlwZSAmJiAodmFsdWUxLmJhc2VUeXBlID09PSAnaW50ZWdlcicgfHwgdmFsdWUxLmJhc2VUeXBlID09PSAnZmxvYXQnKSkge1xuICAgICAgICByZXR1cm4gK3ZhbHVlMS52YWx1ZSA+ICt2YWx1ZTIudmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGJhc2VUeXBlIG9yIGNhcmRpbmFsaXR5IGluIHF0aSBndCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWd0JywgUXRpR3QpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1jb25kaXRpb24tZXhwcmVzc2lvbic7XG5cbi8vIFBLOiBGb3IgdGhlIGNvbnRhaW5zIHdlIGFzc3VtZSB0aGUgZXhwcmVzc2lvbnMgdG8gY2FsY3VsYXRlIGFyZSBhbGwgZGlyZWN0ZWRQYWlyc1xuLy8gSSBkb24ndCBrbm93IGl0IHRoaXMgaW4gUVRJIGlzIGFsd2F5cyB0aGUgY2FzZSBob3dldmVyP1xuZXhwb3J0IGNsYXNzIFF0aUd0ZSBleHRlbmRzIFF0aUNvbmRpdGlvbkV4cHJlc3Npb24ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZTEgPSB2YWx1ZXNbMF07XG4gICAgICBjb25zdCB2YWx1ZTIgPSB2YWx1ZXNbMV07XG4gICAgICBpZiAodmFsdWUxLmJhc2VUeXBlID09PSB2YWx1ZTIuYmFzZVR5cGUgJiYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2ludGVnZXInIHx8IHZhbHVlMS5iYXNlVHlwZSA9PT0gJ2Zsb2F0JykpIHtcbiAgICAgICAgcmV0dXJuICt2YWx1ZTEudmFsdWUgPj0gK3ZhbHVlMi52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgYmFzZVR5cGUgb3IgY2FyZGluYWxpdHkgaW4gcXRpIGd0ZScpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5sb2coJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0ZScpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLWd0ZScsIFF0aUd0ZSk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG4vLyBQSzogRm9yIHRoZSBjb250YWlucyB3ZSBhc3N1bWUgdGhlIGV4cHJlc3Npb25zIHRvIGNhbGN1bGF0ZSBhcmUgYWxsIGRpcmVjdGVkUGFpcnNcbi8vIEkgZG9uJ3Qga25vdyBpdCB0aGlzIGluIFFUSSBpcyBhbHdheXMgdGhlIGNhc2UgaG93ZXZlcj9cbmV4cG9ydCBjbGFzcyBRdGlJc051bGwgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgaWYgKCF2YXJpYWJsZXMpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IHZhcmlhYmxlc1swXS52YWx1ZTtcbiAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gJyc7XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aSBOdWxsJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktaXMtbnVsbCcsIFF0aUlzTnVsbCk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpTHQgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKHZhbHVlMS5iYXNlVHlwZSA9PT0gdmFsdWUyLmJhc2VUeXBlICYmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdpbnRlZ2VyJyB8fCB2YWx1ZTEuYmFzZVR5cGUgPT09ICdmbG9hdCcpKSB7XG4gICAgICAgIHJldHVybiArdmFsdWUxLnZhbHVlIDwgK3ZhbHVlMi52YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgYmFzZVR5cGUgb3IgY2FyZGluYWxpdHkgaW4gcXRpIGx0Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIGx0Jyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbHQnLCBRdGlMdCk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlDb25kaXRpb25FeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uJztcblxuLy8gUEs6IEZvciB0aGUgY29udGFpbnMgd2UgYXNzdW1lIHRoZSBleHByZXNzaW9ucyB0byBjYWxjdWxhdGUgYXJlIGFsbCBkaXJlY3RlZFBhaXJzXG4vLyBJIGRvbid0IGtub3cgaXQgdGhpcyBpbiBRVEkgaXMgYWx3YXlzIHRoZSBjYXNlIGhvd2V2ZXI/XG5leHBvcnQgY2xhc3MgUXRpTHRlIGV4dGVuZHMgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICAgIGNvbnN0IHZhbHVlMSA9IHZhbHVlc1swXTtcbiAgICAgIGNvbnN0IHZhbHVlMiA9IHZhbHVlc1sxXTtcbiAgICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09IHZhbHVlMi5iYXNlVHlwZSAmJiAodmFsdWUxLmJhc2VUeXBlID09PSAnaW50ZWdlcicgfHwgdmFsdWUxLmJhc2VUeXBlID09PSAnZmxvYXQnKSkge1xuICAgICAgICByZXR1cm4gK3ZhbHVlMS52YWx1ZSA8PSArdmFsdWUyLnZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBiYXNlVHlwZSBvciBjYXJkaW5hbGl0eSBpbiBxdGkgbHRlJyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZygndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gbHRlJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbHRlJywgUXRpTHRlKTtcbiIsICJpbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IFNjb3JpbmdIZWxwZXIgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvc2NvcmluZy1oZWxwZXInO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aU1hcFJlc3BvbnNlIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxudW1iZXI+IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IG51bWJlciB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLmFzc2Vzc21lbnRJdGVtLmdldFJlc3BvbnNlKHRoaXMuaWRlbnRpZmllcik7XG4gICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgY29uc29sZS53YXJuKGBSZXNwb25zZSAke3RoaXMuaWRlbnRpZmllcn0gY2FuIG5vdCBiZSBmb3VuZGApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IG1hcHBpbmcgPSByZXNwb25zZS5tYXBwaW5nO1xuICAgIGNvbnN0IGNhbmRpZGF0ZVJlc3BvbnNlcyA9ICFBcnJheS5pc0FycmF5KHJlc3BvbnNlLnZhbHVlKSA/IFtyZXNwb25zZS52YWx1ZV0gOiByZXNwb25zZS52YWx1ZTtcbiAgICBsZXQgcmVzdWx0ID0gMDtcbiAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZVJlc3BvbnNlIG9mIGNhbmRpZGF0ZVJlc3BvbnNlcykge1xuICAgICAgY29uc3QgbWFwcGVkVmFsdWUgPSBtYXBwaW5nLm1hcEVudHJpZXMuZmluZChlbnRyeSA9PiB7XG4gICAgICAgIHJldHVybiBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXMoZW50cnkubWFwS2V5LCBjYW5kaWRhdGVSZXNwb25zZSwgcmVzcG9uc2UuYmFzZVR5cGUpO1xuICAgICAgfSk7XG4gICAgICBpZiAoIShtYXBwZWRWYWx1ZSA9PSBudWxsIHx8IG1hcHBlZFZhbHVlLm1hcHBlZFZhbHVlID09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmVzdWx0ICs9IG1hcHBlZFZhbHVlLm1hcHBlZFZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ICs9IG1hcHBpbmcuZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobWFwcGluZy5sb3dlckJvdW5kICE9IG51bGwpIHtcbiAgICAgIHJlc3VsdCA9IE1hdGgubWF4KG1hcHBpbmcubG93ZXJCb3VuZCwgcmVzdWx0KTtcbiAgICB9XG4gICAgaWYgKG1hcHBpbmcudXBwZXJCb3VuZCAhPSBudWxsKSB7XG4gICAgICByZXN1bHQgPSBNYXRoLm1pbihtYXBwaW5nLnVwcGVyQm91bmQsIHJlc3VsdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbWFwLXJlc3BvbnNlJywgUXRpTWFwUmVzcG9uc2UpO1xuIiwgImltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSBcImxpdC9kZWNvcmF0b3JzLmpzXCI7XG5pbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSBcImxpdFwiO1xuXG5leHBvcnQgY2xhc3MgUXRpTWFwcGluZyBleHRlbmRzIExpdEVsZW1lbnQge1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6IFwiZGVmYXVsdC12YWx1ZVwiLCB0eXBlOiBOdW1iZXIgfSkgZGVmYXVsdFZhbHVlOiBudW1iZXIgPSAwO1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6IFwibG93ZXItYm91bmRcIiwgdHlwZTogTnVtYmVyIH0pIGxvd2VyQm91bmQ6IG51bWJlcjtcbiAgQHByb3BlcnR5KHsgYXR0cmlidXRlOiBcInVwcGVyLWJvdW5kXCIsIHR5cGU6IE51bWJlciB9KSB1cHBlckJvdW5kOiBudW1iZXI7XG5cbiAgXG4gIHB1YmxpYyBnZXQgbWFwRW50cmllcygpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoXCJxdGktbWFwLWVudHJ5XCIpKS5tYXAoKGVsKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYXBLZXk6IGVsLmdldEF0dHJpYnV0ZShcIm1hcC1rZXlcIiksXG4gICAgICAgIG1hcHBlZFZhbHVlOiArZWwuZ2V0QXR0cmlidXRlKFwibWFwcGVkLXZhbHVlXCIpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoXCJxdGktbWFwcGluZ1wiLCBRdGlNYXBwaW5nKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFNjb3JpbmdIZWxwZXIgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvc2NvcmluZy1oZWxwZXInO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aU1hdGNoIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIC8vUEsgOiBGSVhNRS5cbiAgLy8gVGhpcyB3YXMgYSBsaXR0bGUgZXhwZXJpbWVudCBpZiB3ZSBjb3VsZCBjYWxsIHRoZSBtYXRjaCBmdW5jdGlvbiBhcyBhIHN0YXRpYyBmdW5jdGlvbixcbiAgLy8gVGhpcyBjYW4gYmUgdXNlZCBmb3IgYWxsIGtpbmQgb2YgdGhpbmdzLCBidXQgbm93IGVzcGVjaWFsbHkgZm9yIHVzZSBpblxuICAvLyBxdGktcmVzcG9uc2UtY29uZGl0aW9uLXNjcmlwdFxuICAvLyBpbiB3aGljaCB3ZSBwYXNzIHRoZSBleHByZXNzaW9ucyBhcyBwdXJlIGZ1bmN0aW9ucywgYW5kIGhvcGUgZm9yIHRoZSBiZXN0LlxuICAvLyBTQURMWSwgdGhlIGdldFZhcmlhYmxlcyB0aHJvd3Mgcm9ldCBpbiBkZSBldGVuLi4gd2VldCBub2cgbmlldCBwcmVjaWVzIGhvZSBkZXplIHdlcmt0LlxuICAvLyBNYWFyIGlrIGdhIGVyaW4gZHVpa2VuLlxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgICBjb25zdCB2YWx1ZVRvTWFwID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgY29ycmVjdFZhbHVlSW5mbyA9IHZhbHVlc1sxXTtcbiAgICAgIHJldHVybiBRdGlNYXRjaC5tYXRjaCh2YWx1ZVRvTWFwLCBjb3JyZWN0VmFsdWVJbmZvKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBtYXRjaCcpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBtYXRjaCh2YWx1ZVRvTWFwOiBSZXNwb25zZVZhcmlhYmxlLCBjb3JyZWN0VmFsdWVJbmZvOiBSZXNwb25zZVZhcmlhYmxlKSB7XG4gICAgaWYgKGNvcnJlY3RWYWx1ZUluZm8uY2FyZGluYWxpdHkgPT09ICdzaW5nbGUnKSB7XG4gICAgICBpZiAodmFsdWVUb01hcC52YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVUb01hcC52YWx1ZSkgfHwgQXJyYXkuaXNBcnJheShjb3JyZWN0VmFsdWVJbmZvLnZhbHVlKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBtYXRjaCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gU2NvcmluZ0hlbHBlci5jb21wYXJlU2luZ2xlVmFsdWVzKFxuICAgICAgICB2YWx1ZVRvTWFwLnZhbHVlPy50b1N0cmluZygpLFxuICAgICAgICBjb3JyZWN0VmFsdWVJbmZvLnZhbHVlLnRvU3RyaW5nKCksXG4gICAgICAgIGNvcnJlY3RWYWx1ZUluZm8uYmFzZVR5cGVcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZVRvTWFwLnZhbHVlKSB8fCAhQXJyYXkuaXNBcnJheShjb3JyZWN0VmFsdWVJbmZvLnZhbHVlKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBtYXRjaCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBpZiBsZW5ndGggaXMgbm90IGVxdWFsLCBkb24ndCBjaGVjaywgaXQncyBpbmNvcnJlY3QuXG4gICAgICBpZiAodmFsdWVUb01hcC52YWx1ZS5sZW5ndGggIT09IGNvcnJlY3RWYWx1ZUluZm8udmFsdWUubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGxldCBhbnN3ZXJJbmRleCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGNvcnJlY3RBbnN3ZXIgb2YgY29ycmVjdFZhbHVlSW5mby52YWx1ZSkge1xuICAgICAgICBpZiAoY29ycmVjdFZhbHVlSW5mby5jYXJkaW5hbGl0eSA9PT0gJ29yZGVyZWQnKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlVG9NYXAgPSB2YWx1ZVRvTWFwW2Fuc3dlckluZGV4XTtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBTY29yaW5nSGVscGVyLmNvbXBhcmVTaW5nbGVWYWx1ZXMoY29ycmVjdEFuc3dlciwgY3VycmVudFZhbHVlVG9NYXAsIGNvcnJlY3RWYWx1ZUluZm8uYmFzZVR5cGUpO1xuICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHNlcXVlbmNlIGRvZXMgbm90IG1hdHRlciwgZmluZCB2YWx1ZSBzb21ld2hlcmUgaW4gdGhlIGFycmF5XG4gICAgICAgICAgLy8gYW5kIHJlbW92ZSB3aGVuIGZvdW5kLlxuICAgICAgICAgIGxldCBtYXRjaGluZ1ZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgICAgICBjb25zdCBhcnIgPSBbLi4udmFsdWVUb01hcC52YWx1ZV07XG4gICAgICAgICAgZm9yIChjb25zdCBtdiBvZiBhcnIpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFNjb3JpbmdIZWxwZXIuY29tcGFyZVNpbmdsZVZhbHVlcyhjb3JyZWN0QW5zd2VyLCBtdiwgY29ycmVjdFZhbHVlSW5mby5iYXNlVHlwZSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgIG1hdGNoaW5nVmFsdWUgPSBtdjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtYXRjaGluZ1ZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAoYXJyIGFzIHN0cmluZ1tdKS5zcGxpY2UoYXJyLmluZGV4T2YobWF0Y2hpbmdWYWx1ZSksIDEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFuc3dlckluZGV4Kys7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTsgLy8gaWYgZXZlcnl0aGluZyBtYXRjaGVzIGl0J3MgY29ycmVjdDtcbiAgICB9XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktbWF0Y2gnLCBRdGlNYXRjaCk7XG4iLCAiaW1wb3J0IHsgUmVzcG9uc2VWYXJpYWJsZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBRdGlFeHByZXNzaW9uIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpTWVtYmVyIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuIHwgbnVsbD4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuXG4gICAgaWYgKCEodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1RoZSBtZW1iZXIgb3BlcmF0b3IgdGFrZXMgdHdvIHN1Yi1leHByZXNzaW9ucycpO1xuICAgIH1cblxuICAgIGNvbnN0IFt2YWx1ZTEsIHZhbHVlMl0gPSB2YWx1ZXM7XG5cbiAgICBpZiAoISh2YWx1ZTEuYmFzZVR5cGUgPT09IHZhbHVlMi5iYXNlVHlwZSkpIHtcbiAgICAgIGNvbnNvbGUud2FybignV2hpY2ggbXVzdCBib3RoIGhhdmUgdGhlIHNhbWUgYmFzZS10eXBlJyk7XG4gICAgfVxuICAgIGlmICghKHZhbHVlMi5jYXJkaW5hbGl0eSA9PT0gJ211bHRpcGxlJyB8fCB2YWx1ZTIuY2FyZGluYWxpdHkgPT09ICdvcmRlcmVkJykpIHtcbiAgICAgIGNvbnNvbGUud2FybignYW5kIHRoZSBzZWNvbmQgbXVzdCBiZSBhIG11bHRpcGxlIG9yIG9yZGVyZWQgY29udGFpbmVyJyk7XG4gICAgfVxuICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdmbG9hdCcgfHwgdmFsdWUyLmJhc2VUeXBlID09PSAnZmxvYXQnKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1RoZSBtZW1iZXIgb3BlcmF0b3Igc2hvdWxkIG5vdCBiZSB1c2VkIG9uIHN1Yi1leHByZXNzaW9ucyB3aXRoIGEgYmFzZS10eXBlIG9mIGZsb2F0Jyk7XG4gICAgfVxuICAgIGlmICh2YWx1ZTEuYmFzZVR5cGUgPT09ICdkdXJhdGlvbicgfHwgdmFsdWUyLmJhc2VUeXBlID09PSAnZHVyYXRpb24nKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0l0IG11c3Qgbm90IGJlIHVzZWQgb24gc3ViLWV4cHJlc3Npb25zIHdpdGggYSBiYXNlLXR5cGUgb2YgZHVyYXRpb24nKTtcbiAgICB9XG5cbiAgICAvLyBJZiBlaXRoZXIgc3ViLWV4cHJlc3Npb24gaXMgTlVMTCB0aGVuIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdG9yIGlzIE5VTExcbiAgICBpZiAodmFsdWUxLnZhbHVlID09PSBudWxsIHx8IHZhbHVlMi52YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gVGhlIHJlc3VsdCBpcyBhIHNpbmdsZSBib29sZWFuIHdpdGggYSB2YWx1ZSBvZiAndHJ1ZScgaWYgdGhlIHZhbHVlIGdpdmVuIGJ5IHRoZSBmaXJzdCBzdWItZXhwcmVzc2lvbiBpcyBpbiB0aGUgY29udGFpbmVyIGRlZmluZWQgYnkgdGhlIHNlY29uZCBzdWItZXhwcmVzc2lvbi5cbiAgICBjb25zdCBwcm9qZWN0aW9uMSA9IHZhbHVlMS52YWx1ZSBhcyBzdHJpbmc7XG4gICAgY29uc3QgcHJvamVjdGlvbjIgPSB2YWx1ZTIudmFsdWUgYXMgc3RyaW5nW107XG4gICAgcmV0dXJuIHByb2plY3Rpb24yLmluY2x1ZGVzKHByb2plY3Rpb24xKTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1tZW1iZXInLCBRdGlNZW1iZXIpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUsIFZhcmlhYmxlRGVjbGFyYXRpb24gfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcbmV4cG9ydCBjbGFzcyBRdGlNdWx0aXBsZSBleHRlbmRzIFF0aUV4cHJlc3Npb248VmFyaWFibGVEZWNsYXJhdGlvbjxzdHJpbmcgfCBzdHJpbmdbXT5bXT4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCk6IFJlc3BvbnNlVmFyaWFibGVbXSB7XG4gICAgY29uc3QgdmFyaWFibGVzID0gdGhpcy5nZXRWYXJpYWJsZXMoKSBhcyBSZXNwb25zZVZhcmlhYmxlW107XG4gICAgaWYgKHZhcmlhYmxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHF0aSBtdWx0aXBsZScpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFyaWFibGUgb2YgdmFyaWFibGVzKSB7XG4gICAgICBpZiAodmFyaWFibGUuY2FyZGluYWxpdHkgIT09ICdtdWx0aXBsZScgJiYgdmFyaWFibGUuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIG11bHRpcGxlJyk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25zdCB2YWx1ZXMgPSB2YXJpYWJsZXMubWFwKHYgPT4gdi52YWx1ZSk7XG4gICAgLy8gY29uc29sZS5sb2codmFyaWFibGVzKTtcbiAgICAvLyBjb25zdCBmbGF0dGVuZWRBcnJheSA9IHZhbHVlcy5yZWR1Y2UoKGFjYzogc3RyaW5nW10sIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkgPT4ge1xuICAgIC8vICAgcmV0dXJuIGFjYy5jb25jYXQoQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbLi4udmFsdWVdIDogdmFsdWUpO1xuICAgIC8vIH0sIFtdKTtcbiAgICAvLyByZXR1cm4gZmxhdHRlbmVkQXJyYXk7XG5cbiAgICByZXR1cm4gdmFyaWFibGVzO1xuICB9XG59XG5cbmN1c3RvbUVsZW1lbnRzLmRlZmluZSgncXRpLW11bHRpcGxlJywgUXRpTXVsdGlwbGUpO1xuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aU5vdCBleHRlbmRzIFF0aUV4cHJlc3Npb248Ym9vbGVhbj4ge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgJHtzdXBlci5yZW5kZXIoKX1gO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBjb25zdCBleHByZXNzaW9uID0gdGhpcy5maXJzdEVsZW1lbnRDaGlsZCBhcyBRdGlFeHByZXNzaW9uPGJvb2xlYW4+O1xuICAgIGNvbnN0IHJlc3VsdCA9IGV4cHJlc3Npb24uY2FsY3VsYXRlKCkgYXMgYm9vbGVhbjtcbiAgICByZXR1cm4gIXJlc3VsdDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1ub3QnLCBRdGlOb3QpO1xuIiwgImltcG9ydCB7IFF0aUNvbmRpdGlvbkV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktY29uZGl0aW9uLWV4cHJlc3Npb24nO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aU9yIGV4dGVuZHMgUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKSB7XG4gICAgLy8gY2hpbGRyZW4gY2FuIGJlIGEgbWl4IG9mIHF0aS1leHByZXNzaW9uIGFuZCBxdGktY29uZGl0aW9uLWV4cHJlc3Npb25cbiAgICBjb25zdCB2YWx1ZXMgPSBBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4pLm1hcChjID0+IHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IGMgYXMgUXRpRXhwcmVzc2lvbjxhbnk+O1xuICAgICAgaWYgKCFjb25kaXRpb24uY2FsY3VsYXRlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFbGVtZW50IGRvZXNuJ3QgaW1wbGVtZW50IFF0aUNvbmRpdGlvbkV4cHJlc3Npb25cIik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgbGV0IHZhbHVlID0gY29uZGl0aW9uLmNhbGN1bGF0ZSgpIGFzIEJvb2xlYW47XG4gICAgICAvLyBjb252ZXJ0IHN0cmluZyB2YWx1ZSB0byBib29sZWFuIGFuZCByZXR1cm4gbnVsbCBpZiBub3QgcG9zc2libGVcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgdmFsdWUgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgdmFsdWUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIHZhbHVlIGluIHF0aS1vciwgZXhwZWN0ZWQgYm9vbGVhbicpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbHVlcy5zb21lKGUgPT4ge1xuICAgICAgcmV0dXJuIHR5cGVvZiBlID09PSAnYm9vbGVhbicgJiYgZTtcbiAgICB9KTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1vcicsIFF0aU9yKTtcbiIsICJpbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5leHBvcnQgY2xhc3MgUXRpT3JkZXJlZCBleHRlbmRzIFF0aUV4cHJlc3Npb248UmVzcG9uc2VWYXJpYWJsZVtdPiB7XG4gIHB1YmxpYyBvdmVycmlkZSBnZXRSZXN1bHQoKTogUmVzcG9uc2VWYXJpYWJsZVtdIHtcbiAgICBjb25zdCB2YXJpYWJsZXMgPSB0aGlzLmdldFZhcmlhYmxlcygpIGFzIFJlc3BvbnNlVmFyaWFibGVbXTtcbiAgICBpZiAodmFyaWFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcigndW5leHBlY3RlZCBudW1iZXIgb2YgY2hpbGRyZW4gaW4gcXRpIG11bHRpcGxlJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2YXJpYWJsZSBvZiB2YXJpYWJsZXMpIHtcbiAgICAgIGlmICh2YXJpYWJsZS5jYXJkaW5hbGl0eSAhPT0gJ29yZGVyZWQnICYmIHZhcmlhYmxlLmNhcmRpbmFsaXR5ICE9PSAnc2luZ2xlJykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNhcmRpbmFsaXR5IGluIHF0aSBvcmRlcmVkJyk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhcmlhYmxlcztcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1vcmRlcmVkJywgUXRpT3JkZXJlZCk7XG4iLCAiaW1wb3J0IHsgY29uc3VtZSB9IGZyb20gJ0BsaXQvY29udGV4dCc7XG5pbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEl0ZW1Db250ZXh0LCBpdGVtQ29udGV4dCB9IGZyb20gJ3NyYy9saWIvcXRpLWNvbXBvbmVudHMvcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtLmNvbnRleHQnO1xuaW1wb3J0IHsgUXRpQXNzZXNzbWVudEl0ZW0gfSBmcm9tICcuLi8uLi8uLi9xdGktYXNzZXNzbWVudC1pdGVtL3F0aS1hc3Nlc3NtZW50LWl0ZW0nO1xuXG5leHBvcnQgY2xhc3MgUXRQcmludGVkVmFyaWFibGUgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gIGlkZW50aWZpZXI6IHN0cmluZztcblxuICBAY29uc3VtZSh7IGNvbnRleHQ6IGl0ZW1Db250ZXh0LCBzdWJzY3JpYmU6IHRydWUgfSlcbiAgQHN0YXRlKClcbiAgcHVibGljIGl0ZW1Db250ZXh0PzogSXRlbUNvbnRleHQ7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5pdGVtQ29udGV4dD8udmFyaWFibGVzLmZpbmQodiA9PiB2LmlkZW50aWZpZXIgPT09IHRoaXMuaWRlbnRpZmllcik/LnZhbHVlO1xuICAgIHJldHVybiBodG1sYCR7SlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpfWA7XG4gIH1cblxuICAvLyBjb25zdHJ1Y3RvcigpIHtcbiAgLy8gICBzdXBlcigpO1xuICAvLyAgIGNvbnN0IGFzc2Vzc21lbnRJdGVtID0gdGhpcy5jbG9zZXN0KCdxdGktYXNzZXNzbWVudC1pdGVtJykgYXMgUXRpQXNzZXNzbWVudEl0ZW07XG4gIC8vICAgYXNzZXNzbWVudEl0ZW0uYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlc3BvbnNlLXByb2Nlc3NlZCcsICgpID0+IHtcbiAgLy8gICAgIHRoaXMudmFsdWUgPSB0aGlzLmNhbGN1bGF0ZSgpIGFzIHN0cmluZztcbiAgLy8gICB9KTtcbiAgLy8gfVxuXG4gIC8vIHB1YmxpYyBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgLy8gICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAvLyAgIHRoaXMudmFsdWUgPSB0aGlzLmNhbGN1bGF0ZSgpIGFzIHN0cmluZztcbiAgLy8gfVxuXG4gIHB1YmxpYyBjYWxjdWxhdGUoKTogUmVhZG9ubHk8c3RyaW5nIHwgc3RyaW5nW10+IHtcbiAgICBjb25zdCBhc3Nlc3NtZW50SXRlbSA9IHRoaXMuY2xvc2VzdCgncXRpLWFzc2Vzc21lbnQtaXRlbScpIGFzIFF0aUFzc2Vzc21lbnRJdGVtO1xuICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLmlkZW50aWZpZXI7XG4gICAgY29uc3QgcmVzdWx0ID0gYXNzZXNzbWVudEl0ZW0uZ2V0VmFyaWFibGUoaWRlbnRpZmllcikudmFsdWU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1wcmludGVkLXZhcmlhYmxlJywgUXRQcmludGVkVmFyaWFibGUpO1xuIiwgImltcG9ydCB7IFJlc3BvbnNlVmFyaWFibGUgfSBmcm9tICcuLi8uLi8uLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aVByb2R1Y3QgZXh0ZW5kcyBRdGlFeHByZXNzaW9uPG51bWJlcj4ge1xuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgIGNvbnN0IHByb2R1Y3QgPSB2YWx1ZXMucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudFZhbHVlKSA9PiB7XG4gICAgICBpZiAoY3VycmVudFZhbHVlLmJhc2VUeXBlID09ICdmbG9hdCcgfHwgY3VycmVudFZhbHVlLmJhc2VUeXBlID09ICdpbnRlZ2VyJykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRvciAqIHBhcnNlSW50KGN1cnJlbnRWYWx1ZS52YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYGNhbiBub3QgY29udmVydCB0byBudW1iZXJgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBoYXMgYW5vdGhlciBiYXNlVHlwZSAke2N1cnJlbnRWYWx1ZS5iYXNlVHlwZX1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICB9LCAxKTtcbiAgICByZXR1cm4gcHJvZHVjdDtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1wcm9kdWN0JywgUXRpUHJvZHVjdCk7XG4iLCAiaW1wb3J0IHsgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBSZXNwb25zZVZhcmlhYmxlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJuYWwvdmFyaWFibGVzJztcbmltcG9ydCB7IFNjb3JpbmdIZWxwZXIgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvc2NvcmluZy1oZWxwZXInO1xuaW1wb3J0IHsgUXRpRXhwcmVzc2lvbiB9IGZyb20gJy4uL3F0aS1leHByZXNzaW9uJztcblxuZXhwb3J0IGNsYXNzIFF0aVN0cmluZ01hdGNoIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxib29sZWFuPiB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnY2FzZS1zZW5zaXRpdmUnIH0pIGNhc2VTZW5zaXRpdmUgPSAndHJ1ZSc7XG5cbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0VmFyaWFibGVzKCkgYXMgUmVzcG9uc2VWYXJpYWJsZVtdO1xuICAgICAgY29uc3QgdmFsdWUxID0gdmFsdWVzWzBdO1xuICAgICAgY29uc3QgdmFsdWUyID0gdmFsdWVzWzFdO1xuICAgICAgaWYgKFxuICAgICAgICB2YWx1ZTEuY2FyZGluYWxpdHkgIT09ICdzaW5nbGUnIHx8XG4gICAgICAgIHZhbHVlMi5jYXJkaW5hbGl0eSAhPT0gJ3NpbmdsZScgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheSh2YWx1ZTEudmFsdWUpIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUyLnZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FyZGluYWxpdHkgaW4gcXRpIHN0cmluZy1tYXRjaCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCB2MSA9IHRoaXMuY2FzZVNlbnNpdGl2ZSA9PT0gJ3RydWUnID8gdmFsdWUxLnZhbHVlIDogKHZhbHVlMS52YWx1ZSBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCB2MiA9IHRoaXMuY2FzZVNlbnNpdGl2ZSA9PT0gJ3RydWUnID8gdmFsdWUyLnZhbHVlIDogKHZhbHVlMi52YWx1ZSBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCk7XG4gICAgICByZXR1cm4gU2NvcmluZ0hlbHBlci5jb21wYXJlU2luZ2xlVmFsdWVzKHYxIGFzIHN0cmluZywgdjIgYXMgc3RyaW5nLCB2YWx1ZTEuYmFzZVR5cGUpO1xuICAgIH1cbiAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIG51bWJlciBvZiBjaGlsZHJlbiBpbiBxdGktc3RyaW5nLW1hdGNoJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktc3RyaW5nLW1hdGNoJywgUXRpU3RyaW5nTWF0Y2gpO1xuIiwgImltcG9ydCB7IFF0aUV4cHJlc3Npb24sIFF0aUV4cHJlc3Npb25CYXNlIH0gZnJvbSAnLi4vcXRpLWV4cHJlc3Npb24nO1xuXG5leHBvcnQgY2xhc3MgUXRpU3VtIGV4dGVuZHMgUXRpRXhwcmVzc2lvbjxudW1iZXI+IHtcbiAgcHJpdmF0ZSBfZXhwcmVzc2lvbjogUXRpU3VtRXhwcmVzc2lvbjtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9leHByZXNzaW9uID0gbmV3IFF0aVN1bUV4cHJlc3Npb24oQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuIGFzIHVua25vd24gYXMgUXRpRXhwcmVzc2lvbkJhc2U8bnVtYmVyPltdKSk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0UmVzdWx0KCkge1xuICAgIC8vIGNoaWxkcmVuIGNhbiBiZSBhIG1peCBvZiBxdGktZXhwcmVzc2lvbiBhbmQgcXRpLWNvbmRpdGlvbi1leHByZXNzaW9uXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9leHByZXNzaW9uLmNhbGN1bGF0ZSgpO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXRpU3VtRXhwcmVzc2lvbiBpbXBsZW1lbnRzIFF0aUV4cHJlc3Npb25CYXNlPG51bWJlcj4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGV4cHJlc3Npb25zOiBRdGlFeHByZXNzaW9uQmFzZTxudW1iZXI+W10pIHt9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmV4cHJlc3Npb25zLm1hcChjID0+IHtcbiAgICAgIGlmICghYy5jYWxjdWxhdGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVsZW1lbnQgZG9lc24ndCBpbXBsZW1lbnQgUXRpQ29uZGl0aW9uRXhwcmVzc2lvblwiKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IGMuY2FsY3VsYXRlKCk7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIHZhbHVlIGluIHF0aS1zdW0sIGV4cGVjdGVkIG51bWJlcicpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbHVlcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgfVxufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1zdW0nLCBRdGlTdW0pO1xuIiwgImltcG9ydCB7IFF0aUFzc2Vzc21lbnRJdGVtIH0gZnJvbSAnLi4vLi4vLi4vcXRpLWFzc2Vzc21lbnQtaXRlbS9xdGktYXNzZXNzbWVudC1pdGVtJztcbmltcG9ydCB7IFF0aUV4cHJlc3Npb24gfSBmcm9tICcuLi9xdGktZXhwcmVzc2lvbic7XG5cbmV4cG9ydCBjbGFzcyBRdGlWYXJpYWJsZSBleHRlbmRzIFF0aUV4cHJlc3Npb248c3RyaW5nIHwgc3RyaW5nW10+IHtcbiAgcHVibGljIG92ZXJyaWRlIGdldFJlc3VsdCgpIHtcbiAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICBjb25zdCByZXN1bHQgPSAodGhpcy5jbG9zZXN0KCdxdGktYXNzZXNzbWVudC1pdGVtJykgYXMgUXRpQXNzZXNzbWVudEl0ZW0pLmdldFZhcmlhYmxlKGlkZW50aWZpZXIpLnZhbHVlO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdxdGktdmFyaWFibGUnLCBRdGlWYXJpYWJsZSk7XG4iLCAiaW1wb3J0IHsgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IElNU3BjaSwgTW9kdWxlUmVzb2x1dGlvbkNvbmZpZywgUXRpVmFyaWFibGVKU09OIH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuXG5kZWNsYXJlIGNvbnN0IHJlcXVpcmVqczogYW55O1xuZGVjbGFyZSBjb25zdCBkZWZpbmU6IGFueTtcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1wb3J0YWJsZS1jdXN0b20taW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aVBvcnRhYmxlQ3VzdG9tSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIHByaXZhdGUgaW50ZXJ2YWxJZDogYW55O1xuICBwcml2YXRlIHJhd1Jlc3BvbnNlOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBwY2k6IElNU3BjaTx1bmtub3duPjtcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3Jlc3BvbnNlLWlkZW50aWZpZXInIH0pXG4gIHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnbW9kdWxlJyB9KVxuICBtb2R1bGU6IHN0cmluZztcblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ2N1c3RvbS1pbnRlcmFjdGlvbi10eXBlLWlkZW50aWZpZXInIH0pXG4gIGN1c3RvbUludGVyYWN0aW9uVHlwZUlkZW50aWZpZXI6IHN0cmluZztcblxuICBAc3RhdGUoKVxuICBwcml2YXRlIF9lcnJvck1lc3NhZ2U6IHN0cmluZyA9IG51bGw7XG5cbiAgcHJpdmF0ZSBjb252ZXJ0UXRpVmFyaWFibGVKU09OKGlucHV0OiBRdGlWYXJpYWJsZUpTT04pOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgZm9yIChjb25zdCB0b3BMZXZlbEtleSBpbiBpbnB1dCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgaWYgKGlucHV0Lmhhc093blByb3BlcnR5KHRvcExldmVsS2V5KSkge1xuICAgICAgICBjb25zdCBuZXN0ZWRPYmplY3QgPSBpbnB1dFt0b3BMZXZlbEtleSBhcyAnbGlzdCcgfCAnYmFzZSddO1xuICAgICAgICBpZiAobmVzdGVkT2JqZWN0KSB7XG4gICAgICAgICAgZm9yIChjb25zdCBuZXN0ZWRLZXkgaW4gbmVzdGVkT2JqZWN0KSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICAgICAgICBpZiAobmVzdGVkT2JqZWN0Lmhhc093blByb3BlcnR5KG5lc3RlZEtleSkpIHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBuZXN0ZWRPYmplY3RbbmVzdGVkS2V5IGFzIGtleW9mIHR5cGVvZiBuZXN0ZWRPYmplY3RdO1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUubWFwKFN0cmluZyk7IC8vIENvbnZlcnQgZWFjaCBlbGVtZW50IGluIHRoZSBhcnJheSB0byBzdHJpbmdcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7IC8vIENvbnZlcnQgdGhlIHNpbmdsZSB2YWx1ZSB0byBzdHJpbmdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRDaGVja2luZygpOiB2b2lkIHtcbiAgICAvLyBiZWNhdXNlIHRoZSBwY2kgZG9lc24ndCBoYXZlIGEgbWV0aG9kIHRvIGNoZWNrIGZvciBjaGFuZ2VzIHdlJ2xsIHVzZSBhbiBpbnRlcnZhbFxuICAgIC8vIHRvIGNoZWNrIGlmIHRoZSByZXNwb25zZSBoYXMgY2hhbmdlZC4gSWYgY2hhbmdlZCB3ZSdsbCBzYXZlIHRoZSByZXNwb25zZVxuICAgIHRoaXMuaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gdGhpcy5wY2kuZ2V0UmVzcG9uc2UoKTtcbiAgICAgIGNvbnN0IG5ld1Jlc3BvbnNlID0gdGhpcy5wY2kuZ2V0UmVzcG9uc2UoKTtcbiAgICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpO1xuICAgICAgaWYgKHN0cmluZ2lmaWVkICE9PSB0aGlzLnJhd1Jlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMucmF3UmVzcG9uc2UgPSBzdHJpbmdpZmllZDtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmNvbnZlcnRRdGlWYXJpYWJsZUpTT04obmV3UmVzcG9uc2UpO1xuICAgICAgICB0aGlzLnJlc3BvbnNlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9LCAyMDApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wQ2hlY2tpbmcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW50ZXJ2YWxJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWxJZCk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7IC8vIEZPUiBOT1dcbiAgfVxuICBzZXQgcmVzcG9uc2UodmFsOiBSZWFkb25seTxzdHJpbmcgfCBzdHJpbmdbXT4pIHtcbiAgICAvLyBPbmx5IHNldCBzdGF0ZSBpcyBzdXBwb3J0ZWQgaW4gYSBQQ0lcbiAgfVxuXG4gIGdldFRBT0NvbmZpZyhub2RlKSB7XG4gICAgY29uc3QgYSA9IG5vZGUucXVlcnlTZWxlY3RvckFsbCgncHJvcGVydGllcycpO1xuICAgIGxldCBjb25maWcgPSB7fTtcblxuICAgIGNvbnN0IGdldFByb3BlcnR5VmFsdWUgPSBlbCA9PiB7XG4gICAgICBjb25zdCBwcm9wZXJ0eSA9IHt9O1xuICAgICAgY29uc3Qga2V5ID0gZWwuZ2V0QXR0cmlidXRlKCdrZXknKTtcbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGVsLmNoaWxkcmVuKTtcbiAgICAgICAgY29uc3QgYWxsS2V5ID0gY2hpbGRyZW4ubWFwKChjOiBIVE1MRWxlbWVudCkgPT4gYy5nZXRBdHRyaWJ1dGUoJ2tleScpKTtcbiAgICAgICAgY29uc3QgaXNBcnJheSA9IGFsbEtleS5sZW5ndGggPiAwICYmICFhbGxLZXkuZmluZChrID0+ICFOdW1iZXIuaXNJbnRlZ2VyKCtrKSk7XG4gICAgICAgIGlmIChpc0FycmF5KSB7XG4gICAgICAgICAgcHJvcGVydHlba2V5XSA9IGNoaWxkcmVuLm1hcChjID0+IGdldENoaWxkUHJvcGVydGllcyhjKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcGVydHlba2V5XSA9IGVsLnRleHRDb250ZW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcGVydHk7XG4gICAgfTtcblxuICAgIGNvbnN0IGdldENoaWxkUHJvcGVydGllcyA9IChlbCk6IHt9IHwgdm9pZCA9PiB7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgbGV0IHByb3BlcnRpZXMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBlbC5jaGlsZHJlbikge1xuICAgICAgICAgIHByb3BlcnRpZXMgPSB7IC4uLnByb3BlcnRpZXMsIC4uLmdldFByb3BlcnR5VmFsdWUoY2hpbGQpIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgcHJvcGVydGllcyBvZiBhKSB7XG4gICAgICBjb25zdCBrZXkgPSBwcm9wZXJ0aWVzLmdldEF0dHJpYnV0ZSgna2V5Jyk7XG4gICAgICBpZiAoIWtleSkge1xuICAgICAgICBjb25maWcgPSB7IC4uLmNvbmZpZywgLi4uZ2V0Q2hpbGRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZygnQ2FuIG5vdCBmaW5kIHF0aS1jdXN0b20taW50ZXJhY3Rpb24gY29uZmlnJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZWdpc3RlcihwY2k6IElNU3BjaTx1bmtub3duPikge1xuICAgIHRoaXMucGNpID0gcGNpO1xuXG4gICAgY29uc3QgdHlwZSA9IHRoaXMucGFyZW50RWxlbWVudC50YWdOYW1lID09PSAnUVRJLUNVU1RPTS1JTlRFUkFDVElPTicgPyAnVEFPJyA6ICdJTVMnO1xuICAgIGNvbnN0IGRvbTogSFRNTEVsZW1lbnQgPVxuICAgICAgdHlwZSA9PSAnSU1TJyA/IHRoaXMucXVlcnlTZWxlY3RvcigncXRpLWludGVyYWN0aW9uLW1hcmt1cCcpIDogdGhpcy5xdWVyeVNlbGVjdG9yKCdtYXJrdXAnKTtcbiAgICBkb20uY2xhc3NMaXN0LmFkZCgncXRpLWN1c3RvbUludGVyYWN0aW9uJyk7XG5cbiAgICBpZiAodHlwZSA9PSAnVEFPJyAmJiB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3Byb3BlcnRpZXMnKSkge1xuICAgICAgKHRoaXMucXVlcnlTZWxlY3RvcigncHJvcGVydGllcycpIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZzogYW55ID1cbiAgICAgIHR5cGUgPT0gJ0lNUydcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB0aGlzLmRhdGFzZXQsXG4gICAgICAgICAgICBvbnJlYWR5OiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdvbnJlYWR5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA6IHRoaXMuZ2V0VEFPQ29uZmlnKHRoaXMpO1xuXG4gICAgdHlwZSA9PSAnSU1TJ1xuICAgICAgPyBwY2kuZ2V0SW5zdGFuY2UoZG9tLCBjb25maWcsIHVuZGVmaW5lZClcbiAgICAgIDogKHBjaSBhcyBhbnkpLmluaXRpYWxpemUodGhpcy5jdXN0b21JbnRlcmFjdGlvblR5cGVJZGVudGlmaWVyLCBkb20uZmlyc3RFbGVtZW50Q2hpbGQsIGNvbmZpZyk7XG5cbiAgICBpZiAodHlwZSA9PSAnVEFPJykge1xuICAgICAgY29uc3QgbGlua3MgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgnbGluaycpKS5tYXAoYWNjID0+IGFjYy5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSk7XG4gICAgICBsaW5rcy5mb3JFYWNoKGxpbmsgPT4ge1xuICAgICAgICBjb25zdCBzdHlsZXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgIHN0eWxlcy5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICAgIHN0eWxlcy50eXBlID0gJ3RleHQvY3NzJztcbiAgICAgICAgc3R5bGVzLm1lZGlhID0gJ3NjcmVlbic7XG4gICAgICAgIHN0eWxlcy5ocmVmID0gbGluaztcbiAgICAgICAgZG9tLmFwcGVuZENoaWxkKHN0eWxlcyk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zdGFydENoZWNraW5nKCk7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIGNvbnN0IHJlcXVpcmVDb25maWc6IE1vZHVsZVJlc29sdXRpb25Db25maWcgPSB7XG4gICAgICBjb250ZXh0OiB0aGlzLmN1c3RvbUludGVyYWN0aW9uVHlwZUlkZW50aWZpZXIsXG4gICAgICBjYXRjaEVycm9yOiB0cnVlLFxuICAgICAgcGF0aHM6IHt9XG4gICAgfTtcblxuICAgIC8vIHBrOiBjJ2VzdCB0cmVzIHVnbHkuLiB0eXBlc2NyaXB0IHdoeXVub3NwcmVhZCBhZGQgcHJvcHM/IT9cbiAgICBpZiAod2luZG93WydyZXF1aXJlUGF0aHMnXSAmJiB3aW5kb3dbJ3JlcXVpcmVTaGltJ10pIHtcbiAgICAgIHJlcXVpcmVDb25maWdbJ3BhdGhzJ10gPSB3aW5kb3dbJ3JlcXVpcmVQYXRocyddO1xuICAgICAgcmVxdWlyZUNvbmZpZ1snc2hpbSddID0gd2luZG93WydyZXF1aXJlU2hpbSddO1xuICAgIH1cbiAgICBpZiAoIWdsb2JhbFRoaXMucmVxdWlyZSkge1xuICAgICAgdGhpcy5fZXJyb3JNZXNzYWdlID0gYHJlcXVpcmVqcyBub3QgZm91bmQsIGxvYWQgd2l0aCBjZG46IGh0dHBzOi8vY2RuanMuY29tL2xpYnJhcmllcy9yZXF1aXJlLmpzYDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gSW5pdGlhbCBjaGVjayBpbiBjYXNlIHRoZSBjaGlsZHJlbiBhcmUgYWxyZWFkeSBwcmVzZW50XG4gICAgdGhpcy5yZWdpc3Rlck1vZHVsZXMocmVxdWlyZUNvbmZpZykudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCByZXF1aXJlUENJID0gcmVxdWlyZWpzLmNvbmZpZyhyZXF1aXJlQ29uZmlnKTtcblxuICAgICAgcmVxdWlyZVBDSShcbiAgICAgICAgWydyZXF1aXJlJ10sXG4gICAgICAgIHJlcXVpcmUgPT4ge1xuICAgICAgICAgICFyZXF1aXJlLmRlZmluZWQoJ3F0aUN1c3RvbUludGVyYWN0aW9uQ29udGV4dCcpICYmXG4gICAgICAgICAgICBkZWZpbmUoJ3F0aUN1c3RvbUludGVyYWN0aW9uQ29udGV4dCcsICgpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICByZWdpc3RlcjogY3R4QSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyKGN0eEEpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbm90aWZ5UmVhZHk6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIC8qIG9ubHkgdXNlZCBpbiB0aGUgVEFPIHZlcnNpb24gKi9cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyBQSzogdGhpcyBpcyBhIGhhY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGludGVyYWN0aW9uIGlzIG9ubHkgcmVnaXN0ZXJlZCBvbmNlXG4gICAgICAgICAgLy8gSWYgaXQgd2FzIHByZXZpc291bHkgbG9hZGVkLCB0aGUgcmVnaXN0ZXIgd2lsbCBub2cga2ljayBpbiwgYmVjYXVzZSB0aGUgY2xhc3MgaXMgYWxyZWFkeSBkZWZpbmVkXG4gICAgICAgICAgLy8gYW5kIGluIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgUENJLCB0aGUgcmVnaXN0ZXIgaXMgY2FsbGVkLlxuICAgICAgICAgIC8vIFNvIG5vdyBpdCBpcyBhbHJlYWRseSBkZWZpbmVkLCB3ZSBqdXN0IHJlZ2lzdGVyIGl0IG91cnNlbHZlcy5cblxuICAgICAgICAgIGNvbnN0IHdhc1ByZXZpb3VzbHlMb2FkZWQgPSByZXF1aXJlLmRlZmluZWQodGhpcy5tb2R1bGUpO1xuXG4gICAgICAgICAgcmVxdWlyZShbdGhpcy5tb2R1bGVdLCBjdHhBID0+IHtcbiAgICAgICAgICAgIC8vIHJlZ2lzdGVyIGl0IGJlY2F1c2UgaXQgd2FzIHByZXZpb3VzbHkgbG9hZGVkXG4gICAgICAgICAgICB3YXNQcmV2aW91c2x5TG9hZGVkICYmIHRoaXMucmVnaXN0ZXIoY3R4QSk7XG4gICAgICAgICAgfSwgZXJyID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yTWVzc2FnZSA9IGVycjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyID0+IHtcbiAgICAgICAgICB0aGlzLl9lcnJvck1lc3NhZ2UgPSBlcnI7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc3RvcENoZWNraW5nKCk7XG4gIH1cblxuICBhc3luYyByZWdpc3Rlck1vZHVsZXMoY29uZmlnOiBNb2R1bGVSZXNvbHV0aW9uQ29uZmlnKSB7XG4gICAgLy8gZ2V0IHRoZSB2YWx1ZSBvZiBhdHRyaWJ1dGU6IGRhdGEtYmFzZS11cmxcbiAgICBjb25zdCBiYXNlVXJsID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2RhdGEtYmFzZS11cmwnKTtcbiAgICBpZiAoYmFzZVVybCkge1xuICAgICAgY29uc3QgbW9kdWxlUmVzb2x1dGlvblBhdGggPSBgJHtiYXNlVXJsfS9tb2R1bGVzL21vZHVsZV9yZXNvbHV0aW9uLmpzYDtcbiAgICAgIGNvbnN0IG1vZHVsZVJlc29sdXRpb25GYWxsYmFja1BhdGggPSBgJHtiYXNlVXJsfS9tb2R1bGVzL21vZHVsZV9yZXNvbHV0aW9uX2ZhbGxiYWNrLmpzYDtcbiAgICAgIGlmIChtb2R1bGVSZXNvbHV0aW9uUGF0aCkge1xuICAgICAgICBjb25zdCBwcmltYXJ5Q29uZmlnID0gYXdhaXQgdGhpcy5sb2FkQ29uZmlnKG1vZHVsZVJlc29sdXRpb25QYXRoLCBiYXNlVXJsKTtcbiAgICAgICAgYXdhaXQgdGhpcy5tZXJnZUNvbmZpZ3MoY29uZmlnLCBwcmltYXJ5Q29uZmlnLCBtb2R1bGVSZXNvbHV0aW9uRmFsbGJhY2tQYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gR2V0IHRoZSBxdGktaW50ZXJhY3Rpb24tbW9kdWxlcyBlbGVtZW50XG4gICAgY29uc3QgaW50ZXJhY3Rpb25Nb2R1bGVzID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktaW50ZXJhY3Rpb24tbW9kdWxlcycpO1xuICAgIGlmIChpbnRlcmFjdGlvbk1vZHVsZXMpIHtcbiAgICAgIC8vIEdldCBhbGwgcXRpLWludGVyYWN0aW9uLW1vZHVsZSBlbGVtZW50c1xuICAgICAgY29uc3QgbW9kdWxlcyA9IGludGVyYWN0aW9uTW9kdWxlcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktaW50ZXJhY3Rpb24tbW9kdWxlJyk7XG4gICAgICAvLyBMb29wIHRocm91Z2ggZWFjaCBtb2R1bGUgYW5kIHJlZ2lzdGVyIGl0IHdpdGggUmVxdWlyZUpTXG4gICAgICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG4gICAgICAgIGNvbnN0IG1vZHVsZUlkID0gbW9kdWxlLmdldEF0dHJpYnV0ZSgnaWQnKTtcbiAgICAgICAgY29uc3QgcHJpbWFyeVBhdGggPSBtb2R1bGUuZ2V0QXR0cmlidXRlKCdwcmltYXJ5LXBhdGgnKTtcbiAgICAgICAgY29uc3QgZmFsbGJhY2tQYXRoID0gbW9kdWxlLmdldEF0dHJpYnV0ZSgnZmFsbGJhY2stcGF0aCcpO1xuICAgICAgICBjb25zdCBwcmltYXJ5Q29uZmlnOiBNb2R1bGVSZXNvbHV0aW9uQ29uZmlnID0gcHJpbWFyeVBhdGhcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgcGF0aHM6IHsgLi4uY29uZmlnWydwYXRocyddLCAuLi57IFttb2R1bGVJZF06IHRoaXMuZ2V0UmVzb2x2YWJsZVBhdGgocHJpbWFyeVBhdGgsIGJhc2VVcmwpIH0gfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgY29uc3QgZmFsbGJhY2tDb25maWc6IE1vZHVsZVJlc29sdXRpb25Db25maWcgPSBmYWxsYmFja1BhdGhcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgcGF0aHM6IHsgLi4uY29uZmlnWydwYXRocyddLCAuLi57IFttb2R1bGVJZF06IHRoaXMuZ2V0UmVzb2x2YWJsZVBhdGgoZmFsbGJhY2tQYXRoLCBiYXNlVXJsKSB9IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IG51bGw7XG4gICAgICAgIGlmIChtb2R1bGVJZCAmJiBwcmltYXJ5Q29uZmlnKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5tZXJnZUNvbmZpZ3MoY29uZmlnLCBwcmltYXJ5Q29uZmlnLCBmYWxsYmFja0NvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZURvdWJsZVNsYXNoZXMoc3RyOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzaW5nbGVGb3J3YXJkU2xhc2hlcyA9IHN0clxuICAgICAgLnJlcGxhY2UoLyhbXjpdXFwvKVxcLysvZywgJyQxJylcbiAgICAgIC5yZXBsYWNlKC9cXC9cXC8vZywgJy8nKVxuICAgICAgLnJlcGxhY2UoJ2h0dHA6LycsICdodHRwOi8vJylcbiAgICAgIC5yZXBsYWNlKCdodHRwczovJywgJ2h0dHBzOi8vJyk7XG4gICAgcmV0dXJuIHNpbmdsZUZvcndhcmRTbGFzaGVzO1xuICB9XG5cbiAgbG9hZENvbmZpZyA9IGFzeW5jICh1cmw6IHN0cmluZywgYmFzZVVybD86IHN0cmluZyk6IFByb21pc2U8TW9kdWxlUmVzb2x1dGlvbkNvbmZpZz4gPT4ge1xuICAgIHVybCA9IHRoaXMucmVtb3ZlRG91YmxlU2xhc2hlcyh1cmwpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXF1aXJlQ29uZmlnID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgIGlmIChyZXF1aXJlQ29uZmlnLm9rKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IHJlcXVpcmVDb25maWcuanNvbigpO1xuICAgICAgICBjb25zdCBtb2R1bGVDb25nID0gY29uZmlnIGFzIE1vZHVsZVJlc29sdXRpb25Db25maWc7XG4gICAgICAgIGZvciAoY29uc3QgbW9kdWxlSWQgaW4gbW9kdWxlQ29uZy5wYXRocykge1xuICAgICAgICAgIGlmIChiYXNlVXJsKSB7XG4gICAgICAgICAgICBtb2R1bGVDb25nLnBhdGhzW21vZHVsZUlkXSA9IHRoaXMuZ2V0UmVzb2x2YWJsZVBhdGgobW9kdWxlQ29uZy5wYXRoc1ttb2R1bGVJZF0sIGJhc2VVcmwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbW9kdWxlQ29uZztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIGdldFJlc29sdmFibGVQYXRoID0gKHBhdGg6IHN0cmluZywgYmFzZVBhdGg/OiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gcGF0aD8udG9Mb2NhbGVMb3dlckNhc2UoKS5zdGFydHNXaXRoKCdodHRwJykgfHwgIWJhc2VQYXRoXG4gICAgICA/IHBhdGhcbiAgICAgIDogdGhpcy5yZW1vdmVEb3VibGVTbGFzaGVzKGAke2Jhc2VQYXRofS8ke3BhdGh9YCk7XG4gIH07XG5cbiAgbWVyZ2VDb25maWdzID0gYXN5bmMgKFxuICAgIGNvbmZpZzogTW9kdWxlUmVzb2x1dGlvbkNvbmZpZyxcbiAgICBwcmltYXJ5Q29uZmlnOiBNb2R1bGVSZXNvbHV0aW9uQ29uZmlnLFxuICAgIGZhbGxiYWNrOiBzdHJpbmcgfCBNb2R1bGVSZXNvbHV0aW9uQ29uZmlnXG4gICkgPT4ge1xuICAgIGZvciAoY29uc3QgbW9kdWxlSWQgaW4gcHJpbWFyeUNvbmZpZz8ucGF0aHMpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBrZXkgaXMgYWxyZWFkeSBpbiB0aGUgY29uZmlnXG4gICAgICBpZiAoIWNvbmZpZy5wYXRoc1ttb2R1bGVJZF0pIHtcbiAgICAgICAgLy8gY2hlY2sgaWYgZmlsZSBleGlzdHNcbiAgICAgICAgbGV0IGZhaWxlZFRvUmVzb2x2ZSA9IGZhbHNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHBhdGhXaXRoRXh0ZW5zaW9uID0gcHJpbWFyeUNvbmZpZy5wYXRoc1ttb2R1bGVJZF0/LnRvTG9jYWxlTG93ZXJDYXNlKCkuZW5kc1dpdGgoJy5qcycpXG4gICAgICAgICAgICA/IHByaW1hcnlDb25maWcucGF0aHNbbW9kdWxlSWRdXG4gICAgICAgICAgICA6IHByaW1hcnlDb25maWcucGF0aHNbbW9kdWxlSWRdICsgJy5qcyc7XG4gICAgICAgICAgY29uc3QgbSA9IGF3YWl0IGZldGNoKHBhdGhXaXRoRXh0ZW5zaW9uKTtcbiAgICAgICAgICBpZiAobS5vaykge1xuICAgICAgICAgICAgY29uZmlnLnBhdGhzW21vZHVsZUlkXSA9IHByaW1hcnlDb25maWcucGF0aHNbbW9kdWxlSWRdLnJlcGxhY2UoL1xcLmpzJC8sICcnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmFpbGVkVG9SZXNvbHZlID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIGZhaWxlZFRvUmVzb2x2ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZhaWxlZFRvUmVzb2x2ZSAmJiBmYWxsYmFjaykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZmFsbGJhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBmYWxsYmFja0NvbmZpZyA9IGF3YWl0IHRoaXMubG9hZENvbmZpZyhmYWxsYmFjayk7XG4gICAgICAgICAgICAgIGlmIChmYWxsYmFja0NvbmZpZz8ucGF0aHNbbW9kdWxlSWRdKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLnBhdGhzW21vZHVsZUlkXSA9IGZhbGxiYWNrQ29uZmlnLnBhdGhzW21vZHVsZUlkXS5yZXBsYWNlKC9cXC5qcyQvLCAnJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBmYWxsYmFjayA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGlmIChmYWxsYmFjaz8ucGF0aHNbbW9kdWxlSWRdKSB7XG4gICAgICAgICAgICAgIGNvbmZpZy5wYXRoc1ttb2R1bGVJZF0gPSBmYWxsYmFjay5wYXRoc1ttb2R1bGVJZF0ucmVwbGFjZSgvXFwuanMkLywgJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChmYWlsZWRUb1Jlc29sdmUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcmVzb2x2ZSBtb2R1bGU6ICcgKyBtb2R1bGVJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD4ke3RoaXMuX2Vycm9yTWVzc2FnZSAmJlxuICAgICAgaHRtbGA8ZGl2IHN0eWxlPVwiY29sb3I6cmVkXCI+XG4gICAgICAgIDxoMT5FcnJvcjwvaDE+XG4gICAgICAgICR7dGhpcy5fZXJyb3JNZXNzYWdlfVxuICAgICAgPC9kaXY+YH1gO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1wb3J0YWJsZS1jdXN0b20taW50ZXJhY3Rpb24nOiBRdGlQb3J0YWJsZUN1c3RvbUludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcblxuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpQXNzb2NpYXRlSW50ZXJhY3Rpb24gZXh0ZW5kcyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4oXG4gIExpdEVsZW1lbnQsXG4gICdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJyxcbiAgdHJ1ZSxcbiAgJy5kbCdcbikge1xuICBAc3RhdGUoKSBwcml2YXRlIF9jaGlsZHJlbk1hcDogRWxlbWVudFtdO1xuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogYmxvY2s7IC8qIG5lY2Vzc2FyeSB0byBjYWxjdWxhdGUgc2NhbGluZyBwb3NpdGlvbiAqL1xuICAgIH1cbiAgICBzbG90W25hbWU9J3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnXSB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgICAgZ2FwOiAwLjVyZW07XG4gICAgfVxuICBgO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgbmFtZT1cInByb21wdFwiPjwvc2xvdD5cbiAgICAgIDxzbG90IG5hbWU9XCJxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlXCI+PC9zbG90PlxuICAgICAgJHt0aGlzLl9jaGlsZHJlbk1hcC5sZW5ndGggPiAwICYmXG4gICAgICBBcnJheS5mcm9tKEFycmF5KE1hdGguY2VpbCh0aGlzLl9jaGlsZHJlbk1hcC5sZW5ndGggLyAyKSkua2V5cygpKS5tYXAoXG4gICAgICAgIChfLCBpbmRleCkgPT5cbiAgICAgICAgICBodG1sYDxkaXYgcGFydD1cImFzc29jaWFibGVzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiBuYW1lPVwibGVmdCR7aW5kZXh9XCIgcGFydD1cImRyb3AtbGlzdFwiIGNsYXNzPVwiZGxcIiBpZGVudGlmaWVyPVwiZHJvcGxpc3Qke2luZGV4fV9sZWZ0XCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IG5hbWU9XCJyaWdodCR7aW5kZXh9XCIgcGFydD1cImRyb3AtbGlzdFwiIGNsYXNzPVwiZGxcIiBpZGVudGlmaWVyPVwiZHJvcGxpc3Qke2luZGV4fV9yaWdodFwiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PmBcbiAgICAgICl9YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5fY2hpbGRyZW5NYXAgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScpKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYXNzb2NpYXRlLWludGVyYWN0aW9uJzogUXRpQXNzb2NpYXRlSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJleHBvcnQgY2xhc3MgVG91Y2hEcmFnQW5kRHJvcCB7XG4gIHByaXZhdGUgX3RvdWNoQmVnaW4gPSAwOyAvLyB0aW1lc3RhbXAgb2YgZmlyc3QgdG91Y2hcbiAgcHJpdmF0ZSBfdG91Y2hEb3duID0gbnVsbDsgLy8gcG9pbnQgb2YgZmlyc3QgdG91Y2hcbiAgcHJpdmF0ZSBfbGFzdENsaWNrID0gMDsgLy8gdGltZXN0YW1wIG9mIHByZXZpb3VzIGNsaWNrICh0b3VjaHN0YXJ0ICsgdG91Y2hlbmQpXG4gIHByaXZhdGUgX2NhbkRyYWcgPSBmYWxzZTsgLy8gd2hldGhlciB0aGVyZSBpcyBhbiBlbGVtZW50IHdoaWNoIGNhbiBiZSBkcmFnZ2VkXG4gIHByaXZhdGUgX2RyYWdTcmMgPSBudWxsOyAvLyB0aGUgZWxlbWVudCB3aGljaCBzaG91bGQgYmUgZHJhZ2dlZFxuICBwcml2YXRlIF9kcmFnQ29weSA9IG51bGw7IC8vIGNvcHkgb2YgZHJhZyBzb3VyY2UgZm9yIGRyYWcgZmVlZGJhY2tcbiAgcHJpdmF0ZSBfdG91Y2hFbmRDYWxsZWQgPSBmYWxzZTsgLy8gd2hldGhlciB0b3VjaEVuZCBvY2N1cmVkXG4gIHByaXZhdGUgX2RyYWdSdW5uaW5nID0gZmFsc2U7IC8vIHdoZXRoZXIgYSBkcmFnIHByb2Nlc3MgaXMgcnVubmluZyBhdCB0aGUgbW9tZW50XG5cbiAgcHJpdmF0ZSBfZGF0YVRyYW5zZmVyID0ge1xuICAgIGRhdGE6IHt9LFxuICAgIHNldERhdGE6IGZ1bmN0aW9uICh0eXBlLCB2YWwpIHtcbiAgICAgIHRoaXMuZGF0YVt0eXBlXSA9IHZhbDtcbiAgICB9LFxuICAgIGdldERhdGE6IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhW3R5cGVdO1xuICAgIH0sXG4gICAgZWZmZWN0QWxsb3dlZDogJ21vdmUnXG4gIH07XG4gIHByaXZhdGUgX2NvcHlPZmZzZXQgPSB7IHg6IDAsIHk6IDAgfTsgLy8gT2Zmc2V0IGZvciBwb3NpdGlvbmluZyB0aGUgZHJhZyBjb3B5XG5cbiAgcHJpdmF0ZSBfbGFzdFRhcmdldCA9IG51bGw7IC8vIFRoZSBsYXN0IHJlZ2lzdGVyZWQgdG91Y2ggdGFyZ2V0XG4gIHByaXZhdGUgX2N1cnJlbnREcm9wQ29udGFpbmVyID0gbnVsbDsgLy8gVGhlIGN1cnJlbnQgZHJvcCBjb250YWluZXI7IGZhbHNlIGlmIGVsZW1lbnQgaXMgbm90IGRyb3BwYWJsZVxuICBwcml2YXRlIF9oYW5kbGVDbGljayA9IHRydWU7IC8vIFNwZWNpZmllc1xuXG4gIHByaXZhdGUgX0RCTENMSUNLREVMQVkgPSA1MDA7IC8vIG1heGltdW0gZGVsYXkgaW4gd2hpY2ggYSBzZWNvbmQgY2xpY2sgbXVzdCBvY2N1clxuICBwcml2YXRlIF9DT05URVhUTUVOVURFTEFZID0gMTAwMDsgLy8gaG9sZCBkZWxheSBhZnRlciB3aGljaCBjb250ZXh0IG1lbnUgaXMgc2hvd25cbiAgcHJpdmF0ZSBfRFJBR0RFTFRBID0gNTsgLy8gTWluaW11bSBvZiBwaXhlbHMgd2hpY2ggdGhlIGZpbmdlciBtdXN0IGJlIG1vdmVkIHRvIHN0YXJ0IGRyYWdcbiAgcHJpdmF0ZSBfQ09QWU9QQUNJVFkgPSAwLjc7IC8vIE9wYWNpdHkgb2YgdGhlIGRyYWcgY29weSBlbGVtZW50XG4gIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogVG91Y2hEcmFnQW5kRHJvcDtcblxuICBjb3B5U3R5bGVzRHJhZ0Nsb25lOiBib29sZWFuID0gdHJ1ZTtcbiAgZHJhZ09uQ2xpY2s6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBDaGVjayBzaW5nbGV0b25cbiAgICBpZiAoVG91Y2hEcmFnQW5kRHJvcC5faW5zdGFuY2UpIHtcbiAgICAgIC8vICB0aHJvdyBuZXcgRXJyb3IoXCJUb3VjaERyYWdBbmREcm9wIGNhbid0IGJlIGluc3RhbnRpYXRlZCBtb3JlIHRoYW4gb25jZS5cIik7XG4gICAgICByZXR1cm4gVG91Y2hEcmFnQW5kRHJvcC5faW5zdGFuY2U7XG4gICAgfVxuICAgIFRvdWNoRHJhZ0FuZERyb3AuX2luc3RhbmNlID0gdGhpcztcblxuICAgIC8vIHRoaXMuX2luaXRpYWxpemVGaWVsZHMoKTtcblxuICAgIC8vIEFkZCBldmVudCBsaXN0ZW5lcnNcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMuX3RvdWNoTW92ZS5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlLCBjYXB0dXJlOiBmYWxzZSB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl90b3VjaE1vdmUuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSwgY2FwdHVyZTogZmFsc2UgfSk7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuX3RvdWNoRW5kLmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UsIGNhcHR1cmU6IGZhbHNlIH0pO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl90b3VjaEVuZC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlLCBjYXB0dXJlOiBmYWxzZSB9KTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgdGhpcy5fdG91Y2hDYW5jZWwuYmluZCh0aGlzKSwgeyBwYXNzaXZlOiBmYWxzZSwgY2FwdHVyZTogZmFsc2UgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFkZERyYWdnYWJsZXMoZHJhZ2dhYmxlczogRWxlbWVudFtdKSB7XG4gICAgZHJhZ2dhYmxlcy5mb3JFYWNoKGVsID0+IHtcbiAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl90b3VjaFN0YXJ0LmJpbmQodGhpcyksIHsgcGFzc2l2ZTogZmFsc2UsIGNhcHR1cmU6IGZhbHNlIH0pO1xuICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fdG91Y2hTdGFydC5iaW5kKHRoaXMpLCB7IHBhc3NpdmU6IGZhbHNlLCBjYXB0dXJlOiBmYWxzZSB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmb3IgdG91Y2hzdGFydCBldmVudCBsaXN0ZW5lci5cbiAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlXG4gICAqL1xuICBwcml2YXRlIF90b3VjaFN0YXJ0KGUpIHtcbiAgICAvLyBTYXZlIGN1cnJlbnQgdGltZXN0YW1wXG4gICAgdGhpcy5fdG91Y2hCZWdpbiA9IERhdGUubm93KCk7XG5cbiAgICBjb25zdCB7IHgsIHkgfSA9IHRoaXMuX2dldFBvaW50KGUpO1xuXG4gICAgdGhpcy5fdG91Y2hEb3duID0geyB4LCB5IH07XG5cbiAgICB0aGlzLl9kcmFnU3JjID0gZS5jdXJyZW50VGFyZ2V0O1xuICAgIHRoaXMuX2NhbkRyYWcgPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMuZHJhZ09uQ2xpY2spIHtcbiAgICAgIGNvbnN0IF90b3VjaGVzID0geyBjbGllbnRYOiB4LCBjbGllbnRZOiB5IH07XG4gICAgICB0aGlzLl9kcmFnUnVubmluZyA9IHRydWU7XG4gICAgICB0aGlzLl9jcmVhdGVEcmFnQ29weShlLCBfdG91Y2hlcyk7XG4gICAgfVxuXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZvciB0b3VjaG1vdmUgZXZlbnQgbGlzdGVuZXIuXG4gICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZVxuICAgKi9cbiAgcHJpdmF0ZSBfdG91Y2hNb3ZlKGUpIHtcbiAgICBpZiAodGhpcy5fY2FuRHJhZyAmJiB0aGlzLl9kcmFnU3JjKSB7XG4gICAgICAvLyBDcmVhdGUgY29weSBvZiBlbGVtZW50IGZvciB2aXN1YWwgZHJhZyBmZWVkYmFja1xuXG4gICAgICBjb25zdCB7IHgsIHkgfSA9IHRoaXMuX2dldFBvaW50KGUpO1xuICAgICAgY29uc3QgX3RvdWNoZXMgPSB7IGNsaWVudFg6IHgsIGNsaWVudFk6IHkgfTtcblxuICAgICAgaWYgKHRoaXMuX2dldERlbHRhKF90b3VjaGVzKSA+PSB0aGlzLl9EUkFHREVMVEEpIHtcbiAgICAgICAgdGhpcy5fZHJhZ1J1bm5pbmcgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jcmVhdGVEcmFnQ29weShlLCBfdG91Y2hlcyk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlRHJhZ0NvcHkgPSAoZTogYW55LCBfdG91Y2hlczogeyBjbGllbnRYOiBudW1iZXI7IGNsaWVudFk6IG51bWJlciB9KSA9PiB7XG4gICAgaWYgKHRoaXMuX2RyYWdDb3B5ID09PSBudWxsICYmIHRoaXMuX2RyYWdSdW5uaW5nKSB7XG4gICAgICB0aGlzLl9kcmFnU3JjLnN0eWxlLm9wYWNpdHkgPSB0aGlzLl9DT1BZT1BBQ0lUWTtcbiAgICAgIHRoaXMuX2RyYWdDb3B5ID0gdGhpcy5fZHJhZ1NyYy5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICBjb25zdCBlbGVtZW50U3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5fZHJhZ1NyYyk7XG5cbiAgICAgIHRoaXMuX2RyYWdDb3B5LnN0eWxlID0gJyc7XG4gICAgICB0aGlzLl9kcmFnQ29weS5zZXRBdHRyaWJ1dGUoJ2RyYWdjbG9uZScsICcnKTtcblxuICAgICAgaWYgKHRoaXMuY29weVN0eWxlc0RyYWdDbG9uZSkge1xuICAgICAgICBmb3IgKGNvbnN0IHN0eWxlIG9mIGVsZW1lbnRTdHlsZXMpIHtcbiAgICAgICAgICB0aGlzLl9kcmFnQ29weS5zdHlsZVtzdHlsZV0gPSBlbGVtZW50U3R5bGVzLmdldFByb3BlcnR5VmFsdWUoc3R5bGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2NhbGN1bGF0ZURyYWdDb3B5UG9zaXRpb24oX3RvdWNoZXMpO1xuXG4gICAgICB0aGlzLl9kcmFnQ29weS5zdHlsZS50b3AgPSBfdG91Y2hlcy5jbGllbnRZIC0gdGhpcy5fY29weU9mZnNldC55ICsgJ3B4JztcbiAgICAgIHRoaXMuX2RyYWdDb3B5LnN0eWxlLmxlZnQgPSBfdG91Y2hlcy5jbGllbnRYIC0gdGhpcy5fY29weU9mZnNldC54ICsgJ3B4JztcbiAgICAgIHRoaXMuX2RyYWdDb3B5LnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICAgIHRoaXMuX2RyYWdDb3B5LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gICAgICB0aGlzLl9kcmFnQ29weS5zdHlsZS56SW5kZXggPSAnOTk5OTk5JztcblxuICAgICAgdGhpcy5fZHJhZ0NvcHkgPSBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX2RyYWdDb3B5KTtcbiAgICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnQodGhpcy5fZHJhZ1NyYywgJ2RyYWdzdGFydCcpO1xuICAgIH1cblxuICAgIC8vIERyYWcgaXMgcnVubmluZywgbW92ZSBkcmFnIGNvcHkgYW5kIGZpcmUgZXZlbnRzXG4gICAgaWYgKHRoaXMuX2RyYWdSdW5uaW5nKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgIGNvbnN0IF90aGlzID0gdGhpcztcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChfdGhpcy5fdG91Y2hFbmRDYWxsZWQgfHwgX3RoaXMuX2RyYWdDb3B5ID09PSBudWxsKSByZXR1cm47XG4gICAgICAgIF90aGlzLl9kcmFnQ29weS5zdHlsZS50b3AgPSBfdG91Y2hlcy5jbGllbnRZIC0gX3RoaXMuX2NvcHlPZmZzZXQueSArICdweCc7XG4gICAgICAgIF90aGlzLl9kcmFnQ29weS5zdHlsZS5sZWZ0ID0gX3RvdWNoZXMuY2xpZW50WCAtIF90aGlzLl9jb3B5T2Zmc2V0LnggKyAncHgnO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuX2ZpbmREcm9wcGFibGUoZSk7XG5cbiAgICAgIC8vIEZpcmUgZHJhZ2xlYXZlIGFuZCBkcmFnZW50ZXIgZXZlbnRzIHdoZW4gdGFyZ2V0IGhhcyBjaGFuZ2VkIGR1cmluZyBtb3ZlXG4gICAgICBpZiAodGFyZ2V0ICE9IHRoaXMuX2xhc3RUYXJnZXQpIHtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2hFdmVudCh0YXJnZXQsICdkcmFnZW50ZXInKTtcbiAgICAgICAgdGhpcy5fZGlzcGF0Y2hFdmVudCh0aGlzLl9sYXN0VGFyZ2V0LCAnZHJhZ2xlYXZlJyk7XG4gICAgICAgIHRoaXMuX2xhc3RUYXJnZXQgPSB0YXJnZXQ7XG4gICAgICB9XG5cbiAgICAgIC8vIE1ha2UgY3VycmVudCBkcm9wIGNvbnRhaW5lciBjbGFzc3dpZGUgYXZhaWxhYmxlIGFuZCBmaXJlIGRyYWdvdmVyIGlmIGl0J3MgcmVhbGx5IGEgZHJvcCBjb250YWluZXIuXG4gICAgICB0aGlzLl9jdXJyZW50RHJvcENvbnRhaW5lciA9IHRhcmdldDtcbiAgICAgIGlmICh0aGlzLl9jdXJyZW50RHJvcENvbnRhaW5lcikgdGhpcy5fZGlzcGF0Y2hFdmVudCh0YXJnZXQsICdkcmFnb3ZlcicpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZm9yIHRvdWNoZW5kIGV2ZW50IGxpc3RlbmVyLlxuICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGVcbiAgICovXG4gIHByaXZhdGUgX3RvdWNoRW5kKGUpIHtcbiAgICB0aGlzLl90b3VjaEVuZENhbGxlZCA9IHRydWU7XG4gICAgdGhpcy5fY2FuRHJhZyA9IGZhbHNlO1xuXG4gICAgLy8gY29uc29sZS5sb2coMSwgZS50YXJnZXQsIHRoaXMuX2N1cnJlbnREcm9wQ29udGFpbmVyKTtcblxuICAgIC8vIFVzZXIgc2VlbXMgdG8gY2xpY2tcbiAgICAvLyBpZiAoIXRoaXMuX2RyYWdSdW5uaW5nICYmIHRoaXMuX2hhbmRsZUNsaWNrKSB7XG4gICAgLy8gICB0aGlzLl9kaXNwYXRjaEV2ZW50KGUudGFyZ2V0LCAnY2xpY2snKTtcbiAgICAvLyAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAvLyAgIHJldHVybjtcbiAgICAvLyB9XG4gICAgaWYgKHRoaXMuX2N1cnJlbnREcm9wQ29udGFpbmVyKSB7XG4gICAgICB0aGlzLl9kaXNwYXRjaEV2ZW50KHRoaXMuX2N1cnJlbnREcm9wQ29udGFpbmVyLCAnZHJvcCcpO1xuICAgICAgdGhpcy5fZGlzcGF0Y2hFdmVudCh0aGlzLl9kcmFnU3JjLCAnZHJhZ2VuZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBmaXJlIGRyYWdFdmVudCBldmVuIGlmIHRoZWlyIGlzIG5vIGRyb3BwYWJsZS4gQW5kIGFzc2lnbiBkcm9wRWZmZWN0IG5vbmUuXG4gICAgICAvLyBmb3Igb3VyIHB1cnBvc2UsIHRoaXMgd2lsbCBicmluZyBiYWNrIHRoZSBkcmFnIHRvIGl0cyBzdGFydCBwb3NpdGlvbiwgc2VlbCBkcmFnLWRyb3AtaW50ZXJhY3Rpb24tbWl4aW4udHNcbiAgICAgIGlmICh0aGlzLl9kcmFnUnVubmluZykge1xuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBDdXN0b21FdmVudCgnZHJhZ2VuZCcsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgZXZlbnRbJ2RhdGFUcmFuc2ZlciddID0geyBkcm9wRWZmZWN0OiAnbm9uZScgfTtcbiAgICAgICAgdGhpcy5fZHJhZ1NyYz8uZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fcmVzZXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmb3IgdG91Y2hjYW5jZWwgZXZlbnQgbGlzdGVuZXIsIGluIGNhc2UgYnJvd3NlciBzdXBwb3J0cyB0aGlzLlxuICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGVcbiAgICovXG4gIHByaXZhdGUgX3RvdWNoQ2FuY2VsKGUpIHtcbiAgICB0aGlzLl9yZXNldCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgdGhlIG5leHQgZHJvcHBhYmxlIGVsZW1lbnQgYXQgY3VycmVudCBwb2ludC5cbiAgICogQHBhcmFtIHtPYmplY3R9IHB0XG4gICAqL1xuICBwcml2YXRlIF9maW5kRHJvcHBhYmxlKGV2ZW50KSB7XG4gICAgY29uc3QgcG9pbnRGcm9tVG91Y2hFdmVudCA9IHRoaXMuX2dldFBvaW50KGV2ZW50KTtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50RnJvbVBvaW50KHBvaW50RnJvbVRvdWNoRXZlbnQueCwgcG9pbnRGcm9tVG91Y2hFdmVudC55KTtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgZWxlbWVudEZyb21Qb2ludCh4OiBudW1iZXIsIHk6IG51bWJlcik6IEVsZW1lbnQge1xuICAgIGxldCBlbCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSk7XG4gICAgaWYgKGVsKSB7XG4gICAgICB3aGlsZSAoZWwuc2hhZG93Um9vdCkge1xuICAgICAgICBjb25zdCBjdXN0b21FbCA9IGVsLnNoYWRvd1Jvb3QuZWxlbWVudEZyb21Qb2ludCh4LCB5KTtcbiAgICAgICAgaWYgKGN1c3RvbUVsID09PSBudWxsIHx8IGN1c3RvbUVsID09PSBlbCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGVsID0gY3VzdG9tRWw7XG4gICAgICB9XG4gICAgICByZXR1cm4gZWw7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UG9pbnQoZXZlbnQsIHBhZ2U/KSB7XG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LnRvdWNoZXMpIHtcbiAgICAgIGV2ZW50ID0gZXZlbnQudG91Y2hlc1swXTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHBhZ2UgPyBldmVudC5wYWdlWCA6IGV2ZW50LmNsaWVudFgsXG4gICAgICB5OiBwYWdlID8gZXZlbnQucGFnZVkgOiBldmVudC5jbGllbnRZXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBvZmZzZXQgZm9yIGRpc3BsYXlpbmcgdGhlIGRyYWcgY29weSB0byBoYXZlIGEgc2VhbWxlc3MgZHJhZ2dpbmcuXG4gICAqIEBwYXJhbSB7VG91Y2h9IHRvdWNoIFRoZSBjdXJyZW50IHRvdWNoLlxuICAgKi9cbiAgcHJpdmF0ZSBfY2FsY3VsYXRlRHJhZ0NvcHlQb3NpdGlvbih0b3VjaCkge1xuICAgIGNvbnN0IGNsaWVudFJlY3QgPSB0aGlzLl9kcmFnU3JjLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHRoaXMuX2NvcHlPZmZzZXQueCA9IHRvdWNoLmNsaWVudFggLSBjbGllbnRSZWN0LmxlZnQ7XG4gICAgdGhpcy5fY29weU9mZnNldC55ID0gdG91Y2guY2xpZW50WSAtIGNsaWVudFJlY3QudG9wO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIHBpeGVsIGRlbHRhIGJldHdlZW4gZmlyc3QgdG91Y2ggYW5kIHRoZSBjdXJyZW50IHRvdWNoIHBvc2l0aW9uLlxuICAgKiBAcGFyYW0ge09iamVjdH0gdG91Y2hcbiAgICovXG4gIHByaXZhdGUgX2dldERlbHRhKHRvdWNoKSB7XG4gICAgY29uc3QgeCA9IE1hdGguYWJzKHRvdWNoLmNsaWVudFggLSB0aGlzLl90b3VjaERvd24ueCk7XG4gICAgY29uc3QgeSA9IE1hdGguYWJzKHRvdWNoLmNsaWVudFkgLSB0aGlzLl90b3VjaERvd24ueSk7XG5cbiAgICByZXR1cm4geCArIHk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlIFRoZSBldmVudCdzIHRhcmdldCBlbGVtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRUeXBlIFRoZSB0eXBlIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIHtib29sfSBidWJibGUgU2V0cyB3aGV0aGVyIHRoZSBldmVudCBzaG91bGQgYnViYmxlLlxuICAgKi9cbiAgcHJpdmF0ZSBfZGlzcGF0Y2hFdmVudChlLCBldmVudFR5cGUsIGJ1YmJsZSA9IHRydWUpIHtcbiAgICBpZiAoIWUpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50VHlwZSwgeyBidWJibGVzOiBidWJibGUsIGNhbmNlbGFibGU6IHRydWUgfSk7XG4gICAgZXZlbnRbJ2RhdGFUcmFuc2ZlciddID0gdGhpcy5fZGF0YVRyYW5zZmVyO1xuICAgIGUuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgcmV0dXJuIGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIGFsbCB2YXJpYWJsZXMgYW5kIHByZXBhcmVzIGZvciBuZXcgRHJhZyBhbmQgRHJvcC5cbiAgICovXG4gIHByaXZhdGUgX3Jlc2V0KCkge1xuICAgIGlmICh0aGlzLl9kcmFnUnVubmluZykge1xuICAgICAgdGhpcy5fZHJhZ1NyYy5zdHlsZS5vcGFjaXR5ID0gJzEuMCc7XG4gICAgICB0aGlzLl9kcmFnQ29weS5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMuX2RyYWdDb3B5KTtcbiAgICB9XG5cbiAgICB0aGlzLl9kcmFnUnVubmluZyA9IGZhbHNlO1xuICAgIHRoaXMuX2RyYWdTcmMgPSBudWxsO1xuICAgIHRoaXMuX2RyYWdDb3B5ID0gbnVsbDtcbiAgICB0aGlzLl9jYW5EcmFnID0gZmFsc2U7XG5cbiAgICB0aGlzLl90b3VjaEJlZ2luID0gMDtcbiAgICB0aGlzLl90b3VjaERvd24gPSBudWxsO1xuICAgIHRoaXMuX2xhc3RDbGljayA9IDA7XG4gICAgdGhpcy5fdG91Y2hFbmRDYWxsZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9kYXRhVHJhbnNmZXIgPSB7XG4gICAgICBkYXRhOiB7fSxcbiAgICAgIHNldERhdGE6IGZ1bmN0aW9uICh0eXBlLCB2YWwpIHtcbiAgICAgICAgdGhpcy5kYXRhW3R5cGVdID0gdmFsO1xuICAgICAgfSxcbiAgICAgIGdldERhdGE6IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFbdHlwZV07XG4gICAgICB9LFxuICAgICAgZWZmZWN0QWxsb3dlZDogJ21vdmUnXG4gICAgfTtcbiAgICB0aGlzLl9jb3B5T2Zmc2V0ID0geyB4OiAwLCB5OiAwIH07XG5cbiAgICB0aGlzLl9sYXN0VGFyZ2V0ID0gbnVsbDtcbiAgICB0aGlzLl9jdXJyZW50RHJvcENvbnRhaW5lciA9IG51bGw7XG4gICAgdGhpcy5faGFuZGxlQ2xpY2sgPSB0cnVlO1xuICB9XG5cbiAgLy8gcHJpdmF0ZSBfZ2V0UG9zaXRpb25Gcm9tRXZlbnQoZTogYW55KToge1xuICAvLyAgIHg6IG51bWJlcjtcbiAgLy8gICB5OiBudW1iZXI7XG4gIC8vIH0ge1xuICAvLyAgIGxldCBfdG91Y2hNb3ZlO1xuICAvLyAgIGlmIChlLnR5cGUgPT0gJ3RvdWNoc3RhcnQnIHx8IGUudHlwZSA9PSAndG91Y2htb3ZlJyB8fCBlLnR5cGUgPT0gJ3RvdWNoZW5kJyB8fCBlLnR5cGUgPT0gJ3RvdWNoY2FuY2VsJykge1xuICAvLyAgICAgY29uc3QgZXZ0ID0gdHlwZW9mIGUub3JpZ2luYWxFdmVudCA9PT0gJ3VuZGVmaW5lZCcgPyBlIDogZS5vcmlnaW5hbEV2ZW50O1xuICAvLyAgICAgY29uc3QgdG91Y2ggPSBldnQudG91Y2hlc1swXSB8fCBldnQuY2hhbmdlZFRvdWNoZXNbMF07XG4gIC8vICAgICBfdG91Y2hNb3ZlID0ge1xuICAvLyAgICAgICB4OiB0b3VjaC5wYWdlWCxcbiAgLy8gICAgICAgeTogdG91Y2gucGFnZVlcbiAgLy8gICAgIH07XG4gIC8vICAgfSBlbHNlIGlmIChcbiAgLy8gICAgIGUudHlwZSA9PSAnbW91c2Vkb3duJyB8fFxuICAvLyAgICAgZS50eXBlID09ICdtb3VzZXVwJyB8fFxuICAvLyAgICAgZS50eXBlID09ICdtb3VzZW1vdmUnIHx8XG4gIC8vICAgICBlLnR5cGUgPT0gJ21vdXNlb3ZlcicgfHxcbiAgLy8gICAgIGUudHlwZSA9PSAnbW91c2VvdXQnIHx8XG4gIC8vICAgICBlLnR5cGUgPT0gJ21vdXNlZW50ZXInIHx8XG4gIC8vICAgICBlLnR5cGUgPT0gJ21vdXNlbGVhdmUnXG4gIC8vICAgKSB7XG4gIC8vICAgICBfdG91Y2hNb3ZlID0ge1xuICAvLyAgICAgICB4OiBlLmNsaWVudFgsXG4gIC8vICAgICAgIHk6IGUuY2xpZW50WVxuICAvLyAgICAgfTtcbiAgLy8gICB9XG4gIC8vICAgcmV0dXJuIF90b3VjaE1vdmU7XG4gIC8vIH1cbn1cbiIsICJpbXBvcnQgeyBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG50eXBlIENvbnN0cnVjdG9yPFQ+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuZGVjbGFyZSBjbGFzcyBEcm9wcGFibGVzSW50ZXJmYWNlIHt9XG5cbi8vIGh0dHBzOi8vbmctcnVuLmNvbS9lZGl0LzlNR3I1ZFlXQTIwQWlKdHB5NWF6P29wZW49YXBwJTJGYXBwLmNvbXBvbmVudC5odG1sXG5leHBvcnQgY29uc3QgRHJvcHBhYmxlc01peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxMaXRFbGVtZW50Pj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4gIGRyb3BwYWJsZXNJblNoYWRvd1Jvb3Q6IGJvb2xlYW4sXG4gIGRyb3BwYWJsZXNTZWxlY3Rvcjogc3RyaW5nXG4pID0+IHtcbiAgY2xhc3MgRHJvcHBhYmxlc0VsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIHtcbiAgICBwcml2YXRlIG9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyO1xuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSB9KSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcyk6IHZvaWQge1xuICAgICAgLy8gZm9yIHF0aS1tYXRjaC1pbnRlcmFjdGlvbiB0aGUgZHJhZyBpbnRlcmFjdGlvbiBjYW4gYmUgcmVwbGFjZSB3aXRoIGEgcXRpLW1hdGNoLXRhYnVsYXIgY2xhc3NcbiAgICAgIC8vIHdoaWNoIHNob3dzIHRoZSBkYXRhIGluIGEgYSB0YWJ1bGFyIHdheSwgc28gbm8gZHJhZyBkcm9wIHNob3VsZCBiZSBpbnZvbHZlZCB0aGVuXG4gICAgICBpZiAodGhpcy5jbGFzc0xpc3QuY29udGFpbnMoJ3F0aS1tYXRjaC10YWJ1bGFyJykpIHJldHVybjtcblxuICAgICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcyk7XG5cbiAgICAgIGNvbnN0IGRyb3BwYWJsZXMgPSBBcnJheS5mcm9tKFxuICAgICAgICBkcm9wcGFibGVzSW5TaGFkb3dSb290XG4gICAgICAgICAgPyB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbChkcm9wcGFibGVzU2VsZWN0b3IpXG4gICAgICAgICAgOiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbGVjdG9yKVxuICAgICAgKTtcblxuICAgICAgdGhpcy5kcmFnb3ZlckhhbmRsZXIgPSB0aGlzLmRyYWdvdmVySGFuZGxlci5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5kcmFnbGVhdmVIYW5kbGVyID0gdGhpcy5kcmFnbGVhdmVIYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLmRyYWdlbnRlckhhbmRsZXIgPSB0aGlzLmRyYWdlbnRlckhhbmRsZXIuYmluZCh0aGlzKTtcblxuICAgICAgdGhpcy5kcm9wSGFuZGxlciA9IHRoaXMuZHJvcEhhbmRsZXIuYmluZCh0aGlzKTtcblxuICAgICAgZHJvcHBhYmxlcy5mb3JFYWNoKGQgPT4ge1xuICAgICAgICBkLnNldEF0dHJpYnV0ZSgnZHJvcHpvbmUnLCAnbW92ZScpO1xuICAgICAgICBkLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIHRoaXMuZHJhZ2xlYXZlSGFuZGxlcik7XG5cbiAgICAgICAgdGhpcy5hdHRhY2hIYW5kbGVyKGQpO1xuICAgICAgfSk7XG4gICAgICBmb3IgKGNvbnN0IGRyb3BwYWJsZSBvZiBkcm9wcGFibGVzKSB7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihtdXRhdGlvbnMgPT4ge1xuICAgICAgICAgIG11dGF0aW9ucy5mb3JFYWNoKG11dGF0aW9uID0+IHtcbiAgICAgICAgICAgIGlmIChtdXRhdGlvbi50eXBlID09PSAnYXR0cmlidXRlcycpIHtcbiAgICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSBtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lO1xuICAgICAgICAgICAgICBzd2l0Y2ggKHByb3BOYW1lKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZGlzYWJsZWQnOiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBkaXNhYmxlZCA9IGRyb3BwYWJsZS5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXR0YWNoSGFuZGxlcihkcm9wcGFibGUpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVIYW5kbGVyKGRyb3BwYWJsZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZShkcm9wcGFibGUsIHtcbiAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlIC8vY29uZmlndXJlIGl0IHRvIGxpc3RlbiB0byBhdHRyaWJ1dGUgY2hhbmdlc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGF0dGFjaEhhbmRsZXIoZHJvcHBhYmxlOiBFbGVtZW50KSB7XG4gICAgICBkcm9wcGFibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmRyYWdvdmVySGFuZGxlcik7XG4gICAgICBkcm9wcGFibGUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgdGhpcy5kcmFnZW50ZXJIYW5kbGVyKTtcbiAgICAgIGRyb3BwYWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5kcm9wSGFuZGxlcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVIYW5kbGVyKGRyb3BwYWJsZTogRWxlbWVudCkge1xuICAgICAgZHJvcHBhYmxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5kcmFnb3ZlckhhbmRsZXIpO1xuICAgICAgZHJvcHBhYmxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdlbnRlcicsIHRoaXMuZHJhZ2VudGVySGFuZGxlcik7XG4gICAgICBkcm9wcGFibGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMuZHJvcEhhbmRsZXIpO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgLy8gZm9yIHF0aS1tYXRjaC1pbnRlcmFjdGlvbiB0aGUgZHJhZyBpbnRlcmFjdGlvbiBjYW4gYmUgcmVwbGFjZSB3aXRoIGEgcXRpLW1hdGNoLXRhYnVsYXIgY2xhc3NcbiAgICAgIC8vIHdoaWNoIHNob3dzIHRoZSBkYXRhIGluIGEgYSB0YWJ1bGFyIHdheSwgc28gbm8gZHJhZyBkcm9wIHNob3VsZCBiZSBpbnZvbHZlZCB0aGVuXG4gICAgICBpZiAodGhpcy5jbGFzc0xpc3QuY29udGFpbnMoJ3F0aS1tYXRjaC10YWJ1bGFyJykpIHJldHVybjtcblxuICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAgIHRoaXMub2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcbiAgICB9XG5cbiAgICBkcmFnZW50ZXJIYW5kbGVyKGV2OiBEcmFnRXZlbnQpIHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgZHJhZ292ZXJIYW5kbGVyKGV2OiBEcmFnRXZlbnQpIHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBkcm9wcGFibGUgPSBldi5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgLy8gZHJvcHBhYmxlc0luU2hhZG93Um9vdFxuICAgICAgLy8gPyBkcm9wcGFibGUuc2V0QXR0cmlidXRlKCdwYXJ0JywgZHJvcHBhYmxlLmdldEF0dHJpYnV0ZSgncGFydCcpICsgJyBhY3RpdmUnKSA6XG4gICAgICBkcm9wcGFibGUuc2V0QXR0cmlidXRlKCdhY3RpdmUnLCAnJyk7XG5cbiAgICAgIGV2LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ21vdmUnO1xuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZHJvcEhhbmRsZXIoZXY6IERyYWdFdmVudCkge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGRyb3BwYWJsZSA9IGV2LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAvLyBwazogZHJhZ2dhYmxlcyBpbiBsaWdodCBkb20gY2FuIGJlIGRyYWdnZWQgdG8gc2hhZG93ZG9tLCB0aGlzIGlzIG9uZSBvZiB0aGUgcnVsZXMgb2Ygd2ViY29tcG9uZW50cy5cbiAgICAgIC8vIFRoZXkgbWF5IG5vdCBjcmVhdGUgbmV3IGVsZW1lbnRzIGluIGxpZ2h0IGRvbS4gU29tZSBzb21ldGltZXNzIGRyb3Agem9uZXMgc2hvdWxkIGJlIGdlbmVyYXRlZFxuICAgICAgLy8gYnkgdGhlIHdlYmNvbXBvbmVudC4gVGhlbiBhIGRyYWdnYWJsZSAoIHdoaWNoIGlzIGFsd2F5cyBhbHJlYWR5IGNyZWF0ZWQgYnkgYSB3ZWJjb21wb25lbnQgKVxuICAgICAgLy8gY2FuIGJlIGluIGxpZ2h0IGRvbSwgZW4gY2FuIGJlIGRyYWdnZWQgdG8gc2hhZG93IGRvbS5cbiAgICAgIC8vIHRoaW5raW5nIG9mIGFub3RoZXIgd2F5IHdoZXJlIHdlIGp1c3QgY2hhbmdlIHNsb3RzLiBNYXliZSB0aGF0cyBiZXR0ZXIuLlxuICAgICAgY29uc3QgZHJhZ2dhYmxlSW5MaWdodERvbSA9IHRoaXMucXVlcnlTZWxlY3RvcihgW2lkZW50aWZpZXI9JHtldi5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgndGV4dCcpfWApO1xuICAgICAgY29uc3QgZHJhZ2dhYmxlID0gZHJhZ2dhYmxlSW5MaWdodERvbVxuICAgICAgICA/IGRyYWdnYWJsZUluTGlnaHREb21cbiAgICAgICAgOiB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihgW2lkZW50aWZpZXI9JHtldi5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgndGV4dCcpfWApO1xuXG4gICAgICBpZiAoIWRyb3BwYWJsZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBjYW5ub3QgZmluZCBkcm9wcGFibGUsIHRhcmdldDogJHtldi50YXJnZXQgPyBKU09OLnN0cmluZ2lmeShldi50YXJnZXQpIDogJ251bGwnfWApO1xuICAgICAgfSBlbHNlIGlmIChkcmFnZ2FibGUucGFyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSAhPT0gZHJvcHBhYmxlLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpKSB7XG4gICAgICAgIGRyb3BwYWJsZS5hcHBlbmRDaGlsZChkcmFnZ2FibGUpO1xuICAgICAgfVxuICAgICAgLy8gZHJvcHBhYmxlc0luU2hhZG93Um9vdFxuICAgICAgLy8gPyBkcm9wcGFibGUuc2V0QXR0cmlidXRlKCdwYXJ0JywgZHJvcHBhYmxlLmdldEF0dHJpYnV0ZSgncGFydCcpLnJlcGxhY2UoJ2FjdGl2ZScsICcnKS50cmltKCkpIDpcbiAgICAgIGRyb3BwYWJsZS5yZW1vdmVBdHRyaWJ1dGUoJ2FjdGl2ZScpO1xuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZHJhZ2xlYXZlSGFuZGxlcihldjogRHJhZ0V2ZW50KSB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBjb25zdCBkcm9wcGFibGUgPSBldi5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgZHJvcHBhYmxlLnJlbW92ZUF0dHJpYnV0ZSgnYWN0aXZlJyk7XG4gICAgICBldi5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdub25lJztcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gRHJvcHBhYmxlc0VsZW1lbnQgYXMgQ29uc3RydWN0b3I8RHJvcHBhYmxlc0ludGVyZmFjZT4gJiBUO1xufTtcbiIsICIvLyBUSElTIElTIEEgTUlYSU4sIFRISVMgSVMgQSBNSVhJTlxuLy8gVVNFIExJS0UgVEhJU1xuLy8gYGBgY2xhc3MgRHJvcExpc3QgZXh0ZW5kcyBGbGlwcGFibGVzKExpdEVsZW1lbnQpIHtgYGBcbi8vIG1peGluIHdoaWNoIGFuaW1hdGVzIGNoaWxkcmVuIHdpdGggRkxJUFxuLy8gYSBjb21iaW5hdGlvbiBiZXR3ZWVuIHRoaXMgZGlyZWN0aXZlOlxuLy8gaHR0cHM6Ly9uZy1ydW4uY29tL2VkaXQvOU1HcjVkWVdBMjBBaUp0cHk1YXo/b3Blbj1hcHAlMkZhcHAuY29tcG9uZW50Lmh0bWxcbi8vIGFuZCBhIHR1dG9yaWFsIGhvdyB0byBtYWtlIGEgbWl4aW5cbi8vIGh0dHBzOi8vbGl0LmRldi9kb2NzL2NvbXBvc2l0aW9uL21peGlucy9cblxuaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5cbnR5cGUgQ29uc3RydWN0b3I8VD4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUO1xuXG5leHBvcnQgZGVjbGFyZSBjbGFzcyBGbGlwcGFibGVzSW50ZXJmYWNlIHtcbiAgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZDtcbiAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZDtcbn1cblxuLy8ganVzdCBhIGNvbnZlcnNpb24gb2YgYSBhbmd1bGFyIEZMSVAgZGlyZWN0aXZlLCBtYWRlIGFzIGEgTWl4aW5cbi8vIGh0dHBzOi8vbmctcnVuLmNvbS9lZGl0LzlNR3I1ZFlXQTIwQWlKdHB5NWF6P29wZW49YXBwJTJGYXBwLmNvbXBvbmVudC5odG1sXG5leHBvcnQgY29uc3QgRmxpcHBhYmxlc01peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxMaXRFbGVtZW50Pj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4gIGRyb3BwYWJsZXNTZWw6IHN0cmluZyxcbiAgZHJhZ2dhYmxlc1NlbDogc3RyaW5nXG4pID0+IHtcbiAgY2xhc3MgRmxpcHBhYmxlc0VsZW1lbnQgZXh0ZW5kcyBzdXBlckNsYXNzIHtcbiAgICAvLyBwcml2YXRlIHN0YXRlID0gbmV3IE1hcDxFbGVtZW50LCBhbnk+KCk7XG4gICAgLy8gcHJpdmF0ZSBvYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcbiAgICAvLyBmbGlwcGFibGVzU2VsZWN0b3I6IHN0cmluZztcbiAgICAvLyBvdmVycmlkZSBhc3luYyBmaXJzdFVwZGF0ZWQoY2hhbmdlZFByb3BzKSB7XG4gICAgLy8gICBhd2FpdCB0aGlzLnVwZGF0ZUNvbXBsZXRlOyAvLyBwazogdGhpcyBpcyB0aGUga2V5IHRvIGNhbGN1bGF0ZSBjb3JyZWN0IHByb3BvcnRpb25zXG4gICAgLy8gICBjb25zdCBkcmFnZ2FibGVzID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoZHJhZ2dhYmxlc1NlbCkpO1xuICAgIC8vICAgZHJhZ2dhYmxlcy5mb3JFYWNoKChlbGVtKSA9PiB7XG4gICAgLy8gICAgIGNvbnN0IHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0gPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIC8vICAgICB0aGlzLnN0YXRlLnNldChlbGVtLCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9KTtcbiAgICAvLyAgIH0pO1xuICAgIC8vICAgdGhpcy5vYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKHRoaXMuYW5pbWF0ZU1lKTtcbiAgICAvLyAgIGNvbnN0IGRyb3BwYWJsZXMgPSBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbChkcm9wcGFibGVzU2VsKSk7XG4gICAgLy8gICBkcm9wcGFibGVzLmZvckVhY2goKGRyYWdnYWJsZSkgPT4ge1xuICAgIC8vICAgICB0aGlzLm9ic2VydmVyLm9ic2VydmUoZHJhZ2dhYmxlLCB7IGNoaWxkTGlzdDogdHJ1ZSB9KTtcbiAgICAvLyAgIH0pO1xuICAgIC8vICAgdGhpcy5vYnNlcnZlci5vYnNlcnZlKHRoaXMsIHsgY2hpbGRMaXN0OiB0cnVlIH0pO1xuICAgIC8vICAgc3VwZXIuZmlyc3RVcGRhdGVkKGNoYW5nZWRQcm9wcyk7XG4gICAgLy8gfVxuICAgIC8vIHByaXZhdGUgYW5pbWF0ZU1lID0gKCkgPT4ge1xuICAgIC8vICAgdGhpcy5zdGF0ZS5mb3JFYWNoKCh2YWx1ZSwgZWxlbSkgPT4ge1xuICAgIC8vICAgICBjb25zdCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAvLyAgICAgaWYgKHRoaXMuc3RhdGUuZ2V0KGVsZW0pID09IG51bGwpIHtcbiAgICAvLyAgICAgICB0aGlzLnN0YXRlLnNldChlbGVtLCB7IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCB9KTtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgICBjb25zdCBjYWNoZSA9IHRoaXMuc3RhdGUuZ2V0KGVsZW0pO1xuICAgIC8vICAgICBjb25zdCBkZWx0YVggPSBjYWNoZS5sZWZ0IC0gbGVmdDtcbiAgICAvLyAgICAgY29uc3QgZGVsdGFZID0gY2FjaGUudG9wIC0gdG9wO1xuICAgIC8vICAgICBjb25zdCBkZWx0YVcgPSBjYWNoZS53aWR0aCAvIHdpZHRoO1xuICAgIC8vICAgICBjb25zdCBkZWx0YUggPSBjYWNoZS5oZWlnaHQgLyBoZWlnaHQ7XG4gICAgLy8gICAgIHRoaXMuc3RhdGUuc2V0KGVsZW0sIHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgIC8vICAgICBjb25zdCB7IGR1cmF0aW9uLCBlYXNpbmcgfSA9IHsgZHVyYXRpb246IDM1MCwgZWFzaW5nOiAnY3ViaWMtYmV6aWVyKDAuMjYsIDAuODYsIDAuNDQsIDAuOTg1KScgfTtcbiAgICAvLyAgICAgZWxlbS5hbmltYXRlKFxuICAgIC8vICAgICAgIFtcbiAgICAvLyAgICAgICAgIHtcbiAgICAvLyAgICAgICAgICAgdHJhbnNmb3JtT3JpZ2luOiAndG9wIGxlZnQnLFxuICAgIC8vICAgICAgICAgICB0cmFuc2Zvcm06IGBcbiAgICAvLyB0cmFuc2xhdGUoJHtkZWx0YVh9cHgsICR7ZGVsdGFZfXB4KVxuICAgIC8vIHNjYWxlKCR7ZGVsdGFXfSwgJHtkZWx0YUh9KVxuICAgIC8vIGAsXG4gICAgLy8gICAgICAgICAgIC8vIHdpZHRoOiBjYWNoZS53aWR0aCxcbiAgICAvLyAgICAgICAgICAgLy8gaGVpZ2h0OiBjYWNoZS5oZWlnaHQrICdweCcsXG4gICAgLy8gICAgICAgICAgIC8vIG9wYWNpdHk6IGNhY2hlLm9wYWNpdHksXG4gICAgLy8gICAgICAgICB9LFxuICAgIC8vICAgICAgICAge1xuICAgIC8vICAgICAgICAgICB0cmFuc2Zvcm1PcmlnaW46ICd0b3AgbGVmdCcsXG4gICAgLy8gICAgICAgICAgIHRyYW5zZm9ybTogJ25vbmUnLFxuICAgIC8vICAgICAgICAgfSxcbiAgICAvLyAgICAgICBdLFxuICAgIC8vICAgICAgIHtcbiAgICAvLyAgICAgICAgIGR1cmF0aW9uLFxuICAgIC8vICAgICAgICAgZWFzaW5nLFxuICAgIC8vICAgICAgIH1cbiAgICAvLyAgICAgKTtcbiAgICAvLyAgIH0pO1xuICAgIC8vIH07XG4gICAgLy8gb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgLy8gICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIC8vICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgLy8gfVxuICB9XG4gIHJldHVybiBGbGlwcGFibGVzRWxlbWVudCBhcyBDb25zdHJ1Y3RvcjxGbGlwcGFibGVzSW50ZXJmYWNlPiAmIFQ7XG59O1xuIiwgImltcG9ydCB7IExpdEVsZW1lbnQgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgSUludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IERyb3BwYWJsZXNNaXhpbiB9IGZyb20gJy4vZHJvcHBhYmxlcy1taXhpbic7XG5pbXBvcnQgeyBGbGlwcGFibGVzTWl4aW4gfSBmcm9tICcuL2ZsaXBwYWJsZXMtbWl4aW4nO1xuXG5pbXBvcnQgeyBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IGxpdmVRdWVyeSB9IGZyb20gJy4uLy4uLy4uLy4uL2RlY29yYXRvcnMvbGl2ZS1xdWVyeSc7XG5pbXBvcnQgeyB3YXRjaCB9IGZyb20gJy4uLy4uLy4uLy4uL2RlY29yYXRvcnMvd2F0Y2gnO1xuaW1wb3J0IHsgVG91Y2hEcmFnQW5kRHJvcCB9IGZyb20gJy4vZHJhZy1kcm9wLWFwaSc7XG4vLyBrZXlib2FyZCBuYXZpZ2F0YWJsZSBkcmFnIGRyb3A6IGh0dHBzOi8vY29kZXBlbi5pby9TaXRlUG9pbnQvcGVuL3ZFelhialxuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNTUyNDIxOTYvdHlwZXNjcmlwdC1hbGxvd3MtdG8tdXNlLXByb3Blci1tdWx0aXBsZS1pbmhlcml0YW5jZS13aXRoLW1peGlucy1idXQtZmFpbHMtdG8tY1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xNzc0NCNpc3N1ZWNvbW1lbnQtNTU4OTkwMzgxXG4vLyBodHRwczovL25nLXJ1bi5jb20vZWRpdC85TUdyNWRZV0EyMEFpSnRweTVhej9vcGVuPWFwcCUyRmFwcC5jb21wb25lbnQuaHRtbFxuXG50eXBlIENvbnN0cnVjdG9yPFQ+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcblxuaW50ZXJmYWNlIEludGVyYWN0aW9uQ29uZmlndXJhdGlvbiB7XG4gIGNvcHlTdHlsZXNEcmFnQ2xvbmU6IGJvb2xlYW47XG4gIGRyYWdDYW5CZVBsYWNlZEJhY2s6IGJvb2xlYW47XG4gIGRyYWdPbkNsaWNrOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluID0gPFQgZXh0ZW5kcyBDb25zdHJ1Y3RvcjxMaXRFbGVtZW50Pj4oXG4gIHN1cGVyQ2xhc3M6IFQsXG4gIGRyYWdnYWJsZXNTZWxlY3Rvcjogc3RyaW5nLFxuICBkcm9wcGFibGVzSW5TaGFkb3dSb290OiBib29sZWFuLFxuICBkcm9wcGFibGVzU2VsZWN0b3I6IHN0cmluZ1xuKSA9PiB7XG4gIGNsYXNzIERyYWdEcm9wSW50ZXJhY3Rpb25FbGVtZW50IGV4dGVuZHMgRmxpcHBhYmxlc01peGluKFxuICAgIERyb3BwYWJsZXNNaXhpbihzdXBlckNsYXNzLCBkcm9wcGFibGVzSW5TaGFkb3dSb290LCBkcm9wcGFibGVzU2VsZWN0b3IpLFxuICAgIGRyb3BwYWJsZXNTZWxlY3RvcixcbiAgICBkcmFnZ2FibGVzU2VsZWN0b3JcbiAgKSB7XG4gICAgcHJvdGVjdGVkIGRyYWdnYWJsZXMgPSBuZXcgTWFwPEVsZW1lbnQsIHsgcGFyZW50OiBFbGVtZW50OyBpbmRleDogbnVtYmVyIH0+KCk7XG4gICAgcHJvdGVjdGVkIGRyb3BwYWJsZXM6IEVsZW1lbnRbXTtcbiAgICBkcmFnRHJvcEFwaTogVG91Y2hEcmFnQW5kRHJvcDtcblxuICAgIEBsaXZlUXVlcnkoZHJhZ2dhYmxlc1NlbGVjdG9yKVxuICAgIHJlSW5pdERyYWdBbmREcm9wKGRyYWdzQWRkZWQ6IEVsZW1lbnRbXSwgZHJhZ3NSZW1vdmVkOiBFbGVtZW50W10pIHtcbiAgICAgIGlmICh0aGlzLmNsYXNzTGlzdC5jb250YWlucygncXRpLW1hdGNoLXRhYnVsYXInKSkgcmV0dXJuO1xuXG4gICAgICAvLyBjaGVjayBpZiBhZGRlZCBlbGVtZW50cyBhcmUgbm90IGFscmVhZHkgaW4gbGlzdFxuICAgICAgY29uc3QgZHJhZ2dhYmxlcyA9IGRyYWdzQWRkZWQuZmlsdGVyKGQgPT4gIXRoaXMuZHJhZ2dhYmxlcyB8fCAhdGhpcy5kcmFnZ2FibGVzLmdldChkKSk7XG5cbiAgICAgIGlmIChkcmFnZ2FibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5kcmFnRHJvcEFwaS5hZGREcmFnZ2FibGVzKGRyYWdzQWRkZWQpO1xuXG4gICAgICAgIGRyYWdzQWRkZWQuZm9yRWFjaChlbGVtID0+IHtcbiAgICAgICAgICAvLyBzdG9yZSBpbml0aWFsIHBvc2l0aW9ucyBvZiBlbGVtZW50cywgYW5kIG9mIGNvdXJzZSwganVzdCB0aGUgZWxlbWVudHMgZm9yIGxvb3BpbmcgYW5kIHN1Y2hcbiAgICAgICAgICB0aGlzLmRyYWdnYWJsZXMuc2V0KGVsZW0sIHtcbiAgICAgICAgICAgIHBhcmVudDogZWxlbS5wYXJlbnRFbGVtZW50LFxuICAgICAgICAgICAgaW5kZXg6IEFycmF5LmZyb20oZWxlbS5wYXJlbnROb2RlLmNoaWxkcmVuKS5pbmRleE9mKGVsZW0pXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoJ3F0aS1kcmFnZ2FibGUnLCAndHJ1ZScpO1xuICAgICAgICAgIGVsZW0uYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgdGhpcy5oYW5kbGVEcmFnU3RhcnQpO1xuICAgICAgICAgIGVsZW0uYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VuZCcsIHRoaXMuaGFuZGxlRHJhZ0VuZCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAncmVzcG9uc2UtaWRlbnRpZmllcicgfSkgcmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmcgPSAnJztcblxuICAgIEBwcm9wZXJ0eSh7IGF0dHJpYnV0ZTogZmFsc2UsIHR5cGU6IE9iamVjdCB9KSBjb25maWd1cmF0aW9uOiBJbnRlcmFjdGlvbkNvbmZpZ3VyYXRpb24gPSB7XG4gICAgICBjb3B5U3R5bGVzRHJhZ0Nsb25lOiB0cnVlLFxuICAgICAgZHJhZ0NhbkJlUGxhY2VkQmFjazogdHJ1ZSxcbiAgICAgIGRyYWdPbkNsaWNrOiBmYWxzZVxuICAgIH07XG4gICAgQHdhdGNoKCdjb25maWd1cmF0aW9uJylcbiAgICBoYW5kbGVEcmFnT3B0aW9uc0NoYW5nZWQob2xkLCBkcmFnT3B0aW9ucykge1xuICAgICAgdGhpcy5kcmFnRHJvcEFwaS5jb3B5U3R5bGVzRHJhZ0Nsb25lID0gZHJhZ09wdGlvbnMuY29weVN0eWxlc0RyYWdDbG9uZTtcbiAgICAgIHRoaXMuZHJhZ0Ryb3BBcGkuZHJhZ09uQ2xpY2sgPSBkcmFnT3B0aW9ucy5kcmFnT25DbGljaztcbiAgICB9XG5cbiAgICBAcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlIH0pIGRpc2FibGVkID0gZmFsc2U7XG4gICAgQHdhdGNoKCdkaXNhYmxlZCcsIHsgd2FpdFVudGlsRmlyc3RVcGRhdGU6IHRydWUgfSlcbiAgICBoYW5kbGVEaXNhYmxlZENoYW5nZShvbGQsIGRpc2FibGVkOiBib29sZWFuKSB7XG4gICAgICB0aGlzLmRyYWdnYWJsZXMuZm9yRWFjaCgocywgY2gpID0+IHtcbiAgICAgICAgZGlzYWJsZWQgPyBjaC5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpIDogY2gucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgICBkaXNhYmxlZCA/IGNoLnJlbW92ZUF0dHJpYnV0ZSgncXRpLWRyYWdnYWJsZScpIDogY2guc2V0QXR0cmlidXRlKCdxdGktZHJhZ2dhYmxlJywgJ3RydWUnKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSkgcmVhZG9ubHkgPSBmYWxzZTtcbiAgICBAd2F0Y2goJ3JlYWRvbmx5JywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICAgIGhhbmRsZVJlYWRvbmx5Q2hhbmdlKG9sZCwgcmVhZG9ubHk6IGJvb2xlYW4pIHtcbiAgICAgIHRoaXMuZHJhZ2dhYmxlcy5mb3JFYWNoKChzLCBjaCkgPT4ge1xuICAgICAgICByZWFkb25seSA/IGNoLnNldEF0dHJpYnV0ZSgncmVhZG9ubHknLCAnJykgOiBjaC5yZW1vdmVBdHRyaWJ1dGUoJ3JlYWRvbmx5Jyk7XG4gICAgICAgIHJlYWRvbmx5ID8gY2gucmVtb3ZlQXR0cmlidXRlKCdxdGktZHJhZ2dhYmxlJykgOiBjaC5zZXRBdHRyaWJ1dGUoJ3F0aS1kcmFnZ2FibGUnLCAndHJ1ZScpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlLCBhdHRyaWJ1dGU6ICdtaW4tYXNzb2NpYXRpb25zJyB9KSBtaW5Bc3NvY2lhdGlvbnMgPSAxO1xuICAgIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSwgYXR0cmlidXRlOiAnbWF4LWFzc29jaWF0aW9ucycgfSkgbWF4QXNzb2NpYXRpb25zID0gMTtcblxuICAgIG92ZXJyaWRlIGZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpOiB2b2lkIHtcbiAgICAgIHN1cGVyLmZpcnN0VXBkYXRlZChjaGFuZ2VkUHJvcHMpO1xuICAgICAgdGhpcy5kcm9wcGFibGVzID0gQXJyYXkuZnJvbShcbiAgICAgICAgZHJvcHBhYmxlc0luU2hhZG93Um9vdFxuICAgICAgICAgID8gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbGVjdG9yKVxuICAgICAgICAgIDogdGhpcy5xdWVyeVNlbGVjdG9yQWxsKGRyb3BwYWJsZXNTZWxlY3RvcilcbiAgICAgICk7XG4gICAgICAvLyBQSzogTWF5YmUgbGF0ZXIsIGZvciBub3cgd2UgYXNzdW1lIGRyb3BwYWJsZXMgYXJlIG5vdCBkeW5hbWljbHkgYWRkZWQgb3IgcmVtb3ZlZFxuICAgICAgLy8gLmZpbHRlcigoZWxlbSkgPT4gIXRoaXMuZHJvcHBhYmxlcyB8fCAhdGhpcy5kcm9wcGFibGVzLmluY2x1ZGVzKGVsZW0pKTtcbiAgICAgIC8vIHRoaXMuZHJvcHBhYmxlcyA9IHRoaXMuZHJvcHBhYmxlcyA/IHRoaXMuZHJvcHBhYmxlcy5jb25jYXQobmV3RHJvcHBhYmxlcykgOiBuZXdEcm9wcGFibGVzO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgICAgdGhpcy5kcmFnRHJvcEFwaSA9IG5ldyBUb3VjaERyYWdBbmREcm9wKCk7XG5cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IEN1c3RvbUV2ZW50PERyYWdEcm9wSW50ZXJhY3Rpb25FbGVtZW50PigncXRpLXJlZ2lzdGVyLWludGVyYWN0aW9uJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiB0aGlzXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlRHJhZ1N0YXJ0ID0gKGV2OiBhbnkpID0+IHtcbiAgICAgIGV2LmRhdGFUcmFuc2Zlci5zZXREYXRhKCd0ZXh0JywgZXYuY3VycmVudFRhcmdldC5nZXRBdHRyaWJ1dGUoYGlkZW50aWZpZXJgKSk7XG4gICAgICBldi5jdXJyZW50VGFyZ2V0LnNldEF0dHJpYnV0ZSgnZHJhZ2dpbmcnLCAnJyk7XG5cbiAgICAgIC8vIGhpZ2hsaWdodCBhbGwgZHJvcHBhYmxlcyB3aXRoIGFuIGFjdGl2ZSBjbGFzc1xuICAgICAgdGhpcy5kcm9wcGFibGVzLmZvckVhY2goZCA9PiBkLnNldEF0dHJpYnV0ZSgnZW5hYmxlZCcsICcnKSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgaGFuZGxlRHJhZ0VuZCA9IChldjogRHJhZ0V2ZW50KSA9PiB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5kcm9wcGFibGVzLmZvckVhY2goZCA9PiBkLnJlbW92ZUF0dHJpYnV0ZSgnZW5hYmxlZCcpKTtcbiAgICAgIGNvbnN0IGRyYWdnYWJsZSA9IGV2LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBkcmFnZ2FibGUucmVtb3ZlQXR0cmlidXRlKCdvdmVyJyk7XG4gICAgICBkcmFnZ2FibGUucmVtb3ZlQXR0cmlidXRlKCdkcmFnZ2luZycpO1xuXG4gICAgICAvLyBwazogaWYgbm90IGRyb3BwZWQgb24gYSBkcm9wIGxvY2F0aW9uIHB1dCBpdCBiYWNrIHdoZXJlIGl0IGJlbG9uZ3NcbiAgICAgIGlmIChldi5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9PT0gJ25vbmUnIHx8IGV2LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5kcmFnQ2FuQmVQbGFjZWRCYWNrKSB7XG4gICAgICAgICAgdGhpcy5wbGFjZURyYWdnYWJsZUJhY2soZHJhZ2dhYmxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGV2LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID09PSAnbW92ZScpIHtcbiAgICAgICAgdGhpcy5zYXZlUmVzcG9uc2UoKTtcbiAgICAgICAgdGhpcy5jaGVja01heE1hdGNoQXNzb2NpYXRpb25zKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgcGxhY2VEcmFnZ2FibGVCYWNrKGRyYWdnYWJsZTogSFRNTEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5kcmFnZ2FibGVzLmdldChkcmFnZ2FibGUpO1xuICAgICAgY29uc3QgaW5kZXggPVxuICAgICAgICBwb3NpdGlvbi5pbmRleCA8PSBwb3NpdGlvbi5wYXJlbnQuY2hpbGRyZW4ubGVuZ3RoID8gcG9zaXRpb24uaW5kZXggOiBwb3NpdGlvbi5wYXJlbnQuY2hpbGRyZW4ubGVuZ3RoIC0gMTtcbiAgICAgIGNvbnN0IGludGVyYWN0aW9uID0gcG9zaXRpb24ucGFyZW50O1xuICAgICAgY29uc3QgZ2FwVGV4dCA9IHBvc2l0aW9uLnBhcmVudC5jaGlsZHJlbltpbmRleF07XG5cbiAgICAgIGludGVyYWN0aW9uLmluc2VydEJlZm9yZShkcmFnZ2FibGUsIGdhcFRleHQpO1xuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UoKTtcbiAgICAgIHRoaXMuY2hlY2tNYXhNYXRjaEFzc29jaWF0aW9ucygpO1xuICAgIH1cblxuICAgIHJlc2V0KHNhdmUgPSB0cnVlKTogdm9pZCB7XG4gICAgICB0aGlzLmRyYWdnYWJsZXMuZm9yRWFjaCgocG9zaXRpb24sIGRyYWdnYWJsZSkgPT4ge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHBvc2l0aW9uLnBhcmVudC5jaGlsZHJlbjtcbiAgICAgICAgY29uc3QgaW5kZXggPSBwb3NpdGlvbi5pbmRleCA8IGNoaWxkcmVuLmxlbmd0aCA/IHBvc2l0aW9uLmluZGV4IDogY2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgICBwb3NpdGlvbi5wYXJlbnQuaW5zZXJ0QmVmb3JlKGRyYWdnYWJsZSwgY2hpbGRyZW5baW5kZXhdKTtcbiAgICAgIH0pO1xuICAgICAgc2F2ZSAmJiB0aGlzLnNhdmVSZXNwb25zZSgpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBjaGVja01heE1hdGNoQXNzb2NpYXRpb25zKCkge1xuICAgICAgdGhpcy5kcm9wcGFibGVzLmZvckVhY2goZCA9PiB7XG4gICAgICAgIGNvbnN0IG1heE1hdGNoID0gKyhkLmdldEF0dHJpYnV0ZSgnbWF0Y2gtbWF4JykgfHwgMSk7XG4gICAgICAgIC8vIGNvbnN0IG1heE1pbiA9ICsoZC5nZXRBdHRyaWJ1dGUoJ21hdGNoLW1pbicpIHx8IDApO1xuICAgICAgICAvLyBjb25zdCBkaXNhYmxlID0gbWF4TWF0Y2ggPD0gKGQuY2hpbGRyZW4ubGVuZ3RoIHx8IDApO1xuICAgICAgICBjb25zdCBkaXNhYmxlID0gbWF4TWF0Y2ggPD0gKGQucXVlcnlTZWxlY3RvckFsbCgnW3F0aS1kcmFnZ2FibGU9XCJ0cnVlXCJdJykubGVuZ3RoIHx8IDApO1xuXG4gICAgICAgIGRpc2FibGUgPyBkLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnJykgOiBkLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgICAgZGlzYWJsZSA/IGQucmVtb3ZlQXR0cmlidXRlKCdkcm9wem9uZScpIDogZC5zZXRBdHRyaWJ1dGUoJ2Ryb3B6b25lJywgJ21vdmUnKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldCByZXNwb25zZShyZXNwb25zZTogc3RyaW5nW10pIHtcbiAgICAgIC8vIGZvciBxdGktbWF0Y2gtaW50ZXJhY3Rpb24gdGhlIGRyYWcgaW50ZXJhY3Rpb24gY2FuIGJlIHJlcGxhY2Ugd2l0aCBhIHF0aS1tYXRjaC10YWJ1bGFyIGNsYXNzXG4gICAgICAvLyB3aGljaCBzaG93cyB0aGUgZGF0YSBpbiBhIGEgdGFidWxhciB3YXksIHNvIG5vIGRyYWcgZHJvcCBzaG91bGQgYmUgaW52b2x2ZWQgdGhlblxuICAgICAgaWYgKHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKCdxdGktbWF0Y2gtdGFidWxhcicpKSByZXR1cm47XG5cbiAgICAgIHRoaXMucmVzZXQoZmFsc2UpO1xuICAgICAgaWYgKHJlc3BvbnNlICE9PSBudWxsICYmIEFycmF5LmlzQXJyYXkocmVzcG9uc2UpKVxuICAgICAgICByZXNwb25zZS5mb3JFYWNoKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICBjb25zdCBbZHJvcElkLCAuLi5kcmFnSWRzXSA9IHJlc3BvbnNlLnNwbGl0KCcgJykucmV2ZXJzZSgpO1xuICAgICAgICAgIGlmIChkcm9wSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGRyb3BwYWJsZSA9IHRoaXMuZHJvcHBhYmxlcy5maW5kKGRyb3AgPT4gZHJvcC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSA9PT0gZHJvcElkKTtcbiAgICAgICAgICAgIGRyYWdJZHMuZm9yRWFjaChkcmFnSWQgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBkcmFnZ2FibGUgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoYFtpZGVudGlmaWVyPSR7ZHJhZ0lkfV1gKTtcbiAgICAgICAgICAgICAgaWYgKCFkcm9wcGFibGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBjYW5ub3QgZmluZCBkcm9wcGFibGUgd2l0aCBpZGVudGlmaWVyOiAke2Ryb3BJZH1gKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICghZHJhZ2dhYmxlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgY2Fubm90IGZpbmQgZHJhZ2dhYmxlIHdpdGggaWRlbnRpZmllcjogJHtkcmFnSWR9YCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZHJvcHBhYmxlLmFwcGVuZENoaWxkKGRyYWdnYWJsZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja01heE1hdGNoQXNzb2NpYXRpb25zKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFsaWRhdGUoKSB7XG4gICAgICBjb25zdCBkcm9wcGFibGVzID0gZHJvcHBhYmxlc0luU2hhZG93Um9vdFxuICAgICAgICA/IEFycmF5LmZyb20odGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoZHJvcHBhYmxlc1NlbGVjdG9yKSlcbiAgICAgICAgOiBBcnJheS5mcm9tKHRoaXMucXVlcnlTZWxlY3RvckFsbChkcm9wcGFibGVzU2VsZWN0b3IpKTtcbiAgICAgIGNvbnN0IGFzc29jaWF0aW9ucyA9IGRyb3BwYWJsZXMuZmlsdGVyKGQgPT4gZC5jaGlsZEVsZW1lbnRDb3VudCA+IDApLmxlbmd0aDtcbiAgICAgIHJldHVybiB0aGlzLm1pbkFzc29jaWF0aW9ucyA8PSAwIHx8IHRoaXMubWluQXNzb2NpYXRpb25zIDw9IGFzc29jaWF0aW9ucztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2F2ZVJlc3BvbnNlKCkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSB0aGlzLmRyb3BwYWJsZXMubWFwKGRyb3BwYWJsZSA9PiB7XG4gICAgICAgIGxldCByZXNwb25zZVN0cmluZyA9ICcnO1xuXG4gICAgICAgIC8vIGNvbnN0IGRyYWdzSW5Ecm9wcGFibGUgPSBkcm9wcGFibGUuc2hhZG93Um9vdFxuICAgICAgICAvLyAgIC5xdWVyeVNlbGVjdG9yPEhUTUxTbG90RWxlbWVudD4oYFtuYW1lPVwicXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZVwiXWApXG4gICAgICAgIC8vICAgLmFzc2lnbmVkRWxlbWVudHMoKTtcblxuICAgICAgICBjb25zdCBkcmFnc0luRHJvcHBhYmxlID0gZHJvcHBhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ1txdGktZHJhZ2dhYmxlPVwidHJ1ZVwiXScpO1xuXG4gICAgICAgIGlmIChkcmFnc0luRHJvcHBhYmxlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXNwb25zZVN0cmluZyArPVxuICAgICAgICAgICAgQXJyYXkuZnJvbShkcmFnc0luRHJvcHBhYmxlKVxuICAgICAgICAgICAgICAubWFwKGQgPT4gZC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSlcbiAgICAgICAgICAgICAgLmpvaW4oJyAnKSArIGAgYDtcbiAgICAgICAgfVxuICAgICAgICByZXNwb25zZVN0cmluZyArPSBkcm9wcGFibGUuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgICAgIHJldHVybiByZXNwb25zZVN0cmluZztcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLWludGVyYWN0aW9uLXJlc3BvbnNlJywge1xuICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICByZXNwb25zZUlkZW50aWZpZXI6IHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLFxuICAgICAgICAgICAgcmVzcG9uc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gRHJhZ0Ryb3BJbnRlcmFjdGlvbkVsZW1lbnQgYXMgQ29uc3RydWN0b3I8SUludGVyYWN0aW9uPiAmIFQ7XG59O1xuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb24gfSBmcm9tICcuLi9pbnRlcm5hbC9pbnRlcmFjdGlvbi9pbnRlcmFjdGlvbic7XG5pbXBvcnQgeyByZW1vdmVEb3VibGVTbGFzaGVzIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvdXRpbHMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWN1c3RvbS1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpQ3VzdG9tSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIC8vIFRoaXMgY3VzdG9tLWludGVyYWN0aW9uIHN1cHBvcnQgdGhlIENFUyBBUEkgd2hpY2ggaXMgdXNlIGluIEZBQ0VUXG4gIC8vXG4gIC8vIEl0IHdvcmtzIGxpa2UgdGhpczpcbiAgLy8gMS4gVGhlIENJIG1hbmlmZXN0IGlzIGZldGNoZWRcbiAgLy8gMi4gQW4gaWZyYW1lIGlzIGNyZWF0ZWQgYW5kIHRoZSBmaXJzdCBzdHlsZSBhbmQgZmlyc3Qgc2NyaXB0IGZyb20gdGhlIG1hbmlmZXN0IGFyZSBsb2FkZWRcbiAgLy8gMy4gVGhlIGZpcnN0IHNjcmlwdCBpcyBib290c3RyYXAuanMgd2hpY2ggYWxzbyBjcmVhdGVzIGFuIGlmcmFtZSBhbmQgbG9hZHMgdGhlIGZpcnN0IG1lZGlhIGZyb20gdGhlIG1hbmlmZXN0XG4gIC8vIDQuIENvbW11bmljYXRpb24gaXMgZG9uZSB2aWEgdGhlIENFUyBBUEkgYnV0IGJlY2F1c2UgdGhlIGlmcmFtZSBpcyBub3QgYWxsb3dlZCB0byBhY2Nlc3MgdGhlIGdsb2JhbCBDRVMgb2JqZWN0IHdlIG5lZWQgdG8gdXNlIHdpbmRvdy5wb3N0TWVzc2FnZVxuXG4gIC8vIFRvIGFjaGlldmUgdGhpcyB3ZSBjaGFuZ2UgdGhlIHBhY2thZ2UgYnkgcmVwbGFjaW5nIHRoZSBib290c3RyYXAuanMgd2l0aCBvdXIgb3duIGFuZCBpbmplY3QgYSBwcm94eSBDRVMgQVBJIHRoYXQgY29tbXVuaWNhdGVzIHZpYSBwb3N0TWVzc2FnZVxuICAvLyBCZWNhdXNlIHdlIGFsc28gd2FudCB0byBydW4gdGhpcyBpbiBzdG9yeWJvb2ssIHdlIGNhbm5vdCB1c2Ugd2luZG93LnRvcCBiZWNhdXNlIHRvIHNlbmQgbWVzc2FnZXMgdGhlcmUsIGJlY2F1c2UgaW4gY2FzZSBvZiBzdG9yeWJvb2sgdGhhdCBpcyBub3QgdGhlIHRvcCB3aW5kb3cuXG4gIC8vIFNvIHdlIHNlbmQgbWVzc2FnZXMgdG8gYWxsIHBhcmVudCB3aW5kb3dzXG4gIHByaXZhdGUgcmF3UmVzcG9uc2U6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuaGFuZGxlUG9zdE1lc3NhZ2UgPSB0aGlzLmhhbmRsZVBvc3RNZXNzYWdlLmJpbmQodGhpcyk7XG4gIH1cblxuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3Jlc3BvbnNlLWlkZW50aWZpZXInIH0pXG4gIHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZGF0YScgfSlcbiAgZGF0YTogc3RyaW5nO1xuXG4gIEBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZywgYXR0cmlidXRlOiAnZGF0YS1iYXNlLWl0ZW0nIH0pXG4gIGJhc2VJdGVtVXJsOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdkYXRhLWJhc2UtcmVmJyB9KVxuICBiYXNlUmVmVXJsOiBzdHJpbmc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdpZCcgfSlcbiAgaWQ6IHN0cmluZztcblxuICBAc3RhdGUoKVxuICBwcml2YXRlIF9lcnJvck1lc3NhZ2U6IHN0cmluZyA9IG51bGw7XG4gIG1hbmlmZXN0OiB7XG4gICAgc2NyaXB0OiBzdHJpbmdbXTtcbiAgICBzdHlsZTogc3RyaW5nW107XG4gICAgbWVkaWE6IHN0cmluZ1tdO1xuICB9O1xuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG5cbiAgICBjb25zdCB1cmlUb01hbmlmZXN0ID0gdGhpcy5kYXRhLnN0YXJ0c1dpdGgoJ2h0dHAnKVxuICAgICAgPyB0aGlzLmRhdGFcbiAgICAgIDogcmVtb3ZlRG91YmxlU2xhc2hlcyh0aGlzLmJhc2VJdGVtVXJsICsgJy8nICsgdGhpcy5kYXRhKTtcbiAgICAvLyBmZXRjaCB0aGUganNvbiBmaWxlIGxvY2F0ZWQgYXQgdGhlIGRhdGEgYXR0cmlidXRlXG4gICAgZmV0Y2godXJpVG9NYW5pZmVzdClcbiAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmpzb24oKSlcbiAgICAgIC50aGVuKGRhdGEgPT4ge1xuICAgICAgICB0aGlzLm1hbmlmZXN0ID0gZGF0YTtcbiAgICAgICAgdGhpcy5zZXR1cENFUygpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICB0aGlzLl9lcnJvck1lc3NhZ2UgPSBlcnI7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8vIE1IOiBDaGFuZ2VkIHRoZSBkZWZhdWx0IGJvb3RzdHJhcC5qcyB0byB1c2UgdGhlIG5ldyBDRVMgQVBJXG4gIC8vIEJlY2F1c2UgdGhlIG9sZCBvbmUgdXNlcyB0aGUgZ2xvYmFsIENFUyBvYmplY3QgdGhhdCBpcyBub3QgYWxsb3dlZCB0byBiZSBhY2Nlc3NlZCB3aGVuIHRoZSBDSVxuICAvLyBpcyBlbWJlZGRlZCBpbiBhbiBpZnJhbWUgYW5kIGNvbWluZyBmcm9tIGFub3RoZXIgZG9tYWluXG4gIC8vIFRoZXJlZm9yIHdlIG5lZWQgdG8gdXNlIHRoZSBuZXcgQ0VTIEFQSSB0byBjb21tdW5pY2F0ZXMgdmlhIHRoZSBicm9hZGNhc3QgQVBJXG4gIHNldHVwQ0VTKCkge1xuICAgIGNvbnN0IGlmcmFtZSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCcjcGNpQ29udGFpbmVyJykgYXMgSFRNTElGcmFtZUVsZW1lbnQsXG4gICAgICBpZnJhbWVXaW4gPSBpZnJhbWUuY29udGVudFdpbmRvdyB8fCBpZnJhbWUsXG4gICAgICBpZnJhbWVEb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50O1xuXG4gICAgLy8gY29uc3QgY2hhbm5lbCA9IG5ldyBCcm9hZGNhc3RDaGFubmVsKCdjZXNfY2hhbm5lbCcpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5oYW5kbGVQb3N0TWVzc2FnZSk7XG4gICAgaWZyYW1lRG9jLm9wZW4oKTtcbiAgICBpZnJhbWVEb2Mud3JpdGUoYFxuICAgICAgPGh0bWw+XG4gICAgICAgIDxoZWFkPlxuICAgICAgICAgIDxsaW5rIGhyZWY9JyR7cmVtb3ZlRG91YmxlU2xhc2hlcyhgJHt0aGlzLmJhc2VSZWZVcmx9LyR7dGhpcy5tYW5pZmVzdC5zdHlsZVswXX1gKX0nIHJlbD1cInN0eWxlc2hlZXRcIiAvPlxuICAgICAgICAgIDxzY3JpcHQgc3JjPScke3JlbW92ZURvdWJsZVNsYXNoZXMoYCR7dGhpcy5iYXNlUmVmVXJsfS8ke3RoaXMubWFuaWZlc3Quc2NyaXB0WzBdfWApfSc+PC9zY3JpcHQ+XG4gICAgICAgIDwvaGVhZD5cbiAgICAgICAgPGJvZHk+PC9ib2R5PlxuICAgICAgPC9odG1sPlxuICAgICAgYCk7XG5cbiAgICBpZnJhbWVEb2MuY2xvc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SUZyYW1lcygpIHtcbiAgICBjb25zdCBpZnJhbWVzSW5TaGFkb3dSb290ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lmcmFtZScpO1xuICAgIGNvbnN0IGlmcmFtZSA9IHRoaXMucXVlcnlTZWxlY3RvckFsbCgnaWZyYW1lJyk7XG5cbiAgICBjb25zdCBvdXRlcklGcmFtZXMgPSBbLi4uaWZyYW1lc0luU2hhZG93Um9vdCwgLi4uaWZyYW1lXTtcbiAgICBmb3IgKGNvbnN0IGlmcmFtZSBvZiBvdXRlcklGcmFtZXMpIHtcbiAgICAgIGNvbnN0IGlmcmFtZVNyYyA9IGlmcmFtZS5zcmM7XG4gICAgICBjb25zdCBpc1NhbWVPcmlnaW4gPSBuZXcgVVJMKGlmcmFtZVNyYywgd2luZG93LmxvY2F0aW9uLmhyZWYpLm9yaWdpbiA9PT0gd2luZG93LmxvY2F0aW9uLm9yaWdpbjtcbiAgICAgIGlmIChpc1NhbWVPcmlnaW4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBvdXRlckRvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQgfHwgaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gICAgICAgICAgaWYgKG91dGVyRG9jKSB7XG4gICAgICAgICAgICB0aGlzLmdldElubmVySUZyYW1lcyhvdXRlckRvYywgb3V0ZXJJRnJhbWVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBhY2Nlc3NpbmcgbmVzdGVkIGlmcmFtZTonLCBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBnZXQgb25seSB1bmlxdWUgaWZyYW1lc1xuICAgIG91dGVySUZyYW1lcy5mb3JFYWNoKChpZnJhbWUsIGluZGV4KSA9PiB7XG4gICAgICBpZiAob3V0ZXJJRnJhbWVzLmluZGV4T2YoaWZyYW1lKSAhPT0gaW5kZXgpIHtcbiAgICAgICAgb3V0ZXJJRnJhbWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG91dGVySUZyYW1lcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW5uZXJJRnJhbWVzKGlmcmFtZURvY3VtZW50OiBEb2N1bWVudCwgaWZyYW1lcyA9IFtdKSB7XG4gICAgLy8gR2V0IGFsbCBpZnJhbWVzIGluIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gICAgY29uc3QgY3VycmVudElmcmFtZXMgPSBpZnJhbWVEb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpZnJhbWUnKTtcblxuICAgIGN1cnJlbnRJZnJhbWVzLmZvckVhY2goaWZyYW1lID0+IHtcbiAgICAgIC8vIEFkZCB0aGUgY3VycmVudCBpZnJhbWUgdG8gdGhlIGxpc3RcbiAgICAgIGlmcmFtZXMucHVzaChpZnJhbWUpO1xuXG4gICAgICAvLyBSZWN1cnNpdmVseSBnZXQgaWZyYW1lcyB3aXRoaW4gdGhlIGN1cnJlbnQgaWZyYW1lXG4gICAgICAvLyBDaGVjayBpZiB0aGUgaWZyYW1lIHNyYyBpcyBmcm9tIHRoZSBzYW1lIG9yaWdpblxuICAgICAgY29uc3QgaWZyYW1lU3JjID0gaWZyYW1lLnNyYztcbiAgICAgIGNvbnN0IGlzU2FtZU9yaWdpbiA9IG5ldyBVUkwoaWZyYW1lU3JjLCB3aW5kb3cubG9jYXRpb24uaHJlZikub3JpZ2luID09PSB3aW5kb3cubG9jYXRpb24ub3JpZ2luO1xuXG4gICAgICBpZiAoaXNTYW1lT3JpZ2luKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgbmVzdGVkRG9jID0gaWZyYW1lLmNvbnRlbnREb2N1bWVudCB8fCBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgICAgICAgICB0aGlzLmdldElubmVySUZyYW1lcyhuZXN0ZWREb2MsIGlmcmFtZXMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgYWNjZXNzaW5nIG5lc3RlZCBpZnJhbWU6JywgZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignU2tpcHBlZCBjcm9zcy1vcmlnaW4gaWZyYW1lOicsIGlmcmFtZVNyYyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaWZyYW1lcztcbiAgfVxuXG4gIHByaXZhdGUgcG9zdFRvV2luZG93QW5kSWZyYW1lcyh0eXBlOiBzdHJpbmcsIGRhdGE6IGFueSkge1xuICAgIHdpbmRvdy5wb3N0TWVzc2FnZSh7IHR5cGUsIGRhdGEgfSwgJyonKTtcbiAgICBjb25zdCBpZnJhbWVzID0gdGhpcy5nZXRJRnJhbWVzKCk7XG4gICAgZm9yIChjb25zdCBpZnJhbWUgb2YgaWZyYW1lcykge1xuICAgICAgaWYgKGlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICAgIGlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKHsgdHlwZSwgZGF0YSB9LCAnKicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVBvc3RNZXNzYWdlKGV2ZW50OiBNZXNzYWdlRXZlbnQpIHtcbiAgICBjb25zdCB7IHR5cGUsIGRhdGEgfSA9IGV2ZW50LmRhdGE7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdzZXRSZXNwb25zZSc6XG4gICAgICAgIHRoaXMucmF3UmVzcG9uc2UgPSBkYXRhO1xuICAgICAgICB0aGlzLnNhdmVSZXNwb25zZShkYXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdnZXRSZXNwb25zZSc6IHtcbiAgICAgICAgdGhpcy5wb3N0VG9XaW5kb3dBbmRJZnJhbWVzKCdyZXNwb25zZURhdGEnLCB0aGlzLnJhd1Jlc3BvbnNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdnZXRNZWRpYSc6IHtcbiAgICAgICAgY29uc3QgbWVkaWFEYXRhID0gdGhpcy5tYW5pZmVzdC5tZWRpYS5tYXAobWVkaWEgPT4ge1xuICAgICAgICAgIGNvbnN0IHVybCA9IG1lZGlhLnN0YXJ0c1dpdGgoJ2h0dHAnKSA/IG1lZGlhIDogcmVtb3ZlRG91YmxlU2xhc2hlcyh0aGlzLmJhc2VSZWZVcmwgKyAnLycgKyBtZWRpYSk7XG4gICAgICAgICAgcmV0dXJuIHVybDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucG9zdFRvV2luZG93QW5kSWZyYW1lcygnbWVkaWFEYXRhJywgbWVkaWFEYXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdzZXRTdGFnZUhlaWdodCc6XG4gICAgICAgIGNvbnNvbGUubG9nKCdzZXRTdGFnZUhlaWdodCBub3QgaW1wbGVtZW50ZWQnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmF3UmVzcG9uc2UgIT09ICcnO1xuICB9XG5cbiAgc2V0IHJlc3BvbnNlKHZhbDogUmVhZG9ubHk8c3RyaW5nIHwgc3RyaW5nW10+KSB7XG4gICAgdGhpcy5yYXdSZXNwb25zZSA9IHZhbCBhcyBzdHJpbmc7XG4gIH1cblxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuaGFuZGxlUG9zdE1lc3NhZ2UpO1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gIH1cblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPGlmcmFtZVxuICAgICAgICB3aWR0aD0ke3RoaXMuZ2V0QXR0cmlidXRlKCd3aWR0aCcpfVxuICAgICAgICBoZWlnaHQ9JHt0aGlzLmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jyl9XG4gICAgICAgIGZyYW1lYm9yZGVyPVwiMFwiXG4gICAgICAgIHRpdGxlPVwicGNpQ29udGFpbmVyXCJcbiAgICAgICAgaWQ9XCJwY2lDb250YWluZXJcIlxuICAgICAgPlxuICAgICAgPC9pZnJhbWU+XG4gICAgICAke3RoaXMuX2Vycm9yTWVzc2FnZSAmJlxuICAgICAgaHRtbGA8ZGl2IHN0eWxlPVwiY29sb3I6cmVkXCI+XG4gICAgICAgIDxoMT5FcnJvcjwvaDE+XG4gICAgICAgICR7dGhpcy5fZXJyb3JNZXNzYWdlfVxuICAgICAgPC9kaXY+YH1gO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jdXN0b20taW50ZXJhY3Rpb24nOiBRdGlDdXN0b21JbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbkBjdXN0b21FbGVtZW50KCdxdGktZW5kLWF0dGVtcHQtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUVuZEF0dGVtcHRJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjb3VudC1hdHRlbXB0JyB9KVxuICBwdWJsaWMgY291bnRBdHRlbXB0OiBzdHJpbmcgPSAndHJ1ZSc7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pXG4gIHB1YmxpYyB0aXRsZTogJ2VuZCBhdHRlbXB0JztcblxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICAvLyB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgc2V0IHJlc3BvbnNlKHZhbDogdW5kZWZpbmVkKSB7XG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxidXR0b24gP2Rpc2FibGVkPSR7dGhpcy5kaXNhYmxlZH0gcGFydD1cImJ1dHRvblwiIEBjbGljaz0ke3RoaXMuZW5kQXR0ZW1wdH0+JHt0aGlzLnRpdGxlfTwvYnV0dG9uPmA7XG4gIH1cbiAgcHVibGljIGVuZEF0dGVtcHQoZTogRXZlbnQpIHtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICBuZXcgQ3VzdG9tRXZlbnQoJ2VuZC1hdHRlbXB0Jywge1xuICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZSxcbiAgICAgICAgZGV0YWlsOiB7IHJlc3BvbnNlSWRlbnRpZmllcjogdGhpcy5yZXNwb25zZUlkZW50aWZpZXIsIGNvdW50QXR0ZW1wdDogdGhpcy5jb3VudEF0dGVtcHQgPT09ICd0cnVlJyB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uJzogUXRpRW5kQXR0ZW1wdEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUdhcE1hdGNoSW50ZXJhY3Rpb24gZXh0ZW5kcyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4oTGl0RWxlbWVudCwgJ3F0aS1nYXAtdGV4dCcsIGZhbHNlLCAncXRpLWdhcCcpIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgICAgICBnYXA6IDAuNXJlbTtcbiAgICAgIH1cblxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLXRvcCkge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgfVxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLWJvdHRvbSkge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtbGVmdCkge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgfVxuICAgICAgOmhvc3QoLnF0aS1jaG9pY2VzLXJpZ2h0KSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTtcbiAgICAgIH1cbiAgICAgIFtwYXJ0PSdkcmFncyddLFxuICAgICAgW3BhcnQ9J2Ryb3BzJ10ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgZ2FwOiAwLjVyZW07XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGAgPHNsb3QgcGFydD1cImRyYWdzXCIgbmFtZT1cInF0aS1nYXAtdGV4dFwiPjwvc2xvdD5cbiAgICAgIDxzbG90IHBhcnQ9XCJkcm9wc1wiPjwvc2xvdD5gO1xuICB9XG5cbiAgc2V0IGNvcnJlY3RSZXNwb25zZSh2YWx1ZTogUmVhZG9ubHk8c3RyaW5nIHwgc3RyaW5nW10+KSB7XG4gICAgbGV0IG1hdGNoZXM6IHsgdGV4dDogc3RyaW5nOyBnYXA6IHN0cmluZyB9W10gPSBbXTsgICAgICAgICAgICBcbiAgICBjb25zdCByZXNwb25zZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuXG4gICAgaWYgKHJlc3BvbnNlKSB7ICAgICAgXG4gICAgICBtYXRjaGVzID0gcmVzcG9uc2UubWFwKHggPT4ge1xuICAgICAgICBjb25zdCBzcGxpdCA9IHguc3BsaXQoJyAnKTtcbiAgICAgICAgIHJldHVybiB7IHRleHQ6IHNwbGl0WzBdLCBnYXA6IHNwbGl0WzFdICB9O31cbiAgICAgICk7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGdhcHMgPSB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1nYXAnKTtcbiAgICAgIGdhcHMuZm9yRWFjaCgoZ2FwLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gZ2FwLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpO1xuICAgICAgICBjb25zdCB0ZXh0SWRlbnRpZmllciA9IG1hdGNoZXMuZmluZCh4ID0+IHguZ2FwID09PSBpZGVudGlmaWVyKT8udGV4dDtcbiAgICAgICAgY29uc3QgdGV4dCA9IHRoaXMucXVlcnlTZWxlY3RvcihgcXRpLWdhcC10ZXh0W2lkZW50aWZpZXI9XCIke3RleHRJZGVudGlmaWVyfVwiXWApPy50ZXh0Q29udGVudC50cmltKCk7XG4gICAgICAgIGlmICh0ZXh0SWRlbnRpZmllciAmJiB0ZXh0KSB7XG4gICAgICAgICAgaWYgKCFnYXAubmV4dEVsZW1lbnRTaWJsaW5nPy5jbGFzc0xpc3QuY29udGFpbnMoJ2NvcnJlY3Qtb3B0aW9uJykpIHtcbiAgICAgICAgICAgIGNvbnN0IHRleHRTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOyAgICAgICAgIFxuICAgICAgICAgICAgdGV4dFNwYW4uY2xhc3NMaXN0LmFkZCgnY29ycmVjdC1vcHRpb24nKTtcbiAgICAgICAgICAgIHRleHRTcGFuLnRleHRDb250ZW50ID0gdGV4dDtcbiAgICAgICAgICAgIGdhcC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgdGV4dFNwYW4pOyAgXG4gICAgICAgICAgfSAgXG4gICAgICAgIH0gIFxuICAgICAgICBlbHNlIGlmIChnYXAubmV4dEVsZW1lbnRTaWJsaW5nPy5jbGFzc0xpc3QuY29udGFpbnMoJ2NvcnJlY3Qtb3B0aW9uJykpIHtcbiAgICAgICAgICBnYXAubmV4dEVsZW1lbnRTaWJsaW5nLnJlbW92ZSgpO1xuICAgICAgICB9ICAgICAgICAgICAgXG4gICAgICB9KVxuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nOiBRdGlHYXBNYXRjaEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiLyogZXNsaW50LWRpc2FibGUgbGl0L25vLWludmFsaWQtaHRtbCAqL1xuaW1wb3J0IHsgY3NzLCBodG1sLCBzdmcgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcXVlcnksIHF1ZXJ5QXNzaWduZWRFbGVtZW50cywgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBpZkRlZmluZWQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9pZi1kZWZpbmVkLmpzJztcbmltcG9ydCB7IHJlcGVhdCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3JlcGVhdC5qcyc7XG5pbXBvcnQgeyBwb3NpdGlvbkhvdHNwb3RzIH0gZnJvbSAnLi4vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlHcmFwaGljQXNzb2NpYXRlSW50ZXJhY3Rpb24gZXh0ZW5kcyBJbnRlcmFjdGlvbiB7XG4gIGNob2ljZU9yZGVyaW5nOiBib29sZWFuO1xuICBob3RzcG90cztcbiAgc3RhcnRQb2ludCA9IG51bGw7XG4gIGVuZFBvaW50ID0gbnVsbDtcbiAgQHN0YXRlKCkgX2xpbmVzID0gW107XG4gIEBzdGF0ZSgpIHN0YXJ0Q29vcmQ6IHsgeDogYW55OyB5OiBhbnkgfTtcbiAgQHN0YXRlKCkgbW91c2VDb29yZDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xuICBAcXVlcnkoJ3N2ZycpIHN2Z0NvbnRhaW5lcjtcbiAgQHF1ZXJ5QXNzaWduZWRFbGVtZW50cyh7IHNlbGVjdG9yOiAnaW1nJyB9KSBnckltYWdlO1xuXG4gIC8vIHRhcmdldCB0aGUgbWFpbiBzbG90IG1ha2UgaXQgcmVsYXRpdmUgYW5kIGZpdCB3aXRoIHRoZSBjb250ZW5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICBzbG90Om5vdChbbmFtZT0ncHJvbXB0J10pIHtcbiAgICAgICAgLy8gcG9zaXRpb246IHJlbGF0aXZlOyAvKiBxdGktaG90c3BvdC1jaG9pY2UgcmVsYXRpdmUgdG8gdGhlIHNsb3QgKi9cbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiBmaXQtY29udGVudDsgLyogaG90c3BvdHMgbm90IHN0cmV0Y2hpbmcgZnVydGhlciBpZiBpbWFnZSBpcyBhdCBtYXggc2l6ZSAqL1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKGltZykge1xuICAgICAgICAvKiBpbWFnZSBub3Qgc2VsZWN0YWJsZSBhbnltb3JlICovXG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgIH1cbiAgICAgIDo6c2xvdHRlZChxdGktYXNzb2NpYWJsZS1ob3RzcG90KSB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgICAgfVxuICAgICAgbGluZS1jb250YWluZXIge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgICAgc3ZnIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB0b3A6IDBweDtcbiAgICAgICAgbGVmdDogMHB4O1xuICAgICAgfVxuICAgIGBcbiAgXTtcbiAgc3ZnOiBTVkdTVkdFbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItaG90c3BvdCcsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9saW5lcyA9IFtdO1xuICB9XG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9saW5lcy5sZW5ndGggPiAwO1xuICB9XG4gIHNldCByZXNwb25zZSh2YWw6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgdGhpcy5fbGluZXMgPSB2YWw7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8bGluZS1jb250YWluZXI+XG4gICAgICAgIDxzdmdcbiAgICAgICAgICB3aWR0aD0ke2lmRGVmaW5lZCh0aGlzLmdySW1hZ2VbMF0/LndpZHRoKX1cbiAgICAgICAgICBoZWlnaHQ9JHtpZkRlZmluZWQodGhpcy5nckltYWdlWzBdPy5oZWlnaHQpfVxuICAgICAgICAgIHZpZXdib3g9XCIwIDAgJHt0aGlzLmdySW1hZ2VbMF0/LndpZHRofSAke3RoaXMuZ3JJbWFnZVswXT8uaGVpZ2h0fVwiXG4gICAgICAgID5cbiAgICAgICAgICAke3JlcGVhdChcbiAgICAgICAgICAgIHRoaXMuX2xpbmVzLFxuICAgICAgICAgICAgbGluZSA9PiBsaW5lLFxuICAgICAgICAgICAgKGxpbmUsIGluZGV4KSA9PiBzdmdgXG4gICAgICAgICAgICAgIDxsaW5lXG4gICAgICAgICAgICAgICAgcGFydD1cImxpbmVcIlxuICAgICAgICAgICAgICAgIHgxPSR7cGFyc2VJbnQodGhpcy5xdWVyeVNlbGVjdG9yPFNWR0xpbmVFbGVtZW50PignW2lkZW50aWZpZXI9JyArIGxpbmUuc3BsaXQoJyAnKVswXSArICddJykuc3R5bGUubGVmdCl9XG4gICAgICAgICAgICAgICAgeTE9JHtwYXJzZUludCh0aGlzLnF1ZXJ5U2VsZWN0b3I8U1ZHTGluZUVsZW1lbnQ+KCdbaWRlbnRpZmllcj0nICsgbGluZS5zcGxpdCgnICcpWzBdICsgJ10nKS5zdHlsZS50b3ApfVxuICAgICAgICAgICAgICAgIHgyPSR7cGFyc2VJbnQodGhpcy5xdWVyeVNlbGVjdG9yPFNWR0xpbmVFbGVtZW50PignW2lkZW50aWZpZXI9JyArIGxpbmUuc3BsaXQoJyAnKVsxXSArICddJykuc3R5bGUubGVmdCl9XG4gICAgICAgICAgICAgICAgeTI9JHtwYXJzZUludCh0aGlzLnF1ZXJ5U2VsZWN0b3I8U1ZHTGluZUVsZW1lbnQ+KCdbaWRlbnRpZmllcj0nICsgbGluZS5zcGxpdCgnICcpWzFdICsgJ10nKS5zdHlsZS50b3ApfVxuICAgICAgICAgICAgICAgIHN0cm9rZT1cInJlZFwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiM1wiXG4gICAgICAgICAgICAgICAgQGNsaWNrPSR7KGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5fbGluZXMgPSB0aGlzLl9saW5lcy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX2xpbmVzKTtcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgYFxuICAgICAgICAgICl9XG4gICAgICAgICAgJHt0aGlzLnN0YXJ0UG9pbnQgJiZcbiAgICAgICAgICBzdmdgPGxpbmVcbiAgICAgICAgICAgIHBhcnQ9XCJwb2ludFwiXG4gICAgICAgICAgICB4MT0ke3RoaXMuc3RhcnRDb29yZC54fVxuICAgICAgICAgICAgeTE9JHt0aGlzLnN0YXJ0Q29vcmQueX1cbiAgICAgICAgICAgIHgyPSR7dGhpcy5tb3VzZUNvb3JkLnh9XG4gICAgICAgICAgICB5Mj0ke3RoaXMubW91c2VDb29yZC55fVxuICAgICAgICAgICAgc3Ryb2tlPVwicmVkXCJcbiAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIlxuICAgICAgICAgIC8+YH1cbiAgICAgICAgPC9zdmc+XG4gICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDwvbGluZS1jb250YWluZXI+YDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Ib3RzcG90T25SZWdpc3RlcihlOiBDdXN0b21FdmVudDxRdGlIb3RzcG90Q2hvaWNlPik6IHZvaWQge1xuICAgIGNvbnN0IGltZyA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJykgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICBjb25zdCBob3RzcG90ID0gZS50YXJnZXQgYXMgUXRpSG90c3BvdENob2ljZTtcbiAgICBjb25zdCBjb29yZHMgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJyk7XG4gICAgY29uc3Qgc2hhcGUgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnc2hhcGUnKTtcbiAgICBjb25zdCBjb29yZHNOdW1iZXIgPSBjb29yZHMuc3BsaXQoJywnKS5tYXAocyA9PiBwYXJzZUludChzKSk7XG4gICAgcG9zaXRpb25Ib3RzcG90cyhzaGFwZSwgY29vcmRzTnVtYmVyLCBpbWcsIGhvdHNwb3QpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZmlyc3RVcGRhdGVkKGUpOiB2b2lkIHtcbiAgICBzdXBlci5maXJzdFVwZGF0ZWQoZSk7XG5cbiAgICB0aGlzLmhvdHNwb3RzID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktYXNzb2NpYWJsZS1ob3RzcG90Jyk7XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBldmVudCA9PiB7XG4gICAgICB0aGlzLm1vdXNlQ29vcmQgPSB7XG4gICAgICAgIHg6IGV2ZW50LmNsaWVudFggLSB0aGlzLmdySW1hZ2VbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCxcbiAgICAgICAgeTogZXZlbnQuY2xpZW50WSAtIHRoaXMuZ3JJbWFnZVswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3BcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICB0aGlzLmhvdHNwb3RzLmZvckVhY2goaG90c3BvdCA9PiB7XG4gICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJykuc3BsaXQoJywnKVswXSArICdweCc7XG4gICAgICBob3RzcG90LnN0eWxlLnRvcCA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKS5zcGxpdCgnLCcpWzFdICsgJ3B4JztcblxuICAgICAgaG90c3BvdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0UG9pbnQpIHtcbiAgICAgICAgICB0aGlzLnN0YXJ0UG9pbnQgPSBldmVudC50YXJnZXQ7XG5cbiAgICAgICAgICB0aGlzLnN0YXJ0Q29vcmQgPSB7XG4gICAgICAgICAgICB4OiB0aGlzLnN0YXJ0UG9pbnQuZ2V0QXR0cmlidXRlKCdjb29yZHMnKS5zcGxpdCgnLCcpWzBdLFxuICAgICAgICAgICAgeTogdGhpcy5zdGFydFBvaW50LmdldEF0dHJpYnV0ZSgnY29vcmRzJykuc3BsaXQoJywnKVsxXVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZW5kUG9pbnQpIHtcbiAgICAgICAgICB0aGlzLmVuZFBvaW50ID0gZXZlbnQudGFyZ2V0O1xuXG4gICAgICAgICAgdGhpcy5fbGluZXMgPSBbXG4gICAgICAgICAgICAuLi50aGlzLl9saW5lcyxcbiAgICAgICAgICAgIHRoaXMuc3RhcnRQb2ludC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKSArICcgJyArIHRoaXMuZW5kUG9pbnQuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJylcbiAgICAgICAgICBdO1xuICAgICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX2xpbmVzKTtcbiAgICAgICAgICB0aGlzLnN0YXJ0UG9pbnQgPSBudWxsO1xuICAgICAgICAgIHRoaXMuZW5kUG9pbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic6IFF0aUdyYXBoaWNBc3NvY2lhdGVJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi8uLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gcG9zaXRpb25Ib3RzcG90cyhcbiAgc2hhcGU6IHN0cmluZyxcbiAgY29vcmRzTnVtYmVyOiBudW1iZXJbXSxcbiAgaW1nOiBIVE1MSW1hZ2VFbGVtZW50LFxuICBob3RzcG90OiBRdGlIb3RzcG90Q2hvaWNlXG4pIHtcbiAgc3dpdGNoIChzaGFwZSkge1xuICAgIGNhc2UgJ2NpcmNsZSc6XG4gICAgICB7XG4gICAgICAgIGNvbnN0IFtjZW50ZXJYLCBjZW50ZXJZLCByYWRpdXNdID0gY29vcmRzTnVtYmVyO1xuICAgICAgICBjb25zdCBjZW50ZXJYUGVyID0gKGNlbnRlclggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCBjZW50ZXJZUGVyID0gKGNlbnRlclkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgY29uc3QgcmFkaXVzUGVyID0gKHJhZGl1cyAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IGNlbnRlclhQZXIgLSByYWRpdXNQZXIgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gY2VudGVyWVBlciAtIHJhZGl1c1BlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IGhvdHNwb3Quc3R5bGUuaGVpZ2h0ID0gNCAqIHJhZGl1c1BlciArICdweCc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUuYm9yZGVyUmFkaXVzID0gYDk5OTlweGA7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3JlY3QnOlxuICAgICAge1xuICAgICAgICBjb25zdCBbbGVmdFgsIHRvcFksIHJpZ2h0WCwgYm90dG9tWV0gPSBjb29yZHNOdW1iZXI7XG4gICAgICAgIGNvbnN0IGxlZnRYUGVyID0gKGxlZnRYIC8gaW1nLndpZHRoKSAqIDEwMDtcbiAgICAgICAgY29uc3QgdG9wWVBlciA9ICh0b3BZIC8gaW1nLmhlaWdodCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IHJpZ2h0WFBlciA9IChyaWdodFggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCBib3R0b21ZUGVyID0gKGJvdHRvbVkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgaG90c3BvdC5zdHlsZS5sZWZ0ID0gbGVmdFhQZXIgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gdG9wWVBlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IHJpZ2h0WFBlciAtIGxlZnRYUGVyICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLmhlaWdodCA9IGJvdHRvbVlQZXIgLSB0b3BZUGVyICsgJyUnO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdwb2x5JzpcbiAgICAgIHtcbiAgICAgICAgLy8gZnJvbSBhLGIsYyxkLGUsZiA9PiBbe3g6YSwgeTpifSx7eDpjLCB5OmR9LHt4OmUsIHk6Zn1dXG4gICAgICAgIGNvbnN0IHBvbHljb29yZHMgPSBjb29yZHNOdW1iZXIucmVkdWNlKChhY2MsIGN1cnJlbnRWYWx1ZSwgY3VycmVudEluZGV4LCBwb2x5QykgPT4ge1xuICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggJSAyID09PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0VmFsID0gYWNjLnBvcCgpO1xuICAgICAgICAgICAgYWNjW2FjYy5sZW5ndGhdID0geyB4OiBsYXN0VmFsLCB5OiBwb2x5Q1tjdXJyZW50SW5kZXhdIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIFtdKTtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgYm91bmRpbmcgYm94IGJ5IGZpbmRpbmcgdGhlIG1heCBheCBtaW4gY29vcmRpbmF0ZXMgb2YgeCBhbmQgeVxuICAgICAgICBjb25zdCBsZWZ0WCA9IE1hdGgubWluKC4uLnBvbHljb29yZHMubWFwKHBvaW50ID0+IHBvaW50LngpKTtcbiAgICAgICAgY29uc3QgcmlnaHRYID0gTWF0aC5tYXgoLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueCkpO1xuICAgICAgICBjb25zdCB0b3BZID0gTWF0aC5taW4oLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueSkpO1xuICAgICAgICBjb25zdCBib3R0b21ZID0gTWF0aC5tYXgoLi4ucG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gcG9pbnQueSkpO1xuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgcmVsYXRpdmUgZGlzdGFuY2UgY2F1c2Ugd2Ugd2FudCB0byB1c2UgcGVyY2VudGFnZXNcbiAgICAgICAgY29uc3QgbGVmdFhQZXIgPSAobGVmdFggLyBpbWcud2lkdGgpICogMTAwO1xuICAgICAgICBjb25zdCB0b3BZUGVyID0gKHRvcFkgLyBpbWcuaGVpZ2h0KSAqIDEwMDtcbiAgICAgICAgY29uc3QgcmlnaHRYUGVyID0gKHJpZ2h0WCAvIGltZy53aWR0aCkgKiAxMDA7XG4gICAgICAgIGNvbnN0IGJvdHRvbVlQZXIgPSAoYm90dG9tWSAvIGltZy5oZWlnaHQpICogMTAwO1xuXG4gICAgICAgIC8vIHNldCB0aGUgaG90c3BvdCBvbiB4LHkgYW5kIHNldCB0aGUgd2lkdGggYW5kIGhlaWdodCBpbiBwZXJjZW50YWdlc1xuICAgICAgICBob3RzcG90LnN0eWxlLmxlZnQgPSAobGVmdFggLyBpbWcud2lkdGgpICogMTAwICsgJyUnO1xuICAgICAgICBob3RzcG90LnN0eWxlLnRvcCA9ICh0b3BZIC8gaW1nLmhlaWdodCkgKiAxMDAgKyAnJSc7XG4gICAgICAgIGhvdHNwb3Quc3R5bGUud2lkdGggPSByaWdodFhQZXIgLSBsZWZ0WFBlciArICclJztcbiAgICAgICAgaG90c3BvdC5zdHlsZS5oZWlnaHQgPSBib3R0b21ZUGVyIC0gdG9wWVBlciArICclJztcblxuICAgICAgICAvLyBhbGwgdGhlIHBvbHlnb24gcG9pbnRzIHNob3VsZCBiZSBjb3JyZWN0ZWQgY2F1c2VkIHRoZXkgYXJlIGZyb21cbiAgICAgICAgLy8gaW1hZ2UgMCwwIHBvaW50LCBhbmQgc2hvdWxkIGJlIGZyb20gdGhlIGhvdHNwb3QgcG9pbnQgd2hpY2ggYWxyZWFkeVxuICAgICAgICAvLyBoYXMgYmVlbiBvZmZzZXR0ZWQgZnJvbSB0aGUgaW1hZ2UgaW4gdGhlIHByZXZpb3VzIGZldyBsaW5lcyBvZiBjb2RlXG4gICAgICAgIC8vIGFsc28gdGhlIHBvaW50cyBoYXZlIGEgcmVsYXRpdmUgZGlzdGFuY2UgdG8gdGhlIGltYWdlLCBidXQgbm93IGhhdmVcbiAgICAgICAgLy8gdG8gaGF2ZSBhIHJlbGF0aXZlIGRpc3RhbmNlIGZyb20gdGhlIHdpZHRoIG9mIHRoZSBob3RzcG90XG4gICAgICAgIGNvbnN0IHBvbHlnb25EYXRhID0gcG9seWNvb3Jkcy5tYXAocG9pbnQgPT4gKHtcbiAgICAgICAgICB4OiAoKHBvaW50LnggLSBsZWZ0WCkgLyAocmlnaHRYIC0gbGVmdFgpKSAqIDEwMCxcbiAgICAgICAgICB5OiAoKHBvaW50LnkgLSB0b3BZKSAvIChib3R0b21ZIC0gdG9wWSkpICogMTAwXG4gICAgICAgIH0pKTtcblxuICAgICAgICAvLyBjcmVhdGUgY2xpcCBwYXRoIGNvb3JkaW5hdGUgc3R5bGUgaW4gcGVyY2VudGFnZXNcbiAgICAgICAgY29uc3QgcG9seUQgPSBwb2x5Z29uRGF0YS5tYXAocCA9PiBNYXRoLnJvdW5kKHAueCkgKyAnJSAnICsgTWF0aC5yb3VuZChwLnkpICsgJyUnKS5qb2luKCcsJyk7XG5cbiAgICAgICAgLy8gNTAlIDAlLCAxMDAlIDUwJSwgNTAlIDEwMCUsIDAlIDUwJVxuICAgICAgICBob3RzcG90LnN0eWxlLmNsaXBQYXRoID0gYHBvbHlnb24oJHtwb2x5RH0pYDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluJztcbmltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlHcmFwaGljR2FwTWF0Y2hJbnRlcmFjdGlvbiBleHRlbmRzIERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbihcbiAgTGl0RWxlbWVudCxcbiAgJ3F0aS1nYXAtaW1nJyxcbiAgZmFsc2UsXG4gICdxdGktYXNzb2NpYWJsZS1ob3RzcG90J1xuKSB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIH1cbiAgICBzbG90W25hbWU9J3F0aS1nYXAtaW1nJ10ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGdhcDogMXJlbTtcbiAgICB9XG4gIGA7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdD48L3Nsb3Q+XG4gICAgICA8c2xvdCBuYW1lPVwicXRpLWdhcC1pbWdcIj48L3Nsb3Q+YDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Ib3RzcG90T25SZWdpc3RlcihlOiBDdXN0b21FdmVudDxudWxsPik6IHZvaWQge1xuICAgIGNvbnN0IGltZyA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJykgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICBjb25zdCBob3RzcG90ID0gZS50YXJnZXQgYXMgUXRpSG90c3BvdENob2ljZTtcbiAgICBjb25zdCBjb29yZHMgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJyk7XG4gICAgY29uc3Qgc2hhcGUgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnc2hhcGUnKTtcbiAgICBjb25zdCBjb29yZHNOdW1iZXIgPSBjb29yZHMuc3BsaXQoJywnKS5tYXAocyA9PiBwYXJzZUludChzKSk7XG5cbiAgICAvLyBwb3NpdGlvbkhvdHNwb3RzKHNoYXBlLCBjb29yZHNOdW1iZXIsIGltZywgaG90c3BvdCk7XG4gICAgc3dpdGNoIChzaGFwZSkge1xuICAgICAgY2FzZSAnY2lyY2xlJzpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IFtjZW50ZXJYLCBjZW50ZXJZLCByYWRpdXNdID0gY29vcmRzTnVtYmVyO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IGNlbnRlclggLSByYWRpdXMgKyAncHgnO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUudG9wID0gY2VudGVyWSAtIHJhZGl1cyArICdweCc7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS53aWR0aCA9IGhvdHNwb3Quc3R5bGUuaGVpZ2h0ID0gMiAqIHJhZGl1cyArICdweCc7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3JlY3QnOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgW2xlZnRYLCB0b3BZLCByaWdodFgsIGJvdHRvbVldID0gY29vcmRzTnVtYmVyO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUubGVmdCA9IGxlZnRYICsgJ3B4JztcbiAgICAgICAgICBob3RzcG90LnN0eWxlLnRvcCA9IHRvcFkgKyAncHgnO1xuICAgICAgICAgIGhvdHNwb3Quc3R5bGUud2lkdGggPSByaWdodFggLSBsZWZ0WCArICdweCc7XG4gICAgICAgICAgaG90c3BvdC5zdHlsZS5oZWlnaHQgPSBib3R0b21ZIC0gdG9wWSArICdweCc7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItaG90c3BvdCcsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1ob3RzcG90JywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nOiBRdGlHcmFwaGljR2FwTWF0Y2hJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBDaG9pY2VzIH0gZnJvbSAnLi4vaW50ZXJuYWwvY2hvaWNlcy9jaG9pY2VzJztcbmltcG9ydCB7IFF0aUhvdHNwb3RDaG9pY2UgfSBmcm9tICcuLi9xdGktaG90c3BvdC1jaG9pY2UnO1xuXG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcG9zaXRpb25Ib3RzcG90cyB9IGZyb20gJy4uL2ludGVybmFsL2hvdHNwb3RzL2hvdHNwb3QnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aUdyYXBoaWNPcmRlckludGVyYWN0aW9uIGV4dGVuZHMgQ2hvaWNlcyB7XG4gIGNob2ljZU9yZGVyaW5nOiBib29sZWFuO1xuXG4gIC8vIGRvIG5vdCBzZWxlY3QgKCBoaWdobGlnaHQgYmx1ZSwgdGhlIGltYWdlKVxuICAvLyB0YXJnZXQgdGhlIG1haW4gc2xvdCBtYWtlIGl0IHJlbGF0aXZlIGFuZCBmaXQgd2l0aCB0aGUgY29udGVuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgc2xvdDpub3QoW25hbWU9J3Byb21wdCddKSB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgLyogcXRpLWhvdHNwb3QtY2hvaWNlIHJlbGF0aXZlIHRvIHRoZSBzbG90ICovXG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB3aWR0aDogZml0LWNvbnRlbnQ7IC8qIGhvdHNwb3RzIG5vdCBzdHJldGNoaW5nIGZ1cnRoZXIgaWYgaW1hZ2UgaXMgYXQgbWF4IHNpemUgKi9cbiAgICAgIH1cbiAgICAgIDo6c2xvdHRlZChpbWcpIHtcbiAgICAgICAgLyogaW1hZ2Ugbm90IHNlbGVjdGFibGUgYW55bW9yZSAqL1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICB9XG4gICAgYFxuICBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBwcm9tcHQgLS0+XG4gICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBpbWFnZSBhbmQgaG90c3BvdHMgLS0+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SG90c3BvdE9yZGVyKGU6IEN1c3RvbUV2ZW50PHsgaWRlbnRpZmllcjogc3RyaW5nOyBjaGVja2VkOiBib29sZWFuIH0+KTogdm9pZCB7XG4gICAgY29uc3QgeyBpZGVudGlmaWVyIH0gPSBlLmRldGFpbDtcblxuICAgIGNvbnN0IGhvdHNwb3QgPSB0aGlzLl9jaG9pY2VFbGVtZW50cy5maW5kKGVsID0+IGVsLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpID09PSBpZGVudGlmaWVyKSBhcyBRdGlIb3RzcG90Q2hvaWNlO1xuXG4gICAgY29uc3QgbWF4U2VsZWN0aW9uID0gdGhpcy5fY2hvaWNlRWxlbWVudHMubGVuZ3RoO1xuICAgIGlmICghdGhpcy5jaG9pY2VPcmRlcmluZykge1xuICAgICAgdGhpcy5jaG9pY2VPcmRlcmluZyA9IHRydWU7XG4gICAgICBpZiAoaG90c3BvdC5vcmRlciA9PSBudWxsKSB7XG4gICAgICAgIGlmICgodGhpcy5fY2hvaWNlRWxlbWVudHMgYXMgUXRpSG90c3BvdENob2ljZVtdKS5maWx0ZXIoaSA9PiBpLm9yZGVyID4gMCkubGVuZ3RoID49IG1heFNlbGVjdGlvbikge1xuICAgICAgICAgIHRoaXMuY2hvaWNlT3JkZXJpbmcgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm47IC8vIGRvbid0IGRvIGFueXRoaW5nIGlmIHVzZXIgYWxyZWFkeSBzZWxlY3RlZCA1IGltYWdlcy5cbiAgICAgICAgfVxuICAgICAgICBob3RzcG90Lm9yZGVyID0gKHRoaXMuX2Nob2ljZUVsZW1lbnRzIGFzIFF0aUhvdHNwb3RDaG9pY2VbXSkuZmlsdGVyKGkgPT4gISFpLm9yZGVyKS5sZW5ndGggKyAxO1xuICAgICAgICB0aGlzLmNob2ljZU9yZGVyaW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICh0aGlzLl9jaG9pY2VFbGVtZW50cyBhcyBRdGlIb3RzcG90Q2hvaWNlW10pLmZvckVhY2goaG90c3BvdCA9PiB7XG4gICAgICAgICAgaWYgKGhvdHNwb3Qub3JkZXIgPiBob3RzcG90Lm9yZGVyKSB7XG4gICAgICAgICAgICBob3RzcG90Lm9yZGVyLS07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBob3RzcG90O1xuICAgICAgICB9KTtcbiAgICAgICAgaG90c3BvdC5vcmRlciA9IG51bGw7XG4gICAgICB9XG4gICAgICB0aGlzLmNob2ljZU9yZGVyaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKGU6IEN1c3RvbUV2ZW50PFF0aUhvdHNwb3RDaG9pY2U+KTogdm9pZCB7XG4gICAgY29uc3QgaW1nID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdpbWcnKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIGNvbnN0IGhvdHNwb3QgPSBlLnRhcmdldCBhcyBRdGlIb3RzcG90Q2hvaWNlO1xuICAgIGNvbnN0IGNvb3JkcyA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdjb29yZHMnKTtcbiAgICBjb25zdCBzaGFwZSA9IGhvdHNwb3QuZ2V0QXR0cmlidXRlKCdzaGFwZScpO1xuICAgIGNvbnN0IGNvb3Jkc051bWJlciA9IGNvb3Jkcy5zcGxpdCgnLCcpLm1hcChzID0+IHBhcnNlSW50KHMpKTtcblxuICAgIHBvc2l0aW9uSG90c3BvdHMoc2hhcGUsIGNvb3Jkc051bWJlciwgaW1nLCBob3RzcG90KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktY2hvaWNlLWVsZW1lbnQtc2VsZWN0ZWQnLCB0aGlzLnNldEhvdHNwb3RPcmRlcik7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdxdGktcmVnaXN0ZXItY2hvaWNlJywgdGhpcy5wb3NpdGlvbkhvdHNwb3RPblJlZ2lzdGVyKTtcbiAgfVxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigncXRpLWNob2ljZS1lbGVtZW50LXNlbGVjdGVkJywgdGhpcy5zZXRIb3RzcG90T3JkZXIpO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWNob2ljZScsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdyYXBoaWMtb3JkZXItaW50ZXJhY3Rpb24nOiBRdGlHcmFwaGljT3JkZXJJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQ2hvaWNlcyB9IGZyb20gJy4uL2ludGVybmFsL2Nob2ljZXMvY2hvaWNlcyc7XG5pbXBvcnQgeyBwb3NpdGlvbkhvdHNwb3RzIH0gZnJvbSAnLi4vaW50ZXJuYWwvaG90c3BvdHMvaG90c3BvdCc7XG5pbXBvcnQgeyBRdGlIb3RzcG90Q2hvaWNlIH0gZnJvbSAnLi4vcXRpLWhvdHNwb3QtY2hvaWNlJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1ob3RzcG90LWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlIb3RzcG90SW50ZXJhY3Rpb24gZXh0ZW5kcyBDaG9pY2VzIHtcbiAgLy8gZG8gbm90IHNlbGVjdCAoIGhpZ2hsaWdodCBibHVlLCB0aGUgaW1hZ2UpXG4gIC8vIHRhcmdldCB0aGUgbWFpbiBzbG90IG1ha2UgaXQgcmVsYXRpdmUgYW5kIGZpdCB3aXRoIHRoZSBjb250ZW5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICBzbG90Om5vdChbbmFtZT0ncHJvbXB0J10pIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOyAvKiBxdGktaG90c3BvdC1jaG9pY2UgcmVsYXRpdmUgdG8gdGhlIHNsb3QgKi9cbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiBmaXQtY29udGVudDsgLyogaG90c3BvdHMgbm90IHN0cmV0Y2hpbmcgZnVydGhlciBpZiBpbWFnZSBpcyBhdCBtYXggc2l6ZSAqL1xuICAgICAgfVxuICAgICAgOjpzbG90dGVkKGltZykge1xuICAgICAgICAvKiBpbWFnZSBub3Qgc2VsZWN0YWJsZSBhbnltb3JlICovXG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgLyogd2lkdGg6MTAwJTsgKi9cbiAgICAgIH1cbiAgICBgXG4gIF07XG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBwcm9tcHQgLS0+XG4gICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8IS0tIHNsb3QgZm9yIHRoZSBpbWFnZSBhbmQgaG90c3BvdHMgLS0+XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zaXRpb25Ib3RzcG90T25SZWdpc3RlcihlOiBDdXN0b21FdmVudDxRdGlIb3RzcG90Q2hvaWNlPik6IHZvaWQge1xuICAgIGNvbnN0IGltZyA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJykgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICBjb25zdCBob3RzcG90ID0gZS50YXJnZXQgYXMgUXRpSG90c3BvdENob2ljZTtcbiAgICBjb25zdCBjb29yZHMgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnY29vcmRzJyk7XG4gICAgY29uc3Qgc2hhcGUgPSBob3RzcG90LmdldEF0dHJpYnV0ZSgnc2hhcGUnKTtcbiAgICBjb25zdCBjb29yZHNOdW1iZXIgPSBjb29yZHMuc3BsaXQoJywnKS5tYXAocyA9PiBwYXJzZUludChzKSk7XG5cbiAgICBwb3NpdGlvbkhvdHNwb3RzKHNoYXBlLCBjb29yZHNOdW1iZXIsIGltZywgaG90c3BvdCk7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigncXRpLXJlZ2lzdGVyLWNob2ljZScsIHRoaXMucG9zaXRpb25Ib3RzcG90T25SZWdpc3Rlcik7XG4gIH1cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3F0aS1yZWdpc3Rlci1jaG9pY2UnLCB0aGlzLnBvc2l0aW9uSG90c3BvdE9uUmVnaXN0ZXIpO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ob3RzcG90LWludGVyYWN0aW9uJzogUXRpSG90c3BvdEludGVyYWN0aW9uO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiB9IGZyb20gJy4uL2ludGVybmFsL2RyYWctZHJvcC9kcmFnLWRyb3AtaW50ZXJhY3Rpb24tbWl4aW4nO1xuXG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVIVE1MIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvdW5zYWZlLWh0bWwuanMnO1xuaW1wb3J0IHsgUmVzcG9uc2VJbnRlcmFjdGlvbiB9IGZyb20gJy4uLy4uL2ludGVybmFsL2V4cHJlc3Npb24tcmVzdWx0JztcbmltcG9ydCAnLi4vcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSc7XG5pbXBvcnQgeyBRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlIH0gZnJvbSAnLi4vcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSc7XG5cbmludGVyZmFjZSBDb2x1bW4ge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBSb3cge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG4gIGlzQ2hlY2tlZDogYm9vbGVhbjtcbn1cblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1tYXRjaC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpTWF0Y2hJbnRlcmFjdGlvbiBleHRlbmRzIERyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbihcbiAgTGl0RWxlbWVudCxcbiAgJ3F0aS1zaW1wbGUtbWF0Y2gtc2V0OmZpcnN0LW9mLXR5cGUgcXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScsXG4gIGZhbHNlLFxuICAncXRpLXNpbXBsZS1tYXRjaC1zZXQ6bGFzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnXG4pIHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMC41cmVtO1xuICAgICAgfVxuXG4gICAgICAvKiA6aG9zdCgucXRpLWNob2ljZXMtdG9wKSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICB9ICovXG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtYm90dG9tKSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1sZWZ0KSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtcmlnaHQpIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICByb3dzOiBRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlW107XG4gIGNvbHM6IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2VbXTtcbiAgbGFzdENoZWNrZWRSYWRpbzogSFRNTElucHV0RWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIEBzdGF0ZSgpIHJlc3BvbnNlID0gW107XG4gIEBzdGF0ZSgpIGNvcnJlY3RPcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogJ3Jlc3BvbnNlLWlkZW50aWZpZXInIH0pIHJlc3BvbnNlSWRlbnRpZmllcjogc3RyaW5nID0gJyc7XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLnJvd3MgPSBBcnJheS5mcm9tPFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2U+KFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHdjL25vLWNoaWxkLXRyYXZlcnNhbC1pbi1jb25uZWN0ZWRjYWxsYmFja1xuICAgICAgdGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLW1hdGNoLXNldDpmaXJzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuICAgICk7XG4gICAgdGhpcy5jb2xzID0gQXJyYXkuZnJvbTxRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlPihcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB3Yy9uby1jaGlsZC10cmF2ZXJzYWwtaW4tY29ubmVjdGVkY2FsbGJhY2tcbiAgICAgIHRoaXMucXVlcnlTZWxlY3RvckFsbCgncXRpLXNpbXBsZS1tYXRjaC1zZXQ6bGFzdC1vZi10eXBlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKVxuICAgICk7XG5cbiAgICB0aGlzLnJlc3BvbnNlID0gW107XG4gIH1cblxuICBoYW5kbGVSYWRpb0NsaWNrID0gZSA9PiB7XG4gICAgY29uc3QgcmFkaW8gPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGlmICh0aGlzLmxhc3RDaGVja2VkUmFkaW8gPT09IHJhZGlvKSB7XG4gICAgICByYWRpby5jaGVja2VkID0gZmFsc2U7XG4gICAgICB0aGlzLmxhc3RDaGVja2VkUmFkaW8gPSBudWxsO1xuICAgICAgdGhpcy5oYW5kbGVSYWRpb0NoYW5nZShlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sYXN0Q2hlY2tlZFJhZGlvID0gcmFkaW87XG4gICAgfVxuICB9O1xuXG4gIGhhbmRsZVJhZGlvQ2hhbmdlID0gZSA9PiB7XG4gICAgY29uc3QgY2hlY2tib3ggPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGNvbnN0IHZhbHVlID0gY2hlY2tib3gudmFsdWU7XG4gICAgY29uc3QgbmFtZSA9IGNoZWNrYm94Lm5hbWU7XG4gICAgY29uc3QgdHlwZSA9IGNoZWNrYm94LnR5cGU7XG5cbiAgICBpZiAoY2hlY2tib3guY2hlY2tlZCkge1xuICAgICAgaWYgKCF0aGlzLnJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSBbdmFsdWVdO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnJlc3BvbnNlLmluZGV4T2YodmFsdWUpID09PSAtMSkge1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICAgIHRoaXMucmVzcG9uc2UgPSB0aGlzLnJlc3BvbnNlLmZpbHRlcih2ID0+IHYuaW5kZXhPZihuYW1lKSA9PT0gLTEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSBbLi4udGhpcy5yZXNwb25zZSwgdmFsdWVdO1xuICAgICAgfVxuICAgICAgdGhpcy5sYXN0Q2hlY2tlZFJhZGlvID0gY2hlY2tib3g7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzcG9uc2UgPSB0aGlzLnJlc3BvbnNlLmZpbHRlcih2ID0+IHYgIT09IHZhbHVlKTtcbiAgICAgIHRoaXMubGFzdENoZWNrZWRSYWRpbyA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCk7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PFJlc3BvbnNlSW50ZXJhY3Rpb24+KCdxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICByZXNwb25zZUlkZW50aWZpZXI6IHRoaXMucmVzcG9uc2VJZGVudGlmaWVyLFxuICAgICAgICAgIHJlc3BvbnNlOiBBcnJheS5pc0FycmF5KHRoaXMucmVzcG9uc2UpID8gWy4uLnRoaXMucmVzcG9uc2VdIDogdGhpcy5yZXNwb25zZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH07XG5cbiAgc2V0IGNvcnJlY3RSZXNwb25zZShyZXNwb25zZVZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIGlmIChyZXNwb25zZVZhbHVlID09PSAnJykge1xuICAgICAgdGhpcy5jb3JyZWN0T3B0aW9ucyA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXNwb25zZVZhbHVlKSkge1xuICAgICAgdGhpcy5jb3JyZWN0T3B0aW9ucyA9IHJlc3BvbnNlVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIGlmICghdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoJ3F0aS1tYXRjaC10YWJ1bGFyJykpIHtcbiAgICAgIHJldHVybiBodG1sYDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+IDxzbG90Pjwvc2xvdD5gO1xuICAgIH1cbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj48L3Nsb3Q+XG4gICAgICA8dGFibGU+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICA8dGQ+PC90ZD5cbiAgICAgICAgICAke3RoaXMuY29scy5tYXAoKGNvbCwgaSkgPT4gaHRtbGA8dGggcGFydD1cInItaGVhZGVyXCI+JHt1bnNhZmVIVE1MKGNvbC5pbm5lckhUTUwpfTwvdGg+YCl9XG4gICAgICAgIDwvdHI+XG5cbiAgICAgICAgJHt0aGlzLnJvd3MubWFwKFxuICAgICAgICAgIChyb3csIHJJbmRleCkgPT5cbiAgICAgICAgICAgIGh0bWxgPHRyPlxuICAgICAgICAgICAgICA8dGQgcGFydD1cImMtaGVhZGVyXCI+JHt1bnNhZmVIVE1MKHJvdy5pbm5lckhUTUwpfTwvdGQ+XG4gICAgICAgICAgICAgICR7dGhpcy5jb2xzLm1hcCgoY29sLCBjSW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3dJZCA9IHJvdy5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xJZCA9IGNvbC5nZXRBdHRyaWJ1dGUoJ2lkZW50aWZpZXInKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGAke3Jvd0lkfSAke2NvbElkfWA7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJblJvd0NvdW50ID0gdGhpcy5yZXNwb25zZS5maWx0ZXIodiA9PiB2LnNwbGl0KCcgJylbMF0gPT09IHJvd0lkKS5sZW5ndGggfHwgMDtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGVja2VkID0gdGhpcy5yZXNwb25zZS5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFydCA9IGByYiAke2NoZWNrZWQgPyAncmItY2hlY2tlZCcgOiAnJ30gJHt0aGlzLmNvcnJlY3RPcHRpb25zLmluY2x1ZGVzKHZhbHVlKSA/ICdyYi1jb3JyZWN0JyA6ICcnfWA7XG4gICAgICAgICAgICAgICAgLy8gZGlzYWJsZSBpZiBtYXRjaCBtYXggaXMgZ3JlYXRlciB0aGFuIDEgYW5kIG1heCBpcyByZWFjaGVkXG4gICAgICAgICAgICAgICAgY29uc3QgZGlzYWJsZSA9XG4gICAgICAgICAgICAgICAgICB0aGlzLmNvcnJlY3RPcHRpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgICAgICAgIDogcm93Lm1hdGNoTWF4ID09PSAxXG4gICAgICAgICAgICAgICAgICAgICAgPyBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgIDogc2VsZWN0ZWRJblJvd0NvdW50ID49IHJvdy5tYXRjaE1heCAmJiAhY2hlY2tlZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbGA8dGQ+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT0ke3Jvdy5tYXRjaE1heCA9PT0gMSA/ICdyYWRpbycgOiBgY2hlY2tib3hgfVxuICAgICAgICAgICAgICAgICAgICByb2xlPVwiaWRcIlxuICAgICAgICAgICAgICAgICAgICBwYXJ0PSR7cGFydH1cbiAgICAgICAgICAgICAgICAgICAgbmFtZT0ke3Jvd0lkfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ke3ZhbHVlfVxuICAgICAgICAgICAgICAgICAgICAuZGlzYWJsZWQ9JHtkaXNhYmxlfVxuICAgICAgICAgICAgICAgICAgICBAY2hhbmdlPSR7ZSA9PiB0aGlzLmhhbmRsZVJhZGlvQ2hhbmdlKGUpfVxuICAgICAgICAgICAgICAgICAgICBAY2xpY2s9JHtlID0+IChyb3cubWF0Y2hNYXggPT09IDEgPyB0aGlzLmhhbmRsZVJhZGlvQ2xpY2soZSkgOiBudWxsKX1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC90ZD5gO1xuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIDwvdHI+YFxuICAgICAgICApfVxuICAgICAgPC90YWJsZT5cbiAgICBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1tYXRjaC1pbnRlcmFjdGlvbic6IFF0aU1hdGNoSW50ZXJhY3Rpb247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG4vLyBUSElTIElTIE5PVCBVU0VEIElOIFRBQlVMQVIgTUFUQ0ggSU5URVJBQ1RJT05cbkBjdXN0b21FbGVtZW50KCdxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlJylcbi8vIHRzbGludDpkaXNhYmxlOiBpbmRlbnRcbmV4cG9ydCBjbGFzcyBRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIC8qKiB0aGUgbWluaW1hbCBudW1iZXIgb2Ygc2VsZWN0aW9ucyBhIGNhbmRpZGF0ZSBtdXN0IG1ha2UgKi9cbiAgQHByb3BlcnR5KHtcbiAgICB0eXBlOiBOdW1iZXIsXG4gICAgYXR0cmlidXRlOiAnbWF0Y2gtbWluJ1xuICB9KVxuICBwdWJsaWMgbWF0Y2hNaW46IG51bWJlciA9IDA7XG5cbiAgLyoqIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWxlY3Rpb25zIGEgY2FuZGlkYXRlIG11c3QgbWFrZSwgdGhlIG90aGVyIG9wdGlvbnMgd2lsbCBiZSBkaXNhYmxlZCB3aGVuIG1heCBvcHRpb25zIGlzIGNoZWNrZWQgKi9cbiAgQHByb3BlcnR5KHtcbiAgICB0eXBlOiBOdW1iZXIsXG4gICAgYXR0cmlidXRlOiAnbWF0Y2gtbWF4J1xuICB9KVxuICBwdWJsaWMgbWF0Y2hNYXg6IG51bWJlciA9IDE7XG5cbiAgQHByb3BlcnR5KHtcbiAgICB0eXBlOiBCb29sZWFuLFxuICAgIGF0dHJpYnV0ZTogJ2ZpeGVkJ1xuICB9KVxuICBwdWJsaWMgZml4ZWQgPSBmYWxzZTtcblxuICAvLyBwazogVGhpcyBuZWVkcyBzb21lIGV4cGxhbmF0aW9uXG4gIC8vIGluIHRoZSBhc3NvY2lhdGUgaW50ZXJhY3Rpb24gdGhlcmUgaXMgYSBzcGVjaWFsIHNsb3QgZm9yIHRoZXNlIHF0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2VzXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZScpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdwYXJ0JywgJ3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnKTtcbiAgfVxuXG4gIC8vIHBrOiBUaGlzIG5lZWRzIHNvbWUgZXhwbGFuYXRpb25cbiAgLy8gaW4gcXRpLW1hdGNoLWludGVyYWN0aW9uLCBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlIGlzIHVzZWQgdG8gZGVub3RlIHRoZVxuICAvLyBkcmFnZ2FibGUsIGJ1dCBhbHNvIHRoZSBkcm9wcGFibGUuIFdFSVJELi4gYnV0IGxldHMgZGVhbCB3aXRoIGl0LlxuICAvLyBTbyB3ZSBoYXZlIGEgc2xvdCBmb3Igd2hlbmV2ZXIgYW5vdGhlciBxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlIGlzIGRyb3BwZWQgaW4gaGVyZS5cbiAgLy8gQW5kIHdlIGhhdmUgc2xvdCBmb3IgY29udGVudCBsaWtlIGluIHRoaXMgYXNzb2NpYXRlIGludGVyYWN0aW9uXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgIDxzbG90IG5hbWU9XCJxdGktc2ltcGxlLWFzc29jaWFibGUtY2hvaWNlXCI+PC9zbG90PlxuICAgIGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXNpbXBsZS1hc3NvY2lhYmxlLWNob2ljZSc6IFF0aVNpbXBsZUFzc29jaWFibGVDaG9pY2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLW1lZGlhLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlNZWRpYUludGVyYWN0aW9uIGV4dGVuZHMgSW50ZXJhY3Rpb24ge1xuICB2YWx1ZSA9IDA7XG4gIHJlc2V0KCkge1xuICAgIC8vIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICAvLyB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgc2V0IHJlc3BvbnNlKHZhbDogdW5kZWZpbmVkKSB7XG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIGdldCBwcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5JbnRlcmFjdGlvbi5wcm9wZXJ0aWVzLFxuICAgICAgLi4ue1xuICAgICAgICBzdGVwOiB7XG4gICAgICAgICAgdHlwZTogTnVtYmVyLFxuICAgICAgICAgIGF0dHJpYnV0ZTogJ3N0ZXAnLFxuICAgICAgICAgIGRlZmF1bHQ6IDEwXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtjc3NgYF07XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICAvLyBnZXQgYXVkaW8sIHZpZGVvIG9mIG9iamVjdCB0YWcuXG4gICAgY29uc3QgbWVkaWFPYmplY3QgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ2F1ZGlvJykgfHwgdGhpcy5xdWVyeVNlbGVjdG9yKCd2aWRlbycpIHx8IHRoaXMucXVlcnlTZWxlY3Rvcignb2JqZWN0Jyk7XG4gICAgaWYgKG1lZGlhT2JqZWN0KSB7XG4gICAgICAvLyBsaXN0ZW4gdG8gZW5kZWQgZXZlbnRcbiAgICAgIG1lZGlhT2JqZWN0LmFkZEV2ZW50TGlzdGVuZXIoJ2VuZGVkJywgKCkgPT4ge1xuICAgICAgICAvLyBzZXQgdmFsdWUgdG8gMFxuICAgICAgICB0aGlzLnZhbHVlKys7XG4gICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMudmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW1lZGlhLWludGVyYWN0aW9uJzogUXRpTWVkaWFJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgc3RhdGUgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4gfSBmcm9tICcuLi9pbnRlcm5hbC9kcmFnLWRyb3AvZHJhZy1kcm9wLWludGVyYWN0aW9uLW1peGluJztcbmltcG9ydCB7IHVuc2FmZUhUTUwgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy91bnNhZmUtaHRtbC5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktb3JkZXItaW50ZXJhY3Rpb24nKVxuZXhwb3J0IGNsYXNzIFF0aU9yZGVySW50ZXJhY3Rpb24gZXh0ZW5kcyBEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4oTGl0RWxlbWVudCwgYHF0aS1zaW1wbGUtY2hvaWNlYCwgdHJ1ZSwgJ2Ryb3AtbGlzdCcpIHtcbiAgY2hpbGRyZW5NYXA6IEVsZW1lbnRbXTtcbiAgcHJpdmF0ZSBfY2xhc3NOYW1lczogc3RyaW5nO1xuICBwcml2YXRlIF9vcmllbnRhdGlvbjogJ3ZlcnRpY2FsJyB8ICdob3Jpem9udGFsJztcblxuICBwdWJsaWMgc3RhdGljIGxheW91dENsYXNzID0gWydxdGktY2hvaWNlcy10b3AnLCAncXRpLWNob2ljZXMtYm90dG9tJywgJ3F0aS1jaG9pY2VzLWxlZnQnLCAncXRpLWNob2ljZXMtcmlnaHQnXTtcblxuICBAc3RhdGUoKSBuckNob2ljZXM6IG51bWJlciA9IDA7XG4gIEBzdGF0ZSgpIGNvcnJlY3RSZXNwb25zZXM6IHN0cmluZ1tdID0gW107ICBcbiAgQHN0YXRlKCkgc2hvd0NvcnJlY3RSZXNwb25zZXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogb3JpZW50YXRpb24gb2YgY2hvaWNlcyAqL1xuICBAcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSlcbiAgcHVibGljIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbXG4gICAgY3NzYFxuICAgICAgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZmxleDogMTtcbiAgICAgIH1cblxuICAgICAgW3BhcnQ9J2Ryb3BzJ10ge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICBncmlkLWF1dG8tZmxvdzogY29sdW1uO1xuICAgICAgICBncmlkLWF1dG8tY29sdW1uczogMWZyO1xuICAgICAgfVxuXG4gICAgICA6aG9zdChbb3JpZW50YXRpb249J2hvcml6b250YWwnXSkgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgfVxuICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSdob3Jpem9udGFsJ10pIFtwYXJ0PSdkcm9wcyddIHtcbiAgICAgICAgZ3JpZC1hdXRvLWZsb3c6IGNvbHVtbjtcbiAgICAgIH1cbiAgICAgIDpob3N0KFtvcmllbnRhdGlvbj0ndmVydGljYWwnXSkgW3BhcnQ9J2RyYWdzJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgfVxuICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSd2ZXJ0aWNhbCddKSBbcGFydD0nZHJvcHMnXSB7XG4gICAgICAgIGdyaWQtYXV0by1mbG93OiByb3c7XG4gICAgICB9XG5cbiAgICAgIFtwYXJ0PSdkcm9wLWxpc3QnXSB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgfVxuXG4gICAgICBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBnYXA6IDAuNXJlbTtcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy10b3ApIFtwYXJ0PSdjb250YWluZXInXSB7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtYm90dG9tKSBbcGFydD0nY29udGFpbmVyJ10ge1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XG4gICAgICB9XG4gICAgICA6aG9zdCgucXRpLWNob2ljZXMtbGVmdCkgW3BhcnQ9J2NvbnRhaW5lciddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgIH1cbiAgICAgIDpob3N0KC5xdGktY2hvaWNlcy1yaWdodCkgW3BhcnQ9J2NvbnRhaW5lciddIHtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgY29uc3QgY2hvaWNlcyA9IEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCdxdGktc2ltcGxlLWNob2ljZScpKTtcbiAgICBpZiAodGhpcy5uckNob2ljZXMgPCBjaG9pY2VzLmxlbmd0aCkge1xuICAgICAgdGhpcy5uckNob2ljZXMgPSBjaG9pY2VzLmxlbmd0aDtcbiAgICB9ICAgIFxuXG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJwcm9tcHRcIj4gPC9zbG90PlxuICAgICAgPGRpdiBwYXJ0PVwiY29udGFpbmVyXCI+XG4gICAgICAgIDxzbG90IHBhcnQ9XCJkcmFnc1wiPiA8L3Nsb3Q+XG4gICAgICAgIDxkaXYgcGFydD1cImRyb3BzXCI+XG4gICAgICAgICAgJHtBcnJheS5mcm9tKEFycmF5KHRoaXMubnJDaG9pY2VzKSkubWFwKFxuICAgICAgICAgICAgKF8sIGkpID0+IGh0bWxgPGRyb3AtbGlzdCBwYXJ0PVwiZHJvcC1saXN0XCIgaWRlbnRpZmllcj1cImRyb3BsaXN0JHtpfVwiPjwvZHJvcC1saXN0PiR7dGhpcy5zaG93Q29ycmVjdFJlc3BvbnNlcyAmJiB0aGlzLmNvcnJlY3RSZXNwb25zZXMubGVuZ3RoID4gaSA/IHVuc2FmZUhUTUwoYDxzcGFuIHBhcnQ9J2NvcnJlY3QtcmVzcG9uc2UnPiR7dGhpcy5jb3JyZWN0UmVzcG9uc2VzW2ldfTwvc3Bhbj5gKSA6ICcnfWBcbiAgICAgICAgICApfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gIH1cblxuICBzZXQgY29ycmVjdFJlc3BvbnNlKHZhbHVlOiBSZWFkb25seTxzdHJpbmcgfCBzdHJpbmdbXT4pIHsgICAgIFxuICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgIHRoaXMuc2hvd0NvcnJlY3RSZXNwb25zZXMgPSBmYWxzZTtcbiAgICAgIHJldHVyblxuICAgIH0gXG4gICAgXG4gICAgaWYgKHRoaXMuY29ycmVjdFJlc3BvbnNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlcyA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuXG4gICAgICByZXNwb25zZXMuZm9yRWFjaCgocmVzcG9uc2UsIGluZGV4KSA9PiB7XG4gICAgICAgIGxldCBzaW1wbGVDaG9pY2UgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoYHF0aS1zaW1wbGUtY2hvaWNlW2lkZW50aWZpZXI9XCIke3Jlc3BvbnNlfVwiXWApO1xuICAgICAgICBpZiAoIXNpbXBsZUNob2ljZSkge1xuICAgICAgICAgIHNpbXBsZUNob2ljZSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKGBxdGktc2ltcGxlLWNob2ljZVtpZGVudGlmaWVyPVwiJHtyZXNwb25zZX1cIl1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRleHQgPSBzaW1wbGVDaG9pY2U/LnRleHRDb250ZW50LnRyaW0oKTtcbiAgICAgICAgdGhpcy5jb3JyZWN0UmVzcG9uc2VzID0gWy4uLnRoaXMuY29ycmVjdFJlc3BvbnNlcywgdGV4dF07XG4gICAgICB9KSAgICBcbiAgICB9XG5cbiAgICB0aGlzLnNob3dDb3JyZWN0UmVzcG9uc2VzID0gdHJ1ZTtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgLy8gSU5GUklOR0VNRU5ULi5cbiAgICAvLyBQSzogaWYgY2hpbGRyZW4gYXJlIGRyb3BwZWQgaW50byBzaGFkb3dkb20sIHN0eWxpbmcgaXMgbG9zdCwgc28gd2UgYWRkIGEgcGFydCBzZWxlY3RvciBvbiBhbGwgY2hpbGRyZW5cbiAgICAvLyBJIHRoZXkgZ2V0IGxvc3QgaW50byBzaGFkb3cgZG9tIGFmdGVyIGRyb3BwZWQsIHRoZXkgY2FuIHN0aWxsIGJlIHN0eWxlZCB2aWEgbGlnaHRkb20gcGFydCBzZWxlY3RvcnNcbiAgICB0aGlzLmNoaWxkcmVuTWFwID0gQXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3F0aS1zaW1wbGUtY2hvaWNlJykpO1xuICAgIHRoaXMuY2hpbGRyZW5NYXAuZm9yRWFjaChlbCA9PiBlbC5zZXRBdHRyaWJ1dGUoJ3BhcnQnLCAncXRpLXNpbXBsZS1jaG9pY2UnKSk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLW9yZGVyLWludGVyYWN0aW9uJzogUXRpT3JkZXJJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5cbmV4cG9ydCBjbGFzcyBRdGlTUG9zaXRpb25PYmplY3RJbnRlcmFjdGlvbiBleHRlbmRzIExpdEVsZW1lbnQge1xuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPHNsb3Q+PC9zbG90PmA7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW1xuICAgIGNzc2BcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB9XG4gICAgICA6OnNsb3R0ZWQoaW1nKSB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgY3Vyc29yOiBtb3ZlO1xuICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICAgICAgbGVmdDogNTAlO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gICAgICB9XG4gICAgYFxuICBdO1xufVxuXG5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24nLCBRdGlTUG9zaXRpb25PYmplY3RJbnRlcmFjdGlvbik7XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCwgY3NzLCBodG1sIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbkBjdXN0b21FbGVtZW50KCdxdGktcG9zaXRpb24tb2JqZWN0LXN0YWdlJylcbmV4cG9ydCBjbGFzcyBRdGlQb3NpdGlvbk9iamVjdFN0YWdlIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIGNob2ljZU9yZGVyaW5nOiBib29sZWFuO1xuICBzdGFydFg6IGFueTtcbiAgc3RhcnRZOiBhbnk7XG4gIGRyYWdFbGVtZW50OiBhbnk7XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgIGBcbiAgXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmVtb3ZlTW92ZUxpc3RlbmVyID0gdGhpcy5yZW1vdmVNb3ZlTGlzdGVuZXIuYmluZCh0aGlzKTtcbiAgICB0aGlzLmRyYWdFbGVtZW50SGFuZGxlciA9IHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyLmJpbmQodGhpcyk7XG4gIH1cblxuICAvLyBEZWZpbmUgYSBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIG1vdXNlbW92ZSBldmVudCBvbiB0aGUgZHJhZ2dhYmxlIGVsZW1lbnRcbiAgZHJhZ0VsZW1lbnRIYW5kbGVyKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgdGhlIG1vdXNlIGhhcyBtb3ZlZCBzaW5jZSB0aGUgbGFzdCBldmVudFxuICAgIGNvbnN0IGRlbHRhWCA9IGV2ZW50LmNsaWVudFggLSB0aGlzLnN0YXJ0WDtcbiAgICBjb25zdCBkZWx0YVkgPSBldmVudC5jbGllbnRZIC0gdGhpcy5zdGFydFk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkcmFnZ2FibGUgZWxlbWVudFxuICAgIHRoaXMuZHJhZ0VsZW1lbnQuc3R5bGUubGVmdCA9IHRoaXMuZHJhZ0VsZW1lbnQub2Zmc2V0TGVmdCArIGRlbHRhWCArICdweCc7XG4gICAgdGhpcy5kcmFnRWxlbWVudC5zdHlsZS50b3AgPSB0aGlzLmRyYWdFbGVtZW50Lm9mZnNldFRvcCArIGRlbHRhWSArICdweCc7XG5cbiAgICAvLyBVcGRhdGUgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBtb3VzZVxuICAgIHRoaXMuc3RhcnRYID0gZXZlbnQuY2xpZW50WDtcbiAgICB0aGlzLnN0YXJ0WSA9IGV2ZW50LmNsaWVudFk7XG4gIH1cblxuICBvdmVycmlkZSBmaXJzdFVwZGF0ZWQoYSk6IHZvaWQge1xuICAgIHN1cGVyLmZpcnN0VXBkYXRlZChhKTtcblxuICAgIC8vIEdldCB0aGUgZHJhZ2dhYmxlIGFuZCBkcm9wIHpvbmUgZWxlbWVudHNcbiAgICB0aGlzLmRyYWdFbGVtZW50ID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdxdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uPmltZycpO1xuICAgIC8vIGNvbnN0IGNhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FudmFzJyk7XG5cbiAgICAvLyBJbml0aWFsaXplIHZhcmlhYmxlcyBmb3IgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBkcmFnZ2FibGUgZWxlbWVudFxuICAgIHRoaXMuc3RhcnRYID0gMDtcbiAgICB0aGlzLnN0YXJ0WSA9IDA7XG5cbiAgICAvLyBBZGQgYSBtb3VzZWRvd24gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGRyYWdnYWJsZSBlbGVtZW50XG4gICAgdGhpcy5kcmFnRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIC8vIFNhdmUgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBtb3VzZVxuICAgICAgdGhpcy5zdGFydFggPSBldmVudC5jbGllbnRYO1xuICAgICAgdGhpcy5zdGFydFkgPSBldmVudC5jbGllbnRZO1xuXG4gICAgICAvLyBBZGQgYSBtb3VzZW1vdmUgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIGRvY3VtZW50XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmRyYWdFbGVtZW50SGFuZGxlciwgdHJ1ZSk7XG4gICAgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMucmVtb3ZlTW92ZUxpc3RlbmVyKTtcbiAgfVxuXG4gIHJlbW92ZU1vdmVMaXN0ZW5lcihldmVudCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuZHJhZ0VsZW1lbnRIYW5kbGVyLCB0cnVlKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5kcmFnRWxlbWVudEhhbmRsZXIpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLnJlbW92ZU1vdmVMaXN0ZW5lcik7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLXBvc2l0aW9uLW9iamVjdC1zdGFnZSc6IFF0aVBvc2l0aW9uT2JqZWN0U3RhZ2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHksIHN0YXRlIH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgcmVwZWF0IH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvcmVwZWF0LmpzJztcbmltcG9ydCB7IHN0eWxlTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvc3R5bGUtbWFwLmpzJztcbmltcG9ydCB7IEludGVyYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJuYWwvaW50ZXJhY3Rpb24vaW50ZXJhY3Rpb24nO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbicpXG5leHBvcnQgY2xhc3MgUXRpU2VsZWN0UG9pbnRJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgQHByb3BlcnR5KHtcbiAgICB0eXBlOiBOdW1iZXIsXG4gICAgYXR0cmlidXRlOiAnbWF4LWNob2ljZXMnXG4gIH0pXG4gIHB1YmxpYyBtYXhDaG9pY2VzOiBudW1iZXIgPSAwO1xuXG4gIEBwcm9wZXJ0eSh7XG4gICAgdHlwZTogTnVtYmVyLFxuICAgIGF0dHJpYnV0ZTogJ21pbi1jaG9pY2VzJ1xuICB9KVxuICBwdWJsaWMgbWluQ2hvaWNlczogbnVtYmVyID0gMDtcblxuICBAc3RhdGUoKVxuICBwcml2YXRlIF9wb2ludHM6IHN0cmluZ1tdID0gW107XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYCA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPHBvaW50LWNvbnRhaW5lcj5cbiAgICAgICAgJHtyZXBlYXQoXG4gICAgICAgICAgdGhpcy5fcG9pbnRzLFxuICAgICAgICAgIHBvaW50ID0+IHBvaW50LFxuICAgICAgICAgIChwb2ludCwgaW5kZXgpID0+IGh0bWxgXG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHBhcnQ9XCJwb2ludFwiXG4gICAgICAgICAgICAgIHN0eWxlPSR7c3R5bGVNYXAoe1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZSgtNTAlLCAtNTAlKScsXG4gICAgICAgICAgICAgICAgbGVmdDogYCR7cG9pbnQuc3BsaXQoJyAnKVswXX1weGAsXG4gICAgICAgICAgICAgICAgdG9wOiBgJHtwb2ludC5zcGxpdCgnICcpWzFdfXB4YFxuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlJlbW92ZSBwb2ludCBhdCAke3BvaW50fVwiXG4gICAgICAgICAgICAgIEBjbGljaz0keyhlOiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcG9pbnRzID0gdGhpcy5fcG9pbnRzLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX3BvaW50cyk7XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgYFxuICAgICAgICApfVxuICAgICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICA8L3BvaW50LWNvbnRhaW5lcj5gO1xuICB9XG5cbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtcbiAgICBjc3NgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgfVxuICAgICAgcG9pbnQtY29udGFpbmVyIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIH1cbiAgICBgXG4gIF07XG5cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5fcG9pbnRzID0gW107XG4gIH1cblxuICB2YWxpZGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcG9pbnRzLmxlbmd0aCA+PSB0aGlzLm1pbkNob2ljZXMgJiYgdGhpcy5fcG9pbnRzLmxlbmd0aCA8PSB0aGlzLm1heENob2ljZXM7XG4gIH1cblxuICBzZXQgcmVzcG9uc2UodmFsOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIHRoaXMuX3BvaW50cyA9IEFycmF5LmlzQXJyYXkodmFsKSA/IHZhbCA6IFt2YWxdO1xuICB9XG5cbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIGNvbnN0IGltZyA9IHRoaXMucXVlcnlTZWxlY3RvcignaW1nJyk7XG5cbiAgICAvLyBBdHRhY2ggYSBjbGljayBldmVudCBsaXN0ZW5lciB0byB0aGUgaW1hZ2UgZWxlbWVudFxuICAgIGltZy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IHggPSBldmVudC5vZmZzZXRYO1xuICAgICAgY29uc3QgeSA9IGV2ZW50Lm9mZnNldFk7XG5cbiAgICAgIHRoaXMuX3BvaW50cyA9IFsuLi50aGlzLl9wb2ludHMsIHggKyAnICcgKyB5XTtcbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMuX3BvaW50cyk7XG4gICAgfSk7XG4gIH1cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uJzogUXRpU2VsZWN0UG9pbnRJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGNzcywgaHRtbCwgbm90aGluZyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSwgcXVlcnkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5cbmltcG9ydCB7IHdhdGNoIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9ycy93YXRjaCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvbiB9IGZyb20gJy4uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcblxuLyoqXG4gKiBAc3VtbWFyeSBUaGUgU2xpZGVySW50ZXJhY3Rpb24uVHlwZSAocXRpLXNsaWRlci1pbnRlcmFjdGlvbikgcHJlc2VudHMgdGhlIGNhbmRpZGF0ZSB3aXRoIGEgY29udHJvbCBmb3Igc2VsZWN0aW5nIGEgbnVtZXJpY2FsIHZhbHVlIGJldHdlZW4gYSBsb3dlciBhbmQgdXBwZXIgYm91bmQuXG4gKiBAZG9jdW1lbnRhdGlvbiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLnM2MXhjcmo0cWN5alxuICogQHN0YXR1cyBzdGFibGVcbiAqIEBzaW5jZSA2LjBcbiAqXG4gKiBAZXZlbnQgcXRpLXJlZ2lzdGVyLWludGVyYWN0aW9uIC0gZW1pdHRlZCB3aGVuIHRoZSBpbnRlcmFjdGlvbiB3YW50cyB0byByZWdpc3RlciBpdHNlbGZcbiAqIEBldmVudCBxdGktaW50ZXJhY3Rpb24tcmVzcG9uc2UgLSBlbWl0dGVkIHdoZW4gdGhlIGludGVyYWN0aW9uIGNoYW5nZXNcbiAqXG4gKiBAY3NzcHJvcCAtLXNob3ctdmFsdWUgLSBzaG93cyB0aGUgY3VycmVudCB2YWx1ZSB3aGlsZSBzbGlkaW5nXG4gKiBAY3NzcHJvcCAtLXNob3ctdGlja3MgLSBzaG93cyB0aGUgdGlja3MgYWNjb3JkaW5nIHRvIHN0ZXBzXG4gKiBAY3NzcHJvcCAtLXNob3ctYm91bmRzIC0gc2hvd3MgdmFsdWUgZm9yIGxvd2VyIGFuZCB1cHBlciBib3VuZGFyeVxuICpcbiAqIEBjc3NwYXJ0IHNsaWRlciAtLSBzbGlkZXIgaW5sdWRpbmcsIGJvdW5kcyBhbmQgdGlja3MgYW5kIHZhbHVlLCB1c2UgaXQgZm9yIHBhZGRpbmdzIGFuZCBtYXJnaW5zXG4gKiBAY3NzcGFydCBib3VuZHMgLS0gZGl2IGZvciBib3VuZHMsIGNvbnRhaW5pbmcgdHdvIGRpdnMgZm9yIHdpdGggbWluLCBhbmQgbWF4IGJvdW5kcyB2YWx1ZVxuICogQGNzc3BhcnQgdGlja3MgLS0gZGl2IGZvciB0aWNrcywgdXNlIGxpbmVhaXIgZ3JhZGllbnQgYW5kIGV4cG9zZWQgY3NzIHZhcmlhYmxlcyBmb3Igc3R5bGluZ1xuICogQGNzc3BhcnQgcmFpbCAtLSBkaXYgZm9yIHJhaWwsIHN0eWxlIGFjY29yZGluZyB0byBuZWVkc1xuICogQGNzc3BhcnQga25vYiAtLSBkaXYsIHNob3VsZCBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZVxuICogQGNzc3BhcnQgdmFsdWUgLS0gZGl2LCBjb250YWluaW5nIHZhbHVlXG4gKlxuICogQHNsb3QgLSBUaGUgZGVmYXVsdCBzbG90IHdoZXJlIDxxdGktc2ltcGxlLWNob2ljZT4gbXVzdCBiZSBwbGFjZWQuXG4gKiBAc2xvdCBwcm9tcHQgLSBzbG90IHdoZXJlIHRoZSBwcm9tcHQgaXMgcGxhY2VkLlxuICovXG5cbkBjdXN0b21FbGVtZW50KCdxdGktc2xpZGVyLWludGVyYWN0aW9uJylcbmV4cG9ydCBjbGFzcyBRdGlTbGlkZXJJbnRlcmFjdGlvbiBleHRlbmRzIEludGVyYWN0aW9uIHtcbiAgY3NMaXZlOiBDU1NTdHlsZURlY2xhcmF0aW9uO1xuXG4gIEBxdWVyeSgnI2tub2InKVxuICBwcml2YXRlIF9rbm9iOiBIVE1MRWxlbWVudDtcblxuICBAcXVlcnkoJyNyYWlsJylcbiAgcHJpdmF0ZSBfcmFpbDogSFRNTEVsZW1lbnQ7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyIH0pIHZhbHVlOiBudW1iZXI7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiwgYXR0cmlidXRlOiAnc3RlcC1sYWJlbCcgfSkgc3RlcExhYmVsID0gZmFsc2U7XG5cbiAgQHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSByZXZlcnNlID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfbWluOiBudW1iZXI7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgYXR0cmlidXRlOiAnbG93ZXItYm91bmQnIH0pIHNldCBtaW4odmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21pbiA9IHZhbHVlO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLW1pbicsIGAke3RoaXMuX21pbn1gKTtcbiAgfVxuICBnZXQgbWluKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgfVxuXG4gIHByaXZhdGUgX21heDogbnVtYmVyO1xuICBAcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogJ3VwcGVyLWJvdW5kJyB9KSBzZXQgbWF4KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXggPSB2YWx1ZTtcbiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KCctLW1heCcsIGAke3RoaXMuX21heH1gKTtcbiAgfVxuICBnZXQgbWF4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21heDtcbiAgfVxuXG4gIHByaXZhdGUgX3N0ZXA6IG51bWJlcjtcbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6ICdzdGVwJyB9KSBzZXQgc3RlcCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fc3RlcCA9IHZhbHVlO1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoJy0tc3RlcCcsIGAke3RoaXMuX3N0ZXB9YCk7XG4gIH1cbiAgZ2V0IHN0ZXAoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc3RlcDtcbiAgfVxuXG4gIEB3YXRjaCgnZGlzYWJsZWQnLCB7IHdhaXRVbnRpbEZpcnN0VXBkYXRlOiB0cnVlIH0pXG4gIF9oYW5kbGVEaXNhYmxlZENoYW5nZSA9IChvbGQsIGRpc2FibGVkKSA9PiB7fTtcblxuICBAd2F0Y2goJ3JlYWRvbmx5JywgeyB3YWl0VW50aWxGaXJzdFVwZGF0ZTogdHJ1ZSB9KVxuICBfaGFuZGxlUmVhZG9ubHlDaGFuZ2UgPSAob2xkLCByZWFkb25seSkgPT4ge307XG5cbiAgcmVzZXQoKSB7XG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG4gIHZhbGlkYXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gc3RhdGljIHNoYWRvd1Jvb3RPcHRpb25zOiBTaGFkb3dSb290SW5pdCA9IHsgLi4uTGl0RWxlbWVudC5zaGFkb3dSb290T3B0aW9ucywgZGVsZWdhdGVzRm9jdXM6IHRydWUsIG1vZGU6ICdvcGVuJyB9O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgLyogdGhlIGNvbXB1dGVkIHN0eWxlIGlzIGEgbGl2ZSBwcm9wZXJ0eSwgd2UgdXNlIHRoaXMgdG8gZ2V0IGNzcyB2YXJpYWJsZXNcbiAgICBzZWUgcmVuZGVyIHRlbXBsYXRlICovXG4gICAgdGhpcy5jc0xpdmUgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMpO1xuICB9XG5cbiAgc2V0IHJlc3BvbnNlKG15UmVzcG9uc2U6IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobXlSZXNwb25zZSkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1F0aVNsaWRlckludGVyYWN0aW9uOiByZXNwb25zZSBpcyBhbiBhcnJheSwgYnV0IHNob3VsZCBiZSBhIHNpbmdsZSB2YWx1ZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHBhcnNlSW50KG15UmVzcG9uc2UpO1xuICAgIGlmIChOdW1iZXIuaXNOYU4odmFsdWUpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdRdGlTbGlkZXJJbnRlcmFjdGlvbjogcmVzcG9uc2UgaXMgbm90IGEgbnVtYmVyJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbY3NzYGBdO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpIHtcbiAgICAvLyBjb252ZXJ0IHRoZSB2YWx1ZSwgd2hpY2ggaXMgdGhlIHJlYWwgc2xpZGVyIHZhbHVlIHRvIGEgcGVyY2VudGFnZSBmb3IgdGhlIGRvbS5cbiAgICB0aGlzLnZhbHVlIDwgdGhpcy5taW4gJiYgKHRoaXMudmFsdWUgPSB0aGlzLm1pbik7XG4gICAgdGhpcy52YWx1ZSA+IHRoaXMubWF4ICYmICh0aGlzLnZhbHVlID0gdGhpcy5tYXgpO1xuICAgIGNvbnN0IHZhbHVlUGVyY2VudGFnZSA9ICgodGhpcy52YWx1ZSAtIHRoaXMubWluKSAvICh0aGlzLm1heCAtIHRoaXMubWluKSkgKiAxMDA7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSgnLS12YWx1ZS1wZXJjZW50YWdlJywgYCR7dmFsdWVQZXJjZW50YWdlfSVgKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsIHRoaXMudmFsdWUudG9TdHJpbmcoKSk7XG5cbiAgICByZXR1cm4gaHRtbGA8c2xvdCBuYW1lPVwicHJvbXB0XCI+PC9zbG90PlxuICAgICAgPGRpdiBpZD1cInNsaWRlclwiIHBhcnQ9XCJzbGlkZXJcIj5cbiAgICAgICAgJHt0aGlzLmNzTGl2ZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXNob3ctYm91bmRzJykgPT0gJ3RydWUnXG4gICAgICAgICAgPyBodG1sYDxkaXYgaWQ9XCJib3VuZHNcIiBwYXJ0PVwiYm91bmRzXCI+XG4gICAgICAgICAgICAgIDxkaXY+JHt0aGlzLl9taW59PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXY+JHt0aGlzLl9tYXh9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5gXG4gICAgICAgICAgOiBub3RoaW5nfVxuICAgICAgICAke3RoaXMuY3NMaXZlLmdldFByb3BlcnR5VmFsdWUoJy0tc2hvdy10aWNrcycpID09ICd0cnVlJyA/IGh0bWxgPGRpdiBpZD1cInRpY2tzXCIgcGFydD1cInRpY2tzXCI+PC9kaXY+YCA6IG5vdGhpbmd9XG4gICAgICAgIDxkaXYgaWQ9XCJyYWlsXCIgcGFydD1cInJhaWxcIiBAbW91c2Vkb3duPSR7dGhpcy5fb25Nb3VzZURvd259IEB0b3VjaHN0YXJ0PSR7dGhpcy5fb25Ub3VjaE1vdmV9PlxuICAgICAgICAgIDxkaXYgaWQ9XCJrbm9iXCIgcGFydD1cImtub2JcIj5cbiAgICAgICAgICAgICR7dGhpcy5jc0xpdmUuZ2V0UHJvcGVydHlWYWx1ZSgnLS1zaG93LXZhbHVlJykgPT0gJ3RydWUnXG4gICAgICAgICAgICAgID8gaHRtbGA8ZGl2IGlkPVwidmFsdWVcIiBwYXJ0PVwidmFsdWVcIj4ke3RoaXMudmFsdWV9PC9kaXY+YFxuICAgICAgICAgICAgICA6IG5vdGhpbmd9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+YDtcbiAgfVxuXG4gIG92ZXJyaWRlIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgdGhpcy5zdGVwID0gMTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3NsaWRlcicpO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25Ub3VjaE1vdmUoZXZlbnQpIHtcbiAgICBjb25zdCBoYW5kbGVUb3VjaE1vdmUgPSBldmVudCA9PiB7XG4gICAgICBjb25zdCB7IHggfSA9IHRoaXMuZ2V0UG9zaXRpb25Gcm9tRXZlbnQoZXZlbnQpO1xuICAgICAgY29uc3QgZGlmZlggPSB4IC0gdGhpcy5fcmFpbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgICB0aGlzLmNhbGN1bGF0ZVZhbHVlKGRpZmZYKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVUb3VjaEVuZCA9ICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGhhbmRsZVRvdWNoTW92ZSk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIGhhbmRsZVRvdWNoRW5kKTtcblxuICAgICAgdGhpcy5zYXZlUmVzcG9uc2UodGhpcy52YWx1ZS50b1N0cmluZygpKTtcbiAgICB9O1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgaGFuZGxlVG91Y2hNb3ZlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIGhhbmRsZVRvdWNoRW5kKTtcblxuICAgIGNvbnN0IHsgeCB9ID0gdGhpcy5nZXRQb3NpdGlvbkZyb21FdmVudChldmVudCk7XG4gICAgY29uc3QgZGlmZlggPSB4IC0gdGhpcy5fcmFpbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgdGhpcy5jYWxjdWxhdGVWYWx1ZShkaWZmWCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIF9vbk1vdXNlRG93bihldmVudCkge1xuICAgIGNvbnN0IGhhbmRsZU1vdXNlTW92ZSA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgLy8gaWYgdGhlIHF0aS1zbGlkZXItaW50ZXJhY3Rpb24gaGFzIGFuIGFic29sdXRlIGxlZnQgcG9zaXRpb24gYW5kIGJvZHkgaXMgc2Nyb2xsZWQgYSBiaXQsIHRha2UgYWNjb3VudCBmb3IgdGhhdFxuICAgICAgY29uc3QgZGlmZlggPSBldmVudC5wYWdlWCAtIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuXG4gICAgICB0aGlzLmNhbGN1bGF0ZVZhbHVlKGRpZmZYKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlTW91c2VVcCA9ICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgaGFuZGxlTW91c2VVcCk7XG5cbiAgICAgIHRoaXMuc2F2ZVJlc3BvbnNlKHRoaXMudmFsdWUudG9TdHJpbmcoKSk7XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGhhbmRsZU1vdXNlVXApO1xuXG4gICAgLy8gaWYgdGhlIHF0aS1zbGlkZXItaW50ZXJhY3Rpb24gaGFzIGFuIGFic29sdXRlIGxlZnQgcG9zaXRpb24gYW5kIGJvZHkgaXMgc2Nyb2xsZWQgYSBiaXQsIHRha2UgYWNjb3VudCBmb3IgdGhhdFxuICAgIGNvbnN0IGRpZmZYID0gZXZlbnQucGFnZVggLSB0aGlzLl9yYWlsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDtcblxuICAgIHRoaXMuY2FsY3VsYXRlVmFsdWUoZGlmZlgpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICAvKiogY2FsY3VsYXRlVmFsdWUgZ2V0cyB4IHBvc2l0aW9uIGFuZCBjb21wYXJlcyB0aGlzIHdpdGggdGhlIHRvdGFsIHdpZHRoIGluIHBpeGVscyAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZVZhbHVlKGRpZmZYOiBudW1iZXIpIHtcbiAgICBjb25zdCB2YWx1ZU5vdyA9IHRoaXMubWluICsgKCh0aGlzLm1heCAtIHRoaXMubWluKSAqIGRpZmZYKSAvIHRoaXMuX3JhaWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgY29uc3Qgcm91bmRlZFN0ZXBWYWx1ZSA9IHRoaXMubWluICsgTWF0aC5yb3VuZCgodmFsdWVOb3cgLSB0aGlzLm1pbikgLyB0aGlzLl9zdGVwKSAqIHRoaXMuX3N0ZXA7XG4gICAgdGhpcy52YWx1ZSA9IHJvdW5kZWRTdGVwVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGdldFBvc2l0aW9uRnJvbUV2ZW50KGU6IGFueSk6IHtcbiAgICB4OiBudW1iZXI7XG4gICAgeTogbnVtYmVyO1xuICB9IHtcbiAgICBsZXQgX3RvdWNoTW92ZTtcbiAgICBpZiAoZS50eXBlID09ICd0b3VjaHN0YXJ0JyB8fCBlLnR5cGUgPT0gJ3RvdWNobW92ZScgfHwgZS50eXBlID09ICd0b3VjaGVuZCcgfHwgZS50eXBlID09ICd0b3VjaGNhbmNlbCcpIHtcbiAgICAgIGNvbnN0IGV2dCA9IHR5cGVvZiBlLm9yaWdpbmFsRXZlbnQgPT09ICd1bmRlZmluZWQnID8gZSA6IGUub3JpZ2luYWxFdmVudDtcbiAgICAgIGNvbnN0IHRvdWNoID0gZXZ0LnRvdWNoZXNbMF0gfHwgZXZ0LmNoYW5nZWRUb3VjaGVzWzBdO1xuICAgICAgX3RvdWNoTW92ZSA9IHtcbiAgICAgICAgeDogdG91Y2gucGFnZVgsXG4gICAgICAgIHk6IHRvdWNoLnBhZ2VZXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBlLnR5cGUgPT0gJ21vdXNlZG93bicgfHxcbiAgICAgIGUudHlwZSA9PSAnbW91c2V1cCcgfHxcbiAgICAgIGUudHlwZSA9PSAnbW91c2Vtb3ZlJyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZW92ZXInIHx8XG4gICAgICBlLnR5cGUgPT0gJ21vdXNlb3V0JyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZWVudGVyJyB8fFxuICAgICAgZS50eXBlID09ICdtb3VzZWxlYXZlJ1xuICAgICkge1xuICAgICAgX3RvdWNoTW92ZSA9IHtcbiAgICAgICAgeDogZS5jbGllbnRYLFxuICAgICAgICB5OiBlLmNsaWVudFlcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBfdG91Y2hNb3ZlO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1zbGlkZXItaW50ZXJhY3Rpb24nOiBRdGlTbGlkZXJJbnRlcmFjdGlvbjtcbiAgfVxufVxuIiwgImltcG9ydCB7XG4gIGl0ZW1Db250ZXh0LFxuICB0eXBlIENhbGN1bGF0ZSxcbiAgdHlwZSBJdGVtQ29udGV4dCxcbiAgdHlwZSBSZXNwb25zZVZhcmlhYmxlXG59IGZyb20gJ0BjaXRvbGFiL3F0aS1jb21wb25lbnRzL3F0aS1jb21wb25lbnRzJztcbmltcG9ydCB7IGNvbnN1bWUgfSBmcm9tICdAbGl0L2NvbnRleHQnO1xuaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBzdGF0ZSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuLyoqXG4gKiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLmZpMjlxOGR1Ympnd1xuICogPHF0aS1jdXN0b20tb3BlcmF0b3IgY2xhc3M9XCJqcy5vcmdcIj5cbiAgICAgICAgPHF0aS1iYXNlLXZhbHVlIGJhc2UtdHlwZT1cInN0cmluZ1wiPjwhW0NEQVRBW1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNvbnRleHQudmFyaWFibGVzKTtcbiAgICAgICAgICByZXR1cm4gJ0InXG4gICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigncXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uJykuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIF1dPjwvcXRpLWJhc2UtdmFsdWU+XG4gICAgICA8L3F0aS1jdXN0b20tb3BlcmF0b3I+XG4gICAgPC9xdGktc2V0LW91dGNvbWUtdmFsdWU+XG4gKi9cbkBjdXN0b21FbGVtZW50KCdxdGktY3VzdG9tLW9wZXJhdG9yJylcbmV4cG9ydCBjbGFzcyBRdGlDdXN0b21PcGVyYXRvciBleHRlbmRzIExpdEVsZW1lbnQgaW1wbGVtZW50cyBDYWxjdWxhdGUge1xuICBwcml2YXRlIG9wZXJhdG9yRnVuY3Rpb246IEZ1bmN0aW9uO1xuXG4gIEBjb25zdW1lKHsgY29udGV4dDogaXRlbUNvbnRleHQsIHN1YnNjcmliZTogdHJ1ZSB9KVxuICBAc3RhdGUoKVxuICBwcml2YXRlIF9jb250ZXh0PzogSXRlbUNvbnRleHQ7XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90IEBzbG90Y2hhbmdlPSR7dGhpcy5oYW5kbGVTbG90Q2hhbmdlfT48L3Nsb3Q+YDtcbiAgfVxuXG4gIGhhbmRsZVNsb3RDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgLy8gZXhwZWN0aW5nIDxbIUNEQVRBWyAuLi4gXV0+IGlzIGNvbnZlcnRlZCBpbnRvIDwhLS0gLi4uIC0tPiB3aXRoIHF0aS10cmFuc2Zvcm06IGNEYXRhVG9Db21tZW50XG4gICAgY29uc3QgY29tbWVudE5vZGUgPSBBcnJheS5mcm9tKHRoaXMuZmlyc3RFbGVtZW50Q2hpbGQ/LmNoaWxkTm9kZXMgPz8gW10pLmZpbmQoXG4gICAgICBub2RlID0+IG5vZGUubm9kZVR5cGUgPT09IE5vZGUuQ09NTUVOVF9OT0RFXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5vcGVyYXRvckZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKCdjb250ZXh0JywgJ2ZuJywgJ2l0ZW0nLCBjb21tZW50Tm9kZS50ZXh0Q29udGVudCA/PyAnJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcignY3VzdG9tLW9wZXJhdG9yIGNvbnRhaW5zIGludmFsaWQgamF2YXNjcmlwdCBjb2RlJywgZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZSgpIHtcbiAgICBjb25zdCBmbiA9IHtcbiAgICAgIHZhcmlhYmxlOiAocmVzcG9uc2VJZGVudGlmaWVyOiBzdHJpbmcpID0+XG4gICAgICAgIHRoaXMuX2NvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSByZXNwb25zZUlkZW50aWZpZXIpPy52YWx1ZSA/PyAnJyxcbiAgICAgIGNvcnJlY3Q6IChyZXNwb25zZUlkZW50aWZpZXI6IHN0cmluZykgPT5cbiAgICAgICAgKHRoaXMuX2NvbnRleHQ/LnZhcmlhYmxlcy5maW5kKHYgPT4gdi5pZGVudGlmaWVyID09PSByZXNwb25zZUlkZW50aWZpZXIpIGFzIFJlc3BvbnNlVmFyaWFibGUpXG4gICAgICAgICAgPy5jb3JyZWN0UmVzcG9uc2UgPz8gJydcbiAgICB9O1xuICAgIGNvbnN0IGl0ZW0gPSB7XG4gICAgICBnZXRWYXJpYWJsZTogKHZhcmlhYmxlSWRlbnRpZmllcjogc3RyaW5nKSA9PlxuICAgICAgICB0aGlzLl9jb250ZXh0Py52YXJpYWJsZXMuZmluZCh2ID0+IHYuaWRlbnRpZmllciA9PT0gdmFyaWFibGVJZGVudGlmaWVyKSxcbiAgICAgIHVwZGF0ZU91dGNvbWVWYXJpYWJsZTogKG91dGNvbWVJZGVudGlmaWVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSkgPT4ge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50PHsgb3V0Y29tZUlkZW50aWZpZXI6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIH0+KCdxdGktc2V0LW91dGNvbWUtdmFsdWUnLCB7XG4gICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgb3V0Y29tZUlkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiB0aGlzLm9wZXJhdG9yRnVuY3Rpb24odGhpcy5fY29udGV4dCwgZm4sIGl0ZW0pO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1jdXN0b20tb3BlcmF0b3InOiBRdGlDdXN0b21PcGVyYXRvcjtcbiAgfVxufVxuIiwgImltcG9ydCB7IExpdEVsZW1lbnQsIGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWFzc29jaWFibGUtaG90c3BvdCcpXG5leHBvcnQgY2xhc3MgUXRpQXNzb2NpYWJsZUhvdHNwb3QgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgb3ZlcnJpZGUgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTtcblxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgncXRpLXJlZ2lzdGVyLWhvdHNwb3QnLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICBjb21wb3NlZDogdHJ1ZVxuICAgICAgfSlcbiAgICApO1xuICB9XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJxdGktZ2FwLWltZ1wiPjwvc2xvdD4gYDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktYXNzb2NpYWJsZS1ob3RzcG90JzogUXRpQXNzb2NpYWJsZUhvdHNwb3Q7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdhcCcpXG5leHBvcnQgY2xhc3MgUXRpR2FwIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSB9KSB0YWJpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkID0gMDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxzbG90IG5hbWU9XCJxdGktZ2FwLXRleHRcIj48L3Nsb3Q+YDtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuICAgICdxdGktZ2FwJzogUXRpR2FwO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50LCBwcm9wZXJ0eSB9IGZyb20gJ2xpdC9kZWNvcmF0b3JzLmpzJztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1nYXAtaW1nJylcbmV4cG9ydCBjbGFzcyBRdGlHYXBJbWcgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgQHByb3BlcnR5KHsgdHlwZTogTnVtYmVyLCByZWZsZWN0OiB0cnVlIH0pIHRhYmluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQgPSAwO1xuXG4gIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1nYXAtaW1nJyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWdhcC1pbWcnOiBRdGlHYXBJbWc7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGN1c3RvbUVsZW1lbnQsIHByb3BlcnR5IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWdhcC10ZXh0JylcbmV4cG9ydCBjbGFzcyBRdGlHYXBUZXh0IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIEBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciwgcmVmbGVjdDogdHJ1ZSB9KSB0YWJpbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkID0gMDtcblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdzbG90JywgJ3F0aS1nYXAtdGV4dCcpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxzbG90Pjwvc2xvdD5gO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1nYXAtdGV4dCc6IFF0aUdhcFRleHQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjc3MgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgY3VzdG9tRWxlbWVudCwgcHJvcGVydHkgfSBmcm9tICdsaXQvZGVjb3JhdG9ycy5qcyc7XG5pbXBvcnQgeyBRdGlDaG9pY2UgfSBmcm9tICcuL2ludGVybmFsL2Nob2ljZS9xdGktY2hvaWNlJztcblxuLy8gdHlwZSBzaGFwZSA9IHsgc2hhcGU6ICdyZWN0JyB8ICdjaXJjbGUnIHwgJ3BvbHknOyBjb29yZHM6IG51bWJlcltdIH07XG5cbkBjdXN0b21FbGVtZW50KCdxdGktaG90c3BvdC1jaG9pY2UnKVxuZXhwb3J0IGNsYXNzIFF0aUhvdHNwb3RDaG9pY2UgZXh0ZW5kcyBRdGlDaG9pY2Uge1xuICBAcHJvcGVydHkoeyBhdHRyaWJ1dGU6ICdhcmlhLW9yZGVydmFsdWUnLCB0eXBlOiBOdW1iZXIsIHJlZmxlY3Q6IHRydWUgfSkgb3JkZXI6IG51bWJlcjtcblxuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gY3NzYFxuICAgIDpob3N0IHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB9XG4gIGA7XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1ob3RzcG90LWNob2ljZSc6IFF0aUhvdHNwb3RDaG9pY2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgUXRpQ2hvaWNlIH0gZnJvbSAnLi9pbnRlcm5hbC9jaG9pY2UvcXRpLWNob2ljZSc7XG5pbXBvcnQgeyBodG1sIH0gZnJvbSAnbGl0JztcblxuQGN1c3RvbUVsZW1lbnQoJ3F0aS1ob3R0ZXh0JylcbmV4cG9ydCBjbGFzcyBRdGlIb3R0ZXh0IGV4dGVuZHMgUXRpQ2hvaWNlIHtcbiAgb3ZlcnJpZGUgcmVuZGVyKCkge1xuICAgIHJldHVybiBodG1sYDxkaXYgcGFydD1cImNoXCI+PGRpdiBwYXJ0PVwiY2hhXCI+PC9kaXY+PC9kaXY+XG4gICAgICA8c2xvdD48L3Nsb3Q+IGA7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWhvdHRleHQnOiBRdGlIb3R0ZXh0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuXG5AY3VzdG9tRWxlbWVudCgncXRpLWlubGluZS1jaG9pY2UnKVxuZXhwb3J0IGNsYXNzIFF0aUlubGluZUNob2ljZSBleHRlbmRzIExpdEVsZW1lbnQge31cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgSFRNTEVsZW1lbnRUYWdOYW1lTWFwIHtcbiAgICAncXRpLWlubGluZS1jaG9pY2UnOiBRdGlJbmxpbmVDaG9pY2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBjdXN0b21FbGVtZW50IH0gZnJvbSAnbGl0L2RlY29yYXRvcnMuanMnO1xuaW1wb3J0IHsgQ1NTUmVzdWx0R3JvdXAsIGNzcywgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBRdGlDaG9pY2UgfSBmcm9tICcuL2ludGVybmFsL2Nob2ljZS9xdGktY2hvaWNlJztcblxuLyoqXG4gKiBAc3VtbWFyeSBTaG9ydCBzdW1tYXJ5IG9mIHRoZSBjb21wb25lbnQncyBpbnRlbmRlZCB1c2UuXG4gKiBAZG9jdW1lbnRhdGlvbiBodHRwczovL3d3dy5pbXNnbG9iYWwub3JnL3NwZWMvcXRpL3YzcDAvaW1wbCNoLmo5bnUxb2ExdHUzYlxuICogQHN0YXR1cyBzdGFibGVcbiAqIEBzaW5jZSA0LjBcbiAqXG4gKiBAZXZlbnQgcXRpLWNob2ljZS1lbGVtZW50LXNlbGVjdGVkIC0gRW1pdHRlZCB3aGVuIGEgY2hvaWNlIGlzIHNlbGVjdGVkLlxuICogQGV2ZW50IHF0aS1yZWdpc3Rlci1jaG9pY2UgLSBFbWl0dGVkIHdoZW4gYW4gY2hvaWNlIGlzIGFkZGVkXG4gKiBAZXZlbnQgcXRpLWxvb3NlLWNob2ljZSAtIEVtaXR0ZWQgd2hlbiBhIGNob2ljZSBpcyByZW1vdmVkXG4gKlxuICogQHNsb3QgLSBUaGUgZGVmYXVsdCBzbG90LlxuICovXG5AY3VzdG9tRWxlbWVudCgncXRpLXNpbXBsZS1jaG9pY2UnKVxuZXhwb3J0IGNsYXNzIFF0aVNpbXBsZUNob2ljZSBleHRlbmRzIFF0aUNob2ljZSB7XG4gIHN0YXRpYyBzdHlsZXMgPSBjc3NgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICB9XG4gICAgc2xvdCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgYDtcblxuICBvdmVycmlkZSByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPGRpdiBwYXJ0PVwiY2hcIj48ZGl2IHBhcnQ9XCJjaGFcIj48L2Rpdj48L2Rpdj5cbiAgICAgIDxzbG90IHBhcnQ9XCJzbG90XCI+PC9zbG90PiBgO1xuICB9XG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG4gICAgJ3F0aS1zaW1wbGUtY2hvaWNlJzogUXRpU2ltcGxlQ2hvaWNlO1xuICB9XG59XG4iLCAiLyogb25seSBleHBvcnRlZCB0byBvdmVycmlkZSBvciBleHRlbmQgZm9yIHNwZWNpZmljIHB1cnBvc2VzICovXG5leHBvcnQgKiBmcm9tICcuL2ludGVybmFsL2V2ZW50LXR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJuYWwvZXZlbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJuYWwvZXhwcmVzc2lvbi1yZXN1bHQnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcm5hbC92YXJpYWJsZXMnO1xuLyogb25seSBleHBvcnRlZCB0byBvdmVycmlkZSBvciBleHRlbmQgZm9yIHNwZWNpZmljIHB1cnBvc2VzICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LXN0aW11bHVzLXJlZi9xdGktYXNzZXNzbWVudC1zdGltdWx1cy1yZWYnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vaW50ZXJuYWwvY2hvaWNlL3F0aS1jaG9pY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaXRlbS1ib2R5L3F0aS1pdGVtLWJvZHknO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktcHJvbXB0L3F0aS1wcm9tcHQnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktc3R5bGVzaGVldC9xdGktc3R5bGVzaGVldCc7XG4vKiBzdGFydCByZXNwb25zZSBhbmQgb3V0Y29tZSAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24vcXRpLW91dGNvbWUtZGVjbGFyYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktdmFyaWFibGUtZGVjbGFyYXRpb24vcXRpLXJlc3BvbnNlLWRlY2xhcmF0aW9uL3F0aS1yZXNwb25zZS1kZWNsYXJhdGlvbic7XG4vKiBlbmQgcmVzcG9uc2UgYW5kIG91dGNvbWUgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWNvbXBhbmlvbi1tYXRlcmlhbHMtaW5mby9xdGktY29tcGFuaW9uLW1hdGVyaWFscy1pbmZvJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJ1YnJpYy1ibG9jay9xdGktY29udGVudC1ib2R5JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJ1YnJpYy1ibG9jay9xdGktcnVicmljLWJsb2NrJztcbi8qIHN0YXJ0IGZlZWRiYWNrICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1mZWVkYmFjay9xdGktZmVlZGJhY2stYmxvY2svcXRpLWZlZWRiYWNrLWJsb2NrJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWZlZWRiYWNrL3F0aS1mZWVkYmFjay1pbmxpbmUvcXRpLWZlZWRiYWNrLWlubGluZSc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1mZWVkYmFjay9xdGktbW9kYWwtZmVlZGJhY2svcXRpLW1vZGFsLWZlZWRiYWNrJztcbi8qIGVuZCBmZWVkYmFjayAqL1xuLyogc3RhcnQgdGV4dGVudHJ5aW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uL3F0aS1leHRlbmRlZC10ZXh0LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uL3F0aS10ZXh0LWVudHJ5LWludGVyYWN0aW9uJztcbi8qIGVuZCB0ZXh0ZW50cnlpbnRlcmFjdGlvbiAqL1xuLyogc3RhcnQgaG90dGV4dCAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24vcXRpLWhvdHRleHQtaW50ZXJhY3Rpb24nO1xuLyogZW5kIGhvdHRleHQgKi9cbi8qIHN0YXJ0IGlubGluZWNob2ljZSAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWlubGluZS1jaG9pY2UtaW50ZXJhY3Rpb24nO1xuLyogZW5kIGlubGluZWNob2ljZSAqL1xuLyogc3RhcnQgY2hvaWNlaW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1jaG9pY2UtaW50ZXJhY3Rpb24vcXRpLWNob2ljZS1pbnRlcmFjdGlvbic7XG4vKiBlbmQgY2hvaWNlaW50ZXJhY3Rpb24gKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLW91dGNvbWUtcHJvY2Vzc2luZy9xdGktb3V0Y29tZS1wcm9jZXNzaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXJlc3BvbnNlLXByb2Nlc3NpbmcnO1xuLyogc3RhcnQgY3VzdG9tIGludGVyYWN0aW9ucyAqL1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXBvcnRhYmxlLWN1c3RvbS1pbnRlcmFjdGlvbi9xdGktcG9ydGFibGUtY3VzdG9tLWludGVyYWN0aW9uJztcbi8qIGVuZCBjdXN0b20gaW50ZXJhY3Rpb25zICovXG4vKiBzdGFydCBvbmx5IHByZXZpZXcgaXRlbXMgKi9cbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhdGUtaW50ZXJhY3Rpb24vcXRpLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktY3VzdG9tLWludGVyYWN0aW9uL3F0aS1jdXN0b20taW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWVuZC1hdHRlbXB0LWludGVyYWN0aW9uL3F0aS1lbmQtYXR0ZW1wdC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLW1hdGNoLWludGVyYWN0aW9uL3F0aS1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtYXNzb2NpYXRlLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLWFzc29jaWF0ZS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ3JhcGhpYy1nYXAtbWF0Y2gtaW50ZXJhY3Rpb24vcXRpLWdyYXBoaWMtZ2FwLW1hdGNoLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uL3F0aS1ncmFwaGljLW9yZGVyLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uL3F0aS1ob3RzcG90LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1tYXRjaC1pbnRlcmFjdGlvbi9xdGktbWF0Y2gtaW50ZXJhY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLW1lZGlhLWludGVyYWN0aW9uL3F0aS1tZWRpYS1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktb3JkZXItaW50ZXJhY3Rpb24vcXRpLW9yZGVyLWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3QtaW50ZXJhY3Rpb24vcXRpLXBvc2l0aW9uLW9iamVjdC1pbnRlcmFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktcG9zaXRpb24tb2JqZWN0LWludGVyYWN0aW9uL3F0aS1wb3NpdGlvbi1vYmplY3Qtc3RhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXNlbGVjdC1wb2ludC1pbnRlcmFjdGlvbi9xdGktc2VsZWN0LXBvaW50LWludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zbGlkZXItaW50ZXJhY3Rpb24vcXRpLXNsaWRlci1pbnRlcmFjdGlvbic7XG4vKiBlbmQgb25seSBwcmV2aWV3IGl0ZW1zICovXG5leHBvcnQgKiBmcm9tICcuL3F0aS1hc3Nlc3NtZW50LWl0ZW0vcXRpLWFzc2Vzc21lbnQtaXRlbS5jb250ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWN1c3RvbS1vcGVyYXRvci9xdGktY3VzdG9tLW9wZXJhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL2ludGVybmFsL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1hc3NvY2lhYmxlLWhvdHNwb3QnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWdhcCc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLWltZyc7XG5leHBvcnQgKiBmcm9tICcuL3F0aS1pbnRlcmFjdGlvbi9xdGktZ2FwLXRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLWhvdHNwb3QtY2hvaWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1ob3R0ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1pbmxpbmUtY2hvaWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLWludGVyYWN0aW9uL3F0aS1zaW1wbGUtYXNzb2NpYWJsZS1jaG9pY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktaW50ZXJhY3Rpb24vcXRpLXNpbXBsZS1jaG9pY2UnO1xuXG5jb25zb2xlLmxvZyhcbiAgJyVjQ1x1MDBCRlRPJWNMYWIlYzogcXRpLWNvbXBvbmVudHMgbG9hZGVkJyxcbiAgJ2ZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOmdyZWVuJyxcbiAgJ2ZvbnQtZmFtaWx5OiBcIlBUIFNhbnNcIiwgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6Z3JlZW47IGZvbnQtc2l6ZTogc21hbGxlcjt2ZXJ0aWNhbC1hbGlnbjogc3ViJyxcbiAgJ2ZvbnQtd2VpZ2h0OnVuc2V0J1xuKTtcblxuLy8gY3NzIGZvciBmb250IHB0LXNhbnMgYW5kIHN1YnNjcmlwdCBhbmQgZ3JlZW5cbiJdLAogICJtYXBwaW5ncyI6ICIrREFBQSxPQUFTLFdBQUFBLE9BQWUsZUFDeEIsT0FBUyxjQUFBQyxHQUFZLFFBQUFDLE9BQVksTUFDakMsT0FBUyxpQkFBQUMsR0FBZSxZQUFBQyxNQUFnQixvQkMyQmpDLFNBQVNDLEVBQU1DLEVBQWlDQyxFQUF3QixDQUM3RSxJQUFNQyxFQUEwQ0MsRUFBQSxDQUM5QyxxQkFBc0IsSUFDbkJGLEdBRUwsTUFBTyxDQUErQkcsRUFBa0JDLElBQTBELENBRWhILEdBQU0sQ0FBRSxPQUFBQyxDQUFP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QkwsSUNKYixPQUFTLE9BQUFNLE9BQVcsTUFDcEIsT0FBUyxpQkFBQUMsR0FBZSxZQUFBQyxPQUFnQixvQkFNakMsSUFBTUMsR0FBTixjQUErQkMsQ0FBVSxDQVFoRCxFQVJhRCxHQUdLLE9BQVNFO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFGZ0RDLEVBQUEsQ0FBeEVDLEdBQVMsQ0FBRSxVQUFXLGtCQUFtQixLQUFNLE9BQVEsUUFBUyxFQUFLLENBQUMsR0FENURKLEdBQzhELHFCQUQ5REEsR0FBTkcsRUFBQSxDQURORSxHQUFjLG9CQUFvQixHQUN0QkwsSUNQYixPQUFTLGlCQUFBTSxPQUFxQixvQkFFOUIsT0FBUyxRQUFBQyxPQUFZLE1BR2QsSUFBTUMsR0FBTixjQUF5QkMsQ0FBVSxDQUMvQixRQUFTLENBQ2hCLE9BQU9DO0FBQUEscUJBRVQsQ0FDRixFQUxhRixHQUFORyxFQUFBLENBRE5DLEdBQWMsYUFBYSxHQUNmSixJQ0xiLE9BQVMsY0FBQUssT0FBa0IsTUFDM0IsT0FBUyxpQkFBQUMsT0FBcUIsb0JBR3ZCLElBQU1DLEdBQU4sY0FBOEJDLEVBQVcsQ0FBQyxFQUFwQ0QsR0FBTkUsRUFBQSxDQUROQyxHQUFjLG1CQUFtQixHQUNyQkgsSUNKYixPQUFTLGlCQUFBSSxPQUFxQixvQkFDOUIsT0FBeUIsT0FBQUMsR0FBSyxRQUFBQyxPQUFZLE1BZ0JuQyxJQUFNQyxHQUFOLGNBQThCQyxDQUFVLENBV3BDLFFBQVMsQ0FDaEIsT0FBT0M7QUFBQSxpQ0FFVCxDQUNGLEVBZmFGLEdBQ0osT0FBU0c7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBRExILEdBQU5JLEVBQUEsQ0FETkMsR0FBYyxtQkFBbUIsR0FDckJMLElDdURiLFFBQVEsSUFDTiwwQ0FDQSxnQ0FDQSxnR0FDQSxtQkFDRiIsCiAgIm5hbWVzIjogWyJwcm92aWRlIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgIndhdGNoIiwgInByb3BlcnR5TmFtZSIsICJvcHRpb25zIiwgInJlc29sdmVkT3B0aW9ucyIsICJfX3NwcmVhZFZhbHVlcyIsICJwcm90byIsICJkZWNvcmF0ZWRGbk5hbWUiLCAidXBkYXRlIiwgIndhdGNoZWRQcm9wZXJ0aWVzIiwgImNoYW5nZWRQcm9wcyIsICJwcm9wZXJ0eSIsICJrZXkiLCAib2xkVmFsdWUiLCAibmV3VmFsdWUiLCAiY3JlYXRlQ29udGV4dCIsICJpdGVtQ29udGV4dFZhcmlhYmxlcyIsICJpdGVtQ29udGV4dCIsICJRdGlBc3Nlc3NtZW50SXRlbSIsICJMaXRFbGVtZW50IiwgIl8iLCAiZGlzYWJsZWQiLCAiY2giLCAicmVhZG9ubHkiLCAiaXRlbUNvbnRleHRWYXJpYWJsZXMiLCAiX19zcHJlYWRQcm9wcyIsICJfX3NwcmVhZFZhbHVlcyIsICJmZWVkYmFja0VsZW1lbnQiLCAicmVzcG9uc2VJZGVudGlmaWVyIiwgImNvdW50QXR0ZW1wdCIsICJvdXRjb21lSWRlbnRpZmllciIsICJ2YWx1ZSIsICJ2IiwgInZhcmlhYmxlIiwgIm1hdGNoaW5nVmFsdWUiLCAiaW50ZXJhY3Rpb25FbGVtZW50IiwgImVsIiwgImZlIiwgIm15UmVzcG9uc2VzIiwgInJlc3BvbnNlIiwgImludGVyYWN0aW9uIiwgImkiLCAiaHRtbCIsICJzaG93IiwgInJlc3BvbnNlcyIsICJ2YXJpIiwgImNyIiwgImNvdW50TnVtQXR0ZW1wdHMiLCAiX2EiLCAicmVzcG9uc2VQcm9jZXNzb3IiLCAiaWRlbnRpZmllciIsICJldmVudCIsICJvdXRjb21lVmFyaWFibGUiLCAibmFtZSIsICJkZXRhaWwiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgIndhdGNoIiwgInByb3ZpZGUiLCAiaXRlbUNvbnRleHQiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiUXRpQXNzZXNzbWVudFN0aW11bHVzUmVmIiwgIkxpdEVsZW1lbnQiLCAiZXZlbnQiLCAic3RpbXVsdXNSZWYiLCAicGF0aCIsICJzdGltdWx1cyIsICJxdGlUcmFuc2Zvcm1JdGVtIiwgImFwaSIsICJlbGVtZW50cyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAicHJvcGVydHkiLCAiS0VZQ09ERSIsICJRdGlDaG9pY2UiLCAiTGl0RWxlbWVudCIsICJfIiwgImRpc2FibGVkIiwgImV2ZW50IiwgImh0bWwiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgInZhbHVlIiwgIndhdGNoIiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImNzcyIsICJxdGlfaXRlbV9ib2R5X3N0eWxlc19kZWZhdWx0IiwgIlF0aUl0ZW1Cb2R5IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJxdGlfaXRlbV9ib2R5X3N0eWxlc19kZWZhdWx0IiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgIlF0aVByb21wdCIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgIlF0aVN0eWxlc2hlZXQiLCAiTGl0RWxlbWVudCIsICJfY2hhbmdlZFByb3BlcnRpZXMiLCAiaXRlbSIsICJsaW5rIiwgInN0eWxlcyIsICJlcnJvciIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjb25zdW1lIiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpVmFyaWFibGVEZWNsYXJhdGlvbiIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAidmFyaWFibGUiLCAiaHRtbFZhbHVlcyIsICJkZWZhdWx0VmFsdWVzIiwgIm4iLCAiX19kZWNvcmF0ZUNsYXNzIiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpT3V0Y29tZURlY2xhcmF0aW9uIiwgIlF0aVZhcmlhYmxlRGVjbGFyYXRpb24iLCAiX2EiLCAiX2IiLCAidmFsdWUiLCAidiIsICJodG1sIiwgInRhYmxlIiwgImVudHJpZXMiLCAiZW50cnkiLCAic291cmNlVmFsdWUiLCAidGFyZ2V0VmFsdWUiLCAib3V0Y29tZVZhcmlhYmxlIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY29uc3VtZSIsICJpdGVtQ29udGV4dCIsICJzdGF0ZSIsICJjdXN0b21FbGVtZW50IiwgImNvbnN1bWUiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJRdGlSZXNwb25zZURlY2xhcmF0aW9uIiwgIlF0aVZhcmlhYmxlRGVjbGFyYXRpb24iLCAiX2EiLCAiX2IiLCAidmFsdWUiLCAidiIsICJodG1sIiwgInJlc3BvbnNlVmFyaWFibGUiLCAicmVzdWx0IiwgImNvcnJlY3RSZXNwb25zZSIsICJ2YWx1ZXMiLCAiaSIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgImNvbnN1bWUiLCAiaXRlbUNvbnRleHQiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpQ29tcGFuaW9uTWF0ZXJpYWxzSW5mbyIsICJMaXRFbGVtZW50IiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgIlF0aUNvbnRlbnRCb2R5IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiUXRpUnVicmljQmxvY2siLCAiTGl0RWxlbWVudCIsICJvbGQiLCAiZGlzYWJsZWQiLCAiY2xhc3NOYW1lIiwgImh0bWwiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJ3YXRjaCIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJwcm9wZXJ0eSIsICJkZWNpbWFsU2VwYXJhdG9yIiwgImNvbnZlcnROdW1iZXJUb1VuaXZlcmFsRm9ybWF0IiwgIm51bWJlciIsICJkU2VwIiwgIklzTnVsbE9yVW5kZWZpbmVkIiwgInZhbHVlIiwgInJlbW92ZURvdWJsZVNsYXNoZXMiLCAic3RyIiwgIlF0aUZlZWRiYWNrIiwgIkxpdEVsZW1lbnQiLCAib3V0Y29tZUlkZW50aWZpZXIiLCAib3V0Y29tZVZhcmlhYmxlIiwgImlzRm91bmQiLCAiSXNOdWxsT3JVbmRlZmluZWQiLCAidmFsdWUiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgIlF0aUZlZWRiYWNrQmxvY2siLCAiUXRpRmVlZGJhY2siLCAiaHRtbCIsICJfY2hhbmdlZFByb3BlcnRpZXMiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpRmVlZGJhY2tJbmxpbmUiLCAiUXRpRmVlZGJhY2siLCAiaHRtbCIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlNb2RhbEZlZWRiYWNrIiwgIlF0aUZlZWRiYWNrIiwgImh0bWwiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImlmRGVmaW5lZCIsICJwcm9wZXJ0eSIsICJMaXRFbGVtZW50IiwgIkludGVyYWN0aW9uIiwgIkxpdEVsZW1lbnQiLCAidmFsIiwgInZhbHVlIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJyZWYiLCAiY3JlYXRlUmVmIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiUXRpRXh0ZW5kZWRUZXh0SW50ZXJhY3Rpb24iLCAiSW50ZXJhY3Rpb24iLCAiY3JlYXRlUmVmIiwgIm9sZCIsICJkaXNhYmxlZCIsICJjbGFzc05hbWUiLCAibnJSb3dzIiwgInZhbHVlIiwgImNzcyIsICJodG1sIiwgInJlZiIsICJldmVudCIsICJpZkRlZmluZWQiLCAiaW5wdXQiLCAidGV4dCIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAic3RhdGUiLCAid2F0Y2giLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgImlmRGVmaW5lZCIsICJjcmVhdGVSZWYiLCAibGl2ZVF1ZXJ5IiwgInF1ZXJ5U2VsZWN0b3IiLCAib3B0aW9ucyIsICJvYnNlcnZlciIsICJyZXNvbHZlZE9wdGlvbnMiLCAiX19zcHJlYWRWYWx1ZXMiLCAicHJvdG8iLCAiZGVjb3JhdGVkRm5OYW1lIiwgImNvbm5lY3RlZENhbGxiYWNrIiwgImRpc2Nvbm5lY3RlZENhbGxiYWNrIiwgIl9hIiwgImNhbGxiYWNrIiwgIm11dGF0aW9uTGlzdCIsICJlbGVtZW50c1RvV2F0Y2giLCAibXV0YXRpb24iLCAiYWRkZWROb2RlcyIsICJlIiwgInJlbW92ZWROb2RlcyIsICJuIiwgImVsZW1lbnRzQWRkZWQiLCAiUXRpVGV4dEVudHJ5SW50ZXJhY3Rpb24iLCAiSW50ZXJhY3Rpb24iLCAiY3JlYXRlUmVmIiwgIm9sZCIsICJjbGFzc2VzIiwgImNsYXNzTmFtZSIsICJuclJvd3MiLCAidmFsdWUiLCAiY3NzIiwgImh0bWwiLCAiZXZlbnQiLCAiaWZEZWZpbmVkIiwgImlucHV0IiwgInRleHQiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgInN0YXRlIiwgIndhdGNoIiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgIkNob2ljZXMiLCAiSW50ZXJhY3Rpb24iLCAiXyIsICJkaXNhYmxlZCIsICJjaCIsICJyZWFkb25seSIsICJhY2MiLCAidmFsIiwgInJlc3BvbnNlVmFsdWUiLCAicmVzcG9uc2VWYWx1ZUFycmF5IiwgImNlIiwgInJ2IiwgImNob2ljZUVsZW1lbnQiLCAiZXZlbnQiLCAic2VsZWN0ZWRJZGVudGlmaWVycyIsICJyZXN1bHQiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgIndhdGNoIiwgIlF0aUhvdHRleHRJbnRlcmFjdGlvbiIsICJDaG9pY2VzIiwgImh0bWwiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJ1bnNhZmVIVE1MIiwgIlF0aUlubGluZUNob2ljZUludGVyYWN0aW9uIiwgIkludGVyYWN0aW9uIiwgImNzcyIsICJodG1sIiwgIm9wdGlvbiIsICJ1bnNhZmVIVE1MIiwgImNob2ljZXMiLCAiY2hvaWNlIiwgInNlbGVjdGVkT3B0aW9uIiwgImkiLCAiX19zcHJlYWRQcm9wcyIsICJfX3NwcmVhZFZhbHVlcyIsICJ2YWx1ZSIsICJldmVudCIsICJzZWxlY3RlZE9wdGlvblZhbHVlIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJzdGF0ZSIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAiaHRtbCIsICJjc3MiLCAicXRpX2Nob2ljZV9pbnRlcmFjdGlvbl9zdHlsZXNfZGVmYXVsdCIsICJRdGlDaG9pY2VJbnRlcmFjdGlvbiIsICJDaG9pY2VzIiwgImh0bWwiLCAicXRpX2Nob2ljZV9pbnRlcmFjdGlvbl9zdHlsZXNfZGVmYXVsdCIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpT3V0Y29tZVByb2Nlc3NpbmciLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImxvZ2ljIiwgIlF0aU91dGNvbWVQcm9jZXNzaW5nUHJvY2Vzc29yIiwgInJ1bGVzIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJydWxlIiwgImNzcyIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJtYXRjaENvcnJlY3QiLCAibWFwUmVzcG9uc2UiLCAibWFwUmVzcG9uc2VQb2ludCIsICJRdGlSZXNwb25zZVByb2Nlc3NpbmciLCAiTGl0RWxlbWVudCIsICJodG1sIiwgInJ1bGVzIiwgInJ1bGUiLCAiX2NoYW5nZWRQcm9wZXJ0aWVzIiwgInNwbGl0dGVkVGVtcGxhdGVOYW1lIiwgInRlbXBsYXRlTmFtZSIsICJtYXBSZXNwb25zZSIsICJtYXBSZXNwb25zZVBvaW50IiwgIm1hdGNoQ29ycmVjdCIsICJzdHJIVE1MIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJRdGlSdWxlIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlMb29rdXBPdXRjb21lVmFsdWUiLCAiUXRpUnVsZSIsICJpZGVudGlmaWVyIiwgIm91dGNvbWVWYXJpYWJsZSIsICJ2YWx1ZSIsICJjb252ZXJ0TnVtYmVyVG9Vbml2ZXJhbEZvcm1hdCIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiaHRtbCIsICJRdGlSZXNwb25zZUNvbmRpdGlvbiIsICJRdGlSdWxlIiwgImh0bWwiLCAiYnJhbmNoZXMiLCAiaSIsICJicmFuY2giLCAiUXRpU2V0T3V0Y29tZVZhbHVlIiwgIlF0aVJ1bGUiLCAib3V0Y29tZUlkZW50aWZpZXIiLCAiZXhwcmVzc2lvbiIsICJ2YWx1ZSIsICJRdGlTZXRPdXRjb21lVmFsdWVSdWxlIiwgInYiLCAiY29udmVydE51bWJlclRvVW5pdmVyYWxGb3JtYXQiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgIlF0aVJlc3BvbnNlRWxzZSIsICJzdWJSdWxlcyIsICJpIiwgImh0bWwiLCAiUXRpUmVzcG9uc2VJZiIsICJRdGlSZXNwb25zZUVsc2UiLCAicmVzdWx0IiwgImkiLCAiUXRpUmVzcG9uc2VFbHNlSWYiLCAiUXRpUmVzcG9uc2VJZiIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAic3RhdGUiLCAiUXRpRXhwcmVzc2lvbiIsICJMaXRFbGVtZW50IiwgImlkZW50aWZpZXIiLCAidmFsdWVzIiwgInYiLCAicmVzcG9uc2VWYXJpYWJsZSIsICJlcnJvciIsICJodG1sIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAic3RhdGUiLCAiUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiIsICJRdGlFeHByZXNzaW9uIiwgIlF0aUFuZCIsICJxdGlBbmRNaXhpbiIsICJRdGlDb25kaXRpb25FeHByZXNzaW9uIiwgIkJhc2UiLCAiY2hpbGRyZW4iLCAiYyIsICJjb25kaXRpb24iLCAidmFsdWUiLCAiZSIsICJRdGlBbmQiLCAicHJvcGVydHkiLCAiUXRpQmFzZVZhbHVlIiwgIlF0aUV4cHJlc3Npb24iLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgIlF0aUNvbnRhaW5zIiwgIlF0aUNvbmRpdGlvbkV4cHJlc3Npb24iLCAidmFsdWVzIiwgInZhbHVlMSIsICJ2YWx1ZTIiLCAicHJvamVjdGlvbjEiLCAicHJvamVjdGlvbjIiLCAieCIsICJRdGlDb3JyZWN0IiwgIlF0aUV4cHJlc3Npb24iLCAiaWRlbnRpZmllciIsICJyZXNwb25zZVZhcmlhYmxlIiwgInByb3BlcnR5IiwgIlF0aUVxdWFsUm91bmRlZCIsICJRdGlFeHByZXNzaW9uIiwgImZpZ3VyZXMiLCAidmFsdWVzIiwgInZhbHVlMSIsICJ2YWx1ZTIiLCAiZmxvYXQxIiwgImZsb2F0MiIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAicHJvcGVydHkiLCAiU2NvcmluZ0hlbHBlciIsICJ2YWx1ZTEiLCAidmFsdWUyIiwgImJhc2VUeXBlIiwgImludDEiLCAiaW50MiIsICJmbG9hdDEiLCAiZmxvYXQyIiwgInBhaXIxIiwgInBhaXIyIiwgIlF0aUVxdWFsIiwgIlF0aUV4cHJlc3Npb24iLCAidmFsdWVzIiwgInZhbHVlMSIsICJ2YWx1ZTIiLCAiU2NvcmluZ0hlbHBlciIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiUXRpR3QiLCAiUXRpRXhwcmVzc2lvbiIsICJ2YWx1ZXMiLCAidmFsdWUxIiwgInZhbHVlMiIsICJRdGlHdGUiLCAiUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiIsICJ2YWx1ZXMiLCAidmFsdWUxIiwgInZhbHVlMiIsICJRdGlJc051bGwiLCAiUXRpRXhwcmVzc2lvbiIsICJ2YXJpYWJsZXMiLCAidmFsdWUiLCAiUXRpTHQiLCAiUXRpRXhwcmVzc2lvbiIsICJ2YWx1ZXMiLCAidmFsdWUxIiwgInZhbHVlMiIsICJRdGlMdGUiLCAiUXRpQ29uZGl0aW9uRXhwcmVzc2lvbiIsICJ2YWx1ZXMiLCAidmFsdWUxIiwgInZhbHVlMiIsICJwcm9wZXJ0eSIsICJRdGlNYXBSZXNwb25zZSIsICJRdGlFeHByZXNzaW9uIiwgInJlc3BvbnNlIiwgIm1hcHBpbmciLCAiY2FuZGlkYXRlUmVzcG9uc2VzIiwgInJlc3VsdCIsICJjYW5kaWRhdGVSZXNwb25zZSIsICJtYXBwZWRWYWx1ZSIsICJlbnRyeSIsICJTY29yaW5nSGVscGVyIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJwcm9wZXJ0eSIsICJMaXRFbGVtZW50IiwgIlF0aU1hcHBpbmciLCAiTGl0RWxlbWVudCIsICJlbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiUXRpTWF0Y2giLCAiX1F0aU1hdGNoIiwgIlF0aUV4cHJlc3Npb24iLCAidmFsdWVzIiwgInZhbHVlVG9NYXAiLCAiY29ycmVjdFZhbHVlSW5mbyIsICJfYSIsICJTY29yaW5nSGVscGVyIiwgImFuc3dlckluZGV4IiwgImNvcnJlY3RBbnN3ZXIiLCAiY3VycmVudFZhbHVlVG9NYXAiLCAibWF0Y2hpbmdWYWx1ZSIsICJhcnIiLCAibXYiLCAiUXRpTWVtYmVyIiwgIlF0aUV4cHJlc3Npb24iLCAidmFsdWVzIiwgInZhbHVlMSIsICJ2YWx1ZTIiLCAicHJvamVjdGlvbjEiLCAiUXRpTXVsdGlwbGUiLCAiUXRpRXhwcmVzc2lvbiIsICJ2YXJpYWJsZXMiLCAidmFyaWFibGUiLCAiaHRtbCIsICJRdGlOb3QiLCAiUXRpRXhwcmVzc2lvbiIsICJodG1sIiwgIlF0aU9yIiwgIlF0aUNvbmRpdGlvbkV4cHJlc3Npb24iLCAiYyIsICJjb25kaXRpb24iLCAidmFsdWUiLCAiUXRpT3JkZXJlZCIsICJRdGlFeHByZXNzaW9uIiwgInZhcmlhYmxlcyIsICJ2YXJpYWJsZSIsICJjb25zdW1lIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJRdFByaW50ZWRWYXJpYWJsZSIsICJMaXRFbGVtZW50IiwgIl9hIiwgIl9iIiwgInZhbHVlIiwgInYiLCAiaHRtbCIsICJhc3Nlc3NtZW50SXRlbSIsICJpZGVudGlmaWVyIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJjb25zdW1lIiwgIml0ZW1Db250ZXh0IiwgInN0YXRlIiwgIlF0aVByb2R1Y3QiLCAiUXRpRXhwcmVzc2lvbiIsICJhY2N1bXVsYXRvciIsICJjdXJyZW50VmFsdWUiLCAiZXJyb3IiLCAicHJvcGVydHkiLCAiUXRpU3RyaW5nTWF0Y2giLCAiUXRpRXhwcmVzc2lvbiIsICJ2YWx1ZXMiLCAidmFsdWUxIiwgInZhbHVlMiIsICJ2MSIsICJ2MiIsICJTY29yaW5nSGVscGVyIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJRdGlTdW0iLCAiUXRpRXhwcmVzc2lvbiIsICJRdGlTdW1FeHByZXNzaW9uIiwgImV4cHJlc3Npb25zIiwgImMiLCAidmFsdWUiLCAiYSIsICJiIiwgIlF0aVZhcmlhYmxlIiwgIlF0aUV4cHJlc3Npb24iLCAiaWRlbnRpZmllciIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiUXRpUG9ydGFibGVDdXN0b21JbnRlcmFjdGlvbiIsICJJbnRlcmFjdGlvbiIsICJ1cmwiLCAiYmFzZVVybCIsICJyZXF1aXJlQ29uZmlnIiwgIm1vZHVsZUNvbmciLCAibW9kdWxlSWQiLCAiZSIsICJwYXRoIiwgImJhc2VQYXRoIiwgImNvbmZpZyIsICJwcmltYXJ5Q29uZmlnIiwgImZhbGxiYWNrIiwgIl9hIiwgImZhaWxlZFRvUmVzb2x2ZSIsICJwYXRoV2l0aEV4dGVuc2lvbiIsICJmYWxsYmFja0NvbmZpZyIsICJpbnB1dCIsICJ0b3BMZXZlbEtleSIsICJuZXN0ZWRPYmplY3QiLCAibmVzdGVkS2V5IiwgInZhbHVlIiwgInJlc3BvbnNlIiwgIm5ld1Jlc3BvbnNlIiwgInN0cmluZ2lmaWVkIiwgInZhbCIsICJub2RlIiwgImEiLCAiZ2V0UHJvcGVydHlWYWx1ZSIsICJlbCIsICJwcm9wZXJ0eSIsICJrZXkiLCAiY2hpbGRyZW4iLCAiYWxsS2V5IiwgImMiLCAiayIsICJnZXRDaGlsZFByb3BlcnRpZXMiLCAicHJvcGVydGllcyIsICJjaGlsZCIsICJfX3NwcmVhZFZhbHVlcyIsICJwY2kiLCAidHlwZSIsICJkb20iLCAiYWNjIiwgImxpbmsiLCAic3R5bGVzIiwgInJlcXVpcmUiLCAiY3R4QSIsICJ3YXNQcmV2aW91c2x5TG9hZGVkIiwgImVyciIsICJtb2R1bGVSZXNvbHV0aW9uUGF0aCIsICJtb2R1bGVSZXNvbHV0aW9uRmFsbGJhY2tQYXRoIiwgImludGVyYWN0aW9uTW9kdWxlcyIsICJtb2R1bGVzIiwgIm1vZHVsZSIsICJwcmltYXJ5UGF0aCIsICJmYWxsYmFja1BhdGgiLCAiX19zcHJlYWRQcm9wcyIsICJzdHIiLCAiaHRtbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAic3RhdGUiLCAiVG91Y2hEcmFnQW5kRHJvcCIsICJfVG91Y2hEcmFnQW5kRHJvcCIsICJ0eXBlIiwgInZhbCIsICJlIiwgIl90b3VjaGVzIiwgImVsZW1lbnRTdHlsZXMiLCAic3R5bGUiLCAiX3RoaXMiLCAidGFyZ2V0IiwgImRyYWdnYWJsZXMiLCAiZWwiLCAieCIsICJ5IiwgIl9hIiwgImV2ZW50IiwgInBvaW50RnJvbVRvdWNoRXZlbnQiLCAiY3VzdG9tRWwiLCAicGFnZSIsICJ0b3VjaCIsICJjbGllbnRSZWN0IiwgImV2ZW50VHlwZSIsICJidWJibGUiLCAicHJvcGVydHkiLCAiRHJvcHBhYmxlc01peGluIiwgInN1cGVyQ2xhc3MiLCAiZHJvcHBhYmxlc0luU2hhZG93Um9vdCIsICJkcm9wcGFibGVzU2VsZWN0b3IiLCAiRHJvcHBhYmxlc0VsZW1lbnQiLCAiY2hhbmdlZFByb3BzIiwgImRyb3BwYWJsZXMiLCAiZCIsICJkcm9wcGFibGUiLCAibXV0YXRpb25zIiwgIm11dGF0aW9uIiwgIl9hIiwgImV2IiwgImRyYWdnYWJsZUluTGlnaHREb20iLCAiZHJhZ2dhYmxlIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJGbGlwcGFibGVzTWl4aW4iLCAic3VwZXJDbGFzcyIsICJkcm9wcGFibGVzU2VsIiwgImRyYWdnYWJsZXNTZWwiLCAiRmxpcHBhYmxlc0VsZW1lbnQiLCAicHJvcGVydHkiLCAiRHJhZ0Ryb3BJbnRlcmFjdGlvbk1peGluIiwgInN1cGVyQ2xhc3MiLCAiZHJhZ2dhYmxlc1NlbGVjdG9yIiwgImRyb3BwYWJsZXNJblNoYWRvd1Jvb3QiLCAiZHJvcHBhYmxlc1NlbGVjdG9yIiwgIkRyYWdEcm9wSW50ZXJhY3Rpb25FbGVtZW50IiwgIkZsaXBwYWJsZXNNaXhpbiIsICJEcm9wcGFibGVzTWl4aW4iLCAiZXYiLCAiZCIsICJkcmFnZ2FibGUiLCAiZHJhZ3NBZGRlZCIsICJkcmFnc1JlbW92ZWQiLCAiZWxlbSIsICJvbGQiLCAiZHJhZ09wdGlvbnMiLCAiZGlzYWJsZWQiLCAicyIsICJjaCIsICJyZWFkb25seSIsICJjaGFuZ2VkUHJvcHMiLCAiVG91Y2hEcmFnQW5kRHJvcCIsICJwb3NpdGlvbiIsICJpbmRleCIsICJpbnRlcmFjdGlvbiIsICJnYXBUZXh0IiwgInNhdmUiLCAiY2hpbGRyZW4iLCAiZGlzYWJsZSIsICJyZXNwb25zZSIsICJkcm9wSWQiLCAiZHJhZ0lkcyIsICJkcm9wcGFibGUiLCAiZHJvcCIsICJkcmFnSWQiLCAiYXNzb2NpYXRpb25zIiwgInJlc3BvbnNlU3RyaW5nIiwgImRyYWdzSW5Ecm9wcGFibGUiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImxpdmVRdWVyeSIsICJwcm9wZXJ0eSIsICJ3YXRjaCIsICJRdGlBc3NvY2lhdGVJbnRlcmFjdGlvbiIsICJEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4iLCAiTGl0RWxlbWVudCIsICJodG1sIiwgIl8iLCAiaW5kZXgiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJzdGF0ZSIsICJjdXN0b21FbGVtZW50IiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJRdGlDdXN0b21JbnRlcmFjdGlvbiIsICJJbnRlcmFjdGlvbiIsICJ1cmlUb01hbmlmZXN0IiwgInJlbW92ZURvdWJsZVNsYXNoZXMiLCAicmVzcG9uc2UiLCAiZGF0YSIsICJlcnIiLCAiaWZyYW1lIiwgImlmcmFtZVdpbiIsICJpZnJhbWVEb2MiLCAiaWZyYW1lc0luU2hhZG93Um9vdCIsICJvdXRlcklGcmFtZXMiLCAiaWZyYW1lU3JjIiwgIm91dGVyRG9jIiwgImUiLCAiaW5kZXgiLCAiaWZyYW1lRG9jdW1lbnQiLCAiaWZyYW1lcyIsICJuZXN0ZWREb2MiLCAidHlwZSIsICJldmVudCIsICJtZWRpYURhdGEiLCAibWVkaWEiLCAidmFsIiwgImh0bWwiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgInN0YXRlIiwgImN1c3RvbUVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgIlF0aUVuZEF0dGVtcHRJbnRlcmFjdGlvbiIsICJJbnRlcmFjdGlvbiIsICJ2YWwiLCAiaHRtbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpR2FwTWF0Y2hJbnRlcmFjdGlvbiIsICJEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4iLCAiTGl0RWxlbWVudCIsICJodG1sIiwgInZhbHVlIiwgIm1hdGNoZXMiLCAicmVzcG9uc2UiLCAieCIsICJzcGxpdCIsICJnYXAiLCAiaW5kZXgiLCAiX2EiLCAiX2IiLCAiX2MiLCAiX2QiLCAiaWRlbnRpZmllciIsICJ0ZXh0SWRlbnRpZmllciIsICJ0ZXh0IiwgInRleHRTcGFuIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJzdmciLCAiY3VzdG9tRWxlbWVudCIsICJxdWVyeSIsICJxdWVyeUFzc2lnbmVkRWxlbWVudHMiLCAic3RhdGUiLCAiaWZEZWZpbmVkIiwgInJlcGVhdCIsICJwb3NpdGlvbkhvdHNwb3RzIiwgInNoYXBlIiwgImNvb3Jkc051bWJlciIsICJpbWciLCAiaG90c3BvdCIsICJjZW50ZXJYIiwgImNlbnRlclkiLCAicmFkaXVzIiwgImNlbnRlclhQZXIiLCAiY2VudGVyWVBlciIsICJyYWRpdXNQZXIiLCAibGVmdFgiLCAidG9wWSIsICJyaWdodFgiLCAiYm90dG9tWSIsICJsZWZ0WFBlciIsICJ0b3BZUGVyIiwgInJpZ2h0WFBlciIsICJib3R0b21ZUGVyIiwgInBvbHljb29yZHMiLCAiYWNjIiwgImN1cnJlbnRWYWx1ZSIsICJjdXJyZW50SW5kZXgiLCAicG9seUMiLCAibGFzdFZhbCIsICJwb2ludCIsICJwb2x5RCIsICJwIiwgIlF0aUdyYXBoaWNBc3NvY2lhdGVJbnRlcmFjdGlvbiIsICJJbnRlcmFjdGlvbiIsICJ2YWwiLCAiX2EiLCAiX2IiLCAiX2MiLCAiX2QiLCAiaHRtbCIsICJpZkRlZmluZWQiLCAicmVwZWF0IiwgImxpbmUiLCAiaW5kZXgiLCAic3ZnIiwgImUiLCAiXyIsICJpIiwgImltZyIsICJob3RzcG90IiwgImNvb3JkcyIsICJzaGFwZSIsICJjb29yZHNOdW1iZXIiLCAicyIsICJwb3NpdGlvbkhvdHNwb3RzIiwgImV2ZW50IiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAic3RhdGUiLCAicXVlcnkiLCAicXVlcnlBc3NpZ25lZEVsZW1lbnRzIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgIlF0aUdyYXBoaWNHYXBNYXRjaEludGVyYWN0aW9uIiwgIkRyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiIsICJMaXRFbGVtZW50IiwgImh0bWwiLCAiZSIsICJpbWciLCAiaG90c3BvdCIsICJjb29yZHMiLCAic2hhcGUiLCAiY29vcmRzTnVtYmVyIiwgInMiLCAiY2VudGVyWCIsICJjZW50ZXJZIiwgInJhZGl1cyIsICJsZWZ0WCIsICJ0b3BZIiwgInJpZ2h0WCIsICJib3R0b21ZIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgIlF0aUdyYXBoaWNPcmRlckludGVyYWN0aW9uIiwgIkNob2ljZXMiLCAiaHRtbCIsICJlIiwgImlkZW50aWZpZXIiLCAiaG90c3BvdCIsICJlbCIsICJtYXhTZWxlY3Rpb24iLCAiaSIsICJpbWciLCAiY29vcmRzIiwgInNoYXBlIiwgImNvb3Jkc051bWJlciIsICJzIiwgInBvc2l0aW9uSG90c3BvdHMiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpSG90c3BvdEludGVyYWN0aW9uIiwgIkNob2ljZXMiLCAiaHRtbCIsICJlIiwgImltZyIsICJob3RzcG90IiwgImNvb3JkcyIsICJzaGFwZSIsICJjb29yZHNOdW1iZXIiLCAicyIsICJwb3NpdGlvbkhvdHNwb3RzIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJMaXRFbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAic3RhdGUiLCAidW5zYWZlSFRNTCIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJRdGlTaW1wbGVBc3NvY2lhYmxlQ2hvaWNlIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJRdGlNYXRjaEludGVyYWN0aW9uIiwgIkRyYWdEcm9wSW50ZXJhY3Rpb25NaXhpbiIsICJMaXRFbGVtZW50IiwgInJhZGlvIiwgImNoZWNrYm94IiwgInZhbHVlIiwgIm5hbWUiLCAidHlwZSIsICJ2IiwgInJlc3BvbnNlVmFsdWUiLCAiaHRtbCIsICJjb2wiLCAiaSIsICJ1bnNhZmVIVE1MIiwgInJvdyIsICJySW5kZXgiLCAiY0luZGV4IiwgInJvd0lkIiwgImNvbElkIiwgInNlbGVjdGVkSW5Sb3dDb3VudCIsICJjaGVja2VkIiwgInBhcnQiLCAiZGlzYWJsZSIsICJlIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAic3RhdGUiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgIlF0aU1lZGlhSW50ZXJhY3Rpb24iLCAiSW50ZXJhY3Rpb24iLCAidmFsIiwgIl9fc3ByZWFkUHJvcHMiLCAiX19zcHJlYWRWYWx1ZXMiLCAiaHRtbCIsICJtZWRpYU9iamVjdCIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgInByb3BlcnR5IiwgInN0YXRlIiwgInVuc2FmZUhUTUwiLCAiUXRpT3JkZXJJbnRlcmFjdGlvbiIsICJEcmFnRHJvcEludGVyYWN0aW9uTWl4aW4iLCAiTGl0RWxlbWVudCIsICJjaG9pY2VzIiwgImh0bWwiLCAiXyIsICJpIiwgInVuc2FmZUhUTUwiLCAidmFsdWUiLCAicmVzcG9uc2UiLCAiaW5kZXgiLCAic2ltcGxlQ2hvaWNlIiwgInRleHQiLCAiZWwiLCAiY3NzIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJzdGF0ZSIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiUXRpU1Bvc2l0aW9uT2JqZWN0SW50ZXJhY3Rpb24iLCAiTGl0RWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgIlF0aVBvc2l0aW9uT2JqZWN0U3RhZ2UiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImV2ZW50IiwgImRlbHRhWCIsICJkZWx0YVkiLCAiYSIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJzdGF0ZSIsICJyZXBlYXQiLCAic3R5bGVNYXAiLCAiUXRpU2VsZWN0UG9pbnRJbnRlcmFjdGlvbiIsICJJbnRlcmFjdGlvbiIsICJodG1sIiwgInJlcGVhdCIsICJwb2ludCIsICJpbmRleCIsICJzdHlsZU1hcCIsICJlIiwgIl8iLCAiaSIsICJ2YWwiLCAiZXZlbnQiLCAieCIsICJ5IiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiaHRtbCIsICJub3RoaW5nIiwgImN1c3RvbUVsZW1lbnQiLCAicHJvcGVydHkiLCAicXVlcnkiLCAiUXRpU2xpZGVySW50ZXJhY3Rpb24iLCAiSW50ZXJhY3Rpb24iLCAib2xkIiwgImRpc2FibGVkIiwgInJlYWRvbmx5IiwgInZhbHVlIiwgIm15UmVzcG9uc2UiLCAidmFsdWVQZXJjZW50YWdlIiwgImh0bWwiLCAibm90aGluZyIsICJldmVudCIsICJoYW5kbGVUb3VjaE1vdmUiLCAieCIsICJkaWZmWCIsICJoYW5kbGVUb3VjaEVuZCIsICJoYW5kbGVNb3VzZU1vdmUiLCAiaGFuZGxlTW91c2VVcCIsICJ2YWx1ZU5vdyIsICJyb3VuZGVkU3RlcFZhbHVlIiwgIl90b3VjaE1vdmUiLCAiZXZ0IiwgInRvdWNoIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAicXVlcnkiLCAicHJvcGVydHkiLCAid2F0Y2giLCAiY3VzdG9tRWxlbWVudCIsICJjb25zdW1lIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJjdXN0b21FbGVtZW50IiwgInN0YXRlIiwgIlF0aUN1c3RvbU9wZXJhdG9yIiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJldmVudCIsICJfYSIsICJfYiIsICJfYyIsICJjb21tZW50Tm9kZSIsICJub2RlIiwgImUiLCAiZm4iLCAicmVzcG9uc2VJZGVudGlmaWVyIiwgInYiLCAiaXRlbSIsICJ2YXJpYWJsZUlkZW50aWZpZXIiLCAib3V0Y29tZUlkZW50aWZpZXIiLCAidmFsdWUiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImNvbnN1bWUiLCAiaXRlbUNvbnRleHQiLCAic3RhdGUiLCAiY3VzdG9tRWxlbWVudCIsICJMaXRFbGVtZW50IiwgImNzcyIsICJodG1sIiwgImN1c3RvbUVsZW1lbnQiLCAiUXRpQXNzb2NpYWJsZUhvdHNwb3QiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJRdGlHYXAiLCAiTGl0RWxlbWVudCIsICJodG1sIiwgIl9fZGVjb3JhdGVDbGFzcyIsICJwcm9wZXJ0eSIsICJjdXN0b21FbGVtZW50IiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJRdGlHYXBJbWciLCAiTGl0RWxlbWVudCIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgIkxpdEVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJRdGlHYXBUZXh0IiwgIkxpdEVsZW1lbnQiLCAiaHRtbCIsICJfX2RlY29yYXRlQ2xhc3MiLCAicHJvcGVydHkiLCAiY3VzdG9tRWxlbWVudCIsICJjc3MiLCAiY3VzdG9tRWxlbWVudCIsICJwcm9wZXJ0eSIsICJRdGlIb3RzcG90Q2hvaWNlIiwgIlF0aUNob2ljZSIsICJjc3MiLCAiX19kZWNvcmF0ZUNsYXNzIiwgInByb3BlcnR5IiwgImN1c3RvbUVsZW1lbnQiLCAiY3VzdG9tRWxlbWVudCIsICJodG1sIiwgIlF0aUhvdHRleHQiLCAiUXRpQ2hvaWNlIiwgImh0bWwiLCAiX19kZWNvcmF0ZUNsYXNzIiwgImN1c3RvbUVsZW1lbnQiLCAiTGl0RWxlbWVudCIsICJjdXN0b21FbGVtZW50IiwgIlF0aUlubGluZUNob2ljZSIsICJMaXRFbGVtZW50IiwgIl9fZGVjb3JhdGVDbGFzcyIsICJjdXN0b21FbGVtZW50IiwgImN1c3RvbUVsZW1lbnQiLCAiY3NzIiwgImh0bWwiLCAiUXRpU2ltcGxlQ2hvaWNlIiwgIlF0aUNob2ljZSIsICJodG1sIiwgImNzcyIsICJfX2RlY29yYXRlQ2xhc3MiLCAiY3VzdG9tRWxlbWVudCJdCn0K
|