diff --git a/dist/index.d.ts b/dist/index.d.ts index 2b051bd..7a18539 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -61,6 +61,7 @@ export declare const Vnode: VnodeInterface; export declare function isComponent(component: any): component is Component; export declare const isVnode: (object?: unknown | VnodeInterface) => object is VnodeInterface; export declare const isVnodeComponent: (object?: unknown | VnodeComponentInterface) => object is VnodeComponentInterface; +export declare function domToVnode(dom: any): VnodeWithDom; export declare function trust(htmlString: string): any; export declare const current: Current; export declare const reservedProps: Record; diff --git a/dist/index.d.ts.map b/dist/index.d.ts.map index 9da6d08..3e73844 100644 --- a/dist/index.d.ts.map +++ b/dist/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.js b/dist/index.js index 0df58eb..e55e6f9 100644 --- a/dist/index.js +++ b/dist/index.js @@ -24,6 +24,7 @@ __export(lib_exports, { current: () => current, directive: () => directive, directives: () => directives, + domToVnode: () => domToVnode, isComponent: () => isComponent, isNodeJs: () => isNodeJs, isVnode: () => isVnode, @@ -64,16 +65,15 @@ var isVnodeComponent = (object) => { return isVnode(object) && isComponent(object.tag); }; function domToVnode(dom) { + if (dom.nodeType === 3) { + let vnode2 = new Vnode(textTag, {}, [dom.nodeValue]); + vnode2.dom = dom; + return vnode2; + } let children = []; for (let i = 0, l = dom.childNodes.length; i < l; i++) { let childDom = dom.childNodes[i]; - if (childDom.nodeType === 3) { - let vnode2 = new Vnode(textTag, {}, [childDom.nodeValue]); - vnode2.dom = childDom; - children.push(vnode2); - continue; - } - if (childDom.nodeType === 1) { + if (childDom.nodeType === 1 || childDom.nodeType === 3) { children.push(domToVnode(childDom)); } } diff --git a/dist/index.min.js b/dist/index.min.js index e45785b..2a2895c 100644 --- a/dist/index.min.js +++ b/dist/index.min.js @@ -1 +1 @@ -(()=>{var e="#text",t=Boolean("undefined"!=typeof process&&process.versions&&process.versions.node);function n(e,t=!1){return t?document.createElementNS("http://www.w3.org/2000/svg",e):document.createElement(e)}var o=function(e,t,n){this.tag=e,this.props=t,this.children=n};function l(e){return e&&("function"==typeof e||"object"==typeof e&&"view"in e)}var d=e=>e instanceof o,i=e=>d(e)&&l(e.tag);function r(t){let n=[];for(let l=0,d=t.childNodes.length;lr(e))}var s=null,a=null,c=!1,u={vnode:null,oldVnode:null,component:null,event:null},m={key:!0,state:!0,"v-keep":!0,"v-if":!0,"v-unless":!0,"v-for":!0,"v-show":!0,"v-class":!0,"v-html":!0,"v-model":!0,"v-create":!0,"v-update":!0,"v-cleanup":!0},f=new Set,v=new Set,h=new Set,g=new Set;function y(e){f.add(e)}function w(e){for(let t of e)t();e.clear()}var V={};function k(e){u.event=e;let t=e.target,n=`v-on${e.type}`;for(;t;){if(t[n])return t[n](e,t),void(e.defaultPrevented||G());t=t.parentNode}u.event=null}var C=e=>(t,n,o)=>{if(e?t:!t){let e=document.createTextNode("");return o&&o.dom&&o.dom.parentNode&&o.dom.parentNode.replaceChild(e,o.dom),n.tag="#text",n.children=[],n.props={},n.dom=e,!1}},N={"v-if":C(!1),"v-unless":C(!0),"v-for":(e,t)=>{let n=[],o=t.children[0];for(let t=0,l=e.length;t{t.dom.style.display=e?"":"none"},"v-class":(e,t)=>{for(let n in e)t.dom.classList.toggle(n,e[n])},"v-html":(e,t)=>{t.children=[p(e)]},"v-model":([e,t,n],o,l)=>{let d,i=n=>e[t]=n.target.value;if("input"===o.tag)switch(n=n||"oninput",o.props.type){case"checkbox":Array.isArray(e[t])?(i=n=>{let o=n.target.value,l=e[t].indexOf(o);-1===l?e[t].push(o):e[t].splice(l,1)},d=-1!==e[t].indexOf(o.dom.value)):"value"in o.props?(i=()=>{e[t]===o.props.value?e[t]=null:e[t]=o.props.value},d=e[t]===o.props.value):(i=()=>e[t]=!e[t],d=e[t]),S("checked",d,o);break;case"radio":S("checked",e[t]===o.dom.value,o);break;default:S("value",e[t],o)}else"select"===o.tag?(n=n||"onclick",o.props.multiple?(i=n=>{let o=n.target.value;if(n.ctrlKey){let n=e[t].indexOf(o);-1===n?e[t].push(o):e[t].splice(n,1)}else e[t].splice(0,e[t].length),e[t].push(o)},o.children.forEach(n=>{if("option"===n.tag){let o="value"in n.props?n.props.value:n.children.join("").trim();n.props.selected=-1!==e[t].indexOf(o)}})):o.children.forEach(n=>{if("option"===n.tag){let o="value"in n.props?n.props.value:n.children.join("").trim();n.props.selected=o===e[t]}})):"textarea"===o.tag&&(n=n||"oninput",o.children=[e[t]]);let r=o.props[n];S(n,e=>{i(e),r&&r(e)},o,l)},"v-create":(e,t,n)=>{if(!n){let n=e(t);"function"==typeof n&&y(n)}},"v-update":(e,t,n)=>{if(n){let o=e(t,n);"function"==typeof o&&y(o)}},"v-cleanup":(e,t,n)=>{y(()=>e(t,n))}};function S(e,t,n,o){if("function"==typeof t)return e in V==!1&&(a.dom.addEventListener(e.slice(2),k),V[e]=!0),void(n.dom[`v-${e}`]=t);e in n.dom&&!1===n.isSVG?n.dom[e]!=t&&(n.dom[e]=t):o&&t===o.props[e]||(!1===t?n.dom.removeAttribute(e):n.dom.setAttribute(e,t))}function x(e,t){if(t)for(let n in t.props)n in e.props==!1&&n in V==!1&&n in m==!1&&(n in e.dom&&!1===e.isSVG?e.dom[n]=null:e.dom.removeAttribute(n));for(let n in e.props)if(n in m){if(n in N&&!1===N[n](e.props[n],e,t))break}else S(n,e.props[n],e,t)}function b(t,l){if(0===t.children.length)return void(t.dom.textContent="");let d=t.children,i=l?.children||[],r=i.length;if(r&&d[0]instanceof o&&"key"in d[0].props&&"key"in i[0].props){let e=d.length,o={};for(let e=0;e=r){l.dom=document.createTextNode(l.children[0]),t.dom.appendChild(l.dom);continue}let n=i[o];if(n.tag!==e){l.dom=document.createTextNode(l.children[0]),t.dom.replaceChild(l.dom,n.dom);continue}l.dom=n.dom,l.children[0]!=n.dom.textContent&&(n.dom.textContent=l.children[0]);continue}if(l.isSVG=t.isSVG||"svg"===l.tag,o>=r){l.dom=n(l.tag,l.isSVG),x(l),t.dom.appendChild(l.dom),b(l);continue}let p=i[o];l.tag===p.tag?(l.dom=p.dom,"v-keep"in l.props&&l.props["v-keep"]===p.props["v-keep"]?l.children=p.children:(x(l,p),b(l,p))):(l.dom=n(l.tag,l.isSVG),x(l),t.dom.replaceChild(l.dom,p.dom),b(l))}for(let e=d.length;enull,{},[]);let e=G();w(g);for(let e in V)a.dom.removeEventListener(e.slice(2).toLowerCase(),k),Reflect.deleteProperty(V,e);return s=null,a=null,c=!1,u.vnode=null,u.oldVnode=null,u.component=null,e}}var L=(e,t={},...n)=>new o(e,t||{},n);L.fragment=(e,...t)=>t;var T={Vnode:o,createDomElement:n,current:u,directive:function(e,t){let n=`v-${e}`;N[n]=t,m[n]=!0},directives:N,isComponent:l,isNodeJs:t,isVnode:d,isVnodeComponent:i,mount:function(e,d){let p="string"==typeof e?t?n(e,"svg"===e):document.querySelectorAll(e)[0]:e,c=i(d)?d:l(d)?new o(d,{},[]):new o(()=>d,{},[]);return s&&s.tag!==c.tag&&A(),s=c,a=r(p),G()},onCleanup:y,onMount:function(e){c||v.add(e)},onUnmount:function(e){c||g.add(e)},onUpdate:function(e){h.add(e)},patch:b,reservedProps:m,setAttribute:function(e,t,n,o){e in m||(n.props[e]=t,S(e,t,n,o))},trust:p,unmount:A,update:G,updateAttributes:x,updateVnode:function(e,n){if(w(f),b(e,n),n.tag=e.tag,n.props={...e.props},n.children=[...e.children],n.dom=e.dom,n.isSVG=e.isSVG,w(c?h:v),c=!0,u.vnode=null,u.oldVnode=null,u.component=null,t)return e.dom.innerHTML},v:L};"undefined"!=typeof module?module.exports=T:self.Valyrian=T})();//# sourceMappingURL=index.min.js.map \ No newline at end of file +(()=>{var e="#text",t=Boolean("undefined"!=typeof process&&process.versions&&process.versions.node);function n(e,t=!1){return t?document.createElementNS("http://www.w3.org/2000/svg",e):document.createElement(e)}var o=function(e,t,n){this.tag=e,this.props=t,this.children=n};function l(e){return e&&("function"==typeof e||"object"==typeof e&&"view"in e)}var d=e=>e instanceof o,i=e=>d(e)&&l(e.tag);function r(t){if(3===t.nodeType){let n=new o(e,{},[t.nodeValue]);return n.dom=t,n}let n=[];for(let e=0,o=t.childNodes.length;er(e))}var s=null,a=null,c=!1,u={vnode:null,oldVnode:null,component:null,event:null},m={key:!0,state:!0,"v-keep":!0,"v-if":!0,"v-unless":!0,"v-for":!0,"v-show":!0,"v-class":!0,"v-html":!0,"v-model":!0,"v-create":!0,"v-update":!0,"v-cleanup":!0},f=new Set,v=new Set,h=new Set,g=new Set;function y(e){f.add(e)}function w(e){for(let t of e)t();e.clear()}var V={};function k(e){u.event=e;let t=e.target,n=`v-on${e.type}`;for(;t;){if(t[n])return t[n](e,t),void(e.defaultPrevented||G());t=t.parentNode}u.event=null}var C=e=>(t,n,o)=>{if(e?t:!t){let e=document.createTextNode("");return o&&o.dom&&o.dom.parentNode&&o.dom.parentNode.replaceChild(e,o.dom),n.tag="#text",n.children=[],n.props={},n.dom=e,!1}},N={"v-if":C(!1),"v-unless":C(!0),"v-for":(e,t)=>{let n=[],o=t.children[0];for(let t=0,l=e.length;t{t.dom.style.display=e?"":"none"},"v-class":(e,t)=>{for(let n in e)t.dom.classList.toggle(n,e[n])},"v-html":(e,t)=>{t.children=[p(e)]},"v-model":([e,t,n],o,l)=>{let d,i=n=>e[t]=n.target.value;if("input"===o.tag)switch(n=n||"oninput",o.props.type){case"checkbox":Array.isArray(e[t])?(i=n=>{let o=n.target.value,l=e[t].indexOf(o);-1===l?e[t].push(o):e[t].splice(l,1)},d=-1!==e[t].indexOf(o.dom.value)):"value"in o.props?(i=()=>{e[t]===o.props.value?e[t]=null:e[t]=o.props.value},d=e[t]===o.props.value):(i=()=>e[t]=!e[t],d=e[t]),S("checked",d,o);break;case"radio":S("checked",e[t]===o.dom.value,o);break;default:S("value",e[t],o)}else"select"===o.tag?(n=n||"onclick",o.props.multiple?(i=n=>{let o=n.target.value;if(n.ctrlKey){let n=e[t].indexOf(o);-1===n?e[t].push(o):e[t].splice(n,1)}else e[t].splice(0,e[t].length),e[t].push(o)},o.children.forEach(n=>{if("option"===n.tag){let o="value"in n.props?n.props.value:n.children.join("").trim();n.props.selected=-1!==e[t].indexOf(o)}})):o.children.forEach(n=>{if("option"===n.tag){let o="value"in n.props?n.props.value:n.children.join("").trim();n.props.selected=o===e[t]}})):"textarea"===o.tag&&(n=n||"oninput",o.children=[e[t]]);let r=o.props[n];S(n,e=>{i(e),r&&r(e)},o,l)},"v-create":(e,t,n)=>{if(!n){let n=e(t);"function"==typeof n&&y(n)}},"v-update":(e,t,n)=>{if(n){let o=e(t,n);"function"==typeof o&&y(o)}},"v-cleanup":(e,t,n)=>{y(()=>e(t,n))}};function S(e,t,n,o){if("function"==typeof t)return e in V==!1&&(a.dom.addEventListener(e.slice(2),k),V[e]=!0),void(n.dom[`v-${e}`]=t);e in n.dom&&!1===n.isSVG?n.dom[e]!=t&&(n.dom[e]=t):o&&t===o.props[e]||(!1===t?n.dom.removeAttribute(e):n.dom.setAttribute(e,t))}function x(e,t){if(t)for(let n in t.props)n in e.props==!1&&n in V==!1&&n in m==!1&&(n in e.dom&&!1===e.isSVG?e.dom[n]=null:e.dom.removeAttribute(n));for(let n in e.props)if(n in m){if(n in N&&!1===N[n](e.props[n],e,t))break}else S(n,e.props[n],e,t)}function b(t,l){if(0===t.children.length)return void(t.dom.textContent="");let d=t.children,i=l?.children||[],r=i.length;if(r&&d[0]instanceof o&&"key"in d[0].props&&"key"in i[0].props){let e=d.length,o={};for(let e=0;e=r){l.dom=document.createTextNode(l.children[0]),t.dom.appendChild(l.dom);continue}let n=i[o];if(n.tag!==e){l.dom=document.createTextNode(l.children[0]),t.dom.replaceChild(l.dom,n.dom);continue}l.dom=n.dom,l.children[0]!=n.dom.textContent&&(n.dom.textContent=l.children[0]);continue}if(l.isSVG=t.isSVG||"svg"===l.tag,o>=r){l.dom=n(l.tag,l.isSVG),x(l),t.dom.appendChild(l.dom),b(l);continue}let p=i[o];l.tag===p.tag?(l.dom=p.dom,"v-keep"in l.props&&l.props["v-keep"]===p.props["v-keep"]?l.children=p.children:(x(l,p),b(l,p))):(l.dom=n(l.tag,l.isSVG),x(l),t.dom.replaceChild(l.dom,p.dom),b(l))}for(let e=d.length;enull,{},[]);let e=G();w(g);for(let e in V)a.dom.removeEventListener(e.slice(2).toLowerCase(),k),Reflect.deleteProperty(V,e);return s=null,a=null,c=!1,u.vnode=null,u.oldVnode=null,u.component=null,e}}var T=(e,t={},...n)=>new o(e,t||{},n);T.fragment=(e,...t)=>t;var L={Vnode:o,createDomElement:n,current:u,directive:function(e,t){let n=`v-${e}`;N[n]=t,m[n]=!0},directives:N,domToVnode:r,isComponent:l,isNodeJs:t,isVnode:d,isVnodeComponent:i,mount:function(e,d){let p="string"==typeof e?t?n(e,"svg"===e):document.querySelectorAll(e)[0]:e,c=i(d)?d:l(d)?new o(d,{},[]):new o(()=>d,{},[]);return s&&s.tag!==c.tag&&A(),s=c,a=r(p),G()},onCleanup:y,onMount:function(e){c||v.add(e)},onUnmount:function(e){c||g.add(e)},onUpdate:function(e){h.add(e)},patch:b,reservedProps:m,setAttribute:function(e,t,n,o){e in m||(n.props[e]=t,S(e,t,n,o))},trust:p,unmount:A,update:G,updateAttributes:x,updateVnode:function(e,n){if(w(f),b(e,n),n.tag=e.tag,n.props={...e.props},n.children=[...e.children],n.dom=e.dom,n.isSVG=e.isSVG,w(c?h:v),c=!0,u.vnode=null,u.oldVnode=null,u.component=null,t)return e.dom.innerHTML},v:T};"undefined"!=typeof module?module.exports=L:self.Valyrian=L})();//# sourceMappingURL=index.min.js.map \ No newline at end of file diff --git a/dist/index.min.js.map b/dist/index.min.js.map index 0a98dd8..6ae9e7c 100644 --- a/dist/index.min.js.map +++ b/dist/index.min.js.map @@ -1 +1 @@ -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ0ZXh0VGFnIiwiaXNOb2RlSnMiLCJCb29sZWFuIiwicHJvY2VzcyIsInZlcnNpb25zIiwibm9kZSIsImNyZWF0ZURvbUVsZW1lbnQiLCJ0YWciLCJpc1NWRyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudE5TIiwiY3JlYXRlRWxlbWVudCIsIlZub2RlIiwicHJvcHMiLCJjaGlsZHJlbiIsInRoaXMiLCJpc0NvbXBvbmVudCIsImNvbXBvbmVudCIsImlzVm5vZGUiLCJvYmplY3QiLCJpc1Zub2RlQ29tcG9uZW50IiwiZG9tVG9Wbm9kZSIsImRvbSIsImkiLCJsIiwiY2hpbGROb2RlcyIsImxlbmd0aCIsImNoaWxkRG9tIiwibm9kZVR5cGUiLCJwdXNoIiwidm5vZGUiLCJub2RlVmFsdWUiLCJhdHRyaWJ1dGVzIiwiYXR0ciIsIm5vZGVOYW1lIiwidGFnTmFtZSIsInRvTG93ZXJDYXNlIiwidHJ1c3QiLCJodG1sU3RyaW5nIiwiZGl2IiwiaW5uZXJIVE1MIiwidHJpbSIsIm1hcCIsImNhbGwiLCJpdGVtIiwibWFpbkNvbXBvbmVudCIsIm1haW5Wbm9kZSIsImlzTW91bnRlZCIsImN1cnJlbnQiLCJvbGRWbm9kZSIsImV2ZW50IiwicmVzZXJ2ZWRQcm9wcyIsImtleSIsInN0YXRlIiwib25DbGVhbnVwU2V0IiwiU2V0Iiwib25Nb3VudFNldCIsIm9uVXBkYXRlU2V0Iiwib25Vbm1vdW50U2V0Iiwib25DbGVhbnVwIiwiY2FsbGJhY2siLCJhZGQiLCJjYWxsU2V0Iiwic2V0IiwiY2xlYXIiLCJldmVudExpc3RlbmVyTmFtZXMiLCJldmVudExpc3RlbmVyIiwiZSIsInRhcmdldCIsIm5hbWUiLCJ0eXBlIiwiZGVmYXVsdFByZXZlbnRlZCIsInVwZGF0ZSIsInBhcmVudE5vZGUiLCJoaWRlRGlyZWN0aXZlIiwidGVzdCIsImJvb2wiLCJvbGRub2RlIiwibmV3ZG9tIiwiY3JlYXRlVGV4dE5vZGUiLCJyZXBsYWNlQ2hpbGQiLCJkaXJlY3RpdmVzIiwibmV3Q2hpbGRyZW4iLCJzdHlsZSIsImRpc3BsYXkiLCJjbGFzc2VzIiwiY2xhc3NMaXN0IiwidG9nZ2xlIiwiaHRtbCIsIm1vZGVsIiwicHJvcGVydHkiLCJ2YWx1ZSIsImhhbmRsZXIiLCJBcnJheSIsImlzQXJyYXkiLCJ2YWwiLCJpZHgiLCJpbmRleE9mIiwic3BsaWNlIiwic2hhcmVkU2V0QXR0cmlidXRlIiwibXVsdGlwbGUiLCJjdHJsS2V5IiwiZm9yRWFjaCIsImNoaWxkIiwiam9pbiIsInNlbGVjdGVkIiwicHJldkhhbmRsZXIiLCJjbGVhbnVwIiwibmV3Vm5vZGUiLCJhZGRFdmVudExpc3RlbmVyIiwic2xpY2UiLCJyZW1vdmVBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJ1cGRhdGVBdHRyaWJ1dGVzIiwicGF0Y2giLCJ0ZXh0Q29udGVudCIsIm5ld1RyZWUiLCJvbGRUcmVlIiwib2xkVHJlZUxlbmd0aCIsIm5ld1RyZWVMZW5ndGgiLCJvbGRLZXllZExpc3QiLCJuZXdLZXllZExpc3QiLCJuZXdDaGlsZCIsIm9sZENoaWxkIiwic2hvdWxkUGF0Y2giLCJhcHBlbmRDaGlsZCIsInJlbW92ZUNoaWxkIiwidmlldyIsImJpbmQiLCJvbGRNYWluVm5vZGUiLCJ1bm1vdW50IiwicmVzdWx0IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIlJlZmxlY3QiLCJkZWxldGVQcm9wZXJ0eSIsInYiLCJ0YWdPckNvbXBvbmVudCIsImZyYWdtZW50IiwiXyIsImRpcmVjdGl2ZSIsImRpcmVjdGl2ZU5hbWUiLCJjb250YWluZXIiLCJxdWVyeVNlbGVjdG9yQWxsIiwidm5vZGVDb21wb25lbnQiXSwic291cmNlcyI6WyIuLi9saWIvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cbi8qIGVzbGludC1kaXNhYmxlIGluZGVudCAqL1xuLyogZXNsaW50LWRpc2FibGUgc29uYXJqcy9jb2duaXRpdmUtY29tcGxleGl0eSAqL1xuLyogZXNsaW50LWRpc2FibGUgY29tcGxleGl0eSAqL1xuXG4vLyBUaGUgVm5vZGVQcm9wZXJ0aWVzIGludGVyZmFjZSByZXByZXNlbnRzIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIGEgdmlydHVhbCBub2RlLlxuZXhwb3J0IGludGVyZmFjZSBWbm9kZVByb3BlcnRpZXMge1xuICAvLyBBIHVuaXF1ZSBrZXkgZm9yIHRoZSB2aXJ0dWFsIG5vZGUsIHdoaWNoIGNhbiBiZSBhIHN0cmluZyBvciBhIG51bWJlci5cbiAgLy8gVGhpcyBpcyB1c2VmdWwgZm9yIG9wdGltaXppbmcgdXBkYXRlcyBpbiBhIGxpc3Qgb2Ygbm9kZXMuXG4gIGtleT86IHN0cmluZyB8IG51bWJlcjtcbiAgLy8gQSBzdGF0ZSBvYmplY3QgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHZpcnR1YWwgbm9kZS5cbiAgc3RhdGU/OiBhbnk7XG4gIC8vIEFuIGluZGV4IHNpZ25hdHVyZSB0aGF0IGFsbG93cyBmb3IgYW55IG90aGVyIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQuXG4gIFtrZXk6IHN0cmluZyB8IG51bWJlciB8IHN5bWJvbF06IGFueTtcbn1cblxuLy8gVGhlIERvbUVsZW1lbnQgaW50ZXJmYWNlIGV4dGVuZHMgdGhlIEVsZW1lbnQgaW50ZXJmYWNlIHdpdGggYW4gaW5kZXggc2lnbmF0dXJlLlxuLy8gVGhpcyBhbGxvd3MgZm9yIGFueSBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gRE9NIGVsZW1lbnRzLlxuZXhwb3J0IGludGVyZmFjZSBEb21FbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLy8gVGhlIFZub2RlSW50ZXJmYWNlIHJlcHJlc2VudHMgYSB2aXJ0dWFsIG5vZGUuIEl0IGhhcyBhIG51bWJlciBvZiBvcHRpb25hbCBmaWVsZHMsXG4vLyBpbmNsdWRpbmcgYSB0YWcsIHByb3BzLCBjaGlsZHJlbiwgYW5kIGEgRE9NIGVsZW1lbnQuXG5leHBvcnQgaW50ZXJmYWNlIFZub2RlSW50ZXJmYWNlIHtcbiAgLy8gVGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdmlydHVhbCBub2RlLiBJdCB0YWtlcyBhIHRhZywgcHJvcHMsIGFuZCBjaGlsZHJlbiBhcyBhcmd1bWVudHMuXG4gIC8vIFRoZSB0YWcgY2FuIGJlIGEgc3RyaW5nLCBhIGNvbXBvbmVudCwgb3IgYSBQT0pPIGNvbXBvbmVudC5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIG5ldyAodGFnOiBzdHJpbmcgfCBDb21wb25lbnQgfCBQT0pPQ29tcG9uZW50LCBwcm9wczogVm5vZGVQcm9wZXJ0aWVzLCBjaGlsZHJlbjogQ2hpbGRyZW4pOiBWbm9kZUludGVyZmFjZTtcbiAgLy8gVGhlIHRhZyBmb3IgdGhlIHZpcnR1YWwgbm9kZS4gSXQgY2FuIGJlIGEgc3RyaW5nLCBhIGNvbXBvbmVudCwgb3IgYSBQT0pPIGNvbXBvbmVudC5cbiAgdGFnOiBzdHJpbmcgfCBDb21wb25lbnQgfCBQT0pPQ29tcG9uZW50O1xuICAvLyBUaGUgcHJvcHMgZm9yIHRoZSB2aXJ0dWFsIG5vZGUuXG4gIHByb3BzOiBWbm9kZVByb3BlcnRpZXM7XG4gIC8vIFRoZSBjaGlsZHJlbiBmb3IgdGhlIHZpcnR1YWwgbm9kZS5cbiAgY2hpbGRyZW46IENoaWxkcmVuO1xuICAvLyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB2aXJ0dWFsIG5vZGUgaXMgYW4gU1ZHIGVsZW1lbnQuXG4gIGlzU1ZHPzogYm9vbGVhbjtcbiAgLy8gVGhlIERPTSBlbGVtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHZpcnR1YWwgbm9kZS5cbiAgZG9tPzogRG9tRWxlbWVudDtcbiAgLy8gQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgdmlydHVhbCBub2RlIGhhcyBiZWVuIHByb2Nlc3NlZCBpbiB0aGUga2V5ZWQgZGlmZmluZyBhbGdvcml0aG0uXG4gIHByb2Nlc3NlZD86IGJvb2xlYW47XG4gIC8vIEFuIGluZGV4IHNpZ25hdHVyZSB0aGF0IGFsbG93cyBmb3IgYW55IGFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byB0aGUgdmlydHVhbCBub2RlLlxuICBba2V5OiBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2xdOiBhbnk7XG59XG5cbi8vIFRoZSBWbm9kZVdpdGhEb20gaW50ZXJmYWNlIHJlcHJlc2VudHMgYSB2aXJ0dWFsIG5vZGUgdGhhdCBoYXMgYSBET00gZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggaXQuXG5leHBvcnQgaW50ZXJmYWNlIFZub2RlV2l0aERvbSBleHRlbmRzIFZub2RlSW50ZXJmYWNlIHtcbiAgZG9tOiBEb21FbGVtZW50O1xufVxuXG4vLyBUaGUgQ29tcG9uZW50IGludGVyZmFjZSByZXByZXNlbnRzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgdmlydHVhbCBub2RlIG9yIGEgbGlzdCBvZiB2aXJ0dWFsIG5vZGVzLlxuLy8gSXQgY2FuIGFsc28gaGF2ZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudCB7XG4gIC8vIFRoZSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSB2aXJ0dWFsIG5vZGUgb3IgYSBsaXN0IG9mIHZpcnR1YWwgbm9kZXMuXG4gIC8vIEl0IGNhbiB0YWtlIHByb3BzIGFuZCBjaGlsZHJlbiBhcyBhcmd1bWVudHMuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAocHJvcHM/OiBWbm9kZVByb3BlcnRpZXMgfCBudWxsLCAuLi5jaGlsZHJlbjogYW55W10pOiBWbm9kZUludGVyZmFjZSB8IENoaWxkcmVuIHwgYW55O1xuICAvLyBBbiBpbmRleCBzaWduYXR1cmUgdGhhdCBhbGxvd3MgZm9yIGFueSBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGNvbXBvbmVudC5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vLyBUaGUgUE9KT0NvbXBvbmVudCBpbnRlcmZhY2UgcmVwcmVzZW50cyBhIFwicGxhaW4gb2xkIEphdmFTY3JpcHQgb2JqZWN0XCIgKFBPSk8pIGNvbXBvbmVudC5cbi8vIEl0IGhhcyBhIHZpZXcgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgdmlydHVhbCBub2RlIG9yIGEgbGlzdCBvZiB2aXJ0dWFsIG5vZGVzLFxuLy8gYXMgd2VsbCBhcyBvcHRpb25hbCBwcm9wcyBhbmQgY2hpbGRyZW4uXG4vLyBJdCBjYW4gYmUgdXNlZCBhbHNvIHRvIGlkZW50aWZ5IGNsYXNzIGluc3RhbmNlIGNvbXBvbmVudHMuXG5leHBvcnQgaW50ZXJmYWNlIFBPSk9Db21wb25lbnQge1xuICAvLyBUaGUgdmlldyBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSB2aXJ0dWFsIG5vZGUgb3IgYSBsaXN0IG9mIHZpcnR1YWwgbm9kZXMuXG4gIHZpZXc6IENvbXBvbmVudDtcbiAgLy8gVGhlIHByb3BzIGZvciB0aGUgY29tcG9uZW50LlxuICBwcm9wcz86IFZub2RlUHJvcGVydGllcyB8IG51bGw7XG4gIC8vIFRoZSBjaGlsZHJlbiBmb3IgdGhlIGNvbXBvbmVudC5cbiAgY2hpbGRyZW4/OiBhbnlbXTtcbiAgLy8gQW4gaW5kZXggc2lnbmF0dXJlIHRoYXQgYWxsb3dzIGZvciBhbnkgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIHRoZSBQT0pPIGNvbXBvbmVudC5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vLyBUaGUgVm5vZGVDb21wb25lbnRJbnRlcmZhY2UgcmVwcmVzZW50cyBhIHZpcnR1YWwgbm9kZSB0aGF0IGhhcyBhIGNvbXBvbmVudCBhcyBpdHMgdGFnLlxuLy8gSXQgaGFzIHByb3BzIGFuZCBjaGlsZHJlbiwganVzdCBsaWtlIGEgcmVndWxhciB2aXJ0dWFsIG5vZGUuXG5leHBvcnQgaW50ZXJmYWNlIFZub2RlQ29tcG9uZW50SW50ZXJmYWNlIGV4dGVuZHMgVm5vZGVJbnRlcmZhY2Uge1xuICB0YWc6IENvbXBvbmVudCB8IFBPSk9Db21wb25lbnQ7XG4gIHByb3BzOiBWbm9kZVByb3BlcnRpZXM7XG4gIGNoaWxkcmVuOiBDaGlsZHJlbjtcbn1cblxuLy8gVGhlIENoaWxkcmVuIGludGVyZmFjZSByZXByZXNlbnRzIGEgbGlzdCBvZiB2aXJ0dWFsIG5vZGVzIG9yIG90aGVyIHZhbHVlcy5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hpbGRyZW4gZXh0ZW5kcyBBcnJheTxWbm9kZUludGVyZmFjZSB8IFZub2RlQ29tcG9uZW50SW50ZXJmYWNlIHwgYW55PiB7fVxuXG4vLyBUaGUgRGlyZWN0aXZlIGludGVyZmFjZSByZXByZXNlbnRzIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIHZpcnR1YWwgbm9kZS5cbi8vIEl0IHJlY2VpdmVzIHRoZSB2YWx1ZSwgdmlydHVhbCBub2RlLCBhbmQgb2xkIHZpcnR1YWwgbm9kZSBhcyBhcmd1bWVudHMsIGFuZCBjYW4gcmV0dXJuIGEgYm9vbGVhbiB2YWx1ZS5cbi8vIElmIG9ubHkgdGhlIHZpcnR1YWwgbm9kZSBpcyBwYXNzZWQsIGl0IG1lYW5zIGl0cyB0aGUgb24gY3JlYXRlIHBoYXNlIGZvciB0aGUgdi1ub2RlLlxuLy8gSWYgdGhlIG9sZCB2aXJ0dWFsIG5vZGUgaXMgYWxzbyBwYXNzZWQsIGl0IG1lYW5zIGl0cyB0aGUgb24gdXBkYXRlIHBoYXNlIGZvciB0aGUgdi1ub2RlLlxuZXhwb3J0IGludGVyZmFjZSBEaXJlY3RpdmUge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgKHZhbHVlOiBhbnksIHZub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tKTogdm9pZCB8IGJvb2xlYW47XG59XG5cbi8vIFRoZSBEaXJlY3RpdmVzIGludGVyZmFjZSBpcyBhIG1hcHBpbmcgb2YgZGlyZWN0aXZlIG5hbWVzIHRvIERpcmVjdGl2ZSBmdW5jdGlvbnMuXG5leHBvcnQgaW50ZXJmYWNlIERpcmVjdGl2ZXMge1xuICBba2V5OiBzdHJpbmddOiBEaXJlY3RpdmU7XG59XG5cbi8vIFRoZSBSZXNlcnZlZFByb3BzIGludGVyZmFjZSBpcyBhIG1hcHBpbmcgb2YgcmVzZXJ2ZWQgcHJvcCBuYW1lcyB0byB0aGUgdmFsdWUgYHRydWVgLlxuLy8gVGhlc2UgcHJvcCBuYW1lcyBjYW5ub3QgYmUgdXNlZCBhcyBjdXN0b20gcHJvcCBuYW1lcy5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzZXJ2ZWRQcm9wcyB7XG4gIFtrZXk6IHN0cmluZ106IHRydWU7XG59XG5cbi8vIFRoZSBDdXJyZW50IGludGVyZmFjZSByZXByZXNlbnRzIHRoZSBjdXJyZW50IGNvbXBvbmVudCBhbmQgdmlydHVhbCBub2RlIHRoYXQgYXJlIGJlaW5nIHByb2Nlc3NlZC5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VycmVudCB7XG4gIC8vIFRoZSBjdXJyZW50IGNvbXBvbmVudC4gSXQgY2FuIGJlIGEgY29tcG9uZW50LCBhIFBPSk8gY29tcG9uZW50LCBvciBudWxsLlxuICBjb21wb25lbnQ6IENvbXBvbmVudCB8IFBPSk9Db21wb25lbnQgfCBudWxsO1xuICAvLyBUaGUgY3VycmVudCB2aXJ0dWFsIG5vZGUuIEl0IG11c3QgaGF2ZSBhIERPTSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCBpdC5cbiAgdm5vZGU6IFZub2RlV2l0aERvbSB8IG51bGw7XG4gIC8vIFRoZSBvbGQgdmlydHVhbCBub2RlLiBJdCBtdXN0IGhhdmUgYSBET00gZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggaXQuXG4gIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tIHwgbnVsbDtcbiAgLy8gVGhlIGN1cnJlbnQgZXZlbnQuIEl0IGNhbiBiZSBhbiBldmVudCBvciBudWxsLlxuICBldmVudDogRXZlbnQgfCBudWxsO1xufVxuXG4vLyBUaGUgViBmdW5jdGlvbiBpcyB0aGUgbWFpbiBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgdmlydHVhbCBub2Rlcy5cbi8vIEl0IHRha2VzIGEgdGFnIG9yIGNvbXBvbmVudCwgcHJvcHMsIGFuZCBjaGlsZHJlbiBhcyBhcmd1bWVudHMsIGFuZCByZXR1cm5zIGEgdmlydHVhbCBub2RlLlxuZXhwb3J0IGludGVyZmFjZSBWIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzLCBuby11c2UtYmVmb3JlLWRlZmluZVxuICAodGFnT3JDb21wb25lbnQ6IHN0cmluZyB8IENvbXBvbmVudCB8IFBPSk9Db21wb25lbnQsIHByb3BzOiBWbm9kZVByb3BlcnRpZXMgfCBudWxsLCAuLi5jaGlsZHJlbjogQ2hpbGRyZW4pOlxuICAgIHwgVm5vZGVJbnRlcmZhY2VcbiAgICB8IFZub2RlQ29tcG9uZW50SW50ZXJmYWNlO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMsIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gIGZyYWdtZW50KF86IGFueSwgLi4uY2hpbGRyZW46IENoaWxkcmVuKTogQ2hpbGRyZW47XG59XG4vLyAndGV4dFRhZycgaXMgYSBjb25zdGFudCBzdHJpbmcgdGhhdCBpcyB1c2VkIHRvIHJlcHJlc2VudCB0ZXh0IG5vZGVzIGluIHRoZSB2aXJ0dWFsIERPTS5cbmNvbnN0IHRleHRUYWcgPSBcIiN0ZXh0XCI7XG5cbi8vICdpc05vZGVKcycgaXMgYSBib29sZWFuIHRoYXQgaXMgdHJ1ZSBpZiB0aGUgY29kZSBpcyBydW5uaW5nIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLlxuLy8gSXQgaXMgZGV0ZXJtaW5lZCBieSBjaGVja2luZyBpZiB0aGUgJ3Byb2Nlc3MnIGdsb2JhbCBvYmplY3QgaXMgZGVmaW5lZCBhbmQgaGFzIGEgJ3ZlcnNpb25zJyBwcm9wZXJ0eS5cbmV4cG9ydCBsZXQgaXNOb2RlSnMgPSBCb29sZWFuKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MudmVyc2lvbnMgJiYgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlKTtcblxuLy8gJ2NyZWF0ZURvbUVsZW1lbnQnIGlzIGEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGEgbmV3IERPTSBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCB0YWcgbmFtZS5cbi8vIElmICdpc1NWRycgaXMgdHJ1ZSwgaXQgY3JlYXRlcyBhbiBTVkcgZWxlbWVudCBpbnN0ZWFkIG9mIGEgcmVndWxhciBET00gZWxlbWVudC5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEb21FbGVtZW50KHRhZzogc3RyaW5nLCBpc1NWRzogYm9vbGVhbiA9IGZhbHNlKTogRG9tRWxlbWVudCB7XG4gIHJldHVybiBpc1NWRyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIHRhZykgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XG59XG5cbi8vICdWbm9kZScgaXMgYSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgYSB2aXJ0dWFsIERPTSBub2RlLlxuLy8gSXQgaGFzIHRocmVlIHByb3BlcnRpZXM6ICd0YWcnLCAncHJvcHMnLCBhbmQgJ2NoaWxkcmVuJy5cbi8vICdWbm9kZScgaXMgZXhwb3J0ZWQgYXMgYW4gb2JqZWN0IHdpdGggYSB0eXBlIG9mICdWbm9kZUludGVyZmFjZScuXG4vLyBUaGUgJ2FzIHVua25vd24gYXMgVm5vZGVJbnRlcmZhY2UnIGlzIHVzZWQgdG8gdGVsbCBUeXBlU2NyaXB0IHRoYXQgdGhlICdWbm9kZScgZnVuY3Rpb24gaGFzIHRoZSBzYW1lIHR5cGUgYXMgJ1Zub2RlSW50ZXJmYWNlJy5cbmV4cG9ydCBjb25zdCBWbm9kZSA9IGZ1bmN0aW9uIFZub2RlKHRoaXM6IFZub2RlSW50ZXJmYWNlLCB0YWc6IHN0cmluZywgcHJvcHM6IFZub2RlUHJvcGVydGllcywgY2hpbGRyZW46IENoaWxkcmVuKSB7XG4gIC8vICd0aGlzJyByZWZlcnMgdG8gdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgJ1Zub2RlJy5cbiAgdGhpcy50YWcgPSB0YWc7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xufSBhcyB1bmtub3duIGFzIFZub2RlSW50ZXJmYWNlO1xuXG4vLyAnaXNDb21wb25lbnQnIGlzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuICdjb21wb25lbnQnIGlzIGEgdmFsaWQgY29tcG9uZW50IGFuZCBmYWxzZSBvdGhlcndpc2UuXG4vLyBBIGNvbXBvbmVudCBpcyBlaXRoZXIgYSBmdW5jdGlvbiBvciBhbiBvYmplY3Qgd2l0aCBhICd2aWV3JyBmdW5jdGlvbi5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbXBvbmVudChjb21wb25lbnQpOiBjb21wb25lbnQgaXMgQ29tcG9uZW50IHtcbiAgcmV0dXJuIGNvbXBvbmVudCAmJiAodHlwZW9mIGNvbXBvbmVudCA9PT0gXCJmdW5jdGlvblwiIHx8ICh0eXBlb2YgY29tcG9uZW50ID09PSBcIm9iamVjdFwiICYmIFwidmlld1wiIGluIGNvbXBvbmVudCkpO1xufVxuXG4vLyAnaXNWbm9kZScgaXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gJ29iamVjdCcgaXMgYSAnVm5vZGUnIGluc3RhbmNlIGFuZCBmYWxzZSBvdGhlcndpc2UuXG5leHBvcnQgY29uc3QgaXNWbm9kZSA9IChvYmplY3Q/OiB1bmtub3duIHwgVm5vZGVJbnRlcmZhY2UpOiBvYmplY3QgaXMgVm5vZGVJbnRlcmZhY2UgPT4ge1xuICAvLyBVc2UgdGhlICdpbnN0YW5jZW9mJyBvcGVyYXRvciB0byBjaGVjayBpZiAnb2JqZWN0JyBpcyBhbiBpbnN0YW5jZSBvZiAnVm5vZGUnLlxuICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgVm5vZGU7XG59O1xuXG4vLyAnaXNWbm9kZUNvbXBvbmVudCcgaXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gJ29iamVjdCcgaXMgYSAnVm5vZGUnIGluc3RhbmNlIHdpdGggYSAndGFnJyBwcm9wZXJ0eSB0aGF0IGlzIGEgdmFsaWQgY29tcG9uZW50LlxuLy8gSXQgcmV0dXJucyBmYWxzZSBvdGhlcndpc2UuXG5leHBvcnQgY29uc3QgaXNWbm9kZUNvbXBvbmVudCA9IChvYmplY3Q/OiB1bmtub3duIHwgVm5vZGVDb21wb25lbnRJbnRlcmZhY2UpOiBvYmplY3QgaXMgVm5vZGVDb21wb25lbnRJbnRlcmZhY2UgPT4ge1xuICAvLyBDaGVjayBpZiAnb2JqZWN0JyBpcyBhICdWbm9kZScgaW5zdGFuY2UgYW5kIGl0cyAndGFnJyBwcm9wZXJ0eSBpcyBhIHZhbGlkIGNvbXBvbmVudC5cbiAgcmV0dXJuIGlzVm5vZGUob2JqZWN0KSAmJiBpc0NvbXBvbmVudChvYmplY3QudGFnKTtcbn07XG5cbi8vICdkb21Ub1Zub2RlJyBpcyBhIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgYSBET00gbm9kZSB0byBhICdWbm9kZScgaW5zdGFuY2UuXG5mdW5jdGlvbiBkb21Ub1Zub2RlKGRvbTogYW55KTogVm5vZGVXaXRoRG9tIHtcbiAgbGV0IGNoaWxkcmVuOiBWbm9kZVdpdGhEb21bXSA9IFtdO1xuICAvLyBJdGVyYXRlIHRocm91Z2ggYWxsIGNoaWxkIG5vZGVzIG9mICdkb20nLlxuICBmb3IgKGxldCBpID0gMCwgbCA9IGRvbS5jaGlsZE5vZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGxldCBjaGlsZERvbSA9IGRvbS5jaGlsZE5vZGVzW2ldO1xuICAgIC8vIElmIHRoZSBjaGlsZCBub2RlIGlzIGEgdGV4dCBub2RlLCBjcmVhdGUgYSAnVm5vZGUnIGluc3RhbmNlIHdpdGggdGhlICd0ZXh0VGFnJyBjb25zdGFudCBhcyB0aGUgJ3RhZycgcHJvcGVydHkuXG4gICAgLy8gU2V0IHRoZSAnZG9tJyBwcm9wZXJ0eSBvZiB0aGUgJ1Zub2RlJyBpbnN0YW5jZSB0byB0aGUgY2hpbGQgRE9NIG5vZGUuXG4gICAgLy8gUHVzaCB0aGUgJ1Zub2RlJyBpbnN0YW5jZSB0byB0aGUgJ2NoaWxkcmVuJyBhcnJheS5cbiAgICBpZiAoY2hpbGREb20ubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgIGxldCB2bm9kZSA9IG5ldyBWbm9kZSh0ZXh0VGFnLCB7fSwgW2NoaWxkRG9tLm5vZGVWYWx1ZV0pO1xuICAgICAgdm5vZGUuZG9tID0gY2hpbGREb207XG4gICAgICBjaGlsZHJlbi5wdXNoKHZub2RlIGFzIFZub2RlV2l0aERvbSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgY2hpbGQgbm9kZSBpcyBhbiBlbGVtZW50IG5vZGUsIHJlY3Vyc2l2ZWx5IGNhbGwgJ2RvbVRvVm5vZGUnIHRvIGNvbnZlcnQgaXQgdG8gYSAnVm5vZGUnIGluc3RhbmNlLlxuICAgIC8vIFB1c2ggdGhlICdWbm9kZScgaW5zdGFuY2UgdG8gdGhlICdjaGlsZHJlbicgYXJyYXkuXG4gICAgaWYgKGNoaWxkRG9tLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICBjaGlsZHJlbi5wdXNoKGRvbVRvVm5vZGUoY2hpbGREb20pKTtcbiAgICB9XG4gIH1cblxuICBsZXQgcHJvcHM6IFZub2RlUHJvcGVydGllcyA9IHt9O1xuICAvLyBJdGVyYXRlIHRocm91Z2ggYWxsIGF0dHJpYnV0ZXMgb2YgJ2RvbScuXG4gIGZvciAobGV0IGkgPSAwLCBsID0gZG9tLmF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgbGV0IGF0dHIgPSBkb20uYXR0cmlidXRlc1tpXTtcbiAgICAvLyBBZGQgdGhlIGF0dHJpYnV0ZSB0byB0aGUgJ3Byb3BzJyBvYmplY3QsIHVzaW5nIHRoZSBhdHRyaWJ1dGUncyBuYW1lIGFzIHRoZSBrZXkgYW5kIGl0cyB2YWx1ZSBhcyB0aGUgdmFsdWUuXG4gICAgcHJvcHNbYXR0ci5ub2RlTmFtZV0gPSBhdHRyLm5vZGVWYWx1ZTtcbiAgfVxuXG4gIC8vIENyZWF0ZSBhIG5ldyAnVm5vZGUnIGluc3RhbmNlIHdpdGggdGhlICd0YWcnIHByb3BlcnR5IHNldCB0byB0aGUgbG93ZXJjYXNlIHZlcnNpb24gb2YgdGhlIERPTSBub2RlJ3MgdGFnIG5hbWUuXG4gIC8vIFNldCB0aGUgJ3Byb3BzJyBhbmQgJ2NoaWxkcmVuJyBwcm9wZXJ0aWVzIHRvIHRoZSAncHJvcHMnIGFuZCAnY2hpbGRyZW4nIGFycmF5cyByZXNwZWN0aXZlbHkuXG4gIC8vIFNldCB0aGUgJ2RvbScgcHJvcGVydHkgb2YgdGhlICdWbm9kZScgaW5zdGFuY2UgdG8gdGhlIERPTSBub2RlLlxuICBsZXQgdm5vZGUgPSBuZXcgVm5vZGUoZG9tLnRhZ05hbWUudG9Mb3dlckNhc2UoKSwgcHJvcHMsIGNoaWxkcmVuKTtcbiAgdm5vZGUuZG9tID0gZG9tO1xuICByZXR1cm4gdm5vZGUgYXMgVm5vZGVXaXRoRG9tO1xufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIHRha2VzIGluIGFuIEhUTUwgc3RyaW5nIGFuZCBjcmVhdGVzIGEgdmlydHVhbCBub2RlIHJlcHJlc2VudGF0aW9uIG9mIGl0XG4vLyB1c2luZyB0aGUgYGRvbVRvVm5vZGVgIGZ1bmN0aW9uLiBJdCBkb2VzIHRoaXMgYnkgY3JlYXRpbmcgYSBuZXcgYGRpdmAgZWxlbWVudCwgc2V0dGluZ1xuLy8gaXRzIGBpbm5lckhUTUxgIHRvIHRoZSBwcm92aWRlZCBIVE1MIHN0cmluZywgYW5kIHRoZW4gdXNpbmcgYG1hcGAgdG8gaXRlcmF0ZSBvdmVyIHRoZVxuLy8gYGNoaWxkTm9kZXNgIG9mIHRoZSBgZGl2YCBlbGVtZW50LCBwYXNzaW5nIGVhY2ggb25lIHRvIGBkb21Ub1Zub2RlYCB0byBjcmVhdGUgYSB2aXJ0dWFsXG4vLyBub2RlIHJlcHJlc2VudGF0aW9uIG9mIGl0LiBUaGUgcmVzdWx0aW5nIGFycmF5IG9mIHZpcnR1YWwgbm9kZXMgaXMgdGhlbiByZXR1cm5lZC5cbmV4cG9ydCBmdW5jdGlvbiB0cnVzdChodG1sU3RyaW5nOiBzdHJpbmcpIHtcbiAgbGV0IGRpdiA9IGNyZWF0ZURvbUVsZW1lbnQoXCJkaXZcIik7XG4gIGRpdi5pbm5lckhUTUwgPSBodG1sU3RyaW5nLnRyaW0oKTtcblxuICByZXR1cm4gW10ubWFwLmNhbGwoZGl2LmNoaWxkTm9kZXMsIChpdGVtKSA9PiBkb21Ub1Zub2RlKGl0ZW0pKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qIE1haW4gQ29tcG9uZW50IGltcGxlbWVudGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vLyBUaGVzZSB2YXJpYWJsZXMgYXJlIHVzZWQgdG8gc3RvcmUgdGhlIG1haW4gY29tcG9uZW50LCB0aGUgbWFpbiB2aXJ0dWFsIG5vZGUsIGFuZCB3aGV0aGVyXG4vLyB0aGUgbWFpbiBjb21wb25lbnQgaXMgY3VycmVudGx5IG1vdW50ZWQuXG5sZXQgbWFpbkNvbXBvbmVudDogVm5vZGVDb21wb25lbnRJbnRlcmZhY2UgfCBudWxsID0gbnVsbDtcbmxldCBtYWluVm5vZGU6IFZub2RlV2l0aERvbSB8IG51bGwgPSBudWxsO1xubGV0IGlzTW91bnRlZCA9IGZhbHNlO1xuXG4vLyBUaGlzIG9iamVjdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBjdXJyZW50IHZpcnR1YWwgbm9kZSBhbmQgY29tcG9uZW50IGJlaW5nIHJlbmRlcmVkLlxuZXhwb3J0IGNvbnN0IGN1cnJlbnQ6IEN1cnJlbnQgPSB7XG4gIHZub2RlOiBudWxsLFxuICBvbGRWbm9kZTogbnVsbCxcbiAgY29tcG9uZW50OiBudWxsLFxuICBldmVudDogbnVsbFxufTtcblxuLyogUmVzZXJ2ZWQgcHJvcHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbi8vIFRoaXMgb2JqZWN0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIG5hbWVzIG9mIHJlc2VydmVkIHByb3BzLCB3aGljaCBhcmUgcHJvcHMgdGhhdCBhcmUgcmVzZXJ2ZWRcbi8vIGZvciBzcGVjaWFsIHB1cnBvc2VzIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYXMgcmVndWxhciBjb21wb25lbnQgcHJvcHMuXG5leHBvcnQgY29uc3QgcmVzZXJ2ZWRQcm9wczogUmVjb3JkPHN0cmluZywgdHJ1ZT4gPSB7XG4gIGtleTogdHJ1ZSxcbiAgc3RhdGU6IHRydWUsXG4gIFwidi1rZWVwXCI6IHRydWUsXG5cbiAgLy8gQnVpbHQgaW4gZGlyZWN0aXZlc1xuICBcInYtaWZcIjogdHJ1ZSxcbiAgXCJ2LXVubGVzc1wiOiB0cnVlLFxuICBcInYtZm9yXCI6IHRydWUsXG4gIFwidi1zaG93XCI6IHRydWUsXG4gIFwidi1jbGFzc1wiOiB0cnVlLFxuICBcInYtaHRtbFwiOiB0cnVlLFxuICBcInYtbW9kZWxcIjogdHJ1ZSxcbiAgXCJ2LWNyZWF0ZVwiOiB0cnVlLFxuICBcInYtdXBkYXRlXCI6IHRydWUsXG4gIFwidi1jbGVhbnVwXCI6IHRydWVcbn07XG5cbi8qIE1vdW50aW5nLCBVcGRhdGluZywgQ2xlYW51cCBhbmQgVW5tb3VudGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4vLyBUaGVzZSBzZXRzIGFyZSB1c2VkIHRvIHN0b3JlIGNhbGxiYWNrcyBmb3IgdmFyaW91cyBsaWZlY3ljbGUgZXZlbnRzOiBtb3VudGluZywgdXBkYXRpbmcsXG4vLyBjbGVhbmluZyB1cCwgYW5kIHVubW91bnRpbmcuXG5jb25zdCBvbkNsZWFudXBTZXQ6IFNldDxGdW5jdGlvbj4gPSBuZXcgU2V0KCk7XG5jb25zdCBvbk1vdW50U2V0OiBTZXQ8RnVuY3Rpb24+ID0gbmV3IFNldCgpO1xuY29uc3Qgb25VcGRhdGVTZXQ6IFNldDxGdW5jdGlvbj4gPSBuZXcgU2V0KCk7XG5jb25zdCBvblVubW91bnRTZXQ6IFNldDxGdW5jdGlvbj4gPSBuZXcgU2V0KCk7XG5cbi8vIFRoZXNlIGZ1bmN0aW9ucyBhbGxvdyB1c2VycyB0byByZWdpc3RlciBjYWxsYmFja3MgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGxpZmVjeWNsZSBldmVudHMuXG5leHBvcnQgZnVuY3Rpb24gb25Nb3VudChjYWxsYmFjaykge1xuICBpZiAoIWlzTW91bnRlZCkge1xuICAgIG9uTW91bnRTZXQuYWRkKGNhbGxiYWNrKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gb25VcGRhdGUoY2FsbGJhY2spIHtcbiAgb25VcGRhdGVTZXQuYWRkKGNhbGxiYWNrKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9uQ2xlYW51cChjYWxsYmFjaykge1xuICBvbkNsZWFudXBTZXQuYWRkKGNhbGxiYWNrKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9uVW5tb3VudChjYWxsYmFjaykge1xuICBpZiAoIWlzTW91bnRlZCkge1xuICAgIG9uVW5tb3VudFNldC5hZGQoY2FsbGJhY2spO1xuICB9XG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjYWxsIGFsbCB0aGUgY2FsbGJhY2tzIGluIGEgZ2l2ZW4gc2V0LlxuZnVuY3Rpb24gY2FsbFNldChzZXQpIHtcbiAgZm9yIChsZXQgY2FsbGJhY2sgb2Ygc2V0KSB7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxuXG4gIHNldC5jbGVhcigpO1xufVxuXG4vKiBFdmVudCBsaXN0ZW5lciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vLyBUaGlzIG9iamVjdCBzdG9yZXMgdGhlIG5hbWVzIG9mIGV2ZW50IGxpc3RlbmVycyB0aGF0IGhhdmUgYmVlbiBhZGRlZFxuY29uc3QgZXZlbnRMaXN0ZW5lck5hbWVzOiBSZWNvcmQ8c3RyaW5nLCB0cnVlPiA9IHt9O1xuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGFuIGV2ZW50IG9jY3Vyc1xuZnVuY3Rpb24gZXZlbnRMaXN0ZW5lcihlOiBFdmVudCkge1xuICAvLyBTZXQgdGhlIGN1cnJlbnQgZXZlbnQgdG8gdGhlIGV2ZW50IHRoYXQgb2NjdXJyZWQgc28gdGhhdCBpdCBjYW4gYmUgcHJldmVudGVkIGlmIG5lY2Vzc2FyeVxuICBjdXJyZW50LmV2ZW50ID0gZTtcblxuICAvLyBDb252ZXJ0IHRoZSB0YXJnZXQgb2YgdGhlIGV2ZW50IHRvIGEgRE9NIGVsZW1lbnRcbiAgbGV0IGRvbSA9IGUudGFyZ2V0IGFzIERvbUVsZW1lbnQ7XG5cbiAgLy8gQ3JlYXRlIHRoZSBuYW1lIG9mIHRoZSBldmVudCBsaXN0ZW5lciBieSBhZGRpbmcgXCJ2LW9uXCIgdG8gdGhlIGV2ZW50IHR5cGVcbiAgbGV0IG5hbWUgPSBgdi1vbiR7ZS50eXBlfWA7XG5cbiAgLy8gS2VlcCBnb2luZyB1cCB0aGUgRE9NIHRyZWUgdW50aWwgd2UgZmluZCBhbiBlbGVtZW50IHdpdGggYW4gZXZlbnQgbGlzdGVuZXJcbiAgLy8gbWF0Y2hpbmcgdGhlIGV2ZW50IHR5cGVcbiAgd2hpbGUgKGRvbSkge1xuICAgIGlmIChkb21bbmFtZV0pIHtcbiAgICAgIC8vIENhbGwgdGhlIGV2ZW50IGxpc3RlbmVyIGZ1bmN0aW9uXG4gICAgICBkb21bbmFtZV0oZSwgZG9tKTtcblxuICAgICAgLy8gSWYgdGhlIGRlZmF1bHQgYWN0aW9uIG9mIHRoZSBldmVudCBoYXNuJ3QgYmVlbiBwcmV2ZW50ZWQsIHVwZGF0ZSB0aGUgRE9NXG4gICAgICBpZiAoIWUuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICB1cGRhdGUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZG9tID0gZG9tLnBhcmVudE5vZGUgYXMgRG9tRWxlbWVudDtcbiAgfVxuXG4gIGN1cnJlbnQuZXZlbnQgPSBudWxsO1xufVxuXG4vKiBEaXJlY3RpdmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vLyBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBkaXJlY3RpdmUgdGhhdCBoaWRlcyBhbiBlbGVtZW50IGJhc2VkIG9uIGEgY29uZGl0aW9uXG5sZXQgaGlkZURpcmVjdGl2ZSA9ICh0ZXN0OiBib29sZWFuKSA9PiAoYm9vbDogYm9vbGVhbiwgdm5vZGU6IFZub2RlSW50ZXJmYWNlLCBvbGRub2RlPzogVm5vZGVJbnRlcmZhY2UpID0+IHtcbiAgLy8gSWYgdGVzdCBpcyB0cnVlLCB1c2UgdGhlIHZhbHVlIG9mIGJvb2wuIE90aGVyd2lzZSwgdXNlIHRoZSBvcHBvc2l0ZSBvZiBib29sLlxuICBsZXQgdmFsdWUgPSB0ZXN0ID8gYm9vbCA6ICFib29sO1xuXG4gIC8vIElmIHRoZSB2YWx1ZSBpcyB0cnVlLCBoaWRlIHRoZSBlbGVtZW50IGJ5IHJlcGxhY2luZyBpdCB3aXRoIGEgdGV4dCBub2RlXG4gIGlmICh2YWx1ZSkge1xuICAgIGxldCBuZXdkb20gPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKTtcbiAgICBpZiAob2xkbm9kZSAmJiBvbGRub2RlLmRvbSAmJiBvbGRub2RlLmRvbS5wYXJlbnROb2RlKSB7XG4gICAgICBvbGRub2RlLmRvbS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuZXdkb20sIG9sZG5vZGUuZG9tKTtcbiAgICB9XG4gICAgdm5vZGUudGFnID0gXCIjdGV4dFwiO1xuICAgIHZub2RlLmNoaWxkcmVuID0gW107XG4gICAgdm5vZGUucHJvcHMgPSB7fTtcbiAgICB2bm9kZS5kb20gPSBuZXdkb20gYXMgdW5rbm93biBhcyBEb21FbGVtZW50O1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuLy8gVGhpcyBvYmplY3Qgc3RvcmVzIGFsbCB0aGUgYXZhaWxhYmxlIGRpcmVjdGl2ZXNcbmV4cG9ydCBjb25zdCBkaXJlY3RpdmVzOiBEaXJlY3RpdmVzID0ge1xuICAvLyBUaGUgXCJ2LWlmXCIgZGlyZWN0aXZlIGhpZGVzIGFuIGVsZW1lbnQgaWYgdGhlIGdpdmVuIGNvbmRpdGlvbiBpcyBmYWxzZVxuICBcInYtaWZcIjogaGlkZURpcmVjdGl2ZShmYWxzZSksXG5cbiAgLy8gVGhlIFwidi11bmxlc3NcIiBkaXJlY3RpdmUgaGlkZXMgYW4gZWxlbWVudCBpZiB0aGUgZ2l2ZW4gY29uZGl0aW9uIGlzIHRydWVcbiAgXCJ2LXVubGVzc1wiOiBoaWRlRGlyZWN0aXZlKHRydWUpLFxuXG4gIC8vIFRoZSBcInYtZm9yXCIgZGlyZWN0aXZlIGNyZWF0ZXMgYSBsb29wIGFuZCBhcHBsaWVzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gZWFjaCBpdGVtIGluIHRoZSBsb29wXG4gIFwidi1mb3JcIjogKHNldDogdW5rbm93bltdLCB2bm9kZTogVm5vZGVXaXRoRG9tKSA9PiB7XG4gICAgbGV0IG5ld0NoaWxkcmVuOiBWbm9kZUludGVyZmFjZVtdID0gW107XG4gICAgbGV0IGNhbGxiYWNrID0gdm5vZGUuY2hpbGRyZW5bMF07XG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSBzZXQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBuZXdDaGlsZHJlbi5wdXNoKGNhbGxiYWNrKHNldFtpXSwgaSkpO1xuICAgIH1cbiAgICB2bm9kZS5jaGlsZHJlbiA9IG5ld0NoaWxkcmVuO1xuICB9LFxuXG4gIC8vIFRoZSBcInYtc2hvd1wiIGRpcmVjdGl2ZSBzaG93cyBvciBoaWRlcyBhbiBlbGVtZW50IGJ5IHNldHRpbmcgdGhlIFwiZGlzcGxheVwiIHN0eWxlIHByb3BlcnR5XG4gIFwidi1zaG93XCI6IChib29sOiBib29sZWFuLCB2bm9kZTogVm5vZGVXaXRoRG9tKSA9PiB7XG4gICAgKFxuICAgICAgdm5vZGUuZG9tIGFzIHVua25vd24gYXMge1xuICAgICAgICBzdHlsZTogeyBkaXNwbGF5OiBzdHJpbmcgfTtcbiAgICAgIH1cbiAgICApLnN0eWxlLmRpc3BsYXkgPSBib29sID8gXCJcIiA6IFwibm9uZVwiO1xuICB9LFxuXG4gIC8vIFRoZSBcInYtY2xhc3NcIiBkaXJlY3RpdmUgYWRkcyBvciByZW1vdmVzIGNsYXNzIG5hbWVzIGZyb20gYW4gZWxlbWVudCBiYXNlZCBvbiBhIGNvbmRpdGlvblxuICBcInYtY2xhc3NcIjogKGNsYXNzZXM6IHsgW3g6IHN0cmluZ106IGJvb2xlYW4gfSwgdm5vZGU6IFZub2RlV2l0aERvbSkgPT4ge1xuICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIGNsYXNzIG5hbWVzIGluIHRoZSBjbGFzc2VzIG9iamVjdFxuICAgIGZvciAobGV0IG5hbWUgaW4gY2xhc3Nlcykge1xuICAgICAgLy8gQWRkIG9yIHJlbW92ZSB0aGUgY2xhc3MgbmFtZSBmcm9tIHRoZSBlbGVtZW50J3MgY2xhc3MgbGlzdCBiYXNlZCBvbiB0aGUgdmFsdWUgaW4gdGhlIGNsYXNzZXMgb2JqZWN0XG4gICAgICAodm5vZGUuZG9tIGFzIERvbUVsZW1lbnQpLmNsYXNzTGlzdC50b2dnbGUobmFtZSwgY2xhc3Nlc1tuYW1lXSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIFRoZSBcInYtaHRtbFwiIGRpcmVjdGl2ZSBzZXRzIHRoZSBpbm5lciBIVE1MIG9mIGFuIGVsZW1lbnQgdG8gdGhlIGdpdmVuIEhUTUwgc3RyaW5nXG4gIFwidi1odG1sXCI6IChodG1sOiBzdHJpbmcsIHZub2RlOiBWbm9kZVdpdGhEb20pID0+IHtcbiAgICAvLyBTZXQgdGhlIGNoaWxkcmVuIG9mIHRoZSB2bm9kZSB0byBhIHRydXN0ZWQgdmVyc2lvbiBvZiB0aGUgSFRNTCBzdHJpbmdcbiAgICB2bm9kZS5jaGlsZHJlbiA9IFt0cnVzdChodG1sKV07XG4gIH0sXG5cbiAgLy8gVGhlIFwidi1tb2RlbFwiIGRpcmVjdGl2ZSBiaW5kcyB0aGUgdmFsdWUgb2YgYW4gaW5wdXQgZWxlbWVudCB0byBhIG1vZGVsIHByb3BlcnR5XG4gIFwidi1tb2RlbFwiOiAoW21vZGVsLCBwcm9wZXJ0eSwgZXZlbnRdOiBhbnlbXSwgdm5vZGU6IFZub2RlV2l0aERvbSwgb2xkVm5vZGU/OiBWbm9kZVdpdGhEb20pID0+IHtcbiAgICBsZXQgdmFsdWU7XG4gICAgLy8gVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBtb2RlbCBwcm9wZXJ0eSB3aGVuIHRoZSBpbnB1dCBlbGVtZW50J3MgdmFsdWUgY2hhbmdlc1xuICAgIGxldCBoYW5kbGVyID0gKGU6IEV2ZW50KSA9PiAobW9kZWxbcHJvcGVydHldID0gKGUudGFyZ2V0IGFzIERvbUVsZW1lbnQgJiBSZWNvcmQ8c3RyaW5nLCBhbnk+KS52YWx1ZSk7XG4gICAgaWYgKHZub2RlLnRhZyA9PT0gXCJpbnB1dFwiKSB7XG4gICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBhbiBpbnB1dCwgdXNlIHRoZSBcImlucHV0XCIgZXZlbnQgYnkgZGVmYXVsdFxuICAgICAgZXZlbnQgPSBldmVudCB8fCBcIm9uaW5wdXRcIjtcbiAgICAgIC8vIERlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBpbnB1dCBlbGVtZW50LCB1c2UgYSBkaWZmZXJlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgc3dpdGNoICh2bm9kZS5wcm9wcy50eXBlKSB7XG4gICAgICAgIGNhc2UgXCJjaGVja2JveFwiOiB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobW9kZWxbcHJvcGVydHldKSkge1xuICAgICAgICAgICAgLy8gSWYgdGhlIG1vZGVsIHByb3BlcnR5IGlzIGFuIGFycmF5LCBhZGQgb3IgcmVtb3ZlIHRoZSB2YWx1ZSBmcm9tIHRoZSBhcnJheSB3aGVuIHRoZSBjaGVja2JveCBpcyBjaGVja2VkIG9yIHVuY2hlY2tlZFxuICAgICAgICAgICAgaGFuZGxlciA9IChlOiBFdmVudCkgPT4ge1xuICAgICAgICAgICAgICBsZXQgdmFsID0gKGUudGFyZ2V0IGFzIERvbUVsZW1lbnQgJiBSZWNvcmQ8c3RyaW5nLCBhbnk+KS52YWx1ZTtcbiAgICAgICAgICAgICAgbGV0IGlkeCA9IG1vZGVsW3Byb3BlcnR5XS5pbmRleE9mKHZhbCk7XG4gICAgICAgICAgICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldLnB1c2godmFsKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0uc3BsaWNlKGlkeCwgMSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBJZiB0aGUgdmFsdWUgaXMgaW4gdGhlIGFycmF5LCBzZXQgdGhlIGNoZWNrYm94IHRvIGJlIGNoZWNrZWRcbiAgICAgICAgICAgIHZhbHVlID0gbW9kZWxbcHJvcGVydHldLmluZGV4T2Yodm5vZGUuZG9tLnZhbHVlKSAhPT0gLTE7XG4gICAgICAgICAgfSBlbHNlIGlmIChcInZhbHVlXCIgaW4gdm5vZGUucHJvcHMpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBpbnB1dCBlbGVtZW50IGhhcyBhIFwidmFsdWVcIiBhdHRyaWJ1dGUsIHVzZSBpdCB0byBkZXRlcm1pbmUgdGhlIGNoZWNrZWQgc3RhdGVcbiAgICAgICAgICAgIGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChtb2RlbFtwcm9wZXJ0eV0gPT09IHZub2RlLnByb3BzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldID0gbnVsbDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0gPSB2bm9kZS5wcm9wcy52YWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZhbHVlID0gbW9kZWxbcHJvcGVydHldID09PSB2bm9kZS5wcm9wcy52YWx1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gXCJ2YWx1ZVwiIGF0dHJpYnV0ZSwgdXNlIGEgYm9vbGVhbiB2YWx1ZSBmb3IgdGhlIG1vZGVsIHByb3BlcnR5XG4gICAgICAgICAgICBoYW5kbGVyID0gKCkgPT4gKG1vZGVsW3Byb3BlcnR5XSA9ICFtb2RlbFtwcm9wZXJ0eV0pO1xuICAgICAgICAgICAgdmFsdWUgPSBtb2RlbFtwcm9wZXJ0eV07XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFNldCB0aGUgXCJjaGVja2VkXCIgYXR0cmlidXRlIG9uIHRoZSBpbnB1dCBlbGVtZW50XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgICAgc2hhcmVkU2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiLCB2YWx1ZSwgdm5vZGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJyYWRpb1wiOiB7XG4gICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgYSByYWRpbyBidXR0b24sIHNldCB0aGUgXCJjaGVja2VkXCIgYXR0cmlidXRlIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGUgbW9kZWwgcHJvcGVydHlcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgICBzaGFyZWRTZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsIG1vZGVsW3Byb3BlcnR5XSA9PT0gdm5vZGUuZG9tLnZhbHVlLCB2bm9kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIC8vIEZvciBhbGwgb3RoZXIgaW5wdXQgdHlwZXMsIHNldCB0aGUgXCJ2YWx1ZVwiIGF0dHJpYnV0ZSBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgdGhlIG1vZGVsIHByb3BlcnR5XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICAgICAgc2hhcmVkU2V0QXR0cmlidXRlKFwidmFsdWVcIiwgbW9kZWxbcHJvcGVydHldLCB2bm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHZub2RlLnRhZyA9PT0gXCJzZWxlY3RcIikge1xuICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgYSBzZWxlY3QgZWxlbWVudCwgdXNlIHRoZSBcImNsaWNrXCIgZXZlbnQgYnkgZGVmYXVsdFxuICAgICAgZXZlbnQgPSBldmVudCB8fCBcIm9uY2xpY2tcIjtcbiAgICAgIGlmICh2bm9kZS5wcm9wcy5tdWx0aXBsZSkge1xuICAgICAgICAvLyBJZiB0aGUgc2VsZWN0IGVsZW1lbnQgYWxsb3dzIG11bHRpcGxlIHNlbGVjdGlvbnMsIHVwZGF0ZSB0aGUgbW9kZWwgcHJvcGVydHkgd2l0aCBhbiBhcnJheSBvZiBzZWxlY3RlZCB2YWx1ZXNcbiAgICAgICAgaGFuZGxlciA9IChlOiBFdmVudCAmIFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHtcbiAgICAgICAgICBsZXQgdmFsID0gKGUudGFyZ2V0IGFzIERvbUVsZW1lbnQgJiBSZWNvcmQ8c3RyaW5nLCBhbnk+KS52YWx1ZTtcbiAgICAgICAgICBpZiAoZS5jdHJsS2V5KSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgQ3RybCBrZXkgaXMgcHJlc3NlZCwgYWRkIG9yIHJlbW92ZSB0aGUgdmFsdWUgZnJvbSB0aGUgYXJyYXlcbiAgICAgICAgICAgIGxldCBpZHggPSBtb2RlbFtwcm9wZXJ0eV0uaW5kZXhPZih2YWwpO1xuICAgICAgICAgICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldLnB1c2godmFsKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgdGhlIEN0cmwga2V5IGlzIG5vdCBwcmVzc2VkLCBzZXQgdGhlIG1vZGVsIHByb3BlcnR5IHRvIGFuIGFycmF5IHdpdGggdGhlIHNlbGVjdGVkIHZhbHVlXG4gICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0uc3BsaWNlKDAsIG1vZGVsW3Byb3BlcnR5XS5sZW5ndGgpO1xuICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldLnB1c2godmFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIFNldCB0aGUgXCJzZWxlY3RlZFwiIGF0dHJpYnV0ZSBvbiB0aGUgb3B0aW9ucyBiYXNlZCBvbiB3aGV0aGVyIHRoZXkgYXJlIGluIHRoZSBtb2RlbCBwcm9wZXJ0eSBhcnJheVxuICAgICAgICB2bm9kZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogVm5vZGVJbnRlcmZhY2UpID0+IHtcbiAgICAgICAgICBpZiAoY2hpbGQudGFnID09PSBcIm9wdGlvblwiKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBcInZhbHVlXCIgaW4gY2hpbGQucHJvcHMgPyBjaGlsZC5wcm9wcy52YWx1ZSA6IGNoaWxkLmNoaWxkcmVuLmpvaW4oXCJcIikudHJpbSgpO1xuICAgICAgICAgICAgY2hpbGQucHJvcHMuc2VsZWN0ZWQgPSBtb2RlbFtwcm9wZXJ0eV0uaW5kZXhPZih2YWx1ZSkgIT09IC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiB0aGUgc2VsZWN0IGVsZW1lbnQgZG9lcyBub3QgYWxsb3cgbXVsdGlwbGUgc2VsZWN0aW9ucywgc2V0IHRoZSBcInNlbGVjdGVkXCIgYXR0cmlidXRlIG9uIHRoZSBvcHRpb25zIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGUgbW9kZWwgcHJvcGVydHlcbiAgICAgICAgdm5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IFZub2RlSW50ZXJmYWNlKSA9PiB7XG4gICAgICAgICAgaWYgKGNoaWxkLnRhZyA9PT0gXCJvcHRpb25cIikge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gXCJ2YWx1ZVwiIGluIGNoaWxkLnByb3BzID8gY2hpbGQucHJvcHMudmFsdWUgOiBjaGlsZC5jaGlsZHJlbi5qb2luKFwiXCIpLnRyaW0oKTtcbiAgICAgICAgICAgIGNoaWxkLnByb3BzLnNlbGVjdGVkID0gdmFsdWUgPT09IG1vZGVsW3Byb3BlcnR5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodm5vZGUudGFnID09PSBcInRleHRhcmVhXCIpIHtcbiAgICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIGEgdGV4dGFyZWEsIHVzZSB0aGUgXCJpbnB1dFwiIGV2ZW50IGJ5IGRlZmF1bHRcbiAgICAgIGV2ZW50ID0gZXZlbnQgfHwgXCJvbmlucHV0XCI7XG4gICAgICAvLyBTZXQgdGhlIHRleHRhcmVhJ3MgY29udGVudCB0byB0aGUgdmFsdWUgb2YgdGhlIG1vZGVsIHByb3BlcnR5XG4gICAgICB2bm9kZS5jaGlsZHJlbiA9IFttb2RlbFtwcm9wZXJ0eV1dO1xuICAgIH1cblxuICAgIC8vIFdlIGFzc3VtZSB0aGF0IHRoZSBwcmV2IGhhbmRsZXIgaWYgYW55IHdpbGwgbm90IGJlIGNoYW5nZWQgYnkgdGhlIHVzZXIgYWNyb3NzIHBhdGNoc1xuICAgIGxldCBwcmV2SGFuZGxlciA9IHZub2RlLnByb3BzW2V2ZW50XTtcblxuICAgIC8vIFNldCB0aGUgZXZlbnQgaGFuZGxlciBvbiB0aGUgZWxlbWVudFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgIHNoYXJlZFNldEF0dHJpYnV0ZShcbiAgICAgIGV2ZW50LFxuICAgICAgKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgIGhhbmRsZXIoZSk7XG5cbiAgICAgICAgLy8gSWYgdGhlIHByZXZpb3VzIGhhbmRsZXIgaXMgZGVmaW5lZCwgY2FsbCBpdCBhZnRlciB0aGUgbW9kZWwgaGFzIGJlZW4gdXBkYXRlZFxuICAgICAgICBpZiAocHJldkhhbmRsZXIpIHtcbiAgICAgICAgICBwcmV2SGFuZGxlcihlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHZub2RlLFxuICAgICAgb2xkVm5vZGVcbiAgICApO1xuICB9LFxuXG4gIC8vIFRoZSBcInYtY3JlYXRlXCIgZGlyZWN0aXZlIGlzIGNhbGxlZCB3aGVuIGEgbmV3IHZpcnR1YWwgbm9kZSBpcyBjcmVhdGVkLlxuICAvLyBUaGUgcHJvdmlkZWQgY2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdGhlIG5ldyB2aXJ0dWFsIG5vZGUgYXMgYW4gYXJndW1lbnQuXG4gIC8vIFRoaXMgZGlyZWN0aXZlIGlzIG9ubHkgY2FsbGVkIG9uY2UgcGVyIHZpcnR1YWwgbm9kZSwgd2hlbiBpdCBpcyBmaXJzdCBjcmVhdGVkLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgXCJ2LWNyZWF0ZVwiOiAoY2FsbGJhY2s6ICh2bm9kZTogVm5vZGVXaXRoRG9tKSA9PiB2b2lkLCB2bm9kZTogVm5vZGVXaXRoRG9tLCBvbGRWbm9kZT86IFZub2RlV2l0aERvbSkgPT4ge1xuICAgIC8vIElmIHRoaXMgaXMgbm90IGFuIHVwZGF0ZSwgY2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCB0aGUgbmV3IHZpcnR1YWwgbm9kZVxuICAgIGlmICghb2xkVm5vZGUpIHtcbiAgICAgIGxldCBjbGVhbnVwID0gY2FsbGJhY2sodm5vZGUpO1xuXG4gICAgICAvLyBJZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gcmV0dXJucyBhIGZ1bmN0aW9uLCBjYWxsIGl0IHdoZW4gdGhlIHVwZGF0ZSBpcyBnb25uYSBiZSBjbGVhbmVkIHVwXG4gICAgICBpZiAodHlwZW9mIGNsZWFudXAgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBvbkNsZWFudXAoY2xlYW51cCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8vIFRoZSBcInYtdXBkYXRlXCIgZGlyZWN0aXZlIGlzIGNhbGxlZCB3aGVuIGFuIGV4aXN0aW5nIHZpcnR1YWwgbm9kZSBpcyB1cGRhdGVkLlxuICAvLyBUaGUgcHJvdmlkZWQgY2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdGhlIG5ldyBhbmQgb2xkIHZpcnR1YWwgbm9kZXMgYXMgYXJndW1lbnRzLlxuICAvLyBUaGlzIGRpcmVjdGl2ZSBpcyBvbmx5IGNhbGxlZCBvbmNlIHBlciB2aXJ0dWFsIG5vZGUgdXBkYXRlLlxuICBcInYtdXBkYXRlXCI6IChcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICBjYWxsYmFjazogKHZub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlOiBWbm9kZVdpdGhEb20pID0+IHZvaWQsXG4gICAgdm5vZGU6IFZub2RlV2l0aERvbSxcbiAgICBvbGRWbm9kZT86IFZub2RlV2l0aERvbVxuICApID0+IHtcbiAgICAvLyBJZiB0aGlzIGlzIGFuIHVwZGF0ZSwgY2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCB0aGUgbmV3IGFuZCBvbGQgdmlydHVhbCBub2Rlc1xuICAgIGlmIChvbGRWbm9kZSkge1xuICAgICAgbGV0IGNsZWFudXAgPSBjYWxsYmFjayh2bm9kZSwgb2xkVm5vZGUpO1xuXG4gICAgICAvLyBJZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gcmV0dXJucyBhIGZ1bmN0aW9uLCBjYWxsIGl0IHdoZW4gdGhlIHVwZGF0ZSBpcyBnb25uYSBiZSBjbGVhbmVkIHVwXG4gICAgICBpZiAodHlwZW9mIGNsZWFudXAgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBvbkNsZWFudXAoY2xlYW51cCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8vIFRoZSBcInYtY2xlYW51cFwiIGRpcmVjdGl2ZSBpcyBjYWxsZWQgd2hlbiB0aGUgdXBkYXRlIGlzIGNsZWFuZWQgdXAuXG4gIC8vIFRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgb2xkIHZpcnR1YWwgbm9kZSBhcyBhbiBhcmd1bWVudC5cbiAgLy8gVGhpcyBkaXJlY3RpdmUgaXMgb25seSBjYWxsZWQgb25jZSBwZXIgdmlydHVhbCBub2RlLCB3aGVuIHRoZSB1cGRhdGUgaXMgY2xlYW5lZCB1cC5cbiAgXCJ2LWNsZWFudXBcIjogKFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIGNhbGxiYWNrOiAodm5vZGU6IFZub2RlV2l0aERvbSwgb2xkVm5vZGU/OiBWbm9kZVdpdGhEb20pID0+IHZvaWQsXG4gICAgdm5vZGU6IFZub2RlV2l0aERvbSxcbiAgICBvbGRWbm9kZT86IFZub2RlV2l0aERvbVxuICApID0+IHtcbiAgICAvLyBBZGQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHRoZSBsaXN0IG9mIGNsZWFudXAgZnVuY3Rpb25zIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSB1cGRhdGUgaXMgY2xlYW5lZCB1cFxuICAgIG9uQ2xlYW51cCgoKSA9PiBjYWxsYmFjayh2bm9kZSwgb2xkVm5vZGUpKTtcbiAgfVxufTtcbi8vIEFkZCBhIGRpcmVjdGl2ZSB0byB0aGUgZ2xvYmFsIGRpcmVjdGl2ZXMgb2JqZWN0LCB3aXRoIHRoZSBrZXkgYmVpbmcgdGhlIG5hbWVcbi8vIHByZWNlZGVkIGJ5IFwidi1cIi4gQWxzbyBhZGQgdGhlIG5hbWUgdG8gdGhlIGdsb2JhbCByZXNlcnZlZFByb3BzIG9iamVjdC5cbmV4cG9ydCBmdW5jdGlvbiBkaXJlY3RpdmUobmFtZTogc3RyaW5nLCBkaXJlY3RpdmU6IERpcmVjdGl2ZSkge1xuICBsZXQgZGlyZWN0aXZlTmFtZSA9IGB2LSR7bmFtZX1gO1xuICBkaXJlY3RpdmVzW2RpcmVjdGl2ZU5hbWVdID0gZGlyZWN0aXZlO1xuICByZXNlcnZlZFByb3BzW2RpcmVjdGl2ZU5hbWVdID0gdHJ1ZTtcbn1cblxuLy8gU2V0IGFuIGF0dHJpYnV0ZSBvbiBhIHZpcnR1YWwgRE9NIG5vZGUgYW5kIHVwZGF0ZSB0aGUgYWN0dWFsIERPTSBlbGVtZW50LlxuLy8gSWYgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBhZGQgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIHRoZSBhdHRyaWJ1dGVcbi8vIG5hbWUgdG8gdGhlIERPTSBlbGVtZW50IHJlcHJlc2VudGVkIGJ5IG1haW5Wbm9kZS5cbi8vIElmIG9sZFZub2RlIGlzIHByb3ZpZGVkLCBjb21wYXJlIHRoZSBuZXcgYXR0cmlidXRlIHZhbHVlIHRvIHRoZSBvbGQgdmFsdWVcbi8vIGFuZCBvbmx5IHVwZGF0ZSB0aGUgYXR0cmlidXRlIGlmIHRoZSB2YWx1ZXMgYXJlIGRpZmZlcmVudC5cbmZ1bmN0aW9uIHNoYXJlZFNldEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIG5ld1Zub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tKTogdm9pZCB8IGJvb2xlYW4ge1xuICAvLyBJZiB0aGUgYXR0cmlidXRlIHZhbHVlIGlzIGEgZnVuY3Rpb24sIGFkZCBhbiBldmVudCBsaXN0ZW5lciBmb3IgdGhlIGF0dHJpYnV0ZVxuICAvLyBuYW1lIHRvIHRoZSBET00gZWxlbWVudCByZXByZXNlbnRlZCBieSBtYWluVm5vZGUuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIC8vIE9ubHkgYWRkIHRoZSBldmVudCBsaXN0ZW5lciBpZiBpdCBoYXNuJ3QgYmVlbiBhZGRlZCB5ZXQuXG4gICAgaWYgKG5hbWUgaW4gZXZlbnRMaXN0ZW5lck5hbWVzID09PSBmYWxzZSkge1xuICAgICAgKG1haW5Wbm9kZSBhcyBWbm9kZVdpdGhEb20pLmRvbS5hZGRFdmVudExpc3RlbmVyKG5hbWUuc2xpY2UoMiksIGV2ZW50TGlzdGVuZXIpO1xuICAgICAgZXZlbnRMaXN0ZW5lck5hbWVzW25hbWVdID0gdHJ1ZTtcbiAgICB9XG4gICAgbmV3Vm5vZGUuZG9tW2B2LSR7bmFtZX1gXSA9IHZhbHVlO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIElmIHRoZSBhdHRyaWJ1dGUgaXMgcHJlc2VudCBvbiB0aGUgRE9NIGVsZW1lbnQgYW5kIG5ld1Zub2RlIGlzIG5vdCBhbiBTVkcsXG4gIC8vIHVwZGF0ZSB0aGUgYXR0cmlidXRlIGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZC5cbiAgaWYgKG5hbWUgaW4gbmV3Vm5vZGUuZG9tICYmIG5ld1Zub2RlLmlzU1ZHID09PSBmYWxzZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcbiAgICBpZiAobmV3Vm5vZGUuZG9tW25hbWVdICE9IHZhbHVlKSB7XG4gICAgICBuZXdWbm9kZS5kb21bbmFtZV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gSWYgb2xkVm5vZGUgaXMgbm90IHByb3ZpZGVkIG9yIHRoZSBhdHRyaWJ1dGUgdmFsdWUgaGFzIGNoYW5nZWQsIHVwZGF0ZSB0aGVcbiAgLy8gYXR0cmlidXRlIG9uIHRoZSBET00gZWxlbWVudC5cbiAgaWYgKCFvbGRWbm9kZSB8fCB2YWx1ZSAhPT0gb2xkVm5vZGUucHJvcHNbbmFtZV0pIHtcbiAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICBuZXdWbm9kZS5kb20ucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdWbm9kZS5kb20uc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gU2V0IGFuIGF0dHJpYnV0ZSBvbiBhIHZpcnR1YWwgRE9NIG5vZGUgYW5kIHVwZGF0ZSB0aGUgYWN0dWFsIERPTSBlbGVtZW50LlxuLy8gU2tpcCB0aGUgYXR0cmlidXRlIGlmIGl0IGlzIGluIHRoZSByZXNlcnZlZFByb3BzIG9iamVjdC5cbmV4cG9ydCBmdW5jdGlvbiBzZXRBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBuZXdWbm9kZTogVm5vZGVXaXRoRG9tLCBvbGRWbm9kZT86IFZub2RlV2l0aERvbSk6IHZvaWQge1xuICBpZiAobmFtZSBpbiByZXNlcnZlZFByb3BzKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIG5ld1Zub2RlLnByb3BzW25hbWVdID0gdmFsdWU7XG4gIHNoYXJlZFNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSwgbmV3Vm5vZGUgYXMgVm5vZGVXaXRoRG9tLCBvbGRWbm9kZSk7XG59XG5cbi8vIFVwZGF0ZSB0aGUgYXR0cmlidXRlcyBvbiBhIHZpcnR1YWwgRE9NIG5vZGUuIElmIG9sZFZub2RlIGlzIHByb3ZpZGVkLCByZW1vdmVcbi8vIGF0dHJpYnV0ZXMgZnJvbSB0aGUgRE9NIGVsZW1lbnQgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gbmV3Vm5vZGUucHJvcHMgYnV0IGFyZVxuLy8gcHJlc2VudCBpbiBvbGRWbm9kZS5wcm9wcy4gVGhlbiwgaXRlcmF0ZSBvdmVyIHRoZSBhdHRyaWJ1dGVzIGluIG5ld1Zub2RlLnByb3BzXG4vLyBhbmQgdXBkYXRlIHRoZSBET00gZWxlbWVudCB3aXRoIHRoZSBhdHRyaWJ1dGVzIHVzaW5nIHRoZSBzaGFyZWRTZXRBdHRyaWJ1dGVcbi8vIGZ1bmN0aW9uLiBJZiBhbiBhdHRyaWJ1dGUgaXMgaW4gdGhlIHJlc2VydmVkUHJvcHMgb2JqZWN0IGFuZCBoYXMgYSBjb3JyZXNwb25kaW5nXG4vLyBkaXJlY3RpdmUgaW4gdGhlIGRpcmVjdGl2ZXMgb2JqZWN0LCBjYWxsIHRoZSBkaXJlY3RpdmUgd2l0aCB0aGUgYXR0cmlidXRlIHZhbHVlXG4vLyBhbmQgdGhlIHR3byB2aXJ0dWFsIERPTSBub2RlcyBhcyBhcmd1bWVudHMuIElmIHRoZSBkaXJlY3RpdmUgcmV0dXJucyBmYWxzZSwgZXhpdFxuLy8gdGhlIGxvb3AuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQXR0cmlidXRlcyhuZXdWbm9kZTogVm5vZGVXaXRoRG9tLCBvbGRWbm9kZT86IFZub2RlV2l0aERvbSk6IHZvaWQge1xuICAvLyBJZiBvbGRWbm9kZSBpcyBwcm92aWRlZCwgcmVtb3ZlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgRE9NIGVsZW1lbnQgdGhhdCBhcmUgbm90XG4gIC8vIHByZXNlbnQgaW4gbmV3Vm5vZGUucHJvcHMgYnV0IGFyZSBwcmVzZW50IGluIG9sZFZub2RlLnByb3BzLlxuICBpZiAob2xkVm5vZGUpIHtcbiAgICBmb3IgKGxldCBuYW1lIGluIG9sZFZub2RlLnByb3BzKSB7XG4gICAgICBpZiAobmFtZSBpbiBuZXdWbm9kZS5wcm9wcyA9PT0gZmFsc2UgJiYgbmFtZSBpbiBldmVudExpc3RlbmVyTmFtZXMgPT09IGZhbHNlICYmIG5hbWUgaW4gcmVzZXJ2ZWRQcm9wcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgaWYgKG5hbWUgaW4gbmV3Vm5vZGUuZG9tICYmIG5ld1Zub2RlLmlzU1ZHID09PSBmYWxzZSkge1xuICAgICAgICAgIG5ld1Zub2RlLmRvbVtuYW1lXSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3Vm5vZGUuZG9tLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEl0ZXJhdGUgb3ZlciB0aGUgYXR0cmlidXRlcyBpbiBuZXdWbm9kZS5wcm9wcyBhbmQgdXBkYXRlIHRoZSBET00gZWxlbWVudCB3aXRoXG4gIC8vIHRoZSBhdHRyaWJ1dGVzIHVzaW5nIHRoZSBzaGFyZWRTZXRBdHRyaWJ1dGUgZnVuY3Rpb24uXG4gIGZvciAobGV0IG5hbWUgaW4gbmV3Vm5vZGUucHJvcHMpIHtcbiAgICBpZiAobmFtZSBpbiByZXNlcnZlZFByb3BzKSB7XG4gICAgICAvLyBJZiB0aGVyZSBpcyBhIGRpcmVjdGl2ZSBmb3IgdGhlIGF0dHJpYnV0ZSwgY2FsbCBpdCB3aXRoIHRoZSBhdHRyaWJ1dGUgdmFsdWVcbiAgICAgIC8vIGFuZCB0aGUgdHdvIHZpcnR1YWwgRE9NIG5vZGVzIGFzIGFyZ3VtZW50cy4gSWYgdGhlIGRpcmVjdGl2ZSByZXR1cm5zIGZhbHNlLFxuICAgICAgLy8gZXhpdCB0aGUgbG9vcC5cbiAgICAgIGlmIChuYW1lIGluIGRpcmVjdGl2ZXMgJiYgZGlyZWN0aXZlc1tuYW1lXShuZXdWbm9kZS5wcm9wc1tuYW1lXSwgbmV3Vm5vZGUsIG9sZFZub2RlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgc2hhcmVkU2V0QXR0cmlidXRlKG5hbWUsIG5ld1Zub2RlLnByb3BzW25hbWVdLCBuZXdWbm9kZSwgb2xkVm5vZGUpO1xuICB9XG59XG5cbi8qIHBhdGNoIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLy8gUGF0Y2ggYSBET00gbm9kZSB3aXRoIGEgbmV3IFZOb2RlIHRyZWVcbmV4cG9ydCBmdW5jdGlvbiBwYXRjaChuZXdWbm9kZTogVm5vZGVXaXRoRG9tLCBvbGRWbm9kZT86IFZub2RlV2l0aERvbSk6IHZvaWQge1xuICAvLyBJZiB0aGUgbmV3IHRyZWUgaGFzIG5vIGNoaWxkcmVuLCBzZXQgdGhlIHRleHQgY29udGVudCBvZiB0aGUgcGFyZW50IERPTSBlbGVtZW50IHRvIGFuIGVtcHR5IHN0cmluZ1xuICBpZiAobmV3Vm5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgbmV3Vm5vZGUuZG9tLnRleHRDb250ZW50ID0gXCJcIjtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBHZXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBuZXcgYW5kIG9sZCB2aXJ0dWFsIERPTSBub2Rlc1xuICBsZXQgbmV3VHJlZSA9IG5ld1Zub2RlLmNoaWxkcmVuO1xuICBsZXQgb2xkVHJlZSA9IG9sZFZub2RlPy5jaGlsZHJlbiB8fCBbXTtcbiAgLy8gR2V0IHRoZSBsZW5ndGggb2YgdGhlIG9sZCB0cmVlXG4gIGxldCBvbGRUcmVlTGVuZ3RoID0gb2xkVHJlZS5sZW5ndGg7XG5cbiAgLy8gSWYgdGhlIG9sZCB0cmVlIGhhcyBjaGlsZHJlbiBhbmQgdGhlIGZpcnN0IGNoaWxkIG9mIHRoZSBuZXcgdHJlZSBpcyBhIFZOb2RlIHdpdGggYSBcImtleVwiXG4gIC8vIGF0dHJpYnV0ZSBhbmQgdGhlIGZpcnN0IGNoaWxkIG9mIHRoZSBvbGQgdHJlZSBpcyBhIFZOb2RlIHdpdGggYSBcImtleVwiIGF0dHJpYnV0ZSwgdXBkYXRlXG4gIC8vIHRoZSBET00gZWxlbWVudCBpbiBwbGFjZSBieSBjb21wYXJpbmcgdGhlIGtleXMgb2YgdGhlIG5vZGVzIGluIHRoZSB0cmVlcy5cbiAgaWYgKG9sZFRyZWVMZW5ndGggJiYgbmV3VHJlZVswXSBpbnN0YW5jZW9mIFZub2RlICYmIFwia2V5XCIgaW4gbmV3VHJlZVswXS5wcm9wcyAmJiBcImtleVwiIGluIG9sZFRyZWVbMF0ucHJvcHMpIHtcbiAgICAvLyBHZXQgdGhlIGxlbmd0aHMgb2YgdGhlIG5ldyBhbmQgb2xkIHRyZWVzXG4gICAgbGV0IG5ld1RyZWVMZW5ndGggPSBuZXdUcmVlLmxlbmd0aDtcblxuICAgIC8vIENyZWF0ZSBhbiBvYmplY3QgdGhhdCBtYXBzIGtleXMgdG8gaW5kaWNlcyBpbiB0aGUgb2xkIHRyZWVcbiAgICBsZXQgb2xkS2V5ZWRMaXN0OiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvbGRUcmVlTGVuZ3RoOyBpKyspIHtcbiAgICAgIG9sZEtleWVkTGlzdFtvbGRUcmVlW2ldLnByb3BzLmtleV0gPSBpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhbiBvYmplY3QgdGhhdCBtYXBzIGtleXMgdG8gaW5kaWNlcyBpbiB0aGUgbmV3IHRyZWVcbiAgICBsZXQgbmV3S2V5ZWRMaXN0OiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdUcmVlTGVuZ3RoOyBpKyspIHtcbiAgICAgIG5ld0tleWVkTGlzdFtuZXdUcmVlW2ldLnByb3BzLmtleV0gPSBpO1xuICAgIH1cblxuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgbmV3IHRyZWVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1RyZWVMZW5ndGg7IGkrKykge1xuICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IG5ldyBjaGlsZCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgb2xkIGNoaWxkXG4gICAgICBsZXQgbmV3Q2hpbGQgPSBuZXdUcmVlW2ldO1xuICAgICAgbGV0IG9sZENoaWxkID0gb2xkVHJlZVtvbGRLZXllZExpc3RbbmV3Q2hpbGQucHJvcHMua2V5XV07XG4gICAgICAvLyBJbml0aWFsaXplIGEgZmxhZyB0byBkZXRlcm1pbmUgd2hldGhlciB0byBwYXRjaCB0aGUgY2hpbGRcbiAgICAgIGxldCBzaG91bGRQYXRjaCA9IHRydWU7XG5cbiAgICAgIC8vIElmIHRoZSBvbGQgY2hpbGQgZXhpc3RzLCB1cGRhdGUgdGhlIERPTSBlbGVtZW50IG9mIHRoZSBuZXcgY2hpbGQgdG8gbWF0Y2ggdGhlIG9sZCBjaGlsZCdzIERPTSBlbGVtZW50XG4gICAgICBpZiAob2xkQ2hpbGQpIHtcbiAgICAgICAgbmV3Q2hpbGQuZG9tID0gb2xkQ2hpbGQuZG9tO1xuICAgICAgICAvLyBJZiB0aGUgbmV3IGFuZCBvbGQgY2hpbGRyZW4gaGF2ZSB0aGUgc2FtZSBcInYta2VlcFwiIGF0dHJpYnV0ZSB2YWx1ZSwgdXBkYXRlIHRoZSBjaGlsZHJlbiBvZiB0aGUgbmV3IGNoaWxkIHRvIG1hdGNoIHRoZSBvbGQgY2hpbGQncyBjaGlsZHJlblxuICAgICAgICBpZiAoXCJ2LWtlZXBcIiBpbiBuZXdDaGlsZC5wcm9wcyAmJiBuZXdDaGlsZC5wcm9wc1tcInYta2VlcFwiXSA9PT0gb2xkQ2hpbGQucHJvcHNbXCJ2LWtlZXBcIl0pIHtcbiAgICAgICAgICBuZXdDaGlsZC5jaGlsZHJlbiA9IG9sZENoaWxkLmNoaWxkcmVuO1xuICAgICAgICAgIC8vIFNldCB0aGUgc2hvdWxkUGF0Y2ggZmxhZyB0byBmYWxzZVxuICAgICAgICAgIHNob3VsZFBhdGNoID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdXBkYXRlQXR0cmlidXRlcyhuZXdDaGlsZCwgb2xkQ2hpbGQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIG9sZCBjaGlsZCBkb2VzIG5vdCBleGlzdCwgY3JlYXRlIGEgbmV3IERPTSBlbGVtZW50IGZvciB0aGUgbmV3IGNoaWxkIGFuZCB1cGRhdGUgaXRzIGF0dHJpYnV0ZXNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld0NoaWxkLmRvbSA9IGNyZWF0ZURvbUVsZW1lbnQobmV3Q2hpbGQudGFnLCBuZXdDaGlsZC5pc1NWRyk7XG4gICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXMobmV3Q2hpbGQpO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgbmV3IGNoaWxkJ3MgRE9NIGVsZW1lbnQgaXMgbm90IHRoZSBpLXRoIGNoaWxkIG9mIHRoZSBwYXJlbnQgRE9NIGVsZW1lbnQsIGluc2VydCBpdFxuICAgICAgaWYgKCFuZXdWbm9kZS5kb20uY2hpbGROb2Rlc1tpXSkge1xuICAgICAgICBuZXdWbm9kZS5kb20uYXBwZW5kQ2hpbGQobmV3Q2hpbGQuZG9tKTtcblxuICAgICAgICAvLyBJZiB0aGUgbmV3IGNoaWxkJ3MgRE9NIGVsZW1lbnQgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBpLXRoIGNoaWxkIG9mIHRoZSBwYXJlbnQgRE9NIGVsZW1lbnQsIHJlcGxhY2UgdGhlIGktdGggY2hpbGQgd2l0aCB0aGUgbmV3IGNoaWxkJ3MgRE9NIGVsZW1lbnRcbiAgICAgIH0gZWxzZSBpZiAobmV3Vm5vZGUuZG9tLmNoaWxkTm9kZXNbaV0gIT09IG5ld0NoaWxkLmRvbSkge1xuICAgICAgICBuZXdWbm9kZS5kb20ucmVwbGFjZUNoaWxkKG5ld0NoaWxkLmRvbSwgbmV3Vm5vZGUuZG9tLmNoaWxkTm9kZXNbaV0pO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgc2hvdWxkUGF0Y2ggZmxhZyBpcyB0cnVlLCByZWN1cnNpdmVseSBjYWxsIHRoZSBwYXRjaCBmdW5jdGlvbiBvbiB0aGUgbmV3IGNoaWxkLCBwYXNzaW5nIGluIHRoZSBvbGQgY2hpbGQgYXMgdGhlIHNlY29uZCBhcmd1bWVudFxuICAgICAgc2hvdWxkUGF0Y2ggJiYgcGF0Y2gobmV3Q2hpbGQsIG9sZENoaWxkKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgdGhlIHJlc3Qgb2YgdGhlIGNoaWxkcmVuLCB3ZSBzaG91bGQgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgRE9NXG4gICAgZm9yIChsZXQgaSA9IG5ld1RyZWVMZW5ndGg7IGkgPCBvbGRUcmVlTGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIElmIHRoZSBpLXRoIGNoaWxkIG9mIHRoZSBvbGQgdHJlZSBkb2VzIG5vdCBoYXZlIGEgY29ycmVzcG9uZGluZyBrZXkgaW4gdGhlIG5ldyB0cmVlLCByZW1vdmUgaXRzIERPTSBlbGVtZW50IGZyb20gdGhlIHBhcmVudCBET00gZWxlbWVudFxuICAgICAgaWYgKCFuZXdLZXllZExpc3Rbb2xkVHJlZVtpXS5wcm9wcy5rZXldKSB7XG4gICAgICAgIG9sZFRyZWVbaV0uZG9tLnBhcmVudE5vZGUgJiYgb2xkVHJlZVtpXS5kb20ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvbGRUcmVlW2ldLmRvbSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIElmIHRoZSBuZXcgdHJlZSBoYXMgbm8gY2hpbGRyZW4sIHNldCB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBwYXJlbnQgRE9NIGVsZW1lbnQgdG8gYW4gZW1wdHkgc3RyaW5nXG4gIGlmIChuZXdUcmVlLmxlbmd0aCA9PT0gMCkge1xuICAgIG5ld1Zub2RlLmRvbS50ZXh0Q29udGVudCA9IFwiXCI7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gU2V0IHRoZSBnbG9iYWwgY3VycmVudCBvYmplY3QgdG8gdGhlIG5ldyBhbmQgb2xkIHZpcnR1YWwgRE9NIG5vZGVzXG4gIGN1cnJlbnQudm5vZGUgPSBuZXdWbm9kZTtcbiAgY3VycmVudC5vbGRWbm9kZSA9IG9sZFZub2RlO1xuXG4gIC8vIEZsYXR0ZW4gdGhlIG5ldyB0cmVlXG4gIC8vIFRha2UgaW50byBhY2NvdW50IHRoYXQgaXMgbmVjZXNzYXJ5IHRvIGZsYXR0ZW4gdGhlIHRyZWUgYmVmb3JlIHRoZSBwYXRjaCBwcm9jZXNzXG4gIC8vIHRvIGxldCB0aGUgaG9va3MgYW5kIHNpZ25hbHMgd29yayBwcm9wZXJseVxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1RyZWUubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgbmV3Q2hpbGQgPSBuZXdUcmVlW2ldO1xuXG4gICAgLy8gSWYgdGhlIG5ldyBjaGlsZCBpcyBhIFZub2RlIGFuZCBpcyBub3QgYSB0ZXh0IG5vZGVcbiAgICBpZiAobmV3Q2hpbGQgaW5zdGFuY2VvZiBWbm9kZSkge1xuICAgICAgLy8gSWYgdGhlIHRhZyBvZiB0aGUgbmV3IGNoaWxkIGlzIG5vdCBhIHN0cmluZywgaXQgaXMgYSBjb21wb25lbnRcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQudGFnICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIC8vIFNldCB0aGUgY3VycmVudCBjb21wb25lbnQgdG8gdGhlIHRhZyBvZiB0aGUgbmV3IGNoaWxkXG4gICAgICAgIGN1cnJlbnQuY29tcG9uZW50ID0gbmV3Q2hpbGQudGFnO1xuICAgICAgICAvLyBSZXBsYWNlIHRoZSBuZXcgY2hpbGQgd2l0aCB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgaXRzIHZpZXcgb3IgYmluZCBtZXRob2QsIHBhc3NpbmcgaW4gdGhlIHByb3BzIGFuZCBjaGlsZHJlbiBhcyBhcmd1bWVudHNcbiAgICAgICAgbmV3VHJlZS5zcGxpY2UoXG4gICAgICAgICAgaS0tLFxuICAgICAgICAgIDEsXG4gICAgICAgICAgKFwidmlld1wiIGluIG5ld0NoaWxkLnRhZyA/IG5ld0NoaWxkLnRhZy52aWV3LmJpbmQobmV3Q2hpbGQudGFnKSA6IG5ld0NoaWxkLnRhZy5iaW5kKG5ld0NoaWxkLnRhZykpKFxuICAgICAgICAgICAgbmV3Q2hpbGQucHJvcHMsXG4gICAgICAgICAgICAuLi5uZXdDaGlsZC5jaGlsZHJlblxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIG5ldyBjaGlsZCBpcyBhbiBhcnJheSwgZmxhdHRlbiBpdCBhbmQgY29udGludWUgdGhlIGxvb3BcbiAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdDaGlsZCkpIHtcbiAgICAgIG5ld1RyZWUuc3BsaWNlKGktLSwgMSwgLi4ubmV3Q2hpbGQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIG5ldyBjaGlsZCBpcyBudWxsIG9yIHVuZGVmaW5lZCwgcmVtb3ZlIGl0IGZyb20gdGhlIG5ldyB0cmVlIGFuZCBjb250aW51ZSB0aGUgbG9vcFxuICAgIGlmIChuZXdDaGlsZCA9PT0gbnVsbCB8fCBuZXdDaGlsZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBuZXdUcmVlLnNwbGljZShpLS0sIDEpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIG5ldyBjaGlsZCBpcyBhIFZub2RlLCBzZXQgdGhlIHRleHQgb2YgdGhlIFZub2RlIHRvIHRoZSB0ZXh0IGNvbnRlbnQgb2YgaXRzIGRvbSBwcm9wZXJ0eVxuICAgIG5ld1RyZWVbaV0gPSBuZXcgVm5vZGUodGV4dFRhZywge30sIFtuZXdDaGlsZF0pO1xuICB9XG5cbiAgLy8gUGF0Y2ggdGhlIHRoZSBvbGQgdHJlZVxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1RyZWUubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgbmV3Q2hpbGQgPSBuZXdUcmVlW2ldO1xuXG4gICAgaWYgKG5ld0NoaWxkLnRhZyA9PT0gdGV4dFRhZykge1xuICAgICAgLy8gSWYgbm8gb2xkIGNoaWxkIGV4aXN0cyBhdCB0aGUgc2FtZSBpbmRleFxuICAgICAgaWYgKGkgPj0gb2xkVHJlZUxlbmd0aCkge1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgdGV4dCBub2RlIGZvciB0aGUgbmV3IGNoaWxkXG4gICAgICAgIG5ld0NoaWxkLmRvbSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG5ld0NoaWxkLmNoaWxkcmVuWzBdKTtcbiAgICAgICAgLy8gQXBwZW5kIHRoZSBuZXcgdGV4dCBub2RlIHRvIHRoZSBkb21cbiAgICAgICAgbmV3Vm5vZGUuZG9tLmFwcGVuZENoaWxkKG5ld0NoaWxkLmRvbSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGVyZSBpcyBhbiBvbGQgY2hpbGQgYXQgdGhlIHNhbWUgaW5kZXhcbiAgICAgIGxldCBvbGRDaGlsZCA9IG9sZFRyZWVbaV07XG5cbiAgICAgIC8vIElmIHRoZSBvbGQgY2hpbGQgaXMgbm90IGEgdGV4dCBub2RlXG4gICAgICBpZiAob2xkQ2hpbGQudGFnICE9PSB0ZXh0VGFnKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyB0ZXh0IG5vZGUgZm9yIHRoZSBuZXcgY2hpbGRcbiAgICAgICAgbmV3Q2hpbGQuZG9tID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobmV3Q2hpbGQuY2hpbGRyZW5bMF0pO1xuICAgICAgICAvLyBSZXBsYWNlIHRoZSBvbGQgY2hpbGQgaW4gdGhlIGRvbSB3aXRoIHRoZSBuZXcgdGV4dCBub2RlXG4gICAgICAgIG5ld1Zub2RlLmRvbS5yZXBsYWNlQ2hpbGQobmV3Q2hpbGQuZG9tLCBvbGRDaGlsZC5kb20pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIG9sZCBjaGlsZCBpcyBhIHRleHQgbm9kZVxuICAgICAgLy8gU2V0IHRoZSBkb20gcHJvcGVydHkgb2YgdGhlIHRleHQgVm5vZGUgdG8gdGhlIGRvbSBwcm9wZXJ0eSBvZiB0aGUgb2xkIGNoaWxkXG4gICAgICBuZXdDaGlsZC5kb20gPSBvbGRDaGlsZC5kb207XG4gICAgICAvLyBJZiB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBvbGQgY2hpbGQgaXMgZGlmZmVyZW50IGZyb20gdGhlIG5ldyBjaGlsZCwgdXBkYXRlIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIG9sZCBjaGlsZFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuICAgICAgaWYgKG5ld0NoaWxkLmNoaWxkcmVuWzBdICE9IG9sZENoaWxkLmRvbS50ZXh0Q29udGVudCkge1xuICAgICAgICBvbGRDaGlsZC5kb20udGV4dENvbnRlbnQgPSBuZXdDaGlsZC5jaGlsZHJlblswXTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBuZXcgY2hpbGQgaXMgbm90IGEgdGV4dCBub2RlXG4gICAgLy8gU2V0IHRoZSBpc1NWRyBmbGFnIGZvciB0aGUgbmV3IGNoaWxkIGlmIGl0IGlzIGFuIFNWRyBlbGVtZW50IG9yIGlmIHRoZSBwYXJlbnQgaXMgYW4gU1ZHIGVsZW1lbnRcbiAgICBuZXdDaGlsZC5pc1NWRyA9IG5ld1Zub2RlLmlzU1ZHIHx8IG5ld0NoaWxkLnRhZyA9PT0gXCJzdmdcIjtcblxuICAgIC8vIElmIHRoZXJlIGlzIG5vIG9sZCBjaGlsZCBhdCB0aGUgc2FtZSBpbmRleFxuICAgIGlmIChpID49IG9sZFRyZWVMZW5ndGgpIHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBkb20gZWxlbWVudCBmb3IgdGhlIG5ldyBjaGlsZFxuICAgICAgbmV3Q2hpbGQuZG9tID0gY3JlYXRlRG9tRWxlbWVudChuZXdDaGlsZC50YWcgYXMgc3RyaW5nLCBuZXdDaGlsZC5pc1NWRyk7XG4gICAgICAvLyBVcGRhdGUgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG5ldyBjaGlsZFxuICAgICAgdXBkYXRlQXR0cmlidXRlcyhuZXdDaGlsZCBhcyBWbm9kZVdpdGhEb20pO1xuICAgICAgLy8gQXBwZW5kIHRoZSBuZXcgY2hpbGQgdG8gdGhlIGRvbVxuICAgICAgbmV3Vm5vZGUuZG9tLmFwcGVuZENoaWxkKG5ld0NoaWxkLmRvbSk7XG4gICAgICAvLyBSZWN1cnNpdmVseSBwYXRjaCB0aGUgbmV3IGNoaWxkXG4gICAgICBwYXRjaChuZXdDaGlsZCBhcyBWbm9kZVdpdGhEb20pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgaXMgYW4gb2xkIGNoaWxkIGF0IHRoZSBzYW1lIGluZGV4XG4gICAgbGV0IG9sZENoaWxkID0gb2xkVHJlZVtpXTtcblxuICAgIC8vIElmIHRoZSB0YWcgb2YgdGhlIG5ldyBjaGlsZCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgdGFnIG9mIHRoZSBvbGQgY2hpbGRcbiAgICBpZiAobmV3Q2hpbGQudGFnICE9PSBvbGRDaGlsZC50YWcpIHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBkb20gZWxlbWVudCBmb3IgdGhlIG5ldyBjaGlsZFxuICAgICAgbmV3Q2hpbGQuZG9tID0gY3JlYXRlRG9tRWxlbWVudChuZXdDaGlsZC50YWcgYXMgc3RyaW5nLCBuZXdDaGlsZC5pc1NWRyk7XG4gICAgICAvLyBVcGRhdGUgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG5ldyBjaGlsZFxuICAgICAgdXBkYXRlQXR0cmlidXRlcyhuZXdDaGlsZCBhcyBWbm9kZVdpdGhEb20pO1xuICAgICAgLy8gUmVwbGFjZSB0aGUgb2xkIGNoaWxkIGluIHRoZSBkb20gd2l0aCB0aGUgbmV3IGNoaWxkXG4gICAgICBuZXdWbm9kZS5kb20ucmVwbGFjZUNoaWxkKG5ld0NoaWxkLmRvbSwgb2xkQ2hpbGQuZG9tKTtcbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IHBhdGNoIHRoZSBuZXcgY2hpbGRcbiAgICAgIHBhdGNoKG5ld0NoaWxkIGFzIFZub2RlV2l0aERvbSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgdGFnIG9mIHRoZSBuZXcgY2hpbGQgaXMgdGhlIHNhbWUgYXMgdGhlIHRhZyBvZiB0aGUgb2xkIGNoaWxkXG4gICAgLy8gU2V0IHRoZSBkb20gcHJvcGVydHkgb2YgdGhlIG5ldyBjaGlsZCB0byB0aGUgZG9tIHByb3BlcnR5IG9mIHRoZSBvbGQgY2hpbGRcbiAgICBuZXdDaGlsZC5kb20gPSBvbGRDaGlsZC5kb207XG4gICAgLy8gSWYgdGhlIHYta2VlcCBwcm9wIGlzIHRoZSBzYW1lIGZvciBib3RoIHRoZSBuZXcgYW5kIG9sZCBjaGlsZCwgc2V0IHRoZSBjaGlsZHJlbiBvZiB0aGUgbmV3IGNoaWxkIHRvIHRoZSBjaGlsZHJlbiBvZiB0aGUgb2xkIGNoaWxkXG4gICAgaWYgKFwidi1rZWVwXCIgaW4gbmV3Q2hpbGQucHJvcHMgJiYgbmV3Q2hpbGQucHJvcHNbXCJ2LWtlZXBcIl0gPT09IG9sZENoaWxkLnByb3BzW1widi1rZWVwXCJdKSB7XG4gICAgICBuZXdDaGlsZC5jaGlsZHJlbiA9IG9sZENoaWxkLmNoaWxkcmVuO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBuZXcgY2hpbGQgYmFzZWQgb24gdGhlIG9sZCBjaGlsZFxuICAgIHVwZGF0ZUF0dHJpYnV0ZXMobmV3Q2hpbGQgYXMgVm5vZGVXaXRoRG9tLCBvbGRDaGlsZCk7XG4gICAgLy8gUmVjdXJzaXZlbHkgcGF0Y2ggdGhlIG5ldyBhbmQgb2xkIGNoaWxkcmVuXG4gICAgcGF0Y2gobmV3Q2hpbGQgYXMgVm5vZGVXaXRoRG9tLCBvbGRDaGlsZCk7XG4gIH1cblxuICAvLyBSZW1vdmUgYW55IG9sZCBjaGlsZHJlbiB0aGF0IGFyZSBubyBsb25nZXIgcHJlc2VudCBpbiB0aGUgbmV3IHRyZWVcbiAgZm9yIChsZXQgaSA9IG5ld1RyZWUubGVuZ3RoOyBpIDwgb2xkVHJlZUxlbmd0aDsgaSsrKSB7XG4gICAgbmV3Vm5vZGUuZG9tLnJlbW92ZUNoaWxkKG9sZFRyZWVbaV0uZG9tKTtcbiAgfVxufVxuXG4vLyBVcGRhdGUgdGhlIG1haW4gVm5vZGVcbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGUoKTogdm9pZCB8IHN0cmluZyB7XG4gIC8vIElmIHRoZSBtYWluIFZub2RlIGV4aXN0c1xuICBpZiAobWFpblZub2RlKSB7XG4gICAgLy8gQ2FsbCBhbnkgY2xlYW51cCBmdW5jdGlvbnMgdGhhdCBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBvbkNsZWFudXBTZXQgc2V0XG4gICAgY2FsbFNldChvbkNsZWFudXBTZXQpO1xuICAgIC8vIFN0b3JlIGEgcmVmZXJlbmNlIHRvIHRoZSBvbGQgbWFpbiBWbm9kZVxuICAgIGxldCBvbGRNYWluVm5vZGUgPSBtYWluVm5vZGU7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IG1haW4gVm5vZGUgd2l0aCB0aGUgbWFpbiBjb21wb25lbnQgYXMgaXRzIG9ubHkgY2hpbGRcbiAgICBtYWluVm5vZGUgPSBuZXcgVm5vZGUob2xkTWFpblZub2RlLnRhZywgb2xkTWFpblZub2RlLnByb3BzLCBbbWFpbkNvbXBvbmVudF0pIGFzIFZub2RlV2l0aERvbTtcbiAgICBtYWluVm5vZGUuZG9tID0gb2xkTWFpblZub2RlLmRvbTtcbiAgICBtYWluVm5vZGUuaXNTVkcgPSBvbGRNYWluVm5vZGUuaXNTVkc7XG5cbiAgICAvLyBSZWN1cnNpdmVseSBwYXRjaCB0aGUgbmV3IGFuZCBvbGQgbWFpbiBWbm9kZXNcbiAgICBwYXRjaChtYWluVm5vZGUsIG9sZE1haW5Wbm9kZSk7XG5cbiAgICAvLyBDYWxsIGFueSB1cGRhdGUgb3IgbW91bnQgZnVuY3Rpb25zIHRoYXQgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgb25VcGRhdGVTZXQgb3Igb25Nb3VudFNldCBzZXRcbiAgICBjYWxsU2V0KGlzTW91bnRlZCA/IG9uVXBkYXRlU2V0IDogb25Nb3VudFNldCk7XG5cbiAgICAvLyBTZXQgdGhlIGlzTW91bnRlZCBmbGFnIHRvIHRydWVcbiAgICBpc01vdW50ZWQgPSB0cnVlO1xuXG4gICAgLy8gUmVzZXQgdGhlIGN1cnJlbnQgdm5vZGUsIG9sZFZub2RlLCBhbmQgY29tcG9uZW50IHByb3BlcnRpZXNcbiAgICBjdXJyZW50LnZub2RlID0gbnVsbDtcbiAgICBjdXJyZW50Lm9sZFZub2RlID0gbnVsbDtcbiAgICBjdXJyZW50LmNvbXBvbmVudCA9IG51bGw7XG5cbiAgICAvLyBJZiB0aGUgY29kZSBpcyBydW5uaW5nIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudCwgcmV0dXJuIHRoZSBpbm5lciBIVE1MIG9mIHRoZSBtYWluIFZub2RlJ3MgZG9tIGVsZW1lbnRcbiAgICBpZiAoaXNOb2RlSnMpIHtcbiAgICAgIHJldHVybiBtYWluVm5vZGUuZG9tLmlubmVySFRNTDtcbiAgICB9XG4gIH1cbn1cblxuLy8gVXBkYXRlIGN1c3RvbSBWbm9kZVxuLy8gSXQgaXMgYXNzdW1lZCB0aGF0IGEgZmlyc3QgbW91bnQgaGFzIGFscmVhZHkgb2NjdXJyZWQsIHNvLFxuLy8gdGhlIG9sZFZub2RlIGlzIG5vdCBudWxsIGFuZCB0aGUgZG9tIHByb3BlcnR5IG9mIHRoZSBvbGRWbm9kZSBpcyBub3QgbnVsbFxuLy8gWW91IG5lZWQgdG8gc2V0IHRoZSBkb20gcHJvcGVydHkgb2YgdGhlIG5ld1Zub2RlIHRvIHRoZSBkb20gcHJvcGVydHkgb2YgdGhlIG9sZFZub2RlXG4vLyBUaGUgc2FtZSB3aXRoIHRoZSBpc1NWRyBwcm9wZXJ0eVxuLy8gUHJlZmVyIHRoaXMgZnVuY3Rpb24gb3ZlciBwYXRjaCB0byBhbGxvdyBmb3IgY2xlYW51cCwgb25VcGRhdGUgYW5kIG9uTW91bnQgc2V0cyB0byBiZSBjYWxsZWRcbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVWbm9kZSh2bm9kZTogVm5vZGVXaXRoRG9tLCBvbGRWbm9kZTogVm5vZGVXaXRoRG9tKTogc3RyaW5nIHwgdm9pZCB7XG4gIC8vIENhbGwgYW55IGNsZWFudXAgZnVuY3Rpb25zIHRoYXQgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgb25DbGVhbnVwU2V0IHNldFxuICBjYWxsU2V0KG9uQ2xlYW51cFNldCk7XG5cbiAgLy8gUmVjdXJzaXZlbHkgcGF0Y2ggdGhlIG5ldyBhbmQgb2xkIG1haW4gVm5vZGVzXG4gIHBhdGNoKHZub2RlLCBvbGRWbm9kZSk7XG5cbiAgLy8gU2V0IHRoZSBvbGRWbm9kZSdzIHRhZywgcHJvcHMsIGNoaWxkcmVuLCBkb20sIGFuZCBpc1NWRyBwcm9wZXJ0aWVzIHRvIHRoZSBuZXdWbm9kZSdzIHRhZywgcHJvcHMsIGNoaWxkcmVuLCBkb20sIGFuZCBpc1NWRyBwcm9wZXJ0aWVzXG4gIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGFsbG93IGZvciB0aGUgb2xkVm5vZGUgdG8gYmUgdXNlZCBhcyB0aGUgbmV3Vm5vZGUgaW4gdGhlIG5leHQgdXBkYXRlIHdpdGggdGhlIG5vcm1hbCB1cGRhdGUgZnVuY3Rpb25cbiAgb2xkVm5vZGUudGFnID0gdm5vZGUudGFnO1xuICBvbGRWbm9kZS5wcm9wcyA9IHsgLi4udm5vZGUucHJvcHMgfTtcbiAgb2xkVm5vZGUuY2hpbGRyZW4gPSBbLi4udm5vZGUuY2hpbGRyZW5dO1xuICBvbGRWbm9kZS5kb20gPSB2bm9kZS5kb207XG4gIG9sZFZub2RlLmlzU1ZHID0gdm5vZGUuaXNTVkc7XG5cbiAgLy8gQ2FsbCBhbnkgdXBkYXRlIG9yIG1vdW50IGZ1bmN0aW9ucyB0aGF0IGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIG9uVXBkYXRlU2V0IG9yIG9uTW91bnRTZXQgc2V0XG4gIGNhbGxTZXQoaXNNb3VudGVkID8gb25VcGRhdGVTZXQgOiBvbk1vdW50U2V0KTtcblxuICAvLyBTZXQgdGhlIGlzTW91bnRlZCBmbGFnIHRvIHRydWVcbiAgaXNNb3VudGVkID0gdHJ1ZTtcblxuICAvLyBSZXNldCB0aGUgY3VycmVudCB2bm9kZSwgb2xkVm5vZGUsIGFuZCBjb21wb25lbnQgcHJvcGVydGllc1xuICBjdXJyZW50LnZub2RlID0gbnVsbDtcbiAgY3VycmVudC5vbGRWbm9kZSA9IG51bGw7XG4gIGN1cnJlbnQuY29tcG9uZW50ID0gbnVsbDtcblxuICBpZiAoaXNOb2RlSnMpIHtcbiAgICByZXR1cm4gdm5vZGUuZG9tLmlubmVySFRNTDtcbiAgfVxufVxuXG4vLyBVbm1vdW50IHRoZSBtYWluIFZub2RlXG5leHBvcnQgZnVuY3Rpb24gdW5tb3VudCgpIHtcbiAgLy8gSWYgdGhlIG1haW4gVm5vZGUgZXhpc3RzXG4gIGlmIChtYWluVm5vZGUpIHtcbiAgICAvLyBTZXQgdGhlIG1haW4gY29tcG9uZW50IHRvIGEgbnVsbCBWbm9kZVxuICAgIG1haW5Db21wb25lbnQgPSBuZXcgVm5vZGUoKCkgPT4gbnVsbCwge30sIFtdKSBhcyBWbm9kZUNvbXBvbmVudEludGVyZmFjZTtcbiAgICAvLyBVcGRhdGUgdGhlIG1haW4gVm5vZGVcbiAgICBsZXQgcmVzdWx0ID0gdXBkYXRlKCk7XG4gICAgLy8gQ2FsbCBhbnkgdW5tb3VudCBmdW5jdGlvbnMgdGhhdCBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBvblVubW91bnRTZXQgc2V0XG4gICAgY2FsbFNldChvblVubW91bnRTZXQpO1xuXG4gICAgLy8gUmVtb3ZlIGFueSBldmVudCBsaXN0ZW5lcnMgdGhhdCB3ZXJlIGFkZGVkIHRvIHRoZSBtYWluIFZub2RlJ3MgZG9tIGVsZW1lbnRcbiAgICBmb3IgKGxldCBuYW1lIGluIGV2ZW50TGlzdGVuZXJOYW1lcykge1xuICAgICAgbWFpblZub2RlLmRvbS5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUuc2xpY2UoMikudG9Mb3dlckNhc2UoKSwgZXZlbnRMaXN0ZW5lcik7XG4gICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGV2ZW50TGlzdGVuZXJOYW1lcywgbmFtZSk7XG4gICAgfVxuXG4gICAgLy8gUmVzZXQgdGhlIG1haW4gY29tcG9uZW50IGFuZCBtYWluIFZub2RlXG4gICAgbWFpbkNvbXBvbmVudCA9IG51bGw7XG4gICAgbWFpblZub2RlID0gbnVsbDtcbiAgICAvLyBTZXQgdGhlIGlzTW91bnRlZCBmbGFnIHRvIGZhbHNlXG4gICAgaXNNb3VudGVkID0gZmFsc2U7XG4gICAgLy8gUmVzZXQgdGhlIGN1cnJlbnQgdm5vZGUsIG9sZFZub2RlLCBhbmQgY29tcG9uZW50IHByb3BlcnRpZXNcbiAgICBjdXJyZW50LnZub2RlID0gbnVsbDtcbiAgICBjdXJyZW50Lm9sZFZub2RlID0gbnVsbDtcbiAgICBjdXJyZW50LmNvbXBvbmVudCA9IG51bGw7XG4gICAgLy8gUmV0dXJuIHRoZSByZXN1bHQgb2YgdXBkYXRpbmcgdGhlIG1haW4gVm5vZGVcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4vLyBUaGlzIGZ1bmN0aW9uIHRha2VzIGluIGEgRE9NIGVsZW1lbnQgb3IgYSBET00gZWxlbWVudCBzZWxlY3RvciBhbmQgYSBjb21wb25lbnQgdG8gYmUgbW91bnRlZCBvbiBpdC5cbmV4cG9ydCBmdW5jdGlvbiBtb3VudChkb20sIGNvbXBvbmVudCkge1xuICAvLyBDaGVjayBpZiB0aGUgJ2RvbScgYXJndW1lbnQgaXMgYSBzdHJpbmcuIElmIGl0IGlzLCBzZWxlY3QgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBzZWxlY3Rvci5cbiAgLy8gT3RoZXJ3aXNlLCB1c2UgdGhlICdkb20nIGFyZ3VtZW50IGFzIHRoZSBjb250YWluZXIuXG4gIGxldCBjb250YWluZXIgPVxuICAgIHR5cGVvZiBkb20gPT09IFwic3RyaW5nXCJcbiAgICAgID8gaXNOb2RlSnNcbiAgICAgICAgPyBjcmVhdGVEb21FbGVtZW50KGRvbSwgZG9tID09PSBcInN2Z1wiKVxuICAgICAgICA6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZG9tKVswXVxuICAgICAgOiBkb207XG5cbiAgLy8gQ2hlY2sgaWYgdGhlICdjb21wb25lbnQnIGFyZ3VtZW50IGlzIGEgVm5vZGUgY29tcG9uZW50IG9yIGEgcmVndWxhciBjb21wb25lbnQuXG4gIC8vIElmIGl0J3MgYSByZWd1bGFyIGNvbXBvbmVudCwgY3JlYXRlIGEgbmV3IFZub2RlIGNvbXBvbmVudCB1c2luZyB0aGUgJ2NvbXBvbmVudCcgYXJndW1lbnQgYXMgdGhlIHRhZy5cbiAgLy8gSWYgaXQncyBub3QgYSBjb21wb25lbnQgYXQgYWxsLCBjcmVhdGUgYSBuZXcgVm5vZGUgY29tcG9uZW50IHdpdGggdGhlICdjb21wb25lbnQnIGFyZ3VtZW50IGFzIHRoZSByZW5kZXJpbmcgZnVuY3Rpb24uXG4gIGxldCB2bm9kZUNvbXBvbmVudCA9IGlzVm5vZGVDb21wb25lbnQoY29tcG9uZW50KVxuICAgID8gY29tcG9uZW50XG4gICAgOiBpc0NvbXBvbmVudChjb21wb25lbnQpXG4gICAgPyBuZXcgVm5vZGUoY29tcG9uZW50LCB7fSwgW10pXG4gICAgOiBuZXcgVm5vZGUoKCkgPT4gY29tcG9uZW50LCB7fSwgW10pO1xuXG4gIC8vIElmIGEgbWFpbiBjb21wb25lbnQgYWxyZWFkeSBleGlzdHMgYW5kIGl0J3Mgbm90IHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50ICd2bm9kZUNvbXBvbmVudCcsIHVubW91bnQgaXQuXG4gIGlmIChtYWluQ29tcG9uZW50ICYmIG1haW5Db21wb25lbnQudGFnICE9PSB2bm9kZUNvbXBvbmVudC50YWcpIHtcbiAgICB1bm1vdW50KCk7XG4gIH1cblxuICAvLyBTZXQgdGhlICd2bm9kZUNvbXBvbmVudCcgYXMgdGhlIG1haW4gY29tcG9uZW50LlxuICBtYWluQ29tcG9uZW50ID0gdm5vZGVDb21wb25lbnQgYXMgVm5vZGVDb21wb25lbnRJbnRlcmZhY2U7XG4gIC8vIENvbnZlcnQgdGhlIGNvbnRhaW5lciBlbGVtZW50IHRvIGEgVm5vZGUuXG4gIG1haW5Wbm9kZSA9IGRvbVRvVm5vZGUoY29udGFpbmVyKTtcbiAgLy8gVXBkYXRlIHRoZSBET00gd2l0aCB0aGUgbmV3IGNvbXBvbmVudC5cbiAgcmV0dXJuIHVwZGF0ZSgpO1xufVxuXG4vLyBUaGlzIGlzIGEgdXRpbGl0eSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgVm5vZGUgb2JqZWN0cy5cbi8vIEl0IHRha2VzIGluIGEgdGFnIG9yIGNvbXBvbmVudCwgYW5kIG9wdGlvbmFsIHByb3BzIGFuZCBjaGlsZHJlbiBhcmd1bWVudHMuXG5leHBvcnQgY29uc3QgdjogViA9ICh0YWdPckNvbXBvbmVudCwgcHJvcHMgPSB7fSwgLi4uY2hpbGRyZW4pID0+IHtcbiAgLy8gUmV0dXJuIGEgbmV3IFZub2RlIG9iamVjdCB1c2luZyB0aGUgZ2l2ZW4gYXJndW1lbnRzLlxuICByZXR1cm4gbmV3IFZub2RlKHRhZ09yQ29tcG9uZW50LCBwcm9wcyB8fCB7fSwgY2hpbGRyZW4pO1xufTtcblxuLy8gVGhpcyB1dGlsaXR5IGZ1bmN0aW9uIGNyZWF0ZXMgYSBmcmFnbWVudCBWbm9kZS5cbi8vIEl0IHRha2VzIGluIGEgcGxhY2Vob2xkZXIgYW5kIHRoZSBjaGlsZHJlbiBhcmd1bWVudHMsIHJldHVybnMgb25seSB0aGUgY2hpbGRyZW4uXG52LmZyYWdtZW50ID0gKF86IFZub2RlUHJvcGVydGllcywgLi4uY2hpbGRyZW46IENoaWxkcmVuKSA9PiBjaGlsZHJlbjtcbiJdLCJtYXBwaW5ncyI6Ik1Ba0lBLElBQU1BLEVBQVUsUUFJTEMsRUFBV0MsUUFBMkIsb0JBQVpDLFNBQTJCQSxRQUFRQyxVQUFZRCxRQUFRQyxTQUFTQyxNQUk5RixTQUFTQyxFQUFpQkMsRUFBYUMsR0FBaUIsR0FDN0QsT0FBT0EsRUFBUUMsU0FBU0MsZ0JBQWdCLDZCQUE4QkgsR0FBT0UsU0FBU0UsY0FBY0osRUFDdEcsQ0FNTyxJQUFNSyxFQUFRLFNBQXFDTCxFQUFhTSxFQUF3QkMsR0FFN0ZDLEtBQUtSLElBQU1BLEVBQ1hRLEtBQUtGLE1BQVFBLEVBQ2JFLEtBQUtELFNBQVdBLENBQ2xCLEVBSU8sU0FBU0UsRUFBWUMsR0FDMUIsT0FBT0EsSUFBbUMsbUJBQWRBLEdBQWtELGlCQUFkQSxHQUEwQixTQUFVQSxFQUN0RyxDQUdPLElBQU1DLEVBQVdDLEdBRWZBLGFBQWtCUCxFQUtkUSxFQUFvQkQsR0FFeEJELEVBQVFDLElBQVdILEVBQVlHLEVBQU9aLEtBSS9DLFNBQVNjLEVBQVdDLEdBQ2xCLElBQUlSLEVBQTJCLEdBRS9CLFFBQVNTLEVBQUksRUFBR0MsRUFBSUYsRUFBSUcsV0FBV0MsT0FBUUgsRUFBSUMsRUFBR0QsSUFBSyxDQUNyRCxJQUFJSSxFQUFXTCxFQUFJRyxXQUFXRixHQUk5QixHQUEwQixJQUF0QkksRUFBU0Ms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 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ0ZXh0VGFnIiwiaXNOb2RlSnMiLCJCb29sZWFuIiwicHJvY2VzcyIsInZlcnNpb25zIiwibm9kZSIsImNyZWF0ZURvbUVsZW1lbnQiLCJ0YWciLCJpc1NWRyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudE5TIiwiY3JlYXRlRWxlbWVudCIsIlZub2RlIiwicHJvcHMiLCJjaGlsZHJlbiIsInRoaXMiLCJpc0NvbXBvbmVudCIsImNvbXBvbmVudCIsImlzVm5vZGUiLCJvYmplY3QiLCJpc1Zub2RlQ29tcG9uZW50IiwiZG9tVG9Wbm9kZSIsImRvbSIsIm5vZGVUeXBlIiwidm5vZGUiLCJub2RlVmFsdWUiLCJpIiwibCIsImNoaWxkTm9kZXMiLCJsZW5ndGgiLCJjaGlsZERvbSIsInB1c2giLCJhdHRyaWJ1dGVzIiwiYXR0ciIsIm5vZGVOYW1lIiwidGFnTmFtZSIsInRvTG93ZXJDYXNlIiwidHJ1c3QiLCJodG1sU3RyaW5nIiwiZGl2IiwiaW5uZXJIVE1MIiwidHJpbSIsIm1hcCIsImNhbGwiLCJpdGVtIiwibWFpbkNvbXBvbmVudCIsIm1haW5Wbm9kZSIsImlzTW91bnRlZCIsImN1cnJlbnQiLCJvbGRWbm9kZSIsImV2ZW50IiwicmVzZXJ2ZWRQcm9wcyIsImtleSIsInN0YXRlIiwib25DbGVhbnVwU2V0IiwiU2V0Iiwib25Nb3VudFNldCIsIm9uVXBkYXRlU2V0Iiwib25Vbm1vdW50U2V0Iiwib25DbGVhbnVwIiwiY2FsbGJhY2siLCJhZGQiLCJjYWxsU2V0Iiwic2V0IiwiY2xlYXIiLCJldmVudExpc3RlbmVyTmFtZXMiLCJldmVudExpc3RlbmVyIiwiZSIsInRhcmdldCIsIm5hbWUiLCJ0eXBlIiwiZGVmYXVsdFByZXZlbnRlZCIsInVwZGF0ZSIsInBhcmVudE5vZGUiLCJoaWRlRGlyZWN0aXZlIiwidGVzdCIsImJvb2wiLCJvbGRub2RlIiwibmV3ZG9tIiwiY3JlYXRlVGV4dE5vZGUiLCJyZXBsYWNlQ2hpbGQiLCJkaXJlY3RpdmVzIiwibmV3Q2hpbGRyZW4iLCJzdHlsZSIsImRpc3BsYXkiLCJjbGFzc2VzIiwiY2xhc3NMaXN0IiwidG9nZ2xlIiwiaHRtbCIsIm1vZGVsIiwicHJvcGVydHkiLCJ2YWx1ZSIsImhhbmRsZXIiLCJBcnJheSIsImlzQXJyYXkiLCJ2YWwiLCJpZHgiLCJpbmRleE9mIiwic3BsaWNlIiwic2hhcmVkU2V0QXR0cmlidXRlIiwibXVsdGlwbGUiLCJjdHJsS2V5IiwiZm9yRWFjaCIsImNoaWxkIiwiam9pbiIsInNlbGVjdGVkIiwicHJldkhhbmRsZXIiLCJjbGVhbnVwIiwibmV3Vm5vZGUiLCJhZGRFdmVudExpc3RlbmVyIiwic2xpY2UiLCJyZW1vdmVBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJ1cGRhdGVBdHRyaWJ1dGVzIiwicGF0Y2giLCJ0ZXh0Q29udGVudCIsIm5ld1RyZWUiLCJvbGRUcmVlIiwib2xkVHJlZUxlbmd0aCIsIm5ld1RyZWVMZW5ndGgiLCJvbGRLZXllZExpc3QiLCJuZXdLZXllZExpc3QiLCJuZXdDaGlsZCIsIm9sZENoaWxkIiwic2hvdWxkUGF0Y2giLCJhcHBlbmRDaGlsZCIsInJlbW92ZUNoaWxkIiwidmlldyIsImJpbmQiLCJvbGRNYWluVm5vZGUiLCJ1bm1vdW50IiwicmVzdWx0IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIlJlZmxlY3QiLCJkZWxldGVQcm9wZXJ0eSIsInYiLCJ0YWdPckNvbXBvbmVudCIsImZyYWdtZW50IiwiXyIsImRpcmVjdGl2ZSIsImRpcmVjdGl2ZU5hbWUiLCJjb250YWluZXIiLCJxdWVyeVNlbGVjdG9yQWxsIiwidm5vZGVDb21wb25lbnQiXSwic291cmNlcyI6WyIuLi9saWIvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdXNlLWJlZm9yZS1kZWZpbmUgKi9cbi8qIGVzbGludC1kaXNhYmxlIGluZGVudCAqL1xuLyogZXNsaW50LWRpc2FibGUgc29uYXJqcy9jb2duaXRpdmUtY29tcGxleGl0eSAqL1xuLyogZXNsaW50LWRpc2FibGUgY29tcGxleGl0eSAqL1xuXG4vLyBUaGUgVm5vZGVQcm9wZXJ0aWVzIGludGVyZmFjZSByZXByZXNlbnRzIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIGEgdmlydHVhbCBub2RlLlxuZXhwb3J0IGludGVyZmFjZSBWbm9kZVByb3BlcnRpZXMge1xuICAvLyBBIHVuaXF1ZSBrZXkgZm9yIHRoZSB2aXJ0dWFsIG5vZGUsIHdoaWNoIGNhbiBiZSBhIHN0cmluZyBvciBhIG51bWJlci5cbiAgLy8gVGhpcyBpcyB1c2VmdWwgZm9yIG9wdGltaXppbmcgdXBkYXRlcyBpbiBhIGxpc3Qgb2Ygbm9kZXMuXG4gIGtleT86IHN0cmluZyB8IG51bWJlcjtcbiAgLy8gQSBzdGF0ZSBvYmplY3QgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHZpcnR1YWwgbm9kZS5cbiAgc3RhdGU/OiBhbnk7XG4gIC8vIEFuIGluZGV4IHNpZ25hdHVyZSB0aGF0IGFsbG93cyBmb3IgYW55IG90aGVyIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQuXG4gIFtrZXk6IHN0cmluZyB8IG51bWJlciB8IHN5bWJvbF06IGFueTtcbn1cblxuLy8gVGhlIERvbUVsZW1lbnQgaW50ZXJmYWNlIGV4dGVuZHMgdGhlIEVsZW1lbnQgaW50ZXJmYWNlIHdpdGggYW4gaW5kZXggc2lnbmF0dXJlLlxuLy8gVGhpcyBhbGxvd3MgZm9yIGFueSBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gRE9NIGVsZW1lbnRzLlxuZXhwb3J0IGludGVyZmFjZSBEb21FbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLy8gVGhlIFZub2RlSW50ZXJmYWNlIHJlcHJlc2VudHMgYSB2aXJ0dWFsIG5vZGUuIEl0IGhhcyBhIG51bWJlciBvZiBvcHRpb25hbCBmaWVsZHMsXG4vLyBpbmNsdWRpbmcgYSB0YWcsIHByb3BzLCBjaGlsZHJlbiwgYW5kIGEgRE9NIGVsZW1lbnQuXG5leHBvcnQgaW50ZXJmYWNlIFZub2RlSW50ZXJmYWNlIHtcbiAgLy8gVGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdmlydHVhbCBub2RlLiBJdCB0YWtlcyBhIHRhZywgcHJvcHMsIGFuZCBjaGlsZHJlbiBhcyBhcmd1bWVudHMuXG4gIC8vIFRoZSB0YWcgY2FuIGJlIGEgc3RyaW5nLCBhIGNvbXBvbmVudCwgb3IgYSBQT0pPIGNvbXBvbmVudC5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIG5ldyAodGFnOiBzdHJpbmcgfCBDb21wb25lbnQgfCBQT0pPQ29tcG9uZW50LCBwcm9wczogVm5vZGVQcm9wZXJ0aWVzLCBjaGlsZHJlbjogQ2hpbGRyZW4pOiBWbm9kZUludGVyZmFjZTtcbiAgLy8gVGhlIHRhZyBmb3IgdGhlIHZpcnR1YWwgbm9kZS4gSXQgY2FuIGJlIGEgc3RyaW5nLCBhIGNvbXBvbmVudCwgb3IgYSBQT0pPIGNvbXBvbmVudC5cbiAgdGFnOiBzdHJpbmcgfCBDb21wb25lbnQgfCBQT0pPQ29tcG9uZW50O1xuICAvLyBUaGUgcHJvcHMgZm9yIHRoZSB2aXJ0dWFsIG5vZGUuXG4gIHByb3BzOiBWbm9kZVByb3BlcnRpZXM7XG4gIC8vIFRoZSBjaGlsZHJlbiBmb3IgdGhlIHZpcnR1YWwgbm9kZS5cbiAgY2hpbGRyZW46IENoaWxkcmVuO1xuICAvLyBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB2aXJ0dWFsIG5vZGUgaXMgYW4gU1ZHIGVsZW1lbnQuXG4gIGlzU1ZHPzogYm9vbGVhbjtcbiAgLy8gVGhlIERPTSBlbGVtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHZpcnR1YWwgbm9kZS5cbiAgZG9tPzogRG9tRWxlbWVudDtcbiAgLy8gQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgdmlydHVhbCBub2RlIGhhcyBiZWVuIHByb2Nlc3NlZCBpbiB0aGUga2V5ZWQgZGlmZmluZyBhbGdvcml0aG0uXG4gIHByb2Nlc3NlZD86IGJvb2xlYW47XG4gIC8vIEFuIGluZGV4IHNpZ25hdHVyZSB0aGF0IGFsbG93cyBmb3IgYW55IGFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBiZSBhZGRlZCB0byB0aGUgdmlydHVhbCBub2RlLlxuICBba2V5OiBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2xdOiBhbnk7XG59XG5cbi8vIFRoZSBWbm9kZVdpdGhEb20gaW50ZXJmYWNlIHJlcHJlc2VudHMgYSB2aXJ0dWFsIG5vZGUgdGhhdCBoYXMgYSBET00gZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggaXQuXG5leHBvcnQgaW50ZXJmYWNlIFZub2RlV2l0aERvbSBleHRlbmRzIFZub2RlSW50ZXJmYWNlIHtcbiAgZG9tOiBEb21FbGVtZW50O1xufVxuXG4vLyBUaGUgQ29tcG9uZW50IGludGVyZmFjZSByZXByZXNlbnRzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgdmlydHVhbCBub2RlIG9yIGEgbGlzdCBvZiB2aXJ0dWFsIG5vZGVzLlxuLy8gSXQgY2FuIGFsc28gaGF2ZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudCB7XG4gIC8vIFRoZSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSB2aXJ0dWFsIG5vZGUgb3IgYSBsaXN0IG9mIHZpcnR1YWwgbm9kZXMuXG4gIC8vIEl0IGNhbiB0YWtlIHByb3BzIGFuZCBjaGlsZHJlbiBhcyBhcmd1bWVudHMuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAocHJvcHM/OiBWbm9kZVByb3BlcnRpZXMgfCBudWxsLCAuLi5jaGlsZHJlbjogYW55W10pOiBWbm9kZUludGVyZmFjZSB8IENoaWxkcmVuIHwgYW55O1xuICAvLyBBbiBpbmRleCBzaWduYXR1cmUgdGhhdCBhbGxvd3MgZm9yIGFueSBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGNvbXBvbmVudC5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vLyBUaGUgUE9KT0NvbXBvbmVudCBpbnRlcmZhY2UgcmVwcmVzZW50cyBhIFwicGxhaW4gb2xkIEphdmFTY3JpcHQgb2JqZWN0XCIgKFBPSk8pIGNvbXBvbmVudC5cbi8vIEl0IGhhcyBhIHZpZXcgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgdmlydHVhbCBub2RlIG9yIGEgbGlzdCBvZiB2aXJ0dWFsIG5vZGVzLFxuLy8gYXMgd2VsbCBhcyBvcHRpb25hbCBwcm9wcyBhbmQgY2hpbGRyZW4uXG4vLyBJdCBjYW4gYmUgdXNlZCBhbHNvIHRvIGlkZW50aWZ5IGNsYXNzIGluc3RhbmNlIGNvbXBvbmVudHMuXG5leHBvcnQgaW50ZXJmYWNlIFBPSk9Db21wb25lbnQge1xuICAvLyBUaGUgdmlldyBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSB2aXJ0dWFsIG5vZGUgb3IgYSBsaXN0IG9mIHZpcnR1YWwgbm9kZXMuXG4gIHZpZXc6IENvbXBvbmVudDtcbiAgLy8gVGhlIHByb3BzIGZvciB0aGUgY29tcG9uZW50LlxuICBwcm9wcz86IFZub2RlUHJvcGVydGllcyB8IG51bGw7XG4gIC8vIFRoZSBjaGlsZHJlbiBmb3IgdGhlIGNvbXBvbmVudC5cbiAgY2hpbGRyZW4/OiBhbnlbXTtcbiAgLy8gQW4gaW5kZXggc2lnbmF0dXJlIHRoYXQgYWxsb3dzIGZvciBhbnkgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIHRvIHRoZSBQT0pPIGNvbXBvbmVudC5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vLyBUaGUgVm5vZGVDb21wb25lbnRJbnRlcmZhY2UgcmVwcmVzZW50cyBhIHZpcnR1YWwgbm9kZSB0aGF0IGhhcyBhIGNvbXBvbmVudCBhcyBpdHMgdGFnLlxuLy8gSXQgaGFzIHByb3BzIGFuZCBjaGlsZHJlbiwganVzdCBsaWtlIGEgcmVndWxhciB2aXJ0dWFsIG5vZGUuXG5leHBvcnQgaW50ZXJmYWNlIFZub2RlQ29tcG9uZW50SW50ZXJmYWNlIGV4dGVuZHMgVm5vZGVJbnRlcmZhY2Uge1xuICB0YWc6IENvbXBvbmVudCB8IFBPSk9Db21wb25lbnQ7XG4gIHByb3BzOiBWbm9kZVByb3BlcnRpZXM7XG4gIGNoaWxkcmVuOiBDaGlsZHJlbjtcbn1cblxuLy8gVGhlIENoaWxkcmVuIGludGVyZmFjZSByZXByZXNlbnRzIGEgbGlzdCBvZiB2aXJ0dWFsIG5vZGVzIG9yIG90aGVyIHZhbHVlcy5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hpbGRyZW4gZXh0ZW5kcyBBcnJheTxWbm9kZUludGVyZmFjZSB8IFZub2RlQ29tcG9uZW50SW50ZXJmYWNlIHwgYW55PiB7fVxuXG4vLyBUaGUgRGlyZWN0aXZlIGludGVyZmFjZSByZXByZXNlbnRzIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIHZpcnR1YWwgbm9kZS5cbi8vIEl0IHJlY2VpdmVzIHRoZSB2YWx1ZSwgdmlydHVhbCBub2RlLCBhbmQgb2xkIHZpcnR1YWwgbm9kZSBhcyBhcmd1bWVudHMsIGFuZCBjYW4gcmV0dXJuIGEgYm9vbGVhbiB2YWx1ZS5cbi8vIElmIG9ubHkgdGhlIHZpcnR1YWwgbm9kZSBpcyBwYXNzZWQsIGl0IG1lYW5zIGl0cyB0aGUgb24gY3JlYXRlIHBoYXNlIGZvciB0aGUgdi1ub2RlLlxuLy8gSWYgdGhlIG9sZCB2aXJ0dWFsIG5vZGUgaXMgYWxzbyBwYXNzZWQsIGl0IG1lYW5zIGl0cyB0aGUgb24gdXBkYXRlIHBoYXNlIGZvciB0aGUgdi1ub2RlLlxuZXhwb3J0IGludGVyZmFjZSBEaXJlY3RpdmUge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgKHZhbHVlOiBhbnksIHZub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tKTogdm9pZCB8IGJvb2xlYW47XG59XG5cbi8vIFRoZSBEaXJlY3RpdmVzIGludGVyZmFjZSBpcyBhIG1hcHBpbmcgb2YgZGlyZWN0aXZlIG5hbWVzIHRvIERpcmVjdGl2ZSBmdW5jdGlvbnMuXG5leHBvcnQgaW50ZXJmYWNlIERpcmVjdGl2ZXMge1xuICBba2V5OiBzdHJpbmddOiBEaXJlY3RpdmU7XG59XG5cbi8vIFRoZSBSZXNlcnZlZFByb3BzIGludGVyZmFjZSBpcyBhIG1hcHBpbmcgb2YgcmVzZXJ2ZWQgcHJvcCBuYW1lcyB0byB0aGUgdmFsdWUgYHRydWVgLlxuLy8gVGhlc2UgcHJvcCBuYW1lcyBjYW5ub3QgYmUgdXNlZCBhcyBjdXN0b20gcHJvcCBuYW1lcy5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzZXJ2ZWRQcm9wcyB7XG4gIFtrZXk6IHN0cmluZ106IHRydWU7XG59XG5cbi8vIFRoZSBDdXJyZW50IGludGVyZmFjZSByZXByZXNlbnRzIHRoZSBjdXJyZW50IGNvbXBvbmVudCBhbmQgdmlydHVhbCBub2RlIHRoYXQgYXJlIGJlaW5nIHByb2Nlc3NlZC5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VycmVudCB7XG4gIC8vIFRoZSBjdXJyZW50IGNvbXBvbmVudC4gSXQgY2FuIGJlIGEgY29tcG9uZW50LCBhIFBPSk8gY29tcG9uZW50LCBvciBudWxsLlxuICBjb21wb25lbnQ6IENvbXBvbmVudCB8IFBPSk9Db21wb25lbnQgfCBudWxsO1xuICAvLyBUaGUgY3VycmVudCB2aXJ0dWFsIG5vZGUuIEl0IG11c3QgaGF2ZSBhIERPTSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCBpdC5cbiAgdm5vZGU6IFZub2RlV2l0aERvbSB8IG51bGw7XG4gIC8vIFRoZSBvbGQgdmlydHVhbCBub2RlLiBJdCBtdXN0IGhhdmUgYSBET00gZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggaXQuXG4gIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tIHwgbnVsbDtcbiAgLy8gVGhlIGN1cnJlbnQgZXZlbnQuIEl0IGNhbiBiZSBhbiBldmVudCBvciBudWxsLlxuICBldmVudDogRXZlbnQgfCBudWxsO1xufVxuXG4vLyBUaGUgViBmdW5jdGlvbiBpcyB0aGUgbWFpbiBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgdmlydHVhbCBub2Rlcy5cbi8vIEl0IHRha2VzIGEgdGFnIG9yIGNvbXBvbmVudCwgcHJvcHMsIGFuZCBjaGlsZHJlbiBhcyBhcmd1bWVudHMsIGFuZCByZXR1cm5zIGEgdmlydHVhbCBub2RlLlxuZXhwb3J0IGludGVyZmFjZSBWIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzLCBuby11c2UtYmVmb3JlLWRlZmluZVxuICAodGFnT3JDb21wb25lbnQ6IHN0cmluZyB8IENvbXBvbmVudCB8IFBPSk9Db21wb25lbnQsIHByb3BzOiBWbm9kZVByb3BlcnRpZXMgfCBudWxsLCAuLi5jaGlsZHJlbjogQ2hpbGRyZW4pOlxuICAgIHwgVm5vZGVJbnRlcmZhY2VcbiAgICB8IFZub2RlQ29tcG9uZW50SW50ZXJmYWNlO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnMsIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gIGZyYWdtZW50KF86IGFueSwgLi4uY2hpbGRyZW46IENoaWxkcmVuKTogQ2hpbGRyZW47XG59XG4vLyAndGV4dFRhZycgaXMgYSBjb25zdGFudCBzdHJpbmcgdGhhdCBpcyB1c2VkIHRvIHJlcHJlc2VudCB0ZXh0IG5vZGVzIGluIHRoZSB2aXJ0dWFsIERPTS5cbmNvbnN0IHRleHRUYWcgPSBcIiN0ZXh0XCI7XG5cbi8vICdpc05vZGVKcycgaXMgYSBib29sZWFuIHRoYXQgaXMgdHJ1ZSBpZiB0aGUgY29kZSBpcyBydW5uaW5nIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLlxuLy8gSXQgaXMgZGV0ZXJtaW5lZCBieSBjaGVja2luZyBpZiB0aGUgJ3Byb2Nlc3MnIGdsb2JhbCBvYmplY3QgaXMgZGVmaW5lZCBhbmQgaGFzIGEgJ3ZlcnNpb25zJyBwcm9wZXJ0eS5cbmV4cG9ydCBsZXQgaXNOb2RlSnMgPSBCb29sZWFuKHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MudmVyc2lvbnMgJiYgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlKTtcblxuLy8gJ2NyZWF0ZURvbUVsZW1lbnQnIGlzIGEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGEgbmV3IERPTSBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCB0YWcgbmFtZS5cbi8vIElmICdpc1NWRycgaXMgdHJ1ZSwgaXQgY3JlYXRlcyBhbiBTVkcgZWxlbWVudCBpbnN0ZWFkIG9mIGEgcmVndWxhciBET00gZWxlbWVudC5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEb21FbGVtZW50KHRhZzogc3RyaW5nLCBpc1NWRzogYm9vbGVhbiA9IGZhbHNlKTogRG9tRWxlbWVudCB7XG4gIHJldHVybiBpc1NWRyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIHRhZykgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XG59XG5cbi8vICdWbm9kZScgaXMgYSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgYSB2aXJ0dWFsIERPTSBub2RlLlxuLy8gSXQgaGFzIHRocmVlIHByb3BlcnRpZXM6ICd0YWcnLCAncHJvcHMnLCBhbmQgJ2NoaWxkcmVuJy5cbi8vICdWbm9kZScgaXMgZXhwb3J0ZWQgYXMgYW4gb2JqZWN0IHdpdGggYSB0eXBlIG9mICdWbm9kZUludGVyZmFjZScuXG4vLyBUaGUgJ2FzIHVua25vd24gYXMgVm5vZGVJbnRlcmZhY2UnIGlzIHVzZWQgdG8gdGVsbCBUeXBlU2NyaXB0IHRoYXQgdGhlICdWbm9kZScgZnVuY3Rpb24gaGFzIHRoZSBzYW1lIHR5cGUgYXMgJ1Zub2RlSW50ZXJmYWNlJy5cbmV4cG9ydCBjb25zdCBWbm9kZSA9IGZ1bmN0aW9uIFZub2RlKHRoaXM6IFZub2RlSW50ZXJmYWNlLCB0YWc6IHN0cmluZywgcHJvcHM6IFZub2RlUHJvcGVydGllcywgY2hpbGRyZW46IENoaWxkcmVuKSB7XG4gIC8vICd0aGlzJyByZWZlcnMgdG8gdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgJ1Zub2RlJy5cbiAgdGhpcy50YWcgPSB0YWc7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xufSBhcyB1bmtub3duIGFzIFZub2RlSW50ZXJmYWNlO1xuXG4vLyAnaXNDb21wb25lbnQnIGlzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuICdjb21wb25lbnQnIGlzIGEgdmFsaWQgY29tcG9uZW50IGFuZCBmYWxzZSBvdGhlcndpc2UuXG4vLyBBIGNvbXBvbmVudCBpcyBlaXRoZXIgYSBmdW5jdGlvbiBvciBhbiBvYmplY3Qgd2l0aCBhICd2aWV3JyBmdW5jdGlvbi5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbXBvbmVudChjb21wb25lbnQpOiBjb21wb25lbnQgaXMgQ29tcG9uZW50IHtcbiAgcmV0dXJuIGNvbXBvbmVudCAmJiAodHlwZW9mIGNvbXBvbmVudCA9PT0gXCJmdW5jdGlvblwiIHx8ICh0eXBlb2YgY29tcG9uZW50ID09PSBcIm9iamVjdFwiICYmIFwidmlld1wiIGluIGNvbXBvbmVudCkpO1xufVxuXG4vLyAnaXNWbm9kZScgaXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gJ29iamVjdCcgaXMgYSAnVm5vZGUnIGluc3RhbmNlIGFuZCBmYWxzZSBvdGhlcndpc2UuXG5leHBvcnQgY29uc3QgaXNWbm9kZSA9IChvYmplY3Q/OiB1bmtub3duIHwgVm5vZGVJbnRlcmZhY2UpOiBvYmplY3QgaXMgVm5vZGVJbnRlcmZhY2UgPT4ge1xuICAvLyBVc2UgdGhlICdpbnN0YW5jZW9mJyBvcGVyYXRvciB0byBjaGVjayBpZiAnb2JqZWN0JyBpcyBhbiBpbnN0YW5jZSBvZiAnVm5vZGUnLlxuICByZXR1cm4gb2JqZWN0IGluc3RhbmNlb2YgVm5vZGU7XG59O1xuXG4vLyAnaXNWbm9kZUNvbXBvbmVudCcgaXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gJ29iamVjdCcgaXMgYSAnVm5vZGUnIGluc3RhbmNlIHdpdGggYSAndGFnJyBwcm9wZXJ0eSB0aGF0IGlzIGEgdmFsaWQgY29tcG9uZW50LlxuLy8gSXQgcmV0dXJucyBmYWxzZSBvdGhlcndpc2UuXG5leHBvcnQgY29uc3QgaXNWbm9kZUNvbXBvbmVudCA9IChvYmplY3Q/OiB1bmtub3duIHwgVm5vZGVDb21wb25lbnRJbnRlcmZhY2UpOiBvYmplY3QgaXMgVm5vZGVDb21wb25lbnRJbnRlcmZhY2UgPT4ge1xuICAvLyBDaGVjayBpZiAnb2JqZWN0JyBpcyBhICdWbm9kZScgaW5zdGFuY2UgYW5kIGl0cyAndGFnJyBwcm9wZXJ0eSBpcyBhIHZhbGlkIGNvbXBvbmVudC5cbiAgcmV0dXJuIGlzVm5vZGUob2JqZWN0KSAmJiBpc0NvbXBvbmVudChvYmplY3QudGFnKTtcbn07XG5cbi8vICdkb21Ub1Zub2RlJyBpcyBhIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgYSBET00gbm9kZSB0byBhICdWbm9kZScgaW5zdGFuY2UuXG5leHBvcnQgZnVuY3Rpb24gZG9tVG9Wbm9kZShkb206IGFueSk6IFZub2RlV2l0aERvbSB7XG4gIC8vIElmIHRoZSBjaGlsZCBub2RlIGlzIGEgdGV4dCBub2RlLCBjcmVhdGUgYSAnVm5vZGUnIGluc3RhbmNlIHdpdGggdGhlICd0ZXh0VGFnJyBjb25zdGFudCBhcyB0aGUgJ3RhZycgcHJvcGVydHkuXG4gIC8vIFNldCB0aGUgJ2RvbScgcHJvcGVydHkgb2YgdGhlICdWbm9kZScgaW5zdGFuY2UgdG8gdGhlIGNoaWxkIERPTSBub2RlLlxuICAvLyBQdXNoIHRoZSAnVm5vZGUnIGluc3RhbmNlIHRvIHRoZSAnY2hpbGRyZW4nIGFycmF5LlxuICBpZiAoZG9tLm5vZGVUeXBlID09PSAzKSB7XG4gICAgbGV0IHZub2RlID0gbmV3IFZub2RlKHRleHRUYWcsIHt9LCBbZG9tLm5vZGVWYWx1ZV0pO1xuICAgIHZub2RlLmRvbSA9IGRvbTtcbiAgICByZXR1cm4gdm5vZGUgYXMgVm5vZGVXaXRoRG9tO1xuICB9XG5cbiAgbGV0IGNoaWxkcmVuOiBWbm9kZVdpdGhEb21bXSA9IFtdO1xuICAvLyBJdGVyYXRlIHRocm91Z2ggYWxsIGNoaWxkIG5vZGVzIG9mICdkb20nLlxuICBmb3IgKGxldCBpID0gMCwgbCA9IGRvbS5jaGlsZE5vZGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGxldCBjaGlsZERvbSA9IGRvbS5jaGlsZE5vZGVzW2ldO1xuICAgIC8vIElmIHRoZSBjaGlsZCBub2RlIGlzIGFuIGVsZW1lbnQgbm9kZSwgcmVjdXJzaXZlbHkgY2FsbCAnZG9tVG9Wbm9kZScgdG8gY29udmVydCBpdCB0byBhICdWbm9kZScgaW5zdGFuY2UuXG4gICAgLy8gUHVzaCB0aGUgJ1Zub2RlJyBpbnN0YW5jZSB0byB0aGUgJ2NoaWxkcmVuJyBhcnJheS5cbiAgICBpZiAoY2hpbGREb20ubm9kZVR5cGUgPT09IDEgfHwgY2hpbGREb20ubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgIGNoaWxkcmVuLnB1c2goZG9tVG9Wbm9kZShjaGlsZERvbSkpO1xuICAgIH1cbiAgfVxuXG4gIGxldCBwcm9wczogVm5vZGVQcm9wZXJ0aWVzID0ge307XG4gIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgYXR0cmlidXRlcyBvZiAnZG9tJy5cbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBkb20uYXR0cmlidXRlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBsZXQgYXR0ciA9IGRvbS5hdHRyaWJ1dGVzW2ldO1xuICAgIC8vIEFkZCB0aGUgYXR0cmlidXRlIHRvIHRoZSAncHJvcHMnIG9iamVjdCwgdXNpbmcgdGhlIGF0dHJpYnV0ZSdzIG5hbWUgYXMgdGhlIGtleSBhbmQgaXRzIHZhbHVlIGFzIHRoZSB2YWx1ZS5cbiAgICBwcm9wc1thdHRyLm5vZGVOYW1lXSA9IGF0dHIubm9kZVZhbHVlO1xuICB9XG5cbiAgLy8gQ3JlYXRlIGEgbmV3ICdWbm9kZScgaW5zdGFuY2Ugd2l0aCB0aGUgJ3RhZycgcHJvcGVydHkgc2V0IHRvIHRoZSBsb3dlcmNhc2UgdmVyc2lvbiBvZiB0aGUgRE9NIG5vZGUncyB0YWcgbmFtZS5cbiAgLy8gU2V0IHRoZSAncHJvcHMnIGFuZCAnY2hpbGRyZW4nIHByb3BlcnRpZXMgdG8gdGhlICdwcm9wcycgYW5kICdjaGlsZHJlbicgYXJyYXlzIHJlc3BlY3RpdmVseS5cbiAgLy8gU2V0IHRoZSAnZG9tJyBwcm9wZXJ0eSBvZiB0aGUgJ1Zub2RlJyBpbnN0YW5jZSB0byB0aGUgRE9NIG5vZGUuXG4gIGxldCB2bm9kZSA9IG5ldyBWbm9kZShkb20udGFnTmFtZS50b0xvd2VyQ2FzZSgpLCBwcm9wcywgY2hpbGRyZW4pO1xuICB2bm9kZS5kb20gPSBkb207XG4gIHJldHVybiB2bm9kZSBhcyBWbm9kZVdpdGhEb207XG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gdGFrZXMgaW4gYW4gSFRNTCBzdHJpbmcgYW5kIGNyZWF0ZXMgYSB2aXJ0dWFsIG5vZGUgcmVwcmVzZW50YXRpb24gb2YgaXRcbi8vIHVzaW5nIHRoZSBgZG9tVG9Wbm9kZWAgZnVuY3Rpb24uIEl0IGRvZXMgdGhpcyBieSBjcmVhdGluZyBhIG5ldyBgZGl2YCBlbGVtZW50LCBzZXR0aW5nXG4vLyBpdHMgYGlubmVySFRNTGAgdG8gdGhlIHByb3ZpZGVkIEhUTUwgc3RyaW5nLCBhbmQgdGhlbiB1c2luZyBgbWFwYCB0byBpdGVyYXRlIG92ZXIgdGhlXG4vLyBgY2hpbGROb2Rlc2Agb2YgdGhlIGBkaXZgIGVsZW1lbnQsIHBhc3NpbmcgZWFjaCBvbmUgdG8gYGRvbVRvVm5vZGVgIHRvIGNyZWF0ZSBhIHZpcnR1YWxcbi8vIG5vZGUgcmVwcmVzZW50YXRpb24gb2YgaXQuIFRoZSByZXN1bHRpbmcgYXJyYXkgb2YgdmlydHVhbCBub2RlcyBpcyB0aGVuIHJldHVybmVkLlxuZXhwb3J0IGZ1bmN0aW9uIHRydXN0KGh0bWxTdHJpbmc6IHN0cmluZykge1xuICBsZXQgZGl2ID0gY3JlYXRlRG9tRWxlbWVudChcImRpdlwiKTtcbiAgZGl2LmlubmVySFRNTCA9IGh0bWxTdHJpbmcudHJpbSgpO1xuXG4gIHJldHVybiBbXS5tYXAuY2FsbChkaXYuY2hpbGROb2RlcywgKGl0ZW0pID0+IGRvbVRvVm5vZGUoaXRlbSkpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyogTWFpbiBDb21wb25lbnQgaW1wbGVtZW50YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8vIFRoZXNlIHZhcmlhYmxlcyBhcmUgdXNlZCB0byBzdG9yZSB0aGUgbWFpbiBjb21wb25lbnQsIHRoZSBtYWluIHZpcnR1YWwgbm9kZSwgYW5kIHdoZXRoZXJcbi8vIHRoZSBtYWluIGNvbXBvbmVudCBpcyBjdXJyZW50bHkgbW91bnRlZC5cbmxldCBtYWluQ29tcG9uZW50OiBWbm9kZUNvbXBvbmVudEludGVyZmFjZSB8IG51bGwgPSBudWxsO1xubGV0IG1haW5Wbm9kZTogVm5vZGVXaXRoRG9tIHwgbnVsbCA9IG51bGw7XG5sZXQgaXNNb3VudGVkID0gZmFsc2U7XG5cbi8vIFRoaXMgb2JqZWN0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIGN1cnJlbnQgdmlydHVhbCBub2RlIGFuZCBjb21wb25lbnQgYmVpbmcgcmVuZGVyZWQuXG5leHBvcnQgY29uc3QgY3VycmVudDogQ3VycmVudCA9IHtcbiAgdm5vZGU6IG51bGwsXG4gIG9sZFZub2RlOiBudWxsLFxuICBjb21wb25lbnQ6IG51bGwsXG4gIGV2ZW50OiBudWxsXG59O1xuXG4vKiBSZXNlcnZlZCBwcm9wcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuLy8gVGhpcyBvYmplY3QgaXMgdXNlZCB0byBzdG9yZSB0aGUgbmFtZXMgb2YgcmVzZXJ2ZWQgcHJvcHMsIHdoaWNoIGFyZSBwcm9wcyB0aGF0IGFyZSByZXNlcnZlZFxuLy8gZm9yIHNwZWNpYWwgcHVycG9zZXMgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBhcyByZWd1bGFyIGNvbXBvbmVudCBwcm9wcy5cbmV4cG9ydCBjb25zdCByZXNlcnZlZFByb3BzOiBSZWNvcmQ8c3RyaW5nLCB0cnVlPiA9IHtcbiAga2V5OiB0cnVlLFxuICBzdGF0ZTogdHJ1ZSxcbiAgXCJ2LWtlZXBcIjogdHJ1ZSxcblxuICAvLyBCdWlsdCBpbiBkaXJlY3RpdmVzXG4gIFwidi1pZlwiOiB0cnVlLFxuICBcInYtdW5sZXNzXCI6IHRydWUsXG4gIFwidi1mb3JcIjogdHJ1ZSxcbiAgXCJ2LXNob3dcIjogdHJ1ZSxcbiAgXCJ2LWNsYXNzXCI6IHRydWUsXG4gIFwidi1odG1sXCI6IHRydWUsXG4gIFwidi1tb2RlbFwiOiB0cnVlLFxuICBcInYtY3JlYXRlXCI6IHRydWUsXG4gIFwidi11cGRhdGVcIjogdHJ1ZSxcbiAgXCJ2LWNsZWFudXBcIjogdHJ1ZVxufTtcblxuLyogTW91bnRpbmcsIFVwZGF0aW5nLCBDbGVhbnVwIGFuZCBVbm1vdW50aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbi8vIFRoZXNlIHNldHMgYXJlIHVzZWQgdG8gc3RvcmUgY2FsbGJhY2tzIGZvciB2YXJpb3VzIGxpZmVjeWNsZSBldmVudHM6IG1vdW50aW5nLCB1cGRhdGluZyxcbi8vIGNsZWFuaW5nIHVwLCBhbmQgdW5tb3VudGluZy5cbmNvbnN0IG9uQ2xlYW51cFNldDogU2V0PEZ1bmN0aW9uPiA9IG5ldyBTZXQoKTtcbmNvbnN0IG9uTW91bnRTZXQ6IFNldDxGdW5jdGlvbj4gPSBuZXcgU2V0KCk7XG5jb25zdCBvblVwZGF0ZVNldDogU2V0PEZ1bmN0aW9uPiA9IG5ldyBTZXQoKTtcbmNvbnN0IG9uVW5tb3VudFNldDogU2V0PEZ1bmN0aW9uPiA9IG5ldyBTZXQoKTtcblxuLy8gVGhlc2UgZnVuY3Rpb25zIGFsbG93IHVzZXJzIHRvIHJlZ2lzdGVyIGNhbGxiYWNrcyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgbGlmZWN5Y2xlIGV2ZW50cy5cbmV4cG9ydCBmdW5jdGlvbiBvbk1vdW50KGNhbGxiYWNrKSB7XG4gIGlmICghaXNNb3VudGVkKSB7XG4gICAgb25Nb3VudFNldC5hZGQoY2FsbGJhY2spO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvblVwZGF0ZShjYWxsYmFjaykge1xuICBvblVwZGF0ZVNldC5hZGQoY2FsbGJhY2spO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb25DbGVhbnVwKGNhbGxiYWNrKSB7XG4gIG9uQ2xlYW51cFNldC5hZGQoY2FsbGJhY2spO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb25Vbm1vdW50KGNhbGxiYWNrKSB7XG4gIGlmICghaXNNb3VudGVkKSB7XG4gICAgb25Vbm1vdW50U2V0LmFkZChjYWxsYmFjayk7XG4gIH1cbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNhbGwgYWxsIHRoZSBjYWxsYmFja3MgaW4gYSBnaXZlbiBzZXQuXG5mdW5jdGlvbiBjYWxsU2V0KHNldCkge1xuICBmb3IgKGxldCBjYWxsYmFjayBvZiBzZXQpIHtcbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgc2V0LmNsZWFyKCk7XG59XG5cbi8qIEV2ZW50IGxpc3RlbmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8vIFRoaXMgb2JqZWN0IHN0b3JlcyB0aGUgbmFtZXMgb2YgZXZlbnQgbGlzdGVuZXJzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkXG5jb25zdCBldmVudExpc3RlbmVyTmFtZXM6IFJlY29yZDxzdHJpbmcsIHRydWU+ID0ge307XG5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYW4gZXZlbnQgb2NjdXJzXG5mdW5jdGlvbiBldmVudExpc3RlbmVyKGU6IEV2ZW50KSB7XG4gIC8vIFNldCB0aGUgY3VycmVudCBldmVudCB0byB0aGUgZXZlbnQgdGhhdCBvY2N1cnJlZCBzbyB0aGF0IGl0IGNhbiBiZSBwcmV2ZW50ZWQgaWYgbmVjZXNzYXJ5XG4gIGN1cnJlbnQuZXZlbnQgPSBlO1xuXG4gIC8vIENvbnZlcnQgdGhlIHRhcmdldCBvZiB0aGUgZXZlbnQgdG8gYSBET00gZWxlbWVudFxuICBsZXQgZG9tID0gZS50YXJnZXQgYXMgRG9tRWxlbWVudDtcblxuICAvLyBDcmVhdGUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IGxpc3RlbmVyIGJ5IGFkZGluZyBcInYtb25cIiB0byB0aGUgZXZlbnQgdHlwZVxuICBsZXQgbmFtZSA9IGB2LW9uJHtlLnR5cGV9YDtcblxuICAvLyBLZWVwIGdvaW5nIHVwIHRoZSBET00gdHJlZSB1bnRpbCB3ZSBmaW5kIGFuIGVsZW1lbnQgd2l0aCBhbiBldmVudCBsaXN0ZW5lclxuICAvLyBtYXRjaGluZyB0aGUgZXZlbnQgdHlwZVxuICB3aGlsZSAoZG9tKSB7XG4gICAgaWYgKGRvbVtuYW1lXSkge1xuICAgICAgLy8gQ2FsbCB0aGUgZXZlbnQgbGlzdGVuZXIgZnVuY3Rpb25cbiAgICAgIGRvbVtuYW1lXShlLCBkb20pO1xuXG4gICAgICAvLyBJZiB0aGUgZGVmYXVsdCBhY3Rpb24gb2YgdGhlIGV2ZW50IGhhc24ndCBiZWVuIHByZXZlbnRlZCwgdXBkYXRlIHRoZSBET01cbiAgICAgIGlmICghZS5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgIHVwZGF0ZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkb20gPSBkb20ucGFyZW50Tm9kZSBhcyBEb21FbGVtZW50O1xuICB9XG5cbiAgY3VycmVudC5ldmVudCA9IG51bGw7XG59XG5cbi8qIERpcmVjdGl2ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8vIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIGRpcmVjdGl2ZSB0aGF0IGhpZGVzIGFuIGVsZW1lbnQgYmFzZWQgb24gYSBjb25kaXRpb25cbmxldCBoaWRlRGlyZWN0aXZlID0gKHRlc3Q6IGJvb2xlYW4pID0+IChib29sOiBib29sZWFuLCB2bm9kZTogVm5vZGVJbnRlcmZhY2UsIG9sZG5vZGU/OiBWbm9kZUludGVyZmFjZSkgPT4ge1xuICAvLyBJZiB0ZXN0IGlzIHRydWUsIHVzZSB0aGUgdmFsdWUgb2YgYm9vbC4gT3RoZXJ3aXNlLCB1c2UgdGhlIG9wcG9zaXRlIG9mIGJvb2wuXG4gIGxldCB2YWx1ZSA9IHRlc3QgPyBib29sIDogIWJvb2w7XG5cbiAgLy8gSWYgdGhlIHZhbHVlIGlzIHRydWUsIGhpZGUgdGhlIGVsZW1lbnQgYnkgcmVwbGFjaW5nIGl0IHdpdGggYSB0ZXh0IG5vZGVcbiAgaWYgKHZhbHVlKSB7XG4gICAgbGV0IG5ld2RvbSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpO1xuICAgIGlmIChvbGRub2RlICYmIG9sZG5vZGUuZG9tICYmIG9sZG5vZGUuZG9tLnBhcmVudE5vZGUpIHtcbiAgICAgIG9sZG5vZGUuZG9tLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5ld2RvbSwgb2xkbm9kZS5kb20pO1xuICAgIH1cbiAgICB2bm9kZS50YWcgPSBcIiN0ZXh0XCI7XG4gICAgdm5vZGUuY2hpbGRyZW4gPSBbXTtcbiAgICB2bm9kZS5wcm9wcyA9IHt9O1xuICAgIHZub2RlLmRvbSA9IG5ld2RvbSBhcyB1bmtub3duIGFzIERvbUVsZW1lbnQ7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG4vLyBUaGlzIG9iamVjdCBzdG9yZXMgYWxsIHRoZSBhdmFpbGFibGUgZGlyZWN0aXZlc1xuZXhwb3J0IGNvbnN0IGRpcmVjdGl2ZXM6IERpcmVjdGl2ZXMgPSB7XG4gIC8vIFRoZSBcInYtaWZcIiBkaXJlY3RpdmUgaGlkZXMgYW4gZWxlbWVudCBpZiB0aGUgZ2l2ZW4gY29uZGl0aW9uIGlzIGZhbHNlXG4gIFwidi1pZlwiOiBoaWRlRGlyZWN0aXZlKGZhbHNlKSxcblxuICAvLyBUaGUgXCJ2LXVubGVzc1wiIGRpcmVjdGl2ZSBoaWRlcyBhbiBlbGVtZW50IGlmIHRoZSBnaXZlbiBjb25kaXRpb24gaXMgdHJ1ZVxuICBcInYtdW5sZXNzXCI6IGhpZGVEaXJlY3RpdmUodHJ1ZSksXG5cbiAgLy8gVGhlIFwidi1mb3JcIiBkaXJlY3RpdmUgY3JlYXRlcyBhIGxvb3AgYW5kIGFwcGxpZXMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBlYWNoIGl0ZW0gaW4gdGhlIGxvb3BcbiAgXCJ2LWZvclwiOiAoc2V0OiB1bmtub3duW10sIHZub2RlOiBWbm9kZVdpdGhEb20pID0+IHtcbiAgICBsZXQgbmV3Q2hpbGRyZW46IFZub2RlSW50ZXJmYWNlW10gPSBbXTtcbiAgICBsZXQgY2FsbGJhY2sgPSB2bm9kZS5jaGlsZHJlblswXTtcbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHNldC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIG5ld0NoaWxkcmVuLnB1c2goY2FsbGJhY2soc2V0W2ldLCBpKSk7XG4gICAgfVxuICAgIHZub2RlLmNoaWxkcmVuID0gbmV3Q2hpbGRyZW47XG4gIH0sXG5cbiAgLy8gVGhlIFwidi1zaG93XCIgZGlyZWN0aXZlIHNob3dzIG9yIGhpZGVzIGFuIGVsZW1lbnQgYnkgc2V0dGluZyB0aGUgXCJkaXNwbGF5XCIgc3R5bGUgcHJvcGVydHlcbiAgXCJ2LXNob3dcIjogKGJvb2w6IGJvb2xlYW4sIHZub2RlOiBWbm9kZVdpdGhEb20pID0+IHtcbiAgICAoXG4gICAgICB2bm9kZS5kb20gYXMgdW5rbm93biBhcyB7XG4gICAgICAgIHN0eWxlOiB7IGRpc3BsYXk6IHN0cmluZyB9O1xuICAgICAgfVxuICAgICkuc3R5bGUuZGlzcGxheSA9IGJvb2wgPyBcIlwiIDogXCJub25lXCI7XG4gIH0sXG5cbiAgLy8gVGhlIFwidi1jbGFzc1wiIGRpcmVjdGl2ZSBhZGRzIG9yIHJlbW92ZXMgY2xhc3MgbmFtZXMgZnJvbSBhbiBlbGVtZW50IGJhc2VkIG9uIGEgY29uZGl0aW9uXG4gIFwidi1jbGFzc1wiOiAoY2xhc3NlczogeyBbeDogc3RyaW5nXTogYm9vbGVhbiB9LCB2bm9kZTogVm5vZGVXaXRoRG9tKSA9PiB7XG4gICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgY2xhc3MgbmFtZXMgaW4gdGhlIGNsYXNzZXMgb2JqZWN0XG4gICAgZm9yIChsZXQgbmFtZSBpbiBjbGFzc2VzKSB7XG4gICAgICAvLyBBZGQgb3IgcmVtb3ZlIHRoZSBjbGFzcyBuYW1lIGZyb20gdGhlIGVsZW1lbnQncyBjbGFzcyBsaXN0IGJhc2VkIG9uIHRoZSB2YWx1ZSBpbiB0aGUgY2xhc3NlcyBvYmplY3RcbiAgICAgICh2bm9kZS5kb20gYXMgRG9tRWxlbWVudCkuY2xhc3NMaXN0LnRvZ2dsZShuYW1lLCBjbGFzc2VzW25hbWVdKTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gVGhlIFwidi1odG1sXCIgZGlyZWN0aXZlIHNldHMgdGhlIGlubmVyIEhUTUwgb2YgYW4gZWxlbWVudCB0byB0aGUgZ2l2ZW4gSFRNTCBzdHJpbmdcbiAgXCJ2LWh0bWxcIjogKGh0bWw6IHN0cmluZywgdm5vZGU6IFZub2RlV2l0aERvbSkgPT4ge1xuICAgIC8vIFNldCB0aGUgY2hpbGRyZW4gb2YgdGhlIHZub2RlIHRvIGEgdHJ1c3RlZCB2ZXJzaW9uIG9mIHRoZSBIVE1MIHN0cmluZ1xuICAgIHZub2RlLmNoaWxkcmVuID0gW3RydXN0KGh0bWwpXTtcbiAgfSxcblxuICAvLyBUaGUgXCJ2LW1vZGVsXCIgZGlyZWN0aXZlIGJpbmRzIHRoZSB2YWx1ZSBvZiBhbiBpbnB1dCBlbGVtZW50IHRvIGEgbW9kZWwgcHJvcGVydHlcbiAgXCJ2LW1vZGVsXCI6IChbbW9kZWwsIHByb3BlcnR5LCBldmVudF06IGFueVtdLCB2bm9kZTogVm5vZGVXaXRoRG9tLCBvbGRWbm9kZT86IFZub2RlV2l0aERvbSkgPT4ge1xuICAgIGxldCB2YWx1ZTtcbiAgICAvLyBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIG1vZGVsIHByb3BlcnR5IHdoZW4gdGhlIGlucHV0IGVsZW1lbnQncyB2YWx1ZSBjaGFuZ2VzXG4gICAgbGV0IGhhbmRsZXIgPSAoZTogRXZlbnQpID0+IChtb2RlbFtwcm9wZXJ0eV0gPSAoZS50YXJnZXQgYXMgRG9tRWxlbWVudCAmIFJlY29yZDxzdHJpbmcsIGFueT4pLnZhbHVlKTtcbiAgICBpZiAodm5vZGUudGFnID09PSBcImlucHV0XCIpIHtcbiAgICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIGFuIGlucHV0LCB1c2UgdGhlIFwiaW5wdXRcIiBldmVudCBieSBkZWZhdWx0XG4gICAgICBldmVudCA9IGV2ZW50IHx8IFwib25pbnB1dFwiO1xuICAgICAgLy8gRGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIGlucHV0IGVsZW1lbnQsIHVzZSBhIGRpZmZlcmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICBzd2l0Y2ggKHZub2RlLnByb3BzLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcImNoZWNrYm94XCI6IHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtb2RlbFtwcm9wZXJ0eV0pKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgbW9kZWwgcHJvcGVydHkgaXMgYW4gYXJyYXksIGFkZCBvciByZW1vdmUgdGhlIHZhbHVlIGZyb20gdGhlIGFycmF5IHdoZW4gdGhlIGNoZWNrYm94IGlzIGNoZWNrZWQgb3IgdW5jaGVja2VkXG4gICAgICAgICAgICBoYW5kbGVyID0gKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgIGxldCB2YWwgPSAoZS50YXJnZXQgYXMgRG9tRWxlbWVudCAmIFJlY29yZDxzdHJpbmcsIGFueT4pLnZhbHVlO1xuICAgICAgICAgICAgICBsZXQgaWR4ID0gbW9kZWxbcHJvcGVydHldLmluZGV4T2YodmFsKTtcbiAgICAgICAgICAgICAgaWYgKGlkeCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0ucHVzaCh2YWwpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBpbiB0aGUgYXJyYXksIHNldCB0aGUgY2hlY2tib3ggdG8gYmUgY2hlY2tlZFxuICAgICAgICAgICAgdmFsdWUgPSBtb2RlbFtwcm9wZXJ0eV0uaW5kZXhPZih2bm9kZS5kb20udmFsdWUpICE9PSAtMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKFwidmFsdWVcIiBpbiB2bm9kZS5wcm9wcykge1xuICAgICAgICAgICAgLy8gSWYgdGhlIGlucHV0IGVsZW1lbnQgaGFzIGEgXCJ2YWx1ZVwiIGF0dHJpYnV0ZSwgdXNlIGl0IHRvIGRldGVybWluZSB0aGUgY2hlY2tlZCBzdGF0ZVxuICAgICAgICAgICAgaGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKG1vZGVsW3Byb3BlcnR5XSA9PT0gdm5vZGUucHJvcHMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0gPSBudWxsO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XSA9IHZub2RlLnByb3BzLnZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFsdWUgPSBtb2RlbFtwcm9wZXJ0eV0gPT09IHZub2RlLnByb3BzLnZhbHVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBcInZhbHVlXCIgYXR0cmlidXRlLCB1c2UgYSBib29sZWFuIHZhbHVlIGZvciB0aGUgbW9kZWwgcHJvcGVydHlcbiAgICAgICAgICAgIGhhbmRsZXIgPSAoKSA9PiAobW9kZWxbcHJvcGVydHldID0gIW1vZGVsW3Byb3BlcnR5XSk7XG4gICAgICAgICAgICB2YWx1ZSA9IG1vZGVsW3Byb3BlcnR5XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gU2V0IHRoZSBcImNoZWNrZWRcIiBhdHRyaWJ1dGUgb24gdGhlIGlucHV0IGVsZW1lbnRcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgICBzaGFyZWRTZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIsIHZhbHVlLCB2bm9kZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBcInJhZGlvXCI6IHtcbiAgICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBhIHJhZGlvIGJ1dHRvbiwgc2V0IHRoZSBcImNoZWNrZWRcIiBhdHRyaWJ1dGUgYmFzZWQgb24gdGhlIHZhbHVlIG9mIHRoZSBtb2RlbCBwcm9wZXJ0eVxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICAgIHNoYXJlZFNldEF0dHJpYnV0ZShcImNoZWNrZWRcIiwgbW9kZWxbcHJvcGVydHldID09PSB2bm9kZS5kb20udmFsdWUsIHZub2RlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgLy8gRm9yIGFsbCBvdGhlciBpbnB1dCB0eXBlcywgc2V0IHRoZSBcInZhbHVlXCIgYXR0cmlidXRlIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiB0aGUgbW9kZWwgcHJvcGVydHlcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgICAgICBzaGFyZWRTZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLCBtb2RlbFtwcm9wZXJ0eV0sIHZub2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodm5vZGUudGFnID09PSBcInNlbGVjdFwiKSB7XG4gICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBhIHNlbGVjdCBlbGVtZW50LCB1c2UgdGhlIFwiY2xpY2tcIiBldmVudCBieSBkZWZhdWx0XG4gICAgICBldmVudCA9IGV2ZW50IHx8IFwib25jbGlja1wiO1xuICAgICAgaWYgKHZub2RlLnByb3BzLm11bHRpcGxlKSB7XG4gICAgICAgIC8vIElmIHRoZSBzZWxlY3QgZWxlbWVudCBhbGxvd3MgbXVsdGlwbGUgc2VsZWN0aW9ucywgdXBkYXRlIHRoZSBtb2RlbCBwcm9wZXJ0eSB3aXRoIGFuIGFycmF5IG9mIHNlbGVjdGVkIHZhbHVlc1xuICAgICAgICBoYW5kbGVyID0gKGU6IEV2ZW50ICYgUmVjb3JkPHN0cmluZywgYW55PikgPT4ge1xuICAgICAgICAgIGxldCB2YWwgPSAoZS50YXJnZXQgYXMgRG9tRWxlbWVudCAmIFJlY29yZDxzdHJpbmcsIGFueT4pLnZhbHVlO1xuICAgICAgICAgIGlmIChlLmN0cmxLZXkpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSBDdHJsIGtleSBpcyBwcmVzc2VkLCBhZGQgb3IgcmVtb3ZlIHRoZSB2YWx1ZSBmcm9tIHRoZSBhcnJheVxuICAgICAgICAgICAgbGV0IGlkeCA9IG1vZGVsW3Byb3BlcnR5XS5pbmRleE9mKHZhbCk7XG4gICAgICAgICAgICBpZiAoaWR4ID09PSAtMSkge1xuICAgICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0ucHVzaCh2YWwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbW9kZWxbcHJvcGVydHldLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgQ3RybCBrZXkgaXMgbm90IHByZXNzZWQsIHNldCB0aGUgbW9kZWwgcHJvcGVydHkgdG8gYW4gYXJyYXkgd2l0aCB0aGUgc2VsZWN0ZWQgdmFsdWVcbiAgICAgICAgICAgIG1vZGVsW3Byb3BlcnR5XS5zcGxpY2UoMCwgbW9kZWxbcHJvcGVydHldLmxlbmd0aCk7XG4gICAgICAgICAgICBtb2RlbFtwcm9wZXJ0eV0ucHVzaCh2YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gU2V0IHRoZSBcInNlbGVjdGVkXCIgYXR0cmlidXRlIG9uIHRoZSBvcHRpb25zIGJhc2VkIG9uIHdoZXRoZXIgdGhleSBhcmUgaW4gdGhlIG1vZGVsIHByb3BlcnR5IGFycmF5XG4gICAgICAgIHZub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBWbm9kZUludGVyZmFjZSkgPT4ge1xuICAgICAgICAgIGlmIChjaGlsZC50YWcgPT09IFwib3B0aW9uXCIpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IFwidmFsdWVcIiBpbiBjaGlsZC5wcm9wcyA/IGNoaWxkLnByb3BzLnZhbHVlIDogY2hpbGQuY2hpbGRyZW4uam9pbihcIlwiKS50cmltKCk7XG4gICAgICAgICAgICBjaGlsZC5wcm9wcy5zZWxlY3RlZCA9IG1vZGVsW3Byb3BlcnR5XS5pbmRleE9mKHZhbHVlKSAhPT0gLTE7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIHRoZSBzZWxlY3QgZWxlbWVudCBkb2VzIG5vdCBhbGxvdyBtdWx0aXBsZSBzZWxlY3Rpb25zLCBzZXQgdGhlIFwic2VsZWN0ZWRcIiBhdHRyaWJ1dGUgb24gdGhlIG9wdGlvbnMgYmFzZWQgb24gdGhlIHZhbHVlIG9mIHRoZSBtb2RlbCBwcm9wZXJ0eVxuICAgICAgICB2bm9kZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogVm5vZGVJbnRlcmZhY2UpID0+IHtcbiAgICAgICAgICBpZiAoY2hpbGQudGFnID09PSBcIm9wdGlvblwiKSB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBcInZhbHVlXCIgaW4gY2hpbGQucHJvcHMgPyBjaGlsZC5wcm9wcy52YWx1ZSA6IGNoaWxkLmNoaWxkcmVuLmpvaW4oXCJcIikudHJpbSgpO1xuICAgICAgICAgICAgY2hpbGQucHJvcHMuc2VsZWN0ZWQgPSB2YWx1ZSA9PT0gbW9kZWxbcHJvcGVydHldO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh2bm9kZS50YWcgPT09IFwidGV4dGFyZWFcIikge1xuICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgYSB0ZXh0YXJlYSwgdXNlIHRoZSBcImlucHV0XCIgZXZlbnQgYnkgZGVmYXVsdFxuICAgICAgZXZlbnQgPSBldmVudCB8fCBcIm9uaW5wdXRcIjtcbiAgICAgIC8vIFNldCB0aGUgdGV4dGFyZWEncyBjb250ZW50IHRvIHRoZSB2YWx1ZSBvZiB0aGUgbW9kZWwgcHJvcGVydHlcbiAgICAgIHZub2RlLmNoaWxkcmVuID0gW21vZGVsW3Byb3BlcnR5XV07XG4gICAgfVxuXG4gICAgLy8gV2UgYXNzdW1lIHRoYXQgdGhlIHByZXYgaGFuZGxlciBpZiBhbnkgd2lsbCBub3QgYmUgY2hhbmdlZCBieSB0aGUgdXNlciBhY3Jvc3MgcGF0Y2hzXG4gICAgbGV0IHByZXZIYW5kbGVyID0gdm5vZGUucHJvcHNbZXZlbnRdO1xuXG4gICAgLy8gU2V0IHRoZSBldmVudCBoYW5kbGVyIG9uIHRoZSBlbGVtZW50XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgc2hhcmVkU2V0QXR0cmlidXRlKFxuICAgICAgZXZlbnQsXG4gICAgICAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgaGFuZGxlcihlKTtcblxuICAgICAgICAvLyBJZiB0aGUgcHJldmlvdXMgaGFuZGxlciBpcyBkZWZpbmVkLCBjYWxsIGl0IGFmdGVyIHRoZSBtb2RlbCBoYXMgYmVlbiB1cGRhdGVkXG4gICAgICAgIGlmIChwcmV2SGFuZGxlcikge1xuICAgICAgICAgIHByZXZIYW5kbGVyKGUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdm5vZGUsXG4gICAgICBvbGRWbm9kZVxuICAgICk7XG4gIH0sXG5cbiAgLy8gVGhlIFwidi1jcmVhdGVcIiBkaXJlY3RpdmUgaXMgY2FsbGVkIHdoZW4gYSBuZXcgdmlydHVhbCBub2RlIGlzIGNyZWF0ZWQuXG4gIC8vIFRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgbmV3IHZpcnR1YWwgbm9kZSBhcyBhbiBhcmd1bWVudC5cbiAgLy8gVGhpcyBkaXJlY3RpdmUgaXMgb25seSBjYWxsZWQgb25jZSBwZXIgdmlydHVhbCBub2RlLCB3aGVuIGl0IGlzIGZpcnN0IGNyZWF0ZWQuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBcInYtY3JlYXRlXCI6IChjYWxsYmFjazogKHZub2RlOiBWbm9kZVdpdGhEb20pID0+IHZvaWQsIHZub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tKSA9PiB7XG4gICAgLy8gSWYgdGhpcyBpcyBub3QgYW4gdXBkYXRlLCBjYWxsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIHRoZSBuZXcgdmlydHVhbCBub2RlXG4gICAgaWYgKCFvbGRWbm9kZSkge1xuICAgICAgbGV0IGNsZWFudXAgPSBjYWxsYmFjayh2bm9kZSk7XG5cbiAgICAgIC8vIElmIHRoZSBjYWxsYmFjayBmdW5jdGlvbiByZXR1cm5zIGEgZnVuY3Rpb24sIGNhbGwgaXQgd2hlbiB0aGUgdXBkYXRlIGlzIGdvbm5hIGJlIGNsZWFuZWQgdXBcbiAgICAgIGlmICh0eXBlb2YgY2xlYW51cCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIG9uQ2xlYW51cChjbGVhbnVwKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLy8gVGhlIFwidi11cGRhdGVcIiBkaXJlY3RpdmUgaXMgY2FsbGVkIHdoZW4gYW4gZXhpc3RpbmcgdmlydHVhbCBub2RlIGlzIHVwZGF0ZWQuXG4gIC8vIFRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgbmV3IGFuZCBvbGQgdmlydHVhbCBub2RlcyBhcyBhcmd1bWVudHMuXG4gIC8vIFRoaXMgZGlyZWN0aXZlIGlzIG9ubHkgY2FsbGVkIG9uY2UgcGVyIHZpcnR1YWwgbm9kZSB1cGRhdGUuXG4gIFwidi11cGRhdGVcIjogKFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIGNhbGxiYWNrOiAodm5vZGU6IFZub2RlV2l0aERvbSwgb2xkVm5vZGU6IFZub2RlV2l0aERvbSkgPT4gdm9pZCxcbiAgICB2bm9kZTogVm5vZGVXaXRoRG9tLFxuICAgIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tXG4gICkgPT4ge1xuICAgIC8vIElmIHRoaXMgaXMgYW4gdXBkYXRlLCBjYWxsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIHRoZSBuZXcgYW5kIG9sZCB2aXJ0dWFsIG5vZGVzXG4gICAgaWYgKG9sZFZub2RlKSB7XG4gICAgICBsZXQgY2xlYW51cCA9IGNhbGxiYWNrKHZub2RlLCBvbGRWbm9kZSk7XG5cbiAgICAgIC8vIElmIHRoZSBjYWxsYmFjayBmdW5jdGlvbiByZXR1cm5zIGEgZnVuY3Rpb24sIGNhbGwgaXQgd2hlbiB0aGUgdXBkYXRlIGlzIGdvbm5hIGJlIGNsZWFuZWQgdXBcbiAgICAgIGlmICh0eXBlb2YgY2xlYW51cCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIG9uQ2xlYW51cChjbGVhbnVwKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLy8gVGhlIFwidi1jbGVhbnVwXCIgZGlyZWN0aXZlIGlzIGNhbGxlZCB3aGVuIHRoZSB1cGRhdGUgaXMgY2xlYW5lZCB1cC5cbiAgLy8gVGhlIHByb3ZpZGVkIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIHRoZSBvbGQgdmlydHVhbCBub2RlIGFzIGFuIGFyZ3VtZW50LlxuICAvLyBUaGlzIGRpcmVjdGl2ZSBpcyBvbmx5IGNhbGxlZCBvbmNlIHBlciB2aXJ0dWFsIG5vZGUsIHdoZW4gdGhlIHVwZGF0ZSBpcyBjbGVhbmVkIHVwLlxuICBcInYtY2xlYW51cFwiOiAoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgY2FsbGJhY2s6ICh2bm9kZTogVm5vZGVXaXRoRG9tLCBvbGRWbm9kZT86IFZub2RlV2l0aERvbSkgPT4gdm9pZCxcbiAgICB2bm9kZTogVm5vZGVXaXRoRG9tLFxuICAgIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tXG4gICkgPT4ge1xuICAgIC8vIEFkZCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gdGhlIGxpc3Qgb2YgY2xlYW51cCBmdW5jdGlvbnMgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHVwZGF0ZSBpcyBjbGVhbmVkIHVwXG4gICAgb25DbGVhbnVwKCgpID0+IGNhbGxiYWNrKHZub2RlLCBvbGRWbm9kZSkpO1xuICB9XG59O1xuLy8gQWRkIGEgZGlyZWN0aXZlIHRvIHRoZSBnbG9iYWwgZGlyZWN0aXZlcyBvYmplY3QsIHdpdGggdGhlIGtleSBiZWluZyB0aGUgbmFtZVxuLy8gcHJlY2VkZWQgYnkgXCJ2LVwiLiBBbHNvIGFkZCB0aGUgbmFtZSB0byB0aGUgZ2xvYmFsIHJlc2VydmVkUHJvcHMgb2JqZWN0LlxuZXhwb3J0IGZ1bmN0aW9uIGRpcmVjdGl2ZShuYW1lOiBzdHJpbmcsIGRpcmVjdGl2ZTogRGlyZWN0aXZlKSB7XG4gIGxldCBkaXJlY3RpdmVOYW1lID0gYHYtJHtuYW1lfWA7XG4gIGRpcmVjdGl2ZXNbZGlyZWN0aXZlTmFtZV0gPSBkaXJlY3RpdmU7XG4gIHJlc2VydmVkUHJvcHNbZGlyZWN0aXZlTmFtZV0gPSB0cnVlO1xufVxuXG4vLyBTZXQgYW4gYXR0cmlidXRlIG9uIGEgdmlydHVhbCBET00gbm9kZSBhbmQgdXBkYXRlIHRoZSBhY3R1YWwgRE9NIGVsZW1lbnQuXG4vLyBJZiB0aGUgYXR0cmlidXRlIHZhbHVlIGlzIGEgZnVuY3Rpb24sIGFkZCBhbiBldmVudCBsaXN0ZW5lciBmb3IgdGhlIGF0dHJpYnV0ZVxuLy8gbmFtZSB0byB0aGUgRE9NIGVsZW1lbnQgcmVwcmVzZW50ZWQgYnkgbWFpblZub2RlLlxuLy8gSWYgb2xkVm5vZGUgaXMgcHJvdmlkZWQsIGNvbXBhcmUgdGhlIG5ldyBhdHRyaWJ1dGUgdmFsdWUgdG8gdGhlIG9sZCB2YWx1ZVxuLy8gYW5kIG9ubHkgdXBkYXRlIHRoZSBhdHRyaWJ1dGUgaWYgdGhlIHZhbHVlcyBhcmUgZGlmZmVyZW50LlxuZnVuY3Rpb24gc2hhcmVkU2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgbmV3Vm5vZGU6IFZub2RlV2l0aERvbSwgb2xkVm5vZGU/OiBWbm9kZVdpdGhEb20pOiB2b2lkIHwgYm9vbGVhbiB7XG4gIC8vIElmIHRoZSBhdHRyaWJ1dGUgdmFsdWUgaXMgYSBmdW5jdGlvbiwgYWRkIGFuIGV2ZW50IGxpc3RlbmVyIGZvciB0aGUgYXR0cmlidXRlXG4gIC8vIG5hbWUgdG8gdGhlIERPTSBlbGVtZW50IHJlcHJlc2VudGVkIGJ5IG1haW5Wbm9kZS5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgLy8gT25seSBhZGQgdGhlIGV2ZW50IGxpc3RlbmVyIGlmIGl0IGhhc24ndCBiZWVuIGFkZGVkIHlldC5cbiAgICBpZiAobmFtZSBpbiBldmVudExpc3RlbmVyTmFtZXMgPT09IGZhbHNlKSB7XG4gICAgICAobWFpblZub2RlIGFzIFZub2RlV2l0aERvbSkuZG9tLmFkZEV2ZW50TGlzdGVuZXIobmFtZS5zbGljZSgyKSwgZXZlbnRMaXN0ZW5lcik7XG4gICAgICBldmVudExpc3RlbmVyTmFtZXNbbmFtZV0gPSB0cnVlO1xuICAgIH1cbiAgICBuZXdWbm9kZS5kb21bYHYtJHtuYW1lfWBdID0gdmFsdWU7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gSWYgdGhlIGF0dHJpYnV0ZSBpcyBwcmVzZW50IG9uIHRoZSBET00gZWxlbWVudCBhbmQgbmV3Vm5vZGUgaXMgbm90IGFuIFNWRyxcbiAgLy8gdXBkYXRlIHRoZSBhdHRyaWJ1dGUgaWYgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkLlxuICBpZiAobmFtZSBpbiBuZXdWbm9kZS5kb20gJiYgbmV3Vm5vZGUuaXNTVkcgPT09IGZhbHNlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuICAgIGlmIChuZXdWbm9kZS5kb21bbmFtZV0gIT0gdmFsdWUpIHtcbiAgICAgIG5ld1Zub2RlLmRvbVtuYW1lXSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBJZiBvbGRWbm9kZSBpcyBub3QgcHJvdmlkZWQgb3IgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBoYXMgY2hhbmdlZCwgdXBkYXRlIHRoZVxuICAvLyBhdHRyaWJ1dGUgb24gdGhlIERPTSBlbGVtZW50LlxuICBpZiAoIW9sZFZub2RlIHx8IHZhbHVlICE9PSBvbGRWbm9kZS5wcm9wc1tuYW1lXSkge1xuICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgIG5ld1Zub2RlLmRvbS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld1Zub2RlLmRvbS5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBTZXQgYW4gYXR0cmlidXRlIG9uIGEgdmlydHVhbCBET00gbm9kZSBhbmQgdXBkYXRlIHRoZSBhY3R1YWwgRE9NIGVsZW1lbnQuXG4vLyBTa2lwIHRoZSBhdHRyaWJ1dGUgaWYgaXQgaXMgaW4gdGhlIHJlc2VydmVkUHJvcHMgb2JqZWN0LlxuZXhwb3J0IGZ1bmN0aW9uIHNldEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIG5ld1Zub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tKTogdm9pZCB7XG4gIGlmIChuYW1lIGluIHJlc2VydmVkUHJvcHMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbmV3Vm5vZGUucHJvcHNbbmFtZV0gPSB2YWx1ZTtcbiAgc2hhcmVkU2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlLCBuZXdWbm9kZSBhcyBWbm9kZVdpdGhEb20sIG9sZFZub2RlKTtcbn1cblxuLy8gVXBkYXRlIHRoZSBhdHRyaWJ1dGVzIG9uIGEgdmlydHVhbCBET00gbm9kZS4gSWYgb2xkVm5vZGUgaXMgcHJvdmlkZWQsIHJlbW92ZVxuLy8gYXR0cmlidXRlcyBmcm9tIHRoZSBET00gZWxlbWVudCB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiBuZXdWbm9kZS5wcm9wcyBidXQgYXJlXG4vLyBwcmVzZW50IGluIG9sZFZub2RlLnByb3BzLiBUaGVuLCBpdGVyYXRlIG92ZXIgdGhlIGF0dHJpYnV0ZXMgaW4gbmV3Vm5vZGUucHJvcHNcbi8vIGFuZCB1cGRhdGUgdGhlIERPTSBlbGVtZW50IHdpdGggdGhlIGF0dHJpYnV0ZXMgdXNpbmcgdGhlIHNoYXJlZFNldEF0dHJpYnV0ZVxuLy8gZnVuY3Rpb24uIElmIGFuIGF0dHJpYnV0ZSBpcyBpbiB0aGUgcmVzZXJ2ZWRQcm9wcyBvYmplY3QgYW5kIGhhcyBhIGNvcnJlc3BvbmRpbmdcbi8vIGRpcmVjdGl2ZSBpbiB0aGUgZGlyZWN0aXZlcyBvYmplY3QsIGNhbGwgdGhlIGRpcmVjdGl2ZSB3aXRoIHRoZSBhdHRyaWJ1dGUgdmFsdWVcbi8vIGFuZCB0aGUgdHdvIHZpcnR1YWwgRE9NIG5vZGVzIGFzIGFyZ3VtZW50cy4gSWYgdGhlIGRpcmVjdGl2ZSByZXR1cm5zIGZhbHNlLCBleGl0XG4vLyB0aGUgbG9vcC5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVBdHRyaWJ1dGVzKG5ld1Zub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tKTogdm9pZCB7XG4gIC8vIElmIG9sZFZub2RlIGlzIHByb3ZpZGVkLCByZW1vdmUgYXR0cmlidXRlcyBmcm9tIHRoZSBET00gZWxlbWVudCB0aGF0IGFyZSBub3RcbiAgLy8gcHJlc2VudCBpbiBuZXdWbm9kZS5wcm9wcyBidXQgYXJlIHByZXNlbnQgaW4gb2xkVm5vZGUucHJvcHMuXG4gIGlmIChvbGRWbm9kZSkge1xuICAgIGZvciAobGV0IG5hbWUgaW4gb2xkVm5vZGUucHJvcHMpIHtcbiAgICAgIGlmIChuYW1lIGluIG5ld1Zub2RlLnByb3BzID09PSBmYWxzZSAmJiBuYW1lIGluIGV2ZW50TGlzdGVuZXJOYW1lcyA9PT0gZmFsc2UgJiYgbmFtZSBpbiByZXNlcnZlZFByb3BzID09PSBmYWxzZSkge1xuICAgICAgICBpZiAobmFtZSBpbiBuZXdWbm9kZS5kb20gJiYgbmV3Vm5vZGUuaXNTVkcgPT09IGZhbHNlKSB7XG4gICAgICAgICAgbmV3Vm5vZGUuZG9tW25hbWVdID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdWbm9kZS5kb20ucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBhdHRyaWJ1dGVzIGluIG5ld1Zub2RlLnByb3BzIGFuZCB1cGRhdGUgdGhlIERPTSBlbGVtZW50IHdpdGhcbiAgLy8gdGhlIGF0dHJpYnV0ZXMgdXNpbmcgdGhlIHNoYXJlZFNldEF0dHJpYnV0ZSBmdW5jdGlvbi5cbiAgZm9yIChsZXQgbmFtZSBpbiBuZXdWbm9kZS5wcm9wcykge1xuICAgIGlmIChuYW1lIGluIHJlc2VydmVkUHJvcHMpIHtcbiAgICAgIC8vIElmIHRoZXJlIGlzIGEgZGlyZWN0aXZlIGZvciB0aGUgYXR0cmlidXRlLCBjYWxsIGl0IHdpdGggdGhlIGF0dHJpYnV0ZSB2YWx1ZVxuICAgICAgLy8gYW5kIHRoZSB0d28gdmlydHVhbCBET00gbm9kZXMgYXMgYXJndW1lbnRzLiBJZiB0aGUgZGlyZWN0aXZlIHJldHVybnMgZmFsc2UsXG4gICAgICAvLyBleGl0IHRoZSBsb29wLlxuICAgICAgaWYgKG5hbWUgaW4gZGlyZWN0aXZlcyAmJiBkaXJlY3RpdmVzW25hbWVdKG5ld1Zub2RlLnByb3BzW25hbWVdLCBuZXdWbm9kZSwgb2xkVm5vZGUpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBzaGFyZWRTZXRBdHRyaWJ1dGUobmFtZSwgbmV3Vm5vZGUucHJvcHNbbmFtZV0sIG5ld1Zub2RlLCBvbGRWbm9kZSk7XG4gIH1cbn1cblxuLyogcGF0Y2ggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vLyBQYXRjaCBhIERPTSBub2RlIHdpdGggYSBuZXcgVk5vZGUgdHJlZVxuZXhwb3J0IGZ1bmN0aW9uIHBhdGNoKG5ld1Zub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlPzogVm5vZGVXaXRoRG9tKTogdm9pZCB7XG4gIC8vIElmIHRoZSBuZXcgdHJlZSBoYXMgbm8gY2hpbGRyZW4sIHNldCB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBwYXJlbnQgRE9NIGVsZW1lbnQgdG8gYW4gZW1wdHkgc3RyaW5nXG4gIGlmIChuZXdWbm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICBuZXdWbm9kZS5kb20udGV4dENvbnRlbnQgPSBcIlwiO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEdldCB0aGUgY2hpbGRyZW4gb2YgdGhlIG5ldyBhbmQgb2xkIHZpcnR1YWwgRE9NIG5vZGVzXG4gIGxldCBuZXdUcmVlID0gbmV3Vm5vZGUuY2hpbGRyZW47XG4gIGxldCBvbGRUcmVlID0gb2xkVm5vZGU/LmNoaWxkcmVuIHx8IFtdO1xuICAvLyBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgb2xkIHRyZWVcbiAgbGV0IG9sZFRyZWVMZW5ndGggPSBvbGRUcmVlLmxlbmd0aDtcblxuICAvLyBJZiB0aGUgb2xkIHRyZWUgaGFzIGNoaWxkcmVuIGFuZCB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIG5ldyB0cmVlIGlzIGEgVk5vZGUgd2l0aCBhIFwia2V5XCJcbiAgLy8gYXR0cmlidXRlIGFuZCB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIG9sZCB0cmVlIGlzIGEgVk5vZGUgd2l0aCBhIFwia2V5XCIgYXR0cmlidXRlLCB1cGRhdGVcbiAgLy8gdGhlIERPTSBlbGVtZW50IGluIHBsYWNlIGJ5IGNvbXBhcmluZyB0aGUga2V5cyBvZiB0aGUgbm9kZXMgaW4gdGhlIHRyZWVzLlxuICBpZiAob2xkVHJlZUxlbmd0aCAmJiBuZXdUcmVlWzBdIGluc3RhbmNlb2YgVm5vZGUgJiYgXCJrZXlcIiBpbiBuZXdUcmVlWzBdLnByb3BzICYmIFwia2V5XCIgaW4gb2xkVHJlZVswXS5wcm9wcykge1xuICAgIC8vIEdldCB0aGUgbGVuZ3RocyBvZiB0aGUgbmV3IGFuZCBvbGQgdHJlZXNcbiAgICBsZXQgbmV3VHJlZUxlbmd0aCA9IG5ld1RyZWUubGVuZ3RoO1xuXG4gICAgLy8gQ3JlYXRlIGFuIG9iamVjdCB0aGF0IG1hcHMga2V5cyB0byBpbmRpY2VzIGluIHRoZSBvbGQgdHJlZVxuICAgIGxldCBvbGRLZXllZExpc3Q6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9sZFRyZWVMZW5ndGg7IGkrKykge1xuICAgICAgb2xkS2V5ZWRMaXN0W29sZFRyZWVbaV0ucHJvcHMua2V5XSA9IGk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGFuIG9iamVjdCB0aGF0IG1hcHMga2V5cyB0byBpbmRpY2VzIGluIHRoZSBuZXcgdHJlZVxuICAgIGxldCBuZXdLZXllZExpc3Q6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1RyZWVMZW5ndGg7IGkrKykge1xuICAgICAgbmV3S2V5ZWRMaXN0W25ld1RyZWVbaV0ucHJvcHMua2V5XSA9IGk7XG4gICAgfVxuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBuZXcgdHJlZVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3VHJlZUxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgbmV3IGNoaWxkIGFuZCB0aGUgY29ycmVzcG9uZGluZyBvbGQgY2hpbGRcbiAgICAgIGxldCBuZXdDaGlsZCA9IG5ld1RyZWVbaV07XG4gICAgICBsZXQgb2xkQ2hpbGQgPSBvbGRUcmVlW29sZEtleWVkTGlzdFtuZXdDaGlsZC5wcm9wcy5rZXldXTtcbiAgICAgIC8vIEluaXRpYWxpemUgYSBmbGFnIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHBhdGNoIHRoZSBjaGlsZFxuICAgICAgbGV0IHNob3VsZFBhdGNoID0gdHJ1ZTtcblxuICAgICAgLy8gSWYgdGhlIG9sZCBjaGlsZCBleGlzdHMsIHVwZGF0ZSB0aGUgRE9NIGVsZW1lbnQgb2YgdGhlIG5ldyBjaGlsZCB0byBtYXRjaCB0aGUgb2xkIGNoaWxkJ3MgRE9NIGVsZW1lbnRcbiAgICAgIGlmIChvbGRDaGlsZCkge1xuICAgICAgICBuZXdDaGlsZC5kb20gPSBvbGRDaGlsZC5kb207XG4gICAgICAgIC8vIElmIHRoZSBuZXcgYW5kIG9sZCBjaGlsZHJlbiBoYXZlIHRoZSBzYW1lIFwidi1rZWVwXCIgYXR0cmlidXRlIHZhbHVlLCB1cGRhdGUgdGhlIGNoaWxkcmVuIG9mIHRoZSBuZXcgY2hpbGQgdG8gbWF0Y2ggdGhlIG9sZCBjaGlsZCdzIGNoaWxkcmVuXG4gICAgICAgIGlmIChcInYta2VlcFwiIGluIG5ld0NoaWxkLnByb3BzICYmIG5ld0NoaWxkLnByb3BzW1widi1rZWVwXCJdID09PSBvbGRDaGlsZC5wcm9wc1tcInYta2VlcFwiXSkge1xuICAgICAgICAgIG5ld0NoaWxkLmNoaWxkcmVuID0gb2xkQ2hpbGQuY2hpbGRyZW47XG4gICAgICAgICAgLy8gU2V0IHRoZSBzaG91bGRQYXRjaCBmbGFnIHRvIGZhbHNlXG4gICAgICAgICAgc2hvdWxkUGF0Y2ggPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1cGRhdGVBdHRyaWJ1dGVzKG5ld0NoaWxkLCBvbGRDaGlsZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGUgb2xkIGNoaWxkIGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgYSBuZXcgRE9NIGVsZW1lbnQgZm9yIHRoZSBuZXcgY2hpbGQgYW5kIHVwZGF0ZSBpdHMgYXR0cmlidXRlc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3Q2hpbGQuZG9tID0gY3JlYXRlRG9tRWxlbWVudChuZXdDaGlsZC50YWcsIG5ld0NoaWxkLmlzU1ZHKTtcbiAgICAgICAgdXBkYXRlQXR0cmlidXRlcyhuZXdDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBuZXcgY2hpbGQncyBET00gZWxlbWVudCBpcyBub3QgdGhlIGktdGggY2hpbGQgb2YgdGhlIHBhcmVudCBET00gZWxlbWVudCwgaW5zZXJ0IGl0XG4gICAgICBpZiAoIW5ld1Zub2RlLmRvbS5jaGlsZE5vZGVzW2ldKSB7XG4gICAgICAgIG5ld1Zub2RlLmRvbS5hcHBlbmRDaGlsZChuZXdDaGlsZC5kb20pO1xuXG4gICAgICAgIC8vIElmIHRoZSBuZXcgY2hpbGQncyBET00gZWxlbWVudCBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIGktdGggY2hpbGQgb2YgdGhlIHBhcmVudCBET00gZWxlbWVudCwgcmVwbGFjZSB0aGUgaS10aCBjaGlsZCB3aXRoIHRoZSBuZXcgY2hpbGQncyBET00gZWxlbWVudFxuICAgICAgfSBlbHNlIGlmIChuZXdWbm9kZS5kb20uY2hpbGROb2Rlc1tpXSAhPT0gbmV3Q2hpbGQuZG9tKSB7XG4gICAgICAgIG5ld1Zub2RlLmRvbS5yZXBsYWNlQ2hpbGQobmV3Q2hpbGQuZG9tLCBuZXdWbm9kZS5kb20uY2hpbGROb2Rlc1tpXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBzaG91bGRQYXRjaCBmbGFnIGlzIHRydWUsIHJlY3Vyc2l2ZWx5IGNhbGwgdGhlIHBhdGNoIGZ1bmN0aW9uIG9uIHRoZSBuZXcgY2hpbGQsIHBhc3NpbmcgaW4gdGhlIG9sZCBjaGlsZCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50XG4gICAgICBzaG91bGRQYXRjaCAmJiBwYXRjaChuZXdDaGlsZCwgb2xkQ2hpbGQpO1xuICAgIH1cblxuICAgIC8vIEZvciB0aGUgcmVzdCBvZiB0aGUgY2hpbGRyZW4sIHdlIHNob3VsZCByZW1vdmUgdGhlbSBmcm9tIHRoZSBET01cbiAgICBmb3IgKGxldCBpID0gbmV3VHJlZUxlbmd0aDsgaSA8IG9sZFRyZWVMZW5ndGg7IGkrKykge1xuICAgICAgLy8gSWYgdGhlIGktdGggY2hpbGQgb2YgdGhlIG9sZCB0cmVlIGRvZXMgbm90IGhhdmUgYSBjb3JyZXNwb25kaW5nIGtleSBpbiB0aGUgbmV3IHRyZWUsIHJlbW92ZSBpdHMgRE9NIGVsZW1lbnQgZnJvbSB0aGUgcGFyZW50IERPTSBlbGVtZW50XG4gICAgICBpZiAoIW5ld0tleWVkTGlzdFtvbGRUcmVlW2ldLnByb3BzLmtleV0pIHtcbiAgICAgICAgb2xkVHJlZVtpXS5kb20ucGFyZW50Tm9kZSAmJiBvbGRUcmVlW2ldLmRvbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9sZFRyZWVbaV0uZG9tKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gSWYgdGhlIG5ldyB0cmVlIGhhcyBubyBjaGlsZHJlbiwgc2V0IHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIHBhcmVudCBET00gZWxlbWVudCB0byBhbiBlbXB0eSBzdHJpbmdcbiAgaWYgKG5ld1RyZWUubGVuZ3RoID09PSAwKSB7XG4gICAgbmV3Vm5vZGUuZG9tLnRleHRDb250ZW50ID0gXCJcIjtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBTZXQgdGhlIGdsb2JhbCBjdXJyZW50IG9iamVjdCB0byB0aGUgbmV3IGFuZCBvbGQgdmlydHVhbCBET00gbm9kZXNcbiAgY3VycmVudC52bm9kZSA9IG5ld1Zub2RlO1xuICBjdXJyZW50Lm9sZFZub2RlID0gb2xkVm5vZGU7XG5cbiAgLy8gRmxhdHRlbiB0aGUgbmV3IHRyZWVcbiAgLy8gVGFrZSBpbnRvIGFjY291bnQgdGhhdCBpcyBuZWNlc3NhcnkgdG8gZmxhdHRlbiB0aGUgdHJlZSBiZWZvcmUgdGhlIHBhdGNoIHByb2Nlc3NcbiAgLy8gdG8gbGV0IHRoZSBob29rcyBhbmQgc2lnbmFscyB3b3JrIHByb3Blcmx5XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3VHJlZS5sZW5ndGg7IGkrKykge1xuICAgIGxldCBuZXdDaGlsZCA9IG5ld1RyZWVbaV07XG5cbiAgICAvLyBJZiB0aGUgbmV3IGNoaWxkIGlzIGEgVm5vZGUgYW5kIGlzIG5vdCBhIHRleHQgbm9kZVxuICAgIGlmIChuZXdDaGlsZCBpbnN0YW5jZW9mIFZub2RlKSB7XG4gICAgICAvLyBJZiB0aGUgdGFnIG9mIHRoZSBuZXcgY2hpbGQgaXMgbm90IGEgc3RyaW5nLCBpdCBpcyBhIGNvbXBvbmVudFxuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZC50YWcgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgLy8gU2V0IHRoZSBjdXJyZW50IGNvbXBvbmVudCB0byB0aGUgdGFnIG9mIHRoZSBuZXcgY2hpbGRcbiAgICAgICAgY3VycmVudC5jb21wb25lbnQgPSBuZXdDaGlsZC50YWc7XG4gICAgICAgIC8vIFJlcGxhY2UgdGhlIG5ldyBjaGlsZCB3aXRoIHRoZSByZXN1bHQgb2YgY2FsbGluZyBpdHMgdmlldyBvciBiaW5kIG1ldGhvZCwgcGFzc2luZyBpbiB0aGUgcHJvcHMgYW5kIGNoaWxkcmVuIGFzIGFyZ3VtZW50c1xuICAgICAgICBuZXdUcmVlLnNwbGljZShcbiAgICAgICAgICBpLS0sXG4gICAgICAgICAgMSxcbiAgICAgICAgICAoXCJ2aWV3XCIgaW4gbmV3Q2hpbGQudGFnID8gbmV3Q2hpbGQudGFnLnZpZXcuYmluZChuZXdDaGlsZC50YWcpIDogbmV3Q2hpbGQudGFnLmJpbmQobmV3Q2hpbGQudGFnKSkoXG4gICAgICAgICAgICBuZXdDaGlsZC5wcm9wcyxcbiAgICAgICAgICAgIC4uLm5ld0NoaWxkLmNoaWxkcmVuXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbmV3IGNoaWxkIGlzIGFuIGFycmF5LCBmbGF0dGVuIGl0IGFuZCBjb250aW51ZSB0aGUgbG9vcFxuICAgIGlmIChBcnJheS5pc0FycmF5KG5ld0NoaWxkKSkge1xuICAgICAgbmV3VHJlZS5zcGxpY2UoaS0tLCAxLCAuLi5uZXdDaGlsZCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbmV3IGNoaWxkIGlzIG51bGwgb3IgdW5kZWZpbmVkLCByZW1vdmUgaXQgZnJvbSB0aGUgbmV3IHRyZWUgYW5kIGNvbnRpbnVlIHRoZSBsb29wXG4gICAgaWYgKG5ld0NoaWxkID09PSBudWxsIHx8IG5ld0NoaWxkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG5ld1RyZWUuc3BsaWNlKGktLSwgMSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbmV3IGNoaWxkIGlzIGEgVm5vZGUsIHNldCB0aGUgdGV4dCBvZiB0aGUgVm5vZGUgdG8gdGhlIHRleHQgY29udGVudCBvZiBpdHMgZG9tIHByb3BlcnR5XG4gICAgbmV3VHJlZVtpXSA9IG5ldyBWbm9kZSh0ZXh0VGFnLCB7fSwgW25ld0NoaWxkXSk7XG4gIH1cblxuICAvLyBQYXRjaCB0aGUgdGhlIG9sZCB0cmVlXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3VHJlZS5sZW5ndGg7IGkrKykge1xuICAgIGxldCBuZXdDaGlsZCA9IG5ld1RyZWVbaV07XG5cbiAgICBpZiAobmV3Q2hpbGQudGFnID09PSB0ZXh0VGFnKSB7XG4gICAgICAvLyBJZiBubyBvbGQgY2hpbGQgZXhpc3RzIGF0IHRoZSBzYW1lIGluZGV4XG4gICAgICBpZiAoaSA+PSBvbGRUcmVlTGVuZ3RoKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyB0ZXh0IG5vZGUgZm9yIHRoZSBuZXcgY2hpbGRcbiAgICAgICAgbmV3Q2hpbGQuZG9tID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobmV3Q2hpbGQuY2hpbGRyZW5bMF0pO1xuICAgICAgICAvLyBBcHBlbmQgdGhlIG5ldyB0ZXh0IG5vZGUgdG8gdGhlIGRvbVxuICAgICAgICBuZXdWbm9kZS5kb20uYXBwZW5kQ2hpbGQobmV3Q2hpbGQuZG9tKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZXJlIGlzIGFuIG9sZCBjaGlsZCBhdCB0aGUgc2FtZSBpbmRleFxuICAgICAgbGV0IG9sZENoaWxkID0gb2xkVHJlZVtpXTtcblxuICAgICAgLy8gSWYgdGhlIG9sZCBjaGlsZCBpcyBub3QgYSB0ZXh0IG5vZGVcbiAgICAgIGlmIChvbGRDaGlsZC50YWcgIT09IHRleHRUYWcpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHRleHQgbm9kZSBmb3IgdGhlIG5ldyBjaGlsZFxuICAgICAgICBuZXdDaGlsZC5kb20gPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuZXdDaGlsZC5jaGlsZHJlblswXSk7XG4gICAgICAgIC8vIFJlcGxhY2UgdGhlIG9sZCBjaGlsZCBpbiB0aGUgZG9tIHdpdGggdGhlIG5ldyB0ZXh0IG5vZGVcbiAgICAgICAgbmV3Vm5vZGUuZG9tLnJlcGxhY2VDaGlsZChuZXdDaGlsZC5kb20sIG9sZENoaWxkLmRvbSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgb2xkIGNoaWxkIGlzIGEgdGV4dCBub2RlXG4gICAgICAvLyBTZXQgdGhlIGRvbSBwcm9wZXJ0eSBvZiB0aGUgdGV4dCBWbm9kZSB0byB0aGUgZG9tIHByb3BlcnR5IG9mIHRoZSBvbGQgY2hpbGRcbiAgICAgIG5ld0NoaWxkLmRvbSA9IG9sZENoaWxkLmRvbTtcbiAgICAgIC8vIElmIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIG9sZCBjaGlsZCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgbmV3IGNoaWxkLCB1cGRhdGUgdGhlIHRleHQgY29udGVudCBvZiB0aGUgb2xkIGNoaWxkXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG4gICAgICBpZiAobmV3Q2hpbGQuY2hpbGRyZW5bMF0gIT0gb2xkQ2hpbGQuZG9tLnRleHRDb250ZW50KSB7XG4gICAgICAgIG9sZENoaWxkLmRvbS50ZXh0Q29udGVudCA9IG5ld0NoaWxkLmNoaWxkcmVuWzBdO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIG5ldyBjaGlsZCBpcyBub3QgYSB0ZXh0IG5vZGVcbiAgICAvLyBTZXQgdGhlIGlzU1ZHIGZsYWcgZm9yIHRoZSBuZXcgY2hpbGQgaWYgaXQgaXMgYW4gU1ZHIGVsZW1lbnQgb3IgaWYgdGhlIHBhcmVudCBpcyBhbiBTVkcgZWxlbWVudFxuICAgIG5ld0NoaWxkLmlzU1ZHID0gbmV3Vm5vZGUuaXNTVkcgfHwgbmV3Q2hpbGQudGFnID09PSBcInN2Z1wiO1xuXG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gb2xkIGNoaWxkIGF0IHRoZSBzYW1lIGluZGV4XG4gICAgaWYgKGkgPj0gb2xkVHJlZUxlbmd0aCkge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGRvbSBlbGVtZW50IGZvciB0aGUgbmV3IGNoaWxkXG4gICAgICBuZXdDaGlsZC5kb20gPSBjcmVhdGVEb21FbGVtZW50KG5ld0NoaWxkLnRhZyBhcyBzdHJpbmcsIG5ld0NoaWxkLmlzU1ZHKTtcbiAgICAgIC8vIFVwZGF0ZSB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbmV3IGNoaWxkXG4gICAgICB1cGRhdGVBdHRyaWJ1dGVzKG5ld0NoaWxkIGFzIFZub2RlV2l0aERvbSk7XG4gICAgICAvLyBBcHBlbmQgdGhlIG5ldyBjaGlsZCB0byB0aGUgZG9tXG4gICAgICBuZXdWbm9kZS5kb20uYXBwZW5kQ2hpbGQobmV3Q2hpbGQuZG9tKTtcbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IHBhdGNoIHRoZSBuZXcgY2hpbGRcbiAgICAgIHBhdGNoKG5ld0NoaWxkIGFzIFZub2RlV2l0aERvbSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBhbiBvbGQgY2hpbGQgYXQgdGhlIHNhbWUgaW5kZXhcbiAgICBsZXQgb2xkQ2hpbGQgPSBvbGRUcmVlW2ldO1xuXG4gICAgLy8gSWYgdGhlIHRhZyBvZiB0aGUgbmV3IGNoaWxkIGlzIGRpZmZlcmVudCBmcm9tIHRoZSB0YWcgb2YgdGhlIG9sZCBjaGlsZFxuICAgIGlmIChuZXdDaGlsZC50YWcgIT09IG9sZENoaWxkLnRhZykge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGRvbSBlbGVtZW50IGZvciB0aGUgbmV3IGNoaWxkXG4gICAgICBuZXdDaGlsZC5kb20gPSBjcmVhdGVEb21FbGVtZW50KG5ld0NoaWxkLnRhZyBhcyBzdHJpbmcsIG5ld0NoaWxkLmlzU1ZHKTtcbiAgICAgIC8vIFVwZGF0ZSB0aGUgYXR0cmlidXRlcyBvZiB0aGUgbmV3IGNoaWxkXG4gICAgICB1cGRhdGVBdHRyaWJ1dGVzKG5ld0NoaWxkIGFzIFZub2RlV2l0aERvbSk7XG4gICAgICAvLyBSZXBsYWNlIHRoZSBvbGQgY2hpbGQgaW4gdGhlIGRvbSB3aXRoIHRoZSBuZXcgY2hpbGRcbiAgICAgIG5ld1Zub2RlLmRvbS5yZXBsYWNlQ2hpbGQobmV3Q2hpbGQuZG9tLCBvbGRDaGlsZC5kb20pO1xuICAgICAgLy8gUmVjdXJzaXZlbHkgcGF0Y2ggdGhlIG5ldyBjaGlsZFxuICAgICAgcGF0Y2gobmV3Q2hpbGQgYXMgVm5vZGVXaXRoRG9tKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSB0YWcgb2YgdGhlIG5ldyBjaGlsZCBpcyB0aGUgc2FtZSBhcyB0aGUgdGFnIG9mIHRoZSBvbGQgY2hpbGRcbiAgICAvLyBTZXQgdGhlIGRvbSBwcm9wZXJ0eSBvZiB0aGUgbmV3IGNoaWxkIHRvIHRoZSBkb20gcHJvcGVydHkgb2YgdGhlIG9sZCBjaGlsZFxuICAgIG5ld0NoaWxkLmRvbSA9IG9sZENoaWxkLmRvbTtcbiAgICAvLyBJZiB0aGUgdi1rZWVwIHByb3AgaXMgdGhlIHNhbWUgZm9yIGJvdGggdGhlIG5ldyBhbmQgb2xkIGNoaWxkLCBzZXQgdGhlIGNoaWxkcmVuIG9mIHRoZSBuZXcgY2hpbGQgdG8gdGhlIGNoaWxkcmVuIG9mIHRoZSBvbGQgY2hpbGRcbiAgICBpZiAoXCJ2LWtlZXBcIiBpbiBuZXdDaGlsZC5wcm9wcyAmJiBuZXdDaGlsZC5wcm9wc1tcInYta2VlcFwiXSA9PT0gb2xkQ2hpbGQucHJvcHNbXCJ2LWtlZXBcIl0pIHtcbiAgICAgIG5ld0NoaWxkLmNoaWxkcmVuID0gb2xkQ2hpbGQuY2hpbGRyZW47XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG5ldyBjaGlsZCBiYXNlZCBvbiB0aGUgb2xkIGNoaWxkXG4gICAgdXBkYXRlQXR0cmlidXRlcyhuZXdDaGlsZCBhcyBWbm9kZVdpdGhEb20sIG9sZENoaWxkKTtcbiAgICAvLyBSZWN1cnNpdmVseSBwYXRjaCB0aGUgbmV3IGFuZCBvbGQgY2hpbGRyZW5cbiAgICBwYXRjaChuZXdDaGlsZCBhcyBWbm9kZVdpdGhEb20sIG9sZENoaWxkKTtcbiAgfVxuXG4gIC8vIFJlbW92ZSBhbnkgb2xkIGNoaWxkcmVuIHRoYXQgYXJlIG5vIGxvbmdlciBwcmVzZW50IGluIHRoZSBuZXcgdHJlZVxuICBmb3IgKGxldCBpID0gbmV3VHJlZS5sZW5ndGg7IGkgPCBvbGRUcmVlTGVuZ3RoOyBpKyspIHtcbiAgICBuZXdWbm9kZS5kb20ucmVtb3ZlQ2hpbGQob2xkVHJlZVtpXS5kb20pO1xuICB9XG59XG5cbi8vIFVwZGF0ZSB0aGUgbWFpbiBWbm9kZVxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZSgpOiB2b2lkIHwgc3RyaW5nIHtcbiAgLy8gSWYgdGhlIG1haW4gVm5vZGUgZXhpc3RzXG4gIGlmIChtYWluVm5vZGUpIHtcbiAgICAvLyBDYWxsIGFueSBjbGVhbnVwIGZ1bmN0aW9ucyB0aGF0IGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIG9uQ2xlYW51cFNldCBzZXRcbiAgICBjYWxsU2V0KG9uQ2xlYW51cFNldCk7XG4gICAgLy8gU3RvcmUgYSByZWZlcmVuY2UgdG8gdGhlIG9sZCBtYWluIFZub2RlXG4gICAgbGV0IG9sZE1haW5Wbm9kZSA9IG1haW5Wbm9kZTtcbiAgICAvLyBDcmVhdGUgYSBuZXcgbWFpbiBWbm9kZSB3aXRoIHRoZSBtYWluIGNvbXBvbmVudCBhcyBpdHMgb25seSBjaGlsZFxuICAgIG1haW5Wbm9kZSA9IG5ldyBWbm9kZShvbGRNYWluVm5vZGUudGFnLCBvbGRNYWluVm5vZGUucHJvcHMsIFttYWluQ29tcG9uZW50XSkgYXMgVm5vZGVXaXRoRG9tO1xuICAgIG1haW5Wbm9kZS5kb20gPSBvbGRNYWluVm5vZGUuZG9tO1xuICAgIG1haW5Wbm9kZS5pc1NWRyA9IG9sZE1haW5Wbm9kZS5pc1NWRztcblxuICAgIC8vIFJlY3Vyc2l2ZWx5IHBhdGNoIHRoZSBuZXcgYW5kIG9sZCBtYWluIFZub2Rlc1xuICAgIHBhdGNoKG1haW5Wbm9kZSwgb2xkTWFpblZub2RlKTtcblxuICAgIC8vIENhbGwgYW55IHVwZGF0ZSBvciBtb3VudCBmdW5jdGlvbnMgdGhhdCBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBvblVwZGF0ZVNldCBvciBvbk1vdW50U2V0IHNldFxuICAgIGNhbGxTZXQoaXNNb3VudGVkID8gb25VcGRhdGVTZXQgOiBvbk1vdW50U2V0KTtcblxuICAgIC8vIFNldCB0aGUgaXNNb3VudGVkIGZsYWcgdG8gdHJ1ZVxuICAgIGlzTW91bnRlZCA9IHRydWU7XG5cbiAgICAvLyBSZXNldCB0aGUgY3VycmVudCB2bm9kZSwgb2xkVm5vZGUsIGFuZCBjb21wb25lbnQgcHJvcGVydGllc1xuICAgIGN1cnJlbnQudm5vZGUgPSBudWxsO1xuICAgIGN1cnJlbnQub2xkVm5vZGUgPSBudWxsO1xuICAgIGN1cnJlbnQuY29tcG9uZW50ID0gbnVsbDtcblxuICAgIC8vIElmIHRoZSBjb2RlIGlzIHJ1bm5pbmcgaW4gYSBOb2RlLmpzIGVudmlyb25tZW50LCByZXR1cm4gdGhlIGlubmVyIEhUTUwgb2YgdGhlIG1haW4gVm5vZGUncyBkb20gZWxlbWVudFxuICAgIGlmIChpc05vZGVKcykge1xuICAgICAgcmV0dXJuIG1haW5Wbm9kZS5kb20uaW5uZXJIVE1MO1xuICAgIH1cbiAgfVxufVxuXG4vLyBVcGRhdGUgY3VzdG9tIFZub2RlXG4vLyBJdCBpcyBhc3N1bWVkIHRoYXQgYSBmaXJzdCBtb3VudCBoYXMgYWxyZWFkeSBvY2N1cnJlZCwgc28sXG4vLyB0aGUgb2xkVm5vZGUgaXMgbm90IG51bGwgYW5kIHRoZSBkb20gcHJvcGVydHkgb2YgdGhlIG9sZFZub2RlIGlzIG5vdCBudWxsXG4vLyBZb3UgbmVlZCB0byBzZXQgdGhlIGRvbSBwcm9wZXJ0eSBvZiB0aGUgbmV3Vm5vZGUgdG8gdGhlIGRvbSBwcm9wZXJ0eSBvZiB0aGUgb2xkVm5vZGVcbi8vIFRoZSBzYW1lIHdpdGggdGhlIGlzU1ZHIHByb3BlcnR5XG4vLyBQcmVmZXIgdGhpcyBmdW5jdGlvbiBvdmVyIHBhdGNoIHRvIGFsbG93IGZvciBjbGVhbnVwLCBvblVwZGF0ZSBhbmQgb25Nb3VudCBzZXRzIHRvIGJlIGNhbGxlZFxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVZub2RlKHZub2RlOiBWbm9kZVdpdGhEb20sIG9sZFZub2RlOiBWbm9kZVdpdGhEb20pOiBzdHJpbmcgfCB2b2lkIHtcbiAgLy8gQ2FsbCBhbnkgY2xlYW51cCBmdW5jdGlvbnMgdGhhdCBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBvbkNsZWFudXBTZXQgc2V0XG4gIGNhbGxTZXQob25DbGVhbnVwU2V0KTtcblxuICAvLyBSZWN1cnNpdmVseSBwYXRjaCB0aGUgbmV3IGFuZCBvbGQgbWFpbiBWbm9kZXNcbiAgcGF0Y2godm5vZGUsIG9sZFZub2RlKTtcblxuICAvLyBTZXQgdGhlIG9sZFZub2RlJ3MgdGFnLCBwcm9wcywgY2hpbGRyZW4sIGRvbSwgYW5kIGlzU1ZHIHByb3BlcnRpZXMgdG8gdGhlIG5ld1Zub2RlJ3MgdGFnLCBwcm9wcywgY2hpbGRyZW4sIGRvbSwgYW5kIGlzU1ZHIHByb3BlcnRpZXNcbiAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgdG8gYWxsb3cgZm9yIHRoZSBvbGRWbm9kZSB0byBiZSB1c2VkIGFzIHRoZSBuZXdWbm9kZSBpbiB0aGUgbmV4dCB1cGRhdGUgd2l0aCB0aGUgbm9ybWFsIHVwZGF0ZSBmdW5jdGlvblxuICBvbGRWbm9kZS50YWcgPSB2bm9kZS50YWc7XG4gIG9sZFZub2RlLnByb3BzID0geyAuLi52bm9kZS5wcm9wcyB9O1xuICBvbGRWbm9kZS5jaGlsZHJlbiA9IFsuLi52bm9kZS5jaGlsZHJlbl07XG4gIG9sZFZub2RlLmRvbSA9IHZub2RlLmRvbTtcbiAgb2xkVm5vZGUuaXNTVkcgPSB2bm9kZS5pc1NWRztcblxuICAvLyBDYWxsIGFueSB1cGRhdGUgb3IgbW91bnQgZnVuY3Rpb25zIHRoYXQgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgb25VcGRhdGVTZXQgb3Igb25Nb3VudFNldCBzZXRcbiAgY2FsbFNldChpc01vdW50ZWQgPyBvblVwZGF0ZVNldCA6IG9uTW91bnRTZXQpO1xuXG4gIC8vIFNldCB0aGUgaXNNb3VudGVkIGZsYWcgdG8gdHJ1ZVxuICBpc01vdW50ZWQgPSB0cnVlO1xuXG4gIC8vIFJlc2V0IHRoZSBjdXJyZW50IHZub2RlLCBvbGRWbm9kZSwgYW5kIGNvbXBvbmVudCBwcm9wZXJ0aWVzXG4gIGN1cnJlbnQudm5vZGUgPSBudWxsO1xuICBjdXJyZW50Lm9sZFZub2RlID0gbnVsbDtcbiAgY3VycmVudC5jb21wb25lbnQgPSBudWxsO1xuXG4gIGlmIChpc05vZGVKcykge1xuICAgIHJldHVybiB2bm9kZS5kb20uaW5uZXJIVE1MO1xuICB9XG59XG5cbi8vIFVubW91bnQgdGhlIG1haW4gVm5vZGVcbmV4cG9ydCBmdW5jdGlvbiB1bm1vdW50KCkge1xuICAvLyBJZiB0aGUgbWFpbiBWbm9kZSBleGlzdHNcbiAgaWYgKG1haW5Wbm9kZSkge1xuICAgIC8vIFNldCB0aGUgbWFpbiBjb21wb25lbnQgdG8gYSBudWxsIFZub2RlXG4gICAgbWFpbkNvbXBvbmVudCA9IG5ldyBWbm9kZSgoKSA9PiBudWxsLCB7fSwgW10pIGFzIFZub2RlQ29tcG9uZW50SW50ZXJmYWNlO1xuICAgIC8vIFVwZGF0ZSB0aGUgbWFpbiBWbm9kZVxuICAgIGxldCByZXN1bHQgPSB1cGRhdGUoKTtcbiAgICAvLyBDYWxsIGFueSB1bm1vdW50IGZ1bmN0aW9ucyB0aGF0IGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIG9uVW5tb3VudFNldCBzZXRcbiAgICBjYWxsU2V0KG9uVW5tb3VudFNldCk7XG5cbiAgICAvLyBSZW1vdmUgYW55IGV2ZW50IGxpc3RlbmVycyB0aGF0IHdlcmUgYWRkZWQgdG8gdGhlIG1haW4gVm5vZGUncyBkb20gZWxlbWVudFxuICAgIGZvciAobGV0IG5hbWUgaW4gZXZlbnRMaXN0ZW5lck5hbWVzKSB7XG4gICAgICBtYWluVm5vZGUuZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZS5zbGljZSgyKS50b0xvd2VyQ2FzZSgpLCBldmVudExpc3RlbmVyKTtcbiAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkoZXZlbnRMaXN0ZW5lck5hbWVzLCBuYW1lKTtcbiAgICB9XG5cbiAgICAvLyBSZXNldCB0aGUgbWFpbiBjb21wb25lbnQgYW5kIG1haW4gVm5vZGVcbiAgICBtYWluQ29tcG9uZW50ID0gbnVsbDtcbiAgICBtYWluVm5vZGUgPSBudWxsO1xuICAgIC8vIFNldCB0aGUgaXNNb3VudGVkIGZsYWcgdG8gZmFsc2VcbiAgICBpc01vdW50ZWQgPSBmYWxzZTtcbiAgICAvLyBSZXNldCB0aGUgY3VycmVudCB2bm9kZSwgb2xkVm5vZGUsIGFuZCBjb21wb25lbnQgcHJvcGVydGllc1xuICAgIGN1cnJlbnQudm5vZGUgPSBudWxsO1xuICAgIGN1cnJlbnQub2xkVm5vZGUgPSBudWxsO1xuICAgIGN1cnJlbnQuY29tcG9uZW50ID0gbnVsbDtcbiAgICAvLyBSZXR1cm4gdGhlIHJlc3VsdCBvZiB1cGRhdGluZyB0aGUgbWFpbiBWbm9kZVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbi8vIFRoaXMgZnVuY3Rpb24gdGFrZXMgaW4gYSBET00gZWxlbWVudCBvciBhIERPTSBlbGVtZW50IHNlbGVjdG9yIGFuZCBhIGNvbXBvbmVudCB0byBiZSBtb3VudGVkIG9uIGl0LlxuZXhwb3J0IGZ1bmN0aW9uIG1vdW50KGRvbSwgY29tcG9uZW50KSB7XG4gIC8vIENoZWNrIGlmIHRoZSAnZG9tJyBhcmd1bWVudCBpcyBhIHN0cmluZy4gSWYgaXQgaXMsIHNlbGVjdCB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIHNlbGVjdG9yLlxuICAvLyBPdGhlcndpc2UsIHVzZSB0aGUgJ2RvbScgYXJndW1lbnQgYXMgdGhlIGNvbnRhaW5lci5cbiAgbGV0IGNvbnRhaW5lciA9XG4gICAgdHlwZW9mIGRvbSA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBpc05vZGVKc1xuICAgICAgICA/IGNyZWF0ZURvbUVsZW1lbnQoZG9tLCBkb20gPT09IFwic3ZnXCIpXG4gICAgICAgIDogZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChkb20pWzBdXG4gICAgICA6IGRvbTtcblxuICAvLyBDaGVjayBpZiB0aGUgJ2NvbXBvbmVudCcgYXJndW1lbnQgaXMgYSBWbm9kZSBjb21wb25lbnQgb3IgYSByZWd1bGFyIGNvbXBvbmVudC5cbiAgLy8gSWYgaXQncyBhIHJlZ3VsYXIgY29tcG9uZW50LCBjcmVhdGUgYSBuZXcgVm5vZGUgY29tcG9uZW50IHVzaW5nIHRoZSAnY29tcG9uZW50JyBhcmd1bWVudCBhcyB0aGUgdGFnLlxuICAvLyBJZiBpdCdzIG5vdCBhIGNvbXBvbmVudCBhdCBhbGwsIGNyZWF0ZSBhIG5ldyBWbm9kZSBjb21wb25lbnQgd2l0aCB0aGUgJ2NvbXBvbmVudCcgYXJndW1lbnQgYXMgdGhlIHJlbmRlcmluZyBmdW5jdGlvbi5cbiAgbGV0IHZub2RlQ29tcG9uZW50ID0gaXNWbm9kZUNvbXBvbmVudChjb21wb25lbnQpXG4gICAgPyBjb21wb25lbnRcbiAgICA6IGlzQ29tcG9uZW50KGNvbXBvbmVudClcbiAgICA/IG5ldyBWbm9kZShjb21wb25lbnQsIHt9LCBbXSlcbiAgICA6IG5ldyBWbm9kZSgoKSA9PiBjb21wb25lbnQsIHt9LCBbXSk7XG5cbiAgLy8gSWYgYSBtYWluIGNvbXBvbmVudCBhbHJlYWR5IGV4aXN0cyBhbmQgaXQncyBub3QgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgJ3Zub2RlQ29tcG9uZW50JywgdW5tb3VudCBpdC5cbiAgaWYgKG1haW5Db21wb25lbnQgJiYgbWFpbkNvbXBvbmVudC50YWcgIT09IHZub2RlQ29tcG9uZW50LnRhZykge1xuICAgIHVubW91bnQoKTtcbiAgfVxuXG4gIC8vIFNldCB0aGUgJ3Zub2RlQ29tcG9uZW50JyBhcyB0aGUgbWFpbiBjb21wb25lbnQuXG4gIG1haW5Db21wb25lbnQgPSB2bm9kZUNvbXBvbmVudCBhcyBWbm9kZUNvbXBvbmVudEludGVyZmFjZTtcbiAgLy8gQ29udmVydCB0aGUgY29udGFpbmVyIGVsZW1lbnQgdG8gYSBWbm9kZS5cbiAgbWFpblZub2RlID0gZG9tVG9Wbm9kZShjb250YWluZXIpO1xuICAvLyBVcGRhdGUgdGhlIERPTSB3aXRoIHRoZSBuZXcgY29tcG9uZW50LlxuICByZXR1cm4gdXBkYXRlKCk7XG59XG5cbi8vIFRoaXMgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIGZvciBjcmVhdGluZyBWbm9kZSBvYmplY3RzLlxuLy8gSXQgdGFrZXMgaW4gYSB0YWcgb3IgY29tcG9uZW50LCBhbmQgb3B0aW9uYWwgcHJvcHMgYW5kIGNoaWxkcmVuIGFyZ3VtZW50cy5cbmV4cG9ydCBjb25zdCB2OiBWID0gKHRhZ09yQ29tcG9uZW50LCBwcm9wcyA9IHt9LCAuLi5jaGlsZHJlbikgPT4ge1xuICAvLyBSZXR1cm4gYSBuZXcgVm5vZGUgb2JqZWN0IHVzaW5nIHRoZSBnaXZlbiBhcmd1bWVudHMuXG4gIHJldHVybiBuZXcgVm5vZGUodGFnT3JDb21wb25lbnQsIHByb3BzIHx8IHt9LCBjaGlsZHJlbik7XG59O1xuXG4vLyBUaGlzIHV0aWxpdHkgZnVuY3Rpb24gY3JlYXRlcyBhIGZyYWdtZW50IFZub2RlLlxuLy8gSXQgdGFrZXMgaW4gYSBwbGFjZWhvbGRlciBhbmQgdGhlIGNoaWxkcmVuIGFyZ3VtZW50cywgcmV0dXJucyBvbmx5IHRoZSBjaGlsZHJlbi5cbnYuZnJhZ21lbnQgPSAoXzogVm5vZGVQcm9wZXJ0aWVzLCAuLi5jaGlsZHJlbjogQ2hpbGRyZW4pID0+IGNoaWxkcmVuO1xuIl0sIm1hcHBpbmdzIjoiTUFrSUEsSUFBTUEsRUFBVSxRQUlMQyxFQUFXQyxRQUEyQixvQkFBWkMsU0FBMkJBLFFBQVFDLFVBQVlELFFBQVFDLFNBQVNDLE1BSTlGLFNBQVNDLEVBQWlCQyxFQUFhQyxHQUFpQixHQUM3RCxPQUFPQSxFQUFRQyxTQUFTQyxnQkFBZ0IsNkJBQThCSCxHQUFPRSxTQUFTRSxjQUFjSixFQUN0RyxDQU1PLElBQU1LLEVBQVEsU0FBcUNMLEVBQWFNLEVBQXdCQyxHQUU3RkMsS0FBS1IsSUFBTUEsRUFDWFEsS0FBS0YsTUFBUUEsRUFDYkUsS0FBS0QsU0FBV0EsQ0FDbEIsRUFJTyxTQUFTRSxFQUFZQyxHQUMxQixPQUFPQSxJQUFtQyxtQkFBZEEsR0FBa0QsaUJBQWRBLEdBQTBCLFNBQVVBLEVBQ3RHLENBR08sSUFBTUMsRUFBV0MsR0FFZkEsYUFBa0JQLEVBS2RRLEVBQW9CRCxHQUV4QkQsRUFBUUMsSUFBV0gsRUFBWUcsRUFBT1osS0FJeEMsU0FBU2MsRUFBV0MsR0FJekIsR0FBcUIsSUFBakJBLEVBQUlDLFNBQWdCLENBQ3RCLElBQUlDLEVBQVEsSUFBSVosRUFBTVosRUFBUyxDQUFDLEVBQUcsQ0FBQ3NCLEVBQUlHLFlBRXhDLE9BREFELEVBQU1GLElBQU1BLEVBQ0xFLENBQ1QsQ0FFQSxJQUFJVixFQUEyQixHQUUvQixRQUFTWSxFQUFJLEVB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 \ No newline at end of file diff --git a/dist/index.mjs b/dist/index.mjs index 8f20107..8cc48c9 100644 --- a/dist/index.mjs +++ b/dist/index.mjs @@ -19,16 +19,15 @@ var isVnodeComponent = (object) => { return isVnode(object) && isComponent(object.tag); }; function domToVnode(dom) { + if (dom.nodeType === 3) { + let vnode2 = new Vnode(textTag, {}, [dom.nodeValue]); + vnode2.dom = dom; + return vnode2; + } let children = []; for (let i = 0, l = dom.childNodes.length; i < l; i++) { let childDom = dom.childNodes[i]; - if (childDom.nodeType === 3) { - let vnode2 = new Vnode(textTag, {}, [childDom.nodeValue]); - vnode2.dom = childDom; - children.push(vnode2); - continue; - } - if (childDom.nodeType === 1) { + if (childDom.nodeType === 1 || childDom.nodeType === 3) { children.push(domToVnode(childDom)); } } @@ -517,6 +516,7 @@ export { current, directive, directives, + domToVnode, isComponent, isNodeJs, isVnode, diff --git a/dist/interfaces.d.ts b/dist/interfaces.d.ts index 34b7eac..4ebc5a1 100644 --- a/dist/interfaces.d.ts +++ b/dist/interfaces.d.ts @@ -74,6 +74,7 @@ declare module "valyrian.js" { function isComponent(component: any): component is Component; const isVnode: (object?: unknown | VnodeInterface) => object is VnodeInterface; const isVnodeComponent: (object?: unknown | VnodeComponentInterface) => object is VnodeComponentInterface; + function domToVnode(dom: any): VnodeWithDom; function trust(htmlString: string): any; const current: Current; const reservedProps: Record; diff --git a/dist/interfaces.d.ts.map b/dist/interfaces.d.ts.map index 136e101..b2b65cf 100644 --- a/dist/interfaces.d.ts.map +++ b/dist/interfaces.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../lib/interfaces.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,aAAa,CAAC;IAC3B,UAAiB,KAAK;QACpB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QACtB,KAAK,CAAC,EAAE,GAAG,CAAC;QACZ,QAAQ,CAAC,EAAE;YACT,CAAC,KAAK,EAAE,cAAc,GAAG,KAAK,CAAC;SAChC,CAAC;QACF,QAAQ,CAAC,EAAE;YACT,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,GAAG,KAAK,CAAC;SAC1D,CAAC;QACF,QAAQ,CAAC,EAAE;YACT,CAAC,QAAQ,EAAE,cAAc,GAAG,KAAK,CAAC;SACnC,CAAC;QACF,YAAY,CAAC,EAAE;YACb,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,GAAG,SAAS,GAAG,OAAO,CAAC;SACxE,CAAC;QACF,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,GAAG,CAAC;KACtC;IACD,UAAiB,UAAW,SAAQ,OAAO;QACzC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB;IACD,UAAiB,cAAc;QAC7B,KAAK,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAG,cAAc,CAAC;QAChG,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,CAAC;QACxC,KAAK,EAAE,KAAK,CAAC;QACb,QAAQ,EAAE,QAAQ,CAAC;QACnB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,GAAG,CAAC,EAAE,UAAU,CAAC;QACjB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,GAAG,CAAC;KACtC;IACD,UAAiB,YAAa,SAAQ,cAAc;QAClD,GAAG,EAAE,UAAU,CAAC;KACjB;IACD,UAAiB,SAAS;QACxB,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,QAAQ,EAAE,GAAG,EAAE,GAAG,cAAc,GAAG,QAAQ,GAAG,GAAG,CAAC;QAC5E,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB;IACD,UAAiB,aAAa;QAC5B,IAAI,EAAE,SAAS,CAAC;QAChB,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;QACrB,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC;QACjB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB;IACD,UAAiB,uBAAwB,SAAQ,cAAc;QAC7D,GAAG,EAAE,SAAS,GAAG,aAAa,CAAC;QAC/B,KAAK,EAAE,KAAK,CAAC;QACb,QAAQ,EAAE,QAAQ,CAAC;KACpB;IACD,UAAiB,QAAS,SAAQ,KAAK,CAAC,cAAc,GAAG,uBAAuB,GAAG,GAAG,CAAC;KAAG;IAC1F,UAAiB,SAAS;QACxB,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,YAAY,GAAG,IAAI,GAAG,OAAO,CAAC;KAC5E;IACD,UAAiB,UAAU;QACzB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;KAC1B;IACD,UAAiB,aAAa;QAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;KACrB;IACD,UAAiB,OAAO;QACtB,SAAS,EAAE,SAAS,GAAG,aAAa,GAAG,IAAI,CAAC;QAC5C,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;QAC3B,QAAQ,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;QAC/B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;KACrB;IACD,UAAiB,CAAC;QAChB,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,QAAQ,EAAE,QAAQ,GAC3F,cAAc,GACd,uBAAuB,CAAC;QAC5B,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAAC;KACnD;IACM,IAAI,QAAQ,EAAE,OAAO,CAAC;IAC7B,SAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACpE,MAAM,KAAK,EAAE,cAAc,CAAC;IACnC,SAAgB,WAAW,CAAC,SAAS,EAAE,GAAG,GAAG,SAAS,IAAI,SAAS,CAAC;IAC7D,MAAM,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,cAAc,KAAK,MAAM,IAAI,cAAc,CAAC;IAC/E,MAAM,gBAAgB,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,uBAAuB,KAAK,MAAM,IAAI,uBAAuB,CAAC;IACjH,SAAgB,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,GAAG,CAAC;IACxC,MAAM,OAAO,EAAE,OAAO,CAAC;IACvB,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACjD,SAAgB,OAAO,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI,CAAC;IAC7C,SAAgB,QAAQ,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI,CAAC;IAC9C,SAAgB,SAAS,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI,CAAC;IAC/C,SAAgB,SAAS,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI,CAAC;IACxC,MAAM,UAAU,EAAE,UAAU,CAAC;IACpC,SAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IACpE,SAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9G,SAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IACxF,SAAgB,KAAK,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC7E,SAAgB,MAAM,IAAI,IAAI,GAAG,MAAM,CAAC;IACxC,SAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAAC;IACxF,SAAgB,OAAO,IAAI,MAAM,GAAG,IAAI,CAAC;IACzC,SAAgB,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,GAAG,MAAM,GAAG,IAAI,CAAC;IACxD,MAAM,CAAC,EAAE,CAAC,CAAC;CACnB"} \ No newline at end of file +{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../lib/interfaces.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/request/index.d.ts b/dist/request/index.d.ts index 754db34..832d8e2 100644 --- a/dist/request/index.d.ts +++ b/dist/request/index.d.ts @@ -18,18 +18,18 @@ interface SendOptions extends RequestOptionsWithUrls, RequestInit { headers: Record; resolveWithFullResponse?: boolean; } -interface RequestInterface { +export interface RequestInterface { (method: string, url: string, data?: Record, options?: Partial): any | Response; - new: (baseUrl: string, options: RequestOptions) => RequestInterface; + new: (baseUrl: string, options?: RequestOptions) => RequestInterface; setOptions: (key: string, value: any) => void; getOptions: (key?: string) => RequestOptions | void; - get?: (url: string, data?: Record, options?: Record) => any | Response; - post?: (url: string, data?: Record, options?: Record) => any | Response; - put?: (url: string, data?: Record, options?: Record) => any | Response; - patch?: (url: string, data?: Record, options?: Record) => any | Response; - delete?: (url: string, data?: Record, options?: Record) => any | Response; - head?: (url: string, data?: Record, options?: Record) => any | Response; - options?: (url: string, data?: Record, options?: Record) => any | Response; + get: (url: string, data?: Record, options?: Record) => any | Response; + post: (url: string, data?: Record, options?: Record) => any | Response; + put: (url: string, data?: Record, options?: Record) => any | Response; + patch: (url: string, data?: Record, options?: Record) => any | Response; + delete: (url: string, data?: Record, options?: Record) => any | Response; + head: (url: string, data?: Record, options?: Record) => any | Response; + options: (url: string, data?: Record, options?: Record) => any | Response; [key: string | number | symbol]: any; } export declare const request: RequestInterface; diff --git a/dist/request/index.d.ts.map b/dist/request/index.d.ts.map index 94c7ef8..4da9854 100644 --- a/dist/request/index.d.ts.map +++ b/dist/request/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/request/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/request/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/request/index.js b/dist/request/index.js index 2a3fecd..f9c9697 100644 --- a/dist/request/index.js +++ b/dist/request/index.js @@ -48,7 +48,7 @@ function parseUrl(url, options) { } return u; } -var defaultOptions = { allowedMethods: ["get", "post", "put", "patch", "delete"] }; +var defaultOptions = { allowedMethods: ["get", "post", "put", "patch", "delete", "head", "options"] }; function Requester(baseUrl = "", options = defaultOptions) { let url = baseUrl.replace(/\/$/gi, "").trim(); if (!options.urls) { @@ -138,7 +138,7 @@ function Requester(baseUrl = "", options = defaultOptions) { } return response; }; - request2.new = (baseUrl2, options2) => Requester(baseUrl2, { ...opts, ...options2 }); + request2.new = (baseUrl2, options2) => Requester(baseUrl2, { ...opts, ...options2 || {} }); request2.setOption = (key, value) => { let result = opts; let parsed = key.split("."); diff --git a/dist/request/index.mjs b/dist/request/index.mjs index 2770647..e190d66 100644 --- a/dist/request/index.mjs +++ b/dist/request/index.mjs @@ -25,7 +25,7 @@ function parseUrl(url, options) { } return u; } -var defaultOptions = { allowedMethods: ["get", "post", "put", "patch", "delete"] }; +var defaultOptions = { allowedMethods: ["get", "post", "put", "patch", "delete", "head", "options"] }; function Requester(baseUrl = "", options = defaultOptions) { let url = baseUrl.replace(/\/$/gi, "").trim(); if (!options.urls) { @@ -115,7 +115,7 @@ function Requester(baseUrl = "", options = defaultOptions) { } return response; }; - request2.new = (baseUrl2, options2) => Requester(baseUrl2, { ...opts, ...options2 }); + request2.new = (baseUrl2, options2) => Requester(baseUrl2, { ...opts, ...options2 || {} }); request2.setOption = (key, value) => { let result = opts; let parsed = key.split("."); diff --git a/lib/index.ts b/lib/index.ts index 7b43d59..4826a75 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -171,24 +171,23 @@ export const isVnodeComponent = (object?: unknown | VnodeComponentInterface): ob }; // 'domToVnode' is a function that converts a DOM node to a 'Vnode' instance. -function domToVnode(dom: any): VnodeWithDom { +export function domToVnode(dom: any): VnodeWithDom { + // If the child node is a text node, create a 'Vnode' instance with the 'textTag' constant as the 'tag' property. + // Set the 'dom' property of the 'Vnode' instance to the child DOM node. + // Push the 'Vnode' instance to the 'children' array. + if (dom.nodeType === 3) { + let vnode = new Vnode(textTag, {}, [dom.nodeValue]); + vnode.dom = dom; + return vnode as VnodeWithDom; + } + let children: VnodeWithDom[] = []; // Iterate through all child nodes of 'dom'. for (let i = 0, l = dom.childNodes.length; i < l; i++) { let childDom = dom.childNodes[i]; - // If the child node is a text node, create a 'Vnode' instance with the 'textTag' constant as the 'tag' property. - // Set the 'dom' property of the 'Vnode' instance to the child DOM node. - // Push the 'Vnode' instance to the 'children' array. - if (childDom.nodeType === 3) { - let vnode = new Vnode(textTag, {}, [childDom.nodeValue]); - vnode.dom = childDom; - children.push(vnode as VnodeWithDom); - continue; - } - // If the child node is an element node, recursively call 'domToVnode' to convert it to a 'Vnode' instance. // Push the 'Vnode' instance to the 'children' array. - if (childDom.nodeType === 1) { + if (childDom.nodeType === 1 || childDom.nodeType === 3) { children.push(domToVnode(childDom)); } } diff --git a/lib/interfaces.ts b/lib/interfaces.ts index 8604727..66095b4 100644 --- a/lib/interfaces.ts +++ b/lib/interfaces.ts @@ -77,6 +77,7 @@ declare module "valyrian.js" { export function isComponent(component: any): component is Component; export const isVnode: (object?: unknown | VnodeInterface) => object is VnodeInterface; export const isVnodeComponent: (object?: unknown | VnodeComponentInterface) => object is VnodeComponentInterface; + export function domToVnode(dom: any): VnodeWithDom; export function trust(htmlString: string): any; export const current: Current; export const reservedProps: Record; diff --git a/lib/request/index.ts b/lib/request/index.ts index 551ebea..5c0c7e5 100644 --- a/lib/request/index.ts +++ b/lib/request/index.ts @@ -24,29 +24,29 @@ interface SendOptions extends RequestOptionsWithUrls, RequestInit { resolveWithFullResponse?: boolean; } -interface RequestInterface { +export interface RequestInterface { // eslint-disable-next-line no-unused-vars (method: string, url: string, data?: Record, options?: Partial): any | Response; // eslint-disable-next-line no-unused-vars - new: (baseUrl: string, options: RequestOptions) => RequestInterface; + new: (baseUrl: string, options?: RequestOptions) => RequestInterface; // eslint-disable-next-line no-unused-vars setOptions: (key: string, value: any) => void; // eslint-disable-next-line no-unused-vars getOptions: (key?: string) => RequestOptions | void; // eslint-disable-next-line no-unused-vars - get?: (url: string, data?: Record, options?: Record) => any | Response; + get: (url: string, data?: Record, options?: Record) => any | Response; // eslint-disable-next-line no-unused-vars - post?: (url: string, data?: Record, options?: Record) => any | Response; + post: (url: string, data?: Record, options?: Record) => any | Response; // eslint-disable-next-line no-unused-vars - put?: (url: string, data?: Record, options?: Record) => any | Response; + put: (url: string, data?: Record, options?: Record) => any | Response; // eslint-disable-next-line no-unused-vars - patch?: (url: string, data?: Record, options?: Record) => any | Response; + patch: (url: string, data?: Record, options?: Record) => any | Response; // eslint-disable-next-line no-unused-vars - delete?: (url: string, data?: Record, options?: Record) => any | Response; + delete: (url: string, data?: Record, options?: Record) => any | Response; // eslint-disable-next-line no-unused-vars - head?: (url: string, data?: Record, options?: Record) => any | Response; + head: (url: string, data?: Record, options?: Record) => any | Response; // eslint-disable-next-line no-unused-vars - options?: (url: string, data?: Record, options?: Record) => any | Response; + options: (url: string, data?: Record, options?: Record) => any | Response; [key: string | number | symbol]: any; } @@ -88,7 +88,7 @@ function parseUrl(url: string, options: RequestOptionsWithUrls) { return u; } -const defaultOptions: RequestOptions = { allowedMethods: ["get", "post", "put", "patch", "delete"] }; +const defaultOptions: RequestOptions = { allowedMethods: ["get", "post", "put", "patch", "delete", "head", "options"] }; // eslint-disable-next-line sonarjs/cognitive-complexity function Requester(baseUrl = "", options: RequestOptions = defaultOptions) { @@ -198,7 +198,7 @@ function Requester(baseUrl = "", options: RequestOptions = defaultOptions) { return response; } as unknown as RequestInterface; - request.new = (baseUrl: string, options: RequestOptions) => Requester(baseUrl, { ...opts, ...options }); + request.new = (baseUrl: string, options?: RequestOptions) => Requester(baseUrl, { ...opts, ...(options || {}) }); request.setOption = (key: string, value: any) => { let result = opts;